@openbuilder/cli 0.50.43 → 0.50.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{Banner-C-FTiOIR.js → Banner-BKC6yG6z.js} +2 -2
- package/dist/chunks/Banner-BKC6yG6z.js.map +1 -0
- package/dist/chunks/auto-update-Dq2PFvjt.js +1 -0
- package/dist/chunks/auto-update-Dq2PFvjt.js.map +1 -0
- package/dist/chunks/build-D0qYqIq0.js +1 -0
- package/dist/chunks/build-D0qYqIq0.js.map +1 -0
- package/dist/chunks/cleanup-qVTsA3tk.js +1 -0
- package/dist/chunks/cleanup-qVTsA3tk.js.map +1 -0
- package/dist/chunks/{cli-auth-ChCnxlFl.js → cli-auth-BgiGSBOt.js} +4 -3
- package/dist/chunks/cli-auth-BgiGSBOt.js.map +1 -0
- package/dist/chunks/cli-error-BjQwvWtK.js +1 -0
- package/dist/chunks/cli-error-BjQwvWtK.js.map +1 -0
- package/dist/chunks/config-BGP1jZJ4.js +1 -0
- package/dist/chunks/config-BGP1jZJ4.js.map +1 -0
- package/dist/chunks/config-manager-BkbjtN-H.js +1 -0
- package/dist/chunks/config-manager-BkbjtN-H.js.map +1 -0
- package/dist/chunks/database-BvAbD4sP.js +1 -0
- package/dist/chunks/database-BvAbD4sP.js.map +1 -0
- package/dist/chunks/database-setup-BYjIRAmT.js +1 -0
- package/dist/chunks/database-setup-BYjIRAmT.js.map +1 -0
- package/dist/chunks/devtools-7A3EXJhY.js +75 -0
- package/dist/chunks/devtools-7A3EXJhY.js.map +1 -0
- package/dist/chunks/index-ZNRLfdj5.js +119 -0
- package/dist/chunks/index-ZNRLfdj5.js.map +1 -0
- package/dist/chunks/{init-DNyPS_SR.js → init-IQRjA1g3.js} +8 -9
- package/dist/chunks/init-IQRjA1g3.js.map +1 -0
- package/dist/chunks/{init-tui-EFMXj-MG.js → init-tui-B4jfmo3U.js} +7 -8
- package/dist/chunks/init-tui-B4jfmo3U.js.map +1 -0
- package/dist/chunks/logger-ZpJi7chw.js +1 -0
- package/dist/chunks/logger-ZpJi7chw.js.map +1 -0
- package/dist/chunks/{login-BhtodVsj.js → login-CrIcDJpS.js} +2 -1
- package/dist/chunks/login-CrIcDJpS.js.map +1 -0
- package/dist/chunks/{logout-CDDASeuQ.js → logout-BxgiczmY.js} +2 -1
- package/dist/chunks/logout-BxgiczmY.js.map +1 -0
- package/dist/chunks/{main-tui-D-SG-Ba5.js → main-tui-NPDVPKol.js} +9 -10
- package/dist/chunks/main-tui-NPDVPKol.js.map +1 -0
- package/dist/chunks/manager-CvGX9qqe.js +1 -0
- package/dist/chunks/manager-CvGX9qqe.js.map +1 -0
- package/dist/chunks/{port-allocator-B0q7xkLs.js → port-allocator-DuAZe2_S.js} +3 -36
- package/dist/chunks/port-allocator-DuAZe2_S.js.map +1 -0
- package/dist/chunks/process-killer-CaUL7Kpl.js +1 -0
- package/dist/chunks/process-killer-CaUL7Kpl.js.map +1 -0
- package/dist/chunks/prompts-1QbE_bRr.js +1 -0
- package/dist/chunks/prompts-1QbE_bRr.js.map +1 -0
- package/dist/chunks/repo-cloner-CpOQjFSo.js +1 -0
- package/dist/chunks/repo-cloner-CpOQjFSo.js.map +1 -0
- package/dist/chunks/repo-detector-B_oj696o.js +1 -0
- package/dist/chunks/repo-detector-B_oj696o.js.map +1 -0
- package/dist/chunks/{run-Cor14S0I.js → run-Yh3YjeLl.js} +17 -36
- package/dist/chunks/run-Yh3YjeLl.js.map +1 -0
- package/dist/chunks/runner-logger-instance-nDWv2h2T.js +1 -0
- package/dist/chunks/runner-logger-instance-nDWv2h2T.js.map +1 -0
- package/dist/chunks/spinner-BJL9zWAJ.js +1 -0
- package/dist/chunks/spinner-BJL9zWAJ.js.map +1 -0
- package/dist/chunks/{start-k9iGDVWo.js → start-B-brfyVy.js} +7 -7
- package/dist/chunks/start-B-brfyVy.js.map +1 -0
- package/dist/chunks/start-traditional-uoLZXdxm.js +1 -0
- package/dist/chunks/start-traditional-uoLZXdxm.js.map +1 -0
- package/dist/chunks/status-cS8YwtUx.js +1 -0
- package/dist/chunks/status-cS8YwtUx.js.map +1 -0
- package/dist/chunks/{vendor-react-CXgiD1Dl.js → theme-DOjeB8BU.js} +50 -225
- package/dist/chunks/theme-DOjeB8BU.js.map +1 -0
- package/dist/chunks/upgrade-CKjl4HlB.js +1 -0
- package/dist/chunks/upgrade-CKjl4HlB.js.map +1 -0
- package/dist/chunks/use-app-DozfqdJj.js +10 -0
- package/dist/chunks/use-app-DozfqdJj.js.map +1 -0
- package/dist/chunks/{useBuildState-DscLOZLl.js → useBuildState-DV6wurQ2.js} +2 -2
- package/dist/chunks/useBuildState-DV6wurQ2.js.map +1 -0
- package/dist/cli/index.js +8 -7
- package/dist/cli/index.js.map +1 -0
- package/dist/index.js +109 -700
- package/dist/index.js.map +1 -0
- package/dist/instrument.js +8 -81
- package/dist/instrument.js.map +1 -0
- package/package.json +2 -11
- package/dist/chunks/theme-DhorI2Hb.js +0 -43
- package/dist/chunks/vendor-ai-sdk-CSJ0bw9X.js +0 -1970
- package/dist/chunks/vendor-sentry-CqA9P3UG.js +0 -71910
- package/scripts/install-vendor-deps.js +0 -34
- package/scripts/install-vendor.js +0 -167
- package/scripts/prepare-release.js +0 -83
- package/vendor/ai-sdk-provider-claude-code-LOCAL.tgz +0 -0
- package/vendor/sentry-core-LOCAL.tgz +0 -0
- package/vendor/sentry-nextjs-LOCAL.tgz +0 -0
- package/vendor/sentry-node-LOCAL.tgz +0 -0
- package/vendor/sentry-node-core-LOCAL.tgz +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-Yh3YjeLl.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBM,SAAU,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAiB,EAAA;IACtF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGA,qBAAQ,CAAC,CAAC,CAAC;IACnD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,qBAAQ,CAAC,IAAI,CAAC;;IAGlD,MAAM,cAAc,GAAG;AACrB,UAAE;AACF,UAAE,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;;AAGnC,IAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;;IAG5CC,sBAAS,CAAC,MAAK;QACb,IAAI,UAAU,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,GAAG,YAAY,CAAC;YACnE,eAAe,CAAC,SAAS,CAAC;QAC5B;IACF,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;;AAGrD,IAAA,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AACtB,QAAA,IAAI,CAAC,SAAS;YAAE;AAEhB,QAAA,IAAI,GAAG,CAAC,OAAO,EAAE;YACf,aAAa,CAAC,KAAK,CAAC;AACpB,YAAA,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QAChD;AAAO,aAAA,IAAI,GAAG,CAAC,SAAS,EAAE;AACxB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,GAAG,YAAY,CAAC;AACnE,YAAA,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;;AAEtD,YAAA,IAAI,YAAY,IAAI,SAAS,GAAG,CAAC,EAAE;gBACjC,aAAa,CAAC,IAAI,CAAC;YACrB;QACF;AAAO,aAAA,IAAI,GAAG,CAAC,MAAM,EAAE;YACrB,aAAa,CAAC,KAAK,CAAC;AACpB,YAAA,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,YAAY,CAAC,CAAC;QAC3D;AAAO,aAAA,IAAI,GAAG,CAAC,QAAQ,EAAE;AACvB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,GAAG,YAAY,CAAC;AACnE,YAAA,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,YAAY,CAAC,CAAC;QACnE;AACF,IAAA,CAAC,CAAC;;AAGF,IAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY,CAAC;IAYxF,QACEC,sBAAA,CAAC,GAAG,EAAA,EACF,aAAa,EAAC,QAAQ,EACtB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EACtD,QAAQ,EAAE,CAAC,EAAA,QAAA,EAAA,CAGXA,uBAAC,GAAG,EAAA,EAAC,cAAc,EAAC,eAAe,EAAC,YAAY,EAAE,CAAC,EAAA,QAAA,EAAA,CACjDC,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAA,IAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAY,EAC1CD,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,CAAA,YAAA,EACd,SAAS,GAAG,IAAI,GAAG,KAAK,EAAA,GAAA,CAAA,EAAA,CAC9B,CAAA,EAAA,CACH,EAGNC,sBAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAA,QAAA,EACpC,gBAAgB,CAAC,MAAM,KAAK,CAAC,IAC5BA,qBAAA,CAAC,GAAG,EAAA,EAAC,cAAc,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAA,QAAA,EAC1DA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,oCAA4B,EAAA,CACnD,KAEN,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,MAChCA,qBAAA,CAAC,WAAW,IAEV,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAA,EAFd,KAAK,CAAC,EAAE,CAGb,CACH,CAAC,CACH,EAAA,CACG,EAGL,cAAc,CAAC,MAAM,GAAG,YAAY,KACnCA,qBAAA,CAAC,GAAG,IAAC,cAAc,EAAC,UAAU,EAAA,QAAA,EAC5BD,sBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,CACxB,YAAY,GAAG,CAAC,EAAA,GAAA,EAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,YAAY,EAAE,cAAc,CAAC,MAAM,CAAC,EAAA,GAAA,EAAG,cAAc,CAAC,MAAM,EACvG,UAAU,GAAG,SAAS,GAAG,EAAE,CAAA,EAAA,CACvB,EAAA,CACH,CACP,CAAA,EAAA,CACG;AAEV;AAEA;AACA,SAAS,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAyC,EAAA;AAC7E,IAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;AACjE,QAAA,MAAM,EAAE,KAAK;AACb,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,MAAM,EAAE,SAAS;AAClB,KAAA,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG;QAClB,KAAK,EAAE,MAAM,CAAC,OAAO;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,OAAO;QACpB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB;AAED,IAAA,MAAM,UAAU,GAAG;AACjB,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,OAAO,EAAE,GAAG;AACZ,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,GAAG;KACX;;AAGD,IAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAA,CAAE,GAAG,EAAE;QAC1C,CAAA,EAAG,KAAK,CAAC,QAAQ,CAAA,EAAG,QAAQ,CAAA;QAK7C,QACEA,sBAAA,CAAC,GAAG,EAAA,EAAA,QAAA,EAAA,CACFC,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAG,IAAI,EAAA,CAAQ,EAC1CA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAe,EACvCA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAA,QAAA,EAAG,KAAK,CAAC,QAAQ,EAAA,CAAQ,EACjD,KAAK,CAAC,QAAQ,IAAID,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,CAAA,GAAA,EAAI,KAAK,CAAC,QAAQ,CAAA,EAAA,CAAQ,CAAA,EAAA,CACjE;IAEV;;IAGA,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC;IACtC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;;AAGpC,IAAA,MAAM,cAAc,GAAG,QAAQ,GAAG,EAAE,CAAC;IACrC,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG;AAC9C,UAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,GAAG,CAAC,CAAC,GAAG;AACnD,UAAE,KAAK,CAAC,OAAO;AAEjB,IAAA,QACEA,sBAAA,CAAC,GAAG,EAAA,EAAA,QAAA,EAAA,CACFC,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAG,IAAI,EAAA,CAAQ,EAC1CD,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,KAAK,EAAA,QAAA,EAAA,CAAA,GAAA,EAAI,IAAI,EAAA,GAAA,CAAA,EAAA,CAAS,EACnCC,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,KAAK,EAAA,QAAA,EAAG,gBAAgB,EAAA,CAAQ,CAAA,EAAA,CACzC;AAEV;;SCvKgB,SAAS,CAAC,EACxB,WAAW,EACX,SAAS,EACT,UAAU,GAAG,CAAC,EACd,iBAAiB,GAAG,CAAC,EACrB,IAAI,GACW,EAAA;;AAEf,IAAA,MAAM,WAAW,GAAG,cAAc,EAAE;;AAGpC,IAAA,MAAM,mBAAmB,IACvBD,sBAAA,CAAC,GAAG,EAAA,EAAC,WAAW,EAAE,CAAC,EAAA,QAAA,EAAA,CACjBC,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,YACrD,WAAW,GAAG,GAAG,GAAG,GAAG,EAAA,CACnB,EACPD,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,CACrB,GAAG,EAAE,WAAW,GAAG,WAAW,GAAG,cAAc,CAAA,EAAA,CAC3C,CAAA,EAAA,CACH,CACP;;AAGD,IAAA,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC,IACnCC,qBAAA,CAAC,GAAG,EAAA,EAAC,WAAW,EAAE,CAAC,YACjBD,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,CAAA,QAAA,EACf,iBAAiB,GAAG,CAAC,EAAA,GAAA,EAAG,UAAU,IACpC,EAAA,CACH,IACJ,IAAI;;IAGR,MAAM,SAAS,GAAG,IAAI,KAAK,WAAW,IACpCA,sBAAA,CAAC,GAAG,eACFC,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAA,CAAG,EACpCD,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,SAAS,EAAA,CAAG,EACvCD,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAE,CAAA,SAAA,EAAY,SAAS,GAAG,IAAI,GAAG,KAAK,CAAA,CAAE,GAAI,EACtED,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAA,CAAG,EACpCD,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,WAAW,GAAG,EACxC,UAAU,GAAG,CAAC,IAAID,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,cAAc,EAAA,CAAG,EACjED,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,cAAI,EAAC,KAAK,EAAC,QAAQ,GAAG,CAAA,EAAA,CACnC,IACJ,IAAI,KAAK,SAAS,IACpBF,uBAAC,GAAG,EAAA,EAAA,QAAA,EAAA,CACFC,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,WAAW,EAAA,CAAG,EACzCD,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAA,CAAG,EACpCD,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,QAAQ,EAAA,CAAG,EACtCD,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,QAAQ,GAAG,EACtCD,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,cAAI,EAAC,KAAK,EAAC,QAAQ,EAAA,CAAG,EACvCD,sBAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,SAAS,EAAC,KAAK,EAAC,MAAM,EAAA,CAAG,CAAA,EAAA,CACtC,KAEND,qBAAA,CAAC,GAAG,EAAA,EAAA,QAAA,EACFA,qBAAA,CAACC,UAAQ,EAAA,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,EAAA,CAAG,EAAA,CACpC,CACP;;IAGD,MAAM,cAAc,IAClBD,qBAAA,CAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAA,QAAA,EAChBA,qBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EACxB,WAAW,CAAC,OAAO,EAAA,CACf,EAAA,CACH,CACP;AAED,IAAA,QACED,sBAAA,CAAC,GAAG,EAAA,EACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,MAAM,CAAC,QAAQ,EAC5B,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,aAE9BA,sBAAA,CAAC,GAAG,eACD,mBAAmB,EACnB,cAAc,CAAA,EAAA,CACX,EACNA,sBAAA,CAAC,GAAG,eACD,SAAS,EACT,cAAc,CAAA,EAAA,CACX,CAAA,EAAA,CACF;AAEV;AAEA;AACA,SAASE,UAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,EAAqC,EAAA;IACpE,QACEF,sBAAA,CAAC,GAAG,EAAA,EAAC,WAAW,EAAE,CAAC,EAAA,QAAA,EAAA,CACjBC,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,GAAA,EAAA,CAAU,EACrCA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,YAAG,MAAM,EAAA,CAAQ,EACzCA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,GAAA,EAAA,CAAU,EACrCA,sBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAG,KAAK,EAAA,CAAQ,CAAA,EAAA,CACpC;AAEV;;AC9FM,SAAU,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAoB,EAAA;AACvE,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE;AAC9B,IAAA,MAAM,cAAc,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE;AACzC,IAAsB,MAAM,EAAE,OAAO,IAAI;IAEzC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAGH,qBAAQ,CAAC,EAAE,CAAC;IAClD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAGA,qBAAQ,CAAC,KAAK,CAAC;IACrD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,qBAAQ,CAAa,KAAK,CAAC;IAC/D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGA,qBAAQ,CAAC,CAAC,CAAC;IACnD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,qBAAQ,CAAyB,WAAW,CAAC;;IAGjF,MAAM,YAAY,GAAG,CAAC;IACtB,MAAM,YAAY,GAAG,CAAC;AACtB,IAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,YAAY,GAAG,YAAY,CAAC;;IAG9E,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAG;;AAE9C,QAAA,IAAI,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE;AAChF,YAAA,OAAO,KAAK;QACd;QACA,IAAI,UAAU,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AAC7C,YAAA,OAAO,KAAK;QACd;QACA,IAAI,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE;AAC7C,YAAA,OAAO,KAAK;QACd;;AAGA,QAAA,IAAI,WAAW,IAAI,UAAU,KAAK,QAAQ,EAAE;AAC1C,YAAA,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE;AACvC,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;AAChE,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC/D,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC/D,YAAA,OAAO,YAAY,IAAI,SAAS,IAAI,SAAS;QAC/C;AAEA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,CAAC;;AAGF,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,MAAM,GAAG,YAAY,CAAC;;AAGrE,IAAA,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY,CAAC;;AAGxF,IAAA,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;QACtB,IAAI,WAAW,EAAE;YACf,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE;gBAC5B,cAAc,CAAC,KAAK,CAAC;YACvB;YACA;QACF;AAEA,QAAA,IAAI,KAAK,KAAK,GAAG,EAAE;AACjB,YAAA,MAAM,EAAE;QACV;AAAO,aAAA,IAAI,KAAK,KAAK,GAAG,EAAE;AACxB,YAAA,MAAM,EAAE;QACV;AAAO,aAAA,IAAI,KAAK,KAAK,GAAG,EAAE;YACxB,cAAc,CAAC,IAAI,CAAC;QACtB;AAAO,aAAA,IAAI,KAAK,KAAK,GAAG,EAAE;;YAExB,MAAM,KAAK,GAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;YACjE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;AAC9C,YAAA,aAAa,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YACvD,eAAe,CAAC,CAAC,CAAC;QACpB;AAAO,aAAA,IAAI,KAAK,KAAK,GAAG,EAAE;;AAExB,YAAA,aAAa,CAAC,IAAI,IAAI,IAAI,KAAK,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;QACnE;AAAO,aAAA,IAAI,GAAG,CAAC,OAAO,EAAE;AACtB,YAAA,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QAChD;AAAO,aAAA,IAAI,GAAG,CAAC,SAAS,EAAE;AACxB,YAAA,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QACxD;AAAO,aAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACrB,YAAA,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,YAAY,CAAC,CAAC;QAC3D;AAAO,aAAA,IAAI,GAAG,CAAC,QAAQ,EAAE;AACvB,YAAA,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,YAAY,CAAC,CAAC;QACnE;AAAO,aAAA,IAAI,GAAG,CAAC,MAAM,EAAE;YACrB,IAAI,WAAW,EAAE;gBACf,cAAc,CAAC,EAAE,CAAC;YACpB;iBAAO;AACL,gBAAA,MAAM,EAAE;YACV;QACF;AACF,IAAA,CAAC,CAAC;;AAGF,IAAA,MAAM,UAAU,GAAG,CAAC,SAAiB,KAAY;QAC/C,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;AACrD,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,MAAM,EAAE,SAAS;AAClB,SAAA,CAAC;AACJ,IAAA,CAAC;;AAGD,IAAA,MAAM,eAAe,GAAG,CAAC,IAAY,KAAqB;AACxD,QAAA,IAAI,CAAC,WAAW,IAAI,UAAU,KAAK,WAAW,EAAE;AAC9C,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AAC/C,QAAA,IAAI,KAAK,KAAK,EAAE,EAAE;AAChB,YAAA,OAAO,IAAI;QACb;QAEA,QACEE,gEACG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EACrBC,sBAAC,IAAI,EAAA,EAAC,eAAe,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAC,OAAO,EAAA,QAAA,EACjD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,EAAA,CACzC,EACN,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA,EAAA,CACtC;AAEP,IAAA,CAAC;AAED,IAAA,QACED,sBAAA,CAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,MAAM,EAAE,cAAc,EAAA,QAAA,EAAA,CAEhDA,uBAAC,GAAG,EAAA,EACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,MAAM,CAAC,QAAQ,EAC5B,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,aAE9BC,qBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAA,IAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAY,EAC1CD,sBAAA,CAAC,GAAG,EAAA,EAAA,QAAA,EAAA,CACFC,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,CAAiB,EAC3C,WAAW,IACVA,qBAAA,CAAC,GAAG,EAAA,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,YAC5DA,qBAAA,CAAC,SAAS,IACR,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAC,mBAAmB,EAAA,CAC/B,EAAA,CACE,KAEND,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,kBACpD,WAAW,IAAI,MAAM,EAAA,KAAA,EAAK,UAAU,SACjC,CACR,EACDC,sBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,MAAA,EAAA,CAAa,CAAA,EAAA,CACpC,CAAA,EAAA,CACF,EAGNA,qBAAA,CAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,QAAQ,EAAE,CAAC,EACX,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,MAAM,CAAC,QAAQ,EAC5B,SAAS,EAAE,KAAK,EAChB,YAAY,EAAE,KAAK,EACnB,QAAQ,EAAE,CAAC,YAEV,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;oBACnC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;AACxC,oBAAA,MAAM,WAAW,GAAG;wBAClB,KAAK,EAAE,MAAM,CAAC,OAAO;wBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,IAAI,EAAE,MAAM,CAAC,OAAO;wBACpB,KAAK,EAAE,MAAM,CAAC,KAAK;qBACpB;AACD,oBAAA,MAAM,UAAU,GAAG;AACjB,wBAAA,KAAK,EAAE,IAAI;AACX,wBAAA,IAAI,EAAE,GAAG;AACT,wBAAA,OAAO,EAAE,GAAG;AACZ,wBAAA,IAAI,EAAE,GAAG;AACT,wBAAA,KAAK,EAAE,GAAG;qBACX;AAED,oBAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,wBAAA,QACED,sBAAA,CAAC,GAAG,EAAA,EAAA,QAAA,EAAA,CACFC,sBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAG,IAAI,EAAA,CAAQ,EAC1CA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAe,EACvCA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAA,QAAA,EAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAQ,EAClE,KAAK,CAAC,QAAQ,KACbD,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,CAAA,GAAA,EAAI,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA,EAAA,CAAQ,CACpE,KANO,KAAK,CAAC,EAAE,CAOZ;oBAEV;AAEA,oBAAA,QACEA,sBAAA,CAAC,GAAG,EAAA,EAAA,QAAA,EAAA,CACFC,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAG,IAAI,EAAA,CAAQ,EAC1CD,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,EAAA,QAAA,EAAA,CAAA,GAAA,EAAI,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAA,GAAA,CAAA,EAAA,CAAS,EACzEC,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,EAAA,QAAA,EAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,EAAA,CAAQ,CAAA,EAAA,EAHtE,KAAK,CAAC,EAAE,CAIZ;AAEV,gBAAA,CAAC,CAAC,EAAA,CACE,EAGND,sBAAA,CAAC,GAAG,EAAA,EACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,MAAM,CAAC,QAAQ,EAC5B,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,EAAA,QAAA,EAAA,CAE9BA,sBAAA,CAAC,GAAG,EAAA,EAAA,QAAA,EAAA,CACFC,qBAAA,CAAC,QAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,WAAW,EAAA,CAAG,EACzCA,qBAAA,CAAC,QAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAA,CAAG,EACpCA,qBAAA,CAAC,QAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,QAAQ,EAAA,CAAG,EACtCA,qBAAA,CAAC,QAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAE,CAAA,QAAA,EAAW,UAAU,CAAA,CAAE,EAAA,CAAI,EACvDA,qBAAA,CAAC,QAAQ,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAE,CAAA,MAAA,EAAS,UAAU,CAAA,CAAE,EAAA,CAAI,CAAA,EAAA,CACjD,EACND,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,CACxB,YAAY,GAAG,CAAC,EAAA,GAAA,EAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,YAAY,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAA,GAAA,EAAG,gBAAgB,CAAC,MAAM,CAAA,EAAA,CACvG,CAAA,EAAA,CACH,CAAA,EAAA,CACF;AAEV;AAEA,SAAS,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,EAAqC,EAAA;IACpE,QACEA,sBAAA,CAAC,GAAG,EAAA,EAAC,WAAW,EAAE,CAAC,EAAA,QAAA,EAAA,CACjBC,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,GAAA,EAAA,CAAU,EACrCA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,YAAG,MAAM,EAAA,CAAQ,EACzCA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,GAAA,EAAA,CAAU,EACrCA,sBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAG,KAAK,EAAA,CAAQ,CAAA,EAAA,CACpC;AAEV;;AC1OM,SAAU,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAiB,EAAA;AACtF,IAAA,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AACtB,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACd,YAAA,QAAQ,EAAE;QACZ;AAAO,aAAA,IAAI,KAAK,KAAK,GAAG,EAAE;YACxB,QAAQ,CAAC,SAAS,CAAC;QACrB;AAAO,aAAA,IAAI,KAAK,KAAK,GAAG,EAAE;YACxB,QAAQ,CAAC,QAAQ,CAAC;QACpB;AAAO,aAAA,IAAI,KAAK,KAAK,GAAG,EAAE;YACxB,QAAQ,CAAC,SAAS,CAAC;QACrB;AAAO,aAAA,IAAI,KAAK,KAAK,GAAG,EAAE;YACxB,QAAQ,CAAC,KAAK,CAAC;QACjB;AAAO,aAAA,IAAI,KAAK,KAAK,GAAG,EAAE;YACxB,QAAQ,CAAC,OAAO,CAAC;QACnB;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,QACED,sBAAA,CAAC,GAAG,EAAA,EACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,MAAM,CAAC,IAAI,EACxB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,EAAA,QAAA,EAAA,CAEXC,qBAAA,CAAC,GAAG,EAAA,EAAC,YAAY,EAAE,CAAC,EAAA,QAAA,EAClBA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,CAAiB,EAAA,CAC3C,EAEND,sBAAA,CAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzCC,qBAAA,CAAC,UAAU,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAE,CAAA,cAAA,EAAiB,YAAY,CAAA,OAAA,CAAS,EAAA,CAAI,EACxEA,qBAAA,CAAC,UAAU,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,oBAAoB,EAAA,CAAG,EACpDA,qBAAA,CAAC,UAAU,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,qBAAqB,EAAA,CAAG,EACrDA,qBAAA,CAAC,UAAU,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAE,CAAA,oBAAA,EAAuB,UAAU,CAAA,OAAA,CAAS,EAAA,CAAI,EAC5EA,sBAAC,UAAU,EAAA,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,eAAe,EAAA,CAAG,CAAA,EAAA,CAC3C,EAENA,qBAAA,CAAC,GAAG,EAAA,EAAA,QAAA,EACFA,qBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,cAAA,EAAA,CAAqB,EAAA,CAC5C,CAAA,EAAA,CACF;AAEV;AAEA,SAAS,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,EAAqC,EAAA;IACtE,QACED,uBAAC,GAAG,EAAA,EAAA,QAAA,EAAA,CACFC,sBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,GAAA,EAAA,CAAU,EACrCA,sBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAG,MAAM,GAAQ,EACzCA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,GAAA,EAAA,CAAU,EACrCD,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,kBAAI,KAAK,CAAA,EAAA,CAAQ,CAAA,EAAA,CACtC;AAEV;;SC1BgB,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,EAAwB,EAAA;AACtE,IAAA,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE;AACzB,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE;AAC9B,IAAA,MAAM,cAAc,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE;AACzC,IAAA,MAAM,aAAa,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE;;IAG3C,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,aAAa,EAAE;AAClD,IAAA,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC;IACrC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAGF,qBAAQ,CAAW,WAAW,CAAC;;AAGvD,IAAA,MAAM,mBAAmB,GAAGK,mBAAM,CAAC,KAAK,CAAC;;AAGzC,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,IAAI,wBAAwB;;AAG9D,IAAA,MAAM,iBAAiB,GAAGC,wBAAW,CAAC,MAAK;AACzC,QAAA,WAAW,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,MAAK;;AAErC,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;;IAGlBL,sBAAS,CAAC,MAAK;QACb,IAAI,UAAU,CAAC,WAAW,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE;AAC1D,YAAA,mBAAmB,CAAC,OAAO,GAAG,IAAI;;YAElC,UAAU,CAAC,MAAK;AACd,gBAAA,iBAAiB,EAAE;YACrB,CAAC,EAAE,GAAG,CAAC;QACT;IACF,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;;AAG/C,IAAA,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;;QAEtB,IAAI,KAAK,KAAK,GAAG,IAAI,IAAI,KAAK,UAAU,EAAE;YACxC,IAAI,MAAM,EAAE;AACV,gBAAA,MAAM,EAAE;YACV;AACA,YAAA,IAAI,EAAE;YACN;QACF;;AAGA,QAAA,IAAI,IAAI,KAAK,UAAU,EAAE;AACvB,YAAA,OAAO;QACT;;AAGA,QAAA,IAAI,IAAI,KAAK,WAAW,EAAE;AACxB,YAAA,IAAI,KAAK,KAAK,GAAG,EAAE;gBACjB,YAAY,CAAC,aAAa,EAAE;YAC9B;AAAO,iBAAA,IAAI,KAAK,KAAK,GAAG,EAAE;gBACxB,OAAO,CAAC,UAAU,CAAC;YACrB;AAAO,iBAAA,IAAI,KAAK,KAAK,GAAG,EAAE;gBACxB,OAAO,CAAC,SAAS,CAAC;YACpB;AAAO,iBAAA,IAAI,KAAK,KAAK,GAAG,EAAE;gBACxB,YAAY,CAAC,SAAS,EAAE;YAC1B;AAAO,iBAAA,IAAI,KAAK,KAAK,GAAG,EAAE;gBACxB,YAAY,CAAC,SAAS,EAAE;YAC1B;AAAO,iBAAA,IAAI,KAAK,KAAK,GAAG,EAAE;AACxB,gBAAA,iBAAiB,EAAE;YACrB;QACF;;AAGA,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,YAAA,IAAI,KAAK,KAAK,GAAG,EAAE;gBACjB,OAAO,CAAC,WAAW,CAAC;YACtB;AAAO,iBAAA,IAAI,KAAK,KAAK,GAAG,EAAE;gBACxB,OAAO,CAAC,UAAU,CAAC;YACrB;QACF;AACF,IAAA,CAAC,CAAC;;IAGF,MAAM,UAAU,GAAGK,wBAAW,CAAC,OAAO,MAA0D,KAAI;AAClG,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,YAAY,EAAE;YAC7B,IAAI,aAAa,GAAe,EAAE;YAElC,QAAQ,MAAM;AACZ,gBAAA,KAAK,SAAS;oBACZ,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;oBACtC;AACF,gBAAA,KAAK,QAAQ;AACX,oBAAA,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;oBACpC;AACF,gBAAA,KAAK,SAAS;AACZ,oBAAA,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;oBACrC;AACF,gBAAA,KAAK,KAAK;AACR,oBAAA,aAAa,GAAG,MAAM,CAAC,YAAY,EAAE;oBACrC;AACF,gBAAA,KAAK,OAAO;;AAEV,oBAAA,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;oBACrC;;YAGJ,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;;YAGzC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,eAAe,CAAC;AAC/C,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC;AAC9B,YAAA,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;AACxB,YAAA,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;;QAGpB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC;QACtD;QAEA,OAAO,CAAC,WAAW,CAAC;AACtB,IAAA,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;;AAGhB,IAAA,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,IAAA,MAAM,YAAY,GAAG,CAAC,CAAC;IACvB,MAAM,eAAe,GAAG,CAAC;AACzB,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,YAAY,GAAG,YAAY,GAAG,eAAe,CAAC;;IAGjG,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC;AACvD,IAAA,MAAM,aAAa,GAAG,aAAa,GAAG,eAAe;;AAGrD,IAAA,MAAM,cAAc,GAAG,UAAU,CAAC,YAAY,KAAK,IAAI;;AAGvD,IAAA,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B;IAEhE,QACEJ,uBAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAA,QAAA,EAAA,CAEtEC,qBAAA,CAAC,MAAM,KAAG,EAGT,eAAe,KACdD,sBAAA,CAAC,GAAG,IAAC,cAAc,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAA,QAAA,EAAA,CACtCC,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,2BAAA,EAAA,CAA6B,EACrDA,qBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAG,eAAe,EAAA,CAAQ,EACrDA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,cAAA,EAAA,CAAgB,EAC3CA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,oCAA4B,EACpDA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,YAAA,EAAA,CAAmB,CAAA,EAAA,CAC1C,CACP,EAGDD,uBAAC,GAAG,EAAA,EACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,MAAM,CAAC,QAAQ,EAC5B,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,EAAA,QAAA,EAAA,CAE9BA,uBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,CAAA,UAAA,EACjBC,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAG,MAAM,CAAC,QAAQ,EAAA,CAAQ,EAAA,kBAAA,EAAWA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,EAAA,CAAQ,CAAA,EAAA,CAC7I,EACPD,sBAAA,CAAC,GAAG,EAAA,EAAA,QAAA,EAAA,CACFC,sBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,UAAU,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,EAAA,QAAA,EAChE,UAAU,CAAC,WAAW,GAAG,GAAG,GAAG,GAAG,EAAA,CAC9B,EACPD,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,aACrB,GAAG,EAAE,UAAU,CAAC,WAAW,GAAG,WAAW,GAAG,cAAc,IACtD,CAAA,EAAA,CACH,CAAA,EAAA,CACF,EAGL,IAAI,KAAK,WAAW,KACnBA,sBAAA,CAAC,GAAG,EAAA,EAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAA,QAAA,EAAA,CACpC,cAAc,KACbC,qBAAA,CAAC,UAAU,EAAA,EACT,KAAK,EAAE,UAAU,CAAC,YAAY,EAC9B,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,aAAa,EAAA,CACrB,CACH,EACDA,qBAAA,CAAC,QAAQ,EAAA,EACP,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,UAAU,CAAC,SAAS,EAC/B,KAAK,EAAE,cAAc,GAAG,aAAa,GAAG,aAAa,EACrD,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,IAAI,EAAA,CACf,CAAA,EAAA,CACE,CACP,EAEA,IAAI,KAAK,SAAS,KACjBA,sBAAC,WAAW,EAAA,EACV,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,EAClC,MAAM,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,EAAA,CACjC,CACH,EAGA,IAAI,KAAK,UAAU,KAClBA,qBAAA,CAAC,GAAG,EAAA,EACF,QAAQ,EAAC,UAAU,EACnB,aAAa,EAAC,QAAQ,EACtB,cAAc,EAAC,QAAQ,EACvB,UAAU,EAAC,QAAQ,EACnB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,EAAA,QAAA,EAEtBA,qBAAA,CAAC,QAAQ,IACP,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,EACpC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC,EAC7C,UAAU,EAAE,YAAY,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAA,CAChD,EAAA,CACE,CACP,EAGA,IAAI,KAAK,WAAW,KACnBA,qBAAA,CAAC,SAAS,EAAA,EACR,WAAW,EAAE,UAAU,CAAC,WAAW,EACnC,SAAS,EAAE,UAAU,CAAC,SAAS,EAC/B,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,EACpC,iBAAiB,EAAE,UAAU,CAAC,iBAAiB,EAC/C,IAAI,EAAE,IAAI,EAAA,CACV,CACH,CAAA,EAAA,CACG;AAEV;;AC9PA;AACA,MAAM,WAAW,GAAG,wBAAwB;AAC5C,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC;AAElE;;;AAGG;AACH,SAAS,YAAY,CAAC,GAAW,EAAA;AAC/B,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,GAAG;;AAGpB,IAAA,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE;AAC9B,QAAA,OAAO,GAAG;IACZ;;AAGA,IAAA,IAAI,GAAG,CAAC,KAAK,CAAC,oCAAoC,CAAC,EAAE;QACnD,OAAO,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE;IACxB;;IAGA,OAAO,CAAA,QAAA,EAAW,GAAG,CAAA,CAAE;AACzB;AAEA;;;AAGG;AACH,SAAS,WAAW,CAAC,OAAe,EAAA;AAClC,IAAA,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC;AACxC,IAAA,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,OAAO;IACzE,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;;IAEvD,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACjD,IAAA,OAAO,CAAA,EAAG,UAAU,CAAA,EAAG,aAAa,YAAY;AAClD;AAEA;;AAEG;AACH,SAAS,iBAAiB,GAAA;AACxB,IAAA,IAAI;AACF,QAAA,OAAO,QAAQ,EAAE,CAAC,QAAQ;IAC5B;AAAE,IAAA,MAAM;;AAEN,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,QAAQ;IAC7D;AACF;AAaA;;AAEG;AACH,SAAS,YAAY,CAAC,OAAmB,EAAA;;IAEvC,IAAI,OAAO,CAAC,KAAK;AAAE,QAAA,OAAO,KAAK;;AAG/B,IAAA,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM;AAAE,QAAA,OAAO,KAAK;;AAGrE,IAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;AAAE,QAAA,OAAO,KAAK;;AAGvC,IAAA,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG;AAAE,QAAA,OAAO,KAAK;AAE5C,IAAA,OAAO,IAAI;AACb;AAEO,eAAe,UAAU,CAAC,OAAmB,EAAA;;AAElD,IAAA,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,QAAA,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,MAAM;QAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC;IAC3E;AAEA,IAAA,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC;;;;;;;IASpC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC;;IAGvD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC;;;AAInD,IAAA,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE;IAClC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,iBAAiB;;IAG5E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,iBAAiB,EAAE;;;;AAKxD,IAAA,MAAM,YAAY,GAAG,aAAa,CAAC,SAAS,EAAE;IAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,KAAK,YAAY,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,SAAS,CAAC;AAEnG,IAAA,MAAM,aAAa,GAAG;QACpB,KAAK;QACL,MAAM;QACN,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,OAAO,EAAE,OAAO,CAAC,OAAO;AACxB,QAAA,OAAO,EAAE,MAAM;KAChB;;;AAID,IAAA,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;;QAE/B,IAAI,cAAc,EAAE,EAAE;AACpB,YAAA,MAAM,WAAW,GAAG,cAAc,EAAE;YACpC,IAAI,WAAW,EAAE;AACf,gBAAA,aAAa,CAAC,YAAY,GAAG,WAAW;gBACxC,MAAM,CAAC,IAAI,CAAC,CAAA,2BAAA,EAA8B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAA,CAAE,CAAC;YAC/F;QACF;;QAGA,IAAI,CAAC,aAAa,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACjD,YAAA,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC;AACtE,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAEf,YAAA,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;gBACrC,MAAM,EAAE,aAAa,CAAC,MAAM;AAC5B,gBAAA,MAAM,EAAE,KAAK;AACd,aAAA,CAAC;YAEF,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE;gBAClC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC;AAC9C,gBAAA,aAAa,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK;AACzC,gBAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACd,gBAAA,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,CAAA,OAAA,EAAU,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAA,CAAE,CAAC;AAC1E,gBAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB;iBAAO;gBACL,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,uBAAuB,CAAC;AACrD,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACf,gBAAA,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC;AACrD,gBAAA,MAAM,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA,CAAE,CAAC;AAC3E,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACf,gBAAA,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAC9B,gBAAA,MAAM,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA,CAAE,CAAC;AACnD,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB;QACF;;QAGA,IAAI,CAAC,aAAa,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACjD,YAAA,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC;AACzC,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACf,YAAA,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC;AAChF,YAAA,MAAM,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA,CAAE,CAAC;AAC3E,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACf,YAAA,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC;AACnC,YAAA,MAAM,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA,CAAE,CAAC;AACnD,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjB;IACF;;;;IAKA,IAAI,CAAC,MAAM,EAAE;;AAEX,QAAA,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC;AAC7C,QAAA,MAAM,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA,CAAE,CAAC;AACzD,QAAA,MAAM,CAAC,IAAI,CAAC,CAAA,SAAA,EAAY,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA,CAAE,CAAC;AAC3D,QAAA,MAAM,CAAC,IAAI,CAAC,CAAA,WAAA,EAAc,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA,CAAE,CAAC;AAC/D,QAAA,MAAM,CAAC,IAAI,CAAC,CAAA,WAAA,EAAc,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA,CAAE,CAAC;AAChE,QAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAEd,QAAA,IAAI,OAAO,CAAC,OAAO,EAAE;AACnB,YAAA,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC;AACvC,YAAA,MAAM,CAAC,KAAK,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA,CAAE,CAAC;QACzE;AAEA,QAAA,IAAI;;AAEF,YAAA,MAAM,WAAW,CAAC,aAAa,CAAC;QAClC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC;AACvC,YAAA,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,eAAe,CAAC;YACtE,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,gBAAA,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;YAC3B;AACA,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjB;QACA;IACF;;;;;;AAQA,IAAA,gBAAgB,CAAC;AACf,QAAA,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;AACjC,QAAA,OAAO,EAAE,IAAI;AACd,KAAA,CAAC;;IAGF,oBAAoB,CAAC,IAAI,CAAC;;AAG1B,IAAA,IAAI,eAAkD;;IAGtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;;AAGtC,IAAA,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE;AAC5B,QAAA,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;IAChC;AACA,IAAA,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE;;AAGtB,IAAA,MAAM,UAAU,GAAG,YAAW;;AAE5B,QAAA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;AAEnC,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAE3D,IAAI,eAAe,EAAE;AACnB,YAAA,IAAI;gBACF,MAAM,eAAe,EAAE;AACvB,gBAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC;YACnD;YAAE,OAAO,CAAC,EAAE;AACV,gBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,yBAAyB,EAAE,CAAC,CAAC;YAC9D;QACF;AAEA,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,IAAA,CAAC;;AAGD,IAAA,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;;AAGhC,IAAA,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,MAAM,CACrC,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE;AACnC,QAAA,MAAM,EAAE;YACN,QAAQ;AACR,YAAA,SAAS,EAAE,KAAK;YAChB,SAAS;YACT,MAAM;AACP,SAAA;AACD,QAAA,MAAM,EAAE,UAAU;AACnB,KAAA,CAAC,EACF;QACE,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE,KAAK;AACpB,KAAA,CACF;AAED,IAAA,IAAI;;AAEF,QAAA,eAAe,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC;;QAGlD,MAAM,aAAa,EAAE;;AAGrB,QAAA,KAAK,EAAE;QACP,MAAM,UAAU,EAAE;IACpB;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,KAAK,EAAE;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAEpC,QAAA,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC;AACvC,QAAA,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,eAAe,CAAC;QACtE,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,YAAA,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QAC3B;AACA,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner-logger-instance-nDWv2h2T.js","sources":["../../src/lib/file-logger.ts","../../src/lib/logging/log-buffer.ts","../../src/lib/logging/runner-logger.ts","../../src/lib/logging/runner-logger-instance.ts"],"sourcesContent":["/**\n * File-based logger for debugging when TUI console interception interferes\n * Writes to /logs directory for easy tail -f monitoring\n */\n\nimport { appendFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nconst LOGS_DIR = join(process.cwd(), 'logs');\nconst RUNNER_LOG = join(LOGS_DIR, 'runner.log');\nconst STREAM_LOG = join(LOGS_DIR, 'stream.log');\nconst ERRORS_LOG = join(LOGS_DIR, 'errors.log');\n\n// Ensure logs directory exists\nif (!existsSync(LOGS_DIR)) {\n mkdirSync(LOGS_DIR, { recursive: true });\n}\n\nfunction timestamp(): string {\n return new Date().toISOString();\n}\n\nfunction writeLog(file: string, level: string, ...args: unknown[]): void {\n const message = args.map(arg =>\n typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)\n ).join(' ');\n\n const logLine = `[${timestamp()}] [${level}] ${message}\\n`;\n\n try {\n appendFileSync(file, logLine);\n } catch (err) {\n // Silently fail - don't want logging to crash the app\n console.error('Failed to write log:', err);\n }\n}\n\n/**\n * General runner logs - everything goes here\n */\nexport const fileLog = {\n info: (...args: unknown[]) => writeLog(RUNNER_LOG, 'INFO', ...args),\n warn: (...args: unknown[]) => writeLog(RUNNER_LOG, 'WARN', ...args),\n error: (...args: unknown[]) => {\n writeLog(RUNNER_LOG, 'ERROR', ...args);\n writeLog(ERRORS_LOG, 'ERROR', ...args);\n },\n debug: (...args: unknown[]) => writeLog(RUNNER_LOG, 'DEBUG', ...args),\n};\n\n/**\n * Stream-specific logs - for tracking AI SDK events\n */\nexport const streamLog = {\n info: (...args: unknown[]) => writeLog(STREAM_LOG, 'INFO', ...args),\n warn: (...args: unknown[]) => writeLog(STREAM_LOG, 'WARN', ...args),\n event: (eventNumber: number, eventType: string, data: unknown) => {\n writeLog(STREAM_LOG, 'EVENT', `#${eventNumber} type=\"${eventType}\"`, data);\n },\n yield: (messageType: string, data: unknown) => {\n writeLog(STREAM_LOG, 'YIELD', `type=\"${messageType}\"`, data);\n },\n error: (...args: unknown[]) => {\n writeLog(STREAM_LOG, 'ERROR', ...args);\n writeLog(ERRORS_LOG, 'ERROR', ...args);\n },\n};\n\n// TUI mode flag - when true, don't output to terminal (only to file)\nlet tuiModeEnabled = false;\n\n/**\n * Enable TUI mode - suppresses terminal output, only writes to files\n * Also sets SILENT_MODE env var to suppress agent-core build-logger output\n */\nexport function setFileLoggerTuiMode(enabled: boolean): void {\n tuiModeEnabled = enabled;\n // Set env var so agent-core's build-logger also silences itself\n if (enabled) {\n process.env.SILENT_MODE = '1';\n } else {\n delete process.env.SILENT_MODE;\n }\n}\n\n// Intercept console methods to also write to file\nconst originalConsole = {\n log: console.log,\n error: console.error,\n warn: console.warn,\n info: console.info,\n debug: console.debug,\n};\n\n// Export original console for when we need direct output\nexport { originalConsole };\n\n// Helper to check if we should suppress terminal output\n// Check both the runtime flag AND the environment variable (set early in CLI)\nfunction shouldSuppressTerminal(): boolean {\n return tuiModeEnabled || process.env.SILENT_MODE === '1';\n}\n\n// Override console methods to write to file (and optionally terminal)\nconsole.log = (...args: unknown[]) => {\n if (!shouldSuppressTerminal()) {\n originalConsole.log(...args);\n }\n fileLog.info(...args);\n};\n\nconsole.error = (...args: unknown[]) => {\n if (!shouldSuppressTerminal()) {\n originalConsole.error(...args);\n }\n fileLog.error(...args);\n};\n\nconsole.warn = (...args: unknown[]) => {\n if (!shouldSuppressTerminal()) {\n originalConsole.warn(...args);\n }\n fileLog.warn(...args);\n};\n\nconsole.info = (...args: unknown[]) => {\n if (!shouldSuppressTerminal()) {\n originalConsole.info(...args);\n }\n fileLog.info(...args);\n};\n\nconsole.debug = (...args: unknown[]) => {\n if (!shouldSuppressTerminal()) {\n originalConsole.debug(...args);\n }\n fileLog.debug(...args);\n};\n\n// Log startup\nfileLog.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');\nfileLog.info('Runner started - console interception enabled');\nfileLog.info('Log files:');\nfileLog.info(` - General: ${RUNNER_LOG}`);\nfileLog.info(` - Stream: ${STREAM_LOG}`);\nfileLog.info(` - Errors: ${ERRORS_LOG}`);\nfileLog.info('All console.log/error/warn/info/debug will be captured here');\nfileLog.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');\n","/**\n * LogBuffer - File-backed circular buffer for log entries\n * \n * Maintains an in-memory buffer of the most recent 100 entries\n * and persists all logs to a file for full history access.\n */\n\nimport { existsSync, mkdirSync, appendFileSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { EventEmitter } from 'node:events';\nimport type { LogEntry, LogFilter } from './types.js';\n\nconst DEFAULT_BUFFER_SIZE = 100;\nconst LOG_DIR = 'logs';\nconst LOG_FILE = 'runner-tui.log';\n\nexport class LogBuffer extends EventEmitter {\n private buffer: LogEntry[] = [];\n private maxSize: number;\n private logFilePath: string;\n private sessionStartTime: number;\n\n constructor(options?: { maxSize?: number; logDir?: string }) {\n super();\n this.maxSize = options?.maxSize ?? DEFAULT_BUFFER_SIZE;\n this.sessionStartTime = Date.now();\n \n // Set up log file path\n const logDir = options?.logDir ?? LOG_DIR;\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true });\n }\n this.logFilePath = join(logDir, LOG_FILE);\n \n // Write session start marker\n this.writeToFile(`\\n${'='.repeat(60)}\\n`);\n this.writeToFile(`SESSION START: ${new Date().toISOString()}\\n`);\n this.writeToFile(`${'='.repeat(60)}\\n\\n`);\n }\n\n /**\n * Add a log entry to the buffer and file\n */\n add(entry: LogEntry): void {\n // Add to in-memory buffer (circular)\n this.buffer.push(entry);\n if (this.buffer.length > this.maxSize) {\n this.buffer.shift();\n }\n\n // Write to file\n this.writeToFile(this.formatEntryForFile(entry));\n\n // Emit event for subscribers (TUI components)\n this.emit('log', entry);\n }\n\n /**\n * Get the most recent N entries from memory\n */\n getRecent(count?: number): LogEntry[] {\n const n = count ?? this.maxSize;\n return this.buffer.slice(-n);\n }\n\n /**\n * Get all entries currently in memory\n */\n getAll(): LogEntry[] {\n return [...this.buffer];\n }\n\n /**\n * Get filtered entries from memory\n */\n getFiltered(filter: LogFilter): LogEntry[] {\n return this.buffer.filter(entry => this.matchesFilter(entry, filter));\n }\n\n /**\n * Read entries from the log file (for full history)\n * Returns parsed log entries from the current session\n */\n readFromFile(maxLines?: number): LogEntry[] {\n if (!existsSync(this.logFilePath)) {\n return [];\n }\n\n try {\n const content = readFileSync(this.logFilePath, 'utf-8');\n const lines = content.split('\\n').filter(line => line.trim());\n \n // Find the last session marker and only read from there\n let sessionStart = 0;\n for (let i = lines.length - 1; i >= 0; i--) {\n if (lines[i].includes('SESSION START:')) {\n sessionStart = i + 1;\n break;\n }\n }\n\n const sessionLines = lines.slice(sessionStart);\n const entries: LogEntry[] = [];\n\n for (const line of sessionLines) {\n const parsed = this.parseLogLine(line);\n if (parsed) {\n entries.push(parsed);\n }\n }\n\n if (maxLines && entries.length > maxLines) {\n return entries.slice(-maxLines);\n }\n\n return entries;\n } catch (error) {\n console.error('Failed to read log file:', error);\n return [];\n }\n }\n\n /**\n * Get the log file path for external access\n */\n getLogFilePath(): string {\n return this.logFilePath;\n }\n\n /**\n * Convert buffer contents to plain text (for copying)\n */\n toText(entries?: LogEntry[]): string {\n const items = entries ?? this.buffer;\n return items.map(entry => this.formatEntryForDisplay(entry)).join('\\n');\n }\n\n /**\n * Clear the in-memory buffer (file is preserved)\n */\n clear(): void {\n this.buffer = [];\n this.emit('clear');\n }\n\n /**\n * Subscribe to new log entries\n */\n onLog(callback: (entry: LogEntry) => void): () => void {\n this.on('log', callback);\n return () => this.off('log', callback);\n }\n\n // Private methods\n\n private writeToFile(content: string): void {\n try {\n appendFileSync(this.logFilePath, content);\n } catch (error) {\n // Silently fail - don't break logging if file write fails\n }\n }\n\n private formatEntryForFile(entry: LogEntry): string {\n const timestamp = new Date(entry.timestamp).toISOString();\n const level = entry.level.toUpperCase().padEnd(7);\n const category = entry.category.padEnd(12);\n \n let line = `[${timestamp}] [${level}] [${category}] ${entry.message}`;\n \n if (entry.toolName) {\n line += ` | tool=${entry.toolName}`;\n if (entry.toolArgs) {\n line += ` args=${entry.toolArgs}`;\n }\n }\n \n if (entry.buildId) {\n line += ` | build=${entry.buildId}`;\n }\n \n if (entry.data && Object.keys(entry.data).length > 0) {\n line += ` | data=${JSON.stringify(entry.data)}`;\n }\n \n return line + '\\n';\n }\n\n private formatEntryForDisplay(entry: LogEntry): string {\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 levelIcon = {\n debug: ' ',\n info: '●',\n success: '✓',\n warn: '⚠',\n error: '✗',\n }[entry.level];\n\n if (entry.toolName) {\n return `${time} 🔧 ${entry.toolName}${entry.toolArgs ? ` ${entry.toolArgs}` : ''}`;\n }\n\n return `${time} ${levelIcon} ${entry.message}`;\n }\n\n private parseLogLine(line: string): LogEntry | null {\n // Parse format: [ISO_TIMESTAMP] [LEVEL ] [CATEGORY ] message | key=value...\n const match = line.match(/^\\[([^\\]]+)\\] \\[([^\\]]+)\\] \\[([^\\]]+)\\] (.+)$/);\n if (!match) {\n return null;\n }\n\n const [, timestamp, levelRaw, categoryRaw, rest] = match;\n const level = levelRaw.trim().toLowerCase() as LogEntry['level'];\n const category = categoryRaw.trim() as LogEntry['category'];\n\n // Parse message and optional fields\n const parts = rest.split(' | ');\n const message = parts[0];\n\n const entry: LogEntry = {\n id: `${Date.parse(timestamp)}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: Date.parse(timestamp),\n level,\n category,\n message,\n };\n\n // Parse optional key=value pairs\n for (let i = 1; i < parts.length; i++) {\n const [key, ...valueParts] = parts[i].split('=');\n const value = valueParts.join('=');\n \n switch (key) {\n case 'tool':\n entry.toolName = value;\n break;\n case 'args':\n entry.toolArgs = value;\n break;\n case 'build':\n entry.buildId = value;\n break;\n case 'data':\n try {\n entry.data = JSON.parse(value);\n } catch {\n // Ignore parse errors\n }\n break;\n }\n }\n\n return entry;\n }\n\n private matchesFilter(entry: LogEntry, filter: LogFilter): boolean {\n if (filter.levels && !filter.levels.includes(entry.level)) {\n return false;\n }\n \n if (filter.categories && !filter.categories.includes(entry.category)) {\n return false;\n }\n \n if (filter.buildId && entry.buildId !== filter.buildId) {\n return false;\n }\n \n if (filter.verbose === false && entry.verbose) {\n return false;\n }\n \n if (filter.search) {\n const searchLower = filter.search.toLowerCase();\n const messageMatch = entry.message.toLowerCase().includes(searchLower);\n const toolMatch = entry.toolName?.toLowerCase().includes(searchLower);\n const argsMatch = entry.toolArgs?.toLowerCase().includes(searchLower);\n \n if (!messageMatch && !toolMatch && !argsMatch) {\n return false;\n }\n }\n \n return true;\n }\n}\n\n// Singleton instance\nlet instance: LogBuffer | null = null;\n\nexport function getLogBuffer(): LogBuffer {\n if (!instance) {\n instance = new LogBuffer();\n }\n return instance;\n}\n\nexport function createLogBuffer(options?: { maxSize?: number; logDir?: string }): LogBuffer {\n instance = new LogBuffer(options);\n return instance;\n}\n","/**\n * RunnerLogger - Unified logging for the OpenBuilder Runner\n * \n * Provides structured logging with:\n * - Verbose mode filtering\n * - Build lifecycle tracking\n * - Tool call logging with truncated args\n * - Event emission for TUI components\n * - File persistence via LogBuffer\n */\n\nimport { EventEmitter } from 'node:events';\nimport chalk from 'chalk';\nimport { LogBuffer, getLogBuffer, createLogBuffer } from './log-buffer.js';\nimport type {\n LogEntry,\n LogLevel,\n LogCategory,\n BuildInfo,\n TodoItem,\n BuildCompletionStats,\n LoggerEvents,\n} from './types.js';\n\nconst MAX_ARG_LENGTH = 40;\nconst MAX_MESSAGE_LENGTH = 80;\n\nexport interface RunnerLoggerOptions {\n verbose?: boolean;\n tuiMode?: boolean;\n logDir?: string;\n}\n\nexport class RunnerLogger extends EventEmitter {\n private verbose: boolean;\n private tuiMode: boolean;\n private buffer: LogBuffer;\n private builds: Map<string, BuildInfo> = new Map();\n private currentBuildId: string | null = null;\n private connected: boolean = false;\n\n constructor(options?: RunnerLoggerOptions) {\n super();\n this.verbose = options?.verbose ?? false;\n this.tuiMode = options?.tuiMode ?? true;\n this.buffer = options?.logDir \n ? createLogBuffer({ logDir: options.logDir })\n : getLogBuffer();\n }\n\n // ============================================\n // Configuration\n // ============================================\n\n setVerbose(verbose: boolean): void {\n this.verbose = verbose;\n this.emit('verboseChange', verbose);\n }\n\n isVerbose(): boolean {\n return this.verbose;\n }\n\n setTuiMode(tuiMode: boolean): void {\n this.tuiMode = tuiMode;\n }\n\n // ============================================\n // Connection Status\n // ============================================\n\n setConnected(connected: boolean): void {\n this.connected = connected;\n if (connected) {\n this.success('system', 'Connected to server');\n this.emit('connected');\n } else {\n this.warn('system', 'Disconnected from server');\n this.emit('disconnected');\n }\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n // ============================================\n // Startup / Header\n // ============================================\n\n /**\n * Print the startup header with runner configuration\n */\n header(config: {\n runnerId: string;\n serverUrl: string;\n workspace: string;\n apiUrl?: string;\n }): void {\n if (this.tuiMode) {\n // In TUI mode, header is rendered by the dashboard\n // Just emit the config for the TUI to use\n this.emit('config', config);\n return;\n }\n\n // Plain text mode - print formatted header\n const line = '━'.repeat(60);\n console.log(chalk.cyan(line));\n console.log(chalk.cyan.bold(' OpenBuilder Runner'));\n console.log(chalk.cyan(line));\n console.log(chalk.gray(' Runner ID '), chalk.white(config.runnerId));\n console.log(chalk.gray(' Server '), chalk.white(config.serverUrl));\n console.log(chalk.gray(' Workspace '), chalk.white(config.workspace));\n if (config.apiUrl) {\n console.log(chalk.gray(' API '), chalk.white(config.apiUrl));\n }\n console.log(chalk.cyan(line));\n console.log();\n }\n\n // ============================================\n // Generic Log Methods\n // ============================================\n\n info(category: LogCategory, message: string, data?: Record<string, unknown>): void {\n this.log('info', category, message, data);\n }\n\n success(category: LogCategory, message: string, data?: Record<string, unknown>): void {\n this.log('success', category, message, data);\n }\n\n warn(category: LogCategory, message: string, data?: Record<string, unknown>): void {\n this.log('warn', category, message, data);\n }\n\n error(category: LogCategory, message: string, data?: Record<string, unknown>): void {\n this.log('error', category, message, data);\n }\n\n debug(category: LogCategory, message: string, data?: Record<string, unknown>): void {\n this.log('debug', category, message, data, true);\n }\n\n // ============================================\n // Build Lifecycle\n // ============================================\n\n /**\n * Log when a build command is received\n */\n buildReceived(build: {\n commandId: string;\n projectId: string;\n projectSlug: string;\n projectName?: string;\n prompt: string;\n operation: string;\n agent: string;\n model: string;\n }): void {\n const buildInfo: BuildInfo = {\n id: build.commandId,\n projectId: build.projectId,\n projectSlug: build.projectSlug,\n projectName: build.projectName,\n prompt: build.prompt,\n operation: build.operation,\n agent: build.agent,\n model: build.model,\n startTime: Date.now(),\n status: 'pending',\n todos: [],\n toolCallCount: 0,\n };\n\n this.builds.set(build.commandId, buildInfo);\n this.currentBuildId = build.commandId;\n\n // Log the build received event\n this.info('build', `Build received: ${build.projectSlug}`, { buildId: build.commandId });\n \n // Log the prompt (truncated in normal mode, full in verbose)\n const truncatedPrompt = this.truncate(build.prompt, this.verbose ? 200 : 60);\n this.log('info', 'build', `Prompt: \"${truncatedPrompt}\"`, undefined, !this.verbose && build.prompt.length > 60);\n \n this.log('info', 'build', `Operation: ${build.operation}`, undefined, true);\n\n this.emit('buildStart', buildInfo);\n }\n\n /**\n * Log template selection and download\n */\n template(info: {\n name: string;\n id?: string;\n source?: string;\n fileCount?: number;\n status: 'selected' | 'downloading' | 'downloaded';\n }): void {\n switch (info.status) {\n case 'selected':\n this.info('template', `Template: ${info.name}${info.id ? ` (${info.id})` : ''}`);\n break;\n case 'downloading':\n this.log('info', 'template', `Downloading from ${info.source}...`, undefined, true);\n break;\n case 'downloaded':\n this.info('template', `Downloaded (${info.fileCount} files)`);\n break;\n }\n\n if (this.currentBuildId) {\n const build = this.builds.get(this.currentBuildId);\n if (build) {\n build.template = info.name;\n build.templateId = info.id;\n this.emit('buildUpdate', build);\n }\n }\n }\n\n /**\n * Log when build execution starts\n */\n buildStart(info?: { agent?: string; model?: string; directory?: string }): void {\n this.info('build', 'Build started');\n \n if (info?.agent) {\n this.log('info', 'build', `Agent: ${info.agent}${info.model ? ` (${info.model})` : ''}`, undefined, true);\n }\n \n if (info?.directory) {\n this.log('info', 'build', `Directory: ${info.directory}`, undefined, true);\n }\n\n if (this.currentBuildId) {\n const build = this.builds.get(this.currentBuildId);\n if (build) {\n build.status = 'running';\n build.directory = info?.directory;\n this.emit('buildUpdate', build);\n }\n }\n }\n\n /**\n * Log build completion\n */\n buildComplete(stats: BuildCompletionStats): void {\n const elapsed = this.formatDuration(stats.elapsedTime);\n this.success('build', `Build complete (${elapsed})`);\n this.info('build', `Tool calls: ${stats.toolCallCount} | Tokens: ${stats.totalTokens.toLocaleString()}`);\n this.log('info', 'build', `Directory: ${stats.directory}`, undefined, true);\n\n if (this.currentBuildId) {\n const build = this.builds.get(this.currentBuildId);\n if (build) {\n build.status = 'completed';\n build.endTime = Date.now();\n build.totalTokens = stats.totalTokens;\n this.emit('buildComplete', build, stats);\n }\n this.currentBuildId = null;\n }\n }\n\n /**\n * Log build failure\n */\n buildFailed(error: string | Error): void {\n const message = error instanceof Error ? error.message : error;\n this.error('build', `Build failed: ${message}`);\n\n if (this.currentBuildId) {\n const build = this.builds.get(this.currentBuildId);\n if (build) {\n build.status = 'failed';\n build.endTime = Date.now();\n build.error = message;\n this.emit('buildComplete', build, {\n elapsedTime: (build.endTime - build.startTime) / 1000,\n toolCallCount: build.toolCallCount,\n totalTokens: build.totalTokens ?? 0,\n directory: build.directory ?? '',\n });\n }\n this.currentBuildId = null;\n }\n }\n\n // ============================================\n // Tool Calls\n // ============================================\n\n /**\n * Log a tool call with truncated arguments\n */\n tool(toolName: string, args?: Record<string, unknown> | string): void {\n const truncatedArgs = this.formatToolArgs(toolName, args);\n \n const entry: LogEntry = {\n id: this.generateId(),\n timestamp: Date.now(),\n level: 'info',\n category: 'tool',\n message: `${toolName}${truncatedArgs ? ` ${truncatedArgs}` : ''}`,\n toolName,\n toolArgs: truncatedArgs,\n buildId: this.currentBuildId ?? undefined,\n };\n\n this.buffer.add(entry);\n \n // Increment tool count\n if (this.currentBuildId) {\n const build = this.builds.get(this.currentBuildId);\n if (build) {\n build.toolCallCount++;\n this.emit('buildUpdate', build);\n }\n }\n\n if (!this.tuiMode) {\n this.printEntry(entry);\n }\n\n this.emit('log', entry);\n }\n\n /**\n * Format tool arguments for display\n */\n private formatToolArgs(toolName: string, args?: Record<string, unknown> | string): string {\n if (!args) return '';\n \n // If already a string, just truncate it\n if (typeof args === 'string') {\n return `(${this.truncate(args, MAX_ARG_LENGTH)})`;\n }\n\n // Format based on tool type\n switch (toolName) {\n case 'Read':\n case 'read':\n case 'Write':\n case 'write':\n case 'Edit':\n case 'edit':\n // Try various path field names used by different SDKs\n const pathValue = args.filePath || args.file_path || args.path || args.target || args.file;\n if (pathValue) {\n const path = String(pathValue);\n // Show just the filename or last part of path\n const fileName = path.split('/').pop() || path;\n return fileName;\n }\n break;\n \n case 'Bash':\n if (args.command) {\n return `(${this.truncate(String(args.command), MAX_ARG_LENGTH)})`;\n }\n break;\n \n case 'Glob':\n case 'Grep':\n if (args.pattern) {\n return `(${this.truncate(String(args.pattern), MAX_ARG_LENGTH)})`;\n }\n break;\n \n case 'TodoWrite':\n if (Array.isArray(args.todos)) {\n return `(${args.todos.length} items)`;\n }\n break;\n \n default:\n // For other tools, try to show the first string value\n for (const [key, value] of Object.entries(args)) {\n if (typeof value === 'string' && value.length > 0) {\n return `(${this.truncate(value, MAX_ARG_LENGTH)})`;\n }\n }\n }\n\n return '';\n }\n\n // ============================================\n // Agent Messages\n // ============================================\n\n /**\n * Log agent thinking/message\n */\n agent(message: string): void {\n const truncated = this.truncate(message, MAX_MESSAGE_LENGTH);\n this.log('info', 'agent', truncated, undefined, message.length > MAX_MESSAGE_LENGTH);\n }\n\n // ============================================\n // Todo List Updates\n // ============================================\n\n /**\n * Update the todo list for the current build\n */\n updateTodos(todos: TodoItem[]): void {\n if (!this.currentBuildId) return;\n\n const build = this.builds.get(this.currentBuildId);\n if (build) {\n build.todos = todos;\n this.emit('todoUpdate', this.currentBuildId, todos);\n this.emit('buildUpdate', build);\n }\n }\n\n // ============================================\n // Dev Server / Tunnel\n // ============================================\n\n devServer(info: { port: number; status: 'starting' | 'started' | 'stopped' | 'error'; url?: string; error?: string }): void {\n switch (info.status) {\n case 'starting':\n this.info('server', `Starting dev server on port ${info.port}...`);\n break;\n case 'started':\n this.success('server', `Dev server running on port ${info.port}`);\n if (info.url) {\n this.info('server', `URL: ${info.url}`);\n }\n break;\n case 'stopped':\n this.info('server', 'Dev server stopped');\n break;\n case 'error':\n this.error('server', `Dev server error: ${info.error}`);\n break;\n }\n }\n\n tunnel(info: { port: number; url?: string; status: 'creating' | 'created' | 'closed' | 'error'; error?: string }): void {\n switch (info.status) {\n case 'creating':\n this.log('info', 'server', `Creating tunnel for port ${info.port}...`, undefined, true);\n break;\n case 'created':\n this.success('server', `Tunnel: ${info.url} → localhost:${info.port}`);\n break;\n case 'closed':\n this.info('server', 'Tunnel closed');\n break;\n case 'error':\n this.error('server', `Tunnel error: ${info.error}`);\n break;\n }\n }\n\n // ============================================\n // Build Access\n // ============================================\n\n getCurrentBuild(): BuildInfo | null {\n if (!this.currentBuildId) return null;\n return this.builds.get(this.currentBuildId) ?? null;\n }\n\n getAllBuilds(): BuildInfo[] {\n return Array.from(this.builds.values());\n }\n\n getBuild(buildId: string): BuildInfo | null {\n return this.builds.get(buildId) ?? null;\n }\n\n // ============================================\n // Buffer Access\n // ============================================\n\n getBuffer(): LogBuffer {\n return this.buffer;\n }\n\n // ============================================\n // Private Helpers\n // ============================================\n\n private log(\n level: LogLevel,\n category: LogCategory,\n message: string,\n data?: Record<string, unknown>,\n verbose: boolean = false,\n ): void {\n // Skip verbose logs when not in verbose mode\n if (verbose && !this.verbose) {\n return;\n }\n\n const entry: LogEntry = {\n id: this.generateId(),\n timestamp: Date.now(),\n level,\n category,\n message,\n data,\n buildId: this.currentBuildId ?? undefined,\n verbose,\n };\n\n this.buffer.add(entry);\n\n if (!this.tuiMode) {\n this.printEntry(entry);\n }\n\n this.emit('log', entry);\n }\n\n private printEntry(entry: LogEntry): void {\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 levelStyles = {\n debug: chalk.gray,\n info: chalk.blue,\n success: chalk.green,\n warn: chalk.yellow,\n error: chalk.red,\n };\n\n const levelIcons = {\n debug: ' ',\n info: '●',\n success: '✓',\n warn: '⚠',\n error: '✗',\n };\n\n const style = levelStyles[entry.level];\n const icon = levelIcons[entry.level];\n\n if (entry.toolName) {\n // Tool calls get special formatting\n console.log(\n chalk.gray(time),\n ' ',\n chalk.cyan('🔧'),\n chalk.white(entry.toolName),\n entry.toolArgs ? chalk.gray(entry.toolArgs) : '',\n );\n } else {\n // Regular log entries\n console.log(\n chalk.gray(time),\n style(icon),\n style(entry.message),\n );\n }\n }\n\n private truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.substring(0, maxLength - 3) + '...';\n }\n\n private formatDuration(seconds: number): string {\n if (seconds < 60) {\n return `${Math.round(seconds)}s`;\n }\n const mins = Math.floor(seconds / 60);\n const secs = Math.round(seconds % 60);\n return `${mins}m ${secs}s`;\n }\n\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n }\n}\n\n// Singleton instance\nlet instance: RunnerLogger | null = null;\n\nexport function getRunnerLogger(): RunnerLogger {\n if (!instance) {\n instance = new RunnerLogger();\n }\n return instance;\n}\n\nexport function createRunnerLogger(options?: RunnerLoggerOptions): RunnerLogger {\n instance = new RunnerLogger(options);\n return instance;\n}\n","/**\n * RunnerLogger Instance Management\n * \n * This module provides the singleton logger instance that can be:\n * - Configured at startup (via initRunnerLogger)\n * - Accessed from anywhere in the runner (via getLogger)\n * - Integrated with the TUI dashboard\n * \n * Note: Uses the same singleton as runner-logger.ts to ensure\n * all code shares the same instance.\n */\n\nimport { RunnerLogger, createRunnerLogger, getRunnerLogger, type RunnerLoggerOptions } from './runner-logger.js';\n\nlet loggerOptions: RunnerLoggerOptions = {};\nlet initialized = false;\n\n/**\n * Initialize the logger with options\n * Call this early in the runner startup\n * \n * If already initialized (e.g., by TUI before startRunner), returns the existing instance\n * to preserve event subscriptions.\n */\nexport function initRunnerLogger(options: RunnerLoggerOptions): RunnerLogger {\n if (initialized) {\n // Already initialized - return existing instance to preserve subscriptions\n // But update options if needed\n const logger = getRunnerLogger();\n if (options.verbose !== undefined) {\n logger.setVerbose(options.verbose);\n }\n return logger;\n }\n \n loggerOptions = options;\n initialized = true;\n return createRunnerLogger(options);\n}\n\n/**\n * Get the current logger instance\n * Uses the shared singleton from runner-logger.ts\n */\nexport function getLogger(): RunnerLogger {\n if (!initialized) {\n // Create with default options if not initialized\n return createRunnerLogger(loggerOptions);\n }\n return getRunnerLogger();\n}\n\n/**\n * Check if verbose mode is enabled\n */\nexport function isVerbose(): boolean {\n return getLogger().isVerbose();\n}\n\n/**\n * Set verbose mode at runtime\n */\nexport function setVerbose(verbose: boolean): void {\n getLogger().setVerbose(verbose);\n}\n\n/**\n * Check if TUI mode is enabled\n */\nexport function isTuiMode(): boolean {\n // Check options - tuiMode defaults to true\n return loggerOptions.tuiMode !== false;\n}\n\n// Re-export types for convenience\nexport type { RunnerLoggerOptions } from './runner-logger.js';\nexport type { LogEntry, BuildInfo, TodoItem, BuildCompletionStats } from './types.js';\n"],"names":["instance"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner-BJL9zWAJ.js","sources":["../../src/cli/utils/spinner.ts"],"sourcesContent":["import ora, { Ora } from 'ora';\n\n/**\n * Spinner utility for showing progress\n */\nexport class Spinner {\n private spinner: Ora | null = null;\n\n start(text: string): void {\n this.spinner = ora(text).start();\n }\n\n succeed(text?: string): void {\n if (this.spinner) {\n this.spinner.succeed(text);\n this.spinner = null;\n }\n }\n\n fail(text?: string): void {\n if (this.spinner) {\n this.spinner.fail(text);\n this.spinner = null;\n }\n }\n\n warn(text?: string): void {\n if (this.spinner) {\n this.spinner.warn(text);\n this.spinner = null;\n }\n }\n\n info(text?: string): void {\n if (this.spinner) {\n this.spinner.info(text);\n this.spinner = null;\n }\n }\n\n text(text: string): void {\n if (this.spinner) {\n this.spinner.text = text;\n }\n }\n\n stop(): void {\n if (this.spinner) {\n this.spinner.stop();\n this.spinner = null;\n }\n }\n}\n\nexport const spinner = new Spinner();\n"],"names":[],"mappings":";;;AAEA;;AAEG;MACU,OAAO,CAAA;AAApB,IAAA,WAAA,GAAA;QACU,IAAA,CAAA,OAAO,GAAe,IAAI;IA8CpC;AA5CE,IAAA,KAAK,CAAC,IAAY,EAAA;QAChB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;IAClC;AAEA,IAAA,OAAO,CAAC,IAAa,EAAA;AACnB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;AAC1B,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACrB;IACF;AAEA,IAAA,IAAI,CAAC,IAAa,EAAA;AAChB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACrB;IACF;AAEA,IAAA,IAAI,CAAC,IAAa,EAAA;AAChB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACrB;IACF;AAEA,IAAA,IAAI,CAAC,IAAa,EAAA;AAChB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACrB;IACF;AAEA,IAAA,IAAI,CAAC,IAAY,EAAA;AACf,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI;QAC1B;IACF;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACnB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACrB;IACF;AACD;AAEM,MAAM,OAAO,GAAG,IAAI,OAAO;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// OpenBuilder CLI - Built with Rollup
|
|
2
2
|
import { existsSync, mkdirSync, createWriteStream, writeFileSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
-
import { j as jsxRuntimeExports, B as Box, T as Text,
|
|
4
|
+
import { j as jsxRuntimeExports, B as Box, T as Text, a as useStdout, r as reactExports, u as useInput, b as render, R as React } from './theme-DOjeB8BU.js';
|
|
5
5
|
import 'chalk';
|
|
6
6
|
import * as p from '@clack/prompts';
|
|
7
7
|
import pc from 'picocolors';
|
|
@@ -13,21 +13,20 @@ import { spawn } from 'node:child_process';
|
|
|
13
13
|
import EventEmitter from 'node:events';
|
|
14
14
|
import 'node:stream';
|
|
15
15
|
import 'node:process';
|
|
16
|
+
import { u as useApp } from './use-app-DozfqdJj.js';
|
|
17
|
+
import { T as TextInput } from './index-ZNRLfdj5.js';
|
|
16
18
|
import { exec } from 'child_process';
|
|
17
19
|
import { platform } from 'os';
|
|
18
|
-
import { u as useBuildState, B as BuildPanel } from './useBuildState-
|
|
20
|
+
import { u as useBuildState, B as BuildPanel } from './useBuildState-DV6wurQ2.js';
|
|
19
21
|
import { i as initRunnerLogger, s as setFileLoggerTuiMode } from './runner-logger-instance-nDWv2h2T.js';
|
|
20
|
-
import 'module';
|
|
21
|
-
import 'events';
|
|
22
22
|
import 'assert';
|
|
23
|
-
import '
|
|
24
|
-
import 'react-devtools-core';
|
|
23
|
+
import 'events';
|
|
25
24
|
import 'node:os';
|
|
25
|
+
import 'module';
|
|
26
26
|
import 'node:buffer';
|
|
27
27
|
import 'conf';
|
|
28
28
|
import 'node:fs/promises';
|
|
29
29
|
import 'node:util';
|
|
30
|
-
import './theme-DhorI2Hb.js';
|
|
31
30
|
|
|
32
31
|
/**
|
|
33
32
|
* ServiceManager - Manages lifecycle and state of Web App, Broker, and Runner
|
|
@@ -1710,3 +1709,4 @@ async function startCommand(options) {
|
|
|
1710
1709
|
}
|
|
1711
1710
|
|
|
1712
1711
|
export { startCommand };
|
|
1712
|
+
//# sourceMappingURL=start-B-brfyVy.js.map
|