Skip to content

dsh-mouse-mode

Verified

dsh-mouse-mode · v0.2.0 · MIT · Web UI

DSH Web 客户端的纯鼠标操作模式:长按中键开关;模式内 侧键·后退=下一个会话、长按侧键·后退=新建对话、侧键·前进=上一个会话、滚轮切会话、中键单击=语音输入、左/右键批准或拒绝确认框。所有手势可在插件设置里改绑。

Install

dsh plugin add dsh-mouse-mode

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Tags

Creators

Readme

dsh-mouse-mode

给 DeepSeek Harness Web 界面加一个纯鼠标操作模式:长按鼠标中键开关,开启后不用碰键盘也能新建对话、切换会话、批准/拒绝确认框、滚回最新;长按侧键·后退键约 0.9 秒就是新建对话(单击后退=下一个会话,前进=上一个会话)。所有手势都能在插件设置里改绑。

English | 中文

为什么

DSH 的键盘快捷键很全,但有些场景下(一只手拿东西、手边只有鼠标、或者单纯不想离开鼠标)更希望只用鼠标完成操作。这个插件把常用动作挂到鼠标上,而且做成模式——不开的时候一行代码都不接管,界面行为与原生完全一致。

安装

通过官方 CLI 安装(会把本包加入该 profile 的 bundle 栈):

dsh plugin --profile web add dsh-mouse-mode

也可以直接在界面的插件管理页里搜索安装。安装后刷新页面(Ctrl+R)生效。

本插件只有浏览器半边(lib/client.js + cordis.patch.yml),不需要任何运行时依赖。

开关

  • 长按鼠标中键约 0.9 秒:进入 / 退出鼠标模式。
  • 进入后左下角出现状态牌 「🖱 鼠标模式 · 长按中键关闭」;点它即可退出。
  • 模式状态记在 localStorage,刷新后保持。
  • 调试用:控制台里 __dshMouseMode.on() / .off() / .toggle() / .isOn()。

配置(可改绑)

在插件详情页(插件管理里的 dsh-mouse-mode)有设置面板,可以为每个手势选择动作:中键单击、长按中键、侧键后退、长按侧键后退、侧键前进、长按侧键前进、左键+右键同按、确认框内的左键 / 右键。改动立即生效并保存在浏览器本地(localStorage),所以不同鼠标的人可以各自改绑。

另有两个开关:

  • 滚轮切会话(默认开):指针在左侧会话列表上时,滚轮 = 上一个 / 下一个会话。
  • 滚轮优先滚主对话(默认开):指针停在右侧文件 / 预览面板上时,滚轮仍然滚主对话——否则打开一个文件后,滚轮常常"滚进文件里"、回不到对话。

控制台里也能改:

__dshMouseMode.config()                                // 查看当前映射
__dshMouseMode.set({ forwardButton: "nextSession" })   // 改绑
__dshMouseMode.reset()                                 // 恢复默认

可绑定的动作:none、latest(回到对话最新)、newSession(新建对话)、nextSession、prevSession、stop(打断回复)、mode(开关模式)、voice(语音输入)、allow、reject。

关于 newSession:它点的是左侧栏那颗「新建会话」按钮。那颗按钮没有语义化 data 锚点,只能按可访问名(aria-label)找,候选写了中/英/日/韩几种写法;界面换了别的语言或 DSH 改了这颗按钮时,该动作静默失效(不报错、不改界面)。

关于 voice:它优先调用语音输入插件暴露的 window.__dshVoiceToggle(本仓库配套的语音补丁会提供这个桥),没有桥时退化为合成一次 Ctrl+空格。所以这个动作要求你的语音输入插件本身能被 Ctrl+空格 触发;若两者都没有,中键不会产生任何效果(也不会报错)。

模式下的手势

手势 动作
中键单击 语音输入:开始 / 停止听写(配合语音输入插件;说完全自动发送)
中键长按(0.9 秒) 开关鼠标模式
侧键·后退 下一个会话
长按侧键·后退(0.9 秒) 新建对话
侧键·前进 上一个会话
长按侧键·前进(0.9 秒) 默认不绑定
滚轮(指针在左侧会话列表上) 上一个 / 下一个会话(首尾相接循环)
左键 出现确认框时 = 同意(允许一次)
右键 出现确认框时 = 否定(拒绝)
左键+右键同按 默认不绑定:两键同按容易误触(会带出右键菜单、误触发左键动作),需要时再到设置里绑上

全局可用的手势有两个:中键单击(语音)与长按中键(开关模式);其余手势仅在模式内生效。侧键的前进 / 后退一律不再触发浏览器的前进后退。

「打断当前回复」和「回到对话最新」默认没有手势(中键让给了语音),需要的话在设置面板里绑给任意一个。

设计上刻意规避了几类误操作:

  • 拖拽不算点击:想拖选确认框里的命令再读一遍,不会因此批准;
  • 点在确认框自己的按钮上时交给它处理,一次点击不会产生两个决定;
  • 确认框之外,左右键保持原生行为(选中、右键菜单等),不会被改写;
  • 上述动作的 DOM 锚点缺失时(例如另一个 DSH 版本改了结构),对应手势静默失效,不报错、不改界面。

已知副作用

  • 中键的浏览器「自动滚动」被屏蔽:中键要用来长按开关,无法两全。
  • 该副作用在模式外同样生效(因为开关手势本身要能在模式外触发)。

实现依据

插件只使用 DSH 现有的语义化 DOM 锚点,不依赖任何内部服务或私有 API:

用途 锚点
会话列表 / 当前项 [role="tree"] 内的 [data-row-key^="session:"],当前项为 aria-selected="true"
对话滚动容器 [data-conversation-scroll]
对话区域 [data-conversation-region]、[data-conversation-session]
确认框 [data-approval-key],内部按钮顺序为 [拒绝, 允许]

「打断回复」没有直接调用内部动作,而是复用 DSH 自带的**连按两次 Esc**序列,并把合成事件派发到对话区域元素上(DSH 会校验事件来源必须位于对话区域内)。

卸载

dsh plugin --profile web remove dsh-mouse-mode

或在插件管理页里移除,然后刷新页面。

开发

lib/ 下的文件是手写并直接发布的(无构建步骤)。修改后可用随附的离线冒烟测试验证:

node verify-client.mjs

它用最小 DOM + React 桩把打包后的客户端半边真实执行一遍,断言:模块注册、apply/inject 导出、配置读写、设置面板注册与渲染、长按开关、滚轮换会话、中键回最新、左/右键批准与拒绝、左右键同按跳会话、侧键前进/后退(含新建对话)、拖拽不误触发、手势改绑后按新映射生效、模式门控、卸载清理。

License

MIT