dsh-at-picker
by mulitime
DSH web 编辑器插件:输入 @ 深搜工作区文件与文件夹并插入
DSH web composer plugin: type @ to deep-search workspace files & folders and ins
安装
dsh plugin --profile web add github:mulitime/dsh-at-pickerGitHub 源码安装:首次需按提示配置 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__ 包装 |
安装步骤
- 构建(仓库内已可自包含构建,无需 DSH monorepo 工具链):
类型解析默认指向本地 DSH profile 的 node_modules,可用环境变量覆盖:npm install # 安装 typescript + esbuild(构建用) npm run build # 产出 lib/DSH_NODE_MODULES=C:/path/to/profile/node_modules。 - 装入部署:把包安装进 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' - 重启 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 ↗
同类插件
查看全部 →
dsh-anchored-standard
两阶段 DeepSeek Harness 预设:先 Minimal 对齐的 bootstrap,再切完整 Standard 工具(Project2 98/99)

PicGo-Core
极致的图片上传引擎,CLI 与 API 双支持

awesome-deepseek-harness
DeepSeek Harness(DSH)及其优秀社区插件的精选指南。

awesome-deepseek-harness
DeepSeek Harness (DSH)生态系统:来自dsh-external/hub和公共dsh-plugin主题的精选插件、工具和基础设施。

AI-Novel-Writer
本地优先 AI 小说创作工作台,提供 Windows/macOS 桌面版与 DeepSeek Harness 插件开发预览,支持角色、大纲、章节蓝图、审稿修稿和本地模型。

mcp-for-stata
MCP-for-Stata:把 Stata 集成进你的 agent