claude-code-controller 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/index.ts","../../src/api/action-tracker.ts","../../src/api/routes.ts","../../src/controller.ts","../../src/team-manager.ts","../../src/paths.ts","../../src/task-manager.ts","../../src/process-manager.ts","../../src/inbox.ts","../../src/inbox-poller.ts","../../src/agent-handle.ts","../../src/logger.ts","../../src/claude.ts"],"sourcesContent":["import { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport type { ClaudeCodeController } from \"../controller.js\";\nimport { ActionTracker } from \"./action-tracker.js\";\nimport { buildRoutes } from \"./routes.js\";\nimport type { CreateApiOptions } from \"./types.js\";\n\n/**\n * Create a standalone Hono app that exposes a ClaudeCodeController as a REST API.\n *\n * **Mode 1 – Pre-initialized controller:**\n * Pass an already-initialized controller. The API is ready to use immediately.\n * The API will NOT shut down the controller when `POST /session/shutdown` is called\n * (caller retains ownership).\n *\n * **Mode 2 – Lazy init via API:**\n * Pass no controller (or `null`). Use `POST /session/init` to create a session,\n * passing `env`, `teamName`, `cwd`, etc. in the request body.\n * The API owns the controller lifecycle and will shut it down on session end.\n *\n * @example\n * ```ts\n * // Mode 1: pre-initialized controller\n * import { ClaudeCodeController } from \"claude-code-controller\";\n * import { createApi } from \"claude-code-controller/api\";\n *\n * const controller = new ClaudeCodeController({ teamName: \"my-team\" });\n * await controller.init();\n * const app = createApi(controller);\n *\n * // Mode 2: init via API (supports env vars)\n * const app = createApi();\n * // Then: POST /session/init { \"teamName\": \"t1\", \"env\": { \"ANTHROPIC_API_KEY\": \"...\" } }\n * ```\n */\nexport function createApi(\n controller?: ClaudeCodeController | null,\n options?: CreateApiOptions\n): Hono {\n const tracker = new ActionTracker();\n\n // If a controller was provided, attach the tracker immediately\n if (controller) {\n tracker.attach(controller);\n }\n\n const state = {\n controller: controller ?? null,\n tracker,\n owned: false, // externally-provided controllers are not owned by the API\n initLock: false,\n startTime: Date.now(),\n };\n\n const app = new Hono();\n const basePath = options?.basePath ?? \"/\";\n\n // CORS: enabled by default, disable with { cors: false }\n if (options?.cors !== false) {\n app.use(\"*\", cors());\n }\n\n const routes = buildRoutes(state);\n app.route(basePath, routes);\n\n // Global error handler — returns 400 for validation errors, 500 for the rest\n app.onError((err, c) => {\n const message =\n err instanceof Error ? err.message : \"Internal server error\";\n const status = err.name === \"ValidationError\" ? 400 : 500;\n return c.json({ error: message }, status);\n });\n\n return app;\n}\n\n// Re-export types for consumers\nexport { ActionTracker } from \"./action-tracker.js\";\n\nexport type {\n CreateApiOptions,\n AskBody,\n InitSessionBody,\n SpawnAgentBody,\n SendMessageBody,\n BroadcastBody,\n ApproveBody,\n CreateTaskBody,\n UpdateTaskBody,\n AssignTaskBody,\n ApiError,\n AgentResponse,\n SessionResponse,\n HealthResponse,\n ActionsResponse,\n UnassignedTask,\n} from \"./types.js\";\n\nexport type {\n PendingApproval,\n IdleAgent,\n} from \"./action-tracker.js\";\n","import type { ClaudeCodeController } from \"../controller.js\";\nimport type {\n PlanApprovalRequestMessage,\n PermissionRequestMessage,\n} from \"../types.js\";\n\nexport interface PendingApproval {\n type: \"plan\" | \"permission\";\n agent: string;\n requestId: string;\n timestamp: string;\n action: string;\n // plan-specific\n planContent?: string;\n // permission-specific\n toolName?: string;\n description?: string;\n}\n\nexport interface IdleAgent {\n name: string;\n type: string;\n idleSince: string;\n action: string;\n}\n\ntype BoundListener = { event: string; fn: (...args: unknown[]) => void };\n\n/**\n * Listens to controller events and maintains an in-memory snapshot\n * of all actions that need attention (approvals, idle agents).\n */\nexport class ActionTracker {\n private approvals = new Map<string, PendingApproval>();\n private idles = new Map<string, IdleAgent>();\n private agentTypes = new Map<string, string>();\n private listeners: BoundListener[] = [];\n private currentController: ClaudeCodeController | null = null;\n\n attach(controller: ClaudeCodeController): void {\n // Detach from previous controller first to avoid listener leaks\n this.detach();\n this.currentController = controller;\n\n const onPlan = (agent: string, parsed: PlanApprovalRequestMessage) => {\n this.approvals.set(parsed.requestId, {\n type: \"plan\",\n agent,\n requestId: parsed.requestId,\n timestamp: parsed.timestamp,\n planContent: parsed.planContent,\n action: `POST /agents/${agent}/approve`,\n });\n };\n\n const onPermission = (agent: string, parsed: PermissionRequestMessage) => {\n this.approvals.set(parsed.requestId, {\n type: \"permission\",\n agent,\n requestId: parsed.requestId,\n timestamp: parsed.timestamp,\n toolName: parsed.toolName,\n description: parsed.description,\n action: `POST /agents/${agent}/approve`,\n });\n };\n\n const onIdle = (agent: string) => {\n this.idles.set(agent, {\n name: agent,\n type: this.agentTypes.get(agent) ?? \"unknown\",\n idleSince: new Date().toISOString(),\n action: `POST /agents/${agent}/messages`,\n });\n };\n\n const onMessage = (agent: string) => {\n this.idles.delete(agent);\n };\n\n const onSpawned = (agent: string) => {\n this.idles.delete(agent);\n };\n\n const onExited = (agent: string) => {\n this.idles.delete(agent);\n // Clean up stale approvals from the dead agent\n for (const [id, approval] of this.approvals) {\n if (approval.agent === agent) {\n this.approvals.delete(id);\n }\n }\n };\n\n controller.on(\"plan:approval_request\", onPlan);\n controller.on(\"permission:request\", onPermission);\n controller.on(\"idle\", onIdle);\n controller.on(\"message\", onMessage);\n controller.on(\"agent:spawned\", onSpawned);\n controller.on(\"agent:exited\", onExited);\n\n this.listeners = [\n { event: \"plan:approval_request\", fn: onPlan as (...args: unknown[]) => void },\n { event: \"permission:request\", fn: onPermission as (...args: unknown[]) => void },\n { event: \"idle\", fn: onIdle as (...args: unknown[]) => void },\n { event: \"message\", fn: onMessage as (...args: unknown[]) => void },\n { event: \"agent:spawned\", fn: onSpawned as (...args: unknown[]) => void },\n { event: \"agent:exited\", fn: onExited as (...args: unknown[]) => void },\n ];\n }\n\n /** Remove all event listeners from the current controller. */\n detach(): void {\n if (this.currentController) {\n for (const { event, fn } of this.listeners) {\n this.currentController.removeListener(event, fn);\n }\n }\n this.listeners = [];\n this.currentController = null;\n }\n\n /** Track agent type so idle entries have the right type. */\n registerAgentType(name: string, type: string): void {\n this.agentTypes.set(name, type);\n }\n\n resolveApproval(requestId: string): void {\n this.approvals.delete(requestId);\n }\n\n getPendingApprovals(): PendingApproval[] {\n return Array.from(this.approvals.values());\n }\n\n getIdleAgents(): IdleAgent[] {\n return Array.from(this.idles.values());\n }\n\n /** Clear all tracked state AND detach from the controller. */\n clear(): void {\n this.detach();\n this.approvals.clear();\n this.idles.clear();\n this.agentTypes.clear();\n }\n}\n","import { Hono } from \"hono\";\nimport { ClaudeCodeController } from \"../controller.js\";\nimport { claude } from \"../claude.js\";\nimport { ActionTracker } from \"./action-tracker.js\";\nimport type {\n AskBody,\n InitSessionBody,\n SpawnAgentBody,\n SendMessageBody,\n BroadcastBody,\n ApproveBody,\n CreateTaskBody,\n UpdateTaskBody,\n AssignTaskBody,\n} from \"./types.js\";\n\n// ─── Validation ──────────────────────────────────────────────────────────────\n\nconst SAFE_NAME_RE = /^[a-zA-Z0-9_-]{1,64}$/;\nconst SAFE_TASK_ID_RE = /^[0-9]{1,10}$/;\n\nfunction validateName(value: string, field: string): void {\n if (!SAFE_NAME_RE.test(value)) {\n throw new ValidationError(\n `${field} must be 1-64 alphanumeric characters, hyphens, or underscores`\n );\n }\n}\n\nfunction validateTaskId(value: string): void {\n if (!SAFE_TASK_ID_RE.test(value)) {\n throw new ValidationError(\"task id must be a numeric string (1-10 digits)\");\n }\n}\n\nclass ValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n\nfunction isNotFoundError(err: unknown): boolean {\n return err instanceof Error && /not found/i.test(err.message);\n}\n\n// ─── State ───────────────────────────────────────────────────────────────────\n\nexport interface ApiState {\n controller: ClaudeCodeController | null;\n tracker: ActionTracker;\n /** True if the controller was created via POST /session/init (API owns lifecycle). */\n owned: boolean;\n /** Prevents concurrent session init/shutdown. */\n initLock: boolean;\n /** Timestamp of when this API instance was created. */\n startTime: number;\n}\n\nfunction getController(state: ApiState): ClaudeCodeController {\n if (!state.controller) {\n throw new Error(\n \"No active session. Call POST /session/init first.\"\n );\n }\n return state.controller;\n}\n\n// ─── Routes ──────────────────────────────────────────────────────────────────\n\nexport function buildRoutes(state: ApiState) {\n const api = new Hono();\n\n // ─── Health ──────────────────────────────────────────────────────────\n\n api.get(\"/health\", (c) => {\n return c.json({\n status: \"ok\",\n uptime: Date.now() - state.startTime,\n session: state.controller !== null,\n });\n });\n\n // ─── Ask (one-liner) ────────────────────────────────────────────────\n\n api.post(\"/ask\", async (c) => {\n const body = await c.req.json<AskBody>();\n if (!body.prompt) {\n return c.json({ error: \"prompt is required\" }, 400);\n }\n\n try {\n const response = await claude(body.prompt, {\n model: body.model,\n apiKey: body.apiKey,\n baseUrl: body.baseUrl,\n timeout: body.timeout,\n cwd: body.cwd,\n permissions: body.permissions,\n env: body.env,\n logLevel: \"warn\",\n });\n\n return c.json({ response });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Agent failed to respond\";\n return c.json({ error: message }, 500);\n }\n });\n\n // ─── Session ─────────────────────────────────────────────────────────\n\n api.get(\"/session\", (c) => {\n if (!state.controller) {\n return c.json({ initialized: false, teamName: \"\" });\n }\n return c.json({\n initialized: true,\n teamName: state.controller.teamName,\n });\n });\n\n api.post(\"/session/init\", async (c) => {\n if (state.initLock) {\n return c.json({ error: \"Session init already in progress\" }, 409);\n }\n state.initLock = true;\n\n try {\n const body = await c.req.json<InitSessionBody>().catch(() => ({} as InitSessionBody));\n\n // Validate names\n if (body.teamName) validateName(body.teamName, \"teamName\");\n\n // Shutdown existing session if owned by us\n const oldController = state.controller;\n if (oldController) {\n state.tracker.clear();\n state.controller = null;\n if (state.owned) {\n await oldController.shutdown();\n }\n }\n\n // Merge first-class options into env (first-class wins)\n const env: Record<string, string> = { ...body.env };\n if (body.apiKey) env.ANTHROPIC_AUTH_TOKEN = body.apiKey;\n if (body.baseUrl) env.ANTHROPIC_BASE_URL = body.baseUrl;\n if (body.timeout != null) env.API_TIMEOUT_MS = String(body.timeout);\n\n const controller = new ClaudeCodeController({\n teamName: body.teamName,\n cwd: body.cwd,\n claudeBinary: body.claudeBinary,\n env,\n logLevel: body.logLevel ?? \"info\",\n });\n\n try {\n await controller.init();\n } catch (err) {\n // Cleanup the partially-initialized controller\n try { await controller.shutdown(); } catch { /* best effort */ }\n throw err;\n }\n\n state.controller = controller;\n state.owned = true;\n state.tracker.attach(controller);\n\n return c.json({\n initialized: true,\n teamName: controller.teamName,\n }, 201);\n } finally {\n state.initLock = false;\n }\n });\n\n api.post(\"/session/shutdown\", async (c) => {\n if (state.initLock) {\n return c.json({ error: \"Session operation in progress\" }, 409);\n }\n state.initLock = true;\n\n try {\n const ctrl = getController(state);\n const wasOwned = state.owned;\n\n state.tracker.clear();\n state.controller = null;\n state.owned = false;\n\n if (wasOwned) {\n await ctrl.shutdown();\n }\n\n return c.json({ ok: true });\n } finally {\n state.initLock = false;\n }\n });\n\n // ─── Actions ─────────────────────────────────────────────────────────\n\n api.get(\"/actions\", async (c) => {\n const ctrl = getController(state);\n const approvals = state.tracker.getPendingApprovals();\n const idleAgents = state.tracker.getIdleAgents();\n\n const tasks = await ctrl.tasks.list();\n const unassignedTasks = tasks\n .filter((t) => !t.owner && t.status !== \"completed\")\n .map((t) => ({\n id: t.id,\n subject: t.subject,\n description: t.description,\n status: t.status,\n action: `POST /tasks/${t.id}/assign`,\n }));\n\n const pending =\n approvals.length + unassignedTasks.length + idleAgents.length;\n\n return c.json({ pending, approvals, unassignedTasks, idleAgents });\n });\n\n // ─── Agents ──────────────────────────────────────────────────────────\n\n api.get(\"/agents\", async (c) => {\n const ctrl = getController(state);\n const config = await ctrl.team.getConfig();\n const agents = config.members\n .filter((m) => m.name !== \"controller\")\n .map((m) => ({\n name: m.name,\n type: m.agentType,\n model: m.model,\n running: ctrl.isAgentRunning(m.name),\n }));\n return c.json(agents);\n });\n\n api.post(\"/agents\", async (c) => {\n const ctrl = getController(state);\n const body = await c.req.json<SpawnAgentBody>();\n if (!body.name) {\n return c.json({ error: \"name is required\" }, 400);\n }\n validateName(body.name, \"name\");\n\n const agentType = body.type || \"general-purpose\";\n state.tracker.registerAgentType(body.name, agentType);\n\n // Merge first-class options into env\n const agentEnv: Record<string, string> = { ...body.env };\n if (body.apiKey) agentEnv.ANTHROPIC_AUTH_TOKEN = body.apiKey;\n if (body.baseUrl) agentEnv.ANTHROPIC_BASE_URL = body.baseUrl;\n if (body.timeout != null) agentEnv.API_TIMEOUT_MS = String(body.timeout);\n\n // Resolve permissions: preset string or raw tool array\n const permissionsArray = Array.isArray(body.permissions)\n ? body.permissions\n : undefined;\n const PRESET_MAP: Record<string, string> = {\n edit: \"acceptEdits\",\n plan: \"plan\",\n ask: \"default\",\n };\n const permissionMode =\n typeof body.permissions === \"string\" && !Array.isArray(body.permissions)\n ? (PRESET_MAP[body.permissions] as any)\n : undefined;\n\n const handle = await ctrl.spawnAgent({\n name: body.name,\n type: body.type,\n model: body.model,\n cwd: body.cwd,\n permissions: permissionsArray,\n permissionMode,\n env: Object.keys(agentEnv).length > 0 ? agentEnv : undefined,\n });\n\n return c.json(\n {\n name: handle.name,\n pid: handle.pid,\n running: handle.isRunning,\n },\n 201\n );\n });\n\n api.get(\"/agents/:name\", async (c) => {\n const ctrl = getController(state);\n const name = c.req.param(\"name\");\n validateName(name, \"name\");\n const config = await ctrl.team.getConfig();\n const member = config.members.find((m) => m.name === name);\n if (!member) {\n return c.json({ error: `Agent \"${name}\" not found` }, 404);\n }\n return c.json({\n name: member.name,\n type: member.agentType,\n model: member.model,\n running: ctrl.isAgentRunning(name),\n });\n });\n\n api.post(\"/agents/:name/messages\", async (c) => {\n const ctrl = getController(state);\n const name = c.req.param(\"name\");\n validateName(name, \"name\");\n const body = await c.req.json<SendMessageBody>();\n if (!body.message) {\n return c.json({ error: \"message is required\" }, 400);\n }\n await ctrl.send(name, body.message, body.summary);\n return c.json({ ok: true });\n });\n\n api.post(\"/agents/:name/kill\", async (c) => {\n const ctrl = getController(state);\n const name = c.req.param(\"name\");\n validateName(name, \"name\");\n await ctrl.killAgent(name);\n return c.json({ ok: true });\n });\n\n api.post(\"/agents/:name/shutdown\", async (c) => {\n const ctrl = getController(state);\n const name = c.req.param(\"name\");\n validateName(name, \"name\");\n await ctrl.sendShutdownRequest(name);\n return c.json({ ok: true });\n });\n\n api.post(\"/agents/:name/approve\", async (c) => {\n const ctrl = getController(state);\n const name = c.req.param(\"name\");\n validateName(name, \"name\");\n const body = await c.req.json<ApproveBody>();\n if (!body.requestId) {\n return c.json({ error: \"requestId is required\" }, 400);\n }\n if (!body.type || ![\"plan\", \"permission\"].includes(body.type)) {\n return c.json({ error: 'type must be \"plan\" or \"permission\"' }, 400);\n }\n\n if (body.type === \"plan\") {\n await ctrl.sendPlanApproval(name, body.requestId, body.approve ?? true, body.feedback);\n } else {\n await ctrl.sendPermissionResponse(name, body.requestId, body.approve ?? true);\n }\n state.tracker.resolveApproval(body.requestId);\n return c.json({ ok: true });\n });\n\n // ─── Broadcast ───────────────────────────────────────────────────────\n\n api.post(\"/broadcast\", async (c) => {\n const ctrl = getController(state);\n const body = await c.req.json<BroadcastBody>();\n if (!body.message) {\n return c.json({ error: \"message is required\" }, 400);\n }\n await ctrl.broadcast(body.message, body.summary);\n return c.json({ ok: true });\n });\n\n // ─── Tasks ───────────────────────────────────────────────────────────\n\n api.get(\"/tasks\", async (c) => {\n const ctrl = getController(state);\n const tasks = await ctrl.tasks.list();\n return c.json(tasks);\n });\n\n api.post(\"/tasks\", async (c) => {\n const ctrl = getController(state);\n const body = await c.req.json<CreateTaskBody>();\n if (!body.subject || !body.description) {\n return c.json({ error: \"subject and description are required\" }, 400);\n }\n if (body.owner) validateName(body.owner, \"owner\");\n const taskId = await ctrl.createTask(body);\n const task = await ctrl.tasks.get(taskId);\n return c.json(task, 201);\n });\n\n\n api.get(\"/tasks/:id\", async (c) => {\n const ctrl = getController(state);\n const id = c.req.param(\"id\");\n validateTaskId(id);\n try {\n const task = await ctrl.tasks.get(id);\n return c.json(task);\n } catch (err) {\n if (isNotFoundError(err)) {\n return c.json({ error: `Task \"${id}\" not found` }, 404);\n }\n throw err;\n }\n });\n\n api.patch(\"/tasks/:id\", async (c) => {\n const ctrl = getController(state);\n const id = c.req.param(\"id\");\n validateTaskId(id);\n const body = await c.req.json<UpdateTaskBody>();\n try {\n const task = await ctrl.tasks.update(id, body);\n return c.json(task);\n } catch (err) {\n if (isNotFoundError(err)) {\n return c.json({ error: `Task \"${id}\" not found` }, 404);\n }\n throw err;\n }\n });\n\n api.delete(\"/tasks/:id\", async (c) => {\n const ctrl = getController(state);\n const id = c.req.param(\"id\");\n validateTaskId(id);\n try {\n await ctrl.tasks.get(id);\n } catch (err) {\n if (isNotFoundError(err)) {\n return c.json({ error: `Task \"${id}\" not found` }, 404);\n }\n throw err;\n }\n await ctrl.tasks.delete(id);\n return c.json({ ok: true });\n });\n\n api.post(\"/tasks/:id/assign\", async (c) => {\n const ctrl = getController(state);\n const id = c.req.param(\"id\");\n validateTaskId(id);\n const body = await c.req.json<AssignTaskBody>();\n if (!body.agent) {\n return c.json({ error: \"agent is required\" }, 400);\n }\n validateName(body.agent, \"agent\");\n try {\n await ctrl.tasks.get(id);\n } catch (err) {\n if (isNotFoundError(err)) {\n return c.json({ error: `Task \"${id}\" not found` }, 404);\n }\n throw err;\n }\n await ctrl.assignTask(id, body.agent);\n return c.json({ ok: true });\n });\n\n return api;\n}\n","import { EventEmitter } from \"node:events\";\nimport { execSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { TeamManager } from \"./team-manager.js\";\nimport { TaskManager } from \"./task-manager.js\";\nimport { ProcessManager } from \"./process-manager.js\";\nimport { InboxPoller, type PollEvent } from \"./inbox-poller.js\";\nimport { writeInbox, readUnread, parseMessage } from \"./inbox.js\";\nimport { AgentHandle, type AgentController } from \"./agent-handle.js\";\nimport { createLogger } from \"./logger.js\";\nimport type {\n ControllerOptions,\n ControllerEvents,\n SpawnAgentOptions,\n ReceiveOptions,\n InboxMessage,\n TeamMember,\n TaskFile,\n TaskStatus,\n Logger,\n LogLevel,\n} from \"./types.js\";\n\n/** Protocol-only message types handled via events; filtered out of receive()/receiveAny(). */\nconst PROTOCOL_ONLY_TYPES = new Set([\n \"shutdown_approved\",\n \"plan_approval_response\",\n \"permission_response\",\n]);\n\nconst AGENT_COLORS = [\n \"#00FF00\",\n \"#00BFFF\",\n \"#FF6347\",\n \"#FFD700\",\n \"#DA70D6\",\n \"#40E0D0\",\n \"#FF69B4\",\n \"#7B68EE\",\n];\n\nexport class ClaudeCodeController\n extends EventEmitter<ControllerEvents>\n implements AgentController\n{\n readonly teamName: string;\n readonly team: TeamManager;\n readonly tasks: TaskManager;\n private processes: ProcessManager;\n private poller: InboxPoller;\n private log: Logger;\n private cwd: string;\n private claudeBinary: string;\n private defaultEnv: Record<string, string>;\n private colorIndex = 0;\n private initialized = false;\n\n constructor(opts?: ControllerOptions & { logLevel?: LogLevel }) {\n super();\n this.teamName =\n opts?.teamName || `ctrl-${randomUUID().slice(0, 8)}`;\n this.cwd = opts?.cwd || process.cwd();\n this.claudeBinary = opts?.claudeBinary || \"claude\";\n this.defaultEnv = opts?.env || {};\n this.log = opts?.logger || createLogger(opts?.logLevel ?? \"info\");\n\n this.team = new TeamManager(this.teamName, this.log);\n this.tasks = new TaskManager(this.teamName, this.log);\n this.processes = new ProcessManager(this.log);\n this.poller = new InboxPoller(\n this.teamName,\n \"controller\",\n this.log\n );\n\n // Wire up poller events to the EventEmitter\n this.poller.onMessages((events) => this.handlePollEvents(events));\n }\n\n // ─── Lifecycle ───────────────────────────────────────────────────────\n\n /**\n * Initialize the controller: create the team and start polling.\n * Must be called before any other operations.\n */\n async init(): Promise<this> {\n if (this.initialized) return this;\n\n await this.team.create({ cwd: this.cwd });\n await this.tasks.init();\n this.poller.start();\n this.initialized = true;\n this.log.info(\n `Controller initialized (team=\"${this.teamName}\")`\n );\n return this;\n }\n\n /**\n * Graceful shutdown:\n * 1. Send shutdown requests to all agents\n * 2. Wait briefly for acknowledgment\n * 3. Kill remaining processes\n * 4. Clean up team files\n */\n async shutdown(): Promise<void> {\n this.log.info(\"Shutting down controller...\");\n\n // Send shutdown requests to all running agents\n const running = this.processes.runningAgents();\n const shutdownPromises: Promise<void>[] = [];\n\n for (const name of running) {\n try {\n await this.sendShutdownRequest(name);\n // Wait up to 10s for the agent process to exit on its own\n shutdownPromises.push(\n new Promise<void>((resolve) => {\n const proc = this.processes.get(name);\n if (!proc) return resolve();\n const timer = setTimeout(() => resolve(), 10_000);\n proc.on(\"exit\", () => {\n clearTimeout(timer);\n resolve();\n });\n })\n );\n } catch {\n // Agent may already be gone\n }\n }\n\n // Wait for all agents to exit gracefully (or timeout)\n if (shutdownPromises.length > 0) {\n await Promise.all(shutdownPromises);\n }\n\n // Force kill any remaining\n await this.processes.killAll();\n\n // Stop polling\n this.poller.stop();\n\n // Clean up filesystem\n await this.team.destroy();\n this.initialized = false;\n this.log.info(\"Controller shut down\");\n }\n\n // ─── Agent Management ────────────────────────────────────────────────\n\n /**\n * Spawn a new Claude Code agent.\n */\n async spawnAgent(opts: SpawnAgentOptions): Promise<AgentHandle> {\n this.ensureInitialized();\n\n const agentId = `${opts.name}@${this.teamName}`;\n const color = AGENT_COLORS[this.colorIndex++ % AGENT_COLORS.length];\n const cwd = opts.cwd || this.cwd;\n\n // Register member in team config\n const member: TeamMember = {\n agentId,\n name: opts.name,\n agentType: opts.type || \"general-purpose\",\n model: opts.model,\n joinedAt: Date.now(),\n tmuxPaneId: \"\",\n cwd,\n subscriptions: [],\n };\n await this.team.addMember(member);\n\n // Merge default env with per-agent env (per-agent takes precedence)\n const env =\n Object.keys(this.defaultEnv).length > 0 || opts.env\n ? { ...this.defaultEnv, ...opts.env }\n : undefined;\n\n // Spawn the CLI process\n const proc = this.processes.spawn({\n teamName: this.teamName,\n agentName: opts.name,\n agentId,\n agentType: opts.type || \"general-purpose\",\n model: opts.model,\n cwd,\n parentSessionId: this.team.sessionId,\n color,\n claudeBinary: this.claudeBinary,\n permissions: opts.permissions,\n permissionMode: opts.permissionMode,\n env,\n });\n\n this.emit(\"agent:spawned\", opts.name, proc.pid ?? 0);\n\n // Track process exit\n this.processes.onExit(opts.name, (code) => {\n this.emit(\"agent:exited\", opts.name, code ?? null);\n });\n\n return new AgentHandle(this, opts.name, proc.pid);\n }\n\n // ─── Messaging ───────────────────────────────────────────────────────\n\n /**\n * Send a message to a specific agent.\n */\n async send(\n agentName: string,\n message: string,\n summary?: string\n ): Promise<void> {\n this.ensureInitialized();\n await writeInbox(\n this.teamName,\n agentName,\n {\n from: \"controller\",\n text: message,\n timestamp: new Date().toISOString(),\n summary,\n },\n this.log\n );\n }\n\n /**\n * Send a structured shutdown request to an agent.\n */\n async sendShutdownRequest(agentName: string): Promise<void> {\n const requestId = `shutdown-${Date.now()}@${agentName}`;\n const msg = JSON.stringify({\n type: \"shutdown_request\",\n requestId,\n from: \"controller\",\n reason: \"Controller shutdown requested\",\n timestamp: new Date().toISOString(),\n });\n await this.send(agentName, msg);\n }\n\n /**\n * Broadcast a message to all registered agents (except controller).\n */\n async broadcast(message: string, summary?: string): Promise<void> {\n this.ensureInitialized();\n const config = await this.team.getConfig();\n const agents = config.members.filter((m) => m.name !== \"controller\");\n await Promise.all(\n agents.map((a) => this.send(a.name, message, summary))\n );\n }\n\n /**\n * Wait for messages from a specific agent.\n * Polls the controller's inbox for messages from the given agent.\n *\n * Returns when:\n * - A non-idle message is received (SendMessage from agent), OR\n * - An idle_notification is received (agent finished its turn),\n * in which case the idle message is returned.\n */\n async receive(\n agentName: string,\n opts?: ReceiveOptions\n ): Promise<InboxMessage[]> {\n const timeout = opts?.timeout ?? 60_000;\n const interval = opts?.pollInterval ?? 500;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const unread = await readUnread(this.teamName, \"controller\");\n const fromAgent = unread.filter((m) => m.from === agentName);\n\n if (fromAgent.length > 0) {\n // Protocol-only messages are handled via events, skip them in receive()\n const PROTOCOL_TYPES = PROTOCOL_ONLY_TYPES;\n\n // Prefer content messages (plain text or SendMessage from agent)\n const meaningful = fromAgent.filter((m) => {\n const parsed = parseMessage(m);\n return (\n parsed.type !== \"idle_notification\" &&\n !PROTOCOL_TYPES.has(parsed.type)\n );\n });\n\n if (meaningful.length > 0) {\n return opts?.all ? meaningful : [meaningful[0]];\n }\n\n // If only idle/protocol messages, check if there's an idle (= agent done)\n const idles = fromAgent.filter((m) => {\n const parsed = parseMessage(m);\n return parsed.type === \"idle_notification\";\n });\n if (idles.length > 0) {\n return opts?.all ? idles : [idles[0]];\n }\n }\n\n await sleep(interval);\n }\n\n throw new Error(\n `Timeout (${timeout}ms) waiting for message from \"${agentName}\"`\n );\n }\n\n /**\n * Wait for any message from any agent.\n */\n async receiveAny(opts?: ReceiveOptions): Promise<InboxMessage> {\n const timeout = opts?.timeout ?? 60_000;\n const interval = opts?.pollInterval ?? 500;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const unread = await readUnread(this.teamName, \"controller\");\n const meaningful = unread.filter((m) => {\n const parsed = parseMessage(m);\n return (\n parsed.type !== \"idle_notification\" &&\n !PROTOCOL_ONLY_TYPES.has(parsed.type)\n );\n });\n\n if (meaningful.length > 0) {\n return meaningful[0];\n }\n\n await sleep(interval);\n }\n\n throw new Error(`Timeout (${timeout}ms) waiting for any message`);\n }\n\n // ─── Tasks ───────────────────────────────────────────────────────────\n\n /**\n * Create a task and optionally notify the assigned agent.\n */\n async createTask(\n task: Omit<TaskFile, \"id\" | \"blocks\" | \"blockedBy\" | \"status\"> & {\n blocks?: string[];\n blockedBy?: string[];\n status?: TaskStatus;\n }\n ): Promise<string> {\n this.ensureInitialized();\n const taskId = await this.tasks.create(task);\n\n // Notify the assigned agent if any\n if (task.owner) {\n const fullTask = await this.tasks.get(taskId);\n const assignmentMsg = JSON.stringify({\n type: \"task_assignment\",\n taskId,\n subject: fullTask.subject,\n description: fullTask.description,\n assignedBy: \"controller\",\n timestamp: new Date().toISOString(),\n });\n await this.send(task.owner, assignmentMsg);\n }\n\n return taskId;\n }\n\n /**\n * Assign a task to an agent.\n */\n async assignTask(taskId: string, agentName: string): Promise<void> {\n const task = await this.tasks.update(taskId, { owner: agentName });\n const msg = JSON.stringify({\n type: \"task_assignment\",\n taskId,\n subject: task.subject,\n description: task.description,\n assignedBy: \"controller\",\n timestamp: new Date().toISOString(),\n });\n await this.send(agentName, msg);\n }\n\n // ─── Protocol Responses ───────────────────────────────────────────\n\n /**\n * Approve or reject a teammate's plan.\n * Send this in response to a `plan:approval_request` event.\n */\n async sendPlanApproval(\n agentName: string,\n requestId: string,\n approve: boolean,\n feedback?: string\n ): Promise<void> {\n const msg = JSON.stringify({\n type: \"plan_approval_response\",\n requestId,\n from: \"controller\",\n approved: approve,\n feedback,\n timestamp: new Date().toISOString(),\n });\n await this.send(agentName, msg);\n }\n\n /**\n * Approve or reject a teammate's permission/tool-use request.\n * Send this in response to a `permission:request` event.\n */\n async sendPermissionResponse(\n agentName: string,\n requestId: string,\n approve: boolean\n ): Promise<void> {\n const msg = JSON.stringify({\n type: \"permission_response\",\n requestId,\n from: \"controller\",\n approved: approve,\n timestamp: new Date().toISOString(),\n });\n await this.send(agentName, msg);\n }\n\n /**\n * Wait for a task to be completed.\n */\n async waitForTask(\n taskId: string,\n timeout?: number\n ): Promise<TaskFile> {\n return this.tasks.waitFor(taskId, \"completed\", { timeout });\n }\n\n // ─── Utilities ───────────────────────────────────────────────────────\n\n /**\n * Check if an agent process is still running.\n */\n isAgentRunning(name: string): boolean {\n return this.processes.isRunning(name);\n }\n\n /**\n * Kill a specific agent.\n */\n async killAgent(name: string): Promise<void> {\n await this.processes.kill(name);\n await this.team.removeMember(name);\n }\n\n /**\n * Get the installed Claude Code version.\n */\n getClaudeVersion(): string | null {\n try {\n const version = execSync(`${this.claudeBinary} --version`, {\n encoding: \"utf-8\",\n timeout: 5_000,\n }).trim();\n return version;\n } catch {\n return null;\n }\n }\n\n /**\n * Verify that the required CLI flags exist in the installed version.\n */\n verifyCompatibility(): { compatible: boolean; version: string | null } {\n const version = this.getClaudeVersion();\n // The flags we depend on were present in v2.1.34\n // We check that the binary exists and responds\n return { compatible: version !== null, version };\n }\n\n // ─── Internal ────────────────────────────────────────────────────────\n\n private handlePollEvents(events: PollEvent[]): void {\n for (const event of events) {\n const { raw, parsed } = event;\n\n switch (parsed.type) {\n case \"idle_notification\":\n this.emit(\"idle\", raw.from);\n break;\n case \"shutdown_approved\":\n this.log.info(\n `Shutdown approved by \"${raw.from}\" (requestId=${parsed.requestId})`\n );\n this.emit(\"shutdown:approved\", raw.from, parsed);\n break;\n case \"plan_approval_request\":\n this.log.info(\n `Plan approval request from \"${raw.from}\" (requestId=${parsed.requestId})`\n );\n this.emit(\"plan:approval_request\", raw.from, parsed);\n break;\n case \"permission_request\":\n this.log.info(\n `Permission request from \"${raw.from}\": ${parsed.toolName} (requestId=${parsed.requestId})`\n );\n this.emit(\"permission:request\", raw.from, parsed);\n break;\n case \"plain_text\":\n this.emit(\"message\", raw.from, raw);\n break;\n default:\n this.emit(\"message\", raw.from, raw);\n }\n }\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error(\n \"Controller not initialized. Call init() first.\"\n );\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { readFile, writeFile, mkdir, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { teamDir, teamConfigPath, inboxesDir, tasksDir } from \"./paths.js\";\nimport type { TeamConfig, TeamMember, Logger } from \"./types.js\";\n\nexport class TeamManager {\n readonly teamName: string;\n readonly sessionId: string;\n private log: Logger;\n\n constructor(teamName: string, logger: Logger) {\n this.teamName = teamName;\n this.sessionId = randomUUID();\n this.log = logger;\n }\n\n /**\n * Create the team directory structure and config.json.\n * The controller registers itself as the lead member.\n */\n async create(opts?: {\n description?: string;\n cwd?: string;\n }): Promise<TeamConfig> {\n const dir = teamDir(this.teamName);\n const inboxDir = inboxesDir(this.teamName);\n const taskDir = tasksDir(this.teamName);\n\n await mkdir(dir, { recursive: true });\n await mkdir(inboxDir, { recursive: true });\n await mkdir(taskDir, { recursive: true });\n\n const leadName = \"controller\";\n const leadAgentId = `${leadName}@${this.teamName}`;\n\n const config: TeamConfig = {\n name: this.teamName,\n description: opts?.description,\n createdAt: Date.now(),\n leadAgentId,\n leadSessionId: this.sessionId,\n members: [\n {\n agentId: leadAgentId,\n name: leadName,\n agentType: \"controller\",\n joinedAt: Date.now(),\n tmuxPaneId: \"\",\n cwd: opts?.cwd || process.cwd(),\n subscriptions: [],\n },\n ],\n };\n\n await this.writeConfig(config);\n this.log.info(`Team \"${this.teamName}\" created`);\n return config;\n }\n\n /**\n * Add a member to the team config.\n */\n async addMember(member: TeamMember): Promise<void> {\n const config = await this.getConfig();\n // Remove existing member with same name if any\n config.members = config.members.filter((m) => m.name !== member.name);\n config.members.push(member);\n await this.writeConfig(config);\n this.log.debug(`Added member \"${member.name}\" to team`);\n }\n\n /**\n * Remove a member from the team config.\n */\n async removeMember(name: string): Promise<void> {\n const config = await this.getConfig();\n config.members = config.members.filter((m) => m.name !== name);\n await this.writeConfig(config);\n this.log.debug(`Removed member \"${name}\" from team`);\n }\n\n /**\n * Read the current team config.\n */\n async getConfig(): Promise<TeamConfig> {\n const path = teamConfigPath(this.teamName);\n if (!existsSync(path)) {\n throw new Error(\n `Team \"${this.teamName}\" does not exist (no config.json)`\n );\n }\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw);\n }\n\n /**\n * Check if the team already exists on disk.\n */\n exists(): boolean {\n return existsSync(teamConfigPath(this.teamName));\n }\n\n /**\n * Destroy the team: remove all team directories and task directories.\n */\n async destroy(): Promise<void> {\n const dir = teamDir(this.teamName);\n const taskDir = tasksDir(this.teamName);\n\n if (existsSync(dir)) {\n await rm(dir, { recursive: true, force: true });\n }\n if (existsSync(taskDir)) {\n await rm(taskDir, { recursive: true, force: true });\n }\n this.log.info(`Team \"${this.teamName}\" destroyed`);\n }\n\n private async writeConfig(config: TeamConfig): Promise<void> {\n const path = teamConfigPath(this.teamName);\n await writeFile(path, JSON.stringify(config, null, 2), \"utf-8\");\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst CLAUDE_DIR = join(homedir(), \".claude\");\n\nexport function teamsDir(): string {\n return join(CLAUDE_DIR, \"teams\");\n}\n\nexport function teamDir(teamName: string): string {\n return join(teamsDir(), teamName);\n}\n\nexport function teamConfigPath(teamName: string): string {\n return join(teamDir(teamName), \"config.json\");\n}\n\nexport function inboxesDir(teamName: string): string {\n return join(teamDir(teamName), \"inboxes\");\n}\n\nexport function inboxPath(teamName: string, agentName: string): string {\n return join(inboxesDir(teamName), `${agentName}.json`);\n}\n\nexport function tasksBaseDir(): string {\n return join(CLAUDE_DIR, \"tasks\");\n}\n\nexport function tasksDir(teamName: string): string {\n return join(tasksBaseDir(), teamName);\n}\n\nexport function taskPath(teamName: string, taskId: string): string {\n return join(tasksDir(teamName), `${taskId}.json`);\n}\n","import { readFile, writeFile, readdir, mkdir, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { tasksDir, taskPath } from \"./paths.js\";\nimport type { TaskFile, TaskStatus, Logger } from \"./types.js\";\n\nexport class TaskManager {\n private nextId = 1;\n\n constructor(\n private teamName: string,\n private log: Logger\n ) {}\n\n /**\n * Initialize the task directory. Call after team creation.\n * Also scans for existing tasks to set the next ID correctly.\n */\n async init(): Promise<void> {\n const dir = tasksDir(this.teamName);\n await mkdir(dir, { recursive: true });\n\n // Scan existing tasks to find the max ID\n const existing = await this.list();\n if (existing.length > 0) {\n const maxId = Math.max(...existing.map((t) => parseInt(t.id, 10)));\n this.nextId = maxId + 1;\n }\n }\n\n /**\n * Create a new task. Returns the assigned task ID.\n */\n async create(\n task: Omit<TaskFile, \"id\" | \"blocks\" | \"blockedBy\" | \"status\"> & {\n blocks?: string[];\n blockedBy?: string[];\n status?: TaskStatus;\n }\n ): Promise<string> {\n const id = String(this.nextId++);\n const full: TaskFile = {\n id,\n subject: task.subject,\n description: task.description,\n activeForm: task.activeForm,\n owner: task.owner,\n status: task.status || \"pending\",\n blocks: task.blocks || [],\n blockedBy: task.blockedBy || [],\n metadata: task.metadata,\n };\n\n await this.writeTask(full);\n this.log.debug(`Created task #${id}: ${task.subject}`);\n return id;\n }\n\n /**\n * Get a task by ID.\n */\n async get(taskId: string): Promise<TaskFile> {\n const path = taskPath(this.teamName, taskId);\n if (!existsSync(path)) {\n throw new Error(`Task #${taskId} not found`);\n }\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw);\n }\n\n /**\n * Update a task. Merges the provided fields.\n */\n async update(\n taskId: string,\n updates: Partial<\n Pick<\n TaskFile,\n | \"subject\"\n | \"description\"\n | \"activeForm\"\n | \"owner\"\n | \"status\"\n | \"blocks\"\n | \"blockedBy\"\n | \"metadata\"\n >\n >\n ): Promise<TaskFile> {\n const task = await this.get(taskId);\n Object.assign(task, updates);\n await this.writeTask(task);\n this.log.debug(`Updated task #${taskId}: status=${task.status}`);\n return task;\n }\n\n /**\n * Add blocking relationships.\n */\n async addBlocks(taskId: string, blockedTaskIds: string[]): Promise<void> {\n const task = await this.get(taskId);\n const toAdd = blockedTaskIds.filter((id) => !task.blocks.includes(id));\n task.blocks.push(...toAdd);\n await this.writeTask(task);\n\n // Also update the blockedBy on the other tasks\n for (const blockedId of toAdd) {\n const blocked = await this.get(blockedId);\n if (!blocked.blockedBy.includes(taskId)) {\n blocked.blockedBy.push(taskId);\n await this.writeTask(blocked);\n }\n }\n }\n\n /**\n * List all tasks.\n */\n async list(): Promise<TaskFile[]> {\n const dir = tasksDir(this.teamName);\n if (!existsSync(dir)) return [];\n\n const files = await readdir(dir);\n const tasks: TaskFile[] = [];\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n const raw = await readFile(taskPath(this.teamName, file.replace(\".json\", \"\")), \"utf-8\");\n tasks.push(JSON.parse(raw));\n }\n\n return tasks.sort((a, b) => parseInt(a.id) - parseInt(b.id));\n }\n\n /**\n * Delete a task file.\n */\n async delete(taskId: string): Promise<void> {\n const path = taskPath(this.teamName, taskId);\n if (existsSync(path)) {\n await rm(path);\n this.log.debug(`Deleted task #${taskId}`);\n }\n }\n\n /**\n * Wait for a task to reach a target status.\n */\n async waitFor(\n taskId: string,\n targetStatus: TaskStatus = \"completed\",\n opts?: { timeout?: number; pollInterval?: number }\n ): Promise<TaskFile> {\n const timeout = opts?.timeout ?? 300_000; // 5 min default\n const interval = opts?.pollInterval ?? 1_000;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const task = await this.get(taskId);\n if (task.status === targetStatus) return task;\n await sleep(interval);\n }\n\n throw new Error(\n `Timeout waiting for task #${taskId} to reach \"${targetStatus}\"`\n );\n }\n\n private async writeTask(task: TaskFile): Promise<void> {\n const path = taskPath(this.teamName, task.id);\n await writeFile(path, JSON.stringify(task, null, 4), \"utf-8\");\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { execSync } from \"node:child_process\";\nimport type { Logger } from \"./types.js\";\n\nexport interface SpawnOptions {\n teamName: string;\n agentName: string;\n agentId: string;\n agentType?: string;\n model?: string;\n cwd?: string;\n parentSessionId?: string;\n color?: string;\n claudeBinary?: string;\n permissions?: string[];\n permissionMode?: string;\n teammateMode?: \"auto\" | \"tmux\" | \"in-process\";\n /** Extra environment variables to inject into the agent process */\n env?: Record<string, string>;\n}\n\n/**\n * Manages Claude Code agent processes.\n * Spawns agents inside a Python-based PTY wrapper since the Claude Code TUI\n * binary requires a real terminal to function.\n */\nexport class ProcessManager {\n private processes = new Map<string, ChildProcess>();\n private log: Logger;\n\n constructor(logger: Logger) {\n this.log = logger;\n }\n\n /**\n * Spawn a new claude CLI process in teammate mode.\n * Uses a Python PTY wrapper to provide the terminal the TUI needs.\n */\n spawn(opts: SpawnOptions): ChildProcess {\n let binary = opts.claudeBinary || \"claude\";\n if (!binary.startsWith(\"/\")) {\n try {\n binary = execSync(`which ${binary}`, { encoding: \"utf-8\" }).trim();\n } catch {\n // fall through\n }\n }\n\n const claudeArgs: string[] = [\n \"--teammate-mode\",\n opts.teammateMode || \"auto\",\n \"--agent-id\",\n opts.agentId,\n \"--agent-name\",\n opts.agentName,\n \"--team-name\",\n opts.teamName,\n ];\n\n if (opts.agentType) {\n claudeArgs.push(\"--agent-type\", opts.agentType);\n }\n if (opts.color) {\n claudeArgs.push(\"--agent-color\", opts.color);\n }\n if (opts.parentSessionId) {\n claudeArgs.push(\"--parent-session-id\", opts.parentSessionId);\n }\n if (opts.model) {\n claudeArgs.push(\"--model\", opts.model);\n }\n if (opts.permissionMode) {\n claudeArgs.push(\"--permission-mode\", opts.permissionMode);\n }\n if (opts.permissions) {\n for (const perm of opts.permissions) {\n claudeArgs.push(\"--allowedTools\", perm);\n }\n }\n\n this.log.info(\n `Spawning agent \"${opts.agentName}\": ${binary} ${claudeArgs.join(\" \")}`\n );\n\n // Python PTY wrapper — provides a real terminal to the claude TUI binary.\n // We pass the command as JSON to avoid shell escaping issues.\n const cmdJson = JSON.stringify([binary, ...claudeArgs]);\n const pythonScript = `\nimport pty, os, sys, json, signal, select\n\ncmd = json.loads(sys.argv[1])\npid, fd = pty.fork()\nif pid == 0:\n os.execvp(cmd[0], cmd)\nelse:\n signal.signal(signal.SIGTERM, lambda *a: (os.kill(pid, signal.SIGTERM), sys.exit(0)))\n signal.signal(signal.SIGINT, lambda *a: (os.kill(pid, signal.SIGTERM), sys.exit(0)))\n try:\n while True:\n r, _, _ = select.select([fd, 0], [], [], 1.0)\n if fd in r:\n try:\n data = os.read(fd, 4096)\n if not data:\n break\n os.write(1, data)\n except OSError:\n break\n if 0 in r:\n try:\n data = os.read(0, 4096)\n if not data:\n break\n os.write(fd, data)\n except OSError:\n break\n except:\n pass\n finally:\n try:\n os.kill(pid, signal.SIGTERM)\n except:\n pass\n _, status = os.waitpid(pid, 0)\n sys.exit(os.WEXITSTATUS(status) if os.WIFEXITED(status) else 1)\n`;\n\n const proc = spawn(\"python3\", [\"-c\", pythonScript, cmdJson], {\n cwd: opts.cwd || process.cwd(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: {\n ...process.env,\n CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS: \"1\",\n ...opts.env,\n },\n });\n\n this.processes.set(opts.agentName, proc);\n\n proc.on(\"exit\", (code, signal) => {\n this.log.info(\n `Agent \"${opts.agentName}\" exited (code=${code}, signal=${signal})`\n );\n this.processes.delete(opts.agentName);\n });\n\n proc.on(\"error\", (err) => {\n this.log.error(`Agent \"${opts.agentName}\" process error: ${err.message}`);\n this.processes.delete(opts.agentName);\n });\n\n return proc;\n }\n\n /**\n * Register a callback for when an agent process exits.\n */\n onExit(name: string, callback: (code: number | null) => void): void {\n const proc = this.processes.get(name);\n if (proc) proc.on(\"exit\", (code) => callback(code));\n }\n\n /**\n * Get the process for a named agent.\n */\n get(name: string): ChildProcess | undefined {\n return this.processes.get(name);\n }\n\n /**\n * Check if an agent process is still running.\n */\n isRunning(name: string): boolean {\n const proc = this.processes.get(name);\n return proc !== undefined && proc.exitCode === null && !proc.killed;\n }\n\n /**\n * Get the PID of a running agent.\n */\n getPid(name: string): number | undefined {\n return this.processes.get(name)?.pid;\n }\n\n /**\n * Kill a specific agent process.\n */\n async kill(name: string, signal: NodeJS.Signals = \"SIGTERM\"): Promise<void> {\n const proc = this.processes.get(name);\n if (!proc) return;\n\n proc.kill(signal);\n\n await Promise.race([\n new Promise<void>((resolve) => proc.on(\"exit\", () => resolve())),\n new Promise<void>((resolve) =>\n setTimeout(() => {\n if (this.processes.has(name)) {\n this.log.warn(`Force-killing agent \"${name}\" with SIGKILL`);\n try {\n proc.kill(\"SIGKILL\");\n } catch {\n // May already be dead\n }\n }\n resolve();\n }, 5_000)\n ),\n ]);\n\n this.processes.delete(name);\n }\n\n /**\n * Kill all agent processes.\n */\n async killAll(): Promise<void> {\n const names = [...this.processes.keys()];\n await Promise.all(names.map((name) => this.kill(name)));\n }\n\n /**\n * Get all running agent names.\n */\n runningAgents(): string[] {\n return [...this.processes.keys()].filter((n) => this.isRunning(n));\n }\n}\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { lock, unlock } from \"proper-lockfile\";\nimport { inboxPath } from \"./paths.js\";\nimport type { InboxMessage, Logger, StructuredMessage } from \"./types.js\";\n\nconst LOCK_OPTIONS = {\n retries: { retries: 5, minTimeout: 50, maxTimeout: 500 },\n stale: 10_000,\n};\n\nasync function ensureDir(filePath: string): Promise<void> {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nasync function ensureFile(filePath: string): Promise<void> {\n await ensureDir(filePath);\n if (!existsSync(filePath)) {\n await writeFile(filePath, \"[]\", \"utf-8\");\n }\n}\n\n/**\n * Write a message to an agent's inbox with file-locking.\n */\nexport async function writeInbox(\n teamName: string,\n agentName: string,\n message: Omit<InboxMessage, \"read\">,\n logger?: Logger\n): Promise<void> {\n const path = inboxPath(teamName, agentName);\n await ensureFile(path);\n\n let release: (() => Promise<void>) | undefined;\n try {\n release = await lock(path, LOCK_OPTIONS);\n const raw = await readFile(path, \"utf-8\");\n const messages: InboxMessage[] = JSON.parse(raw || \"[]\");\n messages.push({ ...message, read: false });\n await writeFile(path, JSON.stringify(messages, null, 2), \"utf-8\");\n logger?.debug(`Wrote message to inbox ${agentName}`, message.from);\n } finally {\n if (release) await release();\n }\n}\n\n/**\n * Read all messages from an agent's inbox.\n */\nexport async function readInbox(\n teamName: string,\n agentName: string\n): Promise<InboxMessage[]> {\n const path = inboxPath(teamName, agentName);\n if (!existsSync(path)) return [];\n\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw || \"[]\");\n}\n\n/**\n * Read unread messages from an agent's inbox and mark them as read.\n */\nexport async function readUnread(\n teamName: string,\n agentName: string\n): Promise<InboxMessage[]> {\n const path = inboxPath(teamName, agentName);\n if (!existsSync(path)) return [];\n\n let release: (() => Promise<void>) | undefined;\n try {\n release = await lock(path, LOCK_OPTIONS);\n const raw = await readFile(path, \"utf-8\");\n const messages: InboxMessage[] = JSON.parse(raw || \"[]\");\n\n const unread = messages.filter((m) => !m.read);\n if (unread.length === 0) return [];\n\n // Mark all as read\n for (const m of messages) {\n m.read = true;\n }\n await writeFile(path, JSON.stringify(messages, null, 2), \"utf-8\");\n return unread;\n } finally {\n if (release) await release();\n }\n}\n\n/**\n * Parse a structured message from an inbox message's text field.\n * Messages can be either JSON-encoded structured messages or plain text.\n */\nexport function parseMessage(msg: InboxMessage): StructuredMessage {\n try {\n const parsed = JSON.parse(msg.text);\n if (parsed && typeof parsed === \"object\" && \"type\" in parsed) {\n return parsed as StructuredMessage;\n }\n } catch {\n // Not JSON, treat as plain text\n }\n return { type: \"plain_text\", text: msg.text };\n}\n","import { readUnread, parseMessage } from \"./inbox.js\";\nimport type { InboxMessage, Logger, StructuredMessage } from \"./types.js\";\n\nexport interface PollEvent {\n raw: InboxMessage;\n parsed: StructuredMessage;\n}\n\n/**\n * Polls an agent's inbox for new messages.\n * Used by the controller to watch its own inbox for responses from agents.\n */\nexport class InboxPoller {\n private teamName: string;\n private agentName: string;\n private interval: number;\n private timer: ReturnType<typeof setInterval> | null = null;\n private log: Logger;\n private handlers: ((events: PollEvent[]) => void)[] = [];\n\n constructor(\n teamName: string,\n agentName: string,\n logger: Logger,\n opts?: { pollInterval?: number }\n ) {\n this.teamName = teamName;\n this.agentName = agentName;\n this.log = logger;\n this.interval = opts?.pollInterval ?? 500;\n }\n\n /**\n * Register a handler for new messages.\n */\n onMessages(handler: (events: PollEvent[]) => void): void {\n this.handlers.push(handler);\n }\n\n /**\n * Start polling.\n */\n start(): void {\n if (this.timer) return;\n this.log.debug(\n `Starting inbox poller for \"${this.agentName}\" (interval=${this.interval}ms)`\n );\n this.timer = setInterval(() => this.poll(), this.interval);\n }\n\n /**\n * Stop polling.\n */\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n this.log.debug(`Stopped inbox poller for \"${this.agentName}\"`);\n }\n }\n\n /**\n * Poll once for new messages.\n */\n async poll(): Promise<PollEvent[]> {\n try {\n const unread = await readUnread(this.teamName, this.agentName);\n if (unread.length === 0) return [];\n\n const events: PollEvent[] = unread.map((raw) => ({\n raw,\n parsed: parseMessage(raw),\n }));\n\n for (const handler of this.handlers) {\n try {\n handler(events);\n } catch (err) {\n this.log.error(\"Inbox handler error:\", String(err));\n }\n }\n\n return events;\n } catch (err) {\n this.log.error(\"Inbox poll error:\", String(err));\n return [];\n }\n }\n}\n","import type { ReceiveOptions, InboxMessage } from \"./types.js\";\n\n/**\n * Interface for the controller methods that AgentHandle needs.\n * This avoids a circular dependency with the full controller.\n */\nexport interface AgentController {\n send(agentName: string, message: string, summary?: string): Promise<void>;\n receive(agentName: string, opts?: ReceiveOptions): Promise<InboxMessage[]>;\n killAgent(agentName: string): Promise<void>;\n sendShutdownRequest(agentName: string): Promise<void>;\n isAgentRunning(agentName: string): boolean;\n}\n\n/**\n * Proxy object for interacting with a specific agent.\n */\nexport class AgentHandle {\n readonly name: string;\n readonly pid: number | undefined;\n private controller: AgentController;\n\n constructor(\n controller: AgentController,\n name: string,\n pid: number | undefined\n ) {\n this.controller = controller;\n this.name = name;\n this.pid = pid;\n }\n\n /**\n * Send a message to this agent.\n */\n async send(message: string, summary?: string): Promise<void> {\n return this.controller.send(this.name, message, summary);\n }\n\n /**\n * Wait for a response from this agent.\n * Returns the text of the first unread plain-text message.\n */\n async receive(opts?: ReceiveOptions): Promise<string> {\n const messages = await this.controller.receive(this.name, opts);\n const texts = messages.map((m) => m.text);\n return texts.join(\"\\n\");\n }\n\n /**\n * Send a message and wait for the response. Convenience method.\n */\n async ask(question: string, opts?: ReceiveOptions): Promise<string> {\n await this.send(question);\n return this.receive(opts);\n }\n\n /**\n * Check if the agent process is still running.\n */\n get isRunning(): boolean {\n return this.controller.isAgentRunning(this.name);\n }\n\n /**\n * Request the agent to shut down gracefully.\n */\n async shutdown(): Promise<void> {\n return this.controller.sendShutdownRequest(this.name);\n }\n\n /**\n * Force-kill the agent process.\n */\n async kill(): Promise<void> {\n return this.controller.killAgent(this.name);\n }\n\n /**\n * Async iterator for agent events (messages from this agent).\n * Polls the controller's inbox for messages from this agent.\n */\n async *events(opts?: {\n pollInterval?: number;\n timeout?: number;\n }): AsyncGenerator<InboxMessage> {\n const interval = opts?.pollInterval ?? 500;\n const timeout = opts?.timeout ?? 0; // 0 = no timeout\n const deadline = timeout > 0 ? Date.now() + timeout : Infinity;\n\n while (Date.now() < deadline) {\n try {\n const messages = await this.controller.receive(this.name, {\n timeout: interval,\n pollInterval: interval,\n });\n for (const msg of messages) {\n yield msg;\n }\n } catch {\n // Timeout on receive, just continue polling\n }\n\n if (!this.isRunning) return;\n }\n }\n}\n","import type { Logger, LogLevel } from \"./types.js\";\n\nconst LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\nexport function createLogger(level: LogLevel = \"info\"): Logger {\n const threshold = LEVELS[level];\n\n const noop = () => {};\n const make =\n (lvl: LogLevel, fn: (...args: unknown[]) => void) =>\n (msg: string, ...args: unknown[]) => {\n if (LEVELS[lvl] >= threshold) {\n fn(`[claude-ctrl:${lvl}]`, msg, ...args);\n }\n };\n\n return {\n debug: threshold <= LEVELS.debug ? make(\"debug\", console.debug) : noop,\n info: threshold <= LEVELS.info ? make(\"info\", console.info) : noop,\n warn: threshold <= LEVELS.warn ? make(\"warn\", console.warn) : noop,\n error: threshold <= LEVELS.error ? make(\"error\", console.error) : noop,\n };\n}\n\nexport const silentLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n","import { EventEmitter } from \"node:events\";\nimport { randomUUID } from \"node:crypto\";\nimport { ClaudeCodeController } from \"./controller.js\";\nimport type { AgentHandle } from \"./agent-handle.js\";\nimport type {\n LogLevel,\n Logger,\n AgentType,\n PermissionMode,\n InboxMessage,\n PermissionRequestMessage,\n PlanApprovalRequestMessage,\n} from \"./types.js\";\n\n// Polyfill for Node < 20.4\n(Symbol as any).asyncDispose ??= Symbol(\"Symbol.asyncDispose\");\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport type PermissionPreset = \"full\" | \"edit\" | \"plan\" | \"ask\";\n\nexport interface ClaudeOptions {\n /** Model to use: \"sonnet\" | \"opus\" | \"haiku\" | full model ID */\n model?: \"sonnet\" | \"opus\" | \"haiku\" | (string & {});\n /** Anthropic API key. Maps to ANTHROPIC_AUTH_TOKEN env var. */\n apiKey?: string;\n /** API base URL. Maps to ANTHROPIC_BASE_URL env var. */\n baseUrl?: string;\n /** Request timeout in ms. Maps to API_TIMEOUT_MS env var. */\n timeout?: number;\n /** Working directory for the agent. Defaults to process.cwd(). */\n cwd?: string;\n /**\n * Permission level:\n * - \"full\" (default) — all tools, no approval needed\n * - \"edit\" — auto-approve read/write/bash\n * - \"plan\" — read-only exploration\n * - \"ask\" — fires permission events for each tool use\n */\n permissions?: PermissionPreset;\n /**\n * Auto-approve permission and plan requests.\n * - `true` — approve everything automatically\n * - `string[]` — only auto-approve these tool names, reject the rest\n *\n * Only meaningful with `permissions: \"ask\"`. Ignored when \"full\" or \"edit\".\n *\n * @example\n * ```ts\n * // Approve everything\n * await claude.agent({ permissions: \"ask\", autoApprove: true });\n *\n * // Only approve safe tools\n * await claude.agent({ permissions: \"ask\", autoApprove: [\"Read\", \"Glob\", \"Grep\"] });\n * ```\n */\n autoApprove?: boolean | string[];\n /**\n * Inline callback for permission requests.\n * Called when the agent wants to use a tool.\n * Provides `req.approve()` / `req.reject()` methods.\n *\n * @example\n * ```ts\n * await claude.agent({\n * permissions: \"ask\",\n * onPermission: (req) => {\n * req.toolName === \"Bash\" ? req.reject() : req.approve();\n * },\n * });\n * ```\n */\n onPermission?: (request: PermissionRequestInfo) => void;\n /**\n * Inline callback for plan approval requests.\n * Called when the agent submits a plan for review.\n *\n * @example\n * ```ts\n * await claude.agent({\n * onPlan: (req) => {\n * console.log(req.planContent);\n * req.approve();\n * },\n * });\n * ```\n */\n onPlan?: (request: PlanRequestInfo) => void;\n /** Additional environment variables (escape hatch). */\n env?: Record<string, string>;\n /** Log level. Defaults to \"warn\" for the simplified API. */\n logLevel?: LogLevel;\n /** Custom logger instance. */\n logger?: Logger;\n /** Agent name. Auto-generated if omitted. */\n name?: string;\n /** Agent type. Defaults to \"general-purpose\". */\n type?: AgentType;\n /** Path to the claude binary. */\n claudeBinary?: string;\n /** Max time in ms to wait for agent to become ready. Default: 60_000. */\n readyTimeout?: number;\n}\n\nexport interface AskOptions {\n /** Response timeout in ms. Default: 120_000. */\n timeout?: number;\n /** Poll interval in ms. Default: 500. */\n pollInterval?: number;\n}\n\nexport interface SessionOptions extends ClaudeOptions {\n /** Team name. Auto-generated if omitted. */\n teamName?: string;\n}\n\nexport interface SessionAgentOptions {\n /** Model override for this agent. */\n model?: string;\n /** Working directory override. */\n cwd?: string;\n /** Agent type override. */\n type?: AgentType;\n /** Permission preset override. */\n permissions?: PermissionPreset;\n /** Auto-approve permission/plan requests. See ClaudeOptions.autoApprove. */\n autoApprove?: boolean | string[];\n /** Inline permission callback. See ClaudeOptions.onPermission. */\n onPermission?: (request: PermissionRequestInfo) => void;\n /** Inline plan callback. See ClaudeOptions.onPlan. */\n onPlan?: (request: PlanRequestInfo) => void;\n /** Per-agent env overrides. */\n env?: Record<string, string>;\n /** Max time in ms to wait for agent to become ready. Default: 60_000. */\n readyTimeout?: number;\n}\n\nexport interface PermissionRequestInfo {\n requestId: string;\n toolName: string;\n description: string;\n input?: unknown;\n approve(): Promise<void>;\n reject(): Promise<void>;\n}\n\nexport interface PlanRequestInfo {\n requestId: string;\n planContent?: string;\n approve(feedback?: string): Promise<void>;\n reject(feedback: string): Promise<void>;\n}\n\nexport interface AgentEvents {\n message: [text: string];\n idle: [];\n permission: [request: PermissionRequestInfo];\n plan: [request: PlanRequestInfo];\n exit: [code: number | null];\n error: [error: Error];\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction buildEnv(opts: ClaudeOptions): Record<string, string> {\n const env: Record<string, string> = { ...opts.env };\n // First-class options override env keys\n if (opts.apiKey) env.ANTHROPIC_AUTH_TOKEN = opts.apiKey;\n if (opts.baseUrl) env.ANTHROPIC_BASE_URL = opts.baseUrl;\n if (opts.timeout != null) env.API_TIMEOUT_MS = String(opts.timeout);\n return env;\n}\n\nfunction resolvePermissions(\n preset?: PermissionPreset\n): { permissionMode?: PermissionMode } {\n switch (preset) {\n case \"edit\":\n return { permissionMode: \"acceptEdits\" };\n case \"plan\":\n return { permissionMode: \"plan\" };\n case \"ask\":\n return { permissionMode: \"default\" };\n case \"full\":\n default:\n // Don't pass --permission-mode flag at all for \"full\" —\n // the CLI default already allows everything and skipping\n // the flag avoids issues with idle detection.\n return { permissionMode: undefined };\n }\n}\n\nfunction waitForReady(\n controller: ClaudeCodeController,\n agentName: string,\n timeoutMs = 15_000\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) return;\n cleanup();\n reject(\n new Error(\n `Agent \"${agentName}\" did not become ready within ${timeoutMs}ms`\n )\n );\n }, timeoutMs);\n\n // Resolve early on idle or message — agent is confirmed responsive\n const onReady = (name: string) => {\n if (name === agentName && !settled) {\n settled = true;\n cleanup();\n resolve();\n }\n };\n\n const onExit = (name: string, code: number | null) => {\n if (name === agentName && !settled) {\n settled = true;\n cleanup();\n reject(\n new Error(\n `Agent \"${agentName}\" exited before becoming ready (code=${code})`\n )\n );\n }\n };\n\n // Resolve when the agent process is confirmed running.\n // Claude Code agents don't reliably send idle_notification on initial boot,\n // so we also listen for agent:spawned to resolve after the process starts.\n const onSpawned = (name: string) => {\n if (name === agentName && !settled) {\n settled = true;\n cleanup();\n resolve();\n }\n };\n\n const cleanup = () => {\n clearTimeout(timer);\n controller.removeListener(\"idle\", onReady);\n controller.removeListener(\"message\", onReady);\n controller.removeListener(\"agent:spawned\", onSpawned);\n controller.removeListener(\"agent:exited\", onExit);\n };\n\n controller.on(\"idle\", onReady);\n controller.on(\"message\", onReady);\n controller.on(\"agent:spawned\", onSpawned);\n controller.on(\"agent:exited\", onExit);\n });\n}\n\n// ─── Agent ──────────────────────────────────────────────────────────────────\n\n/** Options that affect agent behavior (callbacks & auto-approve). */\ninterface AgentBehavior {\n autoApprove?: boolean | string[];\n onPermission?: (request: PermissionRequestInfo) => void;\n onPlan?: (request: PlanRequestInfo) => void;\n}\n\nexport class Agent extends EventEmitter<AgentEvents> {\n private controller: ClaudeCodeController;\n private handle: AgentHandle;\n private ownsController: boolean;\n private disposed = false;\n private boundListeners: Array<{ event: string; fn: (...args: any[]) => void }> = [];\n\n private constructor(\n controller: ClaudeCodeController,\n handle: AgentHandle,\n ownsController: boolean,\n behavior?: AgentBehavior\n ) {\n super();\n this.controller = controller;\n this.handle = handle;\n this.ownsController = ownsController;\n this.wireEvents();\n this.wireBehavior(behavior);\n }\n\n /** Create a standalone agent (owns its own controller). */\n static async create(opts: ClaudeOptions = {}): Promise<Agent> {\n const name = opts.name ?? `agent-${randomUUID().slice(0, 8)}`;\n const env = buildEnv(opts);\n const { permissionMode } = resolvePermissions(opts.permissions);\n\n const controller = new ClaudeCodeController({\n teamName: `claude-${randomUUID().slice(0, 8)}`,\n cwd: opts.cwd,\n claudeBinary: opts.claudeBinary,\n env,\n logLevel: opts.logLevel ?? \"warn\",\n logger: opts.logger,\n });\n\n await controller.init();\n\n // Set up ready detection BEFORE spawning so we don't miss the idle event\n const ready = waitForReady(controller, name, opts.readyTimeout);\n\n try {\n const handle = await controller.spawnAgent({\n name,\n type: opts.type ?? \"general-purpose\",\n model: opts.model,\n cwd: opts.cwd,\n permissionMode,\n });\n\n const agent = new Agent(controller, handle, true, {\n autoApprove: opts.autoApprove,\n onPermission: opts.onPermission,\n onPlan: opts.onPlan,\n });\n await ready;\n return agent;\n } catch (err) {\n await controller.shutdown().catch(() => {});\n throw err;\n }\n }\n\n /** Create an agent within an existing session (session owns the controller). */\n static async createInSession(\n controller: ClaudeCodeController,\n name: string,\n opts: SessionAgentOptions = {}\n ): Promise<Agent> {\n const { permissionMode } = resolvePermissions(opts.permissions);\n const ready = waitForReady(controller, name, opts.readyTimeout);\n\n const handle = await controller.spawnAgent({\n name,\n type: opts.type ?? \"general-purpose\",\n model: opts.model,\n cwd: opts.cwd,\n permissionMode,\n env: opts.env,\n });\n\n const agent = new Agent(controller, handle, false, {\n autoApprove: opts.autoApprove,\n onPermission: opts.onPermission,\n onPlan: opts.onPlan,\n });\n await ready;\n return agent;\n }\n\n /** The agent's name. */\n get name(): string {\n return this.handle.name;\n }\n\n /** The agent process PID. */\n get pid(): number | undefined {\n return this.handle.pid;\n }\n\n /** Whether the agent process is still running. */\n get isRunning(): boolean {\n return this.handle.isRunning;\n }\n\n /**\n * Send a message and wait for the response.\n *\n * Uses event-based waiting (via the controller's InboxPoller) instead of\n * polling `readUnread()` directly, which avoids a race condition where the\n * poller marks inbox messages as read before `receive()` can see them.\n */\n async ask(question: string, opts?: AskOptions): Promise<string> {\n this.ensureNotDisposed();\n const timeout = opts?.timeout ?? 120_000;\n\n // Register listener BEFORE sending so we don't miss the response\n const responsePromise = new Promise<string>((resolve, reject) => {\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(`Timeout (${timeout}ms) waiting for response`));\n }, timeout);\n\n const onMsg = (text: string) => {\n cleanup();\n resolve(text);\n };\n const onExit = (code: number | null) => {\n cleanup();\n reject(new Error(`Agent exited (code=${code}) before responding`));\n };\n const cleanup = () => {\n clearTimeout(timer);\n this.removeListener(\"message\", onMsg);\n this.removeListener(\"exit\", onExit);\n };\n\n this.on(\"message\", onMsg);\n this.on(\"exit\", onExit);\n });\n\n // Agents in teammate mode don't always use SendMessage unprompted.\n // Append a reminder so responses come back through the inbox reliably.\n const wrapped = `${question}\\n\\nIMPORTANT: You MUST send your complete answer back using the SendMessage tool. Do NOT just think your answer — use the SendMessage tool to reply.`;\n await this.handle.send(wrapped);\n return responsePromise;\n }\n\n /** Send a message without waiting for a response. */\n async send(message: string): Promise<void> {\n this.ensureNotDisposed();\n return this.handle.send(message);\n }\n\n /** Wait for the next response from this agent. */\n async receive(opts?: AskOptions): Promise<string> {\n this.ensureNotDisposed();\n const timeout = opts?.timeout ?? 120_000;\n\n return new Promise<string>((resolve, reject) => {\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(`Timeout (${timeout}ms) waiting for response`));\n }, timeout);\n\n const onMsg = (text: string) => {\n cleanup();\n resolve(text);\n };\n const onExit = (code: number | null) => {\n cleanup();\n reject(new Error(`Agent exited (code=${code}) before responding`));\n };\n const cleanup = () => {\n clearTimeout(timer);\n this.removeListener(\"message\", onMsg);\n this.removeListener(\"exit\", onExit);\n };\n\n this.on(\"message\", onMsg);\n this.on(\"exit\", onExit);\n });\n }\n\n /**\n * Close this agent. If standalone, shuts down the entire controller.\n * If session-owned, kills only this agent's process.\n */\n async close(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n this.unwireEvents();\n\n if (this.ownsController) {\n await this.controller.shutdown();\n } else {\n await this.handle.kill();\n }\n }\n\n /** Mark as disposed (used by Session when it closes). */\n markDisposed(): void {\n this.disposed = true;\n this.unwireEvents();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n\n private wireEvents(): void {\n const agentName = this.handle.name;\n\n const onMessage = (name: string, msg: InboxMessage) => {\n if (name === agentName) this.emit(\"message\", msg.text);\n };\n const onIdle = (name: string) => {\n if (name === agentName) this.emit(\"idle\");\n };\n const onPermission = (name: string, parsed: PermissionRequestMessage) => {\n if (name !== agentName) return;\n let handled = false;\n const guard = (fn: () => Promise<void>) => () => {\n if (handled) return Promise.resolve();\n handled = true;\n return fn();\n };\n this.emit(\"permission\", {\n requestId: parsed.requestId,\n toolName: parsed.toolName,\n description: parsed.description,\n input: parsed.input,\n approve: guard(() =>\n this.controller.sendPermissionResponse(agentName, parsed.requestId, true)\n ),\n reject: guard(() =>\n this.controller.sendPermissionResponse(agentName, parsed.requestId, false)\n ),\n });\n };\n const onPlan = (name: string, parsed: PlanApprovalRequestMessage) => {\n if (name !== agentName) return;\n let handled = false;\n const guard = (fn: (...a: any[]) => Promise<void>) => (...args: any[]) => {\n if (handled) return Promise.resolve();\n handled = true;\n return fn(...args);\n };\n this.emit(\"plan\", {\n requestId: parsed.requestId,\n planContent: parsed.planContent,\n approve: guard((feedback?: string) =>\n this.controller.sendPlanApproval(agentName, parsed.requestId, true, feedback)\n ),\n reject: guard((feedback: string) =>\n this.controller.sendPlanApproval(agentName, parsed.requestId, false, feedback)\n ),\n });\n };\n const onExit = (name: string, code: number | null) => {\n if (name === agentName) this.emit(\"exit\", code);\n };\n const onError = (err: Error) => {\n this.emit(\"error\", err);\n };\n\n this.controller.on(\"message\", onMessage);\n this.controller.on(\"idle\", onIdle);\n this.controller.on(\"permission:request\", onPermission);\n this.controller.on(\"plan:approval_request\", onPlan);\n this.controller.on(\"agent:exited\", onExit);\n this.controller.on(\"error\", onError);\n\n this.boundListeners = [\n { event: \"message\", fn: onMessage },\n { event: \"idle\", fn: onIdle },\n { event: \"permission:request\", fn: onPermission },\n { event: \"plan:approval_request\", fn: onPlan },\n { event: \"agent:exited\", fn: onExit },\n { event: \"error\", fn: onError },\n ];\n }\n\n private unwireEvents(): void {\n for (const { event, fn } of this.boundListeners) {\n this.controller.removeListener(event, fn);\n }\n this.boundListeners = [];\n }\n\n private wireBehavior(behavior?: AgentBehavior): void {\n if (!behavior) return;\n\n const { autoApprove, onPermission, onPlan } = behavior;\n\n // autoApprove: wire up automatic permission and plan handling\n if (autoApprove != null) {\n this.on(\"permission\", (req) => {\n if (autoApprove === true) {\n req.approve();\n } else if (Array.isArray(autoApprove)) {\n autoApprove.includes(req.toolName) ? req.approve() : req.reject();\n }\n });\n\n // autoApprove also auto-approves plans\n if (autoApprove === true) {\n this.on(\"plan\", (req) => req.approve());\n }\n }\n\n // Inline callbacks (run after autoApprove, so they can override)\n if (onPermission) {\n this.on(\"permission\", onPermission);\n }\n if (onPlan) {\n this.on(\"plan\", onPlan);\n }\n }\n\n private ensureNotDisposed(): void {\n if (this.disposed) {\n throw new Error(\"Agent has been closed\");\n }\n }\n}\n\n// ─── Session ────────────────────────────────────────────────────────────────\n\nexport class Session {\n readonly controller: ClaudeCodeController;\n private defaults: SessionOptions;\n private agents = new Map<string, Agent>();\n private disposed = false;\n\n private constructor(\n controller: ClaudeCodeController,\n defaults: SessionOptions\n ) {\n this.controller = controller;\n this.defaults = defaults;\n }\n\n static async create(opts: SessionOptions = {}): Promise<Session> {\n const env = buildEnv(opts);\n const controller = new ClaudeCodeController({\n teamName: opts.teamName ?? `session-${randomUUID().slice(0, 8)}`,\n cwd: opts.cwd,\n claudeBinary: opts.claudeBinary,\n env,\n logLevel: opts.logLevel ?? \"warn\",\n logger: opts.logger,\n });\n\n await controller.init();\n return new Session(controller, opts);\n }\n\n /** Spawn a named agent in this session. Inherits session defaults. */\n async agent(name: string, opts: SessionAgentOptions = {}): Promise<Agent> {\n this.ensureNotDisposed();\n\n const merged: SessionAgentOptions = {\n model: this.defaults.model,\n cwd: this.defaults.cwd,\n permissions: this.defaults.permissions,\n readyTimeout: this.defaults.readyTimeout,\n autoApprove: this.defaults.autoApprove,\n onPermission: this.defaults.onPermission,\n onPlan: this.defaults.onPlan,\n ...opts,\n };\n\n const agent = await Agent.createInSession(\n this.controller,\n name,\n merged\n );\n this.agents.set(name, agent);\n return agent;\n }\n\n /** Get an existing agent by name. */\n get(name: string): Agent | undefined {\n return this.agents.get(name);\n }\n\n /** Close all agents and shut down the session. */\n async close(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n for (const agent of this.agents.values()) {\n agent.markDisposed();\n }\n\n await this.controller.shutdown();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n\n private ensureNotDisposed(): void {\n if (this.disposed) {\n throw new Error(\"Session has been closed\");\n }\n }\n}\n\n// ─── claude() ───────────────────────────────────────────────────────────────\n\n/**\n * One-liner: send a prompt, get a response.\n * Creates an ephemeral agent, sends the message, returns the answer, cleans up.\n *\n * @example\n * ```ts\n * const answer = await claude(\"What does this project do?\", { model: \"sonnet\" });\n * ```\n */\nasync function claudeCall(\n prompt: string,\n opts: ClaudeOptions = {}\n): Promise<string> {\n const agent = await Agent.create(opts);\n try {\n return await agent.ask(prompt, { timeout: opts.timeout ?? 120_000 });\n } finally {\n await agent.close();\n }\n}\n\n/**\n * The simplified Claude Code API.\n *\n * - `claude(prompt, opts?)` — one-liner: ask a question, get an answer\n * - `claude.agent(opts?)` — create a persistent agent for multi-turn conversations\n * - `claude.session(opts?)` — create a multi-agent session\n */\nexport const claude = Object.assign(claudeCall, {\n /**\n * Create a persistent agent for multi-turn conversations.\n *\n * @example\n * ```ts\n * const agent = await claude.agent({ model: \"sonnet\" });\n * const answer = await agent.ask(\"What is 2+2?\");\n * await agent.close();\n * ```\n */\n agent: (opts?: ClaudeOptions) => Agent.create(opts),\n\n /**\n * Create a multi-agent session.\n *\n * @example\n * ```ts\n * const session = await claude.session({ model: \"sonnet\" });\n * const reviewer = await session.agent(\"reviewer\", { model: \"opus\" });\n * const coder = await session.agent(\"coder\");\n * await session.close();\n * ```\n */\n session: (opts?: SessionOptions) => Session.create(opts),\n});\n\n// Re-export helpers for testing\nexport { buildEnv, resolvePermissions, waitForReady };\n"],"mappings":"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","names":["import_hono","import_node_child_process","import_node_crypto","import_promises","import_node_fs","import_node_child_process","import_promises","import_node_fs","import_node_path","sleep","import_node_events","import_node_crypto"]}
1
+ {"version":3,"sources":["../../src/api/index.ts","../../src/api/action-tracker.ts","../../src/api/routes.ts","../../src/controller.ts","../../src/team-manager.ts","../../src/paths.ts","../../src/task-manager.ts","../../src/process-manager.ts","../../src/inbox.ts","../../src/inbox-poller.ts","../../src/agent-handle.ts","../../src/logger.ts","../../src/claude.ts"],"sourcesContent":["import { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport type { ClaudeCodeController } from \"../controller.js\";\nimport { ActionTracker } from \"./action-tracker.js\";\nimport { buildRoutes } from \"./routes.js\";\nimport type { CreateApiOptions } from \"./types.js\";\n\n/**\n * Create a standalone Hono app that exposes a ClaudeCodeController as a REST API.\n *\n * **Mode 1 – Pre-initialized controller:**\n * Pass an already-initialized controller. The API is ready to use immediately.\n * The API will NOT shut down the controller when `POST /session/shutdown` is called\n * (caller retains ownership).\n *\n * **Mode 2 – Lazy init via API:**\n * Pass no controller (or `null`). Use `POST /session/init` to create a session,\n * passing `env`, `teamName`, `cwd`, etc. in the request body.\n * The API owns the controller lifecycle and will shut it down on session end.\n *\n * @example\n * ```ts\n * // Mode 1: pre-initialized controller\n * import { ClaudeCodeController } from \"claude-code-controller\";\n * import { createApi } from \"claude-code-controller/api\";\n *\n * const controller = new ClaudeCodeController({ teamName: \"my-team\" });\n * await controller.init();\n * const app = createApi(controller);\n *\n * // Mode 2: init via API (supports env vars)\n * const app = createApi();\n * // Then: POST /session/init { \"teamName\": \"t1\", \"env\": { \"ANTHROPIC_API_KEY\": \"...\" } }\n * ```\n */\nexport function createApi(\n controller?: ClaudeCodeController | null,\n options?: CreateApiOptions\n): Hono {\n const tracker = new ActionTracker();\n\n // If a controller was provided, attach the tracker immediately\n if (controller) {\n tracker.attach(controller);\n }\n\n const state = {\n controller: controller ?? null,\n tracker,\n owned: false, // externally-provided controllers are not owned by the API\n initLock: false,\n startTime: Date.now(),\n };\n\n const app = new Hono();\n const basePath = options?.basePath ?? \"/\";\n\n // CORS: enabled by default, disable with { cors: false }\n if (options?.cors !== false) {\n app.use(\"*\", cors());\n }\n\n const routes = buildRoutes(state);\n app.route(basePath, routes);\n\n // Global error handler — returns 400 for validation errors, 500 for the rest\n app.onError((err, c) => {\n const message =\n err instanceof Error ? err.message : \"Internal server error\";\n const status = err.name === \"ValidationError\" ? 400 : 500;\n return c.json({ error: message }, status);\n });\n\n return app;\n}\n\n// Re-export types for consumers\nexport { ActionTracker } from \"./action-tracker.js\";\n\nexport type {\n CreateApiOptions,\n AskBody,\n InitSessionBody,\n SpawnAgentBody,\n SendMessageBody,\n BroadcastBody,\n ApproveBody,\n CreateTaskBody,\n UpdateTaskBody,\n AssignTaskBody,\n ApiError,\n AgentResponse,\n SessionResponse,\n HealthResponse,\n ActionsResponse,\n UnassignedTask,\n} from \"./types.js\";\n\nexport type {\n PendingApproval,\n IdleAgent,\n} from \"./action-tracker.js\";\n","import type { ClaudeCodeController } from \"../controller.js\";\nimport type {\n PlanApprovalRequestMessage,\n PermissionRequestMessage,\n} from \"../types.js\";\n\nexport interface PendingApproval {\n type: \"plan\" | \"permission\";\n agent: string;\n requestId: string;\n timestamp: string;\n action: string;\n // plan-specific\n planContent?: string;\n // permission-specific\n toolName?: string;\n description?: string;\n}\n\nexport interface IdleAgent {\n name: string;\n type: string;\n idleSince: string;\n action: string;\n}\n\ntype BoundListener = { event: string; fn: (...args: unknown[]) => void };\n\n/**\n * Listens to controller events and maintains an in-memory snapshot\n * of all actions that need attention (approvals, idle agents).\n */\nexport class ActionTracker {\n private approvals = new Map<string, PendingApproval>();\n private idles = new Map<string, IdleAgent>();\n private agentTypes = new Map<string, string>();\n private listeners: BoundListener[] = [];\n private currentController: ClaudeCodeController | null = null;\n\n attach(controller: ClaudeCodeController): void {\n // Detach from previous controller first to avoid listener leaks\n this.detach();\n this.currentController = controller;\n\n const onPlan = (agent: string, parsed: PlanApprovalRequestMessage) => {\n this.approvals.set(parsed.requestId, {\n type: \"plan\",\n agent,\n requestId: parsed.requestId,\n timestamp: parsed.timestamp,\n planContent: parsed.planContent,\n action: `POST /agents/${agent}/approve`,\n });\n };\n\n const onPermission = (agent: string, parsed: PermissionRequestMessage) => {\n this.approvals.set(parsed.requestId, {\n type: \"permission\",\n agent,\n requestId: parsed.requestId,\n timestamp: parsed.timestamp,\n toolName: parsed.toolName,\n description: parsed.description,\n action: `POST /agents/${agent}/approve`,\n });\n };\n\n const onIdle = (agent: string) => {\n this.idles.set(agent, {\n name: agent,\n type: this.agentTypes.get(agent) ?? \"unknown\",\n idleSince: new Date().toISOString(),\n action: `POST /agents/${agent}/messages`,\n });\n };\n\n const onMessage = (agent: string) => {\n this.idles.delete(agent);\n };\n\n const onSpawned = (agent: string) => {\n this.idles.delete(agent);\n };\n\n const onExited = (agent: string) => {\n this.idles.delete(agent);\n // Clean up stale approvals from the dead agent\n for (const [id, approval] of this.approvals) {\n if (approval.agent === agent) {\n this.approvals.delete(id);\n }\n }\n };\n\n controller.on(\"plan:approval_request\", onPlan);\n controller.on(\"permission:request\", onPermission);\n controller.on(\"idle\", onIdle);\n controller.on(\"message\", onMessage);\n controller.on(\"agent:spawned\", onSpawned);\n controller.on(\"agent:exited\", onExited);\n\n this.listeners = [\n { event: \"plan:approval_request\", fn: onPlan as (...args: unknown[]) => void },\n { event: \"permission:request\", fn: onPermission as (...args: unknown[]) => void },\n { event: \"idle\", fn: onIdle as (...args: unknown[]) => void },\n { event: \"message\", fn: onMessage as (...args: unknown[]) => void },\n { event: \"agent:spawned\", fn: onSpawned as (...args: unknown[]) => void },\n { event: \"agent:exited\", fn: onExited as (...args: unknown[]) => void },\n ];\n }\n\n /** Remove all event listeners from the current controller. */\n detach(): void {\n if (this.currentController) {\n for (const { event, fn } of this.listeners) {\n this.currentController.removeListener(event, fn);\n }\n }\n this.listeners = [];\n this.currentController = null;\n }\n\n /** Track agent type so idle entries have the right type. */\n registerAgentType(name: string, type: string): void {\n this.agentTypes.set(name, type);\n }\n\n resolveApproval(requestId: string): void {\n this.approvals.delete(requestId);\n }\n\n getPendingApprovals(): PendingApproval[] {\n return Array.from(this.approvals.values());\n }\n\n getIdleAgents(): IdleAgent[] {\n return Array.from(this.idles.values());\n }\n\n /** Clear all tracked state AND detach from the controller. */\n clear(): void {\n this.detach();\n this.approvals.clear();\n this.idles.clear();\n this.agentTypes.clear();\n }\n}\n","import { Hono } from \"hono\";\nimport { ClaudeCodeController } from \"../controller.js\";\nimport { claude } from \"../claude.js\";\nimport { ActionTracker } from \"./action-tracker.js\";\nimport type {\n AskBody,\n InitSessionBody,\n SpawnAgentBody,\n SendMessageBody,\n BroadcastBody,\n ApproveBody,\n CreateTaskBody,\n UpdateTaskBody,\n AssignTaskBody,\n} from \"./types.js\";\n\n// ─── Validation ──────────────────────────────────────────────────────────────\n\nconst SAFE_NAME_RE = /^[a-zA-Z0-9_-]{1,64}$/;\nconst SAFE_TASK_ID_RE = /^[0-9]{1,10}$/;\n\nfunction validateName(value: string, field: string): void {\n if (!SAFE_NAME_RE.test(value)) {\n throw new ValidationError(\n `${field} must be 1-64 alphanumeric characters, hyphens, or underscores`\n );\n }\n}\n\nfunction validateTaskId(value: string): void {\n if (!SAFE_TASK_ID_RE.test(value)) {\n throw new ValidationError(\"task id must be a numeric string (1-10 digits)\");\n }\n}\n\nclass ValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n\nfunction isNotFoundError(err: unknown): boolean {\n return err instanceof Error && /not found/i.test(err.message);\n}\n\n// ─── State ───────────────────────────────────────────────────────────────────\n\nexport interface ApiState {\n controller: ClaudeCodeController | null;\n tracker: ActionTracker;\n /** True if the controller was created via POST /session/init (API owns lifecycle). */\n owned: boolean;\n /** Prevents concurrent session init/shutdown. */\n initLock: boolean;\n /** Timestamp of when this API instance was created. */\n startTime: number;\n}\n\nfunction getController(state: ApiState): ClaudeCodeController {\n if (!state.controller) {\n throw new Error(\n \"No active session. Call POST /session/init first.\"\n );\n }\n return state.controller;\n}\n\n// ─── Routes ──────────────────────────────────────────────────────────────────\n\nexport function buildRoutes(state: ApiState) {\n const api = new Hono();\n\n // ─── Health ──────────────────────────────────────────────────────────\n\n api.get(\"/health\", (c) => {\n return c.json({\n status: \"ok\",\n uptime: Date.now() - state.startTime,\n session: state.controller !== null,\n });\n });\n\n // ─── Ask (one-liner) ────────────────────────────────────────────────\n\n api.post(\"/ask\", async (c) => {\n const body = await c.req.json<AskBody>();\n if (!body.prompt) {\n return c.json({ error: \"prompt is required\" }, 400);\n }\n\n try {\n const response = await claude(body.prompt, {\n model: body.model,\n apiKey: body.apiKey,\n baseUrl: body.baseUrl,\n timeout: body.timeout,\n cwd: body.cwd,\n permissions: body.permissions,\n env: body.env,\n logLevel: \"warn\",\n });\n\n return c.json({ response });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Agent failed to respond\";\n return c.json({ error: message }, 500);\n }\n });\n\n // ─── Session ─────────────────────────────────────────────────────────\n\n api.get(\"/session\", (c) => {\n if (!state.controller) {\n return c.json({ initialized: false, teamName: \"\" });\n }\n return c.json({\n initialized: true,\n teamName: state.controller.teamName,\n });\n });\n\n api.post(\"/session/init\", async (c) => {\n if (state.initLock) {\n return c.json({ error: \"Session init already in progress\" }, 409);\n }\n state.initLock = true;\n\n try {\n const body = await c.req.json<InitSessionBody>().catch(() => ({} as InitSessionBody));\n\n // Validate names\n if (body.teamName) validateName(body.teamName, \"teamName\");\n\n // Shutdown existing session if owned by us\n const oldController = state.controller;\n if (oldController) {\n state.tracker.clear();\n state.controller = null;\n if (state.owned) {\n await oldController.shutdown();\n }\n }\n\n // Merge first-class options into env (first-class wins)\n const env: Record<string, string> = { ...body.env };\n if (body.apiKey) env.ANTHROPIC_AUTH_TOKEN = body.apiKey;\n if (body.baseUrl) env.ANTHROPIC_BASE_URL = body.baseUrl;\n if (body.timeout != null) env.API_TIMEOUT_MS = String(body.timeout);\n\n const controller = new ClaudeCodeController({\n teamName: body.teamName,\n cwd: body.cwd,\n claudeBinary: body.claudeBinary,\n env,\n logLevel: body.logLevel ?? \"info\",\n });\n\n try {\n await controller.init();\n } catch (err) {\n // Cleanup the partially-initialized controller\n try { await controller.shutdown(); } catch { /* best effort */ }\n throw err;\n }\n\n state.controller = controller;\n state.owned = true;\n state.tracker.attach(controller);\n\n return c.json({\n initialized: true,\n teamName: controller.teamName,\n }, 201);\n } finally {\n state.initLock = false;\n }\n });\n\n api.post(\"/session/shutdown\", async (c) => {\n if (state.initLock) {\n return c.json({ error: \"Session operation in progress\" }, 409);\n }\n state.initLock = true;\n\n try {\n const ctrl = getController(state);\n const wasOwned = state.owned;\n\n state.tracker.clear();\n state.controller = null;\n state.owned = false;\n\n if (wasOwned) {\n await ctrl.shutdown();\n }\n\n return c.json({ ok: true });\n } finally {\n state.initLock = false;\n }\n });\n\n // ─── Actions ─────────────────────────────────────────────────────────\n\n api.get(\"/actions\", async (c) => {\n const ctrl = getController(state);\n const approvals = state.tracker.getPendingApprovals();\n const idleAgents = state.tracker.getIdleAgents();\n\n const tasks = await ctrl.tasks.list();\n const unassignedTasks = tasks\n .filter((t) => !t.owner && t.status !== \"completed\")\n .map((t) => ({\n id: t.id,\n subject: t.subject,\n description: t.description,\n status: t.status,\n action: `POST /tasks/${t.id}/assign`,\n }));\n\n const pending =\n approvals.length + unassignedTasks.length + idleAgents.length;\n\n return c.json({ pending, approvals, unassignedTasks, idleAgents });\n });\n\n // ─── Agents ──────────────────────────────────────────────────────────\n\n api.get(\"/agents\", async (c) => {\n const ctrl = getController(state);\n const config = await ctrl.team.getConfig();\n const agents = config.members\n .filter((m) => m.name !== \"controller\")\n .map((m) => ({\n name: m.name,\n type: m.agentType,\n model: m.model,\n running: ctrl.isAgentRunning(m.name),\n }));\n return c.json(agents);\n });\n\n api.post(\"/agents\", async (c) => {\n const ctrl = getController(state);\n const body = await c.req.json<SpawnAgentBody>();\n if (!body.name) {\n return c.json({ error: \"name is required\" }, 400);\n }\n validateName(body.name, \"name\");\n\n const agentType = body.type || \"general-purpose\";\n state.tracker.registerAgentType(body.name, agentType);\n\n // Merge first-class options into env\n const agentEnv: Record<string, string> = { ...body.env };\n if (body.apiKey) agentEnv.ANTHROPIC_AUTH_TOKEN = body.apiKey;\n if (body.baseUrl) agentEnv.ANTHROPIC_BASE_URL = body.baseUrl;\n if (body.timeout != null) agentEnv.API_TIMEOUT_MS = String(body.timeout);\n\n // Resolve permissions: preset string or raw tool array\n const permissionsArray = Array.isArray(body.permissions)\n ? body.permissions\n : undefined;\n const PRESET_MAP: Record<string, string> = {\n edit: \"acceptEdits\",\n plan: \"plan\",\n ask: \"default\",\n };\n const permissionMode =\n typeof body.permissions === \"string\" && !Array.isArray(body.permissions)\n ? (PRESET_MAP[body.permissions] as any)\n : undefined;\n\n const handle = await ctrl.spawnAgent({\n name: body.name,\n type: body.type,\n model: body.model,\n cwd: body.cwd,\n permissions: permissionsArray,\n permissionMode,\n env: Object.keys(agentEnv).length > 0 ? agentEnv : undefined,\n });\n\n return c.json(\n {\n name: handle.name,\n pid: handle.pid,\n running: handle.isRunning,\n },\n 201\n );\n });\n\n api.get(\"/agents/:name\", async (c) => {\n const ctrl = getController(state);\n const name = c.req.param(\"name\");\n validateName(name, \"name\");\n const config = await ctrl.team.getConfig();\n const member = config.members.find((m) => m.name === name);\n if (!member) {\n return c.json({ error: `Agent \"${name}\" not found` }, 404);\n }\n return c.json({\n name: member.name,\n type: member.agentType,\n model: member.model,\n running: ctrl.isAgentRunning(name),\n });\n });\n\n api.post(\"/agents/:name/messages\", async (c) => {\n const ctrl = getController(state);\n const name = c.req.param(\"name\");\n validateName(name, \"name\");\n const body = await c.req.json<SendMessageBody>();\n if (!body.message) {\n return c.json({ error: \"message is required\" }, 400);\n }\n await ctrl.send(name, body.message, body.summary);\n return c.json({ ok: true });\n });\n\n api.post(\"/agents/:name/kill\", async (c) => {\n const ctrl = getController(state);\n const name = c.req.param(\"name\");\n validateName(name, \"name\");\n await ctrl.killAgent(name);\n return c.json({ ok: true });\n });\n\n api.post(\"/agents/:name/shutdown\", async (c) => {\n const ctrl = getController(state);\n const name = c.req.param(\"name\");\n validateName(name, \"name\");\n await ctrl.sendShutdownRequest(name);\n return c.json({ ok: true });\n });\n\n api.post(\"/agents/:name/approve\", async (c) => {\n const ctrl = getController(state);\n const name = c.req.param(\"name\");\n validateName(name, \"name\");\n const body = await c.req.json<ApproveBody>();\n if (!body.requestId) {\n return c.json({ error: \"requestId is required\" }, 400);\n }\n if (!body.type || ![\"plan\", \"permission\"].includes(body.type)) {\n return c.json({ error: 'type must be \"plan\" or \"permission\"' }, 400);\n }\n\n if (body.type === \"plan\") {\n await ctrl.sendPlanApproval(name, body.requestId, body.approve ?? true, body.feedback);\n } else {\n await ctrl.sendPermissionResponse(name, body.requestId, body.approve ?? true);\n }\n state.tracker.resolveApproval(body.requestId);\n return c.json({ ok: true });\n });\n\n // ─── Broadcast ───────────────────────────────────────────────────────\n\n api.post(\"/broadcast\", async (c) => {\n const ctrl = getController(state);\n const body = await c.req.json<BroadcastBody>();\n if (!body.message) {\n return c.json({ error: \"message is required\" }, 400);\n }\n await ctrl.broadcast(body.message, body.summary);\n return c.json({ ok: true });\n });\n\n // ─── Tasks ───────────────────────────────────────────────────────────\n\n api.get(\"/tasks\", async (c) => {\n const ctrl = getController(state);\n const tasks = await ctrl.tasks.list();\n return c.json(tasks);\n });\n\n api.post(\"/tasks\", async (c) => {\n const ctrl = getController(state);\n const body = await c.req.json<CreateTaskBody>();\n if (!body.subject || !body.description) {\n return c.json({ error: \"subject and description are required\" }, 400);\n }\n if (body.owner) validateName(body.owner, \"owner\");\n const taskId = await ctrl.createTask(body);\n const task = await ctrl.tasks.get(taskId);\n return c.json(task, 201);\n });\n\n\n api.get(\"/tasks/:id\", async (c) => {\n const ctrl = getController(state);\n const id = c.req.param(\"id\");\n validateTaskId(id);\n try {\n const task = await ctrl.tasks.get(id);\n return c.json(task);\n } catch (err) {\n if (isNotFoundError(err)) {\n return c.json({ error: `Task \"${id}\" not found` }, 404);\n }\n throw err;\n }\n });\n\n api.patch(\"/tasks/:id\", async (c) => {\n const ctrl = getController(state);\n const id = c.req.param(\"id\");\n validateTaskId(id);\n const body = await c.req.json<UpdateTaskBody>();\n try {\n const task = await ctrl.tasks.update(id, body);\n return c.json(task);\n } catch (err) {\n if (isNotFoundError(err)) {\n return c.json({ error: `Task \"${id}\" not found` }, 404);\n }\n throw err;\n }\n });\n\n api.delete(\"/tasks/:id\", async (c) => {\n const ctrl = getController(state);\n const id = c.req.param(\"id\");\n validateTaskId(id);\n try {\n await ctrl.tasks.get(id);\n } catch (err) {\n if (isNotFoundError(err)) {\n return c.json({ error: `Task \"${id}\" not found` }, 404);\n }\n throw err;\n }\n await ctrl.tasks.delete(id);\n return c.json({ ok: true });\n });\n\n api.post(\"/tasks/:id/assign\", async (c) => {\n const ctrl = getController(state);\n const id = c.req.param(\"id\");\n validateTaskId(id);\n const body = await c.req.json<AssignTaskBody>();\n if (!body.agent) {\n return c.json({ error: \"agent is required\" }, 400);\n }\n validateName(body.agent, \"agent\");\n try {\n await ctrl.tasks.get(id);\n } catch (err) {\n if (isNotFoundError(err)) {\n return c.json({ error: `Task \"${id}\" not found` }, 404);\n }\n throw err;\n }\n await ctrl.assignTask(id, body.agent);\n return c.json({ ok: true });\n });\n\n return api;\n}\n","import { EventEmitter } from \"node:events\";\nimport { execSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { TeamManager } from \"./team-manager.js\";\nimport { TaskManager } from \"./task-manager.js\";\nimport { ProcessManager } from \"./process-manager.js\";\nimport { InboxPoller, type PollEvent } from \"./inbox-poller.js\";\nimport { writeInbox, readUnread, parseMessage } from \"./inbox.js\";\nimport { AgentHandle, type AgentController } from \"./agent-handle.js\";\nimport { createLogger } from \"./logger.js\";\nimport type {\n ControllerOptions,\n ControllerEvents,\n SpawnAgentOptions,\n ReceiveOptions,\n InboxMessage,\n TeamMember,\n TaskFile,\n TaskStatus,\n Logger,\n LogLevel,\n} from \"./types.js\";\n\n/** Protocol-only message types handled via events; filtered out of receive()/receiveAny(). */\nconst PROTOCOL_ONLY_TYPES = new Set([\n \"shutdown_approved\",\n \"plan_approval_response\",\n \"permission_response\",\n \"task_completed\",\n \"sandbox_permission_request\",\n \"sandbox_permission_response\",\n]);\n\nconst AGENT_COLORS = [\n \"#00FF00\",\n \"#00BFFF\",\n \"#FF6347\",\n \"#FFD700\",\n \"#DA70D6\",\n \"#40E0D0\",\n \"#FF69B4\",\n \"#7B68EE\",\n];\n\nexport class ClaudeCodeController\n extends EventEmitter<ControllerEvents>\n implements AgentController\n{\n readonly teamName: string;\n readonly team: TeamManager;\n readonly tasks: TaskManager;\n private processes: ProcessManager;\n private poller: InboxPoller;\n private log: Logger;\n private cwd: string;\n private claudeBinary: string;\n private defaultEnv: Record<string, string>;\n private colorIndex = 0;\n private initialized = false;\n\n constructor(opts?: ControllerOptions & { logLevel?: LogLevel }) {\n super();\n this.teamName =\n opts?.teamName || `ctrl-${randomUUID().slice(0, 8)}`;\n this.cwd = opts?.cwd || process.cwd();\n this.claudeBinary = opts?.claudeBinary || \"claude\";\n this.defaultEnv = opts?.env || {};\n this.log = opts?.logger || createLogger(opts?.logLevel ?? \"info\");\n\n this.team = new TeamManager(this.teamName, this.log);\n this.tasks = new TaskManager(this.teamName, this.log);\n this.processes = new ProcessManager(this.log);\n this.poller = new InboxPoller(\n this.teamName,\n \"controller\",\n this.log\n );\n\n // Wire up poller events to the EventEmitter\n this.poller.onMessages((events) => this.handlePollEvents(events));\n }\n\n // ─── Lifecycle ───────────────────────────────────────────────────────\n\n /**\n * Initialize the controller: create the team and start polling.\n * Must be called before any other operations.\n */\n async init(): Promise<this> {\n if (this.initialized) return this;\n\n await this.team.create({ cwd: this.cwd });\n await this.tasks.init();\n this.poller.start();\n this.initialized = true;\n this.log.info(\n `Controller initialized (team=\"${this.teamName}\")`\n );\n return this;\n }\n\n /**\n * Graceful shutdown:\n * 1. Send shutdown requests to all agents\n * 2. Wait briefly for acknowledgment\n * 3. Kill remaining processes\n * 4. Clean up team files\n */\n async shutdown(): Promise<void> {\n this.log.info(\"Shutting down controller...\");\n\n // Send shutdown requests to all running agents\n const running = this.processes.runningAgents();\n const shutdownPromises: Promise<void>[] = [];\n\n for (const name of running) {\n try {\n await this.sendShutdownRequest(name);\n // Wait up to 10s for the agent process to exit on its own\n shutdownPromises.push(\n new Promise<void>((resolve) => {\n const proc = this.processes.get(name);\n if (!proc) return resolve();\n const timer = setTimeout(() => resolve(), 10_000);\n proc.on(\"exit\", () => {\n clearTimeout(timer);\n resolve();\n });\n })\n );\n } catch {\n // Agent may already be gone\n }\n }\n\n // Wait for all agents to exit gracefully (or timeout)\n if (shutdownPromises.length > 0) {\n await Promise.all(shutdownPromises);\n }\n\n // Force kill any remaining\n await this.processes.killAll();\n\n // Stop polling\n this.poller.stop();\n\n // Clean up filesystem\n await this.team.destroy();\n this.initialized = false;\n this.log.info(\"Controller shut down\");\n }\n\n // ─── Agent Management ────────────────────────────────────────────────\n\n /**\n * Spawn a new Claude Code agent.\n */\n async spawnAgent(opts: SpawnAgentOptions): Promise<AgentHandle> {\n this.ensureInitialized();\n\n const agentId = `${opts.name}@${this.teamName}`;\n const color = AGENT_COLORS[this.colorIndex++ % AGENT_COLORS.length];\n const cwd = opts.cwd || this.cwd;\n\n // Register member in team config\n const member: TeamMember = {\n agentId,\n name: opts.name,\n agentType: opts.type || \"general-purpose\",\n model: opts.model,\n prompt: opts.prompt,\n color,\n planModeRequired: false,\n backendType: \"in-process\",\n joinedAt: Date.now(),\n tmuxPaneId: \"\",\n cwd,\n subscriptions: [],\n };\n await this.team.addMember(member);\n\n // Merge default env with per-agent env (per-agent takes precedence)\n const env =\n Object.keys(this.defaultEnv).length > 0 || opts.env\n ? { ...this.defaultEnv, ...opts.env }\n : undefined;\n\n // Spawn the CLI process\n const proc = this.processes.spawn({\n teamName: this.teamName,\n agentName: opts.name,\n agentId,\n agentType: opts.type || \"general-purpose\",\n model: opts.model,\n cwd,\n parentSessionId: this.team.sessionId,\n color,\n claudeBinary: this.claudeBinary,\n permissions: opts.permissions,\n permissionMode: opts.permissionMode,\n env,\n });\n\n this.emit(\"agent:spawned\", opts.name, proc.pid ?? 0);\n\n // Track process exit\n this.processes.onExit(opts.name, (code) => {\n this.emit(\"agent:exited\", opts.name, code ?? null);\n });\n\n return new AgentHandle(this, opts.name, proc.pid);\n }\n\n // ─── Messaging ───────────────────────────────────────────────────────\n\n /**\n * Send a message to a specific agent.\n */\n async send(\n agentName: string,\n message: string,\n summary?: string\n ): Promise<void> {\n this.ensureInitialized();\n await writeInbox(\n this.teamName,\n agentName,\n {\n from: \"controller\",\n text: message,\n timestamp: new Date().toISOString(),\n summary,\n },\n this.log\n );\n }\n\n /**\n * Send a structured shutdown request to an agent.\n */\n async sendShutdownRequest(agentName: string): Promise<void> {\n const requestId = `shutdown-${Date.now()}@${agentName}`;\n const msg = JSON.stringify({\n type: \"shutdown_request\",\n requestId,\n from: \"controller\",\n reason: \"Controller shutdown requested\",\n timestamp: new Date().toISOString(),\n });\n await this.send(agentName, msg);\n }\n\n /**\n * Broadcast a message to all registered agents (except controller).\n */\n async broadcast(message: string, summary?: string): Promise<void> {\n this.ensureInitialized();\n const config = await this.team.getConfig();\n const agents = config.members.filter((m) => m.name !== \"controller\");\n await Promise.all(\n agents.map((a) => this.send(a.name, message, summary))\n );\n }\n\n /**\n * Wait for messages from a specific agent.\n * Polls the controller's inbox for messages from the given agent.\n *\n * Returns when:\n * - A non-idle message is received (SendMessage from agent), OR\n * - An idle_notification is received (agent finished its turn),\n * in which case the idle message is returned.\n */\n async receive(\n agentName: string,\n opts?: ReceiveOptions\n ): Promise<InboxMessage[]> {\n const timeout = opts?.timeout ?? 60_000;\n const interval = opts?.pollInterval ?? 500;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const unread = await readUnread(this.teamName, \"controller\");\n const fromAgent = unread.filter((m) => m.from === agentName);\n\n if (fromAgent.length > 0) {\n // Protocol-only messages are handled via events, skip them in receive()\n const PROTOCOL_TYPES = PROTOCOL_ONLY_TYPES;\n\n // Prefer content messages (plain text or SendMessage from agent)\n const meaningful = fromAgent.filter((m) => {\n const parsed = parseMessage(m);\n return (\n parsed.type !== \"idle_notification\" &&\n !PROTOCOL_TYPES.has(parsed.type)\n );\n });\n\n if (meaningful.length > 0) {\n return opts?.all ? meaningful : [meaningful[0]];\n }\n\n // If only idle/protocol messages, check if there's an idle (= agent done)\n const idles = fromAgent.filter((m) => {\n const parsed = parseMessage(m);\n return parsed.type === \"idle_notification\";\n });\n if (idles.length > 0) {\n return opts?.all ? idles : [idles[0]];\n }\n }\n\n await sleep(interval);\n }\n\n throw new Error(\n `Timeout (${timeout}ms) waiting for message from \"${agentName}\"`\n );\n }\n\n /**\n * Wait for any message from any agent.\n */\n async receiveAny(opts?: ReceiveOptions): Promise<InboxMessage> {\n const timeout = opts?.timeout ?? 60_000;\n const interval = opts?.pollInterval ?? 500;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const unread = await readUnread(this.teamName, \"controller\");\n const meaningful = unread.filter((m) => {\n const parsed = parseMessage(m);\n return (\n parsed.type !== \"idle_notification\" &&\n !PROTOCOL_ONLY_TYPES.has(parsed.type)\n );\n });\n\n if (meaningful.length > 0) {\n return meaningful[0];\n }\n\n await sleep(interval);\n }\n\n throw new Error(`Timeout (${timeout}ms) waiting for any message`);\n }\n\n // ─── Tasks ───────────────────────────────────────────────────────────\n\n /**\n * Create a task and optionally notify the assigned agent.\n */\n async createTask(\n task: Omit<TaskFile, \"id\" | \"blocks\" | \"blockedBy\" | \"status\"> & {\n blocks?: string[];\n blockedBy?: string[];\n status?: TaskStatus;\n }\n ): Promise<string> {\n this.ensureInitialized();\n const taskId = await this.tasks.create(task);\n\n // Notify the assigned agent if any\n if (task.owner) {\n const fullTask = await this.tasks.get(taskId);\n const assignmentMsg = JSON.stringify({\n type: \"task_assignment\",\n taskId,\n subject: fullTask.subject,\n description: fullTask.description,\n assignedBy: \"controller\",\n timestamp: new Date().toISOString(),\n });\n await this.send(task.owner, assignmentMsg);\n }\n\n return taskId;\n }\n\n /**\n * Assign a task to an agent.\n */\n async assignTask(taskId: string, agentName: string): Promise<void> {\n const task = await this.tasks.update(taskId, { owner: agentName });\n const msg = JSON.stringify({\n type: \"task_assignment\",\n taskId,\n subject: task.subject,\n description: task.description,\n assignedBy: \"controller\",\n timestamp: new Date().toISOString(),\n });\n await this.send(agentName, msg);\n }\n\n // ─── Protocol Responses ───────────────────────────────────────────\n\n /**\n * Approve or reject a teammate's plan.\n * Send this in response to a `plan:approval_request` event.\n */\n async sendPlanApproval(\n agentName: string,\n requestId: string,\n approve: boolean,\n feedback?: string\n ): Promise<void> {\n const msg = JSON.stringify({\n type: \"plan_approval_response\",\n requestId,\n from: \"controller\",\n approved: approve,\n feedback,\n timestamp: new Date().toISOString(),\n });\n await this.send(agentName, msg);\n }\n\n /**\n * Approve or reject a teammate's permission/tool-use request.\n * Send this in response to a `permission:request` event.\n */\n async sendPermissionResponse(\n agentName: string,\n requestId: string,\n approve: boolean\n ): Promise<void> {\n const msg = JSON.stringify({\n type: \"permission_response\",\n requestId,\n from: \"controller\",\n approved: approve,\n timestamp: new Date().toISOString(),\n });\n await this.send(agentName, msg);\n }\n\n /**\n * Wait for a task to be completed.\n */\n async waitForTask(\n taskId: string,\n timeout?: number\n ): Promise<TaskFile> {\n return this.tasks.waitFor(taskId, \"completed\", { timeout });\n }\n\n // ─── Utilities ───────────────────────────────────────────────────────\n\n /**\n * Check if an agent process is still running.\n */\n isAgentRunning(name: string): boolean {\n return this.processes.isRunning(name);\n }\n\n /**\n * Kill a specific agent.\n */\n async killAgent(name: string): Promise<void> {\n await this.processes.kill(name);\n await this.team.removeMember(name);\n }\n\n /**\n * Get the installed Claude Code version.\n */\n getClaudeVersion(): string | null {\n try {\n const version = execSync(`${this.claudeBinary} --version`, {\n encoding: \"utf-8\",\n timeout: 5_000,\n }).trim();\n return version;\n } catch {\n return null;\n }\n }\n\n /**\n * Verify that the required CLI flags exist in the installed version.\n */\n verifyCompatibility(): { compatible: boolean; version: string | null } {\n const version = this.getClaudeVersion();\n // The flags we depend on were present in v2.1.34\n // We check that the binary exists and responds\n return { compatible: version !== null, version };\n }\n\n // ─── Internal ────────────────────────────────────────────────────────\n\n private handlePollEvents(events: PollEvent[]): void {\n for (const event of events) {\n const { raw, parsed } = event;\n\n switch (parsed.type) {\n case \"idle_notification\":\n this.emit(\"idle\", raw.from, parsed);\n break;\n case \"shutdown_approved\":\n this.log.info(\n `Shutdown approved by \"${raw.from}\" (requestId=${parsed.requestId})`\n );\n this.emit(\"shutdown:approved\", raw.from, parsed);\n break;\n case \"plan_approval_request\":\n this.log.info(\n `Plan approval request from \"${raw.from}\" (requestId=${parsed.requestId})`\n );\n this.emit(\"plan:approval_request\", raw.from, parsed);\n break;\n case \"permission_request\":\n this.log.info(\n `Permission request from \"${raw.from}\": ${parsed.toolName} (requestId=${parsed.requestId})`\n );\n this.emit(\"permission:request\", raw.from, parsed);\n break;\n case \"task_completed\":\n this.emit(\"message\", raw.from, raw);\n break;\n case \"plain_text\":\n this.emit(\"message\", raw.from, raw);\n break;\n default:\n this.emit(\"message\", raw.from, raw);\n }\n }\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error(\n \"Controller not initialized. Call init() first.\"\n );\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { readFile, writeFile, mkdir, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { teamDir, teamConfigPath, inboxesDir, tasksDir } from \"./paths.js\";\nimport type { TeamConfig, TeamMember, Logger } from \"./types.js\";\n\nexport class TeamManager {\n readonly teamName: string;\n readonly sessionId: string;\n private log: Logger;\n\n constructor(teamName: string, logger: Logger) {\n this.teamName = teamName;\n this.sessionId = randomUUID();\n this.log = logger;\n }\n\n /**\n * Create the team directory structure and config.json.\n * The controller registers itself as the lead member.\n */\n async create(opts?: {\n description?: string;\n cwd?: string;\n }): Promise<TeamConfig> {\n const dir = teamDir(this.teamName);\n const inboxDir = inboxesDir(this.teamName);\n const taskDir = tasksDir(this.teamName);\n\n await mkdir(dir, { recursive: true });\n await mkdir(inboxDir, { recursive: true });\n await mkdir(taskDir, { recursive: true });\n\n const leadName = \"controller\";\n const leadAgentId = `${leadName}@${this.teamName}`;\n\n const config: TeamConfig = {\n name: this.teamName,\n description: opts?.description,\n createdAt: Date.now(),\n leadAgentId,\n leadSessionId: this.sessionId,\n members: [\n {\n agentId: leadAgentId,\n name: leadName,\n agentType: \"controller\",\n joinedAt: Date.now(),\n tmuxPaneId: \"\",\n cwd: opts?.cwd || process.cwd(),\n subscriptions: [],\n },\n ],\n };\n\n await this.writeConfig(config);\n this.log.info(`Team \"${this.teamName}\" created`);\n return config;\n }\n\n /**\n * Add a member to the team config.\n */\n async addMember(member: TeamMember): Promise<void> {\n const config = await this.getConfig();\n // Remove existing member with same name if any\n config.members = config.members.filter((m) => m.name !== member.name);\n config.members.push(member);\n await this.writeConfig(config);\n this.log.debug(`Added member \"${member.name}\" to team`);\n }\n\n /**\n * Remove a member from the team config.\n */\n async removeMember(name: string): Promise<void> {\n const config = await this.getConfig();\n config.members = config.members.filter((m) => m.name !== name);\n await this.writeConfig(config);\n this.log.debug(`Removed member \"${name}\" from team`);\n }\n\n /**\n * Read the current team config.\n */\n async getConfig(): Promise<TeamConfig> {\n const path = teamConfigPath(this.teamName);\n if (!existsSync(path)) {\n throw new Error(\n `Team \"${this.teamName}\" does not exist (no config.json)`\n );\n }\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw);\n }\n\n /**\n * Check if the team already exists on disk.\n */\n exists(): boolean {\n return existsSync(teamConfigPath(this.teamName));\n }\n\n /**\n * Destroy the team: remove all team directories and task directories.\n */\n async destroy(): Promise<void> {\n const dir = teamDir(this.teamName);\n const taskDir = tasksDir(this.teamName);\n\n if (existsSync(dir)) {\n await rm(dir, { recursive: true, force: true });\n }\n if (existsSync(taskDir)) {\n await rm(taskDir, { recursive: true, force: true });\n }\n this.log.info(`Team \"${this.teamName}\" destroyed`);\n }\n\n private async writeConfig(config: TeamConfig): Promise<void> {\n const path = teamConfigPath(this.teamName);\n await writeFile(path, JSON.stringify(config, null, 2), \"utf-8\");\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst CLAUDE_DIR = join(homedir(), \".claude\");\n\nexport function teamsDir(): string {\n return join(CLAUDE_DIR, \"teams\");\n}\n\nexport function teamDir(teamName: string): string {\n return join(teamsDir(), teamName);\n}\n\nexport function teamConfigPath(teamName: string): string {\n return join(teamDir(teamName), \"config.json\");\n}\n\nexport function inboxesDir(teamName: string): string {\n return join(teamDir(teamName), \"inboxes\");\n}\n\nexport function inboxPath(teamName: string, agentName: string): string {\n return join(inboxesDir(teamName), `${agentName}.json`);\n}\n\nexport function tasksBaseDir(): string {\n return join(CLAUDE_DIR, \"tasks\");\n}\n\nexport function tasksDir(teamName: string): string {\n return join(tasksBaseDir(), teamName);\n}\n\nexport function taskPath(teamName: string, taskId: string): string {\n return join(tasksDir(teamName), `${taskId}.json`);\n}\n","import { readFile, writeFile, readdir, mkdir, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { tasksDir, taskPath } from \"./paths.js\";\nimport type { TaskFile, TaskStatus, Logger } from \"./types.js\";\n\nexport class TaskManager {\n private nextId = 1;\n\n constructor(\n private teamName: string,\n private log: Logger\n ) {}\n\n /**\n * Initialize the task directory. Call after team creation.\n * Also scans for existing tasks to set the next ID correctly.\n */\n async init(): Promise<void> {\n const dir = tasksDir(this.teamName);\n await mkdir(dir, { recursive: true });\n\n // Scan existing tasks to find the max ID\n const existing = await this.list();\n if (existing.length > 0) {\n const maxId = Math.max(...existing.map((t) => parseInt(t.id, 10)));\n this.nextId = maxId + 1;\n }\n }\n\n /**\n * Create a new task. Returns the assigned task ID.\n */\n async create(\n task: Omit<TaskFile, \"id\" | \"blocks\" | \"blockedBy\" | \"status\"> & {\n blocks?: string[];\n blockedBy?: string[];\n status?: TaskStatus;\n }\n ): Promise<string> {\n const id = String(this.nextId++);\n const full: TaskFile = {\n id,\n subject: task.subject,\n description: task.description,\n activeForm: task.activeForm,\n owner: task.owner,\n status: task.status || \"pending\",\n blocks: task.blocks || [],\n blockedBy: task.blockedBy || [],\n metadata: task.metadata,\n };\n\n await this.writeTask(full);\n this.log.debug(`Created task #${id}: ${task.subject}`);\n return id;\n }\n\n /**\n * Get a task by ID.\n */\n async get(taskId: string): Promise<TaskFile> {\n const path = taskPath(this.teamName, taskId);\n if (!existsSync(path)) {\n throw new Error(`Task #${taskId} not found`);\n }\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw);\n }\n\n /**\n * Update a task. Merges the provided fields.\n */\n async update(\n taskId: string,\n updates: Partial<\n Pick<\n TaskFile,\n | \"subject\"\n | \"description\"\n | \"activeForm\"\n | \"owner\"\n | \"status\"\n | \"blocks\"\n | \"blockedBy\"\n | \"metadata\"\n >\n >\n ): Promise<TaskFile> {\n const task = await this.get(taskId);\n Object.assign(task, updates);\n await this.writeTask(task);\n this.log.debug(`Updated task #${taskId}: status=${task.status}`);\n return task;\n }\n\n /**\n * Add blocking relationships.\n */\n async addBlocks(taskId: string, blockedTaskIds: string[]): Promise<void> {\n const task = await this.get(taskId);\n const toAdd = blockedTaskIds.filter((id) => !task.blocks.includes(id));\n task.blocks.push(...toAdd);\n await this.writeTask(task);\n\n // Also update the blockedBy on the other tasks\n for (const blockedId of toAdd) {\n const blocked = await this.get(blockedId);\n if (!blocked.blockedBy.includes(taskId)) {\n blocked.blockedBy.push(taskId);\n await this.writeTask(blocked);\n }\n }\n }\n\n /**\n * List all tasks.\n */\n async list(): Promise<TaskFile[]> {\n const dir = tasksDir(this.teamName);\n if (!existsSync(dir)) return [];\n\n const files = await readdir(dir);\n const tasks: TaskFile[] = [];\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n const raw = await readFile(taskPath(this.teamName, file.replace(\".json\", \"\")), \"utf-8\");\n tasks.push(JSON.parse(raw));\n }\n\n return tasks.sort((a, b) => parseInt(a.id) - parseInt(b.id));\n }\n\n /**\n * Delete a task file.\n */\n async delete(taskId: string): Promise<void> {\n const path = taskPath(this.teamName, taskId);\n if (existsSync(path)) {\n await rm(path);\n this.log.debug(`Deleted task #${taskId}`);\n }\n }\n\n /**\n * Wait for a task to reach a target status.\n */\n async waitFor(\n taskId: string,\n targetStatus: TaskStatus = \"completed\",\n opts?: { timeout?: number; pollInterval?: number }\n ): Promise<TaskFile> {\n const timeout = opts?.timeout ?? 300_000; // 5 min default\n const interval = opts?.pollInterval ?? 1_000;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const task = await this.get(taskId);\n if (task.status === targetStatus) return task;\n await sleep(interval);\n }\n\n throw new Error(\n `Timeout waiting for task #${taskId} to reach \"${targetStatus}\"`\n );\n }\n\n private async writeTask(task: TaskFile): Promise<void> {\n const path = taskPath(this.teamName, task.id);\n await writeFile(path, JSON.stringify(task, null, 4), \"utf-8\");\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { execSync } from \"node:child_process\";\nimport type { Logger } from \"./types.js\";\n\nexport interface SpawnOptions {\n teamName: string;\n agentName: string;\n agentId: string;\n agentType?: string;\n model?: string;\n cwd?: string;\n parentSessionId?: string;\n color?: string;\n claudeBinary?: string;\n permissions?: string[];\n permissionMode?: string;\n teammateMode?: \"auto\" | \"tmux\" | \"in-process\";\n /** Extra environment variables to inject into the agent process */\n env?: Record<string, string>;\n}\n\n/**\n * Manages Claude Code agent processes.\n * Spawns agents inside a Python-based PTY wrapper since the Claude Code TUI\n * binary requires a real terminal to function.\n */\nexport class ProcessManager {\n private processes = new Map<string, ChildProcess>();\n private log: Logger;\n\n constructor(logger: Logger) {\n this.log = logger;\n }\n\n /**\n * Spawn a new claude CLI process in teammate mode.\n * Uses a Python PTY wrapper to provide the terminal the TUI needs.\n */\n spawn(opts: SpawnOptions): ChildProcess {\n let binary = opts.claudeBinary || \"claude\";\n if (!binary.startsWith(\"/\")) {\n try {\n binary = execSync(`which ${binary}`, { encoding: \"utf-8\" }).trim();\n } catch {\n // fall through\n }\n }\n\n const claudeArgs: string[] = [\n \"--teammate-mode\",\n opts.teammateMode || \"auto\",\n \"--agent-id\",\n opts.agentId,\n \"--agent-name\",\n opts.agentName,\n \"--team-name\",\n opts.teamName,\n ];\n\n if (opts.agentType) {\n claudeArgs.push(\"--agent-type\", opts.agentType);\n }\n if (opts.color) {\n claudeArgs.push(\"--agent-color\", opts.color);\n }\n if (opts.parentSessionId) {\n claudeArgs.push(\"--parent-session-id\", opts.parentSessionId);\n }\n if (opts.model) {\n claudeArgs.push(\"--model\", opts.model);\n }\n if (opts.permissionMode) {\n claudeArgs.push(\"--permission-mode\", opts.permissionMode);\n }\n if (opts.permissions) {\n for (const perm of opts.permissions) {\n claudeArgs.push(\"--allowedTools\", perm);\n }\n }\n\n this.log.info(\n `Spawning agent \"${opts.agentName}\": ${binary} ${claudeArgs.join(\" \")}`\n );\n\n // Python PTY wrapper — provides a real terminal to the claude TUI binary.\n // We pass the command as JSON to avoid shell escaping issues.\n const cmdJson = JSON.stringify([binary, ...claudeArgs]);\n const pythonScript = `\nimport pty, os, sys, json, signal, select\n\ncmd = json.loads(sys.argv[1])\npid, fd = pty.fork()\nif pid == 0:\n os.execvp(cmd[0], cmd)\nelse:\n signal.signal(signal.SIGTERM, lambda *a: (os.kill(pid, signal.SIGTERM), sys.exit(0)))\n signal.signal(signal.SIGINT, lambda *a: (os.kill(pid, signal.SIGTERM), sys.exit(0)))\n try:\n while True:\n r, _, _ = select.select([fd, 0], [], [], 1.0)\n if fd in r:\n try:\n data = os.read(fd, 4096)\n if not data:\n break\n os.write(1, data)\n except OSError:\n break\n if 0 in r:\n try:\n data = os.read(0, 4096)\n if not data:\n break\n os.write(fd, data)\n except OSError:\n break\n except:\n pass\n finally:\n try:\n os.kill(pid, signal.SIGTERM)\n except:\n pass\n _, status = os.waitpid(pid, 0)\n sys.exit(os.WEXITSTATUS(status) if os.WIFEXITED(status) else 1)\n`;\n\n const proc = spawn(\"python3\", [\"-c\", pythonScript, cmdJson], {\n cwd: opts.cwd || process.cwd(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: {\n ...process.env,\n CLAUDECODE: \"1\",\n CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS: \"1\",\n ...opts.env,\n },\n });\n\n this.processes.set(opts.agentName, proc);\n\n proc.on(\"exit\", (code, signal) => {\n this.log.info(\n `Agent \"${opts.agentName}\" exited (code=${code}, signal=${signal})`\n );\n this.processes.delete(opts.agentName);\n });\n\n proc.on(\"error\", (err) => {\n this.log.error(`Agent \"${opts.agentName}\" process error: ${err.message}`);\n this.processes.delete(opts.agentName);\n });\n\n return proc;\n }\n\n /**\n * Register a callback for when an agent process exits.\n */\n onExit(name: string, callback: (code: number | null) => void): void {\n const proc = this.processes.get(name);\n if (proc) proc.on(\"exit\", (code) => callback(code));\n }\n\n /**\n * Get the process for a named agent.\n */\n get(name: string): ChildProcess | undefined {\n return this.processes.get(name);\n }\n\n /**\n * Check if an agent process is still running.\n */\n isRunning(name: string): boolean {\n const proc = this.processes.get(name);\n return proc !== undefined && proc.exitCode === null && !proc.killed;\n }\n\n /**\n * Get the PID of a running agent.\n */\n getPid(name: string): number | undefined {\n return this.processes.get(name)?.pid;\n }\n\n /**\n * Kill a specific agent process.\n */\n async kill(name: string, signal: NodeJS.Signals = \"SIGTERM\"): Promise<void> {\n const proc = this.processes.get(name);\n if (!proc) return;\n\n proc.kill(signal);\n\n await Promise.race([\n new Promise<void>((resolve) => proc.on(\"exit\", () => resolve())),\n new Promise<void>((resolve) =>\n setTimeout(() => {\n if (this.processes.has(name)) {\n this.log.warn(`Force-killing agent \"${name}\" with SIGKILL`);\n try {\n proc.kill(\"SIGKILL\");\n } catch {\n // May already be dead\n }\n }\n resolve();\n }, 5_000)\n ),\n ]);\n\n this.processes.delete(name);\n }\n\n /**\n * Kill all agent processes.\n */\n async killAll(): Promise<void> {\n const names = [...this.processes.keys()];\n await Promise.all(names.map((name) => this.kill(name)));\n }\n\n /**\n * Get all running agent names.\n */\n runningAgents(): string[] {\n return [...this.processes.keys()].filter((n) => this.isRunning(n));\n }\n}\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { lock, unlock } from \"proper-lockfile\";\nimport { inboxPath } from \"./paths.js\";\nimport type { InboxMessage, Logger, StructuredMessage } from \"./types.js\";\n\nconst LOCK_OPTIONS = {\n retries: { retries: 5, minTimeout: 50, maxTimeout: 500 },\n stale: 10_000,\n};\n\nasync function ensureDir(filePath: string): Promise<void> {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nasync function ensureFile(filePath: string): Promise<void> {\n await ensureDir(filePath);\n if (!existsSync(filePath)) {\n await writeFile(filePath, \"[]\", \"utf-8\");\n }\n}\n\n/**\n * Write a message to an agent's inbox with file-locking.\n */\nexport async function writeInbox(\n teamName: string,\n agentName: string,\n message: Omit<InboxMessage, \"read\">,\n logger?: Logger\n): Promise<void> {\n const path = inboxPath(teamName, agentName);\n await ensureFile(path);\n\n let release: (() => Promise<void>) | undefined;\n try {\n release = await lock(path, LOCK_OPTIONS);\n const raw = await readFile(path, \"utf-8\");\n const messages: InboxMessage[] = JSON.parse(raw || \"[]\");\n messages.push({ ...message, read: false });\n await writeFile(path, JSON.stringify(messages, null, 2), \"utf-8\");\n logger?.debug(`Wrote message to inbox ${agentName}`, message.from);\n } finally {\n if (release) await release();\n }\n}\n\n/**\n * Read all messages from an agent's inbox.\n */\nexport async function readInbox(\n teamName: string,\n agentName: string\n): Promise<InboxMessage[]> {\n const path = inboxPath(teamName, agentName);\n if (!existsSync(path)) return [];\n\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw || \"[]\");\n}\n\n/**\n * Read unread messages from an agent's inbox and mark them as read.\n */\nexport async function readUnread(\n teamName: string,\n agentName: string\n): Promise<InboxMessage[]> {\n const path = inboxPath(teamName, agentName);\n if (!existsSync(path)) return [];\n\n let release: (() => Promise<void>) | undefined;\n try {\n release = await lock(path, LOCK_OPTIONS);\n const raw = await readFile(path, \"utf-8\");\n const messages: InboxMessage[] = JSON.parse(raw || \"[]\");\n\n const unread = messages.filter((m) => !m.read);\n if (unread.length === 0) return [];\n\n // Mark all as read\n for (const m of messages) {\n m.read = true;\n }\n await writeFile(path, JSON.stringify(messages, null, 2), \"utf-8\");\n return unread;\n } finally {\n if (release) await release();\n }\n}\n\n/**\n * Parse a structured message from an inbox message's text field.\n * Messages can be either JSON-encoded structured messages or plain text.\n */\nexport function parseMessage(msg: InboxMessage): StructuredMessage {\n try {\n const parsed = JSON.parse(msg.text);\n if (parsed && typeof parsed === \"object\" && \"type\" in parsed) {\n return parsed as StructuredMessage;\n }\n } catch {\n // Not JSON, treat as plain text\n }\n return { type: \"plain_text\", text: msg.text };\n}\n","import { readUnread, parseMessage } from \"./inbox.js\";\nimport type { InboxMessage, Logger, StructuredMessage } from \"./types.js\";\n\nexport interface PollEvent {\n raw: InboxMessage;\n parsed: StructuredMessage;\n}\n\n/**\n * Polls an agent's inbox for new messages.\n * Used by the controller to watch its own inbox for responses from agents.\n */\nexport class InboxPoller {\n private teamName: string;\n private agentName: string;\n private interval: number;\n private timer: ReturnType<typeof setInterval> | null = null;\n private log: Logger;\n private handlers: ((events: PollEvent[]) => void)[] = [];\n\n constructor(\n teamName: string,\n agentName: string,\n logger: Logger,\n opts?: { pollInterval?: number }\n ) {\n this.teamName = teamName;\n this.agentName = agentName;\n this.log = logger;\n this.interval = opts?.pollInterval ?? 500;\n }\n\n /**\n * Register a handler for new messages.\n */\n onMessages(handler: (events: PollEvent[]) => void): void {\n this.handlers.push(handler);\n }\n\n /**\n * Start polling.\n */\n start(): void {\n if (this.timer) return;\n this.log.debug(\n `Starting inbox poller for \"${this.agentName}\" (interval=${this.interval}ms)`\n );\n this.timer = setInterval(() => this.poll(), this.interval);\n }\n\n /**\n * Stop polling.\n */\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n this.log.debug(`Stopped inbox poller for \"${this.agentName}\"`);\n }\n }\n\n /**\n * Poll once for new messages.\n */\n async poll(): Promise<PollEvent[]> {\n try {\n const unread = await readUnread(this.teamName, this.agentName);\n if (unread.length === 0) return [];\n\n const events: PollEvent[] = unread.map((raw) => ({\n raw,\n parsed: parseMessage(raw),\n }));\n\n for (const handler of this.handlers) {\n try {\n handler(events);\n } catch (err) {\n this.log.error(\"Inbox handler error:\", String(err));\n }\n }\n\n return events;\n } catch (err) {\n this.log.error(\"Inbox poll error:\", String(err));\n return [];\n }\n }\n}\n","import type { ReceiveOptions, InboxMessage } from \"./types.js\";\n\n/**\n * Interface for the controller methods that AgentHandle needs.\n * This avoids a circular dependency with the full controller.\n */\nexport interface AgentController {\n send(agentName: string, message: string, summary?: string): Promise<void>;\n receive(agentName: string, opts?: ReceiveOptions): Promise<InboxMessage[]>;\n killAgent(agentName: string): Promise<void>;\n sendShutdownRequest(agentName: string): Promise<void>;\n isAgentRunning(agentName: string): boolean;\n}\n\n/**\n * Proxy object for interacting with a specific agent.\n */\nexport class AgentHandle {\n readonly name: string;\n readonly pid: number | undefined;\n private controller: AgentController;\n\n constructor(\n controller: AgentController,\n name: string,\n pid: number | undefined\n ) {\n this.controller = controller;\n this.name = name;\n this.pid = pid;\n }\n\n /**\n * Send a message to this agent.\n */\n async send(message: string, summary?: string): Promise<void> {\n return this.controller.send(this.name, message, summary);\n }\n\n /**\n * Wait for a response from this agent.\n * Returns the text of the first unread plain-text message.\n */\n async receive(opts?: ReceiveOptions): Promise<string> {\n const messages = await this.controller.receive(this.name, opts);\n const texts = messages.map((m) => m.text);\n return texts.join(\"\\n\");\n }\n\n /**\n * Send a message and wait for the response. Convenience method.\n */\n async ask(question: string, opts?: ReceiveOptions): Promise<string> {\n await this.send(question);\n return this.receive(opts);\n }\n\n /**\n * Check if the agent process is still running.\n */\n get isRunning(): boolean {\n return this.controller.isAgentRunning(this.name);\n }\n\n /**\n * Request the agent to shut down gracefully.\n */\n async shutdown(): Promise<void> {\n return this.controller.sendShutdownRequest(this.name);\n }\n\n /**\n * Force-kill the agent process.\n */\n async kill(): Promise<void> {\n return this.controller.killAgent(this.name);\n }\n\n /**\n * Async iterator for agent events (messages from this agent).\n * Polls the controller's inbox for messages from this agent.\n */\n async *events(opts?: {\n pollInterval?: number;\n timeout?: number;\n }): AsyncGenerator<InboxMessage> {\n const interval = opts?.pollInterval ?? 500;\n const timeout = opts?.timeout ?? 0; // 0 = no timeout\n const deadline = timeout > 0 ? Date.now() + timeout : Infinity;\n\n while (Date.now() < deadline) {\n try {\n const messages = await this.controller.receive(this.name, {\n timeout: interval,\n pollInterval: interval,\n });\n for (const msg of messages) {\n yield msg;\n }\n } catch {\n // Timeout on receive, just continue polling\n }\n\n if (!this.isRunning) return;\n }\n }\n}\n","import type { Logger, LogLevel } from \"./types.js\";\n\nconst LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\nexport function createLogger(level: LogLevel = \"info\"): Logger {\n const threshold = LEVELS[level];\n\n const noop = () => {};\n const make =\n (lvl: LogLevel, fn: (...args: unknown[]) => void) =>\n (msg: string, ...args: unknown[]) => {\n if (LEVELS[lvl] >= threshold) {\n fn(`[claude-ctrl:${lvl}]`, msg, ...args);\n }\n };\n\n return {\n debug: threshold <= LEVELS.debug ? make(\"debug\", console.debug) : noop,\n info: threshold <= LEVELS.info ? make(\"info\", console.info) : noop,\n warn: threshold <= LEVELS.warn ? make(\"warn\", console.warn) : noop,\n error: threshold <= LEVELS.error ? make(\"error\", console.error) : noop,\n };\n}\n\nexport const silentLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n","import { EventEmitter } from \"node:events\";\nimport { randomUUID } from \"node:crypto\";\nimport { ClaudeCodeController } from \"./controller.js\";\nimport type { AgentHandle } from \"./agent-handle.js\";\nimport type {\n LogLevel,\n Logger,\n AgentType,\n PermissionMode,\n InboxMessage,\n PermissionRequestMessage,\n PlanApprovalRequestMessage,\n} from \"./types.js\";\n\n// Polyfill for Node < 20.4\n(Symbol as any).asyncDispose ??= Symbol(\"Symbol.asyncDispose\");\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport type PermissionPreset = \"full\" | \"edit\" | \"plan\" | \"ask\";\n\nexport interface ClaudeOptions {\n /** Model to use: \"sonnet\" | \"opus\" | \"haiku\" | full model ID */\n model?: \"sonnet\" | \"opus\" | \"haiku\" | (string & {});\n /** Anthropic API key. Maps to ANTHROPIC_AUTH_TOKEN env var. */\n apiKey?: string;\n /** API base URL. Maps to ANTHROPIC_BASE_URL env var. */\n baseUrl?: string;\n /** Request timeout in ms. Maps to API_TIMEOUT_MS env var. */\n timeout?: number;\n /** Working directory for the agent. Defaults to process.cwd(). */\n cwd?: string;\n /**\n * Permission level:\n * - \"full\" (default) — all tools, no approval needed\n * - \"edit\" — auto-approve read/write/bash\n * - \"plan\" — read-only exploration\n * - \"ask\" — fires permission events for each tool use\n */\n permissions?: PermissionPreset;\n /**\n * Auto-approve permission and plan requests.\n * - `true` — approve everything automatically\n * - `string[]` — only auto-approve these tool names, reject the rest\n *\n * Only meaningful with `permissions: \"ask\"`. Ignored when \"full\" or \"edit\".\n *\n * @example\n * ```ts\n * // Approve everything\n * await claude.agent({ permissions: \"ask\", autoApprove: true });\n *\n * // Only approve safe tools\n * await claude.agent({ permissions: \"ask\", autoApprove: [\"Read\", \"Glob\", \"Grep\"] });\n * ```\n */\n autoApprove?: boolean | string[];\n /**\n * Inline callback for permission requests.\n * Called when the agent wants to use a tool.\n * Provides `req.approve()` / `req.reject()` methods.\n *\n * @example\n * ```ts\n * await claude.agent({\n * permissions: \"ask\",\n * onPermission: (req) => {\n * req.toolName === \"Bash\" ? req.reject() : req.approve();\n * },\n * });\n * ```\n */\n onPermission?: (request: PermissionRequestInfo) => void;\n /**\n * Inline callback for plan approval requests.\n * Called when the agent submits a plan for review.\n *\n * @example\n * ```ts\n * await claude.agent({\n * onPlan: (req) => {\n * console.log(req.planContent);\n * req.approve();\n * },\n * });\n * ```\n */\n onPlan?: (request: PlanRequestInfo) => void;\n /** Additional environment variables (escape hatch). */\n env?: Record<string, string>;\n /** Log level. Defaults to \"warn\" for the simplified API. */\n logLevel?: LogLevel;\n /** Custom logger instance. */\n logger?: Logger;\n /** Agent name. Auto-generated if omitted. */\n name?: string;\n /** Agent type. Defaults to \"general-purpose\". */\n type?: AgentType;\n /** Path to the claude binary. */\n claudeBinary?: string;\n /** Max time in ms to wait for agent to become ready. Default: 60_000. */\n readyTimeout?: number;\n}\n\nexport interface AskOptions {\n /** Response timeout in ms. Default: 120_000. */\n timeout?: number;\n /** Poll interval in ms. Default: 500. */\n pollInterval?: number;\n}\n\nexport interface SessionOptions extends ClaudeOptions {\n /** Team name. Auto-generated if omitted. */\n teamName?: string;\n}\n\nexport interface SessionAgentOptions {\n /** Model override for this agent. */\n model?: string;\n /** Working directory override. */\n cwd?: string;\n /** Agent type override. */\n type?: AgentType;\n /** Permission preset override. */\n permissions?: PermissionPreset;\n /** Auto-approve permission/plan requests. See ClaudeOptions.autoApprove. */\n autoApprove?: boolean | string[];\n /** Inline permission callback. See ClaudeOptions.onPermission. */\n onPermission?: (request: PermissionRequestInfo) => void;\n /** Inline plan callback. See ClaudeOptions.onPlan. */\n onPlan?: (request: PlanRequestInfo) => void;\n /** Per-agent env overrides. */\n env?: Record<string, string>;\n /** Max time in ms to wait for agent to become ready. Default: 60_000. */\n readyTimeout?: number;\n}\n\nexport interface PermissionRequestInfo {\n requestId: string;\n toolName: string;\n description: string;\n input?: unknown;\n approve(): Promise<void>;\n reject(): Promise<void>;\n}\n\nexport interface PlanRequestInfo {\n requestId: string;\n planContent?: string;\n approve(feedback?: string): Promise<void>;\n reject(feedback: string): Promise<void>;\n}\n\nexport interface AgentEvents {\n message: [text: string];\n idle: [];\n permission: [request: PermissionRequestInfo];\n plan: [request: PlanRequestInfo];\n exit: [code: number | null];\n error: [error: Error];\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction buildEnv(opts: ClaudeOptions): Record<string, string> {\n const env: Record<string, string> = { ...opts.env };\n // First-class options override env keys\n if (opts.apiKey) env.ANTHROPIC_AUTH_TOKEN = opts.apiKey;\n if (opts.baseUrl) env.ANTHROPIC_BASE_URL = opts.baseUrl;\n if (opts.timeout != null) env.API_TIMEOUT_MS = String(opts.timeout);\n return env;\n}\n\nfunction resolvePermissions(\n preset?: PermissionPreset\n): { permissionMode?: PermissionMode } {\n switch (preset) {\n case \"edit\":\n return { permissionMode: \"acceptEdits\" };\n case \"plan\":\n return { permissionMode: \"plan\" };\n case \"ask\":\n return { permissionMode: \"default\" };\n case \"full\":\n default:\n // Don't pass --permission-mode flag at all for \"full\" —\n // the CLI default already allows everything and skipping\n // the flag avoids issues with idle detection.\n return { permissionMode: undefined };\n }\n}\n\nfunction waitForReady(\n controller: ClaudeCodeController,\n agentName: string,\n timeoutMs = 15_000\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) return;\n cleanup();\n reject(\n new Error(\n `Agent \"${agentName}\" did not become ready within ${timeoutMs}ms`\n )\n );\n }, timeoutMs);\n\n // Resolve early on idle or message — agent is confirmed responsive\n const onReady = (name: string, ..._rest: any[]) => {\n if (name === agentName && !settled) {\n settled = true;\n cleanup();\n resolve();\n }\n };\n\n const onExit = (name: string, code: number | null) => {\n if (name === agentName && !settled) {\n settled = true;\n cleanup();\n reject(\n new Error(\n `Agent \"${agentName}\" exited before becoming ready (code=${code})`\n )\n );\n }\n };\n\n // Resolve when the agent process is confirmed running.\n // Claude Code agents don't reliably send idle_notification on initial boot,\n // so we also listen for agent:spawned to resolve after the process starts.\n const onSpawned = (name: string) => {\n if (name === agentName && !settled) {\n settled = true;\n cleanup();\n resolve();\n }\n };\n\n const cleanup = () => {\n clearTimeout(timer);\n controller.removeListener(\"idle\", onReady);\n controller.removeListener(\"message\", onReady);\n controller.removeListener(\"agent:spawned\", onSpawned);\n controller.removeListener(\"agent:exited\", onExit);\n };\n\n controller.on(\"idle\", onReady);\n controller.on(\"message\", onReady);\n controller.on(\"agent:spawned\", onSpawned);\n controller.on(\"agent:exited\", onExit);\n });\n}\n\n// ─── Agent ──────────────────────────────────────────────────────────────────\n\n/** Options that affect agent behavior (callbacks & auto-approve). */\ninterface AgentBehavior {\n autoApprove?: boolean | string[];\n onPermission?: (request: PermissionRequestInfo) => void;\n onPlan?: (request: PlanRequestInfo) => void;\n}\n\nexport class Agent extends EventEmitter<AgentEvents> {\n private controller: ClaudeCodeController;\n private handle: AgentHandle;\n private ownsController: boolean;\n private disposed = false;\n private boundListeners: Array<{ event: string; fn: (...args: any[]) => void }> = [];\n\n private constructor(\n controller: ClaudeCodeController,\n handle: AgentHandle,\n ownsController: boolean,\n behavior?: AgentBehavior\n ) {\n super();\n this.controller = controller;\n this.handle = handle;\n this.ownsController = ownsController;\n this.wireEvents();\n this.wireBehavior(behavior);\n }\n\n /** Create a standalone agent (owns its own controller). */\n static async create(opts: ClaudeOptions = {}): Promise<Agent> {\n const name = opts.name ?? `agent-${randomUUID().slice(0, 8)}`;\n const env = buildEnv(opts);\n const { permissionMode } = resolvePermissions(opts.permissions);\n\n const controller = new ClaudeCodeController({\n teamName: `claude-${randomUUID().slice(0, 8)}`,\n cwd: opts.cwd,\n claudeBinary: opts.claudeBinary,\n env,\n logLevel: opts.logLevel ?? \"warn\",\n logger: opts.logger,\n });\n\n await controller.init();\n\n // Set up ready detection BEFORE spawning so we don't miss the idle event\n const ready = waitForReady(controller, name, opts.readyTimeout);\n\n try {\n const handle = await controller.spawnAgent({\n name,\n type: opts.type ?? \"general-purpose\",\n model: opts.model,\n cwd: opts.cwd,\n permissionMode,\n });\n\n const agent = new Agent(controller, handle, true, {\n autoApprove: opts.autoApprove,\n onPermission: opts.onPermission,\n onPlan: opts.onPlan,\n });\n await ready;\n return agent;\n } catch (err) {\n await controller.shutdown().catch(() => {});\n throw err;\n }\n }\n\n /** Create an agent within an existing session (session owns the controller). */\n static async createInSession(\n controller: ClaudeCodeController,\n name: string,\n opts: SessionAgentOptions = {}\n ): Promise<Agent> {\n const { permissionMode } = resolvePermissions(opts.permissions);\n const ready = waitForReady(controller, name, opts.readyTimeout);\n\n const handle = await controller.spawnAgent({\n name,\n type: opts.type ?? \"general-purpose\",\n model: opts.model,\n cwd: opts.cwd,\n permissionMode,\n env: opts.env,\n });\n\n const agent = new Agent(controller, handle, false, {\n autoApprove: opts.autoApprove,\n onPermission: opts.onPermission,\n onPlan: opts.onPlan,\n });\n await ready;\n return agent;\n }\n\n /** The agent's name. */\n get name(): string {\n return this.handle.name;\n }\n\n /** The agent process PID. */\n get pid(): number | undefined {\n return this.handle.pid;\n }\n\n /** Whether the agent process is still running. */\n get isRunning(): boolean {\n return this.handle.isRunning;\n }\n\n /**\n * Send a message and wait for the response.\n *\n * Uses event-based waiting (via the controller's InboxPoller) instead of\n * polling `readUnread()` directly, which avoids a race condition where the\n * poller marks inbox messages as read before `receive()` can see them.\n */\n async ask(question: string, opts?: AskOptions): Promise<string> {\n this.ensureNotDisposed();\n const timeout = opts?.timeout ?? 120_000;\n\n // Register listener BEFORE sending so we don't miss the response\n const responsePromise = new Promise<string>((resolve, reject) => {\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(`Timeout (${timeout}ms) waiting for response`));\n }, timeout);\n\n const onMsg = (text: string) => {\n cleanup();\n resolve(text);\n };\n const onExit = (code: number | null) => {\n cleanup();\n reject(new Error(`Agent exited (code=${code}) before responding`));\n };\n const cleanup = () => {\n clearTimeout(timer);\n this.removeListener(\"message\", onMsg);\n this.removeListener(\"exit\", onExit);\n };\n\n this.on(\"message\", onMsg);\n this.on(\"exit\", onExit);\n });\n\n // Agents in teammate mode don't always use SendMessage unprompted.\n // Append a reminder so responses come back through the inbox reliably.\n const wrapped = `${question}\\n\\nIMPORTANT: You MUST send your complete answer back using the SendMessage tool. Do NOT just think your answer — use the SendMessage tool to reply.`;\n await this.handle.send(wrapped);\n return responsePromise;\n }\n\n /** Send a message without waiting for a response. */\n async send(message: string): Promise<void> {\n this.ensureNotDisposed();\n return this.handle.send(message);\n }\n\n /** Wait for the next response from this agent. */\n async receive(opts?: AskOptions): Promise<string> {\n this.ensureNotDisposed();\n const timeout = opts?.timeout ?? 120_000;\n\n return new Promise<string>((resolve, reject) => {\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(`Timeout (${timeout}ms) waiting for response`));\n }, timeout);\n\n const onMsg = (text: string) => {\n cleanup();\n resolve(text);\n };\n const onExit = (code: number | null) => {\n cleanup();\n reject(new Error(`Agent exited (code=${code}) before responding`));\n };\n const cleanup = () => {\n clearTimeout(timer);\n this.removeListener(\"message\", onMsg);\n this.removeListener(\"exit\", onExit);\n };\n\n this.on(\"message\", onMsg);\n this.on(\"exit\", onExit);\n });\n }\n\n /**\n * Close this agent. If standalone, shuts down the entire controller.\n * If session-owned, kills only this agent's process.\n */\n async close(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n this.unwireEvents();\n\n if (this.ownsController) {\n await this.controller.shutdown();\n } else {\n await this.handle.kill();\n }\n }\n\n /** Mark as disposed (used by Session when it closes). */\n markDisposed(): void {\n this.disposed = true;\n this.unwireEvents();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n\n private wireEvents(): void {\n const agentName = this.handle.name;\n\n const onMessage = (name: string, msg: InboxMessage) => {\n if (name === agentName) this.emit(\"message\", msg.text);\n };\n const onIdle = (name: string, _details: any) => {\n if (name === agentName) this.emit(\"idle\");\n };\n const onPermission = (name: string, parsed: PermissionRequestMessage) => {\n if (name !== agentName) return;\n let handled = false;\n const guard = (fn: () => Promise<void>) => () => {\n if (handled) return Promise.resolve();\n handled = true;\n return fn();\n };\n this.emit(\"permission\", {\n requestId: parsed.requestId,\n toolName: parsed.toolName,\n description: parsed.description,\n input: parsed.input,\n approve: guard(() =>\n this.controller.sendPermissionResponse(agentName, parsed.requestId, true)\n ),\n reject: guard(() =>\n this.controller.sendPermissionResponse(agentName, parsed.requestId, false)\n ),\n });\n };\n const onPlan = (name: string, parsed: PlanApprovalRequestMessage) => {\n if (name !== agentName) return;\n let handled = false;\n const guard = (fn: (...a: any[]) => Promise<void>) => (...args: any[]) => {\n if (handled) return Promise.resolve();\n handled = true;\n return fn(...args);\n };\n this.emit(\"plan\", {\n requestId: parsed.requestId,\n planContent: parsed.planContent,\n approve: guard((feedback?: string) =>\n this.controller.sendPlanApproval(agentName, parsed.requestId, true, feedback)\n ),\n reject: guard((feedback: string) =>\n this.controller.sendPlanApproval(agentName, parsed.requestId, false, feedback)\n ),\n });\n };\n const onExit = (name: string, code: number | null) => {\n if (name === agentName) this.emit(\"exit\", code);\n };\n const onError = (err: Error) => {\n this.emit(\"error\", err);\n };\n\n this.controller.on(\"message\", onMessage);\n this.controller.on(\"idle\", onIdle);\n this.controller.on(\"permission:request\", onPermission);\n this.controller.on(\"plan:approval_request\", onPlan);\n this.controller.on(\"agent:exited\", onExit);\n this.controller.on(\"error\", onError);\n\n this.boundListeners = [\n { event: \"message\", fn: onMessage },\n { event: \"idle\", fn: onIdle },\n { event: \"permission:request\", fn: onPermission },\n { event: \"plan:approval_request\", fn: onPlan },\n { event: \"agent:exited\", fn: onExit },\n { event: \"error\", fn: onError },\n ];\n }\n\n private unwireEvents(): void {\n for (const { event, fn } of this.boundListeners) {\n this.controller.removeListener(event, fn);\n }\n this.boundListeners = [];\n }\n\n private wireBehavior(behavior?: AgentBehavior): void {\n if (!behavior) return;\n\n const { autoApprove, onPermission, onPlan } = behavior;\n\n // autoApprove: wire up automatic permission and plan handling\n if (autoApprove != null) {\n this.on(\"permission\", (req) => {\n if (autoApprove === true) {\n req.approve();\n } else if (Array.isArray(autoApprove)) {\n autoApprove.includes(req.toolName) ? req.approve() : req.reject();\n }\n });\n\n // autoApprove also auto-approves plans\n if (autoApprove === true) {\n this.on(\"plan\", (req) => req.approve());\n }\n }\n\n // Inline callbacks (run after autoApprove, so they can override)\n if (onPermission) {\n this.on(\"permission\", onPermission);\n }\n if (onPlan) {\n this.on(\"plan\", onPlan);\n }\n }\n\n private ensureNotDisposed(): void {\n if (this.disposed) {\n throw new Error(\"Agent has been closed\");\n }\n }\n}\n\n// ─── Session ────────────────────────────────────────────────────────────────\n\nexport class Session {\n readonly controller: ClaudeCodeController;\n private defaults: SessionOptions;\n private agents = new Map<string, Agent>();\n private disposed = false;\n\n private constructor(\n controller: ClaudeCodeController,\n defaults: SessionOptions\n ) {\n this.controller = controller;\n this.defaults = defaults;\n }\n\n static async create(opts: SessionOptions = {}): Promise<Session> {\n const env = buildEnv(opts);\n const controller = new ClaudeCodeController({\n teamName: opts.teamName ?? `session-${randomUUID().slice(0, 8)}`,\n cwd: opts.cwd,\n claudeBinary: opts.claudeBinary,\n env,\n logLevel: opts.logLevel ?? \"warn\",\n logger: opts.logger,\n });\n\n await controller.init();\n return new Session(controller, opts);\n }\n\n /** Spawn a named agent in this session. Inherits session defaults. */\n async agent(name: string, opts: SessionAgentOptions = {}): Promise<Agent> {\n this.ensureNotDisposed();\n\n const merged: SessionAgentOptions = {\n model: this.defaults.model,\n cwd: this.defaults.cwd,\n permissions: this.defaults.permissions,\n readyTimeout: this.defaults.readyTimeout,\n autoApprove: this.defaults.autoApprove,\n onPermission: this.defaults.onPermission,\n onPlan: this.defaults.onPlan,\n ...opts,\n };\n\n const agent = await Agent.createInSession(\n this.controller,\n name,\n merged\n );\n this.agents.set(name, agent);\n return agent;\n }\n\n /** Get an existing agent by name. */\n get(name: string): Agent | undefined {\n return this.agents.get(name);\n }\n\n /** Close all agents and shut down the session. */\n async close(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n for (const agent of this.agents.values()) {\n agent.markDisposed();\n }\n\n await this.controller.shutdown();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n\n private ensureNotDisposed(): void {\n if (this.disposed) {\n throw new Error(\"Session has been closed\");\n }\n }\n}\n\n// ─── claude() ───────────────────────────────────────────────────────────────\n\n/**\n * One-liner: send a prompt, get a response.\n * Creates an ephemeral agent, sends the message, returns the answer, cleans up.\n *\n * @example\n * ```ts\n * const answer = await claude(\"What does this project do?\", { model: \"sonnet\" });\n * ```\n */\nasync function claudeCall(\n prompt: string,\n opts: ClaudeOptions = {}\n): Promise<string> {\n const agent = await Agent.create(opts);\n try {\n return await agent.ask(prompt, { timeout: opts.timeout ?? 120_000 });\n } finally {\n await agent.close();\n }\n}\n\n/**\n * The simplified Claude Code API.\n *\n * - `claude(prompt, opts?)` — one-liner: ask a question, get an answer\n * - `claude.agent(opts?)` — create a persistent agent for multi-turn conversations\n * - `claude.session(opts?)` — create a multi-agent session\n */\nexport const claude = Object.assign(claudeCall, {\n /**\n * Create a persistent agent for multi-turn conversations.\n *\n * @example\n * ```ts\n * const agent = await claude.agent({ model: \"sonnet\" });\n * const answer = await agent.ask(\"What is 2+2?\");\n * await agent.close();\n * ```\n */\n agent: (opts?: ClaudeOptions) => Agent.create(opts),\n\n /**\n * Create a multi-agent session.\n *\n * @example\n * ```ts\n * const session = await claude.session({ model: \"sonnet\" });\n * const reviewer = await session.agent(\"reviewer\", { model: \"opus\" });\n * const coder = await session.agent(\"coder\");\n * await session.close();\n * ```\n */\n session: (opts?: SessionOptions) => Session.create(opts),\n});\n\n// Re-export helpers for testing\nexport { buildEnv, resolvePermissions, waitForReady };\n"],"mappings":"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","names":["import_hono","import_node_child_process","import_node_crypto","import_promises","import_node_fs","import_node_child_process","import_promises","import_node_fs","import_node_path","sleep","import_node_events","import_node_crypto"]}