feat: complete WorkBuddy parity and Windows release workflow

This commit is contained in:
xiaohan.yuan committed 2026-10-18 12:45:21 +08:00
1 parent 143516b3a8
commit d5512df549
434 files changed
+54977 -1854

No files matched your search

+103
View File
@@ -0,0 +1,103 @@
# 沙盒参考代码与 YCode 接入评估(2026-10-18)
> 后续实施已完成自有沙盒首版,见[实施与维护基线](自有沙盒首版实施-2026-10-18.md)。本文保留此前评估时的代码状态,不代表后续沙盒仍未接入。
## 结论
可以据此完善 YCode,尤其是统一策略、文件操作代理、安全删除、调用归属与审计。不过,`C:/Users/Administrator/code/沙盒` 是逆向分析资料和部分客户端脚本的集合,不是可以直接安装的完整 Windows 沙盒工程。
当前 YCode 已有工作区路径检查和文件写入审批,但尚未接入模型命令的系统级隔离。最合适的实施方式是保留 OMP 与备用内核共用的宿主工具入口,在其下增加策略服务、文件事务和独立的 Windows 执行后端;参考包里的 shim 放在这套后端之上接入。仅复制 shim、设置环境变量或取消当前命令限制,不能补齐系统沙盒。
本轮完成材料核对、YCode 执行路径审查和临时目录中的权限基线探测;**未修改业务代码,未启用新沙盒,未连接或重启 WorkBuddy/YCode 的用户进程**。
## 证据与版本范围
材料 README 将对象标为 WorkBuddy 5.8.6 / Windows x64,采集日期为 2026-10-17。这是资料作者的版本声明;随包可导入的 REA Evidence 未单独证明该版本号,不能与项目历史的 5.8.2/5.8.3 原版基线混为一谈。
本轮所有原版脚本实现的核对均通过 REA,不直接读取或执行所附原版 shim。README 和 `runtime_facts.txt` 作为分析者说明阅读,其原生机制、运行实况与具体数值仍需对应的 REA 证据复核。未直接审读附带的 `.c` 反编译正文。
| 证据 | 本轮核对结果与范围 |
| --- | --- |
| 原随包 `evidence/rea_evidence.json` | REA 成功导入 2 条记录,0 条 unknown;该数字只表示本包包含的记录,不代表不存在实现未知项 |
| `ev_74bf702462bc37612d2a68ea2e1c93b30b77dd5d99eaf1e961f1ab36d626c5e3` | 原安装位置 `cli/vendor/shim` 的静态 JavaScript 分析,8 个 JS 文件;不是进程运行验证,也没有附带原生分析记录 |
| `ev_2860ca8fafaf310ee1adc2ebe31530c868da0ecbb41a6f451e8e8e86b447a078` | 本轮 REA 分析所给目录中的 8 个 CJS 文件和 `rules/tsbx_rules.json`;8 个 JS 均解析成功,源码正文解析失败数为 0 |
| `ev_3c27ca6a1b13c90777b729eac969ce3aa20a232145bfd342d6e13e76b4ac8c9d` | 本轮目录静态分析摘要;应用关系图 partial、语义图 unknown,保留 2699 项语义未知;规则 JSON 只确认解析与顶层字段,未据此宣称策略生效 |
| 两份静态分析中的文件身份 | 按 basename 对照的 8 个 CJS SHA-256 全部相同,确认提供的 JS 副本与随包 REA 记录中的字节身份一致;不证明运行环境等价 |
本轮 REA 输入目录摘要为 `d87c4cab25fb1feec426332fe01b1680538577405cf82476cb6f5b1b14d94b84`。选择范围不包含材料中的 Python、Shell、Ghidra 伪代码正文;REA 当前 JavaScript 入口不支持将这些作为源码选择项。调用返回明确的 `source_paths` 不支持错误后,已缩小到支持范围,未改走其他采集渠道。
本地证据产物(`.tmp` 为本机验证产物,不随业务代码发布):
- `.tmp/sandbox-assessment-20261018-evidence.json`:REA 导出的 7 条记录,包括导入记录、本轮分析和选定视图,约 33.8 MB。
- `.tmp/sandbox-assessment-20261018-identities.json`:8 个 JS 文件的原/副本摘要对照。
- `.tmp/sandbox-assessment-20261018-probe.json`:YCode 当前权限基线的 11 项受控检查。
- `.tmp/sandbox-assessment-probe-20261018.mjs`:可复现探测脚本;执行命令为 `node .tmp/sandbox-assessment-probe-20261018.mjs`。
## 当前 YCode 的实际边界
| 执行位置 | 已实现 | 与完整沙盒的差距 |
| --- | --- | --- |
| `src/main/agent/tools/index.ts` | `realpath` 后的工作区检查;默认模式拒绝越界;写入前审批并再次检查路径/内容;原子替换文件 | 只覆盖这些宿主文件工具,没有统一敏感文件策略、通用删除代理或任意进程文件隔离 |
| 同文件 `execute_command` | 默认模式立即拒绝;只有 `full-access` 才调用普通 `spawn(shell: true)`,Windows 取消使用 `taskkill /T` | 未实现受限进程启动、系统级文件/注册表/网络规则;`cwd` 只是启动位置;该命令分支未显式净化继承的环境变量 |
| `src/main/agent/conversation-tools.ts` / `omp-turn.ts` | OMP 与备用循环共用宿主工具与审批;OMP 启动参数含 `--no-tools` | 可以接入统一沙盒服务,无需为此更换 OMP;OMP 自身进程目前也没有系统级隔离 |
| `src/main/capabilities/mcp.ts` / `runtime.ts` | MCP 配置摘要信任、连接代次、每次调用审批;HTTP origin 保护 | 本地 stdio MCP 启动没有接系统沙盒;调用获批不等于插件进程已隔离。远程 MCP 的外部副作用需独立标明权限范围 |
| `src/main/terminal-host.ts` | 用户终端使用 ConPTY/PowerShell,限制窗口归属和资源数量,过滤部分敏感环境变量 | 独立于模型命令权限,当前没有系统沙盒;用户手动终端与模型自动执行应明确各自边界,不能误算成模型工具已隔离 |
| `src/main/workspace-revert.ts` / `src/shared/revert.ts` | 对有完整 before/after 的 `write_file` / `edit_file` 实现回滚并检查外部改动 | 不覆盖任意命令、MCP、副进程或删除产生的所有变化;不能替代通用文件备份事务 |
| 权限菜单与安全中心 | 已有默认/完全访问状态和确认;安全中心导航保留 | 权限菜单刻意将原版“安全沙箱”描述适配为“默认权限”;设置安全中心尚无页面分支,不能只接 UI 宣称后端已启用 |
## 参考材料中可以利用的部分
以下源位置均指 REA 静态图返回的行号与符号,不代表本轮执行过这些原版函数。
| 材料 | 已取得的静态事实 | 对 YCode 的用途 |
| --- | --- | --- |
| `shims/broker-ipc-client.cjs` | `sendBrokerRequest`(151 行)、`sendBrokerRequestSync`(209 行)、队列优先级/低优先级淘汰/超时相关函数 | 参考 IPC 客户端的同步/异步分工、背压、错误分类;服务端认证、协议上限、取消和断线策略需另行完整定义 |
| `shims/node-brokered-fs-shim.cjs` | 请求构造 `buildBrokerHostOperationRequest`(195 行)、`buildBrokerFileTokenRequest`(213 行)、`buildBrokerFileWriteCompletedRequest`(231 行);默认命令字可见 `HostFileOperation`、`FileTokenRequest` | 建立“受控操作/申请授权/报告完成”的文件操作生命周期,统一归属与审计;token 的真实授权语义与原生侧消费方式仍需补证 |
| 同文件 | `sessionId`、`toolCallId`、`brokerTraceId` 字段相关静态节点;`createBrokerOutcomeUnknownError`(260 行)、`loadBrokerNativeAddon`(143 行) | 将审批绑定到具体调用,并对结果未知建模;不能在 IPC 结果不明时假定成功或直接重做非幂等操作。原生 addon 仍是依赖项 |
| `shims/safe-delete-broker-delete.cjs` / `safe-delete-bulk-guard.cjs` / `node-safe-delete-shim.cjs` | 删除请求构造、同步/异步代理、批量删除检查与批准/拒绝的函数及参数节点 | 参考安全删除、批次审批和审计;回收站执行器、阈值、重放和恢复成功条件尚未由本轮证据证明 |
| `shims/broker-program-policy-check.cjs` | `checkProgramPolicy`(14 行)及程序/runtime/options 参数 | 增加程序启动策略入口;不能用程序名检查替代进程隔离或实际可执行文件身份验证 |
| `rules/tsbx_rules.json` | REA 确认解析成功,包含 `file_rules`、`process_rules`、`network_policy`、`registry_rules` 等顶层字段 | 可作为后续规则语义分析的起点;本轮没有完整规则值或实际判定证据,不直接把此 JSON 当作 YCode 已生效策略 |
因此可以复用已经确认的职责划分和协议线索;实际引入脚本前还要补齐完整正文、导出接口、依赖、平台分支与失败分支的 REA 证据。现有静态图足以支撑接入方向判断,不足以保证逐函数搬迁后行为一致。
## 这份目录还缺少什么
目录没有配套的 `sandbox-center.exe`、`sandbox-cli.exe`、`sandbox_ffi.dll`、`tsbx*.dll`、native addon 可执行产物,也没有这些组件可复现构建所需的完整工程。README 描述的 Rust 策略中枢不在所给源码集合中。
`decompiled/tsbx*.c` 按资料自身说明属于 Ghidra 伪代码;它们不等于包含原始类型、初始化、链接依赖和完整构建配置的 C/C++ 项目。本轮未尝试把伪代码当源码编译。
README 提到的受限令牌、Job、注入钩子、命名管道、网络双引擎、备份事务,以及具体 verdict 位与 registry/network TODO 等均是**待 REA 复核的分析结论**。随包仅有 shim 的两条正式 REA 记录,不能直接把这些原生说明提升为已验证事实,更不能据此声称 Windows 沙盒已复原。
当前还未证明 shim 对 Windows、macOS 和 Python 的完整适用范围;没有观察它们在 YCode 的 Node/Electron/子进程环境中的实际行为。语言层拦截即使成功工作,也不能凭静态函数存在证明任意其他程序受到同样限制。
## 建议接入顺序与验收条件
### 第一批:统一策略、审批与文件事务
在主进程增加独立的沙盒服务边界,输入至少包含会话、run、tool call、真实工作区路径、权限模式和操作;输出区分允许、待审批、拒绝与结果未知。沿用 `executeTurnTool` 的公共路由,让 OMP 和备用内核得到同一决策。
先覆盖宿主文件读写、敏感路径规则、安全删除和独立文件事务日志。既有消息 before/after 可继续用于展示,事务记录应能在消息保存失败或进程重启后追查与恢复。权限 token 应绑定主体、真实目标和操作并有有效期;不能只信任请求 JSON 中自报的 session ID。
验收:越界、junction、凭证样本保护、审批前后文件变化、审批取消、删除恢复、批量操作、重启恢复、多会话交叉请求。此批完成只能称“应用层权限与文件保护”,不启用默认模式 Shell,也不宣称任意进程已隔离。
### 第二批:独立 Windows 执行后端
通过 REA 补齐原版原生组件身份、初始化/配置/启动/停止、策略 IPC、审批回调及实际允许/拒绝行为,再决定原生后端的接入实现。无论采用哪种内核,都需由 YCode 管理自己的实例、会话和生命周期,不能借用用户正在运行的 WorkBuddy 策略进程。
在 `execute_command` 下加入受控启动适配器,输出真实能力状态。后端不可用或握手失败时继续拒绝默认模式命令,不能回退到普通 `spawn`。将环境净化、子进程继承、进程树停止、会话退出和审计纳入这个入口;当前终端的环境过滤可供参考,但不是完整凭证隔离保证。
验收:受控临时目录中的允许/拒绝写入;命令和后代进程越界尝试;程序真实身份;受控本地网络策略;取消/超时/主进程退出后的子树清理;IPC 断线与策略失败;原版同场景比较。注册表及其他声称具备的能力须分别验证。只有这些边界通过,才可在默认模式开放命令。
### 第三批:语言适配、连接器和安全中心
原生边界建立后,再依据补齐的 REA 证据引入 Node/Python/Shell 适配,验证实际运行时、同步/异步接口、rename/copy/文件描述符、恢复与错误处理。明确哪些本地 MCP 进程、用户终端和其他辅助进程处于隔离范围;配置被信任不等于进程被沙盒化。
安全中心继续按项目约定通过 REA 采集原版页面与行为。页面读取真实后端健康、策略、审计和审批状态,分别标明已实现、未实现与不可用能力;原版对应功能和视觉/交互仍按独立 1:1 场景验收。
## 本轮验证结果
`node .tmp/sandbox-assessment-probe-20261018.mjs`:**11/11 通过**。使用唯一临时目录、假 `.env` 内容和自建 junction;不读取真实凭证,不发送模型请求,不执行完全访问命令。
已验证当前行为:工作区内可读取假 `.env`(说明当前没有敏感文件策略);默认模式拒绝越界读写和 junction 逃逸;默认写入需批准,拒绝不落文件,批准后写入成功;预取消写入不创建文件;默认 Shell 被拒绝;完全访问仅在自有临时样本上验证可读取工作区外文件。
这些检查只验证 YCode 现有宿主工具的常规路径,未验证并发路径替换等竞争条件,也没有验证系统沙盒、网络、原生钩子、MCP/终端隔离或 WorkBuddy 等价行为。本轮没有业务代码变化,因此未额外运行生产构建;全部既有未提交修改保持原样。