Skip to main content
L

dsh-pharos

leo-cjw/dsh-pharos

Desktop notifications for DSH: a system toast, a per-kind chime and a tab-title marker when the agent needs you (approval, plan review, question) or a reply finishes in the background; errors, interrupts, usage limits and multi-agent workflow progress alert too. A host half adds SSE delivery, webhook push (WeCom/Feishu/DingTalk/generic), per-turn token/cache/TPS stats, plus three message-format presets (concise, detailed, custom); settings changes auto-save.

Install

dsh plugin --profile web add github:leo-cjw/dsh-pharos

README

dsh-pharos(法罗斯灯塔)

法罗斯灯塔(Pharos of Alexandria),世界七大奇迹之一,为夜航者引航。它在你离开 DSH 时替你守望:任务完成、出错需要你知道、或是模型在等你操作——灯塔亮起,把你唤回。

DSH 桌面端守望提醒插件:「需要你操作」+「回复完成」+「运行出错 / 被中断 / 达到上限 / 后台任务」多路提醒 — 系统通知 + 分音型提示音 + 标题标记 + 可选的 Webhook 出站推送,专为"问完就切走、后台等结果"设计。点击通知可直接跳转到对应会话(同类四个社区插件在当前运行时都做不到,见复盘);macOS / Windows / 浏览器三条通知通道,Windows 走原生 Toast。浏览器半零依赖、零 peer 声明,无兼容性门槛。

提醒时机

时机提醒内容默认
🔔 需要你操作 — 审批请求 / 方案待确认(plan-review)/ 提问系统通知 + 提示音 + 标题前缀 🔔 需要你 · 全时提醒;当前会话 + 页面在前台时静默只留标题标记(审批卡片本来就在眼前)
⏳ 仍未处理 — 上面的待办 10 分钟没处理补发一次系统通知 + 提示音,正文带「(仍未处理)」每次请求至多补发一次,处理掉即撤销
✅ 回复完成 — 会话运行结束(含切走后完成的)系统通知 + 双音提示音 + 耗时小结(「耗时 12 秒」)+ 当轮统计(token 用量 / 缓存命中率 / TPS,v0.5 来自官方投影当轮 delta)仅页面隐藏/后台时提醒
❌ 运行出错 — agent 执行异常(turn/end reason.kind=error,agent/error 双轨兜底)系统通知 + 重低音三音全时(v0.4,受 quiet hours / 过滤约束)
✂️ 被中断 / ⛽ 达到上限 — interrupted / limit系统通知 + 中音警示全时(v0.4)
🛠️ 后台任务事件 — jobEvents(任务结束/移除)系统通知默认开启,可关(v0.4)
🧭 工作流进展 — workflowEvents(阶段推进 / agent 启动·结束)系统通知默认关闭,需在设置页开启(v0.6)

「完成」提醒时机三档(设置页可调):关闭 / 仅页面隐藏时提醒(默认) / 始终提醒。 默认与 VS Code Copilot(windowNotFocused)、Codex CLI(unfocused)、ChatGPT 桌面端 (only while in background)一致 —— 你盯着这个页面时不必被打断,切走或最小化才提醒; 想跑长任务时全程盯着提醒就选第三档。

  • 事件来源两条链路(v0.4 双半):浏览器半 uiSession.sessionStatus(需要你 / 回复完成,沿用 v0.3 语义)+ host 半 SSE(/pharos/api/stream,event: pharos 命名帧:done / error / interrupted / limit / job / remote / workflow,内置 25s 心跳维持长连)——SSE 帧同时是 webhook 出站推送的事件源。
  • 输出渠道:系统通知 + 分音型提示音 + 标题标记/⏳ 闪烁兜底(通知不可用时,6s)+ Webhook 出站推送(可选:企微/飞书/钉钉加签 + 通用透传;5s 超时、指数退避重试、失败环形缓冲 50 条;受 quiet hours / events / 子代理过滤约束)。
  • 点通知:窗口回前台,并跳转到对应会话(v0.6.3 起走宿主的 uiWorkspace.openSession,真正切换主视图;不再是修复前那种「只拉窗口不换页」的 best-effort)。
  • 去重:SSE 帧级 2s 窗口 + 双源 done 去重(SSE done 与 uiSession done 同会话只弹一次)+ 同会话节流(minIntervalMs,默认 6s)。
  • 页面加载时已存在的待办补提醒一次;历史完成状态不补弹。
  • 主开关关闭后:不弹通知、不响铃、不亮标记、不闪烁、不推 webhook。

