From d851aa83fff8bd3da8461d4594aba1c08fc8c8be Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Thu, 10 Sep 2026 15:02:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=20AGC=20=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E5=8F=B0=20V3=20=E7=9A=84=E5=AE=9E=E6=96=BD?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E6=9D=A1=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 2026-09-10 条目,写清版本绑定恒等化与撤回运行期资源观察侧车的边界(删 asset_usage 及其 16 条测试、绑定退回恒等映射) - 写清素材删除三分支语义、deleteReferencedVersions 入参、read_local_project_asset_references 只读命令,以及版本追加唯一例外的放行集合按写入前 manifest 求值 - 写清 agc_list_registered_assets 投影新增 category/tags 且不在投影层重新派生分类 - 写清 rename_local_project_asset 的语义(文件改名 + localPath 更新、id 不变)、校验、写失败回滚与 reconciliation-required 口径,以及"不改游戏源码引用"的已知边界 - 写清 @ 面板两个页签与 activeVersionId/versions 契约、polish_local_project_prompt 的入参与计费口径(不自建计费,走 server-rs 的 LLM 路由)、发送前提醒判据与本机偏好存储 - 记录本次全部门禁数字 --- ...【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index 28d0e9959..eb3b27d36 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -1301,3 +1301,12 @@ DirectProject 使用 `approvalPolicy=never`,避免每次原生调用再经过 - 回收判据与删除必须基于同一次读到的锁文件快照:payload 只解析一次,删除前重新核对字节,只有内容仍是判定时的内容才 unlink;文件已消失或被替换时重试 `create_new`,不把并发回收当成错误。 - 启动诊断日志改为 `StartupLogSlot`:优先用已经生效的配置目录(含 `--config-dir`),否则退到平台配置根(Windows APPDATA、macOS Application Support、其它平台 `XDG_CONFIG_HOME` / `~/.config`),成功后再切换到真实配置目录。`startup.*.failed` 与 `show_startup_error_dialog` 不再是死分支;日志路径未知时同样给出用户可见提示。Windows 启动失败恢复系统消息框并附诊断日志路径,其它平台写 stderr,同一进程只提示一次。 - 边界与验证:残留的 `agent-runner.lock` / `agent-runner.gui-owner.lock` 是 OS 独占句柄锁,进程退出即释放,文件本身不阻塞下次启动;真正阻塞启动的是仍有活进程持锁。验证覆盖 `project_lock_recovery` 11 条(死 PID、非法进程号、空锁宽限、PID 复用时间推断、PID 复用身份不一致、身份一致不抢锁、旧格式活持有者不抢锁、新鲜空锁不抢锁、存活未知保守回收、mtime 未知保守回收、并发替换或已消失时不删除)、`diagnostic_log` 7 条,以及真实二进制双实例:第二个实例写入 `startup.runner.owner-lock.failed` 并弹出可见提示。 + +## 2026-09-10 AGC 资源工作台 V3:资源记录口径收敛、删除新口径、引用页签与 AI 润色 + +- **版本绑定恒等化**:游戏版本“使用了哪些资源”的权威记录就是 `.agent/manifest.json` 的 `versions[].resourceBindings`;`slotId` 恒为 `asset:{assetId}`,`resourceId` 指向 manifest 资产 ID。运行期资源观察方案(代码注入 / Phaser wrapper / Vite 虚拟模块 / 脚手架哈希校验 / `.agent` 使用侧车)整体撤回并按四不写删除:`project/asset_usage.rs` 与其 16 条测试、`GAME_ITERATION_IDENTITY_BINDING_PREFIX`、`asset_is_bound_to_runtime_slot`、`remove_asset_usage_references` 全部移除,`game_iteration_resource_bindings` 退回纯恒等映射。 +- **素材删除新口径**:`delete_local_project_asset` 新增必填 `deleteReferencedVersions`,三分支语义(无引用直接删 / 有引用且 false 只删素材并保留悬空绑定 / true 连带删除引用版本)在**同一次 manifest 写入**内原子完成;新增只读命令 `read_local_project_asset_references` 供前端在确认弹窗里列出“被哪些版本使用”。版本数组“只允许追加”的唯一例外由 `mutate_manifest_at_allowing_version_removals` 承担——放行集合按**写入前的 manifest** 求值,其余既有版本仍须原样原序保留、新增只能追加,被放行版本不得出现在追加段(防止“删除后重排”绕过);其它写入路径继续传空集。 +- **Agent 资源检索投影**:`agc_list_registered_assets` 的投影在 `mediaType` 之后固定新增 `category` 与 `tags`,取值直接透出 manifest 已解析的分类(**不在投影层重新按 kind 派生**,否则会覆盖用户显式分类);不改 manifest 结构、不改对外 OpenAPI 或 SpacetimeDB schema。 +- **素材重命名**:新增 `rename_local_project_asset`(`project/asset_rename.rs`)。语义是**磁盘文件改名 + manifest `localPath` 更新、资产 `id` 不变**(manifest 没有 `name` 字段,显示名来自 `fileName(localPath)`)。校验覆盖新名非空、不含路径分隔符与 `..`、不跨目录、扩展名必须一致、目标不得已存在、原文件必须是真实普通文件;持项目写锁按“读 manifest → 磁盘改名 → 更新 `localPath` → 写 manifest → 推进 revision”执行,**写失败把文件改回原名**,回滚也失败时两个错误都报出并标记 `reconciliation-required`;同名重命名是空操作。已知边界:**不改游戏源码里对旧 `assets/` 的引用**,不做引用扫描与自动替换。 +- **聊天引用与润色**:`ResourceReferenceInput` 新增 `activeVersionId?: string | null` 与 `versions?: GameIterationVersion[]` 两个可选 prop;`@` 面板两个页签(当前版本素材 / 全部画布素材)各自持有独立 `{query, filter, selectedResourceIds}`。版本解析口径 `resolveActiveIterationVersion` / `currentIterationVersionAssets`:传 `null` 回退 manifest 最新的版本,悬空绑定自然丢弃,空版本或空绑定显示空态而不报错。新增 `polish_local_project_prompt(prompt, context)`(提示词 `src-tauri/prompts/local-project-prompt-polish.md`),复用与 `suggest_automatic_project_name` 同一条短文本通道:`codex_app_server` 模式走 home direct codex,其余走 `LlmClient` 单轮请求;入参有界(4 000 / 1 000 字符)、输出 2 048 token 有界、空回复一律判失败以保留原文。**计费不自建**:泥点扣费仍在 `server-rs` 的 `/api/llm/chat/completions` 与 `/api/llm/responses` 路由(`prepare_llm_router_billing` / `settle_llm_router_usage`),本次 server-rs 零改动。发送前提醒是 portal 独立弹窗,判据为“提醒未关闭 + 本轮未确认 + 纯文本 trim 后 ≥ 40 字符 + 不以 `/` 开头”,“不再提醒”偏好存本机 `localStorage`,不进 manifest 与后端。 +- **验证**:AGC 前端全量 1075 passed / 4 skipped / 0 failed;共享美术画布组件 1372 passed;`cargo check --all-targets` 通过;定向 Rust 用例 `asset_delete` 7、`manifest::` 30、`assets::tests` 22、`asset_rename` 9、`local_project_prompt_polish` 4、`bridge_registered_resource` / `bridge_art_resource` 3 全绿;`npm run check:encoding` 与 `git diff --check` 干净。