@openbuilder/cli 0.50.15 → 0.50.18
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-D4tqKfzA.js → Banner-ClJs6QcI.js} +3 -4
- package/dist/chunks/{Banner-D4tqKfzA.js.map → Banner-ClJs6QcI.js.map} +1 -1
- package/dist/chunks/_commonjsHelpers-DcsQGttR.js +32 -0
- package/dist/chunks/_commonjsHelpers-DcsQGttR.js.map +1 -0
- package/dist/chunks/{cli-auth-CHooQYR9.js → cli-auth-rqwB_Zwt.js} +12 -2
- package/dist/chunks/cli-auth-rqwB_Zwt.js.map +1 -0
- package/dist/chunks/{init-tui-BNzk_7Yx.js → init-tui-DDxZYe9B.js} +54 -55
- package/dist/chunks/{init-tui-BNzk_7Yx.js.map → init-tui-DDxZYe9B.js.map} +1 -1
- package/dist/chunks/{init-CZoN6soU.js → init-zX5aX-qn.js} +5 -6
- package/dist/chunks/{init-CZoN6soU.js.map → init-zX5aX-qn.js.map} +1 -1
- package/dist/chunks/{login-XrUC43gE.js → login-DFgTXEGt.js} +2 -2
- package/dist/chunks/{login-XrUC43gE.js.map → login-DFgTXEGt.js.map} +1 -1
- package/dist/chunks/{logout-Dib2ZEQL.js → logout-DwddishT.js} +2 -2
- package/dist/chunks/{logout-Dib2ZEQL.js.map → logout-DwddishT.js.map} +1 -1
- package/dist/chunks/{main-tui-1ygCKH67.js → main-tui-B5GJ49Bp.js} +43 -44
- package/dist/chunks/{main-tui-1ygCKH67.js.map → main-tui-B5GJ49Bp.js.map} +1 -1
- package/dist/chunks/{run-ImqaRH0K.js → run-CaSootos.js} +34 -35
- package/dist/chunks/{run-ImqaRH0K.js.map → run-CaSootos.js.map} +1 -1
- package/dist/chunks/{start-BygPCbvw.js → start-B4P27nZ7.js} +46 -47
- package/dist/chunks/{start-BygPCbvw.js.map → start-B4P27nZ7.js.map} +1 -1
- package/dist/chunks/theme-BF4W2Gwm.js +2300 -0
- package/dist/chunks/theme-BF4W2Gwm.js.map +1 -0
- package/dist/chunks/{useBuildState-CdBSu9y_.js → useBuildState-BZuezCb6.js} +33 -35
- package/dist/chunks/{useBuildState-CdBSu9y_.js.map → useBuildState-BZuezCb6.js.map} +1 -1
- package/dist/cli/index.js +7 -7
- package/dist/instrument.js +1 -29
- package/dist/instrument.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/cli-auth-CHooQYR9.js.map +0 -1
- package/dist/chunks/theme-DhorI2Hb.js +0 -44
- package/dist/chunks/theme-DhorI2Hb.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main-tui-1ygCKH67.js","sources":["../../src/cli/tui/components/Menu.tsx","../../src/cli/tui/components/HorizontalSelector.tsx","../../src/cli/tui/components/MaskedInput.tsx","../../src/cli/tui/components/RadioGroup.tsx","../../src/cli/tui/screens/ModeSelectScreen.tsx","../../src/cli/tui/screens/LocalModeScreen.tsx","../../src/cli/tui/screens/RunnerModeScreen.tsx","../../src/cli/tui/screens/ConfigFormScreen.tsx","../../src/cli/commands/main-tui.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors, symbols } from '../theme.js';\n\nexport interface MenuItem {\n id: string;\n label: string;\n description?: string;\n}\n\ninterface MenuProps {\n items: MenuItem[];\n onSelect: (item: MenuItem) => void;\n}\n\n/**\n * Arrow-key navigable menu component\n * \n * > Initialize OpenBuilder\n * Start Runner\n * Exit\n */\nexport function Menu({ items, onSelect }: MenuProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => (prev > 0 ? prev - 1 : items.length - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => (prev < items.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n onSelect(items[selectedIndex]);\n }\n });\n\n return (\n <Box flexDirection=\"column\" alignItems=\"flex-start\">\n {items.map((item, index) => {\n const isSelected = index === selectedIndex;\n return (\n <Box key={item.id} marginY={0}>\n <Text color={isSelected ? colors.cyan : colors.gray}>\n {isSelected ? '› ' : ' '}\n </Text>\n <Text color={isSelected ? colors.white : colors.gray} bold={isSelected}>\n {item.label}\n </Text>\n {item.description && (\n <Text color={colors.dimGray}>\n {' '}{item.description}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\n\nexport interface CardOption {\n id: string;\n title: string;\n description: string;\n}\n\ninterface HorizontalSelectorProps {\n options: CardOption[];\n onSelect: (option: CardOption) => void;\n onEscape?: () => void;\n}\n\n/**\n * Horizontal card selector component\n * \n * ┌─────────────────┐ ┌─────────────────┐\n * │ Local Mode │ │ Runner Mode │\n * │ │ │ │\n * │ Run OpenBuilder │ │ Connect to a │\n * │ locally │ │ remote server │\n * └─────────────────┘ └─────────────────┘\n * [SELECTED]\n */\nexport function HorizontalSelector({ options, onSelect, onEscape }: HorizontalSelectorProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.leftArrow) {\n setSelectedIndex(prev => (prev > 0 ? prev - 1 : options.length - 1));\n } else if (key.rightArrow) {\n setSelectedIndex(prev => (prev < options.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n onSelect(options[selectedIndex]);\n } else if (key.escape && onEscape) {\n onEscape();\n }\n });\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Box flexDirection=\"row\" gap={2}>\n {options.map((option, index) => {\n const isSelected = index === selectedIndex;\n return (\n <Box\n key={option.id}\n flexDirection=\"column\"\n alignItems=\"center\"\n borderStyle=\"round\"\n borderColor={isSelected ? colors.cyan : colors.darkGray}\n paddingX={3}\n paddingY={1}\n width={25}\n >\n <Text\n color={isSelected ? colors.white : colors.gray}\n bold={isSelected}\n >\n {option.title}\n </Text>\n <Box marginTop={1}>\n <Text\n color={isSelected ? colors.gray : colors.dimGray}\n wrap=\"wrap\"\n >\n {option.description}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n \n {/* Selection indicator */}\n <Box marginTop={1}>\n {options.map((option, index) => (\n <Box key={option.id} width={25} justifyContent=\"center\" marginX={1}>\n {index === selectedIndex && (\n <Text color={colors.cyan}>{'▲'}</Text>\n )}\n </Box>\n ))}\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\n\ninterface MaskedInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n maskChar?: string;\n focused?: boolean;\n visiblePrefixLength?: number; // Number of characters to show unmasked at the start\n}\n\n/**\n * Masked text input for sensitive data like keys/passwords\n * Shows first N characters (default: 5) then mask characters for the rest\n * Supports paste (multi-character input) with buffering to prevent visual glitches\n */\nexport function MaskedInput({\n value,\n onChange,\n placeholder = '',\n maskChar = '*',\n focused = false,\n visiblePrefixLength = 5,\n}: MaskedInputProps) {\n const [cursorVisible, setCursorVisible] = useState(true);\n // Buffer to accumulate rapid input (for paste detection)\n const inputBufferRef = useRef<string>('');\n const flushTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n // Keep current value in ref for use in timeout callbacks\n const valueRef = useRef(value);\n valueRef.current = value;\n\n // Blink cursor when focused\n useEffect(() => {\n if (!focused) {\n setCursorVisible(false);\n return;\n }\n\n setCursorVisible(true);\n const interval = setInterval(() => {\n setCursorVisible(prev => !prev);\n }, 500);\n\n return () => clearInterval(interval);\n }, [focused]);\n\n // Flush buffered input - called after a brief delay to batch paste operations\n const flushBuffer = useCallback(() => {\n if (inputBufferRef.current) {\n onChange(valueRef.current + inputBufferRef.current);\n inputBufferRef.current = '';\n }\n }, [onChange]);\n\n useInput((input, key) => {\n if (!focused) return;\n\n if (key.backspace || key.delete) {\n // Clear any pending buffer on backspace\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n flushTimeoutRef.current = null;\n }\n if (inputBufferRef.current) {\n // Remove from buffer first\n inputBufferRef.current = inputBufferRef.current.slice(0, -1);\n if (!inputBufferRef.current) {\n onChange(value.slice(0, -1));\n }\n } else {\n onChange(value.slice(0, -1));\n }\n } else if (!key.escape && !key.return && !key.tab && \n !key.upArrow && !key.downArrow && !key.leftArrow && !key.rightArrow) {\n // Allow any printable input including pasted text (multi-character)\n // Filter out control characters but allow regular text\n const printable = input.replace(/[\\x00-\\x1F\\x7F]/g, '');\n if (printable.length > 0) {\n // Buffer the input for batching (helps with paste)\n inputBufferRef.current += printable;\n \n // Clear any existing timeout\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n }\n \n // Set a short timeout to flush - if more input comes quickly (paste), \n // it will be batched together\n flushTimeoutRef.current = setTimeout(() => {\n flushBuffer();\n flushTimeoutRef.current = null;\n }, 10);\n }\n }\n }, { isActive: focused });\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n }\n };\n }, []);\n\n // Show first N characters unmasked, mask the rest\n const getDisplayValue = () => {\n if (!value) return '';\n if (value.length <= visiblePrefixLength) {\n return value;\n }\n const visiblePart = value.substring(0, visiblePrefixLength);\n const maskedPart = maskChar.repeat(value.length - visiblePrefixLength);\n return visiblePart + maskedPart;\n };\n \n const displayValue = getDisplayValue();\n const cursor = focused && cursorVisible ? '│' : ' ';\n\n if (!value && !focused) {\n return (\n <Text color={colors.dimGray}>\n {placeholder}\n </Text>\n );\n }\n\n return (\n <Text color={colors.white}>\n {displayValue}\n {focused && <Text color={colors.cyan}>{cursor}</Text>}\n </Text>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport { colors, symbols } from '../theme.js';\n\nexport interface RadioOption {\n id: string;\n label: string;\n}\n\ninterface RadioGroupProps {\n options: RadioOption[];\n selected: string;\n onChange: (id: string) => void;\n focused?: boolean;\n}\n\n/**\n * Radio button group component\n * \n * ● Option 1\n * ○ Option 2\n */\nexport function RadioGroup({ options, selected, onChange, focused = false }: RadioGroupProps) {\n useInput((input, key) => {\n if (!focused) return;\n\n const currentIndex = options.findIndex(opt => opt.id === selected);\n \n if (key.upArrow) {\n const newIndex = currentIndex > 0 ? currentIndex - 1 : options.length - 1;\n onChange(options[newIndex].id);\n } else if (key.downArrow) {\n const newIndex = currentIndex < options.length - 1 ? currentIndex + 1 : 0;\n onChange(options[newIndex].id);\n } else if (input === ' ') {\n // Space toggles current selection (useful for single option scenarios)\n // For radio groups, this just confirms current selection\n }\n }, { isActive: focused });\n\n return (\n <Box flexDirection=\"column\">\n {options.map((option) => {\n const isSelected = option.id === selected;\n const isFocusedOption = focused && isSelected;\n \n return (\n <Box key={option.id} marginY={0}>\n <Text color={isSelected ? colors.cyan : colors.gray}>\n {isSelected ? symbols.filledDot : symbols.hollowDot}\n </Text>\n <Text> </Text>\n <Text\n color={isFocusedOption ? colors.white : (isSelected ? colors.gray : colors.dimGray)}\n bold={isFocusedOption}\n >\n {option.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { Box, Text, useStdout } from 'ink';\nimport { Banner, HorizontalSelector, type CardOption } from '../components/index.js';\nimport { colors } from '../theme.js';\n\nexport type ModeSelection = 'local' | 'runner';\n\nexport interface ModeSelectScreenProps {\n onSelect: (mode: ModeSelection) => void;\n onEscape?: () => void;\n}\n\nconst modeOptions: CardOption[] = [\n {\n id: 'local',\n title: 'Local Mode',\n description: 'Run OpenBuilder on this machine',\n },\n {\n id: 'runner',\n title: 'Runner Mode',\n description: 'Connect to a remote server',\n },\n];\n\n/**\n * Initial mode selection screen\n * Shows two horizontal cards for Local Mode vs Runner Mode\n */\nexport function ModeSelectScreen({ onSelect, onEscape }: ModeSelectScreenProps) {\n const { stdout } = useStdout();\n \n // Check for available update (set by auto-update check in index.ts)\n const updateAvailable = process.env.OPENBUILDER_UPDATE_AVAILABLE;\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = updateAvailable ? 20 : 18; // Extra space for update notice\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n const handleSelect = (option: CardOption) => {\n onSelect(option.id as ModeSelection);\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Update available notice */}\n {updateAvailable && (\n <Box marginTop={1}>\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 {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Horizontal card selector */}\n <HorizontalSelector\n options={modeOptions}\n onSelect={handleSelect}\n onEscape={onEscape}\n />\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Help text */}\n <Text color={colors.dimGray}>\n Use {'<-'} {'->'} arrows to navigate, Enter to select, Esc to exit\n </Text>\n </Box>\n );\n}\n","import { Box, Text, useInput, useStdout } from 'ink';\nimport { Banner, Menu, type MenuItem } from '../components/index.js';\nimport { colors } from '../theme.js';\n\nexport type LocalAction = 'init' | 'start';\n\nexport interface LocalModeScreenProps {\n isInitialized: boolean;\n onSelect: (action: LocalAction) => void;\n onEscape: () => void;\n}\n\n/**\n * Local mode options screen\n * Shows Initialize/Reinitialize and Start options based on config state\n */\nexport function LocalModeScreen({ isInitialized, onSelect, onEscape }: LocalModeScreenProps) {\n const { stdout } = useStdout();\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = 16;\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n // Handle escape key\n useInput((input, key) => {\n if (key.escape) {\n onEscape();\n }\n });\n\n // Build menu items based on initialization state\n const menuItems: MenuItem[] = [];\n \n if (!isInitialized) {\n menuItems.push({\n id: 'init',\n label: 'Initialize OpenBuilder',\n description: 'Set up workspace and configuration',\n });\n } else {\n menuItems.push({\n id: 'init',\n label: 'Reinitialize OpenBuilder',\n description: 'Reset and reconfigure',\n });\n menuItems.push({\n id: 'start',\n label: 'Start OpenBuilder',\n description: 'Launch the full stack',\n });\n }\n\n const handleSelect = (item: MenuItem) => {\n onSelect(item.id as LocalAction);\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Title */}\n <Text color={colors.cyan} bold>Local Mode</Text>\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Status indicator */}\n {isInitialized ? (\n <Text color={colors.success}>● Configured</Text>\n ) : (\n <Text color={colors.warning}>○ Not configured</Text>\n )}\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Menu */}\n <Menu items={menuItems} onSelect={handleSelect} />\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Help text */}\n <Text color={colors.dimGray}>\n Use up/down arrows to navigate, Enter to select, Esc to go back\n </Text>\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { Banner, MaskedInput } from '../components/index.js';\nimport { colors } from '../theme.js';\n\nexport interface RunnerConfig {\n key: string;\n runnerId: string;\n}\n\nexport interface RunnerModeScreenProps {\n initialKey?: string;\n initialRunnerId?: string;\n onStart: (config: RunnerConfig) => void;\n onEscape: () => void;\n}\n\ntype FocusedField = 'key' | 'runnerId';\n\n// Fixed label width for alignment\nconst LABEL_WIDTH = 14;\n\n/**\n * Runner mode screen with key and runner ID inputs\n */\nexport function RunnerModeScreen({\n initialKey = '',\n initialRunnerId = '',\n onStart,\n onEscape,\n}: RunnerModeScreenProps) {\n const { stdout } = useStdout();\n const [runnerId, setRunnerId] = useState(initialRunnerId);\n const [focusedField, setFocusedField] = useState<FocusedField>('key');\n \n // We need a separate state for the actual key value since MaskedInput doesn't use ink-text-input\n const [runnerKey, setRunnerKey] = useState(initialKey);\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = 18;\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n const isLastField = focusedField === 'runnerId';\n\n const handleSubmit = () => {\n if (runnerKey.trim()) {\n onStart({ key: runnerKey, runnerId: runnerId.trim() || initialRunnerId });\n }\n };\n\n useInput((input, key) => {\n if (key.escape) {\n onEscape();\n return;\n }\n\n // Shift+Enter to submit immediately from any field\n if (key.return && key.shift) {\n handleSubmit();\n return;\n }\n\n // Regular Enter moves to next field, or submits if on last field\n if (key.return && !key.shift) {\n if (isLastField) {\n handleSubmit();\n } else {\n setFocusedField('runnerId');\n }\n return;\n }\n\n if (key.tab || key.downArrow) {\n setFocusedField(prev => prev === 'key' ? 'runnerId' : 'key');\n return;\n }\n\n if (key.upArrow) {\n setFocusedField(prev => prev === 'runnerId' ? 'key' : 'runnerId');\n return;\n }\n });\n\n const handleKeyChange = (value: string) => {\n setRunnerKey(value);\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Title */}\n <Text color={colors.purple} bold>Runner Mode</Text>\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Form fields */}\n <Box flexDirection=\"column\" gap={1}>\n {/* Runner Key (masked) */}\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'key' ? colors.cyan : colors.gray}>\n Runner Key\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'key' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={40}\n >\n <MaskedInput\n value={runnerKey}\n onChange={handleKeyChange}\n placeholder=\"Paste your runner key\"\n focused={focusedField === 'key'}\n />\n </Box>\n </Box>\n \n {/* Auto-fill hint */}\n {initialKey && focusedField === 'key' && (\n <Box marginLeft={LABEL_WIDTH + 2}>\n <Text color={colors.dimGray} italic>\n (auto-filled from previous config)\n </Text>\n </Box>\n )}\n \n {/* Runner ID */}\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'runnerId' ? colors.cyan : colors.gray}>\n Runner ID\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'runnerId' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={40}\n >\n {focusedField === 'runnerId' ? (\n <TextInput\n value={runnerId}\n onChange={setRunnerId}\n placeholder={initialRunnerId || 'Enter runner ID'}\n />\n ) : (\n <Text color={runnerId ? colors.white : colors.dimGray}>\n {runnerId || initialRunnerId || 'Enter runner ID'}\n </Text>\n )}\n </Box>\n </Box>\n </Box>\n \n {/* Spacer */}\n <Box marginTop={3} />\n \n {/* Help text */}\n <Text color={colors.dimGray}>\n Enter: {isLastField ? 'Start runner' : 'Next field'} | Shift+Enter: Start now | Esc: Back\n </Text>\n \n {/* Validation message */}\n {!runnerKey.trim() && (\n <Box marginTop={1}>\n <Text color={colors.warning}>Runner key is required</Text>\n </Box>\n )}\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { Banner, RadioGroup, type RadioOption } from '../components/index.js';\nimport { colors, symbols } from '../theme.js';\n\nexport interface InitFormConfig {\n branch: string;\n workspace: string;\n useNeon: boolean;\n databaseUrl?: string;\n}\n\nexport interface ConfigFormScreenProps {\n initialConfig?: Partial<InitFormConfig>;\n onSubmit: (config: InitFormConfig) => void;\n onEscape: () => void;\n error?: string; // Error message to display (e.g., \"Branch not found\")\n}\n\ntype FocusedField = 'branch' | 'workspace' | 'database' | 'databaseUrl';\n\nconst databaseOptions: RadioOption[] = [\n { id: 'neon', label: 'Use Neon (automatic setup)' },\n { id: 'custom', label: 'Custom PostgreSQL' },\n];\n\n// Fixed label width for alignment\nconst LABEL_WIDTH = 14;\n\n/**\n * Interactive configuration form for init/reinit\n */\nexport function ConfigFormScreen({\n initialConfig,\n onSubmit,\n onEscape,\n error,\n}: ConfigFormScreenProps) {\n const { stdout } = useStdout();\n \n // Form state\n const [branch, setBranch] = useState(initialConfig?.branch || 'main');\n \n // Clear error when user starts typing in branch field\n const handleBranchChange = (value: string) => {\n setBranch(value);\n };\n const [workspace, setWorkspace] = useState(\n initialConfig?.workspace || '~/openbuilder-workspace'\n );\n const [databaseType, setDatabaseType] = useState<'neon' | 'custom'>(\n initialConfig?.useNeon === false ? 'custom' : 'neon'\n );\n const [databaseUrl, setDatabaseUrl] = useState(initialConfig?.databaseUrl || '');\n \n const [focusedField, setFocusedField] = useState<FocusedField>('branch');\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = 22;\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n // Field order for navigation\n const fieldOrder: FocusedField[] = databaseType === 'custom' \n ? ['branch', 'workspace', 'database', 'databaseUrl']\n : ['branch', 'workspace', 'database'];\n\n const currentFieldIndex = fieldOrder.indexOf(focusedField);\n const isLastField = currentFieldIndex === fieldOrder.length - 1;\n\n useInput((input, key) => {\n if (key.escape) {\n onEscape();\n return;\n }\n\n // Shift+Enter to submit immediately from any field\n if (key.return && key.shift) {\n handleSubmit();\n return;\n }\n\n // Regular Enter moves to next field, or submits if on last field\n if (key.return && !key.shift) {\n if (isLastField) {\n handleSubmit();\n } else {\n setFocusedField(fieldOrder[currentFieldIndex + 1]);\n }\n return;\n }\n\n // Tab or Down arrow moves to next field\n if (key.tab || key.downArrow) {\n if (focusedField !== 'database') {\n const nextIndex = (currentFieldIndex + 1) % fieldOrder.length;\n setFocusedField(fieldOrder[nextIndex]);\n }\n return;\n }\n\n // Up arrow moves to previous field\n if (key.upArrow) {\n if (focusedField !== 'database') {\n const prevIndex = currentFieldIndex > 0 ? currentFieldIndex - 1 : fieldOrder.length - 1;\n setFocusedField(fieldOrder[prevIndex]);\n }\n return;\n }\n });\n\n const handleSubmit = () => {\n const config: InitFormConfig = {\n branch: branch.trim() || 'main',\n workspace: workspace.trim() || '~/openbuilder-workspace',\n useNeon: databaseType === 'neon',\n databaseUrl: databaseType === 'custom' ? databaseUrl.trim() : undefined,\n };\n onSubmit(config);\n };\n\n const handleDatabaseTypeChange = (id: string) => {\n setDatabaseType(id as 'neon' | 'custom');\n // If switching to custom, focus the URL field\n if (id === 'custom') {\n setFocusedField('databaseUrl');\n }\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Title */}\n <Text color={colors.cyan} bold>Configure OpenBuilder</Text>\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Form fields */}\n <Box flexDirection=\"column\" gap={1}>\n {/* Branch - editable branch name */}\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={error ? colors.error : (focusedField === 'branch' ? colors.cyan : colors.gray)}>\n Branch\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={error ? colors.error : (focusedField === 'branch' ? colors.cyan : colors.darkGray)}\n paddingX={1}\n >\n {focusedField === 'branch' ? (\n <TextInput\n value={branch}\n onChange={handleBranchChange}\n placeholder=\"main\"\n />\n ) : (\n <Text color={branch ? colors.white : colors.dimGray}>\n {branch || 'main'}\n </Text>\n )}\n </Box>\n </Box>\n {/* Error message below branch field */}\n {error && (\n <Box marginLeft={LABEL_WIDTH + 2}>\n <Text color={colors.error}>\n {symbols.cross} {error}\n </Text>\n </Box>\n )}\n </Box>\n \n {/* Workspace */}\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'workspace' ? colors.cyan : colors.gray}>\n Workspace\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'workspace' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={40}\n >\n {focusedField === 'workspace' ? (\n <TextInput\n value={workspace}\n onChange={setWorkspace}\n placeholder=\"~/openbuilder-workspace\"\n />\n ) : (\n <Text color={workspace ? colors.white : colors.dimGray}>\n {workspace || '~/openbuilder-workspace'}\n </Text>\n )}\n </Box>\n </Box>\n \n {/* Database type */}\n <Box marginTop={1} flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'database' ? colors.cyan : colors.gray}>\n Database\n </Text>\n </Box>\n <RadioGroup\n options={databaseOptions}\n selected={databaseType}\n onChange={handleDatabaseTypeChange}\n focused={focusedField === 'database'}\n />\n </Box>\n \n {/* Custom database URL (only shown when custom is selected) */}\n {databaseType === 'custom' && (\n <Box marginTop={1} flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'databaseUrl' ? colors.cyan : colors.gray}>\n URL\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'databaseUrl' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={50}\n >\n {focusedField === 'databaseUrl' ? (\n <TextInput\n value={databaseUrl}\n onChange={setDatabaseUrl}\n placeholder=\"postgres://user:pass@host:5432/db\"\n />\n ) : (\n <Text color={databaseUrl ? colors.white : colors.dimGray}>\n {databaseUrl || 'postgres://user:pass@host:5432/db'}\n </Text>\n )}\n </Box>\n </Box>\n )}\n </Box>\n \n {/* Spacer */}\n <Box marginTop={3} />\n \n {/* Help text */}\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color={colors.dimGray}>\n Enter: {isLastField ? 'Start' : 'Next field'} | Shift+Enter: Start now | Esc: Back\n </Text>\n {databaseType === 'custom' && !databaseUrl.trim() && (\n <Box marginTop={1}>\n <Text color={colors.warning}>\n {symbols.hollowDot} Database URL required for custom PostgreSQL\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n","/**\n * Main TUI entry point - shown when running `openbuilder` without arguments\n * Implements a multi-screen flow: Mode Select -> Local/Runner Mode -> Config/Start\n */\n\nimport { useState } from 'react';\nimport { render } from 'ink';\nimport { userInfo } from 'node:os';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport {\n ModeSelectScreen,\n LocalModeScreen,\n RunnerModeScreen,\n ConfigFormScreen,\n type ModeSelection,\n type LocalAction,\n type RunnerConfig,\n type InitFormConfig,\n} from '../tui/screens/index.js';\nimport { configManager } from '../utils/config-manager.js';\n\n/**\n * Screen state machine types\n */\ntype Screen =\n | { type: 'mode-select' }\n | { type: 'local-mode' }\n | { type: 'runner-mode' }\n | { type: 'config-form'; error?: string; lastBranch?: string };\n\ninterface AppState {\n screen: Screen;\n isInitialized: boolean;\n existingKey: string;\n existingRunnerId: string;\n existingWorkspace: string;\n}\n\n/**\n * Main TUI App component with screen navigation\n */\nfunction App({ \n initialState, \n onExit, \n onRunnerStart, \n onLocalStart, \n onInitStart,\n}: {\n initialState: AppState;\n onExit: () => void;\n onRunnerStart: (config: RunnerConfig) => void;\n onLocalStart: () => void;\n onInitStart: (config: InitFormConfig) => void;\n}) {\n const [state, setState] = useState<AppState>(initialState);\n\n // Screen navigation handlers\n const navigateTo = (screen: Screen) => {\n setState(prev => ({ ...prev, screen }));\n };\n \n // Navigate back to config form with error\n const navigateToConfigWithError = (error: string, lastBranch: string) => {\n setState(prev => ({ \n ...prev, \n screen: { type: 'config-form', error, lastBranch } \n }));\n };\n\n // Mode Select handlers\n const handleModeSelect = (mode: ModeSelection) => {\n if (mode === 'local') {\n navigateTo({ type: 'local-mode' });\n } else {\n navigateTo({ type: 'runner-mode' });\n }\n };\n\n // Local Mode handlers\n const handleLocalAction = (action: LocalAction) => {\n if (action === 'init') {\n navigateTo({ type: 'config-form' });\n } else if (action === 'start') {\n onLocalStart();\n }\n };\n\n // Runner Mode handler\n const handleRunnerStart = (config: RunnerConfig) => {\n onRunnerStart(config);\n };\n\n // Config Form handler - validates branch before proceeding\n const handleConfigSubmit = async (config: InitFormConfig) => {\n // Skip validation if using main branch (always exists)\n if (config.branch === 'main') {\n onInitStart(config);\n return;\n }\n \n // Validate branch exists before proceeding\n const { execSync } = await import('child_process');\n try {\n execSync(\n `git ls-remote --exit-code --heads https://github.com/codyde/openbuilder.git ${config.branch}`,\n { stdio: 'pipe' }\n );\n // Branch exists, proceed with init\n onInitStart(config);\n } catch {\n // Branch doesn't exist, show error\n navigateToConfigWithError(\n `Branch \"${config.branch}\" not found`,\n config.branch\n );\n }\n };\n\n // Render current screen\n switch (state.screen.type) {\n case 'mode-select':\n return (\n <ModeSelectScreen\n onSelect={handleModeSelect}\n onEscape={onExit}\n />\n );\n\n case 'local-mode':\n return (\n <LocalModeScreen\n isInitialized={state.isInitialized}\n onSelect={handleLocalAction}\n onEscape={() => navigateTo({ type: 'mode-select' })}\n />\n );\n\n case 'runner-mode':\n return (\n <RunnerModeScreen\n initialKey={state.existingKey}\n initialRunnerId={state.existingRunnerId}\n onStart={handleRunnerStart}\n onEscape={() => navigateTo({ type: 'mode-select' })}\n />\n );\n\n case 'config-form':\n return (\n <ConfigFormScreen\n initialConfig={{\n branch: state.screen.lastBranch || 'main',\n workspace: state.existingWorkspace || join(homedir(), 'openbuilder-workspace'),\n useNeon: true,\n }}\n onSubmit={handleConfigSubmit}\n onEscape={() => navigateTo({ type: 'local-mode' })}\n error={state.screen.error}\n />\n );\n\n default:\n return null;\n }\n}\n\n/**\n * Get system username for default runner ID\n */\nfunction getSystemUsername(): string {\n try {\n return userInfo().username;\n } catch {\n return process.env.USER || process.env.USERNAME || 'runner';\n }\n}\n\n/**\n * Run the main TUI menu\n */\nexport async function mainTUICommand(): Promise<void> {\n // Clear screen for fullscreen experience\n console.clear();\n\n const isInitialized = configManager.isInitialized();\n const existingKey = configManager.getSecret() || '';\n const config = configManager.get();\n // Use lastRunnerId if available, otherwise fall back to system username\n const existingRunnerId = config.runner?.lastRunnerId || getSystemUsername();\n const existingWorkspace = config.workspace || '';\n\n const initialState: AppState = {\n screen: { type: 'mode-select' },\n isInitialized,\n existingKey,\n existingRunnerId,\n existingWorkspace,\n };\n\n return new Promise((resolve, reject) => {\n let exitReason: 'exit' | 'runner-start' | 'local-start' | 'init-start' | null = null;\n let runnerConfig: RunnerConfig | null = null;\n let initConfig: InitFormConfig | null = null;\n\n const { unmount, waitUntilExit } = render(\n <App\n initialState={initialState}\n onExit={() => {\n exitReason = 'exit';\n unmount();\n }}\n onRunnerStart={(config) => {\n exitReason = 'runner-start';\n runnerConfig = config;\n unmount();\n }}\n onLocalStart={() => {\n exitReason = 'local-start';\n unmount();\n }}\n onInitStart={(config) => {\n exitReason = 'init-start';\n initConfig = config;\n unmount();\n }}\n />,\n {\n exitOnCtrlC: true,\n }\n );\n\n waitUntilExit().then(async () => {\n if (!exitReason) {\n // User pressed Ctrl+C\n console.clear();\n process.exit(0);\n }\n\n switch (exitReason) {\n case 'exit':\n console.clear();\n console.log('\\n Goodbye!\\n');\n process.exit(0);\n break;\n\n case 'runner-start':\n if (runnerConfig) {\n console.clear();\n await startRunner(runnerConfig);\n }\n break;\n\n case 'local-start':\n console.clear();\n await startLocalMode();\n break;\n\n case 'init-start':\n if (initConfig) {\n // Clear screen with ANSI codes to ensure clean slate\n process.stdout.write('\\x1b[2J\\x1b[H');\n await runInitialization(initConfig);\n }\n break;\n }\n\n resolve();\n }).catch(reject);\n });\n}\n\n/**\n * Start runner mode (connects to remote server)\n */\nasync function startRunner(config: RunnerConfig): Promise<void> {\n // Save the key to config for future use\n if (config.key) {\n const serverConfig = configManager.get('server') || {};\n configManager.set('server', {\n ...serverConfig,\n secret: config.key,\n });\n }\n\n // Save the runner ID to config for future use\n if (config.runnerId) {\n const runnerConf = configManager.get('runner') || {};\n configManager.set('runner', {\n ...runnerConf,\n lastRunnerId: config.runnerId,\n });\n }\n\n console.log('\\n Starting OpenBuilder Runner...\\n');\n console.log(` Runner ID: ${config.runnerId}`);\n console.log(' Connecting to remote server...\\n');\n\n const { runCommand } = await import('./run.js');\n await runCommand({\n secret: config.key,\n runnerId: config.runnerId,\n });\n}\n\n/**\n * Start local mode (full stack)\n */\nasync function startLocalMode(): Promise<void> {\n console.log('\\n Starting OpenBuilder in Local Mode...\\n');\n\n const { startCommand } = await import('./start.js');\n await startCommand({});\n}\n\n/**\n * Run initialization with form config\n */\nasync function runInitialization(config: InitFormConfig): Promise<void> {\n // Expand ~ in workspace path\n const workspace = config.workspace.startsWith('~')\n ? config.workspace.replace('~', homedir())\n : config.workspace;\n\n const { initTUICommand } = await import('./init-tui.js');\n \n // Build options based on form input\n const options: {\n workspace: string;\n branch: string;\n database?: string | boolean;\n yes: boolean;\n } = {\n workspace,\n branch: config.branch,\n yes: true,\n };\n\n // Handle database option\n if (config.useNeon) {\n options.database = true; // Use Neon auto-setup\n } else if (config.databaseUrl) {\n options.database = config.databaseUrl; // Custom connection string\n }\n\n await initTUICommand(options);\n}\n"],"names":["_jsx","_jsxs","LABEL_WIDTH"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main-tui-B5GJ49Bp.js","sources":["../../src/cli/tui/components/Menu.tsx","../../src/cli/tui/components/HorizontalSelector.tsx","../../src/cli/tui/components/MaskedInput.tsx","../../src/cli/tui/components/RadioGroup.tsx","../../src/cli/tui/screens/ModeSelectScreen.tsx","../../src/cli/tui/screens/LocalModeScreen.tsx","../../src/cli/tui/screens/RunnerModeScreen.tsx","../../src/cli/tui/screens/ConfigFormScreen.tsx","../../src/cli/commands/main-tui.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors, symbols } from '../theme.js';\n\nexport interface MenuItem {\n id: string;\n label: string;\n description?: string;\n}\n\ninterface MenuProps {\n items: MenuItem[];\n onSelect: (item: MenuItem) => void;\n}\n\n/**\n * Arrow-key navigable menu component\n * \n * > Initialize OpenBuilder\n * Start Runner\n * Exit\n */\nexport function Menu({ items, onSelect }: MenuProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => (prev > 0 ? prev - 1 : items.length - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => (prev < items.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n onSelect(items[selectedIndex]);\n }\n });\n\n return (\n <Box flexDirection=\"column\" alignItems=\"flex-start\">\n {items.map((item, index) => {\n const isSelected = index === selectedIndex;\n return (\n <Box key={item.id} marginY={0}>\n <Text color={isSelected ? colors.cyan : colors.gray}>\n {isSelected ? '› ' : ' '}\n </Text>\n <Text color={isSelected ? colors.white : colors.gray} bold={isSelected}>\n {item.label}\n </Text>\n {item.description && (\n <Text color={colors.dimGray}>\n {' '}{item.description}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\n\nexport interface CardOption {\n id: string;\n title: string;\n description: string;\n}\n\ninterface HorizontalSelectorProps {\n options: CardOption[];\n onSelect: (option: CardOption) => void;\n onEscape?: () => void;\n}\n\n/**\n * Horizontal card selector component\n * \n * ┌─────────────────┐ ┌─────────────────┐\n * │ Local Mode │ │ Runner Mode │\n * │ │ │ │\n * │ Run OpenBuilder │ │ Connect to a │\n * │ locally │ │ remote server │\n * └─────────────────┘ └─────────────────┘\n * [SELECTED]\n */\nexport function HorizontalSelector({ options, onSelect, onEscape }: HorizontalSelectorProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.leftArrow) {\n setSelectedIndex(prev => (prev > 0 ? prev - 1 : options.length - 1));\n } else if (key.rightArrow) {\n setSelectedIndex(prev => (prev < options.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n onSelect(options[selectedIndex]);\n } else if (key.escape && onEscape) {\n onEscape();\n }\n });\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Box flexDirection=\"row\" gap={2}>\n {options.map((option, index) => {\n const isSelected = index === selectedIndex;\n return (\n <Box\n key={option.id}\n flexDirection=\"column\"\n alignItems=\"center\"\n borderStyle=\"round\"\n borderColor={isSelected ? colors.cyan : colors.darkGray}\n paddingX={3}\n paddingY={1}\n width={25}\n >\n <Text\n color={isSelected ? colors.white : colors.gray}\n bold={isSelected}\n >\n {option.title}\n </Text>\n <Box marginTop={1}>\n <Text\n color={isSelected ? colors.gray : colors.dimGray}\n wrap=\"wrap\"\n >\n {option.description}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n \n {/* Selection indicator */}\n <Box marginTop={1}>\n {options.map((option, index) => (\n <Box key={option.id} width={25} justifyContent=\"center\" marginX={1}>\n {index === selectedIndex && (\n <Text color={colors.cyan}>{'▲'}</Text>\n )}\n </Box>\n ))}\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\n\ninterface MaskedInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n maskChar?: string;\n focused?: boolean;\n visiblePrefixLength?: number; // Number of characters to show unmasked at the start\n}\n\n/**\n * Masked text input for sensitive data like keys/passwords\n * Shows first N characters (default: 5) then mask characters for the rest\n * Supports paste (multi-character input) with buffering to prevent visual glitches\n */\nexport function MaskedInput({\n value,\n onChange,\n placeholder = '',\n maskChar = '*',\n focused = false,\n visiblePrefixLength = 5,\n}: MaskedInputProps) {\n const [cursorVisible, setCursorVisible] = useState(true);\n // Buffer to accumulate rapid input (for paste detection)\n const inputBufferRef = useRef<string>('');\n const flushTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n // Keep current value in ref for use in timeout callbacks\n const valueRef = useRef(value);\n valueRef.current = value;\n\n // Blink cursor when focused\n useEffect(() => {\n if (!focused) {\n setCursorVisible(false);\n return;\n }\n\n setCursorVisible(true);\n const interval = setInterval(() => {\n setCursorVisible(prev => !prev);\n }, 500);\n\n return () => clearInterval(interval);\n }, [focused]);\n\n // Flush buffered input - called after a brief delay to batch paste operations\n const flushBuffer = useCallback(() => {\n if (inputBufferRef.current) {\n onChange(valueRef.current + inputBufferRef.current);\n inputBufferRef.current = '';\n }\n }, [onChange]);\n\n useInput((input, key) => {\n if (!focused) return;\n\n if (key.backspace || key.delete) {\n // Clear any pending buffer on backspace\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n flushTimeoutRef.current = null;\n }\n if (inputBufferRef.current) {\n // Remove from buffer first\n inputBufferRef.current = inputBufferRef.current.slice(0, -1);\n if (!inputBufferRef.current) {\n onChange(value.slice(0, -1));\n }\n } else {\n onChange(value.slice(0, -1));\n }\n } else if (!key.escape && !key.return && !key.tab && \n !key.upArrow && !key.downArrow && !key.leftArrow && !key.rightArrow) {\n // Allow any printable input including pasted text (multi-character)\n // Filter out control characters but allow regular text\n const printable = input.replace(/[\\x00-\\x1F\\x7F]/g, '');\n if (printable.length > 0) {\n // Buffer the input for batching (helps with paste)\n inputBufferRef.current += printable;\n \n // Clear any existing timeout\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n }\n \n // Set a short timeout to flush - if more input comes quickly (paste), \n // it will be batched together\n flushTimeoutRef.current = setTimeout(() => {\n flushBuffer();\n flushTimeoutRef.current = null;\n }, 10);\n }\n }\n }, { isActive: focused });\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n }\n };\n }, []);\n\n // Show first N characters unmasked, mask the rest\n const getDisplayValue = () => {\n if (!value) return '';\n if (value.length <= visiblePrefixLength) {\n return value;\n }\n const visiblePart = value.substring(0, visiblePrefixLength);\n const maskedPart = maskChar.repeat(value.length - visiblePrefixLength);\n return visiblePart + maskedPart;\n };\n \n const displayValue = getDisplayValue();\n const cursor = focused && cursorVisible ? '│' : ' ';\n\n if (!value && !focused) {\n return (\n <Text color={colors.dimGray}>\n {placeholder}\n </Text>\n );\n }\n\n return (\n <Text color={colors.white}>\n {displayValue}\n {focused && <Text color={colors.cyan}>{cursor}</Text>}\n </Text>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport { colors, symbols } from '../theme.js';\n\nexport interface RadioOption {\n id: string;\n label: string;\n}\n\ninterface RadioGroupProps {\n options: RadioOption[];\n selected: string;\n onChange: (id: string) => void;\n focused?: boolean;\n}\n\n/**\n * Radio button group component\n * \n * ● Option 1\n * ○ Option 2\n */\nexport function RadioGroup({ options, selected, onChange, focused = false }: RadioGroupProps) {\n useInput((input, key) => {\n if (!focused) return;\n\n const currentIndex = options.findIndex(opt => opt.id === selected);\n \n if (key.upArrow) {\n const newIndex = currentIndex > 0 ? currentIndex - 1 : options.length - 1;\n onChange(options[newIndex].id);\n } else if (key.downArrow) {\n const newIndex = currentIndex < options.length - 1 ? currentIndex + 1 : 0;\n onChange(options[newIndex].id);\n } else if (input === ' ') {\n // Space toggles current selection (useful for single option scenarios)\n // For radio groups, this just confirms current selection\n }\n }, { isActive: focused });\n\n return (\n <Box flexDirection=\"column\">\n {options.map((option) => {\n const isSelected = option.id === selected;\n const isFocusedOption = focused && isSelected;\n \n return (\n <Box key={option.id} marginY={0}>\n <Text color={isSelected ? colors.cyan : colors.gray}>\n {isSelected ? symbols.filledDot : symbols.hollowDot}\n </Text>\n <Text> </Text>\n <Text\n color={isFocusedOption ? colors.white : (isSelected ? colors.gray : colors.dimGray)}\n bold={isFocusedOption}\n >\n {option.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { Box, Text, useStdout } from 'ink';\nimport { Banner, HorizontalSelector, type CardOption } from '../components/index.js';\nimport { colors } from '../theme.js';\n\nexport type ModeSelection = 'local' | 'runner';\n\nexport interface ModeSelectScreenProps {\n onSelect: (mode: ModeSelection) => void;\n onEscape?: () => void;\n}\n\nconst modeOptions: CardOption[] = [\n {\n id: 'local',\n title: 'Local Mode',\n description: 'Run OpenBuilder on this machine',\n },\n {\n id: 'runner',\n title: 'Runner Mode',\n description: 'Connect to a remote server',\n },\n];\n\n/**\n * Initial mode selection screen\n * Shows two horizontal cards for Local Mode vs Runner Mode\n */\nexport function ModeSelectScreen({ onSelect, onEscape }: ModeSelectScreenProps) {\n const { stdout } = useStdout();\n \n // Check for available update (set by auto-update check in index.ts)\n const updateAvailable = process.env.OPENBUILDER_UPDATE_AVAILABLE;\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = updateAvailable ? 20 : 18; // Extra space for update notice\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n const handleSelect = (option: CardOption) => {\n onSelect(option.id as ModeSelection);\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Update available notice */}\n {updateAvailable && (\n <Box marginTop={1}>\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 {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Horizontal card selector */}\n <HorizontalSelector\n options={modeOptions}\n onSelect={handleSelect}\n onEscape={onEscape}\n />\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Help text */}\n <Text color={colors.dimGray}>\n Use {'<-'} {'->'} arrows to navigate, Enter to select, Esc to exit\n </Text>\n </Box>\n );\n}\n","import { Box, Text, useInput, useStdout } from 'ink';\nimport { Banner, Menu, type MenuItem } from '../components/index.js';\nimport { colors } from '../theme.js';\n\nexport type LocalAction = 'init' | 'start';\n\nexport interface LocalModeScreenProps {\n isInitialized: boolean;\n onSelect: (action: LocalAction) => void;\n onEscape: () => void;\n}\n\n/**\n * Local mode options screen\n * Shows Initialize/Reinitialize and Start options based on config state\n */\nexport function LocalModeScreen({ isInitialized, onSelect, onEscape }: LocalModeScreenProps) {\n const { stdout } = useStdout();\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = 16;\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n // Handle escape key\n useInput((input, key) => {\n if (key.escape) {\n onEscape();\n }\n });\n\n // Build menu items based on initialization state\n const menuItems: MenuItem[] = [];\n \n if (!isInitialized) {\n menuItems.push({\n id: 'init',\n label: 'Initialize OpenBuilder',\n description: 'Set up workspace and configuration',\n });\n } else {\n menuItems.push({\n id: 'init',\n label: 'Reinitialize OpenBuilder',\n description: 'Reset and reconfigure',\n });\n menuItems.push({\n id: 'start',\n label: 'Start OpenBuilder',\n description: 'Launch the full stack',\n });\n }\n\n const handleSelect = (item: MenuItem) => {\n onSelect(item.id as LocalAction);\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Title */}\n <Text color={colors.cyan} bold>Local Mode</Text>\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Status indicator */}\n {isInitialized ? (\n <Text color={colors.success}>● Configured</Text>\n ) : (\n <Text color={colors.warning}>○ Not configured</Text>\n )}\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Menu */}\n <Menu items={menuItems} onSelect={handleSelect} />\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Help text */}\n <Text color={colors.dimGray}>\n Use up/down arrows to navigate, Enter to select, Esc to go back\n </Text>\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { Banner, MaskedInput } from '../components/index.js';\nimport { colors } from '../theme.js';\n\nexport interface RunnerConfig {\n key: string;\n runnerId: string;\n}\n\nexport interface RunnerModeScreenProps {\n initialKey?: string;\n initialRunnerId?: string;\n onStart: (config: RunnerConfig) => void;\n onEscape: () => void;\n}\n\ntype FocusedField = 'key' | 'runnerId';\n\n// Fixed label width for alignment\nconst LABEL_WIDTH = 14;\n\n/**\n * Runner mode screen with key and runner ID inputs\n */\nexport function RunnerModeScreen({\n initialKey = '',\n initialRunnerId = '',\n onStart,\n onEscape,\n}: RunnerModeScreenProps) {\n const { stdout } = useStdout();\n const [runnerId, setRunnerId] = useState(initialRunnerId);\n const [focusedField, setFocusedField] = useState<FocusedField>('key');\n \n // We need a separate state for the actual key value since MaskedInput doesn't use ink-text-input\n const [runnerKey, setRunnerKey] = useState(initialKey);\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = 18;\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n const isLastField = focusedField === 'runnerId';\n\n const handleSubmit = () => {\n if (runnerKey.trim()) {\n onStart({ key: runnerKey, runnerId: runnerId.trim() || initialRunnerId });\n }\n };\n\n useInput((input, key) => {\n if (key.escape) {\n onEscape();\n return;\n }\n\n // Shift+Enter to submit immediately from any field\n if (key.return && key.shift) {\n handleSubmit();\n return;\n }\n\n // Regular Enter moves to next field, or submits if on last field\n if (key.return && !key.shift) {\n if (isLastField) {\n handleSubmit();\n } else {\n setFocusedField('runnerId');\n }\n return;\n }\n\n if (key.tab || key.downArrow) {\n setFocusedField(prev => prev === 'key' ? 'runnerId' : 'key');\n return;\n }\n\n if (key.upArrow) {\n setFocusedField(prev => prev === 'runnerId' ? 'key' : 'runnerId');\n return;\n }\n });\n\n const handleKeyChange = (value: string) => {\n setRunnerKey(value);\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Title */}\n <Text color={colors.purple} bold>Runner Mode</Text>\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Form fields */}\n <Box flexDirection=\"column\" gap={1}>\n {/* Runner Key (masked) */}\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'key' ? colors.cyan : colors.gray}>\n Runner Key\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'key' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={40}\n >\n <MaskedInput\n value={runnerKey}\n onChange={handleKeyChange}\n placeholder=\"Paste your runner key\"\n focused={focusedField === 'key'}\n />\n </Box>\n </Box>\n \n {/* Auto-fill hint */}\n {initialKey && focusedField === 'key' && (\n <Box marginLeft={LABEL_WIDTH + 2}>\n <Text color={colors.dimGray} italic>\n (auto-filled from previous config)\n </Text>\n </Box>\n )}\n \n {/* Runner ID */}\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'runnerId' ? colors.cyan : colors.gray}>\n Runner ID\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'runnerId' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={40}\n >\n {focusedField === 'runnerId' ? (\n <TextInput\n value={runnerId}\n onChange={setRunnerId}\n placeholder={initialRunnerId || 'Enter runner ID'}\n />\n ) : (\n <Text color={runnerId ? colors.white : colors.dimGray}>\n {runnerId || initialRunnerId || 'Enter runner ID'}\n </Text>\n )}\n </Box>\n </Box>\n </Box>\n \n {/* Spacer */}\n <Box marginTop={3} />\n \n {/* Help text */}\n <Text color={colors.dimGray}>\n Enter: {isLastField ? 'Start runner' : 'Next field'} | Shift+Enter: Start now | Esc: Back\n </Text>\n \n {/* Validation message */}\n {!runnerKey.trim() && (\n <Box marginTop={1}>\n <Text color={colors.warning}>Runner key is required</Text>\n </Box>\n )}\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { Banner, RadioGroup, type RadioOption } from '../components/index.js';\nimport { colors, symbols } from '../theme.js';\n\nexport interface InitFormConfig {\n branch: string;\n workspace: string;\n useNeon: boolean;\n databaseUrl?: string;\n}\n\nexport interface ConfigFormScreenProps {\n initialConfig?: Partial<InitFormConfig>;\n onSubmit: (config: InitFormConfig) => void;\n onEscape: () => void;\n error?: string; // Error message to display (e.g., \"Branch not found\")\n}\n\ntype FocusedField = 'branch' | 'workspace' | 'database' | 'databaseUrl';\n\nconst databaseOptions: RadioOption[] = [\n { id: 'neon', label: 'Use Neon (automatic setup)' },\n { id: 'custom', label: 'Custom PostgreSQL' },\n];\n\n// Fixed label width for alignment\nconst LABEL_WIDTH = 14;\n\n/**\n * Interactive configuration form for init/reinit\n */\nexport function ConfigFormScreen({\n initialConfig,\n onSubmit,\n onEscape,\n error,\n}: ConfigFormScreenProps) {\n const { stdout } = useStdout();\n \n // Form state\n const [branch, setBranch] = useState(initialConfig?.branch || 'main');\n \n // Clear error when user starts typing in branch field\n const handleBranchChange = (value: string) => {\n setBranch(value);\n };\n const [workspace, setWorkspace] = useState(\n initialConfig?.workspace || '~/openbuilder-workspace'\n );\n const [databaseType, setDatabaseType] = useState<'neon' | 'custom'>(\n initialConfig?.useNeon === false ? 'custom' : 'neon'\n );\n const [databaseUrl, setDatabaseUrl] = useState(initialConfig?.databaseUrl || '');\n \n const [focusedField, setFocusedField] = useState<FocusedField>('branch');\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = 22;\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n // Field order for navigation\n const fieldOrder: FocusedField[] = databaseType === 'custom' \n ? ['branch', 'workspace', 'database', 'databaseUrl']\n : ['branch', 'workspace', 'database'];\n\n const currentFieldIndex = fieldOrder.indexOf(focusedField);\n const isLastField = currentFieldIndex === fieldOrder.length - 1;\n\n useInput((input, key) => {\n if (key.escape) {\n onEscape();\n return;\n }\n\n // Shift+Enter to submit immediately from any field\n if (key.return && key.shift) {\n handleSubmit();\n return;\n }\n\n // Regular Enter moves to next field, or submits if on last field\n if (key.return && !key.shift) {\n if (isLastField) {\n handleSubmit();\n } else {\n setFocusedField(fieldOrder[currentFieldIndex + 1]);\n }\n return;\n }\n\n // Tab or Down arrow moves to next field\n if (key.tab || key.downArrow) {\n if (focusedField !== 'database') {\n const nextIndex = (currentFieldIndex + 1) % fieldOrder.length;\n setFocusedField(fieldOrder[nextIndex]);\n }\n return;\n }\n\n // Up arrow moves to previous field\n if (key.upArrow) {\n if (focusedField !== 'database') {\n const prevIndex = currentFieldIndex > 0 ? currentFieldIndex - 1 : fieldOrder.length - 1;\n setFocusedField(fieldOrder[prevIndex]);\n }\n return;\n }\n });\n\n const handleSubmit = () => {\n const config: InitFormConfig = {\n branch: branch.trim() || 'main',\n workspace: workspace.trim() || '~/openbuilder-workspace',\n useNeon: databaseType === 'neon',\n databaseUrl: databaseType === 'custom' ? databaseUrl.trim() : undefined,\n };\n onSubmit(config);\n };\n\n const handleDatabaseTypeChange = (id: string) => {\n setDatabaseType(id as 'neon' | 'custom');\n // If switching to custom, focus the URL field\n if (id === 'custom') {\n setFocusedField('databaseUrl');\n }\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Title */}\n <Text color={colors.cyan} bold>Configure OpenBuilder</Text>\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Form fields */}\n <Box flexDirection=\"column\" gap={1}>\n {/* Branch - editable branch name */}\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={error ? colors.error : (focusedField === 'branch' ? colors.cyan : colors.gray)}>\n Branch\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={error ? colors.error : (focusedField === 'branch' ? colors.cyan : colors.darkGray)}\n paddingX={1}\n >\n {focusedField === 'branch' ? (\n <TextInput\n value={branch}\n onChange={handleBranchChange}\n placeholder=\"main\"\n />\n ) : (\n <Text color={branch ? colors.white : colors.dimGray}>\n {branch || 'main'}\n </Text>\n )}\n </Box>\n </Box>\n {/* Error message below branch field */}\n {error && (\n <Box marginLeft={LABEL_WIDTH + 2}>\n <Text color={colors.error}>\n {symbols.cross} {error}\n </Text>\n </Box>\n )}\n </Box>\n \n {/* Workspace */}\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'workspace' ? colors.cyan : colors.gray}>\n Workspace\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'workspace' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={40}\n >\n {focusedField === 'workspace' ? (\n <TextInput\n value={workspace}\n onChange={setWorkspace}\n placeholder=\"~/openbuilder-workspace\"\n />\n ) : (\n <Text color={workspace ? colors.white : colors.dimGray}>\n {workspace || '~/openbuilder-workspace'}\n </Text>\n )}\n </Box>\n </Box>\n \n {/* Database type */}\n <Box marginTop={1} flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'database' ? colors.cyan : colors.gray}>\n Database\n </Text>\n </Box>\n <RadioGroup\n options={databaseOptions}\n selected={databaseType}\n onChange={handleDatabaseTypeChange}\n focused={focusedField === 'database'}\n />\n </Box>\n \n {/* Custom database URL (only shown when custom is selected) */}\n {databaseType === 'custom' && (\n <Box marginTop={1} flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'databaseUrl' ? colors.cyan : colors.gray}>\n URL\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'databaseUrl' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={50}\n >\n {focusedField === 'databaseUrl' ? (\n <TextInput\n value={databaseUrl}\n onChange={setDatabaseUrl}\n placeholder=\"postgres://user:pass@host:5432/db\"\n />\n ) : (\n <Text color={databaseUrl ? colors.white : colors.dimGray}>\n {databaseUrl || 'postgres://user:pass@host:5432/db'}\n </Text>\n )}\n </Box>\n </Box>\n )}\n </Box>\n \n {/* Spacer */}\n <Box marginTop={3} />\n \n {/* Help text */}\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color={colors.dimGray}>\n Enter: {isLastField ? 'Start' : 'Next field'} | Shift+Enter: Start now | Esc: Back\n </Text>\n {databaseType === 'custom' && !databaseUrl.trim() && (\n <Box marginTop={1}>\n <Text color={colors.warning}>\n {symbols.hollowDot} Database URL required for custom PostgreSQL\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n","/**\n * Main TUI entry point - shown when running `openbuilder` without arguments\n * Implements a multi-screen flow: Mode Select -> Local/Runner Mode -> Config/Start\n */\n\nimport { useState } from 'react';\nimport { render } from 'ink';\nimport { userInfo } from 'node:os';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport {\n ModeSelectScreen,\n LocalModeScreen,\n RunnerModeScreen,\n ConfigFormScreen,\n type ModeSelection,\n type LocalAction,\n type RunnerConfig,\n type InitFormConfig,\n} from '../tui/screens/index.js';\nimport { configManager } from '../utils/config-manager.js';\n\n/**\n * Screen state machine types\n */\ntype Screen =\n | { type: 'mode-select' }\n | { type: 'local-mode' }\n | { type: 'runner-mode' }\n | { type: 'config-form'; error?: string; lastBranch?: string };\n\ninterface AppState {\n screen: Screen;\n isInitialized: boolean;\n existingKey: string;\n existingRunnerId: string;\n existingWorkspace: string;\n}\n\n/**\n * Main TUI App component with screen navigation\n */\nfunction App({ \n initialState, \n onExit, \n onRunnerStart, \n onLocalStart, \n onInitStart,\n}: {\n initialState: AppState;\n onExit: () => void;\n onRunnerStart: (config: RunnerConfig) => void;\n onLocalStart: () => void;\n onInitStart: (config: InitFormConfig) => void;\n}) {\n const [state, setState] = useState<AppState>(initialState);\n\n // Screen navigation handlers\n const navigateTo = (screen: Screen) => {\n setState(prev => ({ ...prev, screen }));\n };\n \n // Navigate back to config form with error\n const navigateToConfigWithError = (error: string, lastBranch: string) => {\n setState(prev => ({ \n ...prev, \n screen: { type: 'config-form', error, lastBranch } \n }));\n };\n\n // Mode Select handlers\n const handleModeSelect = (mode: ModeSelection) => {\n if (mode === 'local') {\n navigateTo({ type: 'local-mode' });\n } else {\n navigateTo({ type: 'runner-mode' });\n }\n };\n\n // Local Mode handlers\n const handleLocalAction = (action: LocalAction) => {\n if (action === 'init') {\n navigateTo({ type: 'config-form' });\n } else if (action === 'start') {\n onLocalStart();\n }\n };\n\n // Runner Mode handler\n const handleRunnerStart = (config: RunnerConfig) => {\n onRunnerStart(config);\n };\n\n // Config Form handler - validates branch before proceeding\n const handleConfigSubmit = async (config: InitFormConfig) => {\n // Skip validation if using main branch (always exists)\n if (config.branch === 'main') {\n onInitStart(config);\n return;\n }\n \n // Validate branch exists before proceeding\n const { execSync } = await import('child_process');\n try {\n execSync(\n `git ls-remote --exit-code --heads https://github.com/codyde/openbuilder.git ${config.branch}`,\n { stdio: 'pipe' }\n );\n // Branch exists, proceed with init\n onInitStart(config);\n } catch {\n // Branch doesn't exist, show error\n navigateToConfigWithError(\n `Branch \"${config.branch}\" not found`,\n config.branch\n );\n }\n };\n\n // Render current screen\n switch (state.screen.type) {\n case 'mode-select':\n return (\n <ModeSelectScreen\n onSelect={handleModeSelect}\n onEscape={onExit}\n />\n );\n\n case 'local-mode':\n return (\n <LocalModeScreen\n isInitialized={state.isInitialized}\n onSelect={handleLocalAction}\n onEscape={() => navigateTo({ type: 'mode-select' })}\n />\n );\n\n case 'runner-mode':\n return (\n <RunnerModeScreen\n initialKey={state.existingKey}\n initialRunnerId={state.existingRunnerId}\n onStart={handleRunnerStart}\n onEscape={() => navigateTo({ type: 'mode-select' })}\n />\n );\n\n case 'config-form':\n return (\n <ConfigFormScreen\n initialConfig={{\n branch: state.screen.lastBranch || 'main',\n workspace: state.existingWorkspace || join(homedir(), 'openbuilder-workspace'),\n useNeon: true,\n }}\n onSubmit={handleConfigSubmit}\n onEscape={() => navigateTo({ type: 'local-mode' })}\n error={state.screen.error}\n />\n );\n\n default:\n return null;\n }\n}\n\n/**\n * Get system username for default runner ID\n */\nfunction getSystemUsername(): string {\n try {\n return userInfo().username;\n } catch {\n return process.env.USER || process.env.USERNAME || 'runner';\n }\n}\n\n/**\n * Run the main TUI menu\n */\nexport async function mainTUICommand(): Promise<void> {\n // Clear screen for fullscreen experience\n console.clear();\n\n const isInitialized = configManager.isInitialized();\n const existingKey = configManager.getSecret() || '';\n const config = configManager.get();\n // Use lastRunnerId if available, otherwise fall back to system username\n const existingRunnerId = config.runner?.lastRunnerId || getSystemUsername();\n const existingWorkspace = config.workspace || '';\n\n const initialState: AppState = {\n screen: { type: 'mode-select' },\n isInitialized,\n existingKey,\n existingRunnerId,\n existingWorkspace,\n };\n\n return new Promise((resolve, reject) => {\n let exitReason: 'exit' | 'runner-start' | 'local-start' | 'init-start' | null = null;\n let runnerConfig: RunnerConfig | null = null;\n let initConfig: InitFormConfig | null = null;\n\n const { unmount, waitUntilExit } = render(\n <App\n initialState={initialState}\n onExit={() => {\n exitReason = 'exit';\n unmount();\n }}\n onRunnerStart={(config) => {\n exitReason = 'runner-start';\n runnerConfig = config;\n unmount();\n }}\n onLocalStart={() => {\n exitReason = 'local-start';\n unmount();\n }}\n onInitStart={(config) => {\n exitReason = 'init-start';\n initConfig = config;\n unmount();\n }}\n />,\n {\n exitOnCtrlC: true,\n }\n );\n\n waitUntilExit().then(async () => {\n if (!exitReason) {\n // User pressed Ctrl+C\n console.clear();\n process.exit(0);\n }\n\n switch (exitReason) {\n case 'exit':\n console.clear();\n console.log('\\n Goodbye!\\n');\n process.exit(0);\n break;\n\n case 'runner-start':\n if (runnerConfig) {\n console.clear();\n await startRunner(runnerConfig);\n }\n break;\n\n case 'local-start':\n console.clear();\n await startLocalMode();\n break;\n\n case 'init-start':\n if (initConfig) {\n // Clear screen with ANSI codes to ensure clean slate\n process.stdout.write('\\x1b[2J\\x1b[H');\n await runInitialization(initConfig);\n }\n break;\n }\n\n resolve();\n }).catch(reject);\n });\n}\n\n/**\n * Start runner mode (connects to remote server)\n */\nasync function startRunner(config: RunnerConfig): Promise<void> {\n // Save the key to config for future use\n if (config.key) {\n const serverConfig = configManager.get('server') || {};\n configManager.set('server', {\n ...serverConfig,\n secret: config.key,\n });\n }\n\n // Save the runner ID to config for future use\n if (config.runnerId) {\n const runnerConf = configManager.get('runner') || {};\n configManager.set('runner', {\n ...runnerConf,\n lastRunnerId: config.runnerId,\n });\n }\n\n console.log('\\n Starting OpenBuilder Runner...\\n');\n console.log(` Runner ID: ${config.runnerId}`);\n console.log(' Connecting to remote server...\\n');\n\n const { runCommand } = await import('./run.js');\n await runCommand({\n secret: config.key,\n runnerId: config.runnerId,\n });\n}\n\n/**\n * Start local mode (full stack)\n */\nasync function startLocalMode(): Promise<void> {\n console.log('\\n Starting OpenBuilder in Local Mode...\\n');\n\n const { startCommand } = await import('./start.js');\n await startCommand({});\n}\n\n/**\n * Run initialization with form config\n */\nasync function runInitialization(config: InitFormConfig): Promise<void> {\n // Expand ~ in workspace path\n const workspace = config.workspace.startsWith('~')\n ? config.workspace.replace('~', homedir())\n : config.workspace;\n\n const { initTUICommand } = await import('./init-tui.js');\n \n // Build options based on form input\n const options: {\n workspace: string;\n branch: string;\n database?: string | boolean;\n yes: boolean;\n } = {\n workspace,\n branch: config.branch,\n yes: true,\n };\n\n // Handle database option\n if (config.useNeon) {\n options.database = true; // Use Neon auto-setup\n } else if (config.databaseUrl) {\n options.database = config.databaseUrl; // Custom connection string\n }\n\n await initTUICommand(options);\n}\n"],"names":["useState","_jsx","_jsxs","useRef","useEffect","useCallback","LABEL_WIDTH"],"mappings":";;;;;;;;;;;;;;;;AAeA;;;;;;AAMG;SACa,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAa,EAAA;IACjD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGA,qBAAQ,CAAC,CAAC,CAAC;AAErD,IAAA,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AACtB,QAAA,IAAI,GAAG,CAAC,OAAO,EAAE;YACf,gBAAgB,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpE;AAAO,aAAA,IAAI,GAAG,CAAC,SAAS,EAAE;YACxB,gBAAgB,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE;AAAO,aAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACrB,YAAA,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAChC;AACF,IAAA,CAAC,CAAC;IAEF,QACEC,sBAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,YAAY,EAAA,QAAA,EAChD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACzB,YAAA,MAAM,UAAU,GAAG,KAAK,KAAK,aAAa;YAC1C,QACEC,uBAAC,GAAG,EAAA,EAAe,OAAO,EAAE,CAAC,aAC3BD,qBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,EAAA,QAAA,EAChD,UAAU,GAAG,IAAI,GAAG,IAAI,EAAA,CACpB,EACPA,qBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAA,QAAA,EACnE,IAAI,CAAC,KAAK,GACN,EACN,IAAI,CAAC,WAAW,KACfC,sBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,aACxB,IAAI,EAAE,IAAI,CAAC,WAAW,IAClB,CACR,CAAA,EAAA,EAXO,IAAI,CAAC,EAAE,CAYX;QAEV,CAAC,CAAC,EAAA,CACE;AAEV;;ACzCA;;;;;;;;;;AAUG;AACG,SAAU,kBAAkB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAA2B,EAAA;IACzF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGF,qBAAQ,CAAC,CAAC,CAAC;AAErD,IAAA,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AACtB,QAAA,IAAI,GAAG,CAAC,SAAS,EAAE;YACjB,gBAAgB,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtE;AAAO,aAAA,IAAI,GAAG,CAAC,UAAU,EAAE;YACzB,gBAAgB,CAAC,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE;AAAO,aAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACrB,YAAA,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAClC;AAAO,aAAA,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ,EAAE;AACjC,YAAA,QAAQ,EAAE;QACZ;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,QACEE,sBAAA,CAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAA,QAAA,EAAA,CAC7CD,qBAAA,CAAC,GAAG,EAAA,EAAC,aAAa,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC,YAC5B,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,KAAI;AAC7B,oBAAA,MAAM,UAAU,GAAG,KAAK,KAAK,aAAa;oBAC1C,QACEC,sBAAA,CAAC,GAAG,EAAA,EAEF,aAAa,EAAC,QAAQ,EACtB,UAAU,EAAC,QAAQ,EACnB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,UAAU,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EACvD,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,EAAE,EAAA,QAAA,EAAA,CAETD,qBAAA,CAAC,IAAI,EAAA,EACH,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,EAC9C,IAAI,EAAE,UAAU,EAAA,QAAA,EAEf,MAAM,CAAC,KAAK,GACR,EACPA,qBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,QAAA,EACfA,qBAAA,CAAC,IAAI,EAAA,EACH,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,EAChD,IAAI,EAAC,MAAM,EAAA,QAAA,EAEV,MAAM,CAAC,WAAW,EAAA,CACd,EAAA,CACH,CAAA,EAAA,EAtBD,MAAM,CAAC,EAAE,CAuBV;AAEV,gBAAA,CAAC,CAAC,EAAA,CACE,EAGNA,qBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,QAAA,EACd,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,MACzBA,qBAAA,CAAC,GAAG,EAAA,EAAiB,KAAK,EAAE,EAAE,EAAE,cAAc,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,EAAA,QAAA,EAC/D,KAAK,KAAK,aAAa,KACtBA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAG,GAAG,EAAA,CAAQ,CACvC,EAAA,EAHO,MAAM,CAAC,EAAE,CAIb,CACP,CAAC,EAAA,CACE,CAAA,EAAA,CACF;AAEV;;AC5EA;;;;AAIG;AACG,SAAU,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,GAAG,EAAE,EAChB,QAAQ,GAAG,GAAG,EACd,OAAO,GAAG,KAAK,EACf,mBAAmB,GAAG,CAAC,GACN,EAAA;IACjB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGD,qBAAQ,CAAC,IAAI,CAAC;;AAExD,IAAA,MAAM,cAAc,GAAGG,mBAAM,CAAS,EAAE,CAAC;AACzC,IAAA,MAAM,eAAe,GAAGA,mBAAM,CAAwB,IAAI,CAAC;;AAE3D,IAAA,MAAM,QAAQ,GAAGA,mBAAM,CAAC,KAAK,CAAC;AAC9B,IAAA,QAAQ,CAAC,OAAO,GAAG,KAAK;;IAGxBC,sBAAS,CAAC,MAAK;QACb,IAAI,CAAC,OAAO,EAAE;YACZ,gBAAgB,CAAC,KAAK,CAAC;YACvB;QACF;QAEA,gBAAgB,CAAC,IAAI,CAAC;AACtB,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAK;YAChC,gBAAgB,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;QACjC,CAAC,EAAE,GAAG,CAAC;AAEP,QAAA,OAAO,MAAM,aAAa,CAAC,QAAQ,CAAC;AACtC,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;;AAGb,IAAA,MAAM,WAAW,GAAGC,wBAAW,CAAC,MAAK;AACnC,QAAA,IAAI,cAAc,CAAC,OAAO,EAAE;YAC1B,QAAQ,CAAC,QAAQ,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC;AACnD,YAAA,cAAc,CAAC,OAAO,GAAG,EAAE;QAC7B;AACF,IAAA,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AAEd,IAAA,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AACtB,QAAA,IAAI,CAAC,OAAO;YAAE;QAEd,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE;;AAE/B,YAAA,IAAI,eAAe,CAAC,OAAO,EAAE;AAC3B,gBAAA,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC;AACrC,gBAAA,eAAe,CAAC,OAAO,GAAG,IAAI;YAChC;AACA,YAAA,IAAI,cAAc,CAAC,OAAO,EAAE;;AAE1B,gBAAA,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5D,gBAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;oBAC3B,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9B;YACF;iBAAO;gBACL,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B;QACF;AAAO,aAAA,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG;AACtC,YAAA,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE;;;YAG9E,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;AACvD,YAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;;AAExB,gBAAA,cAAc,CAAC,OAAO,IAAI,SAAS;;AAGnC,gBAAA,IAAI,eAAe,CAAC,OAAO,EAAE;AAC3B,oBAAA,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC;gBACvC;;;AAIA,gBAAA,eAAe,CAAC,OAAO,GAAG,UAAU,CAAC,MAAK;AACxC,oBAAA,WAAW,EAAE;AACb,oBAAA,eAAe,CAAC,OAAO,GAAG,IAAI;gBAChC,CAAC,EAAE,EAAE,CAAC;YACR;QACF;AACF,IAAA,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;;IAGzBD,sBAAS,CAAC,MAAK;AACb,QAAA,OAAO,MAAK;AACV,YAAA,IAAI,eAAe,CAAC,OAAO,EAAE;AAC3B,gBAAA,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC;YACvC;AACF,QAAA,CAAC;IACH,CAAC,EAAE,EAAE,CAAC;;IAGN,MAAM,eAAe,GAAG,MAAK;AAC3B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;AACrB,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,mBAAmB,EAAE;AACvC,YAAA,OAAO,KAAK;QACd;QACA,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,mBAAmB,CAAC;AAC3D,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,mBAAmB,CAAC;QACtE,OAAO,WAAW,GAAG,UAAU;AACjC,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,eAAe,EAAE;AACtC,IAAA,MAAM,MAAM,GAAG,OAAO,IAAI,aAAa,GAAG,GAAG,GAAG,GAAG;AAEnD,IAAA,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE;AACtB,QAAA,QACEH,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EACxB,WAAW,EAAA,CACP;IAEX;IAEA,QACEC,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAA,QAAA,EAAA,CACtB,YAAY,EACZ,OAAO,IAAID,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAG,MAAM,EAAA,CAAQ,CAAA,EAAA,CAChD;AAEX;;ACzHA;;;;;AAKG;AACG,SAAU,UAAU,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAmB,EAAA;AAC1F,IAAA,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AACtB,QAAA,IAAI,CAAC,OAAO;YAAE;AAEd,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC;AAElE,QAAA,IAAI,GAAG,CAAC,OAAO,EAAE;AACf,YAAA,MAAM,QAAQ,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;YACzE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAChC;AAAO,aAAA,IAAI,GAAG,CAAC,SAAS,EAAE;AACxB,YAAA,MAAM,QAAQ,GAAG,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,CAAC;YACzE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAChC;AAAO,aAAA;AAIT,IAAA,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAEzB,IAAA,QACEA,qBAAA,CAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAA,QAAA,EACxB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;AACtB,YAAA,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,KAAK,QAAQ;AACzC,YAAA,MAAM,eAAe,GAAG,OAAO,IAAI,UAAU;AAE7C,YAAA,QACEC,sBAAA,CAAC,GAAG,IAAiB,OAAO,EAAE,CAAC,EAAA,QAAA,EAAA,CAC7BD,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,EAAA,QAAA,EAChD,UAAU,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,EAAA,CAC9C,EACPA,sBAAC,IAAI,EAAA,EAAA,QAAA,EAAA,GAAA,EAAA,CAAS,EACdA,qBAAA,CAAC,IAAI,IACH,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,EACnF,IAAI,EAAE,eAAe,EAAA,QAAA,EAEpB,MAAM,CAAC,KAAK,GACR,CAAA,EAAA,EAVC,MAAM,CAAC,EAAE,CAWb;QAEV,CAAC,CAAC,EAAA,CACE;AAEV;;ACnDA,MAAM,WAAW,GAAiB;AAChC,IAAA;AACE,QAAA,EAAE,EAAE,OAAO;AACX,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,WAAW,EAAE,iCAAiC;AAC/C,KAAA;AACD,IAAA;AACE,QAAA,EAAE,EAAE,QAAQ;AACZ,QAAA,KAAK,EAAE,aAAa;AACpB,QAAA,WAAW,EAAE,4BAA4B;AAC1C,KAAA;CACF;AAED;;;AAGG;SACa,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAyB,EAAA;AAC5E,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE;;AAG9B,IAAA,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B;;AAGhE,IAAA,MAAM,cAAc,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE;AACzC,IAAA,MAAM,aAAa,GAAG,eAAe,GAAG,EAAE,GAAG,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC;AAEhF,IAAA,MAAM,YAAY,GAAG,CAAC,MAAkB,KAAI;AAC1C,QAAA,QAAQ,CAAC,MAAM,CAAC,EAAmB,CAAC;AACtC,IAAA,CAAC;AAED,IAAA,QACEC,sBAAA,CAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,EAAE,UAAU,EAAA,QAAA,EAAA,CAEpED,qBAAA,CAAC,MAAM,EAAA,EAAA,CAAG,EAGT,eAAe,KACdC,sBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,QAAA,EAAA,CACfD,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,2BAAA,EAAA,CAA6B,EACrDA,qBAAA,CAAC,IAAI,EAAA,EAAC,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,sBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,qBAAA,EAAA,CAA4B,EACpDA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,YAAA,EAAA,CAAmB,CAAA,EAAA,CAC1C,CACP,EAGDA,qBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,CAAI,EAGrBA,qBAAA,CAAC,kBAAkB,EAAA,EACjB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,QAAQ,EAAA,CAClB,EAGFA,qBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,CAAI,EAGrBC,sBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,CAAA,MAAA,EACpB,IAAI,EAAA,GAAA,EAAG,IAAI,EAAA,mDAAA,CAAA,EAAA,CACX,CAAA,EAAA,CACH;AAEV;;AClEA;;;AAGG;AACG,SAAU,eAAe,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAwB,EAAA;AACzF,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE;;AAG9B,IAAA,MAAM,cAAc,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE;IACzC,MAAM,aAAa,GAAG,EAAE;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC;;AAGhF,IAAA,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AACtB,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACd,YAAA,QAAQ,EAAE;QACZ;AACF,IAAA,CAAC,CAAC;;IAGF,MAAM,SAAS,GAAe,EAAE;IAEhC,IAAI,CAAC,aAAa,EAAE;QAClB,SAAS,CAAC,IAAI,CAAC;AACb,YAAA,EAAE,EAAE,MAAM;AACV,YAAA,KAAK,EAAE,wBAAwB;AAC/B,YAAA,WAAW,EAAE,oCAAoC;AAClD,SAAA,CAAC;IACJ;SAAO;QACL,SAAS,CAAC,IAAI,CAAC;AACb,YAAA,EAAE,EAAE,MAAM;AACV,YAAA,KAAK,EAAE,0BAA0B;AACjC,YAAA,WAAW,EAAE,uBAAuB;AACrC,SAAA,CAAC;QACF,SAAS,CAAC,IAAI,CAAC;AACb,YAAA,EAAE,EAAE,OAAO;AACX,YAAA,KAAK,EAAE,mBAAmB;AAC1B,YAAA,WAAW,EAAE,uBAAuB;AACrC,SAAA,CAAC;IACJ;AAEA,IAAA,MAAM,YAAY,GAAG,CAAC,IAAc,KAAI;AACtC,QAAA,QAAQ,CAAC,IAAI,CAAC,EAAiB,CAAC;AAClC,IAAA,CAAC;IAED,QACEA,sBAAA,CAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,EAAE,UAAU,EAAA,QAAA,EAAA,CAEpED,qBAAA,CAAC,MAAM,EAAA,EAAA,CAAG,EAGVA,qBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,CAAI,EAGrBA,sBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,CAAkB,EAGhDA,qBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,CAAI,EAGpB,aAAa,IACZA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,mBAAA,EAAA,CAAqB,KAEhDA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,uBAAA,EAAA,CAAyB,CACrD,EAGDA,qBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,CAAI,EAGrBA,qBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAA,CAAI,EAGlDA,qBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,CAAI,EAGrBA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,iEAAA,EAAA,CAEpB,CAAA,EAAA,CACH;AAEV;;ACzEA;AACA,MAAMK,aAAW,GAAG,EAAE;AAEtB;;AAEG;AACG,SAAU,gBAAgB,CAAC,EAC/B,UAAU,GAAG,EAAE,EACf,eAAe,GAAG,EAAE,EACpB,OAAO,EACP,QAAQ,GACc,EAAA;AACtB,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE;IAC9B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGN,qBAAQ,CAAC,eAAe,CAAC;IACzD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGA,qBAAQ,CAAe,KAAK,CAAC;;IAGrE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,qBAAQ,CAAC,UAAU,CAAC;;AAGtD,IAAA,MAAM,cAAc,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE;IACzC,MAAM,aAAa,GAAG,EAAE;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC;AAEhF,IAAA,MAAM,WAAW,GAAG,YAAY,KAAK,UAAU;IAE/C,MAAM,YAAY,GAAG,MAAK;AACxB,QAAA,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE;AACpB,YAAA,OAAO,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,eAAe,EAAE,CAAC;QAC3E;AACF,IAAA,CAAC;AAED,IAAA,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AACtB,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACd,YAAA,QAAQ,EAAE;YACV;QACF;;QAGA,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE;AAC3B,YAAA,YAAY,EAAE;YACd;QACF;;QAGA,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;YAC5B,IAAI,WAAW,EAAE;AACf,gBAAA,YAAY,EAAE;YAChB;iBAAO;gBACL,eAAe,CAAC,UAAU,CAAC;YAC7B;YACA;QACF;QAEA,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE;AAC5B,YAAA,eAAe,CAAC,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG,UAAU,GAAG,KAAK,CAAC;YAC5D;QACF;AAEA,QAAA,IAAI,GAAG,CAAC,OAAO,EAAE;AACf,YAAA,eAAe,CAAC,IAAI,IAAI,IAAI,KAAK,UAAU,GAAG,KAAK,GAAG,UAAU,CAAC;YACjE;QACF;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,eAAe,GAAG,CAAC,KAAa,KAAI;QACxC,YAAY,CAAC,KAAK,CAAC;AACrB,IAAA,CAAC;IAED,QACEE,uBAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,EAAE,UAAU,EAAA,QAAA,EAAA,CAEpED,sBAAC,MAAM,EAAA,EAAA,CAAG,EAGVA,qBAAA,CAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAA,CAAI,EAGrBA,sBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,CAAmB,EAGnDA,sBAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,CAAI,EAGrBC,sBAAA,CAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,EAAA,QAAA,EAAA,CAEhCA,uBAAC,GAAG,EAAA,EAAC,aAAa,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAA,QAAA,EAAA,CAC1CD,qBAAA,CAAC,GAAG,EAAA,EAAC,KAAK,EAAEK,aAAW,EAAE,cAAc,EAAC,UAAU,EAAC,WAAW,EAAE,CAAC,EAAA,QAAA,EAC/DL,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,YAAY,KAAK,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,2BAExD,EAAA,CACH,EACNA,sBAAC,GAAG,EAAA,EACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,YAAY,KAAK,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EACnE,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,EAAE,EAAA,QAAA,EAETA,qBAAA,CAAC,WAAW,EAAA,EACV,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAC,uBAAuB,EACnC,OAAO,EAAE,YAAY,KAAK,KAAK,EAAA,CAC/B,EAAA,CACE,IACF,EAGL,UAAU,IAAI,YAAY,KAAK,KAAK,KACnCA,qBAAA,CAAC,GAAG,EAAA,EAAC,UAAU,EAAEK,aAAW,GAAG,CAAC,EAAA,QAAA,EAC9BL,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAA,IAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,CAE5B,EAAA,CACH,CACP,EAGDC,uBAAC,GAAG,EAAA,EAAC,aAAa,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAA,QAAA,EAAA,CAC1CD,qBAAA,CAAC,GAAG,EAAA,EAAC,KAAK,EAAEK,aAAW,EAAE,cAAc,EAAC,UAAU,EAAC,WAAW,EAAE,CAAC,EAAA,QAAA,EAC/DL,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,YAAY,KAAK,UAAU,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,WAAA,EAAA,CAE7D,EAAA,CACH,EACNA,sBAAC,GAAG,EAAA,EACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,YAAY,KAAK,UAAU,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EACxE,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,EAAE,EAAA,QAAA,EAER,YAAY,KAAK,UAAU,IAC1BA,sBAAC,SAAS,EAAA,EACR,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,eAAe,IAAI,iBAAiB,GACjD,KAEFA,sBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,YAClD,QAAQ,IAAI,eAAe,IAAI,iBAAiB,GAC5C,CACR,EAAA,CACG,IACF,CAAA,EAAA,CACF,EAGNA,sBAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,CAAI,EAGrBC,sBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,wBACjB,WAAW,GAAG,cAAc,GAAG,YAAY,EAAA,uCAAA,CAAA,EAAA,CAC9C,EAGN,CAAC,SAAS,CAAC,IAAI,EAAE,KAChBD,sBAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,YACfA,qBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,uCAA+B,EAAA,CACtD,CACP,CAAA,EAAA,CACG;AAEV;;AC9JA,MAAM,eAAe,GAAkB;AACrC,IAAA,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,4BAA4B,EAAE;AACnD,IAAA,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,EAAE;CAC7C;AAED;AACA,MAAM,WAAW,GAAG,EAAE;AAEtB;;AAEG;AACG,SAAU,gBAAgB,CAAC,EAC/B,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,KAAK,GACiB,EAAA;AACtB,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE;;AAG9B,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGD,qBAAQ,CAAC,aAAa,EAAE,MAAM,IAAI,MAAM,CAAC;;AAGrE,IAAA,MAAM,kBAAkB,GAAG,CAAC,KAAa,KAAI;QAC3C,SAAS,CAAC,KAAK,CAAC;AAClB,IAAA,CAAC;AACD,IAAA,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,qBAAQ,CACxC,aAAa,EAAE,SAAS,IAAI,yBAAyB,CACtD;IACD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGA,qBAAQ,CAC9C,aAAa,EAAE,OAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,MAAM,CACrD;AACD,IAAA,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAGA,qBAAQ,CAAC,aAAa,EAAE,WAAW,IAAI,EAAE,CAAC;IAEhF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGA,qBAAQ,CAAe,QAAQ,CAAC;;AAGxE,IAAA,MAAM,cAAc,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE;IACzC,MAAM,aAAa,GAAG,EAAE;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC;;AAGhF,IAAA,MAAM,UAAU,GAAmB,YAAY,KAAK;UAChD,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa;UACjD,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC;IAEvC,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC;IAC1D,MAAM,WAAW,GAAG,iBAAiB,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC;AAE/D,IAAA,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AACtB,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACd,YAAA,QAAQ,EAAE;YACV;QACF;;QAGA,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE;AAC3B,YAAA,YAAY,EAAE;YACd;QACF;;QAGA,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;YAC5B,IAAI,WAAW,EAAE;AACf,gBAAA,YAAY,EAAE;YAChB;iBAAO;gBACL,eAAe,CAAC,UAAU,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;YACpD;YACA;QACF;;QAGA,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE;AAC5B,YAAA,IAAI,YAAY,KAAK,UAAU,EAAE;gBAC/B,MAAM,SAAS,GAAG,CAAC,iBAAiB,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM;AAC7D,gBAAA,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACxC;YACA;QACF;;AAGA,QAAA,IAAI,GAAG,CAAC,OAAO,EAAE;AACf,YAAA,IAAI,YAAY,KAAK,UAAU,EAAE;AAC/B,gBAAA,MAAM,SAAS,GAAG,iBAAiB,GAAG,CAAC,GAAG,iBAAiB,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC;AACvF,gBAAA,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACxC;YACA;QACF;AACF,IAAA,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,MAAK;AACxB,QAAA,MAAM,MAAM,GAAmB;AAC7B,YAAA,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM;AAC/B,YAAA,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,yBAAyB;YACxD,OAAO,EAAE,YAAY,KAAK,MAAM;AAChC,YAAA,WAAW,EAAE,YAAY,KAAK,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,SAAS;SACxE;QACD,QAAQ,CAAC,MAAM,CAAC;AAClB,IAAA,CAAC;AAED,IAAA,MAAM,wBAAwB,GAAG,CAAC,EAAU,KAAI;QAC9C,eAAe,CAAC,EAAuB,CAAC;;AAExC,QAAA,IAAI,EAAE,KAAK,QAAQ,EAAE;YACnB,eAAe,CAAC,aAAa,CAAC;QAChC;AACF,IAAA,CAAC;AAED,IAAA,QACEE,sBAAA,CAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,EAAE,UAAU,EAAA,QAAA,EAAA,CAEpED,sBAAC,MAAM,EAAA,EAAA,CAAG,EAGVA,qBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,CAAI,EAGrBA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,4CAA6B,EAG3DA,qBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAA,CAAI,EAGrBC,uBAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,EAAA,QAAA,EAAA,CAEhCA,uBAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAA,QAAA,EAAA,CACzBA,sBAAA,CAAC,GAAG,EAAA,EAAC,aAAa,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAA,QAAA,EAAA,CAC1CD,qBAAA,CAAC,GAAG,EAAA,EAAC,KAAK,EAAE,WAAW,EAAE,cAAc,EAAC,UAAU,EAAC,WAAW,EAAE,CAAC,YAC/DA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,YAAY,KAAK,QAAQ,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,uBAEpF,EAAA,CACH,EACNA,qBAAA,CAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,YAAY,KAAK,QAAQ,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,EAC/F,QAAQ,EAAE,CAAC,YAEV,YAAY,KAAK,QAAQ,IACxBA,qBAAA,CAAC,SAAS,IACR,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAC,MAAM,EAAA,CAClB,KAEFA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,EAAA,QAAA,EAChD,MAAM,IAAI,MAAM,EAAA,CACZ,CACR,EAAA,CACG,IACF,EAEL,KAAK,KACJA,sBAAC,GAAG,EAAA,EAAC,UAAU,EAAE,WAAW,GAAG,CAAC,EAAA,QAAA,EAC9BC,sBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,aACtB,OAAO,CAAC,KAAK,EAAA,GAAA,EAAG,KAAK,CAAA,EAAA,CACjB,EAAA,CACH,CACP,CAAA,EAAA,CACG,EAGNA,uBAAC,GAAG,EAAA,EAAC,aAAa,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,aAC1CD,qBAAA,CAAC,GAAG,EAAA,EAAC,KAAK,EAAE,WAAW,EAAE,cAAc,EAAC,UAAU,EAAC,WAAW,EAAE,CAAC,EAAA,QAAA,EAC/DA,sBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,YAAY,KAAK,WAAW,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,WAAA,EAAA,CAE9D,EAAA,CACH,EACNA,qBAAA,CAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,YAAY,KAAK,WAAW,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EACzE,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,EAAE,YAER,YAAY,KAAK,WAAW,IAC3BA,qBAAA,CAAC,SAAS,EAAA,EACR,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAC,yBAAyB,EAAA,CACrC,KAEFA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,YACnD,SAAS,IAAI,yBAAyB,EAAA,CAClC,CACR,EAAA,CACG,CAAA,EAAA,CACF,EAGNC,sBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAA,QAAA,EAAA,CACxDD,sBAAC,GAAG,EAAA,EAAC,KAAK,EAAE,WAAW,EAAE,cAAc,EAAC,UAAU,EAAC,WAAW,EAAE,CAAC,EAAA,QAAA,EAC/DA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,YAAY,KAAK,UAAU,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,UAAA,EAAA,CAE7D,EAAA,CACH,EACNA,qBAAA,CAAC,UAAU,IACT,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,wBAAwB,EAClC,OAAO,EAAE,YAAY,KAAK,UAAU,EAAA,CACpC,IACE,EAGL,YAAY,KAAK,QAAQ,KACxBC,sBAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAA,QAAA,EAAA,CACxDD,sBAAC,GAAG,EAAA,EAAC,KAAK,EAAE,WAAW,EAAE,cAAc,EAAC,UAAU,EAAC,WAAW,EAAE,CAAC,YAC/DA,qBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,YAAY,KAAK,aAAa,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,EAAA,QAAA,EAAA,KAAA,EAAA,CAEhE,EAAA,CACH,EACNA,sBAAC,GAAG,EAAA,EACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,YAAY,KAAK,aAAa,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EAC3E,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,EAAE,EAAA,QAAA,EAER,YAAY,KAAK,aAAa,IAC7BA,qBAAA,CAAC,SAAS,EAAA,EACR,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAC,mCAAmC,GAC/C,KAEFA,qBAAA,CAAC,IAAI,IAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,EAAA,QAAA,EACrD,WAAW,IAAI,mCAAmC,EAAA,CAC9C,CACR,EAAA,CACG,CAAA,EAAA,CACF,CACP,CAAA,EAAA,CACG,EAGNA,qBAAA,CAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAA,CAAI,EAGrBC,uBAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAA,QAAA,EAAA,CAC7CA,uBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,wBACjB,WAAW,GAAG,OAAO,GAAG,YAAY,EAAA,uCAAA,CAAA,EAAA,CACvC,EACN,YAAY,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAC/CD,qBAAA,CAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAA,QAAA,EACfC,uBAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,CACxB,OAAO,CAAC,SAAS,EAAA,8CAAA,CAAA,EAAA,CACb,EAAA,CACH,CACP,CAAA,EAAA,CACG,CAAA,EAAA,CACF;AAEV;;ACzOA;;AAEG;AACH,SAAS,GAAG,CAAC,EACX,YAAY,EACZ,MAAM,EACN,aAAa,EACb,YAAY,EACZ,WAAW,GAOZ,EAAA;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGF,qBAAQ,CAAW,YAAY,CAAC;;AAG1D,IAAA,MAAM,UAAU,GAAG,CAAC,MAAc,KAAI;AACpC,QAAA,QAAQ,CAAC,IAAI,KAAK,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACzC,IAAA,CAAC;;AAGD,IAAA,MAAM,yBAAyB,GAAG,CAAC,KAAa,EAAE,UAAkB,KAAI;AACtE,QAAA,QAAQ,CAAC,IAAI,KAAK;AAChB,YAAA,GAAG,IAAI;YACP,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU;AACjD,SAAA,CAAC,CAAC;AACL,IAAA,CAAC;;AAGD,IAAA,MAAM,gBAAgB,GAAG,CAAC,IAAmB,KAAI;AAC/C,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AACpB,YAAA,UAAU,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;QACpC;aAAO;AACL,YAAA,UAAU,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACrC;AACF,IAAA,CAAC;;AAGD,IAAA,MAAM,iBAAiB,GAAG,CAAC,MAAmB,KAAI;AAChD,QAAA,IAAI,MAAM,KAAK,MAAM,EAAE;AACrB,YAAA,UAAU,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACrC;AAAO,aAAA,IAAI,MAAM,KAAK,OAAO,EAAE;AAC7B,YAAA,YAAY,EAAE;QAChB;AACF,IAAA,CAAC;;AAGD,IAAA,MAAM,iBAAiB,GAAG,CAAC,MAAoB,KAAI;QACjD,aAAa,CAAC,MAAM,CAAC;AACvB,IAAA,CAAC;;AAGD,IAAA,MAAM,kBAAkB,GAAG,OAAO,MAAsB,KAAI;;AAE1D,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE;YAC5B,WAAW,CAAC,MAAM,CAAC;YACnB;QACF;;QAGA,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,eAAe,CAAC;AAClD,QAAA,IAAI;AACF,YAAA,QAAQ,CACN,CAAA,4EAAA,EAA+E,MAAM,CAAC,MAAM,CAAA,CAAE,EAC9F,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB;;YAED,WAAW,CAAC,MAAM,CAAC;QACrB;AAAE,QAAA,MAAM;;YAEN,yBAAyB,CACvB,CAAA,QAAA,EAAW,MAAM,CAAC,MAAM,CAAA,WAAA,CAAa,EACrC,MAAM,CAAC,MAAM,CACd;QACH;AACF,IAAA,CAAC;;AAGD,IAAA,QAAQ,KAAK,CAAC,MAAM,CAAC,IAAI;AACvB,QAAA,KAAK,aAAa;AAChB,YAAA,QACEC,qBAAA,CAAC,gBAAgB,EAAA,EACf,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,MAAM,EAAA,CAChB;AAGN,QAAA,KAAK,YAAY;AACf,YAAA,QACEA,qBAAA,CAAC,eAAe,EAAA,EACd,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAA,CACnD;AAGN,QAAA,KAAK,aAAa;AAChB,YAAA,QACEA,qBAAA,CAAC,gBAAgB,EAAA,EACf,UAAU,EAAE,KAAK,CAAC,WAAW,EAC7B,eAAe,EAAE,KAAK,CAAC,gBAAgB,EACvC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAA,CACnD;AAGN,QAAA,KAAK,aAAa;AAChB,YAAA,QACEA,qBAAA,CAAC,gBAAgB,EAAA,EACf,aAAa,EAAE;AACb,oBAAA,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM;oBACzC,SAAS,EAAE,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC;AAC9E,oBAAA,OAAO,EAAE,IAAI;iBACd,EACD,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAClD,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAA,CACzB;AAGN,QAAA;AACE,YAAA,OAAO,IAAI;;AAEjB;AAEA;;AAEG;AACH,SAAS,iBAAiB,GAAA;AACxB,IAAA,IAAI;AACF,QAAA,OAAO,QAAQ,EAAE,CAAC,QAAQ;IAC5B;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,QAAQ;IAC7D;AACF;AAEA;;AAEG;AACI,eAAe,cAAc,GAAA;;IAElC,OAAO,CAAC,KAAK,EAAE;AAEf,IAAA,MAAM,aAAa,GAAG,aAAa,CAAC,aAAa,EAAE;IACnD,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE;AACnD,IAAA,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE;;IAElC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,IAAI,iBAAiB,EAAE;AAC3E,IAAA,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE;AAEhD,IAAA,MAAM,YAAY,GAAa;AAC7B,QAAA,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;QAC/B,aAAa;QACb,WAAW;QACX,gBAAgB;QAChB,iBAAiB;KAClB;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;QACrC,IAAI,UAAU,GAAkE,IAAI;QACpF,IAAI,YAAY,GAAwB,IAAI;QAC5C,IAAI,UAAU,GAA0B,IAAI;AAE5C,QAAA,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CACvCA,qBAAA,CAAC,GAAG,EAAA,EACF,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAK;gBACX,UAAU,GAAG,MAAM;AACnB,gBAAA,OAAO,EAAE;AACX,YAAA,CAAC,EACD,aAAa,EAAE,CAAC,MAAM,KAAI;gBACxB,UAAU,GAAG,cAAc;gBAC3B,YAAY,GAAG,MAAM;AACrB,gBAAA,OAAO,EAAE;AACX,YAAA,CAAC,EACD,YAAY,EAAE,MAAK;gBACjB,UAAU,GAAG,aAAa;AAC1B,gBAAA,OAAO,EAAE;AACX,YAAA,CAAC,EACD,WAAW,EAAE,CAAC,MAAM,KAAI;gBACtB,UAAU,GAAG,YAAY;gBACzB,UAAU,GAAG,MAAM;AACnB,gBAAA,OAAO,EAAE;AACX,YAAA,CAAC,GACD,EACF;AACE,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CACF;AAED,QAAA,aAAa,EAAE,CAAC,IAAI,CAAC,YAAW;YAC9B,IAAI,CAAC,UAAU,EAAE;;gBAEf,OAAO,CAAC,KAAK,EAAE;AACf,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB;YAEA,QAAQ,UAAU;AAChB,gBAAA,KAAK,MAAM;oBACT,OAAO,CAAC,KAAK,EAAE;AACf,oBAAA,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAC7B,oBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;oBACf;AAEF,gBAAA,KAAK,cAAc;oBACjB,IAAI,YAAY,EAAE;wBAChB,OAAO,CAAC,KAAK,EAAE;AACf,wBAAA,MAAM,WAAW,CAAC,YAAY,CAAC;oBACjC;oBACA;AAEF,gBAAA,KAAK,aAAa;oBAChB,OAAO,CAAC,KAAK,EAAE;oBACf,MAAM,cAAc,EAAE;oBACtB;AAEF,gBAAA,KAAK,YAAY;oBACf,IAAI,UAAU,EAAE;;AAEd,wBAAA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;AACrC,wBAAA,MAAM,iBAAiB,CAAC,UAAU,CAAC;oBACrC;oBACA;;AAGJ,YAAA,OAAO,EAAE;AACX,QAAA,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;AAClB,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACH,eAAe,WAAW,CAAC,MAAoB,EAAA;;AAE7C,IAAA,IAAI,MAAM,CAAC,GAAG,EAAE;QACd,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;AACtD,QAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE;AAC1B,YAAA,GAAG,YAAY;YACf,MAAM,EAAE,MAAM,CAAC,GAAG;AACnB,SAAA,CAAC;IACJ;;AAGA,IAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;QACnB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpD,QAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE;AAC1B,YAAA,GAAG,UAAU;YACb,YAAY,EAAE,MAAM,CAAC,QAAQ;AAC9B,SAAA,CAAC;IACJ;AAEA,IAAA,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,CAAA,aAAA,EAAgB,MAAM,CAAC,QAAQ,CAAA,CAAE,CAAC;AAC9C,IAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC;IAEjD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,OAAO,mBAAU,CAAC;AAC/C,IAAA,MAAM,UAAU,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,GAAG;QAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;AAC1B,KAAA,CAAC;AACJ;AAEA;;AAEG;AACH,eAAe,cAAc,GAAA;AAC3B,IAAA,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC;IAE1D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,OAAO,qBAAY,CAAC;AACnD,IAAA,MAAM,YAAY,CAAC,EAAE,CAAC;AACxB;AAEA;;AAEG;AACH,eAAe,iBAAiB,CAAC,MAAsB,EAAA;;IAErD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG;UAC7C,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE;AACzC,UAAE,MAAM,CAAC,SAAS;IAEpB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,OAAO,wBAAe,CAAC;;AAGxD,IAAA,MAAM,OAAO,GAKT;QACF,SAAS;QACT,MAAM,EAAE,MAAM,CAAC,MAAM;AACrB,QAAA,GAAG,EAAE,IAAI;KACV;;AAGD,IAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,QAAA,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B;AAAO,SAAA,IAAI,MAAM,CAAC,WAAW,EAAE;QAC7B,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;IACxC;AAEA,IAAA,MAAM,cAAc,CAAC,OAAO,CAAC;AAC/B;;;;"}
|
|
@@ -3,19 +3,18 @@ import chalk from 'chalk';
|
|
|
3
3
|
import { homedir, userInfo } from 'node:os';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { useInput, Box, Text, useStdout, useApp, render } from 'ink';
|
|
6
|
-
import
|
|
6
|
+
import { r as reactExports, j as jsxRuntimeExports, c as colors, R as React } from './theme-BF4W2Gwm.js';
|
|
7
7
|
import { l as logger } from './logger-ZpJi7chw.js';
|
|
8
8
|
import { c as configManager } from './config-manager-BkbjtN-H.js';
|
|
9
9
|
import { startRunner } from '../index.js';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import { u as useBuildState, a as useLogEntries, B as BuildPanel } from './useBuildState-CdBSu9y_.js';
|
|
13
|
-
import { g as getVersionInfo, B as Banner } from './Banner-D4tqKfzA.js';
|
|
10
|
+
import { u as useBuildState, a as useLogEntries, B as BuildPanel } from './useBuildState-BZuezCb6.js';
|
|
11
|
+
import { g as getVersionInfo, B as Banner } from './Banner-ClJs6QcI.js';
|
|
14
12
|
import TextInput from 'ink-text-input';
|
|
15
13
|
import { g as getLogBuffer, i as initRunnerLogger, s as setFileLoggerTuiMode } from './runner-logger-instance-nDWv2h2T.js';
|
|
16
14
|
import 'node:fs';
|
|
17
15
|
import 'node:events';
|
|
18
|
-
import { h as hasStoredToken, g as getStoredToken, p as performOAuthLogin, s as storeToken } from './cli-auth-
|
|
16
|
+
import { h as hasStoredToken, g as getStoredToken, p as performOAuthLogin, s as storeToken } from './cli-auth-rqwB_Zwt.js';
|
|
17
|
+
import './_commonjsHelpers-DcsQGttR.js';
|
|
19
18
|
import 'conf';
|
|
20
19
|
import '@anthropic-ai/claude-agent-sdk';
|
|
21
20
|
import '@openai/codex-sdk';
|
|
@@ -51,8 +50,8 @@ import 'zlib';
|
|
|
51
50
|
import 'node:http';
|
|
52
51
|
|
|
53
52
|
function LogPanel({ entries, isVerbose, width, height, isFocused }) {
|
|
54
|
-
const [scrollOffset, setScrollOffset] = useState(0);
|
|
55
|
-
const [autoScroll, setAutoScroll] = useState(true);
|
|
53
|
+
const [scrollOffset, setScrollOffset] = reactExports.useState(0);
|
|
54
|
+
const [autoScroll, setAutoScroll] = reactExports.useState(true);
|
|
56
55
|
// Filter entries based on verbose mode
|
|
57
56
|
const visibleEntries = isVerbose
|
|
58
57
|
? entries
|
|
@@ -60,7 +59,7 @@ function LogPanel({ entries, isVerbose, width, height, isFocused }) {
|
|
|
60
59
|
// Available height for log lines (subtract 2 for border, 1 for header)
|
|
61
60
|
const visibleLines = Math.max(1, height - 3);
|
|
62
61
|
// Auto-scroll when new entries arrive
|
|
63
|
-
useEffect(() => {
|
|
62
|
+
reactExports.useEffect(() => {
|
|
64
63
|
if (autoScroll && visibleEntries.length > 0) {
|
|
65
64
|
const maxScroll = Math.max(0, visibleEntries.length - visibleLines);
|
|
66
65
|
setScrollOffset(maxScroll);
|
|
@@ -93,7 +92,7 @@ function LogPanel({ entries, isVerbose, width, height, isFocused }) {
|
|
|
93
92
|
});
|
|
94
93
|
// Get visible slice of entries
|
|
95
94
|
const displayedEntries = visibleEntries.slice(scrollOffset, scrollOffset + visibleLines);
|
|
96
|
-
return (jsxs(Box, { flexDirection: "column", width: width, height: height, borderStyle: "single", borderColor: isFocused ? colors.cyan : colors.darkGray, paddingX: 1, children: [jsxs(Box, { justifyContent: "space-between", marginBottom: 0, children: [jsx(Text, { color: colors.cyan, bold: true, children: "LOGS" }), jsxs(Text, { color: colors.dimGray, children: ["[verbose: ", isVerbose ? 'on' : 'off', "]"] })] }), jsx(Box, { flexDirection: "column", flexGrow: 1, children: displayedEntries.length === 0 ? (jsx(Box, { justifyContent: "center", alignItems: "center", flexGrow: 1, children: jsx(Text, { color: colors.dimGray, children: "Waiting for logs..." }) })) : (displayedEntries.map((entry, index) => (jsx(LogEntryRow, { entry: entry, maxWidth: width - 4 }, entry.id)))) }), visibleEntries.length > visibleLines && (jsx(Box, { justifyContent: "flex-end", children: jsxs(Text, { color: colors.dimGray, children: [scrollOffset + 1, "-", Math.min(scrollOffset + visibleLines, visibleEntries.length), "/", visibleEntries.length, autoScroll ? ' (auto)' : ''] }) }))] }));
|
|
95
|
+
return (jsxRuntimeExports.jsxs(Box, { flexDirection: "column", width: width, height: height, borderStyle: "single", borderColor: isFocused ? colors.cyan : colors.darkGray, paddingX: 1, children: [jsxRuntimeExports.jsxs(Box, { justifyContent: "space-between", marginBottom: 0, children: [jsxRuntimeExports.jsx(Text, { color: colors.cyan, bold: true, children: "LOGS" }), jsxRuntimeExports.jsxs(Text, { color: colors.dimGray, children: ["[verbose: ", isVerbose ? 'on' : 'off', "]"] })] }), jsxRuntimeExports.jsx(Box, { flexDirection: "column", flexGrow: 1, children: displayedEntries.length === 0 ? (jsxRuntimeExports.jsx(Box, { justifyContent: "center", alignItems: "center", flexGrow: 1, children: jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: "Waiting for logs..." }) })) : (displayedEntries.map((entry, index) => (jsxRuntimeExports.jsx(LogEntryRow, { entry: entry, maxWidth: width - 4 }, entry.id)))) }), visibleEntries.length > visibleLines && (jsxRuntimeExports.jsx(Box, { justifyContent: "flex-end", children: jsxRuntimeExports.jsxs(Text, { color: colors.dimGray, children: [scrollOffset + 1, "-", Math.min(scrollOffset + visibleLines, visibleEntries.length), "/", visibleEntries.length, autoScroll ? ' (auto)' : ''] }) }))] }));
|
|
97
96
|
}
|
|
98
97
|
// Individual log entry row
|
|
99
98
|
function LogEntryRow({ entry, maxWidth }) {
|
|
@@ -121,7 +120,7 @@ function LogEntryRow({ entry, maxWidth }) {
|
|
|
121
120
|
if (entry.toolName) {
|
|
122
121
|
const argsText = entry.toolArgs ? ` ${entry.toolArgs}` : '';
|
|
123
122
|
`${entry.toolName}${argsText}`;
|
|
124
|
-
return (jsxs(Box, { children: [jsx(Text, { color: colors.dimGray, children: time }), jsx(Text, { color: colors.cyan, children: " \uD83D\uDD27 " }), jsx(Text, { color: colors.white, children: entry.toolName }), entry.toolArgs && jsxs(Text, { color: colors.gray, children: [" ", entry.toolArgs] })] }));
|
|
123
|
+
return (jsxRuntimeExports.jsxs(Box, { children: [jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: time }), jsxRuntimeExports.jsx(Text, { color: colors.cyan, children: " \uD83D\uDD27 " }), jsxRuntimeExports.jsx(Text, { color: colors.white, children: entry.toolName }), entry.toolArgs && jsxRuntimeExports.jsxs(Text, { color: colors.gray, children: [" ", entry.toolArgs] })] }));
|
|
125
124
|
}
|
|
126
125
|
// Regular log entries
|
|
127
126
|
const color = levelColors[entry.level];
|
|
@@ -131,36 +130,36 @@ function LogEntryRow({ entry, maxWidth }) {
|
|
|
131
130
|
const truncatedMessage = entry.message.length > availableWidth
|
|
132
131
|
? entry.message.substring(0, availableWidth - 3) + '...'
|
|
133
132
|
: entry.message;
|
|
134
|
-
return (jsxs(Box, { children: [jsx(Text, { color: colors.dimGray, children: time }), jsxs(Text, { color: color, children: [" ", icon, " "] }), jsx(Text, { color: color, children: truncatedMessage })] }));
|
|
133
|
+
return (jsxRuntimeExports.jsxs(Box, { children: [jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: time }), jsxRuntimeExports.jsxs(Text, { color: color, children: [" ", icon, " "] }), jsxRuntimeExports.jsx(Text, { color: color, children: truncatedMessage })] }));
|
|
135
134
|
}
|
|
136
135
|
|
|
137
136
|
function StatusBar({ isConnected, isVerbose, buildCount = 0, currentBuildIndex = 0, view, }) {
|
|
138
137
|
// Get version info
|
|
139
138
|
const versionInfo = getVersionInfo();
|
|
140
139
|
// Connection indicator
|
|
141
|
-
const connectionIndicator = (jsxs(Box, { marginRight: 2, children: [jsx(Text, { color: isConnected ? colors.success : colors.error, children: isConnected ? '●' : '○' }), jsxs(Text, { color: colors.gray, children: [' ', isConnected ? 'Connected' : 'Disconnected'] })] }));
|
|
140
|
+
const connectionIndicator = (jsxRuntimeExports.jsxs(Box, { marginRight: 2, children: [jsxRuntimeExports.jsx(Text, { color: isConnected ? colors.success : colors.error, children: isConnected ? '●' : '○' }), jsxRuntimeExports.jsxs(Text, { color: colors.gray, children: [' ', isConnected ? 'Connected' : 'Disconnected'] })] }));
|
|
142
141
|
// Build count indicator (only show if multiple builds)
|
|
143
|
-
const buildIndicator = buildCount > 1 ? (jsx(Box, { marginRight: 2, children: jsxs(Text, { color: colors.gray, children: ["Build ", currentBuildIndex + 1, "/", buildCount] }) })) : null;
|
|
142
|
+
const buildIndicator = buildCount > 1 ? (jsxRuntimeExports.jsx(Box, { marginRight: 2, children: jsxRuntimeExports.jsxs(Text, { color: colors.gray, children: ["Build ", currentBuildIndex + 1, "/", buildCount] }) })) : null;
|
|
144
143
|
// Shortcuts based on current view
|
|
145
|
-
const shortcuts = view === 'dashboard' ? (jsxs(Box, { children: [jsx(Shortcut$1, { letter: "q", label: "quit" }), jsx(Shortcut$1, { letter: "v", label: `verbose: ${isVerbose ? 'on' : 'off'}` }), jsx(Shortcut$1, { letter: "c", label: "copy" }), jsx(Shortcut$1, { letter: "t", label: "text view" }), buildCount > 1 && jsx(Shortcut$1, { letter: "n/p", label: "switch build" }), jsx(Shortcut$1, { letter: "\u2191\u2193", label: "scroll" })] })) : view === 'fullLog' ? (jsxs(Box, { children: [jsx(Shortcut$1, { letter: "t", label: "dashboard" }), jsx(Shortcut$1, { letter: "c", label: "copy" }), jsx(Shortcut$1, { letter: "/", label: "search" }), jsx(Shortcut$1, { letter: "f", label: "filter" }), jsx(Shortcut$1, { letter: "\u2191\u2193", label: "scroll" }), jsx(Shortcut$1, { letter: "PgUp/Dn", label: "page" })] })) : (jsx(Box, { children: jsx(Shortcut$1, { letter: "Esc", label: "cancel" }) }));
|
|
144
|
+
const shortcuts = view === 'dashboard' ? (jsxRuntimeExports.jsxs(Box, { children: [jsxRuntimeExports.jsx(Shortcut$1, { letter: "q", label: "quit" }), jsxRuntimeExports.jsx(Shortcut$1, { letter: "v", label: `verbose: ${isVerbose ? 'on' : 'off'}` }), jsxRuntimeExports.jsx(Shortcut$1, { letter: "c", label: "copy" }), jsxRuntimeExports.jsx(Shortcut$1, { letter: "t", label: "text view" }), buildCount > 1 && jsxRuntimeExports.jsx(Shortcut$1, { letter: "n/p", label: "switch build" }), jsxRuntimeExports.jsx(Shortcut$1, { letter: "\u2191\u2193", label: "scroll" })] })) : view === 'fullLog' ? (jsxRuntimeExports.jsxs(Box, { children: [jsxRuntimeExports.jsx(Shortcut$1, { letter: "t", label: "dashboard" }), jsxRuntimeExports.jsx(Shortcut$1, { letter: "c", label: "copy" }), jsxRuntimeExports.jsx(Shortcut$1, { letter: "/", label: "search" }), jsxRuntimeExports.jsx(Shortcut$1, { letter: "f", label: "filter" }), jsxRuntimeExports.jsx(Shortcut$1, { letter: "\u2191\u2193", label: "scroll" }), jsxRuntimeExports.jsx(Shortcut$1, { letter: "PgUp/Dn", label: "page" })] })) : (jsxRuntimeExports.jsx(Box, { children: jsxRuntimeExports.jsx(Shortcut$1, { letter: "Esc", label: "cancel" }) }));
|
|
146
145
|
// Version display
|
|
147
|
-
const versionDisplay = (jsx(Box, { marginLeft: 2, children: jsx(Text, { color: colors.dimGray, children: versionInfo.display }) }));
|
|
148
|
-
return (jsxs(Box, { borderStyle: "single", borderColor: colors.darkGray, paddingX: 1, justifyContent: "space-between", children: [jsxs(Box, { children: [connectionIndicator, buildIndicator] }), jsxs(Box, { children: [shortcuts, versionDisplay] })] }));
|
|
146
|
+
const versionDisplay = (jsxRuntimeExports.jsx(Box, { marginLeft: 2, children: jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: versionInfo.display }) }));
|
|
147
|
+
return (jsxRuntimeExports.jsxs(Box, { borderStyle: "single", borderColor: colors.darkGray, paddingX: 1, justifyContent: "space-between", children: [jsxRuntimeExports.jsxs(Box, { children: [connectionIndicator, buildIndicator] }), jsxRuntimeExports.jsxs(Box, { children: [shortcuts, versionDisplay] })] }));
|
|
149
148
|
}
|
|
150
149
|
// Helper component for shortcuts
|
|
151
150
|
function Shortcut$1({ letter, label }) {
|
|
152
|
-
return (jsxs(Box, { marginRight: 2, children: [jsx(Text, { color: colors.dimGray, children: "[" }), jsx(Text, { color: colors.cyan, children: letter }), jsx(Text, { color: colors.dimGray, children: "]" }), jsx(Text, { color: colors.gray, children: label })] }));
|
|
151
|
+
return (jsxRuntimeExports.jsxs(Box, { marginRight: 2, children: [jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: "[" }), jsxRuntimeExports.jsx(Text, { color: colors.cyan, children: letter }), jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: "]" }), jsxRuntimeExports.jsx(Text, { color: colors.gray, children: label })] }));
|
|
153
152
|
}
|
|
154
153
|
|
|
155
154
|
function FullLogView({ entries, onBack, onCopy }) {
|
|
156
155
|
const { stdout } = useStdout();
|
|
157
156
|
const terminalHeight = stdout?.rows || 24;
|
|
158
157
|
stdout?.columns || 80;
|
|
159
|
-
const [searchQuery, setSearchQuery] = useState('');
|
|
160
|
-
const [isSearching, setIsSearching] = useState(false);
|
|
161
|
-
const [filterMode, setFilterMode] = useState('all');
|
|
162
|
-
const [scrollOffset, setScrollOffset] = useState(0);
|
|
163
|
-
const [searchMode, setSearchMode] = useState('highlight');
|
|
158
|
+
const [searchQuery, setSearchQuery] = reactExports.useState('');
|
|
159
|
+
const [isSearching, setIsSearching] = reactExports.useState(false);
|
|
160
|
+
const [filterMode, setFilterMode] = reactExports.useState('all');
|
|
161
|
+
const [scrollOffset, setScrollOffset] = reactExports.useState(0);
|
|
162
|
+
const [searchMode, setSearchMode] = reactExports.useState('highlight');
|
|
164
163
|
// Available height for log lines
|
|
165
164
|
const headerHeight = 3;
|
|
166
165
|
const footerHeight = 2;
|
|
@@ -259,9 +258,9 @@ function FullLogView({ entries, onBack, onCopy }) {
|
|
|
259
258
|
if (index === -1) {
|
|
260
259
|
return text;
|
|
261
260
|
}
|
|
262
|
-
return (jsxs(Fragment, { children: [text.slice(0, index), jsx(Text, { backgroundColor: colors.warning, color: "black", children: text.slice(index, index + searchQuery.length) }), text.slice(index + searchQuery.length)] }));
|
|
261
|
+
return (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [text.slice(0, index), jsxRuntimeExports.jsx(Text, { backgroundColor: colors.warning, color: "black", children: text.slice(index, index + searchQuery.length) }), text.slice(index + searchQuery.length)] }));
|
|
263
262
|
};
|
|
264
|
-
return (jsxs(Box, { flexDirection: "column", height: terminalHeight, children: [jsxs(Box, { borderStyle: "single", borderColor: colors.darkGray, paddingX: 1, justifyContent: "space-between", children: [jsx(Text, { color: colors.cyan, bold: true, children: "LOGS" }), jsxs(Box, { children: [jsx(Text, { color: colors.dimGray, children: "Search: " }), isSearching ? (jsx(Box, { borderStyle: "round", borderColor: colors.cyan, paddingX: 1, children: jsx(TextInput, { value: searchQuery, onChange: setSearchQuery, placeholder: "type to search..." }) })) : (jsxs(Text, { color: searchQuery ? colors.white : colors.dimGray, children: ["[", searchQuery || 'none', "] (", searchMode, ")"] })), jsx(Text, { color: colors.dimGray, children: " [/]" })] })] }), jsx(Box, { flexDirection: "column", flexGrow: 1, borderStyle: "single", borderColor: colors.darkGray, borderTop: false, borderBottom: false, paddingX: 1, children: visibleEntries.map((entry, index) => {
|
|
263
|
+
return (jsxRuntimeExports.jsxs(Box, { flexDirection: "column", height: terminalHeight, children: [jsxRuntimeExports.jsxs(Box, { borderStyle: "single", borderColor: colors.darkGray, paddingX: 1, justifyContent: "space-between", children: [jsxRuntimeExports.jsx(Text, { color: colors.cyan, bold: true, children: "LOGS" }), jsxRuntimeExports.jsxs(Box, { children: [jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: "Search: " }), isSearching ? (jsxRuntimeExports.jsx(Box, { borderStyle: "round", borderColor: colors.cyan, paddingX: 1, children: jsxRuntimeExports.jsx(TextInput, { value: searchQuery, onChange: setSearchQuery, placeholder: "type to search..." }) })) : (jsxRuntimeExports.jsxs(Text, { color: searchQuery ? colors.white : colors.dimGray, children: ["[", searchQuery || 'none', "] (", searchMode, ")"] })), jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: " [/]" })] })] }), jsxRuntimeExports.jsx(Box, { flexDirection: "column", flexGrow: 1, borderStyle: "single", borderColor: colors.darkGray, borderTop: false, borderBottom: false, paddingX: 1, children: visibleEntries.map((entry, index) => {
|
|
265
264
|
const time = formatTime(entry.timestamp);
|
|
266
265
|
const levelColors = {
|
|
267
266
|
debug: colors.dimGray,
|
|
@@ -278,13 +277,13 @@ function FullLogView({ entries, onBack, onCopy }) {
|
|
|
278
277
|
error: '✗',
|
|
279
278
|
};
|
|
280
279
|
if (entry.toolName) {
|
|
281
|
-
return (jsxs(Box, { children: [jsx(Text, { color: colors.dimGray, children: time }), jsx(Text, { color: colors.cyan, children: " \uD83D\uDD27 " }), jsx(Text, { color: colors.white, children: highlightSearch(entry.toolName) }), entry.toolArgs && (jsxs(Text, { color: colors.gray, children: [" ", highlightSearch(entry.toolArgs)] }))] }, entry.id));
|
|
280
|
+
return (jsxRuntimeExports.jsxs(Box, { children: [jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: time }), jsxRuntimeExports.jsx(Text, { color: colors.cyan, children: " \uD83D\uDD27 " }), jsxRuntimeExports.jsx(Text, { color: colors.white, children: highlightSearch(entry.toolName) }), entry.toolArgs && (jsxRuntimeExports.jsxs(Text, { color: colors.gray, children: [" ", highlightSearch(entry.toolArgs)] }))] }, entry.id));
|
|
282
281
|
}
|
|
283
|
-
return (jsxs(Box, { children: [jsx(Text, { color: colors.dimGray, children: time }), jsxs(Text, { color: levelColors[entry.level], children: [" ", levelIcons[entry.level], " "] }), jsx(Text, { color: levelColors[entry.level], children: highlightSearch(entry.message) })] }, entry.id));
|
|
284
|
-
}) }), jsxs(Box, { borderStyle: "single", borderColor: colors.darkGray, paddingX: 1, justifyContent: "space-between", children: [jsxs(Box, { children: [jsx(Shortcut, { letter: "t", label: "dashboard" }), jsx(Shortcut, { letter: "c", label: "copy" }), jsx(Shortcut, { letter: "/", label: "search" }), jsx(Shortcut, { letter: "f", label: `filter: ${filterMode}` }), jsx(Shortcut, { letter: "m", label: `mode: ${searchMode}` })] }), jsxs(Text, { color: colors.dimGray, children: [scrollOffset + 1, "-", Math.min(scrollOffset + visibleLines, processedEntries.length), "/", processedEntries.length] })] })] }));
|
|
282
|
+
return (jsxRuntimeExports.jsxs(Box, { children: [jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: time }), jsxRuntimeExports.jsxs(Text, { color: levelColors[entry.level], children: [" ", levelIcons[entry.level], " "] }), jsxRuntimeExports.jsx(Text, { color: levelColors[entry.level], children: highlightSearch(entry.message) })] }, entry.id));
|
|
283
|
+
}) }), jsxRuntimeExports.jsxs(Box, { borderStyle: "single", borderColor: colors.darkGray, paddingX: 1, justifyContent: "space-between", children: [jsxRuntimeExports.jsxs(Box, { children: [jsxRuntimeExports.jsx(Shortcut, { letter: "t", label: "dashboard" }), jsxRuntimeExports.jsx(Shortcut, { letter: "c", label: "copy" }), jsxRuntimeExports.jsx(Shortcut, { letter: "/", label: "search" }), jsxRuntimeExports.jsx(Shortcut, { letter: "f", label: `filter: ${filterMode}` }), jsxRuntimeExports.jsx(Shortcut, { letter: "m", label: `mode: ${searchMode}` })] }), jsxRuntimeExports.jsxs(Text, { color: colors.dimGray, children: [scrollOffset + 1, "-", Math.min(scrollOffset + visibleLines, processedEntries.length), "/", processedEntries.length] })] })] }));
|
|
285
284
|
}
|
|
286
285
|
function Shortcut({ letter, label }) {
|
|
287
|
-
return (jsxs(Box, { marginRight: 2, children: [jsx(Text, { color: colors.dimGray, children: "[" }), jsx(Text, { color: colors.cyan, children: letter }), jsx(Text, { color: colors.dimGray, children: "]" }), jsx(Text, { color: colors.gray, children: label })] }));
|
|
286
|
+
return (jsxRuntimeExports.jsxs(Box, { marginRight: 2, children: [jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: "[" }), jsxRuntimeExports.jsx(Text, { color: colors.cyan, children: letter }), jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: "]" }), jsxRuntimeExports.jsx(Text, { color: colors.gray, children: label })] }));
|
|
288
287
|
}
|
|
289
288
|
|
|
290
289
|
function CopyMenu({ onSelect, onCancel, visibleCount, totalCount }) {
|
|
@@ -308,10 +307,10 @@ function CopyMenu({ onSelect, onCancel, visibleCount, totalCount }) {
|
|
|
308
307
|
onSelect('range');
|
|
309
308
|
}
|
|
310
309
|
});
|
|
311
|
-
return (jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: colors.cyan, paddingX: 2, paddingY: 1, children: [jsx(Box, { marginBottom: 1, children: jsx(Text, { color: colors.cyan, bold: true, children: "Copy Logs" }) }), jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [jsx(CopyOption, { number: "1", label: `Copy visible (${visibleCount} lines)` }), jsx(CopyOption, { number: "2", label: "Copy last 50 lines" }), jsx(CopyOption, { number: "3", label: "Copy last 100 lines" }), jsx(CopyOption, { number: "4", label: `Copy all from file (${totalCount} lines)` }), jsx(CopyOption, { number: "5", label: "Copy range..." })] }), jsx(Box, { children: jsx(Text, { color: colors.dimGray, children: "[Esc] Cancel" }) })] }));
|
|
310
|
+
return (jsxRuntimeExports.jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: colors.cyan, paddingX: 2, paddingY: 1, children: [jsxRuntimeExports.jsx(Box, { marginBottom: 1, children: jsxRuntimeExports.jsx(Text, { color: colors.cyan, bold: true, children: "Copy Logs" }) }), jsxRuntimeExports.jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [jsxRuntimeExports.jsx(CopyOption, { number: "1", label: `Copy visible (${visibleCount} lines)` }), jsxRuntimeExports.jsx(CopyOption, { number: "2", label: "Copy last 50 lines" }), jsxRuntimeExports.jsx(CopyOption, { number: "3", label: "Copy last 100 lines" }), jsxRuntimeExports.jsx(CopyOption, { number: "4", label: `Copy all from file (${totalCount} lines)` }), jsxRuntimeExports.jsx(CopyOption, { number: "5", label: "Copy range..." })] }), jsxRuntimeExports.jsx(Box, { children: jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: "[Esc] Cancel" }) })] }));
|
|
312
311
|
}
|
|
313
312
|
function CopyOption({ number, label }) {
|
|
314
|
-
return (jsxs(Box, { children: [jsx(Text, { color: colors.dimGray, children: "[" }), jsx(Text, { color: colors.cyan, children: number }), jsx(Text, { color: colors.dimGray, children: "]" }), jsxs(Text, { color: colors.white, children: [" ", label] })] }));
|
|
313
|
+
return (jsxRuntimeExports.jsxs(Box, { children: [jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: "[" }), jsxRuntimeExports.jsx(Text, { color: colors.cyan, children: number }), jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: "]" }), jsxRuntimeExports.jsxs(Text, { color: colors.white, children: [" ", label] })] }));
|
|
315
314
|
}
|
|
316
315
|
|
|
317
316
|
function RunnerDashboard({ config, onQuit }) {
|
|
@@ -322,7 +321,7 @@ function RunnerDashboard({ config, onQuit }) {
|
|
|
322
321
|
// State management
|
|
323
322
|
const [buildState, buildActions] = useBuildState();
|
|
324
323
|
const logEntries = useLogEntries(100);
|
|
325
|
-
const [view, setView] = useState('dashboard');
|
|
324
|
+
const [view, setView] = reactExports.useState('dashboard');
|
|
326
325
|
// Handle keyboard input
|
|
327
326
|
useInput((input, key) => {
|
|
328
327
|
// Global quit handler
|
|
@@ -366,7 +365,7 @@ function RunnerDashboard({ config, onQuit }) {
|
|
|
366
365
|
}
|
|
367
366
|
});
|
|
368
367
|
// Handle copy action
|
|
369
|
-
const handleCopy = useCallback(async (option) => {
|
|
368
|
+
const handleCopy = reactExports.useCallback(async (option) => {
|
|
370
369
|
try {
|
|
371
370
|
const buffer = getLogBuffer();
|
|
372
371
|
let entriesToCopy = [];
|
|
@@ -413,7 +412,7 @@ function RunnerDashboard({ config, onQuit }) {
|
|
|
413
412
|
const showBuildPanel = buildState.currentBuild !== null;
|
|
414
413
|
// Check for available update (set by auto-update check in index.ts)
|
|
415
414
|
const updateAvailable = process.env.OPENBUILDER_UPDATE_AVAILABLE;
|
|
416
|
-
return (jsxs(Box, { flexDirection: "column", height: terminalHeight, width: terminalWidth, children: [jsx(Banner, {}), updateAvailable && (jsxs(Box, { justifyContent: "center", paddingY: 0, children: [jsx(Text, { color: colors.cyan, children: "\u2B06 Update available: " }), jsx(Text, { color: colors.success, children: updateAvailable }), jsx(Text, { color: colors.dimGray, children: " \u2014 Run " }), jsx(Text, { color: colors.cyan, children: "openbuilder upgrade" }), jsx(Text, { color: colors.dimGray, children: " to update" })] })), jsxs(Box, { borderStyle: "single", borderColor: colors.darkGray, paddingX: 1, justifyContent: "space-between", children: [jsxs(Text, { color: colors.dimGray, children: ["Runner: ", jsx(Text, { color: colors.cyan, children: config.runnerId }), " \u2022 Server: ", jsx(Text, { color: colors.cyan, children: config.serverUrl.replace(/^wss?:\/\//, '') })] }), jsxs(Box, { children: [jsx(Text, { color: buildState.isConnected ? colors.success : colors.error, children: buildState.isConnected ? '●' : '○' }), jsxs(Text, { color: colors.gray, children: [' ', buildState.isConnected ? 'Connected' : 'Disconnected'] })] })] }), view === 'dashboard' && (jsxs(Box, { flexGrow: 1, height: contentHeight, children: [showBuildPanel && (jsx(BuildPanel, { build: buildState.currentBuild, width: buildPanelWidth, height: contentHeight })), jsx(LogPanel, { entries: logEntries, isVerbose: buildState.isVerbose, width: showBuildPanel ? logPanelWidth : terminalWidth, height: contentHeight, isFocused: true })] })), view === 'fullLog' && (jsx(FullLogView, { entries: logEntries, onBack: () => setView('dashboard'), onCopy: () => setView('copyMenu') })), view === 'copyMenu' && (jsx(Box, { position: "absolute", flexDirection: "column", justifyContent: "center", alignItems: "center", width: terminalWidth, height: terminalHeight, children: jsx(CopyMenu, { onSelect: handleCopy, onCancel: () => setView('dashboard'), visibleCount: Math.min(20, logEntries.length), totalCount: getLogBuffer().readFromFile().length }) })), view === 'dashboard' && (jsx(StatusBar, { isConnected: buildState.isConnected, isVerbose: buildState.isVerbose, buildCount: buildState.builds.length, currentBuildIndex: buildState.currentBuildIndex, view: view }))] }));
|
|
415
|
+
return (jsxRuntimeExports.jsxs(Box, { flexDirection: "column", height: terminalHeight, width: terminalWidth, children: [jsxRuntimeExports.jsx(Banner, {}), updateAvailable && (jsxRuntimeExports.jsxs(Box, { justifyContent: "center", paddingY: 0, children: [jsxRuntimeExports.jsx(Text, { color: colors.cyan, children: "\u2B06 Update available: " }), jsxRuntimeExports.jsx(Text, { color: colors.success, children: updateAvailable }), jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: " \u2014 Run " }), jsxRuntimeExports.jsx(Text, { color: colors.cyan, children: "openbuilder upgrade" }), jsxRuntimeExports.jsx(Text, { color: colors.dimGray, children: " to update" })] })), jsxRuntimeExports.jsxs(Box, { borderStyle: "single", borderColor: colors.darkGray, paddingX: 1, justifyContent: "space-between", children: [jsxRuntimeExports.jsxs(Text, { color: colors.dimGray, children: ["Runner: ", jsxRuntimeExports.jsx(Text, { color: colors.cyan, children: config.runnerId }), " \u2022 Server: ", jsxRuntimeExports.jsx(Text, { color: colors.cyan, children: config.serverUrl.replace(/^wss?:\/\//, '') })] }), jsxRuntimeExports.jsxs(Box, { children: [jsxRuntimeExports.jsx(Text, { color: buildState.isConnected ? colors.success : colors.error, children: buildState.isConnected ? '●' : '○' }), jsxRuntimeExports.jsxs(Text, { color: colors.gray, children: [' ', buildState.isConnected ? 'Connected' : 'Disconnected'] })] })] }), view === 'dashboard' && (jsxRuntimeExports.jsxs(Box, { flexGrow: 1, height: contentHeight, children: [showBuildPanel && (jsxRuntimeExports.jsx(BuildPanel, { build: buildState.currentBuild, width: buildPanelWidth, height: contentHeight })), jsxRuntimeExports.jsx(LogPanel, { entries: logEntries, isVerbose: buildState.isVerbose, width: showBuildPanel ? logPanelWidth : terminalWidth, height: contentHeight, isFocused: true })] })), view === 'fullLog' && (jsxRuntimeExports.jsx(FullLogView, { entries: logEntries, onBack: () => setView('dashboard'), onCopy: () => setView('copyMenu') })), view === 'copyMenu' && (jsxRuntimeExports.jsx(Box, { position: "absolute", flexDirection: "column", justifyContent: "center", alignItems: "center", width: terminalWidth, height: terminalHeight, children: jsxRuntimeExports.jsx(CopyMenu, { onSelect: handleCopy, onCancel: () => setView('dashboard'), visibleCount: Math.min(20, logEntries.length), totalCount: getLogBuffer().readFromFile().length }) })), view === 'dashboard' && (jsxRuntimeExports.jsx(StatusBar, { isConnected: buildState.isConnected, isVerbose: buildState.isVerbose, buildCount: buildState.builds.length, currentBuildIndex: buildState.currentBuildIndex, view: view }))] }));
|
|
417
416
|
}
|
|
418
417
|
|
|
419
418
|
// Default public OpenBuilder instance
|
|
@@ -668,4 +667,4 @@ async function runCommand(options) {
|
|
|
668
667
|
}
|
|
669
668
|
|
|
670
669
|
export { runCommand };
|
|
671
|
-
//# sourceMappingURL=run-
|
|
670
|
+
//# sourceMappingURL=run-CaSootos.js.map
|