arvin-yd/dsh-update-notifier
项目介绍Project Overview
dsh-update-notifier 是 DeepSeek Harness(dsh)的社区插件,在侧边栏底部常驻显示已安装版本徽标,点击可打开模态框对比当前与 npm latest,提供复制更新命令、忽略、稍后或一键更新操作。宿主端启动时解析一次本机版本,每 6 小时轮询 npm registry;浏览器端通过官方 sidebar.footer.action 槽位渲染。适用于需要随时掌握 dh 升级时机的用户。注意:仅在 dsh 0.1.0-rc.5/rc.6 验证,一键更新需双重确认,npx 安装会短暂中断服务约 10–60 秒。
dsh-update-notifier is a community plugin for DeepSeek Harness (dsh) that pins a persistent version badge in the sidebar footer. The host half resolves the installed dsh version at startup and polls the npm registry every 6h; the browser half renders a StateDot (red = update available, green = current, amber = checking/error) via the official sidebar.footer.action slot. Clicking opens a modal with current vs. latest, copy-update-command, ignore, snooze, or a two-click one-click update. Use it to stay aware of dsh upgrades. Caveat: verified only on dsh 0.1.0-rc.5/rc.6, and the one-click update briefly disconnects npx-cache installs for 10–60s.
请帮我了解并安装插件:【dsh-update-notifier】【https://github.com/arvin-yd/dsh-update-notifier】
把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.
或使用命令行安装(适合开发者)Or use CLI install (for developers)
命令行安装CLI Install
dsh plugin --profile web add dsh-update-notifier
把 arvin-yd/dsh-update-notifier 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
dsh-update-notifier
Persistent version badge for DeepSeek Harness (dsh).
A quiet badge in the sidebar footer always shows your installed version
(e.g. v0.1.0-rc.6). Clicking it opens a modal with current → latest and last-checked time:
"up to date" when current, or — when npm
@deepseek-ai/dsh latest is newer — a red
StateDot plus copy-the-update-command / ignore / snooze actions.
This is a community plugin, not an official DeepSeek product.
How it works
- Host half (
src/index.js): resolves your installed DSH version once at startup, polls the npm registry (default: first check 10s after startup, then every 6h), and serves the cached decision onGET /dsh-update-check(with anupdateHintthat matches your install mode:npm exec @deepseek-ai/dsh@latest webfor npx-cache installs,npm install -g @deepseek-ai/dsh@latestotherwise) via the optionalwebServerservice. Headless compositions are unaffected. - Browser half (
client/client.js): registers a persistentsidebar.footer.actionslot entry rendered with the officialui-primitives(StateDot/Button/Modal). Badge states: red dot = update available, green dot = current, amber = checking / error / unknown. "Ignore" persists inlocalStorageuntil a newer version appears; "Later" hides the red dot until the next fresh check result.
Display logic
Badge — always visible in the sidebar footer (official sidebar.footer.action slot).
The shell stacks footer actions above the Settings row by design; this plugin measures the
Settings row height at runtime and pulls the badge onto its right side with a
compensating negative margin (re-measured on wide/rail toggles). In the collapsed rail it
renders as a centered dot.
| Dot color | Meaning |
|---|---|
🔴 red (error) |
an update is available, not ignored and not snoozed |
🟢 green (done) |
installed version is current |
🟡 amber (warning) |
first check pending, check failed, installed version unknown, or an available update is currently ignored/snoozed |
Label: v<current> normally · … while the first check is pending · — when the installed
version cannot be resolved.
Modal — clicking the badge opens it; content depends on the host-reported state:
| Host state | Modal content |
|---|---|
checking |
检查中… |
update-available |
current → latest, last-checked time, [立即更新] (primary, two-click confirm), copy-the-update-command box, footer: [忽略此版本] [稍后再说] |
up-to-date |
current → latest, "已是最新版本 ✓", footer: [立即检查] |
error |
current → latest, "检查失败:<reason>", footer: [立即检查] |
unknown |
current → latest, "无法识别本地 dsh 版本", footer: [立即检查] |
One-click update — [立即更新] → confirm → the host half executes the update for your install mode:
- npx-cache installs (
npm exec @deepseek-ai/dsh web): it spawns a detachednpm exec --yes @deepseek-ai/dsh@latest web(fetching the new version) and exits the current process so the new server can bind the port. The page disconnects for roughly 10–60s; refresh when it comes back. - Global npm installs: it runs
npm install -g @deepseek-ai/dsh@latestand reports the result; you still restartdsh webyourself.
A restart always ends the current process — in-flight conversations survive on disk
(~/.dsh/sessions).
Check cadence — host: first check 10s after startup, then every checkIntervalMs
(default 6h) against the npm registry (5s timeout); browser: polls /dsh-update-check
every 5 minutes and on tab focus; [立即检查] / ?force=1 re-checks immediately (2s cooldown).
"Ignore this version" is stored in localStorage and lifts only when a newer version
appears; "Later" lifts when the next fresh check result arrives.
Compatibility
- Verified against dsh 0.1.0-rc.5 (monorepo dev clone, full web boot + endpoint E2E) and 0.1.0-rc.6 (npm-installed, host boots, load-level headless test clean). Last verified: 2026-08-15.
- Tracks the npm
latestdist-tag of@deepseek-ai/dsh, so it stays version-agnostic; no pin to a specific dsh commit is required.
Install / Uninstall
Install (npm by name, git URL, or local dir all work):
dsh plugin --profile web add dsh-update-notifier
dsh plugin --profile web add https://github.com/arvin-yd/dsh-update-notifier.git
dsh plugin --profile web add /path/to/this/repo
Uninstall / remove:
dsh plugin --profile web rm dsh-update-notifier
The plugin activates at the next dsh web start (a restart is required after install).
Quick start
Install into the
webprofile (above) and restart:dsh --profile web --port <port>.Sanity-check the host half:
curl http://127.0.0.1:<port>/dsh-update-check # {"state":"up-to-date","current":"0.1.0-rc.6","latest":"0.1.0-rc.6","fetchedAt":...,"error":null,"updateHint":"..."}The sidebar footer badge always shows your installed version (green dot = current). When npm
latestexceeds it, the dot turns red; the modal offers copy-update-command / ignore / snooze.
Config
Defaults live in cordis.patch.yml; override in $DSH_HOME/profiles/web/cordis.patch.yml:
- id: dsh-update-notifier
config:
checkIntervalMs: 21600000 # host re-check interval (default 6h)
timeoutMs: 5000 # registry fetch timeout (ms)
Permissions & data
- Reads: your dsh install location (to resolve the installed version), the npm public
registry over HTTPS (
registry.npmjs.org— metadata only, no credentials sent). - Writes: nothing on disk; the browser half stores only the ignored-version string in
localStorage(dsh-update-notifier.ignoredVersion). - One-click update action: only after your explicit two-click confirmation, the host runs npm commands under your user account (see "One-click update") and — for npx installs — ends the dsh process to let the new version bind the port. No credentials are read or forwarded; the update endpoint only accepts requests while an update is actually available.
- No telemetry, no analytics, no third-party calls beyond the npm registry.
Troubleshooting
- Badge never appears — expected when you are on the latest version; verify via the
endpoint above (
statemust beupdate-available). currentisnull/ stateunknown— run dsh through its normal entrypoint (dsh web/npm exec @deepseek-ai/dsh web); the version probe walks up from the running bin, plugin directory, and enclosing@deepseek-ai/dsh*package.- state
error— registry fetch failed (offline/blocked); check the dsh host log for[dsh-update-notifier] check failed: ...; it retries everycheckIntervalMs. - Rollback —
dsh plugin --profile web rm dsh-update-notifierremoves the plugin.
Development
pnpm install
pnpm test
License & security
MIT. To report a security issue privately, use GitHub's private vulnerability reporting.
nexu-io/open-design
freestylefly/awesome-gpt-image-2
anywhere-labs/dsh-desktop
walkinglabs/learn-harness-engineering
awesome-dsh-plugin/awesome-dsh-plugin
MemTensor/MemOS