whitefirer/dsh-browser-fs ↗★ 0
dsh-browser-fs
dsh plugin: let the agent list/read/write files inside a browser-authorized local directory (File System Access API) through a WebSocket relay
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:whitefirer/dsh-browser-fs说明文档
阅读完整 README ↗dsh-browser-fs
让 dsh 的 agent 读写浏览器所在机器的本地文件。dsh 自带的 fs 工具只能摸宿主机; 远程部署时浏览器在别的机器上,agent 够不到你本地的文件。本插件补上这个缺口:
用户在 dsh web 页面里通过 File System Access API(showDirectoryPicker)授权一个本地
目录,句柄存 IndexedDB;agent 通过三个模型工具 list/read/write 该目录下的文件,工具
调用经插件自建的 WebSocket 通道转发到浏览器执行。

原理
双面插件(cordis 插件体系):
- host 半(
src/index.ts,跑在 dsh 宿主 Node 进程)ctx.webServer.registerUpgrade注册精确路径/browser-fs/ws的 WS 通道;ctx.tools.register注册browser_fs_list/browser_fs_read/browser_fs_write;- execute 把
{type:'call', rpcId, op, args}帧发给「持有授权句柄」的标签页,按 rpcId 配对 result 帧;exec.signal接到 pending 的 abort(同时给浏览器发 cancel 帧)。
- client 半(
src/client/,浏览器里跑)- 启动时从 IndexedDB 读回句柄并
queryPermission;连回 host 的 WS(断线指数退避重连); - 收到 call 帧后在授权目录上执行 File System Access 操作,回发 result 帧;
- 在
shell.overlay层注册一张浮动卡片:显示连接/授权状态,提供 授权目录 / 重新授权 / 更换目录 / 解除授权 按钮。 - 授权状态变化时广播
{type:'state', hasHandle, dirName};host 只把调用派给hasHandle=true的标签页(多个标签在线时的执行者选择)。
- 启动时从 IndexedDB 读回句柄并
安装
npm install
npm run build # 产物 lib/index.js + lib/client.js(装机前必须先 build)
dsh plugin --profile web add file:/abs/path/to/dsh-browser-fs
# 重启 dsh 后生效
dsh plugin add 会把本包装进 profile 的 dependencies,并因 manifest 里的
dsh.bundle.patch 声明自动把 dsh-browser-fs 追加进 dsh.profile.bundles 层栈
(patch 内容即本仓库的 cordis.patch.yml:insert 一行挂 host 半,config 含
wsPath 与 requestTimeoutMs)。
使用
- 打开 dsh web 页面,右下角出现「browser-fs 浏览器文件」卡片(未授权时默认展开; 授权后默认折叠成 📁 圆钮,点圆钮展开,「—」收起;折叠状态存 localStorage, 刷新保持,圆钮上的状态点颜色与卡片一致);
- 点「授权目录」,在系统选择器里选一个本地目录(需要 readwrite 权限);
- 卡片上的「目录内容」区可直接浏览授权目录:懒加载树(点目录行展开/收起, 每级上限 200 条,超出显示「…还有 N 项」),文件行显示大小并带「复制路径」 按钮(复制相对路径,方便贴给 AI);
- 之后 agent 即可使用三个工具:
browser_fs_list { path?, recursive? }— 列目录(相对路径/类型/大小,递归可选)browser_fs_read { path, maxBytes? }— 读文本文件(默认上限 256 KiB,截断会标注)