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)

Bundle 已验证 未知 JavaScript 未知
Bundle 已验证

已收录

0

Notify

Bundle 已验证

版本未知
语言JavaScript
许可证未知
在 GitHub 查看

预览

功能介绍

系统级桌面通知:回合完成 / 工作流完成横幅,需要审批时弹出模态提醒(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/title event), 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 use toolErrorAllowlist to 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 use display notification; Linux: unified notify-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 is never, 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

  1. Push this repository to your GitHub (remember to change the repository.url in package.json to the actual address).
  2. Add the dsh-plugin topic in the repository settings → Topics, so DSH users around the world can find it and install it with one command.
  3. (Optional) Register it in community marketplaces/lists, e.g. dsh-market, awesome-dsh-plugin.
  4. (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 元数据,并保持插件与本页展示的目录身份一致。