合并 master:运行页入口收口并入 DirectProject 重构
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
- 保留 master 的 DirectProject / ProjectChat 重构与测试重组:原 appSurface 的 project-commands / project-preview / supervisor-runtime 三个 suite 已被 master 删除,接受删除并把相关断言重写到 tests/previewActivation.test.tsx 等新用例 - 本分支改动重放到 master 结构:运行与预览成功的反馈改走 onRunNotice toast(带 tone),对话区不再写过程提示 - 运行页顶栏统一:预览地址改成「在浏览器打开」按钮,版本入口搬进同一动作区复用同一套按钮皮,状态行与预览地址小字退役 - 生成任务入口、面板与锚点不在运行页渲染,placement 里的 run 档一并删除 - 手工合并 App.tsx / WorkspaceLauncher.tsx / model.ts / check-config.mjs / decision-log / pitfalls,并把两条决策记录与一条排障记录补进 master 版本文档
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
# 【实施计划】AGC 渠道安装身份隔离
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】AGC渠道安装身份隔离-2026-09-21.md` |
|
||||
| Status | ready |
|
||||
| Owner | 当前 Agent |
|
||||
|
||||
## 修改边界
|
||||
|
||||
- 允许修改:
|
||||
- `apps/ai-game-creator-shell/scripts/channel-identity.mjs`(新增,渠道身份单点定义)
|
||||
- `apps/ai-game-creator-shell/scripts/build-release.mjs`、`build-macos-ci.mjs`、`check-config.mjs`、`agent-swarm-test-chat.mjs`
|
||||
- `apps/ai-game-creator-shell/src-tauri/src/main.rs`、`src-tauri/src/windows.rs`、`src-tauri/src/config.rs`
|
||||
- 对应测试:`build-release.test.mjs`、`prepare-macos-codex.test.mjs`
|
||||
- 文档:AGC 更新主规范、共享记忆与本计划对
|
||||
- 明确不修改:OSS 分区布局、官网下载接口与页面、Jenkins Job 参数、渠道版本发行逻辑、Apple 签名/公证、移动壳。
|
||||
|
||||
## 实现顺序
|
||||
|
||||
1. 抽出 `channel-identity.mjs`:渠道校验、渠道显示名、`resolveChannelInstallIdentity()`;`build-release.mjs` 复用并再导出渠道校验。
|
||||
2. 渠道 `--config` 同时注入 `productName` 与 `identifier`;macOS 发布入口按发布渠道解析产品名(`.app`、updater 归档、DMG 卷名与文件名)。
|
||||
3. Rust:主窗口/工作区/启动器窗口标题取构建期产品名;AGC 自有 AppData 目录的 ACL managed 识别覆盖 `<基线>` 与 `<基线>.<渠道>`。
|
||||
4. 门禁与测试:`check-config.mjs` 断言基线等于默认渠道身份、非默认渠道身份隔离;`build-release.test.mjs` 增补身份与首装包用例;`prepare-macos-codex.test.mjs` 改断言为消费渠道身份。
|
||||
5. 文档:更新 AGC 更新主规范与共享记忆,登记决策与踩坑。
|
||||
|
||||
## 验证命令
|
||||
|
||||
1. `node --check apps/ai-game-creator-shell/scripts/channel-identity.mjs apps/ai-game-creator-shell/scripts/build-release.mjs apps/ai-game-creator-shell/scripts/build-macos-ci.mjs apps/ai-game-creator-shell/scripts/check-config.mjs`
|
||||
2. `node --test apps/ai-game-creator-shell/scripts/build-release.test.mjs apps/ai-game-creator-shell/scripts/release-oss.test.mjs apps/ai-game-creator-shell/scripts/prepare-macos-codex.test.mjs apps/ai-game-creator-shell/scripts/cargo-features.test.mjs`
|
||||
3. `node apps/ai-game-creator-shell/scripts/check-config.mjs`
|
||||
4. `cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell -- config::tests:: --test-threads=1`
|
||||
5. `npm run check:encoding`、`npm run check:doc-index`、`git diff --check`
|
||||
|
||||
## 验证结果
|
||||
|
||||
- `node --test build-release.test.mjs release-oss.test.mjs prepare-macos-codex.test.mjs cargo-features.test.mjs`:64/64 通过(新增渠道身份、身份注入与渠道 DMG 首装选择三条用例)。
|
||||
- `node apps/ai-game-creator-shell/scripts/check-config.mjs`、`npm --prefix apps/ai-game-creator-shell run typecheck`:通过。
|
||||
- `cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell -- config::private_path_elevation_policy_tests`:12/12 通过。
|
||||
- `AGC_UPDATE_CHANNEL=release npm --prefix apps/ai-game-creator-shell run build -- --no-bundle --debug`:Tauri 接受派生的 `productName` / `identifier` 并完成构建;产物字符串实测 `陶泥儿 Release` × 1、`agc/release-win/latest.json` × 1、`world.genarrative.ai-game-creator.release` × 1、`agc/dev-win/latest.json` × 0。
|
||||
- `cargo fmt --check`(AGC 壳)、`npm run check:encoding`、`npm run check:doc-index`、`git diff --check`:通过。
|
||||
- 未执行:真实渠道打包(需要签名私钥与发号/上传授权)、双渠道真机安装与并存、macOS 节点实跑。
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- 风险:默认渠道身份若被改动,既有安装目录、卸载项与升级链会断。回滚点:基线 `tauri.conf.json` 与默认渠道映射不变,门禁用例钉住。
|
||||
- 风险:非默认渠道首次以新身份安装,老 `dev` 用户不会自动迁移本地数据。回滚点:渠道身份只影响非默认渠道构建,撤销该渠道的构建产物即可,仓库侧无数据迁移。
|
||||
- 风险:窗口标题改为构建期产品名后,标题不再等于配置里的字面量。回滚点:去掉 `main.rs` 的标题覆盖调用,行为回到配置标题。
|
||||
- 风险:ACL managed 识别放宽到前缀族。回滚点:`is_game_creator_packaged_app_data_leaf` 收紧回单一直线值,但非默认渠道的提权修复会重新失败关闭。
|
||||
@@ -26,15 +26,15 @@
|
||||
|
||||
## 问题状态
|
||||
|
||||
| 编号 | 问题 | 状态与证据 |
|
||||
| --- | --- | --- |
|
||||
| B01 | 刷新后首次进入画布元素抖动 | 已优化;用户在本轮反馈未再复现,按用户要求更新状态。不宣称所有布局/动画原因均已排除。 |
|
||||
| B02 | 初次进入双指平移无效,整理后恢复 | 已优化;用户在本轮反馈未再复现,按用户要求更新状态。隔离组件连续平移通过。 |
|
||||
| B03 | 快速平移触发更新深度错误 | 已修复已确认的窗口 Context 反馈循环,回归验证收敛;真实操作继续观察。 |
|
||||
| B04 | 资源选中后运行不可用提示消失 | 已修复,提示与选择解耦,自动化验证通过。 |
|
||||
| B05 | 对话记录偶发丢失 | 已定位历史分页卡点,尚未修改。只读复验用户提供的历史:558 条合法原始记录中有 44 条聊天消息;首屏原始 20 条只投影出一条助手消息,下一页原始 20 条没有聊天消息,按消息计算的游标不推进。已存用户提问和最终回答因此无法继续翻出;不能凭该文件排除其它未落盘记录。 |
|
||||
| B06 | JSON 文档未正确识别展示 | 已按用户确认完成本地修复:合法 UI State 由原生完整校验,卡片显示 UI 设计并进入现有编辑器;普通 JSON 显示 JSON 并可代码预览。自动化验证通过,待重建原生客户端验收;详见 JSON 语义识别实施计划。 |
|
||||
| C01 | 右键平移,保留左键框选 | 已实现,卡片左键拖动、框选、指针取消/失焦/捕获丢失及控件边界测试通过。 |
|
||||
| 编号 | 问题 | 状态与证据 |
|
||||
| ---- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| B01 | 刷新后首次进入画布元素抖动 | 已优化;用户在本轮反馈未再复现,按用户要求更新状态。不宣称所有布局/动画原因均已排除。 |
|
||||
| B02 | 初次进入双指平移无效,整理后恢复 | 已优化;用户在本轮反馈未再复现,按用户要求更新状态。隔离组件连续平移通过。 |
|
||||
| B03 | 快速平移触发更新深度错误 | 已修复已确认的窗口 Context 反馈循环,回归验证收敛;真实操作继续观察。 |
|
||||
| B04 | 资源选中后运行不可用提示消失 | 已修复,提示与选择解耦,自动化验证通过。 |
|
||||
| B05 | 对话记录偶发丢失 | 已定位历史分页卡点,尚未修改。只读复验用户提供的历史:558 条合法原始记录中有 44 条聊天消息;首屏原始 20 条只投影出一条助手消息,下一页原始 20 条没有聊天消息,按消息计算的游标不推进。已存用户提问和最终回答因此无法继续翻出;不能凭该文件排除其它未落盘记录。 |
|
||||
| B06 | JSON 文档未正确识别展示 | 已按用户确认完成本地修复:合法 UI State 由原生完整校验,卡片显示 UI 设计并进入现有编辑器;普通 JSON 显示 JSON 并可代码预览。自动化验证通过,待重建原生客户端验收;详见 JSON 语义识别实施计划。 |
|
||||
| C01 | 右键平移,保留左键框选 | 已实现,卡片左键拖动、框选、指针取消/失焦/捕获丢失及控件边界测试通过。 |
|
||||
|
||||
## 已取得证据与剩余门禁
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
# 【实施计划】DirectProject Skill 提及输入提示
|
||||
|
||||
| 字段 | 值 |
|
||||
| --------- | ----------------------------------------------------------------------------------- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】DirectProject Skill提及输入提示-2026-09-15.md` |
|
||||
| Status | in-progress |
|
||||
| Owner | Codex |
|
||||
|
||||
## 代码边界
|
||||
|
||||
- 前端:`features/project-workspace/ResourceReferenceInput.tsx`、`ResourceReferenceNode.tsx`、`resourceReferences.ts`、生成绑定及聊天入口透传。
|
||||
- Rust:`agent/direct_codex_user_item/model.rs`、`validation.rs`、`wire.rs`、`codex_app_server/mod.rs` 与对应测试。
|
||||
- 文档:父规范与本里程碑/实施计划。
|
||||
|
||||
## 小切片顺序
|
||||
|
||||
1. 先扩展前端 Skill catalog/节点/草稿 content,保持素材行为不变并补前端测试。
|
||||
2. 扩展 canonical Rust part 与 ts-rs 绑定,补序列化和失败校验测试。
|
||||
3. 接通 Codex wire `type: skill` 转换和受控路径解析,补历史/重放测试。
|
||||
4. 完成入口透传、定向验证和文档证据;每个切片单独中文提交。
|
||||
|
||||
## 验证与回滚
|
||||
|
||||
- `npm --prefix apps/ai-game-creator-shell run typecheck`
|
||||
- 相关 Vitest 与 `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml direct_codex`
|
||||
- `npm run check:encoding`、`npm run check:doc-index`、`git diff --check`
|
||||
- 每个切片只改计划列出的文件;若 Codex wire 协议或 Skill catalog 来源不确定,停在该切片并先更新规范。
|
||||
@@ -1,10 +1,10 @@
|
||||
# 【实施计划】DirectProject Thread Manager 事件订阅
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| 字段 | 值 |
|
||||
| --------- | ---------------------------------------------------------------------------------------- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】DirectProject Thread Manager事件订阅-2026-09-15.md` |
|
||||
| Status | ready |
|
||||
| Owner | Codex |
|
||||
| Status | ready |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
# 【实施计划】DirectProject canonical content 严格边界
|
||||
|
||||
| 字段 | 值 |
|
||||
| --------- | ------------------------------------------------------------------------------------------- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】DirectProject canonical content严格边界-2026-09-16.md` |
|
||||
| Status | implemented |
|
||||
| Owner | Codex |
|
||||
|
||||
## 实施顺序
|
||||
|
||||
1. 先把主转换函数改为原样传递 `draft.content`,并在 content-only 测试中覆盖空白 part 保留。
|
||||
2. 将最终 content 有效性判断抽为纯函数,接入普通提交、队列入队和其它 Direct Codex 入口。
|
||||
3. 删除 Direct Codex 的 `userItem` fallback;首页首轮和队列出队直接构造 canonical user item。
|
||||
4. 收敛策略确认重试为复用同一 canonical user item;旧 Supervisor/Planning caller 加 TODO,不改变其非 Direct Codex 行为。
|
||||
5. 迁移现有测试 fixture,删除旧字段构造,不增加“字段不存在”测试。
|
||||
|
||||
## 落地结果
|
||||
|
||||
- `chatComposerDraftToDirectCodexUserItem` 原样传递 `draft.content`;新增 `directCodexUserItemFromContent` 供 caller 直接构造 canonical item。
|
||||
- `ChatComposerDraft` 只保留 `content`;`ResourceReferenceInput` 的对外草稿、`chatPromptDraftKey`、`QueuedChatTurn` 全部改为 content-only。
|
||||
- 首页首轮、普通聊天提交、运行中队列出队、策略确认重试都携带同一个 canonical user item;`executeChatAgentReply` 的 `userItem` 兜底分支已删除。
|
||||
- 旧 Planner / legacy Supervisor caller 显式构造纯文本 item 并留下迁移 TODO。
|
||||
|
||||
## 修改边界
|
||||
|
||||
- 允许修改:AGC shell 前端 `resourceReferences`、`App`、聊天队列、Direct Codex 相关测试和当前里程碑文档。
|
||||
- 不修改:Rust user item schema、附件 DTO、SpacetimeDB、HTTP API、用户已有 `.env` / `package-lock.json` 修改。
|
||||
- 不引入:`text` / `references` 到 canonical Direct Codex item 的任何兼容 fallback。
|
||||
|
||||
## 验证命令
|
||||
|
||||
- `npm run test -- apps/ai-game-creator-shell/tests/resourceReferences.test.ts apps/ai-game-creator-shell/tests/resourceReferenceInput.test.tsx apps/ai-game-creator-shell/tests/chatPromptPolish.test.tsx apps/ai-game-creator-shell/tests/appSurface/project-conversation.suite.ts`
|
||||
- `npm run ai-game-creator-shell:typecheck`
|
||||
- `npm run check:encoding`
|
||||
- `npm run check:doc-index`
|
||||
- `git diff --check`
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- 空白 `input_text` 不再前端删除,需确保最终有效性判断只拒绝全空 content,不改变其它 part。
|
||||
- Direct caller 漏传 user item 时应在类型检查或明确错误分支暴露,不能静默重建。
|
||||
- 共享工作树含用户未提交修改;提交时只 stage 本计划和本次代码 hunk。
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
# 【实施计划】DirectProject composer canonical content 闭环
|
||||
|
||||
| 字段 | 值 |
|
||||
| --------- | --- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】DirectProject composer canonical content闭环-2026-09-21.md` |
|
||||
| Status | implemented |
|
||||
| Owner | Codex |
|
||||
|
||||
## 交付结果
|
||||
|
||||
删除 Direct composer 的 `text + references` 回写事实源,改为完整 `content[]` 的单向读写;同时修复附件在 editor root 重建、润色回填和提交合并中的丢失窗口。Planning V2 / 快速编辑只保留明确的非 Direct adapter,不进入 Direct canonical 发送路径。
|
||||
|
||||
## 实施顺序
|
||||
|
||||
1. **锁定当前失败面**:补一个最小回归测试,先证明 `applyDraftToRoot` 对含 `agc_attachment_reference` 的 root 重建会丢附件,并记录 Direct 当前的三份并行状态与附件 sidecar 合并点。
|
||||
2. **收窄编辑器接口**:把 `ChatComposerDraft` 改成 content-only;将 `ResourceReferenceInput` 的受控恢复改为 `initialContent` / `content` 语义,删除 Direct 使用的 `value` + `references` 同步 effect。保留 `ChatReference` 仅用于 picker 节点创建和只读投影。
|
||||
3. **替换所有 root 写入**:删除 `buildDraftSegments` / `applyDraftToRoot` 的 Direct 调用;提供一个完整的 `applyContentToRoot`(或同等深模块接口),保留文本换写、引用和附件的顺序与字段。AI 润色改为“读取 content → 对回包文本按 token 扫描 → 原位换回真 part;被改写的 part 末尾补位”,引用与附件同一套口径。
|
||||
4. **收口 Direct controller**:以 `content[]` 作为草稿事实源;上传完成的附件在一个明确的 `append`/`merge` seam 合并,不再长期维护 `chatInput`、`chatReferences`、`chatContent` 三份状态。prompt 只在调用边界派生,队列和策略重试保留原 user item。
|
||||
5. **隔离非 Direct caller**:Planning V2 和资源快速编辑按各自需求选择 content-only 或独立文本 adapter;不得为了兼容它们把旧字段放回共享 Direct 接口。若快速编辑只需要文本,使用不承诺引用/附件语义的窄接口。
|
||||
6. **补齐验收证据并清理**:删除无调用方的旧 helper、字段和注释;更新测试 fixture、专题文档和本计划状态。完成后把稳定结论合并回功能说明/共享记忆,并删除已完成的临时计划。
|
||||
|
||||
## 重点修改边界
|
||||
|
||||
- `apps/ai-game-creator-shell/src/features/project-workspace/ResourceReferenceInput.tsx`
|
||||
- `apps/ai-game-creator-shell/src/features/project-workspace/resourceReferences.ts`
|
||||
- `apps/ai-game-creator-shell/src/features/project-workspace/usePromptPolish.ts` / `chatPromptPolish.ts`(仅在需要支持 content 变换时)
|
||||
- `apps/ai-game-creator-shell/src/view/project-development/chat/controller/useDirectProjectChatController.ts`
|
||||
- `apps/ai-game-creator-shell/src/view/project-development/chat/components/DirectProjectComposer/`
|
||||
- `apps/ai-game-creator-shell/src/view/project-development/planning/PlanningChatView.tsx` 与 `App.tsx` 中 Planning adapter
|
||||
- `apps/ai-game-creator-shell/src/view/project-development/index.tsx` 的快速编辑输入 adapter
|
||||
- 对应 `resourceReferences`、`resourceReferenceInput`、`chatPromptPolish`、Direct composer/appSurface 测试
|
||||
|
||||
## 关键不变量
|
||||
|
||||
- `content[]` 是唯一可发送事实;任何 `prompt`、label、chip 文案都是派生值。
|
||||
- `agc_attachment_reference` 不属于 `ChatReference`,不能借 `references` 传递。
|
||||
- 润色回包只按 token 反解析引用与附件(`draftScanToken` 与出站 `directCodexContentToPromptText` 同口径);token 被删掉时不猜位置,只把该 part 补在末尾,保证不丢。
|
||||
- Direct 初始首轮、普通提交、队列、权限确认重试都使用同一个 `DirectCodexUserItem` 语义。
|
||||
|
||||
## 验证命令
|
||||
|
||||
```bash
|
||||
npm run test -- apps/ai-game-creator-shell/tests/resourceReferences.test.ts apps/ai-game-creator-shell/tests/resourceReferenceInput.test.tsx apps/ai-game-creator-shell/tests/chatPromptPolish.test.tsx apps/ai-game-creator-shell/tests/appSurface/chat-composer.suite.ts apps/ai-game-creator-shell/tests/appSurface/project-conversation.suite.ts
|
||||
npm run ai-game-creator-shell:typecheck
|
||||
npm run check:encoding
|
||||
npm run check:doc-index
|
||||
git diff --check
|
||||
```
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- `ResourceReferenceInput` 当前同时服务 Direct、Planning、快速编辑;先建立 adapter seam,再删除旧 props,避免一次性把策划链路打坏。
|
||||
- 附件目前在 Direct controller 里作为待发 sidecar,若直接移入编辑器必须同步处理上传失败、移除、清空和项目切换;任何阶段都不能把附件只留在展示 chip 而未进入 user item。
|
||||
- 润色服务只返回文本,不能让其响应覆盖原 content;失败时保留原 content。回滚使用 Git revert,不增加运行时开关或兼容分支。
|
||||
- 工作树已有用户未提交修改,实施时只 stage 本里程碑涉及的 hunk。
|
||||
|
||||
## 落地结果
|
||||
|
||||
- 编辑器接口收窄为 content-only:`ResourceReferenceInput` 只接 `initialContent` / `onChange`,`ChatComposerDraft` 只剩 `content`;`applyDraftToRoot` 与受控 `value` / `references` 同步 effect 均删除。
|
||||
- 所有 root 写入统一走 `applyContentToRoot`;润色走 `applyPolishedTextToRoot`,对引用与附件做同一套 token 扫描并在原位置换回真 part,被改写的 part 末尾补位。
|
||||
- Direct controller 去掉 `chatInput` / `chatReferences` / `chatContent`,附件在提交边界合成进同一份 canonical content;Planning 与其它 legacy 消费方改用 `directCodexContentToLegacyContentDto` 单向取文本。
|
||||
- 删除无调用方的 `EMPTY_CHAT_COMPOSER_DRAFT`。
|
||||
- 回归证据:`resourceReferenceInput`(含附件 round-trip、润色原位恢复、润色末尾补位)、`resourceReferences`、`chatPromptPolish`、`usePromptPolish`、`resourceCanvasAssetGenerationReferences`、全量 `appSurface`、AGC typecheck、`check:encoding`、`git diff --check`。
|
||||
- 遗留 TODO:润色服务把 token 一起删掉时无法反推原位置;需要精确恢复时由产品补带位置信息的润色协议。
|
||||
@@ -1,15 +1,16 @@
|
||||
# 【实施计划】DirectProject 用户 Response item 输入
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| 字段 | 值 |
|
||||
| --------- | ------------------------------------------------------------------------------------- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】DirectProject用户ResponseItem输入-2026-09-15.md` |
|
||||
| Status | in-progress |
|
||||
| Owner | Codex |
|
||||
| Status | in-progress |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
|
||||
- 允许修改:AGC 壳 Rust agent 输入合同、DirectProject 历史适配、前端聊天引用模型、ts-rs 生成配置、当前聊天素材文档。
|
||||
- 明确不修改:assistant 返回协议、工具 activity、附件/图片协议、SpacetimeDB、HTTP API。
|
||||
- 明确不修改:assistant 返回协议、工具 activity、附件/图片上传 DTO、SpacetimeDB、HTTP API;上传 DTO 仅在入口转换为 canonical `content[]`,不再以 sidecar 文本追加。
|
||||
- 本切片明确:不根据 MIME 类型判断图片,不生成 `agc_image_reference`;所有上传文件统一映射为 `agc_attachment_reference`。
|
||||
|
||||
## 实现顺序
|
||||
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
# 【实施计划】DirectProject 聊天模块抽离
|
||||
|
||||
| 字段 | 值 |
|
||||
| --------- | ----------------------------------------------------------------------------- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】DirectProject聊天模块抽离-2026-09-18.md` |
|
||||
| Status | implemented |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
|
||||
### 允许修改
|
||||
|
||||
- `apps/ai-game-creator-shell/src/App.tsx`:删除 DirectProject 专属状态、ref、effect、订阅/历史/发送/队列/附件/中止处理和 Direct 专属 JSX 接线;保留项目开发工作台壳与 DirectProject / 立项策划两条入口的选择。
|
||||
- `apps/ai-game-creator-shell/src/view/project-development/chat/DirectProjectChatView.tsx`、`useDirectProjectChatController.ts` 与 `generated/`:新增 DirectProject 表现容器、controller 及其 ts-rs 契约目录;共享 reducer/分页/队列模块只引用这份 Direct 契约,不复制类型。
|
||||
- `view/project-development/chat/` 与 `view/project-development/planning/`:普通项目的对话归 `DirectProjectChatView`,Design Agent 与 Planning V2 归 `PlanningChatView`;行为中立的公共表现组件按需复用或抽出。
|
||||
- `DirectProjectSettingsDialog` 与 `ProjectDevelopmentView`:移除聊天侧钱包注入和聊天设置中的钱包行,在工作台布局头部/工具栏独立渲染钱包入口,保留账户入口功能。
|
||||
- 现有 DirectProject 测试文件:按新模块责任迁移 import、测试入口和 harness,不新增场景或断言集合。
|
||||
- 当前 ADR、里程碑和实施计划文档,以及必要的 `CONTEXT.md` 术语。
|
||||
|
||||
### 明确不修改
|
||||
|
||||
- Rust、Tauri 命令、共享 DTO、Thread Manager、Codex app-server 和 `.agent/conversations/project.jsonl` / 运行态事件合同。
|
||||
- DirectProject 的路由判定语义、模型配置语义、聊天投影规则、历史锚点与分页协议。
|
||||
- DirectProject、Design Agent、Planning V2 的正式行为与页面入口。
|
||||
- 任何运行时 feature flag、兼容别名、双跑路径或旧行为墓碑代码。
|
||||
|
||||
## 实现顺序
|
||||
|
||||
1. 以当前测试为基线,标记 DirectProject 断言归属:纯 reducer/投影/分页/附件测试归内部模块,Composer 的队列/恢复/中止断言归 Direct 容器 harness,项目开发页面只保留入口接线断言;不增加新测试场景。
|
||||
2. 建立 `direct-project-chat/` 私有模块边界,复用现有 `directThreadChat`、`directHistoryPaging`、`directHistoryAnchorGate`、`directTurnPresentation`、`chatComposerQueue` 与附件映射,不复制第二套事实源或 reducer。
|
||||
3. 将 DirectProject 生命周期整体搬入 `DirectProjectChat`:项目切换清理、订阅 bootstrap/notify/consume、首屏锚点、历史连拉、用户回合预写、Direct invoke、鉴权重试、FIFO 出队、附件上传、中止 released 分支和 manifest 刷新均由该容器管理。
|
||||
4. 将 Direct 专属 JSX 从工作台聊天宿主移入 Direct 表现模块:Direct 回合分区、运行中过程卡、Direct Composer、队列、附件、模型/推理选择、语音、中止、Direct 设置;共享组件只保留无行为真相的视觉表现。
|
||||
5. 项目开发工作台固定挂载 `DirectProjectChat`;立项策划(Design Agent、Planning V2)进入 `PlanningChatView`;删除 `directCodex` 作为共享组件行为开关及所有只服务它的 props,不保留 Direct fallback 或运行时 feature flag。
|
||||
6. 将钱包从聊天树移到 `ProjectDevelopmentView` 的工作台头部/工具栏:删除 `cloneElement` 对聊天元素的注入,删除 `DirectProjectSettingsDialog` 的钱包行和 Direct 上下文字段;钱包入口仍由布局直接渲染。
|
||||
7. 把现有测试按所有权迁移并运行定向验证;若发现行为差异,只修复抽离造成的回归,不扩展产品范围。完成后删除旧 Direct 分支与无 caller 的兼容代码。
|
||||
|
||||
## 测试迁移映射
|
||||
|
||||
| 现有测试 | 新归属 |
|
||||
| --------------------------------------------------------------------------------------- | ------------------------------------------- |
|
||||
| `directThreadChat.test.ts` | Direct 事件/历史状态模块 |
|
||||
| `directHistoryPaging.test.ts` | Direct 历史分页模块 |
|
||||
| `directHistoryAnchorGate.test.ts` | Direct 订阅锚点模块 |
|
||||
| `directTurnPresentation.test.ts` | Direct 聊天投影表现模块 |
|
||||
| `directCodexTurnAttachments.test.ts` | Direct 附件模块 |
|
||||
| `chat-composer.suite.ts` 的 FIFO、恢复出队、终止与竞态用例 | Direct 容器/发送队列 harness |
|
||||
| `project-development.suite.ts` 的 Direct 入口、历史、工具卡片、运行态隔离和连续回合用例 | Direct 容器接线;仅迁移测试入口,不新增场景 |
|
||||
|
||||
## 验证命令
|
||||
|
||||
1. `npx vitest run apps/ai-game-creator-shell/tests/directThreadChat.test.ts apps/ai-game-creator-shell/tests/directHistoryPaging.test.ts apps/ai-game-creator-shell/tests/directHistoryAnchorGate.test.ts apps/ai-game-creator-shell/tests/directTurnPresentation.test.ts apps/ai-game-creator-shell/tests/directCodexTurnAttachments.test.ts`
|
||||
2. `npx vitest run apps/ai-game-creator-shell/tests/appSurface/chat-composer.suite.ts apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts`
|
||||
3. `npx tsc -p apps/ai-game-creator-shell/tsconfig.json --noEmit`
|
||||
4. `npm run check:doc-index`
|
||||
5. `npm run check:encoding`
|
||||
6. `git diff --check`
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- **状态遗漏**:任何 Direct 专属 state/ref/effect 留在 `App.tsx` 都会形成双重所有权;以 `rg` 扫描 Direct 专属符号和 `directCodex` props 作为删除检查。
|
||||
- **事实源漂移**:不得在新容器里重新维护 messages、turn-stream 或 tool-calls 副本;继续只使用项目对话历史、运行态事件和聊天投影。
|
||||
- **竞态回归**:重点检查 subscribe 回执前 notify 欠账、首屏锚点闸门、`turn.completed` 与 invoke finally 的 FIFO 出队窗口、提交早于 `turn.started` 的中止以及项目切换时附件/队列清理。
|
||||
- **布局回归**:钱包必须在工作台布局头部/工具栏出现,且聊天设置不再包含钱包行;账户入口功能不能因聊天抽离丢失。
|
||||
- **回滚**:本次采用一次性替换;失败时整体 Git revert,不保留旧/新双路径或运行时 fallback。
|
||||
|
||||
## 实施记录(2026-09-19)
|
||||
|
||||
### 模块落位
|
||||
|
||||
`apps/ai-game-creator-shell/src/view/project-development/chat/` 最终结构:
|
||||
|
||||
| 目录 | 内容 |
|
||||
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `DirectProjectChatView.tsx` | 唯一公开入口:项目路径、入口首轮需求、两条权限门,以及对壳的 `announce` 句柄 |
|
||||
| `components/` | 表现层,一个组件一个目录、逻辑与组件同目录:`DirectProjectChatHeader/`、`DirectProjectComposer/`(含 `ComposerControls.tsx`、`chatComposerQueue.ts`、`chatComposerVoice.ts`)、`DirectProjectConversation/`(含 `DirectProjectTurn.tsx`)、`DirectProjectSettingsDialog/`、`ToolCallGroup/`(含 `toolCallGroupPresentation.ts`) |
|
||||
| `controller/` | `useDirectProjectChatController`(发送/队列/附件/中止/历史分页)、`useDirectProjectManifest`(清单与 `projectId` 订阅)、`useDirectThreadChatSubscription`(`subscribe → consume → notify` 单飞循环 + 聊天 reducer 状态) |
|
||||
| `conversation/` | `directThreadChat.ts`(reducer)、`directThreadItemProjection.ts`、`directTurnPresentation.ts`、`directCodexConversation.ts`、`directCodexSession.ts`、`directCodexTurnAttachments.ts` |
|
||||
| `history/` | `directHistoryPaging.ts`、`directHistoryAnchorGate.ts` |
|
||||
| `generated/` | Rust ts-rs 导出的 Direct 契约 |
|
||||
|
||||
### 关键取舍
|
||||
|
||||
- 线程订阅与聊天 reducer 状态从控制器里提成独立 hook `useDirectThreadChatSubscription`:运行态事实源只有它一份,控制器只读投影结果,历史分页仍并入同一个 reducer。
|
||||
- 工作台级动作(如 `game.run_local` 的预览结果)不再写 `App.tsx` 的 `messages`:壳通过 `DirectProjectChatHandle.announce` 把这句话交给聊天的本地消息流,壳不持有 Direct 聊天消息。
|
||||
|
||||
### 验证结果
|
||||
|
||||
- `npx vitest run` 五个 Direct 纯模块测试:40 通过。
|
||||
- `npx vitest run apps/ai-game-creator-shell/tests/appSurface.test.ts -t "direct"`:15 通过 / 4 失败,且 4 条在本次改动前(`HEAD` 的 `/tmp` worktree 基线)同样失败(用例期望 `chat_with_game_creator_direct_codex` 被调用,但 harness 未桩 `read_game_creator_app_config`,模型可用性校验把提交挡在 invoke 之前;另两条是既有交互断言)。基线同口径为 14 通过 / 5 失败,本次净增 1 条通过。
|
||||
- `npx vitest run apps/ai-game-creator-shell/tests/appSurface.test.ts` 全量:153 失败 / 307 通过 / 17 跳过;`HEAD` 基线同口径 155 失败 / 305 通过。
|
||||
- `npx tsc -p apps/ai-game-creator-shell/tsconfig.json --noEmit`、`npx eslint --ext .ts,.tsx`、`npx prettier --check` 通过。
|
||||
|
||||
### 本计划外的后续项
|
||||
|
||||
- Supervisor 前端链路已随本计划之后的变更整体退役(Supervisor 独立调试窗口、纯聊天容器、工作台壳的 Supervisor 运行态与专业 Agent 面板、`App.tsx` 里只服务它们的 state/ref/effect/handler 全部删除),项目对话只保留 DirectProject 与立项策划两条产品路径;见 [decision-log](../shared-memory/decision-log.md) 2026-09-19 条。
|
||||
@@ -1,10 +1,10 @@
|
||||
# 【实施计划】DirectProject 聊天真相源收敛
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| 字段 | 值 |
|
||||
| --------- | ------------------------------------------------------------------------------- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】DirectProject聊天真相源收敛-2026-09-16.md` |
|
||||
| Status | implemented |
|
||||
| Owner | Codex |
|
||||
| Status | implemented |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# 【实施计划】图集切片模式显式决策
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| 字段 | 值 |
|
||||
| --------- | ------------------------------------------------------------------------ |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】图集切片模式显式决策-2026-09-17.md` |
|
||||
| Status | ready |
|
||||
| Owner | Codex |
|
||||
| Status | ready |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# 【实施计划】平台会话身份与凭据分离
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| 字段 | 值 |
|
||||
| --------- | -------------------------------------------------------------------------- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】平台会话身份与凭据分离-2026-09-16.md` |
|
||||
| Status | done(待验收复核) |
|
||||
| Owner | Codex |
|
||||
| Status | done(待验收复核) |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
# 里程碑:AGC 渠道安装身份隔离
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | 代码与源码级验收已落地,等待真机双渠道安装验收 |
|
||||
| Date | 2026-09-21 |
|
||||
| Parent Spec | `docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md` |
|
||||
|
||||
## 目标
|
||||
|
||||
不同渠道的 AGC 包体在同一台设备上并存:安装、运行、客户端数据与更新互不覆盖、互不顶掉。
|
||||
|
||||
## 范围
|
||||
|
||||
- 构建期按渠道产出安装身份(`productName` / `identifier`),默认渠道 `dev` 身份保持不变。
|
||||
- 渠道产物命名、首装包选择、macOS 发布入口与配置门禁都消费同一份渠道身份。
|
||||
- 同机并存的可见区分(窗口标题)与 AGC 自有 AppData 目录的提权 ACL 识别范围。
|
||||
|
||||
## 不在范围内
|
||||
|
||||
- 不迁移、不共享既有本地项目、工程快照、模板、登录态与诊断数据。
|
||||
- 不新增渠道,不改 OSS 分区布局、官网下载页与后端接口。
|
||||
- 不做 Apple 代码签名/公证,不恢复 Intel 架构。
|
||||
|
||||
## 依赖与前置条件
|
||||
|
||||
- 渠道与更新端点合同已落地(`<channel>-win` / `<channel>-mac` 分区与 Tauri updater 端点)。
|
||||
- 构建入口统一在 Tauri 构建前注入渠道 `--config`。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 默认渠道的 `productName` / `identifier` 与基线配置逐字一致,既有安装与升级链不断(`check-config.mjs` + 渠道身份用例)。
|
||||
- [x] `release` 与自定义渠道派生独立 `productName` 与 `identifier`,与 `dev` 可在同一台设备并存(源码级;真机安装见下方未完成项)。
|
||||
- [x] 渠道产物(NSIS `.exe`、`.app.tar.gz`、DMG)与首装包选择跟随渠道身份且唯一匹配(发布脚本用例)。
|
||||
- [x] 非默认渠道的客户端数据目录、WebView2 目录与窗口标题跟随渠道身份(构建产物字符串实测 + 运行期标题取产品名)。
|
||||
- [x] AGC 自有 AppData 目录的 ACL managed 范围覆盖全部渠道身份,且不扩大到相似前缀目录(Rust 定向 12/12)。
|
||||
- [ ] 真机:同一台设备同时安装 `dev` 与 `release`,二者可并存、可各自原地更新。
|
||||
|
||||
## 证据要求
|
||||
|
||||
- 自动化:`build-release.test.mjs`、`release-oss.test.mjs`、`prepare-macos-codex.test.mjs`、`check-config.mjs` 与 Rust `config::tests::` 定向测试。
|
||||
- 运行时:单渠道 `--no-bundle` 构建烟测;真机双渠道安装、并存与各自更新。
|
||||
- 边界:非法渠道失败关闭;默认渠道身份不变;相似前缀目录不进入 managed 赋权范围。
|
||||
@@ -0,0 +1,43 @@
|
||||
# 【里程碑】DirectProject Skill 提及输入提示
|
||||
|
||||
| 字段 | 值 |
|
||||
| ----------- | ------------------------------------------------ |
|
||||
| Version | 1.0 |
|
||||
| Status | in-progress |
|
||||
| Date | 2026-09-15 |
|
||||
| Parent Spec | `docs/【功能说明】AGC聊天素材引用-2026-09-08.md` |
|
||||
|
||||
## 目标
|
||||
|
||||
在现有 Lexical `ResourceReferenceInput` 中增加 Codex 风格 `$skill-name` 提及。用户选择 Skill 后,编辑器保留与文本相对顺序一致的原子节点;DirectProject canonical user item 保存稳定 Skill 名称,Rust 只允许当前已启用且 app-server 已发现的 Skill,并在 `turn/start` 转换为 Codex 原生 `type: "skill"` 输入项。
|
||||
|
||||
## 范围
|
||||
|
||||
- Skill 候选数据从当前 DirectProject 的已启用 Skill catalog 派生。
|
||||
- `$` typeahead 菜单、键盘选择、鼠标选择、Esc/Enter 交互与现有 `@` 菜单一致。
|
||||
- Skill inline 节点和 `content[]` 顺序恢复。
|
||||
- canonical `agc_skill_reference` part 的 ts-rs 类型、Rust 校验、历史写入与 Codex wire 转换。
|
||||
- 现有素材、运行区域、assistant、附件和工具 activity 行为保持不变。
|
||||
|
||||
## 不在范围内
|
||||
|
||||
- Skill 导入、启用、禁用、重命名和 app-server `skills/list` 生命周期改造。
|
||||
- 普通自然语言自动分类 Skill;只支持显式 `$skill-name` 选择。
|
||||
- Skill 正文预加载、Skill 内容编辑或新的权限/工具能力。
|
||||
- SpacetimeDB、HTTP API 和 assistant item 协议变更。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [ ] 输入 `$` 可显示并过滤可用 Skill,候选项显示名称和描述。
|
||||
- [ ] 选择 Skill 后插入原子 `$name` chip,文本与素材/运行区域的相对顺序保持不变。
|
||||
- [ ] canonical user item 只保存 Skill 稳定名称,不保存正文、凭据或宿主私密路径。
|
||||
- [ ] Rust 拒绝未知、禁用、未发现或名称非法的 Skill;失败时不写历史、不启动回合。
|
||||
- [ ] 合法 Skill 在 Codex wire input 中生成 `type: "skill"`、`name`、受控 `path`,顺序与 canonical content 一致。
|
||||
- [ ] 无 Skill 的旧消息、素材引用和标准 `response_item` 读取行为不变。
|
||||
|
||||
## 证据要求
|
||||
|
||||
- 前端:Lexical 草稿顺序、候选过滤、chip 原子性与 `$`/`@` 共存测试。
|
||||
- Rust:模型序列化、Skill catalog 校验、wire 转换、失败关闭和历史重放测试。
|
||||
- 运行时:DirectProject app-server smoke(环境可用时)。
|
||||
- 门禁:相关 Vitest、AGC Rust 定向测试、`npm run check:encoding`、`npm run check:doc-index`、`git diff --check`。
|
||||
@@ -1,10 +1,10 @@
|
||||
# 【里程碑】DirectProject Thread Manager 事件订阅
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | ready |
|
||||
| Date | 2026-09-15 |
|
||||
| 字段 | 值 |
|
||||
| ----------- | -------------------------------------------------------------------------------- |
|
||||
| Version | 1.0 |
|
||||
| Status | ready |
|
||||
| Date | 2026-09-15 |
|
||||
| Parent Spec | `docs/technical/【技术方案】DirectProject Codex原始历史与异常恢复-2026-09-04.md` |
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
# 【里程碑】DirectProject canonical content 严格边界
|
||||
|
||||
| 字段 | 值 |
|
||||
| ----------- | ------------------------------------------------ |
|
||||
| Version | 1.0 |
|
||||
| Status | implemented |
|
||||
| Date | 2026-09-16 |
|
||||
| Parent Spec | `docs/【功能说明】AGC聊天素材引用-2026-09-08.md` |
|
||||
|
||||
## 目标
|
||||
|
||||
让 DirectProject 的用户消息只以 `content[]` 作为 canonical 输入:转换函数原样传递编辑器草稿的 content part,不做二次预过滤;只在最终 content 上判断是否存在有效输入;所有 Direct Codex caller 必须显式提供完整 `userItem`。
|
||||
|
||||
## 范围
|
||||
|
||||
- 移除 `chatComposerDraftToDirectCodexUserItem` 对纯空白 `input_text` 的预过滤。
|
||||
- Direct Codex 发送前只做最终 content 的有效性判断,不改写 content。
|
||||
- 删除 `executeChatAgentReply` 在 `userItem` 缺失时的构造兜底。
|
||||
- 删除 `ChatComposerDraft` 的 `text` / `references` 字段,草稿只保留 canonical `content`。
|
||||
- 修正首页首轮、队列出队和其它 Direct Codex caller,使其直接构造 canonical user item。
|
||||
- 将队列与策略确认重试按 canonical user item 传递,避免拆回 `text` / `references`。
|
||||
- 仍在使用的旧 Supervisor/Planning caller 保持非 Direct Codex 行为,并添加后续迁移 TODO。
|
||||
|
||||
## 不在范围内
|
||||
|
||||
- 不保留从 `draft.text` / `draft.references` 重建 Direct Codex content 的兼容分支。
|
||||
- 不新增断言 legacy 字段“不存在”的测试;现有测试直接迁移到 content-only 输入。
|
||||
- 不修改 Rust user item schema、SpacetimeDB schema、HTTP API 或历史迁移。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- `chatComposerDraftToDirectCodexUserItem` 输出与输入 `draft.content` 顺序和值完全一致。
|
||||
- 只有当最终 content 不含非空文本且不含任何非文本 part 时,发送入口才拒绝本轮。
|
||||
- Direct Codex 路径不存在 `userItem ?? ...` 或等价 fallback。
|
||||
- `ChatComposerDraft` 只有 `content` 一个字段;`text` / `references` 不再是草稿契约的一部分。
|
||||
- 首页首轮、普通聊天、队列出队、策略确认重试均发送同一个 canonical user item 语义。
|
||||
- 旧 Supervisor/Planning caller 上有明确 TODO,且不进入 Direct Codex canonical 发送路径。
|
||||
|
||||
## 实现结论
|
||||
|
||||
- 前端不再做任何空白过滤:Lexical 投影层原样透传编辑器节点,段落分隔符(root 子节点之间补的 `\n`)、软换行、chip 后的分隔空格都各自成 part,既不丢弃也不与相邻 part 合并 —— 前端不替用户改写他输入的内容。
|
||||
- 有效输入只判整条 content:有一段非空白文本或任何一个非文本 part 就算有效输入,单个纯空白 `input_text` 合法。前端 `hasMeaningfulDirectCodexContent` 与 Rust `validate_direct_codex_user_item`(`content_has_meaningful_input`)同口径,Rust 侧不再逐个 part 拒绝空文本;`wire.rs` 的「不能转换为空 prompt」只作兜底。
|
||||
- 显示文本、队列 chip 文案、草稿持久化和润色判据统一由 `directCodexContentToPromptText(content, assets)` 从 content 派生,不再维护并行的 `text` 字段;`assets`(当前项目 manifest)必填,`agc_resource_reference` 按 `@显示名` 展开,消息正文与队列 chip 因此逐字一致。
|
||||
- 需要文本草稿的旧入口(`replaceText`、快速编辑)仍由编辑器把文本 + 引用重建为 content,方向是「文本 → content」,不存在「legacy 字段 → content」的回退。
|
||||
|
||||
## 证据
|
||||
|
||||
- `apps/ai-game-creator-shell/tests/resourceReferences.test.ts`:content 原样传递、空白 part 保留、有效性判断、文本派生。
|
||||
- `apps/ai-game-creator-shell/tests/resourceReferenceInput.test.tsx`(含「引用后面的段落分隔原样落进 content」)、`chatPromptPolish.test.tsx`、`tests/appSurface/*.suite.ts`:草稿读取、提醒判据、队列与 caller 迁移到 content-only,并按逐字投影断言 content。
|
||||
- `apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/`:`validation.rs` 的「只有整条 content 全空白才算空输入」与 `wire.rs` 的「单个纯空白 part 通过校验、整条全空白拒绝」用例。
|
||||
- AGC shell 类型检查、定向 Vitest、`npm run check:encoding`、`git diff --check` 通过。
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
# 【里程碑】DirectProject composer canonical content 闭环
|
||||
|
||||
| 字段 | 值 |
|
||||
| ----------- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | implemented |
|
||||
| Date | 2026-09-21 |
|
||||
| Parent Spec | `docs/【功能说明】AGC聊天素材引用-2026-09-08.md` |
|
||||
| Related ADR | `docs/adr/【ADR】DirectProject独立聊天容器与工作台钱包布局-2026-09-18.md` |
|
||||
| Supersedes | `docs/project-memory/plans/【实施计划】DirectProject canonical content严格边界-2026-09-16.md` 的已实现边界清理,补齐其遗漏的编辑器回写路径 |
|
||||
|
||||
## 问题确认
|
||||
|
||||
上一里程碑把 Direct 发送、队列和 Rust user item 收口到了 `content[]`,但输入编辑器仍保留一条旧的派生状态接口:
|
||||
|
||||
- `ChatComposerDraft` 仍包含 `text`、`references`、`content` 三个字段。
|
||||
- `ResourceReferenceInput` 仍接收 `value` + `references`,并在受控同步 effect 中调用 `applyDraftToRoot(value, references)`。
|
||||
- `replaceText` 与 `usePromptPolish` 的 `applyPromptText` 也调用 `applyDraftToRoot(text, current.references)`。
|
||||
- `applyDraftToRoot` 只重建文本和 `ChatReference` 节点,不能表达 `agc_attachment_reference`,会在任何包含附件节点的 editor root 重建中丢附件。
|
||||
- Direct controller 仍把同一份 `content` 拆成 `chatContent`、`chatInput`、`chatReferences` 三份状态;提交时又把附件 sidecar 追加回 `content`,导致编辑器 canonical content 与本轮完整 canonical user content 不是同一份事实源。
|
||||
|
||||
## 目标
|
||||
|
||||
让 DirectProject 的 composer 从读取、润色、受控恢复、队列、附件到提交都只围绕一份有序 `content[]` 运作:
|
||||
|
||||
1. 编辑器对外草稿类型只有 `content`。
|
||||
2. 文本展示、提醒、队列 chip 和 prompt 参数全部由 `content[]` 派生。
|
||||
3. 任意编辑器回写只能接收完整 `content[]`;不能用文本和引用列表重建 root。
|
||||
4. `agc_attachment_reference` 在恢复、润色回写、队列和提交中保持顺序和值,不得丢失、搬移或重复。
|
||||
5. DirectProject 不再维护 `chatInput` / `chatReferences` / `chatContent` 并行事实源;待发上传附件也必须在进入提交前显式合并为同一 canonical content。
|
||||
|
||||
## 边界与非目标
|
||||
|
||||
- 保留 `directCodexContentToPromptText` 作为只读展示投影,不把它反向解析成 content。
|
||||
- 保留 `ChatReference` 作为 picker/UI 的候选与节点显示模型;它不是 Direct 草稿或发送模型。
|
||||
- Planning V2 与资源快速编辑若仍需要文本 props,只能通过明确的 adapter/独立表象接口接入,不能让这些 legacy props 继续成为 Direct composer 的接口。
|
||||
- 不修改 Rust user item schema、SpacetimeDB、HTTP API 或附件协议字段。
|
||||
- 不引入兼容 alias、`text + references → content` fallback、隐式附件 sidecar 拼接或双写状态。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- `ChatComposerDraft`、`ResourceReferenceInput` 的 Direct 使用面和 Direct composer props 不再暴露 `text` / `references` 双轨草稿。
|
||||
- 代码中不存在 Direct 路径对 `applyDraftToRoot(value, references)`、`replaceText(text)` 或等价 legacy 重建器的调用。
|
||||
- `content[]` 中交错的文本、资源引用、运行区域引用、Skill 和附件经过:初始恢复 → 读取 → 润色回写 → 再读取,part 一个不少。
|
||||
- 润色回包还留着 `@显示名` / `$名称` / `@附件名` 时,对应 chip 在原位置复活;token 被整体改写掉的 part 补在末尾,不丢。
|
||||
- 附件-only、文本+附件、资源引用+附件、文本+资源引用+附件四类提交均只生成一份 canonical user item,附件字段完整保留。
|
||||
- 队列入队、出队、策略确认重试复用同一份 `userItem.content`,不从 prompt 文本重建。
|
||||
- Direct 提交清理草稿后,待发附件和 editor content 同时清空;失败或取消不会悄悄丢失待发附件。
|
||||
- Planning/快速编辑的迁移或隔离有明确类型接口和定向测试,不再借 Direct 的双轨 props。
|
||||
|
||||
## 证据要求
|
||||
|
||||
- ResourceReferenceInput 纯投影/回写测试:包含附件节点的 round-trip 与润色回写不丢附件。
|
||||
- Direct composer appSurface:四类 content 组合、队列、策略重试及清理语义。
|
||||
- 类型检查、定向 Vitest、`npm run check:encoding`、`npm run check:doc-index`、`git diff --check`。
|
||||
|
||||
## 落地结果
|
||||
|
||||
- `ChatComposerDraft` 只剩 `content`;`ResourceReferenceInput` 的对外接口是 `initialContent` + `onChange` + `getDraft()`,受控 `value` / `references` 与 `applyDraftToRoot` 已删除。
|
||||
- 编辑器 root 回写只剩 `applyContentToRoot`(完整 content,含附件)一条路径;清空、初始恢复、润色回写都走它。
|
||||
- Direct composer 提交时把 editor content 与待发附件 sidecar 合成同一份 canonical content;controller 不再持有 `chatInput` / `chatReferences` / `chatContent`。
|
||||
- Planning 提交与 legacy 消费方通过单向 `directCodexContentToLegacyContentDto` 取文本,不回写编辑器。
|
||||
- 润色回写(`applyPolishedTextToRoot`)对引用与附件用同一套 token 扫描(`draftScanToken`):token 存活则原位换回真 part,被改写的 part 末尾补位;附件不再丢出 canonical content。
|
||||
- 遗留 TODO:润色服务整体改写文本、连 token 一起删掉时,前端无法反推原位置,只能末尾补位;需要精确恢复时由产品补带位置信息的润色协议。
|
||||
- 收口扩展(2026-09-21,栏目画布图片类生成浮层):面板 state、重开草稿 `ResourceCanvasAssetGenerationPanelDraft`、重试身份判据与提交载荷全部只有一份 `content[]`;`directCodexContentToLegacyContentDto` 只在任务落账这一个出站边界派生,账本回草稿走同一套 token 反解析(`legacyContentDtoToContent`)。token 扫描实现从 `ResourceReferenceInput` 提到 `resourceReferences`,润色回写与 legacy 翻译共用一份;无从解析的资源引用合成 `kind: unknown` 占位而不再被静默丢弃。详见 `decision-log.md` 同名条目。
|
||||
@@ -1,10 +1,10 @@
|
||||
# 【里程碑】DirectProject 用户 Response item 输入
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | proposed |
|
||||
| Date | 2026-09-15 |
|
||||
| 字段 | 值 |
|
||||
| ----------- | ------------------------------------------------ |
|
||||
| Version | 1.0 |
|
||||
| Status | proposed |
|
||||
| Date | 2026-09-15 |
|
||||
| Parent Spec | `docs/【功能说明】AGC聊天素材引用-2026-09-08.md` |
|
||||
|
||||
## 目标
|
||||
@@ -19,13 +19,13 @@
|
||||
- `agc_runtime_region_reference` 保留运行区域语义摘要。
|
||||
- Rust 在持久化前完成白名单、manifest 与路径校验。
|
||||
- 现有标准 `response_item` 原样兼容;legacy conversation 行不提供 fallback。
|
||||
- 保持 assistant 返回、工具 activity、附件/图片协议不变。
|
||||
- 保持 assistant 返回、工具 activity 与上传 DTO 不变;DirectProject canonical user item 不再保存附件 sidecar,所有本地上传文件(包括图片)统一作为 `content[]` 中按顺序排列的 `agc_attachment_reference`。
|
||||
|
||||
## 不在范围内
|
||||
|
||||
- assistant item 前端投影或 Tauri 返回值改造。
|
||||
- 工具 item、reasoning、file change、MCP item 的 UI 模型化。
|
||||
- 附件/图片 content part。
|
||||
- 不新增图片专用 content part;上传 DTO 只作为输入适配,不作为历史事实源。
|
||||
- SpacetimeDB schema 或 HTTP API 变更。
|
||||
|
||||
## 依赖与前置条件
|
||||
@@ -42,7 +42,7 @@
|
||||
- [x] 未知 part、失效资源或非法路径在持久化前失败关闭。
|
||||
- [x] canonical item 以 `response_item` 写入历史,标准旧 item 原样可读。
|
||||
- [x] Codex wire input 不含 AGC 私有 part,且顺序与 canonical content 一致。
|
||||
- [ ] assistant、附件和工具链路行为无变化。
|
||||
- [x] assistant、附件和工具链路行为无变化;所有上传文件按 content 顺序内联,附件-only 输入也能进入 DirectProject prompt。
|
||||
|
||||
## 证据要求
|
||||
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# 【里程碑】DirectProject 聊天模块抽离
|
||||
|
||||
| 字段 | 值 |
|
||||
| ----------- | ---------------------------------------------------------------------- |
|
||||
| Version | 1.0 |
|
||||
| Status | proposed |
|
||||
| Date | 2026-09-18 |
|
||||
| Parent Spec | `docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md` |
|
||||
|
||||
## 目标
|
||||
|
||||
把普通项目的 DirectProject 聊天从 `App.tsx` 与工作台聊天宿主中抽出为独立产品容器(`view/project-development/chat/`),并把项目级钱包入口提升到工作台布局层;立项策划(Design Agent、Planning V2)随后收敛到 `view/project-development/planning/`。
|
||||
|
||||
## 范围
|
||||
|
||||
- 公开入口只有一个 `DirectProjectChat`;内部可按状态、订阅/历史、发送/队列、附件和表现职责拆成私有模块。
|
||||
- DirectProject 容器拥有项目对话历史、运行态事件、聊天投影、首屏锚点、历史分页、发送回合、FIFO 队列、附件、中止和项目切换清理。
|
||||
- `App.tsx` 保留通用项目壳状态,只传窄项目上下文与布局同步出口;不再拥有 Direct 专属 state/ref/effect/handler。
|
||||
- 立项策划只由 `PlanningChatView` 承载;共享 Composer、消息、Markdown、工具卡片和通用设置表现可以复用,但不共享产品行为容器。
|
||||
- 钱包入口由项目工作台布局(`ProjectDevelopmentView` 的布局级头部/工具栏)独立渲染,不进入聊天上下文或聊天设置浮层。
|
||||
|
||||
## 不在范围内
|
||||
|
||||
- 不改变 DirectProject 的 Tauri/Rust 命令、DTO、Thread Manager、Codex app-server、持久化事实源或运行态事件语义。
|
||||
- 不改变 DirectProject 的路由选择条件、发送/队列/附件/中止/历史锚点/投影行为;钱包仅按已确认的布局归属调整。
|
||||
- 不合并 DirectProject、Design Agent、Planning V2;不新增通用 Agent 聊天框架。
|
||||
- 不新增测试场景或 Provider E2E;现有测试按新模块所有权迁移。
|
||||
- 不保留 Direct 旧条件分支、alias、feature flag、双跑或兼容 fallback。
|
||||
|
||||
## 依赖与前置条件
|
||||
|
||||
- 现有 DirectProject 真相源收敛与 Thread Manager 事件订阅已作为当前行为合同。
|
||||
- 现有 DirectProject 纯模块测试与 `chat-composer.suite.ts`、`project-development.suite.ts` 页面断言作为迁移基线。
|
||||
- `ProjectDevelopmentView` 已是钱包插槽注入与项目布局的外层边界,可移除向聊天元素的 `cloneElement` 注入。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] DirectProject 只通过独立 `DirectProjectChat` 入口渲染,不再作为工作台聊天宿主里的条件分支。
|
||||
- [ ] DirectProject 的订阅、历史、投影、发送、队列、附件、中止和项目切换状态不再由 `App.tsx` 持有。
|
||||
- [x] Design Agent 与 Planning V2 的入口和行为不被 Direct 抽离改变(策划链路已在后续变更中收敛到 `PlanningChatView`)。
|
||||
- [ ] 钱包入口由项目工作台布局独立渲染,聊天组件和聊天设置不接收或渲染 `walletEntry`。
|
||||
- [ ] 现有 DirectProject 测试断言按新模块所有权迁移,测试场景与覆盖范围不减少,也不新增场景。
|
||||
- [ ] 代码中不存在 Direct 旧 fallback、feature flag、兼容 alias 或共享行为条件分支。
|
||||
|
||||
## 证据要求
|
||||
|
||||
- 自动化:迁移后的 Direct 纯模块测试、现有 Composer/项目开发页面测试、非 Direct 现有测试与 TypeScript 检查。
|
||||
- 文档:`npm run check:doc-index`、`npm run check:encoding`、`git diff --check`。
|
||||
- 边界:Thread Manager 订阅回执竞态、首屏锚点、历史连拉、实时/历史合并、FIFO 出队、附件清理、中止 released 分支和项目切换。
|
||||
- 未验证项:真实 Provider/app-server 运行时不因本次结构重构新增验收范围;若现有环境无法运行,记录为未验证而不添加替代兼容路径。
|
||||
@@ -1,10 +1,10 @@
|
||||
# 【里程碑】DirectProject 聊天真相源收敛
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | implemented(自动化验收通过,运行时验收待补) |
|
||||
| Date | 2026-09-16 |
|
||||
| 字段 | 值 |
|
||||
| ----------- | -------------------------------------------------------------------------------- |
|
||||
| Version | 1.0 |
|
||||
| Status | implemented(自动化验收通过,运行时验收待补) |
|
||||
| Date | 2026-09-16 |
|
||||
| Parent Spec | `docs/technical/【技术方案】DirectProject Codex原始历史与异常恢复-2026-09-04.md` |
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# 【里程碑】Provider 推理与正文分离及策划 Agent 展示
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | in-progress |
|
||||
| Date | 2026-09-14 |
|
||||
| Parent Spec | `docs/technical/【技术方案】策划Agent生产迁移与工作区浏览-2026-09-10.md` |
|
||||
| Related Issue | `GenarrativeAI/Genarrative#331` |
|
||||
| 字段 | 值 |
|
||||
| ------------- | ------------------------------------------------------------------------ |
|
||||
| Version | 1.0 |
|
||||
| Status | in-progress |
|
||||
| Date | 2026-09-14 |
|
||||
| Parent Spec | `docs/technical/【技术方案】策划Agent生产迁移与工作区浏览-2026-09-10.md` |
|
||||
| Related Issue | `GenarrativeAI/Genarrative#331` |
|
||||
|
||||
## 一句话交付结果
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
- 已完成共享 reasoning 字段、Provider 解析、策划事件映射以及正文流式收尾的前两轮提交。
|
||||
- 当前第三轮聚焦策划 Agent 前端 reasoning 生命周期:按 `projectPath + clientTurnId` 绑定事件,回合结束后保留本轮 reasoning,下一轮或项目切换时清理。
|
||||
- 现有 `<details>` 展示保持默认收起,并提供明确的展开/收起入口;不新增持久化字段,也不改动 GameAgent、Direct/Codex、supervisor 或已退役链路。
|
||||
- 现有 `<details>` 展示保持默认收起,并提供明确的展开/收起入口;不新增持久化字段,也不改动 GameAgent、Direct/Codex 或已退役链路。
|
||||
- 已核对实际会话产物:Responses 原生 `history` 已持久化 `reasoning` / `reasoning_text`,当前修复补齐 `reasoning_text` 提取,并在策划会话恢复时回填最近一轮 reasoning。
|
||||
|
||||
## 背景与现状
|
||||
@@ -72,7 +72,7 @@ GameAgent、Agent Interaction、Direct/Codex 适配层和通用 runtime 继续
|
||||
|
||||
### 前端
|
||||
|
||||
复用现有 `ProjectSupervisorView` 的 `designReasoning` 和默认折叠 `<details>` 展示。只补事件生命周期和状态清理,不新建平行组件或平行状态协议。
|
||||
复用策划聊天容器(`view/project-development/planning/PlanningChatView.tsx`)已有的 `designReasoning` 和默认折叠 `<details>` 展示。只补事件生命周期和状态清理,不新建平行组件或平行状态协议。
|
||||
|
||||
## 分步实施方案
|
||||
|
||||
@@ -140,15 +140,15 @@ Responses 的原生 output 仍按当前方式保留,用于后续 Responses 会
|
||||
|
||||
## 第五轮验收证据
|
||||
|
||||
| 验收面 | 证据 | 结果 |
|
||||
| --- | --- | --- |
|
||||
| Chat / Responses reasoning 解析 | `cargo test --manifest-path server-rs/Cargo.toml -p platform-llm` | PASS,152 个单元测试;含字段、content part、SSE 增量、终态快照和正文隔离 |
|
||||
| reasoning 与工具调用共存 | `responses_response_captures_reasoning_alongside_tool_call`、既有 Chat/Responses 流式工具测试 | PASS |
|
||||
| 默认关闭与请求兼容 | `run_request_defaults_to_openai_responses_api_kind`、`reasoning_capture_switch_does_not_change_provider_request_body` | PASS |
|
||||
| 策划 Runtime 生命周期 | `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell design_runtime` | PASS,10 个测试;含事件映射、history 隔离、重试清理和失败清理 |
|
||||
| GameAgent / Direct/Codex 正文回归 | `cargo check --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --tests` 与现有 response stream / direct tests 编译 | PASS;新增字段未进入正文消费路径 |
|
||||
| 前端与文档门禁 | `npx tsc -p apps/ai-game-creator-shell/tsconfig.json --noEmit`、`npm run check:encoding`、`npm run check:doc-index`、`git diff --check` | PASS |
|
||||
| 格式门禁 | `cargo fmt --all --manifest-path server-rs/Cargo.toml -- --check`、AGC Tauri 同命令 | PASS |
|
||||
| 验收面 | 证据 | 结果 |
|
||||
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
|
||||
| Chat / Responses reasoning 解析 | `cargo test --manifest-path server-rs/Cargo.toml -p platform-llm` | PASS,152 个单元测试;含字段、content part、SSE 增量、终态快照和正文隔离 |
|
||||
| reasoning 与工具调用共存 | `responses_response_captures_reasoning_alongside_tool_call`、既有 Chat/Responses 流式工具测试 | PASS |
|
||||
| 默认关闭与请求兼容 | `run_request_defaults_to_openai_responses_api_kind`、`reasoning_capture_switch_does_not_change_provider_request_body` | PASS |
|
||||
| 策划 Runtime 生命周期 | `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell design_runtime` | PASS,10 个测试;含事件映射、history 隔离、重试清理和失败清理 |
|
||||
| GameAgent / Direct/Codex 正文回归 | `cargo check --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --tests` 与现有 response stream / direct tests 编译 | PASS;新增字段未进入正文消费路径 |
|
||||
| 前端与文档门禁 | `npx tsc -p apps/ai-game-creator-shell/tsconfig.json --noEmit`、`npm run check:encoding`、`npm run check:doc-index`、`git diff --check` | PASS |
|
||||
| 格式门禁 | `cargo fmt --all --manifest-path server-rs/Cargo.toml -- --check`、AGC Tauri 同命令 | PASS |
|
||||
|
||||
真实 Provider、浏览器运行时 smoke 和 `check-config.mjs` 的 Windows 私有 DACL 路径本轮未验证;前者需要凭据和运行环境,后者受当前沙箱权限限制,不能据此扩大验收结论。
|
||||
|
||||
@@ -168,13 +168,13 @@ Responses 的原生 output 仍按当前方式保留,用于后续 Responses 会
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
| 风险 | 控制措施 | 回滚点 |
|
||||
| --- | --- | --- |
|
||||
| 共享结构体新增字段导致构造点遗漏 | 先补齐所有构造点和编译检查 | 回退共享字段提交 |
|
||||
| Provider 把 reasoning 混入正文 | 保留独立提取器和正文过滤测试 | 关闭 reasoning 捕获开关 |
|
||||
| Responses summary 事件重复累计 | 以增量事件为主,终态仅做快照/兜底 | 关闭对应事件解析 |
|
||||
| GameAgent 意外展示 reasoning | 捕获默认关闭,调用方只读正文字段 | 回退策划开关,不影响共享解析 |
|
||||
| 重试残留旧 reasoning | 按回合和响应槽清理/替换 | 回退 UI 事件消费 |
|
||||
| 风险 | 控制措施 | 回滚点 |
|
||||
| -------------------------------- | --------------------------------- | ---------------------------- |
|
||||
| 共享结构体新增字段导致构造点遗漏 | 先补齐所有构造点和编译检查 | 回退共享字段提交 |
|
||||
| Provider 把 reasoning 混入正文 | 保留独立提取器和正文过滤测试 | 关闭 reasoning 捕获开关 |
|
||||
| Responses summary 事件重复累计 | 以增量事件为主,终态仅做快照/兜底 | 关闭对应事件解析 |
|
||||
| GameAgent 意外展示 reasoning | 捕获默认关闭,调用方只读正文字段 | 回退策划开关,不影响共享解析 |
|
||||
| 重试残留旧 reasoning | 按回合和响应槽清理/替换 | 回退 UI 事件消费 |
|
||||
|
||||
## 验收命令
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# 【里程碑】图集切片模式显式决策
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | proposed |
|
||||
| Date | 2026-09-17 |
|
||||
| 字段 | 值 |
|
||||
| ----------- | ------------------------------------------------------- |
|
||||
| Version | 1.0 |
|
||||
| Status | proposed |
|
||||
| Date | 2026-09-17 |
|
||||
| Parent Spec | `docs/【编辑器】画板图标素材生成入口设计-2026-06-15.md` |
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# 【里程碑】平台会话身份与凭据分离
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | implemented(待验收复核) |
|
||||
| Date | 2026-09-16 |
|
||||
| 字段 | 值 |
|
||||
| ----------- | ------------------------------------------------------------------------------------------------------------- |
|
||||
| Version | 1.0 |
|
||||
| Status | implemented(待验收复核) |
|
||||
| Date | 2026-09-16 |
|
||||
| Parent Spec | `docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md`(`2026-09-16 平台会话身份与凭据分离`) |
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# 【里程碑】资源画布支持引擎资源预览
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | implemented; 真机 Cocos 工程验收待补 |
|
||||
| Date | 2026-09-17 |
|
||||
| 字段 | 值 |
|
||||
| ----------- | ---------------------------------------------------------------------- |
|
||||
| Version | 1.0 |
|
||||
| Status | implemented; 真机 Cocos 工程验收待补 |
|
||||
| Date | 2026-09-17 |
|
||||
| Parent Spec | `docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md` |
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -1,5 +1,29 @@
|
||||
# 决策记录
|
||||
|
||||
## 2026-09-21 合并 origin/master:Supervisor 永久退役,策划 V1V2 退役落到当前两条产品路径
|
||||
|
||||
- 背景:`refactor/split-direct-project`(DirectProject 独立聊天容器)与 `origin/master`(#355 退役策划 Agent V1/V2)在 2026-09-18 之后各走一条线:本分支删掉 Supervisor 前端链路、把立项策划收敛到 `view/project-development/planning/`,master 删掉整套策划 V1/V2(前端会话 / 审批卡 / 适配器 / 类型与 Rust `planning_*_v2` 命令、`planning_gdd_model.rs`、`planning_policy_v2.rs`、`planning_session_v2.rs`)只保留 Design Agent。两边都在删 Supervisor,冲突集中在 `App.tsx`、聊天视图(`PlanningChatView`、`DirectProjectTurn`、`ToolCallGroup`)、Direct composer / 引用输入区、`styles.css`、Rust direct user item 与 appSurface 用例。
|
||||
- 决策:按「Supervisor 永久退役」的当前口径合并,保留 DirectProject 独立容器 + Design Agent 两条产品路径,master 的策划 V1/V2 删除整体生效(GDD 审批卡、策划输入卡、`planningLane`、`planningSessionV2`、`planningSessionContract` 与对应 Rust 模块、`planning_*_v2` 命令与前端契约全部删除,不保留兼容别名或双跑路径)。两边的 patch 目的若有独立价值,就落到当前结构上而不是恢复 Supervisor:① 思考折叠入口收成一个共享表现 `chat/components/AgentReasoning/AgentReasoning.tsx`(折叠态单行纯文本预览 + 箭头、展开态安全 Markdown),DirectProject 回合与策划回合共用;② 输入盒的模型 / 推理档控件(`ConversationModelSelect`、`ComposerReasoningEffortSelect`)按 ADR「行为中立的设置表现可复用」接到策划输入盒,写回仍走客户端配置通道。Rust 侧保留本分支的 canonical→wire 投影、无审计回合与 direct user item 严格校验,master 的 `prepare_new_web_project_at` 前置复核并入当前回合入口。
|
||||
- 原因:Supervisor 结构(含它的 composer 控件、消息标签与运行态)是已退役对象,冲突里出现它只是两侧删除的落点不同;但「策划入口也要能选模型 / 推理档」和「折叠思考显示单行预览」是产品行为,属于 master 那边的独立目的,丢掉就是功能回退。把它们挂到当前两条路径上,既满足退役口径也不让 master 的行为丢失。
|
||||
- 代价与取舍:master 用例里钉住 `.project-supervisor-composer-controls`、`项目总控消息` 的断言改为当前类名 `.project-chat-composer-controls` 与「立项策划消息」;本分支 CSS 的 `project-supervisor-* → project-chat-*` 改名对 master 新增规则同样生效。`workspaceProjectKind` 在两条读它的路径(壳层 Cocos 插件门禁、Supervisor 提交路由)都退役后删除,插件可用性改由插件宿主自判。`.env` 的本地私有改动不进入本次合并。
|
||||
- 验证方式:`apps/ai-game-creator-shell` `npm run typecheck` 与仓库 `npm run typecheck`、`npx vitest run apps/ai-game-creator-shell/tests`(168 个文件,除 5 个 jsdom `localStorage` 环境失败文件与 1 条本分支既有的 `resourceTagStatsRefresh` 失败外全绿,`appSurface.test.ts` 198 passed / 13 skipped / 0 failed)、`npm run check:encoding`、`npm run check:doc-index`、`git diff --check`、改动文件 eslint 0 error。Rust 侧定向 `cargo test --bin genarrative-ai-game-creator-shell -- direct_codex_user_item | skill_pack:: | sessions::developer_project_file_and_memory_writes_advance_project_revision` 全过;整套 Rust 分片在本容器有 55 条环境性失败(`/sbin -> usr/bin` 让 `command.exec` 沙箱的 merged-usr 预检失败,报 `command.exec sandbox unavailable`),与本次合并无关:这些用例所在模块与 master 逐字相同。
|
||||
|
||||
## 2026-09-21 合并后两处回归:预览激活回接「运行」入口,聊天 `@` 清单按需重读
|
||||
|
||||
- 背景:合并 `origin/master` 后 CI 报两处回归。① `scripts/check-native-shells.mjs` 报 `AI game creator client preview activation drifted: missing await invoke<LocalPreviewStatus>('activate_local_game_preview'`:Supervisor 前端链路退役时(`0224ef7b9` 删 `pendingCommand` 死链那一步)把 `activate_local_game_preview` 的前端调用方一起带走,而这条守卫与 Rust `preview.rs` 的实现都还在。② `resourceTagStatsRefresh` 用例失败:聊天 `@` 选择器的标签统计与候选读 `useDirectProjectManifest` 自己那份清单,资源画布的标签写入既不发 `game-creator-manifest-invalidated`(Rust 只在 agent 驱动的写入上发),壳也不再往聊天推清单快照,于是用户改完标签打开 `@` 仍看到旧标签。
|
||||
- 决策:① 预览激活按 ADR 由「运行」入口承接:`executeRunLocal` 先调 `activate_local_game_preview`(Rust 侧只核对内存 registry 与项目归属),返回 running 且拿到 loopback 地址就只切客户端运行视图并经 `DirectProjectChatHandle.announce` 说一句 `已切换到客户端运行视图:<url>`,不再重复 `start_local_game_preview`;stopped / 不属于本项目 / 权限位要求确认都当「没有可复用预览」,回落到重新启动。同时把 `activate_local_game_preview` 从 `scripts/check-config.mjs` 的 native-only 白名单删除(该门禁要求 App invoke 与白名单互斥)。② 聊天 `@` 选择器打开时按需重读清单:`DirectProjectComposer` 的两处选择器入口(工具条按钮与附件菜单项)都先触发 `onReferencePickerOpen` 再 `openPicker`,由 `DirectProjectChatView` 用 `useDirectProjectManifest` 的 `refresh` 重读;不新增壳→聊天的清单推送通道,也不改 ADR 里「聊天自己订阅清单」的归属。
|
||||
- 代价与取舍:编辑器内直接敲 `@` 的候选菜单读同一份清单,本轮没有纳入按需重读(它只列素材名、不显示标签统计)。更根治的做法是让资源写入在 Rust 侧广播 `game-creator-manifest-invalidated`,本轮不做,先按现成的刷新入口收口。
|
||||
- 影响范围:`apps/ai-game-creator-shell/src/App.tsx`、`src/view/project-development/chat/DirectProjectChatView.tsx`、`.../chat/components/DirectProjectComposer/DirectProjectComposer.tsx`、`scripts/check-config.mjs`;新增 `tests/previewActivation.test.tsx`(3 条:活体预览只切视图不重启、stopped 回落重启、权限确认回落重启;第一条在去掉接线后确实失败)。
|
||||
- 验证方式:`npx vitest run apps/ai-game-creator-shell/tests`(除 5 个 jsdom `localStorage` 环境失败文件外全绿:`previewActivation` 3/3、`resourceTagStatsRefresh` 2/2、`runVersionSwitchEventSubscription` 2/2、`resourceReferenceInput` 34/34、`appSurface.test.ts` 198 passed / 13 skipped)、`node scripts/check-native-shells.mjs --groups=contract`、`npm run ai-game-creator-shell:typecheck`、`npm run check:encoding`、`git diff --check`、改动文件 prettier / eslint 全过。
|
||||
|
||||
## 2026-09-21 渠道进安装身份:不同渠道的 AGC 包体在同一台设备并存
|
||||
|
||||
- 背景:渠道此前只决定更新端点(`plugins.updater.endpoints`)与渲染层平台 origin,`productName` / `identifier` 与渠道无关,于是所有渠道共用 `%LOCALAPPDATA%\陶泥儿` 安装目录、同一个卸载项(`HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\陶泥儿`,另有 `HKCU\Software\genarrative\陶泥儿`)以及同一份 `%APPDATA%\world.genarrative.ai-game-creator` 数据目录。本机 0.1.48 安装实测:主程序二进制里只有 1 处 `agc/dev-win/latest.json`、0 处 release 端点,说明渠道在产物里只体现为端点。后果是后装的渠道静默顶掉先装的渠道,并接管更新端点、平台服务器与本地登录态/项目数据。
|
||||
- 决策:渠道同时决定**安装身份**。默认渠道 `dev` 保持基线 `productName = 陶泥儿`、`identifier = world.genarrative.ai-game-creator`(既有安装目录、卸载项与升级链不断);其它渠道派生 `陶泥儿 <渠道显示名>`(`release` → `陶泥儿 Release`)与 `world.genarrative.ai-game-creator.<渠道>`。身份与更新端点必须在同一个构建期 `--config` 里注入,禁止分别回读默认值。窗口标题、macOS 产物名(`.app` / updater 归档 / DMG 卷名)、首装包选择与 Windows 提权 ACL 的 managed 识别范围同批跟随该身份。
|
||||
- 边界:不做本地数据迁移或共享——切渠道等于换一个客户端;`release` 与自定义渠道首次以新身份安装,不接管、不迁移既有 `dev` 安装与本地项目,由用户自行决定是否卸载其一。
|
||||
- 影响范围:新增 `apps/ai-game-creator-shell/scripts/channel-identity.mjs`;`build-release.mjs`、`build-macos-ci.mjs`、`check-config.mjs`、`agent-swarm-test-chat.mjs`、`src-tauri/src/{main.rs,windows.rs,config.rs}` 与对应测试;主规范 `docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md`。
|
||||
- 验证方式:`node --test apps/ai-game-creator-shell/scripts/build-release.test.mjs release-oss.test.mjs prepare-macos-codex.test.mjs cargo-features.test.mjs`(64/64,新增渠道身份与渠道 DMG 首装选择用例)、`node apps/ai-game-creator-shell/scripts/check-config.mjs`(基线等于默认渠道身份、非默认渠道身份隔离)、`cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell -- config::private_path_elevation_policy_tests`(12/12,含基线/`<基线>.release`/`<基线>.beta-2` 与相似前缀反向断言)、`AGC_UPDATE_CHANNEL=release npm --prefix apps/ai-game-creator-shell run build -- --no-bundle --debug`(产物字符串实测 `陶泥儿 Release` × 1、`agc/release-win/latest.json` × 1、`world.genarrative.ai-game-creator.release` × 1、`agc/dev-win/latest.json` × 0)。真机双渠道安装、并存与各自更新尚未执行,按未验证项记录。
|
||||
|
||||
## 2026-09-21 项目快照按部署渠道分区,后台按渠道查看并按素材查询口径展示用户
|
||||
|
||||
- 背景:AGC 项目快照此前统一写在 `agc/project-snapshots/v1/{user}/{project}/`,而开发与正式两套部署共用同一个 bucket(都默认 `agc-dev`)。结果是渠道混在一层前缀里:正式后台会列出开发渠道上传的项目,列表上也看不出项目属于哪个渠道;同时“项目工程”列表只有裸用户 ID,且用“加载更多”逐段追加,翻页与定位都困难。
|
||||
@@ -11,6 +35,24 @@
|
||||
- 未迁移的历史对象:`agc/project-snapshots/v1/` 下现存对象(只读核对过的两份历史清单)保留在 OSS,但不再写入、不再进入后台列表;需要取回时按旧前缀在 OSS 侧直接读取,确实要在后台看到时再单独开一个只读兼容视图。
|
||||
- 验证方式:`cargo test -p platform-oss snapshot` 7 passed(渠道校验、键布局、v2 根渠道枚举、v1 历史键仍必须私有);`cargo test -p api-server project_snapshot` 18 passed/1 ignored(渠道失败关闭、游标跨渠道拒绝、用户昵称/陶泥号解析、归档与配额回归);`cargo test -p api-server protected_route_matrix`、`route_contract` 通过(新路由纳入后台鉴权矩阵);`npm run admin-web:typecheck` 与 `npx vitest run apps/admin-web/src` 202 passed。
|
||||
|
||||
## 2026-09-21 Godot 模板入库与按模板建项的 Godot 分流
|
||||
|
||||
- 背景:模板库此前只有网页(html)、Cocos 与 Unity 占位,`runtime` 白名单早就接受 `godot`,但既没有 Godot 模板,也没有按模板建项的 Godot 分流——Godot 模板即使上传,建项也会落到 Web 分支,写出 `game/index.html` 占位入口并让 `godotProjectRoot` 为空。
|
||||
- 决策(模板内容):新增四个仓库内手写的 Godot 4.7 模板 `godot-empty-2d`、`godot-empty-3d`、`godot-hello-world`、`godot-platformer-2d`,`entry` 统一为 `project.godot`。模板只用内置 `ui_*` 输入动作、GL Compatibility 渲染,并用 `Polygon2D` / `BoxMesh` 搭可视骨架,不引入外部贴图或音频二进制;不打包 `.godot/` 缓存与导出产物。
|
||||
- 决策(建项分流):`create_project_from_installed_template_at` 在复制模板后按工程文件分流——Cocos 更新自身身份后走 Cocos 导入,Godot 先改写 `project.godot` 里 `[application]` 段的 `config/name`(只改这一行,其余字节逐字保留)再走既有 Godot 导入,写入 `godotProjectRoot: "."`,其余继续走 `init_local_game_project_at`。分流靠工程文件识别,不新增只读 `entry` 或 `runtime` 字段的契约。
|
||||
- 原因:Godot 工程身份是 `project.godot` 所在目录,与 Cocos 的 `package.json` 身份同一类问题;复用既有导入流程能同时拿到相对根记录、`.agent` 初始化与「不生成 Web 占位入口」这三条既有保证,并且与 Cocos 分支保持对称。
|
||||
- 影响范围:`apps/ai-game-creator-shell/template-library/v1/godot-*`(新增模板源)、`apps/ai-game-creator-shell/src-tauri/src/template_library.rs`、`.../src/project/manifest.rs`(`apply_godot_project_display_name`)、`.../src/project/manifest/import_tests.rs`、`docs/【模板规范】AGC模板包组织指南-2026-09-21.md`、`docs/technical/【技术方案】AGC模板库与模板建项-2026-09-17.md`。
|
||||
- 验证方式:本机 Godot `4.7.2.stable` 对四个模板逐一做「主场景实例化 + 3 帧 + GDScript `--check-only`」,平台跳跃模板另做真实物理试玩(落地 y=627.99、1 秒右移 320px、跳上平台 y=515.93、三枚金币全收集);Rust 定向回归 `import_tests::rewrites_only_the_godot_display_name_line`、`import_tests::keeps_a_godot_project_without_a_display_name_line_untouched`、`template_library::tests::godot_template_creates_native_project_with_relative_root_and_display_name` 与既有 Cocos/Web 建项回归;发布走 `--only godot-*` 定向合并。
|
||||
|
||||
## 2026-09-21 Godot 工作区发现放宽与内置插件行去掉手动启动
|
||||
|
||||
- 背景:2026-08-10 “发现与歧义决策”把「一层多命中」和「`project.godot` 必须是普通文件」两条定为失败关闭。这两种布局都会让整个工作区被判成「没有 Godot 工程」,而 `PluginHost::list` 只按发现结果过滤,结果是 Godot 内置插件在设置→扩展 里直接消失,用户看不到任何可诊断入口。
|
||||
- 决策(发现):根目录命中仍然优先;根未命中时一层直接子目录多命中改为按目录名排序取第一个,`godotProjectRoot` 记录该相对目录名,结果确定且可复现。`project.godot` 允许是符号链接 / Windows reparse point / 硬链接,判据改为「链接目标解析后是文件」,目录与悬空链接仍不算命中。工作区根本身是链接、候选子目录是链接、二层及更深不递归这三条边界不变。
|
||||
- 决策(界面):设置→扩展 的内置插件行去掉手动「启动 / 停止」按钮。启动本来就由项目切换时的 `startAvailableAgcEditorPlugins` 自动完成,手动按钮只是第二个可绕过入口;停止改走该行的启用/禁用开关,`set_agc_plugin_enabled(false)` 会停止插件并断开编辑器连接。导入扩展行的启动按钮保留,因为导入扩展没有自动启动路径。
|
||||
- 原因:Godot 插件列表是按项目过滤的,发现失败等于功能静默消失;把不确定性收敛成一个确定的排序选择,比让用户面对空列表更好。链接放宽只作用于只读的工程标记文件,受管描述文件、运行缓存与项目目录的链接拒绝规则不动。
|
||||
- 影响范围:`apps/ai-game-creator-shell/src-tauri/src/project/manifest.rs`、`.../src/commands.rs`(错误文案)、`.../src/project/manifest/import_tests.rs`、`.../src/tests/project.rs`、`apps/ai-game-creator-shell/src/features/runtime-config/RuntimeConfigDialog.tsx`、`docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md` §3.8、`docs/technical/【技术方案】AGC Godot编辑器插件接入-2026-09-20.md`、`docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md`。
|
||||
- 验证方式:`cargo test --locked -p genarrative-ai-game-creator-shell --bin genarrative-ai-game-creator-shell -- project::manifest::import_tests::` 与 `-- tests::project::`;前端 `agc:typecheck` 与 `runtime-settings` / `pluginHost` 套件。
|
||||
|
||||
## 2026-09-21 模板正文目录门禁:CLI 打包与后台上传同一份段名单
|
||||
|
||||
- 背景:模板包组织指南把 `.agent/`、`.git/`、`node_modules/`、根目录 `dist/` 等列为「不要放进 ZIP」,但两条发布路径此前只校验路径安全与 `entry` 是否存在,放进去的东西会跟着建到用户项目里(模板自带 `.agent/` 会让新项目继承一个陌生身份)。这条约定只靠作者自觉。
|
||||
@@ -58,6 +100,7 @@
|
||||
- 验证:新增 `canvas_generation_tests::spritesheet_slice_limit_matches_platform_and_tool_contract`(上限值、边界判据与文案)与 `external_generation_state_tests::legacy_result_accepts_slice_counts_up_to_platform_limit_and_rejects_beyond`(64/65/256 片必须能持久化且切片一条不少、257 片必须按同一句文案拒绝),两条都用**变异验证**确认过:把常量改回 64,回归用例立刻变红。定向执行 `cargo test -- spritesheet`(22 passed)、`cargo test -- external_generation_state_tests::`(10 passed)与两条新用例;`cargo fmt --check` 干净。
|
||||
- 影响范围:`apps/ai-game-creator-shell/src-tauri/src/agent/generation/{canvas_generation.rs,external_generation_state.rs}`(+用例)。未动平台切分、OpenAPI、数据库或前端。
|
||||
- 已知未覆盖:真实客户端复验(重新生成一次图标素材)与远程 CI 未跑;256 片时的累计下载/像素预算未实测——平台自己的总像素上限是 2048×2048,客户端预算是 4096²,按切片是整图互不重叠子矩形推算不会先撞预算,且真撞了也只是给出明确错误而不是损坏数据。
|
||||
|
||||
## 2026-09-21 本批自查(PR #441):三处修正
|
||||
|
||||
- 背景:推 PR 后按「局部到整体」自查这一批(三需求 + 验收修正),查出三条:①拖动到对话的落点在 `pointermove` 上每帧都 `setState` 一个新对象;②替换面板相对 **stage** 写死 `top: 8.5rem`(与刚修的任务开关同一类隐患:工具条换行会压上去),且它和「生成任务」面板抢画布右上角同一个位置;③替换面板不显示「在替换哪张源素材」,而非模态化之后那点线索(画布上的源素材光环)会被一次空白点击清掉。
|
||||
@@ -118,7 +161,6 @@
|
||||
- 影响范围:`server-rs/crates/api-server/src/editor_project.rs`、`server-rs/crates/api-server/src/external_editor_api.rs`、`apps/ai-game-creator-shell/src-tauri/src/agent/generation/canvas_generation.rs`、`project/resource_editor.rs` 与对应夹具。
|
||||
- 验证方式:`cargo test --locked -p api-server -- summary`(含站内 `view=summary` 跳过媒体修复、未知 view 返回 400 的新用例)、AGC 壳 `agent::generation::`(99 项)与 `project::resource_editor::`(59 项)、`cargo fmt --check`、`npm run check:encoding`、`git diff --check`。
|
||||
|
||||
|
||||
## Unity 与 Godot 常用操作指导
|
||||
|
||||
两种编辑器的操作指导复用客户端审核 Skill pack:DirectProject 通过原生 Skill 或既有审核资源读取入口按需取得,Agent Runtime 的对应执行工具说明嵌入同源参考。指南不改变插件可用性、执行授权或 Runner 回执;只读说明不能证明编辑器已连接。常用示例与执行失败/部分修改、保存、撤销边界在同一参考中维护,避免提示词和文档各存一份代码。
|
||||
@@ -205,6 +247,28 @@ Godot 编辑器操控复用既有 AGC 插件宿主、EditorAdapter、Runner 和
|
||||
- 接线:`index.tsx` 的 `submitResourceQuickEdit` 与 `submitResourceCharacterAnimation` 都在**调 `resolveResourceDeriveSource` 之前**做检查(正规化写盘发生在那一步之后),不合法时只把 `status: 'failed'` 与 Rust 原话写进各自的浮层面板并 return,不发派生请求;`assetName` 用检查结果里的 `name`。回归见 `tests/projectResourceLiveIntegration.test.tsx` 的两条「源名超 120 码点」用例与既有的合法名校验 `source-art-编辑版` / `hero-角色动画`。
|
||||
- 边界:资源画布的图片类生成走另一条门禁(`commands.rs` 的 `LOCAL_PROJECT_ASSET_MAX_ASSET_NAME_CHARS`,文案「素材名称超出安全边界」),不在本条口径内;提示词上限仍是 `resourceEditPromptMaxLength` 那一份,本决策不动它。
|
||||
|
||||
## 2026-09-19 删除 Project Supervisor 前端链路:普通项目只有 DirectProject,立项策划只有策划聊天
|
||||
|
||||
- 背景:`ProjectSupervisorView` 同时是工作台普通项目的聊天宿主、Supervisor 独立调试窗口(`?supervisor-chat` / `?agent-chat`)和纯聊天容器(`SupervisorChatOnlyView`)的入口;同一条链路还带着 `App.tsx` 里的 Supervisor 会话/运行态轮询、工作台壳的 Supervisor 运行态与专业 Agent 面板、开发态文件/记忆/资产/预览面板和 `AgentConversationOverlay`。普通项目的 DirectProject 因此长期作为「Supervisor 宿主里的一个分支」存在,Direct 自己的订阅、历史、发送、队列、附件和中止生命周期没有独立归属。
|
||||
- 决策(前端整体退役):删除 `ProjectSupervisorView`、`SupervisorChatOnlyView`、`ProjectWorkspaceChatPane`、`AgentConversationOverlay`、`DeveloperProjectPanels`、`DeveloperRuntimePanels`、`features/agent-runtime/panels.tsx`、`DeveloperAgentPanel`、`useDeveloperAgentPanel`、`useDeveloperAgentState`、`developerAgentControls`、`src-tauri/capabilities/developer.json` 与 `?supervisor-chat` / `?agent-chat` 调试入口;`App.tsx` 里只服务这些面板的 state/ref/effect/handler(`agentConversation*`、`handleFile*`、`handleMemory*`、`handleCanvas*`、`handlePreview*`、`commandLog`、`llmConfigStatus`、`editorBaseUrl`、run trace/history 面板状态等)一并删除。不保留兼容别名、feature flag、双跑路径或墓碑注释。
|
||||
- 决策(策划链路独立成模块):Design Agent 与 Planning V2 的容器与表现移入 `view/project-development/planning/`(`PlanningChatView`、`PlanningUserInputCard`、`GddApprovalCard`、`DesignAgentSurface`、`PlanningLaneRuntimeStrip`、`planningLane`、`planningSessionV2`、`planningSessionContract`),策划入口不再借用 Supervisor 的组件身份。
|
||||
- 决策(改名到中性概念):`ProjectSupervisorComponentProps → ProjectChatComponentProps`、`WorkspaceLauncherShellProps.ProjectSupervisor → ProjectChat`、`ProjectDevelopmentView.supervisor → chat`、`orchestrationMode → agentDockVisible`、`initialSupervisorMessageClaims → initialTurnClaims`(`claimInitialTurnForPage`)、`ProjectManifestSnapshotSource 'supervisor' → 'chat'`、CSS `project-supervisor-*` / `project-planning-*` → `project-chat-*`;`PROJECT_SUPERVISOR_AGENT_ID` / `PROJECT_SUPERVISOR_PLAN_SOURCE` 常量删除。
|
||||
- 决策(清单失效事件归壳):`game-creator-manifest-invalidated` 现在由工作台壳(`WorkspaceLauncher`)与 DirectProject 聊天各自订阅——壳用一次配对读(`revision → 清单 → revision`,`source: 'asset-event'`)把运行态落盘的新资源并入 `currentProjectContext`,**不**重新检查项目目录;聊天侧仍由 `useDirectProjectManifest` 刷新自己的 `@` 引用清单。
|
||||
- 决策(残留清理):随面板一起失去调用方的模块与导出一并删除,不留死代码——`features/project-workspace/projectSummaryCommands.ts`(旧 Supervisor 斜杠命令处理器,1054 行)、`app/constants.ts` 的 `AGENT_RUN_HISTORY_*`、`features/agent-runtime/model.ts` 里只被退役面板使用的 22 个导出与 `AGENT_RUNTIME_DEDICATED_CARD_TOOLS`、`features/project-summary/agentPresentation.ts` 里 17 个 Agent 面板 / LLM 配置 / 读取草稿摘要函数(含 `summarizeAgentStatusCardsForChat`、`summarizeAgentRunHistoryReadDrafts` 等),以及 `agentRunTrace` / `memoryCommands` / `projectCommandPolicy` 中失去调用方的校验与解析函数。
|
||||
- 边界:后端 Rust Runtime 的 `project-supervisor` 运行身份、`start_game_creator_supervisor_runtime_task` 命令、`agent-runtime:supervisor-*` 端到端脚本与 `project-supervisor` 提示词/工具策略不在本次删除范围内:它们是 Runtime 的 Agent 身份与既有权衡,不是前端链路。
|
||||
- 验证:全量 `npx vitest run apps/ai-game-creator-shell/tests` 126 失败 / 1517 通过 / 15 跳过(1658 条),`HEAD` 基线同口径 166 失败 / 1637 通过 / 17 跳过(1820 条):逐条比对失败集合**没有新增项**;基线里 40 条与 Supervisor 前端面绑定的失败用例随实现与用例一并删除(含旧调试窗口、开发者面板与 Agent 对话浮层的 51 条用例);剩余 115 条 appSurface 失败与 10 条 `clientApi.test.ts` 失败(jsdom `localStorage` 环境)在基线上同样失败;残留清理后按同一口径复跑,失败集合与失败条数均无变化。`npx tsc -p apps/ai-game-creator-shell/tsconfig.json --noEmit --noUnusedLocals`、prettier、eslint、`npm run check:encoding`、`npm run check:doc-index`、`git diff --check` 通过。
|
||||
- 关联文档:[ADR DirectProject 独立聊天容器与工作台钱包布局](../../adr/【ADR】DirectProject独立聊天容器与工作台钱包布局-2026-09-18.md)、[实施计划](../plans/【实施计划】DirectProject聊天模块抽离-2026-09-18.md)。
|
||||
|
||||
## 2026-09-19 DirectProject 聊天容器按「组件带逻辑」分层,线程订阅与 reducer 提成独立 hook
|
||||
|
||||
- 背景:DirectProject 聊天虽然已经搬进 `view/project-development/chat/`,但 `DirectProjectChatView.tsx` 单文件 500+ 行,表现层只按 `components/`、`composer/` 平铺文件,线程订阅(`subscribe → consume → notify`)与聊天 reducer 状态混在 `useDirectProjectChatController` 里,组件和它自己的逻辑分散在两个目录。
|
||||
- 决策(组件带逻辑):`chat/components/` 下一个组件一个目录,组件自己的逻辑与表现同目录:`ToolCallGroup/`(`ToolCallGroup.tsx` + `toolCallGroupPresentation.ts`)、`DirectProjectComposer/`(`DirectProjectComposer.tsx` + `ComposerControls.tsx` + `chatComposerQueue.ts` + `chatComposerVoice.ts`)、`DirectProjectConversation/`(`DirectProjectConversation.tsx` + `DirectProjectTurn.tsx`)、`DirectProjectChatHeader/`、`DirectProjectSettingsDialog/`。视图只做组合,不再内联渲染分区、回合和输入盒。
|
||||
- 决策(订阅与 reducer 独立 hook):新增 `chat/controller/useDirectThreadChatSubscription.ts`,持有 `subscribe → consume → notify` 单飞循环与 `DirectThreadChatState`(含通知先于订阅回执的欠账处理、`SUBSCRIPTION_EXPIRED` 重订、订阅回执锚点闸门、项目切换清理),并暴露 `entries`、`turnRunning`、`mergeHistoryItems`、`markTurnStopped`。控制器只读投影结果,历史分页仍并入同一个 reducer,不复制第二份事实源。
|
||||
- 决策(壳只传窄上下文):`DirectProjectChatView` 的公开入参只有项目路径、入口首轮需求(canonical `content[]`)和两条权限门;工作台级动作(`game.run_local` 预览结果等)不再写 `App.tsx` 的 `messages`,改由壳通过 `DirectProjectChatHandle.announce` 交给聊天自己的本地消息流,壳不持有 Direct 聊天消息。
|
||||
- 边界:不改 Tauri/Rust 命令、DTO、Thread Manager、Codex app-server、持久化事实源、路由选择、发送/队列/附件/中止/历史锚点语义;不保留旧路径 alias、双跑或兼容 fallback。
|
||||
- 验证:五个 Direct 纯模块测试 40 条通过;`appSurface.test.ts -t "direct"` 15 通过 / 4 失败,4 条与 `HEAD` 同口径基线同为失败(harness 未桩模型配置),基线同口径 14 通过 / 5 失败;全量 `appSurface.test.ts` 由基线 155 失败降到 153 失败;app `tsc --noEmit`、eslint、prettier 通过。
|
||||
- 关联文档:[ADR DirectProject 独立聊天容器与工作台钱包布局](../../adr/【ADR】DirectProject独立聊天容器与工作台钱包布局-2026-09-18.md)、[实施计划](../plans/【实施计划】DirectProject聊天模块抽离-2026-09-18.md)。
|
||||
|
||||
## 2026-09-18 Provider 瞬态重试次数严格按设置执行(游戏开发 Agent 与策划 Agent 不再被档位收进区间)
|
||||
|
||||
- 背景:AGC 客户端此前把 `agentLlm.<agent>.maxRetries` 按运行档位重新收进固定区间——`autonomous-game-build` 档位(自主构建的游戏开发 Agent 及其继承档位的专业子 Agent)被抬到 12~16,`standard` 档位(含立项策划入口的策划 Agent 与普通 Agent 对话)被压到最多 3;瞬态分类里的上游 400 还在同一预算上再收窄到 2 次。现场把 `maxRetries` 设成 5 时,游戏开发与策划两条链路都不按设置执行。
|
||||
@@ -379,6 +443,7 @@ Godot 编辑器操控复用既有 AGC 插件宿主、EditorAdapter、Runner 和
|
||||
- 决策:保留 4 片名单、`--test-threads=1`、独立 `TMPDIR` 和每片的全集/互斥校验,但把 workflow 收敛为两条 Rust lane;lane 1 顺序运行 shard 1/4、2/4,lane 2 顺序运行 shard 3/4、4/4。每条 lane 只预热一次 AGC 壳 manifest,lane 之间仍保持 job 级并发;不在同一 job 内并行多个测试进程。
|
||||
- 影响范围:`.gitea/workflows/project-ci.yml`、`scripts/project-ci-workflow.test.ts`、`scripts/check-native-shells.mjs` 与 Rust 分片说明文档。job 名称改为 `AI game creator shell Rust lane 1/2`、`lane 2/2`;分组脚本与 4 片测试名单保持不变。
|
||||
- 验证方式:运行 `npx vitest run scripts/project-ci-workflow.test.ts`、`node --test apps/ai-game-creator-shell/scripts/run-rust-shell-test-shards.test.mjs`、`npm run check:encoding` 和 `git diff --check`;真实 Gitea run 需要确认两条 lane 均覆盖两片且 smoke、crates、Backend、Native、Frontend、Repository job 仍全部上报。
|
||||
|
||||
## 2026-09-14 AGC 资源画布改为「手动整理」:新素材不再自动重排,整张重排只由「整理画布」发起
|
||||
|
||||
- 背景:生成一张新素材会让整张资源画布重排。两个 layout hook 都把 `rederiveAutomaticPositions` 打开(type 侧无条件 `true`,dependency 侧长期等于 `resourceGraphReady`),而该开关的语义是「每次资源协调签名变化就丢掉全部 `manuallyPlaced=false` 坐标、按当前资源与拓扑整体重算」;新增一张素材必然改签名,于是既有自动卡全部跟着挪位,用户刚记住的位置就没了。画布上也没有任何显式整理入口(`复位资源视图` 只复位视口)。
|
||||
@@ -8250,7 +8315,7 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
|
||||
## 2026-08-10 AGC 打开现有 Godot 项目
|
||||
|
||||
- 项目双根决策(2026-08-14 更新):项目组只保留通用“打开项目 / 新建项目”,不再提供独立 Godot 入口。用户选择目录始终是工作区根,也是 `.agent`、Session、Runner、沙箱、通用文件工具和外围资料的唯一授权根;实际 Godot 根由根目录或一层直接子目录中的普通文件 `project.godot` 唯一确定,并以工作区相对 `godotProjectRoot` 记录,根目录使用 `.`。不得把 Runtime 根切换成 Godot 子目录,也不得复制工程或建立第二套工作区。
|
||||
- 发现与歧义决策:根目录命中优先;根未命中时只检查一层直接子目录,唯一命中才通过,多个命中在任何 `.agent` 写入前失败关闭。候选目录与工程文件拒绝符号链接和 Windows reparse point,二层及更深不递归。未来只有 Godot 专属命令显式使用经过校验的相对 Godot cwd。
|
||||
- 发现与歧义决策:根目录命中优先;根未命中时只检查一层直接子目录,唯一命中才通过,多个命中在任何 `.agent` 写入前失败关闭。候选目录与工程文件拒绝符号链接和 Windows reparse point,二层及更深不递归。未来只有 Godot 专属命令显式使用经过校验的相对 Godot cwd。(2026-09-21 部分取代:多命中改为按目录名排序取第一个,`project.godot` 允许链接并按目标判定;候选子目录与更深层的边界不变,见本文件「2026-09-21 Godot 工作区发现放宽与内置插件行去掉手动启动」。)
|
||||
- 元数据决策:首次导入只在工作区根创建并保留 `.agent/manifest.json`、`.agent/agent.db`、`.agent/logs/` 与 `.agent/runtime/`;不得创建默认 Web 原型的 `game/`、`assets/`、`memory/`、`exports/`。已有有效 `.agent` 项目继续复用身份;缺失或错误的可推导 `godotProjectRoot` 只在 Godot 打开边界按唯一文件布局校准,歧义时不改写。
|
||||
- Windows 锁文件决策:提升权限进程新建 `.agent/.manifest.json.lock` 时,Windows 可能把 owner 设为 `Administrators`。仅在固定锁路径已取得不共享独占句柄并确认是普通、非 reparse、单链接文件后,才初始化为当前 `TokenUser`;随后再次复核句柄并执行原有 owner/DACL 校验,不放宽既有异常对象的安全规则。
|
||||
- 运行决策:Godot 项目提交给 Project Supervisor 时使用 `standard` Run Profile,避免触发 Web 专用 `game/index.html`、HTTP preview 与自主 Web 完成门。Godot 编辑器启动和内嵌运行预览不在本切片范围。
|
||||
@@ -9027,7 +9092,7 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
|
||||
- 决策(矩阵):`ui-interaction` = 生成图片 / 生成规范(图标规范、自定义规范)/ 生成图标素材 / 生成 UI 设计图 / 上传;`character` = 生成图片 / 生成规范(角色规范、自定义规范)/ 生成角色形象 / 上传;`scene` = 生成图片 / 生成规范(自定义规范)/ 上传;`audio` = 生成背景音乐 / 生成音效 / 上传。文档、待归类、项目版本、「所有资源」展开态与资源总览**不渲染**工具栏(`resolveResourceCanvasBottomTools` 返回空数组,渲染判据 `resourceBookState.view === 'child'` 且 category 命中四个栏目)。工具项与顺序是纯数据表,事实源落在 `resourceCanvasBottomToolbarModel.ts`。
|
||||
- 决策(落点与几何):工具栏是 `.game-resource-book-manager` 的**直接子节点**(与画本场景、右下 Dock、通知条并列,不进带 `scale()` 的场景层),锚在**左下角**(`left/bottom: 14px; z-index: 40`)——右下角是既有缩放 / 撤销 Dock,左下角是画布上唯一两者都不占的稳定空位;外壳消费共享 `packages/image-canvas-react` 的 `CanvasToolbar / CanvasToolbarGroup / CanvasChromeButton`(AGC 侧第一次真正消费这组共享 chrome)。一处必要覆盖:共享 `.genarrative-image-canvas__toolbar` 是横向滚动容器,会裁掉它自己弹出的二级菜单,消费端改成 `overflow: visible` + `flex-wrap: wrap`。
|
||||
- 决策(接线与收敛):图片类入口 `generate_local_project_asset`(kind 映射:图片 `image` / 角色形象 `character` / 图标规范 `icon-spec` / 角色规范与自定义规范 `spec` / 图标素材 `art-spritesheet` / UI 设计图 `ui-prototype`);音频入口复用既有 `derive_local_project_resource` 无源生成链路(**不另写一份音频生成**);上传复用 `upload_local_asset`。两者成功后的刷新形状统一为「**配对读 `(revision, manifest)`** → `onManifestChange` → `pendingResourceFocusRef` 定位新卡」,不重算依赖图、不另写布局。**音频入口收敛**:既有「生成素材」浮层入口改为只保留视频(`ResourceCanvasGenerationPanelView` 新增 `kinds` prop,单类型入口不再渲染类型选择器,面板标题与提交文案跟类型走),视频能力不删只是不进工具栏。
|
||||
- 决策(参数口径,避免假控件):比例 / 尺寸选项与默认值复用网页端纯模型 `ImageCanvasGenerationModel.ts`,但按本地 IPC 白名单收窄(本地通道明确拒绝 `4:3`,照搬就是一个点了必失败的选项);提示词上限复用 `resourceEditPromptMaxLength`(32000,与 Rust `LOCAL_PROJECT_ASSET_MAX_PROMPT_CHARS` 同口径);**面板不渲染模型选择器**(本地 IPC 没有 `model` 入参)。规范入口是固定档:只读展示规格,不给点了不生效的比例控件。
|
||||
- 决策(参数口径,避免假控件):比例 / 尺寸选项与默认值复用网页端纯模型 `ImageCanvasGenerationModel.ts`,但按本地 IPC 白名单收窄(本地通道明确拒绝 `4:3`,照搬就是一个点了必失败的选项);图标素材描述去除首尾空白后最多 `200` 个 Unicode 字符,作为唯一 `iconDescriptions` 元素原样提交,不包装、截断或拆条;其余图片提示词上限为 `32000`,前端与 Rust 原生校验保持一致;**面板不渲染模型选择器**(本地 IPC 没有 `model` 入参)。规范入口是固定档:只读展示规格,不给点了不生效的比例控件。
|
||||
- 决策(前置规范图,本轮的关键设计):`ui-prototype` 与 `art-spritesheet` 在 Rust 侧要求项目里已有登记并绑定当前账号的 `assets/art-spec.png`(`local_path` 精确匹配 + `kind == icon-spec` + 图片媒体类型 + 画布来源)。前端判据 `projectHasIconSpecReference` 与它逐字对齐;缺前置时入口**保持可点击**并给可执行原因(`aria-disabled` 而非原生 `disabled`,文案含 `assets/art-spec.png` 与「生成规范 → 图标规范」),且零生成请求。**同时**把「图标规范」入口在缺前置时按 `assets/art-spec.png` 落盘(`outputPath`),否则那两条入口会被前置条件永久锁死、工具栏自身无法满足自己的前置;已有权威规范图时不再传 `outputPath`(Rust `replace_existing` 固定 `false`,指向已存在文件会被硬拒),改为生成一张新的普通图标规范资产。这条是**前端策略**,不扩接口。
|
||||
- 已知能力缺口(用户口径是「缺参数就停下汇报,不自行扩接口」,记账备查):本地 IPC 没有 ① `model` ② `specType` ③ `replaceExisting` 入参。后果:面板不给模型选择;**角色规范与自定义规范共用 `spec` 通道**(靠 `assetName` / 提示词区分),因此「角色规范」不是真正的角色设定板通道;权威规范图存在时无法重写它。另:网页端 composer 子视图(含 `ImageCanvasSpecGenerationPanelView` 直连 `/api/editor/llm/icon-specs/*`)**没有复用**,因为 AGC 无该 BFF 通道且本地 IPC 不接受模型 / 参考图入参,照搬会渲染改不了请求的控件——本轮只把**纯模型**接进来。
|
||||
- 影响范围:`apps/ai-game-creator-shell/src/features/resource-canvas/{resourceCanvasBottomToolbarModel.ts,ResourceCanvasBottomToolbarView.tsx,ResourceCanvasAssetGenerationPanelView.tsx,ResourceCanvasGenerationPanelView.tsx,resourceCanvasChrome.css}`、`apps/ai-game-creator-shell/src/view/project-development/index.tsx`、测试 `apps/ai-game-creator-shell/tests/{resourceCanvasBottomToolbar.test.tsx(新增),resourceCanvasGenerationEntry.test.tsx,projectResourceLiveIntegration.test.tsx,appSurface/project-development.suite.ts}`、PRD §3.10 / §7.9 / §8、`docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md`(新增)、验收用例 S11 / S11a。**未动**:Rust、external v1 / OpenAPI、`packages/`(只消费共享 chrome)、SpacetimeDB。
|
||||
@@ -9112,6 +9177,22 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
|
||||
- 关联规范:`docs/technical/【技术方案】AGC模板库与模板建项-2026-09-17.md`;开发期计划见 `docs/project-memory/plans/【里程碑】AGC模板库客户端接入-2026-09-17.md` 与对应实施计划。
|
||||
- 验证:Rust 模板库 8 项定向单测、前端模型 9 项单测、AGC `tsc` 类型检查通过;`templates/index.json` 匿名可读且每个 `zipKey` 回读 SHA-256 与清单一致;发布脚本 `scripts/agc-template-library-publish.mjs` 支持 `--dry-run` 与上传后回读校验。
|
||||
|
||||
## 2026-09-16 DirectProject 上传文件统一使用附件 content part
|
||||
|
||||
- 决策:DirectProject 本地上传不区分图片与其它文件。用户使用同一个文件入口,前端不按 `mediaType` 做图片判断,所有上传文件统一写成 `agc_attachment_reference`;项目资源 `@` 引用仍使用 `agc_resource_reference`。
|
||||
- 原因:原 `agc_image_reference` 与附件 payload 完全相同,Rust wire 投影也把两者合并成同一段文本,不能代表真实的多模态图片输入。保留该 discriminator 只会制造错误语义。
|
||||
- 边界:本次不新增 `input_image`,不保留图片类型兼容分支,不迁移旧历史;图片多模态能力未来单独设计独立 payload 与 wire 投影。
|
||||
|
||||
## 2026-09-17 DirectProject canonical content 的有效性只判整条 content
|
||||
|
||||
- 决策:canonical user item 的有效输入判据只落在**整条 content** 上——只要有一段非空白文本、或任何一个非文本 part 就算有效输入;单个纯空白 `input_text`(段落分隔、软换行、chip 后的分隔空格)是合法 part。Rust `validate_direct_codex_user_item` 的 `content_has_meaningful_input` 与前端 `hasMeaningfulDirectCodexContent` 同口径,`wire.rs` 的「不能转换为空 prompt」只作兜底。
|
||||
- 决策:编辑器投影层(`ResourceReferenceInput` 的 `collectDraftParts`)原样透传编辑器节点:不做空白过滤,也不与相邻 part 合并。前端不替用户改写他输入的内容,canonical content 与编辑器内容逐字对应。
|
||||
- 决策:content → 可读文本只有 `directCodexContentToPromptText(content, assets)` 一个口径,`assets`(当前项目 manifest)必填:消息正文、队列 chip 文案、润色判据、草稿持久化与出站 prompt 全部由它派生,`agc_resource_reference` 按 `@显示名` 展开,只有素材已不在清单里时才回落 `resourceId`。
|
||||
- 原因:`3c7b02b9f` 为了让 content 通过「空 `input_text`」校验而在投影层丢空白 part,把引用后的段落分隔一起丢了(`@素材` 与下一段粘成一个词);`41366dd71` 又把消息 / 队列 / 快速编辑的文本派生切到这条投影上,缺陷扩散到界面与出站 prompt。
|
||||
- 边界:不新增 content part 类型,不迁移历史(历史 content 原样回放),不为旧口径保留兼容分支;前端仍不发整条全空白的一轮,app-server 输入里出现纯空白 text item 由本决定接受。
|
||||
- 验证:Rust `validation.rs` / `wire.rs` 用例「单个纯空白 part 通过校验、整条全空白拒绝」;AGC 侧 `resourceReferenceInput.test.tsx`、`resourceReferences.test.ts`、`appSurface/project-development.suite.ts`(Godot 回合)、`projectResourceLiveIntegration.test.tsx` 改为按逐字投影断言,`ai-game-creator-shell:typecheck` 与定向 vitest 通过。
|
||||
- 关联规范:`docs/project-memory/plans/【里程碑】DirectProject canonical content严格边界-2026-09-16.md`。
|
||||
|
||||
## 2026-09-16 CI 宿主 CPU 上限:Jenkins 16 核 / Gitea Actions runner 12 核
|
||||
|
||||
- 背景:`genarrative-station`(32 逻辑核)上 Jenkins Built-In Node 与 Gitea Actions runner 共用同一宿主。Jenkins `jenkins.service` 原先没有任何 CPU 限制(`cpu.max=max`),构建期 Web / Api / Stdb 三分支并行(Vitest 8 线程 + 两次默认 32 job 的 cargo)把整机顶到 80%~95%;`gitea-runner` 容器 `--cpus=24`(75%)在 push 触发的 CI 波峰里实测峰值 24.8~25.3 核,是同一时间窗里更大的单一消耗方。
|
||||
@@ -9213,26 +9294,31 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
|
||||
- 验证:定向 `projectResourceLiveIntegration`(32 条,三条断言面板留在失败态的用例按新口径改写为「重开面板再重试,身份不变」)、`resourceCanvasQuickEditDraft`(10 条)、`resourceCanvasFloatingDismiss`(18 条)全绿;`npm --prefix apps/ai-game-creator-shell run typecheck` 通过。
|
||||
- 合并前复核(2026-09-21):合并 master 后按**仓库根**跑全量 `npx vitest run`,**373 个测试文件全过、4512 通过 / 34 跳过 / 0 失败**;PR #419 显示 `No Conflicts`。真实客户端观感与远程 CI 未复验(后者按用户要求不追,runner/镜像问题见 Issue #431)。
|
||||
|
||||
## 2026-09-22 运行 / 预览的过程反馈退出对话区:改 toast + 运行区域小字
|
||||
## 2026-09-21 统一错误事件额外投影到 AppData 应用日志
|
||||
|
||||
- 背景:客户端验收反馈——点播放,以及 `/preview`、`/open-preview`、生成后自动启动预览,都会往对话区写一条 assistant 提示(`运行通过,已载入客户端运行视图:http://127.0.0.1:63155/` 这类)。它常驻在对话底部遮挡运行画面,也让对话区混进非对话内容。
|
||||
- 决策:对话区只保留对话内容(用户消息、Agent 回复、run trace 摘要、命令确认与错误)。运行 / 预览成功的反馈改由两条通道承载:① 工作台壳的 toast(`ProjectSupervisorComponentProps.onRunNotice` → `RunNoticeToast`,2.6 秒自动收起,同一句连续触发会重新计时);② 运行表现层预览框**上方**的小字(`已载入客户端运行视图:<url>`,只在有活预览时出现,不占位)。失败仍留在对话区——用户需要知道为什么没跑起来;`/preview-status` 这类命令问答也保留在对话区。
|
||||
- 影响面:`apps/ai-game-creator-shell/src/App.tsx`(四处成功分支)、`src/features/app-shell/{model.ts,WorkspaceLauncher.tsx,RunNoticeToast.tsx}`、`src/view/project-development/index.tsx`、`src/styles.css`;随字符串守卫 `apps/ai-game-creator-shell/scripts/check-config.mjs` 与 `scripts/check-native-shells.mjs` 同步改判据。
|
||||
- 验证:`appSurface` 全量 539 通过 / 17 跳过、0 失败;AGC 壳目录全量 169 文件 2146 通过 / 22 跳过;`tests/runNoticeToast.test.tsx` 3 条;`npm run agc:typecheck`(含 check-config)与 `npm run check:native-shells:contract` 通过;真机观感未复验。
|
||||
- 背景:`direct-codex-failure:v2 ... 详情:.agent/runtime/errors/error-<id>-9.json`(例如 `stage=code-generation code=turn-idle-timeout`)里的诊断正文只落在项目目录,而“报告问题”只上传 AppData `diagnostics/application.log`;用户提交上来的失败消息因此只有一个指向项目文件的引用,团队复现不到 stderr 摘要、退出状态这些真因。
|
||||
- 决策:统一错误写入边界 `agent/runtime_error.rs` 在落 `.agent/runtime/errors/<eventId>.json` 之前先把同一份已脱敏诊断投影成应用日志两行——`agent.runtime.error`(身份行:eventId / source / stage / code / retryable / clientTurnId / elapsedMs / detailRef)与 `agent.runtime.error.detail`(详情行:hint / summary / detail / metadata)。字段仍只从 sidecar 那份 diagnosis 来,不新增第二份来源;落盘前 summary 按 320 字符、detail / metadata 按(1200 / 200 字符)预算脱敏截断(`direct_tool_bridge` 会把它当自由文本传工具错误原文,而 `app_log!` 同时写 stderr,那里没有 `sanitize_diagnostic_message` 兜底),自由文本先压平换行。
|
||||
- 决策(两行而不是一行):整行一旦命中 `sanitize_diagnostic_message` 的凭据标记(token / bearer / authorization / credential / api key)会被整体替换成 `<sensitive diagnostic details redacted>`;拆开后详情行即使被吃掉,身份行仍能定位 eventId 与 detailRef。后续复核发现:裸词标记(例如 `credential rotation failed`)脱敏消不掉,summary 留在身份行时仍会连 eventId 一起被替换,因此 summary / hint 等自由文本一律只放详情行,身份行只留程序生成与调用方常量字段。
|
||||
- 边界:进程内错误报告事件池(`error_report`)与项目内 `.agent/runtime/errors/<eventId>.json` sidecar 是两套东西——本次只把 sidecar 的同一份诊断作为**应用日志行**落盘,不进事件池、不改报告上传协议、不改 `read_agent_runtime_error_detail` 详情入口。
|
||||
- 影响面:只改 `apps/ai-game-creator-shell/src-tauri/src/agent/runtime_error.rs` 这一处写入边界(覆盖 direct-codex / agc-tools / agent-runtime 三类来源);sidecar schema、对话投影、前端详情入口与错误报告协议均未改动。
|
||||
- 验证:`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml runtime_error`(7 passed,含新增 `error_event_app_log_lines_keep_identity_and_redact_detail`)与 `-- direct_runtime direct_tool_bridge`(131 passed)全绿;`cargo fmt --check`、`npm run check:encoding`、`git diff --check` 通过。
|
||||
|
||||
## 2026-09-22 运行页收口:状态行两条信息同在画面外、生成任务入口不进运行页
|
||||
## 2026-09-21 画布生成面板:重开草稿、重试身份与提交载荷全部收敛到一份 canonical content
|
||||
|
||||
> 状态行与预览地址小字已被同日下一条取代(地址改顶栏按钮、版本入口并入顶栏);「生成任务不进运行页」这条仍然有效。
|
||||
- 背景:DirectProject composer 收口到 `content[]` 之后,栏目画布的图片类生成浮层仍留着第二套形状——面板里 `prompt` + `references` 两份 state,重开草稿 `ResourceCanvasAssetGenerationPanelDraft` 与重试身份 `boundRequestRef` 也是 `prompt + 参考身份`,`directCodexContentToLegacyContentDto` 因此在面板渲染、关闭草稿、重试判据、宿主入队四个边界各算一遍;同时草稿用「正文 + 引用列表」两条线重建编辑器输入,`@显示名` 与引用 chip 会重复成 `@素材-a@素材-a`。
|
||||
- 决策(一份事实源):图片类生成面板的 state、重开草稿、重试身份判据与 `ResourceCanvasAssetGenerationSubmitInput` 统一只有 `content[]`(外加素材名 / 比例 / 尺寸三个非文本参数)。重试身份改用 `directCodexContentKey` 做粒度无关的内容指纹比对(合并相邻 `input_text`、丢空串),不再单独冻结 `referenceIds` + `prompt`;`resourceCanvasAssetGenerationReferenceIdsMatch` 随之删除。
|
||||
- 决策(DTO 只在出站边界):`directCodexContentToLegacyContentDto` 的 `text` / `references` 只在**任务落账**(`createResourceCanvasAssetGenerationTask`)那一处派生,面板与宿主 state 不再持有该 DTO 的第二份形状;账本回到草稿的反向翻译集中在宿主重开路径的 `legacyContentDtoToContent`。
|
||||
- 决策(反解析只有一条):legacy「text + references」→ content 走与润色回写同一套 token 扫描(`@显示名` / `$名称` / `@附件名`,`buildContentFromTextTokens`),命中的位置换回真 part、文本里找不到的补末尾。`directCodexContentToLegacyContentDto` 遇到 manifest 里已不存在的资源引用时合成 `kind: unknown` 的占位引用而**不再丢弃**,让「已不在当前项目」的判据照样能触发。
|
||||
- 决策(空白口径):`directCodexContentToPromptText` 逐字投影、不再 `trim`(前端只在整条 content 上判空);出站提示词的收边规范化收敛成一个共享函数 `resourceCanvasAssetGenerationPromptText`,面板校验与任务落账共用,图集走 Unicode White_Space、其余走 JS 口径。
|
||||
- 影响面:`apps/ai-game-creator-shell/src/features/{project-workspace/resourceReferences.ts,project-workspace/ResourceReferenceInput.tsx,resource-canvas/ResourceCanvasAssetGenerationPanelView.tsx,resource-canvas/resourceCanvasAssetGenerationTaskModel.ts,resource-canvas/resourceCanvasAssetGenerationReferenceModel.ts}`、`apps/ai-game-creator-shell/src/view/project-development/index.tsx` 与对应 6 个定向测试文件。
|
||||
- 验证:定向 `resourceCanvasAssetGenerationReferences` / `resourceCanvasAssetGenerationBackgroundClose` / `resourceCanvasBottomToolbar` / `resourceCanvasGenerationFloatingPanel(Chrome)` / `resourceReferenceInput` / `resourceReferences` / `resourceCanvasAssetGenerationTasksPanel` 全绿;全量 `npm run test -- apps/ai-game-creator-shell/tests` 只剩 `clientHttp` / `clientApi` / `clientAuthStorage` / `projectCreationDirectory` / `recentProjectsHook` 五个 jsdom `localStorage` 环境用例红(与本次改动无调用关系);TS typecheck、`check:encoding`、`git diff --check` 通过。未复核真实客户端观感。
|
||||
|
||||
- 背景:运行页的版本入口是绝对定位压在游戏画面上(`top: 20px; right: 20px`),预览地址小字在画面外,两者既不对齐又各挡一块画面;右上角还叠着「生成任务」开关(或展开的面板)。
|
||||
- 决策:运行区域上方新增状态行 `.game-run-status-bar`,左边预览地址小字(单行省略 + `title` 给全量地址),右边版本入口,两者同在游戏画面**之外**、同一层级(版本入口去掉绝对定位,靠 `margin-left: auto` 贴右)。运行页不再挂 `ResourceCanvasAssetGenerationTasksPanelView`:入口、面板、锚点都不渲染,`[data-generation-tasks-placement='run']` 那一档坐标与组件 `placement` 联合类型里的 `run` 一并删除;任务不丢,切回资源页即可见。
|
||||
- 影响面:`apps/ai-game-creator-shell/src/view/project-development/index.tsx`、`src/styles.css`、`src/features/resource-canvas/{ResourceCanvasAssetGenerationTasksPanelView.tsx,resourceCanvasAssetGenerationTasksSidebar.css}`;用例新增 `tests/gameRunStatusBarStyle.test.ts`,并改 `tests/resourceCanvasAssetGenerationTasksSidebarStyle.test.ts`、`tests/resourceCanvasAssetGenerationTasksPanel.test.tsx`、`tests/resourceCanvasGenerationTasksSidebarDismiss.test.tsx`、`tests/appSurface/project-development.suite.ts`(原来钉着「入口在运行页签常驻」的那条按新口径改写)。
|
||||
- 验证:`appSurface` 全量 539 通过 / 17 跳过、0 失败;AGC 壳目录全量 170 文件 2150 通过 / 22 跳过;`npm run agc:typecheck`、`npm run check:native-shells:contract`、编码检查与 `git diff --check` 通过;真机观感未复验。
|
||||
## 2026-09-22 运行页收口:过程提示退出对话区,顶栏统一承载运行入口
|
||||
|
||||
## 2026-09-22 运行页顶栏收口:预览地址改按钮、版本入口并入顶栏同一套皮
|
||||
|
||||
- 背景:上一条把预览地址做成画面外的一行小字、版本入口挪到它旁边,但仍是「画面外一条常驻文字 + 顶栏另一套控件皮」:长 URL 既占位又不可点,版本入口与「打开项目目录 / 点选素材」也不像同一套控件。
|
||||
- 决策:① 运行区域上方那条状态行(`.game-run-status-bar` / `.game-run-status-hint`)整体删除,运行画面回到两行栅格;② 预览地址不再以文字出现,改成顶栏动作区里的一枚「在浏览器打开」按钮(opener 插件的 `openUrl`,`opener:default` 已放行 `http://127.0.0.1:*`),只在有活预览时渲染;③ 版本入口搬进同一个顶栏动作区,外观直接由 `.game-workbench-view-actions button` 给,不再自带 border / background / color / hover——`.game-run-version-picker` 也不再是绝对定位浮层。
|
||||
- 边界:预览的**启动与切换**仍然只走内置运行画面、不自动开系统浏览器(`scripts/check-native-shells.mjs` 那条负向守卫保持原样,本轮只补「入口只有顶栏这一枚按钮」的正向断言);「在浏览器打开」失败时把原因交给 `onNotice` 弹失败色 toast,不写进对话区、也不在工具条里另造提示位。
|
||||
- 影响面:`apps/ai-game-creator-shell/src/view/project-development/index.tsx`、`src/styles.css`、`src/features/app-shell/{model.ts,RunNoticeToast.tsx,WorkspaceLauncher.tsx}`(`onRunNotice` 改成带 `tone` 的对象)、`src/App.tsx`(四处调用点);用例新增 `tests/runPreviewBrowserOpen.test.tsx`、`tests/gameRunToolbarActionsStyle.test.ts`,删除 `tests/gameRunStatusBarStyle.test.ts`,并改 `tests/runNoticeToast.test.tsx`、`tests/appSurface/project-development.suite.ts`。
|
||||
- 验证:`appSurface` 全量 539 通过 / 17 跳过、0 失败;AGC 壳目录全量 171 文件 2153 通过 / 22 跳过;`npm run typecheck`、`npm run check:native-shells:contract`、编码检查与 `git diff --check` 通过;真机观感未复验。
|
||||
- 背景:点播放(以及历史上 `/preview`、`/open-preview`、生成后自动启动预览)都会往对话区写一条 assistant 提示(`运行通过,已载入客户端运行视图:http://127.0.0.1:63155/` 这类)。它常驻对话底部遮挡运行画面,也让对话区混进非对话内容;运行页本身还有三处遮挡与两套皮:预览地址是一行常驻小字(不可点)、版本入口是绝对定位压在画面右上角的浮层、右上角还叠着「生成任务」开关。
|
||||
- 决策(对话区只留对话内容):运行 / 预览成功的反馈不再进对话区,改走工作台壳的 toast——`ProjectChatComponentProps.onRunNotice` → `RunNoticeToast`(2.6 秒自动收起,同一句连续触发重新计时,`tone` 决定成功 / 失败观感)。失败(启动预览失败、在浏览器打开失败)也走这条通道,不再往对话区写过程行。
|
||||
- 决策(运行页顶栏是唯一入口):运行区域上方的状态行与预览地址小字整体退役(运行画面回到两行栅格);预览地址改成顶栏动作区里的一枚「在浏览器打开」按钮(opener 插件的 `openUrl`,只在有活预览时渲染);版本入口搬进同一个顶栏动作区,外观复用 `.game-workbench-view-actions button` 的基础规则,不再自带边框 / 底色 / hover,也不再是绝对定位浮层。
|
||||
- 决策(运行页不挂生成任务):`ResourceCanvasAssetGenerationTasksPanelView` 只在资源画布 / UI 编辑器出现,运行页的入口、面板与锚点都不渲染;`[data-generation-tasks-placement='run']` 那一档坐标与组件 `placement` 联合类型里的 `run` 一并删除。任务不丢,切回资源页即可见。
|
||||
- 边界:预览的**启动与切换**仍然只走内置运行画面、不自动开系统浏览器——`scripts/check-native-shells.mjs` 那条负向守卫保持原样,本轮只补「浏览器入口只有顶栏这一枚按钮」的正向断言。
|
||||
- 影响面:`apps/ai-game-creator-shell/src/{App.tsx,styles.css,view/project-development/index.tsx,features/app-shell/*,features/resource-canvas/*}`;用例新增 `tests/runPreviewBrowserOpen.test.tsx`、`tests/runNoticeToast.test.tsx`、`tests/gameRunToolbarActionsStyle.test.ts`,改写 `tests/previewActivation.test.tsx`(原断言「聊天里出现已载入运行视图」的地方改为断言 toast 通道 + 对话容器里没有这类提示)与 `tests/appSurface/project-development.suite.ts` 的生成任务入口用例。
|
||||
- 验证:`appSurface` 全量、AGC 壳目录全量、`npm run typecheck`、`check:native-shells:contract`、`check:encoding`、`git diff --check` 全绿;真机观感未复验。
|
||||
|
||||
@@ -28,15 +28,15 @@ AI 游戏创作 / DirectProject / UI workflow:
|
||||
3. `docs/technical/【技术方案】DirectProject客户端Skill与MCP扩展导入方案-2026-08-31.md`
|
||||
4. `docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md`
|
||||
5. `docs/technical/【技术方案】立项策划Agent(Fast GDD)-2026-08-10.md`(历史 V1 方案,仅供追溯)
|
||||
2. `docs/technical/【技术方案】DirectProject Codex原始历史与异常恢复-2026-09-04.md`
|
||||
3. `docs/technical/【技术方案】DirectProject客户端Skill与MCP扩展导入方案-2026-08-31.md`
|
||||
4. `docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md`
|
||||
5. `docs/technical/【技术方案】立项策划Agent(Fast GDD)-2026-08-10.md`
|
||||
6. `docs/technical/【技术方案】DirectProject本轮附件路径映射-2026-08-31.md`
|
||||
7. `docs/technical/【技术方案】Direct回合行为审计账本-2026-08-31.md`
|
||||
8. `docs/technical/【技术方案】GameAgent资源自由画板与快速编辑-2026-08-20.md`
|
||||
9. `docs/【技术方案】UI工作流资源桥接与Runtime执行-2026-08-24.md`
|
||||
10. UI 编辑器、宿主壳和当前测试专题文档
|
||||
6. `docs/technical/【技术方案】DirectProject Codex原始历史与异常恢复-2026-09-04.md`
|
||||
7. `docs/technical/【技术方案】DirectProject客户端Skill与MCP扩展导入方案-2026-08-31.md`
|
||||
8. `docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md`
|
||||
9. `docs/technical/【技术方案】立项策划Agent(Fast GDD)-2026-08-10.md`
|
||||
10. `docs/technical/【技术方案】DirectProject本轮附件路径映射-2026-08-31.md`
|
||||
11. `docs/technical/【技术方案】Direct回合行为审计账本-2026-08-31.md`
|
||||
12. `docs/technical/【技术方案】GameAgent资源自由画板与快速编辑-2026-08-20.md`
|
||||
13. `docs/【技术方案】UI工作流资源桥接与Runtime执行-2026-08-24.md`
|
||||
14. UI 编辑器、宿主壳和当前测试专题文档
|
||||
|
||||
图片画布 / 媒体生成:
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user