When a dsh turn gets interrupted — by a web restart or an upstream hiccup (rate limit, 5xx, quota error) — this plugin auto-injects a "continue" so your session picks up where it left off, with a dead-loop guard that hands back control if the retry produces nothing.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-autoresume
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:shengyvself/dsh-autoresume
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
What you get
- 🔁 Auto-resume on Web restart —— after a dsh web restart, the plugin scans all sessions and picks up the interrupted ones; completed / settled / cancelled sessions are left alone.
- 🌐 Transient upstream recovery —— rate limits (429), 5xx, network errors (ECONNRESET / timeout), gateway 504, upstream provider faults —— the plugin injects "continue" and the turn retries automatically.
- 💳 Quota / billing recognition —— 402 / QUOTA / insufficient_balance / insufficient_quota: inject once (covers recovery after top-up), then go settled on repeat failure to prevent infinite loops.
- 🛡️ Dead-loop guard —— if the previous "continue" produced no content and the same error recurs, the plugin falls back to settled and hands control back to you.
- 📥 Queue guard —— if the inbox has someone else's pending message (user / client), the plugin does nothing at all (no inject, no resume), avoiding waking the user's message into the session.
- ⏱️ liveWatch —— keeps polling after boot to catch failures that recur during a run (previously only worked once per restart).
- 🔢 Two-shot auto-continue —— transient network failures (429 / rate limits) are allowed to inject → fail → inject again → fail → stop, suited to long rate-limit windows; quota failures stay one-shot.
- 🌍 Cross-platform —— Linux / macOS / Windows behave identically (
os.homedir()+node:path, path separators auto-adapt).
Install
dsh plugin --profile web add dsh-autoresume
After installing, restart dsh web. The plugin will scan and inject within the boot grace window (default 30 minutes, configurable via bootGraceMs).
Requires DSH client packages >=0.1.5-rc.2. Depends on @deepseek-ai/dsh-agent (reuses the DSH runtime copy, zero version drift).
You can also install directly from GitHub:
dsh plugin --profile web add github:shengyvself/dsh-autoresume
What you can do with it
After installing, just use DSH normally — the plugin works in the background. Typical scenarios:
- "I just changed code and restarted dsh web" —— the plugin scans and picks up the interrupted dev session
- "The upstream model hit a rate limit" —— after 429 / rate_limit_exceeded, the plugin injects "continue" and the turn retries
- "That 504 gateway timeout earlier" —— gateway HTML error envelopes are recursively unwrapped, correctly judged as network failure, "continue" injected
- "Out of balance, just topped up" —— first 402 injects once (covers recovery after top-up), then settles automatically on repeat failure
The plugin never acts on its own; it only judges and injects on web restart or liveWatch poll.
Compatibility
| Use case | DSH version | Plugin version |
|---|---|---|
| Recommended | 0.1.5-rc.2+ (currently maintained) |
0.0.21 |
| Minimum compatible | 0.1.5-rc.2+ |
0.0.21 |
Installing the plugin does not upgrade the host DSH. The peerDependencies declare a minimum client-package version of >=0.1.5-rc.2; verified working on 0.1.5-rc.2.
Configuration
| Key | Default | Description |
|---|---|---|
targetSessionId |
full scan | When set, only serve that session (compatibility mode) |
bootGraceMs |
30000 (30 min) |
Grace window after web boot for judging |
initialDelayMs |
3000 |
Initial check delay |
pollIntervalMs |
5000 |
Poll interval when session not ready |
promptText |
继续(自动) |
Injected message body |
liveWatch |
true |
Keep polling after boot to catch mid-run failures |
maxResumeAttempts |
2 |
Max consecutive auto-continue attempts for transient failures |
skipWhenInputPending |
true |
Queue guard: skip injection if inbox has someone else's pending message |
Security
- Reads session event streams only (
ctx.sessionPersistence); never writes user files. - Injected messages are sent as plugin identity (
source.kind=plugin, form=notice), never disguised as user messages. - No network calls. Except for calling DSH's internal
ctx.agents.get()/agent.followup(), there are no outbound requests. - Triple protection: dead-loop guard + quota infinite-loop guard + queue guard, to avoid false positives.
Dependency notes
@deepseek-ai/dsh-agent is declared in peerDependencies (provided by the host DSH).
⚠️ Known issue: package.json's dependencies also lists @deepseek-ai/dsh-agent: 0.1.1-rc.2 —— this violates the persona §三.1.3 rule (official @deepseek-ai/* packages go only to peerDependencies). The current install path is a manual symlink reusing the DSH runtime copy, avoiding version drift. Will be cleaned up in the next release.
Version history
Full changelog: CHANGELOG.md. Key milestones:
- v0.0.21 (2026-09-13): Auto-resume chain fix (0.1.5
inspect()removed →open/read/close;AgentSetupcallback signature change) - v0.0.19 (2026-09-13): Queue guard + DSH 0.1.5 session generation adaptation
- v0.0.18 (2026-09-08): Two-shot auto-continue (SenseNova decision)
- v0.0.17 (2026-09-02): tpm/rpm rate-limit recognition
- v0.0.16 (2026-09-01): Startup crash fix (defensive
getAgent()) - v0.0.15 (2026-09-01): 402/400/Chinese transient recovery + quota infinite-loop guard
- v0.0.13 (2026-08-31): OpenRouter upstream provider fault recognition
- v0.0.12 (2026-08-31): 504/gateway timeout recursive envelope unwrap
- v0.0.9 (2026-08-24): liveWatch + dead-loop guard
- v0.0.8 (2026-08-24): Network-failure stop recognition
Build & development
npm run build
npm test
License
Apache License 2.0 © shengyvself
Links
More in this category
Q00/ouroboros#integrations/dsh-plugin★ 6173
Config-only bundle that mounts Ouroboros through the DSH MCP client, exposing 36 interview, Seed, execution, evaluation, and evolution workflow tools in DSH.
loopx-project/loopx#dsh-loopx-plugin★ 6136
LoopX, a provider-neutral, local-first state kernel and control plane for long-horizon agents: keeps Goal, Todo, gate, evidence, quota, recovery, and handoff state above DeepSeek Harness, while the plugin bootstraps the CLI and skills, admits bounded same-session continuation, and adds a loopback GoalBar for the exact bound loop.
chuspeeism/dashi-taskboard#deepseek-harness★ 3276
Embeds the active installed Codex Taskboard runtime in the DeepSeek Harness sidebar, using its launcher runtime descriptor instead of a fixed port.
NanmiCoder/dsh-agent-teams★ 1893
AgentTeams multi-agent teams.
EthanYoQ/AI-Novel-Writer#dsh-ai-novel-writer★ 1263
Installs a dedicated AI novel-writing preset and workbench: revisioned local project assets, a compact side drawer, and native approval-gated single-file changes.
tong-io/tongflow#dsh-tongflow★ 1035
TongFlow film-crew studio for image, voice, music and video production: the agent writes per-asset TongFlow workflow files (.tongflow.json) that run through TongFlow plugins, with an embedded workflow canvas, a shot/character/take project layout and a manga-drama template; sessions starting with @tongflow open the Studio view.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.