前言¶
在 DeepSeek Harness 中与智能体交互时,对话里经常出现文件路径、代码片段、图片链接。当前插件(如 dsh-filemenu)要么只认绝对路径,要么只认助手消息气泡,要么命中不了就不弹。这导致想打开文件或复制图片时,还得手动选中复制,操作割裂。
dsh-chat-ctxmenu 针对这个问题,在对话区加一个真正好用的右键菜单:复制文本/图片、打开文件、在文件管理器中显示。
是什么¶
dsh-chat-ctxmenu 是一个 DeepSeek Harness 客户端插件,由 kingofpowers 维护。它通过监听对话区的右键事件,根据光标位置、元素提示、文本块扫描提取候选路径,再交给 Host 用真实 fs 校验,只对存在且可信的路径弹出菜单。
核心功能¶
路径识别优先级¶
- 光标所在文本 token 优先
- 其次元素
title提示(文件 chip、内联引用、工具卡按钮) - 最后回退到所在文本块扫描
支持的路径形式¶
- 相对路径:按会话工作目录解析,
src/app.ts、./dist/x.js、反引号里的package.json都能用 ~/…、UNC、驱动器路径、POSIX 绝对路径同样支持- 代码块内的
path:line/path:line:col会剥离行号后再解析,行号只用于菜单标题展示
菜单项¶
| 右键位置 | 菜单项 |
|---|---|
| 任意对话文本 | 复制选中内容(有选区时)· 复制整条消息 |
| 文件路径(正文 / 内联代码 / 产出文件 chip / 工具卡) | 打开 · 在文件管理器中显示 · 用其他应用打开 ▸(系统为该文件注册的应用 + 选择其他程序…)· 复制路径 · 复制相对路径 · 复制选中内容 · 复制整条消息 |
| 图片(消息里的图片、缩略图、点击预览后的原图) | 复制图片 · 复制图片链接 · 另存为图片 |
| 链接 | 在浏览器中打开 · 复制链接 |
- 文件夹:
打开= 在文件管理器中打开该文件夹;在文件管理器中显示= 在父目录中选中它 - 图片:
复制图片会把图片转成 PNG 写入剪贴板;如果当前环境拒绝图片剪贴板,会自动降级为复制图片链接并提示。另存为图片优先保留原始格式 - 菜单跟随光标并自动避开视口边缘;Esc / 点击外部 / 滚动关闭;支持 ↑↓/Enter 键盘操作
实现方式¶
Client(浏览器)
shell.overlay 条目:document capture 阶段的 contextmenu 监听
→ 光标 caret 定位 token / 元素提示 / 文本块扫描
→ POST /dsh-chat-ctxmenu/rpc { action, args }
Host(Node)
resolve → fs.resolve + lstat + listDir(相对路径按会话 cwd)
open / reveal / apps / openWith
→ sessionController.openWorkspacePath / workspacePathApplications
(与会话头部 Open In… 同一条原生授权通道)
openUrl → Start-Process / open / xdg-open
回退:若 sessionController 服务不存在,open/reveal 退回 node:child_process 调系统打开器(explorer / open / xdg-open),并等待子进程真正 spawn 才报成功;若原生通道明确拒绝(gateway/bad-request、gateway/cancelled、native-open-unavailable 等),则视为终态、不回退,避免绕过 Harness 的授权判定。
会话工作目录取自 Client 的 useSessions 快照,同时兼容两种形状:{ current } 与 { ids, byId, retainedBy.mainView }。
所有候选路径都先由 Host 的 fs 服务校验存在性(path:line 会先剥离行号,~/ 会展开为 home),只有确认存在的路径才会出现打开类菜单。
安装与启用¶
从 npm 安装:
dsh plugin --profile desktop add dsh-chat-ctxmenu
或在会话中让 agent 执行:
plugin_manager action=install_bundle target=dsh-chat-ctxmenu
从本地目录 / tarball 安装:
dsh plugin --profile desktop add <本目录绝对路径>
# 或
dsh plugin --profile desktop add ./release/dsh-chat-ctxmenu-1.0.0.tgz
在 DSH 会话中让 agent 执行(bundle 目录为本仓库):
plugin_manager action=install_bundle target=<本目录绝对路径>
安装后 Host 侧热加载;浏览器端刷新页面后生效。
检查:
cordis_inspect_query client Slots.listSubTree root=shell.overlay # 应出现 chat-ctxmenu
GET /dsh-chat-ctxmenu/status # 应返回 ok:true
卸载:
plugin_manager action=remove_bundle target=dsh-chat-ctxmenu
典型用法¶
在对话区右键点击文件路径(如 ./src/app.ts 或 ~/config.json),会弹出包含「打开」「在文件管理器中显示」「复制路径」等选项。
右键点击图片,可选择「复制图片」(转为 PNG 写入剪贴板)、「复制图片链接」或「另存为图片」。
右键点击链接,可选择「在浏览器中打开」或「复制链接」。
适用场景与注意¶
适合需要在对话中快速操作文件、复制图片或链接的开发者。插件以当前 DSH 进程权限运行,安装前应检查源码与许可证。
已知限制:
- 依赖对话节点带
data-chat-flow-kind标记;若未来 DSH 改动该标记,菜单会静默不触发(不会误弹) - 纯正文里无分隔符、无反引号的单词文件名(如「改一下 index.js」)只有在会话工作目录下确实存在同名文件时才会出现打开项
- 一次菜单最多解析 8 个候选路径,取第一个真实存在的;同一文本块出现多个候选时只接受唯一的绝对路径
- 未加引号、含空格的 Windows 路径会同时提交「截断版 + 扩展版」两个候选
- Windows 上「用其他应用打开」的实现:系统注册信息里的应用 id 就是该应用的 exe 路径;UWP/AUMID 等非 exe id 仍走原生通道
结尾¶
这个插件把文件操作、复制图片、链接打开这些高频动作直接集成到对话区右键菜单,减少手动选中复制的步骤,适合日常开发中频繁与智能体协作的场景。
目录页:https://www.skillhub.cn/plugins/kingofpowers/dsh-chat-ctxmenu
GitHub:https://github.com/kingofpowers/dsh-chat-ctxmenu