dsh-sidecard-ask
Select text in the DSH Web GUI and ask about it in place (floating button, or the Alt+Q shortcut): an independent subagent that inherits no parent context answers, streaming into a side card hosted by the native right sidebar, dsh-better-sidebar, or a built-in overlay — and the question can be route
Install
dsh plugin --profile web add dsh-sidecard-ask
Sandbox test results
| Stage | Result |
|---|---|
| 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-sidecard-ask · 侧边卡片追问
在 DSH Web GUI 里选中一段文本就能就地追问:选中处浮出「追问选中内容」按钮 → 弹出提问框 →
答案落在两个可切换的承载位置上:
- 独立侧边卡片(默认):由子代理在自己的会话里作答(不继承父上下文、不打扰主对话),答案在卡片里逐字流式渲染,可关闭 / 复制 / 继续追问;
- 主对话:追问内容带着引用块进入当前会话,答案随对话原生流式呈现。
聊天记录、任务详情、右侧栏内容……只要是能选中的文本都能用;没装侧边卡片插件也能跑(自动回退到内置浮层卡片)。
1.8.4 增强一览(详见 CHANGELOG):选区旁的动作条不再「六枚等价胶囊排成一排」——改成一块面板 + 一个主操作:
品牌实底按钮「追问选中内容」、一条细分隔线、五个无边框文字胶囊(hover 才浮出底色),深色主题把主按钮
的字改成深墨色(白字在深色品牌上只有 2.79:1);宽度也改成按「视口宽 − 面板左边 − 8」算,
放不下就换行,不再被窗口右边缘切掉。见 §4.3。
1.8.0 增强一览(P2,详见 CHANGELOG):回答风格档位(answerStyle 精简/标准/详细)
与 ≤500 字的自定义指令;改写类答案可写回主对话输入框(先做了真实页面探针,走官方
inputActions.insertText,DOM 路径退化为beforeinput追加);卡片与历史条目可查看原文
(码点签名反查 + CSS Custom Highlight 高亮,找不到会明说);可选的模型建议追问芯片
(<followups> 块,宽容解析,不额外发请求);导出 .md(单卡 / 全部)与多版本答案
(localStorage 升到 v3,v1/v2 非破坏式迁移)。
1.5.0 增强一览(详见 CHANGELOG):内置浮层不再压住主对话——宽度改由纯函数 floatPlacement
按「对话区右侧可用带宽」计算(旧实现是固定 400px,在用户截图上压入正文约 113px);浮层默认是一行高的胶囊,
可随时「收起为胶囊」,运行时的形态切换不写回配置;卡片标题栏右侧的 × 自 2.0.0 起是删除这条追问对话
(连同追问历史一起删),不再是隐藏浮层;新增floatMode(默认capsule)与
floatMaxWidth(默认 340)两项设置;卡片阴影减半。
1.4.0 增强一览(详见 CHANGELOG):卡片思考过程(reasoning)可折叠展示并随答案流式渲染;
已完成卡片写入 localStorage,刷新页面不丢;答案渲染扩展链接/斜体/引用/表格;流式输出自动滚动到底;
设置页补齐sideTimeoutMs/sideProvider控件;原生右侧栏 tab 可关闭(不再残留空壳;该能力在
0.2.1-rc.3 上一度因控制器无closeTab而失效,2.1.2 改用closeIn修复);
界面语言解析支持 navigator.languages 优先级回退,英文界面显示英文错误文案;
长答案的流式增量按 50ms 窗口合并提交(避免整卡重渲染的二次方开销)。
## 名字改过两次,原因都写在这里(避免再撞名)
1.dsh-selection-ask→ ✗:npm 上已被chestnut23占用(仓库lzbaclz/dsh-selection-ask)。
2.dsh-selection-followup→ ✗(1.0.0 / 1.0.1 用的名字):npm 上当时是空的,但 DSH 插件生态里已被zzx-dear使用——
GitHub 仓库 zzx-dear/dsh-selection-followup 与官方收录索引
data/plugins/zzx-dear__dsh-selection-followup.yml(category: ui,早于本插件约 20 天)。
我最初只查了 npm 名字是否可用,漏查了 GitHub 仓库名与收录索引,这是本项目的失误,已在 1.1.0 修正。
3. dsh-sidecard-ask → ✓(1.1.0 起):npm 无同名包、GitHub 无同名仓库;
同时它与已有的 8 个"选中文字→引用进输入框/翻译/批注"类插件(dsh-selection-ask、dsh-selection-explain、
dsh-selection-toolbar、dsh-quote-selection、dsh-ui-quote-selection、dsh-quote-annotate、
dsh-selection-memory、dsh-plugin-followup)在名字与定位上都区分开:本插件的答案是独立子代理在侧边卡片里流式产出,
而不是把选中内容塞进输入框。
旧 npm 包名dsh-selection-followup已npm deprecate指向新名字;升级只需卸旧装新(见 §三)。
一、三条关键路径(先看这个)
路径 · 操作 · 期望结果
A. 就地追问(侧边卡片) · 在聊天区选中一句话 → 点浮出的按钮(或点旁边的「解释/翻译/总结/润色/纠错」芯片一键发起)→ 输入问题 → Enter · 右下角浮出卡片,答案逐字流出;卡片底部有「复制 / 继续追问 / 改问 / 关闭」,代码块右上角可单独复制
B. 主对话追问 · 选中 → 提问框里把「作答位置」切到主对话 → Enter · 追问以引用块形式出现在主对话,答案由当前会话正常流式输出
C. 快捷键 + 降级 · 选中 → 按 Alt+Q(默认) · 直接弹出提问框;若侧边作答引擎不可用,卡片给出错误提示与「改到主对话」按钮
二、目录结构与逐文件用途
dsh-sidecard-ask/
├── package.json 清单:包名/版本/导出/dsh.bundle.patch/dsh.client(web 平台、immediately、inject)
├── cordis.patch.yml bundle 补丁:向 profile 插入 id 为 sidecard-ask 的宿主行,并给出主要默认配置(未列出的键取代码里的 DEFAULT_CONFIG)
├── index.js Host 半(宿主侧):插件自有 API(JSON + SSE)、配置三层合并与持久化、
│ 独立作答引擎(ctx.subagents 子代理 + agent/assistant-stream 桥接)、请求信任围栏
├── client.js Client 半(浏览器侧):dsh.client 浏览器产物,单文件、无构建步骤
│ §1 常量与默认值 §2 i18n §3 线协议客户端 §4 模块级 store §5 选区引擎
│ §6 两种承载方式 §7 侧边承载面适配 §8 视图工具 §9 组件 §10 插件入口
├── locale/zh.json 插件元数据的中文显示文案(Plugins 页卡片标题/描述)
├── locale/en.json 同上,英文
├── icon.svg Plugins 页卡片图标(<256 KiB,相对路径)
├── README.md 本文件
├── CHANGELOG.md 版本变更记录
├── LICENSE MIT
├── design-preview/ 方案讨论资料,**不参与发布**:00–02 是手绘 SVG 示意图(非截图),
│ 03-prototype-ac.html 是可直接双击打开的可点按原型(自带近似色板,非真实观感),
│ 07-carrier-seg-{light,dark}.png 是 1.8.2 的离屏渲染对比图(无头 Edge + 真实 CSS
│ 与真实令牌值,仍非运行中窗口截图)
├── tools/
│ └── compat-probe.mjs DSH 版本能力探测(§7 矩阵的来源)
└── test/
├── harness.mjs 测试替身:假宿主 ctx / 假 req·res / 假子代理 provider / 合成浏览器 + 迷你 React
├── verify.mjs 静态完整性:清单、补丁、两半导出面、i18n 键覆盖、零依赖承诺
├── contract-test.mjs 两端契约:常量一致性、响应信封形状、SSE 逐帧往返、纯函数等价、槽位注册与渲染
├── float-placement.mjs 浮层几何:宽度预算不越过对话区右边界、胶囊默认形态、源码钩子(1.5.0 新增)
└── smoke-test.mjs 宿主端到端:流式、截断、取消、持久化与重启、失败分支、并发上限、传输围栏
不引入任何外部依赖:宿主半只 import node: 内建模块;客户端半只 require('react')(由浏览器模块表提供)。
test/ 目录不进 files,不会发布。
三、安装与启用
方式 1:从 npm 安装(推荐)
# 在 profile 目录(默认 %USERPROFILE%\.dsh\profiles\web)执行
pnpm add dsh-sidecard-ask
# 然后把包名写进 profile package.json 的 dsh.profile.bundles 数组
# "dsh.profile": { "bundles": [ ..., "dsh-sidecard-ask" ] }
# 重启 DSH(重启后插件行、客户端产物、设置页一起生效)
方式 2:让 DSH 自己装(本工作区源码)
在会话里让 Agent 执行 plugin_manager 的 install_bundle,target 指向本目录的绝对路径:
plugin_manager(action="install_bundle", target="D:\\Users\\34332\\AI\\dsh-sidecard-ask")
install_bundle 会自行完成 profile 的写入与 bundle 选择,不要手改 profile 的 package.json / cordis.patch.yml。
方式 3:本地联调(junction)
cmd /c mklink /J "%USERPROFILE%\.dsh\profiles\web\node_modules\dsh-sidecard-ask" "D:\Users\34332\AI\dsh-sidecard-ask" # 再手动把 "dsh-sidecard-ask" 加进 profile package.json 的 dsh.profile.bundles
启用与验证
1. 重启 DSH(新包需要重启才会加载一行全新的 JavaScript 模块)。
2. 打开 Web GUI → 设置 → 插件,应能看到卡片「侧边卡片追问」。
3. 打开设置 → 侧边卡片追问页,点「运行自检」:应显示宿主接口可用、侧边作答引擎可用、provider 列表(本机为 spawn)、活动会话代理数。
4. 若自检显示"宿主接口不可达",说明 /sidecard-ask/api 路由没起来——检查 profile 里该 bundle 是否在 dsh.profile.bundles 中、以及 DSH 是否重启过。
从旧名字升级(1.0.x → 1.1.0)
# 1) 卸掉旧 bundle(profile 里旧名字是 dsh-selection-followup) plugin_manager(action="remove_bundle", target="dsh-selection-followup") # 2) 装新名字(本工作区源码) plugin_manager(action="install_bundle", target="D:\\Users\\34332\\AI\\dsh-sidecard-ask") # 3) 重启 DSH;旧配置目录 <DSH_HOME>\selection-followup 可以删掉(新名字用 <DSH_HOME>\sidecard-ask)
改了client.js后如果pnpm run dev:web没有在跑,浏览器需要刷新页面;改了index.js需要重
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::35,最后更新 2026-11-05