im_wower
·
2026-03-28
T-S038.md
1# Task T-S038:用 browser request 代理替换 DOM delivery,由 conductor 持有会话上下文
2
3> 已完成并归档:`2026-03-28`
4
5## 直接给对话的提示词
6
7读 `/Users/george/code/baa-conductor/tasks/archive/T-S038.md` 任务文档,查看已完成任务记录。
8
9如需补背景,再读:
10
11- `/Users/george/code/baa-conductor/plans/archive/BAA_BROWSER_PROXY_DELIVERY_REQUIREMENTS.md`
12- `/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_SYSTEM.md`
13- `/Users/george/code/baa-conductor/plugins/baa-firefox/README.md`
14- `/Users/george/code/baa-conductor/tasks/TASK_OVERVIEW.md`
15
16## 当前基线
17
18- 仓库:`/Users/george/code/baa-conductor`
19- 分支基线:`main`
20- 提交:`499bd69`
21- 开工要求:必须先从当前 `main` 新建任务分支,再开始开发;禁止直接在 `main` 上修改。功能任务分支名必须以 `feat/` 开头,缺陷任务分支名必须以 `bug/` 开头。
22- 开发隔离要求:必须使用新的 `git worktree` 开发本任务,禁止直接在当前正在使用的插件工作目录里修改并 reload 扩展,避免影响当前稳定可用的 Firefox 插件。
23
24## 必须创建的新分支名
25
26- `feat/browser-request-proxy-delivery`
27
28## 推荐 worktree
29
30- 建议新建:`/Users/george/code/baa-conductor-ts038`
31- 建议命令:`git worktree add ../baa-conductor-ts038 -b feat/browser-request-proxy-delivery main`
32
33## 目标
34
35把当前“conductor 生成文本结果 -> 插件 DOM 注入输入框 -> 点击发送”的 delivery 主链,重构为“conductor 持有对话上下文 -> 插件只在页面上下文执行 browser request”的代理式回写主链。
36
37## 背景
38
39当前代码已经具备两条不同层级的浏览器能力:
40
41- 已有正式 `POST /v1/browser/request`,可以通过插件在页面上下文中带真实登录态执行请求
42- 但 BAA 执行结果的 delivery 仍走 `browser.inject_message` / `browser.send_message`,本质上还是 DOM 自动化
43
44这带来两个直接问题:
45
46- conductor 不是真正的 delivery 路由真相源,落点仍由插件 shell tab 决定
47- ChatGPT 回写仍可能落到 Firefox shell 页或新空白对话,而不是来源业务对话
48
49用户当前希望的模型是:
50
51- conductor 记录上下文、conversationId、requestId、路由与审计
52- 插件不再自己决定业务回写落点
53- 插件只负责“在对应页面上下文里执行真实请求”
54
55## 涉及仓库
56
57- `/Users/george/code/baa-conductor`
58
59## 范围
60
61- 把 delivery 主链从 DOM `inject / send` 重构到 browser request proxy
62- 让 conductor 成为 conversation / delivery routing 的真相源
63- 首批至少收口 `ChatGPT` 与 `Claude` 的 text-only 回写
64- 保留最小 fallback,但不再把 DOM delivery 当主链
65- 补服务端与 browser smoke 回归
66
67## 路径约束
68
69优先在 `conductor-daemon` 的 browser bridge / local API / delivery bridge 和 Firefox 插件 controller / page-interceptor 层完成。不要把这张卡扩成完整多客户端、多节点编排,也不要顺手改 instruction parser。
70
71## 推荐实现边界
72
73建议优先做:
74
75- 在 conductor 侧建立最小 conversation / page routing 状态,而不是继续让插件按 shell tab 猜落点
76- 为 delivery 定义正式的 proxy send contract,优先复用现有 `/v1/browser/request`
77- 先让 `ChatGPT` 与 `Claude` 走新的代理回写主链
78- 当前 DOM `inject / send` 只保留为 fallback,不再作为默认成功路径
79
80## 允许修改的目录
81
82- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/artifacts/upload-session.ts`
83- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/firefox-ws.ts`
84- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/firefox-bridge.ts`
85- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
86- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/browser-types.ts`
87- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
88- `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
89- `/Users/george/code/baa-conductor/plugins/baa-firefox/page-interceptor.js`
90- `/Users/george/code/baa-conductor/plugins/baa-firefox/final-message.js`
91- `/Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
92
93## 尽量不要修改
94
95- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/`
96- `/Users/george/code/baa-conductor/packages/db/`
97- `/Users/george/code/baa-conductor/plugins/baa-firefox/delivery-adapters.js`
98- `/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/`
99
100## 必须完成
101
102### 1. 收口 conductor 侧上下文真相
103
104- conductor 需要有最小可解释的 conversation / page routing 状态
105- delivery 不再只靠 `platform -> shell tab` 推断落点
106- 读面至少要能解释“当前回写目标是谁”
107
108### 2. 建立代理式 delivery 主链
109
110- BAA 执行结果的主路径改成 browser request proxy,而不是 DOM 注入输入框
111- 插件只负责在正确页面上下文发真实请求
112- `ChatGPT` 与 `Claude` 至少要有一条正式成功路径
113
114### 3. 保留最小 fallback
115
116- 当前 DOM `inject / send` 可以保留为 fallback
117- 但不能继续作为默认主链
118- fail-closed 行为要明确,不能静默退回错页面
119
120### 4. 补回归
121
122- 覆盖 delivery 不再默认落到 shell 页
123- 覆盖代理回写成功路径
124- 覆盖回写目标缺失或上下文不一致时的 fail-closed
125
126## 需要特别注意
127
128- 不要恢复 upload / download / binary delivery
129- 不要把这张卡扩成完整 conversation manager 平台框架
130- 不要破坏现有 `browser.final_message -> instruction_ingest` 主链
131- 如果必须保留 fallback,要明确哪个平台、什么条件下才允许走 DOM delivery
132
133## 验收标准
134
135- `ChatGPT` 的执行结果不再默认回写到 shell 页或新空白对话
136- conductor 能解释并记录当前 delivery 的目标 conversation / page
137- 对已转换平台,主路径不再依赖输入框选择器和发送按钮
138- browser smoke 与 service-side 测试通过
139
140## 推荐验证命令
141
142- `./node_modules/.bin/tsc -p /Users/george/code/baa-conductor/apps/conductor-daemon/tsconfig.json`
143- `node --check /Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
144- `node --check /Users/george/code/baa-conductor/plugins/baa-firefox/page-interceptor.js`
145- `node --test /Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
146- `git diff --check`
147
148## 交付要求
149
150完成后请说明:
151
152- 修改了哪些文件
153- conductor 侧上下文是怎么建模的
154- 新的 proxy delivery 主链是如何工作的
155- 哪些平台已经从 DOM fallback 转到正式代理回写
156- 跑了哪些测试
157- 还有哪些剩余风险