Skip to content

Releases: Teow9/dsh-isolation-pod

隔离舱 v0.2.0 — Rust 侧车 + 官方会话界面重构

Choose a tag to compare

@Teow9 Teow9 released this 17 Oct 12:23

隔离舱 v0.2.0

Rust 侧车 + JS Host 薄壳 + DSH 官方会话界面重构。主会话默认零自动痕迹;隔离任务在独立的普通根会话中、受沙箱约束运行,结果返回与文件导出都需手动确认。

主要变更

  • Rust 侧车:NDJSON over stdio、SQLite WAL、任务状态机、FIFO 队列、每轮超时、租约、文件清单/预览、导出/撤销、BLAKE3、v0.1.3 迁移、诊断日志。
  • 官方会话界面:任务通过 uiWorkspace.openSession 在 DSH 官方会话面板打开;注入任务操作条、会话头部入口与只读恢复卡片,不再自绘转写。
  • 任务模型:普通根会话(非 subagent),不加入 workspace;支持重启恢复、官方输入框续聊、停止、返回主会话。
  • 导出安全:复制/移动、覆盖/跳过/重命名、覆盖前备份、复制模式撤销、哈希校验;每次导出单独确认。
  • 跨平台:插件自身文件/导出/清理改为 Rust,Windows x64 本机验证,Linux/macOS 由 CI 构建。
  • bundle + patch 安装、中英文界面、诊断页、核心重启、CI/Release 打包。

修复

  • 主会话位置误报:任务会话 cwd(= 沙箱根)不再被当作主会话工作区;Client/Host 双层解析回任务记录的 mainSessionId。
  • previewBytes 预览字节上限现已由侧车 files.read 真正强制执行。
  • 导出“记住本次选择”仅在配置允许且用户勾选时记住目标路径。

升级注意

  • 破坏性变更:状态文件、HTTP 方法名、会话模型、安装方式均变化;从 v0.1.3 升级请先读 MIGRATION.md。
  • 要求 DSH 0.2.1+;0.1.7 不再支持,v0.1.3 是 0.1.x 最后版本。
  • Host 半(lib/index.js)更新后重启 DSH;只更新 Client 半可热重载。

验证

  • Rust:51 个单元测试 + 4 个集成测试通过。
  • Host:64/64;Client:41/41;真实侧车 e2e:4/4;tsc 与 check-version 通过。
  • Windows x64 侧车:1,902,592 B,SHA-256 a34a701da220fc5c1f6b74eb027ac167c22c9284e0ff460684ccd9a42d442701。

发布资产

  • dsh-isolation-pod-0.2.0-windows-x64.zip — Windows x64 完整包。
  • isolation-pod-core_0.2.0_windows-x64.exe — 裸侧车二进制。
  • SHA256SUMS.txt — 资产校验和。

其他平台可从源码构建,或由仓库的 Release 工作流产出。二进制未做代码签名。

隔离舱 v0.1.3 —— 修复工具面被清空(pod 无工具可用)

Choose a tag to compare

@Teow9 Teow9 released this 25 Sep 07:13

修复 v0.1.2 引入的一处功能性回归:隔离 Agent 的工具面被误判为空,pod 一个工具都用不了。只有 Host 半与文档变更(build: 8)。

问题

v0.1.2 为了让「白名单」与「preset 实际提供的工具」一致,在任务启动时用 agentCtx.tools.schemas() 取工具面并与白名单求交。但 schemas(scope) 的 scope 参数是有语义的:省略 scope 得到的是「全局面」,而桌面版 / Web 面上工具按 preset 分层,全局工具与白名单毫无交集 —— 交集为空把白名单清成 [],pod 只能收到「工具 X 未被授权」的拒绝。

实测证据(一次真实任务的子会话日志,节选):

可用工具(其它工具已被拒绝):(无:当前 preset 未提供白名单里的任何工具,请在面板调整白名单或 preset)
Error: 隔离舱:工具 pwsh 未被授权,隔离环境不得调用。
Error: 隔离舱:工具 write 未被授权,隔离环境不得调用。

修复

  • 取工具面时传入该 pod 的 agent 作为 scope(agentCtx.tools.schemas(agent));
  • 不再与白名单求交 —— 白名单只作上限,由 tools.guard() 强制执行,因此不可能被清空;
  • 真实工具面以该 pod 自己的 request/header 为准(首次派发时到达),覆盖启动期的探测结果;
  • 面板「可用工具」(白名单上限)与「隔离环境实有」(该 pod 实际可见)分别表述,空白的提示语同步修正。

验证

离线用例(桩上下文 + 真实 HTTP 路由)三项断言均通过:schemas 只以 agent 为 scope 调用、白名单不再被清空、request/header 会覆盖工具面。

