|
| 1 | +# codex-browser-bridge — 项目交接文档 |
| 2 | + |
| 3 | +> 最后更新: 2026-05-16 |
| 4 | +> 状态: **早期原型 — pipe 发现已验证,连接层待调试** |
| 5 | +
|
| 6 | +--- |
| 7 | + |
| 8 | +## 这个项目要干什么 |
| 9 | + |
| 10 | +让 Claude Code(或任何 AI Agent)通过 Codex Desktop 的 Chrome 扩展基础设施,直接控制用户现有 Chrome/Edge 浏览器标签页。 |
| 11 | + |
| 12 | +核心链路: |
| 13 | +``` |
| 14 | +AI Agent (MCP client) |
| 15 | + → codex-browser-bridge (本项目, Go 单文件) |
| 16 | + → Windows Named Pipe (\\.\pipe\codex-browser-use-*) |
| 17 | + → extension-host.exe (Codex 的 native messaging host) |
| 18 | + → Chrome Extension (hehggadaopoacecdllhhajmbjkdcmajg) |
| 19 | + → 控制 Chrome 标签页 |
| 20 | +``` |
| 21 | + |
| 22 | +## 为什么要做这个 |
| 23 | + |
| 24 | +Codex Desktop 的 `browser-client.mjs`(831KB minified)依赖 `import.meta.__codexNativePipe`,这是 Codex Desktop 自定义 ESM loader 注入的特权对象,Claude Code 的 Node.js 运行时无法获取。但我们逆向分析发现底层协议非常简单(标准 JSON-RPC 2.0 over length-prefixed frames),可以独立实现。 |
| 25 | + |
| 26 | +--- |
| 27 | + |
| 28 | +## 已完成的工作 |
| 29 | + |
| 30 | +### 1. 逆向分析 (100% 完成) |
| 31 | + |
| 32 | +从 831KB minified `browser-client.mjs` 中提取出: |
| 33 | + |
| 34 | +**Wire Protocol:** |
| 35 | +- 4 字节 little-endian uint32 长度前缀 + JSON payload |
| 36 | +- 标准 JSON-RPC 2.0 消息格式 |
| 37 | +- 完全相同于 Codex 开源代码中 `codex-rs/tui/src/ide_context/ipc.rs` 的帧协议 |
| 38 | + |
| 39 | +**关键源码位置 (minified 行号):** |
| 40 | +- `da` class (JSON-RPC base): line 110 — `sendRequest` 使用 `{jsonrpc:"2.0", id, method, params}` |
| 41 | +- `Kc` class (pipe transport): line ~3040 — `Tm()` 检查 `import.meta.__codexNativePipe` |
| 42 | +- `Qc` class (session transport): line ~3070 — 注入 `session_id` + `turn_id` |
| 43 | +- `setupBrowserRuntime` / `Ale`: line 2984 — 入口函数 |
| 44 | +- Pipe path: `Xv` function — `\\.\pipe\codex-browser-use` (Windows) / `/tmp/codex-browser-use` (Unix) |
| 45 | +- Security bypass: `k8()` 检查 `x-codex-browser-use-security-mode: disabled-for-local-testing` |
| 46 | + |
| 47 | +**Command 列表 (确认可用):** |
| 48 | +| 分类 | 命令 | |
| 49 | +|------|------| |
| 50 | +| Tab 管理 | `create_tab`, `list_tabs`, `close_tab`, `selected_tab` | |
| 51 | +| 导航 | `navigate_tab_url`, `navigate_tab_back`, `navigate_tab_forward`, `navigate_tab_reload` | |
| 52 | +| Playwright | `playwright_dom_snapshot`, `playwright_screenshot`, `playwright_click`, `playwright_fill`, `playwright_evaluate`, `playwright_wait_for_load_state` | |
| 53 | +| CUA (坐标) | `cua_click`, `cua_type`, `cua_keypress`, `cua_scroll`, `cua_move`, `cua_drag` | |
| 54 | +| DOM CUA | `dom_cua_click`, `dom_cua_get_visible_dom`, `dom_cua_type`, `dom_cua_double_click` | |
| 55 | +| 用户 Tab | `browser_user_open_tabs`, `browser_user_claim_tab`, `browser_user_history` | |
| 56 | +| 会话 | `name_session`, `finalize_tabs` | |
| 57 | +| 诊断 | `get_info`, `ping` | |
| 58 | + |
| 59 | +### 2. 环境诊断 (100% 完成) |
| 60 | + |
| 61 | +用户的机器状态 — 全部正常: |
| 62 | +- Chrome v147.0.7727.138 已安装且运行中 |
| 63 | +- Extension 1.1.4_0 已安装、已启用 |
| 64 | +- Native host manifest 存在且路径正确 |
| 65 | +- Chrome/Edge 注册表键均存在 |
| 66 | +- extension-host.exe 存在 |
| 67 | +- 9 个 `codex-browser-use-*` named pipe 活跃 |
| 68 | + |
| 69 | +### 3. Go 项目搭建 (60% 完成) |
| 70 | + |
| 71 | +**已编译通过,`bridge.exe` 已生成。Pipe 发现功能已验证。** |
| 72 | + |
| 73 | +``` |
| 74 | +codex-browser-bridge/ |
| 75 | +├── cmd/bridge/main.go # CLI 入口 — 三种模式: mcp, cli, discover |
| 76 | +├── internal/ |
| 77 | +│ ├── protocol/protocol.go # 帧编解码 + JSON-RPC 类型定义 |
| 78 | +│ ├── discovery/discovery.go # 枚举 \\.\pipe\ 过滤 codex-browser-use-* |
| 79 | +│ ├── client/ |
| 80 | +│ │ ├── client.go # 连接管理 + 请求/响应关联 + 超时 |
| 81 | +│ │ ├── browser.go # 高层 API: ListTabs, Navigate, DOMSnapshot 等 |
| 82 | +│ │ └── pipe_windows.go # go-winio named pipe 连接 |
| 83 | +│ └── mcp/ |
| 84 | +│ └── server.go # MCP server (stdio JSON-RPC) + 20+ tool 定义 |
| 85 | +├── go.mod |
| 86 | +├── go.sum |
| 87 | +└── bridge.exe # 已编译的二进制 |
| 88 | +``` |
| 89 | + |
| 90 | +**已验证的功能:** |
| 91 | +- `bridge.exe -mode discover` → 成功列出 9 个活跃的 codex-browser-use pipes |
| 92 | +- 编译通过,无错误 |
| 93 | +- 依赖: `github.com/Microsoft/go-winio v0.6.2` + `golang.org/x/sys` |
| 94 | + |
| 95 | +--- |
| 96 | + |
| 97 | +## 未完成的工作 / 下一步 |
| 98 | + |
| 99 | +### 最高优先级: 调试 pipe 连接 (未验证) |
| 100 | + |
| 101 | +`bridge.exe -mode cli` 还没测试过。go-winio 的 `DialPipe` 能否成功连接到 `codex-browser-use-*` pipe 是未知数。 |
| 102 | + |
| 103 | +**可能的问题:** |
| 104 | +1. **Pipe 名称中的反斜杠** — 部分 pipe 名是 `codex-browser-use\<uuid>` (带反斜杠),`PipePath()` 生成的路径可能是 `\\.\pipe\codex-browser-use\<uuid>`,需要确认 go-winio 是否正确处理 |
| 105 | +2. **客户端类型区分** — 9 个 pipe 可能分别对应 extension/iab/cdp 三种后端,目前直接取第一个,可能连到错误的类型 |
| 106 | +3. **握手协议** — 连接后可能需要先发送 `get_info` 或类似握手命令,确认后端类型 |
| 107 | +4. **Session 参数格式** — `session_id` 和 `turn_id` 是否必须是特定格式的 UUID,还是任意字符串 |
| 108 | + |
| 109 | +### 高优先级: 端到端测试 |
| 110 | + |
| 111 | +``` |
| 112 | +# 1. 确认连接 |
| 113 | +bridge.exe -mode cli |
| 114 | +> info # 获取后端信息 |
| 115 | +> tabs # 列出标签页 |
| 116 | +
|
| 117 | +# 2. 基本操作 |
| 118 | +> create # 创建新标签页 |
| 119 | +> nav 1 https://example.com # 导航 |
| 120 | +> snapshot 1 # DOM 快照 |
| 121 | +> screenshot 1 # 截图 |
| 122 | +
|
| 123 | +# 3. MCP 模式测试 |
| 124 | +bridge.exe -mode mcp |
| 125 | +# 发送 JSON-RPC: |
| 126 | +{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}} |
| 127 | +{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}} |
| 128 | +``` |
| 129 | + |
| 130 | +### 中优先级: 功能完善 |
| 131 | + |
| 132 | +- [ ] 多 pipe 时识别 extension vs iab vs cdp 类型(通过 `get_info` 握手) |
| 133 | +- [ ] 截图返回格式处理(base64 vs byte array) |
| 134 | +- [ ] `finalize_tabs` 的 keep 参数正确构造 |
| 135 | +- [ ] 错误重连机制(pipe 断开后自动重连) |
| 136 | +- [ ] MCP server 的 `initialized` notification 处理 |
| 137 | +- [ ] 请求超时可配置化 |
| 138 | + |
| 139 | +### 低优先级: 打磨 |
| 140 | + |
| 141 | +- [ ] `go install` 安装支持 |
| 142 | +- [ ] README.md |
| 143 | +- [ ] 环境变量配置 (`CODEX_PIPE_NAME`, `CODEX_SESSION_TIMEOUT`) |
| 144 | +- [ ] 日志级别控制 (`-log-level debug|info|warn|error`) |
| 145 | +- [ ] 单元测试 (frame encode/decode) |
| 146 | +- [ ] 非 Windows 平台的 stub 实现 |
| 147 | + |
| 148 | +--- |
| 149 | + |
| 150 | +## 关键技术决策记录 |
| 151 | + |
| 152 | +| 决策 | 选择 | 原因 | |
| 153 | +|------|------|------| |
| 154 | +| 语言 | Go | 原生 Windows Named Pipe 支持 (go-winio),编译为单个 exe,JSON 处理零依赖 | |
| 155 | +| 不用 TS | 是 | Node.js 无法枚举 named pipes,需要 spawn PowerShell 子进程;依赖 Node 运行时 | |
| 156 | +| 不用 Rust | 是 | 对这个桥接层来说太重,编译慢,迭代慢 | |
| 157 | +| 不复用 browser-client.mjs | 是 | `import.meta.__codexNativePipe` 是 Codex Desktop 私有注入,无法绕过 | |
| 158 | +| 安全绕过 | `x-codex-browser-use-security-mode: disabled-for-local-testing` | 从 minified 源码中发现的开发测试用后门头 | |
| 159 | + |
| 160 | +--- |
| 161 | + |
| 162 | +## 参考资料 |
| 163 | + |
| 164 | +**Codex Desktop 源码(缓存路径,只读):** |
| 165 | +- `C:\Users\Ding\.codex\.tmp\bundled-marketplaces\openai-bundled\plugins\chrome\scripts\browser-client.mjs` — 831KB minified,包含完整协议实现 |
| 166 | +- `C:\Users\Ding\.codex\.tmp\bundled-marketplaces\openai-bundled\plugins\chrome\skills\chrome\SKILL.md` — 使用文档 |
| 167 | + |
| 168 | +**Codex 开源仓库(参考):** |
| 169 | +- `D:\Code\Projects\codex-source\codex-rs\tui\src\ide_context\ipc.rs` — 帧协议参考实现 (Rust) |
| 170 | +- `D:\Code\Projects\codex-source\codex-rs\tui\src\ide_context\windows_pipe.rs` — Windows pipe 参考 |
| 171 | + |
| 172 | +**Native Host 配置:** |
| 173 | +- Manifest: `C:\Users\Ding\AppData\Local\OpenAI\extension\com.openai.codexextension.json` |
| 174 | +- Extension ID: `hehggadaopoacecdllhhajmbjkdcmajg` |
| 175 | +- Host name: `com.openai.codexextension` |
0 commit comments