Rebases the whole branch onto main's new 0.1.7-rc.1 baseline and lands the
adaptation the new host contract requires: the ui-primitives icon family rename
(Icon<Name><14|16> -> Icon<Name>Regular/Medium, with the 14px defaults pinned
back explicitly) and the StateDot redraw, the rewritten dsh-settings surface
(entry-id namespace, DSH schemastery with collected volatile returns,
configure auto:false), session format v4 (producer-owned source kind plus the
rewritten tool-result shape, parsers accepting both), the client snapshot move
to projectionsBySession.subagentCatalog with the jobs.list route behind it, the
^0.1.7-rc.1 peer floor with vendor and bare-import devDeps, the reduced chunk
set mirrored in all eight places, and the capability hand-backs (read-only
previews, terminal, browser).
Verified: typecheck and lint clean; 119 files / 1200 tests; build with no old
contract residue in the bundles; mount e2e 7/7; the tasks page still passes its
70-assertion real-browser contract.
Visual base replacement for the Tasks page after the 'hard shadows make a
dense graph unreadable' review. Behaviour, hooks, aria labels and i18n are
unchanged; the base layer is not.
- FOUNDATION: Tailwind v4 wired into tsdown's css-inline plugin (theme +
utilities ONLY — preflight is excluded because the plugin's stylesheet is a
global <style data-plugin> tag and would repaint the host page), shadcn
tokens bridged to --dsw-* so the DSH theme keeps flipping light/dark with no
dark: overrides, cn() util, components.json for the CLI, src/client/ui/.
- COMPONENTS: shadcn's component source vendored into src/client/ui (button,
card, badge, separator, input, textarea, tooltip, popover, dropdown-menu,
scroll-area, collapsible, toggle-group, skeleton, spinner, empty) with a
documented local diff: lucide-react replaced by host IconXxx (no new icon
dep), shadow-* dropped from non-floating variants, unused variants pruned,
and React.forwardRef restored on Button — the host runs React 18, where
radix's Slot cannot hand a ref to a plain function component (dev warns,
production silently mis-anchors the floating layer).
- SHADOWS: static panels are now hairline + surface tiers with hover:bg-muted;
shadows exist only on floating layers. Settled nodes recede by ink
(text-muted-foreground/foreground-3) instead of opacity.
- DENSITY: node cards widened 132 -> 150px with a two-line clamped title
(13px text in a 132px card left ~7 CJK characters), reserved height 46 -> 60.
- CHUNK: the whole page (graph, tree, task window, board, drawer, shadcn/radix
layer and its stylesheet) moved into the lazy 'tasks' chunk. Core bundle
988.5 -> 835.6 KiB (-153 KiB); the 709.8 KiB UI payload loads only when the
Tasks tab opens.
- MODEL: workflow members whose childId is already a real node elsewhere are
no longer synthesized into a duplicate id (React keys/edges), with a
last-resort per-id dedupe.
- GUARDS: tests/ui-foundation.spec.ts, tests/ui-bundle.spec.ts (core/chunk
split + size budget + no preflight/oklch/lucide), tests/ui-shadows.spec.ts,
extended tests/theme.spec.ts (no colour literal / palette class in
src/client/ui/** and the migrated files).
- REVIEW FIXES: portal popovers re-scoped under .dsw-tasks, graph loading
state, 11px floor, error nodes no longer tint a whole border, TeamBoard's
delete item is neutral (the window owns the two-step confirm).
Verified: typecheck / lint / 136 files 1502 tests / build bundle assertions /
mount e2e 7-7; browser harness 65-65 checks with 0 console errors.
- tasks-model.ts: one pre-order node list for graph AND tree modes —
catalog walking, workflow-run attachment with member re-parenting and
synthesis, team enrichment, per-parent settled-leaf fold aggregates.
- tasks-graph-layout.ts: dependency-free tidy-tree layered layout
(bundle-purity: no graph library in the core bundle).
- api.ts: workflowsList/teamsView/teamsTaskCreate/teamsTaskUpdate with
the wire result types mirrored from the host routes.
- 11 unit tests across model derivation, edge classification, fold, and
layout geometry.