Unofficial host-side ServerChan alerts for DeepSeek Harness: sends a mobile reminder when an approval, plan review, or question stays unanswered past a configurable threshold, even with the browser closed.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-serverchan-watchdog
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:MaRi23333/dsh-serverchan-watchdog
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
中文 · English
When an approval, plan review, or ask_user_question response remains pending past the configured threshold, this plugin sends a mobile alert through ServerChan from the DeepSeek Harness (DSH) host—even with the browser closed.
dsh-serverchan-watchdogis an independently developed community plugin. It is not affiliated with, sponsored by, or endorsed by ServerChan or DeepSeek Harness; their names are used only to identify compatible services.
What it solves
Browser notifications are useful while you are at the computer. This plugin keeps the timer on the host and reaches your phone after you leave the desk or close the tab. Both types of notification can be used together.
- Host-side monitoring over the durable session event stream; no browser connection required.
- Three native interaction seams: questions, plan reviews, and tool/sandbox approvals.
- Restart recovery from unclosed session-log pairs while preserving their original start time.
- Bounded failure handling: network errors, timeouts, and HTTP 5xx responses get at most two retries; HTTP 4xx (including 429), ServerChan business errors, and malformed responses stop immediately.
- Encrypted local storage: the SendKey is stored as AES-256-GCM ciphertext and never returned by the API or written to logs.
Watched interactions
| Interaction | Starts at | Ends at |
|---|---|---|
ask_user_question |
its tool/call |
matching tool/result by callId |
exit_plan_mode plan review |
its tool/call |
matching tool/result by callId |
| Tool or sandbox approval | approval/asked |
matching approval/decided by ID |
The default threshold is five minutes and one successful alert per interaction. An optional repeat interval enables later reminders. A missing credential only defers the local check: it makes no network request and consumes no retry attempt.
Screenshot
Install
Install the stable release from npm:
dsh plugin --profile web add dsh-serverchan-watchdog
# when dsh is not on PATH
npx -p @deepseek-ai/dsh dsh plugin --profile web add dsh-serverchan-watchdog
If you previously installed from GitHub, rerun the npm command above to switch channels. Use the unpinned GitHub form only when you intentionally want a rolling install that follows main:
dsh plugin --profile web add github:MaRi23333/dsh-serverchan-watchdog
For local development:
dsh plugin --profile web add /absolute/path/to/dsh-serverchan-watchdog
Restart dsh web from a normal terminal after installation.
Configuration
Open DSH settings → Plugins → ServerChan alerts after the restart.
New to ServerChan? Follow the official SendKey guide and set up either ServerChan Turbo (commonly delivered through WeChat) or ServerChan³ (the standalone app), then paste the console-provided SendKey or complete push URL below.
- Push URL / SendKey accepts a classic
SCT...key, a ServerChan³sctp...key, or the official complete HTTPS URL shown in the console.SCT...is ServerChan Turbo and commonly delivers through WeChat.sctp...is ServerChan³ and delivers through the ServerChan³ app.
- Threshold defaults to five minutes. Changes apply to interactions that start after the save.
- Repeat interval defaults to zero: one successful alert only.
- HTTP proxy is optional; credentials embedded in the proxy URL are rejected.
- Harness link defaults to
http://127.0.0.1:3080. On a phone,127.0.0.1points to the phone itself. Use a protected LAN/VPN address if mobile access is required. - Test push sends one message with the current settings.
Settings-page values override the bundle-patch defaults:
- id: serverchan-watchdog
config:
enabled: true
thresholdMinutes: 5
repeatMinutes: 0
title: DSH 等待人工确认
webUrl: http://127.0.0.1:3080
proxy: ''
DSH_SERVERCHAN_SENDKEY can provide the credential in environments that already have external secret management. Never write its real value to the repository or command output.
Data flow and security
The following fields leave the machine in a ServerChan message: interaction type, session ID, question/plan/approval summary, elapsed time, and the configured Harness link. They are then subject to the retention policy of the selected ServerChan channel and account. Do not put secrets in pending prompts or links.
- The SendKey ciphertext lives in
$DSH_HOME/serverchan-watchdog/state.json;key.binin the same directory decrypts it. File permissions are tightened where possible, but a local account that can read both files can recover the key. This is not an OS credential vault. - Only exact official ServerChan HTTPS endpoint shapes are accepted. Userinfo, query strings, fragments, wrong hosts or paths, and mismatched ServerChan³ UIDs are rejected.
- Status, configuration, and test routes are loopback-only, but local processes remain inside the trust boundary. An untrusted local process can read pending details, change settings, or trigger a test message. Do not expose DSH directly to the public internet; protect reverse-proxy, LAN, and VPN access with authentication and access controls.
- Failure logs retain only a class such as
timeout,network-failed, an HTTP status, or a business-error category—never the SendKey, complete URL, response body, or raw exception. - Quotas, failed-call accounting, and retention differ by channel and plan. See the official SendKey guide and FAQ.
Local routes
| Route | Method | Purpose |
|---|---|---|
/serverchan-watchdog/status |
GET | effective configuration and pending list, without credentials or state-directory paths |
/serverchan-watchdog/config |
GET | editable configuration view without credentials |
/serverchan-watchdog/config |
POST | save SendKey, timing, proxy, or link settings |
/serverchan-watchdog/test |
POST | send one test alert |
Write routes require JSON and loopback same-origin validation.
Limitations
- If the host crashes after a human answers but before the result reaches the session log, restart recovery may send one extra reminder.
- After a DSH restart, multiple still-pending interactions that are already past the threshold are re-armed together and may send several alerts in a short period, consuming ServerChan quota.
- The plugin checks that an interaction is still pending immediately before each push, but it cannot cancel an HTTP request already in flight.
- A phone alert is only an entry point. Opening Harness on the phone depends on the configured URL and your network access controls.
Development
pnpm install --frozen-lockfile
pnpm run typecheck
pnpm test
pnpm run build
pnpm run check:smoke
pnpm run check:pack
git diff --exit-code -- lib
CI runs equivalent gates on Node.js 22 and 24. autoInstallPeers:false is intentional: a clean consumer must not rely on pnpm filling undeclared runtime dependencies.
License
Links
More in this category
xmanrui/dsh-im★ 1283
Connect IM bots to DeepSeek Harness via QR codes or bot credentials (9 channels: Feishu, WeChat, DingTalk, WeCom, QQ, Slack, Telegram, Discord, and WhatsApp).
alvinunreal/openpets#dsh★ 1186
Bridges DeepSeek Harness lifecycle status, errors, and approval requests to a locally running OpenPets desktop companion.
shaobeichen/dsh-pocket★ 1096
Remote phone access to the DSH Web UI: scan a QR code for LAN or public (cloudflared tunnel) access with real-time sync, a mobile-adaptive layout, and a settings tab.
inclusionAI/Avernet#deepseek-harness-channel-bcn★ 551
Connects DeepSeek Harness to Avernet's Bot Collaboration Network over WebSocket V2, with automatic onboarding, isolated agent sessions, tool-call events, and multi-bot routing tools.
THEWOLFWALKER/dsh-notifier★ 98
Multi-channel notifications and phone control for DSH: one `notify()` API across 27 channels, event-driven pushes, phone approvals and questions, phone task takeover (`/tasks` `/use`), images into the session, six inbound control channels, a loopback web console, bilingual messages (zh/en via `lang`), multi-agent routing, and zero runtime dependencies.
omdsh-dev/dsh-notification★ 83
Desktop notifications for turn completions, with per-outcome controls and keyword rules.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.