新增 DirectProject 用户 Response item 契约
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 4m35s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 4m34s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m36s
Project CI / Backend tests (pull_request) Failing after 10s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 4m31s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 4m46s
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m32s
Project CI / Frontend tests (pull_request) Successful in 4m0s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m34s
Project CI / Native shell tests (pull_request) Successful in 6m35s

新增 Rust canonical user item 与 Codex wire 转换模块

增加 ts-rs 绑定目录及生成文件检查边界

更新聊天素材引用规范与里程碑实施计划
This commit is contained in:
2026-09-15 14:45:58 +08:00
parent 9aa6f5efea
commit dfd6fadedf
12 changed files with 372 additions and 4 deletions
@@ -0,0 +1,36 @@
# 【实施计划】DirectProject 用户 Response item 输入
| 字段 | 值 |
| --- | --- |
| Milestone | `docs/project-memory/plans/【里程碑】DirectProject用户ResponseItem输入-2026-09-15.md` |
| Status | ready |
| Owner | Codex |
## 修改边界
- 允许修改:AGC 壳 Rust agent 输入合同、DirectProject 历史适配、前端聊天引用模型、ts-rs 生成配置、当前聊天素材文档。
- 明确不修改:assistant 返回协议、工具 activity、附件/图片协议、SpacetimeDB、HTTP API。
## 实现顺序
1. 提取深模块:Rust canonical user item 的定义、校验和 Codex wire 转换。
2. 生成并接入 ts-rs 类型,排除生成文件 lint/style。
3. 将前端 Lexical 草稿从 `text + references[]` 改为 inline content parts。
4. 修改 Tauri command 与 DirectProject turn:校验通过后持久化 canonical item,再发送转换后的 Codex 输入。
5. 删除本链路对 legacy conversation 行的读取 fallback,保留标准 `response_item`
6. 补齐定向测试与文档验证;每个独立切片形成小提交。
## 验证命令
1. `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml direct_codex`
2. 相关前端 Vitest 与类型检查。
3. `npm run check:encoding`
4. `npm run check:doc-index`
5. `git diff --check`
## 风险与回滚点
- ts-rs 生成路径或 workspace lint 配置不一致:先固定生成入口,再接入业务。
- 历史中 canonical item 含 AGC part 时,thread replay 必须经过同一 wire converter;转换失败不得启动 turn。
- 共享工作树存在用户 `.env` 修改,禁止覆盖或提交。
- 每个切片保持独立提交,出现协议问题时按提交粒度回滚。
@@ -0,0 +1,51 @@
# 【里程碑】DirectProject 用户 Response item 输入
| 字段 | 值 |
| --- | --- |
| Version | 1.0 |
| Status | proposed |
| Date | 2026-09-15 |
| Parent Spec | `docs/【功能说明】AGC聊天素材引用-2026-09-08.md` |
## 目标
将 DirectProject 的用户消息升级为受限 Response API `message` item:文本与 AGC 引用按编辑顺序内联,Rust 校验后持久化 canonical item,并转换为 Codex 可接受的输入。
## 范围
- Rust 定义 user item 与 content part,并通过 `ts-rs` 生成 TypeScript 绑定。
- 前端 Lexical 草稿生成 inline `content[]`
- `agc_resource_reference` 只使用稳定 `resourceId`
- `agc_runtime_region_reference` 保留运行区域语义摘要。
- Rust 在持久化前完成白名单、manifest 与路径校验。
- 现有标准 `response_item` 原样兼容;legacy conversation 行不提供 fallback。
- 保持 assistant 返回、工具 activity、附件/图片协议不变。
## 不在范围内
- assistant item 前端投影或 Tauri 返回值改造。
- 工具 item、reasoning、file change、MCP item 的 UI 模型化。
- 附件/图片 content part。
- SpacetimeDB schema 或 HTTP API 变更。
## 依赖与前置条件
- DirectProject 现有 app-server thread/inject_items/turn/start 链路。
- 项目 manifest 作为资源身份与路径权威。
- 现有 `project.jsonl``response_item` envelope。
## 验收标准
- [ ] 前端生成的 canonical user item 保留 Lexical 中文本与引用的相对顺序。
- [ ] `agc_resource_reference` 仅包含 `resourceId`,显示信息由 manifest 派生。
- [ ] runtime-region 字段经过 Rust 有界清洗并验证关联资源。
- [ ] 未知 part、失效资源或非法路径在持久化前失败关闭。
- [ ] canonical item 以 `response_item` 写入历史,标准旧 item 原样可读。
- [ ] Codex wire input 不含 AGC 私有 part,且顺序与 canonical content 一致。
- [ ] assistant、附件和工具链路行为无变化。
## 证据要求
- 自动化:Rust item 校验/转换/历史测试;前端草稿顺序与类型测试;ts-rs 生成检查。
- 运行时:DirectProject 本地 app-server smoke(如环境可用)。
- 边界:未知 part、资源删除、非法路径、重复提交 clientTurnId、legacy 行拒绝。
@@ -13,7 +13,7 @@ AGC 聊天输入框支持以结构化引用标记当前项目已登记素材。
确认后素材以 `@素材名` 芯片插入编辑器,用户可以在芯片前后继续编辑自然语言,也可以单独删除芯片。芯片内部保存稳定 `resourceId`,展示名称只用于界面,不参与引用解析;资源改名后,编辑区已有芯片与候选列表都会按 `resourceId` 刷新成 manifest 的最新显示名,并同步回父级草稿。
提交时前端同时发送用户文本和 `references` 数组。Rust 在发起 Agent 回合前读取当前项目 manifest,逐项复核资源是否存在、路径是否安全,并以 manifest 中的 `id / kind / mediaType / localPath` 作为权威投影;客户端传入的路径、名称和类型不会被直接信任。已删除或不存在的资源会阻止发送并提示用户移除后重新选择
提交时前端把 Lexical 草稿直接编码为受限 Response API user `message` item`input_text` 与 AGC 引用 part 按编辑顺序内联在同一个 `content[]` 中。资源引用只携带稳定 `resourceId`;运行画面引用携带区域语义摘要及关联资源 ID。Rust 是唯一 schema source(通过 `ts-rs` 生成 TypeScript 绑定),在发起回合前完成 item 白名单、字段边界、manifest 归属和路径安全校验;校验失败时本轮不持久化、不发送。通过校验的 canonical item 以 `response_item` envelope 写入项目历史,随后由 Rust 将 AGC part 临时转换为 Codex 可接受的 `input_text`,保持原始 content 顺序。已有标准 `response_item` 原样读取与复用;旧 legacy conversation 行不再提供 fallback
当前已完成:
@@ -24,9 +24,9 @@ AGC 聊天输入框支持以结构化引用标记当前项目已登记素材。
- 素材芯片可插入、编辑和删除;
- 资源画布素材卡的选中工具条提供「引用」入口:图标本身就是 `@`,可见文案与 `title` 都只写「引用」,插入对话里的仍是 `@素材名` 芯片;
- 运行画面提供“点选素材”,可选中 HTML 区域并生成 `runtime-region` 引用;
- 提交请求携带结构化 `references`
- Rust 按 manifest 二次校验并生成安全投影
- 提交请求携带 canonical user message item
- Rust 按 manifest 二次校验、持久化 canonical item,并生成 Codex wire input
- 普通无引用消息保持原有行为;
- 素材选择面板的「当前版本素材 / 全部画布素材」两个页签与独立筛选、搜索状态;
- 资源改名后引用芯片与候选列表的显示名自动刷新;
- 切换 / 重开会话恢复草稿后光标落在文本末尾,引用按顺序追加到文本之后
- 切换 / 重开会话恢复草稿后光标落在文本末尾,引用按原 content 顺序恢复为 inline 芯片