dsh-add-to-chat
choco9527/dsh-add-to-chat
DSH 어시스턴트 답변에서 선택한 텍스트를 간단한 참조로 추가합니다. 선택 내용은 편집기 밖에 삭제 가능한 초안 컨텍스트로 남고 원본 위치에 표시되며, 전송 후에는 마우스 오버 가능한 주석으로 렌더링됩니다.
설치
dsh plugin --profile web add github:choco9527/dsh-add-to-chatREADME
DSH对话注释插件
在 DSH 的助手回复中选中文字后,点击 添加到对话。插件会把所选内容保留为独立注释,并在用户发送下一条消息时将其作为插件来源上下文提交。 插件实现极简对话注释效果,与codex类似。
English: README.en.md
效果
在助手回复中选中文字,点击浮动的 添加到对话。

可连续添加多条注释。输入框保持普通文本;悬浮“x 条注释”可查看每段原文,并逐条删除。

继续正常输入并发送。注释会随本次提交作为独立上下文传给模型;提交成功后自动清空,提交失败则恢复。

功能说明
- 纯浏览器端 DSH 客户端插件;不需要 Host 服务或任何产品专用集成。
- 每次选区限于同一条助手回复,可连续添加多条注释。
- 支持三击选中段落;选区末尾落到时间戳起点时,会跳过正文外的空图标,仍可添加该段。浮动控件不参与正文选区,已有注释时仍可三击最后一段;跨消息或选入工具栏文字的选区不会显示入口。
- 不自动发送;用户可继续编辑普通草稿,或只发送注释。
- “x 条注释”悬浮卡片展示完整原文,支持逐条删除及全部删除。
- 预览采用竖线引用、小圆角和轻阴影,不再显示重复标题与编号。全部删除的 × 居中显示在 16px 的白底正圆内,不受宿主圆角平滑影响,按钮自身悬停时变浅灰;覆盖于注释按钮框内,不预留宽度、不加动画。鼠标悬停注释框或键盘聚焦时显示,触屏始终可见。
- 待发送注释卡片优先向上展开,空间不足时向下展开;悬浮层高于输入框,详情与删除按钮不会被输入框遮挡。
- 不向 Lexical 编辑器写入 Markdown、隐藏节点或 Chip,因此不会因 Backspace 误删。
- 注释待发送时,原助手选区右上方保留蓝底白字的水滴形编号,不弹出原文;编号按当前注释顺序排列,删除后自动更新。详情统一在输入框上方的“条注释”卡片查看。
- 界面文案跟随 DSH 当前语言,支持中文和英文,并在切换语言后立即刷新。
兼容性
插件依赖助手正文的 data-dsh-message-role="assistant" 标记、sessions.list 会话目录、conversation.draftContexts 提交服务及 DSH locale 服务。它不依赖页面 CSS class,也不要求 Host 服务或产品专用代码。
多对话视图通过正文及输入框祖先的 data-conversation-session 识别会话;每个输入框只展示自己的待发送注释。选中文本的来源会话与接收引用的目标会话分别记录,侧边对话不会把引用加到主对话。提交失败只恢复到原目标,关闭后重新展示目标对话仍能看到草稿引用。
旧版单对话页面兼容目录的 current 字段,以及 DSH 0.2.0-rc.1 唯一的 retainedBy.mainView 持有者。不按目录顺序或后台子会话猜测当前会话;多个输入框缺少明确的会话标记时,不执行默认添加。
扩展选区操作
客户端通过 ctx.inject(['chatSelection'], ...) 使用插件提供的 chatSelection 服务。registerAction 把操作加入同一个选区浮层;返回的 disposer 应随消费插件卸载。异步操作失败时显示本地化反馈并保留选区,详细错误由消费插件负责。
const off = ctx.chatSelection.registerAction({
id: 'example-side-chat',
label: () => localizedLabel,
run: async selection => {
const targetSessionId = await openSideChat(selection.sourceSessionId)
ctx.chatSelection.addQuote({ ...selection, targetSessionId })
},
})
selection 仅包含实际来源 sourceSessionId 和选中文本 text,不猜测消息序号。addQuote 要求明确的来源、目标和非空文本,只加入待发送注释,不创建会话或自动发送。类型从 dsh-add-to-chat/client-api 导入;使用重新命名的 Cordis 包时,消费方为其 Context 声明同名服务。插件不导入产品侧边聊天代码。
安装
dsh plugin --profile web add github:choco9527/dsh-add-to-chat
DSH Desktop 请安装到当前使用的 Desktop Profile;Electron 渲染器复用同一套 DSH Web 客户端模块图。
开发
corepack pnpm install
corepack pnpm run check
dsh plugin --profile web add .
安装后重启目标 DSH Profile。不要再手动把同一插件 id 写入 Profile 的 cordis.patch.yml,bundle 已自行注册。
corepack pnpm test 加载真实客户端插件,检查新旧会话目录、多输入框隔离、明确引用目标、成功提交清空、失败恢复和异步扩展反馈;无需启动模型或访问真实对话。TypeScript 使用浏览器 bundler 解析,以兼容 Cordis 的无扩展名声明文件;输出仍为 ESM。
浏览器回归:使用已安装的 Playwright 运行 node --test test/preview.browser.mjs;可用 PLAYWRIGHT_MODULE 指定其模块入口、CHROME_EXECUTABLE 指定 Chrome 可执行文件。测试加载真实插件代码,在隔离页面中检查输入框层级 7/9、窄窗口回退、三击段落、跨消息拦截、浅色与深色样式,以及悬停、键盘和触屏删除,不访问真实对话。
许可证
MIT