Important
v0.19.0 起接入 DSH 原生侧边栏:右列就是 DSH 自己的右侧栏,插件把每个 tab 类型注册为原生 tab(不再自绘右侧面板),只保留自绘的底部工作台与开放给所有插件的 ctx.betterSidebar 服务。
v0.21.1 起要求 DSH 0.1.7-rc.1+(peer 下限 ^0.1.7-rc.1;本版即 npm latest)。DSH 0.1.7 自带完整文档预览,插件把只读预览(表格 / PDF / 图片 / Office)整体让给内置,只保留 Markdown / HTML 与可编辑的代码编辑器。0.1.6-alpha.2 及更早的用户请固定 dsh-better-sidebar@0.19.1;按 DSH 版本选插件版本的对照表见安装。
右侧栏 + 底部面板双工作台,并把
ctx.betterSidebar 服务开放给所有插件——通过
registerTab / registerFileViewer 注册新的侧边栏页面与文件预览器。
- ✨ 功能一览
- 🚀 安装
- 🖼️ 特性巡礼
- 💬 社区
- 🆕 最近更新
- ⌨️ 快捷键
- 🔌 服务化扩展
- 🛠️ 开发与构建
- 🔐 安全 ·
⚠️ 已知限制 · 🖥️ 平台支持 - 🌐 插件生态 · 🤝 参与贡献 · 👥 贡献者 · 🔗 友情链接
相比 DSH 官方侧边栏,本插件补上的关键能力:
- 🖥️ 可编辑的代码编辑器:官方文档预览是只读的 → 插件保留可编辑的 CodeMirror 编辑器(保存、语法高亮、预览切换);Markdown / HTML 也走插件自有渲染(Mermaid 图表安全渲染 + 点击放大、README 级内嵌 HTML、浮动目录大纲、HTML 沙箱预览)
- 🗂️ 增强文件树:接管内置「文件」页——懒加载目录树、展开的目录实时 watch 自动刷新、软链接识别、全局文件名搜索、拖拽上传、悬浮
@文件一键引用进输入框 - 🌿 文件变动(官方侧栏没有 Git 面板):Git 视角(diff / 历史 / 暂存·提交·还原)+ 本轮 AI 改动视角双合一,统一 diff 渲染(行内字符级高亮、语法着色、敏感内容脱敏)
- 🧩 任务管理(官方没有):子代理拓扑实时预览 + 后台任务清单(退出码 / 实时输出 / 强制终止)
- 💬 侧边对话(官方没有,beta):Codex 风格侧边线程——继承主会话完整上下文独立运行,可持续追问,一键提升为顶层会话
- 🖥️ 底部工作台(官方没有):右列交给 DSH 原生右侧栏,插件另加自绘底部工作台(拖拽分栏 / 按会话持久化),可与原生栏同时展开
- 📂 模型打开侧边栏(可选):
sidebar_open工具让模型主动在侧边栏打开文件 / 文件夹 / 网页 - 🔌 服务化扩展:
ctx.betterSidebar向所有插件开放(registerTab/registerFileViewer),内置 5 tab + 3 viewer 走同一套 API,已有 28+ 生态插件(见「🌐 插件生态」) - ⚡ 按需加载:启动只拉 ~325KB 核心,编辑器 / Mermaid / 第三语言词典按需加载 · 🌏 多语言跟随 DSH · 🔁 会话隔离按会话持久化布局
前置:已装好 DSH(dsh web 能正常运行),Node.js ≥ 20、pnpm ≥ 10。
📌 通道与支持线:
v0.21.1是正式版(npmlatest),仅适配 DSH 0.1.7-rc.1+。装 DSH 请写精确版本号:npm i -g @deepseek-ai/dsh@0.1.7-rc.1(rc.1 走 npmnext通道)。DSH 0.1.6-alpha.2 及更早的用户请固定dsh-better-sidebar@0.19.1——0.1.7 的破坏面(设置服务重写、图标导出改名、会话格式 v3→v4)大到本版不写兼容层。
🧭 按你的 DSH 版本选插件版本:
你的 DSH 版本 安装命令 版本 / peer 声明 0.1.7-rc.1+(含之后的 0.1.7 正式版) dsh plugin --profile web add dsh-better-sidebar@latest0.21.1, ^0.1.7-rc.10.1.7-alpha.1 / 0.1.7-alpha.2 没有可装版本——先把 DSH 升到 rc.1,再跑上一行: npm i -g @deepseek-ai/dsh@0.1.7-rc.1— 0.1.6-alpha.2 及更早、 0.1.5-rc.*(含 npmlatest的 0.1.5-rc.3)dsh plugin --profile web add dsh-better-sidebar@0.19.10.19.1, ^0.1.5-rc.10.1.5-alpha.2dsh plugin --profile web add dsh-better-sidebar@0.19.0-alpha.1^0.1.5-alpha.20.1.2-rc.*dsh plugin --profile web add dsh-better-sidebar@0.18.1^0.1.2-rc.10.1.2-alpha.2dsh plugin --profile web add dsh-better-sidebar@0.18.0-alpha.0^0.1.2-alpha.20.1.0-rc.8/0.1.1dsh plugin --profile web add dsh-better-sidebar@0.17.1^0.1.0-rc.8命令里的
web换成你自己的 profile 名即可。旧版本一律写精确版本号(@0.19.1而不是@latest),因为latest会随新正式版前移;反过来也不要在 0.1.7 的 alpha 上装 0.19.1,装上只会坏。
dsh plugin --profile web add dsh-better-sidebar@latest本版不依赖任何需要构建脚本的包(终端连同
node-pty已整体交还 DSH),安装一步到位;装完后可在 DSH 自带的 Plugins 页面直接启停。
装完硬刷新浏览器(Cmd/Ctrl+Shift+R)即可看到侧边栏(DSH 对 client 改动热加载,无需重启;仅 host 半更新时需要重启)。
方式二:让 DSH 自己装——把下面这段提示词发给任意一个 DSH 会话:
帮我安装 dsh-better-sidebar 插件(DSH 侧边栏工作台),步骤:
1. 执行 dsh plugin --profile web add dsh-better-sidebar@latest(latest 即当前正式版)
2. 完成后提醒我硬刷新浏览器(Cmd/Ctrl+Shift+R)
遇到报错先查 https://github.com/omdsh-dev/DSH-better-sidebar README 的常见问题表。
方式三:一键脚本——克隆本仓库后执行 bash scripts/install.sh(macOS / Linux / Windows Git Bash;Windows 原生环境用 install.ps1;-h 查看参数),自动完成安装 + bundle 注册(含幂等清理旧的手动挂载行)。
更新
dsh plugin --profile web add dsh-better-sidebar@latest也可把 ~/.dsh/profiles/web/package.json 里的版本号改高后 pnpm install。改完硬刷新浏览器(Cmd/Ctrl+Shift+R)即可(client 改动无需重启 DSH)。
常见问题
| 现象 | 原因与解决 |
|---|---|
报 Ignored build scripts |
pnpm 11 拦截了某个传递依赖的构建脚本。在 profile 目录(~/.dsh/profiles/web)跑 pnpm approve-builds 按提示放行——本插件自身已无构建脚本依赖(终端删除后 node-pty 不在依赖里)。 |
报 minimum release age / 版本不足 24h |
装的版本发布不足 24 小时。等 24h 或重跑一次(pnpm 会自动补 minimumReleaseAgeExclude)。 |
| 报「找不到 profile 目录」 | 先跑一次 dsh web,让它初始化 ~/.dsh/profiles/web。 |
| 页面出现两个侧边栏 | 双挂载。旧的手动挂载行:~/.dsh/profiles/web/cordis.patch.yml 还留着 - insert: ... better-sidebar ...,删掉那段(同 id 重复挂载 loader 会直接报 duplicate loader entry id)。聚合包(如 @linxin666/dsh-web-ui-all)以不同 id 挂载本包时,0.13.x 起插件自身 bundle patch 会自动退让(检测到已有启用中的同包名挂载就不挂自己),无需手动处理;若仍双挂载,先确认聚合包的 bundle 顺序在 dsh-better-sidebar 之前。 |
| 升级后设置页的值去哪了 | DSH 0.1.7 删除了插件可注册的设置命名空间:偏好现在写在 profile 里本插件的挂载行上(默认 entry id better-sidebar),不再是 ~/.dsh/settings.yaml。插件会在首次启动时把旧 settings.yaml(已被宿主改名为 settings.yaml.imported)里 dsh-better-sidebar 段一次性回迁,只迁移当前 schema 仍声明的字段、且只在该行还没有用户值时执行,不会覆盖升级后新设的值。 |
| 终端无法使用 / 提示 shell 启动失败 | 终端由 DSH 自身的 ui-sidebar-terminal 提供(本插件不再自带终端与 node-pty,也没有终端相关设置项)。遇到问题请查 DSH 侧文档;若报错提到构建脚本,见上一行。 |
提示 dsh: command not found |
先安装 DSH;或直接用 npx -y --package @deepseek-ai/dsh dsh plugin --profile web add dsh-better-sidebar@latest。 |
从源码安装 / 开发(可选,替代 npm 方式)
调试本地改动或跟随开发分支时,把依赖指向本地克隆并自行构建:
1. git clone https://github.com/omdsh-dev/DSH-better-sidebar.git ~/Code/DSH-better-sidebar
cd ~/Code/DSH-better-sidebar && pnpm install && pnpm build
2. ~/.dsh/profiles/web/package.json 的 dependencies 写 "dsh-better-sidebar": "link:<克隆目录绝对路径>"
3. ~/.dsh/profiles/web/cordis.patch.yml 追加挂载行(这一行的 `config` 就是本插件的设置表单:部署限额 `readLimit` / `mediaLimit` / `uploadLimit` / `listLimit` 加用户偏好字段,设置页写的就是它;不写则全部用 schema 默认值):
- insert:
- id: better-sidebar
name: 'dsh-better-sidebar'
config:
readLimit: 524288
4. 在 ~/.dsh/profiles/web 执行 pnpm install
5. 硬刷新浏览器(Cmd/Ctrl+Shift+R)即可看到效果(client 改动无需重启 DSH;host 半改动才需重启)
更新:git pull && pnpm install && pnpm build → 硬刷新浏览器即可(client 改动热加载生效,无需重启 DSH;host 半改动才需重启)。切回 npm 通道时,把依赖改回 npm 上的对应版本(稳定线 "^0.19.1";本线 "^0.21.1")再 pnpm install。
通过 plugin-registry 安装(可选,与上述二选一)
前置:DSH 已集成 plugin-registry(dsh registry 可用)。同时启用两个通道会双挂载(Node 半挂两次、页面两个侧边栏)。
git clone https://github.com/omdsh-dev/DSH-better-sidebar.git && cd DSH-better-sidebar
pnpm install && pnpm build
node scripts/package-registry.mjs # 组装 registry/ 暂存(含清单 + 产物 + README,不入库)
dsh registry install ./registry # 安装(默认禁用)
dsh registry enable dsh-external/dsh-better-sidebar更新:git pull && pnpm install && pnpm build → node scripts/package-registry.mjs → dsh registry uninstall/install/enable。切换通道前先移除另一通道的挂载。
以下均为真实界面实拍(每行两张,点击可放大)。
| 🗂️ 文件工作台:资源管理器 支持两种格式的资源管理器:内嵌在文件预览中 / 独立显示文件树。懒加载目录树、展开的目录由宿主按目录 watch、改动后自动重列、软链接按目标类型展示(目录软链接可展开、失效链接标红)、全局文件名搜索、上传文件/文件夹与拖放上传、右键菜单(在新 Tab 打开 / 在侧边打开 / 复制路径)、悬浮 @文件 一键引用进输入框。 |
📝 Markdown · HTML 内联预览 Markdown 预览支持 Mermaid 图表( securityLevel: 'strict' 安全渲染 + 二次清洗;点击图表弹窗放大、滚轮缩放、拖拽平移)、README 级内嵌 HTML(徽章墙 <div align=center>、<details> 折叠块内嵌 markdown、表格单元格内联标签——DOMPurify 白名单消毒真实渲染,<script> 等活性内容剥除,本地图片经会话媒体路由重写)与浮动目录大纲(≥3 标题出现,点击平滑跳转、自动展开折叠块);HTML 走插件自带的沙箱预览,并带 htmlViewerNoSandbox / htmlViewerDefaultUnsafe 两个宿主没有的逃生门开关。图片 / PDF / 表格 / Office 不再是插件能力——那些格式由 DSH 自己的文档预览渲染。 |
| 🖥️ CodeMirror 代码编辑器 可编辑的文本 / 代码编辑器(保存、语法高亮、预览切换)——宿主自己的文档预览是只读的,这是插件保留 catch-all viewer 的理由。 |
🖼️ 图片 / PDF / 表格 / Office 预览(由 DSH 内置提供) 这些只读格式由 DSH 自己的 ui-sidebar-documentpreview 渲染:宿主侧 Office→PDF 转换、电子表格 worker 表格、图片 / PDF 缩放视口,并按目录自动刷新。插件已删除自己的 image / pdf / 下载兜底 viewer,也不再认领这些扩展名。 |
| 💻 终端(由 DSH 内置提供) 右侧栏终端由 DSH 自己的 ui-sidebar-terminal 提供:shell 选择、双击重命名、断线重连、刷新后恢复、主题与对比度跟随。插件不再自带终端实现。terminal_* 工具(默认关)是模型唯一的跨调用持久终端;上游等价物 @deepseek-ai/dsh-tool-terminal 未被任何内置 bundle 默认挂载,若你需要该能力,请在 profile 的 cordis.patch.yml 里自行插入一行 tool-terminal。 |
🌿 文件变动:Git 视角 + 本轮文件 双视角合一:Git 视角保留完整源代码管理(暂存 / 取消暂存 / 提交( Ctrl+Enter)/ 还原、历史、worktree 与子仓库选择);本轮文件视角实时折叠会话事件日志,记录模型读 / 写 / 编辑的每个文件(按文件分组、按类型筛选、操作数角标)。点击任意改动在底部可拖拽预览面板查看统一 diff——删红 / 增绿 / 改蓝配对 + 行内字符级高亮 + 语法着色 + 上下文折叠——也可一键展开为 VSCode 式独立 diff tab(同一渲染栈)。 |
| 🌐 外链接管(浏览器视图由 DSH 提供) 网页 tab 是 DSH 自己的 ui-sidebar-browser(多开 / 后退前进刷新 / 地址栏 / 沙箱 iframe),0.1.7 起只在 desktop profile 挂载——Web profile 里没有这个 kind。插件保留宿主没有的那一半:只认领有 tab 类型通过 urlTarget 明确声明的链接(Ctrl/Cmd 点击始终放行),其余一律放行给宿主(正文链接的去向由宿主的用户设置 linkOpening 决定);按协议分流的三个外链接管设置项已删除,认领成功但目标类型此刻不可用时兜底到 window.open。 |
🧩 任务页:子代理拓扑 + 后台任务 子代理树实时拓扑(运行状态、批量实时预览)+ 后台任务清单(退出码 / 实时输出 / 强制终止);新子代理 / 新任务可自动激活任务页,宽屏同时展开侧边栏,窄屏不强制展开全屏抽屉(可关)。 |
| 💬 侧边对话(beta) Codex 风格侧边线程:每个对话一个独立 Tab;线程继承主会话完整上下文(含进行中回合,以 interrupted 诚实冻结)独立运行,不污染主会话;可持续追问、重启冷恢复;一键「保存为新会话」提升为顶层会话。 |
🖥️ DSH 原生右侧栏 + 插件底部工作台 右列是 DSH 自己的右侧栏:插件把每个 tab 类型注册成原生 tab(含接管内置「文件」页),聊天里的文件点击直接落到原生栏——宿主自己的文档预览已覆盖的格式由宿主渲染,插件只认领 Markdown / HTML / 可编辑代码;插件自有底部面板可与其同时展开,拖 Tab 到分栏边缘拆分、拖到中间合并,高度拖上缘调节;开合按钮在会话头右侧。 |
| ⚙️ 声明式设置 设置页「侧边卡片」分区:每个 tab / 预览器一张小卡片,独立开关(高亮启用态 + 品牌开关滑块);二级设置经卡片底部「功能设置」条弹窗(开关 / 文本 / 数字 / 下拉);插件自有设置持久化在 pluginSettings,整份偏好则写在 profile 里本插件的挂载行上(DSH 0.1.7 起设置按 Loader entry id 寻址)。 |
📱 移动端 窄屏(<768px)自动切换为全宽抽屉:底栏 tab 一次性并入右侧栏,触屏拖拽可调。 |
推荐添加QQ群(577011007)
支持的 DSH 版本: · 完整发布历史见 Releases
📦 正式版(npm
latest):仅支持 DSH 0.1.7-rc.1+(peer 下限^0.1.7-rc.1,CI 钉@deepseek-ai/dsh@0.1.7-rc.1)。DSH 0.1.6-alpha.2 及更早的用户请固定在 v0.19.1——0.1.7 动了设置服务、图标具名导出与会话格式三处硬契约,本版不写运行时兼容层。⚠️ 上一版 v0.20.0 从未发布到 npm:它的终端 / 浏览器让出也一并落在本版,npm 上从 0.19.1 直接到本版。
- 🗂️ 只读文件预览整体让给 DSH 的文档预览:DSH 0.1.7 的
ui-sidebar-documentpreview自带表格 / PDF / 图片 / Office 渲染(宿主侧 Office→PDF 转换、电子表格 worker 表格、图片 / PDF 缩放、按目录自动刷新),所以插件删掉了自己的image/pdf/binary-download三个 viewer,并在editor.canOpen里拒绝认领这些扩展名——xlsx xls csv tsv fods pdf png jpg jpeg gif webp svg bmp ico doc docx ppt pptx——把文件地址交回宿主。rc.1 收回其中 9 个:xlsb/xlt/xltx/xltm/ots/dot/dotx/avif/ods宿主其实没有渲染器(点开只有「暂不支持预览」),而它们在让出之前是走插件兜底显示下载面板的,属于我们上一版自己引入的回归;现由插件的codecatch-all 重新认领。fods继续让出(宿主会用纯文本显示这段扁平 XML,比下载面板有用)。插件仍保留三件宿主没有的:Markdown(自带渲染器)、HTML(自带沙箱预览 +htmlViewerNoSandbox/htmlViewerDefaultUnsafe两个安全开关)、以及可编辑的文本 / 代码编辑器(内置那几个是只读预览);未知二进制(.zip/.wasm)仍走代码编辑器判 binary 后的下载面板,功能不回归。 - 🔗 外链接管收敛:删掉按协议分流的三个外链接管设置项(20 份词典的相关词条一并删除)。现在插件只认领有 tab 类型通过
urlTarget明确声明认领的链接,其余一律放行、由宿主决定(DSH 0.1.7 新增用户设置linkOpening,决定正文链接进侧栏还是新标签页);一个都没认领到时不阻止默认行为;认领成功但目标类型在打开那一刻已不可用(插件卸载 / 被关)时兜底window.open(url, '_blank', 'noopener,noreferrer')——顺手修掉了上一版留下的真实回归:插件自绘 markdown(侧边对话转录 / 编辑器预览 / diff 面板)里的 http 链接点了没反应。另外宿主的browserkind 在 Web profile 已不再挂载(0.1.7 只在 desktop profile 挂载它)。 - ⚙️ 设置接入面重写 + 用户偏好的自动回迁:DSH 0.1.7 删除了插件可注册的设置命名空间,改为按插件 Loader 行的 entry id 找表单(
SettingsForms:只剩describe/update/replace/mutate/configure)。插件偏好因此落在 profile 的 cordis patch 文档里(即本插件的挂载行),不再是~/.dsh/settings.yaml;schema 来自插件模块导出的Config(本版把用户偏好并进Config,并给每个偏好字段标meta.volatile = true——这一个标记就是「改设置实时生效、不重挂插件」的全部机制)。用户设置不会丢:插件首次启动时会把旧settings.yaml/settings.yaml.imported里的dsh-better-sidebar段一次性回迁(只在该行还没有任何用户值时执行,且只迁移当前 schema 仍声明的字段)。entry id 是运行时自发现的(本包默认better-sidebar,聚合包挂载时会是别的 id),不硬编码。 - 🔄 文件树实时刷新:插件接管了内置「文件」页,宿主自己的按目录 watch 覆盖不到它——本版新增
/sidebar/ws/fs-watch:客户端上报已展开的目录,宿主按目录fs.watch(150ms 去抖、每连接 64 个句柄上限、路径仍走fs.tree同一道 workspace fence),改动后只重列那一层、折叠即退订。此前文件树会一直陈旧到手动刷新。 - 🐛 会话跟随修好了:插件此前读的是一个不存在的
SessionListState.current字段(插件的类型镜像自己造了它,编译期一直放行),导致「按会话持久化」实际没绑上、窄屏 park 门控恒假。现在改用 DSH 0.1.7 的ctx.sidebarRight.mounted(只在该列真正换成另一个会话时才变化)。 - 🖥️ 模型侧代价不变:插件原有的 8 个
terminal_*工具(默认关)已在上一版删除,上游等价物@deepseek-ai/dsh-tool-terminal仍未被任何 shipped bundle 默认挂载,需要持久终端时请在 profile 的cordis.patch.yml里自行插入一行tool-terminal(否则模型只有一次性bash/pwsh)。 - 📐 基线:
@deepseek-ai/dsh-*全部钉0.1.7-rc.1,@deepseek-ai/cordispeer 下限^4.0.3;ui-primitives图标具名导出整族改名(Icon<Name><14|16>→Icon<Name>Regular/Medium,26 个具名导入随之适配);会话格式 v3→v4(sidechat 边界注入改用plugin:dsh-better-sidebar,tool 结果消息改role: 'tool'顶层形状,解析器同时接受新旧两种形状以兼容历史日志)。
📜 更早版本:完整发布历史见 CHANGELOG.md(v0.20.0 → v0.12.3)与 GitHub Releases。
| 操作 | 按键 |
|---|---|
| 保存编辑 | Ctrl/Cmd + S |
| Git 提交 | Ctrl + Enter |
| 关闭 Tab | 鼠标中键 |
| Tab 右键菜单 | 关闭 / 关闭其他页签 / 关闭左侧页签 / 关闭右侧页签(当前标签组) |
| 拆分/合并分栏 | 拖 Tab 到分栏边缘 / 中间 |
| 引用文件到输入框 | 悬浮行尾 @文件 按钮 |
| 复制文件路径 | 右键行 → 复制相对/绝对地址 |
从 v0.4.0 起暴露 ctx.betterSidebar 服务,其他插件可注册侧边栏页面与文件预览器(内置 5 tab + 3 viewer 亦通过同一服务注册)。v0.12.1 补齐基座能力(完整类型导出、能力探测、状态订阅、tab 角标、生命周期回调、定向打开、插件自有设置等)。v0.19.0 起新增文件图标注册:registerFileIcon 按扩展名(或保留的 'folder' / 'folder-open' 目录扩展名、exts: [] 全局默认)替换文件树与文件 tab 的图标,彩色 ReactNode 亦可——内置消费、注册即生效,无需自己接线。
完整接入文档(全字段、匹配算法、HMR 陷阱、声明式设置、版本探测、原生栏承载面与皮肤契约):docs/external-plugin-guide.md;仓库开发规则(硬约束 / CI / 发版)见 AGENTS.md。
设置页「侧边卡片」两个网格末尾的虚线卡片分别打开 Tab / 预览插件弹窗:声明扩展点、「在 GitHub 上浏览更多插件」按钮(GitHub topic dsh-better-sidebar)、推荐插件目录(名字 / 仓库 / 简介 / 安装脚本),每个条目「跳转」直达仓库、「复制」把安装命令写入剪贴板。
收录新插件:向 src/client/plugins-tabs.ts(Tab 注册)或 src/client/plugins-viewers.ts(文件预览注册)追加一条 PluginEntry,并把仓库打上 dsh-better-sidebar topic;数据完整性由 tests/plugin-list.spec.ts 守护。
pnpm install # @deepseek-ai/* devDependencies 已发布(基线 0.1.7-rc.1,alpha dist-tag),直接解析、无需令牌
pnpm typecheck # tsc --noEmit
pnpm lint # eslint .(flat config:js + typescript-eslint + react-hooks recommended)
pnpm build # → lib/index.js + lib/invariant.js + lib/client.js + lib/client-registry.js + lib/types
pnpm test # vitest(含 manifest 一致性守卫,需先 build)
pnpm watch # tsdown --watchMake 薄封装(make help 查看全部目标;package.json 仍是唯一事实源):
make check # 聚合校验门禁:typecheck → build → test → check:consumer-types(对齐 CI)
make mount # 真机挂载冒烟:build + pack → 安装 Chromium → pnpm test:mount
make clean # 清理 lib/、*.tgz、playwright-report/、test-results/pnpm check:consumer-types:对外类型声明面守卫——以浏览器-only 消费者(无 @types/node、skipLibCheck: false)的视角对构建出的 lib/types 做类型检查,需先 pnpm build。
架构:单 npm 包、host/client 双半结构——host(src/index.ts):/sidebar/api/* JSON API、/sidebar/file 媒体路由、/sidebar/html 预览路由、/sidebar/upload 上传路由,以及两条 WebSocket(/sidebar/ws/agent-opens 模型打开推送、/sidebar/ws/fs-watch 文件树目录 watch;fs / git / 预览全部会话级 + 信任围栏);client(src/client/index.tsx):portal 侧边栏 + 各视图 + 链接接管;状态按会话持久化 localStorage。插件按 DSH 官方规范组织(无 default 导出、双 client bundle),运行期不依赖 npm / checkout(@deepseek-ai/* 由 web profile 提供)。
- 路由受 Host 头信任围栏保护(与
/api一致);fs.write原子写入;媒体/预览路由仅限会话 cwd 内文件(workspaceFence关掉时除外,见设置页);git 只调 CLI、绝不设置身份 - HTML 预览的内容在不透明源沙箱 iframe 中渲染(无
allow-same-origin/allow-top-navigation、no-referrer、权限策略全禁);/sidebar/html路由带 CSPsandbox+ 大小/路径边界 - 设置页可按功能关闭 HTML 预览的沙箱(
htmlViewerNoSandbox/htmlViewerDefaultUnsafe,默认关闭,带警告文案)——关闭后内容与界面同源,仅建议对完全可信内容使用。网页 tab 的沙箱不再是插件的面:浏览器视图由宿主提供(desktop profile),其沙箱与导航策略见 DSH 侧文档
- Git 无 push/pull/fetch;Markdown 预览提供手动刷新按钮,刷新未保存编辑前会确认是否丢弃草稿;文件树只对已展开的目录做 watch(折叠的目录不订阅,也不做全工作区递归扫描);工具行内文件打开按钮不可拦截
- 只读预览的格式由宿主决定:表格 / PDF / 图片 / Office 走 DSH 自己的
ui-sidebar-documentpreview,插件只渲染 Markdown / HTML 与可编辑的文本代码;宿主的实现(渲染细节、缩放、刷新时机)随 DSH 版本走 - 浏览器视图只在 desktop profile 存在:Web profile 没有宿主
browserkind,插件也不再自带浏览器 tab,因此网页 tab 只在 desktop profile 可用;登录态 / 第三方 Cookie /X-Frame-Options等限制随宿主实现 - HTML 预览渲染的是已保存文件(不反映未保存草稿)
- 移动端(<768px)无底部面板:进入窄屏时其标签页一次性并入右侧栏(迁移后回桌面仍保留在右侧栏),桌面端的底部面板只在宽视口下可用。未选中会话时,点按弱化开关会显示选择会话提示;选中会话后开关打开全宽抽屉
Windows / Linux / macOS 三平台适配(macOS 日常验证;其余经单元测试覆盖)。插件不再包含原生依赖(终端与 node-pty 已整体交还 DSH 自身),构建只需 Node + pnpm,无需编译工具链。
ctx.betterSidebar 服务向所有插件开放两个扩展点:registerTab(注册侧边栏页面) 与 registerFileViewer(注册文件预览器)。内置的 5 tab + 3 viewer 与第三方插件走同一套 API,能力完全对等。
import type {} from 'dsh-better-sidebar' // 触发 ctx.betterSidebar 类型合并
export const inject = ['betterSidebar']
export function apply(ctx: Context) {
ctx.effect(() => ctx.betterSidebar.registerTab({
id: 'my-plugin:db', title: 'Database', component: ({ scope }) => <DbView sessionId={scope.sessionId} />,
}))
ctx.effect(() => ctx.betterSidebar.registerFileViewer({
id: 'my-plugin:csv', exts: ['csv'], fetchStrategy: 'custom',
load: async (path, scope) => parseCsv(await fetchText(scope, path)),
component: ({ customData }) => <CsvGrid rows={customData} />,
}))
}GitHub topic dsh-better-sidebar 下已有 28+ 生态插件(持续增长中):
24 个插件(点击展开)
| 插件 | ⭐ | 简介 |
|---|---|---|
| ChenRuoT/dsh-sidebar-qa | 划选追问侧边页:类 Codex 侧边提问 / Claude Code /btw |
|
| fuhefei/dsh-sentinel | 条件驱动唤醒系统:文件 / 命令 / HTTP / 进程 / Webhook 监视,到点唤醒 agent;dock + 侧栏分支 + 全局仪表盘 | |
| Fisfzy/ego-browser | Agent 浏览器:i18n 感知的本机浏览器 Tab(@dsh-external/ego-browser,装了 better-sidebar 自动注册侧边栏页,未装回退浮动浮窗观察) |
|
| jiuge2467/dsh-studio | 全栈增强工作台:多源 MCP 可视化调试中枢、视觉思考引擎 | |
| Iwctwbh/dsh-flowglass | 流镜 Flowglass:会话流程图实时可视化(消息 / 工具组 / 子代理分支) | |
| FeatherHunter/dsh-mattpocock-skills-deck | mattpocock/skills 游戏化任务系统:地图拨迷雾、任务栏推进 | |
| GULI-lab/DSH-element-source | 点击页面任意 UI 元素直达 Vue / React / Svelte / Angular 源码并送入会话 | |
| Lzh3070/dsh-file-review-tab | 文件改动审查页:行级红绿 diff + 撤销 + chat 行深链 | |
| yq04/dsh-git-remotes | Git 远程页:分支 / 上游 / ahead-behind,fetch 可 prune、ff-only pull、确认后 push | |
| ztyhehe/dsh-better-sidebar-svn | SVN 源码管理页:status / diff / log / commit / update / revert / 冲突解决,与内置 Git 面板对称 | |
| Melody-max114/dsh-excel-panel | Excel 编辑页:xlsx 预览 / 编辑、公式实时计算、合并单元格、保存回原文件 | |
| v587d/dsh-anysearch-refs | AnySearch 搜索结果引用卡片:搜索词、来源摘要、关键词高亮 | |
| mlosun/dsh-docs-panel | 全局文档面板:随身 Markdown 笔记,任何工作区随时可读 | |
| lnyuqian/dsh-skill-sidebar | 技能面板:扫描本机技能目录,4-6 字功能短语 + 一键复制调用 + 置顶 | |
| g-yixuan/dsh-sidenote | Codex 风格侧边对话 + 划选引用注释(轻量消费插件) | |
| thirsty5034/dsh-ssh-tunnel | 多主机 SSH 隧道 + SSH 管理器页 | |
| thirsty5034/dsh-git-forge | GitHub / Gitea 账号、项目授权与推送策略 | |
| YesSanSan/dsh-conversation-outline | 对话大纲页:按轮次结构化展示、一键跳转、LLM 一句话标题 | |
| Wulabalabo/dsh-sidebar-Explorer-Plus | 文件管理页:上传 / 移动 / 删除 / 重命名 / 新建文件夹(补全写操作) | |
| yq04/dsh-turn-review | 本轮审查:逐回合审查 agent 改动 | |
| Ghz114514/dsh-refpics | Pinterest 风格参考图搜索:瀑布流、侧栏画板、下载与 Eagle 收藏 | |
| yzlin499/dsh-yzlin499-easy-plugins | 实用小工具集(毛坯房 DSH 友好) | |
| dong-victor/dsh-better-sidebar-starter | 运行配置页:IDEA 式 Run/Debug 配置(npm / springboot / python / custom)——一键启动、历史保存、WebSocket 实时日志(ANSI 彩色)、多实例并行、进程树跨平台杀死 | |
| baosfeng/my-dsh-plugins | 个人多插件合集(dsh-file-activity):侧边栏文件活动页——记录文件读取 / 新增 / 修改历史与统计,按文件夹平铺,点击用原生预览打开 |
|
| Hoemr/dsh-better-overleaf | Overleaf 标签页:直连 CDP 浏览器登录(支持第三方 Chromium)、项目切换、工作区下 overleaf/ 目录本地 git 镜像与双向同步 |
3 个插件(点击展开)
| 插件 | ⭐ | 简介 |
|---|---|---|
| HuanLinOTO/dsh-plugin-better-sidebar-plugin-office | Office 三件套预览(.docx / .xlsx / .pptx),独立 bundle 瘦身主体(官方推荐目录收录) | |
| zemul/dsh-video-preview | 视频内联预览:.mp4 / .webm / .mov / .mkv / .avi,自带 /video 路由支持 HTTP Range 拖进度条 | |
| dong-victor/dsh-better-sidebar-jupyter | .ipynb 可运行 Notebook 视图:懒启动 Python kernel、流式输出、保存回写 |
3 个插件(点击展开)
| 插件 | ⭐ | 简介 |
|---|---|---|
| eg-bole/dsh-better-sidebar-icons | VSCode 风格文件 / 文件夹图标主题:文件树与编辑器 Tab 换上熟悉的开发环境图标(vscode-icons 移植,纯 DOM 覆盖零侵入,安装 / 卸载零残留) | |
| dong-victor/dsh-better-sidebar-terminal-plus | 终端增强:内嵌 Nerd Font 图标字体、修复 xterm 图标渲染、稳定终端 cwd | |
| Max-Null/dsh-sidebar-preview-select | 预览划选增强:侧边栏预览里划选文本 → 浮动「发送到会话」 | |
| Hoemr/dsh-quicklook | QuickLook 式空格预览:活动文件标签页按 Space 全尺寸查看图片 / PDF / 文本,Space 或 Esc 关闭 |
📣 上架你的插件:给仓库打上
dsh-better-sidebartopic 即出现在 topic 页;再向src/client/plugins-tabs.ts/src/client/plugins-viewers.ts提一条PluginEntryPR,即可进入设置页内置推荐目录(数据完整性由tests/plugin-list.spec.ts守护)。
- 代码改动走 PR:
feat/*/fix/*分支开发 →gh pr create;纯文档改动可直接推 main - 收录生态插件:给仓库打
dsh-better-sidebartopic + 向src/client/plugins-tabs.ts/plugins-viewers.ts提 PR - 提交前自检:
pnpm typecheck && pnpm build && pnpm test(或make check一键聚合;CI 另有 npm 打包 → 真实挂载 → 无头渲染门禁pnpm test:mount,及聚合双挂载回归pnpm test:mount:aggregate) - 仓库工作规范见
AGENTS.md(含仓库硬约束与 CI 说明)
感谢每一位贡献者:
- dsh-tianshu-tui:DeepSeek Harness 交互式终端 UI 插件(渲染核心由自研 harness agent Tianshu-Tui 演进而来),在官方基础上增加 TDD 与证据门等工作流
- dsh-TUI:Claude Code 风格全屏交互终端插件——像素鲸鱼顶栏、实时工作状态行、思考流式展开、双击 Esc 回滚、上下文进度条 + TPS 仪表,npm 一键安装
- dshfind 插件超市:三方插件市场——GitHub topic
dsh-plugin下的公开仓库清单,每日同步 star、贡献者与增长数据 - DeepSeek Harness Desktop:为 DeepSeek Harness 生态打造的现代化桌面端——无需配置 Node.js 或执行命令即可启动和管理本地 Harness 服务;官网















