# Alternatives research — can a mature plugin replace `dsh-split-screen`? **Date:** 2026-10-19 · **Author:** internal alternatives review · **Target environment:** DSH desktop app `@deepseek-ai/dsh-desktop 0.2.1-rc.2` / Electron 44.7.0 (user's live app), global CLI `dsh` 0.2.0-rc.2, Windows 11, workspace ``. **Related:** the plugin under evaluation is `dsh-split-screen` v1.5.1 (local) / npm 1.2.6; source `github.com/YEYEYEYESHIFU/dsh-split-screen`. This report is **read-only research**: no installs, no profile changes, no plugin source edits were made. --- ## TL;DR — verdict 1. **There is no mature, drop-in replacement.** No candidate matches `dsh-split-screen`'s feature set *and* is proven on the user's exact host build (0.2.1-rc.2). The catalog's suggested candidate, **`dsh-split-panes`, is not a replacement**: it is not on npm, has had no commits since 2026-09-11, and two open GitHub issues (2026-09-30) document that it **crashes on DSH 0.2.0-rc.2** with `renderFactorySlot is not a function`; the vendor gap makes the same failure almost certain on 0.2.1-rc.2 (not separately reproduced here — no install allowed). 2. **The one architectural change worth making is iframe isolation.** All of the user's symptoms (freezes, React update storms, OOM) come from re-hosting the native React chat UI *inside the host React tree* — the approach used by both `dsh-split-screen` and `dsh-split-panes`. Two actively maintained candidates side-step that class of bug by putting each pane in an **iframe running a full stock DSH client**: **`dsh-split-view`** (npm 0.2.7, published **today** 2026-10-19) and **`@ai-eks/dsh-docking-layout`** (npm 0.2.0-rc.2, explicitly targets DSH `^0.2.1-rc.2`, repo active 2026-10-17). 3. **Recommendation:** treat replacement as a **two-step, evidence-gated decision**, not a switch: - **Step 1 (recommended, ~1 day):** spike **`dsh-split-view`** in a *scratch profile*, not the user's live profile, on the desktop build. If panes open, stream, and answer questions/approvals, adopt it as the base plugin. Step 2 would then be re-adding our differentiating features as separate small plugins (TUI composer, agent-team header) — view tabs, native composer, questions/approvals and layout persistence come for free from the iframe client. - **Step 2 fallback:** if the split-view spike fails, spike `@ai-eks/dsh-docking-layout` (same iframe technique, more mature feature/QA surface but rated ❌ by the local catalog — contradiction must be resolved by the spike). - **If both fail:** keep `dsh-split-screen` but **harden + cap** (limit panes, remove the single-React-tree session multiplexing) and/or fall back to the multi-process wall (`dsh-multi-chat` / N× `dsh web --port`) for the "watch several agents" use case. 4. Mature layout libraries (dockview, flexlayout-react, rc-dock, …) only de-risk the *layout* layer; they do **not** re-host DSH's chat UI. Swapping our layout library would not fix the bugs we actually have. --- ## 1. Method and evidence base | Evidence source | What was used | Date | |---|---|---| | GitHub REST API | repo metadata, releases, issues, commits for every candidate | 2026-10-19 | | npm registry (`npm view`, registry.npmjs.org, downloads API) | package existence, versions, publish dates, peer deps, download counts | 2026-10-19 | | Local catalog `` | `PLUGINS.md`, `PLUGINS-ALL.md`, `catalog/all/*.md`, `catalog/policy.json`, `data/plugins-all.json` (13,365 plugins, generated 2026-10-08), `data/plugins-enrich.json`, `data/enrich-cache.json`, `data/repo-map.json`, `data/snapshot-baseline.json`, `CHANGELOG.md` | snapshot 2026-10-08; read 2026-10-19 | | Live DSH Host inspection (`cordis_inspect_query`, read-only) | full Host **Service** catalog of the running app | 2026-10-19 | | DSH app bundle (`\resources\app.asar\dsh\package.json`, read via read tool) | official package inventory + version | 2026-10-19 | | Team Lead message | desktop app = `@deepseek-ai/dsh-desktop 0.2.1-rc.2` (Electron 44.7.0, upgraded 2026-10-17/18); global CLI `dsh` = 0.2.0-rc.2 | 2026-10-19 | **Compatibility baseline (important):** the user's app is **0.2.1-rc.2**, the global CLI is **0.2.0-rc.2**. Any candidate claiming only 0.1.x is stale by two core generations; any candidate with a peer gate must also pass the gate under whichever `dsh` binary performs the install. This distinction changes one verdict below (`dsh-split-panes`). --- ## 2. Decision matrix | # | Candidate | Type / technique | Source | Maturity evidence (2026-10-19) | DSH compat claim | Parity vs dsh-split-screen | Risk | Verdict | |---|---|---|---|---|---|---|---|---| | 1 | **dsh-split-view** | **iframe per pane** (each pane = full stock DSH client pinned to a session; root slot shadowed by split container; LRU hibernation) | [github.com/luckybilly/dsh-split-view](https://github.com/luckybilly/dsh-split-view) · [npm](https://www.npmjs.com/package/dsh-split-view) | npm **0.2.7 published 2026-10-19** (today), 8 versions; repo pushed 2026-10-19; 2★/2 forks/1 open issue; MIT; 78 dl/wk, 380 dl/mo; 31-test suite claimed; maintainer fixed issue #1 within 15 days | README: **dsh 0.1.0-rc.6 → 0.2.x**, one build for both; peer `^0.1.0-rc.6 \|\| ^0.2.0-rc.2`; 0.2.0 adaptation verified on 0.2.0-rc.2 (issue #1 fix, 0.2.6); 0.2.7 shipped after user's desktop upgrade. **Not verified on 0.2.1-rc.2 or desktop profile** | Multi-pane ✓ nested, split buttons/hotkeys ✓, resizable ✓, per-pane native composer ✓, questions/approvals ✓ (full client), per-pane view tabs ✓ (full client), rename/copy id ✓, layout rehydrate ✓ (prefs rehydrate in 0.2.7); **max 4 live panes** then hibernated; no TUI composer; no agent-team header; sidebar drag-assign unverified | Low-medium: tiny community; desktop profile unproven; iframe boot cost; 4-live-pane cap; prerelease peer ranges | **Adopt as base (spike first)** | | 2 | **@ai-eks/dsh-docking-layout** | **iframe pool + tabs/groups** (editor-style groups; active tab + 2 most-recent inactive per group mounted; same-origin iframes) | [github.com/ai-eks/dsh-docking-layout](https://github.com/ai-eks/dsh-docking-layout) · [npm](https://www.npmjs.com/package/@ai-eks/dsh-docking-layout) | npm 0.2.0-rc.2 published 2026-10-08; 6 versions mapped to core releases; repo pushed **2026-10-17**; 6★/0 open issues; MIT; 286 dl/wk, **1,650 dl/mo**; README has explicit perf/limitations section | README: **requires DSH `^0.2.1-rc.2`** and Cordis `^4.0.5` (exact user build); version ladder for 0.2.0/0.1.7/0.1.2 | Tabs+groups ✓, drag split ✓, split buttons ✓, per-pane native client ✓, questions/approvals ✓, full client per tab ✓, closing tab doesn't delete session ✓, shared right sidebar, optional bottom panel; responsive single column ≤760 px; no TUI composer; no agent-team header | **Conflict:** local catalog rates it ❌ 运行级不兼容 (snapshot 2026-10-08) while upstream claims 0.2.1-rc.2 support (published same day). Unresolved by desk research → **must spike** | **Adopt as base (fallback spike)** | | 3 | **dsh-split-panes** (catalog lead) | **in-process native re-hosting** — byte-vendored core slot renderer + synthetic pane-scoped `SlotRendererHost`; no core patch | [github.com/lehhair/dsh-split-panes](https://github.com/lehhair/dsh-split-panes) (the advertised `dsh-external/…` URL **redirects** here; same canonical id 1328343470) | **Not on npm** (both `dsh-split-panes` and `@dsh-external/dsh-split-panes` return E404); 9★/1 fork/3 open issues; 8 releases v0.2.0→**v0.6.5 (2026-09-11)**; last commit = v0.6.5; BSD-3; asset download_count 8; vendored renderer pinned to core **0.1.5-alpha.2** | Claims 0.1.5-alpha.2 baseline, 0.1.5-rc.2 & 0.1.2-rc.1 usable. **Documented crash on 0.2.0-rc.2** in open issues [#7](https://github.com/lehhair/dsh-split-panes/issues/7) and [#8](https://github.com/lehhair/dsh-split-panes/issues/8) (2026-09-30): `renderFactorySlot is not a function`, conversation area blank; #8 contains the full fix recipe but no upstream commit | Multi-pane nested ✓, drag 4-way split ✓, sidebar drag ✓, per-pane native composer/questions/approvals ✓, pane fullscreen ✓, focus-follows-pane ✓; no TUI composer; no agent-team header; **no layout persistence** (module-singleton store); view-tab routing per pane unverified | **High: currently broken on the user's core**, unmaintained for 5 weeks, no npm, pin-to-old-core design means every core bump can break it | **Reference architecture only — do NOT adopt** | | 4 | **dsh-multi-chat** | **multi-process wall** — N separate `dsh web --port N` instances embedded as iframes in a grid (additive slots only) | [github.com/daetz-coder/dsh-multi-chat](https://github.com/daetz-coder/dsh-multi-chat) · [npm](https://www.npmjs.com/package/dsh-multi-chat) | npm 1.0.8 published 2026-10-01; MIT; 284 dl/wk; local catalog ✅ 可用, 5★; documents DSH 0.2 launch-token/401 flow explicitly; desktop profile documented | DSH 0.2 handled (launch tokens); no explicit 0.2.1 claim; pre-dates 0.2.1-rc.2 release by ~2 weeks | Grid of full clients ✓, column layouts, per-window controls, persisted layout ✓, phone gateway; **not** same-process multi-session panes; **no drag-to-split**, no per-pane session assignment beyond port | Medium: needs N processes (N× RAM/CPU/connections) and orchestration CLI; but **process isolation = best crash containment** | **Complementary / pragmatic fallback** | | 5 | `dsh-split-screen` (ours) | in-process native re-hosting (single React tree, multiplexed session stores) | [github.com/YEYEYEYESHIFU/dsh-split-screen](https://github.com/YEYEYEYESHIFU/dsh-split-screen) · npm `dsh-split-screen` | npm 1.2.6 published 2026-09-17 (only 1.0.0, 1.2.6 on npm; local repo 1.5.1); catalog **未测**, 1★; not in curated PLUGINS.md | Requires DSH 0.1.5+ per catalog description; no 0.2.x verification in catalog | Baseline: multi-pane, drag split, per-pane composer + questions/approvals, **per-pane view tabs**, **TUI compact composer (Alt+T)**, agent-team header, keyboard focus, persistence | **High — this is the bug we are evaluating** (freezes, update storms, OOM) | **Keep + harden only as stopgap** | | 6 | `dsh-session-tabs` | browser-style session tabs (no pane) | [github.com/licat2023/dsh-session-tabs](https://github.com/licat2023/dsh-session-tabs) | 0★, catalog ✅ 可用, `PLUGINS.md` 待测; pure client, zero network/persistence | Unknown | Complementary only (one conversation visible) | Low | **Complementary** | | 7 | `luckybilly/dsh-split-view` alternatives in catalog (`syncended/deepseek-harness-split-screen` ✅ 0★, `niushuanan/dsh-multi-window` 待定 0★, `WilliamShi666/dsh-multiple-chat-panels` 待定 13★, `Neumannzc/dsh-native-session-split` 待定 0★) | mostly same/derived techniques, no npm or no maintenance evidence found | see §5 | catalog ratings only; not investigated further (no release/npm signal) | unknown | partial | unknown | **Not shortlisted** | | 8 | Layout libraries (dockview, react-mosaic-component, flexlayout-react, rc-dock, allotment, react-resizable-panels, golden-layout) | layout only | §7 | all current except golden-layout (2022); all MIT/Apache-2.0 | n/a | n/a | n/a | **Foundation only** — does not fix re-hosting | | 9 | Official DSH | no official panes/multi-window/split (verified live Host Service catalog); Agent Teams is the official multi-session UX; `dsh plugin` + plugin market are the official install path | §6 | current (0.2.1-rc.2) | exact | no panes at all | — | **Complementary / no replacement** | --- ## 3. `dsh-split-panes` deep dive (the catalog's suggested replacement) ### 3.1 Does it exist? Yes — but under a different owner, and not as a package - `https://api.github.com/repos/dsh-external/dsh-split-panes` **redirects** to repository id `1328343470`, full name **`lehhair/dsh-split-panes`** (the GitHub API follows the transfer). The local catalog's `data/repo-map.json` already records the same canonical id with alias `dsh-external/dsh-split-panes`. - Repo facts (GitHub API, 2026-10-19): created 2026-08-09, **pushed_at 2026-09-11T00:58:28Z**, 9 stars, 1 fork, 3 open issues, BSD-3-Clause, TypeScript, topic `dsh-plugin`, not archived, no description. - **Releases:** 8 tags, `v0.2.0` (2026-09-08) → **`v0.6.5` (2026-09-11T00:58:28Z)**. The release asset is `dsh-external-dsh-split-panes.tgz` (97 KB) with `download_count: 8`; the v0.6.5 body says "development and release baseline is core `0.1.5-alpha.2`; `0.1.5-rc.2` tested, no changes needed; `0.1.2-rc.1` usable". - **npm: does not exist.** `npm view dsh-split-panes` → `E404`, `npm view @dsh-external/dsh-split-panes` → `E404` (verified 2026-10-19). Installation is therefore manual: `git clone` + `dsh plugin --profile web add link:/path`, or download the release `.tgz`. ### 3.2 Architecture — the best in-process design, and still the wrong bet for us The README is unusually honest and technically strong: core DSH has no "render any session id" extension point, but it *does* expose `SlotRendererHost` as a public contract, so the plugin **vendors `createSlotRenderer` byte-for-byte** (`src/client/vendor/renderer/{bind.ts,bindings.tsx,scoped-slots.tsx}`), constructs a synthetic pane-scoped host whose `scope('session')` points at that pane's binding, and lets **the core's own renderer** draw header/messages/composer/hero. No core patch; single-pane mode is byte-identical to stock; tests: 31 vitest cases, vendor-drift guard, Playwright end-to-end scenario, 6-hourly upstream tracking with a "contact surface" gate and `core-pin.json`. That design is architecturally **better than `dsh-split-screen`'s manual dispatch layer** — it is exactly the class of bug (hand-written slot dispatch drifting from core) that its own release notes say they fixed by vendoring. But it keeps the fatal property we are trying to escape: **all panes run inside one React tree and one client store graph**. ### 3.3 The blocker: broken on 0.2.x, and nobody has fixed it Two open issues, both filed 2026-09-30 by the same reporter (`ztllll`), both with zero maintainer comments: - **#7** — environment DSH `0.2.0-rc.2`, plugin `0.6.5`: `TypeError: renderFactorySlot is not a function`, `slot occupant crashed in 'main.conversation'`; whole conversation area blank. Root cause: the vendored renderer is pinned to `dsh-v0.1.5-alpha.2`; 0.2.0's slot system added Component Factory and a fifth share `renderFactorySlot`, plus new host members (`isFactoryLive`, `reportFactoryError`, `subscribeFactory`, `retainFactoryOccurrence`, `getFactoryVersion`, `factoryStoreOf`, `factoryOf`). Evidence table in the issue: `scoped-slots.tsx` 38,104 B → 53,165 B, `bindings.tsx` changed, `errors.ts` newly split out and must be vendored too. It also documents **why the plugin's own upstream-tracking gate silently skipped the upgrade**: GitHub's compare API caps at 300 files and the renderer files were outside the truncated list — a process defect that will recur on every big core jump. - **#8** — the full fix recipe, "fixed on my machine and tested": re-vendor the renderer at `dsh-v0.2.0-rc.2`, switch from `adapter.resolve(sessionId)`/`sessions.open` to `ctx.sessions.retain(id,{source})` + `adapter.bindingSource(reference)`, **do not** use the `mainView` retention source (it pollutes core's current-session derivation — they measured 3–4 sessions retained under `mainView`), delegate factory API to the public `ctx.slots.hostFace()`, use `hostFace().root` for the root binding, and rename `IconCloseOutline16` → `IconCloseOutlineRegular`. Reported result: 0 console errors, all pane buttons work. **Implication:** the fix exists as prose, not as a commit. Repo pushed_at equals the v0.6.5 release timestamp (2026-09-11) — nothing has landed since. Our host is **0.2.1-rc.2**, one minor release beyond the version in the report. Even if upstream merged #8 tomorrow, the plugin would still be a git-only, single-maintainer, pin-to-core-renderer artifact — i.e. structurally the same maintenance treadmill as ours. ### 3.4 Does the catalog actually vouch for it? No — the catalog contradicts itself This matters because the Lead's brief said the catalog lists it as `✅`. The local catalog data says otherwise, in three different places: - `/PLUGINS.md` line 39: `dsh-split-panes | dsh-external/dsh-split-panes | 分屏面板 | ✅` (curated table). - Generated category catalog `catalog/all/Web UI 增强.md` L247: `⬜ [未测] dsh-split-panes ★7`; a **second, duplicate** entry in `catalog/all/其他.md` L345: `🟩 [可用] dsh-split-panes ★7` (alias `lehhair/dsh-split-panes` — a dedupe miss). - `data/plugins-all.json` (radar snapshot generated **2026-10-08**): `dsh-external/dsh-split-panes`, `stars: 7`, **`verdict: "untested"`**. - `CHANGELOG.md` compatibility rounds 2026-08-10 → 2026-08-13 repeatedly list it among **"需适配"** (e.g. "兼容状态:277 / 286 兼容,9 需适配(… dsh-split-panes …)"). - `data/snapshot-baseline.json` (radar-snapshot-baseline/v1, created 2026-09-26): `lehhair-dsh-split-panes`, star 6, `"verdict": "✅ 运行级可用"` — an older/other alias snapshot. Conclusion: **the `✅` is not a reliable runtime verdict.** The only machine verdicts available are "untested" (2026-10-08) and stale "需适配" (August), and the upstream issues prove it is broken on 0.2.x. The catalog's own admission policy (`catalog/policy.json`) says only `pass`/`warn` count as pass and `not_run`/`inconclusive` never do — so `未测` must not be upgraded to a recommendation by hand. --- ## 4. Iframe-based alternatives (the safer technique) ### 4.1 `dsh-split-view` — the best-shaped replacement candidate **What it is:** a single-package client plugin, installable from the registry: `dsh plugin --profile web add dsh-split-view` (npm `dsh-split-view`). The top window shadows the root slot with a resizable split container; **each pane is an iframe running a full DSH client pinned to its own session**, with per-pane titlebars (session title, live rename, copy "session id + title"), drag-resizable dividers, nested horizontal/vertical splits, per-pane buttons (split right / split down / maximize / refresh / close), double-click maximize, a settings page (custom shortcuts, focus-highlight color incl. theme-follow, titlebar visibility, restore defaults), default shortcuts ⇧⌘D / ⇧⌘V / ⇧⌘X / ⇧⌘Enter (⌘ = Ctrl on Windows), and a **Cordis service API** for other plugins (`split({session})` etc. — the maintainer explicitly documents using it to emulate Claude Code agent-teams split-pane display). **Maintenance evidence (strong for its size):** - npm versions 0.2.0 → **0.2.7**; 0.2.6 published 2026-10-15, **0.2.7 published 2026-10-19T03:23:47Z (today)**; repo `pushed_at 2026-10-19T03:23:09Z`; 2★, 2 forks, 1 open issue, MIT, 78 downloads/week (380/month). - **0.2.6 (2026-10-15) is the 0.2.0 adaptation**, done in response to issue #1, with a detailed commit message: it moves navigation to `ctx.uiWorkspace` on 0.2.x / `sessions.open·clear` on 0.1.x; explicitly **rejects** the reporter's "self-retain `mainView`" suggestion with measured evidence (it would create a second permanent `mainView` reference and corrupt title bars + `ui-open-in-app`, `ui-settings-general`, `ui-agent-preset`); peer range widened to `^0.1.0-rc.6 || ^0.2.0-rc.2` and validated with DSH's own `evaluatePluginCompatibility` against 0.1.0-rc.6 / 0.1.5-rc.2 / 0.1.7-rc.2 / 0.2.0-rc.2 / 0.2.1-alpha.3; isolated-profile real-machine tests on 0.2.0-rc.2 and 0.1.5-rc.2; 31/31 adapter tests. - **0.2.7 (today)** fixes a subtle "cross-origin pane 401 deadlock": DSH ≥0.1.5-rc.2 isolates the web auth cookie strictly per origin, and panes that landed on a secondary loopback origin got the server's "authentication required" page and hung behind the boot veil with **zero console errors**. Fix: single-origin pool; **live-pane cap 9 → 4**, above which panes are LRU-hibernated. This is unusually high-quality debugging for a 2-star plugin. - Issue #1's conclusion also validates the technique: *"the plugin's 'iframe + mount root slot' route is very resistant to version changes: none of 0.2.0's other big changes (SlotScopeAdapter.resolve removal, Factory / renderFactorySlot, SessionListState.current removal) touched it — only one API broke."* **Residual risks (must be validated, not assumed):** - **Not verified against 0.2.1-rc.2 or the desktop profile.** Peer range `^0.2.0-rc.2` does not formally include `0.2.1-rc.2` under strict npm semver prerelease rules; the maintainer's own gate test only went to `0.2.1-alpha.3`. If the peer gate skips the bundle, the UI will log `skipping profile bundle` and show no split buttons — a cheap, loud failure mode, but a real one. - **Max 4 live panes** (plus hibernated ones that reload on revisit). Our current plugin supports more panes, so this is a UX regression, not a bug. - **Tiny community** (2★, 78 dl/wk): one person, no external issue triage; bus factor 1. - **Desktop install path**: the app is the Electron desktop profile. The README only documents `--profile web`. `dsh-multi-chat`'s README documents that web and desktop profiles share the same platform module table and both work for its plugin; for split-view this is **unverified**. - Memory: each live pane is a full client boot; 4 live panes ≈ 4 browser app instances. This is *bounded* (unlike unbounded same-tree storms) but not free. ### 4.2 `@ai-eks/dsh-docking-layout` — most engineered, catalog-conflicted - npm `@ai-eks/dsh-docking-layout`, latest **0.2.0-rc.2 published 2026-10-08**, 6 versions deliberately mapped to core releases (`0.1.1-rc.2`, `0.1.2-rc.1`, `0.1.5-rc.1`, `0.1.7-rc.1`, `0.2.0-rc.2`); MIT; 286 downloads/week, **1,650/month** (≈6× split-view); GitHub: 6★, 0 open issues, **last push 2026-10-17**, TypeScript, 75 files / 940 KB unpacked. - README: *"Requires DeepSeek Harness `^0.2.1-rc.2` and Cordis `^4.0.5`"* — the user's exact app build. Feature set: unlimited tabs and groups; drag a tab to another group / to an edge to split; toolbar split right/down; ≤760 px single-group mode with switcher; **iframe pool keeps each group's active tab plus the two most recently used inactive tabs mounted** (evicted tabs reload); closing a tab never deletes the DSH session; a shared right sidebar (files/previews) persists across session switches; optional shared bottom workbench when `dsh-better-sidebar@0.28.0` is installed; only layout preferences stored locally; no session logs/prompts/approvals/files copied; all embedded pages same-origin; adds no model-visible prompts/tools/messages/session events. - **The conflict:** local catalog `catalog/all/编码开发.md` L1480 rates it `🟨 [不兼容]` (`verdict: incompatible` in the 2026-10-08 radar snapshot) while the package published on the same day claims 0.2.1-rc.2 support. Desk research cannot resolve which is right — the catalog's k8s harness may fail it for environment reasons (iframe/auth/desktop) or the rating may predate the 0.2.0-rc.2 publish. **Only an isolated-profile spike can decide.** - Risk: same iframe technique as split-view; more features but layout-centric (tabs first, split second) and desktop profile unverified. If the split-view spike fails, this is the next best bet. ### 4.3 `dsh-multi-chat` — the isolation extreme `daetz-coder/dsh-multi-chat` (npm `dsh-multi-chat` 1.0.8, 2026-10-01, MIT, 284 dl/wk, catalog ✅ 可用) does not re-host or iframe-multiplex a single client: it **runs N real `dsh web --port N` processes** and shows them as an iframe grid ("multi-chat = multi-port"), with auto port discovery, one-click new instance, column layouts, per-window controls (maximize / refresh / new tab / remove), persisted layout, and a token-authenticated LAN gateway for phone/tablet. It registers only additive slots (`conversation.view` ring entry, `sidebar.footer.action`) and five read-only JSON routes; it never replaces an existing slot and handles DSH 0.2's launch-token/401 flow explicitly. It also warns that plugin boot is fail-closed (a broken client plugin stops the whole web UI) — a useful argument for **not** putting risky split logic into the primary UI at all. Trade-offs: N processes = N× RAM/CPU/WebSocket connections; each pane is a *different* DSH instance/session rather than another session of the same app; no drag-to-split, no per-pane session picking. Verdict: **complementary / pragmatic fallback** — the safest way to "watch several agents" today, and it cannot take down the main window. --- ## 5. Local catalog sweep — every split/pane/multi-window candidate Catalog mechanics (from `catalog/policy.json`, `README.md`, `CHANGELOG.md`): it is an auto-discovery + curation catalog. Curated `PLUGINS.md` uses a 运行级 column (`✅` / `待测` / `agent`); the generated per-category pages (`catalog/all/*.md`) use `🟩可用` / `⬜未测` / `⬜待定` / `🟨不兼容` from a k8s runtime harness; `data/plugins-all.json` is the machine snapshot (`verdict: ok|untested|pending|incompatible`, 13,365 plugins as of 2026-10-08). Latest aggregate in `CHANGELOG.md` (2026-10-08): **13,625 total — 8,207 可用 / 3,269 真不兼容 / 2,149 待定**. Admission requires public repo, stable repo id, `is_plugin=true`, README, license, explicit risk disclosure, "static outcome not fail" — i.e. listing is *not* runtime proof. Complete shortlist (generated catalog, 2026-10-08 snapshot): | Repo | ★ | Catalog rating | What it actually is | Shortlisted? | |---|---|---|---|---| | `dsh-external`/`lehhair` **dsh-split-panes** | 7 (GitHub: 9) | **未测** (`Web UI 增强.md`) / 可用 duplicate (`其他.md`, alias) / `untested` in `plugins-all.json` | in-process native re-hosting (§3) | yes — investigated and rejected | | `yeyeyeyeshifu/dsh-split-screen` | 1 | **未测** | ours | baseline | | `luckybilly/dsh-split-view` | 2 | 🟩 可用 | iframe-per-pane, npm, current (§4.1) | **yes — top candidate** | | `ai-eks/dsh-docking-layout` | 6 | 🟨 **不兼容** | iframe pool + tabs/groups, npm, targets 0.2.1-rc.2 (§4.2) | **yes — fallback** | | `daetz-coder/dsh-multi-chat` | 5 | 🟩 可用 | multi-process wall, npm (§4.3) | yes — complementary | | `syncended/deepseek-harness-split-screen` | 0 | 🟩 可用 | unnamed derivative; no release/npm evidence found | no | | `licat2023/dsh-session-tabs` | 0 | 🟩 可用; PLUGINS.md 待测 | browser-style session tabs; complementary (no panes) | no | | `niushuanan/dsh-multi-window` | 0 | ⬜ 待定 | "multiple independent conversations side by side, isolated navigation/drafts/runtime state" | no (no maturity signal) | | `WilliamShi666/dsh-multiple-chat-panels` | 13 | ⬜ 待定 | multiple chat panels; no docs/metadata surfaced | no | | `Neumannzc/dsh-native-session-split` | 0 | ⬜ 待定 | no docs/metadata surfaced | no | | `wanyexin1998/dsh-workbench` | 2 | 🟩 可用 | "two-Pane" *source preview* workbench (files/preview), not session panes | no | | `Mintcolour/dsh-sidechat` | 0 | 🟨 不兼容 | Codex-style split side chat | no | | `lsq-dsh-plugins/dsh-workbench-layout` | 3 | 🟨 不兼容 | workbench layout | no | | `wbin0001/dsh-comfyui-canvas` | 10 | 🟩 可用 | split-screen canvas but for ComfyUI, unrelated | no | Also relevant non-pane multi-session UX: `ccll/dsh-activity-pane` (⬜ 待定, running-session overview pane), `hkkz9522/dsh-session-manager` (23★, 待定), `flowingboy/dsh-session-manager`, `piaohua/dsh-plugin-archive-manager` — all *session management*, not side-by-side views. **No other catalog entry combines (a) same-app multi-pane, (b) npm distribution, (c) 0.2.x support.** That is the core finding of the sweep. --- ## 6. Official / built-in DSH capabilities Verified against the app bundle inside `\resources\app.asar\dsh\package.json` (`@deepseek-ai/dsh-desktop-runtime` **0.2.1-rc.2**) and the **live Host Service catalog** (`cordis_inspect_query`, 2026-10-19): - **No official split/panes/multi-window package or service.** The ~300-package inventory contains `dsh-client-ui-layout`, `dsh-client-ui-sidebar`, `dsh-client-ui-sidebar-right`, `dsh-client-ui-session`, `dsh-client-ui-conversation` — but **no** `*panes*`, `*split*`, `*dock*`, `*multi-window*` package. The live Host Service catalog has no window/pane/layout service either; it exposes `webApp.getAdvertisedUrl()`, `webServer` (routes), `clientModules` (plugin bundle table), plus the session/agent services. - **Official multi-agent UX exists, but it is not panes:** the app ships `dsh-experimental-agent-team`, `dsh-experimental-agent-team-profile`, `dsh-experimental-client-ui-agent-team`, `dsh-experimental-tool-agent-team`, and a live **`agentTeams` Host service** (`spawnTeammate`, `sendMessage`, `createTask`/`getTask`/`listTasks`/`updateTask`, `waitForChange`, `interrupt`, `listMembers`). That is the "many agents at once" path DSH itself endorses: a Lead + teammates with a roster/task board, **not** side-by-side chat panes. `dsh-split-view` even documents an integration point to render each agent-team member as a pane, which makes the two complementary rather than competitive. - **Official plugin distribution exists:** packages `dsh-plugin-manager`, `dsh-plugin-market`, `dsh-plugin-market-index`, `dsh-host-plugin-inventory`, `dsh-client-ui-plugin-market`, `dsh-client-ui-settings-plugin-inventory`; the CLI surface used by every candidate is `dsh plugin --profile web|desktop add|remove `. (Exact `dsh plugin --help` output was not captured — treat CLI flag details as corroborated by three independent plugin READMEs, not by official docs I read.) - **Native multi-window:** *unverified/not found.* There is a `dsh-desktop-host` package (Electron host) and the user runs the desktop app, but I found no evidence of a multi-window/mission-control command or UI in the package inventory or service catalog. I could not open most files inside `app.asar` (only the root `package.json` was readable in this read-only session), so absence of evidence here is not proof of absence — but nothing suggests an official "open two conversations in two windows" feature. - **Multiple stock windows/tabs workarounds:** (a) the desktop app + the web GUI in a browser can both attach to the same host; (b) `dsh web --port N` per instance gives process-isolated conversations (this is what `dsh-multi-chat` automates); (c) **since DSH 0.2, each `dsh web` process mints a launch token and answers unauthenticated `/` with 401**, so naive window/port orchestration breaks unless the token is handled (`dsh-multi-chat` documents and automates exactly this). Also note the profile/CLI mismatch: the app is 0.2.1-rc.2 while the global `dsh` is 0.2.0-rc.2 — **install plugins with the app-matching CLI / into the desktop profile**, otherwise a `^0.2.1-rc.2`-gated plugin can be rejected at install time for the wrong core version. --- ## 7. Mature layout libraries (foundation only — not a replacement) Verified via `npm view` on 2026-10-19. All of these solve **layout geometry only** (split trees, tabs/groups, drag-docking, resize). None of them knows anything about DSH sessions, the renderer, stores, or the client module table — so adopting one would de-risk *our layout code*, and would touch **none of the layers where `dsh-split-screen`'s bugs live** (multi-root session rendering, store isolation, slot re-hosting, React update storms). | Library | Latest | Published | License | Deps | What it solves | |---|---|---|---|---|---| | [dockview](https://www.npmjs.com/package/dockview) (+ `dockview-core`) | 8.6.0 | 2026-10-16 | MIT | 1 | tabs, groups, grids, splitviews, drag-drop, floating panels — the most complete docking framework | | [react-mosaic-component](https://www.npmjs.com/package/react-mosaic-component) | 7.2.1 | 2026-09-28 | Apache-2.0 | 12 | React tiling window manager (mosaic) | | [flexlayout-react](https://www.npmjs.com/package/flexlayout-react) | 0.11.1 | 2026-09-26 | MIT | 0 | multi-tab docking layout | | [golden-layout](https://www.npmjs.com/package/golden-layout) | 2.6.0 | **2022-09-26** | MIT | 0 | multi-screen layout manager — **stale ~4 years, avoid** | | [rc-dock](https://www.npmjs.com/package/rc-dock) | 4.1.0 | 2026-09-30 | Apache-2.0 | 5 | dock layout for React | | [allotment](https://www.npmjs.com/package/allotment) | 1.20.6 | 2026-10-12 | MIT | 6 | simple React split-pane container (only splits, no tabs/docking) | | [react-resizable-panels](https://www.npmjs.com/package/react-resizable-panels) | 4.14.6 | 2026-10-18 | MIT | 0 | resizable panel groups (splits only) | Bundle sizes were not measured (npm `unpackedSize` extraction failed in this environment) — do not quote sizes without measuring; dependency counts above are from `npm view`. Practical reading: if we rebuild on iframes, **dockview** (or rc-dock/flexlayout) is the strongest layout base; if we keep single-tree re-hosting, a layout swap is cosmetic. --- ## 8. Feature parity vs `dsh-split-screen` `dsh-split-screen`'s feature list is taken from its README/catalog: split-only-when-2+-panes, sidebar drag-to-edge split, fully interactive native panes (streaming, Enter/Shift+Enter, /commands, Stop, queued messages, todos, attachments), in-pane `ask_user_question`/approvals, **per-pane view tabs (Chat/Trajectory/plugin views)**, **TUI compact composer (Alt+T)**, agent-team header, **layout persistence**, Alt+Shift+arrow pane focus, native theming. | Feature | dsh-split-screen (ours) | dsh-split-view | dsh-split-panes | docking-layout | dsh-multi-chat | |---|---|---|---|---|---| | Multiple panes, nested splits | ✓ | ✓ (nested, buttons/hotkeys) | ✓ (nested) | ✓ groups/tabs | grid (no nesting) | | Drag conversation → edge to split | ✓ (sidebar drag) | unverified (divider drag ✓; sidebar drag listed as untested in issue #1) | ✓ (4-way sidebar drag) | ✓ (drag tabs) | ✗ (column count only) | | Per-pane native composer / streaming / stop | ✓ | ✓ (full client) | ✓ (core renderer) | ✓ (full client) | ✓ (full client) | | Per-pane questions & approval cards | ✓ | ✓ (native) | ✓ (native) | ✓ (native) | ✓ (native) | | Per-pane view tabs (Chat/Trajectory/plugins) | ✓ | ✓ (full client) | native but per-pane routing unverified | ✓ (full client) | ✓ (full client) | | **TUI compact composer (Alt+T)** | ✓ | ✗ | ✗ | ✗ | ✗ | | **Agent-team header** | ✓ | ✗ | ✗ | ✗ | ✗ | | **Layout persistence across reload** | ✓ | ✓ (prefs rehydrate; evidenced in 0.2.7) | ✗ (module-singleton store) | ✓ (local prefs) | ✓ (localStorage) | | Pane focus navigation | ✓ (Alt+Shift+arrows) | focus by click (hotkeys for split/close/max) | ✓ (mod+shift+arrows) | click | n/a | | Same-session/global-session sync semantics | shared tree (source of bugs) | each pane independent client; mainView kept unique | shared tree | each iframe independent | separate processes | | Failure containment | none (one tree) | iframe isolation | none (one tree) | iframe isolation | process isolation | | Max practical panes | unbounded (→ OOM) | **4 live**, more hibernated | unbounded | active + 2 recent per group | N processes | | Distribution | npm | npm | **git/tarball only** | npm | npm | | DSH 0.2.1-rc.2 (user build) | unverified/struggling | **unverified (likely)** | **broken (documented)** | **claimed** | 0.2 handled | --- ## 9. VERIFIED vs UNVERIFIED **Verified (with source, 2026-10-19):** - `dsh-external/dsh-split-panes` redirects to `lehhair/dsh-split-panes` (repo id 1328343470): 9★/1 fork/3 open issues, BSD-3, pushed 2026-09-11, latest release v0.6.5 2026-09-11. [repo](https://api.github.com/repos/lehhair/dsh-split-panes) · [releases](https://api.github.com/repos/lehhair/dsh-split-panes/releases) - `dsh-split-panes` is **not on npm** (E404 for both names) — `npm view`, 2026-10-19. - `dsh-split-panes` **breaks on DSH 0.2.0-rc.2**: [issue #7](https://github.com/lehhair/dsh-split-panes/issues/7), [issue #8](https://github.com/lehhair/dsh-split-panes/issues/8), both 2026-09-30, 0 maintainer comments; #8 contains the fix recipe, unmerged. - Catalog's own verdict for it is inconsistent/stale: `PLUGINS.md` L39 ✅ vs `catalog/all/Web UI 增强.md` L247 未测 vs `catalog/all/其他.md` L345 可用 vs `data/plugins-all.json` `untested` vs Aug CHANGELOG 需适配. - `dsh-split-view`: npm 0.2.7 published 2026-10-19T03:23:47Z; repo pushed 2026-10-19; 2★/2 forks/1 open issue; MIT; 78 dl/wk / 380 dl/mo; peer `^0.1.0-rc.6 || ^0.2.0-rc.2`; 0.2.6 (2026-10-15) = 0.2.0 adaptation (commit `5897fc9b`); 0.2.7 (today) = single-origin auth fix + live-pane cap 4 (commit `4da4b540`). [repo](https://api.github.com/repos/luckybilly/dsh-split-view) · [issue #1](https://github.com/luckybilly/dsh-split-view/issues/1) - `@ai-eks/dsh-docking-layout`: npm 0.2.0-rc.2 published 2026-10-08; 6 versions; MIT; 286 dl/wk / 1,650 dl/mo; repo 6★/0 issues/pushed 2026-10-17; README "Requires DSH ^0.2.1-rc.2 and Cordis ^4.0.5". [repo](https://api.github.com/repos/ai-eks/dsh-docking-layout) · [npm](https://www.npmjs.com/package/@ai-eks/dsh-docking-layout) - `dsh-multi-chat`: npm 1.0.8 published 2026-10-01; MIT; 284 dl/wk; multi-port architecture and DSH 0.2 launch-token handling documented in its README; catalog ✅ 可用. - `dsh-split-screen`: npm latest 1.2.6 published 2026-09-17; catalog 未测 ★1. - Official app bundle is `@deepseek-ai/dsh-desktop-runtime 0.2.1-rc.2` (read from `app.asar/dsh/package.json`); ~300 packages; **no panes/split/multi-window package**; `agentTeams` service live; no window/pane service in the live Host catalog. - Layout libraries' current versions/dates/licenses: table §7. **Unverified / must be tested, not assumed:** - Whether `dsh-split-view` installs and runs on **desktop profile 0.2.1-rc.2** (peer range formally stops at `0.2.0-rc.2`; maintainer tested 0.2.1-alpha.3 only). Its own issue #1 lists sidebar drag-assign, LRU hibernation, settings page, shortcuts and retry timing as not covered by testing. - Whether `@ai-eks/dsh-docking-layout` actually runs on this user's build — the local catalog says ❌ while upstream claims `^0.2.1-rc.2`. - Whether any of these plugins installs cleanly into the **desktop** profile via the mismatched global CLI (0.2.0-rc.2) vs app (0.2.1-rc.2). - Exact `dsh plugin --help` registry/hub subcommands (not captured; three plugin READMEs agree on `add/remove --profile

