diff --git a/AI-Agent.md b/AI-Agent.md new file mode 100644 index 0000000..7cc739e --- /dev/null +++ b/AI-Agent.md @@ -0,0 +1,747 @@ +# EasyNode AI Agent 架构与时序 + +本文描述 EasyNode 当前 AI Agent 的实现架构、主要数据流、权限边界和关键时序。 + +## 1. 架构目标 + +AI Agent 不是由浏览器直接拼接历史并调用模型,而是采用“服务端持有会话状态、WebSocket 驱动单轮任务、模型通过受控工具操作主机”的架构。 + +核心原则: + +- 会话历史以服务端数据库为准,前端每轮只提交本次输入。 +- REST 负责会话 CRUD,WebSocket 负责实时运行、审批和中断。 +- 模型看到当前作用域和主机选择允许的完整工具集;执行模式与 Plus 权限在每次调用时决定自动执行、审批或拒绝。 +- 主机必须由用户在本轮请求中显式选择,空集合表示纯聊天模式。 +- 会话权限与主机策略取交集,且每次工具调用都重新校验。 +- 命令执行前依次经过访问控制、风险识别和人工审批。 +- 普通运维 Agent 使用独立 SSH exec/SFTP 通道,终端 AI 使用当前 Web 终端 PTY。 +- 工具调用、审批结果、风险信息和部分失败结果都进入会话与审计记录。 + +## 2. 总体架构 + +```mermaid +flowchart TB + subgraph Web["Web 前端"] + Entry["全局 AI 入口
ai-agent/index.vue"] + TerminalUI["终端 AI 侧栏
terminal-ai-chat.vue"] + SessionState["会话状态
useAgentSession.js"] + EventReducer["事件归约与消息渲染
agentMessages.js"] + Terminal["当前 Web Terminal
terminal.vue"] + end + + subgraph Transport["传输层"] + REST["REST /api/v1/agent-sessions"] + AgentWS["Socket.IO /ai-agent"] + TerminalWS["Socket.IO /terminal"] + end + + subgraph Server["服务端 AI Agent"] + SocketGateway["Agent Socket 网关
socket/ai-agent.js"] + Runtime["Agent Runtime
ai/runtime.js"] + Provider["模型适配
ai/provider.js"] + Prompt["System Prompt
ai/prompt.js"] + Policy["权限策略
ai/policy.js"] + Safety["Shell 解析与风险分类
ai/shell-lexer.js
ai/safety.js"] + DataPolicy["敏感数据与文件目标
ai/data-policy.js
ai/file-mutation-policy.js"] + Approval["审批网关
ai/approval.js"] + WriteGuard["写入预览与唯一备份
ai/write-preview.js
ai/file-backup.js"] + ToolRegistry["工具注册
ai/tools/spec.js"] + Executors["工具执行器
ai/tools/executors.js"] + HostAccess["逐主机访问控制
ai/host-access.js"] + SSH["SSH/SFTP 连接池
ai/ssh.js"] + TerminalDispatch["终端命令调度
ai/terminal-dispatch.js"] + SessionStore["会话存储
ai/session-store.js"] + Compaction["上下文压缩
ai/compaction.js"] + OutputStore["长输出缓存
ai/output-store.js"] + Audit["安全审计
ai/audit.js"] + end + + subgraph Data["数据与外部系统"] + AgentDB[("agent-session.db")] + ConfigDB[("ai-config.db")] + HostDB[("host.db")] + ModelAPI["OpenAI-compatible / Anthropic / Google"] + RemoteHost["远程 Linux 主机"] + end + + Entry --> SessionState + TerminalUI --> SessionState + SessionState --> EventReducer + SessionState --> REST + SessionState <--> AgentWS + AgentWS <--> SocketGateway + REST <--> SessionStore + + SocketGateway --> Runtime + Runtime --> Provider + Runtime --> Prompt + Runtime --> Policy + Runtime --> Safety + Runtime --> DataPolicy + Runtime --> Approval + Runtime --> WriteGuard + Runtime --> Audit + Runtime --> ToolRegistry + Runtime --> SessionStore + Runtime --> Compaction + Provider --> ConfigDB + Provider <--> ModelAPI + SessionStore <--> AgentDB + Runtime --> HostDB + + ToolRegistry --> Executors + Safety --> DataPolicy + Approval --> Audit + Executors --> HostAccess + HostAccess --> HostDB + Executors --> WriteGuard + WriteGuard --> SSH + Executors --> OutputStore + Executors --> Audit + Executors --> SSH + SSH <--> RemoteHost + + Executors --> TerminalDispatch + TerminalDispatch --> SocketGateway + SocketGateway --> SessionState + SessionState --> Terminal + Terminal <--> TerminalWS + TerminalWS <--> RemoteHost +``` + +## 3. 分层职责 + +| 层 | 主要文件 | 职责 | +| --- | --- | --- | +| 前端容器 | `web/src/components/ai-agent/index.vue` | 全局运维助手、主机选择、模型和模式切换 | +| 终端容器 | `web/src/views/terminal/components/terminal-ai-chat.vue` | 绑定当前终端主机,接收和转发终端命令 | +| 前端会话层 | `web/src/composables/useAgentSession.js` | Socket 生命周期、会话状态、审批、中断、REST 会话操作 | +| 前端事件层 | `web/src/composables/agentMessages.js` | 将流式事件归约为文本、推理块和工具卡片 | +| Socket 网关 | `server/app/socket/ai-agent.js` | 鉴权、任务互斥、创建会话、启动 Runtime、最终落盘 | +| Runtime | `server/app/ai/runtime.js` | 模型调用、统一操作分类、审批决策、工具循环、事件映射和超限重试 | +| Provider | `server/app/ai/provider.js` | 将不同模型供应商适配为统一 AI SDK 模型 | +| 工具层 | `server/app/ai/tools/` | 工具元数据、Zod Schema、权限过滤和具体执行 | +| 安全层 | `policy.js`、`host-access.js`、`safety.js`、`data-policy.js`、`file-mutation-policy.js`、`approval.js` | 权限交集、主机边界、Shell/数据风险判定和人工审批 | +| 文件保护层 | `write-preview.js`、`file-backup.js`、`remote-path.js` | 真实路径识别、完整差异、执行前快照复核和不可覆盖备份 | +| 执行层 | `ssh.js`、`terminal-dispatch.js`、`socket/terminal.js` | 独立 SSH/SFTP 执行或当前 PTY 执行 | +| 持久化层 | `session-store.js`、`compaction.js` | 会话 CRUD、消息修复、摘要压缩、Token 统计 | + +## 4. 两种 Agent 作用域 + +### 4.1 运维助手 `scope=ops` + +- 可以选择零到多台主机。 +- 未选择主机时不注册任何主机工具,退化为纯聊天。 +- 选择主机后向模型开放运维工具集;执行模式不删减工具,具体调用按目标主机策略重新判定。 +- 命令通过服务端独立 SSH exec channel 执行。 +- 文件操作通过服务端 SFTP 执行。 + +### 4.2 终端助手 `scope=terminal` + +- 必须绑定且只能绑定一台主机。 +- 历史会话不能跨主机加载。 +- 模型只获得 `terminal_command` 和 `read_output` 工具。 +- `terminal_command` 不创建新的 SSH exec channel,而是发送到用户当前打开的 PTY。 +- 当前实现发送消息时只附带终端连接和主机信息,不默认把整个终端滚动缓冲区写入模型历史。 +- 通过 AI 执行的命令输出以结构化 Tool Result 进入会话历史。 + +## 5. 普通运维 Agent 主时序 + +```mermaid +sequenceDiagram + autonumber + actor User as 用户 + participant UI as Vue AI Agent + participant WS as /ai-agent + participant Gateway as Socket Gateway + participant Store as Session Store + participant Runtime as Agent Runtime + participant Provider as Model Provider + participant Model as LLM API + participant Tools as Tool Layer + participant SSH as SSH/SFTP Pool + participant Host as 远程主机 + + User->>UI: 输入任务并选择模型、权限和主机 + UI->>WS: ws_agent_run(sessionId?, input, modelId, permission, hostIds, scope=ops) + WS->>Gateway: 接收并校验请求 + + alt 没有现有会话 + Gateway->>Store: createSession(...) + Store-->>Gateway: 新会话 + Gateway-->>UI: agent_event(session_created) + else 继续现有会话 + Gateway->>Store: getSession(sessionId) + Store-->>Gateway: 会话元数据 + end + + Gateway->>Runtime: runTurn(...) + Runtime->>Provider: resolveModel(modelId) + Provider-->>Runtime: model、contextLimit、maxSteps + Runtime->>Runtime: 计算权限交集并构造 Tools/System Prompt + Runtime->>Store: loadForModel(sessionId) + Store-->>Runtime: 修复/压缩后的模型历史 + Runtime-->>UI: turn_start(policy, availableTools) + + Runtime->>Model: streamText(system, history + input, tools) + + loop 最多 maxSteps 次模型/工具循环 + Model-->>Runtime: reasoning/text/tool-call + Runtime-->>UI: reasoning_delta / text_delta / tool_call + + opt 模型调用工具 + Runtime->>Tools: 校验、审批并执行 Tool + Tools->>SSH: acquire(hostId) + SSH->>Host: SSH exec 或 SFTP 操作 + Host-->>SSH: stdout/stderr/exitCode 或文件结果 + SSH-->>Tools: 结构化执行结果 + Tools-->>Runtime: 脱敏、截断后的 Tool Result + Runtime-->>UI: tool_progress / tool_result + Runtime->>Model: 将 Tool Result 送回模型 + Runtime-->>UI: awaiting_model / model_resumed + end + end + + Model-->>Runtime: finish + usage + responseMessages + Runtime-->>UI: finish + Runtime-->>Gateway: 本轮完整或部分结果 + Gateway->>Store: appendTurn(user + responseMessages + toolMeta + usage) + Store-->>Gateway: 更新后的会话 + Gateway-->>UI: session_saved +``` + +### 5.1 Socket 网关的落盘保证 + +`appendTurn` 位于 Socket 网关的 `finally` 中。即使发生以下情况,本轮已产生的数据也会尽量保存: + +- 用户主动停止; +- 工具执行失败; +- 模型流中途失败; +- 审批被拒绝或超时; +- 已经执行了工具,但模型没有生成最终回复。 + +这样可以避免“远端命令已经执行,但会话中没有记录”的情况。 + +## 6. 工具调用与审批时序 + +```mermaid +sequenceDiagram + autonumber + participant Model as LLM + participant Runtime as Runtime toolApproval + participant Access as Host Access + participant Safety as Safety + participant Approval as Approval Gateway + participant UI as Approval UI + participant Executor as Tool Executor + participant Audit as Audit Log + + Model->>Runtime: tool-call(name, input) + Runtime->>Access: resolveHostAccess(hostId) + Access->>Access: 检查本轮主机集合、主机开关并解析生效策略 + + alt 主机或能力不允许 + Access-->>Runtime: HostAccessError + Runtime->>Audit: DENIED + Runtime-->>UI: tool_denied + Runtime-->>Model: denied(reason) + else 访问允许 + Runtime->>Safety: 统一准备 effect/risk/targets/preview + Safety-->>Runtime: 分类结果与执行前快照 + + alt 风险级别为 deny + Runtime->>Audit: DENIED + Runtime-->>UI: tool_denied + Runtime-->>Model: denied(reason) + else 超出主机 maxEffect + Runtime->>Audit: DENIED + Runtime-->>UI: tool_denied + Runtime-->>Model: denied(reason) + else 不需要审批 + Runtime->>Runtime: 记录已授权快照/路径/脚本哈希 + Runtime->>Executor: execute(input) + Executor->>Audit: TOOL_CALL / EXEC + Executor-->>Runtime: result + Runtime-->>Model: tool-result + else 需要人工审批 + Runtime->>Approval: requestApproval(...) + Approval-->>UI: approval_request + UI->>Approval: ws_agent_approve(approved, scope) + + alt 用户允许 + Approval->>Audit: APPROVED + Approval-->>Runtime: approved + Runtime->>Runtime: 记录已批准快照/路径/脚本哈希 + Runtime->>Executor: execute(input) + Executor-->>Runtime: result + Runtime-->>Model: tool-result + else 用户拒绝或五分钟超时 + Approval->>Audit: REJECTED + Approval-->>Runtime: denied(reason) + Runtime-->>Model: denied(reason) + end + end + end +``` + +注意: + +- `deny` 是硬拦截,不向用户提供继续执行按钮。 +- `high` 即使在“授权”模式也必须逐次确认。 +- Runtime 是分类和审批的唯一决策点;Executor 只消费已准备的分类结果,并复核文件快照、敏感读取真实路径或脚本哈希等会发生变化的对象。 +- `run_script` 按实际脚本内容分类并复核内容哈希;普通静态脚本遵循当前模式矩阵。 +- 终端命令遵循同一模式矩阵:审查模式下所有主机操作需审批,其他模式按操作和风险判定。 +- 仅协助模式下 `normal/write` 且静态、单段、无重定向的少数服务生命周期操作支持“本会话允许同一操作”。当前仅覆盖 `systemctl`、`service`、`rc-service`、`docker` 和 `podman` 的明确 `start/restart/reload` 类操作。 +- 会话授权指纹包含工具、主机和完整命令参数;文件写入、终端命令、复合/动态命令、删除和 `high` 操作始终单次审批。 + +## 7. 终端 AI 命令时序 + +终端 AI 涉及两条 Socket: + +- `/ai-agent`:模型运行和 Agent 事件。 +- `/terminal`:现有 WebSSH PTY 输入输出。 + +```mermaid +sequenceDiagram + autonumber + actor User as 用户 + participant AIUI as 终端 AI 侧栏 + participant AgentWS as /ai-agent + participant Runtime as Agent Runtime + participant Dispatch as Terminal Dispatch + participant TerminalVue as terminal.vue + participant TerminalWS as /terminal + participant Bridge as Terminal AI Bridge + participant PTY as 远端 PTY + + User->>AIUI: 输入终端相关任务 + AIUI->>AIUI: 验证当前终端已连接 + AIUI->>AgentWS: ws_agent_run(scope=terminal, hostId, terminalContext) + AgentWS->>Runtime: runTurn(...) + Runtime->>Runtime: 仅注册 terminal_command/read_output + + Runtime->>Dispatch: requestTerminalDispatch(command) + Dispatch-->>AIUI: terminal_command_request(requestId, command) + AIUI->>TerminalVue: executeAiCommand(command) + TerminalVue->>TerminalWS: ai_terminal_command(localRequestId, command) + TerminalWS->>Bridge: 构造随机 begin/end marker + Bridge->>PTY: 写入 Base64 包装命令 + + PTY-->>Bridge: 命令回显、持续输出、结束 marker 和退出码 + Bridge->>Bridge: 过滤包装器和 marker,截取本次命令输出 + Bridge-->>TerminalVue: terminal_ai_command_progress + TerminalVue-->>AIUI: reportProgress(...) + AIUI->>AgentWS: ws_terminal_command_progress + AgentWS->>Dispatch: reportTerminalDispatchProgress + Dispatch-->>AIUI: agent_event(terminal_command_progress) + + PTY-->>Bridge: end marker + Bridge-->>TerminalVue: terminal_ai_command_result + TerminalVue-->>AIUI: Promise 完成 + AIUI->>AgentWS: ws_terminal_command_result + AgentWS->>Dispatch: resolveTerminalDispatch + Dispatch-->>Runtime: output、exitCode、durationMs + Runtime->>Runtime: 生成 Tool Result 并继续模型循环 +``` + +### 7.1 PTY 命令边界 + +当前 PTY 是交互式流,不能天然知道某条命令何时结束。服务端终端桥接层会: + +1. 为每条 AI 命令生成随机 token。 +2. 将原命令 Base64 编码,避免直接插入包装脚本时发生转义问题。 +3. 在命令前后输出随机 `begin/end` marker。 +4. 从 PTY 数据流中隐藏包装器和 marker。 +5. 只收集 begin/end 之间的输出。 +6. 从 end marker 读取退出码。 + +同一个终端同一时间只允许一条 AI 命令执行,单条命令最长等待 60 分钟。 + +## 8. 停止与断连时序 + +```mermaid +sequenceDiagram + autonumber + actor User as 用户 + participant UI as Vue + participant WS as /ai-agent + participant Gateway as Socket Gateway + participant Runtime as Runtime + participant Approval as Approval + participant Dispatch as Terminal Dispatch + participant SSH as SSH/PTY + participant Store as Session Store + + User->>UI: 点击停止 + UI->>WS: ws_agent_stop + WS->>Gateway: stop + Gateway->>Runtime: AbortController.abort() + Gateway-->>UI: stopped + + par 清理审批 + Runtime->>Approval: AbortSignal + Approval-->>UI: approval_cancelled + and 中断普通 SSH 命令 + Runtime->>SSH: kill/close exec stream + and 中断终端命令 + Runtime->>Dispatch: AbortSignal + Dispatch-->>UI: terminal_command_cancel + UI->>SSH: /terminal 发送 Ctrl-C + end + + Runtime-->>UI: aborted + Gateway->>Store: appendTurn(已产生的部分消息) + Gateway-->>UI: session_saved +``` + +Socket 断连时还会: + +- 中止当前 `AbortController`; +- 清理该会话挂起的审批; +- 清理终端调度请求; +- 清理该会话的长输出缓存; +- 普通运维作用域主动释放使用过的 Agent SSH 连接; +- 前端将仍在运行或等待审批的工具卡片标记为失败,避免永久转圈。 + +## 9. 上下文加载与压缩时序 + +```mermaid +sequenceDiagram + autonumber + participant Runtime as Runtime + participant Store as Session Store + participant Compact as Compaction + participant Model as LLM + participant DB as agent-session.db + participant UI as Vue + + Runtime->>Store: loadForModel(sessionId, model, contextLimit) + Store->>DB: 读取完整会话 + DB-->>Store: messages + compaction + Store->>Compact: 估算未覆盖历史的 Token + + alt 达到上下文预算约 70% + Compact->>Model: 生成旧历史摘要 + Model-->>Compact: summary + Compact-->>Store: summary + splitAt + Store->>DB: 保存 compaction(summary, upTo) + Store-->>Runtime: compactedNow + Runtime-->>UI: compacted + end + + Store->>Store: 修复孤立 tool-call/tool-result + Store->>Store: 按完整轮次执行硬裁剪 + Store-->>Runtime: 摘要 + 最近原始消息 + Runtime->>Model: 发起本轮 streamText + + alt Provider 返回上下文超限 + Runtime->>Compact: 强制压缩,保留最近一轮 + Compact->>Model: 生成应急摘要 + Model-->>Runtime: 压缩结果 + Runtime-->>UI: compacted + Runtime->>Model: 整轮重试一次 + end +``` + +上下文策略: + +- 默认上下文预算为 64K Token,可由 AI 配置中的 `contextLimit` 覆盖。 +- 估算达到预算的约 70% 时主动压缩。 +- 正常压缩保留最近三轮原文。 +- 厂商仍返回上下文超限时,强制压缩并仅重试一次。 +- 摘要以 `{ summary, upTo }` 单独保存;原始消息在硬上限内仍可供前端查看。 +- 单会话硬上限为 200 条消息或约 1.5 MiB,裁剪只从完整对话轮次边界进行。 +- 中断导致的无结果 Tool Call 会补充合成错误结果,防止后续模型请求因消息不配对返回 400。 + +## 10. 权限模型 + +### 10.1 执行模式 + +每次操作统一分类为 `read | write | delete`,风险分为 `normal | high | deny`。 + +只有能够明确证明只读的 Shell 命令归为 `read`,明确删除归为 `delete`,其他静态命令默认归为 `normal/write`。因此新增普通 CLI 无需加入安全白名单;动态构造以及明确命中的高危、永久拒绝操作仍受负向规则约束。 + +| 预设 | 普通读取 | 高危读取 | 普通写入 | 高危写入 | 删除 | +| --- | --- | --- | --- | --- | --- | +| 审查 `review` | 主机读取审批;本地元数据自动 | 审批 | 审批 | 审批 | 审批 | +| 协助 `assist` | 自动 | 审批 | 审批 | 审批 | 审批 | +| 授权 `authorized` | 自动 | 审批 | 自动 | 审批 | 普通自动、高危审批 | + +面向用户的模式描述为:审查模式下所有主机操作均需确认;协助模式仅明确只读的操作自动执行;授权模式自动执行未命中高危规则的操作。永久禁止的操作在所有模式下始终拦截。 + +### 10.2 主机策略 + +每台主机可配置: + +```js +{ + enabled: true, + maxEffect: 'write', + maxMode: 'authorized' +} +``` + +最终生效策略: + +```text +生效 mode = min(会话权限模式, 主机 maxMode) +写入和删除仅在 maxEffect = write 时允许 +``` + +多主机会话展示工具并集,真正执行时按目标主机重新判定。 + +### 10.3 Shell 分类收敛 + +Shell 安全策略采用开放式授权模型,不维护“已知安全命令白名单”。解析层先拆分命令段、参数、重定向、管道、包装器和嵌套负载,分类层统一返回: + +```js +{ + effect, // read | write | delete + risk, // normal | high | deny + category, + reason, + targets, + traits, // recursive | force | bulk | dynamic | sensitive | external | hidden | opaque + hits, + segments +} +``` + +判定规则: + +1. 明确具有删除语义的操作归为 `delete`,包括文件删除或移动源、`truncate`、包/账号/数据库/容器/Kubernetes 删除等。 +2. 只有静态且能够明确证明只读的命令归为 `read`。 +3. 其他静态命令,包括尚未登记的新 CLI,默认归为 `normal/write`。 +4. 变量、命令替换、`eval` 和无法静态确认的解释器代码归为 `high`,而不是因为命令名未知而升级。 +5. 复合命令逐段分类并取最严格的 `effect` 和 `risk`;`sh -c`、`su -c`、远程 `ssh` 命令及 `systemd-run` 的静态负载会递归分析。 +6. 镜像名、包名、URL、文件内容或普通目标中的产品关键词不会改变风险等级。 + +因此 `future-cli deploy app` 这类未知静态命令表现为:审查、协助模式审批,授权模式自动执行。新增普通 CLI 不需要补安全规则,只有新增的明确高危或永久拒绝机制需要进入负向规则集。 + +### 10.4 风险边界 + +| 等级 | 主要类别 | 行为 | +| --- | --- | --- | +| `deny` | `dd`;文件系统格式化/擦除;块设备直接写入;根目录或关键系统目录树整体销毁;fork bomb;递归锁死或完全放开关键系统目录权限;核心凭据外传;Base64 等隐藏载荷直接交给解释器执行 | 所有模式永久拒绝,只允许向用户展示原始命令和原因,不得自动改写、拆分或绕过 | +| `high` | 敏感读取/写入;强制、递归或批量删除;SSH、防火墙、网卡、账号和提权变更;关机重启;包卸载;数据库清空;容器强制删除、清理和卷删除;Kubernetes 命名空间或持久卷删除;动态/间接执行;文件外传;下载后执行 | 所有模式均需单次审批 | +| `normal` | 未命中上述负向规则的静态读取、写入和删除 | 按执行模式矩阵处理 | + +该分类器是防误操作护栏,不是恶意命令沙箱;真正的权限边界仍是主机策略、目标主机集合和 SSH 账号自身权限。 + +## 11. 工具清单 + +| 工具 | 操作类型 | Plus 策略 | 执行通道 | 特殊规则 | +| --- | --- | --- | --- | --- | +| `host_list` | read | 免费 | NeDB | 只返回本轮显式选择的主机 | +| `host_status` | read | 免费 | SSH exec | 返回结构化系统状态 | +| `script_list` | read | 免费 | NeDB/脚本库 | 返回内置和用户脚本 | +| `run_script` | 按内容判定 | 写入/删除需 Plus | SSH exec | 按脚本内容分类并校验哈希 | +| `exec_command` | 按内容判定 | 写入/删除需 Plus | SSH exec | 经过统一 Shell 分类 | +| `read_file` | read | 免费 | SFTP | 敏感读取需审批 | +| `write_file` | write | Plus | SFTP | 默认备份,高危路径展示完整 diff | +| `list_dir` | read | 免费 | SFTP | 返回类型、大小、权限和时间 | +| `read_output` | read | 免费 | 内存缓存 | 回读被截断的工具输出 | +| `terminal_command` | 按内容判定 | 写入/删除需 Plus | 当前 Web PTY | 按实际命令分类 | + +工具规格是模型 Schema、System Prompt 和前端能力展示的共同数据源,避免多处声明发生漂移。 + +### 11.1 文件与脚本执行不变量 + +- `read_file` 在审批前解析真实路径,并同时检查请求路径与真实路径。敏感读取执行时必须匹配同一次工具调用批准的真实路径。 +- `write_file` 仅接受绝对路径、有效 UTF-8 文本和最多 256 KiB 的完整内容;权限值只能是 3 或 4 位八进制数字。 +- 写入前读取原文件并生成完整替换 diff,快照哈希覆盖主机、请求路径、真实路径、原内容、权限、备份选项和新内容。执行前重新生成快照,任何变化都会使原授权失效。 +- 覆盖已有文件时默认创建 `${原路径}.bak.`;同一毫秒或并发碰撞时追加序号,并使用 SFTP 独占创建,绝不覆盖已有备份。 +- `run_script` 只执行脚本库返回的原始内容。Runtime 按实际脚本分类并记录 SHA-256,Executor 执行前重新读取脚本并校验哈希。 +- Executor 不重新解释不可变命令,只消费 Runtime 已保存的 `effect/risk`;仅保留文件快照、敏感读取真实路径和脚本哈希这类 TOCTOU 复核。 + +## 12. 长输出与敏感信息 + +### 12.1 长输出 + +- SSH 命令单次最多收集约 2 MiB,超过后标记为截断。 +- 工具结果超过约 8 KiB 时,返回头部、尾部和临时 `handle`。 +- 模型可调用 `read_output(handle, pattern, offset, limit)` 分段回读。 +- 临时输出缓存默认保留 30 分钟,最多 200 项,并在会话断开时清理。 + +### 12.2 脱敏 + +普通工具结果返回模型前会自动脱敏。高危读取经过用户单次批准后,真实内容会发送给当前 AI Provider;未经审批的意外凭据输出仍会脱敏。核心凭据的明确外传命令直接归为 `deny`。 + +长输出 `handle` 与创建它的会话绑定,其他会话不能回读;存入缓存的是当前工具调用经过脱敏策略处理后的内容。 + +## 13. 模型与运行配置 + +运维助手与终端助手共用 AI 设置: + +| 配置 | 说明 | +| --- | --- | +| `providerType` | `openai-compatible`、`anthropic` 或 `google` | +| `apiUrl` / `apiKey` | Provider 的 API 前缀与凭据 | +| `models` | 允许在 Agent 中选择的模型 ID 列表;OpenAI-compatible Provider 支持从接口获取候选模型 | +| `contextLimit` | 模型上下文窗口,默认 65,536 Token | +| `maxSteps` | 单轮最多模型/工具迭代次数,默认 25,服务端上限 50 | + +Provider 层将三类服务适配为统一的 AI SDK 模型。请求中的模型 ID 必须位于已配置列表中;未显式选择时使用列表第一项。 + +## 14. 会话数据模型 + +`agent-session.db` 中单条记录的主要结构: + +```js +{ + _id, + title, + scope, // ops | terminal + hostId, // terminal 会话绑定主机 + hostIds, // 本会话主机集合 + modelId, + permission, + messages, // AI SDK ModelMessage[] + turnMeta: [ + { + createdAt, + usage + } + ], + toolMeta: { + [toolCallId]: { + tool, + effect, + risk, + riskReason, + riskCategory, + targets, + approved, + approvalScope, + approvalCached, + denied, + sensitiveDisclosure, + durationMs, + failed + } + }, + usage, + compaction: { + summary, + upTo, + createdAt + }, + createdAt, + updatedAt +} +``` + +会话列表接口只返回摘要字段,不返回可能达到数百 KiB 的 `messages`。完整历史通过详情接口按需加载。 + +Agent 会话不按时间自动清理,仅支持用户主动删除单个会话或清空会话。 + +## 15. 接口与事件协议 + +### 15.1 REST + +| 方法 | 路径 | 用途 | +| --- | --- | --- | +| `GET` | `/api/v1/agent-sessions` | 按 scope/hostId 获取会话列表 | +| `DELETE` | `/api/v1/agent-sessions` | 按作用域清空会话 | +| `GET` | `/api/v1/agent-sessions/:id` | 获取完整会话 | +| `PUT` | `/api/v1/agent-sessions/:id` | 更新标题、主机、模型或权限 | +| `POST` | `/api/v1/agent-sessions/:id/fork` | 从指定问答或回答创建分支 | +| `PUT` | `/api/v1/agent-sessions/:id/messages/:turnIndex` | 截断旧分支并准备重新发送编辑后的消息 | +| `DELETE` | `/api/v1/agent-sessions/:id` | 删除会话 | + +### 15.2 客户端发送到 `/ai-agent` + +| 事件 | 主要载荷 | 用途 | +| --- | --- | --- | +| `ws_agent_run` | `sessionId?`、`input`、`modelId`、`permission`、`hostIds`、`scope`;终端作用域另带 `hostId`、`terminalPermission`、`terminalContext` | 启动一轮任务 | +| `ws_agent_approve` | `requestId`、`approved`、`scope` | 回复审批 | +| `ws_agent_stop` | 无 | 中止当前任务 | +| `ws_terminal_command_progress` | `requestId`、`output`、`durationMs` | 回传 PTY 命令进度 | +| `ws_terminal_command_result` | `requestId`、`output`、`exitCode` | 回传 PTY 最终结果 | + +### 15.3 服务端统一发送 `agent_event` + +主要 `type`: + +| 类别 | type | +| --- | --- | +| 初始化 | `ready`、`session_created`、`turn_start`、`pending_approvals` | +| 模型流 | `reasoning_delta`、`text_delta`、`step_finish`、`finish` | +| 工具 | `tool_call`、`tool_progress`、`tool_result`、`tool_denied`、`tool_requires_plus` | +| 模型等待 | `awaiting_model`、`model_resumed` | +| 审批 | `approval_request`、`approval_timeout`、`approval_cancelled` | +| 终端 | `terminal_command_request`、`terminal_command_progress`、`terminal_command_cancel` | +| 上下文 | `history_repaired`、`compacted` | +| 生命周期 | `session_saved`、`aborted`、`stopped`、`error`、`stream_error` | + +## 16. 关键实现文件 + +```text +server/app/ +├── ai/ +│ ├── runtime.js # 单轮 Agent 编排 +│ ├── provider.js # 模型供应商适配 +│ ├── prompt.js # System Prompt +│ ├── policy.js # 双轴权限模型 +│ ├── host-access.js # 逐主机执行边界 +│ ├── safety.js # Shell 风险分类 +│ ├── shell-lexer.js # Shell 词法解析 +│ ├── data-policy.js # 敏感读取路径分类 +│ ├── file-mutation-policy.js # Shell 文件变更目标提取 +│ ├── write-preview.js # write_file 完整差异与快照 +│ ├── file-backup.js # 唯一且不可覆盖的备份 +│ ├── remote-path.js # 远程真实路径解析 +│ ├── approval.js # 人工审批挂起/恢复 +│ ├── audit.js # 安全审计 +│ ├── redact.js # 输出脱敏 +│ ├── ssh.js # Agent SSH/SFTP 连接池 +│ ├── terminal-dispatch.js # 当前 PTY 调度 +│ ├── output-store.js # 长输出缓存 +│ ├── compaction.js # 上下文摘要 +│ ├── session-store.js # Agent 会话持久化 +│ ├── plus.js # 加密后的 Plus 变更工具实现 +│ └── tools/ +│ ├── spec.js # 工具元数据与 Schema +│ ├── index.js # AI SDK Tool 装配 +│ └── executors.js # 工具执行器 +├── script-library.js # 内置/用户脚本统一读取 +├── controller/ +│ └── agent-session.js # 会话 REST Controller +└── socket/ + ├── ai-agent.js # Agent WebSocket 网关 + └── terminal.js # PTY AI 命令边界协议 + +web/src/ +├── components/ai-agent/ # 全局 Agent、审批卡、工具卡、会话列表和模式切换 +├── components/common/ +│ └── chat-sender.vue # 运维/终端助手共用输入框 +├── composables/ +│ ├── useAgentSession.js # 前端会话与 Socket 状态 +│ ├── agentMessages.js # Agent 事件归约 +│ └── agentTools.js # 前端工具能力展示 +└── views/terminal/components/ + ├── terminal-ai-chat.vue # 终端 AI 侧栏 + └── terminal.vue # PTY 命令发送、进度和取消 +``` + +## 17. 验证覆盖 + +暂存区实现包含以下自动化验证: + +- `server/test/test-ai-safety.js`:三档模式矩阵、Shell 复合命令、嵌套负载、路径变体、文件目标、高危和永久拒绝规则。 +- `server/test/test-ai-access.js`:主机隔离、纯聊天模式、Shell 转义、审批指纹、终端取消和执行步数上限。 +- `server/test/test-ai-data.js`:敏感路径、脱敏、写入预览、快照与唯一备份。 +- `server/test/test-ai-session.js`:消息修复、会话 CRUD、编辑、分支、持久化和用量累计。 +- `server/test/test-ai-compaction.js`:Token 估算、摘要切分、主动/应急压缩和上下文超限识别。 +- `web/test/test-agent-messages.js`:流式事件归约、工具卡、历史还原、回答重生成和不同事件来路的一致性。 + +常用校验命令: + +```bash +yarn workspace server run test:ai +yarn workspace server run lint +yarn workspace web run test +yarn workspace web run lint +yarn workspace web run build +git diff --check +``` diff --git a/server/app/ai/plus.js b/server/app/ai/plus.js index 6da74f1..afd1dd1 100644 --- a/server/app/ai/plus.js +++ b/server/app/ai/plus.js @@ -1 +1 @@ -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 \ No newline at end of file +U2FsdGVkX1/tVsvga6pvd9es/Iik8LoXjXpAwqLC1LS0EknwN25gqEOAYjOyfGM/jsIljdHhKi6c437r9Eb+u0FkhpxoxiApdIj2qLfNbI9xIBoSXmBy9Z5sJp7zYqbLJkClf56G85CbKCkkPAmpkvdfpYE/iJW5CsiJD8IAVn1ijWskyayyB98AmrnfFSdiUcpnFHZ8VyGjgfrZRnQ8bkuud7XoETqK5LR+MtsfeEAUpWKYMx89GDoZAQ7phYYrvp+y8Z6Nc8acXJHAMgE1Mdp42WlsWbh9qAlZ1OimndmiXwZ6QtEg2/X6faP8YlVA5gbJLhpSoyANXGT4gmeH9aEUI0fXk4E61l80ZBzSoHqi9hSebXCJaSA8jJAKQ7nILDPnfoJk4KCcRGnRFcKC8eJnSEqRUxVcb2EU8yTLL7q/sI21N0NIZHtv31tGsD1W/3P5jA1xrEHIm6DDbZZOPnl8+H3BNHrMgDDzb5nU760hpCTfuoHO5CTlPTF/PUsKxpiBwCibGr0n02yniGtZAcbf4+3G9kpa90NfnO5d+Ix5M/WOenVNCTq2sOLvXQYTWQ2Gs/RwBFm7RWrHmDGMqwLf3xeyYxHpcmSDVnF4FE2aTuBc/72L0GgRrrYQXot6vK8o0tN+sCb+2wTBwu070iMh/MCX1fPcdZuldQmtGySpv6J94EbESq5kjXmx0ubWZAKBkL4kKoJja1x6uFW7CU90J764NmjNrf9xp42+A1wAgQcGWXGtjUf2n0oTBSdYep3PM6wBjjVXG0VmxKpqpCpBPn8C1Mu25f9V/gcJcgkZ82vR8HhzpaOPRad5wryl9hl766BTrMgF0vu6OSr3NpfdmKRKn0XkUBWB+sYVkfwVunOrNGb5zfX8oOiE2eEM2lvEMg1JQaJS4OpAvgDUtnaWBKnDr07YCAFhfO+ctJxkreYWRBZ9SFcT8wTu+66PTpnbNu40HZs2HSKwNh6+zoKOVkPy38Rft+BDdzi3COLkq8+M2IJdYNTQaksH8HK38JCc+CiWvuN7OaNW9DsFdsKTd6mDWBPu/nbiHDKP7RGQQM60E11jVkhYB4DArvrmqybWZfjY1V7YTvTqoRyxufxuIsvHreL3uJJV9lXP9hg21GgXD4m4xGEdQUIjOhz8ZWpsUjOFD27pQKJpHks+7f9rhtL+Il9me07SE4ZbXEXtBoEgumU8BgkwjYuyaDIJDcNeanwUYzYbhofQayt0+REKLSwKCExXEzELx4W4ljJa2cvlLybAKA8boI0Dnt0hh7d9PuvzettutY3mBCXMVi2bOgcPUecH2+hFystaDOf3O8uFvSSOIlYL/BsRSKc12LSPizqHJ22UU2jvy8WQivyTrCAZzgwUwtZ23CiTtfvmQDEe13FPwg9+25nmT5K1qjLUB0OLl5sin7nFAI72Ex3yvx1yaIPMz+bWzpbr+pBNw2kQI0GI44dtdLd8pOLtP5ACdCSNtvL6K3eW9Mds7+U21vqzCRmRQ7FfYkI03hSAnvYc6QTzVYkuFPhzOk6r3oOeJc4wDeEQNr0y0ZLzWODtnjtJFzjsyBpqd29ARapqexxKJc8EVc0bT4Sdace7xyKCb1qYSsOnMuLMMZznJKe727IF3ZTWXfzxO+MFFRS7wz/83kY+RyAU7m3c2npdYakgsAZ7ZFs+NqfhOpHKGQnc8+ax8ELUKhDEhRzVt0UFFVlLqWtVpNF3jh9kN6IENSPyou8+arCR+nYyB6ON30sGcjuep0WRH3yY3YWmIjDhOdE8jgfZEZG8VOZf25vNls4J7dC1U4gQj+qMYCy8GDIPBzi52DQq6LO4o8b87jvgvOqcxp7Qcw1zFDmpvEROTSq7pFjzGjmj+FSf8DiOyk4aX80OPOYzcz3pyiVF42LWYlYhSYOhFtTo4xSjZ9K6xiwpH2Jc3LtkD9ky76bW6MwVzNERwAF3mBAZTh6dAQCbHtVcHYcFjYaP1ZM70MVx4EpjXapCs9ZwjagopL6+sjWzZ3v8TF3cJScERedzQJgxz9QFvxzq2w96+nAyyDB4lQykfLK3vIR84QCraNk/DI8WjU1IPIUImSSgm8ODM7hNb8gf+SZbEnWBoPmCihwuobeuFwMZhsEo7G0mI/gSDn2TkOdgGPOSParGzw0YVYz/JSQufzQQJmWpgHBYyXtuGcgpYG2LWwayU1z+Qm0Ps9e5PaSXWXxkz2+eKHPWyZnpdbOfowfYQLgeQ84F8tVB+QCbl2pyaIFK6GHWyN8Q2QCrs3BX89Z6m9YrZO8e/1Wc1bNRlqdk55O7LvetBtpA8LeSIBhtRxs2loHNorFJosp2/pDysXAawiqqreGaebzNZWsv1V+AUpNRMJuwPmxQbC5P/VQ0TkAoUBodEaOkAxz7ldVI19AfilbTbXLdLLCftxCW9+ltEaiAriLD0RKDiooyldoiVGyVgr9zDNQag/6a9KkOQQmUCGw68KBVXym8+TFk2GrJFxfn9K2iT7P8YBFCRui4/vi7vYcvBzToYdJMJqq2fYpHGnB779yIOerG/yGflI0SxDBOiNBD6wpXj3QVxkDmLon9OSjJy7XtybW/dicUtJ5dcYnlIHjyChATRvNqIkfk3e48Nu07XNSey8W8MKfMmHPnBSVzbPnLnt2cNwFpATS41eir+D3Q72HF2loFNQoE6ArgezDOyOWIdJQyGWBA2QRrkAUlpe2adGH92uO5Ve/y3Kb9vi1W9g5JaJBHSJxhEzl1VF8J2LroGs3b1aOaR/LjNpZFbMGmNuUt/kSf1AY9P1OnRDs85MmxvuJjdekkvrkg+Z9f5G1KzqVCPDL6WAlg5rGOG21ULeTX2yqwcW7Qzi3l3goHZKVKM9bIbA9gR3See2ZHdnPOxgVpqOPlfi3kVxwHFvrjW73jIzLMoWe/glhq0KewX8z7f9/7moqlxcU5I876NFGoMaa+qN7VxyEt+XDC5iKNxDZXv8MNU/NAu9S6M30wC31RCW9nHxnHqN7pOcYco+V0qD3OXejf5mD4WlzGGvhWl0+pVia/ril5vgZ9WadZ1lw4lXcHzsS5CNZQhwxz4r/22LHbbi/3Y926/D96WE4P5VW6NGYit5iCngYvQLitdc7AwAl1STEtgK11HFvijQ0XPBE0wPFgTdwo4Q6I5qrdKC2KsfAGmNafEsTnoHFhBSB/0iDtExPx+85mLwsubGCmZj0531TK2w780e6gu7VagHhen9OOV1oR6TVwbU8IQv/UdAJJKaSqj4n9ccJPYsALYd7Cs/3JSVphNzBYgp7elwBIW58EM54iSd3Me5waXqH3F3/fMtZ8qMpxsE17wZk/3kQGFhXyl3uYvOiyUy040evrRYXzAtZiUm0YO+7iU1SBVgAMCwpMlaxjDRpZmhCoWGMXYaoYD2QGlwVy+0xliSv69vL/2TfRFh1yKTcXig75AnLiWHBMKaTUpO17/o4GHsQZzhUKPqniDI9tdxW7u7DeaFLAAdoEp856CtFfadC9vTePNobjpJpjvBSx+xaQEp68I9Mk5rBC2pgj4M5PB4bOo9rMoXK/zjMBFMrPZXq9Jc2fKIhysLWVx6iRpRE5PlNqcY4k0QWj0RvLEP/zwG8zil8YERLP4qrAG2sayjd+xVKo5tpqlKBHoSI4K/bgfscyqQu4dUKlIaiAsmqnVJykirnJtO6432UmdWx5TwiCLtX3ra7ShnOiJB97eO1MqzdG2ZOW8+XJv3bXGC9I/pzFTC7gKW0dBQP/ItpyvPZN1fPlQeJfPN3PXX/JqNthxcM4iNjYhYvo1oJp5nGtLx/s7mP6nSklbME+vZSHks6Fvgpkirh6A4cEgFwaZjgctHdN/BaUOR6IDAzmb3ogFIE/tJ4QSv5dfiGI6eYi/Py8vhBeenfQd4El/SJy/6zFsMjeDQM04/djim8V8IRy1Nxd9LPJ3Ymz6vugAp1IuCJ+1n7CpsWFfVEI7n+XlTbez5b50JJgyTI1fbZTLDlD+drmh+iKY9nH7eV6ne6EPMB6I3l/fimg4hgLNLLR1HhiUGNu+kd07I6mi1LSGphtnxnNxs1+R4hPlHzIbEFLZLm3VYhVAJVjaQYDGtErA6zgsaAu298ha/SnA70Tgw8qCd6H0rewX9A6Hw3phlTn/4cHP7v/IDM0Q3i4uACkWSwdlyzb2qqe77UhgF+c9AeIR1yKUb1a+3x1sXmSlbAz8omCTeE4mX97pcq3eJiYCx89+y7j4OBbNmtP8dhMXiwgqo8VY53sRjlHr5V8HivRhS4LRaIv5re0HgUyjuXiMs32WGwXnGabTU97HFsz6fb/rwpPpSFlYJkwsdzacPfgABRGDgKA27Lm0C1xW6zb+vcGDIk+6+MHKOdkWj9qHI+a76wVB/87m38XDZLHRV4jTnNmcTDh1m4dN2XU8ipC8MJRIaj0IP/oGsDrEkSnVQyfBz+VHwGLHzXbue1dnY08izlIlJZBdrb89VEfUoIBF58dQEKGMB0Uo2A9zSIdwdju+88WbEyJ6VFvs5C4/w7xVviEEVomMP+KXE0rUGX0v3y63meoq9DMAfv2Co8qOxm/vAoOTL26xyeGtCVHQoypN/apB87QRiKRoXi5sfhvOK8vaRp9vresmgErtdgC1J1UjkOgqADg17iMIrhpMiQLLA6uLo0IjSnxzLoYe8n9BwNuUhb+RJbOBbMo1HggK7oFMWB8A5OrhuWW6TuUTWPKdLlXskkJa+6NAFaG2L9aadP0dOHrj6LVmYyDqz4p4gLhAK4Mx6xmkxGFy/bAAf7OnHamIdcE3BxKJbf5MT+XHl+erpd6fe6KAPogx+R+ZDpyNRU+C2o3zewQMGPUnIpVDHfsXthJTW0Go59PHDOU0MWHllPviQE8DdJT95zuZ1+xVAKS8CfwtDLSXtx5/ZjctOKrx0VCMDYtJxQAm+KTpgL8ymbBcDaqkDq2MSniFoKXu6aNiw75k4hH5NrWIsjoorTduhws9MntXWDKGN26Q8xw23/RvStpklEnVjKzqFJzO/iXoZqf39MI75Vgjmr2VE7HBcQ4sGJeQjJ/9pY/NReHY+E0WV31uAm8MJX9hXduFn36cH0P7d/MoMHz9KUSOvZ3Zhj7IGSnsDTnTuaas/e0ZZS99UHmSAPcgQdxLQORaPVsGCAUIKUBPqlx4rjEQrBQS0rbDhwAsA9/tOomW6Bs0CTENrgMq6YaI3zf3l4JxdnULf4ah1+zaLrhP2uXXXnTw4AY+HnSsYOc8r3E2pDRon43pz9pRjECyLs3KOMRWzLNC64jDurgOo1OLoTIJRsc7PRtnjoqMMCZXf0wf1MTBokqrkHh6RKO+Hmstj/PQYnbikQkTFXmr3636OzvIq6NSCs9V/gHmMgE2LLiZ89xs7f13+D9aiJdMZeBrteX65rTjUYkaFKR5wDyJPVl3lv8S99iMDCT7B3glUOcVqblg0/krvZk+kYM8MF8m1ClWZQLVzB8AXXH90wDXw6ELzB8uI2AW/TU5L3rI43xtAnP1stdfe85K8hSH1pthL2FcS5N2BMGwTZOcYQttLCqkgy7WMV+9PKUtpZ+ABGdXgOWT2Qlz3T8VUBIkP0/NhDUJ/KB98JoZ/GsF6Az6oMFtEsU90M+NBjD8DjVKQcpU2dSKbZ/cgqJOhk3ccGjTaId555Z/20zabHFj7MBLKtD5ejRUT1EG0N6tRtjqwea9HQUsU2aBZSXl74SbLMaOrIwhtQ2sr5lfekYjA9PaNau0nT+FoGUj2TeWuB1qLldahScA+8Au9tSbx/tsnfetATrC+m6Vt/NbW4/oXOrrwHJlK1LOHDiBE2nCoYZVhfGQOLLvy7+6ArSsX1h8jnt7ZwXDRmKFJPTy+QIzxuGmTYw3dNsM79VftgMuwyT1i+ByHnKy+15TXZeSKU03+ax/oI2oIZEXKNX4cjCJVNk0c1B/LEQs3gnTT8OjdFccBuXd0TuAZ/QdwYNYUwEL07m9zqI7cTXuepRLxJjHpSm7MO2LN9wglCgakixCcCMuRW0iPh+6H0N45YP516GGMWiQizbqR4zFd9M3ooTwHzqMkgBs1+Y9kMF2vPMvJxcuRuTtMXmRXsLX+Sr4Dm1RPZMdf0xw42uEIT1DQVtB+GCkwiBuAgE9QQFSDDZJwYLKwTLWnRApek7wOZZYJ8XY6o0QTncSpik0D6xzRXW3N585d11hZBj1SCd3IpjMZagq/AupQ1aUo1shOoxkJ/y8c6o3pvJSbfivfq0iMnak9GmR4JdClJgjC2zEETaqIL/1WCTZ9wZzskgqrQujt8q3QzYm/c0JGoxIQu5A7eIxPkp8/Tp/ttupcedubQ5RPNudjhNCvoCHouDsT+5h5sGvluzAlRZrY/5xlqzBovYEYvIkrc9/WDn0xmcsIrsw5udFuckQQJTo4N/47pfnT8pAF2CkkvSL1Dejq7RMIjjxYH/yLjE/jJ8aIhxXjn55KND0Vat/JpvjKbhC4imDjWtmggsqg8aoKu9BYMT2N3g4hQ/rm2q2gRPZ/JUnJyCic/4+mYqxnDW5ljWa1DA5pbqsVMVFFknC641rVM0huQbfjmGpp/jfM/9e2E3pmtcnJjnyndDoOQOScZPEFdWny8vRaWUFe80dtr0EDwx00Hrmh3FpY/Be/7WqBiMFYLfG7NYgfr9gf5TteHUz16YQNO5Qwrr2/tkYBRMHxkrwUByJTxUv47RShGNqxl5GdU3QeeqnnN+QMeOL6ITAlGquxoBcVKcdXhEm/j3Gd2+kDPysmG+j7voJutCUu14uw636/UsqhMq+Y0/5FgyGCud55Nf93RUU5SzqXcFDJjJNIcuoKy2dK0beHFhMqFalPC7CYWT6yiW79/moD/0FyqyK57/4Vx7+GV+z7FMm6ZQczHghgSXWAO6ZeIBSehwscg2XCkQJIwddUn48rYFCrUvs1KN+1lR1OkwjSRBezJ8OFSzAuKlXylebChkau4oAYiWkCoKMkApcW7i7RMyXxXRd37Dn11Ju7F8TdThyjl2V4zYQwBQg0ccrh4CkkaoNDjgYoocBqdzThMCBP21Q813CjsI3xD2lb5Wosi8gSQ/oYwzYeOASQ5wlT9MuPiyt0dnMeB2uwOLpPLeCGxgj8sF/24cHHV6GwI6qXjXR0V9OjCT3anrmE20GF4WlWi7eBECv/jZSjxWV5fgThUoPR79BntAOZ4qen9oy1lEzOLenlhjIonmbiqjxqnddQUXpy2ovtDwpR0GzN9U5qzuuO+eFS/1KVUQbMRTZaLqLBbRzEBJ7DddEV44+QpvdLrX0b5wuJp+NGYMurYqoAzv9AeKI9zZ2l8/R2/t+EouwXSfWeziXKWDKmeDvzvY1zzPdB2vjoT6hVyHHtwy3Aa0keVD7W/yPd8LTEVuOl+JKoo5afi50g9YwogriZ1lBDsSbitehoDgrwFgm4UNvpVLuOJwgJXha7+DSpyF6/oFz30X6pf7iVxGWB+UVh863P+HKlBwRHrahTtBL9XYW3zxL+InpCvghaobNvG8YVpyNWL+hVigifYUtdDtkOA5UMhMsWviEHA1uf3iVHQ9BqaVFGEv7GS1IfMfTAzZdhhK/Gwg4WF4dCqKLtbbCbA78N0pwNlo9cUR/3s0tD8A3aKnG+juxE5W5hPJOThcpkOMPLraegeNNniHGQe0iVVwYAQCJRGVZnriamUWoCVvZKQErY4dRbFHOJzzgmgrno5OEG8pDNaaw0/eBHzU9LZVyiKHzGmV1BeaQJ2W5QoEV0UcroOteRomeEhIS7+uyyQrq45qzCuXXuH8uZlz70v8MwLvuB+Li5IzxnilfzsyUWsxK4NHbrrGjM6foAwW1j3fa//Vekuzr6h4l7NGO5YAqiRVnyNOzf1GZs6LYTICX4f4UOf1QnvcQCNW5YJDiecYI0IQILULd2FmokV103DWmXWJt/axx7iKwJKG6OoG3OasXQg8a9VDtEtNbnPm2Bc5xY7Qeqp+dILSP6QYeZYW+xuh2nrhBgOVY3O4osHYovA0jAynsYIjnzlb2/vh8kfTkEZeGcrvyqKJTJs1wOnHpfHP+tvl2nuPsbJNpP0bJQEXsfi3ARoHC1y+ezU210Xx4WAKzWlu+d+zEGmsL//IUU3HtNaOUYMsDq08xTRJkAomoysBADG8LM8BHE9f+qeeqWBlgIUvpfosLhhovrIV8VJmLQspjTOCoZCjHTaSjbljwnNhhq7WtfT5BjWO1ZF/ZtoragWdiWzam9lHjaDzjx1HoJfATsSKb6uQMDp5tLeI101ibEB7PXF7WemWTuLXToU0/1nWq+gNlXTMxoiXYY4LlfXahjJosHPZmgmEm4+MXjc3HRgRGg/ucvVx0GlulTeYKJrSEgHIqPjCENgsOjEv0Oa98PugCozBZOiwgTzHq3i1pTASnquWuq2J+ssgvcS4O8J49yR1Yo0JvZNO2LKL427quY6/Wt10ceg5VThK3/AaxlwjpyQWQdiLBvWKLwYH4yuKqk3Jkz+c4vI4XxJxzjXQXAVbAMyqKvLka5vcv/59b6RSfW6cOThsIXuVy78GFkbNdIoSTQFf7ZgO9JfftJIQe/PajKqic+hC+KMRbfMhdQ2f79BsgFEyePpB4j2v1gybJpJ6QPVoTgMJs7fJuyThs2DSEGL15KkA1eVu9dIUdGTlO+972QvDtwtGIZAZaOVy2NoIE+//4xJV9UQXrCbDzFCzzUbcSmHFVXMc8eyYt28u7AOnZ2nFrO1aR44axA/w8KwgaSmm28x/wjeYyFYmlUakeSn76nMaGKu4Mt6ZzH1Olcp159Mpfp0XGk27zZIt74f0Twssqotloh1hxuYMKhSROTCQZSJ+Oo5aAckjv+LFk5zvKO6MXhYg3PwLwwknY4cz20v1dSPIq+XllX5frHGtPVT8qyDHltHcxZ9LF0ZG5PaHkGm6rD1JorfM8CODXZL9LBALqvdlFNUpKW2FTbK81rFudUwWXvGlNQHJrKFoRhOy9STniOp0IVXnRQK6hb6Rc1gprfsuz2A94nuk+pSytiJTL8pHmyu96T/4gxu3L0gfDu3hJe0x7NHIhpKTO/b3lpR74LwRDgXYbsDEd4kpQt2/k0AnQeST5XR54Fc5Ui1PdbghZyCB8TJTYwdqk1Yb8D3JobKEIdE3o9xyvG8z8ZgaVI2rI0QggiM6MOfhNsApUgP98cCrI3OL5KAwGmph6cgCV3RV1AEo0ifgDwwTV29TEmwv+fiN89eIPQJ5DOTjWmQmxXW4lnjeoxpeP0NdIv65ZPE2cFdW+n+Y6NHy0J1u9OWKDB5MeVg3hz7CRVcXZF+EyCE6xEYLPP+gOmW7KHsMFYB2trWTBB+CxSIegGWeg/K/IbJYR95Kp/c6KjPO8DtrCjXRSXLxrU4SFkfdn9Oujf4uettGLaO0zx7AfcX2mE9ovq2DlzzBKilWR5y7AIjO5biFRDudzv5hOMEiM5+Y/w0HcjHL1pS0Y042XFDQHJPI5i/JjkBbIymwO2qxItWjvtm6oVLUZwqVKjbkZMWC0wXbYjlS0eNq4/JZ1SZwLSnIQCoFtcjRIfg6g2710lvs18jQleXcIdYpDqR4fOP7cEYxYiVcCHU6JdQDYk5xzg+HmBn7irR+PaC2fxS07mvEh76aztOunqK99z3fm1kPQQZY8ncUICg3DEupmwYIFzJpyVuyDgFcsVJ/pFtcX/TVxJBFZHnmMBCf7RE9z1Imf+UBLeoGkRsg8DM/DfAo71I8hLwbxWr006PLnyYmHLfuiow6B+krinAYsazQd4N/LaIGQQzwAGFuVbrsXrTuy5Dx1g/cPNp/4Yhc/Gagzu+Dz0Ap/FPyQiIhRxQN2DP2DBagVhomGBrdjb957ySnZBpC2xiclzZnGxG+Fr0+dDt+nhLJSSRK1TmzecTLUv9OR91oECFVLs53EdfKhsPDnhuRoJyTaVkw3wcV1hmi0hDEN+zeN6zrXQS+Prv0W4KUBWwgHJdnDJIQ/jB7R3RYYBvSOtHNVK+QlBlBA99b6ewFBeNgvGzhKs2q1mbwHsY/Ixf0RhsMf/Oct1rexs0Sp6EjSx5uRGG0Y/1yLGTNzbb1NYaRC41GiVbLg+R3SOGCNJy8ncghxdJtLo+84hf9aqP4lp0LGsQtWxhKLWBfTj3xL12zj092sg5j2BFScwkc8r4nzwCiwQpEuvriOKvtXLlqTk1pFIbN9yUM//yMFfXaQKJ9lTnrt1+9XK8SIrfFFVp87jJwerBMUNdmV/XkjexAw50uZFAMAzh1pzz0gULioXe+rYEWQP01NoY2bUBt99sg2gLWR5TfioPj3k55bgphdEfk12cbnwxu/zLSKObYBEvMA9ntnSWJN9wsOor9NrBZgTbcYzsyy76oTFMAsLwqflMep0yi9rgSUwDITqgmBlg4SkfZp9YnjszBxltR2uPwKduSPgwrlR9mZOG94ItLXPH52ugb2Gwap1oZARIOC8lckw1Cr4YlDLyvYqVmaKH9yKpZuEXmyd1zL+zS4laKShH2/64yD534sm6gO41GnV1RHCgnQTqAuXtLZq9vzb39pD2KSIYmGlj7AR7V0AGH2uyQLICxPjmD8G0FAnjoB+9ZhlzYGwgAzInkMUc1SbMOPh7E0dvvdLqCTJ54+WJS9+avKqpitcloseaTaIKmPMzeISbre8ws9DPpDHsWakshzRFdWRBfMPP944ynB4O8tVU+E2KW2VonJ0W0gGjBb2n5GXfPbfIBYh1lgIB1ZV04lkrBYPRK1igzAinxda9dzazbOTf8B5w5rpQ9qSTpBVF3KTwvsbPTmVaDdvQ/W2Yx372HrHDXL3WM8HkWHfNtelLSvSiKzjwod/9L9lbnA4f3k/hOezGgD10EHnFTVXzfk/widg1YrKk7Kd/Gl7UivR7ehDQelRSQcyIMTIDpNNwi0marb+g8zMld1+mPj7KHDGnx/JZSLgKJJ3OW/bo8wefVZ0OyFURrEtb4P1Hv4MJ9wXUai/IW3JSpocte3mFlro7bfIkUYHx1K+VQzu1zkts/5C16lGmNaLlSWCuVqEWKnpyjv1inOnz+0A73zZIOEFZB857gM9TriaXEsZDrqSNnclqyoQ4Sc61TUsqetrg7iqHZXLJDXC00EnYz4OPEc3DteJXUL81FMJfIAbhhF6JVXctY8yMVCRv5ZGPQz8ppDsIlpdm1pxu/8v4uWJeewcV/vx+FY9vyBR6d5MsrboXrpe1afeSX7MLJ/hOv7W6uI/nyufYJGAJDjCpV8JamPFpcBv/ENrvssV8SKl//OTyvZV3B/H+oHqWfgxRq8Z/VyvpPyzIRz1BVUEnnt1e1NzV3v6JZ5en0z2hyJne40F/Qzgta9HsqnGiJw1OwKJABeM1ArkybxCv4oZDdOGcVVHMU0Cn9apGqEKP6aXd4J1xvlNPocKwyLdnrO2in8lRdxWF2ythpNrJ68Ko9OM3nV8s0z4FP+8uEGDLLRp++k+wRhdQu+u8Qixg9NnQ9hUxKftimd9Jkq90Q+zYEQBOF0FJmYbuMYTfND1RzhxHWleDMP9Shi+wJN8x34PJv7eOL3z5aXDStQMMEQwVMSvEaPQugZwvNF5Pz9WCjP6jy5A693fqhLSEVGBixc2J/wLC4120E5bwsksjmmvUIxAKBQKJGKHKnOVQRlpc4cotHXPViSokej2enZwKfSxbOsnrOzRnW8LaBqExSF8K1SNMp5nF2TBhBmKggw1fslI8z0yyiLSs/tYTaCIOFktUvMEhRPIsHWRujPzKKeizZJbaQa6qxXjL8duQJBdD/7RxwhmWium7XvggkEFKYf+gVtZD1uiw3Tz6KR0zmJaDQKhwjNBC7BzE9Rclov89UqQ9W5mBykPIV0DzxjFFHjRt23FJjlDDYyq7fodGlCk5WZ1U5hSrCk+Y0BHonQ2bGfBZQWtZxzCbFsHawnEog+2BtJJFv4yELxSv/TfZzcKOD4n6pzoCWS7UCmYun5Vko7pO8Atml4UcHAVu1SVSrO7wVATqu850SaOwj4BGxDyKoGoP+cc5pQyMFBalGDNG0n+TMYRyrKDnUA3hLQgBJx5acS6eRDy0z20B8aBC/bxcFvQ8wfDjtCEONY85b5x66MHRVUU810sd00ArXO4jZlCCt046ysDSFTRdx+yiRWhaMspB/e+JbMbVpqm0UTwBVtnZdcmYh/hdt8Cs73vpwpIoVZoK+sm4VnA9KBfEgwQ2WoQntcp+s67OMrJT76gk8tJu+kmxCkkY6fNd8SkoHefxCbLdGHdOXjbpwdKs9IWh1kXN0CG568gfDX0OMkYBkkGe3Z1zjchH89GWIYvVNIe+KwQ8AV9wHPGO7C9aqno3YkVSxDYvuObsulOk0snqWZ0B7mKFP8rSgmPd37BeyOlRwH2h2+04pct+Y/TAbq/6GKW7wFmv85WZbBj6Ip0DhdSfoGflDMmTOknwWzoUUxvci4jDyKRj18TAEsaUHCjntWHldssdli/OC3B1ncNxov7Piy+frwg2uIk14Bstl7vqFKDht1+uXHPvhY65PCO7+TdZUFHjFX2fVbvbsuP/tgQzDM5OZIzQhlSA5gXovcBDBFJybfuvdHnzS5/lZH3gF9RocyUzSZY+tMFdNtKzYhNfTUYHoENWpsWMk6U4J0Ip8L+OkokVQT9eWabdHpeJqsUqas8NZMll1JBNTOR25e65xBO1m0R2J22GB7ROwNbODreijeZA7J1p/xYJXChYBimJUgsPdkPE5fX4x6qszF6BLd1Tco11WNdUdfMs/hG+2tqPrkmk5ppl2qa9xvhdYX51uHJIM4z2I7rVJnbXalIdwXEoQkDeHPOEUrqXXMVJr0Be5NX0I6QKD2ZUdUrKvZAKoS3+zRtLknzEC4OsCCqDFuLI8eEP0BEd0PmHNCtDtrUkFGqsquyMKBtdhVz2Q+ZgLk2egOkrVTePLnvZfRC7FEMPxse1S3zf9Q0vqAxAh6cU6+ehhyKc6mvjR98i57hsjWjy42NzOZ68bfhvplMrlFyVpMknFupUBNOsuL6LmS5D9qecQeyYQFQW523qtsv6EM9ul0HtuEGtF28wjx4u697Pr60fnApKoN6FmwOZn8SAc8xZYzAmHuTGcBfxY5UbEzv/ellR/Ti3pJwSIKmfDTKe/mS0pwZX8+bjje2UJe6vixJ+wIU8iXNrnJnDM8a8SNLyq0jQ+ksIMTNGYEm+nSKzkA9vh+072hcT1hc6Rm0kfBsFRr8euvw1IgUr4M1sUR1L6NSkqZRh0HNgUx3/KBKaDLhKPwXavpFhOChKYQ4mgCIEUmA4i48gK6aE4sSevKK+nvcupgcZFVQcCu6q+Uedpurh+xRQDTAJrbUCJkOx1v8hON+vatw5W+TqSsthUINGnXKmJ3euWCUesCkj2KShOSInvofEcABNWylEl18zvscGWqQQAwWTDEzvinL73k/WHPX5PxgDPjNq9Nbt+NcfL9elXqw94SeEkzKKoRb06tpnF8kCxuwbGRtJHELhGt3uUI1VSNpiYNaIEFW77KAATa0Pgo6Ppi5O5jQ7eFWyTMO/h5Tm7Bjrxa5ppHNtrEUuqiCZjLznz9qGzHDkXI7l0NbniXP19y7CfYr8m/aErPslo/Y0DmRb3hbMXFI+fEH0zNFehsg4LP9FEixIHjtTF1I09GdQnoP9tPu+2Tv8PSUee2eBzQC0sALwzf+GugMHLLKByRZIICEp68ABtL0igzUpM+BQm9uHaBpVCb9p6uPBQ4oeTrVKy/XCvWLGAd5OxDj9wW7oyhyH5mz+rdC7TFy0LOyaa4+sZqhLphaSSaBE5smVQqsc3+HLteByBOVXmcKl8J2rgDt6WbkAGnv7Tpf93FfW4uDC2JhWo7W+SKX2EYMDHWNZa9tOOeO2HFoIpi72PVHN9ujzEE5Kw2lWWCpdtyAdAaJH1XoRNNEWFG7XITcRtpOpUg3rTNZtW7YD4apmj3QvgFLNjPWCbsEXmvRNpQn8gYkKfIdSNpJn5f0UoPZdlS44l2dL6kEzAAljMRn9lW3a/7CZuzbhz27ZJXFyNgBgE3ftmqoQGuPb/chAc+IMLRUiySD7t9vZXffQuYROjP4nMoXl8R0NNMV33nAGZBHYHrxBK/r/QST2ARqbTIhkpVJn1ytvUT+iTLHjt8JS+P8oC6GcTSPE8p7V7Kgf1pUA0tgDno5vii5fgy94Ov0/nc9q6YrDmw/y8MoOgUzlGkPvEkUa9vsqPXl63yHC2jCcg2wPo+DilaCMMol7siZ2xuIqLf1AGdi4RIgkx+qU898Y1SUnXzRGsKKEp3b90Zr1diqFnoF89LRzSw0eVbcCFViBYzttqFYlgh/pRjOxloyZqquhUQzXzO9jpZTgz2018fYoUvY4VA+KEL37WMFQe4w/I7Crt6lA3+AxHepy0XefrZJKKj3B1GmbPtjkgM957wFm+o0oqVho2PDadvM5Kba61ggO2qFwHI1lBbDiOnnkTnF+qFtOUplH0vf2CyqGUF7/Lbc8fBCaEufTjkWTvpS3p21v2krcNSWw/u1rnjwTkXr0cDbVNpM4Gi3C4YLr8cPhWnZmBbYotLCc0gUKi7E4I10ep+SwCqgOt5871PdHW9y3xi3WGC1eK7HFvmMxUfO3TPsrXpaZcFlBy4GMfcfPv/RVbXoPxZ02gwIjzwxKiWSKH6oBvRVaN9vDYOFOGue5JDYcDoInMF1rk4zrwqjbCxIQ/qXNO0J17VEWF6oBixHzdMPx9ry1OjX0c7sSTpXYcXzcxeppPadbkPPtPZTq7Nf1kK+1RfhJeEEVP+0qYbzlSubHOxbi2qc/carF6DgqbPYKnIy/62JKH0fDgtfnXnED+UhDOq3zDcWY6TPjBV+KoaQzKYs2WmaxaeuMAhll9a3K6BFGm4wRF3jD7i++icH0hpLOQLajZV+te9OWaM+4mEjNTiXNepsF0mvqnBzBnW6RgyTj/ioxLrsV7y5NXPw3sixvHv0/dkE+vTlSZKoRPJRu7f4qfezZk/9Ui4MMpxKK5z7UbXM4Fy1SQfI6xUyWOZhzyr4Zbz8aYUP7MxpseJ7XZCPOKON9LYGTFtZPShGnl6cQ10g0lhaa150RzAQkC7f3htKNFSOyuwc4gqAkBP20J5phqWzDe68j8CbaIzvzcTwevAuFnM3vVcy1OiRxD8Ua84/t3VDyR4qcP9nMIh0OOBzB6grMAMO4wJjdzknBffQw/hojKItB8DmxFmRutBlh47KzHtZXN7NZ+oEh5IYywlVy2UeyGak3YfmYB2F9WRhYQ72RKZr1yiRitSk9eVr6RqPNQYFsoeYWIiUxYTkg4CUFB+ZmhVbcJrHpF74uWsGCP0tsDpVWkpFHN/CNv4LU= \ No newline at end of file diff --git a/server/app/controller/plus.js b/server/app/controller/plus.js index 9a4ca4a..87f5f2a 100644 --- a/server/app/controller/plus.js +++ b/server/app/controller/plus.js @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/server/app/socket/plus.js b/server/app/socket/plus.js index d59a409..d1205e0 100644 --- a/server/app/socket/plus.js +++ b/server/app/socket/plus.js @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/server/app/utils/tools.js b/server/app/utils/tools.js index e9216fc..5d96b06 100644 --- a/server/app/utils/tools.js +++ b/server/app/utils/tools.js @@ -1,11 +1,11 @@ -import { exec } from 'node:child_process' -import crypto from 'node:crypto' -import os from 'node:os' -import net from 'node:net' -import iconv from 'iconv-lite' -import axios from 'axios' +import { exec } from 'node:child_process' +import crypto from 'node:crypto' +import os from 'node:os' +import net from 'node:net' +import iconv from 'iconv-lite' +import axios from 'axios' const request = axios.create({ timeout: 3000 }) -import { plusServers } from './plus-server.js' +import { plusServers } from './plus-server.js' // 为空时请求本地IP const getNetIPInfo = async (searchIp = '') => { @@ -416,7 +416,7 @@ async function requestWithFailover(path, options = {}, timeout = 5000) { } catch (error) { // 如果不是最后一个服务,尝试下一个服务器[防止异常报错] if (i < plusServers.length - 1) { - logger.info(`Plus服务: ${ i + 1 }/${ plusServers.length }: ${ server }${ path } 请求失败: ${ error.message },尝试下一个服务器`) + // logger.info(`Plus服务: ${ i + 1 }/${ plusServers.length }: ${ server }${ path } 请求失败: ${ error.message },尝试下一个服务器`) continue } // 如果是最后一个服务器,抛出错误 @@ -438,7 +438,7 @@ const timingSafeEqual = (a, b) => { return crypto.timingSafeEqual(bufA, bufB) } -export { +export { getNetIPInfo, getLocalNetIP, throwError, diff --git a/server/package.json b/server/package.json index a9ed046..414f433 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "3.7.1", + "version": "3.7.2", "description": "easynode-server", "type": "module", "bin": "./bin/www", diff --git a/web/package.json b/web/package.json index 9f20ddd..5cd6eda 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "web", - "version": "3.7.1", + "version": "3.7.2", "description": "easynode-web", "private": true, "scripts": {