dsh-web-search-ddg
aooyoo
Zero-token DuckDuckGo search provider for the DeepSeek Harness (DSH) web seam — local headless browser, no API key, no m…
PROJECT TOPICS
PROJECT README
DeepSeek Harness 的统一通知插件。顶层 Agent 完成一轮任务或等待审批时,同时支持操作系统本机通知和远程 Webhook,不修改模型提示词、工具或会话日志。
session/event → turn/end 保存准确的结束原因,在顶层 Agent 进入 idle 后派发完成通知。approval/asked 审计事件,提醒用户处理审批,不接管审批 waterfall。osascript、Linux notify-send。session + turn/event 唯一标识,避免 Windows 因复用 tag 静默吞掉后续通知。第二阶段包含 Host 通知服务和随包发布的浏览器设置页。插件仍可独立运行:没有桌面 App 时直接使用 Windows、macOS 或 Linux 的系统通知;桌面 App 只提供更可靠的 Electron 通知和点击会话定位。
在插件仓库根目录构建:
npm install
npm run check
安装到 DSH web profile:
dsh plugin --profile web add .
也可以直接从 GitHub 安装:
dsh plugin --profile web add github:SingleOne/dsh-notify-center
仓库提交预构建的 dist,GitHub 安装不需要放开 pnpm 的依赖构建权限;npm 发布时由 prepack 重新构建。
安装后重启 dsh web。在 DSH 左侧设置入口中选择“通知中心”即可修改设置,保存后实时生效。
推荐通过 DSH Web UI 的“通知中心”页面配置。也可以在 ~/.dsh/profiles/web/cordis.patch.yml 中为插件行添加 config 作为组合基础值;可视化页面保存的用户层设置会覆盖基础值:
- id: dsh-notify-center
config:
locale: zh
notifySubagents: false
events:
completed: true
error: true
aborted: false
blocked: true
maxTokens: true
interrupted: true
approval: true
local:
enabled: true
sound: true
rules:
- mode: exclude
pattern: 测试
regex: false
caseSensitive: false
- mode: include
pattern: '部署|发布'
regex: true
caseSensitive: false
webhooks:
feishu:
url: 'https://open.feishu.cn/open-apis/bot/v2/hook/REPLACE_ME'
events: [completed, error, approval]
includeSummary: false
custom:
url: 'https://example.com/dsh-hook'
events: [completed, error]
includeSummary: true
delivery:
timeoutMs: 5000
retries: 2
retryBaseMs: 500
maxBodyChars: 400
Webhook 也可简写为 URL,此时启用所有事件并默认隐藏摘要:
webhooks:
slack: 'https://hooks.slack.com/services/REPLACE_ME'
旧版 URL 简写在载入配置基础层时会自动归一化为对象形式,后续从设置页修改事件范围不会丢失基础层 URL。
页面保存的用户层位于 $DSH_HOME/dsh-notify-center/settings.json;未设置 DSH_HOME 时使用 ~/.dsh/dsh-notify-center/settings.json。插件使用 revision 防止多个页面互相覆盖,并通过同目录临时文件原子替换。该文件由插件维护,不建议手工编辑。
桌面 App 启动 DSH 子进程时可注入以下临时环境变量:
DSH_NOTIFY_BRIDGE_URL:仅接受 http://127.0.0.1:<随机端口>/...。DSH_NOTIFY_BRIDGE_TOKEN:每次 App 启动生成的高强度临时令牌。插件以 Bearer Token 向桥接发送已经本地化的通知标题、正文和会话定位信息。URL 与令牌不会写入插件日志;任一变量缺失、端点不是回环地址、认证失败或请求超时都会禁用桥接或回退到系统原生通知。Webhook 通知始终由插件直接投递,不经过桌面 App。
用户点击桌面 App 展示的通知后,App 会在 DSH Web 页面派发版本化的 dsh-notify-center:activate-session 事件。插件客户端严格校验 { version: 1, sessionId, turn? },确认目标是已列出或已寻址的会话后,通过 DSH Client Runtime 的 sessions.open() 完成定位。桌面 App 不读取或操作 DSH 会话列表 DOM。
自定义通道接收 JSON:
{
"text": "【DSH 任务完成】会话标题\n耗时:2 秒\n会话:session-1",
"kind": "completed",
"title": "会话标题",
"sessionId": "session-1",
"turn": 2,
"durationMs": 2000,
"time": "2026-08-16T00:00:00.000Z"
}
includeSummary: false;启用后会发送该轮回复的有界摘要。dsh-notify-center.lnk 并在当前用户的 HKCU\\Software\\Classes\\AppUserModelId 下注册 DeepSeekHarness.NotifyCenter。这是未打包 Win32 进程可靠显示 Toast 所需的 AUMID 注册,不写入系统级注册表;移除快捷方式和该 HKCU 项即可撤销。npm run typecheck
npm test
npm run build
测试覆盖配置与安全默认值、设置原子持久化、revision 冲突与 HTTP 同源限制、桌面桥接认证和脱敏、完成/审批事件折叠、去重、规则、各平台命令构造、Webhook 载荷脱敏、失败重试和普通 4xx 不重试。
notify-send。MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。