同时把 v0.1.2 那次真实任务留下的、可核对的证据记进了 README 的「已验证的行为」:策略写入(sandbox/mode = workspace-write、approval/policy = never,均 source: delegation)、越界写自检通过、任务提示带上主会话只读上下文、两条未授权调用被 guard 各拒绝一次、turn/end: completed。

升级说明

git pull
  • 必须重启一次:Host 半有改动(/status 的 build 变为 8),Node 按 URL 缓存 ES 模块,热重载不会重新读盘。
  • 配置无需改动:allowedTools 依旧是白名单,只是不再会被 preset 求交清空。
  • 建议升级后再跑一个任务确认产物链路(生成文件 → 导出 / 撤销):v0.1.2 那次实测因本缺陷没走到产物,这一版尚未复测。

完整对比:v0.1.2...v0.1.3

隔离舱 v0.1.2 —— 适配 DSH 0.1.7 桌面版

Choose a tag to compare

@Teow9 Teow9 released this 25 Sep 07:00

适配 DSH 0.1.7:桌面版(Desktop 0.1.7-rc.2)与 dsh web 共用同一套 profile 与宿主,所以本次适配对两者同时生效。本版修掉三处在 0.1.7 上会让插件完全不可用的接口变更、一处会让任务被误判中止的自检边界问题,并补齐桌面版特有的令牌通道。

修复

  • ctx.shell.run → ctx.shell.execute —— 0.1.7 的 shell 能力是 resolve() + execute(spec),由进程句柄的 result() 给出运行结果。旧代码调用的 run() 已不存在,导致创建沙箱目录、导出、清理全部失败(startTask 只会返回 MKDIR 错误)。现按能力探测选择入口,/status 的 compat.shellApi 报告实际用了哪一个。
  • 令牌投递改用结构化索引注入行 —— 桌面版页面由 Electron 直接发出,不经过 webServer.renderIndex(),因此旧的 tapIndex 在桌面版永不执行:页面上拿不到 window.__DSH_IPP__,面板所有调用都 403。现改为 webserver/index-inject 的 { kind: 'global' } 行(Web 版渲染进 HTML,桌面版经 IPC 交给渲染进程)。
  • 主会话识别 —— 0.1.7 的会话列表快照不再有 current 字段,面板因此一直显示「未定位到主会话」、无法启动任何任务。现按内置面板同一算法解析(retainedBy.mainView),并保留旧字段兜底。
  • 越界写自检的边界 —— 探针落在沙箱根目录的上一级,而 E:\pod-work\ 这类尾部反斜杠会让探针落回沙箱内部,自检于是判定「越界写未被拒绝」并中止每一个任务。现在配置值在写入与读回时都归一化;根目录若本身就是盘符根(如 E:\),没有更上一级可探,自检标记为 skipped-no-parent 并在面板标注,不再误判。
  • followup 消息来源 —— MessageSource 是闭合联合 user | model | tool | system-prompt,旧的 { kind: 'plugin', … } 已不是合法值,改为 { kind: 'user' }。

新增

  • GET /isolation-pod/bootstrap —— 对已被 harness 浏览器认证的调用者返回令牌。桌面版 release 构建没有「刷新页面」入口,而客户端半是经模块图推送热挂载的、拿不到随页面加载的注入行;这条路由正是「首次安装无需刷新即可用」的原因。无 cookie 时返回 401。
  • 客户端令牌获取链 —— __DSH_IPP__ → /isolation-pod/bootstrap → 抓同源 HTML(Web 路径)→ 单次自动重载(5 秒防抖)。全部失败时横幅给出「重新载入页面」按钮与分平台建议,而不是停在「加载中…」。
  • 面板自证信息 —— 任务详情新增「隔离环境实有」(该 pod 真实可见的工具面),与白名单「可用工具」两行对账;preset 挂载失败等 setup 提示随任务记录展示并持久化。
  • /status 的 pluginVersion 与 compat —— { shellApi, indexInject, bootstrap },一眼确认当前进程加载的版本与接口适配结论。

变更

  • 白名单与 preset 对齐:隔离 Agent 的工具来自所挂 preset,任务启动后把配置白名单与 pod 真实工具面求交,结果同时写进系统提示词与任务详情;tools.restrict() 只传本部署确实注册过的名字(0.1.7 对未知名字会直接抛错)。
  • KNOWN_TOOLS 按 0.1.7 工具面重写:移除已不存在的 ralph、list_subagent_models,补入 read_image、load_workspace_dependencies、cordis_inspect_* 等;bash 保留给非 Windows 部署。
  • 模型选项透传:子会话沿用主会话的默认模型选择,含 reasoningEffort。
  • 配置页的 Agent preset 在注册表可用时显示为下拉框,并标注不可用的 preset。

