dsh-wait:在 DSH Web UI 裏給消息發送加一道確認

前言

DSH 的 Web UI 裏,消息發得很快:在輸入框按 Enter、按 Ctrl/Cmd+Enter,或者點一下發送按鈕,內容就離開本地了。長對話裏改一句措辭重發、半句話沒寫完就誤觸,都是高頻場景。客戶端本身沒有發送前的確認環節,這類需求只能靠插件補。

下面介紹 a-2788553793/dsh-wait,由 A-2788553793 維護,是一個客戶端插件,作用是在 DSH Web UI 裏發送消息之前彈窗確認,取消則保留草稿。在社區目錄中它被列入 admin-security 分類。

這是什麼

dsh-wait 掛在 DSH 客戶端上,在消息真正發送之前插入一個確認窗口,完整展示即將發送的內容;確認才發,取消則草稿原樣保留,繼續編輯。適用對象是日常用 DSH Web UI 聊天、希望發送動作多一道確認的開發者。

插件目錄結構不大:index.js 是入口,client.js 是客戶端邏輯,另有 cordis.patch.yml、locale/*.json、icon.svg。package.json 裏 dsh.client 聲明瞭 platform: web、immediately: true,並注入 @deepseek-ai/dsh-client-ui-conversation。

核心功能

攔截三種發送方式:Enter、Ctrl/Cmd+Enter、點擊發送按鈕。確認彈窗展示完整草稿,超過 4000 字時預覽會截斷,但實際仍發送完整內容。

取消不丟草稿:Esc、點擊遮罩或「取消」按鈕均可關閉窗口,草稿留在輸入框裏。

彈窗內的確認操作:Enter / Ctrl/Cmd+Enter / 點「發送」都能確認,Tab 可以在「取消」「發送」之間切換。彈窗默認聚焦「發送」,所以連續按兩次 Enter 纔會真正發出——第一次被攔截並彈窗,第二次確認。

幾個邊界情況也覆蓋到了:新會話(hero 輸入框)的第一條消息同樣會確認;忙時排隊 / 插話發送同樣會確認;以 / 開頭的斜槓命令不攔截,交給 DSH 自己的命令菜單處理;界面文字跟隨 DSH 的語言設置(中文 / English)。

最後是失敗開放(fail-open):插件內部異常或彈窗未能掛載時,守衛放行,不會把消息卡住。

安裝與啓用

在 DSH 會話中執行:

plugin_manager action=install_bundle target="dsh-wait"

安裝後需要強制刷新頁面(Ctrl+Shift+R),讓客戶端邏輯重新掛載。

卸載或停用:

plugin_manager action=set_bundle target="dsh-wait" enabled=false

package.json 版本號爲 0.1.3,license 爲 MIT。

典型用法

  1. 正常輸入消息。
  2. 按 Enter、Ctrl/Cmd+Enter 或點發送按鈕——不會立即發送,而是彈出確認窗口。
  3. 在窗口裏選擇:
    - 按 Enter / Ctrl/Cmd+Enter 或點「發送」:確認發送
    - 按 Esc、點遮罩或點「取消」:關閉窗口,草稿原樣保留
    - 按 Tab:在「取消」「發送」之間切換

日常使用裏注意一點:彈窗默認聚焦「發送」,所以兩次 Enter 是固定節奏,第一次彈窗、第二次發出。只按一次 Enter 只是打開了確認窗口。

實現要點

DSH 客戶端沒有暴露發送攔截 API,所以這個插件在 apply 中直接安裝 document 捕獲階段的 keydown / click 監聽:

  • 發送按鈕識別爲 [data-composer-card] 內的最後一個 <button>,編輯器是卡片內的 [contenteditable="true"]。
  • 用戶在彈窗裏確認後,插件重放原始事件,保留 Ctrl/Cmd 語義和點擊路徑,而不是直接調用 inputActions.submit()——後者會強制進入 queue 模式。
  • 彈窗註冊在根級 shell.overlay 槽位,因此還沒有任何 session 的新會話也能顯示。
  • 守衛只在彈窗組件已掛載時生效,內部異常時放行,不會阻塞發送。

適用場景與注意

適合日常在 DSH Web UI 裏聊天、希望發送前多看一遍內容的開發者,也適合腳本化操作、誤觸發送代價較高的長對話場景。不需要改代碼,裝完刷新頁面即可。

幾個限制要清楚:

  • 普通會話裏「純附件、無文字」的發送不會被確認,那個位置可能是停止按鈕,無法僅憑 DOM 區分。
  • 插件依賴宿主 DOM 結構(data-composer-card / data-composer-overlay / 按鈕順序)。DSH 客戶端改版後守衛可能自動失效,且不會報錯,表現爲發送不再彈窗。
  • 通過輸入框以外的入口(非 composer)觸發的消息不受影響。

另外需要明確權限邊界:插件以當前 DSH 進程的權限運行,能碰觸的不只是聊天界面,還包括進程能訪問的本地資源與憑據。安裝前應先讀一遍源碼(倉庫公開)、確認 cordis.patch.yml 的補丁內容,並覈對許可證(MIT)。

結尾

dsh-wait 解決的是一個很具體的問題:把「發送」這個一觸即發的動作變成一次可撤回的確認。不改變 DSH 的使用方式,取消時也不丟草稿,代價是一次多按的 Enter 和對 DOM 結構的依賴。

目錄頁:https://www.skillhub.cn/plugins/A-2788553793/dsh-wait
源碼:https://github.com/A-2788553793/dsh-wait

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

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

小夜