9.5 KiB
9.5 KiB
sgClaw 浏览器团队开发启动文档
适用对象:Chromium / C++ 浏览器开发团队(P2)
目标:浏览器团队拿到本文档后即可独立启动开发,并在一个周期后与 sgClaw 项目团队完成 Pipe 联调。
协议版本:1.0
冻结日期:2026-03-24
1. 开发目标
浏览器团队本周期只负责浏览器侧 Pipe 接入,不负责 LLM、Skill、Memory、Agent 推理。
本周期结束时,浏览器侧必须具备以下能力:
- 能从浏览器主进程启动
sgclawRust 子进程。 - 能通过
stdin/stdout与sgclaw进行双向JSON Line通信。 - 能解析 sgClaw 发来的
command消息,并路由到现有CommandRouter。 - 能执行最小可联调动作:
click、type、navigate、getText。 - 能返回结构化
response消息。 - 能在浏览器侧执行域名和 action 白名单校验。
本周期不做:
- 不改现有
CommandRouter的核心接口。 - 不新造一套浏览器操作 API。
- 不改为 HTTP、WebSocket、Named Pipe。
- 不实现 Rust 侧逻辑。
2. 架构边界
浏览器侧是父进程,sgclaw 是子进程。浏览器侧新增三个模块:
SgClawProcessHost负责子进程启动、停止、状态管理、异常退出处理。PipeListener负责异步读取sgclaw stdout,按行解析 JSON 并分发。MacWhitelistCheck负责浏览器侧二次安全校验,防止越权 action 落到CommandRouter。
浏览器侧数据流固定如下:
Side Panel / UI -> SgClawProcessHost -> STDIO Pipe -> sgclaw
sgclaw -> STDIO Pipe -> PipeListener -> MacWhitelistCheck -> CommandRouter -> response
3. 浏览器团队负责的交付物
本周期交付以下文件或等价模块:
sgclaw_process_host.hsgclaw_process_host.ccpipe_listener.hpipe_listener.ccmac_whitelist_check.hmac_whitelist_check.ccrules.jsonsgclaw_unittests中对应单元测试
建议目录:
chrome/browser/superrpa/sgclaw/
sgclaw_process_host.h
sgclaw_process_host.cc
pipe_listener.h
pipe_listener.cc
mac_whitelist_check.h
mac_whitelist_check.cc
test/
sgclaw_process_host_unittest.cc
pipe_listener_unittest.cc
mac_whitelist_check_unittest.cc
resources/
rules.json
4. 冻结接口
4.1 传输协议
- 传输层固定为
STDIO Pipe。 - 编码固定为
UTF-8。 - 消息边界固定为
JSON Line,每行一条完整 JSON。 - 单条消息最大
1 MB。 stdout只允许输出协议消息,日志必须走stderr。
4.2 握手协议
浏览器发送:
{"type":"init","version":"1.0","hmac_seed":"0123456789abcdef","capabilities":["browser_action"]}
sgClaw 返回:
{"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"]}
约束:
- 浏览器必须在子进程启动后
5s内发送init。 5s内收不到init_ack,判定启动失败。version不一致,必须立即终止会话。
4.3 command 消息格式
{
"type":"command",
"seq":12,
"action":"click",
"params":{"selector":"#submit","wait_after":300},
"security":{
"expected_domain":"oa.example.com",
"hmac":"<hex>"
}
}
字段要求:
seq为正整数,必须唯一。action必须在白名单内。params必须是对象。security.expected_domain和security.hmac必须存在。
4.4 response 消息格式
成功:
{
"type":"response",
"seq":12,
"success":true,
"data":{"text":"提交成功"},
"aom_snapshot":[],
"timing":{"queue_ms":2,"exec_ms":38}
}
失败:
{
"type":"response",
"seq":12,
"success":false,
"data":{
"error":{
"code":"CMD_SELECTOR_NOT_FOUND",
"message":"selector '#submit' not found"
}
},
"aom_snapshot":[],
"timing":{"queue_ms":1,"exec_ms":10}
}
约束:
- 一个
command.seq只能对应一个response.seq。 - 失败必须返回结构化错误,不允许只返回字符串。
timing必须始终带上。
5. 本周期最小 Action 集
联调周期只强制四个动作:
clicktypenavigategetText
动作语义:
click调用现有点击能力,支持可选wait_after。type在目标输入框输入文本,支持clear_first。navigate导航到目标 URL。getText获取目标节点文本。
其余 action 可保留接口但不进入本周期强制验收。
6. 浏览器侧实现要求
6.1 SgClawProcessHost
必须实现:
- 单例,避免重复创建多个
sgclaw子进程。 Start()创建匿名管道并启动子进程。Stop()正常关闭并在超时后强制结束。OnProcessCrash()记录错误并更新状态。- 状态机至少包含
Idle -> Starting -> Running -> Stopped / Crashed。
建议接口:
class SgClawProcessHost {
public:
bool Start();
void Stop();
bool IsRunning() const;
bool SendLine(std::string json_line);
};
6.2 PipeListener
必须实现:
- 持续读取
stdout。 - 以换行符切分
JSON Line。 - 拒绝空行、非 JSON、超过 1MB 的消息。
- 能按
seq追踪一次请求的完整生命周期。 - 管道断开时通知
SgClawProcessHost。
6.3 CommandRouter 对接
必须实现:
command.action到现有浏览器命令的映射表。- 尽量复用现有
CommandRouter。 - 不允许在 Pipe 层直接写新的页面控制逻辑。
- response 必须从实际执行结果构造,不允许伪造成功。
建议映射:
click -> CommandRouter.clicktype -> CommandRouter.typenavigate -> CommandRouter.navigategetText -> CommandRouter.getText
6.4 MacWhitelistCheck
必须实现:
- action 白名单校验。
- expected_domain 与当前页面域名比对。
rules.json加载失败时默认拒绝。- 拒绝时返回统一错误码。
建议错误码:
MAC_ACTION_NOT_ALLOWEDMAC_DOMAIN_NOT_ALLOWEDMAC_RULES_LOAD_FAILEDPIPE_INVALID_JSONPIPE_MESSAGE_TOO_LARGE
7. 浏览器团队开发顺序
Day 1-2
- 完成
SgClawProcessHost骨架。 - 用 dummy 子进程验证启动和退出。
- 打通
stdin/stdout读写通道。
验收:
- 能启动
echo或测试进程。 - 能发送一行字符串并收到回写。
Day 3-4
- 完成
PipeListener。 - 完成
init -> init_ack握手。 - 建立
command/response解析结构。
验收:
- 能与 Rust 侧互发 JSON Line。
- 能处理
seq对应关系。
Day 5-6
- 接入
CommandRouter。 - 完成 4 个最小 action。
- 完成
MacWhitelistCheck。
验收:
- Rust 发起
click/type/navigate/getText时浏览器真实执行。 - 非白名单域名被拒绝。
Day 7
- 完成浏览器侧单元测试。
- 提供联调分支和运行说明。
- 预留半天与项目团队联调。
8. 浏览器团队自测清单
Start()成功启动真实sgclaw二进制。Start()重复调用不会启动多个实例。Stop()能正常关闭进程。init -> init_ack成功。- 超过 1MB 的 JSON 消息会被拒绝。
- 非 JSON 行会被拒绝。
click/type/navigate/getText能成功返回。- 域名不匹配时返回
MAC_DOMAIN_NOT_ALLOWED。 rules.json缺失时默认拒绝。- 日志中能按
seq查到请求和响应。
9. 联调输入输出样例
9.1 手动握手
浏览器发:
{"type":"init","version":"1.0","hmac_seed":"00112233445566778899aabbccddeeff","capabilities":["browser_action"]}
期待 Rust 回:
{"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"]}
9.2 最小 click 联调
Rust 发:
{"type":"command","seq":1,"action":"click","params":{"selector":"#login-btn"},"security":{"expected_domain":"oa.example.com","hmac":"<hex>"}}
浏览器回:
{"type":"response","seq":1,"success":true,"data":{},"aom_snapshot":[],"timing":{"queue_ms":1,"exec_ms":35}}
10. 联调日必须提供的东西
浏览器团队在联调前必须准备:
- 可运行的浏览器分支。
sgclaw子进程启动入口。rules.json默认测试配置。- 最小测试页面,至少包含一个输入框、一个按钮、一个文本节点。
- 一份 action 到
CommandRouter的映射表。 - 一份错误码表。
11. 周期结束验收标准
以下全部满足,浏览器团队本周期完成:
- 能在浏览器中稳定启动和停止
sgclaw。 init -> init_ack成功率 100%。click/type/navigate/getText联调通过。- 所有失败场景均返回结构化错误。
- 域名和 action 白名单生效。
- 与项目团队在同一测试页完成一次端到端演示。
12. 依赖与协作方式
浏览器团队只依赖以下冻结输入:
- Pipe 协议版本:
1.0 - 消息结构:
init / init_ack / command / response - 最小 action:
click/type/navigate/getText - 安全字段:
expected_domain、hmac
除以上四项外,本周期内其他细节不应阻塞浏览器侧开发。