baa-conductor

git clone 

baa-conductor / tasks
codex@macbookpro  ·  2026-03-30

T-S056.md

  1# Task T-S056:对话自动化状态与对话关联接口
  2
  3## 状态
  4
  5- 当前状态:`已完成`
  6- 规模预估:`M`
  7- 依赖任务:`T-S055`
  8- 建议执行者:`Claude` 或 `Codex`
  9
 10## 直接给对话的提示词
 11
 12`/Users/george/code/baa-conductor/tasks/T-S056.md` 任务文档,完成开发任务。
 13
 14如需补背景,再读:
 15
 16- `/Users/george/code/baa-conductor/plans/discuss/DISCUSS-TIMED-JOBS-RENEWAL-REQUIREMENTS.md`
 17- `/Users/george/code/baa-conductor/tasks/T-S055.md`
 18
 19## 当前基线
 20
 21- 仓库:`/Users/george/code/baa-conductor`
 22- 分支基线:`main`
 23- 提交:`071abbf`
 24
 25## 分支与 worktree(强制)
 26
 27- 分支名:`feat/renewal-automation-control`
 28- worktree 路径:`/Users/george/code/baa-conductor-renewal-automation-control`
 29
 30开工步骤:
 31
 321. `cd /Users/george/code/baa-conductor`
 332. `git worktree add ../baa-conductor-renewal-automation-control -b feat/renewal-automation-control main`
 343. `cd ../baa-conductor-renewal-automation-control`
 354. 在这个 worktree 目录里开发,不要回到主仓库目录
 36
 37完成后提交与推送:
 38
 391. 在 worktree 里提交所有变更(包括更新后的任务文档)
 402. `git push -u origin feat/renewal-automation-control`
 41
 42合并步骤(由合并者执行):
 43
 441. `cd /Users/george/code/baa-conductor`
 452. `git fetch origin`
 463. `git merge origin/feat/renewal-automation-control`
 474. `git push`
 485. `git worktree remove ../baa-conductor-renewal-automation-control`(如果 worktree 还在)
 49
 50合并冲突处理:
 51
 521. 如果 `git merge` 报冲突,先 `git diff` 查看冲突文件
 532. 手动解决冲突后 `git add` 冲突文件
 543. `git merge --continue` 完成合并
 554. 不要用 `git merge --abort` 然后 force 覆盖
 56
 57命名规则:
 58
 59- 功能任务分支名以 `feat/` 开头
 60- 缺陷任务分支名以 `bug/` 开头
 61
 62## 目标
 63
 64`conductor` 正式持有对话级自动化状态,并维护本地对话与平台对话、浏览器目标、页面路由之间的关联。
 65
 66## 背景
 67
 68续命规则已经明确由对话自动化状态驱动,而不是由消息本身直接驱动。首版需要正式支持三态:
 69
 70- `manual`
 71- `auto`
 72- `paused`
 73
 74同时,需要一层正式的对话关联关系,承载平台对话和目标路由信息。
 75
 76## 涉及仓库
 77
 78- `/Users/george/code/baa-conductor`
 79
 80## 范围
 81
 82- 定义本地对话状态读写流程
 83- 将观察到的平台对话、client、页面、路由信息写入对话关联表
 84- 提供最小可用的本地 API 读写接口
 85- 不实现消息投影和续命发送
 86
 87## 路径约束
 88
 89- 对话状态必须基于 `local_conversations`,不要回退到拼接 key
 90- API 命名统一收进 `/v1/renewal/` 命名空间
 91- 不要求首版修改 Firefox 插件 UI,只做后端控制面
 92
 93## 推荐实现边界
 94
 95建议优先做:
 96
 97- `apps/conductor-daemon/src/local-api.ts`
 98- `apps/conductor-daemon/src/firefox-ws.ts`
 99- 新建 `apps/conductor-daemon/src/renewal/` 目录承载辅助逻辑
