修复DirectProject canonical内容边界(review 第 8 条)

- 移除 chatComposerDraftToDirectCodexUserItem 对纯空白 input_text 的预过滤,原样传递 draft.content
- ChatComposerDraft 只保留 canonical content,删除 text / references 旧字段
- 新增 directCodexContentToPromptText、hasMeaningfulDirectCodexContent、directCodexUserItemFromContent 供 caller 与展示派生
- 删除 executeChatAgentReply 的 userItem 兜底分支,首页首轮、队列出队、普通提交与策略重试显式构造 canonical user item
- QueuedChatTurn 只保存 clientTurnId 与 userItem,队列 chip 文案由 content 派生
- 旧 Planner / legacy Supervisor caller 显式构造纯文本 item 并留下迁移 TODO
- 资源输入区对外只暴露 canonical content,内部文本草稿改为文本 → content 重建
- 迁移草稿、润色、队列与 appSurface 测试 fixture 到 content-only
- 更新 canonical content 里程碑与实施计划文档结论
This commit is contained in:
2026-09-16 17:46:41 +08:00
parent f4b496caca
commit 41366dd71d
14 changed files with 551 additions and 410 deletions
@@ -1,10 +1,10 @@
# 【实施计划】DirectProject canonical content 严格边界
| 字段 | 值 |
| --- | --- |
| 字段 | 值 |
| --------- | ------------------------------------------------------------------------------------------- |
| Milestone | `docs/project-memory/plans/【里程碑】DirectProject canonical content严格边界-2026-09-16.md` |
| Status | in-progress |
| Owner | Codex |
| Status | implemented |
| Owner | Codex |
## 实施顺序
@@ -14,6 +14,13 @@
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 相关测试和当前里程碑文档。
@@ -1,21 +1,22 @@
# 【里程碑】DirectProject canonical content 严格边界
| 字段 | 值 |
| --- | --- |
| Version | 1.0 |
| Status | proposed |
| Date | 2026-09-16 |
| 字段 | 值 |
| ----------- | ------------------------------------------------ |
| Version | 1.0 |
| Status | implemented |
| Date | 2026-09-16 |
| Parent Spec | `docs/【功能说明】AGC聊天素材引用-2026-09-08.md` |
## 目标
让 DirectProject 的用户消息只以 `content[]` 作为 canonical 输入:保留 Lexical 产生的全部 content part(包括纯空白 `input_text`),只在最终 content 上判断是否存在有效输入;所有 Direct Codex caller 必须显式提供完整 `userItem`。
让 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。
@@ -31,11 +32,18 @@
- `chatComposerDraftToDirectCodexUserItem` 输出与输入 `draft.content` 顺序和值完全一致。
- 只有当最终 content 不含非空文本且不含任何非文本 part 时,发送入口才拒绝本轮。
- Direct Codex 路径不存在 `userItem ?? ...` 或等价 fallback。
- `ChatComposerDraft` 只有 `content` 一个字段;`text` / `references` 不再是草稿契约的一部分。
- 首页首轮、普通聊天、队列出队、策略确认重试均发送同一个 canonical user item 语义。
- 旧 Supervisor/Planning caller 上有明确 TODO,且不进入 Direct Codex canonical 发送路径。
## 实现结论
- 唯一的前端空白过滤留在 Lexical 投影层:`agc_attachment`/`input_text` 之外的纯空白文本不作为 content part,因为 Rust `validate_direct_codex_user_item` 会拒绝空 `input_text`。转换函数不再重复过滤。
- 显示文本、队列 chip 文案、草稿持久化和润色判据统一由 `directCodexContentToPromptText(content, assets)` 从 content 派生,不再维护并行的 `text` 字段。
- 需要文本草稿的旧入口(`replaceText`、快速编辑)仍由编辑器把文本 + 引用重建为 content,方向是「文本 → content」,不存在「legacy 字段 → content」的回退。
## 证据
- 前端 canonical content、有效性判断、caller 与队列定向测试。
- AGC shell 类型检查与定向 Vitest。
- `npm run check:encoding`、`git diff --check`、必要的文档索引检查。
- `apps/ai-game-creator-shell/tests/resourceReferences.test.ts`:content 原样传递、空白 part 保留、有效性判断、文本派生。
- `apps/ai-game-creator-shell/tests/resourceReferenceInput.test.tsx`、`chatPromptPolish.test.tsx`、`tests/appSurface/*.suite.ts`:草稿读取、提醒判据、队列与 caller 迁移到 content-only。
- AGC shell 类型检查、定向 Vitest、`npm run check:encoding`、`git diff --check` 通过。