跳到主内容

dsh-sidebar-qa

30Star6Fork3Issue1Watching

为 DSH Web 端提供「划选对话文本→右侧面板提问」能力:在不打断主对话的前提下创建同工作区的独立追问会话,支持嵌套、上下文策略切换与追问记录树。

机审证据5/5方法论数据来源安装命令持续维护DSH 版本风险扫描
机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科
语言
TypeScript
License
MIT
分支
main
deepseekdeepseek-harnessdshdsh-better-sidebardsh-plugindsh-plugin-marketdsh-pluginssidebar

安装

命令web profile
$ dsh plugin --profile web add dsh-sidebar-qa

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

对话式安装

帮我安装 DeepSeek Harness 插件 ChenRuoT/dsh-sidebar-qa:先查看仓库 https://github.com/ChenRuoT/dsh-sidebar-qa 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

在 DSH Web 端的对话里划选任意一段文本,点击浮出的「提问」按钮,就能在右侧面板里得到一段完整问答——主对话不被打断,所有追问都跑在自动创建好的同工作区独立 DSH 会话里,可继续、可归档、可嵌套。

核心能力

  • 对话中划选文本后浮出「提问」按钮,点击即在右侧面板打开追问 tab 并自动展开侧边栏(即使面板处于收起状态)
  • 每次提问自动在同工作区创建一个独立 DSH 子会话(❓追问·<主题>),主对话的 agent、消息流与队列全程不被触碰
  • 三种上下文策略逐次可选:全量继承(fork 子会话命中 DeepSeek 前缀缓存,零压缩损失)/ 压缩(快速模型压旧历史 + 近期原文保留,默认)/ 机械裁切(最后 N 条消息原文直取,零 LLM 成本)
  • 追问支持任意深度嵌套——在追问会话里再划选提问,可生成子追问
  • 追问记录 tab 按根(主)会话分层树展示,限定当前工作区,可折叠、显示最近访问时间,归档/已删除的节点会置灰并标注状态,可一键从记录中移除
  • 配置面板里的回答/摘要模型渠道与模型已改为下拉选择(来自运行时已配置的渠道),切换渠道自动联动模型,摘要渠道可选择「继承被追问会话」

技术实现

  • 语言: TypeScript(ESM);前端 React 18 + 后端 Node 20+,同时为 host 和 client 两个 half 打包
  • 关键依赖: dsh-better-sidebar(硬 peer 依赖,提供 ctx.betterSidebar 注册表服务);@deepseek-ai/dsh-client-ui-primitives(图标);cordis(插件挂载框架);schemastery(设置 schema 校验)
  • 架构模式: 双半宿主插件(dual-half)。host half(src/index.ts)注册 /sidebarqa/api 前缀路由,对外暴露 config / catalog / config.get / config.update / context / title 六个 JSON 方法,并通过 ctx.inject(['settings'], ...) 在 sidebarqa 命名空间下注册带 optimistic revision guard 的设置面板;client half(src/client/index.tsx)通过 ctx.betterSidebar.registerTab 注册两个 tab(追问 / 追问记录)并挂载一个 document.body 上的浮动「提问」按钮;所有跨半通信走标准 webServer + sessionQuery + llm 服务面
  • 入口文件: host src/index.ts(导出 apply + inject = ['webServer','sessionQuery','llm','loader']),client src/client/index.tsx(导出 apply + inject = ['betterSidebar','sessions','connection','workspaces']),挂载通过 cordis.patch.yml + package.json#dsh.bundle.patch 同时声明 host/client 两半

适用场景

当你在 DSH Web 端与长对话 agent 协作时,常常需要对某一段回答追问细节——又不想被打断主线、复制粘贴到新会话又丢失上下文。本插件把「划选一段文字 → 右侧面板问答」做成一键操作:每个追问就是同工作区的独立 DSH 会话,可继续、可归档、可嵌套;上下文以「全量继承 / 压缩 / 机械裁切」三种策略按需切换,token 成本与答案还原度都掌握在你手里。

前置依赖与兼容性

依赖最低版本说明
DSH0.1.0-rc.8低于此版本无法解析 react / cordis / dsh-better-sidebar 的 peer 依赖;rc.7 及更早请先升级 DSH
dsh-better-sidebar0.14.0+硬 peer 依赖;未安装时本插件保持不激活(无 UI、无行为、不创建会话)
Node>=20由 package.json#engines.node 声明
@deepseek-ai/dsh-client-ui-primitives^0.1.0-rc.8客户端 UI 图标与原语
cordis^4.0.0-rc.8插件运行时框架
平台跨平台纯 Web 浏览器插件,依赖 DSH Web 端运行,无原生模块

安装方式

dsh plugin --profile web add github:ChenRuoT/dsh-sidebar-qa

配置项

所有配置经 DSH 设置服务 sidebarqa 命名空间下发,写入走 /sidebarqa/api/config.update 带 revision 乐观锁(多窗口冲突时提示重试)。Web 入口在「DSH 设置 → 侧边卡片 → 追问卡片右上角齿轮 → 功能配置」弹窗中,下表只列出面板暴露的 8 项常用设置;其余内部调参键(summarizeBudgetTokens、recentWindowMessages、backgroundWindowMessages、titleBudgetTokens)可在 settings.yaml 的 sidebarqa 命名空间里直接配置。

