主题
Agent 服务通信协议
本文引用的源码文件
本文引用的文件
目录
引言
本文件定义 Chrome 扩展端与本地 Agent 服务之间的完整通信协议,覆盖 HTTP REST API、WebSocket 流式命令输出、认证配对码与 Token 管理、文件操作、命令执行、长期记忆存储与 RAG 检索。文档同时说明连接池与重试策略、错误恢复机制、流式数据传输、进度回调、取消机制、安全性与审计追踪,并提供客户端集成要点与排障建议。
Agent 为独立 Node.js 进程(版本 2.3.1),Chrome 扩展为 Manifest V3 背景脚本(版本 2.3.1)。两端通过本地 HTTP/WebSocket 通信;Agent 源码修改后必须重启进程,新接口才生效。
项目结构
- 扩展侧客户端封装位于
src/background/local-agent-client.js,负责配对、Token 管理、HTTP 请求与 WebSocket 建连。 - Agent 服务端入口位于
agent/src/server.js,统一处理 HTTP 路由、CORS、认证、文件、命令、Skill、MCP、RAG、Memory、日志等。 - 安全与路径沙箱在
agent/src/security.js;命令分级在checkCommand。 - 命令执行与 WebSocket 输出在
agent/src/executor.js。 - 长期记忆路由在
agent/src/memory/routes.js。 - RAG 配置与默认值在
agent/src/rag/config.js。 - 扩展侧工具执行与超时/取消逻辑在
src/background/tool-executor.js,取消事件由src/background/index.js分发。
graph TB subgraph "Chrome 扩展" BG["background/local-agent-client.js"] TE["background/tool-executor.js"] IDX["background/index.js"] end subgraph "本地 Agent 服务" S["server.js<br/>HTTP + WebSocket 路由"] A["auth.js<br/>配对码与 Token"] SEC["security.js<br/>路径与命令安全"] EXE["executor.js<br/>命令执行与 WS 输出"] MEM["memory/routes.js<br/>长期记忆"] RAGCFG["rag/config.js<br/>RAG 配置"] end BG --> |HTTP / WebSocket| S TE --> BG IDX --> TE S --> A S --> SEC S --> EXE S --> MEM S --> RAGCFG
图示来源
- src/background/local-agent-client.js#L40-L93
- agent/src/server.js#L388-L425
- agent/src/auth.js#L1-L10
- agent/src/security.js#L1-L10
- agent/src/executor.js#L188-L230
- agent/src/memory/routes.js#L1-L20
- agent/src/rag/config.js#L1-L20
章节来源
核心组件
- 认证与配对:Agent 生成一次性配对码,扩展提交配对码与 extensionId,成功后获得 Bearer Token;后续所有受保护接口均携带该 Token。
- 文件操作:读、写、列目录、删除(回收站)、下载(base64 或流式)、搜索文件名与内容、预览 XLSX、批量打包 ZIP。
- 命令执行:支持同步等待与异步流式;灰名单需用户确认;黑名单绝对禁止;支持停止、daemon 化、超时预算协商。
- 长期记忆:store/recall/inject/reindex 等接口,embedding 配置与探活。
- RAG:知识库增删改查、导入、检索、安装可选依赖、检测可用性。
- Skill/MCP:技能列表、详情、运行、导入、Markdown 管理;MCP Server 管理、工具调用。
- 审计日志:查询最近 7 天日志条目。
章节来源
- agent/src/server.js#L471-L548
- agent/src/server.js#L985-L1600
- agent/src/server.js#L1603-L1690
- agent/src/server.js#L1727-L2002
- agent/src/server.js#L2023-L2075
- agent/src/server.js#L1705-L1725
架构总览
扩展侧通过 local-agent-client.js 统一发起 HTTP 请求与 WebSocket 连接;Agent 侧 server.js 作为唯一入口,完成认证、鉴权、安全校验、业务路由与响应。命令执行采用“HTTP 初始化 + WebSocket 流式输出”的混合模式。
sequenceDiagram
participant Ext as "扩展 background/local-agent-client.js"
participant Srv as "Agent server.js"
participant Auth as "auth.js"
participant Sec as "security.js"
participant Exec as "executor.js"
Ext->>Srv : POST /api/pair {code, extensionId}
Srv->>Auth : handlePairRequest(code, extensionId)
Auth-->>Srv : {success, token}
Srv-->>Ext : {success, token}
Ext->>Srv : GET /api/status/detail (Authorization : Bearer token)
Srv->>Auth : verifyToken(token)
Auth-->>Srv : extId
Srv-->>Ext : {version, workdir, allowedPaths, ...}
Ext->>Srv : POST /api/exec {command, cwd, timeoutMs}
Srv->>Sec : checkCommand(command, force)
Sec-->>Srv : {level : allow|confirm|deny}
Srv->>Exec : executeCommand(...)
Exec-->>Srv : execId
Srv-->>Ext : {execId, wsUrl}
Ext->>Srv : WebSocket /ws/exec/{execId}?token=...
Srv->>Exec : addWsClient(execId, ws)
Exec-->>Ext : stdout/stderr/error/exit
图示来源
- src/background/local-agent-client.js#L275-L330
- agent/src/server.js#L474-L485
- agent/src/server.js#L537-L548
- agent/src/server.js#L1605-L1673
- agent/src/server.js#L2089-L2153
- agent/src/executor.js#L425-L453
详细组件分析
认证流程、配对码与 Token 管理
- 配对码生成:Agent 启动时生成 6 位字母数字配对码,周期性刷新;若存在已配对且 5 分钟内有过活跃认证,则暂停刷新。
- 配对请求:扩展发送
{code, extensionId};失败超过阈值会临时锁定并轮换配对码;成功即保存扩展 ID 与随机 Token。 - Token 验证:所有受保护接口要求
Authorization: Bearer <token>;WebSocket 优先使用 Authorization Header,回退到 URL query?token=。 - 心跳:
GET /api/heartbeat仅刷新最后认证时间,不返回敏感信息。
flowchart TD
Start(["开始"]) --> Gen["生成配对码并定时刷新"]
Gen --> PairReq{"收到 /api/pair ?"}
PairReq --> |否| KeepAlive["维持当前配对码"]
PairReq --> |是| Validate["校验 code 与 extensionId"]
Validate --> Valid{"配对码正确?"}
Valid --> |否| Lock["累计失败 → 锁定并轮换配对码"]
Valid --> |是| Save["保存 extensionId 与 token"]
Save --> Rotate["立即轮换配对码"]
Rotate --> Done(["结束"])
KeepAlive --> Done
图示来源
章节来源
- agent/src/auth.js#L30-L102
- agent/src/auth.js#L117-L127
- agent/src/auth.js#L138-L179
- agent/src/server.js#L474-L485
- agent/src/server.js#L537-L553
- agent/src/server.js#L2108-L2123
文件操作 API
- 上传:
POST /api/files/upload(multipart)与POST /api/fs/upload-stream(raw binary,path 通过 query 传递)。 - 读取/写入/列出/删除:
/api/fs/read、/api/fs/write、/api/fs/list、/api/fs/delete(移入回收站)。 - 统计/下载:
/api/fs/stat、/api/fs/download(base64)、/api/fs/download-stream(二进制流)、/api/fs/download-multi(多文件 zip base64)。 - 搜索:
/api/fs/search_files、/api/fs/search_content。 - 其他:
/api/fs/mkdir、/api/fs/rename、/api/fs/move、/api/fs/preview-xlsx。 - 安全:所有路径先经
checkPath,工作目录永远放行,但符号链接最终 realpath 仍受硬阻止目录限制。
flowchart TD
In(["请求进入"]) --> Check["checkPath(path)"]
Check --> Allowed{"允许?"}
Allowed --> |否| Deny["返回 403 + reason"]
Allowed --> |是| Op{"操作类型"}
Op --> Read["read / stat / list"]
Op --> Write["write / mkdir / rename / move"]
Op --> Delete["delete → moveToTrash"]
Op --> Download["download / download-stream / download-multi"]
Op --> Search["search_files / search_content"]
Read --> Out(["JSON 响应"])
Write --> Out
Delete --> Out
Download --> Out
Search --> Out
图示来源
章节来源
命令执行与 WebSocket 流式协议
- HTTP 初始化:
POST /api/exec返回{execId, wsUrl};若 level=confirm 需要前端弹窗确认后再以 force=true 重新初始化。 - WebSocket 输出:
/ws/exec/{execId}?token=...,消息包括stdout、stderr、error、exit(含 exitCode、killed、timedOut)。 - 控制面:
/api/exec/stop终止进程;/api/exec/detach显式 daemon 化豁免超时。 - 超时与空闲:扩展侧计算 idleTimeout,Agent 侧支持受管模式 timeoutMs;断开所有 WS 客户端后按旧语义或受管语义处理。
sequenceDiagram
participant FE as "tool-executor.js"
participant AC as "local-agent-client.js"
participant S as "server.js"
participant E as "executor.js"
FE->>AC : execCommand(command, cwd, force, timeoutMs)
AC->>S : POST /api/exec
S->>E : executeCommand(...)
E-->>S : execId
S-->>AC : {execId, wsUrl}
AC->>S : WebSocket /ws/exec/{execId}?token=...
E-->>AC : stdout/stderr/error/exit
FE->>AC : stopCommand(execId) | detachCommand(execId)
AC->>S : /api/exec/stop | /api/exec/detach
图示来源
- src/background/tool-executor.js#L4348-L4400
- src/background/local-agent-client.js#L600-L626
- agent/src/server.js#L1605-L1689
- agent/src/executor.js#L188-L230
- agent/src/executor.js#L425-L453
章节来源
- agent/src/server.js#L1605-L1689
- agent/src/executor.js#L188-L230
- agent/src/executor.js#L425-L453
- src/background/tool-executor.js#L4348-L4400
- src/background/tool-executor.js#L5069-L5094
长期记忆与 RAG 查询
- 长期记忆:
/api/memory/store、/api/memory/recall、/api/memory/injectSelect、/api/memory/reindex;embedding 配置与探活/api/memory/embedding-config、/api/memory/test-embedding、/api/memory/vector-status。 - RAG:知识库集合、导入、检索、安装依赖、检测可用性;默认 embedding 模型与分块参数见
rag/config.js。
flowchart TD
MIn(["/api/memory/*"]) --> Dispatch["memoryDispatch"]
Dispatch --> EmbedCfg{"embedding-config/test-embedding/vector-status ?"}
EmbedCfg --> |是| HandleEmbed["handleEmbeddingEndpoints"]
EmbedCfg --> |否| Route["ROUTE_METHODS 映射 store/recall/inject/reindex"]
Route --> Service["service.* 调用"]
Service --> Resp(["{success,...}"])
图示来源
- agent/src/memory/routes.js#L19-L27
- agent/src/memory/routes.js#L77-L137
- agent/src/memory/routes.js#L149-L192
章节来源
连接池管理、重试策略与错误恢复
- 可达性缓存:扩展侧按 agentId 维护
_agentReachability,已知不可达直接返回错误,避免阻塞等待超时。 - 请求超时:
agentRequest/agentGet使用 AbortController 超时;上传单独 60s 超时。 - WebSocket 保活:Agent 侧每 30s ping,两拍未 pong 则 terminate;扩展侧 tool-executor 维护 idleTimeout 与正常退出标记。
- 优雅关闭:Agent 关闭时终止进程、关闭 MCP、强制断开 WS 与 HTTP socket,10s 兜底退出。
flowchart TD
Reachable{"代理可达?"}
Reachable --> |否| FastFail["快速失败,提示未连接"]
Reachable --> |是| HttpReq["HTTP 请求带超时"]
HttpReq --> WsConn{"WebSocket 建连?"}
WsConn --> |否| RetryOrFail["根据场景重试或直接失败"]
WsConn --> |是| Heartbeat["Agent 侧 30s ping/pong"]
Heartbeat --> Close{"连接关闭?"}
Close --> |正常| Finish["正常结束"]
Close --> |异常| Cleanup["清理资源/终止进程"]
图示来源
- src/background/local-agent-client.js#L100-L140
- src/background/local-agent-client.js#L399-L443
- agent/src/server.js#L2133-L2148
- agent/src/server.js#L2240-L2288
章节来源
- src/background/local-agent-client.js#L100-L140
- src/background/local-agent-client.js#L399-L443
- agent/src/server.js#L2133-L2148
- agent/src/server.js#L2240-L2288
安全性、权限控制与审计追踪
- CORS:仅对
chrome-extension://Origin 返回 ACAO,防止恶意网页跨域读取无认证端点。 - 路径沙箱:
checkPath支持白名单、工作目录放行、realpath 防符号链接绕过、硬阻止系统目录。 - 命令分级:黑名单绝对禁止,灰名单需用户确认;支持包装器剥壳、内联载荷解析、替换特征送检。
- 审计日志:
/api/logs/query返回最近 7 天最多 500 条记录。
章节来源
- agent/src/server.js#L235-L266
- agent/src/security.js#L62-L100
- agent/src/security.js#L109-L229
- agent/src/security.js#L285-L384
- agent/src/security.js#L691-L758
- agent/src/server.js#L1705-L1725
依赖关系分析
server.js聚合 auth、security、executor、memory、rag、skill、mcp、logger、trash、config、i18n 等模块。- 扩展侧
local-agent-client.js暴露统一 API,被tool-executor.js与 UI 层调用。 tool-executor.js实现 ReAct 执行循环中的命令执行、超时、取消与结果上报。background/index.js分发取消事件,触发 tool-executor 取消正在运行的 Agent 命令。
graph LR LAC["local-agent-client.js"] --> S["server.js"] TE["tool-executor.js"] --> LAC IDX["background/index.js"] --> TE S --> AUTH["auth.js"] S --> SEC["security.js"] S --> EXE["executor.js"] S --> MEM["memory/routes.js"] S --> RAG["rag/config.js"]
图示来源
- src/background/local-agent-client.js#L40-L93
- agent/src/server.js#L1-L57
- src/background/tool-executor.js#L4348-L4400
- src/background/index.js#L950-L960
章节来源
- agent/src/server.js#L1-L57
- src/background/local-agent-client.js#L40-L93
- src/background/tool-executor.js#L4348-L4400
- src/background/index.js#L950-L960
性能与可靠性
- 大文件传输:提供流式上传与流式下载,避免 base64 膨胀与内存峰值。
- 搜索上限:单次搜索最大结果数限制,防止大量 IO。
- 命令执行:支持同步等待与异步流式;idleTimeout 与受管超时协同;WS 心跳保活。
- 优雅关闭:10s 强制退出兜底,确保端口释放与子进程清理。
[本节为通用指导,不直接分析具体文件]
故障排查指南
- 无法连接 Agent:检查代理是否启动、端口占用、CORS 与 Origin;扩展侧可达性缓存可能快速失败。
- 配对失败:核对配对码、extensionId;连续失败会被锁定并轮换配对码。
- 文件操作失败:确认 path 是否在允许目录、是否存在、大小限制;注意脚本文件写入后会剥离执行权限。
- 命令执行被拒绝:查看 level=deny/confirm 原因;黑名单不可绕过,灰名单需用户确认。
- WebSocket 断连:检查网络、代理保活;Agent 侧 30s ping/pong 可检测半开连接。
- RAG 不可用:先调用
/api/rag/install与/api/rag/detect;依赖加载失败需重启 Agent。
章节来源
- agent/src/server.js#L474-L548
- agent/src/server.js#L1036-L1600
- agent/src/server.js#L1605-L1689
- agent/src/server.js#L2023-L2075
- agent/src/server.js#L2133-L2148
结论
本协议以 HTTP REST 为主、WebSocket 为辅,结合配对码与 Bearer Token 完成双向可信通信。Agent 侧通过严格的路径与命令安全策略保障宿主环境安全;扩展侧通过可达性缓存、请求超时与 WS 心跳提升鲁棒性。长期记忆与 RAG 能力通过模块化路由接入,便于按需启用与扩展。
[本节为总结,不直接分析具体文件]
附录:API 契约与消息协议
HTTP REST API 摘要
- 认证与会话
POST /api/pair:配对认证,请求体{code, extensionId},返回{success, token, message?}。GET /api/status:健康检查,无需认证,返回平台信息与能力标志。GET /api/status/detail:需认证,返回 pairCodeTTL、workdir、allowedPaths、runningProcesses、resourceUsage 等。GET /api/heartbeat:需认证,刷新 lastAuthTime。
- 文件操作
POST /api/files/upload:multipart 上传。POST /api/fs/upload-stream:raw binary 上传,query 传 path。POST /api/fs/read、/api/fs/write、/api/fs/list、/api/fs/delete、/api/fs/stat、/api/fs/download、/api/fs/download-stream、/api/fs/download-multi、/api/fs/search_files、/api/fs/search_content、/api/fs/mkdir、/api/fs/rename、/api/fs/move、/api/fs/preview-xlsx。
- 命令执行
POST /api/exec:返回{execId, wsUrl}或{level: confirm|deny}。POST /api/exec/stop、POST /api/exec/detach。
- 长期记忆
POST /api/memory/store、/api/memory/recall、/api/memory/injectSelect、/api/memory/reindex。GET/POST /api/memory/embedding-config、POST /api/memory/test-embedding、GET /api/memory/vector-status。
- RAG
POST /api/rag/install、GET /api/rag/install/status、POST /api/rag/detect。- 动态路由
/api/rag/*:集合、导入、检索、状态等。
- Skill/MCP/日志/回收站
- Skill:
/api/skill/list、/api/skill/detail、/api/skill/run、/api/skill/import、/api/skill/delete、/api/skill/toggle、/api/skill/save-markdown、/api/skill/markdown、/api/skill/resource、/api/skill/import-zip、/api/skill/import-url、/api/skill/agent-prompts、/api/skill/agent-prompt。 - MCP:
/api/mcp/tools、/api/mcp/call、/api/mcp/servers、/api/mcp/servers/connect、/api/mcp/servers/disconnect、/api/mcp/servers/toggle。 - 日志:
POST /api/logs/query。 - 回收站:
GET /api/trash/list、POST /api/trash/restore。
- Skill:
章节来源
- agent/src/server.js#L474-L548
- agent/src/server.js#L751-L862
- agent/src/server.js#L985-L1600
- agent/src/server.js#L1605-L1689
- agent/src/server.js#L1705-L2002
- agent/src/server.js#L2023-L2075
WebSocket 消息协议
- 连接地址:
ws://{host}:{port}/ws/exec/{execId}?token={token}。 - 消息类型
stdout:标准输出片段。stderr:标准错误片段。error:执行错误,包含 error 与 execId。exit:执行结束,包含 exitCode、killed、timedOut、execId。
- 保活:Agent 每 30s ping,客户端应回复 pong;两拍未回则 terminate。
章节来源
客户端集成示例(步骤)
- 获取 Agent 地址与配对码,调用
POST /api/pair获得 token。 - 将 token 存入扩展存储,并在后续请求中附加
Authorization: Bearer <token>。 - 文件操作:使用
uploadFile、readFile、writeFile、listDir、deleteFile、downloadFile等封装方法。 - 命令执行:调用
execCommand获取 execId 与 wsUrl,建立 WebSocket 接收 stdout/stderr/error/exit;必要时调用stopCommand或detachCommand。 - 长期记忆与 RAG:调用 memory 与 rag 相关封装方法;RAG 首次导入可能耗时较长,注意超时设置。
- 取消与恢复:通过
CANCEL_REACT消息触发 background 取消,tool-executor 关闭 WS 并终止进程。
章节来源