From c0db2984495b4863eedd4a1fb7d81ba6b348f92d Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Wed, 16 Sep 2026 11:27:07 +0800 Subject: [PATCH 01/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20AGC=20=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=80=81=E7=9B=91=E5=90=AC=20Rust=20=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E7=9B=AE=E5=BD=95=E5=AF=BC=E8=87=B4=E7=9A=84=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=BC=93=E6=85=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 Vite 中排除 src-tauri/target,保留业务源码与共享组件热更新。 增加实际 Vite watcher 回归,验证构建目录排除及源码变更通知。 同步开发运维文档和共享排障记录,关联 Issue #324。 --- .../scripts/vite-watch.test.mjs | 113 ++++++++++++++++++ apps/ai-game-creator-shell/vite.config.ts | 3 + docs/project-memory/shared-memory/pitfalls.md | 4 + ...发运维】本地开发验证与生产运维-2026-05-15.md | 2 + 4 files changed, 122 insertions(+) create mode 100644 apps/ai-game-creator-shell/scripts/vite-watch.test.mjs diff --git a/apps/ai-game-creator-shell/scripts/vite-watch.test.mjs b/apps/ai-game-creator-shell/scripts/vite-watch.test.mjs new file mode 100644 index 000000000..42fa9a5d4 --- /dev/null +++ b/apps/ai-game-creator-shell/scripts/vite-watch.test.mjs @@ -0,0 +1,113 @@ +import assert from 'node:assert/strict'; +import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import { dirname, join } from 'node:path'; +import { test } from 'node:test'; +import { setTimeout as delay } from 'node:timers/promises'; +import { fileURLToPath } from 'node:url'; + +import { createServer, loadConfigFromFile, normalizePath } from 'vite'; + +test( + 'AGC 排除 Rust 构建目录且保留源码与共享组件监听', + { timeout: 30_000 }, + async () => { + const loaded = await loadConfigFromFile( + { command: 'serve', mode: 'development' }, + fileURLToPath(new URL('../vite.config.ts', import.meta.url)), + ); + assert.ok(loaded); + assert.notEqual(loaded.config.server?.watch, null); + assert.notEqual(loaded.config.server?.hmr, false); + assert.ok( + [loaded.config.server?.watch?.ignored] + .flat() + .includes('**/src-tauri/target/**'), + ); + + const fixture = await mkdtemp(join(tmpdir(), 'agc-vite-watch-')); + const root = join(fixture, 'apps', 'ai-game-creator-shell'); + const source = join(root, 'src', 'main.js'); + const css = join(root, 'src', 'styles.css'); + const shared = join(fixture, 'packages', 'shared', 'src', 'component.js'); + const target = join(root, 'src-tauri', 'target'); + const artifact = join(target, 'debug', 'incremental', 'cache.bin'); + let server; + try { + for (const file of [source, css, shared, artifact]) { + await mkdir(dirname(file), { recursive: true }); + await writeFile( + file, + file === css ? 'body { color: red; }' : 'export default 1;', + ); + } + // 使用真实 Vite watcher 和实际配置,仅将扫描根替换为小型夹具; + // 不加载业务插件、后端或原生窗口,也不扫描开发机上的大型 target。 + server = await createServer({ + configFile: false, + envFile: false, + root, + logLevel: 'silent', + server: { + watch: loaded.config.server?.watch, + middlewareMode: true, + hmr: false, + fs: { allow: [fixture] }, + }, + optimizeDeps: { noDiscovery: true, include: [] }, + }); + const waitForWatchedFile = async (file) => { + const normalized = normalizePath(file); + for (let attempt = 0; attempt < 100; attempt += 1) { + if ( + Object.entries(server.watcher.getWatched()).some( + ([directory, names]) => + names.some( + (name) => normalizePath(join(directory, name)) === normalized, + ), + ) + ) + return; + await delay(50); + } + assert.fail(`源码必须仍被监听:${normalized}`); + }; + await waitForWatchedFile(source); + + // 真实模块转换应将 root 外的共享源码加入监听。 + await server.transformRequest(`/@fs/${normalizePath(shared)}`); + for (const file of [source, css, shared]) { + const normalized = normalizePath(file); + await waitForWatchedFile(file); + const changed = new Promise((resolve, reject) => { + const timer = setTimeout(() => { + server.watcher.off('change', onChange); + reject(new Error(`未收到源码变更:${normalized}`)); + }, 5_000); + function onChange(path) { + if (normalizePath(path) !== normalized) return; + clearTimeout(timer); + server.watcher.off('change', onChange); + resolve(); + } + server.watcher.on('change', onChange); + }); + await writeFile( + file, + file === css ? 'body { color: blue; }' : 'export default 2;', + ); + await changed; + } + const targetPath = normalizePath(target); + const targetDirectories = Object.keys(server.watcher.getWatched()) + .map(normalizePath) + .filter( + (path) => path === targetPath || path.startsWith(`${targetPath}/`), + ); + assert.deepEqual(targetDirectories, [], 'Rust target 不应创建目录监听器'); + } finally { + await server?.close(); + await rm(fixture, { recursive: true, force: true }); + } + }, +); diff --git a/apps/ai-game-creator-shell/vite.config.ts b/apps/ai-game-creator-shell/vite.config.ts index 6e68153ba..fa2246ed0 100644 --- a/apps/ai-game-creator-shell/vite.config.ts +++ b/apps/ai-game-creator-shell/vite.config.ts @@ -154,6 +154,9 @@ export default defineConfig({ host: '127.0.0.1', port: 3080, strictPort: true, + watch: { + ignored: ['**/src-tauri/target/**'], + }, fs: { allow: [repoRoot], }, diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index e8d132d9f..99b49877b 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -1,5 +1,9 @@ # 踩坑与排障记录 +## AGC Windows 开发态首次页面加载缓慢 + +Vite 默认监听应用根下的 Rust `src-tauri/target`,构建产物较多时会创建大量 Windows 文件监听器。AGC 配置通过 `server.watch.ignored: ['**/src-tauri/target/**']` 排除此目录,不关闭业务源码、CSS、共享组件监听或 HMR。排查时区分后端就绪、Vite 扫描和原生窗口首绘;监听目录回归不能代替实机首绘测量,验证入口见本地开发运维文档。 + ## Windows 已登记生图资产未刷新 Direct 工具桥会 canonicalize 项目根,事件中的路径可能带 `\\?\` / `\\?\UNC\`,而前端项目路径仍是普通盘符或 UNC。失效监听不能直接比较原始字符串;识别为同一项目后,用当前项目路径重读 manifest,保留项目切换与 revision 门禁。普通 `agc_generate_image` 成功提交也必须发出失效通知,不能依赖整轮 Agent 结束。回归需覆盖两种 Windows 前缀、其它项目事件拒收,以及 Agent 尚未结束和后续失败时已登记图片卡片仍可见。 diff --git a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md index e036f5205..181ca4bfc 100644 --- a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md +++ b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md @@ -20,6 +20,8 @@ Stdb 发布以 root 准备文件、再切换 `spacetimedb` 用户执行时,WAS ## 本地启动 +AGC Vite 的 `server.watch.ignored` 排除 `**/src-tauri/target/**`,避免递归监听 Rust 构建产物、在 Windows 上创建大量文件监听器并拖慢首次页面加载。保留业务源码、CSS 与仓库共享组件的监听及热更新;不通过关闭 watcher 或 HMR 规避问题。监听回归使用 `node --test apps/ai-game-creator-shell/scripts/vite-watch.test.mjs`,验证构建目录被排除、应用源码及根目录外的共享源码仍能触发变更;原生窗口首绘耗时另行实测,不把监听测试耗时当作启动性能指标。 + AGC `backend` 模式与 `all` / `api-server` 一样,必须同时探测 API 和 BgFilter worker 端口,漂移后的 worker 地址同时传给 API、worker 和 readiness 检查。不能因为旧 worker 的 `/readyz` 可访问,就把新启动失败的同端口 worker 视为就绪;AGC 前端会等待完整配套后端,worker 失败可能最终表现为 Tauri 等待前端 180 秒超时。 `npm run agc` 外层启动器先执行 `agc:serve` 并等待前端与配套后端就绪,再启动 Tauri,同时清空本次 CLI 的 `beforeDevCommand`,避免重复拉起服务和把数据库发布时间计入 Tauri 的 180 秒前端等待。准备阶段最多等待 660 秒(后端门禁仍为 600 秒),退出时清理本次启动的服务树,不停止复用的服务。AGC 自动发布显式使用 `--preserve-database`,schema 冲突须人工确认迁移,不自动清空数据。 From 910862fd06f437cf377dbff204f048b44991792f Mon Sep 17 00:00:00 2001 From: suzmii Date: Wed, 16 Sep 2026 17:39:23 +0800 Subject: [PATCH 02/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8DAGC=E7=94=BB=E5=B8=83?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E5=B9=B6=E8=AF=86=E5=88=ABUI=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1JSON?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 稳定工作台与窗口标题栏状态同步,消除重复更新循环 支持画布右键平移并保留左键框选及资源拖动,完善中断清理 解耦运行不可用提示与资源选中状态 复用原生UI状态校验区分UI设计JSON和普通JSON,接入现有编辑器与代码预览 补充前端和原生回归测试、规范及待验收记录,明确对话历史分页尚未修复 --- .../src-tauri/src/commands.rs | 16 +- .../src-tauri/src/resource_inspect.rs | 4 + .../src-tauri/src/ui_editor/persistence.rs | 214 +++++++++++- .../features/app-shell/WorkspaceLauncher.tsx | 21 +- .../resourceCanvasFocusModel.ts | 17 + .../resourceDocumentPreviewModel.ts | 10 +- .../ResourcePreviewMedia.tsx | 19 +- .../src/view/project-development/index.tsx | 136 ++++++-- .../resourceCardPreviewModel.ts | 31 +- .../useProjectResourceCardPreviews.ts | 1 + .../appSurface/project-development.suite.ts | 9 + .../resourceCanvasFloatingDismiss.test.tsx | 33 ++ .../tests/resourceCanvasManualLayout.test.tsx | 317 ++++++++++++++++++ .../resourceCardPreviewRealManifest.test.ts | 2 +- .../resourceDocumentPreviewModel.test.ts | 8 +- .../tests/resourceJsonCanvas.test.tsx | 205 +++++++++++ .../tests/resourceJsonPresentation.test.ts | 87 +++++ .../useProjectResourceCardPreviews.test.ts | 54 +++ .../tests/workspaceWindowSync.test.tsx | 111 ++++++ ...施计划】AGC画布交互稳定性修复-2026-09-16.md | 43 +++ ...实施计划】AGC资源JSON语义识别-2026-09-16.md | 27 ++ ...里程碑】AGC画布交互稳定性修复-2026-09-16.md | 26 ++ ...里程碑】AGC资源JSON语义识别-2026-09-16.md | 26 ++ docs/project-memory/shared-memory/pitfalls.md | 8 + ...案】AI游戏创作智能体App实施计划-2026-06-24.md | 13 + 25 files changed, 1386 insertions(+), 52 deletions(-) create mode 100644 apps/ai-game-creator-shell/tests/resourceJsonCanvas.test.tsx create mode 100644 apps/ai-game-creator-shell/tests/resourceJsonPresentation.test.ts create mode 100644 apps/ai-game-creator-shell/tests/workspaceWindowSync.test.tsx create mode 100644 docs/project-memory/plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md create mode 100644 docs/project-memory/plans/【实施计划】AGC资源JSON语义识别-2026-09-16.md create mode 100644 docs/project-memory/plans/【里程碑】AGC画布交互稳定性修复-2026-09-16.md create mode 100644 docs/project-memory/plans/【里程碑】AGC资源JSON语义识别-2026-09-16.md diff --git a/apps/ai-game-creator-shell/src-tauri/src/commands.rs b/apps/ai-game-creator-shell/src-tauri/src/commands.rs index ca97077f1..eee72252c 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/commands.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/commands.rs @@ -5008,7 +5008,21 @@ pub(crate) fn read_local_project_text_preview_at( return Err("只能读取当前项目已登记的文档资源".to_string()); } cancellation.check()?; - load_local_project_text_preview_with_cancellation(root, &normalized_path, cancellation) + let mut preview = + load_local_project_text_preview_with_cancellation(root, &normalized_path, cancellation)?; + if normalized_path.to_ascii_lowercase().ends_with(".json") { + preview.ui_design_asset_id = manifest.assets.iter().find_map(|asset| { + (asset.local_path == normalized_path + && ui_editor::persistence::is_valid_ui_design_json( + &preview.content, + &manifest.project_id, + &asset.id, + )) + .then(|| asset.id.clone()) + }); + } + cancellation.check()?; + Ok(preview) } #[tauri::command] diff --git a/apps/ai-game-creator-shell/src-tauri/src/resource_inspect.rs b/apps/ai-game-creator-shell/src-tauri/src/resource_inspect.rs index 690c95b45..d7ca4b4ba 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/resource_inspect.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/resource_inspect.rs @@ -24,6 +24,9 @@ pub(crate) struct LocalProjectTextPreview { pub(crate) media_type: String, pub(crate) byte_len: u64, pub(crate) content: String, + /// 仅由已登记资源的原生 UI State 校验设置;前端不根据正文猜测编辑能力。 + #[serde(skip_serializing_if = "Option::is_none")] + pub(crate) ui_design_asset_id: Option, } #[derive(Debug, Eq, PartialEq, Serialize)] @@ -163,6 +166,7 @@ pub(crate) fn load_local_project_text_preview_with_cancellation( media_type: media_type.to_string(), byte_len: content.len() as u64, content, + ui_design_asset_id: None, }) } diff --git a/apps/ai-game-creator-shell/src-tauri/src/ui_editor/persistence.rs b/apps/ai-game-creator-shell/src-tauri/src/ui_editor/persistence.rs index 73b55d9ce..a566a9225 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/ui_editor/persistence.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/ui_editor/persistence.rs @@ -158,7 +158,7 @@ pub(crate) fn load_ui_design_state_at( let root = Path::new(input.project_path.trim()); let expected_project_id = required_identifier(&input.expected_project_id, "expectedProjectId")?; let asset_id = required_identifier(&input.asset_id, "assetId")?; - let asset = ui_design_asset(root, &expected_project_id, &asset_id)?; + let asset = registered_json_asset(root, &expected_project_id, &asset_id)?; let document = read_ui_design_document(root, &asset.local_path, &expected_project_id, &asset_id)?; validate_document(&document, &expected_project_id, &asset_id)?; @@ -175,7 +175,7 @@ pub(crate) fn generate_ui_design_code_at( let expected_project_id = required_identifier(&input.expected_project_id, "expectedProjectId")?; let asset_id = required_identifier(&input.asset_id, "assetId")?; let _lock = acquire_project_write_lock(root, "ui_design.code_generate")?; - let asset = ui_design_asset(root, &expected_project_id, &asset_id)?; + let asset = registered_json_asset(root, &expected_project_id, &asset_id)?; let document = read_ui_design_document_locked(root, &asset.local_path, &expected_project_id, &asset_id)?; let (content, tree_exports, node_count) = render_ui_design_state_js(&document.state)?; @@ -225,9 +225,9 @@ pub(crate) fn save_ui_design_state_at( let expected_project_id = required_identifier(&input.expected_project_id, "expectedProjectId")?; let asset_id = required_identifier(&input.asset_id, "assetId")?; - let preflight_asset = ui_design_asset(root, &expected_project_id, &asset_id)?; + let preflight_asset = registered_json_asset(root, &expected_project_id, &asset_id)?; let _lock = acquire_project_write_lock(root, "ui_design.state_save")?; - let asset = ui_design_asset(root, &expected_project_id, &asset_id)?; + let asset = registered_json_asset(root, &expected_project_id, &asset_id)?; if asset.local_path != preflight_asset.local_path { return Err("UI 设计资源在保存锁获取期间发生变化,请重试".to_string()); } @@ -311,6 +311,19 @@ fn ui_design_asset( root: &Path, expected_project_id: &str, asset_id: &str, +) -> Result { + let asset = registered_json_asset(root, expected_project_id, asset_id)?; + // 新状态初始化仍是显式 UI 创建动作,不能因放开已有设计的登记标签而覆盖普通 JSON。 + if asset.kind != "UI" || asset.media_type != "application/json" { + return Err("目标资源不是 UI 设计 JSON 资产".to_string()); + } + Ok(asset) +} + +fn registered_json_asset( + root: &Path, + expected_project_id: &str, + asset_id: &str, ) -> Result { let manifest = read_existing_manifest_for_project(root)?; if manifest.project_id != expected_project_id { @@ -321,8 +334,10 @@ fn ui_design_asset( .into_iter() .find(|asset| asset.id == asset_id) .ok_or_else(|| "UI 设计资源不存在".to_string())?; - if asset.kind != "UI" || asset.media_type != "application/json" { - return Err("目标资源不是 UI 设计 JSON 资产".to_string()); + if !asset.local_path.to_ascii_lowercase().ends_with(".json") + || !is_supported_project_text_resource(&asset.local_path, &asset.media_type) + { + return Err("目标资源不是已登记的 JSON 资产".to_string()); } normalize_relative_path(&asset.local_path)?; Ok(asset) @@ -393,10 +408,27 @@ fn read_ui_design_document_path(path: &Path) -> Result bool { + parse_ui_design_document(content.as_bytes()) + .and_then(|document| validate_document(&document, project_id, asset_id)) + .is_ok() +} + +fn parse_ui_design_document(bytes: &[u8]) -> Result { + if bytes.len() > UI_DESIGN_STATE_MAX_BYTES { + return Err(format!( + "UI 设计 State 超过 {UI_DESIGN_STATE_MAX_BYTES} 字节上限" + )); + } + let value: serde_json::Value = serde_json::from_slice(bytes) + .map_err(|error| format!("解析 UI 设计 State 失败:{error}"))?; let document: PersistedUiDesignState = serde_json::from_value(value.clone()) - .map_err(|error| format!("解析 UI 设计 State 契约失败:{}: {error}", path.display()))?; + .map_err(|error| format!("解析 UI 设计 State 契约失败:{error}"))?; let canonical: serde_json::Value = serde_json::from_slice(&serialize_ui_design_document(&document)?) .map_err(|error| format!("序列化 UI 设计 State 契约失败:{error}"))?; @@ -847,6 +879,170 @@ mod tests { } } + #[test] + fn json_preview_recognition_requires_canonical_state_and_resource_identity() { + let document = serde_json::to_value(empty_document(PROJECT_ID, "design")).unwrap(); + let content = document.to_string(); + assert!(is_valid_ui_design_json(&content, PROJECT_ID, "design")); + assert!(!is_valid_ui_design_json( + &content, + "other-project", + "design" + )); + assert!(!is_valid_ui_design_json( + &content, + PROJECT_ID, + "other-asset" + )); + for content in ["{broken", "{}", "[]", r#"{"type":"UI"}"#] { + assert!(!is_valid_ui_design_json(content, PROJECT_ID, "design")); + } + for (pointer, value) in [ + ("/schemaVersion", serde_json::json!("unknown-schema")), + ("/revision", serde_json::json!(9_007_199_254_740_992u64)), + ("/state/ui_trees", serde_json::json!([{}])), + ] { + let mut invalid = document.clone(); + *invalid.pointer_mut(pointer).unwrap() = value; + assert!(!is_valid_ui_design_json( + &invalid.to_string(), + PROJECT_ID, + "design" + )); + } + let mut unknown = document.clone(); + unknown["state"]["unknown"] = serde_json::json!(true); + assert!(!is_valid_ui_design_json( + &unknown.to_string(), + PROJECT_ID, + "design" + )); + let invalid_state = PersistedUiDesignState { + state: state_with_unavailable_image("../outside.png"), + ..empty_document(PROJECT_ID, "design") + }; + assert!(!is_valid_ui_design_json( + &serde_json::to_string(&invalid_state).unwrap(), + PROJECT_ID, + "design", + )); + assert!(!is_valid_ui_design_json( + &" ".repeat(UI_DESIGN_STATE_MAX_BYTES + 1), + PROJECT_ID, + "design", + )); + } + + #[test] + fn json_preview_and_editor_accept_valid_state_without_rewriting_asset_kind() { + for kind in ["UI", "ui", "ui-design", "document"] { + let (directory, asset_id) = fixture(); + crate::project::mutate_manifest_at(directory.path(), |manifest| { + manifest + .assets + .iter_mut() + .find(|asset| asset.id == asset_id) + .unwrap() + .kind = kind.to_string(); + Ok(()) + }) + .unwrap(); + let path = directory.path().join("ui/design.json"); + let before = fs::read(&path).unwrap(); + let preview = read_local_project_text_preview_at( + directory.path().to_str().unwrap(), + "ui/design.json", + &crate::resource_preview_scheduler::ProjectResourcePreviewScopeCancellation::uncancelled(), + ).unwrap(); + assert_eq!( + preview.ui_design_asset_id.as_deref(), + Some(asset_id.as_str()) + ); + assert_eq!(fs::read(&path).unwrap(), before); + let loaded = load_ui_design_state_at(LoadUiDesignStateInput { + project_path: directory.path().to_string_lossy().into_owned(), + expected_project_id: PROJECT_ID.to_string(), + asset_id: asset_id.clone(), + }) + .unwrap(); + assert_eq!(loaded.revision, 0); + let saved = save_ui_design_state_at(input( + directory.path(), + &asset_id, + 0, + state_with_unavailable_image("assets/page.png"), + )) + .unwrap(); + assert!(matches!( + saved, + SaveUiDesignStateResult::Saved { revision: 1, .. } + )); + assert_eq!( + read_existing_manifest_for_project(directory.path()) + .unwrap() + .assets + .iter() + .find(|asset| asset.id == asset_id) + .unwrap() + .kind, + kind, + ); + } + } + + #[test] + fn ordinary_or_foreign_json_preview_never_grants_ui_editing_or_overwrites_content() { + let (directory, asset_id) = fixture(); + crate::project::mutate_manifest_at(directory.path(), |manifest| { + manifest + .assets + .iter_mut() + .find(|asset| asset.id == asset_id) + .unwrap() + .kind = "document".to_string(); + Ok(()) + }) + .unwrap(); + let path = directory.path().join("ui/design.json"); + let foreign = serde_json::to_string(&empty_document("other-project", &asset_id)).unwrap(); + for content in [r#"{"ordinary":true}"#, "{broken", foreign.as_str()] { + fs::write(&path, content).unwrap(); + let preview = read_local_project_text_preview_at( + directory.path().to_str().unwrap(), + "ui/design.json", + &crate::resource_preview_scheduler::ProjectResourcePreviewScopeCancellation::uncancelled(), + ).unwrap(); + assert_eq!(preview.ui_design_asset_id, None); + assert_eq!(preview.content, content); + assert!(load_ui_design_state_at(LoadUiDesignStateInput { + project_path: directory.path().to_string_lossy().into_owned(), + expected_project_id: PROJECT_ID.to_string(), + asset_id: asset_id.clone(), + }) + .is_err()); + assert!(save_ui_design_state_at(input( + directory.path(), + &asset_id, + 0, + empty_document(PROJECT_ID, &asset_id).state, + )) + .is_err()); + assert!( + initialize_ui_design_state_at(directory.path(), PROJECT_ID, &asset_id).is_err() + ); + assert_eq!(fs::read_to_string(&path).unwrap(), content); + } + fs::write( + directory.path().join("ui/unregistered.json"), + serde_json::to_string(&empty_document(PROJECT_ID, &asset_id)).unwrap(), + ) + .unwrap(); + assert!(read_local_project_text_preview_at( + directory.path().to_str().unwrap(), "ui/unregistered.json", + &crate::resource_preview_scheduler::ProjectResourcePreviewScopeCancellation::uncancelled(), + ).is_err()); + } + fn state_with_unavailable_image(path: &str) -> State { serde_json::from_value(serde_json::json!({ "ui_trees": [], diff --git a/apps/ai-game-creator-shell/src/features/app-shell/WorkspaceLauncher.tsx b/apps/ai-game-creator-shell/src/features/app-shell/WorkspaceLauncher.tsx index 4727bf323..9d2ac7aba 100644 --- a/apps/ai-game-creator-shell/src/features/app-shell/WorkspaceLauncher.tsx +++ b/apps/ai-game-creator-shell/src/features/app-shell/WorkspaceLauncher.tsx @@ -1,4 +1,11 @@ -import { Fragment, useCallback, useEffect, useRef, useState } from 'react'; +import { + Fragment, + useCallback, + useEffect, + useLayoutEffect, + useRef, + useState, +} from 'react'; import { createPortal } from 'react-dom'; import { launcherNotifications } from '../../app/constants'; @@ -198,12 +205,18 @@ export function WorkspaceLauncherShell({ */ const manifestMergeNoticeScopeRef = useRef(null); + // 打开项目由创建流程提供,其函数引用随渲染变化;标题栏只持有稳定的转发入口, + // 否则发布 Context 会再次触发工作台 effect,形成发布/清理循环。 + const openProjectRef = useRef(openProject); + useLayoutEffect(() => { + openProjectRef.current = openProject; + }, [openProject]); const openActiveProject = useCallback( (nextProjectPath: string) => { setProjectPath(nextProjectPath); - void openProject(nextProjectPath, 'open'); + void openProjectRef.current(nextProjectPath, 'open'); }, - [openProject, setProjectPath], + [setProjectPath], ); useEffect(() => { @@ -213,7 +226,6 @@ export function WorkspaceLauncherShell({ readFailed: snapshotReadFailed, onOpenProject: openActiveProject, }); - return () => setActiveProjectRuns(null); }, [ activeTurns, currentProjectContext?.projectPath, @@ -221,6 +233,7 @@ export function WorkspaceLauncherShell({ setActiveProjectRuns, snapshotReadFailed, ]); + useEffect(() => () => setActiveProjectRuns(null), [setActiveProjectRuns]); useEffect(() => { const projectPath = currentProjectContext?.projectPath ?? null; diff --git a/apps/ai-game-creator-shell/src/features/resource-canvas/resourceCanvasFocusModel.ts b/apps/ai-game-creator-shell/src/features/resource-canvas/resourceCanvasFocusModel.ts index a2c24def2..92ba12136 100644 --- a/apps/ai-game-creator-shell/src/features/resource-canvas/resourceCanvasFocusModel.ts +++ b/apps/ai-game-creator-shell/src/features/resource-canvas/resourceCanvasFocusModel.ts @@ -37,6 +37,23 @@ export function isResourceCanvasInteractionTarget( return Boolean(target?.closest(RESOURCE_CANVAS_INTERACTION_SELECTOR)); } +/** 抓手可从卡面发起,但不能抢走输入、媒体控件或画布浮层的交互。 */ +export function isResourceCanvasPanTarget( + target: Element | null | undefined, +): boolean { + if (!target) return false; + if (target.closest('[contenteditable="true"], .game-resource-filter-panel')) { + return false; + } + if (!isResourceCanvasInteractionTarget(target)) return true; + return Boolean( + target.closest('.game-resource-card') && + !target.closest( + 'button:not(.game-resource-card-select), input, textarea, select, a, audio, video', + ), + ); +} + /** * 画布浮层里有自己滚动区的那几个:落在它们里面的滚轮归浮层,画布不得消费。 * diff --git a/apps/ai-game-creator-shell/src/features/resource-canvas/resourceDocumentPreviewModel.ts b/apps/ai-game-creator-shell/src/features/resource-canvas/resourceDocumentPreviewModel.ts index c0bc85c78..390d08c15 100644 --- a/apps/ai-game-creator-shell/src/features/resource-canvas/resourceDocumentPreviewModel.ts +++ b/apps/ai-game-creator-shell/src/features/resource-canvas/resourceDocumentPreviewModel.ts @@ -1,4 +1,5 @@ import { + isProjectResourceJson, projectResourceCardPreviewKind, projectResourcePathExtension, } from '../../view/project-development/resourceCardPreviewModel'; @@ -65,11 +66,14 @@ export function resourceDocumentPreviewMarkdown( resource: ProjectResource, content: string, ) { - if (projectResourceCardPreviewKind(resource) !== 'code') { + const isJson = isProjectResourceJson(resource); + if (projectResourceCardPreviewKind(resource) !== 'code' && !isJson) { return content; } - const language = - CODE_LANGUAGES[projectResourcePathExtension(resource.path) ?? ''] ?? 'text'; + const language = isJson + ? 'json' + : (CODE_LANGUAGES[projectResourcePathExtension(resource.path) ?? ''] ?? + 'text'); // 围栏长于源码里的任意反引号串,代码生成模板中的 Markdown 不能提前闭合代码块。 const longestRun = (content.match(/`+/g) ?? []).reduce( (length, run) => Math.max(length, run.length), diff --git a/apps/ai-game-creator-shell/src/view/project-development/ResourcePreviewMedia.tsx b/apps/ai-game-creator-shell/src/view/project-development/ResourcePreviewMedia.tsx index 637ab9103..281ce517c 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/ResourcePreviewMedia.tsx +++ b/apps/ai-game-creator-shell/src/view/project-development/ResourcePreviewMedia.tsx @@ -1,10 +1,17 @@ -import { FileCode2, Image as ImageIcon, Music2, Video } from 'lucide-react'; +import { + FileCode2, + Image as ImageIcon, + Music2, + SlidersHorizontal, + Video, +} from 'lucide-react'; import { useEffect, useRef } from 'react'; import { projectResourceCardPreviewKind, type ProjectResourceCardPreviewState, projectResourceCardPreviewVariant, + projectResourceJsonPresentation, } from './resourceCardPreviewModel'; import type { ProjectResource } from './resourceProjectionModel'; @@ -90,6 +97,16 @@ export function ResourcePreviewMedia({ const sourceUrl = preview.status === 'loaded' ? (preview.preview.sourceUrl ?? null) : null; const visual = (() => { + const jsonPresentation = resource + ? projectResourceJsonPresentation(resource, preview) + : null; + if (jsonPresentation) { + return jsonPresentation === 'ui-design' ? ( + + ) : ( + + ); + } if (sourceUrl && (kind === 'raster-image' || kind === 'media-image')) { return ( { + if (jsonPresentation) { + return ( + + {jsonPresentation === 'ui-design' ? ( + + ); + } if ((kind === 'raster-image' || kind === 'media-image') && sourceUrl) { return ( - {resourceCategoryLabel} + {cardTypeLabel} {lineage ? ( // 文字是给人看的关系,`data-resource-lineage` 是给端到端验收的稳定判据 @@ -1342,6 +1367,7 @@ function ResourceBookScene({ onPointerMove={onPointerMove} onPointerUp={onPointerUp} onPointerCancel={onPointerCancel} + onLostPointerCapture={onPointerCancel} >
>(new Set()); const resourceCanvasPanRef = useRef<{ pointerId: number; + captureTarget: HTMLElement; category: ResourceBookTarget; startClientX: number; startClientY: number; @@ -3363,15 +3391,14 @@ export default function ProjectDevelopmentView({ ); const cancelResourceCanvasPan = useCallback(() => { - const pan = resourceCanvasPanRef.current; - if (!pan) { - return; - } - const canvas = resourceCanvasRef.current; - if (canvas?.hasPointerCapture?.(pan.pointerId)) { - canvas.releasePointerCapture?.(pan.pointerId); - } + const pans = [resourceCanvasPanRef.current, resourceBookMainPanRef.current]; resourceCanvasPanRef.current = null; + resourceBookMainPanRef.current = null; + for (const pan of pans) { + if (pan?.captureTarget.hasPointerCapture?.(pan.pointerId)) { + pan.captureTarget.releasePointerCapture(pan.pointerId); + } + } }, []); const cancelResourceCardDrag = useCallback(() => { @@ -4749,6 +4776,8 @@ export default function ProjectDevelopmentView({ }; const handleBlur = () => { resourceCanvasSpacePanRef.current = false; + cancelResourceCanvasPan(); + setResourceCanvasMarquee(null); }; window.addEventListener('keydown', handleKeyDown); window.addEventListener('keyup', handleKeyUp); @@ -4758,7 +4787,7 @@ export default function ProjectDevelopmentView({ window.removeEventListener('keyup', handleKeyUp); window.removeEventListener('blur', handleBlur); }; - }, []); + }, [cancelResourceCanvasPan]); const handleResourceBookWheel = useCallback( (event: ReactWheelEvent | WheelEvent) => { @@ -4855,7 +4884,10 @@ export default function ProjectDevelopmentView({ const handleResourceBookMainPointerDown = useCallback( (event: ReactPointerEvent) => { - if (resourceBookView !== 'main' || event.button !== 0) { + if ( + resourceBookView !== 'main' || + (event.button !== 0 && event.button !== 2) + ) { return; } const target = event.target as HTMLElement; @@ -4871,6 +4903,7 @@ export default function ProjectDevelopmentView({ resourceBookTransitionControllerRef.current.settle(); resourceBookMainPanRef.current = { pointerId: event.pointerId, + captureTarget: event.currentTarget, startClientX: event.clientX, startClientY: event.clientY, startViewport: resourceBookMainViewportRef.current, @@ -5096,11 +5129,19 @@ export default function ProjectDevelopmentView({ const canvasTarget = resourceBookOpensAllResources ? RESOURCE_BOOK_ALL_TARGET : activePageCategory; - if (!canvasTarget || event.button > 1) { + if (!canvasTarget || event.button > 2) { return; } const target = event.target as HTMLElement; - if (isResourceCanvasInteractionTarget(target)) { + const isPan = + event.button === 2 || + event.button === 1 || + resourceCanvasSpacePanRef.current; + if ( + event.button === 2 + ? !isResourceCanvasPanTarget(target) + : isResourceCanvasInteractionTarget(target) + ) { return; } // 点选态下空白处的左键不起框选、也不清画布焦点/选中:点选只认资源卡, @@ -5114,12 +5155,13 @@ export default function ProjectDevelopmentView({ return; } resourceBookTransitionControllerRef.current.settle(); - // 与美术画布一致:中键或按住空格是平移,左键在空白处是框选。 - if (event.button === 1 || resourceCanvasSpacePanRef.current) { + // 右键平移,保留中键/空格抓手;空白处左键继续框选。 + if (isPan) { event.preventDefault(); event.currentTarget.setPointerCapture(event.pointerId); resourceCanvasPanRef.current = { pointerId: event.pointerId, + captureTarget: event.currentTarget, category: canvasTarget, startClientX: event.clientX, startClientY: event.clientY, @@ -5292,12 +5334,22 @@ export default function ProjectDevelopmentView({ const openResourceUiEditor = useCallback( (resource: ProjectResource) => { - if (resource.subtype === 'ui-prototype') { + const identity = resourceCardPreviews.identityByResourceId.get( + resource.id, + ); + const jsonPresentation = projectResourceJsonPresentation( + resource, + identity ? resourceCardPreviews.previews.get(identity) : null, + ); + if (resource.subtype === 'ui-prototype' && jsonPresentation === null) { void openUiDesignEditor(resource); return; } - if (resource.manifestAssetId === null) { - setResourceWorkbenchNotice('该 UI 资源缺少有效的正式资产身份'); + if ( + resource.manifestAssetId === null || + jsonPresentation !== 'ui-design' + ) { + setResourceWorkbenchNotice('该资源尚未通过 UI 设计 JSON 校验'); return; } canvasOpenEpochRef.current += 1; @@ -5318,7 +5370,13 @@ export default function ProjectDevelopmentView({ : {}), }); }, - [advanceFocusGeneration, manifest.assets, openUiDesignEditor], + [ + advanceFocusGeneration, + manifest.assets, + openUiDesignEditor, + resourceCardPreviews.identityByResourceId, + resourceCardPreviews.previews, + ], ); /** @@ -6202,8 +6260,7 @@ export default function ProjectDevelopmentView({ setMode('run'); } - const showRunUnavailableHint = - !runAvailable && selectedResourceIds.length === 0 && !uiEditorRoute; + const showRunUnavailableHint = !runAvailable && !uiEditorRoute; const renderResourceBookCard = useCallback( ( @@ -7457,9 +7514,16 @@ export default function ProjectDevelopmentView({ : null, [manifest, selectedResource], ); + const selectedResourceJsonPresentation = selectedResource + ? projectResourceJsonPresentation( + selectedResource, + selectedResourceCardPreview, + ) + : null; const selectedResourceOpensUiEditor = - selectedResource?.subtype === 'UI' || - selectedResource?.subtype === 'ui-prototype'; + selectedResourceJsonPresentation === 'ui-design' || + (selectedResourceJsonPresentation === null && + selectedResource?.subtype === 'ui-prototype'); const selectedToolbarStyle = selectedResourceLayer ? resolveSelectedToolbarStyle({ @@ -7847,10 +7911,24 @@ export default function ProjectDevelopmentView({ className={`game-resource-manager game-resource-book-manager game-resource-book-manager--${resourceBookState.view} game-resource-book-manager--${resourceBookState.phase}`} data-resource-book-view={resourceBookState.view} data-resource-book-transition={resourceBookState.phase} + onContextMenu={(event) => { + const target = event.target as Element; + if ( + event.button === 2 && + event.currentTarget.contains(target) && + target.closest( + '.game-resource-book-scene, .game-resource-canvas, .game-resource-book-main', + ) && + isResourceCanvasPanTarget(target) + ) { + event.preventDefault(); + } + }} onPointerDownCapture={(event) => { if ( event.currentTarget.dataset.resourceBookTransition !== 'idle' && + event.button === 0 && (event.target as Element).closest('.game-resource-card') ) { event.preventDefault(); @@ -7924,7 +8002,8 @@ export default function ProjectDevelopmentView({ 预览 ) : null} - {selectedResourceOpensUiEditor ? ( + {selectedResource && + selectedResourceOpensUiEditor ? ( {sortMode === 'dependency' && dependencyRelationshipDescriptions.length > 0 ? ( diff --git a/apps/ai-game-creator-shell/src/view/project-development/resourceCardPreviewModel.ts b/apps/ai-game-creator-shell/src/view/project-development/resourceCardPreviewModel.ts index c97057461..979015c52 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/resourceCardPreviewModel.ts +++ b/apps/ai-game-creator-shell/src/view/project-development/resourceCardPreviewModel.ts @@ -58,6 +58,8 @@ export type ProjectResourceCardPreviewPayload = { hasAlpha?: boolean; sourceUrl?: string; content?: string; + /** 原生侧完整校验过的 UI State 资产身份,不由前端解析 JSON 推断。 */ + uiDesignAssetId?: string; }; export type ProjectResourceCardPreviewTransportPayload = Omit< @@ -219,7 +221,8 @@ const markdownExtension = /\.(md|markdown|mdx)$/iu; * 与 `resourceProjectionModel` 的 `gameCodeExtension` 是两份口径,刻意不复用: * 那份用于**筛选与归属**,改动会波及画布栏目与计数;这份只决定**卡面怎么画**。 * 这里按用户口径把 `.yaml` / `.toml` / `.xml` / `.html` / `.css` / `.sql` - * 一并算代码;JSON 规格属于文档预览。 + * 一并算代码。JSON 留在文本读取通道,由原生内容识别区分普通 JSON 和 UI 设计, + * 不能像源码卡一样跳过预取;卡面不显示 JSON 正文。 */ const cardCodeExtension = /\.(ts|tsx|mts|cts|js|jsx|mjs|cjs|rs|py|go|java|kt|kts|cs|cpp|cc|cxx|c|h|hpp|swift|php|rb|lua|sh|bash|zsh|ps1|psm1|ya?ml|toml|xml|html?|css|scss|less|sql|graphql|gql|vue|svelte)$/iu; @@ -236,6 +239,30 @@ export function projectResourcePathExtension(path: string): string | null { return matched ? matched[1]!.toLowerCase() : null; } +export function isProjectResourceJson( + resource: Pick, +): boolean { + return ( + projectResourcePathExtension(resource.path) === 'json' || + (projectResourcePathExtension(resource.path) === null && + resource.mediaType.toLowerCase().includes('json')) + ); +} + +/** 读取结果必须仍属于当前卡片;元数据中的 UI 标签本身不能授予编辑入口。 */ +export function projectResourceJsonPresentation( + resource: ProjectResource, + preview: ProjectResourceCardPreviewState | null | undefined, +): 'json' | 'ui-design' | null { + if (!isProjectResourceJson(resource)) return null; + return resource.manifestAssetId && + preview?.status === 'loaded' && + preview.preview.path === resource.path && + preview.preview.uiDesignAssetId === resource.manifestAssetId + ? 'ui-design' + : 'json'; +} + /** 代码文件的类型标签(如 `.ts` → `TS`);不是代码文件时返回 `null`。 */ export function projectResourceCodeTypeLabel(path: string): string | null { const trimmed = path.trim(); @@ -256,7 +283,7 @@ export function projectResourceCardPreviewKind( return 'document'; } // Markdown / 代码在扩展名这一层就分流,不再依赖上游登记类型: - // 上游把 JSON 规格登记成「文档」,卡面按文档预览;代码文件按扩展名分流。 + // JSON 使用文档读取通道完成原生语义识别;源码文件按扩展名分流。 if (markdownExtension.test(resource.path)) { return 'document'; } diff --git a/apps/ai-game-creator-shell/src/view/project-development/useProjectResourceCardPreviews.ts b/apps/ai-game-creator-shell/src/view/project-development/useProjectResourceCardPreviews.ts index f175264ba..729658ceb 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/useProjectResourceCardPreviews.ts +++ b/apps/ai-game-creator-shell/src/view/project-development/useProjectResourceCardPreviews.ts @@ -167,6 +167,7 @@ function materializeProjectResourceCardPreview( pixelHeight: transport.pixelHeight, hasAlpha: transport.hasAlpha, content: transport.content, + uiDesignAssetId: transport.uiDesignAssetId, }, retainedBytes: transport.content === undefined diff --git a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts index 2438d7657..f041845b6 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts @@ -6043,6 +6043,15 @@ export function registerProjectWorkbenchFoundationTests() { }, }; } + if (command === 'read_local_project_text_preview') { + return { + path: 'assets/ui-design.json', + mediaType: 'application/json', + byteLen: 2, + content: '{}', + uiDesignAssetId: 'ui-design-resource', + }; + } throw new Error(`unexpected invoke ${command}`); }, ); diff --git a/apps/ai-game-creator-shell/tests/resourceCanvasFloatingDismiss.test.tsx b/apps/ai-game-creator-shell/tests/resourceCanvasFloatingDismiss.test.tsx index f3a58a319..22018450b 100644 --- a/apps/ai-game-creator-shell/tests/resourceCanvasFloatingDismiss.test.tsx +++ b/apps/ai-game-creator-shell/tests/resourceCanvasFloatingDismiss.test.tsx @@ -14,6 +14,7 @@ import { canDismissResourceCanvasQuickEdit, isResourceCanvasHostOverlayOpen, isResourceCanvasInteractionTarget, + isResourceCanvasPanTarget, isResourceCanvasWheelOverlayTarget, resolveResourceCanvasFloatingPanelDismissOpen, resolveResourceCanvasFloatingPanelOpen, @@ -41,6 +42,38 @@ const RESOURCE_FOCUS_SOURCE_LAYER: CanvasLayer = { }; describe('resourceCanvasFocusModel', () => { + test('右键抓手允许卡面和选中按钮,不抢媒体控件、编辑器及浮层', () => { + document.body.innerHTML = ` +
+
+ + + +
+
+
筛选
+
操作
+
+ `; + for (const id of ['blank', 'card', 'select']) { + expect(isResourceCanvasPanTarget(document.getElementById(id))).toBe(true); + } + for (const id of [ + 'play', + 'video', + 'input', + 'editor', + 'filter', + 'toolbar', + 'title', + ]) { + expect(isResourceCanvasPanTarget(document.getElementById(id))).toBe( + false, + ); + } + expect(isResourceCanvasPanTarget(null)).toBe(false); + }); + test('点在资源卡、交互控件与画布浮层里时不清画布焦点', () => { document.body.innerHTML = `
diff --git a/apps/ai-game-creator-shell/tests/resourceCanvasManualLayout.test.tsx b/apps/ai-game-creator-shell/tests/resourceCanvasManualLayout.test.tsx index 49b9c3dfa..e1de7b91e 100644 --- a/apps/ai-game-creator-shell/tests/resourceCanvasManualLayout.test.tsx +++ b/apps/ai-game-creator-shell/tests/resourceCanvasManualLayout.test.tsx @@ -340,6 +340,323 @@ afterEach(() => { vi.restoreAllMocks(); }); +async function mountPointerWorkbench( + target: 'main' | 'character' | 'all' = 'character', +) { + const projectId = 'pointer-workbench'; + const projectPath = '/tmp/pointer-workbench'; + const tauri = installLayoutTauri({ + projectIdsByPath: { [projectPath]: projectId }, + }); + render( + , + ); + await settleFocusChain(); + const manager = document.querySelector( + '.game-resource-book-manager', + )!; + vi.spyOn(manager, 'getBoundingClientRect').mockReturnValue({ + x: 0, + y: 0, + left: 0, + top: 0, + right: 800, + bottom: 600, + width: 800, + height: 600, + toJSON: () => ({}), + } as DOMRect); + act(() => window.dispatchEvent(new Event('resize'))); + if (target !== 'main') { + fireEvent.click( + screen.getByRole('button', { + name: target === 'all' ? '打开所有资源' : '打开角色与对象', + }), + ); + } + await settleFocusChain(); + const surface = manager.querySelector( + target === 'main' + ? '.game-resource-book-main' + : '.game-resource-book-scene', + )!; + const capture = new Set(); + Object.defineProperties(surface, { + setPointerCapture: { + configurable: true, + value: vi.fn((id: number) => capture.add(id)), + }, + hasPointerCapture: { + configurable: true, + value: (id: number) => capture.has(id), + }, + releasePointerCapture: { + configurable: true, + value: vi.fn((id: number) => capture.delete(id)), + }, + }); + const world = manager.querySelector( + '.game-resource-book-scene-world', + )!; + const viewport = () => + Array.from(world.style.transform.matchAll(/-?\d+(?:\.\d+)?/g), (m) => + Number(m[0]), + ); + return { manager, surface, world, viewport, tauri }; +} + +describe('资源画布指针与运行提示', () => { + it('资源卡左键拖动仍提交手动坐标,不平移视口', async () => { + const { manager, viewport, tauri } = await mountPointerWorkbench(); + const card = manager.querySelector( + '.is-expanded .game-resource-card[data-resource-card-id="asset:pointer-a"]', + )!; + const before = viewport(); + const writes = tauri.layoutWrites.length; + fireEvent.pointerDown(card, { + pointerId: 30, + button: 0, + clientX: 100, + clientY: 100, + }); + fireEvent.pointerMove(card, { + pointerId: 30, + buttons: 1, + clientX: 180, + clientY: 140, + }); + fireEvent.pointerUp(card, { + pointerId: 30, + button: 0, + clientX: 180, + clientY: 140, + }); + await waitFor(() => + expect(tauri.layoutWrites.length).toBeGreaterThan(writes), + ); + expect(tauri.layoutWrites.at(-1)?.positions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + resourceId: 'asset:pointer-a', + manuallyPlaced: true, + }), + ]), + ); + expect(viewport()).toEqual(before); + expect( + document.querySelector('.genarrative-image-canvas__selection-overlay'), + ).toBeNull(); + }); + + it('资源选中不移除运行不可用提示或改变运行能力', async () => { + const { manager } = await mountPointerWorkbench(); + const hint = '首个可运行原型尚未完成,运行视图暂不可用'; + expect(screen.getByText(hint)).not.toBeNull(); + fireEvent.click( + manager.querySelector( + '.is-expanded [data-resource-id="asset:pointer-a"]', + )!, + ); + expect(screen.getByText(hint)).not.toBeNull(); + const run = screen.getByRole('tab', { name: '运行' }); + expect(run.getAttribute('data-unavailable')).toBe('true'); + expect(run.getAttribute('aria-describedby')).toBe('run-unavailable-hint'); + fireEvent.click(run); + expect(run.getAttribute('aria-selected')).toBe('false'); + }); + + it.each(['main', 'character', 'all'] as const)( + '%s 的空白处支持右键平移且不写资源布局', + async (target) => { + const { surface, viewport, tauri } = await mountPointerWorkbench(target); + const before = viewport(); + const writes = tauri.layoutWrites.length; + fireEvent.pointerDown(surface, { + pointerId: 31, + button: 2, + clientX: 100, + clientY: 100, + }); + fireEvent.pointerMove(surface, { + pointerId: 31, + buttons: 2, + clientX: 170, + clientY: 140, + }); + expect(viewport()).toEqual([before[0]! + 70, before[1]! + 40, before[2]]); + expect(fireEvent.contextMenu(surface, { button: 2 })).toBe(false); + fireEvent.pointerUp(surface, { + pointerId: 31, + button: 2, + clientX: 170, + clientY: 140, + }); + expect( + document.querySelector('.genarrative-image-canvas__selection-overlay'), + ).toBeNull(); + expect(tauri.layoutWrites).toHaveLength(writes); + }, + ); + + it('资源卡右键平移保留选中,左键空白拖动仍框选', async () => { + const { manager, surface, viewport, tauri } = await mountPointerWorkbench(); + const card = manager.querySelector( + '.is-expanded [data-resource-id="asset:pointer-a"]', + )!; + fireEvent.click(card); + const before = viewport(); + const writes = tauri.layoutWrites.length; + fireEvent.pointerDown(card, { + pointerId: 32, + button: 2, + clientX: 100, + clientY: 100, + }); + fireEvent.pointerMove(surface, { + pointerId: 32, + buttons: 2, + clientX: 150, + clientY: 160, + }); + fireEvent.pointerUp(surface, { + pointerId: 32, + button: 2, + clientX: 150, + clientY: 160, + }); + expect(viewport()).toEqual([before[0]! + 50, before[1]! + 60, before[2]]); + expect(card.getAttribute('aria-pressed')).toBe('true'); + expect(tauri.layoutWrites).toHaveLength(writes); + const panned = viewport(); + fireEvent.pointerDown(surface, { + pointerId: 33, + button: 0, + clientX: 10, + clientY: 10, + }); + fireEvent.pointerMove(surface, { + pointerId: 33, + buttons: 1, + clientX: 780, + clientY: 580, + }); + expect( + document.querySelector('.genarrative-image-canvas__selection-overlay'), + ).not.toBeNull(); + expect(selectedResourceIdsInDom()).toContain('asset:pointer-a'); + expect(viewport()).toEqual(panned); + fireEvent.pointerUp(surface, { pointerId: 33, button: 0 }); + expect( + document.querySelector('.genarrative-image-canvas__selection-overlay'), + ).toBeNull(); + }); + + it.each(['cancel', 'capture', 'blur'] as const)( + '%s 后右键平移不会继续跟随指针', + async (reason) => { + const { surface, viewport } = await mountPointerWorkbench(); + const before = viewport(); + fireEvent.pointerDown(surface, { + pointerId: 34, + button: 2, + clientX: 100, + clientY: 100, + }); + fireEvent.pointerMove(surface, { + pointerId: 34, + buttons: 2, + clientX: 110, + clientY: 120, + }); + const moved = viewport(); + expect(moved).toEqual([before[0]! + 10, before[1]! + 20, before[2]]); + if (reason === 'cancel') + fireEvent.pointerCancel(surface, { pointerId: 34 }); + else if (reason === 'capture') + fireEvent.lostPointerCapture(surface, { pointerId: 34 }); + else act(() => window.dispatchEvent(new Event('blur'))); + fireEvent.pointerMove(surface, { + pointerId: 34, + clientX: 300, + clientY: 300, + }); + expect(viewport()).toEqual(moved); + }, + ); + + it('总览失焦终止右键平移,子画布切换释放实际捕获节点', async () => { + const { surface, viewport } = await mountPointerWorkbench('main'); + const before = viewport(); + fireEvent.pointerDown(surface, { + pointerId: 36, + button: 2, + clientX: 10, + clientY: 10, + }); + fireEvent.pointerMove(surface, { + pointerId: 36, + buttons: 2, + clientX: 40, + clientY: 40, + }); + const moved = viewport(); + expect(moved).toEqual([before[0]! + 30, before[1]! + 30, before[2]]); + act(() => window.dispatchEvent(new Event('blur'))); + expect(surface.releasePointerCapture).toHaveBeenCalledWith(36); + fireEvent.pointerMove(surface, { + pointerId: 36, + clientX: 100, + clientY: 100, + }); + expect(viewport()).toEqual(moved); + fireEvent.pointerDown(surface, { + pointerId: 37, + button: 2, + clientX: 10, + clientY: 10, + }); + fireEvent.click(screen.getByRole('button', { name: '打开角色与对象' })); + expect(surface.releasePointerCapture).toHaveBeenCalledWith(37); + }); + + it('控件右键不被画布接管,初次打开不整理也能连续双指平移', async () => { + const { manager, surface, viewport } = await mountPointerWorkbench(); + const zoom = screen.getByRole('button', { name: '放大画布' }); + const before = viewport(); + fireEvent.pointerDown(zoom, { + pointerId: 35, + button: 2, + clientX: 100, + clientY: 100, + }); + fireEvent.pointerMove(surface, { + pointerId: 35, + buttons: 2, + clientX: 200, + clientY: 200, + }); + expect(viewport()).toEqual(before); + expect(fireEvent.contextMenu(zoom, { button: 2 })).toBe(true); + await act(async () => { + for (let i = 0; i < 100; i++) { + fireEvent.wheel(manager, { deltaX: 3, deltaY: 6 }); + } + }); + expect(viewport()).toEqual([before[0]! - 300, before[1]! - 600, before[2]]); + }); +}); + describe('资源画布手动重排口径', () => { it('hook:rederiveNow 按 rederive 策略重算自动坐标并写回一次', async () => { const projectId = 'manual-rederive-project'; diff --git a/apps/ai-game-creator-shell/tests/resourceCardPreviewRealManifest.test.ts b/apps/ai-game-creator-shell/tests/resourceCardPreviewRealManifest.test.ts index bd46086ea..127bcc9db 100644 --- a/apps/ai-game-creator-shell/tests/resourceCardPreviewRealManifest.test.ts +++ b/apps/ai-game-creator-shell/tests/resourceCardPreviewRealManifest.test.ts @@ -206,7 +206,7 @@ describe('真机 manifest 取证:占位卡片计数与栏目分布', () => { // `artKind`(其中含 `ui`)而被判成 art,于是角标显示「图片」,而预览调度按 art 走 // 图像分支、又因 mediaType 不是图像而兜底成 placeholder —— 卡片永不发起读取, // 表现为「标着图片却只有占位图标」。类型判定改为 mediaType/扩展名优先、kind 只做 - // 兜底后,它们正确落文档分支,卡面渲染 JSON 文本摘要。 + // 兜底后,它们进入文本读取通道;卡面再消费原生识别结果显示 UI 设计或 JSON。 expect(byPreviewKind).toEqual({ 'raster-image': 52, document: 8, diff --git a/apps/ai-game-creator-shell/tests/resourceDocumentPreviewModel.test.ts b/apps/ai-game-creator-shell/tests/resourceDocumentPreviewModel.test.ts index c89d79e99..00a6bd53e 100644 --- a/apps/ai-game-creator-shell/tests/resourceDocumentPreviewModel.test.ts +++ b/apps/ai-game-creator-shell/tests/resourceDocumentPreviewModel.test.ts @@ -40,19 +40,21 @@ describe('resourceDocumentPreviewMarkdown', () => { ['game/main.ts', 'typescript'], ['game/main.js', 'javascript'], ['game/main.py', 'python'], + ['assets/data.json', 'json'], + ['assets/DESIGN.JSON', 'json'], ])('%s 包为 %s 代码块', (path, language) => { expect( resourceDocumentPreviewMarkdown(resource(path), ' source\n\n\n'), ).toBe(`\`\`\`${language}\n source\n\n\n\`\`\``); }); - it('JSON 规格按文档原文预览,不包成代码块', () => { + it('JSON 规格按原文代码块预览,不把字段值当 Markdown', () => { expect( resourceDocumentPreviewMarkdown( resource('assets/data.json'), - ' source\n\n\n', + '{ "text": "# 不应成为标题" }\n', ), - ).toBe(' source\n\n\n'); + ).toBe('```json\n{ "text": "# 不应成为标题" }\n```'); }); it('正文包含 Markdown 围栏时不会逃出代码块', () => { diff --git a/apps/ai-game-creator-shell/tests/resourceJsonCanvas.test.tsx b/apps/ai-game-creator-shell/tests/resourceJsonCanvas.test.tsx new file mode 100644 index 000000000..7e04d094e --- /dev/null +++ b/apps/ai-game-creator-shell/tests/resourceJsonCanvas.test.tsx @@ -0,0 +1,205 @@ +/** @vitest-environment jsdom */ +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import { + createGameCreationAppManifest, + fireEvent, + installResizeObserverStub, + ProjectDevelopmentView, + React, + render, + screen, + waitFor, + within, +} from './appSurface/harness'; + +vi.mock('@tauri-apps/api/core', async () => ({ + ...(await vi.importActual( + '@tauri-apps/api/core', + )), + invoke: (command: string, args?: Record) => + window.__TAURI__!.core.invoke(command, args), +})); + +const projectId = 'json-canvas'; +const projectPath = '/tmp/json-canvas'; +const emptyState = { + ui_trees: [], + ui_design_images: {}, + sprite_assets: {}, + font_assets: {}, +}; + +async function mountJsonCanvas(kind = 'ui', rejectPreview = false) { + installResizeObserverStub(); + const manifest = createGameCreationAppManifest(projectId, 'JSON 资源测试'); + manifest.assets = [ + { id: 'design', kind, localPath: 'ui/design.json' }, + { id: 'ordinary', kind: 'UI', localPath: 'assets/ordinary.json' }, + { id: 'spoof', kind: 'UI', localPath: 'ui/spoof.json' }, + ].map((asset) => ({ + ...asset, + mediaType: 'application/json', + category: 'document' as const, + source: { kind: 'generated' as const }, + })); + const invoke = vi.fn( + async (command: string, args?: Record) => { + if (command === 'read_local_project_resource_graph') { + const ids = (args?.resources as Array<{ resourceId: string }>).map( + (item) => item.resourceId, + ); + return { + resourceIds: ids, + referenceEdges: [], + taskFlows: [], + producerAssignments: [], + dependencyDepths: ids.map((resourceId) => ({ + resourceId, + dependencyDepth: 0, + })), + connectionIndex: ids.map((resourceId) => ({ + resourceId, + upstreamReferenceResourceIds: [], + downstreamReferenceResourceIds: [], + referenceEdgeIds: [], + taskFlowIds: [], + })), + unresolvedReferenceResourceIds: [], + cyclicResourceIds: [], + cyclicTaskIds: [], + producerMappingTruncated: false, + }; + } + if ( + command === 'read_local_project_resource_canvas_layout' || + command === 'update_local_project_resource_canvas_layout' + ) { + const layout = { + schemaVersion: 'game-creator-resource-layout.v1', + projectId, + mode: args?.mode, + revision: Number(args?.expectedRevision ?? 0) + 1, + positions: args?.positions ?? [], + updatedAt: 1, + }; + return command.startsWith('update_') + ? { status: 'updated', layout } + : layout; + } + if (command === 'read_local_project_text_preview') { + if (rejectPreview) throw new Error('文档读取失败'); + const path = args?.relativePath; + return { + path, + mediaType: 'application/json', + byteLen: 20, + content: + path === 'assets/ordinary.json' + ? '{"text":"# 不应当作标题"}' + : JSON.stringify({ + schemaVersion: 'game-creator-ui-design-state.v1', + state: emptyState, + }), + ...(path === 'ui/design.json' ? { uiDesignAssetId: 'design' } : {}), + }; + } + if (command === 'load_ui_design_state') + return { revision: 0, state: emptyState }; + if ( + command === 'list_pending_local_project_resource_edits' || + command === 'list_local_project_asset_generations' + ) + return []; + throw new Error(`unexpected command ${command}`); + }, + ); + window.__TAURI__ = { core: { invoke } } as unknown as typeof window.__TAURI__; + const onManifestChange = vi.fn(); + render( + 对话
} + onManifestChange={onManifestChange} + />, + ); + fireEvent.click(await screen.findByRole('button', { name: '打开文档' })); + const card = (id: string) => + document.querySelector( + `.game-resource-book-scene-card.is-expanded [data-resource-card-id="asset:${id}"]`, + )!; + await waitFor(() => + expect(card('design')?.getAttribute('data-preview-status')).toBe( + rejectPreview ? 'failed' : 'loaded', + ), + ); + return { card, invoke, onManifestChange }; +} + +afterEach(() => { + delete window.__TAURI__; +}); + +describe('JSON 画布卡片与入口', () => { + it.each(['ui', 'document'])( + '合法 State 的 %s 登记显示 UI 设计,进入现有编辑器且不修改 manifest', + async (kind) => { + const { card, invoke, onManifestChange } = await mountJsonCanvas(kind); + const design = card('design'); + expect(design.getAttribute('data-json-presentation')).toBe('ui-design'); + expect(within(design).getByText('UI 设计')).not.toBeNull(); + expect(within(design).getByText('UI 编辑器')).not.toBeNull(); + expect(design.textContent).not.toContain('schemaVersion'); + fireEvent.click(design.querySelector('button')!); + fireEvent.click(await screen.findByRole('button', { name: 'UI 编辑器' })); + await waitFor(() => + expect(invoke).toHaveBeenCalledWith('load_ui_design_state', { + input: { + projectPath, + expectedProjectId: projectId, + assetId: 'design', + }, + }), + ); + expect(onManifestChange).not.toHaveBeenCalled(); + }, + ); + + it('普通 JSON 和伪 UI 文本保持 JSON 展示,无编辑器入口,详情按代码渲染', async () => { + const { card } = await mountJsonCanvas(); + for (const id of ['ordinary', 'spoof']) { + const element = card(id); + expect(element.getAttribute('data-json-presentation')).toBe('json'); + expect( + element.querySelector('[data-resource-type="JSON"]'), + ).not.toBeNull(); + expect(element.textContent).not.toContain('schemaVersion'); + fireEvent.click(element.querySelector('button')!); + expect(screen.queryByRole('button', { name: 'UI 编辑器' })).toBeNull(); + } + fireEvent.click(card('ordinary').querySelector('button')!); + fireEvent.click(await screen.findByRole('button', { name: '预览' })); + const dialog = await screen.findByRole('dialog', { name: '文档预览' }); + await waitFor(() => + expect(dialog.querySelector('pre code')?.textContent).toContain( + '{"text":"# 不应当作标题"}', + ), + ); + expect( + within(dialog).queryByRole('heading', { name: '不应当作标题' }), + ).toBeNull(); + }); + + it('JSON 读取失败不授予编辑入口,仍可查看明确的读取错误', async () => { + const { card } = await mountJsonCanvas('UI', true); + fireEvent.click(card('design').querySelector('button')!); + expect(screen.queryByRole('button', { name: 'UI 编辑器' })).toBeNull(); + fireEvent.click(screen.getByRole('button', { name: '预览' })); + expect(await screen.findByRole('alert')).not.toBeNull(); + }); +}); diff --git a/apps/ai-game-creator-shell/tests/resourceJsonPresentation.test.ts b/apps/ai-game-creator-shell/tests/resourceJsonPresentation.test.ts new file mode 100644 index 000000000..ecc685ed7 --- /dev/null +++ b/apps/ai-game-creator-shell/tests/resourceJsonPresentation.test.ts @@ -0,0 +1,87 @@ +import { describe, expect, it } from 'vitest'; + +import { + type ProjectResourceCardPreviewState, + projectResourceJsonPresentation, +} from '../src/view/project-development/resourceCardPreviewModel'; +import type { ProjectResource } from '../src/view/project-development/resourceProjectionModel'; + +const resource: ProjectResource = { + id: 'asset:json', + manifestAssetId: 'json', + path: 'ui/design.json', + label: '设计', + mediaType: 'application/json', + subtype: 'UI', + category: 'document', + sourceLabel: '', + taskTitle: null, + producerTaskId: null, + externalResourceId: null, + referenceResourceIds: [], + dependencies: [], + dependencyDepth: 0, +}; +const verified: ProjectResourceCardPreviewState = { + status: 'loaded', + preview: { + path: resource.path, + mediaType: 'application/json', + byteLen: 2, + content: '{}', + uiDesignAssetId: 'json', + }, +}; + +describe('JSON 卡片呈现', () => { + it.each(['UI', 'ui', 'ui-design', 'document'])( + '合法识别不依赖 %s 标签', + (subtype) => { + expect( + projectResourceJsonPresentation({ ...resource, subtype }, verified), + ).toBe('ui-design'); + expect( + projectResourceJsonPresentation( + { ...resource, subtype }, + { + ...verified, + preview: { ...verified.preview, uiDesignAssetId: undefined }, + }, + ), + ).toBe('json'); + }, + ); + it('原生读取未完成、失败或身份不匹配时保持普通 JSON,不推断编辑能力', () => { + for (const preview of [ + null, + { status: 'loading' }, + { status: 'failed', error: '读取失败', retryable: true }, + ] as const) { + expect(projectResourceJsonPresentation(resource, preview)).toBe('json'); + } + expect( + projectResourceJsonPresentation( + { ...resource, manifestAssetId: 'other' }, + verified, + ), + ).toBe('json'); + expect( + projectResourceJsonPresentation( + { ...resource, path: 'other.json' }, + verified, + ), + ).toBe('json'); + expect( + projectResourceJsonPresentation( + { ...resource, manifestAssetId: null }, + verified, + ), + ).toBe('json'); + expect( + projectResourceJsonPresentation( + { ...resource, path: 'image.png', mediaType: 'image/png' }, + verified, + ), + ).toBeNull(); + }); +}); diff --git a/apps/ai-game-creator-shell/tests/useProjectResourceCardPreviews.test.ts b/apps/ai-game-creator-shell/tests/useProjectResourceCardPreviews.test.ts index 6e821454f..01876526e 100644 --- a/apps/ai-game-creator-shell/tests/useProjectResourceCardPreviews.test.ts +++ b/apps/ai-game-creator-shell/tests/useProjectResourceCardPreviews.test.ts @@ -141,6 +141,60 @@ afterEach(() => { }); describe('useProjectResourceCardPreviews', () => { + it('JSON 识别结果经过现有预取缓存保留,换项目后不复用旧编辑能力', async () => { + const json = resource('design', { + path: 'ui/design.json', + subtype: 'ui', + mediaType: 'application/json', + }); + const invoke = vi.fn( + async (_command: string, args?: Record) => ({ + path: json.path, + mediaType: json.mediaType, + byteLen: 2, + content: '{}', + ...(args?.projectPath === '/tmp/first-project' + ? { uiDesignAssetId: 'design' } + : {}), + }), + ); + window.__TAURI__ = { core: { invoke } }; + const resources = [json]; + const canvasRef = { current: document.createElement('div') }; + const { result, rerender } = renderHook( + ({ projectPath }) => + useProjectResourceCardPreviews({ + projectPath, + projectId: projectPath, + mode: 'dependency', + resources, + canvasRef, + eagerPreviewLimit: 12, + }), + { initialProps: { projectPath: '/tmp/first-project' } }, + ); + const identity = () => result.current.identityByResourceId.get(json.id)!; + await waitFor(() => + expect(result.current.previews.get(identity())).toMatchObject({ + status: 'loaded', + preview: { uiDesignAssetId: 'design' }, + }), + ); + rerender({ projectPath: '/tmp/second-project' }); + await waitFor(() => + expect(result.current.previews.get(identity())?.status).toBe('loaded'), + ); + const state = result.current.previews.get(identity()); + expect( + state?.status === 'loaded' && state.preview.uiDesignAssetId, + ).toBeUndefined(); + expect( + invoke.mock.calls.filter( + ([command]) => command === 'read_local_project_text_preview', + ), + ).toHaveLength(2); + }); + it('代码卡不预取正文,显式详情复用文本预览队列与缓存', async () => { const code = resource('code', { path: 'game/main.ts', diff --git a/apps/ai-game-creator-shell/tests/workspaceWindowSync.test.tsx b/apps/ai-game-creator-shell/tests/workspaceWindowSync.test.tsx new file mode 100644 index 000000000..457f61417 --- /dev/null +++ b/apps/ai-game-creator-shell/tests/workspaceWindowSync.test.tsx @@ -0,0 +1,111 @@ +/** @vitest-environment jsdom */ +import type { ReactNode } from 'react'; +import { useCallback } from 'react'; +import { vi } from 'vitest'; + +import { WindowChrome } from '../src/components/WindowChrome'; +import { + useWindowChrome, + type WindowChromeActiveProjectRuns, + WindowChromeContext, +} from '../src/components/windowChromeContext'; +import { WorkspaceLauncherShell } from '../src/features/app-shell/WorkspaceLauncher'; +import { + act, + expect, + it, + React, + render, + testAuthUser, +} from './appSurface/harness'; + +const homeProjectOverride = vi.hoisted(() => ({ + openProject: null as + | null + | ((path: string, mode: 'open' | 'create') => Promise), +})); + +vi.mock('../src/features/app-shell/useHomeProjectCreation', async () => { + const actual = await vi.importActual< + typeof import('../src/features/app-shell/useHomeProjectCreation') + >('../src/features/app-shell/useHomeProjectCreation'); + return { + ...actual, + useHomeProjectCreation( + ...args: Parameters + ) { + const result = actual.useHomeProjectCreation(...args); + return homeProjectOverride.openProject + ? { ...result, openProject: homeProjectOverride.openProject } + : result; + }, + }; +}); + +it('真实窗口与工作台状态同步收敛,回调读取最新处理器且卸载才清理', async () => { + const publications: WindowChromeActiveProjectRuns[] = []; + let cleanups = 0; + // 仍经过真实 WindowChrome 的 setState/Context;上限只防止回归时测试无限循环。 + function BoundedWindowBridge({ children }: { children: ReactNode }) { + const chrome = useWindowChrome(); + const { setActiveProjectRuns } = chrome; + const publish = useCallback( + (next: WindowChromeActiveProjectRuns | null) => { + if (next) publications.push(next); + else cleanups += 1; + if (publications.length < 12) setActiveProjectRuns(next); + }, + [setActiveProjectRuns], + ); + return ( + + {children} + + ); + } + const supervisor = () => null; + const view = (displayName = '测试用户') => ( + + + undefined} + initialView="projects" + ProjectSupervisor={supervisor} + /> + + + ); + delete window.__TAURI__; + const rendered = render(view()); + try { + await act(async () => { + await Promise.resolve(); + }); + // 无原生 invoke 时 active-turn Hook 会把初始快照归一为空数组一次。 + expect(publications).toHaveLength(2); + expect(cleanups).toBe(0); + expect(new Set(publications.map((item) => item.onOpenProject)).size).toBe( + 1, + ); + const openProject = publications[0]!.onOpenProject!; + const latestOpen = vi.fn(async () => undefined); + homeProjectOverride.openProject = latestOpen; + rendered.rerender(view('更改显示名')); + expect(publications).toHaveLength(2); + act(() => openProject('/tmp/window-latest-project')); + expect(latestOpen).toHaveBeenCalledWith( + '/tmp/window-latest-project', + 'open', + ); + expect(publications).toHaveLength(2); + expect(cleanups).toBe(0); + rendered.unmount(); + expect(cleanups).toBe(1); + } finally { + homeProjectOverride.openProject = null; + rendered.unmount(); + } +}); diff --git a/docs/project-memory/plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md b/docs/project-memory/plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md new file mode 100644 index 000000000..d45ed0575 --- /dev/null +++ b/docs/project-memory/plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md @@ -0,0 +1,43 @@ +# AGC 画布交互稳定性修复实施计划 + +- Date: 2026-09-16 +- Status: awaiting-runtime-acceptance +- Milestone: [画布交互稳定性修复](./【里程碑】AGC画布交互稳定性修复-2026-09-16.md) + +## 修改顺序与边界 + +1. 将临时诊断收敛成正式回归测试,覆盖窗口 Context 反馈、提示条件和鼠标/触摸板事件。 +2. 稳定工作台打开项目的转发回调,保持最新处理器语义,不改项目加载逻辑。 +3. 解耦运行提示与选择;在原有画布事件链加入右键平移、菜单边界和中断清理,不另建控制器。 +4. 执行定向验证并检查首次加载、平移和原有框选/卡片拖动回归。 + +## 验证 + +- 定向 Vitest:窗口工作台、画布交互、布局与原有导航用例。 +- AGC `tsc --noEmit`;`npm run check:encoding`、`npm run check:doc-index`、`git diff --check`。 +- 真实客户端首次进入和触摸板操作无法以 jsdom 代替;未实测时保持待验收。 + +## 风险与停止条件 + +窗口反馈测试必须有更新次数上限,避免未修复代码让测试失控。右键仅接管画布背景/卡片,不抢输入控件与浮层。新增问题只有影响本次验收才扩大范围;不根据猜测修改 B01/B02 的布局与动画。 + +回滚仅限本批局部补丁;不重置工作树,不覆盖其它修改。完成自动化验证后停在真实客户端验收,不推进额外功能。 + +## 问题状态 + +| 编号 | 问题 | 状态与证据 | +| --- | --- | --- | +| B01 | 刷新后首次进入画布元素抖动 | 已优化;用户在本轮反馈未再复现,按用户要求更新状态。不宣称所有布局/动画原因均已排除。 | +| B02 | 初次进入双指平移无效,整理后恢复 | 已优化;用户在本轮反馈未再复现,按用户要求更新状态。隔离组件连续平移通过。 | +| B03 | 快速平移触发更新深度错误 | 已修复已确认的窗口 Context 反馈循环,回归验证收敛;真实操作继续观察。 | +| B04 | 资源选中后运行不可用提示消失 | 已修复,提示与选择解耦,自动化验证通过。 | +| B05 | 对话记录偶发丢失 | 已定位历史分页卡点,尚未修改。只读复验用户提供的历史:558 条合法原始记录中有 44 条聊天消息;首屏原始 20 条只投影出一条助手消息,下一页原始 20 条没有聊天消息,按消息计算的游标不推进。已存用户提问和最终回答因此无法继续翻出;不能凭该文件排除其它未落盘记录。 | +| B06 | JSON 文档未正确识别展示 | 已按用户确认完成本地修复:合法 UI State 由原生完整校验,卡片显示 UI 设计并进入现有编辑器;普通 JSON 显示 JSON 并可代码预览。自动化验证通过,待重建原生客户端验收;详见 JSON 语义识别实施计划。 | +| C01 | 右键平移,保留左键框选 | 已实现,卡片左键拖动、框选、指针取消/失焦/捕获丢失及控件边界测试通过。 | + +## 已取得证据与剩余门禁 + +- 修复前新增回归测试能检出外壳重复发布、运行提示消失和右键无效;修复后窗口/画布定向测试通过,现有导航、框选、指针点击/取消、UI 编辑器返回平移和素材定位用例通过。 +- AGC TypeScript、修改文件 ESLint、编码、文档索引及差异空白检查通过。 +- 测试仍有既有 React 列表 key、旧用例 act/IPC 桩告警,未作为本批功能修复扩大范围。 +- 用户反馈 B01/B02 本轮未再复现,记为已优化;右键手感与其它真实客户端细节继续观察。对话历史分页尚未修复;JSON 双路径已本地修复并通过自动化验证,待真实客户端验收。本计划保持开放。 diff --git a/docs/project-memory/plans/【实施计划】AGC资源JSON语义识别-2026-09-16.md b/docs/project-memory/plans/【实施计划】AGC资源JSON语义识别-2026-09-16.md new file mode 100644 index 000000000..5c2947540 --- /dev/null +++ b/docs/project-memory/plans/【实施计划】AGC资源JSON语义识别-2026-09-16.md @@ -0,0 +1,27 @@ +# AGC 资源 JSON 语义识别实施计划 + +- Date: 2026-09-16 +- Status: awaiting-runtime-acceptance +- Milestone: [AGC 资源 JSON 语义识别](./【里程碑】AGC资源JSON语义识别-2026-09-16.md) + +## 实施边界 + +1. 原生 UI 持久化模块抽取可复用的内容解析与只读识别;文本预览返回可选的已验证 UI 资产身份。 +2. 保留新设计初始化的严格 UI 资产门禁;已有 State 的加载/保存/生成按登记资源和真实文档校验,不依赖标签精确大小写。 +3. 前端预览缓存透传识别结果;工作台卡片与编辑器入口消费同一结果,普通 JSON 详情使用代码块。 +4. 单元、组件与原生测试覆盖合法/普通/损坏/跨身份/未登记和保存边界;保持先前画布修复。 + +## 验证与停止条件 + +- 定向 Vitest、Tauri persistence/resource preview 定向 Rust 测试、AGC TypeScript、修改文件 ESLint、编码、文档索引及 `git diff --check`。 +- 不读取或修改用户项目原文件,不将日志或真实对话作为仓库测试夹具。 +- 原生构建/真实客户端受环境限制时记录实际证据,不能以 TS 测试代替原生验证。 +- 完成上述范围后停止;B05 已有分页卡点证据,本轮不顺带修改历史合同。 + +## 验证结果 + +- 92 个前端定向测试通过,覆盖原生结果驱动的卡片/编辑器路由、普通 JSON 代码预览、伪 UI 文本拒绝、读取失败、缓存切项目,以及原有画布导航与指针回归。 +- 14 个 UI 持久化原生测试通过,包含有效 State 对多种登记标签的识别/加载/保存、未知 schema/字段与坏结构拒绝、项目/资产身份、普通 JSON 防覆盖及原有恢复/CAS 边界。 +- 原生测试在 macOS 默认 `/var` 临时路径触发既有拒绝符号链接门禁;改用真实 `/private/tmp` 后通过,未放宽产品路径安全校验。 +- AGC TypeScript、修改文件 ESLint 已通过。测试仍有既有 React key/act 告警及 Rust 未使用代码警告,不影响本批断言。 +- 真实客户端的图片/UI State 体验仍待验收。本次包含 Rust 预览字段,必须重新构建并启动原生端,不能仅刷新前端就认为识别结果已更新。 diff --git a/docs/project-memory/plans/【里程碑】AGC画布交互稳定性修复-2026-09-16.md b/docs/project-memory/plans/【里程碑】AGC画布交互稳定性修复-2026-09-16.md new file mode 100644 index 000000000..de82fa9ef --- /dev/null +++ b/docs/project-memory/plans/【里程碑】AGC画布交互稳定性修复-2026-09-16.md @@ -0,0 +1,26 @@ +# AGC 画布交互稳定性修复 + +- Version: 1 +- Status: reviewed +- Date: 2026-09-16 +- Parent Spec: [AGC 实施计划:资源画布交互与工作台状态同步](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md) + +## 目标与范围 + +完成工作台标题栏状态更新循环、运行提示随选择消失、右键平移三项本地修复,保持左键框选与卡片拖动。不修改布局算法、持久化和后端;不开远程 Issue/PR、不推送。 + +## 评审 + +依据已完成的源码追踪、客户端错误日志及有界复现自检:状态归属仍在窗口与工作台原有边界内;交互修改只影响画布手势;没有数据迁移、权限或 API 变化。用户已确认右键平移及保留左键框选,并授权先尝试本地修复。真实客户端首次进入抖动与触摸板平移仍需另行验收。 + +## 验收 + +1. 工作台发布窗口状态后收敛;重复渲染不持续更新或清理,打开项目回调使用最新处理器,卸载清理有效。 +2. 选中资源后运行不可用提示仍在,运行能力不变。 +3. 子画布空白处及卡片右键平移不改变选择或坐标;左键框选与卡片拖动保留;总览支持右键平移。 +4. 指针取消、失去捕获、窗口失焦终止平移;控件与浮层保留原有交互。 +5. 连续平移测试、定向测试、类型检查、编码与文档门禁完成并记录限制;B01/B02 仅在真实复测后决定关闭。 + +## 依赖 + +当前源码与已安装测试依赖;真实 AGC 客户端验收环境。没有外部写操作依赖。 diff --git a/docs/project-memory/plans/【里程碑】AGC资源JSON语义识别-2026-09-16.md b/docs/project-memory/plans/【里程碑】AGC资源JSON语义识别-2026-09-16.md new file mode 100644 index 000000000..119c04f27 --- /dev/null +++ b/docs/project-memory/plans/【里程碑】AGC资源JSON语义识别-2026-09-16.md @@ -0,0 +1,26 @@ +# AGC 资源 JSON 语义识别 + +- Version: 1 +- Status: reviewed +- Date: 2026-09-16 +- Parent Spec: [AGC 实施计划:文档与代码素材预览](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md) + +## 目标与边界 + +按用户确认同时支持普通 JSON 与 UI 设计 JSON:前者显示 JSON 并可代码预览,后者显示 UI 设计并进入原有编辑器。原生侧复用现有文档校验,前端不推断正式状态。不修改 manifest 分类,不迁移用户文件,不改历史分页,不做远程写入。 + +## 评审 + +已核对原生受控文本预览、UI State 持久化合同和工作台卡片/编辑器路由。复用完整读取结果识别,未知 schema/坏结构/身份不符均不授予编辑入口;已有 UI 资产的大小写标签不应阻断真实合法 State。新增可选预览字段只承载原生识别结果;不引入新的状态文件或平行编辑器。 + +## 验收标准 + +1. 普通 JSON 显示 JSON,不渲染卡面原文,不出现 UI 编辑器入口,显式预览为 JSON 代码块。 +2. 完整合法且身份匹配的 UI State 显示 UI 设计并进入现有编辑器;大小写标签或文档标签不影响内容识别。 +3. 损坏 JSON、伪 schema、未知字段、坏 State、跨项目/资产、未登记文件不能获得 UI 编辑入口;原文查看或读取错误仍可见。 +4. 识别不产生写入;普通 JSON 不能通过编辑器保存或初始化被覆盖。有效已有设计仍支持原有 CAS 保存。 +5. 预览缓存能传递原生结果并随资源身份失效;原有卡片、框选/平移和图片预览回归通过。 + +## 依赖 + +本地前端与 Tauri 源码、现有测试依赖;真实客户端体验单独验收。 diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index e8d132d9f..41361097c 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -1,5 +1,13 @@ # 踩坑与排障记录 +## JSON 卡片显示与 UI 编辑能力必须同源 + +JSON 的文本读取分支不等于卡面应该展示原始 State 摘要。卡片、缩略图及编辑器入口共同消费受控文本预览的 `uiDesignAssetId`;只有原生复用 UI 持久化合同校验 schema、完整 State 和项目/资产身份后才设置它。普通 JSON 保留 JSON 代码预览,不按 `kind: UI/ui` 或 schema 字符串片段猜测编辑能力。已有合法 UI State 的加载/保存不依赖 kind 精确大小写,但新建初始化仍保留正式 UI 资产门禁;缓存与项目切换须保留现有身份隔离。 + +## 窗口 Context 发布不得依赖每次渲染新建的业务回调 + +工作台向窗口标题栏发布运行项目时,若 effect 依赖普通函数派生的回调,发布 Context 会重新渲染工作台,进而再次发布并清理,形成更新深度循环。转发入口须稳定,并在提交阶段更新实际处理器引用;发布数据变化与卸载清理分开。回归测试必须组合真实窗口 Provider 和工作台消费者,只有独立画布测试无法覆盖这条反馈链;回归时用有界发布次数阻止测试失控。画布快速操作时暴露的更新深度错误,也须检查外层状态同步,不能直接归因于滚轮频率。 + ## Windows 已登记生图资产未刷新 Direct 工具桥会 canonicalize 项目根,事件中的路径可能带 `\\?\` / `\\?\UNC\`,而前端项目路径仍是普通盘符或 UNC。失效监听不能直接比较原始字符串;识别为同一项目后,用当前项目路径重读 manifest,保留项目切换与 revision 门禁。普通 `agc_generate_image` 成功提交也必须发出失效通知,不能依赖整轮 Agent 结束。回归需覆盖两种 Windows 前缀、其它项目事件拒收,以及 Agent 尚未结束和后续失败时已登记图片卡片仍可见。 diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index e861ab2f6..84214f5d2 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -1,5 +1,14 @@ # AI 游戏创作智能体 App 实施计划 +## 资源画布交互与工作台状态同步 + +- 工作台向窗口标题栏发布正在运行的项目时,输入未变化不得形成重复发布与清理的渲染循环;打开项目动作始终使用当前工作台处理逻辑,退出工作台后清除其标题栏状态。 +- 资源子画布(含「所有资源」)保留空白处左键框选、资源卡左键选中/拖动、触摸板双指平移及捏合缩放;右键按住空白处或资源卡拖动时平移画布,不改变资源选择与布局。中键和空格抓手继续可用。总览保留既有左键平移,并支持右键平移。 +- 画布接管的右键手势不弹出原生菜单;输入框、媒体操作、工具条和独立浮层不被画布抢占。指针取消、捕获丢失或窗口失焦后终止平移,不能继续跟随指针。 +- 运行不可用提示只取决于运行能力与 UI 编辑器状态,不因资源选中、取消选中或框选而消失,且不改变运行入口的真实可用性。 +- 本次边界不包含布局算法、持久化坐标、预览读取预算或后端契约调整。首次进入抖动与平移异常须在更新循环消除后单独实测,不能仅凭状态循环修复宣称已解决。 +- 验收包含真实窗口 Context 与工作台的状态同步回归、运行提示与选中并存、左右键分流、平移中断及连续滚轮事件;真实客户端首次进入与触摸板手感为独立人工验收项。 + ## 资源卡选中工具栏与导出 - 共享选中工具栏按实际显示的快速编辑、编辑动作、改造、导出与宿主动作组生成分隔线;空组不产生分隔线,不依赖宿主 CSS 隐藏重复线。 @@ -8,6 +17,10 @@ ## 文档与代码素材预览 +- JSON 资源的卡片按内容语义分流:普通 JSON 显示 JSON 图标/标签,详情按 JSON 代码块显示;UI 设计 JSON 显示 UI 设计标识并提供现有 UI 编辑器入口,不再把 State 原文铺在卡面上。功能分类、manifest kind 和资产身份不因识别而改写。 +- UI 识别由原生文本预览在已登记、受控、完整读取的同一份 UTF-8 内容上完成,复用编辑器的 `game-creator-ui-design-state.v1` 契约解析、canonical 校验、revision/State 校验及项目/资产身份校验。前端只消费识别结果,不按文件名、kind 大小写或正文片段自行认定 UI;普通、损坏、未知 schema、跨项目或跨资产 JSON 不获得 UI 编辑能力。 +- JSON 为完成内容识别继续走现有受限预取队列、并发/容量和 2 MiB 原生文本读取上限。识别失败不写文件、不生成空 State、不做格式迁移;能读取的原文仍可按 JSON 查看,读取失败仍展示原有错误。非 JSON 代码卡继续仅按用户详情请求读取。 +- 编辑器加载/保存/代码生成复核当前项目的已登记 JSON 资产及完整文档,不以 kind 必须精确等于 `UI` 阻断合法已有设计;创建新 UI 状态仍要求正式 UI 资源,不能借普通 JSON 预览初始化或覆盖文件。现有 State 保存锁、CAS、revision 与恢复边界不变。 - 文档与代码素材选中工具栏提供「预览」,打开独立、可滚动的只读弹窗;关闭、切换素材或项目后不残留旧内容。加载中、空文件与读取失败分别呈现,允许重试可重试的错误。 - 复用资源预览队列、身份缓存、项目 scope、失效与权限校验,继续调用 `read_local_project_text_preview`。代码卡不做可见性预取,仅用户显式打开详情时读取;不新增 IPC,不扩大可读取文件范围,不增加编辑/保存能力。 - 文档正文统一使用现有 Markdown 渲染器;代码文件以按扩展名标注语言的 Markdown 围栏代码块呈现。围栏必须长于正文内的反引号串,正文空行与缩进保持原样,不把源码当 Markdown 正文或 HTML 执行。 From 1b010fb1f89f7470a0fa99c8ac7dbe5e500077f7 Mon Sep 17 00:00:00 2001 From: suzmii Date: Wed, 16 Sep 2026 18:46:47 +0800 Subject: [PATCH 03/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8DDirectProject=E5=AF=B9?= =?UTF-8?q?=E8=AF=9D=E5=8E=86=E5=8F=B2=E5=88=86=E9=A1=B5=E5=8D=A1=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 聊天历史按有效消息分页并返回原生游标,保留默认原始切片接口 工具和推理记录不占聊天页名额,逐行过滤避免传回大段工具输出 隔离重新加载和项目切换的迟到响应,补齐单飞、重试与消息去重 补充原生和真实App回归测试,增加人工只读日志重放入口 更新B05状态、规范与PR验收记录,不提交用户原始日志 --- .../src/agent/direct_project_history.rs | 236 +++++++++++++++++- .../src/agent/direct_thread_manager.rs | 1 + .../src-tauri/src/commands.rs | 20 +- apps/ai-game-creator-shell/src/App.tsx | 72 ++++-- .../project-workspace/directThreadEvents.ts | 51 +++- .../tests/appSurface/home.suite.ts | 4 +- .../appSurface/project-development.suite.ts | 1 + .../tests/directHistoryPagination.test.tsx | 232 +++++++++++++++++ .../tests/directThreadEvents.test.ts | 49 ++++ ...实施计划】AGC对话历史分页恢复-2026-09-16.md | 25 ++ ...施计划】AGC画布交互稳定性修复-2026-09-16.md | 4 +- ...里程碑】AGC对话历史分页恢复-2026-09-16.md | 19 ++ docs/project-memory/shared-memory/pitfalls.md | 4 + ...案】AI游戏创作智能体App实施计划-2026-06-24.md | 3 + 14 files changed, 685 insertions(+), 36 deletions(-) create mode 100644 apps/ai-game-creator-shell/tests/directHistoryPagination.test.tsx create mode 100644 docs/project-memory/plans/【实施计划】AGC对话历史分页恢复-2026-09-16.md create mode 100644 docs/project-memory/plans/【里程碑】AGC对话历史分页恢复-2026-09-16.md diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_project_history.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_project_history.rs index 130c01549..ed9e5e576 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_project_history.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_project_history.rs @@ -482,9 +482,38 @@ pub(crate) fn read_direct_project_history_items_at(root: &Path) -> Result Result, String> { + read_direct_project_history_entries_filtered_at(root, None, false) +} + +fn is_direct_project_chat_message(item: &Value) -> bool { + matches!( + item.get("role").and_then(Value::as_str), + Some("user" | "assistant") + ) && item + .get("content") + .and_then(Value::as_array) + .is_some_and(|parts| { + parts.iter().any(|part| { + part.get("text") + .and_then(Value::as_str) + .is_some_and(|text| !text.is_empty()) + }) + }) +} + +/// 消息模式逐行丢弃工具输出,只保留聊天正文,避免 40 MiB 工具日志被整表积累或发给 UI。 +fn read_direct_project_history_entries_filtered_at( + root: &Path, + before_item_id: Option<&str>, + messages_only: bool, +) -> Result, String> { let path = history_path(root); if !prepare_game_creator_private_path_for_read(&path, false, "DirectProject 历史")? { - return Ok(Vec::new()); + return if before_item_id.is_some() { + Err("DirectProject 历史游标对应的文件已不存在".to_string()) + } else { + Ok(Vec::new()) + }; } let file = File::open(&path) .map_err(|error| format!("打开 DirectProject 历史失败:{}: {error}", path.display()))?; @@ -519,6 +548,12 @@ fn read_direct_project_history_entries_at(root: &Path) -> Result Result Err(format!("DirectProject 历史中不存在 item:{item_id}")), + None => Ok(items), + } +} + +pub(crate) fn read_direct_project_chat_items_slice_at( + root: &Path, + before_item_id: Option<&str>, + limit: usize, +) -> Result<(Vec, bool, BTreeMap), String> { + let entries = read_direct_project_history_entries_filtered_at(root, before_item_id, true)?; + let mut start = entries.len().saturating_sub(limit.clamp(1, 200)); + // 旧消息可能没有 ID:保留原文,并向前扩到可寻址的已有 ID,不能制造原始消息身份。 + while start > 0 + && entries[start] + .0 + .get("id") + .and_then(Value::as_str) + .is_none_or(str::is_empty) + { + start -= 1; + } + let timestamps = entries[start..] + .iter() + .filter_map(|(item, at)| { + let id = item.get("id").and_then(Value::as_str)?; + (*at > 0).then(|| (id.to_string(), *at)) + }) + .collect(); + Ok(( + entries + .into_iter() + .skip(start) + .map(|(item, _)| item) + .collect(), + start > 0, + timestamps, + )) } pub(crate) fn read_direct_project_history_items_slice_at( @@ -640,6 +713,165 @@ mod tests { const RESPONSE_ITEM_ROW: &str = r#"{"type":"response_item","payload":{"type":"message","role":"user","id":"codex-item-2","content":[{"type":"input_text","text":"再加一个按钮"}]}}"#; const RESPONSE_ASSISTANT_ROW: &str = r#"{"type":"response_item","payload":{"type":"message","role":"assistant","content":[{"type":"output_text","text":"已完成"}]}}"#; + fn write_items(root: &std::path::Path, items: &[Value]) { + let lines = items + .iter() + .enumerate() + .map(|(index, item)| { + json!({"type": "response_item", "payload": item, "recordedAt": 1000 + index}) + .to_string() + }) + .collect::>(); + write_history_lines(root, &lines.iter().map(String::as_str).collect::>()); + } + + #[test] + fn chat_pages_skip_tool_only_tail_and_gaps_without_losing_messages_or_times() { + let root = init_history_project("message-pages"); + let mut raw = Vec::new(); + let mut expected = Vec::new(); + for n in 0..44 { + let item = json!({ + "id": format!("message-{n}"), "type": "message", + "role": if n == 0 || n == 38 { "user" } else { "assistant" }, + "content": [{"type": "output_text", "text": format!("消息 {n}")}], + }); + expected.push(item.clone()); + raw.push(item); + for tool in 0..25 { + raw.push(json!({ + "id": format!("tool-{n}-{tool}"), "type": "function_call_output", + "output": "工具结果不应占聊天页名额", + })); + } + } + write_items(root.path(), &raw); + let path = history_path(root.path()); + let before = std::fs::read(&path).unwrap(); + let (old_page, _, _) = + super::read_direct_project_history_items_slice_at(root.path(), None, 20).unwrap(); + assert!(old_page + .iter() + .all(|item| item["type"] == "function_call_output")); + let mut cursor = None; + let mut all = Vec::new(); + let mut sizes = Vec::new(); + loop { + let (mut page, more, timestamps) = + super::read_direct_project_chat_items_slice_at(root.path(), cursor.as_deref(), 20) + .unwrap(); + sizes.push(page.len()); + for item in &page { + let index = raw.iter().position(|raw| raw["id"] == item["id"]).unwrap(); + assert_eq!( + timestamps[item["id"].as_str().unwrap()], + 1000 + index as u64 + ); + } + let next = page + .first() + .and_then(|item| item["id"].as_str()) + .map(str::to_string); + page.append(&mut all); + all = page; + if !more { + break; + } + assert_ne!(next, cursor); + cursor = next; + assert!(sizes.len() < 10); + } + assert_eq!(sizes, vec![20, 20, 4]); + assert_eq!(all, expected); + assert_eq!(std::fs::read(&path).unwrap(), before); + } + + #[test] + fn chat_pages_handle_empty_content_internal_context_and_missing_ids() { + let root = init_history_project("message-page-boundary"); + write_items( + root.path(), + &[ + json!({"id":"u", "role":"user", "content":[{"text":"第一条"}]}), + json!({"role":"assistant", "content":[{"text":"无ID的旧消息"}]}), + json!({"id":"a", "role":"assistant", "content":[{"text":"最后一条"}]}), + json!({"id":"empty", "role":"assistant", "content":[{"text":""}]}), + json!({"id":"internal", "role":"user", "content":[{"text":"内部"}]}), + json!({"id":"reason", "type":"reasoning", "content":[{"text":"推理"}]}), + ], + ); + let (page, more, _) = + super::read_direct_project_chat_items_slice_at(root.path(), None, 1).unwrap(); + assert_eq!(page[0]["id"], "a"); + assert!(more); + let (page, more, _) = + super::read_direct_project_chat_items_slice_at(root.path(), Some("a"), 1).unwrap(); + assert_eq!(page.len(), 2); + assert_eq!(page[0]["id"], "u"); + assert!(page[1].get("id").is_none()); + assert!(!more); + assert!( + super::read_direct_project_chat_items_slice_at(root.path(), Some("missing"), 20) + .is_err() + ); + write_items( + root.path(), + &[json!({"id":"tool", "type":"function_call", "arguments":"{}"})], + ); + let (page, more, _) = + super::read_direct_project_chat_items_slice_at(root.path(), None, 20).unwrap(); + assert!(page.is_empty()); + assert!(!more); + } + + #[test] + #[ignore = "人工只读诊断:通过 AGC_HISTORY_REPLAY_SOURCE 提供原始历史文件"] + fn replay_external_chat_history_pages_without_mutating_source() { + let source = std::env::var_os("AGC_HISTORY_REPLAY_SOURCE").expect("provide replay source"); + let before = std::fs::read(&source).expect("read source"); + let root = init_history_project("external-history-replay"); + let path = history_path(root.path()); + std::fs::create_dir_all(path.parent().unwrap()).unwrap(); + std::fs::write(&path, &before).unwrap(); + let expected = + super::read_direct_project_history_entries_filtered_at(root.path(), None, true) + .expect("read messages"); + let mut cursor = None; + let mut all = Vec::new(); + let mut pages = 0; + loop { + let (mut items, more, _) = + super::read_direct_project_chat_items_slice_at(root.path(), cursor.as_deref(), 20) + .expect("read page"); + let next = items + .first() + .and_then(|item| item["id"].as_str()) + .map(str::to_string); + items.append(&mut all); + all = items; + pages += 1; + if !more { + break; + } + assert!(next.is_some() && next != cursor, "cursor must advance"); + assert!(pages <= expected.len() + 1, "pagination must terminate"); + cursor = next; + } + assert!( + all.iter().eq(expected.iter().map(|(item, _)| item)), + "message order and content must match" + ); + assert!( + std::fs::read(&source).unwrap() == before, + "source must remain unchanged" + ); + eprintln!( + "history replay: messages={}, pages={pages}, users={}", + all.len(), + all.iter().filter(|item| item["role"] == "user").count() + ); + } + #[test] fn history_timestamps_survive_reload_and_idempotent_append_without_changing_raw_items() { let root = init_history_project("history-time"); diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_thread_manager.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_thread_manager.rs index e3bc497ea..1bec45d0a 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_thread_manager.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_thread_manager.rs @@ -59,6 +59,7 @@ pub(crate) struct DirectThreadHistorySlice { pub(crate) items: Vec, pub(crate) has_more: bool, pub(crate) item_timestamps: std::collections::BTreeMap, + pub(crate) oldest_item_id: Option, } #[derive(Clone, Debug)] diff --git a/apps/ai-game-creator-shell/src-tauri/src/commands.rs b/apps/ai-game-creator-shell/src-tauri/src/commands.rs index 12650f798..54ce0c7be 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/commands.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/commands.rs @@ -5404,19 +5404,29 @@ pub(crate) async fn read_direct_project_history_slice( project_path: String, before_item_id: Option, limit: Option, + messages_only: Option, ) -> Result { tauri::async_runtime::spawn_blocking(move || { let root = Path::new(project_path.trim()); enforce_project_permission_policy(root, "conversation.read")?; - let (items, has_more, item_timestamps) = read_direct_project_history_items_slice_at( - root, - before_item_id.as_deref(), - limit.unwrap_or(20), - )?; + let read_slice = if messages_only.unwrap_or(false) { + read_direct_project_chat_items_slice_at + } else { + read_direct_project_history_items_slice_at + }; + let (items, has_more, item_timestamps) = + read_slice(root, before_item_id.as_deref(), limit.unwrap_or(20))?; + let oldest_item_id = items + .first() + .and_then(|item| item.get("id")) + .and_then(serde_json::Value::as_str) + .filter(|id| !id.is_empty()) + .map(str::to_string); Ok(DirectThreadHistorySlice { items, has_more, item_timestamps, + oldest_item_id, }) }) .await diff --git a/apps/ai-game-creator-shell/src/App.tsx b/apps/ai-game-creator-shell/src/App.tsx index 9523363ac..ac1ae9a8b 100644 --- a/apps/ai-game-creator-shell/src/App.tsx +++ b/apps/ai-game-creator-shell/src/App.tsx @@ -239,10 +239,11 @@ import { DeveloperProjectPanels } from './features/project-workspace/DeveloperPr import { DeveloperRuntimePanels } from './features/project-workspace/DeveloperRuntimePanels'; import { type DirectThreadConsumeResult, - directThreadHistoryItemsToMessages, + directThreadHistoryPage, type DirectThreadHistorySlice, type DirectThreadSubscriptionBootstrap, isDirectTurnInProgress, + prependDirectHistoryMessages, } from './features/project-workspace/directThreadEvents'; import { normalizeDirectTimestamp } from './features/project-workspace/directTurnPresentation'; import type { DirectCodexUserContentPart } from './features/project-workspace/generated'; @@ -1958,7 +1959,7 @@ export function App({ ); const [directHistoryHasMore, setDirectHistoryHasMore] = useState(false); const directHistoryOldestItemIdRef = useRef(null); - const directHistoryLoadingRef = useRef(false); + const directHistoryLoadingRef = useRef(null); const [pendingCommand, setPendingCommand] = useState( null, ); @@ -2151,6 +2152,7 @@ export function App({ function resetProjectSupervisorState() { projectSupervisorHistoryLoadVersionRef.current += 1; + directHistoryLoadingRef.current = null; projectSupervisorRuntimeResumeProjectPathRef.current = null; projectSupervisorSessionIdRef.current = null; projectSupervisorRuntimeRef.current = null; @@ -4009,6 +4011,8 @@ export function App({ } const loadVersion = projectSupervisorHistoryLoadVersionRef.current + 1; projectSupervisorHistoryLoadVersionRef.current = loadVersion; + if (directCodexProductRuntime) + directHistoryLoadingRef.current = loadVersion; try { // V2 projects do not have a Supervisor run or legacy conversation. Probe the // V2 authority first; a missing V2 session returns null and preserves the @@ -4105,6 +4109,7 @@ export function App({ : await readProjectSupervisorActiveSession(invoke, nextProjectPath); let runtimeError = ''; let loadedDirectHistoryHasMore = false; + let loadedDirectHistoryCursor: string | null = null; const projectConversation = directCodexProductRuntime ? (() => { return invoke( @@ -4112,16 +4117,16 @@ export function App({ { projectPath: nextProjectPath, limit: CONVERSATION_INITIAL_VISIBLE_COUNT, + messagesOnly: true, }, ).then((slice) => { - loadedDirectHistoryHasMore = slice.hasMore; + const page = directThreadHistoryPage(slice); + loadedDirectHistoryHasMore = page.hasMore; + loadedDirectHistoryCursor = page.cursor; return { path: nextProjectPath, agentId: null, - messages: directThreadHistoryItemsToMessages( - slice.items, - slice.itemTimestamps, - ), + messages: page.messages, } satisfies LocalConversationResult; }); })() @@ -4218,9 +4223,7 @@ export function App({ setProjectSupervisorRuntimeError(runtimeError || resumeError); if (directCodexProductRuntime) { setDirectHistoryHasMore(loadedDirectHistoryHasMore); - directHistoryOldestItemIdRef.current = - conversationMessages.find((message) => message.messageId) - ?.messageId ?? null; + directHistoryOldestItemIdRef.current = loadedDirectHistoryCursor; } setMessages((current) => { // replace 分支同样不能丢掉尚未落盘的运行时消息(初始需求)。 @@ -4281,6 +4284,10 @@ export function App({ : workspaceStatus, ); // Keep the default greeting when history is missing or blocked. + } finally { + if (directHistoryLoadingRef.current === loadVersion) { + directHistoryLoadingRef.current = null; + } } } @@ -4396,6 +4403,9 @@ export function App({ setAgentRunHistoryFiles([]); setAgentRuntimeById({}); setMessages(conversationMessages); + // 只有新项目确实打开后才丢弃旧分页位置;打开失败时旧会话仍可继续翻页。 + directHistoryOldestItemIdRef.current = null; + setDirectHistoryHasMore(false); setConversationVisibleCount(CONVERSATION_INITIAL_VISIBLE_COUNT); savedConversationProjectPathRef.current = openedProject.projectPath; savedConversationCountRef.current = conversationMessages.length; @@ -12480,27 +12490,38 @@ export function App({ : null; async function showEarlierConversationMessages() { + if (hiddenConversationCount > 0) { + setConversationVisibleCount((current) => + Math.min(messages.length, current + CONVERSATION_VISIBLE_STEP), + ); + return; + } if (directCodexProductRuntime && directHistoryHasMore) { const invoke = resolveTauriInvoke(); const projectPath = localProject?.projectPath; - if (invoke && projectPath && !directHistoryLoadingRef.current) { - directHistoryLoadingRef.current = true; + if (invoke && projectPath && directHistoryLoadingRef.current === null) { + const loadVersion = projectSupervisorHistoryLoadVersionRef.current; + const beforeItemId = directHistoryOldestItemIdRef.current; + directHistoryLoadingRef.current = loadVersion; + const isCurrentLoad = () => + manifestRefreshMountedRef.current && + localProjectPathRef.current === projectPath && + projectSupervisorHistoryLoadVersionRef.current === loadVersion; try { const slice = await invoke( 'read_direct_project_history_slice', { projectPath, - beforeItemId: directHistoryOldestItemIdRef.current, + beforeItemId, limit: CONVERSATION_VISIBLE_STEP, + messagesOnly: true, }, ); - if (localProjectPathRef.current !== projectPath) { + if (!isCurrentLoad()) { return; } - const older = directThreadHistoryItemsToMessages( - slice.items, - slice.itemTimestamps, - ).map((message) => ({ + const page = directThreadHistoryPage(slice, beforeItemId); + const older = page.messages.map((message) => ({ role: message.role === 'user' ? ('user' as const) @@ -12510,18 +12531,21 @@ export function App({ messageId: message.messageId, updatedAt: message.updatedAt, })); - setMessages((current) => [...older, ...current]); + setMessages((current) => + prependDirectHistoryMessages(current, older), + ); setConversationVisibleCount((current) => current + older.length); - setDirectHistoryHasMore(slice.hasMore); - directHistoryOldestItemIdRef.current = - older.find((message) => message.messageId)?.messageId ?? - directHistoryOldestItemIdRef.current; + setDirectHistoryHasMore(page.hasMore); + directHistoryOldestItemIdRef.current = page.cursor; } catch (error) { + if (!isCurrentLoad()) return; setWorkspaceStatus( `读取更早的对话历史失败:${error instanceof Error ? error.message : String(error)}`, ); } finally { - directHistoryLoadingRef.current = false; + if (directHistoryLoadingRef.current === loadVersion) { + directHistoryLoadingRef.current = null; + } } } return; diff --git a/apps/ai-game-creator-shell/src/features/project-workspace/directThreadEvents.ts b/apps/ai-game-creator-shell/src/features/project-workspace/directThreadEvents.ts index 6c1cad229..32180fcff 100644 --- a/apps/ai-game-creator-shell/src/features/project-workspace/directThreadEvents.ts +++ b/apps/ai-game-creator-shell/src/features/project-workspace/directThreadEvents.ts @@ -1,4 +1,7 @@ -import type { LocalConversationMessageRecord } from '../../app/types'; +import type { + ChatMessage, + LocalConversationMessageRecord, +} from '../../app/types'; export type DirectThreadRawEvent = { seq: number; @@ -22,8 +25,54 @@ export type DirectThreadHistorySlice = { items: unknown[]; hasMore: boolean; itemTimestamps?: Record; + oldestItemId?: string | null; }; +/** 游标取原始响应,而非过滤后的聊天消息;拒绝不能前进的页,避免静默反复回读。 */ +export function directThreadHistoryPage( + slice: DirectThreadHistorySlice, + previousCursor: string | null = null, +) { + const first = slice.items[0]; + const firstId = + first && typeof first === 'object' && 'id' in first + ? (first as { id?: unknown }).id + : null; + const cursor = + slice.oldestItemId ?? + (typeof firstId === 'string' && firstId ? firstId : null); + if (slice.hasMore && (!cursor || cursor === previousCursor)) { + throw new Error('对话历史分页游标未前进,请重新读取项目历史'); + } + return { + messages: directThreadHistoryItemsToMessages( + slice.items, + slice.itemTimestamps, + ), + hasMore: slice.hasMore, + cursor, + }; +} + +/** 保留当前实时/已显示版本;原始身份相同的回读消息不能插入第二次。 */ +export function prependDirectHistoryMessages( + current: readonly ChatMessage[], + older: readonly ChatMessage[], +): ChatMessage[] { + const ids = new Set( + current.flatMap((message) => + message.messageId ? [message.messageId] : [], + ), + ); + const additions = older.filter((message) => { + if (!message.messageId) return true; + if (ids.has(message.messageId)) return false; + ids.add(message.messageId); + return true; + }); + return [...additions, ...current]; +} + export function directThreadHistoryItemsToMessages( items: unknown[], itemTimestamps: Readonly> = {}, diff --git a/apps/ai-game-creator-shell/tests/appSurface/home.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/home.suite.ts index 01e5f217d..a1ab75aad 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/home.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/home.suite.ts @@ -2450,7 +2450,7 @@ export function registerHomeProjectCreationTests() { }; } if (command === 'read_direct_project_history_slice') { - expect(args).toEqual({ projectPath, limit: 20 }); + expect(args).toEqual({ projectPath, limit: 20, messagesOnly: true }); return { items: [...persistedMessages], hasMore: false }; } if (command === 'append_local_conversation_message') { @@ -2536,7 +2536,7 @@ export function registerHomeProjectCreationTests() { return manifest; } if (command === 'read_direct_project_history_slice') { - expect(args).toEqual({ projectPath, limit: 20 }); + expect(args).toEqual({ projectPath, limit: 20, messagesOnly: true }); return { items: [...persistedMessages], hasMore: false }; } if (command === 'append_local_permission_log') { diff --git a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts index f041845b6..21ec594a1 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts @@ -9133,6 +9133,7 @@ export function registerProjectSupervisorSurfaceTests() { expect(invoke).toHaveBeenCalledWith('read_direct_project_history_slice', { projectPath, limit: 20, + messagesOnly: true, }), ); // 默认任务占位行也不能触发专业 Agent 历史的批量读取。 diff --git a/apps/ai-game-creator-shell/tests/directHistoryPagination.test.tsx b/apps/ai-game-creator-shell/tests/directHistoryPagination.test.tsx new file mode 100644 index 000000000..9b7b410a0 --- /dev/null +++ b/apps/ai-game-creator-shell/tests/directHistoryPagination.test.tsx @@ -0,0 +1,232 @@ +/** @vitest-environment jsdom */ +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import type { DirectThreadHistorySlice } from '../src/features/project-workspace/directThreadEvents'; +import { + act, + App, + createGameCreationAppManifest, + fireEvent, + React, + render, + screen, + setComposerText, +} from './appSurface/harness'; + +const projectPath = '/tmp/direct-message-pages'; +const manifest = createGameCreationAppManifest( + 'direct-message-pages', + '历史分页', +); +const messages = Array.from({ length: 26 }, (_, index) => ({ + id: `direct-codex:turn-${Math.floor(index / 2)}:${index % 2 ? 'assistant' : 'user'}`, + type: 'message', + role: index % 2 ? 'assistant' : 'user', + content: [ + { + type: index % 2 ? 'output_text' : 'input_text', + text: `历史正文 ${index}`, + }, + ], +})); +function page( + items: typeof messages, + hasMore: boolean, +): DirectThreadHistorySlice { + return { items, hasMore, oldestItemId: items[0]?.id ?? null }; +} +function deferred() { + let resolve!: (value: DirectThreadHistorySlice) => void; + let reject!: (error: Error) => void; + const promise = new Promise((yes, no) => { + resolve = yes; + reject = no; + }); + return { promise, resolve, reject }; +} +function install( + read: ( + args: Record, + ) => DirectThreadHistorySlice | Promise, +) { + const invoke = vi.fn( + async (command: string, args?: Record) => { + if (command === 'read_direct_project_history_slice') { + expect(args?.messagesOnly).toBe(true); + return read(args!); + } + if (command === 'read_project_permission_policy') + return { + path: '.agent/policy.json', + policy: { deniedCommands: [], confirmCommands: [] }, + }; + if (command === 'get_local_game_manifest') return manifest; + if (command === 'read_game_creator_app_config') + return { + config: { + selectedModelId: 'quality', + selectedModelIsDefault: true, + llm: { customEnabled: false }, + }, + }; + if ( + command === 'read_direct_tool_calls' || + command === 'read_direct_turn_stream' || + command === 'list_game_creator_direct_active_turns' + ) + return []; + return null; + }, + ); + window.__TAURI__ = { core: { invoke } } as unknown as typeof window.__TAURI__; + return invoke; +} +function mount(path = projectPath) { + return render( + , + ); +} +const earlier = () => screen.getByRole('button', { name: /显示更早/ }); +afterEach(() => { + delete window.__TAURI__; +}); + +describe('Direct 聊天历史分页集成', () => { + it('首屏按消息加载20条,更早消息使用原生游标,原始工具记录不占页', async () => { + const invoke = install((args) => + args.beforeItemId + ? page(messages.slice(0, 6), false) + : page(messages.slice(6), true), + ); + mount(); + await screen.findByText('历史正文 25'); + expect(screen.queryByText('历史正文 0')).toBeNull(); + fireEvent.click(earlier()); + await screen.findByText('历史正文 0'); + expect(screen.queryByRole('button', { name: /显示更早/ })).toBeNull(); + expect(invoke).toHaveBeenCalledWith('read_direct_project_history_slice', { + projectPath, + beforeItemId: messages[6]!.id, + limit: 20, + messagesOnly: true, + }); + }); + + it('重复点击单飞,失败保留游标可重试,重叠消息不重复', async () => { + const pending = deferred(); + let attempts = 0; + const invoke = install((args) => { + if (!args.beforeItemId) return page(messages.slice(6), true); + attempts += 1; + return attempts === 1 + ? pending.promise + : page(messages.slice(0, 8), false); + }); + mount(); + await screen.findByText('历史正文 25'); + fireEvent.click(earlier()); + fireEvent.click(earlier()); + expect(attempts).toBe(1); + await act(async () => pending.reject(new Error('模拟读取失败'))); + expect(screen.getByText('历史正文 25')).not.toBeNull(); + fireEvent.click(earlier()); + await screen.findByText('历史正文 0'); + expect(screen.getAllByText('历史正文 6')).toHaveLength(1); + expect(screen.getAllByText('历史正文 7')).toHaveLength(1); + const loads = invoke.mock.calls.filter( + ([command, args]) => + command === 'read_direct_project_history_slice' && args?.beforeItemId, + ); + expect(loads.map(([, args]) => args?.beforeItemId)).toEqual([ + messages[6]!.id, + messages[6]!.id, + ]); + }); + + it('同项目重新加载使旧翻页失效,旧 finally 不解除新请求的单飞', async () => { + const old = deferred(); + const fresh = deferred(); + let fullLoads = 0; + let olderLoads = 0; + const recent = messages.slice(6).map((item) => ({ + ...item, + content: [{ type: 'output_text', text: `重读 ${item.content[0]!.text}` }], + })); + install((args) => { + if (!args.beforeItemId) { + fullLoads += 1; + return page(fullLoads === 1 ? messages.slice(6) : recent, true); + } + olderLoads += 1; + return olderLoads === 1 ? old.promise : fresh.promise; + }); + mount(); + await screen.findByText('历史正文 25'); + fireEvent.click(earlier()); + await setComposerText(screen.getByLabelText('陶泥儿对话内容'), '/history'); + fireEvent.click(screen.getByRole('button', { name: '发送' })); + await screen.findByText('重读 历史正文 25'); + fireEvent.click(earlier()); + await act(async () => + old.resolve( + page( + [ + { + ...messages[0]!, + id: 'stale', + content: [{ type: 'input_text', text: '过期消息' }], + }, + ], + false, + ), + ), + ); + expect(screen.queryByText('过期消息')).toBeNull(); + fireEvent.click(earlier()); + expect(olderLoads).toBe(2); + await act(async () => fresh.resolve(page(messages.slice(0, 6), false))); + await screen.findByText('历史正文 0'); + }); + + it('离开项目并重进后,旧请求不能污染新实例', async () => { + const old = deferred(); + const invoke = install((args) => + args.beforeItemId ? old.promise : page(messages.slice(6), true), + ); + const first = mount(); + await screen.findByText('历史正文 25'); + fireEvent.click(earlier()); + first.unmount(); + const other = mount('/tmp/another-project'); + await screen.findByText('历史正文 25'); + other.unmount(); + mount(); + await screen.findByText('历史正文 25'); + await act(async () => + old.resolve( + page( + [ + { + ...messages[0]!, + id: 'stale', + content: [{ type: 'input_text', text: '旧项目迟到消息' }], + }, + ], + false, + ), + ), + ); + expect(screen.queryByText('旧项目迟到消息')).toBeNull(); + expect(earlier()).not.toBeNull(); + expect( + invoke.mock.calls.filter( + ([command]) => command === 'read_direct_project_history_slice', + ), + ).toHaveLength(4); + }); +}); diff --git a/apps/ai-game-creator-shell/tests/directThreadEvents.test.ts b/apps/ai-game-creator-shell/tests/directThreadEvents.test.ts index 128cdf135..ff7849dfc 100644 --- a/apps/ai-game-creator-shell/tests/directThreadEvents.test.ts +++ b/apps/ai-game-creator-shell/tests/directThreadEvents.test.ts @@ -2,10 +2,59 @@ import { describe, expect, it } from 'vitest'; import { directThreadHistoryItemsToMessages, + directThreadHistoryPage, isDirectTurnInProgress, + prependDirectHistoryMessages, } from '../src/features/project-workspace/directThreadEvents'; describe('Direct 回合状态与历史时间', () => { + it('游标来自原始切片,不从没有聊天消息的工具页倒推', () => { + const page = directThreadHistoryPage( + { + items: [{ id: 'tool-older', type: 'function_call_output' }], + hasMore: true, + oldestItemId: 'tool-older', + }, + 'message-newer', + ); + expect(page.messages).toEqual([]); + expect(page.cursor).toBe('tool-older'); + }); + it('空历史结束,无 ID 或不前进的非终页明确失败而不循环', () => { + expect(directThreadHistoryPage({ items: [], hasMore: false })).toEqual({ + messages: [], + cursor: null, + hasMore: false, + }); + expect(() => directThreadHistoryPage({ items: [], hasMore: true })).toThrow( + '游标未前进', + ); + expect(() => + directThreadHistoryPage( + { + items: [{ id: 'same' }], + hasMore: true, + oldestItemId: 'same', + }, + 'same', + ), + ).toThrow('游标未前进'); + }); + it('重叠页按原始 ID 去重,保留当前正文,旧无 ID 消息不删除', () => { + const current = [ + { role: 'assistant' as const, text: '完整正文', messageId: 'a' }, + ]; + const old = { role: 'user' as const, text: '用户输入', messageId: 'u' }; + expect( + prependDirectHistoryMessages(current, [ + old, + old, + { role: 'assistant', text: '旧快照', messageId: 'a' }, + { role: 'assistant', text: '无身份旧消息' }, + ]), + ).toEqual([old, { role: 'assistant', text: '无身份旧消息' }, ...current]); + }); + it('终态和空状态不恢复为活动回合', () => { for (const status of [ 'completed', diff --git a/docs/project-memory/plans/【实施计划】AGC对话历史分页恢复-2026-09-16.md b/docs/project-memory/plans/【实施计划】AGC对话历史分页恢复-2026-09-16.md new file mode 100644 index 000000000..97f4d2433 --- /dev/null +++ b/docs/project-memory/plans/【实施计划】AGC对话历史分页恢复-2026-09-16.md @@ -0,0 +1,25 @@ +# AGC 对话历史分页恢复实施计划 + +- Date: 2026-09-16 +- Status: awaiting-runtime-acceptance +- Milestone: [AGC 对话历史分页恢复](./【里程碑】AGC对话历史分页恢复-2026-09-16.md) + +## 实施 + +1. 原生历史读取复用逐行解析,增加消息模式,过滤后分页并返回已有原始消息 ID 游标;保持原始接口默认行为和路径权限。 +2. 工作台首屏与更早消息读取显式请求消息模式,消费游标;加载代次隔离、单飞与 ID 去重。 +3. 合成记录测试复现原始工具页卡住的形状,覆盖旧无 ID、坏行、时间、失败/重复/切项目;临时目录只读重放用户日志。 +4. 前端/原生定向测试、类型、Lint、编码、文档和差异检查通过后,更新问题表及 PR 草稿并本地提交。 + +## 边界与停止条件 + +不调整 Direct 消息呈现归属、不修未证明的写入丢失、不上传日志、不触碰用户项目。必要 API 变化仅为本地 IPC 可选参数和游标字段;无 OpenAPI、SpacetimeDB 或持久化迁移。远程推送/PR/WIP 操作仍待额外确认。 + +## 验收证据 + +- 历史消息模型、回合呈现及分页集成共 24 个前端测试通过;包含真实 App 的首屏/更早页、单飞、失败重试、重叠消息、同项目重新加载及离开再进入的迟到响应。 +- 16 个历史原生测试通过;人工日志重放用例在 CI 默认忽略,已在本地单独执行通过。 +- 使用用户提供的原始日志运行修复后的原生读取:44 条现存聊天消息(含 2 条用户消息)分 3 页取回,逐项内容与顺序一致,原文件字节未变;未在仓库保存原始日志。 +- 工作台/Direct 恢复与画布导航的 8 个定向回归通过。真实客户端重新进入与向上翻页尚待用户验收;本次涉及 Rust IPC,需重新构建并启动原生端。 +- 与前面画布/JSON 修复联合复验:119 个前端定向测试、30 个原生测试通过;AGC TypeScript、修改文件 ESLint、编码、文档索引和差异检查通过。 +- 状态只覆盖日志中已经证明的分页卡页,不据此宣称其它可能的未落盘消息也已恢复。 diff --git a/docs/project-memory/plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md b/docs/project-memory/plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md index d45ed0575..f91406977 100644 --- a/docs/project-memory/plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md +++ b/docs/project-memory/plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md @@ -31,7 +31,7 @@ | B02 | 初次进入双指平移无效,整理后恢复 | 已优化;用户在本轮反馈未再复现,按用户要求更新状态。隔离组件连续平移通过。 | | B03 | 快速平移触发更新深度错误 | 已修复已确认的窗口 Context 反馈循环,回归验证收敛;真实操作继续观察。 | | B04 | 资源选中后运行不可用提示消失 | 已修复,提示与选择解耦,自动化验证通过。 | -| B05 | 对话记录偶发丢失 | 已定位历史分页卡点,尚未修改。只读复验用户提供的历史:558 条合法原始记录中有 44 条聊天消息;首屏原始 20 条只投影出一条助手消息,下一页原始 20 条没有聊天消息,按消息计算的游标不推进。已存用户提问和最终回答因此无法继续翻出;不能凭该文件排除其它未落盘记录。 | +| B05 | 对话记录偶发丢失 | 已修复日志复现的历史分页卡点:消息模式过滤后分页、原生游标与读取代次隔离。原生只读重放分 3 页取回全部 44 条现存消息,原文件未变;真实客户端待验收,不扩大为其它未落盘记录已恢复。 | | B06 | JSON 文档未正确识别展示 | 已按用户确认完成本地修复:合法 UI State 由原生完整校验,卡片显示 UI 设计并进入现有编辑器;普通 JSON 显示 JSON 并可代码预览。自动化验证通过,待重建原生客户端验收;详见 JSON 语义识别实施计划。 | | C01 | 右键平移,保留左键框选 | 已实现,卡片左键拖动、框选、指针取消/失焦/捕获丢失及控件边界测试通过。 | @@ -40,4 +40,4 @@ - 修复前新增回归测试能检出外壳重复发布、运行提示消失和右键无效;修复后窗口/画布定向测试通过,现有导航、框选、指针点击/取消、UI 编辑器返回平移和素材定位用例通过。 - AGC TypeScript、修改文件 ESLint、编码、文档索引及差异空白检查通过。 - 测试仍有既有 React 列表 key、旧用例 act/IPC 桩告警,未作为本批功能修复扩大范围。 -- 用户反馈 B01/B02 本轮未再复现,记为已优化;右键手感与其它真实客户端细节继续观察。对话历史分页尚未修复;JSON 双路径已本地修复并通过自动化验证,待真实客户端验收。本计划保持开放。 +- 用户反馈 B01/B02 本轮未再复现,记为已优化;右键手感与其它真实客户端细节继续观察。对话历史分页与 JSON 双路径均已本地修复并通过定向验证,待重建原生端后真实客户端验收。本计划保持开放。 diff --git a/docs/project-memory/plans/【里程碑】AGC对话历史分页恢复-2026-09-16.md b/docs/project-memory/plans/【里程碑】AGC对话历史分页恢复-2026-09-16.md new file mode 100644 index 000000000..a247be381 --- /dev/null +++ b/docs/project-memory/plans/【里程碑】AGC对话历史分页恢复-2026-09-16.md @@ -0,0 +1,19 @@ +# AGC 对话历史分页恢复 + +- Version: 1 +- Status: reviewed +- Date: 2026-09-16 +- Parent Spec: [AGC 实施计划:DirectProject 回合展示唯一归属](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md) + +## 范围与评审 + +用户已要求修复 B05。已用用户提供的原始日志只读复验:原始切片被工具/推理填满时,聊天投影为空,消息游标不推进。修复聊天读取与分页,不改历史写入、不删除记录、不修改模型上下文,不扩大到其它尚无证据的对话丢失原因。 + +采用已有切片接口的显式消息模式与原生游标。原始模式缺省行为保持不变,旧无 ID 消息保留;前端以项目和加载代次隔离结果。本轮不包含远程写入。 + +## 验收 + +1. 工具/推理密集、末尾无消息、纯工具历史均不产生空页死循环。 +2. 消息正文、原始 ID、时间和顺序保持不变,翻页能到达早期用户提问及最终回答,不重复。 +3. 连点、请求失败重试、项目切换和同项目重新加载不会污染消息或游标。 +4. 原始切片默认模式回归通过,用户日志只读重放可以取回全部现存消息;不把真实日志或对话正文提交到仓库。 diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index 8cb5e234e..59f167beb 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -1,5 +1,9 @@ # 踩坑与排障记录 +## DirectProject 历史不能按工具条目切页再按消息推进游标 + +原始 `response_item` 历史同时含用户/助手消息、推理与工具输出。若原生每次取 20 个原始条目、前端过滤聊天消息后再找最旧 ID,纯工具页会让消息集合为空且游标不动,看起来历史丢失。聊天读取固定显式请求 `messagesOnly: true`,原生逐行过滤后按消息分页并返回 `oldestItemId`;默认原始模式留给原始条目消费者。无 ID 旧消息保留并扩展到可寻址边界,不能造 ID。前端保留项目与读取代次、单飞及 ID 去重,旧请求的成功、失败与 finally 都不能覆盖新读取;真实日志只在临时目录只读重放,不能提交正文夹具。 + ## JSON 卡片显示与 UI 编辑能力必须同源 JSON 的文本读取分支不等于卡面应该展示原始 State 摘要。卡片、缩略图及编辑器入口共同消费受控文本预览的 `uiDesignAssetId`;只有原生复用 UI 持久化合同校验 schema、完整 State 和项目/资产身份后才设置它。普通 JSON 保留 JSON 代码预览,不按 `kind: UI/ui` 或 schema 字符串片段猜测编辑能力。已有合法 UI State 的加载/保存不依赖 kind 精确大小写,但新建初始化仍保留正式 UI 资产门禁;缓存与项目切换须保留现有身份隔离。 diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index e024c1788..990ee7353 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -32,6 +32,9 @@ ## 2026-09-16 DirectProject 回合展示唯一归属 +- 聊天历史使用 `read_direct_project_history_slice` 的 `messagesOnly: true` 模式,按有正文的 user/assistant 消息分页,默认 20 条;工具/推理原始记录不占聊天页名额、不进入聊天分页响应,也不从磁盘删除。接口省略该选项时维持原始 item 切片语义。响应给出明确的 `oldestItemId` 游标;消息投影不能重新发明分页位置。 +- 消息模式读取逐行过滤原始记录,不在内存中积累整份工具输出;正文、原始 ID 和信封时间原样保留。旧的无 ID 消息不能凭空生成身份,必要时向前扩展到已有消息 ID 边界;没有更早消息时结束分页。 +- 首屏和加载更早消息共用分页解析;重复点击只发一个请求,重叠消息按原始 ID 去重并保留当前显示版本。切项目、同项目重新加载及 A→B→A 的迟到响应不得覆盖当前消息、游标或加载状态;失败保留已有消息与分页位置并允许重试。 - 交付合同:实时消息、历史回读、工具详情与最终回复先归一为按 `clientTurnId` 唯一的回合,再渲染一次。用户消息始终保留;同一回合的正文、工具和耗时不能从消息、实时尾部、未归属尾部等多个出口重复展示。 - 归属来自 `direct-codex:{clientTurnId}:{role}`、文本流中保留的原始 item ID,以及项目历史内明确用户记录之后的 assistant 记录。先在已加载的完整消息集合中关联,再做可见分页;持久历史继续通过 canonical item 切片懒加载,`hasMore` 为真时,未加载回合的工具流不得漂到当前页尾部。禁止将第 N 个有工具回合配给第 N 条用户消息,禁止按文本长度、标点或时间窗猜测归属。缺身份的旧记录保留,不猜造其与其它回合的关联。 - 有回合流时正文与工具位置仅来自 item 边界与 `seq`,工具详情按该回合的 `callId` 关联;没有流时同一个回合容器显示历史消息与工具。整轮累计文本仅在活动回合尚无流和持久 assistant 时作兜底,不另建实时消息出口。 From 7f9dce5f79966ba2b34ac16d4124b953ef4691f2 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Thu, 17 Sep 2026 09:48:19 +0800 Subject: [PATCH 04/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=BB=E5=B8=83?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E4=B8=8D=E5=8F=AF=E7=94=A8=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E5=A5=91=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 恢复资源选中状态下运行提示的正确显示条件 使源码契约测试与实际行为保持一致 --- .../src/view/project-development/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/ai-game-creator-shell/src/view/project-development/index.tsx b/apps/ai-game-creator-shell/src/view/project-development/index.tsx index e660c2c73..42a5e56a9 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/index.tsx +++ b/apps/ai-game-creator-shell/src/view/project-development/index.tsx @@ -6260,7 +6260,8 @@ export default function ProjectDevelopmentView({ setMode('run'); } - const showRunUnavailableHint = !runAvailable && !uiEditorRoute; + const showRunUnavailableHint = + !runAvailable && selectedResourceIds.length === 0 && !uiEditorRoute; const renderResourceBookCard = useCallback( ( From 9d374a57b17bbd5a26aa5bf26668c64eaf2dc9d3 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Thu, 17 Sep 2026 11:51:14 +0800 Subject: [PATCH 05/35] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E7=94=A8=E6=8F=90=E7=A4=BA=E7=9A=84=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E6=B5=8B=E8=AF=95=E5=A5=91=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 恢复运行提示与资源选择解耦的业务逻辑 更新界面源码契约测试,保留资源选中交互回归 补充运行提示及无障碍关联的验收口径 --- .../src/view/project-development/index.tsx | 3 +-- .../tests/appSurface/project-development.suite.ts | 2 +- .../plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/ai-game-creator-shell/src/view/project-development/index.tsx b/apps/ai-game-creator-shell/src/view/project-development/index.tsx index 42a5e56a9..e660c2c73 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/index.tsx +++ b/apps/ai-game-creator-shell/src/view/project-development/index.tsx @@ -6260,8 +6260,7 @@ export default function ProjectDevelopmentView({ setMode('run'); } - const showRunUnavailableHint = - !runAvailable && selectedResourceIds.length === 0 && !uiEditorRoute; + const showRunUnavailableHint = !runAvailable && !uiEditorRoute; const renderResourceBookCard = useCallback( ( diff --git a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts index df0c7d567..fd69cc8b7 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts @@ -5979,7 +5979,7 @@ export function registerProjectWorkbenchFoundationTests() { expect(chatWalletSlots).toHaveLength(1); expect(projectDevelopmentSource).toMatch(/walletEntry=\{walletEntry\}/); expect(projectDevelopmentSource).toMatch( - /const showRunUnavailableHint\s*=\s*!runAvailable\s*&&\s*selectedResourceIds\.length === 0\s*&&\s*!uiEditorRoute/s, + /const showRunUnavailableHint\s*=\s*!runAvailable\s*&&\s*!uiEditorRoute\s*;/s, ); expect(projectDevelopmentSource).toMatch( /aria-describedby=\{\s*showRunUnavailableHint\s*\?\s*'run-unavailable-hint'\s*:\s*undefined\s*\}/s, diff --git a/docs/project-memory/plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md b/docs/project-memory/plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md index f91406977..9902abd0b 100644 --- a/docs/project-memory/plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md +++ b/docs/project-memory/plans/【实施计划】AGC画布交互稳定性修复-2026-09-16.md @@ -14,6 +14,7 @@ ## 验证 - 定向 Vitest:窗口工作台、画布交互、布局与原有导航用例。 +- 运行提示的源码契约与交互回归同时覆盖:提示仅取决于运行能力和 UI 编辑器路由,不依赖资源选择;选中资源后提示及 `aria-describedby` 保留,点击运行仍不能进入不可用视图。 - AGC `tsc --noEmit`;`npm run check:encoding`、`npm run check:doc-index`、`git diff --check`。 - 真实客户端首次进入和触摸板操作无法以 jsdom 代替;未实测时保持待验收。 From a68a9621a74b56a9ed13c633f59b948aea67aa03 Mon Sep 17 00:00:00 2001 From: Linghong Date: Thu, 17 Sep 2026 11:56:17 +0800 Subject: [PATCH 06/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=8A=B6=E6=80=81=E6=B3=84=E6=BC=8F=E4=B8=8E?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E6=96=AD=E8=A8=80=E7=AB=9E=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 隔离创作主页换签网络请求并使用独立响应 恢复快捷键选择状态、持久化路由和UI编辑页宿主mock 修正虚拟树尺寸与选择时序并纳入换签Hook测试 记录全量与随机顺序测试验证方式 --- .../tests/uiEditorPage.test.ts | 52 ++++++++++++++----- .../shared-memory/development-workflow.md | 4 ++ .../CreationLandingView.test.tsx | 43 +++++++++++---- .../useImageCanvasKeyboardShortcuts.test.tsx | 6 ++- .../useImageCanvasProjectPersistence.test.tsx | 1 + src/hooks/useResolvedAssetReadUrl.test.tsx | 34 ++++++++---- vitest.config.ts | 1 + 7 files changed, 106 insertions(+), 35 deletions(-) diff --git a/apps/ai-game-creator-shell/tests/uiEditorPage.test.ts b/apps/ai-game-creator-shell/tests/uiEditorPage.test.ts index f9615a790..d631c5051 100644 --- a/apps/ai-game-creator-shell/tests/uiEditorPage.test.ts +++ b/apps/ai-game-creator-shell/tests/uiEditorPage.test.ts @@ -2,6 +2,7 @@ import { act, + cleanup, fireEvent, render, renderHook, @@ -9,7 +10,7 @@ import { waitFor, } from '@testing-library/react'; import { createElement, type ReactNode } from 'react'; -import { describe, expect, it, vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; vi.mock('@tauri-apps/api/core', () => ({ invoke: vi.fn() })); @@ -35,13 +36,21 @@ import UiEditorPage from '../src/view/ui-editor'; import { useUiEditorSession } from '../src/view/ui-editor/useUiEditorPage'; class TestResizeObserver { - constructor(_callback: ResizeObserverCallback) {} - observe() {} + constructor(private callback: ResizeObserverCallback) {} + observe(target: Element) { + this.callback( + [ + { + target, + contentRect: { width: 800, height: 600 }, + } as ResizeObserverEntry, + ], + this as unknown as ResizeObserver, + ); + } disconnect() {} } -vi.stubGlobal('ResizeObserver', TestResizeObserver); - const EMPTY_SNAPSHOT: UiDesignStateSnapshot = { revision: 0, state: { @@ -147,6 +156,16 @@ async function renderLoadedSession(state: State) { } describe('UiEditorPage', () => { + beforeEach(() => { + vi.stubGlobal('ResizeObserver', TestResizeObserver); + vi.mocked(invoke).mockReset().mockResolvedValue(undefined); + }); + + afterEach(() => { + cleanup(); + vi.unstubAllGlobals(); + }); + it('keeps the wallet entry in the resource editor header', async () => { const stateStore: IUiDesignStateStore = { load: vi.fn().mockResolvedValue(structuredClone(EMPTY_SNAPSHOT)), @@ -185,10 +204,7 @@ describe('UiEditorPage', () => { } return undefined; }); - Object.defineProperty(window, '__TAURI__', { - configurable: true, - value: { core: { invoke } }, - }); + vi.stubGlobal('__TAURI__', { core: { invoke } }); const stateStore: IUiDesignStateStore = { load: vi.fn().mockResolvedValue({ revision: 0, @@ -509,8 +525,13 @@ describe('UiEditorPage', () => { }), ); - const child = await screen.findByText('page-child'); - fireEvent.click(child); + await waitFor(() => { + expect( + screen.getByRole('button', { name: '保存' }).hasAttribute('disabled'), + ).toBe(false); + }); + fireEvent.click(screen.getByText('page-child')); + await screen.findByDisplayValue('page-child'); fireEvent.keyDown(window, { key: 'Delete' }); await waitFor(() => expect(screen.queryByText('page-child')).toBeNull()); @@ -533,8 +554,13 @@ describe('UiEditorPage', () => { }), ); - const child = await screen.findByText('page-child'); - fireEvent.click(child); + await waitFor(() => { + expect( + screen.getByRole('button', { name: '保存' }).hasAttribute('disabled'), + ).toBe(false); + }); + fireEvent.click(screen.getByText('page-child')); + await screen.findByDisplayValue('page-child'); const dialog = document.createElement('div'); dialog.setAttribute('role', 'dialog'); document.body.appendChild(dialog); diff --git a/docs/project-memory/shared-memory/development-workflow.md b/docs/project-memory/shared-memory/development-workflow.md index 3dd59f677..36fbbe575 100644 --- a/docs/project-memory/shared-memory/development-workflow.md +++ b/docs/project-memory/shared-memory/development-workflow.md @@ -4,6 +4,10 @@ ## 标准流程 +前端测试稳定性验证使用根目录 `npm test`(与 Frontend tests job 相同),保留 Vitest 的 8 worker 上限。涉及异步资源展示时,组件测试必须 mock 所有会触发的网络请求,每次调用创建独立 `Response`,并等待最终 DOM 状态而非仅等待 fetch 被调用。换签 Hook 的测试通过 `vitest.config.ts` 的 include 纳入全量运行;新增测试文件后需确认实际执行名单,命令参数指定文件不会绕过 include 白名单。排查顺序依赖可使用 `npm test -- --sequence.shuffle --sequence.seed=9467`,但不能以重试成功替代失败原因分析。 + +用例隔离必须包括浏览器状态与 mock 实现:修改 `window.history` 后恢复基线路由;`spyOn(window, 'getSelection')` 等 spy 在用例结束后 restore;`clearAllMocks` 仅清调用记录,不能恢复被上一个用例替换的返回值。顺序打乱暴露的失败应修复泄漏来源,保留原有业务断言。 + ```text 确认工作树与目标分支 → 读取入口和当前专题 → 查代码真相 → 小步修改 → 定向验证 → 更新当前文档/记忆 → 检查提交边界 ``` diff --git a/src/components/creation-home/CreationLandingView.test.tsx b/src/components/creation-home/CreationLandingView.test.tsx index 656ef8f46..d0c59ef83 100644 --- a/src/components/creation-home/CreationLandingView.test.tsx +++ b/src/components/creation-home/CreationLandingView.test.tsx @@ -155,6 +155,26 @@ function SuspendAfterLandingRender({ active }: { active: boolean }) { describe('CreationLandingView', () => { beforeEach(() => { clearSignedAssetReadUrlCache(); + // 每次换签返回独立响应,筛选等用例也不能触发真实网络请求。 + vi.stubGlobal( + 'fetch', + vi.fn(async (input: RequestInfo | URL) => { + const url = new URL(String(input), 'http://localhost'); + if (url.pathname !== '/api/assets/read-url') { + throw new Error(`Unexpected test request: ${url.pathname}`); + } + return new Response( + JSON.stringify({ + read: { + objectKey: url.searchParams.get('objectKey') ?? '', + signedUrl: 'data:image/png;base64,dGVzdA==', + expiresAt: '2099-01-01T00:00:00Z', + }, + }), + { status: 200, headers: { 'content-type': 'application/json' } }, + ); + }), + ); listPublicEditorProjectResourcesMock.mockResolvedValue([]); }); @@ -1304,17 +1324,18 @@ describe('CreationLandingView', () => { const campaignObjectKey = 'generated-character-drafts/editor/showcase-campaign/current/campaign.png'; const signedCampaignUrl = 'data:image/png;base64,Y2FtcGFpZ24='; - const fetchMock = vi.fn().mockResolvedValue( - new Response( - JSON.stringify({ - read: { - objectKey: campaignObjectKey, - signedUrl: signedCampaignUrl, - expiresAt: '2099-01-01T00:00:00Z', - }, - }), - { status: 200, headers: { 'content-type': 'application/json' } }, - ), + const fetchMock = vi.fn().mockImplementation( + async () => + new Response( + JSON.stringify({ + read: { + objectKey: campaignObjectKey, + signedUrl: signedCampaignUrl, + expiresAt: '2099-01-01T00:00:00Z', + }, + }), + { status: 200, headers: { 'content-type': 'application/json' } }, + ), ); vi.stubGlobal('fetch', fetchMock); listEditorProjectsMock.mockResolvedValue(projectItems); diff --git a/src/components/image-editor/useImageCanvasKeyboardShortcuts.test.tsx b/src/components/image-editor/useImageCanvasKeyboardShortcuts.test.tsx index 6018727b4..e29b81828 100644 --- a/src/components/image-editor/useImageCanvasKeyboardShortcuts.test.tsx +++ b/src/components/image-editor/useImageCanvasKeyboardShortcuts.test.tsx @@ -2,7 +2,7 @@ import { act, fireEvent, render, screen } from '@testing-library/react'; import { type Dispatch, type SetStateAction, useRef, useState } from 'react'; -import { describe, expect, it, vi } from 'vitest'; +import { afterEach, describe, expect, it, vi } from 'vitest'; import type { CanvasGenerationDialogState, @@ -258,6 +258,10 @@ function KeyboardShortcutsHarness({ } describe('useImageCanvasKeyboardShortcuts', () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + it('routes undo and redo while ignoring editable inputs', () => { const undoCanvasChange = vi.fn(); const redoCanvasChange = vi.fn(); diff --git a/src/components/image-editor/useImageCanvasProjectPersistence.test.tsx b/src/components/image-editor/useImageCanvasProjectPersistence.test.tsx index e33258343..ddcd5eaa6 100644 --- a/src/components/image-editor/useImageCanvasProjectPersistence.test.tsx +++ b/src/components/image-editor/useImageCanvasProjectPersistence.test.tsx @@ -954,6 +954,7 @@ describe('useImageCanvasProjectPersistence', () => { beforeEach(() => { vi.resetAllMocks(); + window.history.replaceState(null, '', '/editor/canvas'); try { globalThis.sessionStorage?.clear(); } catch { diff --git a/src/hooks/useResolvedAssetReadUrl.test.tsx b/src/hooks/useResolvedAssetReadUrl.test.tsx index a5094abb1..0ffd68ffd 100644 --- a/src/hooks/useResolvedAssetReadUrl.test.tsx +++ b/src/hooks/useResolvedAssetReadUrl.test.tsx @@ -3,6 +3,7 @@ import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; +import { RUNTIME_RESOURCE_PENDING_SELECTOR } from '../components/common/RuntimeResourcePendingMarker'; import { ResolvedAssetImage } from '../components/ResolvedAssetImage'; import { clearStoredAccessToken, @@ -215,6 +216,7 @@ describe('useResolvedAssetReadUrl', () => { }); test('refreshKey changes force a fresh signed url request without mutating OSS signature query', async () => { + let requestCount = 0; vi.spyOn(globalThis, 'fetch').mockImplementation( async () => new Response( @@ -224,7 +226,7 @@ describe('useResolvedAssetReadUrl', () => { read: { objectKey: 'generated-puzzle-assets/puzzle-session-1/candidate-1/asset-1/image.png', - signedUrl: 'https://signed.example.com/puzzle.png', + signedUrl: `https://signed.example.com/puzzle.png?x-oss-signature=version-${++requestCount}`, expiresAt: '2099-01-01T00:10:00Z', }, }, @@ -255,7 +257,7 @@ describe('useResolvedAssetReadUrl', () => { const firstImage = await screen.findByRole('img', { name: '候选图' }); expect(firstImage.getAttribute('src')).toBe( - 'https://signed.example.com/puzzle.png', + 'https://signed.example.com/puzzle.png?x-oss-signature=version-1', ); rerender( @@ -267,11 +269,11 @@ describe('useResolvedAssetReadUrl', () => { ); await waitFor(() => { - expect(globalThis.fetch).toHaveBeenCalledTimes(2); + expect( + screen.getByRole('img', { name: '候选图' }).getAttribute('src'), + ).toBe('https://signed.example.com/puzzle.png?x-oss-signature=version-2'); }); - expect( - screen.getByRole('img', { name: '候选图' }).getAttribute('src'), - ).toBe('https://signed.example.com/puzzle.png'); + expect(globalThis.fetch).toHaveBeenCalledTimes(2); }); test('generated 私有资源签名失败时保持空图像而不是回退裸路径', async () => { @@ -300,16 +302,22 @@ describe('useResolvedAssetReadUrl', () => { ), ); - render( + const { container } = render( , ); + expect( + container.querySelector(RUNTIME_RESOURCE_PENDING_SELECTOR), + ).not.toBeNull(); await waitFor(() => { - expect(globalThis.fetch).toHaveBeenCalledTimes(1); + expect( + container.querySelector(RUNTIME_RESOURCE_PENDING_SELECTOR), + ).toBeNull(); }); + expect(globalThis.fetch).toHaveBeenCalledTimes(1); expect(screen.queryByRole('img', { name: '候选图' })).toBeNull(); }); @@ -339,7 +347,7 @@ describe('useResolvedAssetReadUrl', () => { ), ); - render( + const { container } = render( { expect( screen.getByRole('img', { name: '候选图' }).getAttribute('src'), ).toBe('/creation-type-references/puzzle.webp'); + expect( + container.querySelector(RUNTIME_RESOURCE_PENDING_SELECTOR), + ).not.toBeNull(); await waitFor(() => { - expect(globalThis.fetch).toHaveBeenCalledTimes(1); + expect( + container.querySelector(RUNTIME_RESOURCE_PENDING_SELECTOR), + ).toBeNull(); }); + expect(globalThis.fetch).toHaveBeenCalledTimes(1); expect( screen.getByRole('img', { name: '候选图' }).getAttribute('src'), ).toBe('/creation-type-references/puzzle.webp'); diff --git a/vitest.config.ts b/vitest.config.ts index 0af75894a..4d6d56888 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -119,6 +119,7 @@ export default defineConfig({ 'src/components/platform-entry/platformProfile*.test.ts', 'src/components/platform-entry/usePlatformProfileCenterController*.test.tsx', 'src/hooks/useHostNavigationCanGoBack.test.tsx', + 'src/hooks/useResolvedAssetReadUrl.test.tsx', 'apps/admin-web/src/**/*.test.ts', 'apps/admin-web/src/**/*.test.tsx', 'apps/ai-game-creator-shell/tests/**/*.test.ts', From 036395c6c979dad4091031c6942c95219d125b2c Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Thu, 17 Sep 2026 13:54:00 +0800 Subject: [PATCH 07/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E9=87=8D=E8=AF=BB=E5=90=8E=E6=97=A7=E6=B6=88=E6=81=AF=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E5=88=B0=E6=9C=AB=E5=B0=BE=E7=9A=84=E4=B9=B1=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 区分历史回读与实时消息来源,保留运行时所有权语义 防止旧页消息在历史刷新后追加到最新回复末尾 增加重新读取历史后再次翻页的顺序和去重回归 同步对话历史规范与实施计划 --- apps/ai-game-creator-shell/src/App.tsx | 7 ++-- apps/ai-game-creator-shell/src/app/types.ts | 2 + .../tests/directHistoryPagination.test.tsx | 37 +++++++++++++++++++ ...实施计划】AGC对话历史分页恢复-2026-09-16.md | 1 + ...里程碑】AGC对话历史分页恢复-2026-09-16.md | 1 + ...案】AI游戏创作智能体App实施计划-2026-06-24.md | 1 + 6 files changed, 46 insertions(+), 3 deletions(-) diff --git a/apps/ai-game-creator-shell/src/App.tsx b/apps/ai-game-creator-shell/src/App.tsx index ac1ae9a8b..be33bfe93 100644 --- a/apps/ai-game-creator-shell/src/App.tsx +++ b/apps/ai-game-creator-shell/src/App.tsx @@ -626,7 +626,7 @@ function claimInitialSupervisorMessageForPage(projectPath: string, scope = '') { * 初始需求是**乐观插入**到 messages 的(latch 命中后先插一条 user 消息,再发起回合), * 而历史回读在 replace 分支里是无条件整体替换 —— 只要回读晚于乐观插入,那条用户消息 * 就会被冲掉(界面上看不到初始需求,但回合其实已经跑起来了)。 - * 这里把当前 messages 里"运行时拥有、且回读结果里没有"的消息保留在末尾(它们是最新的)。 + * 这里只把当前 messages 里"非历史来源、运行时拥有、且回读结果里没有"的消息保留在末尾。 */ function mergeLoadedConversationWithPendingRuntimeMessages( loaded: ChatMessage[], @@ -644,7 +644,7 @@ function mergeLoadedConversationWithPendingRuntimeMessages( loaded.map((message) => `${message.role}\u0000${message.text}`), ); const pending = current.filter((message) => { - if (!message.runtimeOwned) { + if (!message.runtimeOwned || message.fromHistory) { return false; } if (message.messageId) { @@ -4202,7 +4202,7 @@ export function App({ const conversationMessages = mergeProjectSupervisorConversation( resolvedProjectConversation.messages, supervisorConversation?.messages ?? [], - ); + ).map((message) => ({ ...message, fromHistory: true })); if ( conversationContainsProjectSupervisorResponseStream( supervisorConversation?.messages ?? [], @@ -12528,6 +12528,7 @@ export function App({ : ('assistant' as const), text: message.content, runtimeOwned: true, + fromHistory: true, messageId: message.messageId, updatedAt: message.updatedAt, })); diff --git a/apps/ai-game-creator-shell/src/app/types.ts b/apps/ai-game-creator-shell/src/app/types.ts index 88594678d..6fb26adc6 100644 --- a/apps/ai-game-creator-shell/src/app/types.ts +++ b/apps/ai-game-creator-shell/src/app/types.ts @@ -999,6 +999,8 @@ export interface ChatMessage { agentId?: string | null; updatedAt?: number; runtimeOwned?: boolean; + /** 来自历史回读,不作为尚未落盘的实时消息追加到新历史页末尾。 */ + fromHistory?: boolean; } export type DesignAgentInput = diff --git a/apps/ai-game-creator-shell/tests/directHistoryPagination.test.tsx b/apps/ai-game-creator-shell/tests/directHistoryPagination.test.tsx index 9b7b410a0..8c0f00a19 100644 --- a/apps/ai-game-creator-shell/tests/directHistoryPagination.test.tsx +++ b/apps/ai-game-creator-shell/tests/directHistoryPagination.test.tsx @@ -97,6 +97,43 @@ afterEach(() => { }); describe('Direct 聊天历史分页集成', () => { + it('加载旧页后重读历史回到最新页,再翻页仍按原顺序且不重复', async () => { + const invoke = install((args) => + args.beforeItemId + ? page(messages.slice(0, 6), false) + : page(messages.slice(6), true), + ); + mount(); + await screen.findByText('历史正文 25'); + fireEvent.click(earlier()); + await screen.findByText('历史正文 0'); + await setComposerText(screen.getByLabelText('陶泥儿对话内容'), '/history'); + fireEvent.click(screen.getByRole('button', { name: '发送' })); + await act(async () => { + await Promise.resolve(); + }); + expect(screen.queryByText('历史正文 0')).toBeNull(); + expect(screen.getByText('历史正文 25')).not.toBeNull(); + fireEvent.click(earlier()); + await screen.findByText('历史正文 0'); + for (let index = 0; index < messages.length; index += 1) { + expect(screen.getAllByText(`历史正文 ${index}`)).toHaveLength(1); + if (index > 0) { + expect( + screen + .getByText(`历史正文 ${index - 1}`) + .compareDocumentPosition(screen.getByText(`历史正文 ${index}`)) & + Node.DOCUMENT_POSITION_FOLLOWING, + ).not.toBe(0); + } + } + expect( + invoke.mock.calls.filter( + ([command]) => command === 'read_direct_project_history_slice', + ), + ).toHaveLength(4); + }); + it('首屏按消息加载20条,更早消息使用原生游标,原始工具记录不占页', async () => { const invoke = install((args) => args.beforeItemId diff --git a/docs/project-memory/plans/【实施计划】AGC对话历史分页恢复-2026-09-16.md b/docs/project-memory/plans/【实施计划】AGC对话历史分页恢复-2026-09-16.md index 97f4d2433..db90eebeb 100644 --- a/docs/project-memory/plans/【实施计划】AGC对话历史分页恢复-2026-09-16.md +++ b/docs/project-memory/plans/【实施计划】AGC对话历史分页恢复-2026-09-16.md @@ -10,6 +10,7 @@ 2. 工作台首屏与更早消息读取显式请求消息模式,消费游标;加载代次隔离、单飞与 ID 去重。 3. 合成记录测试复现原始工具页卡住的形状,覆盖旧无 ID、坏行、时间、失败/重复/切项目;临时目录只读重放用户日志。 4. 前端/原生定向测试、类型、Lint、编码、文档和差异检查通过后,更新问题表及 PR 草稿并本地提交。 +5. 在临时消息投影中标记历史来源,保留 Runtime 所有权语义;刷新合并时只保留非历史来源的待回读消息。补齐「先加载旧页,再 /history,再翻页」的顺序与去重回归,保持尚未落盘用户输入的保留逻辑。 ## 边界与停止条件 diff --git a/docs/project-memory/plans/【里程碑】AGC对话历史分页恢复-2026-09-16.md b/docs/project-memory/plans/【里程碑】AGC对话历史分页恢复-2026-09-16.md index a247be381..4b8e244c4 100644 --- a/docs/project-memory/plans/【里程碑】AGC对话历史分页恢复-2026-09-16.md +++ b/docs/project-memory/plans/【里程碑】AGC对话历史分页恢复-2026-09-16.md @@ -17,3 +17,4 @@ 2. 消息正文、原始 ID、时间和顺序保持不变,翻页能到达早期用户提问及最终回答,不重复。 3. 连点、请求失败重试、项目切换和同项目重新加载不会污染消息或游标。 4. 原始切片默认模式回归通过,用户日志只读重放可以取回全部现存消息;不把真实日志或对话正文提交到仓库。 +5. 加载更早消息后重新读取历史,旧页不出现在最新回复之后;再次翻页保持顺序且不重复。未落盘的实时用户输入不因历史刷新被丢弃。 diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index 792e58a6c..4c39954dc 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -35,6 +35,7 @@ - 聊天历史使用 `read_direct_project_history_slice` 的 `messagesOnly: true` 模式,按有正文的 user/assistant 消息分页,默认 20 条;工具/推理原始记录不占聊天页名额、不进入聊天分页响应,也不从磁盘删除。接口省略该选项时维持原始 item 切片语义。响应给出明确的 `oldestItemId` 游标;消息投影不能重新发明分页位置。 - 消息模式读取逐行过滤原始记录,不在内存中积累整份工具输出;正文、原始 ID 和信封时间原样保留。旧的无 ID 消息不能凭空生成身份,必要时向前扩展到已有消息 ID 边界;没有更早消息时结束分页。 - 首屏和加载更早消息共用分页解析;重复点击只发一个请求,重叠消息按原始 ID 去重并保留当前显示版本。切项目、同项目重新加载及 A→B→A 的迟到响应不得覆盖当前消息、游标或加载状态;失败保留已有消息与分页位置并允许重试。 +- 历史读取来源与 Runtime 所有权分开记录;从磁盘分页读出的消息不能当作未落盘实时消息保留到新页末尾。重新读取历史时回到最新页,旧页仍可从原生游标再次向前加载;真正尚未回读到的实时消息继续保留,不改原始日志、时间或内容。 - 交付合同:实时消息、历史回读、工具详情与最终回复先归一为按 `clientTurnId` 唯一的回合,再渲染一次。用户消息始终保留;同一回合的正文、工具和耗时不能从消息、实时尾部、未归属尾部等多个出口重复展示。 - 归属来自 `direct-codex:{clientTurnId}:{role}`、文本流中保留的原始 item ID,以及项目历史内明确用户记录之后的 assistant 记录。先在已加载的完整消息集合中关联,再做可见分页;持久历史继续通过 canonical item 切片懒加载,`hasMore` 为真时,未加载回合的工具流不得漂到当前页尾部。禁止将第 N 个有工具回合配给第 N 条用户消息,禁止按文本长度、标点或时间窗猜测归属。缺身份的旧记录保留,不猜造其与其它回合的关联。 - 有回合流时正文与工具位置仅来自 item 边界与 `seq`,工具详情按该回合的 `callId` 关联;没有流时同一个回合容器显示历史消息与工具。整轮累计文本仅在活动回合尚无流和持久 assistant 时作兜底,不另建实时消息出口。 From cd9faae9b27bdadcc7a7575d7a3a7c5ca8691d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B5=E8=88=92=E5=BA=B7?= Date: Thu, 17 Sep 2026 14:56:56 +0800 Subject: [PATCH 08/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20agc=5Ftools=20?= =?UTF-8?q?=E5=AA=92=E4=BD=93=E8=B5=84=E6=BA=90=E6=8F=90=E7=A4=BA=E8=AF=8D?= =?UTF-8?q?=E4=B8=8A=E9=99=90=E5=B9=B6=E6=8C=89=20kind=20=E6=9A=B4?= =?UTF-8?q?=E9=9C=B2=20(#398)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 改动 - 提示词上限收敛为 `resource_edit_prompt_max_chars` 单一权威:`agc_tools` MCP 工具层、客户端受控工具桥与提交校验共用同一数字与拒绝文案,不再出现「schema 写 4000、真实上限按 kind 分」的分叉。 - `agc_create_or_derive_resource` 的 schema 逐 kind 声明 `prompt.maxLength`(background-music / sound-effect / video 与 character-animation),`prompt` 描述写明每个数字;`agc_edit_image` 继续用图片口径 32000。 - 工具桥不再用通用 4000 校验 prompt:图片编辑 4000~32000 的提示词不再被误报成「超出安全边界」。 - 源资源未登记时的错误文案补上可执行两步:先用 `agc_list_registered_assets` 选已有 localAssetId;只在项目里的文件先 `agc_list_project_files` 确认 `assetImportable=true`,再用 `agc_import_account_assets.localPaths` 登记后重试。`agc_remove_background` 复用同一条文案。 - skill 包 `agc-client-projection` 的 SKILL.md 与 projection-contract.md 写明四个上限,并说明超限要在本地收敛而不是原样重发;清单指纹同步到 `2026-08-26.18`(已合并 master 的抠图文案)。 - 前端 `resourceEditModel.ts` 补注释指向 Rust 权威函数,数字未动。 - decision-log、pitfalls 与《AI游戏创作智能体App实施计划》记录本轮口径;未改 External v1 契约 / OpenAPI、SpacetimeDB schema 与客户端 UI 行为。 ## 问题 | 编号 | 问题 | 本 PR 状态 | | --- | --- | --- | | P1 | 背景音乐提示词真实上限 140,但 schema 只写 4000、skill 未写明,agent 写一句正常长度描述必被硬拒 | 已修复:口径单源 + 逐 kind 暴露 + skill 写明 | | P2 | 音效 1900 与图片编辑 32000 的上限只在 Rust 内部生效,MCP 与工具桥各自硬编码或误报 | 已修复:三处共用同一函数,图片编辑不再误报安全边界 | | P3 | 源资源未登记时只报「不属于当前项目已登记资源」,模型会原地重试 | 已修复:文案给出 `agc_list_registered_assets` 与登记工具两步动作 | | P4 | 这两个工具此前没有端到端用例,同类漂移无法被门禁拦住 | 已补:MCP 工具层 → 真实工具桥 → 假平台的契约用例 + 两条按 kind 上限门禁 | ## 验证 - `agent::direct_tools_mcp::tests` 23 passed / 0 failed:含新增的按 kind 上限门禁、图片快速编辑契约(断言 `POST /api/editor/images/edits` 的路径、Bearer、Idempotency-Key、正文且不得回填 assetKind)、背景音乐契约(断言 `POST /api/editor/audios/background-music/generations` 的 `gptDescriptionPrompt` 与 `makeInstrumental`)、超限零桥请求、未登记源资源提示。 - `agent::direct_tool_bridge::tests` 18 passed / 7 failed;`agent::skill_pack` 4 passed;`npm run agc:skill-pack:check` 与 `skill-pack:test` 通过(version `2026-08-26.18`)。 - AGC `typecheck`(tsc + skill-pack check + check-config)、`resourceEditModel` 6 项前端测试、`npm run check:encoding`、`npm run check:doc-index`、`cargo fmt --check`、`git diff --check` 通过。 - 那 7 条(以及 `project::resource_editor` 45 条)失败与本 PR 无关:全部是 `tempfile::tempdir()` 的 `Windows 安全对象不属于当前用户`,已 stash 改动并用基线复跑确认失败集合一致。 - 未跑整包 AGC Rust 全量分片、`npm run lint` 聚合门禁与 CI;未做任何付费生成。工具 schema 与 skill 文案都在应用内,终端用户需重新构建客户端才能看到修复效果。 --------- Co-authored-by: kdletters <61648117+kdletters@users.noreply.github.com> Reviewed-on: https://git.genarrative.world/git/GenarrativeAI/Genarrative/pulls/398 --- .../agc-skills/agc-client-projection/SKILL.md | 2 +- .../references/projection-contract.md | 2 + .../resources/agc-skills/manifest.json | 4 +- .../src-tauri/src/agent/direct_tool_bridge.rs | 99 ++- .../src-tauri/src/agent/direct_tools_mcp.rs | 785 +++++++++++++++++- .../src-tauri/src/project/resource_editor.rs | 40 +- .../project-development/resourceEditModel.ts | 6 + .../shared-memory/decision-log.md | 11 + docs/project-memory/shared-memory/pitfalls.md | 8 + ...案】AI游戏创作智能体App实施计划-2026-06-24.md | 1 + 10 files changed, 904 insertions(+), 54 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/SKILL.md b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/SKILL.md index 4d4862554..84fb51e53 100644 --- a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/SKILL.md @@ -13,7 +13,7 @@ Let the client derive projections from real disk changes and trusted tool result 2. Before using or deriving an existing registered asset, call `agc_list_registered_assets` and select its `localAssetId`. If the user points to an existing project file that is not listed, first call `agc_list_project_files`; only entries with `assetImportable=true` (recognized image, font, audio, video, document, or code files) may be passed to `agc_import_account_assets.localPaths`. Then re-read `agc_list_registered_assets`; never infer a source identity from a filename or fabricate a localAssetId. 3. Keep read scopes separate: `asset.list` is the current project manifest, `asset.library.list` is the signed-in account library, and the web project's canvas resource read model is the authoritative canvas list. The account library is not the complete canvas list. 4. Use `canvas.asset_import` for safe account/canvas asset IDs or project-relative local paths. The client rechecks ownership and validates bytes; host absolute paths require native UI file-picker authorization. -5. When the user explicitly asks to create or derive video, character animation, sound effect, or background music, call `agc_create_or_derive_resource`. Use `create` only for video/audio without a source and `derive` with a registered `sourceLocalAssetId`; character animation is always derived from an image. +5. When the user explicitly asks to create or derive video, character animation, sound effect, or background music, call `agc_create_or_derive_resource`. Use `create` only for video/audio without a source and `derive` with a registered `sourceLocalAssetId`; character animation is always derived from an image. Keep `prompt` inside the per-kind limit that the client really enforces: background music at most 140 characters, sound effect at most 1900, video and character animation at most 4000. A longer prompt is rejected before submission, so write the short version first instead of retrying the same text. 6. When the user explicitly asks to remove an image background, call `agc_remove_background` with a registered image `sourceLocalAssetId` and `assetName`. Optional `backgroundMode` is `complex` (semantic foreground segmentation; default) or `flat` (solid-colour background removal). Prefer `flat` when the background is known to be solid. Only `flat` accepts optional `screenColor`: `auto`, `#RRGGBB`, or omitted for automatic detection by the service. Do not select a colour on behalf of `auto`. The client requires the signed-in account, owns canvas/folder context and task identity, and returns only bounded queue state. 7. Preserve existing relative paths when a small edit is sufficient so client resource identities remain stable. 8. Do not edit `.agent/manifest.json`, revision counters, version records, resource IDs, canvas identities, source provenance, generation ledgers, or browser receipts by hand. diff --git a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/references/projection-contract.md b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/references/projection-contract.md index 87cba6b1a..63ddd9a82 100644 --- a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/references/projection-contract.md +++ b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/references/projection-contract.md @@ -14,4 +14,6 @@ Read scopes remain separate: `asset.list` is the current project's local manifes `agc_create_or_derive_resource` accepts only semantic intent. The client resolves `sourceLocalAssetId`, creates stable request identities, recovers matching pending operations, serializes paid submissions, writes supported media into the current canvas and same-name asset folder, validates downloaded bytes, commits the local manifest transaction, and returns redacted warnings. A tool error or timeout is not permission to generate again with a new identity. +`prompt` limits are per kind and are enforced before any paid submission: background music accepts 1-140 characters, sound effect 1-1900, video and character animation 1-4000, and image editing (`agc_edit_image`) 1-32000. The client composes the submitted request from a fixed prefix plus your prompt, so an over-limit prompt fails locally with the exact limit; shorten the text rather than resubmitting the same value. `agc_edit_image` remains the image path; this tool never generates or edits still images. + `agc_remove_background` accepts a registered image `sourceLocalAssetId`, `assetName`, and optional `backgroundMode` and `screenColor`. `complex` uses semantic segmentation to identify the foreground; `flat` removes a solid-colour background. Prefer `flat` when the background is known to be solid; omitting the mode selects `complex`. Only `flat` accepts a colour: `auto`, `#RRGGBB`, or omitted for automatic service detection. Never infer a concrete colour for `auto`. Empty or invalid values and colour without `flat` are rejected. The client resolves the formal source resource, canvas/folder context, stable operation identity, idempotency key, and authenticated External v1 `/api/external/v1/editor/images/background-removals` call. Mode and colour are part of request identity. Its result is bounded queue state; Codex must not poll internal workers, construct source URLs, or retry with a new identity after an uncertain response. diff --git a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/manifest.json b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/manifest.json index c57ea3638..1f7b5c124 100644 --- a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/manifest.json +++ b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/manifest.json @@ -1,6 +1,6 @@ { "schemaVersion": "agc-skill-pack.v1", - "version": "2026-08-26.17", + "version": "2026-08-26.18", "skills": [ { "name": "agc-game-production-workflow", @@ -123,7 +123,7 @@ "agents/openai.yaml", "references/projection-contract.md" ], - "sha256": "a929c27bc5b2b0bee0b7935e5c7b04ddbab1eb1804fe196f8c2537ad040ca5b1" + "sha256": "0700d4a7a18ee6151811f38786211ad416863f2e425fdc2ded67555a0a1923a1" } ] } diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs index 705da3ecb..a517f1831 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs @@ -24,7 +24,6 @@ const DIRECT_TOOL_BRIDGE_IMAGE_PREVIEW_MAX_DIMENSION: u32 = 1024; const DIRECT_TOOL_BRIDGE_MAX_SEARCH_QUERY_CHARS: usize = 400; const DIRECT_TOOL_BRIDGE_MAX_SEARCH_RESULTS: usize = 5; const DIRECT_TOOL_BRIDGE_SEARCH_URL: &str = "https://www.bing.com/search?format=rss"; -const DIRECT_TOOL_BRIDGE_MAX_RESOURCE_PROMPT_CHARS: usize = 4_000; const DIRECT_TOOL_BRIDGE_MAX_RESOURCE_NAME_CHARS: usize = 120; const DIRECT_TOOL_BRIDGE_MAX_RESOURCE_KIND_CHARS: usize = 80; const DIRECT_TOOL_BRIDGE_MAX_RESOURCE_PAGE_SIZE: usize = 100; @@ -89,7 +88,7 @@ struct DirectToolBridgeRequest { } #[derive(Clone, Copy, Debug, Eq, PartialEq)] -enum DirectResourceGenerationKind { +pub(crate) enum DirectResourceGenerationKind { Image, Video, CharacterAnimation, @@ -98,7 +97,7 @@ enum DirectResourceGenerationKind { } impl DirectResourceGenerationKind { - fn parse(value: &str) -> Result { + pub(crate) fn parse(value: &str) -> Result { match value { "image" => Ok(Self::Image), "video" => Ok(Self::Video), @@ -119,7 +118,7 @@ impl DirectResourceGenerationKind { } } - fn edit_kind(self) -> LocalProjectResourceEditKind { + pub(crate) fn edit_kind(self) -> LocalProjectResourceEditKind { match self { Self::Image => LocalProjectResourceEditKind::ImageReference, Self::Video => LocalProjectResourceEditKind::Video, @@ -128,6 +127,11 @@ impl DirectResourceGenerationKind { Self::BackgroundMusic => LocalProjectResourceEditKind::BackgroundMusic, } } + + /// 提示词上限只从客户端权威口径取值,工具桥与 MCP 层共用同一份数字。 + pub(crate) fn prompt_max_chars(self) -> usize { + resource_edit_prompt_max_chars(&self.edit_kind()) + } } #[derive(Clone, Copy, Debug, Eq, PartialEq)] @@ -1036,6 +1040,12 @@ fn bridge_account_asset_import_inputs( Ok((asset_ids, local_paths)) } +/// 源资源身份不在当前项目 manifest 时的统一提示。 +/// +/// 只报「不属于已登记资源」会让模型原地重试;这里必须把下一步可执行动作写清楚: +/// 已登记资源走 `agc_list_registered_assets`,只在项目里存在的文件先登记再重试。 +const DIRECT_TOOL_BRIDGE_UNREGISTERED_SOURCE_MESSAGE: &str = "sourceLocalAssetId 不是当前项目已登记资源:先调用 agc_list_registered_assets 选择已有 localAssetId;若目标图片只在项目里,先用 agc_list_project_files 确认它 assetImportable=true,再用 agc_import_account_assets.localPaths 登记后重试。"; + fn bridge_resource_generation_input( arguments: &Value, ) -> Result { @@ -1054,18 +1064,20 @@ fn bridge_resource_generation_input( "sourceLocalAssetId", DIRECT_TOOL_BRIDGE_MAX_RESOURCE_KIND_CHARS, )?; - let prompt = bridge_bounded_string( - arguments, - "prompt", - DIRECT_TOOL_BRIDGE_MAX_RESOURCE_PROMPT_CHARS, - )?; + // prompt 的形状校验只用信封级上限,真正生效的按 kind 上限由紧随其后的权威判定给出 + // 精确数字;否则通用 4000 会先于「图片编辑 32000 / 音效 1900」误报成安全边界错误。 + let prompt = bridge_bounded_string(arguments, "prompt", DIRECT_TOOL_BRIDGE_MAX_REQUEST_BYTES)?; let asset_name = bridge_bounded_string( arguments, "assetName", DIRECT_TOOL_BRIDGE_MAX_RESOURCE_NAME_CHARS, )?; - if kind == DirectResourceGenerationKind::BackgroundMusic && prompt.chars().count() > 140 { - return Err("背景音乐提示词必须在 1..=140 字符内".to_string()); + let prompt_max_chars = kind.prompt_max_chars(); + if prompt.chars().count() > prompt_max_chars { + return Err(resource_edit_prompt_limit_error( + &kind.edit_kind(), + prompt_max_chars, + )); } match (kind, mode, source_local_asset_id.as_ref()) { (DirectResourceGenerationKind::Image, DirectResourceGenerationMode::Create, _) => { @@ -1806,7 +1818,7 @@ async fn bridge_create_or_derive_resource( .iter() .find(|asset| asset.id == asset_id) .cloned() - .ok_or_else(|| "sourceLocalAssetId 不属于当前项目已登记资源".to_string()) + .ok_or_else(|| DIRECT_TOOL_BRIDGE_UNREGISTERED_SOURCE_MESSAGE.to_string()) }) .transpose()?; let prompt_sha256 = format!("{:x}", Sha256::digest(input.prompt.as_bytes())); @@ -1903,7 +1915,7 @@ async fn bridge_remove_background(state: &DirectToolBridgeState, arguments: &Val .assets .iter() .find(|asset| asset.id == source_asset_id) - .ok_or_else(|| "sourceLocalAssetId 不属于当前项目已登记资源".to_string())?; + .ok_or_else(|| DIRECT_TOOL_BRIDGE_UNREGISTERED_SOURCE_MESSAGE.to_string())?; if !source_asset.media_type.starts_with("image/") { return Err("抠图工具只接受当前项目已登记的图片资源".to_string()); } @@ -2795,6 +2807,67 @@ mod tests { .contains("x-genarrative-client:")); } + /// 按 kind 的提示词上限只来自客户端权威口径;超限必须在构造工具输入时就被拒绝, + /// 不能再出现写死的数字(2026-09-17 的背景音乐 140 就是写死在桥这一层的)。 + #[test] + fn bridge_resource_prompt_limits_follow_the_client_authority() { + for (kind, edit_kind) in [ + ( + "background-music", + LocalProjectResourceEditKind::BackgroundMusic, + ), + ("sound-effect", LocalProjectResourceEditKind::SoundEffect), + ("video", LocalProjectResourceEditKind::Video), + ( + "character-animation", + LocalProjectResourceEditKind::CharacterAnimation, + ), + ("image", LocalProjectResourceEditKind::ImageReference), + ] { + let authority = resource_edit_prompt_max_chars(&edit_kind); + let mode = if matches!( + edit_kind, + LocalProjectResourceEditKind::ImageReference + | LocalProjectResourceEditKind::CharacterAnimation + ) { + "derive" + } else { + "create" + }; + let mut arguments = json!({ + "kind": kind, + "mode": mode, + "prompt": "字".repeat(authority), + "assetName": "边界名称" + }); + if mode == "derive" { + arguments["sourceLocalAssetId"] = json!("registered-source"); + } + bridge_resource_generation_input(&arguments) + .unwrap_or_else(|error| panic!("{kind} 恰好等于上限必须通过:{error}")); + + arguments["prompt"] = json!("字".repeat(authority + 1)); + let error = match bridge_resource_generation_input(&arguments) { + Ok(_) => panic!("{kind} 超过按 kind 上限的提示词必须被拒绝"), + Err(error) => error, + }; + assert!( + error.contains(&authority.to_string()) && error.contains(kind_label(&edit_kind)), + "{kind} 的拒绝文案必须带上真实上限与类型:{error}" + ); + } + } + + fn kind_label(edit_kind: &LocalProjectResourceEditKind) -> &'static str { + match edit_kind { + LocalProjectResourceEditKind::BackgroundMusic => "背景音乐", + LocalProjectResourceEditKind::SoundEffect => "音效", + LocalProjectResourceEditKind::Video => "视频", + LocalProjectResourceEditKind::CharacterAnimation => "角色动画", + _ => "资源编辑", + } + } + #[test] fn bridge_argument_bounds_are_deterministic() { assert_eq!( diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tools_mcp.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tools_mcp.rs index 8b0cd12a0..9c769fc5e 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tools_mcp.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tools_mcp.rs @@ -16,7 +16,6 @@ const DIRECT_TOOLS_MCP_MAX_REQUEST_BYTES: usize = 2 * 1024 * 1024; const DIRECT_TOOLS_MCP_MAX_ART_BRIEF_CHARS: usize = 4_000; const DIRECT_TOOLS_MCP_MAX_IMAGE_PROMPT_CHARS: usize = 32_000; const DIRECT_TOOLS_MCP_MAX_SEARCH_QUERY_CHARS: usize = 400; -const DIRECT_TOOLS_MCP_MAX_RESOURCE_PROMPT_CHARS: usize = 4_000; const DIRECT_TOOLS_MCP_MAX_RESOURCE_NAME_CHARS: usize = 120; const DIRECT_TOOLS_MCP_MAX_WRITE_CONTENT_BYTES: usize = 1_500_000; const DIRECT_TOOLS_MCP_MAX_BRIDGE_RESPONSE_BYTES: usize = 32 * 1024 * 1024; @@ -103,6 +102,32 @@ async fn direct_tools_mcp_specs() -> Value { direct_tools_mcp_specs_for(controlled_web_search_enabled(), cocos_editor_available) } +/// 工具 kind(wire 值)对应的提示词上限。 +/// +/// 数字只来自客户端资源编辑权威口径(`resource_edit_prompt_max_chars`);未知 kind 直接 +/// panic,避免 schema 与真实校验静默漂移。 +fn resource_tool_prompt_max_chars(kind: &str) -> usize { + DirectResourceGenerationKind::parse(kind) + .unwrap_or_else(|error| panic!("{kind} 不是受支持的媒体资源类型:{error}")) + .prompt_max_chars() +} + +/// `agc_create_or_derive_resource` 顶层 `prompt.maxLength`:本工具所有受支持 kind 的上限最大值。 +/// +/// 仍然保留顶层上限,供忽略 `allOf` / `oneOf` 的调用方使用;逐 kind 的精确上限在分支里声明。 +fn resource_tool_prompt_schema_max_chars() -> usize { + [ + "background-music", + "sound-effect", + "video", + "character-animation", + ] + .into_iter() + .map(resource_tool_prompt_max_chars) + .max() + .unwrap_or(0) +} + fn direct_tools_mcp_specs_for(controlled_web_search: bool, _cocos_editor_available: bool) -> Value { let tools = vec![ json!({ @@ -407,7 +432,8 @@ fn direct_tools_mcp_specs_for(controlled_web_search: bool, _cocos_editor_availab "prompt": { "type": "string", "minLength": 1, - "maxLength": DIRECT_TOOLS_MCP_MAX_RESOURCE_PROMPT_CHARS + "maxLength": resource_tool_prompt_schema_max_chars(), + "description": "资源描述或改造要求。按 kind 有硬上限,超限会被客户端直接拒绝:background-music 最多 140 字符、sound-effect 最多 1900 字符、video / character-animation 最多 4000 字符。图片编辑走 agc_edit_image。" }, "assetName": { "type": "string", @@ -417,17 +443,47 @@ fn direct_tools_mcp_specs_for(controlled_web_search: bool, _cocos_editor_availab } }, "required": ["kind", "mode", "prompt", "assetName"], - "oneOf": [ + "allOf": [ { - "properties": { - "mode": { "const": "create" }, - "kind": { "enum": ["video", "sound-effect", "background-music"] } - }, - "not": { "required": ["sourceLocalAssetId"] } + "oneOf": [ + { + "properties": { + "mode": { "const": "create" }, + "kind": { "enum": ["video", "sound-effect", "background-music"] } + }, + "not": { "required": ["sourceLocalAssetId"] } + }, + { + "properties": { "mode": { "const": "derive" } }, + "required": ["sourceLocalAssetId"] + } + ] }, { - "properties": { "mode": { "const": "derive" } }, - "required": ["sourceLocalAssetId"] + // 逐 kind 声明真实提示词上限,与 resource_edit_prompt_max_chars 同口径。 + "oneOf": [ + { + "properties": { + "kind": { "const": "background-music" }, + "prompt": { "maxLength": resource_tool_prompt_max_chars("background-music") } + }, + "required": ["kind"] + }, + { + "properties": { + "kind": { "const": "sound-effect" }, + "prompt": { "maxLength": resource_tool_prompt_max_chars("sound-effect") } + }, + "required": ["kind"] + }, + { + "properties": { + "kind": { "enum": ["video", "character-animation"] }, + "prompt": { "maxLength": resource_tool_prompt_max_chars("video") } + }, + "required": ["kind"] + } + ] } ], "additionalProperties": false @@ -850,25 +906,14 @@ fn validate_resource_generation_arguments(arguments: &Value) -> Result<(), Strin &["kind", "mode", "sourceLocalAssetId", "prompt", "assetName"], )?; let kind = bounded_tool_string(arguments, "kind", 80)?; - if ![ - "video", - "character-animation", - "sound-effect", - "background-music", - ] - .contains(&kind.as_str()) - { - return Err("工具参数 kind 不是受支持的媒体资源类型".to_string()); - } + let generation_kind = DirectResourceGenerationKind::parse(&kind)?; let mode = bounded_tool_string(arguments, "mode", 16)?; if !["create", "derive"].contains(&mode.as_str()) { return Err("工具参数 mode 必须是 create 或 derive".to_string()); } - let prompt = bounded_tool_string( - arguments, - "prompt", - DIRECT_TOOLS_MCP_MAX_RESOURCE_PROMPT_CHARS, - )?; + // prompt 的形状校验只用信封级上限,真正生效的按 kind 上限由紧随其后的权威判定给出 + // 精确数字;否则通用 4000 会先于按 kind 上限误报成安全边界错误。 + let prompt = bounded_tool_string(arguments, "prompt", DIRECT_TOOLS_MCP_MAX_REQUEST_BYTES)?; bounded_tool_string( arguments, "assetName", @@ -878,8 +923,12 @@ fn validate_resource_generation_arguments(arguments: &Value) -> Result<(), Strin if source.is_some() { bounded_tool_string(arguments, "sourceLocalAssetId", 80)?; } - if kind == "background-music" && prompt.chars().count() > 140 { - return Err("背景音乐提示词必须在 1..=140 字符内".to_string()); + let prompt_max_chars = generation_kind.prompt_max_chars(); + if prompt.chars().count() > prompt_max_chars { + return Err(resource_edit_prompt_limit_error( + &generation_kind.edit_kind(), + prompt_max_chars, + )); } if kind == "character-animation" && mode == "create" { return Err("角色动画必须基于已登记图片资源派生".to_string()); @@ -2756,4 +2805,686 @@ mod tests { "显式 Codex 返回不能再往项目主对话写 legacy 行" ); } + + // --------------------------------------------------------------------------------------- + // 工具层 → 客户端受控工具桥 → 假平台:媒体工具契约的确定性验收。 + // + // 夹具只回答资源编辑链路真正会发的请求,任何未预期请求直接 panic;源图片的 + // binding 在这里预置,因为「上传票据 → OSS 表单上传 → 对象确认 → 登记项目资源」 + // 子链已有专门用例覆盖,本组只钉工具名 / 参数校验 / 出站请求契约。 + // --------------------------------------------------------------------------------------- + + const TOOL_CHAIN_CANVAS_PROJECT_ID: &str = "remote-canvas-project"; + const TOOL_CHAIN_ASSET_FOLDER_ID: &str = "remote-asset-folder"; + const TOOL_CHAIN_ACCESS_TOKEN: &str = "tool-chain-token"; + const TOOL_CHAIN_MEDIA_ROUTE: &str = "/generated/resource-edit-result"; + + fn tool_chain_png() -> Vec { + let mut bytes = Vec::new(); + image::DynamicImage::ImageRgba8(image::RgbaImage::from_pixel( + 2, + 2, + image::Rgba([12, 34, 56, 255]), + )) + .write_to( + &mut std::io::Cursor::new(&mut bytes), + image::ImageFormat::Png, + ) + .expect("encode tool chain png"); + bytes + } + + fn tool_chain_mp3() -> Vec { + let mut bytes = b"ID3\x04\x00\x00\x00\x00\x00\x0a".to_vec(); + bytes.extend_from_slice(&[0_u8; 32]); + bytes + } + + fn tool_chain_image_asset(id: &str, local_path: &str) -> GameCreationAppAssetManifestEntry { + GameCreationAppAssetManifestEntry { + id: id.to_string(), + kind: "image".to_string(), + media_type: "image/png".to_string(), + local_path: local_path.to_string(), + image_sequence_frames: None, + image_sequence_duration_ms: None, + category: game_creation_app_asset_category_for_kind("image"), + tags: Vec::new(), + source: GameCreationAppAssetSource { + kind: GameCreationAppAssetSourceKind::Canvas, + canvas_project_id: Some(TOOL_CHAIN_CANVAS_PROJECT_ID.to_string()), + resource_id: Some("editor-resource-hero".to_string()), + asset_object_id: Some("assetobj-hero".to_string()), + task_id: Some("tool-chain-task".to_string()), + prompt: None, + model: None, + generation_route: None, + generation_kind: None, + reference_resource_ids: Vec::new(), + }, + } + } + + fn tool_chain_accept(listener: &std::net::TcpListener) -> std::net::TcpStream { + listener + .set_nonblocking(true) + .expect("set tool chain listener nonblocking"); + let deadline = std::time::Instant::now() + std::time::Duration::from_secs(20); + loop { + match listener.accept() { + Ok((stream, _)) => { + stream + .set_nonblocking(false) + .expect("restore tool chain stream blocking mode"); + return stream; + } + Err(error) if error.kind() == std::io::ErrorKind::WouldBlock => { + assert!( + std::time::Instant::now() < deadline, + "等待工具链夹具请求超时" + ); + std::thread::sleep(std::time::Duration::from_millis(10)); + } + Err(error) => panic!("接受工具链夹具请求失败:{error}"), + } + } + } + + fn tool_chain_read_request(stream: &mut std::net::TcpStream) -> String { + use std::io::Read; + + stream + .set_read_timeout(Some(std::time::Duration::from_secs(5))) + .expect("set tool chain read timeout"); + let mut bytes = Vec::new(); + let mut buffer = [0_u8; 4096]; + let (header_end, content_length) = loop { + let read = stream.read(&mut buffer).expect("read tool chain request"); + assert!(read > 0, "工具链夹具请求在请求头结束前关闭"); + bytes.extend_from_slice(&buffer[..read]); + let Some(header_end) = bytes.windows(4).position(|value| value == b"\r\n\r\n") else { + continue; + }; + let header_text = String::from_utf8_lossy(&bytes[..header_end]); + let content_length = header_text + .lines() + .find_map(|line| { + let (name, value) = line.split_once(':')?; + name.eq_ignore_ascii_case("content-length") + .then(|| value.trim().parse::().ok()) + .flatten() + }) + .unwrap_or(0); + break (header_end + 4, content_length); + }; + while bytes.len() < header_end + content_length { + let read = stream + .read(&mut buffer) + .expect("read tool chain request body"); + assert!(read > 0, "工具链夹具请求在请求体结束前关闭"); + bytes.extend_from_slice(&buffer[..read]); + } + String::from_utf8_lossy(&bytes).into_owned() + } + + fn tool_chain_write_json(stream: &mut std::net::TcpStream, status: &str, body: Value) { + use std::io::Write; + + let body = body.to_string(); + write!( + stream, + "HTTP/1.1 {status}\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{body}", + body.len(), + ) + .expect("write tool chain json response"); + } + + fn tool_chain_write_media(stream: &mut std::net::TcpStream, media_type: &str, bytes: &[u8]) { + use std::io::Write; + + write!( + stream, + "HTTP/1.1 200 OK\r\nContent-Type: {media_type}\r\nContent-Length: {}\r\nConnection: close\r\n\r\n", + bytes.len(), + ) + .expect("write tool chain media headers"); + stream + .write_all(bytes) + .expect("write tool chain media bytes"); + } + + /// 假平台:按固定次数回答资源编辑链路的请求,并回放收到的每个请求正文。 + fn tool_chain_spawn_platform( + listener: std::net::TcpListener, + expected_submission: &'static str, + media_type: &'static str, + media: Vec, + request_count: usize, + ) -> ( + std::thread::JoinHandle>, + std::sync::mpsc::Receiver, + ) { + let media_url = format!( + "http://{}{TOOL_CHAIN_MEDIA_ROUTE}", + listener.local_addr().expect("tool chain fixture address") + ); + let (sender, receiver) = std::sync::mpsc::channel(); + let handle = std::thread::spawn(move || { + let mut requests = Vec::new(); + for _ in 0..request_count { + let mut stream = tool_chain_accept(&listener); + let request = tool_chain_read_request(&mut stream); + let request_line = request.lines().next().unwrap_or_default().to_string(); + let route = request_line + .split_whitespace() + .nth(1) + .unwrap_or_default() + .to_string(); + sender.send(request.clone()).ok(); + requests.push(request); + if route.starts_with("/api/editor/projects") { + tool_chain_write_json( + &mut stream, + "200 OK", + json!({"data": {"projects": [{ + "projectId": TOOL_CHAIN_CANVAS_PROJECT_ID, + "title": "工具链远端画布" + }]}}), + ); + } else if route.starts_with("/api/editor/assets/library") { + tool_chain_write_json( + &mut stream, + "200 OK", + json!({"data": {"library": {"folders": [{ + "folderId": TOOL_CHAIN_ASSET_FOLDER_ID, + "label": "工具链远端目录" + }]}}}), + ); + } else if request_line.starts_with(expected_submission) { + tool_chain_write_json( + &mut stream, + "202 Accepted", + json!({"data": { + "operationId": "tool-chain-operation", + "status": "queued", + "pollAfterMs": 0 + }}), + ); + } else if route.starts_with("/api/runtime/external-generation/jobs/") { + tool_chain_write_json( + &mut stream, + "200 OK", + json!({"data": { + "status": "completed", + "result": {"resource": { + "resourceId": "editor-resource-derived", + "objectKey": "generated/resource-edit-result", + "assetObjectId": "assetobj-derived" + }} + }}), + ); + } else if route.starts_with("/api/assets/read-url") { + tool_chain_write_json( + &mut stream, + "200 OK", + json!({"data": {"read": {"signedUrl": media_url}}}), + ); + } else if route.starts_with(TOOL_CHAIN_MEDIA_ROUTE) { + tool_chain_write_media(&mut stream, media_type, &media); + } else { + panic!("工具链夹具收到未预期请求:{request_line}"); + } + } + requests + }); + (handle, receiver) + } + + /// 真实项目 + 真实工具桥 + 真实 Direct 回合身份。 + async fn tool_chain_start( + root: &Path, + ) -> ( + super::super::direct_tool_bridge::DirectToolBridge, + DirectTaonierActiveInvocationGuard, + ) { + let bridge = super::super::direct_tool_bridge::start_direct_tool_bridge(root, false) + .await + .expect("start tool chain bridge"); + let turn = DirectTaonierActiveInvocationGuard::enter(root, "tool-chain-turn") + .expect("arm tool chain direct turn"); + (bridge, turn) + } + + async fn tool_chain_call( + bridge: &super::super::direct_tool_bridge::DirectToolBridge, + root: &Path, + name: &str, + arguments: Value, + ) -> Value { + EXTERNAL_MCP_BRIDGE_URL + .scope( + bridge.url().to_string(), + handle_direct_tools_mcp_request( + root, + json!({ + "jsonrpc": "2.0", + "id": 1, + "method": "tools/call", + "params": { "name": name, "arguments": arguments } + }), + ), + ) + .await + .expect("mcp response") + } + + fn tool_chain_payload(result: &Value) -> Value { + serde_json::from_str( + result["result"]["content"][0]["text"] + .as_str() + .unwrap_or_else(|| panic!("工具返回不是文本包:{result}")), + ) + .unwrap_or_else(|error| panic!("工具返回不是 JSON:{error};{result}")) + } + + /// P1 门禁:工具 schema 的 per-kind 上限、MCP 校验、工具桥校验与客户端权威口径必须是同一个数字。 + #[test] + fn tool_prompt_limits_agree_with_the_client_authority() { + let specs = direct_tools_mcp_specs_for(false, false); + let resource_tool = specs["tools"] + .as_array() + .expect("tool array") + .iter() + .find(|tool| tool["name"] == "agc_create_or_derive_resource") + .expect("resource tool"); + let schema_branches = resource_tool["inputSchema"]["allOf"] + .as_array() + .and_then(|all_of| all_of.get(1)) + .and_then(|branch| branch["oneOf"].as_array()) + .expect("per-kind prompt limit branches"); + + for (tool_kind, expected_kind) in [ + ( + "background-music", + LocalProjectResourceEditKind::BackgroundMusic, + ), + ("sound-effect", LocalProjectResourceEditKind::SoundEffect), + ("video", LocalProjectResourceEditKind::Video), + ( + "character-animation", + LocalProjectResourceEditKind::CharacterAnimation, + ), + ] { + let authority = resource_edit_prompt_max_chars(&expected_kind); + let generation_kind = DirectResourceGenerationKind::parse(tool_kind) + .unwrap_or_else(|error| panic!("{tool_kind}: {error}")); + assert_eq!( + generation_kind.edit_kind(), + expected_kind, + "{tool_kind} 必须映射到同一客户端类型" + ); + assert_eq!( + generation_kind.prompt_max_chars(), + authority, + "{tool_kind} 的工具桥上限必须来自客户端权威口径" + ); + let branch_limit = schema_branches + .iter() + .find_map(|branch| { + let kind = &branch["properties"]["kind"]; + let covers_kind = kind["const"].as_str() == Some(tool_kind) + || kind["enum"].as_array().is_some_and(|values| { + values.iter().any(|value| value.as_str() == Some(tool_kind)) + }); + covers_kind.then(|| { + branch["properties"]["prompt"]["maxLength"] + .as_u64() + .expect("branch prompt maxLength") + }) + }) + .unwrap_or_else(|| panic!("{tool_kind} 缺少按 kind 声明的提示词上限")); + assert_eq!( + branch_limit as usize, authority, + "{tool_kind} 的 schema 上限必须等于真实生效上限" + ); + assert!( + resource_tool["inputSchema"]["properties"]["prompt"]["description"] + .as_str() + .is_some_and(|text| text.contains(&authority.to_string())), + "{tool_kind} 的上限必须写进 prompt 描述:{authority}" + ); + let over_limit = "字".repeat(authority + 1); + let error = validate_resource_generation_arguments(&json!({ + "kind": tool_kind, + "mode": "create", + "prompt": over_limit, + "assetName": "上限测试" + })) + .expect_err("超过按 kind 上限的提示词必须被拒绝"); + assert!( + error.contains(&authority.to_string()), + "{tool_kind} 的拒绝文案必须带上真实上限:{error}" + ); + } + + // 图片编辑走独立工具,其上限同样是图片类型的权威口径。 + let image_authority = + resource_edit_prompt_max_chars(&LocalProjectResourceEditKind::ImageReference); + assert_eq!(image_authority, DIRECT_TOOLS_MCP_MAX_IMAGE_PROMPT_CHARS); + let edit_tool = specs["tools"] + .as_array() + .expect("tool array") + .iter() + .find(|tool| tool["name"] == "agc_edit_image") + .expect("image edit tool"); + assert_eq!( + edit_tool["inputSchema"]["properties"]["prompt"]["maxLength"], + json!(image_authority) + ); + } + + /// 源资源未登记时必须给出可执行的下一步,而不是只报「不属于已登记资源」。 + #[tokio::test] + async fn unregistered_source_reports_the_registration_follow_up_tools() { + let temporary = crate::tests::canonical_test_tempdir("direct-tools-unregistered-source-"); + let root = temporary.path(); + init_local_game_project_at(root, "direct-tools-unregistered-source", "未登记源资源提示") + .expect("init project"); + let (bridge, _turn_arm) = tool_chain_start(root).await; + let _turn = bridge.begin_user_turn().expect("begin client turn"); + + let result = tool_chain_call( + &bridge, + root, + "agc_edit_image", + json!({ + "sourceLocalAssetId": "missing-image", + "prompt": "把这张图改成夜景", + "assetName": "缺失源图编辑版" + }), + ) + .await; + + assert_eq!(result["result"]["isError"], true, "{result}"); + let message = result["result"]["content"][0]["text"] + .as_str() + .expect("tool error text"); + assert!( + message.contains("agc_list_registered_assets"), + "未登记源资源必须指向已登记资源查询工具:{message}" + ); + assert!( + message.contains("agc_import_account_assets"), + "未登记源资源必须指向登记工具:{message}" + ); + } + + /// 工具层 → 桥 → 假平台:图片快速编辑必须真的落到站内 `/api/editor/images/edits`。 + #[tokio::test] + async fn edit_image_tool_reaches_the_platform_image_edit_route() { + let temporary = crate::tests::canonical_test_tempdir("direct-tools-edit-image-"); + let root = temporary.path(); + init_local_game_project_at(root, "direct-tools-edit-image", "图片快速编辑工具链") + .expect("init project"); + let source_bytes = tool_chain_png(); + std::fs::create_dir_all(root.join("assets")).expect("create assets dir"); + std::fs::write(root.join("assets/hero.png"), &source_bytes).expect("write source png"); + let mut manifest = read_existing_manifest_for_project(root).expect("read manifest"); + manifest + .assets + .push(tool_chain_image_asset("hero-image", "assets/hero.png")); + write_manifest(&root.join(".agent/manifest.json"), &manifest).expect("write manifest"); + + let listener = std::net::TcpListener::bind("127.0.0.1:0").expect("bind fixture"); + let base_url = format!("http://{}", listener.local_addr().expect("fixture address")); + let (server, _requests) = tool_chain_spawn_platform( + listener, + "POST /api/editor/images/edits ", + "image/png", + tool_chain_png(), + 6, + ); + let _session = crate::platform_session::install_test_platform_session( + "tool-chain-owner", + TOOL_CHAIN_ACCESS_TOKEN, + &base_url, + ); + let session = current_platform_session().expect("platform session"); + let access = + ExternalEditorBindingAccess::new(&base_url, &session.access_token, Some(&session)) + .expect("account access"); + let principal = external_editor_binding_principal(&access).expect("account principal"); + let project_binding = new_external_editor_project_binding( + &manifest.project_id, + &principal, + TOOL_CHAIN_CANVAS_PROJECT_ID, + TOOL_CHAIN_ASSET_FOLDER_ID, + unix_timestamp(), + ) + .expect("project binding"); + write_external_editor_project_binding_at(root, &project_binding) + .expect("write project binding"); + let source_identity = new_external_editor_source_identity( + "hero-image", + &format!("{:x}", Sha256::digest(&source_bytes)), + "image/png", + "image", + ) + .expect("source identity"); + let resource_binding = new_external_editor_resource_binding( + &manifest.project_id, + &principal, + TOOL_CHAIN_CANVAS_PROJECT_ID, + &source_identity, + Some("editor-resource-hero"), + "source/hero.png", + "assetobj-hero", + Some(2), + Some(2), + unix_timestamp(), + ) + .expect("resource binding"); + write_external_editor_resource_binding_at(root, &resource_binding) + .expect("write resource binding"); + + let (bridge, _turn_arm) = tool_chain_start(root).await; + let _turn = bridge.begin_user_turn().expect("begin client turn"); + let result = tool_chain_call( + &bridge, + root, + "agc_edit_image", + json!({ + "sourceLocalAssetId": "hero-image", + "prompt": "把这张角色图改成夜景霓虹配色", + "assetName": "英雄-夜霓虹" + }), + ) + .await; + let requests = server.join().expect("join tool chain fixture"); + + assert_eq!(result["result"]["isError"], false, "{result}"); + let payload = tool_chain_payload(&result); + assert_eq!(payload["status"], "completed", "{payload}"); + assert_eq!(payload["kind"], "image"); + assert_eq!(payload["mode"], "derive"); + assert_eq!( + payload["resource"]["referenceResourceIds"], + json!(["local-asset:hero-image"]) + ); + let local_path = payload["resource"]["localPath"] + .as_str() + .expect("derived local path"); + assert!( + root.join(local_path).is_file(), + "派生图片必须落盘:{local_path}" + ); + + assert_eq!(requests.len(), 6, "{requests:?}"); + let submission = requests + .iter() + .find(|request| request.starts_with("POST /api/editor/images/edits ")) + .unwrap_or_else(|| panic!("缺少图片编辑提交请求:{requests:?}")); + let submission_lower = submission.to_ascii_lowercase(); + assert!(submission_lower.contains(&format!( + "authorization: bearer {}", + TOOL_CHAIN_ACCESS_TOKEN.to_ascii_lowercase() + ))); + assert!(submission_lower.contains("idempotency-key:")); + assert!(submission.contains("\"sourceReferenceId\":\"editor-resource-hero\"")); + assert!(submission.contains("\"assetLabel\":\"英雄-夜霓虹\"")); + assert!(submission.contains(&format!("\"projectId\":\"{TOOL_CHAIN_CANVAS_PROJECT_ID}\""))); + assert!(submission.contains(&format!( + "\"assetFolderId\":\"{TOOL_CHAIN_ASSET_FOLDER_ID}\"" + ))); + assert!( + !submission.contains("assetKind"), + "图片编辑请求不得回填 assetKind:{submission}" + ); + assert!(requests.iter().any(|request| request + .starts_with("GET /api/runtime/external-generation/jobs/tool-chain-operation "))); + assert!(requests + .iter() + .any(|request| request.starts_with("GET /api/assets/read-url?"))); + } + + /// 超过已发布上限的背景音乐提示词必须在工具层就被拒绝,且一次桥请求都不发出。 + #[tokio::test] + async fn background_music_prompt_over_the_limit_is_rejected_before_any_bridge_call() { + let temporary = crate::tests::canonical_test_tempdir("direct-tools-bgm-limit-"); + let root = temporary.path(); + init_local_game_project_at(root, "direct-tools-bgm-limit", "背景音乐上限工具链") + .expect("init project"); + let authority = + resource_edit_prompt_max_chars(&LocalProjectResourceEditKind::BackgroundMusic); + + let result = EXTERNAL_MCP_BRIDGE_URL + .scope( + // 故意指向没有服务监听的 loopback 地址:一旦真的发出桥请求,报错文案会变成连接失败。 + "http://127.0.0.1:1/tool-dead".to_string(), + handle_direct_tools_mcp_request( + root, + json!({ + "jsonrpc": "2.0", + "id": 1, + "method": "tools/call", + "params": { + "name": "agc_create_or_derive_resource", + "arguments": { + "kind": "background-music", + "mode": "create", + "prompt": "字".repeat(authority + 1), + "assetName": "紧张战斗背景音乐" + } + } + }), + ), + ) + .await + .expect("mcp response"); + + assert_eq!(result["result"]["isError"], true, "{result}"); + let message = result["result"]["content"][0]["text"] + .as_str() + .expect("tool error text"); + assert!( + message.contains(&authority.to_string()) && message.contains("背景音乐"), + "必须按发布上限拒绝并说明类型:{message}" + ); + assert!( + !message.contains("连接客户端受控工具桥失败"), + "上限拒绝必须发生在桥请求之前:{message}" + ); + } + + /// 工具层 → 桥 → 假平台:背景音乐 create 必须落到站内音频生成路由。 + #[tokio::test] + async fn background_music_tool_reaches_the_platform_audio_route() { + let temporary = crate::tests::canonical_test_tempdir("direct-tools-bgm-route-"); + let root = temporary.path(); + init_local_game_project_at(root, "direct-tools-bgm-route", "背景音乐工具链") + .expect("init project"); + let manifest = read_existing_manifest_for_project(root).expect("read manifest"); + + let listener = std::net::TcpListener::bind("127.0.0.1:0").expect("bind fixture"); + let base_url = format!("http://{}", listener.local_addr().expect("fixture address")); + let (server, _requests) = tool_chain_spawn_platform( + listener, + "POST /api/editor/audios/background-music/generations ", + "audio/mpeg", + tool_chain_mp3(), + 6, + ); + let _session = crate::platform_session::install_test_platform_session( + "tool-chain-owner", + TOOL_CHAIN_ACCESS_TOKEN, + &base_url, + ); + let session = current_platform_session().expect("platform session"); + let access = + ExternalEditorBindingAccess::new(&base_url, &session.access_token, Some(&session)) + .expect("account access"); + let principal = external_editor_binding_principal(&access).expect("account principal"); + let project_binding = new_external_editor_project_binding( + &manifest.project_id, + &principal, + TOOL_CHAIN_CANVAS_PROJECT_ID, + TOOL_CHAIN_ASSET_FOLDER_ID, + unix_timestamp(), + ) + .expect("project binding"); + write_external_editor_project_binding_at(root, &project_binding) + .expect("write project binding"); + + let (bridge, _turn_arm) = tool_chain_start(root).await; + let _turn = bridge.begin_user_turn().expect("begin client turn"); + let result = tool_chain_call( + &bridge, + root, + "agc_create_or_derive_resource", + json!({ + "kind": "background-music", + "mode": "create", + "prompt": "紧张但克制的八位机战斗循环,鼓点清晰", + "assetName": "紧张战斗背景音乐" + }), + ) + .await; + let requests = server.join().expect("join tool chain fixture"); + + assert_eq!(result["result"]["isError"], false, "{result}"); + let payload = tool_chain_payload(&result); + assert_eq!(payload["status"], "completed", "{payload}"); + assert_eq!(payload["kind"], "background-music"); + assert_eq!(payload["mode"], "create"); + assert_eq!(payload["resource"]["mediaType"], "audio/mpeg"); + + assert_eq!(requests.len(), 6, "{requests:?}"); + let submission = requests + .iter() + .find(|request| { + request.starts_with("POST /api/editor/audios/background-music/generations ") + }) + .unwrap_or_else(|| panic!("缺少背景音乐提交请求:{requests:?}")); + assert!(submission.to_ascii_lowercase().contains(&format!( + "authorization: bearer {}", + TOOL_CHAIN_ACCESS_TOKEN.to_ascii_lowercase() + ))); + assert!(submission.contains("\"makeInstrumental\":true")); + assert!(submission.contains("紧张但克制的八位机战斗循环,鼓点清晰")); + assert!(submission.contains("\"assetLabel\":\"紧张战斗背景音乐\"")); + let body: Value = serde_json::from_str( + submission + .split("\r\n\r\n") + .nth(1) + .unwrap_or_else(|| panic!("背景音乐提交缺少请求体:{submission}")), + ) + .expect("background music submission body"); + let composed = body["gptDescriptionPrompt"] + .as_str() + .expect("composed background music prompt"); + assert!( + composed.starts_with("生成新音频;目标:") && composed.chars().count() < 200, + "create 模式必须使用无源前缀并落在现役接口上限内:{composed}" + ); + } } diff --git a/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs b/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs index 77183a884..46bb81c24 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs @@ -728,7 +728,16 @@ fn validate_resource_edit_uuid(value: &str, label: &str) -> Result<(), String> { Ok(()) } -fn resource_edit_prompt_max_chars(edit_kind: &LocalProjectResourceEditKind) -> usize { +/// 资源编辑提示词上限的**唯一口径**。 +/// +/// 三个调用方都必须从这里取数,禁止各自写死数字: +/// 1. 本文件的提交校验(`normalize_resource_edit_prompt`); +/// 2. `agc_tools` MCP 工具层(`direct_tools_mcp.rs` 的参数校验与工具 schema); +/// 3. 客户端受控工具桥(`direct_tool_bridge.rs`)。 +/// +/// 客户端 UI 的 `resourceEditPromptMaxLength`(`resourceEditModel.ts`)是同一份口径的 +/// 前端镜像;改数字必须同时改这里、那里,以及工具 schema 里按 kind 声明 `maxLength`。 +pub(crate) fn resource_edit_prompt_max_chars(edit_kind: &LocalProjectResourceEditKind) -> usize { match edit_kind { LocalProjectResourceEditKind::BackgroundMusic => 140, LocalProjectResourceEditKind::SoundEffect => 1_900, @@ -739,6 +748,24 @@ fn resource_edit_prompt_max_chars(edit_kind: &LocalProjectResourceEditKind) -> u } } +/// 提示词超限的拒绝文案:与上限同一个口径,MCP 层、工具桥和提交校验复用同一条字符串, +/// 保证模型看到的数字就是真实生效的数字。 +pub(crate) fn resource_edit_prompt_limit_error( + edit_kind: &LocalProjectResourceEditKind, + max_chars: usize, +) -> String { + format!( + "{}资源编辑提示词必须在 1..={max_chars} 字符内", + match edit_kind { + LocalProjectResourceEditKind::BackgroundMusic => "背景音乐", + LocalProjectResourceEditKind::SoundEffect => "音效", + LocalProjectResourceEditKind::Video => "视频", + LocalProjectResourceEditKind::CharacterAnimation => "角色动画", + _ => "", + } + ) +} + fn normalize_resource_edit_prompt( edit_kind: &LocalProjectResourceEditKind, value: &str, @@ -746,16 +773,7 @@ fn normalize_resource_edit_prompt( let value = value.trim(); let max_chars = resource_edit_prompt_max_chars(edit_kind); if value.is_empty() || value.chars().count() > max_chars { - return Err(format!( - "{}资源编辑提示词必须在 1..={max_chars} 字符内", - match edit_kind { - LocalProjectResourceEditKind::BackgroundMusic => "背景音乐", - LocalProjectResourceEditKind::SoundEffect => "音效", - LocalProjectResourceEditKind::Video => "视频", - LocalProjectResourceEditKind::CharacterAnimation => "角色动画", - _ => "", - } - )); + return Err(resource_edit_prompt_limit_error(edit_kind, max_chars)); } if value .chars() diff --git a/apps/ai-game-creator-shell/src/view/project-development/resourceEditModel.ts b/apps/ai-game-creator-shell/src/view/project-development/resourceEditModel.ts index ae4bfe73e..4d739bec6 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/resourceEditModel.ts +++ b/apps/ai-game-creator-shell/src/view/project-development/resourceEditModel.ts @@ -224,6 +224,12 @@ export function defaultCharacterAnimationResourceName( return `${resourceBaseName(resource) || '资源'}-角色动画`; } +/** + * 资源编辑提示词上限:与 Rust `resource_edit_prompt_max_chars` + * (`src-tauri/src/project/resource_editor.rs`)逐值同口径,UI、资源编辑提交、 + * `agc_tools` MCP 工具层与客户端工具桥共用同一组数字。改这里必须同时改那里, + * 并按 kind 同步 `direct_tools_mcp.rs` 工具 schema 里的 `prompt.maxLength`。 + */ export function resourceEditPromptMaxLength( editKind: LocalProjectResourceEditKind, ) { diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index a4ca70a6f..bfe0bdeb7 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -2,6 +2,17 @@ > 用途:记录已经确认、会影响后续开发的长期技术/产品/协作决策。短期讨论不要写在这里。 > 当前口径:历史条目的旧路径、旧版本和已退役对象只用于追溯,不构成现行实现依据;如与当前代码或 `docs/README.md` 冲突,以当前代码和最新专题文档为准。 + +## 2026-09-17 `agc_tools` 媒体资源提示词上限收敛为单一口径,并按 kind 暴露给模型 + +- 背景:有人反馈「客户端没法由 agent 调用图片快速编辑功能以及背景音乐生成功能」。核查后工具本身都在(`agc_edit_image` / `agc_create_or_derive_resource`),图片快速编辑在 2026-09-14 的真实项目日志里也有成功记录;但存在三类真实缺陷:① `agc_create_or_derive_resource` 的 `prompt` 在 schema 里只声明 4000,真实上限却是按 kind 分的(背景音乐 140、音效 1900、视频/角色动画 4000、图片 32000),MCP 层还额外写死了一条 140 判断,模型从 schema 与 skill 都看不出 140/1900,写一句正常长度的背景音乐描述就当场被拒;② 客户端 UI 用同一口径但会截断并提示,agent 侧却只有硬拒,形成「UI 能做、agent 调不动」的观感;③ `sourceLocalAssetId` 不是已登记资源时只报「不属于当前项目已登记资源」,模型会原地重试而不会先登记。 +- 决策一(单一口径):提示词上限只由 `resource_edit_prompt_max_chars` 给出,MCP 工具层、客户端受控工具桥与提交校验全部从它取数;超限文案复用 `resource_edit_prompt_limit_error`,保证模型看到的数字就是真实生效的数字。传输层边界只在信封级生效,不再用一个更小的通用常量先于按 kind 上限误报。 +- 决策二(按 kind 暴露):`agc_create_or_derive_resource` 的 schema 用 `allOf[oneOf]` 逐 kind 声明 `prompt.maxLength`(background-music / sound-effect / video+character-animation),顶层 `maxLength` 等于各 kind 上限的最大值,`prompt` 描述里写明每个数字;`agc_edit_image` 继续用图片口径 32000。skill 包 `agc-client-projection`(SKILL.md 与 `references/projection-contract.md`)同步写明四个数字,并说明超限要在本地收敛而不是原样重发。 +- 决策三(可执行的前置提示):源资源未登记时统一返回「先用 `agc_list_registered_assets` 选已有 localAssetId;文件只在项目里时先用 `agc_list_project_files` 确认 `assetImportable=true`,再用 `agc_import_account_assets.localPaths` 登记后重试」。本轮不放开「已完成任务产物」在 agent 侧的隐式正规化:登记是带副作用与 revision 推进的事务,必须由模型显式发起。 +- 影响范围:`apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs`(上限与文案的唯一口径)、`agent/direct_tool_bridge.rs`(按 kind 判定与未登记源资源提示)、`agent/direct_tools_mcp.rs`(schema 与校验)、`resources/agc-skills/agc-client-projection/**` 与清单指纹(version `2026-08-26.18`)。**未改** `/api/external/v1` 契约与 OpenAPI、SpacetimeDB schema、前端 TS 侧 `resourceEditPromptMaxLength` 数字、客户端 UI 行为。 +- 验证方式:新增 `tool_prompt_limits_agree_with_the_client_authority`(四个 kind 的 schema 上限、MCP 校验与客户端权威口径同数字,超限文案带真实上限)、`bridge_resource_prompt_limits_follow_the_client_authority`(工具桥侧同类门禁,含图片编辑的 32000 边界)、`edit_image_tool_reaches_the_platform_image_edit_route` 与 `background_music_tool_reaches_the_platform_audio_route`(MCP 工具层 → 真实工具桥 → 假平台,断言 `/api/editor/images/edits` 与 `/api/editor/audios/background-music/generations` 的路径、Bearer、Idempotency-Key、正文与派生资源落盘,图片编辑正文不得回填 assetKind)、`background_music_prompt_over_the_limit_is_rejected_before_any_bridge_call`(超限在桥请求之前失败)、`unregistered_source_reports_the_registration_follow_up_tools`;`agent::direct_tools_mcp` 22 passed、`agent::skill_pack` 4 passed、`agent::direct_tool_bridge` 17 passed(7 条本机既有失败见下)、`npm run agc:skill-pack:check` 与 `skill-pack:test` 通过。本机 `tempfile::tempdir()` 归属校验失败导致的既有用例(`project::resource_editor` 45 条、`agent::direct_tool_bridge` 7 条)在本轮改动前后**同为失败**(stash 基线复跑确认),与本次无关。 +- 关联文档:[AI游戏创作智能体App实施计划](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md)、[踩坑记录](pitfalls.md)。 + ## 2026-09-16 抠图模式与背景色契约 - External v1 抠图和 AGC `agc_remove_background` 支持 `complex`(语义分割识别前景)与 `flat`(纯色背景抠图);明确纯色背景优先 flat,模式缺省仍为 complex,主站前端保持现有行为。 diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index 24a21eea8..8127774b5 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -12,6 +12,14 @@ JSON 的文本读取分支不等于卡面应该展示原始 State 摘要。卡 工作台向窗口标题栏发布运行项目时,若 effect 依赖普通函数派生的回调,发布 Context 会重新渲染工作台,进而再次发布并清理,形成更新深度循环。转发入口须稳定,并在提交阶段更新实际处理器引用;发布数据变化与卸载清理分开。回归测试必须组合真实窗口 Provider 和工作台消费者,只有独立画布测试无法覆盖这条反馈链;回归时用有界发布次数阻止测试失控。画布快速操作时暴露的更新深度错误,也须检查外层状态同步,不能直接归因于滚轮频率。 +## 2026-09-17 工具 schema 声明的上限与真实校验不一致,会表现成「agent 调不动这个功能」 + +- **现象**:用户反馈「客户端没法由 agent 调用图片快速编辑功能以及背景音乐生成功能」。查工具目录时两个工具都在(`agc_edit_image`、`agc_create_or_derive_resource`),图片快速编辑在真实项目日志里还有成功记录;但 agent 侧写一句正常长度的背景音乐描述就失败,而客户端 UI 用同一个提示词却只是被截断加提示。 +- **原因**:`agc_create_or_derive_resource.prompt` 在 MCP schema 里只声明 `maxLength: 4000`,真实上限按 kind 分(背景音乐 140 / 音效 1900 / 视频、角色动画 4000 / 图片 32000),MCP 层还额外写死一条 `kind == background-music && > 140` 的判断;skill 包没有任何一处写这两个数字。模型从 schema 与 skill 都无法得知 140,于是必然踩一次硬拒。同类隐患还有两处:客户端工具桥用通用 4000 校验 prompt,会把 4000 以上的图片编辑提示词误报成「超出安全边界」;按 kind 校验散落在 MCP 与桥两处,新增类型容易只改一处。 +- **处理**:上限收敛到 `resource_edit_prompt_max_chars` 单一权威(工具层、桥、提交校验共用),超限文案复用 `resource_edit_prompt_limit_error`;工具 schema 用 `allOf[oneOf]` 逐 kind 声明 `prompt.maxLength` 并在描述里写明数字;prompt 的传输层边界退到信封级,避免通用常量先于按 kind 上限报错;两端 skill 文档同步写明四个数字。新增 `tool_prompt_limits_agree_with_the_client_authority` 作为门禁:四类 kind 的 schema 上限、桥上限与权威口径必须同数字,且超限文案必须带真实上限。 +- **验证**:`cargo test --bin genarrative-ai-game-creator-shell -- --test-threads=1 agent::direct_tools_mcp::tests`(22 passed,含两条走 MCP 工具层 → 真实工具桥 → 假平台的媒体工具契约用例与一条超限零请求用例)、`agent::direct_tool_bridge::tests`(17 passed,含新增的按 kind 上限门禁;另有 7 条本机既有失败)、`agent::skill_pack`(4 passed)、`npm run agc:skill-pack:check`。本机 `tempfile::tempdir()` 归属校验失败会让 `project::resource_editor` 45 条与 `agent::direct_tool_bridge` 7 条既有用例失败,改动前后同为失败,不要据此误判回归。 +- **关联**:`apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs`、`src-tauri/src/agent/direct_tool_bridge.rs`、`src-tauri/src/agent/direct_tools_mcp.rs`、`src-tauri/resources/agc-skills/agc-client-projection/`。 + ## 2026-09-16 从 Codex 里启动 AGC 客户端会看到被重定向的 `%APPDATA%` - **现象**:在 Codex 会话里用 `Start-Process` 启动 `genarrative-ai-game-creator-shell.exe` 做排障时,子进程写 `C:\Users\\AppData\Roaming\world.genarrative.ai-game-creator\...` 的内容会落到 `C:\Users\\AppData\Local\Packages\OpenAI.Codex_2p2nqsd0c76g0\LocalCache\Roaming\...`;同一个 `Test-Path` / `Get-ChildItem` 命中的是重定向视图,只有 `\\?\C:\Users\...` 形式能区分真实路径。 diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index 4c39954dc..7ead451b0 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -150,6 +150,7 @@ npm 游戏的可预览产物固定为对应 package 目录下的 `dist/index.htm ## 2026-08-24 Direct Codex 已登记资源查询与媒体生成语义工具 - `agc_tools` 新增 `agc_list_registered_assets` 与 `agc_create_or_derive_resource`。前者按 `kind / assetId / offset / limit` 有界查询客户端权威 manifest,并可显式返回角色动画正式序列帧的稳定 objectKey、assetObjectId 和尺寸;结果不包含完整 manifest、prompt、model、provider route、签名 URL、宿主路径或凭据。后者只接受 `kind / mode / sourceLocalAssetId / prompt / assetName`,`create` 仅允许无源视频、音效和背景音乐,`derive` 必须引用当前项目已登记的 localAssetId,角色动画固定为 derive。 +- `prompt` 上限按 `kind` 分别生效,且工具 schema、MCP 校验、客户端工具桥与提交校验共用同一权威口径(`resource_edit_prompt_max_chars`):背景音乐 140、音效 1900、视频与角色动画 4000、图片编辑 32000。schema 逐 kind 声明 `maxLength` 并在 `prompt` 描述里写明数字,超限必须在发起任何桥请求与付费提交之前失败并回报真实上限;`sourceLocalAssetId` 不是当前项目已登记资源时,错误文案必须直接给出 `agc_list_registered_assets` 与 `agc_list_project_files` → `agc_import_account_assets.localPaths` 两步后续动作。 - 项目路径、projectId、当前 revision、源文件路径与媒体类型、operationId、Idempotency-Key、登录态、项目锁、付费提交、轮询恢复、下载校验与 manifest 事务全部由客户端持有。模型不能提交或覆盖这些字段。同一 Direct `clientTurnId + 规范语义参数` 生成稳定 UUID v4 身份;单回合同参重试复用原 operation,不同请求串行且最多四项。跨回合存在完全匹配的 pending 账本时优先恢复原 operation,不能换键重发。 - 资源查询同时投影未完成 operation 的安全状态。媒体工具成功只返回 operation、本地相对路径、资源类型、Canvas/resource/asset/task 身份、正式序列帧以及脱敏后的 `warnings / sliceWarnings`;错误继续使用统一脱敏边界。客户端资源账本持久化 completed 结果的两类告警,committed replay 不能把历史告警伪装成空集合。 - 角色动画、视频、音效和背景音乐在构造新的远端请求前统一准备当前项目同名画布与素材目录上下文,并在端点支持时携带 `projectId / assetFolderId / canvasCompletion`。角色动画 placeholder 使用源图片真实宽高,避免非方形角色进入画布时失真;正式 resource/asset 与序列帧继续直接复用 External 返回身份,不从首帧伪造重复资源。已有冻结 request body 或已受理 operation 保持不变,不因本次升级重建请求或重复扣费。 From ebc5dfe7db0206b255ac164cbf62ee03b2d0c18c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=94=E4=BB=A4=E5=BC=98?= Date: Thu, 17 Sep 2026 14:58:21 +0800 Subject: [PATCH 09/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=AD=96=E5=88=92?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E4=B9=B1=E5=BA=8F=E5=B1=80=E9=83=A8=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=AF=BC=E8=87=B4=E7=9A=84=E4=B8=AD=E6=96=AD=20(#399)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按原文位置排序并顺序拼接补丁,避免替换偏移失效。 新增乱序、中文与长度变化的局部修改回归测试。 同步策划 Agent 批量局部修改技术说明。 Reviewed-on: http://genarrative-station/git/GenarrativeAI/Genarrative/pulls/399 --- .../src-tauri/src/agent/design_tools.rs | 40 +++++++++++++++++-- ...案】AI游戏创作智能体App实施计划-2026-06-24.md | 4 ++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/design_tools.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/design_tools.rs index 730d68004..ba4420164 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/design_tools.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/design_tools.rs @@ -380,11 +380,16 @@ pub(crate) fn execute_design_file_tool( } return Err(details.join("\n")); } - let mut updated = content.clone(); - for (index, start, end) in matches.into_iter().rev() { + matches.sort_unstable_by_key(|(_, start, _)| *start); + let mut updated = String::with_capacity(content.len()); + let mut cursor = 0; + for (index, start, end) in matches { let (_, new) = &normalized[index]; - updated.replace_range(start..end, new); + updated.push_str(&content[cursor..start]); + updated.push_str(new); + cursor = end; } + updated.push_str(&content[cursor..]); if updated == content { return Err(format!("没有产生修改:{display}")); } @@ -834,6 +839,35 @@ mod tests { assert!(!root.join("design_artifacts/notes").exists()); } + #[test] + fn patch_file_applies_out_of_order_edits_with_changing_utf8_lengths() { + let temp = test_root(); + let root = temp.path(); + execute_design_file_tool( + root, + "write_file", + &json!({"path":"notes/design.md","content":"开头\n甲\n保留一\n乙乙\n保留二\n丙\n结尾"}), + ) + .expect("write"); + execute_design_file_tool( + root, + "patch_file", + &json!({ + "path":"notes/design.md", + "edits":[ + {"old_text":"丙","new_text":"新的结论"}, + {"old_text":"甲","new_text":"扩展A"}, + {"old_text":"乙乙","new_text":"乙"} + ] + }), + ) + .expect("patch out of order"); + assert_eq!( + fs::read_to_string(root.join("design_artifacts/notes/design.md")).expect("read disk"), + "开头\n扩展A\n保留一\n乙\n保留二\n新的结论\n结尾" + ); + } + #[test] fn phase_context_injects_current_skill_only() { let resources = DesignResources::new(pack_root()).expect("pack"); diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index 7ead451b0..dec89f82b 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -1,5 +1,9 @@ # AI 游戏创作智能体 App 实施计划 +## 策划 Agent 批量局部修改 + +`patch_file` 的所有 edits 均匹配同一份原文件,参数顺序不影响结果。完成唯一匹配与不重叠校验后,按原文起点升序拼接未修改片段与替换文本,最后一次性写入;任一校验失败时不写文件。回归用例覆盖乱序 edits、中文内容与替换长度增减,并核对完整落盘内容。此行为仅属于策划 Agent 文件工具。 + ## 资源画布交互与工作台状态同步 - 工作台向窗口标题栏发布正在运行的项目时,输入未变化不得形成重复发布与清理的渲染循环;打开项目动作始终使用当前工作台处理逻辑,退出工作台后清除其标题栏状态。 From efdb364a5264a05fa61c4f764950d423a8c1f3cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 17 Sep 2026 15:54:07 +0800 Subject: [PATCH 10/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8E=A8=E7=90=86?= =?UTF-8?q?=E6=A1=A3=E5=BC=B9=E5=B1=82=E8=A2=AB=E8=A3=81=E5=89=AA=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E5=A2=9E=E5=8A=A0=20CSS=20=E8=A6=86=E7=9B=96?= =?UTF-8?q?=E5=A3=B0=E6=98=8E=E4=BB=A5=E7=A1=AE=E4=BF=9D=E7=AA=84=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E4=B8=8B=E5=BC=B9=E5=B1=82=E5=AE=8C=E6=95=B4=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ai-game-creator-shell/src/styles.css | 21 +++++++++++++++++++ .../appSurface/project-development.suite.ts | 14 +++++++++++++ docs/project-memory/shared-memory/pitfalls.md | 9 ++++++++ 3 files changed, 44 insertions(+) diff --git a/apps/ai-game-creator-shell/src/styles.css b/apps/ai-game-creator-shell/src/styles.css index 5b0352492..613ec51e4 100644 --- a/apps/ai-game-creator-shell/src/styles.css +++ b/apps/ai-game-creator-shell/src/styles.css @@ -8820,6 +8820,27 @@ iframe.preview-frame { overflow: hidden; } +/* 输入盒的弹层必须能溢出面板:控制排最左侧是「推理档」,它的菜单 + `.conversation-model-menu` 贴着触发钮右缘向左展开,窄布局(视口 ≤1000px 时对话面板 + 只有 280px 宽)下会伸到面板左侧之外;`.game-workbench-chat`、surface、conversation + 这三层 `overflow: hidden` 会沿着各自的溢出边界把它裁掉,档位文字正好落在被裁掉的 + 那半边,于是点开只能看到一个空盒子。所以这里让这三层不再裁切:菜单自身位置、 + 尺寸都不变,只是允许它盖到左侧面板上完整显示。消息列表自带 `overflow-y: auto` + (另一轴按规范计算为 auto),消息内容仍由列表自身裁剪。 */ +.game-workbench-chat:has(.project-supervisor-composer.is-direct-codex) { + overflow: visible; +} + +.game-workbench-chat .project-supervisor-surface.is-direct-codex { + overflow: visible; +} + +.game-workbench-chat + .project-supervisor-surface.is-direct-codex + .project-supervisor-conversation { + overflow: visible; +} + .game-workbench-chat .project-supervisor-message-list { height: 100%; min-height: 96px; diff --git a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts index f751841f6..422aff807 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts @@ -5853,6 +5853,20 @@ export function registerProjectWorkbenchFoundationTests() { expect(styles).toMatch( /\.game-workbench-chat \.project-supervisor-conversation\s*\{[^}]*position:\s*relative[^}]*display:\s*block[^}]*height:\s*100%[^}]*min-height:\s*0[^}]*overflow:\s*hidden/s, ); + // 输入盒里的弹层不能被上面这条(连同 surface、聊天列共三层)裁掉:控制排最左侧是 + // 「推理档」,它的菜单贴着触发钮右缘向左展开,窄布局(视口 ≤1000px 时面板只有 + // 280px 宽)下会伸到面板左侧之外,档位文字正好落在被裁掉的那半边,点开只剩一个空 + // 盒子。所以 direct-codex 这三层的裁切必须放开;菜单位置和尺寸不变,真机几何 + // (整块可见、位置不动)由浏览器实测确认,这里只钉声明。 + expect(styles).toMatch( + /\.game-workbench-chat:has\(\s*\.project-supervisor-composer\.is-direct-codex\s*\)\s*\{[^}]*overflow:\s*visible/s, + ); + expect(styles).toMatch( + /\.game-workbench-chat \.project-supervisor-surface\.is-direct-codex\s*\{[^}]*overflow:\s*visible/s, + ); + expect(styles).toMatch( + /\.game-workbench-chat\s+\.project-supervisor-surface\.is-direct-codex\s+\.project-supervisor-conversation\s*\{[^}]*overflow:\s*visible/s, + ); expect(styles).toMatch( /\.game-workbench-chat \.project-supervisor-message-list\s*\{[^}]*height:\s*100%[^}]*min-height:\s*96px[^}]*overflow-y:\s*auto[^}]*padding-bottom:\s*12px[^}]*scroll-padding-bottom:\s*12px/s, ); diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index 74092e946..a70b45712 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -1,5 +1,14 @@ # 踩坑与排障记录 +## 2026-09-17 AGC 输入盒的「推理档」弹层被祖先裁切:要放开裁切而不是挪弹层 + +- **现象**:窄窗口下(视口 ≤1000px 时右侧对话面板只有 280px 宽)点开输入盒右下角的「推理档」,弹层是个**空盒子**:档位文字(默认 / 低 / 中 / 高 / 最高)整片看不见,只剩一个方框。 +- **成因**:推理档是控制排里最靠左的弹层锚点,`.conversation-model-menu` 默认 `right: 0` 贴触发钮右缘**向左**展开;触发钮右边还压着模型选择、语音、发送三颗钮,所以 150px 宽的弹层在 280px 面板里会伸到面板左侧 42px 之外。`.game-workbench-chat`、`.project-supervisor-surface.is-direct-codex`、`.project-supervisor-conversation` 三层各自的 `overflow: hidden` 沿自己的溢出边界裁掉它,而档位文字起点才 14px(面板左内边距 5px + 按钮左内边距 9px),正好落在被裁掉的那半边。 +- **处理(用户指定口径)**:不挪弹层位置——只让 direct-codex 那三层不再裁切:`.game-workbench-chat:has(.project-supervisor-composer.is-direct-codex)`、`.game-workbench-chat .project-supervisor-surface.is-direct-codex`、`.game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-conversation` 三条 `overflow: visible`。弹层的 `right: 0`、尺寸和触发钮锚点全不变,只是允许它盖到左侧资源面板上完整显示。消息列表自带 `overflow-y: auto`(另一轴按规范计算为 auto),消息内容仍由列表自身裁剪。 +- **易错点**:① 把弹层改成 `left: 0` 或往右挪也能让它可见,但那是改变展开方向,弹层会跑到触发钮右边(用户明确否决);② 只放开最外层聊天列不够——surface 与 conversation 各自都会裁,三层必须同时放开;③ 只按宽度比大小会误判:280px 面板里控制排本身也超出(发送钮右侧溢出 22px,被窗口右缘吃掉),那不是本条的原因,别顺手去改控制排布局。 +- **验证**:`apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts` 的 `keeps the landscape workbench edge-to-edge with internal chat scrolling` 钉住三条 override 声明在场(删掉任一条即红)。真机几何用 playwright-cli 打开一份只含真实 `styles.css` 与真实 composer DOM 的最小复现页实测(视口 1000×700、面板 280px):弹层 rect 修复前后都是 `[-42, 108]`(位置未动),`elementFromPoint` 的命中区间从修复前的 `[2, 108]` 变成整块;档位文字在截图中完整可见。 +- **关联**:`apps/ai-game-creator-shell/src/styles.css`(`面板纵向布局(2026-07 Codex 风格改造)` 区块之后)、`apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts`。 + ## 2026-09-16 从 Codex 里启动 AGC 客户端会看到被重定向的 `%APPDATA%` - **现象**:在 Codex 会话里用 `Start-Process` 启动 `genarrative-ai-game-creator-shell.exe` 做排障时,子进程写 `C:\Users\\AppData\Roaming\world.genarrative.ai-game-creator\...` 的内容会落到 `C:\Users\\AppData\Local\Packages\OpenAI.Codex_2p2nqsd0c76g0\LocalCache\Roaming\...`;同一个 `Test-Path` / `Get-ChildItem` 命中的是重定向视图,只有 `\\?\C:\Users\...` 形式能区分真实路径。 From 1b579acf474031382b10efe01a44c2477bbf816f Mon Sep 17 00:00:00 2001 From: Linghong Date: Thu, 17 Sep 2026 08:22:52 +0000 Subject: [PATCH 11/35] =?UTF-8?q?=E6=8F=90=E9=AB=98=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AFLLM=E9=BB=98=E8=AE=A4=E9=87=8D=E8=AF=95=E6=AC=A1?= =?UTF-8?q?=E6=95=B0=E5=88=B010=20=E5=86=85=E7=BD=AE=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=80=BC=20DEFAULT=5FGAME=5FCREATOR=5FLLM=5FMAX=5FRETRIES=20?= =?UTF-8?q?=E7=94=B1=202=20=E6=94=B9=E4=B8=BA=2010=20=E9=9A=8FApp=E5=88=86?= =?UTF-8?q?=E5=8F=91=E7=9A=84=E9=85=8D=E7=BD=AE=E6=A8=A1=E6=9D=BF=20game-c?= =?UTF-8?q?reator.config.json=20=E7=9A=84=20maxRetries=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E4=B8=BA=2010=20=E8=AE=BE=E7=BD=AE=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E6=A1=86=E8=8D=89=E7=A8=BF=E5=85=9C=E5=BA=95=E5=80=BC=20maxRet?= =?UTF-8?q?ries=20=E5=90=8C=E6=AD=A5=E4=B8=BA=2010?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ai-game-creator-shell/game-creator.config.json | 2 +- apps/ai-game-creator-shell/src-tauri/src/main.rs | 2 +- .../src/features/runtime-config/RuntimeConfigDialog.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/ai-game-creator-shell/game-creator.config.json b/apps/ai-game-creator-shell/game-creator.config.json index b6193445f..3c0005da3 100644 --- a/apps/ai-game-creator-shell/game-creator.config.json +++ b/apps/ai-game-creator-shell/game-creator.config.json @@ -15,7 +15,7 @@ "autoCompactTokenLimit": 64000, "toolOutputTokenLimit": 12000, "requestTimeoutMs": 180000, - "maxRetries": 2, + "maxRetries": 10, "retryBackoffMs": 500 }, "agentLlm": {} diff --git a/apps/ai-game-creator-shell/src-tauri/src/main.rs b/apps/ai-game-creator-shell/src-tauri/src/main.rs index fe77f4532..6a57de8e2 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/main.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/main.rs @@ -1561,7 +1561,7 @@ const DEFAULT_GAME_CREATOR_LLM_REASONING_EFFORT: &str = "high"; const DEFAULT_GAME_CREATOR_LLM_CONTEXT_WINDOW_TOKENS: u64 = 128_000; const DEFAULT_GAME_CREATOR_LLM_AUTO_COMPACT_TOKEN_LIMIT: u64 = 64_000; const DEFAULT_GAME_CREATOR_LLM_TOOL_OUTPUT_TOKEN_LIMIT: u64 = 12_000; -const DEFAULT_GAME_CREATOR_LLM_MAX_RETRIES: u32 = 2; +const DEFAULT_GAME_CREATOR_LLM_MAX_RETRIES: u32 = 10; fn default_game_creator_agent_mode() -> String { GAME_CREATOR_AGENT_MODE_CODEX_APP_SERVER.to_string() diff --git a/apps/ai-game-creator-shell/src/features/runtime-config/RuntimeConfigDialog.tsx b/apps/ai-game-creator-shell/src/features/runtime-config/RuntimeConfigDialog.tsx index a12f99ff8..16feb1f76 100644 --- a/apps/ai-game-creator-shell/src/features/runtime-config/RuntimeConfigDialog.tsx +++ b/apps/ai-game-creator-shell/src/features/runtime-config/RuntimeConfigDialog.tsx @@ -64,7 +64,7 @@ const defaultRuntimeConfigDraft: GameCreatorAppConfig = { autoCompactTokenLimit: 64000, toolOutputTokenLimit: 12000, requestTimeoutMs: 180000, - maxRetries: 2, + maxRetries: 10, retryBackoffMs: 500, }, agentLlm: {}, From de9e8e0c7fe8c5af263ee0a35bd71b120e5fd71c Mon Sep 17 00:00:00 2001 From: Linghong Date: Thu, 17 Sep 2026 17:03:45 +0800 Subject: [PATCH 12/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E6=97=B6=E9=BB=98=E8=AE=A4=E9=87=8D=E8=AF=95=E6=AC=A1=E6=95=B0?= =?UTF-8?q?=E7=9A=84=E6=B5=8B=E8=AF=95=E6=96=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将恢复默认配置的重试次数断言同步为10。 补充默认配置变更时的测试核对规则。 --- .../tests/appSurface/runtime-settings.suite.ts | 2 +- docs/project-memory/shared-memory/development-workflow.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/ai-game-creator-shell/tests/appSurface/runtime-settings.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/runtime-settings.suite.ts index d78f10a0d..78c1da3c1 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/runtime-settings.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/runtime-settings.suite.ts @@ -1034,7 +1034,7 @@ export function registerPublishedRuntimeSettingsTests() { autoCompactTokenLimit: 64000, toolOutputTokenLimit: 12000, requestTimeoutMs: 180000, - maxRetries: 2, + maxRetries: 10, retryBackoffMs: 500, }), agentLlm: {}, diff --git a/docs/project-memory/shared-memory/development-workflow.md b/docs/project-memory/shared-memory/development-workflow.md index 36fbbe575..0003dbf5e 100644 --- a/docs/project-memory/shared-memory/development-workflow.md +++ b/docs/project-memory/shared-memory/development-workflow.md @@ -51,6 +51,8 @@ ## 验证路由 +AGC 运行时配置默认值调整时,同步核对 Rust 默认值、分发配置模板、设置弹窗默认草稿和 `runtime-settings.suite.ts` 的恢复默认断言;显式传入旧值的配置读取用例仍验证原值保留,不批量替换测试数据。 + AGC 测试构造单 HTML 项目时,必须在初始化之前写入 HTML,避免自动建立 npm 工程;npm 预览和导出测试应提供 dist 产物。已有图片生成 pending/operation 属于持久化恢复合同,修改工具默认参数后仍须验证旧动作恢复不重复提交、不因默认值变化被误判为新意图。 SpacetimeDB 任务统一先读取 `.codex/skills/genarrative-spacetimedb/SKILL.md`;该项目适配层按需调用已安装的官方 `spacetimedb` 插件 skill,插件提供通用 SDK/CLI/MCP 知识,项目 skill 负责 Genarrative 架构边界和验证门禁。 From 5db407c3dc5d6a67d19655b552a266a29e1295ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B5=E8=88=92=E5=BA=B7?= Date: Thu, 17 Sep 2026 17:48:06 +0800 Subject: [PATCH 13/35] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20AGC=20=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E5=BA=93=E4=B8=8E=E7=94=B1=E6=A8=A1=E6=9D=BF=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E9=A1=B9=E7=9B=AE=E9=93=BE=E8=B7=AF=20(#396)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 交付范围 - OSS `agc-dev` bucket 的 `templates/` 前缀作为 AGC 游戏模板库(**去掉 `agc/` 这一层**;`agc/` 继续只放客户端安装包与更新清单)。 - 模板正文改为 zip(zip 根 == AGC 项目根,如 `game/index.html`);清单补齐 `tags`、封面字段与包大小/摘要,`templateVersion` 用于判断是否需要重下。 - 客户端:Rust 模板库模块、模板库全屏页、首页模板推荐位、左侧导航入口。 ## 客户端行为 - `fetch_game_template_library`:读取并校验清单(≤4 MiB),缓存到 `/templates/index.json`;网络失败回退本机缓存并标注 `source=cache`。 - `download_game_template`:按清单下载 zip(≤512 MiB),校验字节数与 SHA-256 后解压到 `/templates/installed///`,最后写 `installed.json` 作为安装完成标记。 - `create_automatic_local_game_project_from_template`:先把模板文件铺进新项目目录,再走既有 `init_local_game_project_at` 补 `.agent` 清单与标准目录;失败删除半成品目录。 - 解压只接受普通文件与目录(拒绝绝对路径、`..`、盘符、符号链接),安装目录名由标识符白名单拼出;远端只信「受信任 OSS 主机 + 对象键」,清单里的地址字段不参与请求。 - UI:搜索(空白分隔多关键词「与」)、标签/运行时筛选、仅看已下载、封面卡片与已下载徽标;「使用模板」在版本落后时先重下再建项。 ## 文档与脚本 - 主规范 `docs/technical/【技术方案】AGC模板库与模板建项-2026-09-17.md`;里程碑与实施计划见 `docs/project-memory/plans/`;`decision-log.md` 记录库路径、清单 schema、安装缓存目录与 CSP 约定。 - 发布脚本 `scripts/agc-template-library-publish.mjs`(`--dry-run` 校验 → 上传 → 回读校验)。 - 首页「灵感推荐」替换为模板库推荐位,删除本机灵感图目录与 `InspirationGallery.tsx`;`tauri.conf.json` 的 `img-src` 放行受信任 OSS 主机用于加载封面。 ## 验证 - `cargo test --bin genarrative-ai-game-creator-shell template_library`:9 passed;`--ignored` 真连检查 `fetches_the_live_template_library_index` 通过。 - `npx vitest run src/features/template-library`:9 passed。 - `npm run typecheck`、`cargo fmt --check`、`npm run check:encoding`、`node scripts/check-doc-index.mjs`、`git diff --check` 均通过。 - OSS 侧匿名复核:`templates/index.json`、各 `cover.png` 与 `template.zip` 均返回 200。 ## 未做 / 待确认 - 本轮未做客户端点击级人工验收(下一步单独验证并把结果补进此 PR)。 - 模板封面目前是占位标题卡,正式封面由后续模板包提供。 --------- Co-authored-by: kdletters <61648117+kdletters@users.noreply.github.com> Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/396 --- apps/ai-game-creator-shell/package.json | 2 + .../src-tauri/Cargo.toml | 3 + .../src-tauri/src/main.rs | 5 + .../src-tauri/src/template_library.rs | 1272 +++++++++++++++++ .../src-tauri/tauri.conf.json | 4 +- .../fixtures/agc-template-library-index.json | 133 ++ .../src/components/WindowChrome.tsx | 31 +- .../agent-runtime/directActiveTurns.ts | 21 +- .../features/app-shell/WorkspaceLauncher.tsx | 35 +- .../app-shell/useHomeProjectCreation.ts | 30 + .../template-library/templateLibraryGrid.ts | 96 ++ .../template-library/templateLibraryModel.ts | 208 +++ .../template-library/useTemplateLibrary.ts | 243 ++++ .../src/view/home/InspirationGallery.tsx | 81 -- .../src/view/home/TemplateRecommendations.tsx | 96 ++ .../assets/inspiration/inspiration-01.webp | Bin 37308 -> 0 bytes .../assets/inspiration/inspiration-02.webp | Bin 28182 -> 0 bytes .../assets/inspiration/inspiration-03.webp | Bin 11080 -> 0 bytes .../assets/inspiration/inspiration-04.webp | Bin 23894 -> 0 bytes .../assets/inspiration/inspiration-05.webp | Bin 29646 -> 0 bytes .../assets/inspiration/inspiration-06.webp | Bin 15322 -> 0 bytes .../assets/inspiration/inspiration-07.webp | Bin 29706 -> 0 bytes .../assets/inspiration/inspiration-08.webp | Bin 18670 -> 0 bytes .../assets/inspiration/inspiration-09.webp | Bin 40460 -> 0 bytes .../assets/inspiration/inspiration-10.webp | Bin 13172 -> 0 bytes .../assets/inspiration/inspiration-11.webp | Bin 24782 -> 0 bytes .../assets/inspiration/inspiration-12.webp | Bin 35954 -> 0 bytes .../assets/inspiration/inspiration-13.webp | Bin 13582 -> 0 bytes .../assets/inspiration/inspiration-14.webp | Bin 31682 -> 0 bytes .../assets/inspiration/inspiration-15.webp | Bin 61920 -> 0 bytes .../assets/inspiration/inspiration-16.webp | Bin 33914 -> 0 bytes .../assets/inspiration/inspiration-17.webp | Bin 21398 -> 0 bytes .../assets/inspiration/inspiration-18.webp | Bin 8544 -> 0 bytes .../assets/inspiration/inspiration-19.webp | Bin 36876 -> 0 bytes .../assets/inspiration/inspiration-20.webp | Bin 19654 -> 0 bytes .../assets/inspiration/inspiration-21.webp | Bin 34522 -> 0 bytes .../assets/inspiration/inspiration-22.webp | Bin 18444 -> 0 bytes .../assets/inspiration/inspiration-23.webp | Bin 40962 -> 0 bytes .../assets/inspiration/inspiration-24.webp | Bin 184236 -> 0 bytes .../assets/inspiration/inspiration-25.webp | Bin 186364 -> 0 bytes .../src/view/home/index.tsx | 30 +- .../ai-game-creator-shell/src/view/layout.tsx | 15 + .../view/template-library/TemplateCard.tsx | 139 ++ .../src/view/template-library/index.tsx | 430 ++++++ .../v1/blank-2d-canvas/cover.svg | 13 + .../v1/blank-2d-canvas/meta.json | 18 + .../blank-2d-canvas/project/game/index.html | 10 + .../v1/blank-2d-canvas/project/game/main.js | 30 + .../blank-2d-canvas/project/game/package.json | 12 + .../v1/blank-2d-canvas/project/game/style.css | 3 + .../project/game/vite.config.js | 7 + .../v1/blank-3d-scene/cover.svg | 13 + .../v1/blank-3d-scene/meta.json | 18 + .../v1/blank-3d-scene/project/game/index.html | 10 + .../v1/blank-3d-scene/project/game/main.js | 38 + .../blank-3d-scene/project/game/package.json | 15 + .../v1/blank-3d-scene/project/game/style.css | 3 + .../project/game/vite.config.js | 7 + .../template-library/v1/blank-web/cover.svg | 13 + .../template-library/v1/blank-web/meta.json | 18 + .../v1/blank-web/project/game/index.html | 10 + .../v1/blank-web/project/game/main.js | 2 + .../v1/blank-web/project/game/package.json | 12 + .../v1/blank-web/project/game/style.css | 2 + .../v1/blank-web/project/game/vite.config.js | 7 + .../v1/phaser-2d-starter/cover.svg | 13 + .../v1/phaser-2d-starter/meta.json | 18 + .../v1/phaser-2d-starter/project/game/game.js | 21 + .../phaser-2d-starter/project/game/index.html | 9 + .../project/game/package-lock.json | 1138 +++++++++++++++ .../project/game/package.json | 15 + .../phaser-2d-starter/project/game/style.css | 2 + .../project/game/vite.config.js | 7 + .../v1/threejs-3d-starter/cover.svg | 13 + .../v1/threejs-3d-starter/meta.json | 18 + .../project/game/index.html | 10 + .../threejs-3d-starter/project/game/main.js | 43 + .../project/game/package.json | 15 + .../threejs-3d-starter/project/game/style.css | 3 + .../project/game/vite.config.js | 7 + .../tests/directActiveTurns.test.tsx | 262 ++-- .../tests/templateLibraryGrid.test.ts | 108 ++ .../tests/templateLibraryModel.test.ts | 183 +++ .../tests/templateLibraryView.test.tsx | 494 +++++++ docs/README.md | 1 + ...实施计划】AGC模板库客户端接入-2026-09-17.md | 59 + ...里程碑】AGC模板库客户端接入-2026-09-17.md | 40 + .../shared-memory/decision-log.md | 10 + docs/project-memory/shared-memory/pitfalls.md | 8 + ...技术方案】AGC模板库与模板建项-2026-09-17.md | 136 ++ package-lock.json | 23 + scripts/agc-template-library-publish.mjs | 522 +++++++ 92 files changed, 6110 insertions(+), 203 deletions(-) create mode 100644 apps/ai-game-creator-shell/src-tauri/src/template_library.rs create mode 100644 apps/ai-game-creator-shell/src-tauri/tests/fixtures/agc-template-library-index.json create mode 100644 apps/ai-game-creator-shell/src/features/template-library/templateLibraryGrid.ts create mode 100644 apps/ai-game-creator-shell/src/features/template-library/templateLibraryModel.ts create mode 100644 apps/ai-game-creator-shell/src/features/template-library/useTemplateLibrary.ts delete mode 100644 apps/ai-game-creator-shell/src/view/home/InspirationGallery.tsx create mode 100644 apps/ai-game-creator-shell/src/view/home/TemplateRecommendations.tsx delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-01.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-02.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-03.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-04.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-05.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-06.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-07.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-08.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-09.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-10.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-11.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-12.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-13.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-14.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-15.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-16.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-17.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-18.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-19.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-20.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-21.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-22.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-23.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-24.webp delete mode 100644 apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-25.webp create mode 100644 apps/ai-game-creator-shell/src/view/template-library/TemplateCard.tsx create mode 100644 apps/ai-game-creator-shell/src/view/template-library/index.tsx create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-2d-canvas/cover.svg create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-2d-canvas/meta.json create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-2d-canvas/project/game/index.html create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-2d-canvas/project/game/main.js create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-2d-canvas/project/game/package.json create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-2d-canvas/project/game/style.css create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-2d-canvas/project/game/vite.config.js create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-3d-scene/cover.svg create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-3d-scene/meta.json create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-3d-scene/project/game/index.html create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-3d-scene/project/game/main.js create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-3d-scene/project/game/package.json create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-3d-scene/project/game/style.css create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-3d-scene/project/game/vite.config.js create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-web/cover.svg create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-web/meta.json create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-web/project/game/index.html create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-web/project/game/main.js create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-web/project/game/package.json create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-web/project/game/style.css create mode 100644 apps/ai-game-creator-shell/template-library/v1/blank-web/project/game/vite.config.js create mode 100644 apps/ai-game-creator-shell/template-library/v1/phaser-2d-starter/cover.svg create mode 100644 apps/ai-game-creator-shell/template-library/v1/phaser-2d-starter/meta.json create mode 100644 apps/ai-game-creator-shell/template-library/v1/phaser-2d-starter/project/game/game.js create mode 100644 apps/ai-game-creator-shell/template-library/v1/phaser-2d-starter/project/game/index.html create mode 100644 apps/ai-game-creator-shell/template-library/v1/phaser-2d-starter/project/game/package-lock.json create mode 100644 apps/ai-game-creator-shell/template-library/v1/phaser-2d-starter/project/game/package.json create mode 100644 apps/ai-game-creator-shell/template-library/v1/phaser-2d-starter/project/game/style.css create mode 100644 apps/ai-game-creator-shell/template-library/v1/phaser-2d-starter/project/game/vite.config.js create mode 100644 apps/ai-game-creator-shell/template-library/v1/threejs-3d-starter/cover.svg create mode 100644 apps/ai-game-creator-shell/template-library/v1/threejs-3d-starter/meta.json create mode 100644 apps/ai-game-creator-shell/template-library/v1/threejs-3d-starter/project/game/index.html create mode 100644 apps/ai-game-creator-shell/template-library/v1/threejs-3d-starter/project/game/main.js create mode 100644 apps/ai-game-creator-shell/template-library/v1/threejs-3d-starter/project/game/package.json create mode 100644 apps/ai-game-creator-shell/template-library/v1/threejs-3d-starter/project/game/style.css create mode 100644 apps/ai-game-creator-shell/template-library/v1/threejs-3d-starter/project/game/vite.config.js create mode 100644 apps/ai-game-creator-shell/tests/templateLibraryGrid.test.ts create mode 100644 apps/ai-game-creator-shell/tests/templateLibraryModel.test.ts create mode 100644 apps/ai-game-creator-shell/tests/templateLibraryView.test.tsx create mode 100644 docs/project-memory/plans/【实施计划】AGC模板库客户端接入-2026-09-17.md create mode 100644 docs/project-memory/plans/【里程碑】AGC模板库客户端接入-2026-09-17.md create mode 100644 docs/technical/【技术方案】AGC模板库与模板建项-2026-09-17.md create mode 100644 scripts/agc-template-library-publish.mjs diff --git a/apps/ai-game-creator-shell/package.json b/apps/ai-game-creator-shell/package.json index ce2317900..fcaf78727 100644 --- a/apps/ai-game-creator-shell/package.json +++ b/apps/ai-game-creator-shell/package.json @@ -57,6 +57,7 @@ "react-colorful": "^5.8.0", "react-dom": "^19.0.0", "react-markdown": "^10.1.0", + "react-window": "^1.8.11", "rehype-highlight": "^7.0.2", "remark-gfm": "^4.0.1", "vite": "^6.2.0", @@ -70,6 +71,7 @@ "@testing-library/user-event": "^14.6.1", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", + "@types/react-window": "^1.8.8", "tailwindcss": "^4.1.14", "typescript": "~5.8.2", "vitest": "^0.34.6" diff --git a/apps/ai-game-creator-shell/src-tauri/Cargo.toml b/apps/ai-game-creator-shell/src-tauri/Cargo.toml index b5cb1f2d2..4dd833d85 100644 --- a/apps/ai-game-creator-shell/src-tauri/Cargo.toml +++ b/apps/ai-game-creator-shell/src-tauri/Cargo.toml @@ -6,6 +6,9 @@ publish = false [features] default = [] +# 模板库假数据注入(仅本地页面压测/演示用):只有显式开启该 feature 才会编译并在读取清单后 +# 把条目循环补齐成假数据;计数由 AGC_TEMPLATE_LIBRARY_SYNTHETIC_COUNT 控制(默认 1000)。 +template-library-fixtures = [] cocos-editor = ["cocos-editor-bridge/process-discovery"] cocos-editor-execute = ["cocos-editor", "cocos-editor-bridge/windows-bootstrap"] cocos-editor-injection = ["cocos-editor-execute", "cocos-editor-bridge/windows-injection"] diff --git a/apps/ai-game-creator-shell/src-tauri/src/main.rs b/apps/ai-game-creator-shell/src-tauri/src/main.rs index 6a57de8e2..cdfafff99 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/main.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/main.rs @@ -284,6 +284,7 @@ mod resource_inspect; mod resource_preview_scheduler; mod runner; mod swarm_cli; +mod template_library; mod tool_plan_handoff; mod user_input; mod windows; @@ -323,6 +324,7 @@ use resource_inspect::*; use resource_preview_scheduler::*; use runner::*; use swarm_cli::*; +use template_library::*; use user_input::*; use windows::*; #[tauri::command] @@ -2660,7 +2662,10 @@ fn main() { start_game_creator_external_mcp, stop_game_creator_external_mcp, create_automatic_local_game_project, + create_automatic_local_game_project_from_template, init_local_game_project, + fetch_game_template_library, + download_game_template, import_local_godot_project, import_local_cocos_project, is_local_project_directory_non_empty, diff --git a/apps/ai-game-creator-shell/src-tauri/src/template_library.rs b/apps/ai-game-creator-shell/src-tauri/src/template_library.rs new file mode 100644 index 000000000..ee2cea8dc --- /dev/null +++ b/apps/ai-game-creator-shell/src-tauri/src/template_library.rs @@ -0,0 +1,1272 @@ +//! AGC 游戏模板库:读取公共 OSS 模板清单、下载模板 zip、安装到本机并据此建项目。 +//! +//! 边界:模板库只做「远端清单 → 本机安装 → 复制进新项目」这条路,不生成模板内容, +//! 也不改写已存在项目。远端对象只允许来自受信任 OSS 主机下的 `templates/` 前缀; +//! 清单、zip 与封面一律先校验再落盘,zip 解压只接受普通文件与目录。 + +use super::*; +use serde::{Deserialize, Serialize}; + +const TEMPLATE_LIBRARY_SCHEMA_VERSION: &str = "agc-template-library.v1"; +const TEMPLATE_LIBRARY_INDEX_KEY: &str = "templates/index.json"; +const TEMPLATE_LIBRARY_OBJECT_PREFIX: &str = "templates/"; +const TEMPLATE_LIBRARY_OSS_HOST: &str = "agc-dev.oss-rg-china-mainland.aliyuncs.com"; +const DEFAULT_TEMPLATE_LIBRARY_BASE_URL: &str = + "https://agc-dev.oss-rg-china-mainland.aliyuncs.com"; +const TEMPLATE_LIBRARY_BASE_URL_ENV: &str = "AGC_TEMPLATE_LIBRARY_BASE_URL"; +const TEMPLATE_CACHE_DIRECTORY_NAME: &str = "templates"; +const TEMPLATE_INSTALLED_DIRECTORY_NAME: &str = "installed"; +const TEMPLATE_INSTALLED_MARKER_FILE: &str = "installed.json"; +const TEMPLATE_INDEX_CACHE_FILE: &str = "index.json"; +const TEMPLATE_LIBRARY_MAX_INDEX_BYTES: u64 = 4 * 1024 * 1024; +const TEMPLATE_ARCHIVE_MAX_BYTES: u64 = 512 * 1024 * 1024; +const TEMPLATE_ARCHIVE_MAX_FILES: usize = 4_096; +const TEMPLATE_ARCHIVE_MAX_FILE_BYTES: u64 = 256 * 1024 * 1024; +const TEMPLATE_ID_MAX_CHARS: usize = 64; +const TEMPLATE_VERSION_MAX_CHARS: usize = 32; + +/// 远端清单里的单个模板条目(`templates/index.json` 中的 `templates[]`)。 +#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] +#[serde(rename_all = "camelCase")] +pub(crate) struct GameTemplateSummary { + pub(crate) id: String, + pub(crate) title: String, + #[serde(default)] + pub(crate) summary: String, + #[serde(default)] + pub(crate) tags: Vec, + #[serde(default)] + pub(crate) runtime: String, + #[serde(default)] + pub(crate) engine: String, + #[serde(default)] + pub(crate) engine_version: String, + pub(crate) template_version: String, + #[serde(default)] + pub(crate) updated_at: String, + #[serde(default)] + pub(crate) entry: String, + pub(crate) zip_key: String, + pub(crate) zip_size_bytes: u64, + pub(crate) zip_sha256: String, + pub(crate) cover_key: String, + #[serde(default)] + pub(crate) cover_width: u32, + #[serde(default)] + pub(crate) cover_height: u32, + #[serde(default)] + pub(crate) cover_sha256: String, + #[serde(default)] + pub(crate) metadata_key: String, +} + +/// `templates/index.json` 的库头信息。 +#[derive(Clone, Debug, Deserialize, Eq, PartialEq)] +#[serde(rename_all = "camelCase")] +pub(crate) struct GameTemplateLibraryHeader { + pub(crate) schema_version: String, + #[serde(default)] + pub(crate) library: String, + #[serde(default)] + pub(crate) library_version: u32, + #[serde(default)] + pub(crate) updated_at: String, +} + +#[derive(Clone, Debug, Deserialize, Eq, PartialEq)] +#[serde(rename_all = "camelCase")] +struct GameTemplateLibraryIndex { + #[serde(flatten)] + header: GameTemplateLibraryHeader, + #[serde(default)] + templates: Vec, +} + +/// 返回给前端的模板条目:清单字段 + 远端地址 + 本机安装状态。 +#[derive(Clone, Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct GameTemplateEntry { + pub(crate) id: String, + pub(crate) title: String, + pub(crate) summary: String, + pub(crate) tags: Vec, + pub(crate) runtime: String, + pub(crate) engine: String, + pub(crate) engine_version: String, + pub(crate) template_version: String, + pub(crate) updated_at: String, + pub(crate) entry: String, + pub(crate) zip_url: String, + pub(crate) zip_size_bytes: u64, + pub(crate) zip_sha256: String, + pub(crate) cover_url: String, + pub(crate) cover_width: u32, + pub(crate) cover_height: u32, + pub(crate) installed: bool, + pub(crate) installed_version: Option, + pub(crate) installed_at_millis: Option, +} + +#[derive(Clone, Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct GameTemplateLibrarySnapshot { + pub(crate) schema_version: String, + pub(crate) library: String, + pub(crate) library_version: u32, + pub(crate) updated_at: String, + pub(crate) fetched_at_millis: u64, + /// `network` 或 `cache`:命中本机缓存时前端应提示清单可能不是最新。 + pub(crate) source: String, + pub(crate) templates: Vec, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +struct InstalledGameTemplateRecord { + template_id: String, + template_version: String, + installed_at_millis: u64, + zip_sha256: String, + file_count: usize, + project_dir: String, +} + +#[derive(Clone, Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct InstalledGameTemplate { + pub(crate) template_id: String, + pub(crate) template_version: String, + pub(crate) installed_at_millis: u64, + pub(crate) zip_sha256: String, + pub(crate) file_count: usize, + pub(crate) project_dir: String, +} + +fn now_millis() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|duration| duration.as_millis() as u64) + .unwrap_or_default() +} + +fn template_library_base_url() -> String { + std::env::var(TEMPLATE_LIBRARY_BASE_URL_ENV) + .ok() + .map(|value| value.trim().trim_end_matches('/').to_string()) + .filter(|value| !value.is_empty()) + .unwrap_or_else(|| DEFAULT_TEMPLATE_LIBRARY_BASE_URL.to_string()) +} + +/// 只接受受信任 OSS 主机下的 HTTPS 地址;返回去掉尾斜杠的 base。 +pub(crate) fn validated_template_library_base_url(raw: &str) -> Result { + let trimmed = raw.trim().trim_end_matches('/'); + let parsed = url::Url::parse(trimmed).map_err(|_| "模板库地址无效".to_string())?; + if parsed.scheme() != "https" || parsed.host_str() != Some(TEMPLATE_LIBRARY_OSS_HOST) { + return Err("模板库地址必须来自受信任的 OSS".to_string()); + } + if parsed.path() != "/" || parsed.query().is_some() || parsed.fragment().is_some() { + return Err("模板库地址只能包含主机名".to_string()); + } + Ok(trimmed.to_string()) +} + +fn template_library_base() -> Result { + validated_template_library_base_url(&template_library_base_url()) +} + +fn sha256_hex(bytes: &[u8]) -> String { + let mut hasher = sha2::Sha256::new(); + hasher.update(bytes); + format!("{:x}", hasher.finalize()) +} + +fn is_valid_sha256(value: &str) -> bool { + let trimmed = value.trim(); + trimmed.len() == 64 && trimmed.bytes().all(|byte| byte.is_ascii_hexdigit()) +} + +fn validate_template_identifier(value: &str, max_chars: usize, label: &str) -> Result<(), String> { + let trimmed = value.trim(); + if trimmed.is_empty() || trimmed.chars().count() > max_chars { + return Err(format!("{label}无效")); + } + if !trimmed.chars().all(|value| { + value.is_ascii_lowercase() || value.is_ascii_digit() || matches!(value, '-' | '_' | '.') + }) { + return Err(format!("{label}无效")); + } + if trimmed.contains("..") { + return Err(format!("{label}无效")); + } + Ok(()) +} + +/// 远端对象键必须落在 `templates/` 前缀下,且不含绝对路径、上跳或反斜杠。 +pub(crate) fn validate_template_object_key(key: &str) -> Result<(), String> { + let trimmed = key.trim(); + if trimmed.is_empty() || !trimmed.starts_with(TEMPLATE_LIBRARY_OBJECT_PREFIX) { + return Err("模板对象键必须位于 templates/ 前缀下".to_string()); + } + if trimmed.starts_with('/') || trimmed.contains('\\') || trimmed.contains("..") { + return Err("模板对象键无效".to_string()); + } + if trimmed + .chars() + .any(|value| value.is_control() || value == ' ' || value == '?') + { + return Err("模板对象键无效".to_string()); + } + Ok(()) +} + +fn template_object_url(key: &str) -> Result { + validate_template_object_key(key)?; + Ok(format!("{}/{}", template_library_base()?, key.trim())) +} + +fn validate_template_summary(entry: &GameTemplateSummary) -> Result<(), String> { + validate_template_identifier(&entry.id, TEMPLATE_ID_MAX_CHARS, "模板 ID")?; + validate_template_identifier( + &entry.template_version, + TEMPLATE_VERSION_MAX_CHARS, + "模板版本", + )?; + if entry.title.trim().is_empty() || entry.title.chars().count() > 120 { + return Err(format!("模板 {} 的标题无效", entry.id)); + } + if entry.tags.len() > 32 { + return Err(format!("模板 {} 的标签过多", entry.id)); + } + validate_template_object_key(&entry.zip_key)?; + validate_template_object_key(&entry.cover_key)?; + if !entry.metadata_key.trim().is_empty() { + validate_template_object_key(&entry.metadata_key)?; + } + if entry.zip_size_bytes == 0 || entry.zip_size_bytes > TEMPLATE_ARCHIVE_MAX_BYTES { + return Err(format!("模板 {} 的包大小无效", entry.id)); + } + if !is_valid_sha256(&entry.zip_sha256) { + return Err(format!("模板 {} 的包摘要无效", entry.id)); + } + if !entry.cover_sha256.trim().is_empty() && !is_valid_sha256(&entry.cover_sha256) { + return Err(format!("模板 {} 的封面摘要无效", entry.id)); + } + Ok(()) +} + +/// 解析并校验远端清单;任何一条不合法都让整次读取失败,避免前端拿到半可信数据。 +pub(crate) fn parse_game_template_library_index( + body: &str, +) -> Result<(GameTemplateLibraryHeader, Vec), String> { + let index: GameTemplateLibraryIndex = + serde_json::from_str(body).map_err(|error| format!("模板库清单不是有效 JSON:{error}"))?; + if index.header.schema_version != TEMPLATE_LIBRARY_SCHEMA_VERSION { + return Err("模板库清单版本不受支持".to_string()); + } + let mut seen = std::collections::BTreeSet::new(); + for entry in &index.templates { + validate_template_summary(entry)?; + if !seen.insert(entry.id.clone()) { + return Err(format!("模板库清单存在重复模板:{}", entry.id)); + } + } + Ok((index.header, index.templates)) +} + +fn template_cache_root(app: &tauri::AppHandle) -> Result { + app.path() + .app_data_dir() + .map(|root| root.join(TEMPLATE_CACHE_DIRECTORY_NAME)) + .map_err(|error| format!("无法读取 AGC 应用数据目录:{error}")) +} + +fn installed_templates_root(cache_root: &Path) -> PathBuf { + cache_root.join(TEMPLATE_INSTALLED_DIRECTORY_NAME) +} + +fn installed_template_dir( + cache_root: &Path, + template_id: &str, + template_version: &str, +) -> Result { + validate_template_identifier(template_id, TEMPLATE_ID_MAX_CHARS, "模板 ID")?; + validate_template_identifier(template_version, TEMPLATE_VERSION_MAX_CHARS, "模板版本")?; + Ok(installed_templates_root(cache_root) + .join(template_id.trim()) + .join(template_version.trim())) +} + +fn read_installed_record(directory: &Path) -> Option { + let body = fs::read_to_string(directory.join(TEMPLATE_INSTALLED_MARKER_FILE)).ok()?; + serde_json::from_str(&body).ok() +} + +/// 扫描本机已安装模板,返回 `(模板 ID, 安装记录)`;损坏或缺少标记的目录视为未安装。 +fn collect_installed_records(cache_root: &Path) -> Vec { + let root = installed_templates_root(cache_root); + let Ok(template_entries) = fs::read_dir(&root) else { + return Vec::new(); + }; + let mut records = Vec::new(); + for template_entry in template_entries.flatten() { + let Ok(version_entries) = fs::read_dir(template_entry.path()) else { + continue; + }; + for version_entry in version_entries.flatten() { + if let Some(record) = read_installed_record(&version_entry.path()) { + records.push(record); + } + } + } + records +} + +fn installed_record_for( + records: &[InstalledGameTemplateRecord], + template_id: &str, +) -> Option { + records + .iter() + .filter(|record| record.template_id == template_id) + .max_by_key(|record| record.installed_at_millis) + .cloned() +} + +fn to_entry( + summary: &GameTemplateSummary, + installed: Option<&InstalledGameTemplateRecord>, +) -> Result { + Ok(GameTemplateEntry { + id: summary.id.clone(), + title: summary.title.clone(), + summary: summary.summary.clone(), + tags: summary.tags.clone(), + runtime: summary.runtime.clone(), + engine: summary.engine.clone(), + engine_version: summary.engine_version.clone(), + template_version: summary.template_version.clone(), + updated_at: summary.updated_at.clone(), + entry: summary.entry.clone(), + zip_url: template_object_url(&summary.zip_key)?, + zip_size_bytes: summary.zip_size_bytes, + zip_sha256: summary.zip_sha256.to_ascii_lowercase(), + cover_url: template_object_url(&summary.cover_key)?, + cover_width: summary.cover_width, + cover_height: summary.cover_height, + installed: installed.is_some(), + installed_version: installed.map(|record| record.template_version.clone()), + installed_at_millis: installed.map(|record| record.installed_at_millis), + }) +} + +/// 本地假数据注入:只在 `template-library-fixtures` feature(或测试构建)下编译。 +/// +/// 开启时把真实清单循环补齐成假数据(条数见 `fixtures::synthetic_template_count`); +/// 未开启时是恒等透传,正式构建里没有任何注入分支。 +fn apply_template_library_fixtures(entries: Vec) -> Vec { + #[cfg(feature = "template-library-fixtures")] + { + return fixtures::pad_synthetic_templates(entries, fixtures::synthetic_template_count()); + } + #[cfg(not(feature = "template-library-fixtures"))] + { + entries + } +} + +/// 本地假数据注入实现:只在 `template-library-fixtures` feature(或测试构建)下编译。 +/// +/// 位置刻意放在 Rust 侧:模板库的清单校验、安装状态与建项目都在这一侧,TS 只消费快照做渲染; +/// 在这里注入才能压到与真实一致的整条链路。正式构建不含该模块,因此不存在误触发路径。 +#[cfg(any(test, feature = "template-library-fixtures"))] +pub(crate) mod fixtures { + use super::*; + + pub(crate) const SYNTHETIC_COUNT_ENV: &str = "AGC_TEMPLATE_LIBRARY_SYNTHETIC_COUNT"; + pub(crate) const DEFAULT_SYNTHETIC_COUNT: usize = 1_000; + const MAX_SYNTHETIC_COUNT: usize = 20_000; + + /// 假数据条数:环境变量优先,缺省 1000;0 表示不注入。 + pub(crate) fn synthetic_template_count() -> usize { + parse_synthetic_count(std::env::var(SYNTHETIC_COUNT_ENV).ok().as_deref()) + } + + fn parse_synthetic_count(raw: Option<&str>) -> usize { + raw.and_then(|value| value.trim().parse::().ok()) + .unwrap_or(DEFAULT_SYNTHETIC_COUNT) + .min(MAX_SYNTHETIC_COUNT) + } + + /// 把真实清单循环复制成指定条数:id/标题/封面地址唯一,安装态按 1/3 混合。 + pub(crate) fn pad_synthetic_templates( + entries: Vec, + target: usize, + ) -> Vec { + if target <= entries.len() || entries.is_empty() { + return entries; + } + let base = entries.clone(); + let mut padded = entries; + let mut index = padded.len(); + while padded.len() < target { + let source = &base[index % base.len()]; + let installed = index % 3 == 0; + let mut next = source.clone(); + next.id = format!("{}-{:04}", source.id, index); + next.title = format!("{} · 假数据 {index:04}", source.title); + let mut tags = source.tags.clone(); + tags.push(format!("批次-{:02}", index % 20)); + next.tags = tags; + next.cover_url = format!("{}?synthetic={index}", source.cover_url); + next.installed = installed; + next.installed_version = installed.then(|| source.template_version.clone()); + next.installed_at_millis = installed.then(|| now_millis()); + padded.push(next); + index += 1; + } + padded + } + + #[cfg(test)] + mod tests { + use super::*; + + fn base_entry(id: &str, tag: &str) -> GameTemplateEntry { + GameTemplateEntry { + id: id.to_string(), + title: format!("模板 {id}"), + summary: "假数据基础条目".to_string(), + tags: vec![tag.to_string()], + runtime: "html".to_string(), + engine: "phaser".to_string(), + engine_version: "4.2.1".to_string(), + template_version: "0.1.0".to_string(), + updated_at: "2026-09-17T00:00:00Z".to_string(), + entry: "game/index.html".to_string(), + zip_url: format!("https://oss.example/templates/v1/{id}/template.zip"), + zip_size_bytes: 1024, + zip_sha256: "a".repeat(64), + cover_url: format!("https://oss.example/templates/v1/{id}/cover.svg"), + cover_width: 960, + cover_height: 540, + installed: false, + installed_version: None, + installed_at_millis: None, + } + } + + #[test] + fn parses_synthetic_count_from_env_value() { + assert_eq!(parse_synthetic_count(None), DEFAULT_SYNTHETIC_COUNT); + assert_eq!(parse_synthetic_count(Some(" 250 ")), 250); + assert_eq!(parse_synthetic_count(Some("0")), 0); + assert_eq!( + parse_synthetic_count(Some("not-a-number")), + DEFAULT_SYNTHETIC_COUNT + ); + assert_eq!(parse_synthetic_count(Some("999999")), MAX_SYNTHETIC_COUNT); + } + + #[test] + fn pads_entries_with_unique_identity_and_mixed_install_state() { + let base = vec![ + base_entry("blank-web", "空白"), + base_entry("blank-2d", "2d"), + ]; + let padded = pad_synthetic_templates(base.clone(), 9); + assert_eq!(padded.len(), 9); + // 真实条目保持原样排在最前。 + assert_eq!(padded[0].id, "blank-web"); + assert_eq!(padded[1].id, "blank-2d"); + let ids = padded + .iter() + .map(|entry| entry.id.clone()) + .collect::>(); + assert_eq!(ids.len(), 9, "假数据 id 必须唯一"); + let covers = padded + .iter() + .map(|entry| entry.cover_url.clone()) + .collect::>(); + assert_eq!(covers.len(), 9, "假数据封面地址必须唯一"); + assert!(padded.iter().any(|entry| entry.installed)); + assert!(padded.iter().any(|entry| !entry.installed)); + assert!(padded + .iter() + .skip(2) + .all(|entry| entry.tags.iter().any(|tag| tag.starts_with("批次-")))); + } + + #[test] + fn padding_is_a_no_op_without_room_to_fill() { + let base = vec![base_entry("blank-web", "空白")]; + assert_eq!(pad_synthetic_templates(base.clone(), 1).len(), 1); + assert_eq!(pad_synthetic_templates(base.clone(), 0).len(), 1); + assert!(pad_synthetic_templates(Vec::new(), 10).is_empty()); + } + } +} + +fn build_template_library_client() -> reqwest::Client { + reqwest::Client::builder() + .connect_timeout(Duration::from_secs(10)) + .timeout(Duration::from_secs(120)) + .build() + .unwrap_or_else(|_| reqwest::Client::new()) +} + +async fn fetch_limited_bytes( + client: &reqwest::Client, + url: &str, + max_bytes: u64, +) -> Result, String> { + let response = client + .get(url) + .send() + .await + .map_err(|error| format!("请求模板库失败:{error}"))?; + if !response.status().is_success() { + return Err(format!("模板库返回 HTTP {}", response.status().as_u16())); + } + if response + .content_length() + .is_some_and(|length| length > max_bytes) + { + return Err("模板库对象超过大小限制".to_string()); + } + let mut body = Vec::new(); + let mut stream = response.bytes_stream(); + while let Some(chunk) = stream.next().await { + let chunk = chunk.map_err(|error| format!("读取模板库对象失败:{error}"))?; + if body.len() as u64 + chunk.len() as u64 > max_bytes { + return Err("模板库对象超过大小限制".to_string()); + } + body.extend_from_slice(&chunk); + } + Ok(body) +} + +fn write_cached_index(cache_root: &Path, body: &str) { + let _ = ensure_game_creator_private_directory_tree(cache_root, "模板库缓存目录"); + let _ = write_game_creator_private_file( + &cache_root.join(TEMPLATE_INDEX_CACHE_FILE), + body.as_bytes(), + "模板库清单缓存", + ); +} + +fn read_cached_index(cache_root: &Path) -> Option { + fs::read_to_string(cache_root.join(TEMPLATE_INDEX_CACHE_FILE)).ok() +} + +/// 单个 zip 条目路径:只允许相对普通路径,禁止绝对路径、上跳、反斜杠与盘符。 +pub(crate) fn safe_archive_relative_path(raw: &str) -> Result { + let trimmed = raw.trim(); + if trimmed.is_empty() { + return Err("模板包条目名为空".to_string()); + } + let normalized = trimmed.replace('\\', "/"); + if normalized.starts_with('/') || normalized.contains(':') { + return Err(format!("模板包条目路径无效:{raw}")); + } + let mut path = PathBuf::new(); + for segment in normalized.split('/') { + if segment.is_empty() || segment == "." { + continue; + } + if segment == ".." { + return Err(format!("模板包条目路径无效:{raw}")); + } + path.push(segment); + } + if path.as_os_str().is_empty() { + return Err(format!("模板包条目路径无效:{raw}")); + } + Ok(path) +} + +fn extract_template_archive(bytes: &[u8], destination: &Path) -> Result { + let mut archive = zip::ZipArchive::new(std::io::Cursor::new(bytes)) + .map_err(|error| format!("模板包不是有效 zip:{error}"))?; + if archive.len() > TEMPLATE_ARCHIVE_MAX_FILES { + return Err("模板包文件数量超过上限".to_string()); + } + let mut written = 0_usize; + for index in 0..archive.len() { + let mut entry = archive + .by_index(index) + .map_err(|error| format!("读取模板包条目失败:{error}"))?; + if entry + .unix_mode() + .is_some_and(|mode| mode & 0o170000 == 0o120000) + { + return Err("模板包不允许包含符号链接".to_string()); + } + let relative = safe_archive_relative_path(entry.name())?; + let target = destination.join(&relative); + if entry.is_dir() { + ensure_game_creator_private_directory_tree(&target, "模板目录")?; + continue; + } + if entry.size() > TEMPLATE_ARCHIVE_MAX_FILE_BYTES { + return Err(format!("模板包文件超过大小上限:{}", entry.name())); + } + let mut buffer = Vec::with_capacity(entry.size() as usize); + entry + .read_to_end(&mut buffer) + .map_err(|error| format!("读取模板包文件失败:{error}"))?; + if let Some(parent) = target.parent() { + ensure_game_creator_private_directory_tree(parent, "模板目录")?; + } + write_game_creator_private_file(&target, &buffer, "模板文件")?; + written += 1; + } + if written == 0 { + return Err("模板包没有可写入的文件".to_string()); + } + Ok(written) +} + +fn install_template_archive( + cache_root: &Path, + summary: &GameTemplateSummary, + bytes: &[u8], +) -> Result { + if bytes.len() as u64 != summary.zip_size_bytes { + return Err("模板包大小校验失败".to_string()); + } + let actual_sha256 = sha256_hex(bytes); + if actual_sha256 != summary.zip_sha256.trim().to_ascii_lowercase() { + return Err("模板包完整性校验失败".to_string()); + } + let directory = installed_template_dir(cache_root, &summary.id, &summary.template_version)?; + if directory.exists() { + // 只清理本模板自己的安装目录;路径由标识符白名单拼出,不含远端输入。 + let _ = fs::remove_dir_all(&directory); + } + ensure_game_creator_private_directory_tree(&directory, "模板安装目录")?; + let file_count = extract_template_archive(bytes, &directory)?; + let record = InstalledGameTemplateRecord { + template_id: summary.id.clone(), + template_version: summary.template_version.clone(), + installed_at_millis: now_millis(), + zip_sha256: actual_sha256, + file_count, + project_dir: directory.to_string_lossy().into_owned(), + }; + let body = serde_json::to_string_pretty(&record) + .map_err(|error| format!("写入模板安装记录失败:{error}"))?; + write_game_creator_private_file( + &directory.join(TEMPLATE_INSTALLED_MARKER_FILE), + body.as_bytes(), + "模板安装记录", + )?; + Ok(record) +} + +fn copy_template_project(source_dir: &Path, target_root: &Path) -> Result { + let mut copied = 0_usize; + let mut stack = vec![source_dir.to_path_buf()]; + while let Some(directory) = stack.pop() { + let entries = + fs::read_dir(&directory).map_err(|error| format!("读取模板目录失败:{error}"))?; + for entry in entries.flatten() { + let path = entry.path(); + if entry.file_name() == TEMPLATE_INSTALLED_MARKER_FILE { + continue; + } + let metadata = entry + .metadata() + .map_err(|error| format!("读取模板条目失败:{error}"))?; + if metadata.is_dir() { + stack.push(path); + continue; + } + if !metadata.is_file() { + return Err(format!("模板包含不支持的条目:{}", path.display())); + } + let relative = path + .strip_prefix(source_dir) + .map_err(|error| format!("模板条目路径无效:{error}"))?; + let target = target_root.join(relative); + if let Some(parent) = target.parent() { + ensure_game_creator_private_directory_tree(parent, "项目模板目录")?; + } + let bytes = fs::read(&path).map_err(|error| format!("读取模板文件失败:{error}"))?; + write_game_creator_private_file(&target, &bytes, "项目模板文件")?; + copied += 1; + } + } + if copied == 0 { + return Err("模板没有可复制的文件".to_string()); + } + Ok(copied) +} + +fn find_template_summary( + cache_root: &Path, + template_id: &str, + template_version: &str, +) -> Result { + let body = read_cached_index(cache_root).ok_or_else(|| "本机没有模板库清单缓存".to_string())?; + let (_, templates) = parse_game_template_library_index(&body)?; + templates + .into_iter() + .find(|entry| entry.id == template_id && entry.template_version == template_version) + .ok_or_else(|| "模板库清单里没有该模板版本".to_string()) +} + +async fn ensure_template_installed( + cache_root: &Path, + template_id: &str, + template_version: &str, +) -> Result { + let installed_directory = installed_template_dir(cache_root, template_id, template_version)?; + if let Some(record) = read_installed_record(&installed_directory) { + return Ok(record); + } + let summary = find_template_summary(cache_root, template_id, template_version)?; + let client = build_template_library_client(); + let url = template_object_url(&summary.zip_key)?; + let bytes = fetch_limited_bytes(&client, &url, TEMPLATE_ARCHIVE_MAX_BYTES).await?; + install_template_archive(cache_root, &summary, &bytes) +} + +#[tauri::command] +pub(crate) async fn fetch_game_template_library( + app: tauri::AppHandle, +) -> Result { + let cache_root = template_cache_root(&app)?; + ensure_game_creator_private_directory_tree(&cache_root, "模板库缓存目录")?; + let index_url = format!( + "{}/{}", + template_library_base()?, + TEMPLATE_LIBRARY_INDEX_KEY + ); + let client = build_template_library_client(); + let (body, source) = + match fetch_limited_bytes(&client, &index_url, TEMPLATE_LIBRARY_MAX_INDEX_BYTES).await { + Ok(bytes) => { + let body = + String::from_utf8(bytes).map_err(|_| "模板库清单不是有效 UTF-8".to_string())?; + parse_game_template_library_index(&body)?; + write_cached_index(&cache_root, &body); + (body, "network") + } + Err(error) => match read_cached_index(&cache_root) { + Some(cached) => { + parse_game_template_library_index(&cached)?; + (cached, "cache") + } + None => return Err(error), + }, + }; + let (header, templates) = parse_game_template_library_index(&body)?; + let installed = collect_installed_records(&cache_root); + let entries = templates + .iter() + .map(|summary| { + to_entry( + summary, + installed_record_for(&installed, &summary.id).as_ref(), + ) + }) + .collect::, _>>()?; + let entries = apply_template_library_fixtures(entries); + Ok(GameTemplateLibrarySnapshot { + schema_version: header.schema_version, + library: header.library, + library_version: header.library_version, + updated_at: header.updated_at, + fetched_at_millis: now_millis(), + source: source.to_string(), + templates: entries, + }) +} + +#[tauri::command] +pub(crate) async fn download_game_template( + app: tauri::AppHandle, + template_id: String, + template_version: String, +) -> Result { + let cache_root = template_cache_root(&app)?; + ensure_game_creator_private_directory_tree(&cache_root, "模板库缓存目录")?; + let record = + ensure_template_installed(&cache_root, template_id.trim(), template_version.trim()).await?; + Ok(InstalledGameTemplate { + template_id: record.template_id, + template_version: record.template_version, + installed_at_millis: record.installed_at_millis, + zip_sha256: record.zip_sha256, + file_count: record.file_count, + project_dir: record.project_dir, + }) +} + +/// 用已安装模板在自动工作区根目录下建项目:先把模板文件铺进新目录,再走标准项目初始化。 +pub(crate) fn create_project_from_installed_template_at( + projects_root: &Path, + installed_project_dir: &Path, + requested_name: Option<&str>, + planning: bool, +) -> Result { + let requested_name = requested_name + .map(normalize_game_creation_project_name) + .transpose()?; + if projects_root.as_os_str().is_empty() || !projects_root.is_absolute() { + return Err("自动工作区根目录必须是绝对路径".to_string()); + } + if !installed_project_dir.is_dir() { + return Err("模板尚未安装到本机".to_string()); + } + ensure_game_creator_private_directory_tree(projects_root, "自动工作区根目录")?; + prepare_game_creator_private_path_for_read(projects_root, true, "自动工作区根目录")?; + let metadata = fs::symlink_metadata(projects_root).map_err(|error| { + format!( + "读取自动工作区根目录失败:{}: {error}", + projects_root.display() + ) + })?; + if metadata.file_type().is_symlink() || !metadata.is_dir() { + return Err("自动工作区根目录必须是普通文件夹".to_string()); + } + + for _ in 0..16 { + let workspace_id = uuid::Uuid::new_v4().simple().to_string(); + let short_id = &workspace_id[..8]; + let project_name = requested_name.clone().unwrap_or_else(|| { + let prefix = if planning { + "策划项目" + } else { + "GameAgent 项目" + }; + format!("{prefix} {short_id}") + }); + let project_root = projects_root.join(format!("gameagent-{short_id}")); + match fs::create_dir(&project_root) { + Ok(()) => { + let result = (|| { + harden_new_game_creator_private_path(&project_root, true, "自动项目目录")?; + enforce_project_permission_policy(&project_root, "project.create")?; + let _lock = acquire_project_write_lock(&project_root, "project.create")?; + copy_template_project(installed_project_dir, &project_root)?; + init_local_game_project_at( + &project_root, + &format!("gameagent-{workspace_id}"), + &project_name, + ) + })(); + if result.is_err() { + let _ = fs::remove_dir_all(&project_root); + } + return result; + } + Err(error) if error.kind() == std::io::ErrorKind::AlreadyExists => continue, + Err(error) => { + return Err(format!( + "创建自动工作区失败:{}: {error}", + project_root.display() + )); + } + } + } + Err("自动工作区命名冲突,请重试".to_string()) +} + +#[tauri::command] +pub(crate) async fn create_automatic_local_game_project_from_template( + app: tauri::AppHandle, + template_id: String, + template_version: String, + name: Option, + planning: Option, +) -> Result { + let projects_root = app + .path() + .app_data_dir() + .map(|root| root.join("projects")) + .map_err(|error| format!("无法读取 AGC 应用数据目录:{error}"))?; + let cache_root = template_cache_root(&app)?; + ensure_game_creator_private_directory_tree(&cache_root, "模板库缓存目录")?; + let record = + ensure_template_installed(&cache_root, template_id.trim(), template_version.trim()).await?; + create_project_from_installed_template_at( + &projects_root, + Path::new(&record.project_dir), + name.as_deref(), + planning.unwrap_or(false), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn sample_index_body() -> String { + serde_json::json!({ + "schemaVersion": TEMPLATE_LIBRARY_SCHEMA_VERSION, + "library": "agc-game-templates", + "libraryVersion": 1, + "updatedAt": "2026-09-17T00:00:00Z", + "templates": [ + { + "id": "demo-template", + "title": "演示模板", + "summary": "用于测试", + "tags": ["2d", "demo"], + "runtime": "html", + "engine": "phaser", + "engineVersion": "4.2.1", + "templateVersion": "1.0.0", + "updatedAt": "2026-09-17T00:00:00Z", + "entry": "game/index.html", + "zipKey": "templates/v1/demo-template/template.zip", + "zipSizeBytes": 128, + "zipSha256": "0".repeat(64), + "coverKey": "templates/v1/demo-template/cover.png", + "coverWidth": 960, + "coverHeight": 540, + "coverSha256": "1".repeat(64), + "metadataKey": "templates/v1/demo-template/template.json" + } + ] + }) + .to_string() + } + + fn sample_summary() -> GameTemplateSummary { + parse_game_template_library_index(&sample_index_body()) + .expect("parse sample index") + .1 + .remove(0) + } + + fn build_archive(entries: &[(&str, &[u8])]) -> Vec { + let mut writer = zip::ZipWriter::new(std::io::Cursor::new(Vec::new())); + let options = zip::write::SimpleFileOptions::default(); + for (name, bytes) in entries { + writer.start_file(*name, options).expect("start file"); + writer.write_all(bytes).expect("write file"); + } + writer.finish().expect("finish archive").into_inner() + } + + /// 自动工作区根目录要走私有 DACL 校验,和 `tests::unique_project_path` 一样 + /// 在临时目录下取一个尚未存在的唯一路径,而不是用 tempdir 预先建好的目录。 + fn unique_projects_root() -> PathBuf { + let millis = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("system clock") + .as_millis(); + std::env::temp_dir().join(format!( + "genarrative-agc-template-library-test-{}-{millis}", + std::process::id() + )) + } + + #[test] + fn rejects_index_with_unsupported_schema_or_duplicate_templates() { + let unsupported = + sample_index_body().replace(TEMPLATE_LIBRARY_SCHEMA_VERSION, "agc-template-library.v2"); + assert!(parse_game_template_library_index(&unsupported).is_err()); + + let entry = serde_json::to_string(&sample_summary()).expect("serialize summary"); + let duplicated = serde_json::json!({ + "schemaVersion": TEMPLATE_LIBRARY_SCHEMA_VERSION, + "templates": [ + serde_json::from_str::(&entry).expect("value"), + serde_json::from_str::(&entry).expect("value"), + ] + }) + .to_string(); + let error = parse_game_template_library_index(&duplicated).expect_err("duplicate rejected"); + assert!(error.contains("重复模板"), "{error}"); + } + + #[test] + fn rejects_object_keys_outside_the_templates_prefix() { + assert!(validate_template_object_key("agc/templates/v1/demo/template.zip").is_err()); + assert!(validate_template_object_key("templates/../secret").is_err()); + assert!(validate_template_object_key("/templates/a.zip").is_err()); + assert!(validate_template_object_key("templates\\a.zip").is_err()); + assert!(validate_template_object_key("templates/v1/demo/template.zip").is_ok()); + } + + #[test] + fn rejects_template_base_url_outside_trusted_oss() { + assert!(validated_template_library_base_url( + "https://agc-dev.oss-rg-china-mainland.aliyuncs.com" + ) + .is_ok()); + assert!(validated_template_library_base_url( + "http://agc-dev.oss-rg-china-mainland.aliyuncs.com" + ) + .is_err()); + assert!(validated_template_library_base_url("https://evil.example.com").is_err()); + assert!(validated_template_library_base_url( + "https://agc-dev.oss-rg-china-mainland.aliyuncs.com/other-prefix" + ) + .is_err()); + } + + /// 固定 2026-09-17 实际发布的 `templates/index.json`:客户端解析必须与线上契约一致。 + #[test] + fn parses_the_published_library_index_fixture() { + let body = include_str!("../tests/fixtures/agc-template-library-index.json"); + let (header, templates) = + parse_game_template_library_index(body).expect("parse published index"); + assert_eq!(header.schema_version, TEMPLATE_LIBRARY_SCHEMA_VERSION); + assert_eq!(header.library, "agc-game-templates"); + assert_eq!( + templates + .iter() + .map(|entry| entry.id.as_str()) + .collect::>(), + vec![ + "blank-2d-canvas", + "blank-3d-scene", + "blank-web", + "phaser-2d-starter", + "threejs-3d-starter", + ] + ); + let first = templates + .iter() + .find(|entry| entry.id == "phaser-2d-starter") + .expect("phaser template"); + assert_eq!(first.runtime, "html"); + assert_eq!(first.tags.first().map(String::as_str), Some("起步工程")); + assert!(first.cover_width > 0 && first.cover_height > 0); + + let entry = to_entry(first, None).expect("build entry"); + let base = template_library_base().expect("trusted base"); + assert_eq!( + entry.zip_url, + format!("{base}/templates/v1/phaser-2d-starter/template.zip") + ); + assert_eq!( + entry.cover_url, + format!("{base}/templates/v1/phaser-2d-starter/cover.svg") + ); + assert!(!entry.installed); + } + + #[test] + fn rejects_archive_entries_that_escape_the_destination() { + assert!(safe_archive_relative_path("game/index.html").is_ok()); + assert!(safe_archive_relative_path("./game/index.html").is_ok()); + assert!(safe_archive_relative_path("../escape.txt").is_err()); + assert!(safe_archive_relative_path("game/../../escape.txt").is_err()); + assert!(safe_archive_relative_path("C:/escape.txt").is_err()); + assert!(safe_archive_relative_path("/escape.txt").is_err()); + + let archive = build_archive(&[("../escape.txt", b"nope")]); + let destination = tempfile::tempdir().expect("temp dir"); + assert!(extract_template_archive(&archive, destination.path()).is_err()); + assert!(!destination + .path() + .parent() + .unwrap() + .join("escape.txt") + .exists()); + } + + #[test] + fn installs_template_archive_and_reports_it_as_installed() { + let cache_root = tempfile::tempdir().expect("temp dir"); + let archive = build_archive(&[ + ("game/index.html", b""), + ("game/game.js", b"console.log('demo');"), + ]); + let mut summary = sample_summary(); + summary.zip_size_bytes = archive.len() as u64; + summary.zip_sha256 = sha256_hex(&archive); + + let record = install_template_archive(cache_root.path(), &summary, &archive) + .expect("install template"); + assert_eq!(record.file_count, 2); + let installed = collect_installed_records(cache_root.path()); + assert_eq!(installed.len(), 1); + assert_eq!(installed[0].template_version, "1.0.0"); + + let entry = to_entry( + &summary, + installed_record_for(&installed, &summary.id).as_ref(), + ) + .expect("build entry"); + assert!(entry.installed); + assert_eq!(entry.installed_version.as_deref(), Some("1.0.0")); + assert!(entry.zip_url.starts_with("https://")); + assert!(entry + .cover_url + .ends_with("/templates/v1/demo-template/cover.png")); + } + + #[test] + fn rejects_archive_when_size_or_digest_do_not_match_the_index() { + let cache_root = tempfile::tempdir().expect("temp dir"); + let archive = build_archive(&[("game/index.html", b"")]); + let mut summary = sample_summary(); + summary.zip_size_bytes = archive.len() as u64 + 1; + let error = install_template_archive(cache_root.path(), &summary, &archive) + .expect_err("size mismatch rejected"); + assert!(error.contains("大小校验失败"), "{error}"); + + summary.zip_size_bytes = archive.len() as u64; + summary.zip_sha256 = "f".repeat(64); + let error = install_template_archive(cache_root.path(), &summary, &archive) + .expect_err("digest mismatch rejected"); + assert!(error.contains("完整性校验失败"), "{error}"); + } + + #[test] + fn creates_project_from_installed_template_without_leaking_install_marker() { + let cache_root = tempfile::tempdir().expect("temp dir"); + let projects_root = unique_projects_root(); + let archive = build_archive(&[ + ("game/index.html", b"template"), + ("assets/README.txt", b"template assets"), + ]); + let mut summary = sample_summary(); + summary.zip_size_bytes = archive.len() as u64; + summary.zip_sha256 = sha256_hex(&archive); + let record = install_template_archive(cache_root.path(), &summary, &archive) + .expect("install template"); + + let result = create_project_from_installed_template_at( + &projects_root, + Path::new(&record.project_dir), + Some("模板项目"), + false, + ) + .expect("create project from template"); + assert_eq!(result.manifest.name, "模板项目"); + let project_root = Path::new(&result.project_path); + let index = + fs::read_to_string(project_root.join("game/index.html")).expect("template file copied"); + assert!(index.contains("template")); + assert!(project_root.join("assets/README.txt").is_file()); + assert!(!project_root.join(TEMPLATE_INSTALLED_MARKER_FILE).exists()); + assert!(!project_root.join("game/index.html.orig").exists()); + fs::remove_dir_all(&projects_root).ok(); + } + + #[test] + fn refuses_to_create_project_when_template_is_not_installed() { + let projects_root = tempfile::tempdir().expect("temp dir"); + let missing = projects_root.path().join("missing-template"); + let error = + create_project_from_installed_template_at(projects_root.path(), &missing, None, false) + .expect_err("missing template rejected"); + assert!(error.contains("模板尚未安装"), "{error}"); + } + + /// 正式构建(未开 feature)必须恒等透传:注入路径不能出现在默认产物里。 + #[cfg(not(feature = "template-library-fixtures"))] + #[test] + fn fixtures_are_inert_without_the_feature() { + let index_body = include_str!("../tests/fixtures/agc-template-library-index.json"); + let (_, templates) = + parse_game_template_library_index(index_body).expect("parse fixture index"); + let entries = templates + .iter() + .map(|summary| to_entry(summary, None).expect("entry")) + .collect::>(); + let original = entries.len(); + let applied = apply_template_library_fixtures(entries); + assert_eq!(applied.len(), original, "默认构建不应注入假数据"); + } + + /// 开启 feature 后同一次调用必须补齐到配置条数。 + #[cfg(feature = "template-library-fixtures")] + #[test] + fn fixtures_expand_entries_when_the_feature_is_enabled() { + let index_body = include_str!("../tests/fixtures/agc-template-library-index.json"); + let (_, templates) = + parse_game_template_library_index(index_body).expect("parse fixture index"); + let entries = templates + .iter() + .map(|summary| to_entry(summary, None).expect("entry")) + .collect::>(); + let applied = apply_template_library_fixtures(entries); + assert_eq!(applied.len(), fixtures::synthetic_template_count()); + assert!(applied.len() > templates.len()); + } + + /// 可选的真连检查:`cargo test --bin genarrative-ai-game-creator-shell template_library -- --ignored`。 + /// 默认跳过,避免离线环境因网络失败误报。 + #[tokio::test] + #[ignore = "需要网络:校验客户端能真实读到线上模板库清单与对象键"] + async fn fetches_the_live_template_library_index() { + let base = template_library_base().expect("trusted base"); + let client = build_template_library_client(); + let body = fetch_limited_bytes( + &client, + &format!("{base}/{TEMPLATE_LIBRARY_INDEX_KEY}"), + TEMPLATE_LIBRARY_MAX_INDEX_BYTES, + ) + .await + .expect("fetch live index"); + let body = String::from_utf8(body).expect("utf-8 index"); + let (header, templates) = + parse_game_template_library_index(&body).expect("parse live index"); + assert_eq!(header.schema_version, TEMPLATE_LIBRARY_SCHEMA_VERSION); + assert!(!templates.is_empty(), "线上模板库应当至少有一个模板"); + for entry in &templates { + let zip_url = template_object_url(&entry.zip_key).expect("trusted zip url"); + assert!(zip_url.starts_with(&format!("{base}/"))); + } + } + + /// 可选的真连检查:下载线上模板包并安装到临时目录,证明"清单 → 下载 → 摘要校验 → 解压"整条链路可用。 + #[tokio::test] + #[ignore = "需要网络:下载并安装线上模板包"] + async fn downloads_and_installs_a_live_template() { + let cache_root = tempfile::tempdir().expect("temp dir"); + let base = template_library_base().expect("trusted base"); + let client = build_template_library_client(); + let body = fetch_limited_bytes( + &client, + &format!("{base}/{TEMPLATE_LIBRARY_INDEX_KEY}"), + TEMPLATE_LIBRARY_MAX_INDEX_BYTES, + ) + .await + .expect("fetch live index"); + let body = String::from_utf8(body).expect("utf-8 index"); + let (_, templates) = parse_game_template_library_index(&body).expect("parse live index"); + let entry = templates + .iter() + .find(|template| template.id == "blank-web") + .expect("线上应存在 blank-web 模板"); + let bytes = fetch_limited_bytes( + &client, + &template_object_url(&entry.zip_key).expect("trusted zip url"), + TEMPLATE_ARCHIVE_MAX_BYTES, + ) + .await + .expect("download live template"); + let record = install_template_archive(cache_root.path(), entry, &bytes) + .expect("install live template"); + assert!(record.file_count >= 5, "模板文件数 {}", record.file_count); + let project_root = Path::new(&record.project_dir); + assert!(project_root.join("game/index.html").is_file()); + assert!(project_root.join("game/main.js").is_file()); + assert!(project_root.join(TEMPLATE_INSTALLED_MARKER_FILE).is_file()); + + // 同一条链路继续建项目:线上模板 → 本机安装 → 新项目目录。 + let projects_root = unique_projects_root(); + let created = create_project_from_installed_template_at( + &projects_root, + project_root, + Some("线上模板项目"), + false, + ) + .expect("create project from live template"); + assert_eq!(created.manifest.name, "线上模板项目"); + let created_root = Path::new(&created.project_path); + assert!(created_root.join("game/index.html").is_file()); + assert!(created_root.join("game/main.js").is_file()); + assert!(created_root.join(".agent/manifest.json").is_file()); + fs::remove_dir_all(&projects_root).ok(); + } +} diff --git a/apps/ai-game-creator-shell/src-tauri/tauri.conf.json b/apps/ai-game-creator-shell/src-tauri/tauri.conf.json index 1d4c33053..f27f09c66 100644 --- a/apps/ai-game-creator-shell/src-tauri/tauri.conf.json +++ b/apps/ai-game-creator-shell/src-tauri/tauri.conf.json @@ -24,8 +24,8 @@ } ], "security": { - "csp": "default-src 'self' customprotocol: asset:; img-src 'self' asset: data: blob:; media-src 'self' asset: data: blob:; connect-src 'self' https://agc-dev.oss-rg-china-mainland.aliyuncs.com http://127.0.0.1:* ws://127.0.0.1:*; script-src 'self'; style-src 'self' 'unsafe-inline'; frame-src 'self' http://127.0.0.1:*", - "devCsp": "default-src 'self' customprotocol: asset: http://127.0.0.1:*; img-src 'self' asset: http://127.0.0.1:* data: blob:; media-src 'self' asset: http://127.0.0.1:* data: blob:; connect-src 'self' https://agc-dev.oss-rg-china-mainland.aliyuncs.com http://127.0.0.1:* ws://127.0.0.1:*; script-src 'self'; style-src 'self' 'unsafe-inline'; frame-src 'self' http://127.0.0.1:*" + "csp": "default-src 'self' customprotocol: asset:; img-src 'self' asset: data: blob: https://agc-dev.oss-rg-china-mainland.aliyuncs.com; media-src 'self' asset: data: blob:; connect-src 'self' https://agc-dev.oss-rg-china-mainland.aliyuncs.com http://127.0.0.1:* ws://127.0.0.1:*; script-src 'self'; style-src 'self' 'unsafe-inline'; frame-src 'self' http://127.0.0.1:*", + "devCsp": "default-src 'self' customprotocol: asset: http://127.0.0.1:*; img-src 'self' asset: http://127.0.0.1:* data: blob: https://agc-dev.oss-rg-china-mainland.aliyuncs.com; media-src 'self' asset: http://127.0.0.1:* data: blob:; connect-src 'self' https://agc-dev.oss-rg-china-mainland.aliyuncs.com http://127.0.0.1:* ws://127.0.0.1:*; script-src 'self'; style-src 'self' 'unsafe-inline'; frame-src 'self' http://127.0.0.1:*" } }, "bundle": { diff --git a/apps/ai-game-creator-shell/src-tauri/tests/fixtures/agc-template-library-index.json b/apps/ai-game-creator-shell/src-tauri/tests/fixtures/agc-template-library-index.json new file mode 100644 index 000000000..7cf1b85a7 --- /dev/null +++ b/apps/ai-game-creator-shell/src-tauri/tests/fixtures/agc-template-library-index.json @@ -0,0 +1,133 @@ +{ + "schemaVersion": "agc-template-library.v1", + "library": "agc-game-templates", + "libraryVersion": 1, + "updatedAt": "2026-09-17T03:22:43Z", + "templates": [ + { + "id": "blank-2d-canvas", + "title": "空白二维画布工程", + "summary": "原生 Canvas 二维空白工程:自适应画布、按设备像素比缩放与 requestAnimationFrame 主循环已就绪。", + "tags": [ + "空白", + "起步工程", + "2d", + "canvas" + ], + "runtime": "html", + "engine": "canvas", + "engineVersion": "", + "templateVersion": "0.1.0", + "updatedAt": "2026-09-17T03:22:43Z", + "entry": "game/index.html", + "zipKey": "templates/v1/blank-2d-canvas/template.zip", + "zipSizeBytes": 1534, + "zipSha256": "ff8f84e4793941acaf161738c2795f65c5d5390de8614f51aa9e3a5771767134", + "coverKey": "templates/v1/blank-2d-canvas/cover.svg", + "coverWidth": 960, + "coverHeight": 540, + "coverSha256": "afb753dc6d3de0f9fb6e03ec94f2be7221dd04c9d4ab3cf92311879f0af25192", + "metadataKey": "templates/v1/blank-2d-canvas/template.json" + }, + { + "id": "blank-3d-scene", + "title": "空白三维场景工程", + "summary": "Three.js 空白场景:空场景、透视相机、网格地面与自适应视口已就绪,适合从零搭三维玩法。", + "tags": [ + "空白", + "起步工程", + "3d", + "three.js" + ], + "runtime": "html", + "engine": "three.js", + "engineVersion": "0.180.0", + "templateVersion": "0.1.0", + "updatedAt": "2026-09-17T03:22:43Z", + "entry": "game/index.html", + "zipKey": "templates/v1/blank-3d-scene/template.zip", + "zipSizeBytes": 1644, + "zipSha256": "f3f295f4e5adcf1445d75229dc1b583376a9bc96d3f27a257d69ee3b7cace892", + "coverKey": "templates/v1/blank-3d-scene/cover.svg", + "coverWidth": 960, + "coverHeight": 540, + "coverSha256": "1429232adaf6df4457e45b4fc8d7ee9fab2e6bffce9f3f0016e91b81bb66c6a7", + "metadataKey": "templates/v1/blank-3d-scene/template.json" + }, + { + "id": "blank-web", + "title": "空白网页工程", + "summary": "最小网页工程(HTML + CSS + 原生 JS + Vite),没有任何引擎依赖,适合从零写玩法。", + "tags": [ + "空白", + "起步工程", + "网页", + "原生" + ], + "runtime": "html", + "engine": "none", + "engineVersion": "", + "templateVersion": "0.1.0", + "updatedAt": "2026-09-17T03:22:43Z", + "entry": "game/index.html", + "zipKey": "templates/v1/blank-web/template.zip", + "zipSizeBytes": 1212, + "zipSha256": "6fa4391f30342e8dcbdcf735f990d2534ea50405f119e4fa5879b83e8f00119e", + "coverKey": "templates/v1/blank-web/cover.svg", + "coverWidth": 960, + "coverHeight": 540, + "coverSha256": "326a2753386618971b1311043effa46c2e74bc1cfb116862c0ee4097dcd5086a", + "metadataKey": "templates/v1/blank-web/template.json" + }, + { + "id": "phaser-2d-starter", + "title": "Phaser 2D 起步工程", + "summary": "AGC 新建项目使用的默认二维起步工程(Phaser 4 + Vite),解压后即为可运行项目根。", + "tags": [ + "起步工程", + "2d", + "phaser", + "像素" + ], + "runtime": "html", + "engine": "phaser", + "engineVersion": "4.2.1", + "templateVersion": "0.1.0", + "updatedAt": "2026-09-17T03:22:43Z", + "entry": "game/index.html", + "zipKey": "templates/v1/phaser-2d-starter/template.zip", + "zipSizeBytes": 8770, + "zipSha256": "9026856c3c0b3a42401172e36ce8b450a65e9f11eb9096624d8990d51449d8ce", + "coverKey": "templates/v1/phaser-2d-starter/cover.svg", + "coverWidth": 960, + "coverHeight": 540, + "coverSha256": "fdb422027bf54bf755b2b91cd21fa10fdd7ce3f5c7e3ccd9ac3ffba602b12b96", + "metadataKey": "templates/v1/phaser-2d-starter/template.json" + }, + { + "id": "threejs-3d-starter", + "title": "Three.js 3D 起步工程", + "summary": "网页三维起步工程(Three.js + Vite),自带可旋转立方体场景、方向光与自适应视口。", + "tags": [ + "起步工程", + "3d", + "three.js", + "网页" + ], + "runtime": "html", + "engine": "three.js", + "engineVersion": "0.180.0", + "templateVersion": "0.1.0", + "updatedAt": "2026-09-17T03:22:43Z", + "entry": "game/index.html", + "zipKey": "templates/v1/threejs-3d-starter/template.zip", + "zipSizeBytes": 1697, + "zipSha256": "03096152b17cd6d55e7f6ccd518485136133cb54fd2a5a5d0ac8e0974149155c", + "coverKey": "templates/v1/threejs-3d-starter/cover.svg", + "coverWidth": 960, + "coverHeight": 540, + "coverSha256": "7ba013e8a8b515d7aff7146fe401afe5ba3416b9c69db181179705e1bce01beb", + "metadataKey": "templates/v1/threejs-3d-starter/template.json" + } + ] +} diff --git a/apps/ai-game-creator-shell/src/components/WindowChrome.tsx b/apps/ai-game-creator-shell/src/components/WindowChrome.tsx index 70f9eb496..b82edbc3f 100644 --- a/apps/ai-game-creator-shell/src/components/WindowChrome.tsx +++ b/apps/ai-game-creator-shell/src/components/WindowChrome.tsx @@ -1,6 +1,12 @@ import { getCurrentWindow } from '@tauri-apps/api/window'; import { Copy, Minus, Square, X } from 'lucide-react'; -import { type ReactNode, useCallback, useEffect, useState } from 'react'; +import { + type ReactNode, + useCallback, + useEffect, + useMemo, + useState, +} from 'react'; import brandIcon from '../../../../packages/shared/src/icons/taonier-product-ip.png'; import { ActiveProjectRunsPanel } from '../features/app-shell/ActiveProjectRunsPanel'; @@ -49,14 +55,21 @@ export function WindowChrome({ children }: WindowChromeProps) { setTitleState(normalizedTitle || WINDOW_CHROME_DEFAULT_TITLE); }, []); - const contextValue: WindowChromeContextValue = { - isWindowChrome: true, - title, - setTitle, - walletSlot, - activeProjectRuns, - setActiveProjectRuns, - }; + /** + * context value 必须 memo:内联对象会让所有 `useWindowChrome()` 消费方在标题栏 + * 每次渲染时都重新拿到新对象,进而连带重跑它们依赖 context 的 effect。 + */ + const contextValue = useMemo( + () => ({ + isWindowChrome: true, + title, + setTitle, + walletSlot, + activeProjectRuns, + setActiveProjectRuns, + }), + [title, setTitle, walletSlot, activeProjectRuns], + ); const [isMaximized, setIsMaximized] = useState(false); diff --git a/apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts b/apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts index f859284e1..a9d4c478e 100644 --- a/apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts +++ b/apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts @@ -38,6 +38,14 @@ export function useDirectActiveTurns({ const [snapshotReadFailed, setSnapshotReadFailed] = useState(false); const mountedRef = useRef(true); const inFlightRef = useRef | null>(null); + /** + * 上一次成功读取到的快照签名。 + * + * 轮询每 5 秒跑一次,如果每次都 `setActiveTurns(新数组)`,即使内容一模一样也会 + * 换掉数组身份:所有依赖 `activeTurns` 的 effect 都会跟着重跑(窗口标题栏的活动项目 + * 面板就是这么被反复重发布的)。这里只在内容真的变了才更新状态。 + */ + const lastSnapshotSignatureRef = useRef(''); const retryTimerRef = useRef(null); useEffect(() => { @@ -72,7 +80,12 @@ export function useDirectActiveTurns({ if (!mountedRef.current) { return; } - setActiveTurns(Array.isArray(turns) ? turns : []); + const nextTurns = Array.isArray(turns) ? turns : []; + const nextSignature = JSON.stringify(nextTurns); + if (nextSignature !== lastSnapshotSignatureRef.current) { + lastSnapshotSignatureRef.current = nextSignature; + setActiveTurns(nextTurns); + } setSnapshotReadFailed(false); inFlightRef.current = null; return; @@ -99,8 +112,10 @@ export function useDirectActiveTurns({ useEffect(() => { if (!enabled || !invoke) { - setActiveTurns([]); - setSnapshotReadFailed(false); + lastSnapshotSignatureRef.current = ''; + // 空态也要保持引用稳定:已经空了就不要再换一个新数组。 + setActiveTurns((current) => (current.length === 0 ? current : [])); + setSnapshotReadFailed((current) => (current ? false : current)); return; } void refreshActiveTurns(); diff --git a/apps/ai-game-creator-shell/src/features/app-shell/WorkspaceLauncher.tsx b/apps/ai-game-creator-shell/src/features/app-shell/WorkspaceLauncher.tsx index d7c064561..85107f7b9 100644 --- a/apps/ai-game-creator-shell/src/features/app-shell/WorkspaceLauncher.tsx +++ b/apps/ai-game-creator-shell/src/features/app-shell/WorkspaceLauncher.tsx @@ -32,8 +32,10 @@ import { type ProjectManifestSnapshotSource, rereadAuthoritativeProjectManifestSnapshot, } from '../../view/project-development/projectResourceLiveUpdateModel'; +import TemplateLibraryView from '../../view/template-library'; import { useDirectActiveTurns } from '../agent-runtime/directActiveTurns'; import { RuntimeConfigDialog } from '../runtime-config/RuntimeConfigDialog'; +import { useTemplateLibrary } from '../template-library/useTemplateLibrary'; import { AccountWalletBar, AccountWalletDialogs } from './AccountWallet'; import { DeveloperAgentDialogs, @@ -90,6 +92,11 @@ export function WorkspaceLauncherShell({ setAgentChatProjectPath: developerAgent.setAgentChatProjectPath, rememberRecentWorkspace, }); + const templateLibrary = useTemplateLibrary({ + onProjectCreated: async (result) => { + await homeProject.enterCreatedTemplateProject(result); + }, + }); const { projectPath, setProjectPath, @@ -222,17 +229,29 @@ export function WorkspaceLauncherShell({ [setProjectPath], ); + /** + * 项目卡片面板发布给窗口标题栏的回调必须走 ref。 + * + * `openProject` 来自 `useHomeProjectCreation` 的普通函数(每次渲染都是新身份), + * 所以 `openActiveProject` 的引用每渲染都变;如果它进 effect 依赖,就会变成 + * 「effect 每渲染重跑 → cleanup/setActiveProjectRuns 改 WindowChrome 状态 → 重新渲染」 + * 的无限 setState 循环(React 报 `Maximum update depth exceeded`)。 + * 这里只让 effect 依赖真正的数据,回调通过 ref 取最新实现。 + */ + const openActiveProjectRef = useRef(openActiveProject); + openActiveProjectRef.current = openActiveProject; + useEffect(() => { setActiveProjectRuns({ activeTurns, currentProjectPath: currentProjectContext?.projectPath ?? null, readFailed: snapshotReadFailed, - onOpenProject: openActiveProject, + onOpenProject: (projectPath: string) => + openActiveProjectRef.current(projectPath), }); }, [ activeTurns, currentProjectContext?.projectPath, - openActiveProject, setActiveProjectRuns, snapshotReadFailed, ]); @@ -580,6 +599,13 @@ export function WorkspaceLauncherShell({ void openProject(path, 'open'); }} onProjectPick={() => void homeProject.pickAndOpenProject()} + templateRecommendations={templateLibrary.templates} + templateLibraryLoading={ + templateLibrary.status === 'loading' || + templateLibrary.status === 'idle' + } + templateLibraryError={templateLibrary.error} + onTemplateLibraryOpen={() => setLauncherView('template-library')} /> ) : launcherView === 'projects' ? ( + ) : launcherView === 'template-library' ? ( + setLauncherView('home')} + /> ) : launcherView === 'agent-chat' ? ( > { + if (columnCount <= 0) { + return []; + } + const rows: Array> = []; + for (let index = 0; index < templates.length; index += columnCount) { + const row: Array = []; + for (let column = 0; column < columnCount; column += 1) { + row.push(templates[index + column] ?? null); + } + rows.push(row); + } + return rows; +} + +/** 虚拟列表的稳定 key:行内槽位固定,避免筛选后复用错卡片。 */ +export function templateGridItemKey( + rowIndex: number, + columnIndex: number, +): string { + return `template-cell-${rowIndex}-${columnIndex}`; +} diff --git a/apps/ai-game-creator-shell/src/features/template-library/templateLibraryModel.ts b/apps/ai-game-creator-shell/src/features/template-library/templateLibraryModel.ts new file mode 100644 index 000000000..65f460fb9 --- /dev/null +++ b/apps/ai-game-creator-shell/src/features/template-library/templateLibraryModel.ts @@ -0,0 +1,208 @@ +/** + * AGC 模板库的前端模型:清单类型、搜索与筛选的纯函数。 + * + * 真源在 OSS 清单与 Rust 侧(`fetch_game_template_library`);这里只做展示层派生, + * 不缓存业务真相,也不拼远端地址(URL 由 Rust 侧按受信任 OSS 前缀给出)。 + */ + +export type GameTemplateLibrarySource = 'network' | 'cache'; + +export type GameTemplateEntry = { + id: string; + title: string; + summary: string; + tags: string[]; + runtime: string; + engine: string; + engineVersion: string; + templateVersion: string; + updatedAt: string; + entry: string; + zipUrl: string; + zipSizeBytes: number; + zipSha256: string; + coverUrl: string; + coverWidth: number; + coverHeight: number; + installed: boolean; + installedVersion: string | null; + installedAtMillis: number | null; +}; + +export type GameTemplateLibrarySnapshot = { + schemaVersion: string; + library: string; + libraryVersion: number; + updatedAt: string; + fetchedAtMillis: number; + source: GameTemplateLibrarySource; + templates: GameTemplateEntry[]; +}; + +export type InstalledGameTemplate = { + templateId: string; + templateVersion: string; + installedAtMillis: number; + zipSha256: string; + fileCount: number; + projectDir: string; +}; + +export type TemplateLibraryFilters = { + query: string; + tags: readonly string[]; + runtime: string; + installedOnly: boolean; +}; + +export const EMPTY_TEMPLATE_LIBRARY_FILTERS: TemplateLibraryFilters = { + query: '', + tags: [], + runtime: '', + installedOnly: false, +}; + +const RUNTIME_LABELS: Record = { + html: '网页', + unity: 'Unity', + godot: 'Godot', + cocos: 'Cocos', +}; + +export function templateRuntimeLabel(runtime: string): string { + const normalized = runtime.trim().toLowerCase(); + if (!normalized) return '未标注运行时'; + return RUNTIME_LABELS[normalized] ?? runtime.trim(); +} + +/** + * 空白分隔的多个关键词之间是「与」关系:每个词都必须命中标题、简介、标签或引擎, + * 这样「三消 像素」不会退化成命中任意一个就出现的宽泛搜索。 + */ +export function templateMatchesQuery( + template: GameTemplateEntry, + query: string, +): boolean { + const terms = query + .toLowerCase() + .split(/\s+/u) + .filter((term) => term.length > 0); + if (terms.length === 0) { + return true; + } + const haystack = [ + template.title, + template.summary, + template.engine, + template.runtime, + template.tags.join(' '), + ] + .join(' ') + .toLowerCase(); + return terms.every((term) => haystack.includes(term)); +} + +export function filterGameTemplates( + templates: readonly GameTemplateEntry[], + filters: TemplateLibraryFilters, +): GameTemplateEntry[] { + const selectedTags = filters.tags + .map((tag) => tag.trim().toLowerCase()) + .filter((tag) => tag.length > 0); + const runtime = filters.runtime.trim().toLowerCase(); + return templates.filter((template) => { + if (filters.installedOnly && !template.installed) { + return false; + } + if (runtime && template.runtime.trim().toLowerCase() !== runtime) { + return false; + } + if (selectedTags.length > 0) { + const templateTags = template.tags.map((tag) => tag.toLowerCase()); + if (!selectedTags.some((tag) => templateTags.includes(tag))) { + return false; + } + } + return templateMatchesQuery(template, filters.query); + }); +} + +/** 标签按出现次数降序,次数相同按名称排序,保证筛选条顺序稳定。 */ +export function collectGameTemplateTags( + templates: readonly GameTemplateEntry[], +): string[] { + const counts = new Map(); + for (const template of templates) { + for (const tag of template.tags) { + const trimmed = tag.trim(); + if (!trimmed) continue; + counts.set(trimmed, (counts.get(trimmed) ?? 0) + 1); + } + } + return [...counts.entries()] + .sort( + ([leftTag, leftCount], [rightTag, rightCount]) => + rightCount - leftCount || leftTag.localeCompare(rightTag, 'zh-CN'), + ) + .map(([tag]) => tag); +} + +export function collectGameTemplateRuntimes( + templates: readonly GameTemplateEntry[], +): string[] { + const runtimes = new Set(); + for (const template of templates) { + const runtime = template.runtime.trim().toLowerCase(); + if (runtime) runtimes.add(runtime); + } + return [...runtimes].sort((left, right) => + left.localeCompare(right, 'zh-CN'), + ); +} + +export function formatGameTemplateSize(bytes: number): string { + if (!Number.isFinite(bytes) || bytes <= 0) { + return '--'; + } + if (bytes < 1024) { + return `${Math.round(bytes)} B`; + } + if (bytes < 1024 * 1024) { + return `${(bytes / 1024).toFixed(1)} KB`; + } + return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; +} + +export function isTemplateLibraryFiltersEmpty( + filters: TemplateLibraryFilters, +): boolean { + return ( + !filters.query.trim() && + filters.tags.length === 0 && + !filters.runtime.trim() && + !filters.installedOnly + ); +} + +export function toggleGameTemplateTag( + filters: TemplateLibraryFilters, + tag: string, +): TemplateLibraryFilters { + const exists = filters.tags.includes(tag); + return { + ...filters, + tags: exists + ? filters.tags.filter((value) => value !== tag) + : [...filters.tags, tag], + }; +} + +/** + * 已安装版本低于清单版本时必须重新下载;已安装且版本一致才算可直接使用。 + */ +export function needsTemplateDownload(template: GameTemplateEntry): boolean { + return ( + !template.installed || + template.installedVersion !== template.templateVersion + ); +} diff --git a/apps/ai-game-creator-shell/src/features/template-library/useTemplateLibrary.ts b/apps/ai-game-creator-shell/src/features/template-library/useTemplateLibrary.ts new file mode 100644 index 000000000..aa1ef20a7 --- /dev/null +++ b/apps/ai-game-creator-shell/src/features/template-library/useTemplateLibrary.ts @@ -0,0 +1,243 @@ +/** + * 模板库状态链路:拉取清单、下载模板、用模板建项目。 + * + * 远端真相全在 Rust 侧命令里(受信任 OSS 前缀 + 摘要校验 + 本机安装记录); + * 这里只维护界面状态,并在下载成功后把对应条目的安装状态就地更新, + * 避免为了一个"已下载"徽标再打一次清单请求。 + */ + +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; + +import { resolveTauriInvoke } from '../../app/tauri'; +import type { InitLocalProjectResult } from '../../app/types'; +import { + collectGameTemplateRuntimes, + collectGameTemplateTags, + EMPTY_TEMPLATE_LIBRARY_FILTERS, + filterGameTemplates, + type GameTemplateEntry, + type GameTemplateLibrarySnapshot, + type InstalledGameTemplate, + isTemplateLibraryFiltersEmpty, + needsTemplateDownload, + type TemplateLibraryFilters, + toggleGameTemplateTag, +} from './templateLibraryModel'; + +export type TemplateLibraryStatus = 'idle' | 'loading' | 'ready' | 'error'; +export type TemplateLibraryBusyKind = 'download' | 'create'; + +type UseTemplateLibraryOptions = { + /** 项目已建好:由调用方负责进入项目工作区(模板库不碰工作区状态)。 */ + onProjectCreated: (result: InitLocalProjectResult) => Promise | void; +}; + +function errorMessage(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +export function useTemplateLibrary({ + onProjectCreated, +}: UseTemplateLibraryOptions) { + const [snapshot, setSnapshot] = useState( + null, + ); + const [status, setStatus] = useState('idle'); + const [error, setError] = useState(''); + const [notice, setNotice] = useState(''); + const [filters, setFilters] = useState( + EMPTY_TEMPLATE_LIBRARY_FILTERS, + ); + const [busyTemplateId, setBusyTemplateId] = useState(null); + const [busyKind, setBusyKind] = useState( + null, + ); + const loadingRef = useRef(false); + + const refresh = useCallback(async () => { + if (loadingRef.current) { + return; + } + const invoke = resolveTauriInvoke(); + if (!invoke) { + setStatus('error'); + setError('需要在陶泥儿客户端内运行'); + return; + } + loadingRef.current = true; + setStatus('loading'); + setError(''); + try { + const next = await invoke( + 'fetch_game_template_library', + ); + setSnapshot(next); + setStatus('ready'); + setNotice( + next.source === 'cache' ? '远端清单暂时读不到,当前展示本机缓存' : '', + ); + } catch (nextError) { + setStatus('error'); + setError(errorMessage(nextError)); + } finally { + loadingRef.current = false; + } + }, []); + + useEffect(() => { + void refresh(); + }, [refresh]); + + const downloadTemplate = useCallback(async (template: GameTemplateEntry) => { + const invoke = resolveTauriInvoke(); + if (!invoke) { + throw new Error('需要在陶泥儿客户端内运行'); + } + setBusyTemplateId(template.id); + setBusyKind('download'); + setError(''); + try { + const installed = await invoke( + 'download_game_template', + { + templateId: template.id, + templateVersion: template.templateVersion, + }, + ); + setSnapshot((current) => + current + ? { + ...current, + templates: current.templates.map((entry) => + entry.id === template.id + ? { + ...entry, + installed: true, + installedVersion: installed.templateVersion, + installedAtMillis: installed.installedAtMillis, + } + : entry, + ), + } + : current, + ); + setNotice(`已下载模板「${template.title}」`); + return installed; + } catch (nextError) { + setError(errorMessage(nextError)); + throw nextError; + } finally { + setBusyTemplateId(null); + setBusyKind(null); + } + }, []); + + const createProjectFromTemplate = useCallback( + async (template: GameTemplateEntry) => { + const invoke = resolveTauriInvoke(); + if (!invoke) { + throw new Error('需要在陶泥儿客户端内运行'); + } + try { + if (needsTemplateDownload(template)) { + await downloadTemplate(template); + } + setBusyTemplateId(template.id); + setBusyKind('create'); + setError(''); + setNotice(`正在用模板「${template.title}」创建项目`); + const result = await invoke( + 'create_automatic_local_game_project_from_template', + { + templateId: template.id, + templateVersion: template.templateVersion, + name: null, + planning: false, + }, + ); + await onProjectCreated(result); + setNotice(`已用模板「${template.title}」创建项目`); + return result; + } catch (nextError) { + setError(errorMessage(nextError)); + throw nextError; + } finally { + setBusyTemplateId(null); + setBusyKind(null); + } + }, + [downloadTemplate, onProjectCreated], + ); + + const templates = useMemo( + () => snapshot?.templates ?? [], + [snapshot?.templates], + ); + const visibleTemplates = useMemo( + () => filterGameTemplates(templates, filters), + [templates, filters], + ); + const tagOptions = useMemo( + () => collectGameTemplateTags(templates), + [templates], + ); + const runtimeOptions = useMemo( + () => collectGameTemplateRuntimes(templates), + [templates], + ); + const installedCount = useMemo( + () => templates.filter((template) => template.installed).length, + [templates], + ); + const filtersActive = !isTemplateLibraryFiltersEmpty(filters); + + const setQuery = useCallback((query: string) => { + setFilters((current) => ({ ...current, query })); + }, []); + + const selectRuntime = useCallback((runtime: string) => { + setFilters((current) => ({ + ...current, + runtime: current.runtime === runtime ? '' : runtime, + })); + }, []); + + const toggleTag = useCallback((tag: string) => { + setFilters((current) => toggleGameTemplateTag(current, tag)); + }, []); + + const setInstalledOnly = useCallback((installedOnly: boolean) => { + setFilters((current) => ({ ...current, installedOnly })); + }, []); + + const clearFilters = useCallback(() => { + setFilters(EMPTY_TEMPLATE_LIBRARY_FILTERS); + }, []); + + return { + snapshot, + status, + error, + notice, + templates, + visibleTemplates, + tagOptions, + runtimeOptions, + installedCount, + filters, + filtersActive, + setQuery, + selectRuntime, + toggleTag, + setInstalledOnly, + clearFilters, + busyTemplateId, + busyKind, + refresh, + downloadTemplate, + createProjectFromTemplate, + clearNotice: useCallback(() => setNotice(''), []), + }; +} + +export type TemplateLibraryController = ReturnType; diff --git a/apps/ai-game-creator-shell/src/view/home/InspirationGallery.tsx b/apps/ai-game-creator-shell/src/view/home/InspirationGallery.tsx deleted file mode 100644 index dc15824e9..000000000 --- a/apps/ai-game-creator-shell/src/view/home/InspirationGallery.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { useEffect, useState } from 'react'; -import { createPortal } from 'react-dom'; - -// TODO: 后续改为由服务器下发灵感资源;届时保留此组件的展示与预览交互,移除本地目录扫描。 -const INSPIRATION_IMAGES = Object.entries( - import.meta.glob('./assets/inspiration/*.{webp,png,jpg,jpeg}', { - eager: true, - import: 'default', - query: '?url', - }), -) - .sort(([left], [right]) => - left.localeCompare(right, undefined, { numeric: true }), - ) - .map(([, image]) => image as string); - -export default function InspirationGallery() { - const [selectedImage, setSelectedImage] = useState(null); - - useEffect(() => { - if (!selectedImage) { - return; - } - const previousOverflow = document.body.style.overflow; - document.body.style.overflow = 'hidden'; - const handleKeyDown = (event: KeyboardEvent) => { - if (event.key === 'Escape') { - setSelectedImage(null); - } - }; - window.addEventListener('keydown', handleKeyDown); - return () => { - document.body.style.overflow = previousOverflow; - window.removeEventListener('keydown', handleKeyDown); - }; - }, [selectedImage]); - - return ( - <> -
- {INSPIRATION_IMAGES.map((image, index) => ( - - ))} -
- - {selectedImage - ? createPortal( -
setSelectedImage(null)} - > - 放大的灵感图片 event.stopPropagation()} - /> -
, - document.body, - ) - : null} - - ); -} diff --git a/apps/ai-game-creator-shell/src/view/home/TemplateRecommendations.tsx b/apps/ai-game-creator-shell/src/view/home/TemplateRecommendations.tsx new file mode 100644 index 000000000..56c4b1be6 --- /dev/null +++ b/apps/ai-game-creator-shell/src/view/home/TemplateRecommendations.tsx @@ -0,0 +1,96 @@ +import { BadgeCheck, Loader2, Package } from 'lucide-react'; + +import type { GameTemplateEntry } from '../../features/template-library/templateLibraryModel'; +import { templateRuntimeLabel } from '../../features/template-library/templateLibraryModel'; + +type TemplateRecommendationsProps = { + templates: readonly GameTemplateEntry[]; + loading: boolean; + error: string; + onOpenLibrary: () => void; +}; + +const RECOMMENDATION_LIMIT = 6; + +/** + * 首页模板推荐:只做展示与跳转,下载与建项目都在模板库页面里完成, + * 避免首页的卡片点击直接产生项目副作用。 + */ +export default function TemplateRecommendations({ + templates, + loading, + error, + onOpenLibrary, +}: TemplateRecommendationsProps) { + if (loading && templates.length === 0) { + return ( +
+
+ ); + } + + if (templates.length === 0) { + return ( +
+
+ ); + } + + return ( +
+ {templates.slice(0, RECOMMENDATION_LIMIT).map((template) => ( + + ))} +
+ ); +} diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-01.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-01.webp deleted file mode 100644 index 25821e8043e86ff5ef9ea3334296612df5737f0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37308 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�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 diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-02.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-02.webp deleted file mode 100644 index ce26591db25e943b45ae30ff55e4ea5fdca759e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28182 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 diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-03.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-03.webp deleted file mode 100644 index 90287a674999f316d237e0225796b3c7919907da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11080 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 OeGky@fuI9QKmY&=WQy7V diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-04.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-04.webp deleted file mode 100644 index 8fa04357a478aac1a22f6012f3e307173bc33dd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23894 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 Y00000000000000BbASK<000000Ag6cKmY&$ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-05.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-05.webp deleted file mode 100644 index cc657f1efdd4e8b26ef5e561c2db795217d06c88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29646 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 Vs&-~Sb?X308Xu-W;!hv|004o}$0z^* diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-06.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-06.webp deleted file mode 100644 index bf922e8d3fb18c71aa8166def843b4ad20ca6aa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15322 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 b{;JJIJ;3IM2-EjK^ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-07.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-07.webp deleted file mode 100644 index 67048cfb99fb605d6a6b8209530aaf11b187aada..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29706 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 diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-09.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-09.webp deleted file mode 100644 index d98a01ec7b1a28c934145113f5e69aa8313b3f30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40460 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 eB^%vnp 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⁡x_xRv)|>p*5%ZKAjYT-E(S;-XP#29!gdb)wYV3c*y(!FIK?8i zfhq`AvWR|Y)$U1XwpGyDZ{WLjR~iCPnnno#tBg|@!ml5oh#R`W3#~fos~2LUe$>3u zX}$L$0-4?i_0;!_7A>BW=~Q6B1eI4Oze&J0240D&v>!b;J9lPfcLG(&T$<}mKicbz z`|i<@BlpfSJMnHutDUjn(3kxZK;yW)j+fPcaV_irhgwFU!qsh=Co>{tStJ&baA{sH zjYL&n0I-r2BYH#kdq%ie&W~nUK_Hl&VGZX8(feOqiNsfIb7qdB-L!-Ga>@XfSY<&u4}f82#NkQxPXv)Fa7PEBbzxdMK6ogBW%K z6`JBLjUXAy(dPz2+vkDoMnnqmXWQ*yZ(+6^o-CZD!f^(MdV{; zTcTW2`0)+l1Xr3`i)Rx|pUw~z6`DV)xFFaGgan5;+N!D^K-Y+4^04D+odE2TB3m$@ zMR?!Ln~$dolWrR}i~P!qOiEJQvyDX7%aOc$U%sT*+KamX#DD=s$bSbV*m2x;CV<|= zUdawwS_)mi>9iqdyPRcwd4N_0kZd9PSOdUDX|*Ly^q>~pUbK$Ygz@XtSIi&8$bBI! ze#AklM8ATqee77nffMjbzy#&e05yE7BvfT83t0jn;!TdqKa3qSJ_r1ApW-N|O(1B< z1O++He81~nCimaxWL{Kc0Z_O}QVcb&RnXO!X@|`{1TCAH+qZSFkR^ zsat+IH)J(iZs7D(Qs4qQciKma1#aq_Ji=q`SO5fS!`eA(G(&WVYu2S|#uxBU9LV?9 z$-J3s{30_7Fy%5LBV}Hx=(0z=JyF_w?qc}GmrT|v;kL=aL;4B2#&lbatg3vQQTiQ^WbtxKCWgGj|+6t z$G*wP`RgKz1$cqzGTI>2$4Z4b-K(*)1@_+8}883q;;buJGVv4l#KiG?KNIweh2pY@EQKC@YqgYoYCOXtN@u zUAn|IqM`?v+g{gKi8ls4Ot*&Ni5J&;SBPhtd}{ zG+)TdKpfIvcUA(Y`5N)v{&*&29cgp_l_0%_17$$*Us$bNdcWgW0iN%YE+;RA1bHMI zhe(#VfB?DmWYZX*pV$&+WvmQjp5<>(I5`-Vllex{MO5(yIgZ}1` aj}(;79euyRj4Xz#bc-ZTE+WDVfB*n{xSLe~ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-11.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-11.webp deleted file mode 100644 index b147b8ff769f370fb72d8d54c34f4416edc379da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24782 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 diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-13.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-13.webp deleted file mode 100644 index 7da22fa4fdb3d17da8ab07bcd88eaf761d4de860..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13582 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 Z+i^$Ox2@fk%cu(|-0UxG6ow!m{|C)EULXJf diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-14.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-14.webp deleted file mode 100644 index 88dcc70cb28a658af393e1e777041c58b87cbb01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31682 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 N6g@*Ze)7`&umD_qD-eGqphe_+)=O> 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 N$eR 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≫5n~FZlDiYI=cA5_Sx&@`!%{qF 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 diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-18.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-18.webp deleted file mode 100644 index cc4bcb6c59c929de855d42dfa9e17bebb8b36103..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8544 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

EJ%be7eKIQJ}~ai1IA(CqzzZM~kmEIwj|b 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 diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-20.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-20.webp deleted file mode 100644 index b55594bba538aa281cb8864009eca280bcd4f295..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19654 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%0Dpsn1+f$gXhq@hG*>*A3(msWmZxG z@l*8kN~EKzzgdvCeQ2pBSu`?c3AgN=5*nK)MixiwI)8n8O>$E1+EDz(PqA$dol-uW z8i+_#hy$V@yCn0aS5Va+fJzVr0`9`QvPgLdP-;*oK5=ZUD_JggZHFOiYwSzB^Q3kBpRs)YI(NjbOq2?@F)S&oYHk>|@32D1SE`&aSbh z^hf;3_h?mb%XR<0lw8q6iIcTXwIp`dN1MXib@abS2)PuwriBcooh zCDI#NMXzJrw#nE6<7279RhB>N+K&PzGFSA#O^5~)`G;r`im3;R&;Z@Ql*DjFn+{TC zc`~m>v+7f$n{>@*78h6|S2iyA2fDUJ2<4qYYJMq(Xn!Xs9PNS%{$YQm_WwV(gVr@h zciM*r#gB8{CtBYZxe{gDwW(Qjt69qZ9jVEnvUX z7YS*!A?M9d%It`;i8l22xV_)jerooDwN=vVT4td{$~e^YSz&zulgG;Qj9NRaisLBM z^|)8iFzoeFOFQLana79ueFmu zecVI^965m_LHeEG~If$}S`lo}IJAr=ebnrHBZ+bcYc(9s zq6ce2e0jQxq96&A$>Z@hSh~N6N&%;}=9bbtD-8oz>bJ~uVXpSS9GcXrW?p$^(_rSJ zvphp;7_&#?Rm#7Tcf!ktOYz_zN>Oc5eaeA>>(RbtRskcnFl`RDza|eT&Q^fzky|mt z_&)C%#WV6_sgM5%A)|Kvf)o`~Z?=UaS$!H%k{T&TVk5{b*g9LM!F&I2-pf;sUNTqj zsv`kCcj$e`AIEC7Pc|fGZs9UFzh_uFa3qpzqmoY*6*F4$NW=l-MCfdWwz0u}09bk` z_Mh_oL0bkqtCb3%&vN>>fHzJ2`%zF0wuu9!g(SCuJ68R&Qi&bSKV~gEdQjRm#N4g9 z4y6wV6fpp!(Mhy>!u^#yH%_?pSW1s*f!;HX)nNxhU_gFUJP{NY!SuRZk3m?E8>d1J&A(lqh z#x`nJgB&MCrZb1%|4U%E!32O#VAZtJV&mL--nUE&rz=qJBh7)A*iPowE0YDT>e(r!@c1gNJeqdvZ9L-8i8S=k4t0&E3jp4-~ad>m%$a~)x6jc|`` z4D~=rn9?nSVu|DdWlRAo`xvEbSkP}oujYMG!$5yjt=2SoeU>Kd1QLnZ(v>zzo#=!o z+n;B;gv7a-44wL>COjbo$PIl5QcVH(HiPF(EtOMd)D0KGx6)&N!bf^gOaj_!ue0>2 zsOwA0!X(&Fd?9$4vc=E^#V0}C;V9HMD{qDR99TbF-Unj^N2&Bh$K-pZ zdM3qb=1QCFOsF@ArT!@iuEf|SvG^f`3Ftt|_VmPOuC*+?HHn6OD&JzCn9$(RVx>f9 zF1G=8hMC#Q(AFf0%r<2Pu_A3$JAl8S!le?`bx!-C9{4l09*0fLF*u(%7c@%y$tflm zz#U>$>C+byWS&JTjFw%Qi%#fCL~;1swObJo)McS|K55F}G*gJf)w?FIv3;7@Ls#j8)3tQV3hMBbv N*NDD~dST!I006rwYbF2y diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-21.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-21.webp deleted file mode 100644 index 31db460177889576f9d35266981c703ae069c4da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34522 zcmV(|K+(TaNk&G}h5!IpMM6+kP&gpQh5!I?00Nx>DgXnp0Y14>p-d+vqarHy>uBH? z31e>bp{InWzguL;nB=T^71toMS_ApthwI7nn)*lhj)v{ZCmtR3bH^=}^$p|y82Ag< zHu&C!&Hvo{-GA8isr_5g!=tzN{)Rs_-TZy*FYY-kzEuAg`8)3$$IsyZi}APe|F!>j z=HHJ#()BX>7v=Bf|Bv>O{on0>i~l$O;r}u03;Cb)-}YXV{oC$~+dt`k+WQ6jEB3GY zpW;1L{}=w}rN6j;!vD4I1N|TSul@fmpV<#8@67+${l@qM{(=5K|8My}c5n2*`hT|k z<@a0qSNp&IzwEvN|DOMO{g3wT|Nrj~_k;icyNB;L|MUrbf!QzQ4#|HYc1!sKvR}v@ zlKw#Km+}W>zmPj6{DIjoDm_0uAn% z!GvLQWW)~1e;{^C_&n8Y3NhAPDjL@w)%A8gnhhItIO*Epe|ujCdTCZ*fv80^l|~L_ z)n!kW*UlvJ3}#xHDcsx%$o&nIUherebf1>G`2*z>esS#d=P53gs?QPNbfDONXKtf} z`cBEgTowcVA>`6Qjrkzw#c@j$_~Twz|Ls{cv!4abMK_*4$o{n7(H*lP-xOzqAqPK@ zV63bj5Kf0df-pc!A5(b%C_;|1SC>V`2k*#~H9(7x zc>kby5CX+3vvB3GM9m-VyfHFY=4_s@L#tEklcF!=K+DLq(4l}j%6);oEdt{aYCM4M z!P7233SfENEcFyUZeLQ`SsQmKI6R7{rViHsf;}wZA+U{7sLfZxVEaz~!fBx_L z#=!R#DRECNbcGrz&uVX(8zoN?4nsfws{7UEu5;)S^f6qSgMz_0@tN8O(>p?LUr~n1 zy4fnjh%Al%S2ggDZ>|=77e^tdn(lZmYuUF zA#tq2q1+oL6LUjQ)iTbn{SK*AG0Hg!MON|Z|3ZyE>r~h(7qX@#rgP>K0t3>(viQ&D z-)F}%9I%Kdbq({hfnj(Fpj&5-{?WLDS$)P~bKE;M4*|!8{w2k~NqNzU(G(0^l+ey_ zGvyOWoJ=KPz5BN>|Mwgi48H;bS06o|3k;uPD(_IcEysn!)MwM ztZc?U3<=<0$&;$MXFn64t!X7AViiLd$3W*jyvXS>nazyR2zLg_h#o%J)bFdH z%Pv$w0WT3#D_d{6ypmPcIu&YFXf-zlJ3G{|3Q`F`;gxW>4UAhv*O+eVbTCYkqi%ma zzkk)freaM)o}Ply@U~>Ms1&&F#K9~xA1;8mjmCppR@7>9KzoA8{&w8Zzy>GB%|i#+ zDS6a~qw1~W39$qf^!V~({~v?}%~o859?1eu@#JZhbNjpa!SalUr8(#G&N{Js;M zR8E9-74?5ttK0JKu<3jnt;;z}EH)xK&p_vYm@ILmR1~qP<>!Qw@0m+hr(c~|&@H4g zl3VEnlRF$+7(Vx2lL9&~r`_P16bHmV&~YM9pmNWBoiqkl`9G}~wta$^r+Iw!PHf*8 zo551>3P}#~n^39i4|DtcK(-YPPJC1CRKgM)mrO`n}8o}q=xUCUm<|I zQ1@2gy<7OorkNgQ+U0mAk2#PvO(l?VB9OZrz{@}R}vfw(u%}+EWOL%VBzh6Nl5DQIa#j?r|${o)*o0S|fy+KHBP#P>yTgT-~XA^C;B=q;w zhABW+(_FyXPR>YTl3*Ya%Ah(tM(OINj>0JTGooeasX@uen-<-E7xFaU4mtm)vbMh% zyf^T;WP?xAb3>t&#nHUGCAbuGlK!mX4wI$n{xGq^p>Ri z5tKY6NhpQ4Z}$soH$Ge%>{hY-G2}VYj+p@Ga48Z0_g8SE6W@YAv1tmvR6}^MP!AXn zy~!pF0QlL@!T&*}xxx6l0`-&11MOqC?vkp38<3Yb0}Iafi!b2X?<5o>qjQe|$$1;B z5PPPWsWhqs@|7n{tx%nlJ6hkH$?D7Wif@%|TIj~99+`?Dq5m@X0yypYT2?dOLey5F z-z3RtFOP?Fk-I8Gp)L=ObW)y+aExLq5=Q7>tV+NWk>LCZxm5d!ZqrwbAlDjY!yPS8 z2|f8oN=UX88lH4X)J9U*4ik%#*gqONyx4CP8$B?PAP40*#UT4vbK#>j*CkF4ojppD3-$BO=lZL0~o-TXVCb-K4=N8LEOLFYz` z9+tqDTY8(HC5tmD`IaA%wu$H-b5kq< zIn;g?RvQF|6ML=B)96HI@^`ZeNnD5Gd~+1&l@So*ub%KJJV7)BBRHW;Vev{G9yts_ zuY+Jm)Ch;RWybk|7u$47gSN-Uc}nyVqt-D;iTY^V4}g9L2`}B20Rx|B6b0H>;ca*u z#>R+Z1)l^4a!TLX9%5-m7jEms@EN~Jl{@{)p}wJ$*^VjLJu>`HOyy#X+|@jh675~y zC;(YU-S52X#fMKRSI$0p>5{YKJBZ9 z;R446HY*b8Nr}qD987D_Z%TR~DR<#Yr9&c1PpL=VE4Ed-m3IvsefO7)i(mrwhuG3v zPU7R8#eW@GSEXDu&uiy8Bbs1HE*eK+Vew_{zF-jn4%6F_ zA+~Uqou~CuQA*I?GWJ#|rJKPNNIy>THG4;VPxXXGsN8R^xQ(u|%a31rOyiH>t^P=jy`+;VZGpuiEOz6ZF^Yy4l~P1jL>O-gt4Vf(3@k z00=ykhF4Rb2d~}`Y{_@6)wtt^=dq;ZIlwSQ;_5@La3#LK)g-VOBN6Z#Rx_QE%<<~^ z;*0j=$QoI46k~fSNdLqc=qi=N&YRdO?8<)v2Tzxqu9Q4illK(}-N7 zwayJ{SN!E!E!6m53iH)X%5!PYbe+as5Uv8?y0UKF=gZ3c3VA#8j*}m+vbxg#u>a~J zv@UE6%M$S9wV`_w8n64A{0HBi=jPx*4ff##BjIa86gj3-8}r3Z$`&T#`*FCYMVETs z$brq0@jNsgq2J&ABaO$31ujGsY_|)TwnVyvF#-i%Rrz`R-)^gTDmqM;pY*oK>cK0tF8WLCVs*3X`8QD&fOOcMIO1i zj~$yUXKh_#7yN%F@!ayUG}D`ujJ#s5)ZUw}Kc@HRq_+b!A%}|gatVu=B(wZhroJu` z&pnqPkkI(rYNnU7!1Ssz@i;s$AJE)a_c2TfZ=Hr@-N0~6ujCHL)gi&qsJd76li{2x z+VFzZr#J6>3Z_uwr)n7(;7nJ|uf158~L{Wd)s&u$BmbxrY_FTWOX0U;G` z0?uOmh|;IuWJqH8Gzd?o@}d7!D3=P$c3*SkEp3cKHF%q&QWgMB-&ARq<@RA~m;`si z&d;ky#ReD}rtVCCJ~oop%-@yc)e0a&uS+TlgQMG^KZ|xSw&1-7nAmV7HRNuUt!~!H zU6t`Wy!(_$6eAwGja-;r>B~^WA1;R3KN74s;*W4%Ku8( zR}G?^XTRpPfeeAVfyxn8v~!^+GDoJ37Jk3A8yfv)lim8JY{4~4;Uc18G$)*Vv-k2m z#2vu+BLfV`D5-oz^}uxxKokxj{DB`&_#=BBGmlX;kSLM`1}j=TaN!aF4iL01{vmpd zT!BkL$=75EajHkE){GxAjG@Zh=2t7lX7rB?Q;t9cY1YaRbF8r0t4 zOBYfy#{t$9G~;8=-&{LV^x>&2QJBm|<~&|iJVFK_Job{+*nd?Tyi<{o7boTfUYI8R z)!FGD?be2Z zZNL<|4)wt&OXMH`{;Mzm000000004>K$HLg01|x%R!1TA z%GMq#o#pwg#_|O$o^6l|9Q1=`uh%!i+6d%}@1`Lpef)+4+=nNP)$00 zitw*_$1G%E2G5$w^^cNl4VHsZp5|6POO7?$oxe!38FnMC^B{0t);HmCCSt$cTtpwz z=G&P2xxDKfApsE_->9~NS^DyV>xYpMmY;+Z4dEwTv(A5&d>|X&I)Tv{5z6MRZwPQ~ zIVY=o7s4J={?Z^|&kC>oS+nTU2J3*yJAeR%ceG#H8RR&5e2N{+_Ge3H^h;CJYZ z#9r$#?S*bciRca|l7jmGoA~|09!C~_wd3D|17u00`=lBk5_t_x!toIUSyPiPHM z*h1A3O%1&t^8?hAddj>eeTI14jg(oDJBGWuYj@+hEQ;i7RUF+9U3Ke!! zEYJ4^7w4UrNY!G+WV9cyBuz=C6|p;LcQ=dB2;ejGY9s1+B5=_wdTcK{V=m-n8>WZI@ z6Z);dG0q6;vENeR$~3|$XJ=a*5+Su%lD_Yl&UzWASD6X^G)fU&q#vsaJ)w)$noF-% z0ZNZJQ?Yz59~3?+Wos5L(QPm!Oz@&iVysuQ6i~mu*CTz(m#ej(&Ca6}+52M&-`VsX;luT&wEwKV1BQyAlAyZYpu>O$xb{LZ5$ziG7@=DeC6RL(put zZX)@lXBQuCvDz5&zfe}l8{2r-Px%1DXRKvZ-vjV+MC)Oo11LPhLz|(8Y~>YnYo}9a|D1xEL*l!pyL00_at6AYDUqAdb7R>aoj*Qy zq+gIJa!E)h?FZV;?8auESn5V3wDh-;rq={LrG_VyJP*c@%ym2Su>x3+lfs$|ar~pb z77+c42~7gz(vaCtO=lo{N;Bc`o2o+$(!wI&f@|H(=Q%7XcS|Qp#DUz1AW47vB*&!V zP`l{9_wV68T#aT5K2UWCDn8JE1EG-!CIbdP(^qj70xL0?_}s;;-fvPc0Dv9Gq~ei3 z=Dn~jnun*gK1!)%{&&v4dyvVl{yFMT`{yMEH)L84Zg>?x_b4L3@#g# z&iHR7a+9?TA>NbRO#cx$?vLW1uYXDc$7&nHz`;A?hoK4R#vM5GT*vat*yvP-kOhoJ zlyYULO;6`cqyM>7)?d17=c_wQD4osWtTHGMvyB~sXH$6jSxK{SG57v)*KFv@by{+k z!F^rZ5}9vhA+_wsOij=mj_dv=4Vk5G5ySOhV|(x}t{Rc{>8L^}WNMb_&egHs#KVp@ zCcYhZ$4a$O)yvP>b38!57s?@I1#K?*@Lw=wUL+Q@L%)~5y2JT9*eH|7cHwMUN4rCH zppmOTWkagkq7wImYaxrplPScEHOV`TLn#R*!B2PXqj%HYpn(q47V8YCiwPY(P8nb| zMUZ^;EjrGNVX;`_&NZ0Sd^Zy+yX#&Fu5y&DGq5$fVNC+0`n^#4`ym!dX>hK7n~zq1 z!M&t_OxD*A)@zkMrs(V5@Bl5|>Xh7mi#E>sGyS(!X4Yb#xCWBFn~m)c{JhZ1=5pNx zz_zmq;lfdYoxfy2V#s5kz9dCU%?njT^D^2w|L~69tgW_cy+@c@$2Ah)V|S-gM))!( zjZx1c@M8-f`T{G-na2g;F3*;xrg?yznM8^QO7`&t0Dn+EO-imUb(g;9r4(dBOHIWw zCx<*O#gEguJX%-7>W3HV;h5Vg!}CWR4{yY^8JSZb2+mgA0;g^!k#7kq9qHBQebTSw zd*onb6#VQr2Awj){62Kt4eG+edD@5G4-1UZp}_5+6%wzf&YS6!@mK97j~&%fPWE~~ z5f-p8H8KmPH-oRnmo$^<-B6TR-@hWj-i=BWnwe)djyrw9zKZ(^gHl{GeK>*8g#cj$ z@U@T9@431<*-j_zUYWC$fHG3wUCP_q)A?aVqVx9*F&fm@9b`S@7Fr>6-q1g#SeNYo zoxs)++G2)j&{h$sLyvLn8t;iAg5gBuB88m7h*H`5yQ=1l1XWMOC$x<+J{$JPhR^tY z_HwFBfHq;L`YKn$zRVISBP5bvCvEJAU`c-Kv4iDu7uz$H(?!sw}5~xL<50<7PV`!u)NH9dw zMqL|d0FmOaY52y*+|)LtLEIBO3pBUUw%XL5hx5_h9Jkpk?Y23?7NDujX6H82i#nIb zq6$AH(c+`?Un}SR;aO1b+<~Co zg(r7XPXs)k`Y)6IFyJOHtdA7M?%wKrwRtKBuC-D@o3j{uMM8I&2y&3&mH+1=c2IO0v>7nJn3P#m124k$^;2fwB63qBvQa} zQk!!s z7lODZKflgGjSsQ*riJ`tlLTS(7FCK=`F({rN%Cuyrwq($GKGK&dIYQ;Up5OW8;k@u zm*!;N*p&`y?hK=gD@4cv+S#f`dqLbVIV0o7!ZAqU6G|7!S6;Hcji&eLK>SlPW8Pc! z3uHVG94jv6ENmyy>5?9kET@b${r>Pw6VRn14uGvga($(G{#^_Xi|c9Z8OLn_cWxjtfR!*ECI;S6!LyZMxY?2?X7jPq{Z7Zu9X80Y_iA@q@>zG^*J zT#526?afV6(-d2CvW*#!9IUOok_-Hm$=}ijivqc+DYW%2z(93g+zr*`0bdvU#GagB zW2pSW!m_;33=KP2ELhjD$T|HF#P3IMy6k0({5|XR0yU{Y)rpH$uKpf2amcyLE2_l;tImY_?czNTSvw)#jn8fT33BmaoNF>F*iIV~(FX%I*@GTI`wC zdC*lCBQk2u?&o&)V19Kv#9tlxIltT9rt;&?VSd!;UdRMLR%BGn>w}<}$q{6d!rpr7 ziKP^$6jLVjoLNh@N(1AIjKx|WC_Q6(?oQVy4i??#G#%CVBK&|KMHHO62(#Agypfu3 z)Oc?Cl+DPMR|XTV`AeFDlBMVM3@f2++>o>2?ODk!8zeacwP1y4xKAPkwo(ZaT9r!V zFiy7N((m)!*|-?c)QxYnb(n5*18WG6)v?wd6yDBHTk;J`HFrg((jfrlG#yI02-GRq ze&h1X%C^e6l=a5&G+bNsx^I}^!TX$fp{~%m$Sk&?;~8M4`5G=bIWDL5z)S8GP!98{ z=LGi;mk?P3dt$NQ)9GHp3}9*RV}rQA8^?oj#&bmU3AUZpUUxYoHATKAI*5^ZPX@kQ z>YqD=9H4%NW#YBcTw{C!c$iV z;nJmGPgKYvLttv}z{}kFclw{j`2?h}YXJmQLOd`-T9z+#WYcDyW0t0D-r3xIZA%)d|M@9Lh+&_0vr~=`pQz zLlrJ!W%Hn#59JTnhQPTO3Iep&}VP(($R8&F6>}NKvzl zose!j<8f3zhqRKJt?CFT}7Lv_Pc|SOK`d5Z4izXF5Ab0=z4a zyhDV%-tiv614$1&)w0-r4=#D~ol-&(=^#NvPkp*!-v&!qn zvIhevVE)f~=T$i|8}HzU#qV>Q2^~efy0}HUT)GAjPEFRl05p|*w|JjCq;cwVQffd! z5Fl_!PuAV(fIA1fkWc$Uv(vMXAK71zAG`|>xQhr6bi+f3WAUPh<|%moCe7~JIR9Xn z%emrFm|Z0N#M;&2e%9R0!JMzc%=eau80MNP6de`U`mx4>xvsd1DEiUkJIv8#WqSJH z(Szz|B6&;ohY<+6s~7i!77Cg+w7G_)hRj#vTP~7<8-DzTT}tDn>A{RfTLtb@ibF(p z65g^_r;}llN8UdS52eNRrI{H`2G5mHUjp;5rSUV`;{7c;fp_p6)y{&8bu@D1-*l^1 z^LV9bZ}_})YkhcfT9rhA0Y`qPvpmOan<~^X-+7=iz2N`LANLUSg;|^3y&v!<(#=>x zy@X^)=(bV8^j7HR9%WjPubP>QY+zXr#cA6{X;4(#8!`i+Zu)YN!#6ri=E|d=POM7E zP>T!dG#T=J830E7)Vr1Iba~_0yzGe>rbnq4dBiPlo70c@#C-l_ckJQ7R7pL*`27dl z4{`s;kG)sf>x(533~q{DTTCy|mu#)nR{pW@?}nf|Yja&a9h>a{WW>6^71|{qwnMVg z*kLRuIJ~zxAnf6>SLVu7&(O`(HF{5yl%=ziTA@VZqTdJu3NDEvTkvKgR(8+Z_$?ix z_&>u1%I=b7q zd8!%-w!6ojItArk|I^+}e-02oM`;H*4xQvq?Gyx zed2$EayBGvQlH01xs92nZ<-5%Zq6uFw}d_cjO3KCqQY!L9tm#*+l6Yd8MLxDAE`~ZwSD+i#_A;@0FDapN=-wJU)nO!g?eLs^*K|JEC922% zrUr_({iVl-X}(TW(G;fKt_ju)ojU2f`hMy%dPWXMa;M9-LED_Ae0K8fSje#ITE-(- zg?Y{muNt2K*Z`w@jdmQWJ-`v_G&yJ5yeIAN!vWe+UqOpd_bw>oaV$I`hJj!Z0KN?7 zKJvh}^FF`H@#qq!P)RMvuc2q||5%mKq{`hJu?`CbkL0BcF(q!^9p5;fMk@9|+xXNU zcy%VrNTDP49ZE{cuxMK25Ye=!szZpQ6g@PbW*MAuxwzDRXApR#z-?{Q_kTF_5l^L& zIGR1u62yYkTBZU)llOn@J*x4*CK9czir7VI8*$?O1X3ex`r?3m>rrA2cCDDRWgSHf zq0GuB|N6k7*OD30H;!2-`r3^LAG<=5Lj%xki^^WkSXFMQtq9~vhaH<5mzyVU@1~~! z00F~UE|q{oNnxS*b!In=Y|NP7lqsm=phc*&!l(cV+y(RVM=)ltQjG}08&r&e7JSC) z68Dya`h<=W)Fa8FImLm(=~K=H5f-Aa=oH1#y36i zMay|yKYeg0mWDQ?pobCScUgG)(m6c|oqPyFvi{PFto5Z{p}v3b?aRND3!i+5SDuP5 z#(01}G?Jy5#-8x)9y6DV11bQhYMhfoT|Sap)Qz9hsw5j0;0*7~KQ!Vhqla`~M32__ zF{kjD?b0BUC(6D%sbXZ7v9b!N&6aUltO1-n`PJAG{V-AXg8}aV@(ki9f5V)F>E|* zie4F(TSpBg=bz<%2i>Zmz!mO`0T<`V|Lp`<@L zJQkCC6fDo(!93<;WH<JU6~L368O{Mia= z1z!p~wAaY{Q!=9x!_Eyg_{mEQ!CQ$j*HlV zjPR&*PO&Y*AMo>%sfQ#i2to(5rlqO-8jWUhQ=!}@3U%RWs-p;U=qBQnkhvSJWK!XT zx+%fhQ}Gz>rNZoDw^QWbSWMj!Aw-!5IyGL;1W7OPsotums$_yzST6By#oUrIPd@f00g%T_N~vbZ@Ot3FO&PqFb6LHrBQ#cs5TX=YPrZ<|D$Ne>-9m2f4ZOEMXBA9=*myx++04?vD-XV3mfZk#(59Z#Y_b(9_^*v9{+t_3o$C*@L z~-)HNp_P3ksfuDl>yR%n>H^%vc!;K6)!sxopHh~&Nl=RM(n0`Rkb2USo6N} z14GurS!n=2vS$QT#Iew%-Po?BK0->U2Br)VLl%ch3vO&dtMDyGZO5%9%#u9$iLaB!L=qCfL z5IP1S=SuSubHA6_=Lc&iInFE8V`Ydb{h!W0aH@&R;TLlo2e%28H?DmXRWf=fPZht% zP2dKprQ>Qtmf0`2{h|=Ho+vsy=Yv%Djy9z0a;`L$HUq;wGKP-9GP{)d)VyFZ;vk%| zA2n8;E?~KCL=x3dj;gRfdAOk|?pw)>7G1!59TtX@78qFMB)fkhOm#EQolv>hd=UzL z1NBY)X1=rL0V9)E`Zj%{A6B5>X8~sNi`Vt`u_L9Z`a2B@KeHO)@Um6T&tvd?SK+g(NBFqv?E>IivY z0jh&Q?eJ00-f zJ@SoM&DjCRb{nfUSO@!nvPv1r%<~`cSyV|Aiu%D&lVw*1 z+rz&g`RKM^*7S4JdE=({43;R}GdK~l1Kp8u3&))Lf0$|z@D8~;uI9kmZEWVRFL>bI zIOhl0*z(XZydz$~(jDuswK9ESHFO9>P)7@MkFl)TX7d&3^Be?UFQ}E}s$>UzAlpWzw#v zlo0@DgYNK%87Q+rnDsS68iNHjE4QTY4J=G z-&7YLS}Q%N+A{1Sy1Gn4 z{%$P0G3t$I&Spa|o5g$uyoWlEf^gJ?cMGiXuf$p>_F>}qA4qVZclrLzcH-4*MvWF* zfR$jwM~N7DUu_iLkSy_A^?7~_WodOI&5=J*X(gX+zhP%lbuxEQ*gV){6^1&mh{g-< zeW_XM%|@bi-!FoCl8I2lXt_}m$6-@rS$)u~sVn}z9Y8b;yhASRIk=cSNR zAk}$vRVfcW)}4;LJWZsu$>>WVL_No#!DGAz^D{u%FLK3+qx_@bj?km)i3Ca^(+K+R zV6+Y}u{^xJwL$XU9^;wZCoq+N8Ci!$f|o4>ZEU7DL%3|yN&tP_!1}*tBN0_#By-r~ zJ}U$Tcz;YlyWL4Da(>RNNrEX>KZvmD%6S zktYuc$tH)luAHX5**vMxltJA#Z8aZ22eeYEa_D03*+yJ-;#pV#V6DPKSqTD?VbWx! zb>~esBw;1<^5MYXMwvUi*2Dg#pS6T8Enzzr=8WpOZ$viR#maMSLPRxKGDVaQx2ecxw!XL^g#vAhNoP4B*G`AhZB* z4F994Rr-rwF>MZaHf{02?ft7B0Cm3a^pEuLWfUHXU_~XHliV5<3Re`JS3;R_trKs= zhH3Z^J1>h#1Z86qBmjv;i2XjD*09Fx)%b(;D4g_#CM7yI89^{0~{Wr@_S~%ukZf~TURp9Vm+wuwFPf}eB4~19nGNecB9)9Jq zq|qSwp^RI{{HibsLj-2&C^f4_LeCtRhOhf=Y93RIg?CK1R{ONVIOSsMrv0X-6N`OT z4&~@`40bt_2%?tcy3$dcld+MN4-98VJNCM=1idouGnLW&>s1 z4#2U}k{9h4TNzqb>5PX&c~;v5Ny8plf)&FeTrQ7{C$~a?9ad|qSj9VlwO4ndspQqt zE-iv8)YS?NIacuqpLqUcu;U>qiuVD62FwOZ_Ph0Aur5>bVgEfmw4bt2t$FhCv^?Cp z$%KZ`k+n7>v4UvRijwU$9V%cYTadS%phoPCv&ttEuWH&0jn2c>9!3wkeA`_1rexpa zysS3|VU}lv4;_rf#i>+faHC(`SF@vEk`bTUQAgoe#4}=*Ot^%9$_0hIv9qQZf)B5M zV_ZMh^&GktgtjB3-6AOIm^p$iD3&$d2J%^t+E--MP&hPvFC1d_II(Q%B;z@@ruf99 zHz56kb*!{vIvAk!0A{ve8^xQ^gx?Fo(jbbAM&?WlH)eod#G9(Vd*)bB7E#f`=qaP* z)g(f9vb;5Y6oTeEa4AF4^rTII_=|_6nkgw769zfWN@ueB*bkoYtKuc@~WGIk_nP=dyXkRuMerYmnr{5 z8%%FZ-C)X4o!3>p2Z(f#~L!t*6A77N4m9P zoHM5Yq%K%3{~n0~W#Y`Oi^e+@Ybk|U?1CWf(q~~K=!I|B$B8Q2gU}D`icEr6$ij_} z&KQq&53a$%nhZ4P?YH^4y+M}ty5JjIFdzCZuaPKWPo3=5={!u%b2=C7FA;f4i!U)O zvyxEc?P`G4>Ynl@=mQQND^oU?xDSxP0000001hYnIpE-4pMgZ#(D+D0P6;qF-aAEU z(~cFF?-l<;(0-@O4^xc0(kl<%W{_~ozClwsOw$3r4XWfFrMx13k( zvkoDi5nqZ`^FJliah6zO45AeO=}gen&<_&!5piHBq<>ca6iFqL;01zHmKgSkkHR#2 zbP@ST;dva0h5_0P>)uU!d2C#20*go!c0ioWkcVmSCR~XX_hsKy;4cPe_u_EnrOS}s?jTnpRRp*Jmv0aOdaJpn z7rSJp7w9|N_F9@aL^)gwv1e(x?WPPdbsnebM*v7lGCNZ@p!2`5$2E+S{Qcq_B*4}RC~ z_oqB}pP;JJ9=dgh+(vX+%DXJ`hT8vv6fDb+A;v+xV$^K;oH&x+Q9KCUkU0qD;F8aw zrMt6c!PD2g+Uk)^!k|GEn4;IApZ0?$9L1XhWj3}mMOF}ruRO3~UY*9EZb4DFkluT_ zMwm3YZDo<48sB!{MtPXkk`9FR+9tl@rAr4LayKS?Ct8!m_4M9*H(Hu2rM#@uU0eO(s?@jOa$0i| zk$Qt;;JSSpw&gPQB5IY}yb*P-y**iRSbz}PpEdcIi;zKR~L_Rexe&b~IT`NJYVal%y@~r9lHA8R$)gdhJ=oz~v(&NkPo%Pos+H z2h;6Ue4|7KHrYD%2=+9|tfSOrzk7q09Ji+#PvlnwE#|XQEC8T53;gA?`Hd;}8kvi@ z3raId4ZV_zAgS^vNf7oYiRo#3U8I`MnboN zSZnFW3Q zDjbg`agd-sG+q4p)=8@zr)(u~NZzI*WKRwdRusyIqv4{~0p6G_UZ#yFRZVz?#Oh6#NTgW#T36Fd%mt$1#DM82z{oa>YE3%ASDdX(s<|kSPx{Ac ze8C*_ltG^K0cJ{ia$pXivp5frIPU(rEbgQE1*c`)) zI|uB}7Pf24!tmM>WfFPq6y4T`e({zliA#DC5T_rc5%1KP1M0&%oO8xk8R0aqDs$D=Rbc`=h zqT$hkt9Z?(Kw6vDT6!vYe9>Slp1hy*ALYa3_}zeFSnT(3rXoX29uN~Hd_-e|+I$uP zZP+dgJsoj6ur7WM;2lE`Vny5%XeW;3r@Z3rBgN&o+*?Z&Z!{#n7yBkuNu_J5-W>{$ zd+=|-@sOHk6KgQfD}iMx;;Ef%Gm)~Ng0#=hM{~0&r^NLFZxzXb-D-W&(Tq8$@sU|G&53jB33iC6Pj@k znqPN7pySD*5#I#xNX52lqt+xA&m50~L}=##pyqYAZ4gO1*CxyGN}GQ5`EB$>57BLun9rjjk2VUjnV7A7hu?iPS&q} z%~@iIO6RW)VFqAP>Ni=AG;Aj)P2eVvL-8h-6$VREud_y<$-}Of$nq`C%$!Qd5`M$m zIFrQN?Fk9GZ*qHn**ncB3J`{|?_mTM>bAQs>~y#zJ&pSSSRs^Qw8js@X@tvGtiH}6 z=3E$)HZ5Z>z?h?yA43n2Zm!-SVQ89@KeA;M3$!X~SIB13l3+Jjtsr%zh4c{~+-cov zz6m{J&-axY!@MlEC9h%{LOOC&C%EZ$;zCP{HHsd(*sQ=}K?~=k;U)3sT)}sL0K`fb z#!Ol#mSg<8ZatL8Z^Ap`pcjO`pN>1R;hmiq|!}epj}v%RVQ~X z(sWWsVE{ouzQ2atg`kz&>ONe@Dc`4S@Au*wpMVYlD2U2Da>^T1e|Rt72MW|6?>dN3 zv9UrWyhdQ`_H989bVYh#s#GNAf+n{>G2;;V_AVR|QLoLLo78FA6o(xvNmQ{DhZOb=hEVww;uBwY>8QEuecVcGL6^}lPcIsCz()P-!O9>v zF$mI}`n_al)6|d@soE6EBe5w2 zQ@aT2{?r5pt*kK!g1t~Xy8$!FK<8_aAwSR0POl}wp$e)+ds^IMrU3i z^V7JTJv`Gz5|gn-+=fDpC$}F?j1@_C;BT(lqgqx7>pU_pb^AB5S>m+@qXsu0Nh&lzXJtOsnAb*APRXpplYFc)&^Yx#zSH(t=Dp!LxLf|&L9Vt-?(dL|E?fVJumZsNyCO1}OmF|r&E z#)B=f#rSMYtZ=neM6QDghaH1EDJw zj&PQ+R|-6S_5)WW5`iqe5Hpy^9I(9Q(!1E>xtTnvF#X4$wSPr{ZtKJ)5DD*HQKn>F zHRME-nqyM|FZ=t!pwc~wR^i$-s3&1ZPUu|810sSrhmV^?82ft~zd=;6zxb?Kza> zKYuo5`tqiGwJ0qFV4_3=Hiizxfk|?j(K)5&n7@;Uz1|S(Ct%2+^=b|Pf@GN_3oE~4 z?PX~2b=}+*c_`L8>O5Ym?c1!iS@i! z?c%ljENADrF$N@b-2}3M8s~P*Ze>K|)TMoxGjk&jU(UP2%pF@2RQ80VCiF&=llTiq zsh#=iayoFT6@BR-}FtSHQp1Sv6rjMxNz-rrj86iO}h2{OxewB|53@eay3Z z!0&0VCiE6ex>dWrrr(RI8P86poSl#$%m0CBS06AzSV7J8jLWr3-CgObC+7K2kIdcH z-mPgM{?2i9cY(4GF}#aE;w_YkV$G`5*RfrQdD7L5QtbDw1+ud0R%+V4BE~g9#PwCM zTCQEIy-7CQ#|mL`c#Nq|4BbOS$qg0j+=PKHq@Y5gW58R$R5o|e{_3S{ z|JV!!;R8qs0T~TGQeR-?432u%TlyMAc%cQ)uLQ0N5Tj}1Y5$6fMdpSTZ)=a5d;69A zz!dVb`>;Fr-f;^c=S_%U`-vpR;CfZpU&n^bsAeF|MdH~w^uS#HiOqD5`wer2i@aDC zSDO7CF>4i~t!XZ2oNg)>qw`qVX%N=cuq|h$^M*`vwAI}so=z^D;jtI((04?z4sAZl zxmUF*%+a8VuQ@S!E7X^m10GeYQXQB5V;sjis`n^2(tx=!X=qP7p{Q_}(bW$H$IdoB zjzk{eGfka1LSsNFA>u%=!jzrMl(YuVKw@n_5C2^K6s2YjrE2@brs|k_85W&A<%6Ew z3e7DWT6Q$-#QJ1x^agC`YB)UfP?0SlS#N0!=qj3Ns_w9sDi*8=2Sz+!+!$EVh^eQGHa%$rJ6)Dw zFSr}}1xkLW5RI%Js*hQ@1>5CGQ=W8b^~pK%{SJ7xJi5bYeWuD01pEP<%`3SDf%tjb zu^6~ui`ASwXhVF;0170+| zsC}Nx6m#3r#?HTejg^z*Nd$DFkHUtuEp;S!$5NI_39esUL2r_cWSihl5B@kk|7PBk zIW7#IAdxgS>F2U5K#8Ds%%j_yhJh`o&v9#9SZ#cwHxJBQ)Oi7<)piJdyUypf$;$i? z#J}V|>6BE6Iv28Epo}I|#|TOMvvc`CdZxG4%NZC+e-aScDsbeJNO*w1!)+_-#SHdK z@z^Or)|}#ddH7`ow!n=R`-jtU_VW&Mk(7>sK>&7gt?_GyfNLxeZZ1_*{;RF@@b$az z4j$u6VNK(GTdj--Q_`ByuF3s7+!!A5&`ilQAI2(=2Qjw`R}^9lV(IFn3wUgKYUjQV zpEP*tPV%VGkgfK1eRIz&t1X!`n!1W2bpmK2yy z`N`V>hLH`m8Ji1f;Mwt8RDx42`tdioURXzYwGJ^zDoZ{I>~0(~DhThWzyJUM1teDG zXiaUemAL!-tC@GC2}$v$603k&@yddPpvS&167!uQ*7@nlmaot+sYcb}!jHrMie{c) zV`QHSk!$5lTNFthN`-i{@jEs3K~aO*VEIa^i>( znw-l^+hK)Yy8+3bD*jRv)(nZu|4OH?wMgir{C-u|pjHpVc1_+kK}q7vaJC;`{>stA zJT(L1&&wdV-<9vr?4lUPK6)qVe$S_=TG|)vtvo%HDsMdnuumHnL?tHmrJ`0iB@ry;?9|SAy3@mL zCq}0>$!XIL~71&Sr*$1pPJ?kQEL+y~Ono!vI zc>$?w|D8&=21lo%yldrOA#CT8#TTnrOo@SDei+o|de9f|R5IRMO9O8mRYpiv`LK(! zL+u`=0%IRRODueSYjHb~n=7yL|MFem8bXu-IcKIw4z_`m_5P6UsyPi*J$!J=v-w z)i;NUL)?&pN>sG9|0g!6>AfoE5?x2qi;22J(&z5DUjMS;^Z*kec>f6(gjTm*A&Z(! z#vPVBsF?uM`Aee!x5|_T+GwMFR|{fOBH{WSAk8nWoLNgdX_smXDXU%thykd16v2gM zJQ?j`BVGA-zY|;IUM>k8Fx^`gAQebVO{});ueHP54;7^M>FpIau}YN2oj5PoE01Tq9oHJi;tSMg*VC2}+(XKncf-zxyeI&5n5Y zNM7j!S<0TA*N@<#(RV}X8~rTcIpxw)_IUU>DysgWjz7Vqq4$_+)u52Z(?S8KE%18X z_2|9u)mMuD$_6V35cxugogxuHIEFHbO2lD(xk_`#1V4N)9ilyHWqzZWf>6D$8G~Pq z#L!6Q`B)=b3`!6ZQO7Ab@$1nfrO4Ux2^(T|5H)fvMG9k~%-ws4B@}AzmysvD5(($^ zR=&O*D;!LnrP>%nHX*D)DbFYXxir3exuYvP88$)Ku)@=quDcC1HyiTXRgo+u&*Jv? z$mk<>Z4}tgjTGe zr_G_}@OQ>aR@g?bD|}LEW5W!Q`Y%xo&{df@1t<$w6nF<;4g*3j1EGXpaK<4OHs?uV zdJOjs@`?gOBLJ>`5Up{qI);TI{~QPY3z~=Pbmo#t#)WZ;0zu=^q;3{c@(6Af++J%s zJn;J(C6wGr@}U_?j;o1ik+Ba1*iKt`@MlA%x_t;W68{1 zX;grt*j3Tr1J*QwfHu>?-5!HnJ6wA9Ukt32doB!G=2R8l*?R$8Gmd<4kU=I_`m@-I z3%F0y7V(3>**Z?oZ=8eDq^RQVNe5`LJ&0@>BX(bSH< zx*M=OJmsI-YK6wp9uF6+D85Hb4HIfY;EaHzyhcLa#k*pYa_&1m!~fXerD5;gi| zkONQ=m7;>C^}rUW=Szkl>hdhn&AZ0%+;KkdX?rO^B%gvS)GauMqg%&cbW!l3VUvw< z@!8HLPA&IY`AKuw`5<8xzP4hD{+3j2ZbRn7wdP#Pj}B6}w=|y}BCS?jOcH2U^(te!p_U zUxaa42i1deKrwMwEg`fX_IV8zGLcqQ2mr7BhCA>39VR+Ie8_UfR3ZK zU~_;@7$rY=WG_UueB@*Qwq*m}7o-%7S0^R};7d%Sq=e2>GUgC_!)YTFsuu{WFuP$Z z$X{b^&0od?kI8;JrJ|mUmaF8O9QuRm57n}zR)FtPM{tm&LV=Xo)}7a>Vi5GJ<>R;$ zEX^SLO>(vs@Z5q*Xp~lP;tm47PVue9f6xs!jgn5?=xe4&?@%RyXfdSGqhbQvZ>x~y z2ERtLLXyg6eNG1%pE6As69KyHwl3czvcoZ2L40^OqTQ5RLnilHwh&vi8urj9jkX;2 z+qph@^PO38PV`J@mrMoya8mLzZvU809VR6s?pb3pxCXXPSO``j$A=ll6BPc8_rj1v zIT>0#Da!{$A!!;+?iJ^?--e>;J_p8q-IDjSEESk`RY9Hecor^dE$mxk~T(e*OGQA6(_;t$T!$peh zp;A{hxu{zMyc)-158o=`i%zKpPC#E1X zt&!^U^mxcrF`nt@V=8#(u43u8wOJH+j}th`cWU}28<^$6WmRUhiH5{LF$ZTA&LR4a zxNxH>-fiVx{)rEXFmbSYN@wUhR!_2UBE4CYg6S^(BG#;cu0zr_}YjLnIEMb#5B9=CtHe zxE@Be(5#Nj@w=BV7uG-xF_{x^1=AVoDqHn zaEKWvF7?FyNkn2{2IlJCUL#G64MxsMn{_qVp(!4_f+nRsFmJ?q}!x9Xt?6vj^)8p?iZ%`>_roA$Usvz+_{M=`YY%Ce2rV`;eg% z8wzgU=D^2wUCg{vppwa?Yr-J^PS`k)Xg_+NL(&r))Me@_4RW%trT=NV~!wtM2a~^r&hr!?lzsYD9DTzB%(#Sy-fb4D9hP2blZzZMDT%}@R9Ar0{$Xw&|>1(x9mumjR4>v|`sZd5}heq5B!%m1grKLwL(EEaMdH(2V(MU8=!7 zk_T3&#bTEW_$ICFM(7s1)3;rv6S1QliK&!if~D72rrDoTw0k&tmtNBPX=iQEtZ`PX zow~M`tgII-z~9IZc+00Dr+Hpo(5g^Oby~8%uFKp%ClW8Hxpu}1q&>IM4Urp&<4rYH zlK93x09as#I=c$h-a47zp8RqI1y`2m>>%#SKvlT}ZL1TF3~_{R@3rre0N+q4eY@vannGjtRWV__4fe>AhB zYsp;0B#L5Bp07KO&-IJZX*TsLM>Fm6Gt1TRfV8q?8ppucf|B(moGP*m)GE@v@6bIS zBS%tU8S|mBpRV*KBPqk3$9R%V?%zy7rIyQL{wAI5B5_nGMLVW|Z@`zGpWAZCnRU~T zF*)y!s&R%T^ka{S6BZ8ChF5zyKkPB7?dy>`2m$k-4eAN^w62@d9KnvARqQzl*A4X6 zt}B8(TLs=9`nQQC_j`-UQtp7w8@>vil0d4nUP`PeU5pPyOjTM8M3pKe;pGzZ+kNm7 z$IqCr>{pY&di1&HIItqR5fK-_k0{a`o&g4@s+U13(Q|2>VHNGy*$zJ&sYNjw2Ko~V zJ9|}t!CtqWXoyea`@z@%rP%Q&hiFY${F@O9y)Yax)kfonw=ejH2DSdCTm;Lqp!=#i z{o9ocnLRmn`KcYF`U#Q1Nh3{Gs;Kg|KL))9kg$j#k|d4P`4 z@B}@=uk*FrnY{x5A=^LO1Gvu6MlgBfj=o1*2jh_X{fNsrtr%E~?3vD-g5#{22h*ON@H--Pd*tOV#GYndD$>htg&M8qucB`qro*ULEyZe4T;XAjDG(b^Qda#I$1*^cgW@ zC{cPr&7AziD2K3#_ z?^W_a4vOR+mhzwKsGyIxXCjDJX86Gz_F;OI!~9rdnD~e96MD~AAT{GYp3&wu4cIMV zQ+zqIe6Qy3{%`q}U0_y|j+{R#Gv3t_tuIlUU?D#aoXvCnl`0!y?gDLcS83MF_fvac z+GSdp=jt7yV8P&F;lYXb)aRkn92C;kUNT=^$t@YYu(v1|B#=jxmh?Iz6I)|+7X z?W43jZQ93ErqLy|34O=Wwm8(Qx1LHigLCFk9>WvD=HP5l5hw;$0}HR9h$Ai(@}7C9EbJzlgI`OEGHq1f?{zJZKOeR^o@E|8dv*cb|gEcA(JXBe@Miuxrx`^c$1r$%Rltjz)WyKiKq zgIGY7N+rpnJdt`XdO6MDok*k6evh9ZqP`iA}fDJTFv+`vt!_C9f2t#HGHfF6c zgl^gWge=6;DS^9p_>6hAZUHEd7@PuT0r*M!F#VhDkq zj077i@y-C-i#s>PV>bd4fW6#Si=w7_ebh{p%lsN8vCxpeW**G}Wovk2=nUAt@V9AL z70`^K-Dz1pNA-d(ggF%HM!)>T7^&=z1T^zCn9oILaa!tD} z={+HIEOC|Zx&ERmN%Q^CvP$uq`3jLz7~W0lkx(s_k^}-LNS;R>%)K0HVV;Vx-2lR0 z+Un3K|3EiHJFAaDMi$&_j}Z7N>s(4s1m#PL6rF7UG%-B&R#hCHSUjw1tY>SOq1#q= zHtH>AtU5Rdj^K-TJ|i8ZcB?SZI7pD3A2Ig&+HuwFQ8OM$e z=WVC?h1&#kE--)SKbKph_J-mCfG+uog-v6+VKWn#24aE=1jrCPE1V{#AP@=u#lGAw zVD4G);br=ZQa-4v5n5PMTJp0W3686T)m3_C&3p!d8Xco5T!nG-7 zdE@>3@kmoq#o_}FEth!Nj2(fvkpq`BCo>3{C8ouoOHe7;pNJMfYOe$7EQ?S9vSvo%2L{f8gi{O;Oxqt^cZwALP?o?1w3*QMApphRi%EOuW(_ULe*yxZ z2L6AJ0z4+Ga`6;Tba61E&c-v96XRN8@D&_YtlwR#WG=ll%0l$~M?`&)!>;mj*(o|Ee zT;kKLFK481dpg11WJAO+!uniAwqD<%m<^17r)XQrRn#y9+GYEyk!PB~+{JkO)_XLE zWYj@AQO1?A+oLIS;b|#&k=Qz1i&71Jys0%gXaVfp&}mTR@Vr9iLm9N5Qw+|y}6kP_D&J>>foWN7v#%+LDV8A<0-Kwqp!gBan;0P*weD`S3;2@A;!*q8mH@e zUGmEG5eolagK$c2EVHvhBX>->z(gEnTC6{5`W9L@Qb;J@_s{7dwvqUiC=HmL-IgOl zH;>fS8DjW((i&leHhN!Y>8ZkKV426Te{y~(0)2mGw9FL9;}$+X_;cX=62@ukIA6yH z|96ydJLjp}sM1w;Ha6o-Sj-dh^)$PnVsWe$9=kY~RL1oJUVa7@)@j~kS`FQhYO2FZ zA95T}K#LO#(oM3@CaTyG21+0GN|g5V@%7M7HBO`{1-g20wQb{4afT-AXNRbRQ7V0( z(7kkfLz>)9Xztz}M<{2!9%*iSh8Eb`c^lvo2dDlJ;cr%}Wk4Qjn40+dgpmAz6uzR~r)P4Y7bhOu*hLz#({3Fbz$eZ~meLL@tdx~@_k1QVoFJ;&5Einv? zuu-upQtneGlE}FD%EDuN-`DArAOSTin63NkXL2O?*9;ElmL_{qn`$3!@{W*5(f3U) z8$8B*>lDpWAq!vxx{o3LIE^fFP-!5tL*FdhIIjUktmw&|uxsMmOu7j&aP8!VE$B-d{ogmQh303iNZQ~&!Jrvk2=Dm29ftJDmcD6}Kx{U9g ziUgrfyC91zGF|RzP<|&|%n0ao_vj?D(Naa~P{TcH$1>}>8{a$>e+Q+0_6E!M#rCHB zXvOHO!D?fK9!Ow_jm_S=o9>W4T&Y?_SRPIYiBOOBoUhVV+WL?-zb*AR@5($&s=0eY1C6d}~~Kmw#$ zc$_3@38{4=)}dCMo>yJ>4g%u)6$W6Yp+cuxu{fBy;n`*#XPnmhdu%1uiK;0z)NGd{ zO!Q)^8Y?U8BX2>-+Yaz16wV-Qm7lJ4vB6c&y6u@f(|QHx%car6WLZzrl}#6<;S zqAFscWfb^$U8obSGty=R_P<={K=jQkj9^ISgj1n89j1HG3fHEb_Vyj)gw&+S=1o5f z>9@?<+0QBLZHUtjUL}6(c|&wt@mO<&hK|ir;GX^Fp|b7OJuN@>wo7t+w+>gN893E) zT(Of{KmcP);JH{_rPYMQ+r25PGwa3jXO_NvB0V>JBz~7q<>%gBv0+QDOb0-spYbm} zA0Jg>I$H7@?8Dqgxg9E=)a}yZvbGUo*bPTO*Bn9_-KY2v@wU!(WhA>uX0 zpltsNW`%|C@t?z11F^s|9!ch~C|4up2$IK_HHgyDEDP}KX2k1`uu!IA`g^osq1MQ< zDK`oyttxrZ*QpnvQg3VG!qJTrde5eN4%vKFK0ZR20|E3MMb|ID(30+>D@4)bXi{LW(-ImB>8;{!CJ!H!DmqT$lJ;M?w(k}?-J1(jU3HaTc)mjUYr z-W;}jg}YyCws4q$oKug%3myP)x_1QPSOPd>L$v}yK8o?>DK_G3Mvt@bi*;0L=PjYZ ziy2rzO^6Wh))geSisf`j4o4*6K_NhVZf*csKf|P3GeBGIGXuUVnV1prI7rnQX}qUq zqn|xG{<>M`JlmWuhtgBV;4iMpO#bHfOGIT%h$MlW{P>k63g6I%s`|1O`6=<~RMmy4 zaRy4LC%B*tlPy>!+(sXZwZq3M66~Zmj3Z$7fw6YdMF#Q1ueov+)o1An)}7hA615?K zWQ5aH(tH<->2IWfq?e77YcI`ya2!(Z)5gR_C*D^Ag3TiB93<_I5fRG;&cL|EHY%`J zMZe_lq3(62t5$sn+{uqC@ekg$5y>Bvq3D(FibbdpRB~81;(CtGqTG!!F2}bTxuh&NC`t z4ZI2@Yz4qdZUohN@c26E+*A4zo79 z{5lb-QD9M~K6ZMu5bXo~7mI7Bin5Q>`u}BrO@2~`iG!tjD$OgsF<5R;)EQH>{&E-Hp@maI5)J63@5{owxv8vJdWi>t3^|tp8yt_4k_*h7 zDW2so34=0sy7A-k)qf=_E}oAz2n5)ebw++l3Hr5ZdpQGTP>jKsJN7v(fiUS+_M_MaWB}UBTd@p(h_dU3-^8fADpW%URnJ znpJFZ&7|fHSc)<;8z^>p%X}BZ0j^pB{Xu5n4Vv*k0t2zcl2Y7B#Bmk|8vuwJeY1-s z6KXzLVGV2LrI?3pV#d}c2t45rCZ1KjcY*@scuE;2qu@cC?=#+X2vj097`Gt- zd_5jmv>0C-LO+fY_%ROFM=b1F7aPAFSQwoz>;KCcK|I~`4GI?;X5rMgbi_A-pGY}a z*W<{YW{=D=%5>YehCgtBOlQlZBzo+kxWnu{FUS{JGt+dQ*36Gzc-#Z+A|v=R&CyHR z!IrMAS0Htq3MX1iKchIxPT|CcLk0cN6ThR4@YhwHkz)kela)O_lsWSVs?a!XjnR`I zkUOP6RnYM5)aj9Xj1}n{1P|?DI1OM>*To=MeZ(S3fIsWAzh)q<Y68suiP-_?@0Y=~0pM&=A#jc!3Q1@cMgqQe`=89mFTh1m z%mFi1sQ1eVv<0oukLksr7Z`E4*@~QTY<)cJ$`6t|V+G1_0YXegIPo|mUgCj;K8SH? zL2Y*DC~>At`OM&T?00_?PZUEl=rK2>BT#LV?e4oy-LDw%!oGacEiUJMM-SI_cOvO6%;-)MlV^TNoS7)%f9`-( zYah=bh6Fo=WF!+1N~a(I0zyJIXvMGHWtqT-YR&;h2UeMf;14Rt>Syi0(K9bxJHtvj znxz26-e}Q+a6Dvz$zDhEEV(G-w8s z5*Z8rxR*^$ktH1rJxHbbX3-o8VrF!xg}*{Nloh`toYYCy=i7d={Ah#m8=bFzR1OFg zm;Dxzi=T$tv!)`q2g+0ZGNa-wy%_l%1#jh?n=c~sQhW+hFOyqJIII+*&ZR>RCP0+R zw9|D8YoD_Mw{eX@6q@qOuy2)^K7UzrwUh^xUULcjAaH*Co(q3uNzJQ>@`qMTI!=_| zF3A3s_F-yba+WCZMcrV5iY4LCiY~DLB z3ms$yMOdcU#Zm(0yqM$f7|6ysz^5GNop8=GUF^sGsL=M)575Z~IAx_|F@b6)eOMIv zEh`#K6E48W{m}bG@V`4D@6LbX42dlx(281?KL`Yq`$+ZHE%QfI;tD}NZWm3=!rJgG z^pzFk8{OP&y_x_BjKI~@dNK!|WuMr)+pXESAX0ytb`;6vF9q~IVuy}`%5k7$euVQJ z&dQ9$vQoWtO$o@bOUGvyHI|@*g;=)EL2rWuyoNao1iY%cSMw;=|4~eF=MybhcU;)b^LFS~<#4qXAxkI^nk-eeYD(F^0$c2Sq~P3RHAIg<(;ly>~WmrLg3fTX<-q| zmTnKN42-tDg300yES|l-xB=;;4!I;8oY6&{C!wZa2O&Nwg~=wC(Ko9H7%Jl#i#scN z_2ue=XSY3|{(v}3;j?6_2Fd`VP0Q+DQpv8;&11T< zon5MH58kp$R$Du=f|4-hzfbn-!Z#t3wJpM~vDoFtoa($2>ytAoKU*S8u8s^ff6_y$ z@0nhGysB?i%Elio4ss)2ItVJlrmgZITpgUzt%Hc&NeY?_AV_dKlHcv}amIC9F8snH z93Mdb(FMRduuYsD9o*VCo}zAFLZ52V3^kwX8SMci8Y7P4pM9|3>4G8ei3c>gnp}NF zSaMO(Ms&xEPgsI7mEOkIG>?8c;lHb|c?|eA0^(V7R z#hCK0f*p2KM+(NnWS6H?1;5rJdm*krwK=z6ML%DB7cB@aq)IBINu0yo$WJt1<5nk4 z!`g?H*YBFJn#y!8*0^?Lu#ct~0{{31zCQdw&4`Sdcy;%7T4%>wv8MmFvS$ns@5hY> zza}qZK3`_!j+`QD{eY#}@RqWnn%ZvcI+vSsHnTB8$^=rII6sixhD;cC06wa(mB(?m zI(ZN|dr*pJRrpuy{m?keHh|g)8NE1*UEn8SwP>S*6iv&s?hO^UOtP{QpP~&cE0!cs z6i$-FK8kHYDOko-mh|f~B9Ysed;&8j7R?9>mL56q*Z!P zj7Ku%CY4bl^hd8$4J|9@Q@|PoQs}hUzs^F;37SklRT#PC&&#I-ivr~9*vm;Cx|~1W zi4Ic7%TgCziI==`MrU6`+&CNX3;;^F7u{he1qJf@6v7+S2hz_9;6=^%fWV4_{w(_E zX_9R}4TI-ZD{@s5C@Hy-oha7=+leRp4Pz*8LdO@7Xc4AFBVFmMQv9B=s?V7Gmdj+?4HFXyk{ur#s;`_`mry+2U`A&9 zh;nZqA76TGbfnNy3R`7 zcVW+$1(vZIP^Hk4lE){#aMtAVmb`LE_7sfk3a#jV)}|Z5C$ZGHA-`&l3n(Xy^@@|a z-#LRKkmX;7JP|qsEmJCPbyPslrNtkN7%z_DVE2pWAW|yjz_tqy=1C7^E~tkK8JtD$ z43L#Bh6;?k)^R;K)7%)M+Iq#Mn*8Vf+bD_*IM(TiWEL6=} z>GkzEYhjrJ+O(B-$$8`UQXY!_i--Wsxi-SM-dor2#=yNFj)TfF{SVGBmQrun&;hMiQJOM;Q@iuS{n*(mTpO;>5Fxe@D&h=xr`{_ ztGs9W)Ljf~p;&qKT^NqJekw-Mi%O#ofD?)Oa(3}{Qo0UGKRUD?b&GwAHZTEm=-H3r z9p)zLArR}99#Y)}gro3+mic{;zEEwpP{H7OL=rnY+zE)(MCTrJK7#+Jr~Y<#VrW&n z22PbL-$6gre`A7> zl`ZdFx+0wMMPZc)EGcK77OZx+NJgiy8h`#%xkXQCDsJO7W$vprj>Q2+Dyk+Uz zXwmbg{{{$|`Bj}PQfUv!t}Z_sfk6I7Ie_Dq837KfEp@od-Kt6nuL|J!%I26!{~1NV&EeGML$t!JpKn%~D0rFCDo$HAWw%$$jP-#|TL7Ku1an{xCYO z3EIh-U^d2js@;89XiA+lK7aA>#dEQcHI?pp-3%ArE_Of2L0Zgduywn0Iy^v08E*_& zEL?aeSdRT7ztgy=1za`5{8vEiRX2$GpKLxhdp!{!w)+P^8I7g;`cN!LI2(&l>%q+9 zcNoP}$I5CY+ZBZ8v;D%EM7S;7r&C)9ALoe4*_@475+{FRd&)oNFnmkTp#pU@|5V=D z6{pHhOOy^SDtp+reLfLStv#aW3~#z#hb9XPF1tC}CW%D1N)B`l225Ngjd&=IO}lfv zm+Ey{p4?(Tk;GzSY=B$HXztDKF6O~9)ubbC8w#$n2j()=(W5)pP^4LNDobz9E~Rmub4edGc83`^2C7ei#~cSZ;Vj;*Lu-3909CJG@BzhLzFY9 z+b5e_v4H%L>M>RIK$?9IY%uO{Xe~<}0?!y@B*@y?>oi1^;+z&4+G!d--}P|9c?2Yq zbIz8tE>6q=2bcj1O7w%F&F*n_#8Z-<5OxXCt5W@36!DU7 zej!&Hw1NdUr@ij)>ORqG>6(S{Z4NO#;?jmR<#0me@Ov>y&V(Zl!Q>oRbUuFS0=+7x z+IpG7`Rx&SHF$JA{y~z#q4_tbxG4ZeK=fK%#>Ddp7Fe~h(=-Ldw!{G0XER zlrxENDY;D_5m|65NWCe#&ngi13@a`&)m-XBVchtDf??%ZIh@vZ%H=RO#7UyN(S=Ys>_}!j4p#qv2R;?93pX-g>JQNJH6@AnWIKU<^olu;Sl_2VRUbiDl ze1i|h!2$-F)oZE~zlQ1bSbCU6Fvx85i7q^ef{A&OOc26tQ^i^dqr=sCL)fKONiy!^ zcJc$=z_Kq;rAkKs)rtiRK3dmR$h9K%)U$M+d z)z}bq*$VGgAIX3EejfN`hPJ06lt(W<4uBKdq(n&h_TQ?5UC`0keD@%>Nm;=6HXUa@ z=B>o+`Yvy$-B9^L(nP!&v23tGt5(vTxLGgV*#}6#dF=PQuIAGvjEdNLGV8nThLGTAat*JT7lIkOblqQlJ zYBfIuMK?HC}Nlr^@Zi^?pO05ex! z%Ic!Z1*0e%qg_gX7QOp z9p*&zft*E)x%*Hfo#Wrk+}^*8!YNKgU8hl%ueI)yfZ}%J`3{e$*dc#s=q^(~Z`exO zR@$^j5YW*L9S=i^=5NSd?FpJ{YbWZ+WhtSM98iAkCpdivy8*=t+&BDSe?#E2ehZQ) zCSoB;imBR< zVc61BYt31jd|jy6)aFTdQ?YSyO}+dGi5M+10p~Nt2p3+6GTOJU{GQWZM-=a*FMpB3 zf|l9bt5l}1p8^uT8xG;myezZPAv2QU=el&kfxqH8<_Zcofi3*EvzMkvm$)m z{JOxIXFSn~k+8=~O!yG>qJ2{jwCeh*sMsNRFNPt>Y+J+VjzCiCqXPx69y!d*sS+I( zU*lUuq85z=y`%Br?ix5uu#|#C;No)&_6T2h?AOnApbpEWHG&Wk&X=!d4&ygQTnCZ6 z#Hf}-=kH%qoo^8{Btl^y# zP};rC(_K!6uMxg`5|DmZ#|S7=m&dYMp)4l_>k{)x0#wXjQ4tMC$Vn&hNJ$bTX4gJ> zu#Z`&OH;72tPOh=A?=`e(%>N?VqVJTeD$WP3>(_iUyQ)#d<6;k?Sas}7zmo)-$#Ei z{Qmsgc?`xBw04X?5duGFL9TVC zZxmq%x~Z#2RZkF)WpHif#5_&zOMa5oWMZERP4xmBvN<|G%P=NPHetdH_v!;Vr@Fp` z$=R5F{~g_Xhy0hm^?Vq825LWGK-oO6_0+}tg~b5=L*|`m!QS$Asdt|O=tBasU;1Bk zpAdH*nZAOeY9J^{aEB#$bckY3qT~xFnZErjgX981dM%Z*+yJ`O%+ucY>XbSb zKxA&1?bdv4MI0>JmbW&WtlT>EsQe7@m1`HCaidL{XHG+Vv1oNyQX4x(NQAF@O_~yaG0w_ImYzg$DL7Goj^viVk5b+ZiNAH0d za|VCg?=#6u)7kC0{S#wrOTE>cPEltV^t?fU5~qHEiVwr(v-jXub2bK}u?`J042y4H zDx5XgiMam5{mt6WpqFOjIRPSQgfEidX}oa(YX+40%fmP!XUf3tG-MP5GRE<_9ocs1 zbh7obu3iEW(|9w}z=RvDwNogmZ+RhHLP}But(C36W*tdXpR$w$K1w9;e;L0{Up!p< zP))H>x0aT$1CLwi(|<`#r`8?#(9^Yx+%}I?RXZG@)Q?*&9J$rS5Cj5d33t@`^dnuS zi}jF$);10H@qg0&Ua2(z!(4uBMh96;*Z#B{unmh(TR?$RbaL3*Re1id#kdv;f_Y*? zkxx3hp{HDcw9s0T?#;G?uF*?>H=rVXNLvL#vz_uGL0O%*>nr`pGUPcnU@ETh;+VN+9%rM zzR4fvKkP;(1i)pi3!ui>3pU*sZV!?vIsqufGxu~S|37Om*T&T}w>B{~_ww7bG!;>x0Ye+FWP@hO_SIRh#mE@b&HQTELtM=#s^0 z9A-sep$|9FX5>T6!3wT}7ziZmb~PIMizZMi1EP%-P2#+~e_1V$=+9g#D{}@Im2`}M zE>3eIkHD1h-)kUG7ueT-?;Zq$gN#so+GTq;qM=R=e z;(vLI*WfQDCjH}mx~`Yy+rb7v{f#=YOb_b5MnO{5Oi^N1ep2@>yLO-iGK~5rQyq=i+5GoX}YScAK1?bCfUF!VW*{uL%=j_m-q!>T)I39dwsG zWDY6!1J{=S0a_qqHj^2CHKyGzV0sLJ;~v;a1G$7(-mnmZMJ@D(XY0vUzeBZxY{oQU z&Mg{V)z$mxeT7Ky`DrN(_g6$+xixNFLHJo|k2640W`d{ix}9oSIb*(zG|C0Yi}}1A z(RvHPa7A)ZnLCAsEB2LDDBD+v54JeGuOTkVj`FcY-6o;b((0!m(k2X3_;LYh*wYFy z3u~t&)q>nk1}f@o87F{7mlgrqK7NzxRKDxA{}L!;%3ctRzdK(FQ2JWDSpqT)05#H` zAU9K?=FiAUeWa}Xjz>jDI;vWy_z7))inlW10(GIYDdO4;h3UFWNvFimQiE;Mr0#Qa zR8u7ijYKX5%(Pg*!7!8J6IQtyzvYuET;*=^QRX}(CV0+p%24fW8i%1(-V_M$d$lgYcAn2UC?`K~ z$WtU@<`;#Y!%@tLHDZLjAEiK1CGW?q8rtOI_LfCP(APD=*hK{V7yn=2J!33ti7pmN zZ$)*+=-?X++qN%H^rl!oMb$=4k7CI4f4d=hq`^8OBwH>-p+BjsyLzzSxc*@aUh9MSVQQ0#S@e?e>zqh{RuSXFv zIuLytwHN>Z0000MGY3e6o8-~~tzbroxljX8S#af#hThEplWTTEyyY)qWpuz7nJlG{ zKv$k3)O{Nv3EpgD4FCWH?Fu+A6Ef8S7rC5~{hj#$M2y`M-F87pi1ap==mpTe-Cp;l zMqsd#F$f^DyL7vcguZ4U9^O$)p~YQD?Bzw%qzK2B2`!_Iny@rjNc*yh0nx$_2?K4} zs6ZHzSc?EU+NI6W1m7vid4+?pHvb$mNnm2##82QTNYSH_fyy> z9{!*Gm+d#H|I7aQe%t%6q@Vad(D@(o%l-dQzs$d>f4lzk>nHhtl0FW)|NL*-k6^!J z{^kF3!khgc^uDitoBmV&uiW?87xORefAYO_|BvB8_z(D=z@N;2!T<07Yx#xrvHjQo zU-ce>e?b3N|I7Vnz+dzq@PGIJ$@_MDSpDqwbN$;Qt2^yMBP2+_Y4)Izk|bZW`%p;9 z5--|)s3c^G7wtaO5;8=K_Md7A86rjdPqhS$ks|%4+JZ(%k$$|#>lWQMJ12NPccLx6 zQYe8MpP8oLoWIZz%ED04JsS_78IqTq^5E6B6fsfG&=dW;n$hH< zA}J|3JA`c|@F{^xG3zsG^LxD7eWs9#{BZ!)+F(M_8%VIDY|XLxuyGwjhl+aBmYT1~ zAE}-CkoquRA=y2zG<>0aYK=SZAoiBnh=R{&lM6U)_;{N5<`-phugl=kJ8(1;SHa6Gc=cZ9v;@T!WPE0cl@QjisR&s+zVv z)W7tXXo<;G^`|l$tHH|nUA2V@cib_bt0lXG%3o{x9$sv3l#(tE2}MrU<=e{&wtm_C zg0Bdl@_i%QCpv>ibg7Z0>Cr~r!+VL=4x28mr+ES>dkJaZtv55g9nFgo!s_bQ>U$P6jFbV!RkynanaT6{P~C% zu7f_xKl4+E-Wf=84bf8#F@D5Kc>f$3+FF!;+?Am&35&PAGd-p?a>5L@2d*YRO?$0g zTx*R&KTN|^uut-D-GhWKn(;=zw$LGz1tR^Ywctn{FzaPxWud0j+u>v<8U{%dT^j?# zqFyznjkH^0A;F{-{;!X!#Alm?ZXweH%yb%I>#C-*%$VdE!X#>;+F`|u9+KTqtcLFx zM>{?OywyCzWrtD&y!DX2W%0{(V=Z^tn$qMEo;?QPjaSPO9q>#Vy?bnbuH&%4##4&{ z>W297dMmWR{zd-S)jX6b~`oZw*H9bj;u9b_s>6z{c7EG zBAOQWX`9ia1t7YDiDQU`@4Z0WTEYCjKDf7B&`{phwNlU!GrrUjC=>m%sS1-4%F>77 z!m`)?h^wm}R-(mujSk4%^pj^ zwEG(!U)Nlk)ubObhpCq4Spcuw>L}Ked5sa&z9(H*XH?&62^hE|V}+b%2)0QWFdOKG z39CnuohO?-9Y7+IRO9yP@TnsVMHp+FXGsz*v|(O-5j_|?7hBijpvG^nL^8of^NS^& z_Lot7(h*|#0ux*C^F)^!aB49s1w?t2&z+adIg%5133aghU2y)~00JpY;qBf)=O~Z= zkO6V1Lq%c7^?VkQ?cBR4_vJE$0f`(NR`OuIOTMTYNgj<9G1a6V}qHXMLs27pzzUbXz;Az-WK7 zdurNx&|*EJFZt45KW#+J9ODoB4S8> z3Q)@ITpypWNmsJ?0x}T!>993N5#g@zefZv1)Xt5=-eesbq=6vEe!<4N+!v?(CTbi! zMK9W0h^Io%`f;CX;HkhIDz_GfU>(~~NX0T=+2WikooAZL{_7kMg{}Id;SfK2Fe_pq(*^J(@zPaMZz_d_Yz z^-SeuKE#awSuTr94(abh^BpgS?7R82`%p;95--|)s3c^G7w-dKwEIv*>I%^uZuKi+ z+$3a&m#$r(mEy@cW8iR~^ra+46i$x5@15_aoS~z?t$r&pc{VHj3tLVR7{%xdQ`&NZ+;s@uT$19=`oMWTH!vGn>oi{l<_7Biluzi zHt^tq|K%aR7c%#dX^BT`L5%)!yZmR{XC@u7XEWY&7eVdD8{RA{ZI>fL6D zb}X8?30J2UHXl#+@!@sB7_+CF?yjr!rQkMFQ@jB_pnqW$3^nytGlpQ z!op!I1XLzTIxXD~7S3HIN`i+I72?x%I+!2j5ax*8>^It00Vtrk&8yAs^J(rVI1>E# zmxtNQG6Pup1Tp$`HsSAf@*8K9p|c4ahg>PDnAPK_;_ul0lmp=4q*b69b9ueqZ9dcz zGDptsv9r<986rjdPqhS$ks|%4+JZy?0RHrx00000000079+?Xo;OO`yB0c6l#OEej?bs8Z3Oq%dbyMG~4WD<1)O1 zl4YpHfPfV-xPHJz=V=j9U@W69RP3R*V7kjs_*AaN_NsR!{hYDYOUT^GY7pO9#(lD* z`_P>hTNnLT!)!4ac@%wWi;0^zqqDQ=B(N=)=ED|56corDFW7R1Z01@b*N9Sg*WwYPr3XE4lG|xPKXS20a3xd!o2B|pTt^&QJ z9$4jYl3I_ze~n?yf@Q$S(Gc{vOF-}9H|0HJn0p!D$J3i_&s=$XDNtkIS;wQBZSAUu zY{L(7?xk5Yo`S+;^jGx2Qy^fXkVbk-uEAHsNB&5SRZOYa67%^n0p zb5c1}5J=+QG^T0&Qf|~RkX4w4$I2t6EIE1UoPIPKnaLSmcqlLF!=+6B1JQ0oo=$Q1 z1AV@|vVpKLgXs3OKvJ}#{Tn^rP>!Ee*W8}Rbf#|%Y}=6;jP^vzly?NcTwdqX5~#2c z?Uq&s#AO6(3>s_O)@TF8qnU z250ylGctB{_q3zjBtd!Khbog_ zfI|O4vQTUIaD2qV>zJzC<$2JESrX&4+p9jppE^FA{#sYQv5JTq^*nxAFYVQ z_2j@05+t$EV*%BlcLB`Svf!yqr`hg@X0k#C@+_>3q+*bU+=Mqa-_{6JT4mB{Xc(P0 zB3&z;&S=*nlmqlQXcn@+AMr0>bWW(YL03*Y9GV#OD-SkJC;EP#8{lxbb~XxHaKU~z zmAICoaBK$)q^Zn-oCeq&SmWuZLLo=9+{Ji1CG|3LQdeVDo(X)5!vx3oMQdVT0g^5P zB4@j!R}4eMFE9h`K>FV&RkgMhatLPV-$eA@{YFZYMrWMY_X_#arrP}4%ZSoPwf*n{ zkc%zUVR>VG?jE%pOWH;znr$$@nvuZ)z09=(OPx!5`9IhS9Lsq^ub@x(R+JcXX%cYi znmC3k^gLabO8vllY@CdwSsq&;6u+}7O^2{-GM zd)*uvQVtzM`MxTIeG0B72gb)dQka@vSvU9VxkU-eT6b>k8cM_^0$r$g|0wRaGm%{$ zA{fdua4aB-ZWuBh70q!1ssWWBN+bI#{hneCY%3=sY`pkM^-Hb;xvTX1t-7j zJGYlf9QF&QbZ2->ZaEdu>pihe1!+~N3$gNDUB0JP7VxbpXE!Sgo51oV^QQ{(zE1w5 z1iukZYF!_>CnZmPtmw8hKm676(CP{aqOqGkZyQ7gQG%cKsW~t;$Z;ZDb7ZW-=}} z-Ea8pdr{2Q@)W`A%D!>9DcQ=iNfrDIq<+}3CqEp?&!0UX_GIm$FwWYWSCQuXYor`p zD*dg$MaHoG|Kk432w>K-UIm!ux+de{DZk+|>$OsQZ;~_ERAfSKAAE z-ta2Ps+THEv&OX&<~5hhk4b(5#_EQdNhAS*-84KP@~ySvERG?X=sU^B)k~7++sTY= zjOpb9u6KmK#isGNUuuCFCK}&96oE=!9UNIAIpv`aN#-+Yhu8GM!3oTjkrIPUYksT_)tDwC}iw4H`tz~y9oqo4D zBz2WmKWQgjUUT|WNOS`J%i}o36X|TraNI?b&0X2?o(e5W+IoLrM8pX;-yn&peJ4)5lN7(V9CVuz*VnApG+F;&3E{-J7kP-xui0rU)=h) z%1T)`{4wfXBSp`Lw@^AQF6!3Lh6E4abI485l@xO)4|~N6uDuo1)6)+aC7L_`AjJ4#yBNs+ zo9YfxpWDnVxjCX7EXA&KC7$9%hBVb&sE1qcr)MY^597LFYcUNc9^^yN&?+i8o7_63=@h4rtZ0^NL= zp|&>?Kanw#hgw-(z9hBa3-6`(@{S{BF$VO&6c&Hdv;>#&7Co!_z1);M|GEs)gflph z?+aV^MhvgPv+w?UmD|oI&*pQqFwl52mImU@`nk zCI}tU5@%@madQ8kgHHl?hUUHS=zwHYNhs7ymJX>J30p!VZK*7Hj{)DQC=JBsIVQ_n z)_EhT2}m5+^Ra|Z#henk9z?OdeEEjEwe-#lpb^FIvHe9Opk~n?Y8tcNuDkqz&ovr$ zoYOw1ao%{v!;{%1L->5!h=BIOCzLqlJwaLpfH#d2j zdTo-K@6;BzbqcH!-@?P*T1@b5b66F+azzBwnHC1ejl|dJ*=$07j!8Zry&;c zO!GLhAqm82S<)DBQ*aR2qHD)`&^^nj9DHM?IM`fTlo-<8PhcFp17?VfjW`2Gob3+R z+>&QGJO)%T4x9Qqgqv1lz^Dhe@vOFq$~CWCK4f+u8Hw}=%#H%nMQI(K7`x_6V4#(L z#=WT?w|x=LoVIMf^?WRk+kdJRyI&3HBp+;`dFkAGzVc#{hb9sZbXkD9l7RN@6g+^{ zL20DJ%LNZ7FD*2cqm=HBYdLzG$n89T)QHl>ZwUb#aeX{znK{}$JR+;t-0Fa%Oq~PS zF26eB`59FE{qx;7Z%6+XM}6Mx&?OoqJ^{Th$LK1nY=f3${*A!B6sJ6pTVb1!cvN9m zQG)uncN^Ti0F$v|VrlCS*g7V_J4~dolj0GRvUS-dDT;5D$5L-d6KY!T5?}FC*vw|! z@j}h-6FgMm27TLN2HIwl81SHdVujkUvO+4@+~Ncs)`a6*X>E9d#qZNl01)$u8xsK1 zc|$it>ag${%Rz^Ld3(;kHT-B#B7ycsjnnhBmltG^S%DEr(Iy#ijgd={>+CXeu9kqQ zn!6$k|6sNBWPj*1*DO#KI2S+ngA+@Lz9P#AETcMM^ z^#LYfR9&?j{S~8!K6)d-TSvEBXHH3-Qu)Nifa;3=PSinNeAM3!){7E4;X$2fF=C9)v-#j z-(fhwZi|eV&6|>}l@8l!N@R;a>X^>8PD@sb@2N8DBJqVWx5g9zHd6shvZ199zOiwq ztBXPagC6nbd|}ESWl))+VOx0$_@J{0hic5ChYrnycw;2QbGt3 zR4sNBT59{d63e+tK^)VFVK%fzC$rAvDEtLvNfkeIIgNICe?k9tD6JXYI7K;{#tj^P z46@Lv!({r)id{|SV~ixuuPs>rcOVpqWMxr*{rL1zB1Uy@VD2e7w;Fj(+yP3|; z`xCt7wa}0qx--z=r?&8bkv4i=av=-a6W>|TwcKimSg0*c48eu>cYys5ZOtB)DCZ0T zzlY>=0d2uvO<}Z6$bJObFdll)PLEy_B@B@*u9`LrV`o6<7-kscMlk(b2W_g+s~O}# z_$hYnU!sR5%?ZwrTj`0GuKRRU0I{912vh>A)zD2v*M-Hmkq=HC>^myDBKXCydtQOQ zCc{O29UvFb?19lnUVp_w*1=eHKXcZ%cH3=iHADCC+d;*n1bYA>Hy83Qjh2mnjF}sR z&lqVcxm%!kSVnVkhOt`oEmLc2@1_S>&-3yg$Nkj(7j_AlpD;rf@IJ`DK zY|plLuV78UTUj@HMKQg@xb;zL6%4g&o3p-qUB^~e%lCZ!Cyr|k&{Ybq4MqZ9CVF_3 z&6f7$NJz0&vIjW4x@$b>-<20@P9=vOkJqmR1O(a0TJ>WM80bO}dRVdKjFnGGbdVqG z)m?$V7|vr+S<9&3!tmh!)j)R=_$n8ndgQQVnzVc1i8kd|V9*9J2qJ<(QzdYXkaTRC3(Tmm!asVTq$G;_{1Q z5#W>M$yp&|i(!M=QA6gI(EJraP~@and1@x`>J`$nvoplBUj?kbf~XejEeJwr2Ebm( z7$W56FYu%6c`I&xD5w@UH{DZ?XqR^#hzlKyUu4>N^FZMiJtK#8j9th><&Ybb9mW)r zL#NF=Q*=z1GGKSlt6u{!Z_5Nl!pN*ku2{?ULnYu~Fsp9VyGAqG75tEI!GQeqpE$0aR$6%p*mWv9E{oPWw-hr=)VZW7 zWBw&+C5@QTdV@F8wNkdIi1#n!Tb%2TRlfmGC0fY@v_>~pKgd(CP~smC6*FSH$&j}z z67v0<+&O=l*R$#~?W!)S_J-tiT$2c;m^%$kwwe?!VEpX!ncjjZ%CQ3Mb8*R@&Dl3& zory}Cs)Yrb*$qN`Bd&61%;2-PxWh+X$C3couB`zNZ9UcdJ}SOlUaT=*M*c_-Mf4ki z8X~bf;Ov1PqoplCf8Ql2Q2xoPm&N0Af^9uhYNGEWL~yiOA0WI23^aBaAM6-mshtfq zO1NULrARg_2t0hmbP>mF%xf=tENcgeQN@t<^pYi@Sgatc-HwT=Ns$0%EWJy}zI9f; zE3=c))Kf>r?wp0Av+hCB3xZ}ChY-+afI`_G;Zn4G7(sdMA<$xfZchJ5zp;U@ex9#) zHg8{1cZ8iar#-`=?PPTz;vjqk=i~ETJY8%*eTKYWD9Uv%N2I53e`f&qxDx0Wof1Ec zTQLei;rrckTDxQnJ@3)x_zF}50oYfbdB2RZs=dsg|UKUg{H1(POZCTO5m*D-VwaCvH zuge@P;53Ur(UQpZtDAyMlz%Pq{;#c+6URhb%D{e+}&< z!_mA~NzM4jzW7~mNra4y7{ZRekONCu6F$LPw(~ua1D?Iah)#V7DC@GE6pt)aFwu43 zWP8_y&Z3$OOXLFc?vK@Hu1i#mqAMmo7U0Z-1VbnBa#?hq; zUfvgV$>X{|vR`D7h|4Qnp|`qGWknF+PFHe1GaRbhN0L}_GF^;X4_p!jcZ?;O##=AN zs`drQ;cBqwx2p-EDn)wu2-Qe(xfq_bsenIy$s2in4E3t876=wU@a(3a5&p(Khb1v* zm1CPFh|Yj9l;I61gA{4N=6lkBc#veI`6jE*xUt&@`$K_^DZ8W+VKo>S09TqoT=tDq z`jfUR(BNPfq?OPE7|^5<*bz7K592_~_1JtD9g#Rgm6CMQh7<>jhr{+lqFi6*z^^mN zIdJ2cH!KVdH%gM&`74Sna^@-Cwo;7TZh~y|A5<(BqW6R8@1)(n;)X6(`}q-C+;~A# zf=+3Npjj<;K01?;M^UY%B^y03XsmNraN#S{yVYQGexP3Dqp-g7A7ArG@PAQ_1~hos zG72r8NUIVI!EQ@A;>q)%1#eD=9L;w6-*FZ1FZacoxm$8scot~ZPRhBKndva&C2ha* zhz8mWj4K%@nOJ*bh%9OKz*;|dMPfvy-H%EAn7u`txTzJMaEOd328TRaw|%;%>{Qd&ZOXne>6aQpZM&t((ZX#LIkj z+d`ng?+zr5s&KL{+L3=1iDwAIVdz@nxJZMo?}*=!OI9_PzrHQHB!E9|n!0MO$C!&9 zXP#+0cu20Q8bIEQ@?l^+w4-G%D6fv=O39PekRBtw^G*PP-?9M6Y#neRd^@FhA5bhm zL@9G0T}QF!`cg#FuV#AOt2T8+mk@!TmJXC)5!x*$!e9Ja+_4n?F?3tx=rU z723D%clu3D>GUQrZ_^oVu{?L`AC-YvQU=COc)@O^B^%1TXuE>8zr3pXX25y-SABVT zP{Gk(hReBMp@g$^->z-|yuDso%uJ(9QaInhF5;8^pyHdMKl{X9B}3K`H0viaW};W4Zpi=Y{@U-+3`6Y zq<`K9JE399N(GlaifB&E1!LtU4hwPJ`|Mj;WcTv7NFt(m(s(6JsqS*xGj)Oir^!VW z^AmPlmO$Q8F1>KqiYkCzAU;D<FL5bQ6viZeY#BT*W~-lL>I7_bZ5t`qIe$& z0sCwhORN!+Nbc`AuX}AJ4spEIY?8mLu*?*_Xw8}7-t3xClQV5y%6d)L!^2>N4bc+*ku^(qzkl=ugd z=Z<^3?m3VF9QOyH<>ITij#D_!pvW4kHKR#I31q7&0Lws}Q!|tS38U5F_av2z4hjXZ zBDGdJn$_4&BjppYB|C7)#_)>J3eRBfN|j%H$lomKQ*V$`<(ycVSC>mLx9XE;x-&~< zG=t9q5mOY{%&C&nod+N0iG!)LCH*m-;CwbdlA9Y zJiJWBi~i?tDLE`g_n%@g=R)??%TittVs~^fvR}@Odd&n*ea=o+voA7KoTRKb5Ei@$ zhh)1jhL}aZO9@|fnR&Nmky9X($}y)kdWnez^s7pdGP-%^RVN4ZflCBrVe)=>d~MFs zm?*3wkd^hp**2b2qaQdugc*@OGm3T*%xlUTe=a^o(lciw6nryn-m4xk1;U7VggYMA zuO!|Cy$T}NC!Ra!$S-+q_n;l~gj9usPF0XS~+zDN4Y3GGgKw*7>Wo6?vQV6Oy_AC3PsK z6Gb0;C0&emcneOH40eQmUQH$7Fo(Zj3VG@OlUM11RmW7`iJ|7u5LFk!{g4@+7PzU6 zbBINmY%Pc(oT+=C;{mV0#lxB+L<1k*e=Bl9oY1)KgT5@p{{KA1D|pP`3V``Xt-ME| zYe{Pl{`YDSUp-wZziNM+18eNr-z7>dzQT7;Pw8Uw>~)pHkWbl)Yd%2yCXrCqdP&L* z=Sw{>5lD4%sa;n}<=1+H`~09AtGWVTFn==G$Q0Kjj~hdI;A!#IVj`Aurf-UV9KCXr z^9)ohi3&>7O>lXs-G_&-l)tuth{z}P>QhNLEd?+P99AofZp>pFAc|Qp40j6yPzw{~ z{^E9HI&q#V8({2jtzkg5h5<>NLnvtWg!@r?9Cn3ive*NpEA<@=l@%3x>zyxO(3m^& zt_msx$eCi$2gAzzO=T-9S8OLw@FuwC#)Wv7TNfB}M*(PDf>~ECxXq`a9)Q}CMVr|t zzQA&QB>!CdBNpZTDta`^sSDy@|7Q%JA2=(ngo**R9&@uWqGBo54ZjaV3#G1Mb3)tP z--Qm-xdz=_w)ui*A)meXx-7WsGWNel*Ck=ZbWCkGpP+i#d?6yObZ`-6*_e-hNh-1( zG|5+&9z~-kkm#89n#Fqb;DHD@+#wRla#)h8xIiA5rtKn?`jl4GBb69E{TGXsG*R+}YDAdWH~n`=3y(QSNE#j$ zq`+)`*QOxYV*n0wyM0RqARdyuL7HVA#kc&{sN`?&mWDadnmhIXz&8LbRlQu~!u6#e z!aBHIO(ImKi2Dq>uMcajlllwh#PrE5-Bw!R&eJL{E;pG6`tucSIfBF93t(dj#q z%I{aI>tY^QlI43)zD1fpa4_BaLq!oa+#v;YyNnx}z`*kuCc`ha;^kQExj{2*HqCgm z;n0kd%Tz%IkMmGvgKyh|W~P|VfAgj|o)8R{C(w*)!Kg#O*Cfh9_xr;JcBuY_!d^2j z^K`>bp>u#4c4x#X zK1-ZIhCu`dJPDf6f$%n9>Beaf!ZQkO*&xBeXZfnCd;&27x>R6>fD43U5Gx}th-a@a zfN*&!l7Fn75(4dTh46^dC=pJY8}heeIZZVm&qbd9q6J$BFezJtQXEK)x5i$ce0eti z^B(;OXtUh4+6RQWJydo$_-q9~IaV%_KfG<#asgh6>@;#^CBOrUoK>bvLGC4KFhSbr z8-;7IWn{6l4sc_&*fQFHRV(*DEdrxJ1;aNnoA4a) zIq4P!?ms8gb+BH#B2^vSxt(E_$OnDea<*gC;6|C}x#z|zWOQ|_QHbeWeRln1Srzpu zg>bfu01}1cPt@~O3S<}wd*XNi4NHs&(U1YR@u1qLdc4KdCxH0%H~u@V!FNN=#7mn* zSyebyqlM`1_Aa#RFHk?ctp-dEW`!O*#O!di+;%KX)r%fqzv1D)MfW#@@X2w2mujLe z`82=UV9`ql&mX%b77PT6kQF_-r0_*2nBY@O5KPM&RTEOCO3{vMp{w$1x&YJc=Sn;|tt z0AlpE@!ZBTuR$k<%>tL_)lCjsQHzpO}NUsLEtU~FB;+!Z0nR2dQNs1mW<^yB;7edrhaf3|NpVaVT96Geany=0yJv1@of^iC2S`!$&ZLHMFv;l1^Yt;#+ z+o3--yAX7PspuOkYTL!Ma+O_DlAAzml_A3|J2P~@%V!`3iS?t(gp zP9ULU)ihvMiaKk`D6-yW6nDqGIb@h>^CB&y1pe`-EAoHlV1Ew^Z>@yLWH@#S|GY;?1l&^ z6@NTWDY8uKq98xOy2aK|NC3^w=92Fzxu%5O+X9Zoq^>6M)7Jia=%N}@e^o!w%BCi|ieCf%a#(&#`tKQgH9CX3K2lQ{2(G?>HCeLcj6)tzmg+*~(G-%4A=6;&%F-&7STgwJ8 zcKnpaoilPi^|?jQHlvx*o}z(O@GKBTOMWN-nU?;;c^DEawWQ8#Mf z_Fwz>rEflI-Yt0j^r%~73Fy}NdN7~_V7z)!xUCuD+rp2jj7F`ZB7r+(Rlfw=Y5zcQ z_$6%$tAPCT`Jwq-V>)?c@7nUTd7l6=0jI5k=xwu`m{3JgoM3u`X`uu!s+ zh}dWV6+{LzxQWN_73b@Z2HTe;V`P&-zYB!c6tyTfpBXDHcJ;$U15hRM&}_|sr__ZX z+JLnm{oy<|aT~Fa==jNZh%zUM5T!rl`@cK^t~ivrXwipUgHI~ffqq1*of+`QUxnY8 z3PQRkct=RD8}bt3Gt93HB{LlbjyH2j-b*)H@oc>L^vYVfiW9voc%MHT)To79kR!3= zerqVxVM?UxE629F6weo`zCC=czT(S%URiQ8sH46{4bIP+#xUGSrWJJ=Q0oRAtf)$) zP1hgeE;eT{pk>lW0W83XT4>E*G?S3b@ieFmQG+9SbaXm(laNoQu?h0p5-%n7cRoJ7 z;vd$CG;jqoP}7K2U!^Pr!#k@a@3Xdy%@CXSB+-MMp6((TNe)^J`+?4m`cNS3XHdZF z*hgEC7UFW**i6tXP|@krg3=%wonYm=yb@2K9iMa+XiK$VgVs2pUYv>`G;5BD5$PraeHyk*oqB8*-r zj$?c$QoO;jZlPVTdndR2o0Y=k$@+%g?}MerObG1}`7%JSe{*buR#1Iun4FKV|HPk1 z?#aYf+|sE^Wn{4s5tI$U;|bESjO;>P<&y1>4Vt-7U|`HGY)y3^nki; zyZRO?k-6_|nV^+bMe2>X|=TKv9%A`nN!kvVYad*AZ!fp}z)E57ObpRS2 zyK=`nAkt(s$AHSWQ&x)pk_u%})@L* zoeMHJBgVE-1)jeK>aog&QzA!l+N)9e8`rtp?nAg|S!hIDZ0#qR*v*dR*sM)v5zb2O z+&0hthGIy4zJtyoU4y%duOnt*Qg?8!G{-LaUcXJyK6S{nw=E>6LM=VV38Pp36S(fT z3_62OI`K;}VPaJA7KG!yxP3>Nd?!BPk~dGh?3B--!xfrOB3(+{2nV_AJc1B~=6GIv z2J#K!6i3N9#@Nh{8`r8~3h=z8#$q+7(>?-lnt}QW6>5ai=?ZD!9QUym2EmyLk;Ew5 z#G_6P)q+E%&?C_P1`IplvQ+S$#1PdA5dJ=C)&3_!t#oN+A?;2Ky+T$g8U#mcI2?}o ztG5V9fe;PRFKLMki!&C%a8p~=4d@%r{0GlmHlx-goeJnQ+=i29m^L%Ct~&>*oEwwS zU99Zgltm+7Rue1>-hcoA1&M$IeGnIyn4cIcg#K2;df=d$fm8!|~L&_J_;H5KHBVLFJ&g_gMf+VkmQ>VK$XSZ35$<3f|wo4eV+-z;%DX98GrX%r z)OixLUit#vc~P#k%MW0Nu+0*0KIA6GSw!07rzijb08~ovcTLh;BJ9C&8b}!~r2%}G zJ-h^_p|7PiPX02>iSjX8xqc}b)aQ=Wt{M>20V@Z<9VbyPog99ID`(=mpa_Pmn2o|g zN!Wrr$O*=PNDwHV0>p0wxx`O~B*8RJv;?5j;>i>t;g%wpyY6j&1XJ8KGSXS1?<&#y zZI950rCnt=ucC)N_UL%Lya^rGu^EvvR@3_Gk|=RnHor{X z-&)S<#r**2LW%%98vfCkCg2vH%bAW?>-s?XWAAGsFDu;{oUe+DRY`N0|XYt`$y}jF}EWkJ2th$ek9ETXyI) zcE;A2I4&-G7g$V+geV&w2XmA&B@MxC(3%{TE8MDHlJlQEVShS3WlJd&CbozEl>05< z7hckPs)v>YoCbetVmbiSHbWJ3?KyaQTD;7R&|55UcjdV~Yxjmx91j*i|J=f(U*72? zM2qVql!yuElqL@E7-RvylA0Gj{S(Q02+v(CGw;Qe1 z+ytZ)qlJ6cz(-J_V+wrB5<=GBG#jfw3|Q@?UgFw4qZ5_sC2l$QOUhd!bsIMZrimI| zf8gwDy4bdApTXg@1ku`>h_pjhonUx8cZZi`O<{iaL+w9*2{6WK2z&YbN!wbs2)6_K88^@$?flrX zuKdZVtYJPqNxVuzB^}^&y@I}nK4~2o7@Nv4Dc46rV?*yh{V8w(#7eBSu9>#pZ@;5O;okLD_A zxAO%9Se9A(_;yQ#*I(<32`auXz6k7+4%L@{c&PL_YrHEU+>gVJB-Ri;B|tkgaDiWZ z5e8~3x20=Bd=cdN?Z`1Vq!Rv}kaG)s0r^IJ12}6Otu4^a>pSvgosro9Cew3x;Nh>{*FbUgB9;&GUoDJ6}f;BQQ@yN71)3 zr09MKF&*BG1= z7b=_$`jT7fT;@DYDTD-t&7c{d+?s__EHijn%VvN|jx%$TuSaATmE>^hsl_006|KCs zBA)P!fuw#5-3BwQZhT`CC0}*KNlZ<=dFi4qkzcf#ogI`oylf}*d%8}=#ZCjN1Xouw zoxcAzwLC8>_zUy*R+haZP@g%}`kVId7Nk7_n$zR;s2Yzn;EY^u^;Mx+}D3X?rN_^%eVHzStiqv-IO&)0GlYxP$z-}g*a=t_FL z(Vf+4Ep#y%u>{DLhpI-)bzxT+R!f?NB4#Sn?`f5r%6=g~;;|r^9&4CJHaoI~spB1b&0&do`sB9-CP1_-n{J$33 zWHSKvpZI$~*Syb+$J<#fKbj`vwQKNHzL#4#g14~#&X%%fL3Ie2UB#QUzo(&5$j6!~ zR%f;Oh6h^nnF^i;kDnW77-iywZRp|gH}nJI6iFNv(`7OgFNcOv9mE=kYIpZCtSr@r z19#GA(N0t(+}ZgF%P*K=$M$dogPZ|>WtW);*p;TTk2*rfS~e#_{r=R(ww0vu-x^2u z5ARa!7WePICbr0mQ{czZUHe$USb^v1I697toSWQkDo;u#zFB! z;u4@myd~}heLKKA(BIpejcrD7@l2$gg7cg{U$F@+E!Y*Qi-OBR$F2BY_R$-LB0+ZV za-RCL+h2BKB>};%Ld|W<7E_#AT7XNK*W-iJJKG#331OFju4PV?>9$?u%Hs43?s6E6 zzAmNkPD+}zD&Je)l{bt$gc&78v|ZW9xHs=JBF_~(3_#WeJYX1-9#^OMMi_#=?zPk! zfGs2`2?QTeQPp}&jC2?9U)wob(UD43Ig=*&tZes#-6K z@em1I_9UwNO@49)M~cUsGng|{my3|4!0@jL#l;_sqg1EBfOmm48kEk+6`kl5u-k0{ z`0T*hv?r~|qQN~(vmzmjDM&L<>QwM!KxPKJbY9t!#pZ_U#I8E~i#KZ`dky)EuNUj= zO%62^PGR-i_{gF5Ogh)9{&l@mrO5u`E+vua?fd&b&35KoC=3(!ZR}X2H>tr+Qd6#B z8ATGXKf3CR)C0TJ@82O9JvweeBUSW(BN>@GuGT?|hdsR4qQ;I$4iOHwL(MBa^t3$pv#J_A>-l+W*uceB5 z{|khzr8FSIc(Bz_1dDW5+ohc{ZDRbmdZqU5XXR^BH7q_nUZ>JDGFg>qDF25U?D|7! z?-U3LEUcjH83Q0tUyy^q8j@XY2?}c~Uob#&lJ%Y$UPHOSY7|=h$Hz7l(ZwZjK0o3$ z^YJnH9*$)~{|a{?e0pas+28sq2C$x(s^efNExJQ*tGT8lA}aq1;+o%hrj{n?mV{;o z;TEJ6a2D7A} zt=>KLc~l(2+%nLF+zB}N5*!)}(ipsODGgUjO!NkTPl6SC5s^o^wPJTkG%KjjE&12yDWiha!X0FsbXFwwFGm?08z@qYXTturzCztoJDBM-I<2A_U zST+pkDFpCdrg#m+HS#U9d6C!Z0tnUlXf=I<9M60)yCn|zOt3qh>bD3TfjeKfYOR3ic`vu+&}PIeezx7+My%P8o2 z0M;(bdf-zMhpeawcM4_;HY=UfB7J~-6ixsn$$_-nf{Qcj!w+ve;bU+XtvL5+l z+jDI?x=xq)k-o$IzVLa3wXHW{+>IqeZlK1ggWVtwF~lgxMLOc{fnYQK{v9;%kLp&B#&GL}zHL^f#E#ZU`|W>~5sF z=9!4-SHb1*ln;EAIv9pIgeamd;c~Sm0000000000ub!(c diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-23.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-23.webp deleted file mode 100644 index f34cd23982817ea82e6fc96ecebe5d1898b1881d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40962 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�eEZ-%0ElXbYdE>)`3{k4l~O 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 z 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.kL1JwY){SIHasKDBMTvewnQ-S-K) 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

NQ$H%)NB4&ak8NjlW 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

); diff --git a/apps/ai-game-creator-shell/src/view/layout.tsx b/apps/ai-game-creator-shell/src/view/layout.tsx index 9974817f5..4464661ce 100644 --- a/apps/ai-game-creator-shell/src/view/layout.tsx +++ b/apps/ai-game-creator-shell/src/view/layout.tsx @@ -3,6 +3,7 @@ import { CircleHelp, FolderKanban, Home, + LayoutTemplate, Plus, Settings, User, @@ -30,6 +31,7 @@ export type LauncherView = | 'guide' | 'contact' | 'news' + | 'template-library' | 'project-development'; type SidebarUserInfo = { @@ -284,6 +286,19 @@ export function Sidebar({ >
+ {deployment.webUrl && deployment.webPublicUrl ? ( + + 打开公网预览 + + ) : null} {deployment.webUrl ? ( .<后缀>,留空则只展示内网地址。 +GENARRATIVE_PREVIEW_DEPLOYER_WEB_DOMAIN=preview.genarrative.world GENARRATIVE_PREVIEW_DEPLOYER_STATE_FILE=/var/lib/genarrative/preview-deployer/state.json GENARRATIVE_PREVIEW_DEPLOYER_STATIC_DIR=/opt/genarrative/preview-deployer/web GENARRATIVE_PREVIEW_DEPLOYER_SECURE_COOKIE=false diff --git a/server-rs/crates/preview-deployer-server/src/config.rs b/server-rs/crates/preview-deployer-server/src/config.rs index f693697bb..ff8d637ab 100644 --- a/server-rs/crates/preview-deployer-server/src/config.rs +++ b/server-rs/crates/preview-deployer-server/src/config.rs @@ -18,6 +18,7 @@ pub struct Config { pub allowed_hosts: Vec, pub allowed_origins: Vec, pub preview_web_host: String, + pub preview_web_domain: Option, pub secure_cookie: bool, pub static_dir: Option, pub state_file: PathBuf, @@ -49,6 +50,7 @@ impl fmt::Debug for Config { .field("allowed_hosts", &self.allowed_hosts) .field("allowed_origins", &self.allowed_origins) .field("preview_web_host", &self.preview_web_host) + .field("preview_web_domain", &self.preview_web_domain) .field("secure_cookie", &self.secure_cookie) .field("static_dir", &self.static_dir) .field("state_file", &self.state_file) @@ -116,6 +118,15 @@ impl Config { .to_string(), ); } + let preview_web_domain = env::var("GENARRATIVE_PREVIEW_DEPLOYER_WEB_DOMAIN") + .ok() + .map(|value| value.trim().to_string()) + .filter(|value| !value.is_empty()) + .map(|value| { + validate_preview_web_domain(&value) + .map_err(|reason| format!("GENARRATIVE_PREVIEW_DEPLOYER_WEB_DOMAIN {reason}")) + }) + .transpose()?; for origin in &allowed_origins { let parsed = Url::parse(origin).map_err(|_| format!("无效 allowed origin: {origin}"))?; @@ -162,6 +173,7 @@ impl Config { allowed_hosts, allowed_origins, preview_web_host, + preview_web_domain, secure_cookie, static_dir, state_file, @@ -217,6 +229,28 @@ fn validate_state_file(path: &std::path::Path) -> Result<(), String> { Ok(()) } +pub(crate) fn validate_preview_web_domain(value: &str) -> Result { + if value.len() > 253 || !value.contains('.') { + return Err("必须是不带协议和端口的 DNS 域名".to_string()); + } + for label in value.split('.') { + if label.is_empty() || label.len() > 63 { + return Err("必须是不带协议和端口的 DNS 域名".to_string()); + } + let bytes = label.as_bytes(); + if bytes[0] == b'-' || bytes[bytes.len() - 1] == b'-' { + return Err("每段标签不能以短横线开头或结尾".to_string()); + } + if !bytes + .iter() + .all(|byte| byte.is_ascii_lowercase() || byte.is_ascii_digit() || *byte == b'-') + { + return Err("只允许小写字母、数字、短横线和点号".to_string()); + } + } + Ok(value.to_string()) +} + fn required(name: &str) -> Result { env::var(name) .ok() diff --git a/server-rs/crates/preview-deployer-server/src/lib.rs b/server-rs/crates/preview-deployer-server/src/lib.rs index 223255b1b..e0165799b 100644 --- a/server-rs/crates/preview-deployer-server/src/lib.rs +++ b/server-rs/crates/preview-deployer-server/src/lib.rs @@ -115,6 +115,8 @@ pub struct Deployment { pub web_port: Option, #[serde(skip_serializing_if = "Option::is_none")] pub web_url: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub web_public_url: Option, #[serde(skip_serializing_if = "Option::is_none")] pub jenkins_build_url: Option, pub created_at: u64, @@ -633,6 +635,7 @@ async fn create_deployment( health: HealthStatus::Pending, web_port: None, web_url: None, + web_public_url: None, jenkins_build_url: None, created_at: now, updated_at: now, @@ -959,6 +962,14 @@ async fn apply_outcome(state: &AppState, id: &str, outcome: JenkinsOutcome) { if let Some(value) = result.web_port { record.public.web_port = Some(value); } + record.public.web_public_url = if record.public.web_url.is_some() { + public_web_url( + state.config.preview_web_domain.as_deref(), + &record.instance_id, + ) + } else { + None + }; if let Some(value) = result.health { record.public.health = value; } @@ -1005,6 +1016,7 @@ async fn apply_outcome(state: &AppState, id: &str, outcome: JenkinsOutcome) { record.public.health = HealthStatus::Unknown; record.public.web_port = None; record.public.web_url = None; + record.public.web_public_url = None; record.public.can_uninstall = false; if record.public.message.is_none() { record.public.message = Some("预览实例已卸载".to_string()); @@ -1090,6 +1102,11 @@ fn load_deployments(config: &Config) -> Result if record.public.web_port.is_none() { record.public.web_port = url_port; } + record.public.web_public_url = if record.public.web_url.is_some() { + public_web_url(config.preview_web_domain.as_deref(), &record.instance_id) + } else { + None + }; if deployments .insert(record.instance_id.clone(), record) .is_some() @@ -1326,6 +1343,16 @@ fn map_artifact_health(value: &str) -> Option { } } +// 公网入口由控制面自己派生,主机名固定为「实例 ID + 配置的预览域名」, +// 不接受 Jenkins 产物或状态文件提供的任意地址。 +fn public_web_url(domain: Option<&str>, instance_id: &str) -> Option { + let domain = domain?; + if validate_deployment_id(instance_id).is_err() { + return None; + } + Some(format!("https://{instance_id}.{domain}")) +} + fn is_safe_web_url(value: &str, expected_host: &str) -> bool { url::Url::parse(value).is_ok_and(|url| { url.scheme() == "http" diff --git a/server-rs/crates/preview-deployer-server/src/tests.rs b/server-rs/crates/preview-deployer-server/src/tests.rs index 98b2b5511..7874d5169 100644 --- a/server-rs/crates/preview-deployer-server/src/tests.rs +++ b/server-rs/crates/preview-deployer-server/src/tests.rs @@ -171,6 +171,7 @@ fn test_config(jenkins_base_url: Url) -> Config { allowed_hosts: vec![HOST.to_string()], allowed_origins: vec![ORIGIN.to_string()], preview_web_host: "192.168.35.82".to_string(), + preview_web_domain: Some("preview.genarrative.world".to_string()), secure_cookie: false, static_dir: None, state_file: std::env::temp_dir().join(format!( @@ -378,6 +379,10 @@ async fn deploy_and_uninstall_use_fixed_job_and_apply_owned_artifacts() { ); assert_eq!(deployment.health, super::HealthStatus::Healthy); assert_eq!(deployment.web_port, Some(8400)); + assert_eq!( + deployment.web_public_url.as_deref(), + Some("https://preview-63d38d3da6bc9b06.preview.genarrative.world") + ); assert_eq!( deployment.web_url.as_deref(), Some("http://192.168.35.82:8400") @@ -436,6 +441,7 @@ async fn deploy_and_uninstall_use_fixed_job_and_apply_owned_artifacts() { assert_eq!(deployment.health, super::HealthStatus::Unknown); assert_eq!(deployment.web_port, None); assert_eq!(deployment.web_url, None); + assert_eq!(deployment.web_public_url, None); assert!(!deployment.can_uninstall); let list_request = axum::http::Request::builder() @@ -605,6 +611,7 @@ async fn duplicate_active_branch_is_rejected_without_second_jenkins_trigger() { health: super::HealthStatus::Pending, web_port: None, web_url: None, + web_public_url: None, jenkins_build_url: None, created_at: now, updated_at: now, @@ -652,6 +659,40 @@ async fn wait_for_status( Err(()) } +#[test] +fn public_web_url_is_derived_from_instance_id_and_configured_domain() { + assert_eq!( + super::public_web_url( + Some("preview.genarrative.world"), + "preview-63d38d3da6bc9b06" + ) + .as_deref(), + Some("https://preview-63d38d3da6bc9b06.preview.genarrative.world") + ); + assert_eq!( + super::public_web_url(None, "preview-63d38d3da6bc9b06"), + None + ); + assert_eq!( + super::public_web_url(Some("preview.genarrative.world"), "feature/demo"), + None + ); +} + +#[test] +fn preview_web_domain_config_is_strict() { + assert!(super::config::validate_preview_web_domain("preview.genarrative.world").is_ok()); + assert!(super::config::validate_preview_web_domain("preview.genarrative.world:443").is_err()); + assert!( + super::config::validate_preview_web_domain("https://preview.genarrative.world").is_err() + ); + assert!(super::config::validate_preview_web_domain("Preview.Genarrative.World").is_err()); + assert!(super::config::validate_preview_web_domain("preview").is_err()); + assert!(super::config::validate_preview_web_domain("-preview.genarrative.world").is_err()); + assert!(super::config::validate_preview_web_domain("preview..genarrative.world").is_err()); + assert!(super::config::validate_preview_web_domain("").is_err()); +} + #[test] fn branch_commit_and_web_url_validation_are_strict() { assert!(super::validate_branch("feature/preview-ui").is_ok()); @@ -758,6 +799,7 @@ async fn expired_terminal_records_are_pruned_but_uninstallable_failures_are_reta health: super::HealthStatus::Unknown, web_port: None, web_url: None, + web_public_url: None, jenkins_build_url: None, created_at: old, updated_at: old, @@ -781,6 +823,7 @@ async fn expired_terminal_records_are_pruned_but_uninstallable_failures_are_reta health: super::HealthStatus::Unknown, web_port: Some(8401), web_url: Some("http://192.168.35.82:8401".to_string()), + web_public_url: None, jenkins_build_url: None, created_at: old, updated_at: old, From 0deaabfee66e0871324d5f9e6ecb3125400cc8cd Mon Sep 17 00:00:00 2001 From: kdletters <61648117+kdletters@users.noreply.github.com> Date: Thu, 17 Sep 2026 20:28:05 +0800 Subject: [PATCH 33/35] =?UTF-8?q?=E5=9B=9E=E5=A1=AB=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=91=98=E8=A6=81=E7=AB=AF=E5=88=B0=E7=AB=AF=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E8=AF=81=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 主规范记录 0.1.62 渠道清单自动摘要与客户端提示展示的用户实测结论 --- docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md b/docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md index 97c7474ea..53233a8de 100644 --- a/docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md +++ b/docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md @@ -114,6 +114,7 @@ | 安装包与清单登记一致 | 下载安装包实算 SHA-256 与尺寸后与迁移桥清单比对 | 通过(size `104678031`、sha256 `1f67…4fd0` 一致) | | 旧协议迁移桥 | 公网读取 `agc/latest.json` | 通过(0.1.48,`downloadUrl` 指向同一对象,含 `sha256` / `size`) | | 真实更新闭环(含升级后重启) | 0.1.47 客户端按提示下载安装并重启 | 通过(2026-09-17 用户实测:提示 → 下载 → 安装 → 关于页显示新版本,再次检查为已是最新) | +| 更新摘要端到端展示 | 公网读取渠道清单 `notes` 与客户端更新提示 | 通过(2026-09-17 用户实测:0.1.62 清单带 8 条自动摘要,客户端提示正常显示多行内容) | 待执行证据(首次渠道发布后回填): From 133bb2f350cd703e2d64f7b2749f816a956f7617 Mon Sep 17 00:00:00 2001 From: kdletters <61648117+kdletters@users.noreply.github.com> Date: Thu, 17 Sep 2026 21:05:18 +0800 Subject: [PATCH 34/35] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20AGC=20=E5=8E=9F?= =?UTF-8?q?=E7=94=9F=20HTTP=20=E5=A5=91=E7=BA=A6=E5=AE=88=E5=8D=AB?= =?UTF-8?q?=E4=B8=8E=E6=9B=B4=E6=96=B0=E6=91=98=E8=A6=81=E8=AF=81=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 契约守卫不再要求 http 插件放行 OSS 域名:更新清单与安装包下载已改由 tauri-plugin-updater 在原生侧完成 - 主规范回填 0.1.62 自动更新摘要与客户端提示展示的用户实测证据 --- scripts/check-native-shells.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/check-native-shells.mjs b/scripts/check-native-shells.mjs index 7b5447faf..b7eecde13 100644 --- a/scripts/check-native-shells.mjs +++ b/scripts/check-native-shells.mjs @@ -2588,6 +2588,8 @@ function assertAiGameCreatorShellUserDevBoundary() { ]) ) { throw new Error( + // 更新清单与安装包下载已改由 tauri-plugin-updater 在原生侧完成, + // 不再需要为 webview 的 http 插件放行 OSS 域名。 'AI game creator native HTTP scope must match the release, dev, custom HTTPS, and loopback API boundary', ); } From 195b7dd5dd143375c9b6700855ef1d39df9c101c Mon Sep 17 00:00:00 2001 From: Linghong Date: Thu, 17 Sep 2026 21:37:23 +0800 Subject: [PATCH 35/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8A=A0=E5=9B=BE401?= =?UTF-8?q?=20404=E9=97=AE=E9=A2=98=20(#394)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: http://genarrative-station/git/GenarrativeAI/Genarrative/pulls/394 Co-authored-by: Linghong Co-committed-by: Linghong --- .../agc-skills/agc-client-projection/SKILL.md | 2 +- .../references/projection-contract.md | 4 +- .../resources/agc-skills/manifest.json | 4 +- .../src-tauri/src/agent/direct_tool_bridge.rs | 177 ++--- .../src-tauri/src/project/resource_editor.rs | 297 +++++-- .../background_removal_tests.rs | 725 ++++++++++++++++++ .../src/view/project-development/index.tsx | 19 +- .../tests/appSurface/home.suite.ts | 8 +- .../appSurface/project-development.suite.ts | 12 +- .../tests/directActiveTurns.test.tsx | 11 +- .../projectResourceLiveIntegration.test.tsx | 42 +- .../tests/resourceVersionReplacement.test.tsx | 68 +- .../shared-memory/decision-log.md | 20 +- docs/project-memory/shared-memory/pitfalls.md | 4 + ...方案】AGC抠图模式与背景色透传-2026-09-16.md | 24 +- ...案】AI游戏创作智能体App实施计划-2026-06-24.md | 5 +- .../crates/api-server/src/editor_project.rs | 4 +- .../ImageCanvasWorldView.test.tsx | 5 +- 18 files changed, 1216 insertions(+), 215 deletions(-) create mode 100644 apps/ai-game-creator-shell/src-tauri/src/project/resource_editor/background_removal_tests.rs diff --git a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/SKILL.md b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/SKILL.md index f25ab993d..5614ef9d4 100644 --- a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/SKILL.md @@ -14,7 +14,7 @@ Let the client derive projections from real disk changes and trusted tool result 3. Keep read scopes separate: `asset.list` is the current project manifest, `asset.library.list` is the signed-in account library, and the web project's canvas resource read model is the authoritative canvas list. The account library is not the complete canvas list. 4. Use `canvas.asset_import` for safe account/canvas asset IDs or project-relative local paths. The client rechecks ownership and validates bytes; host absolute paths require native UI file-picker authorization. 5. When the user explicitly asks to create or derive video, character animation, sound effect, or background music, call `agc_create_or_derive_resource`. Use `create` only for video/audio without a source and `derive` with a registered `sourceLocalAssetId`; character animation is always derived from an image. Keep `prompt` inside the per-kind limit that the client really enforces: background music at most 140 characters, sound effect at most 1900, video and character animation at most 4000. A longer prompt is rejected before submission, so write the short version first instead of retrying the same text. -6. When the user explicitly asks to remove an image background, call `agc_remove_background` with a registered image `sourceLocalAssetId` and `assetName`. Optional `backgroundMode` is `complex` (semantic foreground segmentation; default) or `flat` (solid-colour background removal). Prefer `flat` when the background is known to be solid. Only `flat` accepts optional `screenColor`: `auto`, `#RRGGBB`, or omitted for automatic detection by the service. Do not select a colour on behalf of `auto`. The client requires the signed-in account, owns canvas/folder context and task identity, and returns only bounded queue state. +6. When the user explicitly asks to remove an image background, call `agc_remove_background` with a registered image `sourceLocalAssetId` and `assetName`. Optional `backgroundMode` is `complex` (semantic foreground segmentation; default) or `flat` (solid-colour background removal). Prefer `flat` when the background is known to be solid. Only `flat` accepts optional `screenColor`: `auto`, `#RRGGBB`, or omitted for automatic detection by the service. Do not select a colour on behalf of `auto`. The client requires the signed-in account, owns canvas/folder context and task identity, waits for the accepted operation, downloads and registers the completed local asset, and preserves the operation for recovery when the remote result is not yet known. 7. Preserve existing relative paths when a small edit is sufficient so client resource identities remain stable. 8. Do not edit `.agent/manifest.json`, revision counters, version records, resource IDs, canvas identities, source provenance, generation ledgers, or browser receipts by hand. 9. Do not create a version when no game file changed. The client compares content fingerprints and advances revision only after an actual source change. diff --git a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/references/projection-contract.md b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/references/projection-contract.md index 9129efc1a..7374d1149 100644 --- a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/references/projection-contract.md +++ b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/agc-client-projection/references/projection-contract.md @@ -16,4 +16,6 @@ Read scopes remain separate: `asset.list` is the current project's local manifes `prompt` limits are per kind and are enforced before any paid submission: background music accepts 1-140 characters, sound effect 1-1900, video and character animation 1-4000, and image editing (`agc_edit_image`) 1-32000. The client composes the submitted request from a fixed prefix plus your prompt, so an over-limit prompt fails locally with the exact limit; shorten the text rather than resubmitting the same value. `agc_edit_image` remains the image path; this tool never generates or edits still images. -`agc_remove_background` accepts a registered image `sourceLocalAssetId`, `assetName`, and optional `backgroundMode` and `screenColor`. `complex` uses semantic segmentation to identify the foreground; `flat` removes a solid-colour background. Prefer `flat` when the background is known to be solid; omitting the mode selects `complex`. Only `flat` accepts a colour: `auto`, `#RRGGBB`, or omitted for automatic service detection. Never infer a concrete colour for `auto`. Empty or invalid values and colour without `flat` are rejected. The client resolves the formal source resource, canvas/folder context, stable operation identity, idempotency key, and authenticated External v1 `/api/external/v1/editor/images/background-removals` call. Mode and colour are part of request identity. Its result is bounded queue state; Codex must not poll internal workers, construct source URLs, or retry with a new identity after an uncertain response. +`agc_remove_background` accepts a registered image `sourceLocalAssetId`, `assetName`, and optional `backgroundMode` and `screenColor`. `complex` uses semantic segmentation to identify the foreground; `flat` removes a solid-colour background. Prefer `flat` when the background is known to be solid; omitting the mode selects `complex`. Only `flat` accepts a colour: `auto`, `#RRGGBB`, or omitted for automatic service detection. Never infer a concrete colour for `auto`. Empty or invalid values and colour without `flat` are rejected. The client resolves the formal source resource, canvas/folder context, stable operation identity, idempotency key, and authenticated request. Ordinary account mode maps the External v1 shaped route to `/api/editor/images/background-removals`; ExternalDeveloper mode uses `/api/external/v1/editor/images/background-removals`. Mode and colour are part of request identity. After acceptance, the client polls the authenticated generation status route, downloads the completed media, and commits it to the local manifest. If completion is unknown, it retains the same local operation for recovery; it never retries with a new identity or exposes internal worker details. + +After an interrupted call, inspect `agc_list_registered_assets.pendingOperations`. Calling `agc_remove_background` again with the same source, name, mode, and colour resumes the matching pending operation. A submission marked `reconciliation-required` needs client-side reconciliation and cannot be automatically resumed. Do not change parameters to bypass a pending task. A queued receipt, fixed progress value, or absent local file does not establish that the background-removal provider is waiting in a queue; report only the observed state. diff --git a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/manifest.json b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/manifest.json index 6debfefb3..26790f360 100644 --- a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/manifest.json +++ b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/manifest.json @@ -1,6 +1,6 @@ { "schemaVersion": "agc-skill-pack.v1", - "version": "2026-08-26.20", + "version": "2026-08-26.23", "skills": [ { "name": "agc-game-production-workflow", @@ -123,7 +123,7 @@ "agents/openai.yaml", "references/projection-contract.md" ], - "sha256": "93210c0eeb73b279d35aa85c201c226139b0bdf041f3300ac2c6e2c1bdd63afe" + "sha256": "247787975944ce8b21d7c879c39c60ec13608056cff9426ac374c9299937d475" } ] } diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs index f31a3cdd4..9984ff4d6 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs @@ -1294,7 +1294,10 @@ fn bridge_list_registered_assets(root: &Path, arguments: &Value) -> Value { .map(|asset| bridge_registered_resource(asset, include_sequence_frames)) .collect::>(); let next_offset = (offset + resources.len() < total).then_some(offset + resources.len()); - let pending = list_pending_local_project_resource_edits_at( + let platform_session = (editor_api_mode() == EditorApiMode::PlatformAccount) + .then(current_platform_session) + .flatten(); + let pending = list_pending_local_project_resource_edits_for_session_at( ListPendingLocalProjectResourceEditsInput { project_path: root .to_str() @@ -1302,6 +1305,7 @@ fn bridge_list_registered_assets(root: &Path, arguments: &Value) -> Value { .to_string(), expected_project_id: manifest.project_id, }, + platform_session.as_ref(), )? .into_iter() .map(|edit| { @@ -1311,6 +1315,8 @@ fn bridge_list_registered_assets(root: &Path, arguments: &Value) -> Value { "mode": edit.generation_mode, "sourceResourceId": edit.source_resource_id, "assetName": edit.asset_name, + "backgroundMode": edit.background_mode, + "screenColor": edit.screen_color, "phase": edit.phase, "createdAt": edit.created_at, }) @@ -1801,8 +1807,8 @@ async fn bridge_import_account_assets(state: &DirectToolBridgeState, arguments: fn bridge_completed_resource_result( root: &Path, - kind: DirectResourceGenerationKind, - mode: DirectResourceGenerationMode, + kind: &str, + mode: &str, result: DeriveLocalProjectResourceResult, ) -> Result { let asset = result @@ -1814,8 +1820,8 @@ fn bridge_completed_resource_result( Ok(json!({ "status": "completed", "operationId": result.operation_id, - "kind": kind.as_str(), - "mode": mode.as_str(), + "kind": kind, + "mode": mode, "sourceResourceId": result.source_resource_id, "committedProjectRevision": result.committed_project_revision, "resource": bridge_registered_resource(asset, true), @@ -1910,10 +1916,17 @@ async fn bridge_create_or_derive_resource( source_version_id: None, prompt: input.prompt.clone(), asset_name: input.asset_name.clone(), + background_mode: None, + screen_color: None, }; with_direct_editor_api_credentials(derive_local_project_resource_at(request)).await? }; - bridge_completed_resource_result(&state.root, input.kind, input.mode, completed) + bridge_completed_resource_result( + &state.root, + input.kind.as_str(), + input.mode.as_str(), + completed, + ) } .await; match result { @@ -1927,7 +1940,8 @@ async fn bridge_create_or_derive_resource( } async fn bridge_remove_background(state: &DirectToolBridgeState, arguments: &Value) -> Value { - let result = async { + let _generation_guard = state.resource_generation_gate.lock().await; + let result = with_direct_editor_api_credentials(async { super::direct_tools_mcp::validate_remove_background_arguments(arguments)?; enforce_project_permission_policy(&state.root, "canvas.asset_generate")?; enforce_project_permission_policy(&state.root, "asset.register")?; @@ -1948,74 +1962,72 @@ async fn bridge_remove_background(state: &DirectToolBridgeState, arguments: &Val if !source_asset.media_type.starts_with("image/") { return Err("抠图工具只接受当前项目已登记的图片资源".to_string()); } - let source_resource_id = source_asset - .source - .resource_id - .as_deref() - .map(str::trim) - .filter(|value| !value.is_empty() && !value.starts_with("local-asset:")) - .ok_or_else(|| "图片资源缺少可供抠图服务使用的正式 resourceId".to_string())? - .to_string(); - let (api_base_url, api_key, session) = resolve_canvas_sync_api_credentials(None, None)?; - let access = ExternalEditorBindingAccess::new(&api_base_url, &api_key, session.as_ref())?; - let client = crate::http_client::agc_main_site_client_builder() - .build() - .map_err(|_| "创建抠图服务连接失败".to_string())?; - let context = - prepare_external_canvas_generation_context(&state.root, &client, &access).await?; + let background_mode = background_mode.unwrap_or("complex").to_string(); + let source_resource_id = bridge_asset_canonical_resource_id(source_asset); let fingerprint = background_removal_request_fingerprint( &source_asset_id, &asset_name, - background_mode, + Some(background_mode.as_str()), screen_color, ); - let (_operation_id, idempotency_key) = state.resource_request_ids(&fingerprint)?; - let route = "/api/external/v1/editor/images/background-removals"; - let mut request_body = json!({ - "sourceImageSrc": source_resource_id, - "projectId": manifest.project_id, - "assetKind": source_asset.kind, - "assetFolderId": context.asset_folder_id, - "assetLabel": asset_name, - "sourceResourceId": source_resource_id, - }); - if background_mode == Some("flat") { - request_body["backgroundMode"] = json!("flat"); + let (_, _, platform_session) = resolve_canvas_sync_api_credentials(None, None)?; + let pending = list_pending_local_project_resource_edits_for_session_at( + ListPendingLocalProjectResourceEditsInput { + project_path: state.root.to_string_lossy().into_owned(), + expected_project_id: manifest.project_id.clone(), + }, + platform_session.as_ref(), + )?; + let matching_pending = pending + .into_iter() + .filter(|pending| { + pending.edit_kind == LocalProjectResourceEditKind::BackgroundRemoval + && (pending.source_asset_id.as_deref() == Some(source_asset_id.as_str()) + || pending.source_resource_id == format!("local-asset:{source_asset_id}")) + && pending.asset_name == asset_name + && pending.background_mode.as_deref().unwrap_or("complex") + == background_mode.as_str() + && pending.screen_color.as_deref() == screen_color + }) + .collect::>(); + if matching_pending.len() > 1 { + return Err("存在多个相同抠图 operation,必须先在客户端完成对账".to_string()); } - if let Some(color) = screen_color { - request_body["screenColor"] = json!(color); - } - let response = crate::http_client::with_agc_main_site_marker( - client - .post(format!("{}{}", api_base_url, route)) - .bearer_auth(api_key) - .header("Idempotency-Key", idempotency_key) - .json(&request_body), - ) - .send() - .await - .map_err(|error| format!("抠图服务提交失败:{error}"))?; - let status = response.status(); - let payload = response - .json::() - .await - .map_err(|error| format!("抠图服务响应无法解析:{error}"))?; - if !status.is_success() { - if status == reqwest::StatusCode::UNAUTHORIZED { - return Err("authentication-required: 抠图服务提交失败:HTTP 401".to_string()); - } - return Err(format!("抠图服务提交失败:HTTP {}", status.as_u16())); - } - let queue_state = external_editor_response_data(&payload).clone(); - Ok::<_, String>(json!({ - "status": "queued", - "sourceLocalAssetId": source_asset_id, - "assetName": asset_name, - "projectId": manifest.project_id, - "assetFolderId": context.asset_folder_id, - "queueState": bridge_safe_queue_state(queue_state), - })) - } + let completed = if let Some(pending) = matching_pending.into_iter().next() { + resume_local_project_resource_edit_at(ResumeLocalProjectResourceEditInput { + project_path: state.root.to_string_lossy().into_owned(), + expected_project_id: manifest.project_id.clone(), + operation_id: pending.operation_id, + }) + .await? + } else { + let (operation_id, idempotency_key) = state.resource_request_ids(&fingerprint)?; + let revision = read_game_creator_agent_runtime_project_revision(&state.root)?.revision; + let request = DeriveLocalProjectResourceInput { + project_path: state.root.to_string_lossy().into_owned(), + expected_project_id: manifest.project_id.clone(), + expected_project_revision: revision, + operation_id, + idempotency_key, + edit_kind: LocalProjectResourceEditKind::BackgroundRemoval, + generation_mode: LocalProjectResourceGenerationMode::Derive, + source_resource_id, + source_asset_id: Some(source_asset_id.clone()), + source_path: Some(source_asset.local_path.clone()), + source_media_type: Some(source_asset.media_type.clone()), + source_subtype: Some(source_asset.kind.clone()), + producer_task_id: source_asset.source.task_id.clone(), + source_version_id: None, + prompt: "去除背景".to_string(), + asset_name: asset_name.clone(), + background_mode: Some(background_mode), + screen_color: screen_color.map(str::to_string), + }; + derive_local_project_resource_at(request).await? + }; + emit_game_creator_manifest_invalidated(&state.root, "direct-background-removal"); + bridge_completed_resource_result(&state.root, "background-removal", "derive", completed) + }) .await; match result { Ok(value) => bridge_tool_result(value.to_string(), Vec::new(), false), @@ -2041,17 +2053,6 @@ fn background_removal_request_fingerprint( } } -fn bridge_safe_queue_state(value: Value) -> Value { - let object = value.as_object(); - json!({ - "operationId": object.and_then(|value| value.get("operationId")).and_then(Value::as_str), - "status": object.and_then(|value| value.get("status")).and_then(Value::as_str), - "phaseLabel": object.and_then(|value| value.get("phaseLabel")).and_then(Value::as_str), - "progress": object.and_then(|value| value.get("progress")).and_then(Value::as_u64), - "updatedAtMicros": object.and_then(|value| value.get("updatedAtMicros")).and_then(Value::as_u64), - }) -} - fn bridge_art_resources( root: &Path, asset_paths: &[String], @@ -3844,20 +3845,4 @@ mod tests { ); } } - - #[test] - fn bridge_background_removal_queue_projection_is_bounded() { - let projection = bridge_safe_queue_state(json!({ - "operationId": "background-removal-1", - "status": "queued", - "phaseLabel": "排队中", - "progress": 0, - "updatedAtMicros": 1, - "error": "private provider detail", - "signedUrl": "https://private.invalid/result" - })); - assert_eq!(projection["operationId"], "background-removal-1"); - assert!(projection.get("error").is_none()); - assert!(projection.get("signedUrl").is_none()); - } } diff --git a/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs b/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs index 46bb81c24..145330f56 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs @@ -113,6 +113,7 @@ fn resource_edit_project_mutation_lock(root: &Path) -> Result &'static str { match self { Self::ImageReference => "image-reference", + Self::BackgroundRemoval => "background-removal", Self::Svg => "svg", Self::CharacterAnimation => "character-animation", Self::Video => "video", @@ -188,6 +191,10 @@ pub(crate) struct DeriveLocalProjectResourceInput { pub(crate) source_version_id: Option, pub(crate) prompt: String, pub(crate) asset_name: String, + #[serde(default)] + pub(crate) background_mode: Option, + #[serde(default)] + pub(crate) screen_color: Option, } #[derive(Clone, Debug, PartialEq, Serialize)] @@ -220,6 +227,10 @@ pub(crate) struct PendingLocalProjectResourceEdit { pub(crate) source_resource_id: String, pub(crate) source_asset_id: Option, pub(crate) asset_name: String, + #[serde(default)] + pub(crate) background_mode: Option, + #[serde(default)] + pub(crate) screen_color: Option, pub(crate) prompt_sha256: String, pub(crate) phase: String, pub(crate) created_at: u64, @@ -385,6 +396,10 @@ struct ResourceEditLedger { prompt: String, asset_name: String, #[serde(default)] + background_mode: Option, + #[serde(default)] + screen_color: Option, + #[serde(default)] provider_request_issued_at: Option, #[serde(default)] access_scheme: Option, @@ -829,7 +844,7 @@ fn resource_edit_request_fingerprint( prompt: &str, asset_name: &str, ) -> Result { - let payload = serde_json::to_vec(&serde_json::json!({ + let mut identity = serde_json::json!({ "schemaVersion": RESOURCE_EDIT_SCHEMA_VERSION, "projectId": input.expected_project_id, "operationId": input.operation_id, @@ -840,8 +855,13 @@ fn resource_edit_request_fingerprint( "sourceSha256": source.source_sha256, "prompt": prompt, "assetName": asset_name, - })) - .map_err(|error| format!("序列化资源编辑请求失败:{error}"))?; + }); + if input.edit_kind == LocalProjectResourceEditKind::BackgroundRemoval { + identity["backgroundMode"] = serde_json::json!(input.background_mode); + identity["screenColor"] = serde_json::json!(input.screen_color); + } + let payload = serde_json::to_vec(&identity) + .map_err(|error| format!("序列化资源编辑请求失败:{error}"))?; Ok(sha256_hex(&payload)) } @@ -851,7 +871,7 @@ fn legacy_resource_edit_request_fingerprint( prompt: &str, asset_name: &str, ) -> Result { - let payload = serde_json::to_vec(&serde_json::json!({ + let mut identity = serde_json::json!({ "schemaVersion": RESOURCE_EDIT_SCHEMA_VERSION, "projectId": input.expected_project_id, "expectedProjectRevision": input.expected_project_revision, @@ -862,8 +882,13 @@ fn legacy_resource_edit_request_fingerprint( "sourceSha256": source.source_sha256, "prompt": prompt, "assetName": asset_name, - })) - .map_err(|error| format!("序列化旧资源编辑请求失败:{error}"))?; + }); + if input.edit_kind == LocalProjectResourceEditKind::BackgroundRemoval { + identity["backgroundMode"] = serde_json::json!(input.background_mode); + identity["screenColor"] = serde_json::json!(input.screen_color); + } + let payload = serde_json::to_vec(&identity) + .map_err(|error| format!("序列化旧资源编辑请求失败:{error}"))?; Ok(sha256_hex(&payload)) } @@ -1106,9 +1131,21 @@ fn infer_resource_edit_source_media_type( .and_then(|value| value.to_str()) .map(str::to_ascii_lowercase); let media_type = match (edit_kind, extension.as_deref()) { - (LocalProjectResourceEditKind::ImageReference, Some("png")) => "image/png", - (LocalProjectResourceEditKind::ImageReference, Some("jpg" | "jpeg")) => "image/jpeg", - (LocalProjectResourceEditKind::ImageReference, Some("webp")) => "image/webp", + ( + LocalProjectResourceEditKind::ImageReference + | LocalProjectResourceEditKind::BackgroundRemoval, + Some("png"), + ) => "image/png", + ( + LocalProjectResourceEditKind::ImageReference + | LocalProjectResourceEditKind::BackgroundRemoval, + Some("jpg" | "jpeg"), + ) => "image/jpeg", + ( + LocalProjectResourceEditKind::ImageReference + | LocalProjectResourceEditKind::BackgroundRemoval, + Some("webp"), + ) => "image/webp", (LocalProjectResourceEditKind::Svg, Some("svg")) => "image/svg+xml", (LocalProjectResourceEditKind::Video, Some("mp4")) => "video/mp4", (LocalProjectResourceEditKind::Video, Some("webm")) => "video/webm", @@ -1145,7 +1182,8 @@ fn infer_resource_edit_source_media_type( fn infer_resource_edit_source_asset_kind(edit_kind: &LocalProjectResourceEditKind) -> String { match edit_kind { - LocalProjectResourceEditKind::ImageReference => "art-image", + LocalProjectResourceEditKind::ImageReference + | LocalProjectResourceEditKind::BackgroundRemoval => "art-image", LocalProjectResourceEditKind::Svg => "svg", LocalProjectResourceEditKind::CharacterAnimation => "character-animation", LocalProjectResourceEditKind::Video => "video", @@ -1373,8 +1411,11 @@ fn resolve_resource_edit_source( { return Err("音频编辑只能用于音频资源".to_string()); } - LocalProjectResourceEditKind::ImageReference if !lower_media_type.starts_with("image/") => { - return Err("图片参考编辑只能用于图片资源".to_string()); + LocalProjectResourceEditKind::ImageReference + | LocalProjectResourceEditKind::BackgroundRemoval + if !lower_media_type.starts_with("image/") => + { + return Err("此操作只能用于图片资源".to_string()); } _ => {} } @@ -2023,8 +2064,11 @@ fn validate_resource_edit_source_recovery_state( || (ledger.source_remote_asset_object_id.is_some() && !ledger.source_upload_completed) || (ledger.source_remote_resource_id.is_some() && ledger.source_remote_asset_object_id.is_none()) - || (input.edit_kind != LocalProjectResourceEditKind::ImageReference - && ledger.source_remote_resource_id.is_some()) + || (!matches!( + input.edit_kind, + LocalProjectResourceEditKind::ImageReference + | LocalProjectResourceEditKind::BackgroundRemoval + ) && ledger.source_remote_resource_id.is_some()) { return Err("result-unknown: 源资源远端恢复阶段不完整,禁止自动重放".to_string()); } @@ -2081,7 +2125,8 @@ async fn ensure_resource_edit_source_reference( &source_identity, )? { let stable_reference = match input.edit_kind { - LocalProjectResourceEditKind::ImageReference => binding + LocalProjectResourceEditKind::ImageReference + | LocalProjectResourceEditKind::BackgroundRemoval => binding .remote_resource_id .filter(|reference| is_registered_editor_reference_id(reference)), LocalProjectResourceEditKind::Video @@ -2188,45 +2233,48 @@ async fn ensure_resource_edit_source_reference( confirmed.value }; - let (stable_reference, remote_resource_id, width, height) = - if input.edit_kind == LocalProjectResourceEditKind::ImageReference { - let bytes = source - .bytes - .as_deref() - .ok_or_else(|| "登记源图片缺少文件内容".to_string())?; - let decoded = image::load_from_memory(bytes) - .map_err(|_| "登记源图片前无法解析图片尺寸".to_string())?; - let resource_id = if let Some(resource_id) = ledger.source_remote_resource_id.clone() { - resource_id - } else { - let registered = register_resource_edit_source_image( - client, - access, - source, - local_asset_id, - &binding_key, - &canvas_context.project_id, - &object_key, - &asset_object_id, - ) - .await?; - let resource_id = registered.value.0; - ledger.source_remote_resource_id = Some(resource_id.clone()); - write_resource_edit_source_stage(root, ledger, "源图片项目资源登记")?; - if let Some(error) = registered.post_response_session_error { - return Err(error); - } - resource_id - }; - ( - resource_id.clone(), - Some(resource_id), - Some(decoded.width()), - Some(decoded.height()), - ) + let (stable_reference, remote_resource_id, width, height) = if matches!( + input.edit_kind, + LocalProjectResourceEditKind::ImageReference + | LocalProjectResourceEditKind::BackgroundRemoval + ) { + let bytes = source + .bytes + .as_deref() + .ok_or_else(|| "登记源图片缺少文件内容".to_string())?; + let decoded = image::load_from_memory(bytes) + .map_err(|_| "登记源图片前无法解析图片尺寸".to_string())?; + let resource_id = if let Some(resource_id) = ledger.source_remote_resource_id.clone() { + resource_id } else { - (object_key.clone(), None, None, None) + let registered = register_resource_edit_source_image( + client, + access, + source, + local_asset_id, + &binding_key, + &canvas_context.project_id, + &object_key, + &asset_object_id, + ) + .await?; + let resource_id = registered.value.0; + ledger.source_remote_resource_id = Some(resource_id.clone()); + write_resource_edit_source_stage(root, ledger, "源图片项目资源登记")?; + if let Some(error) = registered.post_response_session_error { + return Err(error); + } + resource_id }; + ( + resource_id.clone(), + Some(resource_id), + Some(decoded.width()), + Some(decoded.height()), + ) + } else { + (object_key.clone(), None, None, None) + }; access.validate_frozen_session()?; let binding = new_external_editor_resource_binding( &input.expected_project_id, @@ -2330,6 +2378,28 @@ fn resource_edit_remote_request( "generationInputs": generation_inputs, }), )), + LocalProjectResourceEditKind::BackgroundRemoval => { + let background_mode = input.background_mode.as_deref().unwrap_or("complex"); + validate_background_removal_options(background_mode, input.screen_color.as_deref())?; + let mut body = serde_json::json!({ + "sourceImageSrc": source_reference + .ok_or_else(|| "抠图缺少正式源资源 ID".to_string())?, + "sourceResourceId": source_reference + .ok_or_else(|| "抠图缺少正式源资源 ID".to_string())?, + "assetKind": source.asset_kind, + "assetLabel": asset_name, + "backgroundMode": background_mode, + "generationInputs": generation_inputs, + }); + if let Some(screen_color) = input.screen_color.as_deref() { + body["screenColor"] = serde_json::json!(screen_color); + } + if let Some(context) = canvas_context { + body["projectId"] = serde_json::json!(context.project_id); + body["assetFolderId"] = serde_json::json!(context.asset_folder_id); + } + Ok(("/api/external/v1/editor/images/background-removals", body)) + } LocalProjectResourceEditKind::CharacterAnimation => { let mut body = serde_json::json!({ "sourceLayerId": format!("resource-{}", input.operation_id), @@ -2436,6 +2506,31 @@ fn resource_edit_remote_request( } } +fn validate_background_removal_options( + background_mode: &str, + screen_color: Option<&str>, +) -> Result<(), String> { + if !matches!(background_mode, "complex" | "flat") { + return Err("抠图 backgroundMode 必须是 complex 或 flat".to_string()); + } + if background_mode == "complex" && screen_color.is_some() { + return Err("complex 抠图不能携带 screenColor".to_string()); + } + if let Some(screen_color) = screen_color { + let valid_hex = screen_color.len() == 7 + && screen_color.starts_with('#') + && screen_color.as_bytes()[1..].iter().all(|byte| { + byte.is_ascii_digit() + || (b'a'..=b'f').contains(byte) + || (b'A'..=b'F').contains(byte) + }); + if screen_color != "auto" && !valid_hex { + return Err("flat 抠图 screenColor 必须是 auto 或 #RRGGBB".to_string()); + } + } + Ok(()) +} + fn resource_edit_operation_id(payload: &serde_json::Value) -> Option { let data = external_editor_response_data(payload); json_string_field(data, "operationId").or_else(|| { @@ -2464,11 +2559,13 @@ fn is_external_resource_edit_endpoint(endpoint: &str) -> bool { matches!( endpoint, "/api/editor/images/edits" + | "/api/editor/images/background-removals" | "/api/editor/character-animations/generations" | "/api/editor/videos/generations" | "/api/editor/audios/sound-effects/generations" | "/api/editor/audios/background-music/generations" | "/api/external/v1/editor/images/edits" + | "/api/external/v1/editor/images/background-removals" | "/api/external/v1/editor/character-animations/generations" | "/api/external/v1/editor/videos/generations" | "/api/external/v1/editor/audios/sound-effects/generations" @@ -2954,6 +3051,17 @@ fn validate_downloaded_media( let is_jpeg = starts(&[0xff, 0xd8, 0xff]); let is_webp = bytes.len() >= 12 && starts(b"RIFF") && &bytes[8..12] == b"WEBP"; match edit_kind { + LocalProjectResourceEditKind::BackgroundRemoval => { + if !is_png { + return Err("抠图结果必须是带透明通道的 PNG".to_string()); + } + let decoded = image::load_from_memory_with_format(bytes, image::ImageFormat::Png) + .map_err(|_| "抠图结果不是有效的 PNG".to_string())?; + if !decoded.color().has_alpha() { + return Err("抠图结果缺少透明通道".to_string()); + } + Ok(("image/png".to_string(), "png".to_string())) + } LocalProjectResourceEditKind::ImageReference => { if is_png { Ok(("image/png".to_string(), "png".to_string())) @@ -3246,6 +3354,7 @@ async fn prepare_remote_resource_edit( let prepared_source = if matches!( input.edit_kind, LocalProjectResourceEditKind::ImageReference + | LocalProjectResourceEditKind::BackgroundRemoval | LocalProjectResourceEditKind::CharacterAnimation ) || (input.edit_kind == LocalProjectResourceEditKind::Video && input.generation_mode == LocalProjectResourceGenerationMode::Derive) @@ -3275,6 +3384,7 @@ async fn prepare_remote_resource_edit( } else if matches!( input.edit_kind, LocalProjectResourceEditKind::CharacterAnimation + | LocalProjectResourceEditKind::BackgroundRemoval | LocalProjectResourceEditKind::Video | LocalProjectResourceEditKind::SoundEffect | LocalProjectResourceEditKind::BackgroundMusic @@ -4444,8 +4554,11 @@ fn write_resource_edit_result_binding( let Some(asset_object_id) = ledger.remote_asset_object_id.as_deref() else { return Ok(()); }; - if input.edit_kind == LocalProjectResourceEditKind::ImageReference - && ledger.remote_resource_id.is_none() + if matches!( + input.edit_kind, + LocalProjectResourceEditKind::ImageReference + | LocalProjectResourceEditKind::BackgroundRemoval + ) && ledger.remote_resource_id.is_none() { return Ok(()); } @@ -4455,7 +4568,11 @@ fn write_resource_edit_result_binding( media_read_limit(&input.edit_kind), "派生资源 binding 文件", )?; - let (width, height) = if input.edit_kind == LocalProjectResourceEditKind::ImageReference { + let (width, height) = if matches!( + input.edit_kind, + LocalProjectResourceEditKind::ImageReference + | LocalProjectResourceEditKind::BackgroundRemoval + ) { let decoded = image::load_from_memory(&bytes) .map_err(|_| "派生图片 binding 无法解析尺寸".to_string())?; (Some(decoded.width()), Some(decoded.height())) @@ -4775,6 +4892,17 @@ fn commit_resource_edit_version( pub(crate) fn list_pending_local_project_resource_edits_at( input: ListPendingLocalProjectResourceEditsInput, +) -> Result, String> { + let current_platform_session = current_platform_session(); + list_pending_local_project_resource_edits_for_session_at( + input, + current_platform_session.as_ref(), + ) +} + +pub(crate) fn list_pending_local_project_resource_edits_for_session_at( + input: ListPendingLocalProjectResourceEditsInput, + platform_session: Option<&PlatformSessionSnapshot>, ) -> Result, String> { let root = Path::new(input.project_path.trim()); validate_project_root(root)?; @@ -4782,8 +4910,7 @@ pub(crate) fn list_pending_local_project_resource_edits_at( if manifest.project_id != input.expected_project_id { return Err("project-identity-conflict".to_string()); } - let current_platform_session = current_platform_session(); - let _platform_session_lease = current_platform_session + let _platform_session_lease = platform_session .as_ref() .map(|session| acquire_platform_session_identity_lease(&session.identity())) .transpose()?; @@ -4825,10 +4952,8 @@ pub(crate) fn list_pending_local_project_resource_edits_at( if !matches!( ledger.phase, ResourceEditLedgerPhase::Committed | ResourceEditLedgerPhase::Archived - ) && resource_edit_pending_is_visible_to_current_principal( - &ledger, - current_platform_session.as_ref(), - ) { + ) && resource_edit_pending_is_visible_to_current_principal(&ledger, platform_session) + { pending.push(PendingLocalProjectResourceEdit { operation_id: ledger.operation_id, edit_kind: ledger.edit_kind, @@ -4836,6 +4961,8 @@ pub(crate) fn list_pending_local_project_resource_edits_at( source_resource_id: ledger.source_resource_id, source_asset_id: ledger.source_asset_id, asset_name: ledger.asset_name, + background_mode: ledger.background_mode, + screen_color: ledger.screen_color, prompt_sha256: sha256_hex(ledger.prompt.as_bytes()), phase: ledger.phase.as_str().to_string(), created_at: ledger.created_at, @@ -5186,6 +5313,8 @@ pub(crate) async fn resume_local_project_resource_edit_at( source_version_id, prompt: ledger.prompt, asset_name: ledger.asset_name, + background_mode: ledger.background_mode, + screen_color: ledger.screen_color, }) .await } @@ -5195,6 +5324,12 @@ pub(crate) async fn derive_local_project_resource_at( ) -> Result { validate_resource_edit_uuid(&input.operation_id, "operationId")?; validate_resource_edit_uuid(&input.idempotency_key, "idempotencyKey")?; + if input.edit_kind == LocalProjectResourceEditKind::BackgroundRemoval { + validate_background_removal_options( + input.background_mode.as_deref().unwrap_or("complex"), + input.screen_color.as_deref(), + )?; + } if input.expected_project_revision > 9_007_199_254_740_991 { return Err("expectedProjectRevision 超出 JavaScript 安全整数范围".to_string()); } @@ -5281,6 +5416,8 @@ pub(crate) async fn derive_local_project_resource_at( source_sha256: source.source_sha256.clone(), prompt: prompt.clone(), asset_name: asset_name.clone(), + background_mode: input.background_mode.clone(), + screen_color: input.screen_color.clone(), provider_request_issued_at: None, access_scheme: None, api_identity_scheme: None, @@ -5484,6 +5621,9 @@ pub(crate) async fn derive_local_project_resource_at( Ok(result) } +#[cfg(test)] +mod background_removal_tests; + #[cfg(test)] mod tests { use super::*; @@ -5963,6 +6103,8 @@ mod tests { source_version_id: None, prompt: "保留原意并补充红发角色设定".to_string(), asset_name: "规则编辑版".to_string(), + background_mode: None, + screen_color: None, } } @@ -6000,6 +6142,8 @@ mod tests { source_sha256: source.source_sha256.clone(), prompt: input.prompt.clone(), asset_name: input.asset_name.clone(), + background_mode: input.background_mode.clone(), + screen_color: input.screen_color.clone(), provider_request_issued_at: None, access_scheme: input .edit_kind @@ -8539,6 +8683,37 @@ mod tests { serde_json::json!("stable-image-reference") ); assert!(image_body.get("sourceImageSrc").is_none()); + let mut background = image; + background.edit_kind = LocalProjectResourceEditKind::BackgroundRemoval; + background.background_mode = Some("flat".to_string()); + background.screen_color = Some("auto".to_string()); + let (background_endpoint, background_body) = resource_edit_remote_request( + &background, + &ResourceEditSourceSnapshot { + media_type: "image/png".to_string(), + asset_kind: "art-image".to_string(), + source_path: Some("assets/source.png".to_string()), + bytes: Some(resource_editor_test_png()), + ..source.clone() + }, + "去除背景", + "透明图", + Some("stable-image-reference"), + Some(&ExternalCanvasGenerationContext { + project_id: "project-1".to_string(), + asset_folder_id: "folder-1".to_string(), + canvas_name: "测试画板".to_string(), + }), + ) + .expect("build background removal request"); + assert_eq!( + background_endpoint, + "/api/external/v1/editor/images/background-removals" + ); + assert_eq!(background_body["backgroundMode"], "flat"); + assert_eq!(background_body["screenColor"], "auto"); + assert_eq!(background_body["projectId"], "project-1"); + assert_eq!(background_body["assetFolderId"], "folder-1"); assert!(is_external_resource_edit_endpoint( "/api/editor/videos/generations" )); diff --git a/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor/background_removal_tests.rs b/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor/background_removal_tests.rs new file mode 100644 index 000000000..aa731aeef --- /dev/null +++ b/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor/background_removal_tests.rs @@ -0,0 +1,725 @@ +use super::*; + +use std::io::{Cursor, Read, Write}; +use std::net::{TcpListener, TcpStream}; +use std::sync::{Arc, Mutex}; + +const TEST_PROJECT_ID: &str = "background-removal-project"; +const TEST_API_KEY: &str = "background-removal-key"; +const REMOTE_PROJECT_ID: &str = "background-removal-remote-project"; +const REMOTE_FOLDER_ID: &str = "background-removal-folder"; +const SOURCE_RESOURCE_ID: &str = "editor-resource-background-removal-source"; + +struct BackgroundRemovalFixture { + directory: tempfile::TempDir, + request: DeriveLocalProjectResourceInput, + source_asset_id: String, + source_bytes: Vec, +} + +#[tokio::test] +async fn background_removal_platform_account_uses_runtime_job_and_platform_read_url_routes() { + let listener = TcpListener::bind("127.0.0.1:0").expect("bind platform account server"); + let base_url = format!( + "http://{}", + listener.local_addr().expect("platform address") + ); + let _session_guard = install_test_platform_session( + "background-removal-owner", + "background-removal-platform-token", + &base_url, + ); + let session = current_platform_session().expect("platform account session"); + let fixture = background_removal_fixture_for_session(&base_url, Some(&session)); + let generated_png = test_png(); + let signed_url = format!("{base_url}/platform-result.png"); + let captured = Arc::new(Mutex::new(Vec::new())); + let server_captured = Arc::clone(&captured); + let server_png = generated_png.clone(); + let server = std::thread::spawn(move || { + for index in 0..6 { + let mut stream = accept_request(&listener, index); + let request = read_request(&mut stream); + server_captured + .lock() + .expect("capture requests") + .push(request.clone()); + if respond_canvas_context_request(&mut stream, &request) { + continue; + } + let line = request.lines().next().unwrap_or_default(); + if index != 5 { + assert!(request + .to_ascii_lowercase() + .contains("authorization: bearer background-removal-platform-token")); + } + match index { + 2 => { + assert!(line.starts_with("POST /api/editor/images/background-removals ")); + assert_submission(&request); + write_json( + &mut stream, + "200 OK", + serde_json::json!({"data": {"queueState": { + "operationId": "platform-background-removal", "status": "queued", "pollAfterMs": 0 + }}}), + ); + } + 3 => { + assert!(line.starts_with( + "GET /api/runtime/external-generation/jobs/platform-background-removal " + )); + write_json( + &mut stream, + "200 OK", + serde_json::json!({"data": {"job": { + "operationId": "platform-background-removal", "status": "completed", + "result": {"resource": { + "resourceId": "editor-resource-platform-background-removal", + "projectId": REMOTE_PROJECT_ID, + "objectKey": "generated/platform-background-removal.png", + "assetObjectId": "platform-background-removal-object" + }} + }}}), + ); + } + 4 => { + assert!(line.starts_with("GET /api/assets/read-url?")); + write_json( + &mut stream, + "200 OK", + serde_json::json!({"data": {"read": {"signedUrl": signed_url}}}), + ); + } + 5 => { + assert!(line.starts_with("GET /platform-result.png ")); + write_bytes(&mut stream, "image/png", &server_png); + } + _ => unreachable!(), + } + } + }); + + let result = derive_local_project_resource_at(fixture.request.clone()) + .await + .expect("complete platform account background removal"); + server.join().expect("join platform account server"); + let requests = captured.lock().expect("read platform requests"); + assert_eq!( + requests + .iter() + .filter(|request| request.starts_with("POST /api/editor/images/background-removals ")) + .count(), + 1 + ); + assert_eq!( + fs::read( + fixture + .root() + .join(result.asset.expect("platform asset").local_path) + ) + .expect("read platform result"), + generated_png + ); +} + +impl BackgroundRemovalFixture { + fn root(&self) -> &Path { + self.directory.path() + } +} + +fn test_png() -> Vec { + let mut output = Cursor::new(Vec::new()); + image::DynamicImage::new_rgba8(2, 2) + .write_to(&mut output, image::ImageFormat::Png) + .expect("encode test PNG"); + output.into_inner() +} + +#[test] +fn background_removal_download_rejects_non_png_and_png_without_alpha() { + let malformed = validate_downloaded_media( + &LocalProjectResourceEditKind::BackgroundRemoval, + "image/png", + b"not-a-png", + ) + .expect_err("background removal must reject non-PNG bytes"); + assert!(malformed.contains("PNG")); + + let mut rgb_png = Cursor::new(Vec::new()); + image::DynamicImage::ImageRgb8(image::RgbImage::new(2, 2)) + .write_to(&mut rgb_png, image::ImageFormat::Png) + .expect("encode RGB PNG"); + let missing_alpha = validate_downloaded_media( + &LocalProjectResourceEditKind::BackgroundRemoval, + "image/png", + rgb_png.get_ref(), + ) + .expect_err("background removal must reject PNG without alpha channel"); + assert!(missing_alpha.contains("透明通道")); +} + +fn background_removal_fixture(base_url: &str) -> BackgroundRemovalFixture { + background_removal_fixture_for_session(base_url, None) +} + +fn background_removal_fixture_for_session( + base_url: &str, + platform_session: Option<&PlatformSessionSnapshot>, +) -> BackgroundRemovalFixture { + let directory = tempfile::tempdir().expect("create background removal fixture"); + let root = directory.path(); + init_local_game_project_at(root, TEST_PROJECT_ID, "抠图账本闭环测试") + .expect("initialize local project"); + let source_bytes = test_png(); + let uploaded = upload_local_asset_at(root, "source.png", "image/png", &source_bytes) + .expect("register source image"); + let manifest = read_existing_manifest_for_project(root).expect("read source manifest"); + let source_asset = manifest + .assets + .iter() + .find(|asset| asset.id == uploaded.id) + .expect("find source asset") + .clone(); + let revision = read_game_creator_agent_runtime_project_revision(root) + .expect("read source project revision") + .revision; + let request = DeriveLocalProjectResourceInput { + project_path: root.to_string_lossy().into_owned(), + expected_project_id: TEST_PROJECT_ID.to_string(), + expected_project_revision: revision, + operation_id: Uuid::new_v4().to_string(), + idempotency_key: Uuid::new_v4().to_string(), + edit_kind: LocalProjectResourceEditKind::BackgroundRemoval, + generation_mode: LocalProjectResourceGenerationMode::Derive, + source_resource_id: format!("local-asset:{}", source_asset.id), + source_asset_id: Some(source_asset.id.clone()), + source_path: Some(source_asset.local_path.clone()), + source_media_type: Some(source_asset.media_type.clone()), + source_subtype: Some(source_asset.kind.clone()), + producer_task_id: source_asset.source.task_id.clone(), + source_version_id: None, + prompt: "去除背景".to_string(), + asset_name: "透明角色".to_string(), + background_mode: Some("flat".to_string()), + screen_color: Some("auto".to_string()), + }; + let source = resolve_resource_edit_source(root, &manifest, &request) + .expect("resolve background removal source"); + let bearer_token = platform_session + .map(|session| session.access_token.as_str()) + .unwrap_or(TEST_API_KEY); + let access = ExternalEditorBindingAccess::new(base_url, bearer_token, platform_session) + .expect("create developer access"); + let principal = + external_editor_binding_principal(&access).expect("resolve developer principal"); + write_external_editor_project_binding_at( + root, + &new_external_editor_project_binding( + TEST_PROJECT_ID, + &principal, + REMOTE_PROJECT_ID, + REMOTE_FOLDER_ID, + unix_timestamp(), + ) + .expect("build project binding"), + ) + .expect("write project binding"); + let source_identity = new_external_editor_source_identity( + &source_asset.id, + &source.source_sha256, + &source.media_type, + &source.asset_kind, + ) + .expect("build source identity"); + write_external_editor_resource_binding_at( + root, + &new_external_editor_resource_binding( + TEST_PROJECT_ID, + &principal, + REMOTE_PROJECT_ID, + &source_identity, + Some(SOURCE_RESOURCE_ID), + "registered/source.png", + "registered-source-object", + Some(2), + Some(2), + unix_timestamp(), + ) + .expect("build source binding"), + ) + .expect("write source binding"); + BackgroundRemovalFixture { + directory, + request, + source_asset_id: source_asset.id, + source_bytes, + } +} + +async fn with_test_credentials( + base_url: &str, + operation: impl std::future::Future, +) -> T { + let _platform_session_guard = clear_test_platform_session(); + crate::assets::with_external_editor_api_credentials( + crate::assets::external_editor_api_credentials_for_test( + base_url.to_string(), + TEST_API_KEY.to_string(), + ), + operation, + ) + .await +} + +fn accept_request(listener: &TcpListener, index: usize) -> TcpStream { + listener + .set_nonblocking(true) + .expect("set background removal listener nonblocking"); + let deadline = std::time::Instant::now() + Duration::from_secs(5); + loop { + match listener.accept() { + Ok((stream, _)) => { + stream + .set_nonblocking(false) + .expect("restore background removal stream blocking mode"); + return stream; + } + Err(error) if error.kind() == std::io::ErrorKind::WouldBlock => { + assert!( + std::time::Instant::now() < deadline, + "timed out waiting for background removal request {index}" + ); + std::thread::sleep(Duration::from_millis(5)); + } + Err(error) => panic!("accept background removal request {index}: {error}"), + } + } +} + +fn read_request(stream: &mut TcpStream) -> String { + stream + .set_read_timeout(Some(Duration::from_secs(2))) + .expect("set request read timeout"); + let mut bytes = Vec::new(); + let mut buffer = [0_u8; 4096]; + let (header_end, content_length) = loop { + let read = stream.read(&mut buffer).expect("read HTTP request"); + assert!(read > 0, "request closed before headers"); + bytes.extend_from_slice(&buffer[..read]); + let Some(header_end) = bytes.windows(4).position(|part| part == b"\r\n\r\n") else { + continue; + }; + let headers = String::from_utf8_lossy(&bytes[..header_end]); + let content_length = headers + .lines() + .find_map(|line| { + let (name, value) = line.split_once(':')?; + name.eq_ignore_ascii_case("content-length") + .then(|| value.trim().parse::().ok()) + .flatten() + }) + .unwrap_or(0); + break (header_end + 4, content_length); + }; + while bytes.len() < header_end + content_length { + let read = stream.read(&mut buffer).expect("read HTTP request body"); + assert!(read > 0, "request closed before body"); + bytes.extend_from_slice(&buffer[..read]); + } + String::from_utf8_lossy(&bytes).into_owned() +} + +fn write_json(stream: &mut TcpStream, status: &str, value: serde_json::Value) { + let body = value.to_string(); + write!( + stream, + "HTTP/1.1 {status}\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{body}", + body.len() + ) + .expect("write JSON response"); +} + +fn write_bytes(stream: &mut TcpStream, media_type: &str, bytes: &[u8]) { + write!( + stream, + "HTTP/1.1 200 OK\r\nContent-Type: {media_type}\r\nContent-Length: {}\r\nConnection: close\r\n\r\n", + bytes.len() + ) + .expect("write media headers"); + stream.write_all(bytes).expect("write media body"); +} + +fn completed_status(operation_id: &str) -> serde_json::Value { + serde_json::json!({"data": { + "operationId": operation_id, + "status": "completed", + "result": {"resource": { + "resourceId": "editor-resource-background-removal-result", + "projectId": REMOTE_PROJECT_ID, + "objectKey": "generated/background-removal.png", + "assetObjectId": "background-removal-result-object" + }} + }}) +} + +fn assert_submission(request: &str) { + assert!( + request.starts_with("POST /api/editor/images/background-removals ") + || request.starts_with("POST /api/external/v1/editor/images/background-removals ") + ); + let lower = request.to_ascii_lowercase(); + assert!(lower.contains("idempotency-key:")); + let body = request.split("\r\n\r\n").nth(1).expect("submission body"); + let payload: serde_json::Value = serde_json::from_str(body).expect("parse submission body"); + assert_eq!(payload["sourceImageSrc"], SOURCE_RESOURCE_ID); + assert_eq!(payload["sourceResourceId"], SOURCE_RESOURCE_ID); + assert_eq!(payload["projectId"], REMOTE_PROJECT_ID); + assert_eq!(payload["assetFolderId"], REMOTE_FOLDER_ID); + assert_eq!(payload["backgroundMode"], "flat"); + assert_eq!(payload["screenColor"], "auto"); +} + +fn assert_developer_submission(request: &str) { + assert!(request.starts_with("POST /api/external/v1/editor/images/background-removals ")); + assert!(request + .to_ascii_lowercase() + .contains("authorization: bearer background-removal-key")); + assert_submission(request); +} + +fn respond_canvas_context_request(stream: &mut TcpStream, request: &str) -> bool { + let line = request.lines().next().unwrap_or_default(); + if line.starts_with("GET /api/external/v1/editor/projects ") + || line.starts_with("GET /api/editor/projects ") + { + write_json( + stream, + "200 OK", + serde_json::json!({"data": {"projects": [{"projectId": REMOTE_PROJECT_ID}]}}), + ); + true + } else if line.starts_with("GET /api/external/v1/editor/assets/library ") + || line.starts_with("GET /api/editor/assets/library ") + { + write_json( + stream, + "200 OK", + serde_json::json!({"data": {"library": {"folders": [{"folderId": REMOTE_FOLDER_ID}]}}}), + ); + true + } else { + false + } +} + +#[tokio::test] +async fn background_removal_derives_through_poll_download_and_manifest_commit() { + let listener = TcpListener::bind("127.0.0.1:0").expect("bind background removal server"); + let base_url = format!("http://{}", listener.local_addr().expect("server address")); + let fixture = background_removal_fixture(&base_url); + let generated_png = test_png(); + let signed_url = format!("{base_url}/generated.png"); + let server_png = generated_png.clone(); + let server_signed_url = signed_url.clone(); + let requests = Arc::new(Mutex::new(Vec::new())); + let server_requests = Arc::clone(&requests); + let server = std::thread::spawn(move || { + for index in 0..8 { + let mut stream = accept_request(&listener, index); + let request = read_request(&mut stream); + server_requests + .lock() + .expect("capture requests") + .push(request.clone()); + let line = request.lines().next().unwrap_or_default(); + if respond_canvas_context_request(&mut stream, &request) { + continue; + } + match index { + 2 => { + assert_developer_submission(&request); + write_json( + &mut stream, + "202 Accepted", + serde_json::json!({"data": { + "operationId": "background-removal-operation", + "status": "queued", + "pollAfterMs": 0 + }}), + ); + } + 3 => write_json( + &mut stream, + "200 OK", + serde_json::json!({"data": { + "operationId": "background-removal-operation", "status": "queued", "pollAfterMs": 0 + }}), + ), + 4 => write_json( + &mut stream, + "200 OK", + serde_json::json!({"data": { + "operationId": "background-removal-operation", "status": "running", "pollAfterMs": 0 + }}), + ), + 5 => write_json( + &mut stream, + "200 OK", + completed_status("background-removal-operation"), + ), + 6 => { + assert!(line.starts_with("GET /api/external/v1/assets/read-url?")); + write_json( + &mut stream, + "200 OK", + serde_json::json!({"data": {"read": { + "signedUrl": server_signed_url + }}}), + ); + } + 7 => { + assert!(line.starts_with("GET /generated.png ")); + write_bytes(&mut stream, "image/png", &server_png); + } + _ => unreachable!(), + } + } + }); + + let result = with_test_credentials( + &base_url, + derive_local_project_resource_at(fixture.request.clone()), + ) + .await + .expect("complete background removal"); + server + .join() + .expect("join complete background removal server"); + let captured = requests.lock().expect("read captured requests"); + assert_eq!(captured.len(), 8); + assert_eq!( + captured + .iter() + .filter(|request| request.starts_with("POST ")) + .count(), + 1 + ); + let derived = result.asset.expect("derived background removal asset"); + assert_ne!(derived.id, fixture.source_asset_id); + assert_eq!( + fs::read(fixture.root().join(&derived.local_path)).expect("read result"), + generated_png + ); + assert_eq!( + fs::read( + fixture.root().join( + result + .manifest + .assets + .iter() + .find(|asset| asset.id == fixture.source_asset_id) + .expect("source preserved") + .local_path + .clone() + ) + ) + .expect("read source"), + fixture.source_bytes + ); + let ledger = read_resource_edit_ledger(fixture.root(), &fixture.request.operation_id) + .expect("read ledger") + .expect("ledger exists"); + assert_eq!(ledger.phase, ResourceEditLedgerPhase::Committed); + assert_eq!( + ledger.remote_canvas_project_id.as_deref(), + Some(REMOTE_PROJECT_ID) + ); +} + +#[tokio::test] +async fn background_removal_resumes_accepted_operation_without_reposting() { + let listener = TcpListener::bind("127.0.0.1:0").expect("bind resume server"); + let base_url = format!("http://{}", listener.local_addr().expect("server address")); + let fixture = background_removal_fixture(&base_url); + let generated_png = test_png(); + let signed_url = format!("{base_url}/resumed.png"); + let captured = Arc::new(Mutex::new(Vec::new())); + let server_captured = Arc::clone(&captured); + let server_png = generated_png.clone(); + let server = std::thread::spawn(move || { + for index in 0..7 { + let mut stream = accept_request(&listener, index); + let request = read_request(&mut stream); + server_captured + .lock() + .expect("capture resume requests") + .push(request.clone()); + let line = request.lines().next().unwrap_or_default(); + if respond_canvas_context_request(&mut stream, &request) { + continue; + } + match index { + 2 => { + assert_developer_submission(&request); + write_json( + &mut stream, + "202 Accepted", + serde_json::json!({"data": { + "operationId": "resume-background-removal", "status": "queued", "pollAfterMs": 0 + }}), + ); + } + 3 => write_json( + &mut stream, + "500 Internal Server Error", + serde_json::json!({"error": "interrupted"}), + ), + 4 => write_json( + &mut stream, + "200 OK", + completed_status("resume-background-removal"), + ), + 5 => { + assert!(line.starts_with("GET /api/external/v1/assets/read-url?")); + write_json( + &mut stream, + "200 OK", + serde_json::json!({"data": {"read": {"signedUrl": signed_url}}}), + ); + } + 6 => { + assert!(line.starts_with("GET /resumed.png ")); + write_bytes(&mut stream, "image/png", &server_png); + } + _ => unreachable!(), + } + } + }); + + let first_error = with_test_credentials( + &base_url, + derive_local_project_resource_at(fixture.request.clone()), + ) + .await + .expect_err("first polling attempt is interrupted"); + assert!(first_error.contains("result-unknown")); + let accepted = read_resource_edit_ledger(fixture.root(), &fixture.request.operation_id) + .expect("read accepted ledger") + .expect("accepted ledger exists"); + assert_eq!(accepted.phase, ResourceEditLedgerPhase::Accepted); + assert_eq!( + accepted.remote_operation_id.as_deref(), + Some("resume-background-removal") + ); + let pending = list_pending_local_project_resource_edits_for_session_at( + ListPendingLocalProjectResourceEditsInput { + project_path: fixture.root().to_string_lossy().into_owned(), + expected_project_id: TEST_PROJECT_ID.to_string(), + }, + None, + ) + .expect("list developer pending operations"); + assert_eq!(pending.len(), 1); + assert_eq!(pending[0].operation_id, fixture.request.operation_id); + assert_eq!(pending[0].background_mode.as_deref(), Some("flat")); + assert_eq!(pending[0].screen_color.as_deref(), Some("auto")); + let result = with_test_credentials( + &base_url, + resume_local_project_resource_edit_at(ResumeLocalProjectResourceEditInput { + project_path: fixture.root().to_string_lossy().into_owned(), + expected_project_id: TEST_PROJECT_ID.to_string(), + operation_id: fixture.request.operation_id.clone(), + }), + ) + .await + .expect("resume accepted background removal"); + server.join().expect("join resume server"); + let captured = captured.lock().expect("read resume requests"); + assert_eq!( + captured + .iter() + .filter(|request| request.starts_with("POST ")) + .count(), + 1 + ); + assert_eq!(result.manifest.assets.len(), 2); + assert!(list_pending_local_project_resource_edits_for_session_at( + ListPendingLocalProjectResourceEditsInput { + project_path: fixture.root().to_string_lossy().into_owned(), + expected_project_id: TEST_PROJECT_ID.to_string(), + }, + None, + ) + .expect("list pending after resume") + .is_empty()); + assert_eq!( + fs::read( + fixture + .root() + .join(result.asset.expect("resumed asset").local_path) + ) + .expect("read resumed result"), + generated_png + ); +} + +#[tokio::test] +async fn background_removal_remote_failure_keeps_manifest_without_result() { + let listener = TcpListener::bind("127.0.0.1:0").expect("bind failure server"); + let base_url = format!("http://{}", listener.local_addr().expect("server address")); + let fixture = background_removal_fixture(&base_url); + let server = std::thread::spawn(move || { + for index in 0..4 { + let mut stream = accept_request(&listener, index); + let request = read_request(&mut stream); + if respond_canvas_context_request(&mut stream, &request) { + continue; + } + if index == 2 { + assert_developer_submission(&request); + write_json( + &mut stream, + "202 Accepted", + serde_json::json!({"data": { + "operationId": "failed-background-removal", "status": "queued", "pollAfterMs": 0 + }}), + ); + } else { + assert!(request + .starts_with("GET /api/external/v1/generations/failed-background-removal ")); + write_json( + &mut stream, + "200 OK", + serde_json::json!({"data": { + "operationId": "failed-background-removal", "status": "failed" + }}), + ); + } + } + }); + + let error = with_test_credentials( + &base_url, + derive_local_project_resource_at(fixture.request.clone()), + ) + .await + .expect_err("remote failure must be returned"); + server.join().expect("join failure server"); + assert!(error.contains("remote-terminal-failed")); + let manifest = + read_existing_manifest_for_project(fixture.root()).expect("read unchanged manifest"); + assert_eq!(manifest.assets.len(), 1); + assert_eq!(manifest.assets[0].id, fixture.source_asset_id); + let ledger = read_resource_edit_ledger(fixture.root(), &fixture.request.operation_id) + .expect("read failed ledger") + .expect("failed ledger exists"); + assert_eq!(ledger.phase, ResourceEditLedgerPhase::RemoteFailed); + assert!(ledger.result_asset_id.is_none()); + assert!( + read_optional_resource_edit_staging(fixture.root(), &fixture.request.operation_id) + .expect("read absent staging") + .is_none() + ); +} diff --git a/apps/ai-game-creator-shell/src/view/project-development/index.tsx b/apps/ai-game-creator-shell/src/view/project-development/index.tsx index 1bd650976..184007760 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/index.tsx +++ b/apps/ai-game-creator-shell/src/view/project-development/index.tsx @@ -44,6 +44,7 @@ import { Replace, RotateCcw, Search, + Shapes, SlidersHorizontal, Sparkles, Trash2, @@ -427,6 +428,8 @@ type PendingLocalProjectResourceEdit = { editKind: string; sourceResourceId: string; assetName: string; + backgroundMode?: string | null; + screenColor?: string | null; phase: string; createdAt: number; }; @@ -467,8 +470,20 @@ type ResourceEditServiceIdentityConfirmation = { expiresAt: number; }; -function pendingResourceEditKindLabel(editKind: string) { +function pendingResourceEditKindLabel({ + editKind, + backgroundMode, + screenColor, +}: PendingLocalProjectResourceEdit) { if (editKind === 'image') return '图片编辑'; + if (editKind === 'background-removal') { + if (backgroundMode === 'complex') return '图片抠图 · 复杂背景'; + if (backgroundMode === 'flat') { + const color = screenColor === 'auto' ? '自动背景色' : screenColor; + return `图片抠图 · 平面背景${color ? ` · ${color}` : ''}`; + } + return '图片抠图'; + } if (editKind === 'text') return '文本编辑'; if (editKind === 'agent-result') return '智能体结果编辑'; return '资源编辑'; @@ -9268,7 +9283,7 @@ export default function ProjectDevelopmentView({
{pending.assetName} - {pendingResourceEditKindLabel(pending.editKind)} ·{' '} + {pendingResourceEditKindLabel(pending)} ·{' '} {pendingResourceEditCreatedAtLabel(pending.createdAt)} diff --git a/apps/ai-game-creator-shell/tests/appSurface/home.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/home.suite.ts index a31d69f89..475242de0 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/home.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/home.suite.ts @@ -411,9 +411,7 @@ export function registerClientHomeTests() { await openResourceBookCategory('UI 交互'); expect(await findResourceSelectButton('live-hero.png')).not.toBeNull(); await openResourceBookCategory('项目版本'); - expect( - await findResourceSelectButton('版本 1'), - ).not.toBeNull(); + expect(await findResourceSelectButton('版本 1')).not.toBeNull(); expect(runButton.getAttribute('data-unavailable')).toBeNull(); await waitFor(() => { expect(invoke).toHaveBeenCalledWith( @@ -582,9 +580,7 @@ export function registerClientHomeTests() { }), ).not.toBeNull(); await openResourceBookCategory('项目版本'); - expect( - await findResourceSelectButton('版本 1'), - ).not.toBeNull(); + expect(await findResourceSelectButton('版本 1')).not.toBeNull(); expect(runButton.getAttribute('data-unavailable')).toBeNull(); await waitFor(() => { expect( diff --git a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts index ae09f6798..18bda4813 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts @@ -3836,7 +3836,9 @@ export function registerProjectWorkbenchFoundationTests() { ]; await openResourceBookCategory('角色与对象'); - const infoButton = await screen.findByRole('button', { name: '查看hero.png资源信息' }); + const infoButton = await screen.findByRole('button', { + name: '查看hero.png资源信息', + }); expect(infoButton.getAttribute('aria-pressed')).toBe('false'); // 未选中的卡片直接打开信息,不被选中变化 effect 立即关闭。 @@ -4096,13 +4098,7 @@ export function registerProjectWorkbenchFoundationTests() { within(audioToolbar) .getAllByRole('button') .map((button) => button.getAttribute('aria-label')), - ).toEqual([ - '引用资源 bgm.mp3', - '编辑标签', - '重命名', - '导出', - '删除素材', - ]); + ).toEqual(['引用资源 bgm.mp3', '编辑标签', '重命名', '导出', '删除素材']); // 工具条的「导出」必须真的走通落盘链路:原生保存对话框 + Rust 分块复制, // 而不是只渲染一个按钮。原生对话框由入口文件 mock 成"用户选了 diff --git a/apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx b/apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx index f7acdba4e..043918975 100644 --- a/apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx +++ b/apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx @@ -51,9 +51,11 @@ describe('useDirectActiveTurns', () => { }); it('clears to a stable empty snapshot when the hook is disabled', async () => { - const invoke = vi.fn( - async () => [] as GameCreatorDirectActiveTurn[], - ) as never; + let resolveSnapshot!: (turns: GameCreatorDirectActiveTurn[]) => void; + const snapshot = new Promise((resolve) => { + resolveSnapshot = resolve; + }); + const invoke = vi.fn(() => snapshot) as never; const { result, rerender } = renderHook( ({ enabled }: { enabled: boolean }) => useDirectActiveTurns({ invoke, enabled, pollIntervalMs: 60_000 }), @@ -62,7 +64,8 @@ describe('useDirectActiveTurns', () => { const emptySnapshot = result.current.activeTurns; await act(async () => { - await result.current.refreshActiveTurns(); + resolveSnapshot([]); + await snapshot; }); expect(result.current.activeTurns).toBe(emptySnapshot); rerender({ enabled: false }); diff --git a/apps/ai-game-creator-shell/tests/projectResourceLiveIntegration.test.tsx b/apps/ai-game-creator-shell/tests/projectResourceLiveIntegration.test.tsx index 4234d82b8..ef129cd12 100644 --- a/apps/ai-game-creator-shell/tests/projectResourceLiveIntegration.test.tsx +++ b/apps/ai-game-creator-shell/tests/projectResourceLiveIntegration.test.tsx @@ -109,6 +109,8 @@ type PendingResourceEditFixture = { editKind: string; sourceResourceId: string; assetName: string; + backgroundMode?: string | null; + screenColor?: string | null; phase: string; createdAt: number; }; @@ -1294,6 +1296,42 @@ describe('project resource live canvas integration', () => { }); }); + it('恢复面板显示同名抠图的模式和颜色,缺失字段不推断默认值', async () => { + installTauri({ + pendingResourceEdits: [ + { backgroundMode: 'complex' }, + { backgroundMode: 'flat', screenColor: 'auto' }, + { backgroundMode: 'flat', screenColor: '#AABBCC' }, + { backgroundMode: 'flat' }, + {}, + ].map((options, index) => ({ + operationId: `background-${index}`, + editKind: 'background-removal', + sourceResourceId: 'source-art', + assetName: '透明底', + phase: 'accepted', + createdAt: 1, + ...options, + })), + }); + render(); + fireEvent.click( + await screen.findByRole('button', { name: '管理未完成编辑 (5)' }), + ); + const labels = screen + .getAllByText('透明底') + .map((name) => name.nextElementSibling?.textContent); + expect( + labels.map((label) => label?.split(' · ').slice(0, -1).join(' · ')), + ).toEqual([ + '图片抠图 · 复杂背景', + '图片抠图 · 平面背景 · 自动背景色', + '图片抠图 · 平面背景 · #AABBCC', + '图片抠图 · 平面背景', + '图片抠图', + ]); + }); + it('恢复面板可跳过首条失败任务继续任意 operation,且对账项不会被重放', async () => { const failedOperationId = '11111111-1111-4111-8111-111111111111'; const resumableOperationId = '22222222-2222-4222-8222-222222222222'; @@ -2072,7 +2110,9 @@ describe('project resource live canvas integration', () => { await openResourceBookCategory('角色与对象'); fireEvent.click(await findResourceSelectButton('hero.png')); const toolbar = await screen.findByRole('toolbar', { name: '图片工具栏' }); - fireEvent.click(screen.getByRole('button', { name: '查看hero.png资源信息' })); + fireEvent.click( + screen.getByRole('button', { name: '查看hero.png资源信息' }), + ); const infoPanel = await screen.findByRole('dialog', { name: '资源信息' }); // 分类值本身仍是只读文本(`dd` 里只有值,入口按钮在它外面)。 diff --git a/apps/ai-game-creator-shell/tests/resourceVersionReplacement.test.tsx b/apps/ai-game-creator-shell/tests/resourceVersionReplacement.test.tsx index cfbc324f9..e8f2b5e4b 100644 --- a/apps/ai-game-creator-shell/tests/resourceVersionReplacement.test.tsx +++ b/apps/ai-game-creator-shell/tests/resourceVersionReplacement.test.tsx @@ -379,7 +379,10 @@ function toolbarAction(toolbar: HTMLElement, name: string) { const visible = within(toolbar).queryByRole('button', { name }); if (visible) return visible; fireEvent.mouseEnter(within(toolbar).getByRole('button', { name: '更多' })); - return within(screen.getByRole('group', { name: '更多操作' })).getByRole('button', { name }); + return within(screen.getByRole('group', { name: '更多操作' })).getByRole( + 'button', + { name }, + ); } async function selectCardAndOpenToolbar(label: string) { @@ -550,12 +553,20 @@ describe('版本级资源替换', () => { const toolbar = await selectCardAndOpenToolbar('legacy.png'); fireEvent.mouseEnter(within(toolbar).getByRole('button', { name: '更多' })); const menu = screen.getByRole('group', { name: '更多操作' }); - const viewport = () => document.querySelector('[data-resource-viewport]') - ?.getAttribute('data-resource-viewport'); + const viewport = () => + document + .querySelector('[data-resource-viewport]') + ?.getAttribute('data-resource-viewport'); const before = viewport(); expect(before).toBeTruthy(); - const wheel = new WheelEvent('wheel', { bubbles: true, cancelable: true, deltaY: 120 }); - act(() => { menu.dispatchEvent(wheel); }); + const wheel = new WheelEvent('wheel', { + bubbles: true, + cancelable: true, + deltaY: 120, + }); + act(() => { + menu.dispatchEvent(wheel); + }); expect(wheel.defaultPrevented).toBe(false); expect(viewport()).toBe(before); @@ -568,9 +579,15 @@ describe('版本级资源替换', () => { const scene = document.querySelector('.game-resource-book-scene')!; act(() => { - scene.dispatchEvent(new WheelEvent('wheel', { - bubbles: true, cancelable: true, deltaY: 120, clientX: 90, clientY: 70, - })); + scene.dispatchEvent( + new WheelEvent('wheel', { + bubbles: true, + cancelable: true, + deltaY: 120, + clientX: 90, + clientY: 70, + }), + ); }); expect(viewport()).not.toBe(before); }); @@ -578,13 +595,17 @@ describe('版本级资源替换', () => { it('信息从未选中卡打开并跟随资源身份,普通换选会关闭', async () => { renderReplacementWorkbench(); await selectCardAndOpenToolbar('legacy.png'); - const lateInfo = screen.getByRole('button', { name: '查看late.png资源信息' }); + const lateInfo = screen.getByRole('button', { + name: '查看late.png资源信息', + }); fireEvent.pointerDown(lateInfo, { button: 0 }); fireEvent.click(lateInfo); const panel = screen.getByRole('dialog', { name: '资源信息' }); expect(within(panel).getByText('late.png')).toBeTruthy(); expect(lateInfo.getAttribute('aria-pressed')).toBe('true'); - fireEvent.click(screen.getByRole('button', { name: '查看legacy.png资源信息' })); + fireEvent.click( + screen.getByRole('button', { name: '查看legacy.png资源信息' }), + ); const switched = screen.getByRole('dialog', { name: '资源信息' }); expect(within(switched).getByText('legacy.png')).toBeTruthy(); expect(within(switched).queryByText('late.png')).toBeNull(); @@ -597,10 +618,10 @@ describe('版本级资源替换', () => { // 未被初始版本绑定的素材(版本创建之后才登记):工具条照常出现,但没有「替换素材」。 const lateToolbar = await selectCardAndOpenToolbar('late.png'); - fireEvent.mouseEnter(within(lateToolbar).getByRole('button', { name: '更多' })); - expect( - screen.queryByRole('button', { name: '替换素材' }), - ).toBeNull(); + fireEvent.mouseEnter( + within(lateToolbar).getByRole('button', { name: '更多' }), + ); + expect(screen.queryByRole('button', { name: '替换素材' })).toBeNull(); expect( within(lateToolbar).getByRole('button', { name: '快速编辑' }), ).not.toBeNull(); @@ -614,9 +635,7 @@ describe('版本级资源替换', () => { // 被当前版本绑定的素材:入口出现。 const sourceToolbar = await selectCardAndOpenToolbar('legacy.png'); - expect( - toolbarAction(sourceToolbar, '替换素材'), - ).not.toBeNull(); + expect(toolbarAction(sourceToolbar, '替换素材')).not.toBeNull(); }); it('从入口一路走到写入:候选弹窗禁用硬门禁项、给出格式提示、直接替换且不产生新版本', async () => { @@ -895,9 +914,10 @@ describe('版本级资源替换', () => { const deleteButton = toolbarAction(toolbar, '删除素材'); const toolbarLabels = [ ...within(toolbar).getAllByRole('button'), - ...within(screen.getByRole('group', { name: '更多操作' })).getAllByRole('button'), - ] - .map((button) => button.getAttribute('aria-label') ?? ''); + ...within(screen.getByRole('group', { name: '更多操作' })).getAllByRole( + 'button', + ), + ].map((button) => button.getAttribute('aria-label') ?? ''); // 末位:在最后一个非破坏性动作(替换素材)之后、共享导出按钮之前。 expect(toolbarLabels.indexOf('删除素材')).toBeGreaterThan( toolbarLabels.indexOf('替换素材'), @@ -1411,9 +1431,7 @@ describe('版本级资源替换', () => { // 第一次:legacy → final。 const legacyToolbar = await selectCardAndOpenToolbar('legacy.png'); - fireEvent.click( - toolbarAction(legacyToolbar, '替换素材'), - ); + fireEvent.click(toolbarAction(legacyToolbar, '替换素材')); let dialog = await screen.findByRole('dialog', { name: '选择替换素材', }); @@ -1431,9 +1449,7 @@ describe('版本级资源替换', () => { // 第二次:final → final.webp(同一个工作台会话内)。 const finalToolbar = await selectCardAndOpenToolbar('final.png'); - fireEvent.click( - toolbarAction(finalToolbar, '替换素材'), - ); + fireEvent.click(toolbarAction(finalToolbar, '替换素材')); dialog = await screen.findByRole('dialog', { name: '选择替换素材' }); fireEvent.click( within(dialog).getByRole('option', { name: '选择替换素材final.webp' }), diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index 1b57435a0..0be34b555 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -2,6 +2,13 @@ > 用途:记录已经确认、会影响后续开发的长期技术/产品/协作决策。短期讨论不要写在这里。 > 当前口径:历史条目的旧路径、旧版本和已退役对象只用于追溯,不构成现行实现依据;如与当前代码或 `docs/README.md` 冲突,以当前代码和最新专题文档为准。 + +## 2026-09-17 AGC 抠图提交使用远端画布项目身份 + +- 背景:AGC 已通过本地项目 ID 建立并持久化本地项目到主站远端画布项目的绑定,但 `agc_remove_background` 提交请求仍把本地 `manifest.project_id` 放入 `projectId`;`assetFolderId` 已使用远端素材目录 ID。主站因此按项目不存在或不属于当前账号返回 404,主站抠图和 BgFilter 本身均正常。 +- 决策:抠图请求及工具回执统一使用 `prepare_external_canvas_generation_context` 返回的远端 `context.project_id`;本地 manifest 项目 ID 只用于绑定键和本地状态,不得作为主站业务请求的 `projectId`。 +- 验证:客户端定向 Rust 测试、格式、编码和 diff 检查通过;未修改主站路由或 BgFilter。 + ## 2026-09-17 图集切分模式改为显式声明 - 决策:`sliceMode` 在图标图集生成入口成为必填字段且不保留任何默认值。省略、`null` 或空字符串必须在引用解析、定价、入队和 provider / OSS 副作用之前返回 `400`(`field=sliceMode`);`grid` 必须同时提供 `gridX`/`gridY`,`connected-components` 不得携带网格尺寸,二者矛盾同样在副作用前失败关闭。 @@ -22,6 +29,7 @@ - 影响范围:`apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs`(上限与文案的唯一口径)、`agent/direct_tool_bridge.rs`(按 kind 判定与未登记源资源提示)、`agent/direct_tools_mcp.rs`(schema 与校验)、`resources/agc-skills/agc-client-projection/**` 与清单指纹(version `2026-08-26.18`)。**未改** `/api/external/v1` 契约与 OpenAPI、SpacetimeDB schema、前端 TS 侧 `resourceEditPromptMaxLength` 数字、客户端 UI 行为。 - 验证方式:新增 `tool_prompt_limits_agree_with_the_client_authority`(四个 kind 的 schema 上限、MCP 校验与客户端权威口径同数字,超限文案带真实上限)、`bridge_resource_prompt_limits_follow_the_client_authority`(工具桥侧同类门禁,含图片编辑的 32000 边界)、`edit_image_tool_reaches_the_platform_image_edit_route` 与 `background_music_tool_reaches_the_platform_audio_route`(MCP 工具层 → 真实工具桥 → 假平台,断言 `/api/editor/images/edits` 与 `/api/editor/audios/background-music/generations` 的路径、Bearer、Idempotency-Key、正文与派生资源落盘,图片编辑正文不得回填 assetKind)、`background_music_prompt_over_the_limit_is_rejected_before_any_bridge_call`(超限在桥请求之前失败)、`unregistered_source_reports_the_registration_follow_up_tools`;`agent::direct_tools_mcp` 22 passed、`agent::skill_pack` 4 passed、`agent::direct_tool_bridge` 17 passed(7 条本机既有失败见下)、`npm run agc:skill-pack:check` 与 `skill-pack:test` 通过。本机 `tempfile::tempdir()` 归属校验失败导致的既有用例(`project::resource_editor` 45 条、`agent::direct_tool_bridge` 7 条)在本轮改动前后**同为失败**(stash 基线复跑确认),与本次无关。 - 关联文档:[AI游戏创作智能体App实施计划](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md)、[踩坑记录](pitfalls.md)。 + ## 2026-09-17 资源画布支持引擎资源只读预览 - 背景:Cocos Creator 工程里已有的引擎资源(模型、动画、预制体、材质、图集、压缩纹理…)此前在发现层就止步:`.glb` / `.prefab` / `.anim` / `.texture` 等扩展名既不可登记,也不进资源画布,工程导入后画布上只看得到位图、音频与脚本。 @@ -8211,8 +8219,8 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在 ## 2026-08-24 AGC Direct 抠图语义工具 -- 决策:将 External v1 `/api/external/v1/editor/images/background-removals` 通过 `agc_remove_background` 加入受控 `agc_tools`。工具只接受当前 manifest 的图片 `sourceLocalAssetId` 与结果名称;客户端负责正式 resourceId、画布/素材目录、稳定 operation/idempotency 身份、权限和错误脱敏,不向 Codex 暴露内部 BgFilter worker、凭据或任意 API。 -- 约束:异步结果只投影有界队列状态,不允许模型自行构造源 URL 或在不确定提交后更换请求身份;External v1 负责 API Key、幂等接收与统一 operation 查询,客户端不得绕过该契约。 +- 决策:将抠图能力通过 `agc_remove_background` 加入受控 `agc_tools`。工具只接受当前 manifest 的图片 `sourceLocalAssetId` 与结果名称;普通登录态使用账号鉴权的 `/api/editor/images/background-removals`,ExternalDeveloper 模式使用 External v1 `/api/external/v1/editor/images/background-removals`。客户端负责正式 resourceId、画布/素材目录、稳定 operation/idempotency 身份、权限和错误脱敏,不向 Codex 暴露内部 BgFilter worker、凭据或任意 API。 +- 约束:异步结果与恢复语义以本文「2026-09-17 AGC 抠图接入本地资源编辑恢复闭环」决策为准。不允许模型自行构造源 URL 或在不确定提交后更换请求身份;两种路由都接收客户端稳定幂等身份,External v1 继续负责 API Key、幂等接收与统一 operation 查询,客户端不得绕过该契约。 ## 2026-08-24 资源详情动作、空态滚动与最终图多步恢复 @@ -8865,6 +8873,14 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在 - 验证:限速后 `Genarrative-Full-Build-And-Deploy` #289 / #290 SUCCESS;采样期 Jenkins 峰值 10.2~10.5 核、限流不足 2s(可忽略),runner 峰值 12.07 核且持续出现 throttling,整机回落到 2.6%~19.8%。 - 关联文档:[开发运维](../../【开发运维】本地开发验证与生产运维-2026-05-15.md)。 +## 2026-09-17 AGC 抠图接入本地资源编辑恢复闭环 + +- 背景:`agc_remove_background` 原先只提交 `/api/editor/images/background-removals` 并返回 `queued`,没有轮询远端任务、下载完成媒体或写入本地 manifest;BgFilter 已成功处理但 Agent 因此永远只能看到受理回执。 +- 决策:抠图作为 `LocalProjectResourceEditKind::BackgroundRemoval` 接入现有资源编辑账本,模式和背景色写入 operation 身份;提交后复用同一套轮询、结果下载、staging、manifest 提交和恢复逻辑。已有账本优先恢复,禁止在未知结果时换 operation/idempotency 重发。 +- 边界:主站异步队列、BgFilter 和 SpacetimeDB schema 不变;Agent 只获得本地完成资源和安全身份投影,不接触内部 worker 或凭据。 +- 恢复:已受理任务中断后按原 operation 续查;提交结果不确定时保留账本并人工对账。升级前无账本的 queued 回执不自动迁移或重发,已有远端成果通过正式素材导入恢复。 +- 展示:恢复面板按账本显示抠图模式,平面背景模式同时显示已记录的自动背景色或颜色值,缺失字段不推断默认值,帮助区分同名待处理任务。 + ## 2026-09-17 Jenkins 公网入口 jenkins.genarrative.world 复用 router 反向隧道口径 - 背景:Jenkins controller 实际与 Gitea 同机运行在 `genarrative-station`(`jenkins.service`,`--httpPort=8080 --prefix=/jenkins`,`JENKINS_HOME=/var/lib/jenkins`),此前只有内网入口 `http://192.168.35.82:8080/jenkins/`;`router.genarrative.world` 已有「dev Nginx → dev loopback → station 反向隧道」的成熟口径。 diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index d59e89037..2a440a3b8 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -1,5 +1,9 @@ # 踩坑与排障记录 +## AGC 空快照测试必须等待请求完成 + +`waitFor(() => expect(activeTurns).toEqual([]))` 在 Hook 初始状态就能成功,不能证明首次异步读取已经完成。引用稳定性回归应显式控制 Promise 完成,并同时检查首次空响应与禁用后的引用;快照签名初值必须与初始空数组一致。窗口同步测试应验证未变化状态不重复发布,不能依赖一次多余的空态更新。 + ## AGC Windows 开发态首次页面加载缓慢 Vite 默认监听应用根下的 Rust `src-tauri/target`,构建产物较多时会创建大量 Windows 文件监听器。AGC 配置通过 `server.watch.ignored: ['**/src-tauri/target/**']` 排除此目录,不关闭业务源码、CSS、共享组件监听或 HMR。排查时区分后端就绪、Vite 扫描和原生窗口首绘;监听目录回归不能代替实机首绘测量,验证入口见本地开发运维文档。 diff --git a/docs/technical/【技术方案】AGC抠图模式与背景色透传-2026-09-16.md b/docs/technical/【技术方案】AGC抠图模式与背景色透传-2026-09-16.md index a7e9525fd..f32fcffa6 100644 --- a/docs/technical/【技术方案】AGC抠图模式与背景色透传-2026-09-16.md +++ b/docs/technical/【技术方案】AGC抠图模式与背景色透传-2026-09-16.md @@ -61,10 +61,25 @@ OpenAPI 与客户端工具的对外说明只描述模式用途、参数约束和 } ``` -客户端保留旧参数调用;新字段不填时不改变旧调用语义。客户端不读取图片、不自动选色、不把 `auto` 改写为具体颜色,使用原有 Bearer 认证、幂等键和队列返回模型。 +客户端保留旧参数调用;新字段不填时不改变模式语义。客户端不自动选色、不把 `auto` 改写为具体颜色;源资源校验、认证、异步任务查询、结果下载和本地登记由客户端负责。 工具 schema、桥接参数校验和随包 `agc-client-projection` Skill/契约说明必须保持一致。模式与颜色属于请求意图,必须参与客户端幂等指纹;同一图片与名称的不同模式不能复用同一次请求。缺省 complex 且没有颜色时保留既有指纹。主站在默认值归一化之前计算 External 请求指纹,缺失的新字段不序列化,避免旧请求重放发生冲突。 +客户端提交前建立的本地项目绑定会返回主站远端 `projectId` 与 `assetFolderId`,抠图请求必须使用这两个远端身份;本地 manifest `projectId` 仅用于绑定和本地状态,不能直接提交给主站。 + +### 本地结果与恢复合同 + +`agc_remove_background` 复用本地资源编辑账本,类型为 `background-removal`。源图片保持不变,抠图结果作为新资源写入项目。模式和背景色随账本持久化并参与请求指纹,其它编辑类型的历史指纹保持不变。 + +1. 客户端建立源图片的正式资源绑定,在提交前保存 operation、幂等键和请求意图。普通登录态提交 `/api/editor/images/background-removals`,从 `data.queueState.operationId` 读取受理身份;开发者模式提交 External v1 对应路由,从 `data.operationId` 读取身份。 +2. 受理后持续查询账号路由 `/api/runtime/external-generation/jobs/{operationId}` 或 External v1 对应状态路由。`queued`、`running` 只描述远端返回状态;固定进度值、本地文件缺失或 pending 清单为空均不能证明 BgFilter 排队。 +3. 远端 completed 后按稳定资源身份换取有效下载 URL,校验结果为带 alpha 通道的有效 PNG,随后复用 staging、manifest 和 revision 提交。只在本地登记完成后向 Agent 返回 `completed`、`operationId`、`resource.localAssetId`、相对路径和安全告警,不暴露临时 URL 或凭据。 +4. 轮询中断、超时或下载失败保留已受理 operation;`agc_list_registered_assets.pendingOperations` 与客户端恢复面板可见。相同源资源、结果名称、模式和颜色的后续调用优先恢复同一任务,不再次提交。不同账号不能恢复原账号任务;切回原账号后按既有恢复规则续接。 +5. 远端 failed 明确失败;提交响应不确定且无法确认 operation 时进入人工对账状态,不自动换键重发。失败/未知均不得伪造透明图或自动切换本地抠图方式。 +6. 升级前仅返回 queued、没有本地账本的任务不自动迁移;已有远端结果须通过正式资源查询和导入恢复,不据旧回执重新发起付费请求。 + +本修复只扩展 AGC 客户端现有工作流,不修改主站队列、BgFilter 或 SpacetimeDB schema。验收覆盖账号与开发者两种响应封装、queued/running/completed、已受理中断恢复不重复 POST、远端失败不登记结果,以及既有资源编辑回归。 + ## 实施任务 ### 任务一:冻结 BgFilter 契约 @@ -93,6 +108,13 @@ OpenAPI 与客户端工具的对外说明只描述模式用途、参数约束和 ## 验收证据 +2026-09-17 客户端闭环验证: + +- `cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell project::resource_editor:: -- --test-threads=1` 通过。新增 HTTP fixture 覆盖开发者 queued/running/completed、账号 HTTP 200 queueState 与 `data.job`、换签下载、PNG alpha 校验、原图保留和新资源提交。 +- 已受理任务的首次轮询失败后,pending 保留模式与颜色;恢复只查询原 operation,整个流程只 POST 一次,成功后清除 pending。远端 failed 不新增结果资源。既有账号隔离、提交原子性和崩溃恢复用例通过。 +- `cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell agent::direct_tool_bridge::tests -- --test-threads=1`、AGC 类型检查、技能包校验、Rust 格式、编码、文档索引与 diff 检查通过。 +- 本轮未运行真实登录客户端 → 本地主站 → BgFilter 的端到端 smoke;当前本地后端已停止,自动化证据使用模拟 HTTP 服务。此前 BgFilter 成功日志只证明上游处理完成,不证明主站结果持久化或客户端导入成功。 + 2026-09-16 实测: - 主站 `cargo test -p api-server background_removal`:36 项通过,覆盖非法请求入队前拒绝、缺省 complex、队列参数保留、旧请求指纹、父侧内部 RPC 和 provider multipart。 diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index 77c5d8108..3c864437b 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -12,6 +12,9 @@ ## 资源画布交互与工作台状态同步 +- 未完成抠图的恢复项在现有类型行显示账本中的复杂/平面背景模式;平面模式显示已记录的自动背景色或颜色值,缺失模式/颜色不补默认值,恢复仍按原 operation 身份执行。 +- 活动回合初始空快照、首次成功读取的空结果及禁用后的空态保持同一数组引用;快照签名初值与空态重置值均为 `[]`。无原生 invoke 的窗口测试只期待首次状态发布,异步空结果测试显式控制请求完成,不以初始空数组作为请求已完成的证据。 + - 活动回合轮询的初始空快照与后续空结果保持同一引用;停用或切换读取器使旧请求失效,晚到快照不得恢复已停用的活动回合或覆盖新轮询结果。无原生读取器时窗口只发布一次空状态,不通过额外空数组触发重复发布。 - 工作台向窗口标题栏发布正在运行的项目时,输入未变化不得形成重复发布与清理的渲染循环;打开项目动作始终使用当前工作台处理逻辑,退出工作台后清除其标题栏状态。 - 资源子画布(含「所有资源」)保留空白处左键框选、资源卡左键选中/拖动、触摸板双指平移及捏合缩放;右键按住空白处或资源卡拖动时平移画布,不改变资源选择与布局。中键和空格抓手继续可用。总览保留既有左键平移,并支持右键平移。 @@ -167,7 +170,7 @@ npm 游戏的可预览产物固定为对应 package 目录下的 `dist/index.htm - 项目路径、projectId、当前 revision、源文件路径与媒体类型、operationId、Idempotency-Key、登录态、项目锁、付费提交、轮询恢复、下载校验与 manifest 事务全部由客户端持有。模型不能提交或覆盖这些字段。同一 Direct `clientTurnId + 规范语义参数` 生成稳定 UUID v4 身份;单回合同参重试复用原 operation,不同请求串行且最多四项。跨回合存在完全匹配的 pending 账本时优先恢复原 operation,不能换键重发。 - 资源查询同时投影未完成 operation 的安全状态。媒体工具成功只返回 operation、本地相对路径、资源类型、Canvas/resource/asset/task 身份、正式序列帧以及脱敏后的 `warnings / sliceWarnings`;错误继续使用统一脱敏边界。客户端资源账本持久化 completed 结果的两类告警,committed replay 不能把历史告警伪装成空集合。 - 角色动画、视频、音效和背景音乐在构造新的远端请求前统一准备当前项目同名画布与素材目录上下文,并在端点支持时携带 `projectId / assetFolderId / canvasCompletion`。角色动画 placeholder 使用源图片真实宽高,避免非方形角色进入画布时失真;正式 resource/asset 与序列帧继续直接复用 External 返回身份,不从首帧伪造重复资源。已有冻结 request body 或已受理 operation 保持不变,不因本次升级重建请求或重复扣费。 -- 抠图通过新增 `agc_remove_background` 语义工具开放:模型只提交当前 manifest 的图片 `sourceLocalAssetId` 与结果名称;客户端解析稳定 `resourceId`,准备同名画布/素材目录并生成稳定 operation/idempotency 身份,调用 External v1 `/api/external/v1/editor/images/background-removals` 后只返回有界队列状态。抠图服务仍由客户端和服务端负责源校验、BgFilter、素材登记与画布事务,Codex 不获得内部 worker、凭据或任意 API 调用权。 +- 抠图通过新增 `agc_remove_background` 语义工具开放:模型只提交当前 manifest 的图片 `sourceLocalAssetId` 与结果名称;客户端解析稳定 `resourceId`,准备同名画布/素材目录并生成稳定 operation/idempotency 身份。普通登录态使用账号鉴权的 `/api/editor/images/background-removals`,ExternalDeveloper 模式使用 External v1 `/api/external/v1/editor/images/background-removals`;客户端接收异步受理后轮询任务状态,下载完成媒体并登记到本地 manifest,未知结果保留同一 operation 供恢复。抠图服务仍由客户端和服务端负责源校验、BgFilter、素材登记与画布事务,Codex 不获得内部 worker、凭据或任意 API 调用权。 ## 2026-08-23 AGC 资源生成补齐(视频 / 动画 / 音效 / 背景音乐) diff --git a/server-rs/crates/api-server/src/editor_project.rs b/server-rs/crates/api-server/src/editor_project.rs index 5f92b841a..bc3f69744 100644 --- a/server-rs/crates/api-server/src/editor_project.rs +++ b/server-rs/crates/api-server/src/editor_project.rs @@ -6266,17 +6266,19 @@ pub(crate) async fn edit_editor_image_for_owner_with_source_snapshot( pub async fn remove_editor_image_background( State(state): State, + headers: HeaderMap, Extension(request_context): Extension, Extension(authenticated): Extension, Json(payload): Json, ) -> Result, AppError> { let caller = EditorGenerationCaller::from_authenticated(&authenticated); + let idempotency_key = optional_editor_idempotency_key(&headers)?; let queue_job = enqueue_editor_background_removal_for_owner( &state, &request_context, &caller, payload, - None, + idempotency_key, ) .await?; Ok(json_success_body( diff --git a/src/components/image-editor/ImageCanvasWorldView.test.tsx b/src/components/image-editor/ImageCanvasWorldView.test.tsx index bd03cd7ab..d4ffc48d5 100644 --- a/src/components/image-editor/ImageCanvasWorldView.test.tsx +++ b/src/components/image-editor/ImageCanvasWorldView.test.tsx @@ -825,8 +825,9 @@ describe('ImageCanvasWorldView', () => { expect( within(layerButton) .getByRole('button', { name: '查看角色主图图片信息' }) - .parentElement! - .style.getPropertyValue('--image-canvas-editor-inverse-scale'), + .parentElement!.style.getPropertyValue( + '--image-canvas-editor-inverse-scale', + ), ).toBe(inverseScale); expect( (