`). - Whether the DSH desktop app supports multiple native windows (no evidence found; asar internals mostly unreadable in this session). - `dsh-split-panes` layout persistence (inferred from `pane-layout-store.ts` being described as a module singleton; not documented as persisted). - Bundle sizes of layout libraries (not measured). --- ## 10. Recommendation and (conditional) migration sketch ### Recommendation **Do not swap to `dsh-split-panes`.** It is not a mature alternative for this user: it is broken on the user's core generation, unmaintained since 2026-09-11, not published to npm, and its design (vendored core renderer pinned to an old core) guarantees the same breakage cycle that our plugin suffers. Its value to this project is as an **architectural reference** (it proves the core renderer can be driven per-pane through the public `SlotRendererHost` contract, and its two issues are a precise map of every 0.2.x API break we would face in any in-process re-host). **The real decision is architectural, not plugin-choice:** in-process re-hosting of the native chat UI in one React tree is the *cause class* of the user's symptoms; both our plugin and split-panes share it. Iframe isolation is the only alternative in the ecosystem that keeps "native DSH look/behaviour in panes" while containing failures. **Recommended sequence:** 1. **Spike `dsh-split-view` first** (its technique, maintenance cadence and doc quality fit best; it is published today). Use a **scratch profile / spare port**, never the live profile: `dsh plugin --profile add dsh-split-view` (or the app-matching CLI against a copied profile). Validate: plugin loads (no `skipping profile bundle`), 2–4 panes live, per-pane streaming, per-pane `ask_user_question`/approval answers, reload persistence, `Ctrl` shortcuts on Windows, memory after 30 min with 4 panes, and **desktop vs web profile**. Roll back = remove plugin + restart (the plugin's own README notes boot is fail-closed, so a bad plugin is loud, not silent). 2. **If it fails for version-gate/desktop reasons, spike `@ai-eks/dsh-docking-layout`** (best maintenance/QA surface, claims our exact core, but catalog conflict). 3. **If both fail:** keep `dsh-split-screen` but treat it as a stopgap: cap live panes (2–3), remove/disable the riskiest multi-session store multiplexing, add a hard OOM/update-storm circuit breaker, and point heavy multi-agent use at the isolated fallback (N× stock windows / `dsh-multi-chat`), which cannot take the main session down. ### Migration sketch if `dsh-split-view` is adopted (Option A) - **Uninstall:** remove `dsh-split-screen` from the target profile (`dsh plugin --profile remove dsh-split-screen`), restart the app. No data migration needed — split-view stores only layout prefs locally and never touches session logs/prompts/approvals. - **Install:** `dsh plugin --profile web add dsh-split-view` (try web profile first; only then the desktop profile), restart, confirm the split buttons appear and `skipping profile bundle` is absent from startup logs. - **Features lost / to be re-added as side plugins or accepted:** TUI compact composer (Alt+T) — lost; agent-team header — lost (use the official Agent Teams roster, or the `split({session})` API to render team members as panes); sidebar drag-to-edge assignment — unverified in split-view (divider drag and split buttons work); unlimited panes — capped at 4 live (hibernation above); instantaneous same-tree session switching — replaced by iframe reloads on eviction (slightly slower). - **Features kept for free:** native panes, per-pane composer/streaming/stop, per-pane questions/approvals, per-pane view tabs, rename/copy session, layout persistence, custom shortcuts, focus highlight, dark/light theming. - **Cost:** pane boot = a full client instance; 4 live panes is the memory ceiling; a 2-star single-maintainer dependency replaces a self-maintained one — net win only if the spike passes and our remaining features are small. ### Migration sketch if we keep our plugin but re-architect (Option B — best parity, more work) Keep the package and feature set, **replace the re-hosting layer with iframes** modelled on split-view/docking-layout: one iframe per pane pinned via `?dshSession=` (split-view uses exactly this and proved the seeding path works), keep our TUI composer / agent-team header / view-tab routing as host-side chrome, add LRU hibernation and a live-pane cap, and keep the layout-tree logic ourselves (dockview/rc-dock optional). This is the only path that preserves full parity **and** structurally removes the update-storm/OOM class, at the cost of a real rewrite of the client half (estimated multi-week, not a config change). Given the user's reported severity, Option A-then-B is the pragmatic order. ### Decision gates (what would change this verdict) - `dsh-split-panes` publishes a 0.2.1-rc.2-compatible release and a v1.x — re-evaluate as an in-process base. - `dsh-split-view` passes on desktop 0.2.1-rc.2 → adopt, stop maintaining the re-hosting layer. - Neither does → harden ours + isolate heavy usage into separate processes; layout-library swap is not worth doing on its own. --- ## Appendix A — source URLs **Candidates** - dsh-split-panes: https://github.com/lehhair/dsh-split-panes · https://github.com/lehhair/dsh-split-panes/releases · https://github.com/lehhair/dsh-split-panes/issues/7 · https://github.com/lehhair/dsh-split-panes/issues/8 · https://github.com/dsh-external/dsh-split-panes (redirect) - dsh-split-view: https://github.com/luckybilly/dsh-split-view · https://github.com/luckybilly/dsh-split-view/issues/1 · https://www.npmjs.com/package/dsh-split-view · commits https://github.com/luckybilly/dsh-split-view/commits/main - docking-layout: https://github.com/ai-eks/dsh-docking-layout · https://www.npmjs.com/package/@ai-eks/dsh-docking-layout - dsh-multi-chat: https://github.com/daetz-coder/dsh-multi-chat · https://www.npmjs.com/package/dsh-multi-chat - dsh-split-screen: https://github.com/YEYEYEYESHIFU/dsh-split-screen · https://www.npmjs.com/package/dsh-split-screen - dsh-session-tabs: https://github.com/licat2023/dsh-session-tabs · luckybilly split-view: https://github.com/luckybilly/dsh-split-view - Layout libs: https://www.npmjs.com/package/dockview · https://www.npmjs.com/package/react-mosaic-component · https://www.npmjs.com/package/flexlayout-react · https://www.npmjs.com/package/golden-layout · https://www.npmjs.com/package/rc-dock · https://www.npmjs.com/package/allotment · https://www.npmjs.com/package/react-resizable-panels **Local evidence (paths relative to ``)** - `PLUGINS.md` L39 (split-panes ✅), L26 (session-tabs 待测) · `PLUGINS-ALL.md` - `catalog/all/Web UI 增强.md` L247 (split-panes 未测), L1240 (split-screen 未测) · `catalog/all/其他.md` L345 (split-panes 可用, duplicate alias) · `catalog/all/编码开发.md` L1480 (docking-layout 不兼容), L1164 (multi-window 待定), L231 (multi-chat 可用) - `data/plugins-all.json` (radar snapshot 2026-10-08, 13,365 entries) · `data/snapshot-baseline.json` (radar-snapshot-baseline/v1, 2026-09-26) · `data/repo-map.json` (canonical id) · `data/plugins-enrich.json`, `data/enrich-cache.json`, `data/star-cache.json` (stars/pushed_at/license) - `catalog/policy.json` (admission + evidence semantics) · `CHANGELOG.md` (2026-10-08 aggregate; 2026-08-10..13 需适配 rounds; npm/registry data dates) - DSH install: `\resources\app.asar\dsh\package.json` (`@deepseek-ai/dsh-desktop-runtime` 0.2.1-rc.2, full package inventory) · `\version` (Electron 44.7.0) - Live: `cordis_inspect_query` host `Service.listService` (2026-10-19) — no pane/window service; `agentTeams` present. ## Appendix B — evidence commands (reproducible) ```powershell # candidate repo facts / releases / issues / commits Invoke-RestMethod https://api.github.com/repos/lehhair/dsh-split-panes Invoke-RestMethod https://api.github.com/repos/luckybilly/dsh-split-view/commits?per_page=8 Invoke-RestMethod https://api.github.com/repos/ai-eks/dsh-docking-layout # npm existence, versions, dates, peer ranges, downloads npm view dsh-split-panes --json # E404 (also @dsh-external/dsh-split-panes) npm view dsh-split-view --json npm view dsh-split-view@0.2.7 peerDependencies --json npm view @ai-eks/dsh-docking-layout --json npm view dsh-multi-chat --json Invoke-RestMethod https://api.npmjs.org/downloads/point/last-month/dsh-split-view # catalog snapshot queries (PowerShell, UTF-8 read) $utf8 = New-Object System.Text.UTF8Encoding $false $j = [System.IO.File]::ReadAllText("\data\plugins-all.json",$utf8) | ConvertFrom-Json $j.plugins | ? { $_.repo -match 'split|pane|docking|multi-window' } | select repo,stars,verdict,desc ``` *Report scope compliance: only this file was written; no installs, no profile changes, no plugin source edits, no app restarts, no `dsh plugin add/remove`.*