dsh-sidecard-ask

uitested: passnpmMIT

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

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

Install

dsh plugin --profile web add dsh-sidecard-ask

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-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

Links

GitHub · Homepage · npm

Same category