效果示意

macOS 系统通知:回复完成

macOS 工作流通知:阶段推进与多 agent 结束提醒

Windows 插件详情:灯塔图标、v0.6.3 版本与当前说明

Windows 基本设置:当轮统计、自动保存、自动聚焦与通知保留说明

Windows 提醒时机:关闭、仅页面隐藏时提醒、始终提醒三档与免打扰

Windows 过滤配置:免打扰、子代理与工作流开关、Webhook 自动保存

Windows 已安装插件列表:灯塔图标与当前描述

Windows 测试与 Debug:测试按钮用途、日志入口及自动保存状态

Windows Webhook 消息格式:禁用示例中的简洁、详细、自定义三档

前两张保留为 macOS 历史真实通知示例;其余截图于 2026-10-11 在 Windows 本机拍摄(当时界面标注 v0.6.3,现该版本已发布)。基本设置与提醒时机两张已按 cf214de 实际安装代码重拍,显示“最近 3 条”工作流进展提示;其余原图入库于 c334fb4、裁切于 2938c5d。Windows 图片仅裁掉空白和无关背景,保留真实文字与控件。设置页截图展示当轮统计、基本设置、三档提醒时机、免打扰、过滤、Webhook、高级、测试与 Debug。Webhook 格式图使用已禁用的临时示例和 example.invalid 地址,拍摄后已恢复空列表,没有配置真实密钥。

工作流图来自 macOS 的真实多 agent 工作流(3 个并发 agent)通知栈,正文带工作流名 multi-agent-audit;最上方「任务已完成」是主会话整体完成。它不代表 Windows 工作流实机验收。Windows 的通知显示和点击结果见 验收记录;这里尚未附 Windows 系统通知横幅截图。截图维护清单见 截图指南。

配置

v0.4 起:host 半在线时以服务端配置为准(/pharos/api/config,落盘 <profile>/pharos.json,设置页改);host 不在线时回退浏览器偏好(localStorage 键 dshPharos.config),控制台实时生效:

设置页位于 设置 → 消息通知(顶级设置分区;v0.4 起 React 渲染,2026-10-05 由 settings.plugins.tab 迁至 settings.section),覆盖全部配置项,另含:

  • 当轮统计卡片(v0.5):展示最近一轮的耗时 / tokens / 缓存命中率 / TPS(host 官方投影当轮 delta;无统计时隐藏)

  • Webhook 渠道管理:增删多渠道(企微/飞书/钉钉加签 + 通用透传)

  • 消息格式三档(v0.6.2):简洁(默认)/ 详细 / 自定义 —— 自定义档展开模板编辑区,可用 {title}{note}{kind}{kindLabel}{summary}{duration}{tokens}{cache}{tps}{sessionId}{sessionTitle}{time} 等变量自行排版。模板里每写一行就是消息里的一行(渲染层会自动补钉钉要求的硬换行,无需写尾随空格);旧版本的预设模板在打开设置页时会自动升级到当前写法。

  • 免打扰时段(跨午夜)、子代理过滤、apiToken 管理(*** 掩码=保留、""=清除)

  • 一键测试按钮:测试页内提示和声音;不验证系统通知。验证 Windows 系统通知请使用真实事件或 POST /pharos/api/trigger(configApi 缺失时,远程按钮回退该接口)。

  • Debug 面板:配置来源 / host 在线状态 / SSE 状态与帧计数 / 权限 / 绑定状态 / 实时日志。点击刷新可查看 recentNotifications:requested 仅表示构造成功,shown 表示收到宿主显示回调,error 表示异步失败,suppressed 含静默原因。无回调不算显示成功,shown 也不能证明用户看到了横幅。

  • 跳转轨迹(v0.6.3 新增,见 复盘):「点击通知跳转会话」是静默失败的功能——横幅照弹、点击照接收、界面不动时没有任何提示。因此 debug()(控制台 window.__dshPharos.debug())除原有字段外还暴露:

    • deliverLog —— 每次通知投递走哪条渠道(system-notification / dom-toast)、发了什么、是否挂了点击回调
    • navLog —— 每次点击的判定:outcome(navigated / gate-blocked / fallback-open …)、from(点击来自系统通知还是页内 toast)、via(导航路径)、alreadyCurrent(点了是否本来就是当前会话)、detail(被哪条闸门拦住)
    • navService —— uiWorkspace / workspaces 可用性与缓存状态、两个投影的 phase
    • recentFrames[].sessionId —— 帧归属的第一手证据

    排查「点了没跳」时先看这四个字段,不要凭现象猜。

