deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:GHJIVHIDD/dsh-plugin-container
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
DeepSeek Harness(DSH)的 Docker 容器沙箱 部署级插件。
在会话视图环中新增「容器」页签,提供 仅观察 / 干预 双模式原生 UI、39 个docker_*模型工具、15 个/dock-api/*HTTP 路由,并完整对齐官方dsh-plugin-vm-sandboxv0.1.0 的全部能力:快照/回滚、文件传输、端口转发、后台任务、审计、共享协作、配额与回收、网络策略、自定义资源、初始化脚本、多容器并行执行、增强状态查询。
官方 dsh-plugin-vm-sandbox 依赖 OrbStack(macOS 专属)。Linux 用户与 Windows 用户没有 OrbStack,就无法获得会话级沙箱能力。
本插件以 本地 Docker Engine 作为底层,把 VM 沙箱的能力一一映射到 Docker:
| 能力 | dsh-plugin-vm-sandbox | dsh-plugin-container v1.0.0 |
|---|---|---|
| 清单 / 创建 / 删除 | vm_list / vm_create / vm_delete |
docker_ps / docker_create / docker_run / docker_rm |
| 生命周期 | vm_start / vm_stop / vm_restart |
docker_start / docker_stop / docker_restart |
| 增强状态 | vm_status |
docker_status |
| 快照 / 回滚 | vm_snapshot / vm_snapshot_list / vm_restore / vm_snapshot_delete |
docker_snapshot / docker_snapshot_list / docker_restore / docker_snapshot_delete |
| 文件传输 | vm_upload / vm_download |
docker_upload / docker_download |
| 端口转发 | vm_port_forward / vm_port_forward_list / vm_port_forward_stop |
docker_port_forward / docker_port_forward_list / docker_port_forward_stop |
| 后台任务 | vm_job_submit / vm_job_list / vm_job_status / vm_job_stop / vm_job_output |
docker_job_submit / docker_job_list / docker_job_status / docker_job_stop / docker_job_output |
| 操作审计 | vm_audit |
docker_audit |
| 共享协作 | vm_share / vm_unshare / vm_policy |
docker_share / docker_unshare / docker_policy |
| 网络策略 | vm_network |
docker_network_policy |
| 命令执行 | vm_exec(支持 machines 并行) |
docker_exec(支持 containers 并行) |
| 自定义资源 | cpus / memory / disk |
cpus / memory / memory_swap / shm_size / pids_limit / disk_quota |
| 初始化脚本 | init_script / cloud_init |
init_script / command |
Docker 与 OrbStack 是两种不同抽象:OrbStack 的
orb clone按需复制磁盘、orb push/pull直接进入 VM;Docker 版本使用docker commit镜像快照与docker cp文件传输,语义等价、实现完全 Docker-native。网络策略则通过dsh-sandbox公网 bridge 与dsh-sandbox-internal内部网络(docker network create --internal)实现。
webServer 暴露的 /dock-api/* 标准 HTTP 路由获取。dsh-plugin-vm-sandbox 仓库布局(根包 prepare → dsh-plugin-container/lib 发布入口;内层 dsh-plugin-container/ 为 npm 发布包;cordis.patch.yml 自动插入 ui-container)。docker CLI;Client 半区仅依赖 react 浏览器模块。docker logs 最近 500 行,支持跟随刷新。docker_exec 执行记录(命令 / 耗时 / 退出码 / stdout+stderr)与 只读实时 stdout/stderr 观察流(暂停 / 清空 / 重连,90 秒无读取自动回收)。docker commit 快照;快照列表支持一键恢复 / 删除。--dsw-alias-* 设计令牌,自动适配浅色 / 深色主题与品牌变量。docs/ui-preview.html。docker_snapshot:基于官方 docker commit --change LABEL ... 生成带 dsh.snapshot=1 标签的快照镜像,自动保存来源容器的 run spec(端口 / 卷 / 环境 / 网络 / 资源限额 / 命令)。docker_snapshot_list:列出全部快照及本会话快照。docker_restore:删除当前容器 → 用快照镜像 + 原 run spec 重建 → 按原状态启动 / 保持创建态;快照记录保留,可重复回滚。docker_snapshot_delete:docker rmi -f 永久删除快照镜像。docker_upload / docker_download:基于官方 docker cp,支持文件与目录递归。local_path 强制约束在 DSH 工作区内(sandboxPolicy.workspaceRoot),防止任意宿主机路径读取。docker_port_forward:在容器所在 bridge 网络上启动 alpine/socat 代理容器,-p 127.0.0.1:host_port:proxy_port 映射到本地回环;无需修改原容器、无需重建。host_port;bind_host 仅允许 localhost / 127.0.0.1 / ::1。docker_port_forward_list / docker_port_forward_stop(按 tunnel_id 或 host_port 停止)。docker_job_submit:命令经 base64 写入容器 /tmp/.dsh-jobs/<job-id>/,以 nohup sh run.sh & 在容器内后台执行,不受单次 docker_exec 超时限制。docker_job_list / docker_job_status / docker_job_stop / docker_job_output。docker_cli 直通)统一经过审计包装器:记录 sessionId、容器、操作名、参数摘要、耗时、成功 / 失败与错误。docker_audit 支持按 session / container / operation 过滤。docker_share / docker_unshare:把当前会话容器共享给其他会话;mode=exec(执行 / 传输 / 任务 / 端口转发)或 mode=manage(额外允许生命周期 / 网络 / 快照)。docker_policy:每会话最大容器数(1–8,默认 8)、闲置自动停止分钟数(默认 30)、闲置自动删除天数(默认 0 关闭)。domain/changed、session/disposed 事件驱动 + 每 5 分钟对账。docker_network_policy:public_access / internal_access / isolated / isolate_network。public_access=false:保存当前网络,断开除 dsh-sandbox-internal 外的网络,接入 --internal 内部网络(无法访问公网)。internal_access=false:断开沙箱内部网络。isolated=true:断开全部网络,等价 --network none。isolate_network=true:仅保留内部网络并强制 public_access=false。原有 18 个工具全部保留:docker_info、docker_ps、docker_images、docker_pull、docker_run、docker_start、docker_stop、docker_restart、docker_rm、docker_rmi、docker_logs、docker_exec、docker_inspect、docker_stats、docker_network、docker_volume、docker_build、docker_cli。
浏览器 (client, lib/client.js) Node (host, lib/index.js)
┌────────────────────────────────────────┐ fetch ┌───────────────────────────────────────────┐
│ window.__ModuleLoader__.load({...}) │ ───────▶ │ webServer.register({kind:'exact',...}) │
│ slots.inject('conversation.view') │ │ /dock-api/status|inspect|logs|top|op| │
│ 原生 UI: 模式/统计/创建/详情/日志/Shell │ ◀─────── │ create|shell|snapshot|restore|... │
│ 快照/任务/端口视图 │ JSON ├───────────────────────────────────────────┤
└────────────────────────────────────────┘ │ tools.register × 39 (docker_*) │
│ execFile/spawn('docker', ...) │
│ 状态 ~/.dsh/container-sandbox/state.json │
└───────────────────────────────────────────┘
react;注入 conversation.view(id docker,order 10.5,label「容器」)。ctx.effect 管理,插件卸载时自动清理。confirm 二次确认。docker logs -f 流,不带 stdin,模型无法通过该面板注入命令。docker_upload / docker_download / docker_build 的宿主机路径必须位于工作区内。需要已安装 pnpm 与 dsh CLI:
npx -p @deepseek-ai/dsh dsh plugin --profile web add https://github.com/GHJIVHIDD/dsh-plugin-container
# 或 git 简写
npx -p @deepseek-ai/dsh dsh plugin --profile web add GHJIVHIDD/dsh-plugin-container
安装过程由官方机制自动完成:
dependencies。dsh.bundle 声明自动 reconcile 进 dsh.profile.bundles 层。cordis.patch.yml,自动插入 ui-container 行,无需手工编辑配置。重启 dsh(web 或 headless)后刷新浏览器即可看到「容器」页签。
从 Releases 下载 dsh-plugin-container-1.0.3.tgz,在包所在目录执行:
dsh plugin --profile web add ./dsh-plugin-container-1.0.3.tgz
# 1. 将包复制到 profile 的插件目录
cp -R dsh-plugin-container ~/.dsh/profiles/web/node_modules/@dsh-community/
# 2. 在用户补丁层注册插件行
cat >> ~/.dsh/profiles/web/cordis.patch.yml << 'EOF'
- insert:
- id: ui-container
name: '@dsh-community/dsh-plugin-container'
EOF
# 3. 重启 profile
dsh plugin --profile web remove @dsh-community/dsh-plugin-container
# 手动安装的:移除补丁中的 ui-container 行并删除包目录
dsh --profile web
进入任意会话点击「容器」页签;智能体可直接调用 docker_create、docker_exec、docker_snapshot、docker_upload、docker_job_submit、docker_network_policy 等 39 个工具管理 Docker 沙箱。
web profile。@deepseek-ai/dsh-client-runtime 与 @deepseek-ai/dsh-client-ui-conversation。docker CLI 位于 PATH 且能连接 Docker Engine。alpine/socat(官方镜像,首次使用自动 pull)。仓库内置两级测试,必须全部通过:
# 1. 结构 + 语法 + 39 工具/15 路由 + schema + live docker_info + client 沙箱模拟
npm run verify
# 2. 真实 Docker 集成冒烟:创建/并行 exec/生命周期/上传下载/后台任务/
# 端口转发实测回显/快照回滚/共享/策略/网络策略/审计/清理核验
npm run smoke
# 3. 生成 releases 包并校验 tarball 内容
npm run pack
apply + inject。dsh-plugin-vm-sandbox 对应的 19 组工具 schema 参数逐项比对。docker_info 调用(Docker daemon 不可用时硬失败)。vm 浏览器沙箱中执行,断言 id、apply/inject、slots.inject('conversation.view') 与样式挂载/卸载。docker_info 实时探测。docker_create 带 cpus/memory/shm_size 创建容器,docker_status 校验 owner / running / runtime。docker_exec 双容器并行执行。docker_stop / docker_start / docker_restart。docker_upload / docker_download 内容一致性。alpine/socat echo 容器 + docker_port_forward,宿主机 nc 实测回显,转发停止。docker_snapshot → 修改容器 → docker_restore → 校验快照标记恢复 → docker_snapshot_delete。docker_share 后跨会话 exec、docker_unshare。docker_policy 设置。docker_network_policy 公网关闭 / 内部网络应用 / 恢复。docker_audit 过滤校验。dsh-smoke-* 容器、dsh-pf-* 代理、dsh-snap-* 快照镜像,并验证无残留。dsh-plugin-container/
├── package.json # 仓库根即插件源包(含 dsh.bundle / dsh.client)
├── scripts/
│ ├── prepare.mjs # 根包 prepare:构建 dsh-plugin-container/lib
│ ├── verify.mjs # 严格静态/结构/live 验证
│ ├── smoke.mjs # 真实 Docker 集成冒烟
│ └── package.mjs # 生成并校验 releases tgz
├── dsh-plugin-container/
│ ├── package.json # 内层发布包
│ ├── cordis.patch.yml # 自动插入「容器」页签的 patch 层
│ ├── src/
│ │ ├── index.js # Host 侧实现(39 工具 + 15 路由)
│ │ ├── client.js # 浏览器端原生 UI
│ │ └── types/index.d.ts # Host 类型声明
│ ├── lib/ # prepare 生成的发布入口(已提交)
│ └── scripts/prepare.mjs
├── docs/
│ └── ui-preview.html # UI 静态设计稿(可独立浏览器打开预览)
├── LICENSE
└── README.md
docker_snapshot / docker_snapshot_list / docker_restore / docker_snapshot_deletedocker commit --change LABEL 带标签快照镜像;自动保存/恢复 run spec;限额治理。docker_upload / docker_downloaddocker cp 双向文件传输,工作区路径约束。docker_port_forward / docker_port_forward_list / docker_port_forward_stopalpine/socat 代理容器端口转发,支持本地端口自动分配与回收。docker_job_submit / docker_job_list / docker_job_status / docker_job_stop / docker_job_output/tmp/.dsh-jobs 后台任务执行器,含状态探测与日志输出。docker_auditdocker_share / docker_unshare / docker_policydocker_network_policydocker_statusdocker_createdocker_exec 增强containers 数组并行执行、timeout_ms、Shell 执行记录。docker_run 增强cpus/memory/memory_swap/shm_size/pids_limit/disk_quota、isolated/isolate_network、会话归属登记。dsh-plugin-vm-sandbox(根包 + 内层发布包 + prepare)。scripts/verify.mjs 全面重写:39 工具 / 15 路由 / 19 组 schema 比对 / live daemon 探测 / 浏览器沙箱执行。scripts/smoke.mjs:真实 Docker 18 项集成冒烟与清理核验。scripts/package.mjs:npm pack 生成 releases tgz 并校验 tarball 内容。~/.dsh/container-sandbox/state.json(containers / snapshots / shares / policies / network / jobs / tunnels / audit)。/dock-api/* 路由与 18 个 docker_* 工具全部保留,现有用法不受影响。docker_run / docker_create 默认网络由 bridge 改为 dsh-sandbox(自动创建),便于统一网络策略治理;可通过 network 参数覆盖。pids_limit 留空被透传为 --pids-limit "" 导致 Docker 报 invalid argument "" 的问题;空值现在与未传值一致,不再生成参数。scripts/verify.mjs 新增静态回归断言:buildRunArgs 的 pids-limit 分支必须带非空字符串保护。/dock-api/create 全参数路径实测通过。/dock-api/create 路由错误分支的 sessionId 作用域错误:缺少 session 或创建失败时,catch 分支原先会因未定义变量再次抛错,导致 webServer 返回 400 空响应而不是 JSON 500。scripts/verify.mjs 新增路由错误路径回归:直接调用 /dock-api/create 缺失 session 的 handler,断言返回 JSON 500 且 handler 不 reject。docker_job_stop 主动停止的后台任务,在随后 docker_job_list / docker_job_status 探针中被错误覆盖为 running 的终态污染问题。readJobStatus 现在对 done / error / stopped 三种终态严格保护:终态不会被 docker exec 探针的 running / dead 覆盖,endTime 与退出码同样保持稳定。scripts/smoke.mjs 新增回归断言:提交长任务 → docker_job_stop → docker_job_list 必须保持 stopped 且 endTime 非空。CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: dsh-skill。