suleymanyaryev/dsh-notification-badge ↗★ 0
dsh-notification-badge
Desktop, browser and webhook notifications plus an app-icon attention badge for DeepSeek Harness — know when your agent finishes a turn, hits an error, or waits for your approval. 适合运行耗时任务的用户,在AI完成、报错或等待审批时及时接收提醒。
Install
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:suleymanyaryev/dsh-notification-badgeREADME
Read the full README ↗Configuration
Override the row in your profile's cordis.patch.yml:
- id: notify-badge
name: dsh-notification-badge
config:
minTurnDurationMs: 10000 # only notify for turns ≥ 10s
webhookUrl: 'https://hooks.slack.com/services/XXX/YYY/ZZZ'
notifyOnApproval: true
desktop: true
browser: true
badge: true
badgeMode: count # count | dot
title: 'DSH'
| Field | Type | Default | Meaning |
|---|---|---|---|
notifyOnIdle | boolean | true | Notify when a turn finishes |
notifyOnError | boolean | true | Notify on agent/error |
notifyOnApproval | boolean | true | Notify when a tool call awaits approval |
minTurnDurationMs | number | 5000 | Skip notifications for quick turns |
desktop | boolean | true | Native desktop notification on the server host |
browser | boolean | true | Browser Notification popups in the Web UI |
browserOnlyWhenHidden | boolean | true | Suppress popups while you are looking at the window |
webhookUrl | string | '' | Optional POST target (Slack-compatible payload) |
title | string | 'DeepSeek Harness' | Title for desktop and browser notifications |
sound | string | 'Glass' | macOS: a system sound name (looked up in ~/Library/Sounds, /Library/Sounds, /System/Library/Sounds) or an audio file path (absolute, or relative to ~/Library/Sounds); '' is silent |
windowsAppId | string | '' | Windows: AppUserModelID the toast is attributed to; empty uses the posting process's registered identity |
badge | boolean | true | Put the attention count on the application icon |
badgeDesktopOnly | boolean | true | Only badge in the desktop shell (a browser tab has no app icon) |
badgeMode | count | dot | count | Number of sessions, or an unnumbered dot |
badgeMaxCount | number | 99 | Highest number rendered |
badgeOnIdle | boolean | true | Count a finished turn |
badgeOnApproval | boolean | true | Count a session waiting on you (including one already waiting at load) |
badgeClearOnFocus | boolean | true | Clear the badge when the window is focused or visible again |
Every field is declared .volatile(), so the values are live: the dsh-settings document
serves them, and a change applies without a reload. webhookUrl is role('secret'), so its value
is stripped before settings cross the wire to the browser.
Webhook payload
{
"text": "Agent finished — done in 2m 14s",
"summary": "Agent finished",
"body": "done in 2m 14s",
"level": "info",
"ts": "2026-08-21T12:34:56.000Z"
}