Skip to content

CL-6370: kill the grey slots, warm loader + designed empty states - #114

Merged
TheGreatAxios merged 1 commit into
mainfrom
cl-6370-loading
Aug 20, 2026
Merged

TheGreatAxios merged 1 commit into
mainfrom
cl-6370-loading

Conversation

@TheGreatAxios

Copy link
Copy Markdown
Contributor

Summary

  • Extracted the CL-6307 workbench-setup loader (headline + rotating tip) into a shared WorkbenchLoadingState (chat-ui), with a title override and a 200ms flash-prevention delay, and replaced every bare Skeleton/page-fill grey slab in scope with it: the app-shell route Suspense fallback, chat-workspace's workbench-list/message-timeline/tenant-loading states, and routine-panel's routines/trace/runs/tasks panels.
  • Fixed the empty-agent-DM bug behind the ticket's screenshot: settingUpAgent never actually checked whether the agent had joined, so an empty agent DM could only ever render the setup loader, forever. It now clears once the agent participant appears, and a ready-but-empty agent DM leads with the agent's own name ("Say hello to Myra") instead of generic copy.
  • Files/Skills/Agents pages already had designed RichEmptyState treatments with a primary action — left untouched.

Before/after inventory

Surface Before After
Route-level Suspense fallback (app-shell.tsx) bare <div className="page-fill" aria-busy> WorkbenchLoadingState
chat-workspace: workbench list load <Skeleton className="query-skeleton"> WorkbenchLoadingState
chat-workspace: message timeline load <Skeleton className="query-skeleton"> WorkbenchLoadingState
chat-workspace: tenant resolving <Skeleton className="query-skeleton"> WorkbenchLoadingState
routine-panel: routines/trace/runs/tasks (x4) <Skeleton className="query-skeleton"> WorkbenchLoadingState with a per-panel title
Agent DM, zero messages, agent still launching setup loader unchanged (correct)
Agent DM, zero messages, agent already joined stuck on setup loader forever "Say hello to {agent}" empty state
Empty workbench room EmptyState "No messages yet / Say something…" unchanged (already designed)
Files / Skills / Agents pages, empty RichEmptyState with description (+ action on Skills) unchanged (already designed)
Sidebar workbench-switcher load <Skeleton className="shell-activity-skeleton"> (6rem nav strip) left as-is — small nav slot, out of scope for the page/room-level treatment
library-page / insights-page content skeletons Skeleton sized to match final row/card layout left as-is — content-shaped, matches the "exactly matches final layout" exception

Test plan

  • packages/chat-ui: bun run typecheck and bun test (590 pass)
  • apps/web: bun run typecheck and bun run test (build + 578 pass)
  • bun run check:ui-vocabulary — clean
  • prettier + eslint on touched files — clean

Every page/room-level wait now renders the same shared treatment CL-6307
shipped for workbench setup — one honest headline plus a rotating tip,
never a bare Skeleton slab. Extracted that markup out of timeline.tsx
into chat-ui's new WorkbenchLoadingState (with a title override for
non-workbench surfaces and a delay threshold so a sub-200ms resolve
never flashes an intermediate frame) and reused it for:

- the route-level Suspense fallback in app-shell.tsx (was a bare
  page-fill div)
- chat-workspace's workbench-list, message-timeline, and tenant-loading
  states (were bare Skeleton slabs — the source of the "grey rectangle"
  on opening a workbench)
- routine-panel's routines/trace/runs/tasks panels (were bare Skeleton
  slabs)

Also fixes the empty-agent-DM "blank void": settingUpAgent was
permanently true for every agent chat (it never checked whether the
agent had actually joined), so an agent DM with zero messages could
never show anything but the setup loader. It now clears once the agent
participant appears, and a genuinely empty-but-ready agent DM leads
with the agent's own name ("Say hello to Myra") instead of generic
timeline copy.

Files/Skills/Agents pages already had designed RichEmptyState
treatments with a primary action, so those were left alone.
@TheGreatAxios
TheGreatAxios merged commit f8ce309 into main Aug 20, 2026
0 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant