Watch
0
0
Fork
You've already forked hyperhive
0

swarm-ui: the review classifier is a folded card on the jobs tab

The review tab is gone from the nav. Its page, unchanged inside, is a card on
/jobs that starts shut and reads nothing until opened; /review redirects to
/jobs. Docs follow.
This commit is contained in:
iris 2026-10-26 20:25:49 +01:00
commit 9ffd537aa2
5 changed files with 21 additions and 11 deletions

View file

@ -27,11 +27,10 @@ shut. A dropdown inside a dialog opens above the dialog and the dialog doesn't c
| `/agents/<name>/terminal` | one agent's live terminal |
| `/agents/<name>/subagents/<subagent>/terminal` | one of that agent's subagents' live terminal |
| `/alerts` | the alerts the swarm's Grafana holds now: the firing ones, with a button for the pending, no-data and error ones and a link to Grafana's own alert list; read through the controller with a Viewer service-account token |
| `/jobs` | the controller's job graph, where agent creation and credential mints show progress, and under it the swarm builder's recent builds of agent config PRs, with what nix printed when one failed |
| `/jobs` | the controller's job graph, where agent creation and credential mints show progress, and under it the swarm builder's recent builds of agent config PRs, with what nix printed when one failed, and the review classifier's recent runs, a try-out on a real PR, and its settings |
| `/messages` | the swarm-wide message feed: every message between agents, and to them from the operator, reminders and compaction, with a history window and a filter on sender or recipient; a folded **broadcast** card above the feed sends one message to more than one agent at once, and a folded **schedules** card holds the scheduled prompts: add, edit, pause, resume and remove |
| `/notifications` | the notification router's flows: a switch for each built-in, every flow drawn as a graph, and an editor for custom flows |
| `/issues` | a cross-repo issue report |
| `/review` | the review classifier: its recent runs, a try-out on a real PR, and its settings |
Everything it shows comes from [`swarm-controller`](../../swarm-controller/README.md).
Pages that refresh on a timer share one polling rule: the page sends no new
@ -115,11 +114,13 @@ its agent's details.
### Review
`/review` is the one page for the [review classifier](review-classifier.md),
with three sections in a column. **try a classification** and **classifier
The **review** card on the **jobs** tab is the one place for the
[review classifier](review-classifier.md), with three sections in a column. The
card starts shut and reads nothing until you open it; the old `/review` address
redirects to the jobs tab. **try a classification** and **classifier
settings** come first, each folded to a single bar: the bar of the settings
says what they're now, and what you typed in a section stays when you fold it.
**recent runs** is under them and always open. The sections share nothing and
**recent runs** is under them and is open with the card. The sections share nothing and
ask for their own data.
#### Recent runs

View file

@ -14,7 +14,6 @@ import { NotificationsPage } from "./pages/notifications/NotificationsPage.js";
import { ComponentsPage } from "./pages/ComponentsPage.js";
import { JobsPage } from "./pages/JobsPage.js";
import { IssueReportPage } from "./pages/IssueReportPage.js";
import { ReviewPage } from "./pages/review/ReviewPage.js";
import { StartPage } from "./pages/StartPage.js";
import { Panel } from "./ui/panel/Panel.js";
@ -58,7 +57,9 @@ export function App() {
</Route>
<Route path="/notifications/:flowId" component={FlowEditorPage} />
<Route path="/issues" component={IssueReportPage} />
<Route path="/review" component={ReviewPage} />
<Route path="/review">
<Redirect to="/jobs" replace />
</Route>
<Route path="/components" component={ComponentsPage} />
<Route component={NotFound} />
</Switch>

View file

@ -23,6 +23,7 @@ import { JobqGraph } from "@hive/shared/jobq-graph.js";
import { JobqRollup } from "@hive/shared/jobq-rollup.js";
import { LazyDisclosure } from "../ui/disclosure/LazyDisclosure.js";
import { BuildsCard } from "./builds/BuildsPage.js";
import { ReviewPage } from "./review/ReviewPage.js";
import {
RefreshIntervalPicker,
useRefreshInterval,
@ -65,8 +66,9 @@ function JobsBody() {
);
}
// The jobs tab holds two folded cards: the controller's job graph, and the swarm
// builder's recent builds under it. Neither reads anything until it is opened.
// The jobs tab holds three folded cards: the controller's job graph, the swarm
// builder's recent builds, and the review classifier's page. None reads
// anything until it is opened.
export function JobsPage() {
return (
<div class="ui-jobs-page">
@ -78,6 +80,13 @@ export function JobsPage() {
<JobsBody />
</LazyDisclosure>
<BuildsCard />
<LazyDisclosure
title="review"
icon="🔍"
hint="the review classifier: its recent runs, a try-out, its settings"
>
<ReviewPage />
</LazyDisclosure>
</div>
);
}

View file

@ -1,4 +1,4 @@
// <ReviewPage> — the review classifier on one page (`docs/swarm/ui.md`,
// <ReviewPage> — the review classifier, one card of the jobs tab (`docs/swarm/ui.md`,
// "Review"): the way to try a classification on a PR, the classifier's own
// settings, and the runs it has done. The first two fold, since they are
// used now and then and a folded header says what is in them; the runs are

View file

@ -56,7 +56,6 @@ const NAV_ITEMS: { href: string; label: string; accent: string }[] = [
{ href: "/messages", label: "messages", accent: "var(--purple)" },
{ href: "/notifications", label: "notifications", accent: "var(--yellow)" },
{ href: "/issues", label: "issues", accent: "var(--yellow)" },
{ href: "/review", label: "review", accent: "var(--amber)" },
{ href: "/components", label: "components", accent: "var(--blue)" },
];