baa-conductor


baa-conductor / docs / api
im_wower  ·  2026-04-02

README.md

  1# HTTP API Surfaces
  2
  3`baa-conductor` 当前把业务控制/查询接口收口到 `mini` 节点上的 `conductor-daemon` 本地 HTTP 面。
  4
  5## 给 AI 的阅读入口
  6
  7如果是 CLI AI、网页版 AI、手机网页 AI,推荐先按这个顺序阅读:
  8
  91. [`business-interfaces.md`](./business-interfaces.md)
 102. [`control-interfaces.md`](./control-interfaces.md)
 113. 再回来看本文件做总览
 12
 13推荐使用方式:
 14
 151. 先阅读业务类接口文档
 162. 再调 `GET /describe/business``GET /describe/control`
 173. 如有需要,再调 `GET /v1/capabilities`
 184. 完成能力感知后,再执行查询或控制动作
 19
 20原则:
 21
 22- `conductor-daemon` 本地 API 是这些业务接口的真相源
 23- 推荐只读状态视图入口是 `conductor` 上的 `GET /v1/status``GET /v1/status/ui`
 24- `status-api` 保留为本地只读状态视图兼容包装层
 25- Cloudflare Worker / D1 / `control-api.makefile.so` 都只剩 legacy 兼容或残留依赖盘点背景,不再是这批业务接口的主路径
 26
 27## 入口
 28
 29| 服务 | 地址 | 说明 |
 30| --- | --- | --- |
 31| conductor public host | `https://conductor.makefile.so` | 唯一公网入口;VPS Nginx 回源到同一个 `conductor-daemon` local-api |
 32| conductor-daemon local-api | `BAA_CONDUCTOR_LOCAL_API`,默认可用值如 `http://127.0.0.1:4317` | 本地真相源;承接 describe/health/version/capabilities/status/browser/system/controllers/tasks/codex/host-ops |
 33| codexd local-api | `BAA_CODEXD_LOCAL_API_BASE`,默认可用值如 `http://127.0.0.1:4319` | 独立 `codexd` 本地服务;支持 `GET /describe` 自描述;`conductor-daemon` 的 `/v1/codex/*` 只代理到这里 |
 34| conductor-daemon local-browser-ws | 由 `BAA_CONDUCTOR_LOCAL_API` 派生,例如 `ws://127.0.0.1:4317/ws/browser` | 本地 browser 插件双向 bridge;复用同一个 listener,不单独开公网端口,`/ws/firefox` 保留兼容路径 |
 35| status-api local view | `http://127.0.0.1:4318` | 本地只读状态兼容包装层;继续提供 `/describe`、`/v1/status`、`/v1/status/ui` 和 `/ui`,默认从 `BAA_CONDUCTOR_LOCAL_API``/v1/system/state` 取数,不承担公网入口角色 |
 36
 37## Describe First
 38
 39推荐顺序:
 40
 411. `GET ${BAA_CONDUCTOR_LOCAL_API}/describe/business``GET ${BAA_CONDUCTOR_LOCAL_API}/describe/control`
 422. 如有需要,再看 `GET ${BAA_CONDUCTOR_LOCAL_API}/v1/capabilities`
 433. 如果只需要窄的只读状态视图,先看 `GET ${BAA_CONDUCTOR_LOCAL_API}/v1/status`
 444. 如果是控制动作或需要完整 truth shape,再看 `GET ${BAA_CONDUCTOR_LOCAL_API}/v1/system/state`
 455. 按需查看 `browser`、`controllers`、`tasks`、`codex`
 466. 如果要做本机 shell / 文件操作,先读 `GET ${BAA_CONDUCTOR_LOCAL_API}/describe/control` 返回里的 `host_operations`,并准备 `Authorization: Bearer <BAA_SHARED_TOKEN>`
 477. 只有在明确需要写操作时,再调用 `pause` / `resume` / `drain``host-ops`
 488. 只有在明确需要浏览器双向通讯时,再手动连接 `/ws/browser`
 49
 50如果是直接调用 `codexd` 51
 521. 先调 `GET ${BAA_CODEXD_LOCAL_API_BASE}/describe`
 532. 再按 `routes` 里的正式接口调用 `status`、`sessions`、`turn`
 543. 只有在需要双工事件时,再连接 `WS ${BAA_CODEXD_LOCAL_API_BASE}` 对应的 `/v1/codexd/events`
 55
 56如果是给 AI 写操作说明,优先引用:
 57
 58- [`business-interfaces.md`](./business-interfaces.md)
 59- [`control-interfaces.md`](./control-interfaces.md)
 60
 61### AI / CLI 最短分流
 62
 63- 做业务查询、browser request、Codex 会话:先读 [`business-interfaces.md`](./business-interfaces.md),再调 `GET /describe/business`
 64- 做系统控制、browser/plugin 管理、本机 shell / 文件操作:先读 [`control-interfaces.md`](./control-interfaces.md),再调 `GET /describe/control`
 65- 不确定当前服务暴露了哪些能力:补调 `GET /v1/capabilities`
 66- 准备直接连 `codexd`:先调 `GET ${BAA_CODEXD_LOCAL_API_BASE}/describe`
 67
 68## Conductor Daemon Local API
 69
 70### 可发现性接口
 71
 72| 方法 | 路径 | 说明 |
 73| --- | --- | --- |
 74| `GET` | `/describe` | describe 总入口索引,告诉调用方应该读哪个 scoped describe |
 75| `GET` | `/describe/business` | 业务类自描述 JSON |
 76| `GET` | `/describe/control` | 控制类自描述 JSON |
 77| `GET` | `/health` | 服务健康摘要,带本地 system 状态 |
 78| `GET` | `/version` | 轻量版本查询 |
 79| `GET` | `/v1/capabilities` | 更窄的能力发现接口,区分读/写/诊断端点 |
 80
 81### 控制型接口
 82
 83| 方法 | 路径 | 说明 |
 84| --- | --- | --- |
 85| `GET` | `/v1/system/state` | 当前 automation / leader / queue 摘要 |
 86| `POST` | `/v1/system/pause` | 切到 `paused` |
 87| `POST` | `/v1/system/resume` | 切到 `running` |
 88| `POST` | `/v1/system/drain` | 切到 `draining` |
 89
 90写接口约定:
 91
 92- 成功时直接返回最新 system state,而不是只回一个 ack
 93- 这样 HTTP 客户端和 WS `action_request` 都能复用同一份状态合同
 94
 95### 只读状态视图接口
 96
 97| 方法 | 路径 | 说明 |
 98| --- | --- | --- |
 99| `GET` | `/v1/status` | 与 `status-api` 对齐的窄 JSON 状态快照;适合人和 AI 做只读观察 |
