feat(web): extract /agents/{live,roster,config,sessions,json} sub-routes #1017

Closed
opened 2026-05-09 18:18:25 +00:00 by claude-desktop · 18 comments
Collaborator

As an operator,
I want the /agents page broken into per-facet sub-routes,
so that each agent concern (live runs, roster, config, sessions, JSON) is deep-linkable and the upcoming sidebar can target each one directly without an internal <Tabs> host.

This is the route-extract step before the sidebar visual cutover. No nav surface changes here — the existing top-bar nav stays put.

Acceptance criteria

Routes

  • /agents/live route file added (initially renders the same content as /fleet — components shared, no duplication).
  • /agents/roster route file added (extracts current <AgentsTabs> "Fleet" tab content — types tree + instance master-detail).
  • /agents/config route file added (extracts current "Globals" tab — pipeline / watchdog / dead-letter recovery).
  • /agents/sessions route file added (sessions list, currently /settings/agents/sessions; redirect old path).
  • /agents/json route file added (extracts current "JSON" raw textarea fallback).
  • Bare /agents redirects to /agents/live (operator-relevant landing).

Layout

  • agents.tsx becomes a layout route — renders shared header + repo selector + <Outlet />.
  • Internal <Tabs> removed from agents.tsx.

Tests

  • Each new route has a smoke test that mounts and asserts the primary heading.
  • Existing /agents test split into per-route suites; nothing regresses.

Out of scope

  • Removing /fleet or redirecting it (#nav-v2-2).
  • New sidebar component (#nav-v2-5).
  • Visual nav-bar changes — top-bar stays exactly as it is.

References

  • Spec: docs/specs/nav-consolidation.md § Route changes.
  • Current internal tabs host: apps/web/src/routes/agents.index.tsx:73-77.
**As an** operator, **I want** the `/agents` page broken into per-facet sub-routes, **so that** each agent concern (live runs, roster, config, sessions, JSON) is deep-linkable and the upcoming sidebar can target each one directly without an internal `<Tabs>` host. This is the route-extract step before the sidebar visual cutover. No nav surface changes here — the existing top-bar nav stays put. ## Acceptance criteria ### Routes - [ ] `/agents/live` route file added (initially renders the same content as `/fleet` — components shared, no duplication). - [ ] `/agents/roster` route file added (extracts current `<AgentsTabs>` "Fleet" tab content — types tree + instance master-detail). - [ ] `/agents/config` route file added (extracts current "Globals" tab — pipeline / watchdog / dead-letter recovery). - [ ] `/agents/sessions` route file added (sessions list, currently `/settings/agents/sessions`; redirect old path). - [ ] `/agents/json` route file added (extracts current "JSON" raw textarea fallback). - [ ] Bare `/agents` redirects to `/agents/live` (operator-relevant landing). ### Layout - [ ] `agents.tsx` becomes a layout route — renders shared header + repo selector + `<Outlet />`. - [ ] Internal `<Tabs>` removed from `agents.tsx`. ### Tests - [ ] Each new route has a smoke test that mounts and asserts the primary heading. - [ ] Existing `/agents` test split into per-route suites; nothing regresses. ## Out of scope - Removing `/fleet` or redirecting it (#nav-v2-2). - New sidebar component (#nav-v2-5). - Visual nav-bar changes — top-bar stays exactly as it is. ## References - Spec: `docs/specs/nav-consolidation.md` § Route changes. - Current internal tabs host: `apps/web/src/routes/agents.index.tsx:73-77`.
claude-desktop added this to the nav-v2 milestone 2026-05-09 18:18:25 +00:00
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Author
Collaborator

FYI scope unchanged — keep routes/fleet.tsx alone here. Just noting that the related #1019 (redirect + deprecation toast) was closed: operator policy is no compat bridges. /fleet will be deleted outright in a follow-up cleanup ticket once /agents/live lands. Do not add a redirect, sessionStorage suppression, or any if (legacy) → new shim to this PR.

FYI scope unchanged — keep `routes/fleet.tsx` alone here. Just noting that the related #1019 (redirect + deprecation toast) was closed: operator policy is no compat bridges. `/fleet` will be deleted outright in a follow-up cleanup ticket once `/agents/live` lands. Do **not** add a redirect, sessionStorage suppression, or any `if (legacy) → new` shim to this PR.
Collaborator

🧹 janitor: this ticket has been idle-assigned since 2026-05-09T20:47:00.000Z. Re-dispatching.

🧹 janitor: this ticket has been idle-assigned since 2026-05-09T20:47:00.000Z. Re-dispatching.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🧹 janitor: this ticket has been idle-assigned since 2026-05-09T22:00:41.000Z. Re-dispatching.

🧹 janitor: this ticket has been idle-assigned since 2026-05-09T22:00:41.000Z. Re-dispatching.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Sign in to join this conversation.
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/claude-hooks#1017
No description provided.