前言¶
用 DSH 做智能体调试时,模型输出的往往是一大段文本。你想对其中某一句点点问题,回头写 prompt 时却只能整段复制,或者用截图、另开窗口的方式记位置。结果批注和对话被拆成两个通道,最后发出去的反馈要么丢了上下文,要么把无关内容一起粘进去。
下面介绍的插件解决的是这件事:在对话窗口里选中任意一段文本,就能附上一条批注,批注暂存在 composer 上方的一个栈里,最后和你的正常输入一起发出去。插件来自社区开发者 samuelraj-game,仓库是 samuelraj-game/dsh-plugin-annotation,目录页在 skillhub.cn。注意它是社区插件,与 DeepSeek / 幻方无官方从属关系。
这插件是什么¶
一句话定位:给 DSH 会话加一个「选区批注 + 随消息发送」的 UI 能力。它只负责把选中的段落和你的批注打包进下一条消息,不改变模型、不读写文件、不做网络请求。
维护者:samuelraj-game。GitHub 星标 0(2026-11-07 抓取目录页时没有显示星标数据,以仓库实际为准)。许可证:MIT。
核心功能¶
README 里列的能力如下,全部来自插件自身 README。
- 在对话中选中任意文本,选中文字旁会浮出 Comment 按钮。
- 点开后可以写一条可选批注,
Enter把它放进暂存栈,Ctrl/Cmd+Enter则立即只发送这一条。 - 暂存的批注不住在 composer 草稿里,而是汇总到 composer 上方的一个计数胶囊,形如
[ 💬 2 annotations (×) ]。 - 悬停胶囊打开栈面板,面板列出每条批注的原文引用、你的批注,以及编辑 / 删除操作。
- 每条批注在其来源段落上带一个编号 pin;悬停面板里的某行或 pin 时,对应段落高亮加深。
- 面板可纵向调整大小,宽度与 composer 对齐;胶囊悬停时出现
×按钮,点击清空整个栈。 - 批注可以没有文字,只留选中段落,充当接下来 prompt 的上下文或认同。
- 发送时,整条消息把批注和 composer 文本合并成一个消息:
Annotation 1:
> remove
are you sure?
Annotation 2:
> the official 0.4.10 installer
please also check the checksum
- composer 里普通
Enter或发送按钮会把暂存栈连同草稿一起发出去,批注不会在输入过程中写进文本框。
键盘操作对应关系,按表格原样整理:
| 位置 | 按键 | 效果 |
|---|---|---|
| Comment 卡 | Enter |
加入暂存栈 |
| Comment 卡 | Ctrl/Cmd+Enter |
现在就只发送这一条批注 |
| Comment 卡 | Shift+Enter |
换行 |
| Comment 卡 | Esc |
取消 |
| 计数胶囊 | 悬停 | 打开栈面板 |
| 计数胶囊 | 悬停时点 × |
清空栈 |
| 栈面板 | Send all |
栈 + 草稿一起发送 |
安装与启用¶
插件声明的安装方式有三种,都是资料原文,不要凭名称自行拼接安装命令。
第一种,从插件市场安装。在 Plugins → Discover → Add index source 里加入这个索引源:
https://samuelraj-game.github.io/dsh-plugin-annotation/index.json
需要注意:Discover 需要先在 Plugins → More 里打开实验性的 Custom plugin markets 开关。
第二种,从 npm 安装:
dsh plugin install dsh-plugin-annotation
或者在应用内走 Plugins → Installed → Add bundle,然后选择 dsh-plugin-annotation。
第三种,作为 profile bundle。这个包既是 bundle 也是 plugin,bundle 自带的 patch(cordis.patch.yml)会插入自己的一行:
- insert:
- id: ui-annotation
name: dsh-plugin-annotation
把 dsh-plugin-annotation 加到 profile 的 dsh.profile.bundles 并安装该包即可,不需要手工改 cordis.patch.yml。
兼容与权限¶
README 给出的兼容范围如下,原样列在这里,安装前最好对照自己环境核一遍。
| 项 | 要求 |
|---|---|
| DSH | >= 0.2.1-rc.5,声明在 engines.dsh 中 |
| Profile | 基于 base 的 web 或 Desktop profile,且挂载了 @deepseek-ai/dsh-client-ui-conversation;本包向其 conversation.input.overlay 插槽贡献入口 |
| Node.js | 除 DSH 自身所需外无额外要求,包没有 host 侧行为 |
| OS | DSH 客户端能跑的任何平台(Windows、macOS、Linux) |
plugin 声明不使用 DSH 任何权限类别:不访问文件系统、不发网络请求、不执行命令、不碰凭据、不用 MCP 或 host API。它的读操作是浏览器选区与 UI 插件已经拿到的 composer 草稿状态;写操作是通过公开的 inputActions 面写 composer 草稿、插入一个 <style>、以及它自己的固定定位 overlay 元素。依赖为零:没有 dependencies、没有运行时 devDependencies、没有 preinstall / install / postinstall / prepare 脚本、没有原生二进制、没有动态代码加载。
实现上,浏览器侧只向 conversation.input.overlay 插槽注册一个入口,shell 每个 Session 挂载一次,所以每个会话里都可用。选区通过 mouseup / keyup / selectionchange 跟踪,可编辑区域(composer、输入框)里的选区会被忽略。标注区间用 CSS Custom Highlight API(::highlight(dsh-annotation))绘制,编号 pin 会在滚动、resize 和轻量定时检查中重新测量。样式使用 shell 的 design token(--dsw-alias-*),浅色与深色主题都跟随原生风格。node 侧是一个空的 apply(),没有 host 行为。
典型用法¶
按下面步骤走一遍,即可复现 README 描述的完整流程。
1、把文本发给 DSH,等到回复渲染完成。
2、用鼠标或键盘选中回复里的一句,例如 remove,点选区旁浮出的 Comment 按钮。
3、在 Comment 卡里写批注,Enter 暂存,或 Ctrl/Cmd+Enter 立即发送这条。
4、重复第 2、3 步收集多条批注,此时 composer 上方会出现 [ 💬 N annotations ] 胶囊,composer 文本框里没有任何变化。
5、如果要发送全部,点开胶囊,在栈面板里点 Send all;只想发其中一条,就在它的 Comment 卡里用 Ctrl/Cmd+Enter。
6、发送后收到一条合并消息,里面每条批注按 Annotation N: 编号,引用原文,下面跟批注内容。
已知限制与注意事项¶
README 自己列出的风险要放在前面说。
- 栈非空时,发送会在提交前把拼好的批注文本立刻写进 composer 草稿,万一发送失败,这段文字会留在草稿里。
- 批注只存在客户端状态,刷新页面就丢失;草稿不受影响。
- 插件在全文档范围观察选区,可编辑区域和它自己的 UI 里的选区会被忽略。
- pin 跟随的是实时 DOM range。如果 transcript 重新渲染并卸载了对应节点(例如正在流式输出的消息替换了自己的节点),pin 会消失,但批注仍在栈里。
- 栈非空且草稿带文件附件时,走的是 composer submit 路径,批注文本同样会在发送前短暂写进草稿。
另外,这个插件以当前 DSH 进程的权限运行。虽然 README 声明没有使用任何 DSH 权限类别,装之前仍应打开源码看一眼,确认与自己环境里的策略一致;MIT 许可证已在仓库里。
适用场景:需要对模型输出做逐句回顾、把特定段落连同自己的判断一起回传给模型的调试与评审流程。不适合:需要批注跨会话持久化、或需要在批注里附带代码块 / 附件的场景。
结尾¶
这个插件的价值在于把「哪句话、批注什么、下一条消息一起发」收成一个操作,省掉复制粘贴和跨窗口对照。仓库入口:github.com/samuelraj-game/dsh-plugin-annotation,目录页:skillhub.cn/plugins/samuelraj-game/dsh-plugin-annotation。仓库里的 package.json 显示当前版本 0.3.1,engines.dsh 要求 >=0.2.1-rc.5。