# DeepSeek Harness Updater > English overview. The full documentation is in Chinese: > [README.md](README.md) · [源码版更新与GitHub同步说明.md](源码版更新与GitHub同步说明.md) A small Windows desktop tool that manages **DeepSeek Harness** installations on your machine: detect what is installed, compare against the official release, scan plugins/skills, update in one click, and keep local data safe. **Two shapes, one implementation:** | Shape | What it is | How to get it | | --- | --- | --- | | 🖥️ **Desktop app** | Standalone Windows program, no DSH required | [Download the EXE ↗](https://github.com/mutoharohfiqhiabcd-source/dsh-updater/releases/latest) | | 🧩 **DSH web plugin** | Adds **Check / Roll back / Version** buttons to every session header in the DSH web UI | `dsh plugin --profile web add github:mutoharohfiqhiabcd-source/dsh-updater` | The plugin's buttons call this repository's `updater_core.py` — the desktop app and the web plugin share one set of detection and rollback logic. Repository: · DSH upstream: · Announcement thread (DSH Discussions · Show Your Plugins!): --- ## Screenshots ### 🖥️ Desktop app | Main window (light) | Main window (dark) | | --- | --- | | ![Main window, light](images/desktop-01-light.png) | ![Main window, dark](images/desktop-02-dark.png) | | Version-nature explanation | Rollback window | | --- | --- | | ![Version nature](images/desktop-03-type-info.png) | ![Rollback window](images/desktop-04-rollback.png) |
One more: interface language switching (5 languages) ![Language switching](images/desktop-05-language.png)
### 🧩 DSH web plugin Three buttons appear in every session header (the row that already holds the background-jobs chip): ![Three buttons in the session header](images/plugin-01-header-buttons.png) | Roll back: every source backup, armed by a first press and executed by the second | The plugin card under Plugins → Installed | | --- | --- | | ![Rollback panel](images/plugin-02-rollback-panel.png) | ![Plugins page](images/plugin-03-plugins-page.png) | > ⚠️ The plugin runs inside the DSH host process, **outside the workspace > sandbox**: check, roll back, download and launch really touch the disk. --- ## Features | Capability | Description | |---|---| | **Auto-detect** | Scans source checkouts, npm global installs and `.dsh` runtime profiles | | **Version compare** | Source checkouts are compared against GitHub `master`; npm/profile against npm `latest` | | **One-click update** | Source edition: download the official source zip → back up → replace the whole directory | | **Local data kept** | `node_modules` and `.git` are preserved and moved back after the swap | | **Plugin / skill scan** | Lists enabled plugins and skills under `.dsh\skills`, with sizes and install times | | **Skill sync** | Runs `git pull --ff-only` for skills that have a `.git` directory | | **Rollback** | Creates a `*.dsh-bak-` backup before updating; rolls back automatically on failure | | **Multi-language** | 简体中文 / 繁體中文 / English / 日本語 / 한국어, auto-detected from the system language | | **Detect-result cache** | Shows the previous scan result (with its timestamp) immediately on startup, then refreshes in the background | | **Download source** | Opens an item's source (npm package page for plugins, git remote for skills) and remembers it for later update checks | --- ## Two editions | | Source edition | EXE edition | |---|---|---| | How to start | Run `python updater_gui.pyw`, or double-click `启动更新器.bat` | Double-click `DeepSeekHarnessUpdater.exe` | | Requirements | Python 3.10+ with tkinter | None | | Best for | Reading/debugging the code, quick local tests | Handing to someone else | Both are attached to every GitHub Release, together with `SHA256.txt` so you can verify the download. --- ## Quick start ```bat :: Source edition python updater_gui.pyw :: EXE edition — just double-click DeepSeekHarnessUpdater.exe ``` Requirements: * **Updating DSH source:** DeepSeek Harness **must be closed** (the updater aborts if `127.0.0.1:3080` is in use). * `pnpm` is optional — you can tick "run pnpm install after replacing" to sync dependencies. --- ## Install as a DSH plugin This repository is also a **DSH plugin bundle** (`dsh.bundle` in `package.json`). Once installed it appears under **Plugins → Installed** in the DSH sidebar and gives the model a `dsh_updater` tool (`status` / `latest` / `notes` / `download` / `launch`). > Package name: `dsh-updater` on npm already belongs to a different, unrelated > plugin, so this plugin's **npm package name is `dsh-updater-plugin`**. The > repository name and the GitHub install spec are still `dsh-updater`. **GUI:** sidebar → **Plugins** → **Add plugin** → enter either address below → **Install**. **CLI (either one):** ```bat :: from npm (since v0.9.0) dsh plugin --profile web add dsh-updater-plugin :: or from GitHub (this install spec never changed) dsh plugin --profile web add github:mutoharohfiqhiabcd-source/dsh-updater ``` **Restart DSH once** afterwards. The plugin row hot-reloads, but upgrading a version that is already loaded leaves the old Host half in the running process — without a restart the buttons appear and then fail with 404. ### Three buttons in the session header Once installed, every session's header (the row holding the background-jobs chip) gains three buttons: | Button | What it does | | --- | --- | | **↻ Check** | Lists every local DSH installation (source checkout / npm global / runtime profile) with its version instantly, then fills in the upstream latest version and the update-available state asynchronously | | **↩ Roll back** | Lists source backups, npm restore points and profile restore points; the first press arms *Confirm?* and the second performs it — the current directory is saved as a fresh backup first, so a rollback is itself reversible | | **ⓘ Version** | Updater version, latest Release, local Python, local and archived EXEs, and every installation's version | Check and roll back are executed by this repository's `updater_core.py` (its new `--json` mode), so they share the desktop app's logic. They need Python 3.10+ on the machine; without it the panel says so and version info still works. > DSH's "Official" group only holds plugins shipped inside DSH itself; third-party > plugins always land in "Installed", with no review or store submission. > ⚠️ The plugin runs inside the DSH host process, **outside the workspace > sandbox**; `download` and `launch` really write files and start processes. --- ## Where local data is stored Everything lives in a single "player preferences"-style file: ``` %APPDATA%\dsh-updater\preferences.json ├─ settings your preferences (language, GPU toggle) ├─ cache the previous scan result + timestamp └─ sources download sources you have opened and remembered ``` The file is written atomically. If it is missing, corrupted or has an unexpected shape, the tool silently falls back to defaults — a broken file never blocks startup. Older versions kept three separate files (`settings.json` / `cache.json` / `sources.json`); they are migrated automatically on first read and **the old files are left in place**. You can point the tool at another directory with the `DSH_UPDATER_SETTINGS_DIR` environment variable (useful for portable or test runs). --- ## Language switching * The UI language is detected from the system language on first launch and can be changed in **Preferences → Language**. * The interface is rebuilt immediately after switching — **no restart needed**. * Switching language does **not** trigger a rescan: the previous result is reused. > **Note:** if some text is still shown in a different language after switching, > press **"🔄 Rescan"** to refresh the display. This only affects a few > long log/tooltip strings that are built while scanning. --- ## Known limitations * A few multi-line log messages are not yet translated and still show Chinese. * **"Use GPU acceleration"** only records a preference — DSH does not expose a GPU acceleration option yet, so it currently has no effect. --- ## Repository layout | File | Purpose | |---|---| | `updater_core.py` | Detection / version compare / download / update / skill sync | | `updater_gui.pyw` | The Tkinter GUI | | `i18n.py` + `i18n_*.py` | Multi-language framework and translation tables | | `pack_source.py` | Builds the source-edition zip (used locally and in CI) | | `启动更新器.bat` | One-click launcher for the source edition | | `.github/workflows/ci.yml` | Static checks + smoke tests on push | | `.github/workflows/build-release.yml` | Builds the EXE and publishes a Release on `v*` tags | | `RELEASE_NOTES.md` | Release notes for the current version (used as the Release body) |