UsamiRenkorin
dsh-workspace-file-view
DeepSeek Harness dsh-workspace-file-view
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 14, 2026
- Updated
- Aug 14, 2026
Introduction
dsh-workspace-file-view
DeepSeek Harness 侧边栏「文件视图」独立插件 —— 「视图选项」菜单新增「查看内容」切换, 对话视图 / 文件视图一键切换;文件视图可浏览工作区目录,并在内嵌 TTY 中 运行 / 调试脚本(按扩展名解析解释器,Python 支持简化版断点调试)。
🤖 纯 AI 创作声明:本仓库的代码与文档均由 AI(DeepSeek 大模型)独立创作完成, 未经人工编写或人工代码评审。功能经单元测试(含真实 Python 断点集成测试)与类型检查验证, 请谨慎用于生产环境。
功能特性
- 「查看内容」切换:侧边栏「视图选项」菜单新增胶囊开关(灰=对话视图,绿=文件视图,1px 浅灰描边)。
- 文件视图:以树形层级展示各工作区目录(文件夹可逐层懒加载展开,文件为叶子行)。
- 重命名 / 新建:文件与文件夹行悬浮出现 ✎ 重命名(位于 ▶ 运行之前;不可运行的文件同样有),点击后行内名称变为输入框(回车或点击外部提交,Esc 取消);右键文件夹弹出「新建文件 / 新建文件夹」(带文件/文件夹图标),直接进入行内命名,未命名失焦即取消,命名后即在对应目录创建。
- 文件引用:右键文件行把它「引用」到模型输入框——输入框内、输入文本上方出现固定大小的圆角矩形文件块(文件图标 + 文件名,超长省略号),输入框随之向上扩展;点击块上的 × 可移除。发送消息时,实际发送给模型的不是文件内容,而是一张仅包含所引用文件及其目录链的目录树结构图(正则切分路径、动态折叠成树,无关文件不出现),发送成功后引用自动清空——省去 AI 每次用 ls 探查目录的步数。
- 浮动文件编辑器(CodeMirror 6):左键点击文件行在页面右上角弹出浮动的圆角矩形面板(不嵌入列布局),带 1、2、3… 行号与语法高亮的完整代码编辑器(按扩展名匹配 JS/TS/JSX、Python、Markdown、HTML、CSS、JSON、XML,含自动补全/搜索/历史),同时具备上下与左右滚动条(长行横向滚动,不换行截断);编辑先落在缓存缓冲区,点「保存」按钮(或
Ctrl+S)才写回磁盘,未保存时文件名旁有 ● 标记;.md/.html文件提供 【编辑|预览】 切换——预览模式用浏览器端管线渲染 Markdown(同样可横纵滚动)、用沙箱 iframe(srcdoc)渲染 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 流,不依赖 directory-picker 与 apiproxy);browser 半填充 sidebar.workspaces.viewContent 槽位(文件树 + 内嵌 TTY + 运行/调试 UI)、提供 fileRefs 服务并填充 conversation.input.refs 槽位(引用块)、填充 shell.overlay 槽位(浮动文件编辑器) |
patch/ui-workspace.diff | 最小槽位补丁:ui-workspace 声明 sidebar.workspaces.viewContent 子槽位、菜单渲染「查看内容」开关、列表区挂载槽位 body |
patch/ui-primitives.diff | Menu 组件支持开关行(role="menuitemcheckbox" + 胶囊视觉) |
patch/ui-conversation.diff | 最小槽位补丁:ui-conversation 声明 conversation.input.refs 槽位(输入卡内引用块)、声明可选 fileRefs 服务、发送时把引用文件折叠成目录树附入消息 |
examples/cordis.patch.yml | web profile 补丁:挂载插件行 |
scripts/ensure-registry.mjs | 安装引导:npmjs 下载过慢(<700 KB/s)自动切换 npmmirror 国内镜像 |
安装 / 应用
需要一份
deepseek-ai/deepseek-harness源码检出(本插件是源码级组合,不是 npm 独立安装包)。
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
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 取消。
- 右键文件夹 → 「新建文件 / 新建文件夹」:直接在对应目录下出现命名行,输入名字回车(或失焦)即创建,未命名失焦即取消。
- 右键文件 → 文件被引用:模型输入框内、输入文本上方出现圆角矩形文件块(文件图标 + 文件名),输入框随之向上扩展;点击块上 × 可移除。
- 发送消息时,引用的文件会以目录树结构图的形式随消息发给模型(只含被引用文件及其目录链),发送成功后引用自动清空。
- 左键点击文件 → 页面右上角弹出浮动圆角编辑器面板(CodeMirror 6):行号、按扩展名语法高亮、自动补全、搜索、历史,上下/左右滚动条齐全;编辑在缓存缓冲区中,点「保存」(或
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)衍生。