dsh-focus-notify:焦點感知的 DSH 客戶端通知

前言

在 DeepSeek Harness(DSH)裏同時跑多個會話時,審批、方案確認、提問和回覆完成往往發生在「當前不在看的那條對話」裏。若通知策略只認「頁面是否可見」,在 macOS 上窗口被其它應用蓋住時 document.hidden 仍可能爲 false,容易把「人其實在 Edge 或 IM 裏」誤判成「正盯着 DSH」,從而漏掉需要你點一下的操作。

下面介紹社區客戶端插件 dsh-focus-notify(維護者 sqzw-x;SkillHub 目錄條目爲 sqzw-x/dsh-alerts)。它把審批、提問、方案確認、回覆完成統一當成一種桌面提醒,用 窗口鍵盤焦點(document.hasFocus())區分「當前會話」和後臺會話,而不是單靠頁面可見性。

這是什麼

dsh-focus-notify 是跑在 DSH Web / DSH Desktop 頁面內的 Cordis 客戶端 bundle 插件:訂閱宿主已有的 uiSession.sessionStatus 與 sessions.list,在規則允許時發系統通知,並在你回到對應會話或窗口重新獲得焦點時收掉該會話的通知。

DSH 生態強調「一切皆插件」;SkillHub 等目錄站是社區聚合,與 DeepSeek / 幻方無官方從屬關係。安裝前建議自行查看源碼與許可證——插件與當前 DSH 進程同權限運行。

三條提醒規則

README 把行爲收成三條,判定邏輯集中在 src/engine.ts 的 allows()(純邏輯,可單測):

  1. 看會話:屏幕上由 retainedBy.mainView 推導的「當前會話」,僅在 窗口失去鍵盤焦點 時彈通知;其它會話在 DSH 窗口仍在前臺時也會彈。子代理會話默認不參與(ignoreSubagent 默認爲 true,可關)。
  2. 看事件:輪次結束(回覆完成)與「等你操作」(pendingInteraction:審批 / 方案確認 / 提問)都會彈;同一 pending 請求按 key 去重,只提醒一次。
  3. 回到會話就收掉:聚焦到該會話時通知消失——點通知進入、窗口重新獲得焦點、手動切到該會話都算;失焦時僅切會話不會順帶清通知。

完成判定用 running 從 true 落到 false 的邊沿,且停止時沒有緊接着的 pending;刻意不用 SDK 的 completionUnread 作完成信號,以避免後臺會話完成提醒被側欄未讀邏輯誤清。代價是「客戶端尚未觀察到 running === true 就結束」的回覆可能不提醒(例如橫跨一次頁面重載)。

安裝與啓用

插件管理器:在 DSH 設置 → 插件 中安裝本包對應目錄條目,啓用後 重啓 DSH Desktop(客戶端 bundle 在頁面加載時讀取)。

命令行(資料原文,Desktop profile):

# 從 GitHub 安裝
dsh plugin --profile desktop add github:sqzw-x/dsh-focus-notify

npm 包發佈後,可改爲:

dsh plugin --profile desktop add dsh-focus-notify

裝完後同樣需要重啓 DSH Desktop。若只想停用而不卸載,可在 profile 的 cordis.patch.yml 中:

- id: dsh-focus-notify
  disabled: true

package.json 中 engines.dsh 聲明瞭兼容的 DSH 版本區間;實際閘門主要來自 peerDependencies 裏的 @deepseek-ai/dsh* 前綴包。

配置與調試

默認值即可使用。在頁面控制台可臨時改行爲(配置持久化在 localStorage 的 dshFocusNotify.config):

__dshFocusNotify.configure({ sound: true })   // 打開提示音(WebAudio,需頁面有過交互)
__dshFocusNotify.configure({ enabled: false }) // 暫時全關(仍跟蹤狀態)
__dshFocusNotify.debug()                       // 當前會話、未送達等待、計數、權限、焦點、導航路徑
__dshFocusNotify.test()                        // 繞過規則發一條,驗證通知通道
__dshFocusNotify.open('session-id')            // 按 id 切會話,驗證點擊路徑
字段 默認 說明
enabled true 總開關
ignoreSubagent true 子代理會話不提醒
language 'auto' 跟隨 DSH 界面,或 'zh' / 'en'
sound false 通知外額外提示音

排查「點了通知沒切會話」時,debug() 裏的 navigation 表示將使用的切會話 API(uiWorkspace.openSession / sessions.open / none);counters.failed 爲導航失敗次數。每條通知還會在 window 上派發 dsh-focus-notify:alert(event.detail 含 kind / sessionId / title / body / tag),便於自接任務欄閃爍、自定義聲音或日誌。

點擊通知時,桌面端通過 dsh://open 深鏈抬窗,瀏覽器分支使用 window.focus();再調用宿主切會話。權限被拒絕時不發通知,debug().permission 爲 denied。

適用場景與限制

適合:主要在 DSH Desktop 上多會話並行、希望「當前對話失焦才吵我、後臺隨時吵我、子代理默認靜音」的用法。README 寫明 只在 DSH Desktop 上實測過;Web 版能否正常抬窗與走權限流程 未驗證。

需注意:

  • 宿主若無 uiWorkspace.openSession 與 sessions.open,點擊通知可能只能抬窗不能切會話。
  • 宿主缺少 retainedBy.mainView 時,所有會話按「非當前」處理,即都會提醒。
  • 通知樣式與時長由系統決定(macOS:系統設置 → 通知 → DeepSeek Harness)。
  • 僅在 DSH Web / Desktop 頁面內工作;dsh-app:// 頁面無法註冊 Service Worker,本插件也不依賴通知按鈕。

結尾

dsh-focus-notify 用焦點而非「頁面可見」劃分當前與後臺會話,並把審批、提問、方案確認與回覆完成統一成一種提醒,減少多會話時漏操作的情況。安裝命令以 README 爲準;目錄與討論可分別從 SkillHub 與 GitHub 進入。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