前言¶
用 DSH 写代码时,右侧边栏的「工作区文件」面板通常只能列目录、点开看一眼。要看一个 Markdown 的实际渲染效果,得先把文件内容粘进对话;要改一个文件,得把内容整段贴出来再让智能体写回;要压缩、解压、打包上传,基本只能退回终端。目录一深,还得在路径里反复点上级。
这个插件针对的就是这些环节。
这是什么¶
chumoe/dsh-file-manager 是一个 DSH 客户端插件,维护者是 chumoe,分类为「客户端」。它替换 DSH 右侧边栏里 Workspace Files 面板的主体与标题,提供浏览、预览、编辑、新建、重命名、复制、移动、删除、压缩、解压、上传、下载,并把文件以真正的 composer chip 交给对话。
它的做法不是打补丁:自带的 @deepseek-ai/dsh-client-ui-sidebar-files 面板是只读列表,这个 bundle 往同一批插槽键上以 priority: -10 注册了替代项。插件启用时它胜出,禁用时原来的面板回来,没有任何文件被改掉或删除。
基本前提:Node ≥ 22,另外压缩、解压、目录打包下载依赖系统里的 zip、unzip、tar。插件没有配置项——没有任何设置要填。
核心功能¶
目录浏览¶
一次只看一层目录,列表始终是当前文件夹的子项,面包屑和列表不会互相打架。进入文件夹可以双击、按 Enter、点行首箭头或点面包屑,ArrowLeft 回到上级;单击只选中,不会把指针底下的列表换掉。Ctrl/Cmd 与 Shift 多选,选中后出现的操作条放在列表下方,选中一行不会把行挪走。
搜索是唯一一个跨目录的模式:在已加载的所有目录里过滤,保留命中项的祖先层级,以缩进树呈现。工具栏的跳转菜单可以切换面板根目录,会话工作区、家目录、桌面 / 下载 / 文档、/tmp 和 / 都在列表里,任何绝对路径也都能用,所以面板不会被困在单一工作区里。
预览与编辑¶
图片、PDF、视频、音频、文本在面板内内联预览,其他二进制回落到元信息加一个下载按钮。
Markdown 走宿主自带的渲染器——与对话正文同一个组件,标题、列表、表格、任务清单、引用块和高亮代码围栏与消息里的一致,工具栏开关可把单个文件切回高亮源码。相对路径的图片按该文件所在目录解析;超过 200 KB 的文档直接停在源码视图,避免卡住面板。
HTML 渲染在 sandbox="" 的框架里:样式和图片显示,脚本、表单和跳转被浏览器本身拒绝;相对的 src/href/poster 被改写到带鉴权的下载路由,根绝对路径保持原样。
预览和编辑器都带行号,语法高亮不依赖第三方库,内置分词器覆盖 C 系语言、Python/Ruby/Shell/Lua、YAML/TOML/INI、SQL、CSS/SCSS/Less、JSON、HTML/XML/Vue/Svelte 和 Markdown,配色用主题别名跟随明暗主题;超过 80 KB 的文件回退成纯文本。编辑在高亮层上进行,用透明 textarea 同步滚动,Ctrl+S 保存,Tab 插入两个空格;文件被外部改动时弹出冲突提示而不是静默覆盖,超过 2 MB 文本上限的文件以只读打开。
文件操作与右键菜单¶
新建文件、新建文件夹、重命名(F2)、删除(Del)、复制 / 剪切 / 粘贴(Ctrl+C / X / V)都有。上传支持文件和整个文件夹,拖放也可以;下载按 blob 取得再经同源锚点保存,Web UI 挂在网关前缀后面时同样可用。可以下载单个文件、整个文件夹(打包成 zip)或一次多选(打成一个 zip);压缩支持 ZIP 与 tar.gz,解压 ZIP / tar / tar.gz 到压缩包旁边。
右键菜单覆盖目录树、预览、编辑器三处,不适用项直接不显示而不是置灰——没有选中就没有复制,剪贴板不可用就没有粘贴。菜单提供复制相对路径、复制绝对路径、复制文件名,多选时一行一个路径。
加入对话的 chip¶
「加入对话」生成的是与 @ 选文件一样的 composer chip。整篇草稿通过草稿快照 {text, references} 重写,这是让 composer 重建 chip 节点的唯一途径;已有 chip 随编辑整体位移,所以先前加入的文件不会消失。光标区间在拼接前会做坐标换算,若结果仍会被 composer 拒绝,整次编辑会重新规划一遍,所以第二次加入不会插进第一个 chip 内部。目录树下方还有一排 chip 风格标记,镜像当前已附加到对话的每个文件——composer 把点击 chip 当作「打开文件」而不是「移除」,所以这里才是移除入口。
安装与启用¶
插件没有发布到 registry,安装路径就是本地目录或 clone 后的 checkout。--profile 必填,且必须放在 add 之前;浏览器界面用 web。
从本地目录安装:
dsh plugin --profile web add /absolute/path/to/dsh-file-manager
或者用插件管理工具,效果相同,并会把 bundle 登记进 profile:
plugin_manager action: install_bundle target: /absolute/path/to/dsh-file-manager
从 GitHub 安装,先 clone 再加入 checkout:
git clone https://github.com/chumoe/dsh-file-manager.git
dsh plugin --profile web add "$PWD/dsh-file-manager"
两种方式都会加依赖并把 bundle 登记到 dsh.profile.bundles,剩下只需重启。重启 Web UI(或让 HMR 接上),打开右侧边栏 → Workspace Files 即为替换后的面板;在插件列表里移除或禁用 dsh-file-manager 即恢复自带面板。
典型用法¶
面板打开在会话的工作区目录,也可以从工具栏的「更多操作 → 跳转到」改名根目录。在目录里选中几张照片后点「加入对话」,它们会作为 chip 出现在输入框,发送后智能体拿到的是文件引用而不是一段路径文本。
要在面板里改一个配置文件:打开 .yaml 或 .toml,源码视图带高亮与行号,改完 Ctrl+S 保存;如果同时在终端里改过同一个文件,面板会弹出冲突提示而不是覆盖。想恢复原面板,在插件列表里禁用这个 bundle 即可。
适用场景与注意¶
适合自己跑 DSH、希望在浏览器界面里直接完成查看与修改的操作者,尤其是需要频繁在多个工作区、下载目录、日志目录之间切换的场景。
需要注意的几点:
- 插件以当前 DSH 进程的权限运行,路由通过
ctx.connection.fetch.register注册,继承 Host 的登录 Cookie、Origin 与 Host 校验。它能把任何存在的绝对目录打开为根目录,这是设计上的本机优先取舍,也意味着它不是一道安全边界。 - 根目录以下仍然受限:相对路径会规范化(空、
.、..段拒绝,反斜杠统一,前导/剥掉),符号链接目标会被realpath检查,结果必须仍在根内。上传自动取唯一文件名,写入是临时文件加原子 rename,文本 / HTML / JS 下载强制text/plain+nosniff并加CSP: sandbox。 - 服务端的限额只用于防止面板意外卡死:JSON 请求体 32 MB,面板内可编辑文本 32 MB,单次目录返回 20000 条(超出会返回
truncated),上传 8 GB。 - 安装前建议先核对源码与许可证(MIT)。压缩与解压功能依赖系统的
zip、unzip、tar,缺失时这些操作不可用。
小结¶
这个插件的价值在于把「看一眼、改一改、打包带走」这些文件操作留在侧栏里完成,而不是绕到终端或把内容反复贴进对话。它不修改宿主文件,卸载即恢复原面板,没有配置项,维护者的 README 对安全模型和路由做了完整说明。
目录页:https://www.skillhub.cn/plugins/chumoe/dsh-file-manager
GitHub:https://github.com/chumoe/dsh-file-manager