8.8 KiB
8.8 KiB
sgClaw 本项目团队开发启动文档
适用对象:sgClaw Rust / Agent 项目开发团队(P1a、P1b)
目标:项目团队拿到本文档后即可独立启动 Rust 侧开发,并在一个周期后与浏览器团队完成 Pipe 联调。
协议版本:1.0
冻结日期:2026-03-24
1. 开发目标
本项目团队本周期只负责 sgClaw Rust 侧能力,不负责 Chromium 内部实现。
本周期结束时,Rust 侧必须具备以下能力:
- 可作为浏览器子进程启动。
- 通过
stdin/stdout执行双向JSON Line通信。 - 完成
init -> init_ack握手。 - 提供
BrowserPipeTool,可发送click/type/navigate/getText。 - 能等待并解析浏览器侧
response。 - 能执行本地
MAC Policy初步校验。
本周期不做:
- 不切回 HTTP/TCP 演示通道。
- 不依赖浏览器团队未完成的 UI。
- 不把 pipe 协议和业务 skill 混在一起推进。
- 不要求本周期完成完整 15 action。
2. Rust 团队负责的交付物
本周期交付以下文件或等价模块:
src/main.rssrc/pipe/protocol.rssrc/pipe/handshake.rssrc/pipe/browser_tool.rssrc/pipe/mod.rssrc/security/mac_policy.rssrc/security/hmac.rstests/pipe_protocol_test.rstests/pipe_handshake_test.rstests/browser_tool_test.rstests/integration/handshake_flow_test.rs
建议本周期目录保持如下:
src/
main.rs
lib.rs
pipe/
mod.rs
protocol.rs
handshake.rs
browser_tool.rs
security/
mod.rs
hmac.rs
mac_policy.rs
tests/
pipe_protocol_test.rs
pipe_handshake_test.rs
browser_tool_test.rs
integration/
handshake_flow_test.rs
resources/
rules.json
3. 冻结边界
3.1 本周期团队边界
P1a 负责:
- Pipe 协议结构体。
- 握手。
BrowserPipeTool。- HMAC 计算。
- response 关联和超时处理。
P1b 负责:
- 将
BrowserPipeTool作为工具注册到后续AgentRuntime。 - 但本周期联调不阻塞于完整 ReAct Loop。
本周期联调最小成功标准是:
- Rust 能发命令。
- 浏览器能执行并返回。
- Rust 能按
seq收到正确 response。
3.2 进程与日志约束
stdin只读协议消息。stdout只写协议消息。- 所有日志必须写到
stderr。 - 遇到协议错误时返回结构化错误或退出,不允许把调试日志写进
stdout。
4. 冻结协议
4.1 Browser -> sgClaw
init
{"type":"init","version":"1.0","hmac_seed":"0123456789abcdef","capabilities":["browser_action"]}
response
{"type":"response","seq":1,"success":true,"data":{},"aom_snapshot":[],"timing":{"queue_ms":1,"exec_ms":20}}
4.2 sgClaw -> Browser
init_ack
{"type":"init_ack","version":"1.0","agent_id":"uuid-v4","supported_actions":["click","type","navigate","getText","getHtml","waitForSelector","pageScreenshot","select","scrollTo","getAomSnapshot","storageSet","storageGet","zombieSpawn","zombieKill"]}
command
{
"type":"command",
"seq":1,
"action":"click",
"params":{"selector":"#submit"},
"security":{
"expected_domain":"oa.example.com",
"hmac":"<hex>"
}
}
4.3 必须满足的协议规则
- 编码为 UTF-8。
- 每行一个完整 JSON。
- 单消息最大
1 MB。 seq从1开始递增。- 每个
command.seq对应唯一response.seq。 version固定为1.0。
5. Rust 侧实现要求
5.1 main.rs
本周期 main 的目标很简单:
- 初始化日志到
stderr。 - 用
stdin/stdout执行握手。 - 初始化
BrowserPipeTool所需对象。 - 保持进程存活,等待命令结果和后续任务。
如果当前代码还保留演示版 HTTP 入口,本周期必须恢复到 pipe 入口优先。
5.2 handshake.rs
必须实现:
- 从
stdin读取第一条init。 - 校验
version。 - 从
hmac_seed派生会话级 HMAC key。 - 生成
agent_id。 - 向
stdout回写init_ack。
失败条件:
- 第一条消息不是
init。 version不匹配。hmac_seed非法。
5.3 protocol.rs
必须定义:
BrowserMessageAgentMessageSecurityFieldsTimingAction
本周期最小 Action 必须覆盖:
clicktypenavigategetText
建议保留剩余 action 枚举,为后续扩展留口。
5.4 browser_tool.rs
必须实现:
- 输入参数反序列化为
Action。 - 调用本地
MAC Policy做前置校验。 - 分配递增
seq。 - 计算
security.hmac。 - 向
stdout写出command。 - 等待同
seq的response。 - 超时返回错误。
建议超时:
- 握手超时:
5s - 单 action 响应超时:
30s
5.5 mac_policy.rs
本周期最小校验:
- action 白名单。
- 域名白名单。
- storage key 前缀约束可后置。
- 熔断器可后置,但接口要预留。
rules.json 建议格式:
{
"version": "1.0",
"domains": {
"allowed": ["oa.example.com", "erp.example.com", "hr.example.com"]
},
"pipe_actions": {
"allowed": ["click", "type", "navigate", "getText"],
"blocked": ["eval", "executeJsInPage"]
}
}
6. 本周期开发顺序
Day 1-2
- 固定协议结构体。
- 写
pipe_protocol_test。 - 写
pipe_handshake_test。 - 恢复
stdin/stdout入口。
验收:
- 能独立运行进程并手动喂一条
init。 - 能正确输出
init_ack。
Day 3-4
- 完成
BrowserPipeTool。 - 完成 HMAC 计算。
- 完成基于
seq的 response 匹配。 - 与本地 mock 浏览器进程联通。
验收:
- Rust 能发出
click/type/navigate/getText四类命令。 - mock response 能被正确接收。
Day 5-6
- 接入最小
MAC Policy。 - 完成 integration test。
- 准备联调脚本和示例 JSON。
验收:
- 非白名单 action 在 Rust 侧被前置拒绝。
- 域名不合法时直接失败。
Day 7
- 收口测试。
- 输出联调说明。
- 与浏览器团队联调。
7. Rust 团队自测清单
protocol.rs序列化/反序列化测试通过。init -> init_ack测试通过。version不匹配时握手失败。hmac_seed非法时握手失败。click/type/navigate/getText命令都能正确编码。response.seq不匹配时不会误关联。- 单 action 超时能返回错误。
- 非白名单 action 被
MAC Policy拒绝。 - 日志只出现在
stderr。
8. 联调输入输出样例
8.1 手动运行握手
输入:
{"type":"init","version":"1.0","hmac_seed":"00112233445566778899aabbccddeeff","capabilities":["browser_action"]}
期望输出:
{"type":"init_ack","version":"1.0","agent_id":"00000000-0000-0000-0000-000000000000","supported_actions":["click","type","navigate","getText","getHtml","waitForSelector","pageScreenshot","select","scrollTo","getAomSnapshot","storageSet","storageGet","zombieSpawn","zombieKill"]}
8.2 最小命令样例
输出给浏览器:
{"type":"command","seq":1,"action":"navigate","params":{"url":"https://oa.example.com/login"},"security":{"expected_domain":"oa.example.com","hmac":"<hex>"}}
浏览器回:
{"type":"response","seq":1,"success":true,"data":{},"aom_snapshot":[],"timing":{"queue_ms":1,"exec_ms":50}}
9. 联调前必须提供的东西
本项目团队在联调前必须准备:
- 可运行的
sgclaw可执行文件或 debug 启动方式。 - 协议样例文件。
rules.json默认测试配置。- 四个最小 action 的参数样例。
- 一份错误码表。
- 一份
stderr日志关键字段说明。
10. 周期结束验收标准
以下全部满足,Rust 团队本周期完成:
sgclaw可以被浏览器作为子进程启动。init -> init_ack成功率 100%。- 能稳定发送
click/type/navigate/getText四类命令。 - 能稳定按
seq收到并解析 response。 - Rust 侧前置
MAC Policy生效。 - 与浏览器团队在同一测试页面上联调成功。
11. 联调日执行顺序
联调当天只按下面顺序走,避免双方并发改协议:
- 先验证
init -> init_ack。 - 再验证
navigate。 - 再验证
type。 - 再验证
click。 - 最后验证
getText。 - 再补失败场景:域名拒绝、非法 action、超时。
任何协议字段问题,一律以 protocol.rs 和本文件为准,不在联调现场临时改口。
12. 对浏览器团队的依赖
Rust 团队本周期只依赖浏览器团队提供以下冻结输入:
- 浏览器能启动子进程。
- 浏览器能收发 JSON Line。
- 浏览器支持 4 个最小 action。
- 浏览器返回结构化
response。
浏览器内部如何落到 CommandRouter,不属于 Rust 团队阻塞项。