前言¶
在 DSH Web UI 里和模型对话时,常见两种操作:把对话里某段原文带进下一条输入里追问,或者只想就选中片段快速问一句、又不想新开会话、落盘日志。手动复制粘贴会占满输入框;另开侧栏会话又容易留下 session 与工作区记录。
下面介绍社区插件 dsh-select-ask(仓库 YizhouLouisLu/dsh-select-ask),维护者为 YizhouLouisLu,分类为客户端。它在对话(或输入框外的页面区域)选中文字后弹出小工具条,支持引用进 composer 或侧栏提问;侧栏为一次性小窗,关闭后不创建 session、不写 session 日志与工作区条目。
这是什么¶
dsh-select-ask(npm 包名 dsh-select-ask-plugin,版本 0.1.0)面向 DSH Web 客户端:选中文字后出现 引用 / 侧栏提问(英文界面为 Quote / 侧栏提问 对应文案见 README)。引用走 composer 的 reference chip,不把大段原文堆进草稿正文;侧栏每次回合向宿主注册的路由发一次 POST,内部为单次无工具的 ctx.llm.stream,不创建 session, transcript 仅存在侧栏组件状态,关掉即丢弃。模型与凭据仍走当前 session 的请求配置(缺省则回退到默认选择),适配器、重试、计量与普通回合一致。
插件在 dsh core 0.2.0-rc.2(DSH Desktop 2.0.15-beta.1)上开发与验证;README 未声明 engines.dsh 范围,仅说明上述版本实际跑通过。许可证 MIT。
核心功能¶
引用(Quote)¶
在对话中选中文字(或输入框外任意处选中)会浮出小条,点 引用 后:
- 输入框上方出现 pill,显示
1 条注释/1 quote;悬停可列出每条注释(编号 + 原文)、单条删除或×清空全部。 - composer 草稿里每条引用对应一个仅图标的 chip(非把全文贴进输入框)。
- 发送时,每个 chip 按插件 codec 展开为 Markdown 块引用写入消息;用户气泡侧会显示为 Markdown blockquote(插件无法在该气泡里隐藏已发送的引用正文)。
引用通过 ctx.inputTriggers.registerSource 注册源 select-ask(触发符 @,无 @ 菜单分组);草稿里 chip 的 ref 为 quoted 文本,序列化失败会阻止发送并报 slash: no serializer for reference source …,而不是静默发出 [注释] 占位符。若无法插入 chip(无 session 作用域或 revision 竞争失败),会降级为把引用追加到草稿正文并在控制台说明。
侧栏提问(Ask aside)¶
点 侧栏提问 会在右侧打开一个与选中片段绑定的侧栏标签页,内含独立小聊天:每轮一次 POST 到 /dsh-select-ask/ask,无 session、无子 session、无工作区记录。关闭标签即丢弃全部 transcript。侧栏回答以纯文本渲染(保留换行),无 Markdown 渲染。侧栏内再次选中文字不会再次弹出工具条;同一 page-type 侧栏再次提问会复用标签并用新片段重置。工具条写入最近挂载的 composer——若侧栏聊天标签已打开,可能不是主会话的输入框。
侧栏路由与安全¶
/dsh-select-ask/ask 消耗模型配额,由 isTrustedRequest() 根据请求头判定(含独立测试 node --test test/trusted-request.test.mjs):
- token armed:索引页经
webServer.tapIndex注入 token,浏览器从window.__DSH_SELECT_ASK_TOKEN__读取,请求须带回 headerx-dsh-select-ask;否则拒绝。 - token unarmed:部分部署(README 提到 DSH Desktop 2.0.15 上 index 未走
webServer.renderIndex)时 token 到不了页面;此时带Origin/Referer的请求须为本站 origin,无 origin 的请求放行(与 loopback 上其它 DSH profile 暴露面同级)。
GET /dsh-select-ask/status 返回当前 guard 模式及解析到的模型。
安装与启用¶
插件以 bundle 形式安装,命令须在有 Full access 的 session 里执行,目标为插件目录(非 git clone 后的路径由你本地 bundle 位置决定):
# from a session with Full access:
plugin_manager action=install_bundle target=<this directory>
安装后重新加载 Web UI 页面,客户端 bundle 才会进入启动图。若改动了 host 半(host.js),需要重启 DSH:宿主模块按 row specifier 在进程内缓存,不能原地 re-import。仅改客户端半时,开发场景下 pnpm run dev:web 可 HMR;否则同样依赖页面 reload。
目录页:skillhub.cn/plugins/YizhouLouisLu/dsh-select-ask。社区收录流程见仓库内 submission/YizhouLouisLu__dsh-select-ask.yml 与 awesome-dsh-plugin 说明。DSH 生态强调「一切皆插件」;SkillHub 等目录为社区站点,与 DeepSeek / 幻方无官方从属关系。
典型用法¶
- 在 DSH Web UI 打开已有会话,在助手或用户消息里拖选一段需要追问的文字。
- 在浮条上选 引用:确认 composer 上方 pill 与 chip 数量,在输入框里写问题后发送;消息中引用以 blockquote 形式随用户消息发出。
- 或选 侧栏提问:在右侧小窗输入问题,阅读纯文本回答;不需要保留记录时直接关闭侧栏标签即可。
- 排查侧栏是否可用、当前 guard 与模型时,可对宿主请求
GET /dsh-select-ask/status(需在可信请求环境下,与部署方式一致)。
适用场景与注意¶
适合:经常在长对话里「指着某段原文继续问」的 DSH Web 用户;希望临时问选中片段、又不想污染主 session 历史与工作区的场景。
局限(README 已写明):
- 未发送的引用只存在于 composer 草稿;刷新页面或切换 session 时,占位
[注释]会丢正文,插件 mount 时会剥掉孤儿占位,避免误发。 - 已发送的引用在用户气泡里可见为 blockquote,插件无法隐藏。
- 宿主 row 缓存:对已安装 bundle 再
install_bundle不会重读cordis.patch.yml;改 host 半需remove_bundle再install_bundle(rowname与已 import 的不同)或重启 DSH。
安装前:插件在 当前 DSH 进程权限 下运行,host 半注册 HTTP 路由并调用 LLM;安装前应阅读 源码与 LICENSE,确认与自身部署、审计要求一致。