文档

  • 全套重写:新增「与宿主的接口约定(0.1.7)」「桌面版差异」「规格与本实现的差异」三节;验证结论按 (A) v0.1.2 · 桌面版实测 与 (B) v0.1.1 · Web 版实测、0.1.7 未复测 分组,未复测的结论不再当作已验证。
  • 更正两处过时告警:0.1.7 只对固定必需插件集合(agent-loop、webserver、modules、connection 等)拒绝启动,其它未激活的插件行只会告警;桌面版 release 构建没有「刷新页面」菜单。

升级说明

  • 必须重启一次:Host 半(lib\index.js)被 Node 按 URL 缓存,热重载不会重新读盘;客户端半与 patch 行改动仍是热生效。
  • 配置自动兼容:sandboxRoot 读取时会归一化(去尾部反斜杠),旧的 E:\pod-work\ 拼写不再导致任务被中止。
  • 需要 DSH 0.1.7。旧版 DSH 仍保留 shell.run 回退分支,但未做回归验证。

验证状态

已在桌面版 0.1.7 实测:热安装(加 patch 行即激活,无需重启)、客户端半热挂载(无需刷新)、热卸载、令牌链路与自愈、401/403 门禁、主会话识别。Host 半的任务链路以「桩上下文 + 真实 HTTP 路由」的离线用例验证(配置归一化、越界写探针、转写与结论、盘符根跳过自检);桌面版上跑真实任务的复测尚未完成,README「已验证的行为」一节对此有明确标注。


完整对比:v0.1.1...v0.1.2

隔离舱 v0.1.1 —— 面板文件预览 · 许可与英文文档

Choose a tag to compare

@Teow9 Teow9 released this 14 Sep 16:13

小版本更新:面板现在可以直接预览沙箱里生成的文件内容;仓库补齐 LICENSE 与英文文档。

新增

  • 面板文件内容预览 —— 任务详情 → 「生成文件」列表中,每个文件行右侧新增 预览 按钮:
    • 就地展开该文件内容,等宽字体、可滚动;
    • 标题行显示字节数,内容被截断时提示 已截断显示;
    • 再点 收起 或 关闭 即隐藏,切换任务/返回列表时自动清理。
    • 底层复用 Host 半既有的 readSandboxFile:单文件 ≤300 KB,一次最多显示 20000 字符;
      超限会直接拒绝并说明原因(沙箱就是普通目录,更大的文件在系统里打开即可)。

文档

  • 新增 LICENSE(MIT) 与 README.en.md(英文文档),中英文 README 顶部互相链接。
  • README.md 与 使用教程.md 同步补上文件预览的用法与硬上限说明,并移除已过时的「暂不支持预览」表述。
  • README.en.md 为完整英文版:特性 / 原理 / 安装 / 使用 / 配置 / HTTP 接口 / 数据布局 / 隔离模型 / 已验证行为 / 已知限制 / 开发。

升级说明

本版只有 Client 半与文档变更,Host 半一行未改,因此:

git pull

之后无需重启 dsh —— 浏览器会自动重载面板,GET /isolation-pod/status 的 build 仍是 5。
沙箱行为、工具白名单、返回与导出流程均与 v0.1.0 完全一致。


完整对比:v0.1.0...v0.1.1

隔离舱 v0.1.0 —— 首个可用版本

Choose a tag to compare

@Teow9 Teow9 released this 14 Sep 15:57

首个可用版本:一个常驻的 DSH 插件,在主会话之外运行受沙箱约束的隔离任务。主会话默认完全无感 —— 不写入消息、不进入模型上下文、界面消息流无痕迹;结果返回与文件导出都必须由用户手动确认。

亮点

  • 沙箱是系统级强制:沙箱根目录内可读写,根目录外只能读;越界写入由 DSH 文件沙箱硬拒绝。任务开跑前还有一次越界写自检,未被拒绝就中止任务,绝不带着失效的沙箱开跑。
  • 工具白名单强制生效:白名单以外的工具调用被 guard 直接打回,不靠提示词自觉。
  • 主会话零痕迹:隔离任务在独立子会话中运行,全程不向主会话写入任何内容;只有手动点「返回主会话」才会注入一条可自由编辑的精简结果。
  • 返回与导出互不触发:导出默认单次授权,每次都要重新确认;复制模式可在「导出记录」撤销。
  • 常驻免审批:作为 patch 行随 dsh 启动加载,重启后自动恢复配置、任务与导出记录,不出现审批卡片。
  • 多轮对话:任务详情即对话视图,可就同一会话继续追问,并能展开查看模型的思考过程。

安装

git clone https://github.com/Teow9/dsh-isolation-pod

