Monitors session state in the DSH web app and sends desktop, browser, and third-party notifications for interactions, completions, and errors.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:ly6170/dsh-messager
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. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
Task-status notification plugin for DeepSeek Harness (DSH). Get notified via system notifications (OS toast), browser notifications, and a Feishu (Lark) bot (webhook) whenever a session needs attention, a task completes, or a task errors.
A single-package, dual-runtime design: the host side (Node) handles system notifications and the Feishu webhook; the client side (browser) handles Web Notification. Both share one config source (namespace messager), editable live from the "Notifications" settings section — config flows through the plugin's own webserver route (/dsh-messager/config), so it works on all environments including release/npx/npm installs (no DSH settings allowlist dependency).
Features
- 🟢 Three triggers — needs-interaction / completed / errored, each toggleable
- 🔔 Three channels — system (node-notifier), browser (Notification API), Feishu bot (webhook + HMAC-SHA256 signature)
- ⚙️ Hot-reloadable config — applies instantly, no restart
- 🌐 Internationalized settings section (简体中文 / English) via
ctx.locale - ⌨️ Browser shortcut
Ctrl+Shift+Mopens the settings panel (no apiproxy allowlist needed) - 🔌 Extensible channels via the
NotifyChannelinterface
Trigger semantics align with the Web UI status dots: orange = needs interaction, green = completed (non-current session), blue = running (not notified).
Installation
Install from npm (recommended, prebuilt lib/ — no build approval needed):
dsh plugin --profile web add dsh-messager
dsh web
If you don't have the dsh CLI preinstalled, run it on the fly via npx:
npx -p @deepseek-ai/dsh dsh plugin --profile web add dsh-messager
npx -p @deepseek-ai/dsh dsh web
From source (for development / customizing):
git clone https://github.com/ly6170/dsh-messager.git
cd dsh-messager
pnpm install
pnpm build
npx -p @deepseek-ai/dsh dsh plugin --profile web add ./
npx -p @deepseek-ai/dsh dsh web
Configuration
Precedence: schema defaults → base (that row's config:) → user layer (settings section/document/RPC). Any change applies instantly.
| Field | Type | Default | Description |
|---|---|---|---|
triggers.interaction |
boolean | true |
Notify on needs-interaction |
triggers.completed |
boolean | true |
Notify on task completed |
triggers.error |
boolean | true |
Notify on task error |
system.enabled |
boolean | true |
System notification channel |
system.icon |
string | - | Absolute icon path (must exist) |
system.verbosity |
minimal|normal|detailed |
normal |
System content verbosity |
browser.enabled |
boolean | true |
Browser notification channel |
browser.onlyWhenHidden |
boolean | true |
Notify only when page hidden/unfocused |
browser.verbosity |
minimal|normal|detailed |
normal |
Browser content verbosity |
feishu.enabled |
boolean | false |
Feishu bot (webhook) channel |
feishu.webhookUrl |
string | - | Custom bot webhook URL |
feishu.secret |
string (secret) | - | Signing secret |
feishu.timeoutMs |
number | 5000 |
Per-request timeout |
feishu.verbosity |
minimal|normal|detailed |
normal |
Card content verbosity |
dedup.interactionCooldownMs |
number | 10000 |
Cooldown for same session/trigger |
dedup.completedDebounceMs |
number | 1000 |
Completion debounce |
dedup.perChannelPerMinute |
number | 20 |
Per-channel per-minute cap |
message.titlePrefix |
string | - | Title prefix |
message.includeSessionTitle |
boolean | true |
Include session title |
message.guiUrl |
string | http://127.0.0.1:3080 |
"Open" link target |
Known limitations
- Browser notifications require site permission; with
onlyWhenHidden=falsethey also pop when visible. - Multi-tab dedup uses localStorage cooldown; each browser notifies separately.
- Subagent completions are not notified (root sessions only) — forked sessions count as top-level and do notify.
- Channel failures are only logged; they don't affect other channels or the plugin.
- Completion/interaction dedup state is in-memory and resets after a DSH restart.
License
Links
More in this category
omdsh-dev/dsh-notification★ 49
Desktop notifications for turn completions, with per-outcome controls and keyword rules.
omdsh-dev/dsh-open-in-vscode★ 46
Open DSH workspace directories in VS Code directly from the web GUI.
whyihaveyou/dsh-suite#plugin-notify★ 27
IM webhook and local notifications on turn completion, errors, or approval (Feishu/WeCom/DingTalk/Slack/Discord/custom).
omdsh-dev/dsh-lark★ 17
Lark/Feishu bot channel for DeepSeek Harness: each chat drives its own agent, and tool approvals, model questions, and plan reviews return as cards answered by a button or a reply. Switch workspace and model from the chat (`/cd`, `/model`, `/new`), and run several bots that keep separate sessions and can hand turns to each other in one group.
bill9109/dsh-web-ui-notify★ 12
Desktop notification reminders.
bobleer/dsh-acp-for-bitfun★ 9
ACP bridge between BitFun and DSH.