dsh-mouse-mode
已验证dsh-mouse-mode · v0.2.0 · MIT · Web 界面
DSH Web 客户端的纯鼠标操作模式:长按中键开关;模式内 侧键·后退=下一个会话、长按侧键·后退=新建对话、侧键·前进=上一个会话、滚轮切会话、中键单击=语音输入、左/右键批准或拒绝确认框。所有手势可在插件设置里改绑。
安装
dsh plugin add dsh-mouse-mode 用 dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南。
源码
发布到 npm 但没有公开仓库。安装前请检查包内容。
标签
作者
说明文档
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