DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

latte03 /

latte03/dsh-select-quote

Verified

在对话里划词加批注——把选中的原文连同你的评论一起交给模型,并让它在回答里明确指出说的是哪一段。

★ 3 Stars2 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@8a7002d2

dsh-select-quote

DeepSeek Harness 的客户端插件:在对话里划词加批注——选中的原文连同你的评论一起交给模型,并让它在回答里明确指出说的是哪一段。

  • 划词工具条:选中对话区任意文本,浮出「复制 / 添加到任务」;选中的文本是 http(s) 链接(或落在链接上)时多一个「打开链接」,用系统默认浏览器打开(绕开应用内浏览器);拖拽结束才出现,不挡操作
  • 右键菜单:在选区矩形内点右键,同一套「复制 / 打开链接 / 添加到任务」出现在指针处;选区之外、其它插件已接管的右键一律不碰,桌面端未接管时保留宿主的原生 Copy 菜单
  • 快捷键:选中文字后一键打开菜单或直接添加;桌面 macOS 是 ⌘L / ⇧⌘L,其它平台的默认键位见下表;可在设置里单独开关
  • 批注摘要:添加后输入框上方出现一块「N 条批注」摘要,草稿里不会出现任何协议文本
  • 正文标记:被划中的文字在原消息里留下淡色底、虚线下划线和序号角标,点摘要条目会滚回那段文字;点角标会打开该条批注的预览(原文 + 评论),标记本身保持可选中、不抢点击,角标也能用 Tab 聚焦、Enter 打开。角标始终压在选区高亮之上,多条批注结尾重合时会自动向右/向上错开
  • 模型回指:模型回答里指向某条批注的位置,渲染成带预览的 chip
  • 对话记录:已发送消息仍由宿主气泡渲染(时间、复制、撤回都在),批注收成一块摘要,悬停(触屏点按)展开列表
  • 界面语言:跟随 dsh 自己的语言设置,简体中文 / English / Русский

批注摘要与 chip 预览

示意图:正文标记、批注摘要与 chip 预览(按产品真实设计 token 渲染,源文件 assets/screenshot-1.mock.html)


安装

网页版:

dsh plugin --profile web add dsh-select-quote
dsh --profile web

桌面版:在应用内输入dsh-select-quote安装,或者插件页搜索 dsh-select-quote 安装,重启客户端生效。

改了代码想立刻验证,用本地 checkout 加载:

git clone https://github.com/latte03/dsh-select-quote && cd dsh-select-quote
pnpm install && pnpm run build
cp dev.patch.example.yml dev.patch.yml   # 把 <CHECKOUT> 改成当前目录的绝对路径
dsh web --patch "$PWD/dev.patch.yml"

打开 http://127.0.0.1:3080,在对话消息里划词即可看到工具条。本地 patch 里的插件路径必须是绝对路径(checkout 不在 profile 的 node_modules 里);dev.patch.yml 是每台机器自己的未跟踪文件,仓库只提供 dev.patch.example.yml。

用法

  1. 在对话区选中一段文本,点「添加到任务」——到这一步批注就已经保存,输入框上方同步出现批注摘要。触屏下操作条固定在屏幕底部,不跟随选区挤在系统选择菜单旁边
  2. 想补充的话在弹出的评论框里写一句,点「添加评论」或 ⌘/Ctrl + Enter;不写就直接点空白处或「暂不评论」,批注同样保留。触屏下评论在底部抽屉里完成,抽屉顶部会带上选中的原文
  3. 悬停(触屏点按)输入框上方的摘要展开列表,可逐条编辑、删除或一键清空,点条目跳回正文对应文字;对话记录里的摘要只提供列表和跳转。键盘聚焦摘要后按 Enter / ↓ 展开,Tab 在面板内移动,Esc 关闭并回到摘要
  4. 点正文里的角标(可用 Tab 聚焦后按 Enter)打开批注预览,查看原文和评论;正文标记本身仍可正常鼠标划选,点浮层外或按 Esc 关闭
  5. 正常打字发送,批注随消息一起交给模型,摘要随之消失
  6. 模型回答里引用某条批注的位置显示为 chip:悬停、点击(触屏点按)或键盘聚焦都会打开预览,显示原文和评论;预览默认在 chip 上方,右上角「原文」按钮回到正文;键盘聚焦 chip 后按 ↓ 进入按钮,Esc 关闭

入口与菜单

