前言¶
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。
典型用法¶
- 正常输入消息。
- 按
Enter、Ctrl/Cmd+Enter或点发送按钮——不会立即发送,而是弹出确认窗口。 - 在窗口里选择:
- 按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