Skip to content

feat(studio): workspace shell, runtime status, and the domain-hook spine - #971

Closed
jtenniswood wants to merge 1 commit into
studio/S05from
studio/S06
Closed

feat(studio): workspace shell, runtime status, and the domain-hook spine#971
jtenniswood wants to merge 1 commit into
studio/S05from
studio/S06

Conversation

@jtenniswood

Copy link
Copy Markdown

Stack 6/21 — Studio: workspace shell, runtime status, domain hooks

The frame every surface mounts in, and the single connection authority that makes Studio daemon-only in practice.

  • app/workspace/layout.tsx + components/shell/ — the workspace chrome: top navigation, the ⌘K global-search palette (static routes + live session/thread rows), storage-health banner slot.
  • features/agent/runtime-status.tsx — the shared runtime status: one 5s dual poll (daemon + controller) gates every surface, feature set + server capabilities + deployment identity off GET /v1/compatibility (pre-exists on main), the offline banner that names the fix, API-skew banner, composer-capability refresh on reconnect. Probe failure renders state — never fabricated content.
  • The domain-hook spine over PR 5's transport: use-agent-sessions, use-agent-cron (+test), use-agent-skills, use-agent-memory, use-agent-roster, use-storage-health; composer-capabilities.
  • lib/thread-map.ts (+28 tests) — the palette's thread rows need it; lib/shortcuts/ (+test) + the static /workspace/shortcuts page; lib/feature-flags.ts; use-nav-reopen-sidebar.
  • knip.ts sheds its temporary lucide-react ignore — the first non-kit icon consumers land here.

Known mid-stack state, deliberate: palette/nav links to surfaces that land later in the series 404 into PR 1's branded not-found page. next.config has no typedRoutes, so this is a runtime-only dead link, not a build hazard; each surface PR turns its link live.

Demo at this stack point: the shell renders against a live daemon; kill the daemon and the offline banner appears; ⌘K opens with static + session rows.

Part of the stacked landing of #618.

🤖 Generated with Claude Code

The frame every surface mounts in. app/workspace/layout.tsx wires the
gradient chrome, the runtime-status provider, shortcuts, the storage-health
banner, and the top navigation; components/shell carries the nav and the ⌘K
global-search palette (static routes + live session/thread rows).

features/agent/runtime-status.tsx is the single connection authority: one 5s
dual poll (daemon + controller) gates every surface, carries the feature set,
server capabilities and deployment identity off GET /v1/compatibility, shows
the offline banner that names the fix, and refreshes composer capabilities on
reconnect. Probe failure renders state — never fabricated content.

The domain hooks land over the transport tier: use-agent-sessions/cron/
skills/memory/roster and storage health, plus composer-capabilities,
lib/thread-map (28 tests; the palette needs it), lib/shortcuts and the
static shortcuts page, and lib/feature-flags. knip sheds the foundation-era
ignores whose first consumers arrive here; palette links to surfaces landing
later in the series 404 into the branded not-found page until then.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@jtenniswood jtenniswood added enhancement New feature or request ui WebUI Applies to the WebUI interface labels Sep 2, 2026
@jhrozek jhrozek closed this Sep 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request ui WebUI Applies to the WebUI interface

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants