DeepSeek Harness Hub
← 返回列表

文件面板liooil/dsh-files-pane

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

在会话标签页中浏览宿主机文件并就地阅读

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/10 · 已提供中文文档

In-browser files pane for the DeepSeek Harness Web GUI: a Session View tab that browses the host's files and reads them in place. · DSH 网页「文件」视图标签:两栏目录导航 + 就地阅读文件

综合分
29.3
GitHub 分
29.3
用户评分
★ Stars
0
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add liooil/dsh-files-pane
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-files-pane

一个用于 DeepSeek Harness Web GUI 的浏览器内文件面板:
一个会话视图标签页(对话 / 轨迹 / 文件),用于浏览宿主机上的文件并就地读取它们——
而不是把路径交给原生桌面打开器,因为无头宿主机无法响应这种请求。

在 DSH 网页面板里内置一个「文件」视图标签:左侧两栏目录导航,右侧阅读文件内容。不改动主窗体,
复用聊天窗自己的 Markdown 与代码渲染,点击会话里的任意文件即在其中打开。

为什么需要它

dsh web 运行在持有文件的机器上;浏览器通常不在那台机器上。点击对话中的文件
引用会调用 remote.session.openWorkspacePath,而在无头宿主机上这会启动 xdg-open 却什么也打不开。
本插件拦截那一次调用,改为在页面中渲染该文件。

功能特性

- 文件作为会话视图标签页 —— 与聊天和轨迹并列的第三个标签页,全宽,一次只显示一个视图。
没有浮动窗口,也不接管侧边栏。
- 从对话中点击直达 —— 工具卡片、@path 提及和产出文件标签都会在此打开,
并自动为你选中该标签页。
- 聊天窗口自身的渲染器 —— Markdown 走内置的 MarkdownText,代码
走内置的 shiki CodeBlock,因此两者的外观与对话中完全一致。
- Markdown 中的相对图片 ——  会从宿主机读取并渲染在
Markdown 文本旁边(MarkdownText 本身只渲染 http(s) 图片)。
- 两栏导航 —— 当前目录旁边有一个父级栏(同级项,仅目录,当前项高亮),
因此横向跳转无需先向上返回。
- 可编辑路径 —— 点击标题栏中的粗体名称,输入路径,按回车。~ 会被展开;
文件路径会定位到其内容,目录路径会定位到其列表。
- 面向阅读的界面 —— 一行合并的标题栏(祖先路径 + 固定的当前名称,仅在整行
会溢出时才采用 fish 风格的 ~ 和缩短),一个可将列表完全收起的折叠开关(跨重载记住),
以及绝不会让它所替换的面板变空的加载反馈。
- 文本每个文件上限 400 KB,图片上限 4 MB;二进制文件会被提示而非直接倾倒。

安装

该包是纯 ESM,带有手写的浏览器 bundle:无需构建步骤,无依赖。

从检出安装 —— 克隆它,然后将其作为一行挂载到你的 profile 的 patch 层
(~/.dsh/profiles//cordis.patch.yml):

git clone https://github.com/liooil/dsh-files-pane ~/.dsh/plugins/dsh-files-pane

- insert:
- id: files-pane
name: '/home//.dsh/plugins/dsh-files-pane/lib/index.js'

加载器接受类路径的条目名称,dsh-client-modules 会从它向上查找到本
包的 package.json,以获取 dsh.client 声明和 ./client bundle。该 bundle
随后在 /plugins/dsh-files-pane/client.js 处提供服务。

作为包安装 —— 该仓库声明了 dsh.bundle 清单(cordis.patch.yml),因此已发布的
副本可以直接按名称挂载:

dsh plugin add dsh-files-pane
⚠️ 二选一使用。同时从两个来源挂载同一个包会导致客户端模块扫描失败(resolves from multiple active Loader sources),因此在安装该包之前先删除本地路径那一行(反之亦然)。

更改插件集(包括这第一次挂载)会在下一次 dsh 启动时生效:

systemctl --user restart dsh     # 或者你的主机所采用的任何监管方式

布局

| 路径 | 半边 | 负责 |
| --- | --- | --- |
| lib/index.js | 主机端(Node) | 两个同源 POST 路由,/dsh-files-pane/list 和 /dsh-files-pane/read,通过部署自身的 fs 服务读取文件系统。 |
| client/client.js | 浏览器端 | View 标签页、头部操作、文件打开拦截,以及所有呈现。 |
| package.json | — | dsh.bundle 清单(可安装)、dsh.client 声明(platform: web),以及模块扫描器读取的 ./client 导出。 |
| cordis.patch.yml | — | 当此包作为包安装时,按名称挂载此包的 bundle 补丁。 |

浏览器半边是客户端模块表格式(window.__ModuleLoader__.load({id, factory}))的手写 bundle——与已发布的客户端包所采用的形态相同——因此它可以直接 require("react") 和 require("@deepseek-ai/dsh-client-ui-primitives")。

两个值得了解的接缝

两者都通过 Cordis 服务访问,且都能安全降级,但两者都足够内部化,值得记一笔:

- 打开标签页。 当前活动的 View 并不由某个服务拥有:会话头部和主体都从 conversation.session 槽 store(actions.setView)读取它。因此以编程方式选择此标签页的路径是 uiSession.adapter.resolve(sessionId) → slots.resolveStore(entry.store, binding) → store.actions.setView('files'),这与头部读取的是同一个按会话缓存的实例。如果未来版本重命名了其中任一环节,失败会被记录,插件会回退到手动切换标签页。
- 接管文件打开器。 remote.session.openWorkspacePath 在 Remote 命名空间服务上被替换(保存描述符,卸载时恢复),并以调用方期望的 Remote 信封 {ok, value} 作出响应。正是这一点让对话中的点击落到这里。

这两个主机路由位于 /api 之外(不涉及网关),因此它们自带防护:仅限 POST,外加 Origin/Host 同源检查。

开发

没有构建步骤:编辑 client/client.js 并重新加载。

- 仅浏览器半边 —— 让主机就地重新哈希 bundle,然后刷新页面:

ctx.get('clientModules').rebuilt('dsh-files-pane')

(一个调用此方法的微型 Cordis 插件就足够了;随后刷新页面即可获取新修订版本。)
- 主机半边或 package.json —— 重启 dsh。

客户端 HMR 驱动仅在 pnpm run dev:web 从检出目录重新构建 bundle 时才有用;此包是从其自身目录提供的,因此上述两步就是整个循环。
许可证

MIT — 参见 LICENSE。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群