dsh-ui-quote-selection
在 DSH Web 里像 Codex / Claude Code 一样「选中即引用」:选中聊天消息中的任意文本,一键放入输入框,发送时自动展开为完整原文。
输入框里是紧凑的引用 chip,模型收到的是完整原文——显示简洁、信息无损。
特性
- 🖱️ 选中即用:消息内选中文本,选区上方浮现「引用到输入框」按钮;滚动时按钮跟随选区移动,选区滚出视野、按 Esc 或选区消失时才隐藏
- 🧩 官方管线:基于 DSH 输入机的 reference 机制(
@ 触发源 + 占位符 + 提交序列化),不接管输入状态、不 hack 渲染
- ✨ 输入框整洁:引用以 chip 呈现(
❝ 前 20 字…),左对齐显示开头,悬停看预览,Backspace 即删
- 📦 发送无损:提交时 chip 物化为完整原文;序列化失败会阻塞发送而不是静默降级
- 🌏 语言自适应:按钮文案随界面语言中英切换
快速开始
环境要求
- DeepSeek Harness(
dsh)0.1.0-rc.6,Web profile(dsh web)
安装(一行命令)
dsh plugin --profile web add dsh-ui-quote-selection
也可以直接从 GitHub 安装:
dsh plugin --profile web add git+https://github.com/nekogpt/dsh-ui-quote-selection.git
安装完成后重启 dsh web,再在浏览器里硬刷新(Ctrl+Shift+R)。插件通过官方 dsh.bundle 自动进入 Web profile,无需手改配置。
卸载(一行命令)
dsh plugin --profile web remove dsh-ui-quote-selection
卸载后同样需要重启 dsh web。
本地开发安装
cd /path/to/dsh-ui-quote-selection
dsh plugin --profile web add .
使用
- 在任意消息(自己或助手)里拖选一段文字
- 点击选区上方的「引用到输入框」
- 输入框中出现 chip,光标自动落在其后,继续输入你的问题
- 发送——模型收到的消息里,chip 已展开为完整原文
为什么发送后直接展开、而不是折叠成引用块? 与 Claude Code 一致:气泡所见即模型所得,零解析歧义。紧凑交给输入框(chip),诚实交给发送(全文)。
工作原理
选中文本
│ 点击悬浮按钮
▼
slash/input-insert-reference 事件(session 作用域)
│ 草稿中写入一个 U+FFFC 占位符,mint 一条 occurrence(source/ref/label)
▼
输入框 chip —— 官方 decorations 管线渲染,本插件注入一条左对齐 CSS(只命中引用 chip)
│ 用户发送
▼
sinkSerialized → 本插件 codec.serialize(ref) → 完整原文
▼
模型收到展开后的全文
要点:
- 插件向
@ 输入管线注册引用源 quote-selection(ctx.inputTriggers.registerSource),提交序列化走它的 codec
- chip 的显示与删除都是输入机原生行为,本插件不持有任何输入状态
- 草稿持久化 / 剪贴板走
codec.clipboardText(原文),刷新页面后未发送的引用安全降级为纯文本
开发
lib/index.js node 半面:空插件(只为提供 Loader 入口)
lib/client.js 浏览器半面:window.__ModuleLoader__.load 包装的手写 bundle
- bundle 内只
require("react")(平台种子),无其他运行时依赖
- 改完
lib/client.js 无需重启 dsh web:host 按磁盘 serve(no-cache),client-HMR 检测到 hash 变化会自动热更;未生效就硬刷新
- 类型声明(
.d.ts)暂缺,欢迎 PR
兼容性
- 在
@deepseek-ai/dsh 0.1.0-rc.6 上开发并真机验证
- 依赖的 DSH 内部契约(rc 阶段可能变化,升级 dsh 后请先复测「选中 → chip → 发送展开」全链路):
/plugins 客户端 bundle 服务、ctx.inputTriggers 引用管线、slash/input-insert-reference 会话事件、chip 的 decorations 渲染与 CSS 结构
发布
清单见 PUBLISH.md。
License
MIT