Windows「只有声音」(真实事件无系统通知)的定位、修复与实机验收见 issue #1 修复记录;根因是原生 tag 超过 WinRT 的 64 字符上限,v0.6.4 修复。系统通知不传会话 ID tag;事件去重仍由 SSE 去重和完成节流完成。

Windows Electron 在本机 host 支持时使用隐藏的系统 Windows PowerShell 原生助手发送通知,以独立应用身份 DSH Pharos Notifications 显示。助手保持 COM 激活监听,通知携带一次性随机票据;点击经本机 host/SSE 返回原始会话 ID、调用 uiWorkspace.openSession。每次 COM 点击先核验存活票据和当前自动聚焦开关,再向通过名称、会话与启动时间校验的宿主父进程(DSH 主进程)移交前台权限,随后消费票据并通过固定 dsh://open 请求恢复窗口。权限按次交接,不向所有进程授权,不改系统前台锁策略。通知 tag 和 launch 参数不包含会话 ID;关闭自动聚焦时不授权、只在后台切换会话。v0.6.4 已通过第十九轮 C→A→B 连续点击:每次从 Sourcetree 自动恢复 DSH,并导航到正确主/子会话;此前仅闪烁任务栏的问题已在本机复验通过。

首次发送会在当前用户注册 Pharos 自有的 AUMID 和 COM CLSID,生成的激活程序缓存于 %LOCALAPPDATA%\dsh-pharos\notifications。写入仅限两个带所有者标记的私有注册表键,发现其他所有者时停止原生发送;不重建共享注册表键、不修改默认协议关联。另在当前用户开始菜单创建独立的 DSH Pharos Notifications.lnk,设置应用 ID 与激活 CLSID 并读回核验,保留 DSH 原快捷方式;同名快捷方式属于其他应用时拒绝覆盖。注册、快捷方式和缓存会留在本机,退出时释放 COM 监听并清理本轮通知入口;卸载插件不会自动删除这些私有注册及缓存。此通道要求 DSH host 正在运行,不支持退出后冷启动恢复旧会话。曾测试的 dsh-pharos:// 协议候选因 Windows 报“没有可打开此链接的应用”已撤回。v0.6.4 已验证关闭自动聚焦时后台跨会话导航,以及三条通知同时保留、乱序点击分别进入对应主/子会话;此结果不代表所有 Windows 版本或免打扰模式下横幅都可见。

工作流只保留当前客户端最近 3 条入口;淘汰时删除本应用 Pharos 组的指定历史并读回核实,删除失败时停止本次发送并显示页内反馈。SSE/Webhook 的原始工作流事件仍完整投递,普通通知不受这项三条规则影响。Debug 的 desktopNativeNotifications、nativeNotifications 和 recentNotifications[].nativeId 可确认通道与目标;nativeId 表示系统 API 已接收,不单独证明横幅可见。GET /pharos/api/native-notifications(请求头 x-pharos-desktop:1)提供助手状态和最近 20 条原生事件;desktop-identity 记录绑定的主进程,com-activated.foregroundGranted 记录本次授权 API 结果,均不能单独代替前台实机验收。助手故障不会重复发送 Web 系统通知,而是补一次页内反馈;助手最多保留 512 个未释放条目,用户关闭或点击后释放。macOS 与普通浏览器仍用原来的通知通道。没有新 host 时保留旧 Web 路径及 workflowHistoryCleanup 诊断,其历史点击仍可能受宿主关闭事件影响。退出或重启后无法延续旧点击监听,旧版本历史不会自动接管。

