Files
boocode/apps/control/src/services/fleet-state.ts
indifferentketchup b18de2a331 chore: snapshot working tree - pty_exited notifications + in-flight inference WIP
feat(booterm): structured pty_exited WS notifications. Plan-validated, impl-validated, code-reviewed green (contracts build clean, contracts test 29/29, booterm + web typecheck clean).

wip: in-progress inference/provider refactor (agents.ts, provider.ts, new llama-providers.ts, removed llama-args-validator), plus arena, dispatcher, compaction, schema changes.

openspec: pty-exit-notifications complete; x-agent-flags planned (not yet implemented).
2026-06-14 12:48:47 +00:00

90 lines
2.0 KiB
TypeScript

export interface HostConfig {
providerId: string;
baseUrl: string;
enabled: boolean;
}
export interface FleetState {
hosts: Map<string, HostState>;
}
export interface HostState {
providerId: string;
liveness: 'connected' | 'reconnecting' | 'down';
lastSeenAt: Date | null;
seq: number;
/** Host-level inflight total (the fork's SSE publishes only a total, not per-model). */
inflightTotal: number;
models: Map<string, ModelState>;
}
export interface ModelState {
model: string;
state: string;
ts: Date;
ttlDeadline: Date | null;
inflight: number;
}
export interface SnapshotData {
hosts: Array<{
providerId: string;
liveness: 'connected' | 'reconnecting' | 'down';
lastSeenAt: string | null;
seq: number;
models: Array<{
model: string;
state: string;
ts: string;
ttlDeadline: string | null;
inflight: number;
}>;
}>;
requests?: Array<{
id: number;
providerId: string;
ts: string;
model: string | null;
reqPath: string | null;
statusCode: number | null;
durationMs: number | null;
}>;
perfSamples?: Array<{
providerId: string;
ts: string;
gpu: unknown;
sys: unknown;
}>;
}
// ─── helpers for tests ──────────────────────────────────────────────────────
export function createFleetState(): FleetState {
return { hosts: new Map() };
}
export function ensureHostState(fleet: FleetState, providerId: string): HostState {
let state = fleet.hosts.get(providerId);
if (!state) {
state = {
providerId,
liveness: 'down',
lastSeenAt: null,
seq: 0,
inflightTotal: 0,
models: new Map(),
};
fleet.hosts.set(providerId, state);
}
return state;
}
export function stampLastSeen(state: HostState): void {
state.lastSeenAt = new Date();
}
export function incrementSeq(state: HostState): number {
state.seq += 1;
return state.seq;
}