dsh-workspace-file-view
DeepSeek Harness 侧边栏「文件视图」独立插件 —— 「视图选项」菜单新增「查看内容」切换, 对话视图 / 文件视图一键切换;文件视图可浏览工作区目录,并在内嵌 TTY 中 运行 / 调试脚本(按扩展名解析解释器,Python 支持简化版断点调试)。
🤖 纯 AI 创作声明:本仓库的代码与文档均由 AI(DeepSeek 大模型)独立创作完成, 未经人工编写或人工代码评审。功能经单元测试(含真实 Python 断点集成测试)与类型检查验证, 请谨慎用于生产环境。
功能特性
- 「查看内容」切换:侧边栏「视图选项」菜单新增胶囊开关(灰=对话视图,绿=文件视图,1px 浅灰描边)。
- 文件视图:以树形层级展示各工作区目录(文件夹可逐层懒加载展开,文件为叶子行)。
- 重命名 / 新建:文件与文件夹行悬浮出现 ✎ 重命名(位于 ▶ 运行之前;不可运行的文件同样有),点击后行内名称变为输入框(回车或点击外部提交,Esc 取消);右键文件夹弹出「新建文件 / 新建文件夹」(带文件/文件夹图标),直接进入行内命名,未命名失焦即取消,命名后即在对应目录创建。
- 文件引用:右键文件行把它「引用」到模型输入框——输入框内、输入文本上方出现固定大小的圆角矩形文件块(文件图标 + 文件名,超长省略号),输入框随之向上扩展;点击块上的 × 可移除。发送消息时,实际发送给模型的不是文件内容,而是一张仅包含所引用文件及其目录链的目录树结构图(正则切分路径、动态折叠成树,无关文件不出现),发送成功后引用自动清空——省去 AI 每次用 ls 探查目录的步数。
- 右侧栏文件编辑器(CodeMirror 6):左键点击文件行在右侧详情栏打开编辑器,并挤压中间对话区腾出空间;标题栏最右侧是普通 × 关闭(关闭即收起侧栏),左边缘是与左侧栏一致的「收起侧边栏」按钮(收起只藏起侧栏、缓存仍在)。收起后,右上角 “Session log” 右侧会出现**「展开侧边栏」胶囊按钮,一键回到缓存文件。编辑器带 1、2、3… 行号(行号槽为不透明独立底色,选中行与行号格同步加深)与语法高亮的完整代码编辑器(按扩展名匹配 JS/TS/JSX、Python、Markdown、HTML、CSS、JSON、XML,含自动补全/搜索/历史),同时具备上下与左右滚动条(长行横向滚动,不换行截断);编辑先落在缓存缓冲区**,点「保存」按钮(或
Ctrl+S)才写回磁盘,未保存时文件名旁有 ● 标记;.md/.html文件提供 【编辑|预览】 切换。通用设置新增**「文件查看缓存」**开关(默认关闭):开启后侧栏顶部显示标签页,可缓存多个文件并快速切换,不用回文件树翻找。 - 内嵌 TTY:文件行的「运行」在侧边栏底部打开嵌入式终端面板(PTY),可交互输入、停止、流式输出。
- 按后缀判断可执行脚本:扩展名 → 解释器映射(
.py/.js/.ts/.sh/.ps1/.bat/.cmd/无扩展名可执行文件等),文件行悬浮显示 ▶ 运行 / ⏱ 调试 / ⚙ 配置。 - 运行配置:解释器覆盖、工作目录、环境变量(每行
KEY=VALUE)、启动参数。 - 简化版断点调试(Python):调试运行可设置断点行号,执行到断点暂停(显示当前行),支持 继续 / 单步 / 退出;其他语言先提供运行 + 停止(Node 行级断点需调试器协议集成,列为后续)。
架构
DSH 的「视图选项」菜单与「输入框」分别位于 ui-workspace / ui-conversation 内部、没有运行时扩展点,
因此本插件采用 「独立插件包 + 最小槽位补丁」 的组合(DSH 的组合惯例:owner 声明 hole,插件填充):
| 部分 | 内容 |
|---|---|
plugin/(本仓库) |
独立双面插件包 @deepseek-ai/dsh-workspace-file-view:node 半用 ctx.webServer 自注册 /fileview/* 路由(列目录 / 重命名 / 新建 / 读取与写入文本 / 运行 / TTY 交互 / SSE 流,并注册 settings namespace,不依赖 directory-picker 与 apiproxy);browser 半填充 sidebar.workspaces.viewContent 槽位(文件树 + 内嵌 TTY + 运行/调试 UI)、提供 fileRefs 服务并填充 conversation.input.refs 槽位(引用块)、填充 conversation.details.editor 槽位(右侧栏编辑器)与 settings.general.item 槽位(文件查看缓存开关) |
patch/ui-layout.diff |
最小布局补丁:ctx.layout.openDetails() 接受可选宽度,编辑器请求更宽敞的右侧栏 |
patch/ui-conversation.diff |
最小槽位补丁:声明 conversation.input.refs(引用块)与可选 fileRefs 服务、发送时折叠目录树;声明 conversation.details.editor 子槽位,并在编辑器打开时让详情面板整列让位给编辑器 |
patch/ui-workspace.diff |
最小槽位补丁:ui-workspace 声明 sidebar.workspaces.viewContent 子槽位、菜单渲染「查看内容」开关、列表区挂载槽位 body |
patch/ui-primitives.diff |
Menu 组件支持开关行(role="menuitemcheckbox" + 胶囊视觉) |
examples/cordis.patch.yml |
web profile 补丁:挂载插件行 |
scripts/ensure-registry.mjs |
安装引导:npmjs 下载过慢(<700 KB/s)自动切换 npmmirror 国内镜像 |
安装 / 应用
本插件现在是标准 DSH bundle(
package.json的dsh.bundle.patch+ 随包cordis.patch.yml), 可通过dsh plugin add安装;也仍支持源码组合安装(下面的「源码组合」路径)。
1. 命令行安装(推荐)
发布到 npm 后:
pnpm dsh plugin --profile web add @deepseek-ai/dsh-workspace-file-view
本地未发布版本可以直接 link::
pnpm dsh plugin --profile web add link:/path/to/dsh-workspace-file-view/plugin
dsh plugin 会把这个包加入 profile 的 dsh.profile.bundles,启动时自动应用它自带的
cordis.patch.yml(无需再手写 insert)。如果你此前按旧方式在
~/.dsh/profiles/web/cordis.patch.yml 里手动写过 id: workspace-file-view 的 insert,
请先删掉那一行,避免重复 id 冲突。
源码组合安装
0. 网络加速(国内用户,可选但推荐)
pnpm install 从默认 npmjs 源拉取大体积可选二进制时,远距离用户常遇到下载过慢甚至超时
(pnpm error 23,整个安装卡死)。仓库内置了自动测速 + 自动切换国内镜像的引导脚本:
node scripts/ensure-registry.mjs
脚本会:探测当前 pnpm 源的实际下载速度(默认阈值 700 KB/s,可
DSH_REGISTRY_SPEED_THRESHOLD_KBPS=… 覆盖)→ 低于阈值自动执行
pnpm config set registry https://registry.npmmirror.com 并打印还原命令;
已是国内镜像则跳过;只想测速不改配置用 DSH_REGISTRY_PROBE_ONLY=1。
1. 放入插件包
把 plugin/ 目录复制到检出的 packages/extensions/workspace-file-view/。
2. 应用三个最小补丁
git apply patch/ui-workspace.diff
git apply patch/ui-primitives.diff
git apply patch/ui-conversation.diff
git apply patch/ui-layout.diff
3. 安装依赖并重建
pnpm install
pnpm run typecheck # 类型检查
pnpm run build:lib:client # 重建客户端插件包(lib/client.js,含本插件、ui-workspace 与 ui-conversation)
pnpm run build:web # 重建 Web 前端(ui-primitives 是 platform 模块,打进 dist)
4. 挂载插件(web profile)
把 examples/cordis.patch.yml 的内容写入 ~/.dsh/profiles/web/cordis.patch.yml。
5. 启动验证
pnpm dsh web
# 打开 http://127.0.0.1:3080
# 左侧边栏 → 视图选项 → 查看内容 → 文件视图
# 文件行 → ▶ 运行 / ⏱ 调试(Python 断点)/ ⚙ 配置 / ✎ 重命名(悬浮)
# 文件夹行 → 右键:新建文件 / 新建文件夹;文件行 → 右键:引用到输入框
使用说明
- 打开左侧边栏,点击「视图选项」按钮,在菜单底部「查看内容」分区切换开关。
- 文件视图下点文件夹逐层展开;脚本/可执行文件行悬浮出现 ▶ 运行、⏱ 调试(仅 Python 等支持断点的脚本)、⚙ 配置;所有文件/文件夹行悬浮出现 ✎ 重命名。
- ✎ 重命名:行内名称变为输入框(原名自动带入),回车或点击输入框外提交,Esc 取消。
- 右键文件夹 → 「新建文件 / 新建文件夹」:直接在对应目录下出现命名行,输入名字回车(或失焦)即创建,未命名失焦即取消。
- 右键文件 → 文件被引用:模型输入框内、输入文本上方出现圆角矩形文件块(文件图标 + 文件名),输入框随之向上扩展;点击块上 × 可移除。
- 发送消息时,引用的文件会以目录树结构图的形式随消息发给模型(只含被引用文件及其目录链),发送成功后引用自动清空。
- 左键点击文件 → 右侧详情栏打开编辑器(挤压对话区):行号、按扩展名语法高亮、自动补全、搜索、历史,上下/左右滚动条齐全;编辑在缓存缓冲区中,点「保存」(或
Ctrl+S)写回磁盘;.md/.html文件可用 编辑|预览 切换。通用设置 →「文件查看缓存」开启后,侧栏顶部出现标签页缓存多个文件;标题栏最右 × 关闭文件,左边缘按钮收起侧栏但保留缓存。
已知限制
- 断点调试 v1 仅 Python(
sys.settrace追踪器);Node 行级断点需要 Inspector/CDP 集成,列为后续。 - 内嵌 TTY 依赖宿主
subprocess的 PTY 能力(base bundle 已内置,Windows 走 ConPTY)。 - 目录展示上限由插件配置
maxEntries决定(默认 1000)。 - 文件引用仅在输入框有文本时随消息发送(纯引用、无文本时发送按钮仍为禁用态)。
- 编辑器二进制判定为文件头 NUL 字节嗅探,超大文件(默认上限 512 KB,
maxEditBytes可调)拒绝编辑;保存快捷键为Ctrl+S(请求中写为 Ctrl+V,但那是粘贴快捷键,故按惯例实现为 Ctrl+S,如需调整请告知)。
致谢
- 编辑器直接集成开源代码编辑器 CodeMirror 6(codemirror.net,MIT License):行号、语法高亮、自动补全、搜索、历史等均来自 CodeMirror 及其官方语言包(
@codemirror/*、@lezer/*),随插件客户端包内联分发。 - 本插件整体基于 deepseek-ai/deepseek-harness(MIT)的槽位机制与设计体系构建。
测试
pnpm exec vitest run packages/extensions/workspace-file-view/tests
pnpm exec vitest run packages/client/ui-workspace/tests/workspace-browser.client.spec.tsx
pnpm exec vitest run packages/client/ui-primitives/tests/atoms.client.spec.tsx
包含:解释器映射、目录列表、TTY 会话注册表、客户端组件(文件树/内嵌 TTY/调试控件), 以及一个真实 Python 断点集成测试(无 Python 时自动跳过)。
许可
MIT —— 基于 deepseek-ai/deepseek-harness(MIT)衍生。
No comments yet. Be the first to write one.