选中文字后有三条路打开「复制 / 打开链接 / 添加到任务」:

  • 自动浮出(默认):拖拽结束就在选区上/下方显示工具条
  • 右键菜单:在选区矩形内点右键,菜单出现在指针处;点选区外仍是宿主自己的菜单(桌面端是原生 Copy),别的处理器已经 preventDefault 的右键也不会抢
  • 快捷键:选中文字后按下表键位,不用经过菜单
操作 桌面 macOS 桌面 Win/Linux Web macOS Web Windows Web Linux
打开划词菜单 ⌘L Ctrl+Shift+L ⇧⌘L Ctrl+Shift+L Ctrl+Shift+,
添加到任务 ⇧⌘L Ctrl+Shift+. ⌥⌘L Ctrl+Shift+. Ctrl+Shift+.

「打开划词菜单」把菜单锚在选区首行下边缘;「添加到任务」直接保存批注并打开评论框,和点工具条上的同名按钮一致。「复制」不注册插件命令,直接用系统的 ⌘C / Ctrl+C。两个命令都只认对话区的选区,有一条批注正在编辑时会提示先完成它。所有键位都能在宿主的「快捷键」设置里改。

前两条由「划词入口」切换,快捷键是独立开关;默认只开自动浮出,右键和快捷键都关。

设置

插件页 → dsh-select-quote,配置直接显示在该插件的外层页面(描述与行列表之间),不用再点进「配置」:

  • 划词入口:自动浮出 / 右键菜单 / 两者都开;默认自动浮出。触屏始终使用底部操作条
  • 快捷键:打开或关闭「打开划词菜单」「添加到任务」两个命令;开启后开关下方直接列出它们当前生效的键位,被别的插件占用时显示冲突。命令只在开启期间出现在宿主的「快捷键」设置里,改键也在那里;默认关闭

语言

界面语言由 dsh 决定,插件不再自己判断浏览器语言。在 设置 → 通用 → 语言 里切换。

插件页展示

