dsh-sidebar-sections
把 DSH 侧栏工作区列表分为「活跃 / 会话任务 / 不活跃」三段,支持手动钉住与活跃阈值,保留官方搜索、归档筛选、行菜单与拖拽,并可一键切回官方列表。「会话任务」段固定用 Windows 路径 D:\files\history-tasks,其他平台需自行预建该目录。
安装
dsh plugin --profile web add dsh-sidebar-sections
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-sidebar-sections
Unofficial community plugin. This package is not published by, reviewed by
or endorsed by DeepSeek. It reuses the MIT-licensed official
@deepseek-ai/dsh-client-ui-workspace 0.2.1-rc.3 browser bundle and
patch-builds its own copy of it. Where this documentation says "official", it
refers to that upstream DeepSeek code (the shipped sidebar browser / its
shipped view), never to this plugin.
Fork of the shipped DSH sidebar workspace browser. The official
@deepseek-ai/dsh-client-ui-workspace 0.2.1-rc.3 client bundle is vendored
byte-for-byte, and an ordered patch pipeline derives lib/client.js that adds a
three-section layout on top of it:
Active -> Session tasks -> Inactive, with the official search, archive
filters, row menus, hover buttons/cards, workspace management, drag & drop,
watermark rows, status dots and shortcuts kept intact because they are still the
official code.
Status (0.2.8, tested on DSH Desktop 0.2.1-rc.3, Windows). The sectioned
sidebar renders in the running app (活跃 header + count over the official
project rows), the official child-slot registrations stay live (session menu
rows, row hover actions, directory flow, hero picker, toast factory), and the
native render path was exercised in the running app. Pointer interaction
(opening menus, dragging, threshold buttons) is the remaining human
walk-through; see [docs/official-parity.md](docs/official-parity.md).
Compatibility
- DSH:
>=0.2.1-rc.3 <0.3.0(declared asdsh.engines.dsh). The browser half
is generated from the 0.2.1-rc.3 official bundle; a newer DSH release needs the
baseline re-extracted and the patch anchors re-checked
([docs/upgrade-checklist.md](docs/upgrade-checklist.md)).
- The fixed middle segment is a real workspace at the Windows path
D:\files\history-tasks (title 会话任务). The plugin is therefore
Windows-oriented today: on another platform that literal path is not a normal
directory. Everything else is platform-neutral.
- While enabled, this bundle disables the shipped
ui-workspaceloader row and
runs the official browser code itself; disabling or uninstalling the bundle
restores the shipped row unchanged. The official package files are never
modified.
Why the plugin replaces the shipped plugin row
The official browser owns sidebar.workspaces **and declares that region's child
slots** (session "..." menu rows, row hover actions, directory flow, row
leading/hover cells). The slot ledger allows only one registration to declare a
given child slot, and the renderer only authorises a registration to render the
children it declared itself. A second, lower-priority occupant therefore cannot
reuse those slots - it would have to redraw the menus and dialogs, which is
exactly what this rewrite is meant to avoid.
So this bundle is a replacement: its cordis.patch.yml disables the shipped
ui-workspace loader row while the bundle is enabled, and the bundle runs the
official client code itself with the section patches. The official package in
app.asar is never modified. Disabling or uninstalling the bundle removes its
patch layer and the shipped row returns unchanged.
"Switch back to the official list" is a rendering mode of the same patched
component tree (sections.mode === "native" -> the official derivation and
render path), not a second registration; the full-screen list looks and behaves
exactly like the shipped one, keeps the official view state, and survives a page
refresh.
Layout
~~~
dsh-sidebar-sections/
- package.json plugin manifest (dsh.bundle.patch + dsh.client)
- cordis.patch.yml disables the shipped ui-workspace row, inserts this bundle's row
- icon.svg / locale/*.json plugin manifest icon + strings
- lib/index.js host half: mkdir -p D:/files/history-tasks
- lib/client.js GENERATED by scripts/build-client.mjs (never hand-edit)
- vendor/ byte copy of the official 0.2.1-rc.3 client.js
- patches/manifest.json baseline sha256/bytes + ordered patch list
- patches/01..04,06-*.mjs pure apply(source) -> source patch modules (05 retired)
- scripts/build-client.mjs verify -> apply -> node --check -> write lib/client.js
- scripts/smoke-load.mjs materialise the bundle against the frozen seed table
- scripts/derive-selftest.mjs unit tests for the section derivation rules
- scripts/install.ps1 dry-run/install/uninstall runbook (no profile writes by default)
- docs/ parity, upgrade checklist, patch reference
~~~
Build and test
Requirements: Node.js 24 (this machine: C:\Program Files\nodejs\node.exe).
Run from the plugin directory (or pass the absolute path).
~~~powershell
Full build: verifies the vendored baseline sha256, applies all patches in order,
runs node --check, then writes lib/client.js.
node scripts/build-client.mjs
Apply + node --check only; lib/client.js is not written.
node scripts/build-client.mjs --check-only
Verification suite.
node scripts/smoke-load.mjs # frozen platform module table / bundle shape
node scripts/derive-selftest.mjs # SPEC 2.1 derivation rules (22 assertions)
~~~
The build:
1. reads patches/manifest.json;
2. verifies the vendored baseline bytes and SHA256 (first 16 hex chars must be
BAFD2D6EEA2F8267); on mismatch it fails and prints the re-extract commands;
3. imports each patch module in manifest order and calls apply(source);
every patch asserts its anchors and throws if an anchor is not unique;
4. writes the result to a temporary file and runs node --check;
5. writes lib/client.js (unless --check-only) and prints per-patch byte
deltas, final bytes and the output SHA256.
lib/client.js is a generated artifact - never hand-edit it. Every change
lands in vendor/ (baseline refresh) or patches/*.mjs.
Install / enable / disable / uninstall
Installing is a profile operati
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:3,最后更新 2026-10-27