dsh-file-mention: 在 DSH Web 界面中通过 @ 指令引用文件

在 DSH (DeepSeek Harness) 中开发智能体时,让 Agent 读写本地文件是常见需求。直接将文件内容灌入上下文会消耗大量 token,且可能包含无关信息。dsh-file-mention 插件提供了在输入框中直接引用文件路径的方案。Agent 收到该引用后,会通过自带的本地文件工具按路径自行读取或操作文件,而不是将内容注入上下文。

功能概述

这是由 Seryta 维护的 DSH Web GUI 插件。核心能力是在输入框里用 @(或 /file 命令)模糊搜索会话工作区下的文件路径,选中后插入 @相对路径。

主要特性包括:

  • 双入口触发:支持 @ 内联触发(推荐)和 /file 命令触发。
  • 模糊搜索:支持子序列模糊匹配,如输入 src/butt 可命中 src/button.go。
  • 实时索引:打开会话即后台预热索引,利用服务端 BFS 遍历和 30s 内存缓存,新文件秒级可见。
  • 交互体验:输入 @ 即弹出工作区顶层条目菜单。支持键盘(Enter/Tab)或鼠标选择。Composer 上方会显示附件条 dock,列出 draft 中的所有引用。纯单词形态的文件名(如 Makefile)会被高亮装饰。
  • 并发控制:击键产生的过时信号只丢弃对应结果,在途请求继续存活,避免打字快于首查时菜单无法更新。

安装与启用

使用官方安装命令添加插件:

dsh plugin --profile web add github:Seryta/dsh-file-mention

安装后重启 dsh web 并刷新页面。

典型用法

1. @ 内联触发

这是推荐的用法。

  1. 在输入框开头或空格后输入 @,弹出工作区浅层条目菜单。
  2. 继续输入路径片段(如 @src/butt)进行过滤。
  3. 候选菜单按 file 分组列出匹配的文件与目录。
  4. 键盘选中后按 Enter 或 Tab 补全当前高亮项(鼠标点击同样生效)。

补全遵循文件系统惯例:文件补全为 @file(空格结束);目录补全为 @dir/。如果是空目录,补全后自动加空格;有子内容(或未确认)则不加空格,光标停在斜杠后继续输入子路径浏览。想提前结束目录浏览,手动输入一个空格即可。

2. /file 命令

如果 @ 触发异常,可使用此备用入口。

  1. 输入 /file 后直接接路径片段(如 /fileAGENTS,无空格)。
  2. pick 后同样插入 @相对路径。

示例

输入:请修复 @src/main.go 里的空指针

Agent 会按 src/main.go 路径定位并操作。

配置项

插件提供可选的环境变量配置:

  • FILE_MENTION_ALLOWED_ROOTS:逗号分隔的允许搜索根目录(绝对路径)。设置后才启用白名单,白名单外的 root 返回 400;不设置则放行(与 host.listDirectory 的浏览暴露面一致)。
  • FILE_MENTION_IGNORE_DIRS:追加剪枝目录 basename,逗号分隔(默认为内置剪枝表)。
  • FILE_MENTION_MAX_FILES:单次遍历收集文件数上限,默认为 600000。

已知限制

  • 空格问题:引用路径不能含空格,含空格的文件名无法通过输入完整路径选中。
  • 符号链接:符号链接不跟随;不返回文件大小。
  • 内容预览:插入的是路径引用而非文件内容,Agent 需要读文件时会自己调 read 工具。超大/二进制文件不在菜单里做任何预览。
  • 端点暴露:API 端点仅暴露路径列表,不读内容。

与同类插件的区别

项目 dsh-at-file dsh-file-mention (本插件)
行为 发送时内容注入 发送时路径引用,Agent 自读
优缺点 模型可直接看到内容,但不便操作文件 省 token,Agent 可操作文件,模型需自行决定读哪些文件

总结

dsh-file-mention 解决了在 Web GUI 中快速引用本地文件的需求,通过路径引用而非内容注入,节省了 token 并保持了 Agent 对文件操作的灵活性。开发者可以根据需要调整搜索范围(ALLOWED_ROOTS)和忽略目录(IGNORE_DIRS)。

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

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

小夜