DeepSeek Harness Toolkit — dsh-minato
A no-terminal-needed installer, monitor, backup and repair toolbox for DeepSeek Harness (dsh). Windows and Linux. Runs locally. No telemetry, no accounts, no uploads.
⚠️ Unofficial. This project is not affiliated with, endorsed by, or connected to DeepSeek. It is a third-party helper that drives the
dshcommand line you already have.
Screenshots
Everything below is the real interface, captured against a fixture data directory — no real session, path or figure appears in these images.
| Dashboard | Sessions & tokens | Backup |
|---|---|---|
![]() |
![]() |
![]() |
| Health check | Settings | Update centre |
|---|---|---|
![]() |
![]() |
![]() |
| Overview | Plugins | About | Logs |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| CLI menu | CLI status |
|---|---|
![]() |
![]() |
Why this exists
dsh is a command-line tool. Installing it, starting it, backing it up and working out why it will not boot are all
terminal jobs — and the Web UI itself has no entry point for any of them.
This toolkit puts those jobs behind a window you can double-click:
- No terminal needed — install, start, stop, update and uninstall from a GUI.
- A backup you can trust — packages carry a completion marker and a content hash, so a truncated one is refused instead of silently restored.
- A straight answer when something breaks — the health check names the failing piece and prints the one line that fixes it, instead of leaving you with a stack trace.
What it does
| Install dsh | Double-click. No terminal, no Node.js knowledge required. It installs the CLI, sets up the PATH and Start-menu entry, and keeps an uninstaller beside the install. |
| Start / stop / monitor | One button for the Web UI, with a live status line and the URL to open. |
| Back up and restore | Sessions, settings and credentials — packaged with a completion marker and a content hash so a truncated or tampered package is refused rather than restored. |
| Backup manager | See exactly what each package contains before you touch it. |
| Migrate to another PC | Export a package, import it on the new machine. |
| Update centre | One place for the web UI, the official desktop app, this tool, and installed plugins. |
| Health check | "What exactly is broken?" — it names the failing piece and prints the one line that fixes it. |
| Uninstall | Never deletes your data by default, and refuses to delete a directory that does not look like an install. |
Install
Windows
Download dsh-minato-<version>-win-x64-setup.exe from Releases and run it.
- The Windows binaries are not digitally signed, so SmartScreen may show an "unknown publisher" prompt the first
time. Verify the download against the published
.sha256(and the GPG-signedhashes.txt) before running it. - Prefer a portable copy? Use
dsh-minato-win-x64.zip, unzip, and rungui\dsht-gui.exe.
Linux
Download dsh-minato-linux-x64.tar.gz, then:
tar -xzf dsh-minato-linux-x64.tar.gz
cd dsh-minato-linux-x64
./install.sh # installs for the current user; --prefix <dir> to choose the location
Uninstall with ./install.sh --uninstall (add --force only if you have moved the installation yourself).
Quick start
- Install (above) and open dsh-minato.
- The dashboard shows the current state. If
dshis missing, the health check says so and offers the fix. - Press Start and open the Web UI URL it prints.
- Before you change anything, press Backup.
The GUI
Ten pages, all reachable from the left rail:
| Page | What it is for |
|---|---|
| Overview | One screen: what is installed, what is running, what is out of date. |
| Dashboard | Key figures — sessions, cache-hit rate, tokens — and one-click start/stop. |
| Sessions & tokens | Per-session breakdown, parent/child grouping, sortable. |
| Plugins | Which plugins a profile has, which are disabled, and which would break a boot. |
| Backup | Create, inspect, verify, restore, export and delete packages. |
| Health check | The "what is broken" report, with the exact prescription. Run it when you want it — it does not run by itself. |
| Settings | Language, port, behaviour — without editing YAML. |
| About | Version, credits, and what this tool deliberately does not do. |
| Update centre | Update dsh, the desktop app, this tool or a plugin. |
| Logs | Filter, search and export the launcher log. |
Command line
The GUI drives the same CLI, which is also usable on its own:
dsh-minato status [--detail] what is installed / running / listening
dsh-minato start | stop start or stop the dsh Web UI
dsh-minato install | update install or update dsh (and this tool)
dsh-minato uninstall remove the tool (never touches your data)
dsh-minato sessions per-session token and cache figures
dsh-minato cost [--days 7|14|30] tokens and an **estimated** USD amount (needs your own unit prices; no prices = no amount)
dsh-minato backup [--to <dir>] create a backup package
dsh-minato backup-list [--verify] list packages, and verify their contents
dsh-minato backup-dir [--set <d>] where backups are written
dsh-minato restore --path <pkg> [--apply] [--yes]
dsh-minato backup-export | backup-delete
dsh-minato doctor full health check, with prescriptions
dsh-minato profiles | profilecheck | profilepatch | bridge-install
dsh-minato bootdiag why did dsh fail to start?
dsh-minato verify-install check the files you downloaded
dsh-minato balance DeepSeek account balance (needs a key in settings)
dsh-minato log | config-get | config-set | autostart | shortcut
dsh-minato ui launch the GUI bundled with this package (exit 1 if it is missing)
dsh-minato version | about | selftest
Every command prints machine-readable markers (STATUS_OK, BACKUP_OK, RESTORE_FAIL, …) so scripts and the GUI can
parse results instead of guessing from prose.
Safety and privacy — what is actually true
This section states only what the code does. If a claim here is not backed by the code, it is a bug; please report it.
- Local only. The tool reads and writes your own machine. It contacts the network only in these commands:
check,update-info,update-center,doctor,install,update,verify-install --url, andbalance(only when you have setbalance_keyin settings; without it the command is fully offline). Everything else — status, sessions, cost, backup, restore, logs — never opens a connection. - No telemetry, no accounts, no uploads.
- Your data is not deleted by uninstall. Uninstall removes the tool's own files. Data removal is a separate, explicit action.
- Backup integrity is checked, not assumed. A package carries a completion marker written last and a per-file hash; a package that was interrupted, or whose contents changed, is refused.
- Zero third-party runtime dependencies for the CLI, the installer, the launcher and the dsh plugin. The GUI is built on Avalonia (a UI framework), which is the one exception.
- Your API key, if you set one, is stored in plain text in your local config file and is only ever sent to the
DeepSeek API endpoint by the
balancecommand. Leave it empty and nothing is stored.
Known limits
Size: the self-contained Windows package is roughly 50 MB (the .NET runtime is inside it, so no runtime install is needed).
Not digitally signed: verify the published
.sha256and the GPG signature instead of relying on a certificate.No v2.x UI fallback:
uionly starts the GUI bundled with this package (thedsht-guiexecutable in thegui/folder, or whateverDSHT_GUIpoints at). If it is missing it printsUI_FAILand exits 1 - it does not fall back to the retired v2.x interface.The bridge plugin needs pnpm (
npm i -g pnpm);dshwill not install it for you.The
desktopprofile is managed by the official desktop app — plugins for it are added from that app's own dialog, not from the command line.backup-exportwas broken in every published release from 3.0.0 through 3.0.6: it always failed on a non-empty package (files were copied but the sibling.manifestwas not written, andBKEXPORT_FAILwas printed). Fixed in 3.0.7 (BKEXPORT_OK+ sibling marker + end-to-end assertions).CLI exit codes (fully adjudicated 2026-10-30, policy A):
0for success and for plans/read-only previews;1for a refusal or a failed operation (including "the thing you asked about cannot be found / read / verified");2for a usage error (missing, invalid or conflicting arguments);3when the startup self-integrity check refuses to run. Paths that are explicitly degraded or skipped stay0and say so on their own marker line (RESTORE_WS_SKIPPED,INTEGRITY_SKIPPED,PROFILECHK_SKIPPED_VENDOR,BRIDGE_FAIL_RAWand the*_PRE_BACKUP_FAILEDdiagnostics). Every family below has an end-to-end assertion inv3/tests/verify_exit_codes.ps1; the per-family verdict, reason and not-covered list isdocs/退出码裁决-2026-10-30.md(Chinese, authoritative).Command Success / plan Failure / refusal 1Usage error 2config-setCONFIGSET_OKwrite did not take effect unknown key / invalid value backup-dirBACKUP_DIR/_OK/_RESETcannot delete/create/save relative or unparsable path restoreRESTORE_OKno backups, outside root, invalid/incomplete package, rollback failed missing --pathrestore --dry-runDRYRUN_OKno valid backup, invalid/incomplete package — wipewith --yes: manual-delete path onlymissing --yes; cannot compute the path— backup-deleteBKDEL_PLAN/BKDEL_OKoutside root, not a backup, stale confirm time, delete failed missing --path, bad--confirm-timeformatbackup-exportBKEXPORT_PLAN/BKEXPORT_OKoutside root, not found, nested/invalid target, export failed missing --path/--toimportIMPORT_PLAN/IMPORT_OKsource missing, empty/invalid package, copy failed missing --path, unparsable pathverify-installVERIFY_OK 1file missing, manifest missing/unreadable, not in manifest, hash mismatch — startSTART_OK/START_PLANport held by non-dsh, launch failed, not ready in 30 s invalid --profilestopSTOP_OK/STOP_PLANno running dsh, non-dsh listener, safety refusals, still listening — bridge-installBRIDGE_OK/BRIDGE_PLANplugin/dsh/pnpm missing, install or patch failed, desktop-managed profile invalid --profileuiUI_OKbundled GUI not found (no v2.x fallback), DSHT_GUImissing/unexecutable, launch failed— profilepatchPROFILEPATCH_PLAN/_DRYRUN/_OK/_NOOPpatch file missing, invalid plan, apply failed missing --profile, invalid profile nameprofilesPROFILES_OKprofiles directory not found — bootdiagBOOTDIAG_OKfile unreadable, output unrecognised missing --fromdoctor --reportDOCTOR_REPORTreport write failed ( DOCTOR_WRITE_FAIL)— log --exportLOG_EXPORTexport write failed ( LOG_FAIL)— sessionsSESSIONS_OKno readable projection, lineage (bridge plugin) unavailable bad --days/--from/--to/--level, conflicting rangecostCOST_META/COST_TOTALno readable projection, lineage (bridge plugin) unavailable same argument errors as sessionsinstall/update*_PLAN/*_OK/*_SKIPnode bootstrap failed, version list/latest unavailable, npm failed, rollback only unsafe --versionuninstallUNINSTALL_PLAN/UNINSTALL_OK/UNINSTALL_SKIPnpm failed and dsh still observed — wipenever deletes anything regardless of exit code; that is intentional, not a failure.Test counts are not proof of individual safety promises: an all-green contract/GUI/plugin suite only shows regression coverage — the broken export command and the inaccurate exit codes both existed while every suite was green. Treat per-promise end-to-end assertions and fix records as the evidence.
Subagent-inclusive statistics are not implemented yet (含子代理统计:未实现(待第二批;需读原始日志)): the on-disk session projection carries no lineage fields at all (verified across the full store), so a projection-only "include subagents" count would silently miss edges. The GUI scope selector greys those modes out with a "batch 2" label, and
sessions --levelrefuses anything butglobalwith an honestSESSIONS_FAILinstead of guessing.
Optional bridge plugin
dsh keeps one fact only it knows: which sessions are alive inside its process. That is not written to disk, so
without the plugin that column reads unknown.
| Without the plugin | With the plugin | |
|---|---|---|
| Session list, tokens, cache-hit rate, speed | yes (read from the on-disk projection) | yes |
| "running" / "parked" marker | unknown |
live, in-process |
| Dashboard lineage scopes (parents / parents + sub-agents) | only "global"; the other two stay disabled | all three scopes |
It is read-only: no model requests, no writes to dsh state, no conversation content, no network, and it never blocks dsh.
For the lineage scopes it reads the raw session logs under ~/.dsh/sessions directly from disk and decodes only the
first zstd frame header of each file (parentSession / origin / createdAt, at most 64 KiB read per file) —
body frames are never decompressed and message content is never touched. Decode failures are counted and reported,
never guessed.
Install it with:
dsh-minato bridge-install --profile web --yes
# or paste the repository URL into the desktop app's add-plugin dialog
Everything else in this toolkit works without it.
License and credits
- MIT License. The code is MIT; the icons are not — see
docs/ASSETS.md. - DeepSeek Harness (dsh)
- AI assistance, stated plainly: the v1 script was assisted by SOGR-Momono Dango (QwenPaw); the v2 rewrite and packaging by DeepSeek DSH; v3 and this document were written mostly by AI coding agents, with every change reviewed, decided and accepted by the maintainer. The logo is generative-AI output (tool: Kimi); prompts by the maintainer.
- This does not mean "AI wrote it, so it is untrustworthy" or "AI wrote it, so it is fine" — the basis for judgement should be whether you can check it yourself: every artefact ships with SHA-256, and the CLI, the installer and the launcher are all reviewable source.
- GitHub: @sakanamaru












No comments yet. Be the first to write one.