From 74e588415b82e1dc61cf6fb2bd74cf6a91d215ec Mon Sep 17 00:00:00 2001 From: iris Date: Mon, 12 Oct 2026 00:02:15 +0200 Subject: [PATCH] swarm-ui: split pages/agents into two pages and the agent components pages/agents held the roster page, the terminal page and every component under them. It keeps the two pages; the components move to src/agent, by concern: roster (card, wanted menu, actions), detail (panel body, dialog, inference, linked accounts, link menu) and terminal (preview, input, subagents, stream hooks, favicon), with the shared row type and icon at the top. Moves and import rewrites only. --- .../src/{pages/agents => agent}/AgentIcon.css | 0 .../src/{pages/agents => agent}/AgentIcon.tsx | 0 .../src/{pages/agents => agent}/AgentTypes.ts | 0 .../{pages/agents => agent/detail}/AgentDetail.css | 0 .../{pages/agents => agent/detail}/AgentDetail.tsx | 10 +++++----- .../agents => agent/detail}/AgentDetailDialog.tsx | 4 ++-- .../{pages/agents => agent/detail}/AgentInference.css | 0 .../{pages/agents => agent/detail}/AgentInference.tsx | 0 .../agents => agent/detail}/LinkAccountMenu.tsx | 0 .../{pages/agents => agent/detail}/LinkedAccounts.css | 0 .../{pages/agents => agent/detail}/LinkedAccounts.tsx | 0 .../{pages/agents => agent/roster}/AgentActions.tsx | 10 +++++----- .../src/{pages/agents => agent/roster}/AgentCard.css | 0 .../src/{pages/agents => agent/roster}/AgentCard.tsx | 4 ++-- .../src/{pages/agents => agent/roster}/WantedMenu.tsx | 2 +- .../agents => agent/terminal}/AgentInputForm.css | 0 .../agents => agent/terminal}/AgentInputForm.tsx | 0 .../agents => agent/terminal}/AgentTermPreview.css | 0 .../agents => agent/terminal}/AgentTermPreview.tsx | 0 .../agents => agent/terminal}/SubagentTerms.css | 0 .../agents => agent/terminal}/SubagentTerms.tsx | 0 .../src/{shell => agent/terminal}/useAgentFavicon.ts | 0 .../terminal}/useSwarmAgentStateStream.ts | 0 .../agents => agent/terminal}/useSwarmTermStream.ts | 0 .../swarm-ui/src/pages/agents/AgentTerminalPage.tsx | 11 +++++++---- .../packages/swarm-ui/src/pages/agents/AgentsPage.tsx | 10 +++++----- .../swarm-ui/src/pages/schedules/SchedulesPage.tsx | 2 +- 27 files changed, 28 insertions(+), 25 deletions(-) rename frontend/packages/swarm-ui/src/{pages/agents => agent}/AgentIcon.css (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent}/AgentIcon.tsx (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent}/AgentTypes.ts (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/detail}/AgentDetail.css (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/detail}/AgentDetail.tsx (93%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/detail}/AgentDetailDialog.tsx (96%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/detail}/AgentInference.css (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/detail}/AgentInference.tsx (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/detail}/LinkAccountMenu.tsx (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/detail}/LinkedAccounts.css (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/detail}/LinkedAccounts.tsx (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/roster}/AgentActions.tsx (96%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/roster}/AgentCard.css (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/roster}/AgentCard.tsx (97%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/roster}/WantedMenu.tsx (99%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/terminal}/AgentInputForm.css (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/terminal}/AgentInputForm.tsx (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/terminal}/AgentTermPreview.css (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/terminal}/AgentTermPreview.tsx (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/terminal}/SubagentTerms.css (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/terminal}/SubagentTerms.tsx (100%) rename frontend/packages/swarm-ui/src/{shell => agent/terminal}/useAgentFavicon.ts (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/terminal}/useSwarmAgentStateStream.ts (100%) rename frontend/packages/swarm-ui/src/{pages/agents => agent/terminal}/useSwarmTermStream.ts (100%) diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentIcon.css b/frontend/packages/swarm-ui/src/agent/AgentIcon.css similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/AgentIcon.css rename to frontend/packages/swarm-ui/src/agent/AgentIcon.css diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentIcon.tsx b/frontend/packages/swarm-ui/src/agent/AgentIcon.tsx similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/AgentIcon.tsx rename to frontend/packages/swarm-ui/src/agent/AgentIcon.tsx diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentTypes.ts b/frontend/packages/swarm-ui/src/agent/AgentTypes.ts similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/AgentTypes.ts rename to frontend/packages/swarm-ui/src/agent/AgentTypes.ts diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentDetail.css b/frontend/packages/swarm-ui/src/agent/detail/AgentDetail.css similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/AgentDetail.css rename to frontend/packages/swarm-ui/src/agent/detail/AgentDetail.css diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentDetail.tsx b/frontend/packages/swarm-ui/src/agent/detail/AgentDetail.tsx similarity index 93% rename from frontend/packages/swarm-ui/src/pages/agents/AgentDetail.tsx rename to frontend/packages/swarm-ui/src/agent/detail/AgentDetail.tsx index ad7d67eb..3f864178 100644 --- a/frontend/packages/swarm-ui/src/pages/agents/AgentDetail.tsx +++ b/frontend/packages/swarm-ui/src/agent/detail/AgentDetail.tsx @@ -9,14 +9,14 @@ import { ApiErrorPanel } from "@hive/shared/api-error-panel.js"; import { Badge } from "@hive/shared/badge.js"; import { RelativeTime } from "../../ui/relative-time/RelativeTime.js"; -import type { AgentActions } from "./AgentActions.js"; +import type { AgentActions } from "../roster/AgentActions.js"; import { AgentInference } from "./AgentInference.js"; -import { AgentTermPreview } from "./AgentTermPreview.js"; -import { FRESHNESS, type AgentRow } from "./AgentTypes.js"; +import { AgentTermPreview } from "../terminal/AgentTermPreview.js"; +import { FRESHNESS, type AgentRow } from "../AgentTypes.js"; import { LinkAccountMenu } from "./LinkAccountMenu.js"; import { LinkedAccounts } from "./LinkedAccounts.js"; -import { SubagentTerms } from "./SubagentTerms.js"; -import { WantedMenu } from "./WantedMenu.js"; +import { SubagentTerms } from "../terminal/SubagentTerms.js"; +import { WantedMenu } from "../roster/WantedMenu.js"; import "./AgentDetail.css"; export function AgentDetail({ diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentDetailDialog.tsx b/frontend/packages/swarm-ui/src/agent/detail/AgentDetailDialog.tsx similarity index 96% rename from frontend/packages/swarm-ui/src/pages/agents/AgentDetailDialog.tsx rename to frontend/packages/swarm-ui/src/agent/detail/AgentDetailDialog.tsx index acf5c630..4fa49980 100644 --- a/frontend/packages/swarm-ui/src/pages/agents/AgentDetailDialog.tsx +++ b/frontend/packages/swarm-ui/src/agent/detail/AgentDetailDialog.tsx @@ -12,9 +12,9 @@ import { ApiErrorPanel } from "@hive/shared/api-error-panel.js"; import { readApiError, type ProblemDetails } from "@hive/shared/api-error.js"; import { Dialog } from "../../ui/dialog/Dialog.js"; import { Panel } from "../../ui/panel/Panel.js"; -import { useAgentActions } from "./AgentActions.js"; +import { useAgentActions } from "../roster/AgentActions.js"; import { AgentDetail } from "./AgentDetail.js"; -import type { AgentRow } from "./AgentTypes.js"; +import type { AgentRow } from "../AgentTypes.js"; export function AgentDetailDialog({ agent, diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentInference.css b/frontend/packages/swarm-ui/src/agent/detail/AgentInference.css similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/AgentInference.css rename to frontend/packages/swarm-ui/src/agent/detail/AgentInference.css diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentInference.tsx b/frontend/packages/swarm-ui/src/agent/detail/AgentInference.tsx similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/AgentInference.tsx rename to frontend/packages/swarm-ui/src/agent/detail/AgentInference.tsx diff --git a/frontend/packages/swarm-ui/src/pages/agents/LinkAccountMenu.tsx b/frontend/packages/swarm-ui/src/agent/detail/LinkAccountMenu.tsx similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/LinkAccountMenu.tsx rename to frontend/packages/swarm-ui/src/agent/detail/LinkAccountMenu.tsx diff --git a/frontend/packages/swarm-ui/src/pages/agents/LinkedAccounts.css b/frontend/packages/swarm-ui/src/agent/detail/LinkedAccounts.css similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/LinkedAccounts.css rename to frontend/packages/swarm-ui/src/agent/detail/LinkedAccounts.css diff --git a/frontend/packages/swarm-ui/src/pages/agents/LinkedAccounts.tsx b/frontend/packages/swarm-ui/src/agent/detail/LinkedAccounts.tsx similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/LinkedAccounts.tsx rename to frontend/packages/swarm-ui/src/agent/detail/LinkedAccounts.tsx diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentActions.tsx b/frontend/packages/swarm-ui/src/agent/roster/AgentActions.tsx similarity index 96% rename from frontend/packages/swarm-ui/src/pages/agents/AgentActions.tsx rename to frontend/packages/swarm-ui/src/agent/roster/AgentActions.tsx index b783bbe2..3b041c7b 100644 --- a/frontend/packages/swarm-ui/src/pages/agents/AgentActions.tsx +++ b/frontend/packages/swarm-ui/src/agent/roster/AgentActions.tsx @@ -15,11 +15,11 @@ import type { ComponentChildren } from "preact"; import { readApiError, type ProblemDetails } from "@hive/shared/api-error.js"; import { ConfirmDialog } from "../../ui/confirm-dialog/ConfirmDialog.js"; import { Dialog } from "../../ui/dialog/Dialog.js"; -import { LinkMatrixAccountForm } from "../LinkMatrixAccountForm.js"; -import { LinkForgeAccountForm } from "../LinkForgeAccountForm.js"; -import { LinkGithubAccountForm } from "../LinkGithubAccountForm.js"; -import type { AgentRow } from "./AgentTypes.js"; -import type { LinkKind } from "./LinkAccountMenu.js"; +import { LinkMatrixAccountForm } from "../../pages/LinkMatrixAccountForm.js"; +import { LinkForgeAccountForm } from "../../pages/LinkForgeAccountForm.js"; +import { LinkGithubAccountForm } from "../../pages/LinkGithubAccountForm.js"; +import type { AgentRow } from "../AgentTypes.js"; +import type { LinkKind } from "../detail/LinkAccountMenu.js"; // The one thing that differs between the "offline" and "paused" confirm // dialogs `confirmTarget` drives — everything else (button row, open/close diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentCard.css b/frontend/packages/swarm-ui/src/agent/roster/AgentCard.css similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/AgentCard.css rename to frontend/packages/swarm-ui/src/agent/roster/AgentCard.css diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentCard.tsx b/frontend/packages/swarm-ui/src/agent/roster/AgentCard.tsx similarity index 97% rename from frontend/packages/swarm-ui/src/pages/agents/AgentCard.tsx rename to frontend/packages/swarm-ui/src/agent/roster/AgentCard.tsx index b046e4be..c66d244b 100644 --- a/frontend/packages/swarm-ui/src/pages/agents/AgentCard.tsx +++ b/frontend/packages/swarm-ui/src/agent/roster/AgentCard.tsx @@ -16,8 +16,8 @@ import { Badge } from "@hive/shared/badge.js"; import type { ProblemDetails } from "@hive/shared/api-error.js"; import { Card } from "../../ui/card/Card.js"; import { RelativeTime } from "../../ui/relative-time/RelativeTime.js"; -import { AgentIcon } from "./AgentIcon.js"; -import { FRESHNESS, type AgentRow } from "./AgentTypes.js"; +import { AgentIcon } from "../AgentIcon.js"; +import { FRESHNESS, type AgentRow } from "../AgentTypes.js"; import { WantedMenu } from "./WantedMenu.js"; import "./AgentCard.css"; diff --git a/frontend/packages/swarm-ui/src/pages/agents/WantedMenu.tsx b/frontend/packages/swarm-ui/src/agent/roster/WantedMenu.tsx similarity index 99% rename from frontend/packages/swarm-ui/src/pages/agents/WantedMenu.tsx rename to frontend/packages/swarm-ui/src/agent/roster/WantedMenu.tsx index 825679a8..4b491514 100644 --- a/frontend/packages/swarm-ui/src/pages/agents/WantedMenu.tsx +++ b/frontend/packages/swarm-ui/src/agent/roster/WantedMenu.tsx @@ -20,7 +20,7 @@ import { useRef, useState } from "preact/hooks"; import { Badge, type BadgeTone } from "@hive/shared/badge.js"; import { Dropdown, type DropdownOption } from "@hive/shared/dropdown.js"; -import type { AgentRow } from "./AgentTypes.js"; +import type { AgentRow } from "../AgentTypes.js"; export function WantedMenu({ row, diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentInputForm.css b/frontend/packages/swarm-ui/src/agent/terminal/AgentInputForm.css similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/AgentInputForm.css rename to frontend/packages/swarm-ui/src/agent/terminal/AgentInputForm.css diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentInputForm.tsx b/frontend/packages/swarm-ui/src/agent/terminal/AgentInputForm.tsx similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/AgentInputForm.tsx rename to frontend/packages/swarm-ui/src/agent/terminal/AgentInputForm.tsx diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentTermPreview.css b/frontend/packages/swarm-ui/src/agent/terminal/AgentTermPreview.css similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/AgentTermPreview.css rename to frontend/packages/swarm-ui/src/agent/terminal/AgentTermPreview.css diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentTermPreview.tsx b/frontend/packages/swarm-ui/src/agent/terminal/AgentTermPreview.tsx similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/AgentTermPreview.tsx rename to frontend/packages/swarm-ui/src/agent/terminal/AgentTermPreview.tsx diff --git a/frontend/packages/swarm-ui/src/pages/agents/SubagentTerms.css b/frontend/packages/swarm-ui/src/agent/terminal/SubagentTerms.css similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/SubagentTerms.css rename to frontend/packages/swarm-ui/src/agent/terminal/SubagentTerms.css diff --git a/frontend/packages/swarm-ui/src/pages/agents/SubagentTerms.tsx b/frontend/packages/swarm-ui/src/agent/terminal/SubagentTerms.tsx similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/SubagentTerms.tsx rename to frontend/packages/swarm-ui/src/agent/terminal/SubagentTerms.tsx diff --git a/frontend/packages/swarm-ui/src/shell/useAgentFavicon.ts b/frontend/packages/swarm-ui/src/agent/terminal/useAgentFavicon.ts similarity index 100% rename from frontend/packages/swarm-ui/src/shell/useAgentFavicon.ts rename to frontend/packages/swarm-ui/src/agent/terminal/useAgentFavicon.ts diff --git a/frontend/packages/swarm-ui/src/pages/agents/useSwarmAgentStateStream.ts b/frontend/packages/swarm-ui/src/agent/terminal/useSwarmAgentStateStream.ts similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/useSwarmAgentStateStream.ts rename to frontend/packages/swarm-ui/src/agent/terminal/useSwarmAgentStateStream.ts diff --git a/frontend/packages/swarm-ui/src/pages/agents/useSwarmTermStream.ts b/frontend/packages/swarm-ui/src/agent/terminal/useSwarmTermStream.ts similarity index 100% rename from frontend/packages/swarm-ui/src/pages/agents/useSwarmTermStream.ts rename to frontend/packages/swarm-ui/src/agent/terminal/useSwarmTermStream.ts diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentTerminalPage.tsx b/frontend/packages/swarm-ui/src/pages/agents/AgentTerminalPage.tsx index edd4b290..501647e1 100644 --- a/frontend/packages/swarm-ui/src/pages/agents/AgentTerminalPage.tsx +++ b/frontend/packages/swarm-ui/src/pages/agents/AgentTerminalPage.tsx @@ -12,10 +12,13 @@ import { useEffect, useState } from "preact/hooks"; import type { RouteComponentProps } from "wouter-preact"; import { Badge } from "@hive/shared/badge.js"; -import { AgentDetailDialog } from "./AgentDetailDialog.js"; -import { AgentIcon } from "./AgentIcon.js"; -import { AgentTermPreview, termPaths } from "./AgentTermPreview.js"; -import { useAgentFavicon } from "../../shell/useAgentFavicon.js"; +import { AgentDetailDialog } from "../../agent/detail/AgentDetailDialog.js"; +import { AgentIcon } from "../../agent/AgentIcon.js"; +import { + AgentTermPreview, + termPaths, +} from "../../agent/terminal/AgentTermPreview.js"; +import { useAgentFavicon } from "../../agent/terminal/useAgentFavicon.js"; import { useDynamicTabs } from "../../shell/useDynamicTabs.js"; import "./AgentTerminalPage.css"; diff --git a/frontend/packages/swarm-ui/src/pages/agents/AgentsPage.tsx b/frontend/packages/swarm-ui/src/pages/agents/AgentsPage.tsx index f43264b1..c082db11 100644 --- a/frontend/packages/swarm-ui/src/pages/agents/AgentsPage.tsx +++ b/frontend/packages/swarm-ui/src/pages/agents/AgentsPage.tsx @@ -31,10 +31,10 @@ import { ApiErrorPanel } from "@hive/shared/api-error-panel.js"; import { readApiError, type ProblemDetails } from "@hive/shared/api-error.js"; import { Badge } from "@hive/shared/badge.js"; import { LinkIcon } from "@hive/shared/icons.js"; -import { useAgentActions } from "./AgentActions.js"; -import { AgentCard } from "./AgentCard.js"; -import { AgentDetail } from "./AgentDetail.js"; -import { FRESHNESS, type AgentRow } from "./AgentTypes.js"; +import { useAgentActions } from "../../agent/roster/AgentActions.js"; +import { AgentCard } from "../../agent/roster/AgentCard.js"; +import { AgentDetail } from "../../agent/detail/AgentDetail.js"; +import { FRESHNESS, type AgentRow } from "../../agent/AgentTypes.js"; import { Button } from "../../ui/button/Button.js"; import { Dialog } from "../../ui/dialog/Dialog.js"; import { FilterableView } from "../../ui/filterable-view/FilterableView.js"; @@ -48,7 +48,7 @@ import { import { SplitView } from "../../ui/split-view/SplitView.js"; import { type TableColumn } from "../../ui/table/Table.js"; import { CreateAgentForm } from "../CreateAgentForm.js"; -import { WantedMenu } from "./WantedMenu.js"; +import { WantedMenu } from "../../agent/roster/WantedMenu.js"; import "./AgentsPage.css"; // Same 30s default + same reasoning as HivesPage: no inputs on this page diff --git a/frontend/packages/swarm-ui/src/pages/schedules/SchedulesPage.tsx b/frontend/packages/swarm-ui/src/pages/schedules/SchedulesPage.tsx index 2fbae2d2..247a53c1 100644 --- a/frontend/packages/swarm-ui/src/pages/schedules/SchedulesPage.tsx +++ b/frontend/packages/swarm-ui/src/pages/schedules/SchedulesPage.tsx @@ -22,7 +22,7 @@ import { type RefreshIntervalMs, } from "../../ui/refresh-interval/RefreshInterval.js"; import type { TableColumn } from "../../ui/table/Table.js"; -import type { AgentRow } from "../agents/AgentTypes.js"; +import type { AgentRow } from "../../agent/AgentTypes.js"; import { ScheduleCard } from "./ScheduleCard.js"; import { ScheduleForm } from "./ScheduleForm.js"; import { scheduleState, type Schedule } from "./ScheduleTypes.js";