zhengjy01/dsh-notify
System-level desktop notifications for DeepSeek Harness: turn-completion / workflow-end banners and a modal approval alert (macOS osascript, Linux notify-send)
已收录
0
Notify
Bundle 已验证
预览
功能介绍
系统级桌面通知:回合完成 / 工作流完成横幅,需要审批时弹出模态提醒(macOS osascript / Linux notify-send)。
适合
- 希望在 DSH 主任务、目标或工作流结束时收到桌面提醒的用户。
- 需要对失败、目标阻塞或审批请求进行醒目通知的工作流。
- 不会始终盯着浏览器的 macOS 或 Linux 桌面环境。
不适合
- 插件只能记录日志、无法显示原生通知的其他操作系统。
- 始终在 DSH 页面内工作、系统级横幅带来价值有限的用户。
- 期望默认收到子 Agent 完成提醒的用户;该触发项需另行开启。
README
dsh-notify
English 中文
DSH server-side plugin: pops operating-system-level notifications to alert you to important events happening in DSH, so you don’t need to keep staring at the browser page.
Notification triggers
| Event | Popup type | Default |
|---|---|---|
Main session task reply finished (turn/end completed, non-subagent session) |
System banner “Session name · Task finished” | On |
Main session task failed (turn/end reason=error) |
Modal popup “Session name · Task failed” + sound | On |
Main session task interrupted (turn/end reason=aborted / max-tokens / blocked) |
System banner “Session name · Task interrupted” | On |
Single tool call failed (tools/result isError) |
System banner “Session name · Tool failed” | On |
Goal completed (goal/changed phase=complete) |
System banner “Session name · Goal completed” | On |
Goal blocked (goal/changed phase=blocked) |
Modal popup “Session name · Goal blocked” | On |
Workflow run finished (tool-workflow/run-end) |
System banner “Session name · Workflow finished” | On |
Manual approval needed: tool permission request (approval/asked) |
Modal popup “Session name · Approval needed” + sound | On |
Permission request auto-rejected (policy is never) |
System banner “Session name · Permission request (auto-rejected)” | On (follows the item above) |
Subagent (background subtask) turn ended (turn/end, subagent session) |
System banner “Session name · Subtask finished” | Off |
Notes:
-
Titles carry the session name: every popup title uses the corresponding session’s name (taken from the session’s
session/titleevent), truncated automatically when too long (18 characters + …); when there is no title, it falls back to the first 8 characters of the session ID. -
Tool-failure throttling: within the same session, two tool-failure notifications are separated by at least 60 seconds by default (
toolErrorCooldownMs); you can also usetoolErrorAllowlistto only notify for critical tools (e.g.["bash", "ssh_exec"]). - Severity levels: real failures (errors), blocked goals, and manual approval requests → modal popup (must be clicked to dismiss) with a sound; completions, interruptions, auto-rejections, etc. → notification-center banner (non-intrusive).
-
macOS: modals use
osascript display alert ... as critical, banners usedisplay notification; Linux: unifiednotify-send, with-u critical(urgent level, stays until clicked) for modal scenarios; other platforms: logs only. - When the approval policy is
ask, an approval request pops a modal dialog reminding you to approve it in the DSH UI; when the policy isnever, requests are auto-rejected and only a banner tells you it was auto-rejected, without popping a modal to disturb you. - Popups run detached from the process and do not block the DSH server.
Installation
Standard DSH plugin package installation (any one of the following); after installing, restart dsh web for it to take effect:
# Local development (link mode, pointing at this repository path)
dsh plugin --profile web add link:/Users/zhengjunyao/Documents/DSH-test/dsh-notify
# After publishing to GitHub (the repository must have the dsh-plugin topic)
dsh plugin --profile web add github:<your-account>/dsh-notify
Alternative: the repository ships with scripts/install.mjs (copies the package to ~/.dsh/profiles/node_modules/dsh-notify), but the standard method above is recommended.
Configuration
The plugin’s cordis.patch.yml provides default configuration; after installing, you can override it at the profile’s patch layer (e.g. ~/.dsh/profiles/web/cordis.patch.yml):
- patch:
- id: notify
config:
notifyTurnEnd: true # main session task finished banner
notifyTurnError: true # main session task failed: error→modal popup, aborted/over-limit/blocked→banner
notifySubagentEnd: false # subtask finished banner (off by default to avoid noise)
notifyWorkflowEnd: true # workflow finished banner
notifyApproval: true # approval-needed popup / auto-rejected banner
notifyToolError: true # single tool call failed banner (per-session cooldown + optional allowlist against noise)
toolErrorAllowlist: [] # only notify for these tool names, empty = all (e.g. ["bash", "ssh_exec"])
toolErrorCooldownMs: 60000 # minimum interval between two tool-failure notifications in the same session (ms)
notifyGoalComplete: true # goal completed banner
notifyGoalBlocked: true # goal blocked modal popup
sound: true # play a sound on popup
After changing the configuration, restart dsh web as well.
Manual verification
You can verify that popups work without restarting:
osascript -e 'display notification "测试" with title "DSH" sound name "Glass"'
osascript -e 'display alert "DSH" message "测试" as critical'
Publishing to the community
- Push this repository to your GitHub (remember to change the
repository.urlinpackage.jsonto the actual address). - Add the
dsh-plugintopic in the repository settings → Topics, so DSH users around the world can find it and install it with one command. - (Optional) Register it in community marketplaces/lists, e.g. dsh-market, awesome-dsh-plugin.
- (Optional) The official plugin scaffolding is still under discussion; you can leave feedback at deepseek-ai/deepseek-harness Discussion #1629 to help push forward an official publishing channel.
常见问题常见问题
在启用了 DSH 的终端中执行已验证命令 dsh plugin --profile default add github:zhengjy01/dsh-notify。命令会解析公开 package 元数据,并保持插件与本页展示的目录身份一致。
兼容性以页面上展示的 bundle 与 profile 状态为准。如果某个 profile 尚未检测到,请先保持禁用,并在生产启用前阅读仓库文档。
GitHub 链接和 activity 元数据是 release 与维护状态的来源。新版本发布后重新查看本页,确认目录已经观察到最新版本。