改动自动保存(v0.6.2):设置页不再有底部「保存设置」按钮 —— 按钮在最底下,改完没滚到底就切走会以为没生效。现在任何改动停止约 0.8 秒后自动落盘(连续输入合并为一次写入),底部仅显示保存状态。host 离线时写入本地偏好层。

window.__dshPharos.config()           // 查看当前配置(含来源 configSource: 'server'|'local')
window.__dshPharos.setConfig({
  enabled: true,               // 主开关(关闭 = 全渠道静默,含 webhook)
  toast: true,                 // 系统通知
  sound: true,                 // 提示音
  volume: 0.5,                 // 音量 0~1
  autoFocus: true,             // 点通知聚焦 DSH
  attentionHiddenOnly: false,  // 「需要你」仅页面隐藏时提醒
  doneHiddenOnly: true,        // 「回复完成」仅页面隐藏时提醒
  doneNotifyMode: "hidden",   // v0.6.1:完成提醒三档 off | hidden(默认) | always(doneHiddenOnly 为向后兼容)
  currentQuiet: true,          // 当前会话+前台:「需要你」静默只留标记
  minIntervalMs: 6000,         // 「完成」同会话节流(SSE 与 uiSession 双源共用)
  reAlertMs: 600000,           // 未处理的「需要你」10 分钟后补发一次
  blinkFallback: true,         // 通知不可用时的 ⏳ 标题闪烁兜底
  language: "auto",            // 'auto' | 'zh' | 'en'
  quietHours: { enabled: false, start: "23:00", end: "08:00" }, // 免打扰(跨午夜;静默屏幕渠道与 webhook)
  skipSubagents: true,         // 忽略子代理帧(host 半)
  jobEvents: true,             // 后台任务事件提醒(host 半)
  workflowEvents: false,       // 工作流提醒(阶段/agent 事件;host 半,v0.6,默认关)
  workflowLog: false,          // 工作流日志(高频旁白,只进调试队列不弹通知;v0.6,默认关)
  hostNotify: false,           // 保留兼容字段;宿主原生通知未实现
  apiToken: "",                // 非空时 POST /pharos/api/trigger 须带 x-pharos-token 请求头
  webhooks: []                 // 出站 webhook 渠道配置(设置页管理)
})
window.__dshPharos.resetConfig()      // 恢复默认
window.__dshPharos.stats()            // 最近一轮当轮统计({durationMs,tokens,cacheHitRate,tps,...};无则 null)
window.__dshPharos.test("attention")  // 测试「需要你」
window.__dshPharos.test("done")       // 测试「回复完成」
window.__dshPharos.test("error")      // 测试「运行出错」(0.4;另支持 interrupted / limit / remote)
window.__dshPharos.test("done", { tokens: 240, cacheHitRate: 0.5, tps: 13.3 }) // 带可选统计参(v0.5)
window.__dshPharos.debug()
// 诊断要点:configSource(server=host 在线)/ sse('open'|'connecting'|'error')/
// framesReceived + lastFrameAt(SSE 帧计数——sse:'open' 但 framesReceived 恒 0 = 通道未通的可判定信号)

安装

通过公开 GitHub 仓库一键安装(零构建、零依赖,仓库根即插件包):

  • 桌面端(推荐):打开 DSH → 插件市场(dshmarket)→ 安装/添加 → 粘贴 GitHub 仓库地址(github:Leo-Cjw/dsh-pharos 或完整 URL)→ 安装 → 重启 DeepSeek Harness
  • CLI(GitHub 源):dsh plugin add github:Leo-Cjw/dsh-pharos(具体语法以 dsh plugin --help 为准)
  • npm(推荐):dsh plugin add dsh-pharos —— 已发布至 npm(dsh-pharos),一条命令装好。npm 包为预构建产物,免 allowBuilds 授权,体积约 130 KB(README 截图不随包分发,仅在 GitHub 显示)。
  • 插件市场搜索:收录 PR 已提交至 awesome-dsh-plugin(data/plugins/Leo-Cjw__dsh-pharos.yml),合并后即可在市场内直接搜到;在此之前请用上面三种方式安装。

