中文EN

dsh-client-ui-quote

ui已测通过npmMIT

把 DSH 里的任意选区变成可审阅的引用对象:正文、文件预览、终端、diff 都能引,代码引用带 path#line。发送后原句留下高亮与序号、可跳回;输入框上方「引用 ×N」可逐条编辑或移除;右侧栏引用清单可搜索、按状态与标签审阅、多选插入、导出 Markdown/JSON;侧边线程的结论可回流主会话;已发送的引用能追加修订,旧胶囊标「已修订」;模型可按「引用N」逐条回应。

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

安装

dsh plugin --profile web add dsh-client-ui-quote

沙箱测试结果

阶段结果
1 安装✓
2 列装✓
3 挂载✓
4 启动—

四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。

README

dsh-client-ui-quote

![npm](https://www.npmjs.com/package/dsh-client-ui-quote)

![downloads](https://www.npmjs.com/package/dsh-client-ui-quote)

![test](https://github.com/BangBang-03/dsh-client-ui-quote/actions/workflows/test.yml)

在 DSH 里选中一句话,浮出「评论 / 添加到对话 / 侧边对话」:引用以 DSH 原生引用芯片进输入框,评论和引用是同一颗节点。
发送之后它合成一颗胶囊,并在原文留下高亮与序号(回复结束后自动收回)——可跳回、可复制为 Markdown、可进右侧栏的引用清单审阅与导出、可把侧边线程的结论带回主会话。
所有路径只写草稿、绝不代发。

[设计说明](docs/design.md) · [自检细节](docs/testing.md) · [开发与发布](docs/release.md) · [English](docs/README.en.md) · [贡献](CONTRIBUTING.md)

30 秒上手

1. 安装:dsh plugin --profile web add dsh-client-ui-quote;桌面版在应用内插件页搜索同名包。

2. 在消息、文件预览、终端或 diff 里选中一段文字,浮层选「评论」或「添加到对话」。

3. 发送后回原文看高亮,悬停胶囊可跳回、可复制为 Markdown;右侧栏「引用清单」(桌面 Alt+L)可搜索、导出、审阅。

「侧边对话」默认不需要 dsh-better-sidebar:本插件的宿主半会建一个 origin: "subagent" 的隐藏子会话(不出现在会话列表),再把主会话最近几轮的原话作为一条隐性上下文注进去——模型有背景,侧聊里却不会把整段历史铺出来。页签用本插件自己的 quote-sidechat 打开(宿主缺页签注册能力时退回内置 subagentchat),引用以原生芯片落进它的草稿(宿主没有芯片面时退回块引用),仍然只写草稿,不替你发送。宿主半不可用时自动退回 fork + 本插件页签;想优先用 better-sidebar,把 sideChatBackend 设成 "better"。

选中正文 → 浮层动作 → 引用变成输入框里的行内胶囊(不是纯文本),评论也放在同一颗芯片里;发送之后,引用和评论合成一颗胶囊留在消息里,不会摊成一屏 > 行。第三项「侧边对话」则把引用写进右侧栏一条独立的侧边线程的输入框(一条主会话一条线程,反复点就反复追加),问什么由你写,主会话一点都不动。评论框里引用正文本身也可编辑(选多了当场裁);从文件预览、终端或 diff划选的引用以围栏代码块的线格式发给模型,模型看到的是真正的代码块。引用落进草稿后,原句在来源消息里留下高亮与序号,输入框上方出现 引用 ×N 的聚合条;发送块里的坐标行前面还带一段人可读的 引自第 N 轮 · 助手,模型不用解码就知道这段话从哪来。

文中的 Alt+Q/C/B/L 仅为桌面默认键位;Web 不提供默认绑定,四个命令仍出现在宿主快捷键设置中,可自行配置。

界面

划词浮层 · 评论:引用与评论各一格,都能改

![选中文字后浮出「评论 / 添加到对话 / 侧边对话」,位置贴着选区](docs/screenshots/bar.png) · ![评论框:引用正文与评论分开可编辑,可勾选「让模型逐条回应」](docs/screenshots/comment.png)

发送后的胶囊 + 悬停卡片 · 右侧栏的「引用清单」页

![悬停胶囊:引用、评论、跳回原文、改这条引用、复制](docs/screenshots/card.png) · ![引用清单:搜索本会话全部引用、跳回原文、导出 Markdown,底部是侧边线程回流](docs/screenshots/panel.png)

四张界面轮播(24 秒,静态截图合成,非实时录屏):

素材说明见 [docs/screenshots/README.md](docs/screenshots/README.md)。

功能

动作 · 行为

评论 · 浮层就地变成评论框(写一句评论… + 取消 / 添加到对话)。评论框里引用正文也在自己的输入框里、可以改——选多了就当场裁掉。评论框打开期间,原选区用 Chromium 的 CSS.highlights 保持高亮,焦点进了输入框也不会丢参照;不支持该 API 的宿主静默退化,评论框里仍有原文。Enter 提交、Esc 关闭、引用或评论为空时确认按钮禁用;输入法组合输入不会误触发。

添加到对话 · 直接把引用加进输入框,不弹评论框。输入框里已经写好的文字会留在原位:引用落到草稿最上方,你的文字另起一行接在下面,光标停在末尾,接着写正式提问即可。

侧边对话 · 把引用写进一条独立的侧边对话的输入框。默认走内置隐藏线程:本插件的宿主半用 agents.create 建一个 origin: "subagent" 子会话(会话列表不显示它),主会话最近几轮的原话作为一条可折叠的隐性上下文注进去(种子里先落一个空的 system/message 作系统头,再放这条上下文,都在一个收口回合里),而不是把整条历史铺出来,用本插件自己的 quote-sidechat 页签打开(页体渲染宿主的嵌入式会话,固定聊天态,不画宿主的欢迎页;宿主若仍判 blank,视图区用空态兜底)——聊天记录、输入框、流式输出与工具调用全是 DSH 原生的;宿主缺页签注册能力时退回内置 subagentchat 页。宿主半不可用(旧宿主 / 父会话不在线 / 创建被拒)时自动退回 sessions.fork(同样是本插件的 quote-sidechat 页签);把 sideChatBackend 设成 "better" 才优先走 dsh-better-sidebar。不装 better-sidebar 也有隐藏线程;装了也不会冲突,两边共享 Side: 持久约定但路由、存储与 descriptor 各自独立。所有后端都什么都不发送,线程独立运行、不污染主会话,页签自动在右侧栏打开。同一条主会话只开一条线程,之后每次点都在同一条线程的草稿后面接着追加。鲸鱼蓝(#4d6bfe)的图标是它在浮层里的标识。浮层里只有一项「侧边对话」——两个长得一样的入口只会让人犹豫;早期版本按引用分过线程的记录仍会被识别并复用。引用清单页底部会列出这个会话的全部侧边线程,每条都能重新打开。

键盘直达 · 桌面端 Alt+Q 引用 / Alt+C 评论 / Alt+B 侧边对话——同一个浮层的三个动作,不弹浮层直接办。走 DSH 的快捷键服务注册,所以出现在设置里、可改键、与宿主键位冲突会在注册时报错;没有选区时返回 pass,按键不会被吞掉。

原文侧高亮 · 引用落进草稿后,被引用的原句回到来源消息里留下淡黄高亮与序号角标(序号就是坐标里的同句序号,和 「引用N」 对得上)。芯片被移出草稿(没有发送)时,这块高亮与序号一起收回;作为胶囊发出后,高亮与序号保留到该回合的回复结束,然后自动收回(坐标仍在,跳回/清单照常;keepHighlight: true 可保留常亮)。支持 CSS.highlights 的宿主由浏览器直接绘制高亮,滚动、流式输出、虚拟列表重排都跟手,不靠逐帧重画去追;不支持时才退回浮层矩形(只画序号徽章)。行不在视口里、文字已经变了、宿主不给 Range 时就静默跳过,不改宿主的 DOM(高亮不包 mark,也不搬节点)。表格单元格、表格行、段落、列表项、<br> 这些块级边界按浏览器选区报告的 \t / \n 对齐,所以跨单元格、跨行、跨段落的引用也能画回来。

聚合引用条 · 输入框上方一条 引用 ×N:每颗芯片一个摘要胶囊,点一下跳回原文(跳不到就把光标放到芯片上,一次退格删掉),悬停就是完整卡片;每条末尾有 ✎ 编辑与 × 移除:编辑把原引用与评论回填进注释框,确认后旧芯片让位、新芯片原地插入;移除优先走宿主自己的 consumeToken(按芯片的 detect 区间与 draftRev 做 CAS 精确删除,不会碰错别的文本),宿主没有这个读取面或同名芯片无法区分时才退回「聚焦芯片 + 退格」并提示。移除(或直接退格删掉芯片)之后,如果这条引用从没真正发出去,原句上的高亮与序号也一起收回;页面上已经有它发出的胶囊时则照旧保留。整条索引存在本机:宿主会跨刷新恢复草稿里的芯片,插件的索引也一起恢复,所以刷新后条、卡片与「打开文件」都还在。主会话与侧边线程各自的输入框各有一条;芯片删光时条自己消失。整条带 role=toolbar,每颗胶囊的可访问名是完整引用+评论,不是截断后的标签。

来源头 · 发送块尾部的坐标行前面多一段人可读的出处:※ 引自第 12 轮 · 助手 │q1:…,模型不解码也知道来自哪一轮、谁说的;角色属性宿主没给时就只写轮次。胶囊悬停卡片里同样显示 引自第 12 轮 · 助手,按界面语言本地化。

Diff 划选 · 在 diff / 每轮改动面板里划选也走同一个浮层:引用按代码块发,围栏信息位带探测到的文件路径与行号(src/app.ts#L12);路径、行号是宿主 DOM 上的探测,拿不到就只带代码,不影响引用本身。有路径时卡片/清单可直接打开文件并定位到起始行。

清单多选插入 · 引用清单每行一个勾选框,插入所选 一次把多条引用写进输入框——每条各成一颗芯片、各自带坐标,不合并;芯片通路不可用时退回一段包含多个引用块的文本。这一栏是只读导航 + 批量插入,不做就地删除——删除与编辑在草稿上方的聚合条里做(宿主暴露了按区间消费 token 的 consumeToken;旧宿主没有这个读取面时才退回退格路径)。

审阅工作台 · 清单页把引用当对象管:每行一个 待处理 / 已解决 状态钮(点一下切换,行整体随之变淡),页首的 只看未解决 (N) 一键筛出没处理完的;每行可以打 #标签(回车添加、点 × 移除、点标签按它筛选,页首列出全部标签及数量);勾选若干行后 标记已解决 (N) 批量落章,插入所选 批量送回输入框。状态与标签按引用坐标归一键(老引用退回按原文),记在本机 localStorage(dsh-client-ui-quote:v1:quote-meta,上限 800 条)——跨刷新仍在,不跨设备同步、不进模型上下文;导出 Markdown 的标题行会带上 已解决 与标签标记,没标过的行输出和从前逐字相同。

跳回原文 · 悬停卡片底部的 跳回原文:把引用当初所在的那条消息停到视野上方 24px(和宿主自己跳轮次一样的位置)并闪一下。坐标(消息行锚点 + 轮次 + 同句序号)在插入时写进消息自己的文本——一段只在线上存在的 ※ 引自第 N 轮 · 助手 │q1:… 行(base64url 的 JSON),显示、胶囊、清单导出里都剥掉;它随消息本身走,所以跨刷新、跨窗口、以及清单页里根本没被本插件看着选中的引用都跳得回去。只在引用自己那条会话的面板里找,不跨会话误跳;被虚拟列表藏起来的行会让位给同轮次的可见行;压根没挂载的行靠滚动搜索一屏一屏地找出来——先往上找(引用总在比它更早的消息里),一路到顶还没找到就从最新处再来一遍;都找不到就明说(原文已变——消息还在、那段文字不在了;或 原文不在当前视图里)。

引用清单 · 右侧栏的一个页面:本会话发出去的引用与评论的清单。搜索框按引用/评论过滤、点一条跳回原文、每行可以单条复制成 Markdown(粘贴到 PR / issue / 别的会话,带评论与 引自第 N 轮 · 助手 出处)、导出 Markdown 落一个文件、历史没读完时可 加载更早的消息。它作为页面类型注册进右侧栏(ctx.sidebarRightTabs.register),并在指南页留下一个胶囊作入口;Alt+L 同样能打开。数据来自会话自己的事件日志(ctx.sessions.retain → session.eventSource),不依赖屏幕上有没有那条消息;本机还留一份索引:上下文压缩把消息裁掉之后,这些引用仍然列得出来。清单可以导出 Markdown(给人读)或 JSON(给工具读:版本化

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:67,最后更新 2026-10-31

链接

GitHub · Homepage · npm

同类插件