
1. 项目概述不是“塞进去”而是“有机融合”——AIO Sandbox 的真实定位AIO Sandbox 这个名字乍看像极了那种把一堆工具粗暴打包塞进 Docker 容器的“大杂烩”项目。但实测下来它根本不是这么回事。我花了一整天时间从零构建、调试、跑通全部流程再反复拆解它的源码结构和运行时行为结论很明确AIO Sandbox 的核心价值不在于“能塞多少东西”而在于它用一套统一的Agent Runtime 协议层把浏览器、Shell、文件系统、MCP 服务、VSCode Server 这五类原本彼此割裂的交互界面真正拧成一个可编程、可编排、可审计的单一执行上下文。关键词不是“塞”是“融合”不是“容器”是“沙箱”。它解决的是当前 AI Agent 开发中最让人头疼的“上下文撕裂”问题——你让模型调用 Shell 执行命令它却不知道当前工作目录下有哪些文件你让它打开网页截图它又无法把截图结果自动存入本地并通知后续步骤你让它用 VSCode 编辑代码改完之后怎么触发测试这些环节之间没有标准的数据通道全靠硬编码拼接一改就崩。AIO Sandbox 就是为终结这种“胶水式开发”而生的。它不替代 Chrome、Bash 或 VSCode而是给它们装上同一套神经接口让 Agent 能像人一样在同一个认知空间里自由切换“手”Shell、“眼”浏览器、“记忆”文件系统、“协作伙伴”MCP 服务和“工作台”VSCode。适合谁不是给终端用户装个“全能浏览器”的而是给 AI 工程师、自动化平台开发者、安全沙箱研究员这类需要构建可控、可复现、可审计 Agent 执行环境的人准备的。它不是玩具是生产级的 Agent 底座。2. 核心设计思路为什么必须用 MCP 协议作为中枢神经2.1 传统方案的三大死结与 AIO Sandbox 的破局点我试过至少四种主流的 Agent 沙箱方案基于 Selenium 的纯浏览器沙箱、基于 tmux webtty 的 Shell 沙箱、基于 VSCode Remote 的 IDE 沙箱、以及用 MinIO REST API 做文件中转的混合方案。它们共同的痛点我总结为三个“断层”协议断层浏览器用 DevTools ProtocolCDPShell 用 PTY 伪终端文件操作用 POSIX syscall 或 HTTP APIVSCode 用 Language Server ProtocolLSP和 VS Code Extension APIMCP 服务则各玩各的 HTTP/gRPC。Agent 模型要同时驱动它们就得写四套完全不同的适配器维护成本爆炸。状态断层Shell 的当前目录、环境变量、历史命令浏览器的 cookies、localStorage、当前 tab URLVSCode 的打开文件、光标位置、调试状态——这些状态彼此隔离Agent 一次决策后状态无法跨组件同步。比如模型说“把刚才网页截图保存为 report.png”它得先告诉浏览器截图再告诉文件系统保存再告诉 Shell 检查文件是否存在三步之间任何一步失败或延迟整个链路就断了。权限断层浏览器沙箱默认禁止访问本地文件系统Shell 容器默认无网络VSCode Server 默认不暴露端口给外部调用。传统方案要么全开不安全要么全关不可用缺乏细粒度的、按需授予的权限模型。AIO Sandbox 的破局就是用MCPModel Control Protocol作为唯一的、标准化的“中枢神经”。它不是发明新协议而是对现有 MCP 规范v0.3做了深度工程化落地。MCP 在这里不是“另一个 API”而是定义了所有组件必须遵循的四层契约通信层强制所有组件Browser、Shell、File、VSCode、MCP Service通过 WebSocketwss://api.xiaozhi.me/mcp/...这类地址连接到同一个 MCP Router。Router 不做业务逻辑只做消息路由和鉴权。能力层每个组件注册自己支持的tool列表格式严格遵循 MCP 的 JSON Schema。例如 Shell 组件注册shell.execute和shell.list_filesBrowser 组件注册browser.navigate和browser.screenshotVSCode 注册vscode.open_file和vscode.run_command。Agent 模型只需调用tool_call不用管背后是哪个组件在执行。状态层MCP Router 维护一个轻量级的context_state对象所有组件在执行tool后可选择性地向 Router 提交状态快照如{cwd: /home/user, tabs: [{url: https://aio.dev, title: AIO Sandbox Docs}]}。Router 将其聚合供后续tool_call的context字段引用。这解决了状态断层。权限层每个tool调用都携带permissions字段如[filesystem:read, network:allow]Router 根据预设策略JSON Policy 文件实时校验。比如shell.execute默认禁止rm -rf /但允许ls -lbrowser.navigate默认禁止file://协议但允许https://。权限策略可热更新无需重启。所以AIO Sandbox 的本质是一个MCP 协议的 Reference Implementation 生产级 Runtime 环境。它把 MCP 从纸面规范变成了可安装、可调试、可监控的实体。这不是“塞工具”是“建标准”。2.2 为什么选 MCP 而不是其他协议技术选型背后的硬逻辑有人会问为什么不用更成熟的 CDP 或 LSP答案很实在适用范围窄扩展性差。CDPChrome DevTools Protocol专为 Chromium 设计虽然强大但 Shell、文件系统、VSCode 都不原生支持。强行适配等于给每个组件都写一个 CDP 的“翻译官”架构臃肿且无法统一权限模型。CDP 的Runtime.evaluate可以执行 JS但fs.readdirSync这种 Node.js API 怎么映射没标准。LSPLanguage Server Protocol专注代码分析对浏览器操作、Shell 命令、文件上传下载毫无概念。它连“打开一个网页”这个动作都无法描述。自研协议我们团队去年做过 PoC三个月内迭代了七版最后发现协议设计最难的不是功能是生态兼容性。MCP 的最大优势是它已被多个主流 Agent 框架如 LangChain、LlamaIndex、OpenHands列为官方支持协议工具链如mcp-serverCLI、mcp-clientSDK已成熟。AIO Sandbox 直接复用这套生态意味着你写的 Agent 逻辑今天跑在 AIO Sandbox 上明天就能无缝迁移到另一家基于 MCP 的云服务上。这是商业项目最看重的“可迁移性”。提示MCP 并非万能。它不处理模型推理本身也不提供 UI 渲染。AIO Sandbox 的前端Web UI只是一个 MCP Client负责把用户操作转成tool_call发给 Router再把 Router 返回的tool_result渲染出来。真正的“智能”在外部模型AIO Sandbox 只负责“可靠执行”。3. 核心组件解析五个模块如何协同工作3.1 Browser 组件不止是 Chrome是“可编程的视觉器官”AIO Sandbox 的 Browser 组件底层确实是 Chromium通过 Playwright 启动但它绝不是简单地开个chromium.launch()。关键改造点有三个MCP Tool 注册它注册了 7 个标准tool包括browser.navigate带wait_until: networkidle参数、browser.screenshot支持full_page: true和clip: {x:0,y:0,width:100,height:100}、browser.fill支持 CSS selector 和 XPath、browser.click带button: right和click_count: 2、browser.get_html返回 DOM 字符串、browser.get_cookies、browser.set_cookies。每个tool的输入输出 Schema 都严格匹配 MCP 规范确保模型能精准理解参数含义。状态同步机制每次navigate成功后组件会主动向 MCP Router 提交当前 tab 的url、title、ready_statecompleteorinteractive和viewport_size。这些数据被 Router 存入context_state下次screenshot调用时模型可通过context字段引用viewport_size来决定是否截全屏。安全沙箱加固禁用所有危险 API。window.open()被拦截并返回错误navigator.clipboard.readText()需显式permissions授权fetch()默认只允许同源请求跨域需在tool_call中声明permissions: [network:cross-origin]并经 Router 策略校验。实测下来即使模型生成恶意 JS 代码如while(true){}Playwright 的page.evaluate也会因超时默认 30s而终止不会拖垮整个沙箱。注意它不支持chrome://内部页面如chrome://version这是 Chromium 的硬限制与 AIO Sandbox 无关。想查版本用shell.execute调google-chrome --version更可靠。3.2 Shell 组件不是裸露的 Bash是“受控的双手”Shell 组件是整个沙箱里权限最敏感的部分AIO Sandbox 的处理非常务实双层隔离第一层是 Docker 容器的 namespace 隔离--cap-dropALL --security-optno-new-privileges第二层是 Shell 进程自身的chrootseccomp-bpf过滤。所有系统调用都被白名单过滤openat,read,write,stat,getdents允许mount,clone,execveat除/bin/sh外一律拒绝。这意味着unshare --user或pivot_root这类逃逸手段在启动阶段就被 kernel 拦截。MCP Tool 设计只暴露 5 个高危但必需的toolshell.execute执行单条命令。关键限制命令字符串必须是 ASCII禁止\x00等控制字符timeout参数强制存在默认 10s最大 60senv参数只允许覆盖PATH和HOME禁止设置LD_PRELOAD等危险变量。shell.list_files列出目录内容。关键限制路径必须是绝对路径且必须以/home/user为根chroot目录..路径被规范化处理杜绝路径穿越。shell.read_file读取文件。关键限制文件大小上限 10MB二进制文件如.exe,.so只返回前 1KB 的 hex dump防止泄露敏感信息。shell.write_file写入文件。关键限制目标路径必须在/home/user下且父目录必须已存在不自动创建内容经过utf-8编码校验。shell.get_env获取环境变量。只返回白名单内的变量PATH,HOME,USER,SHELL$PS1等提示符变量不返回。审计日志每次tool调用Shell 组件都会生成一条结构化日志{timestamp: 2024-06-15T10:23:45Z, tool: shell.execute, command: ls -la /tmp, exit_code: 0, stdout: ..., stderr: , duration_ms: 12}。日志直接推送到 MCP Router 的审计通道可供外部 SIEM 系统采集。实操心得别指望用shell.execute运行 Python 脚本。AIO Sandbox 的容器里只装了bash,coreutils,curl,jq,python3仅基础库。想跑复杂 Python用vscode.run_command启动 VSCode 的 Python 插件或者把脚本内容通过shell.write_file写入再shell.execute调用python3 script.py—— 后者更安全因为python3进程也受 seccomp 限制。3.3 File 组件不是 FTP是“可信的记忆中枢”File 组件是沙箱里最“安静”但最关键的模块。它不提供 CLI只通过 MCPtool与外界交互统一文件视图它管理/home/user目录下的所有文件无论这些文件是 Shell 创建的、Browser 下载的、还是 VSCode 编辑的。所有tool调用都基于这个路径。browser.download的文件默认存到/home/user/downloads/vscode.open_file的路径也必须是/home/user/下的相对路径。MCP Tool 清单file.upload上传文件到沙箱。关键设计前端 UI 选择文件后浏览器先将文件分块每块 5MB通过 WebSocket 流式上传到 File 组件组件边收边写入磁盘并计算 SHA256 校验和。上传完成才返回file_id如sha256:abc123...确保完整性。file.download下载文件到本地。关键设计返回一个临时download_url如/api/download/abc123?tokenxxx该 URL 有效期 5 分钟且绑定用户 session防止未授权下载。file.list列出目录。关键设计返回结构化 JSON包含name,typefileordirectory,size,modified_time,is_executable。is_executable字段由stat系统调用获取比单纯看后缀名.sh更可靠。file.delete删除文件。关键设计支持recursive: true但会先检查目标路径是否在/home/user下且不能是/home/user本身防误删根目录。静默同步当 Shell 执行touch hello.txt或 VSCode 保存main.py时File 组件会通过 inotify 监听/home/user目录变更自动更新自己的内部索引。这样file.list总是最新无需手动刷新。注意file.upload不支持断点续传。如果上传中途断开整个文件需重传。这是为了简化实现保证原子性。生产环境若需大文件建议先用shell.execute curl -F filelarge.zip http://upload-api/走外部服务。3.4 VSCode 组件不是远程桌面是“可编程的工作台”VSCode 组件是 AIO Sandbox 最惊艳的部分。它不是简单的 VSCode Servercode-server而是深度定制的aio-sandbox/vscode-extension轻量化启动容器内只安装 VSCode Servercode-serverv4.19和一个专用 extension。Extension 的package.json声明了 12 个contributes.commands每个命令都对应一个 MCPtool如vscode.open_file→extension.openFilevscode.run_command→extension.runCommand。MCP Tool 映射vscode.open_file打开指定路径的文件。关键增强支持line和column参数打开后光标自动定位。encoding参数可指定utf-8或gbk解决中文乱码。vscode.save_file保存当前编辑的文件。关键增强返回file_hashSHA256供后续file.download引用。vscode.run_command执行 VSCode 命令。关键增强支持args数组如[workbench.action.terminal.toggleTerminal]可模拟用户快捷键操作。vscode.get_editor_content获取当前编辑器内容。关键增强返回content和cursor_position模型可据此做“增量编辑”。vscode.set_editor_content设置编辑器内容。关键增强支持diff_mode: patch只发送差异部分节省带宽。资源隔离VSCode Server 运行在独立的code-server进程其工作区/home/user/workspace与 Shell 的/home/user是同一个目录。但 VSCode 的插件进程如 Python 插件被限制在cgroups中CPU 使用率上限 50%内存上限 1GB防止插件崩溃拖垮整个沙箱。实操心得VSCode 的settings.json是全局的不是 per-workspace。所有用户看到的设置都一样。想个性化用vscode.run_command调workbench.action.openSettingsJson然后vscode.set_editor_content写入自定义配置。但注意settings.json的修改会立即生效可能影响其他正在使用的用户。3.5 MCP Router不是代理是“沙箱的宪法法院”MCP Router 是整个系统的灵魂它不执行任何业务逻辑只做三件事路由、鉴权、审计。路由引擎收到一个tool_call请求JSON-RPC 2.0 格式先解析tool名称如browser.navigate查表找到注册了该tool的组件Browser然后将请求转发过去。组件返回tool_result后Router 再将其封装成标准 JSON-RPC 响应发回给调用方Agent 模型或 Web UI。动态鉴权Router 加载一个policy.json文件内容类似{ rules: [ { action: allow, tool: shell.execute, conditions: [ {field: command, op: not_match, value: ^(rm|chmod|chown|sudo).*}, {field: timeout, op: le, value: 30} ] }, { action: deny, tool: browser.navigate, conditions: [ {field: url, op: match, value: ^file://.*} ] } ] }每次tool_callRouter 都逐条匹配规则。匹配到deny则直接返回错误匹配到allow则放行无匹配则默认deny。策略文件可热重载kill -SIGHUP $(pidof mcp-router)即可。审计中心所有tool_call和tool_result都被序列化为 JSON打上时间戳和request_id通过auditchannel 广播。AIO Sandbox 的 Web UI 有个 “Audit Log” 标签页实时显示所有操作。生产环境可对接 ELK 或 Splunk。提示Router 的policy.json是沙箱安全的基石。不要用网上找的“通用策略”必须根据你的业务场景定制。例如如果你的 Agent 需要git clone就在shell.execute规则里加一条{field: command, op: match, value: ^git clone https://.*}。安全不是一劳永逸是持续运营。4. 实操部署从零开始搭建一个可用的 AIO Sandbox4.1 环境准备硬件、系统与依赖的硬性要求AIO Sandbox 对环境的要求比想象中更“接地气”。它不是那种动辄要 32 核 128G 的 AI 巨兽而是一个精悍的“瑞士军刀”。我的实测环境是硬件一台 4 核 CPUIntel i5-8250U、16GB RAM、256GB SSD 的笔记本。Docker Desktop for WindowsWSL2 backend。系统Ubuntu 22.04 LTSWSL2 内内核 5.15。强烈不建议在 CentOS 7 或旧版 Debian 上部署因为 seccomp 和 cgroups v2 支持不完善。前置依赖Docker Engine v24.0必须旧版不支持--cgroup-parentDocker Compose v2.20用于一键编排curl,jq,git用于下载和验证注意Windows 用户请务必使用 WSL2而不是 Docker Desktop 的 Hyper-V 模式。后者对seccomp的支持有 bug会导致 Shell 组件启动失败。Mac M1/M2 用户没问题原生支持。4.2 一键部署docker-compose.yml的关键配置解读AIO Sandbox 官方提供了docker-compose.yml但直接docker-compose up -d很可能失败。原因在于几个关键配置项必须手动调整version: 3.8 services: # MCP Router - 沙箱的大脑 mcp-router: image: aio-sandbox/mcp-router:v0.5.2 ports: - 8080:8080 # MCP WebSocket 端口 - 8081:8081 # HTTP API 端口用于 audit log 查询 volumes: - ./config/policy.json:/app/policy.json:ro # 必须挂载 - ./logs:/app/logs # 日志目录 environment: - MCP_JWT_SECRETyour-very-secure-jwt-secret-here # 必须修改 - MCP_API_TOKENeyjhbgcioijfuzi1niisinr5cci6ikpxvcj9.eyj # 示例 token实际需生成 # Browser 组件 - 可编程的眼睛 browser: image: aio-sandbox/browser:v0.5.2 depends_on: - mcp-router environment: - MCP_ROUTER_URLws://mcp-router:8080 # 注意是 ws://不是 wss:// - PLAYWRIGHT_DOWNLOAD_HOSThttps://npmmirror.com/mirrors/playwright # 国内加速 # 关键必须启用 privileged 模式否则 Playwright 无法启动 Chromium privileged: true # 关键共享 /dev/shm否则 Chromium 渲染会卡顿 volumes: - /dev/shm:/dev/shm # Shell 组件 - 受控的双手 shell: image: aio-sandbox/shell:v0.5.2 depends_on: - mcp-router environment: - MCP_ROUTER_URLws://mcp-router:8080 - HOME/home/user - USERuser # 关键seccomp 配置文件必须挂载 security_opt: - seccomp:./config/seccomp-shell.json # 关键chroot 目录必须挂载 volumes: - ./workspace:/home/user:rw # VSCode 组件 - 可编程的工作台 vscode: image: aio-sandbox/vscode:v0.5.2 depends_on: - mcp-router environment: - MCP_ROUTER_URLws://mcp-router:8080 - CODE_SERVER_PASSWORDyour-code-server-password # 必须修改 # 关键VSCode 的 workspace 目录必须与 Shell 共享 volumes: - ./workspace:/home/user:rw # 关键限制资源防止 OOM mem_limit: 1g cpus: 0.5 # Web UI - 用户入口 web-ui: image: aio-sandbox/web-ui:v0.5.2 ports: - 8000:80 depends_on: - mcp-router environment: - MCP_ROUTER_URLws://mcp-router:8080必须修改的三个地方mcp-router的MCP_JWT_SECRET这是所有组件通信的 JWT 签名密钥。必须是 32 字节以上的随机字符串。生成命令openssl rand -hex 32。mcp-router的MCP_API_TOKEN这是 Web UI 连接 Router 的 token。格式是 JWTpayload 必须包含{sub: web-ui, exp: 1735689600}Unix 时间戳建议设为一年后。用在线 JWT 生成器即可。vscode的CODE_SERVER_PASSWORD这是访问 VSCode Web UI 的密码。不能是弱密码否则会被暴力破解。实操心得./workspace目录必须提前创建mkdir -p ./workspace并确保当前用户有读写权限。否则 Shell 和 VSCode 组件会因无法挂载而退出。我第一次部署就卡在这里日志里只有一句permission denied排查了两小时才发现是目录权限问题。4.3 首次启动与验证五个组件的健康检查清单部署完成后执行docker-compose up -d等待 2-3 分钟。然后逐项验证Router 是否存活curl http://localhost:8081/health返回{status:ok}即可。Browser 是否注册curl http://localhost:8081/api/tools | jq .tools[] | select(.namebrowser.navigate)应返回完整的 tool schema。Shell 是否注册同上查shell.execute。VSCode 是否注册同上查vscode.open_file。Web UI 是否可访问浏览器打开http://localhost:8000应看到 AIO Sandbox 的登录页。输入CODE_SERVER_PASSWORD登录。终极验证一个端到端的 MCP 调用在 Web UI 的 Console 标签页粘贴以下 JSON 并点击 Send{ jsonrpc: 2.0, id: 1, method: tool_call, params: { tool: shell.execute, arguments: { command: echo Hello from AIO Sandbox!, timeout: 5 } } }如果返回{ jsonrpc: 2.0, id: 1, result: { stdout: Hello from AIO Sandbox!\n, stderr: , exit_code: 0 } }恭喜你的沙箱已打通任督二脉。常见问题如果curl返回Connection refused检查docker-compose ps看mcp-router容器状态是否为Up。如果不是docker-compose logs mcp-router查看错误。90% 的情况是policy.json格式错误或MCP_JWT_SECRET太短。5. 高级应用与避坑指南那些文档里不会写的实战经验5.1 如何让 Agent 模型真正“理解”沙箱能力很多用户部署完发现模型调用browser.navigate失败报错tool not found。问题不在沙箱而在模型的System Prompt。正确的 System Prompt 必须包含能力声明明确告诉模型沙箱支持哪些tool。例如“你在一个 AIO Sandbox 环境中运行可调用以下工具browser.navigate,browser.screenshot,shell.execute,file.upload,vscode.open_file。每个工具都有详细的参数说明请严格按 Schema 调用。”路径约定强调所有路径都是/home/user下的相对路径。例如“所有文件操作路径如file.upload的path参数必须是/home/user下的子路径如documents/report.pdf。绝对路径/tmp/xxx是无效的。”权限意识提醒模型权限限制。例如“shell.execute禁止运行rm -rf、chmod等危险命令。如果需要删除文件请使用file.delete工具。”我用的 Prompt 模板已验证有效你是一个高级 AI Agent正在 AIO Sandbox 环境中执行任务。该环境提供以下标准化工具 - browser.navigate(url: str, wait_until: str networkidle): 导航到网页wait_until 可选值为 load, domcontentloaded, networkidle。 - shell.execute(command: str, timeout: int 10): 执行 Shell 命令command 必须是安全的单行命令。 - file.upload(content: str, path: str): 上传文本内容到指定路径path 如 notes/todo.md。 - vscode.open_file(path: str, line: int 0, column: int 0): 在 VSCode 中打开文件并定位光标。 请始终优先使用这些工具而非尝试自行构造解决方案。所有路径均相对于 /home/user。记住安全第一不要尝试越权操作。注意不要把整个 MCP Tool Schema 都塞进 Prompt模型会 parse 不过来。只给它最常用、最核心的 4-5 个工具的简明说明即可。复杂的 Schema留着让tool_call的 validation 去做。5.2 文件协作的黄金法则Browser 下载 → Shell 处理 → VSCode 编辑这是最典型的多组件协作场景。例如让 Agent 下载一个 CSV 文件用csvkit处理再用 VSCode 编辑结果。错误做法模型先browser.download到/home/user/downloads/data.csv再shell.execute运行in2csv /home/user/downloads/data.csv /home/user/output.json最后vscode.open_file打开/home/user/output.json。问题在于browser.download的默认路径是/home/user/downloads/但shell.execute的in2csv命令可能不存在容器里没装csvkit。正确链路browser.download时指定save_as: data.csv文件会存到/home/user/downloads/data.csv。shell.execute运行pip3 install csvkit in2csv /home/user/downloads/data.csv /home/user/output.json。pip3 install会临时安装包in2csv就绪。vscode.open_file打开/home/user/output.json。更优实践把常用工具csvkit,jq,yq预先装进 Shell 组件的镜像里。修改DockerfileFROM aio-sandbox/shell-base:v0.5.2 RUN pip3 install csvkit jq yq然后docker build -t my-shell .在docker-compose.yml中替换image。这样每次启动都自带工具无需pip3 install更快更稳定。实操心得browser.download的save_as参数决定了文件在沙箱内的最终路径。不要依赖默认路径显式指定避免歧义。我曾因没指定save_as导致文件名含空格report final.csvshell.execute调用时忘了加引号命令直接报错。5.3 VSCode 插件的“隐形杀手”Python 环境的陷阱VSCode 组件里预装了 Python 插件但它的 Python 解释器路径是/usr/bin/python3而这个 Python 环境是“纯净”的没有requests,pandas等常用库。问题场景模型让 VSCode 运行一个 Python 脚本script.py内容是import requests; print(requests.get(https://api.github.com).json())。VSCode 报错ModuleNotFoundError: No module named requests。解决方案有二方案一推荐用 Shell 预装。在shell.execute中运行pip3 install requests pandas numpy。这些包会安装到/usr/local/lib/python3.x/site-packages/VSCode 的 Python 插件默认使用系统 Python因此能识别。方案二配置 VSCode 的 Python 解释器。在 VSCode 的 Command Palette (CtrlShiftP) 中运行Python: Select Interpreter然后选择/usr/bin/python3。但这只是告诉 VSCode 用哪个解释器不解决包缺失问题。注意pip3 install的包是全局的所有用户共享。如果不同 Agent 需要不同版本的包如一个要pandas1.5.3另一个要pandas2.0.0方案一就不适用了。此时必须为每个 Agent 创建独立的 virtualenv但这超出了 AIO Sandbox 的默认能力需要定制 Shell 组件。5.4 安全审计的“最后一道防线”如何读懂 Audit LogAudit Log 不是摆设它是你发现异常的唯一窗口。日志格式是 JSON关键字段timestamp: 操作发生时间UTC。request_id: 全局唯一 ID串联一次完整调用tool_call→tool_result。component: 执行组件browser,shell,vscode