feat(agent): agent workspace with vertical rail and settings navigator (CLEAN-36) - #41
Merged
Merged
Conversation
…r (CLEAN-36) Admin: the agents table is gone. /agents resolves to the Ranch admin agent and redirects to its canonical address. A vertical rail of agents sits on the left, the chat keeps the pod logs beside it in the middle, and the eight settings sections move into a narrow navigator on the right — opening one renders it on the canvas in place of the conversation, at the width it already had, so none of the eight components changed. App: the card grid is replaced by the same rail; no settings panel. The last opened agent is remembered per browser and validated against the visible list. The conversation is hidden with v-show rather than unmounted, so returning from a section costs no reconnect and keeps the transcript. The per-agent remount key sits on the workspace's middle column, not the page, so the rail survives an agent switch without refetching. No API change. Admin primary navigation untouched. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…EAN-36) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… (CLEAN-36) The right-hand navigator is replaced by a tab bar under the agent header: Chat, Overview, Knowledge, Files, Channels and Logs are always on screen with their counts inline, and the remaining four fold into a More menu that relabels itself when one of them is open. It costs a row of height instead of a column of width. The navigator spent 320px permanently on navigation and squeezed the chat and logs into a narrower column than they needed; nothing about the layout needs that trade. Logs gains a full-width tab of its own while staying beside the conversation on the Chat tab — the two are read differently. Only one is live at a time: the chat passes `active` down so its side panel stops polling behind the full-width view. Lifecycle actions move back into the header as buttons (stop/start, restart, edit). Delete sits one level down behind an overflow menu and a confirm — it is the only irreversible action in that row. `?tab=chat` is a valid value again and is the default, so it normalises out of the URL; every other legacy value is unchanged. `?tab=logs` is new. The panel's open/closed preference is gone with the panel — nothing left to remember. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…AN-36) "New agent" and the cluster-capacity line move out of the workspace's top row and into the rail's footer, pinned to the floor. Creating an agent belongs with the list of agents, and the capacity number is what answers "can I, right now?" — it belongs with the action it qualifies rather than in a row of its own. That empties the top row entirely, so it goes: on desktop the workspace gains a row of height back for the canvas, and what remains is a lg:hidden button for reaching the rail on screens too narrow to dock it. TopBar.vue is deleted. Both consoles, same treatment. In app the footer stays behind the existing Owner/Admin rule, so a plain user sees neither the button nor the capacity — and still never triggers the Owner/Admin-only capacity endpoint. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Resolve rename/delete conflicts from the CLEAN-45 component nesting:
- agent/list/{Card,Provider}.vue deleted — the PR removes the card grid
- agentList/Card.vue continues as the workspace RailItem
- new workspace components moved to agent/workspace/ to follow CLEAN-45
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes CLEAN-36.
Both consoles used to make you pass through an index screen before doing the one thing you came for — talk to an agent. In
adminthat was a table; inapp, a grid of cards. Inside an agent,adminthen spent a whole column on nine settings tabs sitting permanently next to the chat.What changes
Admin — the agents table is deleted outright.
/agentsis now a resolver: it picks the Ranch admin ("rancher") agent, falls back to the most recently updated, and redirects to the canonical/agents/:id. The screen becomes three parts:App — the card grid is replaced by the same rail. No settings panel; management stays in admin. The last opened agent is remembered per browser and validated against the visible list, so a deleted or newly-hidden agent is a non-event rather than a dead landing.
The decision worth reviewing
Clicking a section renders it on the canvas, in place of the conversation — not inside the panel. The panel navigates; it does not contain.
That was the second design. The first put the sections in an accordion inside the panel, which would have meant redesigning Files (tree + editor), Paddock and Environment to fit ~400px. Rendering on the canvas gives them roughly the width they already have, so none of the eight section components changed — no markup, no styles. Worth verifying that claim against the diff; it is the main reason this PR is as small as it is.
Two invariants hold it together:
v-show, neverv-if. Unmounting would drop the websocket, the transcript, the scroll position and the restart overlay state, so returning from a section would cost a reconnect.:keysits on the workspace's middle column, not on the page. On the page it would remount the rail on every switch, refetching the agent list and flashing the column.Layout
Chat and logs both carried a hard 400px minimum — an 812px floor for the pair. Once the rail took its 272px, a narrower container simply overflowed and the layout's
overflow-x-clipate the chat card's right border. The floor is now gated on there being room for it (min-[1400px]); below that both halves shrink together and stay fully visible. The settings panel takes real space rather than floating, because floating covered the logs.The workspace measures its available height instead of subtracting a hard-coded chrome value — the earlier constant broke silently when the layout's padding changed from
p-6top-3.Not in scope
No API change, no new DTO, no new UI dependency. The admin primary sidebar is untouched — the visual reference does not draw it, which is an artefact of the mockup rather than an instruction.
Verification
bun run typecheckbun run i18n:checkadmin/appproduction buildThe typecheck gate was itself verified with deliberate probe errors in a
.tsfile and in a.vuetemplate — both were caught. The builds resolve every auto-imported component, so the wiring is checked.What is not checked is anything only a browser shows: layout at each breakpoint, the chat surviving a section round trip without a reconnect, the rail not refetching on switch, and
?tab=deep links.specs/006-agent-workspace-tabs/quickstart.mdhas the 18-step walkthrough mapped to requirement ids — please run it before merging.🤖 Generated with Claude Code