@openbuilder/cli 0.50.20 → 0.50.21
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/{main-tui-Bar2Jb2S.js → main-tui-BrfgfCDw.js} +2 -2
- package/dist/chunks/{main-tui-Bar2Jb2S.js.map → main-tui-BrfgfCDw.js.map} +1 -1
- package/dist/chunks/{run-9mP5QnpK.js → run-LjsGm3tI.js} +5 -2
- package/dist/chunks/run-LjsGm3tI.js.map +1 -0
- package/dist/cli/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunks/run-9mP5QnpK.js.map +0 -1
|
@@ -605,7 +605,7 @@ async function startRunner(config) {
|
|
|
605
605
|
console.log('\n Starting OpenBuilder Runner...\n');
|
|
606
606
|
console.log(` Runner ID: ${config.runnerId}`);
|
|
607
607
|
console.log(' Connecting to remote server...\n');
|
|
608
|
-
const { runCommand } = await import('./run-
|
|
608
|
+
const { runCommand } = await import('./run-LjsGm3tI.js');
|
|
609
609
|
await runCommand({
|
|
610
610
|
secret: config.key,
|
|
611
611
|
runnerId: config.runnerId,
|
|
@@ -645,4 +645,4 @@ async function runInitialization(config) {
|
|
|
645
645
|
}
|
|
646
646
|
|
|
647
647
|
export { mainTUICommand };
|
|
648
|
-
//# sourceMappingURL=main-tui-
|
|
648
|
+
//# sourceMappingURL=main-tui-BrfgfCDw.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main-tui-Bar2Jb2S.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":"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"}
|
|
1
|
+
{"version":3,"file":"main-tui-BrfgfCDw.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":"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"}
|
|
@@ -507,7 +507,10 @@ async function runCommand(options) {
|
|
|
507
507
|
// Resolve runner ID: CLI flag > system username (ignore config 'local' default)
|
|
508
508
|
const runnerId = options.runnerId || getSystemUsername();
|
|
509
509
|
// Resolve secret: CLI flag > config (required)
|
|
510
|
-
|
|
510
|
+
// Only use config secret if it looks like a valid token (starts with sv_)
|
|
511
|
+
// This prevents the default 'dev-secret' from being used in runner mode
|
|
512
|
+
const configSecret = configManager.getSecret();
|
|
513
|
+
const sharedSecret = options.secret || (configSecret?.startsWith('sv_') ? configSecret : undefined);
|
|
511
514
|
const runnerOptions = {
|
|
512
515
|
wsUrl,
|
|
513
516
|
apiUrl,
|
|
@@ -673,4 +676,4 @@ async function runCommand(options) {
|
|
|
673
676
|
}
|
|
674
677
|
|
|
675
678
|
export { runCommand };
|
|
676
|
-
//# sourceMappingURL=run-
|
|
679
|
+
//# sourceMappingURL=run-LjsGm3tI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-LjsGm3tI.js","sources":["../../src/cli/tui/components/LogPanel.tsx","../../src/cli/tui/components/StatusBar.tsx","../../src/cli/tui/components/FullLogView.tsx","../../src/cli/tui/components/CopyMenu.tsx","../../src/cli/tui/screens/RunnerDashboard.tsx","../../src/cli/commands/run.ts"],"sourcesContent":["/**\n * LogPanel - Right panel showing scrollable log entries\n * Takes up 80% of width, shows:\n * - Timestamped log entries\n * - Tool calls with truncated args\n * - Scrollable with keyboard navigation\n */\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\nimport type { LogEntry } from '../../../lib/logging/types.js';\n\ninterface LogPanelProps {\n entries: LogEntry[];\n isVerbose: boolean;\n width: number;\n height: number;\n isFocused: boolean;\n}\n\nexport function LogPanel({ entries, isVerbose, width, height, isFocused }: LogPanelProps) {\n const [scrollOffset, setScrollOffset] = useState(0);\n const [autoScroll, setAutoScroll] = useState(true);\n\n // Filter entries based on verbose mode\n const visibleEntries = isVerbose \n ? entries \n : entries.filter(e => !e.verbose);\n\n // Available height for log lines (subtract 2 for border, 1 for header)\n const visibleLines = Math.max(1, height - 3);\n\n // Auto-scroll when new entries arrive\n useEffect(() => {\n if (autoScroll && visibleEntries.length > 0) {\n const maxScroll = Math.max(0, visibleEntries.length - visibleLines);\n setScrollOffset(maxScroll);\n }\n }, [visibleEntries.length, autoScroll, visibleLines]);\n\n // Handle keyboard navigation\n useInput((input, key) => {\n if (!isFocused) return;\n\n if (key.upArrow) {\n setAutoScroll(false);\n setScrollOffset(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n const maxScroll = Math.max(0, visibleEntries.length - visibleLines);\n setScrollOffset(prev => Math.min(maxScroll, prev + 1));\n // Re-enable auto-scroll if we're at the bottom\n if (scrollOffset >= maxScroll - 1) {\n setAutoScroll(true);\n }\n } else if (key.pageUp) {\n setAutoScroll(false);\n setScrollOffset(prev => Math.max(0, prev - visibleLines));\n } else if (key.pageDown) {\n const maxScroll = Math.max(0, visibleEntries.length - visibleLines);\n setScrollOffset(prev => Math.min(maxScroll, prev + visibleLines));\n }\n });\n\n // Get visible slice of entries\n const displayedEntries = visibleEntries.slice(scrollOffset, scrollOffset + visibleLines);\n\n // Format time\n const formatTime = (timestamp: number): string => {\n return new Date(timestamp).toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n };\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n height={height}\n borderStyle=\"single\"\n borderColor={isFocused ? colors.cyan : colors.darkGray}\n paddingX={1}\n >\n {/* Header */}\n <Box justifyContent=\"space-between\" marginBottom={0}>\n <Text color={colors.cyan} bold>LOGS</Text>\n <Text color={colors.dimGray}>\n [verbose: {isVerbose ? 'on' : 'off'}]\n </Text>\n </Box>\n\n {/* Log entries */}\n <Box flexDirection=\"column\" flexGrow={1}>\n {displayedEntries.length === 0 ? (\n <Box justifyContent=\"center\" alignItems=\"center\" flexGrow={1}>\n <Text color={colors.dimGray}>Waiting for logs...</Text>\n </Box>\n ) : (\n displayedEntries.map((entry, index) => (\n <LogEntryRow \n key={entry.id} \n entry={entry} \n maxWidth={width - 4}\n />\n ))\n )}\n </Box>\n\n {/* Scroll indicator */}\n {visibleEntries.length > visibleLines && (\n <Box justifyContent=\"flex-end\">\n <Text color={colors.dimGray}>\n {scrollOffset + 1}-{Math.min(scrollOffset + visibleLines, visibleEntries.length)}/{visibleEntries.length}\n {autoScroll ? ' (auto)' : ''}\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n\n// Individual log entry row\nfunction LogEntryRow({ entry, maxWidth }: { entry: LogEntry; maxWidth: number }) {\n const time = new Date(entry.timestamp).toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n\n const levelColors = {\n debug: colors.dimGray,\n info: colors.cyan,\n success: colors.success,\n warn: colors.warning,\n error: colors.error,\n };\n\n const levelIcons = {\n debug: ' ',\n info: '●',\n success: '✓',\n warn: '⚠',\n error: '✗',\n };\n\n // Tool calls get special formatting\n if (entry.toolName) {\n const argsText = entry.toolArgs ? ` ${entry.toolArgs}` : '';\n const fullText = `${entry.toolName}${argsText}`;\n const truncated = fullText.length > maxWidth - 12 \n ? fullText.substring(0, maxWidth - 15) + '...'\n : fullText;\n\n return (\n <Box>\n <Text color={colors.dimGray}>{time}</Text>\n <Text color={colors.cyan}> 🔧 </Text>\n <Text color={colors.white}>{entry.toolName}</Text>\n {entry.toolArgs && <Text color={colors.gray}> {entry.toolArgs}</Text>}\n </Box>\n );\n }\n\n // Regular log entries\n const color = levelColors[entry.level];\n const icon = levelIcons[entry.level];\n \n // Truncate message if needed\n const availableWidth = maxWidth - 12; // time + space + icon + space\n const truncatedMessage = entry.message.length > availableWidth\n ? entry.message.substring(0, availableWidth - 3) + '...'\n : entry.message;\n\n return (\n <Box>\n <Text color={colors.dimGray}>{time}</Text>\n <Text color={color}> {icon} </Text>\n <Text color={color}>{truncatedMessage}</Text>\n </Box>\n );\n}\n","/**\n * StatusBar - Bottom bar showing connection status and keyboard shortcuts\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport { colors } from '../theme.js';\nimport { getVersionInfo } from '../../utils/version-info.js';\n\ninterface StatusBarProps {\n isConnected: boolean;\n isVerbose: boolean;\n buildCount?: number;\n currentBuildIndex?: number;\n view: 'dashboard' | 'fullLog' | 'copyMenu';\n}\n\nexport function StatusBar({\n isConnected,\n isVerbose,\n buildCount = 0,\n currentBuildIndex = 0,\n view,\n}: StatusBarProps) {\n // Get version info\n const versionInfo = getVersionInfo();\n \n // Connection indicator\n const connectionIndicator = (\n <Box marginRight={2}>\n <Text color={isConnected ? colors.success : colors.error}>\n {isConnected ? '●' : '○'}\n </Text>\n <Text color={colors.gray}>\n {' '}{isConnected ? 'Connected' : 'Disconnected'}\n </Text>\n </Box>\n );\n\n // Build count indicator (only show if multiple builds)\n const buildIndicator = buildCount > 1 ? (\n <Box marginRight={2}>\n <Text color={colors.gray}>\n Build {currentBuildIndex + 1}/{buildCount}\n </Text>\n </Box>\n ) : null;\n\n // Shortcuts based on current view\n const shortcuts = view === 'dashboard' ? (\n <Box>\n <Shortcut letter=\"q\" label=\"quit\" />\n <Shortcut letter=\"v\" label={`verbose: ${isVerbose ? 'on' : 'off'}`} />\n <Shortcut letter=\"c\" label=\"copy\" />\n <Shortcut letter=\"t\" label=\"text view\" />\n {buildCount > 1 && <Shortcut letter=\"n/p\" label=\"switch build\" />}\n <Shortcut letter=\"↑↓\" label=\"scroll\" />\n </Box>\n ) : view === 'fullLog' ? (\n <Box>\n <Shortcut letter=\"t\" label=\"dashboard\" />\n <Shortcut letter=\"c\" label=\"copy\" />\n <Shortcut letter=\"/\" label=\"search\" />\n <Shortcut letter=\"f\" label=\"filter\" />\n <Shortcut letter=\"↑↓\" label=\"scroll\" />\n <Shortcut letter=\"PgUp/Dn\" label=\"page\" />\n </Box>\n ) : (\n <Box>\n <Shortcut letter=\"Esc\" label=\"cancel\" />\n </Box>\n );\n\n // Version display\n const versionDisplay = (\n <Box marginLeft={2}>\n <Text color={colors.dimGray}>\n {versionInfo.display}\n </Text>\n </Box>\n );\n\n return (\n <Box\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box>\n {connectionIndicator}\n {buildIndicator}\n </Box>\n <Box>\n {shortcuts}\n {versionDisplay}\n </Box>\n </Box>\n );\n}\n\n// Helper component for shortcuts\nfunction Shortcut({ letter, label }: { letter: string; label: string }) {\n return (\n <Box marginRight={2}>\n <Text color={colors.dimGray}>[</Text>\n <Text color={colors.cyan}>{letter}</Text>\n <Text color={colors.dimGray}>]</Text>\n <Text color={colors.gray}>{label}</Text>\n </Box>\n );\n}\n","/**\n * FullLogView - Full-screen log view with search and filter\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { colors } from '../theme.js';\nimport type { LogEntry, LogLevel } from '../../../lib/logging/types.js';\n\ntype FilterMode = 'all' | 'errors' | 'tools' | 'verbose';\n\ninterface FullLogViewProps {\n entries: LogEntry[];\n onBack: () => void;\n onCopy: () => void;\n}\n\nexport function FullLogView({ entries, onBack, onCopy }: FullLogViewProps) {\n const { stdout } = useStdout();\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n\n const [searchQuery, setSearchQuery] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n const [filterMode, setFilterMode] = useState<FilterMode>('all');\n const [scrollOffset, setScrollOffset] = useState(0);\n const [searchMode, setSearchMode] = useState<'filter' | 'highlight'>('highlight');\n\n // Available height for log lines\n const headerHeight = 3;\n const footerHeight = 2;\n const visibleLines = Math.max(1, terminalHeight - headerHeight - footerHeight);\n\n // Filter and search entries\n const processedEntries = entries.filter(entry => {\n // Apply filter mode\n if (filterMode === 'errors' && entry.level !== 'error' && entry.level !== 'warn') {\n return false;\n }\n if (filterMode === 'tools' && !entry.toolName) {\n return false;\n }\n if (filterMode !== 'verbose' && entry.verbose) {\n return false;\n }\n\n // Apply search filter (if in filter mode)\n if (searchQuery && searchMode === 'filter') {\n const query = searchQuery.toLowerCase();\n const messageMatch = entry.message.toLowerCase().includes(query);\n const toolMatch = entry.toolName?.toLowerCase().includes(query);\n const argsMatch = entry.toolArgs?.toLowerCase().includes(query);\n return messageMatch || toolMatch || argsMatch;\n }\n\n return true;\n });\n\n // Calculate max scroll\n const maxScroll = Math.max(0, processedEntries.length - visibleLines);\n\n // Get visible entries\n const visibleEntries = processedEntries.slice(scrollOffset, scrollOffset + visibleLines);\n\n // Handle keyboard input\n useInput((input, key) => {\n if (isSearching) {\n if (key.escape || key.return) {\n setIsSearching(false);\n }\n return;\n }\n\n if (input === 't') {\n onBack();\n } else if (input === 'c') {\n onCopy();\n } else if (input === '/') {\n setIsSearching(true);\n } else if (input === 'f') {\n // Cycle through filter modes\n const modes: FilterMode[] = ['all', 'errors', 'tools', 'verbose'];\n const currentIndex = modes.indexOf(filterMode);\n setFilterMode(modes[(currentIndex + 1) % modes.length]);\n setScrollOffset(0);\n } else if (input === 'm') {\n // Toggle search mode\n setSearchMode(prev => prev === 'filter' ? 'highlight' : 'filter');\n } else if (key.upArrow) {\n setScrollOffset(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setScrollOffset(prev => Math.min(maxScroll, prev + 1));\n } else if (key.pageUp) {\n setScrollOffset(prev => Math.max(0, prev - visibleLines));\n } else if (key.pageDown) {\n setScrollOffset(prev => Math.min(maxScroll, prev + visibleLines));\n } else if (key.escape) {\n if (searchQuery) {\n setSearchQuery('');\n } else {\n onBack();\n }\n }\n });\n\n // Format time\n const formatTime = (timestamp: number): string => {\n return new Date(timestamp).toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n };\n\n // Check if text matches search query\n const highlightSearch = (text: string): React.ReactNode => {\n if (!searchQuery || searchMode !== 'highlight') {\n return text;\n }\n\n const query = searchQuery.toLowerCase();\n const index = text.toLowerCase().indexOf(query);\n if (index === -1) {\n return text;\n }\n\n return (\n <>\n {text.slice(0, index)}\n <Text backgroundColor={colors.warning} color=\"black\">\n {text.slice(index, index + searchQuery.length)}\n </Text>\n {text.slice(index + searchQuery.length)}\n </>\n );\n };\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n {/* Header with search */}\n <Box\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text color={colors.cyan} bold>LOGS</Text>\n <Box>\n <Text color={colors.dimGray}>Search: </Text>\n {isSearching ? (\n <Box borderStyle=\"round\" borderColor={colors.cyan} paddingX={1}>\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder=\"type to search...\"\n />\n </Box>\n ) : (\n <Text color={searchQuery ? colors.white : colors.dimGray}>\n [{searchQuery || 'none'}] ({searchMode})\n </Text>\n )}\n <Text color={colors.dimGray}> [/]</Text>\n </Box>\n </Box>\n\n {/* Log content */}\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n borderTop={false}\n borderBottom={false}\n paddingX={1}\n >\n {visibleEntries.map((entry, index) => {\n const time = formatTime(entry.timestamp);\n const levelColors = {\n debug: colors.dimGray,\n info: colors.cyan,\n success: colors.success,\n warn: colors.warning,\n error: colors.error,\n };\n const levelIcons = {\n debug: ' ',\n info: '●',\n success: '✓',\n warn: '⚠',\n error: '✗',\n };\n\n if (entry.toolName) {\n return (\n <Box key={entry.id}>\n <Text color={colors.dimGray}>{time}</Text>\n <Text color={colors.cyan}> 🔧 </Text>\n <Text color={colors.white}>{highlightSearch(entry.toolName)}</Text>\n {entry.toolArgs && (\n <Text color={colors.gray}> {highlightSearch(entry.toolArgs)}</Text>\n )}\n </Box>\n );\n }\n\n return (\n <Box key={entry.id}>\n <Text color={colors.dimGray}>{time}</Text>\n <Text color={levelColors[entry.level]}> {levelIcons[entry.level]} </Text>\n <Text color={levelColors[entry.level]}>{highlightSearch(entry.message)}</Text>\n </Box>\n );\n })}\n </Box>\n\n {/* Footer with shortcuts and scroll position */}\n <Box\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box>\n <Shortcut letter=\"t\" label=\"dashboard\" />\n <Shortcut letter=\"c\" label=\"copy\" />\n <Shortcut letter=\"/\" label=\"search\" />\n <Shortcut letter=\"f\" label={`filter: ${filterMode}`} />\n <Shortcut letter=\"m\" label={`mode: ${searchMode}`} />\n </Box>\n <Text color={colors.dimGray}>\n {scrollOffset + 1}-{Math.min(scrollOffset + visibleLines, processedEntries.length)}/{processedEntries.length}\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction Shortcut({ letter, label }: { letter: string; label: string }) {\n return (\n <Box marginRight={2}>\n <Text color={colors.dimGray}>[</Text>\n <Text color={colors.cyan}>{letter}</Text>\n <Text color={colors.dimGray}>]</Text>\n <Text color={colors.gray}>{label}</Text>\n </Box>\n );\n}\n","/**\n * CopyMenu - Modal for copying logs to clipboard\n */\n\nimport React from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\n\ninterface CopyMenuProps {\n onSelect: (option: 'visible' | 'last50' | 'last100' | 'all' | 'range') => void;\n onCancel: () => void;\n visibleCount: number;\n totalCount: number;\n}\n\nexport function CopyMenu({ onSelect, onCancel, visibleCount, totalCount }: CopyMenuProps) {\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n } else if (input === '1') {\n onSelect('visible');\n } else if (input === '2') {\n onSelect('last50');\n } else if (input === '3') {\n onSelect('last100');\n } else if (input === '4') {\n onSelect('all');\n } else if (input === '5') {\n onSelect('range');\n }\n });\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={colors.cyan}\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text color={colors.cyan} bold>Copy Logs</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <CopyOption number=\"1\" label={`Copy visible (${visibleCount} lines)`} />\n <CopyOption number=\"2\" label=\"Copy last 50 lines\" />\n <CopyOption number=\"3\" label=\"Copy last 100 lines\" />\n <CopyOption number=\"4\" label={`Copy all from file (${totalCount} lines)`} />\n <CopyOption number=\"5\" label=\"Copy range...\" />\n </Box>\n\n <Box>\n <Text color={colors.dimGray}>[Esc] Cancel</Text>\n </Box>\n </Box>\n );\n}\n\nfunction CopyOption({ number, label }: { number: string; label: string }) {\n return (\n <Box>\n <Text color={colors.dimGray}>[</Text>\n <Text color={colors.cyan}>{number}</Text>\n <Text color={colors.dimGray}>]</Text>\n <Text color={colors.white}> {label}</Text>\n </Box>\n );\n}\n","/**\n * RunnerDashboard - Main TUI container for the runner\n * \n * Layout:\n * - 20% left: BuildPanel (current build + todos) - hidden when no build\n * - 80% right: LogPanel (scrollable logs)\n * - Bottom: StatusBar (connection, shortcuts)\n * \n * Views:\n * - dashboard: Main split view\n * - fullLog: Full-screen log view with search\n * - copyMenu: Copy options modal overlay\n */\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { Box, Text, useInput, useStdout, useApp } from 'ink';\nimport { colors } from '../theme.js';\nimport { BuildPanel } from '../components/BuildPanel.js';\nimport { LogPanel } from '../components/LogPanel.js';\nimport { StatusBar } from '../components/StatusBar.js';\nimport { FullLogView } from '../components/FullLogView.js';\nimport { CopyMenu } from '../components/CopyMenu.js';\nimport { useBuildState, useLogEntries } from '../hooks/useBuildState.js';\nimport { Banner } from '../components/Banner.js';\nimport type { BuildInfo, TodoItem, LogEntry } from '../../../lib/logging/types.js';\nimport { getLogBuffer } from '../../../lib/logging/log-buffer.js';\n\ntype ViewMode = 'dashboard' | 'fullLog' | 'copyMenu';\n\nexport interface RunnerDashboardProps {\n // Initial config (passed from runner)\n config: {\n runnerId: string;\n serverUrl: string;\n workspace: string;\n apiUrl?: string;\n };\n // Event handlers\n onQuit?: () => void;\n}\n\nexport function RunnerDashboard({ config, onQuit }: RunnerDashboardProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n\n // State management\n const [buildState, buildActions] = useBuildState();\n const logEntries = useLogEntries(100);\n const [view, setView] = useState<ViewMode>('dashboard');\n\n // Handle keyboard input\n useInput((input, key) => {\n // Global quit handler\n if (input === 'q' && view !== 'copyMenu') {\n if (onQuit) {\n onQuit();\n }\n exit();\n return;\n }\n\n // Copy menu is modal - handle separately\n if (view === 'copyMenu') {\n return; // CopyMenu handles its own input\n }\n\n // Dashboard shortcuts\n if (view === 'dashboard') {\n if (input === 'v') {\n buildActions.toggleVerbose();\n } else if (input === 'c') {\n setView('copyMenu');\n } else if (input === 't') {\n setView('fullLog');\n } else if (input === 'n') {\n buildActions.nextBuild();\n } else if (input === 'p') {\n buildActions.prevBuild();\n }\n }\n\n // Full log view shortcuts\n if (view === 'fullLog') {\n if (input === 't') {\n setView('dashboard');\n } else if (input === 'c') {\n setView('copyMenu');\n }\n }\n });\n\n // Handle copy action\n const handleCopy = useCallback(async (option: 'visible' | 'last50' | 'last100' | 'all' | 'range') => {\n try {\n const buffer = getLogBuffer();\n let entriesToCopy: LogEntry[] = [];\n\n switch (option) {\n case 'visible':\n entriesToCopy = logEntries.slice(-20); // Approximate visible count\n break;\n case 'last50':\n entriesToCopy = buffer.getRecent(50);\n break;\n case 'last100':\n entriesToCopy = buffer.getRecent(100);\n break;\n case 'all':\n entriesToCopy = buffer.readFromFile();\n break;\n case 'range':\n // TODO: Implement range selection\n entriesToCopy = buffer.getRecent(100);\n break;\n }\n\n const text = buffer.toText(entriesToCopy);\n \n // Copy to clipboard using pbcopy on macOS\n const { spawn } = await import('child_process');\n const pbcopy = spawn('pbcopy');\n pbcopy.stdin.write(text);\n pbcopy.stdin.end();\n \n // TODO: Show success message\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n\n setView('dashboard');\n }, [logEntries]);\n\n // Calculate panel dimensions\n const bannerHeight = 7; // ASCII art banner\n const headerHeight = 3; // Config/status line\n const statusBarHeight = 3;\n const contentHeight = Math.max(1, terminalHeight - bannerHeight - headerHeight - statusBarHeight);\n \n // 20/80 split\n const buildPanelWidth = Math.floor(terminalWidth * 0.2);\n const logPanelWidth = terminalWidth - buildPanelWidth;\n\n // Show build panel only when there's an active build\n const showBuildPanel = buildState.currentBuild !== null;\n\n // Check for available update (set by auto-update check in index.ts)\n const updateAvailable = process.env.OPENBUILDER_UPDATE_AVAILABLE;\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight} width={terminalWidth}>\n {/* Banner */}\n <Banner />\n\n {/* Update notification banner */}\n {updateAvailable && (\n <Box justifyContent=\"center\" paddingY={0}>\n <Text color={colors.cyan}>⬆ Update available: </Text>\n <Text color={colors.success}>{updateAvailable}</Text>\n <Text color={colors.dimGray}> — Run </Text>\n <Text color={colors.cyan}>openbuilder upgrade</Text>\n <Text color={colors.dimGray}> to update</Text>\n </Box>\n )}\n\n {/* Header bar with connection status */}\n <Box\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text color={colors.dimGray}>\n Runner: <Text color={colors.cyan}>{config.runnerId}</Text> • Server: <Text color={colors.cyan}>{config.serverUrl.replace(/^wss?:\\/\\//, '')}</Text>\n </Text>\n <Box>\n <Text color={buildState.isConnected ? colors.success : colors.error}>\n {buildState.isConnected ? '●' : '○'}\n </Text>\n <Text color={colors.gray}>\n {' '}{buildState.isConnected ? 'Connected' : 'Disconnected'}\n </Text>\n </Box>\n </Box>\n\n {/* Main content */}\n {view === 'dashboard' && (\n <Box flexGrow={1} height={contentHeight}>\n {showBuildPanel && (\n <BuildPanel\n build={buildState.currentBuild}\n width={buildPanelWidth}\n height={contentHeight}\n />\n )}\n <LogPanel\n entries={logEntries}\n isVerbose={buildState.isVerbose}\n width={showBuildPanel ? logPanelWidth : terminalWidth}\n height={contentHeight}\n isFocused={true}\n />\n </Box>\n )}\n\n {view === 'fullLog' && (\n <FullLogView\n entries={logEntries}\n onBack={() => setView('dashboard')}\n onCopy={() => setView('copyMenu')}\n />\n )}\n\n {/* Copy menu overlay */}\n {view === 'copyMenu' && (\n <Box\n position=\"absolute\"\n flexDirection=\"column\"\n justifyContent=\"center\"\n alignItems=\"center\"\n width={terminalWidth}\n height={terminalHeight}\n >\n <CopyMenu\n onSelect={handleCopy}\n onCancel={() => setView('dashboard')}\n visibleCount={Math.min(20, logEntries.length)}\n totalCount={getLogBuffer().readFromFile().length}\n />\n </Box>\n )}\n\n {/* Status bar (only in dashboard view) */}\n {view === 'dashboard' && (\n <StatusBar\n isConnected={buildState.isConnected}\n isVerbose={buildState.isVerbose}\n buildCount={buildState.builds.length}\n currentBuildIndex={buildState.currentBuildIndex}\n view={view}\n />\n )}\n </Box>\n );\n}\n\n// Export for external use\nexport { useBuildState, useLogEntries };\n","import chalk from 'chalk';\nimport { homedir, userInfo } from 'node:os';\nimport { join } from 'node:path';\nimport { render } from 'ink';\nimport React from 'react';\nimport { logger } from '../utils/logger.js';\nimport { configManager } from '../utils/config-manager.js';\nimport { startRunner } from '../../index.js';\nimport { RunnerDashboard } from '../tui/screens/RunnerDashboard.js';\nimport { initRunnerLogger } from '../../lib/logging/index.js';\nimport { setFileLoggerTuiMode } from '../../lib/file-logger.js';\nimport { \n hasStoredToken, \n getStoredToken, \n performOAuthLogin, \n storeToken \n} from '../utils/cli-auth.js';\n\n// Default public OpenBuilder instance\nconst DEFAULT_URL = 'https://openbuilder.up.railway.app';\nconst DEFAULT_WORKSPACE = join(homedir(), 'openbuilder-workspace');\n\n/**\n * Normalize URL by adding protocol if missing\n * Uses http:// for localhost, https:// for everything else\n */\nfunction normalizeUrl(url: string): string {\n if (!url) return url;\n\n // If protocol already present, return as-is\n if (url.match(/^https?:\\/\\//i)) {\n return url;\n }\n\n // For localhost or 127.0.0.1, use http://\n if (url.match(/^(localhost|127\\.0\\.0\\.1)(:|\\/|$)/i)) {\n return `http://${url}`;\n }\n\n // For everything else, use https://\n return `https://${url}`;\n}\n\n/**\n * Derive WebSocket URL from a base HTTP/HTTPS URL\n * Converts https://example.com to wss://example.com/ws/runner\n */\nfunction deriveWsUrl(baseUrl: string): string {\n const normalized = normalizeUrl(baseUrl);\n const wsProtocol = normalized.startsWith('https://') ? 'wss://' : 'ws://';\n const hostPath = normalized.replace(/^https?:\\/\\//, '');\n // Remove trailing slash if present\n const cleanHostPath = hostPath.replace(/\\/$/, '');\n return `${wsProtocol}${cleanHostPath}/ws/runner`;\n}\n\n/**\n * Get the current system username\n */\nfunction getSystemUsername(): string {\n try {\n return userInfo().username;\n } catch {\n // Fallback if userInfo() fails\n return process.env.USER || process.env.USERNAME || 'runner';\n }\n}\n\ninterface RunOptions {\n broker?: string; // Legacy: WebSocket URL override (deprecated, use --url instead)\n url?: string;\n workspace?: string;\n runnerId?: string;\n secret?: string;\n verbose?: boolean;\n local?: boolean; // Enable local mode (bypasses authentication)\n noTui?: boolean; // Disable TUI dashboard\n}\n\n/**\n * Check if we should use TUI\n */\nfunction shouldUseTUI(options: RunOptions): boolean {\n // Explicit flag\n if (options.noTui) return false;\n\n // CI/CD environments\n if (process.env.CI === '1' || process.env.CI === 'true') return false;\n\n // Not a TTY\n if (!process.stdout.isTTY) return false;\n\n // Explicit env var to disable\n if (process.env.NO_TUI === '1') return false;\n\n return true;\n}\n\nexport async function runCommand(options: RunOptions) {\n // Set local mode environment variable if requested\n if (options.local) {\n process.env.OPENBUILDER_LOCAL_MODE = 'true';\n logger.info(chalk.yellow('Local mode enabled - authentication bypassed'));\n }\n\n const useTUI = shouldUseTUI(options);\n\n // Build runner options from CLI flags or smart defaults\n // NOTE: For the `runner` command, we intentionally ignore local config values\n // and default to the public OpenBuilder instance. This command is specifically\n // for connecting to remote servers, not local development.\n // Users can still override with CLI flags if needed.\n \n // Resolve API URL: CLI flag > default public instance (ignore config)\n const apiUrl = normalizeUrl(options.url || DEFAULT_URL);\n \n // Resolve WebSocket URL: CLI broker flag > derive from API URL (ignore config)\n const wsUrl = options.broker || deriveWsUrl(apiUrl);\n \n // Resolve workspace: CLI flag > config > default ~/openbuilder-workspace\n // (workspace from config is fine since it's user's preference for where projects go)\n const config = configManager.get();\n const workspace = options.workspace || config.workspace || DEFAULT_WORKSPACE;\n \n // Resolve runner ID: CLI flag > system username (ignore config 'local' default)\n const runnerId = options.runnerId || getSystemUsername();\n \n // Resolve secret: CLI flag > config (required)\n // Only use config secret if it looks like a valid token (starts with sv_)\n // This prevents the default 'dev-secret' from being used in runner mode\n const configSecret = configManager.getSecret();\n const sharedSecret = options.secret || (configSecret?.startsWith('sv_') ? configSecret : undefined);\n\n const runnerOptions = {\n wsUrl,\n apiUrl,\n sharedSecret,\n runnerId,\n workspace,\n verbose: options.verbose,\n tuiMode: useTUI,\n };\n\n // Validate required options - secret is required\n // If not provided, try to use stored OAuth token or trigger OAuth flow\n if (!runnerOptions.sharedSecret) {\n // Check if we have a stored OAuth token\n if (hasStoredToken()) {\n const storedToken = getStoredToken();\n if (storedToken) {\n runnerOptions.sharedSecret = storedToken;\n logger.info(`Using stored runner token: ${chalk.cyan(storedToken.substring(0, 12) + '...')}`);\n }\n }\n \n // If still no secret and not in local mode, trigger OAuth flow\n if (!runnerOptions.sharedSecret && !options.local) {\n logger.info('No runner token found. Starting OAuth authentication...');\n logger.info('');\n \n const result = await performOAuthLogin({\n apiUrl: runnerOptions.apiUrl,\n silent: false,\n });\n \n if (result.success && result.token) {\n storeToken(result.token, runnerOptions.apiUrl);\n runnerOptions.sharedSecret = result.token;\n logger.log('');\n logger.success('Authentication successful!');\n logger.info(`Token: ${chalk.cyan(result.token.substring(0, 12) + '...')}`);\n logger.log('');\n } else {\n logger.error(result.error || 'Authentication failed');\n logger.info('');\n logger.info('You can also provide a token manually:');\n logger.info(` ${chalk.cyan('openbuilder runner --secret <your-secret>')}`);\n logger.info('');\n logger.info('Or login first:');\n logger.info(` ${chalk.cyan('openbuilder login')}`);\n process.exit(1);\n }\n }\n \n // Final check - if still no secret (and not local mode)\n if (!runnerOptions.sharedSecret && !options.local) {\n logger.error('Shared secret is required');\n logger.info('');\n logger.info('Get a runner key from your OpenBuilder dashboard, or provide via:');\n logger.info(` ${chalk.cyan('openbuilder runner --secret <your-secret>')}`);\n logger.info('');\n logger.info('Or login with OAuth:');\n logger.info(` ${chalk.cyan('openbuilder login')}`);\n process.exit(1);\n }\n }\n\n // ========================================\n // PLAIN TEXT MODE (--no-tui)\n // ========================================\n if (!useTUI) {\n // Display startup info\n logger.section('Starting OpenBuilder Runner');\n logger.info(`Server: ${chalk.cyan(runnerOptions.wsUrl)}`);\n logger.info(`API URL: ${chalk.cyan(runnerOptions.apiUrl)}`);\n logger.info(`Runner ID: ${chalk.cyan(runnerOptions.runnerId)}`);\n logger.info(`Workspace: ${chalk.cyan(runnerOptions.workspace)}`);\n logger.log('');\n\n if (options.verbose) {\n logger.debug('Verbose logging enabled');\n logger.debug(`Full options: ${JSON.stringify(runnerOptions, null, 2)}`);\n }\n\n try {\n // Start the runner (runs indefinitely)\n await startRunner(runnerOptions);\n } catch (error) {\n logger.error('Failed to start runner:');\n logger.error(error instanceof Error ? error.message : 'Unknown error');\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack);\n }\n process.exit(1);\n }\n return;\n }\n\n // ========================================\n // TUI MODE (default)\n // ========================================\n \n // Initialize the logger BEFORE rendering TUI so the TUI can subscribe to events\n // This must happen before startRunner() which would create its own logger\n initRunnerLogger({\n verbose: options.verbose || false,\n tuiMode: true,\n });\n \n // Enable TUI mode in file-logger to suppress terminal output\n setFileLoggerTuiMode(true);\n \n // Track runner cleanup function\n let runnerCleanupFn: (() => Promise<void>) | undefined;\n\n // Clear screen and enter alternate buffer for clean TUI\n process.stdout.write('\\x1b[?1049h'); // Enter alternate screen\n process.stdout.write('\\x1b[2J\\x1b[H'); // Clear and home\n\n // Ensure stdin is in raw mode for keyboard input\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n\n // Handle quit from TUI\n const handleQuit = async () => {\n // Exit alternate screen buffer\n process.stdout.write('\\x1b[?1049l');\n \n console.log('\\n' + chalk.yellow('Shutting down runner...'));\n \n if (runnerCleanupFn) {\n try {\n await runnerCleanupFn();\n console.log(chalk.green('✓') + ' Runner stopped');\n } catch (e) {\n console.error(chalk.red('✗') + ' Error stopping runner:', e);\n }\n }\n \n process.exit(0);\n };\n\n // Handle SIGINT (Ctrl+C)\n process.on('SIGINT', handleQuit);\n\n // Render the TUI dashboard\n const { waitUntilExit, clear } = render(\n React.createElement(RunnerDashboard, {\n config: {\n runnerId,\n serverUrl: wsUrl,\n workspace,\n apiUrl,\n },\n onQuit: handleQuit,\n }),\n {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n exitOnCtrlC: false, // We handle this ourselves\n patchConsole: false, // We use our own logging\n }\n );\n\n try {\n // Start the runner and get cleanup function\n runnerCleanupFn = await startRunner(runnerOptions);\n\n // Wait for TUI to exit (user pressed 'q')\n await waitUntilExit();\n\n // Clean up\n clear();\n await handleQuit();\n } catch (error) {\n clear();\n process.stdout.write('\\x1b[?1049l'); // Exit alternate screen\n \n logger.error('Failed to start runner:');\n logger.error(error instanceof Error ? error.message : 'Unknown error');\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack);\n }\n process.exit(1);\n }\n}\n"],"names":["useState","useEffect","_jsxs","_jsx","Shortcut","useCallback"],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -516,12 +516,12 @@ program
|
|
|
516
516
|
// Default action when no subcommand is provided
|
|
517
517
|
if (options.runner) {
|
|
518
518
|
// Start runner only (legacy flag)
|
|
519
|
-
const { runCommand } = await import('../chunks/run-
|
|
519
|
+
const { runCommand } = await import('../chunks/run-LjsGm3tI.js');
|
|
520
520
|
await runCommand({});
|
|
521
521
|
}
|
|
522
522
|
else {
|
|
523
523
|
// Show TUI main menu
|
|
524
|
-
const { mainTUICommand } = await import('../chunks/main-tui-
|
|
524
|
+
const { mainTUICommand } = await import('../chunks/main-tui-BrfgfCDw.js');
|
|
525
525
|
await mainTUICommand();
|
|
526
526
|
}
|
|
527
527
|
}
|
|
@@ -593,7 +593,7 @@ program
|
|
|
593
593
|
.option('--no-tui', 'Disable TUI dashboard, use plain text logs')
|
|
594
594
|
.action(async (options) => {
|
|
595
595
|
try {
|
|
596
|
-
const { runCommand } = await import('../chunks/run-
|
|
596
|
+
const { runCommand } = await import('../chunks/run-LjsGm3tI.js');
|
|
597
597
|
await runCommand(options);
|
|
598
598
|
}
|
|
599
599
|
catch (error) {
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-9mP5QnpK.js","sources":["../../src/cli/tui/components/LogPanel.tsx","../../src/cli/tui/components/StatusBar.tsx","../../src/cli/tui/components/FullLogView.tsx","../../src/cli/tui/components/CopyMenu.tsx","../../src/cli/tui/screens/RunnerDashboard.tsx","../../src/cli/commands/run.ts"],"sourcesContent":["/**\n * LogPanel - Right panel showing scrollable log entries\n * Takes up 80% of width, shows:\n * - Timestamped log entries\n * - Tool calls with truncated args\n * - Scrollable with keyboard navigation\n */\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\nimport type { LogEntry } from '../../../lib/logging/types.js';\n\ninterface LogPanelProps {\n entries: LogEntry[];\n isVerbose: boolean;\n width: number;\n height: number;\n isFocused: boolean;\n}\n\nexport function LogPanel({ entries, isVerbose, width, height, isFocused }: LogPanelProps) {\n const [scrollOffset, setScrollOffset] = useState(0);\n const [autoScroll, setAutoScroll] = useState(true);\n\n // Filter entries based on verbose mode\n const visibleEntries = isVerbose \n ? entries \n : entries.filter(e => !e.verbose);\n\n // Available height for log lines (subtract 2 for border, 1 for header)\n const visibleLines = Math.max(1, height - 3);\n\n // Auto-scroll when new entries arrive\n useEffect(() => {\n if (autoScroll && visibleEntries.length > 0) {\n const maxScroll = Math.max(0, visibleEntries.length - visibleLines);\n setScrollOffset(maxScroll);\n }\n }, [visibleEntries.length, autoScroll, visibleLines]);\n\n // Handle keyboard navigation\n useInput((input, key) => {\n if (!isFocused) return;\n\n if (key.upArrow) {\n setAutoScroll(false);\n setScrollOffset(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n const maxScroll = Math.max(0, visibleEntries.length - visibleLines);\n setScrollOffset(prev => Math.min(maxScroll, prev + 1));\n // Re-enable auto-scroll if we're at the bottom\n if (scrollOffset >= maxScroll - 1) {\n setAutoScroll(true);\n }\n } else if (key.pageUp) {\n setAutoScroll(false);\n setScrollOffset(prev => Math.max(0, prev - visibleLines));\n } else if (key.pageDown) {\n const maxScroll = Math.max(0, visibleEntries.length - visibleLines);\n setScrollOffset(prev => Math.min(maxScroll, prev + visibleLines));\n }\n });\n\n // Get visible slice of entries\n const displayedEntries = visibleEntries.slice(scrollOffset, scrollOffset + visibleLines);\n\n // Format time\n const formatTime = (timestamp: number): string => {\n return new Date(timestamp).toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n };\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n height={height}\n borderStyle=\"single\"\n borderColor={isFocused ? colors.cyan : colors.darkGray}\n paddingX={1}\n >\n {/* Header */}\n <Box justifyContent=\"space-between\" marginBottom={0}>\n <Text color={colors.cyan} bold>LOGS</Text>\n <Text color={colors.dimGray}>\n [verbose: {isVerbose ? 'on' : 'off'}]\n </Text>\n </Box>\n\n {/* Log entries */}\n <Box flexDirection=\"column\" flexGrow={1}>\n {displayedEntries.length === 0 ? (\n <Box justifyContent=\"center\" alignItems=\"center\" flexGrow={1}>\n <Text color={colors.dimGray}>Waiting for logs...</Text>\n </Box>\n ) : (\n displayedEntries.map((entry, index) => (\n <LogEntryRow \n key={entry.id} \n entry={entry} \n maxWidth={width - 4}\n />\n ))\n )}\n </Box>\n\n {/* Scroll indicator */}\n {visibleEntries.length > visibleLines && (\n <Box justifyContent=\"flex-end\">\n <Text color={colors.dimGray}>\n {scrollOffset + 1}-{Math.min(scrollOffset + visibleLines, visibleEntries.length)}/{visibleEntries.length}\n {autoScroll ? ' (auto)' : ''}\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n\n// Individual log entry row\nfunction LogEntryRow({ entry, maxWidth }: { entry: LogEntry; maxWidth: number }) {\n const time = new Date(entry.timestamp).toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n\n const levelColors = {\n debug: colors.dimGray,\n info: colors.cyan,\n success: colors.success,\n warn: colors.warning,\n error: colors.error,\n };\n\n const levelIcons = {\n debug: ' ',\n info: '●',\n success: '✓',\n warn: '⚠',\n error: '✗',\n };\n\n // Tool calls get special formatting\n if (entry.toolName) {\n const argsText = entry.toolArgs ? ` ${entry.toolArgs}` : '';\n const fullText = `${entry.toolName}${argsText}`;\n const truncated = fullText.length > maxWidth - 12 \n ? fullText.substring(0, maxWidth - 15) + '...'\n : fullText;\n\n return (\n <Box>\n <Text color={colors.dimGray}>{time}</Text>\n <Text color={colors.cyan}> 🔧 </Text>\n <Text color={colors.white}>{entry.toolName}</Text>\n {entry.toolArgs && <Text color={colors.gray}> {entry.toolArgs}</Text>}\n </Box>\n );\n }\n\n // Regular log entries\n const color = levelColors[entry.level];\n const icon = levelIcons[entry.level];\n \n // Truncate message if needed\n const availableWidth = maxWidth - 12; // time + space + icon + space\n const truncatedMessage = entry.message.length > availableWidth\n ? entry.message.substring(0, availableWidth - 3) + '...'\n : entry.message;\n\n return (\n <Box>\n <Text color={colors.dimGray}>{time}</Text>\n <Text color={color}> {icon} </Text>\n <Text color={color}>{truncatedMessage}</Text>\n </Box>\n );\n}\n","/**\n * StatusBar - Bottom bar showing connection status and keyboard shortcuts\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport { colors } from '../theme.js';\nimport { getVersionInfo } from '../../utils/version-info.js';\n\ninterface StatusBarProps {\n isConnected: boolean;\n isVerbose: boolean;\n buildCount?: number;\n currentBuildIndex?: number;\n view: 'dashboard' | 'fullLog' | 'copyMenu';\n}\n\nexport function StatusBar({\n isConnected,\n isVerbose,\n buildCount = 0,\n currentBuildIndex = 0,\n view,\n}: StatusBarProps) {\n // Get version info\n const versionInfo = getVersionInfo();\n \n // Connection indicator\n const connectionIndicator = (\n <Box marginRight={2}>\n <Text color={isConnected ? colors.success : colors.error}>\n {isConnected ? '●' : '○'}\n </Text>\n <Text color={colors.gray}>\n {' '}{isConnected ? 'Connected' : 'Disconnected'}\n </Text>\n </Box>\n );\n\n // Build count indicator (only show if multiple builds)\n const buildIndicator = buildCount > 1 ? (\n <Box marginRight={2}>\n <Text color={colors.gray}>\n Build {currentBuildIndex + 1}/{buildCount}\n </Text>\n </Box>\n ) : null;\n\n // Shortcuts based on current view\n const shortcuts = view === 'dashboard' ? (\n <Box>\n <Shortcut letter=\"q\" label=\"quit\" />\n <Shortcut letter=\"v\" label={`verbose: ${isVerbose ? 'on' : 'off'}`} />\n <Shortcut letter=\"c\" label=\"copy\" />\n <Shortcut letter=\"t\" label=\"text view\" />\n {buildCount > 1 && <Shortcut letter=\"n/p\" label=\"switch build\" />}\n <Shortcut letter=\"↑↓\" label=\"scroll\" />\n </Box>\n ) : view === 'fullLog' ? (\n <Box>\n <Shortcut letter=\"t\" label=\"dashboard\" />\n <Shortcut letter=\"c\" label=\"copy\" />\n <Shortcut letter=\"/\" label=\"search\" />\n <Shortcut letter=\"f\" label=\"filter\" />\n <Shortcut letter=\"↑↓\" label=\"scroll\" />\n <Shortcut letter=\"PgUp/Dn\" label=\"page\" />\n </Box>\n ) : (\n <Box>\n <Shortcut letter=\"Esc\" label=\"cancel\" />\n </Box>\n );\n\n // Version display\n const versionDisplay = (\n <Box marginLeft={2}>\n <Text color={colors.dimGray}>\n {versionInfo.display}\n </Text>\n </Box>\n );\n\n return (\n <Box\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box>\n {connectionIndicator}\n {buildIndicator}\n </Box>\n <Box>\n {shortcuts}\n {versionDisplay}\n </Box>\n </Box>\n );\n}\n\n// Helper component for shortcuts\nfunction Shortcut({ letter, label }: { letter: string; label: string }) {\n return (\n <Box marginRight={2}>\n <Text color={colors.dimGray}>[</Text>\n <Text color={colors.cyan}>{letter}</Text>\n <Text color={colors.dimGray}>]</Text>\n <Text color={colors.gray}>{label}</Text>\n </Box>\n );\n}\n","/**\n * FullLogView - Full-screen log view with search and filter\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { colors } from '../theme.js';\nimport type { LogEntry, LogLevel } from '../../../lib/logging/types.js';\n\ntype FilterMode = 'all' | 'errors' | 'tools' | 'verbose';\n\ninterface FullLogViewProps {\n entries: LogEntry[];\n onBack: () => void;\n onCopy: () => void;\n}\n\nexport function FullLogView({ entries, onBack, onCopy }: FullLogViewProps) {\n const { stdout } = useStdout();\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n\n const [searchQuery, setSearchQuery] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n const [filterMode, setFilterMode] = useState<FilterMode>('all');\n const [scrollOffset, setScrollOffset] = useState(0);\n const [searchMode, setSearchMode] = useState<'filter' | 'highlight'>('highlight');\n\n // Available height for log lines\n const headerHeight = 3;\n const footerHeight = 2;\n const visibleLines = Math.max(1, terminalHeight - headerHeight - footerHeight);\n\n // Filter and search entries\n const processedEntries = entries.filter(entry => {\n // Apply filter mode\n if (filterMode === 'errors' && entry.level !== 'error' && entry.level !== 'warn') {\n return false;\n }\n if (filterMode === 'tools' && !entry.toolName) {\n return false;\n }\n if (filterMode !== 'verbose' && entry.verbose) {\n return false;\n }\n\n // Apply search filter (if in filter mode)\n if (searchQuery && searchMode === 'filter') {\n const query = searchQuery.toLowerCase();\n const messageMatch = entry.message.toLowerCase().includes(query);\n const toolMatch = entry.toolName?.toLowerCase().includes(query);\n const argsMatch = entry.toolArgs?.toLowerCase().includes(query);\n return messageMatch || toolMatch || argsMatch;\n }\n\n return true;\n });\n\n // Calculate max scroll\n const maxScroll = Math.max(0, processedEntries.length - visibleLines);\n\n // Get visible entries\n const visibleEntries = processedEntries.slice(scrollOffset, scrollOffset + visibleLines);\n\n // Handle keyboard input\n useInput((input, key) => {\n if (isSearching) {\n if (key.escape || key.return) {\n setIsSearching(false);\n }\n return;\n }\n\n if (input === 't') {\n onBack();\n } else if (input === 'c') {\n onCopy();\n } else if (input === '/') {\n setIsSearching(true);\n } else if (input === 'f') {\n // Cycle through filter modes\n const modes: FilterMode[] = ['all', 'errors', 'tools', 'verbose'];\n const currentIndex = modes.indexOf(filterMode);\n setFilterMode(modes[(currentIndex + 1) % modes.length]);\n setScrollOffset(0);\n } else if (input === 'm') {\n // Toggle search mode\n setSearchMode(prev => prev === 'filter' ? 'highlight' : 'filter');\n } else if (key.upArrow) {\n setScrollOffset(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setScrollOffset(prev => Math.min(maxScroll, prev + 1));\n } else if (key.pageUp) {\n setScrollOffset(prev => Math.max(0, prev - visibleLines));\n } else if (key.pageDown) {\n setScrollOffset(prev => Math.min(maxScroll, prev + visibleLines));\n } else if (key.escape) {\n if (searchQuery) {\n setSearchQuery('');\n } else {\n onBack();\n }\n }\n });\n\n // Format time\n const formatTime = (timestamp: number): string => {\n return new Date(timestamp).toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n };\n\n // Check if text matches search query\n const highlightSearch = (text: string): React.ReactNode => {\n if (!searchQuery || searchMode !== 'highlight') {\n return text;\n }\n\n const query = searchQuery.toLowerCase();\n const index = text.toLowerCase().indexOf(query);\n if (index === -1) {\n return text;\n }\n\n return (\n <>\n {text.slice(0, index)}\n <Text backgroundColor={colors.warning} color=\"black\">\n {text.slice(index, index + searchQuery.length)}\n </Text>\n {text.slice(index + searchQuery.length)}\n </>\n );\n };\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n {/* Header with search */}\n <Box\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text color={colors.cyan} bold>LOGS</Text>\n <Box>\n <Text color={colors.dimGray}>Search: </Text>\n {isSearching ? (\n <Box borderStyle=\"round\" borderColor={colors.cyan} paddingX={1}>\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder=\"type to search...\"\n />\n </Box>\n ) : (\n <Text color={searchQuery ? colors.white : colors.dimGray}>\n [{searchQuery || 'none'}] ({searchMode})\n </Text>\n )}\n <Text color={colors.dimGray}> [/]</Text>\n </Box>\n </Box>\n\n {/* Log content */}\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n borderTop={false}\n borderBottom={false}\n paddingX={1}\n >\n {visibleEntries.map((entry, index) => {\n const time = formatTime(entry.timestamp);\n const levelColors = {\n debug: colors.dimGray,\n info: colors.cyan,\n success: colors.success,\n warn: colors.warning,\n error: colors.error,\n };\n const levelIcons = {\n debug: ' ',\n info: '●',\n success: '✓',\n warn: '⚠',\n error: '✗',\n };\n\n if (entry.toolName) {\n return (\n <Box key={entry.id}>\n <Text color={colors.dimGray}>{time}</Text>\n <Text color={colors.cyan}> 🔧 </Text>\n <Text color={colors.white}>{highlightSearch(entry.toolName)}</Text>\n {entry.toolArgs && (\n <Text color={colors.gray}> {highlightSearch(entry.toolArgs)}</Text>\n )}\n </Box>\n );\n }\n\n return (\n <Box key={entry.id}>\n <Text color={colors.dimGray}>{time}</Text>\n <Text color={levelColors[entry.level]}> {levelIcons[entry.level]} </Text>\n <Text color={levelColors[entry.level]}>{highlightSearch(entry.message)}</Text>\n </Box>\n );\n })}\n </Box>\n\n {/* Footer with shortcuts and scroll position */}\n <Box\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box>\n <Shortcut letter=\"t\" label=\"dashboard\" />\n <Shortcut letter=\"c\" label=\"copy\" />\n <Shortcut letter=\"/\" label=\"search\" />\n <Shortcut letter=\"f\" label={`filter: ${filterMode}`} />\n <Shortcut letter=\"m\" label={`mode: ${searchMode}`} />\n </Box>\n <Text color={colors.dimGray}>\n {scrollOffset + 1}-{Math.min(scrollOffset + visibleLines, processedEntries.length)}/{processedEntries.length}\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction Shortcut({ letter, label }: { letter: string; label: string }) {\n return (\n <Box marginRight={2}>\n <Text color={colors.dimGray}>[</Text>\n <Text color={colors.cyan}>{letter}</Text>\n <Text color={colors.dimGray}>]</Text>\n <Text color={colors.gray}>{label}</Text>\n </Box>\n );\n}\n","/**\n * CopyMenu - Modal for copying logs to clipboard\n */\n\nimport React from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\n\ninterface CopyMenuProps {\n onSelect: (option: 'visible' | 'last50' | 'last100' | 'all' | 'range') => void;\n onCancel: () => void;\n visibleCount: number;\n totalCount: number;\n}\n\nexport function CopyMenu({ onSelect, onCancel, visibleCount, totalCount }: CopyMenuProps) {\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n } else if (input === '1') {\n onSelect('visible');\n } else if (input === '2') {\n onSelect('last50');\n } else if (input === '3') {\n onSelect('last100');\n } else if (input === '4') {\n onSelect('all');\n } else if (input === '5') {\n onSelect('range');\n }\n });\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={colors.cyan}\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text color={colors.cyan} bold>Copy Logs</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <CopyOption number=\"1\" label={`Copy visible (${visibleCount} lines)`} />\n <CopyOption number=\"2\" label=\"Copy last 50 lines\" />\n <CopyOption number=\"3\" label=\"Copy last 100 lines\" />\n <CopyOption number=\"4\" label={`Copy all from file (${totalCount} lines)`} />\n <CopyOption number=\"5\" label=\"Copy range...\" />\n </Box>\n\n <Box>\n <Text color={colors.dimGray}>[Esc] Cancel</Text>\n </Box>\n </Box>\n );\n}\n\nfunction CopyOption({ number, label }: { number: string; label: string }) {\n return (\n <Box>\n <Text color={colors.dimGray}>[</Text>\n <Text color={colors.cyan}>{number}</Text>\n <Text color={colors.dimGray}>]</Text>\n <Text color={colors.white}> {label}</Text>\n </Box>\n );\n}\n","/**\n * RunnerDashboard - Main TUI container for the runner\n * \n * Layout:\n * - 20% left: BuildPanel (current build + todos) - hidden when no build\n * - 80% right: LogPanel (scrollable logs)\n * - Bottom: StatusBar (connection, shortcuts)\n * \n * Views:\n * - dashboard: Main split view\n * - fullLog: Full-screen log view with search\n * - copyMenu: Copy options modal overlay\n */\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { Box, Text, useInput, useStdout, useApp } from 'ink';\nimport { colors } from '../theme.js';\nimport { BuildPanel } from '../components/BuildPanel.js';\nimport { LogPanel } from '../components/LogPanel.js';\nimport { StatusBar } from '../components/StatusBar.js';\nimport { FullLogView } from '../components/FullLogView.js';\nimport { CopyMenu } from '../components/CopyMenu.js';\nimport { useBuildState, useLogEntries } from '../hooks/useBuildState.js';\nimport { Banner } from '../components/Banner.js';\nimport type { BuildInfo, TodoItem, LogEntry } from '../../../lib/logging/types.js';\nimport { getLogBuffer } from '../../../lib/logging/log-buffer.js';\n\ntype ViewMode = 'dashboard' | 'fullLog' | 'copyMenu';\n\nexport interface RunnerDashboardProps {\n // Initial config (passed from runner)\n config: {\n runnerId: string;\n serverUrl: string;\n workspace: string;\n apiUrl?: string;\n };\n // Event handlers\n onQuit?: () => void;\n}\n\nexport function RunnerDashboard({ config, onQuit }: RunnerDashboardProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n\n // State management\n const [buildState, buildActions] = useBuildState();\n const logEntries = useLogEntries(100);\n const [view, setView] = useState<ViewMode>('dashboard');\n\n // Handle keyboard input\n useInput((input, key) => {\n // Global quit handler\n if (input === 'q' && view !== 'copyMenu') {\n if (onQuit) {\n onQuit();\n }\n exit();\n return;\n }\n\n // Copy menu is modal - handle separately\n if (view === 'copyMenu') {\n return; // CopyMenu handles its own input\n }\n\n // Dashboard shortcuts\n if (view === 'dashboard') {\n if (input === 'v') {\n buildActions.toggleVerbose();\n } else if (input === 'c') {\n setView('copyMenu');\n } else if (input === 't') {\n setView('fullLog');\n } else if (input === 'n') {\n buildActions.nextBuild();\n } else if (input === 'p') {\n buildActions.prevBuild();\n }\n }\n\n // Full log view shortcuts\n if (view === 'fullLog') {\n if (input === 't') {\n setView('dashboard');\n } else if (input === 'c') {\n setView('copyMenu');\n }\n }\n });\n\n // Handle copy action\n const handleCopy = useCallback(async (option: 'visible' | 'last50' | 'last100' | 'all' | 'range') => {\n try {\n const buffer = getLogBuffer();\n let entriesToCopy: LogEntry[] = [];\n\n switch (option) {\n case 'visible':\n entriesToCopy = logEntries.slice(-20); // Approximate visible count\n break;\n case 'last50':\n entriesToCopy = buffer.getRecent(50);\n break;\n case 'last100':\n entriesToCopy = buffer.getRecent(100);\n break;\n case 'all':\n entriesToCopy = buffer.readFromFile();\n break;\n case 'range':\n // TODO: Implement range selection\n entriesToCopy = buffer.getRecent(100);\n break;\n }\n\n const text = buffer.toText(entriesToCopy);\n \n // Copy to clipboard using pbcopy on macOS\n const { spawn } = await import('child_process');\n const pbcopy = spawn('pbcopy');\n pbcopy.stdin.write(text);\n pbcopy.stdin.end();\n \n // TODO: Show success message\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n\n setView('dashboard');\n }, [logEntries]);\n\n // Calculate panel dimensions\n const bannerHeight = 7; // ASCII art banner\n const headerHeight = 3; // Config/status line\n const statusBarHeight = 3;\n const contentHeight = Math.max(1, terminalHeight - bannerHeight - headerHeight - statusBarHeight);\n \n // 20/80 split\n const buildPanelWidth = Math.floor(terminalWidth * 0.2);\n const logPanelWidth = terminalWidth - buildPanelWidth;\n\n // Show build panel only when there's an active build\n const showBuildPanel = buildState.currentBuild !== null;\n\n // Check for available update (set by auto-update check in index.ts)\n const updateAvailable = process.env.OPENBUILDER_UPDATE_AVAILABLE;\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight} width={terminalWidth}>\n {/* Banner */}\n <Banner />\n\n {/* Update notification banner */}\n {updateAvailable && (\n <Box justifyContent=\"center\" paddingY={0}>\n <Text color={colors.cyan}>⬆ Update available: </Text>\n <Text color={colors.success}>{updateAvailable}</Text>\n <Text color={colors.dimGray}> — Run </Text>\n <Text color={colors.cyan}>openbuilder upgrade</Text>\n <Text color={colors.dimGray}> to update</Text>\n </Box>\n )}\n\n {/* Header bar with connection status */}\n <Box\n borderStyle=\"single\"\n borderColor={colors.darkGray}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text color={colors.dimGray}>\n Runner: <Text color={colors.cyan}>{config.runnerId}</Text> • Server: <Text color={colors.cyan}>{config.serverUrl.replace(/^wss?:\\/\\//, '')}</Text>\n </Text>\n <Box>\n <Text color={buildState.isConnected ? colors.success : colors.error}>\n {buildState.isConnected ? '●' : '○'}\n </Text>\n <Text color={colors.gray}>\n {' '}{buildState.isConnected ? 'Connected' : 'Disconnected'}\n </Text>\n </Box>\n </Box>\n\n {/* Main content */}\n {view === 'dashboard' && (\n <Box flexGrow={1} height={contentHeight}>\n {showBuildPanel && (\n <BuildPanel\n build={buildState.currentBuild}\n width={buildPanelWidth}\n height={contentHeight}\n />\n )}\n <LogPanel\n entries={logEntries}\n isVerbose={buildState.isVerbose}\n width={showBuildPanel ? logPanelWidth : terminalWidth}\n height={contentHeight}\n isFocused={true}\n />\n </Box>\n )}\n\n {view === 'fullLog' && (\n <FullLogView\n entries={logEntries}\n onBack={() => setView('dashboard')}\n onCopy={() => setView('copyMenu')}\n />\n )}\n\n {/* Copy menu overlay */}\n {view === 'copyMenu' && (\n <Box\n position=\"absolute\"\n flexDirection=\"column\"\n justifyContent=\"center\"\n alignItems=\"center\"\n width={terminalWidth}\n height={terminalHeight}\n >\n <CopyMenu\n onSelect={handleCopy}\n onCancel={() => setView('dashboard')}\n visibleCount={Math.min(20, logEntries.length)}\n totalCount={getLogBuffer().readFromFile().length}\n />\n </Box>\n )}\n\n {/* Status bar (only in dashboard view) */}\n {view === 'dashboard' && (\n <StatusBar\n isConnected={buildState.isConnected}\n isVerbose={buildState.isVerbose}\n buildCount={buildState.builds.length}\n currentBuildIndex={buildState.currentBuildIndex}\n view={view}\n />\n )}\n </Box>\n );\n}\n\n// Export for external use\nexport { useBuildState, useLogEntries };\n","import chalk from 'chalk';\nimport { homedir, userInfo } from 'node:os';\nimport { join } from 'node:path';\nimport { render } from 'ink';\nimport React from 'react';\nimport { logger } from '../utils/logger.js';\nimport { configManager } from '../utils/config-manager.js';\nimport { startRunner } from '../../index.js';\nimport { RunnerDashboard } from '../tui/screens/RunnerDashboard.js';\nimport { initRunnerLogger } from '../../lib/logging/index.js';\nimport { setFileLoggerTuiMode } from '../../lib/file-logger.js';\nimport { \n hasStoredToken, \n getStoredToken, \n performOAuthLogin, \n storeToken \n} from '../utils/cli-auth.js';\n\n// Default public OpenBuilder instance\nconst DEFAULT_URL = 'https://openbuilder.up.railway.app';\nconst DEFAULT_WORKSPACE = join(homedir(), 'openbuilder-workspace');\n\n/**\n * Normalize URL by adding protocol if missing\n * Uses http:// for localhost, https:// for everything else\n */\nfunction normalizeUrl(url: string): string {\n if (!url) return url;\n\n // If protocol already present, return as-is\n if (url.match(/^https?:\\/\\//i)) {\n return url;\n }\n\n // For localhost or 127.0.0.1, use http://\n if (url.match(/^(localhost|127\\.0\\.0\\.1)(:|\\/|$)/i)) {\n return `http://${url}`;\n }\n\n // For everything else, use https://\n return `https://${url}`;\n}\n\n/**\n * Derive WebSocket URL from a base HTTP/HTTPS URL\n * Converts https://example.com to wss://example.com/ws/runner\n */\nfunction deriveWsUrl(baseUrl: string): string {\n const normalized = normalizeUrl(baseUrl);\n const wsProtocol = normalized.startsWith('https://') ? 'wss://' : 'ws://';\n const hostPath = normalized.replace(/^https?:\\/\\//, '');\n // Remove trailing slash if present\n const cleanHostPath = hostPath.replace(/\\/$/, '');\n return `${wsProtocol}${cleanHostPath}/ws/runner`;\n}\n\n/**\n * Get the current system username\n */\nfunction getSystemUsername(): string {\n try {\n return userInfo().username;\n } catch {\n // Fallback if userInfo() fails\n return process.env.USER || process.env.USERNAME || 'runner';\n }\n}\n\ninterface RunOptions {\n broker?: string; // Legacy: WebSocket URL override (deprecated, use --url instead)\n url?: string;\n workspace?: string;\n runnerId?: string;\n secret?: string;\n verbose?: boolean;\n local?: boolean; // Enable local mode (bypasses authentication)\n noTui?: boolean; // Disable TUI dashboard\n}\n\n/**\n * Check if we should use TUI\n */\nfunction shouldUseTUI(options: RunOptions): boolean {\n // Explicit flag\n if (options.noTui) return false;\n\n // CI/CD environments\n if (process.env.CI === '1' || process.env.CI === 'true') return false;\n\n // Not a TTY\n if (!process.stdout.isTTY) return false;\n\n // Explicit env var to disable\n if (process.env.NO_TUI === '1') return false;\n\n return true;\n}\n\nexport async function runCommand(options: RunOptions) {\n // Set local mode environment variable if requested\n if (options.local) {\n process.env.OPENBUILDER_LOCAL_MODE = 'true';\n logger.info(chalk.yellow('Local mode enabled - authentication bypassed'));\n }\n\n const useTUI = shouldUseTUI(options);\n\n // Build runner options from CLI flags or smart defaults\n // NOTE: For the `runner` command, we intentionally ignore local config values\n // and default to the public OpenBuilder instance. This command is specifically\n // for connecting to remote servers, not local development.\n // Users can still override with CLI flags if needed.\n \n // Resolve API URL: CLI flag > default public instance (ignore config)\n const apiUrl = normalizeUrl(options.url || DEFAULT_URL);\n \n // Resolve WebSocket URL: CLI broker flag > derive from API URL (ignore config)\n const wsUrl = options.broker || deriveWsUrl(apiUrl);\n \n // Resolve workspace: CLI flag > config > default ~/openbuilder-workspace\n // (workspace from config is fine since it's user's preference for where projects go)\n const config = configManager.get();\n const workspace = options.workspace || config.workspace || DEFAULT_WORKSPACE;\n \n // Resolve runner ID: CLI flag > system username (ignore config 'local' default)\n const runnerId = options.runnerId || getSystemUsername();\n \n // Resolve secret: CLI flag > config (required)\n const sharedSecret = options.secret || configManager.getSecret();\n\n const runnerOptions = {\n wsUrl,\n apiUrl,\n sharedSecret,\n runnerId,\n workspace,\n verbose: options.verbose,\n tuiMode: useTUI,\n };\n\n // Validate required options - secret is required\n // If not provided, try to use stored OAuth token or trigger OAuth flow\n if (!runnerOptions.sharedSecret) {\n // Check if we have a stored OAuth token\n if (hasStoredToken()) {\n const storedToken = getStoredToken();\n if (storedToken) {\n runnerOptions.sharedSecret = storedToken;\n logger.info(`Using stored runner token: ${chalk.cyan(storedToken.substring(0, 12) + '...')}`);\n }\n }\n \n // If still no secret and not in local mode, trigger OAuth flow\n if (!runnerOptions.sharedSecret && !options.local) {\n logger.info('No runner token found. Starting OAuth authentication...');\n logger.info('');\n \n const result = await performOAuthLogin({\n apiUrl: runnerOptions.apiUrl,\n silent: false,\n });\n \n if (result.success && result.token) {\n storeToken(result.token, runnerOptions.apiUrl);\n runnerOptions.sharedSecret = result.token;\n logger.log('');\n logger.success('Authentication successful!');\n logger.info(`Token: ${chalk.cyan(result.token.substring(0, 12) + '...')}`);\n logger.log('');\n } else {\n logger.error(result.error || 'Authentication failed');\n logger.info('');\n logger.info('You can also provide a token manually:');\n logger.info(` ${chalk.cyan('openbuilder runner --secret <your-secret>')}`);\n logger.info('');\n logger.info('Or login first:');\n logger.info(` ${chalk.cyan('openbuilder login')}`);\n process.exit(1);\n }\n }\n \n // Final check - if still no secret (and not local mode)\n if (!runnerOptions.sharedSecret && !options.local) {\n logger.error('Shared secret is required');\n logger.info('');\n logger.info('Get a runner key from your OpenBuilder dashboard, or provide via:');\n logger.info(` ${chalk.cyan('openbuilder runner --secret <your-secret>')}`);\n logger.info('');\n logger.info('Or login with OAuth:');\n logger.info(` ${chalk.cyan('openbuilder login')}`);\n process.exit(1);\n }\n }\n\n // ========================================\n // PLAIN TEXT MODE (--no-tui)\n // ========================================\n if (!useTUI) {\n // Display startup info\n logger.section('Starting OpenBuilder Runner');\n logger.info(`Server: ${chalk.cyan(runnerOptions.wsUrl)}`);\n logger.info(`API URL: ${chalk.cyan(runnerOptions.apiUrl)}`);\n logger.info(`Runner ID: ${chalk.cyan(runnerOptions.runnerId)}`);\n logger.info(`Workspace: ${chalk.cyan(runnerOptions.workspace)}`);\n logger.log('');\n\n if (options.verbose) {\n logger.debug('Verbose logging enabled');\n logger.debug(`Full options: ${JSON.stringify(runnerOptions, null, 2)}`);\n }\n\n try {\n // Start the runner (runs indefinitely)\n await startRunner(runnerOptions);\n } catch (error) {\n logger.error('Failed to start runner:');\n logger.error(error instanceof Error ? error.message : 'Unknown error');\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack);\n }\n process.exit(1);\n }\n return;\n }\n\n // ========================================\n // TUI MODE (default)\n // ========================================\n \n // Initialize the logger BEFORE rendering TUI so the TUI can subscribe to events\n // This must happen before startRunner() which would create its own logger\n initRunnerLogger({\n verbose: options.verbose || false,\n tuiMode: true,\n });\n \n // Enable TUI mode in file-logger to suppress terminal output\n setFileLoggerTuiMode(true);\n \n // Track runner cleanup function\n let runnerCleanupFn: (() => Promise<void>) | undefined;\n\n // Clear screen and enter alternate buffer for clean TUI\n process.stdout.write('\\x1b[?1049h'); // Enter alternate screen\n process.stdout.write('\\x1b[2J\\x1b[H'); // Clear and home\n\n // Ensure stdin is in raw mode for keyboard input\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n\n // Handle quit from TUI\n const handleQuit = async () => {\n // Exit alternate screen buffer\n process.stdout.write('\\x1b[?1049l');\n \n console.log('\\n' + chalk.yellow('Shutting down runner...'));\n \n if (runnerCleanupFn) {\n try {\n await runnerCleanupFn();\n console.log(chalk.green('✓') + ' Runner stopped');\n } catch (e) {\n console.error(chalk.red('✗') + ' Error stopping runner:', e);\n }\n }\n \n process.exit(0);\n };\n\n // Handle SIGINT (Ctrl+C)\n process.on('SIGINT', handleQuit);\n\n // Render the TUI dashboard\n const { waitUntilExit, clear } = render(\n React.createElement(RunnerDashboard, {\n config: {\n runnerId,\n serverUrl: wsUrl,\n workspace,\n apiUrl,\n },\n onQuit: handleQuit,\n }),\n {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n exitOnCtrlC: false, // We handle this ourselves\n patchConsole: false, // We use our own logging\n }\n );\n\n try {\n // Start the runner and get cleanup function\n runnerCleanupFn = await startRunner(runnerOptions);\n\n // Wait for TUI to exit (user pressed 'q')\n await waitUntilExit();\n\n // Clean up\n clear();\n await handleQuit();\n } catch (error) {\n clear();\n process.stdout.write('\\x1b[?1049l'); // Exit alternate screen\n \n logger.error('Failed to start runner:');\n logger.error(error instanceof Error ? error.message : 'Unknown error');\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack);\n }\n process.exit(1);\n }\n}\n"],"names":["useState","useEffect","_jsxs","_jsx","Shortcut","useCallback"],"mappings":"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"}
|