配置类型说明默认值
historyStrategy枚举新追问默认上下文策略:inherit 全量继承(fork + 缓存命中)/ compressed 压缩 / trim 机械裁切;面板内可逐次切换compressed
trimWindowMessages数字 (1-256)机械裁切模式保留的最近消息条数10
summarizeProvider字符串摘要快速模型渠道;留空 = 继承被追问会话的 provider''
summarizeModel字符串摘要快速无思考模型deepseek-v4-flash
summarizeReasoningEffort枚举摘要思考模式 off / high / maxoff
answerProvider字符串子对话回答模型渠道deepseek-official
answerModel字符串子对话回答模型deepseek-v4-flash
answerReasoningEffort枚举子对话思考模式 off / high / maxoff

常见问题

Q: 必须先安装 dsh-better-sidebar 吗?

A: 必须。dsh-better-sidebar 是硬性 peer 依赖,未安装时 client 端 inject = ['betterSidebar', ...] 拿不到服务,本插件保持不激活——没有任何 UI、行为,也不会创建会话。先执行 dsh plugin --profile web add dsh-better-sidebar@latest,并要求 0.14.0+。

Q: 划选文本后点「提问」,主对话会被打断吗?

A: 不会。host 端只读取主会话的当前模型表面(ctx.sessionQuery.readSurface,不打开发送队列),client 端新建一个独立的 DSH 子会话承担问答;主对话的 agent、消息流与队列全程不会被触碰。

Q: 三种上下文策略我该怎么选?

A: 「全量继承」从主会话最新已完成 turn 分叉子会话,完整历史作为种子继承,可命中 DeepSeek 前缀缓存但必须沿用主会话模型;「压缩」用快速无思考模型压旧历史 + 近期原文保留(默认,省 token);「机械裁切」直接取最后 N 条消息原文,零 LLM 成本。发起新追问时在面板左侧的策略 chip 逐次切换。全量继承在主对话正在回答时(尚无已完成 turn)会自动降级为压缩。

Q: 追问会话的标题为什么先是占位,答完才更新?

A: 这是两段式命名:创建时用引文首行做占位标题(❓追问·<首行>),首次回答完成后由 host 端用快速无思考模型从「问题+回答」提炼 ≤15 字最终标题并 rename 覆盖。提炼失败时保留占位,不会再重试。

Q: 追问记录中的「已归档 / 已删除」置灰条目是什么?点「移除」会删掉 DSH 会话吗?

A: 你自行在 DSH 端归档或删除的会话,本插件的 localStorage 父→子映射不会自动清理,记录 tab 会把它们置灰并标注状态。点「移除」只清理本插件的映射与衍生状态(titled / collapsed),不触碰 DSH 侧的真实会话。

Q: 关闭浏览器后再回来,追问记录还在吗?

A: 在。父→子映射、已命名标记、追问记录树的折叠状态都持久化在 localStorage 的 dsh-sidebar-qa:map / :titled / :collapsed 三个键里。DSH 侧真正的会话由其自身的会话存储独立保留。

Q: 修改后端后必须重启 dsh web 吗?

A: host 半改动(/sidebarqa/api 摘要、标题、设置命名空间)需要重启 dsh web;client 半改动(划选浮层、追问/追问记录 tab、模型座、配置面板)只硬刷新浏览器即可,不必重启服务。

Q: 选区超过了单条消息或包含正在流式输出的文本,能划选提问吗?

A: 不能。划选会被识别为无效:必须落在同一 [data-chat-anchor-key] 节点内、且该节点未处于 data-streaming 状态、被流式输出折叠回单条消息后才能划选。单次选区文本长度上限 2000 字符。这些校验在 src/client/selection.ts 的 captureSelection 里完成。

上手难度

入门 — 只要装好 dsh-better-sidebar,划选文本点「提问」即可;进阶部分(策略切换、模型下拉、追问记录树)按需探索,无需阅读源码。

已知问题与限制

  • DSH 上游限制:sessions.selectModel 会无条件把所选模型同时持久化为全局默认模型。因此压缩/裁切追问在给子会话设置模型时,仍会改变「新建会话的起始模型」;一个从未发过请求的会话也会从该全局默认解析自己的当前模型,可能看起来跟着变。插件侧无 API 可规避(selectModel 无 opt-out、不写会话日志,sessions.models 只能拉取),见 CHANGELOG 0.3.2。
  • 划选有 4 道硬门槛:必须落在单条消息 [data-chat-anchor-key] 节点内、目标消息未在流式输出、选区非空且 ≤2000 字符;任一不满足浮层不会弹出(src/client/selection.ts:9-63)。
  • 选区范围限定浏览器原生 window.getSelection(),无法跨 iframe / Shadow DOM 划选;这些区域内的文本不会触发浮层。
  • 全量继承策略在主对话「正在回答、尚无已完成 turn」时自动降级为压缩,面板会提示;fork 失败的其他原因(如网络)同样降级为压缩,不会阻塞提问。
  • 父→子映射、titled 标记、折叠状态全部存在 localStorage:清除浏览器站点数据会丢失这些元数据,但 DSH 侧的追问会话本身不受影响。
  • 浮层仅监听 document 上的 selectionchange / mouseup / keyup;当 DSH Web 端以非标准方式渲染对话内容(例如自定义容器未携带 data-chat-anchor-key / data-chat-flow-kind 标记)时,划选不会被识别为有效对话文本。

查看使用指南 →

该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/ChenRuoT/dsh-sidebar-qa)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录