本机开发安装(改本地代码直接生效,无需发布):

# ① 把仓库同步到 profile 的 local-plugins(源码地)
#    ⚠️ 用 rsync --delete,别用 cp -R:cp 只覆盖同名文件,旧布局遗留在根级的
#    client.js / index.js / settings-view.js 与孤儿 lib/webhook.js 会一直留着。
rsync -a --delete --exclude .git --exclude node_modules --exclude .DS_Store \
  <repo>/ ~/.dsh/profiles/desktop/local-plugins/dsh-pharos/
# ② 登记进 profile manifest(dependencies + bundles;link: 保持指向 local-plugins)
#    "dependencies": { ..., "dsh-pharos": "link:./local-plugins/dsh-pharos" }
#    "dsh.profile.bundles": [ ..., "dsh-pharos" ]
# ③ 物化 node_modules 链接(供应链年龄策略对本地 link 不适用,绕过校验即可)
pnpm install --dir ~/.dsh/profiles/desktop --config.minimumReleaseAge=0
# ④ 确认链接存在,然后重启 DeepSeek Harness
ls -la ~/.dsh/profiles/desktop/node_modules/dsh-pharos   # → ../local-plugins/dsh-pharos

注意:profile 的 node_modules 由插件管理器在启动时用 pnpm 重建,不在 dependencies 里的包会被清掉——这就是「装完重启后插件消失」的原因。务必走 ②③ 的登记流程。

仓库结构(即安装后的布局):

package.json        # dsh.bundle.patch + dsh.client 声明(browser 半,platform: web)
cordis.patch.yml    # 自挂载 loader 行(id/name: dsh-pharos)
lib/index.js        # host 半入口(apply → host.js:事件桥/SSE/Webhook/配置)
lib/host.js         # host 半组装(订阅/帧总线/出口过滤);lib/host/* 为模块
lib/client.js       # browser 半(全部逻辑 + 内联设置页;零 npm 运行时依赖)
lib/settings-view.js# 设置页规范源(内联进 client.js,改后运行 tools/sync-settings-view.mjs)

重启后在控制台验证:window.__dshPharos.test("done")。

开发

从 GitHub 克隆本仓库开发(git clone git@github.com:Leo-Cjw/dsh-pharos.git && cd dsh-pharos,零依赖、无需安装)。

  • 冒烟测试:node test/smoke.mjs(Node ≥ 18;驱动真实 lib/client.js;v0.3 全量断言 + M1 组共 349 项:SSE 帧消费 / 双源 done 去重 / quiet hours / 子代理过滤 / toast 兜底 / 服务端配置优先 / test() 扩展 / 当轮统计 / SSE 命名事件契约锁/跨文件静态契约锁(HOST_KINDS ⊆ SSE_KINDS、TEXT.zh/en key 一致、TEST_KINDS ⊆ ALL_TEST_KINDS)/ M1-L 测试按钮覆盖 workflow / M1-M 子代理 done 过滤——client 注册的事件名须与 host 写出的一致,防两侧漂移回归 / 图标防漂移锁——icon.svg 与内联导航标记的形状、网格、描边权重须一致 / v0.6.3 跳转会话组——真导航路径、老宿主兜底正反两面、归档/phase/state 闸门、ids vs byId、半初始化服务实例不被永久缓存、双形态 Notification(on('click') 与 onclick 各一条)、同一次完成双源去重、navLog/deliverLog 轨迹);host 半:node test/host.test.mjs(352 项:事件映射 / SSH・webhook / 鉴权 / 配置打码合并 / quiet hours / 帧去重);Windows 原生通道:node test/windows-notifications.test.mjs(原生助手 / 安装器 / 前台交接 / 路由 / 生命周期 —— 含按 64 字符上限模拟「构造成功但原生不显示」的契约回归)。三者由 npm test 一并执行
  • 发布流程:改 lib/ 与 package.json → node tools/sync-settings-view.mjs(设置页视图内联进 client.js,npm test 前会自动执行)→ 跑测试 → 升版本 → git push + 打 tag → 在 DSH 插件市场 / CLI 更新安装 → 重启后控制台 window.__dshPharos.test("attention"|"done"|"error") 验证
  • npm 发布流程:publish-npm.md(注册绕开网页拦截 / 2FA / Access Token / 已知坑)
  • 复盘文档:postmortem-0.6.3-nav.md(「点击通知不跳转会话」六轮排查的方法论:静默失败必须自带可观测性、观测代码要与被测代码同源、mock 保真度决定测试有效性)
  • 架构文档:functional-architecture.md(功能架构雏形:运行时能力核查 + 四仓库对标 + M0/M1/M2 里程碑)
  • 架构图:pharos-architecture.html(浏览器半 × Host 半双层结构)· pharos-sequence.html(通知事件流)——浏览器打开即交互(主题切换/聚焦/导出)
  • 对标仓库代码级分析:docs/research/(notify-me / turn-notify / my-notify / session-notify 逐文件报告)

