前言¶
DeepSeek Harness (DSH) 的通知機制由桌面殼處理。若桌面殼未響應或處於開發環境,通知可能無法在頁面內可見。dsh-notify 插件提供了 web 側的通知顯示層,通過訂閱桌面殼的 __dshExo 橋接事件來渲染全局 toast 棧,並支持點擊程序化激活會話。
安裝¶
使用以下命令安裝插件:
dsh plugin --profile web add github:qgx1992/dsh-notify
安裝後需要重啓 web 進程才能生效:
dsh web 重啓
頁面刷新即可加載 /plugins/dsh-notify/client.js。
核心功能¶
本插件提供以下能力:
- 全局右上角 toast 棧:在頁面右上角顯示通知列表,同屏上限 5 條,超出時淘汰最舊的通知。
- 訂閱桌面殼橋事件:默認訂閱
window.__dshExo橋事件,包括對話完成、服務事件、更新就緒等。 - 程序化激活會話:點擊 toast 時,通過
ctx.sessions.open(id)調用官方 runtime API 激活會話,替代對 DOM 的 hack 操作。 - 無殼降級模式:當檢測不到桌面殼(如直接用瀏覽器打開 web 頁面)時,自動降級訂閱
sessionsstore,自繪輪次完成 toast。 - 分級顯示:根據通知類型(信息/成功/錯誤/警告)顯示不同的樣式和左側豎色條。
- 自動關閉策略:根據類型自動關閉,信息 8s、成功 6s、錯誤與更新 15s、警告 12s。
- 自建容器:使用自建的
fixed容器渲染,不搬動 DSH slot 節點,避免渲染卡死。 - 國際化:支持
zh和en語言。
架構與工作流¶
插件運行在兩種互斥的數據源模式:
殼橋模式(默認)¶
桌面殼通過 __dshExo 橋接器向頁面投遞通知事件。插件檢測到橋存在後進行握手,訂閱 onEvent 回調,渲染 toast 棧。點擊 toast 後調用 ctx.sessions.open(id) 激活會話。
無殼降級模式¶
當頁面直接運行在瀏覽器中,沒有 window.__dshExo 時,插件訂閱 ctx.sessions.list,檢測會話狀態變化(如從 running 到 idle),自繪完成 toast。
橋契約¶
插件僅消費 window.__dshExo 的最小白名單 API,不依賴任意 IPC:
interface DshExoBridge {
/** 訂閱殼推送的通知事件,返回取消函數 */
onEvent(cb: (ev: NotificationEvent) => void): () => void
/** 頁面 → 殼:點擊 / 已讀回執 */
send(channel: 'notify:click' | 'notify:seen', payload: { id: string; sessionId?: string }): void
/** 頁面 → 殼:握手 */
ready(): void
/** 殼版本探針 */
appInfo(): { version: string }
}
事件類型包括:session-done(對話完成)、service-ready(服務就緒)、service-error(服務異常)、service-restarting(服務重啓)、update-ready(更新就緒)。
行爲細節¶
- 點擊激活:點擊 toast 會調用
ctx.sessions.open(id)。插件會校驗會話 ID 是否在列表中,若unknown id會報錯;若會話處於pending狀態,每 500ms 重試至多 4 次。 - 已讀回執:事件渲染即觸發
notify:seen回傳給殼側。 - 樣式與主題:toast 樣式使用 DSH 主題變量,自動適配亮/暗色模式。
- 異常處理:所有異常均通過 try/catch 靜默降級,不向殼或頁面拋出。
注意事項¶
- 本地分發:該插件默認不發佈 npm 也不上傳 GitHub,僅通過
dsh plugin --profile web add link:<本地路徑>安裝。 - 供應鏈策略:新發布 <24 小時內可能因 pnpm 供應鏈策略報錯,需將版本加入
minimumReleaseAgeExclude白名單。 - 本地開發:本地開發時,由於項目路徑可能含空格或中文,需使用無空格的 Junction 指向真實目錄,否則 link: 命令會失效。
- 源碼修改:開發時修改
lib/client.js後需運行語法檢查,然後刷新頁面即可生效。