dsh-main-file-tabs: Move sidebar files to the main workspace tabs for editing

前言

在 DeepSeek Harness(DSH)里,右侧边栏适合快速打开、预览项目文件;主工作区通常留给会话与对话。长文档、宽表格或复杂代码在窄栏里编辑会吃力,若把主工作区整块换成编辑器,又容易丢掉会话头部和边栏上下文。

DSH Main File Tabs(npm 包名 dsh-main-file-tabs)是社区维护者 l741589 提供的客户端插件:把边栏里已在预览的文件以页签形式打开到主工作区,并与侧边栏共用同一份文档与同一套 TextEditor,实现约 45ms 量级的双向文本同步,以及 Markdown 分屏编辑/预览。插件通过 DSH 的 Conversation View 承载「文件」工作区,不替换整个会话界面。

这是什么

  • 定位:面向 DSH Web / Desktop 的纯 JavaScript 客户端插件,零构建,安装后无需编译步骤。
  • 分类:客户端(Client 端注册 UI 与 mainFileTabs 服务;Host 半端为空实现)。
  • 许可证:MIT(见仓库 LICENSE)。
  • 生态说明:插件可在 SkillHub 目录页 查阅简介;社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。DSH 本身遵循「一切皆插件」的扩展方式。

核心功能

下面介绍 README 中已明确列出的能力(冲突处以仓库文档为准)。

打开与页签

  • 一键打开:右侧边栏文件工具栏右上角、页签「…」菜单,或原生预览工具栏。
  • 主工作区支持页签切换、关闭、中键关闭;右键可关闭当前、全部、左侧全部、右侧全部;文件图标与侧边栏一致。

编辑与渲染

  • 实时双向同步:侧边栏与主工作区各挂一个 CodeMirror 视图,通过 view.dispatch 转发变更;Markdown 预览随编辑刷新。
  • 与侧边栏一致:复用 dsh-better-sidebar 注册的 TextEditor 与 viewer 注册表,保留语法高亮、Markdown 预览、Mermaid、TOC、图片解析等。
  • Markdown / HTML / JSONL 支持「编辑 / 预览 / 分屏」。
  • 图片、PDF、HTML 等可从侧边栏以只读预览方式打开到主工作区;Office 文档仍在侧边栏预览。

会话布局

  • 会话头部新增 「文件」 View;点 「对话」 可回到聊天,右侧边栏与会话头部保留。

扩展

  • Client 服务 mainFileTabs:其他插件可 openFile、监听 onDidChange / onDidOpen / onDidClose 等,并查询 getOpenFiles、getText(详见 GitHub README)。
  • 界面文案跟随 DSH locale,支持中英双语。

环境要求

安装前请核对版本依赖(来自 README Requirements):

  • DSH 0.2.1-rc.2 或更高,且 profile 带有 Web UI(例如 desktop)。
  • dsh-better-sidebar 0.28.x(本插件复用其 TextEditor 与 viewer 注册表)。
  • 平台:DSH Desktop 支持的操作系统(Windows / macOS / Linux);Web 端 badge 标明 Web / Desktop。

安装与启用

从 npm 安装(推荐)

把 desktop 换成你实际使用的 profile 名称:

dsh plugin --profile desktop add dsh-main-file-tabs

安装完成后完全退出并重新打开 DSH(桌面版若缩到托盘,需从托盘退出)。重新打开后按 Ctrl+R / Cmd+R 刷新页面。README 说明:安装通常不会执行构建脚本,一般不会出现 approve-builds 提示。

从 GitHub 安装(备选)

dsh plugin --profile desktop add github:l741589/dsh-main-file-tabs

适合固定到某个 commit、或尚未有 npm 版本的场景。

确认是否生效

重启后在右侧边栏打开一个 .md 文件,工具栏右上角应出现 「在主工作区打开」。若未出现:

  1. 确认 dsh-better-sidebar 已安装并在当前 profile 启用;
  2. 使用页签「…」菜单中的「主工作区打开」;
  3. 在 DevTools Console 查看是否有 [dsh-main-file-tabs] 前缀日志。

安全与权限:插件以当前 DSH 进程权限运行,安装前建议阅读 源码仓库 与 MIT 许可证,自行评估是否纳入工作环境。

典型用法

经过上面的安装步骤后,可按 README 使用 一节操作:

  1. 在右侧边栏打开文本类文件(.md、.txt、代码文件等)。
  2. 点击 「在主工作区打开」,或页签菜单中的同名项。
  3. 会话头部切换到 「文件」 View,文件以页签出现在主工作区。
  4. 在任一侧编辑,另一侧同步;Markdown 预览随输入更新。
  5. 对 Markdown / HTML / JSONL 可使用工具栏 「分屏」:左侧编辑、右侧预览。
  6. 需要回到对话时,点文件工作区右上角 「对话」;边栏与会话头部仍在。

其他 Client 插件可通过服务 API 编程打开文件,例如:

const api = ctx.get('mainFileTabs')
const handle = api.openFile({
  path: 'docs/design.md',
  line: 12,
})
await handle.ready

openFile 若目标文件已在侧边栏打开且含未保存文本,会优先采用侧边栏实时文本而非磁盘旧内容。完整字段与事件说明见仓库 插件 API 章节。

工作原理(简要)

插件不复制编辑器实现,而是:

  • 在 conversation.view 注册文件工作区,避免占用全局 main panel;
  • 对两侧 CodeMirror 做最小差异同步,并同步 TextEditor 的 Markdown draft state,使远程更新时预览也能刷新而不重挂编辑器。

适用场景与注意

适合

  • 在 DSH 会话里边聊边看/改项目文档或代码,又希望主区域有足够宽度;
  • 需要 Markdown 分屏预览,且希望与侧边栏能力一致;
  • 编写 Client 插件,需要监听主工作区/侧边栏同一文件的文本变化。

已知限制(摘自 README)

  • 可编辑页签主要针对 fsRead 文本格式;图片、PDF、HTML 在主工作区为只读预览。
  • 主工作区与侧边栏交替保存同一文件时,可能出现保存冲突;侧边栏可 重新加载。
  • 同步实现依赖 dsh-better-sidebar 内部结构,其大版本变更可能导致同步退化,但不影响侧边栏原有功能。
  • 未保存草稿仅在浏览器内存;刷新页面会丢失;关闭脏页签会确认。
  • 通过 API 为非当前 sessionId 打开文件时,页签归属该会话,但不会自动切换会话。

结尾

dsh-main-file-tabs 解决的是「边栏够用、主区不够宽」与「占满主区又丢会话布局」之间的矛盾:同一份文档、同一套编辑器,在主工作区以页签继续编辑,并保留 DSH 会话与右侧边栏。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye