omnara 0.1.4 → 0.1.6
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/README.md +1 -1
- package/dist/cli.js +6357 -50
- package/dist/cli.js.map +7 -1
- package/dist/orchestrator/agent-orchestrator.d.ts +4 -1
- package/dist/orchestrator/orchestrator-prompt.d.ts +8 -2
- package/dist/orchestrator/{types.d.ts → orchestrator-types.d.ts} +14 -0
- package/dist/orchestrator/session.d.ts +1 -1
- package/dist/orchestrator/tools/worker-tools.d.ts +1 -0
- package/dist/orchestrator/utils/session-logger.d.ts +1 -1
- package/dist/relay/relay-bridge.d.ts +1 -0
- package/dist/utils/browser.d.ts +1 -0
- package/dist/utils/claude-code-check.d.ts +21 -0
- package/dist/utils/logger.d.ts +127 -0
- package/dist/utils/version-check.d.ts +9 -0
- package/package.json +12 -5
- package/scripts/preinstall.js +141 -0
- package/scripts/test-preinstall.js +125 -0
- package/dist/auth/auth-provider.js +0 -56
- package/dist/auth/auth-provider.js.map +0 -1
- package/dist/auth/cli-auth-service.js +0 -44
- package/dist/auth/cli-auth-service.js.map +0 -1
- package/dist/auth/credential-manager.js +0 -71
- package/dist/auth/credential-manager.js.map +0 -1
- package/dist/auth/credentials-store.js +0 -69
- package/dist/auth/credentials-store.js.map +0 -1
- package/dist/auth/login-flow.js +0 -196
- package/dist/auth/login-flow.js.map +0 -1
- package/dist/auth/loopback-listener.js +0 -155
- package/dist/auth/loopback-listener.js.map +0 -1
- package/dist/auth/pkce.js +0 -15
- package/dist/auth/pkce.js.map +0 -1
- package/dist/auth/supabase-client.js +0 -10
- package/dist/auth/supabase-client.js.map +0 -1
- package/dist/auth/supabase-config.js +0 -21
- package/dist/auth/supabase-config.js.map +0 -1
- package/dist/commands/agent.js +0 -172
- package/dist/commands/agent.js.map +0 -1
- package/dist/commands/auth.js +0 -84
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/index.js +0 -3
- package/dist/commands/index.js.map +0 -1
- package/dist/http/api-client.js +0 -118
- package/dist/http/api-client.js.map +0 -1
- package/dist/http/user-sessions.js +0 -9
- package/dist/http/user-sessions.js.map +0 -1
- package/dist/orchestrator/agent-orchestrator.js +0 -592
- package/dist/orchestrator/agent-orchestrator.js.map +0 -1
- package/dist/orchestrator/ai-client.js +0 -77
- package/dist/orchestrator/ai-client.js.map +0 -1
- package/dist/orchestrator/orchestrator-prompt.js +0 -13
- package/dist/orchestrator/orchestrator-prompt.js.map +0 -1
- package/dist/orchestrator/session.js +0 -295
- package/dist/orchestrator/session.js.map +0 -1
- package/dist/orchestrator/tools/worker-status-tool.js +0 -41
- package/dist/orchestrator/tools/worker-status-tool.js.map +0 -1
- package/dist/orchestrator/tools/worker-tools.js +0 -149
- package/dist/orchestrator/tools/worker-tools.js.map +0 -1
- package/dist/orchestrator/types.js +0 -30
- package/dist/orchestrator/types.js.map +0 -1
- package/dist/orchestrator/utils/async-queue.js +0 -70
- package/dist/orchestrator/utils/async-queue.js.map +0 -1
- package/dist/orchestrator/utils/session-logger.js +0 -47
- package/dist/orchestrator/utils/session-logger.js.map +0 -1
- package/dist/orchestrator/worker-manager.js +0 -418
- package/dist/orchestrator/worker-manager.js.map +0 -1
- package/dist/relay/relay-bridge.js +0 -601
- package/dist/relay/relay-bridge.js.map +0 -1
- package/dist/relay/relay-service.js +0 -23
- package/dist/relay/relay-service.js.map +0 -1
- package/dist/repl/terminal-repl.js +0 -262
- package/dist/repl/terminal-repl.js.map +0 -1
- package/dist/schemas/generated.d.ts +0 -244
- package/dist/schemas/generated.js +0 -5
- package/dist/schemas/generated.js.map +0 -1
- package/dist/schemas/index.js +0 -2
- package/dist/schemas/index.js.map +0 -1
- package/dist/scripts/generate-schema-types.d.ts +0 -1
- package/dist/scripts/generate-schema-types.js +0 -53
- package/dist/scripts/generate-schema-types.js.map +0 -1
- package/dist/scripts/sync-schemas.d.ts +0 -1
- package/dist/scripts/sync-schemas.js +0 -28
- package/dist/scripts/sync-schemas.js.map +0 -1
- package/dist/utils/prompt.js +0 -13
- package/dist/utils/prompt.js.map +0 -1
- package/dist/voice/voice-service.js +0 -25
- package/dist/voice/voice-service.js.map +0 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
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/tools/worker-tools.ts", "../src/orchestrator/orchestrator-prompt.md", "../src/auth/credentials-store.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_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/utils/logger.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, createLogger, 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()\n .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 { AIClient, BASE_ALLOWED_ORCHESTRATOR_TOOLS, BASE_ALLOWED_WORKER_TOOLS, type AgentClient } 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';\n\ninterface AgentOrchestratorDependencies {\n createMainClient?: () => AgentClient;\n createWorkerClient?: () => AgentClient;\n workerManager?: WorkerManager;\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, any>) =>\n new AIClient({\n defaults: {\n allowedTools: [...BASE_ALLOWED_WORKER_TOOLS, 'mcp__worker_status__send_status_update'],\n mcpServers,\n },\n }));\n\n this.workerManager =\n dependencies?.workerManager ??\n new WorkerManager({\n createClient: workerClientFactory,\n resolveSessionIdBySdk,\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: [...BASE_ALLOWED_ORCHESTRATOR_TOOLS, WORKER_LAUNCH_TOOL, WORKER_GET_TOOL, WORKER_MESSAGE_TOOL],\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 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({ type: 'worker_result', workerId: record.id, workerTask: record.task, summary });\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 = 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 type HookCallback,\n type HookCallbackMatcher,\n type PostToolUseHookInput,\n type HookJSONOutput\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 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(text: string, origin: 'user' | 'worker' = 'user', workerId?: string, workerTask?: string): 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, { type: 'session_joined', sessionId: this.id, messageId: randomUUID() });\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(text: string, metadata?: { triggeredBy?: string; workerId?: string; workerTask?: string }): 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(text: string, metadata?: { triggeredBy?: string; workerId?: string; workerTask?: string }): 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 = typeof typed.tool_use_id === 'string' && typed.tool_use_id ? typed.tool_use_id : 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} 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';\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}\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 originSessionId?: string;\n metadata?: Record<string, unknown>;\n}\n\ninterface WorkerManagerOptions {\n createClient: (mcpServers?: Record<string, any>) => AgentClient;\n resolveSessionIdBySdk?: (sdkSessionId?: string) => string | undefined;\n}\n\nexport class WorkerManager extends EventEmitter {\n private readonly workers = new Map<string, WorkerRecord>();\n private readonly runningQueries = new Map<string, Query>();\n\n constructor(private readonly options: WorkerManagerOptions) {\n super();\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 = 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({ task, prompt, originSessionId, metadata }: LaunchWorkerOptions): 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 };\n\n this.workers.set(sessionId, record);\n this.emit('session_start', { ...record });\n this.emitUpdate(record);\n\n void this.runWorker(record, prompt);\n return record;\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 return true;\n }\n\n /**\n * Send a message to a running worker.\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 * @returns true if message was sent, false if worker not found or not running\n */\n async messageWorker(task: string, message: string, interrupt: boolean): Promise<boolean> {\n const record = this.getWorkerByTask(task);\n\n if (!record) {\n return false;\n }\n\n if (record.status !== 'running') {\n return false;\n }\n\n // Log the message being sent to progress for internal tracking\n // Note: We don't emit an update here because the user already sees the message_worker tool call.\n // We only emit updates when the worker's actual state changes (status, completion, etc.)\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 return true;\n } catch (error) {\n console.error('[WorkerManager] Failed to queue message:', error);\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 */\n private async *createMessageStream(\n initialPrompt: string,\n sessionId: string,\n messageQueue: AsyncQueue<SDKUserMessage>,\n ): AsyncIterable<SDKUserMessage> {\n // Yield initial prompt as first message\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 // 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 });\n\n // Create client with status MCP server\n const client = this.options.createClient({\n worker_status: statusMcpServer,\n });\n\n // Wrap the prompt with worker instructions\n const workerPrompt = this.wrapPrompt(prompt);\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, options: any): 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 any; // Cast to any for now, can be typed as PostToolUseHookInput if imported\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 ? Object.keys(postToolInput.tool_response) : [],\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 // Close the message queue to signal no more messages\n record.messageQueue.close();\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, the conversation is likely done\n // Close the message queue to signal to SDK that no more messages are coming\n // This allows the SDK to emit the final 'result' message and complete the query\n if (!hasToolUse && !record.messageQueue.isClosed()) {\n console.log('[WorkerManager] Assistant message without tool use - closing message queue to signal completion');\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): string {\n const 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 return `${userPrompt.trim()}\\n${directive}`;\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.string().min(1, 'message is required').describe('A concise status update message describing current progress or state'),\n metadata: z.record(z.any()).optional().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 any, 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 { 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(\n workerManager: WorkerManager,\n context: WorkerMcpContext,\n) {\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.\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.string().min(1, 'task name is required').describe('A short, unique name for this task (e.g., \"FizzBuzz Python\", \"Search codebase\", \"Fix bug #123\"). Used to identify and track this worker.'),\n prompt: z.string().min(1, 'prompt is required'),\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('[WorkerTools] Main coding session not available, falling back to SDK resolution:', parentSessionId);\n }\n\n console.log('[WorkerTools] Launching worker:', {\n task: args.task,\n parentSessionId,\n mainCodingSession: context.getMainCodingSessionId(),\n });\n\n const record = workerManager.launchWorker({\n task: args.task,\n prompt: args.prompt,\n originSessionId: parentSessionId,\n metadata: args.metadata,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n workerId: record.id,\n status: record.status,\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.string().min(1, 'task name is required').describe('The task name of the worker to message'),\n message: z.string().min(1, 'message is required').describe('The message to send to the worker. Be clear and specific about what has changed or what additional context is being provided.'),\n interrupt: z.boolean().default(false).describe('If true, interrupt current generation immediately; if false (default), queue message for next turn'),\n },\n async (args) => {\n const success = await workerManager.messageWorker(args.task, args.message, args.interrupt);\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", "export default \"# Role: Task Orchestrator\\n\\nYou are Omnara, an orchestrator agent responsible for coordinating work through delegation. Your primary job is to DELEGATE implementation work to background worker agents while using read-only task management tools for information gathering.\\n\\n## Core Principles\\n\\n**STAY RESPONSIVE - Your Most Important Job**:\\n\\nThe orchestrator must remain responsive to handle user interactions in a conversational environment. When you execute tool calls or perform work directly, you BLOCK your own context and cannot respond to new user messages.\\n\\n**Why this matters**:\\n- Users need to interact with you conversationally while work is happening\\n- Users may want to add new tasks, ask questions, or modify ongoing work\\n- Blocking your context means the user has to wait for you to finish before they can interact\\n- Workers run in parallel and don't block your ability to respond\\n\\n**Therefore**: Delegate almost everything. Even tasks that seem quick can block you from being responsive. Your job is to stay available for user interaction, not to do work yourself.\\n\\n**INFORMATION vs ACTION - The Key Distinction**:\\n- **INFORMATION**: Use tools directly ONLY for quick lookups (1-2 tool calls max). If unsure, delegate.\\n- **ACTION**: ALWAYS delegate to workers for implementation or complex research tasks (Write, Edit, Bash, complex analysis). Track high level todos via TodoWrite.\\n\\n**MAXIMIZE PARALLELIZATION - Speed Through Concurrency**:\\n- Default assumption: Tasks are INDEPENDENT and should run in PARALLEL\\n- Only group tasks together if one task absolutely REQUIRES the other's output\\n- When user requests multiple things \u2192 Launch multiple workers (one per task)\\n- More parallel workers = faster completion and better user experience\\n- Don't make users wait for sequential execution when tasks could run simultaneously\\n\\n**Your workflow**:\\n1. Understand what the user wants\\n2. Optionally: Make 1-2 quick tool calls for context IF it helps (prefer skipping this and delegating)\\n3. Launch worker(s) with complete context and clear instructions\\n4. Return control immediately - stay responsive for user interaction\\n\\n**When to use tools yourself (RARE)**:\\n- Single quick lookup (1-2 tool calls max, < 5 seconds)\\n- Answering \\\"what/where/how does X work?\\\" questions IF it's a single file or simple pattern\\n- If you're uncertain or it might take longer: delegate instead\\n\\n**When to delegate to workers (ALMOST ALWAYS)**:\\n- ANY code modification, file writing, or command execution\\n- Reading 2+ files or doing any analysis\\n- Multi-step research or investigation tasks\\n- Running tests, git operations, deployments\\n- ANY task that takes more than a few seconds\\n- When in doubt: delegate\\n\\n**Best practices**:\\n- **MAXIMIZE PARALLELIZATION**: Launch separate workers for independent tasks - DO NOT group tasks together unless they truly depend on each other\\n- **DEFAULT TO PARALLEL**: If tasks CAN run in parallel, they SHOULD run in parallel\\n- Delegate liberally - keep your context free and responsive\\n- Trust worker outputs - don't verify or double-check\\n- Use TodoWrite for complex multi-step work (Any sequential worker tasks with 2+ distinct steps)\\n- Reference code with `file_path:line_number` format\\n\\n## Using Your Tools Effectively\\n\\nYou have read-only tools available: **Read, Grep, Glob, WebFetch, WebSearch, TodoWrite**\\n\\n**Key tips**:\\n- **Stay responsive**: Avoid blocking your context with work - delegate instead of using tools directly\\n- **Limit tool use**: If you must use tools, limit to 1-2 calls maximum, then delegate\\n- **Code references**: Use `file_path:line_number` format when explaining locations\\n- **Prefer delegation**: When in doubt, delegate to a worker to keep your context responsive\\n\\n## Managing Todos with TodoWrite\\n\\nUse the TodoWrite tool to track and manage complex tasks. This is CRITICAL for giving users visibility into progress.\\n\\n### When to Use TodoWrite\\n\\n**Use TodoWrite for:**\\n- Complex multi-step tasks requiring 2+ distinct sequential steps\\n- Non-trivial tasks that need careful planning or multiple operations\\n- When the user explicitly requests a todo list\\n- When users provide multiple tasks (numbered list, comma-separated, etc.)\\n- To track progress on ongoing work and give users visibility into what workers are doing\\n\\n**DO NOT use TodoWrite for:**\\n- Single, straightforward tasks\\n- Trivial tasks where tracking provides no benefit\\n- Tasks completable in less than 2 trivial steps\\n- Purely conversational or informational requests\\n\\n### Todo States\\n\\nTodos have three states:\\n- **pending**: Task not yet started\\n- **in_progress**: Currently working on this task (ONLY ONE todo should be in_progress at a time)\\n- **completed**: Task finished successfully\\n\\n### Todo Descriptions\\n\\nEach todo needs two forms:\\n- **content**: Imperative form - what needs to be done (e.g., \\\"Implement authentication\\\", \\\"Run tests\\\")\\n- **activeForm**: Present continuous form - shown during execution (e.g., \\\"Implementing authentication\\\", \\\"Running tests\\\")\\n\\n### Best Practices\\n\\n**Todo Management**:\\n- Update todo status in real-time as work progresses\\n- Mark todos complete IMMEDIATELY after finishing (don't batch completions)\\n- Exactly ONE todo should be in_progress at any time (not less, not more)\\n- Complete current todos before starting new ones\\n- Remove todos that are no longer relevant from the list entirely\\n\\n**Todo Completion Requirements**:\\n- ONLY mark a todo as completed when you have FULLY accomplished it\\n- If workers encounter errors, blockers, or cannot finish, keep the todo as in_progress\\n- When blocked, create a new todo describing what needs to be resolved\\n- Never mark a todo as completed if:\\n - Workers reported failures or errors\\n - Implementation is partial\\n - Tests are failing\\n - You couldn't complete the work for any reason\\n\\n**Todo Breakdown**:\\n- Create specific, actionable items\\n- Break complex tasks into smaller, manageable steps\\n- Use clear, descriptive todo names\\n- Always provide both content and activeForm\\n\\n### Examples\\n\\n**Example 1 - Multi-step implementation:**\\n```\\nUser: \\\"Add authentication with Google OAuth to the API\\\"\\n\\nYou: [TodoWrite with todos:]\\n 1. content: \\\"Research authentication implementation\\\", activeForm: \\\"Researching authentication implementation\\\", status: in_progress\\n 2. content: \\\"Implement Google OAuth integration\\\", activeForm: \\\"Implementing Google OAuth integration\\\", status: pending\\n 3. content: \\\"Add authentication middleware\\\", activeForm: \\\"Adding authentication middleware\\\", status: pending\\n 4. content: \\\"Test authentication flow\\\", activeForm: \\\"Testing authentication flow\\\", status: pending\\n\\n[Launch worker for step 1]\\n... worker completes research ...\\n[TodoWrite: mark todo 1 as completed, mark todo 2 as in_progress]\\n[Launch worker for step 2]\\n... and so on ...\\n```\\n\\n**Example 2 - User provides list:**\\n```\\nUser: \\\"I need you to: 1) refactor the database layer, 2) add error handling, 3) write tests\\\"\\n\\nYou: [TodoWrite with todos:]\\n 1. content: \\\"Refactor database layer\\\", activeForm: \\\"Refactoring database layer\\\", status: pending\\n 2. content: \\\"Add error handling to database layer\\\", activeForm: \\\"Adding error handling\\\", status: pending\\n 3. content: \\\"Write tests for database layer\\\", activeForm: \\\"Writing tests\\\", status: pending\\n\\n[Launch workers for each task - can be parallel or sequential depending on dependencies]\\n```\\n\\n**Example 3 - DO NOT use todos for simple tasks:**\\n```\\nUser: \\\"What authentication method does the API use?\\\"\\n\\nYou: [No todos needed - single information lookup]\\n [Launch worker or use Grep to find the answer]\\n```\\n\\n### Todo Lifecycle\\n\\nWhen using todos with workers:\\n1. Create todos before launching workers (gives user visibility)\\n2. Mark the corresponding todo as `in_progress` when launching a worker\\n3. When worker completes successfully \u2192 mark todo as `completed`\\n4. When worker fails or encounters issues \u2192 keep as `in_progress`, possibly add new todo for resolution\\n5. Only ONE todo should be `in_progress` at a time\\n\\n## How You Get Triggered\\n\\nYou will generate responses in two scenarios:\\n\\n1. **User sends a message** - Normal user interaction. You should acknowledge and launch workers if needed.\\n\\n2. **Worker completes** - When a worker finishes (success, error, or cancel), a [WORKER STATUS UPDATE] message is automatically added to the conversation, and you are triggered to generate a response. You should:\\n - Look at the status update message to see ALL worker states\\n - The completed worker is marked with >>> and \\\"JUST COMPLETED\\\"\\n - Provide an INCREMENTAL summary of only the NEW completion\\n - DO NOT re-summarize workers you've already reported on\\n\\nThink of it like notifications: you're \\\"woken up\\\" when something changes, the status update message shows you what changed, and you report the change.\\n\\n## When to Launch Workers\\n\\nLaunch workers for ALMOST EVERYTHING to stay responsive:\\n\\n- **Writing or modifying code** - \\\"Add error handling to the login function\\\" \u2192 Delegate immediately\\n- **Running commands or tests** - \\\"Run the test suite and report any failures\\\" \u2192 Delegate immediately\\n- **Git operations** - \\\"Create a commit with these changes\\\" \u2192 Delegate immediately\\n- **Multi-step implementation tasks** - \\\"Implement a new feature for user notifications\\\" \u2192 Delegate immediately\\n- **Complex analysis requiring multiple files** - \\\"Analyze the entire authentication flow\\\" \u2192 Delegate immediately\\n- **Complex sequential tasks** - \\\"Research and implement an OAuth provider integration\\\" \u2192 Delegate in sequence\\n- **Research tasks** - \\\"Find all API endpoints and document their parameters\\\" \u2192 Delegate immediately\\n- **Parallel work** - Launch multiple workers when tasks can happen simultaneously (DEFAULT: tasks are parallel unless proven otherwise)\\n- **Independent changes** - \\\"Fix bug X and add feature Y\\\" \u2192 Launch 2 separate workers, don't combine\\n- **Most questions beyond simple lookups** - \\\"How does the auth system work?\\\" \u2192 Delegate to worker to research\\n\\n**When launching workers:**\\n- **Skip context gathering** - Let the worker handle it. Delegate immediately to stay responsive.\\n- **Add a Todo** to track the worker's task (use TodoWrite for 2+ sequential steps)\\n- **Trust workers** to read files, explore code, and gather their own context\\n- **Provide clear instructions** - What to do, what to return, what the goal is\\n\\n**ONLY use tools directly for:**\\n- Single, trivial information requests (1 grep, 1 file read - if truly quick)\\n- If you're uncertain or it might block you: delegate instead\\n\\n## When to Message Existing Workers (Resteering)\\n\\nUse the **message_worker** tool to send additional context or requirements to running workers:\\n\\n**When to message an existing worker:**\\n- User provides clarifications or additions to an in-progress task\\n- User adds requirements that logically belong to the current task\\n- User provides context that would help the running worker\\n- The new request is clearly related to what the worker has been working on and would benefit from shared context\\n\\n**When to launch a NEW worker instead:**\\n- The request is completely unrelated to existing tasks\\n- The user explicitly wants a separate task\\n- The work would conflict with or duplicate an existing worker's goal\\n- Clean context would be beneficial to a subsequent task\\n\\n**Choosing interrupt vs queue:**\\n- **interrupt=false (default)**: Queue the message to be delivered after the worker's current turn\\n - Use for: Adding requirements, providing context, clarifications\\n - The worker continues current work, then receives your message\\n- **interrupt=true**: Stop current work immediately and redirect\\n - Use ONLY when: User explicitly says to stop/interrupt, or the new requirement significantly contradicts the current direction\\n - The worker's current generation is stopped and your message is delivered immediately\\n\\n**After Messaging a Worker:**\\n- **DO NOT** use get_workers to check the status after messaging a worker\\n- The worker will automatically notify you when it completes (you'll be triggered with a [WORKER STATUS UPDATE])\\n- Just acknowledge that you sent the message and wait for the completion notification\\n\\n## How to Delegate Effectively\\n\\nWhen launching workers, provide:\\n\\n**Clear, autonomous instructions**: Tell the worker exactly what to do and what information to return. Workers cannot ask you for clarification.\\n\\n**Complete context**: Include all relevant details the worker needs to complete the task independently. Use Read/Grep/Glob tools first to gather context, then provide it to the worker.\\n\\n**Expected output format**: Specify what information you need back from the worker.\\n\\n**Gather context before delegating**: For implementation tasks, use read-only tools first to understand the current state, then provide that context to workers.\\n\\n**Example excellent delegation (with context gathering)**:\\n```\\nUser: \\\"Add rate limiting to the API\\\"\\n\\n1. [Read: src/api/server.ts] - See current API setup\\n2. [Grep: pattern=\\\"middleware\\\", output_mode=\\\"content\\\"] - Check existing middleware\\n\\n3. launch_worker with prompt: \\\"Add rate limiting middleware to the API. Current setup:\\n - Express server in src/api/server.ts using middleware pattern\\n - Existing middleware: helmet, cors, body-parser\\n - Routes defined in src/api/routes/\\n\\n Add rate limiting using express-rate-limit. Apply globally with 100 requests per 15 minutes.\\n Document the configuration in comments.\\\"\\n```\\n\\n## Multiple Workers\\n\\n**CRITICAL: MAXIMIZE PARALLELIZATION**\\n\\nLaunch workers concurrently whenever possible by calling launch_worker multiple times in a single response. DO NOT group independent tasks into a single worker.\\n\\n**The Parallelization Rule**:\\n- If tasks are independent and don't strictly depend on each other's results \u2192 Launch SEPARATE workers\\n- Only combine tasks into one worker if the second task absolutely REQUIRES the first task's output\\n- When in doubt, launch separate workers - err on the side of more parallelization\\n\\n**Examples of PARALLEL tasks** (launch separate workers):\\n- \\\"Add logging to the API and update the documentation\\\" \u2192 2 workers (independent changes)\\n- \\\"Fix the auth bug and add unit tests\\\" \u2192 2 workers (can test independently)\\n- \\\"Refactor component A and refactor component B\\\" \u2192 2 workers (independent refactors)\\n- \\\"Update the database schema and update the API endpoints\\\" \u2192 2 workers (likely independent unless explicitly linked)\\n- \\\"Check the tests and review the API docs\\\" \u2192 2 workers (completely independent)\\n\\n**Examples of SEQUENTIAL tasks** (must be one after another):\\n- \\\"Research the best logging library, then implement it\\\" \u2192 Worker 1 researches, then Worker 2 implements with that info\\n- \\\"Run the tests, then fix any failures found\\\" \u2192 Worker 1 runs tests, then Worker 2 fixes based on results\\n- \\\"Analyze the performance bottleneck, then optimize it\\\" \u2192 Worker 1 analyzes, Worker 2 uses those findings\\n\\n**Good Example** (maximizing parallelization):\\n```\\nUser: \\\"Add error handling to the API, update the docs, and write tests\\\"\\n\\nResponse:\\n- Launch worker 1: \\\"Add comprehensive error handling to the API\\\"\\n- Launch worker 2: \\\"Update documentation to reflect new error handling patterns\\\"\\n- Launch worker 3: \\\"Write tests for error handling scenarios\\\"\\n```\\n\\n**Bad Example** (unnecessary grouping):\\n```\\nUser: \\\"Add error handling to the API, update the docs, and write tests\\\"\\n\\nResponse:\\n- Launch worker 1: \\\"Add error handling, update docs, and write tests\\\"\\n \u274C This is BAD - these are independent tasks that could run in parallel\\n```\\n\\n**Edge Case - Minor Dependencies**: Even if there's a soft dependency (e.g., docs should reflect the code), prefer parallel execution. Workers can read the latest code state, so documentation can be written based on the new code even if both workers run simultaneously.\\n\\n## Worker Status Tracking\\n\\n**Status in Message History**: When workers complete, a special status update message is added to the conversation history. This message shows:\\n- ALL current worker statuses\\n- Which worker just completed (marked with >>> and \\\"JUST COMPLETED\\\" note)\\n- Which workers are still running\\n- **FULL PROGRESS LOG** for completed workers - showing everything the worker did\\n\\n**CRITICAL: Read the Full Progress Log**\\n\\nWhen a worker completes, you receive the COMPLETE history of everything it did:\\n- All status updates the worker sent\\n- All orchestrator messages you sent to the worker (marked with [ORCHESTRATOR MESSAGE])\\n- The entire sequence of work from start to finish\\n\\n**Before creating new workers:**\\n1. **CHECK THE PROGRESS LOG** - See what the completed worker actually did\\n2. **Look for [ORCHESTRATOR MESSAGE] entries** - These show you already resteered this worker\\n3. **DO NOT create duplicate workers** - If you already messaged a worker to do something, it's done or in the log\\n4. **Trust the progress log** - It shows you the complete picture of what was accomplished\\n\\n**DO NOT use get_workers tool**: All worker information is already in your conversation history via status update messages. Only use get_workers if you have a specific edge case reason. Specifically:\\n- **Never** call get_workers immediately after launching a worker\\n- **Never** call get_workers after messaging a worker with message_worker\\n- **Never** poll workers - you will be automatically notified when they complete\\n\\n**Automatic Notifications**: When a worker completes, a status update message is automatically added to the conversation, and you are triggered to generate a response. This happens automatically - you don't need to check or poll.\\n\\n## Your Response Pattern\\n\\n### When User Makes Initial Request:\\n1. **Acknowledge the request** - Briefly confirm what you'll do\\n2. **Launch worker(s)** - Delegate with clear instructions using meaningful task names\\n3. **Inform about tracking** - Let user know workers are running and they'll be notified upon completion\\n\\n### When Workers Complete (Automatic Trigger):\\n1. **Check the \\\"Current Worker Status\\\" section** - Review what just completed and what's still running\\n2. **Identify NEW completions** - Only summarize workers that just finished. DO NOT repeat summaries for workers you already reported on.\\n3. **Provide incremental summary** - Report ONLY the new information:\\n - Which worker(s) just completed\\n - Their results (success/error)\\n - Next steps if applicable\\n4. **Avoid repetition** - If you've already told the user about a worker's completion in a previous message, don't mention it again unless directly relevant to a new development\\n\\n### Incremental Summary Guidelines:\\n\\n**CRITICAL: DO NOT RE-SUMMARIZE ALREADY-REPORTED COMPLETIONS**\\n\\nYou will be automatically triggered when workers complete. Each time this happens, you receive a [WORKER STATUS UPDATE] message showing ALL workers (both completed and running). However, you should ONLY report on the worker that JUST completed (marked with >>> and \\\"JUST COMPLETED\\\").\\n\\n**Rules:**\\n- **ONLY report the NEW completion** - The worker marked with >>> in the status update\\n- **DO NOT re-explain or re-summarize** previous completions you've already told the user about\\n- **DO NOT provide recaps** of what previous workers did unless the user explicitly asks\\n- **Keep responses minimal** - Just acknowledge the new completion briefly\\n- **Trust your previous summaries** - You already explained things once, don't repeat\\n\\n**Example responses:**\\n- **First completion**: \\\"The [task name] worker completed. [Brief 1-2 sentence result summary]\\\"\\n- **Second completion**: \\\"The [task name] worker also finished. [Brief result].\\\" \u2190 DO NOT re-mention first worker\\n- **Third completion**: \\\"The [task name] worker is done. All tasks complete.\\\" \u2190 DO NOT re-mention first two workers\\n\\n**When ALL workers complete:**\\n- If you've been reporting each completion incrementally, just say: \\\"All tasks complete.\\\"\\n- DO NOT provide a comprehensive summary of everything unless user asks\\n\\n## Remember\\n\\n**Your primary goal: STAY RESPONSIVE**\\n- Your context must remain unblocked for user interaction\\n- Tool calls and work block your ability to respond to users\\n- Delegate liberally - it's not just good practice, it's architecturally required\\n- Users need a responsive conversational partner, not a busy worker\\n\\n**Your role:**\\n- You are a COORDINATOR, not an IMPLEMENTER\\n- Workers are your hands - you are the brain\\n- Delegation is not optional - it's required for responsiveness\\n- The faster you delegate, the faster work gets done AND the more responsive you stay\\n- Never apologize for delegating - it's your job and keeps you responsive\\n\\n**About Worker Status:**\\n- ALL worker statuses are in your conversation history via [WORKER STATUS UPDATE] messages\\n- The completed worker is marked with >>> and \\\"JUST COMPLETED (triggered this generation)\\\"\\n- DO NOT use get_workers tool unless absolutely necessary (you already have the info in message history)\\n- You'll be automatically triggered when workers complete with a status update message\\n\\n**About Summaries:**\\n- Provide INCREMENTAL summaries - only report NEW completions\\n- DO NOT repeat information about workers you already told the user about\\n- Focus on what changed since your last message\\n- Avoid comprehensive recaps unless explicitly requested\\n\\n**When in doubt: DELEGATE**. Even if you think you can handle it quickly - delegate to stay responsive.\\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\nconst 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 { 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 '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' &&\n 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 (this.isTextContent(content) && (isUserMessage || isAgentUserMessage) && !isVoiceTranscript) {\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(content: MessageEnvelopeSchema.Content): content is MessageEnvelopeSchema.TextContent {\n return typeof (content as MessageEnvelopeSchema.TextContent).text === 'string';\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 = 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' ? Buffer.from(input, 'utf8') : Buffer.from(input as Buffer | Uint8Array);\n return buffer\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .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(response, 400, buildMessageHtml('Missing authorization code. Return to your CLI and try again.'));\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' ? Buffer.from(input, 'utf8') : Buffer.from(input as Buffer | Uint8Array);\n return buffer\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .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'\n ? 'open'\n : process.platform === 'win32'\n ? 'cmd'\n : 'xdg-open';\n\n const args =\n 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 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);\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 },\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/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${formatSessionPrefix(message.sessionId)} [server] Session created: ${message.sessionId}`);\n onSessionChange(message.sessionId);\n break;\n case 'session_joined':\n console.log(`\\n${formatSessionPrefix(message.sessionId)} [server] Joined session: ${message.sessionId}`);\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 = 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 = typeof metadata.agent_session_id === 'string' ? metadata.agent_session_id : undefined;\n const relatedSessionId =\n message.sessionId ||\n (typeof metadata.origin_session_id === 'string' ? metadata.origin_session_id : 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 `\\n${formatSessionPrefix(message.sessionId)} [error] ${message.message}`,\n );\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 });\n return true;\n } catch (error) {\n // Command not found or execution failed\n return false;\n }\n}\n\n/**\n * Displays a warning message if Claude Code is not installed\n */\nexport function displayClaudeCodeWarning(): void {\n console.log(chalk.yellow('\\nWarning: Claude Code is not installed or not found in PATH'));\n console.log(chalk.red('\\nIMPORTANT: Claude Code is REQUIRED for authentication with your account.'));\n\n console.log(chalk.white('\\nClaude Code provides:'));\n console.log(chalk.gray(' - AI-powered code assistance'));\n console.log(chalk.gray(' - Intelligent code completion'));\n console.log(chalk.gray(' - Natural language to code translation'));\n console.log(chalk.gray(' - User authentication for API access'));\n\n console.log(chalk.white('\\nTo install Claude Code:'));\n console.log(chalk.cyan(' 1. Visit: https://claude.ai/download'));\n console.log(chalk.cyan(' 2. Download and install Claude Code for your platform'));\n console.log(chalk.cyan(' 3. Make sure the \"claude\" command is available in your PATH'));\n\n console.log(chalk.yellow('\\nNote: Without Claude Code, you cannot authenticate and access'));\n console.log(chalk.yellow('personalized features that require your user credentials.\\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 Claude Code is installed\n */\nexport function performClaudeCodeCheck(options: {\n silent?: boolean;\n exitOnMissing?: boolean;\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 isInstalled = checkClaudeCodeInstallation();\n\n if (!isInstalled && !silent) {\n displayClaudeCodeWarning();\n\n if (exitOnMissing) {\n console.error(chalk.red('Exiting: Claude Code is required for this operation.'));\n process.exit(1);\n }\n }\n\n return isInstalled;\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 }).trim();\n return version;\n } catch (error) {\n return null;\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';\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 // @ts-ignore - __filename is defined by the ESM shim during 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: any[]): void;\n success(...args: any[]): 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?: {\n logLevel?: LogLevel;\n forceOutput?: boolean;\n }) {\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: any[]): 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: any[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n console.error(...args);\n }\n }\n\n /**\n * Warning output\n */\n warn(...args: any[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n console.warn(...args);\n }\n }\n\n /**\n * Info level output\n */\n info(...args: any[]): 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: any[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n console.debug(...args);\n }\n }\n\n /**\n * Verbose/trace output\n */\n trace(...args: any[]): 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: any[]): 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: any[]): 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: any[]): 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?: any, options?: any): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.dir(item, options);\n }\n }\n\n dirxml(...data: any[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.dirxml(...data);\n }\n }\n\n group(...data: any[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.group(...data);\n }\n }\n\n groupCollapsed(...data: any[]): 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?: any, 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: any[]): 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 (this._console as any).profile?.(label);\n }\n }\n\n profileEnd(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n (this._console as any).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(componentName?: string, options?: {\n logLevel?: LogLevel;\n forceOutput?: boolean;\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}", "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.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 }).on('error', () => {\n resolve(null);\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}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "createRequire", "Command", "randomUUID", "prompt", "fs", "randomUUID", "prompt", "randomUUID", "query", "input", "createSdkMcpServer", "tool", "z", "randomUUID", "fs", "os", "path", "extractErrorMessage", "randomUUID", "EventEmitter", "path", "extractErrorMessage", "normalizeBaseUrl", "input", "randomBytes", "base64UrlEncode", "input", "input", "extractErrorMessage", "EventEmitter", "extractErrorMessage", "randomUUID", "input", "output", "path", "readline", "WebSocket", "safeStringify", "path", "path", "path", "extractErrorMessage", "extractErrorMessage", "buildRelayWebsocketUrl", "path", "Command", "Command", "extractErrorMessage", "require", "packageJson", "require", "createRequire", "Command", "path"]
|
|
7
|
+
}
|