dsh-context-picker:在输入框用 @ 选剪贴板与会话上下文

前言

在 DeepSeek Harness(DSH)里给模型补上下文,常见做法是 @ 引用文件或会话片段。若内容还在剪贴板里、或刚在 Monaco 里选中一段代码,再切到引用面板往往多几步。DSH 社区里 starstorm-ai 维护的 dsh-context-picker 走另一条路:不改 Harness 源码、也不替换内置文件/会话 @ 源,而是在聊天输入框输入 @ 时弹出可扩展的 inline 选择器,把选中的内容变成可与正文混排的原子 ref chip。

这是什么

dsh-context-picker 是面向 DeepSeek Harness 的独立 DSH Bundle(Provider 架构的 inline 上下文选择器)。维护者为 starstorm-ai;当前公开版本为 v0.1.0,许可证 MIT。仓库:github.com/starstorm-ai/dsh-context-picker;社区目录页:skillhub.cn 上的 dsh-context-picker(标注可安装,与 GitHub 无官方从属关系)。

核心功能

输入 @ 后,可从以下来源挑选候选(以仓库中英文 README 为准):

  1. 剪贴板文本
  2. 剪贴板图片
  3. 当前 DSH 会话的最近用户/AI 消息
  4. 其他插件注册的上下文,例如已安装的 dsh-file-manager 提供的当前 Monaco 选区

选中后在输入框里显示为 原子 ref chip,可与普通文字混排;提交给 Host 的是快照引用,而不是在菜单打开时就把剪贴板上云。

剪贴板与安全边界:Web 端通过操作系统 Clipboard API 读取剪贴板,因此候选可能来自其他应用或进程中的复制操作;是否出现仍受 HTTPS/本机安全上下文、页面焦点与用户授权等浏览器策略约束。打开候选菜单时,内容仅暂存在浏览器内存;只有用户确认选择后,插件才把快照交给 DSH Host,发送会等待快照持久化完成。

扩展机制:上下文来源插件实现公开的 dsh-context-picker/provider 契约,并可向 ctx.contextPicker 注册;不依赖 composer 内部实现、ref 语法、存储或模型消息组装细节。架构与 Provider 契约见仓库内 docs/architecture.md,中文说明见 README.zh.md。

数据与默认限额(可在 Bundle 配置中覆盖,配置项位于 cordis.patch.yml):

  • 文本快照默认最多 256 KiB UTF-8
  • 一条直接用户消息默认最多展开 12 个不同 ref
  • 最近消息默认展示 12 条(直接用户消息与 AI 消息,不含插件合成上下文)
  • 图片走 DSH ctx.attachments 的校验、规范化与内容寻址存储及消息总量限制
  • 快照目录:$DSH_HOME/context-picker/v1/snapshots,ID 为规范化快照的 SHA-256

安装与启用

社区目录页显示该插件 可安装、版本 v0.1.0。已抓取资料与 README 中 未给出 形如 dsh plugin add … 的一行安装命令,安装步骤请以 SkillHub 目录页 与仓库 README.zh.md 的说明为准。

若需从源码参与开发或本地联调,仓库 Development 段使用 pnpm 工作流(Node 引擎要求见 package.json:^22.19.0 || >=24.0.0,包管理器 pnpm@11.7.0)。pnpm dev 会使用仓库内隔离的 .tmp/dsh-home 启动 Web Profile;发布构建与测试方式与 dsh-file-manager 类独立 Bundle 一致。正文不展开 clone 步骤,完整命令见 GitHub README。

典型用法

终端用户:在输入框用 @

  1. 在 DSH 聊天输入框中输入 @。
  2. 在弹出菜单中选择剪贴板文本/图片、最近会话消息,或其他插件(如 file-manager)提供的选区类候选。
  3. 确认后输入框出现 ref chip,继续编辑正文并发送;发送路径会等待所选快照持久化。

插件作者:注册 ContextPickerProvider

第三方 Web 插件依赖 dsh-context-picker/provider 类型,并把 Provider 挂到 ctx.contextPicker。下面示例来自仓库中文 README,展示如何返回不可变候选:

import type { ContextPickerProvider } from 'dsh-context-picker/provider'
import type {} from 'dsh-context-picker/client'

const provider: ContextPickerProvider = {
  id: 'my-editor',
  label: 'My Editor selection',
  candidates(sessionId, { query, signal }) {
    signal.throwIfAborted()
    return [{
      key: 'active-selection',
      revision: 'buffer-v42',
      label: 'Current selection',
      content: { type: 'text', text: 'selected text', language: 'typescript' },
      appearance: 'file',
    }]
  },
}

ctx.inject(['contextPicker'], (scope) => {
  scope.effect(() => scope.contextPicker.registerProvider(provider))
})

Provider 只负责列出候选;不必实现输入框、ref URI、Host 存储或模型消息格式。生命周期与边界见 docs/architecture.md。

适用场景与注意

适合谁

  • 经常在 DSH 里粘贴截图、日志片段或外部复制文本,希望用 @ 一次选中并变成可引用 chip 的开发者。
  • 已使用或计划编写 Web 侧 DSH 插件,需要把编辑器选区、面板内容等「贡献」进统一 @ 菜单的维护者(例如与 dsh-file-manager 联动)。

使用前请知悉

  • 插件以 当前 DSH 进程权限 运行;安装前请自行审阅源码与 MIT 许可证,并确认与现有 Bundle(含内置 @ 引用)无冲突预期。
  • 剪贴板读取受浏览器与系统策略限制;权限被拒时对应候选不会出现,其他 Provider 仍可正常使用。
  • 默认限额与 $DSH_HOME 快照路径见上文;生产环境若需放宽,应在理解存储与消息展开成本后再改 cordis.patch.yml 或 Bundle 覆盖项。

结尾

dsh-context-picker 在保留 DSH 原有 @ 文件/会话能力的前提下,增加可扩展的 inline 上下文选择:剪贴板、最近消息与其他插件贡献的候选,最终都落成可与正文混排的原子 ref。目录与版本信息见 SkillHub,实现细节与 Provider SDK 见 GitHub 仓库。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