主题
Agent 服务问题
本文引用的源码文件
本文引用的文件
目录
引言
本文件面向 Agent 服务的运维与排障,覆盖启动失败、连接异常、权限拒绝、资源占用过高、MCP 协议问题以及 RAG 索引构建失败等典型场景。Agent 为独立 Node.js 进程(默认监听 127.0.0.1:18910),Chrome 扩展通过 HTTP/WebSocket 调用其文件系统、命令执行、长期记忆与 RAG 能力;修改 Agent 源码后必须重启进程,新接口才生效。
项目结构
Agent 端以 server.js 为 HTTP + WebSocket 入口,按功能拆分为配置、安全、命令执行、MCP、RAG、长期记忆等模块;扩展端 background/local-agent-client.js 封装所有远程调用。
graph TB subgraph "Chrome 扩展" LAC["background/local-agent-client.js"] end subgraph "Agent 进程" S["server.js<br/>HTTP+WebSocket 路由"] CFG["config.js<br/>配置读写"] SEC["security.js<br/>路径/命令安全"] EXE["executor.js<br/>命令执行器"] MCP["mcp/client.js<br/>MCP 客户端"] RAG["rag/manager.js<br/>知识库生命周期"] MEM["memory/service.js<br/>长期记忆"] end LAC --> |HTTP / WebSocket| S S --> CFG S --> SEC S --> EXE S --> MCP S --> RAG S --> MEM
图示来源
章节来源
核心组件
- 服务器与路由:负责端口监听、CORS、认证、健康检查、重启/更新、文件上传、状态详情等。
- 配置管理:默认端口 18910、工作目录、allowedPaths、pairCodeTTL、commandTimeout、fileMaxSize、RAG URL 内网策略、记忆 embedding 配置。
- 安全管控:路径白名单 + 硬阻止清单 + 符号链接校验;命令黑名单/灰名单分级。
- 命令执行:跨平台 shell 选择、流式输出、超时预算与延长策略、进程树终止。
- MCP 客户端:支持 stdio/SSE/streamable-http/websocket 传输,工具发现与调用。
- RAG 管理器:知识库注册表、文档导入、分块、向量化、向量存储、检索参数上限、重建与崩溃恢复。
- 长期记忆:关键词通道 + 可选向量通道,召回锁外嵌入、冷却与降级。
- 扩展端客户端:配对、认证、HTTP/WebSocket 封装、可达性缓存、错误提示。
章节来源
- agent/src/server.js#L388-L749
- agent/src/config.js#L15-L39
- agent/src/security.js#L62-L229
- agent/src/executor.js#L32-L91
- agent/src/mcp/client.js#L35-L127
- agent/src/rag/manager.js#L172-L300
- agent/src/memory/service.js#L143-L187
- src/background/local-agent-client.js#L393-L443
架构总览
扩展端通过 local-agent-client.js 发起带 Bearer Token 的 HTTP 请求或 WebSocket 连接;Agent server.js 在请求入口处设置各子模块语言、校验 CORS、鉴权,再分发到文件、命令、MCP、RAG、记忆等子系统。
sequenceDiagram
participant Ext as "扩展端<br/>local-agent-client.js"
participant Srv as "Agent 服务器<br/>server.js"
participant Sec as "安全模块<br/>security.js"
participant Exe as "命令执行器<br/>executor.js"
participant Rag as "RAG 管理器<br/>rag/manager.js"
participant Mem as "长期记忆<br/>memory/service.js"
Ext->>Srv : "POST /api/exec (Bearer Token)"
Srv->>Srv : "解析语言/CORS/鉴权"
Srv->>Sec : "checkCommand(command, force)"
Sec-->>Srv : "{safe, level}"
alt 允许
Srv->>Exe : "executeCommand(command, cwd, wsClient)"
Exe-->>Ext : "stdout/stderr/exit 流式消息"
else 拒绝/确认
Srv-->>Ext : "{success : false, error}"
end
Note over Ext,Rag : "RAG 导入/检索走 /api/rag/* 路由"
Note over Ext,Mem : "记忆 recall/store 走 /api/memory/* 路由"
图示来源
详细组件分析
启动失败诊断
常见问题包括端口占用、配置文件损坏、依赖库加载失败、Node 版本不兼容。
- 端口占用检查
- 默认监听 host=127.0.0.1、port=18910;若被占用,server 无法启动。
- 建议先查看系统端口占用情况,再调整 config.json 中的 port/host。
- 配置文件验证
- 配置文件位于用户目录下 .ai-helper-agent/config.json;若 JSON 解析失败,loadConfig 会回退默认值并记录日志。
- 注意 memoryEmbedding.apiKey 落盘前混淆,读取时解密;若加密字段损坏,可能影响后续 RAG/记忆链路。
- 依赖库加载错误
- server.js 启动时会异步检测 RAG 能力;若 Node 环境缺失原生依赖或子进程探测失败,RAG 不可用但服务仍可启动。
- 若 npm 全局安装 ai-helper-agent 失败,应优先检查网络代理、npm registry、权限与磁盘空间。
flowchart TD
Start(["启动 Agent"]) --> LoadCfg["加载 config.json"]
LoadCfg --> CfgOk{"JSON 有效?"}
CfgOk -- "否" --> Fallback["使用默认配置并记录错误"]
CfgOk -- "是" --> DetectRAG["异步检测 RAG 能力"]
DetectRAG --> Listen["监听 HTTP/WebSocket"]
Fallback --> Listen
Listen --> Ready(["服务就绪"])
图示来源
章节来源
连接异常处理流程
涵盖 HTTP/WebSocket 超时、认证失败、跨域访问问题。
- HTTP/WebSocket 超时
- 扩展端 agentRequest/agentGet/createExecWebSocket 均使用 AbortController 控制超时;AbortError 会返回“请求超时”提示。
- 对于长任务(如 exec wait),可传入 timeoutMs 协商受管模式;Agent 端 executor.js 会根据输出心跳决定是否延长或终止。
- 认证失败
- 未携带 Authorization: Bearer token 的请求会被拒绝;token 无效也会返回 401/403。
- 配对流程通过 /api/pair 完成,成功后扩展端保存 token 并在后续请求中附带。
- 跨域访问
- server.js 仅放行 chrome-extension:// 来源的 Origin;普通网页无法读取无认证端点响应,避免信息泄露。
- 预检 OPTIONS 与 JSON 响应都会根据 allowedOrigin 设置 Access-Control-Allow-Origin。
sequenceDiagram
participant Ext as "扩展端"
participant Srv as "Agent 服务器"
Ext->>Srv : "GET /api/status/detail (无 Token)"
Srv-->>Ext : "401 {success : false, error : noToken}"
Ext->>Srv : "POST /api/pair (code, extensionId)"
Srv-->>Ext : "{success : true, token}"
Ext->>Srv : "GET /api/status/detail (Authorization : Bearer token)"
Srv-->>Ext : "200 {version, workdir, resourceUsage...}"
图示来源
- agent/src/server.js#L474-L548
- src/background/local-agent-client.js#L275-L329
- src/background/local-agent-client.js#L393-L443
章节来源
- agent/src/server.js#L242-L266
- agent/src/server.js#L474-L548
- src/background/local-agent-client.js#L393-L443
权限拒绝错误排查
包括文件系统访问权限、命令执行白名单和安全策略配置。
- 文件系统访问
- checkPath 对路径进行规范化、白名单前缀匹配、realpath 符号链接校验,并命中 HARD_BLOCKED_PATHS 直接拒绝。
- workdir 始终放行;allowedPaths 为空时回退为 workdir。
- 若路径不在 allowedPaths 或命中硬阻止,会返回“路径不在允许目录”或“禁止访问 Agent 敏感文件”。
- 命令执行白名单
- checkCommand 将命令拆分为多个子段,逐段匹配黑名单(deny)和灰名单(confirm)。
- 黑名单包含 rm -rf /、格式化、fork bomb、shebang 直执、管道注入 sh 等高危模式;灰名单包含 sudo、rm -rf、chmod 777、kill、systemctl、脚本解释器执行外部文件等。
- force=true 可跳过灰名单,但黑名单仍生效。
- 安全策略配置
- 可通过 config.allowedPaths 限制文件访问范围;RAG URL 导入支持 allowPrivateNetwork + allowedPrivateHosts 双闸策略。
flowchart TD
A["输入 path/command"] --> N["规范化路径/命令"]
N --> H["硬阻止检查"]
H -- "命中" --> Deny["拒绝:禁止访问 Agent 敏感文件"]
H -- "未命中" --> W["白名单前缀匹配"]
W -- "不在 allowedPaths" --> PathErr["拒绝:路径不在允许目录"]
W -- "在 allowedPaths" --> Real["realpath 校验"]
Real --> OK["允许"]
N --> Cmd["命令分级:黑名单/灰名单"]
Cmd --> Level{"level=deny/confirm/allow"}
Level --> Deny
Level --> Confirm["需要用户确认"]
Level --> Allow["允许执行"]
图示来源
章节来源
资源占用过高分析方法
包括进程树监控、内存使用分析和 CPU 负载优化。
- 进程树监控
- executor.js 维护 runningProcesses 与 completedProcesses,提供 getRunningProcesses 列出运行中命令的 execId、pid、command、duration。
- killProcess 在 Unix 下尝试进程组 SIGTERM/SIGKILL,Windows 下使用 taskkill /T /PID 递归终止。
- 内存使用分析
- /api/status/detail 返回 memoryUsedMB、memoryTotalMB、memoryRssMB、uptimeSeconds、cpuUser、cpuSystem。
- executor.js 对 stdout/stderr 缓冲区设置 MAX_OUTPUT_BUFFER(5MB),超限后截断并广播 truncated 事件。
- CPU 负载优化
- RAG 导入/重建后台执行,进度经 _reportProgress 轮询;搜索 topK 有上限 SEARCH_TOPK_MAX=50,防止候选集放大。
- 命令执行采用超时预算与延长策略:若无输出则尽快杀进程,避免静默挂起。
classDiagram
class Executor {
+runningProcesses Map
+completedProcesses Map
+executeCommand()
+killProcess()
+getRunningProcesses()
}
class Server {
+"/api/status/detail"
}
class RAGManager {
+_startRebuild()
+_ingestText()
+normalizeSearchOptions()
}
Server --> Executor : "查询运行进程/资源"
Server --> RAGManager : "触发导入/重建"
图示来源
- agent/src/executor.js#L93-L116
- agent/src/executor.js#L496-L568
- agent/src/server.js#L725-L749
- agent/src/rag/manager.js#L155-L170
章节来源
- agent/src/executor.js#L93-L116
- agent/src/executor.js#L496-L568
- agent/src/server.js#L725-L749
- agent/src/rag/manager.js#L155-L170
MCP 协议连接问题调试技巧
包括工具发现失败、远程服务不可用和协议版本不兼容。
- 工具发现失败
- McpClient.connect 会创建 transport、连接服务端、获取 serverInfo/capabilities,并调用 listTools 拉取工具列表。
- 若 toolsResult.tools 为空,tools 数组置空;前端需检查远端是否实现 MCP 工具注册。
- 远程服务不可用
- SSE/streamable-http/websocket 传输需要 url;stdio 传输需要 command/args/env/cwd。
- connect 失败会 disconnect 并返回 error 消息;建议检查网络、鉴权头、URL 可达性与远端日志。
- 协议版本不兼容
- client 声明自身 version;若远端不支持该版本或 capabilities 不匹配,listTools/callTool 可能失败。
- 建议升级远端 MCP 服务或调整客户端 SDK 版本。
sequenceDiagram
participant Reg as "MCP 注册中心"
participant Cli as "McpClient"
participant Trans as "Transport(Stdio/SSE/WS)"
participant Svr as "远端 MCP 服务"
Reg->>Cli : "connect(serverConfig)"
Cli->>Trans : "_createTransport()"
Trans-->>Cli : "transport 实例"
Cli->>Svr : "client.connect(transport)"
Svr-->>Cli : "serverInfo/capabilities"
Cli->>Svr : "listTools({})"
Svr-->>Cli : "{tools : [...]}"
Cli-->>Reg : "{success : true, toolCount}"
图示来源
章节来源
RAG 索引构建失败与向量数据库异常修复指南
- 索引构建失败
- updateCollection 检测到 embedding/chunk 配置变更会触发 _startRebuild;重建过程在临时目录完成,原子换入后再提交注册表。
- 若中途进程被杀,recoverInterruptedRebuilds 会扫描 .rebuild_* 目录,依据 rebuild_manifest.json 判断是补提交还是回滚旧索引。
- 向量数据库异常
- VectraStore 负责向量写入;若远端向量服务不可用,embedding provider 调用失败会抛出 RagError。
- 建议检查 embeddingConfig.mode(local/openai-compat)、endpoint、modelName、dimensions、apiKey 是否正确。
- 导入体积与检索参数保护
- INGEST_MAX_TEXT_BYTES=10MB、INGEST_MAX_FILE_BYTES=50MB;topK 上限 SEARCH_TOPK_MAX=50,防止 OOM 与性能退化。
flowchart TD
U["updateCollection(collectionId, input)"] --> Check["解析 embedding/chunk 配置"]
Check --> Rebuild{"是否需要重建?"}
Rebuild -- "否" --> Save["直接更新名称/描述/配置"]
Rebuild -- "是" --> Build["后台 _startRebuild -> _rebuildIndex"]
Build --> Temp["临时目录构建新索引"]
Temp --> Swap["原子 rename 换入"]
Swap --> Commit["_updateRegistry 提交新配置"]
Commit --> Done["清理临时目录/清单"]
Swap --> |失败| Rollback["回滚旧索引"]
图示来源
- agent/src/rag/manager.js#L349-L407
- agent/src/rag/manager.js#L434-L549
- agent/src/rag/manager.js#L552-L640
章节来源
- agent/src/rag/manager.js#L172-L300
- agent/src/rag/manager.js#L349-L407
- agent/src/rag/manager.js#L434-L549
- agent/src/rag/manager.js#L552-L640
依赖关系分析
- server.js 依赖 config.js、auth.js、security.js、executor.js、logger.js、search.js、rag/detect.js、rag/install.js、memory/routes.js、process-tree.js、mcp/registry.js、skill/registry.js、skill/loader.js、i18n.js。
- security.js 依赖 config.js 与 i18n.js。
- executor.js 依赖 config.js 与 i18n.js。
- mcp/client.js 依赖 @modelcontextprotocol/sdk 与 i18n.js。
- rag/manager.js 依赖 embedding/index.js、store/vectra.js、document/chunker.js、document/loader.js、searcher.js、security.js、url-guard.js、config.js、crypto-lite.js。
- memory/service.js 依赖 vectors、embedding-config、tier、fusion、tags、rag/detect、rag/embedding/index。
- local-agent-client.js 依赖 shared/logger/i18n/secret。
graph LR Server["server.js"] --> Config["config.js"] Server --> Security["security.js"] Server --> Executor["executor.js"] Server --> MCP["mcp/client.js"] Server --> RAG["rag/manager.js"] Server --> Memory["memory/service.js"] Security --> Config Executor --> Config RAG --> Security Memory --> RAG LocalClient["local-agent-client.js"] --> Server
图示来源
- agent/src/server.js#L1-L56
- agent/src/security.js#L1-L6
- agent/src/executor.js#L1-L8
- agent/src/mcp/client.js#L1-L7
- agent/src/rag/manager.js#L10-L28
- agent/src/memory/service.js#L7-L19
- src/background/local-agent-client.js#L1-L4
章节来源
- agent/src/server.js#L1-L56
- agent/src/security.js#L1-L6
- agent/src/executor.js#L1-L8
- agent/src/mcp/client.js#L1-L7
- agent/src/rag/manager.js#L10-L28
- agent/src/memory/service.js#L7-L19
- src/background/local-agent-client.js#L1-L4
性能注意事项
- 命令输出缓冲上限 5MB,避免长时间命令撑爆内存;超长输出会触发 truncated 事件。
- RAG 导入/重建后台执行,避免阻塞主线程;检索 topK 上限 50,防止候选集过大。
- 记忆召回将外部嵌入调用移出互斥锁,并使用 embedWithTimeout 与 backfillFail 冷却,避免一次慢请求拖垮全进程。
- 配置读写加写锁,防止并发覆盖;pairings/token 落盘前混淆,提升安全性。
[本节为通用指导,无需具体文件分析]
故障排查指南
- 启动失败
- 检查端口占用与 config.json 中 port/host。
- 校验 config.json JSON 格式与 memoryEmbedding.apiKey 密文。
- 查看 RAG 依赖检测日志;必要时重新安装 ai-helper-agent。
- 连接异常
- 确认扩展端已配对并持有有效 token。
- 检查浏览器控制台是否有 CORS 错误或 AbortError。
- 对远程 Agent,确认 ws/wss 与 http/https 协议一致。
- 权限拒绝
- 核对 allowedPaths 是否包含目标目录;workdir 始终放行。
- 对危险命令,查看黑名单/灰名单命中原因;必要时使用“本次任务放行”。
- 资源占用过高
- 通过 /api/status/detail 观察 memoryRssMB、cpuUser/System。
- 使用 getRunningProcesses 定位长耗时命令;必要时 killProcess。
- MCP 问题
- 检查 transport 类型与必填字段(url/command)。
- 确认远端 MCP 服务可连通且实现 listTools/callTool。
- RAG 异常
- 检查 embeddingConfig.mode/endpoint/modelName/dimensions/apiKey。
- 关注重建清单 .rebuild_* 与 rebuild_manifest.json,必要时手动收敛中断重建。
- 控制导入文件大小与检索 topK,避免 OOM。
章节来源
- agent/src/server.js#L388-L749
- agent/src/config.js#L107-L149
- agent/src/security.js#L109-L229
- agent/src/executor.js#L198-L386
- agent/src/mcp/client.js#L35-L127
- agent/src/rag/manager.js#L434-L640
- agent/src/memory/service.js#L174-L212
- src/background/local-agent-client.js#L393-L443
结论
Agent 服务的问题排查应以“启动—连接—权限—资源—协议—数据”为主线:先确认服务可用与端口正常,再验证认证与跨域,随后聚焦安全策略与命令分级,最后结合 RAG/MCP/记忆子系统的日志与状态接口定位根因。修改 Agent 源码后务必重启进程,确保新逻辑生效。