omnara 0.1.9 → 0.1.11

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.
package/dist/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/cli.ts", "../src/commands/agent.ts", "../src/orchestrator/agent-orchestrator.ts", "../src/orchestrator/ai-client.ts", "../src/orchestrator/session.ts", "../src/orchestrator/utils/session-logger.ts", "../src/orchestrator/worker-manager.ts", "../src/orchestrator/tools/worker-status-tool.ts", "../src/orchestrator/utils/async-queue.ts", "../src/orchestrator/utils/worktree-manager.ts", "../src/utils/logger.ts", "../src/auth/credentials-store.ts", "../src/config/omnara-config.ts", "../src/orchestrator/tools/worker-tools.ts", "../src/orchestrator/orchestrator-prompt.ts", "../src/relay/relay-bridge.ts", "../src/http/api-client.ts", "../src/relay/relay-service.ts", "../src/auth/supabase-client.ts", "../src/auth/supabase-config.ts", "../src/auth/credential-manager.ts", "../src/utils/prompt.ts", "../src/auth/cli-auth-service.ts", "../src/auth/pkce.ts", "../src/auth/loopback-listener.ts", "../src/utils/browser.ts", "../src/auth/login-flow.ts", "../src/auth/auth-provider.ts", "../src/http/user-sessions.ts", "../../shared-js/dist/schemas/index.js", "../../shared-js/schemas/control_message.schema.json", "../../shared-js/schemas/message_envelope.schema.json", "../../shared-js/schemas/api_voice_launch_request.schema.json", "../../shared-js/schemas/api_voice_launch_response.schema.json", "../../shared-js/schemas/api_sessions_create_request.schema.json", "../../shared-js/schemas/api_sessions_summary.schema.json", "../../shared-js/schemas/api_sessions_list_response.schema.json", "../../shared-js/schemas/api_sessions_message_page_response.schema.json", "../../shared-js/schemas/api_sessions_agent_detail.schema.json", "../../shared-js/schemas/api_sessions_create_chat_message_request.schema.json", "../../shared-js/schemas/api_billing_subscription_response.schema.json", "../../shared-js/schemas/api_billing_usage_response.schema.json", "../../shared-js/schemas/api_billing_create_checkout_request.schema.json", "../../shared-js/schemas/api_billing_checkout_response.schema.json", "../../shared-js/schemas/api_billing_validate_promo_request.schema.json", "../../shared-js/schemas/api_billing_promo_validation_response.schema.json", "../../shared-js/schemas/api_billing_customer_portal_request.schema.json", "../../shared-js/schemas/api_billing_customer_portal_response.schema.json", "../../shared-js/schemas/api_settings_notification_request.schema.json", "../../shared-js/schemas/api_settings_notification_response.schema.json", "../src/repl/terminal-repl.ts", "../src/voice/voice-service.ts", "../src/utils/claude-code-check.ts", "../src/commands/auth.ts", "../src/utils/version-check.ts"],
4
- "sourcesContent": ["import path from 'path';\nimport { createRequire } from 'node:module';\nimport { Command } from 'commander';\nimport {\n buildAgentCommand,\n buildAuthCommand,\n runAgentOrchestrator,\n type OrchestratorOptions,\n} from './commands/index.js';\nimport { checkForUpdatesInBackground } from './utils/version-check.js';\nimport { performClaudeCodeCheck } from './utils/claude-code-check.js';\nimport { logger } from './utils/logger.js';\n\nconst require = createRequire(import.meta.url);\n\ninterface PackageJson {\n description?: string;\n version?: string;\n}\n\nconst packageJson = require('../package.json') as PackageJson;\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('omnara')\n .description(packageJson.description ?? 'Command-line interface for Omnara.')\n .version(packageJson.version ?? '0.0.0')\n .option('--backend-url <url>', 'Override backend API base URL used for login')\n .option('--frontend-url <url>', 'Override frontend URL opened during login')\n .action(async () => {\n const options = program.opts<OrchestratorOptions>();\n await runAgentOrchestrator(options);\n });\n\n // Register top-level commands here.\n program.addCommand(buildAgentCommand());\n program.addCommand(buildAuthCommand());\n\n return program;\n}\n\nexport async function run(argv: readonly string[]): Promise<void> {\n const program = createProgram();\n\n // Check for Claude Code installation (non-blocking)\n performClaudeCodeCheck({ silent: false, exitOnMissing: false });\n\n // Check for updates in the background (non-blocking)\n checkForUpdatesInBackground();\n\n try {\n await program.parseAsync(argv as string[]);\n } catch (error) {\n // Commander will already have logged the error. Set non-zero exit for clarity.\n program.error((error as Error).message, { exitCode: 1 });\n }\n}\n\n// Check if this module is being run directly (ESM equivalent of require.main === module)\nfunction isMainModule(): boolean {\n // In ES modules, check if the current file URL matches the executed script\n if (!import.meta.url || !process.argv[1]) {\n return false;\n }\n\n // Convert process.argv[1] to a file URL for comparison\n const executedPath = path.resolve(process.argv[1]);\n const currentPath = import.meta.url.startsWith('file://')\n ? decodeURIComponent(import.meta.url.slice(7)) // Remove 'file://' prefix\n : import.meta.url;\n\n // Normalize paths for comparison\n return path.normalize(currentPath) === path.normalize(executedPath);\n}\n\nif (isMainModule()) {\n run(process.argv).catch((error: unknown) => {\n logger.error(error);\n process.exitCode = 1;\n });\n}\n", "import { Command } from 'commander';\nimport { AgentOrchestrator } from '../orchestrator/agent-orchestrator.js';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport { RelayBridge } from '../relay/relay-bridge.js';\nimport { runTerminalRepl } from '../repl/terminal-repl.js';\nimport { ApiClient } from '../http/api-client.js';\nimport { registerRelaySession } from '../relay/relay-service.js';\nimport { launchVoiceForSession } from '../voice/voice-service.js';\nimport { createAuthProvider } from '../auth/auth-provider.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from '../auth/login-flow.js';\nimport { getClaudeCodeVersion } from '../utils/claude-code-check.js';\nimport { logger, extractErrorMessage } from '../utils/logger.js';\n\nexport function buildAgentCommand(): Command {\n const agent = new Command('agent').description(\n 'Utilities for interacting with the Omnara Claude agent.',\n );\n\n agent\n .command('orchestrator')\n .alias('server')\n .description('Start the Omnara agent orchestrator.')\n .option('--backend-url <url>', 'Override backend API base URL used for login')\n .option('--frontend-url <url>', 'Override frontend URL opened during login')\n .action(async (options: OrchestratorOptions) => {\n await runAgentOrchestrator(options);\n });\n\n agent\n .command('repl')\n .description('Start the Omnara agent REPL connected through the backend relay.')\n .requiredOption('--session-id <id>', 'Connect to an existing parent agent session')\n .requiredOption('--user-session-id <id>', 'User session that owns the agent session')\n .option('--backend-url <url>', 'Override backend API base URL used for login')\n .option('--frontend-url <url>', 'Override frontend URL opened during login')\n .action(async (options: ReplCommandOptions) => {\n await runRepl(options);\n });\n\n agent\n .command('voice')\n .description('Dispatch the LiveKit voice agent for an existing session.')\n .requiredOption('--session-id <id>', 'Agent session to connect the voice worker to')\n .option('--backend-url <url>', 'Override backend API base URL used for login')\n .option('--frontend-url <url>', 'Override frontend URL opened during login')\n .option('--room-name <name>', 'Override the LiveKit room name used for the call')\n .option('--force', 'Launch even if the CLI relay is offline')\n .action(async (options: VoiceCommandOptions) => {\n await runVoice(options);\n });\n\n return agent;\n}\n\nexport interface OrchestratorOptions {\n backendUrl?: string;\n frontendUrl?: string;\n}\n\ninterface ReplCommandOptions {\n sessionId: string;\n userSessionId: string;\n backendUrl?: string;\n frontendUrl?: string;\n}\n\ninterface VoiceCommandOptions {\n sessionId: string;\n backendUrl?: string;\n frontendUrl?: string;\n roomName?: string;\n force?: boolean;\n}\n\nexport async function runAgentOrchestrator(options: OrchestratorOptions = {}): Promise<void> {\n // Log Claude Code status\n const claudeVersion = getClaudeCodeVersion();\n if (claudeVersion) {\n logger.info(`\u2713 Claude Code detected: ${claudeVersion}`);\n } else {\n logger.info('\u2139 Running without Claude Code integration');\n }\n\n const orchestrator = new AgentOrchestrator();\n await orchestrator.start();\n\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const store = new CredentialsStore();\n const bridge = new RelayBridge(orchestrator, {\n store,\n logger: console,\n backendUrl,\n frontendUrl,\n });\n\n const stop = async () => {\n await bridge.stop();\n await orchestrator.stop();\n };\n\n const signalHandler = createSignalHandler(stop);\n process.on('SIGINT', signalHandler.handler);\n process.on('SIGTERM', signalHandler.handler);\n\n try {\n await bridge.start();\n } catch (error) {\n logger.error(`Relay orchestrator terminated: ${extractErrorMessage(error)}`);\n process.exitCode = process.exitCode || 1;\n } finally {\n await stop();\n signalHandler.remove();\n }\n}\n\nfunction createSignalHandler(onStop: () => Promise<void>) {\n let stopping = false;\n\n const handler = (signal: NodeJS.Signals) => {\n if (stopping) {\n return;\n }\n stopping = true;\n logger.important(`\\nReceived ${signal}. Shutting down agent orchestrator...`);\n void onStop().catch((error) => {\n logger.error('Error while shutting down agent orchestrator:', error);\n });\n };\n\n const remove = () => {\n process.removeListener('SIGINT', handler);\n process.removeListener('SIGTERM', handler);\n };\n\n return { handler, remove };\n}\n\nasync function runRepl(options: ReplCommandOptions): Promise<void> {\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const store = new CredentialsStore();\n const authProvider = await createAuthProvider({\n store,\n backendUrl,\n frontendUrl,\n logger: console,\n });\n\n const client = new ApiClient({ baseUrl: backendUrl });\n const accessToken = await authProvider.getAccessToken();\n const registration = await registerRelaySession(client, accessToken, {\n userSessionId: options.userSessionId,\n clientKind: 'cli',\n });\n const wsUrl = buildRelayWebsocketUrl(backendUrl, registration.relayWsPath);\n\n logger.important(\n `Using agent session ${options.sessionId} (user session ${registration.userSessionId})`,\n );\n\n await runTerminalRepl({\n url: wsUrl,\n headers: {\n authorization: `Bearer ${accessToken}`,\n 'x-relay-token': registration.relayToken,\n },\n initialSessionId: options.sessionId,\n });\n}\n\nasync function runVoice(options: VoiceCommandOptions): Promise<void> {\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const store = new CredentialsStore();\n const authProvider = await createAuthProvider({\n store,\n backendUrl,\n frontendUrl,\n logger: console,\n });\n\n const client = new ApiClient({ baseUrl: backendUrl });\n const launch = await launchVoiceForSession(client, await authProvider.getAccessToken(), {\n sessionId: options.sessionId,\n force: options.force ?? false,\n roomName: options.roomName,\n });\n\n logger.success('\\nVoice agent dispatched successfully.');\n logger.important(`Session ID: ${launch.sessionId}`);\n logger.important(`LiveKit URL: ${launch.livekitUrl}`);\n logger.important(`Room name: ${launch.roomName}`);\n logger.important(`Participant identity: ${launch.accessTokenIdentity}`);\n logger.important('\\nUse this token to join the room:');\n logger.important(launch.accessToken);\n logger.log('\\nOnce connected (for example via the LiveKit Agents playground),');\n logger.log('the voice worker will coordinate with the CLI coding agent through the relay.');\n logger.debug(`Relay websocket: ${launch.relayWsUrl}`);\n logger.debug(`Relay token (expires in ${launch.relayTokenExpiresIn}s):`);\n logger.debug(launch.relayToken);\n logger.important('\\nKeep this information secure\u2014tokens grant access to your agent session.');\n}\n\nfunction buildRelayWebsocketUrl(baseUrl: string, path: string): string {\n const url = new URL(baseUrl);\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n url.search = '';\n url.hash = '';\n if (path.startsWith('/')) {\n url.pathname = path;\n } else {\n const basePath = url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`;\n url.pathname = `${basePath}${path}`;\n }\n return url.toString();\n}\n", "import { randomUUID } from 'crypto';\nimport {\n AIClient,\n BASE_ALLOWED_ORCHESTRATOR_TOOLS,\n BASE_ALLOWED_WORKER_TOOLS,\n type AgentClient,\n} from './ai-client.js';\nimport { Session } from './session.js';\nimport { WorkerManager, type WorkerRecord, type WorkerMessageEvent } from './worker-manager.js';\nimport { createWorkerMcpServer } from './tools/worker-tools.js';\nimport type { InboundMessage, OutboundMessage } from './orchestrator-types.js';\nimport { ORCHESTRATOR_SYSTEM_PROMPT } from './orchestrator-prompt.js';\nimport type { McpServerConfig } from '@anthropic-ai/claude-agent-sdk';\n\ninterface AgentOrchestratorDependencies {\n createMainClient?: () => AgentClient;\n createWorkerClient?: (mcpServers?: Record<string, McpServerConfig>, cwd?: string) => AgentClient;\n workerManager?: WorkerManager;\n repoPath?: string;\n}\n\nconst WORKER_LAUNCH_TOOL = 'mcp__worker__launch_worker';\nconst WORKER_GET_TOOL = 'mcp__worker__get_workers';\nconst WORKER_MESSAGE_TOOL = 'mcp__worker__message_worker';\n\ninterface ClientConnection {\n id: string;\n sessionIds: Set<string>;\n send: (message: OutboundMessage) => void;\n canSend?: () => boolean;\n close?: () => void;\n}\n\nexport interface AgentOrchestratorClientAdapter {\n send: (message: OutboundMessage) => void;\n canSend?: () => boolean;\n close?: () => void;\n}\n\nexport interface AgentOrchestratorConnection {\n id: string;\n dispatch(message: InboundMessage): void;\n disconnect(): void;\n}\n\nexport class AgentOrchestrator {\n private readonly aiClient: AgentClient;\n private readonly workerManager: WorkerManager;\n private readonly sessions = new Map<string, Session>();\n private readonly clients = new Map<string, ClientConnection>();\n private readonly toolUseMap = new Map<string, string>();\n // Track the main coding session (parent_session_id = null, type = CODE)\n private mainCodingSessionId: string | null = null;\n // Track voice sessions to filter out their messages\n readonly voiceSessionIds = new Set<string>(); // Made non-private for relay-bridge access\n\n private started = false;\n\n constructor(dependencies?: AgentOrchestratorDependencies) {\n const resolveSessionIdBySdk = (sdkSessionId?: string) =>\n this.findSessionIdBySdkSession(sdkSessionId);\n\n const workerClientFactory =\n dependencies?.createWorkerClient ??\n ((mcpServers?: Record<string, McpServerConfig>, cwd?: string) =>\n new AIClient({\n defaults: {\n allowedTools: [...BASE_ALLOWED_WORKER_TOOLS, 'mcp__worker_status__send_status_update'],\n mcpServers,\n cwd: cwd || process.cwd(),\n },\n }));\n\n this.workerManager =\n dependencies?.workerManager ??\n new WorkerManager({\n createClient: workerClientFactory,\n resolveSessionIdBySdk,\n repoPath: dependencies?.repoPath ?? process.cwd(),\n });\n\n const workerMcpServer = createWorkerMcpServer(this.workerManager, {\n resolveSessionIdBySdk,\n resolveSessionIdByToolUse: (toolUseId: string) => this.consumeToolUse(toolUseId),\n // Always use main coding session as parent for workers\n getMainCodingSessionId: () => this.mainCodingSessionId,\n });\n\n const mainClientFactory =\n dependencies?.createMainClient ??\n (() =>\n new AIClient({\n defaults: {\n allowedTools: [\n ...BASE_ALLOWED_ORCHESTRATOR_TOOLS,\n WORKER_LAUNCH_TOOL,\n WORKER_GET_TOOL,\n WORKER_MESSAGE_TOOL,\n ],\n mcpServers: {\n worker: workerMcpServer,\n },\n systemPrompt: ORCHESTRATOR_SYSTEM_PROMPT,\n },\n }));\n\n this.aiClient = mainClientFactory();\n\n this.registerWorkerListeners();\n }\n\n ensureSessionExists(sessionId: string): Session {\n const existing = this.sessions.get(sessionId);\n if (existing) {\n return existing;\n }\n const session = new Session(\n sessionId,\n this.aiClient,\n (id) => this.handleSessionEmpty(id),\n (toolUseId) => this.registerToolUse(toolUseId, sessionId),\n );\n this.sessions.set(sessionId, session);\n return session;\n }\n\n getSession(sessionId: string): Session | undefined {\n return this.sessions.get(sessionId);\n }\n\n getWorkerManager(): WorkerManager {\n return this.workerManager;\n }\n\n setMainCodingSessionId(sessionId: string): void {\n if (!this.mainCodingSessionId) {\n this.mainCodingSessionId = sessionId;\n console.log(`[Orchestrator] Set main coding session: ${this.mainCodingSessionId}`);\n }\n }\n\n addClient(adapter: AgentOrchestratorClientAdapter): AgentOrchestratorConnection {\n const clientId = randomUUID();\n const connection: ClientConnection = {\n id: clientId,\n sessionIds: new Set(),\n send: adapter.send,\n canSend: adapter.canSend,\n close: adapter.close,\n };\n\n this.clients.set(clientId, connection);\n\n let disconnected = false;\n const disconnect = (): void => {\n if (disconnected) {\n return;\n }\n disconnected = true;\n this.handleDisconnect(connection);\n try {\n connection.close?.();\n } catch (error) {\n console.error('Failed to close client connection:', error);\n }\n };\n\n return {\n id: clientId,\n dispatch: (message: InboundMessage) => {\n this.handleClientMessage(connection, message);\n },\n disconnect,\n };\n }\n\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n this.started = true;\n }\n\n async stop(): Promise<void> {\n // Shutdown worker manager first to clean up all worktrees\n await this.workerManager.shutdown();\n\n for (const connection of Array.from(this.clients.values())) {\n this.handleDisconnect(connection);\n try {\n connection.close?.();\n } catch (error) {\n console.error('Failed to close client connection:', error);\n }\n }\n this.clients.clear();\n\n for (const session of this.sessions.values()) {\n session.close();\n }\n this.sessions.clear();\n this.started = false;\n }\n\n private handleDisconnect(connection: ClientConnection): void {\n for (const sessionId of connection.sessionIds) {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.unsubscribe(connection.id);\n }\n }\n\n this.clients.delete(connection.id);\n }\n\n private handleClientMessage(connection: ClientConnection, message: InboundMessage): void {\n switch (message.type) {\n case 'chat':\n this.handleChatMessage(connection, message);\n break;\n case 'session_init':\n this.handleSessionInit(connection, message);\n break;\n case 'join':\n this.handleJoin(connection, message.sessionId);\n break;\n case 'leave':\n this.handleLeave(connection, message.sessionId);\n break;\n case 'ping':\n this.sendToConnection(connection, { type: 'pong' });\n break;\n case 'cancel_worker':\n this.handleCancelWorker(connection, message.workerId);\n break;\n default:\n this.sendToConnection(connection, {\n type: 'error',\n message: `Unsupported message type: ${(message as { type: string }).type}`,\n });\n }\n }\n\n private handleSessionInit(\n connection: ClientConnection,\n message: Extract<InboundMessage, { type: 'session_init' }>,\n ): void {\n // Track the main coding session (parent = null, type = CODE)\n if (!message.parentSessionId && message.metadata?.session_type === 'CODE') {\n this.mainCodingSessionId = message.sessionId;\n console.log(`[Orchestrator] Set main coding session: ${this.mainCodingSessionId}`);\n }\n\n // Track voice sessions to filter out their messages\n if (message.metadata?.session_type === 'VOICE') {\n this.voiceSessionIds.add(message.sessionId);\n console.log(`[Orchestrator] Tracking voice session from init:`, {\n sessionId: message.sessionId,\n sessionType: message.metadata?.session_type,\n parentSessionId: message.parentSessionId,\n currentVoiceSessions: Array.from(this.voiceSessionIds),\n });\n }\n\n this.sendToConnection(connection, {\n type: 'session_init_ack',\n sessionId: message.sessionId,\n parentSessionId: message.parentSessionId ?? null,\n });\n }\n\n private handleChatMessage(\n connection: ClientConnection,\n message: Extract<InboundMessage, { type: 'chat' }>,\n ): void {\n console.log('[Orchestrator] handleChatMessage:', {\n sessionId: message.sessionId,\n senderId: message.senderId,\n senderKind: message.senderKind,\n mainCodingSessionId: this.mainCodingSessionId,\n isVoiceSession: message.sessionId ? this.voiceSessionIds.has(message.sessionId) : false,\n textPreview: message.text.substring(0, 100),\n });\n\n // Filter out messages TO voice sessions - they should be handled by voice agent, not orchestrator\n if (message.sessionId && this.voiceSessionIds.has(message.sessionId)) {\n console.log('[Orchestrator] Ignoring message to voice session:', message.sessionId);\n return;\n }\n\n let session: Session | undefined;\n let sessionId = message.sessionId;\n\n if (sessionId) {\n session = this.sessions.get(sessionId);\n if (!session) {\n this.sendToConnection(connection, {\n type: 'error',\n sessionId,\n message: 'Session not found.',\n });\n return;\n }\n } else {\n session = this.createSession();\n sessionId = session.id;\n this.sendToConnection(connection, {\n type: 'session_created',\n sessionId,\n });\n }\n\n if (!connection.sessionIds.has(sessionId)) {\n session.subscribe({\n id: connection.id,\n send: (payload) => {\n this.sendToConnection(connection, payload);\n },\n canSend: connection.canSend,\n });\n connection.sessionIds.add(sessionId);\n }\n\n session.logInbound({ type: 'chat', text: message.text });\n session.announceInboundMessage(message.text, 'user');\n session.enqueueUserMessage(message.text);\n }\n\n private handleJoin(connection: ClientConnection, sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.sendToConnection(connection, {\n type: 'error',\n sessionId,\n message: 'Session not found.',\n });\n return;\n }\n\n if (!connection.sessionIds.has(sessionId)) {\n session.subscribe({\n id: connection.id,\n send: (payload) => {\n this.sendToConnection(connection, payload);\n },\n canSend: connection.canSend,\n });\n connection.sessionIds.add(sessionId);\n } else {\n this.sendToConnection(connection, {\n type: 'session_joined',\n sessionId,\n });\n }\n }\n\n private handleLeave(connection: ClientConnection, sessionId: string): void {\n if (!connection.sessionIds.has(sessionId)) {\n this.sendToConnection(connection, {\n type: 'error',\n sessionId,\n message: 'You are not subscribed to this session.',\n });\n return;\n }\n\n connection.sessionIds.delete(sessionId);\n const session = this.sessions.get(sessionId);\n if (session) {\n session.unsubscribe(connection.id);\n }\n }\n\n private handleCancelWorker(connection: ClientConnection, workerId: string): void {\n const canceled = this.workerManager.cancelWorker(workerId);\n if (!canceled) {\n this.sendToConnection(connection, {\n type: 'error',\n message: `Worker ${workerId} not found or not running.`,\n });\n }\n }\n\n private createSession(): Session {\n const sessionId = randomUUID();\n return this.ensureSessionExists(sessionId);\n }\n\n private registerToolUse(toolUseId: string, sessionId: string): void {\n this.toolUseMap.set(toolUseId, sessionId);\n }\n\n private consumeToolUse(toolUseId: string): string | undefined {\n const sessionId = this.toolUseMap.get(toolUseId);\n if (sessionId) {\n this.toolUseMap.delete(toolUseId);\n }\n return sessionId;\n }\n\n private handleSessionEmpty(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return;\n }\n\n if (!session.hasSubscribers()) {\n session.close();\n this.sessions.delete(sessionId);\n }\n }\n\n private registerWorkerListeners(): void {\n this.workerManager.on('session_start', (record) => {\n this.handleWorkerSessionStart(record);\n });\n\n this.workerManager.on('message', (event: WorkerMessageEvent) => {\n this.handleWorkerMessage(event);\n });\n\n this.workerManager.on('update', (record) => {\n this.broadcastAgentProgress(record);\n });\n\n this.workerManager.on('completed', (record) => {\n this.broadcastAgentProgress(record);\n this.handleWorkerCompletion(record);\n });\n }\n\n private broadcastAgentProgress(record: WorkerRecord): void {\n const progress = this.buildAgentProgress(record);\n // Worker progress updates should use the worker's own session ID\n const targetSessionId = record.sessionId;\n console.log('[Orchestrator] Broadcasting agent_progress:', {\n agentSessionId: record.sessionId,\n task: record.task,\n status: progress.status,\n originSessionId: record.originSessionId,\n });\n this.broadcastToAll({\n type: 'agent_progress',\n sessionId: targetSessionId,\n status: progress.status,\n detail: progress.detail,\n metadata: progress.metadata,\n messageId: randomUUID(), // Always use a valid UUID for message_id\n });\n }\n\n private buildAgentProgress(record: WorkerRecord): {\n status: string;\n detail?: string;\n metadata?: Record<string, unknown>;\n } {\n const latest =\n record.progress.length > 0 ? record.progress[record.progress.length - 1]?.message : undefined;\n\n // Create a concise one-line summary\n let summary: string | undefined;\n if (record.status === 'completed') {\n summary = record.result || `Task \"${record.task}\" completed`;\n } else if (record.status === 'error') {\n summary = `Task \"${record.task}\" failed: ${record.error || 'Unknown error'}`;\n } else if (record.status === 'canceled') {\n summary = `Task \"${record.task}\" was canceled`;\n } else if (record.status === 'running') {\n summary = latest || `Task \"${record.task}\" is running`;\n }\n\n const detail = summary ?? latest ?? undefined;\n\n const metadata: Record<string, unknown> = {\n agent_session_id: record.sessionId,\n task: record.task,\n last_update_at: record.lastUpdateAt,\n };\n\n if (record.originSessionId) {\n metadata.origin_session_id = record.originSessionId;\n }\n if (latest) {\n metadata.latest_message = latest;\n }\n if (record.result) {\n metadata.result = record.result;\n }\n if (record.error) {\n metadata.error = record.error;\n }\n\n return {\n status: record.status,\n detail,\n metadata,\n };\n }\n\n private handleWorkerSessionStart(record: WorkerRecord): void {\n // Include task in metadata for persistence\n const metadata = {\n ...record.metadata,\n task: record.task,\n };\n\n this.broadcastToAll({\n type: 'session_init',\n sessionId: record.sessionId,\n parentSessionId: record.originSessionId ?? null,\n metadata,\n messageId: randomUUID(),\n });\n }\n\n private handleWorkerMessage(event: WorkerMessageEvent): void {\n console.log('[Orchestrator] handleWorkerMessage:', {\n messageType: event.messageType,\n workerId: event.record.id,\n task: event.record.task,\n workerSessionId: event.record.sessionId,\n originSessionId: event.record.originSessionId,\n });\n\n // Worker messages should use the worker's own session ID\n // The parent-child relationship is already established via session_init\n const targetSessionId = event.record.sessionId;\n\n switch (event.messageType) {\n case 'assistant_text':\n if (!event.text) {\n return;\n }\n this.broadcastToAll({\n type: 'assistant_text',\n sessionId: targetSessionId,\n text: event.text,\n workerId: event.record.id,\n workerTask: event.record.task,\n messageId: randomUUID(),\n });\n break;\n case 'assistant_complete':\n {\n const completionMetadata: Record<string, unknown> = {\n agent_session_id: event.record.id,\n task: event.record.task,\n };\n if (event.record.originSessionId) {\n completionMetadata.origin_session_id = event.record.originSessionId;\n }\n this.broadcastToAll({\n type: 'agent_complete',\n sessionId: targetSessionId,\n success: event.success ?? true,\n message: event.text,\n metadata: completionMetadata,\n messageId: randomUUID(),\n });\n }\n break;\n case 'tool_call':\n if (!event.toolName || !event.toolUseId) {\n return;\n }\n console.log('[Orchestrator] Broadcasting worker tool_call:', {\n toolName: event.toolName,\n workerId: event.record.id,\n task: event.record.task,\n targetSessionId,\n toolUseId: event.toolUseId,\n });\n this.broadcastToAll({\n type: 'tool_call',\n sessionId: targetSessionId,\n toolName: event.toolName,\n toolUseId: event.toolUseId,\n input: event.toolInput,\n workerId: event.record.id,\n workerTask: event.record.task,\n messageId: randomUUID(),\n });\n break;\n case 'tool_result':\n if (!event.toolUseId) {\n return;\n }\n console.log('[Orchestrator] Broadcasting worker tool_result:', {\n toolName: event.toolName,\n workerId: event.record.id,\n task: event.record.task,\n targetSessionId,\n toolUseId: event.toolUseId,\n });\n this.broadcastToAll({\n type: 'tool_result',\n sessionId: targetSessionId,\n toolUseId: event.toolUseId,\n content: event.toolContent,\n isError: event.isError,\n workerId: event.record.id,\n workerTask: event.record.task,\n messageId: randomUUID(),\n });\n break;\n default:\n break;\n }\n }\n\n private handleWorkerCompletion(record: WorkerRecord): void {\n const sessionId = record.originSessionId;\n if (!sessionId) {\n return;\n }\n\n const session = this.sessions.get(sessionId);\n if (!session) {\n return;\n }\n\n const summary = this.buildWorkerSummary(record);\n if (!summary) {\n return;\n }\n\n // Broadcast result message for worker with task context to parent session\n const success = record.status === 'completed';\n const durationMs = record.lastUpdateAt - record.startedAt;\n const metadata: Record<string, unknown> = {\n agent_session_id: record.sessionId,\n task: record.task,\n origin_session_id: record.originSessionId,\n };\n if (record.result) {\n metadata.result = record.result;\n }\n if (record.error) {\n metadata.error = record.error;\n }\n\n this.broadcastToAll({\n type: 'agent_complete',\n sessionId: record.sessionId, // Use worker's session ID\n success,\n durationMs,\n message: `[${record.task}] ${summary}`,\n metadata,\n messageId: randomUUID(),\n });\n\n session.logInbound({\n type: 'worker_result',\n workerId: record.id,\n workerTask: record.task,\n summary,\n });\n session.announceInboundMessage(summary, 'worker', record.id, record.task);\n\n // Send comprehensive worker status message to orchestrator's conversation for LLM context\n const statusMessage = this.buildWorkerStatusMessage(record.id);\n session.enqueueUserMessage(statusMessage, {\n triggeredBy: 'worker_completion',\n workerId: record.id,\n workerTask: record.task,\n });\n }\n\n private buildWorkerSummary(record: WorkerRecord): string | null {\n switch (record.status) {\n case 'completed':\n return record.result ?? `Worker ${record.id} completed.`;\n case 'error':\n return `Worker ${record.id} failed: ${record.error ?? 'Unknown error.'}`;\n case 'canceled':\n return `Worker ${record.id} was canceled.`;\n default:\n return null;\n }\n }\n\n /**\n * Build a comprehensive worker status message showing ALL workers,\n * with special highlighting for the worker that triggered this generation.\n */\n private buildWorkerStatusMessage(triggerWorkerId: string): string {\n const allWorkers = this.workerManager.listWorkers();\n\n if (allWorkers.length === 0) {\n return '[WORKER STATUS UPDATE]\\n\\nNo active workers.';\n }\n\n const lines: string[] = ['[WORKER STATUS UPDATE - Generation Triggered]'];\n lines.push('');\n\n for (const worker of allWorkers) {\n const isTrigger = worker.id === triggerWorkerId;\n const prefix = isTrigger ? '>>> ' : ' ';\n const triggerNote = isTrigger ? ' \u2190 JUST COMPLETED (triggered this generation)' : '';\n\n const latestMsg =\n worker.progress.length > 0\n ? worker.progress[worker.progress.length - 1]?.message\n : undefined;\n\n lines.push(`${prefix}Task: \"${worker.task}\"${triggerNote}`);\n lines.push(`${prefix}Status: ${worker.status}`);\n lines.push(`${prefix}Worker ID: ${worker.id}`);\n\n if (worker.status === 'completed') {\n // For completed workers, include the full result and progress log\n if (worker.result) {\n lines.push(`${prefix}Result: ${worker.result}`);\n }\n\n // Include the full progress log so orchestrator can see everything the worker did\n if (worker.progress.length > 0) {\n lines.push(`${prefix}Full Progress Log:`);\n for (const entry of worker.progress) {\n // Format timestamp as relative time\n const timestamp = new Date(entry.timestamp).toISOString();\n lines.push(`${prefix} [${timestamp}] ${entry.message}`);\n }\n }\n } else if (worker.status === 'error' && worker.error) {\n lines.push(`${prefix}Error: ${worker.error}`);\n\n // Include progress log for errors too, to see what led to the failure\n if (worker.progress.length > 0) {\n lines.push(`${prefix}Progress Before Error:`);\n for (const entry of worker.progress) {\n const timestamp = new Date(entry.timestamp).toISOString();\n lines.push(`${prefix} [${timestamp}] ${entry.message}`);\n }\n }\n } else if (worker.status === 'running' && latestMsg) {\n lines.push(`${prefix}Latest: ${latestMsg}`);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n private broadcastToAll(message: OutboundMessage): void {\n for (const connection of this.clients.values()) {\n this.sendToConnection(connection, message);\n }\n }\n\n private findSessionIdBySdkSession(sdkSessionId?: string): string | undefined {\n if (!sdkSessionId) {\n return undefined;\n }\n for (const [serverId, session] of this.sessions.entries()) {\n if (session.sdkSessionIdentifier === sdkSessionId) {\n return serverId;\n }\n }\n return undefined;\n }\n\n private sendToConnection(connection: ClientConnection, message: OutboundMessage): void {\n if (connection.canSend && !connection.canSend()) {\n return;\n }\n try {\n connection.send(message);\n } catch (error) {\n console.error('Failed to send message to client:', error);\n this.handleDisconnect(connection);\n }\n }\n}\n\nexport async function startAgentOrchestrator(\n dependencies?: AgentOrchestratorDependencies,\n): Promise<AgentOrchestrator> {\n const server = new AgentOrchestrator(dependencies);\n await server.start();\n return server;\n}\n", "import fs from 'fs';\nimport {\n query,\n type Options,\n type Query,\n type SDKMessage,\n type SDKUserMessage,\n} from '@anthropic-ai/claude-agent-sdk';\n\nexport interface AIClientConfig {\n defaults?: Partial<Options>;\n}\n\nexport interface AgentClient {\n streamUserMessage(prompt: string, overrides?: Partial<Options>): AsyncIterable<SDKMessage>;\n createQuery(prompt: string | AsyncIterable<SDKUserMessage>, overrides?: Partial<Options>): Query;\n}\n\nexport const BASE_ALLOWED_ORCHESTRATOR_TOOLS = [\n 'Glob',\n 'Grep',\n 'LS',\n 'Read',\n 'WebFetch',\n 'WebSearch',\n 'TodoWrite',\n] as const;\n\nexport const BASE_ALLOWED_WORKER_TOOLS = [\n 'Task',\n 'Bash',\n 'Glob',\n 'Grep',\n 'LS',\n 'ExitPlanMode',\n 'Read',\n 'Edit',\n 'MultiEdit',\n 'Write',\n 'NotebookEdit',\n 'WebFetch',\n 'TodoWrite',\n 'WebSearch',\n 'BashOutput',\n 'KillBash',\n 'Skill',\n 'SlashCommand',\n] as const;\n\nexport class AIClient implements AgentClient {\n private readonly baseOptions: Options;\n\n constructor(config?: AIClientConfig) {\n const defaultOptions: Options = {\n maxTurns: 100,\n model: 'sonnet',\n cwd: process.cwd(),\n includePartialMessages: false,\n allowedTools: [...BASE_ALLOWED_ORCHESTRATOR_TOOLS],\n };\n\n this.baseOptions = {\n ...defaultOptions,\n ...config?.defaults,\n };\n\n // Log when using a custom cwd (for debugging worktree isolation)\n if (this.baseOptions.cwd && this.baseOptions.cwd !== process.cwd()) {\n console.log('[AIClient] Using custom working directory:', this.baseOptions.cwd);\n }\n\n this.ensureWorkingDirectory(this.baseOptions.cwd);\n }\n\n async *streamUserMessage(\n prompt: string,\n overrides?: Partial<Options>,\n ): AsyncIterable<SDKMessage> {\n const q = this.createQuery(prompt, overrides);\n for await (const message of q) {\n yield message;\n }\n }\n\n createQuery(prompt: string | AsyncIterable<SDKUserMessage>, overrides?: Partial<Options>): Query {\n const merged: Options = {\n ...this.baseOptions,\n ...overrides,\n };\n\n this.ensureWorkingDirectory(merged.cwd);\n\n return query({\n prompt,\n options: merged,\n });\n }\n\n private ensureWorkingDirectory(cwd?: string): void {\n if (!cwd) {\n return;\n }\n try {\n fs.mkdirSync(cwd, { recursive: true });\n } catch (error) {\n console.warn(`Failed to ensure working directory ${cwd}:`, error);\n }\n }\n}\n", "import type {\n SDKAssistantMessage,\n SDKMessage,\n SDKResultMessage,\n} from '@anthropic-ai/claude-agent-sdk';\nimport { randomUUID } from 'crypto';\nimport type { AgentClient } from './ai-client.js';\nimport type { OutboundMessage, SessionSubscriber } from './orchestrator-types.js';\nimport { createSessionLogger, type SessionLogger } from './utils/session-logger.js';\n\ntype StreamEvent = {\n type: string;\n [key: string]: unknown;\n};\n\ntype ToolUseCallback = (toolUseId: string, sessionId: string) => void;\n\nexport class Session {\n readonly id: string;\n\n private readonly aiClient: AgentClient;\n private readonly subscribers = new Map<string, SessionSubscriber>();\n private readonly onEmpty: (sessionId: string) => void;\n private readonly onToolUse?: ToolUseCallback;\n private readonly logger: SessionLogger;\n\n private sdkSessionId: string | null = null;\n private inflight: Promise<void> | null = null;\n private lastActivity = Date.now();\n\n constructor(\n id: string,\n aiClient: AgentClient,\n onEmpty: (sessionId: string) => void,\n onToolUse?: ToolUseCallback,\n ) {\n this.id = id;\n this.aiClient = aiClient;\n this.onEmpty = onEmpty;\n this.onToolUse = onToolUse;\n this.logger = createSessionLogger(this.id);\n }\n\n announceInboundMessage(\n text: string,\n origin: 'user' | 'worker' = 'user',\n workerId?: string,\n workerTask?: string,\n ): void {\n if (!text) {\n return;\n }\n // Only broadcast worker-origin updates. User messages already show up via `chat` frames.\n if (origin !== 'worker') {\n return;\n }\n const message: OutboundMessage = {\n type: 'user_text',\n sessionId: this.id,\n text,\n origin,\n workerId,\n workerTask,\n messageId: randomUUID(),\n };\n this.broadcast(message);\n }\n\n get lastActiveAt(): number {\n return this.lastActivity;\n }\n\n get sdkSessionIdentifier(): string | null {\n return this.sdkSessionId;\n }\n\n subscribe(subscriber: SessionSubscriber): void {\n this.subscribers.set(subscriber.id, subscriber);\n this.safeSend(subscriber, {\n type: 'session_joined',\n sessionId: this.id,\n messageId: randomUUID(),\n });\n }\n\n unsubscribe(subscriberId: string): void {\n this.subscribers.delete(subscriberId);\n if (!this.hasSubscribers() && !this.inflight) {\n this.onEmpty(this.id);\n }\n }\n\n hasSubscribers(): boolean {\n return this.subscribers.size > 0;\n }\n\n close(): void {\n this.subscribers.clear();\n this.logger.close();\n }\n\n enqueueUserMessage(\n text: string,\n metadata?: { triggeredBy?: string; workerId?: string; workerTask?: string },\n ): void {\n this.lastActivity = Date.now();\n const previous = this.inflight;\n\n const task = async (): Promise<void> => {\n if (previous) {\n try {\n await previous;\n } catch {\n // Previous error already reported, continue with new message.\n }\n }\n\n await this.processUserMessage(text, metadata);\n };\n\n const promise = task()\n .catch((error: unknown) => {\n this.broadcast({\n type: 'error',\n sessionId: this.id,\n message: extractErrorMessage(error),\n messageId: randomUUID(),\n });\n })\n .finally(() => {\n if (this.inflight === promise) {\n this.inflight = null;\n this.lastActivity = Date.now();\n if (!this.hasSubscribers()) {\n this.onEmpty(this.id);\n }\n }\n });\n\n this.inflight = promise;\n }\n\n handleStreamEvent(event: StreamEvent): void {\n switch (event.type) {\n case 'content_block_delta': {\n const delta = event.delta as { type?: string; text?: string } | undefined;\n if (delta?.type === 'text_delta' && delta.text) {\n console.log('[Session] Streaming text delta:', delta.text.substring(0, 50));\n this.broadcast({\n type: 'assistant_text',\n sessionId: this.id,\n text: delta.text,\n messageId: randomUUID(),\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n private async processUserMessage(\n text: string,\n metadata?: { triggeredBy?: string; workerId?: string; workerTask?: string },\n ): Promise<void> {\n // Broadcast metadata about this generation trigger\n if (metadata?.triggeredBy === 'worker_completion') {\n this.broadcast({\n type: 'system',\n sessionId: this.id,\n subtype: 'generation_triggered',\n metadata: {\n triggeredBy: 'worker_completion',\n workerId: metadata.workerId,\n workerTask: metadata.workerTask,\n },\n messageId: randomUUID(),\n });\n }\n\n const options = this.sdkSessionId ? { resume: this.sdkSessionId } : undefined;\n\n for await (const message of this.aiClient.streamUserMessage(text, options)) {\n this.routeSdkMessage(message);\n }\n }\n\n private routeSdkMessage(message: SDKMessage): void {\n switch (message.type) {\n case 'assistant':\n this.handleAssistantMessage(message);\n break;\n case 'stream_event':\n this.handleStreamEvent(message.event as StreamEvent);\n break;\n case 'result':\n this.handleResultMessage(message);\n break;\n case 'system':\n this.handleSystemMessage(message);\n break;\n case 'user': {\n const textContent = extractUserContent(message.message.content);\n if (textContent) {\n this.broadcast({\n type: 'user_text',\n sessionId: this.id,\n text: textContent,\n messageId: randomUUID(),\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n private handleAssistantMessage(message: SDKAssistantMessage): void {\n const content = message.message.content;\n\n if (!Array.isArray(content)) {\n return;\n }\n\n console.log('[Session] Processing assistant message with', content.length, 'blocks');\n\n for (const block of content) {\n if (!block || typeof block !== 'object') {\n continue;\n }\n\n const typed = block as unknown as Record<string, unknown>;\n const blockType = typed.type;\n\n if (blockType === 'text' && typeof typed.text === 'string') {\n if (typed.text.length > 0) {\n console.log('[Session] Broadcasting assistant_text:', typed.text.substring(0, 100));\n this.broadcast({\n type: 'assistant_text',\n sessionId: this.id,\n text: typed.text,\n messageId: randomUUID(),\n });\n }\n } else if (blockType === 'tool_use') {\n const toolUseId = typeof typed.id === 'string' && typed.id ? typed.id : randomUUID();\n console.log('[Session] Broadcasting tool_call:', typed.name, 'id:', toolUseId);\n this.broadcast({\n type: 'tool_call',\n sessionId: this.id,\n toolName: typeof typed.name === 'string' ? typed.name : 'unknown',\n toolUseId,\n input: typed.input,\n messageId: randomUUID(), // Always use a valid UUID for message_id\n });\n this.onToolUse?.(toolUseId, this.id);\n } else if (blockType === 'tool_result') {\n const toolResultId =\n typeof typed.tool_use_id === 'string' && typed.tool_use_id\n ? typed.tool_use_id\n : randomUUID();\n console.log('[Session] Broadcasting tool_result:', toolResultId);\n this.broadcast({\n type: 'tool_result',\n sessionId: this.id,\n toolUseId: toolResultId,\n content: typed.content,\n isError: Boolean(typed.is_error),\n messageId: randomUUID(), // Always use a valid UUID for message_id\n });\n }\n }\n }\n\n private handleResultMessage(message: SDKResultMessage): void {\n const success = message.subtype === 'success';\n this.broadcast({\n type: 'agent_complete',\n sessionId: this.id,\n success,\n durationMs: message.duration_ms,\n costUsd: message.total_cost_usd,\n message: success ? message.result : `Error: ${message.subtype}`,\n messageId: randomUUID(),\n });\n }\n\n private handleSystemMessage(message: Extract<SDKMessage, { type: 'system' }>): void {\n if (message.subtype === 'init') {\n this.sdkSessionId = message.session_id;\n }\n this.broadcast({\n type: 'system',\n sessionId: this.id,\n subtype: message.subtype,\n messageId: randomUUID(),\n });\n }\n\n logInbound(payload: unknown): void {\n this.logger.logInbound(payload);\n }\n\n private broadcast(message: OutboundMessage): void {\n this.logger.logOutbound(message);\n for (const [id, subscriber] of this.subscribers) {\n if (subscriber.canSend && !subscriber.canSend()) {\n this.subscribers.delete(id);\n continue;\n }\n this.safeSend(subscriber, message);\n }\n }\n\n private safeSend(subscriber: SessionSubscriber, message: OutboundMessage): void {\n try {\n subscriber.send(message);\n } catch {\n this.subscribers.delete(subscriber.id);\n }\n }\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n try {\n return JSON.stringify(error);\n } catch {\n return 'Unknown error';\n }\n}\n\nfunction extractUserContent(content: unknown): string | null {\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n const texts: string[] = [];\n for (const part of content) {\n if (\n part &&\n typeof part === 'object' &&\n 'type' in part &&\n (part as Record<string, unknown>).type === 'text' &&\n typeof (part as Record<string, unknown>).text === 'string'\n ) {\n texts.push((part as Record<string, unknown>).text as string);\n }\n }\n if (texts.length > 0) {\n return texts.join('');\n }\n }\n\n return null;\n}\n", "import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport type { OutboundMessage } from '../orchestrator-types.js';\n\nfunction getLogDir(): string {\n return process.env.OMNARA_LOG_DIR ?? path.join(os.homedir(), '.omnara', 'omnara-voice');\n}\n\nfunction ensureLogDir(): string {\n const dir = getLogDir();\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // ignore\n }\n return dir;\n}\n\nexport type SessionLogger = {\n logInbound: (payload: unknown) => void;\n logOutbound: (message: OutboundMessage) => void;\n close: () => void;\n};\n\nexport function createSessionLogger(sessionId: string): SessionLogger {\n const dir = ensureLogDir();\n const filePath = path.join(dir, `${sessionId}.log`);\n const stream = fs.createWriteStream(filePath, { flags: 'a' });\n\n const logLine = (direction: 'in' | 'out', payload: unknown) => {\n const timestamp = new Date().toISOString();\n const serialized = safeStringify(payload);\n stream.write(`${timestamp} [${direction}] ${serialized}\\n`);\n };\n\n return {\n logInbound: (payload) => logLine('in', payload),\n logOutbound: (message) => logLine('out', message),\n close: () => {\n try {\n stream.end();\n } catch {\n // ignore close errors\n }\n },\n };\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n", "import { EventEmitter } from 'events';\nimport { randomUUID } from 'crypto';\nimport type {\n Query,\n SDKMessage,\n SDKUserMessage,\n HookInput,\n HookJSONOutput,\n PostToolUseHookInput,\n McpServerConfig,\n} from '@anthropic-ai/claude-agent-sdk';\nimport type { AgentClient } from './ai-client.js';\nimport { createWorkerStatusMcpServer, type StatusUpdateEvent } from './tools/worker-status-tool.js';\nimport { AsyncQueue } from './utils/async-queue.js';\nimport { WorktreeManager } from './utils/worktree-manager.js';\nimport { logger } from '../utils/logger.js';\nimport { readOmnaraConfig, isWorktreesEnabled } from '../config/omnara-config.js';\n\nexport type WorkerStatus = 'running' | 'completed' | 'error' | 'canceled';\n\nexport interface WorkerProgressEntry {\n timestamp: number;\n message: string;\n}\n\nexport interface WorkerRecord {\n id: string;\n task: string;\n prompt: string;\n sessionId: string;\n status: WorkerStatus;\n startedAt: number;\n lastUpdateAt: number;\n originSessionId?: string;\n progress: WorkerProgressEntry[];\n result?: string;\n error?: string;\n metadata?: Record<string, unknown>;\n messageQueue: AsyncQueue<SDKUserMessage>;\n worktreePath?: string;\n branchName?: string;\n work_context?: string;\n worktree_name?: string;\n}\n\nexport interface WorkerMessageEvent {\n record: WorkerRecord;\n messageType: 'assistant_text' | 'assistant_complete' | 'tool_call' | 'tool_result';\n text?: string;\n success?: boolean;\n toolName?: string;\n toolUseId?: string;\n toolInput?: unknown;\n toolContent?: unknown;\n isError?: boolean;\n}\n\ninterface LaunchWorkerOptions {\n task: string;\n prompt: string;\n work_context: string;\n worktree_name: string;\n originSessionId?: string;\n metadata?: Record<string, unknown>;\n}\n\ninterface WorkerManagerOptions {\n createClient: (mcpServers?: Record<string, McpServerConfig>, cwd?: string) => AgentClient;\n resolveSessionIdBySdk?: (sdkSessionId?: string) => string | undefined;\n repoPath: string;\n}\n\nexport class WorkerManager extends EventEmitter {\n private readonly workers = new Map<string, WorkerRecord>();\n private readonly runningQueries = new Map<string, Query>();\n private worktreeManager: WorktreeManager;\n private configInitialized = false;\n\n constructor(private readonly options: WorkerManagerOptions) {\n super();\n\n // Initialize with worktrees disabled as default\n this.worktreeManager = new WorktreeManager({\n repoPath: options.repoPath,\n enabled: false,\n });\n\n // Read omnara.jsonc configuration asynchronously\n this.initializeConfig();\n }\n\n /**\n * Initialize the configuration and update WorktreeManager accordingly\n */\n private async initializeConfig(): Promise<void> {\n try {\n const config = await readOmnaraConfig();\n const worktreesEnabled = isWorktreesEnabled(config);\n\n if (worktreesEnabled) {\n logger.info('Worktrees enabled via omnara.jsonc configuration');\n } else {\n logger.info('Worktrees disabled (no worktrees config found in omnara.jsonc)');\n }\n\n // Re-initialize WorktreeManager with proper configuration\n this.worktreeManager = new WorktreeManager({\n repoPath: this.options.repoPath,\n enabled: worktreesEnabled,\n });\n\n this.configInitialized = true;\n\n } catch (err) {\n logger.error('Failed to read omnara.jsonc configuration:', err);\n logger.info('Worktrees disabled due to config read error');\n\n // Keep worktrees disabled\n this.configInitialized = true;\n }\n }\n\n listWorkers(): WorkerRecord[] {\n return Array.from(this.workers.values());\n }\n\n getWorker(id: string): WorkerRecord | undefined {\n return this.workers.get(id);\n }\n\n getWorkerByTask(task: string): WorkerRecord | undefined {\n for (const worker of this.workers.values()) {\n if (worker.task === task) {\n return worker;\n }\n }\n return undefined;\n }\n\n /**\n * Get a formatted summary of all current worker statuses for inclusion in system prompts.\n * Returns a string describing all active workers and their current state.\n */\n getWorkerStatusSummary(): string {\n const workers = this.listWorkers();\n\n if (workers.length === 0) {\n return 'No active workers.';\n }\n\n const lines = ['## Current Worker Status'];\n lines.push('');\n\n for (const worker of workers) {\n const latestMsg =\n worker.progress.length > 0\n ? worker.progress[worker.progress.length - 1]?.message\n : undefined;\n\n lines.push(`**Task: \"${worker.task}\"**`);\n lines.push(`- Status: ${worker.status}`);\n lines.push(`- Worker ID: ${worker.id}`);\n\n if (worker.status === 'completed' && worker.result) {\n lines.push(`- Result: ${worker.result}`);\n } else if (worker.status === 'error' && worker.error) {\n lines.push(`- Error: ${worker.error}`);\n } else if (latestMsg) {\n lines.push(`- Latest: ${latestMsg}`);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n launchWorker(\n { task, prompt, work_context, worktree_name, originSessionId, metadata }: LaunchWorkerOptions,\n toolUseId?: string,\n ): WorkerRecord {\n // Use a single UUID for both worker ID and session ID to unify them\n const sessionId = randomUUID();\n const resolvedOriginSessionId = originSessionId;\n const record: WorkerRecord = {\n id: sessionId, // Worker ID is the same as session ID\n task,\n prompt,\n status: 'running',\n sessionId,\n startedAt: Date.now(),\n lastUpdateAt: Date.now(),\n originSessionId: resolvedOriginSessionId,\n progress: [],\n metadata,\n messageQueue: new AsyncQueue<SDKUserMessage>(),\n work_context,\n worktree_name,\n };\n\n this.workers.set(sessionId, record);\n this.emit('session_start', { ...record });\n this.emitUpdate(record);\n\n // Emit tool_call event for launch_worker to make it visible in the worker's session\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_call',\n toolName: 'mcp__worker__launch_worker',\n toolUseId,\n toolInput: { task, prompt, metadata },\n } satisfies WorkerMessageEvent);\n\n // Emit tool_result immediately after to show the worker was successfully launched\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId,\n toolContent: {\n workerId: record.id,\n status: record.status,\n message: `Worker launched successfully, task ${task} in progress.`,\n },\n isError: false,\n } satisfies WorkerMessageEvent);\n }\n\n // Create worktree and run worker asynchronously\n void this.createWorktreeAndRun(record, prompt);\n return record;\n }\n\n private async createWorktreeAndRun(record: WorkerRecord, prompt: string): Promise<void> {\n try {\n // Only create worktree if worktrees are enabled\n if (this.worktreeManager.isEnabled()) {\n // Create worktree for this worker\n logger.info(`Creating worktree for worker ${record.id} (task: ${record.task})`);\n const worktreeInfo = await this.worktreeManager.createWorktree(\n record.id,\n record.worktree_name || record.id,\n );\n\n // Update record with worktree information\n record.worktreePath = worktreeInfo.worktreePath;\n record.branchName = worktreeInfo.branchName;\n record.progress.push({\n timestamp: Date.now(),\n message: `Worktree created at ${worktreeInfo.worktreePath} on branch ${worktreeInfo.branchName}`,\n });\n this.emitUpdate(record);\n\n logger.info(`Worktree created for worker ${record.id} at ${worktreeInfo.worktreePath}`);\n } else {\n // Worktrees disabled, run in current working directory\n logger.info(`Worktrees disabled, worker ${record.id} will run in current directory`);\n record.progress.push({\n timestamp: Date.now(),\n message: 'Worktrees disabled, running in current directory',\n });\n this.emitUpdate(record);\n }\n\n // Run the worker (with or without worktree)\n await this.runWorker(record, prompt);\n } catch (error) {\n // Handle worktree creation failure or other errors\n logger.error(`Failed to setup worker ${record.id}:`, error);\n record.status = 'error';\n record.error = `Failed to setup worker: ${error instanceof Error ? error.message : String(error)}`;\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: `Worker failed: ${record.error}`,\n });\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: record.error,\n } satisfies WorkerMessageEvent);\n this.emitCompleted(record);\n\n // Close the message queue\n record.messageQueue.close();\n }\n }\n\n cancelWorker(id: string): boolean {\n const record = this.workers.get(id);\n if (!record) {\n return false;\n }\n\n if (record.status !== 'running') {\n return false;\n }\n\n record.status = 'canceled';\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: 'Worker canceled by user request.',\n });\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: 'Worker canceled by user request.',\n } satisfies WorkerMessageEvent);\n\n const query = this.runningQueries.get(id);\n if (query) {\n void query.interrupt().catch(() => {\n // Ignore interrupt errors; status already updated.\n });\n }\n\n // Close the message queue\n record.messageQueue.close();\n\n // Cleanup worktree asynchronously (will be handled in runWorker's catch block)\n // The worktree cleanup is handled in the runWorker method when it detects canceled status\n\n return true;\n }\n\n /**\n * Send a message to a worker (running or completed).\n *\n * @param task - The task name of the worker to message\n * @param message - The message content to send\n * @param interrupt - If true, interrupt current generation; if false, queue for next turn\n * @param toolUseId - Optional tool use ID to track this operation for relay forwarding\n * @returns true if message was sent, false if worker not found or message queue is closed\n */\n async messageWorker(\n task: string,\n message: string,\n interrupt: boolean,\n toolUseId?: string,\n ): Promise<boolean> {\n const record = this.getWorkerByTask(task);\n\n if (!record) {\n return false;\n }\n\n // Emit tool_call event for message_worker to make it visible in the worker's session\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_call',\n toolName: 'mcp__worker__message_worker',\n toolUseId,\n toolInput: { task, message, interrupt },\n } satisfies WorkerMessageEvent);\n }\n\n // Check if the worker needs to be restarted (completed, error, or canceled)\n if (record.status !== 'running') {\n // Create a new message queue for the restarted worker\n record.messageQueue = new AsyncQueue<SDKUserMessage>();\n\n record.status = 'running';\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: `Worker restarted with new message: ${message}`,\n });\n this.emitUpdate(record);\n\n // Restart the worker by calling runWorker again\n // The message will be consumed from the queue\n void this.runWorker(record, ''); // Empty prompt since we're resuming\n }\n\n // After potential restart, check if the queue is still closed (shouldn't happen)\n if (record.messageQueue.isClosed()) {\n console.error('[WorkerManager] Message queue is closed after restart attempt');\n return false;\n }\n\n // Log the message being sent to progress for internal tracking\n record.progress.push({\n timestamp: Date.now(),\n message: `[ORCHESTRATOR MESSAGE${interrupt ? ' - INTERRUPT' : ''}]: ${message}`,\n });\n record.lastUpdateAt = Date.now();\n\n // If interrupt is requested, interrupt the current query\n if (interrupt) {\n const query = this.runningQueries.get(record.id);\n if (query) {\n try {\n await query.interrupt();\n } catch (error) {\n console.error('[WorkerManager] Failed to interrupt worker:', error);\n }\n }\n }\n\n // Create SDK user message and push to queue\n const userMessage: SDKUserMessage = {\n session_id: record.sessionId,\n type: 'user',\n message: {\n role: 'user',\n content: message,\n },\n parent_tool_use_id: null,\n isSynthetic: true,\n };\n\n try {\n record.messageQueue.push(userMessage);\n\n // Emit tool_result to confirm message was queued/sent successfully\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId,\n toolContent: {\n success: true,\n task,\n interrupted: interrupt,\n message: interrupt\n ? `Message sent to worker \"${task}\" (interrupted current work)`\n : `Message queued for worker \"${task}\" (will be delivered after current turn)`,\n },\n isError: false,\n } satisfies WorkerMessageEvent);\n }\n\n return true;\n } catch (error) {\n console.error('[WorkerManager] Failed to queue message:', error);\n\n // Emit error result if we have a toolUseId\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId,\n toolContent: {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to queue message',\n },\n isError: true,\n } satisfies WorkerMessageEvent);\n }\n\n return false;\n }\n }\n\n private emitUpdate(record: WorkerRecord): void {\n this.emit('update', { ...record });\n }\n\n private emitCompleted(record: WorkerRecord): void {\n this.emit('completed', { ...record });\n }\n\n private handleStatusUpdate(record: WorkerRecord, event: StatusUpdateEvent): void {\n console.log('[WorkerManager] Status update received:', {\n workerId: record.id,\n task: record.task,\n message: event.message,\n metadata: event.metadata,\n });\n record.progress.push({\n timestamp: event.timestamp,\n message: event.message,\n });\n record.lastUpdateAt = event.timestamp;\n this.emitUpdate(record);\n }\n\n /**\n * Create an async iterable stream of user messages for the worker.\n * Yields the initial prompt, then streams any additional messages from the queue.\n * If initialPrompt is empty, skips the initial yield and only consumes from the queue.\n */\n private async *createMessageStream(\n initialPrompt: string,\n sessionId: string,\n messageQueue: AsyncQueue<SDKUserMessage>,\n ): AsyncIterable<SDKUserMessage> {\n // Only yield initial prompt if it's not empty (for worker restart/resume)\n if (initialPrompt.trim()) {\n yield {\n session_id: sessionId,\n type: 'user',\n message: {\n role: 'user',\n content: initialPrompt,\n },\n parent_tool_use_id: null,\n };\n }\n\n // Continue yielding messages from the queue\n for await (const message of messageQueue) {\n yield message;\n }\n }\n\n private async runWorker(record: WorkerRecord, prompt: string): Promise<void> {\n // Create status update MCP server for this worker\n const statusMcpServer = createWorkerStatusMcpServer((event: StatusUpdateEvent) => {\n this.handleStatusUpdate(record, event);\n });\n\n console.log('[WorkerManager] Creating worker client with status MCP server:', {\n workerId: record.id,\n task: record.task,\n hasMcpServer: !!statusMcpServer,\n worktreePath: record.worktreePath,\n branchName: record.branchName,\n });\n\n // Create client with status MCP server and worktree path as cwd\n const client = this.options.createClient(\n {\n worker_status: statusMcpServer,\n },\n record.worktreePath,\n );\n\n // Wrap the prompt with worker instructions including worktree information\n const workerPrompt = this.wrapPrompt(prompt, record.worktreePath, record.branchName);\n\n // Create message stream that includes initial prompt and any future messages\n const messageStream = this.createMessageStream(\n workerPrompt,\n record.sessionId,\n record.messageQueue,\n );\n\n // Create query with the message stream for continuous message support\n // Add PostToolUse hook to capture tool results\n // This hook fires AFTER a tool has been executed and allows us to intercept the result\n const query = client.createQuery(messageStream, {\n hooks: {\n PostToolUse: [\n {\n // No matcher means it applies to all tools (Bash, Read, Write, etc.)\n // If we wanted to only capture Bash results, we could add: matcher: 'Bash'\n hooks: [\n async (input: HookInput, toolUseID: string | undefined): Promise<HookJSONOutput> => {\n // Type guard to ensure we're handling PostToolUse events\n if (input.hook_event_name !== 'PostToolUse') {\n return {};\n }\n\n // Now we can safely access PostToolUse-specific fields\n const postToolInput = input as PostToolUseHookInput;\n\n console.log('[WorkerManager] PostToolUse hook triggered:', {\n toolName: postToolInput.tool_name,\n toolUseID,\n hasResponse: !!postToolInput.tool_response,\n workerId: record.id,\n task: record.task,\n });\n\n // Log the structure of the tool response for debugging\n if (postToolInput.tool_name === 'Bash') {\n console.log('[WorkerManager] Bash tool response structure:', {\n responseType: typeof postToolInput.tool_response,\n responseKeys: postToolInput.tool_response\n ? Object.keys(postToolInput.tool_response)\n : [],\n fullResponse: postToolInput.tool_response,\n });\n }\n\n // Emit tool_result message event for broadcasting\n // The tool_response from the hook contains the actual tool output\n // This will be picked up by the orchestrator and broadcast to the UI\n // where it will be paired with the corresponding tool_call by toolUseId\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId: toolUseID || randomUUID(),\n toolContent: postToolInput.tool_response,\n isError: false, // PostToolUse is for successful executions\n } satisfies WorkerMessageEvent);\n\n // Return empty object to not modify the tool response\n // We could return { suppressOutput: true } to prevent the tool result from\n // being sent to the assistant, but we want the assistant to see the results\n return {};\n },\n ],\n },\n ],\n },\n });\n\n // Store the query reference for interrupt support\n this.runningQueries.set(record.id, query);\n\n const summarizedChunks: string[] = [];\n\n try {\n for await (const message of query) {\n this.handleMessage(record, message, summarizedChunks);\n }\n\n if (record.status === 'running') {\n record.status = 'completed';\n record.result =\n summarizedChunks.join('\\n').trim() || 'Worker completed without additional details.';\n record.lastUpdateAt = Date.now();\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: true,\n text: record.result,\n } satisfies WorkerMessageEvent);\n this.emitCompleted(record);\n }\n } catch (error) {\n if (record.status === 'canceled') {\n this.emitCompleted(record);\n return;\n }\n\n record.status = 'error';\n record.error = this.extractError(error);\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: `Worker failed: ${record.error}`,\n });\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: record.error,\n } satisfies WorkerMessageEvent);\n this.emitCompleted(record);\n } finally {\n // Only delete from running queries - keep message queue open for potential future messages\n this.runningQueries.delete(record.id);\n }\n }\n\n private handleMessage(\n record: WorkerRecord,\n message: SDKMessage,\n summarizedChunks: string[],\n ): void {\n switch (message.type) {\n case 'assistant': {\n // Extract text content\n const text = this.extractAssistantText(message);\n if (text) {\n summarizedChunks.push(text);\n record.progress.push({\n timestamp: Date.now(),\n message: text,\n });\n record.lastUpdateAt = Date.now();\n this.emit('message', {\n record,\n messageType: 'assistant_text',\n text,\n } satisfies WorkerMessageEvent);\n }\n\n // Extract tool uses from assistant message content\n const content = message.message.content;\n let hasToolUse = false;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (block && typeof block === 'object' && 'type' in block) {\n if (block.type === 'tool_use' && 'name' in block && 'id' in block) {\n hasToolUse = true;\n this.emit('message', {\n record,\n messageType: 'tool_call',\n toolName: block.name as string,\n toolUseId: block.id as string,\n toolInput: 'input' in block ? block.input : undefined,\n } satisfies WorkerMessageEvent);\n }\n }\n }\n }\n\n // If the assistant message has no tool uses, close the message queue\n // This signals the end of the current generation and allows completion logic to run\n // The queue can be reopened when messageWorker is called\n if (!hasToolUse && !record.messageQueue.isClosed()) {\n console.log(\n '[WorkerManager] Assistant message without tool use - closing message queue to signal completion',\n );\n record.messageQueue.close();\n }\n break;\n }\n case 'stream_event': {\n const text = this.extractDeltaText(message);\n if (text) {\n record.progress.push({\n timestamp: Date.now(),\n message: text,\n });\n record.lastUpdateAt = Date.now();\n }\n break;\n }\n case 'result': {\n const success = message.subtype === 'success';\n if (!success && record.status === 'running') {\n record.status = 'error';\n record.error = message.subtype;\n record.lastUpdateAt = Date.now();\n this.emitUpdate(record);\n this.emitCompleted(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: record.error ?? message.subtype,\n } satisfies WorkerMessageEvent);\n }\n break;\n }\n default:\n break;\n }\n }\n\n private extractAssistantText(message: SDKMessage): string | null {\n if (message.type !== 'assistant') {\n return null;\n }\n\n const content: unknown = message.message.content;\n if (typeof content === 'string') {\n return content.trim();\n }\n\n if (Array.isArray(content)) {\n const texts: string[] = [];\n for (const block of content) {\n if (\n block &&\n typeof block === 'object' &&\n block.type === 'text' &&\n typeof block.text === 'string'\n ) {\n const trimmed = block.text.trim();\n if (trimmed.length > 0) {\n texts.push(trimmed);\n }\n }\n }\n if (texts.length > 0) {\n return texts.join('\\n');\n }\n }\n\n return null;\n }\n\n private extractDeltaText(message: SDKMessage): string | null {\n if (message.type !== 'stream_event') {\n return null;\n }\n const event = message.event;\n if (!event || typeof event !== 'object') {\n return null;\n }\n\n if (event.type === 'content_block_delta') {\n const delta = event.delta as { type?: string; text?: unknown } | null;\n if (delta?.type === 'text_delta' && typeof delta.text === 'string') {\n const raw = delta.text.trim();\n return raw.length > 0 ? raw : null;\n }\n }\n\n return null;\n }\n\n private extractError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n try {\n return JSON.stringify(error);\n } catch {\n return 'Unknown worker error';\n }\n }\n\n private wrapPrompt(userPrompt: string, worktreePath?: string, branchName?: string): string {\n let directive = `\\n\\nIMPORTANT:\\n- Use the mcp__worker_status__send_status_update tool to report progress as you work.\\n- When finished, output a final summary.\\n- Do not include raw diffs or large file dumps unless explicitly asked.\\n`;\n\n if (worktreePath && branchName) {\n directive += `\\nWORKTREE ISOLATION:\\n- You are working in an isolated git worktree at: ${worktreePath}\\n- Your dedicated branch is: ${branchName}\\n- All your file operations, git commands, and changes are isolated to this worktree.\\n- Other workers cannot see your changes and you cannot see theirs.\\n- When you're done, your worktree will be automatically cleaned up.\\n\\nCOMMIT YOUR CHANGES:\\n- Before completing your task, commit your changes using git.\\n- Use a descriptive commit message that explains what you did.\\n- Your commits will stay on your isolated branch and can be reviewed before merging.\\n- This ensures your work is preserved even if cleanup happens unexpectedly.\\n`;\n }\n\n return `${userPrompt.trim()}\\n${directive}`;\n }\n\n /**\n * Shutdown the worker manager and cleanup all resources\n * This should be called during application shutdown to ensure all worktrees are cleaned up\n */\n async shutdown(): Promise<void> {\n logger.info('Shutting down worker manager');\n\n // Cancel all running workers\n const runningWorkers = Array.from(this.workers.values()).filter((w) => w.status === 'running');\n\n for (const worker of runningWorkers) {\n logger.info(`Canceling worker ${worker.id} during shutdown`);\n this.cancelWorker(worker.id);\n }\n\n // Wait a moment for workers to process cancellation\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Force cleanup all remaining worktrees\n try {\n await this.worktreeManager.cleanupAll(true);\n logger.info('All worktrees cleaned up successfully');\n } catch (error) {\n logger.error('Error during worktree cleanup:', error);\n }\n\n logger.info('Worker manager shutdown complete');\n }\n}\n", "import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nimport { z } from 'zod';\n\nexport interface StatusUpdateEvent {\n message: string;\n metadata?: Record<string, unknown>;\n timestamp: number;\n}\n\nexport type StatusUpdateCallback = (event: StatusUpdateEvent) => void;\n\nexport function createWorkerStatusMcpServer(onStatusUpdate: StatusUpdateCallback) {\n return createSdkMcpServer({\n name: 'worker_status',\n version: '1.0.0',\n tools: [\n tool(\n 'send_status_update',\n `Send a status update message to notify about progress.\n\nUse this tool to:\n- Report progress on long-running tasks\n- Notify about important milestones or decisions\n- Provide context about what you're currently working on\n- Signal warnings or issues that don't stop execution\n\nThe status update will be visible to the orchestrator and tracked in your task's progress history.`,\n {\n message: z\n .string()\n .min(1, 'message is required')\n .describe('A concise status update message describing current progress or state'),\n metadata: z\n .record(z.any())\n .optional()\n .describe('Optional metadata to attach to this status update'),\n },\n async (args) => {\n console.log('[StatusTool] send_status_update called:', {\n message: args.message,\n metadata: args.metadata,\n });\n\n onStatusUpdate({\n message: args.message,\n metadata: args.metadata,\n timestamp: Date.now(),\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Status update sent successfully.',\n },\n ],\n };\n },\n ),\n ],\n });\n}\n", "/**\n * A simple async queue for streaming messages to workers.\n * Allows pushing messages and consuming them via async iteration.\n */\nexport class AsyncQueue<T> {\n private queue: T[] = [];\n private resolvers: Array<(value: IteratorResult<T>) => void> = [];\n private closed = false;\n\n /**\n * Push a new item to the queue.\n * If there are waiting consumers, resolve them immediately.\n */\n push(item: T): void {\n if (this.closed) {\n throw new Error('Cannot push to a closed queue');\n }\n\n if (this.resolvers.length > 0) {\n const resolve = this.resolvers.shift();\n resolve?.({ value: item, done: false });\n } else {\n this.queue.push(item);\n }\n }\n\n /**\n * Close the queue, signaling that no more items will be added.\n */\n close(): void {\n this.closed = true;\n // Resolve all waiting consumers with done: true\n while (this.resolvers.length > 0) {\n const resolve = this.resolvers.shift();\n resolve?.({ value: undefined as T, done: true });\n }\n }\n\n /**\n * Check if the queue is closed.\n */\n isClosed(): boolean {\n return this.closed;\n }\n\n /**\n * Async iterator implementation for consuming items from the queue.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n while (true) {\n // If there are items in the queue, yield them\n if (this.queue.length > 0) {\n const item = this.queue.shift();\n if (item !== undefined) {\n yield item;\n }\n continue;\n }\n\n // If the queue is closed and empty, we're done\n if (this.closed) {\n return;\n }\n\n // Wait for a new item or close\n const result = await new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n\n if (result.done) {\n return;\n }\n\n yield result.value;\n }\n }\n}\n", "import { simpleGit, type SimpleGit } from 'simple-git';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { logger } from '../../utils/logger.js';\nimport { DEFAULT_DIR } from '../../auth/credentials-store.js';\n\n/**\n * Configuration options for WorktreeManager\n */\nexport interface WorktreeManagerOptions {\n /**\n * The root directory of the git repository\n */\n repoPath: string;\n\n /**\n * Base directory for worktrees (default: .omnara/worktrees)\n */\n worktreeBasePath?: string;\n\n /**\n * Whether worktrees are enabled (default: false)\n */\n enabled?: boolean;\n}\n\n/**\n * Information about a created worktree\n */\nexport interface WorktreeInfo {\n /**\n * Unique identifier for the worker\n */\n workerId: string;\n\n /**\n * Semantic name for the worktree (e.g., \"main-feature\", \"bugfix-auth\")\n */\n worktreeName: string;\n\n /**\n * Absolute path to the worktree directory\n */\n worktreePath: string;\n\n /**\n * Name of the branch created for this worktree\n */\n branchName: string;\n\n /**\n * Timestamp when the worktree was created\n */\n createdAt: Date;\n}\n\n/**\n * Error thrown when worktree operations fail\n */\nexport class WorktreeError extends Error {\n constructor(\n message: string,\n public readonly workerId: string,\n public readonly operation: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'WorktreeError';\n }\n}\n\n/**\n * Manages git worktrees for worker isolation\n *\n * This class handles the lifecycle of git worktrees, ensuring each worker\n * operates in an isolated environment. It provides methods for creating,\n * managing, and cleaning up worktrees.\n *\n * @example\n * ```typescript\n * const manager = new WorktreeManager({ repoPath: '/path/to/repo' });\n * const info = await manager.createWorktree('worker-123', 'main-feature');\n * // Worker operates in info.worktreePath\n * await manager.removeWorktree('worker-123');\n * ```\n */\nexport class WorktreeManager {\n private readonly git: SimpleGit;\n private readonly repoPath: string;\n private readonly worktreeBasePath: string;\n private readonly activeWorktrees: Map<string, WorktreeInfo>;\n private readonly enabled: boolean;\n\n constructor(options: WorktreeManagerOptions) {\n this.repoPath = options.repoPath;\n this.enabled = options.enabled ?? false;\n\n // Extract repo name from repoPath and create path structure: ~/.omnara/worktrees/<repo-name>\n const repoName = path.basename(this.repoPath);\n this.worktreeBasePath =\n options.worktreeBasePath || path.join(DEFAULT_DIR, 'worktrees', repoName);\n this.git = simpleGit(this.repoPath);\n this.activeWorktrees = new Map();\n\n // Validate git repository if enabled\n if (this.enabled) {\n this.validateGitRepository();\n }\n }\n\n /**\n * Validate that the repoPath is a git repository\n * Logs an error if worktrees are enabled but not in a git repository\n */\n private validateGitRepository(): void {\n this.git\n .checkIsRepo()\n .then((isRepo) => {\n if (!isRepo) {\n logger.error(`Worktrees are enabled but not in a git repository at ${this.repoPath}`);\n } else {\n logger.info(`Worktrees enabled for repository at ${this.repoPath}`);\n }\n })\n .catch((error) => {\n logger.error(\n `Worktrees are enabled but failed to check git repository at ${this.repoPath}:`,\n error,\n );\n });\n }\n\n /**\n * Check if worktrees are enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Creates a new worktree for the specified worker\n *\n * @param workerId - Unique identifier for the worker\n * @param worktreeName - Semantic name for the worktree (e.g., \"main-feature\", \"bugfix-auth\")\n * @returns Information about the created worktree\n * @throws {WorktreeError} If worktree creation fails\n */\n async createWorktree(workerId: string, worktreeName: string): Promise<WorktreeInfo> {\n if (!this.enabled) {\n throw new WorktreeError(\n 'Worktrees are not enabled. Add a \"worktrees\" configuration to omnara.jsonc to enable.',\n workerId,\n 'create',\n );\n }\n\n logger.info(`Creating worktree \"${worktreeName}\" for worker ${workerId}`);\n\n try {\n // Check if worktree already exists\n if (this.activeWorktrees.has(workerId)) {\n throw new WorktreeError(\n `Worktree already exists for worker ${workerId}`,\n workerId,\n 'create',\n );\n }\n\n // Ensure base directory exists\n await fs.mkdir(this.worktreeBasePath, { recursive: true });\n\n // Generate paths and names using worktreeName instead of workerId\n const branchName = `${worktreeName}`;\n const worktreePath = path.join(this.worktreeBasePath, worktreeName);\n\n // Check if branch exists\n const branches = await this.git.branchLocal();\n const branchExists = branches.all.includes(branchName);\n\n // Check if worktree directory exists\n let worktreeDirExists = false;\n try {\n await fs.access(worktreePath);\n worktreeDirExists = true;\n } catch {\n // Directory doesn't exist\n worktreeDirExists = false;\n }\n\n // Check if worktree is registered with git\n const worktreeList = await this.git.raw(['worktree', 'list', '--porcelain']);\n const gitWorktrees = this.parseWorktreeList(worktreeList);\n const worktreeRegistered = gitWorktrees.includes(worktreePath);\n\n // Scenario 2: If worktree exists and branch exists, reuse it\n if (worktreeRegistered && branchExists) {\n logger.info(\n `Reusing existing worktree \"${worktreeName}\" at ${worktreePath} on branch ${branchName}`,\n );\n\n const info: WorktreeInfo = {\n workerId,\n worktreeName,\n worktreePath,\n branchName,\n createdAt: new Date(),\n };\n\n this.activeWorktrees.set(workerId, info);\n return info;\n }\n\n // Handle edge case: directory exists but worktree is not registered\n if (worktreeDirExists && !worktreeRegistered) {\n logger.warn(\n `Directory exists at ${worktreePath} but is not a registered worktree. Removing...`,\n );\n await fs.rm(worktreePath, { recursive: true, force: true });\n worktreeDirExists = false;\n }\n\n // Scenario 3: If branch exists but worktree does not exist, create worktree for existing branch\n if (branchExists && !worktreeRegistered) {\n logger.info(\n `Branch ${branchName} exists. Creating worktree at ${worktreePath} using existing branch`,\n );\n await this.git.raw(['worktree', 'add', worktreePath, branchName]);\n }\n // Scenario 1: If neither exists, create new worktree with new branch\n else if (!branchExists && !worktreeRegistered) {\n logger.info(\n `Creating new worktree \"${worktreeName}\" at ${worktreePath} with new branch ${branchName}`,\n );\n await this.git.raw(['worktree', 'add', '-b', branchName, worktreePath]);\n }\n\n const info: WorktreeInfo = {\n workerId,\n worktreeName,\n worktreePath,\n branchName,\n createdAt: new Date(),\n };\n\n this.activeWorktrees.set(workerId, info);\n logger.info(`Worktree \"${worktreeName}\" ready at ${worktreePath} on branch ${branchName}`);\n\n return info;\n } catch (error) {\n logger.error(`Failed to create worktree for worker ${workerId}:`, error);\n throw new WorktreeError(\n `Failed to create worktree: ${error instanceof Error ? error.message : String(error)}`,\n workerId,\n 'create',\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Removes a worktree for the specified worker\n *\n * @param workerId - Unique identifier for the worker\n * @param force - Force removal even if there are uncommitted changes\n * @throws {WorktreeError} If worktree removal fails\n */\n async removeWorktree(workerId: string, force: boolean = false): Promise<void> {\n if (!this.enabled) {\n // Silently return if worktrees are disabled\n return;\n }\n\n logger.info(`Removing worktree for worker ${workerId}`);\n\n const info = this.activeWorktrees.get(workerId);\n if (!info) {\n logger.warn(`No active worktree found for worker ${workerId}`);\n return;\n }\n\n try {\n // Remove worktree\n const args = ['worktree', 'remove', info.worktreePath];\n if (force) {\n args.push('--force');\n }\n\n try {\n await this.git.raw(args);\n } catch (worktreeError) {\n const errorMessage =\n worktreeError instanceof Error ? worktreeError.message : String(worktreeError);\n\n // Check if worktree doesn't exist or is already removed\n if (\n errorMessage.includes('is not a working tree') ||\n errorMessage.includes('does not exist')\n ) {\n logger.warn(\n `Worktree ${info.worktreePath} doesn't exist, may have been manually removed. Cleaning up...`,\n );\n\n // Try to prune stale worktrees and manually remove directory if it exists\n await this.git.raw(['worktree', 'prune']);\n\n try {\n await fs.rm(info.worktreePath, { recursive: true, force: true });\n logger.info(`Manually removed stale worktree directory: ${info.worktreePath}`);\n } catch {\n // Directory doesn't exist, which is fine\n }\n } else {\n // Re-throw if it's a different error\n throw worktreeError;\n }\n }\n\n this.activeWorktrees.delete(workerId);\n logger.info(`Removed worktree for worker ${workerId}`);\n } catch (error) {\n logger.error(`Failed to remove worktree for worker ${workerId}:`, error);\n throw new WorktreeError(\n `Failed to remove worktree: ${error instanceof Error ? error.message : String(error)}`,\n workerId,\n 'remove',\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Gets information about a worker's worktree\n *\n * @param workerId - Unique identifier for the worker\n * @returns Worktree information or undefined if not found\n */\n getWorktreeInfo(workerId: string): WorktreeInfo | undefined {\n return this.activeWorktrees.get(workerId);\n }\n\n /**\n * Lists all active worktrees managed by this instance\n *\n * @returns Array of worktree information\n */\n listActiveWorktrees(): WorktreeInfo[] {\n return Array.from(this.activeWorktrees.values());\n }\n\n /**\n * Cleans up all active worktrees\n *\n * This method should be called during application shutdown to ensure\n * all worktrees are properly cleaned up.\n *\n * @param force - Force removal even if there are uncommitted changes\n */\n async cleanupAll(force: boolean = false): Promise<void> {\n if (!this.enabled) {\n // Silently return if worktrees are disabled\n return;\n }\n\n logger.info('Cleaning up all worktrees');\n\n const workers = Array.from(this.activeWorktrees.keys());\n const results = await Promise.allSettled(\n workers.map((workerId) => this.removeWorktree(workerId, force)),\n );\n\n const failures = results.filter((r) => r.status === 'rejected');\n if (failures.length > 0) {\n logger.error(`Failed to cleanup ${failures.length} worktrees`);\n } else {\n logger.info('Successfully cleaned up all worktrees');\n }\n }\n\n /**\n * Parses the output of 'git worktree list --porcelain'\n *\n * @param output - Raw output from git worktree list\n * @returns Array of worktree paths\n */\n private parseWorktreeList(output: string): string[] {\n const lines = output.split('\\n');\n const paths: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('worktree ')) {\n paths.push(line.substring('worktree '.length));\n }\n }\n\n return paths;\n }\n\n /**\n * Checks if the repository is in a clean state for worktree operations\n *\n * @returns True if repository is clean\n */\n async isRepositoryClean(): Promise<boolean> {\n const status = await this.git.status();\n return status.files.length === 0;\n }\n}\n", "/**\n * Logger utility for controlling console output based on environment\n *\n * Production detection:\n * 1. NODE_ENV === 'production'\n * 2. OMNARA_LOG_LEVEL === 'none' or 'error'\n * 3. Running from compiled dist/ directory (not tsx/ts-node)\n */\n\nimport path from 'path';\nimport type { InspectOptions } from 'util';\n\n/**\n * Log levels for controlling output verbosity\n */\nexport enum LogLevel {\n NONE = 0,\n ERROR = 1,\n WARN = 2,\n INFO = 3,\n DEBUG = 4,\n VERBOSE = 5,\n}\n\n/**\n * Detects if the CLI is running in production mode\n */\nexport function isProduction(): boolean {\n // Check NODE_ENV\n if (process.env.NODE_ENV === 'production') {\n return true;\n }\n\n // Check if running from dist directory (compiled)\n try {\n // Use __filename which is provided by the ESM shim in the build\n const currentFile = typeof __filename !== 'undefined' ? __filename : '';\n const isInDist = currentFile.includes(path.sep + 'dist' + path.sep);\n\n // If in dist AND no explicit development mode, assume production\n if (isInDist && process.env.NODE_ENV !== 'development') {\n return true;\n }\n } catch {\n // Fallback if URL parsing fails\n }\n\n // Check for explicit log level override\n const logLevel = process.env.OMNARA_LOG_LEVEL?.toLowerCase();\n if (logLevel === 'none' || logLevel === 'silent') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Gets the current log level from environment or defaults\n */\nexport function getLogLevel(): LogLevel {\n const envLevel = process.env.OMNARA_LOG_LEVEL?.toLowerCase();\n\n switch (envLevel) {\n case 'none':\n case 'silent':\n return LogLevel.NONE;\n case 'error':\n return LogLevel.ERROR;\n case 'warn':\n case 'warning':\n return LogLevel.WARN;\n case 'info':\n return LogLevel.INFO;\n case 'debug':\n return LogLevel.DEBUG;\n case 'verbose':\n case 'trace':\n return LogLevel.VERBOSE;\n default:\n // Default based on production mode\n return isProduction() ? LogLevel.ERROR : LogLevel.INFO;\n }\n}\n\n/**\n * Logger interface that extends Console but can be controlled\n */\nexport interface Logger extends Console {\n // Additional methods for important messages\n important(...args: unknown[]): void;\n success(...args: unknown[]): void;\n}\n\n/**\n * Creates a controlled logger instance\n */\nexport class ControlledLogger implements Logger {\n private logLevel: LogLevel;\n private forceOutput: boolean;\n private _console: Console;\n\n // Console properties we need to implement\n Console!: typeof console.Console;\n\n constructor(options?: { logLevel?: LogLevel; forceOutput?: boolean }) {\n this.logLevel = options?.logLevel ?? getLogLevel();\n this.forceOutput = options?.forceOutput ?? false;\n this._console = console;\n\n // Copy Console constructor\n this.Console = console.Console;\n }\n\n /**\n * Standard log output (INFO level)\n */\n log(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.log(...args);\n }\n }\n\n /**\n * Error output (always shown unless NONE)\n */\n error(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n console.error(...args);\n }\n }\n\n /**\n * Warning output\n */\n warn(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n console.warn(...args);\n }\n }\n\n /**\n * Info level output\n */\n info(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.info(...args);\n }\n }\n\n /**\n * Debug output (only in development)\n */\n debug(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n console.debug(...args);\n }\n }\n\n /**\n * Verbose/trace output\n */\n trace(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.VERBOSE)) {\n console.log('[TRACE]', ...args);\n }\n }\n\n /**\n * Important messages that should always be shown to user\n * (authentication status, connection info, etc.)\n */\n important(...args: unknown[]): void {\n // Always show important messages unless completely silent\n if (this.logLevel !== LogLevel.NONE || this.forceOutput) {\n console.log(...args);\n }\n }\n\n /**\n * Success messages that should typically be shown\n */\n success(...args: unknown[]): void {\n // Show success messages at WARN level and above\n if (this.shouldLog(LogLevel.WARN) || this.forceOutput) {\n console.log(...args);\n }\n }\n\n /**\n * Check if a message should be logged at the given level\n */\n private shouldLog(level: LogLevel): boolean {\n return this.forceOutput || this.logLevel >= level;\n }\n\n /**\n * Update the log level dynamically\n */\n setLogLevel(level: LogLevel): void {\n this.logLevel = level;\n }\n\n /**\n * Get current log level\n */\n getLogLevel(): LogLevel {\n return this.logLevel;\n }\n\n // Console methods we delegate or control based on log level\n assert(condition?: boolean, ...data: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n this._console.assert(condition, ...data);\n }\n }\n\n clear(): void {\n this._console.clear();\n }\n\n count(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.count(label);\n }\n }\n\n countReset(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.countReset(label);\n }\n }\n\n dir(item?: unknown, options?: InspectOptions): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.dir(item, options);\n }\n }\n\n dirxml(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.dirxml(...data);\n }\n }\n\n group(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.group(...data);\n }\n }\n\n groupCollapsed(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.groupCollapsed(...data);\n }\n }\n\n groupEnd(): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.groupEnd();\n }\n }\n\n table(tabularData?: unknown, properties?: string[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n this._console.table(tabularData, properties);\n }\n }\n\n time(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.time(label);\n }\n }\n\n timeEnd(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeEnd(label);\n }\n }\n\n timeLog(label?: string, ...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeLog(label, ...data);\n }\n }\n\n timeStamp(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeStamp(label);\n }\n }\n\n profile(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n // profile is not part of standard Console interface, check if it exists\n const consoleWithProfile = this._console as Console & { profile?: (label?: string) => void };\n consoleWithProfile.profile?.(label);\n }\n }\n\n profileEnd(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n // profileEnd is not part of standard Console interface, check if it exists\n const consoleWithProfileEnd = this._console as Console & {\n profileEnd?: (label?: string) => void;\n };\n consoleWithProfileEnd.profileEnd?.(label);\n }\n }\n}\n\n/**\n * Global logger instance\n */\nexport const logger = new ControlledLogger();\n\n/**\n * Creates a logger for a specific component\n */\nexport function createLogger(\n componentName?: string,\n options?: {\n logLevel?: LogLevel;\n forceOutput?: boolean;\n },\n): Logger {\n const baseLogger = new ControlledLogger(options);\n\n if (!componentName) {\n return baseLogger;\n }\n\n // Create a wrapper that delegates all Console methods with component prefix\n const wrappedLogger = Object.create(baseLogger) as Logger;\n\n // Override methods that should have component prefix\n wrappedLogger.log = (...args) => baseLogger.log(`[${componentName}]`, ...args);\n wrappedLogger.error = (...args) => baseLogger.error(`[${componentName}]`, ...args);\n wrappedLogger.warn = (...args) => baseLogger.warn(`[${componentName}]`, ...args);\n wrappedLogger.info = (...args) => baseLogger.info(`[${componentName}]`, ...args);\n wrappedLogger.debug = (...args) => baseLogger.debug(`[${componentName}]`, ...args);\n wrappedLogger.trace = (...args) => baseLogger.trace(`[${componentName}]`, ...args);\n // Important and success don't get prefixes\n wrappedLogger.important = (...args) => baseLogger.important(...args);\n wrappedLogger.success = (...args) => baseLogger.success(...args);\n\n return wrappedLogger;\n}\n\n/**\n * Helper to extract error messages consistently\n */\nexport function extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Print current logger configuration (useful for debugging)\n */\nexport function printLoggerConfig(): void {\n const prod = isProduction();\n const level = getLogLevel();\n const levelName = LogLevel[level];\n\n console.log('Logger Configuration:');\n console.log(` Production Mode: ${prod}`);\n console.log(` Log Level: ${levelName} (${level})`);\n console.log(` NODE_ENV: ${process.env.NODE_ENV || '(not set)'}`);\n console.log(` OMNARA_LOG_LEVEL: ${process.env.OMNARA_LOG_LEVEL || '(not set)'}`);\n}\n", "import fs from 'fs/promises';\nimport os from 'os';\nimport path from 'path';\n\nexport interface StoredCredentials {\n accessToken?: string;\n accessTokenExpiresAt?: string;\n refreshToken?: string;\n refreshTokenExpiresAt?: string;\n}\n\nexport const DEFAULT_DIR = path.join(os.homedir(), '.omnara');\nexport const DEFAULT_CREDENTIALS_PATH = path.join(DEFAULT_DIR, 'creds.json');\nconst DEFAULT_FILE_MODE = 0o600;\nconst DEFAULT_DIR_MODE = 0o700;\n\nfunction isStoredCredentials(value: unknown): value is StoredCredentials {\n return Boolean(value) && typeof value === 'object';\n}\n\nexport class CredentialsStore {\n constructor(private readonly filePath: string = DEFAULT_CREDENTIALS_PATH) {}\n\n async load(): Promise<StoredCredentials | null> {\n try {\n const raw = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (!isStoredCredentials(parsed)) {\n throw new Error('File does not contain valid credentials data');\n }\n return parsed;\n } catch (error) {\n if (isFileNotFound(error)) {\n return null;\n }\n throw new Error(\n `Failed to read credentials from ${this.filePath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n\n async save(credentials: StoredCredentials): Promise<void> {\n const payload: StoredCredentials = {\n accessToken: credentials.accessToken,\n accessTokenExpiresAt: credentials.accessTokenExpiresAt,\n refreshToken: credentials.refreshToken,\n refreshTokenExpiresAt: credentials.refreshTokenExpiresAt,\n };\n\n await fs.mkdir(path.dirname(this.filePath), { recursive: true, mode: DEFAULT_DIR_MODE });\n\n const tempPath = `${this.filePath}.tmp`;\n const serialized = JSON.stringify(payload, null, 2);\n await fs.writeFile(tempPath, serialized, { mode: DEFAULT_FILE_MODE });\n await fs.chmod(tempPath, DEFAULT_FILE_MODE);\n await fs.rename(tempPath, this.filePath);\n }\n\n async clear(): Promise<void> {\n try {\n await fs.unlink(this.filePath);\n } catch (error) {\n if (!isFileNotFound(error)) {\n throw new Error(\n `Failed to remove credentials file ${this.filePath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n }\n}\n\nfunction isFileNotFound(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === 'ENOENT',\n );\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n", "import { parse as parseJsonc, type ParseError } from 'jsonc-parser';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as z from 'zod';\n\nexport type OmnaraConfig = z.infer<typeof OmnaraConfig>;\nconst OmnaraConfig = z.object({\n worktrees: z\n .object({\n enabled: z.boolean().default(false),\n })\n .default({\n enabled: false,\n }),\n});\n\n/**\n * Read and parse the omnara.jsonc configuration file\n *\n * @param configPath - Path to the config file (defaults to omnara.jsonc in cwd)\n * @returns Parsed configuration or default config if file doesn't exist\n */\nexport async function readOmnaraConfig(configPath?: string): Promise<OmnaraConfig> {\n const resolveConfig = async (path?: string): Promise<OmnaraConfig | null> => {\n if (!path) {\n return null;\n }\n\n await fs.access(path);\n\n const content = await fs.readFile(path, 'utf-8');\n const errors: ParseError[] = [];\n const config = parseJsonc(content, errors, {\n allowTrailingComma: true,\n allowEmptyContent: true,\n });\n return OmnaraConfig.parse(config);\n };\n\n const resolveDefault = (): OmnaraConfig => {\n return OmnaraConfig.parse(undefined);\n };\n\n return (\n (await resolveConfig(configPath).catch(() => null)) ??\n (await resolveConfig(path.join(process.cwd(), 'omnara.jsonc')).catch(() => null)) ??\n (await resolveConfig(path.join(process.cwd(), 'omnara.json')).catch(() => null)) ??\n (await resolveDefault())\n );\n}\n\n/**\n * Check if worktrees are enabled in the configuration\n *\n * @param config - The omnara configuration\n * @returns true if worktrees should be enabled\n */\nexport function isWorktreesEnabled(config: OmnaraConfig): boolean {\n // Worktrees are enabled if the worktrees key exists in the config\n return config.worktrees.enabled;\n}\n", "import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nimport { z } from 'zod';\nimport type { WorkerManager } from '../worker-manager.js';\n\ntype ToolExtra = {\n sessionId?: string;\n signal: AbortSignal;\n _meta?: Record<string, unknown>;\n};\n\ninterface WorkerMcpContext {\n resolveSessionIdBySdk: (sdkSessionId?: string) => string | undefined;\n resolveSessionIdByToolUse: (toolUseId: string) => string | undefined;\n getMainCodingSessionId: () => string | null;\n}\n\nexport function createWorkerMcpServer(workerManager: WorkerManager, context: WorkerMcpContext) {\n return createSdkMcpServer({\n name: 'worker',\n version: '1.0.0',\n tools: [\n tool(\n 'launch_worker',\n `Launch a background worker agent to handle tasks autonomously in an isolated git worktree.\n\nEach worker operates in its own git worktree, providing complete isolation:\n- Separate working directory (no shared file changes)\n- Dedicated git branch\n- Independent git operations (staging, committing, etc.)\n- The worker's worktree is automatically cleaned up when the worker completes\n\nWhen to use this tool:\n- Complex tasks requiring multiple steps or operations\n- Searches and exploration of the codebase\n- Tasks that can run in parallel with other work\n- Nearly any coding task - prefer delegation over doing work directly\n\nUsage notes:\n- Launch multiple workers concurrently whenever possible for maximum performance (use multiple tool calls in a single turn)\n- Provide detailed, autonomous task descriptions including exactly what information should be returned\n- Workers have full access to: file operations (read, write, edit), search (glob, grep), bash commands, git operations, running tests, and can launch their own sub-workers\n- Worker outputs should be trusted - they have the same capabilities as you\n- The worker's result is returned to you, not the user - you must summarize or forward relevant information\n- Worker progress status is automatically included in your context - you can see their current state without additional tools`,\n {\n task: z\n .string()\n .min(1, 'task name is required')\n .describe(\n 'A short, unique name for this task (e.g., \"FizzBuzz Python\", \"Search codebase\", \"Fix bug #123\"). Used to identify and track this worker.',\n ),\n prompt: z.string().min(1, 'prompt is required'),\n worktree_name: z\n .string()\n .min(1, 'worktree_name is required')\n .describe(\n 'A short descriptive name for a worktree to create that can be used by workers simultaneously. This is synonymous with branch.',\n ),\n metadata: z.record(z.any()).optional(),\n },\n async (args, extra) => {\n const typedExtra = extra as ToolExtra | undefined;\n const toolUseIdRaw = typedExtra?._meta?.['claudecode/toolUseId'];\n const toolUseId = typeof toolUseIdRaw === 'string' ? toolUseIdRaw : undefined;\n\n // Always use the main coding session as parent for workers\n // This ensures workers are children of the main session, not voice or other sessions\n let parentSessionId = context.getMainCodingSessionId() || undefined;\n\n // Fallback to SDK resolution if main session not available (shouldn't happen)\n if (!parentSessionId) {\n const sdkSessionId = typedExtra?.sessionId;\n parentSessionId = context.resolveSessionIdBySdk(sdkSessionId);\n if (!parentSessionId && toolUseId) {\n parentSessionId = context.resolveSessionIdByToolUse(toolUseId);\n }\n console.warn(\n '[WorkerTools] Main coding session not available, falling back to SDK resolution:',\n parentSessionId,\n );\n }\n\n console.log('[WorkerTools] Launching worker:', {\n task: args.task,\n parentSessionId,\n mainCodingSession: context.getMainCodingSessionId(),\n toolUseId,\n });\n\n const record = workerManager.launchWorker(\n {\n task: args.task,\n prompt: args.prompt,\n work_context: args.worktree_name,\n worktree_name: args.worktree_name,\n originSessionId: parentSessionId,\n metadata: args.metadata,\n },\n toolUseId,\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n workerId: record.id,\n status: record.status,\n worktree_path: record.worktreePath,\n branch_name: record.branchName,\n message: `Worker launched successfully, task ${args.task} in progress. You will be notified for progress updates.`,\n }),\n },\n ],\n };\n },\n ),\n tool(\n 'message_worker',\n `Send a message to a running worker to provide additional context, requirements, or steering.\n\nUse this tool to:\n- Add new requirements or clarifications to an in-progress task\n- Provide additional context the worker might need\n- Correct or redirect the worker's current approach\n- Answer implicit questions or resolve ambiguities\n\n**When to use this tool:**\n- User provides additional requirements while a task is in progress\n- User clarifies or corrects their original request\n- User adds context that would help the running worker\n- A logically related request comes in for an existing task\n\n**When to launch a NEW worker instead:**\n- The request is for a completely different, unrelated task\n- The user explicitly requests a separate task\n- The new work would conflict with the current worker's objective\n\n**Interrupt parameter:**\n- interrupt=true: Stop current work immediately and redirect (use for critical corrections or significant changes in direction)\n- interrupt=false: Queue message for after current turn completes (use for additions, clarifications, or supplementary context)\n\n**Guidelines for interrupt:**\n- Use interrupt=true ONLY if:\n - User explicitly says to stop/interrupt current work\n - The new requirement significantly contradicts the current direction\n - The worker is heading down the wrong path and needs immediate correction\n- Use interrupt=false (default) for:\n - Adding requirements that build on current work\n - Providing helpful context or clarifications\n - Making additions that don't conflict with current progress\n\nExample 1 (queue):\nUser: \"Add authentication to my app\"\nOrchestrator: [launches worker: \"add auth\"]\nUser: \"Make sure it works with Google OAuth\"\nOrchestrator: [message_worker: task=\"add auth\", message=\"User wants Google OAuth integration\", interrupt=false]\n\nExample 2 (interrupt):\nUser: \"Refactor the database layer\"\nOrchestrator: [launches worker: \"refactor database\"]\nUser: \"Wait, actually don't touch the database - just refactor the API layer instead\"\nOrchestrator: [message_worker: task=\"refactor database\", message=\"User wants to change scope - refactor API layer instead, leave database alone\", interrupt=true]`,\n {\n task: z\n .string()\n .min(1, 'task name is required')\n .describe('The task name of the worker to message'),\n message: z\n .string()\n .min(1, 'message is required')\n .describe(\n 'The message to send to the worker. Be clear and specific about what has changed or what additional context is being provided.',\n ),\n interrupt: z\n .boolean()\n .default(false)\n .describe(\n 'If true, interrupt current generation immediately; if false (default), queue message for next turn',\n ),\n },\n async (args, extra) => {\n const typedExtra = extra as ToolExtra | undefined;\n const toolUseIdRaw = typedExtra?._meta?.['claudecode/toolUseId'];\n const toolUseId = typeof toolUseIdRaw === 'string' ? toolUseIdRaw : undefined;\n\n console.log('[WorkerTools] Messaging worker:', {\n task: args.task,\n message: args.message.substring(0, 100),\n interrupt: args.interrupt,\n toolUseId,\n });\n\n const success = await workerManager.messageWorker(\n args.task,\n args.message,\n args.interrupt,\n toolUseId,\n );\n\n if (!success) {\n const worker = workerManager.getWorkerByTask(args.task);\n if (!worker) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: false,\n error: `No worker found with task name: ${args.task}`,\n }),\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: false,\n error: `Worker \"${args.task}\" is not running (status: ${worker.status})`,\n }),\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n task: args.task,\n interrupted: args.interrupt,\n message: args.interrupt\n ? `Message sent to worker \"${args.task}\" (interrupted current work)`\n : `Message queued for worker \"${args.task}\" (will be delivered after current turn)`,\n }),\n },\n ],\n };\n },\n ),\n ],\n });\n}\n", "/**\n * System prompt for the main orchestrator agent.\n *\n * The orchestrator's role is to coordinate and delegate work, not to execute tasks directly.\n * It should ALWAYS use workers to handle all implementation work.\n */\n\nimport { readFileSync } from 'fs';\n\n// Load markdown prompt at runtime (works in tsx/tests and bundled builds)\nconst orchestratorPromptUrl = new URL('./orchestrator-prompt.md', import.meta.url);\nconst ORCHESTRATOR_SYSTEM_PROMPT = readFileSync(orchestratorPromptUrl, 'utf-8');\n\nexport { ORCHESTRATOR_SYSTEM_PROMPT };\n", "import { randomUUID } from 'crypto';\nimport EventEmitter from 'events';\nimport WebSocket from 'ws';\nimport {\n AgentOrchestrator,\n type AgentOrchestratorConnection,\n} from '../orchestrator/agent-orchestrator.js';\nimport type { OutboundMessage } from '../orchestrator/orchestrator-types.js';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport { ApiClient, normalizeBaseUrl } from '../http/api-client.js';\nimport { registerRelaySession } from './relay-service.js';\nimport { createAuthProvider, type AuthProvider } from '../auth/auth-provider.js';\nimport { createUserSession } from '../http/user-sessions.js';\nimport {\n validateControlMessage,\n validateMessageEnvelope,\n type ControlMessageSchema,\n type MessageEnvelopeSchema,\n type ControlMessage,\n type MessageEnvelope,\n} from '../schemas/index.js';\nimport { tryOpenBrowser } from '../utils/browser.js';\n\nconst MAX_QUEUE_SIZE = 500;\n\nexport interface RelayBridgeOptions {\n store?: CredentialsStore;\n logger?: Console;\n backendUrl: string;\n frontendUrl?: string;\n}\n\nexport class RelayBridge extends EventEmitter {\n private readonly orchestrator: AgentOrchestrator;\n private readonly store: CredentialsStore;\n private readonly logger: Console;\n private readonly backendUrl: string;\n private readonly frontendUrl?: string;\n private connectionHandle: AgentOrchestratorConnection | null = null;\n private ws: WebSocket | null = null;\n private stopped = false;\n private pendingOutbound: string[] = [];\n private pingTimer: NodeJS.Timeout | null = null;\n private heartbeatIntervalMs = 30_000;\n private authProviderPromise: Promise<AuthProvider> | null = null;\n private userSessionId: string | null = null;\n private currentAgentSessionId: string | null = null;\n private browserOpened = false;\n\n constructor(orchestrator: AgentOrchestrator, options: RelayBridgeOptions) {\n super();\n this.orchestrator = orchestrator;\n this.store = options.store ?? new CredentialsStore();\n this.logger = options.logger ?? console;\n this.backendUrl = normalizeBaseUrl(options.backendUrl);\n this.frontendUrl = options.frontendUrl;\n }\n\n async start(): Promise<void> {\n if (this.connectionHandle) {\n throw new Error('Relay bridge already started');\n }\n\n this.connectionHandle = this.orchestrator.addClient({\n canSend: () => this.ws?.readyState === WebSocket.OPEN,\n send: (message) => {\n this.handleOutbound(message);\n },\n });\n this.ensureAgentSessionExists();\n\n let backoffMs = 1_000;\n\n while (!this.stopped) {\n try {\n await this.establishConnection();\n backoffMs = 1_000;\n } catch (error) {\n const aborted = isAbortError(error);\n if (this.stopped || aborted) {\n if (aborted) {\n this.stopped = true;\n }\n break;\n }\n this.logger.error(\n `Relay connection failed: ${extractErrorMessage(error)}. Retrying in ${Math.round(backoffMs / 1000)}s.`,\n );\n await delay(backoffMs);\n backoffMs = Math.min(backoffMs * 2, 30_000);\n }\n }\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n this.currentAgentSessionId = null;\n this.browserOpened = false;\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n if (this.connectionHandle) {\n this.connectionHandle.disconnect();\n this.connectionHandle = null;\n }\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1000, 'CLI shutting down');\n }\n this.ws = null;\n }\n\n private async establishConnection(): Promise<void> {\n const authProvider = await this.getAuthProvider();\n const client = new ApiClient({ baseUrl: this.backendUrl });\n\n const accessToken = await authProvider.getAccessToken();\n const userSessionId = await this.ensureUserSession(client, accessToken);\n const registration = await registerRelaySession(client, accessToken, {\n userSessionId,\n clientKind: 'cli',\n });\n this.userSessionId = registration.userSessionId;\n\n const agentSessionId = this.ensureAgentSessionExists();\n\n const url = buildRelayWebsocketUrl(this.backendUrl, registration.relayWsPath);\n\n const ws = new WebSocket(url, {\n headers: {\n authorization: `Bearer ${accessToken}`,\n 'x-relay-token': registration.relayToken,\n },\n });\n\n await waitForOpen(ws);\n\n this.logger.log(\n `Connected to relay (user_session=${registration.userSessionId}, agent_session=${agentSessionId})`,\n );\n\n this.ws = ws;\n this.heartbeatIntervalMs = registration.relayHeartbeatIntervalSec * 1000;\n this.startPingTimer();\n await this.sendPrimarySessionInit(ws);\n if (this.frontendUrl && !this.browserOpened) {\n const dashboardUrl = new URL('dashboard', this.frontendUrl);\n dashboardUrl.searchParams.set('session', agentSessionId);\n tryOpenBrowser(dashboardUrl.toString());\n this.logger.log(`Opened dashboard at ${dashboardUrl.toString()}`);\n this.browserOpened = true;\n }\n this.flushQueue();\n\n await this.handleWebsocketLifecycle(ws);\n }\n\n private async getAuthProvider(): Promise<AuthProvider> {\n if (!this.authProviderPromise) {\n this.authProviderPromise = createAuthProvider({\n store: this.store,\n backendUrl: this.backendUrl,\n frontendUrl: this.frontendUrl,\n logger: this.logger,\n });\n }\n return this.authProviderPromise;\n }\n\n private ensureAgentSessionExists(): string {\n if (!this.currentAgentSessionId) {\n this.currentAgentSessionId = randomUUID();\n }\n this.orchestrator.ensureSessionExists(this.currentAgentSessionId);\n // Mark this as the main coding session\n this.orchestrator.setMainCodingSessionId(this.currentAgentSessionId);\n return this.currentAgentSessionId;\n }\n\n private async ensureUserSession(client: ApiClient, accessToken: string): Promise<string> {\n if (this.userSessionId) {\n return this.userSessionId;\n }\n const descriptor = await createUserSession(client, accessToken, {\n metadata: { source: 'cli' },\n });\n this.userSessionId = descriptor.session_id;\n this.logger.log(`Created user session ${this.userSessionId} for CLI orchestrator`);\n return this.userSessionId;\n }\n\n private async sendPrimarySessionInit(ws: WebSocket): Promise<void> {\n if (!this.userSessionId) {\n throw new Error('Cannot send session_init before user session is available.');\n }\n const agentSessionId = this.ensureAgentSessionExists();\n const initFrame: ControlMessage = {\n type: 'session_init',\n session_id: agentSessionId,\n user_session_id: this.userSessionId,\n session_type: 'CODE',\n parent_session_id: null,\n metadata: { session_type: 'CODE' }, // Include metadata for orchestrator to identify main session\n };\n this.sendFrame(initFrame, ws);\n }\n\n private sendFrame(frame: ControlMessage | MessageEnvelope, socket?: WebSocket | null): void {\n if (this.isMessageEnvelope(frame)) {\n if (!validateMessageEnvelope(frame)) {\n this.logger.error('[RelayBridge] Message envelope validation failed before sending', {\n frame: JSON.stringify(frame),\n errors: validateMessageEnvelope.errors,\n });\n return;\n }\n }\n\n const serialized = JSON.stringify(frame);\n const target = socket ?? this.ws;\n if (target && target.readyState === WebSocket.OPEN) {\n try {\n target.send(serialized);\n return;\n } catch (error) {\n this.logger.error(`Failed to send relay frame: ${extractErrorMessage(error)}`);\n if (target === this.ws) {\n this.closeCurrentSocket();\n }\n }\n }\n this.enqueue(serialized);\n }\n\n private async handleWebsocketLifecycle(ws: WebSocket): Promise<void> {\n await new Promise<void>((resolve) => {\n const onMessage = (data: WebSocket.RawData) => {\n this.handleInbound(data);\n };\n\n const onClose = (code: number, reason: Buffer) => {\n this.logger.warn(\n `Relay websocket closed (code ${code}${reason.length ? `, reason: ${reason.toString()}` : ''})`,\n );\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (!this.stopped) {\n this.logger.error(`Relay websocket error: ${error.message}`);\n }\n };\n\n const cleanup = () => {\n ws.removeListener('message', onMessage);\n ws.removeListener('close', onClose);\n ws.removeListener('error', onError);\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n if (this.ws === ws) {\n this.ws = null;\n }\n };\n\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n\n if (this.stopped) {\n cleanup();\n resolve();\n }\n });\n }\n\n private handleOutbound(message: OutboundMessage): void {\n const frame = this.toRelayFrame(message);\n if (!frame) {\n return;\n }\n this.sendFrame(frame);\n }\n\n private handleInbound(data: WebSocket.RawData): void {\n let parsed: unknown;\n try {\n const text = typeof data === 'string' ? data : data.toString('utf8');\n parsed = JSON.parse(text);\n } catch (error) {\n this.logger.error(`Received invalid JSON from relay: ${extractErrorMessage(error)}`);\n return;\n }\n\n if (this.tryHandleControlMessage(parsed)) {\n return;\n }\n\n if (this.tryHandleMessageEnvelope(parsed)) {\n return;\n }\n\n this.logger.error('Received invalid relay message payload.', { payload: parsed });\n }\n\n private toRelayFrame(message: OutboundMessage): ControlMessage | MessageEnvelope | null {\n switch (message.type) {\n case 'session_init': {\n if (!this.userSessionId) {\n this.logger.warn('Dropping session_init frame: user session is not initialised yet.');\n return null;\n }\n const frame: ControlMessage = {\n type: 'session_init',\n session_id: message.sessionId,\n user_session_id: this.userSessionId,\n session_type: 'CODE',\n parent_session_id: message.parentSessionId ?? null,\n };\n if (message.metadata) {\n frame.metadata = message.metadata;\n }\n return frame;\n }\n case 'user_text':\n return this.buildUserTextEnvelope(message);\n case 'assistant_text':\n return this.buildTextEnvelope(message);\n case 'tool_call':\n return this.buildToolCallEnvelope(message);\n case 'tool_result':\n return this.buildToolResultEnvelope(message);\n case 'agent_complete':\n return this.buildAgentCompleteEnvelope(message);\n case 'agent_progress':\n return this.buildProgressEnvelope(message);\n default:\n return null;\n }\n }\n\n private tryHandleControlMessage(payload: unknown): boolean {\n if (!validateControlMessage(payload)) {\n return false;\n }\n const control = payload as ControlMessage;\n const type = control.type;\n switch (type) {\n case 'session_bootstrap':\n this.handleSessionBootstrap(control as ControlMessageSchema.SessionBootstrap);\n break;\n case 'session_init_ack':\n this.handleSessionInitAck(control as ControlMessageSchema.SessionInitAck);\n break;\n case 'session_announce':\n this.handleSessionAnnounce(control as ControlMessageSchema.SessionAnnounce);\n break;\n case 'session_closed':\n this.logger.info(\n `Session closed: ${(control as ControlMessageSchema.SessionClosed).session_id} -> status ${(control as ControlMessageSchema.SessionClosed).status}`,\n );\n break;\n case 'heartbeat':\n if ((control as ControlMessageSchema.Heartbeat).mode === 'ping') {\n const response: ControlMessage = {\n type: 'heartbeat',\n mode: 'pong',\n sent_at: new Date().toISOString(),\n };\n this.sendFrame(response);\n }\n break;\n default:\n this.logger.debug(`Ignoring control message ${type ?? 'unknown'}`);\n }\n return true;\n }\n\n private tryHandleMessageEnvelope(payload: unknown): boolean {\n if (!validateMessageEnvelope(payload)) {\n return false;\n }\n const envelope = payload as MessageEnvelope;\n this.handleMessageEnvelope(envelope);\n return true;\n }\n\n private handleSessionBootstrap(control: ControlMessageSchema.SessionBootstrap): void {\n const userSessionId = control.root.session_id;\n if (!this.userSessionId) {\n this.userSessionId = userSessionId;\n }\n if (this.userSessionId !== userSessionId) {\n this.logger.warn(\n `Bootstrap user session mismatch (expected ${this.userSessionId}, got ${userSessionId})`,\n );\n }\n\n // Track voice sessions from bootstrap FIRST before ensuring they exist\n for (const agent of control.agent_sessions ?? []) {\n if (agent.session_type === 'VOICE') {\n this.orchestrator.voiceSessionIds.add(agent.session_id);\n console.log('[RelayBridge] Tracking voice session from bootstrap:', {\n sessionId: agent.session_id,\n sessionType: agent.session_type,\n parentSessionId: agent.parent_session_id,\n });\n }\n }\n\n // Then ensure sessions exist\n for (const agent of control.agent_sessions ?? []) {\n this.orchestrator.ensureSessionExists(agent.session_id);\n }\n }\n\n private handleSessionInitAck(control: ControlMessageSchema.SessionInitAck): void {\n const sessionId = control.session_id;\n // Only track the main agent session (not worker child sessions)\n // Workers have a parent_session_id, main sessions don't\n const isMainSession = !control.parent_session_id;\n\n if (isMainSession) {\n if (!this.currentAgentSessionId) {\n this.currentAgentSessionId = sessionId;\n } else if (this.currentAgentSessionId !== sessionId) {\n this.logger.warn(\n `Session init ack for unexpected main session: ${sessionId} (current=${this.currentAgentSessionId})`,\n );\n }\n } else {\n // This is a worker session, log it but don't update currentAgentSessionId\n this.logger.debug(\n `Worker session init ack: ${sessionId} (parent=${control.parent_session_id})`,\n );\n }\n }\n\n private handleSessionAnnounce(control: ControlMessageSchema.SessionAnnounce): void {\n if (control.session.kind === 'agent_session') {\n // Track voice sessions from announcements FIRST\n if (control.session.session_type === 'VOICE') {\n this.orchestrator.voiceSessionIds.add(control.session.session_id);\n console.log('[RelayBridge] Tracking voice session from announce:', {\n sessionId: control.session.session_id,\n sessionType: control.session.session_type,\n });\n }\n\n this.orchestrator.ensureSessionExists(control.session.session_id);\n }\n }\n\n private handleMessageEnvelope(envelope: MessageEnvelope): void {\n const content = envelope.payload.content;\n const isUserMessage = envelope.sender.kind === 'user';\n const isAgentUserMessage =\n envelope.sender.kind === 'agent_session' && envelope.metadata?.role === 'user';\n\n // Filter out voice transcript messages - they're just for logging, not for orchestrator\n const isVoiceTranscript =\n envelope.payload.metadata?.subtype === 'user_voice_transcript' ||\n envelope.payload.metadata?.subtype === 'agent_voice_transcript';\n\n // Accept messages from users OR from agent sessions acting as users (like voice agent)\n // BUT exclude voice transcripts\n if (\n this.isTextContent(content) &&\n (isUserMessage || isAgentUserMessage) &&\n !isVoiceTranscript\n ) {\n // Check if this is a message TO a voice session\n const isToVoiceSession = this.orchestrator.voiceSessionIds.has(envelope.session_id);\n\n if (isToVoiceSession) {\n this.logger.info(\n `Filtering out message to voice session ${envelope.session_id} from ${envelope.sender.kind} (id: ${envelope.sender.id})`,\n );\n return;\n }\n\n this.logger.info(\n `Processing message from ${envelope.sender.kind} (id: ${envelope.sender.id}, role: ${envelope.metadata?.role}) to session ${envelope.session_id}`,\n );\n\n // Include sender information so orchestrator knows who sent the message\n this.connectionHandle?.dispatch({\n type: 'chat',\n sessionId: envelope.session_id,\n text: content.text,\n senderId: envelope.sender.id,\n senderKind: envelope.sender.kind,\n });\n return;\n }\n const label = (content as { type?: string }).type ?? 'unknown';\n const subtype = envelope.payload.metadata?.subtype;\n this.logger.debug(\n `Ignoring inbound envelope from ${envelope.sender.kind} with content type ${label}, role ${envelope.metadata?.role}${subtype ? `, subtype: ${subtype}` : ''}`,\n );\n }\n\n private isTextContent(\n content: MessageEnvelopeSchema.Content,\n ): content is MessageEnvelopeSchema.TextContent {\n return typeof (content as MessageEnvelopeSchema.TextContent).text === 'string';\n }\n\n private buildUserTextEnvelope(\n message: Extract<OutboundMessage, { type: 'user_text' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.TextContent = {\n type: 'text',\n text: message.text,\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n // Sender is the worker if workerId is present, otherwise the session itself\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for user messages\n envelope.metadata = {\n ...envelope.metadata,\n role: 'user',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private buildTextEnvelope(\n message: Extract<OutboundMessage, { type: 'assistant_text' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.TextContent = {\n type: 'text',\n text: message.text,\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n // Sender is the worker if workerId is present, otherwise the session itself\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for assistant messages\n envelope.metadata = {\n ...envelope.metadata,\n role: 'assistant',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private buildToolCallEnvelope(\n message: Extract<OutboundMessage, { type: 'tool_call' }>,\n ): MessageEnvelope {\n const args: Record<string, unknown> = this.normalizeToolArguments(message.input);\n const content: MessageEnvelopeSchema.ToolCallContent = {\n type: 'tool_call',\n name: message.toolName,\n tool_use_id: message.toolUseId,\n arguments: args,\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for assistant tool calls\n envelope.metadata = {\n ...envelope.metadata,\n role: 'assistant',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private normalizeToolArguments(input: unknown): Record<string, unknown> {\n if (input && typeof input === 'object' && !Array.isArray(input)) {\n return input as Record<string, unknown>;\n }\n return { value: input };\n }\n\n private buildToolResultEnvelope(\n message: Extract<OutboundMessage, { type: 'tool_result' }>,\n ): MessageEnvelope {\n const output: Record<string, unknown> =\n typeof message.content === 'object' && message.content !== null\n ? (message.content as Record<string, unknown>)\n : { value: message.content };\n const content: MessageEnvelopeSchema.ToolResultContent = {\n type: 'tool_result',\n tool_use_id: message.toolUseId,\n output,\n is_error: Boolean(message.isError),\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for assistant tool results\n envelope.metadata = {\n ...envelope.metadata,\n role: 'assistant',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private buildAgentCompleteEnvelope(\n message: Extract<OutboundMessage, { type: 'agent_complete' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.AgentCompleteContent = {\n type: 'agent_complete',\n success: message.success,\n duration_ms: message.durationMs ?? null,\n cost_usd: message.costUsd ?? null,\n message: message.message ?? null,\n };\n if (message.metadata) {\n content.metadata = message.metadata;\n }\n\n const metadataAgent =\n typeof message.metadata?.agent_session_id === 'string'\n ? (message.metadata.agent_session_id as string)\n : undefined;\n const senderSessionId = metadataAgent ?? this.currentAgentSessionId ?? message.sessionId;\n return this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n messageId: message.messageId,\n });\n }\n\n private buildProgressEnvelope(\n message: Extract<OutboundMessage, { type: 'agent_progress' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.AgentProgressContent = {\n type: 'agent_progress',\n status: message.status,\n };\n if (message.detail) {\n content.detail = message.detail;\n }\n if (message.metadata) {\n content.metadata = message.metadata;\n }\n\n const metadataAgent =\n typeof message.metadata?.agent_session_id === 'string'\n ? (message.metadata.agent_session_id as string)\n : undefined;\n const sessionId =\n message.sessionId ?? this.currentAgentSessionId ?? this.ensureAgentSessionExists();\n const senderSessionId = metadataAgent ?? this.currentAgentSessionId ?? sessionId;\n\n return this.buildEnvelope({\n sessionId,\n senderSessionId,\n content,\n messageId: message.messageId,\n });\n }\n\n private buildEnvelope(options: {\n sessionId: string;\n senderSessionId?: string;\n content: MessageEnvelopeSchema.Content;\n payloadMetadata?: Record<string, unknown>;\n messageId?: string;\n }): MessageEnvelope {\n const payload: MessageEnvelopeSchema.MessagePayload = {\n version: 0,\n content: options.content,\n };\n if (options.payloadMetadata && Object.keys(options.payloadMetadata).length > 0) {\n payload.metadata = options.payloadMetadata;\n }\n\n const sender: MessageEnvelopeSchema.SenderRef = {\n kind: 'agent_session',\n id: options.senderSessionId ?? options.sessionId,\n };\n\n const envelope: MessageEnvelope = {\n message_id: options.messageId ?? randomUUID(),\n session_id: options.sessionId,\n sender,\n payload,\n created_at: new Date().toISOString(),\n };\n\n return envelope;\n }\n\n private isMessageEnvelope(frame: ControlMessage | MessageEnvelope): frame is MessageEnvelope {\n return (frame as MessageEnvelope).payload !== undefined;\n }\n\n private enqueue(serialized: string): void {\n if (this.pendingOutbound.length >= MAX_QUEUE_SIZE) {\n this.pendingOutbound.shift();\n }\n this.pendingOutbound.push(serialized);\n }\n\n private flushQueue(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n while (this.pendingOutbound.length > 0) {\n const payload = this.pendingOutbound.shift();\n if (!payload) {\n continue;\n }\n try {\n this.ws.send(payload);\n } catch (error) {\n this.logger.error(`Failed to flush relay queue: ${extractErrorMessage(error)}`);\n this.pendingOutbound.unshift(payload);\n this.closeCurrentSocket();\n break;\n }\n }\n }\n\n private startPingTimer(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n }\n const interval = Math.max(this.heartbeatIntervalMs, 5_000);\n this.pingTimer = setInterval(() => {\n const socket = this.ws;\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n const frame: ControlMessage = {\n type: 'heartbeat',\n mode: 'ping',\n sent_at: new Date().toISOString(),\n };\n this.sendFrame(frame, socket);\n }, interval);\n }\n\n private closeCurrentSocket(): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1012, 'Reconnecting');\n }\n }\n}\n\nfunction buildRelayWebsocketUrl(baseUrl: string, path: string): string {\n const url = new URL(baseUrl);\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n url.search = '';\n url.hash = '';\n if (path.startsWith('/')) {\n url.pathname = path;\n } else {\n const basePath = url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`;\n url.pathname = `${basePath}${path}`;\n }\n return url.toString();\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction isAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const name = error.name?.toLowerCase();\n if (name === 'aborterror') {\n return true;\n }\n const message = error.message ? error.message.toLowerCase() : '';\n return message.includes('aborted with ctrl+c');\n}\n\nfunction waitForOpen(ws: WebSocket): Promise<void> {\n return new Promise((resolve, reject) => {\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n const cleanup = () => {\n ws.removeListener('open', onOpen);\n ws.removeListener('error', onError);\n };\n\n ws.once('open', onOpen);\n ws.once('error', onError);\n });\n}\n", "export class ApiError extends Error {\n readonly status: number;\n readonly details: unknown;\n\n constructor(status: number, message: string, details?: unknown) {\n super(message);\n this.status = status;\n this.details = details;\n }\n}\n\nexport interface RequestOptions {\n headers?: Record<string, string>;\n accessToken?: string;\n apiKey?: string;\n signal?: AbortSignal;\n}\n\nexport interface ApiClientOptions {\n baseUrl: string;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n\n constructor(options: ApiClientOptions) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl);\n }\n\n async getJson<TResponse>(path: string, options?: RequestOptions): Promise<TResponse> {\n const url = resolveUrl(this.baseUrl, path);\n const headers = this.buildHeaders(options);\n\n const response = await fetch(url, {\n method: 'GET',\n headers,\n signal: options?.signal,\n });\n\n return await this.handleResponse<TResponse>(response);\n }\n\n async postJson<TRequest, TResponse>(\n path: string,\n body: TRequest,\n options?: RequestOptions,\n ): Promise<TResponse> {\n const url = resolveUrl(this.baseUrl, path);\n const headers = this.buildHeaders(options, { includeJson: true });\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body ?? {}),\n signal: options?.signal,\n });\n\n return await this.handleResponse<TResponse>(response);\n }\n\n private buildHeaders(options?: RequestOptions, extras?: { includeJson?: boolean }): Headers {\n const headers = new Headers();\n if (extras?.includeJson) {\n headers.set('content-type', 'application/json');\n }\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n headers.set(key, value);\n }\n }\n if (options?.accessToken) {\n headers.set('authorization', `Bearer ${options.accessToken}`);\n } else if (options?.apiKey) {\n headers.set('authorization', `Bearer ${options.apiKey}`);\n }\n return headers;\n }\n\n private async handleResponse<TResponse>(response: Response): Promise<TResponse> {\n const contentType = response.headers.get('content-type');\n const isJson = contentType?.includes('application/json');\n\n let payload: unknown = undefined;\n if (isJson) {\n try {\n payload = await response.json();\n } catch (error) {\n if (response.ok) {\n throw new ApiError(\n response.status,\n `Failed to parse JSON response: ${extractErrorMessage(error)}`,\n );\n }\n }\n } else if (response.ok) {\n payload = await response.text();\n }\n\n if (!response.ok) {\n const detail = extractDetail(payload);\n throw new ApiError(response.status, detail ?? `HTTP ${response.status}`, payload);\n }\n\n return payload as TResponse;\n }\n}\n\nexport function normalizeBaseUrl(raw: string): string {\n if (!raw) {\n throw new Error('Backend URL cannot be empty.');\n }\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n\nexport function resolveUrl(base: string, path: string): string {\n const baseUrl = new URL(base);\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n const resolved = new URL(path, baseUrl);\n return resolved.toString();\n}\n\nfunction extractDetail(payload: unknown): string | null {\n if (!payload) {\n return null;\n }\n if (typeof payload === 'string') {\n return payload;\n }\n if (typeof payload === 'object' && payload !== null) {\n const record = payload as Record<string, unknown>;\n const detail = record.detail;\n if (typeof detail === 'string') {\n return detail;\n }\n const message = record.message;\n if (typeof message === 'string') {\n return message;\n }\n }\n return null;\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n", "import { ApiClient } from '../http/api-client.js';\n\nexport type RelayClientKind = 'cli' | 'web' | 'mobile' | 'voice';\n\ninterface RelayRegisterRequestWire {\n user_session_id: string;\n client_kind?: RelayClientKind | null;\n}\n\ninterface RelayRegisterResponseWire {\n user_session_id: string;\n relay_token: string;\n relay_token_expires_in: number;\n relay_ws_path: string;\n relay_heartbeat_interval_sec: number;\n}\n\ninterface RelayRefreshRequestWire {\n relay_token: string;\n}\n\ninterface RelayRefreshResponseWire {\n relay_token: string;\n relay_token_expires_in: number;\n}\n\nexport interface RelayRegistration {\n userSessionId: string;\n relayToken: string;\n relayTokenExpiresIn: number;\n relayWsPath: string;\n relayHeartbeatIntervalSec: number;\n}\n\nexport interface RelayTokenRefresh {\n relayToken: string;\n relayTokenExpiresIn: number;\n}\n\nexport interface RegisterRelayOptions {\n userSessionId: string;\n clientKind?: RelayClientKind;\n}\n\nexport async function registerRelaySession(\n client: ApiClient,\n accessToken: string,\n options: RegisterRelayOptions,\n): Promise<RelayRegistration> {\n const body: RelayRegisterRequestWire = {\n user_session_id: options.userSessionId,\n client_kind: options.clientKind ?? 'cli',\n };\n\n const response = await client.postJson<RelayRegisterRequestWire, RelayRegisterResponseWire>(\n '/api/v1/relay/register',\n body,\n { accessToken },\n );\n\n return {\n userSessionId: response.user_session_id,\n relayToken: response.relay_token,\n relayTokenExpiresIn: response.relay_token_expires_in,\n relayWsPath: response.relay_ws_path,\n relayHeartbeatIntervalSec: response.relay_heartbeat_interval_sec,\n };\n}\n\nexport async function refreshRelayToken(\n client: ApiClient,\n accessToken: string,\n relayToken: string,\n): Promise<RelayTokenRefresh> {\n const response = await client.postJson<RelayRefreshRequestWire, RelayRefreshResponseWire>(\n '/api/v1/relay/refresh',\n { relay_token: relayToken },\n { accessToken },\n );\n\n return {\n relayToken: response.relay_token,\n relayTokenExpiresIn: response.relay_token_expires_in,\n };\n}\n", "import { createClient, type SupabaseClient } from '@supabase/supabase-js';\n\nimport type { SupabaseAuthConfig } from './supabase-config.js';\n\nexport function buildSupabaseClient(config: SupabaseAuthConfig): SupabaseClient {\n return createClient(config.url, config.anonKey, {\n auth: {\n persistSession: false,\n detectSessionInUrl: false,\n },\n });\n}\n", "import { ApiClient } from '../http/api-client.js';\n\nexport interface SupabaseAuthConfig {\n url: string;\n anonKey: string;\n}\n\ninterface AuthConfigResponseWire {\n supabase_url: string;\n supabase_anon_key: string;\n}\n\nconst CACHE = new Map<string, SupabaseAuthConfig>();\n\nexport async function getSupabaseAuthConfig(baseUrl: string): Promise<SupabaseAuthConfig> {\n const normalized = normalizeBaseUrl(baseUrl);\n const cached = CACHE.get(normalized);\n if (cached) {\n return cached;\n }\n\n const client = new ApiClient({ baseUrl: normalized });\n const response = await client.getJson<AuthConfigResponseWire>('/api/v1/auth/config');\n const config: SupabaseAuthConfig = {\n url: response.supabase_url,\n anonKey: response.supabase_anon_key,\n };\n CACHE.set(normalized, config);\n return config;\n}\n\nfunction normalizeBaseUrl(raw: string): string {\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n", "import type { Session } from '@supabase/supabase-js';\n\nimport { CredentialsStore, type StoredCredentials } from './credentials-store.js';\nimport { buildSupabaseClient } from './supabase-client.js';\nimport { getSupabaseAuthConfig } from './supabase-config.js';\n\nconst EXPIRY_BUFFER_MS = 60_000; // refresh tokens one minute before expiry\n\nexport interface AuthContext {\n credentials: StoredCredentials;\n accessToken: string;\n}\n\nexport async function ensureAuthContext(\n store: CredentialsStore,\n backendUrl: string,\n): Promise<AuthContext> {\n const credentials = await store.load();\n if (!credentials) {\n throw new Error('No credentials found. Run `omnara auth login` first.');\n }\n\n if (!credentials.refreshToken) {\n throw new Error('Refresh token unavailable. Please run `omnara auth login`.');\n }\n\n if (!credentials.accessToken) {\n return await refreshWithStoredToken(store, credentials, backendUrl, 'No access token stored.');\n }\n\n if (!isExpiring(credentials.accessTokenExpiresAt, EXPIRY_BUFFER_MS)) {\n return { credentials, accessToken: credentials.accessToken };\n }\n\n return await refreshWithStoredToken(store, credentials, backendUrl, 'Access token expired.');\n}\n\nasync function refreshWithStoredToken(\n store: CredentialsStore,\n credentials: StoredCredentials,\n backendUrl: string,\n reason: string,\n): Promise<AuthContext> {\n const refreshToken = credentials.refreshToken;\n if (!refreshToken) {\n throw new Error(`${reason} Refresh token unavailable. Please run \\`omnara auth login\\`.`);\n }\n\n if (credentials.refreshTokenExpiresAt && isExpiring(credentials.refreshTokenExpiresAt, 0)) {\n throw new Error('Refresh token expired. Please run `omnara auth login`.');\n }\n\n const supabaseConfig = await getSupabaseAuthConfig(backendUrl);\n const supabase = buildSupabaseClient(supabaseConfig);\n const { data, error } = await supabase.auth.refreshSession({ refresh_token: refreshToken });\n if (error || !data?.session) {\n throw new Error(\n `${reason} Failed to refresh Supabase session: ${error?.message ?? 'unknown error'}.`,\n );\n }\n\n const updated = applySession(credentials, data.session);\n\n await store.save(updated);\n if (!updated.accessToken) {\n throw new Error('Supabase refresh completed without an access token.');\n }\n return { credentials: updated, accessToken: updated.accessToken };\n}\n\nfunction isExpiring(expiresAtIso: string | undefined, bufferMs: number): boolean {\n if (!expiresAtIso) {\n return true;\n }\n const timestamp = Date.parse(expiresAtIso);\n if (Number.isNaN(timestamp)) {\n return true;\n }\n return timestamp - bufferMs <= Date.now();\n}\n\nfunction applySession(credentials: StoredCredentials, session: Session): StoredCredentials {\n const expiresAt = deriveAccessExpiry(session);\n\n return {\n ...credentials,\n accessToken: session.access_token,\n accessTokenExpiresAt: expiresAt,\n refreshToken: session.refresh_token ?? credentials.refreshToken,\n refreshTokenExpiresAt: credentials.refreshTokenExpiresAt,\n };\n}\n\nfunction deriveAccessExpiry(session: Session): string | undefined {\n if (session.expires_at) {\n return new Date(session.expires_at * 1000).toISOString();\n }\n if (session.expires_in) {\n return new Date(Date.now() + session.expires_in * 1000).toISOString();\n }\n return undefined;\n}\n", "import readline from 'readline/promises';\nimport { stdin as input, stdout as output } from 'process';\n\nexport async function prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input, output });\n try {\n const answer = await rl.question(question);\n return answer.trim();\n } finally {\n rl.close();\n }\n}\n", "import { ApiClient } from '../http/api-client.js';\n\ninterface CreateSessionRequestWire {\n frontend_url?: string | null;\n loopback_redirect_uri?: string | null;\n loopback_state?: string | null;\n pkce_challenge?: string | null;\n pkce_challenge_method?: string | null;\n}\n\ninterface CreateSessionResponseWire {\n session_id: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n poll_interval: number;\n}\n\ninterface ExchangeRequestWire {\n session_id: string;\n code: string;\n code_verifier?: string | null;\n}\n\ninterface ExchangeResponseWire {\n access_token: string;\n access_token_expires_in: number;\n refresh_token: string;\n refresh_token_expires_in: number;\n relay_ws_path: string;\n relay_heartbeat_interval_sec: number;\n}\n\nexport interface CliAuthSession {\n sessionId: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n pollInterval: number;\n}\n\nexport interface CreateCliAuthSessionOptions {\n frontendUrl?: string;\n loopbackRedirectUri?: string;\n loopbackState?: string;\n pkceChallenge?: string;\n pkceChallengeMethod?: string;\n}\n\nexport interface ExchangeCliCodeResult {\n accessToken: string;\n accessTokenExpiresIn: number;\n refreshToken: string;\n refreshTokenExpiresIn: number;\n relayWsPath: string;\n relayHeartbeatIntervalSec: number;\n}\n\nexport async function createCliAuthSession(\n client: ApiClient,\n options: CreateCliAuthSessionOptions = {},\n): Promise<CliAuthSession> {\n const body: CreateSessionRequestWire = {};\n if (options.frontendUrl) {\n body.frontend_url = options.frontendUrl;\n }\n if (options.loopbackRedirectUri) {\n body.loopback_redirect_uri = options.loopbackRedirectUri;\n }\n if (options.loopbackState) {\n body.loopback_state = options.loopbackState;\n }\n if (options.pkceChallenge) {\n body.pkce_challenge = options.pkceChallenge;\n body.pkce_challenge_method = options.pkceChallengeMethod ?? 'S256';\n }\n const wire = await client.postJson<CreateSessionRequestWire, CreateSessionResponseWire>(\n '/api/v1/cli-auth/session',\n body,\n );\n return {\n sessionId: wire.session_id,\n verificationUri: wire.verification_uri,\n verificationUriComplete: wire.verification_uri_complete,\n expiresIn: wire.expires_in,\n pollInterval: wire.poll_interval,\n };\n}\n\nexport async function exchangeCliCode(\n client: ApiClient,\n sessionId: string,\n code: string,\n options: { codeVerifier?: string } = {},\n): Promise<ExchangeCliCodeResult> {\n const requestBody: ExchangeRequestWire = {\n session_id: sessionId,\n code,\n };\n if (options.codeVerifier) {\n requestBody.code_verifier = options.codeVerifier;\n }\n\n const wire = await client.postJson<ExchangeRequestWire, ExchangeResponseWire>(\n '/api/v1/cli-auth/exchange',\n requestBody,\n );\n return {\n accessToken: wire.access_token,\n accessTokenExpiresIn: wire.access_token_expires_in,\n refreshToken: wire.refresh_token,\n refreshTokenExpiresIn: wire.refresh_token_expires_in,\n relayWsPath: wire.relay_ws_path,\n relayHeartbeatIntervalSec: wire.relay_heartbeat_interval_sec,\n };\n}\n", "import { createHash, randomBytes } from 'crypto';\n\nexport interface PkcePair {\n verifier: string;\n challenge: string;\n method: 'S256';\n}\n\nexport function generatePkcePair(): PkcePair {\n const verifier = base64UrlEncode(randomBytes(32));\n const challenge = base64UrlEncode(createHash('sha256').update(verifier).digest());\n return { verifier, challenge, method: 'S256' };\n}\n\nfunction base64UrlEncode(input: Buffer | Uint8Array | string): string {\n const buffer =\n typeof input === 'string'\n ? Buffer.from(input, 'utf8')\n : Buffer.from(input as Buffer | Uint8Array);\n return buffer.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n", "import http from 'http';\nimport type { AddressInfo } from 'net';\nimport { randomBytes } from 'crypto';\n\nexport interface LoopbackCallback {\n code: string;\n sessionId: string | null;\n state: string | null;\n}\n\nconst CALLBACK_PATH = '/callback';\nconst LISTEN_HOST = '127.0.0.1';\n\nexport class LoopbackListener {\n static async create(): Promise<LoopbackListener | null> {\n const listener = new LoopbackListener(generateState());\n try {\n await listener.start();\n return listener;\n } catch {\n await listener.stop().catch(() => undefined);\n return null;\n }\n }\n\n readonly state: string;\n redirectUri: string;\n\n private readonly server: http.Server;\n private resolveCallback: ((value: LoopbackCallback) => void) | null = null;\n private rejectCallback: ((reason?: unknown) => void) | null = null;\n private pending: Promise<LoopbackCallback> | null = null;\n\n private constructor(state: string) {\n this.state = state;\n this.redirectUri = '';\n this.server = http.createServer((request, response) => {\n void this.handleRequest(request, response);\n });\n }\n\n async waitForCallback(): Promise<LoopbackCallback> {\n if (this.pending) {\n return this.pending;\n }\n this.pending = new Promise<LoopbackCallback>((resolve, reject) => {\n this.resolveCallback = resolve;\n this.rejectCallback = reject;\n });\n return this.pending;\n }\n\n async stop(): Promise<void> {\n if (!this.server.listening) {\n return;\n }\n await new Promise<void>((resolve) => {\n this.server.close(() => resolve());\n });\n }\n\n private async start(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.server.once('error', reject);\n this.server.listen(0, LISTEN_HOST, () => {\n this.server.removeListener('error', reject);\n resolve();\n });\n });\n\n const address = this.server.address();\n if (!address || typeof address === 'string') {\n throw new Error('Loopback listener failed to bind');\n }\n const { port } = address as AddressInfo;\n this.redirectUri = `http://${LISTEN_HOST}:${port}${CALLBACK_PATH}`;\n }\n\n private async handleRequest(\n request: http.IncomingMessage,\n response: http.ServerResponse,\n ): Promise<void> {\n if (request.method !== 'GET' || !request.url) {\n this.respond(response, 405, 'Method Not Allowed');\n return;\n }\n\n const url = new URL(request.url, `http://${request.headers.host ?? LISTEN_HOST}`);\n if (url.pathname !== CALLBACK_PATH) {\n this.respond(response, 404, 'Not Found');\n return;\n }\n\n const code = url.searchParams.get('code');\n const sessionId = url.searchParams.get('session');\n const state = url.searchParams.get('state');\n\n if (!code) {\n this.respond(\n response,\n 400,\n buildMessageHtml('Missing authorization code. Return to your CLI and try again.'),\n );\n return;\n }\n\n this.respond(response, 200, buildSuccessHtml());\n\n if (this.resolveCallback) {\n this.resolveCallback({ code, sessionId, state });\n this.resolveCallback = null;\n this.rejectCallback = null;\n }\n\n void this.stop();\n }\n\n private respond(response: http.ServerResponse, status: number, body: string): void {\n response.writeHead(status, {\n 'content-type': 'text/html; charset=utf-8',\n 'cache-control': 'no-store',\n });\n response.end(body);\n }\n}\n\nfunction buildSuccessHtml(): string {\n const redirectTarget = 'https://www.omnara.com/dashboard';\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <meta http-equiv=\"refresh\" content=\"3;url=${redirectTarget}\" />\n <title>Omnara CLI Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #090909; color: #f4f4f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }\n .card { max-width: 420px; padding: 2.5rem; background: rgba(32, 32, 36, 0.85); border-radius: 14px; box-shadow: 0 20px 40px rgba(0,0,0,0.35); text-align: center; }\n h1 { font-size: 1.5rem; margin-bottom: 0.75rem; }\n p { margin: 0 0 0.75rem; line-height: 1.5; }\n .note { font-size: 0.85rem; color: rgba(244,244,245,0.7); }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <h1>Redirecting back to the CLI\u2026</h1>\n <p>Your authentication details were sent to the Omnara CLI. Return to your terminal to continue.</p>\n <p class=\"note\">If this page doesn't close automatically, you can manually open the Omnara dashboard.</p>\n </div>\n </body>\n</html>`;\n}\n\nfunction generateState(): string {\n return base64UrlEncode(randomBytes(32));\n}\n\nfunction base64UrlEncode(input: Buffer | Uint8Array | string): string {\n const buffer =\n typeof input === 'string'\n ? Buffer.from(input, 'utf8')\n : Buffer.from(input as Buffer | Uint8Array);\n return buffer.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\nfunction buildMessageHtml(message: string): string {\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <title>Omnara CLI Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #090909; color: #f4f4f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }\n .card { max-width: 420px; padding: 2.5rem; background: rgba(32, 32, 36, 0.85); border-radius: 14px; box-shadow: 0 20px 40px rgba(0,0,0,0.35); text-align: center; }\n h1 { font-size: 1.4rem; margin-bottom: 0.75rem; }\n p { margin: 0; line-height: 1.6; }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <h1>Omnara CLI Login</h1>\n <p>${message}</p>\n </div>\n </body>\n</html>`;\n}\n", "import { spawn } from 'child_process';\n\nexport function tryOpenBrowser(url: string): void {\n const command =\n process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';\n\n const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];\n\n try {\n const child = spawn(command, args, { stdio: 'ignore', detached: true });\n child.unref();\n } catch {\n // Ignore failures; user can open manually.\n }\n}\n", "import { ApiClient, ApiError, normalizeBaseUrl } from '../http/api-client.js';\nimport { CredentialsStore, type StoredCredentials } from './credentials-store.js';\nimport { prompt } from '../utils/prompt.js';\nimport {\n createCliAuthSession,\n exchangeCliCode,\n type CliAuthSession,\n type CreateCliAuthSessionOptions,\n type ExchangeCliCodeResult,\n} from './cli-auth-service.js';\nimport { generatePkcePair } from './pkce.js';\nimport { LoopbackListener } from './loopback-listener.js';\nimport { tryOpenBrowser } from '../utils/browser.js';\n\ninterface LoginOptions {\n backendUrlOption?: string;\n frontendUrlOption?: string;\n store: CredentialsStore;\n}\n\nexport async function performVerificationLogin({\n backendUrlOption,\n frontendUrlOption,\n store,\n}: LoginOptions): Promise<StoredCredentials> {\n const backendUrl = resolveBackendUrl(backendUrlOption);\n const frontendUrl = resolveFrontendUrl(frontendUrlOption);\n const client = new ApiClient({ baseUrl: backendUrl });\n\n console.log('\\nAuthenticating CLI\u2026');\n const loopback = await LoopbackListener.create();\n const pkce = loopback ? generatePkcePair() : null;\n\n const sessionOptions: CreateCliAuthSessionOptions = {\n frontendUrl,\n };\n\n if (loopback && pkce) {\n sessionOptions.loopbackRedirectUri = loopback.redirectUri;\n sessionOptions.loopbackState = loopback.state;\n sessionOptions.pkceChallenge = pkce.challenge;\n sessionOptions.pkceChallengeMethod = pkce.method;\n }\n\n const session = await createCliAuthSession(client, sessionOptions);\n printSessionInstructions(session);\n tryOpenBrowser(session.verificationUriComplete);\n\n let completed = false;\n let successLogged = false;\n let latestCredentials: StoredCredentials | null = null;\n\n const completeLogin = async (code: string, codeVerifier?: string): Promise<void> => {\n if (completed) {\n return;\n }\n const exchange = await exchangeCliCode(\n client,\n session.sessionId,\n code,\n codeVerifier ? { codeVerifier } : {},\n );\n const updated = mergeCredentialsAfterExchange({\n exchange,\n });\n await store.save(updated);\n latestCredentials = updated;\n if (!successLogged) {\n console.log('\\nLogin successful. Credentials saved.');\n successLogged = true;\n }\n completed = true;\n };\n\n const loopbackTask =\n loopback && pkce\n ? waitForLoopback(loopback, session.sessionId, async (code) => {\n await completeLogin(code, pkce.verifier);\n if (typeof process.stdin.emit === 'function') {\n process.stdin.emit('data', '\\n');\n }\n })\n : null;\n\n if (!loopbackTask && !completed) {\n console.log('\\nWaiting for approval in the browser\u2026');\n }\n\n while (!completed) {\n const input = await prompt(\"\\nFallback code if automatic login doesn't complete: \");\n const cleaned = input.trim();\n\n if (completed) {\n break;\n }\n\n if (!cleaned) {\n continue;\n }\n\n if (!/^[0-9]{6}$/.test(cleaned)) {\n console.log('Codes must be exactly six digits.');\n continue;\n }\n\n try {\n await completeLogin(cleaned);\n } catch (error) {\n if (error instanceof ApiError) {\n if (error.status === 401) {\n console.log('Code not recognized. Double-check the digits shown in the browser.');\n continue;\n }\n if (error.status === 409) {\n console.log('Browser approval already completed. Finishing up\u2026');\n completed = true;\n break;\n }\n }\n await loopback?.stop();\n throw error;\n }\n }\n\n await loopback?.stop();\n\n if (!latestCredentials) {\n const stored = await store.load();\n if (stored) {\n latestCredentials = stored;\n } else {\n throw new Error('Login completed but credentials were not stored.');\n }\n }\n\n return latestCredentials;\n}\n\nconst DEFAULT_BACKEND_URL = 'https://api.omnara.com/';\nconst DEFAULT_FRONTEND_URL = 'https://www.omnara.com/';\n\nexport function resolveBackendUrl(option?: string): string {\n const candidate = option ?? process.env.OMNARA_BACKEND_URL ?? DEFAULT_BACKEND_URL;\n return normalizeBaseUrl(candidate);\n}\n\nexport function resolveFrontendUrl(option?: string): string {\n const candidate = option ?? process.env.OMNARA_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n return normalizeBaseUrl(candidate);\n}\n\nexport function mergeCredentialsAfterExchange(args: {\n exchange: ExchangeCliCodeResult;\n}): StoredCredentials {\n const now = Date.now();\n const accessExpiresAt = new Date(now + args.exchange.accessTokenExpiresIn * 1000).toISOString();\n const refreshExpiresAt = new Date(now + args.exchange.refreshTokenExpiresIn * 1000).toISOString();\n\n return {\n accessToken: args.exchange.accessToken,\n accessTokenExpiresAt: accessExpiresAt,\n refreshToken: args.exchange.refreshToken,\n refreshTokenExpiresAt: refreshExpiresAt,\n };\n}\n\nexport function formatDuration(ms: number): string {\n const totalSeconds = Math.round(ms / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n\n const totalMinutes = Math.round(totalSeconds / 60);\n if (totalMinutes < 60) {\n const seconds = totalSeconds % 60;\n return seconds > 0 ? `${totalMinutes}m ${seconds}s` : `${totalMinutes}m`;\n }\n\n const totalHours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (totalHours < 48) {\n return minutes > 0 ? `${totalHours}h ${minutes}m` : `${totalHours}h`;\n }\n\n const totalDays = Math.floor(totalHours / 24);\n const hours = totalDays % 24;\n return hours > 0 ? `${totalDays}d ${hours}h` : `${totalDays}d`;\n}\n\nfunction reportLoopbackError(error: unknown): void {\n if (error instanceof ApiError) {\n console.log(\n `Automatic login failed (HTTP ${error.status}). Paste the 6-digit code shown in the browser.`,\n );\n return;\n }\n console.log(`Automatic login failed: ${extractErrorMessage(error)}`);\n}\n\nfunction printSessionInstructions(session: CliAuthSession): void {\n console.log('\\nOpen this link in your browser if it did not open automatically:');\n console.log(` ${session.verificationUriComplete}`);\n console.log('Approve the request, then return to the CLI.');\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n\nasync function waitForLoopback(\n listener: LoopbackListener,\n sessionId: string,\n onCode: (code: string) => Promise<void>,\n): Promise<void> {\n try {\n const callback = await listener.waitForCallback();\n if (callback.sessionId && callback.sessionId !== sessionId) {\n console.log('Received browser callback for a different session.');\n return;\n }\n if (callback.state && callback.state !== listener.state) {\n console.log('Received browser callback with unexpected state.');\n return;\n }\n\n try {\n await onCode(callback.code);\n } catch (error) {\n reportLoopbackError(error);\n }\n } catch (error) {\n console.log(`Loopback listener error: ${extractErrorMessage(error)}`);\n }\n}\n", "import type { Console } from 'node:console';\n\nimport { CredentialsStore } from './credentials-store.js';\nimport { ensureAuthContext, type AuthContext } from './credential-manager.js';\nimport { performVerificationLogin } from './login-flow.js';\nimport { normalizeBaseUrl } from '../http/api-client.js';\n\nexport interface AuthProviderOptions {\n store: CredentialsStore;\n backendUrl: string;\n frontendUrl?: string;\n logger?: Console;\n}\n\nexport class AuthProvider {\n private cached: AuthContext | null = null;\n private readonly backendUrl: string;\n\n constructor(private readonly options: AuthProviderOptions) {\n this.backendUrl = normalizeBaseUrl(options.backendUrl);\n }\n\n async getAuthContext(): Promise<AuthContext> {\n const auth = await this.loadAuthContext();\n this.cached = auth;\n return auth;\n }\n\n async getAccessToken(): Promise<string> {\n const auth = await this.getAuthContext();\n return auth.accessToken;\n }\n\n private async loadAuthContext(): Promise<AuthContext> {\n try {\n return await ensureAuthContext(this.options.store, this.backendUrl);\n } catch (error) {\n if (!shouldAttemptLogin(error)) {\n throw error;\n }\n this.options.logger?.log('Opening browser to authenticate\u2026');\n await performVerificationLogin({\n backendUrlOption: this.backendUrl,\n frontendUrlOption: this.options.frontendUrl,\n store: this.options.store,\n });\n return await ensureAuthContext(this.options.store, this.backendUrl);\n }\n }\n}\n\nfunction shouldAttemptLogin(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message.includes('no credentials found') ||\n message.includes('run `omnara auth login` first') ||\n message.includes('refresh token expired') ||\n message.includes('refresh token unavailable') ||\n message.includes('access token expired')\n );\n}\n\nexport async function createAuthProvider(options: AuthProviderOptions): Promise<AuthProvider> {\n const provider = new AuthProvider(options);\n await provider.getAuthContext();\n return provider;\n}\n", "import { ApiClient } from './api-client.js';\n\ninterface CreateUserSessionRequestWire {\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface UserSessionDescriptor {\n kind: 'user_session';\n session_id: string;\n user_id: string;\n status: string;\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport async function createUserSession(\n client: ApiClient,\n accessToken: string,\n options: { name?: string; metadata?: Record<string, unknown> } = {},\n): Promise<UserSessionDescriptor> {\n const body: CreateUserSessionRequestWire = {\n name: options.name ?? null,\n metadata: options.metadata ?? null,\n };\n\n return await client.postJson<CreateUserSessionRequestWire, UserSessionDescriptor>(\n '/api/v1/user-sessions',\n body,\n { accessToken },\n );\n}\n", "import Ajv2020 from \"ajv/dist/2020.js\";\nimport addFormats from \"ajv-formats\";\n// Import JSON schemas directly for browser compatibility\nimport controlSchema from \"../../schemas/control_message.schema.json\" with { type: \"json\" };\nimport envelopeSchema from \"../../schemas/message_envelope.schema.json\" with { type: \"json\" };\nimport voiceLaunchRequestSchema from \"../../schemas/api_voice_launch_request.schema.json\" with { type: \"json\" };\nimport voiceLaunchResponseSchema from \"../../schemas/api_voice_launch_response.schema.json\" with { type: \"json\" };\nimport createUserSessionRequestSchema from \"../../schemas/api_sessions_create_request.schema.json\" with { type: \"json\" };\nimport userSessionSummarySchema from \"../../schemas/api_sessions_summary.schema.json\" with { type: \"json\" };\nimport userSessionListResponseSchema from \"../../schemas/api_sessions_list_response.schema.json\" with { type: \"json\" };\nimport messagePageResponseSchema from \"../../schemas/api_sessions_message_page_response.schema.json\" with { type: \"json\" };\nimport agentSessionDetailSchema from \"../../schemas/api_sessions_agent_detail.schema.json\" with { type: \"json\" };\nimport createChatMessageRequestSchema from \"../../schemas/api_sessions_create_chat_message_request.schema.json\" with { type: \"json\" };\nimport subscriptionResponseSchema from \"../../schemas/api_billing_subscription_response.schema.json\" with { type: \"json\" };\nimport usageResponseSchema from \"../../schemas/api_billing_usage_response.schema.json\" with { type: \"json\" };\nimport createCheckoutRequestSchema from \"../../schemas/api_billing_create_checkout_request.schema.json\" with { type: \"json\" };\nimport checkoutResponseSchema from \"../../schemas/api_billing_checkout_response.schema.json\" with { type: \"json\" };\nimport validatePromoRequestSchema from \"../../schemas/api_billing_validate_promo_request.schema.json\" with { type: \"json\" };\nimport promoValidationResponseSchema from \"../../schemas/api_billing_promo_validation_response.schema.json\" with { type: \"json\" };\nimport customerPortalRequestSchema from \"../../schemas/api_billing_customer_portal_request.schema.json\" with { type: \"json\" };\nimport customerPortalResponseSchema from \"../../schemas/api_billing_customer_portal_response.schema.json\" with { type: \"json\" };\nimport notificationRequestSchema from \"../../schemas/api_settings_notification_request.schema.json\" with { type: \"json\" };\nimport notificationResponseSchema from \"../../schemas/api_settings_notification_response.schema.json\" with { type: \"json\" };\nconst ajv = new Ajv2020({ strict: true, allErrors: true });\naddFormats(ajv);\n// Message validators\nexport const validateControlMessage = ajv.compile(controlSchema);\nexport const validateMessageEnvelope = ajv.compile(envelopeSchema);\n// Voice API validators\nexport const validateVoiceAgentLaunchRequest = ajv.compile(voiceLaunchRequestSchema);\nexport const validateVoiceAgentLaunchResponse = ajv.compile(voiceLaunchResponseSchema);\n// Sessions API validators\nexport const validateCreateUserSessionRequest = ajv.compile(createUserSessionRequestSchema);\nexport const validateUserSessionSummary = ajv.compile(userSessionSummarySchema);\nexport const validateUserSessionListResponse = ajv.compile(userSessionListResponseSchema);\nexport const validateMessagePageResponse = ajv.compile(messagePageResponseSchema);\nexport const validateAgentSessionDetail = ajv.compile(agentSessionDetailSchema);\nexport const validateCreateChatMessageRequest = ajv.compile(createChatMessageRequestSchema);\n// Billing API validators\nexport const validateSubscriptionResponse = ajv.compile(subscriptionResponseSchema);\nexport const validateUsageResponse = ajv.compile(usageResponseSchema);\nexport const validateCreateCheckoutSessionRequest = ajv.compile(createCheckoutRequestSchema);\nexport const validateCheckoutSessionResponse = ajv.compile(checkoutResponseSchema);\nexport const validateValidatePromoCodeRequest = ajv.compile(validatePromoRequestSchema);\nexport const validatePromoCodeValidationResponse = ajv.compile(promoValidationResponseSchema);\nexport const validateCustomerPortalSessionRequest = ajv.compile(customerPortalRequestSchema);\nexport const validateCustomerPortalSessionResponse = ajv.compile(customerPortalResponseSchema);\n// Settings API validators\nexport const validateUserNotificationSettingsRequest = ajv.compile(notificationRequestSchema);\nexport const validateUserNotificationSettingsResponse = ajv.compile(notificationResponseSchema);\n", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/ControlMessage\",\n \"title\": \"ControlMessage\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"Heartbeat\": {\n \"additionalProperties\": false,\n \"description\": \"Ping/pong heartbeat frames.\",\n \"properties\": {\n \"type\": {\n \"const\": \"heartbeat\",\n \"default\": \"heartbeat\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"mode\": {\n \"default\": \"ping\",\n \"enum\": [\n \"ping\",\n \"pong\"\n ],\n \"title\": \"Mode\",\n \"type\": \"string\"\n },\n \"sent_at\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Sent At\"\n }\n },\n \"title\": \"Heartbeat\",\n \"type\": \"object\"\n },\n \"SessionAnnounce\": {\n \"additionalProperties\": false,\n \"description\": \"Notification that a session was created or updated.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_announce\",\n \"default\": \"session_announce\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n }\n ],\n \"title\": \"Session\"\n },\n \"origin\": {\n \"enum\": [\n \"backend\",\n \"client\"\n ],\n \"title\": \"Origin\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"session\",\n \"origin\"\n ],\n \"title\": \"SessionAnnounce\",\n \"type\": \"object\"\n },\n \"SessionBootstrap\": {\n \"additionalProperties\": false,\n \"description\": \"Initial snapshot of the session tree for this connection.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_bootstrap\",\n \"default\": \"session_bootstrap\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"root\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"root\"\n ],\n \"title\": \"SessionBootstrap\",\n \"type\": \"object\"\n },\n \"SessionClosed\": {\n \"additionalProperties\": false,\n \"description\": \"Indicates a session has been completed or shut down.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_closed\",\n \"default\": \"session_closed\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"status\"\n ],\n \"title\": \"SessionClosed\",\n \"type\": \"object\"\n },\n \"SessionInit\": {\n \"additionalProperties\": false,\n \"description\": \"Client request to register or refresh an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_init\",\n \"default\": \"session_init\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Session Id\",\n \"type\": \"string\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_session_id\",\n \"session_type\"\n ],\n \"title\": \"SessionInit\",\n \"type\": \"object\"\n },\n \"SessionInitAck\": {\n \"additionalProperties\": false,\n \"description\": \"Acknowledgement that a session_init was processed.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_init_ack\",\n \"default\": \"session_init_ack\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Session Id\",\n \"type\": \"string\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_session_id\"\n ],\n \"title\": \"SessionInitAck\",\n \"type\": \"object\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n }\n },\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/SessionInit\"\n },\n {\n \"$ref\": \"#/$defs/SessionBootstrap\"\n },\n {\n \"$ref\": \"#/$defs/SessionAnnounce\"\n },\n {\n \"$ref\": \"#/$defs/SessionInitAck\"\n },\n {\n \"$ref\": \"#/$defs/SessionClosed\"\n },\n {\n \"$ref\": \"#/$defs/Heartbeat\"\n }\n ]\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MessageEnvelope\",\n \"title\": \"MessageEnvelope\",\n \"$defs\": {\n \"AgentCompleteContent\": {\n \"additionalProperties\": false,\n \"description\": \"Completion marker for an agent session turn.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_complete\",\n \"default\": \"agent_complete\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"success\": {\n \"title\": \"Success\",\n \"type\": \"boolean\"\n },\n \"duration_ms\": {\n \"anyOf\": [\n {\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Duration Ms\"\n },\n \"cost_usd\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Cost Usd\"\n },\n \"message\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Message\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"success\"\n ],\n \"title\": \"AgentCompleteContent\",\n \"type\": \"object\"\n },\n \"AgentProgressContent\": {\n \"additionalProperties\": false,\n \"description\": \"Incremental progress emitted by an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_progress\",\n \"default\": \"agent_progress\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Detail\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"title\": \"AgentProgressContent\",\n \"type\": \"object\"\n },\n \"MessagePayload\": {\n \"additionalProperties\": false,\n \"description\": \"Application-level message data stored in the database and relayed to clients.\",\n \"properties\": {\n \"version\": {\n \"default\": 0,\n \"title\": \"Version\",\n \"type\": \"integer\"\n },\n \"content\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolCallContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentProgressContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentCompleteContent\"\n }\n ],\n \"title\": \"Content\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"title\": \"MessagePayload\",\n \"type\": \"object\"\n },\n \"SenderRef\": {\n \"additionalProperties\": false,\n \"description\": \"Reference to the author of a message.\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"user\",\n \"agent_session\"\n ],\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"id\": {\n \"format\": \"uuid\",\n \"title\": \"Id\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"id\"\n ],\n \"title\": \"SenderRef\",\n \"type\": \"object\"\n },\n \"TextContent\": {\n \"additionalProperties\": false,\n \"description\": \"Plain text content shared with the agent.\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"default\": \"text\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"text\": {\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"annotations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Annotations\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"title\": \"TextContent\",\n \"type\": \"object\"\n },\n \"ToolCallContent\": {\n \"additionalProperties\": false,\n \"description\": \"Tool invocation authored by the assistant.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_call\",\n \"default\": \"tool_call\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"name\": {\n \"title\": \"Name\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"arguments\": {\n \"additionalProperties\": true,\n \"title\": \"Arguments\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"name\",\n \"tool_use_id\",\n \"arguments\"\n ],\n \"title\": \"ToolCallContent\",\n \"type\": \"object\"\n },\n \"ToolResultContent\": {\n \"additionalProperties\": false,\n \"description\": \"Result produced by a previously invoked tool.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_result\",\n \"default\": \"tool_result\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"output\": {\n \"title\": \"Output\"\n },\n \"is_error\": {\n \"default\": false,\n \"title\": \"Is Error\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"tool_use_id\",\n \"output\"\n ],\n \"title\": \"ToolResultContent\",\n \"type\": \"object\"\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Complete message frame exchanged over transports.\",\n \"properties\": {\n \"message_id\": {\n \"format\": \"uuid\",\n \"title\": \"Message Id\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"sender\": {\n \"$ref\": \"#/$defs/SenderRef\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/MessagePayload\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message_id\",\n \"session_id\",\n \"sender\",\n \"payload\",\n \"created_at\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/VoiceAgentLaunchRequest\",\n \"title\": \"VoiceAgentLaunchRequest\",\n \"description\": \"Request to launch a voice agent for an agent session.\",\n \"properties\": {\n \"force\": {\n \"default\": false,\n \"description\": \"Launch even if the CLI relay is offline or owned by another user. When true, the request bypasses relay presence validation.\",\n \"title\": \"Force\",\n \"type\": \"boolean\"\n },\n \"room_name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Optional LiveKit room name override (defaults to derived prefix).\",\n \"title\": \"Room Name\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/VoiceAgentLaunchResponse\",\n \"title\": \"VoiceAgentLaunchResponse\",\n \"description\": \"Response containing LiveKit room and relay connection details.\",\n \"properties\": {\n \"session_id\": {\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"room_name\": {\n \"title\": \"Room Name\",\n \"type\": \"string\"\n },\n \"livekit_url\": {\n \"title\": \"Livekit Url\",\n \"type\": \"string\"\n },\n \"access_token\": {\n \"title\": \"Access Token\",\n \"type\": \"string\"\n },\n \"access_token_identity\": {\n \"title\": \"Access Token Identity\",\n \"type\": \"string\"\n },\n \"relay_ws_url\": {\n \"title\": \"Relay Ws Url\",\n \"type\": \"string\"\n },\n \"relay_token\": {\n \"title\": \"Relay Token\",\n \"type\": \"string\"\n },\n \"relay_token_expires_in\": {\n \"title\": \"Relay Token Expires In\",\n \"type\": \"integer\"\n },\n \"dispatch_id\": {\n \"title\": \"Dispatch Id\",\n \"type\": \"string\"\n },\n \"dispatch_metadata\": {\n \"additionalProperties\": true,\n \"title\": \"Dispatch Metadata\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"session_id\",\n \"room_name\",\n \"livekit_url\",\n \"access_token\",\n \"access_token_identity\",\n \"relay_ws_url\",\n \"relay_token\",\n \"relay_token_expires_in\",\n \"dispatch_id\",\n \"dispatch_metadata\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateUserSessionRequest\",\n \"title\": \"CreateUserSessionRequest\",\n \"description\": \"Payload for creating a new user session container.\",\n \"properties\": {\n \"name\": {\n \"anyOf\": [\n {\n \"maxLength\": 255,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserSessionSummary\",\n \"title\": \"UserSessionSummary\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n }\n },\n \"description\": \"Aggregated user session data returned to clients.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"session\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserSessionListResponse\",\n \"title\": \"UserSessionListResponse\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n },\n \"UserSessionSummary\": {\n \"description\": \"Aggregated user session data returned to clients.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"session\"\n ],\n \"title\": \"UserSessionSummary\",\n \"type\": \"object\"\n }\n },\n \"description\": \"Response containing a list of user sessions.\",\n \"properties\": {\n \"sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/UserSessionSummary\"\n },\n \"title\": \"Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"sessions\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MessagePageResponse\",\n \"title\": \"MessagePageResponse\",\n \"$defs\": {\n \"AgentCompleteContent\": {\n \"additionalProperties\": false,\n \"description\": \"Completion marker for an agent session turn.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_complete\",\n \"default\": \"agent_complete\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"success\": {\n \"title\": \"Success\",\n \"type\": \"boolean\"\n },\n \"duration_ms\": {\n \"anyOf\": [\n {\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Duration Ms\"\n },\n \"cost_usd\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Cost Usd\"\n },\n \"message\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Message\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"success\"\n ],\n \"title\": \"AgentCompleteContent\",\n \"type\": \"object\"\n },\n \"AgentProgressContent\": {\n \"additionalProperties\": false,\n \"description\": \"Incremental progress emitted by an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_progress\",\n \"default\": \"agent_progress\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Detail\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"title\": \"AgentProgressContent\",\n \"type\": \"object\"\n },\n \"MessageEnvelope\": {\n \"additionalProperties\": false,\n \"description\": \"Complete message frame exchanged over transports.\",\n \"properties\": {\n \"message_id\": {\n \"format\": \"uuid\",\n \"title\": \"Message Id\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"sender\": {\n \"$ref\": \"#/$defs/SenderRef\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/MessagePayload\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message_id\",\n \"session_id\",\n \"sender\",\n \"payload\",\n \"created_at\"\n ],\n \"title\": \"MessageEnvelope\",\n \"type\": \"object\"\n },\n \"MessagePayload\": {\n \"additionalProperties\": false,\n \"description\": \"Application-level message data stored in the database and relayed to clients.\",\n \"properties\": {\n \"version\": {\n \"default\": 0,\n \"title\": \"Version\",\n \"type\": \"integer\"\n },\n \"content\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolCallContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentProgressContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentCompleteContent\"\n }\n ],\n \"title\": \"Content\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"title\": \"MessagePayload\",\n \"type\": \"object\"\n },\n \"SenderRef\": {\n \"additionalProperties\": false,\n \"description\": \"Reference to the author of a message.\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"user\",\n \"agent_session\"\n ],\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"id\": {\n \"format\": \"uuid\",\n \"title\": \"Id\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"id\"\n ],\n \"title\": \"SenderRef\",\n \"type\": \"object\"\n },\n \"TextContent\": {\n \"additionalProperties\": false,\n \"description\": \"Plain text content shared with the agent.\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"default\": \"text\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"text\": {\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"annotations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Annotations\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"title\": \"TextContent\",\n \"type\": \"object\"\n },\n \"ToolCallContent\": {\n \"additionalProperties\": false,\n \"description\": \"Tool invocation authored by the assistant.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_call\",\n \"default\": \"tool_call\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"name\": {\n \"title\": \"Name\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"arguments\": {\n \"additionalProperties\": true,\n \"title\": \"Arguments\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"name\",\n \"tool_use_id\",\n \"arguments\"\n ],\n \"title\": \"ToolCallContent\",\n \"type\": \"object\"\n },\n \"ToolResultContent\": {\n \"additionalProperties\": false,\n \"description\": \"Result produced by a previously invoked tool.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_result\",\n \"default\": \"tool_result\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"output\": {\n \"title\": \"Output\"\n },\n \"is_error\": {\n \"default\": false,\n \"title\": \"Is Error\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"tool_use_id\",\n \"output\"\n ],\n \"title\": \"ToolResultContent\",\n \"type\": \"object\"\n }\n },\n \"description\": \"Paginated response for session messages.\",\n \"properties\": {\n \"messages\": {\n \"items\": {\n \"$ref\": \"#/$defs/MessageEnvelope\"\n },\n \"title\": \"Messages\",\n \"type\": \"array\"\n },\n \"has_more\": {\n \"default\": false,\n \"title\": \"Has More\",\n \"type\": \"boolean\"\n },\n \"next_cursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Next Cursor\"\n }\n },\n \"required\": [\n \"messages\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/AgentSessionDetail\",\n \"title\": \"AgentSessionDetail\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n }\n },\n \"description\": \"Detailed agent session with child sessions.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"child_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Child Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"session\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateChatMessageRequest\",\n \"title\": \"CreateChatMessageRequest\",\n \"description\": \"Simple text payload for dashboard/mobile chat fallbacks.\",\n \"properties\": {\n \"text\": {\n \"minLength\": 1,\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/SubscriptionResponse\",\n \"title\": \"SubscriptionResponse\",\n \"description\": \"Current subscription details for a user.\",\n \"properties\": {\n \"id\": {\n \"title\": \"Id\",\n \"type\": \"string\"\n },\n \"plan_type\": {\n \"title\": \"Plan Type\",\n \"type\": \"string\"\n },\n \"agent_limit\": {\n \"title\": \"Agent Limit\",\n \"type\": \"integer\"\n },\n \"current_period_end\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Current Period End\"\n },\n \"cancel_at_period_end\": {\n \"default\": false,\n \"title\": \"Cancel At Period End\",\n \"type\": \"boolean\"\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Provider\"\n },\n \"plan_display_name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Human-friendly plan label (e.g. Pro, Starter).\",\n \"title\": \"Plan Display Name\"\n },\n \"plan_price_amount\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Recurring charge amount for the plan (in major currency units).\",\n \"title\": \"Plan Price Amount\"\n },\n \"plan_price_currency\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"ISO currency for the recurring charge (e.g. usd).\",\n \"title\": \"Plan Price Currency\"\n },\n \"plan_price_interval\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Billing interval for the recurring charge (e.g. month, year).\",\n \"title\": \"Plan Price Interval\"\n }\n },\n \"required\": [\n \"id\",\n \"plan_type\",\n \"agent_limit\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UsageResponse\",\n \"title\": \"UsageResponse\",\n \"description\": \"Current usage statistics for a subscription period.\",\n \"properties\": {\n \"total_agents\": {\n \"title\": \"Total Agents\",\n \"type\": \"integer\"\n },\n \"agent_limit\": {\n \"title\": \"Agent Limit\",\n \"type\": \"integer\"\n },\n \"period_start\": {\n \"format\": \"date-time\",\n \"title\": \"Period Start\",\n \"type\": \"string\"\n },\n \"period_end\": {\n \"format\": \"date-time\",\n \"title\": \"Period End\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"total_agents\",\n \"agent_limit\",\n \"period_start\",\n \"period_end\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateCheckoutSessionRequest\",\n \"title\": \"CreateCheckoutSessionRequest\",\n \"description\": \"Request to create a Stripe checkout session.\",\n \"properties\": {\n \"plan_type\": {\n \"description\": \"Target plan type (e.g. pro, enterprise).\",\n \"title\": \"Plan Type\",\n \"type\": \"string\"\n },\n \"success_url\": {\n \"description\": \"URL to redirect to after successful checkout.\",\n \"title\": \"Success Url\",\n \"type\": \"string\"\n },\n \"cancel_url\": {\n \"description\": \"URL to redirect to if the user cancels checkout.\",\n \"title\": \"Cancel Url\",\n \"type\": \"string\"\n },\n \"promo_code\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Optional promotional code to pre-apply to the checkout session.\",\n \"title\": \"Promo Code\"\n }\n },\n \"required\": [\n \"plan_type\",\n \"success_url\",\n \"cancel_url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CheckoutSessionResponse\",\n \"title\": \"CheckoutSessionResponse\",\n \"description\": \"Response containing checkout session details.\",\n \"properties\": {\n \"session_id\": {\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"checkout_url\": {\n \"title\": \"Checkout Url\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"session_id\",\n \"checkout_url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/ValidatePromoCodeRequest\",\n \"title\": \"ValidatePromoCodeRequest\",\n \"description\": \"Request to validate a promotional code.\",\n \"properties\": {\n \"code\": {\n \"title\": \"Code\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/PromoCodeValidationResponse\",\n \"title\": \"PromoCodeValidationResponse\",\n \"description\": \"Response containing promotional code validation results.\",\n \"properties\": {\n \"valid\": {\n \"title\": \"Valid\",\n \"type\": \"boolean\"\n },\n \"code\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Code\"\n },\n \"discount_type\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Discount Type\"\n },\n \"discount_value\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Discount Value\"\n },\n \"description\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Description\"\n },\n \"error\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Error\"\n }\n },\n \"required\": [\n \"valid\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CustomerPortalSessionRequest\",\n \"title\": \"CustomerPortalSessionRequest\",\n \"description\": \"Request to create a Stripe Billing customer portal session.\",\n \"properties\": {\n \"return_url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Where Stripe should send the customer after they leave the portal.\",\n \"title\": \"Return Url\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CustomerPortalSessionResponse\",\n \"title\": \"CustomerPortalSessionResponse\",\n \"description\": \"Response containing the Stripe Billing customer portal session URL.\",\n \"properties\": {\n \"url\": {\n \"description\": \"Hosted Stripe customer portal URL.\",\n \"title\": \"Url\",\n \"type\": \"string\"\n },\n \"created\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Timestamp when the session was created.\",\n \"title\": \"Created\"\n },\n \"expires_at\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"When the portal session expires (if provided by Stripe).\",\n \"title\": \"Expires At\"\n }\n },\n \"required\": [\n \"url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserNotificationSettingsRequest\",\n \"title\": \"UserNotificationSettingsRequest\",\n \"description\": \"Request to update user notification preferences.\",\n \"properties\": {\n \"push_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Push Notifications Enabled\"\n },\n \"email_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Email Notifications Enabled\"\n },\n \"sms_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Sms Notifications Enabled\"\n },\n \"phone_number\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Phone Number\"\n },\n \"notification_email\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Notification Email\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserNotificationSettingsResponse\",\n \"title\": \"UserNotificationSettingsResponse\",\n \"description\": \"Response containing current notification settings.\",\n \"properties\": {\n \"push_notifications_enabled\": {\n \"title\": \"Push Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"email_notifications_enabled\": {\n \"title\": \"Email Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"sms_notifications_enabled\": {\n \"title\": \"Sms Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"phone_number\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Phone Number\"\n },\n \"notification_email\": {\n \"title\": \"Notification Email\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"push_notifications_enabled\",\n \"email_notifications_enabled\",\n \"sms_notifications_enabled\",\n \"phone_number\",\n \"notification_email\"\n ],\n \"type\": \"object\"\n}", "import readline from 'readline';\nimport { once } from 'events';\nimport WebSocket from 'ws';\nimport type { OutboundMessage } from '../orchestrator/orchestrator-types.js';\n\nexport interface ReplOptions {\n url?: string;\n headers?: Record<string, string>;\n initialSessionId?: string;\n parentSessionId?: string;\n initialMetadata?: Record<string, unknown>;\n initializeSession?: boolean;\n}\n\nconst DEFAULT_URL = 'ws://localhost:3001/ws';\n\nexport async function runTerminalRepl(options?: Partial<ReplOptions>): Promise<void> {\n const url = options?.url ?? DEFAULT_URL;\n const wsOptions = options?.headers ? { headers: options.headers } : undefined;\n const ws = wsOptions ? new WebSocket(url, wsOptions) : new WebSocket(url);\n\n await Promise.race([\n once(ws, 'open').then(() => undefined),\n once(ws, 'error').then(([error]) => {\n throw error;\n }),\n ]);\n\n console.log(`Connected to ${url}`);\n\n if (options?.initializeSession && options?.initialSessionId) {\n const payload: Record<string, unknown> = {\n type: 'session_init',\n sessionId: options.initialSessionId,\n };\n if (options.parentSessionId) {\n payload.parentSessionId = options.parentSessionId;\n }\n if (options.initialMetadata) {\n payload.metadata = options.initialMetadata;\n }\n sendMessage(ws, payload);\n }\n\n let currentSessionId: string | undefined = options?.initialSessionId;\n let awaitingResponse = false;\n let lastPrompt = promptForSession(currentSessionId);\n let shuttingDown = false;\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: lastPrompt,\n });\n\n ws.on('message', (data) => {\n handleOutboundMessage(\n maybeParseOutboundMessage(data),\n () => rl.prompt(true),\n (sessionId) => {\n currentSessionId = sessionId;\n updatePrompt();\n },\n () => {\n awaitingResponse = false;\n updatePrompt();\n },\n );\n });\n\n ws.on('close', (code, reason) => {\n console.log(\n `\\nDisconnected from server (code ${code}${reason ? `, reason: ${reason.toString()}` : ''})`,\n );\n if (!shuttingDown) {\n shuttingDown = true;\n rl.close();\n }\n });\n\n ws.on('error', (error) => {\n console.error('\\nWebSocket error:', error);\n if (!shuttingDown) {\n shuttingDown = true;\n rl.close();\n }\n });\n\n rl.on('line', (line) => {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n updatePrompt();\n return;\n }\n\n if (trimmed === '/exit' || trimmed === '/quit') {\n cleanup();\n return;\n }\n\n if (trimmed === '/new') {\n currentSessionId = undefined;\n console.log('\\nStarting a new session.');\n updatePrompt();\n return;\n }\n\n if (trimmed.startsWith('/join ')) {\n const target = trimmed.slice('/join '.length).trim();\n if (target.length === 0) {\n console.log('\\nUsage: /join <session-id>');\n updatePrompt();\n return;\n }\n\n currentSessionId = target;\n sendMessage(ws, { type: 'join', sessionId: target });\n updatePrompt();\n return;\n }\n\n if (trimmed === '/help') {\n printHelp();\n updatePrompt();\n return;\n }\n\n awaitingResponse = true;\n updatePrompt();\n\n sendMessage(ws, {\n type: 'chat',\n sessionId: currentSessionId,\n text: trimmed,\n });\n });\n\n rl.on('SIGINT', () => {\n cleanup();\n });\n\n rl.on('close', () => {\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close(1000, 'Client closing');\n }\n });\n\n rl.prompt();\n\n await new Promise<void>((resolve) => {\n rl.once('close', resolve);\n });\n\n function updatePrompt(): void {\n lastPrompt = promptForSession(currentSessionId, awaitingResponse);\n rl.setPrompt(lastPrompt);\n rl.prompt(true);\n }\n\n function cleanup(): void {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close(1000, 'Client closing');\n }\n rl.close();\n }\n}\n\nfunction promptForSession(sessionId: string | undefined, awaitingResponse = false): string {\n const base = sessionId ? `session:${sessionId.slice(0, 6)}` : 'session:new';\n return `${awaitingResponse ? '*' : ''}${base}> `;\n}\n\nfunction sendMessage(ws: WebSocket, payload: unknown): void {\n if (ws.readyState !== WebSocket.OPEN) {\n console.warn('Cannot send message: socket is not open.');\n return;\n }\n try {\n ws.send(JSON.stringify(payload));\n } catch (error) {\n console.error('Failed to send message:', error);\n }\n}\n\nfunction maybeParseOutboundMessage(data: WebSocket.RawData): OutboundMessage | null {\n try {\n const text = typeof data === 'string' ? data : data.toString('utf8');\n return JSON.parse(text) as OutboundMessage;\n } catch (error) {\n console.error('Failed to parse server message:', error);\n return null;\n }\n}\n\nfunction handleOutboundMessage(\n message: OutboundMessage | null,\n onPrompt: () => void,\n onSessionChange: (sessionId: string) => void,\n onTurnComplete: () => void,\n): void {\n if (!message) {\n return;\n }\n\n switch (message.type) {\n case 'session_created':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [server] Session created: ${message.sessionId}`,\n );\n onSessionChange(message.sessionId);\n break;\n case 'session_joined':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [server] Joined session: ${message.sessionId}`,\n );\n onSessionChange(message.sessionId);\n break;\n case 'session_init':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [server] Session init (parent: ${message.parentSessionId ?? 'none'})`,\n );\n break;\n case 'session_init_ack':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [server] Session init acknowledged (parent: ${message.parentSessionId ?? 'none'})`,\n );\n break;\n case 'user_text':\n if (message.origin === 'worker') {\n console.log(`\\n${formatSessionPrefix(message.sessionId)} worker> ${message.text}`);\n } else {\n console.log(`\\n${formatSessionPrefix(message.sessionId)} you> ${message.text}`);\n }\n break;\n case 'assistant_text':\n process.stdout.write(`\\n${formatSessionPrefix(message.sessionId)} claude> ${message.text}`);\n break;\n case 'agent_complete': {\n const status = message.success ? 'Success' : 'Failure';\n const duration = message.durationMs != null ? ` (${message.durationMs}ms)` : '';\n const cost = message.costUsd != null ? ` cost: $${message.costUsd.toFixed(4)}` : '';\n const summary = message.message ? ` - ${message.message}` : '';\n const metadata = message.metadata ?? {};\n const agentId =\n typeof metadata.agent_session_id === 'string' ? metadata.agent_session_id : undefined;\n const taskLabel = typeof metadata.task === 'string' ? ` (${metadata.task})` : '';\n const agentLabel = agentId ? ` [agent:${agentId}]` : '';\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [complete${agentLabel}${taskLabel}] ${status}${duration}${cost}${summary}`,\n );\n onTurnComplete();\n break;\n }\n case 'tool_call':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [tool] Using ${message.toolName} (${message.toolUseId}):`,\n safeStringify(message.input),\n );\n break;\n case 'tool_result':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [tool] Result for ${message.toolUseId}${message.isError ? ' (error)' : ''}:`,\n safeStringify(message.content),\n );\n break;\n case 'agent_progress':\n {\n const status = (message.status ?? 'update').toUpperCase();\n const detail = message.detail ? ` - ${message.detail}` : '';\n const metadata = message.metadata ?? {};\n const agentId =\n typeof metadata.agent_session_id === 'string' ? metadata.agent_session_id : undefined;\n const relatedSessionId =\n message.sessionId ||\n (typeof metadata.origin_session_id === 'string'\n ? metadata.origin_session_id\n : undefined) ||\n agentId;\n const agentLabel = agentId ? ` [agent:${agentId}]` : '';\n console.log(`\\n${formatSessionPrefix(relatedSessionId)}${agentLabel} ${status}${detail}`);\n }\n break;\n case 'system':\n console.log(`\\n${formatSessionPrefix(message.sessionId)} [system] ${message.subtype}`);\n if (message.subtype === 'init') {\n onTurnComplete();\n }\n break;\n case 'error':\n console.error(`\\n${formatSessionPrefix(message.sessionId)} [error] ${message.message}`);\n onTurnComplete();\n break;\n case 'pong':\n // No-op; keep connection alive.\n break;\n default:\n console.log(\n `\\n${formatSessionPrefix((message as { sessionId?: string }).sessionId)} [server]`,\n safeStringify(message),\n );\n break;\n }\n\n onPrompt();\n}\n\nfunction safeStringify(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction formatSessionPrefix(sessionId: string | undefined): string {\n if (!sessionId) {\n return '[session:unknown]';\n }\n return `[session:${sessionId}]`;\n}\n\nfunction printHelp(): void {\n console.log(`\\nCommands:\n /new Start a new session\n /join <id> Join an existing session\n /help Show this help text\n /exit Quit the REPL\n`);\n}\n", "import { ApiClient } from '../http/api-client.js';\n\ninterface VoiceLaunchRequestWire {\n force?: boolean;\n room_name?: string | null;\n}\n\ninterface VoiceLaunchResponseWire {\n session_id: string;\n room_name: string;\n livekit_url: string;\n access_token: string;\n access_token_identity: string;\n relay_ws_url: string;\n relay_token: string;\n relay_token_expires_in: number;\n dispatch_id: string;\n dispatch_metadata: Record<string, unknown>;\n}\n\nexport interface VoiceLaunchResult {\n sessionId: string;\n roomName: string;\n livekitUrl: string;\n accessToken: string;\n accessTokenIdentity: string;\n relayWsUrl: string;\n relayToken: string;\n relayTokenExpiresIn: number;\n dispatchId: string;\n dispatchMetadata: Record<string, unknown>;\n}\n\nexport interface LaunchVoiceOptions {\n sessionId: string;\n force?: boolean;\n roomName?: string;\n}\n\nexport async function launchVoiceForSession(\n client: ApiClient,\n accessToken: string,\n options: LaunchVoiceOptions,\n): Promise<VoiceLaunchResult> {\n const path = `/api/v1/voice/sessions/${options.sessionId}/launch`;\n const requestBody: VoiceLaunchRequestWire = {};\n\n if (options.force) {\n requestBody.force = true;\n }\n if (options.roomName) {\n requestBody.room_name = options.roomName;\n }\n\n const response = await client.postJson<VoiceLaunchRequestWire, VoiceLaunchResponseWire>(\n path,\n requestBody,\n { accessToken },\n );\n\n return {\n sessionId: response.session_id,\n roomName: response.room_name,\n livekitUrl: response.livekit_url,\n accessToken: response.access_token,\n accessTokenIdentity: response.access_token_identity,\n relayWsUrl: response.relay_ws_url,\n relayToken: response.relay_token,\n relayTokenExpiresIn: response.relay_token_expires_in,\n dispatchId: response.dispatch_id,\n dispatchMetadata: response.dispatch_metadata ?? {},\n };\n}\n", "import { execSync } from 'child_process';\nimport chalk from 'chalk';\n\n/**\n * Checks if Claude Code is installed and available in the system\n */\nexport function checkClaudeCodeInstallation(): boolean {\n try {\n // Try to execute claude command to check if it's available\n execSync('claude --version', {\n stdio: 'ignore',\n encoding: 'utf-8',\n env: process.env,\n });\n return true;\n } catch {\n // Command not found or execution failed\n return false;\n }\n}\n\n/**\n * Checks if ANTHROPIC_API_KEY environment variable is set\n */\nexport function checkAnthropicApiKey(): boolean {\n return !!process.env.ANTHROPIC_API_KEY && process.env.ANTHROPIC_API_KEY.trim().length > 0;\n}\n\n/**\n * Displays a warning message if neither authentication method is available\n */\nexport function displayClaudeCodeWarning(): void {\n console.log(\n chalk.yellow(\n \"\\nWarning: Omnara needs access to the Anthropic API. Omnara didn't detect claude installed, nor did it find a valid API key. If you run into authentication errors, login via `claude login` or pass in an ANTHROPIC_API_KEY as an environment variable.\\n\",\n ),\n );\n}\n\n/**\n * Performs the Claude Code check and displays warning if needed\n * @param options - Optional configuration for the check\n * @returns boolean indicating if either authentication method is available\n */\nexport function performClaudeCodeCheck(\n options: {\n silent?: boolean;\n exitOnMissing?: boolean;\n } = {},\n): boolean {\n const { silent = false, exitOnMissing = false } = options;\n\n // Allow disabling the check via environment variable\n if (process.env.OMNARA_SKIP_CLAUDE_CHECK === 'true') {\n return true;\n }\n\n const isClaudeInstalled = checkClaudeCodeInstallation();\n const hasApiKey = checkAnthropicApiKey();\n const hasAuthentication = isClaudeInstalled || hasApiKey;\n\n // Only warn if BOTH checks fail\n if (!hasAuthentication && !silent) {\n displayClaudeCodeWarning();\n\n if (exitOnMissing) {\n console.error(chalk.red('Exiting: Authentication is required for this operation.'));\n process.exit(1);\n }\n }\n\n return hasAuthentication;\n}\n\n/**\n * Gets Claude Code version if installed\n */\nexport function getClaudeCodeVersion(): string | null {\n try {\n const version = execSync('claude --version', {\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n env: process.env,\n }).trim();\n return version;\n } catch {\n return null;\n }\n}\n", "import { Command } from 'commander';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport type { StoredCredentials } from '../auth/credentials-store.js';\nimport { ApiError } from '../http/api-client.js';\nimport { performVerificationLogin, resolveBackendUrl, formatDuration } from '../auth/login-flow.js';\n\ninterface LoginOptions {\n backendUrl?: string;\n frontendUrl?: string;\n}\n\nexport function buildAuthCommand(): Command {\n const auth = new Command('auth').description('Authenticate the Omnara CLI.');\n\n auth\n .command('login')\n .description('Authenticate via the browser-based verification flow.')\n .option('--backend-url <url>', 'Backend base URL')\n .option('--frontend-url <url>', 'Frontend URL to open for verification')\n .action(async (options: LoginOptions) => {\n const store = new CredentialsStore();\n const backendUrl = resolveBackendUrl(options.backendUrl);\n\n try {\n await performVerificationLogin({\n backendUrlOption: backendUrl,\n frontendUrlOption: options.frontendUrl,\n store,\n });\n } catch (error) {\n if (error instanceof ApiError) {\n console.error(`\\nRequest failed (HTTP ${error.status}): ${error.message}`);\n } else {\n console.error(`\\nLogin failed: ${extractErrorMessage(error)}`);\n }\n process.exitCode = 1;\n }\n });\n\n auth\n .command('logout')\n .description('Remove stored CLI credentials.')\n .action(async () => {\n const store = new CredentialsStore();\n await store.clear();\n console.log('Credentials cleared.');\n });\n\n auth\n .command('status')\n .description('Show stored CLI credential details.')\n .action(async () => {\n const store = new CredentialsStore();\n const credentials = await store.load();\n if (!credentials) {\n console.log('No credentials stored.');\n return;\n }\n\n printStatus(credentials);\n });\n\n return auth;\n}\n\nfunction printStatus(credentials: StoredCredentials): void {\n if (credentials.accessToken) {\n const accessStatus = describeExpiry(credentials.accessTokenExpiresAt);\n const refreshStatus = credentials.refreshTokenExpiresAt\n ? describeExpiry(credentials.refreshTokenExpiresAt)\n : 'unknown expiry';\n console.log(\n `Authentication: Supabase access token (${accessStatus}), Refresh token (${refreshStatus})`,\n );\n return;\n }\n\n console.log('Authentication: Not configured');\n}\n\nfunction describeExpiry(iso?: string): string {\n if (!iso) {\n return 'unknown expiry';\n }\n const timestamp = Date.parse(iso);\n if (Number.isNaN(timestamp)) {\n return 'invalid timestamp';\n }\n const diff = timestamp - Date.now();\n const abs = Math.abs(diff);\n const descriptor = formatDuration(abs);\n return diff >= 0 ? `expires in ${descriptor}` : `expired ${descriptor} ago`;\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n", "import https from 'https';\nimport { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\n\ninterface NpmPackageInfo {\n 'dist-tags': {\n latest: string;\n };\n versions: Record<string, unknown>;\n}\n\ninterface PackageJson {\n name?: string;\n version?: string;\n}\n\n/**\n * Fetches the latest version of a package from the npm registry\n */\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\n return new Promise((resolve) => {\n const url = `https://registry.npmjs.org/${packageName}`;\n\n https\n .get(url, { timeout: 3000 }, (res) => {\n let data = '';\n\n res.on('data', (chunk) => {\n data += chunk;\n });\n\n res.on('end', () => {\n try {\n if (res.statusCode !== 200) {\n resolve(null);\n return;\n }\n\n const packageInfo = JSON.parse(data) as NpmPackageInfo;\n resolve(packageInfo['dist-tags']?.latest || null);\n } catch {\n resolve(null);\n }\n });\n })\n .on('error', () => {\n resolve(null);\n })\n .on('timeout', () => {\n resolve(null);\n });\n });\n}\n\n/**\n * Compares two semantic versions\n * Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal\n */\nfunction compareVersions(v1: string, v2: string): number {\n const parts1 = v1.split('.').map(Number);\n const parts2 = v2.split('.').map(Number);\n\n for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {\n const part1 = parts1[i] || 0;\n const part2 = parts2[i] || 0;\n\n if (part1 > part2) return 1;\n if (part1 < part2) return -1;\n }\n\n return 0;\n}\n\n/**\n * Checks if a newer version is available and logs a message if so.\n * This function is non-blocking and will not throw errors.\n */\nexport async function checkForUpdates(): Promise<void> {\n try {\n const packageJson = require('../../package.json') as PackageJson;\n const currentVersion = packageJson.version;\n const packageName = packageJson.name;\n\n if (!currentVersion || !packageName) {\n return;\n }\n\n // Fetch latest version from npm registry\n const latestVersion = await fetchLatestVersion(packageName);\n\n if (!latestVersion) {\n return;\n }\n\n // Compare versions\n if (compareVersions(latestVersion, currentVersion) > 0) {\n console.log('\\n' + '\u2550'.repeat(60));\n console.log('Update available!');\n console.log(`Current version: ${currentVersion}`);\n console.log(`Latest version: ${latestVersion}`);\n console.log(`Run \\`npm install -g ${packageName}@latest\\` to update`);\n console.log('\u2550'.repeat(60) + '\\n');\n }\n } catch {\n // Silently ignore any errors to not disrupt CLI operation\n }\n}\n\n/**\n * Checks for updates in the background without blocking\n */\nexport function checkForUpdatesInBackground(): void {\n // Run the check asynchronously without awaiting\n checkForUpdates().catch(() => {\n // Silently ignore any errors\n });\n}\n"],
5
- "mappings": "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",
6
- "names": ["path", "createRequire", "Command", "randomUUID", "prompt", "fs", "randomUUID", "fs", "path", "path", "path", "extractErrorMessage", "fs", "os", "path", "extractErrorMessage", "info", "output", "fs", "path", "z", "prompt", "randomUUID", "query", "input", "createSdkMcpServer", "tool", "z", "randomUUID", "randomUUID", "EventEmitter", "path", "extractErrorMessage", "normalizeBaseUrl", "input", "randomBytes", "base64UrlEncode", "input", "input", "extractErrorMessage", "EventEmitter", "extractErrorMessage", "randomUUID", "input", "output", "path", "readline", "WebSocket", "safeStringify", "path", "extractErrorMessage", "buildRelayWebsocketUrl", "path", "Command", "Command", "extractErrorMessage", "require", "packageJson", "require", "createRequire", "Command", "path"]
3
+ "sources": ["../src/cli.ts", "../src/commands/agent.ts", "../src/orchestrator/agent-orchestrator.ts", "../src/orchestrator/ai-client.ts", "../src/orchestrator/session.ts", "../src/orchestrator/utils/session-logger.ts", "../src/orchestrator/worker-manager.ts", "../src/orchestrator/tools/worker-status-tool.ts", "../src/orchestrator/utils/async-queue.ts", "../src/orchestrator/utils/worktree-manager.ts", "../src/utils/logger.ts", "../src/auth/credentials-store.ts", "../src/orchestrator/tools/worker-tools.ts", "../src/orchestrator/orchestrator-prompt.ts", "../src/orchestrator/utils/completions-manager.ts", "../src/config/omnara-config.ts", "../src/relay/relay-bridge.ts", "../src/http/api-client.ts", "../src/relay/relay-service.ts", "../src/auth/supabase-client.ts", "../src/auth/supabase-config.ts", "../src/auth/credential-manager.ts", "../src/utils/prompt.ts", "../src/auth/cli-auth-service.ts", "../src/auth/pkce.ts", "../src/auth/loopback-listener.ts", "../src/utils/browser.ts", "../src/auth/login-flow.ts", "../src/auth/auth-provider.ts", "../src/http/user-sessions.ts", "../../shared-js/dist/schemas/index.js", "../../shared-js/schemas/control_message.schema.json", "../../shared-js/schemas/message_envelope.schema.json", "../../shared-js/schemas/api_voice_launch_request.schema.json", "../../shared-js/schemas/api_voice_launch_response.schema.json", "../../shared-js/schemas/api_sessions_create_request.schema.json", "../../shared-js/schemas/api_sessions_summary.schema.json", "../../shared-js/schemas/api_sessions_list_response.schema.json", "../../shared-js/schemas/api_sessions_message_page_response.schema.json", "../../shared-js/schemas/api_sessions_agent_detail.schema.json", "../../shared-js/schemas/api_sessions_create_chat_message_request.schema.json", "../../shared-js/schemas/api_billing_subscription_response.schema.json", "../../shared-js/schemas/api_billing_usage_response.schema.json", "../../shared-js/schemas/api_billing_create_checkout_request.schema.json", "../../shared-js/schemas/api_billing_checkout_response.schema.json", "../../shared-js/schemas/api_billing_validate_promo_request.schema.json", "../../shared-js/schemas/api_billing_promo_validation_response.schema.json", "../../shared-js/schemas/api_billing_customer_portal_request.schema.json", "../../shared-js/schemas/api_billing_customer_portal_response.schema.json", "../../shared-js/schemas/api_settings_notification_request.schema.json", "../../shared-js/schemas/api_settings_notification_response.schema.json", "../src/repl/terminal-repl.ts", "../src/voice/voice-service.ts", "../src/utils/claude-code-check.ts", "../src/commands/auth.ts", "../src/utils/version-check.ts"],
4
+ "sourcesContent": ["import path from 'path';\nimport { createRequire } from 'node:module';\nimport { Command } from 'commander';\nimport {\n buildAgentCommand,\n buildAuthCommand,\n runAgentOrchestrator,\n type OrchestratorOptions,\n} from './commands/index.js';\nimport { checkForUpdatesInBackground } from './utils/version-check.js';\nimport { performClaudeCodeCheck } from './utils/claude-code-check.js';\nimport { logger } from './utils/logger.js';\n\nconst require = createRequire(import.meta.url);\n\ninterface PackageJson {\n description?: string;\n version?: string;\n}\n\nconst packageJson = require('../package.json') as PackageJson;\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('omnara')\n .description(packageJson.description ?? 'Command-line interface for Omnara.')\n .version(packageJson.version ?? '0.0.0')\n .option('--backend-url <url>', 'Override backend API base URL used for login')\n .option('--frontend-url <url>', 'Override frontend URL opened during login')\n .action(async () => {\n const options = program.opts<OrchestratorOptions>();\n await runAgentOrchestrator(options);\n });\n\n // Register top-level commands here.\n program.addCommand(buildAgentCommand());\n program.addCommand(buildAuthCommand());\n\n return program;\n}\n\nexport async function run(argv: readonly string[]): Promise<void> {\n const program = createProgram();\n\n // Check for Claude Code installation (non-blocking)\n performClaudeCodeCheck({ silent: false, exitOnMissing: false });\n\n // Check for updates in the background (non-blocking)\n checkForUpdatesInBackground();\n\n try {\n await program.parseAsync(argv as string[]);\n } catch (error) {\n // Commander will already have logged the error. Set non-zero exit for clarity.\n program.error((error as Error).message, { exitCode: 1 });\n }\n}\n\n// Check if this module is being run directly (ESM equivalent of require.main === module)\nfunction isMainModule(): boolean {\n // In ES modules, check if the current file URL matches the executed script\n if (!import.meta.url || !process.argv[1]) {\n return false;\n }\n\n // Convert process.argv[1] to a file URL for comparison\n const executedPath = path.resolve(process.argv[1]);\n const currentPath = import.meta.url.startsWith('file://')\n ? decodeURIComponent(import.meta.url.slice(7)) // Remove 'file://' prefix\n : import.meta.url;\n\n // Normalize paths for comparison\n return path.normalize(currentPath) === path.normalize(executedPath);\n}\n\nif (isMainModule()) {\n run(process.argv).catch((error: unknown) => {\n logger.error(error);\n process.exitCode = 1;\n });\n}\n", "import { Command } from 'commander';\nimport { startAgentOrchestrator } from '../orchestrator/agent-orchestrator.js';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport { RelayBridge } from '../relay/relay-bridge.js';\nimport { runTerminalRepl } from '../repl/terminal-repl.js';\nimport { ApiClient } from '../http/api-client.js';\nimport { registerRelaySession } from '../relay/relay-service.js';\nimport { launchVoiceForSession } from '../voice/voice-service.js';\nimport { createAuthProvider } from '../auth/auth-provider.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from '../auth/login-flow.js';\nimport { getClaudeCodeVersion } from '../utils/claude-code-check.js';\nimport { logger, extractErrorMessage } from '../utils/logger.js';\n\nexport function buildAgentCommand(): Command {\n const agent = new Command('agent').description(\n 'Utilities for interacting with the Omnara Claude agent.',\n );\n\n agent\n .command('orchestrator')\n .alias('server')\n .description('Start the Omnara agent orchestrator.')\n .option('--backend-url <url>', 'Override backend API base URL used for login')\n .option('--frontend-url <url>', 'Override frontend URL opened during login')\n .action(async (options: OrchestratorOptions) => {\n await runAgentOrchestrator(options);\n });\n\n agent\n .command('repl')\n .description('Start the Omnara agent REPL connected through the backend relay.')\n .requiredOption('--session-id <id>', 'Connect to an existing parent agent session')\n .requiredOption('--user-session-id <id>', 'User session that owns the agent session')\n .option('--backend-url <url>', 'Override backend API base URL used for login')\n .option('--frontend-url <url>', 'Override frontend URL opened during login')\n .action(async (options: ReplCommandOptions) => {\n await runRepl(options);\n });\n\n agent\n .command('voice')\n .description('Dispatch the LiveKit voice agent for an existing session.')\n .requiredOption('--session-id <id>', 'Agent session to connect the voice worker to')\n .option('--backend-url <url>', 'Override backend API base URL used for login')\n .option('--frontend-url <url>', 'Override frontend URL opened during login')\n .option('--room-name <name>', 'Override the LiveKit room name used for the call')\n .option('--force', 'Launch even if the CLI relay is offline')\n .action(async (options: VoiceCommandOptions) => {\n await runVoice(options);\n });\n\n return agent;\n}\n\nexport interface OrchestratorOptions {\n backendUrl?: string;\n frontendUrl?: string;\n}\n\ninterface ReplCommandOptions {\n sessionId: string;\n userSessionId: string;\n backendUrl?: string;\n frontendUrl?: string;\n}\n\ninterface VoiceCommandOptions {\n sessionId: string;\n backendUrl?: string;\n frontendUrl?: string;\n roomName?: string;\n force?: boolean;\n}\n\nexport async function runAgentOrchestrator(options: OrchestratorOptions = {}): Promise<void> {\n // Log Claude Code status\n const claudeVersion = getClaudeCodeVersion();\n if (claudeVersion) {\n logger.info(`\u2713 Claude Code detected: ${claudeVersion}`);\n } else {\n logger.info('\u2139 Running without Claude Code integration');\n }\n\n const orchestrator = await startAgentOrchestrator();\n\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const store = new CredentialsStore();\n const bridge = new RelayBridge(orchestrator, {\n store,\n logger: console,\n backendUrl,\n frontendUrl,\n });\n\n const stop = async () => {\n await bridge.stop();\n await orchestrator.stop();\n };\n\n const signalHandler = createSignalHandler(stop);\n process.on('SIGINT', signalHandler.handler);\n process.on('SIGTERM', signalHandler.handler);\n\n try {\n await bridge.start();\n } catch (error) {\n logger.error(`Relay orchestrator terminated: ${extractErrorMessage(error)}`);\n process.exitCode = process.exitCode || 1;\n } finally {\n await stop();\n signalHandler.remove();\n }\n}\n\nfunction createSignalHandler(onStop: () => Promise<void>) {\n let stopping = false;\n\n const handler = (signal: NodeJS.Signals) => {\n if (stopping) {\n return;\n }\n stopping = true;\n logger.important(`\\nReceived ${signal}. Shutting down agent orchestrator...`);\n void onStop().catch((error) => {\n logger.error('Error while shutting down agent orchestrator:', error);\n });\n };\n\n const remove = () => {\n process.removeListener('SIGINT', handler);\n process.removeListener('SIGTERM', handler);\n };\n\n return { handler, remove };\n}\n\nasync function runRepl(options: ReplCommandOptions): Promise<void> {\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const store = new CredentialsStore();\n const authProvider = await createAuthProvider({\n store,\n backendUrl,\n frontendUrl,\n logger: console,\n });\n\n const client = new ApiClient({ baseUrl: backendUrl });\n const accessToken = await authProvider.getAccessToken();\n const registration = await registerRelaySession(client, accessToken, {\n userSessionId: options.userSessionId,\n clientKind: 'cli',\n });\n const wsUrl = buildRelayWebsocketUrl(backendUrl, registration.relayWsPath);\n\n logger.important(\n `Using agent session ${options.sessionId} (user session ${registration.userSessionId})`,\n );\n\n await runTerminalRepl({\n url: wsUrl,\n headers: {\n authorization: `Bearer ${accessToken}`,\n 'x-relay-token': registration.relayToken,\n },\n initialSessionId: options.sessionId,\n });\n}\n\nasync function runVoice(options: VoiceCommandOptions): Promise<void> {\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const store = new CredentialsStore();\n const authProvider = await createAuthProvider({\n store,\n backendUrl,\n frontendUrl,\n logger: console,\n });\n\n const client = new ApiClient({ baseUrl: backendUrl });\n const launch = await launchVoiceForSession(client, await authProvider.getAccessToken(), {\n sessionId: options.sessionId,\n force: options.force ?? false,\n roomName: options.roomName,\n });\n\n logger.success('\\nVoice agent dispatched successfully.');\n logger.important(`Session ID: ${launch.sessionId}`);\n logger.important(`LiveKit URL: ${launch.livekitUrl}`);\n logger.important(`Room name: ${launch.roomName}`);\n logger.important(`Participant identity: ${launch.accessTokenIdentity}`);\n logger.important('\\nUse this token to join the room:');\n logger.important(launch.accessToken);\n logger.log('\\nOnce connected (for example via the LiveKit Agents playground),');\n logger.log('the voice worker will coordinate with the CLI coding agent through the relay.');\n logger.debug(`Relay websocket: ${launch.relayWsUrl}`);\n logger.debug(`Relay token (expires in ${launch.relayTokenExpiresIn}s):`);\n logger.debug(launch.relayToken);\n logger.important('\\nKeep this information secure\u2014tokens grant access to your agent session.');\n}\n\nfunction buildRelayWebsocketUrl(baseUrl: string, path: string): string {\n const url = new URL(baseUrl);\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n url.search = '';\n url.hash = '';\n if (path.startsWith('/')) {\n url.pathname = path;\n } else {\n const basePath = url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`;\n url.pathname = `${basePath}${path}`;\n }\n return url.toString();\n}\n", "import { randomUUID } from 'crypto';\nimport {\n AIClient,\n BASE_ALLOWED_ORCHESTRATOR_TOOLS,\n BASE_ALLOWED_WORKER_TOOLS,\n type AgentClient,\n} from './ai-client.js';\nimport { Session } from './session.js';\nimport { WorkerManager, type WorkerRecord, type WorkerMessageEvent } from './worker-manager.js';\nimport { createWorkerMcpServer } from './tools/worker-tools.js';\nimport type { InboundMessage, OutboundMessage } from './orchestrator-types.js';\nimport { ORCHESTRATOR_SYSTEM_PROMPT } from './orchestrator-prompt.js';\nimport { type McpServerConfig } from '@anthropic-ai/claude-agent-sdk';\nimport type { ControlMessageSchema } from '@omnara/shared-js/schemas';\nimport { CompletionsManager } from './utils/completions-manager.js';\nimport { readOmnaraConfig, isWorktreesEnabled } from '../config/omnara-config.js';\nimport { logger } from '../utils/logger.js';\n\ninterface AgentOrchestratorDependencies {\n createMainClient?: () => AgentClient;\n createWorkerClient?: (mcpServers?: Record<string, McpServerConfig>, cwd?: string) => AgentClient;\n workerManager?: WorkerManager;\n repoPath?: string;\n worktreesEnabled?: boolean;\n worktreesBaseRef?: string;\n}\n\nconst WORKER_LAUNCH_TOOL = 'mcp__worker__launch_worker';\nconst WORKER_GET_TOOL = 'mcp__worker__get_workers';\nconst WORKER_MESSAGE_TOOL = 'mcp__worker__message_worker';\n\ninterface ClientConnection {\n id: string;\n sessionIds: Set<string>;\n send: (message: OutboundMessage) => void;\n canSend?: () => boolean;\n close?: () => void;\n}\n\nexport interface AgentOrchestratorClientAdapter {\n send: (message: OutboundMessage) => void;\n canSend?: () => boolean;\n close?: () => void;\n}\n\nexport interface AgentOrchestratorConnection {\n id: string;\n dispatch(message: InboundMessage): void;\n disconnect(): void;\n}\n\nexport class AgentOrchestrator {\n private readonly completionsManager: CompletionsManager;\n private readonly aiClient: AgentClient;\n private readonly workerManager: WorkerManager;\n private readonly sessions = new Map<string, Session>();\n private readonly clients = new Map<string, ClientConnection>();\n private readonly toolUseMap = new Map<string, string>();\n // Track the main coding session (parent_session_id = null, type = CODE)\n private mainCodingSessionId: string | null = null;\n // Track voice sessions to filter out their messages\n readonly voiceSessionIds = new Set<string>(); // Made non-private for relay-bridge access\n\n private started = false;\n\n constructor(dependencies?: AgentOrchestratorDependencies) {\n const resolveSessionIdBySdk = (sdkSessionId?: string) =>\n this.findSessionIdBySdkSession(sdkSessionId);\n\n const workerClientFactory =\n dependencies?.createWorkerClient ??\n ((mcpServers?: Record<string, McpServerConfig>, cwd?: string) =>\n new AIClient({\n defaults: {\n allowedTools: [...BASE_ALLOWED_WORKER_TOOLS, 'mcp__worker_status__send_status_update'],\n mcpServers,\n cwd: cwd || process.cwd(),\n },\n }));\n\n this.workerManager =\n dependencies?.workerManager ??\n new WorkerManager({\n createClient: workerClientFactory,\n resolveSessionIdBySdk,\n repoPath: dependencies?.repoPath ?? process.cwd(),\n worktreesEnabled: dependencies?.worktreesEnabled ?? false,\n worktreesBaseRef: dependencies?.worktreesBaseRef,\n });\n\n const workerMcpServer = createWorkerMcpServer(this.workerManager, {\n resolveSessionIdBySdk,\n resolveSessionIdByToolUse: (toolUseId: string) => this.consumeToolUse(toolUseId),\n // Always use main coding session as parent for workers\n getMainCodingSessionId: () => this.mainCodingSessionId,\n });\n\n const mainClientFactory =\n dependencies?.createMainClient ??\n (() =>\n new AIClient({\n defaults: {\n allowedTools: [\n ...BASE_ALLOWED_ORCHESTRATOR_TOOLS,\n WORKER_LAUNCH_TOOL,\n WORKER_GET_TOOL,\n WORKER_MESSAGE_TOOL,\n ],\n mcpServers: {\n worker: workerMcpServer,\n },\n systemPrompt: ORCHESTRATOR_SYSTEM_PROMPT,\n },\n }));\n\n this.aiClient = mainClientFactory();\n\n this.registerWorkerListeners();\n\n this.completionsManager = new CompletionsManager();\n }\n\n ensureSessionExists(sessionId: string): Session {\n const existing = this.sessions.get(sessionId);\n if (existing) {\n return existing;\n }\n const session = new Session(\n sessionId,\n this.aiClient,\n (id) => this.handleSessionEmpty(id),\n (toolUseId) => this.registerToolUse(toolUseId, sessionId),\n );\n this.sessions.set(sessionId, session);\n return session;\n }\n\n getSession(sessionId: string): Session | undefined {\n return this.sessions.get(sessionId);\n }\n\n getWorkerManager(): WorkerManager {\n return this.workerManager;\n }\n\n setMainCodingSessionId(sessionId: string): void {\n if (!this.mainCodingSessionId) {\n this.mainCodingSessionId = sessionId;\n console.log(`[Orchestrator] Set main coding session: ${this.mainCodingSessionId}`);\n }\n }\n\n addClient(adapter: AgentOrchestratorClientAdapter): AgentOrchestratorConnection {\n const clientId = randomUUID();\n const connection: ClientConnection = {\n id: clientId,\n sessionIds: new Set(),\n send: adapter.send,\n canSend: adapter.canSend,\n close: adapter.close,\n };\n\n this.clients.set(clientId, connection);\n\n let disconnected = false;\n const disconnect = (): void => {\n if (disconnected) {\n return;\n }\n disconnected = true;\n this.handleDisconnect(connection);\n try {\n connection.close?.();\n } catch (error) {\n console.error('Failed to close client connection:', error);\n }\n };\n\n return {\n id: clientId,\n dispatch: (message: InboundMessage) => {\n this.handleClientMessage(connection, message);\n },\n disconnect,\n };\n }\n\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n this.started = true;\n }\n\n async stop(): Promise<void> {\n // Shutdown worker manager first to clean up all worktrees\n await this.workerManager.shutdown();\n\n for (const connection of Array.from(this.clients.values())) {\n this.handleDisconnect(connection);\n try {\n connection.close?.();\n } catch (error) {\n console.error('Failed to close client connection:', error);\n }\n }\n this.clients.clear();\n\n for (const session of this.sessions.values()) {\n session.close();\n }\n this.sessions.clear();\n this.started = false;\n }\n\n async cancel(): Promise<void> {\n await Promise.all(\n this.getWorkerManager()\n .listWorkers()\n .filter((w) => w.status === 'running')\n .map((worker) => {\n return this.getWorkerManager().cancelWorker(worker.id);\n }),\n );\n await this.aiClient.cancel();\n }\n\n private handleDisconnect(connection: ClientConnection): void {\n for (const sessionId of connection.sessionIds) {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.unsubscribe(connection.id);\n }\n }\n\n this.clients.delete(connection.id);\n }\n\n private handleClientMessage(connection: ClientConnection, message: InboundMessage): void {\n switch (message.type) {\n case 'chat':\n this.handleChatMessage(connection, message);\n break;\n case 'session_init':\n this.handleSessionInit(connection, message);\n break;\n case 'join':\n this.handleJoin(connection, message.sessionId);\n break;\n case 'leave':\n this.handleLeave(connection, message.sessionId);\n break;\n case 'ping':\n this.sendToConnection(connection, { type: 'pong' });\n break;\n case 'cancel_worker':\n this.handleCancelWorker(connection, message.workerId);\n break;\n default:\n this.sendToConnection(connection, {\n type: 'error',\n message: `Unsupported message type: ${(message as { type: string }).type}`,\n });\n }\n }\n\n private handleSessionInit(\n connection: ClientConnection,\n message: Extract<InboundMessage, { type: 'session_init' }>,\n ): void {\n // Track the main coding session (parent = null, type = CODE)\n if (!message.parentSessionId && message.metadata?.session_type === 'CODE') {\n this.mainCodingSessionId = message.sessionId;\n console.log(`[Orchestrator] Set main coding session: ${this.mainCodingSessionId}`);\n }\n\n // Track voice sessions to filter out their messages\n if (message.metadata?.session_type === 'VOICE') {\n this.voiceSessionIds.add(message.sessionId);\n console.log(`[Orchestrator] Tracking voice session from init:`, {\n sessionId: message.sessionId,\n sessionType: message.metadata?.session_type,\n parentSessionId: message.parentSessionId,\n currentVoiceSessions: Array.from(this.voiceSessionIds),\n });\n }\n\n this.sendToConnection(connection, {\n type: 'session_init_ack',\n sessionId: message.sessionId,\n parentSessionId: message.parentSessionId ?? null,\n });\n }\n\n private handleChatMessage(\n connection: ClientConnection,\n message: Extract<InboundMessage, { type: 'chat' }>,\n ): void {\n console.log('[Orchestrator] handleChatMessage:', {\n sessionId: message.sessionId,\n senderId: message.senderId,\n senderKind: message.senderKind,\n mainCodingSessionId: this.mainCodingSessionId,\n isVoiceSession: message.sessionId ? this.voiceSessionIds.has(message.sessionId) : false,\n textPreview: message.text.substring(0, 100),\n });\n\n // Filter out messages TO voice sessions - they should be handled by voice agent, not orchestrator\n if (message.sessionId && this.voiceSessionIds.has(message.sessionId)) {\n console.log('[Orchestrator] Ignoring message to voice session:', message.sessionId);\n return;\n }\n\n let session: Session | undefined;\n let sessionId = message.sessionId;\n\n if (sessionId) {\n session = this.sessions.get(sessionId);\n if (!session) {\n this.sendToConnection(connection, {\n type: 'error',\n sessionId,\n message: 'Session not found.',\n });\n return;\n }\n } else {\n session = this.createSession();\n sessionId = session.id;\n this.sendToConnection(connection, {\n type: 'session_created',\n sessionId,\n });\n }\n\n if (!connection.sessionIds.has(sessionId)) {\n session.subscribe({\n id: connection.id,\n send: (payload) => {\n this.sendToConnection(connection, payload);\n },\n canSend: connection.canSend,\n });\n connection.sessionIds.add(sessionId);\n }\n\n session.logInbound({ type: 'chat', text: message.text });\n session.announceInboundMessage(message.text, 'user');\n session.enqueueUserMessage(message.text);\n }\n\n private handleJoin(connection: ClientConnection, sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.sendToConnection(connection, {\n type: 'error',\n sessionId,\n message: 'Session not found.',\n });\n return;\n }\n\n if (!connection.sessionIds.has(sessionId)) {\n session.subscribe({\n id: connection.id,\n send: (payload) => {\n this.sendToConnection(connection, payload);\n },\n canSend: connection.canSend,\n });\n connection.sessionIds.add(sessionId);\n } else {\n this.sendToConnection(connection, {\n type: 'session_joined',\n sessionId,\n });\n }\n }\n\n private handleLeave(connection: ClientConnection, sessionId: string): void {\n if (!connection.sessionIds.has(sessionId)) {\n this.sendToConnection(connection, {\n type: 'error',\n sessionId,\n message: 'You are not subscribed to this session.',\n });\n return;\n }\n\n connection.sessionIds.delete(sessionId);\n const session = this.sessions.get(sessionId);\n if (session) {\n session.unsubscribe(connection.id);\n }\n }\n\n private handleCancelWorker(connection: ClientConnection, workerId: string): void {\n const canceled = this.workerManager.cancelWorker(workerId);\n if (!canceled) {\n this.sendToConnection(connection, {\n type: 'error',\n message: `Worker ${workerId} not found or not running.`,\n });\n }\n }\n\n private createSession(): Session {\n const sessionId = randomUUID();\n return this.ensureSessionExists(sessionId);\n }\n\n private registerToolUse(toolUseId: string, sessionId: string): void {\n this.toolUseMap.set(toolUseId, sessionId);\n }\n\n private consumeToolUse(toolUseId: string): string | undefined {\n const sessionId = this.toolUseMap.get(toolUseId);\n if (sessionId) {\n this.toolUseMap.delete(toolUseId);\n }\n return sessionId;\n }\n\n private handleSessionEmpty(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return;\n }\n\n if (!session.hasSubscribers()) {\n session.close();\n this.sessions.delete(sessionId);\n }\n }\n\n private registerWorkerListeners(): void {\n this.workerManager.on('session_start', (record) => {\n this.handleWorkerSessionStart(record);\n });\n\n this.workerManager.on('message', (event: WorkerMessageEvent) => {\n this.handleWorkerMessage(event);\n });\n\n this.workerManager.on('update', (record) => {\n this.broadcastAgentProgress(record);\n });\n\n this.workerManager.on('completed', (record) => {\n this.broadcastAgentProgress(record);\n this.handleWorkerCompletion(record);\n });\n }\n\n private broadcastAgentProgress(record: WorkerRecord): void {\n const progress = this.buildAgentProgress(record);\n // Worker progress updates should use the worker's own session ID\n const targetSessionId = record.sessionId;\n console.log('[Orchestrator] Broadcasting agent_progress:', {\n agentSessionId: record.sessionId,\n task: record.task,\n status: progress.status,\n originSessionId: record.originSessionId,\n });\n this.broadcastToAll({\n type: 'agent_progress',\n sessionId: targetSessionId,\n status: progress.status,\n detail: progress.detail,\n metadata: progress.metadata,\n messageId: randomUUID(), // Always use a valid UUID for message_id\n });\n }\n\n private buildAgentProgress(record: WorkerRecord): {\n status: string;\n detail?: string;\n metadata?: Record<string, unknown>;\n } {\n const latest =\n record.progress.length > 0 ? record.progress[record.progress.length - 1]?.message : undefined;\n\n // Create a concise one-line summary\n let summary: string | undefined;\n if (record.status === 'completed') {\n summary = record.result || `Task \"${record.task}\" completed`;\n } else if (record.status === 'error') {\n summary = `Task \"${record.task}\" failed: ${record.error || 'Unknown error'}`;\n } else if (record.status === 'canceled') {\n summary = `Task \"${record.task}\" was canceled`;\n } else if (record.status === 'running') {\n summary = latest || `Task \"${record.task}\" is running`;\n }\n\n const detail = summary ?? latest ?? undefined;\n\n const metadata: Record<string, unknown> = {\n agent_session_id: record.sessionId,\n task: record.task,\n last_update_at: record.lastUpdateAt,\n };\n\n if (record.originSessionId) {\n metadata.origin_session_id = record.originSessionId;\n }\n if (latest) {\n metadata.latest_message = latest;\n }\n if (record.result) {\n metadata.result = record.result;\n }\n if (record.error) {\n metadata.error = record.error;\n }\n\n return {\n status: record.status,\n detail,\n metadata,\n };\n }\n\n private handleWorkerSessionStart(record: WorkerRecord): void {\n // Include task in metadata for persistence\n const metadata = {\n ...record.metadata,\n task: record.task,\n };\n\n this.broadcastToAll({\n type: 'session_init',\n sessionId: record.sessionId,\n parentSessionId: record.originSessionId ?? null,\n metadata,\n messageId: randomUUID(),\n });\n }\n\n private handleWorkerMessage(event: WorkerMessageEvent): void {\n console.log('[Orchestrator] handleWorkerMessage:', {\n messageType: event.messageType,\n workerId: event.record.id,\n task: event.record.task,\n workerSessionId: event.record.sessionId,\n originSessionId: event.record.originSessionId,\n });\n\n // Worker messages should use the worker's own session ID\n // The parent-child relationship is already established via session_init\n const targetSessionId = event.record.sessionId;\n\n switch (event.messageType) {\n case 'assistant_text':\n if (!event.text) {\n return;\n }\n this.broadcastToAll({\n type: 'assistant_text',\n sessionId: targetSessionId,\n text: event.text,\n workerId: event.record.id,\n workerTask: event.record.task,\n messageId: randomUUID(),\n });\n break;\n case 'assistant_complete':\n {\n const completionMetadata: Record<string, unknown> = {\n agent_session_id: event.record.id,\n task: event.record.task,\n };\n if (event.record.originSessionId) {\n completionMetadata.origin_session_id = event.record.originSessionId;\n }\n this.broadcastToAll({\n type: 'agent_complete',\n sessionId: targetSessionId,\n success: event.success ?? true,\n message: event.text,\n metadata: completionMetadata,\n messageId: randomUUID(),\n });\n }\n break;\n case 'tool_call':\n if (!event.toolName || !event.toolUseId) {\n return;\n }\n console.log('[Orchestrator] Broadcasting worker tool_call:', {\n toolName: event.toolName,\n workerId: event.record.id,\n task: event.record.task,\n targetSessionId,\n toolUseId: event.toolUseId,\n });\n this.broadcastToAll({\n type: 'tool_call',\n sessionId: targetSessionId,\n toolName: event.toolName,\n toolUseId: event.toolUseId,\n input: event.toolInput,\n workerId: event.record.id,\n workerTask: event.record.task,\n messageId: randomUUID(),\n });\n break;\n case 'tool_result':\n if (!event.toolUseId) {\n return;\n }\n console.log('[Orchestrator] Broadcasting worker tool_result:', {\n toolName: event.toolName,\n workerId: event.record.id,\n task: event.record.task,\n targetSessionId,\n toolUseId: event.toolUseId,\n });\n this.broadcastToAll({\n type: 'tool_result',\n sessionId: targetSessionId,\n toolUseId: event.toolUseId,\n content: event.toolContent,\n isError: event.isError,\n workerId: event.record.id,\n workerTask: event.record.task,\n messageId: randomUUID(),\n });\n break;\n default:\n break;\n }\n }\n\n private handleWorkerCompletion(record: WorkerRecord): void {\n const sessionId = record.originSessionId;\n if (!sessionId) {\n return;\n }\n\n const session = this.sessions.get(sessionId);\n if (!session) {\n return;\n }\n\n const summary = this.buildWorkerSummary(record);\n if (!summary) {\n return;\n }\n\n // Broadcast result message for worker with task context to parent session\n const success = record.status === 'completed';\n const durationMs = record.lastUpdateAt - record.startedAt;\n const metadata: Record<string, unknown> = {\n agent_session_id: record.sessionId,\n task: record.task,\n origin_session_id: record.originSessionId,\n };\n if (record.result) {\n metadata.result = record.result;\n }\n if (record.error) {\n metadata.error = record.error;\n }\n\n this.broadcastToAll({\n type: 'agent_complete',\n sessionId: record.sessionId, // Use worker's session ID\n success,\n durationMs,\n message: `[${record.task}] ${summary}`,\n metadata,\n messageId: randomUUID(),\n });\n\n session.logInbound({\n type: 'worker_result',\n workerId: record.id,\n workerTask: record.task,\n summary,\n });\n session.announceInboundMessage(summary, 'worker', record.id, record.task);\n\n // Send comprehensive worker status message to orchestrator's conversation for LLM context\n const statusMessage = this.buildWorkerStatusMessage(record.id);\n session.enqueueUserMessage(statusMessage, {\n triggeredBy: 'worker_completion',\n workerId: record.id,\n workerTask: record.task,\n });\n }\n\n private buildWorkerSummary(record: WorkerRecord): string | null {\n switch (record.status) {\n case 'completed':\n return record.result ?? `Worker ${record.id} completed.`;\n case 'error':\n return `Worker ${record.id} failed: ${record.error ?? 'Unknown error.'}`;\n case 'canceled':\n return `Worker ${record.id} was canceled.`;\n default:\n return null;\n }\n }\n\n /**\n * Build a comprehensive worker status message showing ALL workers,\n * with special highlighting for the worker that triggered this generation.\n */\n private buildWorkerStatusMessage(triggerWorkerId: string): string {\n const allWorkers = this.workerManager.listWorkers();\n\n if (allWorkers.length === 0) {\n return '\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n[AUTOMATED SYSTEM NOTIFICATION: WORKER STATUS UPDATE]\\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\\nNo active workers.\\n\\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\nEND OF AUTOMATED NOTIFICATION\\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550';\n }\n\n const lines: string[] = [\n '\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550',\n '[AUTOMATED SYSTEM NOTIFICATION: WORKER STATUS UPDATE]',\n '\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550',\n '',\n 'This is an automated notification triggered by a worker completion.',\n 'You should provide an INCREMENTAL summary of only the NEW completion to the user.',\n '',\n ];\n\n for (const worker of allWorkers) {\n const isTrigger = worker.id === triggerWorkerId;\n const prefix = isTrigger ? '>>> ' : ' ';\n const triggerNote = isTrigger ? ' \u2190 JUST COMPLETED (triggered this generation)' : '';\n\n const latestMsg =\n worker.progress.length > 0\n ? worker.progress[worker.progress.length - 1]?.message\n : undefined;\n\n lines.push(`${prefix}Task: \"${worker.task}\"${triggerNote}`);\n lines.push(`${prefix}Status: ${worker.status}`);\n lines.push(`${prefix}Worker ID: ${worker.id}`);\n\n if (worker.status === 'completed') {\n // For completed workers, include the full result and progress log\n if (worker.result) {\n lines.push(`${prefix}Result: ${worker.result}`);\n }\n\n // Include the full progress log so orchestrator can see everything the worker did\n if (worker.progress.length > 0) {\n lines.push(`${prefix}Full Progress Log:`);\n for (const entry of worker.progress) {\n // Format timestamp as relative time\n const timestamp = new Date(entry.timestamp).toISOString();\n lines.push(`${prefix} [${timestamp}] ${entry.message}`);\n }\n }\n } else if (worker.status === 'error' && worker.error) {\n lines.push(`${prefix}Error: ${worker.error}`);\n\n // Include progress log for errors too, to see what led to the failure\n if (worker.progress.length > 0) {\n lines.push(`${prefix}Progress Before Error:`);\n for (const entry of worker.progress) {\n const timestamp = new Date(entry.timestamp).toISOString();\n lines.push(`${prefix} [${timestamp}] ${entry.message}`);\n }\n }\n } else if (worker.status === 'running' && latestMsg) {\n lines.push(`${prefix}Latest: ${latestMsg}`);\n }\n\n lines.push('');\n }\n\n lines.push('\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550');\n lines.push('END OF AUTOMATED NOTIFICATION');\n lines.push('\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550');\n\n return lines.join('\\n');\n }\n\n private broadcastToAll(message: OutboundMessage): void {\n for (const connection of this.clients.values()) {\n this.sendToConnection(connection, message);\n }\n }\n\n private findSessionIdBySdkSession(sdkSessionId?: string): string | undefined {\n if (!sdkSessionId) {\n return undefined;\n }\n for (const [serverId, session] of this.sessions.entries()) {\n if (session.sdkSessionIdentifier === sdkSessionId) {\n return serverId;\n }\n }\n return undefined;\n }\n\n private sendToConnection(connection: ClientConnection, message: OutboundMessage): void {\n if (connection.canSend && !connection.canSend()) {\n return;\n }\n try {\n connection.send(message);\n } catch (error) {\n console.error('Failed to send message to client:', error);\n this.handleDisconnect(connection);\n }\n }\n\n async getCompletions(\n request: ControlMessageSchema.CompletionsRequest,\n ): Promise<ControlMessageSchema.CompletionsResponse> {\n return {\n type: 'completions',\n completions: await this.completionsManager.getCompletion(request.query),\n };\n }\n}\n\nexport async function startAgentOrchestrator(\n dependencies?: AgentOrchestratorDependencies,\n): Promise<AgentOrchestrator> {\n // Read config before creating orchestrator to avoid race condition\n let worktreesEnabled = dependencies?.worktreesEnabled ?? false;\n let worktreesBaseRef = dependencies?.worktreesBaseRef;\n\n // Only read config if worktree settings aren't explicitly provided\n if (dependencies?.worktreesEnabled === undefined) {\n try {\n const config = await readOmnaraConfig();\n worktreesEnabled = isWorktreesEnabled(config);\n worktreesBaseRef = config.worktrees.base_ref;\n\n if (worktreesEnabled) {\n logger.info('Worktrees enabled via omnara.jsonc configuration');\n } else {\n logger.info('Worktrees disabled (no worktrees config found in omnara.jsonc)');\n }\n } catch (err) {\n logger.error('Failed to read omnara.jsonc configuration:', err);\n logger.info('Worktrees disabled due to config read error');\n worktreesEnabled = false;\n worktreesBaseRef = undefined;\n }\n }\n\n const server = new AgentOrchestrator({\n ...dependencies,\n worktreesEnabled,\n worktreesBaseRef,\n });\n await server.start();\n return server;\n}\n", "import fs from 'fs';\nimport {\n query,\n type Options,\n type Query,\n type SDKMessage,\n type SDKUserMessage,\n} from '@anthropic-ai/claude-agent-sdk';\n\nexport interface AIClientConfig {\n defaults?: Partial<Options>;\n}\n\nexport interface AgentClient {\n streamUserMessage(prompt: string, overrides?: Partial<Options>): AsyncIterable<SDKMessage>;\n createQuery(prompt: string | AsyncIterable<SDKUserMessage>, overrides?: Partial<Options>): Query;\n cancel(): Promise<void>;\n}\n\nexport const BASE_ALLOWED_ORCHESTRATOR_TOOLS = [\n 'Glob',\n 'Grep',\n 'LS',\n 'Read',\n 'WebFetch',\n 'WebSearch',\n 'TodoWrite',\n] as const;\n\nexport const BASE_ALLOWED_WORKER_TOOLS = [\n 'Task',\n 'Bash',\n 'Glob',\n 'Grep',\n 'LS',\n 'ExitPlanMode',\n 'Read',\n 'Edit',\n 'MultiEdit',\n 'Write',\n 'NotebookEdit',\n 'WebFetch',\n 'TodoWrite',\n 'WebSearch',\n 'BashOutput',\n 'KillBash',\n 'Skill',\n 'SlashCommand',\n] as const;\n\nexport class AIClient implements AgentClient {\n private readonly baseOptions: Options;\n private runningQuery?: Query;\n\n constructor(config?: AIClientConfig) {\n const defaultOptions: Options = {\n maxTurns: 100,\n model: 'sonnet',\n cwd: process.cwd(),\n includePartialMessages: false,\n allowedTools: [...BASE_ALLOWED_ORCHESTRATOR_TOOLS],\n settingSources: [\"user\", \"project\", \"local\"]\n };\n\n this.baseOptions = {\n ...defaultOptions,\n ...config?.defaults,\n };\n\n // Log when using a custom cwd (for debugging worktree isolation)\n if (this.baseOptions.cwd && this.baseOptions.cwd !== process.cwd()) {\n console.log('[AIClient] Using custom working directory:', this.baseOptions.cwd);\n }\n\n this.ensureWorkingDirectory(this.baseOptions.cwd);\n }\n\n async *streamUserMessage(\n prompt: string,\n overrides?: Partial<Options>,\n ): AsyncIterable<SDKMessage> {\n const q = this.createQuery(prompt, overrides);\n this.runningQuery = q;\n for await (const message of q) {\n yield message;\n }\n this.runningQuery = undefined;\n }\n\n createQuery(prompt: string | AsyncIterable<SDKUserMessage>, overrides?: Partial<Options>): Query {\n const merged: Options = {\n ...this.baseOptions,\n ...overrides,\n };\n\n this.ensureWorkingDirectory(merged.cwd);\n\n return query({\n prompt,\n options: merged,\n });\n }\n\n async cancel() {\n await this.runningQuery?.interrupt();\n }\n\n private ensureWorkingDirectory(cwd?: string): void {\n if (!cwd) {\n return;\n }\n try {\n fs.mkdirSync(cwd, { recursive: true });\n } catch (error) {\n console.warn(`Failed to ensure working directory ${cwd}:`, error);\n }\n }\n}\n", "import type {\n SDKAssistantMessage,\n SDKMessage,\n SDKResultMessage,\n} from '@anthropic-ai/claude-agent-sdk';\nimport { randomUUID } from 'crypto';\nimport type { AgentClient } from './ai-client.js';\nimport type { OutboundMessage, SessionSubscriber } from './orchestrator-types.js';\nimport { createSessionLogger, type SessionLogger } from './utils/session-logger.js';\n\ntype StreamEvent = {\n type: string;\n [key: string]: unknown;\n};\n\ntype ToolUseCallback = (toolUseId: string, sessionId: string) => void;\n\nexport class Session {\n readonly id: string;\n\n private readonly aiClient: AgentClient;\n private readonly subscribers = new Map<string, SessionSubscriber>();\n private readonly onEmpty: (sessionId: string) => void;\n private readonly onToolUse?: ToolUseCallback;\n private readonly logger: SessionLogger;\n\n private sdkSessionId: string | null = null;\n private inflight: Promise<void> | null = null;\n private lastActivity = Date.now();\n\n constructor(\n id: string,\n aiClient: AgentClient,\n onEmpty: (sessionId: string) => void,\n onToolUse?: ToolUseCallback,\n ) {\n this.id = id;\n this.aiClient = aiClient;\n this.onEmpty = onEmpty;\n this.onToolUse = onToolUse;\n this.logger = createSessionLogger(this.id);\n }\n\n announceInboundMessage(\n text: string,\n origin: 'user' | 'worker' = 'user',\n workerId?: string,\n workerTask?: string,\n ): void {\n if (!text) {\n return;\n }\n // Only broadcast worker-origin updates. User messages already show up via `chat` frames.\n if (origin !== 'worker') {\n return;\n }\n const message: OutboundMessage = {\n type: 'user_text',\n sessionId: this.id,\n text,\n origin,\n workerId,\n workerTask,\n messageId: randomUUID(),\n };\n this.broadcast(message);\n }\n\n get lastActiveAt(): number {\n return this.lastActivity;\n }\n\n get sdkSessionIdentifier(): string | null {\n return this.sdkSessionId;\n }\n\n subscribe(subscriber: SessionSubscriber): void {\n this.subscribers.set(subscriber.id, subscriber);\n this.safeSend(subscriber, {\n type: 'session_joined',\n sessionId: this.id,\n messageId: randomUUID(),\n });\n }\n\n unsubscribe(subscriberId: string): void {\n this.subscribers.delete(subscriberId);\n if (!this.hasSubscribers() && !this.inflight) {\n this.onEmpty(this.id);\n }\n }\n\n hasSubscribers(): boolean {\n return this.subscribers.size > 0;\n }\n\n close(): void {\n this.subscribers.clear();\n this.logger.close();\n }\n\n enqueueUserMessage(\n text: string,\n metadata?: { triggeredBy?: string; workerId?: string; workerTask?: string },\n ): void {\n this.lastActivity = Date.now();\n const previous = this.inflight;\n\n const task = async (): Promise<void> => {\n if (previous) {\n try {\n await previous;\n } catch {\n // Previous error already reported, continue with new message.\n }\n }\n\n await this.processUserMessage(text, metadata);\n };\n\n const promise = task()\n .catch((error: unknown) => {\n this.broadcast({\n type: 'error',\n sessionId: this.id,\n message: extractErrorMessage(error),\n messageId: randomUUID(),\n });\n })\n .finally(() => {\n if (this.inflight === promise) {\n this.inflight = null;\n this.lastActivity = Date.now();\n if (!this.hasSubscribers()) {\n this.onEmpty(this.id);\n }\n }\n });\n\n this.inflight = promise;\n }\n\n handleStreamEvent(event: StreamEvent): void {\n switch (event.type) {\n case 'content_block_delta': {\n const delta = event.delta as { type?: string; text?: string } | undefined;\n if (delta?.type === 'text_delta' && delta.text) {\n console.log('[Session] Streaming text delta:', delta.text.substring(0, 50));\n this.broadcast({\n type: 'assistant_text',\n sessionId: this.id,\n text: delta.text,\n messageId: randomUUID(),\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n private async processUserMessage(\n text: string,\n metadata?: { triggeredBy?: string; workerId?: string; workerTask?: string },\n ): Promise<void> {\n // Broadcast metadata about this generation trigger\n if (metadata?.triggeredBy === 'worker_completion') {\n this.broadcast({\n type: 'system',\n sessionId: this.id,\n subtype: 'generation_triggered',\n metadata: {\n triggeredBy: 'worker_completion',\n workerId: metadata.workerId,\n workerTask: metadata.workerTask,\n },\n messageId: randomUUID(),\n });\n }\n\n const options = this.sdkSessionId ? { resume: this.sdkSessionId } : undefined;\n\n for await (const message of this.aiClient.streamUserMessage(text, options)) {\n this.routeSdkMessage(message);\n }\n }\n\n private routeSdkMessage(message: SDKMessage): void {\n switch (message.type) {\n case 'assistant':\n this.handleAssistantMessage(message);\n break;\n case 'stream_event':\n this.handleStreamEvent(message.event as StreamEvent);\n break;\n case 'result':\n this.handleResultMessage(message);\n break;\n case 'system':\n this.handleSystemMessage(message);\n break;\n case 'user': {\n const textContent = extractUserContent(message.message.content);\n if (textContent) {\n this.broadcast({\n type: 'user_text',\n sessionId: this.id,\n text: textContent,\n messageId: randomUUID(),\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n private handleAssistantMessage(message: SDKAssistantMessage): void {\n const content = message.message.content;\n\n if (!Array.isArray(content)) {\n return;\n }\n\n console.log('[Session] Processing assistant message with', content.length, 'blocks');\n\n for (const block of content) {\n if (!block || typeof block !== 'object') {\n continue;\n }\n\n const typed = block as unknown as Record<string, unknown>;\n const blockType = typed.type;\n\n if (blockType === 'text' && typeof typed.text === 'string') {\n if (typed.text.length > 0) {\n console.log('[Session] Broadcasting assistant_text:', typed.text.substring(0, 100));\n this.broadcast({\n type: 'assistant_text',\n sessionId: this.id,\n text: typed.text,\n messageId: randomUUID(),\n });\n }\n } else if (blockType === 'tool_use') {\n const toolUseId = typeof typed.id === 'string' && typed.id ? typed.id : randomUUID();\n console.log('[Session] Broadcasting tool_call:', typed.name, 'id:', toolUseId);\n this.broadcast({\n type: 'tool_call',\n sessionId: this.id,\n toolName: typeof typed.name === 'string' ? typed.name : 'unknown',\n toolUseId,\n input: typed.input,\n messageId: randomUUID(), // Always use a valid UUID for message_id\n });\n this.onToolUse?.(toolUseId, this.id);\n } else if (blockType === 'tool_result') {\n const toolResultId =\n typeof typed.tool_use_id === 'string' && typed.tool_use_id\n ? typed.tool_use_id\n : randomUUID();\n console.log('[Session] Broadcasting tool_result:', toolResultId);\n this.broadcast({\n type: 'tool_result',\n sessionId: this.id,\n toolUseId: toolResultId,\n content: typed.content,\n isError: Boolean(typed.is_error),\n messageId: randomUUID(), // Always use a valid UUID for message_id\n });\n }\n }\n }\n\n private handleResultMessage(message: SDKResultMessage): void {\n const success = message.subtype === 'success';\n this.broadcast({\n type: 'agent_complete',\n sessionId: this.id,\n success,\n durationMs: message.duration_ms,\n costUsd: message.total_cost_usd,\n message: success ? message.result : `Error: ${message.subtype}`,\n messageId: randomUUID(),\n });\n }\n\n private handleSystemMessage(message: Extract<SDKMessage, { type: 'system' }>): void {\n if (message.subtype === 'init') {\n this.sdkSessionId = message.session_id;\n }\n this.broadcast({\n type: 'system',\n sessionId: this.id,\n subtype: message.subtype,\n messageId: randomUUID(),\n });\n }\n\n logInbound(payload: unknown): void {\n this.logger.logInbound(payload);\n }\n\n private broadcast(message: OutboundMessage): void {\n this.logger.logOutbound(message);\n for (const [id, subscriber] of this.subscribers) {\n if (subscriber.canSend && !subscriber.canSend()) {\n this.subscribers.delete(id);\n continue;\n }\n this.safeSend(subscriber, message);\n }\n }\n\n private safeSend(subscriber: SessionSubscriber, message: OutboundMessage): void {\n try {\n subscriber.send(message);\n } catch {\n this.subscribers.delete(subscriber.id);\n }\n }\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n try {\n return JSON.stringify(error);\n } catch {\n return 'Unknown error';\n }\n}\n\nfunction extractUserContent(content: unknown): string | null {\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n const texts: string[] = [];\n for (const part of content) {\n if (\n part &&\n typeof part === 'object' &&\n 'type' in part &&\n (part as Record<string, unknown>).type === 'text' &&\n typeof (part as Record<string, unknown>).text === 'string'\n ) {\n texts.push((part as Record<string, unknown>).text as string);\n }\n }\n if (texts.length > 0) {\n return texts.join('');\n }\n }\n\n return null;\n}\n", "import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport type { OutboundMessage } from '../orchestrator-types.js';\n\nfunction getLogDir(): string {\n return process.env.OMNARA_LOG_DIR ?? path.join(os.homedir(), '.omnara', 'omnara-voice');\n}\n\nfunction ensureLogDir(): string {\n const dir = getLogDir();\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // ignore\n }\n return dir;\n}\n\nexport type SessionLogger = {\n logInbound: (payload: unknown) => void;\n logOutbound: (message: OutboundMessage) => void;\n close: () => void;\n};\n\nexport function createSessionLogger(sessionId: string): SessionLogger {\n const dir = ensureLogDir();\n const filePath = path.join(dir, `${sessionId}.log`);\n const stream = fs.createWriteStream(filePath, { flags: 'a' });\n\n const logLine = (direction: 'in' | 'out', payload: unknown) => {\n const timestamp = new Date().toISOString();\n const serialized = safeStringify(payload);\n stream.write(`${timestamp} [${direction}] ${serialized}\\n`);\n };\n\n return {\n logInbound: (payload) => logLine('in', payload),\n logOutbound: (message) => logLine('out', message),\n close: () => {\n try {\n stream.end();\n } catch {\n // ignore close errors\n }\n },\n };\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n", "import { EventEmitter } from 'events';\nimport { randomUUID } from 'crypto';\nimport type {\n Query,\n SDKMessage,\n SDKUserMessage,\n HookInput,\n HookJSONOutput,\n PostToolUseHookInput,\n McpServerConfig,\n} from '@anthropic-ai/claude-agent-sdk';\nimport { simpleGit } from 'simple-git';\nimport type { AgentClient } from './ai-client.js';\nimport { createWorkerStatusMcpServer, type StatusUpdateEvent } from './tools/worker-status-tool.js';\nimport { AsyncQueue } from './utils/async-queue.js';\nimport { WorktreeManager } from './utils/worktree-manager.js';\nimport { logger } from '../utils/logger.js';\n\nexport type WorkerStatus = 'running' | 'completed' | 'error' | 'canceled';\n\nexport interface WorkerProgressEntry {\n timestamp: number;\n message: string;\n}\n\nexport interface WorkerRecord {\n id: string;\n task: string;\n prompt: string;\n sessionId: string;\n status: WorkerStatus;\n startedAt: number;\n lastUpdateAt: number;\n originSessionId?: string;\n progress: WorkerProgressEntry[];\n result?: string;\n error?: string;\n metadata?: Record<string, unknown>;\n messageQueue: AsyncQueue<SDKUserMessage>;\n worktreePath?: string;\n branchName?: string;\n work_context?: string;\n worktree_name?: string;\n}\n\nexport interface WorkerMessageEvent {\n record: WorkerRecord;\n messageType: 'assistant_text' | 'assistant_complete' | 'tool_call' | 'tool_result';\n text?: string;\n success?: boolean;\n toolName?: string;\n toolUseId?: string;\n toolInput?: unknown;\n toolContent?: unknown;\n isError?: boolean;\n}\n\ninterface LaunchWorkerOptions {\n task: string;\n prompt: string;\n work_context: string;\n worktree_name: string;\n originSessionId?: string;\n metadata?: Record<string, unknown>;\n}\n\ninterface WorkerManagerOptions {\n createClient: (mcpServers?: Record<string, McpServerConfig>, cwd?: string) => AgentClient;\n resolveSessionIdBySdk?: (sdkSessionId?: string) => string | undefined;\n repoPath: string;\n worktreesEnabled: boolean;\n worktreesBaseRef?: string;\n}\n\nexport class WorkerManager extends EventEmitter {\n private readonly workers = new Map<string, WorkerRecord>();\n private readonly runningQueries = new Map<string, Query>();\n private worktreeManager: WorktreeManager;\n\n constructor(private readonly options: WorkerManagerOptions) {\n super();\n\n // Initialize WorktreeManager with the provided configuration\n this.worktreeManager = new WorktreeManager({\n repoPath: options.repoPath,\n enabled: options.worktreesEnabled,\n base_ref: options.worktreesBaseRef,\n });\n\n logger.info(\n `WorkerManager initialized with worktrees ${options.worktreesEnabled ? 'enabled' : 'disabled'}`,\n );\n }\n\n listWorkers(): WorkerRecord[] {\n return Array.from(this.workers.values());\n }\n\n getWorker(id: string): WorkerRecord | undefined {\n return this.workers.get(id);\n }\n\n getWorkerByTask(task: string): WorkerRecord | undefined {\n for (const worker of this.workers.values()) {\n if (worker.task === task) {\n return worker;\n }\n }\n return undefined;\n }\n\n /**\n * Get a formatted summary of all current worker statuses for inclusion in system prompts.\n * Returns a string describing all active workers and their current state.\n */\n getWorkerStatusSummary(): string {\n const workers = this.listWorkers();\n\n if (workers.length === 0) {\n return 'No active workers.';\n }\n\n const lines = ['## Current Worker Status'];\n lines.push('');\n\n for (const worker of workers) {\n const latestMsg =\n worker.progress.length > 0\n ? worker.progress[worker.progress.length - 1]?.message\n : undefined;\n\n lines.push(`**Task: \"${worker.task}\"**`);\n lines.push(`- Status: ${worker.status}`);\n lines.push(`- Worker ID: ${worker.id}`);\n\n if (worker.status === 'completed' && worker.result) {\n lines.push(`- Result: ${worker.result}`);\n } else if (worker.status === 'error' && worker.error) {\n lines.push(`- Error: ${worker.error}`);\n } else if (latestMsg) {\n lines.push(`- Latest: ${latestMsg}`);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n launchWorker(\n { task, prompt, work_context, worktree_name, originSessionId, metadata }: LaunchWorkerOptions,\n toolUseId?: string,\n ): WorkerRecord {\n // Use a single UUID for both worker ID and session ID to unify them\n const sessionId = randomUUID();\n const resolvedOriginSessionId = originSessionId;\n const record: WorkerRecord = {\n id: sessionId, // Worker ID is the same as session ID\n task,\n prompt,\n status: 'running',\n sessionId,\n startedAt: Date.now(),\n lastUpdateAt: Date.now(),\n originSessionId: resolvedOriginSessionId,\n progress: [],\n metadata,\n messageQueue: new AsyncQueue<SDKUserMessage>(),\n work_context,\n worktree_name,\n };\n\n this.workers.set(sessionId, record);\n this.emit('session_start', { ...record });\n this.emitUpdate(record);\n\n // Emit tool_call event for launch_worker to make it visible in the worker's session\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_call',\n toolName: 'mcp__worker__launch_worker',\n toolUseId,\n toolInput: { task, prompt, metadata },\n } satisfies WorkerMessageEvent);\n\n // Emit tool_result immediately after to show the worker was successfully launched\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId,\n toolContent: {\n workerId: record.id,\n status: record.status,\n message: `Worker launched successfully, task ${task} in progress.`,\n },\n isError: false,\n } satisfies WorkerMessageEvent);\n }\n\n // Create worktree and run worker asynchronously\n void this.createWorktreeAndRun(record, prompt);\n return record;\n }\n\n private async createWorktreeAndRun(record: WorkerRecord, prompt: string): Promise<void> {\n try {\n // Only create worktree if worktrees are enabled\n if (this.worktreeManager.isEnabled()) {\n // Create worktree for this worker\n logger.info(`Creating worktree for worker ${record.id} (task: ${record.task})`);\n const worktreeInfo = await this.worktreeManager.createWorktree(\n record.id,\n record.worktree_name || record.id,\n );\n\n // Update record with worktree information\n record.worktreePath = worktreeInfo.worktreePath;\n record.branchName = worktreeInfo.branchName;\n record.progress.push({\n timestamp: Date.now(),\n message: `Worktree created at ${worktreeInfo.worktreePath} on branch ${worktreeInfo.branchName}`,\n });\n this.emitUpdate(record);\n\n logger.info(`Worktree created for worker ${record.id} at ${worktreeInfo.worktreePath}`);\n } else {\n // Worktrees disabled, run in current working directory\n logger.info(`Worktrees disabled, worker ${record.id} will run in current directory`);\n record.progress.push({\n timestamp: Date.now(),\n message: 'Worktrees disabled, running in current directory',\n });\n this.emitUpdate(record);\n }\n\n // Run the worker (with or without worktree)\n await this.runWorker(record, prompt);\n } catch (error) {\n // Handle worktree creation failure or other errors\n logger.error(`Failed to setup worker ${record.id}:`, error);\n record.status = 'error';\n record.error = `Failed to setup worker: ${error instanceof Error ? error.message : String(error)}`;\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: `Worker failed: ${record.error}`,\n });\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: record.error,\n } satisfies WorkerMessageEvent);\n this.emitCompleted(record);\n\n // Close the message queue\n record.messageQueue.close();\n }\n }\n\n cancelWorker(id: string): boolean {\n const record = this.workers.get(id);\n if (!record) {\n return false;\n }\n\n if (record.status !== 'running') {\n return false;\n }\n\n record.status = 'canceled';\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: 'Worker canceled by user request.',\n });\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: 'Worker canceled by user request.',\n } satisfies WorkerMessageEvent);\n\n const query = this.runningQueries.get(id);\n if (query) {\n void query.interrupt().catch(() => {\n // Ignore interrupt errors; status already updated.\n });\n }\n\n // Close the message queue\n record.messageQueue.close();\n\n // Cleanup worktree asynchronously (will be handled in runWorker's catch block)\n // The worktree cleanup is handled in the runWorker method when it detects canceled status\n\n return true;\n }\n\n /**\n * Send a message to a worker (running or completed).\n *\n * @param task - The task name of the worker to message\n * @param message - The message content to send\n * @param interrupt - If true, interrupt current generation; if false, queue for next turn\n * @param toolUseId - Optional tool use ID to track this operation for relay forwarding\n * @returns true if message was sent, false if worker not found or message queue is closed\n */\n async messageWorker(\n task: string,\n message: string,\n interrupt: boolean,\n toolUseId?: string,\n ): Promise<boolean> {\n const record = this.getWorkerByTask(task);\n\n if (!record) {\n return false;\n }\n\n // Emit tool_call event for message_worker to make it visible in the worker's session\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_call',\n toolName: 'mcp__worker__message_worker',\n toolUseId,\n toolInput: { task, message, interrupt },\n } satisfies WorkerMessageEvent);\n }\n\n // Check if the worker needs to be restarted (completed, error, or canceled)\n if (record.status !== 'running') {\n // Create a new message queue for the restarted worker\n record.messageQueue = new AsyncQueue<SDKUserMessage>();\n\n record.status = 'running';\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: `Worker restarted with new message: ${message}`,\n });\n this.emitUpdate(record);\n\n // Restart the worker by calling runWorker again\n // The message will be consumed from the queue\n void this.runWorker(record, ''); // Empty prompt since we're resuming\n }\n\n // After potential restart, check if the queue is still closed (shouldn't happen)\n if (record.messageQueue.isClosed()) {\n console.error('[WorkerManager] Message queue is closed after restart attempt');\n return false;\n }\n\n // Log the message being sent to progress for internal tracking\n record.progress.push({\n timestamp: Date.now(),\n message: `[ORCHESTRATOR MESSAGE${interrupt ? ' - INTERRUPT' : ''}]: ${message}`,\n });\n record.lastUpdateAt = Date.now();\n\n // If interrupt is requested, interrupt the current query\n if (interrupt) {\n const query = this.runningQueries.get(record.id);\n if (query) {\n try {\n await query.interrupt();\n } catch (error) {\n console.error('[WorkerManager] Failed to interrupt worker:', error);\n }\n }\n }\n\n // Create SDK user message and push to queue\n const userMessage: SDKUserMessage = {\n session_id: record.sessionId,\n type: 'user',\n message: {\n role: 'user',\n content: message,\n },\n parent_tool_use_id: null,\n isSynthetic: true,\n };\n\n try {\n record.messageQueue.push(userMessage);\n\n // Emit tool_result to confirm message was queued/sent successfully\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId,\n toolContent: {\n success: true,\n task,\n interrupted: interrupt,\n message: interrupt\n ? `Message sent to worker \"${task}\" (interrupted current work)`\n : `Message queued for worker \"${task}\" (will be delivered after current turn)`,\n },\n isError: false,\n } satisfies WorkerMessageEvent);\n }\n\n return true;\n } catch (error) {\n console.error('[WorkerManager] Failed to queue message:', error);\n\n // Emit error result if we have a toolUseId\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId,\n toolContent: {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to queue message',\n },\n isError: true,\n } satisfies WorkerMessageEvent);\n }\n\n return false;\n }\n }\n\n private emitUpdate(record: WorkerRecord): void {\n this.emit('update', { ...record });\n }\n\n private emitCompleted(record: WorkerRecord): void {\n this.emit('completed', { ...record });\n }\n\n private handleStatusUpdate(record: WorkerRecord, event: StatusUpdateEvent): void {\n console.log('[WorkerManager] Status update received:', {\n workerId: record.id,\n task: record.task,\n message: event.message,\n metadata: event.metadata,\n });\n record.progress.push({\n timestamp: event.timestamp,\n message: event.message,\n });\n record.lastUpdateAt = event.timestamp;\n this.emitUpdate(record);\n }\n\n /**\n * Create an async iterable stream of user messages for the worker.\n * Yields the initial prompt, then streams any additional messages from the queue.\n * If initialPrompt is empty, skips the initial yield and only consumes from the queue.\n */\n private async *createMessageStream(\n initialPrompt: string,\n sessionId: string,\n messageQueue: AsyncQueue<SDKUserMessage>,\n ): AsyncIterable<SDKUserMessage> {\n // Only yield initial prompt if it's not empty (for worker restart/resume)\n if (initialPrompt.trim()) {\n yield {\n session_id: sessionId,\n type: 'user',\n message: {\n role: 'user',\n content: initialPrompt,\n },\n parent_tool_use_id: null,\n };\n }\n\n // Continue yielding messages from the queue\n for await (const message of messageQueue) {\n yield message;\n }\n }\n\n private async runWorker(record: WorkerRecord, prompt: string): Promise<void> {\n // Create status update MCP server for this worker\n const statusMcpServer = createWorkerStatusMcpServer((event: StatusUpdateEvent) => {\n this.handleStatusUpdate(record, event);\n });\n\n console.log('[WorkerManager] Creating worker client with status MCP server:', {\n workerId: record.id,\n task: record.task,\n hasMcpServer: !!statusMcpServer,\n worktreePath: record.worktreePath,\n branchName: record.branchName,\n });\n\n // Create client with status MCP server and worktree path as cwd\n const client = this.options.createClient(\n {\n worker_status: statusMcpServer,\n },\n record.worktreePath,\n );\n\n // Wrap the prompt with worker instructions including worktree information\n const workerPrompt = this.wrapPrompt(prompt, record.worktreePath, record.branchName);\n\n // Create message stream that includes initial prompt and any future messages\n const messageStream = this.createMessageStream(\n workerPrompt,\n record.sessionId,\n record.messageQueue,\n );\n\n // Create query with the message stream for continuous message support\n // Add PostToolUse hook to capture tool results\n // This hook fires AFTER a tool has been executed and allows us to intercept the result\n const query = client.createQuery(messageStream, {\n hooks: {\n PostToolUse: [\n {\n // No matcher means it applies to all tools (Bash, Read, Write, etc.)\n // If we wanted to only capture Bash results, we could add: matcher: 'Bash'\n hooks: [\n async (input: HookInput, toolUseID: string | undefined): Promise<HookJSONOutput> => {\n // Type guard to ensure we're handling PostToolUse events\n if (input.hook_event_name !== 'PostToolUse') {\n return {};\n }\n\n // Now we can safely access PostToolUse-specific fields\n const postToolInput = input as PostToolUseHookInput;\n\n console.log('[WorkerManager] PostToolUse hook triggered:', {\n toolName: postToolInput.tool_name,\n toolUseID,\n hasResponse: !!postToolInput.tool_response,\n workerId: record.id,\n task: record.task,\n });\n\n // Log the structure of the tool response for debugging\n if (postToolInput.tool_name === 'Bash') {\n console.log('[WorkerManager] Bash tool response structure:', {\n responseType: typeof postToolInput.tool_response,\n responseKeys: postToolInput.tool_response\n ? Object.keys(postToolInput.tool_response)\n : [],\n fullResponse: postToolInput.tool_response,\n });\n }\n\n // Emit tool_result message event for broadcasting\n // The tool_response from the hook contains the actual tool output\n // This will be picked up by the orchestrator and broadcast to the UI\n // where it will be paired with the corresponding tool_call by toolUseId\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId: toolUseID || randomUUID(),\n toolContent: postToolInput.tool_response,\n isError: false, // PostToolUse is for successful executions\n } satisfies WorkerMessageEvent);\n\n // Return empty object to not modify the tool response\n // We could return { suppressOutput: true } to prevent the tool result from\n // being sent to the assistant, but we want the assistant to see the results\n return {};\n },\n ],\n },\n ],\n },\n });\n\n // Store the query reference for interrupt support\n this.runningQueries.set(record.id, query);\n\n const summarizedChunks: string[] = [];\n\n try {\n for await (const message of query) {\n this.handleMessage(record, message, summarizedChunks);\n }\n\n if (record.status === 'running') {\n // Auto-commit changes if worktree is enabled\n if (record.worktreePath) {\n try {\n logger.info(\n `Auto-committing changes for worker ${record.id} in worktree ${record.worktreePath}`,\n );\n const worktreeGit = simpleGit(record.worktreePath);\n\n // Stage all changes\n await worktreeGit.add('-A');\n\n // Create commit with descriptive message\n const commitMessage = `Worker task: ${record.task}\\n\\nAutomatically committed changes from worker completion.`;\n await worktreeGit.commit(commitMessage);\n\n logger.info(`Successfully auto-committed changes for worker ${record.id}`);\n record.progress.push({\n timestamp: Date.now(),\n message: 'Auto-committed all changes to git',\n });\n } catch (commitError) {\n // Log error but don't fail the worker\n logger.error(`Failed to auto-commit changes for worker ${record.id}:`, commitError);\n record.progress.push({\n timestamp: Date.now(),\n message: `Failed to auto-commit changes: ${commitError instanceof Error ? commitError.message : String(commitError)}`,\n });\n }\n }\n\n record.status = 'completed';\n record.result =\n summarizedChunks.join('\\n').trim() || 'Worker completed without additional details.';\n record.lastUpdateAt = Date.now();\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: true,\n text: record.result,\n } satisfies WorkerMessageEvent);\n this.emitCompleted(record);\n }\n } catch (error) {\n if (record.status === 'canceled') {\n this.emitCompleted(record);\n return;\n }\n\n record.status = 'error';\n record.error = this.extractError(error);\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: `Worker failed: ${record.error}`,\n });\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: record.error,\n } satisfies WorkerMessageEvent);\n this.emitCompleted(record);\n } finally {\n // Only delete from running queries - keep message queue open for potential future messages\n this.runningQueries.delete(record.id);\n }\n }\n\n private handleMessage(\n record: WorkerRecord,\n message: SDKMessage,\n summarizedChunks: string[],\n ): void {\n switch (message.type) {\n case 'assistant': {\n // Extract text content\n const text = this.extractAssistantText(message);\n if (text) {\n summarizedChunks.push(text);\n record.progress.push({\n timestamp: Date.now(),\n message: text,\n });\n record.lastUpdateAt = Date.now();\n this.emit('message', {\n record,\n messageType: 'assistant_text',\n text,\n } satisfies WorkerMessageEvent);\n }\n\n // Extract tool uses from assistant message content\n const content = message.message.content;\n let hasToolUse = false;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (block && typeof block === 'object' && 'type' in block) {\n if (block.type === 'tool_use' && 'name' in block && 'id' in block) {\n hasToolUse = true;\n this.emit('message', {\n record,\n messageType: 'tool_call',\n toolName: block.name as string,\n toolUseId: block.id as string,\n toolInput: 'input' in block ? block.input : undefined,\n } satisfies WorkerMessageEvent);\n }\n }\n }\n }\n\n // If the assistant message has no tool uses, close the message queue\n // This signals the end of the current generation and allows completion logic to run\n // The queue can be reopened when messageWorker is called\n if (!hasToolUse && !record.messageQueue.isClosed()) {\n console.log(\n '[WorkerManager] Assistant message without tool use - closing message queue to signal completion',\n );\n record.messageQueue.close();\n }\n break;\n }\n case 'stream_event': {\n const text = this.extractDeltaText(message);\n if (text) {\n record.progress.push({\n timestamp: Date.now(),\n message: text,\n });\n record.lastUpdateAt = Date.now();\n }\n break;\n }\n case 'result': {\n const success = message.subtype === 'success';\n if (!success && record.status === 'running') {\n record.status = 'error';\n record.error = message.subtype;\n record.lastUpdateAt = Date.now();\n this.emitUpdate(record);\n this.emitCompleted(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: record.error ?? message.subtype,\n } satisfies WorkerMessageEvent);\n }\n break;\n }\n default:\n break;\n }\n }\n\n private extractAssistantText(message: SDKMessage): string | null {\n if (message.type !== 'assistant') {\n return null;\n }\n\n const content: unknown = message.message.content;\n if (typeof content === 'string') {\n return content.trim();\n }\n\n if (Array.isArray(content)) {\n const texts: string[] = [];\n for (const block of content) {\n if (\n block &&\n typeof block === 'object' &&\n block.type === 'text' &&\n typeof block.text === 'string'\n ) {\n const trimmed = block.text.trim();\n if (trimmed.length > 0) {\n texts.push(trimmed);\n }\n }\n }\n if (texts.length > 0) {\n return texts.join('\\n');\n }\n }\n\n return null;\n }\n\n private extractDeltaText(message: SDKMessage): string | null {\n if (message.type !== 'stream_event') {\n return null;\n }\n const event = message.event;\n if (!event || typeof event !== 'object') {\n return null;\n }\n\n if (event.type === 'content_block_delta') {\n const delta = event.delta as { type?: string; text?: unknown } | null;\n if (delta?.type === 'text_delta' && typeof delta.text === 'string') {\n const raw = delta.text.trim();\n return raw.length > 0 ? raw : null;\n }\n }\n\n return null;\n }\n\n private extractError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n try {\n return JSON.stringify(error);\n } catch {\n return 'Unknown worker error';\n }\n }\n\n private wrapPrompt(userPrompt: string, worktreePath?: string, branchName?: string): string {\n let directive = `\\n\\nIMPORTANT:\\n- Use the mcp__worker_status__send_status_update tool to report progress as you work.\\n- When finished, output a final summary.\\n- Do not include raw diffs or large file dumps unless explicitly asked.\\n`;\n\n if (worktreePath && branchName) {\n directive += `\\nWORKTREE ISOLATION:\\n- You are working in an isolated git worktree at: ${worktreePath}\\n- Your dedicated branch is: ${branchName}\\n- All your file operations, git commands, and changes are isolated to this worktree.\\n- Other workers cannot see your changes and you cannot see theirs.\\n- When you're done, your worktree will be automatically cleaned up.\\n- Your changes will be automatically committed when you complete your task. Focus on making your changes and reporting your results.\\n`;\n }\n\n return `${userPrompt.trim()}\\n${directive}`;\n }\n\n /**\n * Shutdown the worker manager and cleanup all resources\n * This should be called during application shutdown to ensure all worktrees are cleaned up\n */\n async shutdown(): Promise<void> {\n logger.info('Shutting down worker manager');\n\n // Cancel all running workers\n const runningWorkers = Array.from(this.workers.values()).filter((w) => w.status === 'running');\n\n for (const worker of runningWorkers) {\n logger.info(`Canceling worker ${worker.id} during shutdown`);\n this.cancelWorker(worker.id);\n }\n\n // Wait a moment for workers to process cancellation\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Force cleanup all remaining worktrees\n try {\n await this.worktreeManager.cleanupAll(true);\n logger.info('All worktrees cleaned up successfully');\n } catch (error) {\n logger.error('Error during worktree cleanup:', error);\n }\n\n logger.info('Worker manager shutdown complete');\n }\n}\n", "import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nimport { z } from 'zod';\n\nexport interface StatusUpdateEvent {\n message: string;\n metadata?: Record<string, unknown>;\n timestamp: number;\n}\n\nexport type StatusUpdateCallback = (event: StatusUpdateEvent) => void;\n\nexport function createWorkerStatusMcpServer(onStatusUpdate: StatusUpdateCallback) {\n return createSdkMcpServer({\n name: 'worker_status',\n version: '1.0.0',\n tools: [\n tool(\n 'send_status_update',\n `Send a status update message to notify about progress.\n\nUse this tool to:\n- Report progress on long-running tasks\n- Notify about important milestones or decisions\n- Provide context about what you're currently working on\n- Signal warnings or issues that don't stop execution\n\nThe status update will be visible to the orchestrator and tracked in your task's progress history.`,\n {\n message: z\n .string()\n .min(1, 'message is required')\n .describe('A concise status update message describing current progress or state'),\n metadata: z\n .record(z.any())\n .optional()\n .describe('Optional metadata to attach to this status update'),\n },\n async (args) => {\n console.log('[StatusTool] send_status_update called:', {\n message: args.message,\n metadata: args.metadata,\n });\n\n onStatusUpdate({\n message: args.message,\n metadata: args.metadata,\n timestamp: Date.now(),\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Status update sent successfully.',\n },\n ],\n };\n },\n ),\n ],\n });\n}\n", "/**\n * A simple async queue for streaming messages to workers.\n * Allows pushing messages and consuming them via async iteration.\n */\nexport class AsyncQueue<T> {\n private queue: T[] = [];\n private resolvers: Array<(value: IteratorResult<T>) => void> = [];\n private closed = false;\n\n /**\n * Push a new item to the queue.\n * If there are waiting consumers, resolve them immediately.\n */\n push(item: T): void {\n if (this.closed) {\n throw new Error('Cannot push to a closed queue');\n }\n\n if (this.resolvers.length > 0) {\n const resolve = this.resolvers.shift();\n resolve?.({ value: item, done: false });\n } else {\n this.queue.push(item);\n }\n }\n\n /**\n * Close the queue, signaling that no more items will be added.\n */\n close(): void {\n this.closed = true;\n // Resolve all waiting consumers with done: true\n while (this.resolvers.length > 0) {\n const resolve = this.resolvers.shift();\n resolve?.({ value: undefined as T, done: true });\n }\n }\n\n /**\n * Check if the queue is closed.\n */\n isClosed(): boolean {\n return this.closed;\n }\n\n /**\n * Async iterator implementation for consuming items from the queue.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n while (true) {\n // If there are items in the queue, yield them\n if (this.queue.length > 0) {\n const item = this.queue.shift();\n if (item !== undefined) {\n yield item;\n }\n continue;\n }\n\n // If the queue is closed and empty, we're done\n if (this.closed) {\n return;\n }\n\n // Wait for a new item or close\n const result = await new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n\n if (result.done) {\n return;\n }\n\n yield result.value;\n }\n }\n}\n", "import { simpleGit, type SimpleGit } from 'simple-git';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { logger } from '../../utils/logger.js';\nimport { DEFAULT_DIR } from '../../auth/credentials-store.js';\n\n/**\n * Configuration options for WorktreeManager\n */\nexport interface WorktreeManagerOptions {\n /**\n * The root directory of the git repository\n */\n repoPath: string;\n\n /**\n * Base directory for worktrees (default: .omnara/worktrees)\n */\n worktreeBasePath?: string;\n\n /**\n * Whether worktrees are enabled (default: false)\n */\n enabled?: boolean;\n\n /**\n * Base ref to use when creating new branches (optional)\n */\n base_ref?: string;\n}\n\n/**\n * Information about a created worktree\n */\nexport interface WorktreeInfo {\n /**\n * Unique identifier for the worker\n */\n workerId: string;\n\n /**\n * Semantic name for the worktree (e.g., \"main-feature\", \"bugfix-auth\")\n */\n worktreeName: string;\n\n /**\n * Absolute path to the worktree directory\n */\n worktreePath: string;\n\n /**\n * Name of the branch created for this worktree\n */\n branchName: string;\n\n /**\n * Timestamp when the worktree was created\n */\n createdAt: Date;\n}\n\n/**\n * A request to create a worktree, stored in the queue\n */\ninterface WorktreeCreationRequest {\n workerId: string;\n worktreeName: string;\n resolve: (info: WorktreeInfo) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Error thrown when worktree operations fail\n */\nexport class WorktreeError extends Error {\n constructor(\n message: string,\n public readonly workerId: string,\n public readonly operation: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'WorktreeError';\n }\n}\n\n/**\n * Manages git worktrees for worker isolation\n *\n * This class handles the lifecycle of git worktrees, ensuring each worker\n * operates in an isolated environment. It provides methods for creating,\n * managing, and cleaning up worktrees.\n *\n * @example\n * ```typescript\n * const manager = new WorktreeManager({ repoPath: '/path/to/repo' });\n * const info = await manager.createWorktree('worker-123', 'main-feature');\n * // Worker operates in info.worktreePath\n * await manager.removeWorktree('worker-123');\n * ```\n */\nexport class WorktreeManager {\n private readonly git: SimpleGit;\n private readonly repoPath: string;\n private readonly worktreeBasePath: string;\n private readonly activeWorktrees: Map<string, WorktreeInfo>;\n private readonly enabled: boolean;\n private readonly base_ref?: string;\n\n // Queue mechanism for sequential worktree creation\n private readonly creationQueue: WorktreeCreationRequest[] = [];\n private isProcessingQueue: boolean = false;\n // Map to track worktrees by name (not workerId) to enable reuse\n private readonly worktreesByName: Map<string, WorktreeInfo> = new Map();\n\n constructor(options: WorktreeManagerOptions) {\n this.repoPath = options.repoPath;\n this.enabled = options.enabled ?? false;\n this.base_ref = options.base_ref;\n\n // Extract repo name from repoPath and create path structure: ~/.omnara/worktrees/<repo-name>\n const repoName = path.basename(this.repoPath);\n this.worktreeBasePath =\n options.worktreeBasePath || path.join(DEFAULT_DIR, 'worktrees', repoName);\n this.git = simpleGit(this.repoPath);\n this.activeWorktrees = new Map();\n\n // Validate git repository if enabled\n if (this.enabled) {\n this.validateGitRepository();\n }\n }\n\n /**\n * Find a valid base ref to use when creating new branches\n * Tries in order: configured base_ref, main, master, origin/HEAD\n * @returns The first valid ref found, or undefined if none exist\n */\n private async findValidBaseRef(): Promise<string | undefined> {\n // If base_ref is configured, try it first\n if (this.base_ref) {\n try {\n await this.git.raw(['rev-parse', '--verify', this.base_ref]);\n logger.info(`Using configured base_ref: ${this.base_ref}`);\n return this.base_ref;\n } catch {\n logger.warn(`Configured base_ref \"${this.base_ref}\" does not exist, trying fallbacks`);\n }\n }\n\n // Try fallback refs in order: main, master, origin/HEAD\n const fallbackRefs = ['main', 'master', 'origin/HEAD'];\n for (const ref of fallbackRefs) {\n try {\n await this.git.raw(['rev-parse', '--verify', ref]);\n logger.info(`Using fallback base_ref: ${ref}`);\n return ref;\n } catch {\n // This ref doesn't exist, try the next one\n }\n }\n\n logger.warn('No valid base ref found (tried: configured base_ref, main, master, origin/HEAD)');\n return undefined;\n }\n\n /**\n * Validate that the repoPath is a git repository\n * Logs an error if worktrees are enabled but not in a git repository\n */\n private validateGitRepository(): void {\n this.git\n .checkIsRepo()\n .then((isRepo) => {\n if (!isRepo) {\n logger.error(`Worktrees are enabled but not in a git repository at ${this.repoPath}`);\n } else {\n logger.info(`Worktrees enabled for repository at ${this.repoPath}`);\n }\n })\n .catch((error) => {\n logger.error(\n `Worktrees are enabled but failed to check git repository at ${this.repoPath}:`,\n error,\n );\n });\n }\n\n /**\n * Check if worktrees are enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Creates a new worktree for the specified worker\n *\n * This method uses a sequential queue to ensure that worktree creation\n * happens one at a time, eliminating race conditions when multiple workers\n * request the same worktree simultaneously.\n *\n * @param workerId - Unique identifier for the worker\n * @param worktreeName - Semantic name for the worktree (e.g., \"main-feature\", \"bugfix-auth\")\n * @returns Information about the created worktree\n * @throws {WorktreeError} If worktree creation fails\n */\n async createWorktree(workerId: string, worktreeName: string): Promise<WorktreeInfo> {\n if (!this.enabled) {\n throw new WorktreeError(\n 'Worktrees are not enabled. Add a \"worktrees\" configuration to omnara.jsonc to enable.',\n workerId,\n 'create',\n );\n }\n\n // Check if this worker already has an active worktree\n if (this.activeWorktrees.has(workerId)) {\n throw new WorktreeError(`Worktree already exists for worker ${workerId}`, workerId, 'create');\n }\n\n // Create a promise that will be resolved when the queue processes this request\n return new Promise<WorktreeInfo>((resolve, reject) => {\n // Add request to queue\n this.creationQueue.push({\n workerId,\n worktreeName,\n resolve,\n reject,\n });\n\n logger.info(\n `Queued worktree creation for \"${worktreeName}\" (worker: ${workerId}). Queue size: ${this.creationQueue.length}`,\n );\n\n // Start processing if not already running\n if (!this.isProcessingQueue) {\n this.processCreationQueue();\n }\n });\n }\n\n /**\n * Processes the creation queue sequentially\n * Ensures only one worktree creation happens at a time\n */\n private async processCreationQueue(): Promise<void> {\n // Guard against concurrent processing\n if (this.isProcessingQueue) {\n return;\n }\n\n this.isProcessingQueue = true;\n\n try {\n while (this.creationQueue.length > 0) {\n // Take the first request from the queue (FIFO)\n const request = this.creationQueue.shift()!;\n\n try {\n // Check if a worktree with this name already exists\n const existingWorktree = this.worktreesByName.get(request.worktreeName);\n\n if (existingWorktree) {\n // Reuse existing worktree, but create a new WorktreeInfo for this worker\n logger.info(\n `Worker ${request.workerId} reusing existing worktree \"${request.worktreeName}\" at ${existingWorktree.worktreePath}`,\n );\n\n const info: WorktreeInfo = {\n workerId: request.workerId,\n worktreeName: request.worktreeName,\n worktreePath: existingWorktree.worktreePath,\n branchName: existingWorktree.branchName,\n createdAt: new Date(),\n };\n\n this.activeWorktrees.set(request.workerId, info);\n request.resolve(info);\n } else {\n // Create new worktree\n const info = await this.doCreateWorktree(request.workerId, request.worktreeName);\n request.resolve(info);\n }\n } catch (error) {\n // If creation fails, reject this request but continue processing the queue\n logger.error(\n `Failed to process worktree creation for worker ${request.workerId}:`,\n error,\n );\n request.reject(\n error instanceof WorktreeError\n ? error\n : new WorktreeError(\n `Failed to create worktree: ${error instanceof Error ? error.message : String(error)}`,\n request.workerId,\n 'create',\n error instanceof Error ? error : undefined,\n ),\n );\n }\n }\n } finally {\n // Reset processing flag\n this.isProcessingQueue = false;\n }\n }\n\n /**\n * Internal method that performs the actual worktree creation\n * This should only be called by processCreationQueue\n */\n private async doCreateWorktree(workerId: string, worktreeName: string): Promise<WorktreeInfo> {\n logger.info(`Creating worktree \"${worktreeName}\" for worker ${workerId}`);\n\n try {\n // Ensure base directory exists\n await fs.mkdir(this.worktreeBasePath, { recursive: true });\n\n // Generate paths and names using worktreeName\n const branchName = `${worktreeName}`;\n const worktreePath = path.join(this.worktreeBasePath, worktreeName);\n\n // Check if branch exists\n const branches = await this.git.branchLocal();\n const branchExists = branches.all.includes(branchName);\n\n // Check if worktree directory exists\n let worktreeDirExists = false;\n try {\n await fs.access(worktreePath);\n worktreeDirExists = true;\n } catch {\n // Directory doesn't exist\n worktreeDirExists = false;\n }\n\n // Check if worktree is registered with git\n const worktreeList = await this.git.raw(['worktree', 'list', '--porcelain']);\n const gitWorktrees = this.parseWorktreeList(worktreeList);\n const worktreeRegistered = gitWorktrees.includes(worktreePath);\n\n // Scenario 2: If worktree exists and branch exists, reuse it\n if (worktreeRegistered && branchExists) {\n logger.info(\n `Reusing existing worktree \"${worktreeName}\" at ${worktreePath} on branch ${branchName}`,\n );\n\n const info: WorktreeInfo = {\n workerId,\n worktreeName,\n worktreePath,\n branchName,\n createdAt: new Date(),\n };\n\n this.activeWorktrees.set(workerId, info);\n this.worktreesByName.set(worktreeName, info);\n return info;\n }\n\n // Handle edge case: directory exists but worktree is not registered\n if (worktreeDirExists && !worktreeRegistered) {\n logger.warn(\n `Directory exists at ${worktreePath} but is not a registered worktree. Removing...`,\n );\n await fs.rm(worktreePath, { recursive: true, force: true });\n worktreeDirExists = false;\n }\n\n // Scenario 3: If branch exists but worktree does not exist, create worktree for existing branch\n if (branchExists && !worktreeRegistered) {\n logger.info(\n `Branch ${branchName} exists. Creating worktree at ${worktreePath} using existing branch`,\n );\n await this.git.raw(['worktree', 'add', worktreePath, branchName]);\n }\n // Scenario 1: If neither exists, create new worktree with new branch\n else if (!branchExists && !worktreeRegistered) {\n // Find valid base ref for creating new branch\n const baseRef = await this.findValidBaseRef();\n\n if (baseRef) {\n logger.info(\n `Creating new worktree \"${worktreeName}\" at ${worktreePath} with new branch ${branchName} from base ref ${baseRef}`,\n );\n await this.git.raw(['worktree', 'add', '-b', branchName, worktreePath, baseRef]);\n } else {\n logger.info(\n `Creating new worktree \"${worktreeName}\" at ${worktreePath} with new branch ${branchName} (no base ref specified)`,\n );\n await this.git.raw(['worktree', 'add', '-b', branchName, worktreePath]);\n }\n }\n\n const info: WorktreeInfo = {\n workerId,\n worktreeName,\n worktreePath,\n branchName,\n createdAt: new Date(),\n };\n\n this.activeWorktrees.set(workerId, info);\n this.worktreesByName.set(worktreeName, info);\n logger.info(`Worktree \"${worktreeName}\" ready at ${worktreePath} on branch ${branchName}`);\n\n return info;\n } catch (error) {\n logger.error(`Failed to create worktree for worker ${workerId}:`, error);\n throw new WorktreeError(\n `Failed to create worktree: ${error instanceof Error ? error.message : String(error)}`,\n workerId,\n 'create',\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Removes a worktree for the specified worker\n *\n * @param workerId - Unique identifier for the worker\n * @param force - Force removal even if there are uncommitted changes\n * @throws {WorktreeError} If worktree removal fails\n */\n async removeWorktree(workerId: string, force: boolean = false): Promise<void> {\n if (!this.enabled) {\n // Silently return if worktrees are disabled\n return;\n }\n\n logger.info(`Removing worktree for worker ${workerId}`);\n\n const info = this.activeWorktrees.get(workerId);\n if (!info) {\n logger.warn(`No active worktree found for worker ${workerId}`);\n return;\n }\n\n try {\n // Check if any other workers are using this worktree name\n const otherWorkersUsingWorktree = Array.from(this.activeWorktrees.values()).filter(\n (wt) => wt.worktreeName === info.worktreeName && wt.workerId !== workerId,\n );\n\n const shouldRemoveWorktree = otherWorkersUsingWorktree.length === 0;\n\n if (shouldRemoveWorktree) {\n // Remove worktree only if no other workers are using it\n const args = ['worktree', 'remove', info.worktreePath];\n if (force) {\n args.push('--force');\n }\n\n try {\n await this.git.raw(args);\n logger.info(`Removed worktree \"${info.worktreeName}\" at ${info.worktreePath}`);\n } catch (worktreeError) {\n const errorMessage =\n worktreeError instanceof Error ? worktreeError.message : String(worktreeError);\n\n // Check if worktree doesn't exist or is already removed\n if (\n errorMessage.includes('is not a working tree') ||\n errorMessage.includes('does not exist')\n ) {\n logger.warn(\n `Worktree ${info.worktreePath} doesn't exist, may have been manually removed. Cleaning up...`,\n );\n\n // Try to prune stale worktrees and manually remove directory if it exists\n await this.git.raw(['worktree', 'prune']);\n\n try {\n await fs.rm(info.worktreePath, { recursive: true, force: true });\n logger.info(`Manually removed stale worktree directory: ${info.worktreePath}`);\n } catch {\n // Directory doesn't exist, which is fine\n }\n } else {\n // Re-throw if it's a different error\n throw worktreeError;\n }\n }\n\n // Remove from worktreesByName map\n this.worktreesByName.delete(info.worktreeName);\n } else {\n logger.info(\n `Not removing worktree \"${info.worktreeName}\" - still in use by ${otherWorkersUsingWorktree.length} other worker(s)`,\n );\n }\n\n // Always remove this worker's entry from activeWorktrees\n this.activeWorktrees.delete(workerId);\n logger.info(`Removed worktree reference for worker ${workerId}`);\n } catch (error) {\n logger.error(`Failed to remove worktree for worker ${workerId}:`, error);\n throw new WorktreeError(\n `Failed to remove worktree: ${error instanceof Error ? error.message : String(error)}`,\n workerId,\n 'remove',\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Gets information about a worker's worktree\n *\n * @param workerId - Unique identifier for the worker\n * @returns Worktree information or undefined if not found\n */\n getWorktreeInfo(workerId: string): WorktreeInfo | undefined {\n return this.activeWorktrees.get(workerId);\n }\n\n /**\n * Lists all active worktrees managed by this instance\n *\n * @returns Array of worktree information\n */\n listActiveWorktrees(): WorktreeInfo[] {\n return Array.from(this.activeWorktrees.values());\n }\n\n /**\n * Cleans up all active worktrees\n *\n * This method should be called during application shutdown to ensure\n * all worktrees are properly cleaned up.\n *\n * @param force - Force removal even if there are uncommitted changes\n */\n async cleanupAll(force: boolean = false): Promise<void> {\n if (!this.enabled) {\n // Silently return if worktrees are disabled\n return;\n }\n\n logger.info('Cleaning up all worktrees');\n\n const workers = Array.from(this.activeWorktrees.keys());\n const results = await Promise.allSettled(\n workers.map((workerId) => this.removeWorktree(workerId, force)),\n );\n\n const failures = results.filter((r) => r.status === 'rejected');\n if (failures.length > 0) {\n logger.error(`Failed to cleanup ${failures.length} worktrees`);\n } else {\n logger.info('Successfully cleaned up all worktrees');\n }\n }\n\n /**\n * Parses the output of 'git worktree list --porcelain'\n *\n * @param output - Raw output from git worktree list\n * @returns Array of worktree paths\n */\n private parseWorktreeList(output: string): string[] {\n const lines = output.split('\\n');\n const paths: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('worktree ')) {\n paths.push(line.substring('worktree '.length));\n }\n }\n\n return paths;\n }\n\n /**\n * Checks if the repository is in a clean state for worktree operations\n *\n * @returns True if repository is clean\n */\n async isRepositoryClean(): Promise<boolean> {\n const status = await this.git.status();\n return status.files.length === 0;\n }\n}\n", "/**\n * Logger utility for controlling console output based on environment\n *\n * Production detection:\n * 1. NODE_ENV === 'production'\n * 2. OMNARA_LOG_LEVEL === 'none' or 'error'\n * 3. Running from compiled dist/ directory (not tsx/ts-node)\n */\n\nimport path from 'path';\nimport type { InspectOptions } from 'util';\n\n/**\n * Log levels for controlling output verbosity\n */\nexport enum LogLevel {\n NONE = 0,\n ERROR = 1,\n WARN = 2,\n INFO = 3,\n DEBUG = 4,\n VERBOSE = 5,\n}\n\n/**\n * Detects if the CLI is running in production mode\n */\nexport function isProduction(): boolean {\n // Check NODE_ENV\n if (process.env.NODE_ENV === 'production') {\n return true;\n }\n\n // Check if running from dist directory (compiled)\n try {\n // Use __filename which is provided by the ESM shim in the build\n const currentFile = typeof __filename !== 'undefined' ? __filename : '';\n const isInDist = currentFile.includes(path.sep + 'dist' + path.sep);\n\n // If in dist AND no explicit development mode, assume production\n if (isInDist && process.env.NODE_ENV !== 'development') {\n return true;\n }\n } catch {\n // Fallback if URL parsing fails\n }\n\n // Check for explicit log level override\n const logLevel = process.env.OMNARA_LOG_LEVEL?.toLowerCase();\n if (logLevel === 'none' || logLevel === 'silent') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Gets the current log level from environment or defaults\n */\nexport function getLogLevel(): LogLevel {\n const envLevel = process.env.OMNARA_LOG_LEVEL?.toLowerCase();\n\n switch (envLevel) {\n case 'none':\n case 'silent':\n return LogLevel.NONE;\n case 'error':\n return LogLevel.ERROR;\n case 'warn':\n case 'warning':\n return LogLevel.WARN;\n case 'info':\n return LogLevel.INFO;\n case 'debug':\n return LogLevel.DEBUG;\n case 'verbose':\n case 'trace':\n return LogLevel.VERBOSE;\n default:\n // Default based on production mode\n return isProduction() ? LogLevel.ERROR : LogLevel.INFO;\n }\n}\n\n/**\n * Logger interface that extends Console but can be controlled\n */\nexport interface Logger extends Console {\n // Additional methods for important messages\n important(...args: unknown[]): void;\n success(...args: unknown[]): void;\n}\n\n/**\n * Creates a controlled logger instance\n */\nexport class ControlledLogger implements Logger {\n private logLevel: LogLevel;\n private forceOutput: boolean;\n private _console: Console;\n\n // Console properties we need to implement\n Console!: typeof console.Console;\n\n constructor(options?: { logLevel?: LogLevel; forceOutput?: boolean }) {\n this.logLevel = options?.logLevel ?? getLogLevel();\n this.forceOutput = options?.forceOutput ?? false;\n this._console = console;\n\n // Copy Console constructor\n this.Console = console.Console;\n }\n\n /**\n * Standard log output (INFO level)\n */\n log(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.log(...args);\n }\n }\n\n /**\n * Error output (always shown unless NONE)\n */\n error(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n console.error(...args);\n }\n }\n\n /**\n * Warning output\n */\n warn(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n console.warn(...args);\n }\n }\n\n /**\n * Info level output\n */\n info(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.info(...args);\n }\n }\n\n /**\n * Debug output (only in development)\n */\n debug(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n console.debug(...args);\n }\n }\n\n /**\n * Verbose/trace output\n */\n trace(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.VERBOSE)) {\n console.log('[TRACE]', ...args);\n }\n }\n\n /**\n * Important messages that should always be shown to user\n * (authentication status, connection info, etc.)\n */\n important(...args: unknown[]): void {\n // Always show important messages unless completely silent\n if (this.logLevel !== LogLevel.NONE || this.forceOutput) {\n console.log(...args);\n }\n }\n\n /**\n * Success messages that should typically be shown\n */\n success(...args: unknown[]): void {\n // Show success messages at WARN level and above\n if (this.shouldLog(LogLevel.WARN) || this.forceOutput) {\n console.log(...args);\n }\n }\n\n /**\n * Check if a message should be logged at the given level\n */\n private shouldLog(level: LogLevel): boolean {\n return this.forceOutput || this.logLevel >= level;\n }\n\n /**\n * Update the log level dynamically\n */\n setLogLevel(level: LogLevel): void {\n this.logLevel = level;\n }\n\n /**\n * Get current log level\n */\n getLogLevel(): LogLevel {\n return this.logLevel;\n }\n\n // Console methods we delegate or control based on log level\n assert(condition?: boolean, ...data: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n this._console.assert(condition, ...data);\n }\n }\n\n clear(): void {\n this._console.clear();\n }\n\n count(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.count(label);\n }\n }\n\n countReset(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.countReset(label);\n }\n }\n\n dir(item?: unknown, options?: InspectOptions): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.dir(item, options);\n }\n }\n\n dirxml(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.dirxml(...data);\n }\n }\n\n group(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.group(...data);\n }\n }\n\n groupCollapsed(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.groupCollapsed(...data);\n }\n }\n\n groupEnd(): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.groupEnd();\n }\n }\n\n table(tabularData?: unknown, properties?: string[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n this._console.table(tabularData, properties);\n }\n }\n\n time(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.time(label);\n }\n }\n\n timeEnd(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeEnd(label);\n }\n }\n\n timeLog(label?: string, ...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeLog(label, ...data);\n }\n }\n\n timeStamp(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeStamp(label);\n }\n }\n\n profile(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n // profile is not part of standard Console interface, check if it exists\n const consoleWithProfile = this._console as Console & { profile?: (label?: string) => void };\n consoleWithProfile.profile?.(label);\n }\n }\n\n profileEnd(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n // profileEnd is not part of standard Console interface, check if it exists\n const consoleWithProfileEnd = this._console as Console & {\n profileEnd?: (label?: string) => void;\n };\n consoleWithProfileEnd.profileEnd?.(label);\n }\n }\n}\n\n/**\n * Global logger instance\n */\nexport const logger = new ControlledLogger();\n\n/**\n * Creates a logger for a specific component\n */\nexport function createLogger(\n componentName?: string,\n options?: {\n logLevel?: LogLevel;\n forceOutput?: boolean;\n },\n): Logger {\n const baseLogger = new ControlledLogger(options);\n\n if (!componentName) {\n return baseLogger;\n }\n\n // Create a wrapper that delegates all Console methods with component prefix\n const wrappedLogger = Object.create(baseLogger) as Logger;\n\n // Override methods that should have component prefix\n wrappedLogger.log = (...args) => baseLogger.log(`[${componentName}]`, ...args);\n wrappedLogger.error = (...args) => baseLogger.error(`[${componentName}]`, ...args);\n wrappedLogger.warn = (...args) => baseLogger.warn(`[${componentName}]`, ...args);\n wrappedLogger.info = (...args) => baseLogger.info(`[${componentName}]`, ...args);\n wrappedLogger.debug = (...args) => baseLogger.debug(`[${componentName}]`, ...args);\n wrappedLogger.trace = (...args) => baseLogger.trace(`[${componentName}]`, ...args);\n // Important and success don't get prefixes\n wrappedLogger.important = (...args) => baseLogger.important(...args);\n wrappedLogger.success = (...args) => baseLogger.success(...args);\n\n return wrappedLogger;\n}\n\n/**\n * Helper to extract error messages consistently\n */\nexport function extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Print current logger configuration (useful for debugging)\n */\nexport function printLoggerConfig(): void {\n const prod = isProduction();\n const level = getLogLevel();\n const levelName = LogLevel[level];\n\n console.log('Logger Configuration:');\n console.log(` Production Mode: ${prod}`);\n console.log(` Log Level: ${levelName} (${level})`);\n console.log(` NODE_ENV: ${process.env.NODE_ENV || '(not set)'}`);\n console.log(` OMNARA_LOG_LEVEL: ${process.env.OMNARA_LOG_LEVEL || '(not set)'}`);\n}\n", "import fs from 'fs/promises';\nimport os from 'os';\nimport path from 'path';\n\nexport interface StoredCredentials {\n accessToken?: string;\n accessTokenExpiresAt?: string;\n refreshToken?: string;\n refreshTokenExpiresAt?: string;\n}\n\nexport const DEFAULT_DIR = path.join(os.homedir(), '.omnara');\nexport const DEFAULT_CREDENTIALS_PATH = path.join(DEFAULT_DIR, 'creds.json');\nconst DEFAULT_FILE_MODE = 0o600;\nconst DEFAULT_DIR_MODE = 0o700;\n\nfunction isStoredCredentials(value: unknown): value is StoredCredentials {\n return Boolean(value) && typeof value === 'object';\n}\n\nexport class CredentialsStore {\n constructor(private readonly filePath: string = DEFAULT_CREDENTIALS_PATH) {}\n\n async load(): Promise<StoredCredentials | null> {\n try {\n const raw = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (!isStoredCredentials(parsed)) {\n throw new Error('File does not contain valid credentials data');\n }\n return parsed;\n } catch (error) {\n if (isFileNotFound(error)) {\n return null;\n }\n throw new Error(\n `Failed to read credentials from ${this.filePath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n\n async save(credentials: StoredCredentials): Promise<void> {\n const payload: StoredCredentials = {\n accessToken: credentials.accessToken,\n accessTokenExpiresAt: credentials.accessTokenExpiresAt,\n refreshToken: credentials.refreshToken,\n refreshTokenExpiresAt: credentials.refreshTokenExpiresAt,\n };\n\n await fs.mkdir(path.dirname(this.filePath), { recursive: true, mode: DEFAULT_DIR_MODE });\n\n const tempPath = `${this.filePath}.tmp`;\n const serialized = JSON.stringify(payload, null, 2);\n await fs.writeFile(tempPath, serialized, { mode: DEFAULT_FILE_MODE });\n await fs.chmod(tempPath, DEFAULT_FILE_MODE);\n await fs.rename(tempPath, this.filePath);\n }\n\n async clear(): Promise<void> {\n try {\n await fs.unlink(this.filePath);\n } catch (error) {\n if (!isFileNotFound(error)) {\n throw new Error(\n `Failed to remove credentials file ${this.filePath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n }\n}\n\nfunction isFileNotFound(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === 'ENOENT',\n );\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n", "import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nimport { z } from 'zod';\nimport type { WorkerManager } from '../worker-manager.js';\n\ntype ToolExtra = {\n sessionId?: string;\n signal: AbortSignal;\n _meta?: Record<string, unknown>;\n};\n\ninterface WorkerMcpContext {\n resolveSessionIdBySdk: (sdkSessionId?: string) => string | undefined;\n resolveSessionIdByToolUse: (toolUseId: string) => string | undefined;\n getMainCodingSessionId: () => string | null;\n}\n\nexport function createWorkerMcpServer(workerManager: WorkerManager, context: WorkerMcpContext) {\n return createSdkMcpServer({\n name: 'worker',\n version: '1.0.0',\n tools: [\n tool(\n 'launch_worker',\n `Launch a background worker agent to handle tasks autonomously in an isolated git worktree.\n\nEach worker operates in its own git worktree, providing complete isolation:\n- Separate working directory (no shared file changes)\n- Dedicated git branch\n- Independent git operations (staging, committing, etc.)\n- The worker's worktree is automatically cleaned up when the worker completes\n\nWhen to use this tool:\n- Complex tasks requiring multiple steps or operations\n- Searches and exploration of the codebase\n- Tasks that can run in parallel with other work\n- Nearly any coding task - prefer delegation over doing work directly\n\nUsage notes:\n- Launch multiple workers concurrently whenever possible for maximum performance (use multiple tool calls in a single turn)\n- Provide detailed, autonomous task descriptions including exactly what information should be returned\n- Workers have full access to: file operations (read, write, edit), search (glob, grep), bash commands, git operations, running tests, and can launch their own sub-workers\n- Worker outputs should be trusted - they have the same capabilities as you\n- The worker's result is returned to you, not the user - you must summarize or forward relevant information\n- Worker progress status is automatically included in your context - you can see their current state without additional tools`,\n {\n task: z\n .string()\n .min(1, 'task name is required')\n .describe(\n 'A short, unique name for this task (e.g., \"FizzBuzz Python\", \"Search codebase\", \"Fix bug #123\"). Used to identify and track this worker.',\n ),\n prompt: z.string().min(1, 'prompt is required'),\n worktree_name: z\n .string()\n .min(1, 'worktree_name is required')\n .describe(\n 'A short descriptive name for a worktree to create that can be used by workers simultaneously. This is synonymous with branch.',\n ),\n metadata: z.record(z.any()).optional(),\n },\n async (args, extra) => {\n const typedExtra = extra as ToolExtra | undefined;\n const toolUseIdRaw = typedExtra?._meta?.['claudecode/toolUseId'];\n const toolUseId = typeof toolUseIdRaw === 'string' ? toolUseIdRaw : undefined;\n\n // Always use the main coding session as parent for workers\n // This ensures workers are children of the main session, not voice or other sessions\n let parentSessionId = context.getMainCodingSessionId() || undefined;\n\n // Fallback to SDK resolution if main session not available (shouldn't happen)\n if (!parentSessionId) {\n const sdkSessionId = typedExtra?.sessionId;\n parentSessionId = context.resolveSessionIdBySdk(sdkSessionId);\n if (!parentSessionId && toolUseId) {\n parentSessionId = context.resolveSessionIdByToolUse(toolUseId);\n }\n console.warn(\n '[WorkerTools] Main coding session not available, falling back to SDK resolution:',\n parentSessionId,\n );\n }\n\n console.log('[WorkerTools] Launching worker:', {\n task: args.task,\n parentSessionId,\n mainCodingSession: context.getMainCodingSessionId(),\n toolUseId,\n });\n\n const record = workerManager.launchWorker(\n {\n task: args.task,\n prompt: args.prompt,\n work_context: args.worktree_name,\n worktree_name: args.worktree_name,\n originSessionId: parentSessionId,\n metadata: args.metadata,\n },\n toolUseId,\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n workerId: record.id,\n status: record.status,\n worktree_path: record.worktreePath,\n branch_name: record.branchName,\n message: `Worker launched successfully, task ${args.task} in progress. You will be notified for progress updates.`,\n }),\n },\n ],\n };\n },\n ),\n tool(\n 'message_worker',\n `Send a message to a running worker to provide additional context, requirements, or steering.\n\nUse this tool to:\n- Add new requirements or clarifications to an in-progress task\n- Provide additional context the worker might need\n- Correct or redirect the worker's current approach\n- Answer implicit questions or resolve ambiguities\n\n**When to use this tool:**\n- User provides additional requirements while a task is in progress\n- User clarifies or corrects their original request\n- User adds context that would help the running worker\n- A logically related request comes in for an existing task\n\n**When to launch a NEW worker instead:**\n- The request is for a completely different, unrelated task\n- The user explicitly requests a separate task\n- The new work would conflict with the current worker's objective\n\n**Interrupt parameter:**\n- interrupt=true: Stop current work immediately and redirect (use for critical corrections or significant changes in direction)\n- interrupt=false: Queue message for after current turn completes (use for additions, clarifications, or supplementary context)\n\n**Guidelines for interrupt:**\n- Use interrupt=true ONLY if:\n - User explicitly says to stop/interrupt current work\n - The new requirement significantly contradicts the current direction\n - The worker is heading down the wrong path and needs immediate correction\n- Use interrupt=false (default) for:\n - Adding requirements that build on current work\n - Providing helpful context or clarifications\n - Making additions that don't conflict with current progress\n\nExample 1 (queue):\nUser: \"Add authentication to my app\"\nOrchestrator: [launches worker: \"add auth\"]\nUser: \"Make sure it works with Google OAuth\"\nOrchestrator: [message_worker: task=\"add auth\", message=\"User wants Google OAuth integration\", interrupt=false]\n\nExample 2 (interrupt):\nUser: \"Refactor the database layer\"\nOrchestrator: [launches worker: \"refactor database\"]\nUser: \"Wait, actually don't touch the database - just refactor the API layer instead\"\nOrchestrator: [message_worker: task=\"refactor database\", message=\"User wants to change scope - refactor API layer instead, leave database alone\", interrupt=true]`,\n {\n task: z\n .string()\n .min(1, 'task name is required')\n .describe('The task name of the worker to message'),\n message: z\n .string()\n .min(1, 'message is required')\n .describe(\n 'The message to send to the worker. Be clear and specific about what has changed or what additional context is being provided.',\n ),\n interrupt: z\n .boolean()\n .default(false)\n .describe(\n 'If true, interrupt current generation immediately; if false (default), queue message for next turn',\n ),\n },\n async (args, extra) => {\n const typedExtra = extra as ToolExtra | undefined;\n const toolUseIdRaw = typedExtra?._meta?.['claudecode/toolUseId'];\n const toolUseId = typeof toolUseIdRaw === 'string' ? toolUseIdRaw : undefined;\n\n console.log('[WorkerTools] Messaging worker:', {\n task: args.task,\n message: args.message.substring(0, 100),\n interrupt: args.interrupt,\n toolUseId,\n });\n\n const success = await workerManager.messageWorker(\n args.task,\n args.message,\n args.interrupt,\n toolUseId,\n );\n\n if (!success) {\n const worker = workerManager.getWorkerByTask(args.task);\n if (!worker) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: false,\n error: `No worker found with task name: ${args.task}`,\n }),\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: false,\n error: `Worker \"${args.task}\" is not running (status: ${worker.status})`,\n }),\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n task: args.task,\n interrupted: args.interrupt,\n message: args.interrupt\n ? `Message sent to worker \"${args.task}\" (interrupted current work)`\n : `Message queued for worker \"${args.task}\" (will be delivered after current turn)`,\n }),\n },\n ],\n };\n },\n ),\n ],\n });\n}\n", "/**\n * System prompt for the main orchestrator agent.\n *\n * The orchestrator's role is to coordinate and delegate work, not to execute tasks directly.\n * It should ALWAYS use workers to handle all implementation work.\n */\n\nimport { readFileSync } from 'fs';\n\n// Load markdown prompt at runtime (works in tsx/tests and bundled builds)\nconst orchestratorPromptUrl = new URL('./orchestrator-prompt.md', import.meta.url);\nconst ORCHESTRATOR_SYSTEM_PROMPT = readFileSync(orchestratorPromptUrl, 'utf-8');\n\nexport { ORCHESTRATOR_SYSTEM_PROMPT };\n", "import { query } from '@anthropic-ai/claude-agent-sdk';\nimport type { ControlMessageSchema } from '@omnara/shared-js/schemas';\nimport { glob } from 'glob';\nimport * as path from 'path';\n\nexport class CompletionsManager {\n private slashCommandsCache?: {\n fetched: Date;\n slashCommands: string[];\n };\n\n private filesCache: Map<\n string,\n {\n fetched: Date;\n files: string[];\n }\n > = new Map();\n\n async fetchSlashCommands(): Promise<string[]> {\n // cache valid for 5 minutes\n if (\n this.slashCommandsCache &&\n Date.now() - this.slashCommandsCache.fetched.getTime() < 5 * 60 * 1000\n ) {\n return this.slashCommandsCache.slashCommands;\n }\n\n let commands: string[] = [];\n for await (const message of query({\n prompt: 'Respond with one word.',\n options: { maxTurns: 1, model: 'haiku', settingSources: [\"user\", \"project\", \"local\"] },\n })) {\n if (message.type === 'system' && message.subtype === 'init') {\n console.log('Fetched available slash commands:', message.slash_commands);\n commands = message.slash_commands;\n }\n }\n\n this.slashCommandsCache = {\n fetched: new Date(),\n slashCommands: commands,\n };\n\n return commands;\n }\n\n async fetchFiles(searchPattern: string = ''): Promise<string[]> {\n // Check cache (valid for 30 seconds for each unique pattern)\n const cached = this.filesCache.get(searchPattern);\n if (cached && Date.now() - cached.fetched.getTime() < 30 * 1000) {\n return cached.files;\n }\n\n try {\n let patterns: string[] = [];\n\n if (searchPattern === '') {\n // If no pattern, show common entry points and config files\n patterns = [\n 'package.json',\n 'tsconfig.json',\n 'pyproject.toml',\n 'Cargo.toml',\n 'README.md',\n 'CLAUDE.md',\n 'src/index.*',\n 'src/main.*',\n 'src/app.*',\n 'index.*',\n 'main.*',\n 'app.*',\n '*.config.*',\n 'src/**/*.tsx',\n 'src/**/*.ts',\n '*.py',\n ];\n } else {\n // Build glob patterns based on the search query\n // Support both partial filename matching and path matching\n if (searchPattern.includes('/')) {\n // User is typing a path - use it directly\n patterns.push(\n `**/${searchPattern}*`, // Match in any directory\n `**/${searchPattern}*/**`, // Match directories\n `${searchPattern}*`, // Match from root\n `${searchPattern}*/**`, // Match root directories\n );\n } else {\n // User is typing a filename - search everywhere\n patterns.push(\n `**/*${searchPattern}*`, // Files containing the pattern\n `**/*${searchPattern}*.*`, // Files with extensions containing pattern\n `**/${searchPattern}*`, // Files starting with the pattern\n `${searchPattern}*`, // Files in current directory\n );\n }\n }\n\n const allFiles: Set<string> = new Set();\n\n // Execute glob for each pattern\n for (const pattern of patterns) {\n try {\n const files = await glob(pattern, {\n ignore: [\n '**/node_modules/**',\n '**/.git/**',\n '**/dist/**',\n '**/build/**',\n '**/.venv/**',\n '**/target/**',\n '**/__pycache__/**',\n '**/.pytest_cache/**',\n '**/.next/**',\n '**/.nuxt/**',\n '**/coverage/**',\n '**/*.min.js',\n '**/*.map',\n '**/vendor/**',\n '**/.cache/**',\n ],\n maxDepth: 10,\n absolute: false,\n nodir: true, // Only files, not directories\n });\n\n // Add files to set (automatically handles duplicates)\n files.forEach((f) => allFiles.add(f));\n } catch {\n // Ignore individual pattern errors\n }\n }\n\n // Convert to array, sort by relevance and limit\n const fileList = Array.from(allFiles)\n .sort((a, b) => {\n if (searchPattern === '') {\n // For empty search, prioritize important files\n const importantFiles = [\n 'package.json',\n 'tsconfig.json',\n 'pyproject.toml',\n 'README.md',\n 'CLAUDE.md',\n ];\n const aName = path.basename(a);\n const bName = path.basename(b);\n const aImportant = importantFiles.includes(aName);\n const bImportant = importantFiles.includes(bName);\n if (aImportant && !bImportant) return -1;\n if (!aImportant && bImportant) return 1;\n\n // Then sort by path depth\n const aDepth = (a.match(/\\//g) || []).length;\n const bDepth = (b.match(/\\//g) || []).length;\n if (aDepth !== bDepth) return aDepth - bDepth;\n\n return a.localeCompare(b);\n }\n\n // For searches with patterns, use existing logic\n const aName = path.basename(a).toLowerCase();\n const bName = path.basename(b).toLowerCase();\n const searchLower = searchPattern.toLowerCase();\n\n const aExact = aName === searchLower;\n const bExact = bName === searchLower;\n if (aExact && !bExact) return -1;\n if (!aExact && bExact) return 1;\n\n // Then prioritize starts with\n const aStarts = aName.startsWith(searchLower);\n const bStarts = bName.startsWith(searchLower);\n if (aStarts && !bStarts) return -1;\n if (!aStarts && bStarts) return 1;\n\n // Then sort by path depth (fewer slashes = higher priority)\n const aDepth = (a.match(/\\//g) || []).length;\n const bDepth = (b.match(/\\//g) || []).length;\n if (aDepth !== bDepth) return aDepth - bDepth;\n\n // Finally alphabetical\n return a.localeCompare(b);\n })\n .slice(0, searchPattern === '' ? 20 : 50); // Limit results - fewer for empty search\n\n // Cache the results\n this.filesCache.set(searchPattern, {\n fetched: new Date(),\n files: fileList,\n });\n\n // Clean up old cache entries if too many\n if (this.filesCache.size > 100) {\n const entries = Array.from(this.filesCache.entries());\n // Remove oldest half\n entries\n .sort((a, b) => a[1].fetched.getTime() - b[1].fetched.getTime())\n .slice(0, 50)\n .forEach(([key]) => this.filesCache.delete(key));\n }\n\n return fileList;\n } catch (error) {\n console.error('Error fetching files:', error);\n return [];\n }\n }\n\n async getCompletion(\n query: string,\n limit: number = 50,\n ): Promise<ControlMessageSchema.CompletionItem[]> {\n const completions: ControlMessageSchema.CompletionItem[] = [];\n\n if (query.startsWith('/')) {\n const slashQuery = query.slice(1);\n const commands = (await this.fetchSlashCommands())\n .filter((cmd) => cmd.startsWith(slashQuery))\n .slice(0, limit);\n\n for (const cmd of commands) {\n completions.push({\n type: 'slash_command',\n result: cmd,\n });\n }\n } else if (query.startsWith('@')) {\n const fileQuery = query.slice(1);\n // Pass the query directly to fetchFiles for efficient globbing\n const files = await this.fetchFiles(fileQuery);\n\n // fetchFiles already returns sorted and limited results\n for (const file of files.slice(0, limit)) {\n completions.push({\n type: 'file',\n result: file,\n });\n }\n }\n\n return completions;\n }\n}\n", "import { parse as parseJsonc, type ParseError } from 'jsonc-parser';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as z from 'zod';\n\nexport type OmnaraConfig = z.infer<typeof OmnaraConfig>;\nconst OmnaraConfig = z.object({\n worktrees: z\n .object({\n enabled: z.boolean().default(false),\n base_ref: z.string().optional(),\n })\n .default({\n enabled: false,\n }),\n});\n\n/**\n * Read and parse the omnara.jsonc configuration file\n *\n * @param configPath - Path to the config file (defaults to omnara.jsonc in cwd)\n * @returns Parsed configuration or default config if file doesn't exist\n */\nexport async function readOmnaraConfig(configPath?: string): Promise<OmnaraConfig> {\n const resolveConfig = async (path?: string): Promise<OmnaraConfig | null> => {\n if (!path) {\n return null;\n }\n\n await fs.access(path);\n\n const content = await fs.readFile(path, 'utf-8');\n const errors: ParseError[] = [];\n const config = parseJsonc(content, errors, {\n allowTrailingComma: true,\n allowEmptyContent: true,\n });\n return OmnaraConfig.parse(config);\n };\n\n const resolveDefault = (): OmnaraConfig => {\n return OmnaraConfig.parse({});\n };\n\n return (\n (await resolveConfig(configPath).catch(() => null)) ??\n (await resolveConfig(path.join(process.cwd(), 'omnara.jsonc')).catch(() => null)) ??\n (await resolveConfig(path.join(process.cwd(), 'omnara.json')).catch(() => null)) ??\n (await resolveDefault())\n );\n}\n\n/**\n * Check if worktrees are enabled in the configuration\n *\n * @param config - The omnara configuration\n * @returns true if worktrees should be enabled\n */\nexport function isWorktreesEnabled(config: OmnaraConfig): boolean {\n // Worktrees are enabled if the worktrees key exists in the config\n return config.worktrees.enabled;\n}\n", "import { randomUUID } from 'crypto';\nimport EventEmitter from 'events';\nimport WebSocket from 'ws';\nimport {\n AgentOrchestrator,\n type AgentOrchestratorConnection,\n} from '../orchestrator/agent-orchestrator.js';\nimport type { OutboundMessage } from '../orchestrator/orchestrator-types.js';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport { ApiClient, normalizeBaseUrl } from '../http/api-client.js';\nimport { registerRelaySession } from './relay-service.js';\nimport { createAuthProvider, type AuthProvider } from '../auth/auth-provider.js';\nimport { createUserSession } from '../http/user-sessions.js';\nimport {\n validateControlMessage,\n validateMessageEnvelope,\n type ControlMessageSchema,\n type MessageEnvelopeSchema,\n type ControlMessage,\n type MessageEnvelope,\n} from '../schemas/index.js';\nimport { tryOpenBrowser } from '../utils/browser.js';\n\nconst MAX_QUEUE_SIZE = 500;\n\nexport interface RelayBridgeOptions {\n store?: CredentialsStore;\n logger?: Console;\n backendUrl: string;\n frontendUrl?: string;\n}\n\nexport class RelayBridge extends EventEmitter {\n private readonly orchestrator: AgentOrchestrator;\n private readonly store: CredentialsStore;\n private readonly logger: Console;\n private readonly backendUrl: string;\n private readonly frontendUrl?: string;\n private connectionHandle: AgentOrchestratorConnection | null = null;\n private ws: WebSocket | null = null;\n private stopped = false;\n private pendingOutbound: string[] = [];\n private pingTimer: NodeJS.Timeout | null = null;\n private heartbeatIntervalMs = 30_000;\n private authProviderPromise: Promise<AuthProvider> | null = null;\n private userSessionId: string | null = null;\n private currentAgentSessionId: string | null = null;\n private browserOpened = false;\n private canceled = false;\n\n constructor(orchestrator: AgentOrchestrator, options: RelayBridgeOptions) {\n super();\n this.orchestrator = orchestrator;\n this.store = options.store ?? new CredentialsStore();\n this.logger = options.logger ?? console;\n this.backendUrl = normalizeBaseUrl(options.backendUrl);\n this.frontendUrl = options.frontendUrl;\n }\n\n async start(): Promise<void> {\n if (this.connectionHandle) {\n throw new Error('Relay bridge already started');\n }\n\n this.connectionHandle = this.orchestrator.addClient({\n canSend: () => !this.canceled && this.ws?.readyState === WebSocket.OPEN,\n send: (message) => {\n this.handleOutbound(message);\n },\n });\n this.ensureAgentSessionExists();\n\n let backoffMs = 1_000;\n\n while (!this.stopped) {\n try {\n await this.establishConnection();\n backoffMs = 1_000;\n } catch (error) {\n const aborted = isAbortError(error);\n if (this.stopped || aborted) {\n if (aborted) {\n this.stopped = true;\n }\n break;\n }\n this.logger.error(\n `Relay connection failed: ${extractErrorMessage(error)}. Retrying in ${Math.round(backoffMs / 1000)}s.`,\n );\n await delay(backoffMs);\n backoffMs = Math.min(backoffMs * 2, 30_000);\n }\n }\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n this.currentAgentSessionId = null;\n this.browserOpened = false;\n this.canceled = false;\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n if (this.connectionHandle) {\n this.connectionHandle.disconnect();\n this.connectionHandle = null;\n }\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1000, 'CLI shutting down');\n }\n this.ws = null;\n }\n\n private async establishConnection(): Promise<void> {\n const authProvider = await this.getAuthProvider();\n const client = new ApiClient({ baseUrl: this.backendUrl });\n\n const accessToken = await authProvider.getAccessToken();\n const userSessionId = await this.ensureUserSession(client, accessToken);\n const registration = await registerRelaySession(client, accessToken, {\n userSessionId,\n clientKind: 'cli',\n });\n this.userSessionId = registration.userSessionId;\n\n const agentSessionId = this.ensureAgentSessionExists();\n\n const url = buildRelayWebsocketUrl(this.backendUrl, registration.relayWsPath);\n\n const ws = new WebSocket(url, {\n headers: {\n authorization: `Bearer ${accessToken}`,\n 'x-relay-token': registration.relayToken,\n },\n });\n\n await waitForOpen(ws);\n\n this.logger.log(\n `Connected to relay (user_session=${registration.userSessionId}, agent_session=${agentSessionId})`,\n );\n\n this.ws = ws;\n this.heartbeatIntervalMs = registration.relayHeartbeatIntervalSec * 1000;\n this.startPingTimer();\n await this.sendPrimarySessionInit(ws);\n if (this.frontendUrl && !this.browserOpened) {\n const dashboardUrl = new URL('dashboard', this.frontendUrl);\n dashboardUrl.searchParams.set('session', agentSessionId);\n tryOpenBrowser(dashboardUrl.toString());\n this.logger.log(`Opened dashboard at ${dashboardUrl.toString()}`);\n this.browserOpened = true;\n }\n this.flushQueue();\n\n await this.handleWebsocketLifecycle(ws);\n }\n\n private async getAuthProvider(): Promise<AuthProvider> {\n if (!this.authProviderPromise) {\n this.authProviderPromise = createAuthProvider({\n store: this.store,\n backendUrl: this.backendUrl,\n frontendUrl: this.frontendUrl,\n logger: this.logger,\n });\n }\n return this.authProviderPromise;\n }\n\n private ensureAgentSessionExists(): string {\n if (!this.currentAgentSessionId) {\n this.currentAgentSessionId = randomUUID();\n }\n this.orchestrator.ensureSessionExists(this.currentAgentSessionId);\n // Mark this as the main coding session\n this.orchestrator.setMainCodingSessionId(this.currentAgentSessionId);\n return this.currentAgentSessionId;\n }\n\n private async ensureUserSession(client: ApiClient, accessToken: string): Promise<string> {\n if (this.userSessionId) {\n return this.userSessionId;\n }\n const descriptor = await createUserSession(client, accessToken, {\n metadata: { source: 'cli' },\n });\n this.userSessionId = descriptor.session_id;\n this.logger.log(`Created user session ${this.userSessionId} for CLI orchestrator`);\n return this.userSessionId;\n }\n\n private async sendPrimarySessionInit(ws: WebSocket): Promise<void> {\n if (!this.userSessionId) {\n throw new Error('Cannot send session_init before user session is available.');\n }\n const agentSessionId = this.ensureAgentSessionExists();\n const initFrame: ControlMessage = {\n type: 'session_init',\n session_id: agentSessionId,\n user_session_id: this.userSessionId,\n session_type: 'CODE',\n parent_session_id: null,\n metadata: { session_type: 'CODE' }, // Include metadata for orchestrator to identify main session\n };\n this.sendFrame(initFrame, ws);\n }\n\n private sendFrame(frame: ControlMessage | MessageEnvelope, socket?: WebSocket | null): void {\n if (this.isMessageEnvelope(frame)) {\n if (!validateMessageEnvelope(frame)) {\n this.logger.error('[RelayBridge] Message envelope validation failed before sending', {\n frame: JSON.stringify(frame),\n errors: validateMessageEnvelope.errors,\n });\n return;\n }\n }\n\n const serialized = JSON.stringify(frame);\n const target = socket ?? this.ws;\n if (target && target.readyState === WebSocket.OPEN) {\n try {\n target.send(serialized);\n return;\n } catch (error) {\n this.logger.error(`Failed to send relay frame: ${extractErrorMessage(error)}`);\n if (target === this.ws) {\n this.closeCurrentSocket();\n }\n }\n }\n this.enqueue(serialized);\n }\n\n private async handleWebsocketLifecycle(ws: WebSocket): Promise<void> {\n await new Promise<void>((resolve) => {\n const onMessage = (data: WebSocket.RawData) => {\n this.handleInbound(data);\n };\n\n const onClose = (code: number, reason: Buffer) => {\n this.logger.warn(\n `Relay websocket closed (code ${code}${reason.length ? `, reason: ${reason.toString()}` : ''})`,\n );\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (!this.stopped) {\n this.logger.error(`Relay websocket error: ${error.message}`);\n }\n };\n\n const cleanup = () => {\n ws.removeListener('message', onMessage);\n ws.removeListener('close', onClose);\n ws.removeListener('error', onError);\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n if (this.ws === ws) {\n this.ws = null;\n }\n };\n\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n\n if (this.stopped) {\n cleanup();\n resolve();\n }\n });\n }\n\n private handleOutbound(message: OutboundMessage): void {\n const frame = this.toRelayFrame(message);\n if (!frame) {\n return;\n }\n this.sendFrame(frame);\n }\n\n private handleInbound(data: WebSocket.RawData): void {\n let parsed: unknown;\n try {\n const text = typeof data === 'string' ? data : data.toString('utf8');\n parsed = JSON.parse(text);\n } catch (error) {\n this.logger.error(`Received invalid JSON from relay: ${extractErrorMessage(error)}`);\n return;\n }\n\n if (this.tryHandleControlMessage(parsed)) {\n return;\n }\n\n if (this.tryHandleMessageEnvelope(parsed)) {\n return;\n }\n\n this.logger.error('Received invalid relay message payload.', { payload: parsed });\n }\n\n private toRelayFrame(message: OutboundMessage): ControlMessage | MessageEnvelope | null {\n switch (message.type) {\n case 'session_init': {\n if (!this.userSessionId) {\n this.logger.warn('Dropping session_init frame: user session is not initialised yet.');\n return null;\n }\n const frame: ControlMessage = {\n type: 'session_init',\n session_id: message.sessionId,\n user_session_id: this.userSessionId,\n session_type: 'CODE',\n parent_session_id: message.parentSessionId ?? null,\n };\n if (message.metadata) {\n frame.metadata = message.metadata;\n }\n return frame;\n }\n case 'user_text':\n return this.buildUserTextEnvelope(message);\n case 'assistant_text':\n return this.buildTextEnvelope(message);\n case 'tool_call':\n return this.buildToolCallEnvelope(message);\n case 'tool_result':\n return this.buildToolResultEnvelope(message);\n case 'agent_complete':\n return this.buildAgentCompleteEnvelope(message);\n case 'agent_progress':\n return this.buildProgressEnvelope(message);\n default:\n return null;\n }\n }\n\n private tryHandleControlMessage(payload: unknown): boolean {\n if (!validateControlMessage(payload)) {\n return false;\n }\n const control = payload as ControlMessage;\n const type = control.type;\n switch (type) {\n case 'session_bootstrap':\n this.handleSessionBootstrap(control as ControlMessageSchema.SessionBootstrap);\n break;\n case 'session_init_ack':\n this.handleSessionInitAck(control as ControlMessageSchema.SessionInitAck);\n break;\n case 'session_announce':\n this.handleSessionAnnounce(control as ControlMessageSchema.SessionAnnounce);\n break;\n case 'session_closed':\n this.handleSessionClosed(control as ControlMessageSchema.SessionClosed);\n break;\n case 'heartbeat':\n if ((control as ControlMessageSchema.Heartbeat).mode === 'ping') {\n const response: ControlMessage = {\n type: 'heartbeat',\n mode: 'pong',\n sent_at: new Date().toISOString(),\n };\n this.sendFrame(response);\n }\n break;\n case 'cancel_agent':\n this.handleCancelAgent(control as ControlMessageSchema.CancelAgentMessage);\n break;\n case 'request':\n this.handleRelayRequest(control as ControlMessageSchema.RelayRequestMessage);\n break;\n default:\n this.logger.debug(`Ignoring control message ${type ?? 'unknown'}`);\n }\n return true;\n }\n\n private tryHandleMessageEnvelope(payload: unknown): boolean {\n if (!validateMessageEnvelope(payload)) {\n return false;\n }\n const envelope = payload as MessageEnvelope;\n this.handleMessageEnvelope(envelope);\n return true;\n }\n\n private handleSessionBootstrap(control: ControlMessageSchema.SessionBootstrap): void {\n const userSessionId = control.root.session_id;\n if (!this.userSessionId) {\n this.userSessionId = userSessionId;\n }\n if (this.userSessionId !== userSessionId) {\n this.logger.warn(\n `Bootstrap user session mismatch (expected ${this.userSessionId}, got ${userSessionId})`,\n );\n }\n\n // Track voice sessions from bootstrap FIRST before ensuring they exist\n for (const agent of control.agent_sessions ?? []) {\n if (agent.session_type === 'VOICE') {\n this.orchestrator.voiceSessionIds.add(agent.session_id);\n console.log('[RelayBridge] Tracking voice session from bootstrap:', {\n sessionId: agent.session_id,\n sessionType: agent.session_type,\n parentSessionId: agent.parent_session_id,\n });\n }\n }\n\n // Then ensure sessions exist\n for (const agent of control.agent_sessions ?? []) {\n this.orchestrator.ensureSessionExists(agent.session_id);\n }\n }\n\n private handleSessionInitAck(control: ControlMessageSchema.SessionInitAck): void {\n const sessionId = control.session_id;\n // Only track the main agent session (not worker child sessions)\n // Workers have a parent_session_id, main sessions don't\n const isMainSession = !control.parent_session_id;\n\n if (isMainSession) {\n if (!this.currentAgentSessionId) {\n this.currentAgentSessionId = sessionId;\n } else if (this.currentAgentSessionId !== sessionId) {\n this.logger.warn(\n `Session init ack for unexpected main session: ${sessionId} (current=${this.currentAgentSessionId})`,\n );\n }\n } else {\n // This is a worker session, log it but don't update currentAgentSessionId\n this.logger.debug(\n `Worker session init ack: ${sessionId} (parent=${control.parent_session_id})`,\n );\n }\n }\n\n private handleSessionAnnounce(control: ControlMessageSchema.SessionAnnounce): void {\n if (control.session.kind === 'agent_session') {\n // Track voice sessions from announcements FIRST\n if (control.session.session_type === 'VOICE') {\n this.orchestrator.voiceSessionIds.add(control.session.session_id);\n console.log('[RelayBridge] Tracking voice session from announce:', {\n sessionId: control.session.session_id,\n sessionType: control.session.session_type,\n });\n }\n\n this.orchestrator.ensureSessionExists(control.session.session_id);\n }\n }\n\n private async handleCancelAgent(control: ControlMessageSchema.CancelAgentMessage): Promise<void> {\n this.logger.info(\n `Received cancel request for session ${control.target_session_id}${control.reason ? ` (reason: ${control.reason})` : ''}`,\n );\n\n // Check if it's targeting the main orchestrator session\n if (control.target_session_id === this.currentAgentSessionId) {\n // Cancel request for main orchestrator session\n this.logger.info('Cancel request for main orchestrator session');\n await this.orchestrator.cancel();\n } else {\n // Cancel a worker\n const success = this.orchestrator.getWorkerManager().cancelWorker(control.target_session_id);\n if (success) {\n this.logger.info(`Worker cancellation succeeded for ${control.target_session_id}`);\n } else {\n this.logger.warn(\n `Worker cancellation failed for ${control.target_session_id} (worker not found or already completed)`,\n );\n }\n }\n }\n\n private handleSessionClosed(control: ControlMessageSchema.SessionClosed): void {\n const closedSessionId = control.session_id;\n this.logger.info(`Session closed: ${closedSessionId} -> status ${control.status}`);\n\n // Check if this is the main orchestrator session being canceled\n if (closedSessionId === this.currentAgentSessionId) {\n this.logger.info(\n `Main orchestrator session ${closedSessionId} was canceled. Stopping message sending.`,\n );\n this.canceled = true;\n }\n }\n\n private async handleRelayRequest(\n control: ControlMessageSchema.RelayRequestMessage,\n ): Promise<void> {\n const requestId = control.request_id;\n const request = control.request;\n let response: ControlMessageSchema.Response;\n switch (request.type) {\n case 'completions':\n response = await this.orchestrator.getCompletions(\n request as ControlMessageSchema.CompletionsRequest,\n );\n break;\n case 'git_diff':\n this.logger.warn('Git diff not implemented');\n response = {\n type: 'git_diff',\n diff: null,\n };\n break;\n default:\n response = {\n type: 'error',\n error: `Request failed: Unknown relay request type ${request.type}`,\n };\n }\n\n const socket = this.ws;\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n const frame: ControlMessage = {\n type: 'response',\n request_id: requestId,\n response,\n };\n this.sendFrame(frame, socket);\n }\n\n private handleMessageEnvelope(envelope: MessageEnvelope): void {\n const content = envelope.payload.content;\n const isUserMessage = envelope.sender.kind === 'user';\n const isAgentUserMessage =\n envelope.sender.kind === 'agent_session' && envelope.metadata?.role === 'user';\n\n // Filter out voice transcript messages - they're just for logging, not for orchestrator\n const isVoiceTranscript =\n envelope.payload.metadata?.subtype === 'user_voice_transcript' ||\n envelope.payload.metadata?.subtype === 'agent_voice_transcript';\n\n // Accept messages from users OR from agent sessions acting as users (like voice agent)\n // BUT exclude voice transcripts\n if (\n this.isTextContent(content) &&\n (isUserMessage || isAgentUserMessage) &&\n !isVoiceTranscript\n ) {\n // Check if this is a message TO a voice session\n const isToVoiceSession = this.orchestrator.voiceSessionIds.has(envelope.session_id);\n\n if (isToVoiceSession) {\n this.logger.info(\n `Filtering out message to voice session ${envelope.session_id} from ${envelope.sender.kind} (id: ${envelope.sender.id})`,\n );\n return;\n }\n\n this.logger.info(\n `Processing message from ${envelope.sender.kind} (id: ${envelope.sender.id}, role: ${envelope.metadata?.role}) to session ${envelope.session_id}`,\n );\n\n // Include sender information so orchestrator knows who sent the message\n this.connectionHandle?.dispatch({\n type: 'chat',\n sessionId: envelope.session_id,\n text: content.text,\n senderId: envelope.sender.id,\n senderKind: envelope.sender.kind,\n });\n return;\n }\n const label = (content as { type?: string }).type ?? 'unknown';\n const subtype = envelope.payload.metadata?.subtype;\n this.logger.debug(\n `Ignoring inbound envelope from ${envelope.sender.kind} with content type ${label}, role ${envelope.metadata?.role}${subtype ? `, subtype: ${subtype}` : ''}`,\n );\n }\n\n private isTextContent(\n content: MessageEnvelopeSchema.Content,\n ): content is MessageEnvelopeSchema.TextContent {\n return typeof (content as MessageEnvelopeSchema.TextContent).text === 'string';\n }\n\n private buildUserTextEnvelope(\n message: Extract<OutboundMessage, { type: 'user_text' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.TextContent = {\n type: 'text',\n text: message.text,\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n // Sender is the worker if workerId is present, otherwise the session itself\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for user messages\n envelope.metadata = {\n ...envelope.metadata,\n role: 'user',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private buildTextEnvelope(\n message: Extract<OutboundMessage, { type: 'assistant_text' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.TextContent = {\n type: 'text',\n text: message.text,\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n // Sender is the worker if workerId is present, otherwise the session itself\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for assistant messages\n envelope.metadata = {\n ...envelope.metadata,\n role: 'assistant',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private buildToolCallEnvelope(\n message: Extract<OutboundMessage, { type: 'tool_call' }>,\n ): MessageEnvelope {\n const args: Record<string, unknown> = this.normalizeToolArguments(message.input);\n const content: MessageEnvelopeSchema.ToolCallContent = {\n type: 'tool_call',\n name: message.toolName,\n tool_use_id: message.toolUseId,\n arguments: args,\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for assistant tool calls\n envelope.metadata = {\n ...envelope.metadata,\n role: 'assistant',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private normalizeToolArguments(input: unknown): Record<string, unknown> {\n if (input && typeof input === 'object' && !Array.isArray(input)) {\n return input as Record<string, unknown>;\n }\n return { value: input };\n }\n\n private buildToolResultEnvelope(\n message: Extract<OutboundMessage, { type: 'tool_result' }>,\n ): MessageEnvelope {\n const output: Record<string, unknown> =\n typeof message.content === 'object' && message.content !== null\n ? (message.content as Record<string, unknown>)\n : { value: message.content };\n const content: MessageEnvelopeSchema.ToolResultContent = {\n type: 'tool_result',\n tool_use_id: message.toolUseId,\n output,\n is_error: Boolean(message.isError),\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for assistant tool results\n envelope.metadata = {\n ...envelope.metadata,\n role: 'assistant',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private buildAgentCompleteEnvelope(\n message: Extract<OutboundMessage, { type: 'agent_complete' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.AgentCompleteContent = {\n type: 'agent_complete',\n success: message.success,\n duration_ms: message.durationMs ?? null,\n cost_usd: message.costUsd ?? null,\n message: message.message ?? null,\n };\n if (message.metadata) {\n content.metadata = message.metadata;\n }\n\n const metadataAgent =\n typeof message.metadata?.agent_session_id === 'string'\n ? (message.metadata.agent_session_id as string)\n : undefined;\n const senderSessionId = metadataAgent ?? this.currentAgentSessionId ?? message.sessionId;\n return this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n messageId: message.messageId,\n });\n }\n\n private buildProgressEnvelope(\n message: Extract<OutboundMessage, { type: 'agent_progress' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.AgentProgressContent = {\n type: 'agent_progress',\n status: message.status,\n };\n if (message.detail) {\n content.detail = message.detail;\n }\n if (message.metadata) {\n content.metadata = message.metadata;\n }\n\n const metadataAgent =\n typeof message.metadata?.agent_session_id === 'string'\n ? (message.metadata.agent_session_id as string)\n : undefined;\n const sessionId =\n message.sessionId ?? this.currentAgentSessionId ?? this.ensureAgentSessionExists();\n const senderSessionId = metadataAgent ?? this.currentAgentSessionId ?? sessionId;\n\n return this.buildEnvelope({\n sessionId,\n senderSessionId,\n content,\n messageId: message.messageId,\n });\n }\n\n private buildEnvelope(options: {\n sessionId: string;\n senderSessionId?: string;\n content: MessageEnvelopeSchema.Content;\n payloadMetadata?: Record<string, unknown>;\n messageId?: string;\n }): MessageEnvelope {\n const payload: MessageEnvelopeSchema.MessagePayload = {\n version: 0,\n content: options.content,\n };\n if (options.payloadMetadata && Object.keys(options.payloadMetadata).length > 0) {\n payload.metadata = options.payloadMetadata;\n }\n\n const sender: MessageEnvelopeSchema.SenderRef = {\n kind: 'agent_session',\n id: options.senderSessionId ?? options.sessionId,\n };\n\n const envelope: MessageEnvelope = {\n message_id: options.messageId ?? randomUUID(),\n session_id: options.sessionId,\n sender,\n payload,\n created_at: new Date().toISOString(),\n };\n\n return envelope;\n }\n\n private isMessageEnvelope(frame: ControlMessage | MessageEnvelope): frame is MessageEnvelope {\n return (frame as MessageEnvelope).payload !== undefined;\n }\n\n private enqueue(serialized: string): void {\n if (this.pendingOutbound.length >= MAX_QUEUE_SIZE) {\n this.pendingOutbound.shift();\n }\n this.pendingOutbound.push(serialized);\n }\n\n private flushQueue(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n while (this.pendingOutbound.length > 0) {\n const payload = this.pendingOutbound.shift();\n if (!payload) {\n continue;\n }\n try {\n this.ws.send(payload);\n } catch (error) {\n this.logger.error(`Failed to flush relay queue: ${extractErrorMessage(error)}`);\n this.pendingOutbound.unshift(payload);\n this.closeCurrentSocket();\n break;\n }\n }\n }\n\n private startPingTimer(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n }\n const interval = Math.max(this.heartbeatIntervalMs, 5_000);\n this.pingTimer = setInterval(() => {\n const socket = this.ws;\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n const frame: ControlMessage = {\n type: 'heartbeat',\n mode: 'ping',\n sent_at: new Date().toISOString(),\n };\n this.sendFrame(frame, socket);\n }, interval);\n }\n\n private closeCurrentSocket(): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1012, 'Reconnecting');\n }\n }\n}\n\nfunction buildRelayWebsocketUrl(baseUrl: string, path: string): string {\n const url = new URL(baseUrl);\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n url.search = '';\n url.hash = '';\n if (path.startsWith('/')) {\n url.pathname = path;\n } else {\n const basePath = url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`;\n url.pathname = `${basePath}${path}`;\n }\n return url.toString();\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction isAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const name = error.name?.toLowerCase();\n if (name === 'aborterror') {\n return true;\n }\n const message = error.message ? error.message.toLowerCase() : '';\n return message.includes('aborted with ctrl+c');\n}\n\nfunction waitForOpen(ws: WebSocket): Promise<void> {\n return new Promise((resolve, reject) => {\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n const cleanup = () => {\n ws.removeListener('open', onOpen);\n ws.removeListener('error', onError);\n };\n\n ws.once('open', onOpen);\n ws.once('error', onError);\n });\n}\n", "export class ApiError extends Error {\n readonly status: number;\n readonly details: unknown;\n\n constructor(status: number, message: string, details?: unknown) {\n super(message);\n this.status = status;\n this.details = details;\n }\n}\n\nexport interface RequestOptions {\n headers?: Record<string, string>;\n accessToken?: string;\n apiKey?: string;\n signal?: AbortSignal;\n}\n\nexport interface ApiClientOptions {\n baseUrl: string;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n\n constructor(options: ApiClientOptions) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl);\n }\n\n async getJson<TResponse>(path: string, options?: RequestOptions): Promise<TResponse> {\n const url = resolveUrl(this.baseUrl, path);\n const headers = this.buildHeaders(options);\n\n const response = await fetch(url, {\n method: 'GET',\n headers,\n signal: options?.signal,\n });\n\n return await this.handleResponse<TResponse>(response);\n }\n\n async postJson<TRequest, TResponse>(\n path: string,\n body: TRequest,\n options?: RequestOptions,\n ): Promise<TResponse> {\n const url = resolveUrl(this.baseUrl, path);\n const headers = this.buildHeaders(options, { includeJson: true });\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body ?? {}),\n signal: options?.signal,\n });\n\n return await this.handleResponse<TResponse>(response);\n }\n\n private buildHeaders(options?: RequestOptions, extras?: { includeJson?: boolean }): Headers {\n const headers = new Headers();\n if (extras?.includeJson) {\n headers.set('content-type', 'application/json');\n }\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n headers.set(key, value);\n }\n }\n if (options?.accessToken) {\n headers.set('authorization', `Bearer ${options.accessToken}`);\n } else if (options?.apiKey) {\n headers.set('authorization', `Bearer ${options.apiKey}`);\n }\n return headers;\n }\n\n private async handleResponse<TResponse>(response: Response): Promise<TResponse> {\n const contentType = response.headers.get('content-type');\n const isJson = contentType?.includes('application/json');\n\n let payload: unknown = undefined;\n if (isJson) {\n try {\n payload = await response.json();\n } catch (error) {\n if (response.ok) {\n throw new ApiError(\n response.status,\n `Failed to parse JSON response: ${extractErrorMessage(error)}`,\n );\n }\n }\n } else if (response.ok) {\n payload = await response.text();\n }\n\n if (!response.ok) {\n const detail = extractDetail(payload);\n throw new ApiError(response.status, detail ?? `HTTP ${response.status}`, payload);\n }\n\n return payload as TResponse;\n }\n}\n\nexport function normalizeBaseUrl(raw: string): string {\n if (!raw) {\n throw new Error('Backend URL cannot be empty.');\n }\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n\nexport function resolveUrl(base: string, path: string): string {\n const baseUrl = new URL(base);\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n const resolved = new URL(path, baseUrl);\n return resolved.toString();\n}\n\nfunction extractDetail(payload: unknown): string | null {\n if (!payload) {\n return null;\n }\n if (typeof payload === 'string') {\n return payload;\n }\n if (typeof payload === 'object' && payload !== null) {\n const record = payload as Record<string, unknown>;\n const detail = record.detail;\n if (typeof detail === 'string') {\n return detail;\n }\n const message = record.message;\n if (typeof message === 'string') {\n return message;\n }\n }\n return null;\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n", "import { ApiClient } from '../http/api-client.js';\n\nexport type RelayClientKind = 'cli' | 'web' | 'mobile' | 'voice';\n\ninterface RelayRegisterRequestWire {\n user_session_id: string;\n client_kind?: RelayClientKind | null;\n}\n\ninterface RelayRegisterResponseWire {\n user_session_id: string;\n relay_token: string;\n relay_token_expires_in: number;\n relay_ws_path: string;\n relay_heartbeat_interval_sec: number;\n}\n\ninterface RelayRefreshRequestWire {\n relay_token: string;\n}\n\ninterface RelayRefreshResponseWire {\n relay_token: string;\n relay_token_expires_in: number;\n}\n\nexport interface RelayRegistration {\n userSessionId: string;\n relayToken: string;\n relayTokenExpiresIn: number;\n relayWsPath: string;\n relayHeartbeatIntervalSec: number;\n}\n\nexport interface RelayTokenRefresh {\n relayToken: string;\n relayTokenExpiresIn: number;\n}\n\nexport interface RegisterRelayOptions {\n userSessionId: string;\n clientKind?: RelayClientKind;\n}\n\nexport async function registerRelaySession(\n client: ApiClient,\n accessToken: string,\n options: RegisterRelayOptions,\n): Promise<RelayRegistration> {\n const body: RelayRegisterRequestWire = {\n user_session_id: options.userSessionId,\n client_kind: options.clientKind ?? 'cli',\n };\n\n const response = await client.postJson<RelayRegisterRequestWire, RelayRegisterResponseWire>(\n '/api/v1/relay/register',\n body,\n { accessToken },\n );\n\n return {\n userSessionId: response.user_session_id,\n relayToken: response.relay_token,\n relayTokenExpiresIn: response.relay_token_expires_in,\n relayWsPath: response.relay_ws_path,\n relayHeartbeatIntervalSec: response.relay_heartbeat_interval_sec,\n };\n}\n\nexport async function refreshRelayToken(\n client: ApiClient,\n accessToken: string,\n relayToken: string,\n): Promise<RelayTokenRefresh> {\n const response = await client.postJson<RelayRefreshRequestWire, RelayRefreshResponseWire>(\n '/api/v1/relay/refresh',\n { relay_token: relayToken },\n { accessToken },\n );\n\n return {\n relayToken: response.relay_token,\n relayTokenExpiresIn: response.relay_token_expires_in,\n };\n}\n", "import { createClient, type SupabaseClient } from '@supabase/supabase-js';\n\nimport type { SupabaseAuthConfig } from './supabase-config.js';\n\nexport function buildSupabaseClient(config: SupabaseAuthConfig): SupabaseClient {\n return createClient(config.url, config.anonKey, {\n auth: {\n persistSession: false,\n detectSessionInUrl: false,\n },\n });\n}\n", "import { ApiClient } from '../http/api-client.js';\n\nexport interface SupabaseAuthConfig {\n url: string;\n anonKey: string;\n}\n\ninterface AuthConfigResponseWire {\n supabase_url: string;\n supabase_anon_key: string;\n}\n\nconst CACHE = new Map<string, SupabaseAuthConfig>();\n\nexport async function getSupabaseAuthConfig(baseUrl: string): Promise<SupabaseAuthConfig> {\n const normalized = normalizeBaseUrl(baseUrl);\n const cached = CACHE.get(normalized);\n if (cached) {\n return cached;\n }\n\n const client = new ApiClient({ baseUrl: normalized });\n const response = await client.getJson<AuthConfigResponseWire>('/api/v1/auth/config');\n const config: SupabaseAuthConfig = {\n url: response.supabase_url,\n anonKey: response.supabase_anon_key,\n };\n CACHE.set(normalized, config);\n return config;\n}\n\nfunction normalizeBaseUrl(raw: string): string {\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n", "import type { Session } from '@supabase/supabase-js';\n\nimport { CredentialsStore, type StoredCredentials } from './credentials-store.js';\nimport { buildSupabaseClient } from './supabase-client.js';\nimport { getSupabaseAuthConfig } from './supabase-config.js';\n\nconst EXPIRY_BUFFER_MS = 60_000; // refresh tokens one minute before expiry\n\nexport interface AuthContext {\n credentials: StoredCredentials;\n accessToken: string;\n}\n\nexport async function ensureAuthContext(\n store: CredentialsStore,\n backendUrl: string,\n): Promise<AuthContext> {\n const credentials = await store.load();\n if (!credentials) {\n throw new Error('No credentials found. Run `omnara auth login` first.');\n }\n\n if (!credentials.refreshToken) {\n throw new Error('Refresh token unavailable. Please run `omnara auth login`.');\n }\n\n if (!credentials.accessToken) {\n return await refreshWithStoredToken(store, credentials, backendUrl, 'No access token stored.');\n }\n\n if (!isExpiring(credentials.accessTokenExpiresAt, EXPIRY_BUFFER_MS)) {\n return { credentials, accessToken: credentials.accessToken };\n }\n\n return await refreshWithStoredToken(store, credentials, backendUrl, 'Access token expired.');\n}\n\nasync function refreshWithStoredToken(\n store: CredentialsStore,\n credentials: StoredCredentials,\n backendUrl: string,\n reason: string,\n): Promise<AuthContext> {\n const refreshToken = credentials.refreshToken;\n if (!refreshToken) {\n throw new Error(`${reason} Refresh token unavailable. Please run \\`omnara auth login\\`.`);\n }\n\n if (credentials.refreshTokenExpiresAt && isExpiring(credentials.refreshTokenExpiresAt, 0)) {\n throw new Error('Refresh token expired. Please run `omnara auth login`.');\n }\n\n const supabaseConfig = await getSupabaseAuthConfig(backendUrl);\n const supabase = buildSupabaseClient(supabaseConfig);\n const { data, error } = await supabase.auth.refreshSession({ refresh_token: refreshToken });\n if (error || !data?.session) {\n throw new Error(\n `${reason} Failed to refresh Supabase session: ${error?.message ?? 'unknown error'}.`,\n );\n }\n\n const updated = applySession(credentials, data.session);\n\n await store.save(updated);\n if (!updated.accessToken) {\n throw new Error('Supabase refresh completed without an access token.');\n }\n return { credentials: updated, accessToken: updated.accessToken };\n}\n\nfunction isExpiring(expiresAtIso: string | undefined, bufferMs: number): boolean {\n if (!expiresAtIso) {\n return true;\n }\n const timestamp = Date.parse(expiresAtIso);\n if (Number.isNaN(timestamp)) {\n return true;\n }\n return timestamp - bufferMs <= Date.now();\n}\n\nfunction applySession(credentials: StoredCredentials, session: Session): StoredCredentials {\n const expiresAt = deriveAccessExpiry(session);\n\n return {\n ...credentials,\n accessToken: session.access_token,\n accessTokenExpiresAt: expiresAt,\n refreshToken: session.refresh_token ?? credentials.refreshToken,\n refreshTokenExpiresAt: credentials.refreshTokenExpiresAt,\n };\n}\n\nfunction deriveAccessExpiry(session: Session): string | undefined {\n if (session.expires_at) {\n return new Date(session.expires_at * 1000).toISOString();\n }\n if (session.expires_in) {\n return new Date(Date.now() + session.expires_in * 1000).toISOString();\n }\n return undefined;\n}\n", "import readline from 'readline/promises';\nimport { stdin as input, stdout as output } from 'process';\n\nexport async function prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input, output });\n try {\n const answer = await rl.question(question);\n return answer.trim();\n } finally {\n rl.close();\n }\n}\n", "import { ApiClient } from '../http/api-client.js';\n\ninterface CreateSessionRequestWire {\n frontend_url?: string | null;\n loopback_redirect_uri?: string | null;\n loopback_state?: string | null;\n pkce_challenge?: string | null;\n pkce_challenge_method?: string | null;\n}\n\ninterface CreateSessionResponseWire {\n session_id: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n poll_interval: number;\n}\n\ninterface ExchangeRequestWire {\n session_id: string;\n code: string;\n code_verifier?: string | null;\n}\n\ninterface ExchangeResponseWire {\n access_token: string;\n access_token_expires_in: number;\n refresh_token: string;\n refresh_token_expires_in: number;\n relay_ws_path: string;\n relay_heartbeat_interval_sec: number;\n}\n\nexport interface CliAuthSession {\n sessionId: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n pollInterval: number;\n}\n\nexport interface CreateCliAuthSessionOptions {\n frontendUrl?: string;\n loopbackRedirectUri?: string;\n loopbackState?: string;\n pkceChallenge?: string;\n pkceChallengeMethod?: string;\n}\n\nexport interface ExchangeCliCodeResult {\n accessToken: string;\n accessTokenExpiresIn: number;\n refreshToken: string;\n refreshTokenExpiresIn: number;\n relayWsPath: string;\n relayHeartbeatIntervalSec: number;\n}\n\nexport async function createCliAuthSession(\n client: ApiClient,\n options: CreateCliAuthSessionOptions = {},\n): Promise<CliAuthSession> {\n const body: CreateSessionRequestWire = {};\n if (options.frontendUrl) {\n body.frontend_url = options.frontendUrl;\n }\n if (options.loopbackRedirectUri) {\n body.loopback_redirect_uri = options.loopbackRedirectUri;\n }\n if (options.loopbackState) {\n body.loopback_state = options.loopbackState;\n }\n if (options.pkceChallenge) {\n body.pkce_challenge = options.pkceChallenge;\n body.pkce_challenge_method = options.pkceChallengeMethod ?? 'S256';\n }\n const wire = await client.postJson<CreateSessionRequestWire, CreateSessionResponseWire>(\n '/api/v1/cli-auth/session',\n body,\n );\n return {\n sessionId: wire.session_id,\n verificationUri: wire.verification_uri,\n verificationUriComplete: wire.verification_uri_complete,\n expiresIn: wire.expires_in,\n pollInterval: wire.poll_interval,\n };\n}\n\nexport async function exchangeCliCode(\n client: ApiClient,\n sessionId: string,\n code: string,\n options: { codeVerifier?: string } = {},\n): Promise<ExchangeCliCodeResult> {\n const requestBody: ExchangeRequestWire = {\n session_id: sessionId,\n code,\n };\n if (options.codeVerifier) {\n requestBody.code_verifier = options.codeVerifier;\n }\n\n const wire = await client.postJson<ExchangeRequestWire, ExchangeResponseWire>(\n '/api/v1/cli-auth/exchange',\n requestBody,\n );\n return {\n accessToken: wire.access_token,\n accessTokenExpiresIn: wire.access_token_expires_in,\n refreshToken: wire.refresh_token,\n refreshTokenExpiresIn: wire.refresh_token_expires_in,\n relayWsPath: wire.relay_ws_path,\n relayHeartbeatIntervalSec: wire.relay_heartbeat_interval_sec,\n };\n}\n", "import { createHash, randomBytes } from 'crypto';\n\nexport interface PkcePair {\n verifier: string;\n challenge: string;\n method: 'S256';\n}\n\nexport function generatePkcePair(): PkcePair {\n const verifier = base64UrlEncode(randomBytes(32));\n const challenge = base64UrlEncode(createHash('sha256').update(verifier).digest());\n return { verifier, challenge, method: 'S256' };\n}\n\nfunction base64UrlEncode(input: Buffer | Uint8Array | string): string {\n const buffer =\n typeof input === 'string'\n ? Buffer.from(input, 'utf8')\n : Buffer.from(input as Buffer | Uint8Array);\n return buffer.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n", "import http from 'http';\nimport type { AddressInfo } from 'net';\nimport { randomBytes } from 'crypto';\n\nexport interface LoopbackCallback {\n code: string;\n sessionId: string | null;\n state: string | null;\n}\n\nconst CALLBACK_PATH = '/callback';\nconst LISTEN_HOST = '127.0.0.1';\n\nexport class LoopbackListener {\n static async create(): Promise<LoopbackListener | null> {\n const listener = new LoopbackListener(generateState());\n try {\n await listener.start();\n return listener;\n } catch {\n await listener.stop().catch(() => undefined);\n return null;\n }\n }\n\n readonly state: string;\n redirectUri: string;\n\n private readonly server: http.Server;\n private resolveCallback: ((value: LoopbackCallback) => void) | null = null;\n private rejectCallback: ((reason?: unknown) => void) | null = null;\n private pending: Promise<LoopbackCallback> | null = null;\n\n private constructor(state: string) {\n this.state = state;\n this.redirectUri = '';\n this.server = http.createServer((request, response) => {\n void this.handleRequest(request, response);\n });\n }\n\n async waitForCallback(): Promise<LoopbackCallback> {\n if (this.pending) {\n return this.pending;\n }\n this.pending = new Promise<LoopbackCallback>((resolve, reject) => {\n this.resolveCallback = resolve;\n this.rejectCallback = reject;\n });\n return this.pending;\n }\n\n async stop(): Promise<void> {\n if (!this.server.listening) {\n return;\n }\n await new Promise<void>((resolve) => {\n this.server.close(() => resolve());\n });\n }\n\n private async start(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.server.once('error', reject);\n this.server.listen(0, LISTEN_HOST, () => {\n this.server.removeListener('error', reject);\n resolve();\n });\n });\n\n const address = this.server.address();\n if (!address || typeof address === 'string') {\n throw new Error('Loopback listener failed to bind');\n }\n const { port } = address as AddressInfo;\n this.redirectUri = `http://${LISTEN_HOST}:${port}${CALLBACK_PATH}`;\n }\n\n private async handleRequest(\n request: http.IncomingMessage,\n response: http.ServerResponse,\n ): Promise<void> {\n if (request.method !== 'GET' || !request.url) {\n this.respond(response, 405, 'Method Not Allowed');\n return;\n }\n\n const url = new URL(request.url, `http://${request.headers.host ?? LISTEN_HOST}`);\n if (url.pathname !== CALLBACK_PATH) {\n this.respond(response, 404, 'Not Found');\n return;\n }\n\n const code = url.searchParams.get('code');\n const sessionId = url.searchParams.get('session');\n const state = url.searchParams.get('state');\n\n if (!code) {\n this.respond(\n response,\n 400,\n buildMessageHtml('Missing authorization code. Return to your CLI and try again.'),\n );\n return;\n }\n\n this.respond(response, 200, buildSuccessHtml());\n\n if (this.resolveCallback) {\n this.resolveCallback({ code, sessionId, state });\n this.resolveCallback = null;\n this.rejectCallback = null;\n }\n\n void this.stop();\n }\n\n private respond(response: http.ServerResponse, status: number, body: string): void {\n response.writeHead(status, {\n 'content-type': 'text/html; charset=utf-8',\n 'cache-control': 'no-store',\n });\n response.end(body);\n }\n}\n\nfunction buildSuccessHtml(): string {\n const redirectTarget = 'https://www.omnara.com/dashboard';\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <meta http-equiv=\"refresh\" content=\"3;url=${redirectTarget}\" />\n <title>Omnara CLI Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #090909; color: #f4f4f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }\n .card { max-width: 420px; padding: 2.5rem; background: rgba(32, 32, 36, 0.85); border-radius: 14px; box-shadow: 0 20px 40px rgba(0,0,0,0.35); text-align: center; }\n h1 { font-size: 1.5rem; margin-bottom: 0.75rem; }\n p { margin: 0 0 0.75rem; line-height: 1.5; }\n .note { font-size: 0.85rem; color: rgba(244,244,245,0.7); }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <h1>Redirecting back to the CLI\u2026</h1>\n <p>Your authentication details were sent to the Omnara CLI. Return to your terminal to continue.</p>\n <p class=\"note\">If this page doesn't close automatically, you can manually open the Omnara dashboard.</p>\n </div>\n </body>\n</html>`;\n}\n\nfunction generateState(): string {\n return base64UrlEncode(randomBytes(32));\n}\n\nfunction base64UrlEncode(input: Buffer | Uint8Array | string): string {\n const buffer =\n typeof input === 'string'\n ? Buffer.from(input, 'utf8')\n : Buffer.from(input as Buffer | Uint8Array);\n return buffer.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\nfunction buildMessageHtml(message: string): string {\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <title>Omnara CLI Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #090909; color: #f4f4f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }\n .card { max-width: 420px; padding: 2.5rem; background: rgba(32, 32, 36, 0.85); border-radius: 14px; box-shadow: 0 20px 40px rgba(0,0,0,0.35); text-align: center; }\n h1 { font-size: 1.4rem; margin-bottom: 0.75rem; }\n p { margin: 0; line-height: 1.6; }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <h1>Omnara CLI Login</h1>\n <p>${message}</p>\n </div>\n </body>\n</html>`;\n}\n", "import { spawn } from 'child_process';\n\nexport function tryOpenBrowser(url: string): void {\n const command =\n process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';\n\n const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];\n\n try {\n const child = spawn(command, args, { stdio: 'ignore', detached: true });\n child.unref();\n } catch {\n // Ignore failures; user can open manually.\n }\n}\n", "import { ApiClient, ApiError, normalizeBaseUrl } from '../http/api-client.js';\nimport { CredentialsStore, type StoredCredentials } from './credentials-store.js';\nimport { prompt } from '../utils/prompt.js';\nimport {\n createCliAuthSession,\n exchangeCliCode,\n type CliAuthSession,\n type CreateCliAuthSessionOptions,\n type ExchangeCliCodeResult,\n} from './cli-auth-service.js';\nimport { generatePkcePair } from './pkce.js';\nimport { LoopbackListener } from './loopback-listener.js';\nimport { tryOpenBrowser } from '../utils/browser.js';\n\ninterface LoginOptions {\n backendUrlOption?: string;\n frontendUrlOption?: string;\n store: CredentialsStore;\n}\n\nexport async function performVerificationLogin({\n backendUrlOption,\n frontendUrlOption,\n store,\n}: LoginOptions): Promise<StoredCredentials> {\n const backendUrl = resolveBackendUrl(backendUrlOption);\n const frontendUrl = resolveFrontendUrl(frontendUrlOption);\n const client = new ApiClient({ baseUrl: backendUrl });\n\n console.log('\\nAuthenticating CLI\u2026');\n const loopback = await LoopbackListener.create();\n const pkce = loopback ? generatePkcePair() : null;\n\n const sessionOptions: CreateCliAuthSessionOptions = {\n frontendUrl,\n };\n\n if (loopback && pkce) {\n sessionOptions.loopbackRedirectUri = loopback.redirectUri;\n sessionOptions.loopbackState = loopback.state;\n sessionOptions.pkceChallenge = pkce.challenge;\n sessionOptions.pkceChallengeMethod = pkce.method;\n }\n\n const session = await createCliAuthSession(client, sessionOptions);\n printSessionInstructions(session);\n tryOpenBrowser(session.verificationUriComplete);\n\n let completed = false;\n let successLogged = false;\n let latestCredentials: StoredCredentials | null = null;\n\n const completeLogin = async (code: string, codeVerifier?: string): Promise<void> => {\n if (completed) {\n return;\n }\n const exchange = await exchangeCliCode(\n client,\n session.sessionId,\n code,\n codeVerifier ? { codeVerifier } : {},\n );\n const updated = mergeCredentialsAfterExchange({\n exchange,\n });\n await store.save(updated);\n latestCredentials = updated;\n if (!successLogged) {\n console.log('\\nLogin successful. Credentials saved.');\n successLogged = true;\n }\n completed = true;\n };\n\n const loopbackTask =\n loopback && pkce\n ? waitForLoopback(loopback, session.sessionId, async (code) => {\n await completeLogin(code, pkce.verifier);\n if (typeof process.stdin.emit === 'function') {\n process.stdin.emit('data', '\\n');\n }\n })\n : null;\n\n if (!loopbackTask && !completed) {\n console.log('\\nWaiting for approval in the browser\u2026');\n }\n\n while (!completed) {\n const input = await prompt(\"\\nFallback code if automatic login doesn't complete: \");\n const cleaned = input.trim();\n\n if (completed) {\n break;\n }\n\n if (!cleaned) {\n continue;\n }\n\n if (!/^[0-9]{6}$/.test(cleaned)) {\n console.log('Codes must be exactly six digits.');\n continue;\n }\n\n try {\n await completeLogin(cleaned);\n } catch (error) {\n if (error instanceof ApiError) {\n if (error.status === 401) {\n console.log('Code not recognized. Double-check the digits shown in the browser.');\n continue;\n }\n if (error.status === 409) {\n console.log('Browser approval already completed. Finishing up\u2026');\n completed = true;\n break;\n }\n }\n await loopback?.stop();\n throw error;\n }\n }\n\n await loopback?.stop();\n\n if (!latestCredentials) {\n const stored = await store.load();\n if (stored) {\n latestCredentials = stored;\n } else {\n throw new Error('Login completed but credentials were not stored.');\n }\n }\n\n return latestCredentials;\n}\n\nconst DEFAULT_BACKEND_URL = 'https://api.omnara.com/';\nconst DEFAULT_FRONTEND_URL = 'https://www.omnara.com/';\n\nexport function resolveBackendUrl(option?: string): string {\n const candidate = option ?? process.env.OMNARA_BACKEND_URL ?? DEFAULT_BACKEND_URL;\n return normalizeBaseUrl(candidate);\n}\n\nexport function resolveFrontendUrl(option?: string): string {\n const candidate = option ?? process.env.OMNARA_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n return normalizeBaseUrl(candidate);\n}\n\nexport function mergeCredentialsAfterExchange(args: {\n exchange: ExchangeCliCodeResult;\n}): StoredCredentials {\n const now = Date.now();\n const accessExpiresAt = new Date(now + args.exchange.accessTokenExpiresIn * 1000).toISOString();\n const refreshExpiresAt = new Date(now + args.exchange.refreshTokenExpiresIn * 1000).toISOString();\n\n return {\n accessToken: args.exchange.accessToken,\n accessTokenExpiresAt: accessExpiresAt,\n refreshToken: args.exchange.refreshToken,\n refreshTokenExpiresAt: refreshExpiresAt,\n };\n}\n\nexport function formatDuration(ms: number): string {\n const totalSeconds = Math.round(ms / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n\n const totalMinutes = Math.round(totalSeconds / 60);\n if (totalMinutes < 60) {\n const seconds = totalSeconds % 60;\n return seconds > 0 ? `${totalMinutes}m ${seconds}s` : `${totalMinutes}m`;\n }\n\n const totalHours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (totalHours < 48) {\n return minutes > 0 ? `${totalHours}h ${minutes}m` : `${totalHours}h`;\n }\n\n const totalDays = Math.floor(totalHours / 24);\n const hours = totalDays % 24;\n return hours > 0 ? `${totalDays}d ${hours}h` : `${totalDays}d`;\n}\n\nfunction reportLoopbackError(error: unknown): void {\n if (error instanceof ApiError) {\n console.log(\n `Automatic login failed (HTTP ${error.status}). Paste the 6-digit code shown in the browser.`,\n );\n return;\n }\n console.log(`Automatic login failed: ${extractErrorMessage(error)}`);\n}\n\nfunction printSessionInstructions(session: CliAuthSession): void {\n console.log('\\nOpen this link in your browser if it did not open automatically:');\n console.log(` ${session.verificationUriComplete}`);\n console.log('Approve the request, then return to the CLI.');\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n\nasync function waitForLoopback(\n listener: LoopbackListener,\n sessionId: string,\n onCode: (code: string) => Promise<void>,\n): Promise<void> {\n try {\n const callback = await listener.waitForCallback();\n if (callback.sessionId && callback.sessionId !== sessionId) {\n console.log('Received browser callback for a different session.');\n return;\n }\n if (callback.state && callback.state !== listener.state) {\n console.log('Received browser callback with unexpected state.');\n return;\n }\n\n try {\n await onCode(callback.code);\n } catch (error) {\n reportLoopbackError(error);\n }\n } catch (error) {\n console.log(`Loopback listener error: ${extractErrorMessage(error)}`);\n }\n}\n", "import type { Console } from 'node:console';\n\nimport { CredentialsStore } from './credentials-store.js';\nimport { ensureAuthContext, type AuthContext } from './credential-manager.js';\nimport { performVerificationLogin } from './login-flow.js';\nimport { normalizeBaseUrl } from '../http/api-client.js';\n\nexport interface AuthProviderOptions {\n store: CredentialsStore;\n backendUrl: string;\n frontendUrl?: string;\n logger?: Console;\n}\n\nexport class AuthProvider {\n private cached: AuthContext | null = null;\n private readonly backendUrl: string;\n\n constructor(private readonly options: AuthProviderOptions) {\n this.backendUrl = normalizeBaseUrl(options.backendUrl);\n }\n\n async getAuthContext(): Promise<AuthContext> {\n const auth = await this.loadAuthContext();\n this.cached = auth;\n return auth;\n }\n\n async getAccessToken(): Promise<string> {\n const auth = await this.getAuthContext();\n return auth.accessToken;\n }\n\n private async loadAuthContext(): Promise<AuthContext> {\n try {\n return await ensureAuthContext(this.options.store, this.backendUrl);\n } catch (error) {\n if (!shouldAttemptLogin(error)) {\n throw error;\n }\n this.options.logger?.log('Opening browser to authenticate\u2026');\n await performVerificationLogin({\n backendUrlOption: this.backendUrl,\n frontendUrlOption: this.options.frontendUrl,\n store: this.options.store,\n });\n return await ensureAuthContext(this.options.store, this.backendUrl);\n }\n }\n}\n\nfunction shouldAttemptLogin(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message.includes('no credentials found') ||\n message.includes('run `omnara auth login` first') ||\n message.includes('refresh token expired') ||\n message.includes('refresh token unavailable') ||\n message.includes('access token expired')\n );\n}\n\nexport async function createAuthProvider(options: AuthProviderOptions): Promise<AuthProvider> {\n const provider = new AuthProvider(options);\n await provider.getAuthContext();\n return provider;\n}\n", "import { ApiClient } from './api-client.js';\n\ninterface CreateUserSessionRequestWire {\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface UserSessionDescriptor {\n kind: 'user_session';\n session_id: string;\n user_id: string;\n status: string;\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport async function createUserSession(\n client: ApiClient,\n accessToken: string,\n options: { name?: string; metadata?: Record<string, unknown> } = {},\n): Promise<UserSessionDescriptor> {\n const body: CreateUserSessionRequestWire = {\n name: options.name ?? null,\n metadata: options.metadata ?? null,\n };\n\n return await client.postJson<CreateUserSessionRequestWire, UserSessionDescriptor>(\n '/api/v1/user-sessions',\n body,\n { accessToken },\n );\n}\n", "import Ajv2020 from \"ajv/dist/2020.js\";\nimport addFormats from \"ajv-formats\";\n// Import JSON schemas directly for browser compatibility\nimport controlSchema from \"../../schemas/control_message.schema.json\" with { type: \"json\" };\nimport envelopeSchema from \"../../schemas/message_envelope.schema.json\" with { type: \"json\" };\nimport voiceLaunchRequestSchema from \"../../schemas/api_voice_launch_request.schema.json\" with { type: \"json\" };\nimport voiceLaunchResponseSchema from \"../../schemas/api_voice_launch_response.schema.json\" with { type: \"json\" };\nimport createUserSessionRequestSchema from \"../../schemas/api_sessions_create_request.schema.json\" with { type: \"json\" };\nimport userSessionSummarySchema from \"../../schemas/api_sessions_summary.schema.json\" with { type: \"json\" };\nimport userSessionListResponseSchema from \"../../schemas/api_sessions_list_response.schema.json\" with { type: \"json\" };\nimport messagePageResponseSchema from \"../../schemas/api_sessions_message_page_response.schema.json\" with { type: \"json\" };\nimport agentSessionDetailSchema from \"../../schemas/api_sessions_agent_detail.schema.json\" with { type: \"json\" };\nimport createChatMessageRequestSchema from \"../../schemas/api_sessions_create_chat_message_request.schema.json\" with { type: \"json\" };\nimport subscriptionResponseSchema from \"../../schemas/api_billing_subscription_response.schema.json\" with { type: \"json\" };\nimport usageResponseSchema from \"../../schemas/api_billing_usage_response.schema.json\" with { type: \"json\" };\nimport createCheckoutRequestSchema from \"../../schemas/api_billing_create_checkout_request.schema.json\" with { type: \"json\" };\nimport checkoutResponseSchema from \"../../schemas/api_billing_checkout_response.schema.json\" with { type: \"json\" };\nimport validatePromoRequestSchema from \"../../schemas/api_billing_validate_promo_request.schema.json\" with { type: \"json\" };\nimport promoValidationResponseSchema from \"../../schemas/api_billing_promo_validation_response.schema.json\" with { type: \"json\" };\nimport customerPortalRequestSchema from \"../../schemas/api_billing_customer_portal_request.schema.json\" with { type: \"json\" };\nimport customerPortalResponseSchema from \"../../schemas/api_billing_customer_portal_response.schema.json\" with { type: \"json\" };\nimport notificationRequestSchema from \"../../schemas/api_settings_notification_request.schema.json\" with { type: \"json\" };\nimport notificationResponseSchema from \"../../schemas/api_settings_notification_response.schema.json\" with { type: \"json\" };\nconst ajv = new Ajv2020({ strict: true, allErrors: true });\naddFormats(ajv);\n// Message validators\nexport const validateControlMessage = ajv.compile(controlSchema);\nexport const validateMessageEnvelope = ajv.compile(envelopeSchema);\n// Voice API validators\nexport const validateVoiceAgentLaunchRequest = ajv.compile(voiceLaunchRequestSchema);\nexport const validateVoiceAgentLaunchResponse = ajv.compile(voiceLaunchResponseSchema);\n// Sessions API validators\nexport const validateCreateUserSessionRequest = ajv.compile(createUserSessionRequestSchema);\nexport const validateUserSessionSummary = ajv.compile(userSessionSummarySchema);\nexport const validateUserSessionListResponse = ajv.compile(userSessionListResponseSchema);\nexport const validateMessagePageResponse = ajv.compile(messagePageResponseSchema);\nexport const validateAgentSessionDetail = ajv.compile(agentSessionDetailSchema);\nexport const validateCreateChatMessageRequest = ajv.compile(createChatMessageRequestSchema);\n// Billing API validators\nexport const validateSubscriptionResponse = ajv.compile(subscriptionResponseSchema);\nexport const validateUsageResponse = ajv.compile(usageResponseSchema);\nexport const validateCreateCheckoutSessionRequest = ajv.compile(createCheckoutRequestSchema);\nexport const validateCheckoutSessionResponse = ajv.compile(checkoutResponseSchema);\nexport const validateValidatePromoCodeRequest = ajv.compile(validatePromoRequestSchema);\nexport const validatePromoCodeValidationResponse = ajv.compile(promoValidationResponseSchema);\nexport const validateCustomerPortalSessionRequest = ajv.compile(customerPortalRequestSchema);\nexport const validateCustomerPortalSessionResponse = ajv.compile(customerPortalResponseSchema);\n// Settings API validators\nexport const validateUserNotificationSettingsRequest = ajv.compile(notificationRequestSchema);\nexport const validateUserNotificationSettingsResponse = ajv.compile(notificationResponseSchema);\n", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/ControlMessage\",\n \"title\": \"ControlMessage\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"CancelAgentMessage\": {\n \"additionalProperties\": false,\n \"description\": \"Request to cancel a running agent generation.\",\n \"properties\": {\n \"type\": {\n \"const\": \"cancel_agent\",\n \"default\": \"cancel_agent\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"target_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Target Session Id\",\n \"type\": \"string\"\n },\n \"reason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Reason\"\n }\n },\n \"required\": [\n \"target_session_id\"\n ],\n \"title\": \"CancelAgentMessage\",\n \"type\": \"object\"\n },\n \"CompletionItem\": {\n \"description\": \"A single completion item with type and result\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"slash_command\",\n \"file\",\n \"agent\"\n ],\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"result\": {\n \"title\": \"Result\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"result\"\n ],\n \"title\": \"CompletionItem\",\n \"type\": \"object\"\n },\n \"CompletionsRequest\": {\n \"description\": \"Query for autocomplete options\",\n \"properties\": {\n \"type\": {\n \"const\": \"completions\",\n \"default\": \"completions\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"query\": {\n \"title\": \"Query\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"query\"\n ],\n \"title\": \"CompletionsRequest\",\n \"type\": \"object\"\n },\n \"CompletionsResponse\": {\n \"description\": \"List of autocomplete options (i.e. files or /commands)\",\n \"properties\": {\n \"type\": {\n \"const\": \"completions\",\n \"default\": \"completions\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"completions\": {\n \"items\": {\n \"$ref\": \"#/$defs/CompletionItem\"\n },\n \"title\": \"Completions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"completions\"\n ],\n \"title\": \"CompletionsResponse\",\n \"type\": \"object\"\n },\n \"ErrorResponse\": {\n \"properties\": {\n \"type\": {\n \"const\": \"error\",\n \"default\": \"error\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"error\": {\n \"title\": \"Error\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"error\"\n ],\n \"title\": \"ErrorResponse\",\n \"type\": \"object\"\n },\n \"GitDiffRequest\": {\n \"description\": \"Query the git diff on a branch\",\n \"properties\": {\n \"type\": {\n \"const\": \"git_diff\",\n \"default\": \"git_diff\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"branch\": {\n \"title\": \"Branch\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"branch\"\n ],\n \"title\": \"GitDiffRequest\",\n \"type\": \"object\"\n },\n \"GitDiffResponse\": {\n \"description\": \"Git diff response for a given branch\\nTODO: add the actual definition\",\n \"properties\": {\n \"type\": {\n \"const\": \"git_diff\",\n \"default\": \"git_diff\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"diff\": {\n \"title\": \"Diff\",\n \"type\": \"null\"\n }\n },\n \"required\": [\n \"diff\"\n ],\n \"title\": \"GitDiffResponse\",\n \"type\": \"object\"\n },\n \"Heartbeat\": {\n \"additionalProperties\": false,\n \"description\": \"Ping/pong heartbeat frames.\",\n \"properties\": {\n \"type\": {\n \"const\": \"heartbeat\",\n \"default\": \"heartbeat\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"mode\": {\n \"default\": \"ping\",\n \"enum\": [\n \"ping\",\n \"pong\"\n ],\n \"title\": \"Mode\",\n \"type\": \"string\"\n },\n \"sent_at\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Sent At\"\n }\n },\n \"title\": \"Heartbeat\",\n \"type\": \"object\"\n },\n \"RelayRequestMessage\": {\n \"additionalProperties\": false,\n \"description\": \"RPC message for generic requests\",\n \"properties\": {\n \"type\": {\n \"const\": \"request\",\n \"default\": \"request\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"request_id\": {\n \"format\": \"uuid\",\n \"title\": \"Request Id\",\n \"type\": \"string\"\n },\n \"request\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/CompletionsRequest\"\n },\n {\n \"$ref\": \"#/$defs/GitDiffRequest\"\n }\n ],\n \"title\": \"Request\"\n }\n },\n \"required\": [\n \"request_id\",\n \"request\"\n ],\n \"title\": \"RelayRequestMessage\",\n \"type\": \"object\"\n },\n \"RelayResponseMessage\": {\n \"additionalProperties\": false,\n \"description\": \"RPC message for responses\",\n \"properties\": {\n \"type\": {\n \"const\": \"response\",\n \"default\": \"response\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"request_id\": {\n \"format\": \"uuid\",\n \"title\": \"Request Id\",\n \"type\": \"string\"\n },\n \"response\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/ErrorResponse\"\n },\n {\n \"$ref\": \"#/$defs/CompletionsResponse\"\n },\n {\n \"$ref\": \"#/$defs/GitDiffResponse\"\n }\n ],\n \"title\": \"Response\"\n }\n },\n \"required\": [\n \"request_id\",\n \"response\"\n ],\n \"title\": \"RelayResponseMessage\",\n \"type\": \"object\"\n },\n \"SessionAnnounce\": {\n \"additionalProperties\": false,\n \"description\": \"Notification that a session was created or updated.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_announce\",\n \"default\": \"session_announce\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n }\n ],\n \"title\": \"Session\"\n },\n \"origin\": {\n \"enum\": [\n \"backend\",\n \"client\"\n ],\n \"title\": \"Origin\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"session\",\n \"origin\"\n ],\n \"title\": \"SessionAnnounce\",\n \"type\": \"object\"\n },\n \"SessionBootstrap\": {\n \"additionalProperties\": false,\n \"description\": \"Initial snapshot of the session tree for this connection.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_bootstrap\",\n \"default\": \"session_bootstrap\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"root\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"root\"\n ],\n \"title\": \"SessionBootstrap\",\n \"type\": \"object\"\n },\n \"SessionClosed\": {\n \"additionalProperties\": false,\n \"description\": \"Indicates a session has been completed or shut down.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_closed\",\n \"default\": \"session_closed\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"status\"\n ],\n \"title\": \"SessionClosed\",\n \"type\": \"object\"\n },\n \"SessionInit\": {\n \"additionalProperties\": false,\n \"description\": \"Client request to register or refresh an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_init\",\n \"default\": \"session_init\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Session Id\",\n \"type\": \"string\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_session_id\",\n \"session_type\"\n ],\n \"title\": \"SessionInit\",\n \"type\": \"object\"\n },\n \"SessionInitAck\": {\n \"additionalProperties\": false,\n \"description\": \"Acknowledgement that a session_init was processed.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_init_ack\",\n \"default\": \"session_init_ack\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Session Id\",\n \"type\": \"string\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_session_id\"\n ],\n \"title\": \"SessionInitAck\",\n \"type\": \"object\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n }\n },\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/SessionInit\"\n },\n {\n \"$ref\": \"#/$defs/SessionBootstrap\"\n },\n {\n \"$ref\": \"#/$defs/SessionAnnounce\"\n },\n {\n \"$ref\": \"#/$defs/SessionInitAck\"\n },\n {\n \"$ref\": \"#/$defs/SessionClosed\"\n },\n {\n \"$ref\": \"#/$defs/Heartbeat\"\n },\n {\n \"$ref\": \"#/$defs/CancelAgentMessage\"\n },\n {\n \"$ref\": \"#/$defs/RelayRequestMessage\"\n },\n {\n \"$ref\": \"#/$defs/RelayResponseMessage\"\n }\n ]\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MessageEnvelope\",\n \"title\": \"MessageEnvelope\",\n \"$defs\": {\n \"AgentCompleteContent\": {\n \"additionalProperties\": false,\n \"description\": \"Completion marker for an agent session turn.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_complete\",\n \"default\": \"agent_complete\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"success\": {\n \"title\": \"Success\",\n \"type\": \"boolean\"\n },\n \"duration_ms\": {\n \"anyOf\": [\n {\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Duration Ms\"\n },\n \"cost_usd\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Cost Usd\"\n },\n \"message\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Message\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"success\"\n ],\n \"title\": \"AgentCompleteContent\",\n \"type\": \"object\"\n },\n \"AgentProgressContent\": {\n \"additionalProperties\": false,\n \"description\": \"Incremental progress emitted by an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_progress\",\n \"default\": \"agent_progress\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Detail\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"title\": \"AgentProgressContent\",\n \"type\": \"object\"\n },\n \"MessagePayload\": {\n \"additionalProperties\": false,\n \"description\": \"Application-level message data stored in the database and relayed to clients.\",\n \"properties\": {\n \"version\": {\n \"default\": 0,\n \"title\": \"Version\",\n \"type\": \"integer\"\n },\n \"content\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolCallContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentProgressContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentCompleteContent\"\n }\n ],\n \"title\": \"Content\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"title\": \"MessagePayload\",\n \"type\": \"object\"\n },\n \"SenderRef\": {\n \"additionalProperties\": false,\n \"description\": \"Reference to the author of a message.\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"user\",\n \"agent_session\"\n ],\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"id\": {\n \"format\": \"uuid\",\n \"title\": \"Id\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"id\"\n ],\n \"title\": \"SenderRef\",\n \"type\": \"object\"\n },\n \"TextContent\": {\n \"additionalProperties\": false,\n \"description\": \"Plain text content shared with the agent.\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"default\": \"text\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"text\": {\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"annotations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Annotations\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"title\": \"TextContent\",\n \"type\": \"object\"\n },\n \"ToolCallContent\": {\n \"additionalProperties\": false,\n \"description\": \"Tool invocation authored by the assistant.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_call\",\n \"default\": \"tool_call\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"name\": {\n \"title\": \"Name\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"arguments\": {\n \"additionalProperties\": true,\n \"title\": \"Arguments\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"name\",\n \"tool_use_id\",\n \"arguments\"\n ],\n \"title\": \"ToolCallContent\",\n \"type\": \"object\"\n },\n \"ToolResultContent\": {\n \"additionalProperties\": false,\n \"description\": \"Result produced by a previously invoked tool.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_result\",\n \"default\": \"tool_result\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"output\": {\n \"title\": \"Output\"\n },\n \"is_error\": {\n \"default\": false,\n \"title\": \"Is Error\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"tool_use_id\",\n \"output\"\n ],\n \"title\": \"ToolResultContent\",\n \"type\": \"object\"\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Complete message frame exchanged over transports.\",\n \"properties\": {\n \"message_id\": {\n \"format\": \"uuid\",\n \"title\": \"Message Id\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"sender\": {\n \"$ref\": \"#/$defs/SenderRef\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/MessagePayload\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message_id\",\n \"session_id\",\n \"sender\",\n \"payload\",\n \"created_at\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/VoiceAgentLaunchRequest\",\n \"title\": \"VoiceAgentLaunchRequest\",\n \"description\": \"Request to launch a voice agent for an agent session.\",\n \"properties\": {\n \"force\": {\n \"default\": false,\n \"description\": \"Launch even if the CLI relay is offline or owned by another user. When true, the request bypasses relay presence validation.\",\n \"title\": \"Force\",\n \"type\": \"boolean\"\n },\n \"room_name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Optional LiveKit room name override (defaults to derived prefix).\",\n \"title\": \"Room Name\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/VoiceAgentLaunchResponse\",\n \"title\": \"VoiceAgentLaunchResponse\",\n \"description\": \"Response containing LiveKit room and relay connection details.\",\n \"properties\": {\n \"session_id\": {\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"room_name\": {\n \"title\": \"Room Name\",\n \"type\": \"string\"\n },\n \"livekit_url\": {\n \"title\": \"Livekit Url\",\n \"type\": \"string\"\n },\n \"access_token\": {\n \"title\": \"Access Token\",\n \"type\": \"string\"\n },\n \"access_token_identity\": {\n \"title\": \"Access Token Identity\",\n \"type\": \"string\"\n },\n \"relay_ws_url\": {\n \"title\": \"Relay Ws Url\",\n \"type\": \"string\"\n },\n \"relay_token\": {\n \"title\": \"Relay Token\",\n \"type\": \"string\"\n },\n \"relay_token_expires_in\": {\n \"title\": \"Relay Token Expires In\",\n \"type\": \"integer\"\n },\n \"dispatch_id\": {\n \"title\": \"Dispatch Id\",\n \"type\": \"string\"\n },\n \"dispatch_metadata\": {\n \"additionalProperties\": true,\n \"title\": \"Dispatch Metadata\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"session_id\",\n \"room_name\",\n \"livekit_url\",\n \"access_token\",\n \"access_token_identity\",\n \"relay_ws_url\",\n \"relay_token\",\n \"relay_token_expires_in\",\n \"dispatch_id\",\n \"dispatch_metadata\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateUserSessionRequest\",\n \"title\": \"CreateUserSessionRequest\",\n \"description\": \"Payload for creating a new user session container.\",\n \"properties\": {\n \"name\": {\n \"anyOf\": [\n {\n \"maxLength\": 255,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserSessionSummary\",\n \"title\": \"UserSessionSummary\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n }\n },\n \"description\": \"Aggregated user session data returned to clients.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"session\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserSessionListResponse\",\n \"title\": \"UserSessionListResponse\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n },\n \"UserSessionSummary\": {\n \"description\": \"Aggregated user session data returned to clients.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"session\"\n ],\n \"title\": \"UserSessionSummary\",\n \"type\": \"object\"\n }\n },\n \"description\": \"Response containing a list of user sessions.\",\n \"properties\": {\n \"sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/UserSessionSummary\"\n },\n \"title\": \"Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"sessions\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MessagePageResponse\",\n \"title\": \"MessagePageResponse\",\n \"$defs\": {\n \"AgentCompleteContent\": {\n \"additionalProperties\": false,\n \"description\": \"Completion marker for an agent session turn.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_complete\",\n \"default\": \"agent_complete\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"success\": {\n \"title\": \"Success\",\n \"type\": \"boolean\"\n },\n \"duration_ms\": {\n \"anyOf\": [\n {\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Duration Ms\"\n },\n \"cost_usd\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Cost Usd\"\n },\n \"message\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Message\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"success\"\n ],\n \"title\": \"AgentCompleteContent\",\n \"type\": \"object\"\n },\n \"AgentProgressContent\": {\n \"additionalProperties\": false,\n \"description\": \"Incremental progress emitted by an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_progress\",\n \"default\": \"agent_progress\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Detail\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"title\": \"AgentProgressContent\",\n \"type\": \"object\"\n },\n \"MessageEnvelope\": {\n \"additionalProperties\": false,\n \"description\": \"Complete message frame exchanged over transports.\",\n \"properties\": {\n \"message_id\": {\n \"format\": \"uuid\",\n \"title\": \"Message Id\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"sender\": {\n \"$ref\": \"#/$defs/SenderRef\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/MessagePayload\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message_id\",\n \"session_id\",\n \"sender\",\n \"payload\",\n \"created_at\"\n ],\n \"title\": \"MessageEnvelope\",\n \"type\": \"object\"\n },\n \"MessagePayload\": {\n \"additionalProperties\": false,\n \"description\": \"Application-level message data stored in the database and relayed to clients.\",\n \"properties\": {\n \"version\": {\n \"default\": 0,\n \"title\": \"Version\",\n \"type\": \"integer\"\n },\n \"content\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolCallContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentProgressContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentCompleteContent\"\n }\n ],\n \"title\": \"Content\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"title\": \"MessagePayload\",\n \"type\": \"object\"\n },\n \"SenderRef\": {\n \"additionalProperties\": false,\n \"description\": \"Reference to the author of a message.\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"user\",\n \"agent_session\"\n ],\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"id\": {\n \"format\": \"uuid\",\n \"title\": \"Id\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"id\"\n ],\n \"title\": \"SenderRef\",\n \"type\": \"object\"\n },\n \"TextContent\": {\n \"additionalProperties\": false,\n \"description\": \"Plain text content shared with the agent.\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"default\": \"text\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"text\": {\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"annotations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Annotations\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"title\": \"TextContent\",\n \"type\": \"object\"\n },\n \"ToolCallContent\": {\n \"additionalProperties\": false,\n \"description\": \"Tool invocation authored by the assistant.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_call\",\n \"default\": \"tool_call\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"name\": {\n \"title\": \"Name\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"arguments\": {\n \"additionalProperties\": true,\n \"title\": \"Arguments\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"name\",\n \"tool_use_id\",\n \"arguments\"\n ],\n \"title\": \"ToolCallContent\",\n \"type\": \"object\"\n },\n \"ToolResultContent\": {\n \"additionalProperties\": false,\n \"description\": \"Result produced by a previously invoked tool.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_result\",\n \"default\": \"tool_result\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"output\": {\n \"title\": \"Output\"\n },\n \"is_error\": {\n \"default\": false,\n \"title\": \"Is Error\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"tool_use_id\",\n \"output\"\n ],\n \"title\": \"ToolResultContent\",\n \"type\": \"object\"\n }\n },\n \"description\": \"Paginated response for session messages.\",\n \"properties\": {\n \"messages\": {\n \"items\": {\n \"$ref\": \"#/$defs/MessageEnvelope\"\n },\n \"title\": \"Messages\",\n \"type\": \"array\"\n },\n \"has_more\": {\n \"default\": false,\n \"title\": \"Has More\",\n \"type\": \"boolean\"\n },\n \"next_cursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Next Cursor\"\n }\n },\n \"required\": [\n \"messages\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/AgentSessionDetail\",\n \"title\": \"AgentSessionDetail\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n }\n },\n \"description\": \"Detailed agent session with child sessions.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"child_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Child Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"session\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateChatMessageRequest\",\n \"title\": \"CreateChatMessageRequest\",\n \"description\": \"Simple text payload for dashboard/mobile chat fallbacks.\",\n \"properties\": {\n \"text\": {\n \"minLength\": 1,\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/SubscriptionResponse\",\n \"title\": \"SubscriptionResponse\",\n \"description\": \"Current subscription details for a user.\",\n \"properties\": {\n \"id\": {\n \"title\": \"Id\",\n \"type\": \"string\"\n },\n \"plan_type\": {\n \"title\": \"Plan Type\",\n \"type\": \"string\"\n },\n \"agent_limit\": {\n \"title\": \"Agent Limit\",\n \"type\": \"integer\"\n },\n \"current_period_end\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Current Period End\"\n },\n \"cancel_at_period_end\": {\n \"default\": false,\n \"title\": \"Cancel At Period End\",\n \"type\": \"boolean\"\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Provider\"\n },\n \"plan_display_name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Human-friendly plan label (e.g. Pro, Starter).\",\n \"title\": \"Plan Display Name\"\n },\n \"plan_price_amount\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Recurring charge amount for the plan (in major currency units).\",\n \"title\": \"Plan Price Amount\"\n },\n \"plan_price_currency\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"ISO currency for the recurring charge (e.g. usd).\",\n \"title\": \"Plan Price Currency\"\n },\n \"plan_price_interval\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Billing interval for the recurring charge (e.g. month, year).\",\n \"title\": \"Plan Price Interval\"\n }\n },\n \"required\": [\n \"id\",\n \"plan_type\",\n \"agent_limit\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UsageResponse\",\n \"title\": \"UsageResponse\",\n \"description\": \"Current usage statistics for a subscription period.\",\n \"properties\": {\n \"total_agents\": {\n \"title\": \"Total Agents\",\n \"type\": \"integer\"\n },\n \"agent_limit\": {\n \"title\": \"Agent Limit\",\n \"type\": \"integer\"\n },\n \"period_start\": {\n \"format\": \"date-time\",\n \"title\": \"Period Start\",\n \"type\": \"string\"\n },\n \"period_end\": {\n \"format\": \"date-time\",\n \"title\": \"Period End\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"total_agents\",\n \"agent_limit\",\n \"period_start\",\n \"period_end\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateCheckoutSessionRequest\",\n \"title\": \"CreateCheckoutSessionRequest\",\n \"description\": \"Request to create a Stripe checkout session.\",\n \"properties\": {\n \"plan_type\": {\n \"description\": \"Target plan type (e.g. pro, enterprise).\",\n \"title\": \"Plan Type\",\n \"type\": \"string\"\n },\n \"success_url\": {\n \"description\": \"URL to redirect to after successful checkout.\",\n \"title\": \"Success Url\",\n \"type\": \"string\"\n },\n \"cancel_url\": {\n \"description\": \"URL to redirect to if the user cancels checkout.\",\n \"title\": \"Cancel Url\",\n \"type\": \"string\"\n },\n \"promo_code\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Optional promotional code to pre-apply to the checkout session.\",\n \"title\": \"Promo Code\"\n }\n },\n \"required\": [\n \"plan_type\",\n \"success_url\",\n \"cancel_url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CheckoutSessionResponse\",\n \"title\": \"CheckoutSessionResponse\",\n \"description\": \"Response containing checkout session details.\",\n \"properties\": {\n \"session_id\": {\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"checkout_url\": {\n \"title\": \"Checkout Url\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"session_id\",\n \"checkout_url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/ValidatePromoCodeRequest\",\n \"title\": \"ValidatePromoCodeRequest\",\n \"description\": \"Request to validate a promotional code.\",\n \"properties\": {\n \"code\": {\n \"title\": \"Code\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/PromoCodeValidationResponse\",\n \"title\": \"PromoCodeValidationResponse\",\n \"description\": \"Response containing promotional code validation results.\",\n \"properties\": {\n \"valid\": {\n \"title\": \"Valid\",\n \"type\": \"boolean\"\n },\n \"code\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Code\"\n },\n \"discount_type\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Discount Type\"\n },\n \"discount_value\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Discount Value\"\n },\n \"description\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Description\"\n },\n \"error\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Error\"\n }\n },\n \"required\": [\n \"valid\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CustomerPortalSessionRequest\",\n \"title\": \"CustomerPortalSessionRequest\",\n \"description\": \"Request to create a Stripe Billing customer portal session.\",\n \"properties\": {\n \"return_url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Where Stripe should send the customer after they leave the portal.\",\n \"title\": \"Return Url\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CustomerPortalSessionResponse\",\n \"title\": \"CustomerPortalSessionResponse\",\n \"description\": \"Response containing the Stripe Billing customer portal session URL.\",\n \"properties\": {\n \"url\": {\n \"description\": \"Hosted Stripe customer portal URL.\",\n \"title\": \"Url\",\n \"type\": \"string\"\n },\n \"created\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Timestamp when the session was created.\",\n \"title\": \"Created\"\n },\n \"expires_at\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"When the portal session expires (if provided by Stripe).\",\n \"title\": \"Expires At\"\n }\n },\n \"required\": [\n \"url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserNotificationSettingsRequest\",\n \"title\": \"UserNotificationSettingsRequest\",\n \"description\": \"Request to update user notification preferences.\",\n \"properties\": {\n \"push_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Push Notifications Enabled\"\n },\n \"email_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Email Notifications Enabled\"\n },\n \"sms_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Sms Notifications Enabled\"\n },\n \"phone_number\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Phone Number\"\n },\n \"notification_email\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Notification Email\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserNotificationSettingsResponse\",\n \"title\": \"UserNotificationSettingsResponse\",\n \"description\": \"Response containing current notification settings.\",\n \"properties\": {\n \"push_notifications_enabled\": {\n \"title\": \"Push Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"email_notifications_enabled\": {\n \"title\": \"Email Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"sms_notifications_enabled\": {\n \"title\": \"Sms Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"phone_number\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Phone Number\"\n },\n \"notification_email\": {\n \"title\": \"Notification Email\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"push_notifications_enabled\",\n \"email_notifications_enabled\",\n \"sms_notifications_enabled\",\n \"phone_number\",\n \"notification_email\"\n ],\n \"type\": \"object\"\n}", "import readline from 'readline';\nimport { once } from 'events';\nimport WebSocket from 'ws';\nimport type { OutboundMessage } from '../orchestrator/orchestrator-types.js';\n\nexport interface ReplOptions {\n url?: string;\n headers?: Record<string, string>;\n initialSessionId?: string;\n parentSessionId?: string;\n initialMetadata?: Record<string, unknown>;\n initializeSession?: boolean;\n}\n\nconst DEFAULT_URL = 'ws://localhost:3001/ws';\n\nexport async function runTerminalRepl(options?: Partial<ReplOptions>): Promise<void> {\n const url = options?.url ?? DEFAULT_URL;\n const wsOptions = options?.headers ? { headers: options.headers } : undefined;\n const ws = wsOptions ? new WebSocket(url, wsOptions) : new WebSocket(url);\n\n await Promise.race([\n once(ws, 'open').then(() => undefined),\n once(ws, 'error').then(([error]) => {\n throw error;\n }),\n ]);\n\n console.log(`Connected to ${url}`);\n\n if (options?.initializeSession && options?.initialSessionId) {\n const payload: Record<string, unknown> = {\n type: 'session_init',\n sessionId: options.initialSessionId,\n };\n if (options.parentSessionId) {\n payload.parentSessionId = options.parentSessionId;\n }\n if (options.initialMetadata) {\n payload.metadata = options.initialMetadata;\n }\n sendMessage(ws, payload);\n }\n\n let currentSessionId: string | undefined = options?.initialSessionId;\n let awaitingResponse = false;\n let lastPrompt = promptForSession(currentSessionId);\n let shuttingDown = false;\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: lastPrompt,\n });\n\n ws.on('message', (data) => {\n handleOutboundMessage(\n maybeParseOutboundMessage(data),\n () => rl.prompt(true),\n (sessionId) => {\n currentSessionId = sessionId;\n updatePrompt();\n },\n () => {\n awaitingResponse = false;\n updatePrompt();\n },\n );\n });\n\n ws.on('close', (code, reason) => {\n console.log(\n `\\nDisconnected from server (code ${code}${reason ? `, reason: ${reason.toString()}` : ''})`,\n );\n if (!shuttingDown) {\n shuttingDown = true;\n rl.close();\n }\n });\n\n ws.on('error', (error) => {\n console.error('\\nWebSocket error:', error);\n if (!shuttingDown) {\n shuttingDown = true;\n rl.close();\n }\n });\n\n rl.on('line', (line) => {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n updatePrompt();\n return;\n }\n\n if (trimmed === '/exit' || trimmed === '/quit') {\n cleanup();\n return;\n }\n\n if (trimmed === '/new') {\n currentSessionId = undefined;\n console.log('\\nStarting a new session.');\n updatePrompt();\n return;\n }\n\n if (trimmed.startsWith('/join ')) {\n const target = trimmed.slice('/join '.length).trim();\n if (target.length === 0) {\n console.log('\\nUsage: /join <session-id>');\n updatePrompt();\n return;\n }\n\n currentSessionId = target;\n sendMessage(ws, { type: 'join', sessionId: target });\n updatePrompt();\n return;\n }\n\n if (trimmed === '/help') {\n printHelp();\n updatePrompt();\n return;\n }\n\n awaitingResponse = true;\n updatePrompt();\n\n sendMessage(ws, {\n type: 'chat',\n sessionId: currentSessionId,\n text: trimmed,\n });\n });\n\n rl.on('SIGINT', () => {\n cleanup();\n });\n\n rl.on('close', () => {\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close(1000, 'Client closing');\n }\n });\n\n rl.prompt();\n\n await new Promise<void>((resolve) => {\n rl.once('close', resolve);\n });\n\n function updatePrompt(): void {\n lastPrompt = promptForSession(currentSessionId, awaitingResponse);\n rl.setPrompt(lastPrompt);\n rl.prompt(true);\n }\n\n function cleanup(): void {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close(1000, 'Client closing');\n }\n rl.close();\n }\n}\n\nfunction promptForSession(sessionId: string | undefined, awaitingResponse = false): string {\n const base = sessionId ? `session:${sessionId.slice(0, 6)}` : 'session:new';\n return `${awaitingResponse ? '*' : ''}${base}> `;\n}\n\nfunction sendMessage(ws: WebSocket, payload: unknown): void {\n if (ws.readyState !== WebSocket.OPEN) {\n console.warn('Cannot send message: socket is not open.');\n return;\n }\n try {\n ws.send(JSON.stringify(payload));\n } catch (error) {\n console.error('Failed to send message:', error);\n }\n}\n\nfunction maybeParseOutboundMessage(data: WebSocket.RawData): OutboundMessage | null {\n try {\n const text = typeof data === 'string' ? data : data.toString('utf8');\n return JSON.parse(text) as OutboundMessage;\n } catch (error) {\n console.error('Failed to parse server message:', error);\n return null;\n }\n}\n\nfunction handleOutboundMessage(\n message: OutboundMessage | null,\n onPrompt: () => void,\n onSessionChange: (sessionId: string) => void,\n onTurnComplete: () => void,\n): void {\n if (!message) {\n return;\n }\n\n switch (message.type) {\n case 'session_created':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [server] Session created: ${message.sessionId}`,\n );\n onSessionChange(message.sessionId);\n break;\n case 'session_joined':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [server] Joined session: ${message.sessionId}`,\n );\n onSessionChange(message.sessionId);\n break;\n case 'session_init':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [server] Session init (parent: ${message.parentSessionId ?? 'none'})`,\n );\n break;\n case 'session_init_ack':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [server] Session init acknowledged (parent: ${message.parentSessionId ?? 'none'})`,\n );\n break;\n case 'user_text':\n if (message.origin === 'worker') {\n console.log(`\\n${formatSessionPrefix(message.sessionId)} worker> ${message.text}`);\n } else {\n console.log(`\\n${formatSessionPrefix(message.sessionId)} you> ${message.text}`);\n }\n break;\n case 'assistant_text':\n process.stdout.write(`\\n${formatSessionPrefix(message.sessionId)} claude> ${message.text}`);\n break;\n case 'agent_complete': {\n const status = message.success ? 'Success' : 'Failure';\n const duration = message.durationMs != null ? ` (${message.durationMs}ms)` : '';\n const cost = message.costUsd != null ? ` cost: $${message.costUsd.toFixed(4)}` : '';\n const summary = message.message ? ` - ${message.message}` : '';\n const metadata = message.metadata ?? {};\n const agentId =\n typeof metadata.agent_session_id === 'string' ? metadata.agent_session_id : undefined;\n const taskLabel = typeof metadata.task === 'string' ? ` (${metadata.task})` : '';\n const agentLabel = agentId ? ` [agent:${agentId}]` : '';\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [complete${agentLabel}${taskLabel}] ${status}${duration}${cost}${summary}`,\n );\n onTurnComplete();\n break;\n }\n case 'tool_call':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [tool] Using ${message.toolName} (${message.toolUseId}):`,\n safeStringify(message.input),\n );\n break;\n case 'tool_result':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [tool] Result for ${message.toolUseId}${message.isError ? ' (error)' : ''}:`,\n safeStringify(message.content),\n );\n break;\n case 'agent_progress':\n {\n const status = (message.status ?? 'update').toUpperCase();\n const detail = message.detail ? ` - ${message.detail}` : '';\n const metadata = message.metadata ?? {};\n const agentId =\n typeof metadata.agent_session_id === 'string' ? metadata.agent_session_id : undefined;\n const relatedSessionId =\n message.sessionId ||\n (typeof metadata.origin_session_id === 'string'\n ? metadata.origin_session_id\n : undefined) ||\n agentId;\n const agentLabel = agentId ? ` [agent:${agentId}]` : '';\n console.log(`\\n${formatSessionPrefix(relatedSessionId)}${agentLabel} ${status}${detail}`);\n }\n break;\n case 'system':\n console.log(`\\n${formatSessionPrefix(message.sessionId)} [system] ${message.subtype}`);\n if (message.subtype === 'init') {\n onTurnComplete();\n }\n break;\n case 'error':\n console.error(`\\n${formatSessionPrefix(message.sessionId)} [error] ${message.message}`);\n onTurnComplete();\n break;\n case 'pong':\n // No-op; keep connection alive.\n break;\n default:\n console.log(\n `\\n${formatSessionPrefix((message as { sessionId?: string }).sessionId)} [server]`,\n safeStringify(message),\n );\n break;\n }\n\n onPrompt();\n}\n\nfunction safeStringify(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction formatSessionPrefix(sessionId: string | undefined): string {\n if (!sessionId) {\n return '[session:unknown]';\n }\n return `[session:${sessionId}]`;\n}\n\nfunction printHelp(): void {\n console.log(`\\nCommands:\n /new Start a new session\n /join <id> Join an existing session\n /help Show this help text\n /exit Quit the REPL\n`);\n}\n", "import { ApiClient } from '../http/api-client.js';\n\ninterface VoiceLaunchRequestWire {\n force?: boolean;\n room_name?: string | null;\n}\n\ninterface VoiceLaunchResponseWire {\n session_id: string;\n room_name: string;\n livekit_url: string;\n access_token: string;\n access_token_identity: string;\n relay_ws_url: string;\n relay_token: string;\n relay_token_expires_in: number;\n dispatch_id: string;\n dispatch_metadata: Record<string, unknown>;\n}\n\nexport interface VoiceLaunchResult {\n sessionId: string;\n roomName: string;\n livekitUrl: string;\n accessToken: string;\n accessTokenIdentity: string;\n relayWsUrl: string;\n relayToken: string;\n relayTokenExpiresIn: number;\n dispatchId: string;\n dispatchMetadata: Record<string, unknown>;\n}\n\nexport interface LaunchVoiceOptions {\n sessionId: string;\n force?: boolean;\n roomName?: string;\n}\n\nexport async function launchVoiceForSession(\n client: ApiClient,\n accessToken: string,\n options: LaunchVoiceOptions,\n): Promise<VoiceLaunchResult> {\n const path = `/api/v1/voice/sessions/${options.sessionId}/launch`;\n const requestBody: VoiceLaunchRequestWire = {};\n\n if (options.force) {\n requestBody.force = true;\n }\n if (options.roomName) {\n requestBody.room_name = options.roomName;\n }\n\n const response = await client.postJson<VoiceLaunchRequestWire, VoiceLaunchResponseWire>(\n path,\n requestBody,\n { accessToken },\n );\n\n return {\n sessionId: response.session_id,\n roomName: response.room_name,\n livekitUrl: response.livekit_url,\n accessToken: response.access_token,\n accessTokenIdentity: response.access_token_identity,\n relayWsUrl: response.relay_ws_url,\n relayToken: response.relay_token,\n relayTokenExpiresIn: response.relay_token_expires_in,\n dispatchId: response.dispatch_id,\n dispatchMetadata: response.dispatch_metadata ?? {},\n };\n}\n", "import { execSync } from 'child_process';\nimport chalk from 'chalk';\n\n/**\n * Checks if Claude Code is installed and available in the system\n */\nexport function checkClaudeCodeInstallation(): boolean {\n try {\n // Try to execute claude command to check if it's available\n execSync('claude --version', {\n stdio: 'ignore',\n encoding: 'utf-8',\n env: process.env,\n });\n return true;\n } catch {\n // Command not found or execution failed\n return false;\n }\n}\n\n/**\n * Checks if ANTHROPIC_API_KEY environment variable is set\n */\nexport function checkAnthropicApiKey(): boolean {\n return !!process.env.ANTHROPIC_API_KEY && process.env.ANTHROPIC_API_KEY.trim().length > 0;\n}\n\n/**\n * Displays a warning message if neither authentication method is available\n */\nexport function displayClaudeCodeWarning(): void {\n console.log(\n chalk.yellow(\n \"\\nWarning: Omnara needs access to the Anthropic API. Omnara didn't detect claude installed, nor did it find a valid API key. If you run into authentication errors, login via `claude login` or pass in an ANTHROPIC_API_KEY as an environment variable.\\n\",\n ),\n );\n}\n\n/**\n * Performs the Claude Code check and displays warning if needed\n * @param options - Optional configuration for the check\n * @returns boolean indicating if either authentication method is available\n */\nexport function performClaudeCodeCheck(\n options: {\n silent?: boolean;\n exitOnMissing?: boolean;\n } = {},\n): boolean {\n const { silent = false, exitOnMissing = false } = options;\n\n // Allow disabling the check via environment variable\n if (process.env.OMNARA_SKIP_CLAUDE_CHECK === 'true') {\n return true;\n }\n\n const isClaudeInstalled = checkClaudeCodeInstallation();\n const hasApiKey = checkAnthropicApiKey();\n const hasAuthentication = isClaudeInstalled || hasApiKey;\n\n // Only warn if BOTH checks fail\n if (!hasAuthentication && !silent) {\n displayClaudeCodeWarning();\n\n if (exitOnMissing) {\n console.error(chalk.red('Exiting: Authentication is required for this operation.'));\n process.exit(1);\n }\n }\n\n return hasAuthentication;\n}\n\n/**\n * Gets Claude Code version if installed\n */\nexport function getClaudeCodeVersion(): string | null {\n try {\n const version = execSync('claude --version', {\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n env: process.env,\n }).trim();\n return version;\n } catch {\n return null;\n }\n}\n", "import { Command } from 'commander';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport type { StoredCredentials } from '../auth/credentials-store.js';\nimport { ApiError } from '../http/api-client.js';\nimport { performVerificationLogin, resolveBackendUrl, formatDuration } from '../auth/login-flow.js';\n\ninterface LoginOptions {\n backendUrl?: string;\n frontendUrl?: string;\n}\n\nexport function buildAuthCommand(): Command {\n const auth = new Command('auth').description('Authenticate the Omnara CLI.');\n\n auth\n .command('login')\n .description('Authenticate via the browser-based verification flow.')\n .option('--backend-url <url>', 'Backend base URL')\n .option('--frontend-url <url>', 'Frontend URL to open for verification')\n .action(async (options: LoginOptions) => {\n const store = new CredentialsStore();\n const backendUrl = resolveBackendUrl(options.backendUrl);\n\n try {\n await performVerificationLogin({\n backendUrlOption: backendUrl,\n frontendUrlOption: options.frontendUrl,\n store,\n });\n } catch (error) {\n if (error instanceof ApiError) {\n console.error(`\\nRequest failed (HTTP ${error.status}): ${error.message}`);\n } else {\n console.error(`\\nLogin failed: ${extractErrorMessage(error)}`);\n }\n process.exitCode = 1;\n }\n });\n\n auth\n .command('logout')\n .description('Remove stored CLI credentials.')\n .action(async () => {\n const store = new CredentialsStore();\n await store.clear();\n console.log('Credentials cleared.');\n });\n\n auth\n .command('status')\n .description('Show stored CLI credential details.')\n .action(async () => {\n const store = new CredentialsStore();\n const credentials = await store.load();\n if (!credentials) {\n console.log('No credentials stored.');\n return;\n }\n\n printStatus(credentials);\n });\n\n return auth;\n}\n\nfunction printStatus(credentials: StoredCredentials): void {\n if (credentials.accessToken) {\n const accessStatus = describeExpiry(credentials.accessTokenExpiresAt);\n const refreshStatus = credentials.refreshTokenExpiresAt\n ? describeExpiry(credentials.refreshTokenExpiresAt)\n : 'unknown expiry';\n console.log(\n `Authentication: Supabase access token (${accessStatus}), Refresh token (${refreshStatus})`,\n );\n return;\n }\n\n console.log('Authentication: Not configured');\n}\n\nfunction describeExpiry(iso?: string): string {\n if (!iso) {\n return 'unknown expiry';\n }\n const timestamp = Date.parse(iso);\n if (Number.isNaN(timestamp)) {\n return 'invalid timestamp';\n }\n const diff = timestamp - Date.now();\n const abs = Math.abs(diff);\n const descriptor = formatDuration(abs);\n return diff >= 0 ? `expires in ${descriptor}` : `expired ${descriptor} ago`;\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n", "import https from 'https';\nimport { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\n\ninterface NpmPackageInfo {\n 'dist-tags': {\n latest: string;\n };\n versions: Record<string, unknown>;\n}\n\ninterface PackageJson {\n name?: string;\n version?: string;\n}\n\n/**\n * Fetches the latest version of a package from the npm registry\n */\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\n return new Promise((resolve) => {\n const url = `https://registry.npmjs.org/${packageName}`;\n\n https\n .get(url, { timeout: 3000 }, (res) => {\n let data = '';\n\n res.on('data', (chunk) => {\n data += chunk;\n });\n\n res.on('end', () => {\n try {\n if (res.statusCode !== 200) {\n resolve(null);\n return;\n }\n\n const packageInfo = JSON.parse(data) as NpmPackageInfo;\n resolve(packageInfo['dist-tags']?.latest || null);\n } catch {\n resolve(null);\n }\n });\n })\n .on('error', () => {\n resolve(null);\n })\n .on('timeout', () => {\n resolve(null);\n });\n });\n}\n\n/**\n * Compares two semantic versions\n * Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal\n */\nfunction compareVersions(v1: string, v2: string): number {\n const parts1 = v1.split('.').map(Number);\n const parts2 = v2.split('.').map(Number);\n\n for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {\n const part1 = parts1[i] || 0;\n const part2 = parts2[i] || 0;\n\n if (part1 > part2) return 1;\n if (part1 < part2) return -1;\n }\n\n return 0;\n}\n\n/**\n * Checks if a newer version is available and logs a message if so.\n * This function is non-blocking and will not throw errors.\n */\nexport async function checkForUpdates(): Promise<void> {\n try {\n const packageJson = require('../../package.json') as PackageJson;\n const currentVersion = packageJson.version;\n const packageName = packageJson.name;\n\n if (!currentVersion || !packageName) {\n return;\n }\n\n // Fetch latest version from npm registry\n const latestVersion = await fetchLatestVersion(packageName);\n\n if (!latestVersion) {\n return;\n }\n\n // Compare versions\n if (compareVersions(latestVersion, currentVersion) > 0) {\n console.log('\\n' + '\u2550'.repeat(60));\n console.log('Update available!');\n console.log(`Current version: ${currentVersion}`);\n console.log(`Latest version: ${latestVersion}`);\n console.log(`Run \\`npm install -g ${packageName}@latest\\` to update`);\n console.log('\u2550'.repeat(60) + '\\n');\n }\n } catch {\n // Silently ignore any errors to not disrupt CLI operation\n }\n}\n\n/**\n * Checks for updates in the background without blocking\n */\nexport function checkForUpdatesInBackground(): void {\n // Run the check asynchronously without awaiting\n checkForUpdates().catch(() => {\n // Silently ignore any errors\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "createRequire", "Command", "randomUUID", "prompt", "fs", "randomUUID", "simpleGit", "fs", "path", "path", "path", "extractErrorMessage", "fs", "os", "path", "extractErrorMessage", "info", "output", "prompt", "randomUUID", "query", "input", "simpleGit", "createSdkMcpServer", "tool", "z", "query", "path", "aName", "bName", "aDepth", "bDepth", "fs", "path", "z", "randomUUID", "randomUUID", "EventEmitter", "path", "extractErrorMessage", "normalizeBaseUrl", "input", "randomBytes", "base64UrlEncode", "input", "input", "extractErrorMessage", "EventEmitter", "extractErrorMessage", "randomUUID", "input", "output", "path", "readline", "WebSocket", "safeStringify", "path", "extractErrorMessage", "buildRelayWebsocketUrl", "path", "Command", "Command", "extractErrorMessage", "require", "packageJson", "require", "createRequire", "Command", "path"]
7
7
  }