在 <DSH_HOME>\profiles\<profile>\cordis.patch.yml 中加入:

- insert:
    - id: dsh-isolation-pod
      name: '<仓库绝对路径>\lib\index.js'

重启 dsh,侧边栏即出现「隔离舱」入口。零 npm 依赖、不需要构建。
上手走查见仓库内 使用教程.md,原理与接口见 README.md。

变更内容

[0.1.0] - 2026-09-14

首个可用版本:一个常驻的 DSH 插件,在主会话之外运行受沙箱约束的隔离任务,
主会话默认完全无感,结果返回与文件导出都必须手动确认。

新增

  • 隔离执行引擎(Host 半):每个任务创建一个独立子会话
    (origin: subagent,cwd = 沙箱根目录),在 setup 窗口写入 sandbox/mode 与 approval/policy、
    挂载 agent preset、安装工具 guard 与 isolation-pod/rules 系统提示段。
  • 越界写预检:任务开跑前向沙箱外写探针,必须被系统拒绝才放行;否则任务立即失败
    (记录 fsDenied,面板显示「越界写已被拒绝」)。
  • 工具白名单:tools.guard() 为权威拦截(restrict() 仅作补充),白名单外的调用直接报错;
    write/edit 额外做一次路径归属校验。
  • HTTP 接口:GET /isolation-pod/status(本地诊断,无需令牌)与
    POST /isolation-pod/api(x-ipp-token 门禁,14 个方法)。
  • 持久化:配置、任务与导出记录写入 <DSH_HOME>/isolation-pod.json
    (临时文件 + rename 原子替换,变更后 800 ms 防抖);重启时把仍在运行的任务标记为 interrupted。
  • 执行记录:会话事件折叠为转写条目(user / prompt / assistant / tool / turn,
    并单独保留 reasoning 思考块);内存上限 500 条/任务、落盘镜像 80 条;
    本地副本缺失时经 sessionQuery.readSession(子会话ID) 从子会话自己的落盘日志回填。
  • 多轮对话:followUp 往同一个常驻子 Agent 续发消息,沙箱、审批策略、工具 guard 与系统提示词
    原样复用;turns 逐轮累加,每轮独立超时并可停止。
  • 面板(Client 半):侧边栏入口 + 四个页签(任务 / 新建 / 配置 / 导出记录);
    任务详情为对话视图 —— 分角色气泡、工具调用行、轮次分隔线、可折叠的思考过程与首轮指令。
  • 结果返回:previewReturn 生成可自由编辑的预览文本,returnToMain 注入主会话一条精简结果。
  • 文件导出:复制 / 移动两种方式,冲突策略覆盖 / 跳过 / 重命名;每次导出单独确认,
    复制模式可在「导出记录」撤销。
  • 令牌自愈:dsh 重启后已打开的页面持旧令牌时,客户端遇 403 会重新抓取同源 / 解析新令牌重试,
    因此无需刷新页面;确实失败时面板显示错误横幅而非停在「加载中…」。
  • 沙箱告警:仅当沙箱根目录落在当前会话的工作区内时才提示会产生可见产物。

安全

  • 主会话默认零痕迹:隔离任务不向主会话写入任何事件,唯一入口是用户手动的 returnToMain。
  • 沙箱外写入由 DSH 文件沙箱硬拒绝;清理操作不触碰主会话与沙箱之外的任何文件。
  • 导出目标必须位于沙箱之外,且每次导出都需要重新确认,不存在自动延续的授权。

已知限制

  • 平台:Windows 专有实现(目录创建/删除/导出走 PowerShell),macOS / Linux 未验证。
  • profile:需要带 Web UI 的 profile(inject 了 webServer),且不可写入 home 级 patch。
  • shell 沙箱在 Windows 上是 partial(ACL 受限令牌);只有文件系统沙箱是硬拒绝。
  • 多轮对话不跨进程:dsh 重启后旧任务只能查看与导出。
  • 面板当前只列文件清单,不做文件内容预览(可经 readSandboxFile 接口读取,≤300 KB)。

已知限制

  • 平台:Windows 专有实现(目录创建/删除/导出走 PowerShell),macOS / Linux 未验证。
  • profile:需要带 Web UI 的 profile,且不可写入 home 级 patch(否则会波及其它 profile)。
  • shell 沙箱在 Windows 上是 partial(ACL 受限令牌);只有文件系统沙箱是硬拒绝。
  • 多轮对话不跨进程:dsh 重启后旧任务只能查看与导出。
  • 面板当前只列文件清单,不做文件内容预览(可经 readSandboxFile 接口读取,≤300 KB)。

完整对比:https://github.com/Teow9/dsh-isolation-pod/commits/v0.1.0