工作原理

双半结构(v0.4):

  • 浏览器半(lib/client.js)订阅客户端 sessions 服务(硬依赖,本运行时必有)与 ctx.uiSession(惰性 ctx.get(),避免 inject 硬门控导致条目停在 pending):
    • uiSession.sessionStatus 每会话发布 { running, pendingInteraction, completionUnread },「需要你」与「回复完成」沿用 v0.3 语义(二次提醒/标题标记/闪烁兜底不变)。
    • v0.4 新增对 host 半事件流的消费:EventSource('/pharos/api/stream')(event: pharos 命名事件,帧 JSON)收 PharosEvent 帧,与本地 uiSession 信号共用同一策略层(quiet hours / 子代理过滤 / 双源 done 去重 / 通知渠道路由);系统通知不可用时页内 toast 兜底(上限 4 条、6s 消失、点击直达会话)。debug() 的 framesReceived 一栏可直接判定「通道已通」还是「连上但零帧」。
    • 设置页视图(lib/settings-view.js,内联于 bundle)挂 settings.section —— 顶级「设置 → 消息通知」分区,order 30;顶级分区的壳不画标题,故视图自绘 .pharos-title。
    • 图标:根目录 icon.svg(灯塔)经 package.json 的 icon 字段供给插件卡片 / 组合包详情页 / 组件行;设置导航那一行因 settings.section 无 icon 字段,由 installSettingsNavIcon() 按标签文本认领并换节点。两处共用同一几何(16 网格描边,与宿主 ui-primitives 图标契约一致:1.3 描边 / round cap / currentColor),test/smoke.mjs 的 M1-I 段锁 icon.svg ↔ 内联常量一致。
  • host 半(lib/index.js + lib/host/*,Electron 启动的 Node host 子进程):
    • 订阅 session/event(turn/end 的 reason.kind 主信号 → done/error/interrupted/limit,agent/error / agent/turn-stopping / agent/request-error / jobs 双轨兜底),构造 PharosEvent 帧。
    • ctx.webServer.register(同源路由,无独立端口):GET /pharos/api/stream(SSE,25s 心跳)/ POST /pharos/api/trigger(远程触发,loopback 围栏 + x-pharos-token)/ GET|PUT /pharos/api/config(掩码语义 ***=保留、""=清除)/ GET /pharos/api/webhooks。
    • 出站 webhook:企微/飞书/钉钉加签 + 通用透传;5s 超时、指数退避重试、失败环形缓冲 50 条;受 quiet hours / events / 子代理过滤约束。

对标社区插件:做到了什么 / 没做什么

对标项来源本插件
需要你操作(审批/提问/方案确认)+ 标题标记dsh-notify-me✅
已完成提醒(仅离开时)dsh-notify-me / dsh-turn-notify✅
未处理二次提醒dsh-turn-notify(10 分钟)✅
通知不可用时标题闪烁兜底dsh-turn-notify✅(⏳,6s)
耗时小结dsh-turn-notify / dsh-session-notify✅(客户端计时;token/TPS 需 host 侧数据,未做)
点击通知直达会话dsh-notify-me / dsh-my-notify✅ v0.6.3 真正可用(同类四个插件在当前运行时都无法跳转,详见复盘)
设置页(设置→消息通知)dsh-turn-notify / dsh-my-notify✅ v0.4(settings.section 槽位——与两个对标插件同款;React 经模块表 require('react'))
多事件分类(出错/被中断/达到上限)+ 独立音效dsh-turn-notify✅ v0.4(host 半 session/event reason.kind 归一定类 → SSE 帧;error 重低音、interrupted/limit 中音警示)
出站 webhook(企微/飞书/钉钉/通用 + 加签/重试/失败缓冲)dsh-my-notify✅ v0.4(host 半 /pharos/api/stream 双通道之一)
远程触发接口(本机 POST 通知)dsh-my-notify✅ v0.4(POST /pharos/api/trigger,loopback 围栏 + 可选 x-pharos-token)
Windows 原生推送dsh-session-notify✅ v0.6.4(隐藏原生 Toast 助手 + 独立 AUMID + COM 激活监听;修 issue #1)
自定义通知图片/图标dsh-session-notify❌ 未做

已知限制

  • 双半方案:DSH 页面需保持打开(最小化/切后台可以;退出应用收不到);host 半需挂载在同一 DSH(webServer 同源)。浏览器半在 host 不在线时自动回落 v0.3 行为(仅 needs-you / done)。
  • Electron 页面通知需允许 DeepSeek Harness 的系统通知权限(macOS:系统设置 → 通知)。
  • 首次页面加载后的第一声需要页面上有过一次用户交互(浏览器自动播放策略)。
  • 出错/被中断/达到上限依赖 reason.kind 在 turn/end 上的出现(0.2.0-rc.2 已见 interrupted/forked;更全的 kind 集合随运行时演进,未知 kind 静默降级由 agent/error 等兜底)。
  • 当轮统计(缓存命中率/TPS)依赖 host 半的官方投影 ctx.sessionProjections(tokenUsage/sessionStats);投影不可用或插件中途启用(无 turn/start 基线)时静默降级为「仅耗时+tokens」,不报错。
  • 点击通知通过 uiWorkspace.openSession 切换已有会话;归档、已删除或尚未就绪的会话不保证跳转。Windows 窗口恢复依赖 DSH 注册的 dsh://open 协议及同机 host;关闭自动聚焦后只切后台会话,不恢复窗口。
  • 宿主原生 osascript 通知(hostNotify)未实现,该配置项仅保留兼容。Windows 窗口恢复新增 node:child_process,只启动系统 explorer.exe 打开固定 dsh://open,不执行 shell、不接受请求提供的命令或 URL。历史投稿清单的「无 child_process」描述已不适用于 v0.6.4(Windows 窗口恢复引入),插件市场收录条目已按实际代码复核。跨设备通知仍请用 Webhook。
  • 工作流提醒(v0.6)默认关闭,需在设置页开启 workflowEvents;开启需重启 DSH 生效(订阅在启动时建立),关闭则即时生效。workflowLog(高频旁白)可独立开启,只进调试队列不弹通知。 → 完整效果、触发条件与排查步骤见 docs/sop-workflow-events.md(SOP)。 要实机验证?现成的工作流 prompt 见 docs/sop-verify-workflow-prompt.md。 ⚠️ 普通对话不会产生工作流事件 —— 仅当模型执行多 agent 工作流任务、脚本调用 phase()/agent() 时才有提醒。
  • 工作流帧本身的 agentType 恒为 root,因此「跳过子代理事件」对工作流提醒无效—— 这是刻意取舍:若标 subagent,默认的 skipSubagents=true 会把整组提醒全部吞掉。 但子代理会话自己的「任务已完成」通知会被该开关正确过滤 —— host 判出子代理后下发 sessionId: workflow 子 agent 走 agent-start 帧的 childId;普通 subagent 委派走 agents 元信息帧的 subagentSessionIds(v0.6.1 起支持,此前这类委派识别不了)。
  • 工作流「进入阶段」的去重键取阶段标题;若同一工作流在 3 秒内两次进入同名阶段,第二次不会重复提醒。

License

MIT

Related plugins