补充DirectProject事件订阅规范
补充Thread Manager全局事件队列、subscriber cursor与consume契约 补充持久化顺序、队头回收、过期重订阅和历史锚点规则 新增Thread Manager里程碑规范与小步实施计划
This commit is contained in:
@@ -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 读取分支,补齐契约、并发、恢复和失败关闭测试。
|
||||
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,52 @@
|
||||
# 【里程碑】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、无迁移。
|
||||
|
||||
## 证据要求
|
||||
|
||||
- 自动化:queue/cursor/eviction 并发单测、事件标准化和持久化顺序测试、Tauri command 测试、前端 reducer 与重订阅测试。
|
||||
- 运行时:关闭/切页后重进 DirectProject;并发 item;短暂断线 consume;cursor 过期重订阅。
|
||||
- 边界:持久化失败、未知 subscription、queue 超限、多个 subscriber、turn 无 item 间隙、legacy 行拒绝。
|
||||
Reference in New Issue
Block a user