可扩展侧边栏工作台 omdsh-dev/DSH-better-sidebar
DeepSeek Harnessv0.28.2低风险DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
71.1/100
综合分
4,761
GitHub 星标
99,313
npm 周下载
—/5
用户评分
数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-better-sidebarnpm 源 · dsh-better-sidebar 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · browser
安全吗
已做风险分级,标记为低
还在维护吗
活跃:最近一次提交在 4 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 实测通过要求 Node:>=20(dsh 本身要求 Node ≥ 22.19)展开查看检查明细 ↓
>=20(dsh 本身要求 Node ≥ 22.19)已由本站人工实机安装并跑通,结论可信度最高。
✓npm 包dsh-better-sidebar @ 0.28.2
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/3 05:21:00
安全扫描自动 · 静态分析源码
v2.7.0🔵 扫描:含敏感能力人工评估:低风险
静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
自动扫描比人工评估更严格:扫描在源码里找到了可复现的能力项,而人工评估未标注。 两者覆盖范围不同(人工按需抽查,扫描按范围全覆盖),可看下方证据自行判断。
查看扫描证据(共 62 处,展示前 58 条)
- 读取本地文件src/active-worktree.ts:183
if (!(await stat(cwd)).isDirectory()) return undefined - 读取本地文件src/agent-opens.ts:169
info = await stat(target) - 删除本地文件src/archive-route.ts:228
if (task.file !== undefined) void rm(task.file.path, { force: true }).catch(() => {}) - 删除本地文件src/archive-route.ts:298
if (task?.file !== undefined) void rm(task.file.path, { force: true }).catch(() => {}) - 删除本地文件src/archive-route.ts:314
if (task.file !== undefined) void rm(task.file.path, { force: true }).catch(() => {}) - 删除本地文件src/archive-route.ts:348
await rm(tempPath, { force: true }).catch(() => {}) - 读取本地文件src/archive-route.ts:351
const info = await stat(tempPath).catch(() => undefined) - 读取本地文件src/archive-route.ts:363
task.bytes = await stat(tempPath).then(info => info.size).catch(() => 0) - 删除本地文件src/archive-route.ts:365
await rm(tempPath, { force: true }).catch(() => {}) - 读取本地文件src/bundle-route.ts:55
const info = await stat(path) - 读取本地文件src/bundle-route.ts:60
const etag = `"${shortHash(await readFile(path))}"` - 读取本地文件src/bundle-route.ts:123
const body = await readFile(join(chunkDir, `client-${name}.js`)) - 发起网络请求src/client/api.ts:255
response = await fetch(hostRouteUrl(`sidebar/api/${method}`).href, { - 发起网络请求src/client/api.ts:308
response = await fetch(hostRouteUrl(`sidebar/upload?${params.toString()}`).href, { - 发起网络请求src/client/api.ts:348
response = await fetch(hostRouteUrl(`sidebar/write?${params.toString()}`).href, { - 发起网络请求src/client/open-in-app.ts:135
const response = await fetch(APPS_PATH) - 发起网络请求src/client/open-in-app.ts:185
const response = await fetch(OPEN_PATH, { - 读取本地文件src/file-stream.ts:51
const stream = createReadStream(path) - 写入本地文件src/fs-operations.ts:88
await mkdir(dirname(safeTarget), { recursive: true }) - 写入本地文件src/fs-operations.ts:89
const stream = createWriteStream(tmp, { flags: 'wx' }) - 写入本地文件src/fs-operations.ts:107
await rename(tmp, safeTarget) - 读取本地文件src/fs-operations.ts:108
const info = await stat(safeTarget) - 删除本地文件src/fs-operations.ts:117
await rm(tmp, { force: true }).catch(() => {}) - 读取本地文件src/fs-operations.ts:169
const current = await stat(absolute).then(info => info.mtimeMs).catch(() => undefined) - 写入本地文件src/fs-operations.ts:190
await mkdir(dirname(absolute), { recursive: true }) - 写入本地文件src/fs-operations.ts:191
await writeFile(tmp, encodeText(restoreEol(content, eol), encoding), { flag: 'wx' }) - 写入本地文件src/fs-operations.ts:192
await rename(tmp, absolute) - 删除本地文件src/fs-operations.ts:194
await rm(tmp, { force: true }).catch(() => {}) - 读取本地文件src/fs-operations.ts:199
const mtimeMs = await stat(absolute).then(info => info.mtimeMs).catch(() => undefined) - 读取本地文件src/fs-operations.ts:268
lstat(target, { bigint: true }), - 读取本地文件src/fs-operations.ts:269
lstat(root, { bigint: true }), - 读取本地文件src/fs-operations.ts:282
await access(target) - 删除本地文件递归src/fs-operations.ts:487
if (info.isDirectory()) await rm(absolute, { recursive: true }) - 删除本地文件src/fs-operations.ts:488
else await unlink(absolute) - 读取本地文件src/fs-search.ts:115
const info = await stat(absolute).catch(() => undefined) - 读取本地文件src/fs-search.ts:197
const level = await opendir(dir).catch(() => undefined) - 读取本地文件src/fs-search.ts:304
const info = await stat(target).catch(() => undefined) - 读取本地文件src/fs-tree.ts:169
dirents = await readdir(path, { withFileTypes: true }) - 读取本地文件src/fs-tree.ts:308
const info = await runProbe(gate, () => stat(row.path)).catch(() => undefined) - 读取本地文件src/fs-tree.ts:366
level = await opendir(dir) - 执行外部命令固定命令src/git-graph.ts:43
execFile('git', ['-C', cwd, '--no-pager', '--no-replace-objects', '-c', 'color.ui=false', ...args], { - 读取本地文件src/git-graph.ts:119
const bytes = await readFile(resolve(root, shallowPath)) - 执行外部命令固定命令src/git.ts:429
const child = spawn('git', full, { - 读取本地文件src/git.ts:726
const entries = await readdir(dir, { withFileTypes: true }).catch(() => []) - 读取本地文件src/git.ts:744
const resolved = await realpath(dir).catch(() => dir) - 读取本地文件src/git.ts:780
const names = await readdir(gitDir) - 读取本地文件src/git.ts:782
|| (names.includes('rebase-apply') && (await readdir(join(gitDir, 'rebase-apply')).catch((): string[] => [])).includes('rebasing'))) { - 读取本地文件src/index.ts:275
if (await stat(sessionPath).then(() => true).catch(() => false)) return sessionPath - 读取本地文件src/index.ts:468
return await stat(path).catch((error: unknown) => { - 读取本地文件src/index.ts:504
const info = await stat(path).catch((error: unknown) => { - 读取本地文件src/index.ts:590
const info = await stat(path).catch((error: unknown) => { - 读取本地文件src/index.ts:1318
text = await readFile(join(home, name), 'utf8') - 读取本地文件src/open-external.ts:65
return /microsoft|wsl/i.test(readFileSync('/proc/version', 'utf8')) - 执行外部命令固定命令src/open-external.ts:74
const translated = execFileSync('/usr/bin/wslpath', [mode, value], { encoding: 'utf8' }).trim() - 写入本地文件src/search-debug.ts:34
appendFileSync(LOG_FILE, `[${new Date().toISOString()}] ${msg}\n`) - 执行外部命令来自配置/变量src/search-engines.ts:190
child = spawn(binary, ['--version'], { stdio: 'ignore' }) - 读取本地文件src/session-path.ts:41
mtimeMs = statSync(metaFile).mtimeMs - 读取本地文件src/session-path.ts:51
const parsed: unknown = JSON.parse(readFileSync(metaFile, 'utf8'))
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
⚠ 该插件运行需访问外部网络 / 远程 API,部署在国内无外网环境时可能无法正常使用。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/cordis-plugin-group@deepseek-ai/cordis-plugin-include@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-loop@deepseek-ai/dsh-attachment@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-store@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-settings给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
界面预览
3 张 · 点击查看大图功能亮点
- 注册原生侧边栏页面
- 三方拓展注册页面
- 内置文件编辑终端
开放侧边栏底座,支持三方拓展注册新侧边栏页面。内置文件渲染编辑、终端、侧边对话、Git、子代理页面
最近更新
在 GitHub 查看全部 →v0.28.22026-10-27
· 安装
要求 DSH 0.2.1-rc.1 或更新的兼容 0.2.x 版本。
dsh plugin --profile web add dsh-better-sidebar@0.28.2
将 web 换成你实际使用的配置档名。安装或更新后,按 Cmd/Ctrl + Shift + R 硬刷新浏览器。
| DSH 版本 | 插件版本 |
| --- | --- |
| 0.2.1-rc.1+(兼容 0.2.x) | 0.28.2 |
| 0.2.1-alpha.5 | 0.28.0-alpha.0 |
| 0.2.0-rc.2 | 0.26.1 |
| 0.2.0-rc.1 | 0.24.1 |
| 0.1.7-rc.1 至 0.1.7 | 0.22.1 |
---
· 中文|相比 v0.28.1
· 🛡 大会话冷读修复(OOM 根因)
0.28.1 的同键单飞只覆盖 /sidebar/api,而启动期真正的并发扇出不走那条路:fs-watch 每个被监视目录一帧(服务端在判断 op 之前就解析 cwd)、/sidebar/file 与 /sidebar/html 每个资源一次、upload / write 每次调用一次。这些入口各自调 sessionCwdOf(),而它此前对 detached 会话调 sessionQuery.observeSession(..., { projectionMode: 'all' }) —— 为拿一个 workingDirectory 要解码整份日志并水合全部投影。39 MB 级会话因此仍被并发整读数十次:0.28.0 的 44 次 OOM 与 0.28.1 的 36 次是同一条路径,不是「去重失效」。
现在 detached 会话的 cwd 改读存储 header 里的工作区地址:sessionPersistence.stat() 只读第一个 zstd 帧(header-only,绝不解码日志),并按会话 id 做进程内缓存(header 不可变)与在飞去重;activeWorktreeRootOf() 对 detached 会话直接返回该地址,不再折持久化日志。已 attach 的会话行为不变,仍跟随 working_directory 与 linked worktree。
· 代价:会话 attach 之前,侧边栏根是原始项目目录而非智能体最后所在的子目录 / worktree;attach 后下一次 5 s 轮询自动切回。
· 实测(40,157,518 字节会话,本机重建):12 个 session.cwd + 36 个绕过入口调用并发 → 1 次 header 读、0 次整读、3 ms、RSS +0.3 MB;同产物用修复前代码跑 6 个绕过入口 → 6 次整读、峰值 +1002 MB(外推 36 次 ≈ 6.0 GB,与事故 6.2 GB 峰值吻合)。单次整读成本 467 ms / +501.6 MB。
· 🧪 测试与门禁
· tests/smoke.spec.ts 重写该组 8 例:header 优先于陈旧提示、header 每会话只读一次、12 并发共享一次 header 读、无 stat / stat 失败回落客户端提示、live committed 目录优先、相对 cwd 仍拒绝为 bad-request、defaultDirectory 与进程 cwd 兜底。
· tests/active-worktree.spec.ts 新增 1 例,钉住「detached 会话不做持久化读、不 spawn git」。
· 机制、取舍与完整证据:设计记录。
---
· English|Changes since v0.28.1
· 🛡 大会话冷读修复(OOM 根因)
0.28.1 的同键单飞只覆盖 /sidebar/api,但启动期扇出从不走它:fs-watch socket 每个被监视目录发一帧(服务端还没读 op 就解析 cwd),/sidebar/file 与 /sidebar/html 每个资源解析一次 cwd,upload / write 每次调用解析一次。这些路径都调 sessionCwdOf(),它对 detached 会话跑 sessionQuery.observeSession(..., { projectionMode: 'all' }) —— 为回答一个 workingDirectory 字符串要解码整份日志并水合全部投影。39 MB 会话因此仍被并行整读几十次:0.28.0 的 44 次读 OOM 与 0.28.1 的 36 次读是同一条路径,不是去重坏了。
detached 会话的 cwd 现在取自 header 里存的工
v0.28.12026-10-26内容较长已截断
· 安装 / Installation
要求 DSH 0.2.1-rc.1 或更新的兼容 0.2.x 版本。 / Requires DSH 0.2.1-rc.1 or a newer compatible 0.2.x release.
dsh plugin --profile web add dsh-better-sidebar@0.28.1
将 web 换成你实际使用的 profile 名。安装或更新后,按 Cmd/Ctrl + Shift + R 硬刷新浏览器。
Replace web with your profile name. After installing or updating, hard-refresh the browser with Cmd/Ctrl + Shift + R.
| DSH 版本 / DSH version | 插件版本 / Plugin version |
| --- | --- |
| 0.2.1-rc.1+(兼容 0.2.x / compatible 0.2.x) | 0.28.1 |
| 0.2.1-alpha.5 | 0.28.0-alpha.0 |
| 0.2.0-rc.2 | 0.26.1 |
| 0.2.0-rc.1 | 0.24.1 |
| 0.1.7-rc.1 至 / through 0.1.7 | 0.22.1 |
---
· 中文|相比 v0.28.0
· 🛡 OOM 修复(P0)
全量重启后会话全部转为 detached,12 条 /sidebar/* 路由共享的 cwd 解析会对同一会话各做一次宿主冷观察(整份日志读 + 解码)。39 MB 级会话 × 44 个并发请求 ≈ 1.7 GB → 进程 OOM。现在 cwdOf() 对「同一会话 + 同一客户端 cwd 提示」的并发请求做 single-flight:并发同键 = 1 次真实读 + N 个 await 同结果;不引入 TTL(宿主本身按持久化 revision 缓存完成后的冷读)。回归测试:tests/smoke.spec.ts 12 并发 → 1 次冷读、不同提示不合并;无修复时实测 12 次读。
· 🛡 稳定性与数据安全
· 病态 git 输出不再打崩宿主:runGit 字节封顶后闩锁、销毁 stdio 并终止进程树,stderr 纳入同一预算;最坏结果从 RangeError 崩溃降为一次 SCM 刷新失败。
· 改名/删除不再写回旧文件:页签调解覆盖后台会话,worktree 会话统一地址基准;聊天链接不再静默打开另一检出的同名文件。
· 关闭侧聊页签时归档会话:工作区不再残留整份父会话副本。
· 💬 侧边对话
· 本地图片与交付卡在转录里就地渲染;模型切换重写 system prompt 后,种子按最后一次 summarizing compaction 切尾,不再把压缩前历史整段带进新线程。(贡献者 PR #1035 / #1044 @NolanHo)
· 🌿 Git 页
· >1000 分支的仓库恢复加载提交历史。
· tag 显示:lightweight 与 annotated tag 装饰提交行与详情,独立 5,000 条 / 8 MiB 预算、不计入分支上限;tag 变化使旧分页失效。
· 📝 编辑器与输入框
· 仅 mtime 变化后保存不再死锁:保存基线跟随 mtime;「Reload from disk」在文本未变时就地更新基线并保留草稿。
· 刷新/重新落座后保留阅读位置。
· 「添加到对话」改为紧凑引用 chip,@ 插入不再展平已有 chip。
· 🔗 文件链接
· Markdown 本地链接的 Windows 反斜杠归一,C:\ws\_analysis\report.md 不再报裸 ENOENT。
· 🪟 侧栏与桌面壳
· 右栏展开时底部工作台入口常显。
· macOS 桌面壳兜底入口避开标题栏红绿灯。
· 页签 scope 按内容稳定,消除无关重渲染导致的整文件重读。
· 浮窗缩放手柄不再被 tab 内容压住。
· 📦 其他
· 导出 dsh-better-sidebar/icon 子路径。
---
· English|Changes since v0.28.0
· 🛡 OOM fix (P0)
After a full restart every session is detached, and the cwd resolution shared by all twelve /sidebar/* routes ran one host observation per call (a full log read plu
v0.28.02026-10-17
· 安装 / Installation
要求 DSH 0.2.1-rc.1 或更新的兼容 0.2.x 版本。 / Requires DSH 0.2.1-rc.1 or a newer compatible 0.2.x release.
dsh plugin --profile web add dsh-better-sidebar@0.28.0
将 web 换成你实际使用的 profile 名。安装或更新后,按 Cmd/Ctrl + Shift + R 硬刷新浏览器。
Replace web with your profile name. After installing or updating, hard-refresh the browser with Cmd/Ctrl + Shift + R.
升级前请确认宿主版本 / Check your DSH version before upgrading
本插件 latest 已是 0.28.0,但 DSH 自身的 latest 目前仍是 0.2.0-rc.2,二者不兼容。请先升级 DSH 到所需版本;仍用旧宿主的用户按下表固定插件版本,不要直接装插件 latest。
The plugin's latest is now 0.28.0, but DSH's own latest currently remains 0.2.0-rc.2 and is not compatible. Upgrade DSH first, or pin the matching plugin version below instead of installing plugin latest.
| DSH 版本 / DSH version | 插件版本 / Plugin version |
| --- | --- |
| 0.2.1-rc.1+(兼容 0.2.x / compatible 0.2.x) | 0.28.0 |
| 0.2.1-alpha.5 | 0.28.0-alpha.0 |
| 0.2.0-rc.2 | 0.26.1 |
| 0.2.0-rc.1 | 0.24.1 |
| 0.1.7-rc.1 至 / through 0.1.7 | 0.22.1 |
---
· 中文|相比上一正式版 v0.26.1
以下以上一正式插件版本 v0.26.1为基准。v0.27.0 未单独发布,其功能与后续新增功能、修复一并包含在本版。
· 🌿 Git 工作台与只读提交图
· Git 页面采用更清晰的 Source Control 布局:冲突、已暂存、未暂存文件分组展示,支持折叠、提交消息草稿和消息生成。
· 新增只读提交图,可查看分支与合并关系、筛选分支,并查看提交详情和差异;浏览提交图不会切换分支或拉取远端。
· 提交图填满侧栏可用高度,长历史在图内滚动;分支、同步状态和操作保留在底栏,打开差异预览或调整窗口时布局会跟随变化。
· 🧭 可选 Context 诊断快捷入口
安装并启用 dsh-context 的 Context 侧栏后,可从会话标题栏、代理详情、后台任务输出窗直达对应会话的上下文视图。跨会话跳转会定位正确目标并复用已有标签;未安装或不可用时不显示入口。
· 📂 更准确的文件记录与仓库发现
· 「本轮文件」补齐 PTC 模式下的文件操作,修正路径识别,并将操作按时间倒序平铺,便于回看代理刚做了什么。
· 同一文件的已暂存与未暂存行数分别显示,不再重复相加。
· 工作区根目录本身是 Git 仓库时,仍可发现内部的独立仓库;Git 所有权警告不再导致整个页面不可用。
· 💬 更轻量的侧边对话
新侧边对话从父会话最近一次压缩摘要继承上下文,减少重复复制长历史。
· 🛠️ 体验修复
修复 Git 选中文件行错位和异常边框;「本轮文件」在没有新操作时减少重复请求。
· 🔄 DSH 版本支持
适配 DSH 0.2.1-rc.1 版本。
---
· English|Changes since the previous stable release, v0.26.1
The comparison below is against v0.26.1, the previous stable plugin release. It includes the features prepared for v0.27.0, which was not released separately, plus subsequent improvements and fixes.
· 🌿 Git workbench and read-only commit graph
· A cl
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成dsh-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
🌏 中文 · English
✨ 特色功能
| 🗂️ 文件管理懒加载目录树、Git 变更着色、实时 watch 刷新、全局搜索、拖拽上传、多选批量操作、「打开方式」双源菜单。 | 🌿 GitSource Control(Merge / Staged / Changes 三组、带 Generate 的消息框、分支与同步底栏)+ 本轮 AI 改动视角合一,并在同一页签内给出只读提交图(泳道、分支与 tag 徽章、分支筛选、提交详情)。 |
| 📝 可编辑编辑器与预览可编辑的 CodeMirror(官方预览是只读)、Markdown + Mermaid + 浮动目录、HTML 沙箱预览、.jsonl 记录卡片、超大文件分页预览、传输无大小上限。 | 🧩 任务管理子代理拓扑实时预览(工作流图 / 树双模式)+ 后台任务清单:退出码、实时输出、强制终止。 |
| 💬 侧边对话(beta)Codex 风格侧边线程:继承主会话完整上下文独立运行、实时推送、排队可见可撤回、每个线程独立选模型、一键提升为顶层会话。 | 🖥️ 底部工作台自绘底部面板与原生右侧栏同时展开:拖拽分栏、多终端页签、按会话持久化布局。
展开完整文档(README 剩余 1 节)
dsh-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
🌏 中文 · English
✨ 特色功能
| 🗂️ 文件管理懒加载目录树、Git 变更着色、实时 watch 刷新、全局搜索、拖拽上传、多选批量操作、「打开方式」双源菜单。 | 🌿 GitSource Control(Merge / Staged / Changes 三组、带 Generate 的消息框、分支与同步底栏)+ 本轮 AI 改动视角合一,并在同一页签内给出只读提交图(泳道、分支与 tag 徽章、分支筛选、提交详情)。 |
| 📝 可编辑编辑器与预览可编辑的 CodeMirror(官方预览是只读)、Markdown + Mermaid + 浮动目录、HTML 沙箱预览、.jsonl 记录卡片、超大文件分页预览、传输无大小上限。 | 🧩 任务管理子代理拓扑实时预览(工作流图 / 树双模式)+ 后台任务清单:退出码、实时输出、强制终止。 |
| 💬 侧边对话(beta)Codex 风格侧边线程:继承主会话完整上下文独立运行、实时推送、排队可见可撤回、每个线程独立选模型、一键提升为顶层会话。 | 🖥️ 底部工作台自绘底部面板与原生右侧栏同时展开:拖拽分栏、多终端页签、按会话持久化布局。 |
还有:📂 sidebar_open 工具让模型主动打开侧边栏 · ⚡ 启动只拉 ~325KB 核心、重依赖按需加载 · 🌏 多语言跟随 DSH · 📱 窄屏自动切换全宽抽屉
🌿 Git Graph(只读提交图)
在 Git 面板顶部切到 Git Graph:本地分支、远程跟踪分支与 HEAD 的提交节点、分叉与合并连线。分支下拉框只筛选历史,不会 checkout 或 fetch;提交行是单行(泳道连线 + 引用徽章 + 标题),hover 看作者与短 hash,选中后在底部面板看完整提交信息与 diff。历史按页加载,分页期间 refs 变化会提示刷新;读取有上限(每页 200 条、偏移 10,000、分支 1,000),超限明确报错。图中提交支持 lightweight 与 annotated tag,提交行与详情通过中性 tag pill 标识,tag 变化会使旧分页失效。Tag 装饰按引用名保留前 5,000 条,并受 8 MiB 输出的完整行前缀限制;多余 tag 省略,不影响整张图加载。
🧭 dsh-context 诊断入口(可选)
装上 dsh-context 插件后,三处各有一个直达该会话 Context(上下文) 视图的入口:任务管理页的代理节点详情卡、后台任务输出窗(按任务的真实属主会话寻址,而不是它被挂在哪个会话名下)、以及会话标题栏。入口只在 dsh-context 的 Context 页面确实注册时才出现——没装、没启用或该页面被隐藏的部署不会显示任何控件;一次跳转进行中时,三个入口一并禁用。跳转失败只报一条可关闭的提示(浮在窗口底部),空闲时不新增任何轮询。
🚀 安装
dsh plugin --profile web add dsh-better-sidebar@latest
装完硬刷新浏览器(Cmd/Ctrl+Shift+R)即可。要求 DSH 0.2.1-rc.1+。
兼容性警告:插件版本必须与宿主线匹配。 截至 2026-10-26,DSH 的 npm latest 是 0.2.1-rc.2,上方命令安装的 v0.28.2 与之兼容。仍停留在 0.2.0-rc.2 的宿主必须固定 dsh-better-sidebar@0.26.1(并建议先升级宿主到 0.2.1-rc.2);DSH 0.2.1-alpha.5 用户固定 dsh-better-sidebar@0.28.0-alpha.0。市场安装器按插件的 latest 安装、不按宿主版本选版本,旧宿主会收到版本拒绝错误——请升级宿主或显式固定版本。两个包的 latest 标签不是同一支持线。
按 DSH 版本选插件版本
| 你的 DSH 版本 | 安装命令 |
| 0.2.1-rc.1+ | dsh plugin --profile web add dsh-better-sidebar@0.28.2 |
| 0.2.1-alpha.5 | dsh plugin --profile web add dsh-better-sidebar@0.28.0-alpha.0 |
| 0.2.0-rc.2 | dsh plugin --profile web add dsh-better-sidebar@0.26.1 |
| 0.2.0-rc.1 | dsh plugin --profile web add dsh-better-sidebar@0.24.1 |
| 0.1.7-rc.1 ~ 0.1.7 正式版 | dsh plugin --profile web add dsh-better-sidebar@0.22.1 |
| 0.1.7-alpha.x | 没有可装版本——先升级 DSH 到 rc.1 |
| 0.1.6 及更早(含 0.1.5 线) | dsh plugin --profile web add dsh-better-sidebar@0.19.1 |
旧版本一律写精确版本号(latest 会随新正式版前移)。命令里的 web 换成你自己的 profile 名即可。
其他安装方式
让 DSH 自己装——把这段提示词发给任意一个 DSH 会话:
帮我安装 dsh-better-sidebar 插件(DSH 侧边栏工作台),步骤:
1. 先确认 DSH 为 0.2.1-rc.1 或更新版本,再执行 dsh plugin --profile web add dsh-better-sidebar@0.28.2
2. 完成后提醒我硬刷新浏览器(Cmd/Ctrl+Shift+R)遇到报错先查 https://github.com/omdsh-dev/DSH-better-sidebar README 的常见问题表。
一键脚本——克隆本仓库后执行 bash scripts/install.sh 0.28.2(macOS / Linux / Windows Git Bash;Windows 原生用 ./scripts/install.ps1 -Version 0.28.2),自动完成安装 + bundle 注册。
更新:重跑一次安装命令即可,然后硬刷新浏览器。
常见问题
| 现象 | 原因与解决 |
| 报 Ignored build scripts | pnpm 11 拦截了某个传递依赖的构建脚本。在 profile 目录(~/.dsh/profiles/web)跑 pnpm approve-builds 按提示放行——本插件自身已无构建脚本依赖。 |
| 报 minimum release age / 版本不足 24h | 装的版本发布不足 24 小时。等 24h 或重跑一次(pnpm 会自动补 minimumReleaseAgeExclude)。 |
| 报「找不到 profile 目录」 | 先跑一次 dsh web,让它初始化 ~/.dsh/profiles/web。 |
| 页面出现两个侧边栏 | 双挂载。删掉 ~/.dsh/profiles/web/cordis.patch.yml 里旧的手动挂载行(- insert: ... better-sidebar ...);聚合包以不同 id 挂载本包时会自动退让,无需处理。 |
| 升级后设置页的值去哪了 | DSH 0.1.7 起偏好写在 profile 里本插件的挂载行上(默认 entry id better-sidebar),插件首次启动会把旧 settings.yaml 里的配置一次性回迁,不会覆盖新设的值。 |
| 终端无法使用 | 终端由 DSH 自身提供(本插件不自带 PTY),请查 DSH 侧文档;底部终端显示「宿主未提供终端能力」= 这个部署没挂终端控制器。 |
| 提示 dsh: command not found | 先安装 DSH;或用 npx -y --package @deepseek-ai/dsh@0.2.1-rc.1 dsh plugin --profile web add dsh-better-sidebar@0.28.2。 |
🆕 最近更新
v0.28.2 — 大会话冷读修复
- 根因修复:detached 会话的 cwd 不再解码整份会话日志——改读存储在 header 里的工作区地址(只读第一个 zstd 帧,header-only),按会话做进程内缓存与在飞去重;activeWorktreeRootOf 对 detached 会话不再折持久化日志
- 为什么 0.28.1 没修好:单飞只覆盖 /sidebar/api,而启动期真正并发的是 fs-watch 每个监视目录一帧、/sidebar/file|html 每资源一次——39 MB 级会话仍被并发整读数十次
- 行为:会话 attach 后仍跟随 working_directory 与 linked worktree;attach 之前侧边栏根是原始项目目录,下一次 5 s 轮询自动切回
- 实测(40.2 MB 会话,本机):12 路由 + 36 个绕过入口并发 → 1 次 header 读、0 次整读、3 ms、RSS +0.3 MB;修复前 6 个入口并发即 6 次整读、峰值 +1.0 GB(外推 36 次 ≈ 6 GB)
v0.28.1 — UX 与可靠性补丁
- OOM 修复:12 条 /sidebar/ 路由共享的冷 cwd 读取按「会话 + 客户端提示」合并,切换会话的并发突发不再并行解码同一份大会话日志
- 不再静默写错文件:页签调解覆盖后台会话,worktree 会话统一地址基准——改名/删除的已打开文件不会被下一次保存重建,聊天链接也不会静默打开另一检出的同名文件
- 宿主崩溃防护:病态 git status 输出加了闩锁与进程树终止,「宿主 RangeError 崩溃」降为一次 SCM 刷新失败
- Git 页:>1000 分支的历史恢复加载;tag 现在装饰提交行与详情,tag 变化会使旧分页失效
- 编辑器:仅 mtime 变化后保存不再死锁 fs-conflict;刷新后保留阅读位置;「添加到对话」落地为紧凑引用 chip,不再展平已有 chip
- Markdown 链接:本地 destination 的 Windows 反斜杠归一,C:\ws\_analysis\report.md 不再报裸 ENOENT
- 侧栏:右栏展开时底部工作台入口常显;macOS 兜底入口避开红绿灯;页签 scope 按内容稳定,消除无谓的整文件重读;关闭侧聊页签时归档其会话
v0.28.0 — 面向 DSH 0.2.1-rc.1+ 的插件正式版
- 13 条 DSH peer 下限前移到 ^0.2.1-rc.1,沿用 alpha.0 的功能实现,不增加运行时改动
- 上游 alpha.5 → rc.1 完整树差异共 355 个文件,全部为 package.json,源码零变化
- DSH 0.2.0-rc.2 宿主固定插件 v0.26.1;DSH 0.2.1-alpha.5 宿主固定 v0.28.0-alpha.0
- 验证:RC 适配记录
🔌 插件生态
ctx.betterSidebar 向所有插件开放 registerTab / registerFileViewer 两个扩展点,内置 6 tab + 4 viewer 与第三方插件走同一套 API。GitHub topic dsh-better-sidebar 下已有 30+ 生态插件;完整接入文档见 docs/external-plugin-guide.md。
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} />,
}))
}
生态插件目录(28 个 Tab 插件 · 4 个预览插件 · 4 个增强工具)
📑 Tab 插件(注册侧边栏页面)
| 插件 | ⭐ | 简介 |
| ChenRuoT/dsh-sidebar-qa | | 划选追问侧边页:类 Codex 侧边提问 / Claude Code /btw |
| fuhefei/dsh-sentinel | | 条件驱动唤醒系统:文件 / 命令 / HTTP / 进程 / Webhook 监视,到点唤醒 agent;dock + 侧栏分支 + 全局仪表盘 |
| Fisfzy/ego-browser | | Agent 浏览器:i18n 感知的本机浏览器 Tab(装了 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 搜索结果引用卡片:搜索词、来源摘要、关键词高亮 |
| Lukeknow0/dsh-markdown-link-preview | | Markdown 产物链接预览:点击聊天中的同源 .md 输出文件,直接在侧边栏阅读 |
| mlosun/dsh-docs-panel | | 全局文档面板:随身 Markdown 笔记,任何工作区随时可读 |
| tylina/dsh-tylina | | Typst 文档编辑工具:WYSIWYG 编辑排版论文、报告、试卷、简历、图表、海报、乐谱和 PPTX 导出的 Slides |
| lnyuqian/dsh-skill-sidebar | | 技能面板:扫描本机技能目录,4-6 字功能短语 + 一键复制调用 + 置顶 |
| g-yixuan/dsh-sidenote | | Codex 风格侧边对话 + 划选引用注释(轻量消费插件) |
| OMSociety/dsh-ssh-tunnel | | 多主机 SSH 隧道 + SSH 管理器页 |
| OMSociety/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 配置——一键启动、历史保存、WebSocket 实时日志、多实例并行 |
| baosfeng/my-dsh-plugins | | 个人多插件合集(dsh-file-activity):侧边栏文件活动页——文件读取 / 新增 / 修改历史与统计 |
| Hoemr/dsh-better-overleaf | | Overleaf 标签页:直连 CDP 浏览器登录、项目切换、本地 git 镜像与双向同步 |
| Andor-Z/dsh-turn-outline | | 轮次轨迹页:按用户轮次折叠会话,点击任意步骤跳回对话原位;零 LLM、只读 |
🖼️ 预览插件(注册文件预览器)
| 插件 | ⭐ | 简介 |
| HuanLinOTO/dsh-plugin-better-sidebar-plugin-office | | Office 三件套预览(.docx / .xlsx / .pptx),独立 bundle 瘦身主体 |
| HuanLinOTO/dsh-plugin-better-sidebar-plugin-audio | | 音频预览:可缩放波形播放器 + 实时频谱,HTTP Range 流式媒体路由,任意大小可拖进度 |
| zemul/dsh-video-preview | | 视频内联预览:.mp4 / .webm / .mov / .mkv / .avi,HTTP Range 拖进度条 |
| dong-victor/dsh-better-sidebar-jupyter | | .ipynb 可运行 Notebook 视图:懒启动 Python kernel、流式输出、保存回写 |
🧰 增强与工具
| 插件 | ⭐ | 简介 |
| eg-bole/dsh-better-sidebar-icons | | VSCode 风格文件 / 文件夹图标主题(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 / 文本 |
📣 上架你的插件:给仓库打上 dsh-better-sidebar topic 即出现在 topic 页;再向 src/client/plugins-tabs.ts / plugins-viewers.ts 提一条 PluginEntry PR,即可进入设置页内置推荐目录。
⌨️ 快捷键
| 操作 | 按键 |
| 保存编辑 | Ctrl/Cmd + S |
| 文件内查找 / 替换 | Ctrl/Cmd + F |
| 查找下一个 / 上一个 | Ctrl/Cmd + G / Shift + Ctrl/Cmd + G |
| 选中下一个相同片段 | Ctrl/Cmd + D |
| Git 提交 | Ctrl + Enter |
| 关闭 Tab | 鼠标中键 |
| 拆分/合并分栏 | 拖 Tab 到分栏边缘 / 中间 |
| 引用文件到输入框 | 悬浮行尾 @文件 按钮 |
🔐 安全与 ⚠️ 已知限制
- 路由受 Host 头信任围栏保护(与 /api 一致);fs.write 原子写入;git 只调 CLI、绝不设置身份
- ⚠️ v0.23.0 起文件系统路由不做工作区包含检查:能读写宿主用户可访问的任意路径(只受 OS 权限约束)——调用方不能再把这些路由当作被围栏保护的接口
- HTML 预览在不透明源沙箱 iframe 中渲染;设置页可按功能关闭沙箱(默认关闭,带警告文案)
- Git 无 push/pull/fetch;文件树只对已展开的目录做 watch;Markdown 预览渲染的是已保存文件
- 只读预览的格式(表格 / PDF / 图片 / Office)由 DSH 内置文档预览渲染,实现随宿主版本走;浏览器视图只在 desktop profile 存在
- 未保存草稿在关闭标签页 / 删除文件 / 刷新页面前都会先确认;磁盘被外部改动后再保存会被拒绝,不会静默覆盖
- 移动端(<768px)无底部面板,其标签页并入右侧栏全宽抽屉
🛠️ 开发与构建
pnpm install # @deepseek-ai/ devDependencies 已发布,直接解析
pnpm typecheck && pnpm lint && pnpm build && pnpm test
make check # 聚合校验门禁(对齐 CI)
make mount # 真机挂载冒烟:build + pack → pnpm test:mount
架构:单 npm 包、host/client 双半结构——host(src/index.ts):/sidebar/api/ JSON API、媒体 / HTML 预览 / 上传路由与两条 WebSocket;client(src/client/index.tsx):原生右侧栏 tab + 底部工作台;状态按会话持久化 localStorage。仓库工作规范见 AGENTS.md。
Windows / Linux / macOS 三平台适配(macOS 日常验证,其余经单元测试与 Windows CI 覆盖);无原生依赖,构建只需 Node ≥ 20 + pnpm ≥ 10。
💬 社区
推荐添加 QQ 群(577011007)
🤝 参与贡献
- 代码改动走 PR:feat/ / fix/* 分支开发 → gh pr create;提交前跑 pnpm typecheck && pnpm build && pnpm test(或 make check)
- 收录生态插件:给仓库打 dsh-better-sidebar topic + 向 src/client/plugins-tabs.ts / plugins-viewers.ts 提 PR
- 仓库工作规范见 AGENTS.md
👥 贡献者
🔗 友情链接
- dsh-tianshu-tui:DeepSeek Harness 交互式终端 UI 插件,增加 TDD 与证据门等工作流
- dsh-TUI:Claude Code 风格全屏交互终端插件——像素鲸鱼顶栏、思考流式展开、上下文进度条 + TPS 仪表
- dshfind 插件超市:三方插件市场——GitHub topic dsh-plugin 下的公开仓库清单,每日同步
- DeepSeek Harness Desktop Tauri:Tauri 桌面版——5MB 安装包、零环境配置、预置插件开箱即用
- DeepSeek Harness Desktop:现代化桌面端——无需配置 Node.js 即可启动和管理本地 Harness 服务;官网
MIT License · Built for the DeepSeek Harness ecosystem · 在 topic dsh-better-sidebar 发现更多生态插件预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 266,913已汉化DSH
71.8
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,928已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
跨平台内容发现whiteguo233/OpenBiliClaw
本地私有、开源、能自我进化、跨平台的 AI 内容发现智能体:先理解你,再主动去 B站、小红书、抖音、YouTube、X、知乎、Reddit、微博等平台和开放 Web 上找内容。(支持 deepseek harness 插件)
★ 3,639已汉化DSH
70.3