baa-conductor


baa-conductor / tasks / archive
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- 还有哪些剩余风险