dsh-client-ui-filesystem-manager
中文 · English
一个 dsh 插件,为对话窗口新增 文件 tab。选中后,会话区域变为 VSCode 风格双栏资源管理器:左侧是当前工作区的目录文件树,右侧是文件查看器。
完全 out-of-tree 构建——deepseek-harness 源码零改动。插件注册进与内置轨迹 tab 相同的 conversation.view 环,目录与文件内容通过插件自己的 HTTP 路由(ctx.webServer)提供,UI 全部使用 dsh 设计 token(--dsw-*)与 ui-primitives 组件。
安装
1. 从 npm 安装(发布名 @dsh-mixxed/dsh-client-ui-filesystem-manager):
``sh dsh plugin --profile web add @dsh-mixxed/dsh-client-ui-filesystem-manager ``
包声明了 dsh.bundle(内置 cordis.patch.yml),dsh plugin add 会自动把它追加进 profile 的 dsh.profile.bundles 层栈,下次启动自动挂载——无需手改 cordis.patch.yml。
2. 重启 profile(新插件在启动时发现),打开任意会话,点击 文件 tab。
源码构建(开发 / 离线)
pnpm install
pnpm run typecheck
pnpm test
pnpm run build
npm pack # 产出 dsh-mixxed-dsh-client-ui-filesystem-manager-<version>.tgz
dsh plugin --profile <name> add ./dsh-mixxed-dsh-client-ui-filesystem-manager-<version>.tgz功能
- 第三个对话 tab:对话 / 轨迹 / 文件,注册进
conversation.view环(order 20,位于轨迹之后) - VSCode 风格双栏:可拖拽分隔条,左侧目录树、右侧文件查看器
- 懒加载目录树:目录按需展开(每个目录一次列表请求)、目录优先稳定排序、缩进参考线、
VSCode 风格的语言图标(JS/TS、HTML、CSS、JSON、Shell、脚本、编译语言、配置、Markdown 等各用 dsh 内置图标区分)、隐藏文件正常显示、空/加载/错误三态、刷新按钮
- 按类型渲染的查看器:
- Markdown(.md)用 house MarkdownText 渲染(不带行号) - 其他文本文件(含代码 / JSON)用 house ReadBlock 渲染:VSCode 式行号 gutter + 按扩展名的 shiki 高亮(未识别扩展名回退纯等宽),带复制按钮 - 图片以内联 base64 显示(png/jpg/jpeg/gif/webp/svg/bmp/ico/avif) - 二进制与超大文件给出明确提示态(带大小),并提供「在系统默认应用中打开」
- 查看器工具栏:刷新、在系统默认应用中打开、复制相对路径、下载
- 全高独立滚动:文件 tab 激活时隐藏输入对话框,双栏撑满整列高度(底部与侧边栏平齐),
目录树与文件内容各自独立滚动,互不影响;文件内容卡片撑满面板高度,滚动条在内容内部
- 对话链接直达文件 tab:read / edit / write 工具卡片、产物文件、消息里的文件提及,
点击后自动切到文件 tab 打开该文件(仅限当前工作区内的路径;项目外路径保持系统默认打开)
- 会话级缓存:目录列表与文件内容按会话单飞行获取一次;
connection/reset清空缓存;
切走再切回秒开
- 工作区边界:每个请求都经
ctx.fs以会话工作区为根解析并做规范包含校验——
浏览器提交的裸路径永不被信任
- i18n:中文 / English,主题 token 跟随明暗主题
使用说明(harness 行为,按现状接受)
- 树始终展示当前会话的工作区;切换工作区/会话会重建树。
- 列表与内容按会话缓存——磁盘上的文件变更需手动刷新(树头或查看器工具栏)。
- 超过文本上限(默认 512 KiB)的文件不会流入查看器;请改用「在系统默认应用中打开」。
- 查看器只读:不支持编辑/写入/重命名/删除,也不做代码索引与搜索。
验证
dsh --profile <name> --dump-config | Select-String ui-filesystem-manager组合配置中应出现 ui-filesystem-manager 行,且 $DSH_HOME/profiles/<name>/package.json 的 dsh.profile.bundles 列出 @dsh-mixxed/dsh-client-ui-filesystem-manager (由 dsh plugin add 自动追加)。
端到端(在空闲端口启动 profile 后):
dsh --profile <name> --port 3800 # 一个终端
node scripts/e2e.mjs # 驱动 Chrome:tab → 树 → 展开 → 查看器配置(可选)
从 profile 自己的 cordis.patch.yml 调整读取上限——用户层在 bundle 层之后应用, 按 id 打补丁即可覆盖内置挂载行:
- id: ui-filesystem-manager
name: "@dsh-mixxed/dsh-client-ui-filesystem-manager"
config:
maxTextBytes: 524288 # 文本文件上限,超出提示「文件过大」(默认 512 KiB)
maxImageBytes: 8388608 # 图片内联字节上限(默认 8 MiB)License
[MIT](LICENSE)