Watch
0
0
Fork
You've already forked hyperhive
0

swarm-ui: a schedules page, one card per scheduled prompt

/schedules lists the controller's scheduled prompts as cards: name as the
title, the agents it fires for, the message, its cadence and next fire.
Edit turns a card into its own form; pause, resume and remove act in place,
and + schedule opens an empty form. The form sends only what changed, so a
rename never moves the fire times, and warns when the start or the repeat
does. Filters reuse the shared card filter bar.

Adds a TextAreaField to the ui kit, and an upcoming mode on RelativeTime so
a next-fire time reads "in 5m". Needs the controller's /api/schedules
routes.
This commit is contained in:
iris 2026-10-04 17:03:33 +02:00 • committed by mara
commit 63ee6d12be
14 changed files with 931 additions and 3 deletions

View file

@ -9,14 +9,24 @@
// package's matrix-rain effect — and resyncs immediately on becoming
// visible again instead of waiting out the rest of a stale interval.
import { useEffect, useState } from "preact/hooks";
import { fmtAgo } from "../../util.js";
import { fmtAgo, fmtUntil } from "../../util.js";
// Cheap at the handful of rows/chips this renders for today, and coarse
// enough to be correct without visibly ticking every frame — the same
// choice a wall clock makes.
const TICK_MS = 1000;
export function RelativeTime({ epochMs }: { epochMs: number }) {
// `upcoming`: the instant is expected to be ahead (a schedule's next fire),
// so one still ahead reads "in 5m" instead of clamping to "0s ago". Off by
// default, so a caller showing an age never sees a skewed clock turn it
// into a countdown.
export function RelativeTime({
epochMs,
upcoming = false,
}: {
epochMs: number;
upcoming?: boolean;
}) {
const [now, setNow] = useState(() => Date.now());
useEffect(() => {
@ -43,5 +53,8 @@ export function RelativeTime({ epochMs }: { epochMs: number }) {
};
}, []);
return <>{fmtAgo((now - epochMs) / 1000)}</>;
const ageSeconds = (now - epochMs) / 1000;
return (
<>{upcoming && ageSeconds < 0 ? fmtUntil(-ageSeconds) : fmtAgo(ageSeconds)}</>
);
}