demo:web and the README Web UI instructions ran only build:web (the Vite
frontend shell), never the root build that emits each web-client plugin's
lib/client.js. On a clean checkout every /plugins/<id>/client.js 404s and
the client loader shows "Failed to load plugins".
Run pnpm run build before build:web in both the demo:web script and the
README instructions for the installed ~/.dsh/source checkout.
- Add 'edit' to ToolRowVariant type and TOOL_VARIANTS mapping
- Add 'edit' title and summary key preference (path/file_path)
- Add IconEditOutline16 as the leading icon for edit variant
Two polish defects from the headless verification pass:
- .newSessionLabel/.footLabel declared their own transition shorthand,
which replaced .wide's opacity fade entirely (shorthands do not merge) —
the labels vanished instantly while everything else faded. The fade is
restated alongside max-width.
- The rail icons drifted off a common vertical axis: the 56px track holds
a 55px content box (1px column border), and the capsule rows kept their
1px border-width in the collapsed state, shaving their content to 23px
and pushing the search icon 2px right. Collapsed capsules now zero the
border-width (transitioning border, not border-color), the root gives
back the border pixel via asymmetric padding, and every surviving row
centers its icon — five glyphs on the track's 28px center.
The collapse read as a hard cut: only the track width animated while the
panel content swapped instantly and the rail icons bore no relation to the
expanded layout. Now the four control rows persist across the transition —
collapse toggle, new session, new workspace, search, the same top-down
order as their expanded rows — and morph their geometry (row heights,
paddings, margins, capsule borders) on the deepsuite curve, so each rail
icon is its expanded control converging onto the 56px axis. Wide-only
content (brand, labels, input, session tree) cross-fades over 200ms, stays
mounted while the collapse animates, and unmounts at the 300ms settle,
still dropping the sessions subscription. The search query moves up to the
root and survives the round trip; rail search focuses the surviving input
after expand instead of remount-autofocus.