feat(robomp): replace status tables with lifecycle cards

This commit is contained in:
lycaon
2026-06-17 21:23:23 -06:00
parent 159b8a1c63
commit 107302adcf
33 changed files with 4528 additions and 620 deletions
@@ -0,0 +1,20 @@
import { type JSX } from "solid-js";
import { runTrigger } from "../../state";
import { Events } from "../Events";
import { Logs } from "../Logs";
// Activity (investigate mode). Full history table + full-height log stream.
// Logs finally get real vertical room.
export function Activity(): JSX.Element {
const handleRetry = (deliveryId: string): void => {
void runTrigger({ mode: "retry", delivery_id: deliveryId });
};
return (
<>
<Events onRetry={handleRetry} />
<Logs />
</>
);
}
@@ -0,0 +1,19 @@
import { type JSX } from "solid-js";
import { Pipeline } from "../Pipeline";
import { Trigger } from "../Trigger";
// Operations (default landing view). A single unified pipeline: a slim
// trigger command row on top, then every active work item drawn as a
// lifecycle card (failed first, running live). Replaces the old three-table
// layout (working / needs-attention / active-issues) — Pipeline derives all
// three states from one status poll. Read-only collapses the trigger to a
// chip; the cards lose their retry/cancel actions.
export function Operations(): JSX.Element {
return (
<>
<Trigger variant="bar" />
<Pipeline />
</>
);
}
@@ -0,0 +1,50 @@
import { type JSX, Show } from "solid-js";
import { CONFIG } from "../../config";
import { Browse } from "../Browse";
import { GlassCard } from "../GlassCard";
import { Trigger } from "../Trigger";
// Triage (act mode). Full trigger form + issue browser. When replay is off,
// renders ONE composed first-run panel (env + what unlocks) instead of two
// large disabled cards. The rail marks this nav item locked + dimmed.
export function Triage(): JSX.Element {
return (
<Show
when={CONFIG.replayEnabled}
fallback={<FirstRunPanel />}
>
<Trigger variant="panel" />
<Browse />
</Show>
);
}
function FirstRunPanel(): JSX.Element {
return (
<GlassCard heading="triage" accessory={<span class="rmp-readonly-chip">locked</span>}>
<div class="rmp-firstrun">
<div class="rmp-firstrun-head">
<span class="rmp-readonly-chip">read-only</span>
<h3 class="rmp-firstrun-title">manual actions are disabled</h3>
</div>
<p class="rmp-firstrun-body">
Triage and retry let you drive the bot by hand — fetch a fresh issue, re-run a failed
delivery, or browse the open backlog. These actions are gated behind a server-side
replay token so the dashboard is safe to expose read-only.
</p>
<ul class="rmp-firstrun-steps">
<li>
set <code>ROBOMP_REPLAY_TOKEN</code> in the robomp server environment
</li>
<li>restart the server so the token is loaded</li>
<li>reload — the Operations trigger bar and this Triage view unlock</li>
</ul>
<p class="rmp-firstrun-note">
Monitoring stays fully live: Operations and Activity read the same 3s poll regardless of
this setting.
</p>
</div>
</GlassCard>
);
}