100| `GET` | `/v1/status/ui` | 与 `status-api` 对齐的 HTML 状态面板 |
101
102说明:
103
104- `/v1/system/state` 仍是控制型 truth shape,不因为兼容状态视图而改合同
105- 新调用方默认优先走 `conductor` 上的这两个入口
106- `status-api` 仅在需要保留 `4318` / `/ui` / `/describe` 兼容位次时启用
107
108### Codex 代理接口
109
110这些路由固定代理到独立 `codexd`111
112| 方法 | 路径 | 说明 |
113| --- | --- | --- |
114| `GET` | `/v1/codex` | 读取 `codexd` 代理状态、session 摘要和可用路由 |
115| `GET` | `/v1/codex/sessions` | 列出当前 Codex sessions |
116| `GET` | `/v1/codex/sessions/:session_id` | 读取单个 Codex session |
117| `POST` | `/v1/codex/sessions` | 创建或恢复一个 Codex session |
118| `POST` | `/v1/codex/turn` | 向现有 session 提交一轮 turn |
119
120当前正式口径只保留 session / turn / status:
121
122- turn 的回读统一通过 `GET /v1/codex/sessions/:session_id` 里的 `lastTurn*``recentEvents`
123- 正式业务面不包含 run/exec 路线
124
125### Browser HTTP 接口
126
127当前正式浏览器桥接分成两层:
128
129- `GET /v1/browser`:浏览器登录态元数据、持久化状态和插件在线状态读面
130- `POST /v1/browser/request`:通用 browser 代发入口
131- `POST /v1/browser/actions`:通用 browser/plugin 管理动作入口
132- `POST /v1/browser/request/cancel`:请求或流取消入口
133- `POST` / `GET /v1/browser/claude/*`:Claude 专用 legacy 兼容包装层
134
135| 方法 | 路径 | 说明 |
136| --- | --- | --- |
137| `GET` | `/v1/browser` | 读取活跃 browser bridge、插件在线状态、最新 `shell_runtime` / `last_action_result`、持久化登录态记录和 `fresh` / `stale` / `lost` 状态 |
138| `POST` | `/v1/browser/actions` | 派发通用 browser/plugin 管理动作;当前正式支持 `request_credentials`、`tab_open`、`tab_focus`、`tab_reload`、`plugin_status`、`ws_reconnect`、`controller_reload`、`tab_restore` |
139| `POST` | `/v1/browser/request` | 发起通用 browser HTTP 代发请求;当前正式支持 Claude 的 prompt/raw buffered / SSE 请求,以及 ChatGPT 的 path-based buffered / SSE 请求 |
140| `POST` | `/v1/browser/request/cancel` | 取消请求或流;会向对应 Firefox client 派发 `request_cancel` |
141| `POST` | `/v1/browser/claude/open` | legacy 包装:等价映射到 `POST /v1/browser/actions` |
142| `POST` | `/v1/browser/claude/send` | legacy 包装:等价映射到 `POST /v1/browser/request` |
143| `GET` | `/v1/browser/claude/current` | legacy 辅助读:读取当前 Claude 代理回读结果;不是未来通用主模型 |
144| `POST` | `/v1/browser/claude/reload` | legacy 包装:等价映射到 `POST /v1/browser/actions` |
145
146Browser 面约定:
147
148- 浏览器功能类能力归 `business`,AI / CLI 先读 `GET /describe/business`
149- browser/plugin 管理动作归 `control`,在调用 `POST /v1/browser/actions` 前先读 `GET /describe/control`
150- 当前正式模型是“单平台单空壳页 + 登录态元数据持久化 + 浏览器本地代发”;`GET /v1/browser/claude/current` 只是 Claude relay 辅助读接口
151- `GET /v1/browser` 是当前正式浏览器桥接 truth read;支持 `platform`、`account`、`browser`、`client_id`、`host`、`status` 过滤
152- `records[]` 会合并“活跃 WS 连接视图”和“持久化记录视图”,`view` 可能是 `active_and_persisted`、`active_only` 或 `persisted_only`
153- `conductor` 只保存并回显 `account`、`credential_fingerprint`、`endpoints`、`endpoint_metadata`、时间戳和 `fresh/stale/lost`
154- 原始 `cookie`、`token`、header 值不会入库,也不会出现在 `/v1/browser` 读接口里
155- 连接断开或流量老化后,持久化记录仍可读,但状态会从 `fresh` 变成 `stale` / `lost`
156- 当前浏览器本地代发面正式支持 `claude`、`chatgpt` 和 `gemini`;其中 Gemini 已进入正式 HTTP relay 合同
157- `POST /v1/browser/request` 要求 `platform`;若 `platform=claude` 且省略 `path`,可用 `prompt` 走 Claude completion 兼容模式;`platform=chatgpt` / `platform=gemini` 当前都必须显式提供 `path`
158- `POST /v1/browser/request` 支持 `responseMode=buffered``responseMode=sse`
159- SSE 响应固定用 `stream_open`、`stream_event`、`stream_end`、`stream_error` 作为 event name;`stream_event` 带递增 `seq`
160- `POST /v1/browser/actions` 当前正式支持 `request_credentials`、`tab_open`、`tab_focus`、`tab_reload`、`plugin_status`、`ws_reconnect`、`controller_reload`、`tab_restore`,并返回结构化 `action_result`
161- `GET /v1/browser` 会回显当前风控默认值、最新 `shell_runtime` / `last_action_result` 和运行时 target/platform 状态,便于观察抖动、限流、退避和熔断
162- `/ws/browser` 只在本地 listener 上可用,不是公网产品接口;`/ws/firefox` 仅作兼容路径
163- `request` 的 Claude prompt 模式和 `current` 辅助读只有在 `mini` 上已有活跃 browser bridge client,且 Claude 页面已捕获有效凭证和 endpoint 时才可用
164- ChatGPT / Gemini raw relay 同样依赖真实浏览器里已捕获到的有效登录态 / header;建议先用 `GET /v1/browser?platform=chatgpt&status=fresh`、`GET /v1/browser?platform=gemini&status=fresh` 确认再发请求
165- 如果当前没有活跃 browser client,会返回清晰的 `503` JSON 错误
166- 如果已连接 client 还没拿到 Claude 凭证,会返回 `409` JSON 错误并提示先在浏览器里完成一轮真实请求
167
168### 最小 Claude Curl
169
170先读业务 describe:
171
172```bash
173LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
174curl "${LOCAL_API_BASE}/describe/business"
175```
176
177读取登录态与持久化状态:
178
179```bash
180LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
181curl "${LOCAL_API_BASE}/v1/browser?platform=claude&status=fresh"
182```
183
184按账号读取持久化记录:
185
186```bash
187LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
188curl "${LOCAL_API_BASE}/v1/browser?platform=claude&account=smoke%40example.com"
189```
190
191打开或聚焦 Claude 标签页:
192
193```bash
194LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
195curl -X POST "${LOCAL_API_BASE}/v1/browser/actions" \
196  -H 'Content-Type: application/json' \
197  -d '{"action":"tab_open","platform":"claude"}'
198```
199
200通过通用 request 合同发送一轮 Claude prompt:
201
202```bash
203LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
204curl -X POST "${LOCAL_API_BASE}/v1/browser/request" \
205  -H 'Content-Type: application/json' \
206  -d '{"platform":"claude","prompt":"Summarize the current bridge state."}'
207```
208
209通过通用 request 合同读取 ChatGPT 已捕获 endpoint:
210
211```bash
212LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
213curl -X POST "${LOCAL_API_BASE}/v1/browser/request" \
214  -H 'Content-Type: application/json' \
215  -d '{"platform":"chatgpt","method":"GET","path":"/backend-api/models"}'
216```
217
218通过 SSE 模式直连浏览器流:
219
220```bash
221LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
222curl -N -X POST "${LOCAL_API_BASE}/v1/browser/request" \
223  -H 'Content-Type: application/json' \
224  -d '{"platform":"claude","prompt":"Stream the current bridge state.","responseMode":"sse","requestId":"browser-stream-demo"}'
225```
226
227取消运行中的 browser request / stream:
228
229```bash
230LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
231curl -X POST "${LOCAL_API_BASE}/v1/browser/request/cancel" \
232  -H 'Content-Type: application/json' \
233  -d '{"platform":"claude","requestId":"browser-request-demo"}'
234```
235
236读取当前 Claude 代理回读(legacy helper):
237
238```bash
239LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
240curl "${LOCAL_API_BASE}/v1/browser/claude/current"
241```
242
243## codexd Direct Local API
244
245AI 或自动化如果不经过 `conductor-daemon`,应先读取:
246
247- `GET /describe`
248
249当前 `codexd` 自描述会直接返回:
250
251- `ok`
252- `name`
253- `surface`
254- `description`
255- `mode`
256- `base_url`
257- `event_stream`
258- `routes`
259- `capabilities`
260- `notes`
261
262当前正式 `codexd` 直连接口:
263
264| 方法 | 路径 | 说明 |
265| --- | --- | --- |
266| `GET` | `/healthz` | 最小健康探针 |
267| `GET` | `/describe` | `codexd` 正式自描述入口;AI 应先读这里 |
268| `GET` | `/v1/codexd/status` | 读取 daemon / child / session / recent events 摘要 |
269| `GET` | `/v1/codexd/sessions` | 列出当前 sessions |
270| `GET` | `/v1/codexd/sessions/:session_id` | 读取单个 session 和 recent events |
271| `POST` | `/v1/codexd/sessions` | 创建或恢复 session |
272| `POST` | `/v1/codexd/turn` | 提交一轮 turn |
273| `WS` | `/v1/codexd/events` | 订阅本地双工事件流 |
274
275说明:
276
277- `codexd` 是独立常驻进程
278- `conductor-daemon` 只代理这组接口,不承载 Codex session 真相
279- 当前正式模式固定为 `codex app-server`
280- 自描述和正式接口都不引入一次性 batch 命令面
281
282### 本机 Host Ops 接口
283
284| 方法 | 路径 | 说明 |
285| --- | --- | --- |
286| `POST` | `/v1/exec` | 在本机执行 shell 命令,返回结构化 stdout/stderr/result union |
287| `POST` | `/v1/files/read` | 读取本机文本文件,返回内容和元数据 |
288| `POST` | `/v1/files/write` | 写入本机文本文件,支持 `overwrite` / `createParents` |
289
290host-ops 约定:
291
292- 这三条路由的 HTTP 外层仍然是 `conductor-daemon` 统一 envelope
293- 具体操作成功或失败看 `data.ok`
294- 这三条路由统一要求 `Authorization: Bearer <BAA_SHARED_TOKEN>`
295- `BAA_SHARED_TOKEN` 来自 daemon 启动配置;缺少或错误 token 时返回 `401` JSON 错误
296- `cwd` 省略时使用 daemon 进程当前工作目录
297- `path` 可为绝对路径,也可相对 `cwd`
298- `timeoutMs` 仅用于 `/v1/exec`,默认 `30000`
299- `overwrite` 仅用于 `/v1/files/write`,默认 `true`
300
301### 只读业务接口
302
303| 方法 | 路径 | 说明 |
304| --- | --- | --- |
305| `GET` | `/v1/controllers?limit=20` | 已注册 controller 摘要,带 active leader 线索 |
306| `GET` | `/v1/tasks?status=queued&limit=20` | 最近 task 摘要,可按 `status` 过滤 |
307| `GET` | `/v1/tasks/:task_id` | 单个 task 详情 |
308| `GET` | `/v1/tasks/:task_id/logs?limit=200` | task 关联日志,可选 `run_id` 过滤 |
309
310### 诊断接口
311
312| 方法 | 路径 | 说明 |
313| --- | --- | --- |
314| `GET` | `/healthz` | 最小健康探针,返回 `ok` |
315| `GET` | `/readyz` | readiness 探针 |
316| `GET` | `/rolez` | 当前 `leader` / `standby` 视图 |
317| `GET` | `/v1/runtime` | daemon runtime 快照 |
318
319## Browser Local WS
320
321本地 browser bridge 复用 `conductor-daemon` 的同一个监听地址,不额外引入第二个端口:
322
323- HTTP base: `http://127.0.0.1:4317`
324- Browser WS: `ws://127.0.0.1:4317/ws/browser`
325- Firefox compat WS: `ws://127.0.0.1:4317/ws/firefox`
326
327当前约定:
328
329- 只服务本地 / loopback / 明确允许的 Tailscale `100.x` 地址
330- 不是公网通道,不单独暴露到 `conductor.makefile.so`
331- Firefox / Safari 插件默认同时使用本地 WS 和同一个本地 HTTP listener
332- `state_snapshot.system` 直接复用 `/v1/system/state` 的字段结构
333- `action_request` 支持 `pause` / `resume` / `drain`
334- 浏览器发来的 `credentials` / `api_endpoints` 会被转换成 `account`、凭证指纹、端点元数据和 `fresh/stale/lost` 持久化记录
335- `headers` 只保留名称与数量;原始 `cookie` / `token` / header 值既不会入库,也不会在 snapshot 或 `/v1/browser` 中回显
336- `GET /v1/browser` 会合并当前活跃连接和持久化记录;即使 client 断开或 daemon 重启,最近一次记录仍可读取
337- `/v1/browser/request`、`/v1/browser/request/cancel` 和 legacy 的 `/v1/browser/claude/current` 会复用这条 WS bridge 的 `api_request` / `api_response` / `stream_*` / `request_cancel` 做 Claude / ChatGPT 页面内 HTTP 代理
338
339详细消息模型和 smoke 示例见:
340
341- [`firefox-local-ws.md`](./firefox-local-ws.md)
342
343## Status API
344
345`status-api` 现在是本地只读状态兼容包装层,不拥有真相,也不承担公网入口角色。
346
347推荐入口:
348
349- 新调用方默认使用 `conductor` 上的 `GET /v1/status``GET /v1/status/ui`
350- 只有还需要 `4318`、`/describe`、`/ui` 这组 legacy 路径时,才显式启动 `status-api`
351
352truth source:
353
354- 当前默认应优先回源 `BAA_CONDUCTOR_LOCAL_API`,也就是当前 canonical local API `http://100.71.210.78:4317/v1/system/state`
355- `https://conductor.makefile.so` 是同一套 conductor 主接口的公网入口;只有本地 `4317` 不可达时才需要显式改到公网
356- `BAA_CONDUCTOR_PUBLIC_API_BASE``conductor-daemon` upstream/public API base 的 canonical 变量名;legacy `BAA_CONTROL_API_BASE` 只保留两个兼容点:`conductor-daemon` 把它当别名,`status-api` 只在手工或旧配置缺少 `BAA_CONDUCTOR_LOCAL_API` 时回退使用
357- conductor launchd 安装副本会同时写入 `BAA_CONDUCTOR_PUBLIC_API_BASE` 和 legacy `BAA_CONTROL_API_BASE`;默认 launchd 不再给 `status-api` 写入这些变量
358- runtime 默认安装/启动/检查集合现在只包含 `conductor``codexd`;`status-api` 只在显式 `--service status-api``install-mini --with-status-api` 时启用
359- 如果旧文档或配置里还出现 legacy `control-api.makefile.so`,只能按迁移兼容 / 残留依赖盘点目标理解,绝不再是默认或 canonical truth source
360- `status-api``conductor /v1/status*` 共享同一套状态拼装和 HTML 渲染语义
361
362当前端点:
363
364| 方法 | 路径 | 说明 |
365| --- | --- | --- |
366| `GET` | `/describe` | 说明 status-api 本身、truth source 和返回格式 |
367| `GET` | `/healthz` | 纯健康检查,返回 `ok` |
368| `GET` | `/v1/status` | JSON 状态快照 |
369| `GET` | `/v1/status/ui` | HTML 状态面板 |
370| `GET` | `/` / `/ui` | `/v1/status/ui` 别名 |
371
372## Minimal Curl
373
374```bash
375LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
376curl "${LOCAL_API_BASE}/describe/business"
377```
378
379```bash
380LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
381curl "${LOCAL_API_BASE}/v1/capabilities"
382```
383
384```bash
385LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
386curl "${LOCAL_API_BASE}/v1/system/state"
387```
388
389```bash
390LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
391curl "${LOCAL_API_BASE}/v1/status"
392```
393
394```bash
395LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
396curl "${LOCAL_API_BASE}/v1/tasks?limit=5"
397```
398
399```bash
400LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
401curl "${LOCAL_API_BASE}/v1/codex"
402```
403
404```bash
405LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
406curl "${LOCAL_API_BASE}/v1/browser?platform=claude&status=fresh"
407```
408
409```bash
410LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
411curl -X POST "${LOCAL_API_BASE}/v1/browser/actions" \
412  -H 'Content-Type: application/json' \
413  -d '{"action":"tab_open","platform":"claude"}'
414```
415
416```bash
417LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
418curl -X POST "${LOCAL_API_BASE}/v1/browser/request" \
419  -H 'Content-Type: application/json' \
420  -d '{"platform":"claude","prompt":"Summarize the current bridge state."}'
421```
422
423```bash
424LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
425curl "${LOCAL_API_BASE}/v1/browser/claude/current"
426```
427
428```bash
429CODEXD_API_BASE="${BAA_CODEXD_LOCAL_API_BASE:-http://127.0.0.1:4319}"
430curl "${CODEXD_API_BASE}/describe"
431```
432
433```bash
434LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
435curl -X POST "${LOCAL_API_BASE}/v1/codex/sessions" \
436  -H 'Content-Type: application/json' \
437  -d '{"cwd":"/Users/george/code/baa-conductor","purpose":"duplex"}'
438```
439
440```bash
441LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
442SESSION_ID="session-example"
443curl "${LOCAL_API_BASE}/v1/codex/sessions/${SESSION_ID}"
444```
445
446```bash
447LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
448SESSION_ID="session-example"
449curl -X POST "${LOCAL_API_BASE}/v1/codex/turn" \
450  -H 'Content-Type: application/json' \
451  -d "{\"sessionId\":\"${SESSION_ID}\",\"input\":\"Summarize pending work.\"}"
452```
453
454```bash
455LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
456curl -X POST "${LOCAL_API_BASE}/v1/system/pause" \
457  -H 'Content-Type: application/json' \
458  -d '{"requested_by":"human_operator","reason":"manual_pause"}'
459```
460
461```bash
462LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
463SHARED_TOKEN="${BAA_SHARED_TOKEN:?set BAA_SHARED_TOKEN}"
464curl -X POST "${LOCAL_API_BASE}/v1/exec" \
465  -H "Authorization: Bearer ${SHARED_TOKEN}" \
466  -H 'Content-Type: application/json' \
467  -d '{"command":"printf '\''hello from conductor'\''","cwd":"/tmp","timeoutMs":2000}'
468```
469
470```bash
471LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
472SHARED_TOKEN="${BAA_SHARED_TOKEN:?set BAA_SHARED_TOKEN}"
473curl -X POST "${LOCAL_API_BASE}/v1/files/read" \
474  -H "Authorization: Bearer ${SHARED_TOKEN}" \
475  -H 'Content-Type: application/json' \
476  -d '{"path":"README.md","cwd":"/Users/george/code/baa-conductor","encoding":"utf8"}'
477```
478
479```bash
480LOCAL_API_BASE="${BAA_CONDUCTOR_LOCAL_API:-http://127.0.0.1:4317}"
481SHARED_TOKEN="${BAA_SHARED_TOKEN:?set BAA_SHARED_TOKEN}"
482curl -X POST "${LOCAL_API_BASE}/v1/files/write" \
483  -H "Authorization: Bearer ${SHARED_TOKEN}" \
484  -H 'Content-Type: application/json' \
485  -d '{"path":"tmp/demo.txt","cwd":"/Users/george/code/baa-conductor","content":"hello from conductor","overwrite":false,"createParents":true}'
486```