Chuyển đến nội dung chính

dsh-mouse-mode

Đã xác minh

dsh-mouse-mode · v0.2.0 · MIT · Giao diện web

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

Cài đặt

dsh plugin add dsh-mouse-mode

Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.

Mã nguồn

Phát hành lên npm mà không có repository công khai. Hãy kiểm tra nội dung package trước khi cài.

Thẻ

Tác giả

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