100
101## 允许修改的目录
102
103- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
104- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/firefox-ws.ts`
105- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.ts`
106- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/renewal/`
107- `/Users/george/code/baa-conductor/packages/artifact-db/`
108
109## 尽量不要修改
110
111- `/Users/george/code/baa-conductor/plugins/`
112- `/Users/george/code/baa-conductor/packages/d1-client/`
113
114## 必须完成
115
116### 1. 对话状态模型
117
118- 支持 `manual / auto / paused`
119- 能按本地对话 ID 读取和更新状态
120- 为后续插件面板和 `baa` 指令系统共用同一份后端状态
121
122### 2. 对话关联关系
123
124- 将平台对话 ID 与本地对话 ID 建立关联
125- 将 client、页面 URL、页面标题、目标路由快照写入对话关联表
126- 新消息到达时能解析并落到正确的本地对话
127
128### 3. 本地 API
129
130- 增加对话状态读取接口
131- 增加 `manual / auto / paused` 的写接口
132- 增加最小可用的对话关联查询接口,方便后续排障
133
134## 需要特别注意
135
136- `paused` 不是删除或禁用对话,只是暂停自动化
137- 这一步不要实现 projector 或 dispatcher
138- 尽量把读写逻辑收敛到 `renewal/` 辅助模块,不要把状态机细节散落到 `local-api.ts`
139- 所有开发必须在 worktree 中进行,不要在主仓库目录修改代码
140
141## 验收标准
142
143- 可以创建或解析本地对话记录
144- 可以把本地对话状态切到 `manual / auto / paused`
145- 可以通过 API 读取当前状态和关联目标信息
146- 新增逻辑不破坏现有 `browser.final_message` 主链路
147
148## 推荐验证命令
149
150- `cd /Users/george/code/baa-conductor-renewal-automation-control && pnpm build`
151- `cd /Users/george/code/baa-conductor-renewal-automation-control && pnpm -C apps/conductor-daemon test`
152
153## 执行记录
154
155> 以下内容由执行任务的 AI 填写,创建任务时留空。
156
157### 开始执行
158
159- 执行者:`Codex`
160- 开始时间:`2026-03-30 15:12:08 CST`
161- 状态变更:`待开始` → `进行中`
162
163### 完成摘要
164
165- 完成时间:`2026-03-30 15:36:27 CST`
166- 状态变更:`进行中` → `已完成`
167- 修改了哪些文件:
168  - `apps/conductor-daemon/src/renewal/conversations.ts`
169  - `apps/conductor-daemon/src/firefox-ws.ts`
170  - `apps/conductor-daemon/src/local-api.ts`
171  - `apps/conductor-daemon/src/index.ts`
172  - `apps/conductor-daemon/src/index.test.js`
173  - `tasks/T-S056.md`
174- 核心实现思路:
175  - 新增 `renewal/conversations.ts`,把本地对话解析、remote conversation 映射、页面路由快照提取、目标快照落库、三态状态切换都收敛到独立辅助模块
176  -`browser.final_message` 入站链路中接入本地对话解析与 `conversation_links` 更新,确保新消息能复用已有映射或创建新的 `local_conversations` 记录,同时不影响现有 live ingest / delivery 主链路
177  -`/v1/renewal/` 下补齐本地对话列表/详情、关联查询、`manual / auto / paused` 写接口,并把新接口纳入 describe/capabilities 暴露面
178  - 用 runtime 集成测试覆盖 Firefox WS final-message → renewal store → renewal HTTP API 的闭环,并验证状态切换不会破坏既有 `browser.final_message` 流程
179- 跑了哪些测试:
180  - `cd /Users/george/code/baa-conductor-renewal-automation-control && pnpm install`
181  - `cd /Users/george/code/baa-conductor-renewal-automation-control && pnpm -C apps/conductor-daemon test`
182  - `cd /Users/george/code/baa-conductor-renewal-automation-control && pnpm build`
183
184### 执行过程中遇到的问题
185
186- 新 worktree 初始没有安装依赖,第一次 `pnpm -C apps/conductor-daemon build` 失败于 `pnpm exec tsc` 找不到;补跑一次 `pnpm install` 后恢复正常验证流程
187
188### 剩余风险
189
190- 当前页面路由快照解析主要覆盖 Claude 尾段 UUID、ChatGPT `/c/:conversationId`、Gemini `/app/:conversationId` 这几类已知 URL 形态;如果平台后续变更前端路由,需要同步扩充 `renewal/conversations.ts` 的解析规则
191- 当 final-message 同时缺失 remote conversation、tab/page URL 时,只能退化依赖当前活跃 link 做最佳匹配;极端多标签并发场景下,后续如果插件补更多 page identity,建议再增强关联判定信号