dsh-selection-quote
Verified@lifenrir/dsh-selection-quote · v0.2.0 · MIT · Web UI
点击会话消息中的引用文本,回到原文并居中高亮。Click a quote in a DSH message to return to its source, centered and briefly highlighted.
Install
dsh plugin add @lifenrir/dsh-selection-quote Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Readme
DSH 点击引用回原文
点击已发送消息里的引用,回到被引用的原文:滚动到屏幕中间,并短暂高亮引用文字。
- 包名:
@lifenrir/dsh-selection-quote - DSH:
>= 0.2.1-rc.3 - Node:
>= 24.9
DSH 0.2.1-rc.3 起,官方
@deepseek-ai/dsh-message-quotes已提供划词引用:划选文字后点击官方「引用文本」,引用会进入输入框并在发送后渲染在消息里。本插件不再创建引用,只补上官方缺少的一步:点击已渲染的引用,回到它的原文。
功能说明
- 点击已发送消息里的官方引用预览。
- 插件在同一会话内找到源消息;不够则继续加载更早历史(最多 8 页);把源消息滚动到屏幕垂直中间,并用约 3 秒高亮被引用的那段文字。
- 找不到源消息时在输入框给出提示;输入框里的引用保持可编辑,不会被劫持。
功能点
- 精确文字高亮:通过 CSS Custom Highlight API 绘制 Range,不修改任何消息节点的 class、内联样式或 DOM 结构;自动适配亮/暗主题。
- 整段优先:渲染后的源文本仍包含整段引用时高亮整段;否则退化为首行匹配段。
- 居中跳转:
scrollIntoView({ block: 'center' })。 - 更早历史:源消息不在当前加载范围内时,最多继续加载 8 页历史。
- 同会话隔离:只会在被点击消息所属的会话容器内查找,不会跳到另一个同时挂载的会话。
- 兜底提示:Custom Highlight API 不可用或文本定位失败时,对源消息做一次 outline 闪烁。
- 不打扰编辑:输入框里的引用保持官方编辑行为;在引用上拖选文字后松手不会误跳转。
- 中英双语。
- 零运行时依赖:除平台提供的
react外不加载其他模块;所有@deepseek-ai/*引用均为 type-only。
安装
从 npm 安装
dsh plugin add @lifenrir/dsh-selection-quote
从本地目录安装
git clone https://github.com/LiFenrir/dsh-selection-quote.git
cd dsh-selection-quote
pnpm install
pnpm build
dsh plugin add /absolute/path/to/dsh-selection-quote
lib/index.js 与 lib/client.js 已提交到仓库;只有在修改 src/ 后才需要重新 pnpm build。
从 git 安装
dsh plugin add git+https://github.com/LiFenrir/dsh-selection-quote.git
添加并启用插件后,刷新 Web UI(或重启 profile)。
使用
- 回到来源:点击已发送消息里的引用预览。若源消息比已加载历史更早,插件会先加载更早的页面。
- 源消息会滚动到屏幕中间,被引用的文字高亮约 3 秒后自动消失,页面保持原样。
- 输入框里的引用保持可编辑,不是跳转目标。
- 源消息已不在当前会话中时,输入框会给出提示。
开发
pnpm install
pnpm build # esbuild -> lib/index.js + lib/client.js
pnpm test # vitest(离线;组件测试使用 jsdom)
仓库结构:
src/index.ts Host 半(纯客户端插件,apply 为空)
src/client/index.tsx 客户端入口:locale、样式、会话级点击监听
src/client/QuoteRevealer.tsx 会话作用域的 document 点击监听
src/client/quote-target.ts 读取官方 [data-quote-preview] DOM
src/client/reveal.ts 源消息匹配、居中、精确文字高亮
tests/ Vitest 测试
scripts/build-client.mjs esbuild 打包,同时设定 client 模块 id
lib/ 构建产物(已提交,随 npm 包发布)
类型检查在 DSH 源码树内完成。本仓库有意省略了 tsconfig.json 中指向 deepseek-harness/... 的 paths 映射,因为这些相对路径在独立仓库中不存在。发布版 tsconfig.json 保留编辑器所需的编译选项;完整的 tsc --noEmit 检查请在 DSH 源码树内使用原始 tsconfig 运行。
客户端 bundle 是 window.__ModuleLoader__.load({ id, factory }) 注册,其中 id 必须等于包名,因此 scripts/build-client.mjs 中设置 PLUGIN_ID = '@lifenrir/dsh-selection-quote'。
工作原理
- 客户端入口注入两条样式:引用预览的
cursor: pointer,以及精确高亮用的::highlight(...)规则。 - session 作用域的观察者监听 document 点击;只接受
[data-chat-node-key]内、[data-quote-preview]上、输入框之外、且不是拖选结束的左键点击。 - 在同一个
[data-conversation-session]容器内、被点击消息之前的消息中,按空白折叠后的文本定位源消息;不够则加载更早页面。 - 源消息滚动到屏幕中间;用文本节点/偏移映射找到引用的精确 Range,通过 CSS Custom Highlight API 绘制;约 3 秒后自动移除。
已知限制
- 官方引用只保存纯文本,没有消息 id,因此只能按文本定位源消息;如果同一行在更早的多条消息里出现,会取最近的一条。
- 渲染后的源文本与引用正文存在格式差异(例如 Markdown 标记)时,可能找不到整段;此时退化为高亮首行匹配段。
- 输入框里的引用有意不作为跳转目标,保持可编辑。
- 源消息必须在已加载历史内;加载 8 页仍找不到时会提示来源缺失。
- 不支持 CSS Custom Highlight API 的浏览器会退化为整条消息的 outline 闪烁。
许可证
MIT,见 LICENSE。