Native macOS Notification Center alerts for DeepSeek Harness when the agent asks for your choice, a task completes, or a task fails, with per-scenario switches, background-job suppression, and click-to-open the session.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:zhiquanchi/dsh-mac-notifications
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
Native macOS Notification Center alerts for DeepSeek Harness (DSH): when the agent needs your choice, when a task completes, and when a task fails — delivered under the DeepSeek Harness application's own name and whale icon, never as Script Editor.
✨ Features
| Scenario | Trigger | Example |
|---|---|---|
| 🧑⚖️ A choice is needed | The agent calls ask_user_question |
"A choice is needed" + the question |
| ✅ Approval requested | A tool requests approval | "Approval needed" + tool name & reason |
| 🎉 Task complete | A turn ends with turn/end reason completed |
"Task complete" + session title |
| ⚠️ Task failed | A step/turn errors, aborts, or the session fails | "Task failed" + error message |
Noise control
- Completion notifications are suppressed while the session still has live background jobs;
- Subagent sessions are skipped by default — only the main conversation notifies;
- Per-turn error deduplication (
agent/errorandturn/enderror fire once); - Completion cooldown (default 3 s);
- Every switch lives in the
configofcordis.patch.ymland hot-reloads.
🚀 Install
# From GitHub (recommended)
dsh plugin --profile web add github:zhiquanchi/dsh-mac-notifications
# From npm
dsh plugin --profile web add dsh-mac-notifications
# From a local checkout (linked, hot-reloads)
dsh plugin --profile web add ./dsh-mac-notifications
Or install from a local directory in the DSH desktop app's Plugins page.
⚙️ Configuration
All options live in the plugin row's config in cordis.patch.yml:
| Field | Type | Default | Meaning |
|---|---|---|---|
questions |
boolean | true |
Notify when the agent asks a question |
approvals |
boolean | true |
Notify when a tool requests approval |
completed |
boolean | true |
Notify when a task completes |
errors |
boolean | true |
Notify on abnormal interruption/failure |
includeSubagents |
boolean | false |
Include subagent sessions |
suppressWhenJobsRunning |
boolean | true |
Suppress completion while background jobs run |
sound |
boolean | true |
Play the system default notification sound |
language |
'zh' | 'en' |
'zh' |
Notification copy language |
cooldownMs |
number | 3000 |
Minimum interval between completion notifications |
fallbackOsascript |
boolean | false |
Fall back to osascript (Script Editor attribution) when no Web GUI client is connected (off by default) |
🧠 How it works
A dependency-free Host (Node) Cordis plugin using only Node's built-in child_process.
Events → notifications
| Harness event | Meaning | Notification |
|---|---|---|
user-questions/request |
Structured user input requested (waterfall, prepend, never claims) |
Choice needed |
approval/request |
Approval requested (waterfall, prepend, never claims) |
Approval needed |
session/event → turn/end (completed) |
Turn finished; suppressed when live jobs remain | Task complete |
session/event → turn/end (error / aborted) |
Turn failed or aborted (non-user) | Task failed / aborted |
agent/error |
Step or turn errored (may lack a durable record) | Task failed |
api-session/error |
Agent failed outside a durable turn | Task failed |
Notification transport & icon
macOS shows the sending app's name and icon on every notification. This plugin uses a two-part design:
- The Host half listens to Harness events and pushes notification payloads
to the Web GUI over a local SSE endpoint (
/plugin/dsh-mac-notifications/events); - The Client half (loaded with the Web GUI) shows them through the browser Notification API.
Because the notification is posted by the DeepSeek Harness app's own renderer, Notification Center shows the app name "DeepSeek Harness" and its whale icon — a genuine DeepSeek notification, with nothing to do with Script Editor.
Refresh the Web GUI page once after installing/updating, so the Client half loads. Browser notifications play the system default sound; set
sound: falsefor silence. With no Web GUI client connected (e.g. a headless profile), an optionalosascriptfallback keeps notifications working; it is off by default (fallbackOsascript: false) so every notification stays attributed to DeepSeek Harness.
🗒️ Limitations
- macOS only (
/usr/bin/osascript); on other platforms the plugin is a no-op. - Clicking an
osascriptnotification does not focus the app (system limitation). - Refresh the Web GUI once after install/update; notification permission is the DeepSeek Harness app's own system authorization.
🏪 Market listings
- DSH.SO — DSH's default plugin market (security audit + install verification)
- DSH Meme Hub — community directory
- awesome-dsh-plugin — curated list, also served as the
dsh-plugin-catalogmarket index - GitHub-topic crawlers (
dsh-plugin/deepseek-harnesstopics): DSH-Plugins-Marketplace, dsh-plugins-store, and more
📄 License
MIT © 2026 zhiquanchi
Independent community project, not affiliated with DeepSeek. Installing a plugin runs third-party code — review the source first.
Links
More in this category
xmanrui/dsh-im★ 3118
Connect IM bots to DeepSeek Harness via QR codes or bot credentials (9 channels: Feishu, WeChat, DingTalk, WeCom, QQ, Slack, Telegram, Discord, and WhatsApp).
shaobeichen/dsh-pocket★ 2685
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.
OpenPetsHQ/openpets#dsh★ 1373
Bridges DeepSeek Harness lifecycle status, errors, and approval requests to a locally running OpenPets desktop companion.
c1overzz/dsh-bili-scroll★ 1150
Let your DSH agent browse Bilibili on its own, read subtitles, write a daily digest, and @ you when it finds something worth your attention.
inclusionAI/Avernet#deepseek-harness-channel-bcn★ 599
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.
zaofan-make/dsh-qqbot★ 213
QQ official bot channel for DeepSeek Harness (feature-rich fork of tencent-connect/dsh-qqbot): group and private chat with the full agent, sticker library with auto-tagging and AI meme replies, group management (join approval and mute), botplay interactive card events with paginated catalogs, user extension registry (custom slash commands and QQ tools), scheduled wakeups, remote approvals over QQ, and a floating dock web UI.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.