omnara 0.1.10 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/bin/omnara.js +2 -2
  2. package/dist/auth/auth-provider.d.ts +9 -2
  3. package/dist/auth/cli-auth-service.d.ts +0 -1
  4. package/dist/auth/credential-manager.d.ts +10 -1
  5. package/dist/auth/credentials-store.d.ts +4 -1
  6. package/dist/auth/ensure-cli-credentials.d.ts +13 -0
  7. package/dist/cli.js +5132 -1478
  8. package/dist/cli.js.map +4 -4
  9. package/dist/commands/agent.d.ts +3 -2
  10. package/dist/commands/daemon.d.ts +2 -0
  11. package/dist/commands/index.d.ts +2 -1
  12. package/dist/config/omnara-config.d.ts +2 -17
  13. package/dist/daemon/config-store.d.ts +37 -0
  14. package/dist/daemon/daemon-client.d.ts +26 -0
  15. package/dist/daemon/daemon-launcher.d.ts +30 -0
  16. package/dist/daemon/daemon-service.d.ts +30 -0
  17. package/dist/daemon/directory-registry.d.ts +17 -0
  18. package/dist/daemon/file-logger.d.ts +24 -0
  19. package/dist/daemon/local-control-server.d.ts +37 -0
  20. package/dist/daemon/machine-supervisor.d.ts +60 -0
  21. package/dist/daemon/paths.d.ts +9 -0
  22. package/dist/daemon/run-daemon.d.ts +1 -0
  23. package/dist/daemon/session-log-manager.d.ts +10 -0
  24. package/dist/daemon/session-pid-registry.d.ts +5 -0
  25. package/dist/daemon/session-runner.d.ts +28 -0
  26. package/dist/daemon/state-store.d.ts +14 -0
  27. package/dist/http/machines.d.ts +3 -0
  28. package/dist/http/user-sessions.d.ts +5 -2
  29. package/dist/http/workspaces.d.ts +4 -0
  30. package/dist/orchestrator/agent-orchestrator.d.ts +7 -1
  31. package/dist/orchestrator/ai-client.d.ts +3 -0
  32. package/dist/orchestrator/orchestrator-prompt.md +171 -43
  33. package/dist/orchestrator/utils/completions-manager.d.ts +8 -0
  34. package/dist/orchestrator/utils/worktree-manager.d.ts +30 -1
  35. package/dist/orchestrator/worker-manager.d.ts +9 -4
  36. package/dist/orchestrator-prompt.md +171 -43
  37. package/dist/package-info.d.ts +3 -0
  38. package/dist/relay/relay-bridge.d.ts +12 -0
  39. package/dist/schemas/index.d.ts +2 -2
  40. package/dist/utils/claude-code-check.d.ts +1 -20
  41. package/dist/utils/version-check.d.ts +1 -5
  42. package/package.json +6 -4
  43. package/scripts/copy-assets.mjs +41 -0
  44. package/dist/repl/terminal-repl.d.ts +0 -9
  45. package/dist/voice/voice-service.d.ts +0 -19
package/dist/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/cli.ts", "../src/commands/agent.ts", "../src/orchestrator/agent-orchestrator.ts", "../src/orchestrator/ai-client.ts", "../src/orchestrator/session.ts", "../src/orchestrator/utils/session-logger.ts", "../src/orchestrator/worker-manager.ts", "../src/orchestrator/tools/worker-status-tool.ts", "../src/orchestrator/utils/async-queue.ts", "../src/orchestrator/utils/worktree-manager.ts", "../src/utils/logger.ts", "../src/auth/credentials-store.ts", "../src/config/omnara-config.ts", "../src/orchestrator/tools/worker-tools.ts", "../src/orchestrator/orchestrator-prompt.ts", "../src/relay/relay-bridge.ts", "../src/http/api-client.ts", "../src/relay/relay-service.ts", "../src/auth/supabase-client.ts", "../src/auth/supabase-config.ts", "../src/auth/credential-manager.ts", "../src/utils/prompt.ts", "../src/auth/cli-auth-service.ts", "../src/auth/pkce.ts", "../src/auth/loopback-listener.ts", "../src/utils/browser.ts", "../src/auth/login-flow.ts", "../src/auth/auth-provider.ts", "../src/http/user-sessions.ts", "../../shared-js/dist/schemas/index.js", "../../shared-js/schemas/control_message.schema.json", "../../shared-js/schemas/message_envelope.schema.json", "../../shared-js/schemas/api_voice_launch_request.schema.json", "../../shared-js/schemas/api_voice_launch_response.schema.json", "../../shared-js/schemas/api_sessions_create_request.schema.json", "../../shared-js/schemas/api_sessions_summary.schema.json", "../../shared-js/schemas/api_sessions_list_response.schema.json", "../../shared-js/schemas/api_sessions_message_page_response.schema.json", "../../shared-js/schemas/api_sessions_agent_detail.schema.json", "../../shared-js/schemas/api_sessions_create_chat_message_request.schema.json", "../../shared-js/schemas/api_billing_subscription_response.schema.json", "../../shared-js/schemas/api_billing_usage_response.schema.json", "../../shared-js/schemas/api_billing_create_checkout_request.schema.json", "../../shared-js/schemas/api_billing_checkout_response.schema.json", "../../shared-js/schemas/api_billing_validate_promo_request.schema.json", "../../shared-js/schemas/api_billing_promo_validation_response.schema.json", "../../shared-js/schemas/api_billing_customer_portal_request.schema.json", "../../shared-js/schemas/api_billing_customer_portal_response.schema.json", "../../shared-js/schemas/api_settings_notification_request.schema.json", "../../shared-js/schemas/api_settings_notification_response.schema.json", "../src/repl/terminal-repl.ts", "../src/voice/voice-service.ts", "../src/utils/claude-code-check.ts", "../src/commands/auth.ts", "../src/utils/version-check.ts"],
4
- "sourcesContent": ["import path from 'path';\nimport { createRequire } from 'node:module';\nimport { Command } from 'commander';\nimport {\n buildAgentCommand,\n buildAuthCommand,\n runAgentOrchestrator,\n type OrchestratorOptions,\n} from './commands/index.js';\nimport { checkForUpdatesInBackground } from './utils/version-check.js';\nimport { performClaudeCodeCheck } from './utils/claude-code-check.js';\nimport { logger } from './utils/logger.js';\n\nconst require = createRequire(import.meta.url);\n\ninterface PackageJson {\n description?: string;\n version?: string;\n}\n\nconst packageJson = require('../package.json') as PackageJson;\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('omnara')\n .description(packageJson.description ?? 'Command-line interface for Omnara.')\n .version(packageJson.version ?? '0.0.0')\n .option('--backend-url <url>', 'Override backend API base URL used for login')\n .option('--frontend-url <url>', 'Override frontend URL opened during login')\n .action(async () => {\n const options = program.opts<OrchestratorOptions>();\n await runAgentOrchestrator(options);\n });\n\n // Register top-level commands here.\n program.addCommand(buildAgentCommand());\n program.addCommand(buildAuthCommand());\n\n return program;\n}\n\nexport async function run(argv: readonly string[]): Promise<void> {\n const program = createProgram();\n\n // Check for Claude Code installation (non-blocking)\n performClaudeCodeCheck({ silent: false, exitOnMissing: false });\n\n // Check for updates in the background (non-blocking)\n checkForUpdatesInBackground();\n\n try {\n await program.parseAsync(argv as string[]);\n } catch (error) {\n // Commander will already have logged the error. Set non-zero exit for clarity.\n program.error((error as Error).message, { exitCode: 1 });\n }\n}\n\n// Check if this module is being run directly (ESM equivalent of require.main === module)\nfunction isMainModule(): boolean {\n // In ES modules, check if the current file URL matches the executed script\n if (!import.meta.url || !process.argv[1]) {\n return false;\n }\n\n // Convert process.argv[1] to a file URL for comparison\n const executedPath = path.resolve(process.argv[1]);\n const currentPath = import.meta.url.startsWith('file://')\n ? decodeURIComponent(import.meta.url.slice(7)) // Remove 'file://' prefix\n : import.meta.url;\n\n // Normalize paths for comparison\n return path.normalize(currentPath) === path.normalize(executedPath);\n}\n\nif (isMainModule()) {\n run(process.argv).catch((error: unknown) => {\n logger.error(error);\n process.exitCode = 1;\n });\n}\n", "import { Command } from 'commander';\nimport { AgentOrchestrator } from '../orchestrator/agent-orchestrator.js';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport { RelayBridge } from '../relay/relay-bridge.js';\nimport { runTerminalRepl } from '../repl/terminal-repl.js';\nimport { ApiClient } from '../http/api-client.js';\nimport { registerRelaySession } from '../relay/relay-service.js';\nimport { launchVoiceForSession } from '../voice/voice-service.js';\nimport { createAuthProvider } from '../auth/auth-provider.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from '../auth/login-flow.js';\nimport { getClaudeCodeVersion } from '../utils/claude-code-check.js';\nimport { logger, extractErrorMessage } from '../utils/logger.js';\n\nexport function buildAgentCommand(): Command {\n const agent = new Command('agent').description(\n 'Utilities for interacting with the Omnara Claude agent.',\n );\n\n agent\n .command('orchestrator')\n .alias('server')\n .description('Start the Omnara agent orchestrator.')\n .option('--backend-url <url>', 'Override backend API base URL used for login')\n .option('--frontend-url <url>', 'Override frontend URL opened during login')\n .action(async (options: OrchestratorOptions) => {\n await runAgentOrchestrator(options);\n });\n\n agent\n .command('repl')\n .description('Start the Omnara agent REPL connected through the backend relay.')\n .requiredOption('--session-id <id>', 'Connect to an existing parent agent session')\n .requiredOption('--user-session-id <id>', 'User session that owns the agent session')\n .option('--backend-url <url>', 'Override backend API base URL used for login')\n .option('--frontend-url <url>', 'Override frontend URL opened during login')\n .action(async (options: ReplCommandOptions) => {\n await runRepl(options);\n });\n\n agent\n .command('voice')\n .description('Dispatch the LiveKit voice agent for an existing session.')\n .requiredOption('--session-id <id>', 'Agent session to connect the voice worker to')\n .option('--backend-url <url>', 'Override backend API base URL used for login')\n .option('--frontend-url <url>', 'Override frontend URL opened during login')\n .option('--room-name <name>', 'Override the LiveKit room name used for the call')\n .option('--force', 'Launch even if the CLI relay is offline')\n .action(async (options: VoiceCommandOptions) => {\n await runVoice(options);\n });\n\n return agent;\n}\n\nexport interface OrchestratorOptions {\n backendUrl?: string;\n frontendUrl?: string;\n}\n\ninterface ReplCommandOptions {\n sessionId: string;\n userSessionId: string;\n backendUrl?: string;\n frontendUrl?: string;\n}\n\ninterface VoiceCommandOptions {\n sessionId: string;\n backendUrl?: string;\n frontendUrl?: string;\n roomName?: string;\n force?: boolean;\n}\n\nexport async function runAgentOrchestrator(options: OrchestratorOptions = {}): Promise<void> {\n // Log Claude Code status\n const claudeVersion = getClaudeCodeVersion();\n if (claudeVersion) {\n logger.info(`\u2713 Claude Code detected: ${claudeVersion}`);\n } else {\n logger.info('\u2139 Running without Claude Code integration');\n }\n\n const orchestrator = new AgentOrchestrator();\n await orchestrator.start();\n\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const store = new CredentialsStore();\n const bridge = new RelayBridge(orchestrator, {\n store,\n logger: console,\n backendUrl,\n frontendUrl,\n });\n\n const stop = async () => {\n await bridge.stop();\n await orchestrator.stop();\n };\n\n const signalHandler = createSignalHandler(stop);\n process.on('SIGINT', signalHandler.handler);\n process.on('SIGTERM', signalHandler.handler);\n\n try {\n await bridge.start();\n } catch (error) {\n logger.error(`Relay orchestrator terminated: ${extractErrorMessage(error)}`);\n process.exitCode = process.exitCode || 1;\n } finally {\n await stop();\n signalHandler.remove();\n }\n}\n\nfunction createSignalHandler(onStop: () => Promise<void>) {\n let stopping = false;\n\n const handler = (signal: NodeJS.Signals) => {\n if (stopping) {\n return;\n }\n stopping = true;\n logger.important(`\\nReceived ${signal}. Shutting down agent orchestrator...`);\n void onStop().catch((error) => {\n logger.error('Error while shutting down agent orchestrator:', error);\n });\n };\n\n const remove = () => {\n process.removeListener('SIGINT', handler);\n process.removeListener('SIGTERM', handler);\n };\n\n return { handler, remove };\n}\n\nasync function runRepl(options: ReplCommandOptions): Promise<void> {\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const store = new CredentialsStore();\n const authProvider = await createAuthProvider({\n store,\n backendUrl,\n frontendUrl,\n logger: console,\n });\n\n const client = new ApiClient({ baseUrl: backendUrl });\n const accessToken = await authProvider.getAccessToken();\n const registration = await registerRelaySession(client, accessToken, {\n userSessionId: options.userSessionId,\n clientKind: 'cli',\n });\n const wsUrl = buildRelayWebsocketUrl(backendUrl, registration.relayWsPath);\n\n logger.important(\n `Using agent session ${options.sessionId} (user session ${registration.userSessionId})`,\n );\n\n await runTerminalRepl({\n url: wsUrl,\n headers: {\n authorization: `Bearer ${accessToken}`,\n 'x-relay-token': registration.relayToken,\n },\n initialSessionId: options.sessionId,\n });\n}\n\nasync function runVoice(options: VoiceCommandOptions): Promise<void> {\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const store = new CredentialsStore();\n const authProvider = await createAuthProvider({\n store,\n backendUrl,\n frontendUrl,\n logger: console,\n });\n\n const client = new ApiClient({ baseUrl: backendUrl });\n const launch = await launchVoiceForSession(client, await authProvider.getAccessToken(), {\n sessionId: options.sessionId,\n force: options.force ?? false,\n roomName: options.roomName,\n });\n\n logger.success('\\nVoice agent dispatched successfully.');\n logger.important(`Session ID: ${launch.sessionId}`);\n logger.important(`LiveKit URL: ${launch.livekitUrl}`);\n logger.important(`Room name: ${launch.roomName}`);\n logger.important(`Participant identity: ${launch.accessTokenIdentity}`);\n logger.important('\\nUse this token to join the room:');\n logger.important(launch.accessToken);\n logger.log('\\nOnce connected (for example via the LiveKit Agents playground),');\n logger.log('the voice worker will coordinate with the CLI coding agent through the relay.');\n logger.debug(`Relay websocket: ${launch.relayWsUrl}`);\n logger.debug(`Relay token (expires in ${launch.relayTokenExpiresIn}s):`);\n logger.debug(launch.relayToken);\n logger.important('\\nKeep this information secure\u2014tokens grant access to your agent session.');\n}\n\nfunction buildRelayWebsocketUrl(baseUrl: string, path: string): string {\n const url = new URL(baseUrl);\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n url.search = '';\n url.hash = '';\n if (path.startsWith('/')) {\n url.pathname = path;\n } else {\n const basePath = url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`;\n url.pathname = `${basePath}${path}`;\n }\n return url.toString();\n}\n", "import { randomUUID } from 'crypto';\nimport {\n AIClient,\n BASE_ALLOWED_ORCHESTRATOR_TOOLS,\n BASE_ALLOWED_WORKER_TOOLS,\n type AgentClient,\n} from './ai-client.js';\nimport { Session } from './session.js';\nimport { WorkerManager, type WorkerRecord, type WorkerMessageEvent } from './worker-manager.js';\nimport { createWorkerMcpServer } from './tools/worker-tools.js';\nimport type { InboundMessage, OutboundMessage } from './orchestrator-types.js';\nimport { ORCHESTRATOR_SYSTEM_PROMPT } from './orchestrator-prompt.js';\nimport type { McpServerConfig } from '@anthropic-ai/claude-agent-sdk';\n\ninterface AgentOrchestratorDependencies {\n createMainClient?: () => AgentClient;\n createWorkerClient?: (mcpServers?: Record<string, McpServerConfig>, cwd?: string) => AgentClient;\n workerManager?: WorkerManager;\n repoPath?: string;\n}\n\nconst WORKER_LAUNCH_TOOL = 'mcp__worker__launch_worker';\nconst WORKER_GET_TOOL = 'mcp__worker__get_workers';\nconst WORKER_MESSAGE_TOOL = 'mcp__worker__message_worker';\n\ninterface ClientConnection {\n id: string;\n sessionIds: Set<string>;\n send: (message: OutboundMessage) => void;\n canSend?: () => boolean;\n close?: () => void;\n}\n\nexport interface AgentOrchestratorClientAdapter {\n send: (message: OutboundMessage) => void;\n canSend?: () => boolean;\n close?: () => void;\n}\n\nexport interface AgentOrchestratorConnection {\n id: string;\n dispatch(message: InboundMessage): void;\n disconnect(): void;\n}\n\nexport class AgentOrchestrator {\n private readonly aiClient: AgentClient;\n private readonly workerManager: WorkerManager;\n private readonly sessions = new Map<string, Session>();\n private readonly clients = new Map<string, ClientConnection>();\n private readonly toolUseMap = new Map<string, string>();\n // Track the main coding session (parent_session_id = null, type = CODE)\n private mainCodingSessionId: string | null = null;\n // Track voice sessions to filter out their messages\n readonly voiceSessionIds = new Set<string>(); // Made non-private for relay-bridge access\n\n private started = false;\n\n constructor(dependencies?: AgentOrchestratorDependencies) {\n const resolveSessionIdBySdk = (sdkSessionId?: string) =>\n this.findSessionIdBySdkSession(sdkSessionId);\n\n const workerClientFactory =\n dependencies?.createWorkerClient ??\n ((mcpServers?: Record<string, McpServerConfig>, cwd?: string) =>\n new AIClient({\n defaults: {\n allowedTools: [...BASE_ALLOWED_WORKER_TOOLS, 'mcp__worker_status__send_status_update'],\n mcpServers,\n cwd: cwd || process.cwd(),\n },\n }));\n\n this.workerManager =\n dependencies?.workerManager ??\n new WorkerManager({\n createClient: workerClientFactory,\n resolveSessionIdBySdk,\n repoPath: dependencies?.repoPath ?? process.cwd(),\n });\n\n const workerMcpServer = createWorkerMcpServer(this.workerManager, {\n resolveSessionIdBySdk,\n resolveSessionIdByToolUse: (toolUseId: string) => this.consumeToolUse(toolUseId),\n // Always use main coding session as parent for workers\n getMainCodingSessionId: () => this.mainCodingSessionId,\n });\n\n const mainClientFactory =\n dependencies?.createMainClient ??\n (() =>\n new AIClient({\n defaults: {\n allowedTools: [\n ...BASE_ALLOWED_ORCHESTRATOR_TOOLS,\n WORKER_LAUNCH_TOOL,\n WORKER_GET_TOOL,\n WORKER_MESSAGE_TOOL,\n ],\n mcpServers: {\n worker: workerMcpServer,\n },\n systemPrompt: ORCHESTRATOR_SYSTEM_PROMPT,\n },\n }));\n\n this.aiClient = mainClientFactory();\n\n this.registerWorkerListeners();\n }\n\n ensureSessionExists(sessionId: string): Session {\n const existing = this.sessions.get(sessionId);\n if (existing) {\n return existing;\n }\n const session = new Session(\n sessionId,\n this.aiClient,\n (id) => this.handleSessionEmpty(id),\n (toolUseId) => this.registerToolUse(toolUseId, sessionId),\n );\n this.sessions.set(sessionId, session);\n return session;\n }\n\n getSession(sessionId: string): Session | undefined {\n return this.sessions.get(sessionId);\n }\n\n getWorkerManager(): WorkerManager {\n return this.workerManager;\n }\n\n setMainCodingSessionId(sessionId: string): void {\n if (!this.mainCodingSessionId) {\n this.mainCodingSessionId = sessionId;\n console.log(`[Orchestrator] Set main coding session: ${this.mainCodingSessionId}`);\n }\n }\n\n addClient(adapter: AgentOrchestratorClientAdapter): AgentOrchestratorConnection {\n const clientId = randomUUID();\n const connection: ClientConnection = {\n id: clientId,\n sessionIds: new Set(),\n send: adapter.send,\n canSend: adapter.canSend,\n close: adapter.close,\n };\n\n this.clients.set(clientId, connection);\n\n let disconnected = false;\n const disconnect = (): void => {\n if (disconnected) {\n return;\n }\n disconnected = true;\n this.handleDisconnect(connection);\n try {\n connection.close?.();\n } catch (error) {\n console.error('Failed to close client connection:', error);\n }\n };\n\n return {\n id: clientId,\n dispatch: (message: InboundMessage) => {\n this.handleClientMessage(connection, message);\n },\n disconnect,\n };\n }\n\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n this.started = true;\n }\n\n async stop(): Promise<void> {\n // Shutdown worker manager first to clean up all worktrees\n await this.workerManager.shutdown();\n\n for (const connection of Array.from(this.clients.values())) {\n this.handleDisconnect(connection);\n try {\n connection.close?.();\n } catch (error) {\n console.error('Failed to close client connection:', error);\n }\n }\n this.clients.clear();\n\n for (const session of this.sessions.values()) {\n session.close();\n }\n this.sessions.clear();\n this.started = false;\n }\n\n private handleDisconnect(connection: ClientConnection): void {\n for (const sessionId of connection.sessionIds) {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.unsubscribe(connection.id);\n }\n }\n\n this.clients.delete(connection.id);\n }\n\n private handleClientMessage(connection: ClientConnection, message: InboundMessage): void {\n switch (message.type) {\n case 'chat':\n this.handleChatMessage(connection, message);\n break;\n case 'session_init':\n this.handleSessionInit(connection, message);\n break;\n case 'join':\n this.handleJoin(connection, message.sessionId);\n break;\n case 'leave':\n this.handleLeave(connection, message.sessionId);\n break;\n case 'ping':\n this.sendToConnection(connection, { type: 'pong' });\n break;\n case 'cancel_worker':\n this.handleCancelWorker(connection, message.workerId);\n break;\n default:\n this.sendToConnection(connection, {\n type: 'error',\n message: `Unsupported message type: ${(message as { type: string }).type}`,\n });\n }\n }\n\n private handleSessionInit(\n connection: ClientConnection,\n message: Extract<InboundMessage, { type: 'session_init' }>,\n ): void {\n // Track the main coding session (parent = null, type = CODE)\n if (!message.parentSessionId && message.metadata?.session_type === 'CODE') {\n this.mainCodingSessionId = message.sessionId;\n console.log(`[Orchestrator] Set main coding session: ${this.mainCodingSessionId}`);\n }\n\n // Track voice sessions to filter out their messages\n if (message.metadata?.session_type === 'VOICE') {\n this.voiceSessionIds.add(message.sessionId);\n console.log(`[Orchestrator] Tracking voice session from init:`, {\n sessionId: message.sessionId,\n sessionType: message.metadata?.session_type,\n parentSessionId: message.parentSessionId,\n currentVoiceSessions: Array.from(this.voiceSessionIds),\n });\n }\n\n this.sendToConnection(connection, {\n type: 'session_init_ack',\n sessionId: message.sessionId,\n parentSessionId: message.parentSessionId ?? null,\n });\n }\n\n private handleChatMessage(\n connection: ClientConnection,\n message: Extract<InboundMessage, { type: 'chat' }>,\n ): void {\n console.log('[Orchestrator] handleChatMessage:', {\n sessionId: message.sessionId,\n senderId: message.senderId,\n senderKind: message.senderKind,\n mainCodingSessionId: this.mainCodingSessionId,\n isVoiceSession: message.sessionId ? this.voiceSessionIds.has(message.sessionId) : false,\n textPreview: message.text.substring(0, 100),\n });\n\n // Filter out messages TO voice sessions - they should be handled by voice agent, not orchestrator\n if (message.sessionId && this.voiceSessionIds.has(message.sessionId)) {\n console.log('[Orchestrator] Ignoring message to voice session:', message.sessionId);\n return;\n }\n\n let session: Session | undefined;\n let sessionId = message.sessionId;\n\n if (sessionId) {\n session = this.sessions.get(sessionId);\n if (!session) {\n this.sendToConnection(connection, {\n type: 'error',\n sessionId,\n message: 'Session not found.',\n });\n return;\n }\n } else {\n session = this.createSession();\n sessionId = session.id;\n this.sendToConnection(connection, {\n type: 'session_created',\n sessionId,\n });\n }\n\n if (!connection.sessionIds.has(sessionId)) {\n session.subscribe({\n id: connection.id,\n send: (payload) => {\n this.sendToConnection(connection, payload);\n },\n canSend: connection.canSend,\n });\n connection.sessionIds.add(sessionId);\n }\n\n session.logInbound({ type: 'chat', text: message.text });\n session.announceInboundMessage(message.text, 'user');\n session.enqueueUserMessage(message.text);\n }\n\n private handleJoin(connection: ClientConnection, sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.sendToConnection(connection, {\n type: 'error',\n sessionId,\n message: 'Session not found.',\n });\n return;\n }\n\n if (!connection.sessionIds.has(sessionId)) {\n session.subscribe({\n id: connection.id,\n send: (payload) => {\n this.sendToConnection(connection, payload);\n },\n canSend: connection.canSend,\n });\n connection.sessionIds.add(sessionId);\n } else {\n this.sendToConnection(connection, {\n type: 'session_joined',\n sessionId,\n });\n }\n }\n\n private handleLeave(connection: ClientConnection, sessionId: string): void {\n if (!connection.sessionIds.has(sessionId)) {\n this.sendToConnection(connection, {\n type: 'error',\n sessionId,\n message: 'You are not subscribed to this session.',\n });\n return;\n }\n\n connection.sessionIds.delete(sessionId);\n const session = this.sessions.get(sessionId);\n if (session) {\n session.unsubscribe(connection.id);\n }\n }\n\n private handleCancelWorker(connection: ClientConnection, workerId: string): void {\n const canceled = this.workerManager.cancelWorker(workerId);\n if (!canceled) {\n this.sendToConnection(connection, {\n type: 'error',\n message: `Worker ${workerId} not found or not running.`,\n });\n }\n }\n\n private createSession(): Session {\n const sessionId = randomUUID();\n return this.ensureSessionExists(sessionId);\n }\n\n private registerToolUse(toolUseId: string, sessionId: string): void {\n this.toolUseMap.set(toolUseId, sessionId);\n }\n\n private consumeToolUse(toolUseId: string): string | undefined {\n const sessionId = this.toolUseMap.get(toolUseId);\n if (sessionId) {\n this.toolUseMap.delete(toolUseId);\n }\n return sessionId;\n }\n\n private handleSessionEmpty(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return;\n }\n\n if (!session.hasSubscribers()) {\n session.close();\n this.sessions.delete(sessionId);\n }\n }\n\n private registerWorkerListeners(): void {\n this.workerManager.on('session_start', (record) => {\n this.handleWorkerSessionStart(record);\n });\n\n this.workerManager.on('message', (event: WorkerMessageEvent) => {\n this.handleWorkerMessage(event);\n });\n\n this.workerManager.on('update', (record) => {\n this.broadcastAgentProgress(record);\n });\n\n this.workerManager.on('completed', (record) => {\n this.broadcastAgentProgress(record);\n this.handleWorkerCompletion(record);\n });\n }\n\n private broadcastAgentProgress(record: WorkerRecord): void {\n const progress = this.buildAgentProgress(record);\n // Worker progress updates should use the worker's own session ID\n const targetSessionId = record.sessionId;\n console.log('[Orchestrator] Broadcasting agent_progress:', {\n agentSessionId: record.sessionId,\n task: record.task,\n status: progress.status,\n originSessionId: record.originSessionId,\n });\n this.broadcastToAll({\n type: 'agent_progress',\n sessionId: targetSessionId,\n status: progress.status,\n detail: progress.detail,\n metadata: progress.metadata,\n messageId: randomUUID(), // Always use a valid UUID for message_id\n });\n }\n\n private buildAgentProgress(record: WorkerRecord): {\n status: string;\n detail?: string;\n metadata?: Record<string, unknown>;\n } {\n const latest =\n record.progress.length > 0 ? record.progress[record.progress.length - 1]?.message : undefined;\n\n // Create a concise one-line summary\n let summary: string | undefined;\n if (record.status === 'completed') {\n summary = record.result || `Task \"${record.task}\" completed`;\n } else if (record.status === 'error') {\n summary = `Task \"${record.task}\" failed: ${record.error || 'Unknown error'}`;\n } else if (record.status === 'canceled') {\n summary = `Task \"${record.task}\" was canceled`;\n } else if (record.status === 'running') {\n summary = latest || `Task \"${record.task}\" is running`;\n }\n\n const detail = summary ?? latest ?? undefined;\n\n const metadata: Record<string, unknown> = {\n agent_session_id: record.sessionId,\n task: record.task,\n last_update_at: record.lastUpdateAt,\n };\n\n if (record.originSessionId) {\n metadata.origin_session_id = record.originSessionId;\n }\n if (latest) {\n metadata.latest_message = latest;\n }\n if (record.result) {\n metadata.result = record.result;\n }\n if (record.error) {\n metadata.error = record.error;\n }\n\n return {\n status: record.status,\n detail,\n metadata,\n };\n }\n\n private handleWorkerSessionStart(record: WorkerRecord): void {\n // Include task in metadata for persistence\n const metadata = {\n ...record.metadata,\n task: record.task,\n };\n\n this.broadcastToAll({\n type: 'session_init',\n sessionId: record.sessionId,\n parentSessionId: record.originSessionId ?? null,\n metadata,\n messageId: randomUUID(),\n });\n }\n\n private handleWorkerMessage(event: WorkerMessageEvent): void {\n console.log('[Orchestrator] handleWorkerMessage:', {\n messageType: event.messageType,\n workerId: event.record.id,\n task: event.record.task,\n workerSessionId: event.record.sessionId,\n originSessionId: event.record.originSessionId,\n });\n\n // Worker messages should use the worker's own session ID\n // The parent-child relationship is already established via session_init\n const targetSessionId = event.record.sessionId;\n\n switch (event.messageType) {\n case 'assistant_text':\n if (!event.text) {\n return;\n }\n this.broadcastToAll({\n type: 'assistant_text',\n sessionId: targetSessionId,\n text: event.text,\n workerId: event.record.id,\n workerTask: event.record.task,\n messageId: randomUUID(),\n });\n break;\n case 'assistant_complete':\n {\n const completionMetadata: Record<string, unknown> = {\n agent_session_id: event.record.id,\n task: event.record.task,\n };\n if (event.record.originSessionId) {\n completionMetadata.origin_session_id = event.record.originSessionId;\n }\n this.broadcastToAll({\n type: 'agent_complete',\n sessionId: targetSessionId,\n success: event.success ?? true,\n message: event.text,\n metadata: completionMetadata,\n messageId: randomUUID(),\n });\n }\n break;\n case 'tool_call':\n if (!event.toolName || !event.toolUseId) {\n return;\n }\n console.log('[Orchestrator] Broadcasting worker tool_call:', {\n toolName: event.toolName,\n workerId: event.record.id,\n task: event.record.task,\n targetSessionId,\n toolUseId: event.toolUseId,\n });\n this.broadcastToAll({\n type: 'tool_call',\n sessionId: targetSessionId,\n toolName: event.toolName,\n toolUseId: event.toolUseId,\n input: event.toolInput,\n workerId: event.record.id,\n workerTask: event.record.task,\n messageId: randomUUID(),\n });\n break;\n case 'tool_result':\n if (!event.toolUseId) {\n return;\n }\n console.log('[Orchestrator] Broadcasting worker tool_result:', {\n toolName: event.toolName,\n workerId: event.record.id,\n task: event.record.task,\n targetSessionId,\n toolUseId: event.toolUseId,\n });\n this.broadcastToAll({\n type: 'tool_result',\n sessionId: targetSessionId,\n toolUseId: event.toolUseId,\n content: event.toolContent,\n isError: event.isError,\n workerId: event.record.id,\n workerTask: event.record.task,\n messageId: randomUUID(),\n });\n break;\n default:\n break;\n }\n }\n\n private handleWorkerCompletion(record: WorkerRecord): void {\n const sessionId = record.originSessionId;\n if (!sessionId) {\n return;\n }\n\n const session = this.sessions.get(sessionId);\n if (!session) {\n return;\n }\n\n const summary = this.buildWorkerSummary(record);\n if (!summary) {\n return;\n }\n\n // Broadcast result message for worker with task context to parent session\n const success = record.status === 'completed';\n const durationMs = record.lastUpdateAt - record.startedAt;\n const metadata: Record<string, unknown> = {\n agent_session_id: record.sessionId,\n task: record.task,\n origin_session_id: record.originSessionId,\n };\n if (record.result) {\n metadata.result = record.result;\n }\n if (record.error) {\n metadata.error = record.error;\n }\n\n this.broadcastToAll({\n type: 'agent_complete',\n sessionId: record.sessionId, // Use worker's session ID\n success,\n durationMs,\n message: `[${record.task}] ${summary}`,\n metadata,\n messageId: randomUUID(),\n });\n\n session.logInbound({\n type: 'worker_result',\n workerId: record.id,\n workerTask: record.task,\n summary,\n });\n session.announceInboundMessage(summary, 'worker', record.id, record.task);\n\n // Send comprehensive worker status message to orchestrator's conversation for LLM context\n const statusMessage = this.buildWorkerStatusMessage(record.id);\n session.enqueueUserMessage(statusMessage, {\n triggeredBy: 'worker_completion',\n workerId: record.id,\n workerTask: record.task,\n });\n }\n\n private buildWorkerSummary(record: WorkerRecord): string | null {\n switch (record.status) {\n case 'completed':\n return record.result ?? `Worker ${record.id} completed.`;\n case 'error':\n return `Worker ${record.id} failed: ${record.error ?? 'Unknown error.'}`;\n case 'canceled':\n return `Worker ${record.id} was canceled.`;\n default:\n return null;\n }\n }\n\n /**\n * Build a comprehensive worker status message showing ALL workers,\n * with special highlighting for the worker that triggered this generation.\n */\n private buildWorkerStatusMessage(triggerWorkerId: string): string {\n const allWorkers = this.workerManager.listWorkers();\n\n if (allWorkers.length === 0) {\n return '[WORKER STATUS UPDATE]\\n\\nNo active workers.';\n }\n\n const lines: string[] = ['[WORKER STATUS UPDATE - Generation Triggered]'];\n lines.push('');\n\n for (const worker of allWorkers) {\n const isTrigger = worker.id === triggerWorkerId;\n const prefix = isTrigger ? '>>> ' : ' ';\n const triggerNote = isTrigger ? ' \u2190 JUST COMPLETED (triggered this generation)' : '';\n\n const latestMsg =\n worker.progress.length > 0\n ? worker.progress[worker.progress.length - 1]?.message\n : undefined;\n\n lines.push(`${prefix}Task: \"${worker.task}\"${triggerNote}`);\n lines.push(`${prefix}Status: ${worker.status}`);\n lines.push(`${prefix}Worker ID: ${worker.id}`);\n\n if (worker.status === 'completed') {\n // For completed workers, include the full result and progress log\n if (worker.result) {\n lines.push(`${prefix}Result: ${worker.result}`);\n }\n\n // Include the full progress log so orchestrator can see everything the worker did\n if (worker.progress.length > 0) {\n lines.push(`${prefix}Full Progress Log:`);\n for (const entry of worker.progress) {\n // Format timestamp as relative time\n const timestamp = new Date(entry.timestamp).toISOString();\n lines.push(`${prefix} [${timestamp}] ${entry.message}`);\n }\n }\n } else if (worker.status === 'error' && worker.error) {\n lines.push(`${prefix}Error: ${worker.error}`);\n\n // Include progress log for errors too, to see what led to the failure\n if (worker.progress.length > 0) {\n lines.push(`${prefix}Progress Before Error:`);\n for (const entry of worker.progress) {\n const timestamp = new Date(entry.timestamp).toISOString();\n lines.push(`${prefix} [${timestamp}] ${entry.message}`);\n }\n }\n } else if (worker.status === 'running' && latestMsg) {\n lines.push(`${prefix}Latest: ${latestMsg}`);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n private broadcastToAll(message: OutboundMessage): void {\n for (const connection of this.clients.values()) {\n this.sendToConnection(connection, message);\n }\n }\n\n private findSessionIdBySdkSession(sdkSessionId?: string): string | undefined {\n if (!sdkSessionId) {\n return undefined;\n }\n for (const [serverId, session] of this.sessions.entries()) {\n if (session.sdkSessionIdentifier === sdkSessionId) {\n return serverId;\n }\n }\n return undefined;\n }\n\n private sendToConnection(connection: ClientConnection, message: OutboundMessage): void {\n if (connection.canSend && !connection.canSend()) {\n return;\n }\n try {\n connection.send(message);\n } catch (error) {\n console.error('Failed to send message to client:', error);\n this.handleDisconnect(connection);\n }\n }\n}\n\nexport async function startAgentOrchestrator(\n dependencies?: AgentOrchestratorDependencies,\n): Promise<AgentOrchestrator> {\n const server = new AgentOrchestrator(dependencies);\n await server.start();\n return server;\n}\n", "import fs from 'fs';\nimport {\n query,\n type Options,\n type Query,\n type SDKMessage,\n type SDKUserMessage,\n} from '@anthropic-ai/claude-agent-sdk';\n\nexport interface AIClientConfig {\n defaults?: Partial<Options>;\n}\n\nexport interface AgentClient {\n streamUserMessage(prompt: string, overrides?: Partial<Options>): AsyncIterable<SDKMessage>;\n createQuery(prompt: string | AsyncIterable<SDKUserMessage>, overrides?: Partial<Options>): Query;\n}\n\nexport const BASE_ALLOWED_ORCHESTRATOR_TOOLS = [\n 'Glob',\n 'Grep',\n 'LS',\n 'Read',\n 'WebFetch',\n 'WebSearch',\n 'TodoWrite',\n] as const;\n\nexport const BASE_ALLOWED_WORKER_TOOLS = [\n 'Task',\n 'Bash',\n 'Glob',\n 'Grep',\n 'LS',\n 'ExitPlanMode',\n 'Read',\n 'Edit',\n 'MultiEdit',\n 'Write',\n 'NotebookEdit',\n 'WebFetch',\n 'TodoWrite',\n 'WebSearch',\n 'BashOutput',\n 'KillBash',\n 'Skill',\n 'SlashCommand',\n] as const;\n\nexport class AIClient implements AgentClient {\n private readonly baseOptions: Options;\n\n constructor(config?: AIClientConfig) {\n const defaultOptions: Options = {\n maxTurns: 100,\n model: 'sonnet',\n cwd: process.cwd(),\n includePartialMessages: false,\n allowedTools: [...BASE_ALLOWED_ORCHESTRATOR_TOOLS],\n };\n\n this.baseOptions = {\n ...defaultOptions,\n ...config?.defaults,\n };\n\n // Log when using a custom cwd (for debugging worktree isolation)\n if (this.baseOptions.cwd && this.baseOptions.cwd !== process.cwd()) {\n console.log('[AIClient] Using custom working directory:', this.baseOptions.cwd);\n }\n\n this.ensureWorkingDirectory(this.baseOptions.cwd);\n }\n\n async *streamUserMessage(\n prompt: string,\n overrides?: Partial<Options>,\n ): AsyncIterable<SDKMessage> {\n const q = this.createQuery(prompt, overrides);\n for await (const message of q) {\n yield message;\n }\n }\n\n createQuery(prompt: string | AsyncIterable<SDKUserMessage>, overrides?: Partial<Options>): Query {\n const merged: Options = {\n ...this.baseOptions,\n ...overrides,\n };\n\n this.ensureWorkingDirectory(merged.cwd);\n\n return query({\n prompt,\n options: merged,\n });\n }\n\n private ensureWorkingDirectory(cwd?: string): void {\n if (!cwd) {\n return;\n }\n try {\n fs.mkdirSync(cwd, { recursive: true });\n } catch (error) {\n console.warn(`Failed to ensure working directory ${cwd}:`, error);\n }\n }\n}\n", "import type {\n SDKAssistantMessage,\n SDKMessage,\n SDKResultMessage,\n} from '@anthropic-ai/claude-agent-sdk';\nimport { randomUUID } from 'crypto';\nimport type { AgentClient } from './ai-client.js';\nimport type { OutboundMessage, SessionSubscriber } from './orchestrator-types.js';\nimport { createSessionLogger, type SessionLogger } from './utils/session-logger.js';\n\ntype StreamEvent = {\n type: string;\n [key: string]: unknown;\n};\n\ntype ToolUseCallback = (toolUseId: string, sessionId: string) => void;\n\nexport class Session {\n readonly id: string;\n\n private readonly aiClient: AgentClient;\n private readonly subscribers = new Map<string, SessionSubscriber>();\n private readonly onEmpty: (sessionId: string) => void;\n private readonly onToolUse?: ToolUseCallback;\n private readonly logger: SessionLogger;\n\n private sdkSessionId: string | null = null;\n private inflight: Promise<void> | null = null;\n private lastActivity = Date.now();\n\n constructor(\n id: string,\n aiClient: AgentClient,\n onEmpty: (sessionId: string) => void,\n onToolUse?: ToolUseCallback,\n ) {\n this.id = id;\n this.aiClient = aiClient;\n this.onEmpty = onEmpty;\n this.onToolUse = onToolUse;\n this.logger = createSessionLogger(this.id);\n }\n\n announceInboundMessage(\n text: string,\n origin: 'user' | 'worker' = 'user',\n workerId?: string,\n workerTask?: string,\n ): void {\n if (!text) {\n return;\n }\n // Only broadcast worker-origin updates. User messages already show up via `chat` frames.\n if (origin !== 'worker') {\n return;\n }\n const message: OutboundMessage = {\n type: 'user_text',\n sessionId: this.id,\n text,\n origin,\n workerId,\n workerTask,\n messageId: randomUUID(),\n };\n this.broadcast(message);\n }\n\n get lastActiveAt(): number {\n return this.lastActivity;\n }\n\n get sdkSessionIdentifier(): string | null {\n return this.sdkSessionId;\n }\n\n subscribe(subscriber: SessionSubscriber): void {\n this.subscribers.set(subscriber.id, subscriber);\n this.safeSend(subscriber, {\n type: 'session_joined',\n sessionId: this.id,\n messageId: randomUUID(),\n });\n }\n\n unsubscribe(subscriberId: string): void {\n this.subscribers.delete(subscriberId);\n if (!this.hasSubscribers() && !this.inflight) {\n this.onEmpty(this.id);\n }\n }\n\n hasSubscribers(): boolean {\n return this.subscribers.size > 0;\n }\n\n close(): void {\n this.subscribers.clear();\n this.logger.close();\n }\n\n enqueueUserMessage(\n text: string,\n metadata?: { triggeredBy?: string; workerId?: string; workerTask?: string },\n ): void {\n this.lastActivity = Date.now();\n const previous = this.inflight;\n\n const task = async (): Promise<void> => {\n if (previous) {\n try {\n await previous;\n } catch {\n // Previous error already reported, continue with new message.\n }\n }\n\n await this.processUserMessage(text, metadata);\n };\n\n const promise = task()\n .catch((error: unknown) => {\n this.broadcast({\n type: 'error',\n sessionId: this.id,\n message: extractErrorMessage(error),\n messageId: randomUUID(),\n });\n })\n .finally(() => {\n if (this.inflight === promise) {\n this.inflight = null;\n this.lastActivity = Date.now();\n if (!this.hasSubscribers()) {\n this.onEmpty(this.id);\n }\n }\n });\n\n this.inflight = promise;\n }\n\n handleStreamEvent(event: StreamEvent): void {\n switch (event.type) {\n case 'content_block_delta': {\n const delta = event.delta as { type?: string; text?: string } | undefined;\n if (delta?.type === 'text_delta' && delta.text) {\n console.log('[Session] Streaming text delta:', delta.text.substring(0, 50));\n this.broadcast({\n type: 'assistant_text',\n sessionId: this.id,\n text: delta.text,\n messageId: randomUUID(),\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n private async processUserMessage(\n text: string,\n metadata?: { triggeredBy?: string; workerId?: string; workerTask?: string },\n ): Promise<void> {\n // Broadcast metadata about this generation trigger\n if (metadata?.triggeredBy === 'worker_completion') {\n this.broadcast({\n type: 'system',\n sessionId: this.id,\n subtype: 'generation_triggered',\n metadata: {\n triggeredBy: 'worker_completion',\n workerId: metadata.workerId,\n workerTask: metadata.workerTask,\n },\n messageId: randomUUID(),\n });\n }\n\n const options = this.sdkSessionId ? { resume: this.sdkSessionId } : undefined;\n\n for await (const message of this.aiClient.streamUserMessage(text, options)) {\n this.routeSdkMessage(message);\n }\n }\n\n private routeSdkMessage(message: SDKMessage): void {\n switch (message.type) {\n case 'assistant':\n this.handleAssistantMessage(message);\n break;\n case 'stream_event':\n this.handleStreamEvent(message.event as StreamEvent);\n break;\n case 'result':\n this.handleResultMessage(message);\n break;\n case 'system':\n this.handleSystemMessage(message);\n break;\n case 'user': {\n const textContent = extractUserContent(message.message.content);\n if (textContent) {\n this.broadcast({\n type: 'user_text',\n sessionId: this.id,\n text: textContent,\n messageId: randomUUID(),\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n private handleAssistantMessage(message: SDKAssistantMessage): void {\n const content = message.message.content;\n\n if (!Array.isArray(content)) {\n return;\n }\n\n console.log('[Session] Processing assistant message with', content.length, 'blocks');\n\n for (const block of content) {\n if (!block || typeof block !== 'object') {\n continue;\n }\n\n const typed = block as unknown as Record<string, unknown>;\n const blockType = typed.type;\n\n if (blockType === 'text' && typeof typed.text === 'string') {\n if (typed.text.length > 0) {\n console.log('[Session] Broadcasting assistant_text:', typed.text.substring(0, 100));\n this.broadcast({\n type: 'assistant_text',\n sessionId: this.id,\n text: typed.text,\n messageId: randomUUID(),\n });\n }\n } else if (blockType === 'tool_use') {\n const toolUseId = typeof typed.id === 'string' && typed.id ? typed.id : randomUUID();\n console.log('[Session] Broadcasting tool_call:', typed.name, 'id:', toolUseId);\n this.broadcast({\n type: 'tool_call',\n sessionId: this.id,\n toolName: typeof typed.name === 'string' ? typed.name : 'unknown',\n toolUseId,\n input: typed.input,\n messageId: randomUUID(), // Always use a valid UUID for message_id\n });\n this.onToolUse?.(toolUseId, this.id);\n } else if (blockType === 'tool_result') {\n const toolResultId =\n typeof typed.tool_use_id === 'string' && typed.tool_use_id\n ? typed.tool_use_id\n : randomUUID();\n console.log('[Session] Broadcasting tool_result:', toolResultId);\n this.broadcast({\n type: 'tool_result',\n sessionId: this.id,\n toolUseId: toolResultId,\n content: typed.content,\n isError: Boolean(typed.is_error),\n messageId: randomUUID(), // Always use a valid UUID for message_id\n });\n }\n }\n }\n\n private handleResultMessage(message: SDKResultMessage): void {\n const success = message.subtype === 'success';\n this.broadcast({\n type: 'agent_complete',\n sessionId: this.id,\n success,\n durationMs: message.duration_ms,\n costUsd: message.total_cost_usd,\n message: success ? message.result : `Error: ${message.subtype}`,\n messageId: randomUUID(),\n });\n }\n\n private handleSystemMessage(message: Extract<SDKMessage, { type: 'system' }>): void {\n if (message.subtype === 'init') {\n this.sdkSessionId = message.session_id;\n }\n this.broadcast({\n type: 'system',\n sessionId: this.id,\n subtype: message.subtype,\n messageId: randomUUID(),\n });\n }\n\n logInbound(payload: unknown): void {\n this.logger.logInbound(payload);\n }\n\n private broadcast(message: OutboundMessage): void {\n this.logger.logOutbound(message);\n for (const [id, subscriber] of this.subscribers) {\n if (subscriber.canSend && !subscriber.canSend()) {\n this.subscribers.delete(id);\n continue;\n }\n this.safeSend(subscriber, message);\n }\n }\n\n private safeSend(subscriber: SessionSubscriber, message: OutboundMessage): void {\n try {\n subscriber.send(message);\n } catch {\n this.subscribers.delete(subscriber.id);\n }\n }\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n try {\n return JSON.stringify(error);\n } catch {\n return 'Unknown error';\n }\n}\n\nfunction extractUserContent(content: unknown): string | null {\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n const texts: string[] = [];\n for (const part of content) {\n if (\n part &&\n typeof part === 'object' &&\n 'type' in part &&\n (part as Record<string, unknown>).type === 'text' &&\n typeof (part as Record<string, unknown>).text === 'string'\n ) {\n texts.push((part as Record<string, unknown>).text as string);\n }\n }\n if (texts.length > 0) {\n return texts.join('');\n }\n }\n\n return null;\n}\n", "import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport type { OutboundMessage } from '../orchestrator-types.js';\n\nfunction getLogDir(): string {\n return process.env.OMNARA_LOG_DIR ?? path.join(os.homedir(), '.omnara', 'omnara-voice');\n}\n\nfunction ensureLogDir(): string {\n const dir = getLogDir();\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // ignore\n }\n return dir;\n}\n\nexport type SessionLogger = {\n logInbound: (payload: unknown) => void;\n logOutbound: (message: OutboundMessage) => void;\n close: () => void;\n};\n\nexport function createSessionLogger(sessionId: string): SessionLogger {\n const dir = ensureLogDir();\n const filePath = path.join(dir, `${sessionId}.log`);\n const stream = fs.createWriteStream(filePath, { flags: 'a' });\n\n const logLine = (direction: 'in' | 'out', payload: unknown) => {\n const timestamp = new Date().toISOString();\n const serialized = safeStringify(payload);\n stream.write(`${timestamp} [${direction}] ${serialized}\\n`);\n };\n\n return {\n logInbound: (payload) => logLine('in', payload),\n logOutbound: (message) => logLine('out', message),\n close: () => {\n try {\n stream.end();\n } catch {\n // ignore close errors\n }\n },\n };\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n", "import { EventEmitter } from 'events';\nimport { randomUUID } from 'crypto';\nimport type {\n Query,\n SDKMessage,\n SDKUserMessage,\n HookInput,\n HookJSONOutput,\n PostToolUseHookInput,\n McpServerConfig,\n} from '@anthropic-ai/claude-agent-sdk';\nimport type { AgentClient } from './ai-client.js';\nimport { createWorkerStatusMcpServer, type StatusUpdateEvent } from './tools/worker-status-tool.js';\nimport { AsyncQueue } from './utils/async-queue.js';\nimport { WorktreeManager } from './utils/worktree-manager.js';\nimport { logger } from '../utils/logger.js';\nimport { readOmnaraConfig, isWorktreesEnabled } from '../config/omnara-config.js';\n\nexport type WorkerStatus = 'running' | 'completed' | 'error' | 'canceled';\n\nexport interface WorkerProgressEntry {\n timestamp: number;\n message: string;\n}\n\nexport interface WorkerRecord {\n id: string;\n task: string;\n prompt: string;\n sessionId: string;\n status: WorkerStatus;\n startedAt: number;\n lastUpdateAt: number;\n originSessionId?: string;\n progress: WorkerProgressEntry[];\n result?: string;\n error?: string;\n metadata?: Record<string, unknown>;\n messageQueue: AsyncQueue<SDKUserMessage>;\n worktreePath?: string;\n branchName?: string;\n work_context?: string;\n worktree_name?: string;\n}\n\nexport interface WorkerMessageEvent {\n record: WorkerRecord;\n messageType: 'assistant_text' | 'assistant_complete' | 'tool_call' | 'tool_result';\n text?: string;\n success?: boolean;\n toolName?: string;\n toolUseId?: string;\n toolInput?: unknown;\n toolContent?: unknown;\n isError?: boolean;\n}\n\ninterface LaunchWorkerOptions {\n task: string;\n prompt: string;\n work_context: string;\n worktree_name: string;\n originSessionId?: string;\n metadata?: Record<string, unknown>;\n}\n\ninterface WorkerManagerOptions {\n createClient: (mcpServers?: Record<string, McpServerConfig>, cwd?: string) => AgentClient;\n resolveSessionIdBySdk?: (sdkSessionId?: string) => string | undefined;\n repoPath: string;\n}\n\nexport class WorkerManager extends EventEmitter {\n private readonly workers = new Map<string, WorkerRecord>();\n private readonly runningQueries = new Map<string, Query>();\n private worktreeManager: WorktreeManager;\n private configInitialized = false;\n\n constructor(private readonly options: WorkerManagerOptions) {\n super();\n\n // Initialize with worktrees disabled as default\n this.worktreeManager = new WorktreeManager({\n repoPath: options.repoPath,\n enabled: false,\n });\n\n // Read omnara.jsonc configuration asynchronously\n this.initializeConfig();\n }\n\n /**\n * Initialize the configuration and update WorktreeManager accordingly\n */\n private async initializeConfig(): Promise<void> {\n try {\n const config = await readOmnaraConfig();\n const worktreesEnabled = isWorktreesEnabled(config);\n\n if (worktreesEnabled) {\n logger.info('Worktrees enabled via omnara.jsonc configuration');\n } else {\n logger.info('Worktrees disabled (no worktrees config found in omnara.jsonc)');\n }\n\n // Re-initialize WorktreeManager with proper configuration\n this.worktreeManager = new WorktreeManager({\n repoPath: this.options.repoPath,\n enabled: worktreesEnabled,\n });\n\n this.configInitialized = true;\n\n } catch (err) {\n logger.error('Failed to read omnara.jsonc configuration:', err);\n logger.info('Worktrees disabled due to config read error');\n\n // Keep worktrees disabled\n this.configInitialized = true;\n }\n }\n\n listWorkers(): WorkerRecord[] {\n return Array.from(this.workers.values());\n }\n\n getWorker(id: string): WorkerRecord | undefined {\n return this.workers.get(id);\n }\n\n getWorkerByTask(task: string): WorkerRecord | undefined {\n for (const worker of this.workers.values()) {\n if (worker.task === task) {\n return worker;\n }\n }\n return undefined;\n }\n\n /**\n * Get a formatted summary of all current worker statuses for inclusion in system prompts.\n * Returns a string describing all active workers and their current state.\n */\n getWorkerStatusSummary(): string {\n const workers = this.listWorkers();\n\n if (workers.length === 0) {\n return 'No active workers.';\n }\n\n const lines = ['## Current Worker Status'];\n lines.push('');\n\n for (const worker of workers) {\n const latestMsg =\n worker.progress.length > 0\n ? worker.progress[worker.progress.length - 1]?.message\n : undefined;\n\n lines.push(`**Task: \"${worker.task}\"**`);\n lines.push(`- Status: ${worker.status}`);\n lines.push(`- Worker ID: ${worker.id}`);\n\n if (worker.status === 'completed' && worker.result) {\n lines.push(`- Result: ${worker.result}`);\n } else if (worker.status === 'error' && worker.error) {\n lines.push(`- Error: ${worker.error}`);\n } else if (latestMsg) {\n lines.push(`- Latest: ${latestMsg}`);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n launchWorker(\n { task, prompt, work_context, worktree_name, originSessionId, metadata }: LaunchWorkerOptions,\n toolUseId?: string,\n ): WorkerRecord {\n // Use a single UUID for both worker ID and session ID to unify them\n const sessionId = randomUUID();\n const resolvedOriginSessionId = originSessionId;\n const record: WorkerRecord = {\n id: sessionId, // Worker ID is the same as session ID\n task,\n prompt,\n status: 'running',\n sessionId,\n startedAt: Date.now(),\n lastUpdateAt: Date.now(),\n originSessionId: resolvedOriginSessionId,\n progress: [],\n metadata,\n messageQueue: new AsyncQueue<SDKUserMessage>(),\n work_context,\n worktree_name,\n };\n\n this.workers.set(sessionId, record);\n this.emit('session_start', { ...record });\n this.emitUpdate(record);\n\n // Emit tool_call event for launch_worker to make it visible in the worker's session\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_call',\n toolName: 'mcp__worker__launch_worker',\n toolUseId,\n toolInput: { task, prompt, metadata },\n } satisfies WorkerMessageEvent);\n\n // Emit tool_result immediately after to show the worker was successfully launched\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId,\n toolContent: {\n workerId: record.id,\n status: record.status,\n message: `Worker launched successfully, task ${task} in progress.`,\n },\n isError: false,\n } satisfies WorkerMessageEvent);\n }\n\n // Create worktree and run worker asynchronously\n void this.createWorktreeAndRun(record, prompt);\n return record;\n }\n\n private async createWorktreeAndRun(record: WorkerRecord, prompt: string): Promise<void> {\n try {\n // Only create worktree if worktrees are enabled\n if (this.worktreeManager.isEnabled()) {\n // Create worktree for this worker\n logger.info(`Creating worktree for worker ${record.id} (task: ${record.task})`);\n const worktreeInfo = await this.worktreeManager.createWorktree(\n record.id,\n record.worktree_name || record.id,\n );\n\n // Update record with worktree information\n record.worktreePath = worktreeInfo.worktreePath;\n record.branchName = worktreeInfo.branchName;\n record.progress.push({\n timestamp: Date.now(),\n message: `Worktree created at ${worktreeInfo.worktreePath} on branch ${worktreeInfo.branchName}`,\n });\n this.emitUpdate(record);\n\n logger.info(`Worktree created for worker ${record.id} at ${worktreeInfo.worktreePath}`);\n } else {\n // Worktrees disabled, run in current working directory\n logger.info(`Worktrees disabled, worker ${record.id} will run in current directory`);\n record.progress.push({\n timestamp: Date.now(),\n message: 'Worktrees disabled, running in current directory',\n });\n this.emitUpdate(record);\n }\n\n // Run the worker (with or without worktree)\n await this.runWorker(record, prompt);\n } catch (error) {\n // Handle worktree creation failure or other errors\n logger.error(`Failed to setup worker ${record.id}:`, error);\n record.status = 'error';\n record.error = `Failed to setup worker: ${error instanceof Error ? error.message : String(error)}`;\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: `Worker failed: ${record.error}`,\n });\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: record.error,\n } satisfies WorkerMessageEvent);\n this.emitCompleted(record);\n\n // Close the message queue\n record.messageQueue.close();\n }\n }\n\n cancelWorker(id: string): boolean {\n const record = this.workers.get(id);\n if (!record) {\n return false;\n }\n\n if (record.status !== 'running') {\n return false;\n }\n\n record.status = 'canceled';\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: 'Worker canceled by user request.',\n });\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: 'Worker canceled by user request.',\n } satisfies WorkerMessageEvent);\n\n const query = this.runningQueries.get(id);\n if (query) {\n void query.interrupt().catch(() => {\n // Ignore interrupt errors; status already updated.\n });\n }\n\n // Close the message queue\n record.messageQueue.close();\n\n // Cleanup worktree asynchronously (will be handled in runWorker's catch block)\n // The worktree cleanup is handled in the runWorker method when it detects canceled status\n\n return true;\n }\n\n /**\n * Send a message to a worker (running or completed).\n *\n * @param task - The task name of the worker to message\n * @param message - The message content to send\n * @param interrupt - If true, interrupt current generation; if false, queue for next turn\n * @param toolUseId - Optional tool use ID to track this operation for relay forwarding\n * @returns true if message was sent, false if worker not found or message queue is closed\n */\n async messageWorker(\n task: string,\n message: string,\n interrupt: boolean,\n toolUseId?: string,\n ): Promise<boolean> {\n const record = this.getWorkerByTask(task);\n\n if (!record) {\n return false;\n }\n\n // Emit tool_call event for message_worker to make it visible in the worker's session\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_call',\n toolName: 'mcp__worker__message_worker',\n toolUseId,\n toolInput: { task, message, interrupt },\n } satisfies WorkerMessageEvent);\n }\n\n // Check if the worker needs to be restarted (completed, error, or canceled)\n if (record.status !== 'running') {\n // Create a new message queue for the restarted worker\n record.messageQueue = new AsyncQueue<SDKUserMessage>();\n\n record.status = 'running';\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: `Worker restarted with new message: ${message}`,\n });\n this.emitUpdate(record);\n\n // Restart the worker by calling runWorker again\n // The message will be consumed from the queue\n void this.runWorker(record, ''); // Empty prompt since we're resuming\n }\n\n // After potential restart, check if the queue is still closed (shouldn't happen)\n if (record.messageQueue.isClosed()) {\n console.error('[WorkerManager] Message queue is closed after restart attempt');\n return false;\n }\n\n // Log the message being sent to progress for internal tracking\n record.progress.push({\n timestamp: Date.now(),\n message: `[ORCHESTRATOR MESSAGE${interrupt ? ' - INTERRUPT' : ''}]: ${message}`,\n });\n record.lastUpdateAt = Date.now();\n\n // If interrupt is requested, interrupt the current query\n if (interrupt) {\n const query = this.runningQueries.get(record.id);\n if (query) {\n try {\n await query.interrupt();\n } catch (error) {\n console.error('[WorkerManager] Failed to interrupt worker:', error);\n }\n }\n }\n\n // Create SDK user message and push to queue\n const userMessage: SDKUserMessage = {\n session_id: record.sessionId,\n type: 'user',\n message: {\n role: 'user',\n content: message,\n },\n parent_tool_use_id: null,\n isSynthetic: true,\n };\n\n try {\n record.messageQueue.push(userMessage);\n\n // Emit tool_result to confirm message was queued/sent successfully\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId,\n toolContent: {\n success: true,\n task,\n interrupted: interrupt,\n message: interrupt\n ? `Message sent to worker \"${task}\" (interrupted current work)`\n : `Message queued for worker \"${task}\" (will be delivered after current turn)`,\n },\n isError: false,\n } satisfies WorkerMessageEvent);\n }\n\n return true;\n } catch (error) {\n console.error('[WorkerManager] Failed to queue message:', error);\n\n // Emit error result if we have a toolUseId\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId,\n toolContent: {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to queue message',\n },\n isError: true,\n } satisfies WorkerMessageEvent);\n }\n\n return false;\n }\n }\n\n private emitUpdate(record: WorkerRecord): void {\n this.emit('update', { ...record });\n }\n\n private emitCompleted(record: WorkerRecord): void {\n this.emit('completed', { ...record });\n }\n\n private handleStatusUpdate(record: WorkerRecord, event: StatusUpdateEvent): void {\n console.log('[WorkerManager] Status update received:', {\n workerId: record.id,\n task: record.task,\n message: event.message,\n metadata: event.metadata,\n });\n record.progress.push({\n timestamp: event.timestamp,\n message: event.message,\n });\n record.lastUpdateAt = event.timestamp;\n this.emitUpdate(record);\n }\n\n /**\n * Create an async iterable stream of user messages for the worker.\n * Yields the initial prompt, then streams any additional messages from the queue.\n * If initialPrompt is empty, skips the initial yield and only consumes from the queue.\n */\n private async *createMessageStream(\n initialPrompt: string,\n sessionId: string,\n messageQueue: AsyncQueue<SDKUserMessage>,\n ): AsyncIterable<SDKUserMessage> {\n // Only yield initial prompt if it's not empty (for worker restart/resume)\n if (initialPrompt.trim()) {\n yield {\n session_id: sessionId,\n type: 'user',\n message: {\n role: 'user',\n content: initialPrompt,\n },\n parent_tool_use_id: null,\n };\n }\n\n // Continue yielding messages from the queue\n for await (const message of messageQueue) {\n yield message;\n }\n }\n\n private async runWorker(record: WorkerRecord, prompt: string): Promise<void> {\n // Create status update MCP server for this worker\n const statusMcpServer = createWorkerStatusMcpServer((event: StatusUpdateEvent) => {\n this.handleStatusUpdate(record, event);\n });\n\n console.log('[WorkerManager] Creating worker client with status MCP server:', {\n workerId: record.id,\n task: record.task,\n hasMcpServer: !!statusMcpServer,\n worktreePath: record.worktreePath,\n branchName: record.branchName,\n });\n\n // Create client with status MCP server and worktree path as cwd\n const client = this.options.createClient(\n {\n worker_status: statusMcpServer,\n },\n record.worktreePath,\n );\n\n // Wrap the prompt with worker instructions including worktree information\n const workerPrompt = this.wrapPrompt(prompt, record.worktreePath, record.branchName);\n\n // Create message stream that includes initial prompt and any future messages\n const messageStream = this.createMessageStream(\n workerPrompt,\n record.sessionId,\n record.messageQueue,\n );\n\n // Create query with the message stream for continuous message support\n // Add PostToolUse hook to capture tool results\n // This hook fires AFTER a tool has been executed and allows us to intercept the result\n const query = client.createQuery(messageStream, {\n hooks: {\n PostToolUse: [\n {\n // No matcher means it applies to all tools (Bash, Read, Write, etc.)\n // If we wanted to only capture Bash results, we could add: matcher: 'Bash'\n hooks: [\n async (input: HookInput, toolUseID: string | undefined): Promise<HookJSONOutput> => {\n // Type guard to ensure we're handling PostToolUse events\n if (input.hook_event_name !== 'PostToolUse') {\n return {};\n }\n\n // Now we can safely access PostToolUse-specific fields\n const postToolInput = input as PostToolUseHookInput;\n\n console.log('[WorkerManager] PostToolUse hook triggered:', {\n toolName: postToolInput.tool_name,\n toolUseID,\n hasResponse: !!postToolInput.tool_response,\n workerId: record.id,\n task: record.task,\n });\n\n // Log the structure of the tool response for debugging\n if (postToolInput.tool_name === 'Bash') {\n console.log('[WorkerManager] Bash tool response structure:', {\n responseType: typeof postToolInput.tool_response,\n responseKeys: postToolInput.tool_response\n ? Object.keys(postToolInput.tool_response)\n : [],\n fullResponse: postToolInput.tool_response,\n });\n }\n\n // Emit tool_result message event for broadcasting\n // The tool_response from the hook contains the actual tool output\n // This will be picked up by the orchestrator and broadcast to the UI\n // where it will be paired with the corresponding tool_call by toolUseId\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId: toolUseID || randomUUID(),\n toolContent: postToolInput.tool_response,\n isError: false, // PostToolUse is for successful executions\n } satisfies WorkerMessageEvent);\n\n // Return empty object to not modify the tool response\n // We could return { suppressOutput: true } to prevent the tool result from\n // being sent to the assistant, but we want the assistant to see the results\n return {};\n },\n ],\n },\n ],\n },\n });\n\n // Store the query reference for interrupt support\n this.runningQueries.set(record.id, query);\n\n const summarizedChunks: string[] = [];\n\n try {\n for await (const message of query) {\n this.handleMessage(record, message, summarizedChunks);\n }\n\n if (record.status === 'running') {\n record.status = 'completed';\n record.result =\n summarizedChunks.join('\\n').trim() || 'Worker completed without additional details.';\n record.lastUpdateAt = Date.now();\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: true,\n text: record.result,\n } satisfies WorkerMessageEvent);\n this.emitCompleted(record);\n }\n } catch (error) {\n if (record.status === 'canceled') {\n this.emitCompleted(record);\n return;\n }\n\n record.status = 'error';\n record.error = this.extractError(error);\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: `Worker failed: ${record.error}`,\n });\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: record.error,\n } satisfies WorkerMessageEvent);\n this.emitCompleted(record);\n } finally {\n // Only delete from running queries - keep message queue open for potential future messages\n this.runningQueries.delete(record.id);\n }\n }\n\n private handleMessage(\n record: WorkerRecord,\n message: SDKMessage,\n summarizedChunks: string[],\n ): void {\n switch (message.type) {\n case 'assistant': {\n // Extract text content\n const text = this.extractAssistantText(message);\n if (text) {\n summarizedChunks.push(text);\n record.progress.push({\n timestamp: Date.now(),\n message: text,\n });\n record.lastUpdateAt = Date.now();\n this.emit('message', {\n record,\n messageType: 'assistant_text',\n text,\n } satisfies WorkerMessageEvent);\n }\n\n // Extract tool uses from assistant message content\n const content = message.message.content;\n let hasToolUse = false;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (block && typeof block === 'object' && 'type' in block) {\n if (block.type === 'tool_use' && 'name' in block && 'id' in block) {\n hasToolUse = true;\n this.emit('message', {\n record,\n messageType: 'tool_call',\n toolName: block.name as string,\n toolUseId: block.id as string,\n toolInput: 'input' in block ? block.input : undefined,\n } satisfies WorkerMessageEvent);\n }\n }\n }\n }\n\n // If the assistant message has no tool uses, close the message queue\n // This signals the end of the current generation and allows completion logic to run\n // The queue can be reopened when messageWorker is called\n if (!hasToolUse && !record.messageQueue.isClosed()) {\n console.log(\n '[WorkerManager] Assistant message without tool use - closing message queue to signal completion',\n );\n record.messageQueue.close();\n }\n break;\n }\n case 'stream_event': {\n const text = this.extractDeltaText(message);\n if (text) {\n record.progress.push({\n timestamp: Date.now(),\n message: text,\n });\n record.lastUpdateAt = Date.now();\n }\n break;\n }\n case 'result': {\n const success = message.subtype === 'success';\n if (!success && record.status === 'running') {\n record.status = 'error';\n record.error = message.subtype;\n record.lastUpdateAt = Date.now();\n this.emitUpdate(record);\n this.emitCompleted(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: record.error ?? message.subtype,\n } satisfies WorkerMessageEvent);\n }\n break;\n }\n default:\n break;\n }\n }\n\n private extractAssistantText(message: SDKMessage): string | null {\n if (message.type !== 'assistant') {\n return null;\n }\n\n const content: unknown = message.message.content;\n if (typeof content === 'string') {\n return content.trim();\n }\n\n if (Array.isArray(content)) {\n const texts: string[] = [];\n for (const block of content) {\n if (\n block &&\n typeof block === 'object' &&\n block.type === 'text' &&\n typeof block.text === 'string'\n ) {\n const trimmed = block.text.trim();\n if (trimmed.length > 0) {\n texts.push(trimmed);\n }\n }\n }\n if (texts.length > 0) {\n return texts.join('\\n');\n }\n }\n\n return null;\n }\n\n private extractDeltaText(message: SDKMessage): string | null {\n if (message.type !== 'stream_event') {\n return null;\n }\n const event = message.event;\n if (!event || typeof event !== 'object') {\n return null;\n }\n\n if (event.type === 'content_block_delta') {\n const delta = event.delta as { type?: string; text?: unknown } | null;\n if (delta?.type === 'text_delta' && typeof delta.text === 'string') {\n const raw = delta.text.trim();\n return raw.length > 0 ? raw : null;\n }\n }\n\n return null;\n }\n\n private extractError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n try {\n return JSON.stringify(error);\n } catch {\n return 'Unknown worker error';\n }\n }\n\n private wrapPrompt(userPrompt: string, worktreePath?: string, branchName?: string): string {\n let directive = `\\n\\nIMPORTANT:\\n- Use the mcp__worker_status__send_status_update tool to report progress as you work.\\n- When finished, output a final summary.\\n- Do not include raw diffs or large file dumps unless explicitly asked.\\n`;\n\n if (worktreePath && branchName) {\n directive += `\\nWORKTREE ISOLATION:\\n- You are working in an isolated git worktree at: ${worktreePath}\\n- Your dedicated branch is: ${branchName}\\n- All your file operations, git commands, and changes are isolated to this worktree.\\n- Other workers cannot see your changes and you cannot see theirs.\\n- When you're done, your worktree will be automatically cleaned up.\\n\\nCOMMIT YOUR CHANGES:\\n- Before completing your task, commit your changes using git.\\n- Use a descriptive commit message that explains what you did.\\n- Your commits will stay on your isolated branch and can be reviewed before merging.\\n- This ensures your work is preserved even if cleanup happens unexpectedly.\\n`;\n }\n\n return `${userPrompt.trim()}\\n${directive}`;\n }\n\n /**\n * Shutdown the worker manager and cleanup all resources\n * This should be called during application shutdown to ensure all worktrees are cleaned up\n */\n async shutdown(): Promise<void> {\n logger.info('Shutting down worker manager');\n\n // Cancel all running workers\n const runningWorkers = Array.from(this.workers.values()).filter((w) => w.status === 'running');\n\n for (const worker of runningWorkers) {\n logger.info(`Canceling worker ${worker.id} during shutdown`);\n this.cancelWorker(worker.id);\n }\n\n // Wait a moment for workers to process cancellation\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Force cleanup all remaining worktrees\n try {\n await this.worktreeManager.cleanupAll(true);\n logger.info('All worktrees cleaned up successfully');\n } catch (error) {\n logger.error('Error during worktree cleanup:', error);\n }\n\n logger.info('Worker manager shutdown complete');\n }\n}\n", "import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nimport { z } from 'zod';\n\nexport interface StatusUpdateEvent {\n message: string;\n metadata?: Record<string, unknown>;\n timestamp: number;\n}\n\nexport type StatusUpdateCallback = (event: StatusUpdateEvent) => void;\n\nexport function createWorkerStatusMcpServer(onStatusUpdate: StatusUpdateCallback) {\n return createSdkMcpServer({\n name: 'worker_status',\n version: '1.0.0',\n tools: [\n tool(\n 'send_status_update',\n `Send a status update message to notify about progress.\n\nUse this tool to:\n- Report progress on long-running tasks\n- Notify about important milestones or decisions\n- Provide context about what you're currently working on\n- Signal warnings or issues that don't stop execution\n\nThe status update will be visible to the orchestrator and tracked in your task's progress history.`,\n {\n message: z\n .string()\n .min(1, 'message is required')\n .describe('A concise status update message describing current progress or state'),\n metadata: z\n .record(z.any())\n .optional()\n .describe('Optional metadata to attach to this status update'),\n },\n async (args) => {\n console.log('[StatusTool] send_status_update called:', {\n message: args.message,\n metadata: args.metadata,\n });\n\n onStatusUpdate({\n message: args.message,\n metadata: args.metadata,\n timestamp: Date.now(),\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Status update sent successfully.',\n },\n ],\n };\n },\n ),\n ],\n });\n}\n", "/**\n * A simple async queue for streaming messages to workers.\n * Allows pushing messages and consuming them via async iteration.\n */\nexport class AsyncQueue<T> {\n private queue: T[] = [];\n private resolvers: Array<(value: IteratorResult<T>) => void> = [];\n private closed = false;\n\n /**\n * Push a new item to the queue.\n * If there are waiting consumers, resolve them immediately.\n */\n push(item: T): void {\n if (this.closed) {\n throw new Error('Cannot push to a closed queue');\n }\n\n if (this.resolvers.length > 0) {\n const resolve = this.resolvers.shift();\n resolve?.({ value: item, done: false });\n } else {\n this.queue.push(item);\n }\n }\n\n /**\n * Close the queue, signaling that no more items will be added.\n */\n close(): void {\n this.closed = true;\n // Resolve all waiting consumers with done: true\n while (this.resolvers.length > 0) {\n const resolve = this.resolvers.shift();\n resolve?.({ value: undefined as T, done: true });\n }\n }\n\n /**\n * Check if the queue is closed.\n */\n isClosed(): boolean {\n return this.closed;\n }\n\n /**\n * Async iterator implementation for consuming items from the queue.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n while (true) {\n // If there are items in the queue, yield them\n if (this.queue.length > 0) {\n const item = this.queue.shift();\n if (item !== undefined) {\n yield item;\n }\n continue;\n }\n\n // If the queue is closed and empty, we're done\n if (this.closed) {\n return;\n }\n\n // Wait for a new item or close\n const result = await new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n\n if (result.done) {\n return;\n }\n\n yield result.value;\n }\n }\n}\n", "import { simpleGit, type SimpleGit } from 'simple-git';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { logger } from '../../utils/logger.js';\nimport { DEFAULT_DIR } from '../../auth/credentials-store.js';\n\n/**\n * Configuration options for WorktreeManager\n */\nexport interface WorktreeManagerOptions {\n /**\n * The root directory of the git repository\n */\n repoPath: string;\n\n /**\n * Base directory for worktrees (default: .omnara/worktrees)\n */\n worktreeBasePath?: string;\n\n /**\n * Whether worktrees are enabled (default: false)\n */\n enabled?: boolean;\n}\n\n/**\n * Information about a created worktree\n */\nexport interface WorktreeInfo {\n /**\n * Unique identifier for the worker\n */\n workerId: string;\n\n /**\n * Semantic name for the worktree (e.g., \"main-feature\", \"bugfix-auth\")\n */\n worktreeName: string;\n\n /**\n * Absolute path to the worktree directory\n */\n worktreePath: string;\n\n /**\n * Name of the branch created for this worktree\n */\n branchName: string;\n\n /**\n * Timestamp when the worktree was created\n */\n createdAt: Date;\n}\n\n/**\n * Error thrown when worktree operations fail\n */\nexport class WorktreeError extends Error {\n constructor(\n message: string,\n public readonly workerId: string,\n public readonly operation: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'WorktreeError';\n }\n}\n\n/**\n * Manages git worktrees for worker isolation\n *\n * This class handles the lifecycle of git worktrees, ensuring each worker\n * operates in an isolated environment. It provides methods for creating,\n * managing, and cleaning up worktrees.\n *\n * @example\n * ```typescript\n * const manager = new WorktreeManager({ repoPath: '/path/to/repo' });\n * const info = await manager.createWorktree('worker-123', 'main-feature');\n * // Worker operates in info.worktreePath\n * await manager.removeWorktree('worker-123');\n * ```\n */\nexport class WorktreeManager {\n private readonly git: SimpleGit;\n private readonly repoPath: string;\n private readonly worktreeBasePath: string;\n private readonly activeWorktrees: Map<string, WorktreeInfo>;\n private readonly enabled: boolean;\n\n constructor(options: WorktreeManagerOptions) {\n this.repoPath = options.repoPath;\n this.enabled = options.enabled ?? false;\n\n // Extract repo name from repoPath and create path structure: ~/.omnara/worktrees/<repo-name>\n const repoName = path.basename(this.repoPath);\n this.worktreeBasePath =\n options.worktreeBasePath || path.join(DEFAULT_DIR, 'worktrees', repoName);\n this.git = simpleGit(this.repoPath);\n this.activeWorktrees = new Map();\n\n // Validate git repository if enabled\n if (this.enabled) {\n this.validateGitRepository();\n }\n }\n\n /**\n * Validate that the repoPath is a git repository\n * Logs an error if worktrees are enabled but not in a git repository\n */\n private validateGitRepository(): void {\n this.git\n .checkIsRepo()\n .then((isRepo) => {\n if (!isRepo) {\n logger.error(`Worktrees are enabled but not in a git repository at ${this.repoPath}`);\n } else {\n logger.info(`Worktrees enabled for repository at ${this.repoPath}`);\n }\n })\n .catch((error) => {\n logger.error(\n `Worktrees are enabled but failed to check git repository at ${this.repoPath}:`,\n error,\n );\n });\n }\n\n /**\n * Check if worktrees are enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Creates a new worktree for the specified worker\n *\n * @param workerId - Unique identifier for the worker\n * @param worktreeName - Semantic name for the worktree (e.g., \"main-feature\", \"bugfix-auth\")\n * @returns Information about the created worktree\n * @throws {WorktreeError} If worktree creation fails\n */\n async createWorktree(workerId: string, worktreeName: string): Promise<WorktreeInfo> {\n if (!this.enabled) {\n throw new WorktreeError(\n 'Worktrees are not enabled. Add a \"worktrees\" configuration to omnara.jsonc to enable.',\n workerId,\n 'create',\n );\n }\n\n logger.info(`Creating worktree \"${worktreeName}\" for worker ${workerId}`);\n\n try {\n // Check if worktree already exists\n if (this.activeWorktrees.has(workerId)) {\n throw new WorktreeError(\n `Worktree already exists for worker ${workerId}`,\n workerId,\n 'create',\n );\n }\n\n // Ensure base directory exists\n await fs.mkdir(this.worktreeBasePath, { recursive: true });\n\n // Generate paths and names using worktreeName instead of workerId\n const branchName = `${worktreeName}`;\n const worktreePath = path.join(this.worktreeBasePath, worktreeName);\n\n // Check if branch exists\n const branches = await this.git.branchLocal();\n const branchExists = branches.all.includes(branchName);\n\n // Check if worktree directory exists\n let worktreeDirExists = false;\n try {\n await fs.access(worktreePath);\n worktreeDirExists = true;\n } catch {\n // Directory doesn't exist\n worktreeDirExists = false;\n }\n\n // Check if worktree is registered with git\n const worktreeList = await this.git.raw(['worktree', 'list', '--porcelain']);\n const gitWorktrees = this.parseWorktreeList(worktreeList);\n const worktreeRegistered = gitWorktrees.includes(worktreePath);\n\n // Scenario 2: If worktree exists and branch exists, reuse it\n if (worktreeRegistered && branchExists) {\n logger.info(\n `Reusing existing worktree \"${worktreeName}\" at ${worktreePath} on branch ${branchName}`,\n );\n\n const info: WorktreeInfo = {\n workerId,\n worktreeName,\n worktreePath,\n branchName,\n createdAt: new Date(),\n };\n\n this.activeWorktrees.set(workerId, info);\n return info;\n }\n\n // Handle edge case: directory exists but worktree is not registered\n if (worktreeDirExists && !worktreeRegistered) {\n logger.warn(\n `Directory exists at ${worktreePath} but is not a registered worktree. Removing...`,\n );\n await fs.rm(worktreePath, { recursive: true, force: true });\n worktreeDirExists = false;\n }\n\n // Scenario 3: If branch exists but worktree does not exist, create worktree for existing branch\n if (branchExists && !worktreeRegistered) {\n logger.info(\n `Branch ${branchName} exists. Creating worktree at ${worktreePath} using existing branch`,\n );\n await this.git.raw(['worktree', 'add', worktreePath, branchName]);\n }\n // Scenario 1: If neither exists, create new worktree with new branch\n else if (!branchExists && !worktreeRegistered) {\n logger.info(\n `Creating new worktree \"${worktreeName}\" at ${worktreePath} with new branch ${branchName}`,\n );\n await this.git.raw(['worktree', 'add', '-b', branchName, worktreePath]);\n }\n\n const info: WorktreeInfo = {\n workerId,\n worktreeName,\n worktreePath,\n branchName,\n createdAt: new Date(),\n };\n\n this.activeWorktrees.set(workerId, info);\n logger.info(`Worktree \"${worktreeName}\" ready at ${worktreePath} on branch ${branchName}`);\n\n return info;\n } catch (error) {\n logger.error(`Failed to create worktree for worker ${workerId}:`, error);\n throw new WorktreeError(\n `Failed to create worktree: ${error instanceof Error ? error.message : String(error)}`,\n workerId,\n 'create',\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Removes a worktree for the specified worker\n *\n * @param workerId - Unique identifier for the worker\n * @param force - Force removal even if there are uncommitted changes\n * @throws {WorktreeError} If worktree removal fails\n */\n async removeWorktree(workerId: string, force: boolean = false): Promise<void> {\n if (!this.enabled) {\n // Silently return if worktrees are disabled\n return;\n }\n\n logger.info(`Removing worktree for worker ${workerId}`);\n\n const info = this.activeWorktrees.get(workerId);\n if (!info) {\n logger.warn(`No active worktree found for worker ${workerId}`);\n return;\n }\n\n try {\n // Remove worktree\n const args = ['worktree', 'remove', info.worktreePath];\n if (force) {\n args.push('--force');\n }\n\n try {\n await this.git.raw(args);\n } catch (worktreeError) {\n const errorMessage =\n worktreeError instanceof Error ? worktreeError.message : String(worktreeError);\n\n // Check if worktree doesn't exist or is already removed\n if (\n errorMessage.includes('is not a working tree') ||\n errorMessage.includes('does not exist')\n ) {\n logger.warn(\n `Worktree ${info.worktreePath} doesn't exist, may have been manually removed. Cleaning up...`,\n );\n\n // Try to prune stale worktrees and manually remove directory if it exists\n await this.git.raw(['worktree', 'prune']);\n\n try {\n await fs.rm(info.worktreePath, { recursive: true, force: true });\n logger.info(`Manually removed stale worktree directory: ${info.worktreePath}`);\n } catch {\n // Directory doesn't exist, which is fine\n }\n } else {\n // Re-throw if it's a different error\n throw worktreeError;\n }\n }\n\n this.activeWorktrees.delete(workerId);\n logger.info(`Removed worktree for worker ${workerId}`);\n } catch (error) {\n logger.error(`Failed to remove worktree for worker ${workerId}:`, error);\n throw new WorktreeError(\n `Failed to remove worktree: ${error instanceof Error ? error.message : String(error)}`,\n workerId,\n 'remove',\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Gets information about a worker's worktree\n *\n * @param workerId - Unique identifier for the worker\n * @returns Worktree information or undefined if not found\n */\n getWorktreeInfo(workerId: string): WorktreeInfo | undefined {\n return this.activeWorktrees.get(workerId);\n }\n\n /**\n * Lists all active worktrees managed by this instance\n *\n * @returns Array of worktree information\n */\n listActiveWorktrees(): WorktreeInfo[] {\n return Array.from(this.activeWorktrees.values());\n }\n\n /**\n * Cleans up all active worktrees\n *\n * This method should be called during application shutdown to ensure\n * all worktrees are properly cleaned up.\n *\n * @param force - Force removal even if there are uncommitted changes\n */\n async cleanupAll(force: boolean = false): Promise<void> {\n if (!this.enabled) {\n // Silently return if worktrees are disabled\n return;\n }\n\n logger.info('Cleaning up all worktrees');\n\n const workers = Array.from(this.activeWorktrees.keys());\n const results = await Promise.allSettled(\n workers.map((workerId) => this.removeWorktree(workerId, force)),\n );\n\n const failures = results.filter((r) => r.status === 'rejected');\n if (failures.length > 0) {\n logger.error(`Failed to cleanup ${failures.length} worktrees`);\n } else {\n logger.info('Successfully cleaned up all worktrees');\n }\n }\n\n /**\n * Parses the output of 'git worktree list --porcelain'\n *\n * @param output - Raw output from git worktree list\n * @returns Array of worktree paths\n */\n private parseWorktreeList(output: string): string[] {\n const lines = output.split('\\n');\n const paths: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('worktree ')) {\n paths.push(line.substring('worktree '.length));\n }\n }\n\n return paths;\n }\n\n /**\n * Checks if the repository is in a clean state for worktree operations\n *\n * @returns True if repository is clean\n */\n async isRepositoryClean(): Promise<boolean> {\n const status = await this.git.status();\n return status.files.length === 0;\n }\n}\n", "/**\n * Logger utility for controlling console output based on environment\n *\n * Production detection:\n * 1. NODE_ENV === 'production'\n * 2. OMNARA_LOG_LEVEL === 'none' or 'error'\n * 3. Running from compiled dist/ directory (not tsx/ts-node)\n */\n\nimport path from 'path';\nimport type { InspectOptions } from 'util';\n\n/**\n * Log levels for controlling output verbosity\n */\nexport enum LogLevel {\n NONE = 0,\n ERROR = 1,\n WARN = 2,\n INFO = 3,\n DEBUG = 4,\n VERBOSE = 5,\n}\n\n/**\n * Detects if the CLI is running in production mode\n */\nexport function isProduction(): boolean {\n // Check NODE_ENV\n if (process.env.NODE_ENV === 'production') {\n return true;\n }\n\n // Check if running from dist directory (compiled)\n try {\n // Use __filename which is provided by the ESM shim in the build\n const currentFile = typeof __filename !== 'undefined' ? __filename : '';\n const isInDist = currentFile.includes(path.sep + 'dist' + path.sep);\n\n // If in dist AND no explicit development mode, assume production\n if (isInDist && process.env.NODE_ENV !== 'development') {\n return true;\n }\n } catch {\n // Fallback if URL parsing fails\n }\n\n // Check for explicit log level override\n const logLevel = process.env.OMNARA_LOG_LEVEL?.toLowerCase();\n if (logLevel === 'none' || logLevel === 'silent') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Gets the current log level from environment or defaults\n */\nexport function getLogLevel(): LogLevel {\n const envLevel = process.env.OMNARA_LOG_LEVEL?.toLowerCase();\n\n switch (envLevel) {\n case 'none':\n case 'silent':\n return LogLevel.NONE;\n case 'error':\n return LogLevel.ERROR;\n case 'warn':\n case 'warning':\n return LogLevel.WARN;\n case 'info':\n return LogLevel.INFO;\n case 'debug':\n return LogLevel.DEBUG;\n case 'verbose':\n case 'trace':\n return LogLevel.VERBOSE;\n default:\n // Default based on production mode\n return isProduction() ? LogLevel.ERROR : LogLevel.INFO;\n }\n}\n\n/**\n * Logger interface that extends Console but can be controlled\n */\nexport interface Logger extends Console {\n // Additional methods for important messages\n important(...args: unknown[]): void;\n success(...args: unknown[]): void;\n}\n\n/**\n * Creates a controlled logger instance\n */\nexport class ControlledLogger implements Logger {\n private logLevel: LogLevel;\n private forceOutput: boolean;\n private _console: Console;\n\n // Console properties we need to implement\n Console!: typeof console.Console;\n\n constructor(options?: { logLevel?: LogLevel; forceOutput?: boolean }) {\n this.logLevel = options?.logLevel ?? getLogLevel();\n this.forceOutput = options?.forceOutput ?? false;\n this._console = console;\n\n // Copy Console constructor\n this.Console = console.Console;\n }\n\n /**\n * Standard log output (INFO level)\n */\n log(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.log(...args);\n }\n }\n\n /**\n * Error output (always shown unless NONE)\n */\n error(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n console.error(...args);\n }\n }\n\n /**\n * Warning output\n */\n warn(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n console.warn(...args);\n }\n }\n\n /**\n * Info level output\n */\n info(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.info(...args);\n }\n }\n\n /**\n * Debug output (only in development)\n */\n debug(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n console.debug(...args);\n }\n }\n\n /**\n * Verbose/trace output\n */\n trace(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.VERBOSE)) {\n console.log('[TRACE]', ...args);\n }\n }\n\n /**\n * Important messages that should always be shown to user\n * (authentication status, connection info, etc.)\n */\n important(...args: unknown[]): void {\n // Always show important messages unless completely silent\n if (this.logLevel !== LogLevel.NONE || this.forceOutput) {\n console.log(...args);\n }\n }\n\n /**\n * Success messages that should typically be shown\n */\n success(...args: unknown[]): void {\n // Show success messages at WARN level and above\n if (this.shouldLog(LogLevel.WARN) || this.forceOutput) {\n console.log(...args);\n }\n }\n\n /**\n * Check if a message should be logged at the given level\n */\n private shouldLog(level: LogLevel): boolean {\n return this.forceOutput || this.logLevel >= level;\n }\n\n /**\n * Update the log level dynamically\n */\n setLogLevel(level: LogLevel): void {\n this.logLevel = level;\n }\n\n /**\n * Get current log level\n */\n getLogLevel(): LogLevel {\n return this.logLevel;\n }\n\n // Console methods we delegate or control based on log level\n assert(condition?: boolean, ...data: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n this._console.assert(condition, ...data);\n }\n }\n\n clear(): void {\n this._console.clear();\n }\n\n count(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.count(label);\n }\n }\n\n countReset(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.countReset(label);\n }\n }\n\n dir(item?: unknown, options?: InspectOptions): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.dir(item, options);\n }\n }\n\n dirxml(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.dirxml(...data);\n }\n }\n\n group(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.group(...data);\n }\n }\n\n groupCollapsed(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.groupCollapsed(...data);\n }\n }\n\n groupEnd(): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.groupEnd();\n }\n }\n\n table(tabularData?: unknown, properties?: string[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n this._console.table(tabularData, properties);\n }\n }\n\n time(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.time(label);\n }\n }\n\n timeEnd(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeEnd(label);\n }\n }\n\n timeLog(label?: string, ...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeLog(label, ...data);\n }\n }\n\n timeStamp(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeStamp(label);\n }\n }\n\n profile(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n // profile is not part of standard Console interface, check if it exists\n const consoleWithProfile = this._console as Console & { profile?: (label?: string) => void };\n consoleWithProfile.profile?.(label);\n }\n }\n\n profileEnd(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n // profileEnd is not part of standard Console interface, check if it exists\n const consoleWithProfileEnd = this._console as Console & {\n profileEnd?: (label?: string) => void;\n };\n consoleWithProfileEnd.profileEnd?.(label);\n }\n }\n}\n\n/**\n * Global logger instance\n */\nexport const logger = new ControlledLogger();\n\n/**\n * Creates a logger for a specific component\n */\nexport function createLogger(\n componentName?: string,\n options?: {\n logLevel?: LogLevel;\n forceOutput?: boolean;\n },\n): Logger {\n const baseLogger = new ControlledLogger(options);\n\n if (!componentName) {\n return baseLogger;\n }\n\n // Create a wrapper that delegates all Console methods with component prefix\n const wrappedLogger = Object.create(baseLogger) as Logger;\n\n // Override methods that should have component prefix\n wrappedLogger.log = (...args) => baseLogger.log(`[${componentName}]`, ...args);\n wrappedLogger.error = (...args) => baseLogger.error(`[${componentName}]`, ...args);\n wrappedLogger.warn = (...args) => baseLogger.warn(`[${componentName}]`, ...args);\n wrappedLogger.info = (...args) => baseLogger.info(`[${componentName}]`, ...args);\n wrappedLogger.debug = (...args) => baseLogger.debug(`[${componentName}]`, ...args);\n wrappedLogger.trace = (...args) => baseLogger.trace(`[${componentName}]`, ...args);\n // Important and success don't get prefixes\n wrappedLogger.important = (...args) => baseLogger.important(...args);\n wrappedLogger.success = (...args) => baseLogger.success(...args);\n\n return wrappedLogger;\n}\n\n/**\n * Helper to extract error messages consistently\n */\nexport function extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Print current logger configuration (useful for debugging)\n */\nexport function printLoggerConfig(): void {\n const prod = isProduction();\n const level = getLogLevel();\n const levelName = LogLevel[level];\n\n console.log('Logger Configuration:');\n console.log(` Production Mode: ${prod}`);\n console.log(` Log Level: ${levelName} (${level})`);\n console.log(` NODE_ENV: ${process.env.NODE_ENV || '(not set)'}`);\n console.log(` OMNARA_LOG_LEVEL: ${process.env.OMNARA_LOG_LEVEL || '(not set)'}`);\n}\n", "import fs from 'fs/promises';\nimport os from 'os';\nimport path from 'path';\n\nexport interface StoredCredentials {\n accessToken?: string;\n accessTokenExpiresAt?: string;\n refreshToken?: string;\n refreshTokenExpiresAt?: string;\n}\n\nexport const DEFAULT_DIR = path.join(os.homedir(), '.omnara');\nexport const DEFAULT_CREDENTIALS_PATH = path.join(DEFAULT_DIR, 'creds.json');\nconst DEFAULT_FILE_MODE = 0o600;\nconst DEFAULT_DIR_MODE = 0o700;\n\nfunction isStoredCredentials(value: unknown): value is StoredCredentials {\n return Boolean(value) && typeof value === 'object';\n}\n\nexport class CredentialsStore {\n constructor(private readonly filePath: string = DEFAULT_CREDENTIALS_PATH) {}\n\n async load(): Promise<StoredCredentials | null> {\n try {\n const raw = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (!isStoredCredentials(parsed)) {\n throw new Error('File does not contain valid credentials data');\n }\n return parsed;\n } catch (error) {\n if (isFileNotFound(error)) {\n return null;\n }\n throw new Error(\n `Failed to read credentials from ${this.filePath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n\n async save(credentials: StoredCredentials): Promise<void> {\n const payload: StoredCredentials = {\n accessToken: credentials.accessToken,\n accessTokenExpiresAt: credentials.accessTokenExpiresAt,\n refreshToken: credentials.refreshToken,\n refreshTokenExpiresAt: credentials.refreshTokenExpiresAt,\n };\n\n await fs.mkdir(path.dirname(this.filePath), { recursive: true, mode: DEFAULT_DIR_MODE });\n\n const tempPath = `${this.filePath}.tmp`;\n const serialized = JSON.stringify(payload, null, 2);\n await fs.writeFile(tempPath, serialized, { mode: DEFAULT_FILE_MODE });\n await fs.chmod(tempPath, DEFAULT_FILE_MODE);\n await fs.rename(tempPath, this.filePath);\n }\n\n async clear(): Promise<void> {\n try {\n await fs.unlink(this.filePath);\n } catch (error) {\n if (!isFileNotFound(error)) {\n throw new Error(\n `Failed to remove credentials file ${this.filePath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n }\n}\n\nfunction isFileNotFound(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === 'ENOENT',\n );\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n", "import { parse as parseJsonc, type ParseError } from 'jsonc-parser';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as z from 'zod';\n\nexport type OmnaraConfig = z.infer<typeof OmnaraConfig>;\nconst OmnaraConfig = z.object({\n worktrees: z\n .object({\n enabled: z.boolean().default(false),\n })\n .default({\n enabled: false,\n }),\n});\n\n/**\n * Read and parse the omnara.jsonc configuration file\n *\n * @param configPath - Path to the config file (defaults to omnara.jsonc in cwd)\n * @returns Parsed configuration or default config if file doesn't exist\n */\nexport async function readOmnaraConfig(configPath?: string): Promise<OmnaraConfig> {\n const resolveConfig = async (path?: string): Promise<OmnaraConfig | null> => {\n if (!path) {\n return null;\n }\n\n await fs.access(path);\n\n const content = await fs.readFile(path, 'utf-8');\n const errors: ParseError[] = [];\n const config = parseJsonc(content, errors, {\n allowTrailingComma: true,\n allowEmptyContent: true,\n });\n return OmnaraConfig.parse(config);\n };\n\n const resolveDefault = (): OmnaraConfig => {\n return OmnaraConfig.parse({});\n };\n\n return (\n (await resolveConfig(configPath).catch(() => null)) ??\n (await resolveConfig(path.join(process.cwd(), 'omnara.jsonc')).catch(() => null)) ??\n (await resolveConfig(path.join(process.cwd(), 'omnara.json')).catch(() => null)) ??\n (await resolveDefault())\n );\n}\n\n/**\n * Check if worktrees are enabled in the configuration\n *\n * @param config - The omnara configuration\n * @returns true if worktrees should be enabled\n */\nexport function isWorktreesEnabled(config: OmnaraConfig): boolean {\n // Worktrees are enabled if the worktrees key exists in the config\n return config.worktrees.enabled;\n}\n", "import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nimport { z } from 'zod';\nimport type { WorkerManager } from '../worker-manager.js';\n\ntype ToolExtra = {\n sessionId?: string;\n signal: AbortSignal;\n _meta?: Record<string, unknown>;\n};\n\ninterface WorkerMcpContext {\n resolveSessionIdBySdk: (sdkSessionId?: string) => string | undefined;\n resolveSessionIdByToolUse: (toolUseId: string) => string | undefined;\n getMainCodingSessionId: () => string | null;\n}\n\nexport function createWorkerMcpServer(workerManager: WorkerManager, context: WorkerMcpContext) {\n return createSdkMcpServer({\n name: 'worker',\n version: '1.0.0',\n tools: [\n tool(\n 'launch_worker',\n `Launch a background worker agent to handle tasks autonomously in an isolated git worktree.\n\nEach worker operates in its own git worktree, providing complete isolation:\n- Separate working directory (no shared file changes)\n- Dedicated git branch\n- Independent git operations (staging, committing, etc.)\n- The worker's worktree is automatically cleaned up when the worker completes\n\nWhen to use this tool:\n- Complex tasks requiring multiple steps or operations\n- Searches and exploration of the codebase\n- Tasks that can run in parallel with other work\n- Nearly any coding task - prefer delegation over doing work directly\n\nUsage notes:\n- Launch multiple workers concurrently whenever possible for maximum performance (use multiple tool calls in a single turn)\n- Provide detailed, autonomous task descriptions including exactly what information should be returned\n- Workers have full access to: file operations (read, write, edit), search (glob, grep), bash commands, git operations, running tests, and can launch their own sub-workers\n- Worker outputs should be trusted - they have the same capabilities as you\n- The worker's result is returned to you, not the user - you must summarize or forward relevant information\n- Worker progress status is automatically included in your context - you can see their current state without additional tools`,\n {\n task: z\n .string()\n .min(1, 'task name is required')\n .describe(\n 'A short, unique name for this task (e.g., \"FizzBuzz Python\", \"Search codebase\", \"Fix bug #123\"). Used to identify and track this worker.',\n ),\n prompt: z.string().min(1, 'prompt is required'),\n worktree_name: z\n .string()\n .min(1, 'worktree_name is required')\n .describe(\n 'A short descriptive name for a worktree to create that can be used by workers simultaneously. This is synonymous with branch.',\n ),\n metadata: z.record(z.any()).optional(),\n },\n async (args, extra) => {\n const typedExtra = extra as ToolExtra | undefined;\n const toolUseIdRaw = typedExtra?._meta?.['claudecode/toolUseId'];\n const toolUseId = typeof toolUseIdRaw === 'string' ? toolUseIdRaw : undefined;\n\n // Always use the main coding session as parent for workers\n // This ensures workers are children of the main session, not voice or other sessions\n let parentSessionId = context.getMainCodingSessionId() || undefined;\n\n // Fallback to SDK resolution if main session not available (shouldn't happen)\n if (!parentSessionId) {\n const sdkSessionId = typedExtra?.sessionId;\n parentSessionId = context.resolveSessionIdBySdk(sdkSessionId);\n if (!parentSessionId && toolUseId) {\n parentSessionId = context.resolveSessionIdByToolUse(toolUseId);\n }\n console.warn(\n '[WorkerTools] Main coding session not available, falling back to SDK resolution:',\n parentSessionId,\n );\n }\n\n console.log('[WorkerTools] Launching worker:', {\n task: args.task,\n parentSessionId,\n mainCodingSession: context.getMainCodingSessionId(),\n toolUseId,\n });\n\n const record = workerManager.launchWorker(\n {\n task: args.task,\n prompt: args.prompt,\n work_context: args.worktree_name,\n worktree_name: args.worktree_name,\n originSessionId: parentSessionId,\n metadata: args.metadata,\n },\n toolUseId,\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n workerId: record.id,\n status: record.status,\n worktree_path: record.worktreePath,\n branch_name: record.branchName,\n message: `Worker launched successfully, task ${args.task} in progress. You will be notified for progress updates.`,\n }),\n },\n ],\n };\n },\n ),\n tool(\n 'message_worker',\n `Send a message to a running worker to provide additional context, requirements, or steering.\n\nUse this tool to:\n- Add new requirements or clarifications to an in-progress task\n- Provide additional context the worker might need\n- Correct or redirect the worker's current approach\n- Answer implicit questions or resolve ambiguities\n\n**When to use this tool:**\n- User provides additional requirements while a task is in progress\n- User clarifies or corrects their original request\n- User adds context that would help the running worker\n- A logically related request comes in for an existing task\n\n**When to launch a NEW worker instead:**\n- The request is for a completely different, unrelated task\n- The user explicitly requests a separate task\n- The new work would conflict with the current worker's objective\n\n**Interrupt parameter:**\n- interrupt=true: Stop current work immediately and redirect (use for critical corrections or significant changes in direction)\n- interrupt=false: Queue message for after current turn completes (use for additions, clarifications, or supplementary context)\n\n**Guidelines for interrupt:**\n- Use interrupt=true ONLY if:\n - User explicitly says to stop/interrupt current work\n - The new requirement significantly contradicts the current direction\n - The worker is heading down the wrong path and needs immediate correction\n- Use interrupt=false (default) for:\n - Adding requirements that build on current work\n - Providing helpful context or clarifications\n - Making additions that don't conflict with current progress\n\nExample 1 (queue):\nUser: \"Add authentication to my app\"\nOrchestrator: [launches worker: \"add auth\"]\nUser: \"Make sure it works with Google OAuth\"\nOrchestrator: [message_worker: task=\"add auth\", message=\"User wants Google OAuth integration\", interrupt=false]\n\nExample 2 (interrupt):\nUser: \"Refactor the database layer\"\nOrchestrator: [launches worker: \"refactor database\"]\nUser: \"Wait, actually don't touch the database - just refactor the API layer instead\"\nOrchestrator: [message_worker: task=\"refactor database\", message=\"User wants to change scope - refactor API layer instead, leave database alone\", interrupt=true]`,\n {\n task: z\n .string()\n .min(1, 'task name is required')\n .describe('The task name of the worker to message'),\n message: z\n .string()\n .min(1, 'message is required')\n .describe(\n 'The message to send to the worker. Be clear and specific about what has changed or what additional context is being provided.',\n ),\n interrupt: z\n .boolean()\n .default(false)\n .describe(\n 'If true, interrupt current generation immediately; if false (default), queue message for next turn',\n ),\n },\n async (args, extra) => {\n const typedExtra = extra as ToolExtra | undefined;\n const toolUseIdRaw = typedExtra?._meta?.['claudecode/toolUseId'];\n const toolUseId = typeof toolUseIdRaw === 'string' ? toolUseIdRaw : undefined;\n\n console.log('[WorkerTools] Messaging worker:', {\n task: args.task,\n message: args.message.substring(0, 100),\n interrupt: args.interrupt,\n toolUseId,\n });\n\n const success = await workerManager.messageWorker(\n args.task,\n args.message,\n args.interrupt,\n toolUseId,\n );\n\n if (!success) {\n const worker = workerManager.getWorkerByTask(args.task);\n if (!worker) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: false,\n error: `No worker found with task name: ${args.task}`,\n }),\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: false,\n error: `Worker \"${args.task}\" is not running (status: ${worker.status})`,\n }),\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n task: args.task,\n interrupted: args.interrupt,\n message: args.interrupt\n ? `Message sent to worker \"${args.task}\" (interrupted current work)`\n : `Message queued for worker \"${args.task}\" (will be delivered after current turn)`,\n }),\n },\n ],\n };\n },\n ),\n ],\n });\n}\n", "/**\n * System prompt for the main orchestrator agent.\n *\n * The orchestrator's role is to coordinate and delegate work, not to execute tasks directly.\n * It should ALWAYS use workers to handle all implementation work.\n */\n\nimport { readFileSync } from 'fs';\n\n// Load markdown prompt at runtime (works in tsx/tests and bundled builds)\nconst orchestratorPromptUrl = new URL('./orchestrator-prompt.md', import.meta.url);\nconst ORCHESTRATOR_SYSTEM_PROMPT = readFileSync(orchestratorPromptUrl, 'utf-8');\n\nexport { ORCHESTRATOR_SYSTEM_PROMPT };\n", "import { randomUUID } from 'crypto';\nimport EventEmitter from 'events';\nimport WebSocket from 'ws';\nimport {\n AgentOrchestrator,\n type AgentOrchestratorConnection,\n} from '../orchestrator/agent-orchestrator.js';\nimport type { OutboundMessage } from '../orchestrator/orchestrator-types.js';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport { ApiClient, normalizeBaseUrl } from '../http/api-client.js';\nimport { registerRelaySession } from './relay-service.js';\nimport { createAuthProvider, type AuthProvider } from '../auth/auth-provider.js';\nimport { createUserSession } from '../http/user-sessions.js';\nimport {\n validateControlMessage,\n validateMessageEnvelope,\n type ControlMessageSchema,\n type MessageEnvelopeSchema,\n type ControlMessage,\n type MessageEnvelope,\n} from '../schemas/index.js';\nimport { tryOpenBrowser } from '../utils/browser.js';\n\nconst MAX_QUEUE_SIZE = 500;\n\nexport interface RelayBridgeOptions {\n store?: CredentialsStore;\n logger?: Console;\n backendUrl: string;\n frontendUrl?: string;\n}\n\nexport class RelayBridge extends EventEmitter {\n private readonly orchestrator: AgentOrchestrator;\n private readonly store: CredentialsStore;\n private readonly logger: Console;\n private readonly backendUrl: string;\n private readonly frontendUrl?: string;\n private connectionHandle: AgentOrchestratorConnection | null = null;\n private ws: WebSocket | null = null;\n private stopped = false;\n private pendingOutbound: string[] = [];\n private pingTimer: NodeJS.Timeout | null = null;\n private heartbeatIntervalMs = 30_000;\n private authProviderPromise: Promise<AuthProvider> | null = null;\n private userSessionId: string | null = null;\n private currentAgentSessionId: string | null = null;\n private browserOpened = false;\n\n constructor(orchestrator: AgentOrchestrator, options: RelayBridgeOptions) {\n super();\n this.orchestrator = orchestrator;\n this.store = options.store ?? new CredentialsStore();\n this.logger = options.logger ?? console;\n this.backendUrl = normalizeBaseUrl(options.backendUrl);\n this.frontendUrl = options.frontendUrl;\n }\n\n async start(): Promise<void> {\n if (this.connectionHandle) {\n throw new Error('Relay bridge already started');\n }\n\n this.connectionHandle = this.orchestrator.addClient({\n canSend: () => this.ws?.readyState === WebSocket.OPEN,\n send: (message) => {\n this.handleOutbound(message);\n },\n });\n this.ensureAgentSessionExists();\n\n let backoffMs = 1_000;\n\n while (!this.stopped) {\n try {\n await this.establishConnection();\n backoffMs = 1_000;\n } catch (error) {\n const aborted = isAbortError(error);\n if (this.stopped || aborted) {\n if (aborted) {\n this.stopped = true;\n }\n break;\n }\n this.logger.error(\n `Relay connection failed: ${extractErrorMessage(error)}. Retrying in ${Math.round(backoffMs / 1000)}s.`,\n );\n await delay(backoffMs);\n backoffMs = Math.min(backoffMs * 2, 30_000);\n }\n }\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n this.currentAgentSessionId = null;\n this.browserOpened = false;\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n if (this.connectionHandle) {\n this.connectionHandle.disconnect();\n this.connectionHandle = null;\n }\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1000, 'CLI shutting down');\n }\n this.ws = null;\n }\n\n private async establishConnection(): Promise<void> {\n const authProvider = await this.getAuthProvider();\n const client = new ApiClient({ baseUrl: this.backendUrl });\n\n const accessToken = await authProvider.getAccessToken();\n const userSessionId = await this.ensureUserSession(client, accessToken);\n const registration = await registerRelaySession(client, accessToken, {\n userSessionId,\n clientKind: 'cli',\n });\n this.userSessionId = registration.userSessionId;\n\n const agentSessionId = this.ensureAgentSessionExists();\n\n const url = buildRelayWebsocketUrl(this.backendUrl, registration.relayWsPath);\n\n const ws = new WebSocket(url, {\n headers: {\n authorization: `Bearer ${accessToken}`,\n 'x-relay-token': registration.relayToken,\n },\n });\n\n await waitForOpen(ws);\n\n this.logger.log(\n `Connected to relay (user_session=${registration.userSessionId}, agent_session=${agentSessionId})`,\n );\n\n this.ws = ws;\n this.heartbeatIntervalMs = registration.relayHeartbeatIntervalSec * 1000;\n this.startPingTimer();\n await this.sendPrimarySessionInit(ws);\n if (this.frontendUrl && !this.browserOpened) {\n const dashboardUrl = new URL('dashboard', this.frontendUrl);\n dashboardUrl.searchParams.set('session', agentSessionId);\n tryOpenBrowser(dashboardUrl.toString());\n this.logger.log(`Opened dashboard at ${dashboardUrl.toString()}`);\n this.browserOpened = true;\n }\n this.flushQueue();\n\n await this.handleWebsocketLifecycle(ws);\n }\n\n private async getAuthProvider(): Promise<AuthProvider> {\n if (!this.authProviderPromise) {\n this.authProviderPromise = createAuthProvider({\n store: this.store,\n backendUrl: this.backendUrl,\n frontendUrl: this.frontendUrl,\n logger: this.logger,\n });\n }\n return this.authProviderPromise;\n }\n\n private ensureAgentSessionExists(): string {\n if (!this.currentAgentSessionId) {\n this.currentAgentSessionId = randomUUID();\n }\n this.orchestrator.ensureSessionExists(this.currentAgentSessionId);\n // Mark this as the main coding session\n this.orchestrator.setMainCodingSessionId(this.currentAgentSessionId);\n return this.currentAgentSessionId;\n }\n\n private async ensureUserSession(client: ApiClient, accessToken: string): Promise<string> {\n if (this.userSessionId) {\n return this.userSessionId;\n }\n const descriptor = await createUserSession(client, accessToken, {\n metadata: { source: 'cli' },\n });\n this.userSessionId = descriptor.session_id;\n this.logger.log(`Created user session ${this.userSessionId} for CLI orchestrator`);\n return this.userSessionId;\n }\n\n private async sendPrimarySessionInit(ws: WebSocket): Promise<void> {\n if (!this.userSessionId) {\n throw new Error('Cannot send session_init before user session is available.');\n }\n const agentSessionId = this.ensureAgentSessionExists();\n const initFrame: ControlMessage = {\n type: 'session_init',\n session_id: agentSessionId,\n user_session_id: this.userSessionId,\n session_type: 'CODE',\n parent_session_id: null,\n metadata: { session_type: 'CODE' }, // Include metadata for orchestrator to identify main session\n };\n this.sendFrame(initFrame, ws);\n }\n\n private sendFrame(frame: ControlMessage | MessageEnvelope, socket?: WebSocket | null): void {\n if (this.isMessageEnvelope(frame)) {\n if (!validateMessageEnvelope(frame)) {\n this.logger.error('[RelayBridge] Message envelope validation failed before sending', {\n frame: JSON.stringify(frame),\n errors: validateMessageEnvelope.errors,\n });\n return;\n }\n }\n\n const serialized = JSON.stringify(frame);\n const target = socket ?? this.ws;\n if (target && target.readyState === WebSocket.OPEN) {\n try {\n target.send(serialized);\n return;\n } catch (error) {\n this.logger.error(`Failed to send relay frame: ${extractErrorMessage(error)}`);\n if (target === this.ws) {\n this.closeCurrentSocket();\n }\n }\n }\n this.enqueue(serialized);\n }\n\n private async handleWebsocketLifecycle(ws: WebSocket): Promise<void> {\n await new Promise<void>((resolve) => {\n const onMessage = (data: WebSocket.RawData) => {\n this.handleInbound(data);\n };\n\n const onClose = (code: number, reason: Buffer) => {\n this.logger.warn(\n `Relay websocket closed (code ${code}${reason.length ? `, reason: ${reason.toString()}` : ''})`,\n );\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (!this.stopped) {\n this.logger.error(`Relay websocket error: ${error.message}`);\n }\n };\n\n const cleanup = () => {\n ws.removeListener('message', onMessage);\n ws.removeListener('close', onClose);\n ws.removeListener('error', onError);\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n if (this.ws === ws) {\n this.ws = null;\n }\n };\n\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n\n if (this.stopped) {\n cleanup();\n resolve();\n }\n });\n }\n\n private handleOutbound(message: OutboundMessage): void {\n const frame = this.toRelayFrame(message);\n if (!frame) {\n return;\n }\n this.sendFrame(frame);\n }\n\n private handleInbound(data: WebSocket.RawData): void {\n let parsed: unknown;\n try {\n const text = typeof data === 'string' ? data : data.toString('utf8');\n parsed = JSON.parse(text);\n } catch (error) {\n this.logger.error(`Received invalid JSON from relay: ${extractErrorMessage(error)}`);\n return;\n }\n\n if (this.tryHandleControlMessage(parsed)) {\n return;\n }\n\n if (this.tryHandleMessageEnvelope(parsed)) {\n return;\n }\n\n this.logger.error('Received invalid relay message payload.', { payload: parsed });\n }\n\n private toRelayFrame(message: OutboundMessage): ControlMessage | MessageEnvelope | null {\n switch (message.type) {\n case 'session_init': {\n if (!this.userSessionId) {\n this.logger.warn('Dropping session_init frame: user session is not initialised yet.');\n return null;\n }\n const frame: ControlMessage = {\n type: 'session_init',\n session_id: message.sessionId,\n user_session_id: this.userSessionId,\n session_type: 'CODE',\n parent_session_id: message.parentSessionId ?? null,\n };\n if (message.metadata) {\n frame.metadata = message.metadata;\n }\n return frame;\n }\n case 'user_text':\n return this.buildUserTextEnvelope(message);\n case 'assistant_text':\n return this.buildTextEnvelope(message);\n case 'tool_call':\n return this.buildToolCallEnvelope(message);\n case 'tool_result':\n return this.buildToolResultEnvelope(message);\n case 'agent_complete':\n return this.buildAgentCompleteEnvelope(message);\n case 'agent_progress':\n return this.buildProgressEnvelope(message);\n default:\n return null;\n }\n }\n\n private tryHandleControlMessage(payload: unknown): boolean {\n if (!validateControlMessage(payload)) {\n return false;\n }\n const control = payload as ControlMessage;\n const type = control.type;\n switch (type) {\n case 'session_bootstrap':\n this.handleSessionBootstrap(control as ControlMessageSchema.SessionBootstrap);\n break;\n case 'session_init_ack':\n this.handleSessionInitAck(control as ControlMessageSchema.SessionInitAck);\n break;\n case 'session_announce':\n this.handleSessionAnnounce(control as ControlMessageSchema.SessionAnnounce);\n break;\n case 'session_closed':\n this.logger.info(\n `Session closed: ${(control as ControlMessageSchema.SessionClosed).session_id} -> status ${(control as ControlMessageSchema.SessionClosed).status}`,\n );\n break;\n case 'heartbeat':\n if ((control as ControlMessageSchema.Heartbeat).mode === 'ping') {\n const response: ControlMessage = {\n type: 'heartbeat',\n mode: 'pong',\n sent_at: new Date().toISOString(),\n };\n this.sendFrame(response);\n }\n break;\n default:\n this.logger.debug(`Ignoring control message ${type ?? 'unknown'}`);\n }\n return true;\n }\n\n private tryHandleMessageEnvelope(payload: unknown): boolean {\n if (!validateMessageEnvelope(payload)) {\n return false;\n }\n const envelope = payload as MessageEnvelope;\n this.handleMessageEnvelope(envelope);\n return true;\n }\n\n private handleSessionBootstrap(control: ControlMessageSchema.SessionBootstrap): void {\n const userSessionId = control.root.session_id;\n if (!this.userSessionId) {\n this.userSessionId = userSessionId;\n }\n if (this.userSessionId !== userSessionId) {\n this.logger.warn(\n `Bootstrap user session mismatch (expected ${this.userSessionId}, got ${userSessionId})`,\n );\n }\n\n // Track voice sessions from bootstrap FIRST before ensuring they exist\n for (const agent of control.agent_sessions ?? []) {\n if (agent.session_type === 'VOICE') {\n this.orchestrator.voiceSessionIds.add(agent.session_id);\n console.log('[RelayBridge] Tracking voice session from bootstrap:', {\n sessionId: agent.session_id,\n sessionType: agent.session_type,\n parentSessionId: agent.parent_session_id,\n });\n }\n }\n\n // Then ensure sessions exist\n for (const agent of control.agent_sessions ?? []) {\n this.orchestrator.ensureSessionExists(agent.session_id);\n }\n }\n\n private handleSessionInitAck(control: ControlMessageSchema.SessionInitAck): void {\n const sessionId = control.session_id;\n // Only track the main agent session (not worker child sessions)\n // Workers have a parent_session_id, main sessions don't\n const isMainSession = !control.parent_session_id;\n\n if (isMainSession) {\n if (!this.currentAgentSessionId) {\n this.currentAgentSessionId = sessionId;\n } else if (this.currentAgentSessionId !== sessionId) {\n this.logger.warn(\n `Session init ack for unexpected main session: ${sessionId} (current=${this.currentAgentSessionId})`,\n );\n }\n } else {\n // This is a worker session, log it but don't update currentAgentSessionId\n this.logger.debug(\n `Worker session init ack: ${sessionId} (parent=${control.parent_session_id})`,\n );\n }\n }\n\n private handleSessionAnnounce(control: ControlMessageSchema.SessionAnnounce): void {\n if (control.session.kind === 'agent_session') {\n // Track voice sessions from announcements FIRST\n if (control.session.session_type === 'VOICE') {\n this.orchestrator.voiceSessionIds.add(control.session.session_id);\n console.log('[RelayBridge] Tracking voice session from announce:', {\n sessionId: control.session.session_id,\n sessionType: control.session.session_type,\n });\n }\n\n this.orchestrator.ensureSessionExists(control.session.session_id);\n }\n }\n\n private handleMessageEnvelope(envelope: MessageEnvelope): void {\n const content = envelope.payload.content;\n const isUserMessage = envelope.sender.kind === 'user';\n const isAgentUserMessage =\n envelope.sender.kind === 'agent_session' && envelope.metadata?.role === 'user';\n\n // Filter out voice transcript messages - they're just for logging, not for orchestrator\n const isVoiceTranscript =\n envelope.payload.metadata?.subtype === 'user_voice_transcript' ||\n envelope.payload.metadata?.subtype === 'agent_voice_transcript';\n\n // Accept messages from users OR from agent sessions acting as users (like voice agent)\n // BUT exclude voice transcripts\n if (\n this.isTextContent(content) &&\n (isUserMessage || isAgentUserMessage) &&\n !isVoiceTranscript\n ) {\n // Check if this is a message TO a voice session\n const isToVoiceSession = this.orchestrator.voiceSessionIds.has(envelope.session_id);\n\n if (isToVoiceSession) {\n this.logger.info(\n `Filtering out message to voice session ${envelope.session_id} from ${envelope.sender.kind} (id: ${envelope.sender.id})`,\n );\n return;\n }\n\n this.logger.info(\n `Processing message from ${envelope.sender.kind} (id: ${envelope.sender.id}, role: ${envelope.metadata?.role}) to session ${envelope.session_id}`,\n );\n\n // Include sender information so orchestrator knows who sent the message\n this.connectionHandle?.dispatch({\n type: 'chat',\n sessionId: envelope.session_id,\n text: content.text,\n senderId: envelope.sender.id,\n senderKind: envelope.sender.kind,\n });\n return;\n }\n const label = (content as { type?: string }).type ?? 'unknown';\n const subtype = envelope.payload.metadata?.subtype;\n this.logger.debug(\n `Ignoring inbound envelope from ${envelope.sender.kind} with content type ${label}, role ${envelope.metadata?.role}${subtype ? `, subtype: ${subtype}` : ''}`,\n );\n }\n\n private isTextContent(\n content: MessageEnvelopeSchema.Content,\n ): content is MessageEnvelopeSchema.TextContent {\n return typeof (content as MessageEnvelopeSchema.TextContent).text === 'string';\n }\n\n private buildUserTextEnvelope(\n message: Extract<OutboundMessage, { type: 'user_text' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.TextContent = {\n type: 'text',\n text: message.text,\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n // Sender is the worker if workerId is present, otherwise the session itself\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for user messages\n envelope.metadata = {\n ...envelope.metadata,\n role: 'user',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private buildTextEnvelope(\n message: Extract<OutboundMessage, { type: 'assistant_text' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.TextContent = {\n type: 'text',\n text: message.text,\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n // Sender is the worker if workerId is present, otherwise the session itself\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for assistant messages\n envelope.metadata = {\n ...envelope.metadata,\n role: 'assistant',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private buildToolCallEnvelope(\n message: Extract<OutboundMessage, { type: 'tool_call' }>,\n ): MessageEnvelope {\n const args: Record<string, unknown> = this.normalizeToolArguments(message.input);\n const content: MessageEnvelopeSchema.ToolCallContent = {\n type: 'tool_call',\n name: message.toolName,\n tool_use_id: message.toolUseId,\n arguments: args,\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for assistant tool calls\n envelope.metadata = {\n ...envelope.metadata,\n role: 'assistant',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private normalizeToolArguments(input: unknown): Record<string, unknown> {\n if (input && typeof input === 'object' && !Array.isArray(input)) {\n return input as Record<string, unknown>;\n }\n return { value: input };\n }\n\n private buildToolResultEnvelope(\n message: Extract<OutboundMessage, { type: 'tool_result' }>,\n ): MessageEnvelope {\n const output: Record<string, unknown> =\n typeof message.content === 'object' && message.content !== null\n ? (message.content as Record<string, unknown>)\n : { value: message.content };\n const content: MessageEnvelopeSchema.ToolResultContent = {\n type: 'tool_result',\n tool_use_id: message.toolUseId,\n output,\n is_error: Boolean(message.isError),\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for assistant tool results\n envelope.metadata = {\n ...envelope.metadata,\n role: 'assistant',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private buildAgentCompleteEnvelope(\n message: Extract<OutboundMessage, { type: 'agent_complete' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.AgentCompleteContent = {\n type: 'agent_complete',\n success: message.success,\n duration_ms: message.durationMs ?? null,\n cost_usd: message.costUsd ?? null,\n message: message.message ?? null,\n };\n if (message.metadata) {\n content.metadata = message.metadata;\n }\n\n const metadataAgent =\n typeof message.metadata?.agent_session_id === 'string'\n ? (message.metadata.agent_session_id as string)\n : undefined;\n const senderSessionId = metadataAgent ?? this.currentAgentSessionId ?? message.sessionId;\n return this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n messageId: message.messageId,\n });\n }\n\n private buildProgressEnvelope(\n message: Extract<OutboundMessage, { type: 'agent_progress' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.AgentProgressContent = {\n type: 'agent_progress',\n status: message.status,\n };\n if (message.detail) {\n content.detail = message.detail;\n }\n if (message.metadata) {\n content.metadata = message.metadata;\n }\n\n const metadataAgent =\n typeof message.metadata?.agent_session_id === 'string'\n ? (message.metadata.agent_session_id as string)\n : undefined;\n const sessionId =\n message.sessionId ?? this.currentAgentSessionId ?? this.ensureAgentSessionExists();\n const senderSessionId = metadataAgent ?? this.currentAgentSessionId ?? sessionId;\n\n return this.buildEnvelope({\n sessionId,\n senderSessionId,\n content,\n messageId: message.messageId,\n });\n }\n\n private buildEnvelope(options: {\n sessionId: string;\n senderSessionId?: string;\n content: MessageEnvelopeSchema.Content;\n payloadMetadata?: Record<string, unknown>;\n messageId?: string;\n }): MessageEnvelope {\n const payload: MessageEnvelopeSchema.MessagePayload = {\n version: 0,\n content: options.content,\n };\n if (options.payloadMetadata && Object.keys(options.payloadMetadata).length > 0) {\n payload.metadata = options.payloadMetadata;\n }\n\n const sender: MessageEnvelopeSchema.SenderRef = {\n kind: 'agent_session',\n id: options.senderSessionId ?? options.sessionId,\n };\n\n const envelope: MessageEnvelope = {\n message_id: options.messageId ?? randomUUID(),\n session_id: options.sessionId,\n sender,\n payload,\n created_at: new Date().toISOString(),\n };\n\n return envelope;\n }\n\n private isMessageEnvelope(frame: ControlMessage | MessageEnvelope): frame is MessageEnvelope {\n return (frame as MessageEnvelope).payload !== undefined;\n }\n\n private enqueue(serialized: string): void {\n if (this.pendingOutbound.length >= MAX_QUEUE_SIZE) {\n this.pendingOutbound.shift();\n }\n this.pendingOutbound.push(serialized);\n }\n\n private flushQueue(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n while (this.pendingOutbound.length > 0) {\n const payload = this.pendingOutbound.shift();\n if (!payload) {\n continue;\n }\n try {\n this.ws.send(payload);\n } catch (error) {\n this.logger.error(`Failed to flush relay queue: ${extractErrorMessage(error)}`);\n this.pendingOutbound.unshift(payload);\n this.closeCurrentSocket();\n break;\n }\n }\n }\n\n private startPingTimer(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n }\n const interval = Math.max(this.heartbeatIntervalMs, 5_000);\n this.pingTimer = setInterval(() => {\n const socket = this.ws;\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n const frame: ControlMessage = {\n type: 'heartbeat',\n mode: 'ping',\n sent_at: new Date().toISOString(),\n };\n this.sendFrame(frame, socket);\n }, interval);\n }\n\n private closeCurrentSocket(): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1012, 'Reconnecting');\n }\n }\n}\n\nfunction buildRelayWebsocketUrl(baseUrl: string, path: string): string {\n const url = new URL(baseUrl);\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n url.search = '';\n url.hash = '';\n if (path.startsWith('/')) {\n url.pathname = path;\n } else {\n const basePath = url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`;\n url.pathname = `${basePath}${path}`;\n }\n return url.toString();\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction isAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const name = error.name?.toLowerCase();\n if (name === 'aborterror') {\n return true;\n }\n const message = error.message ? error.message.toLowerCase() : '';\n return message.includes('aborted with ctrl+c');\n}\n\nfunction waitForOpen(ws: WebSocket): Promise<void> {\n return new Promise((resolve, reject) => {\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n const cleanup = () => {\n ws.removeListener('open', onOpen);\n ws.removeListener('error', onError);\n };\n\n ws.once('open', onOpen);\n ws.once('error', onError);\n });\n}\n", "export class ApiError extends Error {\n readonly status: number;\n readonly details: unknown;\n\n constructor(status: number, message: string, details?: unknown) {\n super(message);\n this.status = status;\n this.details = details;\n }\n}\n\nexport interface RequestOptions {\n headers?: Record<string, string>;\n accessToken?: string;\n apiKey?: string;\n signal?: AbortSignal;\n}\n\nexport interface ApiClientOptions {\n baseUrl: string;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n\n constructor(options: ApiClientOptions) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl);\n }\n\n async getJson<TResponse>(path: string, options?: RequestOptions): Promise<TResponse> {\n const url = resolveUrl(this.baseUrl, path);\n const headers = this.buildHeaders(options);\n\n const response = await fetch(url, {\n method: 'GET',\n headers,\n signal: options?.signal,\n });\n\n return await this.handleResponse<TResponse>(response);\n }\n\n async postJson<TRequest, TResponse>(\n path: string,\n body: TRequest,\n options?: RequestOptions,\n ): Promise<TResponse> {\n const url = resolveUrl(this.baseUrl, path);\n const headers = this.buildHeaders(options, { includeJson: true });\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body ?? {}),\n signal: options?.signal,\n });\n\n return await this.handleResponse<TResponse>(response);\n }\n\n private buildHeaders(options?: RequestOptions, extras?: { includeJson?: boolean }): Headers {\n const headers = new Headers();\n if (extras?.includeJson) {\n headers.set('content-type', 'application/json');\n }\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n headers.set(key, value);\n }\n }\n if (options?.accessToken) {\n headers.set('authorization', `Bearer ${options.accessToken}`);\n } else if (options?.apiKey) {\n headers.set('authorization', `Bearer ${options.apiKey}`);\n }\n return headers;\n }\n\n private async handleResponse<TResponse>(response: Response): Promise<TResponse> {\n const contentType = response.headers.get('content-type');\n const isJson = contentType?.includes('application/json');\n\n let payload: unknown = undefined;\n if (isJson) {\n try {\n payload = await response.json();\n } catch (error) {\n if (response.ok) {\n throw new ApiError(\n response.status,\n `Failed to parse JSON response: ${extractErrorMessage(error)}`,\n );\n }\n }\n } else if (response.ok) {\n payload = await response.text();\n }\n\n if (!response.ok) {\n const detail = extractDetail(payload);\n throw new ApiError(response.status, detail ?? `HTTP ${response.status}`, payload);\n }\n\n return payload as TResponse;\n }\n}\n\nexport function normalizeBaseUrl(raw: string): string {\n if (!raw) {\n throw new Error('Backend URL cannot be empty.');\n }\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n\nexport function resolveUrl(base: string, path: string): string {\n const baseUrl = new URL(base);\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n const resolved = new URL(path, baseUrl);\n return resolved.toString();\n}\n\nfunction extractDetail(payload: unknown): string | null {\n if (!payload) {\n return null;\n }\n if (typeof payload === 'string') {\n return payload;\n }\n if (typeof payload === 'object' && payload !== null) {\n const record = payload as Record<string, unknown>;\n const detail = record.detail;\n if (typeof detail === 'string') {\n return detail;\n }\n const message = record.message;\n if (typeof message === 'string') {\n return message;\n }\n }\n return null;\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n", "import { ApiClient } from '../http/api-client.js';\n\nexport type RelayClientKind = 'cli' | 'web' | 'mobile' | 'voice';\n\ninterface RelayRegisterRequestWire {\n user_session_id: string;\n client_kind?: RelayClientKind | null;\n}\n\ninterface RelayRegisterResponseWire {\n user_session_id: string;\n relay_token: string;\n relay_token_expires_in: number;\n relay_ws_path: string;\n relay_heartbeat_interval_sec: number;\n}\n\ninterface RelayRefreshRequestWire {\n relay_token: string;\n}\n\ninterface RelayRefreshResponseWire {\n relay_token: string;\n relay_token_expires_in: number;\n}\n\nexport interface RelayRegistration {\n userSessionId: string;\n relayToken: string;\n relayTokenExpiresIn: number;\n relayWsPath: string;\n relayHeartbeatIntervalSec: number;\n}\n\nexport interface RelayTokenRefresh {\n relayToken: string;\n relayTokenExpiresIn: number;\n}\n\nexport interface RegisterRelayOptions {\n userSessionId: string;\n clientKind?: RelayClientKind;\n}\n\nexport async function registerRelaySession(\n client: ApiClient,\n accessToken: string,\n options: RegisterRelayOptions,\n): Promise<RelayRegistration> {\n const body: RelayRegisterRequestWire = {\n user_session_id: options.userSessionId,\n client_kind: options.clientKind ?? 'cli',\n };\n\n const response = await client.postJson<RelayRegisterRequestWire, RelayRegisterResponseWire>(\n '/api/v1/relay/register',\n body,\n { accessToken },\n );\n\n return {\n userSessionId: response.user_session_id,\n relayToken: response.relay_token,\n relayTokenExpiresIn: response.relay_token_expires_in,\n relayWsPath: response.relay_ws_path,\n relayHeartbeatIntervalSec: response.relay_heartbeat_interval_sec,\n };\n}\n\nexport async function refreshRelayToken(\n client: ApiClient,\n accessToken: string,\n relayToken: string,\n): Promise<RelayTokenRefresh> {\n const response = await client.postJson<RelayRefreshRequestWire, RelayRefreshResponseWire>(\n '/api/v1/relay/refresh',\n { relay_token: relayToken },\n { accessToken },\n );\n\n return {\n relayToken: response.relay_token,\n relayTokenExpiresIn: response.relay_token_expires_in,\n };\n}\n", "import { createClient, type SupabaseClient } from '@supabase/supabase-js';\n\nimport type { SupabaseAuthConfig } from './supabase-config.js';\n\nexport function buildSupabaseClient(config: SupabaseAuthConfig): SupabaseClient {\n return createClient(config.url, config.anonKey, {\n auth: {\n persistSession: false,\n detectSessionInUrl: false,\n },\n });\n}\n", "import { ApiClient } from '../http/api-client.js';\n\nexport interface SupabaseAuthConfig {\n url: string;\n anonKey: string;\n}\n\ninterface AuthConfigResponseWire {\n supabase_url: string;\n supabase_anon_key: string;\n}\n\nconst CACHE = new Map<string, SupabaseAuthConfig>();\n\nexport async function getSupabaseAuthConfig(baseUrl: string): Promise<SupabaseAuthConfig> {\n const normalized = normalizeBaseUrl(baseUrl);\n const cached = CACHE.get(normalized);\n if (cached) {\n return cached;\n }\n\n const client = new ApiClient({ baseUrl: normalized });\n const response = await client.getJson<AuthConfigResponseWire>('/api/v1/auth/config');\n const config: SupabaseAuthConfig = {\n url: response.supabase_url,\n anonKey: response.supabase_anon_key,\n };\n CACHE.set(normalized, config);\n return config;\n}\n\nfunction normalizeBaseUrl(raw: string): string {\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n", "import type { Session } from '@supabase/supabase-js';\n\nimport { CredentialsStore, type StoredCredentials } from './credentials-store.js';\nimport { buildSupabaseClient } from './supabase-client.js';\nimport { getSupabaseAuthConfig } from './supabase-config.js';\n\nconst EXPIRY_BUFFER_MS = 60_000; // refresh tokens one minute before expiry\n\nexport interface AuthContext {\n credentials: StoredCredentials;\n accessToken: string;\n}\n\nexport async function ensureAuthContext(\n store: CredentialsStore,\n backendUrl: string,\n): Promise<AuthContext> {\n const credentials = await store.load();\n if (!credentials) {\n throw new Error('No credentials found. Run `omnara auth login` first.');\n }\n\n if (!credentials.refreshToken) {\n throw new Error('Refresh token unavailable. Please run `omnara auth login`.');\n }\n\n if (!credentials.accessToken) {\n return await refreshWithStoredToken(store, credentials, backendUrl, 'No access token stored.');\n }\n\n if (!isExpiring(credentials.accessTokenExpiresAt, EXPIRY_BUFFER_MS)) {\n return { credentials, accessToken: credentials.accessToken };\n }\n\n return await refreshWithStoredToken(store, credentials, backendUrl, 'Access token expired.');\n}\n\nasync function refreshWithStoredToken(\n store: CredentialsStore,\n credentials: StoredCredentials,\n backendUrl: string,\n reason: string,\n): Promise<AuthContext> {\n const refreshToken = credentials.refreshToken;\n if (!refreshToken) {\n throw new Error(`${reason} Refresh token unavailable. Please run \\`omnara auth login\\`.`);\n }\n\n if (credentials.refreshTokenExpiresAt && isExpiring(credentials.refreshTokenExpiresAt, 0)) {\n throw new Error('Refresh token expired. Please run `omnara auth login`.');\n }\n\n const supabaseConfig = await getSupabaseAuthConfig(backendUrl);\n const supabase = buildSupabaseClient(supabaseConfig);\n const { data, error } = await supabase.auth.refreshSession({ refresh_token: refreshToken });\n if (error || !data?.session) {\n throw new Error(\n `${reason} Failed to refresh Supabase session: ${error?.message ?? 'unknown error'}.`,\n );\n }\n\n const updated = applySession(credentials, data.session);\n\n await store.save(updated);\n if (!updated.accessToken) {\n throw new Error('Supabase refresh completed without an access token.');\n }\n return { credentials: updated, accessToken: updated.accessToken };\n}\n\nfunction isExpiring(expiresAtIso: string | undefined, bufferMs: number): boolean {\n if (!expiresAtIso) {\n return true;\n }\n const timestamp = Date.parse(expiresAtIso);\n if (Number.isNaN(timestamp)) {\n return true;\n }\n return timestamp - bufferMs <= Date.now();\n}\n\nfunction applySession(credentials: StoredCredentials, session: Session): StoredCredentials {\n const expiresAt = deriveAccessExpiry(session);\n\n return {\n ...credentials,\n accessToken: session.access_token,\n accessTokenExpiresAt: expiresAt,\n refreshToken: session.refresh_token ?? credentials.refreshToken,\n refreshTokenExpiresAt: credentials.refreshTokenExpiresAt,\n };\n}\n\nfunction deriveAccessExpiry(session: Session): string | undefined {\n if (session.expires_at) {\n return new Date(session.expires_at * 1000).toISOString();\n }\n if (session.expires_in) {\n return new Date(Date.now() + session.expires_in * 1000).toISOString();\n }\n return undefined;\n}\n", "import readline from 'readline/promises';\nimport { stdin as input, stdout as output } from 'process';\n\nexport async function prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input, output });\n try {\n const answer = await rl.question(question);\n return answer.trim();\n } finally {\n rl.close();\n }\n}\n", "import { ApiClient } from '../http/api-client.js';\n\ninterface CreateSessionRequestWire {\n frontend_url?: string | null;\n loopback_redirect_uri?: string | null;\n loopback_state?: string | null;\n pkce_challenge?: string | null;\n pkce_challenge_method?: string | null;\n}\n\ninterface CreateSessionResponseWire {\n session_id: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n poll_interval: number;\n}\n\ninterface ExchangeRequestWire {\n session_id: string;\n code: string;\n code_verifier?: string | null;\n}\n\ninterface ExchangeResponseWire {\n access_token: string;\n access_token_expires_in: number;\n refresh_token: string;\n refresh_token_expires_in: number;\n relay_ws_path: string;\n relay_heartbeat_interval_sec: number;\n}\n\nexport interface CliAuthSession {\n sessionId: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n pollInterval: number;\n}\n\nexport interface CreateCliAuthSessionOptions {\n frontendUrl?: string;\n loopbackRedirectUri?: string;\n loopbackState?: string;\n pkceChallenge?: string;\n pkceChallengeMethod?: string;\n}\n\nexport interface ExchangeCliCodeResult {\n accessToken: string;\n accessTokenExpiresIn: number;\n refreshToken: string;\n refreshTokenExpiresIn: number;\n relayWsPath: string;\n relayHeartbeatIntervalSec: number;\n}\n\nexport async function createCliAuthSession(\n client: ApiClient,\n options: CreateCliAuthSessionOptions = {},\n): Promise<CliAuthSession> {\n const body: CreateSessionRequestWire = {};\n if (options.frontendUrl) {\n body.frontend_url = options.frontendUrl;\n }\n if (options.loopbackRedirectUri) {\n body.loopback_redirect_uri = options.loopbackRedirectUri;\n }\n if (options.loopbackState) {\n body.loopback_state = options.loopbackState;\n }\n if (options.pkceChallenge) {\n body.pkce_challenge = options.pkceChallenge;\n body.pkce_challenge_method = options.pkceChallengeMethod ?? 'S256';\n }\n const wire = await client.postJson<CreateSessionRequestWire, CreateSessionResponseWire>(\n '/api/v1/cli-auth/session',\n body,\n );\n return {\n sessionId: wire.session_id,\n verificationUri: wire.verification_uri,\n verificationUriComplete: wire.verification_uri_complete,\n expiresIn: wire.expires_in,\n pollInterval: wire.poll_interval,\n };\n}\n\nexport async function exchangeCliCode(\n client: ApiClient,\n sessionId: string,\n code: string,\n options: { codeVerifier?: string } = {},\n): Promise<ExchangeCliCodeResult> {\n const requestBody: ExchangeRequestWire = {\n session_id: sessionId,\n code,\n };\n if (options.codeVerifier) {\n requestBody.code_verifier = options.codeVerifier;\n }\n\n const wire = await client.postJson<ExchangeRequestWire, ExchangeResponseWire>(\n '/api/v1/cli-auth/exchange',\n requestBody,\n );\n return {\n accessToken: wire.access_token,\n accessTokenExpiresIn: wire.access_token_expires_in,\n refreshToken: wire.refresh_token,\n refreshTokenExpiresIn: wire.refresh_token_expires_in,\n relayWsPath: wire.relay_ws_path,\n relayHeartbeatIntervalSec: wire.relay_heartbeat_interval_sec,\n };\n}\n", "import { createHash, randomBytes } from 'crypto';\n\nexport interface PkcePair {\n verifier: string;\n challenge: string;\n method: 'S256';\n}\n\nexport function generatePkcePair(): PkcePair {\n const verifier = base64UrlEncode(randomBytes(32));\n const challenge = base64UrlEncode(createHash('sha256').update(verifier).digest());\n return { verifier, challenge, method: 'S256' };\n}\n\nfunction base64UrlEncode(input: Buffer | Uint8Array | string): string {\n const buffer =\n typeof input === 'string'\n ? Buffer.from(input, 'utf8')\n : Buffer.from(input as Buffer | Uint8Array);\n return buffer.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n", "import http from 'http';\nimport type { AddressInfo } from 'net';\nimport { randomBytes } from 'crypto';\n\nexport interface LoopbackCallback {\n code: string;\n sessionId: string | null;\n state: string | null;\n}\n\nconst CALLBACK_PATH = '/callback';\nconst LISTEN_HOST = '127.0.0.1';\n\nexport class LoopbackListener {\n static async create(): Promise<LoopbackListener | null> {\n const listener = new LoopbackListener(generateState());\n try {\n await listener.start();\n return listener;\n } catch {\n await listener.stop().catch(() => undefined);\n return null;\n }\n }\n\n readonly state: string;\n redirectUri: string;\n\n private readonly server: http.Server;\n private resolveCallback: ((value: LoopbackCallback) => void) | null = null;\n private rejectCallback: ((reason?: unknown) => void) | null = null;\n private pending: Promise<LoopbackCallback> | null = null;\n\n private constructor(state: string) {\n this.state = state;\n this.redirectUri = '';\n this.server = http.createServer((request, response) => {\n void this.handleRequest(request, response);\n });\n }\n\n async waitForCallback(): Promise<LoopbackCallback> {\n if (this.pending) {\n return this.pending;\n }\n this.pending = new Promise<LoopbackCallback>((resolve, reject) => {\n this.resolveCallback = resolve;\n this.rejectCallback = reject;\n });\n return this.pending;\n }\n\n async stop(): Promise<void> {\n if (!this.server.listening) {\n return;\n }\n await new Promise<void>((resolve) => {\n this.server.close(() => resolve());\n });\n }\n\n private async start(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.server.once('error', reject);\n this.server.listen(0, LISTEN_HOST, () => {\n this.server.removeListener('error', reject);\n resolve();\n });\n });\n\n const address = this.server.address();\n if (!address || typeof address === 'string') {\n throw new Error('Loopback listener failed to bind');\n }\n const { port } = address as AddressInfo;\n this.redirectUri = `http://${LISTEN_HOST}:${port}${CALLBACK_PATH}`;\n }\n\n private async handleRequest(\n request: http.IncomingMessage,\n response: http.ServerResponse,\n ): Promise<void> {\n if (request.method !== 'GET' || !request.url) {\n this.respond(response, 405, 'Method Not Allowed');\n return;\n }\n\n const url = new URL(request.url, `http://${request.headers.host ?? LISTEN_HOST}`);\n if (url.pathname !== CALLBACK_PATH) {\n this.respond(response, 404, 'Not Found');\n return;\n }\n\n const code = url.searchParams.get('code');\n const sessionId = url.searchParams.get('session');\n const state = url.searchParams.get('state');\n\n if (!code) {\n this.respond(\n response,\n 400,\n buildMessageHtml('Missing authorization code. Return to your CLI and try again.'),\n );\n return;\n }\n\n this.respond(response, 200, buildSuccessHtml());\n\n if (this.resolveCallback) {\n this.resolveCallback({ code, sessionId, state });\n this.resolveCallback = null;\n this.rejectCallback = null;\n }\n\n void this.stop();\n }\n\n private respond(response: http.ServerResponse, status: number, body: string): void {\n response.writeHead(status, {\n 'content-type': 'text/html; charset=utf-8',\n 'cache-control': 'no-store',\n });\n response.end(body);\n }\n}\n\nfunction buildSuccessHtml(): string {\n const redirectTarget = 'https://www.omnara.com/dashboard';\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <meta http-equiv=\"refresh\" content=\"3;url=${redirectTarget}\" />\n <title>Omnara CLI Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #090909; color: #f4f4f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }\n .card { max-width: 420px; padding: 2.5rem; background: rgba(32, 32, 36, 0.85); border-radius: 14px; box-shadow: 0 20px 40px rgba(0,0,0,0.35); text-align: center; }\n h1 { font-size: 1.5rem; margin-bottom: 0.75rem; }\n p { margin: 0 0 0.75rem; line-height: 1.5; }\n .note { font-size: 0.85rem; color: rgba(244,244,245,0.7); }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <h1>Redirecting back to the CLI\u2026</h1>\n <p>Your authentication details were sent to the Omnara CLI. Return to your terminal to continue.</p>\n <p class=\"note\">If this page doesn't close automatically, you can manually open the Omnara dashboard.</p>\n </div>\n </body>\n</html>`;\n}\n\nfunction generateState(): string {\n return base64UrlEncode(randomBytes(32));\n}\n\nfunction base64UrlEncode(input: Buffer | Uint8Array | string): string {\n const buffer =\n typeof input === 'string'\n ? Buffer.from(input, 'utf8')\n : Buffer.from(input as Buffer | Uint8Array);\n return buffer.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\nfunction buildMessageHtml(message: string): string {\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <title>Omnara CLI Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #090909; color: #f4f4f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }\n .card { max-width: 420px; padding: 2.5rem; background: rgba(32, 32, 36, 0.85); border-radius: 14px; box-shadow: 0 20px 40px rgba(0,0,0,0.35); text-align: center; }\n h1 { font-size: 1.4rem; margin-bottom: 0.75rem; }\n p { margin: 0; line-height: 1.6; }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <h1>Omnara CLI Login</h1>\n <p>${message}</p>\n </div>\n </body>\n</html>`;\n}\n", "import { spawn } from 'child_process';\n\nexport function tryOpenBrowser(url: string): void {\n const command =\n process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';\n\n const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];\n\n try {\n const child = spawn(command, args, { stdio: 'ignore', detached: true });\n child.unref();\n } catch {\n // Ignore failures; user can open manually.\n }\n}\n", "import { ApiClient, ApiError, normalizeBaseUrl } from '../http/api-client.js';\nimport { CredentialsStore, type StoredCredentials } from './credentials-store.js';\nimport { prompt } from '../utils/prompt.js';\nimport {\n createCliAuthSession,\n exchangeCliCode,\n type CliAuthSession,\n type CreateCliAuthSessionOptions,\n type ExchangeCliCodeResult,\n} from './cli-auth-service.js';\nimport { generatePkcePair } from './pkce.js';\nimport { LoopbackListener } from './loopback-listener.js';\nimport { tryOpenBrowser } from '../utils/browser.js';\n\ninterface LoginOptions {\n backendUrlOption?: string;\n frontendUrlOption?: string;\n store: CredentialsStore;\n}\n\nexport async function performVerificationLogin({\n backendUrlOption,\n frontendUrlOption,\n store,\n}: LoginOptions): Promise<StoredCredentials> {\n const backendUrl = resolveBackendUrl(backendUrlOption);\n const frontendUrl = resolveFrontendUrl(frontendUrlOption);\n const client = new ApiClient({ baseUrl: backendUrl });\n\n console.log('\\nAuthenticating CLI\u2026');\n const loopback = await LoopbackListener.create();\n const pkce = loopback ? generatePkcePair() : null;\n\n const sessionOptions: CreateCliAuthSessionOptions = {\n frontendUrl,\n };\n\n if (loopback && pkce) {\n sessionOptions.loopbackRedirectUri = loopback.redirectUri;\n sessionOptions.loopbackState = loopback.state;\n sessionOptions.pkceChallenge = pkce.challenge;\n sessionOptions.pkceChallengeMethod = pkce.method;\n }\n\n const session = await createCliAuthSession(client, sessionOptions);\n printSessionInstructions(session);\n tryOpenBrowser(session.verificationUriComplete);\n\n let completed = false;\n let successLogged = false;\n let latestCredentials: StoredCredentials | null = null;\n\n const completeLogin = async (code: string, codeVerifier?: string): Promise<void> => {\n if (completed) {\n return;\n }\n const exchange = await exchangeCliCode(\n client,\n session.sessionId,\n code,\n codeVerifier ? { codeVerifier } : {},\n );\n const updated = mergeCredentialsAfterExchange({\n exchange,\n });\n await store.save(updated);\n latestCredentials = updated;\n if (!successLogged) {\n console.log('\\nLogin successful. Credentials saved.');\n successLogged = true;\n }\n completed = true;\n };\n\n const loopbackTask =\n loopback && pkce\n ? waitForLoopback(loopback, session.sessionId, async (code) => {\n await completeLogin(code, pkce.verifier);\n if (typeof process.stdin.emit === 'function') {\n process.stdin.emit('data', '\\n');\n }\n })\n : null;\n\n if (!loopbackTask && !completed) {\n console.log('\\nWaiting for approval in the browser\u2026');\n }\n\n while (!completed) {\n const input = await prompt(\"\\nFallback code if automatic login doesn't complete: \");\n const cleaned = input.trim();\n\n if (completed) {\n break;\n }\n\n if (!cleaned) {\n continue;\n }\n\n if (!/^[0-9]{6}$/.test(cleaned)) {\n console.log('Codes must be exactly six digits.');\n continue;\n }\n\n try {\n await completeLogin(cleaned);\n } catch (error) {\n if (error instanceof ApiError) {\n if (error.status === 401) {\n console.log('Code not recognized. Double-check the digits shown in the browser.');\n continue;\n }\n if (error.status === 409) {\n console.log('Browser approval already completed. Finishing up\u2026');\n completed = true;\n break;\n }\n }\n await loopback?.stop();\n throw error;\n }\n }\n\n await loopback?.stop();\n\n if (!latestCredentials) {\n const stored = await store.load();\n if (stored) {\n latestCredentials = stored;\n } else {\n throw new Error('Login completed but credentials were not stored.');\n }\n }\n\n return latestCredentials;\n}\n\nconst DEFAULT_BACKEND_URL = 'https://api.omnara.com/';\nconst DEFAULT_FRONTEND_URL = 'https://www.omnara.com/';\n\nexport function resolveBackendUrl(option?: string): string {\n const candidate = option ?? process.env.OMNARA_BACKEND_URL ?? DEFAULT_BACKEND_URL;\n return normalizeBaseUrl(candidate);\n}\n\nexport function resolveFrontendUrl(option?: string): string {\n const candidate = option ?? process.env.OMNARA_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n return normalizeBaseUrl(candidate);\n}\n\nexport function mergeCredentialsAfterExchange(args: {\n exchange: ExchangeCliCodeResult;\n}): StoredCredentials {\n const now = Date.now();\n const accessExpiresAt = new Date(now + args.exchange.accessTokenExpiresIn * 1000).toISOString();\n const refreshExpiresAt = new Date(now + args.exchange.refreshTokenExpiresIn * 1000).toISOString();\n\n return {\n accessToken: args.exchange.accessToken,\n accessTokenExpiresAt: accessExpiresAt,\n refreshToken: args.exchange.refreshToken,\n refreshTokenExpiresAt: refreshExpiresAt,\n };\n}\n\nexport function formatDuration(ms: number): string {\n const totalSeconds = Math.round(ms / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n\n const totalMinutes = Math.round(totalSeconds / 60);\n if (totalMinutes < 60) {\n const seconds = totalSeconds % 60;\n return seconds > 0 ? `${totalMinutes}m ${seconds}s` : `${totalMinutes}m`;\n }\n\n const totalHours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (totalHours < 48) {\n return minutes > 0 ? `${totalHours}h ${minutes}m` : `${totalHours}h`;\n }\n\n const totalDays = Math.floor(totalHours / 24);\n const hours = totalDays % 24;\n return hours > 0 ? `${totalDays}d ${hours}h` : `${totalDays}d`;\n}\n\nfunction reportLoopbackError(error: unknown): void {\n if (error instanceof ApiError) {\n console.log(\n `Automatic login failed (HTTP ${error.status}). Paste the 6-digit code shown in the browser.`,\n );\n return;\n }\n console.log(`Automatic login failed: ${extractErrorMessage(error)}`);\n}\n\nfunction printSessionInstructions(session: CliAuthSession): void {\n console.log('\\nOpen this link in your browser if it did not open automatically:');\n console.log(` ${session.verificationUriComplete}`);\n console.log('Approve the request, then return to the CLI.');\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n\nasync function waitForLoopback(\n listener: LoopbackListener,\n sessionId: string,\n onCode: (code: string) => Promise<void>,\n): Promise<void> {\n try {\n const callback = await listener.waitForCallback();\n if (callback.sessionId && callback.sessionId !== sessionId) {\n console.log('Received browser callback for a different session.');\n return;\n }\n if (callback.state && callback.state !== listener.state) {\n console.log('Received browser callback with unexpected state.');\n return;\n }\n\n try {\n await onCode(callback.code);\n } catch (error) {\n reportLoopbackError(error);\n }\n } catch (error) {\n console.log(`Loopback listener error: ${extractErrorMessage(error)}`);\n }\n}\n", "import type { Console } from 'node:console';\n\nimport { CredentialsStore } from './credentials-store.js';\nimport { ensureAuthContext, type AuthContext } from './credential-manager.js';\nimport { performVerificationLogin } from './login-flow.js';\nimport { normalizeBaseUrl } from '../http/api-client.js';\n\nexport interface AuthProviderOptions {\n store: CredentialsStore;\n backendUrl: string;\n frontendUrl?: string;\n logger?: Console;\n}\n\nexport class AuthProvider {\n private cached: AuthContext | null = null;\n private readonly backendUrl: string;\n\n constructor(private readonly options: AuthProviderOptions) {\n this.backendUrl = normalizeBaseUrl(options.backendUrl);\n }\n\n async getAuthContext(): Promise<AuthContext> {\n const auth = await this.loadAuthContext();\n this.cached = auth;\n return auth;\n }\n\n async getAccessToken(): Promise<string> {\n const auth = await this.getAuthContext();\n return auth.accessToken;\n }\n\n private async loadAuthContext(): Promise<AuthContext> {\n try {\n return await ensureAuthContext(this.options.store, this.backendUrl);\n } catch (error) {\n if (!shouldAttemptLogin(error)) {\n throw error;\n }\n this.options.logger?.log('Opening browser to authenticate\u2026');\n await performVerificationLogin({\n backendUrlOption: this.backendUrl,\n frontendUrlOption: this.options.frontendUrl,\n store: this.options.store,\n });\n return await ensureAuthContext(this.options.store, this.backendUrl);\n }\n }\n}\n\nfunction shouldAttemptLogin(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message.includes('no credentials found') ||\n message.includes('run `omnara auth login` first') ||\n message.includes('refresh token expired') ||\n message.includes('refresh token unavailable') ||\n message.includes('access token expired')\n );\n}\n\nexport async function createAuthProvider(options: AuthProviderOptions): Promise<AuthProvider> {\n const provider = new AuthProvider(options);\n await provider.getAuthContext();\n return provider;\n}\n", "import { ApiClient } from './api-client.js';\n\ninterface CreateUserSessionRequestWire {\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface UserSessionDescriptor {\n kind: 'user_session';\n session_id: string;\n user_id: string;\n status: string;\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport async function createUserSession(\n client: ApiClient,\n accessToken: string,\n options: { name?: string; metadata?: Record<string, unknown> } = {},\n): Promise<UserSessionDescriptor> {\n const body: CreateUserSessionRequestWire = {\n name: options.name ?? null,\n metadata: options.metadata ?? null,\n };\n\n return await client.postJson<CreateUserSessionRequestWire, UserSessionDescriptor>(\n '/api/v1/user-sessions',\n body,\n { accessToken },\n );\n}\n", "import Ajv2020 from \"ajv/dist/2020.js\";\nimport addFormats from \"ajv-formats\";\n// Import JSON schemas directly for browser compatibility\nimport controlSchema from \"../../schemas/control_message.schema.json\" with { type: \"json\" };\nimport envelopeSchema from \"../../schemas/message_envelope.schema.json\" with { type: \"json\" };\nimport voiceLaunchRequestSchema from \"../../schemas/api_voice_launch_request.schema.json\" with { type: \"json\" };\nimport voiceLaunchResponseSchema from \"../../schemas/api_voice_launch_response.schema.json\" with { type: \"json\" };\nimport createUserSessionRequestSchema from \"../../schemas/api_sessions_create_request.schema.json\" with { type: \"json\" };\nimport userSessionSummarySchema from \"../../schemas/api_sessions_summary.schema.json\" with { type: \"json\" };\nimport userSessionListResponseSchema from \"../../schemas/api_sessions_list_response.schema.json\" with { type: \"json\" };\nimport messagePageResponseSchema from \"../../schemas/api_sessions_message_page_response.schema.json\" with { type: \"json\" };\nimport agentSessionDetailSchema from \"../../schemas/api_sessions_agent_detail.schema.json\" with { type: \"json\" };\nimport createChatMessageRequestSchema from \"../../schemas/api_sessions_create_chat_message_request.schema.json\" with { type: \"json\" };\nimport subscriptionResponseSchema from \"../../schemas/api_billing_subscription_response.schema.json\" with { type: \"json\" };\nimport usageResponseSchema from \"../../schemas/api_billing_usage_response.schema.json\" with { type: \"json\" };\nimport createCheckoutRequestSchema from \"../../schemas/api_billing_create_checkout_request.schema.json\" with { type: \"json\" };\nimport checkoutResponseSchema from \"../../schemas/api_billing_checkout_response.schema.json\" with { type: \"json\" };\nimport validatePromoRequestSchema from \"../../schemas/api_billing_validate_promo_request.schema.json\" with { type: \"json\" };\nimport promoValidationResponseSchema from \"../../schemas/api_billing_promo_validation_response.schema.json\" with { type: \"json\" };\nimport customerPortalRequestSchema from \"../../schemas/api_billing_customer_portal_request.schema.json\" with { type: \"json\" };\nimport customerPortalResponseSchema from \"../../schemas/api_billing_customer_portal_response.schema.json\" with { type: \"json\" };\nimport notificationRequestSchema from \"../../schemas/api_settings_notification_request.schema.json\" with { type: \"json\" };\nimport notificationResponseSchema from \"../../schemas/api_settings_notification_response.schema.json\" with { type: \"json\" };\nconst ajv = new Ajv2020({ strict: true, allErrors: true });\naddFormats(ajv);\n// Message validators\nexport const validateControlMessage = ajv.compile(controlSchema);\nexport const validateMessageEnvelope = ajv.compile(envelopeSchema);\n// Voice API validators\nexport const validateVoiceAgentLaunchRequest = ajv.compile(voiceLaunchRequestSchema);\nexport const validateVoiceAgentLaunchResponse = ajv.compile(voiceLaunchResponseSchema);\n// Sessions API validators\nexport const validateCreateUserSessionRequest = ajv.compile(createUserSessionRequestSchema);\nexport const validateUserSessionSummary = ajv.compile(userSessionSummarySchema);\nexport const validateUserSessionListResponse = ajv.compile(userSessionListResponseSchema);\nexport const validateMessagePageResponse = ajv.compile(messagePageResponseSchema);\nexport const validateAgentSessionDetail = ajv.compile(agentSessionDetailSchema);\nexport const validateCreateChatMessageRequest = ajv.compile(createChatMessageRequestSchema);\n// Billing API validators\nexport const validateSubscriptionResponse = ajv.compile(subscriptionResponseSchema);\nexport const validateUsageResponse = ajv.compile(usageResponseSchema);\nexport const validateCreateCheckoutSessionRequest = ajv.compile(createCheckoutRequestSchema);\nexport const validateCheckoutSessionResponse = ajv.compile(checkoutResponseSchema);\nexport const validateValidatePromoCodeRequest = ajv.compile(validatePromoRequestSchema);\nexport const validatePromoCodeValidationResponse = ajv.compile(promoValidationResponseSchema);\nexport const validateCustomerPortalSessionRequest = ajv.compile(customerPortalRequestSchema);\nexport const validateCustomerPortalSessionResponse = ajv.compile(customerPortalResponseSchema);\n// Settings API validators\nexport const validateUserNotificationSettingsRequest = ajv.compile(notificationRequestSchema);\nexport const validateUserNotificationSettingsResponse = ajv.compile(notificationResponseSchema);\n", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/ControlMessage\",\n \"title\": \"ControlMessage\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"Heartbeat\": {\n \"additionalProperties\": false,\n \"description\": \"Ping/pong heartbeat frames.\",\n \"properties\": {\n \"type\": {\n \"const\": \"heartbeat\",\n \"default\": \"heartbeat\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"mode\": {\n \"default\": \"ping\",\n \"enum\": [\n \"ping\",\n \"pong\"\n ],\n \"title\": \"Mode\",\n \"type\": \"string\"\n },\n \"sent_at\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Sent At\"\n }\n },\n \"title\": \"Heartbeat\",\n \"type\": \"object\"\n },\n \"SessionAnnounce\": {\n \"additionalProperties\": false,\n \"description\": \"Notification that a session was created or updated.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_announce\",\n \"default\": \"session_announce\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n }\n ],\n \"title\": \"Session\"\n },\n \"origin\": {\n \"enum\": [\n \"backend\",\n \"client\"\n ],\n \"title\": \"Origin\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"session\",\n \"origin\"\n ],\n \"title\": \"SessionAnnounce\",\n \"type\": \"object\"\n },\n \"SessionBootstrap\": {\n \"additionalProperties\": false,\n \"description\": \"Initial snapshot of the session tree for this connection.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_bootstrap\",\n \"default\": \"session_bootstrap\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"root\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"root\"\n ],\n \"title\": \"SessionBootstrap\",\n \"type\": \"object\"\n },\n \"SessionClosed\": {\n \"additionalProperties\": false,\n \"description\": \"Indicates a session has been completed or shut down.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_closed\",\n \"default\": \"session_closed\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"status\"\n ],\n \"title\": \"SessionClosed\",\n \"type\": \"object\"\n },\n \"SessionInit\": {\n \"additionalProperties\": false,\n \"description\": \"Client request to register or refresh an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_init\",\n \"default\": \"session_init\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Session Id\",\n \"type\": \"string\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_session_id\",\n \"session_type\"\n ],\n \"title\": \"SessionInit\",\n \"type\": \"object\"\n },\n \"SessionInitAck\": {\n \"additionalProperties\": false,\n \"description\": \"Acknowledgement that a session_init was processed.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_init_ack\",\n \"default\": \"session_init_ack\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Session Id\",\n \"type\": \"string\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_session_id\"\n ],\n \"title\": \"SessionInitAck\",\n \"type\": \"object\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n }\n },\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/SessionInit\"\n },\n {\n \"$ref\": \"#/$defs/SessionBootstrap\"\n },\n {\n \"$ref\": \"#/$defs/SessionAnnounce\"\n },\n {\n \"$ref\": \"#/$defs/SessionInitAck\"\n },\n {\n \"$ref\": \"#/$defs/SessionClosed\"\n },\n {\n \"$ref\": \"#/$defs/Heartbeat\"\n }\n ]\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MessageEnvelope\",\n \"title\": \"MessageEnvelope\",\n \"$defs\": {\n \"AgentCompleteContent\": {\n \"additionalProperties\": false,\n \"description\": \"Completion marker for an agent session turn.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_complete\",\n \"default\": \"agent_complete\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"success\": {\n \"title\": \"Success\",\n \"type\": \"boolean\"\n },\n \"duration_ms\": {\n \"anyOf\": [\n {\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Duration Ms\"\n },\n \"cost_usd\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Cost Usd\"\n },\n \"message\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Message\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"success\"\n ],\n \"title\": \"AgentCompleteContent\",\n \"type\": \"object\"\n },\n \"AgentProgressContent\": {\n \"additionalProperties\": false,\n \"description\": \"Incremental progress emitted by an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_progress\",\n \"default\": \"agent_progress\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Detail\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"title\": \"AgentProgressContent\",\n \"type\": \"object\"\n },\n \"MessagePayload\": {\n \"additionalProperties\": false,\n \"description\": \"Application-level message data stored in the database and relayed to clients.\",\n \"properties\": {\n \"version\": {\n \"default\": 0,\n \"title\": \"Version\",\n \"type\": \"integer\"\n },\n \"content\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolCallContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentProgressContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentCompleteContent\"\n }\n ],\n \"title\": \"Content\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"title\": \"MessagePayload\",\n \"type\": \"object\"\n },\n \"SenderRef\": {\n \"additionalProperties\": false,\n \"description\": \"Reference to the author of a message.\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"user\",\n \"agent_session\"\n ],\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"id\": {\n \"format\": \"uuid\",\n \"title\": \"Id\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"id\"\n ],\n \"title\": \"SenderRef\",\n \"type\": \"object\"\n },\n \"TextContent\": {\n \"additionalProperties\": false,\n \"description\": \"Plain text content shared with the agent.\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"default\": \"text\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"text\": {\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"annotations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Annotations\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"title\": \"TextContent\",\n \"type\": \"object\"\n },\n \"ToolCallContent\": {\n \"additionalProperties\": false,\n \"description\": \"Tool invocation authored by the assistant.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_call\",\n \"default\": \"tool_call\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"name\": {\n \"title\": \"Name\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"arguments\": {\n \"additionalProperties\": true,\n \"title\": \"Arguments\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"name\",\n \"tool_use_id\",\n \"arguments\"\n ],\n \"title\": \"ToolCallContent\",\n \"type\": \"object\"\n },\n \"ToolResultContent\": {\n \"additionalProperties\": false,\n \"description\": \"Result produced by a previously invoked tool.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_result\",\n \"default\": \"tool_result\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"output\": {\n \"title\": \"Output\"\n },\n \"is_error\": {\n \"default\": false,\n \"title\": \"Is Error\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"tool_use_id\",\n \"output\"\n ],\n \"title\": \"ToolResultContent\",\n \"type\": \"object\"\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Complete message frame exchanged over transports.\",\n \"properties\": {\n \"message_id\": {\n \"format\": \"uuid\",\n \"title\": \"Message Id\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"sender\": {\n \"$ref\": \"#/$defs/SenderRef\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/MessagePayload\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message_id\",\n \"session_id\",\n \"sender\",\n \"payload\",\n \"created_at\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/VoiceAgentLaunchRequest\",\n \"title\": \"VoiceAgentLaunchRequest\",\n \"description\": \"Request to launch a voice agent for an agent session.\",\n \"properties\": {\n \"force\": {\n \"default\": false,\n \"description\": \"Launch even if the CLI relay is offline or owned by another user. When true, the request bypasses relay presence validation.\",\n \"title\": \"Force\",\n \"type\": \"boolean\"\n },\n \"room_name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Optional LiveKit room name override (defaults to derived prefix).\",\n \"title\": \"Room Name\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/VoiceAgentLaunchResponse\",\n \"title\": \"VoiceAgentLaunchResponse\",\n \"description\": \"Response containing LiveKit room and relay connection details.\",\n \"properties\": {\n \"session_id\": {\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"room_name\": {\n \"title\": \"Room Name\",\n \"type\": \"string\"\n },\n \"livekit_url\": {\n \"title\": \"Livekit Url\",\n \"type\": \"string\"\n },\n \"access_token\": {\n \"title\": \"Access Token\",\n \"type\": \"string\"\n },\n \"access_token_identity\": {\n \"title\": \"Access Token Identity\",\n \"type\": \"string\"\n },\n \"relay_ws_url\": {\n \"title\": \"Relay Ws Url\",\n \"type\": \"string\"\n },\n \"relay_token\": {\n \"title\": \"Relay Token\",\n \"type\": \"string\"\n },\n \"relay_token_expires_in\": {\n \"title\": \"Relay Token Expires In\",\n \"type\": \"integer\"\n },\n \"dispatch_id\": {\n \"title\": \"Dispatch Id\",\n \"type\": \"string\"\n },\n \"dispatch_metadata\": {\n \"additionalProperties\": true,\n \"title\": \"Dispatch Metadata\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"session_id\",\n \"room_name\",\n \"livekit_url\",\n \"access_token\",\n \"access_token_identity\",\n \"relay_ws_url\",\n \"relay_token\",\n \"relay_token_expires_in\",\n \"dispatch_id\",\n \"dispatch_metadata\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateUserSessionRequest\",\n \"title\": \"CreateUserSessionRequest\",\n \"description\": \"Payload for creating a new user session container.\",\n \"properties\": {\n \"name\": {\n \"anyOf\": [\n {\n \"maxLength\": 255,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserSessionSummary\",\n \"title\": \"UserSessionSummary\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n }\n },\n \"description\": \"Aggregated user session data returned to clients.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"session\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserSessionListResponse\",\n \"title\": \"UserSessionListResponse\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n },\n \"UserSessionSummary\": {\n \"description\": \"Aggregated user session data returned to clients.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"session\"\n ],\n \"title\": \"UserSessionSummary\",\n \"type\": \"object\"\n }\n },\n \"description\": \"Response containing a list of user sessions.\",\n \"properties\": {\n \"sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/UserSessionSummary\"\n },\n \"title\": \"Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"sessions\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MessagePageResponse\",\n \"title\": \"MessagePageResponse\",\n \"$defs\": {\n \"AgentCompleteContent\": {\n \"additionalProperties\": false,\n \"description\": \"Completion marker for an agent session turn.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_complete\",\n \"default\": \"agent_complete\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"success\": {\n \"title\": \"Success\",\n \"type\": \"boolean\"\n },\n \"duration_ms\": {\n \"anyOf\": [\n {\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Duration Ms\"\n },\n \"cost_usd\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Cost Usd\"\n },\n \"message\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Message\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"success\"\n ],\n \"title\": \"AgentCompleteContent\",\n \"type\": \"object\"\n },\n \"AgentProgressContent\": {\n \"additionalProperties\": false,\n \"description\": \"Incremental progress emitted by an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_progress\",\n \"default\": \"agent_progress\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Detail\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"title\": \"AgentProgressContent\",\n \"type\": \"object\"\n },\n \"MessageEnvelope\": {\n \"additionalProperties\": false,\n \"description\": \"Complete message frame exchanged over transports.\",\n \"properties\": {\n \"message_id\": {\n \"format\": \"uuid\",\n \"title\": \"Message Id\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"sender\": {\n \"$ref\": \"#/$defs/SenderRef\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/MessagePayload\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message_id\",\n \"session_id\",\n \"sender\",\n \"payload\",\n \"created_at\"\n ],\n \"title\": \"MessageEnvelope\",\n \"type\": \"object\"\n },\n \"MessagePayload\": {\n \"additionalProperties\": false,\n \"description\": \"Application-level message data stored in the database and relayed to clients.\",\n \"properties\": {\n \"version\": {\n \"default\": 0,\n \"title\": \"Version\",\n \"type\": \"integer\"\n },\n \"content\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolCallContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentProgressContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentCompleteContent\"\n }\n ],\n \"title\": \"Content\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"title\": \"MessagePayload\",\n \"type\": \"object\"\n },\n \"SenderRef\": {\n \"additionalProperties\": false,\n \"description\": \"Reference to the author of a message.\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"user\",\n \"agent_session\"\n ],\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"id\": {\n \"format\": \"uuid\",\n \"title\": \"Id\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"id\"\n ],\n \"title\": \"SenderRef\",\n \"type\": \"object\"\n },\n \"TextContent\": {\n \"additionalProperties\": false,\n \"description\": \"Plain text content shared with the agent.\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"default\": \"text\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"text\": {\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"annotations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Annotations\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"title\": \"TextContent\",\n \"type\": \"object\"\n },\n \"ToolCallContent\": {\n \"additionalProperties\": false,\n \"description\": \"Tool invocation authored by the assistant.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_call\",\n \"default\": \"tool_call\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"name\": {\n \"title\": \"Name\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"arguments\": {\n \"additionalProperties\": true,\n \"title\": \"Arguments\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"name\",\n \"tool_use_id\",\n \"arguments\"\n ],\n \"title\": \"ToolCallContent\",\n \"type\": \"object\"\n },\n \"ToolResultContent\": {\n \"additionalProperties\": false,\n \"description\": \"Result produced by a previously invoked tool.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_result\",\n \"default\": \"tool_result\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"output\": {\n \"title\": \"Output\"\n },\n \"is_error\": {\n \"default\": false,\n \"title\": \"Is Error\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"tool_use_id\",\n \"output\"\n ],\n \"title\": \"ToolResultContent\",\n \"type\": \"object\"\n }\n },\n \"description\": \"Paginated response for session messages.\",\n \"properties\": {\n \"messages\": {\n \"items\": {\n \"$ref\": \"#/$defs/MessageEnvelope\"\n },\n \"title\": \"Messages\",\n \"type\": \"array\"\n },\n \"has_more\": {\n \"default\": false,\n \"title\": \"Has More\",\n \"type\": \"boolean\"\n },\n \"next_cursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Next Cursor\"\n }\n },\n \"required\": [\n \"messages\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/AgentSessionDetail\",\n \"title\": \"AgentSessionDetail\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n }\n },\n \"description\": \"Detailed agent session with child sessions.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"child_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Child Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"session\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateChatMessageRequest\",\n \"title\": \"CreateChatMessageRequest\",\n \"description\": \"Simple text payload for dashboard/mobile chat fallbacks.\",\n \"properties\": {\n \"text\": {\n \"minLength\": 1,\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/SubscriptionResponse\",\n \"title\": \"SubscriptionResponse\",\n \"description\": \"Current subscription details for a user.\",\n \"properties\": {\n \"id\": {\n \"title\": \"Id\",\n \"type\": \"string\"\n },\n \"plan_type\": {\n \"title\": \"Plan Type\",\n \"type\": \"string\"\n },\n \"agent_limit\": {\n \"title\": \"Agent Limit\",\n \"type\": \"integer\"\n },\n \"current_period_end\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Current Period End\"\n },\n \"cancel_at_period_end\": {\n \"default\": false,\n \"title\": \"Cancel At Period End\",\n \"type\": \"boolean\"\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Provider\"\n },\n \"plan_display_name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Human-friendly plan label (e.g. Pro, Starter).\",\n \"title\": \"Plan Display Name\"\n },\n \"plan_price_amount\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Recurring charge amount for the plan (in major currency units).\",\n \"title\": \"Plan Price Amount\"\n },\n \"plan_price_currency\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"ISO currency for the recurring charge (e.g. usd).\",\n \"title\": \"Plan Price Currency\"\n },\n \"plan_price_interval\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Billing interval for the recurring charge (e.g. month, year).\",\n \"title\": \"Plan Price Interval\"\n }\n },\n \"required\": [\n \"id\",\n \"plan_type\",\n \"agent_limit\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UsageResponse\",\n \"title\": \"UsageResponse\",\n \"description\": \"Current usage statistics for a subscription period.\",\n \"properties\": {\n \"total_agents\": {\n \"title\": \"Total Agents\",\n \"type\": \"integer\"\n },\n \"agent_limit\": {\n \"title\": \"Agent Limit\",\n \"type\": \"integer\"\n },\n \"period_start\": {\n \"format\": \"date-time\",\n \"title\": \"Period Start\",\n \"type\": \"string\"\n },\n \"period_end\": {\n \"format\": \"date-time\",\n \"title\": \"Period End\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"total_agents\",\n \"agent_limit\",\n \"period_start\",\n \"period_end\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateCheckoutSessionRequest\",\n \"title\": \"CreateCheckoutSessionRequest\",\n \"description\": \"Request to create a Stripe checkout session.\",\n \"properties\": {\n \"plan_type\": {\n \"description\": \"Target plan type (e.g. pro, enterprise).\",\n \"title\": \"Plan Type\",\n \"type\": \"string\"\n },\n \"success_url\": {\n \"description\": \"URL to redirect to after successful checkout.\",\n \"title\": \"Success Url\",\n \"type\": \"string\"\n },\n \"cancel_url\": {\n \"description\": \"URL to redirect to if the user cancels checkout.\",\n \"title\": \"Cancel Url\",\n \"type\": \"string\"\n },\n \"promo_code\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Optional promotional code to pre-apply to the checkout session.\",\n \"title\": \"Promo Code\"\n }\n },\n \"required\": [\n \"plan_type\",\n \"success_url\",\n \"cancel_url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CheckoutSessionResponse\",\n \"title\": \"CheckoutSessionResponse\",\n \"description\": \"Response containing checkout session details.\",\n \"properties\": {\n \"session_id\": {\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"checkout_url\": {\n \"title\": \"Checkout Url\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"session_id\",\n \"checkout_url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/ValidatePromoCodeRequest\",\n \"title\": \"ValidatePromoCodeRequest\",\n \"description\": \"Request to validate a promotional code.\",\n \"properties\": {\n \"code\": {\n \"title\": \"Code\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/PromoCodeValidationResponse\",\n \"title\": \"PromoCodeValidationResponse\",\n \"description\": \"Response containing promotional code validation results.\",\n \"properties\": {\n \"valid\": {\n \"title\": \"Valid\",\n \"type\": \"boolean\"\n },\n \"code\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Code\"\n },\n \"discount_type\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Discount Type\"\n },\n \"discount_value\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Discount Value\"\n },\n \"description\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Description\"\n },\n \"error\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Error\"\n }\n },\n \"required\": [\n \"valid\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CustomerPortalSessionRequest\",\n \"title\": \"CustomerPortalSessionRequest\",\n \"description\": \"Request to create a Stripe Billing customer portal session.\",\n \"properties\": {\n \"return_url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Where Stripe should send the customer after they leave the portal.\",\n \"title\": \"Return Url\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CustomerPortalSessionResponse\",\n \"title\": \"CustomerPortalSessionResponse\",\n \"description\": \"Response containing the Stripe Billing customer portal session URL.\",\n \"properties\": {\n \"url\": {\n \"description\": \"Hosted Stripe customer portal URL.\",\n \"title\": \"Url\",\n \"type\": \"string\"\n },\n \"created\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Timestamp when the session was created.\",\n \"title\": \"Created\"\n },\n \"expires_at\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"When the portal session expires (if provided by Stripe).\",\n \"title\": \"Expires At\"\n }\n },\n \"required\": [\n \"url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserNotificationSettingsRequest\",\n \"title\": \"UserNotificationSettingsRequest\",\n \"description\": \"Request to update user notification preferences.\",\n \"properties\": {\n \"push_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Push Notifications Enabled\"\n },\n \"email_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Email Notifications Enabled\"\n },\n \"sms_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Sms Notifications Enabled\"\n },\n \"phone_number\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Phone Number\"\n },\n \"notification_email\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Notification Email\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserNotificationSettingsResponse\",\n \"title\": \"UserNotificationSettingsResponse\",\n \"description\": \"Response containing current notification settings.\",\n \"properties\": {\n \"push_notifications_enabled\": {\n \"title\": \"Push Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"email_notifications_enabled\": {\n \"title\": \"Email Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"sms_notifications_enabled\": {\n \"title\": \"Sms Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"phone_number\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Phone Number\"\n },\n \"notification_email\": {\n \"title\": \"Notification Email\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"push_notifications_enabled\",\n \"email_notifications_enabled\",\n \"sms_notifications_enabled\",\n \"phone_number\",\n \"notification_email\"\n ],\n \"type\": \"object\"\n}", "import readline from 'readline';\nimport { once } from 'events';\nimport WebSocket from 'ws';\nimport type { OutboundMessage } from '../orchestrator/orchestrator-types.js';\n\nexport interface ReplOptions {\n url?: string;\n headers?: Record<string, string>;\n initialSessionId?: string;\n parentSessionId?: string;\n initialMetadata?: Record<string, unknown>;\n initializeSession?: boolean;\n}\n\nconst DEFAULT_URL = 'ws://localhost:3001/ws';\n\nexport async function runTerminalRepl(options?: Partial<ReplOptions>): Promise<void> {\n const url = options?.url ?? DEFAULT_URL;\n const wsOptions = options?.headers ? { headers: options.headers } : undefined;\n const ws = wsOptions ? new WebSocket(url, wsOptions) : new WebSocket(url);\n\n await Promise.race([\n once(ws, 'open').then(() => undefined),\n once(ws, 'error').then(([error]) => {\n throw error;\n }),\n ]);\n\n console.log(`Connected to ${url}`);\n\n if (options?.initializeSession && options?.initialSessionId) {\n const payload: Record<string, unknown> = {\n type: 'session_init',\n sessionId: options.initialSessionId,\n };\n if (options.parentSessionId) {\n payload.parentSessionId = options.parentSessionId;\n }\n if (options.initialMetadata) {\n payload.metadata = options.initialMetadata;\n }\n sendMessage(ws, payload);\n }\n\n let currentSessionId: string | undefined = options?.initialSessionId;\n let awaitingResponse = false;\n let lastPrompt = promptForSession(currentSessionId);\n let shuttingDown = false;\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: lastPrompt,\n });\n\n ws.on('message', (data) => {\n handleOutboundMessage(\n maybeParseOutboundMessage(data),\n () => rl.prompt(true),\n (sessionId) => {\n currentSessionId = sessionId;\n updatePrompt();\n },\n () => {\n awaitingResponse = false;\n updatePrompt();\n },\n );\n });\n\n ws.on('close', (code, reason) => {\n console.log(\n `\\nDisconnected from server (code ${code}${reason ? `, reason: ${reason.toString()}` : ''})`,\n );\n if (!shuttingDown) {\n shuttingDown = true;\n rl.close();\n }\n });\n\n ws.on('error', (error) => {\n console.error('\\nWebSocket error:', error);\n if (!shuttingDown) {\n shuttingDown = true;\n rl.close();\n }\n });\n\n rl.on('line', (line) => {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n updatePrompt();\n return;\n }\n\n if (trimmed === '/exit' || trimmed === '/quit') {\n cleanup();\n return;\n }\n\n if (trimmed === '/new') {\n currentSessionId = undefined;\n console.log('\\nStarting a new session.');\n updatePrompt();\n return;\n }\n\n if (trimmed.startsWith('/join ')) {\n const target = trimmed.slice('/join '.length).trim();\n if (target.length === 0) {\n console.log('\\nUsage: /join <session-id>');\n updatePrompt();\n return;\n }\n\n currentSessionId = target;\n sendMessage(ws, { type: 'join', sessionId: target });\n updatePrompt();\n return;\n }\n\n if (trimmed === '/help') {\n printHelp();\n updatePrompt();\n return;\n }\n\n awaitingResponse = true;\n updatePrompt();\n\n sendMessage(ws, {\n type: 'chat',\n sessionId: currentSessionId,\n text: trimmed,\n });\n });\n\n rl.on('SIGINT', () => {\n cleanup();\n });\n\n rl.on('close', () => {\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close(1000, 'Client closing');\n }\n });\n\n rl.prompt();\n\n await new Promise<void>((resolve) => {\n rl.once('close', resolve);\n });\n\n function updatePrompt(): void {\n lastPrompt = promptForSession(currentSessionId, awaitingResponse);\n rl.setPrompt(lastPrompt);\n rl.prompt(true);\n }\n\n function cleanup(): void {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close(1000, 'Client closing');\n }\n rl.close();\n }\n}\n\nfunction promptForSession(sessionId: string | undefined, awaitingResponse = false): string {\n const base = sessionId ? `session:${sessionId.slice(0, 6)}` : 'session:new';\n return `${awaitingResponse ? '*' : ''}${base}> `;\n}\n\nfunction sendMessage(ws: WebSocket, payload: unknown): void {\n if (ws.readyState !== WebSocket.OPEN) {\n console.warn('Cannot send message: socket is not open.');\n return;\n }\n try {\n ws.send(JSON.stringify(payload));\n } catch (error) {\n console.error('Failed to send message:', error);\n }\n}\n\nfunction maybeParseOutboundMessage(data: WebSocket.RawData): OutboundMessage | null {\n try {\n const text = typeof data === 'string' ? data : data.toString('utf8');\n return JSON.parse(text) as OutboundMessage;\n } catch (error) {\n console.error('Failed to parse server message:', error);\n return null;\n }\n}\n\nfunction handleOutboundMessage(\n message: OutboundMessage | null,\n onPrompt: () => void,\n onSessionChange: (sessionId: string) => void,\n onTurnComplete: () => void,\n): void {\n if (!message) {\n return;\n }\n\n switch (message.type) {\n case 'session_created':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [server] Session created: ${message.sessionId}`,\n );\n onSessionChange(message.sessionId);\n break;\n case 'session_joined':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [server] Joined session: ${message.sessionId}`,\n );\n onSessionChange(message.sessionId);\n break;\n case 'session_init':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [server] Session init (parent: ${message.parentSessionId ?? 'none'})`,\n );\n break;\n case 'session_init_ack':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [server] Session init acknowledged (parent: ${message.parentSessionId ?? 'none'})`,\n );\n break;\n case 'user_text':\n if (message.origin === 'worker') {\n console.log(`\\n${formatSessionPrefix(message.sessionId)} worker> ${message.text}`);\n } else {\n console.log(`\\n${formatSessionPrefix(message.sessionId)} you> ${message.text}`);\n }\n break;\n case 'assistant_text':\n process.stdout.write(`\\n${formatSessionPrefix(message.sessionId)} claude> ${message.text}`);\n break;\n case 'agent_complete': {\n const status = message.success ? 'Success' : 'Failure';\n const duration = message.durationMs != null ? ` (${message.durationMs}ms)` : '';\n const cost = message.costUsd != null ? ` cost: $${message.costUsd.toFixed(4)}` : '';\n const summary = message.message ? ` - ${message.message}` : '';\n const metadata = message.metadata ?? {};\n const agentId =\n typeof metadata.agent_session_id === 'string' ? metadata.agent_session_id : undefined;\n const taskLabel = typeof metadata.task === 'string' ? ` (${metadata.task})` : '';\n const agentLabel = agentId ? ` [agent:${agentId}]` : '';\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [complete${agentLabel}${taskLabel}] ${status}${duration}${cost}${summary}`,\n );\n onTurnComplete();\n break;\n }\n case 'tool_call':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [tool] Using ${message.toolName} (${message.toolUseId}):`,\n safeStringify(message.input),\n );\n break;\n case 'tool_result':\n console.log(\n `\\n${formatSessionPrefix(message.sessionId)} [tool] Result for ${message.toolUseId}${message.isError ? ' (error)' : ''}:`,\n safeStringify(message.content),\n );\n break;\n case 'agent_progress':\n {\n const status = (message.status ?? 'update').toUpperCase();\n const detail = message.detail ? ` - ${message.detail}` : '';\n const metadata = message.metadata ?? {};\n const agentId =\n typeof metadata.agent_session_id === 'string' ? metadata.agent_session_id : undefined;\n const relatedSessionId =\n message.sessionId ||\n (typeof metadata.origin_session_id === 'string'\n ? metadata.origin_session_id\n : undefined) ||\n agentId;\n const agentLabel = agentId ? ` [agent:${agentId}]` : '';\n console.log(`\\n${formatSessionPrefix(relatedSessionId)}${agentLabel} ${status}${detail}`);\n }\n break;\n case 'system':\n console.log(`\\n${formatSessionPrefix(message.sessionId)} [system] ${message.subtype}`);\n if (message.subtype === 'init') {\n onTurnComplete();\n }\n break;\n case 'error':\n console.error(`\\n${formatSessionPrefix(message.sessionId)} [error] ${message.message}`);\n onTurnComplete();\n break;\n case 'pong':\n // No-op; keep connection alive.\n break;\n default:\n console.log(\n `\\n${formatSessionPrefix((message as { sessionId?: string }).sessionId)} [server]`,\n safeStringify(message),\n );\n break;\n }\n\n onPrompt();\n}\n\nfunction safeStringify(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction formatSessionPrefix(sessionId: string | undefined): string {\n if (!sessionId) {\n return '[session:unknown]';\n }\n return `[session:${sessionId}]`;\n}\n\nfunction printHelp(): void {\n console.log(`\\nCommands:\n /new Start a new session\n /join <id> Join an existing session\n /help Show this help text\n /exit Quit the REPL\n`);\n}\n", "import { ApiClient } from '../http/api-client.js';\n\ninterface VoiceLaunchRequestWire {\n force?: boolean;\n room_name?: string | null;\n}\n\ninterface VoiceLaunchResponseWire {\n session_id: string;\n room_name: string;\n livekit_url: string;\n access_token: string;\n access_token_identity: string;\n relay_ws_url: string;\n relay_token: string;\n relay_token_expires_in: number;\n dispatch_id: string;\n dispatch_metadata: Record<string, unknown>;\n}\n\nexport interface VoiceLaunchResult {\n sessionId: string;\n roomName: string;\n livekitUrl: string;\n accessToken: string;\n accessTokenIdentity: string;\n relayWsUrl: string;\n relayToken: string;\n relayTokenExpiresIn: number;\n dispatchId: string;\n dispatchMetadata: Record<string, unknown>;\n}\n\nexport interface LaunchVoiceOptions {\n sessionId: string;\n force?: boolean;\n roomName?: string;\n}\n\nexport async function launchVoiceForSession(\n client: ApiClient,\n accessToken: string,\n options: LaunchVoiceOptions,\n): Promise<VoiceLaunchResult> {\n const path = `/api/v1/voice/sessions/${options.sessionId}/launch`;\n const requestBody: VoiceLaunchRequestWire = {};\n\n if (options.force) {\n requestBody.force = true;\n }\n if (options.roomName) {\n requestBody.room_name = options.roomName;\n }\n\n const response = await client.postJson<VoiceLaunchRequestWire, VoiceLaunchResponseWire>(\n path,\n requestBody,\n { accessToken },\n );\n\n return {\n sessionId: response.session_id,\n roomName: response.room_name,\n livekitUrl: response.livekit_url,\n accessToken: response.access_token,\n accessTokenIdentity: response.access_token_identity,\n relayWsUrl: response.relay_ws_url,\n relayToken: response.relay_token,\n relayTokenExpiresIn: response.relay_token_expires_in,\n dispatchId: response.dispatch_id,\n dispatchMetadata: response.dispatch_metadata ?? {},\n };\n}\n", "import { execSync } from 'child_process';\nimport chalk from 'chalk';\n\n/**\n * Checks if Claude Code is installed and available in the system\n */\nexport function checkClaudeCodeInstallation(): boolean {\n try {\n // Try to execute claude command to check if it's available\n execSync('claude --version', {\n stdio: 'ignore',\n encoding: 'utf-8',\n env: process.env,\n });\n return true;\n } catch {\n // Command not found or execution failed\n return false;\n }\n}\n\n/**\n * Checks if ANTHROPIC_API_KEY environment variable is set\n */\nexport function checkAnthropicApiKey(): boolean {\n return !!process.env.ANTHROPIC_API_KEY && process.env.ANTHROPIC_API_KEY.trim().length > 0;\n}\n\n/**\n * Displays a warning message if neither authentication method is available\n */\nexport function displayClaudeCodeWarning(): void {\n console.log(\n chalk.yellow(\n \"\\nWarning: Omnara needs access to the Anthropic API. Omnara didn't detect claude installed, nor did it find a valid API key. If you run into authentication errors, login via `claude login` or pass in an ANTHROPIC_API_KEY as an environment variable.\\n\",\n ),\n );\n}\n\n/**\n * Performs the Claude Code check and displays warning if needed\n * @param options - Optional configuration for the check\n * @returns boolean indicating if either authentication method is available\n */\nexport function performClaudeCodeCheck(\n options: {\n silent?: boolean;\n exitOnMissing?: boolean;\n } = {},\n): boolean {\n const { silent = false, exitOnMissing = false } = options;\n\n // Allow disabling the check via environment variable\n if (process.env.OMNARA_SKIP_CLAUDE_CHECK === 'true') {\n return true;\n }\n\n const isClaudeInstalled = checkClaudeCodeInstallation();\n const hasApiKey = checkAnthropicApiKey();\n const hasAuthentication = isClaudeInstalled || hasApiKey;\n\n // Only warn if BOTH checks fail\n if (!hasAuthentication && !silent) {\n displayClaudeCodeWarning();\n\n if (exitOnMissing) {\n console.error(chalk.red('Exiting: Authentication is required for this operation.'));\n process.exit(1);\n }\n }\n\n return hasAuthentication;\n}\n\n/**\n * Gets Claude Code version if installed\n */\nexport function getClaudeCodeVersion(): string | null {\n try {\n const version = execSync('claude --version', {\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n env: process.env,\n }).trim();\n return version;\n } catch {\n return null;\n }\n}\n", "import { Command } from 'commander';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport type { StoredCredentials } from '../auth/credentials-store.js';\nimport { ApiError } from '../http/api-client.js';\nimport { performVerificationLogin, resolveBackendUrl, formatDuration } from '../auth/login-flow.js';\n\ninterface LoginOptions {\n backendUrl?: string;\n frontendUrl?: string;\n}\n\nexport function buildAuthCommand(): Command {\n const auth = new Command('auth').description('Authenticate the Omnara CLI.');\n\n auth\n .command('login')\n .description('Authenticate via the browser-based verification flow.')\n .option('--backend-url <url>', 'Backend base URL')\n .option('--frontend-url <url>', 'Frontend URL to open for verification')\n .action(async (options: LoginOptions) => {\n const store = new CredentialsStore();\n const backendUrl = resolveBackendUrl(options.backendUrl);\n\n try {\n await performVerificationLogin({\n backendUrlOption: backendUrl,\n frontendUrlOption: options.frontendUrl,\n store,\n });\n } catch (error) {\n if (error instanceof ApiError) {\n console.error(`\\nRequest failed (HTTP ${error.status}): ${error.message}`);\n } else {\n console.error(`\\nLogin failed: ${extractErrorMessage(error)}`);\n }\n process.exitCode = 1;\n }\n });\n\n auth\n .command('logout')\n .description('Remove stored CLI credentials.')\n .action(async () => {\n const store = new CredentialsStore();\n await store.clear();\n console.log('Credentials cleared.');\n });\n\n auth\n .command('status')\n .description('Show stored CLI credential details.')\n .action(async () => {\n const store = new CredentialsStore();\n const credentials = await store.load();\n if (!credentials) {\n console.log('No credentials stored.');\n return;\n }\n\n printStatus(credentials);\n });\n\n return auth;\n}\n\nfunction printStatus(credentials: StoredCredentials): void {\n if (credentials.accessToken) {\n const accessStatus = describeExpiry(credentials.accessTokenExpiresAt);\n const refreshStatus = credentials.refreshTokenExpiresAt\n ? describeExpiry(credentials.refreshTokenExpiresAt)\n : 'unknown expiry';\n console.log(\n `Authentication: Supabase access token (${accessStatus}), Refresh token (${refreshStatus})`,\n );\n return;\n }\n\n console.log('Authentication: Not configured');\n}\n\nfunction describeExpiry(iso?: string): string {\n if (!iso) {\n return 'unknown expiry';\n }\n const timestamp = Date.parse(iso);\n if (Number.isNaN(timestamp)) {\n return 'invalid timestamp';\n }\n const diff = timestamp - Date.now();\n const abs = Math.abs(diff);\n const descriptor = formatDuration(abs);\n return diff >= 0 ? `expires in ${descriptor}` : `expired ${descriptor} ago`;\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n", "import https from 'https';\nimport { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\n\ninterface NpmPackageInfo {\n 'dist-tags': {\n latest: string;\n };\n versions: Record<string, unknown>;\n}\n\ninterface PackageJson {\n name?: string;\n version?: string;\n}\n\n/**\n * Fetches the latest version of a package from the npm registry\n */\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\n return new Promise((resolve) => {\n const url = `https://registry.npmjs.org/${packageName}`;\n\n https\n .get(url, { timeout: 3000 }, (res) => {\n let data = '';\n\n res.on('data', (chunk) => {\n data += chunk;\n });\n\n res.on('end', () => {\n try {\n if (res.statusCode !== 200) {\n resolve(null);\n return;\n }\n\n const packageInfo = JSON.parse(data) as NpmPackageInfo;\n resolve(packageInfo['dist-tags']?.latest || null);\n } catch {\n resolve(null);\n }\n });\n })\n .on('error', () => {\n resolve(null);\n })\n .on('timeout', () => {\n resolve(null);\n });\n });\n}\n\n/**\n * Compares two semantic versions\n * Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal\n */\nfunction compareVersions(v1: string, v2: string): number {\n const parts1 = v1.split('.').map(Number);\n const parts2 = v2.split('.').map(Number);\n\n for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {\n const part1 = parts1[i] || 0;\n const part2 = parts2[i] || 0;\n\n if (part1 > part2) return 1;\n if (part1 < part2) return -1;\n }\n\n return 0;\n}\n\n/**\n * Checks if a newer version is available and logs a message if so.\n * This function is non-blocking and will not throw errors.\n */\nexport async function checkForUpdates(): Promise<void> {\n try {\n const packageJson = require('../../package.json') as PackageJson;\n const currentVersion = packageJson.version;\n const packageName = packageJson.name;\n\n if (!currentVersion || !packageName) {\n return;\n }\n\n // Fetch latest version from npm registry\n const latestVersion = await fetchLatestVersion(packageName);\n\n if (!latestVersion) {\n return;\n }\n\n // Compare versions\n if (compareVersions(latestVersion, currentVersion) > 0) {\n console.log('\\n' + '\u2550'.repeat(60));\n console.log('Update available!');\n console.log(`Current version: ${currentVersion}`);\n console.log(`Latest version: ${latestVersion}`);\n console.log(`Run \\`npm install -g ${packageName}@latest\\` to update`);\n console.log('\u2550'.repeat(60) + '\\n');\n }\n } catch {\n // Silently ignore any errors to not disrupt CLI operation\n }\n}\n\n/**\n * Checks for updates in the background without blocking\n */\nexport function checkForUpdatesInBackground(): void {\n // Run the check asynchronously without awaiting\n checkForUpdates().catch(() => {\n // Silently ignore any errors\n });\n}\n"],
5
- "mappings": "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",
6
- "names": ["path", "createRequire", "Command", "randomUUID", "prompt", "fs", "randomUUID", "fs", "path", "path", "path", "extractErrorMessage", "fs", "os", "path", "extractErrorMessage", "info", "output", "fs", "path", "z", "prompt", "randomUUID", "query", "input", "createSdkMcpServer", "tool", "z", "randomUUID", "randomUUID", "EventEmitter", "path", "extractErrorMessage", "normalizeBaseUrl", "input", "randomBytes", "base64UrlEncode", "input", "input", "extractErrorMessage", "EventEmitter", "extractErrorMessage", "randomUUID", "input", "output", "path", "readline", "WebSocket", "safeStringify", "path", "extractErrorMessage", "buildRelayWebsocketUrl", "path", "Command", "Command", "extractErrorMessage", "require", "packageJson", "require", "createRequire", "Command", "path"]
3
+ "sources": ["../src/cli.ts", "../src/orchestrator/agent-orchestrator.ts", "../src/orchestrator/ai-client.ts", "../src/orchestrator/session.ts", "../src/orchestrator/utils/session-logger.ts", "../src/orchestrator/worker-manager.ts", "../src/orchestrator/tools/worker-status-tool.ts", "../src/orchestrator/utils/async-queue.ts", "../src/orchestrator/utils/worktree-manager.ts", "../src/utils/logger.ts", "../src/auth/credentials-store.ts", "../src/config/omnara-config.ts", "../src/orchestrator/tools/worker-tools.ts", "../src/orchestrator/orchestrator-prompt.ts", "../src/orchestrator/utils/completions-manager.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/machine_message.schema.json", "../../shared-js/schemas/api_voice_launch_request.schema.json", "../../shared-js/schemas/api_voice_launch_response.schema.json", "../../shared-js/schemas/api_sessions_create_request.schema.json", "../../shared-js/schemas/api_sessions_summary.schema.json", "../../shared-js/schemas/api_sessions_list_response.schema.json", "../../shared-js/schemas/api_sessions_message_page_response.schema.json", "../../shared-js/schemas/api_sessions_agent_detail.schema.json", "../../shared-js/schemas/api_sessions_create_chat_message_request.schema.json", "../../shared-js/schemas/api_billing_subscription_response.schema.json", "../../shared-js/schemas/api_billing_usage_response.schema.json", "../../shared-js/schemas/api_billing_create_checkout_request.schema.json", "../../shared-js/schemas/api_billing_checkout_response.schema.json", "../../shared-js/schemas/api_billing_validate_promo_request.schema.json", "../../shared-js/schemas/api_billing_promo_validation_response.schema.json", "../../shared-js/schemas/api_billing_customer_portal_request.schema.json", "../../shared-js/schemas/api_billing_customer_portal_response.schema.json", "../../shared-js/schemas/api_settings_notification_request.schema.json", "../../shared-js/schemas/api_settings_notification_response.schema.json", "../../shared-js/schemas/workspace_config.schema.json", "../../shared-js/schemas/api_workspaces_session_launch_request.schema.json", "../../shared-js/schemas/api_workspaces_session_launch_response.schema.json", "../../shared-js/schemas/api_machines_list_response.schema.json", "../src/commands/agent.ts", "../src/commands/auth.ts", "../src/commands/daemon.ts", "../src/daemon/daemon-launcher.ts", "../src/daemon/daemon-client.ts", "../src/daemon/state-store.ts", "../src/daemon/paths.ts", "../src/daemon/directory-registry.ts", "../src/daemon/config-store.ts", "../src/daemon/local-control-server.ts", "../src/daemon/machine-supervisor.ts", "../src/http/machines.ts", "../src/http/workspaces.ts", "../src/daemon/session-runner.ts", "../src/daemon/session-log-manager.ts", "../src/daemon/session-pid-registry.ts", "../src/package-info.ts", "../src/daemon/daemon-service.ts", "../src/daemon/file-logger.ts", "../src/daemon/run-daemon.ts", "../src/auth/ensure-cli-credentials.ts", "../src/utils/version-check.ts", "../src/utils/claude-code-check.ts"],
4
+ "sourcesContent": ["import path from 'path';\nimport { Command } from 'commander';\nimport {\n buildAuthCommand,\n buildDaemonCommand,\n type OrchestratorOptions,\n} from './commands/index.js';\nimport { attemptUpdate } from './utils/version-check.js';\nimport { performClaudeCodeCheck } from './utils/claude-code-check.js';\nimport { logger } from './utils/logger.js';\nimport { DaemonClient, HttpError } from './daemon/daemon-client.js';\nimport { ensureDaemonForSession, killAllDaemonProcesses } from './daemon/daemon-launcher.js';\nimport { ensureCliCredentials } from './auth/ensure-cli-credentials.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from './auth/login-flow.js';\nimport { PACKAGE_DESCRIPTION, PACKAGE_VERSION } from './package-info.js';\nimport { USER_SESSION_LOG_ROOT } from './daemon/paths.js';\nimport { tryOpenBrowser } from './utils/browser.js';\nimport chalk from 'chalk';\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('omnara')\n .description(PACKAGE_DESCRIPTION)\n .version(PACKAGE_VERSION)\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 launchSessionViaDaemon(options);\n });\n\n // Register top-level commands here.\n program.addCommand(buildAuthCommand());\n program.addCommand(buildDaemonCommand());\n program\n .command('kill-all')\n .description('Force kill every running Omnara daemon and session process (no login required).')\n .action(async () => {\n await killAllDaemonProcesses({ logger });\n });\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\n const authenticated = await performClaudeCodeCheck();\n if (!authenticated) {\n return;\n }\n\n // Check for updates in the background (non-blocking)\n const reinstalled = await attemptUpdate();\n if (reinstalled) {\n return;\n }\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\nasync function launchSessionViaDaemon(options: OrchestratorOptions = {}): Promise<void> {\n try {\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n await ensureCliCredentials({ backendUrl, frontendUrl, logger });\n await ensureDaemonForSession({\n cwd: process.cwd(),\n logger,\n reason: 'foreground-session',\n backendUrl,\n frontendUrl,\n });\n const client = new DaemonClient();\n const launch = await requestDaemonLaunch(\n client,\n { path: process.cwd() },\n {\n timeoutMs: 10_000,\n delayMs: 250,\n logger,\n },\n );\n if (!launch) {\n logger.error('Timed out waiting for the daemon control server. Session was not started.');\n return;\n }\n if (launch.status !== 'ok') {\n logger.warn(`Daemon reported launch status ${launch.status}`);\n return;\n }\n const payload = launch.payload ?? null;\n if (!payload) {\n logger.warn('Daemon acknowledged launch without details. Check daemon logs for progress.');\n return;\n }\n logger.important(chalk.blue('Launching a new session.'));\n logger.info(`Workspace: ${payload.workspace_id}`);\n logger.info(`User session: ${payload.user_session_id}`);\n logger.info(`Launch id: ${payload.launch_id}`);\n logger.important(\n chalk.gray(\n `\\nSession logs: ${formatSessionLogPath(payload.workspace_id, payload.launch_id)}`,\n ),\n );\n const dashboardUrl = buildDashboardUrl(frontendUrl, payload.user_session_id);\n if (dashboardUrl) {\n logger.important(\n chalk.blue(\n `\\n${chalk.bold('Chat via the Omnara mobile app or web dashboard')}: ${chalk.underline(chalk.blueBright(dashboardUrl))}\\n`,\n ),\n );\n tryOpenBrowser(dashboardUrl);\n } else {\n logger.important(\n chalk.blue(\n `\\n${chalk.bold('Chat via the Omnara mobile app or web dashboard')}: ${chalk.underline(chalk.blueBright(frontendUrl + '/dashboard'))}\\n`,\n ),\n );\n }\n return;\n } catch (error) {\n logger.warn(`Failed to prepare daemon: ${(error as Error).message}`);\n }\n}\n\nasync function requestDaemonLaunch(\n client: DaemonClient,\n payload: { path: string; initialPrompt?: string; userSessionId?: string },\n options: { timeoutMs?: number; delayMs?: number; logger: typeof logger },\n): Promise<Awaited<ReturnType<DaemonClient['launchSession']>>> {\n const timeoutMs = options.timeoutMs ?? 10_000;\n const delayMs = options.delayMs ?? 250;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n try {\n const result = await client.launchSession(payload);\n if (result) {\n return result;\n }\n } catch (error) {\n if (isRecoverableLaunchError(error)) {\n options.logger.debug('Daemon not ready for launch yet:', (error as Error).message);\n } else {\n throw error;\n }\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n return null;\n}\n\nfunction formatSessionLogPath(workspaceId: string, launchId: string): string {\n return path.join(USER_SESSION_LOG_ROOT, workspaceId, `launch-${launchId}.log`);\n}\n\nfunction buildDashboardUrl(frontendUrl: string, userSessionId: string): string | null {\n try {\n const url = new URL('dashboard', frontendUrl);\n url.searchParams.set('session', userSessionId);\n return url.toString();\n } catch {\n return null;\n }\n}\n\nfunction isRecoverableLaunchError(error: unknown): boolean {\n if (error instanceof HttpError) {\n if (error.statusCode === 401) {\n return false;\n }\n const haystack = buildErrorHaystack(error.body ?? '', error.message);\n return (\n haystack.includes('machine has not been registered') ||\n haystack.includes('machine has not finished registering') ||\n (haystack.includes('directory') && haystack.includes('not registered'))\n );\n }\n if (error instanceof Error && error.message) {\n const haystack = buildErrorHaystack('', error.message);\n return (\n haystack.includes('machine has not been registered') ||\n haystack.includes('machine has not finished registering')\n );\n }\n if (isConnectionError(error)) {\n return true;\n }\n return false;\n}\n\nfunction buildErrorHaystack(body: string, message: string): string {\n return `${body} ${message}`.toLowerCase();\n}\n\nfunction isConnectionError(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n typeof (error as { code?: unknown }).code === 'string' &&\n ['ECONNREFUSED', 'ECONNRESET', 'ENOENT'].includes(\n (error as { code: string }).code.toString(),\n ),\n );\n}\n", "import { randomUUID } from 'crypto';\nimport {\n AIClient,\n BASE_ALLOWED_ORCHESTRATOR_TOOLS,\n BASE_ALLOWED_WORKER_TOOLS,\n type AgentClient,\n} from './ai-client.js';\nimport { Session } from './session.js';\nimport { WorkerManager, type WorkerRecord, type WorkerMessageEvent } from './worker-manager.js';\nimport { createWorkerMcpServer } from './tools/worker-tools.js';\nimport type { InboundMessage, OutboundMessage } from './orchestrator-types.js';\nimport { ORCHESTRATOR_SYSTEM_PROMPT } from './orchestrator-prompt.js';\nimport { type McpServerConfig } from '@anthropic-ai/claude-agent-sdk';\nimport type { ControlMessageSchema } from '@omnara/shared-js/schemas';\nimport { CompletionsManager } from './utils/completions-manager.js';\nimport { readOmnaraConfig, isWorktreesEnabled } from '../config/omnara-config.js';\nimport { logger } from '../utils/logger.js';\n\ninterface AgentOrchestratorDependencies {\n createMainClient?: () => AgentClient;\n createWorkerClient?: (mcpServers?: Record<string, McpServerConfig>, cwd?: string) => AgentClient;\n workerManager?: WorkerManager;\n repoPath?: string;\n worktreesEnabled?: boolean;\n worktreesBaseRef?: string;\n}\n\nconst WORKER_LAUNCH_TOOL = 'mcp__worker__launch_worker';\nconst WORKER_GET_TOOL = 'mcp__worker__get_workers';\nconst WORKER_MESSAGE_TOOL = 'mcp__worker__message_worker';\n\ninterface ClientConnection {\n id: string;\n sessionIds: Set<string>;\n send: (message: OutboundMessage) => void;\n canSend?: () => boolean;\n close?: () => void;\n}\n\nexport interface AgentOrchestratorClientAdapter {\n send: (message: OutboundMessage) => void;\n canSend?: () => boolean;\n close?: () => void;\n}\n\nexport interface AgentOrchestratorConnection {\n id: string;\n dispatch(message: InboundMessage): void;\n disconnect(): void;\n}\n\nexport class AgentOrchestrator {\n private readonly completionsManager: CompletionsManager;\n private readonly aiClient: AgentClient;\n private readonly workerManager: WorkerManager;\n private readonly sessions = new Map<string, Session>();\n private readonly clients = new Map<string, ClientConnection>();\n private readonly toolUseMap = new Map<string, string>();\n // Track the main coding session (parent_session_id = null, type = CODE)\n private mainCodingSessionId: string | null = null;\n // Track voice sessions to filter out their messages\n readonly voiceSessionIds = new Set<string>(); // Made non-private for relay-bridge access\n\n private started = false;\n\n constructor(dependencies?: AgentOrchestratorDependencies) {\n const resolveSessionIdBySdk = (sdkSessionId?: string) =>\n this.findSessionIdBySdkSession(sdkSessionId);\n\n const workerClientFactory =\n dependencies?.createWorkerClient ??\n ((mcpServers?: Record<string, McpServerConfig>, cwd?: string) =>\n new AIClient({\n defaults: {\n allowedTools: [...BASE_ALLOWED_WORKER_TOOLS, 'mcp__worker_status__send_status_update'],\n mcpServers,\n cwd: cwd || process.cwd(),\n },\n }));\n\n this.workerManager =\n dependencies?.workerManager ??\n new WorkerManager({\n createClient: workerClientFactory,\n resolveSessionIdBySdk,\n repoPath: dependencies?.repoPath ?? process.cwd(),\n worktreesEnabled: dependencies?.worktreesEnabled ?? false,\n worktreesBaseRef: dependencies?.worktreesBaseRef,\n });\n\n const workerMcpServer = createWorkerMcpServer(this.workerManager, {\n resolveSessionIdBySdk,\n resolveSessionIdByToolUse: (toolUseId: string) => this.consumeToolUse(toolUseId),\n // Always use main coding session as parent for workers\n getMainCodingSessionId: () => this.mainCodingSessionId,\n });\n\n const mainClientFactory =\n dependencies?.createMainClient ??\n (() =>\n new AIClient({\n defaults: {\n allowedTools: [\n ...BASE_ALLOWED_ORCHESTRATOR_TOOLS,\n WORKER_LAUNCH_TOOL,\n WORKER_GET_TOOL,\n WORKER_MESSAGE_TOOL,\n ],\n mcpServers: {\n worker: workerMcpServer,\n },\n systemPrompt: ORCHESTRATOR_SYSTEM_PROMPT,\n },\n }));\n\n this.aiClient = mainClientFactory();\n\n this.registerWorkerListeners();\n\n this.completionsManager = new CompletionsManager();\n }\n\n ensureSessionExists(sessionId: string): Session {\n const existing = this.sessions.get(sessionId);\n if (existing) {\n return existing;\n }\n const session = new Session(\n sessionId,\n this.aiClient,\n (id) => this.handleSessionEmpty(id),\n (toolUseId) => this.registerToolUse(toolUseId, sessionId),\n );\n this.sessions.set(sessionId, session);\n return session;\n }\n\n getSession(sessionId: string): Session | undefined {\n return this.sessions.get(sessionId);\n }\n\n getWorkerManager(): WorkerManager {\n return this.workerManager;\n }\n\n setMainCodingSessionId(sessionId: string): void {\n if (!this.mainCodingSessionId) {\n this.mainCodingSessionId = sessionId;\n console.log(`[Orchestrator] Set main coding session: ${this.mainCodingSessionId}`);\n }\n }\n\n addClient(adapter: AgentOrchestratorClientAdapter): AgentOrchestratorConnection {\n const clientId = randomUUID();\n const connection: ClientConnection = {\n id: clientId,\n sessionIds: new Set(),\n send: adapter.send,\n canSend: adapter.canSend,\n close: adapter.close,\n };\n\n this.clients.set(clientId, connection);\n\n let disconnected = false;\n const disconnect = (): void => {\n if (disconnected) {\n return;\n }\n disconnected = true;\n this.handleDisconnect(connection);\n try {\n connection.close?.();\n } catch (error) {\n console.error('Failed to close client connection:', error);\n }\n };\n\n return {\n id: clientId,\n dispatch: (message: InboundMessage) => {\n this.handleClientMessage(connection, message);\n },\n disconnect,\n };\n }\n\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n this.started = true;\n }\n\n async stop(): Promise<void> {\n // Shutdown worker manager first to clean up all worktrees\n await this.workerManager.shutdown();\n\n for (const connection of Array.from(this.clients.values())) {\n this.handleDisconnect(connection);\n try {\n connection.close?.();\n } catch (error) {\n console.error('Failed to close client connection:', error);\n }\n }\n this.clients.clear();\n\n for (const session of this.sessions.values()) {\n session.close();\n }\n this.sessions.clear();\n this.started = false;\n }\n\n async cancel(): Promise<void> {\n await Promise.all(\n this.getWorkerManager()\n .listWorkers()\n .filter((w) => w.status === 'running')\n .map((worker) => {\n return this.getWorkerManager().cancelWorker(worker.id);\n }),\n );\n await this.aiClient.cancel();\n }\n\n private handleDisconnect(connection: ClientConnection): void {\n for (const sessionId of connection.sessionIds) {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.unsubscribe(connection.id);\n }\n }\n\n this.clients.delete(connection.id);\n }\n\n private handleClientMessage(connection: ClientConnection, message: InboundMessage): void {\n switch (message.type) {\n case 'chat':\n this.handleChatMessage(connection, message);\n break;\n case 'session_init':\n this.handleSessionInit(connection, message);\n break;\n case 'join':\n this.handleJoin(connection, message.sessionId);\n break;\n case 'leave':\n this.handleLeave(connection, message.sessionId);\n break;\n case 'ping':\n this.sendToConnection(connection, { type: 'pong' });\n break;\n case 'cancel_worker':\n this.handleCancelWorker(connection, message.workerId);\n break;\n default:\n this.sendToConnection(connection, {\n type: 'error',\n message: `Unsupported message type: ${(message as { type: string }).type}`,\n });\n }\n }\n\n private handleSessionInit(\n connection: ClientConnection,\n message: Extract<InboundMessage, { type: 'session_init' }>,\n ): void {\n // Track the main coding session (parent = null, type = CODE)\n if (!message.parentSessionId && message.metadata?.session_type === 'CODE') {\n this.mainCodingSessionId = message.sessionId;\n console.log(`[Orchestrator] Set main coding session: ${this.mainCodingSessionId}`);\n }\n\n // Track voice sessions to filter out their messages\n if (message.metadata?.session_type === 'VOICE') {\n this.voiceSessionIds.add(message.sessionId);\n console.log(`[Orchestrator] Tracking voice session from init:`, {\n sessionId: message.sessionId,\n sessionType: message.metadata?.session_type,\n parentSessionId: message.parentSessionId,\n currentVoiceSessions: Array.from(this.voiceSessionIds),\n });\n }\n\n this.sendToConnection(connection, {\n type: 'session_init_ack',\n sessionId: message.sessionId,\n parentSessionId: message.parentSessionId ?? null,\n });\n }\n\n private handleChatMessage(\n connection: ClientConnection,\n message: Extract<InboundMessage, { type: 'chat' }>,\n ): void {\n console.log('[Orchestrator] handleChatMessage:', {\n sessionId: message.sessionId,\n senderId: message.senderId,\n senderKind: message.senderKind,\n mainCodingSessionId: this.mainCodingSessionId,\n isVoiceSession: message.sessionId ? this.voiceSessionIds.has(message.sessionId) : false,\n textPreview: message.text.substring(0, 100),\n });\n\n // Filter out messages TO voice sessions - they should be handled by voice agent, not orchestrator\n if (message.sessionId && this.voiceSessionIds.has(message.sessionId)) {\n console.log('[Orchestrator] Ignoring message to voice session:', message.sessionId);\n return;\n }\n\n let session: Session | undefined;\n let sessionId = message.sessionId;\n\n if (sessionId) {\n session = this.sessions.get(sessionId);\n if (!session) {\n this.sendToConnection(connection, {\n type: 'error',\n sessionId,\n message: 'Session not found.',\n });\n return;\n }\n } else {\n session = this.createSession();\n sessionId = session.id;\n this.sendToConnection(connection, {\n type: 'session_created',\n sessionId,\n });\n }\n\n if (!connection.sessionIds.has(sessionId)) {\n session.subscribe({\n id: connection.id,\n send: (payload) => {\n this.sendToConnection(connection, payload);\n },\n canSend: connection.canSend,\n });\n connection.sessionIds.add(sessionId);\n }\n\n session.logInbound({ type: 'chat', text: message.text });\n session.announceInboundMessage(message.text, 'user');\n session.enqueueUserMessage(message.text);\n }\n\n private handleJoin(connection: ClientConnection, sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.sendToConnection(connection, {\n type: 'error',\n sessionId,\n message: 'Session not found.',\n });\n return;\n }\n\n if (!connection.sessionIds.has(sessionId)) {\n session.subscribe({\n id: connection.id,\n send: (payload) => {\n this.sendToConnection(connection, payload);\n },\n canSend: connection.canSend,\n });\n connection.sessionIds.add(sessionId);\n } else {\n this.sendToConnection(connection, {\n type: 'session_joined',\n sessionId,\n });\n }\n }\n\n private handleLeave(connection: ClientConnection, sessionId: string): void {\n if (!connection.sessionIds.has(sessionId)) {\n this.sendToConnection(connection, {\n type: 'error',\n sessionId,\n message: 'You are not subscribed to this session.',\n });\n return;\n }\n\n connection.sessionIds.delete(sessionId);\n const session = this.sessions.get(sessionId);\n if (session) {\n session.unsubscribe(connection.id);\n }\n }\n\n private handleCancelWorker(connection: ClientConnection, workerId: string): void {\n const canceled = this.workerManager.cancelWorker(workerId);\n if (!canceled) {\n this.sendToConnection(connection, {\n type: 'error',\n message: `Worker ${workerId} not found or not running.`,\n });\n }\n }\n\n private createSession(): Session {\n const sessionId = randomUUID();\n return this.ensureSessionExists(sessionId);\n }\n\n private registerToolUse(toolUseId: string, sessionId: string): void {\n this.toolUseMap.set(toolUseId, sessionId);\n }\n\n private consumeToolUse(toolUseId: string): string | undefined {\n const sessionId = this.toolUseMap.get(toolUseId);\n if (sessionId) {\n this.toolUseMap.delete(toolUseId);\n }\n return sessionId;\n }\n\n private handleSessionEmpty(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return;\n }\n\n if (!session.hasSubscribers()) {\n session.close();\n this.sessions.delete(sessionId);\n }\n }\n\n private registerWorkerListeners(): void {\n this.workerManager.on('session_start', (record) => {\n this.handleWorkerSessionStart(record);\n });\n\n this.workerManager.on('message', (event: WorkerMessageEvent) => {\n this.handleWorkerMessage(event);\n });\n\n this.workerManager.on('update', (record) => {\n this.broadcastAgentProgress(record);\n });\n\n this.workerManager.on('completed', (record) => {\n this.broadcastAgentProgress(record);\n this.handleWorkerCompletion(record);\n });\n }\n\n private broadcastAgentProgress(record: WorkerRecord): void {\n const progress = this.buildAgentProgress(record);\n // Worker progress updates should use the worker's own session ID\n const targetSessionId = record.sessionId;\n console.log('[Orchestrator] Broadcasting agent_progress:', {\n agentSessionId: record.sessionId,\n task: record.task,\n status: progress.status,\n originSessionId: record.originSessionId,\n });\n this.broadcastToAll({\n type: 'agent_progress',\n sessionId: targetSessionId,\n status: progress.status,\n detail: progress.detail,\n metadata: progress.metadata,\n messageId: randomUUID(), // Always use a valid UUID for message_id\n });\n }\n\n private buildAgentProgress(record: WorkerRecord): {\n status: string;\n detail?: string;\n metadata?: Record<string, unknown>;\n } {\n const latest =\n record.progress.length > 0 ? record.progress[record.progress.length - 1]?.message : undefined;\n\n // Create a concise one-line summary\n let summary: string | undefined;\n if (record.status === 'completed') {\n summary = record.result || `Task \"${record.task}\" completed`;\n } else if (record.status === 'error') {\n summary = `Task \"${record.task}\" failed: ${record.error || 'Unknown error'}`;\n } else if (record.status === 'canceled') {\n summary = `Task \"${record.task}\" was canceled`;\n } else if (record.status === 'running') {\n summary = latest || `Task \"${record.task}\" is running`;\n }\n\n const detail = summary ?? latest ?? undefined;\n\n const metadata: Record<string, unknown> = {\n agent_session_id: record.sessionId,\n task: record.task,\n last_update_at: record.lastUpdateAt,\n };\n\n if (record.originSessionId) {\n metadata.origin_session_id = record.originSessionId;\n }\n if (latest) {\n metadata.latest_message = latest;\n }\n if (record.result) {\n metadata.result = record.result;\n }\n if (record.error) {\n metadata.error = record.error;\n }\n\n return {\n status: record.status,\n detail,\n metadata,\n };\n }\n\n private handleWorkerSessionStart(record: WorkerRecord): void {\n // Include task in metadata for persistence\n const metadata = {\n ...record.metadata,\n task: record.task,\n };\n\n this.broadcastToAll({\n type: 'session_init',\n sessionId: record.sessionId,\n parentSessionId: record.originSessionId ?? null,\n metadata,\n messageId: randomUUID(),\n });\n }\n\n private handleWorkerMessage(event: WorkerMessageEvent): void {\n console.log('[Orchestrator] handleWorkerMessage:', {\n messageType: event.messageType,\n workerId: event.record.id,\n task: event.record.task,\n workerSessionId: event.record.sessionId,\n originSessionId: event.record.originSessionId,\n });\n\n // Worker messages should use the worker's own session ID\n // The parent-child relationship is already established via session_init\n const targetSessionId = event.record.sessionId;\n\n switch (event.messageType) {\n case 'assistant_text':\n if (!event.text) {\n return;\n }\n this.broadcastToAll({\n type: 'assistant_text',\n sessionId: targetSessionId,\n text: event.text,\n workerId: event.record.id,\n workerTask: event.record.task,\n messageId: randomUUID(),\n });\n break;\n case 'assistant_complete':\n {\n const completionMetadata: Record<string, unknown> = {\n agent_session_id: event.record.id,\n task: event.record.task,\n };\n if (event.record.originSessionId) {\n completionMetadata.origin_session_id = event.record.originSessionId;\n }\n this.broadcastToAll({\n type: 'agent_complete',\n sessionId: targetSessionId,\n success: event.success ?? true,\n message: event.text,\n metadata: completionMetadata,\n messageId: randomUUID(),\n });\n }\n break;\n case 'tool_call':\n if (!event.toolName || !event.toolUseId) {\n return;\n }\n console.log('[Orchestrator] Broadcasting worker tool_call:', {\n toolName: event.toolName,\n workerId: event.record.id,\n task: event.record.task,\n targetSessionId,\n toolUseId: event.toolUseId,\n });\n this.broadcastToAll({\n type: 'tool_call',\n sessionId: targetSessionId,\n toolName: event.toolName,\n toolUseId: event.toolUseId,\n input: event.toolInput,\n workerId: event.record.id,\n workerTask: event.record.task,\n messageId: randomUUID(),\n });\n break;\n case 'tool_result':\n if (!event.toolUseId) {\n return;\n }\n console.log('[Orchestrator] Broadcasting worker tool_result:', {\n toolName: event.toolName,\n workerId: event.record.id,\n task: event.record.task,\n targetSessionId,\n toolUseId: event.toolUseId,\n });\n this.broadcastToAll({\n type: 'tool_result',\n sessionId: targetSessionId,\n toolUseId: event.toolUseId,\n content: event.toolContent,\n isError: event.isError,\n workerId: event.record.id,\n workerTask: event.record.task,\n messageId: randomUUID(),\n });\n break;\n default:\n break;\n }\n }\n\n private handleWorkerCompletion(record: WorkerRecord): void {\n const sessionId = record.originSessionId;\n if (!sessionId) {\n return;\n }\n\n const session = this.sessions.get(sessionId);\n if (!session) {\n return;\n }\n\n const summary = this.buildWorkerSummary(record);\n if (!summary) {\n return;\n }\n\n // Broadcast result message for worker with task context to parent session\n const success = record.status === 'completed';\n const durationMs = record.lastUpdateAt - record.startedAt;\n const metadata: Record<string, unknown> = {\n agent_session_id: record.sessionId,\n task: record.task,\n origin_session_id: record.originSessionId,\n };\n if (record.result) {\n metadata.result = record.result;\n }\n if (record.error) {\n metadata.error = record.error;\n }\n\n this.broadcastToAll({\n type: 'agent_complete',\n sessionId: record.sessionId, // Use worker's session ID\n success,\n durationMs,\n message: `[${record.task}] ${summary}`,\n metadata,\n messageId: randomUUID(),\n });\n\n session.logInbound({\n type: 'worker_result',\n workerId: record.id,\n workerTask: record.task,\n summary,\n });\n session.announceInboundMessage(summary, 'worker', record.id, record.task);\n\n // Send comprehensive worker status message to orchestrator's conversation for LLM context\n const statusMessage = this.buildWorkerStatusMessage(record.id);\n session.enqueueUserMessage(statusMessage, {\n triggeredBy: 'worker_completion',\n workerId: record.id,\n workerTask: record.task,\n });\n }\n\n private buildWorkerSummary(record: WorkerRecord): string | null {\n switch (record.status) {\n case 'completed':\n return record.result ?? `Worker ${record.id} completed.`;\n case 'error':\n return `Worker ${record.id} failed: ${record.error ?? 'Unknown error.'}`;\n case 'canceled':\n return `Worker ${record.id} was canceled.`;\n default:\n return null;\n }\n }\n\n /**\n * Build a comprehensive worker status message showing ALL workers,\n * with special highlighting for the worker that triggered this generation.\n */\n private buildWorkerStatusMessage(triggerWorkerId: string): string {\n const allWorkers = this.workerManager.listWorkers();\n\n if (allWorkers.length === 0) {\n return '\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n[AUTOMATED SYSTEM NOTIFICATION: WORKER STATUS UPDATE]\\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\\nNo active workers.\\n\\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\nEND OF AUTOMATED NOTIFICATION\\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550';\n }\n\n const lines: string[] = [\n '\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550',\n '[AUTOMATED SYSTEM NOTIFICATION: WORKER STATUS UPDATE]',\n '\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550',\n '',\n 'This is an automated notification triggered by a worker completion.',\n 'You should provide an INCREMENTAL summary of only the NEW completion to the user.',\n '',\n ];\n\n for (const worker of allWorkers) {\n const isTrigger = worker.id === triggerWorkerId;\n const prefix = isTrigger ? '>>> ' : ' ';\n const triggerNote = isTrigger ? ' \u2190 JUST COMPLETED (triggered this generation)' : '';\n\n const latestMsg =\n worker.progress.length > 0\n ? worker.progress[worker.progress.length - 1]?.message\n : undefined;\n\n lines.push(`${prefix}Task: \"${worker.task}\"${triggerNote}`);\n lines.push(`${prefix}Status: ${worker.status}`);\n lines.push(`${prefix}Worker ID: ${worker.id}`);\n\n if (worker.status === 'completed') {\n // For completed workers, include the full result and progress log\n if (worker.result) {\n lines.push(`${prefix}Result: ${worker.result}`);\n }\n\n // Include the full progress log so orchestrator can see everything the worker did\n if (worker.progress.length > 0) {\n lines.push(`${prefix}Full Progress Log:`);\n for (const entry of worker.progress) {\n // Format timestamp as relative time\n const timestamp = new Date(entry.timestamp).toISOString();\n lines.push(`${prefix} [${timestamp}] ${entry.message}`);\n }\n }\n } else if (worker.status === 'error' && worker.error) {\n lines.push(`${prefix}Error: ${worker.error}`);\n\n // Include progress log for errors too, to see what led to the failure\n if (worker.progress.length > 0) {\n lines.push(`${prefix}Progress Before Error:`);\n for (const entry of worker.progress) {\n const timestamp = new Date(entry.timestamp).toISOString();\n lines.push(`${prefix} [${timestamp}] ${entry.message}`);\n }\n }\n } else if (worker.status === 'running' && latestMsg) {\n lines.push(`${prefix}Latest: ${latestMsg}`);\n }\n\n lines.push('');\n }\n\n lines.push('\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550');\n lines.push('END OF AUTOMATED NOTIFICATION');\n lines.push('\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550');\n\n return lines.join('\\n');\n }\n\n private broadcastToAll(message: OutboundMessage): void {\n for (const connection of this.clients.values()) {\n this.sendToConnection(connection, message);\n }\n }\n\n private findSessionIdBySdkSession(sdkSessionId?: string): string | undefined {\n if (!sdkSessionId) {\n return undefined;\n }\n for (const [serverId, session] of this.sessions.entries()) {\n if (session.sdkSessionIdentifier === sdkSessionId) {\n return serverId;\n }\n }\n return undefined;\n }\n\n private sendToConnection(connection: ClientConnection, message: OutboundMessage): void {\n if (connection.canSend && !connection.canSend()) {\n return;\n }\n try {\n connection.send(message);\n } catch (error) {\n console.error('Failed to send message to client:', error);\n this.handleDisconnect(connection);\n }\n }\n\n async getCompletions(\n request: ControlMessageSchema.CompletionsRequest,\n ): Promise<ControlMessageSchema.CompletionsResponse> {\n return {\n type: 'completions',\n completions: await this.completionsManager.getCompletion(request.query),\n };\n }\n}\n\nexport async function startAgentOrchestrator(\n dependencies?: AgentOrchestratorDependencies,\n): Promise<AgentOrchestrator> {\n // Read config before creating orchestrator to avoid race condition\n let worktreesEnabled = dependencies?.worktreesEnabled ?? false;\n let worktreesBaseRef = dependencies?.worktreesBaseRef;\n\n // Only read config if worktree settings aren't explicitly provided\n if (dependencies?.worktreesEnabled === undefined) {\n try {\n const config = await readOmnaraConfig();\n worktreesEnabled = isWorktreesEnabled(config);\n worktreesBaseRef = config.worktrees?.base_ref ?? undefined;\n\n if (worktreesEnabled) {\n logger.info('Worktrees enabled via omnara.jsonc configuration');\n } else {\n logger.info('Worktrees disabled (no worktrees config found in omnara.jsonc)');\n }\n } catch (err) {\n logger.error('Failed to read omnara.jsonc configuration:', err);\n logger.info('Worktrees disabled due to config read error');\n worktreesEnabled = false;\n worktreesBaseRef = undefined;\n }\n }\n\n const server = new AgentOrchestrator({\n ...dependencies,\n worktreesEnabled,\n worktreesBaseRef,\n });\n await server.start();\n return server;\n}\n", "import fs from 'fs';\nimport {\n query,\n type Options,\n type Query,\n type SDKMessage,\n type SDKUserMessage,\n} from '@anthropic-ai/claude-agent-sdk';\n\nexport interface AIClientConfig {\n defaults?: Partial<Options>;\n}\n\nexport interface AgentClient {\n streamUserMessage(prompt: string, overrides?: Partial<Options>): AsyncIterable<SDKMessage>;\n createQuery(prompt: string | AsyncIterable<SDKUserMessage>, overrides?: Partial<Options>): Query;\n cancel(): Promise<void>;\n}\n\nexport const BASE_ALLOWED_ORCHESTRATOR_TOOLS = [\n 'Glob',\n 'Grep',\n 'LS',\n 'Read',\n 'WebFetch',\n 'WebSearch',\n 'TodoWrite',\n] as const;\n\nexport const BASE_ALLOWED_WORKER_TOOLS = [\n 'Task',\n 'Bash',\n 'Glob',\n 'Grep',\n 'LS',\n 'ExitPlanMode',\n 'Read',\n 'Edit',\n 'MultiEdit',\n 'Write',\n 'NotebookEdit',\n 'WebFetch',\n 'TodoWrite',\n 'WebSearch',\n 'BashOutput',\n 'KillBash',\n 'Skill',\n 'SlashCommand',\n] as const;\n\nexport class AIClient implements AgentClient {\n private readonly baseOptions: Options;\n private runningQuery?: Query;\n\n constructor(config?: AIClientConfig) {\n const defaultOptions: Options = {\n maxTurns: 100,\n model: 'sonnet',\n cwd: process.cwd(),\n includePartialMessages: false,\n allowedTools: [...BASE_ALLOWED_ORCHESTRATOR_TOOLS],\n settingSources: ['user', 'project', 'local'],\n };\n\n this.baseOptions = {\n ...defaultOptions,\n ...config?.defaults,\n };\n\n // Log when using a custom cwd (for debugging worktree isolation)\n if (this.baseOptions.cwd && this.baseOptions.cwd !== process.cwd()) {\n console.log('[AIClient] Using custom working directory:', this.baseOptions.cwd);\n }\n\n this.ensureWorkingDirectory(this.baseOptions.cwd);\n }\n\n async *streamUserMessage(\n prompt: string,\n overrides?: Partial<Options>,\n ): AsyncIterable<SDKMessage> {\n const q = this.createQuery(prompt, overrides);\n this.runningQuery = q;\n for await (const message of q) {\n yield message;\n }\n this.runningQuery = undefined;\n }\n\n createQuery(prompt: string | AsyncIterable<SDKUserMessage>, overrides?: Partial<Options>): Query {\n const merged: Options = {\n ...this.baseOptions,\n ...overrides,\n };\n\n this.ensureWorkingDirectory(merged.cwd);\n\n return query({\n prompt,\n options: merged,\n });\n }\n\n async cancel() {\n await this.runningQuery?.interrupt();\n }\n\n private ensureWorkingDirectory(cwd?: string): void {\n if (!cwd) {\n return;\n }\n try {\n fs.mkdirSync(cwd, { recursive: true });\n } catch (error) {\n console.warn(`Failed to ensure working directory ${cwd}:`, error);\n }\n }\n}\n", "import type {\n SDKAssistantMessage,\n SDKMessage,\n SDKResultMessage,\n} from '@anthropic-ai/claude-agent-sdk';\nimport { randomUUID } from 'crypto';\nimport type { AgentClient } from './ai-client.js';\nimport type { OutboundMessage, SessionSubscriber } from './orchestrator-types.js';\nimport { createSessionLogger, type SessionLogger } from './utils/session-logger.js';\n\ntype StreamEvent = {\n type: string;\n [key: string]: unknown;\n};\n\ntype ToolUseCallback = (toolUseId: string, sessionId: string) => void;\n\nexport class Session {\n readonly id: string;\n\n private readonly aiClient: AgentClient;\n private readonly subscribers = new Map<string, SessionSubscriber>();\n private readonly onEmpty: (sessionId: string) => void;\n private readonly onToolUse?: ToolUseCallback;\n private readonly logger: SessionLogger;\n\n private sdkSessionId: string | null = null;\n private inflight: Promise<void> | null = null;\n private lastActivity = Date.now();\n\n constructor(\n id: string,\n aiClient: AgentClient,\n onEmpty: (sessionId: string) => void,\n onToolUse?: ToolUseCallback,\n ) {\n this.id = id;\n this.aiClient = aiClient;\n this.onEmpty = onEmpty;\n this.onToolUse = onToolUse;\n this.logger = createSessionLogger(this.id);\n }\n\n announceInboundMessage(\n text: string,\n origin: 'user' | 'worker' = 'user',\n workerId?: string,\n workerTask?: string,\n ): void {\n if (!text) {\n return;\n }\n // Only broadcast worker-origin updates. User messages already show up via `chat` frames.\n if (origin !== 'worker') {\n return;\n }\n const message: OutboundMessage = {\n type: 'user_text',\n sessionId: this.id,\n text,\n origin,\n workerId,\n workerTask,\n messageId: randomUUID(),\n };\n this.broadcast(message);\n }\n\n get lastActiveAt(): number {\n return this.lastActivity;\n }\n\n get sdkSessionIdentifier(): string | null {\n return this.sdkSessionId;\n }\n\n subscribe(subscriber: SessionSubscriber): void {\n this.subscribers.set(subscriber.id, subscriber);\n this.safeSend(subscriber, {\n type: 'session_joined',\n sessionId: this.id,\n messageId: randomUUID(),\n });\n }\n\n unsubscribe(subscriberId: string): void {\n this.subscribers.delete(subscriberId);\n if (!this.hasSubscribers() && !this.inflight) {\n this.onEmpty(this.id);\n }\n }\n\n hasSubscribers(): boolean {\n return this.subscribers.size > 0;\n }\n\n close(): void {\n this.subscribers.clear();\n this.logger.close();\n }\n\n enqueueUserMessage(\n text: string,\n metadata?: { triggeredBy?: string; workerId?: string; workerTask?: string },\n ): void {\n this.lastActivity = Date.now();\n const previous = this.inflight;\n\n const task = async (): Promise<void> => {\n if (previous) {\n try {\n await previous;\n } catch {\n // Previous error already reported, continue with new message.\n }\n }\n\n await this.processUserMessage(text, metadata);\n };\n\n const promise = task()\n .catch((error: unknown) => {\n this.broadcast({\n type: 'error',\n sessionId: this.id,\n message: extractErrorMessage(error),\n messageId: randomUUID(),\n });\n })\n .finally(() => {\n if (this.inflight === promise) {\n this.inflight = null;\n this.lastActivity = Date.now();\n if (!this.hasSubscribers()) {\n this.onEmpty(this.id);\n }\n }\n });\n\n this.inflight = promise;\n }\n\n handleStreamEvent(event: StreamEvent): void {\n switch (event.type) {\n case 'content_block_delta': {\n const delta = event.delta as { type?: string; text?: string } | undefined;\n if (delta?.type === 'text_delta' && delta.text) {\n console.log('[Session] Streaming text delta:', delta.text.substring(0, 50));\n this.broadcast({\n type: 'assistant_text',\n sessionId: this.id,\n text: delta.text,\n messageId: randomUUID(),\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n private async processUserMessage(\n text: string,\n metadata?: { triggeredBy?: string; workerId?: string; workerTask?: string },\n ): Promise<void> {\n // Broadcast metadata about this generation trigger\n if (metadata?.triggeredBy === 'worker_completion') {\n this.broadcast({\n type: 'system',\n sessionId: this.id,\n subtype: 'generation_triggered',\n metadata: {\n triggeredBy: 'worker_completion',\n workerId: metadata.workerId,\n workerTask: metadata.workerTask,\n },\n messageId: randomUUID(),\n });\n }\n\n const options = this.sdkSessionId ? { resume: this.sdkSessionId } : undefined;\n\n for await (const message of this.aiClient.streamUserMessage(text, options)) {\n this.routeSdkMessage(message);\n }\n }\n\n private routeSdkMessage(message: SDKMessage): void {\n switch (message.type) {\n case 'assistant':\n this.handleAssistantMessage(message);\n break;\n case 'stream_event':\n this.handleStreamEvent(message.event as StreamEvent);\n break;\n case 'result':\n this.handleResultMessage(message);\n break;\n case 'system':\n this.handleSystemMessage(message);\n break;\n case 'user': {\n const textContent = extractUserContent(message.message.content);\n if (textContent) {\n this.broadcast({\n type: 'user_text',\n sessionId: this.id,\n text: textContent,\n messageId: randomUUID(),\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n private handleAssistantMessage(message: SDKAssistantMessage): void {\n const content = message.message.content;\n\n if (!Array.isArray(content)) {\n return;\n }\n\n console.log('[Session] Processing assistant message with', content.length, 'blocks');\n\n for (const block of content) {\n if (!block || typeof block !== 'object') {\n continue;\n }\n\n const typed = block as unknown as Record<string, unknown>;\n const blockType = typed.type;\n\n if (blockType === 'text' && typeof typed.text === 'string') {\n if (typed.text.length > 0) {\n console.log('[Session] Broadcasting assistant_text:', typed.text.substring(0, 100));\n this.broadcast({\n type: 'assistant_text',\n sessionId: this.id,\n text: typed.text,\n messageId: randomUUID(),\n });\n }\n } else if (blockType === 'tool_use') {\n const toolUseId = typeof typed.id === 'string' && typed.id ? typed.id : randomUUID();\n console.log('[Session] Broadcasting tool_call:', typed.name, 'id:', toolUseId);\n this.broadcast({\n type: 'tool_call',\n sessionId: this.id,\n toolName: typeof typed.name === 'string' ? typed.name : 'unknown',\n toolUseId,\n input: typed.input,\n messageId: randomUUID(), // Always use a valid UUID for message_id\n });\n this.onToolUse?.(toolUseId, this.id);\n } else if (blockType === 'tool_result') {\n const toolResultId =\n typeof typed.tool_use_id === 'string' && typed.tool_use_id\n ? typed.tool_use_id\n : randomUUID();\n console.log('[Session] Broadcasting tool_result:', toolResultId);\n this.broadcast({\n type: 'tool_result',\n sessionId: this.id,\n toolUseId: toolResultId,\n content: typed.content,\n isError: Boolean(typed.is_error),\n messageId: randomUUID(), // Always use a valid UUID for message_id\n });\n }\n }\n }\n\n private handleResultMessage(message: SDKResultMessage): void {\n const success = message.subtype === 'success';\n this.broadcast({\n type: 'agent_complete',\n sessionId: this.id,\n success,\n durationMs: message.duration_ms,\n costUsd: message.total_cost_usd,\n message: success ? message.result : `Error: ${message.subtype}`,\n messageId: randomUUID(),\n });\n }\n\n private handleSystemMessage(message: Extract<SDKMessage, { type: 'system' }>): void {\n if (message.subtype === 'init') {\n this.sdkSessionId = message.session_id;\n }\n this.broadcast({\n type: 'system',\n sessionId: this.id,\n subtype: message.subtype,\n messageId: randomUUID(),\n });\n }\n\n logInbound(payload: unknown): void {\n this.logger.logInbound(payload);\n }\n\n private broadcast(message: OutboundMessage): void {\n this.logger.logOutbound(message);\n for (const [id, subscriber] of this.subscribers) {\n if (subscriber.canSend && !subscriber.canSend()) {\n this.subscribers.delete(id);\n continue;\n }\n this.safeSend(subscriber, message);\n }\n }\n\n private safeSend(subscriber: SessionSubscriber, message: OutboundMessage): void {\n try {\n subscriber.send(message);\n } catch {\n this.subscribers.delete(subscriber.id);\n }\n }\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n try {\n return JSON.stringify(error);\n } catch {\n return 'Unknown error';\n }\n}\n\nfunction extractUserContent(content: unknown): string | null {\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n const texts: string[] = [];\n for (const part of content) {\n if (\n part &&\n typeof part === 'object' &&\n 'type' in part &&\n (part as Record<string, unknown>).type === 'text' &&\n typeof (part as Record<string, unknown>).text === 'string'\n ) {\n texts.push((part as Record<string, unknown>).text as string);\n }\n }\n if (texts.length > 0) {\n return texts.join('');\n }\n }\n\n return null;\n}\n", "import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport type { OutboundMessage } from '../orchestrator-types.js';\n\nfunction getLogDir(): string {\n return process.env.OMNARA_LOG_DIR ?? path.join(os.homedir(), '.omnara', 'omnara-voice');\n}\n\nfunction ensureLogDir(): string {\n const dir = getLogDir();\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // ignore\n }\n return dir;\n}\n\nexport type SessionLogger = {\n logInbound: (payload: unknown) => void;\n logOutbound: (message: OutboundMessage) => void;\n close: () => void;\n};\n\nexport function createSessionLogger(sessionId: string): SessionLogger {\n const dir = ensureLogDir();\n const filePath = path.join(dir, `${sessionId}.log`);\n const stream = fs.createWriteStream(filePath, { flags: 'a' });\n\n const logLine = (direction: 'in' | 'out', payload: unknown) => {\n const timestamp = new Date().toISOString();\n const serialized = safeStringify(payload);\n stream.write(`${timestamp} [${direction}] ${serialized}\\n`);\n };\n\n return {\n logInbound: (payload) => logLine('in', payload),\n logOutbound: (message) => logLine('out', message),\n close: () => {\n try {\n stream.end();\n } catch {\n // ignore close errors\n }\n },\n };\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n", "import { EventEmitter } from 'events';\nimport { randomUUID } from 'crypto';\nimport type {\n Query,\n SDKMessage,\n SDKUserMessage,\n HookInput,\n HookJSONOutput,\n PostToolUseHookInput,\n McpServerConfig,\n} from '@anthropic-ai/claude-agent-sdk';\nimport { simpleGit } from 'simple-git';\nimport type { AgentClient } from './ai-client.js';\nimport { createWorkerStatusMcpServer, type StatusUpdateEvent } from './tools/worker-status-tool.js';\nimport { AsyncQueue } from './utils/async-queue.js';\nimport { WorktreeManager } from './utils/worktree-manager.js';\nimport { logger } from '../utils/logger.js';\nimport { readOmnaraConfig, isWorktreesEnabled } from '../config/omnara-config.js';\n\nexport type WorkerStatus = 'running' | 'completed' | 'error' | 'canceled';\n\nexport interface WorkerProgressEntry {\n timestamp: number;\n message: string;\n}\n\nexport interface WorkerRecord {\n id: string;\n task: string;\n prompt: string;\n sessionId: string;\n status: WorkerStatus;\n startedAt: number;\n lastUpdateAt: number;\n originSessionId?: string;\n progress: WorkerProgressEntry[];\n result?: string;\n error?: string;\n metadata?: Record<string, unknown>;\n messageQueue: AsyncQueue<SDKUserMessage>;\n worktreePath?: string;\n branchName?: string;\n work_context?: string;\n worktree_name?: string;\n}\n\nexport interface WorkerMessageEvent {\n record: WorkerRecord;\n messageType: 'assistant_text' | 'assistant_complete' | 'tool_call' | 'tool_result';\n text?: string;\n success?: boolean;\n toolName?: string;\n toolUseId?: string;\n toolInput?: unknown;\n toolContent?: unknown;\n isError?: boolean;\n}\n\ninterface LaunchWorkerOptions {\n task: string;\n prompt: string;\n work_context: string;\n worktree_name: string;\n originSessionId?: string;\n metadata?: Record<string, unknown>;\n}\n\ninterface WorkerManagerOptions {\n createClient: (mcpServers?: Record<string, McpServerConfig>, cwd?: string) => AgentClient;\n resolveSessionIdBySdk?: (sdkSessionId?: string) => string | undefined;\n repoPath: string;\n worktreesEnabled: boolean;\n worktreesBaseRef?: string;\n}\n\nexport class WorkerManager extends EventEmitter {\n private readonly workers = new Map<string, WorkerRecord>();\n private readonly runningQueries = new Map<string, Query>();\n private worktreeManager: WorktreeManager;\n repoPath: string;\n\n constructor(private readonly options: WorkerManagerOptions) {\n super();\n this.worktreeManager = new WorktreeManager({\n repoPath: options.repoPath,\n enabled: options.worktreesEnabled,\n base_ref: options.worktreesBaseRef,\n });\n this.repoPath = options.repoPath;\n logger.info(\n `WorkerManager initialized with worktrees ${options.worktreesEnabled ? 'enabled' : 'disabled'}`,\n );\n void this.initializeConfig();\n }\n\n private async initializeConfig(): Promise<void> {\n try {\n const config = await readOmnaraConfig();\n const worktreesEnabled = isWorktreesEnabled(config);\n\n logger.info(\n `Worktrees ${worktreesEnabled ? 'enabled' : 'disabled'} via omnara.jsonc configuration`,\n );\n\n this.worktreeManager = new WorktreeManager({\n repoPath: this.options.repoPath,\n enabled: worktreesEnabled,\n base_ref: config.worktrees?.base_ref ?? undefined,\n });\n } catch (err) {\n logger.error('Failed to read omnara.jsonc configuration:', err);\n logger.info('Worktrees disabled due to config read error');\n }\n }\n\n listWorkers(): WorkerRecord[] {\n return Array.from(this.workers.values());\n }\n\n getWorker(id: string): WorkerRecord | undefined {\n return this.workers.get(id);\n }\n\n getWorkerByTask(task: string): WorkerRecord | undefined {\n for (const worker of this.workers.values()) {\n if (worker.task === task) {\n return worker;\n }\n }\n return undefined;\n }\n\n /**\n * Get a formatted summary of all current worker statuses for inclusion in system prompts.\n * Returns a string describing all active workers and their current state.\n */\n getWorkerStatusSummary(): string {\n const workers = this.listWorkers();\n\n if (workers.length === 0) {\n return 'No active workers.';\n }\n\n const lines = ['## Current Worker Status'];\n lines.push('');\n\n for (const worker of workers) {\n const latestMsg =\n worker.progress.length > 0\n ? worker.progress[worker.progress.length - 1]?.message\n : undefined;\n\n lines.push(`**Task: \"${worker.task}\"**`);\n lines.push(`- Status: ${worker.status}`);\n lines.push(`- Worker ID: ${worker.id}`);\n\n if (worker.status === 'completed' && worker.result) {\n lines.push(`- Result: ${worker.result}`);\n } else if (worker.status === 'error' && worker.error) {\n lines.push(`- Error: ${worker.error}`);\n } else if (latestMsg) {\n lines.push(`- Latest: ${latestMsg}`);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n launchWorker(\n { task, prompt, work_context, worktree_name, originSessionId, metadata }: LaunchWorkerOptions,\n toolUseId?: string,\n ): WorkerRecord {\n // Use a single UUID for both worker ID and session ID to unify them\n const sessionId = randomUUID();\n const resolvedOriginSessionId = originSessionId;\n const record: WorkerRecord = {\n id: sessionId, // Worker ID is the same as session ID\n task,\n prompt,\n status: 'running',\n sessionId,\n startedAt: Date.now(),\n lastUpdateAt: Date.now(),\n originSessionId: resolvedOriginSessionId,\n progress: [],\n metadata,\n messageQueue: new AsyncQueue<SDKUserMessage>(),\n work_context,\n worktree_name,\n };\n\n this.workers.set(sessionId, record);\n this.emit('session_start', { ...record });\n this.emitUpdate(record);\n\n // Emit tool_call event for launch_worker to make it visible in the worker's session\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_call',\n toolName: 'mcp__worker__launch_worker',\n toolUseId,\n toolInput: { task, prompt, metadata },\n } satisfies WorkerMessageEvent);\n\n // Emit tool_result immediately after to show the worker was successfully launched\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId,\n toolContent: {\n workerId: record.id,\n status: record.status,\n message: `Worker launched successfully, task ${task} in progress.`,\n },\n isError: false,\n } satisfies WorkerMessageEvent);\n }\n\n // Create worktree and run worker asynchronously\n void this.createWorktreeAndRun(record, prompt);\n return record;\n }\n\n private async createWorktreeAndRun(record: WorkerRecord, prompt: string): Promise<void> {\n try {\n // Only create worktree if worktrees are enabled\n if (this.worktreeManager.isEnabled()) {\n // Create worktree for this worker\n logger.info(`Creating worktree for worker ${record.id} (task: ${record.task})`);\n const worktreeInfo = await this.worktreeManager.createWorktree(\n record.id,\n record.worktree_name || record.id,\n );\n\n // Update record with worktree information\n record.worktreePath = worktreeInfo.worktreePath;\n record.branchName = worktreeInfo.branchName;\n\n // Store branch in metadata so it's accessible later\n if (!record.metadata) {\n record.metadata = {};\n }\n record.metadata.branch = worktreeInfo.branchName;\n\n record.progress.push({\n timestamp: Date.now(),\n message: `Worktree created at ${worktreeInfo.worktreePath} on branch ${worktreeInfo.branchName}`,\n });\n this.emitUpdate(record);\n\n logger.info(`Worktree created for worker ${record.id} at ${worktreeInfo.worktreePath}`);\n } else {\n // Worktrees disabled, run in current working directory\n logger.info(`Worktrees disabled, worker ${record.id} will run in current directory`);\n record.progress.push({\n timestamp: Date.now(),\n message: 'Worktrees disabled, running in current directory',\n });\n this.emitUpdate(record);\n }\n\n // Run the worker (with or without worktree)\n await this.runWorker(record, prompt);\n } catch (error) {\n // Handle worktree creation failure or other errors\n logger.error(`Failed to setup worker ${record.id}:`, error);\n record.status = 'error';\n record.error = `Failed to setup worker: ${error instanceof Error ? error.message : String(error)}`;\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: `Worker failed: ${record.error}`,\n });\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: record.error,\n } satisfies WorkerMessageEvent);\n this.emitCompleted(record);\n\n // Close the message queue\n record.messageQueue.close();\n }\n }\n\n cancelWorker(id: string): boolean {\n const record = this.workers.get(id);\n if (!record) {\n return false;\n }\n\n if (record.status !== 'running') {\n return false;\n }\n\n record.status = 'canceled';\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: 'Worker canceled by user request.',\n });\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: 'Worker canceled by user request.',\n } satisfies WorkerMessageEvent);\n\n const query = this.runningQueries.get(id);\n if (query) {\n void query.interrupt().catch(() => {\n // Ignore interrupt errors; status already updated.\n });\n }\n\n // Close the message queue\n record.messageQueue.close();\n\n // Cleanup worktree asynchronously (will be handled in runWorker's catch block)\n // The worktree cleanup is handled in the runWorker method when it detects canceled status\n\n return true;\n }\n\n /**\n * Send a message to a worker (running or completed).\n *\n * @param task - The task name of the worker to message\n * @param message - The message content to send\n * @param interrupt - If true, interrupt current generation; if false, queue for next turn\n * @param toolUseId - Optional tool use ID to track this operation for relay forwarding\n * @returns true if message was sent, false if worker not found or message queue is closed\n */\n async messageWorker(\n task: string,\n message: string,\n interrupt: boolean,\n toolUseId?: string,\n ): Promise<boolean> {\n const record = this.getWorkerByTask(task);\n\n if (!record) {\n return false;\n }\n\n // Emit tool_call event for message_worker to make it visible in the worker's session\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_call',\n toolName: 'mcp__worker__message_worker',\n toolUseId,\n toolInput: { task, message, interrupt },\n } satisfies WorkerMessageEvent);\n }\n\n // Check if the worker needs to be restarted (completed, error, or canceled)\n if (record.status !== 'running') {\n // Create a new message queue for the restarted worker\n record.messageQueue = new AsyncQueue<SDKUserMessage>();\n\n record.status = 'running';\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: `Worker restarted with new message: ${message}`,\n });\n this.emitUpdate(record);\n\n // Restart the worker by calling runWorker again\n // The message will be consumed from the queue\n void this.runWorker(record, ''); // Empty prompt since we're resuming\n }\n\n // After potential restart, check if the queue is still closed (shouldn't happen)\n if (record.messageQueue.isClosed()) {\n console.error('[WorkerManager] Message queue is closed after restart attempt');\n return false;\n }\n\n // Log the message being sent to progress for internal tracking\n record.progress.push({\n timestamp: Date.now(),\n message: `[ORCHESTRATOR MESSAGE${interrupt ? ' - INTERRUPT' : ''}]: ${message}`,\n });\n record.lastUpdateAt = Date.now();\n\n // If interrupt is requested, interrupt the current query\n if (interrupt) {\n const query = this.runningQueries.get(record.id);\n if (query) {\n try {\n await query.interrupt();\n } catch (error) {\n console.error('[WorkerManager] Failed to interrupt worker:', error);\n }\n }\n }\n\n // Create SDK user message and push to queue\n const userMessage: SDKUserMessage = {\n session_id: record.sessionId,\n type: 'user',\n message: {\n role: 'user',\n content: message,\n },\n parent_tool_use_id: null,\n isSynthetic: true,\n };\n\n try {\n record.messageQueue.push(userMessage);\n\n // Emit tool_result to confirm message was queued/sent successfully\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId,\n toolContent: {\n success: true,\n task,\n interrupted: interrupt,\n message: interrupt\n ? `Message sent to worker \"${task}\" (interrupted current work)`\n : `Message queued for worker \"${task}\" (will be delivered after current turn)`,\n },\n isError: false,\n } satisfies WorkerMessageEvent);\n }\n\n return true;\n } catch (error) {\n console.error('[WorkerManager] Failed to queue message:', error);\n\n // Emit error result if we have a toolUseId\n if (toolUseId) {\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId,\n toolContent: {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to queue message',\n },\n isError: true,\n } satisfies WorkerMessageEvent);\n }\n\n return false;\n }\n }\n\n private emitUpdate(record: WorkerRecord): void {\n this.emit('update', { ...record });\n }\n\n private emitCompleted(record: WorkerRecord): void {\n this.emit('completed', { ...record });\n }\n\n private handleStatusUpdate(record: WorkerRecord, event: StatusUpdateEvent): void {\n console.log('[WorkerManager] Status update received:', {\n workerId: record.id,\n task: record.task,\n message: event.message,\n metadata: event.metadata,\n });\n record.progress.push({\n timestamp: event.timestamp,\n message: event.message,\n });\n record.lastUpdateAt = event.timestamp;\n this.emitUpdate(record);\n }\n\n /**\n * Create an async iterable stream of user messages for the worker.\n * Yields the initial prompt, then streams any additional messages from the queue.\n * If initialPrompt is empty, skips the initial yield and only consumes from the queue.\n */\n private async *createMessageStream(\n initialPrompt: string,\n sessionId: string,\n messageQueue: AsyncQueue<SDKUserMessage>,\n ): AsyncIterable<SDKUserMessage> {\n // Only yield initial prompt if it's not empty (for worker restart/resume)\n if (initialPrompt.trim()) {\n yield {\n session_id: sessionId,\n type: 'user',\n message: {\n role: 'user',\n content: initialPrompt,\n },\n parent_tool_use_id: null,\n };\n }\n\n // Continue yielding messages from the queue\n for await (const message of messageQueue) {\n yield message;\n }\n }\n\n private async runWorker(record: WorkerRecord, prompt: string): Promise<void> {\n // Create status update MCP server for this worker\n const statusMcpServer = createWorkerStatusMcpServer((event: StatusUpdateEvent) => {\n this.handleStatusUpdate(record, event);\n });\n\n console.log('[WorkerManager] Creating worker client with status MCP server:', {\n workerId: record.id,\n task: record.task,\n hasMcpServer: !!statusMcpServer,\n worktreePath: record.worktreePath,\n branchName: record.branchName,\n });\n\n // Create client with status MCP server and worktree path as cwd\n const client = this.options.createClient(\n {\n worker_status: statusMcpServer,\n },\n record.worktreePath,\n );\n\n // Wrap the prompt with worker instructions including worktree information\n const workerPrompt = this.wrapPrompt(prompt, record.worktreePath, record.branchName);\n\n // Create message stream that includes initial prompt and any future messages\n const messageStream = this.createMessageStream(\n workerPrompt,\n record.sessionId,\n record.messageQueue,\n );\n\n // Create query with the message stream for continuous message support\n // Add PostToolUse hook to capture tool results\n // This hook fires AFTER a tool has been executed and allows us to intercept the result\n const query = client.createQuery(messageStream, {\n hooks: {\n PostToolUse: [\n {\n // No matcher means it applies to all tools (Bash, Read, Write, etc.)\n // If we wanted to only capture Bash results, we could add: matcher: 'Bash'\n hooks: [\n async (input: HookInput, toolUseID: string | undefined): Promise<HookJSONOutput> => {\n // Type guard to ensure we're handling PostToolUse events\n if (input.hook_event_name !== 'PostToolUse') {\n return {};\n }\n\n // Now we can safely access PostToolUse-specific fields\n const postToolInput = input as PostToolUseHookInput;\n\n console.log('[WorkerManager] PostToolUse hook triggered:', {\n toolName: postToolInput.tool_name,\n toolUseID,\n hasResponse: !!postToolInput.tool_response,\n workerId: record.id,\n task: record.task,\n });\n\n // Log the structure of the tool response for debugging\n if (postToolInput.tool_name === 'Bash') {\n console.log('[WorkerManager] Bash tool response structure:', {\n responseType: typeof postToolInput.tool_response,\n responseKeys: postToolInput.tool_response\n ? Object.keys(postToolInput.tool_response)\n : [],\n fullResponse: postToolInput.tool_response,\n });\n }\n\n // Emit tool_result message event for broadcasting\n // The tool_response from the hook contains the actual tool output\n // This will be picked up by the orchestrator and broadcast to the UI\n // where it will be paired with the corresponding tool_call by toolUseId\n this.emit('message', {\n record,\n messageType: 'tool_result',\n toolUseId: toolUseID || randomUUID(),\n toolContent: postToolInput.tool_response,\n isError: false, // PostToolUse is for successful executions\n } satisfies WorkerMessageEvent);\n\n // Return empty object to not modify the tool response\n // We could return { suppressOutput: true } to prevent the tool result from\n // being sent to the assistant, but we want the assistant to see the results\n return {};\n },\n ],\n },\n ],\n },\n });\n\n // Store the query reference for interrupt support\n this.runningQueries.set(record.id, query);\n\n const summarizedChunks: string[] = [];\n\n try {\n for await (const message of query) {\n this.handleMessage(record, message, summarizedChunks);\n }\n\n if (record.status === 'running') {\n // Auto-commit changes if worktree is enabled\n if (record.worktreePath) {\n try {\n logger.info(\n `Auto-committing changes for worker ${record.id} in worktree ${record.worktreePath}`,\n );\n const worktreeGit = simpleGit(record.worktreePath);\n\n // Stage all changes\n await worktreeGit.add('-A');\n\n // Create commit with descriptive message\n const commitMessage = `Worker task: ${record.task}\\n\\nAutomatically committed changes from worker completion.`;\n await worktreeGit.commit(commitMessage);\n\n logger.info(`Successfully auto-committed changes for worker ${record.id}`);\n record.progress.push({\n timestamp: Date.now(),\n message: 'Auto-committed all changes to git',\n });\n } catch (commitError) {\n // Log error but don't fail the worker\n logger.error(`Failed to auto-commit changes for worker ${record.id}:`, commitError);\n record.progress.push({\n timestamp: Date.now(),\n message: `Failed to auto-commit changes: ${commitError instanceof Error ? commitError.message : String(commitError)}`,\n });\n }\n }\n\n record.status = 'completed';\n record.result =\n summarizedChunks.join('\\n').trim() || 'Worker completed without additional details.';\n record.lastUpdateAt = Date.now();\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: true,\n text: record.result,\n } satisfies WorkerMessageEvent);\n this.emitCompleted(record);\n }\n } catch (error) {\n if (record.status === 'canceled') {\n this.emitCompleted(record);\n return;\n }\n\n record.status = 'error';\n record.error = this.extractError(error);\n record.lastUpdateAt = Date.now();\n record.progress.push({\n timestamp: Date.now(),\n message: `Worker failed: ${record.error}`,\n });\n this.emitUpdate(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: record.error,\n } satisfies WorkerMessageEvent);\n this.emitCompleted(record);\n } finally {\n // Only delete from running queries - keep message queue open for potential future messages\n this.runningQueries.delete(record.id);\n }\n }\n\n private handleMessage(\n record: WorkerRecord,\n message: SDKMessage,\n summarizedChunks: string[],\n ): void {\n switch (message.type) {\n case 'assistant': {\n // Extract text content\n const text = this.extractAssistantText(message);\n if (text) {\n summarizedChunks.push(text);\n record.progress.push({\n timestamp: Date.now(),\n message: text,\n });\n record.lastUpdateAt = Date.now();\n this.emit('message', {\n record,\n messageType: 'assistant_text',\n text,\n } satisfies WorkerMessageEvent);\n }\n\n // Extract tool uses from assistant message content\n const content = message.message.content;\n let hasToolUse = false;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (block && typeof block === 'object' && 'type' in block) {\n if (block.type === 'tool_use' && 'name' in block && 'id' in block) {\n hasToolUse = true;\n this.emit('message', {\n record,\n messageType: 'tool_call',\n toolName: block.name as string,\n toolUseId: block.id as string,\n toolInput: 'input' in block ? block.input : undefined,\n } satisfies WorkerMessageEvent);\n }\n }\n }\n }\n\n // If the assistant message has no tool uses, close the message queue\n // This signals the end of the current generation and allows completion logic to run\n // The queue can be reopened when messageWorker is called\n if (!hasToolUse && !record.messageQueue.isClosed()) {\n console.log(\n '[WorkerManager] Assistant message without tool use - closing message queue to signal completion',\n );\n record.messageQueue.close();\n }\n break;\n }\n case 'stream_event': {\n const text = this.extractDeltaText(message);\n if (text) {\n record.progress.push({\n timestamp: Date.now(),\n message: text,\n });\n record.lastUpdateAt = Date.now();\n }\n break;\n }\n case 'result': {\n const success = message.subtype === 'success';\n if (!success && record.status === 'running') {\n record.status = 'error';\n record.error = message.subtype;\n record.lastUpdateAt = Date.now();\n this.emitUpdate(record);\n this.emitCompleted(record);\n this.emit('message', {\n record,\n messageType: 'assistant_complete',\n success: false,\n text: record.error ?? message.subtype,\n } satisfies WorkerMessageEvent);\n }\n break;\n }\n default:\n break;\n }\n }\n\n private extractAssistantText(message: SDKMessage): string | null {\n if (message.type !== 'assistant') {\n return null;\n }\n\n const content: unknown = message.message.content;\n if (typeof content === 'string') {\n return content.trim();\n }\n\n if (Array.isArray(content)) {\n const texts: string[] = [];\n for (const block of content) {\n if (\n block &&\n typeof block === 'object' &&\n block.type === 'text' &&\n typeof block.text === 'string'\n ) {\n const trimmed = block.text.trim();\n if (trimmed.length > 0) {\n texts.push(trimmed);\n }\n }\n }\n if (texts.length > 0) {\n return texts.join('\\n');\n }\n }\n\n return null;\n }\n\n private extractDeltaText(message: SDKMessage): string | null {\n if (message.type !== 'stream_event') {\n return null;\n }\n const event = message.event;\n if (!event || typeof event !== 'object') {\n return null;\n }\n\n if (event.type === 'content_block_delta') {\n const delta = event.delta as { type?: string; text?: unknown } | null;\n if (delta?.type === 'text_delta' && typeof delta.text === 'string') {\n const raw = delta.text.trim();\n return raw.length > 0 ? raw : null;\n }\n }\n\n return null;\n }\n\n private extractError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n try {\n return JSON.stringify(error);\n } catch {\n return 'Unknown worker error';\n }\n }\n\n private wrapPrompt(userPrompt: string, worktreePath?: string, branchName?: string): string {\n let directive = `\\n\\nIMPORTANT:\\n- Use the mcp__worker_status__send_status_update tool to report progress as you work.\\n- When finished, output a final summary.\\n- Do not include raw diffs or large file dumps unless explicitly asked.\\n`;\n\n if (worktreePath && branchName) {\n directive += `\\nWORKTREE ISOLATION:\\n- You are working in an isolated git worktree at: ${worktreePath}\\n- Your dedicated branch is: ${branchName}\\n- All your file operations, git commands, and changes are isolated to this worktree.\\n- Other workers cannot see your changes and you cannot see theirs.\\n- When you're done, your worktree will be automatically cleaned up.\\n- Your changes will be automatically committed when you complete your task. Focus on making your changes and reporting your results.\\n`;\n }\n\n return `${userPrompt.trim()}\\n${directive}`;\n }\n\n /**\n * Shutdown the worker manager and cleanup all resources\n * This should be called during application shutdown to ensure all worktrees are cleaned up\n */\n async shutdown(): Promise<void> {\n logger.info('Shutting down worker manager');\n\n // Cancel all running workers\n const runningWorkers = Array.from(this.workers.values()).filter((w) => w.status === 'running');\n\n for (const worker of runningWorkers) {\n logger.info(`Canceling worker ${worker.id} during shutdown`);\n this.cancelWorker(worker.id);\n }\n\n // Wait a moment for workers to process cancellation\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Force cleanup all remaining worktrees\n try {\n await this.worktreeManager.cleanupAll(true);\n logger.info('All worktrees cleaned up successfully');\n } catch (error) {\n logger.error('Error during worktree cleanup:', error);\n }\n\n logger.info('Worker manager shutdown complete');\n }\n\n /**\n * Get the WorktreeManager instance\n * @returns The WorktreeManager instance\n */\n getWorktreeManager(): WorktreeManager {\n return this.worktreeManager;\n }\n}\n", "import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nimport { z } from 'zod';\n\nexport interface StatusUpdateEvent {\n message: string;\n metadata?: Record<string, unknown>;\n timestamp: number;\n}\n\nexport type StatusUpdateCallback = (event: StatusUpdateEvent) => void;\n\nexport function createWorkerStatusMcpServer(onStatusUpdate: StatusUpdateCallback) {\n return createSdkMcpServer({\n name: 'worker_status',\n version: '1.0.0',\n tools: [\n tool(\n 'send_status_update',\n `Send a status update message to notify about progress.\n\nUse this tool to:\n- Report progress on long-running tasks\n- Notify about important milestones or decisions\n- Provide context about what you're currently working on\n- Signal warnings or issues that don't stop execution\n\nThe status update will be visible to the orchestrator and tracked in your task's progress history.`,\n {\n message: z\n .string()\n .min(1, 'message is required')\n .describe('A concise status update message describing current progress or state'),\n metadata: z\n .record(z.any())\n .optional()\n .describe('Optional metadata to attach to this status update'),\n },\n async (args) => {\n console.log('[StatusTool] send_status_update called:', {\n message: args.message,\n metadata: args.metadata,\n });\n\n onStatusUpdate({\n message: args.message,\n metadata: args.metadata,\n timestamp: Date.now(),\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Status update sent successfully.',\n },\n ],\n };\n },\n ),\n ],\n });\n}\n", "/**\n * A simple async queue for streaming messages to workers.\n * Allows pushing messages and consuming them via async iteration.\n */\nexport class AsyncQueue<T> {\n private queue: T[] = [];\n private resolvers: Array<(value: IteratorResult<T>) => void> = [];\n private closed = false;\n\n /**\n * Push a new item to the queue.\n * If there are waiting consumers, resolve them immediately.\n */\n push(item: T): void {\n if (this.closed) {\n throw new Error('Cannot push to a closed queue');\n }\n\n if (this.resolvers.length > 0) {\n const resolve = this.resolvers.shift();\n resolve?.({ value: item, done: false });\n } else {\n this.queue.push(item);\n }\n }\n\n /**\n * Close the queue, signaling that no more items will be added.\n */\n close(): void {\n this.closed = true;\n // Resolve all waiting consumers with done: true\n while (this.resolvers.length > 0) {\n const resolve = this.resolvers.shift();\n resolve?.({ value: undefined as T, done: true });\n }\n }\n\n /**\n * Check if the queue is closed.\n */\n isClosed(): boolean {\n return this.closed;\n }\n\n /**\n * Async iterator implementation for consuming items from the queue.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n while (true) {\n // If there are items in the queue, yield them\n if (this.queue.length > 0) {\n const item = this.queue.shift();\n if (item !== undefined) {\n yield item;\n }\n continue;\n }\n\n // If the queue is closed and empty, we're done\n if (this.closed) {\n return;\n }\n\n // Wait for a new item or close\n const result = await new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n\n if (result.done) {\n return;\n }\n\n yield result.value;\n }\n }\n}\n", "import { simpleGit, type SimpleGit } from 'simple-git';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { logger } from '../../utils/logger.js';\nimport { DEFAULT_DIR } from '../../auth/credentials-store.js';\n\n/**\n * Configuration options for WorktreeManager\n */\nexport interface WorktreeManagerOptions {\n /**\n * The root directory of the git repository\n */\n repoPath: string;\n\n /**\n * Base directory for worktrees (default: .omnara/worktrees)\n */\n worktreeBasePath?: string;\n\n /**\n * Whether worktrees are enabled (default: false)\n */\n enabled?: boolean;\n\n /**\n * Base ref to use when creating new branches (optional)\n */\n base_ref?: string;\n}\n\n/**\n * Information about a created worktree\n */\nexport interface WorktreeInfo {\n /**\n * Unique identifier for the worker\n */\n workerId: string;\n\n /**\n * Semantic name for the worktree (e.g., \"main-feature\", \"bugfix-auth\")\n */\n worktreeName: string;\n\n /**\n * Absolute path to the worktree directory\n */\n worktreePath: string;\n\n /**\n * Name of the branch created for this worktree\n */\n branchName: string;\n\n /**\n * Timestamp when the worktree was created\n */\n createdAt: Date;\n}\n\n/**\n * A request to create a worktree, stored in the queue\n */\ninterface WorktreeCreationRequest {\n workerId: string;\n worktreeName: string;\n resolve: (info: WorktreeInfo) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Error thrown when worktree operations fail\n */\nexport class WorktreeError extends Error {\n constructor(\n message: string,\n public readonly workerId: string,\n public readonly operation: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'WorktreeError';\n }\n}\n\n/**\n * Manages git worktrees for worker isolation\n *\n * This class handles the lifecycle of git worktrees, ensuring each worker\n * operates in an isolated environment. It provides methods for creating,\n * managing, and cleaning up worktrees.\n *\n * @example\n * ```typescript\n * const manager = new WorktreeManager({ repoPath: '/path/to/repo' });\n * const info = await manager.createWorktree('worker-123', 'main-feature');\n * // Worker operates in info.worktreePath\n * await manager.removeWorktree('worker-123');\n * ```\n */\nexport class WorktreeManager {\n readonly git: SimpleGit;\n private readonly repoPath: string;\n private readonly worktreeBasePath: string;\n private readonly activeWorktrees: Map<string, WorktreeInfo>;\n private readonly enabled: boolean;\n private readonly base_ref?: string;\n\n // Queue mechanism for sequential worktree creation\n private readonly creationQueue: WorktreeCreationRequest[] = [];\n private isProcessingQueue: boolean = false;\n // Map to track worktrees by name (not workerId) to enable reuse\n private readonly worktreesByName: Map<string, WorktreeInfo> = new Map();\n\n constructor(options: WorktreeManagerOptions) {\n this.repoPath = options.repoPath;\n this.enabled = options.enabled ?? false;\n this.base_ref = options.base_ref;\n\n // Extract repo name from repoPath and create path structure: ~/.omnara/worktrees/<repo-name>\n const repoName = path.basename(this.repoPath);\n this.worktreeBasePath =\n options.worktreeBasePath || path.join(DEFAULT_DIR, 'worktrees', repoName);\n this.git = simpleGit(this.repoPath);\n this.activeWorktrees = new Map();\n\n // Validate git repository if enabled\n if (this.enabled) {\n this.validateGitRepository();\n }\n }\n\n /**\n * Find a valid base ref to use when creating new branches\n * Tries in order: configured base_ref, main, master, origin/HEAD\n * @returns The first valid ref found, or undefined if none exist\n */\n async findValidBaseRef(): Promise<string | undefined> {\n // If base_ref is configured, try it first\n if (this.base_ref) {\n try {\n await this.git.raw(['rev-parse', '--verify', this.base_ref]);\n logger.info(`Using configured base_ref: ${this.base_ref}`);\n return this.base_ref;\n } catch {\n logger.warn(`Configured base_ref \"${this.base_ref}\" does not exist, trying fallbacks`);\n }\n }\n\n // Try fallback refs in order: main, master, origin/HEAD\n const fallbackRefs = ['main', 'master', 'origin/HEAD'];\n for (const ref of fallbackRefs) {\n try {\n await this.git.raw(['rev-parse', '--verify', ref]);\n logger.info(`Using fallback base_ref: ${ref}`);\n return ref;\n } catch {\n // This ref doesn't exist, try the next one\n }\n }\n\n logger.warn('No valid base ref found (tried: configured base_ref, main, master, origin/HEAD)');\n return undefined;\n }\n\n /**\n * Validate that the repoPath is a git repository\n * Logs an error if worktrees are enabled but not in a git repository\n */\n private validateGitRepository(): void {\n this.git\n .checkIsRepo()\n .then((isRepo) => {\n if (!isRepo) {\n logger.error(`Worktrees are enabled but not in a git repository at ${this.repoPath}`);\n } else {\n logger.info(`Worktrees enabled for repository at ${this.repoPath}`);\n }\n })\n .catch((error) => {\n logger.error(\n `Worktrees are enabled but failed to check git repository at ${this.repoPath}:`,\n error,\n );\n });\n }\n\n /**\n * Check if worktrees are enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Creates a new worktree for the specified worker\n *\n * This method uses a sequential queue to ensure that worktree creation\n * happens one at a time, eliminating race conditions when multiple workers\n * request the same worktree simultaneously.\n *\n * @param workerId - Unique identifier for the worker\n * @param worktreeName - Semantic name for the worktree (e.g., \"main-feature\", \"bugfix-auth\")\n * @returns Information about the created worktree\n * @throws {WorktreeError} If worktree creation fails\n */\n async createWorktree(workerId: string, worktreeName: string): Promise<WorktreeInfo> {\n if (!this.enabled) {\n throw new WorktreeError(\n 'Worktrees are not enabled. Add a \"worktrees\" configuration to omnara.jsonc to enable.',\n workerId,\n 'create',\n );\n }\n\n // Check if this worker already has an active worktree\n if (this.activeWorktrees.has(workerId)) {\n throw new WorktreeError(`Worktree already exists for worker ${workerId}`, workerId, 'create');\n }\n\n // Create a promise that will be resolved when the queue processes this request\n return new Promise<WorktreeInfo>((resolve, reject) => {\n // Add request to queue\n this.creationQueue.push({\n workerId,\n worktreeName,\n resolve,\n reject,\n });\n\n logger.info(\n `Queued worktree creation for \"${worktreeName}\" (worker: ${workerId}). Queue size: ${this.creationQueue.length}`,\n );\n\n // Start processing if not already running\n if (!this.isProcessingQueue) {\n this.processCreationQueue();\n }\n });\n }\n\n /**\n * Processes the creation queue sequentially\n * Ensures only one worktree creation happens at a time\n */\n private async processCreationQueue(): Promise<void> {\n // Guard against concurrent processing\n if (this.isProcessingQueue) {\n return;\n }\n\n this.isProcessingQueue = true;\n\n try {\n while (this.creationQueue.length > 0) {\n // Take the first request from the queue (FIFO)\n const request = this.creationQueue.shift()!;\n\n try {\n // Check if a worktree with this name already exists\n const existingWorktree = this.worktreesByName.get(request.worktreeName);\n\n if (existingWorktree) {\n // Reuse existing worktree, but create a new WorktreeInfo for this worker\n logger.info(\n `Worker ${request.workerId} reusing existing worktree \"${request.worktreeName}\" at ${existingWorktree.worktreePath}`,\n );\n\n const info: WorktreeInfo = {\n workerId: request.workerId,\n worktreeName: request.worktreeName,\n worktreePath: existingWorktree.worktreePath,\n branchName: existingWorktree.branchName,\n createdAt: new Date(),\n };\n\n this.activeWorktrees.set(request.workerId, info);\n request.resolve(info);\n } else {\n // Create new worktree\n const info = await this.doCreateWorktree(request.workerId, request.worktreeName);\n request.resolve(info);\n }\n } catch (error) {\n // If creation fails, reject this request but continue processing the queue\n logger.error(\n `Failed to process worktree creation for worker ${request.workerId}:`,\n error,\n );\n request.reject(\n error instanceof WorktreeError\n ? error\n : new WorktreeError(\n `Failed to create worktree: ${error instanceof Error ? error.message : String(error)}`,\n request.workerId,\n 'create',\n error instanceof Error ? error : undefined,\n ),\n );\n }\n }\n } finally {\n // Reset processing flag\n this.isProcessingQueue = false;\n }\n }\n\n /**\n * Internal method that performs the actual worktree creation\n * This should only be called by processCreationQueue\n */\n private async doCreateWorktree(workerId: string, worktreeName: string): Promise<WorktreeInfo> {\n logger.info(`Creating worktree \"${worktreeName}\" for worker ${workerId}`);\n\n try {\n // Ensure base directory exists\n await fs.mkdir(this.worktreeBasePath, { recursive: true });\n\n // Generate paths and names using worktreeName\n const branchName = `${worktreeName}`;\n const worktreePath = path.join(this.worktreeBasePath, worktreeName);\n\n // Check if branch exists\n const branches = await this.git.branchLocal();\n const branchExists = branches.all.includes(branchName);\n\n // Check if worktree directory exists\n let worktreeDirExists = false;\n try {\n await fs.access(worktreePath);\n worktreeDirExists = true;\n } catch {\n // Directory doesn't exist\n worktreeDirExists = false;\n }\n\n // Check if worktree is registered with git\n const worktreeList = await this.git.raw(['worktree', 'list', '--porcelain']);\n const gitWorktrees = this.parseWorktreeList(worktreeList);\n const worktreeRegistered = gitWorktrees.includes(worktreePath);\n\n // Scenario 2: If worktree exists and branch exists, reuse it\n if (worktreeRegistered && branchExists) {\n logger.info(\n `Reusing existing worktree \"${worktreeName}\" at ${worktreePath} on branch ${branchName}`,\n );\n\n const info: WorktreeInfo = {\n workerId,\n worktreeName,\n worktreePath,\n branchName,\n createdAt: new Date(),\n };\n\n this.activeWorktrees.set(workerId, info);\n this.worktreesByName.set(worktreeName, info);\n return info;\n }\n\n // Handle edge case: directory exists but worktree is not registered\n if (worktreeDirExists && !worktreeRegistered) {\n logger.warn(\n `Directory exists at ${worktreePath} but is not a registered worktree. Removing...`,\n );\n await fs.rm(worktreePath, { recursive: true, force: true });\n worktreeDirExists = false;\n }\n\n // Scenario 3: If branch exists but worktree does not exist, create worktree for existing branch\n if (branchExists && !worktreeRegistered) {\n logger.info(\n `Branch ${branchName} exists. Creating worktree at ${worktreePath} using existing branch`,\n );\n await this.git.raw(['worktree', 'add', worktreePath, branchName]);\n }\n // Scenario 1: If neither exists, create new worktree with new branch\n else if (!branchExists && !worktreeRegistered) {\n // Find valid base ref for creating new branch\n const baseRef = await this.findValidBaseRef();\n\n if (baseRef) {\n logger.info(\n `Creating new worktree \"${worktreeName}\" at ${worktreePath} with new branch ${branchName} from base ref ${baseRef}`,\n );\n await this.git.raw(['worktree', 'add', '-b', branchName, worktreePath, baseRef]);\n } else {\n logger.info(\n `Creating new worktree \"${worktreeName}\" at ${worktreePath} with new branch ${branchName} (no base ref specified)`,\n );\n await this.git.raw(['worktree', 'add', '-b', branchName, worktreePath]);\n }\n }\n\n const info: WorktreeInfo = {\n workerId,\n worktreeName,\n worktreePath,\n branchName,\n createdAt: new Date(),\n };\n\n this.activeWorktrees.set(workerId, info);\n this.worktreesByName.set(worktreeName, info);\n logger.info(`Worktree \"${worktreeName}\" ready at ${worktreePath} on branch ${branchName}`);\n\n return info;\n } catch (error) {\n logger.error(`Failed to create worktree for worker ${workerId}:`, error);\n throw new WorktreeError(\n `Failed to create worktree: ${error instanceof Error ? error.message : String(error)}`,\n workerId,\n 'create',\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Removes a worktree for the specified worker\n *\n * @param workerId - Unique identifier for the worker\n * @param force - Force removal even if there are uncommitted changes\n * @throws {WorktreeError} If worktree removal fails\n */\n async removeWorktree(workerId: string, force: boolean = false): Promise<void> {\n if (!this.enabled) {\n // Silently return if worktrees are disabled\n return;\n }\n\n logger.info(`Removing worktree for worker ${workerId}`);\n\n const info = this.activeWorktrees.get(workerId);\n if (!info) {\n logger.warn(`No active worktree found for worker ${workerId}`);\n return;\n }\n\n try {\n // Check if any other workers are using this worktree name\n const otherWorkersUsingWorktree = Array.from(this.activeWorktrees.values()).filter(\n (wt) => wt.worktreeName === info.worktreeName && wt.workerId !== workerId,\n );\n\n const shouldRemoveWorktree = otherWorkersUsingWorktree.length === 0;\n\n if (shouldRemoveWorktree) {\n // Remove worktree only if no other workers are using it\n const args = ['worktree', 'remove', info.worktreePath];\n if (force) {\n args.push('--force');\n }\n\n try {\n await this.git.raw(args);\n logger.info(`Removed worktree \"${info.worktreeName}\" at ${info.worktreePath}`);\n } catch (worktreeError) {\n const errorMessage =\n worktreeError instanceof Error ? worktreeError.message : String(worktreeError);\n\n // Check if worktree doesn't exist or is already removed\n if (\n errorMessage.includes('is not a working tree') ||\n errorMessage.includes('does not exist')\n ) {\n logger.warn(\n `Worktree ${info.worktreePath} doesn't exist, may have been manually removed. Cleaning up...`,\n );\n\n // Try to prune stale worktrees and manually remove directory if it exists\n await this.git.raw(['worktree', 'prune']);\n\n try {\n await fs.rm(info.worktreePath, { recursive: true, force: true });\n logger.info(`Manually removed stale worktree directory: ${info.worktreePath}`);\n } catch {\n // Directory doesn't exist, which is fine\n }\n } else {\n // Re-throw if it's a different error\n throw worktreeError;\n }\n }\n\n // Remove from worktreesByName map\n this.worktreesByName.delete(info.worktreeName);\n } else {\n logger.info(\n `Not removing worktree \"${info.worktreeName}\" - still in use by ${otherWorkersUsingWorktree.length} other worker(s)`,\n );\n }\n\n // Always remove this worker's entry from activeWorktrees\n this.activeWorktrees.delete(workerId);\n logger.info(`Removed worktree reference for worker ${workerId}`);\n } catch (error) {\n logger.error(`Failed to remove worktree for worker ${workerId}:`, error);\n throw new WorktreeError(\n `Failed to remove worktree: ${error instanceof Error ? error.message : String(error)}`,\n workerId,\n 'remove',\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Gets information about a worker's worktree\n *\n * @param workerId - Unique identifier for the worker\n * @returns Worktree information or undefined if not found\n */\n getWorktreeInfo(workerId: string): WorktreeInfo | undefined {\n return this.activeWorktrees.get(workerId);\n }\n\n /**\n * Lists all active worktrees managed by this instance\n *\n * @returns Array of worktree information\n */\n listActiveWorktrees(): WorktreeInfo[] {\n return Array.from(this.activeWorktrees.values());\n }\n\n /**\n * Cleans up all active worktrees\n *\n * This method should be called during application shutdown to ensure\n * all worktrees are properly cleaned up.\n *\n * @param force - Force removal even if there are uncommitted changes\n */\n async cleanupAll(force: boolean = false): Promise<void> {\n if (!this.enabled) {\n // Silently return if worktrees are disabled\n return;\n }\n\n logger.info('Cleaning up all worktrees');\n\n const workers = Array.from(this.activeWorktrees.keys());\n const results = await Promise.allSettled(\n workers.map((workerId) => this.removeWorktree(workerId, force)),\n );\n\n const failures = results.filter((r) => r.status === 'rejected');\n if (failures.length > 0) {\n logger.error(`Failed to cleanup ${failures.length} worktrees`);\n } else {\n logger.info('Successfully cleaned up all worktrees');\n }\n }\n\n /**\n * Parses the output of 'git worktree list --porcelain'\n *\n * @param output - Raw output from git worktree list\n * @returns Array of worktree paths\n */\n private parseWorktreeList(output: string): string[] {\n const lines = output.split('\\n');\n const paths: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('worktree ')) {\n paths.push(line.substring('worktree '.length));\n }\n }\n\n return paths;\n }\n\n /**\n * Checks if the repository is in a clean state for worktree operations\n *\n * @returns True if repository is clean\n */\n async isRepositoryClean(): Promise<boolean> {\n const status = await this.git.status();\n return status.files.length === 0;\n }\n}\n", "/**\n * Logger utility for controlling console output based on environment\n *\n * Production detection:\n * 1. NODE_ENV === 'production'\n * 2. OMNARA_LOG_LEVEL === 'none' or 'error'\n * 3. Running from compiled dist/ directory (not tsx/ts-node)\n */\n\nimport path from 'path';\nimport type { InspectOptions } from 'util';\n\n/**\n * Log levels for controlling output verbosity\n */\nexport enum LogLevel {\n NONE = 0,\n ERROR = 1,\n WARN = 2,\n INFO = 3,\n DEBUG = 4,\n VERBOSE = 5,\n}\n\n/**\n * Detects if the CLI is running in production mode\n */\nexport function isProduction(): boolean {\n // Check NODE_ENV\n if (process.env.NODE_ENV === 'production') {\n return true;\n }\n\n // Check if running from dist directory (compiled)\n try {\n // Use __filename which is provided by the ESM shim in the build\n const currentFile = typeof __filename !== 'undefined' ? __filename : '';\n const isInDist = currentFile.includes(path.sep + 'dist' + path.sep);\n\n // If in dist AND no explicit development mode, assume production\n if (isInDist && process.env.NODE_ENV !== 'development') {\n return true;\n }\n } catch {\n // Fallback if URL parsing fails\n }\n\n // Check for explicit log level override\n const logLevel = process.env.OMNARA_LOG_LEVEL?.toLowerCase();\n if (logLevel === 'none' || logLevel === 'silent') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Gets the current log level from environment or defaults\n */\nexport function getLogLevel(): LogLevel {\n const envLevel = process.env.OMNARA_LOG_LEVEL?.toLowerCase();\n\n switch (envLevel) {\n case 'none':\n case 'silent':\n return LogLevel.NONE;\n case 'error':\n return LogLevel.ERROR;\n case 'warn':\n case 'warning':\n return LogLevel.WARN;\n case 'info':\n return LogLevel.INFO;\n case 'debug':\n return LogLevel.DEBUG;\n case 'verbose':\n case 'trace':\n return LogLevel.VERBOSE;\n default:\n // Default based on production mode\n return isProduction() ? LogLevel.ERROR : LogLevel.INFO;\n }\n}\n\n/**\n * Logger interface that extends Console but can be controlled\n */\nexport interface Logger extends Console {\n // Additional methods for important messages\n important(...args: unknown[]): void;\n success(...args: unknown[]): void;\n}\n\n/**\n * Creates a controlled logger instance\n */\nexport class ControlledLogger implements Logger {\n private logLevel: LogLevel;\n private forceOutput: boolean;\n private _console: Console;\n\n // Console properties we need to implement\n Console!: typeof console.Console;\n\n constructor(options?: { logLevel?: LogLevel; forceOutput?: boolean }) {\n this.logLevel = options?.logLevel ?? getLogLevel();\n this.forceOutput = options?.forceOutput ?? false;\n this._console = console;\n\n // Copy Console constructor\n this.Console = console.Console;\n }\n\n /**\n * Standard log output (INFO level)\n */\n log(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.log(...args);\n }\n }\n\n /**\n * Error output (always shown unless NONE)\n */\n error(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n console.error(...args);\n }\n }\n\n /**\n * Warning output\n */\n warn(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n console.warn(...args);\n }\n }\n\n /**\n * Info level output\n */\n info(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.info(...args);\n }\n }\n\n /**\n * Debug output (only in development)\n */\n debug(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n console.debug(...args);\n }\n }\n\n /**\n * Verbose/trace output\n */\n trace(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.VERBOSE)) {\n console.log('[TRACE]', ...args);\n }\n }\n\n /**\n * Important messages that should always be shown to user\n * (authentication status, connection info, etc.)\n */\n important(...args: unknown[]): void {\n // Always show important messages unless completely silent\n if (this.logLevel !== LogLevel.NONE || this.forceOutput) {\n console.log(...args);\n }\n }\n\n /**\n * Success messages that should typically be shown\n */\n success(...args: unknown[]): void {\n // Show success messages at WARN level and above\n if (this.shouldLog(LogLevel.WARN) || this.forceOutput) {\n console.log(...args);\n }\n }\n\n /**\n * Check if a message should be logged at the given level\n */\n private shouldLog(level: LogLevel): boolean {\n return this.forceOutput || this.logLevel >= level;\n }\n\n /**\n * Update the log level dynamically\n */\n setLogLevel(level: LogLevel): void {\n this.logLevel = level;\n }\n\n /**\n * Get current log level\n */\n getLogLevel(): LogLevel {\n return this.logLevel;\n }\n\n // Console methods we delegate or control based on log level\n assert(condition?: boolean, ...data: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n this._console.assert(condition, ...data);\n }\n }\n\n clear(): void {\n this._console.clear();\n }\n\n count(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.count(label);\n }\n }\n\n countReset(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.countReset(label);\n }\n }\n\n dir(item?: unknown, options?: InspectOptions): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.dir(item, options);\n }\n }\n\n dirxml(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.dirxml(...data);\n }\n }\n\n group(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.group(...data);\n }\n }\n\n groupCollapsed(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.groupCollapsed(...data);\n }\n }\n\n groupEnd(): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.groupEnd();\n }\n }\n\n table(tabularData?: unknown, properties?: string[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n this._console.table(tabularData, properties);\n }\n }\n\n time(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.time(label);\n }\n }\n\n timeEnd(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeEnd(label);\n }\n }\n\n timeLog(label?: string, ...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeLog(label, ...data);\n }\n }\n\n timeStamp(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeStamp(label);\n }\n }\n\n profile(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n // profile is not part of standard Console interface, check if it exists\n const consoleWithProfile = this._console as Console & { profile?: (label?: string) => void };\n consoleWithProfile.profile?.(label);\n }\n }\n\n profileEnd(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n // profileEnd is not part of standard Console interface, check if it exists\n const consoleWithProfileEnd = this._console as Console & {\n profileEnd?: (label?: string) => void;\n };\n consoleWithProfileEnd.profileEnd?.(label);\n }\n }\n}\n\n/**\n * Global logger instance\n */\nexport const logger = new ControlledLogger();\n\n/**\n * Creates a logger for a specific component\n */\nexport function createLogger(\n componentName?: string,\n options?: {\n logLevel?: LogLevel;\n forceOutput?: boolean;\n },\n): Logger {\n const baseLogger = new ControlledLogger(options);\n\n if (!componentName) {\n return baseLogger;\n }\n\n // Create a wrapper that delegates all Console methods with component prefix\n const wrappedLogger = Object.create(baseLogger) as Logger;\n\n // Override methods that should have component prefix\n wrappedLogger.log = (...args) => baseLogger.log(`[${componentName}]`, ...args);\n wrappedLogger.error = (...args) => baseLogger.error(`[${componentName}]`, ...args);\n wrappedLogger.warn = (...args) => baseLogger.warn(`[${componentName}]`, ...args);\n wrappedLogger.info = (...args) => baseLogger.info(`[${componentName}]`, ...args);\n wrappedLogger.debug = (...args) => baseLogger.debug(`[${componentName}]`, ...args);\n wrappedLogger.trace = (...args) => baseLogger.trace(`[${componentName}]`, ...args);\n // Important and success don't get prefixes\n wrappedLogger.important = (...args) => baseLogger.important(...args);\n wrappedLogger.success = (...args) => baseLogger.success(...args);\n\n return wrappedLogger;\n}\n\n/**\n * Helper to extract error messages consistently\n */\nexport function extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Print current logger configuration (useful for debugging)\n */\nexport function printLoggerConfig(): void {\n const prod = isProduction();\n const level = getLogLevel();\n const levelName = LogLevel[level];\n\n console.log('Logger Configuration:');\n console.log(` Production Mode: ${prod}`);\n console.log(` Log Level: ${levelName} (${level})`);\n console.log(` NODE_ENV: ${process.env.NODE_ENV || '(not set)'}`);\n console.log(` OMNARA_LOG_LEVEL: ${process.env.OMNARA_LOG_LEVEL || '(not set)'}`);\n}\n", "import fs from 'fs/promises';\nimport os from 'os';\nimport path from 'path';\nimport { setTimeout as delay } from 'node:timers/promises';\n\nexport interface StoredCredentials {\n accessToken?: string;\n accessTokenExpiresAt?: string;\n refreshToken?: string;\n}\n\nexport const DEFAULT_DIR = path.join(os.homedir(), '.omnara');\nexport const DEFAULT_CREDENTIALS_PATH = path.join(DEFAULT_DIR, 'creds.json');\nconst DEFAULT_FILE_MODE = 0o600;\nconst DEFAULT_DIR_MODE = 0o700;\nconst LOCK_RETRY_INTERVAL_MS = 50;\nconst LOCK_TIMEOUT_MS = 10_000;\nconst LOCK_STALE_THRESHOLD_MS = 60_000;\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 };\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 async withLock<T>(fn: () => Promise<T>): Promise<T> {\n const release = await this.acquireLock();\n try {\n return await fn();\n } finally {\n await release();\n }\n }\n\n private lockPath(): string {\n return `${this.filePath}.lock`;\n }\n\n private async acquireLock(): Promise<() => Promise<void>> {\n const lockPath = this.lockPath();\n const start = Date.now();\n while (true) {\n try {\n await fs.writeFile(lockPath, `${process.pid}:${Date.now()}`, {\n flag: 'wx',\n mode: DEFAULT_FILE_MODE,\n });\n return async () => {\n try {\n await fs.unlink(lockPath);\n } catch (error) {\n if (!isFileNotFound(error)) {\n throw new Error(\n `Failed to release credentials lock ${lockPath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n };\n } catch (error) {\n if (isLockHeld(error)) {\n if (Date.now() - start > LOCK_TIMEOUT_MS) {\n throw new Error(`Timed out acquiring credentials lock ${lockPath}`);\n }\n const broken = await this.tryBreakStaleLock(lockPath);\n if (broken) {\n continue;\n }\n await delay(LOCK_RETRY_INTERVAL_MS);\n continue;\n }\n throw new Error(\n `Failed to acquire credentials lock ${lockPath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n }\n\n private async tryBreakStaleLock(lockPath: string): Promise<boolean> {\n try {\n const stats = await fs.stat(lockPath);\n if (Date.now() - stats.mtimeMs > LOCK_STALE_THRESHOLD_MS) {\n await fs.unlink(lockPath);\n return true;\n }\n } catch (error) {\n if (isFileNotFound(error)) {\n return true;\n }\n }\n return false;\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\nfunction isLockHeld(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === 'EEXIST',\n );\n}\n", "import { parse as parseJsonc, type ParseError } from 'jsonc-parser';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as z from 'zod';\nimport type { WorkspaceConfigSchema } from '@omnara/shared-js/schemas';\n\nconst OmnaraConfig: z.ZodType<WorkspaceConfigSchema.WorkspaceConfig> = z.object({\n worktrees: z\n .object({\n enabled: z.boolean().default(false),\n base_ref: z.string().optional(),\n })\n .default({\n enabled: false,\n }),\n});\n\nexport type OmnaraConfig = z.infer<typeof OmnaraConfig>;\n\n/**\n * Read and parse the omnara.jsonc configuration file\n *\n * @param configPath - Path to the config file (defaults to omnara.jsonc in cwd)\n * @returns Parsed configuration or default config if file doesn't exist\n */\nexport async function readOmnaraConfig(configPath?: string): Promise<OmnaraConfig> {\n const resolveConfig = async (path?: string): Promise<OmnaraConfig | null> => {\n if (!path) {\n return null;\n }\n\n await fs.access(path);\n\n const content = await fs.readFile(path, 'utf-8');\n const errors: ParseError[] = [];\n const config = parseJsonc(content, errors, {\n allowTrailingComma: true,\n allowEmptyContent: true,\n });\n return OmnaraConfig.parse(config);\n };\n\n const resolveDefault = (): OmnaraConfig => {\n return OmnaraConfig.parse({});\n };\n\n return (\n (await resolveConfig(configPath).catch(() => null)) ??\n (await resolveConfig(path.join(process.cwd(), 'omnara.jsonc')).catch(() => null)) ??\n (await resolveConfig(path.join(process.cwd(), 'omnara.json')).catch(() => null)) ??\n (await resolveDefault())\n );\n}\n\n/**\n * Check if worktrees are enabled in the configuration\n *\n * @param config - The omnara configuration\n * @returns true if worktrees should be enabled\n */\nexport function isWorktreesEnabled(config: OmnaraConfig): boolean {\n // Worktrees are enabled if the worktrees key exists in the config\n return Boolean(config.worktrees?.enabled);\n}\n", "import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nimport { z } from 'zod';\nimport type { WorkerManager } from '../worker-manager.js';\n\ntype ToolExtra = {\n sessionId?: string;\n signal: AbortSignal;\n _meta?: Record<string, unknown>;\n};\n\ninterface WorkerMcpContext {\n resolveSessionIdBySdk: (sdkSessionId?: string) => string | undefined;\n resolveSessionIdByToolUse: (toolUseId: string) => string | undefined;\n getMainCodingSessionId: () => string | null;\n}\n\nexport function createWorkerMcpServer(workerManager: WorkerManager, context: WorkerMcpContext) {\n return createSdkMcpServer({\n name: 'worker',\n version: '1.0.0',\n tools: [\n tool(\n 'launch_worker',\n `Launch a background worker agent to handle tasks autonomously in an isolated git worktree.\n\nEach worker operates in its own git worktree, providing complete isolation:\n- Separate working directory (no shared file changes)\n- Dedicated git branch\n- Independent git operations (staging, committing, etc.)\n- The worker's worktree is automatically cleaned up when the worker completes\n\nWhen to use this tool:\n- Complex tasks requiring multiple steps or operations\n- Searches and exploration of the codebase\n- Tasks that can run in parallel with other work\n- Nearly any coding task - prefer delegation over doing work directly\n\nUsage notes:\n- Launch multiple workers concurrently whenever possible for maximum performance (use multiple tool calls in a single turn)\n- Provide detailed, autonomous task descriptions including exactly what information should be returned\n- Workers have full access to: file operations (read, write, edit), search (glob, grep), bash commands, git operations, running tests, and can launch their own sub-workers\n- Worker outputs should be trusted - they have the same capabilities as you\n- The worker's result is returned to you, not the user - you must summarize or forward relevant information\n- Worker progress status is automatically included in your context - you can see their current state without additional tools`,\n {\n task: z\n .string()\n .min(1, 'task name is required')\n .describe(\n 'A short, unique name for this task (e.g., \"FizzBuzz Python\", \"Search codebase\", \"Fix bug #123\"). Used to identify and track this worker.',\n ),\n prompt: z.string().min(1, 'prompt is required'),\n worktree_name: z\n .string()\n .min(1, 'worktree_name is required')\n .describe(\n 'A short descriptive name for a worktree to create that can be used by workers simultaneously. This is synonymous with branch.',\n ),\n metadata: z.record(z.any()).optional(),\n },\n async (args, extra) => {\n const typedExtra = extra as ToolExtra | undefined;\n const toolUseIdRaw = typedExtra?._meta?.['claudecode/toolUseId'];\n const toolUseId = typeof toolUseIdRaw === 'string' ? toolUseIdRaw : undefined;\n\n // Always use the main coding session as parent for workers\n // This ensures workers are children of the main session, not voice or other sessions\n let parentSessionId = context.getMainCodingSessionId() || undefined;\n\n // Fallback to SDK resolution if main session not available (shouldn't happen)\n if (!parentSessionId) {\n const sdkSessionId = typedExtra?.sessionId;\n parentSessionId = context.resolveSessionIdBySdk(sdkSessionId);\n if (!parentSessionId && toolUseId) {\n parentSessionId = context.resolveSessionIdByToolUse(toolUseId);\n }\n console.warn(\n '[WorkerTools] Main coding session not available, falling back to SDK resolution:',\n parentSessionId,\n );\n }\n\n console.log('[WorkerTools] Launching worker:', {\n task: args.task,\n parentSessionId,\n mainCodingSession: context.getMainCodingSessionId(),\n toolUseId,\n });\n\n const record = workerManager.launchWorker(\n {\n task: args.task,\n prompt: args.prompt,\n work_context: args.worktree_name,\n worktree_name: args.worktree_name,\n originSessionId: parentSessionId,\n metadata: {\n ...args.metadata,\n branch: args.worktree_name,\n },\n },\n toolUseId,\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n workerId: record.id,\n status: record.status,\n worktree_path: record.worktreePath,\n branch_name: record.branchName,\n message: `Worker launched successfully, task ${args.task} in progress. You will be notified for progress updates.`,\n }),\n },\n ],\n };\n },\n ),\n tool(\n 'message_worker',\n `Send a message to a running worker to provide additional context, requirements, or steering.\n\nUse this tool to:\n- Add new requirements or clarifications to an in-progress task\n- Provide additional context the worker might need\n- Correct or redirect the worker's current approach\n- Answer implicit questions or resolve ambiguities\n\n**When to use this tool:**\n- User provides additional requirements while a task is in progress\n- User clarifies or corrects their original request\n- User adds context that would help the running worker\n- A logically related request comes in for an existing task\n\n**When to launch a NEW worker instead:**\n- The request is for a completely different, unrelated task\n- The user explicitly requests a separate task\n- The new work would conflict with the current worker's objective\n\n**Interrupt parameter:**\n- interrupt=true: Stop current work immediately and redirect (use for critical corrections or significant changes in direction)\n- interrupt=false: Queue message for after current turn completes (use for additions, clarifications, or supplementary context)\n\n**Guidelines for interrupt:**\n- Use interrupt=true ONLY if:\n - User explicitly says to stop/interrupt current work\n - The new requirement significantly contradicts the current direction\n - The worker is heading down the wrong path and needs immediate correction\n- Use interrupt=false (default) for:\n - Adding requirements that build on current work\n - Providing helpful context or clarifications\n - Making additions that don't conflict with current progress\n\nExample 1 (queue):\nUser: \"Add authentication to my app\"\nOrchestrator: [launches worker: \"add auth\"]\nUser: \"Make sure it works with Google OAuth\"\nOrchestrator: [message_worker: task=\"add auth\", message=\"User wants Google OAuth integration\", interrupt=false]\n\nExample 2 (interrupt):\nUser: \"Refactor the database layer\"\nOrchestrator: [launches worker: \"refactor database\"]\nUser: \"Wait, actually don't touch the database - just refactor the API layer instead\"\nOrchestrator: [message_worker: task=\"refactor database\", message=\"User wants to change scope - refactor API layer instead, leave database alone\", interrupt=true]`,\n {\n task: z\n .string()\n .min(1, 'task name is required')\n .describe('The task name of the worker to message'),\n message: z\n .string()\n .min(1, 'message is required')\n .describe(\n 'The message to send to the worker. Be clear and specific about what has changed or what additional context is being provided.',\n ),\n interrupt: z\n .boolean()\n .default(false)\n .describe(\n 'If true, interrupt current generation immediately; if false (default), queue message for next turn',\n ),\n },\n async (args, extra) => {\n const typedExtra = extra as ToolExtra | undefined;\n const toolUseIdRaw = typedExtra?._meta?.['claudecode/toolUseId'];\n const toolUseId = typeof toolUseIdRaw === 'string' ? toolUseIdRaw : undefined;\n\n console.log('[WorkerTools] Messaging worker:', {\n task: args.task,\n message: args.message.substring(0, 100),\n interrupt: args.interrupt,\n toolUseId,\n });\n\n const success = await workerManager.messageWorker(\n args.task,\n args.message,\n args.interrupt,\n toolUseId,\n );\n\n if (!success) {\n const worker = workerManager.getWorkerByTask(args.task);\n if (!worker) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: false,\n error: `No worker found with task name: ${args.task}`,\n }),\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: false,\n error: `Worker \"${args.task}\" is not running (status: ${worker.status})`,\n }),\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n task: args.task,\n interrupted: args.interrupt,\n message: args.interrupt\n ? `Message sent to worker \"${args.task}\" (interrupted current work)`\n : `Message queued for worker \"${args.task}\" (will be delivered after current turn)`,\n }),\n },\n ],\n };\n },\n ),\n ],\n });\n}\n", "/**\n * System prompt for the main orchestrator agent.\n *\n * The orchestrator's role is to coordinate and delegate work, not to execute tasks directly.\n * It should ALWAYS use workers to handle all implementation work.\n */\n\nimport { readFileSync } from 'fs';\n\n// Load markdown prompt at runtime (works in tsx/tests and bundled builds)\nconst orchestratorPromptUrl = new URL('./orchestrator-prompt.md', import.meta.url);\nconst ORCHESTRATOR_SYSTEM_PROMPT = readFileSync(orchestratorPromptUrl, 'utf-8');\n\nexport { ORCHESTRATOR_SYSTEM_PROMPT };\n", "import { query } from '@anthropic-ai/claude-agent-sdk';\nimport type { ControlMessageSchema } from '@omnara/shared-js/schemas';\nimport { glob } from 'glob';\nimport * as path from 'path';\n\nexport class CompletionsManager {\n private slashCommandsCache?: {\n fetched: Date;\n slashCommands: string[];\n };\n\n private filesCache: Map<\n string,\n {\n fetched: Date;\n files: string[];\n }\n > = new Map();\n\n async fetchSlashCommands(): Promise<string[]> {\n // cache valid for 5 minutes\n if (\n this.slashCommandsCache &&\n Date.now() - this.slashCommandsCache.fetched.getTime() < 5 * 60 * 1000\n ) {\n return this.slashCommandsCache.slashCommands;\n }\n\n let commands: string[] = [];\n for await (const message of query({\n prompt: 'Respond with one word.',\n options: { maxTurns: 1, model: 'haiku', settingSources: ['user', 'project', 'local'] },\n })) {\n if (message.type === 'system' && message.subtype === 'init') {\n console.log('Fetched available slash commands:', message.slash_commands);\n commands = message.slash_commands;\n }\n }\n\n this.slashCommandsCache = {\n fetched: new Date(),\n slashCommands: commands,\n };\n\n return commands;\n }\n\n async fetchFiles(searchPattern: string = ''): Promise<string[]> {\n // Check cache (valid for 30 seconds for each unique pattern)\n const cached = this.filesCache.get(searchPattern);\n if (cached && Date.now() - cached.fetched.getTime() < 30 * 1000) {\n return cached.files;\n }\n\n try {\n let patterns: string[] = [];\n\n if (searchPattern === '') {\n // If no pattern, show common entry points and config files\n patterns = [\n 'package.json',\n 'tsconfig.json',\n 'pyproject.toml',\n 'Cargo.toml',\n 'README.md',\n 'CLAUDE.md',\n 'src/index.*',\n 'src/main.*',\n 'src/app.*',\n 'index.*',\n 'main.*',\n 'app.*',\n '*.config.*',\n 'src/**/*.tsx',\n 'src/**/*.ts',\n '*.py',\n ];\n } else {\n // Build glob patterns based on the search query\n // Support both partial filename matching and path matching\n if (searchPattern.includes('/')) {\n // User is typing a path - use it directly\n patterns.push(\n `**/${searchPattern}*`, // Match in any directory\n `**/${searchPattern}*/**`, // Match directories\n `${searchPattern}*`, // Match from root\n `${searchPattern}*/**`, // Match root directories\n );\n } else {\n // User is typing a filename - search everywhere\n patterns.push(\n `**/*${searchPattern}*`, // Files containing the pattern\n `**/*${searchPattern}*.*`, // Files with extensions containing pattern\n `**/${searchPattern}*`, // Files starting with the pattern\n `${searchPattern}*`, // Files in current directory\n );\n }\n }\n\n const allFiles: Set<string> = new Set();\n\n // Execute glob for each pattern\n for (const pattern of patterns) {\n try {\n const files = await glob(pattern, {\n ignore: [\n '**/node_modules/**',\n '**/.git/**',\n '**/dist/**',\n '**/build/**',\n '**/.venv/**',\n '**/target/**',\n '**/__pycache__/**',\n '**/.pytest_cache/**',\n '**/.next/**',\n '**/.nuxt/**',\n '**/coverage/**',\n '**/*.min.js',\n '**/*.map',\n '**/vendor/**',\n '**/.cache/**',\n ],\n maxDepth: 10,\n absolute: false,\n nodir: true, // Only files, not directories\n });\n\n // Add files to set (automatically handles duplicates)\n files.forEach((f) => allFiles.add(f));\n } catch {\n // Ignore individual pattern errors\n }\n }\n\n // Convert to array, sort by relevance and limit\n const fileList = Array.from(allFiles)\n .sort((a, b) => {\n if (searchPattern === '') {\n // For empty search, prioritize important files\n const importantFiles = [\n 'package.json',\n 'tsconfig.json',\n 'pyproject.toml',\n 'README.md',\n 'CLAUDE.md',\n ];\n const aName = path.basename(a);\n const bName = path.basename(b);\n const aImportant = importantFiles.includes(aName);\n const bImportant = importantFiles.includes(bName);\n if (aImportant && !bImportant) return -1;\n if (!aImportant && bImportant) return 1;\n\n // Then sort by path depth\n const aDepth = (a.match(/\\//g) || []).length;\n const bDepth = (b.match(/\\//g) || []).length;\n if (aDepth !== bDepth) return aDepth - bDepth;\n\n return a.localeCompare(b);\n }\n\n // For searches with patterns, use existing logic\n const aName = path.basename(a).toLowerCase();\n const bName = path.basename(b).toLowerCase();\n const searchLower = searchPattern.toLowerCase();\n\n const aExact = aName === searchLower;\n const bExact = bName === searchLower;\n if (aExact && !bExact) return -1;\n if (!aExact && bExact) return 1;\n\n // Then prioritize starts with\n const aStarts = aName.startsWith(searchLower);\n const bStarts = bName.startsWith(searchLower);\n if (aStarts && !bStarts) return -1;\n if (!aStarts && bStarts) return 1;\n\n // Then sort by path depth (fewer slashes = higher priority)\n const aDepth = (a.match(/\\//g) || []).length;\n const bDepth = (b.match(/\\//g) || []).length;\n if (aDepth !== bDepth) return aDepth - bDepth;\n\n // Finally alphabetical\n return a.localeCompare(b);\n })\n .slice(0, searchPattern === '' ? 20 : 50); // Limit results - fewer for empty search\n\n // Cache the results\n this.filesCache.set(searchPattern, {\n fetched: new Date(),\n files: fileList,\n });\n\n // Clean up old cache entries if too many\n if (this.filesCache.size > 100) {\n const entries = Array.from(this.filesCache.entries());\n // Remove oldest half\n entries\n .sort((a, b) => a[1].fetched.getTime() - b[1].fetched.getTime())\n .slice(0, 50)\n .forEach(([key]) => this.filesCache.delete(key));\n }\n\n return fileList;\n } catch (error) {\n console.error('Error fetching files:', error);\n return [];\n }\n }\n\n async getCompletion(\n query: string,\n limit: number = 50,\n ): Promise<ControlMessageSchema.CompletionItem[]> {\n const completions: ControlMessageSchema.CompletionItem[] = [];\n\n if (query.startsWith('/')) {\n const slashQuery = query.slice(1);\n const commands = (await this.fetchSlashCommands())\n .filter((cmd) => cmd.startsWith(slashQuery))\n .slice(0, limit);\n\n for (const cmd of commands) {\n completions.push({\n type: 'slash_command',\n result: cmd,\n });\n }\n } else if (query.startsWith('@')) {\n const fileQuery = query.slice(1);\n // Pass the query directly to fetchFiles for efficient globbing\n const files = await this.fetchFiles(fileQuery);\n\n // fetchFiles already returns sorted and limited results\n for (const file of files.slice(0, limit)) {\n completions.push({\n type: 'file',\n result: file,\n });\n }\n }\n\n return completions;\n }\n}\n", "import { randomUUID } from 'crypto';\nimport EventEmitter from 'events';\nimport WebSocket from 'ws';\nimport { simpleGit, type SimpleGit } from 'simple-git';\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, ApiError, normalizeBaseUrl } from '../http/api-client.js';\nimport { registerRelaySession } from './relay-service.js';\nimport { createAuthProvider, type AuthProvider } from '../auth/auth-provider.js';\nimport { AuthContextError } from '../auth/credential-manager.js';\nimport { ensureUserSession } 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';\n\nconst MAX_QUEUE_SIZE = 500;\nconst LOGIN_WAIT_DELAY_MS = 30_000;\n\nexport interface RelayBridgeOptions {\n store?: CredentialsStore;\n logger?: Console;\n backendUrl: string;\n frontendUrl?: string;\n workspaceId?: string;\n userSessionId?: string;\n agentSessionId?: 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 readonly workspaceId: 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 readonly attachAgentSessionId: string | null;\n private browserOpened = false;\n private canceled = false;\n private waitingForLogin = 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 const resolvedWorkspaceId = options.workspaceId ?? process.env.OMNARA_WORKSPACE_ID ?? null;\n if (!resolvedWorkspaceId) {\n throw new Error('workspace id is required to launch the agent orchestrator');\n }\n this.workspaceId = resolvedWorkspaceId;\n this.userSessionId = options.userSessionId ?? null;\n this.currentAgentSessionId = options.agentSessionId ?? null;\n this.attachAgentSessionId = options.agentSessionId ?? null;\n }\n\n async start(): Promise<void> {\n if (this.connectionHandle) {\n throw new Error('Relay bridge already started');\n }\n\n this.connectionHandle = this.orchestrator.addClient({\n canSend: () => !this.canceled && this.ws?.readyState === WebSocket.OPEN,\n send: (message) => {\n this.handleOutbound(message);\n },\n });\n this.ensureAgentSessionExists();\n\n let backoffMs = 1_000;\n\n while (!this.stopped) {\n try {\n await this.establishConnection();\n this.clearLoginWait();\n backoffMs = 1_000;\n } catch (error) {\n if (isLoginRequiredError(error) || isUnauthorizedApiError(error)) {\n if (!this.waitingForLogin) {\n this.waitingForLogin = true;\n this.logger.error(\n `Stored CLI credentials are missing or expired${\n error instanceof ApiError ? ` (backend responded with HTTP ${error.status})` : ''\n }. Run \\`omnara auth login\\` in another terminal. Waiting 30s\u2026`,\n );\n } else {\n this.logger.debug('Relay bridge still waiting for credentials...');\n }\n await delay(LOGIN_WAIT_DELAY_MS);\n continue;\n }\n const aborted = isAbortError(error);\n if (this.stopped || aborted) {\n if (aborted) {\n this.stopped = true;\n }\n break;\n }\n this.logger.error(\n `Relay connection failed: ${extractErrorMessage(error)}. Retrying in ${Math.round(backoffMs / 1000)}s.`,\n );\n await delay(backoffMs);\n backoffMs = Math.min(backoffMs * 2, 30_000);\n }\n }\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n this.currentAgentSessionId = null;\n this.browserOpened = false;\n this.canceled = false;\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n if (this.connectionHandle) {\n this.connectionHandle.disconnect();\n this.connectionHandle = null;\n }\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1000, 'CLI shutting down');\n }\n this.ws = null;\n }\n\n private async establishConnection(): Promise<void> {\n const authProvider = await this.getAuthProvider();\n const client = new ApiClient({ baseUrl: this.backendUrl });\n\n const accessToken = await authProvider.getAccessToken({ interactive: false });\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 this.logger.log(\n `Dashboard available at ${new URL('dashboard', this.frontendUrl).toString()}`,\n );\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 interactive: false,\n });\n }\n return this.authProviderPromise;\n }\n\n private ensureAgentSessionExists(): string {\n if (!this.currentAgentSessionId) {\n this.currentAgentSessionId = this.attachAgentSessionId ?? 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 ensureUserSession(client, accessToken, {\n workspaceId: this.workspaceId,\n metadata: { source: 'cli' },\n });\n this.userSessionId = descriptor.session_id;\n this.logger.log(`Created user session ${this.userSessionId} for workspace ${this.workspaceId}`);\n return this.userSessionId;\n }\n\n private async sendPrimarySessionInit(ws: WebSocket): Promise<void> {\n if (!this.userSessionId) {\n throw new Error('Cannot send session_init before user session is available.');\n }\n const agentSessionId = this.ensureAgentSessionExists();\n const initFrame: ControlMessage = {\n type: 'session_init',\n session_id: agentSessionId,\n user_session_id: this.userSessionId,\n session_type: 'CODE',\n parent_session_id: null,\n metadata: { session_type: 'CODE' }, // Include metadata for orchestrator to identify main session\n };\n this.sendFrame(initFrame, ws);\n }\n\n private sendFrame(frame: ControlMessage | MessageEnvelope, socket?: WebSocket | null): void {\n if (this.isMessageEnvelope(frame)) {\n if (!validateMessageEnvelope(frame)) {\n this.logger.error('[RelayBridge] Message envelope validation failed before sending', {\n frame: JSON.stringify(frame),\n errors: validateMessageEnvelope.errors,\n });\n return;\n }\n }\n\n const serialized = JSON.stringify(frame);\n const target = socket ?? this.ws;\n if (target && target.readyState === WebSocket.OPEN) {\n try {\n target.send(serialized);\n return;\n } catch (error) {\n this.logger.error(`Failed to send relay frame: ${extractErrorMessage(error)}`);\n if (target === this.ws) {\n this.closeCurrentSocket();\n }\n }\n }\n this.enqueue(serialized);\n }\n\n private async handleWebsocketLifecycle(ws: WebSocket): Promise<void> {\n await new Promise<void>((resolve) => {\n const onMessage = (data: WebSocket.RawData) => {\n this.handleInbound(data);\n };\n\n const onClose = (code: number, reason: Buffer) => {\n this.logger.warn(\n `Relay websocket closed (code ${code}${reason.length ? `, reason: ${reason.toString()}` : ''})`,\n );\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (!this.stopped) {\n this.logger.error(`Relay websocket error: ${error.message}`);\n }\n };\n\n const cleanup = () => {\n ws.removeListener('message', onMessage);\n ws.removeListener('close', onClose);\n ws.removeListener('error', onError);\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n if (this.ws === ws) {\n this.ws = null;\n }\n };\n\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n\n if (this.stopped) {\n cleanup();\n resolve();\n }\n });\n }\n\n private handleOutbound(message: OutboundMessage): void {\n const frame = this.toRelayFrame(message);\n if (!frame) {\n return;\n }\n this.sendFrame(frame);\n }\n\n private handleInbound(data: WebSocket.RawData): void {\n let parsed: unknown;\n try {\n const text = typeof data === 'string' ? data : data.toString('utf8');\n parsed = JSON.parse(text);\n } catch (error) {\n this.logger.error(`Received invalid JSON from relay: ${extractErrorMessage(error)}`);\n return;\n }\n\n if (this.tryHandleControlMessage(parsed)) {\n return;\n }\n\n if (this.tryHandleMessageEnvelope(parsed)) {\n return;\n }\n\n this.logger.error('Received invalid relay message payload.', { payload: parsed });\n }\n\n private toRelayFrame(message: OutboundMessage): ControlMessage | MessageEnvelope | null {\n switch (message.type) {\n case 'session_init': {\n if (!this.userSessionId) {\n this.logger.warn('Dropping session_init frame: user session is not initialised yet.');\n return null;\n }\n const frame: ControlMessage = {\n type: 'session_init',\n session_id: message.sessionId,\n user_session_id: this.userSessionId,\n session_type: 'CODE',\n parent_session_id: message.parentSessionId ?? null,\n };\n if (message.metadata) {\n frame.metadata = message.metadata;\n }\n return frame;\n }\n case 'user_text':\n return this.buildUserTextEnvelope(message);\n case 'assistant_text':\n return this.buildTextEnvelope(message);\n case 'tool_call':\n return this.buildToolCallEnvelope(message);\n case 'tool_result':\n return this.buildToolResultEnvelope(message);\n case 'agent_complete':\n return this.buildAgentCompleteEnvelope(message);\n case 'agent_progress':\n return this.buildProgressEnvelope(message);\n default:\n return null;\n }\n }\n\n private tryHandleControlMessage(payload: unknown): boolean {\n if (!validateControlMessage(payload)) {\n return false;\n }\n const control = payload as ControlMessage;\n const type = control.type;\n switch (type) {\n case 'session_bootstrap':\n this.handleSessionBootstrap(control as ControlMessageSchema.SessionBootstrap);\n break;\n case 'session_init_ack':\n this.handleSessionInitAck(control as ControlMessageSchema.SessionInitAck);\n break;\n case 'session_announce':\n this.handleSessionAnnounce(control as ControlMessageSchema.SessionAnnounce);\n break;\n case 'session_closed':\n this.handleSessionClosed(control as ControlMessageSchema.SessionClosed);\n break;\n case 'heartbeat':\n if ((control as ControlMessageSchema.Heartbeat).mode === 'ping') {\n const response: ControlMessage = {\n type: 'heartbeat',\n mode: 'pong',\n sent_at: new Date().toISOString(),\n };\n this.sendFrame(response);\n }\n break;\n case 'cancel_agent':\n this.handleCancelAgent(control as ControlMessageSchema.CancelAgentMessage);\n break;\n case 'request':\n this.handleRelayRequest(control as ControlMessageSchema.RelayRequestMessage);\n break;\n default:\n this.logger.debug(`Ignoring control message ${type ?? 'unknown'}`);\n }\n return true;\n }\n\n private tryHandleMessageEnvelope(payload: unknown): boolean {\n if (!validateMessageEnvelope(payload)) {\n return false;\n }\n const envelope = payload as MessageEnvelope;\n this.handleMessageEnvelope(envelope);\n return true;\n }\n\n private handleSessionBootstrap(control: ControlMessageSchema.SessionBootstrap): void {\n const userSessionId = control.root.session_id;\n if (!this.userSessionId) {\n this.userSessionId = userSessionId;\n }\n if (this.userSessionId !== userSessionId) {\n this.logger.warn(\n `Bootstrap user session mismatch (expected ${this.userSessionId}, got ${userSessionId})`,\n );\n }\n\n // Track voice sessions from bootstrap FIRST before ensuring they exist\n for (const agent of control.agent_sessions ?? []) {\n if (agent.session_type === 'VOICE') {\n this.orchestrator.voiceSessionIds.add(agent.session_id);\n console.log('[RelayBridge] Tracking voice session from bootstrap:', {\n sessionId: agent.session_id,\n sessionType: agent.session_type,\n parentSessionId: agent.parent_session_id,\n });\n }\n }\n\n // Then ensure sessions exist\n for (const agent of control.agent_sessions ?? []) {\n this.orchestrator.ensureSessionExists(agent.session_id);\n }\n }\n\n private handleSessionInitAck(control: ControlMessageSchema.SessionInitAck): void {\n const sessionId = control.session_id;\n // Only track the main agent session (not worker child sessions)\n // Workers have a parent_session_id, main sessions don't\n const isMainSession = !control.parent_session_id;\n\n if (isMainSession) {\n if (!this.currentAgentSessionId) {\n this.currentAgentSessionId = sessionId;\n } else if (this.currentAgentSessionId !== sessionId) {\n this.logger.warn(\n `Session init ack for unexpected main session: ${sessionId} (current=${this.currentAgentSessionId})`,\n );\n }\n } else {\n // This is a worker session, log it but don't update currentAgentSessionId\n this.logger.debug(\n `Worker session init ack: ${sessionId} (parent=${control.parent_session_id})`,\n );\n }\n }\n\n private handleSessionAnnounce(control: ControlMessageSchema.SessionAnnounce): void {\n if (control.session.kind === 'agent_session') {\n // Track voice sessions from announcements FIRST\n if (control.session.session_type === 'VOICE') {\n this.orchestrator.voiceSessionIds.add(control.session.session_id);\n console.log('[RelayBridge] Tracking voice session from announce:', {\n sessionId: control.session.session_id,\n sessionType: control.session.session_type,\n });\n }\n\n this.orchestrator.ensureSessionExists(control.session.session_id);\n }\n }\n\n private async handleCancelAgent(control: ControlMessageSchema.CancelAgentMessage): Promise<void> {\n this.logger.info(\n `Received cancel request for session ${control.target_session_id}${control.reason ? ` (reason: ${control.reason})` : ''}`,\n );\n\n // Check if it's targeting the main orchestrator session\n if (control.target_session_id === this.currentAgentSessionId) {\n // Cancel request for main orchestrator session\n this.logger.info('Cancel request for main orchestrator session');\n await this.orchestrator.cancel();\n } else {\n // Cancel a worker\n const success = this.orchestrator.getWorkerManager().cancelWorker(control.target_session_id);\n if (success) {\n this.logger.info(`Worker cancellation succeeded for ${control.target_session_id}`);\n } else {\n this.logger.warn(\n `Worker cancellation failed for ${control.target_session_id} (worker not found or already completed)`,\n );\n }\n }\n }\n\n private handleSessionClosed(control: ControlMessageSchema.SessionClosed): void {\n const closedSessionId = control.session_id;\n this.logger.info(`Session closed: ${closedSessionId} -> status ${control.status}`);\n\n // Check if this is the main orchestrator session being canceled\n if (closedSessionId === this.currentAgentSessionId) {\n this.logger.info(\n `Main orchestrator session ${closedSessionId} was canceled. Stopping message sending.`,\n );\n this.canceled = true;\n }\n }\n\n private async handleGitDiffRequest(\n request: ControlMessageSchema.GitDiffRequest,\n ): Promise<ControlMessageSchema.GitDiffResponse> {\n const branchName = request.branch;\n\n try {\n let git: SimpleGit;\n if (branchName !== null) {\n // Get the WorktreeManager from the orchestrator\n const worktreeManager = this.orchestrator.getWorkerManager().getWorktreeManager();\n\n // Find the worktree for the given branch\n const allWorktrees = worktreeManager.listActiveWorktrees();\n const worktree = allWorktrees.find(\n (wt: { branchName: string }) => wt.branchName === branchName,\n );\n\n if (!worktree) {\n this.logger.warn(`No worktree found for branch: ${branchName}`);\n return {\n type: 'git_diff',\n diff: null,\n };\n }\n git = simpleGit(worktree.worktreePath);\n } else {\n git = simpleGit(this.orchestrator.getWorkerManager().repoPath);\n }\n\n // Try fallback refs in order: main, master, origin/HEAD\n let baseRef = 'main';\n const fallbackRefs = ['main', 'master', 'origin/HEAD'];\n for (const ref of fallbackRefs) {\n try {\n await git.raw(['rev-parse', '--verify', ref]);\n this.logger.info(`Using fallback base_ref: ${ref}`);\n baseRef = ref;\n break;\n } catch {\n // This ref doesn't exist, try the next one\n }\n }\n\n const diffOutput = await git.raw(\n branchName ? ['diff', `${baseRef}...${branchName}`, '--numstat'] : ['diff', '--numstat'],\n );\n\n // Parse the output\n const lines = diffOutput\n .trim()\n .split('\\n')\n .filter((line: string) => line.length > 0);\n const diff: Array<{\n path: string;\n status: 'modified' | 'added' | 'deleted';\n additions: number;\n deletions: number;\n }> = [];\n\n for (const line of lines) {\n const parts = line.split('\\t');\n if (parts.length !== 3) {\n continue; // Skip malformed lines\n }\n\n const additions = parseInt(parts[0], 10);\n const deletions = parseInt(parts[1], 10);\n const filepath = parts[2];\n\n // Determine file status\n let status: 'modified' | 'added' | 'deleted';\n if (additions > 0 && deletions === 0) {\n status = 'added';\n } else if (additions === 0 && deletions > 0) {\n status = 'deleted';\n } else {\n status = 'modified';\n }\n\n diff.push({\n path: filepath,\n status,\n additions: isNaN(additions) ? 0 : additions,\n deletions: isNaN(deletions) ? 0 : deletions,\n });\n }\n\n this.logger.info(`Git diff for branch ${branchName}: ${diff.length} files changed`);\n\n return {\n type: 'git_diff',\n diff: diff.length > 0 ? diff : null,\n };\n } catch (error) {\n this.logger.error(`Failed to get git diff for branch ${branchName}:`, error);\n return {\n type: 'git_diff',\n diff: null,\n };\n }\n }\n\n private async handleRelayRequest(\n control: ControlMessageSchema.RelayRequestMessage,\n ): Promise<void> {\n const requestId = control.request_id;\n const request = control.request;\n let response: ControlMessageSchema.Response;\n switch (request.type) {\n case 'completions':\n response = await this.orchestrator.getCompletions(\n request as ControlMessageSchema.CompletionsRequest,\n );\n break;\n case 'git_diff':\n response = await this.handleGitDiffRequest(request as ControlMessageSchema.GitDiffRequest);\n break;\n default:\n response = {\n type: 'error',\n error: `Request failed: Unknown relay request type ${request.type}`,\n };\n }\n\n const socket = this.ws;\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n const frame: ControlMessage = {\n type: 'response',\n request_id: requestId,\n response,\n };\n this.sendFrame(frame, socket);\n }\n\n private handleMessageEnvelope(envelope: MessageEnvelope): void {\n const content = envelope.payload.content;\n const isUserMessage = envelope.sender.kind === 'user';\n const isAgentUserMessage =\n envelope.sender.kind === 'agent_session' && envelope.metadata?.role === 'user';\n\n // Filter out voice transcript messages - they're just for logging, not for orchestrator\n const isVoiceTranscript =\n envelope.payload.metadata?.subtype === 'user_voice_transcript' ||\n envelope.payload.metadata?.subtype === 'agent_voice_transcript';\n\n // Accept messages from users OR from agent sessions acting as users (like voice agent)\n // BUT exclude voice transcripts\n if (\n this.isTextContent(content) &&\n (isUserMessage || isAgentUserMessage) &&\n !isVoiceTranscript\n ) {\n // Check if this is a message TO a voice session\n const isToVoiceSession = this.orchestrator.voiceSessionIds.has(envelope.session_id);\n\n if (isToVoiceSession) {\n this.logger.info(\n `Filtering out message to voice session ${envelope.session_id} from ${envelope.sender.kind} (id: ${envelope.sender.id})`,\n );\n return;\n }\n\n this.logger.info(\n `Processing message from ${envelope.sender.kind} (id: ${envelope.sender.id}, role: ${envelope.metadata?.role}) to session ${envelope.session_id}`,\n );\n\n // Include sender information so orchestrator knows who sent the message\n this.connectionHandle?.dispatch({\n type: 'chat',\n sessionId: envelope.session_id,\n text: content.text,\n senderId: envelope.sender.id,\n senderKind: envelope.sender.kind,\n });\n return;\n }\n const label = (content as { type?: string }).type ?? 'unknown';\n const subtype = envelope.payload.metadata?.subtype;\n this.logger.debug(\n `Ignoring inbound envelope from ${envelope.sender.kind} with content type ${label}, role ${envelope.metadata?.role}${subtype ? `, subtype: ${subtype}` : ''}`,\n );\n }\n\n private isTextContent(\n content: MessageEnvelopeSchema.Content,\n ): content is MessageEnvelopeSchema.TextContent {\n return typeof (content as MessageEnvelopeSchema.TextContent).text === 'string';\n }\n\n private buildUserTextEnvelope(\n message: Extract<OutboundMessage, { type: 'user_text' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.TextContent = {\n type: 'text',\n text: message.text,\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n // Sender is the worker if workerId is present, otherwise the session itself\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for user messages\n envelope.metadata = {\n ...envelope.metadata,\n role: 'user',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private buildTextEnvelope(\n message: Extract<OutboundMessage, { type: 'assistant_text' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.TextContent = {\n type: 'text',\n text: message.text,\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n // Sender is the worker if workerId is present, otherwise the session itself\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for assistant messages\n envelope.metadata = {\n ...envelope.metadata,\n role: 'assistant',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private buildToolCallEnvelope(\n message: Extract<OutboundMessage, { type: 'tool_call' }>,\n ): MessageEnvelope {\n const args: Record<string, unknown> = this.normalizeToolArguments(message.input);\n const content: MessageEnvelopeSchema.ToolCallContent = {\n type: 'tool_call',\n name: message.toolName,\n tool_use_id: message.toolUseId,\n arguments: args,\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for assistant tool calls\n envelope.metadata = {\n ...envelope.metadata,\n role: 'assistant',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private normalizeToolArguments(input: unknown): Record<string, unknown> {\n if (input && typeof input === 'object' && !Array.isArray(input)) {\n return input as Record<string, unknown>;\n }\n return { value: input };\n }\n\n private buildToolResultEnvelope(\n message: Extract<OutboundMessage, { type: 'tool_result' }>,\n ): MessageEnvelope {\n const output: Record<string, unknown> =\n typeof message.content === 'object' && message.content !== null\n ? (message.content as Record<string, unknown>)\n : { value: message.content };\n const content: MessageEnvelopeSchema.ToolResultContent = {\n type: 'tool_result',\n tool_use_id: message.toolUseId,\n output,\n is_error: Boolean(message.isError),\n };\n const payloadMetadata =\n message.workerId || message.workerTask\n ? {\n worker_id: message.workerId,\n worker_task: message.workerTask,\n }\n : undefined;\n const senderSessionId = message.workerId ?? message.sessionId;\n const envelope = this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n payloadMetadata,\n messageId: message.messageId,\n });\n\n // Add role metadata for assistant tool results\n envelope.metadata = {\n ...envelope.metadata,\n role: 'assistant',\n transport: 'relay',\n };\n\n return envelope;\n }\n\n private buildAgentCompleteEnvelope(\n message: Extract<OutboundMessage, { type: 'agent_complete' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.AgentCompleteContent = {\n type: 'agent_complete',\n success: message.success,\n duration_ms: message.durationMs ?? null,\n cost_usd: message.costUsd ?? null,\n message: message.message ?? null,\n };\n if (message.metadata) {\n content.metadata = message.metadata;\n }\n\n const metadataAgent =\n typeof message.metadata?.agent_session_id === 'string'\n ? (message.metadata.agent_session_id as string)\n : undefined;\n const senderSessionId = metadataAgent ?? this.currentAgentSessionId ?? message.sessionId;\n return this.buildEnvelope({\n sessionId: message.sessionId,\n senderSessionId,\n content,\n messageId: message.messageId,\n });\n }\n\n private buildProgressEnvelope(\n message: Extract<OutboundMessage, { type: 'agent_progress' }>,\n ): MessageEnvelope {\n const content: MessageEnvelopeSchema.AgentProgressContent = {\n type: 'agent_progress',\n status: message.status,\n };\n if (message.detail) {\n content.detail = message.detail;\n }\n if (message.metadata) {\n content.metadata = message.metadata;\n }\n\n const metadataAgent =\n typeof message.metadata?.agent_session_id === 'string'\n ? (message.metadata.agent_session_id as string)\n : undefined;\n const sessionId =\n message.sessionId ?? this.currentAgentSessionId ?? this.ensureAgentSessionExists();\n const senderSessionId = metadataAgent ?? this.currentAgentSessionId ?? sessionId;\n\n return this.buildEnvelope({\n sessionId,\n senderSessionId,\n content,\n messageId: message.messageId,\n });\n }\n\n private buildEnvelope(options: {\n sessionId: string;\n senderSessionId?: string;\n content: MessageEnvelopeSchema.Content;\n payloadMetadata?: Record<string, unknown>;\n messageId?: string;\n }): MessageEnvelope {\n const payload: MessageEnvelopeSchema.MessagePayload = {\n version: 0,\n content: options.content,\n };\n if (options.payloadMetadata && Object.keys(options.payloadMetadata).length > 0) {\n payload.metadata = options.payloadMetadata;\n }\n\n const sender: MessageEnvelopeSchema.SenderRef = {\n kind: 'agent_session',\n id: options.senderSessionId ?? options.sessionId,\n };\n\n const envelope: MessageEnvelope = {\n message_id: options.messageId ?? randomUUID(),\n session_id: options.sessionId,\n sender,\n payload,\n created_at: new Date().toISOString(),\n };\n\n return envelope;\n }\n\n private isMessageEnvelope(frame: ControlMessage | MessageEnvelope): frame is MessageEnvelope {\n return (frame as MessageEnvelope).payload !== undefined;\n }\n\n private enqueue(serialized: string): void {\n if (this.pendingOutbound.length >= MAX_QUEUE_SIZE) {\n this.pendingOutbound.shift();\n }\n this.pendingOutbound.push(serialized);\n }\n\n private flushQueue(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n while (this.pendingOutbound.length > 0) {\n const payload = this.pendingOutbound.shift();\n if (!payload) {\n continue;\n }\n try {\n this.ws.send(payload);\n } catch (error) {\n this.logger.error(`Failed to flush relay queue: ${extractErrorMessage(error)}`);\n this.pendingOutbound.unshift(payload);\n this.closeCurrentSocket();\n break;\n }\n }\n }\n\n private startPingTimer(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n }\n const interval = Math.max(this.heartbeatIntervalMs, 5_000);\n this.pingTimer = setInterval(() => {\n const socket = this.ws;\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n const frame: ControlMessage = {\n type: 'heartbeat',\n mode: 'ping',\n sent_at: new Date().toISOString(),\n };\n this.sendFrame(frame, socket);\n }, interval);\n }\n\n private clearLoginWait(): void {\n if (this.waitingForLogin) {\n this.waitingForLogin = false;\n this.logger.log('Credentials refreshed. Resuming relay connection attempts.');\n }\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\nfunction isLoginRequiredError(error: unknown): error is AuthContextError {\n return (\n error instanceof AuthContextError &&\n (error.code === 'missing_credentials' ||\n error.code === 'refresh_token_unavailable' ||\n error.code === 'refresh_failed')\n );\n}\n\nfunction isUnauthorizedApiError(error: unknown): error is ApiError {\n return error instanceof ApiError && (error.status === 401 || error.status === 403);\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 access tokens one minute before expiry\n\nexport type AuthContextErrorCode =\n | 'missing_credentials'\n | 'refresh_token_unavailable'\n | 'access_token_missing'\n | 'access_token_expired'\n | 'refresh_failed'\n | 'network_error';\n\nexport class AuthContextError extends Error {\n readonly code: AuthContextErrorCode;\n readonly status?: number;\n\n constructor(\n message: string,\n code: AuthContextErrorCode,\n options?: { cause?: unknown; status?: number },\n ) {\n super(message, { cause: options?.cause });\n this.name = 'AuthContextError';\n this.code = code;\n this.status = options?.status;\n }\n}\n\nexport interface AuthContext {\n credentials: StoredCredentials;\n accessToken: string;\n}\n\nexport async function ensureAuthContext(\n store: CredentialsStore,\n backendUrl: string,\n initialCredentials?: StoredCredentials | null,\n): Promise<AuthContext> {\n const credentials = initialCredentials ?? (await store.load());\n if (!credentials) {\n throw new AuthContextError(\n 'No credentials found. Run `omnara auth login` first.',\n 'missing_credentials',\n );\n }\n\n if (!credentials.refreshToken) {\n throw new AuthContextError(\n 'Refresh token unavailable. Please run `omnara auth login`.',\n 'refresh_token_unavailable',\n );\n }\n\n if (!credentials.accessToken) {\n return await refreshWithStoredToken(store, credentials, backendUrl, 'access_token_missing');\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 reasonCode: Extract<AuthContextErrorCode, 'access_token_missing' | 'access_token_expired'>,\n): Promise<AuthContext> {\n return await store.withLock(async () => {\n const latest = await store.load();\n const effective = latest ?? credentials;\n\n if (effective.accessToken && !isExpiring(effective.accessTokenExpiresAt, EXPIRY_BUFFER_MS)) {\n return { credentials: effective, accessToken: effective.accessToken };\n }\n\n const refreshToken = effective.refreshToken;\n if (!refreshToken) {\n throw new AuthContextError(\n `Cannot refresh Supabase session because no refresh token is stored. Please run \\`omnara auth login\\`.`,\n 'refresh_token_unavailable',\n );\n }\n\n const reasonMessage =\n reasonCode === 'access_token_missing' ? 'No access token stored.' : 'Access token expired.';\n\n let supabase;\n try {\n const supabaseConfig = await getSupabaseAuthConfig(backendUrl);\n supabase = buildSupabaseClient(supabaseConfig);\n } catch (error) {\n throw new AuthContextError(\n `${reasonMessage} Failed to load Supabase configuration: ${extractErrorMessage(error)}.`,\n 'network_error',\n { cause: error },\n );\n }\n\n let refreshResult;\n try {\n refreshResult = await supabase.auth.refreshSession({ refresh_token: refreshToken });\n } catch (error) {\n throw new AuthContextError(\n `${reasonMessage} Failed to reach Supabase auth service: ${extractErrorMessage(error)}.`,\n 'network_error',\n { cause: error },\n );\n }\n\n const { data, error } = refreshResult;\n if (error || !data?.session) {\n const status = typeof error?.status === 'number' ? error.status : undefined;\n const code: AuthContextErrorCode =\n status && status >= 400 && status < 500 ? 'refresh_failed' : 'network_error';\n throw new AuthContextError(\n `${reasonMessage} Failed to refresh Supabase session: ${error?.message ?? 'unknown error'}.`,\n code,\n { cause: error, status },\n );\n }\n\n const updated = applySession(effective, data.session);\n\n await store.save(updated);\n if (!updated.accessToken) {\n throw new AuthContextError(\n 'Supabase refresh completed without an access token.',\n 'refresh_failed',\n );\n }\n return { credentials: updated, accessToken: updated.accessToken };\n });\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 };\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\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\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 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 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 relayWsPath: wire.relay_ws_path,\n relayHeartbeatIntervalSec: wire.relay_heartbeat_interval_sec,\n };\n}\n", "import { createHash, randomBytes } from 'crypto';\n\nexport interface PkcePair {\n verifier: string;\n challenge: string;\n method: 'S256';\n}\n\nexport function generatePkcePair(): PkcePair {\n const verifier = base64UrlEncode(randomBytes(32));\n const challenge = base64UrlEncode(createHash('sha256').update(verifier).digest());\n return { verifier, challenge, method: 'S256' };\n}\n\nfunction base64UrlEncode(input: Buffer | Uint8Array | string): string {\n const buffer =\n typeof input === 'string'\n ? Buffer.from(input, 'utf8')\n : Buffer.from(input as Buffer | Uint8Array);\n return buffer.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n", "import http from 'http';\nimport type { AddressInfo } from 'net';\nimport { randomBytes } from 'crypto';\n\nexport interface LoopbackCallback {\n code: string;\n sessionId: string | null;\n state: string | null;\n}\n\nconst CALLBACK_PATH = '/callback';\nconst LISTEN_HOST = '127.0.0.1';\n\nexport class LoopbackListener {\n static async create(): Promise<LoopbackListener | null> {\n const listener = new LoopbackListener(generateState());\n try {\n await listener.start();\n return listener;\n } catch {\n await listener.stop().catch(() => undefined);\n return null;\n }\n }\n\n readonly state: string;\n redirectUri: string;\n\n private readonly server: http.Server;\n private resolveCallback: ((value: LoopbackCallback) => void) | null = null;\n private rejectCallback: ((reason?: unknown) => void) | null = null;\n private pending: Promise<LoopbackCallback> | null = null;\n\n private constructor(state: string) {\n this.state = state;\n this.redirectUri = '';\n this.server = http.createServer((request, response) => {\n void this.handleRequest(request, response);\n });\n }\n\n async waitForCallback(): Promise<LoopbackCallback> {\n if (this.pending) {\n return this.pending;\n }\n this.pending = new Promise<LoopbackCallback>((resolve, reject) => {\n this.resolveCallback = resolve;\n this.rejectCallback = reject;\n });\n return this.pending;\n }\n\n async stop(): Promise<void> {\n if (!this.server.listening) {\n return;\n }\n await new Promise<void>((resolve) => {\n this.server.close(() => resolve());\n });\n }\n\n private async start(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.server.once('error', reject);\n this.server.listen(0, LISTEN_HOST, () => {\n this.server.removeListener('error', reject);\n resolve();\n });\n });\n\n const address = this.server.address();\n if (!address || typeof address === 'string') {\n throw new Error('Loopback listener failed to bind');\n }\n const { port } = address as AddressInfo;\n this.redirectUri = `http://${LISTEN_HOST}:${port}${CALLBACK_PATH}`;\n }\n\n private async handleRequest(\n request: http.IncomingMessage,\n response: http.ServerResponse,\n ): Promise<void> {\n if (request.method !== 'GET' || !request.url) {\n this.respond(response, 405, 'Method Not Allowed');\n return;\n }\n\n const url = new URL(request.url, `http://${request.headers.host ?? LISTEN_HOST}`);\n if (url.pathname !== CALLBACK_PATH) {\n this.respond(response, 404, 'Not Found');\n return;\n }\n\n const code = url.searchParams.get('code');\n const sessionId = url.searchParams.get('session');\n const state = url.searchParams.get('state');\n\n if (!code) {\n this.respond(\n response,\n 400,\n buildMessageHtml('Missing authorization code. Return to your CLI and try again.'),\n );\n return;\n }\n\n this.respond(response, 200, buildSuccessHtml());\n\n if (this.resolveCallback) {\n this.resolveCallback({ code, sessionId, state });\n this.resolveCallback = null;\n this.rejectCallback = null;\n }\n\n void this.stop();\n }\n\n private respond(response: http.ServerResponse, status: number, body: string): void {\n response.writeHead(status, {\n 'content-type': 'text/html; charset=utf-8',\n 'cache-control': 'no-store',\n });\n response.end(body);\n }\n}\n\nfunction buildSuccessHtml(): string {\n const redirectTarget = 'https://www.omnara.com/dashboard';\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <meta http-equiv=\"refresh\" content=\"3;url=${redirectTarget}\" />\n <title>Omnara CLI Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #090909; color: #f4f4f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }\n .card { max-width: 420px; padding: 2.5rem; background: rgba(32, 32, 36, 0.85); border-radius: 14px; box-shadow: 0 20px 40px rgba(0,0,0,0.35); text-align: center; }\n h1 { font-size: 1.5rem; margin-bottom: 0.75rem; }\n p { margin: 0 0 0.75rem; line-height: 1.5; }\n .note { font-size: 0.85rem; color: rgba(244,244,245,0.7); }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <h1>Redirecting back to the CLI\u2026</h1>\n <p>Your authentication details were sent to the Omnara CLI. Return to your terminal to continue.</p>\n <p class=\"note\">If this page doesn't close automatically, you can manually open the Omnara dashboard.</p>\n </div>\n </body>\n</html>`;\n}\n\nfunction generateState(): string {\n return base64UrlEncode(randomBytes(32));\n}\n\nfunction base64UrlEncode(input: Buffer | Uint8Array | string): string {\n const buffer =\n typeof input === 'string'\n ? Buffer.from(input, 'utf8')\n : Buffer.from(input as Buffer | Uint8Array);\n return buffer.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\nfunction buildMessageHtml(message: string): string {\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <title>Omnara CLI Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #090909; color: #f4f4f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }\n .card { max-width: 420px; padding: 2.5rem; background: rgba(32, 32, 36, 0.85); border-radius: 14px; box-shadow: 0 20px 40px rgba(0,0,0,0.35); text-align: center; }\n h1 { font-size: 1.4rem; margin-bottom: 0.75rem; }\n p { margin: 0; line-height: 1.6; }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <h1>Omnara CLI Login</h1>\n <p>${message}</p>\n </div>\n </body>\n</html>`;\n}\n", "import { spawn } from 'child_process';\n\nconst buildBrowserFailureMessage = (url: string): string =>\n `Unable to automatically open ${url}. Please copy and paste this link into your browser.`;\n\nexport function tryOpenBrowser(url: string): void {\n const command =\n process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';\n\n const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];\n\n const handleFailure = (error?: unknown): void => {\n const baseMessage = buildBrowserFailureMessage(url);\n if (error && typeof error === 'object' && 'code' in error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n console.warn(\n `${baseMessage} Command \"${command}\" was not found. Install xdg-utils or set the BROWSER environment variable, then rerun the login.`,\n );\n return;\n }\n }\n\n if (process.env.DEBUG && error) {\n const details = error instanceof Error ? error.message : String(error);\n console.warn(`${baseMessage} (${details}).`);\n return;\n }\n\n console.warn(baseMessage);\n };\n\n try {\n const child = spawn(command, args, { stdio: 'ignore', detached: true });\n child.on('error', handleFailure);\n child.unref();\n } catch (error) {\n handleFailure(error);\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';\nimport chalk from 'chalk';\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(chalk.yellow('Authenticating 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(chalk.green('\\n\\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(\n chalk.gray(\"\\nInput fallback code if automatic login doesn't complete: \"),\n );\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\n return {\n accessToken: args.exchange.accessToken,\n accessTokenExpiresAt: accessExpiresAt,\n refreshToken: args.exchange.refreshToken,\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(\n chalk.blue.bold('\\nOpen this link in your browser if it did not open automatically:'),\n );\n console.log(chalk.blueBright.underline(`${session.verificationUriComplete}`));\n console.log(chalk.blue('\\nApprove 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, type StoredCredentials } from './credentials-store.js';\nimport { ensureAuthContext, type AuthContext, AuthContextError } from './credential-manager.js';\nimport { performVerificationLogin } from './login-flow.js';\nimport { normalizeBaseUrl } from '../http/api-client.js';\n\nconst TOKEN_REFRESH_BUFFER_MS = 60_000;\n\nexport interface AuthProviderOptions {\n store: CredentialsStore;\n backendUrl: string;\n frontendUrl?: string;\n logger?: Console;\n interactive?: boolean;\n login?: typeof performVerificationLogin;\n}\n\nexport interface AuthAccessOptions {\n interactive?: boolean;\n}\n\nexport class AuthProvider {\n private cached: AuthContext | null = null;\n private inflight: Promise<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(options?: AuthAccessOptions): Promise<AuthContext> {\n const interactive = options?.interactive ?? true;\n const snapshot = await this.options.store.load();\n const useCache =\n this.cached &&\n isAccessTokenFresh(this.cached) &&\n credentialsEqual(this.cached.credentials, snapshot ?? null);\n\n if (useCache && this.cached) {\n return this.cached;\n }\n\n let inflight = this.inflight;\n if (!inflight) {\n const pending = this.loadAuthContext(snapshot ?? null, interactive);\n inflight = pending.finally(() => {\n if (this.inflight === inflight) {\n this.inflight = null;\n }\n });\n this.inflight = inflight;\n }\n const auth = await inflight;\n this.cached = auth;\n return auth;\n }\n\n async getAccessToken(options?: AuthAccessOptions): Promise<string> {\n const auth = await this.getAuthContext(options);\n return auth.accessToken;\n }\n\n private async loadAuthContext(\n prefetched: StoredCredentials | null,\n interactive: boolean,\n ): Promise<AuthContext> {\n try {\n const context = await ensureAuthContext(this.options.store, this.backendUrl, prefetched);\n this.cached = context;\n return context;\n } catch (error) {\n if (!shouldAttemptLogin(error)) {\n throw error;\n }\n if (!interactive) {\n throw error;\n }\n const loginFn = this.options.login ?? performVerificationLogin;\n this.options.logger?.log('Opening browser to authenticate\u2026');\n await loginFn({\n backendUrlOption: this.backendUrl,\n frontendUrlOption: this.options.frontendUrl,\n store: this.options.store,\n });\n const context = await ensureAuthContext(this.options.store, this.backendUrl);\n this.cached = context;\n return context;\n }\n }\n}\n\nfunction isAccessTokenFresh(context: AuthContext): boolean {\n const expiresAt = context.credentials.accessTokenExpiresAt;\n if (!expiresAt) {\n return false;\n }\n const timestamp = Date.parse(expiresAt);\n if (Number.isNaN(timestamp)) {\n return false;\n }\n return timestamp - TOKEN_REFRESH_BUFFER_MS > Date.now();\n}\n\nfunction shouldAttemptLogin(error: unknown): boolean {\n if (error instanceof AuthContextError) {\n return authContextErrorRequiresLogin(error);\n }\n return false;\n}\n\nfunction authContextErrorRequiresLogin(error: AuthContextError): boolean {\n switch (error.code) {\n case 'missing_credentials':\n case 'refresh_token_unavailable':\n return true;\n case 'refresh_failed':\n return error.status ? error.status >= 400 && error.status < 500 : true;\n default:\n return false;\n }\n}\n\nfunction credentialsEqual(a: StoredCredentials | null, b: StoredCredentials | null): boolean {\n if (!a && !b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n return (\n a.accessToken === b.accessToken &&\n a.accessTokenExpiresAt === b.accessTokenExpiresAt &&\n a.refreshToken === b.refreshToken\n );\n}\n\nexport async function createAuthProvider(options: AuthProviderOptions): Promise<AuthProvider> {\n const provider = new AuthProvider(options);\n return provider;\n}\n", "import { ApiClient } from './api-client.js';\n\ninterface CreateUserSessionRequestWire {\n workspace_id: string;\n user_session_id?: string | null;\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 interface EnsureUserSessionOptions {\n workspaceId: string;\n userSessionId?: string;\n name?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport async function ensureUserSession(\n client: ApiClient,\n accessToken: string,\n options: EnsureUserSessionOptions,\n): Promise<UserSessionDescriptor> {\n const body: CreateUserSessionRequestWire = {\n workspace_id: options.workspaceId,\n user_session_id: options.userSessionId ?? null,\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 machineMessageSchema from \"../../schemas/machine_message.schema.json\" with { type: \"json\" };\nimport voiceLaunchRequestSchema from \"../../schemas/api_voice_launch_request.schema.json\" with { type: \"json\" };\nimport voiceLaunchResponseSchema from \"../../schemas/api_voice_launch_response.schema.json\" with { type: \"json\" };\nimport createUserSessionRequestSchema from \"../../schemas/api_sessions_create_request.schema.json\" with { type: \"json\" };\nimport userSessionSummarySchema from \"../../schemas/api_sessions_summary.schema.json\" with { type: \"json\" };\nimport userSessionListResponseSchema from \"../../schemas/api_sessions_list_response.schema.json\" with { type: \"json\" };\nimport messagePageResponseSchema from \"../../schemas/api_sessions_message_page_response.schema.json\" with { type: \"json\" };\nimport agentSessionDetailSchema from \"../../schemas/api_sessions_agent_detail.schema.json\" with { type: \"json\" };\nimport createChatMessageRequestSchema from \"../../schemas/api_sessions_create_chat_message_request.schema.json\" with { type: \"json\" };\nimport subscriptionResponseSchema from \"../../schemas/api_billing_subscription_response.schema.json\" with { type: \"json\" };\nimport usageResponseSchema from \"../../schemas/api_billing_usage_response.schema.json\" with { type: \"json\" };\nimport createCheckoutRequestSchema from \"../../schemas/api_billing_create_checkout_request.schema.json\" with { type: \"json\" };\nimport checkoutResponseSchema from \"../../schemas/api_billing_checkout_response.schema.json\" with { type: \"json\" };\nimport validatePromoRequestSchema from \"../../schemas/api_billing_validate_promo_request.schema.json\" with { type: \"json\" };\nimport promoValidationResponseSchema from \"../../schemas/api_billing_promo_validation_response.schema.json\" with { type: \"json\" };\nimport customerPortalRequestSchema from \"../../schemas/api_billing_customer_portal_request.schema.json\" with { type: \"json\" };\nimport customerPortalResponseSchema from \"../../schemas/api_billing_customer_portal_response.schema.json\" with { type: \"json\" };\nimport notificationRequestSchema from \"../../schemas/api_settings_notification_request.schema.json\" with { type: \"json\" };\nimport notificationResponseSchema from \"../../schemas/api_settings_notification_response.schema.json\" with { type: \"json\" };\nimport workspaceConfigSchema from \"../../schemas/workspace_config.schema.json\" with { type: \"json\" };\nimport workspaceSessionLaunchRequestSchema from \"../../schemas/api_workspaces_session_launch_request.schema.json\" with { type: \"json\" };\nimport workspaceSessionLaunchResponseSchema from \"../../schemas/api_workspaces_session_launch_response.schema.json\" with { type: \"json\" };\nimport machineListResponseSchema from \"../../schemas/api_machines_list_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);\nexport const validateMachineMessage = ajv.compile(machineMessageSchema);\nexport const validateWorkspaceConfig = ajv.compile(workspaceConfigSchema);\nexport const validateWorkspaceSessionLaunchRequest = ajv.compile(workspaceSessionLaunchRequestSchema);\nexport const validateWorkspaceSessionLaunchResponse = ajv.compile(workspaceSessionLaunchResponseSchema);\n// Voice API validators\nexport const validateVoiceAgentLaunchRequest = ajv.compile(voiceLaunchRequestSchema);\nexport const validateVoiceAgentLaunchResponse = ajv.compile(voiceLaunchResponseSchema);\n// Sessions API validators\nexport const validateCreateUserSessionRequest = ajv.compile(createUserSessionRequestSchema);\nexport const validateUserSessionSummary = ajv.compile(userSessionSummarySchema);\nexport const validateUserSessionListResponse = ajv.compile(userSessionListResponseSchema);\nexport const validateMessagePageResponse = ajv.compile(messagePageResponseSchema);\nexport const validateAgentSessionDetail = ajv.compile(agentSessionDetailSchema);\nexport const validateCreateChatMessageRequest = ajv.compile(createChatMessageRequestSchema);\n// Billing API validators\nexport const validateSubscriptionResponse = ajv.compile(subscriptionResponseSchema);\nexport const validateUsageResponse = ajv.compile(usageResponseSchema);\nexport const validateCreateCheckoutSessionRequest = ajv.compile(createCheckoutRequestSchema);\nexport const validateCheckoutSessionResponse = ajv.compile(checkoutResponseSchema);\nexport const validateValidatePromoCodeRequest = ajv.compile(validatePromoRequestSchema);\nexport const validatePromoCodeValidationResponse = ajv.compile(promoValidationResponseSchema);\nexport const validateCustomerPortalSessionRequest = ajv.compile(customerPortalRequestSchema);\nexport const validateCustomerPortalSessionResponse = ajv.compile(customerPortalResponseSchema);\n// Settings API validators\nexport const validateUserNotificationSettingsRequest = ajv.compile(notificationRequestSchema);\nexport const validateUserNotificationSettingsResponse = ajv.compile(notificationResponseSchema);\n// Machines API validators\nexport const validateMachineListResponse = ajv.compile(machineListResponseSchema);\n", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/ControlMessage\",\n \"title\": \"ControlMessage\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"CancelAgentMessage\": {\n \"additionalProperties\": false,\n \"description\": \"Request to cancel a running agent generation.\",\n \"properties\": {\n \"type\": {\n \"const\": \"cancel_agent\",\n \"default\": \"cancel_agent\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"target_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Target Session Id\",\n \"type\": \"string\"\n },\n \"reason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Reason\"\n }\n },\n \"required\": [\n \"target_session_id\"\n ],\n \"title\": \"CancelAgentMessage\",\n \"type\": \"object\"\n },\n \"CompletionItem\": {\n \"description\": \"A single completion item with type and result\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"slash_command\",\n \"file\",\n \"agent\"\n ],\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"result\": {\n \"title\": \"Result\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"result\"\n ],\n \"title\": \"CompletionItem\",\n \"type\": \"object\"\n },\n \"CompletionsRequest\": {\n \"description\": \"Query for autocomplete options\",\n \"properties\": {\n \"type\": {\n \"const\": \"completions\",\n \"default\": \"completions\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"query\": {\n \"title\": \"Query\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"query\"\n ],\n \"title\": \"CompletionsRequest\",\n \"type\": \"object\"\n },\n \"CompletionsResponse\": {\n \"description\": \"List of autocomplete options (i.e. files or /commands)\",\n \"properties\": {\n \"type\": {\n \"const\": \"completions\",\n \"default\": \"completions\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"completions\": {\n \"items\": {\n \"$ref\": \"#/$defs/CompletionItem\"\n },\n \"title\": \"Completions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"completions\"\n ],\n \"title\": \"CompletionsResponse\",\n \"type\": \"object\"\n },\n \"ErrorResponse\": {\n \"properties\": {\n \"type\": {\n \"const\": \"error\",\n \"default\": \"error\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"error\": {\n \"title\": \"Error\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"error\"\n ],\n \"title\": \"ErrorResponse\",\n \"type\": \"object\"\n },\n \"FileDiffInfo\": {\n \"additionalProperties\": false,\n \"description\": \"Information about changes to a single file\",\n \"properties\": {\n \"path\": {\n \"title\": \"Path\",\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"modified\",\n \"added\",\n \"deleted\"\n ],\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"additions\": {\n \"title\": \"Additions\",\n \"type\": \"integer\"\n },\n \"deletions\": {\n \"title\": \"Deletions\",\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"path\",\n \"status\",\n \"additions\",\n \"deletions\"\n ],\n \"title\": \"FileDiffInfo\",\n \"type\": \"object\"\n },\n \"GitDiffRequest\": {\n \"description\": \"Query the git diff on a branch\",\n \"properties\": {\n \"type\": {\n \"const\": \"git_diff\",\n \"default\": \"git_diff\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"branch\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Branch\"\n }\n },\n \"required\": [\n \"branch\"\n ],\n \"title\": \"GitDiffRequest\",\n \"type\": \"object\"\n },\n \"GitDiffResponse\": {\n \"additionalProperties\": false,\n \"description\": \"Git diff response for a given branch\",\n \"properties\": {\n \"type\": {\n \"const\": \"git_diff\",\n \"default\": \"git_diff\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"diff\": {\n \"anyOf\": [\n {\n \"items\": {\n \"$ref\": \"#/$defs/FileDiffInfo\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Diff\"\n }\n },\n \"required\": [\n \"diff\"\n ],\n \"title\": \"GitDiffResponse\",\n \"type\": \"object\"\n },\n \"Heartbeat\": {\n \"additionalProperties\": false,\n \"description\": \"Ping/pong heartbeat frames.\",\n \"properties\": {\n \"type\": {\n \"const\": \"heartbeat\",\n \"default\": \"heartbeat\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"mode\": {\n \"default\": \"ping\",\n \"enum\": [\n \"ping\",\n \"pong\"\n ],\n \"title\": \"Mode\",\n \"type\": \"string\"\n },\n \"sent_at\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Sent At\"\n }\n },\n \"title\": \"Heartbeat\",\n \"type\": \"object\"\n },\n \"RelayRequestMessage\": {\n \"additionalProperties\": false,\n \"description\": \"RPC message for generic requests\",\n \"properties\": {\n \"type\": {\n \"const\": \"request\",\n \"default\": \"request\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"request_id\": {\n \"format\": \"uuid\",\n \"title\": \"Request Id\",\n \"type\": \"string\"\n },\n \"request\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/CompletionsRequest\"\n },\n {\n \"$ref\": \"#/$defs/GitDiffRequest\"\n }\n ],\n \"title\": \"Request\"\n }\n },\n \"required\": [\n \"request_id\",\n \"request\"\n ],\n \"title\": \"RelayRequestMessage\",\n \"type\": \"object\"\n },\n \"RelayResponseMessage\": {\n \"additionalProperties\": false,\n \"description\": \"RPC message for responses\",\n \"properties\": {\n \"type\": {\n \"const\": \"response\",\n \"default\": \"response\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"request_id\": {\n \"format\": \"uuid\",\n \"title\": \"Request Id\",\n \"type\": \"string\"\n },\n \"response\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/ErrorResponse\"\n },\n {\n \"$ref\": \"#/$defs/CompletionsResponse\"\n },\n {\n \"$ref\": \"#/$defs/GitDiffResponse\"\n }\n ],\n \"title\": \"Response\"\n }\n },\n \"required\": [\n \"request_id\",\n \"response\"\n ],\n \"title\": \"RelayResponseMessage\",\n \"type\": \"object\"\n },\n \"SessionAnnounce\": {\n \"additionalProperties\": false,\n \"description\": \"Notification that a session was created or updated.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_announce\",\n \"default\": \"session_announce\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n }\n ],\n \"title\": \"Session\"\n },\n \"origin\": {\n \"enum\": [\n \"backend\",\n \"client\"\n ],\n \"title\": \"Origin\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"session\",\n \"origin\"\n ],\n \"title\": \"SessionAnnounce\",\n \"type\": \"object\"\n },\n \"SessionBootstrap\": {\n \"additionalProperties\": false,\n \"description\": \"Initial snapshot of the session tree for this connection.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_bootstrap\",\n \"default\": \"session_bootstrap\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"root\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"root\"\n ],\n \"title\": \"SessionBootstrap\",\n \"type\": \"object\"\n },\n \"SessionClosed\": {\n \"additionalProperties\": false,\n \"description\": \"Indicates a session has been completed or shut down.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_closed\",\n \"default\": \"session_closed\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"status\"\n ],\n \"title\": \"SessionClosed\",\n \"type\": \"object\"\n },\n \"SessionInit\": {\n \"additionalProperties\": false,\n \"description\": \"Client request to register or refresh an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_init\",\n \"default\": \"session_init\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Session Id\",\n \"type\": \"string\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_session_id\",\n \"session_type\"\n ],\n \"title\": \"SessionInit\",\n \"type\": \"object\"\n },\n \"SessionInitAck\": {\n \"additionalProperties\": false,\n \"description\": \"Acknowledgement that a session_init was processed.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_init_ack\",\n \"default\": \"session_init_ack\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Session Id\",\n \"type\": \"string\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_session_id\"\n ],\n \"title\": \"SessionInitAck\",\n \"type\": \"object\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n }\n },\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/SessionInit\"\n },\n {\n \"$ref\": \"#/$defs/SessionBootstrap\"\n },\n {\n \"$ref\": \"#/$defs/SessionAnnounce\"\n },\n {\n \"$ref\": \"#/$defs/SessionInitAck\"\n },\n {\n \"$ref\": \"#/$defs/SessionClosed\"\n },\n {\n \"$ref\": \"#/$defs/Heartbeat\"\n },\n {\n \"$ref\": \"#/$defs/CancelAgentMessage\"\n },\n {\n \"$ref\": \"#/$defs/RelayRequestMessage\"\n },\n {\n \"$ref\": \"#/$defs/RelayResponseMessage\"\n }\n ]\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MessageEnvelope\",\n \"title\": \"MessageEnvelope\",\n \"$defs\": {\n \"AgentCompleteContent\": {\n \"additionalProperties\": false,\n \"description\": \"Completion marker for an agent session turn.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_complete\",\n \"default\": \"agent_complete\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"success\": {\n \"title\": \"Success\",\n \"type\": \"boolean\"\n },\n \"duration_ms\": {\n \"anyOf\": [\n {\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Duration Ms\"\n },\n \"cost_usd\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Cost Usd\"\n },\n \"message\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Message\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"success\"\n ],\n \"title\": \"AgentCompleteContent\",\n \"type\": \"object\"\n },\n \"AgentProgressContent\": {\n \"additionalProperties\": false,\n \"description\": \"Incremental progress emitted by an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_progress\",\n \"default\": \"agent_progress\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Detail\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"title\": \"AgentProgressContent\",\n \"type\": \"object\"\n },\n \"MessagePayload\": {\n \"additionalProperties\": false,\n \"description\": \"Application-level message data stored in the database and relayed to clients.\",\n \"properties\": {\n \"version\": {\n \"default\": 0,\n \"title\": \"Version\",\n \"type\": \"integer\"\n },\n \"content\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolCallContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentProgressContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentCompleteContent\"\n }\n ],\n \"title\": \"Content\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"title\": \"MessagePayload\",\n \"type\": \"object\"\n },\n \"SenderRef\": {\n \"additionalProperties\": false,\n \"description\": \"Reference to the author of a message.\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"user\",\n \"agent_session\"\n ],\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"id\": {\n \"format\": \"uuid\",\n \"title\": \"Id\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"id\"\n ],\n \"title\": \"SenderRef\",\n \"type\": \"object\"\n },\n \"TextContent\": {\n \"additionalProperties\": false,\n \"description\": \"Plain text content shared with the agent.\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"default\": \"text\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"text\": {\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"annotations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Annotations\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"title\": \"TextContent\",\n \"type\": \"object\"\n },\n \"ToolCallContent\": {\n \"additionalProperties\": false,\n \"description\": \"Tool invocation authored by the assistant.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_call\",\n \"default\": \"tool_call\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"name\": {\n \"title\": \"Name\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"arguments\": {\n \"additionalProperties\": true,\n \"title\": \"Arguments\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"name\",\n \"tool_use_id\",\n \"arguments\"\n ],\n \"title\": \"ToolCallContent\",\n \"type\": \"object\"\n },\n \"ToolResultContent\": {\n \"additionalProperties\": false,\n \"description\": \"Result produced by a previously invoked tool.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_result\",\n \"default\": \"tool_result\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"output\": {\n \"title\": \"Output\"\n },\n \"is_error\": {\n \"default\": false,\n \"title\": \"Is Error\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"tool_use_id\",\n \"output\"\n ],\n \"title\": \"ToolResultContent\",\n \"type\": \"object\"\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Complete message frame exchanged over transports.\",\n \"properties\": {\n \"message_id\": {\n \"format\": \"uuid\",\n \"title\": \"Message Id\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"sender\": {\n \"$ref\": \"#/$defs/SenderRef\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/MessagePayload\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message_id\",\n \"session_id\",\n \"sender\",\n \"payload\",\n \"created_at\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MachineMessage\",\n \"title\": \"MachineMessage\",\n \"$defs\": {\n \"MachineHeartbeatMessage\": {\n \"additionalProperties\": false,\n \"description\": \"Heartbeat emitted by the daemon with machine status metadata.\",\n \"properties\": {\n \"type\": {\n \"const\": \"heartbeat\",\n \"default\": \"heartbeat\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"status\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/MachineStatus\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null\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 \"directories\": {\n \"anyOf\": [\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Directories\"\n }\n },\n \"title\": \"MachineHeartbeatMessage\",\n \"type\": \"object\"\n },\n \"MachineRpcRequest\": {\n \"additionalProperties\": false,\n \"description\": \"RPC request instructing the daemon to perform an action.\",\n \"properties\": {\n \"type\": {\n \"const\": \"rpc_request\",\n \"default\": \"rpc_request\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"request_id\": {\n \"format\": \"uuid\",\n \"title\": \"Request Id\",\n \"type\": \"string\"\n },\n \"method\": {\n \"const\": \"start_session\",\n \"title\": \"Method\",\n \"type\": \"string\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/MachineStartSessionPayload\"\n }\n },\n \"required\": [\n \"request_id\",\n \"method\",\n \"payload\"\n ],\n \"title\": \"MachineRpcRequest\",\n \"type\": \"object\"\n },\n \"MachineRpcResponse\": {\n \"additionalProperties\": false,\n \"description\": \"Response frame acknowledging a machine RPC request.\",\n \"properties\": {\n \"type\": {\n \"const\": \"rpc_response\",\n \"default\": \"rpc_response\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"request_id\": {\n \"format\": \"uuid\",\n \"title\": \"Request Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"error\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Error\"\n },\n \"payload\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Payload\"\n }\n },\n \"required\": [\n \"request_id\",\n \"status\"\n ],\n \"title\": \"MachineRpcResponse\",\n \"type\": \"object\"\n },\n \"MachineStartSessionPayload\": {\n \"additionalProperties\": false,\n \"description\": \"Payload describing a new remote coding session request.\",\n \"properties\": {\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 \"launch_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Launch Id\"\n },\n \"directory\": {\n \"title\": \"Directory\",\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 \"initial_prompt\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Initial Prompt\"\n },\n \"workspace_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Workspace Id\"\n },\n \"workspace_config\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/WorkspaceConfig\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null\n }\n },\n \"required\": [\n \"directory\"\n ],\n \"title\": \"MachineStartSessionPayload\",\n \"type\": \"object\"\n },\n \"MachineStatus\": {\n \"enum\": [\n \"ONLINE\",\n \"OFFLINE\",\n \"UPDATING\"\n ],\n \"title\": \"MachineStatus\",\n \"type\": \"string\"\n },\n \"WorkspaceConfig\": {\n \"additionalProperties\": false,\n \"description\": \"Workspace-level configuration persisted alongside metadata.\",\n \"properties\": {\n \"worktrees\": {\n \"$ref\": \"#/$defs/WorktreeSettings\"\n }\n },\n \"title\": \"WorkspaceConfig\",\n \"type\": \"object\"\n },\n \"WorktreeSettings\": {\n \"additionalProperties\": false,\n \"description\": \"Settings controlling git worktree usage for a workspace.\",\n \"properties\": {\n \"enabled\": {\n \"default\": false,\n \"title\": \"Enabled\",\n \"type\": \"boolean\"\n },\n \"base_ref\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Base Ref\"\n }\n },\n \"title\": \"WorktreeSettings\",\n \"type\": \"object\"\n }\n },\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/MachineRpcRequest\"\n },\n {\n \"$ref\": \"#/$defs/MachineHeartbeatMessage\"\n },\n {\n \"$ref\": \"#/$defs/MachineRpcResponse\"\n }\n ]\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 or reusing a user session container.\",\n \"properties\": {\n \"workspace_id\": {\n \"description\": \"Workspace identifier linked to this session\",\n \"title\": \"Workspace Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Optional explicit user session id to reuse or create\",\n \"title\": \"User Session Id\"\n },\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 \"required\": [\n \"workspace_id\"\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 \"WorkspaceConfig\": {\n \"additionalProperties\": false,\n \"description\": \"Workspace-level configuration persisted alongside metadata.\",\n \"properties\": {\n \"worktrees\": {\n \"$ref\": \"#/$defs/WorktreeSettings\"\n }\n },\n \"title\": \"WorkspaceConfig\",\n \"type\": \"object\"\n },\n \"WorkspaceDescriptor\": {\n \"description\": \"Serialized workspace row returned to API clients.\",\n \"properties\": {\n \"id\": {\n \"title\": \"Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"workspace_type\": {\n \"$ref\": \"#/$defs/WorkspaceType\"\n },\n \"user_machine_id\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Machine Id\"\n },\n \"local_path\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Local Path\"\n },\n \"git_host\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Git Host\"\n },\n \"git_path\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Git Path\"\n },\n \"workspace_metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Workspace Metadata\"\n },\n \"workspace_config\": {\n \"$ref\": \"#/$defs/WorkspaceConfig\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n },\n \"updated_at\": {\n \"format\": \"date-time\",\n \"title\": \"Updated At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"user_id\",\n \"workspace_type\",\n \"created_at\",\n \"updated_at\"\n ],\n \"title\": \"WorkspaceDescriptor\",\n \"type\": \"object\"\n },\n \"WorkspaceType\": {\n \"enum\": [\n \"LOCAL\",\n \"REMOTE\"\n ],\n \"title\": \"WorkspaceType\",\n \"type\": \"string\"\n },\n \"WorktreeSettings\": {\n \"additionalProperties\": false,\n \"description\": \"Settings controlling git worktree usage for a workspace.\",\n \"properties\": {\n \"enabled\": {\n \"default\": false,\n \"title\": \"Enabled\",\n \"type\": \"boolean\"\n },\n \"base_ref\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Base Ref\"\n }\n },\n \"title\": \"WorktreeSettings\",\n \"type\": \"object\"\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 \"workspace\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/WorkspaceDescriptor\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null\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 \"workspace\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/WorkspaceDescriptor\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null\n }\n },\n \"required\": [\n \"session\"\n ],\n \"title\": \"UserSessionSummary\",\n \"type\": \"object\"\n },\n \"WorkspaceConfig\": {\n \"additionalProperties\": false,\n \"description\": \"Workspace-level configuration persisted alongside metadata.\",\n \"properties\": {\n \"worktrees\": {\n \"$ref\": \"#/$defs/WorktreeSettings\"\n }\n },\n \"title\": \"WorkspaceConfig\",\n \"type\": \"object\"\n },\n \"WorkspaceDescriptor\": {\n \"description\": \"Serialized workspace row returned to API clients.\",\n \"properties\": {\n \"id\": {\n \"title\": \"Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"workspace_type\": {\n \"$ref\": \"#/$defs/WorkspaceType\"\n },\n \"user_machine_id\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Machine Id\"\n },\n \"local_path\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Local Path\"\n },\n \"git_host\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Git Host\"\n },\n \"git_path\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Git Path\"\n },\n \"workspace_metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Workspace Metadata\"\n },\n \"workspace_config\": {\n \"$ref\": \"#/$defs/WorkspaceConfig\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n },\n \"updated_at\": {\n \"format\": \"date-time\",\n \"title\": \"Updated At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"user_id\",\n \"workspace_type\",\n \"created_at\",\n \"updated_at\"\n ],\n \"title\": \"WorkspaceDescriptor\",\n \"type\": \"object\"\n },\n \"WorkspaceType\": {\n \"enum\": [\n \"LOCAL\",\n \"REMOTE\"\n ],\n \"title\": \"WorkspaceType\",\n \"type\": \"string\"\n },\n \"WorktreeSettings\": {\n \"additionalProperties\": false,\n \"description\": \"Settings controlling git worktree usage for a workspace.\",\n \"properties\": {\n \"enabled\": {\n \"default\": false,\n \"title\": \"Enabled\",\n \"type\": \"boolean\"\n },\n \"base_ref\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Base Ref\"\n }\n },\n \"title\": \"WorktreeSettings\",\n \"type\": \"object\"\n }\n },\n \"description\": \"Response containing a list of user sessions.\",\n \"properties\": {\n \"sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/UserSessionSummary\"\n },\n \"title\": \"Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"sessions\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MessagePageResponse\",\n \"title\": \"MessagePageResponse\",\n \"$defs\": {\n \"AgentCompleteContent\": {\n \"additionalProperties\": false,\n \"description\": \"Completion marker for an agent session turn.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_complete\",\n \"default\": \"agent_complete\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"success\": {\n \"title\": \"Success\",\n \"type\": \"boolean\"\n },\n \"duration_ms\": {\n \"anyOf\": [\n {\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Duration Ms\"\n },\n \"cost_usd\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Cost Usd\"\n },\n \"message\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Message\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"success\"\n ],\n \"title\": \"AgentCompleteContent\",\n \"type\": \"object\"\n },\n \"AgentProgressContent\": {\n \"additionalProperties\": false,\n \"description\": \"Incremental progress emitted by an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_progress\",\n \"default\": \"agent_progress\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Detail\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"title\": \"AgentProgressContent\",\n \"type\": \"object\"\n },\n \"MessageEnvelope\": {\n \"additionalProperties\": false,\n \"description\": \"Complete message frame exchanged over transports.\",\n \"properties\": {\n \"message_id\": {\n \"format\": \"uuid\",\n \"title\": \"Message Id\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"sender\": {\n \"$ref\": \"#/$defs/SenderRef\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/MessagePayload\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message_id\",\n \"session_id\",\n \"sender\",\n \"payload\",\n \"created_at\"\n ],\n \"title\": \"MessageEnvelope\",\n \"type\": \"object\"\n },\n \"MessagePayload\": {\n \"additionalProperties\": false,\n \"description\": \"Application-level message data stored in the database and relayed to clients.\",\n \"properties\": {\n \"version\": {\n \"default\": 0,\n \"title\": \"Version\",\n \"type\": \"integer\"\n },\n \"content\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolCallContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentProgressContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentCompleteContent\"\n }\n ],\n \"title\": \"Content\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"title\": \"MessagePayload\",\n \"type\": \"object\"\n },\n \"SenderRef\": {\n \"additionalProperties\": false,\n \"description\": \"Reference to the author of a message.\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"user\",\n \"agent_session\"\n ],\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"id\": {\n \"format\": \"uuid\",\n \"title\": \"Id\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"id\"\n ],\n \"title\": \"SenderRef\",\n \"type\": \"object\"\n },\n \"TextContent\": {\n \"additionalProperties\": false,\n \"description\": \"Plain text content shared with the agent.\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"default\": \"text\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"text\": {\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"annotations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Annotations\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"title\": \"TextContent\",\n \"type\": \"object\"\n },\n \"ToolCallContent\": {\n \"additionalProperties\": false,\n \"description\": \"Tool invocation authored by the assistant.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_call\",\n \"default\": \"tool_call\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"name\": {\n \"title\": \"Name\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"arguments\": {\n \"additionalProperties\": true,\n \"title\": \"Arguments\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"name\",\n \"tool_use_id\",\n \"arguments\"\n ],\n \"title\": \"ToolCallContent\",\n \"type\": \"object\"\n },\n \"ToolResultContent\": {\n \"additionalProperties\": false,\n \"description\": \"Result produced by a previously invoked tool.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_result\",\n \"default\": \"tool_result\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"output\": {\n \"title\": \"Output\"\n },\n \"is_error\": {\n \"default\": false,\n \"title\": \"Is Error\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"tool_use_id\",\n \"output\"\n ],\n \"title\": \"ToolResultContent\",\n \"type\": \"object\"\n }\n },\n \"description\": \"Paginated response for session messages.\",\n \"properties\": {\n \"messages\": {\n \"items\": {\n \"$ref\": \"#/$defs/MessageEnvelope\"\n },\n \"title\": \"Messages\",\n \"type\": \"array\"\n },\n \"has_more\": {\n \"default\": false,\n \"title\": \"Has More\",\n \"type\": \"boolean\"\n },\n \"next_cursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Next Cursor\"\n }\n },\n \"required\": [\n \"messages\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/AgentSessionDetail\",\n \"title\": \"AgentSessionDetail\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n }\n },\n \"description\": \"Detailed agent session with child sessions.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"child_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Child Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"session\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateChatMessageRequest\",\n \"title\": \"CreateChatMessageRequest\",\n \"description\": \"Simple text payload for dashboard/mobile chat fallbacks.\",\n \"properties\": {\n \"text\": {\n \"minLength\": 1,\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/SubscriptionResponse\",\n \"title\": \"SubscriptionResponse\",\n \"description\": \"Current subscription details for a user.\",\n \"properties\": {\n \"id\": {\n \"title\": \"Id\",\n \"type\": \"string\"\n },\n \"plan_type\": {\n \"title\": \"Plan Type\",\n \"type\": \"string\"\n },\n \"agent_limit\": {\n \"title\": \"Agent Limit\",\n \"type\": \"integer\"\n },\n \"current_period_end\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Current Period End\"\n },\n \"cancel_at_period_end\": {\n \"default\": false,\n \"title\": \"Cancel At Period End\",\n \"type\": \"boolean\"\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Provider\"\n },\n \"plan_display_name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Human-friendly plan label (e.g. Pro, Starter).\",\n \"title\": \"Plan Display Name\"\n },\n \"plan_price_amount\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Recurring charge amount for the plan (in major currency units).\",\n \"title\": \"Plan Price Amount\"\n },\n \"plan_price_currency\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"ISO currency for the recurring charge (e.g. usd).\",\n \"title\": \"Plan Price Currency\"\n },\n \"plan_price_interval\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Billing interval for the recurring charge (e.g. month, year).\",\n \"title\": \"Plan Price Interval\"\n }\n },\n \"required\": [\n \"id\",\n \"plan_type\",\n \"agent_limit\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UsageResponse\",\n \"title\": \"UsageResponse\",\n \"description\": \"Current usage statistics for a subscription period.\",\n \"properties\": {\n \"total_agents\": {\n \"title\": \"Total Agents\",\n \"type\": \"integer\"\n },\n \"agent_limit\": {\n \"title\": \"Agent Limit\",\n \"type\": \"integer\"\n },\n \"period_start\": {\n \"format\": \"date-time\",\n \"title\": \"Period Start\",\n \"type\": \"string\"\n },\n \"period_end\": {\n \"format\": \"date-time\",\n \"title\": \"Period End\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"total_agents\",\n \"agent_limit\",\n \"period_start\",\n \"period_end\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateCheckoutSessionRequest\",\n \"title\": \"CreateCheckoutSessionRequest\",\n \"description\": \"Request to create a Stripe checkout session.\",\n \"properties\": {\n \"plan_type\": {\n \"description\": \"Target plan type (e.g. pro, enterprise).\",\n \"title\": \"Plan Type\",\n \"type\": \"string\"\n },\n \"success_url\": {\n \"description\": \"URL to redirect to after successful checkout.\",\n \"title\": \"Success Url\",\n \"type\": \"string\"\n },\n \"cancel_url\": {\n \"description\": \"URL to redirect to if the user cancels checkout.\",\n \"title\": \"Cancel Url\",\n \"type\": \"string\"\n },\n \"promo_code\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Optional promotional code to pre-apply to the checkout session.\",\n \"title\": \"Promo Code\"\n }\n },\n \"required\": [\n \"plan_type\",\n \"success_url\",\n \"cancel_url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CheckoutSessionResponse\",\n \"title\": \"CheckoutSessionResponse\",\n \"description\": \"Response containing checkout session details.\",\n \"properties\": {\n \"session_id\": {\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"checkout_url\": {\n \"title\": \"Checkout Url\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"session_id\",\n \"checkout_url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/ValidatePromoCodeRequest\",\n \"title\": \"ValidatePromoCodeRequest\",\n \"description\": \"Request to validate a promotional code.\",\n \"properties\": {\n \"code\": {\n \"title\": \"Code\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/PromoCodeValidationResponse\",\n \"title\": \"PromoCodeValidationResponse\",\n \"description\": \"Response containing promotional code validation results.\",\n \"properties\": {\n \"valid\": {\n \"title\": \"Valid\",\n \"type\": \"boolean\"\n },\n \"code\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Code\"\n },\n \"discount_type\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Discount Type\"\n },\n \"discount_value\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Discount Value\"\n },\n \"description\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Description\"\n },\n \"error\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Error\"\n }\n },\n \"required\": [\n \"valid\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CustomerPortalSessionRequest\",\n \"title\": \"CustomerPortalSessionRequest\",\n \"description\": \"Request to create a Stripe Billing customer portal session.\",\n \"properties\": {\n \"return_url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Where Stripe should send the customer after they leave the portal.\",\n \"title\": \"Return Url\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CustomerPortalSessionResponse\",\n \"title\": \"CustomerPortalSessionResponse\",\n \"description\": \"Response containing the Stripe Billing customer portal session URL.\",\n \"properties\": {\n \"url\": {\n \"description\": \"Hosted Stripe customer portal URL.\",\n \"title\": \"Url\",\n \"type\": \"string\"\n },\n \"created\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Timestamp when the session was created.\",\n \"title\": \"Created\"\n },\n \"expires_at\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"When the portal session expires (if provided by Stripe).\",\n \"title\": \"Expires At\"\n }\n },\n \"required\": [\n \"url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserNotificationSettingsRequest\",\n \"title\": \"UserNotificationSettingsRequest\",\n \"description\": \"Request to update user notification preferences.\",\n \"properties\": {\n \"push_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Push Notifications Enabled\"\n },\n \"email_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Email Notifications Enabled\"\n },\n \"sms_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Sms Notifications Enabled\"\n },\n \"phone_number\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Phone Number\"\n },\n \"notification_email\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Notification Email\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserNotificationSettingsResponse\",\n \"title\": \"UserNotificationSettingsResponse\",\n \"description\": \"Response containing current notification settings.\",\n \"properties\": {\n \"push_notifications_enabled\": {\n \"title\": \"Push Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"email_notifications_enabled\": {\n \"title\": \"Email Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"sms_notifications_enabled\": {\n \"title\": \"Sms Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"phone_number\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Phone Number\"\n },\n \"notification_email\": {\n \"title\": \"Notification Email\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"push_notifications_enabled\",\n \"email_notifications_enabled\",\n \"sms_notifications_enabled\",\n \"phone_number\",\n \"notification_email\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/WorkspaceConfig\",\n \"title\": \"WorkspaceConfig\",\n \"$defs\": {\n \"WorktreeSettings\": {\n \"additionalProperties\": false,\n \"description\": \"Settings controlling git worktree usage for a workspace.\",\n \"properties\": {\n \"enabled\": {\n \"default\": false,\n \"title\": \"Enabled\",\n \"type\": \"boolean\"\n },\n \"base_ref\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Base Ref\"\n }\n },\n \"title\": \"WorktreeSettings\",\n \"type\": \"object\"\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Workspace-level configuration persisted alongside metadata.\",\n \"properties\": {\n \"worktrees\": {\n \"$ref\": \"#/$defs/WorktreeSettings\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/WorkspaceSessionLaunchRequest\",\n \"title\": \"WorkspaceSessionLaunchRequest\",\n \"description\": \"Request body used to start a session for a workspace.\",\n \"properties\": {\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Existing user session to reuse\",\n \"title\": \"User 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 \"description\": \"Arbitrary metadata describing the launch\",\n \"title\": \"Metadata\"\n },\n \"initial_prompt\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Prompt delivered to the coding agent at startup\",\n \"title\": \"Initial Prompt\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/WorkspaceSessionLaunchResponse\",\n \"title\": \"WorkspaceSessionLaunchResponse\",\n \"description\": \"Daemon acknowledgement returned after a launch request.\",\n \"properties\": {\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"payload\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Payload\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MachineListResponse\",\n \"title\": \"MachineListResponse\",\n \"$defs\": {\n \"MachineDescriptor\": {\n \"properties\": {\n \"id\": {\n \"title\": \"Id\",\n \"type\": \"string\"\n },\n \"name\": {\n \"title\": \"Name\",\n \"type\": \"string\"\n },\n \"hostname\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Hostname\"\n },\n \"platform\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Platform\"\n },\n \"architecture\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Architecture\"\n },\n \"daemon_version\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Daemon Version\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"last_seen_at\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Last Seen At\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n },\n \"updated_at\": {\n \"format\": \"date-time\",\n \"title\": \"Updated At\",\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 \"id\",\n \"name\",\n \"status\",\n \"created_at\",\n \"updated_at\"\n ],\n \"title\": \"MachineDescriptor\",\n \"type\": \"object\"\n }\n },\n \"properties\": {\n \"machines\": {\n \"items\": {\n \"$ref\": \"#/$defs/MachineDescriptor\"\n },\n \"title\": \"Machines\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"machines\"\n ],\n \"type\": \"object\"\n}", "import { startAgentOrchestrator } from '../orchestrator/agent-orchestrator.js';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport { RelayBridge } from '../relay/relay-bridge.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from '../auth/login-flow.js';\nimport { logger, extractErrorMessage } from '../utils/logger.js';\n\nexport interface OrchestratorOptions {\n backendUrl?: string;\n frontendUrl?: string;\n workspaceId?: string;\n userSessionId?: string;\n agentSessionId?: string;\n}\n\nexport async function runAgentOrchestrator(options: OrchestratorOptions = {}): Promise<void> {\n const orchestrator = await startAgentOrchestrator();\n\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const workspaceId = options.workspaceId ?? process.env.OMNARA_WORKSPACE_ID ?? null;\n if (!workspaceId) {\n throw new Error('A workspace id is required to run the agent orchestrator');\n }\n const store = new CredentialsStore();\n const bridge = new RelayBridge(orchestrator, {\n store,\n logger: console,\n backendUrl,\n frontendUrl,\n workspaceId,\n userSessionId: options.userSessionId,\n agentSessionId: options.agentSessionId,\n });\n\n const stop = async () => {\n await bridge.stop();\n await orchestrator.stop();\n };\n\n const signalHandler = createSignalHandler(stop);\n process.on('SIGINT', signalHandler.handler);\n process.on('SIGTERM', signalHandler.handler);\n\n try {\n await bridge.start();\n } catch (error) {\n logger.error(`Relay orchestrator terminated: ${extractErrorMessage(error)}`);\n process.exitCode = process.exitCode || 1;\n } finally {\n await stop();\n signalHandler.remove();\n }\n}\n\nfunction createSignalHandler(onStop: () => Promise<void>) {\n let stopping = false;\n\n const handler = (signal: NodeJS.Signals) => {\n if (stopping) {\n return;\n }\n stopping = true;\n logger.important(`\\nReceived ${signal}. Shutting down agent orchestrator...`);\n void onStop().catch((error) => {\n logger.error('Error while shutting down agent orchestrator:', error);\n });\n };\n\n const remove = () => {\n process.removeListener('SIGINT', handler);\n process.removeListener('SIGTERM', handler);\n };\n\n return { handler, remove };\n}\n", "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.refreshToken ? 'stored' : 'missing';\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 { Command } from 'commander';\n\nimport {\n ensureDaemonForSession,\n showDaemonStatus,\n startDaemon,\n stopDaemon,\n killAllDaemonProcesses,\n} from '../daemon/daemon-launcher.js';\nimport { runDaemonProcess } from '../daemon/run-daemon.js';\nimport { logger } from '../utils/logger.js';\nimport { ensureCliCredentials } from '../auth/ensure-cli-credentials.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from '../auth/login-flow.js';\nimport { runAgentOrchestrator } from './agent.js';\n\nexport function buildDaemonCommand(): Command {\n const daemon = new Command('daemon').description('Manage the Omnara background daemon.');\n\n daemon\n .command('start')\n .description('Start the daemon if it is not already running.')\n .option('--no-wait', 'Do not wait for the daemon to become ready')\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: { wait: boolean; backendUrl?: string; frontendUrl?: string }) => {\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n await ensureCliCredentials({ backendUrl, frontendUrl, logger });\n await startDaemon({\n logger,\n waitForReady: options.wait,\n reason: 'manual',\n backendUrl,\n frontendUrl,\n });\n });\n\n daemon\n .command('stop')\n .description('Stop the daemon process if it is running.')\n .action(async () => {\n await stopDaemon({ logger });\n });\n\n daemon\n .command('kill-all')\n .description('Force kill all running daemon/session processes.')\n .action(async () => {\n await killAllDaemonProcesses({ logger });\n });\n\n daemon\n .command('status')\n .description('Show current daemon status and tracked directories.')\n .action(async () => {\n await showDaemonStatus({ logger });\n });\n\n daemon\n .command('run-service', { hidden: true })\n .description('Internal command to run the daemon service.')\n .action(async () => {\n await runDaemonProcess();\n });\n\n daemon\n .command('run-session', { hidden: true })\n .description(\n 'Internal command used by the daemon to launch a user session process via the orchestrator.',\n )\n .requiredOption('--user-session-id <id>', 'User session identifier that owns the agent session')\n .requiredOption('--directory <path>', 'Working directory for the new session')\n .requiredOption('--workspace-id <id>', 'Workspace identifier associated with this session')\n .option('--machine-id <id>', 'Machine identifier launching the 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: RunSessionCommandOptions) => {\n try {\n process.chdir(options.directory);\n } catch (error) {\n logger.error(\n `Unable to switch to directory ${options.directory}: ${(error as Error).message}`,\n );\n process.exitCode = 1;\n return;\n }\n\n logger.info(\n `Launching user session ${options.userSessionId} in ${options.directory}${\n options.workspaceId ? ` (workspace ${options.workspaceId})` : ''\n }${options.machineId ? ` on machine ${options.machineId}` : ''}`,\n );\n\n await runAgentOrchestrator({\n backendUrl: options.backendUrl,\n frontendUrl: options.frontendUrl,\n workspaceId: options.workspaceId,\n userSessionId: options.userSessionId,\n });\n });\n\n daemon\n .command('register-current', { hidden: true })\n .description('Internal helper used by the CLI to register the current directory.')\n .action(async () => {\n await ensureDaemonForSession({ cwd: process.cwd(), logger });\n });\n\n return daemon;\n}\n\ninterface RunSessionCommandOptions {\n userSessionId: string;\n directory: string;\n workspaceId: string;\n machineId?: string;\n backendUrl?: string;\n frontendUrl?: string;\n}\n", "import { spawn, exec as execCb } from 'node:child_process';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport type { Logger } from '../utils/logger.js';\nimport { logger as defaultLogger } from '../utils/logger.js';\nimport { DaemonClient } from './daemon-client.js';\nimport { DirectoryRegistry } from './directory-registry.js';\nimport type { DaemonStatusPayload } from './local-control-server.js';\nimport { DaemonConfigStore } from './config-store.js';\nimport { prompt } from '../utils/prompt.js';\nimport chalk from 'chalk';\n\nconst exec = promisify(execCb);\n\nconst DEFAULT_WAIT_MS = 10_000;\n\nexport interface StartDaemonOptions {\n waitForReady?: boolean;\n reason?: string;\n backendUrl?: string;\n frontendUrl?: string;\n logger?: Logger;\n}\n\nexport interface StopDaemonOptions {\n logger?: Logger;\n}\n\nexport interface EnsureDaemonOptions {\n cwd?: string;\n label?: string;\n reason?: string;\n backendUrl?: string;\n frontendUrl?: string;\n logger?: Logger;\n}\n\nexport interface StatusOptions {\n logger?: Logger;\n}\n\nexport interface KillAllOptions {\n logger?: Logger;\n}\n\nexport async function ensureDaemonForSession(options: EnsureDaemonOptions = {}): Promise<void> {\n const logger = options.logger ?? defaultLogger;\n const client = new DaemonClient();\n const configStore = new DaemonConfigStore();\n\n const status = await client.getStatus();\n if (!status) {\n await ensureMachineNameConfigured(configStore, logger);\n await startDaemon({\n waitForReady: true,\n reason: options.reason ?? 'auto-start',\n backendUrl: options.backendUrl,\n frontendUrl: options.frontendUrl,\n logger,\n });\n }\n\n if (options.cwd) {\n await registerDirectory(options.cwd, {\n label: options.label,\n logger,\n client,\n });\n }\n}\n\nasync function ensureMachineNameConfigured(\n configStore: DaemonConfigStore,\n logger: Logger,\n): Promise<string> {\n const envName = process.env.OMNARA_MACHINE_NAME?.trim();\n if (envName) {\n await configStore.update((cfg) => {\n cfg.machine ??= {};\n cfg.machine.name = envName;\n });\n logger.info(`Using machine name \"${envName}\" from OMNARA_MACHINE_NAME`);\n return envName;\n }\n\n const config = await configStore.load();\n if (config.machine?.name) {\n process.env.OMNARA_MACHINE_NAME = config.machine.name;\n return config.machine.name;\n }\n\n const defaultName = os.hostname();\n let machineName = defaultName;\n if (process.stdin.isTTY && process.stdout.isTTY) {\n const answer = (\n await prompt(chalk.blue(`Enter a name for this machine [${defaultName}]: `))\n ).trim();\n if (answer) {\n machineName = answer;\n }\n } else {\n logger.warn(`Machine name not configured; defaulting to \"${defaultName}\"`);\n }\n\n await configStore.update((cfg) => {\n cfg.machine ??= {};\n cfg.machine.name = machineName;\n });\n process.env.OMNARA_MACHINE_NAME = machineName;\n logger.info(`Using machine name \"${machineName}\"`);\n return machineName;\n}\n\nexport async function startDaemon(options: StartDaemonOptions = {}): Promise<boolean> {\n const client = new DaemonClient();\n const logger = options.logger ?? defaultLogger;\n const running = await client.getStatus();\n if (running) {\n logger.info('Omnara daemon is already running.');\n return false;\n }\n\n await spawnDaemonProcess(\n {\n reason: options.reason,\n backendUrl: options.backendUrl,\n frontendUrl: options.frontendUrl,\n },\n logger,\n );\n\n if (options.waitForReady ?? true) {\n const ready = await waitForReady(client, { logger });\n if (!ready) {\n logger.warn('Daemon did not become ready before timeout.');\n }\n }\n\n return true;\n}\n\nexport async function stopDaemon(options: StopDaemonOptions = {}): Promise<boolean> {\n const client = new DaemonClient();\n const logger = options.logger ?? defaultLogger;\n const stopped = await client.stop();\n if (stopped) {\n logger.success('Omnara daemon stop requested.');\n return true;\n }\n logger.warn('No running daemon was found.');\n return false;\n}\n\nexport async function showDaemonStatus(options: StatusOptions = {}): Promise<void> {\n const client = new DaemonClient();\n const logger = options.logger ?? defaultLogger;\n const status = await client.getStatus();\n if (!status) {\n logger.info('Daemon is not running.');\n return;\n }\n\n logger.info('Daemon status:');\n logger.info(` PID: ${status.pid}`);\n logger.info(` Started: ${status.startedAt}`);\n logger.info(` Directories: ${status.directories.length}`);\n}\n\nexport async function killAllDaemonProcesses(options: KillAllOptions = {}): Promise<void> {\n const logger = options.logger ?? defaultLogger;\n try {\n const { stdout } = await exec('ps -axo pid=,command=');\n const targets: number[] = [];\n for (const line of stdout.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n const [pidStr, ...cmdParts] = trimmed.split(/\\s+/);\n const pid = Number(pidStr);\n if (!Number.isFinite(pid) || pid === process.pid) {\n continue;\n }\n const command = cmdParts.join(' ');\n if (\n command.includes('omnara') &&\n (command.includes('daemon run-service') || command.includes('daemon run-session'))\n ) {\n targets.push(pid);\n }\n }\n\n if (targets.length === 0) {\n logger.info('No omnara daemon processes found.');\n return;\n }\n\n for (const pid of targets) {\n try {\n process.kill(pid, 'SIGKILL');\n logger.success(`Killed process ${pid}`);\n } catch (error) {\n logger.warn(`Failed to kill ${pid}: ${extractErrorMessage(error)}`);\n }\n }\n } catch (error) {\n logger.error(`Failed to enumerate processes: ${extractErrorMessage(error)}`);\n }\n}\n\nasync function registerDirectory(\n directoryPath: string,\n options: { label?: string; logger: Logger; client: DaemonClient },\n): Promise<void> {\n const normalized = path.resolve(directoryPath);\n try {\n const result = await options.client.addDirectory(normalized, options.label);\n if (result) {\n options.logger.debug(`Registered ${normalized} with daemon`);\n return;\n }\n options.logger.warn('Daemon was unavailable; storing directory locally.');\n } catch (error) {\n options.logger.warn(\n `Failed to register ${normalized} with daemon: ${extractErrorMessage(error)}`,\n );\n }\n\n const registry = new DirectoryRegistry();\n await registry.ensureDirectory(normalized, { label: options.label, updateLastUsed: true });\n}\n\nasync function spawnDaemonProcess(\n options: { reason?: string; backendUrl?: string; frontendUrl?: string },\n logger: Logger,\n): Promise<void> {\n const entry = process.argv[1];\n if (!entry) {\n throw new Error('Unable to determine CLI entry path for daemon start');\n }\n\n logger.info('Starting Omnara daemon...');\n const child = spawn(process.execPath, [entry, 'daemon', 'run-service'], {\n detached: true,\n stdio: 'ignore',\n env: {\n ...process.env,\n OMNARA_DAEMON_BOOT_REASON: options.reason ?? 'manual',\n ...(options.backendUrl ? { OMNARA_BACKEND_URL: options.backendUrl } : {}),\n ...(options.frontendUrl ? { OMNARA_FRONTEND_URL: options.frontendUrl } : {}),\n },\n });\n child.unref();\n}\n\nasync function waitForReady(\n client: DaemonClient,\n options: { timeoutMs?: number; logger?: Logger } = {},\n): Promise<DaemonStatusPayload | null> {\n const timeout = options.timeoutMs ?? DEFAULT_WAIT_MS;\n const logger = options.logger ?? defaultLogger;\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n const status = await client.getStatus();\n if (status) {\n return status;\n }\n await new Promise((resolve) => setTimeout(resolve, 250));\n }\n\n logger.warn('Timed out waiting for daemon readiness.');\n return null;\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 http from 'node:http';\n\nimport type { DirectoryEntry } from './config-store.js';\nimport type { DaemonStatusPayload, LaunchWorkspaceResult } from './local-control-server.js';\nimport { DaemonStateStore, type DaemonStateData } from './state-store.js';\nimport type { MachineMessageSchema } from '../../../shared-js/dist/schemas/generated.js';\n\ntype ControlEndpoint = DaemonStateData;\n\nexport class DaemonClient {\n constructor(private readonly stateStore: DaemonStateStore = new DaemonStateStore()) {}\n\n async getStatus(): Promise<DaemonStatusPayload | null> {\n const endpoint = await this.getEndpoint();\n if (!endpoint) {\n return null;\n }\n\n try {\n return await this.request<DaemonStatusPayload>(endpoint, {\n method: 'GET',\n path: '/status',\n });\n } catch (error) {\n if (shouldResetState(error)) {\n await this.stateStore.clear();\n return null;\n }\n throw error;\n }\n }\n\n async addDirectory(\n directoryPath: string,\n label?: string,\n ): Promise<{ directory: DirectoryEntry; created: boolean } | null> {\n const endpoint = await this.getEndpoint();\n if (!endpoint) {\n return null;\n }\n\n try {\n return await this.request(endpoint, {\n method: 'POST',\n path: '/directories',\n body: { path: directoryPath, label },\n });\n } catch (error) {\n if (shouldResetState(error)) {\n await this.stateStore.clear();\n return null;\n }\n throw error;\n }\n }\n\n async stop(\n status: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'> = 'OFFLINE',\n ): Promise<boolean> {\n const endpoint = await this.getEndpoint();\n if (!endpoint) {\n return false;\n }\n try {\n await this.request(endpoint, {\n method: 'POST',\n path: '/stop',\n body: {\n status,\n },\n });\n return true;\n } catch (error) {\n if (shouldResetState(error)) {\n await this.stateStore.clear();\n return false;\n }\n throw error;\n }\n }\n\n async launchSession(options: {\n path: string;\n initialPrompt?: string;\n userSessionId?: string;\n }): Promise<LaunchWorkspaceResult | null> {\n const endpoint = await this.getEndpoint();\n if (!endpoint) {\n return null;\n }\n try {\n return await this.request<LaunchWorkspaceResult>(endpoint, {\n method: 'POST',\n path: '/launch',\n body: {\n path: options.path,\n initial_prompt: options.initialPrompt,\n user_session_id: options.userSessionId,\n },\n });\n } catch (error) {\n if (shouldResetState(error)) {\n await this.stateStore.clear();\n return null;\n }\n throw error;\n }\n }\n\n private async getEndpoint(): Promise<ControlEndpoint | null> {\n const state = await this.stateStore.load();\n if (!state) {\n return null;\n }\n\n if (!isProcessAlive(state.pid)) {\n await this.stateStore.clear();\n return null;\n }\n\n return state;\n }\n\n private request<T>(\n endpoint: ControlEndpoint,\n options: { method: 'GET' | 'POST'; path: string; body?: Record<string, unknown> },\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const payload = options.body ? JSON.stringify(options.body) : undefined;\n const req = http.request(\n {\n hostname: '127.0.0.1',\n port: endpoint.port,\n method: options.method,\n path: options.path,\n headers: {\n authorization: `Bearer ${endpoint.token}`,\n ...(payload\n ? {\n 'content-type': 'application/json',\n 'content-length': Buffer.byteLength(payload).toString(),\n }\n : {}),\n },\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on('data', (chunk) => chunks.push(chunk));\n res.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf8');\n if (res.statusCode && res.statusCode >= 400) {\n reject(\n new HttpError(\n `Request failed with status ${res.statusCode}: ${raw}`,\n res.statusCode ?? 500,\n raw,\n ),\n );\n return;\n }\n try {\n resolve(raw ? (JSON.parse(raw) as T) : ({} as T));\n } catch (error) {\n reject(error);\n }\n });\n },\n );\n\n req.on('error', reject);\n\n if (payload) {\n req.write(payload);\n }\n req.end();\n });\n }\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n if (isErrno(error, 'EPERM')) {\n return true;\n }\n if (isErrno(error, 'ESRCH')) {\n return false;\n }\n return false;\n }\n}\n\nfunction isErrno(error: unknown, code: string): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === code,\n );\n}\n\nfunction shouldResetState(error: unknown): boolean {\n if (error instanceof HttpError && error.statusCode === 401) {\n return true;\n }\n return isConnectionError(error);\n}\n\nfunction isConnectionError(error: unknown): boolean {\n const codes = new Set(['ECONNREFUSED', 'ECONNRESET', 'ENOENT']);\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n typeof (error as { code?: unknown }).code === 'string' &&\n codes.has((error as { code: string }).code),\n );\n}\n\nexport class HttpError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly body?: string,\n ) {\n super(message);\n this.name = 'HttpError';\n }\n}\n", "import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { DAEMON_STATE_PATH, DEFAULT_FILE_MODE, ensureOmnaraHome } from './paths.js';\n\nexport interface DaemonStateData {\n pid: number;\n port: number;\n token: string;\n startedAt: string;\n version?: string;\n}\n\nexport class DaemonStateStore {\n constructor(private readonly filePath: string = DAEMON_STATE_PATH) {}\n\n async load(): Promise<DaemonStateData | null> {\n try {\n const raw = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(raw) as DaemonStateData;\n return parsed;\n } catch (error) {\n if (isFileNotFound(error)) {\n return null;\n }\n throw new Error(\n `Failed to read daemon state from ${this.filePath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n\n async save(state: DaemonStateData): Promise<void> {\n await ensureOmnaraHome();\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n const tempPath = `${this.filePath}.tmp`;\n await fs.writeFile(tempPath, JSON.stringify(state, null, 2), {\n mode: DEFAULT_FILE_MODE,\n });\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 error;\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 fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport const OMNARA_HOME_DIR = path.join(os.homedir(), '.omnara');\nexport const DAEMON_CONFIG_PATH = path.join(OMNARA_HOME_DIR, 'daemon.json');\nexport const DAEMON_STATE_PATH = path.join(OMNARA_HOME_DIR, 'daemon-state.json');\nexport const DAEMON_LOG_DIR = path.join(OMNARA_HOME_DIR, 'logs', 'daemon');\nexport const USER_SESSION_LOG_ROOT = path.join(OMNARA_HOME_DIR, 'logs', 'user-sessions');\n\nexport const DEFAULT_DIR_MODE = 0o700;\nexport const DEFAULT_FILE_MODE = 0o600;\n\nexport async function ensureOmnaraHome(): Promise<void> {\n await fs.mkdir(OMNARA_HOME_DIR, { recursive: true, mode: DEFAULT_DIR_MODE });\n}\n\nexport async function ensureDirectory(dirPath: string): Promise<void> {\n await fs.mkdir(dirPath, { recursive: true, mode: DEFAULT_DIR_MODE });\n}\n", "import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { DaemonConfigStore, type DirectoryEntry } from './config-store.js';\n\nexport interface DirectoryEnsureOptions {\n label?: string;\n updateLastUsed?: boolean;\n skipValidation?: boolean;\n}\n\nexport class DirectoryRegistry {\n constructor(private readonly store: DaemonConfigStore = new DaemonConfigStore()) {}\n\n async list(): Promise<DirectoryEntry[]> {\n const config = await this.store.load();\n return config.directories;\n }\n\n async getEntry(directoryPath: string): Promise<DirectoryEntry | null> {\n const normalized = path.resolve(directoryPath);\n const directories = await this.list();\n return directories.find((dir) => path.resolve(dir.path) === normalized) ?? null;\n }\n\n async ensureDirectory(\n directoryPath: string,\n options: DirectoryEnsureOptions = {},\n ): Promise<{ entry: DirectoryEntry; created: boolean }> {\n const resolved = path.resolve(directoryPath);\n if (!options.skipValidation) {\n await this.assertDirectory(resolved);\n }\n\n return this.store.ensureDirectory(resolved, {\n label: options.label,\n touch: options.updateLastUsed ?? true,\n });\n }\n\n private async assertDirectory(directoryPath: string): Promise<void> {\n try {\n const stats = await fs.stat(directoryPath);\n if (!stats.isDirectory()) {\n throw new Error('Path is not a directory');\n }\n } catch (error) {\n throw new Error(\n `Directory ${directoryPath} is not accessible: ${extractErrorMessage(error)}`,\n );\n }\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 fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { randomUUID } from 'node:crypto';\n\nimport { DAEMON_CONFIG_PATH, DEFAULT_FILE_MODE, ensureOmnaraHome } from './paths.js';\n\nexport interface DirectoryEntry {\n id: string;\n path: string;\n label?: string;\n addedAt: string;\n lastUsedAt?: string;\n}\n\nexport interface MachineMetadata {\n id?: string;\n name?: string;\n token?: string;\n lastSeenAt?: string;\n tokenExpiresAt?: string;\n}\n\nexport interface DaemonSettings {\n maxSessions?: number;\n autoUpdateCheckSeconds?: number;\n}\n\nexport interface DaemonConfigData {\n machine?: MachineMetadata;\n directories: DirectoryEntry[];\n settings?: DaemonSettings;\n}\n\nconst DEFAULT_CONFIG: DaemonConfigData = {\n directories: [],\n settings: {},\n};\n\nexport class DaemonConfigStore {\n constructor(private readonly filePath: string = DAEMON_CONFIG_PATH) {}\n\n async load(): Promise<DaemonConfigData> {\n try {\n const raw = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(raw) as Partial<DaemonConfigData>;\n return normalizeConfig(parsed);\n } catch (error) {\n if (isFileNotFound(error)) {\n return cloneConfig(DEFAULT_CONFIG);\n }\n throw new Error(\n `Failed to read daemon config from ${this.filePath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n\n async save(config: DaemonConfigData): Promise<void> {\n const payload = normalizeConfig(config);\n await ensureOmnaraHome();\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n\n const tempPath = `${this.filePath}.tmp`;\n await fs.writeFile(tempPath, JSON.stringify(payload, null, 2), {\n mode: DEFAULT_FILE_MODE,\n });\n await fs.chmod(tempPath, DEFAULT_FILE_MODE);\n await fs.rename(tempPath, this.filePath);\n }\n\n async update(\n mutate: (config: DaemonConfigData) => void | DaemonConfigData,\n ): Promise<DaemonConfigData> {\n const current = await this.load();\n const working = cloneConfig(current);\n const result = mutate(working) ?? working;\n await this.save(result);\n return result;\n }\n\n async ensureDirectory(\n absolutePath: string,\n options: { label?: string; touch?: boolean } = {},\n ): Promise<{ entry: DirectoryEntry; created: boolean }> {\n const resolvedPath = normalizeFsPath(absolutePath);\n const now = new Date().toISOString();\n\n const config = await this.update((working) => {\n let entry = working.directories.find((dir) => normalizeFsPath(dir.path) === resolvedPath);\n\n if (!entry) {\n entry = {\n id: randomUUID(),\n path: resolvedPath,\n label: options.label,\n addedAt: now,\n lastUsedAt: options.touch ? now : undefined,\n };\n working.directories = [...working.directories, entry];\n return;\n }\n\n if (options.label && options.label !== entry.label) {\n entry.label = options.label;\n }\n\n if (options.touch) {\n entry.lastUsedAt = now;\n }\n });\n\n const entry = config.directories.find((dir) => normalizeFsPath(dir.path) === resolvedPath);\n\n if (!entry) {\n throw new Error('Failed to persist directory registration');\n }\n\n const created = entry.addedAt === now;\n return { entry, created };\n }\n}\n\nfunction normalizeConfig(config: Partial<DaemonConfigData> | undefined): DaemonConfigData {\n const directories = Array.isArray(config?.directories)\n ? config!.directories\n .filter((item): item is DirectoryEntry =>\n Boolean(\n item && typeof item === 'object' && 'path' in item && typeof item.path === 'string',\n ),\n )\n .map((dir) => ({\n id: dir.id ?? randomUUID(),\n path: normalizeFsPath(dir.path),\n label: dir.label,\n addedAt: dir.addedAt ?? new Date().toISOString(),\n lastUsedAt: dir.lastUsedAt,\n }))\n : [];\n\n return {\n machine: config?.machine ?? DEFAULT_CONFIG.machine,\n directories,\n settings: config?.settings ?? {},\n };\n}\n\nfunction cloneConfig(config: DaemonConfigData): DaemonConfigData {\n return JSON.parse(JSON.stringify(config)) as DaemonConfigData;\n}\n\nfunction normalizeFsPath(value: string): string {\n return path.resolve(value);\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 http from 'node:http';\nimport { randomBytes } from 'node:crypto';\nimport { URL } from 'node:url';\n\nimport type { Logger } from '../utils/logger.js';\nimport type { DirectoryEntry } from './config-store.js';\nimport { DirectoryRegistry } from './directory-registry.js';\nimport type { MachineMessageSchema } from '../../../shared-js/dist/schemas/generated.js';\n\nconst MIN_PORT = 10_000;\nconst MAX_PORT = 65_535;\nconst MAX_ATTEMPTS = 100;\n\nexport interface DaemonStatusPayload {\n pid: number;\n startedAt: string;\n directories: DirectoryEntry[];\n}\n\nexport interface LocalControlServerOptions {\n directoryRegistry: DirectoryRegistry;\n getStatus: () => Promise<DaemonStatusPayload>;\n onStopRequested: (\n status: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'>,\n ) => Promise<void> | void;\n onLaunchRequested?: (payload: LaunchWorkspacePayload) => Promise<LaunchWorkspaceResult>;\n logger?: Logger;\n}\n\nexport interface LocalControlServerHandle {\n port: number;\n token: string;\n close(): Promise<void>;\n}\n\nexport interface LaunchWorkspacePayload {\n path: string;\n initialPrompt?: string;\n userSessionId?: string;\n}\n\nexport interface LaunchWorkspaceSuccessPayload {\n user_session_id: string;\n workspace_id: string;\n launch_id: string;\n}\n\nexport interface LaunchWorkspaceResult {\n status: 'ok' | 'error' | string;\n payload?: LaunchWorkspaceSuccessPayload | null;\n error?: string;\n}\n\nexport async function startLocalControlServer(\n options: LocalControlServerOptions,\n): Promise<LocalControlServerHandle> {\n const token = randomBytes(24).toString('hex');\n const handler = createRequestHandler({\n token,\n directoryRegistry: options.directoryRegistry,\n getStatus: options.getStatus,\n onStopRequested: options.onStopRequested,\n onLaunchRequested: options.onLaunchRequested,\n logger: options.logger,\n });\n\n const { server, port } = await listenWithRetries(handler);\n options.logger?.info(`Daemon control server listening on 127.0.0.1:${port}`);\n\n return {\n port,\n token,\n async close() {\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n },\n };\n}\n\ninterface RequestHandlerContext {\n token: string;\n directoryRegistry: DirectoryRegistry;\n getStatus: () => Promise<DaemonStatusPayload>;\n onStopRequested: (\n status: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'>,\n ) => Promise<void> | void;\n onLaunchRequested?: (payload: LaunchWorkspacePayload) => Promise<LaunchWorkspaceResult>;\n logger?: Logger;\n}\n\nfunction createRequestHandler(context: RequestHandlerContext) {\n return async (req: http.IncomingMessage, res: http.ServerResponse): Promise<void> => {\n try {\n const url = new URL(req.url ?? '/', 'http://localhost');\n if (req.method === 'GET' && url.pathname === '/healthz') {\n sendJson(res, 200, { status: 'ok' });\n return;\n }\n\n if (!authorize(req, context.token)) {\n sendJson(res, 401, { error: 'unauthorized' });\n return;\n }\n\n if (req.method === 'GET' && url.pathname === '/status') {\n const payload = await context.getStatus();\n sendJson(res, 200, payload);\n return;\n }\n\n if (req.method === 'GET' && url.pathname === '/directories') {\n const directories = await context.directoryRegistry.list();\n sendJson(res, 200, { directories });\n return;\n }\n\n if (req.method === 'POST' && url.pathname === '/directories') {\n const body = await readJsonBody<{ path?: string; label?: string }>(req);\n if (!body?.path) {\n sendJson(res, 400, { error: '`path` is required' });\n return;\n }\n\n try {\n const result = await context.directoryRegistry.ensureDirectory(body.path, {\n label: body.label,\n updateLastUsed: true,\n });\n\n sendJson(res, 200, { directory: result.entry, created: result.created });\n } catch (error) {\n sendJson(res, 400, { error: extractErrorMessage(error) });\n }\n return;\n }\n\n if (req.method === 'POST' && url.pathname === '/launch') {\n if (!context.onLaunchRequested) {\n sendJson(res, 503, { error: 'launch_not_supported' });\n return;\n }\n const body = await readJsonBody<{\n path?: string;\n initial_prompt?: string;\n user_session_id?: string;\n }>(req);\n if (!body?.path) {\n sendJson(res, 400, { error: '`path` is required' });\n return;\n }\n try {\n const result = await context.onLaunchRequested({\n path: body.path,\n initialPrompt: body.initial_prompt ?? undefined,\n userSessionId: body.user_session_id ?? undefined,\n });\n sendJson(res, 200, result);\n } catch (error) {\n sendJson(res, 400, { error: extractErrorMessage(error) });\n }\n return;\n }\n\n if (req.method === 'POST' && url.pathname === '/stop') {\n const body = await readJsonBody<{\n status?: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'>;\n }>(req);\n sendJson(res, 202, { status: 'stopping' });\n Promise.resolve()\n .then(() => context.onStopRequested(body?.status ?? 'OFFLINE'))\n .catch((error) => context.logger?.error('Failed to stop daemon:', error));\n return;\n }\n\n sendJson(res, 404, { error: 'not_found' });\n } catch (error) {\n context.logger?.error('Control server error:', error);\n if (!res.headersSent) {\n sendJson(res, 500, { error: 'internal_error' });\n } else {\n res.end();\n }\n }\n };\n}\n\nasync function listenWithRetries(\n handler: (req: http.IncomingMessage, res: http.ServerResponse) => void,\n): Promise<{ server: http.Server; port: number }> {\n let attempt = 0;\n let port = pickInitialPort();\n\n while (attempt < MAX_ATTEMPTS) {\n const server = http.createServer((req, res) => {\n void handler(req, res);\n });\n\n try {\n await listen(server, port);\n return { server, port };\n } catch (error) {\n server.close();\n if (isPortInUse(error)) {\n attempt += 1;\n port = nextPort(port);\n continue;\n }\n throw error;\n }\n }\n\n throw new Error('Failed to bind control server port after multiple attempts');\n}\n\nfunction listen(server: http.Server, port: number): Promise<void> {\n return new Promise((resolve, reject) => {\n server.once('error', reject);\n server.listen(port, '127.0.0.1', () => {\n server.off('error', reject);\n resolve();\n });\n });\n}\n\nfunction pickInitialPort(): number {\n const span = MAX_PORT - MIN_PORT;\n return MIN_PORT + Math.floor(Math.random() * span);\n}\n\nfunction nextPort(current: number): number {\n const next = current + 1;\n if (next > MAX_PORT) {\n return MIN_PORT;\n }\n return next;\n}\n\nfunction authorize(req: http.IncomingMessage, token: string): boolean {\n const header = req.headers.authorization;\n if (!header) {\n return false;\n }\n\n const [scheme, value] = header.split(' ');\n return scheme.toLowerCase() === 'bearer' && value === token;\n}\n\nasync function readJsonBody<T>(req: http.IncomingMessage): Promise<T | null> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);\n }\n if (!chunks.length) {\n return null;\n }\n try {\n return JSON.parse(Buffer.concat(chunks).toString('utf8')) as T;\n } catch {\n return null;\n }\n}\n\nfunction sendJson(res: http.ServerResponse, statusCode: number, payload: unknown): void {\n const body = JSON.stringify(payload);\n res.writeHead(statusCode, {\n 'content-type': 'application/json',\n 'content-length': Buffer.byteLength(body),\n });\n res.end(body);\n}\n\nfunction isPortInUse(error: unknown): boolean {\n return (\n Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === 'EADDRINUSE',\n ) || false\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 'node:crypto';\nimport os from 'node:os';\nimport { setTimeout as delay } from 'node:timers/promises';\nimport WebSocket from 'ws';\n\nimport type { Logger } from '../utils/logger.js';\nimport { logger as defaultLogger } from '../utils/logger.js';\nimport { DirectoryRegistry } from './directory-registry.js';\nimport { DaemonConfigStore } from './config-store.js';\nimport type { DirectoryEntry } from './config-store.js';\nimport { ApiClient, ApiError } from '../http/api-client.js';\nimport { registerMachine } from '../http/machines.js';\nimport { ensureWorkspace } from '../http/workspaces.js';\nimport { ensureUserSession } from '../http/user-sessions.js';\nimport type { UserSessionDescriptor } from '../http/user-sessions.js';\nimport { validateMachineMessage, type MachineMessage } from '../schemas/index.js';\nimport type {\n MachineRpcRequest,\n MachineRpcResponse,\n MachineHeartbeatMessage,\n MachineStartSessionPayload,\n WorkspaceDescriptor,\n} from '@omnara/shared-js/schemas';\nimport { SessionManager } from './session-runner.js';\nimport type { AuthProvider } from '../auth/auth-provider.js';\nimport { AuthContextError } from '../auth/credential-manager.js';\nimport type { MachineRegisterRequest } from '@omnara/shared-js/schemas';\nimport type { LaunchWorkspaceResult } from './local-control-server.js';\nimport { PACKAGE_VERSION } from '../package-info.js';\nimport type { MachineMessageSchema } from '../../../shared-js/dist/schemas/generated.js';\n\nconst HEARTBEAT_INTERVAL_MS = 10_000;\nconst RECONNECT_DELAY_MS = 2_000;\nconst LOGIN_WAIT_DELAY_MS = 30_000;\nconst DAEMON_VERSION = PACKAGE_VERSION ?? '0.0.0';\n\nexport interface MachineSupervisorOptions {\n backendUrl: string;\n frontendUrl?: string;\n directoryRegistry: DirectoryRegistry;\n configStore: DaemonConfigStore;\n authProvider: AuthProvider;\n logger?: Logger;\n}\n\ninterface MachineIdentity {\n id: string;\n token: string;\n wsPath: string;\n}\n\ninterface LaunchSessionOptions {\n launchId?: string;\n directory: string;\n workspaceId?: string | null;\n workspaceConfig?: WorkspaceDescriptor['config'];\n userSessionId?: string | null;\n initialPrompt?: string | null;\n metadata?: Record<string, unknown> | null;\n source: 'local' | 'rpc';\n}\n\ninterface LaunchSessionResult {\n launchId: string;\n userSessionId: string;\n workspaceId: string;\n workspaceConfig: WorkspaceDescriptor['config'];\n}\n\nexport class MachineSupervisor {\n private readonly backendUrl: string;\n private readonly frontendUrl?: string;\n private readonly directoryRegistry: DirectoryRegistry;\n private readonly configStore: DaemonConfigStore;\n private readonly authProvider: AuthProvider;\n private readonly apiClient: ApiClient;\n private readonly logger: Logger;\n private readonly sessionManager: SessionManager;\n\n private running = false;\n private stopRequested = false;\n private loopPromise: Promise<void> | null = null;\n private websocket: WebSocket | null = null;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n private waitingForLogin = false;\n private machineRegistrationReady = false;\n\n constructor(options: MachineSupervisorOptions) {\n this.backendUrl = options.backendUrl;\n this.frontendUrl = options.frontendUrl;\n this.directoryRegistry = options.directoryRegistry;\n this.configStore = options.configStore;\n this.authProvider = options.authProvider;\n this.logger = options.logger ?? defaultLogger;\n this.apiClient = new ApiClient({ baseUrl: this.backendUrl });\n this.sessionManager = new SessionManager({\n backendUrl: this.backendUrl,\n frontendUrl: this.frontendUrl,\n directoryRegistry: this.directoryRegistry,\n logger: this.logger,\n });\n }\n\n async start(): Promise<void> {\n if (this.running) {\n return;\n }\n this.running = true;\n this.stopRequested = false;\n this.loopPromise = this.runLoop();\n }\n\n async launchWorkspaceSessionLocal(options: {\n path: string;\n initialPrompt?: string;\n userSessionId?: string;\n }): Promise<LaunchWorkspaceResult> {\n const result = await this.launchWorkspaceSession({\n launchId: undefined,\n directory: options.path,\n userSessionId: options.userSessionId ?? null,\n initialPrompt: options.initialPrompt ?? null,\n source: 'local',\n });\n\n return {\n status: 'ok',\n payload: {\n user_session_id: result.userSessionId,\n workspace_id: result.workspaceId,\n launch_id: result.launchId,\n },\n };\n }\n\n async stop(status: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'>): Promise<void> {\n this.stopRequested = true;\n const directories = await this.directoryRegistry.list();\n const payload: MachineHeartbeatMessage = {\n type: 'heartbeat',\n status: status,\n metadata: {\n hostname: os.hostname(),\n platform: os.platform(),\n architecture: os.arch(),\n daemon_version: DAEMON_VERSION,\n },\n directories: directories.map((entry) => entry.path),\n };\n await this.sendMessage(payload);\n await this.sessionManager.stopAll();\n await this.closeWebsocket();\n if (this.loopPromise) {\n await this.loopPromise;\n this.loopPromise = null;\n }\n this.running = false;\n }\n\n private async runLoop(): Promise<void> {\n while (!this.stopRequested) {\n try {\n const identity = await this.registerMachine();\n this.clearLoginWait();\n await this.runWebsocket(identity);\n } catch (error) {\n if (this.stopRequested) {\n break;\n }\n if (isLoginRequiredError(error) || isUnauthorizedApiError(error)) {\n if (!this.waitingForLogin) {\n this.waitingForLogin = true;\n const detail =\n error instanceof ApiError\n ? ` (backend responded with HTTP ${error.status})`\n : '';\n this.logger.warn(\n `Machine supervisor requires login${detail}. Run \\`omnara auth login\\` in a terminal. Retrying in 30s\u2026`,\n );\n } else {\n this.logger.debug('Machine supervisor still waiting for login\u2026');\n }\n await delay(LOGIN_WAIT_DELAY_MS);\n } else {\n this.logger.warn(`Machine supervisor error: ${(error as Error).message}`);\n await delay(RECONNECT_DELAY_MS);\n }\n }\n }\n }\n\n private async registerMachine(): Promise<MachineIdentity> {\n this.machineRegistrationReady = false;\n const directories = await this.directoryRegistry.list();\n const config = await this.configStore.load();\n const machineName = config.machine?.name ?? deriveMachineName();\n\n const directoryLabels = directories\n .filter((entry) => entry.label)\n .reduce<Record<string, string>>((acc, entry) => {\n if (entry.label) {\n acc[entry.path] = entry.label;\n }\n return acc;\n }, {});\n\n const payload: MachineRegisterRequest = {\n machine_id: config.machine?.id,\n machine_name: machineName,\n hostname: os.hostname(),\n platform: os.platform(),\n architecture: os.arch(),\n daemon_version: DAEMON_VERSION,\n directories: directories.map((entry) => entry.path),\n metadata: {\n last_boot_reason: process.env.OMNARA_DAEMON_BOOT_REASON ?? 'manual',\n ...(Object.keys(directoryLabels).length ? { directory_labels: directoryLabels } : {}),\n },\n };\n\n const accessToken = await this.authProvider.getAccessToken({ interactive: false });\n let response;\n try {\n response = await registerMachine(this.apiClient, accessToken, payload);\n } catch (error) {\n if (error instanceof ApiError && error.status === 404 && config.machine?.id) {\n this.logger.warn(\n `Stored machine id ${config.machine.id} was not found. Re-registering.`,\n );\n await this.configStore.update((current) => {\n current.machine = {\n name: machineName,\n };\n });\n return await this.registerMachine();\n }\n throw error;\n }\n\n const now = new Date();\n await this.configStore.update((current) => {\n current.machine = {\n id: response.machine.id,\n name: machineName,\n token: response.machine_token,\n tokenExpiresAt: new Date(\n now.getTime() + response.machine_token_expires_in * 1000,\n ).toISOString(),\n lastSeenAt: now.toISOString(),\n };\n });\n\n this.logger.info(\n `Registered machine ${response.machine.name} (${response.machine.id}) with backend`,\n );\n this.machineRegistrationReady = true;\n\n return {\n id: response.machine.id,\n token: response.machine_token,\n wsPath: response.machine_ws_path,\n };\n }\n\n private async runWebsocket(identity: MachineIdentity): Promise<void> {\n const url = buildMachineWebsocketUrl(this.backendUrl, identity.wsPath);\n this.logger.info(`Connecting to machine websocket at ${url}`);\n\n await new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(url, {\n headers: {\n authorization: `Bearer ${identity.token}`,\n },\n });\n this.websocket = ws;\n\n ws.on('open', () => {\n this.logger.success('\u2713 Machine daemon connected to backend');\n void this.sendHeartbeat().catch((error) => {\n this.logger.error('Failed to send heartbeat:', error);\n });\n this.startHeartbeatTimer();\n });\n\n ws.on('message', (data) => {\n try {\n this.handleSocketMessage(data);\n } catch (error) {\n this.logger.error('Failed to process machine message:', error);\n }\n });\n\n ws.on('close', (code, reason) => {\n this.logger.warn(\n `Machine websocket closed (${code}${reason ? `: ${reason.toString()}` : ''})`,\n );\n this.clearHeartbeatTimer();\n this.websocket = null;\n if (this.stopRequested) {\n resolve();\n } else {\n reject(new Error('machine websocket closed'));\n }\n });\n\n ws.on('error', (error) => {\n this.logger.error('Machine websocket error:', error);\n });\n });\n }\n\n private handleSocketMessage(raw: WebSocket.RawData): void {\n const decoded = decodeJson(raw);\n if (!decoded) {\n this.logger.warn('Ignoring malformed machine message');\n return;\n }\n\n const isValid = validateMachineMessage(decoded);\n if (!isValid) {\n this.logger.warn('Dropping invalid machine message payload');\n return;\n }\n\n const message = decoded as MachineMessage;\n if (message.type === 'rpc_request') {\n void this.handleRpcRequest(message);\n }\n }\n\n private async handleRpcRequest(message: MachineRpcRequest): Promise<void> {\n if (message.method !== 'start_session') {\n await this.sendRpcResponse(message.request_id, 'error', `Unknown method ${message.method}`);\n return;\n }\n\n try {\n const result = await this.launchWorkspaceSessionFromRpc(message.payload);\n await this.sendRpcResponse(message.request_id, 'ok', undefined, {\n launch_id: result.launchId,\n user_session_id: result.userSessionId,\n workspace_id: result.workspaceId,\n });\n } catch (error) {\n await this.sendRpcResponse(message.request_id, 'error', (error as Error).message);\n }\n }\n\n private async sendRpcResponse(\n requestId: string,\n status: MachineRpcResponse['status'],\n error?: string,\n body?: MachineRpcResponse['payload'],\n ): Promise<void> {\n const response: MachineRpcResponse = {\n type: 'rpc_response',\n request_id: requestId,\n status,\n };\n if (error) {\n response.error = error;\n }\n if (body) {\n response.payload = body;\n }\n await this.sendMessage(response);\n }\n\n private async launchWorkspaceSessionFromRpc(\n payload: MachineStartSessionPayload,\n ): Promise<LaunchSessionResult> {\n return await this.launchWorkspaceSession({\n launchId: payload.launch_id ?? undefined,\n directory: payload.directory,\n workspaceId: payload.workspace_id ?? null,\n workspaceConfig: payload.workspace_config ?? undefined,\n userSessionId: payload.user_session_id,\n initialPrompt: payload.initial_prompt ?? null,\n metadata: payload.metadata ?? null,\n source: 'rpc',\n });\n }\n\n private async launchWorkspaceSession(\n options: LaunchSessionOptions,\n ): Promise<LaunchSessionResult> {\n await this.waitForMachineRegistration();\n const entry = await this.directoryRegistry.getEntry(options.directory);\n if (!entry) {\n throw new Error(`Directory ${options.directory} is not registered with the daemon`);\n }\n\n const metadata = this.buildWorkspaceMetadata(entry, options.metadata);\n const workspace = await this.ensureWorkspaceForDirectory(entry.path, metadata);\n if (options.workspaceId && options.workspaceId !== workspace.id) {\n this.logger.warn(\n `Workspace id mismatch for ${entry.path}: expected ${options.workspaceId}, got ${workspace.id}`,\n );\n }\n\n const userSession = await this.ensureUserSessionForWorkspace(\n workspace.id,\n options.userSessionId,\n options.source,\n );\n const workspaceConfig = options.workspaceConfig ?? workspace.workspace_config;\n const launchId = options.launchId ?? randomUUID();\n\n await this.sessionManager.startSession({\n launchId,\n directory: entry.path,\n userSessionId: userSession.session_id,\n workspaceId: workspace.id,\n workspaceConfig,\n initialPrompt: options.initialPrompt ?? null,\n metadata,\n });\n return {\n launchId,\n userSessionId: userSession.session_id,\n workspaceId: workspace.id,\n workspaceConfig,\n };\n }\n\n private async ensureWorkspaceForDirectory(\n directory: string,\n metadata: Record<string, unknown> | null,\n ): Promise<WorkspaceDescriptor> {\n return await this.ensureWorkspaceWithRetry(directory, metadata, 0);\n }\n\n private async ensureWorkspaceWithRetry(\n directory: string,\n metadata: Record<string, unknown> | null,\n attempt: number,\n ): Promise<WorkspaceDescriptor> {\n const machineId = await this.getMachineId();\n const accessToken = await this.authProvider.getAccessToken({ interactive: false });\n try {\n return await ensureWorkspace(this.apiClient, accessToken, {\n machine_id: machineId,\n local_path: directory,\n workspace_metadata: metadata ?? undefined,\n });\n } catch (error) {\n if (error instanceof ApiError && error.status === 404 && attempt === 0) {\n await this.recoverMachineRegistration('workspace ensure returned 404');\n return await this.ensureWorkspaceWithRetry(directory, metadata, attempt + 1);\n }\n throw error;\n }\n }\n\n private async ensureUserSessionForWorkspace(\n workspaceId: string,\n userSessionId: string | null | undefined,\n source: 'local' | 'rpc',\n ): Promise<UserSessionDescriptor> {\n const accessToken = await this.authProvider.getAccessToken({ interactive: false });\n return await ensureUserSession(this.apiClient, accessToken, {\n workspaceId,\n userSessionId: userSessionId ?? undefined,\n metadata: { source },\n });\n }\n\n private buildWorkspaceMetadata(\n entry: DirectoryEntry,\n metadata: Record<string, unknown> | null | undefined,\n ): Record<string, unknown> | null {\n const combined: Record<string, unknown> = {};\n if (entry.label) {\n combined.label = entry.label;\n }\n if (metadata) {\n Object.assign(combined, metadata);\n }\n return Object.keys(combined).length > 0 ? combined : null;\n }\n\n private async getMachineId(): Promise<string> {\n const config = await this.configStore.load();\n const machineId = config.machine?.id;\n if (!machineId) {\n throw new Error('Machine has not been registered with the backend yet');\n }\n return machineId;\n }\n\n private async waitForMachineRegistration(): Promise<void> {\n const deadline = Date.now() + 10_000;\n while (Date.now() < deadline) {\n if (this.machineRegistrationReady) {\n const id = await this.configStore.load().then((cfg) => cfg.machine?.id);\n if (id) {\n return;\n }\n }\n await delay(250);\n }\n throw new Error('Machine has not finished registering yet. Try again in a few seconds.');\n }\n\n private startHeartbeatTimer(): void {\n this.clearHeartbeatTimer();\n this.heartbeatTimer = setInterval(() => {\n void this.sendHeartbeat().catch((error) => {\n this.logger.error('Failed to send heartbeat:', error);\n });\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n private clearHeartbeatTimer(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private async sendHeartbeat(): Promise<void> {\n const directories = await this.directoryRegistry.list();\n const payload: MachineHeartbeatMessage = {\n type: 'heartbeat',\n status: 'ONLINE',\n metadata: {\n hostname: os.hostname(),\n platform: os.platform(),\n architecture: os.arch(),\n daemon_version: DAEMON_VERSION,\n },\n directories: directories.map((entry) => entry.path),\n };\n await this.sendMessage(payload);\n }\n\n private async sendMessage(payload: unknown): Promise<void> {\n const ws = this.websocket;\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n throw new Error('Machine websocket is not connected');\n }\n await new Promise<void>((resolve, reject) => {\n ws.send(JSON.stringify(payload), (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n }\n\n private clearLoginWait(): void {\n if (this.waitingForLogin) {\n this.waitingForLogin = false;\n this.logger.info('Machine supervisor detected refreshed credentials. Resuming operations.');\n }\n }\n\n private async closeWebsocket(): Promise<void> {\n this.clearHeartbeatTimer();\n if (!this.websocket) {\n return;\n }\n await new Promise<void>((resolve) => {\n this.websocket?.once('close', () => resolve());\n try {\n this.websocket?.close();\n } catch {\n resolve();\n }\n });\n this.websocket = null;\n }\n\n private async recoverMachineRegistration(reason: string): Promise<void> {\n this.logger.warn(`Machine registration invalid. ${reason} \u2013 refreshing registration.`);\n await this.configStore.update((current) => {\n const name = current.machine?.name;\n current.machine = name ? { name } : undefined;\n });\n this.machineRegistrationReady = false;\n await this.closeWebsocket();\n await this.waitForMachineRegistration();\n }\n}\n\nfunction buildMachineWebsocketUrl(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 url.pathname = path.startsWith('/') ? path : `/${path}`;\n return url.toString();\n}\n\nfunction isLoginRequiredError(error: unknown): error is AuthContextError {\n return (\n error instanceof AuthContextError &&\n (error.code === 'missing_credentials' ||\n error.code === 'refresh_token_unavailable' ||\n error.code === 'refresh_failed')\n );\n}\n\nfunction isUnauthorizedApiError(error: unknown): error is ApiError {\n return error instanceof ApiError && (error.status === 401 || error.status === 403);\n}\n\nfunction deriveMachineName(): string {\n return process.env.OMNARA_MACHINE_NAME || os.hostname();\n}\n\nfunction decodeJson(raw: WebSocket.RawData): unknown {\n const text = typeof raw === 'string' ? raw : raw.toString('utf8');\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return null;\n }\n}\n", "import { ApiClient } from './api-client.js';\nimport type { MachineRegisterRequest, MachineRegisterResponse } from '@omnara/shared-js/schemas';\n\nexport async function registerMachine(\n client: ApiClient,\n accessToken: string,\n payload: MachineRegisterRequest,\n): Promise<MachineRegisterResponse> {\n return await client.postJson<MachineRegisterRequest, MachineRegisterResponse>(\n '/api/v1/machines/register',\n payload,\n { accessToken },\n );\n}\n", "import type {\n WorkspaceConfig,\n WorkspaceDescriptor,\n WorkspaceEnsureRequest,\n WorkspaceSessionLaunchRequest,\n WorkspaceSessionLaunchResponse,\n} from '@omnara/shared-js/schemas';\n\nimport { ApiClient } from './api-client.js';\n\ninterface WorkspaceDescriptorWire {\n id: string;\n user_id: string;\n workspace_type: WorkspaceDescriptor['workspace_type'];\n user_machine_id?: string | null;\n local_path?: string | null;\n git_host?: string | null;\n git_path?: string | null;\n workspace_metadata?: Record<string, unknown> | null;\n workspace_config: WorkspaceConfig;\n created_at: string;\n updated_at: string;\n}\n\nexport async function ensureWorkspace(\n client: ApiClient,\n accessToken: string,\n payload: WorkspaceEnsureRequest,\n): Promise<WorkspaceDescriptor> {\n const response = await client.postJson<WorkspaceEnsureRequest, WorkspaceDescriptorWire>(\n '/api/v1/workspaces/ensure',\n payload,\n { accessToken },\n );\n\n return {\n id: response.id,\n user_id: response.user_id,\n workspace_type: response.workspace_type,\n user_machine_id: response.user_machine_id ?? null,\n local_path: response.local_path ?? null,\n git_host: response.git_host ?? null,\n git_path: response.git_path ?? null,\n workspace_metadata: response.workspace_metadata ?? null,\n workspace_config: response.workspace_config,\n created_at: response.created_at,\n updated_at: response.updated_at,\n };\n}\n\nexport async function launchWorkspaceSession(\n client: ApiClient,\n accessToken: string,\n workspaceId: string,\n payload: WorkspaceSessionLaunchRequest,\n): Promise<WorkspaceSessionLaunchResponse> {\n return await client.postJson<WorkspaceSessionLaunchRequest, WorkspaceSessionLaunchResponse>(\n `/api/v1/workspaces/${workspaceId}/sessions`,\n payload,\n { accessToken },\n );\n}\n", "import { spawn } from 'node:child_process';\n\nimport type { Logger } from '../utils/logger.js';\nimport type { DirectoryEntry } from './config-store.js';\nimport type { WorkspaceConfig } from '@omnara/shared-js/schemas';\nimport { DirectoryRegistry } from './directory-registry.js';\nimport { createSessionLog, type SessionLogHandle, writeSessionLog } from './session-log-manager.js';\nimport { withSessionRegistry, isProcessAlive } from './session-pid-registry.js';\n\nexport interface SessionManagerOptions {\n backendUrl: string;\n frontendUrl?: string;\n directoryRegistry: DirectoryRegistry;\n logger: Logger;\n}\n\nexport interface SessionLaunchSpec {\n launchId: string;\n directory: string;\n userSessionId: string;\n workspaceId: string;\n workspaceConfig?: WorkspaceConfig | null;\n initialPrompt?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport class SessionManager {\n private readonly backendUrl: string;\n private readonly frontendUrl?: string;\n private readonly directoryRegistry: DirectoryRegistry;\n private readonly logger: Logger;\n private readonly runners = new Map<string, SessionRunner>();\n\n constructor(options: SessionManagerOptions) {\n this.backendUrl = options.backendUrl;\n this.frontendUrl = options.frontendUrl;\n this.directoryRegistry = options.directoryRegistry;\n this.logger = options.logger;\n }\n\n async startSession(spec: SessionLaunchSpec): Promise<void> {\n if (this.runners.has(spec.launchId)) {\n throw new Error('Session is already running on this machine');\n }\n const entry = await this.directoryRegistry.getEntry(spec.directory);\n if (!entry) {\n throw new Error(`Directory ${spec.directory} is not registered on this machine`);\n }\n\n const runner = new SessionRunner({\n spec,\n directory: entry,\n backendUrl: this.backendUrl,\n frontendUrl: this.frontendUrl,\n logger: this.logger,\n onExit: () => {\n this.runners.delete(spec.launchId);\n },\n });\n\n this.runners.set(spec.launchId, runner);\n try {\n await runner.start();\n } catch (error) {\n this.runners.delete(spec.launchId);\n throw error;\n }\n }\n\n async stopAll(): Promise<void> {\n const runners = Array.from(this.runners.values());\n this.runners.clear();\n await Promise.all(runners.map((runner) => runner.stop()));\n }\n}\n\ninterface SessionRunnerOptions {\n spec: SessionLaunchSpec;\n directory: DirectoryEntry;\n backendUrl: string;\n frontendUrl?: string;\n logger: Logger;\n onExit: () => void;\n}\n\nclass SessionRunner {\n private readonly spec: SessionLaunchSpec;\n private readonly directory: DirectoryEntry;\n private readonly backendUrl: string;\n private readonly frontendUrl?: string;\n private readonly logger: Logger;\n private readonly onExit: () => void;\n\n private startedAt: string | null = null;\n private child: ReturnType<typeof spawn> | null = null;\n private exitPromise: Promise<void> | null = null;\n private resolveExit: (() => void) | null = null;\n private exitHandled = false;\n private logHandle: SessionLogHandle | null = null;\n\n constructor(options: SessionRunnerOptions) {\n this.spec = options.spec;\n this.directory = options.directory;\n this.backendUrl = options.backendUrl;\n this.frontendUrl = options.frontendUrl;\n this.logger = options.logger;\n this.onExit = options.onExit;\n }\n\n async start(): Promise<void> {\n if (this.child) {\n throw new Error('Session runner already started');\n }\n\n const entry = process.argv[1];\n if (!entry) {\n throw new Error('Unable to determine CLI entry path for session runner');\n }\n\n this.exitPromise = new Promise<void>((resolve) => {\n this.resolveExit = resolve;\n });\n\n await withSessionRegistry(async (registry) => {\n const existingPid = registry[this.spec.userSessionId];\n if (existingPid) {\n const alive = await isProcessAlive(existingPid);\n if (alive) {\n throw new Error(`User session ${this.spec.userSessionId} is already running`);\n }\n delete registry[this.spec.userSessionId];\n }\n return [registry, null];\n });\n\n try {\n this.logHandle = await createSessionLog({\n workspaceId: this.spec.workspaceId,\n launchId: this.spec.launchId,\n });\n this.logger.info(`Session ${this.spec.launchId} logs available at ${this.logHandle.logPath}`);\n } catch (error) {\n this.logger.warn(\n `Failed to initialize session log for ${this.directory.path}: ${(error as Error).message}`,\n );\n this.logHandle = null;\n }\n\n const args = [\n entry,\n 'daemon',\n 'run-session',\n '--user-session-id',\n this.spec.userSessionId,\n '--workspace-id',\n this.spec.workspaceId,\n '--directory',\n this.directory.path,\n ];\n\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n ...(this.backendUrl ? { OMNARA_BACKEND_URL: this.backendUrl } : {}),\n ...(this.frontendUrl ? { OMNARA_FRONTEND_URL: this.frontendUrl } : {}),\n OMNARA_WORKSPACE_ID: this.spec.workspaceId,\n OMNARA_WORKSPACE_DIR: this.directory.path,\n OMNARA_USER_SESSION_ID: this.spec.userSessionId,\n };\n if (this.spec.workspaceConfig) {\n env.OMNARA_WORKSPACE_CONFIG = JSON.stringify(this.spec.workspaceConfig);\n }\n if (this.spec.initialPrompt) {\n env.OMNARA_INITIAL_PROMPT = this.spec.initialPrompt;\n }\n if (this.spec.metadata) {\n env.OMNARA_WORKSPACE_METADATA = JSON.stringify(this.spec.metadata);\n }\n\n const child = spawn(process.execPath, args, {\n cwd: this.directory.path,\n stdio: ['ignore', 'pipe', 'pipe'],\n env,\n });\n\n this.child = child;\n\n if (this.logHandle) {\n child.stdout?.pipe(this.logHandle.stream, { end: false });\n child.stderr?.pipe(this.logHandle.stream, { end: false });\n }\n\n let spawned = false;\n const spawnPromise = new Promise<void>((resolve, reject) => {\n child.once('spawn', () => {\n spawned = true;\n this.startedAt = new Date().toISOString();\n this.writeLog('INFO', `Session process started in ${this.directory.path}`);\n resolve();\n });\n\n child.once('error', (error) => {\n if (!spawned) {\n this.writeLog('ERROR', error.message);\n this.cleanup();\n this.resolveExit?.();\n reject(error);\n } else {\n this.handleExit(error.message, true);\n }\n });\n\n child.once('exit', (code, signal) => {\n const message = buildExitMessage(code, signal);\n const failed = typeof code === 'number' && code !== 0;\n this.handleExit(message, failed);\n });\n });\n\n await withSessionRegistry(async (registry) => {\n registry[this.spec.userSessionId] = child.pid ?? -1;\n return [registry, null];\n });\n\n await spawnPromise;\n }\n\n async stop(): Promise<void> {\n if (!this.child) {\n await this.exitPromise;\n return;\n }\n if (!this.child.killed) {\n this.child.kill('SIGINT');\n }\n await this.exitPromise;\n }\n\n private handleExit(reason: string | null, failed: boolean): void {\n if (this.exitHandled) {\n return;\n }\n this.exitHandled = true;\n if (reason) {\n this.writeLog(failed ? 'ERROR' : 'INFO', reason);\n }\n this.cleanup();\n this.resolveExit?.();\n this.onExit();\n }\n\n private cleanup(): void {\n if (this.child) {\n this.child.removeAllListeners();\n this.child = null;\n }\n void withSessionRegistry(async (registry) => {\n delete registry[this.spec.userSessionId];\n return [registry, null];\n });\n if (this.logHandle) {\n this.logHandle.stream.end();\n this.logHandle = null;\n }\n }\n\n private writeLog(level: string, ...args: unknown[]): void {\n if (!this.logHandle) {\n return;\n }\n writeSessionLog(this.logHandle.stream, level, args);\n }\n}\n\nfunction buildExitMessage(code: number | null, signal: NodeJS.Signals | null): string | null {\n if (code !== null) {\n return code === 0 ? null : `Process exited with code ${code}`;\n }\n if (signal) {\n return `Process terminated via signal ${signal}`;\n }\n return null;\n}\n", "import fs from 'node:fs';\nimport path from 'node:path';\nimport { format } from 'node:util';\n\nimport {\n DEFAULT_FILE_MODE,\n USER_SESSION_LOG_ROOT,\n ensureDirectory,\n ensureOmnaraHome,\n} from './paths.js';\n\nexport interface SessionLogHandle {\n stream: fs.WriteStream;\n logPath: string;\n}\n\nexport async function createSessionLog(handle: {\n workspaceId: string;\n launchId: string;\n}): Promise<SessionLogHandle> {\n await ensureOmnaraHome();\n const workspaceDir = path.join(USER_SESSION_LOG_ROOT, handle.workspaceId);\n await ensureDirectory(workspaceDir);\n const fileName = `launch-${handle.launchId}.log`;\n const logPath = path.join(workspaceDir, fileName);\n const stream = fs.createWriteStream(logPath, {\n flags: 'a',\n mode: DEFAULT_FILE_MODE,\n });\n stream.write(`[${new Date().toISOString()}] Launch ${handle.launchId}\\n`);\n return { stream, logPath };\n}\n\nexport function writeSessionLog(stream: fs.WriteStream, level: string, args: unknown[]): void {\n const line = `[${new Date().toISOString()}] [${level}] ${format(...args)}\\n`;\n stream.write(line);\n}\n", "import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { DEFAULT_FILE_MODE, OMNARA_HOME_DIR } from './paths.js';\n\nconst REGISTRY_PATH = path.join(OMNARA_HOME_DIR, 'session-processes.json');\nconst LOCK_PATH = `${REGISTRY_PATH}.lock`;\n\nexport interface SessionRegistry {\n [userSessionId: string]: number;\n}\n\nasync function acquireLock(retries = 20, delayMs = 50): Promise<fs.FileHandle> {\n for (let attempt = 0; attempt < retries; attempt += 1) {\n try {\n const handle = await fs.open(LOCK_PATH, 'wx');\n return handle;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n throw new Error('Failed to acquire session registry lock');\n}\n\nasync function releaseLock(handle: fs.FileHandle): Promise<void> {\n await handle.close();\n await fs.unlink(LOCK_PATH).catch(() => undefined);\n}\n\nasync function readRegistry(): Promise<SessionRegistry> {\n try {\n const raw = await fs.readFile(REGISTRY_PATH, 'utf8');\n return JSON.parse(raw) as SessionRegistry;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return {};\n }\n throw error;\n }\n}\n\nasync function writeRegistry(registry: SessionRegistry): Promise<void> {\n await fs.writeFile(REGISTRY_PATH, JSON.stringify(registry, null, 2), {\n mode: DEFAULT_FILE_MODE,\n });\n}\n\nexport async function withSessionRegistry<T>(\n fn: (registry: SessionRegistry) => Promise<[SessionRegistry, T]> | [SessionRegistry, T],\n): Promise<T> {\n const lockHandle = await acquireLock();\n try {\n const current = await readRegistry();\n const [updated, result] = await fn(current);\n await writeRegistry(updated);\n return result;\n } finally {\n await releaseLock(lockHandle);\n }\n}\n\nexport async function isProcessAlive(pid: number): Promise<boolean> {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ESRCH') {\n return false;\n }\n return true;\n }\n}\n", "import { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\nconst pkg = require('../package.json') as {\n name?: string;\n version?: string;\n description?: string;\n};\n\nconst FALLBACK_NAME = pkg.name ?? 'omnara';\nconst FALLBACK_VERSION = pkg.version ?? '0.0.0';\nconst FALLBACK_DESCRIPTION = pkg.description ?? 'Command-line interface for Omnara.';\n\nexport const PACKAGE_NAME: string =\n typeof __PACKAGE_NAME__ !== 'undefined' ? __PACKAGE_NAME__ : FALLBACK_NAME;\nexport const PACKAGE_VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined' ? __PACKAGE_VERSION__ : FALLBACK_VERSION;\nexport const PACKAGE_DESCRIPTION: string =\n typeof __PACKAGE_DESCRIPTION__ !== 'undefined' ? __PACKAGE_DESCRIPTION__ : FALLBACK_DESCRIPTION;\n", "import type { Logger } from '../utils/logger.js';\nimport { logger as defaultLogger } from '../utils/logger.js';\nimport { DirectoryRegistry } from './directory-registry.js';\nimport {\n startLocalControlServer,\n type LaunchWorkspacePayload,\n type LaunchWorkspaceResult,\n type LocalControlServerHandle,\n} from './local-control-server.js';\nimport { DaemonStateStore, type DaemonStateData } from './state-store.js';\nimport { MachineSupervisor } from './machine-supervisor.js';\nimport type { MachineMessageSchema } from '../../../shared-js/dist/schemas/generated.js';\n\nexport interface DaemonServiceOptions {\n directoryRegistry?: DirectoryRegistry;\n stateStore?: DaemonStateStore;\n machineSupervisor?: MachineSupervisor;\n logger?: Logger;\n}\n\nexport class DaemonService {\n private readonly logger: Logger;\n private readonly directoryRegistry: DirectoryRegistry;\n private readonly stateStore: DaemonStateStore;\n private readonly machineSupervisor: MachineSupervisor | null;\n private controlHandle: LocalControlServerHandle | null = null;\n private startedAt: string | null = null;\n private stopPromise: Promise<void> | null = null;\n private resolveStopPromise: (() => void) | null = null;\n private stopping = false;\n\n constructor(options: DaemonServiceOptions = {}) {\n this.logger = options.logger ?? defaultLogger;\n this.directoryRegistry = options.directoryRegistry ?? new DirectoryRegistry();\n this.stateStore = options.stateStore ?? new DaemonStateStore();\n this.machineSupervisor = options.machineSupervisor ?? null;\n }\n\n async start(): Promise<void> {\n if (this.controlHandle) {\n throw new Error('Daemon service already running');\n }\n\n this.startedAt = new Date().toISOString();\n this.stopPromise = new Promise<void>((resolve) => {\n this.resolveStopPromise = resolve;\n });\n\n try {\n this.controlHandle = await startLocalControlServer({\n directoryRegistry: this.directoryRegistry,\n getStatus: () => this.buildStatusPayload(),\n onStopRequested: (status: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'>) =>\n this.stop(status),\n onLaunchRequested: (payload) => this.handleLaunchRequest(payload),\n logger: this.logger,\n });\n\n await this.machineSupervisor?.start();\n await this.persistState();\n this.logger.success('\u2713 Omnara daemon is running');\n } catch (error) {\n this.stopPromise = null;\n this.resolveStopPromise = null;\n await this.machineSupervisor?.stop('OFFLINE').catch(() => undefined);\n await this.cleanupState();\n throw error;\n }\n }\n\n async stop(\n status: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'> = 'OFFLINE',\n ): Promise<void> {\n if (this.stopping) {\n return;\n }\n\n if (!this.controlHandle && !this.stopPromise) {\n return;\n }\n this.stopping = true;\n\n try {\n if (this.controlHandle) {\n await this.controlHandle.close();\n this.controlHandle = null;\n }\n await this.machineSupervisor?.stop(status);\n } finally {\n await this.cleanupState();\n this.resolveStopPromise?.();\n this.stopPromise = null;\n this.resolveStopPromise = null;\n this.logger.info('Omnara daemon stopped');\n this.stopping = false;\n }\n }\n\n async waitForShutdown(): Promise<void> {\n if (!this.stopPromise) {\n throw new Error('Daemon service has not been started');\n }\n await this.stopPromise;\n }\n\n private async buildStatusPayload() {\n return {\n pid: process.pid,\n startedAt: this.startedAt ?? new Date().toISOString(),\n directories: await this.directoryRegistry.list(),\n };\n }\n\n private async handleLaunchRequest(\n payload: LaunchWorkspacePayload,\n ): Promise<LaunchWorkspaceResult> {\n if (!this.machineSupervisor) {\n throw new Error('Machine supervisor is not running');\n }\n return await this.machineSupervisor.launchWorkspaceSessionLocal({\n path: payload.path,\n initialPrompt: payload.initialPrompt,\n userSessionId: payload.userSessionId,\n });\n }\n\n private async persistState(): Promise<void> {\n if (!this.controlHandle || !this.startedAt) {\n return;\n }\n\n const state: DaemonStateData = {\n pid: process.pid,\n port: this.controlHandle.port,\n token: this.controlHandle.token,\n startedAt: this.startedAt,\n };\n\n await this.stateStore.save(state);\n }\n\n private async cleanupState(): Promise<void> {\n await this.stateStore.clear();\n }\n}\n", "import fs from 'node:fs';\nimport { format } from 'node:util';\nimport path from 'node:path';\n\nimport { ControlledLogger, LogLevel } from '../utils/logger.js';\nimport { DAEMON_LOG_DIR, DEFAULT_FILE_MODE, ensureDirectory, ensureOmnaraHome } from './paths.js';\n\nexport class FileBackedLogger extends ControlledLogger {\n private readonly stream: fs.WriteStream;\n private closed = false;\n\n constructor(stream: fs.WriteStream, options?: { logLevel?: LogLevel; forceOutput?: boolean }) {\n super(options);\n this.stream = stream;\n }\n\n override log(...args: unknown[]): void {\n this.writeLine('INFO', args);\n super.log(...args);\n }\n\n override info(...args: unknown[]): void {\n this.writeLine('INFO', args);\n super.info(...args);\n }\n\n override debug(...args: unknown[]): void {\n this.writeLine('DEBUG', args);\n super.debug(...args);\n }\n\n override warn(...args: unknown[]): void {\n this.writeLine('WARN', args);\n super.warn(...args);\n }\n\n override error(...args: unknown[]): void {\n this.writeLine('ERROR', args);\n super.error(...args);\n }\n\n override trace(...args: unknown[]): void {\n this.writeLine('TRACE', args);\n super.trace(...args);\n }\n\n override important(...args: unknown[]): void {\n this.writeLine('IMPORTANT', args);\n super.important(...args);\n }\n\n override success(...args: unknown[]): void {\n this.writeLine('SUCCESS', args);\n super.success(...args);\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n await new Promise<void>((resolve) => {\n this.stream.end(resolve);\n });\n }\n\n private writeLine(level: string, args: unknown[]): void {\n if (this.closed) {\n return;\n }\n const line = `[${new Date().toISOString()}] [${level}] ${format(...args)}\\n`;\n this.stream.write(line);\n }\n}\n\nexport async function createDaemonFileLogger(): Promise<{\n logger: FileBackedLogger;\n logPath: string;\n}> {\n await ensureOmnaraHome();\n await ensureDirectory(DAEMON_LOG_DIR);\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const fileName = `${timestamp}-${process.pid}.log`;\n const logPath = path.join(DAEMON_LOG_DIR, fileName);\n const stream = fs.createWriteStream(logPath, {\n flags: 'a',\n mode: DEFAULT_FILE_MODE,\n });\n const logger = new FileBackedLogger(stream, { forceOutput: true });\n return { logger, logPath };\n}\n", "import { DaemonService } from './daemon-service.js';\nimport { DirectoryRegistry } from './directory-registry.js';\nimport { DaemonStateStore } from './state-store.js';\nimport { DaemonConfigStore } from './config-store.js';\nimport { MachineSupervisor } from './machine-supervisor.js';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport { createAuthProvider } from '../auth/auth-provider.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from '../auth/login-flow.js';\nimport { createDaemonFileLogger } from './file-logger.js';\n\nexport async function runDaemonProcess(): Promise<void> {\n const { logger, logPath } = await createDaemonFileLogger();\n logger.info(`Writing daemon logs to ${logPath}`);\n const backendUrl = resolveBackendUrl();\n const frontendUrl = resolveFrontendUrl();\n const credentialsStore = new CredentialsStore();\n const authProvider = await createAuthProvider({\n store: credentialsStore,\n backendUrl,\n frontendUrl,\n logger,\n interactive: false,\n });\n\n const configStore = new DaemonConfigStore();\n const directoryRegistry = new DirectoryRegistry(configStore);\n const machineSupervisor = new MachineSupervisor({\n backendUrl,\n frontendUrl,\n directoryRegistry,\n configStore,\n authProvider,\n logger,\n });\n\n const service = new DaemonService({\n directoryRegistry,\n stateStore: new DaemonStateStore(),\n machineSupervisor,\n logger,\n });\n\n const makeSignalHandler = (signal: NodeJS.Signals) => {\n return () => {\n logger.warn(`Received ${signal}. Stopping daemon...`);\n void service.stop().catch((error) => {\n logger.error('Failed to stop daemon:', error);\n });\n };\n };\n\n const sigint = makeSignalHandler('SIGINT');\n const sigterm = makeSignalHandler('SIGTERM');\n process.on('SIGINT', sigint);\n process.on('SIGTERM', sigterm);\n\n try {\n await service.start();\n await service.waitForShutdown();\n } catch (error) {\n logger.error('Daemon exited with error:', error);\n process.exitCode = 1;\n } finally {\n process.off('SIGINT', sigint);\n process.off('SIGTERM', sigterm);\n await service.stop().catch(() => undefined);\n await logger.close();\n }\n}\n", "import type { Console } from 'node:console';\n\nimport { CredentialsStore } from './credentials-store.js';\nimport { createAuthProvider } from './auth-provider.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from './login-flow.js';\n\nexport interface EnsureCliCredentialsOptions {\n backendUrl?: string;\n frontendUrl?: string;\n store?: CredentialsStore;\n logger?: Console;\n}\n\n/**\n * Guarantees that the CLI has valid Supabase credentials stored locally.\n * If the credentials file is missing or expired, this helper runs the\n * interactive browser flow before returning.\n */\nexport async function ensureCliCredentials(\n options: EnsureCliCredentialsOptions = {},\n): Promise<void> {\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const store = options.store ?? new CredentialsStore();\n\n const provider = await createAuthProvider({\n store,\n backendUrl,\n frontendUrl,\n logger: options.logger ?? console,\n });\n await provider.getAccessToken();\n}\n", "import { PACKAGE_NAME, PACKAGE_VERSION } from '../package-info.js';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { DaemonClient } from '../daemon/daemon-client.js';\n\ninterface NpmPackageInfo {\n 'dist-tags': {\n latest?: string;\n };\n versions: Record<string, unknown>;\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 const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n timeout.unref?.();\n\n try {\n const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n return null;\n }\n\n const packageInfo = (await response.json()) as NpmPackageInfo;\n return packageInfo['dist-tags']?.latest ?? null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\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 attemptUpdate(): Promise<boolean> {\n try {\n const currentVersion = PACKAGE_VERSION;\n const packageName = PACKAGE_NAME;\n\n if (!currentVersion || !packageName) {\n return false;\n }\n\n // Fetch latest version from npm registry\n const latestVersion = await fetchLatestVersion(packageName);\n\n if (!latestVersion) {\n return false;\n }\n\n // Compare versions\n if (compareVersions(latestVersion, currentVersion) > 0) {\n const client = new DaemonClient();\n console.log(\n chalk.yellow(\n '\u2550'.repeat(60),\n `\\nUpdate available for Omnara CLI`,\n `\\nCurrent version: ${currentVersion}`,\n `\\nLatest version: ${latestVersion}`,\n `\\n${'\u2550'.repeat(60)}`,\n ),\n );\n\n const status = await client.getStatus();\n if (status) {\n console.log(chalk.yellow('\\nPausing daemon...'));\n client.stop('UPDATING');\n }\n\n console.log(\n chalk.blue(\n '\\nAuto-updating Omnara CLI:',\n `\\n\\n$ npm install -g ${packageName}@latest`,\n `\\n\\nInstalling...\\n\\n`,\n ),\n );\n\n // TODO: we probably want to hot reload here\n execSync('npm install -g omnara@latest');\n\n console.log(chalk.green('\\n\\nUpdate complete! Rerun `omnara` to restart session.\\n'));\n\n return true;\n } else {\n console.log(chalk.grey('Omnara is up to date!\\n'));\n }\n } catch (e) {\n // Silently ignore any errors to not disrupt CLI operation\n console.log(e);\n }\n return false;\n}\n", "import chalk from 'chalk';\nimport { query } from '@anthropic-ai/claude-agent-sdk';\n\n/**\n * Performs the Claude Code check and displays warning if needed\n * @param options - Optional configuration for the check\n * @returns boolean indicating if either authentication method is available\n */\nexport async function performClaudeCodeCheck(): Promise<boolean> {\n // Allow disabling the check via environment variable\n if (process.env.OMNARA_SKIP_CLAUDE_CHECK === 'true') {\n return true;\n }\n\n try {\n for await (const message of query({\n prompt: 'Respond with one word.',\n options: { maxTurns: 1, model: 'haiku', settingSources: ['user', 'project', 'local'] },\n })) {\n if (message.type === 'system') {\n if (message.subtype === 'init') {\n // @ts-expect-error this type is completely wrong and undocumented lmao\n if (message.apiKeySource === 'none') {\n console.log(\n chalk.red(\n \"\\nOmnara didn't detect a valid API key. Login via `claude login` or pass in a valid ANTHROPIC_API_KEY as an environment variable.\\n\",\n ),\n );\n return false;\n } else {\n console.log(chalk.gray(`\\nOmnara is using ${message.apiKeySource} for Claude Code access\\n`));\n }\n }\n }\n if (message.type === 'auth_status') {\n console.log(message);\n }\n }\n } catch {\n console.log(\n chalk.red(\n \"\\nError: Omnara needs access to the Anthropic API. Omnara failed to query the Anthropic API, which means Claude Code likely isn't installed.\\n\",\n ),\n );\n return false;\n }\n\n return true;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "Command", "randomUUID", "prompt", "fs", "randomUUID", "simpleGit", "fs", "path", "path", "path", "extractErrorMessage", "fs", "os", "path", "extractErrorMessage", "info", "output", "fs", "path", "z", "prompt", "randomUUID", "query", "input", "simpleGit", "createSdkMcpServer", "tool", "z", "query", "path", "aName", "bName", "aDepth", "bDepth", "randomUUID", "randomUUID", "EventEmitter", "simpleGit", "path", "extractErrorMessage", "normalizeBaseUrl", "error", "extractErrorMessage", "input", "randomBytes", "base64UrlEncode", "input", "input", "extractErrorMessage", "EventEmitter", "delay", "extractErrorMessage", "randomUUID", "simpleGit", "input", "output", "path", "extractErrorMessage", "extractErrorMessage", "Command", "spawn", "os", "path", "http", "fs", "path", "fs", "os", "path", "DEFAULT_DIR_MODE", "DEFAULT_FILE_MODE", "fs", "isFileNotFound", "extractErrorMessage", "path", "DEFAULT_FILE_MODE", "http", "fs", "path", "fs", "path", "randomUUID", "fs", "isFileNotFound", "extractErrorMessage", "path", "DEFAULT_FILE_MODE", "entry", "randomUUID", "path", "fs", "extractErrorMessage", "chalk", "logger", "os", "extractErrorMessage", "path", "spawn", "http", "randomBytes", "URL", "randomBytes", "URL", "extractErrorMessage", "http", "randomUUID", "os", "delay", "WebSocket", "spawn", "fs", "path", "path", "fs", "DEFAULT_FILE_MODE", "fs", "path", "path", "fs", "DEFAULT_FILE_MODE", "isProcessAlive", "isProcessAlive", "spawn", "require", "LOGIN_WAIT_DELAY_MS", "os", "isLoginRequiredError", "isUnauthorizedApiError", "delay", "WebSocket", "randomUUID", "path", "fs", "format", "path", "format", "path", "fs", "DEFAULT_FILE_MODE", "logger", "logger", "Command", "chalk", "chalk", "chalk", "query", "chalk", "Command", "path", "isConnectionError"]
7
7
  }