im_wower
·
2026-03-29
T-S046.md
1# Task T-S046:请求/响应日志落盘 + 修复 files/read kind 标记
2
3## 状态
4
5- 当前状态:`已完成`
6- 规模预估:`S`
7- 依赖任务:无
8- 建议执行者:`Claude`(需要理解 firefox-ws 和 ingest 数据流)
9
10## 直接给对话的提示词
11
12读 `/Users/george/code/baa-conductor/tasks/T-S046.md` 任务文档,完成开发任务。
13
14如需补背景,再读:
15
16- `/Users/george/code/baa-conductor/plans/NEXT_WAVE_REQUIREMENTS.md`(需求 2 和 3)
17
18## 当前基线
19
20- 仓库:`/Users/george/code/baa-conductor`
21- 分支基线:`main`
22- 提交:`eadee69`
23
24## 分支与 worktree(强制)
25
26- 分支名:`feat/ingest-logging`
27- worktree 路径:`/Users/george/code/baa-conductor-ingest-logging`
28
29开工步骤:
30
311. `cd /Users/george/code/baa-conductor`
322. `git worktree add ../baa-conductor-ingest-logging -b feat/ingest-logging main`
333. `cd ../baa-conductor-ingest-logging`
34
35完成后提交与推送(由执行者完成,不要合并):
36
371. 在 worktree 里提交所有变更(包括更新后的任务文档)
382. `git push -u origin feat/ingest-logging`
39
40## 目标
41
42让 conductor 把每次收到的 `browser.final_message` 完整 payload 和 ingest 结果写到日志文件,方便事后排查。顺便修复 `/v1/files/read` 的 kind 标记 bug。
43
44## 必须完成
45
46### 1. ingest 日志落盘
47
48- 日志目录:`logs/baa-ingest/`(conductor 启动时自动创建)
49- 文件名:`YYYY-MM-DD.jsonl`(按天轮转,每行一个 JSON)
50- 每次 `browser.final_message` 到达时写一行,包含:
51 - `ts`:ISO 时间戳
52 - `event`:`"final_message_received"`
53 - `platform`
54 - `conversation_id`
55 - `assistant_message_id`
56 - `raw_text`:完整原文(不截断)
57 - `raw_text_length`:字符数
58- 每次 ingest 处理完成后写一行,包含:
59 - `ts`:ISO 时间戳
60 - `event`:`"ingest_completed"`
61 - `platform`
62 - `conversation_id`
63 - `blocks_count`:提取到的 baa block 数量
64 - `executions_count`:执行的指令数量
65 - `status`:ingest 结果状态
66- 写入失败只 log 到 stderr,不影响主流程
67- 使用 `appendFileSync`,不需要复杂的日志框架
68
69### 2. 修复 files/read kind
70
71- `apps/conductor-daemon/src/local-api.ts` 中 `/v1/files/read` 路由的 `kind: "write"` 改为 `kind: "read"`
72
73## 允许修改的目录
74
75- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/` (firefox-ws.ts、ingest.ts、local-api.ts、index.ts)
76
77## 尽量不要修改
78
79- `/Users/george/code/baa-conductor/packages/`
80- `/Users/george/code/baa-conductor/plugins/`
81
82## 验收标准
83
84- ChatGPT 发一条消息后,`logs/baa-ingest/2026-03-29.jsonl` 存在且包含完整 raw_text
85- 日志文件每行是合法 JSON
86- `/v1/capabilities` 中 `/v1/files/read` 归类到 read 端点
87- 所有现有测试通过
88
89## 推荐验证命令
90
91- `cd /Users/george/code/baa-conductor-ingest-logging && pnpm build`
92- `cd /Users/george/code/baa-conductor-ingest-logging && pnpm test`
93- 重启 conductor 后触发一次 ChatGPT 对话,检查 `logs/baa-ingest/` 下的日志文件
94
95## 执行记录
96
97> 以下内容由执行任务的 AI 填写,创建任务时留空。
98
99### 开始执行
100
101- 执行者:Claude
102- 开始时间:2026-03-29
103- 状态变更:`待开始` → `进行中`
104
105### 完成摘要
106
107- 完成时间:2026-03-29
108- 状态变更:`进行中` → `已完成`
109- 修改了哪些文件:
110 - `apps/conductor-daemon/src/firefox-ws.ts` — 添加 ingest 日志写入逻辑
111 - `apps/conductor-daemon/src/index.ts` — 解析 ingestLogDir 并传递给 FirefoxWebSocketServer
112 - `apps/conductor-daemon/src/local-api.ts` — 修复 `/v1/files/read` kind 从 "write" 改为 "read"
113 - `apps/conductor-daemon/src/node-shims.d.ts` — 添加 appendFileSync、mkdirSync 类型声明
114- 核心实现思路:
115 - 在 `ConductorFirefoxWebSocketServer` 新增 `ingestLogDir` 属性和 `writeIngestLog()` 私有方法
116 - `handleBrowserFinalMessage` 中在收到 final_message 后写 `final_message_received` 日志行,ingest 完成后写 `ingest_completed` 日志行
117 - 日志文件按天轮转(`YYYY-MM-DD.jsonl`),使用 `appendFileSync` 同步追加,失败只打 stderr 不影响主流程
118 - `ConductorRuntime` 构造时通过 `resolveIngestLogDir()` 创建 `logs/baa-ingest/` 目录并传递给 `ConductorLocalHttpServer`
119- 跑了哪些测试:`pnpm build && pnpm test`,全部 54 个 conductor-daemon 测试通过,0 失败
120
121### 执行过程中遇到的问题
122
123- node-shims.d.ts 不含 appendFileSync/mkdirSync 类型声明,需补充
124- 不存在全局 process 类型声明,改用 console.error 替代 process.stderr.write
125
126### 剩余风险
127
128无
129