插件管理页与设置项里的标题、描述、图标来自包自带的资源,宿主读取它们时不会激活插件:

  • locale/*.json 的 meta.title / meta.description(en.json 是发现入口,其余语言文件与它同目录同名)
  • icon.svg(SVG / PNG / JPEG / WebP,≤256 KiB,必须在包内)

标题按当前语言取,取不到回退 package.json 的 name / description;图标缺失时用面板的默认插画。要加一种语言,往 locale/ 放一个同名 JSON 即可,pnpm run check 会按宿主的规则逐条校验(语言 id 文件名、字段非空、图标类型与体积、exports 与 files 覆盖、npm pack 实际清单)。

已知限制

  • 待发批注按会话持久化:刷新页面、重启客户端后回到原会话,未发送的批注会原样回来(与草稿同在 localStorage,键各自独立);保留最近 20 个会话、7 天。发送即清除,切换会话跟着切——正文的划词标记与输入框里的批注卡同进同退:分叉出的新会话不继承批注,也不会留下原会话的划词;切回原会话时两者一起恢复。hero 里换工作区等于换会话,批注不跟着搬。同一会话开多个标签页时通过 storage 事件同步,按最后写入为准;一个标签发送清空后,另一个标签不会把旧批注写回。
  • 占用了用户气泡的渲染:本插件以 priority: -10 接管内置 user / steering 节点,再委托宿主 UserMessageNodeView 渲染(只改写 node 的文本块,剥掉协议)。其它插件若也想接管这两个键,优先级数值必须小于 -10 才会赢过本插件;被别的接管者赢走时,本插件不再折叠消息里的协议块。
  • 摘要宽度有限:输入框上方只有一块摘要(约输入框的 1/5,148–220px),悬停列表里的原文和评论最多显示三行;编辑批注时原文完整显示,超过 132px 在框内滚动。
  • 划词只在对话区生效:不介入编辑器、终端等面板。
  • 右键只在选区矩形内接管:指针在选区外、右键已被其它插件处理、或触发方式没开「右键菜单」时,插件完全不介入,宿主自己的菜单照常出现。桌面端接管时原生 Copy 菜单会被抑制;没接管时仍由客户端弹原生菜单,这是两条互斥的路径。
  • Web Linux 快捷键只有两个可用组合:宿主的 Web 快捷键只接受 Ctrl+/、Ctrl+Shift+,、Ctrl+Shift+. 三种组合,其中 Ctrl+/ 已被宿主的快捷键面板占用,所以本插件用后两个,且不能像其它平台一样用字母键。桌面 Windows/Linux 用 Ctrl+Shift+L / Ctrl+Shift+.,不影响 Ctrl+L 的平台含义,也避开 AltGr 会打出字符的组合。
  • 创建选区仍依赖指针:对话正文是静态渲染,没有可放置的键盘光标;键盘用户需借助光标浏览或辅助技术建立选区。选区建立后的工具条按钮可聚焦,摘要面板已支持 Enter / ↓ / Tab / Esc 与触屏点按;已有批注可以从正文角标 Tab 聚焦后按 Enter 回看。

常见问题

升级 dsh 之后功能不对? 先 pnpm run check;产物没问题就对照 docs/internals.md 的「依赖的产品内部约定」逐条复核,那里列了所有产品内部名。

划词没有工具条? 确认选区在对话区而不是编辑器里;刷新页面(样式与观察者是幂等注入的);宿主 boot 日志里应出现 dsh-select-quote。桌面端工具条挂在对话滚动区里,随正文一起滚动,滚到顶部会像正文一样滑进 header 下面;选中行完全滚出视口后收起,滚回去重新出现。触屏下工具条固定在屏幕底部。

点空白处批注会丢吗? 不会。点「添加到任务」时批注已经保存,空白点击只关闭评论框;已经写了一半的评论会一并保存到那条批注上。

输入框里出现了协议原文? 发送前的注入没生效,一般是 composer 结构变了——检查 [data-composer-card] 是否还在。

对话记录里没有批注摘要? 摘要块渲染在宿主用户气泡上方;若 user 节点被别的接管者赢走、或那条消息里确实没有批注块,都不会出现。块的开闭标记完整但 JSON 损坏时,气泡只剥掉协议原文、不显示摘要。宿主视图解析失败是另一回事:摘要还在,只是气泡退回纯文本、时间/复制行不再渲染。

界面语言不跟着 dsh 变? 文案取自宿主的语言服务。插件依赖宿主的 locale 服务(由 @deepseek-ai/dsh-client-locale 提供,随 dsh 内置);服务缺失时插件不会激活,而不是静默回退到 English。语言存在但词典缺键时按 en 兜底。确认设置里确有语言选项。

改了 CSS 不生效? 样式只注入一次,刷新页面。

开发

pnpm install
pnpm run check     # typecheck + test + build + verify
pnpm run watch     # 增量重建

依赖用 pnpm 管理(锁文件 pnpm-lock.yaml);构建产物 lib/ 随源码一起提交,运行时直接读它。

pnpm run test 用 Vitest 跑纯逻辑(角标避让、评论泡定位、浮层翻转、触发矩阵、配置归一、链接识别、快捷键默认矩阵);pnpm run verify 无头执行产物:断言 10 项贡献都注册上,检查三份词典的键与 {placeholder} 在每种语言里都齐备(复数消息必须有 .other 兜底)、插件页展示元信息(locale + icon)按宿主规则解析、npm pack 实际发货清单。它还会回放批注持久化与跨标签同步、链接识别、宿主视图解析、发送手势、协议块读写与回声剥离、右键接管判定与两个快捷键命令等关键路径。

CI 在 push 与 PR 上跑同一套 pnpm run check(.github/workflows/check.yml)。

热更新到桌面客户端

宿主每半秒比较一次各插件 client 产物的文件状态,一旦变化就通过 /plugins/events 让页面只重载这个模块,所以运行中的客户端不用重启:

pnpm run sync:desktop             # 把 lib/ 推给已安装的副本
pnpm run sync:desktop -- --watch  # 常驻:lib/ 一变就推
pnpm dev:desktop                  # 增量重建 + 推送,一条命令

目标路径按 $DSH_HOME(默认 ~/.dsh)与 profile 名推导,profile 用 --profile <name> 或 $DSH_PROFILE 指定,默认 desktop。字节没变就不写,避免空重载。模块级重载会重置内存状态,但未发送的批注已按会话持久化,重新挂载后会自己回来。

发布:先把源码与产物 lib/ 一起提交,再跑

pnpm run release   # check → 追加 CHANGELOG.md → 提升版本号并打 tag

贡献

fork 后开分支,提交前跑 pnpm run check。一个 PR 只讲一件事,功能与文档分开,方便追溯。PR 里写清复现方式(环境、dsh 版本、操作步骤)。

致谢

  • @imallakov:多语言文案、跨平台构建、装饰器楔死修复与批注归属(PR #2 / #3 / #4)
  • @Ladersbt:批注 chip 悬停预览的需求与反馈(#9)
  • @EliteOtaku:桌面端渲染进程楔死的定位报告与 CDP 探针方法(#1)

License

MIT © 2026 agan

—/ 5

No ratings yet

Verified DSH bundle

Commit 8a7002d2f3e8

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout