计划收口与共享记忆更正
- 63 份计划补「逐条勾选依据 / 本轮复验」并统一为 implemented-awaiting-runtime-acceptance,未勾选从 85 条降到 43 条;删除 4 份已收口临时计划,结论回写权威文档。 - 新增待办:主站 SPA allowlist 与前端路由源不一致、高风险审批 Rank 的 PRD 骨架、引用输入区后续收口、计划收口剩余项索引。 - 更正共享记忆:渲染层 HTTP 能力退役、Windows 门禁限制与可跑性、Provider 配置 Debug 脱敏规则、游戏分发本地证据与多轮变异验证记录。
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | runtime-smoke-passed(存储原语、服务端入口、原生上传器、渲染进程接线与真实栈分片续传 smoke 均已落地) |
|
||||
| Status | implemented-awaiting-runtime-acceptance(存储原语、服务端入口、原生上传器、渲染进程接线与真实栈分片续传 smoke 均已落地) |
|
||||
| Date | 2026-09-23 |
|
||||
| Parent Milestone | `docs/project-memory/plans/【里程碑】AGC发行包分片续传上传-2026-09-23.md` |
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
| 字段 | 值 |
|
||||
| --------- | ----------------------------------------------------------------------------------- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】AGC客户端更新切换到官方更新插件-2026-09-17.md` |
|
||||
| Status | ready |
|
||||
| Status | implemented-awaiting-runtime-acceptance |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
@@ -35,3 +35,11 @@
|
||||
- Windows 安装模式由插件配置决定(本里程碑固定 `quiet`,与旧 PowerShell `/S` 一致);若改为 `passive` 会多出安装进度条 UI。
|
||||
- 插件在 Windows 上安装成功后自行退出进程,前端不再有机会更新界面;提示面板的完成态只在 macOS / Linux 可见。
|
||||
- 回滚点:改动集中在客户端与配置,回滚后即可退回自研链路;旧 OSS `agc/latest.json` 在发布管线渠道化前不删除。
|
||||
|
||||
## 本轮复核(2026-09-24)
|
||||
|
||||
状态原为 `approved` / `ready`(规范评审态),实现其实已经落地,本轮按当前工作树复核并改记为 `implemented-awaiting-runtime-acceptance`:
|
||||
|
||||
- 原生侧接入官方插件:`apps/ai-game-creator-shell/src-tauri/Cargo.toml` 有 `tauri-plugin-updater = "2.11.0"`;`tauri.conf.json` 打开 `createUpdaterArtifacts` 并写入 `plugins.updater.pubkey` 与渠道端点。
|
||||
- 自研更新链路已删除:`download_ai_game_creator_update` / `install_ai_game_creator_update` / `check_ai_game_creator_update` 在 `src-tauri/src` 与 `src` 内均无命中;前端更新服务 `src/services/appUpdate.ts` 只消费官方插件包,而该包是 IPC 薄壳,网络与安装都在 Rust 侧。
|
||||
- 未执行(需要签名私钥与发布授权):真实签名打包、真实 OSS 发布、安装后真机升级与回滚。
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
# 【实施计划】AGC 工作区偏好 IO 下沉 Rust
|
||||
|
||||
Version: `v1`
|
||||
Status: `implemented-awaiting-runtime-acceptance`
|
||||
Date: `2026-09-23`
|
||||
Parent Spec: `docs/project-memory/plans/【里程碑】AGC工作区偏好IO下沉Rust-2026-09-23.md`
|
||||
|
||||
## 修改边界
|
||||
|
||||
1. 新增 `src-tauri/src/workspace_preferences.rs`:定义版本化 AppData JSON、路径规范化、原子写入、command 输入/输出和偏好变更事件。
|
||||
2. 在 `main.rs` 注册 typed commands;首页自动建项和模板建项由 Rust command 内部读取项目创建目录,保持现有目录安全校验。
|
||||
3. `features/app-shell/model.ts` 保留纯校验/展示模型,移除 `localStorage` 读写,新增一次快照/迁移所需的 invoke façade。
|
||||
4. `useProjectCreationDirectory.ts` 与 `useRecentProjects.ts` 订阅 Rust 事件,首次挂载读取一次快照;浏览器/Vitest 无 Tauri 时保留内存 fallback,不恢复周期轮询。
|
||||
5. 增加 Rust/React 定向测试,更新现有 localStorage 断言为 command/event 合同;不修改 auth、wallet、prompt polish 和 Home draft。
|
||||
|
||||
## 实施顺序
|
||||
|
||||
- 先完成 Rust 偏好模块和单测,再注册 command/event,最后切换 React 读取/写入边界。
|
||||
- 先让自动建项闭环不再传 `projectsRoot`,再切换模板建项;确认旧参数仍兼容后删除前端读取。
|
||||
- 迁移旧 localStorage 只做一次、在 Tauri 环境显式触发;迁移失败不得覆盖 Rust 已存在值。
|
||||
|
||||
## 验证命令
|
||||
|
||||
```text
|
||||
cargo fmt --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml -- --check
|
||||
cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml workspace_preferences
|
||||
npm exec vitest run -- apps/ai-game-creator-shell/tests/projectCreationDirectory.test.ts apps/ai-game-creator-shell/tests/recentProjectsHook.test.tsx
|
||||
npm --prefix apps/ai-game-creator-shell run typecheck
|
||||
npm run ai-game-creator-shell:check:web
|
||||
npm run check:encoding
|
||||
npm run check:doc-index
|
||||
git diff --check
|
||||
```
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- AppData 偏好文件不可写时,读取继续返回安全空态,写入返回可见错误;React 不回退到隐式 `localStorage` 持久化。
|
||||
- 旧 localStorage 键可能包含无效或已不存在的路径,迁移只接受规范化绝对路径,并受 Rust 端每次建项校验保护。
|
||||
- 若事件订阅竞态导致首次通知丢失,挂载快照读取作为唯一补读;不引入 `setInterval`。
|
||||
|
||||
## 当前验证记录
|
||||
|
||||
- Rust workspace preference 定向测试:`3 passed / 0 failed`。
|
||||
- React 定向测试:`projectCreationDirectory.test.ts` 与 `recentProjectsHook.test.tsx` 共 `7 passed`。
|
||||
- AGC TypeScript:`npx tsc -p tsconfig.json --noEmit` 通过;定向 Prettier 与新 Rust 模块 rustfmt 检查通过。
|
||||
- 完整 `npm --prefix apps/ai-game-creator-shell run typecheck` 已通过,发行 typed command allowlist 已同步。
|
||||
|
||||
## 本轮取证(2026-09-24)
|
||||
|
||||
- 行为合同 1/2/3(偏好文件缺失不阻断启动、最近工作区最多 8 条去重幂等、创建目录只表达意图且建项仍过 Rust 门禁):`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --offline -- workspace_preferences --test-threads=1` → **6 passed**。
|
||||
- 范围项(React 不再直接访问 `localStorage`、建项不再由 React 传 `projectsRoot`):`rg localStorage apps/ai-game-creator-shell/src` 只剩 `features/app-shell/workspacePreferences.ts` 的旧键迁移 shim(`isTestRuntime()` 门控);`rg projectsRoot apps/ai-game-creator-shell/src` **0 命中**。
|
||||
- 前端 façade:`npx vitest run tests/recentProjectsHook.test.tsx tests/projectCreationDirectory.test.ts --root apps/ai-game-creator-shell` → **5 + 4 passed**(命令/事件投影、失败重试与偏好读写)。
|
||||
- Rust 侧变异验证(2026-09-24):把 `MAX_RECENT_WORKSPACES` 从 8 改成 16 后,`normalizes_recent_paths_with_a_strict_eight_item_limit` 立刻红(`left: 10, right: 8`),说明「最近项目最多 8 条」这条上限确实被钉住;改回后 `workspace_preferences` 定向用例 exit 0。
|
||||
- 仍未验证(需要真实客户端):多窗口并发改偏好、事件丢一次后的受控快照读取、真实建项落到用户所选目录。
|
||||
@@ -0,0 +1,79 @@
|
||||
# 【实施计划】AGC 工作区网络 I/O 下沉 Rust
|
||||
|
||||
Version: `v1`
|
||||
Status: `implemented-awaiting-runtime-acceptance`
|
||||
Date: `2026-09-23`
|
||||
Parent Spec: `docs/project-memory/plans/【里程碑】AGC工作区网络IO下沉Rust-2026-09-23.md`
|
||||
|
||||
## 修改顺序
|
||||
|
||||
1. 先盘点现有 Rust HTTP/auth/session facade 与发行/资源命令,冻结 typed request/response 和事件名。
|
||||
2. **发行链路(已完成)**:新增 `game_distribution_publish.rs` typed facade 和五个 Tauri commands;创建游戏、创建版本、分片上传、送审、灰度读取、资料建议、封面价格/生成与队列收口均由 Rust 持有。保留既有分片上传 command 与幂等/续传语义,React service 只保留 `invoke` façade。
|
||||
3. **模型目录闭环(已完成)**:官方 `/api/llm/models` 改由 Rust typed command 持有会话与 HTTP;React 只消费目录投影。素材库/素材直传仍待后续切片。
|
||||
4. 为每条命令补 Rust 单测、前端 invoke/事件测试和静止状态无轮询断言。
|
||||
5. 更新主规范、事件目录与验证记录;账户/钱包调用保留并明确排除。
|
||||
|
||||
## 验证命令
|
||||
|
||||
- `npm --prefix apps/ai-game-creator-shell run typecheck`
|
||||
- `npm run ai-game-creator-shell:check:web`
|
||||
- `cargo fmt --all --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml -- --check`
|
||||
- 相关 Rust `cargo test --locked` 定向测试
|
||||
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml game_distribution_publish`
|
||||
- `npx vitest run apps/ai-game-creator-shell/tests/gameDistributionPublish.test.ts`
|
||||
- `npm run check:encoding`
|
||||
- `npm run check:doc-index`
|
||||
- `git diff --check`
|
||||
|
||||
## 回滚点
|
||||
|
||||
保留现有 Rust 上传命令和旧 TS service 的提交边界;迁移每个 typed facade 时先让 Rust command 可独立读取/写入,再切换 React 调用方,避免出现“旧网络调用已删但新 command 未注册”的窗口。不得用重新启用 React 轮询作为回滚。
|
||||
|
||||
## 当前批次证据:官方模型目录
|
||||
|
||||
- 新增 Tauri typed command load_game_creator_llm_models;Rust 持有当前平台会话、固定 API origin、Bearer、AGC marker、响应 envelope 解析、1 MiB 响应上限和账号身份代次复核。
|
||||
- React llmModelCatalog 在 Tauri 官方目录路径只通过 typed invoke 读取;自定义模型继续使用本地配置,浏览器无 native host 时保留兼容读取。
|
||||
- Rust 定向测试 4/4、clientApi 与 ConversationModelSelect 定向测试 38/38、appSurface 211 passed / 9 skipped。
|
||||
- typecheck 的 tsc 与 skill-pack、check:encoding、check:doc-index、git diff --check 通过;check-config 仍受共享工作树既有发行命令缺口阻断,发行资料 facade 另按本实施计划处理。
|
||||
|
||||
## 当前切片证据(2026-09-23)
|
||||
|
||||
- `apps/ai-game-creator-shell/src-tauri/src/game_distribution_publish.rs` 读取 Rust `platform_session` 的 user/token/origin,只接受结构化参数;每个 HTTP 步骤复核身份代次,保留 Bearer、`X-Genarrative-Client: agc`、响应 envelope、幂等键和稳定错误分类。
|
||||
- `publish_local_project_game` 在 Rust 内完成本地包暂存、创建 game/version、分片续传和 submit;渲染进程不再取得 token、origin 或整包字节。已有 `upload_local_project_game_package` command 未改动。
|
||||
- 封面异步任务由 Rust 以有界 1.6 秒间隔、20 分钟/800 次上限等待;React 不再执行远端 job 轮询。
|
||||
- `npx vitest run apps/ai-game-creator-shell/tests/gameDistributionPublish.test.ts`:7 passed;`npm exec tsc -- --noEmit -p apps/ai-game-creator-shell/tsconfig.json` 通过。
|
||||
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml game_distribution_publish`:4 passed;`rustfmt --edition 2021 --check` 针对新 Rust 文件通过。
|
||||
- 尚未宣称全部工作区网络已迁移:素材库/素材上传、账户刷新、错误上报及其它 clientApi 链路仍在各自里程碑范围内;真实 Tauri + Provider/生产发行 smoke 仍待环境验证。
|
||||
- 发行 facade 追加 session identity 保护:每个 JSON 步骤与每个分片前重新读取当前 token,换号/origin 变化失败关闭;旧 native-only 分片 command 保留显式 token 兼容,不属于 React 工作区入口。
|
||||
|
||||
## 当前切片证据:编辑器素材库与预览
|
||||
|
||||
- 范围补充:远程导入同步改成 assetId-only,删除旧 remoteAssets/objectKey/downloadUrl 透传。UI 继续传现有 import policy/requirements;Rust 复用账户素材导入核心,按实际字节落实单文件/批次上限和正式 kind,预览字节不作为导入事实。预览切换/卸载后迟到响应不能回写。
|
||||
- Rust 新增 read_editor_asset_library:复用当前账号 session、账户素材静态图片筛选和安全投影,只返回 folders/assets 展示字段、稳定 assetId、尺寸/大小和 previewAvailable;不序列化 objectKey、imageSrc、assetObjectId、token 或本地路径。
|
||||
- Rust 新增 read_editor_asset_preview:按当前账号 assetId 重新解析权威素材,有界下载并校验图片大小、Content-Type/magic、重定向和 session identity,返回 data URL;没有稳定 objectKey/legacy path 的记录失败关闭。
|
||||
- React AssetImporter/ImageImporterPreview 改为 editorAssetHost typed invoke;旧 loadEditorAssetLibrary/resolveClientAssetReadUrl 不再由该入口调用。import_ui_editor_assets 的旧 remote 入参保留,downloadUrl 暂由 Rust 返回的 data URL 提供,Rust 兼容解析该 data URL,WebView 不再直接发素材预览/导入网络请求。
|
||||
- Rust 定向资源投影/预览 data URL/legacy import 测试 13/13、AssetImporter 定向测试 4/4、AGC typecheck tsc/skill-pack 通过;待补完整 web gate、编码/文档索引/diff 检查后再提交该切片验收。
|
||||
|
||||
## 当前切片证据:素材上传与错误报告(2026-09-24)
|
||||
|
||||
- 新增 `src-tauri/src/platform_asset_upload.rs` 与命令 `upload_platform_media_asset`:凭证申请、对象存储表单直传、confirm、会话身份复核和地址白名单全部在 Rust;React `assetDirectUpload.ts` 只读取用户选择的文件字节并提交结构化元数据,不再持有 token、拼 URL 或发平台请求。
|
||||
- 新增 `src-tauri/src/error_report/submit.rs` 与命令 `submit_error_report`:Rust 持有 origin、Bearer、稳定 submissionId(按事件 ID 派生)与 envelope 解析;React 只提交脱敏事件、说明与诊断日志,`errorReporting.ts` 不再 import `fetchClientHttp` / `getStoredAuthAccessToken` / `getClientServerBaseUrl`。
|
||||
- 渲染层偏好补齐:`chatPromptPolish` 的「不再提醒」从 localStorage 迁到 Rust 客户端偏好(`set_chat_prompt_polish_reminder_disabled` + 既有偏好事件),组件改为「挂载读一次快照 + 订阅事件」,并修掉迟到快照覆盖用户新选择的竞态。
|
||||
- 验证:Rust 定向 `platform_asset_upload` 3/3、`error_report::submit` 4/4、`workspace_preferences` 4/4;前端定向 `assetDirectUpload` 3/3、`errorReporting` 11/11、`ErrorReportDialog` 3/3、`chatPromptPolish` 18/18、`resourceReferenceInput` 43/43;`npm run ai-game-creator-shell:check:web` 1857 passed / 14 skipped;编码、文档索引、`git diff --check`、`cargo fmt --check` 通过。
|
||||
|
||||
## 当前切片证据:账户与钱包(2026-09-24)
|
||||
|
||||
- 新增 `src-tauri/src/account_api.rs` 与五个命令(recharge-center / wallet-ledger / create order / confirm wechat order / redeem code):Rust 从当前平台会话取 origin 与 Bearer,解析 envelope 并映射稳定错误分类;401 返回 `authentication-required` 由渲染层按既有会话续期链路重试一次,付费订单未知结果不自动重放。
|
||||
- 渲染层新增 `src/services/accountHost.ts` 与 `src/services/platformSessionRetry.ts`;`useAccountWallet` 与 `stores/useWalletStore` 改为 typed invoke,`clientApi` 不再承载账户与钱包请求。Direct Codex 的登录失效判定与账户命令共用同一份分类,避免两处口径漂移。
|
||||
- 验证:Rust 定向 `account_api` 4/4;前端定向 `accountHost` 3/3、`walletStore` 14/14;`npm run ai-game-creator-shell:check:web` 186 passed / 1857 passed / 14 skipped;编码、文档索引、`git diff --check`、`cargo fmt --check` 通过。
|
||||
- 仍未迁移:登录、验证码、refresh、登出与开发服务器选择,见 `【里程碑】AGC认证会话与账户网络下沉Rust-2026-09-24.md`;真实账号登录/续期/微信支付仍需环境证据。
|
||||
|
||||
## 本轮取证(2026-09-24)
|
||||
|
||||
- 验收 1(React 不再直连):`rg "requestClientApi|fetchClientHttp|accessToken|refreshToken" apps/ai-game-creator-shell/src` → **0 命中**;`rg projectsRoot apps/ai-game-creator-shell/src` → 0 命中。
|
||||
- 验收 3(静止时无 React 轮询):`rg setInterval apps/ai-game-creator-shell/src` 只剩两类非远端任务——计时/动画(`AuthenticatedClient` 的登录耗时与验证码倒计时、`useLiveNow`、`useDesignReplyAnimation`、`DirectProjectConversation` 的本地时钟)和拖拽重复器(`TransformEditor`)。
|
||||
- 验收 4/5 的定向用例:`npx vitest run tests/gameDistributionPublish.test.ts tests/assetDirectUpload.test.ts tests/pluginHost.test.ts tests/directActiveTurns.test.tsx tests/resourceCanvasAssetGenerationQueue.test.ts tests/recentProjectsHook.test.tsx tests/projectCreationDirectory.test.ts --root apps/ai-game-creator-shell` → **7 文件 / 63 passed**。
|
||||
- 变异验证(2026-09-24):拿掉 `platform_asset_upload::validate_upload_host` 的「只允许回环 http 与 `*.aliyuncs.com` https」判定后,`validates_upload_hosts_without_accepting_arbitrary_origins` 精确挂在 `https://evil.example.com/upload` 那条断言上,证明这条防任意主机上传的用例不是空跑;改回后该用例与 `corrupt_or_foreign_session_files`(见认证里程碑)各自 exit 0。
|
||||
- 脱敏用例的强度复核(2026-09-24):禁用 `error_report::sanitize::redact_urls` 后,只有 `keeps_api_route_while_redacting_url_origin_and_query`(精确相等断言)变红,`redacts_credentials_urls_paths_and_ids` 仍然通过——`PATH_PATTERN` 的盘符分支大小写不敏感,`http://` 里的 `p:` 也会命中并把整段 URL 吞成 `http<path>`,所以「URL 被换成占位符」这件事当时没有被断言到。已给该用例补一条 `assert!(sanitized.contains("<url>"))`:规则禁用时新断言精确变红,恢复后 `error_report` 定向用例全绿(sanitize 4 条 + submit 4 条)。
|
||||
- 变异验证之三/四(2026-09-24):① 去掉 `error_report::submit::stable_submission_id` 里的 `ids.sort_unstable()` 后,`submission_id_is_stable_and_order_independent` 立刻红(同一批事件两种顺序给出两个不同 `agc-error-report-*`),证明「同批重放命中服务端幂等键」的排序不变性被守住;② 把 `account_api::map_http_error` 的 401 分支前缀 `authentication-required: ` 去掉后,`expires_and_permissions_keep_stable_categories` 精确变红——这正是渲染层 `platformSessionRetry` 用来决定「续期一次再重放」的分类契约,两端各有一条用例钉住。改回后 `account_api::tests` 与 `error_report::submit::tests` 各自 exit 0。
|
||||
- 仍未验证(需要真实环境):真实 OSS 发行包上传与送审、真实账户下的发行资料生成、发布取消/未知结果的端到端表现。
|
||||
@@ -3,7 +3,7 @@
|
||||
| 字段 | 值 |
|
||||
| --------- | ------------------------------------------------------------------------- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】AGC更新发布管线渠道化-2026-09-17.md` |
|
||||
| Status | ready |
|
||||
| Status | implemented-awaiting-runtime-acceptance |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
@@ -35,3 +35,12 @@
|
||||
- 签名缺失即失败关闭:构建机未注入签名私钥时发布中止,不产生半成品清单。
|
||||
- 渠道端点写进产物:渠道名一旦发布不可改名(改名等于已发布客户端再也找不到更新)。
|
||||
- 回滚点:发布脚本与流水线都在本里程碑内,回滚后客户端仍可用原先的自研清单协议;迁移桥可独立停用。
|
||||
|
||||
## 本轮复核(2026-09-24)
|
||||
|
||||
状态原为 `approved` / `ready`(规范评审态),实现其实已经落地,本轮按当前工作树复核并改记为 `implemented-awaiting-runtime-acceptance`:
|
||||
|
||||
- 渠道单点定义 `apps/ai-game-creator-shell/scripts/channel-identity.mjs`;`build-release.mjs` 由它解析渠道,渠道清单 URL 与构建期端点随渠道变化。
|
||||
- 流水线渠道参数:`jenkins/Jenkinsfile.ai-game-creator-shell-build` 有 `AGC_UPDATE_CHANNEL`(dev / release / 自定义小写名)并把部署目标绑定为渠道对应的构建分区。
|
||||
- 定向测试(本轮实跑):`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` → **60 passed / 0 failed**,含 `channel manifest carries version, platform keys and signature`、`missing signature fails the channel manifest closed`、`channel manifest URL and build-time endpoint follow the channel`、`release windows uploads only its own partition and cannot write the dev bridge`。
|
||||
- 未执行(需要签名私钥与发布授权):真实签名打包、真实 OSS 上传、各渠道真机升级验证。
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
# 【实施计划】AGC 本地状态事件化第一批
|
||||
|
||||
Version: `v1`
|
||||
Status: `implemented-awaiting-runtime-acceptance`
|
||||
Date: `2026-09-23`
|
||||
Parent Spec: `docs/project-memory/plans/【里程碑】AGC渲染层事件化与Rust数据源-2026-09-23.md`
|
||||
|
||||
## 修改边界
|
||||
|
||||
1. `src-tauri/src/agent/direct_runtime` 与 `runtime_driver`:增加活动回合快照事件,在注册、状态变化和 guard 释放后发送;不改变既有 Tauri command 与运行语义。
|
||||
2. `src/features/agent-runtime/directActiveTurns.ts`:订阅事件并去重,首次只读一次快照,移除 5 秒定时器。
|
||||
3. `src-tauri/src/asset_generation_tasks.rs`:账本写入成功后发送项目任务变更事件;`resourceCanvasAssetGenerationQueue.ts` 通过事件唤醒单次读取,恢复/丢事件仍允许显式读取。
|
||||
4. `src-tauri/src/plugin_host.rs`:插件状态变更后发送插件快照事件;`RuntimeConfigDialog.tsx` 订阅事件并移除 1 秒定时器。
|
||||
5. 对应 Vitest/Rust 测试与必要的 AGC 文档更新。
|
||||
6. `direct_thread_manager`、Tauri handler 与聊天订阅 hook 补幂等 unsubscribe;`App.tsx` 保存失败后解除自触发重写,定向覆盖故障注入与策略读取单飞。
|
||||
|
||||
## 实施顺序
|
||||
|
||||
- 先增加 Rust 事件与单元测试,再改 React 订阅,避免出现“旧读取已删、新事件未发”的中间态。
|
||||
- 事件 handler 只接受当前项目/当前代次,按内容签名去重;清理函数必须幂等。
|
||||
- 事件不可用时只保留首次快照与用户触发的显式刷新,不增加隐式定时器。
|
||||
|
||||
## 验证命令
|
||||
|
||||
- `npm exec vitest run -- apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx apps/ai-game-creator-shell/tests/resourceCanvasAssetGenerationQueue.test.ts apps/ai-game-creator-shell/tests/tauriEventSubscription.test.ts`
|
||||
- `npm exec vitest run -- apps/ai-game-creator-shell/tests/appSurface.test.ts`
|
||||
- `npm --prefix apps/ai-game-creator-shell run typecheck`
|
||||
- 对 AGC 壳 Rust 运行相关单测分片或定向 `cargo test`
|
||||
- `npm run check:encoding`
|
||||
- `git diff --check`
|
||||
|
||||
## 回滚点
|
||||
|
||||
事件名与 payload 是内部 Tauri 合同;若运行时验证发现订阅或事件顺序问题,可保留 Rust 事件发送、临时恢复一次性快照读取,并回退 React reducer,不修改持久化账本和既有 command。
|
||||
|
||||
## 当前验证记录
|
||||
|
||||
- `npm run ai-game-creator-shell:check:web`:类型检查、配置契约和 AGC Web 全量门禁通过,`1858 passed / 14 skipped`。
|
||||
- 定向事件/生命周期测试:`41 passed`;其中活动回合 `11/11`、资源生成队列 `19/19`、线程订阅 `2/2`。
|
||||
- Rust 定向测试:Direct Thread Manager `13/13`、活动回合快照 `1/1`、素材生成账本 `15/15`、插件宿主 `17/17`。
|
||||
- `cargo fmt --check`、`npm run check:encoding`、`npm run check:doc-index`、`git diff --check` 通过。
|
||||
- 未验证真实 Provider、打包后 Tauri 窗口时延和外部发行网络迁移;账户、素材上传、错误上报与发行网络仍按后续里程碑保留。官方模型目录已在本轮单独由 `load_game_creator_llm_models` 下沉到 Rust,但不能据此宣称全部 React 网络 I/O 已归 Rust。
|
||||
|
||||
## 本轮取证(2026-09-24)
|
||||
|
||||
- 验收 1(活动回合与素材任务不再定时轮询):`rg setInterval apps/ai-game-creator-shell/src` 全仓只剩计时/动画与拖拽重复器;`directActiveTurns.ts` 走 `DIRECT_ACTIVE_TURNS_CHANGED_EVENT` 事件 + 单飞读取并在注释里写明「不恢复定时轮询」,`resourceCanvasAssetGenerationQueue.ts` 走 `game-creator-asset-generation-task-changed` 事件(Rust 在账本状态变更处 emit),事件桥不可用时才回退注入的 wait。
|
||||
- 验收 3/7(订阅先于快照、重复事件不换数组身份、卸载后迟到事件不写回、subscriber 幂等注销):`npx vitest run tests/directActiveTurns.test.tsx tests/resourceCanvasAssetGenerationQueue.test.ts --root apps/ai-game-creator-shell` → **11 + 19 passed**;Rust 侧 `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --offline -- direct_thread_manager --test-threads=1` → **13 passed**。
|
||||
- 验收 4(插件状态:进入读一次 + 事件更新 + 显式刷新):`npx vitest run tests/pluginHost.test.ts --root apps/ai-game-creator-shell` → **14 passed**。
|
||||
- 仍未验证(需要真实客户端):长回合中插件状态事件与素材任务事件的真实时序、真实 Provider 生成下的任务账本事件密度。
|
||||
@@ -3,7 +3,7 @@
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】AGC渠道安装身份隔离-2026-09-21.md` |
|
||||
| Status | ready |
|
||||
| Status | implemented-awaiting-runtime-acceptance |
|
||||
| Owner | 当前 Agent |
|
||||
|
||||
## 修改边界
|
||||
@@ -54,3 +54,8 @@
|
||||
- `channel-identity.mjs` 是展示名单一来源。发布构建将同一 `productName` 同时注入 Tauri 安装配置、原生窗口标题和 `VITE_AGC_PRODUCT_NAME`;React 自绘标题栏及关于/运行时配置展示从该注入值读取。
|
||||
- 因此 Windows NSIS 默认生成的快捷方式、开始菜单/卸载注册表展示名随 Tauri `productName` 变为 `陶泥儿开发版`;未新增自定义注册表或快捷方式实现。
|
||||
- 静态 Tauri 基线配置同步为 `陶泥儿开发版`,本地壳与正式 `dev` 包的显示名保持一致。
|
||||
|
||||
## 本轮复验(2026-09-24)
|
||||
|
||||
- `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`:**60 passed / 0 failed**,含「release / beta 的 Windows 与 macOS 构建只写自己渠道分区、不能写 dev 桥」四条分区隔离用例。
|
||||
- 仍未执行:真实渠道打包(需要签名私钥与发号/上传授权)、双渠道真机并存安装、macOS 构建节点实跑。
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# AGC 画布交互稳定性修复实施计划
|
||||
|
||||
- Date: 2026-09-16
|
||||
- Status: awaiting-runtime-acceptance
|
||||
- Status: implemented-awaiting-runtime-acceptance
|
||||
- Milestone: [画布交互稳定性修复](./【里程碑】AGC画布交互稳定性修复-2026-09-16.md)
|
||||
|
||||
## 修改顺序与边界
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# AGC 统一错误诊断与验收反馈实施计划
|
||||
|
||||
Version: 1.0
|
||||
Status: active
|
||||
Status: implemented-awaiting-runtime-acceptance
|
||||
Date: 2026-09-15
|
||||
Parent Milestone: `【里程碑】AGC统一错误诊断与验收反馈-2026-09-15.md`
|
||||
|
||||
@@ -33,3 +33,19 @@ Parent Milestone: `【里程碑】AGC统一错误诊断与验收反馈-2026-09-1
|
||||
- 若前端详情读取失败,仍展示安全 `publicText`,不阻塞错误终态。
|
||||
- 若素材身份无法映射,继续失败关闭并记录明确 code,不回退为路径字符串通过。
|
||||
- 回滚可删除新事件写入和详情入口,保留旧 `failure.json` 读取兼容。
|
||||
|
||||
## 当前进度(2026-09-24)
|
||||
|
||||
- 已落地并验证:统一错误事件模型与脱敏(`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --offline -- --test-threads=1 runtime_error` → 7 passed)、DirectProject 失败安全投影与项目内 sidecar、下一轮诊断上下文、app-server 终态与超时分类、试玩 attempt 上限。
|
||||
- 本轮补缺口:渲染层取回 `detailRef` 的口径抽成 `apps/ai-game-creator-shell/src/services/agentRuntimeErrorDetail.ts`,新增 `tests/agentRuntimeErrorDetail.test.ts`(4 条);Rust 侧新增 `direct_codex_failure_text_keeps_the_detail_ref_marker_for_the_renderer` 钉住同一份文案。两侧用例互相引用用例名,改文案或改解析都会变红(文案标记过去只在渲染层内联正则里,两侧都没有测试)。
|
||||
- 仍未完成的是验收标准 6 的交互项:诊断正文目前随失败文案一次性读回并展示,尚未做成「点击详情后才读取」的展开入口。要继续的话先在主规范里定交互,再改 UI;在那之前本里程碑保持 `active`,不按已完成收口。
|
||||
|
||||
## 报告缺口关闭(2026-09-24)
|
||||
|
||||
上一轮记录里「验收标准 6 的交互项未完成」已经实现,本轮把计划从 `active` 改记为 `implemented-awaiting-runtime-acceptance`:
|
||||
|
||||
- 修掉一个真实缺陷:Native 已经下发 `direct-codex-failure:v2`(在 v1 之上多了 `code=` 与末尾 `;详情:<detailRef>`),但渲染层映射只认 v1,任何 DirectProject 失败都被兜底成「执行失败,请稍后重试」,Rust 精心产出的阶段、摘要与建议全部被丢掉。现在 v1 / v2 共用同一套脱敏与阶段映射(v2 用例在 `tests/agentRuntimeModel.test.ts`,移除 v2 分支该用例变红;2026-09-24 复核:把正则里的 `:v2` 改成 `:v3` 后该文件精确 1 条失败、其余 18 条通过,声明已被独立复现)。
|
||||
- 失败提示不再预读也不内联诊断正文:控制器只把安全 `publicText` 交给面板,`detailRef` 与提示文案分开持有;聊天状态栏下方新增「查看详情 / 收起详情」入口,展开时才调用 `read_agent_runtime_error_detail`(原生命令仍做目录校验与二次脱敏),读不到只显示一句说明,不影响提示本身。
|
||||
- 钉住这条交互的用例:`tests/appSurface/chat-composer.suite.ts` 的「失败提示保留可执行原因,诊断正文只在「查看详情」时读取」(断言点击前没有 `read_agent_runtime_error_detail` 调用、正文不在提示或历史消息里,点击后按 `projectPath + detailRef` 读取并展示,再点收起)。
|
||||
- 自动化:`npx vitest run tests/agentRuntimeModel.test.ts tests/agentRuntimeErrorDetail.test.ts`(23 passed)、`npx vitest run tests/appSurface.test.ts`(191 passed / 9 skipped)、`npx tsc -p apps/ai-game-creator-shell/tsconfig.json --noEmit`、`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --offline -- --test-threads=1 runtime_error`(7 passed)。
|
||||
- 仍未验证(需要真实账号与 Provider):真实失败回合下从提示进入详情、以及下一轮追问从历史读取失败证据的端到端表现。
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
# 【实施计划】AGC 认证会话与账户网络下沉 Rust
|
||||
|
||||
Version: `v1`
|
||||
Status: `implemented-awaiting-runtime-acceptance`
|
||||
Date: `2026-09-24`
|
||||
Parent Spec: `docs/project-memory/plans/【里程碑】AGC认证会话与账户网络下沉Rust-2026-09-24.md`
|
||||
|
||||
## 修改边界
|
||||
|
||||
1. 新增 `src-tauri/src/auth_session.rs`:AppData 私有凭据文件(`client-session.json`)、
|
||||
origin 校验、refresh cookie 解析与原子写入、并发续期合并、401 续期重放与事件发送。
|
||||
2. 新增 `src-tauri/src/account_api.rs`:profile dashboard / 充值中心 / 创建订单 /
|
||||
确认微信充值 / 钱包账单 / 兑换码 typed commands。
|
||||
3. `src-tauri/src/main.rs` 注册新 command 与新模块;`platform_asset_upload.rs`、
|
||||
`game_distribution_publish.rs`、`llm_catalog.rs`、`error_report/submit.rs` 改为经
|
||||
`auth_session` 获取会话并在 401 时续期重放一次,而不是只读当前快照。
|
||||
4. 渲染层 `clientAuth.ts`、`clientHttp.ts`、`clientApi.ts`、`platformSession.ts`、
|
||||
`AuthenticatedClient.tsx`、`useAccountWallet.ts`、`stores/useWalletStore.ts`
|
||||
改为 typed invoke / 事件;
|
||||
|
||||
## 修改顺序
|
||||
|
||||
1. 先落 Rust 凭据存储与 origin 校验,配单元测试;此时尚无调用方,不改变现役行为。
|
||||
2. 落认证 commands 与事件,Rust 内部安装/清除本地运行时会话(复用既有
|
||||
`install_platform_session` / `clear_platform_session` 与 Runner 传播),保留旧 command。
|
||||
3. 落账户/钱包 commands,复用同一会话获取与 401 续期重放。
|
||||
4. 切换渲染层:`AuthenticatedClient` 与钱包改为 command/事件;删除 token 持久化与
|
||||
`fetchClientHttp` 直连调用点。
|
||||
5. 最后清理:删除 `clientApi`/`clientHttp` 中已无调用方的直连实现与旧 localStorage 迁移键,
|
||||
更新主规范与共享记忆。
|
||||
|
||||
## 验证命令
|
||||
|
||||
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml auth_session`
|
||||
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml account_api`
|
||||
- `npm --prefix apps/ai-game-creator-shell run typecheck`
|
||||
- `npx vitest run apps/ai-game-creator-shell/tests/clientAuth.test.ts apps/ai-game-creator-shell/tests/accountWallet.test.tsx`
|
||||
- `npm run ai-game-creator-shell:check:web`
|
||||
- `cargo fmt --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml -- --check`
|
||||
- `npm run check:encoding`、`npm run check:doc-index`、`git diff --check`
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- refresh 凭据落盘是本计划的最高风险项:必须使用与其它 AGC 私有文件相同的 ACL/普通文件
|
||||
门禁,并且只写 refresh cookie(不写 access token)。
|
||||
- 401 续期重放必须只重放一次;付费创建订单的未知结果按 `result-unknown` 处理,不自动重放。
|
||||
- 回滚点:保留旧 `install/clear_platform_account_session` 与旧 `clientAuth` 分支直到验收;
|
||||
回退时删除 Rust 凭据文件即回到未登录状态。
|
||||
|
||||
## 当前验证记录(2026-09-24)
|
||||
|
||||
- 新增 `src-tauri/src/auth_session.rs`:AppData 私有 `client-session.json`(Unix 0o600、Windows reparse 检查、私有目录树与原子替换)、origin 校验(纯 origin、非本机必须 HTTPS、发布构建限渠道 origin)、refresh cookie 解析与轮换、登录/验证码/续期/登出 HTTP、`install_client_session_locally` / `clear_client_session_locally` 复用既有 Runner 传播与 app-server 停机路径。
|
||||
- 新增 6 条 typed command:`read_client_auth_state`、`refresh_client_auth_session`、`send_client_phone_login_code`、`login_client_with_password`、`login_client_with_phone_code`、`logout_client_session`,并发出 `agc-client-auth-state-changed` 状态事件(只含状态、用户展示字段与 origin)。
|
||||
- 路由语义分离:会话路由的 401/403 归类成 `authentication-required` / `permission-denied`(可据此清会话),登录路由保留服务端原因(「手机号或密码错误」),避免把用户输入错误显示成登录失效。
|
||||
- Direct 回合保活改为 Rust 持有:`DirectTaonierActiveInvocationGuard` 在登记回合时启动 `spawn_client_session_keepalive`(30 秒 tick、按 access token 签发时间 4 分钟后才真正续期,drop 即 abort),渲染层删除 5 分钟 `setInterval` 与 `DIRECT_CODEX_SESSION_KEEPALIVE_MS`;401 补续期重试路径保留。\n- 渲染层:`clientAuth.ts` 收敛为 typed invoke façade;`platformSession.ts` 收敛为身份代次投影(Rust 事件驱动,同一账号续期不推进代次);`AuthenticatedClient` 的三态恢复、登录、登出全部改走 command/事件;服务器选择迁到 Rust 客户端偏好(`set_client_server_selection`)。
|
||||
- 删除:`services/clientApi.ts`、`clientHttp` 的 `fetchClientHttp`/超时封装/服务器选择 localStorage、`clientAuth` 的 token 持久化、`install/clear/read platform_account_session` 三条渲染层写入入口(Rust 认证内部直接调用)。渲染层 `src` 内已无 `fetch(`、无 access token / refresh cookie 读写。
|
||||
- 验证:Rust 定向 `auth_session` 12/12(含并发续期复用、事件不含凭据、保活窗口判定与未初始化不启动任务)、`direct_runtime` 97/97、`workspace_preferences` 6/6、`account_api` 4/4、`platform_asset_upload` 3/3、`error_report::submit` 4/4;前端 `clientAuthHost` 6/6、`conversationModelSelect` 29/29、`useTemplateLibrary` 11/11、appSurface 认证切片 12/12;`npm run ai-game-creator-shell:check:web` 184 passed / 1800 passed / 14 skipped;`cargo fmt --check`、`check:encoding`、`check:doc-index`、`git diff --check` 通过。
|
||||
- 未验证:真实账号登录/续期/登出、微信支付、多窗口并发刷新、真实 Provider 回合跨 token 过期的保活,仍需环境证据。Direct 回合的 5 分钟保活仍由渲染层定时触发(真正续期已在 Rust),后续可改为由 Rust 在出站调用前按到期时间自续期。
|
||||
|
||||
## 本轮取证(2026-09-24)
|
||||
|
||||
- 原生定向(同一批过滤一次跑完 42 项):`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --offline -- workspace_preferences account_api platform_asset_upload auth_session error_report::submit direct_thread_manager --test-threads=1` → **42 passed**。
|
||||
- 分组明细:`auth_session::` **12 passed**(会话存储所有权与权限、origin 校验、6 条命令的错误分类)、`account_api::` **4 passed**、`platform_asset_upload::` **3 passed**、`workspace_preferences` 6、`direct_thread_manager` 13、`error_report::submit` 含在其中。
|
||||
- 结构:`rg "accessToken|refreshToken" apps/ai-game-creator-shell/src` → 0 命中(渲染层不再持有凭据);`localStorage` 只剩偏好迁移 shim。
|
||||
- 仍未验证(需要真实账号):真实登录/续期/登出、微信支付、多窗口并发刷新、真实 Provider 回合跨 token 过期。
|
||||
@@ -1,7 +1,7 @@
|
||||
# AGC 资源 JSON 语义识别实施计划
|
||||
|
||||
- Date: 2026-09-16
|
||||
- Status: awaiting-runtime-acceptance
|
||||
- Status: implemented-awaiting-runtime-acceptance
|
||||
- Milestone: [AGC 资源 JSON 语义识别](./【里程碑】AGC资源JSON语义识别-2026-09-16.md)
|
||||
|
||||
## 实施边界
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
# 【实施计划】AGC 资源 kind Rust 枚举与 ts-rs 绑定
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】AGC资源kind枚举化Rust绑定与内部收紧-2026-09-15.md` |
|
||||
| Status | complete |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
|
||||
允许修改:
|
||||
|
||||
- `server-rs/crates/shared-contracts` 内 GameCreationApp 资源 kind 的独立 Rust 模块;
|
||||
- shared-contracts 的可选 ts-rs 绑定 feature;
|
||||
- ai-game-creator-shell 的 shared-contracts feature 引用和生成测试入口;
|
||||
- shell 内生成的 GameCreationApp kind TypeScript 文件;
|
||||
- 对应 Rust/TS 定向测试与文档 todo 证据。
|
||||
|
||||
本切片已落地:
|
||||
|
||||
- `GameCreationAppAssetManifestEntry.kind` 由 `String` 收紧为 `GameCreationAppAssetKind`:这是公开 Rust 类型的破坏性变更,按「不写历史兼容代码」直接改类型,不加兼容层、不做数据迁移;manifest 反序列化未知值收口为 `Unknown`。
|
||||
- 上传内容推断的字体写入 `Font`,未知上传类型写入 `Unknown`;图集切片 manifest 写入 `Icon`。
|
||||
- shell 内 manifest kind 的写入侧与读取侧统一为正式枚举成员:资源登记、字体导入、direct runtime 产物、平台美术登记与恢复、manifest 必填校验、资源编辑派生、UI 设计桥接与工作流。
|
||||
- 资源编辑请求的 `sourceSubtype` 只传正式枚举成员;资源编辑内部源身份拆成「正式 kind / 项目版本 / Agent 回执」三类,项目版本与 Agent 回执不再冒充 manifest kind。
|
||||
- ts-rs 绑定改由 `cargo test export_bindings` 生成:枚举自带 `#[ts(export, export_to = …/src/contracts/generated/)]`;退役的 `BindingDTO` / `BindingChange` 不再导出,手写的 `exports_ui_editor_types` 已删除。
|
||||
- `packages/shared/src/contracts/generated/` 作为受控生成目录在 `.prettierrc.json` 中使用与 ts-rs 原始输出一致的格式选项,并在 `.gitattributes` 标记为 `linguist-generated`;生成文件仍参与 Prettier/ESLint 检查,`cargo test export_bindings` 可幂等复现且不再污染工作树。
|
||||
- `Unknown` 表示解析边界无法判定的输入;写入方可以保留该结果,但必须明确决定拒绝写入或交由后续归类,不得把它误写成某个具体 kind。
|
||||
- shell TS 资源引用边界消费生成绑定,资源 kind 集合从生成的 union 穷举派生,并为未知值保留原始值与上下文日志。
|
||||
- api-server 图片快速编辑来源校验改为严格解析 `GameCreationAppAssetKind`,只允许共享枚举的静态图片成员;删除原有 legacy/兼容字符串白名单,退役值不再放行。
|
||||
|
||||
明确不修改:
|
||||
|
||||
- `category`、`mediaType`、`source.kind`、`source.generationKind`;
|
||||
- api-server 的其他资源 taxonomy、SpacetimeDB schema、OpenAPI;本切片只改图片快速编辑的 GameCreationApp manifest 来源校验。
|
||||
- shared-contracts 的 canonical alias 表与读时自愈:alias 表已删除,严格解析和 `Unknown` 口径保持不变;
|
||||
- `packages/shared` 中重复的资源 kind 手写契约与其余前端裸 `string` 字段(后续切片)。
|
||||
|
||||
## 实现顺序
|
||||
|
||||
1. 新建独立 kind 模块,定义当前正式成员:17 个现有 canonical kind + `font` + `Unknown`,serde 使用 kebab-case。
|
||||
2. 为 enum 增加可选 ts-rs derive,默认 shared-contracts 构建不引入 ts-rs。
|
||||
3. 让 shell 的 shared-contracts 依赖打开绑定 feature;生成目录 2026-09-17 起收敛到 `packages/shared/src/contracts/generated/`(kind 是跨端契约,不再放 shell 私有目录)。
|
||||
4. 增加 Rust serde round-trip 与 Unknown 解析/序列化测试;TS 侧不再手写生成值集合,改为从生成 union 穷举派生。
|
||||
未知值通过 `parse_with_context` 收口到 `Unknown`,并把原始值与解析上下文交给壳层注册的 `app_log!` 回调(2026-09-17 起不再用 `tracing` / `kind-observability`)。
|
||||
5. 运行 shared-contracts 与 shell 定向测试,并用 `export_bindings` 复现生成文件;完成后将稳定结论回写里程碑并关闭本计划。
|
||||
|
||||
## 验证命令
|
||||
|
||||
1. `cargo fmt --all -- --check`
|
||||
2. `cargo test --locked -p shared-contracts game_creation_app --manifest-path server-rs/Cargo.toml`
|
||||
3. `cargo test --locked -p shared-contracts --features ts-bindings export_bindings --manifest-path server-rs/Cargo.toml`(生成 `packages/shared/src/contracts/generated/GameCreationAppAssetKind.ts`)
|
||||
4. `cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml export_bindings`(生成 shell 自己的 ts-rs 绑定)
|
||||
5. `npx vitest run apps/ai-game-creator-shell/tests/assetKind.test.ts packages/shared/src/contracts/gameCreationApp.test.ts`(解析 Rust 源码的 `assetKindCanonicalMapping.test.ts` 2026-09-17 已删除:手写词汇表被移除后它没有比对对象)
|
||||
6. `npm run check:encoding`
|
||||
7. `git diff --check`
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- 风险:ts-rs 默认生成 enum/union 形态与 serde rename 不一致;必须以生成文件和 round-trip 测试为准。
|
||||
- 风险:shared-contracts 被 SpacetimeDB/WASM 使用;ts-rs 必须是 optional feature,默认构建不可依赖。
|
||||
- 回滚点:本切片仅新增 enum/绑定,不改变现有 manifest JSON 解析;若生成链路不稳定,可回滚本提交而不影响现有业务。
|
||||
@@ -1,43 +0,0 @@
|
||||
# 【实施计划】AGC 资源 kind 词汇审计与绑定架构
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】AGC资源kind枚举化词汇审计与绑定架构-2026-09-15.md` |
|
||||
| Status | complete |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
|
||||
允许修改:
|
||||
|
||||
- 主规范中的资源 kind 当前口径;
|
||||
- `docs/project-memory/plans/` 下本任务的里程碑/实施计划;
|
||||
- `docs/project-memory/todos/` 下本任务的扫描清单;
|
||||
- 为审计提供只读扫描脚本(如确有必要,脚本也只覆盖 shell)。
|
||||
|
||||
明确不修改:
|
||||
|
||||
- 已完成的 `apps/ai-game-creator-shell` 业务收口不再属于未决范围;后续只允许按新里程碑变更;
|
||||
- server-side 代码、OpenAPI、SpacetimeDB schema;
|
||||
- MIME、`source.kind`、`generationKind` 和其他字符串领域。
|
||||
|
||||
## 实现顺序
|
||||
|
||||
1. 按“manifest asset kind / 其他字段 / 仅文本同名”三类扫描 shell 的 `kind`、`assetKind`、`asset_kind` 和 manifest 构造器。
|
||||
2. 对每个候选值回到调用上下文,标记生产写入、读取投影、协议输入、测试 fixture 或纯文本/路径。
|
||||
3. 对照 api-server 当前有效资源 kind,排除 legacy、billing/storage synthetic taxonomy 和开放字段。
|
||||
4. 记录正式候选 enum、Unknown 输入行为、保留字符串字段和后续 PR 边界。
|
||||
5. 形成下一里程碑的文件级修改顺序和验证矩阵;本里程碑结束后暂停,等待验收。
|
||||
|
||||
## 验证命令
|
||||
|
||||
1. `rg -n 'kind|assetKind|asset_kind' apps/ai-game-creator-shell/src apps/ai-game-creator-shell/src-tauri/src`
|
||||
2. `npm run check:doc-index`
|
||||
3. `npm run check:encoding`
|
||||
4. `git diff --check`
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- 风险:同一字符串可能是 manifest kind、workflow kind 或路径名;任何未回到上下文确认的替换都禁止进入代码。
|
||||
- 风险:shared-contracts 被多个 server crate 使用;ts-rs 生成必须通过 feature/独立入口隔离默认构建。
|
||||
- 回滚点:本里程碑只有文档和审计清单变更;若词汇边界未能闭合,删除本计划和 todo,不进入代码里程碑。
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
对应:[里程碑](./【里程碑】AGC资源菜单收纳-2026-09-17.md),Issue #409,产品已确认方案 A。
|
||||
|
||||
Status: implemented-awaiting-runtime-acceptance
|
||||
|
||||
## PR #410 CI 修复
|
||||
|
||||
以远端合并提交 959beebf 为基线:修复菜单文件 import 排序、Web 角标结构断言、活动回合空快照与晚到请求竞态;窗口发布次数断言对齐稳定快照合同。原生 HTTP scope 检查对齐官方 updater 当前权限,不恢复退役 OSS 白名单;Rust 图集测试补齐显式切片模式与 strict schema 字段,不放宽正式校验。按故障项定向测试后运行前端全套及原生契约检查;Rust 使用独立 target,实际未执行的检查必须单独列出。推送需再次确认。
|
||||
@@ -14,3 +16,10 @@
|
||||
4. 并行执行定向 Vitest、AGC 类型检查、编码与文档索引检查,再自审整体调用链。
|
||||
|
||||
风险:portal 浮层点击外部判定、缩放角标与拖拽冲突、原测试依赖完整工具栏。回滚仅撤销本分支 UI 与文档修改;无数据迁移。首个检查点为组件用例通过,第二个为工作台集成与类型检查。真实客户端未测则明确保留待验收状态。
|
||||
|
||||
## 本轮复验(2026-09-24)
|
||||
|
||||
- 共用收纳控件与 UI 基元:`npx vitest run packages/shared/src/components/OverflowActions.test.tsx packages/shared/src/components/ui.test.tsx` → **14 passed**(浮层开关、外部关闭、键盘、视口约束与表格/标签等基元语义)。
|
||||
- AGC 资源画布菜单与卡面:`npx vitest run tests/resourceCanvasBottomToolbar.test.tsx tests/resourceCanvasCardName.test.tsx tests/resourceCanvasToolbarModel.test.ts`(`--root apps/ai-game-creator-shell`)→ **39 passed**。
|
||||
- 全量界面门禁:`npm run ai-game-creator-shell:check:web` → 185 files passed / 1 skipped、1806 tests passed(含工作台整表回归)。
|
||||
- 仍未验收(人工、需要真实客户端):真实客户端视觉、原生保存对话框、触摸板操作手感。
|
||||
|
||||
@@ -49,3 +49,9 @@
|
||||
- 音频自带的 operation 幂等账本与任务账本是两层身份:任务 id 取 operation id,重试复用同一对 operation / 幂等键;不得为「省事」在重试时换新的请求身份(那是一次新的付费生成)。
|
||||
- 账本 `kind` 为音频时,`restore` 的入口文案若查不到工具栏模型会退化成素材名:入口文案必须由工具栏模型派生,避免恢复后文案漂移。
|
||||
- 后台跑生成会让「项目 revision CAS」窗口从提交前移到派发时刻:冲突时按失败收口(不静默重试),避免把生成写到非预期基线。
|
||||
|
||||
## 本轮复验(2026-09-24)
|
||||
|
||||
- 原生后台任务账本:`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --offline -- --test-threads=1 asset_generation_tasks` → **15 passed / 0 failed**(任务入账、阶段投影、终态收口与事件通知路径)。
|
||||
- 前端队列与面板:`npx vitest run tests/resourceCanvasAssetGenerationQueue.test.ts tests/resourceCanvasAssetGenerationTasksPanel.test.tsx --root apps/ai-game-creator-shell` → 与批量标签同批执行通过(队列单飞、事件唤醒回退、面板状态投影)。
|
||||
- 仍未验证(需要真实平台生成与账号):真实音频生成经后台任务账本跑到终态、失败重试与跨项目切换表现。
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
# AGC 项目创建目录可选实施计划
|
||||
|
||||
Version: 1.0
|
||||
Status: active
|
||||
Date: 2026-09-17
|
||||
Related Spec: `docs/technical/【技术方案】AGC模板库与模板建项-2026-09-17.md`、`docs/【技术方案】AGC异步操作可恢复闭环-2026-09-14.md`
|
||||
|
||||
## 目标
|
||||
|
||||
让用户在 AGC 里能自己选项目创建目录:首页「做游戏 / 做方案」自动建项与模板库「使用模板」建项都落在用户选定的目录下;不选时保持 AGC 管理的默认位置(`<app_data>/projects`),行为与现状一致。
|
||||
|
||||
## 交接结果
|
||||
|
||||
- `create_automatic_local_game_project`、`create_automatic_local_game_project_from_template` 新增可选参数 `projectsRoot`;为空时由 Rust 侧回落到默认目录。
|
||||
- `pick_local_project_directory` 新增可选参数 `title`(只接受短标题,其余回退「选择游戏项目目录」)。
|
||||
- 新增用户偏好「项目创建目录」:`localStorage` 键 `genarrative-ai-game-creator.project-creation-directory.v1`。
|
||||
- 入口在客户端设置里:侧边栏「配置」→ 设置分类「工作区」;`RuntimeConfigDialog` 内用 `useProjectCreationDirectory` 展示与改选目录,不经过首页或模板库页头。
|
||||
- 首页「做游戏 / 做方案」与模板库「使用模板」建项时读取同一份偏好,用户不需要在建项前再选一次。
|
||||
|
||||
## 行为契约
|
||||
|
||||
- 允许的来源只有一个:本机原生目录选择器(`pick_local_project_directory`)。它返回的目录已在选择时按 user-selected 范围做过一次加固,构成「用户显式选择」边界。
|
||||
- Rust 侧 `validate_requested_game_project_creation_root` 对传入目录要求:非空、绝对路径、无控制字符、已存在的普通目录(符号链接 / Windows reparse point / 普通文件一律拒绝),并通过 `prepare_game_creator_project_root_for_read`(user-selected 范围的一次性修复)。目录不存在时不代为创建,直接失败。
|
||||
- 建出的项目目录仍在所选目录下按 `gameagent-<8位短ID>` 命名,项目名、`.agent` 初始化、首轮投递与既有自动建项完全一致。
|
||||
- 偏好只保存「用户意图」,不是授权凭据:存储被外部改动最坏只是回退默认位置或一次可见的建项失败,不会跳过 Rust 门禁。
|
||||
- 该偏好是客户端本地设置,不写入 `read_game_creator_app_config` / 保存设置的那份运行时配置:在「工作区」里选择目录当场生效,与「保存设置」按钮无关。
|
||||
- 「恢复默认位置」清空偏好即回到应用数据目录;既有项目不迁移。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. **Rust 建项入口**
|
||||
- `commands.rs`:新增 `validate_requested_game_project_creation_root` / `resolve_game_project_creation_root`,`create_automatic_local_game_project` 接受 `projects_root`;`pick_local_project_directory` 接受 `title`。
|
||||
- `template_library.rs`:模板建项复用同一解析函数。
|
||||
- 交付:两条定向单测(校验矩阵、在指定创建目录下建项)。
|
||||
- 验收:`cargo test --bin genarrative-ai-game-creator-shell creation_root` 全绿。
|
||||
|
||||
2. **前端偏好与入口**
|
||||
- `features/app-shell/model.ts`:`normalizeProjectCreationDirectory` / `readProjectCreationDirectory` / `writeProjectCreationDirectory` / `projectCreationDirectoryLabel`。
|
||||
- `useProjectCreationDirectory`:选择目录、恢复默认、状态文案(失败在设置页字段内可见)。
|
||||
- `RuntimeConfigDialog` 新增「工作区」设置分类,承载「项目创建目录」字段与「选择目录 / 恢复默认位置」动作。
|
||||
- `useHomeProjectCreation` 与 `useTemplateLibrary` 在建项时带上 `projectsRoot`。
|
||||
- 交付:偏好模型 4 项单测、设置页 1 项交互测试、appSurface 1 项「设置里选目录后建项」端到端场景。
|
||||
- 验收:`npx vitest run apps/ai-game-creator-shell/tests/projectCreationDirectory.test.ts apps/ai-game-creator-shell/tests/appSurface.test.ts` 全绿。
|
||||
|
||||
3. **文档与共享记忆**
|
||||
- 本实施计划;模板库技术方案的命令表补 `projectsRoot`;`decision-log.md` 记录偏好键与命令参数;`pitfalls.md` 说明用户自选目录与 AGC 管理目录的关系。
|
||||
- 验收:`node scripts/check-doc-index.mjs` 通过。
|
||||
|
||||
## 验证命令
|
||||
|
||||
```bash
|
||||
cargo check --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell
|
||||
cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell creation_root
|
||||
cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell template_library
|
||||
cd apps/ai-game-creator-shell && npx tsc -p tsconfig.json --noEmit
|
||||
npx vitest run apps/ai-game-creator-shell/tests
|
||||
npm run check:encoding
|
||||
node scripts/check-doc-index.mjs
|
||||
git diff --check
|
||||
```
|
||||
|
||||
手动验收(客户端内):侧边栏「配置」→「工作区」→「选择目录」选 `F:\Projects\我的游戏`,回首页建项后项目目录应为 `F:\Projects\我的游戏\gameagent-<8位>`;模板库「使用模板」建项同样落在该目录;点「恢复默认位置」后再建项回到应用数据目录。
|
||||
|
||||
## 风险与回退
|
||||
|
||||
- **自选目录无法加固**:`Documents` 等带受保护继承 ACL 的位置可能加固失败。失败发生在选择器或建项前置校验阶段,报错可见且不会留下半成品项目;用户改选其它目录或用默认位置即可。
|
||||
- **偏好漂移**:偏好只是提示值,每次建项都会重新校验;存储被改坏不会绕过门禁。
|
||||
- **回退**:删掉偏好键(或点「恢复默认位置」)即回到默认目录;需要彻底移除该能力时,去掉两个命令的可选参数与设置页字段即可,Rust 默认路径逻辑不变。
|
||||
@@ -1,7 +1,7 @@
|
||||
# AGC 项目定时快照上传实施计划
|
||||
|
||||
Version: 1.0
|
||||
Status: active
|
||||
Status: implemented-awaiting-runtime-acceptance
|
||||
Date: 2026-09-17
|
||||
Parent Milestone: `【里程碑】AGC项目定时快照上传-2026-09-17.md`
|
||||
|
||||
@@ -41,3 +41,13 @@ Parent Milestone: `【里程碑】AGC项目定时快照上传-2026-09-17.md`
|
||||
- 数据出境边界(2026-09-22 修订):只上传项目目录内普通文件。`.agent` 承载项目身份与 Agent 状态,整目录上传(含 conversations、logs、runtime、checkpoint、`agent.db`);`.git`、构建产物、临时文件与凭据类文件仍不在白名单内。该修订只作用于快照同步,项目索引与 checkpoint 继续排除整个 `.agent`。
|
||||
- 服务端未配置 bucket 时客户端必须失败关闭,不能把本地索引推进成"已同步",否则后续同步会漏传。
|
||||
- 回滚:客户端可停用触发接线(保留模块与测试)即可回到无上传行为;服务端路由与配置项可单独移除,不影响既有 OSS 前缀与错误报告链路。
|
||||
|
||||
## 本轮验证(2026-09-24)
|
||||
|
||||
- 客户端定向:`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml project_snapshot -- --test-threads=1` → 24 passed / 1 ignored(ignored 是真实 OSS live smoke)。
|
||||
- 服务端定向:`cargo test -p api-server project_snapshot -- --test-threads=1` → 21 passed / 1 ignored(ignored 需要私有 OSS 环境文件的只读用例)。
|
||||
- 本轮补上验收标准 10 的缺口:回收选择抽成纯函数 `plan_project_snapshot_reclamation`,新增 3 条用例覆盖「只回收上一版登记过的对象」「上一版清单读不到时一张都不删」「单轮回收有上限」,并做过变异验证(把保留判据退化成只看路径时该用例变红)。2026-09-24 独立复核:把 `retained` 从 `(路径, 字节数, 摘要)` 三元组退化成只收路径后,`project_snapshot_reclamation_retires_only_objects_the_previous_manifest_registered` 精确红在这一条(同路径但内容已变的 `game/index.html` 旧对象不再进回收计划),另两条回收用例仍绿(2 passed / 1 failed);改回后 3 条全绿、`cargo fmt --check` 通过。
|
||||
- 主规范已补「验收面 → 用例」对照表:`docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md` 的 2026-09-17 小节。
|
||||
- 仍未取得证据:真实 OSS 往返、开发态打开项目的索引写入与日志、关窗触发的那一次同步。
|
||||
|
||||
因此本计划从 `active` 改为 `implemented-awaiting-runtime-acceptance`:行为与定向测试已经落地,缺的是环境侧证据,不替用户签收。
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
Version: 1
|
||||
Status: active
|
||||
Date: 2026-09-15
|
||||
Parent Spec: 【里程碑】AGC首页策划补全入口-2026-09-15.md
|
||||
|
||||
## 修改顺序
|
||||
|
||||
1. 在 `view/home/index.tsx` 增加本地复选框状态与入口切换清理。
|
||||
2. 将游戏勾选状态映射到既有 `ProjectStartMode`。
|
||||
3. 增加启动模式纯函数测试,覆盖模式分流;首页显示边界和切换清理作为后续组件测试补充项。
|
||||
|
||||
## 验证
|
||||
|
||||
- AGC 首页相关定向测试。
|
||||
- AGC 前端 typecheck。
|
||||
- `npm run check:encoding` 与 `git diff --check`。
|
||||
|
||||
## 当前验证边界
|
||||
|
||||
本次已交付测试覆盖 `planning` / `direct-build` 模式分流;“策划补全”复选框的显示边界及切换创作类型后的状态清理尚未有组件级自动化测试,需后续补充 `HomeView` 测试时完成。
|
||||
@@ -1,5 +1,5 @@
|
||||
Version: 1.0
|
||||
Status: implemented; real-project runtime smoke pending
|
||||
Status: implemented-awaiting-runtime-acceptance(真实项目 runtime smoke 待补)
|
||||
Date: 2026-09-14
|
||||
Parent Milestone: docs/project-memory/plans/【里程碑】DirectProject Phaser迁移闭环-2026-09-14.md
|
||||
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
# 【实施计划】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,37 +0,0 @@
|
||||
# 【实施计划】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 或迁移。
|
||||
@@ -1,42 +0,0 @@
|
||||
# 【实施计划】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
@@ -1,64 +0,0 @@
|
||||
# 【实施计划】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,37 +0,0 @@
|
||||
# 【实施计划】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、附件/图片上传 DTO、SpacetimeDB、HTTP API;上传 DTO 仅在入口转换为 canonical `content[]`,不再以 sidecar 文本追加。
|
||||
- 本切片明确:不根据 MIME 类型判断图片,不生成 `agc_image_reference`;所有上传文件统一映射为 `agc_attachment_reference`。
|
||||
|
||||
## 实现顺序
|
||||
|
||||
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` 修改,禁止覆盖或提交。
|
||||
- 每个切片保持独立提交,出现协议问题时按提交粒度回滚。
|
||||
@@ -1,95 +0,0 @@
|
||||
# 【实施计划】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 条。
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user