Merge remote-tracking branch 'origin/master' into rm/design-v2
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
# AGC 统一错误诊断与验收反馈实施计划
|
||||
|
||||
Version: 1.0
|
||||
Status: active
|
||||
Date: 2026-09-15
|
||||
Parent Milestone: `【里程碑】AGC统一错误诊断与验收反馈-2026-09-15.md`
|
||||
|
||||
## 修改边界
|
||||
|
||||
1. 新增 `agent/runtime_error.rs`,承载统一事件字段、code/stage 白名单、脱敏后的 public projection、项目错误 JSONL/sidecar 落库和 detail 读取边界。
|
||||
2. `direct_runtime.rs` 使用统一事件替代仅写 `failure.json` 的路径;失败 assistant 投影带稳定 ID,下一轮 prompt 注入最近失败事件摘要。
|
||||
3. `codex_app_server.rs` 将 failed turn、idle/hard timeout、transport close、invalid terminal 和 stderr tail 转成稳定事件字段;不公开原始 detail。
|
||||
4. `direct_tool_bridge.rs` 与 `direct_tools_mcp.rs` 让 attempt 由客户端回合状态约束,越界请求返回终态工具错误;不扩展重试预算。
|
||||
5. `direct_runtime.rs` 的素材扫描递归覆盖可执行源码模块,基于 manifest 身份和浏览器 URL 映射判定;补充模块引用回归测试。
|
||||
6. 前端读取后端 `publicText/detailRef`,在现有 Runtime 错误面板中加入详情入口;不在 React 侧重新分类错误。
|
||||
|
||||
## 实现顺序
|
||||
|
||||
先写统一事件模型和 Rust 单测,再接 direct failure/app-server/tool bridge,随后接 prompt/history 与前端详情,最后修素材验收和 attempt 生命周期。每一步保留原有脱敏和失败关闭行为。
|
||||
|
||||
## 验证命令
|
||||
|
||||
- `cargo fmt --check`
|
||||
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml runtime_error direct_runtime codex_app_server direct_tool_bridge`
|
||||
- `npm run --prefix apps/ai-game-creator-shell typecheck`
|
||||
- `npm run check:encoding`
|
||||
- `git diff --check`
|
||||
- 必要时运行 AGC deterministic playable E2E;真实 Provider smoke 与浏览器双视口 smoke 单独报告。
|
||||
|
||||
## 风险与回滚
|
||||
|
||||
- 统一事件 schema 只新增项目内文件和对话投影,不修改已有 manifest、公开 API 或 SpacetimeDB schema。
|
||||
- 若前端详情读取失败,仍展示安全 `publicText`,不阻塞错误终态。
|
||||
- 若素材身份无法映射,继续失败关闭并记录明确 code,不回退为路径字符串通过。
|
||||
- 回滚可删除新事件写入和详情入口,保留旧 `failure.json` 读取兼容。
|
||||
@@ -0,0 +1,37 @@
|
||||
# 【实施计划】DirectProject Thread Manager 事件订阅
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】DirectProject Thread Manager事件订阅-2026-09-15.md` |
|
||||
| Status | ready |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
|
||||
- 允许修改:DirectProject Rust Thread Manager 深模块、app-server 事件适配、Tauri command/event 桥接、DirectProject 前端订阅/reducer/历史加载、对应测试和主规范。
|
||||
- 明确不修改:SpacetimeDB、HTTP API、非 DirectProject Runtime、Codex app-server durable thread、用户可见 JSONL 细节。
|
||||
- 保持已有 `.env` 未提交修改,不触碰个人配置。
|
||||
|
||||
## 实现顺序
|
||||
|
||||
1. 先新增独立 Rust queue/subscriber 深模块,只承载事件追加、逻辑队头回收、subscriber cursor 锁和纯单测。
|
||||
2. 将 app-server 公开事件安全标准化后接入 Thread Manager;在 item 完成持久化成功后追加完成事件,并追加 turn 生命周期事件。
|
||||
3. 增加 Tauri `subscribe/consume/readHistory` 命令与 notify 事件,固定错误和 bootstrap 原子边界。
|
||||
4. 前端改为 subscriptionId 驱动的 raw event reducer;重进/过期时先 bootstrap,完成后原子替换;历史按 itemId 懒加载。
|
||||
5. 移除 DirectProject legacy conversation 读取分支,补齐契约、并发、恢复和失败关闭测试;让初始历史切片的 `hasMore` 独立驱动“显示更早”按钮和滚动入口。
|
||||
6. 每个独立切片分别运行定向验证并形成中文小提交;里程碑验收后再清理临时计划。
|
||||
|
||||
## 验证命令
|
||||
|
||||
1. `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml` 的 DirectProject/Thread Manager 定向测试。
|
||||
2. 相关前端 Vitest 与类型检查。
|
||||
3. `npm run check:encoding`
|
||||
4. `npm run check:doc-index`
|
||||
5. `git diff --check`
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- 现有 app-server 事件模型与公开 raw event envelope 不完全一致:先在适配层收口,不让协议细节泄漏到前端。
|
||||
- 单 Vec 队列不能中间删除;unfinished item 长时间不结束可能暂时 pin 住队头,必须保留可观测上限和测试。
|
||||
- Tauri command 无传输层断开回调,subscriber 只通过 queue eviction 失效;测试不能依赖 unsubscribe 或连接断开清理。
|
||||
- legacy 删除属于 breaking history 行为;失败关闭测试必须确认不会 fallback 或迁移。
|
||||
@@ -0,0 +1,36 @@
|
||||
# 【实施计划】DirectProject 用户 Response item 输入
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】DirectProject用户ResponseItem输入-2026-09-15.md` |
|
||||
| Status | in-progress |
|
||||
| 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 @@
|
||||
# 【实施计划】Direct回合跨页面生命周期与运行中项目可见性-2026-09-15
|
||||
|
||||
Version: 1
|
||||
Status: in-progress
|
||||
Date: 2026-09-15
|
||||
Milestone: `【里程碑】Direct回合跨页面生命周期与运行中项目可见性-2026-09-15.md`
|
||||
|
||||
## 固定契约
|
||||
|
||||
只读快照命令(Tauri 本地命令,`src-tauri/src/agent/direct_runtime/mod.rs`):
|
||||
|
||||
- `list_game_creator_direct_active_turns() -> Vec<GameCreatorDirectActiveTurn>`
|
||||
- 字段(camelCase):`projectPath`、`projectName`、`turnId`、`status`、`activity`(可空)、`startedAt`、`updatedAt`、`sequence`
|
||||
- `status` 取值集合与既有 Direct 回合事件一致:`accepted` / `running` / `streaming` / `finalizing` / `completed` / `failed`
|
||||
|
||||
身份锁与快照共用同一份进程内注册表;注册表条目在回合进入时写入 `startedAt` 与 `projectName`,在每次回合事件发射时更新 `status` / `activity` / `sequence` / `updatedAt`,在回合结束(guard drop)时移除。
|
||||
|
||||
## 代码边界
|
||||
|
||||
- `apps/ai-game-creator-shell/src-tauri/src/agent/direct_runtime.rs`:注册表结构扩展、快照读写、新命令、Rust 定向测试
|
||||
- `apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/entrypoints.rs`:事件发射时投影到注册表
|
||||
- `apps/ai-game-creator-shell/src-tauri/src/main.rs`:命令注册
|
||||
- `apps/ai-game-creator-shell/src/App.tsx`:项目打开时重连、忙碌态与进度恢复、面板挂载
|
||||
- `apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts`:快照轮询与单飞刷新(面板与重连共用)
|
||||
- 面板组件(新文件,落在既有 feature 目录下)+ 对应测试
|
||||
- `apps/ai-game-creator-shell/src/features/agent-runtime/model.ts` + 测试:报错归类修正
|
||||
|
||||
## 修改顺序
|
||||
|
||||
1. Rust:扩展活动回合注册表并暴露只读快照命令,配定向用例(进入 / 进度 / 终态移除 / 多项目并存)。
|
||||
2. 前端:接入快照读取,实现“重新进入项目 → 恢复忙碌态与进度 → 以快照 sequence 续接 → 阻止并发提交”。
|
||||
3. 前端:在左上角空白区域挂载“正在运行的项目”面板,复用既有组件与设计 token。
|
||||
4. 报错归类:按审计结论修正会误导的映射,逐条加回归用例;真实权限拒绝保持原提示。
|
||||
5. 文档:主规范与共享记忆同步;里程碑验收后删除临时计划文件。
|
||||
|
||||
## 验证命令
|
||||
|
||||
- `cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml direct_active_turns -- --test-threads=1`(名称按实际用例调整)
|
||||
- `npx vitest run apps/ai-game-creator-shell/tests/agentRuntimeModel.test.ts`
|
||||
- `npx vitest run apps/ai-game-creator-shell/tests/appSurface.test.ts`
|
||||
- 面板组件测试文件单独一条 vitest
|
||||
- `npm --prefix apps/ai-game-creator-shell run typecheck`
|
||||
- `npm run check:encoding`、`git diff --check`
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- 快照命令暴露项目绝对路径给前端:与现有 `projectPath` 口径一致,不得额外泄露配置或 token;命令必须是只读、无副作用。
|
||||
- 续接基线 `sequence` 若取错,会让重新进入后的进度事件被丢弃或重复消费;取错时回滚“重连”部分,保留只读面板。
|
||||
- 忙碌态恢复不得与既有 `chatAgentBusy` 的失败清理互相覆盖;出现卡死忙碌态时优先回滚重连,不影响身份锁与后台回合本体。
|
||||
- 面板若在窄窗口挤压主内容,先按既有响应式约定隐藏面板,不改主布局。
|
||||
- 报错归类修正若与既有断言冲突,先确认断言锁的是“正确行为”还是历史错误文案,再决定改断言还是改实现。
|
||||
@@ -0,0 +1,39 @@
|
||||
# AGC 统一错误诊断与验收反馈
|
||||
|
||||
Version: 1.0
|
||||
Status: active
|
||||
Date: 2026-09-15
|
||||
Parent Spec: `docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md` 的“2026-09-15 AGC 统一错误事件、诊断落库与验收反馈”
|
||||
|
||||
## 目标
|
||||
|
||||
让 DirectProject 和共享 Agent Runtime 对失败使用同一份安全、可追踪、可恢复的错误事件合同;用户追问失败原因时能够读取上一轮证据;构建与浏览器验收只依据真实源码、manifest 身份和运行时证据判断。
|
||||
|
||||
## 范围
|
||||
|
||||
- 统一错误事件模型与项目内诊断落库。
|
||||
- DirectProject 失败 assistant 投影、下一轮诊断上下文和前端详情入口。
|
||||
- app-server 终态/超时、内置 MCP 工具错误和试玩 attempt 上限的分类。
|
||||
- 游戏源码模块素材扫描、manifest 身份映射与浏览器观察映射。
|
||||
- 定向 Rust/前端回归和现有 AGC 运行时门禁。
|
||||
|
||||
## 不做
|
||||
|
||||
- 不改变 Provider、External Editor 或 app-server 的 wire 协议。
|
||||
- 不放宽项目写锁、凭据隔离、工具白名单或完成门安全边界。
|
||||
- 不迁移历史项目文件;旧诊断只读兼容,新增事件使用新 schema。
|
||||
- 不把原始 stderr、请求正文或绝对路径展示给用户。
|
||||
|
||||
## 验收标准
|
||||
|
||||
1. 任一 DirectProject 失败均生成统一事件、稳定 `eventId` 和有界诊断引用;落库失败不覆盖原始错误。
|
||||
2. 失败安全投影写入对话历史,下一轮能读取 `publicText / code / stage / detailRef`,不会因追问而自动试玩。
|
||||
3. 结构化 failed turn、idle/hard timeout、transport close、MCP 参数错误和 `other` 各有稳定 code 与 recoveryHint。
|
||||
4. `attempt` 由客户端按回合分配并有上限;越界调用不会让回合继续等待。
|
||||
5. `game/src` 下模块引用已登记素材、Vite dist 稳定映射和浏览器实际观察均能通过;未登记素材仍失败。
|
||||
6. 脱敏测试证明 Token、Cookie、URL/query、私钥、宿主绝对路径和 stderr 私密内容不会进入用户文本。
|
||||
|
||||
## 依赖
|
||||
|
||||
- 现有 `direct_project_history`、`runtime_state`、`codex_app_server`、`direct_tool_bridge` 与浏览器 validation 证据。
|
||||
- 现有 DirectProject 诊断 sidecar 和 manifest 资源身份。
|
||||
@@ -0,0 +1,53 @@
|
||||
# 【里程碑】DirectProject Thread Manager 事件订阅
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | ready |
|
||||
| Date | 2026-09-15 |
|
||||
| Parent Spec | `docs/technical/【技术方案】DirectProject Codex原始历史与异常恢复-2026-09-04.md` |
|
||||
|
||||
## 目标
|
||||
|
||||
让 DirectProject 对话在页面离开、重进和短暂断线后仍能由前端重建运行态;运行态事件由 Tauri 进程级 Thread Manager 管理,已完成 item 继续以 `project.jsonl` 为持久化事实源。
|
||||
|
||||
## 范围
|
||||
|
||||
- 每 thread 一个全局 seq 和 append-only replay queue。
|
||||
- 每 subscriber 独立的 Rust 内部 cursor、并发安全消费和 notify 唤醒。
|
||||
- `subscribe` bootstrap、`consume`、`SUBSCRIPTION_EXPIRED` 和历史 item 锚点。
|
||||
- app-server 公开事件的安全标准化、item 持久化先于完成事件转发。
|
||||
- 前端 raw event reducer、历史懒加载和过期重订阅。
|
||||
- 删除本链路 legacy conversation 格式支持,不提供 fallback 或 migration。
|
||||
|
||||
## 不在范围内
|
||||
|
||||
- SpacetimeDB、HTTP API、Codex thread durable recovery。
|
||||
- 新的 item durable/status/pendingInteraction 字段或持久化确认事件。
|
||||
- 前端访问 JSONL 路径、格式或持久化细节。
|
||||
- 多 active turn;同一 thread 仍只有一个 active turn。
|
||||
|
||||
## 依赖与前置条件
|
||||
|
||||
- DirectProject 现有 app-server 事件解析和 `project.jsonl` 读写。
|
||||
- 当前 Tauri command/event 注册入口。
|
||||
- 现有前端 DirectProject 聊天 reducer 与历史加载入口。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [ ] 页面离开后 app-server 回合继续,重进页面能通过 subscribe 重建 unfinished item。
|
||||
- [ ] 同一 thread 的多个 subscriber 各自消费,不互相覆盖或重复推进 cursor。
|
||||
- [ ] `consume` 返回 cursor 之后的全局 raw events,通知不携带 payload。
|
||||
- [ ] queue eviction 只清理队头;落后 subscriber 得到 `SUBSCRIPTION_EXPIRED` 并可重新 subscribe。
|
||||
- [ ] item 完成先持久化,成功后才进入完成事件队列;失败不发送正常完成事件。
|
||||
- [ ] `turn.completed` 由 app-server 终态进入 raw queue,前端据此结束运行态。
|
||||
- [ ] subscribe 返回 item 历史锚点而不是完整 history;前端可按 itemId 懒加载。
|
||||
- [ ] 未完成 item 的每个 delta 可从 `item.started` 开始重放;不截断 active item。
|
||||
- [ ] legacy conversation 行直接失败关闭,无 fallback、无迁移。
|
||||
- [x] DirectProject 首页历史切片存在 `hasMore` 时,即使当前可见窗口没有隐藏消息,也提供按钮和滚动两种“显示更早”入口。
|
||||
|
||||
## 证据要求
|
||||
|
||||
- 自动化:queue/cursor/eviction 并发单测、事件标准化和持久化顺序测试、Tauri command 测试、前端 reducer 与重订阅测试。
|
||||
- 运行时:关闭/切页后重进 DirectProject;并发 item;短暂断线 consume;cursor 过期重订阅。
|
||||
- 边界:持久化失败、未知 subscription、queue 超限、多个 subscriber、turn 无 item 间隙、legacy 行拒绝。
|
||||
@@ -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。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 前端生成的 canonical user item 保留 Lexical 中文本与引用的相对顺序。
|
||||
- [x] `agc_resource_reference` 仅包含 `resourceId`,显示信息由 manifest 派生。
|
||||
- [x] runtime-region 字段经过 Rust 有界清洗并验证关联资源。
|
||||
- [x] 未知 part、失效资源或非法路径在持久化前失败关闭。
|
||||
- [x] canonical item 以 `response_item` 写入历史,标准旧 item 原样可读。
|
||||
- [x] Codex wire input 不含 AGC 私有 part,且顺序与 canonical content 一致。
|
||||
- [ ] assistant、附件和工具链路行为无变化。
|
||||
|
||||
## 证据要求
|
||||
|
||||
- 自动化:Rust item 校验/转换/历史测试;前端草稿顺序与类型测试;ts-rs 生成检查。
|
||||
- 运行时:DirectProject 本地 app-server smoke(如环境可用)。
|
||||
- 边界:未知 part、资源删除、非法路径、重复提交 clientTurnId、legacy 行拒绝。
|
||||
@@ -0,0 +1,33 @@
|
||||
# 【里程碑】Direct回合跨页面生命周期与运行中项目可见性-2026-09-15
|
||||
|
||||
Version: 1
|
||||
Status: in-progress
|
||||
Date: 2026-09-15
|
||||
Parent Spec: `docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md`「2026-09-15 Direct 回合跨页面生命周期与运行中项目可见性」
|
||||
|
||||
## 目标
|
||||
|
||||
离开项目界面不再等于“回合消失”:后台继续跑的 Direct 回合必须能被前端重新发现并续接进度,同一项目在回合结束前不允许再发起第二条付费回合;壳层左上角提供“正在运行的项目”面板,列出当前确有在跑回合的项目并可点击进入。
|
||||
|
||||
## 边界
|
||||
|
||||
- 只读投影:新增命令只读当前 GUI 进程内的活动回合注册表,不写项目文件、不新增持久化账本。
|
||||
- 不新增取消入口;不改变身份锁排他性、项目写锁语义、计费与幂等身份。
|
||||
- 不新增跨端契约(Tauri 本地命令,不进 `packages/shared` / `shared-contracts` / OpenAPI)。
|
||||
- 面板与重连共用同一份快照,不各自维护第二份“谁在跑”的真相。
|
||||
- 报错归类修正只处理“说明与真相无关”的情况,不放宽身份锁、不吞真实失败。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- 重新进入有在跑回合的项目后:界面进入“正在处理”、显示最近一次进度、以快照 `sequence` 续接后续事件;回合结束前提交第二条需求不会真正发起第二条付费回合。
|
||||
- 回合结束(completed / failed)后:忙碌态解除、可以再次发送;不重复追加助手消息。
|
||||
- 无在跑回合的项目:行为与今天一致(可正常发送,不出现额外提示或阻塞)。
|
||||
- 左上角面板:列出所有在跑项目,按 `startedAt` 升序,显示项目名(缺失时回退目录名)与状态/时长,点击进入对应项目;没有在跑回合时不渲染面板外壳。
|
||||
- 快照读取失败不得阻断发送、不得显示成业务失败。
|
||||
- 已修的错误映射不回归:`direct-codex-turn-already-running:` 与历史同义中文正文都归一到“仍在处理这个项目的上一条需求”;真正的 `项目权限策略拒绝执行:<command>` 仍显示审批提示。
|
||||
|
||||
## 未决事项
|
||||
|
||||
- “离开页面即取消”仍是未采纳的另一种语义;本轮只实现后台继续。
|
||||
- 应用重启后的“未完成回合”恢复不在本里程碑范围(回合注册表是进程内状态);若未来要求跨重启恢复,需要另立里程碑并定义持久化身份与对账合同。
|
||||
- 面板是否需要展示非 Direct(专业 Agent / 策划 Agent)运行中的项目,本轮不做;先把 Direct 回合这条事实链路做正确。
|
||||
@@ -8740,3 +8740,26 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
|
||||
- 决策(面板可关 + 非模态任务面板):两块生成浮层在提交期间放开 × / 遮罩 / Esc,提交按钮旁给「后台运行并关闭」;**关闭 ≠ 取消**(表单的 `await` 挂在该任务的终局上,不是面板生命周期)。新增「生成任务」非模态浮层(不铺遮罩、不做焦点陷阱、**不进** `isResourceCanvasFloatingPanelOpen` / `resourceCanvasHostGenerationPanelOpen` 遮挡判据),入口按钮 `aria-label="生成任务"`;已完成的条目按 `assetId` 复用既有 `pendingResourceFocusRef` 聚焦链定位素材卡。
|
||||
- 影响范围:新增 `apps/ai-game-creator-shell/src-tauri/src/asset_generation_tasks.rs`(+ `main.rs` 注册)、`src/features/resource-canvas/{resourceCanvasAssetGenerationTaskModel.ts,resourceCanvasAssetGenerationQueue.ts,ResourceCanvasAssetGenerationTasksPanelView.tsx}`;改动 `ResourceCanvasAssetGenerationPanelView.tsx` / `ResourceCanvasGenerationPanelView.tsx` / `src/view/project-development/index.tsx`;测试改动 `tests/{resourceCanvasAssetGenerationBackgroundClose.test.tsx,resourceCanvasAssetGenerationQueue.test.ts,resourceCanvasAssetGenerationTasksPanel.test.tsx}`(新增)与 `tests/appSurface/project-development.suite.ts`(把「每个入口一次 `generate_local_project_asset`」改成 `start_local_project_asset_generation` + `list_...` 轮询桩,载荷断言逐字不变)。**未动**:external v1 / OpenAPI、`packages/`、SpacetimeDB、音频入口的 pending-edit 账本语义、生成参数与 IPC 载荷字段名。
|
||||
- 关联文档:`docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md`(§4 / §4a / §8)、`docs/technical/【测试用例】AGC资源工作台V3端到端验收-2026-09-11.md`(S11a / §7.3)。
|
||||
|
||||
|
||||
## 2026-09-15 非 Suno 的 VectorEngine 能力切换到 Tiantoken
|
||||
|
||||
- 决策:新增本地私密环境变量 `TIANTOKEN_BASE_URL` / `TIANTOKEN_API_KEY`(图片 timeout 可独立配置),承载原 VectorEngine 的文本和图片;`VECTOR_ENGINE_BASE_URL` / `VECTOR_ENGINE_API_KEY` 仅保留给 Suno 背景音乐与 Suno 音效。编辑器 SFX V2 继续走 ElevenLabs。
|
||||
- 实现边界:api-server 在创建状态时冻结 Tiantoken 配置,LLM、图片和旧版非 Suno 音频按该配置路由;Suno 的提交 / 轮询仍使用旧 VectorEngine 配置。旧 `vector_engine_*` 测试构造保留为 Tiantoken fallback,生产新环境变量优先。
|
||||
- 验证:Tiantoken `/v1/models` 返回 HTTP 200(126 个模型,含 `gpt-image-2`、`gpt-5.4-mini`);api-server Tiantoken 配置单测、platform-audio 全量测试、图片定向测试、前端 `apiClient` 定向测试、`npm run typecheck`、`npm run check:api-server-env`、编码 / fmt / diff 检查通过。未对音频上游提交生成任务,模型列表未列出 audio / Vidu 条目。
|
||||
|
||||
## 2026-09-15 删除旧版 Vidu 音效实现
|
||||
|
||||
- 决策:旧版 Vidu `audio1.0` 的 submit / poll / download builder、旧视觉小说与创建音效死代码、对应 platform-audio 请求类型和测试全部删除。历史素材的 `audio1.0` 展示与定价兼容数据保留;新编辑器音效仍只走 ElevenLabs,Suno 音乐链路不变。
|
||||
- 验证:platform-audio 全量测试 55 条通过,api-server `cargo check` 通过,fmt / 编码 / diff 检查通过;仓库现役源码不再包含 `VIDU_AUDIO_MODEL`、`AudioTaskKind::SoundEffect` 或 Vidu submit/poll 实现。
|
||||
|
||||
## 2026-09-15 AGC 统一错误事件与项目诊断落库
|
||||
|
||||
- 背景:DirectProject 的 app-server 超时、MCP 参数错误、浏览器完成门误判和普通 Agent Runtime 失败分别投影为短文案;失败正文没有稳定落库,下一轮模型看不到上一轮失败证据,用户追问原因时可能继续试玩或重复修改。
|
||||
- 决策:新增 `agent/runtime_error.rs` 作为统一错误事件与有界诊断 sidecar 边界。DirectProject 失败、Agent Runtime terminal failure 均持久化 `.agent/runtime/errors/<eventId>.json`,并将脱敏 assistant 终态写回 `project.jsonl`;前端只通过 `read_agent_runtime_error_detail` 读取脱敏详情。旧 `failure.json` 保留兼容,不把原始 stderr、凭据、URL/query、宿主绝对路径写入用户文本。
|
||||
- 决策:错误使用稳定 `source / stage / code / retryable / publicText / recoveryHint / detailRef` 字段;试玩 attempt 越界返回终态错误并停止继续等待。素材完成门扫描实际 npm 源码模块,并把 manifest 中合法的自定义 art-spritesheet 路径纳入候选,构建和浏览器观察仍需通过既有完成门。
|
||||
- 关联规范:`docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md` 的“2026-09-15 AGC 统一错误事件、诊断落库与验收反馈”;开发期计划见 `docs/project-memory/plans/【里程碑】AGC统一错误诊断与验收反馈-2026-09-15.md` 与对应实施计划。
|
||||
## 2026-09-15 Direct 回合跨页面继续运行与活动项目面板
|
||||
|
||||
- 决策:采用后台继续运行语义。Direct 回合由进程内项目身份锁持有,页面离开不取消;重进项目通过活动回合只读快照与 Thread Manager bootstrap/consume 恢复忙碌态和进度。左上角面板复用同一快照列出正在运行的 Direct 项目并支持进入。
|
||||
- 边界:快照不写项目文件、不进入公共 API、不跨应用重启恢复;读取失败保留上一份结果并单独提示,不改写成权限或审批失败。身份锁排他性、付费身份和项目写锁不变。
|
||||
|
||||
@@ -5596,3 +5596,10 @@ Cocos Creator 根目录由 `package.json.creator.version` 与普通 `assets/`
|
||||
- 原因:健康检查只能证明“有服务响应”,不能证明服务属于当前工作树;旧 `.app/dev-stack.json` 可能没有当前 `repoRoot`、`instanceId` 和服务级 dataDir 身份。
|
||||
- 处理:先读取 `.app/dev-stack.json`,核对顶层 `repoRoot + instanceId`,再核对服务 `repoRoot + instanceId + dataDir + pid + port`;AGC Vite marker 还必须带 `repoRoot + processId + port`。任何字段缺失或不匹配都拒绝静默复用,改为启动当前工作树自己的服务或明确提示清理。
|
||||
- 验证:`scripts/dev.test.ts`、`apps/ai-game-creator-shell/tests/start-dev-stack.test.ts` 覆盖 snapshot identity 和旧状态拒绝复用;运行时记录实际端口、进程命令行和 dataDir,不要只记录 HTTP 200。
|
||||
|
||||
## 2026-09-15 登录失败提示必须保留接口返回原因
|
||||
|
||||
- **现象**:账号登录失败时页面只显示“登录失败”,用户无法判断是手机号、验证码、密码还是服务状态问题。
|
||||
- **原因**:统一错误解析器只处理标准 `error.message/details` 结构;部分网关或旧兼容响应使用字符串 `error`,解析失败后回落到登录接口传入的通用文案。
|
||||
- **处理**:`parseApiErrorMessage` 同时支持字符串 `error`,标准嵌套结构保持原有优先级;未知或空响应继续使用通用兜底。
|
||||
- **验证**:`src/services/apiClient.test.ts` 新增字符串错误响应回归用例,定向测试 32 项通过,`npm run typecheck` 通过。
|
||||
|
||||
Reference in New Issue
Block a user