import { createContext, useContext } from "react"; import type { Automation, Env, Member, Project, Review, Approval, Followup, PeerMessage, Task, TaskCost, ThreadInfo, Triage, Worker, SkillItem, McpServer, Agent, DispatchBody, ReviewBody, TraceEntry, ChatHistory } from "./api/types"; export interface ConsoleCtx { keySaved: boolean; keyState: string; saveKeyInput: (v: string) => void; clearKeyInput: () => void; quotaText: string; healthText: string; refreshHealth: () => void; adminGate: string; adminBody: boolean; adminResult: string; adminUserId: string; setAdminUserId: (v: string) => void; adminQuota: () => void; adminSweep: () => void; adminBackup: () => void; projects: Project[]; projectId: string; projectMsg: string; selectProject: (id: string) => void; refreshProjects: () => void; createProject: (name: string, repo: string) => Promise; githubRepos: Array<{ clone_url: string; repo_full_name: string }>; workers: Worker[] | null; workersSummary: string; workersError: string; refreshWorkers: () => void; members: Member[]; memberMsg: string; memberError: string; refreshMembers: () => void; inviteMember: (raw: string, role: string) => Promise; changeMemberRole: (uid: string, role: string) => Promise; skills: SkillItem[]; apps: SkillItem[]; mcpServers: McpServer[]; skillMsg: string; skillError: string; mcpMsg: string; mcpOauthMsg: string; mcpOauthBox: string; refreshSkills: () => void; reloadMcp: () => void; mcpOauth: (name: string) => Promise; envs: Env[]; envCount: string; envMsg: string; envRepoLine: string; envRepoBar: boolean; envRepoMsg: string; envSelect: string; setEnvSelect: (v: string) => void; refreshEnvs: () => void; createEnv: (name: string, branch: string, executor: string) => Promise; archiveEnv: (id: string) => Promise; saveEnvRepo: (repo: string) => Promise; models: string[]; modelCustomVisible: boolean; tasks: Task[]; taskCountText: string; taskError: string; refreshTasks: () => void; statusFilter: string; setStatusFilter: (v: string) => void; executorFilter: string; setExecutorFilter: (v: string) => void; searchText: string; setSearchText: (v: string) => void; filteredTasks: Task[]; taskPage: number; taskTotalPages: number; taskTotal: number; taskStatusCounts: Record; goToTaskPage: (p: number) => void; currentTask: Task | null; detailBody: string; actionMsg: string; actionReasons: string; showDetail: (id: string) => void; doAction: (kind: string) => void; taskCost: () => void; costBox: string; costSummary: TaskCost | null | undefined; forkVisible: boolean; setForkVisible: (v: boolean) => void; forkTask: (msg: string) => Promise; forkMsg: string; // Continue input is ContinuePanel (ChatInput); its send path is sendChatMessage below. coordChildren: Task[]; coordText: string; agents: Agent[]; agentsNote: string; reviews: Review[]; reviewMsg: string; reviewError: string; refreshReviews: () => void; postReview: (body: ReviewBody) => Promise; submitFindings: (id: string) => void; traceEntries: TraceEntry[]; traceNote: string; traceDone: string; traceKind: string; setTraceKind: (v: string) => void; downloadTrace: () => void; traceMsg: string; sendChatMessage: (text: string) => Promise; chatMsg: string; chatHistory: ChatHistory | null; followups: Followup[]; approvals: Approval[]; approvalMsg: string; refreshApprovals: () => void; decideApproval: (id: string, decision: string) => void; peerMessages: PeerMessage[]; peerMsg: string; postPeer: (mode: string, target: string, text: string) => Promise; automations: Automation[]; autoMsg: string; refreshAutomations: () => void; createAutomation: (name: string, prompt: string, interval: string, repo: string) => Promise; cancelAutomation: (id: string) => void; triage: Triage | null; triageError: string; refreshTriage: () => void; threadText: string; threadGateNote: string; threadMsg: string; threadList: ThreadInfo[]; threadAction: (kind: string, name: string) => void; dispatch: (body: DispatchBody, atts: Array<{ path: string; file: File }>) => Promise; dispatchMsg: string; refreshAll: (selectFocused: boolean) => void; refreshSlow: () => void; refreshStamp: string; } export const ConsoleContext = createContext(null); export function useConsole(): ConsoleCtx { const c = useContext(ConsoleContext); if (!c) throw new Error("ConsoleContext missing"); return c; }