dsh-at-picker

by mulitime

1 工具与能力github收录于 08-23

DSH web 编辑器插件:输入 @ 深搜工作区文件与文件夹并插入

DSH web composer plugin: type @ to deep-search workspace files & folders and ins

安装

dsh plugin --profile web add github:mulitime/dsh-at-picker

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

安装与环境配置指引、插件开发教程见 DSH 中文社区文档 ↗

安装即在你的机器上以你的权限运行第三方代码——它可读写文件、使用凭据、访问网络,DSH 的工具审批不会为插件代码加沙箱。「检测到 manifest」仅代表发现 dsh.bundle / dsh.plugin 清单,不构成兼容性或安全审查;安装前请审阅源码,不熟悉的插件先在不含密钥的环境试用。

README

目录

DeepSeek Harness(DSH)Web 界面的输入插件:在对话框输入 @,即可从当前会话的工作区里深度搜索文件或文件夹,选中后以引用 chip(Codex 风格)插入输入框,与普通文本明显区分;发送时 chip 自动序列化为工作区相对路径。

帮我看看 @              → 弹出 file 分组,列出工作区根一级
帮我看看 @main          → 全工作区递归搜索,匹配相对路径含 main 的文件/文件夹
帮我看看 @ds-agent/     → 限定在 ds-agent/ 下递归列出
帮我看看 @docs/read     → 限定在 docs/ 下搜索 read
选中 docs/readme.md     → 输入框出现 📄 readme.md chip(发送时序列化为 docs/readme.md)

特性

  • 完全基于官方机制:注册到 DSH 的 inputTriggers 管线(/ 命令、@pluginId、@subagent 用的就是这条管线),菜单、键盘导航(方向键/回车/Esc)、光标检测、词边界规则全部由管线提供,不碰任何产品 DOM。
  • Codex 风格深度搜索:@关键字 在整个工作区递归匹配相对路径(子串、忽略大小写),不限当前目录;空查询 @ 列出根一级作为起点。
  • 引用 chip 插入:走管线的 { insert: ReferenceInsert } 路径,输入框内渲染为独立 chip(label = 文件名),与普通文本区分;发送时经本源的 codec.serialize 还原为相对路径(不可发送失败、不会悄悄降级成文本)。
  • chip 长文件名可读(不改格子宽度):产品默认的 chip 是固定格子、内容居中 + 硬裁剪(长名被裁成中间一段)。本插件在不改变格子宽度的前提下(保证后续文字不遮挡、与 textarea 对齐不变、无固定宽度),把 label 改为左对齐 + 左侧 6px 边距(transform-origin: left center,省略号收进块内)并把字号从 0.72 调到 0.60(同样宽度显示更多字符)。CHIP_LABEL_SCALE 可调:越小字符越多、文字越小。该样式作用于所有 data-decoration="chip"(含 cordis/subagent/skill 的 chip),去掉 src/client.ts 里的 chipCss 即恢复默认。
  • 与现有 @ 菜单共存:作为 @ 触发字符下的新分组 file,与 cordis、subagent 分组并列。
  • 按会话工作区根目录搜索(session.header.cwd),不是服务进程目录。
  • 只读且受限:搜索仅限工作区根之内;跳过隐藏项与常见重型目录(.git/.svn/node_modules/dist/build/out/.next/__pycache__/target/venv 等);每次最多 300 个目录、50 条结果。

快速体验(动态插件,已验证 ✅)

在任意 DSH 会话中把 dynamic/at-file-picker.js 的内容通过 cordis 动态插件通道加载(cordis_define → cordis_run)即可生效。该版本的行为已在本仓库开发过程中完整验证:

  • @ 弹出 file 分组 ✅
  • 按会话工作区根列出文件+文件夹 ✅
  • 前缀过滤、目录钻取 ✅
  • 选中写回相对路径 ✅

正式安装(静态 DSH 插件包)

本仓库按 DSH 官方双端插件包格式组织(对照 @deepseek-ai/dsh-message-feedback 等官方包),已发布到 npm:dsh-at-picker。

文件 作用
src/index.ts Host 半:AtFilePickerService(TypertRemoteService + @Remote('listWorkspace')),经 fs/sandboxPolicy/sessions 服务列目录
src/client.ts 浏览器半:$mount Remote 命名空间 + 注册 @→file 触发源
src/typert.host.ts Host typert 贡献(TYPERT),由部署的 typert-loader 经 ./typert 导出自动发现
src/typert.remote-client.ts 客户端 typert 贡献(TYPERT_REMOTE),浏览器半 $mount 使用
src/types.ts 共享线缆类型(AtpListRequest / AtpListResult / AtpEntry)
build.mjs 自包含构建(无需 DSH monorepo):tsc 编译 Host + esbuild 打包 Client + __ModuleLoader__ 包装

安装步骤

  1. 构建(仓库内已可自包含构建,无需 DSH monorepo 工具链):
    npm install          # 安装 typescript + esbuild(构建用)
    npm run build        # 产出 lib/
    
    类型解析默认指向本地 DSH profile 的 node_modules,可用环境变量覆盖:DSH_NODE_MODULES=C:/path/to/profile/node_modules。
  2. 装入部署:把包安装进 DSH profile 的依赖(如 C:\Users\<you>\.dsh\profiles 下执行 npm i dsh-at-picker),然后在该 profile 的 cordis.patch.yml 追加(见 examples/cordis.patch.yml):
    - insert:
        - id: at-picker
          name: 'dsh-at-picker'
    
  3. 重启 DSH并刷新页面(client-modules 启动时扫描 dsh.client 声明并装载浏览器 bundle)。

行为约定与边界

  • 触发边界:管线要求 @ 前是行首、空白或标点(user@host、帮我@ 不触发),请写成 帮我 @。
  • 查询不含空格:token 不跨空白,文件名含空格时无法用 @ 补全该名字段(可用其余部分定位后手动补全)。
  • chip 序列化:发送消息时 chip 变成相对路径文本;撤回(undo)会把 chip 还原为纯文本,不会复活已发送内容。
  • 最多 50 条结果,目录优先、按相对路径排序;隐藏项与重型目录不显示。
  • 插件是只读的:不创建、不修改任何文件。

开发状态

  • ✅ 已验证:动态插件原型 v3 的行为(深度搜索、chip 插入与序列化、写回相对路径)
  • ✅ 已发布:dsh-at-picker@0.1.0(npm),自包含构建可用(tsc + esbuild,无需 DSH monorepo)
  • ⚠️ 待实测:静态包装进 DSH profile 后的装载行为(cordis.patch.yml 行 + 重启)——typert 文件为手工维护的生成风格产物,需在真实部署验证
  • 发布前建议项:Host 出错时在菜单里返回可见的错误候选;截断提示(超过 50 项时提示继续输入);消息侧 ref chip 的样式归类(当前消息渲染会把非 @ 开头的 chip 归为 skill 类,仅外观问题)。

License

MIT

原始 README: https://github.com/mulitime/dsh-at-picker/blob/main/README.md ↗