export type AgentStatus = | "idle" | "thinking" | "tool_calling" | "speaking" | "spawning" | "error" | "offline"; export type AgentZone = "desk" | "meeting" | "hotDesk" | "lounge" | "corridor"; export type AgentRole = "lead" | "agent" | "subagent"; export interface Point { x: number; y: number; } export interface MovementState { path: Point[]; /** total walk duration in seconds */ duration: number; /** elapsed seconds */ elapsed: number; toZone: AgentZone; /** status to apply when the walk finishes */ arriveStatus?: AgentStatus; /** remove the agent from the office when the walk finishes */ despawnOnArrive?: boolean; } export interface ToolCall { name: string; startedAt: number; } export interface VisualAgent { id: string; name: string; role: AgentRole; /** model tag shown in the detail panel, e.g. "fable-5" */ model: string; status: AgentStatus; position: Point; zone: AgentZone; /** permanently assigned seat (desk / hot-desk slot centre) */ homePosition: Point; homeZone: AgentZone; homeSlot: number; currentTool: ToolCall | null; speech: string | null; movement: MovementState | null; parentId: string | null; childIds: string[]; toolCallCount: number; toolHistory: string[]; spawnedAt: number; } export interface CollaborationLink { sourceId: string; targetId: string; strength: number; kind: "spawn" | "meeting"; } export interface Meeting { id: string; agentIds: string[]; center: Point; } export interface OfficeEvent { at: number; text: string; icon: string; }