dsh-quote-annotate-pro

uitested: passnpmMIT

Selection quoting and anchored annotations across DSH chats and document previews: numbered quote blocks stay visible in the composer and in sent messages and click back to the source, notes from docx / PDF / Markdown / code / Excel-range previews collect into one batched send, and each note can be

下载量 / Downloads
3,769
依赖体积 / node_modules
0.35 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

Install

dsh plugin --profile web add dsh-quote-annotate-pro

Sandbox test results

StageResult
1 install✓
2 list✓
3 mount✓
4 boot—

Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).

README

dsh-quote-annotate-pro

![npm version](https://www.npmjs.com/package/dsh-quote-annotate-pro)

![ci](https://github.com/zhao-guang-ai/dsh-quote-annotate-pro/actions/workflows/ci.yml)

![License: MIT](./LICENSE)

![XERJ Corpus Hub contributor](https://hub.xerj.org/contributors/zhao-guang-ai)

划词 → 批注 → 引用;发送之后,引用块仍然看得见,点一下就能回到原文。

选中的文字变成带锚点的引用块:输入框里、已发送的消息里都只显示紧凑的原文片段(最多 3 行,轮次/角色那一行被隐藏),点它跳回原文并高亮;而发给模型的文本仍标明这是第几处批注 + 哪一轮 + 谁说的(【批注 2 · 第5轮 · DSH 回复】),并要求模型按 Annotation 1:、Annotation 2: 逐条回应 —— 回复里的每个 Annotation N: 都会渲染成 批注 N 芯片,悬浮看原文与评语,点击跳回原文。

⭐ 如果这个插件帮到了你,点个 Star 是最直接的支持 → zhao-guang-ai/dsh-quote-annotate-pro(也会让更多 DSH 用户找到它)
已收录:in-DSH 市场(dshmarket)、DSH Market、dsh-plugin.org、dsh.pub、dsh-xray、HackSing/dsh-plugins、awesome-deepseek-harness、XERJ Corpus Hub(收录审核中)。

设计取舍:引用块"看得见",而不是收进 chip

划词引用/批注这类插件,市场上的主流做法是把引用收起来:气泡里只剩一颗 引用1 chip 或一个「批注 ×N」标签,原文要点开或悬停才能看到。本插件走的是另一条路:

· 收进 chip / 标签(常见做法) · 本插件:紧凑引用块

发送后的气泡 · 只剩 chip / 标签,看不到引的是哪段 · 直接显示原文片段(最多 3 行,超长省略)

想对照原文 · 悬停或点开标签 · 点引用块 → 跳回原文并高亮

输入框 · chip 短标签 · 同样显示原文片段,与消息里一致

模型侧 · 取决于实现 · 文本仍带 【引用 · 第N轮 · 角色】,位置不丢

代价 · 气泡更"干净" · 气泡会多一块灰底引用区(所以压到 3 行、隐藏位置行)

一句话:引用是对话的一部分,不该被藏起来。 如果你更希望气泡绝对干净、只在悬停时看引用,市面上有更合适的方案;如果你常要"这段是我引的哪一句"来回对照,这就是本插件存在的理由。

三步上手

1. 在任意消息里选中一段文字 → 选区上方浮出小气泡 → 点「批注」→ 写评语(可留空)→ Enter;

可以在多轮消息里连续批注多处:插件按对话从上到下的顺序统一编号(批注 1、批注 2…)——

先批注第 5 轮、再回头批注第 2 轮,也会自动排成 1、2,编号与对话顺序永远一致;

2. 输入框里出现紧凑引用块(首行前面一个圆形编号 + 原文片段 + 批注:评语,位置行隐藏,左侧有强调色竖条便于和手写文字区分),点它可跳回原文;

圆形编号就是这块批注的序号(与发出后 Annotation N / 批注 N 芯片的编号一致),由 CSS 生成、不写进正文 —— 删不掉、选不中、编辑不到;

想整块不要了,点块右侧的 ✕ —— 只删掉这一块,其余正文和别的引用块都保留,剩下的编号自动重排;

3. 发送后气泡里仍是紧凑引用块,点它随时回到原文并高亮;模型回复里的 Annotation 1:、Annotation 2:

会变成 批注 N 芯片 —— 悬浮看这条批注的原文与评语,点击跳回原文。

4. 审阅文档时:在右侧文档预览里划词 → 「批注」→ 加入批注列表(不立即写输入框)→ 底部浮条

批注 · N 里可展开/编辑/删除 → 「全部发送」把 N 条按顺序一次性写进输入框;

之后点任意文档批注块,会重新打开来源文件并定位到对应行/页。

功能

能力 · 说明

划词批注 · 会话里选中任意文字 → 选区上方浮出气泡(预览 + 「批注」)→ 编辑框里写评语(可留空)→ Enter 插入

自动编号 · 多轮、多处批注按对话从上到下统一编号 1..N(轮次 → 同一轮内的先后 → 点击时间);先批注靠后的轮次、再回头批注靠前的,编号会自动重排,输入框里的顺序与对话顺序一致

块首编号 · 输入框里每块引用的首行前面有一个圆形序号(1、2…,与发出后的 批注 N 芯片一致);编号用 CSS ::before 画出来,不在正文里,删不掉、选不中、编辑不到,删中间一块后自动重排 1..N

输入框里的引用块 · 插入后输入框里直接显示原文片段(位置行隐藏),与发送后完全一致;点它跳回原文并高亮;左侧强调色竖条与手写文字区分

位置行锁定 · 块首的 【批注 N · …】 与评语行的 批注: 前缀删不掉:退格/删除到块边界会被拦下(提示用 ✕),万一切割/撤销弄丢了也会自动补回;原文与评语正文里的字仍可自由编辑,删剩的残片会自动清除

整块取消 · 输入框里每块引用右侧一个 ✕:只删这块(位置行 + 原文 + 评语),其它内容原样保留并重编号;按钮画在浮层里,不会误删、删不掉

残片清理 · 位置行被删剩半截(引用 · 第14轮、(请按「Annotation 1:」…)时自动隐藏,输入框里不留残渣

引用块(输入框内) · 插入引用后输入框里只显示原文片段(位置行隐藏);点一下即跳回原文并高亮 —— 不做任何可见的"跳转"提示

对话页里的紧凑引用 · 已发送消息里的引用同样只显示紧凑原文块(最多 3 行),评语以 批注:… 跟在其后。消息文本仍以位置行开头 —— 界面隐藏、模型照旧知道出处

回复逐条对照 · 协议指令内嵌在第一条批注的位置行里(界面隐藏);模型回复的 Annotation N: 渲染成 批注 N 芯片,悬浮显示原文 + 评语,点击跳回原文

模型侧精确定位 · 引用块首行是 【批注 2 · 第5轮 · 你的消息】,后接原文与评语,让模型明确知道哪一处、哪一轮、谁说的

回合级引用 · 每条已完成回合尾部有「引用提问 / 引用回答」,整段引用该轮

锚点持久化 · ref → 锚点 映射写入 localStorage(按会话,最多 60 条),刷新页面后引用块仍能跳回原文

文档预览批注 · 右侧文档预览(docx / pdf / xlsx / 图片 / Markdown / 代码)里划词也能批注;位置行带来源文件:【批注 1 · 文件 · <路径>[:L行\ · :p页]】,取不到路径时退回 【批注 1】,不报错

文件批注列表 · 不可编辑预览里的批注先攒起来(不立即写输入框),底部浮条 批注 · N:展开可单条编辑/删除/清空,点空白或 Esc 收起,「全部发送」一次性写进输入框

文档批注跳回来源 · 点文档批注块 → 用官方 sidebarRight.openResource 打开来源文件:文本/代码预览带 line 参数自动滚到行并高亮;PDF/Office 打开后滚到对应页

代码 / 文本 / Markdown 预览 · 这些不可编辑预览与 docx/pdf 走同一条文件批注链路:位置行带文件名,文本类带 :L行号(代码用 pre .line 序号回退),Markdown 没有逐行 DOM 故不带行号

Excel 预览选区批注(0.4.2 / 0.4.3) · 表格单元格画在 canvas 上、没有可选文字,改用公式栏 Name Box 的选区地址定位:【批注 1 · 文件 · 预算.xlsx:Sheet1!A1:C3】;支持 xls / xlsx / xlsm / xlsb / xlt / xltx / xltm / ods / ots / fods / numbers / csv / tsv,整行 / 整列归一化成 Sheet1!3:5 / Sheet1!B:D,不读单元格内容

语音输入(0.4.3) · 批注框输入框右侧的麦克风:点一下说话、再点一下结束,识别结果按光标插进评论(复用宿主「语音输入」插件的识别能力;没开语音插件时按钮不显示)

中英自适应 · 按钮文案跟随界面语言(沿用上游)

文档预览划词:位置行带文件路径(0.4.0)

在右侧栏的文档预览(docx / pdf / xlsx / 图片 / Markdown / 代码)里划词批注时,引用块位置行会带来源文件:

  • 聊天消息:【批注 2 · 第5轮 · DSH 回复】(与旧版完全一致)
  • 文档预览:【批注 1 · 文件 · sidebar-test\测试文档.docx】;文本类追加 :L12,PDF/Office 追加 :p3

路径默认显示为「工作区内相对会话 cwd、工作区外绝对路径」;想一律用绝对路径,把 lib/client.js 顶部的

DOC_PATH_STYLE 改成 'absolute'。取不到路径(旧版本没有预览槽位、侧栏被第三方接管等)时自动退回

【批注 1】,不报错、不影响聊天批注与回跳。

文件批注列表:先攒批注,再一次性发送(0.4.0)

只对不可编辑的文档预览生效(docx / pdf / xlsx / 官方 md 预览 / 文本与代码预览)。可编辑预览(milkdown、

sidebar-editor)和聊天输入框里的选区仍然不会弹气泡——保持原设定。

1. 在文档预览里划词 → 浮出「批注」→ 写意见 → 加入批注列表(不再立即写输入框);

2. 文件有批注后,预览底部浮出一条半透明胶囊:批注 · N + 展开 / 收起 + 全部发送 + 全部删除;

  • 展开后在上方浮出列表:单条点击原文可展开 / 收起;每条可编辑(行内输入框,Enter 保存 / Esc 取消)或删除;
  • 点浮条/列表以外任意位置、或按 Esc 自动收起(行内编辑时 Esc 只取消该条编辑);
  • 「全部发送」把 N 条按 【批注 N · 文件 · <路径>[:p页|:L行]】 一次性写进对话输入框,按回车即可发送;
  • 「全部删除」清空本文件批注,浮条随之消失;

3. 列表按「会话 + 文件绝对路径」存 localStorage,刷新 / 切 tab 不丢;「全部发送」后列表会清空(避免重复插入),需要时继续攒下一批。

聊天消息里的划词批注不受影响:仍然「立即插入 + 位置行 + 点击跳回」。

Excel 预览:选区即定位(0.4.2,0.4.3 补齐格式)

单元格由官方预览用 Fortune-Sheet 画在 <canvas> 上,window.getSelection()

拿不到内容,所以「划词」链路在 Excel 里不触发(0.4.2 之前 Excel 预览只能看、不能批注)。0.4.2 起改为按

选区地址定位;0.4.3 把支持的格式补全为 DSH 自己的 excel 分类

(xls / xlsx / xlsm / xlsb / xlt / xltx / xltm / ods / ots / fods / numbers 以及 csv / tsv),

扩展名认不出时只要预览里有 Fortune-Sheet 的标记([data-excel-preview] / .fortune-name-box)也照样能用:

1. 打开工作簿 → 点单元格 / 拖选区域 / 点行头

…(truncated)

Rendered from the README published on npm. Formatted only, not edited.

Versions

Published on npm::25,最后更新 2026-10-29

Links

GitHub · Homepage · npm

Same category