Skip to content

feat(agent): agent workspace with vertical rail and settings navigator (CLEAN-36) - #41

Merged
maksymhryzodub-prog merged 6 commits into
mainfrom
feat/CLEAN-36-agent-workspace-tabs
Aug 24, 2026
Merged

feat(agent): agent workspace with vertical rail and settings navigator (CLEAN-36)#41
maksymhryzodub-prog merged 6 commits into
mainfrom
feat/CLEAN-36-agent-workspace-tabs

Conversation

@maksymhryzodub-prog

@maksymhryzodub-prog maksymhryzodub-prog commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

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 admin that was a table; in app, a grid of cards. Inside an agent, admin then spent a whole column on nine settings tabs sitting permanently next to the chat.

What changes

Admin — the agents table is deleted outright. /agents is 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:

  • a vertical rail of agents on the left — avatar, name, live status, creation date, admin marker, plus a name search. No per-row actions: a rail entry picks an agent, it does not act on one.
  • the canvas in the middle — the chat with the pod logs beside it, at the sizes they already had.
  • a narrow settings navigator on the right, open by default, holding the agent's identity, the eight sections with their counts, and every lifecycle action the table's row menu used to carry (edit / start / stop / restart / delete).

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:

  • The chat is hidden with v-show, never v-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.
  • The per-agent remount :key sits 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-clip ate 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-6 to p-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

Gate
bun run typecheck ✅ 2/2
bun run i18n:check ✅ 175 keys, no undefined usages
admin / app production build
Manual walkthrough not run

The typecheck gate was itself verified with deliberate probe errors in a .ts file and in a .vue template — 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.md has the 18-step walkthrough mapped to requirement ids — please run it before merging.

🤖 Generated with Claude Code

maksymhryzodub-prog and others added 6 commits August 20, 2026 21:08
…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
@maksymhryzodub-prog
maksymhryzodub-prog merged commit 0edd662 into main Aug 24, 2026
1 check 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