Models & Providers

dsh-remote-file-system

better-er/dsh-remote-file-system · ★ 2

better-er

「DSH·远程文件系统」:提供模型可见的远程文件工具 read_remote、write_remote、edit_remote,经 ssh 读写远程主机文件。write_remote 只允许新建,绝无覆写分支;文件后端 RemoteFileSystem 不继承 FileSystem,仅借用 @deepseek-ai/dsh-fs 的类型词表与 FsError。标准可安装的 dsh host 插件。

README body is shown in Chinese.

License
MIT
Added
2026-10-30
Maintenance
active
Install kind
npm
npm
dsh-remote-file-system
Manifest details
Manifest status
Declared
Manifest path
package.json#dsh
Manifest checked
2026-10-30T09:38:58.438Z
Lifecycle scripts
None found

Static manifest checks report declarations only; they are not compatibility or security review.

安装

dsh plugin --profile web add 'dsh-remote-file-system@0.2.0'

从 npm 安装预构建包

For install and environment setup, plus plugin development tutorials, see DSH community docs ↗

README

Source README · body: zh · Read Chinese README

Table of contents
  1. 引言
  2. 与本地三件的关系
  3. 能力
  4. 右侧栏预览
  5. file_path 写法
  6. 宣传片
  7. 安装
  8. 卸载
  9. 后端
  10. 开发
  11. 依赖与构建注意
  12. License

模型可见的远程文件工具 read_remote、write_remote、edit_remote,经 ssh 读写远程主机文件;并在 Web 右侧栏以 remote tab 预览远程文本。标准可安装的 dsh host 与 client 插件。

引言

DSH 只有本地文件系统的读写能力,而读写远程文件只能用 PowerShell 再套 bash 的 ssh 命令,非常容易出错。这个插件提供了三条可在模型中直接调用的远程文件工具,读写远程文件无需再套 ssh 命令。并将兼容 dsh-edit-diff 和 dsh-write-rule-guard 的优化显示与规则检查。

与本地三件的关系

前面三件只管本地。一旦要改别的机器上的文件,差异显示与内容规则一条都不在场,本地也没有远端文件的旧快照,比不出改了什么,只能套着 ssh 拼命令盯着回显猜。本插件把这套显示与规则一起带过去。

能力

工具 作用 关键语义
read_remote 读远端 UTF-8 文本,行号分页 offset、limit、totalLines,与原生 read 一致
write_remote 远端新建文件 只允许新建,目标已存在即拒绝,绝无覆写分支
edit_remote 远端字面替换 唯一匹配,多现拒绝,未命中报错;支持 replace_all

read_remote 只接受有效 UTF-8,读到非文本报 FS_NOT_TEXT。edit_remote 会核对上一次读取的内容指纹,读完之后文件被外部改过时报 FS_STALE_VERSION,需要重新读取再编辑。

右侧栏预览

内置查看器只认主机本地文件:点开 wsl:~/x.md 时地址是 dsh-resource://file/session/<id>/wsl:~/x.md,内置 text 类型经 ctx.fs 在本地查找而失败。

client 半身注册 remote tab 类型,以 extension 优先级认领这类能解析出远程别名的地址,经 Host 自注册的 /remote-file-system 通道读取远端文本。外观与内置文档预览一致:38px 路径栏、同一组换行与重新加载图标按钮;代码文件交给共享的 CodeBlock 渲染,可切换代码与纯文本,其他文件按源码行渲染。支持 params.line 定位与手动刷新。远端是 Windows 时地址里的盘符路径同样能被认领,tab 标题按正斜杠与反斜杠取最后一段文件名。本地文件仍由内置查看器处理。

read_remote 的工具卡按工具名接管,卡内路径是可点击链接,点击即在右侧栏打开对应的 remote tab;点整行可展开结果文本。内置 read 卡只按工具名 read 注册,read_remote 没有条目而走通用行,也就没有打开文件的入口,故由本插件补上。

file_path 写法

ssh 目标与远程路径合在一个 file_path 字段,沿用「别名:路径」前缀,别名取自 ~/.ssh/config:

wsl:~/x.md
myserver:/etc/hosts
winbox:D:/work/test.txt

只收绝对路径、~/ 或盘符开头;裸相对路径直接拒绝。远端是 Windows 时路径原样交给 PowerShell,反斜杠与正斜杠都认。

宣传片

四件一起讲的宣传片,中文与日语配音两版同在一个投稿里:

文件四件套宣传片 · 一个核心,三个辅助
文件四件套宣传片

安装

从 GitHub 安装:源码在 src/,lib/ 不入仓库,安装时 npm 会触发 prepare 脚本现场构建。

dsh plugin --profile web add github:better-er/dsh-remote-file-system

从 npm 安装:包内已含构建产物 lib/index.js 与 lib/client.js,安装时不再构建。

dsh plugin --profile web add dsh-remote-file-system

两种方式装完都会自动挂载,重启 DSH web 后启用,无需手工编辑任何文件。

卸载

dsh plugin --profile web remove dsh-remote-file-system

彻底移除,重启 DSH web 后不再加载。

后端

文件后端 RemoteFileSystem 刻意不继承 @deepseek-ai/dsh-fs 的 FileSystem 与 cordis Service,避免「继承即注册」污染会话 ctx.fs;只借用 dsh-fs 类型词表与 FsError。字节经 base64 再经 ssh 传输。

远端平台按别名探测一次并缓存:能跑通 cmd /c echo Windows_NT 判为 Windows,否则按 POSIX。POSIX 走 bash -s,Windows 走 powershell -EncodedCommand,脚本不进命令行以免被 32k 上限卡住,写入的数据经 stdin 传。

浏览器半身经 Host 自注册的 /remote-file-system 通道读取远端文本,复用 connection.requestRejection 做 Host 校验与浏览器鉴权,与 dsh-classic-coding 的 src/rpc-channel.ts 同源。

开发

pnpm install      # 装依赖,含 devDeps 类型与 esbuild
pnpm build        # esbuild 打包 host 与 client 半身到 lib/
pnpm typecheck
node smoke/verify.mjs     # 手动组装最小 cordis 组合,对 wsl 冒烟三工具
node smoke/remote-win-smoke.mjs  # 对 Windows 远端的 stat/read/edit/write 冒烟
node smoke/rpc-smoke.mjs  # 对源码的 RPC 通道做信封级冒烟,不依赖 @deepseek-ai 包
node smoke/address-smoke.mjs  # 地址解析冒烟,覆盖 POSIX 与 Windows 盘符路径

依赖与构建注意

@deepseek-ai/dsh-fs、@deepseek-ai/dsh-tools、@deepseek-ai/dsh-system-prompt 版本 0.2.0-rc.2,@deepseek-ai/cordis 版本 4.0.2。构建必须把这些包 external,与 host 共享单一 cordis 与 dsh-fs 实例;否则双原型会让 instanceof FsError 与 Service 标识错位。

License

MIT