refactor(#2808): the wire state enum is the scheduler's own
`hive_host_sock::jobs::State` was a hand-maintained copy of `hive_jobq::State` — five variants spelled the same in both, kept in sync by whoever remembered. Adding `Skipped` last week meant adding it twice. The wire crate now re-exports the scheduler's enum and `to_wire_state` is gone. Two states that were hidden now reach clients. `to_wire_state` renamed `Pending` to `Queued` and folded `Finishing` into `Running`, so the dashboard could not distinguish a node waiting on its dependencies from one whose own work is done while its sub-nodes still run. Both are now visible, and consumers say which they mean. Every consumer had to move with it, and only the Rust ones said so: the exhaustive matches in `hivectl` and `DagView::rollup_state` failed to compile, while the dashboard's fourteen string comparisons would have gone quietly wrong — a `finishing` node no longer counting as running, a `pending` node no longer as queued. The frontend also builds CSS class names out of the state string (`rqe-` + state, `rqe-node-` + state) and keys its glyph map on it, all lowercase. Those go through a `stateSlug` helper now; comparisons use the wire spelling, presentation lowercases. Without that split every queue entry and node chip would have silently lost its styling. Dropping the `State as JobState` alias in hive-c0re falls out of this: the alias only existed to tell two `State` types apart, and there is one now.
This commit is contained in:
parent
6fd91ccf6a
commit
b9aab7e923
8 changed files with 72 additions and 93 deletions
|
|
@ -75,7 +75,7 @@ export function applyRebuildQueueChanged(ev) {
|
|||
function inFlightOpsByAgent() {
|
||||
const out = new Map();
|
||||
for (const e of rebuildQueueState) {
|
||||
if (e.state !== 'queued' && e.state !== 'running') continue;
|
||||
if (e.state !== 'Pending' && e.state !== 'Running') continue;
|
||||
// spawn ops target an agent that doesn't exist yet as a
|
||||
// container — the transient store already drives the
|
||||
// pending row for that case. Skip here to avoid double-
|
||||
|
|
@ -85,15 +85,15 @@ function inFlightOpsByAgent() {
|
|||
const perAgentState = new Map();
|
||||
for (const n of e.nodes || []) {
|
||||
if (!n.agent) continue;
|
||||
if (n.state !== 'queued' && n.state !== 'running') continue;
|
||||
if (n.state !== 'Pending' && n.state !== 'Running') continue;
|
||||
const cur = perAgentState.get(n.agent);
|
||||
if (!cur || (cur === 'queued' && n.state === 'running')) {
|
||||
if (!cur || (cur === 'Pending' && n.state === 'Running')) {
|
||||
perAgentState.set(n.agent, n.state);
|
||||
}
|
||||
}
|
||||
for (const [agent, state] of perAgentState) {
|
||||
const cur = out.get(agent);
|
||||
if (!cur || (cur.state === 'queued' && state === 'running')) {
|
||||
if (!cur || (cur.state === 'Pending' && state === 'Running')) {
|
||||
out.set(agent, { kind: e.kind, state });
|
||||
}
|
||||
}
|
||||
|
|
@ -774,10 +774,10 @@ export function renderContainers(s) {
|
|||
// running step is already visible per-agent on each card (transient +
|
||||
// in-flight-queue badges), so the top of the tab only needs the summary.
|
||||
const activeQueue = rebuildQueueState.filter(
|
||||
(e) => e.state === 'queued' || e.state === 'running',
|
||||
(e) => e.state === 'Pending' || e.state === 'Running',
|
||||
);
|
||||
if (activeQueue.length) {
|
||||
const running = activeQueue.filter((e) => e.state === 'running').length;
|
||||
const running = activeQueue.filter((e) => e.state === 'Running').length;
|
||||
const queued = activeQueue.length - running;
|
||||
const parts = [];
|
||||
if (running) parts.push(`${running} running`);
|
||||
|
|
@ -840,7 +840,7 @@ export function renderContainers(s) {
|
|||
const transientKind = transientsState.get(c.name)?.kind || null;
|
||||
const op = !transientKind ? inFlight.get(c.name) : null;
|
||||
const pending = transientKind
|
||||
|| (op && (op.state === 'running'
|
||||
|| (op && (op.state === 'Running'
|
||||
? (op.kind === 'meta_update' ? 'meta-updating'
|
||||
: op.kind === 'destroy' ? 'destroying'
|
||||
: op.kind === 'restart' ? 'restarting'
|
||||
|
|
@ -858,7 +858,7 @@ export function renderContainers(s) {
|
|||
: op.kind === 'reconcile' ? 'reconcile queued'
|
||||
: 'rebuild queued')));
|
||||
const opRunning = transientKind != null
|
||||
|| (op != null && op.state === 'running');
|
||||
|| (op != null && op.state === 'Running');
|
||||
const selected = selectionState.has(c.name);
|
||||
// Pending questions where this agent is the asker (awaiting an
|
||||
// answer) or the target (owes a reply). Derived live from
|
||||
|
|
|
|||
Loading…
Reference in a new issue