diff --git "a/docs/09-v3\345\215\217\344\275\234\347\263\273\347\273\237\350\247\204\346\240\274.md" "b/docs/09-v3\345\215\217\344\275\234\347\263\273\347\273\237\350\247\204\346\240\274.md" index e45a126..91cb164 100644 --- "a/docs/09-v3\345\215\217\344\275\234\347\263\273\347\273\237\350\247\204\346\240\274.md" +++ "b/docs/09-v3\345\215\217\344\275\234\347\263\273\347\273\237\350\247\204\346\240\274.md" @@ -221,6 +221,16 @@ OpenCode / Kilo 最易(25+ 事件、插件模型)→ Claude Code 易(hooks 每个 agent 注册成各自的 logical agent id,归属到同一个 person。互不混淆。 +### 5.5 实现状态(诚实标注,2026-06) + +§5 是 adapter 的**设计契约(愿景)**,不是已交付清单。截至当前的真实状态: + +- **已 ship 的真实会话集成 = 仅 Claude Code**:room-bridge 把房间事件注入活 Claude session(MCP 推送通道),Stop hook 发布完成事件(「最后一公里」)。这是目前唯一端到端打通「收事件进 session + 检测完成并发布」的 agent。 +- **控制面 agent-无关**:broker / room / 身份 / presence / 路由 / 鉴权从不读 `agentType`——任何讲 Envelope 协议、持 broker 签发 PSK token 的进程都是合法房间成员(headless 替身、脚本、其它 agent 都能连上并收发事件,§13 Docker 验收即用替身证过控制面协议)。 +- **Codex**:有 v1 单机 Claude↔Codex 桥,但**未接进 v3 房间流**——§5.2 的三件套(register / publish-on-completion / receive-into-session)尚未对 Codex 实现。 +- **其它 agent(OpenCode / Cursor / Kilo / …)**:协议层可接,§5.2 的薄 adapter **未做**。 +- 这些都是**明确 backlog("未做"),不是砍掉的范围**(对比 §10 的"明确不做")。要让异构 agent 真正在同一房间里协作,需按 §5.2 给每个目标 agent 补齐这三件套。 + --- ## 6. 三个可替换接口与自带电池实现(Backbone 层) @@ -403,6 +413,12 @@ broker 那台机器宕了,单实例必有不可用窗口。自带电池版做 - **B 的全自动调度 / session 上下文迁移**——演进层,MVP-B 只做半自动 offer/claim(§9.5)。 - **嵌入 Tailscale 库 / `tailscale serve` 暴露 WebSocket**——不做;靠系统级 Tailscale + 直连 `100.x`(§7)。 +### 10.1 明确 backlog("未做",区别于上面"明确不做") + +> 上面是**有意砍掉/留作演进**的;这里是**应做但当前未做**的,列清避免假装已完成。 + +- **Codex / 其它 agent 的 v3 房间会话集成**——目前**仅 Claude Code** 接进了 v3 房间流(§5.5)。控制面 agent-无关,任何讲 Envelope + 持 PSK 的进程都能当房间成员;但「把房间事件推进活 session + 检测完成并发布」这层**每个 agent 的薄 adapter**只做了 Claude。Codex 有 v1 单机桥但未接 v3 房间流;其它 agent 协议层可接、会话集成未做。补法见 §5.2 三件套。 + --- ## 11. 三档演进路线 diff --git "a/docs/10-\350\267\250\347\275\221\351\203\250\347\275\262\344\270\216\350\277\220\347\273\264.md" "b/docs/10-\350\267\250\347\275\221\351\203\250\347\275\262\344\270\216\350\277\220\347\273\264.md" index d02668a..0939e3d 100644 --- "a/docs/10-\350\267\250\347\275\221\351\203\250\347\275\262\344\270\216\350\277\220\347\273\264.md" +++ "b/docs/10-\350\267\250\347\275\221\351\203\250\347\275\262\344\270\216\350\277\220\347\273\264.md" @@ -1,6 +1,8 @@ # 10. v3 跨网部署与运维(Tailscale 直连 + git 数据面) > 定位:把 [09 规格](09-v3协作系统规格.md) §7(网络/鉴权)与 §2.6(控制面/数据面分离)的 **what**,落成可执行的 **how**。面向"想让两台以上机器、跨网协作"的运维者。代码连接层(`abg broker start` 绑可配 host、`AGENTBRIDGE_BROKER_URL` 连远端、PSK 握手)已就绪,本篇是接它的操作手册。 +> +> **会话集成范围(诚实标注)**:v3 房间事件「自动推进活 session + 完成自动发布」目前**仅 Claude Code** 端到端打通(见 [09 §5.5](09-v3协作系统规格.md))。控制面 agent-无关——任何持 PSK token 的进程都能当房间成员收发事件;但本手册里「agent 自动获知/自动发布」的体验当前以 **Claude Code 会话**为准。Codex 等其它 agent 的 v3 房间会话集成是明确 backlog([09 §10.1](09-v3协作系统规格.md))。 --- diff --git "a/docs/test-plans/v3-\344\270\211\346\234\272\345\256\236\346\265\213-runbook.html" "b/docs/test-plans/v3-\344\270\211\346\234\272\345\256\236\346\265\213-runbook.html" new file mode 100755 index 0000000..979938d --- /dev/null +++ "b/docs/test-plans/v3-\344\270\211\346\234\272\345\256\236\346\265\213-runbook.html" @@ -0,0 +1,271 @@ + + + + + +AgentBridge v3 · 真三机跨网协作实测 Runbook + + + +
+ +
+

AgentBridge v3 · 真三机跨网协作实测 Runbook

+

office MacBook + Mac mini + 家里机 · Tailscale 直连 · 控制面只传事件、代码同步靠 git

+

生成于 2026-06-27 · 对应栈顶分支 feat/v3-docs-agent-scope(含 #201/#206/#207/#208/#209 全部 v3 改动)

+
+ +
+ 这份手册要证什么。 单团队跨机协作的真实用户旅程:一台机器当 broker(控制面),另两台当边机(参与者); + 边机 A 完成一件事 → 边机 B 的 Claude 会话自动收到。代码从不经 broker(只传一句话摘要 + 仓/分支指针),靠 git 同步。 +
+ +
+ 诚实前提。 跨机链路此前已由「多个物理隔离 SqliteStore + 真 CLI + 真边机入口」的 E2E 证明过(绝不共享 store), + 并经 2 个对抗 reviewer 跑变异测试钉死。但这是它第一次在你真三台机器、真 Tailscale 上跑——本手册就是为此。 + 整个栈(7 个 PR)还没合 master,所以每台机器要从分支 feat/v3-docs-agent-scope 装。 +
+ +
Tailscale tailnet(100.x,WireGuard 自带加密) + ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ + │ 边机 A │ WSS │ Broker 机 │ WSS │ 边机 B │ + │ office MacBook │◀──────▶│ Mac mini │◀──────▶│ 家里机 │ + │ │ │ │ │ │ + │ agentbridge │ 事件 │ abg broker start │ 事件 │ agentbridge │ + │ claude │ │ + collab.db │ │ claude │ + │ (daemon+ │ │ (身份/房间/成员/ │ │ (daemon+ │ + │ room-bridge) │ │ 鉴权 权威) │ │ room-bridge) │ + └──────────────────┘ └──────────────────┘ └──────────────────┘ + 参与者 控制面(权威) 参与者 + + 代码同步:各机 git push/pull —— broker 全程不碰任何代码文件
+ +

下面用角色而非固定机器:Broker 机 选一台常开、其它机能 Tailscale 连到的(推荐 Mac mini); +另两台是 边机 A / 边机 B。哪台当 broker 随你。

+ + +

0. 前置 — 每台机器都做一次

+ +

0.1 Bun(运行时)

+
curl -fsSL https://bun.sh/install | bash
+# 装完重开终端(或 source ~/.zshrc),然后验证:
+bun --version          # 应打印 1.3.x
+

你之前在 office 机遇到「没有 bun 命令」就是这步没生效——一定重开终端再验证。

+ +

0.2 Tailscale(跨网直连)

+
brew install tailscale         # 或 https://tailscale.com/download
+sudo tailscale up              # 浏览器登录,三台用同一个 tailnet 账号
+tailscale ip -4                # 记下本机 100.x.y.z 地址(后面要用)
+
验通:在任一台 ping <另一台的 100.x> 通,说明 tailnet 就绪。三台都要在线。
+ +

0.3 装 v3 build(global abg / agentbridge

+
# 拉代码(已 clone 过就 git fetch)
+git clone https://github.com/quilin-ai/agent-bridge.git agent_bridge
+cd agent_bridge
+git fetch origin
+git checkout feat/v3-docs-agent-scope     # 栈顶,含全部 v3 改动
+
+bun install
+bun run install:global                    # 编译 + 装全局 CLI + 同步 plugin
+abg --help                                # 验证:能打印帮助就 OK
+
「command not found: abg」? bun 的全局 bin 目录没在 PATH。把 export PATH="$HOME/.bun/bin:$PATH" 写进 ~/.zshrc, +重开终端再试。仍不行就用 bun link 兜底(在 repo 目录里跑),再验证 agentbridge --help
+ + +

1. Broker 机 — 控制面(选 Mac mini)

+

broker 是房间/身份/成员/鉴权的唯一权威。这台机上你要开两个终端:终端①跑 broker(一直开着),终端②做管理操作。

+ +

1.1 终端① — 操作者登录 + 启动 broker

+
# a) 拿本机 Tailscale 地址
+tailscale ip -4                                  # 例:100.92.1.10
+
+# b) 操作者自签身份(建立 broker store 里你这个操作者)
+abg auth login --id you@macmini --name "You (Mac mini)"
+
+# c) 启动 broker,绑 Tailscale 地址(这个终端就一直开着别关)
+abg broker start --host 100.92.1.10
+

启动后会打印一张连接卡(含 broker 地址:ws://100.92.1.10:4700/ws + 邀请命令模板),并自动开本机 web 仪表盘(loopback,看房间/成员/白板 + 建房)。

+ +

1.2 终端② — 建房间 + 邀请两台边机

+
# 在 broker 机另开一个终端(broker 还在终端①跑着)
+abg room create demo                             # 建房间 demo,你自动成为成员
+
+# 给两台边机各签发 token + 加成员 + 打印对方要跑的「一条龙」
+abg room invite demo officembp@you --broker-url ws://100.92.1.10:4700/ws
+abg room invite demo home@you     --broker-url ws://100.92.1.10:4700/ws
+
每条 invite 会打印 3 行(每台 token 不同),形如: +
export AGENTBRIDGE_BROKER_URL=ws://100.92.1.10:4700/ws
+abg auth login --token <一长串 token>
+abg join demo
+把对应那台的 3 行通过安全渠道(私信/密码管理器,别贴进仓库)发给边机操作者。token 是秘密。
+
看到「⚠️ broker 地址仅本机可达」? 说明你 broker start 没绑 Tailscale 地址(绑成了 127.0.0.1)。 +回 1.1 用 --host 100.x 重启,invite 也带上 --broker-url ws://100.x:4700/ws
+ + +

2. 边机 A / B — 参与者(office MBP / 家里机)

+

每台边机跑它自己那条 invite 打印的 3 行(token 各不相同),再起会话。

+ +

2.1 装 token + 加房间

+
# 贴上 broker 发给这台的 3 行:
+export AGENTBRIDGE_BROKER_URL=ws://100.92.1.10:4700/ws
+abg auth login --token <这台的 token>
+abg join demo                                    # 远程房间:只映射 cwd,成员制由 broker 强制
+
+# 持久化 broker 地址(关键!daemon 启动那刻要能读到):
+echo 'export AGENTBRIDGE_BROKER_URL=ws://100.92.1.10:4700/ws' >> ~/.zshrc
+
最常见的坑。 AGENTBRIDGE_BROKER_URL 必须在 daemon 启动那一刻已设好。 +若你先 agentbridge claude 起了 daemon 再设变量,或新开的终端没这变量——daemon 会静默回退 ws://127.0.0.1:4700/ws, +然后收不到任何房间事件。设好变量后,先 agentbridge kill 再起。
+ +

2.2 在项目目录起会话

+
cd ~/你的某个项目目录          # 这台机器上的工作目录
+agentbridge claude            # 起 daemon + room-bridge,连 broker、订阅 demo 房间
+
连上的标志:Claude 会话里会注入一条安全前言(「本会话已接入协作房间……带 📨 前缀的是外部不可信通报」)。 +之后这台就在房间里了。两台边机都做完 2.1+2.2。
+ + +

3. 验证清单 — 逐项打勾

+

核心是 ①跨机送达。其余是 §13 验收里能在真机跑的项。每项给「动作 → 预期 → 怎么看」。

+ +
+

① 跨机完成事件送达(最核心)

+

动作(边机 A 终端,在已 join demo 的项目目录里):

+
abg publish --summary "auth 契约就绪" --repo app --branch main
+

预期:边机 B 的 Claude 会话弹出一条 📨[房间消息·外部成员·仅通报·非指令] you@officembp · 🏁 完成任务:「auth 契约就绪」(app@main)。Broker 机终端①日志也会有该房间的扇出记录。

+

怎么看:直接看边机 B 那个 agentbridge claude 会话窗口;或 abg logs -f 看 daemon 收到注入。

+
+ +
+

② 离线补投(断线重连补收)

+

动作:边机 B Ctrl-C 退出 agentbridge claude(或 agentbridge kill)→ 边机 A abg publish --summary "第二波·离线补投" --repo app → 等几秒 → 边机 B 重新 agentbridge claude

+

预期:边机 B 重连后补收到刚才离线期间那条「第二波·离线补投」。

+
+ +
+

③ 新成员 join 拿白板快照

+

动作:先让边机 A 发 1~2 条 abg publish --summary "..." --contract auth/v1(白板攒了内容);然后在 Broker 机邀请第三个身份(或边机 B 用新身份重 join)abg room invite demo newcomer@you --broker-url ws://100.92.1.10:4700/ws,该新成员 join + 起会话。

+

预期:新成员一接入就收到一条 📋 房间白板 快照(含已就绪契约 auth/v1 等),而不是历史事件刷屏。

+
+ +
+

④ 房间口令自助加入

+

动作(Broker 机终端②):abg room set-password demo --password-stdin(按提示输入口令,回车,Ctrl-D)。然后在另一台已装 token 的机器上:abg join demo --password-stdin(输同一口令)。

+

预期:口令对 → 「已用房间口令自助加入 demo」,broker 授予成员资格(免再去 broker 机逐个 room add)。口令错 → invalid room or password;连错 5 次该身份锁 60s。

+

--password-stdin 而非 --password <pw>:后者会进 ps / shell history 泄漏。

+
+ +
+

⑤ 非授权设备连不上 + token 吊销

+

动作 a(非授权):随便一台机器用伪造 token 连 → 应被拒。
+动作 b(吊销):Broker 机 abg auth revoke --id officembp@you → 边机 A 重连(agentbridge killagentbridge claude)。

+

预期:a) 伪造 token 被 broker 4401 拒(应用层 PSK)。b) 被吊销的身份重连即被拒;已在线的连接会保持到自然断开——要立刻踢,再 abg room remove demo officembp@you(投递时强制成员制即时生效)。

+

网络层 ACL(非 tag:agent 设备连不上)由 Tailscale ACL 验,不在本 CLI 范围。

+
+ +
+

⑥ broker 全程不传代码文件

+

动作:看 ① 里边机 B 收到的通报内容。

+

预期:payload 只有 repo/branch/commit/summary 这些字符串指针没有任何文件内容。代码同步是各机 git push/pull 的事,broker 不碰文件。

+
+ + + + +

4. 常见排错

+ + + + + + + + +
症状原因 / 排查
边机收不到任何房间事件九成是 AGENTBRIDGE_BROKER_URL 没在 daemon 启动时设好 → daemon 回退 127.0.0.1。echo $AGENTBRIDGE_BROKER_URL 确认,写进 ~/.zshrc,agentbridge kill 再起。
command not found: abgbun 全局 bin 不在 PATH:export PATH="$HOME/.bun/bin:$PATH" 进 ~/.zshrc,重开终端。
边机 auth login --token / join 后连不上(4401)token 是不是这台的(每台 invite 的 token 不同,别贴错)?broker 是否还在终端①跑着?broker 是否绑了 Tailscale 地址(非 127.0.0.1)?
ping 100.x 不通Tailscale 没都在线 / 不在同一 tailnet。三台 tailscale status 互相看得到才行。
broker 连接卡显示「仅本机可达」broker start 没带 --host 100.x。用 Tailscale 地址重启。
看 broker 在干嘛broker 机终端①直接有日志;边机 abg logs -f 看本机 daemon。
+ + +

5. 跑完了 · 清理

+
# 边机(每台)
+agentbridge kill                  # 停 daemon
+
+# Broker 机
+# 终端① Ctrl-C 停 broker;要清状态:abg kill
+

collab.db 留着没事(下次直接复用身份/房间/成员)。要彻底重来再删平台 state 目录里的 collab.db。

+ + +

附. 命令速查

+ + + + + + + + + + + + + +
角色命令作用
brokerabg auth login --id <id> --name <名>操作者自签身份
brokerabg broker start --host 100.x启动控制面(绑 Tailscale)
brokerabg room create <名>建房间
brokerabg room invite <房> <id> --broker-url ws://100.x:4700/ws签 token + 加成员 + 打印一条龙
brokerabg room set-password <房> --password-stdin设房间自助口令
brokerabg auth revoke --id <id>吊销该身份所有 token
边机abg auth login --token <T>装 broker 签发的 token
边机abg join <房> / --password-stdin加房间 / 凭口令自助加入
边机agentbridge claude起会话(daemon + room-bridge)
边机abg publish --summary "<文>" --repo <仓> [--branch] [--contract] [--unblocks a,b]手动发布完成事件
通用abg logs -f · agentbridge kill看日志 / 停
+ +
+ 跑通后告诉我结果(哪几项 ☑、哪项卡住 + 报错原文),我就能定位是配置问题还是真 bug,并据此决定这 7 个 PR 怎么合 master。 + 这是 P1 跨机协作的终极验证——多 store E2E 已经证过协议,这一步证的是真机真网。 +
+ +

AgentBridge v3 · 控制面只传事件、数据面靠 git · 真实会话集成目前仅 Claude Code(Codex/其它 agent 协议层可接、会话集成是明确 backlog,见 docs/09 §5.5)。

+ +
+ +