通过提供 `ctx.fs` 与 `ctx.subprocess` 接缝,把 agent 的文件系统、bash 与 PTY 终端跑在 Docker 容器里;工作目录、环境变量与后台进程可在 harness 重启后存活。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:frozo-ai/dsh-worlds
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本。请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
该插件的 README 只有英文版本。
Run the agent's execution world inside a container — so it survives the harness that started it.
DeepSeek Harness records this limitation in packages/terminal/terminal/README.md:
"Sessions are process-local and are not restored after a harness restart."
The session log is durable. The computer the agent was working on is not — the shell dies with the harness, taking your cwd, exported variables, and background processes with it.
dsh-worlds fixes that by moving the execution world into a Docker container. No CRIU, no microVMs: a container simply outlives its client.
harness process A harness process B (a different process)
| |
+------> [ container: dsh-world ] <--+
cwd · env · running procs
Why two plugins move everything
From the harness's own architecture docs:
"The existing
dsh-bash-local,dsh-terminal-bash, anddsh-lsp-stdioneed no forks. They delegate every execution-world operation toctx.fsandctx.subprocess."
Implement those two seams and Bash, persistent PTY terminals, LSP, and every file tool relocate into the container automatically. That is a deliberate architectural gift, and this project is what happens when you take it.
Status
| Capability | Checks |
|---|---|
| Docker Engine API client + stream demux | 11 unit + 12 live |
ctx.fs — all 12 methods |
38 live |
| Bounded collect buffers (offset-based, non-consuming) | 11 unit |
ctx.subprocess — spawn, tree termination, waitForExit |
22 live |
PTY — spawnTerminal, resize, foreground signalling |
17 live |
| Total | 111 |
Zero npm dependencies. node:http, node:net, node:crypto only.
Try it
Requires Docker and a dsh checkout that has been built.
git clone https://github.com/frozo-ai/dsh-worlds
cd dsh-worlds
npm test # unit suites, no Docker needed
npm run verify # live: Docker client
npm run verify:fs # live: filesystem provider
npm run verify:subprocess
npm run verify:terminal
Then install it into a dsh profile — it ships a dsh.bundle manifest, so it
mounts by package name with no path editing:
dsh plugin --profile headless add github:frozo-ai/dsh-worlds
Add dsh-worlds to the profile's dsh.profile.bundles, then run normally —
no --patch flag needed:
dsh --profile headless "use the terminal tool and run: tty; cat /etc/alpine-release"
# -> /dev/pts/0
# 3.24.1
The demo
# harness A: create state, start a background process, then exit
dsh --profile headless "bash: echo session-state-v1 > /srv/state.txt && (nohup sleep 900 &)"
# harness B: a brand new process, same world
dsh --profile headless "bash: cat /srv/state.txt; ps -o args | grep '[s]leep 900'"
# -> session-state-v1
# sleep 900 <-- started by a harness that no longer exists
Honest limits
- The container is the boundary, not the sandbox seam. The overlay disables
sandbox,bash-sandboxandpermission-presets, and forcesdanger-full-access. Per-call sandbox modes (read-only/workspace-write) are no longer enforced at the bash layer. Host confinement is meaningless for a process that isn't on this kernel — but the container fences the host, not the workspace, which is coarser. stdin: 'pipe'(ongoing protocol writes) is not implemented; it rejects loudly rather than hanging. Batchstdin: { data }works.inputWaitingis a heuristic — a blocked tty read and an idle sleep are indistinguishable from/procalone.- The image must provide
bash,ps, andbase64.DockerWorldinstallsbash/procpsvia apk or apt when missing, and fails loudly if it can't. - Path mirroring: dsh passes the host workspace path as cwd and the provider creates it inside the container. Real workspace access needs a bind mount (
bindsinWorldConfig). - dsh itself is a developer preview with breaking changes; pin versions.
SCOPE.md carries the full interface map, size benchmarks, and every bug found along the way.
MIT. Not affiliated with DeepSeek AI.
链接
同类插件
strukto-ai/mirage#dsh★ 3516
把文件系统与 bash 提供者换成 mirage 虚拟工作区:文件工具与 shell 命令作用于挂载的资源(RAM、S3、Redis、Slack、Gmail、Notion、Postgres)而非宿主磁盘,支持按挂载点设置读/写/执行模式、按命令选择沙箱(进程内 monty、pyodide、quickjs;远程 docker、e2b、daytona),并可在虚拟终端中安装 CLI(git、gh、slack、linear、ntn、gws,或自行注册的程序树)作为命令头词。
hust-open-atom-club/oh-dsh★ 252
社区发行版:TUI、桌面端与 Web UI 统一体验,分层安装、一步到位。
lire1131/dsh-undo-plugin★ 85
DSH 撤销/回退系统:配置变更自动存档,一键撤销/恢复/回退到任意版本,支持 WebUI 与离线 CLI/GUI 工具(DSH 启动失败也能救)。
Jayden-X-L/forkprobe★ 67
同一任务并行试跑多个技能,对比结果选出最优。
forrestchang/dsh-multica-runtime★ 48
让 dsh 运行时跑在 Multica 上。
omdsh-dev/dsh-plugin-check★ 24
插件健康检查:扫描清单协议/patch 格式/构建陷阱,零依赖只读。