Runs the agent's filesystem, bash and PTY terminals inside a Docker container by providing the `ctx.fs` and `ctx.subprocess` seams, so cwd, environment and background processes survive a harness restart.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:frozo-ai/dsh-worlds
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
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.
Links
More in this category
yjh051108/dsh-routing-suite★ 6991
One repository, three parts: a runtime injector for DSH plugin packages (inject, hot-reload, unload, promote a dev staging tool to the front, route self-heal, plus a settings-page plugin manager that lists, unloads and drags folders in to internalize), a task-aware reasoning-mode router agent preset (router-standard / router-spec / router-react), and a graded two-level task protocol whose six tools (commit_star, lock_stage, revise_do, edit_plan, mark_task, redteam_verdict) pin task state to disk. The injector implementation ships in-tree, so the install carries its own behaviour rather than a dependency list.
strukto-ai/mirage#dsh★ 3674
Swaps the filesystem and bash providers for a mirage virtual workspace: file tools and shell commands run over mounted resources (RAM, S3, Redis, Slack, Gmail, Notion, Postgres) instead of the host disk, with per-mount read/write/exec modes, per-command sandbox routing (monty, pyodide, quickjs in process; docker, e2b, daytona remote), and installed CLIs (git, gh, slack, linear, ntn, gws, or one you register) as head words in the virtual terminal.
hust-open-atom-club/oh-dsh★ 326
Community distribution: TUI, desktop, and Web UI as one bundle with layered installation.
weijiafu14/pi2dsh★ 211
Pi Host ABI compatibility engine: after one install, unmodified Pi extensions from npm mount as native DSH plugins with `dsh plugin add <pi-package>`. Verified end to end on stock DSH with pi-mcp-adapter (full MCP manager: OAuth, resources, prompts, MCP Apps, elicitation, sampling), @tintinweb/pi-subagents, pi-code, pi-hermes-memory and pi-background-tasks; `pi2dsh inspect` reports a package's compatibility before installing.
Fishquito7/dsh-skill-mcp-panel★ 172
Manages DSH skills and MCP servers from the web settings: skill cards with hot enable/disable, workspace scopes, groups, batch migration and drag-and-drop import, plus stdio/HTTP MCP CRUD with connection tests, secret redaction and the unified dsh-panel CLI.
lire1131/dsh-undo-savepoint★ 170
Undo/redo & rollback system for DSH: every config change is auto-snapshotted; undo/redo/restore to any version from the WebUI or the offline CLI/GUI tools (works even when DSH fails to boot).
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.