// state.json structure — matches Pipeline Runner output export interface AgentDesk { col: number; row: number; } export type AgentStatus = | "idle" | "working" | "delivering" | "done" | "checkpoint"; export interface Agent { id: string; name: string; icon: string; status: AgentStatus; gender?: "male" | "female"; desk: AgentDesk; } export interface Handoff { from: string; to: string; message: string; completedAt: string; } export type SquadStatus = | "idle" | "running" | "completed" | "checkpoint"; export interface SquadState { squad: string; status: SquadStatus; step: { current: number; total: number; label: string; }; agents: Agent[]; handoff: Handoff | null; startedAt: string | null; updatedAt: string; } // Squad metadata from squad.yaml export interface SquadInfo { code: string; name: string; description: string; icon: string; agents: string[]; // agent file paths } // WebSocket messages export type WsMessage = | { type: "SNAPSHOT"; squads: SquadInfo[]; activeStates: Record } | { type: "SQUAD_UPDATE"; squad: string; state: SquadState } | { type: "SQUAD_INACTIVE"; squad: string };