xiyue718
dsh-ui-file-browser
No description
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 17, 2026
- Updated
- Aug 17, 2026
Introduction
@dsh-external/ui-file-browser
DSH Web 文件浏览插件:在工作区行内提供“展开目录”按钮,并在会话窗口新增“文件”导航视图。
功能
1. 工作区“展开目录”按钮
- 在每个工作区行的“新建会话”按钮旁边添加一个仅图标的“展开目录”按钮。
- 点击后工作区列表向左滑出,文件导航栏从右侧滑入,相当于在工作区导航栏和文件导航栏之间切换。
- 文件导航栏提供“返回”按钮,可滑回工作区列表。
- 这不是弹窗,而是侧边栏内的页面切换动画。
- 文件导航栏占满整个侧边栏工作区区域,背景使用
--dsw-specific-sidebar-fill,与工作区导航栏视觉一致。
2. 文件导航标题
- 在会话窗口的视图导航标题区域新增“文件”入口。
- 文件视图只显示:
- 已打开文件标签列表;
- 当前打开文件的内容;
- 每个已打开文件支持关闭。
3. 工作区文件管理
- 工作区文件导航栏中的文件/文件夹支持:
- 重命名(项目内弹窗,非浏览器 prompt);
- 删除(项目内确认弹窗,非浏览器 confirm);
- 移动(长按文件/文件夹后拖动到目标文件夹)。
- 文件选中样式与侧边栏会话选中样式一致。
- 弹窗通过 Portal 渲染在整个页面中心。
- 长按拖动时禁止文本选中。
- 拖动到目标文件夹时显示高亮/描边指示,与会话拖动的视觉反馈风格一致。
4. 聊天文件链接内置打开
- 聊天窗口中指向本地文件的链接不会调用外部软件打开。
- 点击后会在文件导航栏内部直接打开该文件并展示内容。
- 如果当前不在“文件”视图,会自动切换到“文件”导航标题。
- 对话中的
edit/read工具文件链接同样会拦截,并在文件导航栏内部打开。
5. 已打开文件列表优化
- 只显示文件名;多个同名文件时显示为“上级目录名/文件名”。
- 超过一行时默认收缩,可点击图标展开/收起(不显示文字)。
- 工作区文件导航栏的“返回”也使用图标按钮,不显示文字。
- 修复点击其他已打开文件时内容不更新的问题。
- 文件内容区域显示行号,便于定位。
- 代码内容使用语法高亮:关键字、字符串、注释、函数名、数字等使用
--shiki-*主题色,与对话视图代码块颜色一致。 - 文件标签按文件类型显示默认颜色:源代码、配置、文档、数据等分类使用不同颜色。
- 仅保留默认主题样式,不提供预设主题切换。
- 工作区文件导航栏根据文件类型动态显示对应图标(源代码、配置、文档、数据、普通文件),图标风格与项目整体视觉一致。
- 已打开文件列表按工作区通过项目 storage domain 持久化保存;同一工作区内切换会话或切换视图导航栏时,已打开文件不会丢失。
- 在文件导航栏中双击文件会立即切换到“文件”视图并打开文件。
edit/read链接指向工作区外文件时也能直接读取并展示(以文件所在目录作为安全根目录)。
6. 交互
- 文件夹默认收缩,点击文件夹可展开/收起子目录。
- 文件列表排序:文件夹优先,其次文件,各自按字母序排列。
- 单击文件:仅选中该文件。
- 双击文件:将该文件加入已打开列表,设为当前打开文件并显示内容。
- 图标使用与项目一致的线性 SVG 风格(当前色描边、圆角端点)。
说明
“会话消息导航”功能已独立提取为 @dsh-external/ui-message-nav 插件,本插件不再包含该模块。
安全说明
- 文件读取会校验目标路径必须位于对应工作区根目录内,防止越权读取。
- 单文件预览上限为 1 MB,超大文件会返回“文件过大”提示。
- 目录扫描会跳过
.git、node_modules、dist、lib、coverage等常见大目录,避免卡顿。
实现说明
- 工作区行按钮通过浏览器 DOM 注入实现(当前主程序的工作区行没有公开的按钮插槽),插件卸载时会自动移除注入按钮。
- 文件导航栏通过 DOM 注入到工作区导航容器内,工作区列表
translateX(-100%)左滑移出,文件导航栏translateX(100%) → 0右侧滑入,形成真正的导航栏切换。 shell.overlay仅作为找不到导航容器时的降级方案。- 文件视图注册到
conversation.view,id 为files。
Host API
GET /@dsh-external/ui-file-browser/api/workspaces
GET /@dsh-external/ui-file-browser/api/tree?path=<workspace-path>
GET /@dsh-external/ui-file-browser/api/file?root=<workspace-path>&path=<file-path>
POST /@dsh-external/ui-file-browser/api/rename
POST /@dsh-external/ui-file-browser/api/delete
POST /@dsh-external/ui-file-browser/api/move
GET /@dsh-external/ui-file-browser/api/state?root=<workspace-path>
POST /@dsh-external/ui-file-browser/api/state
安装到其他 DSH 客户端
方式一:超级模组注入器(推荐)
dev_build_plugin {"dir": "C:/Users/<user>/.dsh/plugins/ui-file-browser"}
dev_inject_plugin {"dir": "C:/Users/<user>/.dsh/plugins/ui-file-browser"}
然后打开/刷新 DSH Web。
方式二:本地 bundle 装配
dev_install_package {
"dir": "C:/Users/<user>/.dsh/plugins/ui-file-browser",
"profile": "web"
}
方式三:手动 bundle 配置
将插件目录放入目标 DSH 可解析位置,在 profile 的 package.json 中声明依赖和 bundles 条目,然后重启 DSH Web。
构建产物
- host:
lib/index.js - client:
lib/client.js - 打包文件:
dsh-external-ui-file-browser-0.0.1.tgz