baa-conductor

git clone 

baa-conductor / tasks
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
128129