im_wower
·
2026-03-28
T-S028.md
1# Task T-S028:收口 ChatGPT browser relay 到正式合同
2
3## 直接给对话的提示词
4
5读 `/Users/george/code/baa-conductor/tasks/archive/T-S028.md` 任务文档,完成开发任务。
6
7如需补背景,再读:
8
9- `/Users/george/code/baa-conductor/tasks/archive/T-S023.md`
10- `/Users/george/code/baa-conductor/tasks/archive/T-S025.md`
11- `/Users/george/code/baa-conductor/docs/api/README.md`
12- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
13- `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
14- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
15- `/Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
16- `/Users/george/code/baa-conductor/PROGRESS/2026-03-27-current-code-progress.md`
17
18## 当前基线
19
20- 仓库:`/Users/george/code/baa-conductor`
21- 分支:`main`
22- 提交:`a2b1055`
23- 开工要求:不要从其他任务分支切出;如需新分支,从当前 `main` 新切
24
25## 当前状态
26
27- `已完成(2026-03-27)`
28
29## 建议分支名
30
31- `feat/chatgpt-browser-relay`
32
33## 目标
34
35把 `platform=chatgpt` 的 `/v1/browser/request` 路径收口成正式支持面,并补齐自动化验证和文档口径。
36
37## 背景
38
39当前代码现实和文档口径之间有明显落差:
40
41- Firefox 插件和 bridge 层已经有 `chatgpt` 平台定义、header 组装、`api_request` 派发能力
42- `index.test.js` 里也已有 `chatgpt` 的 bridge 命令与请求级测试
43- 但正式文档、smoke 和进度口径仍然写成“正式 relay 只有 Claude 接通”
44
45这会让后续协作者无法判断 `chatgpt` 到底是“未实现”,还是“已具备骨架但未正式验收”。这张卡的目标就是把这个灰区清掉。
46
47## 涉及仓库
48
49- `/Users/george/code/baa-conductor`
50
51## 范围
52
53- `/v1/browser/request` 上 `platform=chatgpt` 的正式支持面
54- 必要时补 `buffered` / `sse` / `cancel` 路径缺口
55- ChatGPT 对应自动化 smoke
56- 正式文档和进度文档回写
57
58## 路径约束
59
60- 这张卡优先收口 `chatgpt`,不要把 `gemini` 一起做成大任务
61- 不要破坏 Claude 现有 prompt shortcut、legacy `/v1/browser/claude/*` 包装和现有 smoke
62- 如需改 Firefox 插件,优先做 ChatGPT 相关最小增量,不要顺手重写整个平台抽象
63
64## 推荐实现边界
65
66建议优先做:
67
68- 先确认 `local-api -> bridge -> plugin/page proxy` 这条 ChatGPT 请求链现状
69- 先把 `buffered` 路径收口成正式支持面
70- 如果当前代码已能稳定支撑 `sse` / `cancel`,一并纳入 smoke 和文档
71- 如果 `sse` 仍有真实缺口,不要模糊描述,明确写成限制并单开后续任务或 bug
72
73## 允许修改的目录
74
75- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
76- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
77- `/Users/george/code/baa-conductor/tests/browser/`
78- `/Users/george/code/baa-conductor/docs/api/`
79- `/Users/george/code/baa-conductor/docs/firefox/`
80- `/Users/george/code/baa-conductor/tasks/`
81- `/Users/george/code/baa-conductor/plans/`
82- `/Users/george/code/baa-conductor/PROGRESS/`
83
84## 尽量不要修改
85
86- `/Users/george/code/baa-conductor/packages/db/`
87- `/Users/george/code/baa-conductor/apps/status-api/`
88- `/Users/george/code/baa-conductor/packages/host-ops/`
89- `/Users/george/code/baa-conductor/plugins/baa-firefox/` 里的 Gemini 专用模板逻辑
90
91## 必须完成
92
93### 1. 确认并收口 ChatGPT 正式请求面
94
95- 确认 `POST /v1/browser/request` 在 `platform=chatgpt` 下的真实行为
96- 至少把 `buffered` 模式收口成自动化可验证的正式支持面
97- 如当前代码已具备条件,补 `sse` 和 `cancel` 的正式验证;如果没有,就明确写出当前限制
98
99### 2. 补自动化验证
100
101- 至少补一条从 `local-api` 到 Firefox bridge stub 的 ChatGPT 请求测试
102- 优先补到已有测试文件里,不新起一套平行测试体系
103- 不能只测 bridge 原语,必须覆盖正式 `/v1/browser/request` 合同
104
105### 3. 同步正式文档和进度口径
106
107- `docs/api/README.md`、必要时 `docs/api/business-interfaces.md` 要与代码现实一致
108- `tasks/`、`plans/`、`PROGRESS/` 的状态描述要同步
109- 如果最终只做到 `buffered`,文档必须明确写“ChatGPT 哪些模式已正式支持,哪些还没有”
110
111## 需要特别注意
112
113- ChatGPT 仍依赖真实浏览器里捕获到的有效 header / 登录态;不要把“有代码路径”写成“无前提可用”
114- Claude prompt shortcut 仍然只属于 Claude,不要扩成 ChatGPT 共用语义
115- Gemini 继续留到下一波;除非是共享通用路径上的低风险修正,否则不要把范围扩成 `chatgpt + gemini`
116- 任何文档结论都要以当前代码和自动化验证为准,不要沿用旧口径
117
118## 验收标准
119
120- 至少一条自动化测试证明 `platform=chatgpt` 的 `/v1/browser/request` 正式可用
121- 如果 `sse` / `cancel` 也已纳入支持面,测试中要有对应覆盖
122- 文档不再错误写成“正式 relay 只有 Claude”。
123- Claude 现有请求、cancel、smoke 不回退
124- `git diff --check` 通过
125
126## 推荐验证命令
127
128- `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`
129- `node --test /Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
130- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
131- `git -C /Users/george/code/baa-conductor diff --check`
132
133## 实施结果
134
135- `platform=chatgpt` 的 `/v1/browser/request` 已正式收口到文档和 describe 合同,当前正式支持:
136 - 显式 `path` 的 `buffered`
137 - 显式 `path` 的 `sse`
138 - `POST /v1/browser/request/cancel`
139- Claude 仍保留原有 prompt shortcut、legacy `/v1/browser/claude/*` 包装和现有 smoke;本轮没有把 ChatGPT 扩成 Claude 风格 prompt helper。
140- 自动化验证已补到两层:
141 - `apps/conductor-daemon/src/index.test.js`:补本地 API 合同级 ChatGPT buffered 请求断言,并校验 describe 合同里的正式支持平台
142 - `tests/browser/browser-control-e2e-smoke.test.mjs`:补 ChatGPT metadata + buffered / SSE / cancel smoke
143- Firefox 插件侧本轮没有新增行为改动;现有通用 proxy / stream / cancel 路径已经足以支撑 ChatGPT,主要补的是正式合同、测试和文档口径。
144- Gemini 继续留在下一波,因为这张卡的目标是先把已具备链路基础、且已能被自动化验证的 ChatGPT 收口成正式支持面,避免扩成 `chatgpt + gemini` 大任务。
145
146## 自动化验证
147
148- `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`
149- `node --test /Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
150 - 结果:`35/35` 通过
151- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
152 - 结果:`3/3` 通过
153
154## 剩余风险
155
156- ChatGPT 仍依赖浏览器里真实捕获到的有效登录态 / header;这轮没有把它做成“无前提可用”的平台
157- ChatGPT 仍没有 Claude 风格的 prompt shortcut;当前正式支持面仍是显式 `path` 的 raw request / SSE / cancel
158- 真实 Firefox 手工 smoke 仍未完成;当前自动化覆盖的是 conductor / bridge / plugin stub 层面的合同与语义透传,不等于真机桌面验收
159
160## 交付要求
161
162完成后请说明:
163
164- ChatGPT 最终正式支持了哪些请求模式
165- 改了哪些测试和文档
166- 是否改到 Firefox 插件侧
167- Gemini 为什么仍然留在下一波
168- 还有哪些剩余风险