dsh-better-sidebar 0.12.3 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -32
- package/README_EN.md +57 -11
- package/cordis.patch.yml +30 -0
- package/lib/client-editor.js +558 -171
- package/lib/client-mermaid.js +199829 -0
- package/lib/client-registry.js +1182 -504
- package/lib/client-terminal.js +220 -150
- package/lib/client.js +1174 -496
- package/lib/index.js +130 -18
- package/lib/types/agent-pty.d.ts +2 -1
- package/lib/types/bundle-route.d.ts +1 -1
- package/lib/types/client/EditorHost.d.ts +5 -3
- package/lib/types/client/FileTree.d.ts +17 -0
- package/lib/types/client/SideCardSection.d.ts +6 -0
- package/lib/types/client/TreePanel.d.ts +15 -0
- package/lib/types/client/api.d.ts +12 -0
- package/lib/types/client/builtins/index.d.ts +2 -1
- package/lib/types/client/builtins/tabs.d.ts +7 -2
- package/lib/types/client/chunk-loader.d.ts +1 -1
- package/lib/types/client/chunks/mermaid.d.ts +10 -0
- package/lib/types/client/locales.d.ts +20 -0
- package/lib/types/client/mermaid-blocks.d.ts +41 -0
- package/lib/types/client/mermaid-sanitize.d.ts +2 -0
- package/lib/types/client/mermaid.d.ts +12 -0
- package/lib/types/client/prefs.d.ts +11 -0
- package/lib/types/client/service.d.ts +52 -4
- package/lib/types/client/state.d.ts +30 -8
- package/lib/types/config.d.ts +12 -1
- package/lib/types/fs-search.d.ts +24 -0
- package/lib/types/index.d.ts +8 -0
- package/lib/types/prefs-shared.d.ts +10 -1
- package/lib/types/pty-manager.d.ts +12 -2
- package/package.json +33 -31
- package/src/agent-pty.ts +2 -1
- package/src/bundle-route.ts +1 -1
- package/src/client/EditorHost.tsx +341 -23
- package/src/client/{ExplorerView.tsx → FileTree.tsx} +81 -64
- package/src/client/SideCardSection.module.css +53 -0
- package/src/client/SideCardSection.tsx +124 -2
- package/src/client/TextEditor.tsx +65 -9
- package/src/client/TreePanel.tsx +121 -0
- package/src/client/api.ts +8 -1
- package/src/client/builtins/index.ts +7 -3
- package/src/client/builtins/tabs.tsx +64 -29
- package/src/client/chunk-loader.ts +1 -1
- package/src/client/chunks/mermaid.tsx +10 -0
- package/src/client/index.tsx +66 -16
- package/src/client/intercept.tsx +5 -2
- package/src/client/locales.ts +40 -0
- package/src/client/mermaid-blocks.ts +110 -0
- package/src/client/mermaid-sanitize.ts +93 -0
- package/src/client/mermaid.tsx +401 -0
- package/src/client/prefs.ts +22 -0
- package/src/client/service.ts +55 -3
- package/src/client/sidebar.module.css +312 -0
- package/src/client/state.ts +69 -18
- package/src/config.ts +16 -2
- package/src/fs-search.ts +86 -0
- package/src/index.ts +47 -6
- package/src/prefs-shared.ts +12 -2
- package/src/pty-manager.ts +19 -2
- package/lib/types/client/ExplorerView.d.ts +0 -9
package/README.md
CHANGED
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
</div>
|
|
16
16
|
|
|
17
17
|
<div align="center">
|
|
18
|
-
<video src="https://github.com/user-attachments/assets/23187822-047e-45cc-b480-fe997bd55b86" muted autoplay loop playsinline controls width="100%"></video>
|
|
19
18
|
<img alt="dsh-better-sidebar 工作台截图" src="https://github.com/user-attachments/assets/dfdb875e-a1a8-4d4b-8340-353736b1708f" />
|
|
19
|
+
<video src="https://github.com/user-attachments/assets/23187822-047e-45cc-b480-fe997bd55b86" muted autoplay loop playsinline controls width="100%"></video>
|
|
20
20
|
</div>
|
|
21
21
|
|
|
22
22
|
## ✨ 功能一览
|
|
23
23
|
|
|
24
|
-
- **🗂️ 文件工作台**:资源管理器(懒加载目录树;软链接按目标类型展示——目录软链接可展开、失效链接标红)+ CodeMirror 编辑器;图片 / Markdown
|
|
24
|
+
- **🗂️ 文件工作台**:资源管理器(懒加载目录树;软链接按目标类型展示——目录软链接可展开、失效链接标红)+ CodeMirror 编辑器;图片 / Markdown(含 Mermaid 图表,strict 安全渲染 + 点击放大)/ HTML / PDF / Office 内联预览
|
|
25
25
|
- **🌐 内嵌浏览器**:多开网页 tab,后退 / 前进 / 刷新;内容运行在沙箱 iframe;外链默认按协议分流——HTTP 在侧边栏打开、HTTPS 走系统浏览器(设置页可分别调整)
|
|
26
26
|
- **💻 真实终端**:xterm.js + node-pty 真实 shell,断线重连回放;可选为模型注入 `terminal_*` 工具
|
|
27
27
|
- **🌿 Git 面板**:真 diff + VSCode 式 diff tab、历史、右键暂存 / 提交 / 还原
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
- **🪟 双工作台**:右侧栏 + 底部面板;拖 Tab 拆分 / 合并分栏(可跨面板),移动端自动合并全宽抽屉
|
|
30
30
|
- **🔁 会话隔离**:布局 / Tab / 面板按会话持久化,陈旧状态自动净化
|
|
31
31
|
- **⚙️ 声明式设置**:设置页「侧边卡片」逐项独立开关,二级设置经齿轮弹窗
|
|
32
|
-
- **⚡ 按需加载**:启动只拉 ~325KB 核心,终端 /
|
|
32
|
+
- **⚡ 按需加载**:启动只拉 ~325KB 核心,终端 / 编辑器 / Mermaid 图表等重依赖用到才按需拉取([设计文档](docs/plans/2026-08-12-lazy-chunks-design.md))
|
|
33
33
|
- **🌏 多语言**:界面文案跟随 DSH 语言(zh / en)实时切换
|
|
34
34
|
|
|
35
35
|
> 🔌 **核心理念**:服务优先——内置的 7 tab + 6 viewer 与第三方插件通过同一套 `ctx.betterSidebar` API 注册,能力完全对等;官方不再内置、可由生态提供的功能,交由生态插件实现。接入文档见下方「🔌 服务化」与 [外部插件接入指南](./docs/external-plugin-guide.md)。
|
|
@@ -37,45 +37,55 @@
|
|
|
37
37
|
## 🆕 最近更新
|
|
38
38
|
|
|
39
39
|
<div align="center">
|
|
40
|
-
<a href="https://github.com/user-attachments/assets/
|
|
41
|
-
<a href="https://github.com/user-attachments/assets/
|
|
40
|
+
<a href="https://github.com/user-attachments/assets/d2aea86b-a776-4f01-a6b8-b26b27314336"><img width="33%" alt="侧边栏" src="https://github.com/user-attachments/assets/d2aea86b-a776-4f01-a6b8-b26b27314336" /></a>
|
|
41
|
+
<a href="https://github.com/user-attachments/assets/946f7028-4967-461e-a750-d1b5056b62d0"><img width="33%" alt="服务化基座截图" src="https://github.com/user-attachments/assets/946f7028-4967-461e-a750-d1b5056b62d0" /></a>
|
|
42
|
+
<a href="https://github.com/user-attachments/assets/d4385b7e-aab4-425d-a5c4-2da5da81a34e"><img width="33%" alt="添加插件截图" src="https://github.com/user-attachments/assets/d4385b7e-aab4-425d-a5c4-2da5da81a34e" /></a>
|
|
42
43
|
</div>
|
|
43
44
|
|
|
44
|
-
### v0.
|
|
45
|
+
### v0.13.1
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
**✨ 新功能**
|
|
48
|
+
|
|
49
|
+
- 📊 **Markdown 预览安全渲染 Mermaid 图表**([#164](https://github.com/omdsh-dev/DSH-better-sidebar/pull/164)):预览的 md 含 mermaid fence 时按需下发 `client-mermaid.js` chunk(~7MB,无 mermaid 文件零加载);纵深防御渲染——`securityLevel: 'strict'` + `htmlLabels: false`(节点文字走真实 SVG `<text>`)+ SVG 注入前二次清洗(删 `foreignObject`/`script`/外来 HTML 元素、剥 `@*`/`on*`/`href` 属性);点击图表在弹窗中放大(滚轮以鼠标为中心缩放、拖拽平移、工具栏与快捷键),深浅色跟随重渲、解析失败回退原码
|
|
50
|
+
- 🖥️ **终端 shell 与 shellArgs 可配置**([#125](https://github.com/omdsh-dev/DSH-better-sidebar/pull/125)):`cordis.patch.yml` 的 `better-sidebar.config` 可指定 `shell` / `shellArgs`(`shellArgs` 非空时完全替换默认参数;未配置维持自动解析 `$SHELL` / 登录 shell / `powershell.exe` 原行为),UI 终端与 agent 终端(`terminal_create`)同时生效;终端 tab 标题改用 shell 名(bash / zsh / powershell),内部标识改 UUID,同 shell 可开多个终端
|
|
48
51
|
|
|
49
|
-
|
|
52
|
+
**🐛 修复**
|
|
50
53
|
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
- ➕ **添加插件**:设置页「推荐插件目录」+ 一键复制安装命令;内置 Office 预览迁至推荐插件
|
|
54
|
-
- 🖱️ **标签页滚轮**:标签页栏支持鼠标滚轮横向滚动
|
|
55
|
-
- 🐛 **修复**:远程访问 403(信任栅栏改用 `trustedHosts`)、侧边栏崩溃 [#31](https://github.com/omdsh-dev/DSH-better-sidebar/issues/31)、Windows 下 HTML 预览盘符路径
|
|
54
|
+
- 🔗 **聚合双挂载自动退让**([#200](https://github.com/omdsh-dev/DSH-better-sidebar/pull/200)):聚合包(如 dsh-web-ui-all)以独立条目 id 挂载同包时,`cordis.patch.yml` 的守卫表达式自动禁用自身 `better-sidebar` 行,不再重复注册 `/sidebar/api` 导致 `duplicate prefix route` 整个插件树启动失败(`dsh web` 崩溃);独立安装行为不变
|
|
55
|
+
- 🔧 **peer 依赖对齐 DSH 0.1.0-rc.7**([#207](https://github.com/omdsh-dev/DSH-better-sidebar/pull/207),修复 [#206](https://github.com/omdsh-dev/DSH-better-sidebar/issues/206)):全部 `@deepseek-ai/*` peer / devDependencies 从 `^0.1.0-rc.6` 升至 `^0.1.0-rc.7`,CI 挂载冒烟同步钉版——消除主框架升至 rc.7 后 rc.6 / rc.7 混用依赖树导致的 `agent-presets: refusing to compose an unscoped context`(选模型 / 发消息报错)
|
|
56
56
|
|
|
57
|
-
### v0.
|
|
57
|
+
### v0.13.0
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
- ➕ **添加插件**:设置页「推荐插件目录」+ 一键复制安装命令;内置 Office 预览迁至推荐插件
|
|
61
|
-
- 🖱️ **标签页滚轮**:标签页栏支持鼠标滚轮横向滚动
|
|
62
|
-
- 🐛 **修复**:远程访问 403(信任栅栏改用 `trustedHosts`)、侧边栏崩溃 [#31](https://github.com/omdsh-dev/DSH-better-sidebar/issues/31)、Windows 下 HTML 预览盘符路径
|
|
59
|
+
**✨ 新功能**
|
|
63
60
|
|
|
64
|
-
|
|
61
|
+
- 📁 **文件窗口与资源管理器二合一**([#151](https://github.com/omdsh-dev/DSH-better-sidebar/pull/151)):新 `editorExplorer` 设置(默认开,编辑器卡齿轮)——文件 tab 增加路径输入框头部 + 可开关的右侧停靠文件树(每 tab 记忆展开/宽度,左缘拖拽调宽 160~480px,全局文件名搜索走 host `fs.search` 路由,预算封顶并跳过 `.git` / 符号链接目录);合并模式下树点击 / 输入框 Enter **原地切换**当前 tab,独立模式按路径新开;新会话默认 seed 空文件窗口(`Files`)替代 explorer tab,无路径窗口在合并模式为带 chrome 的空文件窗口、独立模式为纯资源管理器;树右键提供「在新 Tab 中打开」「在侧边打开」(split)
|
|
62
|
+
- 🎛️ **声明式设置 select 行**([#151](https://github.com/omdsh-dev/DSH-better-sidebar/pull/151)):设置项新增 `type: 'select'`(`options` 支持 value/title/desc/icon,`multi` 多选存数组);带图标的选项渲染大图标选项卡、收起态同样显示图标;`editorExplorer` 改为图标化下拉(合并 / 独立);能力清单新增 `settingSelect`
|
|
63
|
+
- 🔀 **与 dsh-web-ui 家族右侧面板互斥**([#181](https://github.com/omdsh-dev/DSH-better-sidebar/pull/181)):读取 `aionui-panel` 设置命名空间的提供方选择——当选择「使用 aionui-panel」时,整个 better-sidebar(右侧栏 / 底部面板 / 浮动入口 / 各类接管)不再挂载;选择 DSH-better-sidebar(或未安装 aionui)时正常。设置页保存后实时生效(settings-document 推送),无需刷新
|
|
65
64
|
|
|
66
|
-
### v0.12.
|
|
65
|
+
### v0.12.3
|
|
66
|
+
|
|
67
|
+
**✨ 新功能**
|
|
68
|
+
|
|
69
|
+
- 🎨 **皮肤兼容(令牌驱动)**:全面消费 DSH 设计令牌,与 dsh-web-ui 皮肤中心 10 款皮肤兼容,换肤自动跟随;终端/编辑器表面在透明/半透明玻璃值下回退不透明底色,文字不叠在皮肤背景上([#110](https://github.com/omdsh-dev/DSH-better-sidebar/pull/110),修复 #106 #105 #90 #60,附带 #52 #57 #92)
|
|
70
|
+
- 🗂️ **统一路径处理**:UNC 路径 / 软链接分类(目录软链接可展开、失效链接标红)、HTML 路由平台守卫([#134](https://github.com/omdsh-dev/DSH-better-sidebar/pull/134),#65 #67 #43 #79 #115)
|
|
71
|
+
- 🖥️ **终端 shell 可配置**:设置项自定义 shell,Windows 自动探测 pwsh([#95](https://github.com/omdsh-dev/DSH-better-sidebar/pull/95))
|
|
72
|
+
- 📝 **编辑器新增语言**:C# / Kotlin / Swift 语法高亮([#120](https://github.com/omdsh-dev/DSH-better-sidebar/pull/120))
|
|
73
|
+
- 🧭 **设置页导航图标**:设置页导航图标与布局优化([#114](https://github.com/omdsh-dev/DSH-better-sidebar/pull/114))
|
|
74
|
+
- ➕ **推荐插件目录新增**:`dsh-git-remotes`——Git 远程 Tab(分支/上游/ahead-behind、fetch 可 prune、ff-only pull、确认后才 push,不替换内置暂存/提交)([#91](https://github.com/omdsh-dev/DSH-better-sidebar/pull/91));`dsh-video-preview`——视频内联预览(.mp4/.webm/.mov/.mkv/.avi 等,自带 /video 宿主路由支持 HTTP Range 206 拖进度条,不受 20MB mediaLimit 限制)([#126](https://github.com/omdsh-dev/DSH-better-sidebar/pull/126))
|
|
67
75
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
-
|
|
71
|
-
-
|
|
76
|
+
**🐛 修复**
|
|
77
|
+
|
|
78
|
+
- 🔧 **xterm 依赖迁移**:弃用的 xterm 迁移至 `@xterm/xterm`(Closes [#122](https://github.com/omdsh-dev/DSH-better-sidebar/issues/122),[#128](https://github.com/omdsh-dev/DSH-better-sidebar/pull/128))
|
|
79
|
+
- 📝 **Markdown 编辑器**:选区转对话弹窗恢复可用([#24](https://github.com/omdsh-dev/DSH-better-sidebar/pull/24))
|
|
80
|
+
- 🐛 **node-pty 加载失败不再拖垮 server**([#140](https://github.com/omdsh-dev/DSH-better-sidebar/issues/140)):宿主半改为懒加载 node-pty,缺失时插件照常挂载,终端以修复提示横幅(可复制命令 + 重试按钮)呈现,agent 终端工具自动跳过
|
|
81
|
+
- 🧪 测试工程:单元测试拆分(#141)+ smoke 偶发失败修复
|
|
72
82
|
|
|
73
83
|
## 🚀 安装
|
|
74
84
|
|
|
75
85
|
**前置**:已装好 DSH(`dsh web` 能正常运行),Node.js ≥ 20、pnpm ≥ 10。
|
|
76
86
|
|
|
77
87
|
```sh
|
|
78
|
-
dsh plugin --profile web add dsh-better-sidebar
|
|
88
|
+
dsh plugin --profile web add dsh-better-sidebar@latest
|
|
79
89
|
```
|
|
80
90
|
|
|
81
91
|
装完**硬刷新浏览器**(Cmd/Ctrl+Shift+R)即可看到侧边栏(DSH 对 client 改动热加载,无需重启;仅 host 半更新时需要重启)。
|
|
@@ -84,7 +94,7 @@ dsh plugin --profile web add dsh-better-sidebar
|
|
|
84
94
|
<summary><b>更新</b></summary>
|
|
85
95
|
|
|
86
96
|
```sh
|
|
87
|
-
dsh plugin --profile web add dsh-better-sidebar
|
|
97
|
+
dsh plugin --profile web add dsh-better-sidebar@latest
|
|
88
98
|
```
|
|
89
99
|
|
|
90
100
|
也可把 `~/.dsh/profiles/web/package.json` 里的版本号改高后 `pnpm install`。改完**硬刷新浏览器**(Cmd/Ctrl+Shift+R)即可(client 改动无需重启 DSH)。
|
|
@@ -99,10 +109,10 @@ dsh plugin --profile web add dsh-better-sidebar
|
|
|
99
109
|
| 报 `Ignored build scripts` | pnpm 11 拦截构建脚本。在 profile 目录(`~/.dsh/profiles/web`)跑 `pnpm approve-builds --all`。 |
|
|
100
110
|
| 报 `minimum release age` / 版本不足 24h | 装的版本发布不足 24 小时。等 24h 或重跑一次(pnpm 会自动补 `minimumReleaseAgeExclude`)。 |
|
|
101
111
|
| 报「找不到 profile 目录」 | 先跑一次 `dsh web`,让它初始化 `~/.dsh/profiles/web`。 |
|
|
102
|
-
| 页面出现**两个侧边栏** |
|
|
112
|
+
| 页面出现**两个侧边栏** | 双挂载。旧的手动挂载行:`~/.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` 之前。 |
|
|
103
113
|
| Windows 下终端无法使用 | `node-pty` 依赖预编译二进制;若当前 Node 版本没有对应产物,需装编译工具链(VS Build Tools)。主流 Node 版本一般已有预编译。 |
|
|
104
114
|
| 终端提示「node-pty 加载失败」 | `node-pty` 安装缺失/损坏(如 pnpm 拦截了构建脚本)。终端横幅会给出修复命令:复制到 DSH 所在环境的终端/cmd 执行(在 `~/.dsh/profiles/web` 下 `pnpm approve-builds --all && pnpm rebuild node-pty`),完成后重启 DSH 并点重试。插件与 DSH 核心使用同一 `node-pty@^1.1.0`,修复后两者同步恢复。 |
|
|
105
|
-
| 提示 `dsh: command not found` | 先安装 DSH;或直接用 `npx -y --package @deepseek-ai/dsh dsh plugin --profile web add dsh-better-sidebar`。 |
|
|
115
|
+
| 提示 `dsh: command not found` | 先安装 DSH;或直接用 `npx -y --package @deepseek-ai/dsh dsh plugin --profile web add dsh-better-sidebar@latest`。 |
|
|
106
116
|
|
|
107
117
|
</details>
|
|
108
118
|
|
|
@@ -115,15 +125,20 @@ dsh plugin --profile web add dsh-better-sidebar
|
|
|
115
125
|
1. git clone https://github.com/omdsh-dev/DSH-better-sidebar.git ~/Code/DSH-better-sidebar
|
|
116
126
|
cd ~/Code/DSH-better-sidebar && pnpm install && pnpm build
|
|
117
127
|
2. ~/.dsh/profiles/web/package.json 的 dependencies 写 "dsh-better-sidebar": "link:<克隆目录绝对路径>"
|
|
118
|
-
3. ~/.dsh/profiles/web/cordis.patch.yml
|
|
128
|
+
3. ~/.dsh/profiles/web/cordis.patch.yml 追加挂载行(需要指定终端 shell 时,在行内加 `config.shell`;`config.shellArgs` 可带参启动,非空时替换默认的 `-l`。不填则自动解析 `$SHELL` / 登录 shell / powershell.exe):
|
|
119
129
|
- insert:
|
|
120
130
|
- id: better-sidebar
|
|
121
131
|
name: 'dsh-better-sidebar'
|
|
132
|
+
config:
|
|
133
|
+
shell: /bin/zsh
|
|
134
|
+
shellArgs:
|
|
135
|
+
- --noprofile
|
|
136
|
+
- --no-rc
|
|
122
137
|
4. 在 ~/.dsh/profiles/web 执行 pnpm install
|
|
123
138
|
5. 硬刷新浏览器(Cmd/Ctrl+Shift+R)即可看到效果(client 改动无需重启 DSH;host 半改动才需重启)
|
|
124
139
|
```
|
|
125
140
|
|
|
126
|
-
更新:`git pull && pnpm install && pnpm build` → 硬刷新浏览器即可(client 改动热加载生效,无需重启 DSH;host 半改动才需重启)。切回 npm 通道时,把依赖改回 `"dsh-better-sidebar": "^0.
|
|
141
|
+
更新:`git pull && pnpm install && pnpm build` → 硬刷新浏览器即可(client 改动热加载生效,无需重启 DSH;host 半改动才需重启)。切回 npm 通道时,把依赖改回 `"dsh-better-sidebar": "^0.13.0"` 再 `pnpm install`。
|
|
127
142
|
|
|
128
143
|
</details>
|
|
129
144
|
|
|
@@ -184,7 +199,7 @@ v0.12.1 补齐基座能力(完整类型导出、能力探测、状态订阅、
|
|
|
184
199
|
## 🛠️ 开发与构建
|
|
185
200
|
|
|
186
201
|
```sh
|
|
187
|
-
pnpm install # @deepseek-ai/* 已发布到 npm(^0.1.0-rc.
|
|
202
|
+
pnpm install # @deepseek-ai/* 已发布到 npm(^0.1.0-rc.7),直接解析、无需令牌
|
|
188
203
|
pnpm typecheck # tsc --noEmit
|
|
189
204
|
pnpm build # → lib/index.js + lib/invariant.js + lib/client.js + lib/client-registry.js + lib/types
|
|
190
205
|
pnpm test # vitest(含 manifest 一致性守卫,需先 build)
|
package/README_EN.md
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
## ✨ Features
|
|
23
23
|
|
|
24
|
-
- **🗂️ File Workbench**: file explorer (lazy-loading tree; symlinks show their target kind — directory links expand, dangling links flagged) + CodeMirror editor; inline preview for images / Markdown / HTML / PDF / Office
|
|
24
|
+
- **🗂️ File Workbench**: file explorer (lazy-loading tree; symlinks show their target kind — directory links expand, dangling links flagged) + CodeMirror editor; inline preview for images / Markdown (incl. Mermaid diagrams, strict-mode safe rendering + click-to-zoom) / HTML / PDF / Office
|
|
25
25
|
- **🌐 Embedded Browser**: multiple web tabs with back / forward / refresh; content runs in a sandboxed iframe; external links are routed by protocol by default — HTTP opens in the sidebar, HTTPS goes to the system browser (both adjustable in settings)
|
|
26
26
|
- **💻 Real Terminal**: xterm.js + node-pty real shell, reconnect with transcript replay; optionally injects `terminal_*` tools for the model
|
|
27
27
|
- **🌿 Git Panel**: real diff + VSCode-style diff tabs, history, right-click to stage / commit / revert
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
- **🪟 Dual Workbench**: right sidebar + bottom panel; drag tabs to split / merge panes (cross-panel), mobile auto-merges into a full-width drawer
|
|
30
30
|
- **🔁 Session Isolation**: layout / tabs / panels persisted per session, stale state auto-purged
|
|
31
31
|
- **⚙️ Declarative Settings**: per-item toggles in the "Side Cards" settings section, secondary settings via the gear dialog
|
|
32
|
-
- **⚡ On-demand Loading**: only ~325KB core at startup; heavy deps (terminal / editor) load on demand ([design](docs/plans/2026-08-12-lazy-chunks-design.md))
|
|
32
|
+
- **⚡ On-demand Loading**: only ~325KB core at startup; heavy deps (terminal / editor / mermaid diagrams) load on demand ([design](docs/plans/2026-08-12-lazy-chunks-design.md))
|
|
33
33
|
- **🌏 i18n**: UI text follows DSH's language (zh / en) with live switching
|
|
34
34
|
|
|
35
35
|
> 🔌 **Core principle**: service-first — the 7 built-in tabs + 6 viewers register through the same `ctx.betterSidebar` API as third-party plugins, with fully equal capabilities; anything the ecosystem can provide better is delegated to ecosystem plugins. See the "🔌 Service" section below and the [external plugin guide](./docs/external-plugin-guide.md).
|
|
@@ -41,10 +41,51 @@
|
|
|
41
41
|
<a href="https://github.com/user-attachments/assets/d4385b7e-aab4-425d-a5c4-2da5da81a34e"><img width="45%" alt="Add Plugins screenshot" src="https://github.com/user-attachments/assets/d4385b7e-aab4-425d-a5c4-2da5da81a34e" /></a>
|
|
42
42
|
</div>
|
|
43
43
|
|
|
44
|
+
### v0.13.1
|
|
45
|
+
|
|
46
|
+
**✨ New features**
|
|
47
|
+
|
|
48
|
+
- 📊 **Safe Mermaid rendering in the Markdown preview** ([#164](https://github.com/omdsh-dev/DSH-better-sidebar/pull/164)): when a previewed md file contains mermaid fences, a `client-mermaid.js` chunk (~7MB) is served on demand (zero load without mermaid); defense-in-depth rendering — `securityLevel: 'strict'` + `htmlLabels: false` (node labels use real SVG `<text>`) + a second sanitize pass before SVG injection (foreignObject/script/foreign HTML elements removed, `@*`/`on*`/`href` attributes stripped); click a diagram to zoom in a modal overlay (wheel zoom centered on the cursor, drag pan, toolbar & shortcuts), re-renders with light/dark theme, falls back to the raw code block on parse failure
|
|
49
|
+
- 🖥️ **Configurable terminal shell & shellArgs** ([#125](https://github.com/omdsh-dev/DSH-better-sidebar/pull/125)): `cordis.patch.yml` `better-sidebar.config` can set `shell` / `shellArgs` (a non-empty `shellArgs` fully replaces the defaults; unset keeps the previous auto-resolution of `$SHELL` / login shell / `powershell.exe`), applied to both UI terminals and agent terminals (`terminal_create`); terminal tab titles now show the shell name (bash/zsh/powershell) and internal tab ids use UUIDs so the same shell can open multiple terminals
|
|
50
|
+
|
|
51
|
+
**🐛 Fixes**
|
|
52
|
+
|
|
53
|
+
- 🔗 **Aggregate double-mount auto-yield** ([#200](https://github.com/omdsh-dev/DSH-better-sidebar/pull/200)): when an aggregate package (e.g. dsh-web-ui-all) mounts the same package under its own entry id, the guard expression in `cordis.patch.yml` disables the plugin's own `better-sidebar` row so `/sidebar/api` is no longer registered twice (`duplicate prefix route` crashing the whole plugin tree / `dsh web`); standalone installs behave as before
|
|
54
|
+
- 🔧 **Peer dependencies aligned to DSH 0.1.0-rc.7** ([#207](https://github.com/omdsh-dev/DSH-better-sidebar/pull/207), fixes [#206](https://github.com/omdsh-dev/DSH-better-sidebar/issues/206)): all `@deepseek-ai/*` peer/devDependencies raised from `^0.1.0-rc.6` to `^0.1.0-rc.7`, and the CI mount lane pins the same version — eliminating the mixed rc.6/rc.7 dependency tree (after the main framework moved to rc.7) that surfaced as `agent-presets: refusing to compose an unscoped context` when picking a model / sending a message
|
|
55
|
+
|
|
56
|
+
### v0.13.0
|
|
57
|
+
|
|
58
|
+
**✨ New features**
|
|
59
|
+
|
|
60
|
+
- 📁 **Files window merged with the explorer** ([#151](https://github.com/omdsh-dev/DSH-better-sidebar/pull/151)): new `editorExplorer` setting (default on, editor card gear) — file tabs gain a path-input header plus a toggleable right-docked file tree (per-tab open/width memory, drag-resize 160–480px from the left edge, global filename search via the host `fs.search` route with a hard budget, skipping `.git` and symlink dirs); in merged mode tree clicks / Enter in the path input switch the current tab **in place**, separate mode opens by path; fresh sessions seed an empty Files window instead of the explorer tab, and a path-less window is a chrome'd empty file window in merged mode / a bare file manager in separate mode; the tree context menu offers "Open in new tab" and "Open to the side" (split)
|
|
61
|
+
- 🎛️ **Select rows for declarative settings** ([#151](https://github.com/omdsh-dev/DSH-better-sidebar/pull/151)): settings rows gain `type: 'select'` (`options` with value/title/desc/icon, `multi` stores the picked values as an array); options with icons render big-icon option cards and keep the icon in the closed anchor; `editorExplorer` became an iconed select (merged vs separate); the capability list gained `settingSelect`
|
|
62
|
+
- 🔀 **Mutual exclusion with the dsh-web-ui family right panel** ([#181](https://github.com/omdsh-dev/DSH-better-sidebar/pull/181)): reads the `aionui-panel` settings namespace's provider choice — when "Use aionui-panel" is selected, the whole better-sidebar (right sidebar / bottom panel / floating entry / all takeovers) does not mount; with DSH-better-sidebar (or no aionui installed) it behaves as before. Takes effect live after a settings save (settings-document push), no reload needed
|
|
63
|
+
|
|
64
|
+
**📝 Other**
|
|
65
|
+
|
|
66
|
+
- Install / update commands unified to `dsh-better-sidebar@latest` (bilingual README sync)
|
|
67
|
+
|
|
44
68
|
### v0.12.3
|
|
45
69
|
|
|
70
|
+
**✨ New features**
|
|
71
|
+
|
|
72
|
+
- 🎨 **Skin compatibility (token-driven)**: fully consumes DSH design tokens and follows the dsh-web-ui skin center's 10 skins automatically; terminal/editor surfaces fall back to opaque backgrounds under transparent/translucent-glass token values so text never scrolls over the skin art ([#110](https://github.com/omdsh-dev/DSH-better-sidebar/pull/110), fixes #106 #105 #90 #60, also #52 #57 #92)
|
|
73
|
+
- 🗂️ **Unified path handling**: UNC / symlink classification (directory symlinks expandable, broken links highlighted) + HTML-route platform guards ([#134](https://github.com/omdsh-dev/DSH-better-sidebar/pull/134), #65 #67 #43 #79 #115)
|
|
74
|
+
- 🖥️ **Configurable terminal shell**: custom shell setting with Windows pwsh auto-probe ([#95](https://github.com/omdsh-dev/DSH-better-sidebar/pull/95))
|
|
75
|
+
- 📝 **Editor languages**: C# / Kotlin / Swift syntax highlighting ([#120](https://github.com/omdsh-dev/DSH-better-sidebar/pull/120))
|
|
76
|
+
- 🧭 **Settings nav icon**: settings-page navigation icon and layout polish ([#114](https://github.com/omdsh-dev/DSH-better-sidebar/pull/114))
|
|
77
|
+
- ➕ **Recommended-plugin catalog**: added `dsh-git-remotes` — Git Remotes tab (branches/upstream/ahead-behind, fetch with prune, ff-only pull, confirm-before-push; does not replace the built-in stage/commit tab) ([#91](https://github.com/omdsh-dev/DSH-better-sidebar/pull/91)); and `dsh-video-preview` — inline video preview (.mp4/.webm/.mov/.mkv/.avi etc.) backed by a /video host route with HTTP Range (206) scrubbing, not capped by the 20MB mediaLimit ([#126](https://github.com/omdsh-dev/DSH-better-sidebar/pull/126))
|
|
78
|
+
|
|
79
|
+
**🐛 Fixes**
|
|
80
|
+
|
|
81
|
+
- 🔧 **xterm migration**: deprecated xterm dependency migrated to `@xterm/xterm` (Closes [#122](https://github.com/omdsh-dev/DSH-better-sidebar/issues/122), [#128](https://github.com/omdsh-dev/DSH-better-sidebar/pull/128))
|
|
82
|
+
- 📝 **Markdown editor**: selection-to-conversation popup restored ([#24](https://github.com/omdsh-dev/DSH-better-sidebar/pull/24))
|
|
46
83
|
- 🐛 **node-pty load failure no longer crashes the server** ([#140](https://github.com/omdsh-dev/DSH-better-sidebar/issues/140)): the host half now lazy-loads node-pty — when it is missing the plugin still mounts, the terminal shows a repair banner (copyable command + Retry button), and agent terminal tools are skipped
|
|
47
|
-
-
|
|
84
|
+
- 🧪 Test engineering: unit spec split (#141) + flaky smoke cleanup fix
|
|
85
|
+
|
|
86
|
+
**🚀 Engineering**
|
|
87
|
+
|
|
88
|
+
- npm publishing wired to GitHub Releases (Trusted Publishing, provenance-attached tarballs); tagging a release publishes automatically ([#148](https://github.com/omdsh-dev/DSH-better-sidebar/pull/148))
|
|
48
89
|
|
|
49
90
|
### v0.12.2
|
|
50
91
|
|
|
@@ -75,7 +116,7 @@
|
|
|
75
116
|
**Prerequisites**: DSH installed (`dsh web` boots), Node.js ≥ 20, pnpm ≥ 10.
|
|
76
117
|
|
|
77
118
|
```sh
|
|
78
|
-
dsh plugin --profile web add dsh-better-sidebar
|
|
119
|
+
dsh plugin --profile web add dsh-better-sidebar@latest
|
|
79
120
|
```
|
|
80
121
|
|
|
81
122
|
Then **hard-refresh the browser** (Cmd/Ctrl+Shift+R) to see the sidebar (DSH hot-reloads client changes; only host-half updates need a restart).
|
|
@@ -84,10 +125,10 @@ Then **hard-refresh the browser** (Cmd/Ctrl+Shift+R) to see the sidebar (DSH hot
|
|
|
84
125
|
<summary><b>Updating</b></summary>
|
|
85
126
|
|
|
86
127
|
```sh
|
|
87
|
-
dsh plugin --profile web add dsh-better-sidebar
|
|
128
|
+
dsh plugin --profile web add dsh-better-sidebar@latest
|
|
88
129
|
```
|
|
89
130
|
|
|
90
|
-
or bump the version in `~/.dsh/profiles/web/package.json` (e.g. `"^0.
|
|
131
|
+
or bump the version in `~/.dsh/profiles/web/package.json` (e.g. `"^0.13.0"`) and run `pnpm install`. Then hard-refresh the browser (Cmd/Ctrl+Shift+R) — client changes do not need a DSH restart.
|
|
91
132
|
|
|
92
133
|
</details>
|
|
93
134
|
|
|
@@ -99,10 +140,10 @@ or bump the version in `~/.dsh/profiles/web/package.json` (e.g. `"^0.12.3"`) and
|
|
|
99
140
|
| `Ignored build scripts` | pnpm 11 blocked build scripts. Run `pnpm approve-builds --all` in the profile directory (`~/.dsh/profiles/web`). |
|
|
100
141
|
| `minimum release age` / version `< 24h` | The release is younger than 24 hours. Wait, or re-run once (pnpm auto-adds `minimumReleaseAgeExclude`). |
|
|
101
142
|
| "profile directory not found" | Run `dsh web` once so it initializes `~/.dsh/profiles/web`. |
|
|
102
|
-
| Two sidebars on the page | Double-mount: `~/.dsh/profiles/web/cordis.patch.yml` still has
|
|
143
|
+
| Two sidebars on the page | Double-mount. Old hand-written line: `~/.dsh/profiles/web/cordis.patch.yml` still has `- insert: ... better-sidebar ...` — delete it (a same-id duplicate mount makes the loader fail loudly with `duplicate loader entry id`). When an aggregate bundle (e.g. `@linxin666/dsh-web-ui-all`) mounts this package under a **different** id, the plugin's own bundle patch backs off automatically since 0.13.x (it detects an already-enabled mount of the same package name and does not mount itself) — no manual fix needed; if it still double-mounts, make sure the aggregate bundle precedes `dsh-better-sidebar` in `dsh.profile.bundles`. |
|
|
103
144
|
| Terminal fails on Windows | `node-pty` relies on prebuilt binaries; if none match your Node version, install a build toolchain (VS Build Tools). Mainstream Node versions are usually covered. |
|
|
104
145
|
| Terminal shows "node-pty failed to load" | The `node-pty` install is missing or broken (e.g. pnpm skipped its build script). The terminal banner shows a repair command — copy it into a terminal/cmd on the DSH machine and run it (in `~/.dsh/profiles/web`: `pnpm approve-builds --all && pnpm rebuild node-pty`), then restart DSH and click Retry. The plugin and DSH core share the same `node-pty@^1.1.0`, so the repair restores both. |
|
|
105
|
-
| `dsh: command not found` | Install DSH first, or run `npx -y --package @deepseek-ai/dsh dsh plugin --profile web add dsh-better-sidebar`. |
|
|
146
|
+
| `dsh: command not found` | Install DSH first, or run `npx -y --package @deepseek-ai/dsh dsh plugin --profile web add dsh-better-sidebar@latest`. |
|
|
106
147
|
|
|
107
148
|
</details>
|
|
108
149
|
|
|
@@ -115,15 +156,20 @@ To debug local changes or track the dev branch, point the dependency at a local
|
|
|
115
156
|
1. git clone https://github.com/omdsh-dev/DSH-better-sidebar.git ~/Code/DSH-better-sidebar
|
|
116
157
|
cd ~/Code/DSH-better-sidebar && pnpm install && pnpm build
|
|
117
158
|
2. In ~/.dsh/profiles/web/package.json dependencies write "dsh-better-sidebar": "link:<absolute path of the clone>"
|
|
118
|
-
3. Append this mount line to ~/.dsh/profiles/web/cordis.patch.yml:
|
|
159
|
+
3. Append this mount line to ~/.dsh/profiles/web/cordis.patch.yml (to pick the terminal shell, add `config.shell`; `config.shellArgs` starts it with explicit args — when non-empty they replace the default `-l`. When omitted the host resolves `$SHELL` / the login shell / powershell.exe):
|
|
119
160
|
- insert:
|
|
120
161
|
- id: better-sidebar
|
|
121
162
|
name: 'dsh-better-sidebar'
|
|
163
|
+
config:
|
|
164
|
+
shell: /bin/zsh
|
|
165
|
+
shellArgs:
|
|
166
|
+
- --noprofile
|
|
167
|
+
- --no-rc
|
|
122
168
|
4. Run pnpm install in ~/.dsh/profiles/web
|
|
123
169
|
5. Restart DSH and hard-refresh
|
|
124
170
|
```
|
|
125
171
|
|
|
126
|
-
Update: `git pull && pnpm install && pnpm build` → just hard-refresh the browser (client changes hot-reload; only host-half changes need a DSH restart). To switch back to the npm channel, restore `"dsh-better-sidebar": "^0.
|
|
172
|
+
Update: `git pull && pnpm install && pnpm build` → just hard-refresh the browser (client changes hot-reload; only host-half changes need a DSH restart). To switch back to the npm channel, restore `"dsh-better-sidebar": "^0.13.0"` and re-run `pnpm install`.
|
|
127
173
|
|
|
128
174
|
</details>
|
|
129
175
|
|
|
@@ -184,7 +230,7 @@ The dashed cards at the end of the "Sidebar content" / "File viewers" grids in t
|
|
|
184
230
|
## 🛠️ Development & Build
|
|
185
231
|
|
|
186
232
|
```sh
|
|
187
|
-
pnpm install # @deepseek-ai/* resolved from npm (^0.1.0-rc.
|
|
233
|
+
pnpm install # @deepseek-ai/* resolved from npm (^0.1.0-rc.7, published) — no token needed
|
|
188
234
|
pnpm typecheck # tsc --noEmit
|
|
189
235
|
pnpm build # → lib/index.js + lib/invariant.js + lib/client.js + lib/client-registry.js + lib/types
|
|
190
236
|
pnpm test # vitest (includes manifest consistency guard; build first)
|
package/cordis.patch.yml
CHANGED
|
@@ -14,6 +14,36 @@
|
|
|
14
14
|
# If the profile still carries the old manual mount line in its own
|
|
15
15
|
# cordis.patch.yml, remove it before switching to the bundle channel to
|
|
16
16
|
# avoid double-mounting (two Node halves, two sidebars).
|
|
17
|
+
#
|
|
18
|
+
# To choose the terminal shell, add `config.shell` to the inserted plugin
|
|
19
|
+
# row (or to the profile's manual cordis.patch.yml mount line). When omitted,
|
|
20
|
+
# the host keeps resolving $SHELL / the login shell / powershell.exe.
|
|
21
|
+
# `config.shellArgs` optionally supplies explicit startup arguments; when
|
|
22
|
+
# non-empty they replace the automatic POSIX `-l` login flag:
|
|
23
|
+
#
|
|
24
|
+
# - insert:
|
|
25
|
+
# - id: better-sidebar
|
|
26
|
+
# name: 'dsh-better-sidebar'
|
|
27
|
+
# config:
|
|
28
|
+
# shell: /bin/zsh
|
|
29
|
+
# shellArgs:
|
|
30
|
+
# - --noprofile
|
|
31
|
+
# - --no-rc
|
|
32
|
+
#
|
|
33
|
+
# Aggregate double-mount guard: aggregate bundles (e.g. @linxin666/dsh-web-ui-all)
|
|
34
|
+
# may already mount this package under their own entry id (e.g.
|
|
35
|
+
# `web-ui-better-sidebar`). Two mounts register /sidebar/api twice and fail the
|
|
36
|
+
# whole plugin tree at boot ("duplicate prefix route"). The `!!js` disabled
|
|
37
|
+
# expression backs THIS row off when another *enabled* entry already mounts
|
|
38
|
+
# `dsh-better-sidebar`; the aggregate instance then owns the sidebar. The
|
|
39
|
+
# loader evaluates it when this row is processed (entry-list order, only rows
|
|
40
|
+
# before this one are visible), so the aggregate bundle must precede this one
|
|
41
|
+
# in `dsh.profile.bundles` — the standard install order, since `dsh plugin add`
|
|
42
|
+
# appends new bundles last. The reverse order (this bundle before the
|
|
43
|
+
# aggregate) is a known limitation: the guard cannot see rows that come after
|
|
44
|
+
# it, and no runtime singleton guard is added. Same-id manual duplicates still
|
|
45
|
+
# fail loudly at the loader as before.
|
|
17
46
|
- insert:
|
|
18
47
|
- id: better-sidebar
|
|
19
48
|
name: 'dsh-better-sidebar'
|
|
49
|
+
disabled: !!js "[...ctx.loader.entries()].some((e) => e.options.name === 'dsh-better-sidebar' && e.options.id !== 'better-sidebar' && !e.disabled)"
|