Agent 脚本执行协议
Agent 脚本执行协议
本文描述管理后台运行脚本时,Server 与 Agent 之间使用的 exec 流。它复用现有的流打开、数据帧与窗口流控,没有新增帧类型。能力协商与安全边界见 ADR 0005。
能力
Agent 在握手中宣告 agent_exec.v1,且仅当 agent.exec.enabled 为真时宣告。Server 只会向宣告了该能力的会话发送 exec 流;未宣告则返回不支持。
请求
OpenStream 的协议名为 exec,没有目标主机和端口。流的第一段字节是请求头,随后是脚本正文:
length u32 大端 请求头 JSON 的字节数,1..1024
header JSON {"timeout_s": <秒>, "script_len": <字节数>}
script script_len 字节 脚本正文,原样传递,不经过命令行参数
- 请求头可以分多次到达,接收方在字节足够时才解析。
- 脚本全部到达后才开始运行;之后再写入任何字节都会被拒绝。
- 脚本长度超过 Agent 的
max_script_bytes时,在开始前拒绝。
响应
输出以记录序列返回,每条记录为:
kind u8 1=stdout 2=stderr 3=exit 4=error
length u32 大端 payload 的字节数,最大 65536
payload ...
exit的 payload 为 JSON:exit_code、signaled、timed_out、truncated、duration_ms。它是最后一条正常记录。error的 payload 为可读文本,说明 Agent 拒绝或无法运行,例如忙碌或已禁用。- 输出超过
max_output_bytes后,多余部分被丢弃并在exit中标记为truncated。
浏览器侧
管理后台通过 /ws/agent-exec/{sessionId}?ticket= 连接 Server。浏览器先发送一条 JSON:
{"type":"run","script":"echo hi","timeoutSec":60}
Server 把记录转换为 JSON 文本帧:{"type":"stdout"|"stderr","data":"<base64>"}、{"type":"exit",...}、{"type":"error","message":"..."}。关闭浏览器连接会结束流,Agent 随之终止脚本的进程组。