dsh-selection-followup · 选中追问
在 DeepSeek Harness 的对话里选中一段文字,旁边会浮出一个小「追问」按钮。 点一下,选中的内容就变成输入框里一枚引用卡片,接着问就行。
它解决什么问题
看长回答时想追问某一段,通常得先复制,再切到输入框粘贴,再手动加 > 变成引用,
或者干脆把原文再打一遍。这个插件把这三步合成一步:选好、点一下,引用就位。
引用在输入框里是一枚卡片(和 @ 引用文件用的是同一种节点),一眼能看出引了哪段;
发送时它会被还原成 Markdown 引用块交给模型,模型看到的仍是原文。
行为
- 只在非空选区出现。输入框内部、以及按钮自己的选区都会跳过,所以在输入框里打字 不会误触发。
- 按钮跟着指针走:鼠标松开处右下方弹出;键盘选区(
Shift+方向键之类)则落在选区 上方。靠近窗口边缘会翻到另一侧,贴边收拢用的是按钮实测尺寸,中文「追问」和英文 「Quoted」宽度不同也不会被切掉。 - 引用成功后按钮原地变成一句「已引用」回执,停留 0.9 秒。这个回执不接收鼠标事件, 不会挡住你下一次点击。
- 选区滚出可视范围就不再出现按钮——不会把按钮钉在屏幕边缘,让你去引用一段自己 已经看不见的字。
Ctrl+Shift+Q不用鼠标也能引用当前选区。所有平台都只认 Ctrl:Cmd+Shift+Q在 macOS 上是「注销」。Esc收起按钮。- 引用以一枚引用卡片插到光标处(
ReferenceChipNode,与@文件引用同一种)。插入 走inputTriggers的INSERT REFERENCE事件;草稿版本在中间变过会重取一次再插。 - 宿主没有提供 chip 通道时(老版本、或该会话拿不到触发器),自动退回纯文本引用块, 不会让你点了没反应。
- 插件自己注册了引用源的 codec,发送时把这枚卡片还原成
> …引用块。这一步不能省: 注册了源却没有 codec,任何带这枚卡片的发送都会被拒。 - 卡片插到已有文字后面时,会先补一个空行——Markdown 的懒续行会把紧贴的
>吞进上 一段落。 - 插入进行中再点一次或再按快捷键,会被直接拒掉,不会插出两条重复引用。
- 引用前先规整选区:统一换行、去掉行尾空格、合并多余空行。
- 在别的会话(侧边对话)里选的文字,不会被引到这个会话的输入框。
- 超过 8000 字符会被截断并加省略号,悬停提示会说明,而不是悄悄截断。
- 点击前不让焦点跑掉(
mousedown被 preventDefault),选区不会提前消失。
和相近插件的区别
目前有几个 Harness 插件都能把选区引用进输入框,路线分三类:
| 本插件 | 输入框外的注释 | monkey-patch 发送 | |
|---|---|---|---|
| 引用放在哪 | 输入框里的引用卡片 | 输入框上方独立列表 | 你看不见,发送时才拼上 |
| 能不能改 | 能,删卡片就是取消引用 | 能在列表里逐条删 | 不能 |
| 依赖宿主私有字段 | 只用公开的 inputTriggers |
需要 draftContexts 服务 |
改 sinkSerialized 等内部方法 |
本插件走第一条:用宿主公开的引用卡片通道,发送前由自己注册的 codec 还原成 Markdown。 代价是要多注册一个引用源(名字不能和别人撞),换来的是引用在输入框里可见、可删, 且不依赖任何私有字段名。
测试
纯函数有离线测试,不用开浏览器:
npm test # node --test test/helpers.test.mjs
npm run check # 两半都做语法检查
覆盖引用格式、空白规整、按钮贴边收拢、离屏判定、会话隔离、插入重试与失败回退, 以及引用卡片那条线:codec 往返、卡片插入的 outcome、退化成纯文本的路径。 界面效果本身仍需人工看一遍。
安装
在要启用它的 Harness profile 里:
dsh plugin --profile <profile> add dsh-selection-followup
也可以把本仓库目录直接作为 bundle 装进插件管理器。浏览器半边立即生效,刷新页面即可, 不用重启。
兼容性
dsh.client.platform 是 web,浏览器半边用到 conversation.input.overlay 槽位、
InputActions,以及 inputTriggers 的引用通道。宿主没有引用通道时仍能用,只是退回
纯文本引用块。engines.dsh 声明的是实测下限。
引用源的名字是 selection-followup(组合成 @selection-followup)。宿主里
@ + 名字必须唯一,所以它不会和 dsh-quote-to-composer 的 @quote 撞车;万一撞了,
插件会打一条警告并退回纯文本,而不是让发送链路坏掉。
文件分工
| 文件 | 作用 |
|---|---|
lib/index.js |
宿主半边——空实现,只为让 bundle 有个可加载入口 |
lib/client.js |
浏览器半边——选区监听、浮动按钮、把选区变成引用卡片 |
test/helpers.test.mjs |
纯函数的离线测试 |
cordis.patch.yml |
把插件行插进插件树的 bundle patch |
icon.svg |
插件图标 |
assets/icon-180.png |
商店展示图 |
许可
MIT。
No comments yet. Be the first to write one.