im_wower
·
2026-03-29
T-BUG-028.md
1# Task T-BUG-028:修复查询路由和 ask 超时逻辑问题
2
3## 状态
4
5- 当前状态:`已完成`
6- 规模预估:`S`
7- 依赖任务:无(与 T-BUG-027 可并行)
8- 建议执行者:`Claude`(需要理解 local-api 查询路由和 daemon ask 生命周期)
9
10## 直接给对话的提示词
11
12读 `/Users/george/code/baa-conductor/tasks/T-BUG-028.md` 任务文档,完成开发任务。
13
14## 当前基线
15
16- 仓库:`/Users/george/code/baa-conductor`
17- 分支基线:`main`
18- 提交:`f26dd00`
19
20## 分支与 worktree(强制)
21
22每个任务必须使用独立的分支和 worktree,禁止直接在 main 上修改,禁止多个任务共用同一个 worktree。
23
24- 分支名:`bug/query-routes-and-ask-timeout`
25- worktree 路径:`/Users/george/code/baa-conductor-query-routes-and-ask-timeout`
26
27开工步骤:
28
291. `cd /Users/george/code/baa-conductor`
302. `git worktree add ../baa-conductor-query-routes-and-ask-timeout -b bug/query-routes-and-ask-timeout main`
313. `cd ../baa-conductor-query-routes-and-ask-timeout`
324. 在这个 worktree 目录里开发,不要回到主仓库目录
33
34完成后提交与推送(由执行者完成,不要合并):
35
361. 在 worktree 里提交所有变更(包括更新后的任务文档)
372. `git push -u origin bug/query-routes-and-ask-timeout`
38
39## 目标
40
41修复 sessions 查询端点缺失 conversation_id 过滤,以及 claude-coded daemon ask 超时与正常完成的竞争条件。
42
43## 涉及仓库
44
45- `/Users/george/code/baa-conductor`
46
47## 允许修改的目录
48
49- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts` (sessions 查询路由)
50- `/Users/george/code/baa-conductor/apps/claude-coded/src/daemon.ts` (ask 超时逻辑)
51
52## 尽量不要修改
53
54- `/Users/george/code/baa-conductor/packages/`
55- `/Users/george/code/baa-conductor/plugins/`
56- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/`
57
58## 必须完成
59
60### 1. sessions 查询端点补 conversation_id 过滤
61
62**文件**:`apps/conductor-daemon/src/local-api.ts` 中 `handleArtifactSessionsList`
63
64**问题**:messages 和 executions 端点都支持 conversation_id 过滤,但 sessions 端点遗漏了。`store.listSessions()` 已支持 conversationId 参数但没被调用。
65
66**修复方案**:
67- 从 query 中读取 `conversation_id`(用现有的 `readOptionalQueryString`)
68- 传给 `store.listSessions({ platform, conversationId, limit, offset })`
69- 在响应的 `filters` 对象中加上 `conversation_id: conversationId ?? null`
70
71### 2. 修复 ask 超时与正常完成的竞争
72
73**文件**:`apps/claude-coded/src/daemon.ts` 中 ask/askStream 的超时逻辑
74
75**问题**:超时 timer 和正常 resolve 没互斥。如果正常完成后 timer 仍然触发,可能导致 `rejectPendingAsk` 在已完成的请求上执行。
76
77**修复方案**:
78- 正常完成时用 `clearTimeout(timer)` 取消超时计时器
79- 或用 `done` 标志位互斥,确保 timer 回调中检查 `done` 后 return
80- 确保 resolve 和 reject 不会双触发
81
82## 验收标准
83
84- `curl http://100.71.210.78:4317/v1/sessions?conversation_id=xxx` 能按 conversation_id 过滤
85- 响应的 filters 对象包含 `conversation_id` 字段
86- ask 正常完成后超时 timer 被取消,不会触发 reject
87- 所有现有测试通过
88
89## 推荐验证命令
90
91- `cd /Users/george/code/baa-conductor-query-routes-and-ask-timeout && pnpm build`
92- `cd /Users/george/code/baa-conductor-query-routes-and-ask-timeout && pnpm test`
93
94## 执行记录
95
96> 以下内容由执行任务的 AI 填写,创建任务时留空。
97
98### 开始执行
99
100- 执行者:Claude
101- 开始时间:2026-03-29
102- 状态变更:`待开始` → `进行中`
103
104### 完成摘要
105
106- 完成时间:2026-03-29
107- 状态变更:`进行中` → `已完成`
108- 修改了哪些文件:
109 - `apps/conductor-daemon/src/local-api.ts` — sessions 端点补 conversation_id 过滤
110 - `apps/claude-coded/src/daemon.ts` — askStream resolve/reject 回调补 clearTimeout
111- 核心实现思路:
112 1. `handleArtifactSessionsList` 用 `readOptionalQueryString` 读取 `conversation_id`,传给 `store.listSessions()`,并在 filters 对象中返回
113 2. `askStream` 的 `pendingAsk.resolve` 和 `pendingAsk.reject` 回调首行加 `clearTimeout(timer)`,确保正常完成或手动 reject 时立即取消超时计时器,避免竞争
114- 跑了哪些测试:`pnpm build` + `pnpm test`(全部通过)
115
116### 执行过程中遇到的问题
117
118无
119
120### 剩余风险
121
122无
123