dsh-enter-guard:用连按两次 Enter 防止误发消息

前言

在 DeepSeek Harness(DSH)的 Web 客户端里,输入框默认用 Enter 直接发送。写长提示或改草稿时,手指多按一次回车,整段未写完的内容就会出去,既浪费一轮对话,也可能把半成品指令交给智能体。

DSH 在 Settings → General → Enter behavior 里可以配置:智能体忙碌时 Enter 是排队(queue)还是转向(steer)。这项设置针对的是「忙碌态」下的行为,空闲时误触 Enter 仍会立刻发送,没有确认步骤。社区目录里与草稿相关的插件(例如暂存、定时发送、发送前改写等)也不拦截键盘上的 Enter。

下面介绍维护者 Liyu147 发布的客户端插件 dsh-enter-guard:第一次 Enter 只「武装」输入区并提示再按一次才发送,第二次 Enter 才真正发出;期间按任意其他键会取消武装。目标是挡住「半写消息被 stray Enter 发出去」这类事故。

这是什么

dsh-enter-guard 是面向 DSH Web 的 Double-Enter send guard(双 Enter 发送守卫)。分类为客户端插件;当前 package 版本为 0.1.0,许可证 MIT。仓库:https://github.com/Liyu147/dsh-enter-guard;社区目录页:https://www.skillhub.cn/plugins/Liyu147/dsh-enter-guard。

插件不改动草稿内容、不调用 setDraft、不碰附件管线,只在 DOM 层监听按键,属于只读交互增强;卸载或失效时应恢复 DSH 原生 Enter 行为。

核心行为

整体状态机可以概括为:

输入文字 ──▶ Enter ──▶ 未发送,输入区描边,提示「再按 Enter 发送」
                     │
                     ├── 再次 Enter ──▶ 发送
                     └── 任意其他键 ──▶ 取消武装,回到常态

与 README 行为表一致的主要规则如下。

情况 结果
第一次 Enter(无修饰键、非 IME 组字、非长按连发) 拦截 — 输入区描边并显示提示
已武装时再按 Enter 放行,由 DSH 原生逻辑发送
武装期间按任意其他键(字母、数字、Backspace、方向键、Shift、Ctrl 等) 立即取消武装
草稿变更、IME 开始组字、失焦、点击外部 取消武装
Ctrl/Cmd+Enter、点击 Send 立即发送,不经双 Enter(刻意留的逃生口)
/ 命令菜单或 @ 文件菜单打开时 不拦截,Enter 用于选中候选
长按 Enter(连发) 忽略,不会单独触发发送
空草稿(无文字、无附件) 不拦截
武装后约 2 秒 提示淡出,状态仍保留,稍后 Enter 仍可发送

README 提到对约 6084 个 DSH 插件的目录扫描中,未见同类的 Enter 拦截插件;相近能力多集中在草稿暂存、队列增强、定时发送或发送前改写,不挡第一次 Enter。

安装与启用

尚未发布到 npm,需从源码目录安装(命令摘自仓库 README)。

git clone https://github.com/Liyu147/dsh-enter-guard.git
dsh plugin --profile web add ./dsh-enter-guard

本地已有检出时,可将 add 指向目录路径:

dsh plugin --profile web add /path/to/dsh-enter-guard

安装后需要 重启 dsh web。仅刷新页面不够,客户端 bundle 在启动时解析。

卸载:

dsh plugin --profile web remove dsh-enter-guard

在浏览器 DevTools 控制台可检查插件是否挂载:

__dshEnterGuard.instance.inspect()
// => { version, mounted: true, armed: false, hasCard: true, everBlocked: false, ... }

hasCard: false 表示未找到 composer 锚点,需看兼容性说明。everBlocked 在插件真正吞掉过一次 Enter 后会变为 true,用于确认按键路径端到端有效。

典型用法与自测要点

日常写作流程:在 composer 里输入内容 → 第一次 Enter 看到描边与「再按 Enter 发送」类提示 → 确认无误后再按 Enter 发送;若误触第一次 Enter,继续打字或按任意非 Enter 键即可取消武装。

README 建议的手动回归检查包括:

  1. / 打开命令菜单 → Enter 应选中候选,而非进入双 Enter 流程。
  2. @ 打开文件菜单 → Enter 应插入引用。
  3. Shift+Enter → 插入换行,无描边武装。
  4. Ctrl+Enter → 立即发送。
  5. 智能体忙碌时 Enter → 仍按全局设置排队或 steer。
  6. 粘贴图片后 Enter → 附件应随消息一起发送。

开发侧仓库在包父目录提供两个零依赖 Node 测试脚本(test_guard_enter_send_v1.js、test_client_bundle_v1.js),用于状态机与打包 bundle 的自动化用例;它们不在发布 tarball 内,按需在本机检出后运行。

兼容性与已知限制

插件通过 DSH Web 客户端(dsh-client-ui-conversation)上的 data 属性定位元素,例如 [data-composer-card]、[data-composer-input]、[data-trigger-menu]、[data-composer-chip]。若未来 DSH 重命名这些选择器,插件设计为 fail safe:变为 no-op,恢复原生 Enter,不会吞消息;启动约 5 秒后若锚点缺失会在控制台告警。

README 记载在 DSH 0.1.5-rc.3、Windows / Chrome 下做过验证。

已知限制(摘自 README):

  1. 只拦键盘 Enter;Send 按钮与 Ctrl/Cmd+Enter 始终立即发送。
  2. 无法阻止直接调用 submit() 的插件(例如部分语音输入自动发送)。
  3. 依赖 DOM 锚点;未在移动端虚拟键盘上验证(可能不触发 keydown)。
  4. 假定只有一个 composer card(取第一个匹配),常规单会话 UI 不受影响。

安全与权限说明

实现为只读 DOM:文档级 keydown / input / compositionstart / focusout / click 监听,注入一段样式与一个浮动提示 div。无网络请求、无 localStorage / cookie、不写会话或设置;宿主侧为空壳。决策代码包在 try/catch 中,内部错误时 fail open,恢复原生按键行为。

DSH 插件以当前 dsh 进程及 Web 客户端上下文运行。安装前请自行阅读源码与 MIT 许可证,确认符合你的安全与合规要求;社区目录站点与 DeepSeek / 幻方无官方从属关系,不宜当作官方应用商店。

结尾

dsh-enter-guard 用「第一次 Enter 武装、第二次发送、其他键取消」的轻量规则,补上 DSH 空闲态下缺少发送确认的空档,且刻意保留 Ctrl/Cmd+Enter 与 Send 作为明确发送路径。若你经常在 composer 里写长提示,可以先按上文命令装入 Web profile 并重启 dsh web,用 inspect() 与六项手动检查确认行为符合预期。

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

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

小夜