@openbuilder/cli 0.50.24 → 0.50.27
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/{auto-update-Cr7SnKwX.js → auto-update-Dq2PFvjt.js} +12 -46
- package/dist/chunks/auto-update-Dq2PFvjt.js.map +1 -0
- package/dist/chunks/{main-tui-C-BqvY5r.js → main-tui-CDEiflqI.js} +2 -2
- package/dist/chunks/{main-tui-C-BqvY5r.js.map → main-tui-CDEiflqI.js.map} +1 -1
- package/dist/chunks/{run-BbtmU1EJ.js → run-Di8CGWtT.js} +2 -2
- package/dist/chunks/run-Di8CGWtT.js.map +1 -0
- package/dist/cli/index.js +5 -5
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/auto-update-Cr7SnKwX.js.map +0 -1
- package/dist/chunks/run-BbtmU1EJ.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-Di8CGWtT.js","sources":["../../src/cli/tui/components/LogPanel.tsx","../../src/cli/tui/components/StatusBar.tsx","../../src/cli/tui/components/FullLogView.tsx","../../src/cli/tui/components/CopyMenu.tsx","../../src/cli/tui/screens/RunnerDashboard.tsx","../../src/cli/commands/run.ts"],"sourcesContent":["/**\n * LogPanel - Right panel showing scrollable log entries\n * Takes up 80% of width, shows:\n * - Timestamped log entries\n * - Tool calls with truncated args\n * - Scrollable with keyboard navigation\n */\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\nimport type { LogEntry } from '../../../lib/logging/types.js';\n\ninterface LogPanelProps {\n entries: LogEntry[];\n isVerbose: boolean;\n width: number;\n height: number;\n isFocused: boolean;\n}\n\nexport function LogPanel({ entries, isVerbose, width, height, isFocused }: LogPanelProps) {\n const [scrollOffset, setScrollOffset] = useState(0);\n const [autoScroll, setAutoScroll] = useState(true);\n\n // Filter entries based on verbose mode\n const visibleEntries = isVerbose \n ? entries \n : entries.filter(e => !e.verbose);\n\n // Available height for log lines (subtract 2 for border, 1 for header)\n const visibleLines = Math.max(1, height - 3);\n\n // Auto-scroll when new entries arrive\n useEffect(() => {\n if (autoScroll && visibleEntries.length > 0) {\n const maxScroll = Math.max(0, visibleEntries.length - visibleLines);\n setScrollOffset(maxScroll);\n }\n }, [visibleEntries.length, autoScroll, visibleLines]);\n\n // Handle keyboard navigation\n useInput((input, key) => {\n if (!isFocused) return;\n\n 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, visibleEntries.length - visibleLines);\n setScrollOffset(prev => Math.min(maxScroll, prev + 1));\n // Re-enable auto-scroll if we're at the bottom\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, visibleEntries.length - visibleLines);\n setScrollOffset(prev => Math.min(maxScroll, prev + visibleLines));\n }\n });\n\n // Get visible slice of entries\n const displayedEntries = visibleEntries.slice(scrollOffset, scrollOffset + visibleLines);\n\n // Format time\n const formatTime = (timestamp: number): string => {\n return new Date(timestamp).toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n };\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n height={height}\n borderStyle=\"single\"\n borderColor={isFocused ? colors.cyan : colors.darkGray}\n paddingX={1}\n >\n {/* Header */}\n <Box justifyContent=\"space-between\" marginBottom={0}>\n <Text color={colors.cyan} bold>LOGS</Text>\n <Text color={colors.dimGray}>\n [verbose: {isVerbose ? 'on' : 'off'}]\n </Text>\n </Box>\n\n {/* Log entries */}\n <Box flexDirection=\"column\" flexGrow={1}>\n {displayedEntries.length === 0 ? (\n <Box justifyContent=\"center\" alignItems=\"center\" flexGrow={1}>\n <Text color={colors.dimGray}>Waiting for logs...</Text>\n </Box>\n ) : (\n displayedEntries.map((entry, index) => (\n <LogEntryRow \n key={entry.id} \n entry={entry} \n maxWidth={width - 4}\n />\n ))\n )}\n </Box>\n\n {/* Scroll indicator */}\n {visibleEntries.length > visibleLines && (\n <Box justifyContent=\"flex-end\">\n <Text color={colors.dimGray}>\n {scrollOffset + 1}-{Math.min(scrollOffset + visibleLines, visibleEntries.length)}/{visibleEntries.length}\n {autoScroll ? ' (auto)' : ''}\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n\n// Individual log entry row\nfunction LogEntryRow({ entry, maxWidth }: { entry: LogEntry; maxWidth: number }) {\n const time = new Date(entry.timestamp).toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n\n const levelColors = {\n debug: colors.dimGray,\n info: colors.cyan,\n success: colors.success,\n warn: colors.warning,\n error: colors.error,\n };\n\n const levelIcons = {\n debug: ' ',\n info: '●',\n success: '✓',\n warn: '⚠',\n error: '✗',\n };\n\n // Tool calls get special formatting\n if (entry.toolName) {\n const argsText = entry.toolArgs ? ` ${entry.toolArgs}` : '';\n const fullText = `${entry.toolName}${argsText}`;\n const truncated = fullText.length > maxWidth - 12 \n ? fullText.substring(0, maxWidth - 15) + '...'\n : fullText;\n\n return (\n <Box>\n <Text color={colors.dimGray}>{time}</Text>\n <Text color={colors.cyan}> 🔧 </Text>\n <Text color={colors.white}>{entry.toolName}</Text>\n {entry.toolArgs && <Text color={colors.gray}> {entry.toolArgs}</Text>}\n </Box>\n );\n }\n\n // Regular log entries\n const color = levelColors[entry.level];\n const icon = levelIcons[entry.level];\n \n // Truncate message if needed\n const availableWidth = maxWidth - 12; // time + space + icon + space\n const truncatedMessage = entry.message.length > availableWidth\n ? entry.message.substring(0, availableWidth - 3) + '...'\n : entry.message;\n\n return (\n <Box>\n <Text color={colors.dimGray}>{time}</Text>\n <Text color={color}> {icon} </Text>\n <Text color={color}>{truncatedMessage}</Text>\n </Box>\n );\n}\n","/**\n * StatusBar - Bottom bar showing connection status and keyboard shortcuts\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport { colors } from '../theme.js';\nimport { getVersionInfo } from '../../utils/version-info.js';\n\ninterface StatusBarProps {\n isConnected: boolean;\n isVerbose: boolean;\n buildCount?: number;\n currentBuildIndex?: number;\n view: 'dashboard' | 'fullLog' | 'copyMenu';\n}\n\nexport function StatusBar({\n isConnected,\n isVerbose,\n buildCount = 0,\n currentBuildIndex = 0,\n view,\n}: StatusBarProps) {\n // Get version info\n const versionInfo = getVersionInfo();\n \n // Connection indicator\n const connectionIndicator = (\n <Box marginRight={2}>\n <Text color={isConnected ? colors.success : colors.error}>\n {isConnected ? '●' : '○'}\n </Text>\n <Text color={colors.gray}>\n {' '}{isConnected ? 'Connected' : 'Disconnected'}\n </Text>\n </Box>\n );\n\n // Build count indicator (only show if multiple builds)\n const buildIndicator = buildCount > 1 ? (\n <Box marginRight={2}>\n <Text color={colors.gray}>\n Build {currentBuildIndex + 1}/{buildCount}\n </Text>\n </Box>\n ) : null;\n\n // Shortcuts based on current view\n const shortcuts = view === 'dashboard' ? (\n <Box>\n <Shortcut letter=\"q\" label=\"quit\" />\n <Shortcut letter=\"b\" label=\"browser\" />\n <Shortcut letter=\"v\" label={`verbose: ${isVerbose ? 'on' : 'off'}`} />\n <Shortcut letter=\"c\" label=\"copy\" />\n <Shortcut letter=\"t\" label=\"text view\" />\n {buildCount > 1 && <Shortcut letter=\"n/p\" label=\"switch build\" />}\n <Shortcut letter=\"↑↓\" label=\"scroll\" />\n </Box>\n ) : view === 'fullLog' ? (\n <Box>\n <Shortcut letter=\"t\" label=\"dashboard\" />\n <Shortcut letter=\"c\" label=\"copy\" />\n <Shortcut letter=\"/\" label=\"search\" />\n <Shortcut letter=\"f\" label=\"filter\" />\n <Shortcut letter=\"↑↓\" label=\"scroll\" />\n <Shortcut letter=\"PgUp/Dn\" label=\"page\" />\n </Box>\n ) : (\n <Box>\n <Shortcut letter=\"Esc\" label=\"cancel\" />\n </Box>\n );\n\n // Version display\n const versionDisplay = (\n <Box marginLeft={2}>\n <Text color={colors.dimGray}>\n {versionInfo.display}\n </Text>\n </Box>\n );\n\n return (\n <Box\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box>\n {connectionIndicator}\n {buildIndicator}\n </Box>\n <Box>\n {shortcuts}\n {versionDisplay}\n </Box>\n </Box>\n );\n}\n\n// Helper component for shortcuts\nfunction Shortcut({ letter, label }: { letter: string; label: string }) {\n return (\n <Box marginRight={2}>\n <Text color={colors.dimGray}>[</Text>\n <Text color={colors.cyan}>{letter}</Text>\n <Text color={colors.dimGray}>]</Text>\n <Text color={colors.gray}>{label}</Text>\n </Box>\n );\n}\n","/**\n * FullLogView - Full-screen log view with search and filter\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { colors } from '../theme.js';\nimport type { LogEntry, LogLevel } from '../../../lib/logging/types.js';\n\ntype FilterMode = 'all' | 'errors' | 'tools' | 'verbose';\n\ninterface FullLogViewProps {\n entries: LogEntry[];\n onBack: () => void;\n onCopy: () => void;\n}\n\nexport function FullLogView({ entries, onBack, onCopy }: FullLogViewProps) {\n const { stdout } = useStdout();\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n\n const [searchQuery, setSearchQuery] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n const [filterMode, setFilterMode] = useState<FilterMode>('all');\n const [scrollOffset, setScrollOffset] = useState(0);\n const [searchMode, setSearchMode] = useState<'filter' | 'highlight'>('highlight');\n\n // Available height for log lines\n const headerHeight = 3;\n const footerHeight = 2;\n const visibleLines = Math.max(1, terminalHeight - headerHeight - footerHeight);\n\n // Filter and search entries\n const processedEntries = entries.filter(entry => {\n // Apply filter mode\n if (filterMode === 'errors' && entry.level !== 'error' && entry.level !== 'warn') {\n return false;\n }\n if (filterMode === 'tools' && !entry.toolName) {\n return false;\n }\n if (filterMode !== 'verbose' && entry.verbose) {\n return false;\n }\n\n // Apply search filter (if in filter mode)\n if (searchQuery && searchMode === 'filter') {\n const query = searchQuery.toLowerCase();\n const messageMatch = entry.message.toLowerCase().includes(query);\n const toolMatch = entry.toolName?.toLowerCase().includes(query);\n const argsMatch = entry.toolArgs?.toLowerCase().includes(query);\n return messageMatch || toolMatch || argsMatch;\n }\n\n return true;\n });\n\n // Calculate max scroll\n const maxScroll = Math.max(0, processedEntries.length - visibleLines);\n\n // Get visible entries\n const visibleEntries = processedEntries.slice(scrollOffset, scrollOffset + visibleLines);\n\n // Handle keyboard input\n useInput((input, key) => {\n if (isSearching) {\n if (key.escape || key.return) {\n setIsSearching(false);\n }\n return;\n }\n\n if (input === 't') {\n onBack();\n } else if (input === 'c') {\n onCopy();\n } else if (input === '/') {\n setIsSearching(true);\n } else if (input === 'f') {\n // Cycle through filter modes\n const modes: FilterMode[] = ['all', 'errors', 'tools', 'verbose'];\n const currentIndex = modes.indexOf(filterMode);\n setFilterMode(modes[(currentIndex + 1) % modes.length]);\n setScrollOffset(0);\n } else if (input === 'm') {\n // Toggle search mode\n setSearchMode(prev => prev === 'filter' ? 'highlight' : 'filter');\n } else if (key.upArrow) {\n setScrollOffset(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setScrollOffset(prev => Math.min(maxScroll, prev + 1));\n } else if (key.pageUp) {\n setScrollOffset(prev => Math.max(0, prev - visibleLines));\n } else if (key.pageDown) {\n setScrollOffset(prev => Math.min(maxScroll, prev + visibleLines));\n } else if (key.escape) {\n if (searchQuery) {\n setSearchQuery('');\n } else {\n onBack();\n }\n }\n });\n\n // Format time\n const formatTime = (timestamp: number): string => {\n return new Date(timestamp).toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n };\n\n // Check if text matches search query\n const highlightSearch = (text: string): React.ReactNode => {\n if (!searchQuery || searchMode !== 'highlight') {\n return text;\n }\n\n const query = searchQuery.toLowerCase();\n const index = text.toLowerCase().indexOf(query);\n if (index === -1) {\n return text;\n }\n\n return (\n <>\n {text.slice(0, index)}\n <Text backgroundColor={colors.warning} color=\"black\">\n {text.slice(index, index + searchQuery.length)}\n </Text>\n {text.slice(index + searchQuery.length)}\n </>\n );\n };\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n {/* Header with search */}\n <Box\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text color={colors.cyan} bold>LOGS</Text>\n <Box>\n <Text color={colors.dimGray}>Search: </Text>\n {isSearching ? (\n <Box borderStyle=\"round\" borderColor={colors.cyan} paddingX={1}>\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder=\"type to search...\"\n />\n </Box>\n ) : (\n <Text color={searchQuery ? colors.white : colors.dimGray}>\n [{searchQuery || 'none'}] ({searchMode})\n </Text>\n )}\n <Text color={colors.dimGray}> [/]</Text>\n </Box>\n </Box>\n\n {/* Log content */}\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n borderTop={false}\n borderBottom={false}\n paddingX={1}\n >\n {visibleEntries.map((entry, index) => {\n const time = formatTime(entry.timestamp);\n const levelColors = {\n debug: colors.dimGray,\n info: colors.cyan,\n success: colors.success,\n warn: colors.warning,\n error: colors.error,\n };\n const levelIcons = {\n debug: ' ',\n info: '●',\n success: '✓',\n warn: '⚠',\n error: '✗',\n };\n\n if (entry.toolName) {\n return (\n <Box key={entry.id}>\n <Text color={colors.dimGray}>{time}</Text>\n <Text color={colors.cyan}> 🔧 </Text>\n <Text color={colors.white}>{highlightSearch(entry.toolName)}</Text>\n {entry.toolArgs && (\n <Text color={colors.gray}> {highlightSearch(entry.toolArgs)}</Text>\n )}\n </Box>\n );\n }\n\n return (\n <Box key={entry.id}>\n <Text color={colors.dimGray}>{time}</Text>\n <Text color={levelColors[entry.level]}> {levelIcons[entry.level]} </Text>\n <Text color={levelColors[entry.level]}>{highlightSearch(entry.message)}</Text>\n </Box>\n );\n })}\n </Box>\n\n {/* Footer with shortcuts and scroll position */}\n <Box\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box>\n <Shortcut letter=\"t\" label=\"dashboard\" />\n <Shortcut letter=\"c\" label=\"copy\" />\n <Shortcut letter=\"/\" label=\"search\" />\n <Shortcut letter=\"f\" label={`filter: ${filterMode}`} />\n <Shortcut letter=\"m\" label={`mode: ${searchMode}`} />\n </Box>\n <Text color={colors.dimGray}>\n {scrollOffset + 1}-{Math.min(scrollOffset + visibleLines, processedEntries.length)}/{processedEntries.length}\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction Shortcut({ letter, label }: { letter: string; label: string }) {\n return (\n <Box marginRight={2}>\n <Text color={colors.dimGray}>[</Text>\n <Text color={colors.cyan}>{letter}</Text>\n <Text color={colors.dimGray}>]</Text>\n <Text color={colors.gray}>{label}</Text>\n </Box>\n );\n}\n","/**\n * CopyMenu - Modal for copying logs to clipboard\n */\n\nimport React from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\n\ninterface CopyMenuProps {\n onSelect: (option: 'visible' | 'last50' | 'last100' | 'all' | 'range') => void;\n onCancel: () => void;\n visibleCount: number;\n totalCount: number;\n}\n\nexport function CopyMenu({ onSelect, onCancel, visibleCount, totalCount }: CopyMenuProps) {\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n } else if (input === '1') {\n onSelect('visible');\n } else if (input === '2') {\n onSelect('last50');\n } else if (input === '3') {\n onSelect('last100');\n } else if (input === '4') {\n onSelect('all');\n } else if (input === '5') {\n onSelect('range');\n }\n });\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={colors.cyan}\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text color={colors.cyan} bold>Copy Logs</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <CopyOption number=\"1\" label={`Copy visible (${visibleCount} lines)`} />\n <CopyOption number=\"2\" label=\"Copy last 50 lines\" />\n <CopyOption number=\"3\" label=\"Copy last 100 lines\" />\n <CopyOption number=\"4\" label={`Copy all from file (${totalCount} lines)`} />\n <CopyOption number=\"5\" label=\"Copy range...\" />\n </Box>\n\n <Box>\n <Text color={colors.dimGray}>[Esc] Cancel</Text>\n </Box>\n </Box>\n );\n}\n\nfunction CopyOption({ number, label }: { number: string; label: string }) {\n return (\n <Box>\n <Text color={colors.dimGray}>[</Text>\n <Text color={colors.cyan}>{number}</Text>\n <Text color={colors.dimGray}>]</Text>\n <Text color={colors.white}> {label}</Text>\n </Box>\n );\n}\n","/**\n * RunnerDashboard - Main TUI container for the runner\n * \n * Layout:\n * - 20% left: BuildPanel (current build + todos) - hidden when no build\n * - 80% right: LogPanel (scrollable logs)\n * - Bottom: StatusBar (connection, shortcuts)\n * \n * Views:\n * - dashboard: Main split view\n * - fullLog: Full-screen log view with search\n * - copyMenu: Copy options modal overlay\n */\n\nimport React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Box, Text, useInput, useStdout, useApp } from 'ink';\nimport { colors } from '../theme.js';\nimport { BuildPanel } from '../components/BuildPanel.js';\nimport { LogPanel } from '../components/LogPanel.js';\nimport { StatusBar } from '../components/StatusBar.js';\nimport { FullLogView } from '../components/FullLogView.js';\nimport { CopyMenu } from '../components/CopyMenu.js';\nimport { useBuildState, useLogEntries } from '../hooks/useBuildState.js';\nimport { Banner } from '../components/Banner.js';\nimport type { BuildInfo, TodoItem, LogEntry } from '../../../lib/logging/types.js';\nimport { getLogBuffer } from '../../../lib/logging/log-buffer.js';\nimport { openBrowser } from '../../utils/cli-auth.js';\n\ntype ViewMode = 'dashboard' | 'fullLog' | 'copyMenu';\n\nexport interface RunnerDashboardProps {\n // Initial config (passed from runner)\n config: {\n runnerId: string;\n serverUrl: string;\n workspace: string;\n apiUrl?: string;\n };\n // Event handlers\n onQuit?: () => void;\n}\n\nexport function RunnerDashboard({ config, onQuit }: RunnerDashboardProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n\n // State management\n const [buildState, buildActions] = useBuildState();\n const logEntries = useLogEntries(100);\n const [view, setView] = useState<ViewMode>('dashboard');\n \n // Track if we've opened browser on first connection\n const hasOpenedBrowserRef = useRef(false);\n\n // Get the dashboard URL (use apiUrl if provided, otherwise default to openbuilder.sh)\n const dashboardUrl = config.apiUrl || 'https://openbuilder.sh';\n\n // Open browser handler\n const handleOpenBrowser = useCallback(() => {\n openBrowser(dashboardUrl).catch(() => {\n // Silently fail - user can manually open the URL\n });\n }, [dashboardUrl]);\n\n // Auto-open browser on first successful connection\n useEffect(() => {\n if (buildState.isConnected && !hasOpenedBrowserRef.current) {\n hasOpenedBrowserRef.current = true;\n // Small delay to ensure the TUI is fully rendered before opening browser\n setTimeout(() => {\n handleOpenBrowser();\n }, 500);\n }\n }, [buildState.isConnected, handleOpenBrowser]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // Global quit handler\n if (input === 'q' && view !== 'copyMenu') {\n if (onQuit) {\n onQuit();\n }\n exit();\n return;\n }\n\n // Copy menu is modal - handle separately\n if (view === 'copyMenu') {\n return; // CopyMenu handles its own input\n }\n\n // Dashboard shortcuts\n if (view === 'dashboard') {\n if (input === 'v') {\n buildActions.toggleVerbose();\n } else if (input === 'c') {\n setView('copyMenu');\n } else if (input === 't') {\n setView('fullLog');\n } else if (input === 'n') {\n buildActions.nextBuild();\n } else if (input === 'p') {\n buildActions.prevBuild();\n } else if (input === 'b') {\n handleOpenBrowser();\n }\n }\n\n // Full log view shortcuts\n if (view === 'fullLog') {\n if (input === 't') {\n setView('dashboard');\n } else if (input === 'c') {\n setView('copyMenu');\n }\n }\n });\n\n // Handle copy action\n const handleCopy = useCallback(async (option: 'visible' | 'last50' | 'last100' | 'all' | 'range') => {\n try {\n const buffer = getLogBuffer();\n let entriesToCopy: LogEntry[] = [];\n\n switch (option) {\n case 'visible':\n entriesToCopy = logEntries.slice(-20); // Approximate visible count\n break;\n case 'last50':\n entriesToCopy = buffer.getRecent(50);\n break;\n case 'last100':\n entriesToCopy = buffer.getRecent(100);\n break;\n case 'all':\n entriesToCopy = buffer.readFromFile();\n break;\n case 'range':\n // TODO: Implement range selection\n entriesToCopy = buffer.getRecent(100);\n break;\n }\n\n const text = buffer.toText(entriesToCopy);\n \n // Copy to clipboard using pbcopy on macOS\n const { spawn } = await import('child_process');\n const pbcopy = spawn('pbcopy');\n pbcopy.stdin.write(text);\n pbcopy.stdin.end();\n \n // TODO: Show success message\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n\n setView('dashboard');\n }, [logEntries]);\n\n // Calculate panel dimensions\n const bannerHeight = 7; // ASCII art banner\n const headerHeight = 3; // Config/status line\n const statusBarHeight = 3;\n const contentHeight = Math.max(1, terminalHeight - bannerHeight - headerHeight - statusBarHeight);\n \n // 20/80 split\n const buildPanelWidth = Math.floor(terminalWidth * 0.2);\n const logPanelWidth = terminalWidth - buildPanelWidth;\n\n // Show build panel only when there's an active build\n const showBuildPanel = buildState.currentBuild !== null;\n\n // Check for available update (set by auto-update check in index.ts)\n const updateAvailable = process.env.OPENBUILDER_UPDATE_AVAILABLE;\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight} width={terminalWidth}>\n {/* Banner */}\n <Banner />\n\n {/* Update notification banner */}\n {updateAvailable && (\n <Box justifyContent=\"center\" paddingY={0}>\n <Text color={colors.cyan}>⬆ Update available: </Text>\n <Text color={colors.success}>{updateAvailable}</Text>\n <Text color={colors.dimGray}> — Run </Text>\n <Text color={colors.cyan}>openbuilder upgrade</Text>\n <Text color={colors.dimGray}> to update</Text>\n </Box>\n )}\n\n {/* Header bar with connection status */}\n <Box\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text color={colors.dimGray}>\n Runner: <Text color={colors.cyan}>{config.runnerId}</Text> • Server: <Text color={colors.cyan}>{config.serverUrl.replace(/^wss?:\\/\\//, '')}</Text>\n </Text>\n <Box>\n <Text color={buildState.isConnected ? colors.success : colors.error}>\n {buildState.isConnected ? '●' : '○'}\n </Text>\n <Text color={colors.gray}>\n {' '}{buildState.isConnected ? 'Connected' : 'Disconnected'}\n </Text>\n </Box>\n </Box>\n\n {/* Main content */}\n {view === 'dashboard' && (\n <Box flexGrow={1} height={contentHeight}>\n {showBuildPanel && (\n <BuildPanel\n build={buildState.currentBuild}\n width={buildPanelWidth}\n height={contentHeight}\n />\n )}\n <LogPanel\n entries={logEntries}\n isVerbose={buildState.isVerbose}\n width={showBuildPanel ? logPanelWidth : terminalWidth}\n height={contentHeight}\n isFocused={true}\n />\n </Box>\n )}\n\n {view === 'fullLog' && (\n <FullLogView\n entries={logEntries}\n onBack={() => setView('dashboard')}\n onCopy={() => setView('copyMenu')}\n />\n )}\n\n {/* Copy menu overlay */}\n {view === 'copyMenu' && (\n <Box\n position=\"absolute\"\n flexDirection=\"column\"\n justifyContent=\"center\"\n alignItems=\"center\"\n width={terminalWidth}\n height={terminalHeight}\n >\n <CopyMenu\n onSelect={handleCopy}\n onCancel={() => setView('dashboard')}\n visibleCount={Math.min(20, logEntries.length)}\n totalCount={getLogBuffer().readFromFile().length}\n />\n </Box>\n )}\n\n {/* Status bar (only in dashboard view) */}\n {view === 'dashboard' && (\n <StatusBar\n isConnected={buildState.isConnected}\n isVerbose={buildState.isVerbose}\n buildCount={buildState.builds.length}\n currentBuildIndex={buildState.currentBuildIndex}\n view={view}\n />\n )}\n </Box>\n );\n}\n\n// Export for external use\nexport { useBuildState, useLogEntries };\n","import chalk from 'chalk';\nimport { homedir, userInfo } from 'node:os';\nimport { join } from 'node:path';\nimport { render } from 'ink';\nimport React from 'react';\nimport { logger } from '../utils/logger.js';\nimport { configManager } from '../utils/config-manager.js';\nimport { startRunner } from '../../index.js';\nimport { RunnerDashboard } from '../tui/screens/RunnerDashboard.js';\nimport { initRunnerLogger } from '../../lib/logging/index.js';\nimport { setFileLoggerTuiMode } from '../../lib/file-logger.js';\nimport { \n hasStoredToken, \n getStoredToken, \n performOAuthLogin, \n storeToken \n} from '../utils/cli-auth.js';\n\n// Default public OpenBuilder instance\nconst DEFAULT_URL = 'https://openbuilder.sh';\nconst DEFAULT_WORKSPACE = join(homedir(), 'openbuilder-workspace');\n\n/**\n * Normalize URL by adding protocol if missing\n * Uses http:// for localhost, https:// for everything else\n */\nfunction normalizeUrl(url: string): string {\n if (!url) return url;\n\n // If protocol already present, return as-is\n if (url.match(/^https?:\\/\\//i)) {\n return url;\n }\n\n // For localhost or 127.0.0.1, use http://\n if (url.match(/^(localhost|127\\.0\\.0\\.1)(:|\\/|$)/i)) {\n return `http://${url}`;\n }\n\n // For everything else, use https://\n return `https://${url}`;\n}\n\n/**\n * Derive WebSocket URL from a base HTTP/HTTPS URL\n * Converts https://example.com to wss://example.com/ws/runner\n */\nfunction deriveWsUrl(baseUrl: string): string {\n const normalized = normalizeUrl(baseUrl);\n const wsProtocol = normalized.startsWith('https://') ? 'wss://' : 'ws://';\n const hostPath = normalized.replace(/^https?:\\/\\//, '');\n // Remove trailing slash if present\n const cleanHostPath = hostPath.replace(/\\/$/, '');\n return `${wsProtocol}${cleanHostPath}/ws/runner`;\n}\n\n/**\n * Get the current system username\n */\nfunction getSystemUsername(): string {\n try {\n return userInfo().username;\n } catch {\n // Fallback if userInfo() fails\n return process.env.USER || process.env.USERNAME || 'runner';\n }\n}\n\ninterface RunOptions {\n broker?: string; // Legacy: WebSocket URL override (deprecated, use --url instead)\n url?: string;\n workspace?: string;\n runnerId?: string;\n secret?: string;\n verbose?: boolean;\n local?: boolean; // Enable local mode (bypasses authentication)\n noTui?: boolean; // Disable TUI dashboard\n}\n\n/**\n * Check if we should use TUI\n */\nfunction shouldUseTUI(options: RunOptions): 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 runCommand(options: RunOptions) {\n // Set local mode environment variable if requested\n if (options.local) {\n process.env.OPENBUILDER_LOCAL_MODE = 'true';\n logger.info(chalk.yellow('Local mode enabled - authentication bypassed'));\n }\n\n const useTUI = shouldUseTUI(options);\n\n // Build runner options from CLI flags or smart defaults\n // NOTE: For the `runner` command, we intentionally ignore local config values\n // and default to the public OpenBuilder instance. This command is specifically\n // for connecting to remote servers, not local development.\n // Users can still override with CLI flags if needed.\n \n // Resolve API URL: CLI flag > default public instance (ignore config)\n const apiUrl = normalizeUrl(options.url || DEFAULT_URL);\n \n // Resolve WebSocket URL: CLI broker flag > derive from API URL (ignore config)\n const wsUrl = options.broker || deriveWsUrl(apiUrl);\n \n // Resolve workspace: CLI flag > config > default ~/openbuilder-workspace\n // (workspace from config is fine since it's user's preference for where projects go)\n const config = configManager.get();\n const workspace = options.workspace || config.workspace || DEFAULT_WORKSPACE;\n \n // Resolve runner ID: CLI flag > system username (ignore config 'local' default)\n const runnerId = options.runnerId || getSystemUsername();\n \n // Resolve secret: CLI flag > config (required)\n // Only use config secret if it looks like a valid token (starts with sv_)\n // This prevents the default 'dev-secret' from being used in runner mode\n const configSecret = configManager.getSecret();\n const sharedSecret = options.secret || (configSecret?.startsWith('sv_') ? configSecret : undefined);\n\n const runnerOptions = {\n wsUrl,\n apiUrl,\n sharedSecret,\n runnerId,\n workspace,\n verbose: options.verbose,\n tuiMode: useTUI,\n };\n\n // Validate required options - secret is required\n // If not provided, try to use stored OAuth token or trigger OAuth flow\n if (!runnerOptions.sharedSecret) {\n // Check if we have a stored OAuth token\n if (hasStoredToken()) {\n const storedToken = getStoredToken();\n if (storedToken) {\n runnerOptions.sharedSecret = storedToken;\n logger.info(`Using stored runner token: ${chalk.cyan(storedToken.substring(0, 12) + '...')}`);\n }\n }\n \n // If still no secret and not in local mode, trigger OAuth flow\n if (!runnerOptions.sharedSecret && !options.local) {\n logger.info('No runner token found. Starting OAuth authentication...');\n logger.info('');\n \n const result = await performOAuthLogin({\n apiUrl: runnerOptions.apiUrl,\n silent: false,\n });\n \n if (result.success && result.token) {\n storeToken(result.token, runnerOptions.apiUrl);\n runnerOptions.sharedSecret = result.token;\n logger.log('');\n logger.success('Authentication successful!');\n logger.info(`Token: ${chalk.cyan(result.token.substring(0, 12) + '...')}`);\n logger.log('');\n } else {\n logger.error(result.error || 'Authentication failed');\n logger.info('');\n logger.info('You can also provide a token manually:');\n logger.info(` ${chalk.cyan('openbuilder runner --secret <your-secret>')}`);\n logger.info('');\n logger.info('Or login first:');\n logger.info(` ${chalk.cyan('openbuilder login')}`);\n process.exit(1);\n }\n }\n \n // Final check - if still no secret (and not local mode)\n if (!runnerOptions.sharedSecret && !options.local) {\n logger.error('Shared secret is required');\n logger.info('');\n logger.info('Get a runner key from your OpenBuilder dashboard, or provide via:');\n logger.info(` ${chalk.cyan('openbuilder runner --secret <your-secret>')}`);\n logger.info('');\n logger.info('Or login with OAuth:');\n logger.info(` ${chalk.cyan('openbuilder login')}`);\n process.exit(1);\n }\n }\n\n // ========================================\n // PLAIN TEXT MODE (--no-tui)\n // ========================================\n if (!useTUI) {\n // Display startup info\n logger.section('Starting OpenBuilder Runner');\n logger.info(`Server: ${chalk.cyan(runnerOptions.wsUrl)}`);\n logger.info(`API URL: ${chalk.cyan(runnerOptions.apiUrl)}`);\n logger.info(`Runner ID: ${chalk.cyan(runnerOptions.runnerId)}`);\n logger.info(`Workspace: ${chalk.cyan(runnerOptions.workspace)}`);\n logger.log('');\n\n if (options.verbose) {\n logger.debug('Verbose logging enabled');\n logger.debug(`Full options: ${JSON.stringify(runnerOptions, null, 2)}`);\n }\n\n try {\n // Start the runner (runs indefinitely)\n await startRunner(runnerOptions);\n } catch (error) {\n logger.error('Failed to start runner:');\n logger.error(error instanceof Error ? error.message : 'Unknown error');\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack);\n }\n process.exit(1);\n }\n return;\n }\n\n // ========================================\n // TUI MODE (default)\n // ========================================\n \n // Initialize the logger BEFORE rendering TUI so the TUI can subscribe to 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 // Track runner cleanup function\n let runnerCleanupFn: (() => Promise<void>) | undefined;\n\n // Clear screen and enter alternate buffer for clean TUI\n process.stdout.write('\\x1b[?1049h'); // Enter alternate screen\n process.stdout.write('\\x1b[2J\\x1b[H'); // Clear and home\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 // Handle quit from TUI\n const handleQuit = async () => {\n // Exit alternate screen buffer\n process.stdout.write('\\x1b[?1049l');\n \n console.log('\\n' + chalk.yellow('Shutting down runner...'));\n \n if (runnerCleanupFn) {\n try {\n await runnerCleanupFn();\n console.log(chalk.green('✓') + ' Runner stopped');\n } catch (e) {\n console.error(chalk.red('✗') + ' Error stopping runner:', e);\n }\n }\n \n process.exit(0);\n };\n\n // Handle SIGINT (Ctrl+C)\n process.on('SIGINT', handleQuit);\n\n // Render the TUI dashboard\n const { waitUntilExit, clear } = render(\n React.createElement(RunnerDashboard, {\n config: {\n runnerId,\n serverUrl: wsUrl,\n workspace,\n apiUrl,\n },\n onQuit: handleQuit,\n }),\n {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n exitOnCtrlC: false, // We handle this ourselves\n patchConsole: false, // We use our own logging\n }\n );\n\n try {\n // Start the runner and get cleanup function\n runnerCleanupFn = await startRunner(runnerOptions);\n\n // Wait for TUI to exit (user pressed 'q')\n await waitUntilExit();\n\n // Clean up\n clear();\n await handleQuit();\n } catch (error) {\n clear();\n process.stdout.write('\\x1b[?1049l'); // Exit alternate screen\n \n logger.error('Failed to start runner:');\n logger.error(error instanceof Error ? error.message : 'Unknown error');\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack);\n }\n process.exit(1);\n }\n}\n"],"names":["useState","useEffect","_jsxs","_jsx","Shortcut","useRef","useCallback"],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -474,7 +474,7 @@ if (isSilentMode) {
|
|
|
474
474
|
// For version mode: skip entirely - just show version
|
|
475
475
|
let willAutoUpdate = false;
|
|
476
476
|
if (!process.env.OPENBUILDER_SKIP_UPDATE_CHECK && !isVersionCommand) {
|
|
477
|
-
const { checkAndAutoUpdate } = await import('../chunks/auto-update-
|
|
477
|
+
const { checkAndAutoUpdate } = await import('../chunks/auto-update-Dq2PFvjt.js');
|
|
478
478
|
try {
|
|
479
479
|
// Show banner first for non-TUI modes
|
|
480
480
|
if (!isSilentMode) {
|
|
@@ -516,12 +516,12 @@ program
|
|
|
516
516
|
// Default action when no subcommand is provided
|
|
517
517
|
if (options.runner) {
|
|
518
518
|
// Start runner only (legacy flag)
|
|
519
|
-
const { runCommand } = await import('../chunks/run-
|
|
519
|
+
const { runCommand } = await import('../chunks/run-Di8CGWtT.js');
|
|
520
520
|
await runCommand({});
|
|
521
521
|
}
|
|
522
522
|
else {
|
|
523
523
|
// Show TUI main menu
|
|
524
|
-
const { mainTUICommand } = await import('../chunks/main-tui-
|
|
524
|
+
const { mainTUICommand } = await import('../chunks/main-tui-CDEiflqI.js');
|
|
525
525
|
await mainTUICommand();
|
|
526
526
|
}
|
|
527
527
|
}
|
|
@@ -583,7 +583,7 @@ program
|
|
|
583
583
|
program
|
|
584
584
|
.command('runner')
|
|
585
585
|
.description('Start runner only (connect to OpenBuilder server)')
|
|
586
|
-
.option('-u, --url <url>', 'OpenBuilder server URL (default: https://openbuilder.
|
|
586
|
+
.option('-u, --url <url>', 'OpenBuilder server URL (default: https://openbuilder.sh)')
|
|
587
587
|
.option('-w, --workspace <path>', 'Workspace directory (default: ~/openbuilder-workspace)')
|
|
588
588
|
.option('-i, --runner-id <id>', 'Runner identifier (default: system username)')
|
|
589
589
|
.option('-s, --secret <secret>', 'Shared secret for authentication (required)')
|
|
@@ -593,7 +593,7 @@ program
|
|
|
593
593
|
.option('--no-tui', 'Disable TUI dashboard, use plain text logs')
|
|
594
594
|
.action(async (options) => {
|
|
595
595
|
try {
|
|
596
|
-
const { runCommand } = await import('../chunks/run-
|
|
596
|
+
const { runCommand } = await import('../chunks/run-Di8CGWtT.js');
|
|
597
597
|
await runCommand(options);
|
|
598
598
|
}
|
|
599
599
|
catch (error) {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/cli/utils/banner.ts","../../src/cli/utils/error-handler.ts","../../src/cli/utils/shutdown-handler.ts","../../src/cli/index.ts"],"sourcesContent":["/**\n * ASCII art banner for OpenBuilder CLI\n */\n\n// ANSI color codes\nconst colors = {\n reset: '\\x1b[0m',\n purple: '\\x1b[35m',\n brightPurple: '\\x1b[95m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n};\n\n/**\n * Displays the OpenBuilder banner\n */\nexport function displayBanner(): void {\n const banner = `\n${colors.cyan} ██████╗ ██████╗ ███████╗███╗ ██╗${colors.brightPurple}██████╗ ██╗ ██╗██╗██╗ ██████╗ ███████╗██████╗${colors.reset}\n${colors.cyan}██╔═══██╗██╔══██╗██╔════╝████╗ ██║${colors.brightPurple}██╔══██╗██║ ██║██║██║ ██╔══██╗██╔════╝██╔══██╗${colors.reset}\n${colors.cyan}██║ ██║██████╔╝█████╗ ██╔██╗ ██║${colors.brightPurple}██████╔╝██║ ██║██║██║ ██║ ██║█████╗ ██████╔╝${colors.reset}\n${colors.cyan}██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║${colors.brightPurple}██╔══██╗██║ ██║██║██║ ██║ ██║██╔══╝ ██╔══██╗${colors.reset}\n${colors.cyan}╚██████╔╝██║ ███████╗██║ ╚████║${colors.brightPurple}██████╔╝╚██████╔╝██║███████╗██████╔╝███████╗██║ ██║${colors.reset}\n${colors.cyan} ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝${colors.brightPurple}╚═════╝ ╚═════╝ ╚═╝╚══════╝╚═════╝ ╚══════╝╚═╝ ╚═╝${colors.reset}\n`;\n\n console.log(banner);\n}\n\n/**\n * Displays a \"Setup Complete\" celebration banner\n */\nexport function displaySetupComplete(): void {\n const banner = `\n${colors.cyan} ██████╗ ██████╗ ███████╗███╗ ██╗${colors.brightPurple}██████╗ ██╗ ██╗██╗██╗ ██████╗ ███████╗██████╗${colors.reset}\n${colors.cyan}██╔═══██╗██╔══██╗██╔════╝████╗ ██║${colors.brightPurple}██╔══██╗██║ ██║██║██║ ██╔══██╗██╔════╝██╔══██╗${colors.reset}\n${colors.cyan}██║ ██║██████╔╝█████╗ ██╔██╗ ██║${colors.brightPurple}██████╔╝██║ ██║██║██║ ██║ ██║█████╗ ██████╔╝${colors.reset}\n${colors.cyan}██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║${colors.brightPurple}██╔══██╗██║ ██║██║██║ ██║ ██║██╔══╝ ██╔══██╗${colors.reset}\n${colors.cyan}╚██████╔╝██║ ███████╗██║ ╚████║${colors.brightPurple}██████╔╝╚██████╔╝██║███████╗██████╔╝███████╗██║ ██║${colors.reset}\n${colors.cyan} ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝${colors.brightPurple}╚═════╝ ╚═════╝ ╚═╝╚══════╝╚═════╝ ╚══════╝╚═╝ ╚═╝${colors.reset}\n${colors.white} Setup is complete! 🎉${colors.reset}\n`;\n\n console.log(banner);\n}\n","/**\n * Centralized error handling and formatting for CLI\n * Displays errors with context, suggestions, and proper formatting\n */\n\nimport chalk from 'chalk';\nimport { CLIError, ErrorCode } from './cli-error.js';\n\nexport interface ErrorHandlerOptions {\n debug?: boolean;\n exitOnError?: boolean;\n}\n\nexport class CLIErrorHandler {\n private debug: boolean;\n private exitOnError: boolean;\n\n constructor(options: ErrorHandlerOptions = {}) {\n this.debug = options.debug ?? process.env.DEBUG === '1';\n this.exitOnError = options.exitOnError ?? true;\n }\n\n /**\n * Main error handling method\n * Formats and displays error, then exits if fatal\n */\n handle(error: Error | CLIError): void {\n // Convert to CLIError if needed\n const cliError = error instanceof CLIError\n ? error\n : this.convertToCLIError(error);\n\n // Display the error\n this.display(cliError);\n\n // Exit if fatal and exitOnError is enabled\n if (cliError.fatal && this.exitOnError) {\n process.exit(cliError.getExitCode());\n }\n }\n\n /**\n * Display formatted error to console\n */\n private display(error: CLIError): void {\n console.error(); // Empty line for spacing\n\n // Error header\n console.error(chalk.red('✗'), chalk.bold(error.message));\n\n // Error code (in debug mode)\n if (this.debug) {\n console.error(chalk.dim(` Code: ${error.code}`));\n }\n\n // Context information\n if (error.context && Object.keys(error.context).length > 0) {\n console.error();\n console.error(chalk.dim(' Details:'));\n Object.entries(error.context).forEach(([key, value]) => {\n console.error(chalk.dim(` ${key}: ${this.formatValue(value)}`));\n });\n }\n\n // Suggestions\n if (error.suggestions.length > 0) {\n console.error();\n console.error(chalk.yellow(' Try this:'));\n error.suggestions.forEach((suggestion, index) => {\n console.error(chalk.yellow(` ${index + 1}. ${suggestion}`));\n });\n }\n\n // Documentation link\n if (error.docs) {\n console.error();\n console.error(chalk.dim(' Documentation:'), chalk.cyan(error.docs));\n }\n\n // Stack trace (debug mode only)\n if (this.debug && error.stack) {\n console.error();\n console.error(chalk.dim(' Stack trace:'));\n console.error(chalk.dim(error.stack));\n }\n\n // Original error cause (if available)\n if (this.debug && error.cause) {\n console.error();\n console.error(chalk.dim(' Caused by:'));\n console.error(chalk.dim(error.cause.message));\n if (error.cause.stack) {\n console.error(chalk.dim(error.cause.stack));\n }\n }\n\n console.error(); // Empty line for spacing\n }\n\n /**\n * Format context values for display\n */\n private formatValue(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n if (typeof value === 'boolean') return String(value);\n if (value === null || value === undefined) return 'null';\n if (Array.isArray(value)) return value.join(', ');\n return JSON.stringify(value);\n }\n\n /**\n * Convert generic errors to CLIError\n */\n private convertToCLIError(error: Error): CLIError {\n // Try to infer error code from message\n const code = this.inferErrorCode(error);\n\n return new CLIError({\n code,\n message: error.message || 'An unexpected error occurred',\n cause: error,\n suggestions: ['Run with --debug flag for more details'],\n });\n }\n\n /**\n * Infer error code from generic error\n */\n private inferErrorCode(error: Error): ErrorCode {\n const message = error.message.toLowerCase();\n\n if (message.includes('econnrefused') || message.includes('connection refused')) {\n return 'DB_CONNECTION_FAILED';\n }\n if (message.includes('eaddrinuse') || message.includes('address already in use')) {\n return 'PORT_IN_USE';\n }\n if (message.includes('eacces') || message.includes('permission denied')) {\n return 'PERMISSION_DENIED';\n }\n if (message.includes('enoent') || message.includes('no such file')) {\n return 'CONFIG_NOT_FOUND';\n }\n\n return 'UNKNOWN_ERROR';\n }\n\n /**\n * Wrap an async function with error handling\n * Usage: await errorHandler.wrap(() => someAsyncFunction(), 'Description')\n */\n async wrap<T>(\n fn: () => Promise<T>,\n context?: string\n ): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n if (context && error instanceof CLIError) {\n // Create new CLIError with added context (can't modify readonly property)\n const enhancedError = new CLIError({\n code: error.code,\n message: error.message,\n context: { ...error.context, operation: context },\n suggestions: error.suggestions,\n fatal: error.fatal,\n cause: error.cause,\n docs: error.docs,\n });\n this.handle(enhancedError);\n throw enhancedError;\n }\n this.handle(error as Error);\n throw error; // Re-throw for callers that want to handle it\n }\n }\n\n /**\n * Enable or disable debug mode\n */\n setDebug(debug: boolean): void {\n this.debug = debug;\n }\n\n /**\n * Enable or disable exit on error\n */\n setExitOnError(exitOnError: boolean): void {\n this.exitOnError = exitOnError;\n }\n}\n\n/**\n * Global error handler instance\n * Can be configured once and used throughout the CLI\n */\nexport const globalErrorHandler = new CLIErrorHandler();\n\n/**\n * Setup global error handlers for uncaught errors\n */\nexport function setupGlobalErrorHandlers(): void {\n process.on('uncaughtException', (error: Error) => {\n console.error(chalk.red('\\n✗ Uncaught exception:'));\n globalErrorHandler.handle(error);\n });\n\n process.on('unhandledRejection', (reason: unknown) => {\n console.error(chalk.red('\\n✗ Unhandled promise rejection:'));\n const error = reason instanceof Error ? reason : new Error(String(reason));\n globalErrorHandler.handle(error);\n });\n}\n","/**\n * Graceful shutdown handler for CLI\n * Ensures proper cleanup when user presses Ctrl+C or process is terminated\n */\n\nimport chalk from 'chalk';\nimport { ChildProcess } from 'node:child_process';\n\ntype CleanupFunction = () => Promise<void> | void;\n\nexport interface ShutdownHandlerOptions {\n /** Timeout in ms before forcing exit (default: 5000) */\n timeout?: number;\n /** Show shutdown messages (default: true) */\n verbose?: boolean;\n}\n\nexport class ShutdownHandler {\n private cleanupFunctions: CleanupFunction[] = [];\n private childProcesses: ChildProcess[] = [];\n private isShuttingDown = false;\n private timeout: number;\n private verbose: boolean;\n\n constructor(options: ShutdownHandlerOptions = {}) {\n this.timeout = options.timeout ?? 5000;\n this.verbose = options.verbose !== false;\n }\n\n /**\n * Register a cleanup function to run on shutdown\n */\n onShutdown(fn: CleanupFunction): void {\n this.cleanupFunctions.push(fn);\n }\n\n /**\n * Register a child process to kill on shutdown\n */\n registerProcess(process: ChildProcess): void {\n this.childProcesses.push(process);\n }\n\n /**\n * Setup signal handlers for graceful shutdown\n */\n setup(): void {\n // Handle Ctrl+C (SIGINT)\n process.on('SIGINT', () => {\n if (this.verbose) {\n console.log(); // New line after ^C\n console.log(chalk.yellow('⚠'), 'Received interrupt signal (Ctrl+C)');\n }\n this.shutdown('SIGINT');\n });\n\n // Handle termination (SIGTERM)\n process.on('SIGTERM', () => {\n if (this.verbose) {\n console.log(chalk.yellow('⚠'), 'Received termination signal (SIGTERM)');\n }\n this.shutdown('SIGTERM');\n });\n\n // Handle process exit\n process.on('exit', (code) => {\n if (this.verbose && code !== 0) {\n console.log(chalk.red('✗'), `Process exiting with code ${code}`);\n }\n });\n }\n\n /**\n * Execute graceful shutdown\n */\n private async shutdown(signal: string): Promise<void> {\n // Prevent multiple shutdown attempts\n if (this.isShuttingDown) {\n if (this.verbose) {\n console.log(chalk.dim(' Already shutting down...'));\n }\n return;\n }\n\n this.isShuttingDown = true;\n\n if (this.verbose) {\n console.log(chalk.cyan('ℹ'), 'Shutting down gracefully...');\n }\n\n // Set a timeout to force exit if cleanup takes too long\n const forceExitTimeout = setTimeout(() => {\n console.error(chalk.red('✗'), 'Shutdown timeout exceeded, forcing exit');\n process.exit(1);\n }, this.timeout);\n\n try {\n // 1. Kill child processes first\n if (this.childProcesses.length > 0) {\n if (this.verbose) {\n console.log(chalk.dim(' Stopping child processes...'));\n }\n await this.killChildProcesses();\n }\n\n // 2. Run cleanup functions\n if (this.cleanupFunctions.length > 0) {\n if (this.verbose) {\n console.log(chalk.dim(' Running cleanup tasks...'));\n }\n await this.runCleanup();\n }\n\n // 3. Success\n if (this.verbose) {\n console.log(chalk.green('✓'), 'Shutdown complete');\n }\n\n clearTimeout(forceExitTimeout);\n process.exit(0);\n } catch (error) {\n console.error(chalk.red('✗'), 'Error during shutdown:', error);\n clearTimeout(forceExitTimeout);\n process.exit(1);\n }\n }\n\n /**\n * Kill all registered child processes\n */\n private async killChildProcesses(): Promise<void> {\n const killPromises = this.childProcesses.map(async (child) => {\n if (!child.killed && child.pid) {\n try {\n // Try graceful SIGTERM first\n child.kill('SIGTERM');\n\n // Wait up to 2 seconds for graceful shutdown\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n // Force kill if still alive\n if (!child.killed) {\n child.kill('SIGKILL');\n }\n resolve();\n }, 2000);\n\n child.on('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n });\n } catch (error) {\n // Process might already be dead\n if (this.verbose) {\n console.log(chalk.dim(` Could not kill process ${child.pid}`));\n }\n }\n }\n });\n\n await Promise.all(killPromises);\n }\n\n /**\n * Run all cleanup functions\n */\n private async runCleanup(): Promise<void> {\n const cleanupPromises = this.cleanupFunctions.map(async (fn) => {\n try {\n await fn();\n } catch (error) {\n if (this.verbose) {\n console.error(chalk.yellow('⚠'), 'Cleanup function failed:', error);\n }\n }\n });\n\n await Promise.all(cleanupPromises);\n }\n\n /**\n * Manually trigger shutdown (for testing or programmatic use)\n */\n async triggerShutdown(): Promise<void> {\n await this.shutdown('MANUAL');\n }\n\n /**\n * Remove a child process from tracking (e.g., after it exits naturally)\n */\n unregisterProcess(process: ChildProcess): void {\n const index = this.childProcesses.indexOf(process);\n if (index > -1) {\n this.childProcesses.splice(index, 1);\n }\n }\n}\n\n/**\n * Global shutdown handler instance\n */\nexport const globalShutdownHandler = new ShutdownHandler();\n\n/**\n * Helper to setup shutdown handler with common options\n */\nexport function setupShutdownHandler(options?: ShutdownHandlerOptions): ShutdownHandler {\n const handler = new ShutdownHandler(options);\n handler.setup();\n return handler;\n}\n","#!/usr/bin/env node\n// EARLY TUI DETECTION: Set SILENT_MODE before any modules are imported\n// This suppresses console output in TUI mode\n// Must be done before imports because file-logger.ts captures console at load time\n{\n const args = process.argv.slice(2);\n const isRunnerTUI = args[0] === 'runner' && !args.includes('--no-tui');\n const isRunTUI = args[0] === 'run';\n const isInitTUI = args[0] === 'init' && (args.includes('-y') || args.includes('--yes') || args.includes('--non-interactive'));\n const isNoArgsTUI = args.length === 0 || (args.length === 1 && args[0] === '--debug');\n \n if (isRunnerTUI || isRunTUI || isInitTUI || isNoArgsTUI) {\n process.env.SILENT_MODE = '1';\n }\n}\n\n// IMPORTANT: Ensure vendor packages are extracted before any imports\n// pnpm postinstall doesn't always run reliably for global installs from URLs\n//\n// NOTE: @openbuilder/agent-core is bundled directly into dist/ by tsup,\n// so we don't need to check for it. But vendor packages (Sentry, etc.) still\n// need to be installed from the vendor/ tarballs.\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join, dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { execFileSync } from 'node:child_process';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Find the package root by looking for package.json\n// This works regardless of where the bundled code ends up (dist/, dist/cli/, etc.)\nfunction findPackageRoot(startDir: string): string {\n let dir = startDir;\n for (let i = 0; i < 5; i++) { // Max 5 levels up\n if (existsSync(join(dir, 'package.json'))) {\n return dir;\n }\n const parent = dirname(dir);\n if (parent === dir) break; // Reached filesystem root\n dir = parent;\n }\n return startDir; // Fallback to start dir\n}\n\nconst packageRoot = findPackageRoot(__dirname);\n\n// Check if running in development mode (linked via pnpm/npm link)\n// Skip vendor install if we're in the monorepo - dependencies are handled by pnpm\nconst isLinkedDevelopment = packageRoot.includes('/openbuilder/apps/runner');\n\n// Only run vendor install for production global installs\nif (!isLinkedDevelopment) {\n // Check if Sentry packages are missing and extract from vendor if needed\n // (agent-core is bundled by tsup, but Sentry packages come from vendor tarballs)\n const nodeModulesDir = dirname(packageRoot); // Go up from package to node_modules/@openbuilder\n const sentryNodePath = join(nodeModulesDir, \"..\", \"@sentry\", \"node\");\n\n if (!existsSync(sentryNodePath)) {\n // Silently initialize vendor packages in background\n try {\n const installScript = join(packageRoot, \"scripts/install-vendor.js\");\n execFileSync(\"node\", [installScript], {\n cwd: packageRoot,\n stdio: \"pipe\" // Silent mode - output only shown if VERBOSE=1\n });\n } catch (error) {\n console.error(\"Failed to initialize vendor packages:\", error);\n process.exit(1);\n }\n }\n}\n\n// Sentry instrumentation is loaded via --import flag in bin/openbuilder.js wrapper\n// This ensures instrumentation happens before any ESM module resolution\n\nimport { Command } from 'commander';\nimport { displayBanner } from './utils/banner.js';\nimport { setupGlobalErrorHandlers, globalErrorHandler } from './utils/error-handler.js';\nimport { setupShutdownHandler } from './utils/shutdown-handler.js';\n\n// Get package.json for version info\nconst packageJson = JSON.parse(\n readFileSync(join(packageRoot, 'package.json'), 'utf-8')\n);\n\n// Setup global error handlers for uncaught errors\nsetupGlobalErrorHandlers();\n\n// Setup graceful shutdown handlers for Ctrl+C\nexport const shutdownHandler = setupShutdownHandler({\n timeout: 5000,\n verbose: true,\n});\n\n// Check if we're running in TUI mode or version mode - skip banner if so\nconst args = process.argv.slice(2);\nconst isInitWithYes = args[0] === 'init' && (args.includes('-y') || args.includes('--yes') || args.includes('--non-interactive'));\nconst isNoArgs = args.length === 0 || (args.length === 1 && args[0] === '--debug');\nconst isRunCommand = args[0] === 'run'; // `openbuilder run` uses TUI Dashboard\nconst isRunnerCommand = args[0] === 'runner' && !args.includes('--no-tui'); // `openbuilder runner` uses TUI Dashboard (unless --no-tui)\nconst isVersionCommand = args.includes('--version') || args.includes('-V'); // Skip banner for version output\nconst isSkipBanner = process.env.OPENBUILDER_SKIP_BANNER === '1'; // Skip banner after auto-update restart\nconst isTUIMode = isInitWithYes || isNoArgs || isRunCommand || isRunnerCommand;\nconst isSilentMode = isTUIMode || isVersionCommand || isSkipBanner;\n\n// Set SILENT_MODE for TUI/version to suppress all console output from other modules\n// This must be set early, before modules that use console.log are imported\nif (isSilentMode) {\n process.env.SILENT_MODE = '1';\n}\n\n// Auto-update check - do this BEFORE displaying banner to avoid double banners\n// All modes (TUI and CLI): full auto-update with restart\n// For version mode: skip entirely - just show version\nlet willAutoUpdate = false;\nif (!process.env.OPENBUILDER_SKIP_UPDATE_CHECK && !isVersionCommand) {\n const { checkAndAutoUpdate } = await import('./utils/auto-update.js');\n \n try {\n // Show banner first for non-TUI modes\n if (!isSilentMode) {\n displayBanner();\n }\n \n // Full auto-update for all modes\n const didUpdate = await checkAndAutoUpdate(packageJson.version);\n if (didUpdate) {\n // CLI will be relaunched by auto-update, exit this process\n willAutoUpdate = true;\n process.exit(0);\n }\n } catch {\n // Auto-update failed silently, continue with current version\n }\n} else if (!isSilentMode) {\n // Update check skipped, show banner for CLI mode (but not version mode)\n displayBanner();\n}\n\nconst program = new Command();\n\nprogram\n .name('openbuilder')\n .description('OpenBuilder CLI - AI App Builder')\n .version(packageJson.version)\n .option('--runner', 'Start runner only (connect to remote server)')\n .option('--debug', 'Enable debug mode with verbose error output')\n .hook('preAction', (thisCommand) => {\n // Enable debug mode if --debug flag is present\n const opts = thisCommand.opts();\n if (opts.debug) {\n globalErrorHandler.setDebug(true);\n process.env.DEBUG = '1';\n }\n })\n .action(async (options) => {\n try {\n // Default action when no subcommand is provided\n if (options.runner) {\n // Start runner only (legacy flag)\n const { runCommand } = await import('./commands/run.js');\n await runCommand({});\n } else {\n // Show TUI main menu\n const { mainTUICommand } = await import('./commands/main-tui.js');\n await mainTUICommand();\n }\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\n// Import commands\nprogram\n .command('init')\n .description('Initialize workspace and configuration for local development')\n .option('--workspace <path>', 'Set workspace directory')\n .option('--url <url>', 'Set server URL (default: http://localhost:3000)')\n .option('--secret <secret>', 'Set shared secret')\n .option('--branch <branch>', 'Git branch to clone (default: main)')\n .option('--database [value]', 'Database setup: connection string, or omit to auto-setup Neon in -y mode')\n .option('-y, --yes', 'Accept all defaults (non-interactive mode)')\n .option('--non-interactive', 'Use defaults without prompts (alias for -y)')\n .action(async (options) => {\n try {\n const { initCommand } = await import('./commands/init.js');\n await initCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('run')\n .description('Start the full stack locally (web app + runner)')\n .option('-p, --port <port>', 'Web app port (default: 3000)')\n .option('--dev', 'Use development mode (hot reload, slower startup)')\n .option('--rebuild', 'Rebuild services before starting')\n .option('--no-local', 'Disable local mode (require authentication)')\n .option('--no-tui', 'Disable TUI dashboard, use plain text logs')\n .option('-v, --verbose', 'Enable verbose logging (show debug info)')\n .action(async (options) => {\n try {\n const { startCommand } = await import('./commands/start.js');\n await startCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('build')\n .description('Build all services without starting (useful while app is running)')\n .option('--watch', 'Watch for changes and rebuild automatically')\n .action(async (options) => {\n try {\n const { buildCommand } = await import('./commands/build.js');\n await buildCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('runner')\n .description('Start runner only (connect to OpenBuilder server)')\n .option('-u, --url <url>', 'OpenBuilder server URL (default: https://openbuilder.up.railway.app)')\n .option('-w, --workspace <path>', 'Workspace directory (default: ~/openbuilder-workspace)')\n .option('-i, --runner-id <id>', 'Runner identifier (default: system username)')\n .option('-s, --secret <secret>', 'Shared secret for authentication (required)')\n .option('-b, --broker <url>', 'WebSocket URL override (advanced, inferred from --url)')\n .option('-v, --verbose', 'Enable verbose logging')\n .option('-l, --local', 'Enable local mode (bypasses authentication)')\n .option('--no-tui', 'Disable TUI dashboard, use plain text logs')\n .action(async (options) => {\n try {\n const { runCommand } = await import('./commands/run.js');\n await runCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\n\nprogram\n .command('config <action> [key] [value]')\n .description('Manage configuration (actions: get, set, list, path, validate, reset)')\n .action(async (action, key, value) => {\n try {\n const { configCommand } = await import('./commands/config.js');\n await configCommand(action, key, value);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\n// Alias for config validate\nprogram\n .command('verify')\n .description('Verify configuration is valid (alias for config validate)')\n .action(async () => {\n try {\n const { configCommand } = await import('./commands/config.js');\n await configCommand('validate');\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('status')\n .description('Show runner status and configuration')\n .action(async () => {\n try {\n const { statusCommand } = await import('./commands/status.js');\n await statusCommand();\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('cleanup')\n .description('Clean up projects and resources')\n .option('--project <slug>', 'Delete specific project')\n .option('--all', 'Clean all projects in workspace')\n .option('--tunnels', 'Close all active tunnels')\n .option('--processes', 'Kill all dev servers')\n .action(async (options) => {\n try {\n const { cleanupCommand } = await import('./commands/cleanup.js');\n await cleanupCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('database')\n .alias('db')\n .description('Set up a new database and initialize schema')\n .action(async () => {\n try {\n const { databaseCommand } = await import('./commands/database.js');\n await databaseCommand();\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('upgrade')\n .description('Upgrade to latest version (preserves configuration)')\n .option('--branch <branch>', 'Upgrade to specific branch (default: main)')\n .option('--force', 'Skip safety checks (uncommitted changes)')\n .action(async (options) => {\n try {\n const { upgradeCommand } = await import('./commands/upgrade.js');\n await upgradeCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('login')\n .description('Authenticate with OpenBuilder via OAuth (GitHub/Sentry)')\n .option('-u, --url <url>', 'OpenBuilder server URL (default: https://openbuilder.sh)')\n .option('-f, --force', 'Force re-authentication even if already logged in')\n .action(async (options) => {\n try {\n const { loginCommand } = await import('./commands/login.js');\n await loginCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('logout')\n .description('Clear stored authentication credentials')\n .action(async () => {\n try {\n const { logoutCommand } = await import('./commands/logout.js');\n await logoutCommand();\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram.parse();"],"names":["__filename","__dirname"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/cli/utils/banner.ts","../../src/cli/utils/error-handler.ts","../../src/cli/utils/shutdown-handler.ts","../../src/cli/index.ts"],"sourcesContent":["/**\n * ASCII art banner for OpenBuilder CLI\n */\n\n// ANSI color codes\nconst colors = {\n reset: '\\x1b[0m',\n purple: '\\x1b[35m',\n brightPurple: '\\x1b[95m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n};\n\n/**\n * Displays the OpenBuilder banner\n */\nexport function displayBanner(): void {\n const banner = `\n${colors.cyan} ██████╗ ██████╗ ███████╗███╗ ██╗${colors.brightPurple}██████╗ ██╗ ██╗██╗██╗ ██████╗ ███████╗██████╗${colors.reset}\n${colors.cyan}██╔═══██╗██╔══██╗██╔════╝████╗ ██║${colors.brightPurple}██╔══██╗██║ ██║██║██║ ██╔══██╗██╔════╝██╔══██╗${colors.reset}\n${colors.cyan}██║ ██║██████╔╝█████╗ ██╔██╗ ██║${colors.brightPurple}██████╔╝██║ ██║██║██║ ██║ ██║█████╗ ██████╔╝${colors.reset}\n${colors.cyan}██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║${colors.brightPurple}██╔══██╗██║ ██║██║██║ ██║ ██║██╔══╝ ██╔══██╗${colors.reset}\n${colors.cyan}╚██████╔╝██║ ███████╗██║ ╚████║${colors.brightPurple}██████╔╝╚██████╔╝██║███████╗██████╔╝███████╗██║ ██║${colors.reset}\n${colors.cyan} ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝${colors.brightPurple}╚═════╝ ╚═════╝ ╚═╝╚══════╝╚═════╝ ╚══════╝╚═╝ ╚═╝${colors.reset}\n`;\n\n console.log(banner);\n}\n\n/**\n * Displays a \"Setup Complete\" celebration banner\n */\nexport function displaySetupComplete(): void {\n const banner = `\n${colors.cyan} ██████╗ ██████╗ ███████╗███╗ ██╗${colors.brightPurple}██████╗ ██╗ ██╗██╗██╗ ██████╗ ███████╗██████╗${colors.reset}\n${colors.cyan}██╔═══██╗██╔══██╗██╔════╝████╗ ██║${colors.brightPurple}██╔══██╗██║ ██║██║██║ ██╔══██╗██╔════╝██╔══██╗${colors.reset}\n${colors.cyan}██║ ██║██████╔╝█████╗ ██╔██╗ ██║${colors.brightPurple}██████╔╝██║ ██║██║██║ ██║ ██║█████╗ ██████╔╝${colors.reset}\n${colors.cyan}██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║${colors.brightPurple}██╔══██╗██║ ██║██║██║ ██║ ██║██╔══╝ ██╔══██╗${colors.reset}\n${colors.cyan}╚██████╔╝██║ ███████╗██║ ╚████║${colors.brightPurple}██████╔╝╚██████╔╝██║███████╗██████╔╝███████╗██║ ██║${colors.reset}\n${colors.cyan} ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝${colors.brightPurple}╚═════╝ ╚═════╝ ╚═╝╚══════╝╚═════╝ ╚══════╝╚═╝ ╚═╝${colors.reset}\n${colors.white} Setup is complete! 🎉${colors.reset}\n`;\n\n console.log(banner);\n}\n","/**\n * Centralized error handling and formatting for CLI\n * Displays errors with context, suggestions, and proper formatting\n */\n\nimport chalk from 'chalk';\nimport { CLIError, ErrorCode } from './cli-error.js';\n\nexport interface ErrorHandlerOptions {\n debug?: boolean;\n exitOnError?: boolean;\n}\n\nexport class CLIErrorHandler {\n private debug: boolean;\n private exitOnError: boolean;\n\n constructor(options: ErrorHandlerOptions = {}) {\n this.debug = options.debug ?? process.env.DEBUG === '1';\n this.exitOnError = options.exitOnError ?? true;\n }\n\n /**\n * Main error handling method\n * Formats and displays error, then exits if fatal\n */\n handle(error: Error | CLIError): void {\n // Convert to CLIError if needed\n const cliError = error instanceof CLIError\n ? error\n : this.convertToCLIError(error);\n\n // Display the error\n this.display(cliError);\n\n // Exit if fatal and exitOnError is enabled\n if (cliError.fatal && this.exitOnError) {\n process.exit(cliError.getExitCode());\n }\n }\n\n /**\n * Display formatted error to console\n */\n private display(error: CLIError): void {\n console.error(); // Empty line for spacing\n\n // Error header\n console.error(chalk.red('✗'), chalk.bold(error.message));\n\n // Error code (in debug mode)\n if (this.debug) {\n console.error(chalk.dim(` Code: ${error.code}`));\n }\n\n // Context information\n if (error.context && Object.keys(error.context).length > 0) {\n console.error();\n console.error(chalk.dim(' Details:'));\n Object.entries(error.context).forEach(([key, value]) => {\n console.error(chalk.dim(` ${key}: ${this.formatValue(value)}`));\n });\n }\n\n // Suggestions\n if (error.suggestions.length > 0) {\n console.error();\n console.error(chalk.yellow(' Try this:'));\n error.suggestions.forEach((suggestion, index) => {\n console.error(chalk.yellow(` ${index + 1}. ${suggestion}`));\n });\n }\n\n // Documentation link\n if (error.docs) {\n console.error();\n console.error(chalk.dim(' Documentation:'), chalk.cyan(error.docs));\n }\n\n // Stack trace (debug mode only)\n if (this.debug && error.stack) {\n console.error();\n console.error(chalk.dim(' Stack trace:'));\n console.error(chalk.dim(error.stack));\n }\n\n // Original error cause (if available)\n if (this.debug && error.cause) {\n console.error();\n console.error(chalk.dim(' Caused by:'));\n console.error(chalk.dim(error.cause.message));\n if (error.cause.stack) {\n console.error(chalk.dim(error.cause.stack));\n }\n }\n\n console.error(); // Empty line for spacing\n }\n\n /**\n * Format context values for display\n */\n private formatValue(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n if (typeof value === 'boolean') return String(value);\n if (value === null || value === undefined) return 'null';\n if (Array.isArray(value)) return value.join(', ');\n return JSON.stringify(value);\n }\n\n /**\n * Convert generic errors to CLIError\n */\n private convertToCLIError(error: Error): CLIError {\n // Try to infer error code from message\n const code = this.inferErrorCode(error);\n\n return new CLIError({\n code,\n message: error.message || 'An unexpected error occurred',\n cause: error,\n suggestions: ['Run with --debug flag for more details'],\n });\n }\n\n /**\n * Infer error code from generic error\n */\n private inferErrorCode(error: Error): ErrorCode {\n const message = error.message.toLowerCase();\n\n if (message.includes('econnrefused') || message.includes('connection refused')) {\n return 'DB_CONNECTION_FAILED';\n }\n if (message.includes('eaddrinuse') || message.includes('address already in use')) {\n return 'PORT_IN_USE';\n }\n if (message.includes('eacces') || message.includes('permission denied')) {\n return 'PERMISSION_DENIED';\n }\n if (message.includes('enoent') || message.includes('no such file')) {\n return 'CONFIG_NOT_FOUND';\n }\n\n return 'UNKNOWN_ERROR';\n }\n\n /**\n * Wrap an async function with error handling\n * Usage: await errorHandler.wrap(() => someAsyncFunction(), 'Description')\n */\n async wrap<T>(\n fn: () => Promise<T>,\n context?: string\n ): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n if (context && error instanceof CLIError) {\n // Create new CLIError with added context (can't modify readonly property)\n const enhancedError = new CLIError({\n code: error.code,\n message: error.message,\n context: { ...error.context, operation: context },\n suggestions: error.suggestions,\n fatal: error.fatal,\n cause: error.cause,\n docs: error.docs,\n });\n this.handle(enhancedError);\n throw enhancedError;\n }\n this.handle(error as Error);\n throw error; // Re-throw for callers that want to handle it\n }\n }\n\n /**\n * Enable or disable debug mode\n */\n setDebug(debug: boolean): void {\n this.debug = debug;\n }\n\n /**\n * Enable or disable exit on error\n */\n setExitOnError(exitOnError: boolean): void {\n this.exitOnError = exitOnError;\n }\n}\n\n/**\n * Global error handler instance\n * Can be configured once and used throughout the CLI\n */\nexport const globalErrorHandler = new CLIErrorHandler();\n\n/**\n * Setup global error handlers for uncaught errors\n */\nexport function setupGlobalErrorHandlers(): void {\n process.on('uncaughtException', (error: Error) => {\n console.error(chalk.red('\\n✗ Uncaught exception:'));\n globalErrorHandler.handle(error);\n });\n\n process.on('unhandledRejection', (reason: unknown) => {\n console.error(chalk.red('\\n✗ Unhandled promise rejection:'));\n const error = reason instanceof Error ? reason : new Error(String(reason));\n globalErrorHandler.handle(error);\n });\n}\n","/**\n * Graceful shutdown handler for CLI\n * Ensures proper cleanup when user presses Ctrl+C or process is terminated\n */\n\nimport chalk from 'chalk';\nimport { ChildProcess } from 'node:child_process';\n\ntype CleanupFunction = () => Promise<void> | void;\n\nexport interface ShutdownHandlerOptions {\n /** Timeout in ms before forcing exit (default: 5000) */\n timeout?: number;\n /** Show shutdown messages (default: true) */\n verbose?: boolean;\n}\n\nexport class ShutdownHandler {\n private cleanupFunctions: CleanupFunction[] = [];\n private childProcesses: ChildProcess[] = [];\n private isShuttingDown = false;\n private timeout: number;\n private verbose: boolean;\n\n constructor(options: ShutdownHandlerOptions = {}) {\n this.timeout = options.timeout ?? 5000;\n this.verbose = options.verbose !== false;\n }\n\n /**\n * Register a cleanup function to run on shutdown\n */\n onShutdown(fn: CleanupFunction): void {\n this.cleanupFunctions.push(fn);\n }\n\n /**\n * Register a child process to kill on shutdown\n */\n registerProcess(process: ChildProcess): void {\n this.childProcesses.push(process);\n }\n\n /**\n * Setup signal handlers for graceful shutdown\n */\n setup(): void {\n // Handle Ctrl+C (SIGINT)\n process.on('SIGINT', () => {\n if (this.verbose) {\n console.log(); // New line after ^C\n console.log(chalk.yellow('⚠'), 'Received interrupt signal (Ctrl+C)');\n }\n this.shutdown('SIGINT');\n });\n\n // Handle termination (SIGTERM)\n process.on('SIGTERM', () => {\n if (this.verbose) {\n console.log(chalk.yellow('⚠'), 'Received termination signal (SIGTERM)');\n }\n this.shutdown('SIGTERM');\n });\n\n // Handle process exit\n process.on('exit', (code) => {\n if (this.verbose && code !== 0) {\n console.log(chalk.red('✗'), `Process exiting with code ${code}`);\n }\n });\n }\n\n /**\n * Execute graceful shutdown\n */\n private async shutdown(signal: string): Promise<void> {\n // Prevent multiple shutdown attempts\n if (this.isShuttingDown) {\n if (this.verbose) {\n console.log(chalk.dim(' Already shutting down...'));\n }\n return;\n }\n\n this.isShuttingDown = true;\n\n if (this.verbose) {\n console.log(chalk.cyan('ℹ'), 'Shutting down gracefully...');\n }\n\n // Set a timeout to force exit if cleanup takes too long\n const forceExitTimeout = setTimeout(() => {\n console.error(chalk.red('✗'), 'Shutdown timeout exceeded, forcing exit');\n process.exit(1);\n }, this.timeout);\n\n try {\n // 1. Kill child processes first\n if (this.childProcesses.length > 0) {\n if (this.verbose) {\n console.log(chalk.dim(' Stopping child processes...'));\n }\n await this.killChildProcesses();\n }\n\n // 2. Run cleanup functions\n if (this.cleanupFunctions.length > 0) {\n if (this.verbose) {\n console.log(chalk.dim(' Running cleanup tasks...'));\n }\n await this.runCleanup();\n }\n\n // 3. Success\n if (this.verbose) {\n console.log(chalk.green('✓'), 'Shutdown complete');\n }\n\n clearTimeout(forceExitTimeout);\n process.exit(0);\n } catch (error) {\n console.error(chalk.red('✗'), 'Error during shutdown:', error);\n clearTimeout(forceExitTimeout);\n process.exit(1);\n }\n }\n\n /**\n * Kill all registered child processes\n */\n private async killChildProcesses(): Promise<void> {\n const killPromises = this.childProcesses.map(async (child) => {\n if (!child.killed && child.pid) {\n try {\n // Try graceful SIGTERM first\n child.kill('SIGTERM');\n\n // Wait up to 2 seconds for graceful shutdown\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n // Force kill if still alive\n if (!child.killed) {\n child.kill('SIGKILL');\n }\n resolve();\n }, 2000);\n\n child.on('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n });\n } catch (error) {\n // Process might already be dead\n if (this.verbose) {\n console.log(chalk.dim(` Could not kill process ${child.pid}`));\n }\n }\n }\n });\n\n await Promise.all(killPromises);\n }\n\n /**\n * Run all cleanup functions\n */\n private async runCleanup(): Promise<void> {\n const cleanupPromises = this.cleanupFunctions.map(async (fn) => {\n try {\n await fn();\n } catch (error) {\n if (this.verbose) {\n console.error(chalk.yellow('⚠'), 'Cleanup function failed:', error);\n }\n }\n });\n\n await Promise.all(cleanupPromises);\n }\n\n /**\n * Manually trigger shutdown (for testing or programmatic use)\n */\n async triggerShutdown(): Promise<void> {\n await this.shutdown('MANUAL');\n }\n\n /**\n * Remove a child process from tracking (e.g., after it exits naturally)\n */\n unregisterProcess(process: ChildProcess): void {\n const index = this.childProcesses.indexOf(process);\n if (index > -1) {\n this.childProcesses.splice(index, 1);\n }\n }\n}\n\n/**\n * Global shutdown handler instance\n */\nexport const globalShutdownHandler = new ShutdownHandler();\n\n/**\n * Helper to setup shutdown handler with common options\n */\nexport function setupShutdownHandler(options?: ShutdownHandlerOptions): ShutdownHandler {\n const handler = new ShutdownHandler(options);\n handler.setup();\n return handler;\n}\n","#!/usr/bin/env node\n// EARLY TUI DETECTION: Set SILENT_MODE before any modules are imported\n// This suppresses console output in TUI mode\n// Must be done before imports because file-logger.ts captures console at load time\n{\n const args = process.argv.slice(2);\n const isRunnerTUI = args[0] === 'runner' && !args.includes('--no-tui');\n const isRunTUI = args[0] === 'run';\n const isInitTUI = args[0] === 'init' && (args.includes('-y') || args.includes('--yes') || args.includes('--non-interactive'));\n const isNoArgsTUI = args.length === 0 || (args.length === 1 && args[0] === '--debug');\n \n if (isRunnerTUI || isRunTUI || isInitTUI || isNoArgsTUI) {\n process.env.SILENT_MODE = '1';\n }\n}\n\n// IMPORTANT: Ensure vendor packages are extracted before any imports\n// pnpm postinstall doesn't always run reliably for global installs from URLs\n//\n// NOTE: @openbuilder/agent-core is bundled directly into dist/ by tsup,\n// so we don't need to check for it. But vendor packages (Sentry, etc.) still\n// need to be installed from the vendor/ tarballs.\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join, dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { execFileSync } from 'node:child_process';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Find the package root by looking for package.json\n// This works regardless of where the bundled code ends up (dist/, dist/cli/, etc.)\nfunction findPackageRoot(startDir: string): string {\n let dir = startDir;\n for (let i = 0; i < 5; i++) { // Max 5 levels up\n if (existsSync(join(dir, 'package.json'))) {\n return dir;\n }\n const parent = dirname(dir);\n if (parent === dir) break; // Reached filesystem root\n dir = parent;\n }\n return startDir; // Fallback to start dir\n}\n\nconst packageRoot = findPackageRoot(__dirname);\n\n// Check if running in development mode (linked via pnpm/npm link)\n// Skip vendor install if we're in the monorepo - dependencies are handled by pnpm\nconst isLinkedDevelopment = packageRoot.includes('/openbuilder/apps/runner');\n\n// Only run vendor install for production global installs\nif (!isLinkedDevelopment) {\n // Check if Sentry packages are missing and extract from vendor if needed\n // (agent-core is bundled by tsup, but Sentry packages come from vendor tarballs)\n const nodeModulesDir = dirname(packageRoot); // Go up from package to node_modules/@openbuilder\n const sentryNodePath = join(nodeModulesDir, \"..\", \"@sentry\", \"node\");\n\n if (!existsSync(sentryNodePath)) {\n // Silently initialize vendor packages in background\n try {\n const installScript = join(packageRoot, \"scripts/install-vendor.js\");\n execFileSync(\"node\", [installScript], {\n cwd: packageRoot,\n stdio: \"pipe\" // Silent mode - output only shown if VERBOSE=1\n });\n } catch (error) {\n console.error(\"Failed to initialize vendor packages:\", error);\n process.exit(1);\n }\n }\n}\n\n// Sentry instrumentation is loaded via --import flag in bin/openbuilder.js wrapper\n// This ensures instrumentation happens before any ESM module resolution\n\nimport { Command } from 'commander';\nimport { displayBanner } from './utils/banner.js';\nimport { setupGlobalErrorHandlers, globalErrorHandler } from './utils/error-handler.js';\nimport { setupShutdownHandler } from './utils/shutdown-handler.js';\n\n// Get package.json for version info\nconst packageJson = JSON.parse(\n readFileSync(join(packageRoot, 'package.json'), 'utf-8')\n);\n\n// Setup global error handlers for uncaught errors\nsetupGlobalErrorHandlers();\n\n// Setup graceful shutdown handlers for Ctrl+C\nexport const shutdownHandler = setupShutdownHandler({\n timeout: 5000,\n verbose: true,\n});\n\n// Check if we're running in TUI mode or version mode - skip banner if so\nconst args = process.argv.slice(2);\nconst isInitWithYes = args[0] === 'init' && (args.includes('-y') || args.includes('--yes') || args.includes('--non-interactive'));\nconst isNoArgs = args.length === 0 || (args.length === 1 && args[0] === '--debug');\nconst isRunCommand = args[0] === 'run'; // `openbuilder run` uses TUI Dashboard\nconst isRunnerCommand = args[0] === 'runner' && !args.includes('--no-tui'); // `openbuilder runner` uses TUI Dashboard (unless --no-tui)\nconst isVersionCommand = args.includes('--version') || args.includes('-V'); // Skip banner for version output\nconst isSkipBanner = process.env.OPENBUILDER_SKIP_BANNER === '1'; // Skip banner after auto-update restart\nconst isTUIMode = isInitWithYes || isNoArgs || isRunCommand || isRunnerCommand;\nconst isSilentMode = isTUIMode || isVersionCommand || isSkipBanner;\n\n// Set SILENT_MODE for TUI/version to suppress all console output from other modules\n// This must be set early, before modules that use console.log are imported\nif (isSilentMode) {\n process.env.SILENT_MODE = '1';\n}\n\n// Auto-update check - do this BEFORE displaying banner to avoid double banners\n// All modes (TUI and CLI): full auto-update with restart\n// For version mode: skip entirely - just show version\nlet willAutoUpdate = false;\nif (!process.env.OPENBUILDER_SKIP_UPDATE_CHECK && !isVersionCommand) {\n const { checkAndAutoUpdate } = await import('./utils/auto-update.js');\n \n try {\n // Show banner first for non-TUI modes\n if (!isSilentMode) {\n displayBanner();\n }\n \n // Full auto-update for all modes\n const didUpdate = await checkAndAutoUpdate(packageJson.version);\n if (didUpdate) {\n // CLI will be relaunched by auto-update, exit this process\n willAutoUpdate = true;\n process.exit(0);\n }\n } catch {\n // Auto-update failed silently, continue with current version\n }\n} else if (!isSilentMode) {\n // Update check skipped, show banner for CLI mode (but not version mode)\n displayBanner();\n}\n\nconst program = new Command();\n\nprogram\n .name('openbuilder')\n .description('OpenBuilder CLI - AI App Builder')\n .version(packageJson.version)\n .option('--runner', 'Start runner only (connect to remote server)')\n .option('--debug', 'Enable debug mode with verbose error output')\n .hook('preAction', (thisCommand) => {\n // Enable debug mode if --debug flag is present\n const opts = thisCommand.opts();\n if (opts.debug) {\n globalErrorHandler.setDebug(true);\n process.env.DEBUG = '1';\n }\n })\n .action(async (options) => {\n try {\n // Default action when no subcommand is provided\n if (options.runner) {\n // Start runner only (legacy flag)\n const { runCommand } = await import('./commands/run.js');\n await runCommand({});\n } else {\n // Show TUI main menu\n const { mainTUICommand } = await import('./commands/main-tui.js');\n await mainTUICommand();\n }\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\n// Import commands\nprogram\n .command('init')\n .description('Initialize workspace and configuration for local development')\n .option('--workspace <path>', 'Set workspace directory')\n .option('--url <url>', 'Set server URL (default: http://localhost:3000)')\n .option('--secret <secret>', 'Set shared secret')\n .option('--branch <branch>', 'Git branch to clone (default: main)')\n .option('--database [value]', 'Database setup: connection string, or omit to auto-setup Neon in -y mode')\n .option('-y, --yes', 'Accept all defaults (non-interactive mode)')\n .option('--non-interactive', 'Use defaults without prompts (alias for -y)')\n .action(async (options) => {\n try {\n const { initCommand } = await import('./commands/init.js');\n await initCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('run')\n .description('Start the full stack locally (web app + runner)')\n .option('-p, --port <port>', 'Web app port (default: 3000)')\n .option('--dev', 'Use development mode (hot reload, slower startup)')\n .option('--rebuild', 'Rebuild services before starting')\n .option('--no-local', 'Disable local mode (require authentication)')\n .option('--no-tui', 'Disable TUI dashboard, use plain text logs')\n .option('-v, --verbose', 'Enable verbose logging (show debug info)')\n .action(async (options) => {\n try {\n const { startCommand } = await import('./commands/start.js');\n await startCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('build')\n .description('Build all services without starting (useful while app is running)')\n .option('--watch', 'Watch for changes and rebuild automatically')\n .action(async (options) => {\n try {\n const { buildCommand } = await import('./commands/build.js');\n await buildCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('runner')\n .description('Start runner only (connect to OpenBuilder server)')\n .option('-u, --url <url>', 'OpenBuilder server URL (default: https://openbuilder.sh)')\n .option('-w, --workspace <path>', 'Workspace directory (default: ~/openbuilder-workspace)')\n .option('-i, --runner-id <id>', 'Runner identifier (default: system username)')\n .option('-s, --secret <secret>', 'Shared secret for authentication (required)')\n .option('-b, --broker <url>', 'WebSocket URL override (advanced, inferred from --url)')\n .option('-v, --verbose', 'Enable verbose logging')\n .option('-l, --local', 'Enable local mode (bypasses authentication)')\n .option('--no-tui', 'Disable TUI dashboard, use plain text logs')\n .action(async (options) => {\n try {\n const { runCommand } = await import('./commands/run.js');\n await runCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\n\nprogram\n .command('config <action> [key] [value]')\n .description('Manage configuration (actions: get, set, list, path, validate, reset)')\n .action(async (action, key, value) => {\n try {\n const { configCommand } = await import('./commands/config.js');\n await configCommand(action, key, value);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\n// Alias for config validate\nprogram\n .command('verify')\n .description('Verify configuration is valid (alias for config validate)')\n .action(async () => {\n try {\n const { configCommand } = await import('./commands/config.js');\n await configCommand('validate');\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('status')\n .description('Show runner status and configuration')\n .action(async () => {\n try {\n const { statusCommand } = await import('./commands/status.js');\n await statusCommand();\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('cleanup')\n .description('Clean up projects and resources')\n .option('--project <slug>', 'Delete specific project')\n .option('--all', 'Clean all projects in workspace')\n .option('--tunnels', 'Close all active tunnels')\n .option('--processes', 'Kill all dev servers')\n .action(async (options) => {\n try {\n const { cleanupCommand } = await import('./commands/cleanup.js');\n await cleanupCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('database')\n .alias('db')\n .description('Set up a new database and initialize schema')\n .action(async () => {\n try {\n const { databaseCommand } = await import('./commands/database.js');\n await databaseCommand();\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('upgrade')\n .description('Upgrade to latest version (preserves configuration)')\n .option('--branch <branch>', 'Upgrade to specific branch (default: main)')\n .option('--force', 'Skip safety checks (uncommitted changes)')\n .action(async (options) => {\n try {\n const { upgradeCommand } = await import('./commands/upgrade.js');\n await upgradeCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('login')\n .description('Authenticate with OpenBuilder via OAuth (GitHub/Sentry)')\n .option('-u, --url <url>', 'OpenBuilder server URL (default: https://openbuilder.sh)')\n .option('-f, --force', 'Force re-authentication even if already logged in')\n .action(async (options) => {\n try {\n const { loginCommand } = await import('./commands/login.js');\n await loginCommand(options);\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram\n .command('logout')\n .description('Clear stored authentication credentials')\n .action(async () => {\n try {\n const { logoutCommand } = await import('./commands/logout.js');\n await logoutCommand();\n } catch (error) {\n globalErrorHandler.handle(error as Error);\n }\n });\n\nprogram.parse();"],"names":["__filename","__dirname"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update-Cr7SnKwX.js","sources":["../../src/cli/utils/auto-update.ts"],"sourcesContent":["/**\n * Auto-update utility for OpenBuilder CLI\n * \n * Checks GitHub Releases for newer versions and automatically\n * updates both:\n * 1. The CLI itself (globally installed npm package)\n * 2. The app/monorepo (local installation that runs the web app)\n */\n\nimport { execSync, spawnSync } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport pc from 'picocolors';\nimport { configManager } from './config-manager.js';\n\n// GitHub API endpoint for releases\nconst GITHUB_RELEASES_URL = 'https://api.github.com/repos/codyde/openbuilder/releases/latest';\n\n// Install command for CLI\nconst INSTALL_COMMAND = 'curl -fsSL https://openbuilder.sh/install | bash';\n\n// Cache settings\nconst CACHE_DIR = join(homedir(), '.config', 'openbuilder');\nconst CACHE_FILE = join(CACHE_DIR, 'update-cache.json');\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion: string;\n // Track if we need to upgrade the app after CLI update\n pendingAppUpgrade?: boolean;\n}\n\n/**\n * Read the update cache file\n */\nfunction readUpdateCache(): UpdateCache | null {\n try {\n if (existsSync(CACHE_FILE)) {\n const content = readFileSync(CACHE_FILE, 'utf-8');\n return JSON.parse(content);\n }\n } catch {\n // Cache read failed, that's fine\n }\n return null;\n}\n\n/**\n * Write to the update cache file\n */\nfunction saveUpdateCache(cache: UpdateCache): void {\n try {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));\n } catch {\n // Cache write failed, that's fine\n }\n}\n\n/**\n * Fetch the latest release version from GitHub\n * Returns version string (e.g., \"0.28.0\") or null on failure\n */\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000); // 5s timeout\n\n const response = await fetch(GITHUB_RELEASES_URL, {\n headers: {\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'OpenBuilder-CLI-AutoUpdate',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json() as { tag_name: string };\n // Remove 'v' prefix if present (e.g., \"v0.28.0\" -> \"0.28.0\")\n return data.tag_name.replace(/^v/, '');\n } catch {\n // Network error, timeout, or parse error\n return null;\n }\n}\n\n/**\n * Compare two semver versions\n * Returns true if version1 < version2 (i.e., version2 is newer)\n */\nfunction isNewerVersion(current: string, latest: string): boolean {\n const parseVersion = (v: string) => {\n const parts = v.replace(/^v/, '').split('.').map(n => parseInt(n, 10) || 0);\n return { major: parts[0] || 0, minor: parts[1] || 0, patch: parts[2] || 0 };\n };\n\n const c = parseVersion(current);\n const l = parseVersion(latest);\n\n if (l.major > c.major) return true;\n if (l.major < c.major) return false;\n if (l.minor > c.minor) return true;\n if (l.minor < c.minor) return false;\n return l.patch > c.patch;\n}\n\n/**\n * Perform the CLI update by running the install script\n */\nfunction performCLIUpdate(): boolean {\n try {\n // Run the install command with quiet mode to avoid banner spam\n execSync(INSTALL_COMMAND, {\n stdio: 'inherit',\n shell: '/bin/bash',\n env: {\n ...process.env,\n OPENBUILDER_QUIET_INSTALL: '1', // Suppress banner in installer\n },\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if the app/monorepo needs upgrading and perform the upgrade\n * This updates the local OpenBuilder installation that runs the web app\n */\nfunction performAppUpgrade(): boolean {\n const config = configManager.get();\n const monorepoPath = config.monorepoPath;\n\n // No monorepo configured, skip app upgrade\n if (!monorepoPath || !existsSync(monorepoPath)) {\n return true; // Not an error, just nothing to upgrade\n }\n\n console.log();\n console.log(` ${pc.cyan('⬆')} ${pc.bold('Upgrading app installation...')}`);\n console.log(` ${pc.dim(monorepoPath)}`);\n console.log();\n\n try {\n // Run openbuilder upgrade --force to upgrade the monorepo\n // Use --force to skip prompts since we're in auto-update mode\n const result = spawnSync('openbuilder', ['upgrade', '--force'], {\n stdio: 'inherit',\n env: {\n ...process.env,\n OPENBUILDER_SKIP_UPDATE_CHECK: '1', // Don't re-check for CLI updates\n },\n shell: true,\n });\n\n return result.status === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Re-launch the CLI with original arguments after update\n */\nfunction relaunchCLI(): void {\n const args = process.argv.slice(2);\n \n try {\n // Get the actual path to openbuilder to avoid shell hash caching issues\n // This ensures we run the newly installed version, not a cached path\n let openbuilderPath = 'openbuilder';\n try {\n // Use 'command -v' to get the actual path, bypassing shell hash\n openbuilderPath = execSync('command -v openbuilder', { encoding: 'utf-8' }).trim();\n } catch {\n // Fallback to just 'openbuilder' if command -v fails\n }\n \n // Use spawnSync with the explicit path to ensure we get the new version\n const result = spawnSync(openbuilderPath, args, {\n stdio: 'inherit',\n env: { \n ...process.env, \n OPENBUILDER_SKIP_UPDATE_CHECK: '1', // Prevent update loop\n OPENBUILDER_SKIP_BANNER: '1', // Suppress banner after restart (already shown before update)\n },\n // Don't use shell: true to avoid shell hash caching\n });\n \n // Exit with the same code as the relaunched process\n process.exit(result.status ?? 0);\n } catch {\n // If relaunch fails, just exit - user can run command again\n process.exit(0);\n }\n}\n\n/**\n * Main auto-update check function\n * Call this early in CLI startup\n * \n * Updates both:\n * 1. The CLI itself (globally installed)\n * 2. The app/monorepo (if configured)\n * \n * @param currentVersion - Current CLI version from package.json\n * @returns true if update was performed and CLI should exit\n */\nexport async function checkAndAutoUpdate(currentVersion: string): Promise<boolean> {\n // Skip if update check is disabled via env var\n if (process.env.OPENBUILDER_NO_UPDATE === '1' || process.env.OPENBUILDER_SKIP_UPDATE_CHECK === '1') {\n // But check if we have a pending app upgrade from a previous CLI update\n const cache = readUpdateCache();\n if (cache?.pendingAppUpgrade) {\n console.log();\n console.log(` ${pc.cyan('⬆')} ${pc.bold('Completing app upgrade...')}`);\n \n const appSuccess = performAppUpgrade();\n \n if (appSuccess) {\n // Clear the pending flag\n saveUpdateCache({ ...cache, pendingAppUpgrade: false });\n console.log(` ${pc.green('✓')} ${pc.bold('App upgrade complete!')}`);\n } else {\n console.log(` ${pc.yellow('⚠')} ${pc.dim('App upgrade failed. Run manually:')} ${pc.cyan('openbuilder upgrade')}`);\n }\n console.log();\n }\n return false;\n }\n\n // Skip if disabled in config\n const config = configManager.get();\n if (config.autoUpdate === false) {\n return false;\n }\n\n let latestVersion: string | null = null;\n\n // Check cache first to avoid hitting GitHub API too often\n const cache = readUpdateCache();\n const now = Date.now();\n\n if (cache && (now - cache.lastCheck) < CACHE_TTL_MS) {\n // Use cached version\n latestVersion = cache.latestVersion;\n } else {\n // Fetch from GitHub (with timeout)\n latestVersion = await fetchLatestVersion();\n \n if (latestVersion) {\n // Update cache\n saveUpdateCache({\n lastCheck: now,\n latestVersion,\n });\n } else if (cache) {\n // Fetch failed, use stale cache\n latestVersion = cache.latestVersion;\n }\n }\n\n // If we couldn't determine latest version, skip update\n if (!latestVersion) {\n return false;\n }\n\n // Check if update is needed\n if (!isNewerVersion(currentVersion, latestVersion)) {\n return false;\n }\n\n // Update available! Show message and perform update\n console.log();\n console.log(` ${pc.cyan('⬆')} ${pc.bold('Update available:')} ${pc.dim(currentVersion)} → ${pc.green(latestVersion)}`);\n console.log();\n\n // Step 1: Update the CLI\n console.log(` ${pc.dim('Step 1/2:')} Updating CLI...`);\n const cliSuccess = performCLIUpdate();\n\n if (!cliSuccess) {\n // CLI update failed, continue with current version\n console.log();\n console.log(` ${pc.yellow('⚠')} ${pc.dim('CLI update failed. Continuing with current version.')}`);\n console.log(` ${pc.dim('You can manually update with:')} ${pc.cyan('curl -fsSL https://openbuilder.sh/install | bash')}`);\n console.log();\n return false;\n }\n\n console.log(` ${pc.green('✓')} CLI updated to ${pc.green(latestVersion)}`);\n \n // Step 2: Check if we need to upgrade the app\n const monorepoPath = config.monorepoPath;\n const hasMonorepo = monorepoPath && existsSync(monorepoPath);\n\n if (hasMonorepo) {\n // Mark that we need to upgrade the app after CLI restart\n // The new CLI version will handle the app upgrade\n saveUpdateCache({\n lastCheck: now,\n latestVersion,\n pendingAppUpgrade: true,\n });\n \n console.log();\n console.log(` ${pc.dim('Step 2/2:')} App upgrade will continue after restart...`);\n }\n\n console.log();\n console.log(` ${pc.green('✓')} ${pc.bold('CLI update complete!')} Restarting...`);\n console.log();\n \n // Relaunch CLI with original args\n // The new CLI will pick up the pendingAppUpgrade flag and complete step 2\n relaunchCLI();\n \n return true; // CLI will exit via relaunchCLI\n}\n\n/**\n * Check for updates without auto-updating (for TUI modes)\n * Returns version info that can be displayed in the TUI\n * \n * @param currentVersion - Current CLI version from package.json\n * @returns Update info or null if no update available\n */\nexport async function checkForUpdate(currentVersion: string): Promise<{\n currentVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n} | null> {\n // Skip if update check is disabled via env var\n if (process.env.OPENBUILDER_NO_UPDATE === '1' || process.env.OPENBUILDER_SKIP_UPDATE_CHECK === '1') {\n return null;\n }\n\n // Skip if disabled in config\n const config = configManager.get();\n if (config.autoUpdate === false) {\n return null;\n }\n\n let latestVersion: string | null = null;\n\n // Check cache first to avoid hitting GitHub API too often\n const cache = readUpdateCache();\n const now = Date.now();\n\n if (cache && (now - cache.lastCheck) < CACHE_TTL_MS) {\n // Use cached version\n latestVersion = cache.latestVersion;\n } else {\n // Fetch from GitHub (with timeout)\n latestVersion = await fetchLatestVersion();\n \n if (latestVersion) {\n // Update cache\n saveUpdateCache({\n lastCheck: now,\n latestVersion,\n pendingAppUpgrade: cache?.pendingAppUpgrade,\n });\n } else if (cache) {\n // Fetch failed, use stale cache\n latestVersion = cache.latestVersion;\n }\n }\n\n // If we couldn't determine latest version, return null\n if (!latestVersion) {\n return null;\n }\n\n const updateAvailable = isNewerVersion(currentVersion, latestVersion);\n \n return {\n currentVersion,\n latestVersion,\n updateAvailable,\n };\n}\n\n/**\n * Clear the update cache (useful for testing or forcing a fresh check)\n */\nexport function clearUpdateCache(): void {\n try {\n if (existsSync(CACHE_FILE)) {\n unlinkSync(CACHE_FILE);\n }\n } catch {\n // Ignore errors\n }\n}\n\n/**\n * Get the current update status (for debugging/status commands)\n */\nexport function getUpdateStatus(): { \n cacheFile: string;\n cache: UpdateCache | null;\n monorepoPath: string | undefined;\n hasMonorepo: boolean;\n} {\n const config = configManager.get();\n const monorepoPath = config.monorepoPath;\n \n return {\n cacheFile: CACHE_FILE,\n cache: readUpdateCache(),\n monorepoPath,\n hasMonorepo: !!(monorepoPath && existsSync(monorepoPath)),\n };\n}\n"],"names":[],"mappings":"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"}
|