feat(dsh): adapt to DSH 0.1.5-alpha.2

Baseline moves to DSH 0.1.5-alpha.2 only (peer floor ^0.1.5-alpha.2,
CI pin, manifest engines); alpha.1 users stay on v0.19.0-alpha.0.

Host-contract changes handled:
- the native guide entry lost its `description` field (entries are
  icon+title capsules now): `TabDescriptor.description` and the six
  `guideDesc*` keys plus the `nativeGuideDesc` fallback are removed.
- the file address grammar changed: `fileAddressFor` always returns a
  session-scoped address (absolute paths keep their leading `/`),
  `parseFileAddress` is prefix-based and strips `?`/`#`. The plugin's
  purity-gated mirror follows.
- global main panels replaced the `conversation` root slot with the
  keyed `main` slot (`main.conversation`): the bottom workbench's
  center-column locator now accepts both keys and skips
  `display: contents` slot hosts.

Fixes a pre-existing fill bug the alpha.2 probe made obvious: the native
tab body host is a block scroller with a definite height, so tab roots
that only declared `flex: 1` collapsed to content height and the side
chat composer drifted off the pane bottom. The native adapter now wraps
every tab body in a `height: 100%` column flex host.

Also promotes the dependencies `dsh-client-ui-primitives@0.1.5-alpha.2`
dropped from its manifest (anser / shiki / mdast-util-* / micromark-* /
katex / @shikijs/langs) and the newly unmet `dsh-session-persistence`
peer into devDependencies.
This commit is contained in:
Menghuan1918 committed 2026-09-09 23:09:48 +08:00
1 parent d4765819c0
commit 0b6ac5d267
43 files changed
+944 -930

No files matched your search

+16 -11
View File
@@ -3,8 +3,11 @@
* the bottom workbench spans ONLY the app shell's center column ("squeezes
* the agent output area") — it starts at the app sidebar's right edge and
* ends at the details column's left edge. Measured directly from the
* AppFrame's center column DOM (the parent of the [data-slot="conversation"]
* wrapper — layout.css's center column) so the workbench tracks the column's
* AppFrame's center column DOM (center-column.ts anchors on the conversation
* slot host — `main.conversation` on DSH 0.1.5-alpha.2+, `conversation` on
* alpha.1 — and walks up the transparent `display: contents` slot hosts to
* the column; layout.css's center column) so the workbench tracks the
* column's
* real horizontal edges, including the animated track moves while DSH's
* native right Sidebar opens/closes; a frame that never appears keeps the
* initial zero-size fallback (the panel renders at 0 width until measured).
@@ -67,15 +70,17 @@ export function useCenterColumn(
let disposed = false
let observer: ResizeObserver | undefined
// Locate the AppFrame's center column. DSH 0.1.x wraps slot hosts in
// [data-slot] containers: the conversation slot wrapper
// ([data-slot="conversation"]) sits directly inside the center column,
// so its parent IS that column — no hashed-class or positional
// dependency (layout.css uses the same anchor). The shell swaps the
// boot page for the AppFrame only AFTER boot settles, so the first
// query may miss it. Never give up: watch #root's subtree (the swap and
// HMR re-renders mutate it) and re-run this locator — querying once and
// bailing would strand the panel at the zero-size fallback forever
// (observed: a 1px sliver at the viewport's left edge).
// [data-slot] containers: the conversation slot host (key
// `main.conversation` on 0.1.5-alpha.2+, `conversation` on alpha.1)
// sits inside the center column behind transparent `display: contents`
// slot hosts, so the resolver walks up to the first ancestor that
// renders a box — no hashed-class or positional dependency
// (layout.css uses the same anchor). The shell swaps the boot page for
// the AppFrame only AFTER boot settles, so the first query may miss it.
// Never give up: watch #root's subtree (the swap and HMR re-renders
// mutate it) and re-run this locator — querying once and bailing would
// strand the panel at the zero-size fallback forever (observed: a 1px
// sliver at the viewport's left edge).
const locate = (): void => {
if (disposed) return
// Hot path (#403): streaming output mutates #root at token cadence.