@openbuilder/cli 0.50.19 → 0.50.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{Banner-ClJs6QcI.js → Banner-BlktOjfl.js} +6 -3
- package/dist/chunks/{Banner-ClJs6QcI.js.map → Banner-BlktOjfl.js.map} +1 -1
- package/dist/chunks/{_commonjsHelpers-DcsQGttR.js → _commonjsHelpers-h-Bqc03Z.js} +4 -2
- package/dist/chunks/_commonjsHelpers-h-Bqc03Z.js.map +1 -0
- package/dist/chunks/devtools-7A3EXJhY.js +75 -0
- package/dist/chunks/devtools-7A3EXJhY.js.map +1 -0
- package/dist/chunks/index-oFqGtEeF.js +119 -0
- package/dist/chunks/index-oFqGtEeF.js.map +1 -0
- package/dist/chunks/{init-zX5aX-qn.js → init-DDtrxZ0M.js} +13 -8
- package/dist/chunks/{init-zX5aX-qn.js.map → init-DDtrxZ0M.js.map} +1 -1
- package/dist/chunks/{init-tui-DDxZYe9B.js → init-tui-tZtLISA4.js} +14 -9
- package/dist/chunks/{init-tui-DDxZYe9B.js.map → init-tui-tZtLISA4.js.map} +1 -1
- package/dist/chunks/{main-tui-B5GJ49Bp.js → main-tui-Bar2Jb2S.js} +15 -10
- package/dist/chunks/{main-tui-B5GJ49Bp.js.map → main-tui-Bar2Jb2S.js.map} +1 -1
- package/dist/chunks/{run-CaSootos.js → run-9mP5QnpK.js} +14 -8
- package/dist/chunks/{run-CaSootos.js.map → run-9mP5QnpK.js.map} +1 -1
- package/dist/chunks/{start-B4P27nZ7.js → start-CQKEEma-.js} +14 -8
- package/dist/chunks/{start-B4P27nZ7.js.map → start-CQKEEma-.js.map} +1 -1
- package/dist/chunks/theme-CktnrDZj.js +40217 -0
- package/dist/chunks/theme-CktnrDZj.js.map +1 -0
- package/dist/chunks/use-app-Cj2bzWaw.js +10 -0
- package/dist/chunks/use-app-Cj2bzWaw.js.map +1 -0
- package/dist/chunks/{useBuildState-BZuezCb6.js → useBuildState-pcDGDakI.js} +6 -5
- package/dist/chunks/{useBuildState-BZuezCb6.js.map → useBuildState-pcDGDakI.js.map} +1 -1
- package/dist/cli/index.js +5 -5
- package/dist/instrument.js +4 -4
- package/package.json +1 -5
- package/scripts/prepare-release.js +10 -7
- package/dist/chunks/_commonjsHelpers-DcsQGttR.js.map +0 -1
- package/dist/chunks/theme-BF4W2Gwm.js +0 -2300
- package/dist/chunks/theme-BF4W2Gwm.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-B4P27nZ7.js","sources":["../../src/cli/ui/service-manager.ts","../../src/cli/ui/components/Banner.tsx","../../src/cli/ui/Dashboard.tsx","../../src/cli/ui/console-interceptor.ts","../../src/cli/ui/log-file-manager.ts","../../src/cli/utils/build-error-extractor.ts","../../src/cli/commands/start.ts"],"sourcesContent":["/**\n * ServiceManager - Manages lifecycle and state of Web App, Broker, and Runner\n * Provides state updates for TUI dashboard\n */\n\nimport { spawn, ChildProcess } from 'node:child_process';\nimport EventEmitter from 'node:events';\nimport { killProcessOnPort, killProcessTree } from '../utils/process-killer.js';\n\nexport type ServiceName = 'web' | 'broker' | 'runner';\nexport type ServiceStatus = 'stopped' | 'starting' | 'running' | 'error';\n\nexport interface ServiceConfig {\n name: ServiceName;\n displayName: string;\n port?: number;\n command: string;\n args: string[];\n cwd: string;\n env: Record<string, string>;\n}\n\nexport interface ServiceState {\n name: ServiceName;\n displayName: string;\n status: ServiceStatus;\n port?: number;\n uptime: number; // milliseconds\n memory?: number; // bytes\n cpu?: number; // percentage\n pid?: number;\n error?: string;\n lastOutput?: string;\n tunnelUrl?: string; // Cloudflare tunnel URL\n tunnelStatus?: 'creating' | 'active' | 'failed';\n}\n\nexport interface ServiceManagerEvents {\n 'service:status-change': (name: ServiceName, status: ServiceStatus) => void;\n 'service:output': (name: ServiceName, output: string, stream: 'stdout' | 'stderr') => void;\n 'service:error': (name: ServiceName, error: Error) => void;\n 'service:tunnel-change': (name: ServiceName, tunnelUrl: string | null, status: 'creating' | 'active' | 'failed') => void;\n 'all:started': () => void;\n 'all:stopped': () => void;\n}\n\nexport declare interface ServiceManager {\n on<K extends keyof ServiceManagerEvents>(\n event: K,\n listener: ServiceManagerEvents[K]\n ): this;\n emit<K extends keyof ServiceManagerEvents>(\n event: K,\n ...args: Parameters<ServiceManagerEvents[K]>\n ): boolean;\n}\n\nexport class ServiceManager extends EventEmitter {\n private services = new Map<ServiceName, {\n config: ServiceConfig;\n process?: ChildProcess;\n state: ServiceState;\n startTime?: number;\n }>();\n\n private updateInterval?: NodeJS.Timeout;\n\n constructor() {\n super();\n }\n\n /**\n * Register a service configuration\n */\n register(config: ServiceConfig): void {\n this.services.set(config.name, {\n config,\n state: {\n name: config.name,\n displayName: config.displayName,\n status: 'stopped',\n port: config.port,\n uptime: 0,\n },\n });\n }\n\n /**\n * Start a specific service\n */\n async start(name: ServiceName): Promise<void> {\n const service = this.services.get(name);\n if (!service) {\n throw new Error(`Service ${name} not registered`);\n }\n\n if (service.process && !service.process.killed) {\n throw new Error(`Service ${name} is already running`);\n }\n\n // Update state to starting\n service.state.status = 'starting';\n this.emit('service:status-change', name, 'starting');\n\n try {\n // Spawn the process\n const proc = spawn(service.config.command, service.config.args, {\n cwd: service.config.cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n env: {\n ...process.env,\n ...service.config.env,\n },\n });\n\n service.process = proc;\n service.state.pid = proc.pid;\n service.startTime = Date.now();\n\n // Handle stdout - ONLY emit events, NO console.log\n proc.stdout?.on('data', (data) => {\n const output = data.toString();\n service.state.lastOutput = output.trim();\n // Emit event - TUI will handle display\n this.emit('service:output', name, output, 'stdout');\n\n // Detect when service is ready\n if (this.isServiceReady(name, output)) {\n service.state.status = 'running';\n this.emit('service:status-change', name, 'running');\n }\n });\n\n // Handle stderr - ONLY emit events, NO console.log\n proc.stderr?.on('data', (data) => {\n const output = data.toString();\n // Emit event - TUI will handle display\n this.emit('service:output', name, output, 'stderr');\n\n // Check for errors in stderr\n if (output.toLowerCase().includes('error') && !output.includes('warn')) {\n service.state.error = output.trim();\n }\n });\n\n // Handle process exit\n proc.on('exit', (code, signal) => {\n if (code !== 0 && code !== null && code !== 130 && code !== 143) {\n // Abnormal exit\n service.state.status = 'error';\n service.state.error = `Exited with code ${code}`;\n this.emit('service:status-change', name, 'error');\n this.emit('service:error', name, new Error(`Process exited with code ${code}`));\n } else {\n // Normal exit\n service.state.status = 'stopped';\n this.emit('service:status-change', name, 'stopped');\n }\n service.process = undefined;\n service.state.pid = undefined;\n service.startTime = undefined;\n });\n\n proc.on('error', (error) => {\n service.state.status = 'error';\n service.state.error = error.message;\n this.emit('service:status-change', name, 'error');\n this.emit('service:error', name, error);\n });\n\n } catch (error) {\n service.state.status = 'error';\n service.state.error = error instanceof Error ? error.message : 'Unknown error';\n this.emit('service:status-change', name, 'error');\n this.emit('service:error', name, error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Start all registered services in sequence\n */\n async startAll(delayBetween: number = 2000): Promise<void> {\n const services = Array.from(this.services.keys());\n\n for (const name of services) {\n await this.start(name);\n if (delayBetween > 0) {\n await new Promise(resolve => setTimeout(resolve, delayBetween));\n }\n }\n\n // Start periodic updates for uptime/stats\n this.startUpdates();\n\n this.emit('all:started');\n }\n\n /**\n * Stop a specific service\n */\n async stop(name: ServiceName, signal: NodeJS.Signals = 'SIGTERM'): Promise<void> {\n const service = this.services.get(name);\n if (!service) {\n return;\n }\n\n const proc = service.process;\n const port = service.config.port;\n const pid = proc?.pid;\n\n // If no process, just try to kill by port as cleanup\n if (!proc) {\n if (port) {\n await killProcessOnPort(port);\n }\n return;\n }\n\n return new Promise(async (resolve) => {\n // Set timeout for force kill\n const timeout = setTimeout(async () => {\n // Try killing the process tree first\n if (pid) {\n await killProcessTree(pid, 'SIGKILL');\n }\n // Also kill by port as final fallback\n if (port) {\n await killProcessOnPort(port);\n }\n resolve();\n }, 2000);\n\n proc.once('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n\n // First try graceful SIGTERM via process tree\n if (pid) {\n await killProcessTree(pid, signal);\n } else {\n proc.kill(signal);\n }\n });\n }\n\n /**\n * Stop all running services\n */\n async stopAll(): Promise<void> {\n this.stopUpdates();\n\n const services = Array.from(this.services.keys()).reverse(); // Stop in reverse order\n \n // Collect all ports for final cleanup\n const ports: number[] = [];\n for (const name of services) {\n const service = this.services.get(name);\n if (service?.config.port) {\n ports.push(service.config.port);\n }\n }\n \n // Stop each service\n for (const name of services) {\n await this.stop(name);\n }\n\n // Final port cleanup - ensure no zombie processes remain\n // Small delay to let processes actually terminate\n await new Promise(resolve => setTimeout(resolve, 500));\n \n for (const port of ports) {\n await killProcessOnPort(port);\n }\n\n this.emit('all:stopped');\n }\n\n /**\n * Get current state of a service\n */\n getState(name: ServiceName): ServiceState | undefined {\n return this.services.get(name)?.state;\n }\n\n /**\n * Get current state of all services\n */\n getAllStates(): ServiceState[] {\n return Array.from(this.services.values()).map(s => s.state);\n }\n\n /**\n * Check if a service is running\n */\n isRunning(name: ServiceName): boolean {\n return this.services.get(name)?.state.status === 'running';\n }\n\n /**\n * Check if all services are running\n */\n areAllRunning(): boolean {\n return Array.from(this.services.values()).every(s => s.state.status === 'running');\n }\n\n /**\n * Restart a service\n */\n async restart(name: ServiceName): Promise<void> {\n await this.stop(name);\n await new Promise(resolve => setTimeout(resolve, 1000));\n await this.start(name);\n }\n\n /**\n * Restart all services\n */\n async restartAll(): Promise<void> {\n await this.stopAll();\n await new Promise(resolve => setTimeout(resolve, 1000));\n await this.startAll();\n }\n\n /**\n * Start periodic state updates (uptime, memory, cpu)\n */\n private startUpdates(): void {\n this.updateInterval = setInterval(() => {\n for (const [name, service] of this.services) {\n if (service.startTime) {\n service.state.uptime = Date.now() - service.startTime;\n }\n\n // TODO: Add memory/CPU monitoring using ps or similar\n // For now, just update uptime\n }\n }, 1000); // Update every second\n }\n\n /**\n * Stop periodic updates\n */\n private stopUpdates(): void {\n if (this.updateInterval) {\n clearInterval(this.updateInterval);\n this.updateInterval = undefined;\n }\n }\n\n /**\n * Detect if service is ready based on output\n */\n private isServiceReady(name: ServiceName, output: string): boolean {\n const lowerOutput = output.toLowerCase();\n\n switch (name) {\n case 'web':\n return lowerOutput.includes('ready') || lowerOutput.includes('started server');\n case 'broker':\n return lowerOutput.includes('listening') || lowerOutput.includes('ready');\n case 'runner':\n return lowerOutput.includes('connected') || lowerOutput.includes('ready');\n default:\n return false;\n }\n }\n\n /**\n * Create a Cloudflare tunnel for a service\n */\n async createTunnel(name: ServiceName): Promise<string | null> {\n const service = this.services.get(name);\n if (!service || !service.state.port) {\n throw new Error(`Service ${name} not found or has no port`);\n }\n\n // Update state to creating\n service.state.tunnelStatus = 'creating';\n this.emit('service:tunnel-change', name, null, 'creating');\n\n try {\n // Import tunnel manager\n const { tunnelManager } = await import('../../lib/tunnel/manager.js');\n\n // Enable silent mode for TUI\n tunnelManager.setSilent(true);\n\n // Create tunnel\n const tunnelUrl = await tunnelManager.createTunnel(service.state.port);\n\n // Update state\n service.state.tunnelUrl = tunnelUrl;\n service.state.tunnelStatus = 'active';\n this.emit('service:tunnel-change', name, tunnelUrl, 'active');\n\n return tunnelUrl;\n } catch (error) {\n service.state.tunnelStatus = 'failed';\n service.state.error = error instanceof Error ? error.message : 'Tunnel creation failed';\n this.emit('service:tunnel-change', name, null, 'failed');\n return null;\n }\n }\n\n /**\n * Close tunnel for a service\n */\n async closeTunnel(name: ServiceName): Promise<void> {\n const service = this.services.get(name);\n if (!service || !service.state.port) {\n return;\n }\n\n // Update state immediately\n service.state.tunnelUrl = undefined;\n service.state.tunnelStatus = undefined;\n this.emit('service:tunnel-change', name, null, 'active');\n\n try {\n const { tunnelManager } = await import('../../lib/tunnel/manager.js');\n await tunnelManager.closeTunnel(service.state.port);\n } catch (error) {\n // Best effort\n }\n }\n\n /**\n * Get tunnel URL for a service\n */\n getTunnelUrl(name: ServiceName): string | null {\n return this.services.get(name)?.state.tunnelUrl || null;\n }\n\n /**\n * Cleanup and remove all listeners\n */\n destroy(): void {\n this.stopUpdates();\n this.removeAllListeners();\n }\n}\n","/**\n * Banner Component - OpenBuilder ASCII art banner for TUI\n * Matches the init TUI banner style - centered with cyan/purple gradient\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\n\n// Theme colors matching init TUI\nconst colors = {\n cyan: '#06b6d4',\n brightPurple: '#c084fc',\n};\n\n/**\n * ASCII art banner component - centered with cyan/purple gradient\n */\nexport function Banner() {\n const lines = [\n { open: ' ██████╗ ██████╗ ███████╗███╗ ██╗', builder: '██████╗ ██╗ ██╗██╗██╗ ██████╗ ███████╗██████╗ ' },\n { open: '██╔═══██╗██╔══██╗██╔════╝████╗ ██║', builder: '██╔══██╗██║ ██║██║██║ ██╔══██╗██╔════╝██╔══██╗' },\n { open: '██║ ██║██████╔╝█████╗ ██╔██╗ ██║', builder: '██████╔╝██║ ██║██║██║ ██║ ██║█████╗ ██████╔╝' },\n { open: '██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║', builder: '██╔══██╗██║ ██║██║██║ ██║ ██║██╔══╝ ██╔══██╗' },\n { open: '╚██████╔╝██║ ███████╗██║ ╚████║', builder: '██████╔╝╚██████╔╝██║███████╗██████╔╝███████╗██║ ██║' },\n { open: ' ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝', builder: '╚═════╝ ╚═════╝ ╚═╝╚══════╝╚═════╝ ╚══════╝╚═╝ ╚═╝' },\n ];\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={2}>\n {lines.map((line, index) => (\n <Box key={index}>\n <Text color={colors.cyan}>{line.open}</Text>\n <Text color={colors.brightPurple}>{line.builder}</Text>\n </Box>\n ))}\n </Box>\n );\n}\n","/**\n * Main TUI Dashboard Component for Local Mode\n * Redesigned to match Runner Mode UI style with split panel layout\n * Supports dynamic theming that changes TUI colors\n * Shows BUILD panel when there's an active build (with todos)\n */\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput, useApp, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { exec } from 'child_process';\nimport { platform } from 'os';\nimport { ServiceManager, ServiceState } from './service-manager.js';\nimport { Banner } from './components/Banner.js';\nimport { useBuildState } from '../tui/hooks/useBuildState.js';\nimport { BuildPanel } from '../tui/components/BuildPanel.js';\nimport { configManager, type ThemeName } from '../utils/config-manager.js';\n\n// Base colors that don't change with theme\nconst baseColors = {\n success: '#22c55e',\n error: '#ef4444',\n warning: '#f59e0b',\n cyan: '#06b6d4',\n white: '#ffffff',\n gray: '#6b7280',\n dimGray: '#4b5563',\n darkGray: '#374151',\n};\n\nconst symbols = {\n filledDot: '●',\n hollowDot: '○',\n check: '✓',\n cross: '✗',\n spinnerFrames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n};\n\n// Theme definitions (matching web app themes)\n\ninterface ThemeColors {\n primary: string;\n secondary: string;\n accent: string; // Used for highlights, borders\n muted: string; // Dimmed version of primary\n}\n\ninterface ThemeInfo {\n name: ThemeName;\n label: string;\n description: string;\n colors: ThemeColors;\n}\n\nconst THEMES: Record<ThemeName, ThemeInfo> = {\n sentry: {\n name: 'sentry',\n label: 'Sentry',\n description: 'Purple-pink gradient',\n colors: { \n primary: '#a855f7', \n secondary: '#ec4899',\n accent: '#c084fc',\n muted: '#7c3aed',\n },\n },\n ocean: {\n name: 'ocean',\n label: 'Ocean',\n description: 'Cool blue & teal',\n colors: { \n primary: '#3b82f6', \n secondary: '#22d3ee',\n accent: '#60a5fa',\n muted: '#2563eb',\n },\n },\n ember: {\n name: 'ember',\n label: 'Ember',\n description: 'Warm orange & red',\n colors: { \n primary: '#f97316', \n secondary: '#ef4444',\n accent: '#fb923c',\n muted: '#ea580c',\n },\n },\n forest: {\n name: 'forest',\n label: 'Forest',\n description: 'Green & earth tones',\n colors: { \n primary: '#10b981', \n secondary: '#84cc16',\n accent: '#34d399',\n muted: '#059669',\n },\n },\n noir: {\n name: 'noir',\n label: 'Noir',\n description: 'Monochrome dark',\n colors: { \n primary: '#ffffff', \n secondary: '#a1a1aa',\n accent: '#e4e4e7',\n muted: '#71717a',\n },\n },\n};\n\nconst THEME_ORDER: ThemeName[] = ['sentry', 'ocean', 'ember', 'forest', 'noir'];\n\ninterface DashboardProps {\n serviceManager: ServiceManager;\n apiUrl: string;\n webPort: number;\n logFilePath: string | null;\n}\n\ntype ViewMode = 'dashboard' | 'help' | 'fullLog' | 'themeSelector';\ntype FilterMode = 'all' | 'errors' | 'tools' | 'verbose';\n\ninterface LogEntry {\n id: string;\n timestamp: Date;\n service: string;\n message: string;\n stream: 'stdout' | 'stderr';\n level: 'info' | 'success' | 'warn' | 'error';\n tag?: string;\n emoji?: string;\n toolName?: string;\n content?: string;\n isInternal?: boolean;\n displayMessage?: string; // User-friendly transformed message\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString('en-US', { \n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n}\n\nfunction getLogLevel(message: string, stream: 'stdout' | 'stderr'): 'info' | 'success' | 'warn' | 'error' {\n if (stream === 'stderr') return 'warn';\n const lower = message.toLowerCase();\n if (lower.includes('error') || lower.includes('failed') || lower.includes('exception')) return 'error';\n if (lower.includes('warn') || lower.includes('warning')) return 'warn';\n if (lower.includes('success') || lower.includes('ready') || lower.includes('started') || lower.includes('connected') || lower.includes('✅') || lower.includes('✓')) return 'success';\n return 'info';\n}\n\n/**\n * Determines if a log message is internal/debug and should be hidden by default.\n * These are implementation details that aren't useful for end users.\n */\nfunction isInternalLog(message: string): boolean {\n const internalPatterns = [\n // Internal broadcasting/event system\n /Broadcasting/i,\n /Event emitted/i,\n /📡.*Broadcasting/,\n // Session/ID tracking details\n /sessionId=/,\n /todoIndex=/,\n /buildId=/,\n /commandId=/,\n // Internal processor notes\n /NOTE:.*DB writes/,\n /NOTE:.*HTTP/,\n /Registering build.*for WebSocket/,\n // Verbose implementation details\n /from database\\)/,\n /immutable/,\n /\\(waiting for runner/,\n // Duplicate/skip messages\n /Skipping duplicate/,\n // Internal state\n /SSE stream closed/,\n /persistent processor continues/,\n // Cost/optimization notes (internal)\n /Cost savings:/,\n ];\n \n return internalPatterns.some(pattern => pattern.test(message));\n}\n\n/**\n * Transforms a raw log message into a user-friendly format.\n * Extracts meaningful information and presents it clearly.\n */\nfunction transformLogMessage(message: string): { display: string; isUserFacing: boolean; toolAction?: string } {\n // NEW FORMAT: Server now logs \"🔧 Edit: /path/to/file.ts\" or \"🔧 Run: npm install\"\n // Match: 🔧 Action: details\n const newToolFormat = message.match(/🔧\\s*(Read|Edit|Write|Run|Find|Search|Fetch|Update tasks):\\s*(.+)/i);\n if (newToolFormat) {\n const action = newToolFormat[1];\n const detail = newToolFormat[2].trim();\n return { display: `${action}: ${detail}`, isUserFacing: true, toolAction: action };\n }\n \n // Also match bare tool names for backwards compat: \"🔧 Read\" (no colon/details)\n const bareToolMatch = message.match(/^🔧\\s*(Read|Edit|Write|Bash|Glob|Grep|WebFetch|TodoWrite)$/i);\n if (bareToolMatch) {\n return { display: bareToolMatch[1], isUserFacing: true, toolAction: bareToolMatch[1] };\n }\n \n // OLD FORMAT: Tool calls with parentheses like \"🔧 Read (todoIndex=...\"\n // Try to extract any useful info\n const oldToolFormat = message.match(/🔧\\s*(Read|Edit|Write|Bash|Glob|Grep)\\s*\\(/i);\n if (oldToolFormat) {\n const toolName = oldToolFormat[1];\n // Try to extract file path from the message\n const pathMatch = message.match(/(?:path|file)[:=]\\s*[\"']?([^\"'\\s,)]+)/i);\n const cmdMatch = message.match(/(?:command|cmd)[:=]\\s*[\"']?([^\"'\\n]+)/i);\n \n if (toolName.toLowerCase() === 'bash' && cmdMatch) {\n const cmd = cmdMatch[1].trim().substring(0, 50);\n return { display: `Run: ${cmd}${cmdMatch[1].length > 50 ? '...' : ''}`, isUserFacing: true, toolAction: 'Run' };\n } else if (pathMatch) {\n return { display: `${toolName}: ${pathMatch[1]}`, isUserFacing: true, toolAction: toolName };\n }\n // No details found, just show the tool name\n return { display: toolName, isUserFacing: true, toolAction: toolName };\n }\n \n // Template/framework selection - always show\n const templateMatch = message.match(/Template (?:selected|from tag):\\s*(.+)/i);\n if (templateMatch) {\n return { display: `Using template: ${templateMatch[1]}`, isUserFacing: true };\n }\n \n const frameworkMatch = message.match(/Framework.*?:\\s*(\\w+)/i);\n if (frameworkMatch && !message.includes('emit')) {\n return { display: `Framework: ${frameworkMatch[1]}`, isUserFacing: true };\n }\n \n // Build start\n if (message.includes('start event received') || message.includes('build-started')) {\n return { display: 'Build started', isUserFacing: true };\n }\n \n // Build complete\n if (message.includes('marked complete') || message.includes('Build complete')) {\n return { display: 'Build complete', isUserFacing: true };\n }\n \n // Agent selection - clean it up\n const agentMatch = message.match(/(?:Using agent|Agent).*?:\\s*(\\S+)/i);\n if (agentMatch && !message.includes('NOTE:')) {\n return { display: `Agent: ${agentMatch[1].replace(/[()]/g, '')}`, isUserFacing: true };\n }\n \n // Generic success messages\n if (message.includes('✅') && !isInternalLog(message)) {\n // Clean up the message\n const cleaned = message.replace(/\\[[\\w-]+\\]\\s*/g, '').replace(/✅\\s*/, '').trim();\n if (cleaned.length > 10) {\n return { display: cleaned, isUserFacing: true };\n }\n }\n \n // Default: not user-facing if it's internal\n return { display: message, isUserFacing: !isInternalLog(message) };\n}\n\nfunction parseLogMessage(message: string): { tag?: string; emoji?: string; toolName?: string; content: string; isInternal: boolean } {\n let tag: string | undefined;\n let emoji: string | undefined;\n let toolName: string | undefined;\n let content = message;\n\n const tagMatch = content.match(/^\\[([^\\]]+)\\]\\s*/);\n if (tagMatch) {\n tag = tagMatch[1];\n content = content.substring(tagMatch[0].length);\n }\n\n const emojiMatch = content.match(/^([\\u{1F300}-\\u{1F9FF}]|[\\u{2600}-\\u{26FF}]|[\\u{2700}-\\u{27BF}]|✅|✓|📜|📤|🔧|📡|⚠️|❌)\\s*/u);\n if (emojiMatch) {\n emoji = emojiMatch[1];\n content = content.substring(emojiMatch[0].length);\n }\n\n const toolMatch = content.match(/^tool-input-available:\\s*(\\w+)/i);\n if (toolMatch) {\n toolName = toolMatch[1];\n emoji = '🔧';\n }\n \n // Also detect tool calls in format: \"🔧 ToolName (...\"\n const toolCallMatch = content.match(/^(Read|Edit|Write|Bash|Glob|Grep|TodoWrite)\\s*\\(/i);\n if (toolCallMatch) {\n toolName = toolCallMatch[1];\n emoji = '🔧';\n }\n\n return { tag, emoji, toolName, content: content.trim(), isInternal: isInternalLog(message) };\n}\n\nfunction openBrowser(url: string): void {\n const os = platform();\n let command: string;\n \n if (os === 'darwin') {\n command = `open \"${url}\"`;\n } else if (os === 'win32') {\n command = `start \"\" \"${url}\"`;\n } else {\n command = `xdg-open \"${url}\"`;\n }\n \n exec(command, () => {});\n}\n\nexport function Dashboard({ serviceManager, apiUrl, webPort, logFilePath }: DashboardProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const [view, setView] = useState<ViewMode>('dashboard');\n const [services, setServices] = useState<ServiceState[]>([]);\n const [logs, setLogs] = useState<LogEntry[]>([]);\n const [isShuttingDown, setIsShuttingDown] = useState(false);\n const [serviceFilter, setServiceFilter] = useState<string | null>(null);\n const [scrollOffset, setScrollOffset] = useState(0);\n const [autoScroll, setAutoScroll] = useState(true);\n const [searchMode, setSearchMode] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [isVerbose, setIsVerbose] = useState(false);\n const [logIdCounter, setLogIdCounter] = useState(0);\n const [filterMode, setFilterMode] = useState<FilterMode>('all');\n const [fullLogSearchMode, setFullLogSearchMode] = useState(false);\n const [fullLogSearchQuery, setFullLogSearchQuery] = useState('');\n const [fullLogScrollOffset, setFullLogScrollOffset] = useState(0);\n \n // Theme state - load from config, default to 'sentry'\n const savedTheme = configManager.get('ui')?.theme as ThemeName | undefined;\n const [selectedTheme, setSelectedTheme] = useState<ThemeName>(savedTheme || 'sentry');\n const [previewTheme, setPreviewTheme] = useState<ThemeName | null>(null);\n const [themeBeforePreview, setThemeBeforePreview] = useState<ThemeName | null>(null);\n \n // Build state - tracks active builds and todos from the RunnerLogger\n const [buildState] = useBuildState();\n\n // Get current theme colors - use preview theme if active, otherwise selected theme\n const activeThemeName = previewTheme || selectedTheme;\n const theme = THEMES[activeThemeName];\n const themeColors = useMemo(() => ({\n primary: theme.colors.primary,\n secondary: theme.colors.secondary,\n accent: theme.colors.accent,\n muted: theme.colors.muted,\n // Map to semantic colors\n highlight: theme.colors.primary,\n border: theme.colors.muted,\n text: baseColors.white,\n textDim: baseColors.gray,\n textMuted: baseColors.dimGray,\n }), [theme]);\n\n const terminalHeight = stdout?.rows || 40;\n const terminalWidth = stdout?.columns || 80;\n \n const bannerHeight = 7;\n const headerHeight = 3;\n const statusBarHeight = 3;\n const contentHeight = Math.max(1, terminalHeight - bannerHeight - headerHeight - statusBarHeight);\n \n // Show build panel only when there's an active build\n const showBuildPanel = buildState.currentBuild !== null;\n \n // 20/80 split when build panel is shown, otherwise full width\n const buildPanelWidth = Math.floor(terminalWidth * 0.2);\n const logPanelWidth = showBuildPanel ? terminalWidth - buildPanelWidth : terminalWidth;\n\n const allServicesRunning = useMemo(() => {\n return services.length > 0 && services.every(s => s.status === 'running');\n }, [services]);\n\n useEffect(() => {\n const handleStatusChange = () => {\n setServices(serviceManager.getAllStates());\n };\n setServices(serviceManager.getAllStates());\n serviceManager.on('service:status-change', handleStatusChange);\n return () => {\n serviceManager.off('service:status-change', handleStatusChange);\n };\n }, [serviceManager]);\n\n useEffect(() => {\n const handleServiceOutput = (name: string, output: string, stream: 'stdout' | 'stderr') => {\n const lines = output.split('\\n').filter(line => line.trim());\n \n setLogIdCounter(prev => {\n const newLogs: LogEntry[] = lines.map((line, idx) => {\n const trimmed = line.trim();\n const parsed = parseLogMessage(trimmed);\n const transformed = transformLogMessage(trimmed);\n return {\n id: `${Date.now()}-${prev + idx}`,\n timestamp: new Date(),\n service: name,\n message: trimmed,\n stream,\n level: getLogLevel(trimmed, stream),\n tag: parsed.tag,\n emoji: parsed.emoji,\n toolName: parsed.toolName,\n content: parsed.content,\n isInternal: parsed.isInternal,\n displayMessage: transformed.isUserFacing ? transformed.display : undefined,\n };\n });\n \n if (newLogs.length > 0) {\n setLogs(prevLogs => {\n const combined = [...prevLogs, ...newLogs];\n return combined.slice(-10000);\n });\n }\n \n return prev + lines.length;\n });\n };\n\n serviceManager.on('service:output', handleServiceOutput);\n return () => {\n serviceManager.off('service:output', handleServiceOutput);\n };\n }, [serviceManager]);\n\n const filteredLogs = useMemo(() => {\n let filtered = logs;\n \n // By default, hide internal/debug logs unless verbose mode is on\n if (!isVerbose) {\n filtered = filtered.filter(log => \n !log.isInternal &&\n !log.message.toLowerCase().includes('debug') &&\n !log.message.toLowerCase().includes('trace')\n );\n }\n \n if (serviceFilter) {\n filtered = filtered.filter(log => log.service === serviceFilter);\n }\n \n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n filtered = filtered.filter(log =>\n log.message.toLowerCase().includes(query) ||\n log.service.toLowerCase().includes(query)\n );\n }\n \n return filtered;\n }, [logs, serviceFilter, searchQuery, isVerbose]);\n\n const fullLogFilteredLogs = useMemo(() => {\n let filtered = logs;\n \n if (filterMode === 'errors') {\n filtered = filtered.filter(log => log.level === 'error' || log.level === 'warn');\n } else if (filterMode === 'tools') {\n filtered = filtered.filter(log => log.toolName || log.message.includes('tool-input'));\n } else if (filterMode === 'verbose') {\n // Show everything in verbose mode\n } else {\n // Default 'all' mode - hide internal logs\n filtered = filtered.filter(log => \n !log.isInternal &&\n !log.message.toLowerCase().includes('debug') &&\n !log.message.toLowerCase().includes('trace')\n );\n }\n \n if (fullLogSearchQuery.trim()) {\n const query = fullLogSearchQuery.toLowerCase();\n filtered = filtered.filter(log =>\n log.message.toLowerCase().includes(query) ||\n log.service.toLowerCase().includes(query) ||\n (log.tag && log.tag.toLowerCase().includes(query)) ||\n (log.toolName && log.toolName.toLowerCase().includes(query))\n );\n }\n \n return filtered;\n }, [logs, filterMode, fullLogSearchQuery]);\n\n const visibleLines = Math.max(1, contentHeight - 3);\n const fullLogVisibleLines = Math.max(1, terminalHeight - 6);\n \n useEffect(() => {\n if (autoScroll && filteredLogs.length > 0) {\n const maxScroll = Math.max(0, filteredLogs.length - visibleLines);\n setScrollOffset(maxScroll);\n }\n }, [filteredLogs.length, autoScroll, visibleLines]);\n\n useEffect(() => {\n if (view === 'fullLog') {\n const maxScroll = Math.max(0, fullLogFilteredLogs.length - fullLogVisibleLines);\n setFullLogScrollOffset(maxScroll);\n }\n }, [fullLogFilteredLogs.length, view, fullLogVisibleLines]);\n\n const displayedLogs = useMemo(() => {\n return filteredLogs.slice(scrollOffset, scrollOffset + visibleLines);\n }, [filteredLogs, scrollOffset, visibleLines]);\n\n const fullLogDisplayedLogs = useMemo(() => {\n return fullLogFilteredLogs.slice(fullLogScrollOffset, fullLogScrollOffset + fullLogVisibleLines);\n }, [fullLogFilteredLogs, fullLogScrollOffset, fullLogVisibleLines]);\n\n // Save theme to config and update state\n const saveTheme = (newTheme: ThemeName) => {\n setSelectedTheme(newTheme);\n setPreviewTheme(null);\n setThemeBeforePreview(null);\n // Persist to config\n configManager.set('ui', { theme: newTheme });\n };\n \n // Open theme selector\n const openThemeSelector = () => {\n setThemeBeforePreview(selectedTheme);\n setPreviewTheme(selectedTheme);\n setView('themeSelector');\n };\n \n // Cancel theme selection (revert to previous)\n const cancelThemeSelection = () => {\n setPreviewTheme(null);\n setThemeBeforePreview(null);\n setView('dashboard');\n };\n \n // Confirm theme selection\n const confirmThemeSelection = () => {\n if (previewTheme) {\n saveTheme(previewTheme);\n }\n setView('dashboard');\n };\n\n useInput((input, key) => {\n if (isShuttingDown) return;\n\n // Theme selector view\n if (view === 'themeSelector') {\n if (key.escape) {\n cancelThemeSelection();\n return;\n }\n if (key.return) {\n confirmThemeSelection();\n return;\n }\n if (key.upArrow && previewTheme) {\n const currentIndex = THEME_ORDER.indexOf(previewTheme);\n const prevIndex = (currentIndex - 1 + THEME_ORDER.length) % THEME_ORDER.length;\n setPreviewTheme(THEME_ORDER[prevIndex]);\n return;\n }\n if (key.downArrow && previewTheme) {\n const currentIndex = THEME_ORDER.indexOf(previewTheme);\n const nextIndex = (currentIndex + 1) % THEME_ORDER.length;\n setPreviewTheme(THEME_ORDER[nextIndex]);\n return;\n }\n return;\n }\n\n // Help/Menu view\n if (view === 'help') {\n if (key.escape) {\n setView('dashboard');\n return;\n }\n if (input === 'b') {\n openBrowser(`http://localhost:${webPort}`);\n return;\n }\n if (input === 'q') {\n setIsShuttingDown(true);\n serviceManager.stopAll().then(() => exit());\n return;\n }\n return;\n }\n\n // Full log view mode\n if (view === 'fullLog') {\n if (fullLogSearchMode) {\n if (key.escape || key.return) {\n setFullLogSearchMode(false);\n }\n return;\n }\n\n if (key.escape) {\n setView('dashboard');\n return;\n }\n if (input === 'l' || input === 't') {\n setView('dashboard');\n return;\n }\n if (input === '/') {\n setFullLogSearchMode(true);\n return;\n }\n if (input === 'f') {\n const modes: FilterMode[] = ['all', 'errors', 'tools', 'verbose'];\n const currentIndex = modes.indexOf(filterMode);\n setFilterMode(modes[(currentIndex + 1) % modes.length]);\n setFullLogScrollOffset(0);\n return;\n }\n if (key.upArrow) {\n setFullLogScrollOffset(prev => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow) {\n const maxScroll = Math.max(0, fullLogFilteredLogs.length - fullLogVisibleLines);\n setFullLogScrollOffset(prev => Math.min(maxScroll, prev + 1));\n return;\n }\n if (key.pageUp) {\n setFullLogScrollOffset(prev => Math.max(0, prev - fullLogVisibleLines));\n return;\n }\n if (key.pageDown) {\n const maxScroll = Math.max(0, fullLogFilteredLogs.length - fullLogVisibleLines);\n setFullLogScrollOffset(prev => Math.min(maxScroll, prev + fullLogVisibleLines));\n return;\n }\n if (input === 'q') {\n setIsShuttingDown(true);\n serviceManager.stopAll().then(() => exit());\n return;\n }\n if (input === 'b') {\n openBrowser(`http://localhost:${webPort}`);\n return;\n }\n return;\n }\n\n // Dashboard mode\n if (key.escape) {\n if (searchMode) {\n setSearchMode(false);\n setSearchQuery('');\n } else if (view !== 'dashboard') {\n setView('dashboard');\n }\n return;\n }\n\n if (searchMode) return;\n\n if (input === '/' && view === 'dashboard') {\n setSearchMode(true);\n setSearchQuery('');\n return;\n }\n\n // Ctrl+T to open theme selector\n if (key.ctrl && input === 't') {\n openThemeSelector();\n return;\n }\n\n if (input === 'q' || (key.ctrl && input === 'c')) {\n setIsShuttingDown(true);\n serviceManager.stopAll().then(() => exit());\n } else if (input === 'b') {\n openBrowser(`http://localhost:${webPort}`);\n } else if (input === 'v') {\n setIsVerbose(!isVerbose);\n } else if (input === 'r' && view === 'dashboard') {\n serviceManager.restartAll();\n } else if (input === 'c' && view === 'dashboard') {\n setLogs([]);\n setScrollOffset(0);\n setAutoScroll(true);\n } else if (input === 'l' || input === 't') {\n setView('fullLog');\n setFullLogScrollOffset(Math.max(0, fullLogFilteredLogs.length - fullLogVisibleLines));\n } else if (input === 'f') {\n setServiceFilter(current => {\n if (!current) return 'web';\n if (current === 'web') return 'runner';\n return null;\n });\n } else if (key.upArrow) {\n setAutoScroll(false);\n setScrollOffset(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n const maxScroll = Math.max(0, filteredLogs.length - visibleLines);\n setScrollOffset(prev => Math.min(maxScroll, prev + 1));\n if (scrollOffset >= maxScroll - 1) {\n setAutoScroll(true);\n }\n } else if (key.pageUp) {\n setAutoScroll(false);\n setScrollOffset(prev => Math.max(0, prev - visibleLines));\n } else if (key.pageDown) {\n const maxScroll = Math.max(0, filteredLogs.length - visibleLines);\n setScrollOffset(prev => Math.min(maxScroll, prev + visibleLines));\n } else if (input === '?') {\n setView('help');\n }\n });\n\n const highlightSearch = (text: string, query: string): React.ReactNode => {\n if (!query) return text;\n const lowerText = text.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const index = lowerText.indexOf(lowerQuery);\n if (index === -1) return text;\n \n return (\n <>\n {text.slice(0, index)}\n <Text backgroundColor={baseColors.warning} color=\"black\">\n {text.slice(index, index + query.length)}\n </Text>\n {text.slice(index + query.length)}\n </>\n );\n };\n\n // Full log view\n if (view === 'fullLog') {\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n <Box\n borderStyle=\"single\"\n borderColor={themeColors.muted}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text color={themeColors.primary} bold>LOGS</Text>\n <Box>\n <Text color={themeColors.textMuted}>Search: </Text>\n {fullLogSearchMode ? (\n <Box borderStyle=\"round\" borderColor={themeColors.primary} paddingX={1}>\n <TextInput\n value={fullLogSearchQuery}\n onChange={setFullLogSearchQuery}\n placeholder=\"type to search...\"\n />\n </Box>\n ) : (\n <Text color={fullLogSearchQuery ? themeColors.text : themeColors.textMuted}>\n [{fullLogSearchQuery || 'none'}]\n </Text>\n )}\n <Text color={themeColors.textMuted}> [/]</Text>\n </Box>\n </Box>\n\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"single\"\n borderColor={themeColors.muted}\n borderTop={false}\n borderBottom={false}\n paddingX={1}\n >\n {fullLogDisplayedLogs.map((log) => (\n <FullLogEntryRow \n key={log.id} \n log={log} \n maxWidth={terminalWidth - 4}\n searchQuery={fullLogSearchQuery}\n highlightSearch={highlightSearch}\n themeColors={themeColors}\n />\n ))}\n </Box>\n\n <Box\n borderStyle=\"single\"\n borderColor={themeColors.muted}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box>\n <Shortcut letter=\"l\" label=\"dashboard\" color={themeColors.primary} />\n <Shortcut letter=\"/\" label=\"search\" color={themeColors.primary} />\n <Shortcut letter=\"f\" label={`filter: ${filterMode}`} color={themeColors.primary} />\n <Shortcut letter=\"b\" label=\"browser\" color={themeColors.primary} />\n <Shortcut letter=\"q\" label=\"quit\" color={themeColors.primary} />\n </Box>\n <Text color={themeColors.textMuted}>\n {fullLogScrollOffset + 1}-{Math.min(fullLogScrollOffset + fullLogVisibleLines, fullLogFilteredLogs.length)}/{fullLogFilteredLogs.length}\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Theme Selector overlay\n if (view === 'themeSelector') {\n return (\n <Box flexDirection=\"column\" height={terminalHeight} width={terminalWidth}>\n <Banner />\n \n {/* Centered theme selector box */}\n <Box flexGrow={1} justifyContent=\"center\" alignItems=\"center\">\n <Box\n flexDirection=\"column\"\n borderStyle=\"double\"\n borderColor={themeColors.primary}\n paddingX={3}\n paddingY={1}\n width={40}\n >\n <Box justifyContent=\"center\" marginBottom={1}>\n <Text color={themeColors.primary} bold>Select Theme</Text>\n </Box>\n \n {THEME_ORDER.map((themeName) => {\n const t = THEMES[themeName];\n const isSelected = themeName === previewTheme;\n return (\n <Box key={themeName} paddingY={0}>\n <Text color={isSelected ? t.colors.primary : themeColors.textMuted}>\n {isSelected ? '▸ ' : ' '}\n </Text>\n <Text color={isSelected ? t.colors.primary : themeColors.textDim} bold={isSelected}>\n {t.label}\n </Text>\n <Text color={themeColors.textMuted}> - {t.description}</Text>\n </Box>\n );\n })}\n \n <Box marginTop={1} justifyContent=\"center\">\n <Text color={themeColors.textMuted}>\n <Text color={themeColors.primary}>↑↓</Text> navigate \n <Text color={themeColors.primary}> Enter</Text> select \n <Text color={themeColors.primary}> Esc</Text> cancel\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n );\n }\n\n // Help/Menu view\n if (view === 'help') {\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n <Banner />\n <Box flexDirection=\"column\" padding={2}>\n <Text color={themeColors.primary} bold>Help & Keyboard Shortcuts</Text>\n <Text> </Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>Ctrl+T</Text> Change theme</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>b</Text> Open in browser</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>l</Text> Full log view</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>/</Text> Search logs</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>f</Text> Filter by service</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>v</Text> Toggle verbose mode</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>r</Text> Restart services</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>c</Text> Clear logs</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>q</Text> Quit</Text>\n <Text> </Text>\n <Text color={themeColors.textMuted}>Current theme: <Text color={themeColors.primary}>{theme.label}</Text></Text>\n <Text> </Text>\n <Text color={themeColors.textMuted}>Press <Text color={themeColors.primary}>Esc</Text> to return to dashboard</Text>\n </Box>\n </Box>\n );\n }\n\n // Check for available update (set by auto-update check in index.ts)\n const updateAvailable = process.env.OPENBUILDER_UPDATE_AVAILABLE;\n\n // Main dashboard view\n return (\n <Box flexDirection=\"column\" height={terminalHeight} width={terminalWidth}>\n <Banner />\n\n {/* Update notification banner */}\n {updateAvailable && (\n <Box justifyContent=\"center\" paddingY={0}>\n <Text color={baseColors.cyan}>⬆ Update available: </Text>\n <Text color={baseColors.success}>{updateAvailable}</Text>\n <Text color={themeColors.textMuted}> — Run </Text>\n <Text color={baseColors.cyan}>openbuilder upgrade</Text>\n <Text color={themeColors.textMuted}> to update</Text>\n </Box>\n )}\n\n <Box\n borderStyle=\"single\"\n borderColor={themeColors.muted}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text color={themeColors.textMuted}>\n Web: <Text color={themeColors.primary}>localhost:{webPort}</Text>\n {' • '}\n Mode: <Text color={themeColors.primary}>Local</Text>\n {' • '}\n Theme: <Text color={themeColors.primary}>{theme.label}</Text>\n </Text>\n <Box>\n <Text color={allServicesRunning ? baseColors.success : baseColors.warning}>\n {allServicesRunning ? symbols.filledDot : symbols.hollowDot}\n </Text>\n <Text color={themeColors.textDim}>\n {' '}{allServicesRunning ? 'All Services Running' : 'Starting...'}\n </Text>\n </Box>\n </Box>\n\n <Box flexGrow={1} height={contentHeight}>\n {showBuildPanel && (\n <BuildPanel\n build={buildState.currentBuild}\n width={buildPanelWidth}\n height={contentHeight}\n />\n )}\n <Box\n flexDirection=\"column\"\n width={logPanelWidth}\n height={contentHeight}\n borderStyle=\"single\"\n borderColor={themeColors.muted}\n paddingX={1}\n >\n <Box justifyContent=\"space-between\" marginBottom={0}>\n <Text color={themeColors.primary} bold>LOGS</Text>\n <Box>\n {serviceFilter && (\n <Text color={themeColors.textMuted}>filter: <Text color={baseColors.warning}>{serviceFilter}</Text> </Text>\n )}\n <Text color={themeColors.textMuted}>\n [verbose: {isVerbose ? 'on' : 'off'}]\n </Text>\n </Box>\n </Box>\n\n <Box flexDirection=\"column\" flexGrow={1}>\n {displayedLogs.length === 0 ? (\n <Box justifyContent=\"center\" alignItems=\"center\" flexGrow={1}>\n <Text color={themeColors.textMuted}>Waiting for logs...</Text>\n </Box>\n ) : (\n displayedLogs.map((log) => (\n <LogEntryRow key={log.id} log={log} maxWidth={logPanelWidth - 4} themeColors={themeColors} />\n ))\n )}\n </Box>\n\n {filteredLogs.length > visibleLines && (\n <Box justifyContent=\"flex-end\">\n <Text color={themeColors.textMuted}>\n {scrollOffset + 1}-{Math.min(scrollOffset + visibleLines, filteredLogs.length)}/{filteredLogs.length}\n {autoScroll ? ' (auto)' : ''}\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n\n <Box\n borderStyle=\"single\"\n borderColor={themeColors.muted}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box>\n <Text color={allServicesRunning ? baseColors.success : baseColors.warning}>\n {allServicesRunning ? symbols.filledDot : symbols.hollowDot}\n </Text>\n <Text color={themeColors.textDim}>\n {' '}{isShuttingDown ? 'Shutting down...' : allServicesRunning ? 'Ready' : 'Starting'}\n </Text>\n </Box>\n \n {searchMode ? (\n <Box>\n <Text color={themeColors.primary}>/</Text>\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n onSubmit={() => setSearchMode(false)}\n placeholder=\"Search... (Enter to apply, Esc to cancel)\"\n />\n </Box>\n ) : (\n <Box>\n <Shortcut letter=\"b\" label=\"browser\" color={themeColors.primary} />\n <Shortcut letter=\"l\" label=\"logs\" color={themeColors.primary} />\n <Shortcut letter=\"/\" label=\"search\" color={themeColors.primary} />\n <Shortcut letter=\"?\" label=\"menu\" color={themeColors.primary} />\n <Shortcut letter=\"q\" label=\"quit\" color={themeColors.primary} />\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n\ninterface ThemeColorsType {\n primary: string;\n secondary: string;\n accent: string;\n muted: string;\n highlight: string;\n border: string;\n text: string;\n textDim: string;\n textMuted: string;\n}\n\nfunction LogEntryRow({ log, maxWidth, themeColors }: { \n log: LogEntry, \n maxWidth: number,\n themeColors: ThemeColorsType\n}) {\n const levelColors = {\n info: themeColors.primary,\n success: baseColors.success,\n warn: baseColors.warning,\n error: baseColors.error,\n };\n\n const levelIcons = {\n info: symbols.filledDot,\n success: symbols.check,\n warn: '⚠',\n error: symbols.cross,\n };\n\n const serviceColor = log.service === 'web' ? themeColors.primary : themeColors.secondary;\n const icon = log.emoji || levelIcons[log.level];\n const color = levelColors[log.level];\n \n // Use displayMessage if available (user-friendly transformed message)\n let displayContent = log.displayMessage || log.content || log.message;\n const availableWidth = maxWidth - 16;\n const truncatedMessage = displayContent.length > availableWidth\n ? displayContent.substring(0, availableWidth - 3) + '...'\n : displayContent;\n\n // Tool calls get special formatting\n if (log.toolName) {\n // If we have a displayMessage, use it (it's already user-friendly)\n if (log.displayMessage) {\n return (\n <Box>\n <Text color={themeColors.textMuted}>{formatTime(log.timestamp)}</Text>\n <Text color={serviceColor}> [{log.service.substring(0, 3)}]</Text>\n <Text color={themeColors.primary}> 🔧 </Text>\n <Text color={themeColors.text}>{log.displayMessage}</Text>\n </Box>\n );\n }\n // Fallback to showing tool name\n return (\n <Box>\n <Text color={themeColors.textMuted}>{formatTime(log.timestamp)}</Text>\n <Text color={serviceColor}> [{log.service.substring(0, 3)}]</Text>\n <Text color={themeColors.primary}> 🔧 </Text>\n <Text color={themeColors.text}>{log.toolName}</Text>\n </Box>\n );\n }\n\n return (\n <Box>\n <Text color={themeColors.textMuted}>{formatTime(log.timestamp)}</Text>\n <Text color={serviceColor}> [{log.service.substring(0, 3)}]</Text>\n <Text color={color}> {icon} </Text>\n <Text color={log.level === 'error' || log.level === 'warn' ? color : themeColors.text}>\n {truncatedMessage}\n </Text>\n </Box>\n );\n}\n\nfunction FullLogEntryRow({ \n log, \n maxWidth, \n searchQuery,\n highlightSearch,\n themeColors\n}: { \n log: LogEntry, \n maxWidth: number,\n searchQuery: string,\n highlightSearch: (text: string, query: string) => React.ReactNode,\n themeColors: ThemeColorsType\n}) {\n const levelColors = {\n info: themeColors.primary,\n success: baseColors.success,\n warn: baseColors.warning,\n error: baseColors.error,\n };\n\n const levelIcons = {\n info: symbols.filledDot,\n success: symbols.check,\n warn: '⚠',\n error: symbols.cross,\n };\n\n const serviceColor = log.service === 'web' ? themeColors.primary : themeColors.secondary;\n const icon = log.emoji || levelIcons[log.level];\n const color = levelColors[log.level];\n\n if (log.toolName) {\n return (\n <Box>\n <Text color={themeColors.textMuted}>{formatTime(log.timestamp)}</Text>\n <Text color={serviceColor}> [{log.service}]</Text>\n <Text color={themeColors.primary}> 🔧 </Text>\n <Text color={themeColors.text}>{highlightSearch(log.toolName, searchQuery)}</Text>\n {log.content && (\n <Text color={themeColors.textDim}> {highlightSearch(log.content.replace(`tool-input-available: ${log.toolName}`, '').trim(), searchQuery)}</Text>\n )}\n </Box>\n );\n }\n\n return (\n <Box>\n <Text color={themeColors.textMuted}>{formatTime(log.timestamp)}</Text>\n <Text color={serviceColor}> [{log.service}]</Text>\n <Text color={color}> {icon} </Text>\n {log.tag && <Text color={themeColors.textMuted}>[{log.tag}] </Text>}\n <Text color={log.level === 'error' || log.level === 'warn' ? color : themeColors.text}>\n {highlightSearch(log.content || log.message, searchQuery)}\n </Text>\n </Box>\n );\n}\n\nfunction Shortcut({ letter, label, color }: { letter: string; label: string; color: string }) {\n return (\n <Box marginRight={2}>\n <Text color={baseColors.dimGray}>[</Text>\n <Text color={color}>{letter}</Text>\n <Text color={baseColors.dimGray}>]</Text>\n <Text color={baseColors.gray}>{label}</Text>\n </Box>\n );\n}\n","/**\n * Console Interceptor for TUI Mode\n * Intercepts stdout/stderr writes to write to log file\n * Prevents logs from bleeding above the TUI\n */\n\nimport { ServiceManager } from './service-manager.js';\nimport { LogFileManager } from './log-file-manager.js';\n\nexport class ConsoleInterceptor {\n private serviceManager: ServiceManager;\n private logFileManager: LogFileManager;\n private isActive = false;\n private originalStdoutWrite: any;\n private originalStderrWrite: any;\n\n constructor(serviceManager: ServiceManager, logFileManager: LogFileManager) {\n this.serviceManager = serviceManager;\n this.logFileManager = logFileManager;\n\n // Save original stdout/stderr write methods\n // Console methods (log, error, warn, info) all use these under the hood\n this.originalStdoutWrite = process.stdout.write.bind(process.stdout);\n this.originalStderrWrite = process.stderr.write.bind(process.stderr);\n }\n\n /**\n * Start intercepting console output and writing to log file\n * We only intercept stdout/stderr writes since console.* methods call these under the hood\n */\n start(): void {\n if (this.isActive) return;\n this.isActive = true;\n\n // Intercept stdout writes - this catches console.log, console.info, and direct writes\n process.stdout.write = (chunk: any, encoding?: any, callback?: any): boolean => {\n const message = typeof chunk === 'string' ? chunk : chunk.toString();\n\n // ONLY pass through ANSI escape codes (for Ink rendering)\n // Block all other output from reaching the terminal\n if (message.match(/^\\x1b\\[/)) {\n // This is Ink's control sequence - let it through\n return this.originalStdoutWrite(chunk, encoding, callback);\n }\n\n // Everything else: write to log file only (don't show on terminal)\n // Don't trim or filter - write the raw message to preserve formatting\n if (message && message.length > 0) {\n const serviceName = this.detectService(message);\n this.logFileManager.write(serviceName, message.trim(), 'stdout');\n }\n\n // Report success but don't actually write to terminal\n if (callback) callback();\n return true;\n };\n\n // Intercept stderr writes\n process.stderr.write = (chunk: any, encoding?: any, callback?: any): boolean => {\n const message = typeof chunk === 'string' ? chunk : chunk.toString();\n\n // ONLY pass through ANSI escape codes (for Ink rendering)\n // Block all other output from reaching the terminal\n if (message.match(/^\\x1b\\[/)) {\n // This is Ink's control sequence - let it through\n return this.originalStderrWrite(chunk, encoding, callback);\n }\n\n // Everything else: write to log file only (don't show on terminal)\n // Don't trim or filter - write the raw message to preserve formatting\n if (message && message.length > 0) {\n const serviceName = this.detectService(message);\n this.logFileManager.write(serviceName, message.trim(), 'stderr');\n }\n\n // Report success but don't actually write to terminal\n if (callback) callback();\n return true;\n };\n }\n\n /**\n * Get the log file path (null if logging is disabled)\n */\n getLogFilePath(): string | null {\n return this.logFileManager.getLogFilePath();\n }\n\n /**\n * Stop intercepting and restore original stdout/stderr\n */\n stop(): void {\n if (!this.isActive) return;\n this.isActive = false;\n\n // Restore stdout/stderr - this also restores console.* methods since they use these\n process.stdout.write = this.originalStdoutWrite;\n process.stderr.write = this.originalStderrWrite;\n\n // Stop log file writing\n this.logFileManager.stop();\n }\n\n /**\n * Detect which service the log is from based on content\n */\n private detectService(message: string): 'web' | 'broker' | 'runner' {\n const lower = message.toLowerCase();\n\n // Check for explicit service tags\n if (message.startsWith('[web]')) return 'web';\n if (message.startsWith('[broker]')) return 'broker';\n if (message.startsWith('[runner]') || message.startsWith('[build]') || message.startsWith('[orchestrator]') || message.startsWith('[engine]')) {\n return 'runner';\n }\n\n // Infer from content\n if (lower.includes('broker') || lower.includes('websocket')) return 'broker';\n if (lower.includes('next.js') || lower.includes('compiled') || lower.includes('ready in')) return 'web';\n\n // Default to runner (most console.log calls come from runner)\n return 'runner';\n }\n}\n","/**\n * Log File Manager\n * Writes logs to a file for TUI to read periodically\n * Creates a new log file each time the service starts\n */\n\nimport { createWriteStream, WriteStream, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport class LogFileManager {\n private logFile: string | null = null;\n private writeStream: WriteStream | null = null;\n\n constructor() {\n // Create logs directory if it doesn't exist\n const logsDir = join(process.cwd(), 'logs');\n if (!existsSync(logsDir)) {\n mkdirSync(logsDir, { recursive: true });\n }\n\n // Create log file with timestamp\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n this.logFile = join(logsDir, `openbuilder-${timestamp}.log`);\n }\n\n /**\n * Check if logging is enabled (always true now)\n */\n isEnabled(): boolean {\n return true;\n }\n\n /**\n * Start writing to log file\n */\n start(): void {\n if (!this.logFile) return;\n\n this.writeStream = createWriteStream(this.logFile, { flags: 'a' });\n // Write a startup marker\n this.writeStream.write(`[${new Date().toISOString()}] [system] [stdout] === Log file started ===\\n`);\n }\n\n /**\n * Write a log entry to file\n * Format: [timestamp] [service] [stream] message\n */\n write(service: string, message: string, stream: 'stdout' | 'stderr'): void {\n if (!this.writeStream) return;\n\n const timestamp = new Date().toISOString();\n const logLine = `[${timestamp}] [${service}] [${stream}] ${message}\\n`;\n\n this.writeStream.write(logLine, (err) => {\n if (err) {\n // Fallback to console if write fails (but this shouldn't happen often)\n console.error('Failed to write to log file:', err);\n }\n });\n }\n\n /**\n * Get the log file path (null if logging is disabled)\n */\n getLogFilePath(): string | null {\n return this.logFile;\n }\n\n /**\n * Stop writing and close the file stream\n */\n stop(): void {\n if (this.writeStream) {\n this.writeStream.end();\n this.writeStream = null;\n }\n }\n}\n","/**\n * Utility to extract meaningful error messages from build output\n * Works with TypeScript, Next.js, Turbo, and other common build tools\n */\n\n// Patterns that indicate error lines\nconst ERROR_PATTERNS = [\n /error TS\\d+:/i, // TypeScript errors\n /error:/i, // General errors\n /Error:/, // Error messages (case sensitive for JS errors)\n /ERR!/, // npm/pnpm errors\n /failed/i, // Failed messages\n /Cannot find/i, // Module not found\n /Module not found/i, // Webpack/Next.js errors\n /SyntaxError/i, // Syntax errors\n /TypeError/i, // Type errors\n /ReferenceError/i, // Reference errors\n /ENOENT/i, // File not found\n /EACCES/i, // Permission errors\n /✖|✗|×/, // Error symbols\n /Type '.+' is not assignable/i, // TypeScript type errors\n /Property '.+' does not exist/i, // TypeScript property errors\n /has no exported member/i, // Export errors\n /Unexpected token/i, // Parse errors\n];\n\n// Patterns that indicate we should stop collecting (success or unrelated output)\nconst STOP_PATTERNS = [\n /successfully/i,\n /completed/i,\n /✓|✔/, // Success symbols\n /Build succeeded/i,\n];\n\n/**\n * Extract the most relevant error lines from build output\n * @param output Combined stdout and stderr from build process\n * @param maxLines Maximum number of lines to return (default: 15)\n * @returns Array of relevant error lines\n */\nexport function extractBuildErrors(output: string, maxLines: number = 15): string[] {\n if (!output || !output.trim()) {\n return [];\n }\n\n const allLines = output.trim().split('\\n');\n const relevantLines: string[] = [];\n let inErrorBlock = false;\n let emptyLineCount = 0;\n\n for (let i = 0; i < allLines.length; i++) {\n const line = allLines[i];\n const trimmedLine = line.trim();\n \n // Check if this line matches an error pattern\n const isErrorLine = ERROR_PATTERNS.some(pattern => pattern.test(line));\n \n // Check if we should stop collecting\n const shouldStop = STOP_PATTERNS.some(pattern => pattern.test(line));\n \n if (shouldStop && inErrorBlock) {\n // Don't stop immediately - there might be more errors after a success message\n inErrorBlock = false;\n emptyLineCount = 0;\n continue;\n }\n\n if (isErrorLine) {\n inErrorBlock = true;\n emptyLineCount = 0;\n \n // Include 1-2 lines before for context if we're starting a new error block\n if (relevantLines.length === 0 || !relevantLines[relevantLines.length - 1]) {\n // Add file path context if the previous line looks like a file reference\n if (i > 0) {\n const prevLine = allLines[i - 1].trim();\n // File paths often contain '/' or '\\' and end with line numbers like :10:5\n if (prevLine && (prevLine.includes('/') || prevLine.includes('\\\\') || /:\\d+:\\d+/.test(prevLine))) {\n if (!relevantLines.includes(prevLine)) {\n relevantLines.push(prevLine);\n }\n }\n }\n }\n }\n\n if (inErrorBlock) {\n // Track empty lines - stop after 2 consecutive empty lines\n if (trimmedLine === '') {\n emptyLineCount++;\n if (emptyLineCount >= 2) {\n inErrorBlock = false;\n emptyLineCount = 0;\n continue;\n }\n } else {\n emptyLineCount = 0;\n }\n\n // Don't add duplicate lines\n if (!relevantLines.includes(trimmedLine) || trimmedLine === '') {\n relevantLines.push(trimmedLine);\n }\n\n // Stop if we've collected enough\n if (relevantLines.length >= maxLines) {\n break;\n }\n }\n }\n\n // If we didn't find specific error patterns, fall back to last N lines\n if (relevantLines.length === 0) {\n return allLines\n .slice(-10)\n .map(line => line.trim())\n .filter(line => line.length > 0);\n }\n\n // Clean up: remove trailing empty lines\n while (relevantLines.length > 0 && relevantLines[relevantLines.length - 1] === '') {\n relevantLines.pop();\n }\n\n // Truncate very long lines but keep enough context\n return relevantLines.map(line => {\n if (line.length > 150) {\n return line.substring(0, 147) + '...';\n }\n return line;\n });\n}\n\n/**\n * Format extracted errors for display\n * @param errors Array of error lines\n * @param indent Indentation string (default: ' ')\n * @returns Formatted string ready for console output\n */\nexport function formatBuildErrors(errors: string[], indent: string = ' '): string {\n if (errors.length === 0) {\n return '';\n }\n\n const separator = '─'.repeat(60);\n const lines = [\n 'Build errors:',\n separator,\n ...errors.map(line => `${indent}${line}`),\n separator,\n '',\n ];\n\n return lines.join('\\n');\n}\n","/**\n * Start command with TUI dashboard support\n * Provides beautiful real-time monitoring of all services\n */\n\nimport { existsSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { render } from 'ink';\nimport React from 'react';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { configManager } from '../utils/config-manager.js';\nimport { isInsideMonorepo } from '../utils/repo-detector.js';\nimport { killProcessOnPort } from '../utils/process-killer.js';\nimport { CLIError, errors } from '../utils/cli-error.js';\nimport { ServiceManager } from '../ui/service-manager.js';\nimport { Dashboard } from '../ui/Dashboard.js';\nimport { ConsoleInterceptor } from '../ui/console-interceptor.js';\nimport { LogFileManager } from '../ui/log-file-manager.js';\nimport { initRunnerLogger } from '../../lib/logging/index.js';\nimport { setFileLoggerTuiMode } from '../../lib/file-logger.js';\nimport { extractBuildErrors } from '../utils/build-error-extractor.js';\n\ninterface StartOptions {\n port?: string;\n noTui?: boolean; // Disable TUI, use traditional logs\n dev?: boolean; // Use development mode (hot reload)\n rebuild?: boolean; // Rebuild services before starting\n local?: boolean; // Enable local mode (default: true, use --no-local to disable)\n verbose?: boolean; // Enable verbose logging\n}\n\n/**\n * Check if we should use TUI\n */\nfunction shouldUseTUI(options: StartOptions): boolean {\n // Explicit flag\n if (options.noTui) return false;\n\n // CI/CD environments\n if (process.env.CI === '1' || process.env.CI === 'true') return false;\n\n // Not a TTY\n if (!process.stdout.isTTY) return false;\n\n // Explicit env var to disable\n if (process.env.NO_TUI === '1') return false;\n\n return true;\n}\n\nexport async function startCommand(options: StartOptions) {\n const useTUI = shouldUseTUI(options);\n\n // If TUI is disabled, use the traditional start command\n if (!useTUI) {\n const { startCommand: traditionalStart } = await import('./start-traditional.js');\n return traditionalStart(options);\n }\n\n // ========================================\n // TUI MODE\n // ========================================\n\n const s = p.spinner();\n\n // Step 1: Find monorepo\n s.start('Locating OpenBuilder repository');\n\n let monorepoRoot: string | undefined;\n const config = configManager.get();\n\n if (config.monorepoPath && existsSync(config.monorepoPath)) {\n monorepoRoot = config.monorepoPath;\n }\n\n if (!monorepoRoot) {\n const repoCheck = await isInsideMonorepo();\n if (repoCheck.inside && repoCheck.root) {\n monorepoRoot = repoCheck.root;\n configManager.set('monorepoPath', monorepoRoot);\n }\n }\n\n if (!monorepoRoot) {\n s.stop(pc.red('✗') + ' Repository not found');\n throw errors.monorepoNotFound([\n config.monorepoPath || 'none',\n process.cwd(),\n ]);\n }\n\n s.stop(pc.green('✓') + ' Repository found');\n\n // Step 2: Check dependencies\n const nodeModulesPath = join(monorepoRoot, 'node_modules');\n\n if (!existsSync(nodeModulesPath)) {\n s.start('Installing dependencies');\n const { installDependencies } = await import('../utils/repo-cloner.js');\n await installDependencies(monorepoRoot);\n s.stop(pc.green('✓') + ' Dependencies installed');\n }\n\n // Step 2.5: Check for production build (unless --dev mode)\n const nextBuildIdPath = join(monorepoRoot, 'apps', 'openbuilder', '.next', 'BUILD_ID');\n const needsProductionBuild = !options.dev && !existsSync(nextBuildIdPath);\n\n // Rebuild services if requested OR if production build is missing\n if (options.rebuild || needsProductionBuild) {\n const buildReason = options.rebuild \n ? 'Rebuilding services' \n : 'Building for production (first run)';\n s.start(buildReason);\n const { spawn } = await import('child_process');\n\n // Capture build output for error reporting\n let buildOutput = '';\n let buildError = '';\n\n try {\n // Use turbo to build all services with caching\n await new Promise<void>((resolve, reject) => {\n const buildProcess = spawn('pnpm', ['build:all'], {\n cwd: monorepoRoot,\n stdio: 'pipe', // Capture output\n });\n\n buildProcess.stdout?.on('data', (data: Buffer) => {\n buildOutput += data.toString();\n });\n\n buildProcess.stderr?.on('data', (data: Buffer) => {\n buildError += data.toString();\n });\n\n buildProcess.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Build failed with code ${code}`));\n }\n });\n\n buildProcess.on('error', reject);\n });\n\n s.stop(pc.green('✓') + ' Build complete (using Turborepo cache)');\n } catch (error) {\n s.stop(pc.red('✗') + ' Build failed');\n \n // Extract meaningful error lines from build output\n const allOutput = (buildOutput + '\\n' + buildError).trim();\n const errorLines = extractBuildErrors(allOutput);\n \n const suggestions = [\n 'Check that all dependencies are installed',\n 'Try running: pnpm build:all',\n 'Run with --dev flag to skip build and use dev mode',\n ];\n \n // Add error context if available\n if (errorLines.length > 0) {\n console.log(pc.red('\\nBuild errors:'));\n console.log(pc.gray('─'.repeat(60)));\n errorLines.forEach(line => console.log(pc.red(` ${line}`)));\n console.log(pc.gray('─'.repeat(60)));\n console.log('');\n }\n \n throw new CLIError({\n code: 'BUILD_FAILED',\n message: 'Failed to build services',\n suggestions,\n });\n }\n }\n\n // Step 3: Check database configuration\n if (!config.databaseUrl) {\n throw new CLIError({\n code: 'MISSING_REQUIRED_CONFIG',\n message: 'Database URL not configured',\n suggestions: [\n 'Run initialization: openbuilder init',\n 'Or set manually: openbuilder config set databaseUrl <url>',\n ],\n docs: 'https://github.com/codyde/openbuilder#database-setup',\n });\n }\n\n // Step 4: Clean up zombie processes\n const webPort = Number(options.port || '3000');\n\n s.start('Checking for port conflicts');\n await killProcessOnPort(webPort);\n s.stop(pc.green('✓') + ' Ports available');\n\n // Step 5: Create ServiceManager, LogFileManager, and Console Interceptor FIRST\n const serviceManager = new ServiceManager();\n const logFileManager = new LogFileManager();\n logFileManager.start(); // Start log file writing immediately\n const consoleInterceptor = new ConsoleInterceptor(serviceManager, logFileManager);\n\n // Start intercepting IMMEDIATELY before anything else can print\n consoleInterceptor.start();\n\n const sharedSecret = configManager.getSecret() || 'dev-secret';\n\n // Hook up service manager output to log file (for child process logs)\n serviceManager.on('service:output', (name, output, stream) => {\n logFileManager.write(name, output.trim(), stream);\n });\n\n // Keep silent mode for TUI, logs go to file\n process.env.SILENT_MODE = '1';\n\n // Clear screen for clean TUI start\n console.clear();\n\n // Register web app (now handles runner WebSocket connections directly)\n // Default to production mode unless --dev flag is present\n const webCommand = options.dev ? 'dev' : 'start';\n \n // Local mode is enabled by default, can be disabled with --no-local\n const isLocalMode = options.local !== false;\n \n // Write .env.local file to ensure env vars are available to Next.js\n // This is necessary because env vars passed to spawn() may not be visible\n // to Next.js server components in production mode\n const envLocalPath = join(monorepoRoot, 'apps', 'openbuilder', '.env.local');\n const envContent = [\n '# Auto-generated by openbuilder CLI - DO NOT EDIT',\n `# Generated at: ${new Date().toISOString()}`,\n '',\n `OPENBUILDER_LOCAL_MODE=${isLocalMode ? 'true' : 'false'}`,\n `RUNNER_SHARED_SECRET=${sharedSecret}`,\n `WORKSPACE_ROOT=${config.workspace}`,\n `RUNNER_ID=${config.runner?.id || 'local'}`,\n `RUNNER_DEFAULT_ID=${config.runner?.id || 'local'}`,\n `DATABASE_URL=${config.databaseUrl || ''}`,\n '',\n ].join('\\n');\n \n writeFileSync(envLocalPath, envContent);\n \n // Build environment variables for the web app\n const webEnv: Record<string, string> = {\n PORT: String(webPort),\n RUNNER_SHARED_SECRET: sharedSecret,\n WORKSPACE_ROOT: config.workspace,\n RUNNER_ID: config.runner?.id || 'local',\n RUNNER_DEFAULT_ID: config.runner?.id || 'local',\n DATABASE_URL: config.databaseUrl,\n // Enable local mode - bypasses authentication requirements (default: true)\n OPENBUILDER_LOCAL_MODE: isLocalMode ? 'true' : 'false',\n };\n \n serviceManager.register({\n name: 'web',\n displayName: 'Web App',\n port: webPort,\n command: 'pnpm',\n args: ['--filter', 'openbuilder', webCommand],\n cwd: monorepoRoot,\n env: webEnv,\n });\n\n // Register runner (special handling - not spawned, imported directly)\n serviceManager.register({\n name: 'runner',\n displayName: 'Runner',\n command: 'internal', // Not actually spawned\n args: [],\n cwd: monorepoRoot,\n env: {},\n });\n\n // Step 6: Clear screen and move cursor to home before TUI renders\n // Use ANSI codes that will pass through our interceptor\n process.stdout.write('\\x1b[2J\\x1b[H'); // Clear screen + move cursor to top-left\n\n // Ensure stdin is in raw mode for keyboard input\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n\n // Track runner cleanup function and shutting down state\n let isShuttingDown = false;\n let runnerCleanupFn: (() => Promise<void>) | undefined;\n\n // Add backup SIGINT handler for Ctrl+C (in case Ink's doesn't fire)\n const handleSigInt = async () => {\n if (isShuttingDown) {\n // Force exit if already shutting down\n process.exit(1);\n }\n isShuttingDown = true;\n\n console.log('\\n⚠ Received Ctrl+C, stopping services...');\n\n // Stop runner first if cleanup function exists\n if (runnerCleanupFn) {\n await runnerCleanupFn().catch(() => {});\n }\n\n // Then stop other services\n await serviceManager.stopAll().catch(() => {});\n consoleInterceptor.stop();\n process.exit(0);\n };\n\n process.on('SIGINT', handleSigInt);\n\n // One final clear right before rendering\n process.stdout.write('\\x1b[2J\\x1b[H');\n\n // Enable alternate screen buffer to prevent scrolling above TUI\n process.stdout.write('\\x1b[?1049h'); // Enter alternate screen\n process.stdout.write('\\x1b[2J\\x1b[H'); // Clear and home\n\n // Initialize the RunnerLogger BEFORE rendering TUI so the TUI can subscribe to build events\n // This must happen before startRunner() which would create its own logger\n initRunnerLogger({\n verbose: options.verbose || false,\n tuiMode: true,\n });\n \n // Enable TUI mode in file-logger to suppress terminal output\n setFileLoggerTuiMode(true);\n\n // Render TUI immediately with log file path\n const { waitUntilExit, clear } = render(\n React.createElement(Dashboard, {\n serviceManager,\n apiUrl: `http://localhost:${webPort}`,\n webPort,\n logFilePath: consoleInterceptor.getLogFilePath()\n }),\n {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n exitOnCtrlC: true,\n patchConsole: false // Don't let Ink patch console since we already intercept\n }\n );\n\n // Step 7: Start services\n try {\n // Start web app (runner will be started separately)\n await serviceManager.start('web');\n await new Promise(resolve => setTimeout(resolve, 3000)); // Wait for WebSocket server to initialize\n\n // Mark runner as starting\n const runnerService = serviceManager['services'].get('runner');\n if (runnerService) {\n runnerService.state.status = 'starting';\n runnerService.startTime = Date.now();\n serviceManager.emit('service:status-change', 'runner', 'starting');\n }\n\n // Start runner directly (this blocks until shutdown)\n const { startRunner } = await import('../../index.js');\n\n // Mark as running\n if (runnerService) {\n runnerService.state.status = 'running';\n serviceManager.emit('service:status-change', 'runner', 'running');\n }\n\n // Start runner and get cleanup function - connects directly to Next.js WebSocket\n runnerCleanupFn = await startRunner({\n wsUrl: `ws://localhost:${webPort}/ws/runner`,\n sharedSecret: sharedSecret,\n runnerId: config.runner?.id || 'local',\n workspace: config.workspace,\n silent: false, // Changed to false - show all logs\n verbose: options.verbose,\n tuiMode: true, // TUI mode enabled\n });\n\n // Wait for TUI to exit\n await waitUntilExit();\n\n // Stop console interception and restore normal console\n consoleInterceptor.stop();\n\n // Clear TUI immediately\n clear();\n\n // Exit alternate screen buffer\n process.stdout.write('\\x1b[?1049l');\n\n // Show shutdown message\n console.log();\n console.log(pc.yellow('⚠'), 'Stopping all services...');\n\n // Stop all services with timeout\n const shutdownPromise = Promise.race([\n (async () => {\n // Close any active tunnels first (give it 1s)\n await serviceManager.closeTunnel('web').catch(() => {});\n\n // Stop spawned services (web, broker)\n await serviceManager.stopAll();\n console.log(pc.green('✓'), 'Services stopped');\n\n // Stop runner explicitly using cleanup function\n if (runnerCleanupFn) {\n console.log(pc.yellow('⚠'), 'Stopping runner...');\n await runnerCleanupFn();\n console.log(pc.green('✓'), 'Runner stopped');\n }\n\n console.log(pc.green('✓'), 'All services stopped');\n })(),\n new Promise((resolve) => setTimeout(() => {\n console.log(pc.yellow('⚠'), 'Shutdown timeout - forcing exit');\n resolve(undefined);\n }, 5000)) // Increased from 3s to 5s to allow tunnel cleanup\n ]);\n\n await shutdownPromise;\n\n // Force exit to ensure we return to prompt\n process.exit(0);\n } catch (error) {\n // Stop console interception on error\n consoleInterceptor.stop();\n clear();\n // Exit alternate screen buffer\n process.stdout.write('\\x1b[?1049l');\n throw error;\n }\n}\n"],"names":["_jsx","_jsxs","useState","useMemo","useEffect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"start-CQKEEma-.js","sources":["../../src/cli/ui/service-manager.ts","../../src/cli/ui/components/Banner.tsx","../../src/cli/ui/Dashboard.tsx","../../src/cli/ui/console-interceptor.ts","../../src/cli/ui/log-file-manager.ts","../../src/cli/utils/build-error-extractor.ts","../../src/cli/commands/start.ts"],"sourcesContent":["/**\n * ServiceManager - Manages lifecycle and state of Web App, Broker, and Runner\n * Provides state updates for TUI dashboard\n */\n\nimport { spawn, ChildProcess } from 'node:child_process';\nimport EventEmitter from 'node:events';\nimport { killProcessOnPort, killProcessTree } from '../utils/process-killer.js';\n\nexport type ServiceName = 'web' | 'broker' | 'runner';\nexport type ServiceStatus = 'stopped' | 'starting' | 'running' | 'error';\n\nexport interface ServiceConfig {\n name: ServiceName;\n displayName: string;\n port?: number;\n command: string;\n args: string[];\n cwd: string;\n env: Record<string, string>;\n}\n\nexport interface ServiceState {\n name: ServiceName;\n displayName: string;\n status: ServiceStatus;\n port?: number;\n uptime: number; // milliseconds\n memory?: number; // bytes\n cpu?: number; // percentage\n pid?: number;\n error?: string;\n lastOutput?: string;\n tunnelUrl?: string; // Cloudflare tunnel URL\n tunnelStatus?: 'creating' | 'active' | 'failed';\n}\n\nexport interface ServiceManagerEvents {\n 'service:status-change': (name: ServiceName, status: ServiceStatus) => void;\n 'service:output': (name: ServiceName, output: string, stream: 'stdout' | 'stderr') => void;\n 'service:error': (name: ServiceName, error: Error) => void;\n 'service:tunnel-change': (name: ServiceName, tunnelUrl: string | null, status: 'creating' | 'active' | 'failed') => void;\n 'all:started': () => void;\n 'all:stopped': () => void;\n}\n\nexport declare interface ServiceManager {\n on<K extends keyof ServiceManagerEvents>(\n event: K,\n listener: ServiceManagerEvents[K]\n ): this;\n emit<K extends keyof ServiceManagerEvents>(\n event: K,\n ...args: Parameters<ServiceManagerEvents[K]>\n ): boolean;\n}\n\nexport class ServiceManager extends EventEmitter {\n private services = new Map<ServiceName, {\n config: ServiceConfig;\n process?: ChildProcess;\n state: ServiceState;\n startTime?: number;\n }>();\n\n private updateInterval?: NodeJS.Timeout;\n\n constructor() {\n super();\n }\n\n /**\n * Register a service configuration\n */\n register(config: ServiceConfig): void {\n this.services.set(config.name, {\n config,\n state: {\n name: config.name,\n displayName: config.displayName,\n status: 'stopped',\n port: config.port,\n uptime: 0,\n },\n });\n }\n\n /**\n * Start a specific service\n */\n async start(name: ServiceName): Promise<void> {\n const service = this.services.get(name);\n if (!service) {\n throw new Error(`Service ${name} not registered`);\n }\n\n if (service.process && !service.process.killed) {\n throw new Error(`Service ${name} is already running`);\n }\n\n // Update state to starting\n service.state.status = 'starting';\n this.emit('service:status-change', name, 'starting');\n\n try {\n // Spawn the process\n const proc = spawn(service.config.command, service.config.args, {\n cwd: service.config.cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n env: {\n ...process.env,\n ...service.config.env,\n },\n });\n\n service.process = proc;\n service.state.pid = proc.pid;\n service.startTime = Date.now();\n\n // Handle stdout - ONLY emit events, NO console.log\n proc.stdout?.on('data', (data) => {\n const output = data.toString();\n service.state.lastOutput = output.trim();\n // Emit event - TUI will handle display\n this.emit('service:output', name, output, 'stdout');\n\n // Detect when service is ready\n if (this.isServiceReady(name, output)) {\n service.state.status = 'running';\n this.emit('service:status-change', name, 'running');\n }\n });\n\n // Handle stderr - ONLY emit events, NO console.log\n proc.stderr?.on('data', (data) => {\n const output = data.toString();\n // Emit event - TUI will handle display\n this.emit('service:output', name, output, 'stderr');\n\n // Check for errors in stderr\n if (output.toLowerCase().includes('error') && !output.includes('warn')) {\n service.state.error = output.trim();\n }\n });\n\n // Handle process exit\n proc.on('exit', (code, signal) => {\n if (code !== 0 && code !== null && code !== 130 && code !== 143) {\n // Abnormal exit\n service.state.status = 'error';\n service.state.error = `Exited with code ${code}`;\n this.emit('service:status-change', name, 'error');\n this.emit('service:error', name, new Error(`Process exited with code ${code}`));\n } else {\n // Normal exit\n service.state.status = 'stopped';\n this.emit('service:status-change', name, 'stopped');\n }\n service.process = undefined;\n service.state.pid = undefined;\n service.startTime = undefined;\n });\n\n proc.on('error', (error) => {\n service.state.status = 'error';\n service.state.error = error.message;\n this.emit('service:status-change', name, 'error');\n this.emit('service:error', name, error);\n });\n\n } catch (error) {\n service.state.status = 'error';\n service.state.error = error instanceof Error ? error.message : 'Unknown error';\n this.emit('service:status-change', name, 'error');\n this.emit('service:error', name, error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Start all registered services in sequence\n */\n async startAll(delayBetween: number = 2000): Promise<void> {\n const services = Array.from(this.services.keys());\n\n for (const name of services) {\n await this.start(name);\n if (delayBetween > 0) {\n await new Promise(resolve => setTimeout(resolve, delayBetween));\n }\n }\n\n // Start periodic updates for uptime/stats\n this.startUpdates();\n\n this.emit('all:started');\n }\n\n /**\n * Stop a specific service\n */\n async stop(name: ServiceName, signal: NodeJS.Signals = 'SIGTERM'): Promise<void> {\n const service = this.services.get(name);\n if (!service) {\n return;\n }\n\n const proc = service.process;\n const port = service.config.port;\n const pid = proc?.pid;\n\n // If no process, just try to kill by port as cleanup\n if (!proc) {\n if (port) {\n await killProcessOnPort(port);\n }\n return;\n }\n\n return new Promise(async (resolve) => {\n // Set timeout for force kill\n const timeout = setTimeout(async () => {\n // Try killing the process tree first\n if (pid) {\n await killProcessTree(pid, 'SIGKILL');\n }\n // Also kill by port as final fallback\n if (port) {\n await killProcessOnPort(port);\n }\n resolve();\n }, 2000);\n\n proc.once('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n\n // First try graceful SIGTERM via process tree\n if (pid) {\n await killProcessTree(pid, signal);\n } else {\n proc.kill(signal);\n }\n });\n }\n\n /**\n * Stop all running services\n */\n async stopAll(): Promise<void> {\n this.stopUpdates();\n\n const services = Array.from(this.services.keys()).reverse(); // Stop in reverse order\n \n // Collect all ports for final cleanup\n const ports: number[] = [];\n for (const name of services) {\n const service = this.services.get(name);\n if (service?.config.port) {\n ports.push(service.config.port);\n }\n }\n \n // Stop each service\n for (const name of services) {\n await this.stop(name);\n }\n\n // Final port cleanup - ensure no zombie processes remain\n // Small delay to let processes actually terminate\n await new Promise(resolve => setTimeout(resolve, 500));\n \n for (const port of ports) {\n await killProcessOnPort(port);\n }\n\n this.emit('all:stopped');\n }\n\n /**\n * Get current state of a service\n */\n getState(name: ServiceName): ServiceState | undefined {\n return this.services.get(name)?.state;\n }\n\n /**\n * Get current state of all services\n */\n getAllStates(): ServiceState[] {\n return Array.from(this.services.values()).map(s => s.state);\n }\n\n /**\n * Check if a service is running\n */\n isRunning(name: ServiceName): boolean {\n return this.services.get(name)?.state.status === 'running';\n }\n\n /**\n * Check if all services are running\n */\n areAllRunning(): boolean {\n return Array.from(this.services.values()).every(s => s.state.status === 'running');\n }\n\n /**\n * Restart a service\n */\n async restart(name: ServiceName): Promise<void> {\n await this.stop(name);\n await new Promise(resolve => setTimeout(resolve, 1000));\n await this.start(name);\n }\n\n /**\n * Restart all services\n */\n async restartAll(): Promise<void> {\n await this.stopAll();\n await new Promise(resolve => setTimeout(resolve, 1000));\n await this.startAll();\n }\n\n /**\n * Start periodic state updates (uptime, memory, cpu)\n */\n private startUpdates(): void {\n this.updateInterval = setInterval(() => {\n for (const [name, service] of this.services) {\n if (service.startTime) {\n service.state.uptime = Date.now() - service.startTime;\n }\n\n // TODO: Add memory/CPU monitoring using ps or similar\n // For now, just update uptime\n }\n }, 1000); // Update every second\n }\n\n /**\n * Stop periodic updates\n */\n private stopUpdates(): void {\n if (this.updateInterval) {\n clearInterval(this.updateInterval);\n this.updateInterval = undefined;\n }\n }\n\n /**\n * Detect if service is ready based on output\n */\n private isServiceReady(name: ServiceName, output: string): boolean {\n const lowerOutput = output.toLowerCase();\n\n switch (name) {\n case 'web':\n return lowerOutput.includes('ready') || lowerOutput.includes('started server');\n case 'broker':\n return lowerOutput.includes('listening') || lowerOutput.includes('ready');\n case 'runner':\n return lowerOutput.includes('connected') || lowerOutput.includes('ready');\n default:\n return false;\n }\n }\n\n /**\n * Create a Cloudflare tunnel for a service\n */\n async createTunnel(name: ServiceName): Promise<string | null> {\n const service = this.services.get(name);\n if (!service || !service.state.port) {\n throw new Error(`Service ${name} not found or has no port`);\n }\n\n // Update state to creating\n service.state.tunnelStatus = 'creating';\n this.emit('service:tunnel-change', name, null, 'creating');\n\n try {\n // Import tunnel manager\n const { tunnelManager } = await import('../../lib/tunnel/manager.js');\n\n // Enable silent mode for TUI\n tunnelManager.setSilent(true);\n\n // Create tunnel\n const tunnelUrl = await tunnelManager.createTunnel(service.state.port);\n\n // Update state\n service.state.tunnelUrl = tunnelUrl;\n service.state.tunnelStatus = 'active';\n this.emit('service:tunnel-change', name, tunnelUrl, 'active');\n\n return tunnelUrl;\n } catch (error) {\n service.state.tunnelStatus = 'failed';\n service.state.error = error instanceof Error ? error.message : 'Tunnel creation failed';\n this.emit('service:tunnel-change', name, null, 'failed');\n return null;\n }\n }\n\n /**\n * Close tunnel for a service\n */\n async closeTunnel(name: ServiceName): Promise<void> {\n const service = this.services.get(name);\n if (!service || !service.state.port) {\n return;\n }\n\n // Update state immediately\n service.state.tunnelUrl = undefined;\n service.state.tunnelStatus = undefined;\n this.emit('service:tunnel-change', name, null, 'active');\n\n try {\n const { tunnelManager } = await import('../../lib/tunnel/manager.js');\n await tunnelManager.closeTunnel(service.state.port);\n } catch (error) {\n // Best effort\n }\n }\n\n /**\n * Get tunnel URL for a service\n */\n getTunnelUrl(name: ServiceName): string | null {\n return this.services.get(name)?.state.tunnelUrl || null;\n }\n\n /**\n * Cleanup and remove all listeners\n */\n destroy(): void {\n this.stopUpdates();\n this.removeAllListeners();\n }\n}\n","/**\n * Banner Component - OpenBuilder ASCII art banner for TUI\n * Matches the init TUI banner style - centered with cyan/purple gradient\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\n\n// Theme colors matching init TUI\nconst colors = {\n cyan: '#06b6d4',\n brightPurple: '#c084fc',\n};\n\n/**\n * ASCII art banner component - centered with cyan/purple gradient\n */\nexport function Banner() {\n const lines = [\n { open: ' ██████╗ ██████╗ ███████╗███╗ ██╗', builder: '██████╗ ██╗ ██╗██╗██╗ ██████╗ ███████╗██████╗ ' },\n { open: '██╔═══██╗██╔══██╗██╔════╝████╗ ██║', builder: '██╔══██╗██║ ██║██║██║ ██╔══██╗██╔════╝██╔══██╗' },\n { open: '██║ ██║██████╔╝█████╗ ██╔██╗ ██║', builder: '██████╔╝██║ ██║██║██║ ██║ ██║█████╗ ██████╔╝' },\n { open: '██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║', builder: '██╔══██╗██║ ██║██║██║ ██║ ██║██╔══╝ ██╔══██╗' },\n { open: '╚██████╔╝██║ ███████╗██║ ╚████║', builder: '██████╔╝╚██████╔╝██║███████╗██████╔╝███████╗██║ ██║' },\n { open: ' ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝', builder: '╚═════╝ ╚═════╝ ╚═╝╚══════╝╚═════╝ ╚══════╝╚═╝ ╚═╝' },\n ];\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={2}>\n {lines.map((line, index) => (\n <Box key={index}>\n <Text color={colors.cyan}>{line.open}</Text>\n <Text color={colors.brightPurple}>{line.builder}</Text>\n </Box>\n ))}\n </Box>\n );\n}\n","/**\n * Main TUI Dashboard Component for Local Mode\n * Redesigned to match Runner Mode UI style with split panel layout\n * Supports dynamic theming that changes TUI colors\n * Shows BUILD panel when there's an active build (with todos)\n */\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput, useApp, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { exec } from 'child_process';\nimport { platform } from 'os';\nimport { ServiceManager, ServiceState } from './service-manager.js';\nimport { Banner } from './components/Banner.js';\nimport { useBuildState } from '../tui/hooks/useBuildState.js';\nimport { BuildPanel } from '../tui/components/BuildPanel.js';\nimport { configManager, type ThemeName } from '../utils/config-manager.js';\n\n// Base colors that don't change with theme\nconst baseColors = {\n success: '#22c55e',\n error: '#ef4444',\n warning: '#f59e0b',\n cyan: '#06b6d4',\n white: '#ffffff',\n gray: '#6b7280',\n dimGray: '#4b5563',\n darkGray: '#374151',\n};\n\nconst symbols = {\n filledDot: '●',\n hollowDot: '○',\n check: '✓',\n cross: '✗',\n spinnerFrames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n};\n\n// Theme definitions (matching web app themes)\n\ninterface ThemeColors {\n primary: string;\n secondary: string;\n accent: string; // Used for highlights, borders\n muted: string; // Dimmed version of primary\n}\n\ninterface ThemeInfo {\n name: ThemeName;\n label: string;\n description: string;\n colors: ThemeColors;\n}\n\nconst THEMES: Record<ThemeName, ThemeInfo> = {\n sentry: {\n name: 'sentry',\n label: 'Sentry',\n description: 'Purple-pink gradient',\n colors: { \n primary: '#a855f7', \n secondary: '#ec4899',\n accent: '#c084fc',\n muted: '#7c3aed',\n },\n },\n ocean: {\n name: 'ocean',\n label: 'Ocean',\n description: 'Cool blue & teal',\n colors: { \n primary: '#3b82f6', \n secondary: '#22d3ee',\n accent: '#60a5fa',\n muted: '#2563eb',\n },\n },\n ember: {\n name: 'ember',\n label: 'Ember',\n description: 'Warm orange & red',\n colors: { \n primary: '#f97316', \n secondary: '#ef4444',\n accent: '#fb923c',\n muted: '#ea580c',\n },\n },\n forest: {\n name: 'forest',\n label: 'Forest',\n description: 'Green & earth tones',\n colors: { \n primary: '#10b981', \n secondary: '#84cc16',\n accent: '#34d399',\n muted: '#059669',\n },\n },\n noir: {\n name: 'noir',\n label: 'Noir',\n description: 'Monochrome dark',\n colors: { \n primary: '#ffffff', \n secondary: '#a1a1aa',\n accent: '#e4e4e7',\n muted: '#71717a',\n },\n },\n};\n\nconst THEME_ORDER: ThemeName[] = ['sentry', 'ocean', 'ember', 'forest', 'noir'];\n\ninterface DashboardProps {\n serviceManager: ServiceManager;\n apiUrl: string;\n webPort: number;\n logFilePath: string | null;\n}\n\ntype ViewMode = 'dashboard' | 'help' | 'fullLog' | 'themeSelector';\ntype FilterMode = 'all' | 'errors' | 'tools' | 'verbose';\n\ninterface LogEntry {\n id: string;\n timestamp: Date;\n service: string;\n message: string;\n stream: 'stdout' | 'stderr';\n level: 'info' | 'success' | 'warn' | 'error';\n tag?: string;\n emoji?: string;\n toolName?: string;\n content?: string;\n isInternal?: boolean;\n displayMessage?: string; // User-friendly transformed message\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString('en-US', { \n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n}\n\nfunction getLogLevel(message: string, stream: 'stdout' | 'stderr'): 'info' | 'success' | 'warn' | 'error' {\n if (stream === 'stderr') return 'warn';\n const lower = message.toLowerCase();\n if (lower.includes('error') || lower.includes('failed') || lower.includes('exception')) return 'error';\n if (lower.includes('warn') || lower.includes('warning')) return 'warn';\n if (lower.includes('success') || lower.includes('ready') || lower.includes('started') || lower.includes('connected') || lower.includes('✅') || lower.includes('✓')) return 'success';\n return 'info';\n}\n\n/**\n * Determines if a log message is internal/debug and should be hidden by default.\n * These are implementation details that aren't useful for end users.\n */\nfunction isInternalLog(message: string): boolean {\n const internalPatterns = [\n // Internal broadcasting/event system\n /Broadcasting/i,\n /Event emitted/i,\n /📡.*Broadcasting/,\n // Session/ID tracking details\n /sessionId=/,\n /todoIndex=/,\n /buildId=/,\n /commandId=/,\n // Internal processor notes\n /NOTE:.*DB writes/,\n /NOTE:.*HTTP/,\n /Registering build.*for WebSocket/,\n // Verbose implementation details\n /from database\\)/,\n /immutable/,\n /\\(waiting for runner/,\n // Duplicate/skip messages\n /Skipping duplicate/,\n // Internal state\n /SSE stream closed/,\n /persistent processor continues/,\n // Cost/optimization notes (internal)\n /Cost savings:/,\n ];\n \n return internalPatterns.some(pattern => pattern.test(message));\n}\n\n/**\n * Transforms a raw log message into a user-friendly format.\n * Extracts meaningful information and presents it clearly.\n */\nfunction transformLogMessage(message: string): { display: string; isUserFacing: boolean; toolAction?: string } {\n // NEW FORMAT: Server now logs \"🔧 Edit: /path/to/file.ts\" or \"🔧 Run: npm install\"\n // Match: 🔧 Action: details\n const newToolFormat = message.match(/🔧\\s*(Read|Edit|Write|Run|Find|Search|Fetch|Update tasks):\\s*(.+)/i);\n if (newToolFormat) {\n const action = newToolFormat[1];\n const detail = newToolFormat[2].trim();\n return { display: `${action}: ${detail}`, isUserFacing: true, toolAction: action };\n }\n \n // Also match bare tool names for backwards compat: \"🔧 Read\" (no colon/details)\n const bareToolMatch = message.match(/^🔧\\s*(Read|Edit|Write|Bash|Glob|Grep|WebFetch|TodoWrite)$/i);\n if (bareToolMatch) {\n return { display: bareToolMatch[1], isUserFacing: true, toolAction: bareToolMatch[1] };\n }\n \n // OLD FORMAT: Tool calls with parentheses like \"🔧 Read (todoIndex=...\"\n // Try to extract any useful info\n const oldToolFormat = message.match(/🔧\\s*(Read|Edit|Write|Bash|Glob|Grep)\\s*\\(/i);\n if (oldToolFormat) {\n const toolName = oldToolFormat[1];\n // Try to extract file path from the message\n const pathMatch = message.match(/(?:path|file)[:=]\\s*[\"']?([^\"'\\s,)]+)/i);\n const cmdMatch = message.match(/(?:command|cmd)[:=]\\s*[\"']?([^\"'\\n]+)/i);\n \n if (toolName.toLowerCase() === 'bash' && cmdMatch) {\n const cmd = cmdMatch[1].trim().substring(0, 50);\n return { display: `Run: ${cmd}${cmdMatch[1].length > 50 ? '...' : ''}`, isUserFacing: true, toolAction: 'Run' };\n } else if (pathMatch) {\n return { display: `${toolName}: ${pathMatch[1]}`, isUserFacing: true, toolAction: toolName };\n }\n // No details found, just show the tool name\n return { display: toolName, isUserFacing: true, toolAction: toolName };\n }\n \n // Template/framework selection - always show\n const templateMatch = message.match(/Template (?:selected|from tag):\\s*(.+)/i);\n if (templateMatch) {\n return { display: `Using template: ${templateMatch[1]}`, isUserFacing: true };\n }\n \n const frameworkMatch = message.match(/Framework.*?:\\s*(\\w+)/i);\n if (frameworkMatch && !message.includes('emit')) {\n return { display: `Framework: ${frameworkMatch[1]}`, isUserFacing: true };\n }\n \n // Build start\n if (message.includes('start event received') || message.includes('build-started')) {\n return { display: 'Build started', isUserFacing: true };\n }\n \n // Build complete\n if (message.includes('marked complete') || message.includes('Build complete')) {\n return { display: 'Build complete', isUserFacing: true };\n }\n \n // Agent selection - clean it up\n const agentMatch = message.match(/(?:Using agent|Agent).*?:\\s*(\\S+)/i);\n if (agentMatch && !message.includes('NOTE:')) {\n return { display: `Agent: ${agentMatch[1].replace(/[()]/g, '')}`, isUserFacing: true };\n }\n \n // Generic success messages\n if (message.includes('✅') && !isInternalLog(message)) {\n // Clean up the message\n const cleaned = message.replace(/\\[[\\w-]+\\]\\s*/g, '').replace(/✅\\s*/, '').trim();\n if (cleaned.length > 10) {\n return { display: cleaned, isUserFacing: true };\n }\n }\n \n // Default: not user-facing if it's internal\n return { display: message, isUserFacing: !isInternalLog(message) };\n}\n\nfunction parseLogMessage(message: string): { tag?: string; emoji?: string; toolName?: string; content: string; isInternal: boolean } {\n let tag: string | undefined;\n let emoji: string | undefined;\n let toolName: string | undefined;\n let content = message;\n\n const tagMatch = content.match(/^\\[([^\\]]+)\\]\\s*/);\n if (tagMatch) {\n tag = tagMatch[1];\n content = content.substring(tagMatch[0].length);\n }\n\n const emojiMatch = content.match(/^([\\u{1F300}-\\u{1F9FF}]|[\\u{2600}-\\u{26FF}]|[\\u{2700}-\\u{27BF}]|✅|✓|📜|📤|🔧|📡|⚠️|❌)\\s*/u);\n if (emojiMatch) {\n emoji = emojiMatch[1];\n content = content.substring(emojiMatch[0].length);\n }\n\n const toolMatch = content.match(/^tool-input-available:\\s*(\\w+)/i);\n if (toolMatch) {\n toolName = toolMatch[1];\n emoji = '🔧';\n }\n \n // Also detect tool calls in format: \"🔧 ToolName (...\"\n const toolCallMatch = content.match(/^(Read|Edit|Write|Bash|Glob|Grep|TodoWrite)\\s*\\(/i);\n if (toolCallMatch) {\n toolName = toolCallMatch[1];\n emoji = '🔧';\n }\n\n return { tag, emoji, toolName, content: content.trim(), isInternal: isInternalLog(message) };\n}\n\nfunction openBrowser(url: string): void {\n const os = platform();\n let command: string;\n \n if (os === 'darwin') {\n command = `open \"${url}\"`;\n } else if (os === 'win32') {\n command = `start \"\" \"${url}\"`;\n } else {\n command = `xdg-open \"${url}\"`;\n }\n \n exec(command, () => {});\n}\n\nexport function Dashboard({ serviceManager, apiUrl, webPort, logFilePath }: DashboardProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const [view, setView] = useState<ViewMode>('dashboard');\n const [services, setServices] = useState<ServiceState[]>([]);\n const [logs, setLogs] = useState<LogEntry[]>([]);\n const [isShuttingDown, setIsShuttingDown] = useState(false);\n const [serviceFilter, setServiceFilter] = useState<string | null>(null);\n const [scrollOffset, setScrollOffset] = useState(0);\n const [autoScroll, setAutoScroll] = useState(true);\n const [searchMode, setSearchMode] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [isVerbose, setIsVerbose] = useState(false);\n const [logIdCounter, setLogIdCounter] = useState(0);\n const [filterMode, setFilterMode] = useState<FilterMode>('all');\n const [fullLogSearchMode, setFullLogSearchMode] = useState(false);\n const [fullLogSearchQuery, setFullLogSearchQuery] = useState('');\n const [fullLogScrollOffset, setFullLogScrollOffset] = useState(0);\n \n // Theme state - load from config, default to 'sentry'\n const savedTheme = configManager.get('ui')?.theme as ThemeName | undefined;\n const [selectedTheme, setSelectedTheme] = useState<ThemeName>(savedTheme || 'sentry');\n const [previewTheme, setPreviewTheme] = useState<ThemeName | null>(null);\n const [themeBeforePreview, setThemeBeforePreview] = useState<ThemeName | null>(null);\n \n // Build state - tracks active builds and todos from the RunnerLogger\n const [buildState] = useBuildState();\n\n // Get current theme colors - use preview theme if active, otherwise selected theme\n const activeThemeName = previewTheme || selectedTheme;\n const theme = THEMES[activeThemeName];\n const themeColors = useMemo(() => ({\n primary: theme.colors.primary,\n secondary: theme.colors.secondary,\n accent: theme.colors.accent,\n muted: theme.colors.muted,\n // Map to semantic colors\n highlight: theme.colors.primary,\n border: theme.colors.muted,\n text: baseColors.white,\n textDim: baseColors.gray,\n textMuted: baseColors.dimGray,\n }), [theme]);\n\n const terminalHeight = stdout?.rows || 40;\n const terminalWidth = stdout?.columns || 80;\n \n const bannerHeight = 7;\n const headerHeight = 3;\n const statusBarHeight = 3;\n const contentHeight = Math.max(1, terminalHeight - bannerHeight - headerHeight - statusBarHeight);\n \n // Show build panel only when there's an active build\n const showBuildPanel = buildState.currentBuild !== null;\n \n // 20/80 split when build panel is shown, otherwise full width\n const buildPanelWidth = Math.floor(terminalWidth * 0.2);\n const logPanelWidth = showBuildPanel ? terminalWidth - buildPanelWidth : terminalWidth;\n\n const allServicesRunning = useMemo(() => {\n return services.length > 0 && services.every(s => s.status === 'running');\n }, [services]);\n\n useEffect(() => {\n const handleStatusChange = () => {\n setServices(serviceManager.getAllStates());\n };\n setServices(serviceManager.getAllStates());\n serviceManager.on('service:status-change', handleStatusChange);\n return () => {\n serviceManager.off('service:status-change', handleStatusChange);\n };\n }, [serviceManager]);\n\n useEffect(() => {\n const handleServiceOutput = (name: string, output: string, stream: 'stdout' | 'stderr') => {\n const lines = output.split('\\n').filter(line => line.trim());\n \n setLogIdCounter(prev => {\n const newLogs: LogEntry[] = lines.map((line, idx) => {\n const trimmed = line.trim();\n const parsed = parseLogMessage(trimmed);\n const transformed = transformLogMessage(trimmed);\n return {\n id: `${Date.now()}-${prev + idx}`,\n timestamp: new Date(),\n service: name,\n message: trimmed,\n stream,\n level: getLogLevel(trimmed, stream),\n tag: parsed.tag,\n emoji: parsed.emoji,\n toolName: parsed.toolName,\n content: parsed.content,\n isInternal: parsed.isInternal,\n displayMessage: transformed.isUserFacing ? transformed.display : undefined,\n };\n });\n \n if (newLogs.length > 0) {\n setLogs(prevLogs => {\n const combined = [...prevLogs, ...newLogs];\n return combined.slice(-10000);\n });\n }\n \n return prev + lines.length;\n });\n };\n\n serviceManager.on('service:output', handleServiceOutput);\n return () => {\n serviceManager.off('service:output', handleServiceOutput);\n };\n }, [serviceManager]);\n\n const filteredLogs = useMemo(() => {\n let filtered = logs;\n \n // By default, hide internal/debug logs unless verbose mode is on\n if (!isVerbose) {\n filtered = filtered.filter(log => \n !log.isInternal &&\n !log.message.toLowerCase().includes('debug') &&\n !log.message.toLowerCase().includes('trace')\n );\n }\n \n if (serviceFilter) {\n filtered = filtered.filter(log => log.service === serviceFilter);\n }\n \n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n filtered = filtered.filter(log =>\n log.message.toLowerCase().includes(query) ||\n log.service.toLowerCase().includes(query)\n );\n }\n \n return filtered;\n }, [logs, serviceFilter, searchQuery, isVerbose]);\n\n const fullLogFilteredLogs = useMemo(() => {\n let filtered = logs;\n \n if (filterMode === 'errors') {\n filtered = filtered.filter(log => log.level === 'error' || log.level === 'warn');\n } else if (filterMode === 'tools') {\n filtered = filtered.filter(log => log.toolName || log.message.includes('tool-input'));\n } else if (filterMode === 'verbose') {\n // Show everything in verbose mode\n } else {\n // Default 'all' mode - hide internal logs\n filtered = filtered.filter(log => \n !log.isInternal &&\n !log.message.toLowerCase().includes('debug') &&\n !log.message.toLowerCase().includes('trace')\n );\n }\n \n if (fullLogSearchQuery.trim()) {\n const query = fullLogSearchQuery.toLowerCase();\n filtered = filtered.filter(log =>\n log.message.toLowerCase().includes(query) ||\n log.service.toLowerCase().includes(query) ||\n (log.tag && log.tag.toLowerCase().includes(query)) ||\n (log.toolName && log.toolName.toLowerCase().includes(query))\n );\n }\n \n return filtered;\n }, [logs, filterMode, fullLogSearchQuery]);\n\n const visibleLines = Math.max(1, contentHeight - 3);\n const fullLogVisibleLines = Math.max(1, terminalHeight - 6);\n \n useEffect(() => {\n if (autoScroll && filteredLogs.length > 0) {\n const maxScroll = Math.max(0, filteredLogs.length - visibleLines);\n setScrollOffset(maxScroll);\n }\n }, [filteredLogs.length, autoScroll, visibleLines]);\n\n useEffect(() => {\n if (view === 'fullLog') {\n const maxScroll = Math.max(0, fullLogFilteredLogs.length - fullLogVisibleLines);\n setFullLogScrollOffset(maxScroll);\n }\n }, [fullLogFilteredLogs.length, view, fullLogVisibleLines]);\n\n const displayedLogs = useMemo(() => {\n return filteredLogs.slice(scrollOffset, scrollOffset + visibleLines);\n }, [filteredLogs, scrollOffset, visibleLines]);\n\n const fullLogDisplayedLogs = useMemo(() => {\n return fullLogFilteredLogs.slice(fullLogScrollOffset, fullLogScrollOffset + fullLogVisibleLines);\n }, [fullLogFilteredLogs, fullLogScrollOffset, fullLogVisibleLines]);\n\n // Save theme to config and update state\n const saveTheme = (newTheme: ThemeName) => {\n setSelectedTheme(newTheme);\n setPreviewTheme(null);\n setThemeBeforePreview(null);\n // Persist to config\n configManager.set('ui', { theme: newTheme });\n };\n \n // Open theme selector\n const openThemeSelector = () => {\n setThemeBeforePreview(selectedTheme);\n setPreviewTheme(selectedTheme);\n setView('themeSelector');\n };\n \n // Cancel theme selection (revert to previous)\n const cancelThemeSelection = () => {\n setPreviewTheme(null);\n setThemeBeforePreview(null);\n setView('dashboard');\n };\n \n // Confirm theme selection\n const confirmThemeSelection = () => {\n if (previewTheme) {\n saveTheme(previewTheme);\n }\n setView('dashboard');\n };\n\n useInput((input, key) => {\n if (isShuttingDown) return;\n\n // Theme selector view\n if (view === 'themeSelector') {\n if (key.escape) {\n cancelThemeSelection();\n return;\n }\n if (key.return) {\n confirmThemeSelection();\n return;\n }\n if (key.upArrow && previewTheme) {\n const currentIndex = THEME_ORDER.indexOf(previewTheme);\n const prevIndex = (currentIndex - 1 + THEME_ORDER.length) % THEME_ORDER.length;\n setPreviewTheme(THEME_ORDER[prevIndex]);\n return;\n }\n if (key.downArrow && previewTheme) {\n const currentIndex = THEME_ORDER.indexOf(previewTheme);\n const nextIndex = (currentIndex + 1) % THEME_ORDER.length;\n setPreviewTheme(THEME_ORDER[nextIndex]);\n return;\n }\n return;\n }\n\n // Help/Menu view\n if (view === 'help') {\n if (key.escape) {\n setView('dashboard');\n return;\n }\n if (input === 'b') {\n openBrowser(`http://localhost:${webPort}`);\n return;\n }\n if (input === 'q') {\n setIsShuttingDown(true);\n serviceManager.stopAll().then(() => exit());\n return;\n }\n return;\n }\n\n // Full log view mode\n if (view === 'fullLog') {\n if (fullLogSearchMode) {\n if (key.escape || key.return) {\n setFullLogSearchMode(false);\n }\n return;\n }\n\n if (key.escape) {\n setView('dashboard');\n return;\n }\n if (input === 'l' || input === 't') {\n setView('dashboard');\n return;\n }\n if (input === '/') {\n setFullLogSearchMode(true);\n return;\n }\n if (input === 'f') {\n const modes: FilterMode[] = ['all', 'errors', 'tools', 'verbose'];\n const currentIndex = modes.indexOf(filterMode);\n setFilterMode(modes[(currentIndex + 1) % modes.length]);\n setFullLogScrollOffset(0);\n return;\n }\n if (key.upArrow) {\n setFullLogScrollOffset(prev => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow) {\n const maxScroll = Math.max(0, fullLogFilteredLogs.length - fullLogVisibleLines);\n setFullLogScrollOffset(prev => Math.min(maxScroll, prev + 1));\n return;\n }\n if (key.pageUp) {\n setFullLogScrollOffset(prev => Math.max(0, prev - fullLogVisibleLines));\n return;\n }\n if (key.pageDown) {\n const maxScroll = Math.max(0, fullLogFilteredLogs.length - fullLogVisibleLines);\n setFullLogScrollOffset(prev => Math.min(maxScroll, prev + fullLogVisibleLines));\n return;\n }\n if (input === 'q') {\n setIsShuttingDown(true);\n serviceManager.stopAll().then(() => exit());\n return;\n }\n if (input === 'b') {\n openBrowser(`http://localhost:${webPort}`);\n return;\n }\n return;\n }\n\n // Dashboard mode\n if (key.escape) {\n if (searchMode) {\n setSearchMode(false);\n setSearchQuery('');\n } else if (view !== 'dashboard') {\n setView('dashboard');\n }\n return;\n }\n\n if (searchMode) return;\n\n if (input === '/' && view === 'dashboard') {\n setSearchMode(true);\n setSearchQuery('');\n return;\n }\n\n // Ctrl+T to open theme selector\n if (key.ctrl && input === 't') {\n openThemeSelector();\n return;\n }\n\n if (input === 'q' || (key.ctrl && input === 'c')) {\n setIsShuttingDown(true);\n serviceManager.stopAll().then(() => exit());\n } else if (input === 'b') {\n openBrowser(`http://localhost:${webPort}`);\n } else if (input === 'v') {\n setIsVerbose(!isVerbose);\n } else if (input === 'r' && view === 'dashboard') {\n serviceManager.restartAll();\n } else if (input === 'c' && view === 'dashboard') {\n setLogs([]);\n setScrollOffset(0);\n setAutoScroll(true);\n } else if (input === 'l' || input === 't') {\n setView('fullLog');\n setFullLogScrollOffset(Math.max(0, fullLogFilteredLogs.length - fullLogVisibleLines));\n } else if (input === 'f') {\n setServiceFilter(current => {\n if (!current) return 'web';\n if (current === 'web') return 'runner';\n return null;\n });\n } else if (key.upArrow) {\n setAutoScroll(false);\n setScrollOffset(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n const maxScroll = Math.max(0, filteredLogs.length - visibleLines);\n setScrollOffset(prev => Math.min(maxScroll, prev + 1));\n if (scrollOffset >= maxScroll - 1) {\n setAutoScroll(true);\n }\n } else if (key.pageUp) {\n setAutoScroll(false);\n setScrollOffset(prev => Math.max(0, prev - visibleLines));\n } else if (key.pageDown) {\n const maxScroll = Math.max(0, filteredLogs.length - visibleLines);\n setScrollOffset(prev => Math.min(maxScroll, prev + visibleLines));\n } else if (input === '?') {\n setView('help');\n }\n });\n\n const highlightSearch = (text: string, query: string): React.ReactNode => {\n if (!query) return text;\n const lowerText = text.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const index = lowerText.indexOf(lowerQuery);\n if (index === -1) return text;\n \n return (\n <>\n {text.slice(0, index)}\n <Text backgroundColor={baseColors.warning} color=\"black\">\n {text.slice(index, index + query.length)}\n </Text>\n {text.slice(index + query.length)}\n </>\n );\n };\n\n // Full log view\n if (view === 'fullLog') {\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n <Box\n borderStyle=\"single\"\n borderColor={themeColors.muted}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text color={themeColors.primary} bold>LOGS</Text>\n <Box>\n <Text color={themeColors.textMuted}>Search: </Text>\n {fullLogSearchMode ? (\n <Box borderStyle=\"round\" borderColor={themeColors.primary} paddingX={1}>\n <TextInput\n value={fullLogSearchQuery}\n onChange={setFullLogSearchQuery}\n placeholder=\"type to search...\"\n />\n </Box>\n ) : (\n <Text color={fullLogSearchQuery ? themeColors.text : themeColors.textMuted}>\n [{fullLogSearchQuery || 'none'}]\n </Text>\n )}\n <Text color={themeColors.textMuted}> [/]</Text>\n </Box>\n </Box>\n\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"single\"\n borderColor={themeColors.muted}\n borderTop={false}\n borderBottom={false}\n paddingX={1}\n >\n {fullLogDisplayedLogs.map((log) => (\n <FullLogEntryRow \n key={log.id} \n log={log} \n maxWidth={terminalWidth - 4}\n searchQuery={fullLogSearchQuery}\n highlightSearch={highlightSearch}\n themeColors={themeColors}\n />\n ))}\n </Box>\n\n <Box\n borderStyle=\"single\"\n borderColor={themeColors.muted}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box>\n <Shortcut letter=\"l\" label=\"dashboard\" color={themeColors.primary} />\n <Shortcut letter=\"/\" label=\"search\" color={themeColors.primary} />\n <Shortcut letter=\"f\" label={`filter: ${filterMode}`} color={themeColors.primary} />\n <Shortcut letter=\"b\" label=\"browser\" color={themeColors.primary} />\n <Shortcut letter=\"q\" label=\"quit\" color={themeColors.primary} />\n </Box>\n <Text color={themeColors.textMuted}>\n {fullLogScrollOffset + 1}-{Math.min(fullLogScrollOffset + fullLogVisibleLines, fullLogFilteredLogs.length)}/{fullLogFilteredLogs.length}\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Theme Selector overlay\n if (view === 'themeSelector') {\n return (\n <Box flexDirection=\"column\" height={terminalHeight} width={terminalWidth}>\n <Banner />\n \n {/* Centered theme selector box */}\n <Box flexGrow={1} justifyContent=\"center\" alignItems=\"center\">\n <Box\n flexDirection=\"column\"\n borderStyle=\"double\"\n borderColor={themeColors.primary}\n paddingX={3}\n paddingY={1}\n width={40}\n >\n <Box justifyContent=\"center\" marginBottom={1}>\n <Text color={themeColors.primary} bold>Select Theme</Text>\n </Box>\n \n {THEME_ORDER.map((themeName) => {\n const t = THEMES[themeName];\n const isSelected = themeName === previewTheme;\n return (\n <Box key={themeName} paddingY={0}>\n <Text color={isSelected ? t.colors.primary : themeColors.textMuted}>\n {isSelected ? '▸ ' : ' '}\n </Text>\n <Text color={isSelected ? t.colors.primary : themeColors.textDim} bold={isSelected}>\n {t.label}\n </Text>\n <Text color={themeColors.textMuted}> - {t.description}</Text>\n </Box>\n );\n })}\n \n <Box marginTop={1} justifyContent=\"center\">\n <Text color={themeColors.textMuted}>\n <Text color={themeColors.primary}>↑↓</Text> navigate \n <Text color={themeColors.primary}> Enter</Text> select \n <Text color={themeColors.primary}> Esc</Text> cancel\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n );\n }\n\n // Help/Menu view\n if (view === 'help') {\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n <Banner />\n <Box flexDirection=\"column\" padding={2}>\n <Text color={themeColors.primary} bold>Help & Keyboard Shortcuts</Text>\n <Text> </Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>Ctrl+T</Text> Change theme</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>b</Text> Open in browser</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>l</Text> Full log view</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>/</Text> Search logs</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>f</Text> Filter by service</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>v</Text> Toggle verbose mode</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>r</Text> Restart services</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>c</Text> Clear logs</Text>\n <Text color={themeColors.textDim}> <Text color={themeColors.primary}>q</Text> Quit</Text>\n <Text> </Text>\n <Text color={themeColors.textMuted}>Current theme: <Text color={themeColors.primary}>{theme.label}</Text></Text>\n <Text> </Text>\n <Text color={themeColors.textMuted}>Press <Text color={themeColors.primary}>Esc</Text> to return to dashboard</Text>\n </Box>\n </Box>\n );\n }\n\n // Check for available update (set by auto-update check in index.ts)\n const updateAvailable = process.env.OPENBUILDER_UPDATE_AVAILABLE;\n\n // Main dashboard view\n return (\n <Box flexDirection=\"column\" height={terminalHeight} width={terminalWidth}>\n <Banner />\n\n {/* Update notification banner */}\n {updateAvailable && (\n <Box justifyContent=\"center\" paddingY={0}>\n <Text color={baseColors.cyan}>⬆ Update available: </Text>\n <Text color={baseColors.success}>{updateAvailable}</Text>\n <Text color={themeColors.textMuted}> — Run </Text>\n <Text color={baseColors.cyan}>openbuilder upgrade</Text>\n <Text color={themeColors.textMuted}> to update</Text>\n </Box>\n )}\n\n <Box\n borderStyle=\"single\"\n borderColor={themeColors.muted}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text color={themeColors.textMuted}>\n Web: <Text color={themeColors.primary}>localhost:{webPort}</Text>\n {' • '}\n Mode: <Text color={themeColors.primary}>Local</Text>\n {' • '}\n Theme: <Text color={themeColors.primary}>{theme.label}</Text>\n </Text>\n <Box>\n <Text color={allServicesRunning ? baseColors.success : baseColors.warning}>\n {allServicesRunning ? symbols.filledDot : symbols.hollowDot}\n </Text>\n <Text color={themeColors.textDim}>\n {' '}{allServicesRunning ? 'All Services Running' : 'Starting...'}\n </Text>\n </Box>\n </Box>\n\n <Box flexGrow={1} height={contentHeight}>\n {showBuildPanel && (\n <BuildPanel\n build={buildState.currentBuild}\n width={buildPanelWidth}\n height={contentHeight}\n />\n )}\n <Box\n flexDirection=\"column\"\n width={logPanelWidth}\n height={contentHeight}\n borderStyle=\"single\"\n borderColor={themeColors.muted}\n paddingX={1}\n >\n <Box justifyContent=\"space-between\" marginBottom={0}>\n <Text color={themeColors.primary} bold>LOGS</Text>\n <Box>\n {serviceFilter && (\n <Text color={themeColors.textMuted}>filter: <Text color={baseColors.warning}>{serviceFilter}</Text> </Text>\n )}\n <Text color={themeColors.textMuted}>\n [verbose: {isVerbose ? 'on' : 'off'}]\n </Text>\n </Box>\n </Box>\n\n <Box flexDirection=\"column\" flexGrow={1}>\n {displayedLogs.length === 0 ? (\n <Box justifyContent=\"center\" alignItems=\"center\" flexGrow={1}>\n <Text color={themeColors.textMuted}>Waiting for logs...</Text>\n </Box>\n ) : (\n displayedLogs.map((log) => (\n <LogEntryRow key={log.id} log={log} maxWidth={logPanelWidth - 4} themeColors={themeColors} />\n ))\n )}\n </Box>\n\n {filteredLogs.length > visibleLines && (\n <Box justifyContent=\"flex-end\">\n <Text color={themeColors.textMuted}>\n {scrollOffset + 1}-{Math.min(scrollOffset + visibleLines, filteredLogs.length)}/{filteredLogs.length}\n {autoScroll ? ' (auto)' : ''}\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n\n <Box\n borderStyle=\"single\"\n borderColor={themeColors.muted}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box>\n <Text color={allServicesRunning ? baseColors.success : baseColors.warning}>\n {allServicesRunning ? symbols.filledDot : symbols.hollowDot}\n </Text>\n <Text color={themeColors.textDim}>\n {' '}{isShuttingDown ? 'Shutting down...' : allServicesRunning ? 'Ready' : 'Starting'}\n </Text>\n </Box>\n \n {searchMode ? (\n <Box>\n <Text color={themeColors.primary}>/</Text>\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n onSubmit={() => setSearchMode(false)}\n placeholder=\"Search... (Enter to apply, Esc to cancel)\"\n />\n </Box>\n ) : (\n <Box>\n <Shortcut letter=\"b\" label=\"browser\" color={themeColors.primary} />\n <Shortcut letter=\"l\" label=\"logs\" color={themeColors.primary} />\n <Shortcut letter=\"/\" label=\"search\" color={themeColors.primary} />\n <Shortcut letter=\"?\" label=\"menu\" color={themeColors.primary} />\n <Shortcut letter=\"q\" label=\"quit\" color={themeColors.primary} />\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n\ninterface ThemeColorsType {\n primary: string;\n secondary: string;\n accent: string;\n muted: string;\n highlight: string;\n border: string;\n text: string;\n textDim: string;\n textMuted: string;\n}\n\nfunction LogEntryRow({ log, maxWidth, themeColors }: { \n log: LogEntry, \n maxWidth: number,\n themeColors: ThemeColorsType\n}) {\n const levelColors = {\n info: themeColors.primary,\n success: baseColors.success,\n warn: baseColors.warning,\n error: baseColors.error,\n };\n\n const levelIcons = {\n info: symbols.filledDot,\n success: symbols.check,\n warn: '⚠',\n error: symbols.cross,\n };\n\n const serviceColor = log.service === 'web' ? themeColors.primary : themeColors.secondary;\n const icon = log.emoji || levelIcons[log.level];\n const color = levelColors[log.level];\n \n // Use displayMessage if available (user-friendly transformed message)\n let displayContent = log.displayMessage || log.content || log.message;\n const availableWidth = maxWidth - 16;\n const truncatedMessage = displayContent.length > availableWidth\n ? displayContent.substring(0, availableWidth - 3) + '...'\n : displayContent;\n\n // Tool calls get special formatting\n if (log.toolName) {\n // If we have a displayMessage, use it (it's already user-friendly)\n if (log.displayMessage) {\n return (\n <Box>\n <Text color={themeColors.textMuted}>{formatTime(log.timestamp)}</Text>\n <Text color={serviceColor}> [{log.service.substring(0, 3)}]</Text>\n <Text color={themeColors.primary}> 🔧 </Text>\n <Text color={themeColors.text}>{log.displayMessage}</Text>\n </Box>\n );\n }\n // Fallback to showing tool name\n return (\n <Box>\n <Text color={themeColors.textMuted}>{formatTime(log.timestamp)}</Text>\n <Text color={serviceColor}> [{log.service.substring(0, 3)}]</Text>\n <Text color={themeColors.primary}> 🔧 </Text>\n <Text color={themeColors.text}>{log.toolName}</Text>\n </Box>\n );\n }\n\n return (\n <Box>\n <Text color={themeColors.textMuted}>{formatTime(log.timestamp)}</Text>\n <Text color={serviceColor}> [{log.service.substring(0, 3)}]</Text>\n <Text color={color}> {icon} </Text>\n <Text color={log.level === 'error' || log.level === 'warn' ? color : themeColors.text}>\n {truncatedMessage}\n </Text>\n </Box>\n );\n}\n\nfunction FullLogEntryRow({ \n log, \n maxWidth, \n searchQuery,\n highlightSearch,\n themeColors\n}: { \n log: LogEntry, \n maxWidth: number,\n searchQuery: string,\n highlightSearch: (text: string, query: string) => React.ReactNode,\n themeColors: ThemeColorsType\n}) {\n const levelColors = {\n info: themeColors.primary,\n success: baseColors.success,\n warn: baseColors.warning,\n error: baseColors.error,\n };\n\n const levelIcons = {\n info: symbols.filledDot,\n success: symbols.check,\n warn: '⚠',\n error: symbols.cross,\n };\n\n const serviceColor = log.service === 'web' ? themeColors.primary : themeColors.secondary;\n const icon = log.emoji || levelIcons[log.level];\n const color = levelColors[log.level];\n\n if (log.toolName) {\n return (\n <Box>\n <Text color={themeColors.textMuted}>{formatTime(log.timestamp)}</Text>\n <Text color={serviceColor}> [{log.service}]</Text>\n <Text color={themeColors.primary}> 🔧 </Text>\n <Text color={themeColors.text}>{highlightSearch(log.toolName, searchQuery)}</Text>\n {log.content && (\n <Text color={themeColors.textDim}> {highlightSearch(log.content.replace(`tool-input-available: ${log.toolName}`, '').trim(), searchQuery)}</Text>\n )}\n </Box>\n );\n }\n\n return (\n <Box>\n <Text color={themeColors.textMuted}>{formatTime(log.timestamp)}</Text>\n <Text color={serviceColor}> [{log.service}]</Text>\n <Text color={color}> {icon} </Text>\n {log.tag && <Text color={themeColors.textMuted}>[{log.tag}] </Text>}\n <Text color={log.level === 'error' || log.level === 'warn' ? color : themeColors.text}>\n {highlightSearch(log.content || log.message, searchQuery)}\n </Text>\n </Box>\n );\n}\n\nfunction Shortcut({ letter, label, color }: { letter: string; label: string; color: string }) {\n return (\n <Box marginRight={2}>\n <Text color={baseColors.dimGray}>[</Text>\n <Text color={color}>{letter}</Text>\n <Text color={baseColors.dimGray}>]</Text>\n <Text color={baseColors.gray}>{label}</Text>\n </Box>\n );\n}\n","/**\n * Console Interceptor for TUI Mode\n * Intercepts stdout/stderr writes to write to log file\n * Prevents logs from bleeding above the TUI\n */\n\nimport { ServiceManager } from './service-manager.js';\nimport { LogFileManager } from './log-file-manager.js';\n\nexport class ConsoleInterceptor {\n private serviceManager: ServiceManager;\n private logFileManager: LogFileManager;\n private isActive = false;\n private originalStdoutWrite: any;\n private originalStderrWrite: any;\n\n constructor(serviceManager: ServiceManager, logFileManager: LogFileManager) {\n this.serviceManager = serviceManager;\n this.logFileManager = logFileManager;\n\n // Save original stdout/stderr write methods\n // Console methods (log, error, warn, info) all use these under the hood\n this.originalStdoutWrite = process.stdout.write.bind(process.stdout);\n this.originalStderrWrite = process.stderr.write.bind(process.stderr);\n }\n\n /**\n * Start intercepting console output and writing to log file\n * We only intercept stdout/stderr writes since console.* methods call these under the hood\n */\n start(): void {\n if (this.isActive) return;\n this.isActive = true;\n\n // Intercept stdout writes - this catches console.log, console.info, and direct writes\n process.stdout.write = (chunk: any, encoding?: any, callback?: any): boolean => {\n const message = typeof chunk === 'string' ? chunk : chunk.toString();\n\n // ONLY pass through ANSI escape codes (for Ink rendering)\n // Block all other output from reaching the terminal\n if (message.match(/^\\x1b\\[/)) {\n // This is Ink's control sequence - let it through\n return this.originalStdoutWrite(chunk, encoding, callback);\n }\n\n // Everything else: write to log file only (don't show on terminal)\n // Don't trim or filter - write the raw message to preserve formatting\n if (message && message.length > 0) {\n const serviceName = this.detectService(message);\n this.logFileManager.write(serviceName, message.trim(), 'stdout');\n }\n\n // Report success but don't actually write to terminal\n if (callback) callback();\n return true;\n };\n\n // Intercept stderr writes\n process.stderr.write = (chunk: any, encoding?: any, callback?: any): boolean => {\n const message = typeof chunk === 'string' ? chunk : chunk.toString();\n\n // ONLY pass through ANSI escape codes (for Ink rendering)\n // Block all other output from reaching the terminal\n if (message.match(/^\\x1b\\[/)) {\n // This is Ink's control sequence - let it through\n return this.originalStderrWrite(chunk, encoding, callback);\n }\n\n // Everything else: write to log file only (don't show on terminal)\n // Don't trim or filter - write the raw message to preserve formatting\n if (message && message.length > 0) {\n const serviceName = this.detectService(message);\n this.logFileManager.write(serviceName, message.trim(), 'stderr');\n }\n\n // Report success but don't actually write to terminal\n if (callback) callback();\n return true;\n };\n }\n\n /**\n * Get the log file path (null if logging is disabled)\n */\n getLogFilePath(): string | null {\n return this.logFileManager.getLogFilePath();\n }\n\n /**\n * Stop intercepting and restore original stdout/stderr\n */\n stop(): void {\n if (!this.isActive) return;\n this.isActive = false;\n\n // Restore stdout/stderr - this also restores console.* methods since they use these\n process.stdout.write = this.originalStdoutWrite;\n process.stderr.write = this.originalStderrWrite;\n\n // Stop log file writing\n this.logFileManager.stop();\n }\n\n /**\n * Detect which service the log is from based on content\n */\n private detectService(message: string): 'web' | 'broker' | 'runner' {\n const lower = message.toLowerCase();\n\n // Check for explicit service tags\n if (message.startsWith('[web]')) return 'web';\n if (message.startsWith('[broker]')) return 'broker';\n if (message.startsWith('[runner]') || message.startsWith('[build]') || message.startsWith('[orchestrator]') || message.startsWith('[engine]')) {\n return 'runner';\n }\n\n // Infer from content\n if (lower.includes('broker') || lower.includes('websocket')) return 'broker';\n if (lower.includes('next.js') || lower.includes('compiled') || lower.includes('ready in')) return 'web';\n\n // Default to runner (most console.log calls come from runner)\n return 'runner';\n }\n}\n","/**\n * Log File Manager\n * Writes logs to a file for TUI to read periodically\n * Creates a new log file each time the service starts\n */\n\nimport { createWriteStream, WriteStream, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport class LogFileManager {\n private logFile: string | null = null;\n private writeStream: WriteStream | null = null;\n\n constructor() {\n // Create logs directory if it doesn't exist\n const logsDir = join(process.cwd(), 'logs');\n if (!existsSync(logsDir)) {\n mkdirSync(logsDir, { recursive: true });\n }\n\n // Create log file with timestamp\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n this.logFile = join(logsDir, `openbuilder-${timestamp}.log`);\n }\n\n /**\n * Check if logging is enabled (always true now)\n */\n isEnabled(): boolean {\n return true;\n }\n\n /**\n * Start writing to log file\n */\n start(): void {\n if (!this.logFile) return;\n\n this.writeStream = createWriteStream(this.logFile, { flags: 'a' });\n // Write a startup marker\n this.writeStream.write(`[${new Date().toISOString()}] [system] [stdout] === Log file started ===\\n`);\n }\n\n /**\n * Write a log entry to file\n * Format: [timestamp] [service] [stream] message\n */\n write(service: string, message: string, stream: 'stdout' | 'stderr'): void {\n if (!this.writeStream) return;\n\n const timestamp = new Date().toISOString();\n const logLine = `[${timestamp}] [${service}] [${stream}] ${message}\\n`;\n\n this.writeStream.write(logLine, (err) => {\n if (err) {\n // Fallback to console if write fails (but this shouldn't happen often)\n console.error('Failed to write to log file:', err);\n }\n });\n }\n\n /**\n * Get the log file path (null if logging is disabled)\n */\n getLogFilePath(): string | null {\n return this.logFile;\n }\n\n /**\n * Stop writing and close the file stream\n */\n stop(): void {\n if (this.writeStream) {\n this.writeStream.end();\n this.writeStream = null;\n }\n }\n}\n","/**\n * Utility to extract meaningful error messages from build output\n * Works with TypeScript, Next.js, Turbo, and other common build tools\n */\n\n// Patterns that indicate error lines\nconst ERROR_PATTERNS = [\n /error TS\\d+:/i, // TypeScript errors\n /error:/i, // General errors\n /Error:/, // Error messages (case sensitive for JS errors)\n /ERR!/, // npm/pnpm errors\n /failed/i, // Failed messages\n /Cannot find/i, // Module not found\n /Module not found/i, // Webpack/Next.js errors\n /SyntaxError/i, // Syntax errors\n /TypeError/i, // Type errors\n /ReferenceError/i, // Reference errors\n /ENOENT/i, // File not found\n /EACCES/i, // Permission errors\n /✖|✗|×/, // Error symbols\n /Type '.+' is not assignable/i, // TypeScript type errors\n /Property '.+' does not exist/i, // TypeScript property errors\n /has no exported member/i, // Export errors\n /Unexpected token/i, // Parse errors\n];\n\n// Patterns that indicate we should stop collecting (success or unrelated output)\nconst STOP_PATTERNS = [\n /successfully/i,\n /completed/i,\n /✓|✔/, // Success symbols\n /Build succeeded/i,\n];\n\n/**\n * Extract the most relevant error lines from build output\n * @param output Combined stdout and stderr from build process\n * @param maxLines Maximum number of lines to return (default: 15)\n * @returns Array of relevant error lines\n */\nexport function extractBuildErrors(output: string, maxLines: number = 15): string[] {\n if (!output || !output.trim()) {\n return [];\n }\n\n const allLines = output.trim().split('\\n');\n const relevantLines: string[] = [];\n let inErrorBlock = false;\n let emptyLineCount = 0;\n\n for (let i = 0; i < allLines.length; i++) {\n const line = allLines[i];\n const trimmedLine = line.trim();\n \n // Check if this line matches an error pattern\n const isErrorLine = ERROR_PATTERNS.some(pattern => pattern.test(line));\n \n // Check if we should stop collecting\n const shouldStop = STOP_PATTERNS.some(pattern => pattern.test(line));\n \n if (shouldStop && inErrorBlock) {\n // Don't stop immediately - there might be more errors after a success message\n inErrorBlock = false;\n emptyLineCount = 0;\n continue;\n }\n\n if (isErrorLine) {\n inErrorBlock = true;\n emptyLineCount = 0;\n \n // Include 1-2 lines before for context if we're starting a new error block\n if (relevantLines.length === 0 || !relevantLines[relevantLines.length - 1]) {\n // Add file path context if the previous line looks like a file reference\n if (i > 0) {\n const prevLine = allLines[i - 1].trim();\n // File paths often contain '/' or '\\' and end with line numbers like :10:5\n if (prevLine && (prevLine.includes('/') || prevLine.includes('\\\\') || /:\\d+:\\d+/.test(prevLine))) {\n if (!relevantLines.includes(prevLine)) {\n relevantLines.push(prevLine);\n }\n }\n }\n }\n }\n\n if (inErrorBlock) {\n // Track empty lines - stop after 2 consecutive empty lines\n if (trimmedLine === '') {\n emptyLineCount++;\n if (emptyLineCount >= 2) {\n inErrorBlock = false;\n emptyLineCount = 0;\n continue;\n }\n } else {\n emptyLineCount = 0;\n }\n\n // Don't add duplicate lines\n if (!relevantLines.includes(trimmedLine) || trimmedLine === '') {\n relevantLines.push(trimmedLine);\n }\n\n // Stop if we've collected enough\n if (relevantLines.length >= maxLines) {\n break;\n }\n }\n }\n\n // If we didn't find specific error patterns, fall back to last N lines\n if (relevantLines.length === 0) {\n return allLines\n .slice(-10)\n .map(line => line.trim())\n .filter(line => line.length > 0);\n }\n\n // Clean up: remove trailing empty lines\n while (relevantLines.length > 0 && relevantLines[relevantLines.length - 1] === '') {\n relevantLines.pop();\n }\n\n // Truncate very long lines but keep enough context\n return relevantLines.map(line => {\n if (line.length > 150) {\n return line.substring(0, 147) + '...';\n }\n return line;\n });\n}\n\n/**\n * Format extracted errors for display\n * @param errors Array of error lines\n * @param indent Indentation string (default: ' ')\n * @returns Formatted string ready for console output\n */\nexport function formatBuildErrors(errors: string[], indent: string = ' '): string {\n if (errors.length === 0) {\n return '';\n }\n\n const separator = '─'.repeat(60);\n const lines = [\n 'Build errors:',\n separator,\n ...errors.map(line => `${indent}${line}`),\n separator,\n '',\n ];\n\n return lines.join('\\n');\n}\n","/**\n * Start command with TUI dashboard support\n * Provides beautiful real-time monitoring of all services\n */\n\nimport { existsSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { render } from 'ink';\nimport React from 'react';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { configManager } from '../utils/config-manager.js';\nimport { isInsideMonorepo } from '../utils/repo-detector.js';\nimport { killProcessOnPort } from '../utils/process-killer.js';\nimport { CLIError, errors } from '../utils/cli-error.js';\nimport { ServiceManager } from '../ui/service-manager.js';\nimport { Dashboard } from '../ui/Dashboard.js';\nimport { ConsoleInterceptor } from '../ui/console-interceptor.js';\nimport { LogFileManager } from '../ui/log-file-manager.js';\nimport { initRunnerLogger } from '../../lib/logging/index.js';\nimport { setFileLoggerTuiMode } from '../../lib/file-logger.js';\nimport { extractBuildErrors } from '../utils/build-error-extractor.js';\n\ninterface StartOptions {\n port?: string;\n noTui?: boolean; // Disable TUI, use traditional logs\n dev?: boolean; // Use development mode (hot reload)\n rebuild?: boolean; // Rebuild services before starting\n local?: boolean; // Enable local mode (default: true, use --no-local to disable)\n verbose?: boolean; // Enable verbose logging\n}\n\n/**\n * Check if we should use TUI\n */\nfunction shouldUseTUI(options: StartOptions): boolean {\n // Explicit flag\n if (options.noTui) return false;\n\n // CI/CD environments\n if (process.env.CI === '1' || process.env.CI === 'true') return false;\n\n // Not a TTY\n if (!process.stdout.isTTY) return false;\n\n // Explicit env var to disable\n if (process.env.NO_TUI === '1') return false;\n\n return true;\n}\n\nexport async function startCommand(options: StartOptions) {\n const useTUI = shouldUseTUI(options);\n\n // If TUI is disabled, use the traditional start command\n if (!useTUI) {\n const { startCommand: traditionalStart } = await import('./start-traditional.js');\n return traditionalStart(options);\n }\n\n // ========================================\n // TUI MODE\n // ========================================\n\n const s = p.spinner();\n\n // Step 1: Find monorepo\n s.start('Locating OpenBuilder repository');\n\n let monorepoRoot: string | undefined;\n const config = configManager.get();\n\n if (config.monorepoPath && existsSync(config.monorepoPath)) {\n monorepoRoot = config.monorepoPath;\n }\n\n if (!monorepoRoot) {\n const repoCheck = await isInsideMonorepo();\n if (repoCheck.inside && repoCheck.root) {\n monorepoRoot = repoCheck.root;\n configManager.set('monorepoPath', monorepoRoot);\n }\n }\n\n if (!monorepoRoot) {\n s.stop(pc.red('✗') + ' Repository not found');\n throw errors.monorepoNotFound([\n config.monorepoPath || 'none',\n process.cwd(),\n ]);\n }\n\n s.stop(pc.green('✓') + ' Repository found');\n\n // Step 2: Check dependencies\n const nodeModulesPath = join(monorepoRoot, 'node_modules');\n\n if (!existsSync(nodeModulesPath)) {\n s.start('Installing dependencies');\n const { installDependencies } = await import('../utils/repo-cloner.js');\n await installDependencies(monorepoRoot);\n s.stop(pc.green('✓') + ' Dependencies installed');\n }\n\n // Step 2.5: Check for production build (unless --dev mode)\n const nextBuildIdPath = join(monorepoRoot, 'apps', 'openbuilder', '.next', 'BUILD_ID');\n const needsProductionBuild = !options.dev && !existsSync(nextBuildIdPath);\n\n // Rebuild services if requested OR if production build is missing\n if (options.rebuild || needsProductionBuild) {\n const buildReason = options.rebuild \n ? 'Rebuilding services' \n : 'Building for production (first run)';\n s.start(buildReason);\n const { spawn } = await import('child_process');\n\n // Capture build output for error reporting\n let buildOutput = '';\n let buildError = '';\n\n try {\n // Use turbo to build all services with caching\n await new Promise<void>((resolve, reject) => {\n const buildProcess = spawn('pnpm', ['build:all'], {\n cwd: monorepoRoot,\n stdio: 'pipe', // Capture output\n });\n\n buildProcess.stdout?.on('data', (data: Buffer) => {\n buildOutput += data.toString();\n });\n\n buildProcess.stderr?.on('data', (data: Buffer) => {\n buildError += data.toString();\n });\n\n buildProcess.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Build failed with code ${code}`));\n }\n });\n\n buildProcess.on('error', reject);\n });\n\n s.stop(pc.green('✓') + ' Build complete (using Turborepo cache)');\n } catch (error) {\n s.stop(pc.red('✗') + ' Build failed');\n \n // Extract meaningful error lines from build output\n const allOutput = (buildOutput + '\\n' + buildError).trim();\n const errorLines = extractBuildErrors(allOutput);\n \n const suggestions = [\n 'Check that all dependencies are installed',\n 'Try running: pnpm build:all',\n 'Run with --dev flag to skip build and use dev mode',\n ];\n \n // Add error context if available\n if (errorLines.length > 0) {\n console.log(pc.red('\\nBuild errors:'));\n console.log(pc.gray('─'.repeat(60)));\n errorLines.forEach(line => console.log(pc.red(` ${line}`)));\n console.log(pc.gray('─'.repeat(60)));\n console.log('');\n }\n \n throw new CLIError({\n code: 'BUILD_FAILED',\n message: 'Failed to build services',\n suggestions,\n });\n }\n }\n\n // Step 3: Check database configuration\n if (!config.databaseUrl) {\n throw new CLIError({\n code: 'MISSING_REQUIRED_CONFIG',\n message: 'Database URL not configured',\n suggestions: [\n 'Run initialization: openbuilder init',\n 'Or set manually: openbuilder config set databaseUrl <url>',\n ],\n docs: 'https://github.com/codyde/openbuilder#database-setup',\n });\n }\n\n // Step 4: Clean up zombie processes\n const webPort = Number(options.port || '3000');\n\n s.start('Checking for port conflicts');\n await killProcessOnPort(webPort);\n s.stop(pc.green('✓') + ' Ports available');\n\n // Step 5: Create ServiceManager, LogFileManager, and Console Interceptor FIRST\n const serviceManager = new ServiceManager();\n const logFileManager = new LogFileManager();\n logFileManager.start(); // Start log file writing immediately\n const consoleInterceptor = new ConsoleInterceptor(serviceManager, logFileManager);\n\n // Start intercepting IMMEDIATELY before anything else can print\n consoleInterceptor.start();\n\n const sharedSecret = configManager.getSecret() || 'dev-secret';\n\n // Hook up service manager output to log file (for child process logs)\n serviceManager.on('service:output', (name, output, stream) => {\n logFileManager.write(name, output.trim(), stream);\n });\n\n // Keep silent mode for TUI, logs go to file\n process.env.SILENT_MODE = '1';\n\n // Clear screen for clean TUI start\n console.clear();\n\n // Register web app (now handles runner WebSocket connections directly)\n // Default to production mode unless --dev flag is present\n const webCommand = options.dev ? 'dev' : 'start';\n \n // Local mode is enabled by default, can be disabled with --no-local\n const isLocalMode = options.local !== false;\n \n // Write .env.local file to ensure env vars are available to Next.js\n // This is necessary because env vars passed to spawn() may not be visible\n // to Next.js server components in production mode\n const envLocalPath = join(monorepoRoot, 'apps', 'openbuilder', '.env.local');\n const envContent = [\n '# Auto-generated by openbuilder CLI - DO NOT EDIT',\n `# Generated at: ${new Date().toISOString()}`,\n '',\n `OPENBUILDER_LOCAL_MODE=${isLocalMode ? 'true' : 'false'}`,\n `RUNNER_SHARED_SECRET=${sharedSecret}`,\n `WORKSPACE_ROOT=${config.workspace}`,\n `RUNNER_ID=${config.runner?.id || 'local'}`,\n `RUNNER_DEFAULT_ID=${config.runner?.id || 'local'}`,\n `DATABASE_URL=${config.databaseUrl || ''}`,\n '',\n ].join('\\n');\n \n writeFileSync(envLocalPath, envContent);\n \n // Build environment variables for the web app\n const webEnv: Record<string, string> = {\n PORT: String(webPort),\n RUNNER_SHARED_SECRET: sharedSecret,\n WORKSPACE_ROOT: config.workspace,\n RUNNER_ID: config.runner?.id || 'local',\n RUNNER_DEFAULT_ID: config.runner?.id || 'local',\n DATABASE_URL: config.databaseUrl,\n // Enable local mode - bypasses authentication requirements (default: true)\n OPENBUILDER_LOCAL_MODE: isLocalMode ? 'true' : 'false',\n };\n \n serviceManager.register({\n name: 'web',\n displayName: 'Web App',\n port: webPort,\n command: 'pnpm',\n args: ['--filter', 'openbuilder', webCommand],\n cwd: monorepoRoot,\n env: webEnv,\n });\n\n // Register runner (special handling - not spawned, imported directly)\n serviceManager.register({\n name: 'runner',\n displayName: 'Runner',\n command: 'internal', // Not actually spawned\n args: [],\n cwd: monorepoRoot,\n env: {},\n });\n\n // Step 6: Clear screen and move cursor to home before TUI renders\n // Use ANSI codes that will pass through our interceptor\n process.stdout.write('\\x1b[2J\\x1b[H'); // Clear screen + move cursor to top-left\n\n // Ensure stdin is in raw mode for keyboard input\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n\n // Track runner cleanup function and shutting down state\n let isShuttingDown = false;\n let runnerCleanupFn: (() => Promise<void>) | undefined;\n\n // Add backup SIGINT handler for Ctrl+C (in case Ink's doesn't fire)\n const handleSigInt = async () => {\n if (isShuttingDown) {\n // Force exit if already shutting down\n process.exit(1);\n }\n isShuttingDown = true;\n\n console.log('\\n⚠ Received Ctrl+C, stopping services...');\n\n // Stop runner first if cleanup function exists\n if (runnerCleanupFn) {\n await runnerCleanupFn().catch(() => {});\n }\n\n // Then stop other services\n await serviceManager.stopAll().catch(() => {});\n consoleInterceptor.stop();\n process.exit(0);\n };\n\n process.on('SIGINT', handleSigInt);\n\n // One final clear right before rendering\n process.stdout.write('\\x1b[2J\\x1b[H');\n\n // Enable alternate screen buffer to prevent scrolling above TUI\n process.stdout.write('\\x1b[?1049h'); // Enter alternate screen\n process.stdout.write('\\x1b[2J\\x1b[H'); // Clear and home\n\n // Initialize the RunnerLogger BEFORE rendering TUI so the TUI can subscribe to build events\n // This must happen before startRunner() which would create its own logger\n initRunnerLogger({\n verbose: options.verbose || false,\n tuiMode: true,\n });\n \n // Enable TUI mode in file-logger to suppress terminal output\n setFileLoggerTuiMode(true);\n\n // Render TUI immediately with log file path\n const { waitUntilExit, clear } = render(\n React.createElement(Dashboard, {\n serviceManager,\n apiUrl: `http://localhost:${webPort}`,\n webPort,\n logFilePath: consoleInterceptor.getLogFilePath()\n }),\n {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n exitOnCtrlC: true,\n patchConsole: false // Don't let Ink patch console since we already intercept\n }\n );\n\n // Step 7: Start services\n try {\n // Start web app (runner will be started separately)\n await serviceManager.start('web');\n await new Promise(resolve => setTimeout(resolve, 3000)); // Wait for WebSocket server to initialize\n\n // Mark runner as starting\n const runnerService = serviceManager['services'].get('runner');\n if (runnerService) {\n runnerService.state.status = 'starting';\n runnerService.startTime = Date.now();\n serviceManager.emit('service:status-change', 'runner', 'starting');\n }\n\n // Start runner directly (this blocks until shutdown)\n const { startRunner } = await import('../../index.js');\n\n // Mark as running\n if (runnerService) {\n runnerService.state.status = 'running';\n serviceManager.emit('service:status-change', 'runner', 'running');\n }\n\n // Start runner and get cleanup function - connects directly to Next.js WebSocket\n runnerCleanupFn = await startRunner({\n wsUrl: `ws://localhost:${webPort}/ws/runner`,\n sharedSecret: sharedSecret,\n runnerId: config.runner?.id || 'local',\n workspace: config.workspace,\n silent: false, // Changed to false - show all logs\n verbose: options.verbose,\n tuiMode: true, // TUI mode enabled\n });\n\n // Wait for TUI to exit\n await waitUntilExit();\n\n // Stop console interception and restore normal console\n consoleInterceptor.stop();\n\n // Clear TUI immediately\n clear();\n\n // Exit alternate screen buffer\n process.stdout.write('\\x1b[?1049l');\n\n // Show shutdown message\n console.log();\n console.log(pc.yellow('⚠'), 'Stopping all services...');\n\n // Stop all services with timeout\n const shutdownPromise = Promise.race([\n (async () => {\n // Close any active tunnels first (give it 1s)\n await serviceManager.closeTunnel('web').catch(() => {});\n\n // Stop spawned services (web, broker)\n await serviceManager.stopAll();\n console.log(pc.green('✓'), 'Services stopped');\n\n // Stop runner explicitly using cleanup function\n if (runnerCleanupFn) {\n console.log(pc.yellow('⚠'), 'Stopping runner...');\n await runnerCleanupFn();\n console.log(pc.green('✓'), 'Runner stopped');\n }\n\n console.log(pc.green('✓'), 'All services stopped');\n })(),\n new Promise((resolve) => setTimeout(() => {\n console.log(pc.yellow('⚠'), 'Shutdown timeout - forcing exit');\n resolve(undefined);\n }, 5000)) // Increased from 3s to 5s to allow tunnel cleanup\n ]);\n\n await shutdownPromise;\n\n // Force exit to ensure we return to prompt\n process.exit(0);\n } catch (error) {\n // Stop console interception on error\n consoleInterceptor.stop();\n clear();\n // Exit alternate screen buffer\n process.stdout.write('\\x1b[?1049l');\n throw error;\n }\n}\n"],"names":["_jsx","_jsxs","useState","useMemo","useEffect"],"mappings":"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"}
|