@openbuilder/cli 0.50.34 → 0.50.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{Banner-BlktOjfl.js → Banner-C-FTiOIR.js} +2 -2
- package/dist/chunks/auto-update-Dq2PFvjt.js +0 -1
- package/dist/chunks/build-D0qYqIq0.js +0 -1
- package/dist/chunks/cleanup-qVTsA3tk.js +0 -1
- package/dist/chunks/cli-auth-ChCnxlFl.js +0 -1
- package/dist/chunks/cli-error-BjQwvWtK.js +0 -1
- package/dist/chunks/config-BGP1jZJ4.js +0 -1
- package/dist/chunks/config-manager-BkbjtN-H.js +0 -1
- package/dist/chunks/database-BvAbD4sP.js +0 -1
- package/dist/chunks/database-setup-BYjIRAmT.js +0 -1
- package/dist/chunks/{init-BsQ3dhwf.js → init-DNyPS_SR.js} +9 -9
- package/dist/chunks/{init-tui-Dvk6Ndvl.js → init-tui-EFMXj-MG.js} +8 -8
- package/dist/chunks/logger-ZpJi7chw.js +0 -1
- package/dist/chunks/login-BhtodVsj.js +0 -1
- package/dist/chunks/logout-CDDASeuQ.js +0 -1
- package/dist/chunks/{main-tui-Cklcr3FX.js → main-tui-D-SG-Ba5.js} +10 -10
- package/dist/chunks/manager-CvGX9qqe.js +0 -1
- package/dist/chunks/{port-allocator-Ct3ioni4.js → port-allocator-B0q7xkLs.js} +34 -2
- package/dist/chunks/process-killer-CaUL7Kpl.js +0 -1
- package/dist/chunks/prompts-1QbE_bRr.js +0 -1
- package/dist/chunks/repo-cloner-CpOQjFSo.js +0 -1
- package/dist/chunks/repo-detector-B_oj696o.js +0 -1
- package/dist/chunks/{run-wycadErJ.js → run-Cor14S0I.js} +28 -15
- package/dist/chunks/runner-logger-instance-nDWv2h2T.js +0 -1
- package/dist/chunks/spinner-BJL9zWAJ.js +0 -1
- package/dist/chunks/{start-CQKEEma-.js → start-k9iGDVWo.js} +7 -8
- package/dist/chunks/start-traditional-uoLZXdxm.js +0 -1
- package/dist/chunks/status-cS8YwtUx.js +0 -1
- package/dist/chunks/theme-DhorI2Hb.js +43 -0
- package/dist/chunks/upgrade-CKjl4HlB.js +0 -1
- package/dist/chunks/{useBuildState-pcDGDakI.js → useBuildState-DscLOZLl.js} +2 -2
- package/dist/chunks/vendor-ai-sdk-CSJ0bw9X.js +1970 -0
- package/dist/chunks/{theme-CktnrDZj.js → vendor-react-CXgiD1Dl.js} +227 -47
- package/dist/chunks/vendor-sentry-CqA9P3UG.js +71910 -0
- package/dist/cli/index.js +5 -6
- package/dist/index.js +106 -2044
- package/dist/instrument.js +37 -64119
- package/package.json +1 -1
- package/dist/chunks/Banner-BlktOjfl.js.map +0 -1
- package/dist/chunks/_commonjsHelpers-h-Bqc03Z.js +0 -34
- package/dist/chunks/_commonjsHelpers-h-Bqc03Z.js.map +0 -1
- package/dist/chunks/auto-update-Dq2PFvjt.js.map +0 -1
- package/dist/chunks/build-D0qYqIq0.js.map +0 -1
- package/dist/chunks/cleanup-qVTsA3tk.js.map +0 -1
- package/dist/chunks/cli-auth-ChCnxlFl.js.map +0 -1
- package/dist/chunks/cli-error-BjQwvWtK.js.map +0 -1
- package/dist/chunks/config-BGP1jZJ4.js.map +0 -1
- package/dist/chunks/config-manager-BkbjtN-H.js.map +0 -1
- package/dist/chunks/database-BvAbD4sP.js.map +0 -1
- package/dist/chunks/database-setup-BYjIRAmT.js.map +0 -1
- package/dist/chunks/devtools-7A3EXJhY.js +0 -75
- package/dist/chunks/devtools-7A3EXJhY.js.map +0 -1
- package/dist/chunks/exports-ij9sv4UM.js +0 -7793
- package/dist/chunks/exports-ij9sv4UM.js.map +0 -1
- package/dist/chunks/index-oFqGtEeF.js +0 -119
- package/dist/chunks/index-oFqGtEeF.js.map +0 -1
- package/dist/chunks/init-BsQ3dhwf.js.map +0 -1
- package/dist/chunks/init-tui-Dvk6Ndvl.js.map +0 -1
- package/dist/chunks/logger-ZpJi7chw.js.map +0 -1
- package/dist/chunks/login-BhtodVsj.js.map +0 -1
- package/dist/chunks/logout-CDDASeuQ.js.map +0 -1
- package/dist/chunks/main-tui-Cklcr3FX.js.map +0 -1
- package/dist/chunks/manager-CvGX9qqe.js.map +0 -1
- package/dist/chunks/port-allocator-Ct3ioni4.js.map +0 -1
- package/dist/chunks/process-killer-CaUL7Kpl.js.map +0 -1
- package/dist/chunks/prompts-1QbE_bRr.js.map +0 -1
- package/dist/chunks/repo-cloner-CpOQjFSo.js.map +0 -1
- package/dist/chunks/repo-detector-B_oj696o.js.map +0 -1
- package/dist/chunks/run-wycadErJ.js.map +0 -1
- package/dist/chunks/runner-logger-instance-nDWv2h2T.js.map +0 -1
- package/dist/chunks/spinner-BJL9zWAJ.js.map +0 -1
- package/dist/chunks/start-CQKEEma-.js.map +0 -1
- package/dist/chunks/start-traditional-uoLZXdxm.js.map +0 -1
- package/dist/chunks/status-cS8YwtUx.js.map +0 -1
- package/dist/chunks/theme-CktnrDZj.js.map +0 -1
- package/dist/chunks/upgrade-CKjl4HlB.js.map +0 -1
- package/dist/chunks/use-app-Cj2bzWaw.js +0 -10
- package/dist/chunks/use-app-Cj2bzWaw.js.map +0 -1
- package/dist/chunks/useBuildState-pcDGDakI.js.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/instrument.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"main-tui-Cklcr3FX.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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager-CvGX9qqe.js","sources":["../../src/lib/tunnel/auto-install.ts","../../../../packages/agent-core/dist/lib/selection/injector.js","../../src/lib/injection-proxy.ts","../../src/lib/tunnel/manager.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { platform, arch } from 'node:os';\nimport { existsSync, mkdirSync, chmodSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nconst CLOUDFLARED_GITHUB = 'https://github.com/cloudflare/cloudflared/releases/latest/download';\n\n/**\n * Get the local bin directory for cloudflared installation\n */\nfunction getBinDir(): string {\n const homeDir = process.env.HOME || process.env.USERPROFILE || '/tmp';\n const binDir = resolve(homeDir, '.openbuilder', 'bin');\n\n if (!existsSync(binDir)) {\n mkdirSync(binDir, { recursive: true });\n }\n\n return binDir;\n}\n\n/**\n * Detect the appropriate cloudflared binary name for this platform\n */\nfunction getCloudflaredBinaryName(): string {\n const plat = platform();\n const architecture = arch();\n\n if (plat === 'darwin') {\n if (architecture === 'arm64') {\n return 'cloudflared-darwin-arm64.tgz';\n }\n return 'cloudflared-darwin-amd64.tgz';\n } else if (plat === 'linux') {\n if (architecture === 'arm64') {\n return 'cloudflared-linux-arm64';\n }\n return 'cloudflared-linux-amd64';\n } else if (plat === 'win32') {\n return 'cloudflared-windows-amd64.exe';\n }\n\n throw new Error(`Unsupported platform: ${plat} ${architecture}`);\n}\n\n/**\n * Check if cloudflared is already installed (globally or locally)\n */\nfunction checkExistingInstallation(): string | null {\n // Check global installation\n try {\n execSync('cloudflared --version', { stdio: 'ignore' });\n return 'cloudflared';\n } catch {\n // Not installed globally\n }\n\n // Check local installation\n const binDir = getBinDir();\n const localPath = resolve(binDir, 'cloudflared');\n\n if (existsSync(localPath)) {\n return localPath;\n }\n\n return null;\n}\n\n/**\n * Download and install cloudflared binary\n */\nasync function downloadCloudflared(): Promise<string> {\n const binDir = getBinDir();\n const binaryName = getCloudflaredBinaryName();\n const downloadUrl = `${CLOUDFLARED_GITHUB}/${binaryName}`;\n const plat = platform();\n\n console.log(`📦 Downloading cloudflared from ${downloadUrl}...`);\n\n if (plat === 'darwin') {\n // macOS - download and extract tarball\n const tarPath = resolve(binDir, 'cloudflared.tgz');\n const extractDir = resolve(binDir, 'cloudflared-extract');\n\n execSync(`curl -L \"${downloadUrl}\" -o \"${tarPath}\"`, { stdio: 'inherit' });\n\n // Create extraction directory\n if (!existsSync(extractDir)) {\n mkdirSync(extractDir, { recursive: true });\n }\n\n // Extract\n execSync(`tar -xzf \"${tarPath}\" -C \"${extractDir}\"`, { stdio: 'inherit' });\n\n // Find the cloudflared binary in extracted files\n const extractedBinary = resolve(extractDir, 'cloudflared');\n const targetPath = resolve(binDir, 'cloudflared');\n\n // Move to bin directory\n execSync(`mv \"${extractedBinary}\" \"${targetPath}\"`, { stdio: 'inherit' });\n\n // Cleanup\n execSync(`rm -rf \"${tarPath}\" \"${extractDir}\"`, { stdio: 'ignore' });\n\n // Make executable\n chmodSync(targetPath, 0o755);\n\n return targetPath;\n } else if (plat === 'linux') {\n // Linux - download binary directly\n const targetPath = resolve(binDir, 'cloudflared');\n\n execSync(`curl -L \"${downloadUrl}\" -o \"${targetPath}\"`, { stdio: 'inherit' });\n chmodSync(targetPath, 0o755);\n\n return targetPath;\n } else if (plat === 'win32') {\n // Windows - download .exe\n const targetPath = resolve(binDir, 'cloudflared.exe');\n\n execSync(`curl -L \"${downloadUrl}\" -o \"${targetPath}\"`, { stdio: 'inherit' });\n\n return targetPath;\n }\n\n throw new Error(`Unsupported platform: ${plat}`);\n}\n\n/**\n * Ensure cloudflared is installed and return the path to the binary\n */\nexport async function ensureCloudflared(silent: boolean = false): Promise<string> {\n // Check if already installed\n const existing = checkExistingInstallation();\n if (existing) {\n if (!silent) {\n console.log(`✅ cloudflared found: ${existing}`);\n }\n return existing;\n }\n\n if (!silent) {\n console.log('📦 cloudflared not found, installing...');\n }\n\n try {\n const path = await downloadCloudflared();\n if (!silent) {\n console.log(`✅ cloudflared installed to: ${path}`);\n }\n return path;\n } catch (error) {\n console.error('❌ Failed to install cloudflared:', error);\n throw new Error('Failed to install cloudflared. Please install manually: https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/');\n }\n}\n","// src/lib/selection/hmr-proxy-script.ts\nvar HMR_PROXY_SCRIPT = `\n(function() {\n // Only run in iframe context\n if (window === window.parent) {\n return;\n }\n\n // Track if we've initialized\n if (window.__openbuilderHmrProxyInit) {\n return;\n }\n window.__openbuilderHmrProxyInit = true;\n\n // Store original WebSocket constructor\n const OriginalWebSocket = window.WebSocket;\n \n // Track active fake WebSocket connections\n const activeConnections = new Map();\n \n // Dev server port - set by parent via postMessage\n // null means we haven't received config yet\n let devServerPort = null;\n \n // Queue of connections waiting for port config\n const pendingConnections = [];\n\n /**\n * FakeWebSocket - Mimics WebSocket API but uses postMessage\n */\n class FakeWebSocket {\n constructor(url, protocols) {\n this.url = url;\n this.protocols = protocols;\n this.readyState = WebSocket.CONNECTING;\n this.bufferedAmount = 0;\n this.extensions = '';\n this.protocol = Array.isArray(protocols) ? protocols[0] : (protocols || '');\n this.binaryType = 'blob';\n \n // Event handlers\n this.onopen = null;\n this.onclose = null;\n this.onmessage = null;\n this.onerror = null;\n \n // Event listeners\n this._listeners = {\n open: [],\n close: [],\n message: [],\n error: [],\n };\n \n // Generate connection ID\n this._connectionId = 'hmr-' + Math.random().toString(36).substring(2, 11);\n \n // Store in active connections\n activeConnections.set(this._connectionId, this);\n \n // Request connection from parent\n this._requestConnect();\n }\n \n _requestConnect() {\n // Try to get port: first from parent config, then from URL\n let port = devServerPort;\n \n if (port === null) {\n // Try to extract from URL\n try {\n const urlObj = new URL(this.url);\n const urlPort = parseInt(urlObj.port, 10);\n // Only use URL port if it's a valid dev server port (not 80/443)\n if (urlPort && urlPort !== 80 && urlPort !== 443) {\n port = urlPort;\n }\n } catch (e) {}\n }\n \n // If we still don't have a valid port, HMR is disabled\n if (port === null || port === 80 || port === 443) {\n console.warn('[HMR Proxy] Cannot determine dev server port - HMR disabled for remote preview. URL:', this.url);\n // Queue for later in case parent sends config\n pendingConnections.push(this);\n return;\n }\n \n // Send connect request to parent\n window.parent.postMessage({\n type: 'openbuilder:hmr:connect',\n connectionId: this._connectionId,\n port: port,\n protocol: this.protocol,\n }, '*');\n }\n \n send(data) {\n if (this.readyState !== WebSocket.OPEN) {\n throw new DOMException('WebSocket is not open', 'InvalidStateError');\n }\n \n // Forward message to parent\n window.parent.postMessage({\n type: 'openbuilder:hmr:send',\n connectionId: this._connectionId,\n message: typeof data === 'string' ? data : JSON.stringify(data),\n }, '*');\n }\n \n close(code = 1000, reason = '') {\n if (this.readyState === WebSocket.CLOSING || this.readyState === WebSocket.CLOSED) {\n return;\n }\n \n this.readyState = WebSocket.CLOSING;\n \n // Tell parent to close connection\n window.parent.postMessage({\n type: 'openbuilder:hmr:disconnect',\n connectionId: this._connectionId,\n code: code,\n reason: reason,\n }, '*');\n \n // Clean up\n activeConnections.delete(this._connectionId);\n }\n \n addEventListener(type, listener) {\n if (this._listeners[type]) {\n this._listeners[type].push(listener);\n }\n }\n \n removeEventListener(type, listener) {\n if (this._listeners[type]) {\n const idx = this._listeners[type].indexOf(listener);\n if (idx !== -1) {\n this._listeners[type].splice(idx, 1);\n }\n }\n }\n \n dispatchEvent(event) {\n const listeners = this._listeners[event.type] || [];\n for (const listener of listeners) {\n listener.call(this, event);\n }\n \n // Also call on* handler if set\n const handler = this['on' + event.type];\n if (typeof handler === 'function') {\n handler.call(this, event);\n }\n \n return true;\n }\n \n // Called when connection is established (from parent message)\n _onConnected() {\n this.readyState = WebSocket.OPEN;\n \n const event = new Event('open');\n this.dispatchEvent(event);\n }\n \n // Called when message received (from parent message)\n _onMessage(data) {\n const event = new MessageEvent('message', { data });\n this.dispatchEvent(event);\n }\n \n // Called when connection closed (from parent message)\n _onClosed(code, reason) {\n this.readyState = WebSocket.CLOSED;\n activeConnections.delete(this._connectionId);\n \n const event = new CloseEvent('close', { code, reason, wasClean: code === 1000 });\n this.dispatchEvent(event);\n }\n \n // Called when error occurs (from parent message)\n _onError(message) {\n const event = new Event('error');\n this.dispatchEvent(event);\n }\n }\n \n // Add static properties\n FakeWebSocket.CONNECTING = 0;\n FakeWebSocket.OPEN = 1;\n FakeWebSocket.CLOSING = 2;\n FakeWebSocket.CLOSED = 3;\n\n /**\n * Check if this WebSocket connection should be intercepted\n * We intercept Vite HMR connections (protocol 'vite-hmr' or URL pattern)\n */\n function shouldIntercept(url, protocols) {\n // Check for vite-hmr protocol\n if (protocols) {\n const protocolList = Array.isArray(protocols) ? protocols : [protocols];\n if (protocolList.includes('vite-hmr')) {\n return true;\n }\n }\n \n // Check URL patterns for common dev server WebSocket endpoints\n try {\n const urlObj = new URL(url, window.location.href);\n \n // Vite HMR typically connects to localhost or 127.0.0.1\n const isLocalhost = urlObj.hostname === 'localhost' || \n urlObj.hostname === '127.0.0.1' ||\n urlObj.hostname === '0.0.0.0';\n \n // Check for common HMR paths\n const isHmrPath = urlObj.pathname === '/' || \n urlObj.pathname.includes('/__vite') ||\n urlObj.pathname.includes('/ws');\n \n // Common dev server ports\n const isDevPort = [3000, 3001, 5173, 5174, 8080, 8081].includes(parseInt(urlObj.port, 10));\n \n return isLocalhost && (isHmrPath || isDevPort);\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Proxy WebSocket constructor\n */\n const ProxiedWebSocket = function(url, protocols) {\n if (shouldIntercept(url, protocols)) {\n return new FakeWebSocket(url, protocols);\n }\n \n // Let non-HMR connections through (shouldn't happen in proxy mode)\n return new OriginalWebSocket(url, protocols);\n };\n \n // Copy static properties\n ProxiedWebSocket.CONNECTING = WebSocket.CONNECTING;\n ProxiedWebSocket.OPEN = WebSocket.OPEN;\n ProxiedWebSocket.CLOSING = WebSocket.CLOSING;\n ProxiedWebSocket.CLOSED = WebSocket.CLOSED;\n ProxiedWebSocket.prototype = OriginalWebSocket.prototype;\n \n // Override global WebSocket\n window.WebSocket = ProxiedWebSocket;\n \n /**\n * Listen for messages from parent window (HMR events and config)\n */\n window.addEventListener('message', function(event) {\n // Only handle messages from parent\n if (event.source !== window.parent) return;\n \n const { type, connectionId, message, code, reason, error, port } = event.data || {};\n \n if (!type || !type.startsWith('openbuilder:hmr:')) return;\n \n // Handle config message to set dev server port\n if (type === 'openbuilder:hmr:config') {\n if (port && typeof port === 'number') {\n devServerPort = port;\n \n // Process any queued connections\n while (pendingConnections.length > 0) {\n const conn = pendingConnections.shift();\n conn._requestConnect();\n }\n }\n return;\n }\n \n const conn = activeConnections.get(connectionId);\n if (!conn) {\n return;\n }\n \n switch (type) {\n case 'openbuilder:hmr:connected':\n conn._onConnected();\n break;\n \n case 'openbuilder:hmr:message':\n conn._onMessage(message);\n break;\n \n case 'openbuilder:hmr:closed':\n conn._onClosed(code || 1000, reason || '');\n break;\n \n case 'openbuilder:hmr:error':\n conn._onError(error || 'Unknown error');\n break;\n }\n });\n \n // Announce ready to parent\n window.parent.postMessage({ type: 'openbuilder:hmr:ready' }, '*');\n})();\n`;\n\n// src/lib/selection/injector.ts\nvar USE_WS_PROXY = typeof window !== \"undefined\" && window.__OPENBUILDER_USE_WS_PROXY === true;\nvar SELECTION_SCRIPT = `\n(function() {\n\n // Selection state - DORMANT by default\n let isInspectorActive = false;\n let inspectorStyle = null;\n let highlightedElement = null;\n let highlightOverlay = null;\n let mouseHandler = null;\n let clickHandler = null;\n\n function getProxyPrefix() {\n try {\n var parts = window.location.pathname.split('/').filter(Boolean);\n var projectsIndex = parts.indexOf('projects');\n if (projectsIndex === -1) {\n return null;\n }\n\n var projectId = parts[projectsIndex + 1];\n if (!projectId) {\n return null;\n }\n\n return '/api/projects/' + projectId + '/proxy?path=';\n } catch (error) {\n console.warn('\\u26A0\\uFE0F [OpenBuilder CSS] Unable to derive proxy prefix:', error);\n return null;\n }\n }\n\n var proxyPrefix = getProxyPrefix();\n\n function rewriteStylesheetHref(link) {\n if (!proxyPrefix || !link) {\n return false;\n }\n\n var href = link.getAttribute('href');\n if (!href) {\n return false;\n }\n\n var trimmed = href.trim();\n\n if (\n trimmed.indexOf('proxy?path=') !== -1 ||\n trimmed.indexOf('http://') === 0 ||\n trimmed.indexOf('https://') === 0 ||\n trimmed.indexOf('//') === 0 ||\n trimmed.indexOf('data:') === 0\n ) {\n return false;\n }\n\n if (trimmed.charAt(0) === '/') {\n var proxiedHref = proxyPrefix + encodeURIComponent(trimmed);\n if (link.getAttribute('href') !== proxiedHref) {\n link.setAttribute('href', proxiedHref);\n console.log('\\u{1F3A8} [OpenBuilder CSS] rewrote stylesheet href to proxy:', proxiedHref);\n return true;\n }\n }\n\n return false;\n }\n\n // Debug helper: track when stylesheets are added/loaded inside the iframe\n function monitorStylesheets() {\n const loggedLinks = new WeakSet();\n const loggedStyles = new WeakSet();\n\n const logLink = (link, phase) => {\n if (!link) return;\n const href = link.getAttribute('href') || '(no href)';\n console.log('\\u{1F3A8} [OpenBuilder CSS]', phase + ' stylesheet:', href);\n };\n\n const logStyle = (style, phase) => {\n if (!style) return;\n const sample = (style.textContent || '')\n .replace(/s+/g, ' ')\n .trim()\n .slice(0, 140);\n console.log('\\u{1F3A8} [OpenBuilder CSS]', phase + ' inline style', sample);\n };\n\n const attachLinkListeners = (link, phase) => {\n if (!link || loggedLinks.has(link)) return;\n loggedLinks.add(link);\n const rewritten = rewriteStylesheetHref(link);\n const phaseLabel = rewritten ? phase + ' (rewritten)' : phase;\n logLink(link, phaseLabel);\n\n link.addEventListener(\n 'load',\n () => {\n rewriteStylesheetHref(link);\n logLink(link, 'loaded');\n },\n { once: true }\n );\n\n link.addEventListener(\n 'error',\n () => {\n rewriteStylesheetHref(link);\n logLink(link, 'error loading');\n },\n { once: true }\n );\n };\n\n const recordStyleElement = (style, phase) => {\n if (!style || loggedStyles.has(style)) return;\n loggedStyles.add(style);\n logStyle(style, phase);\n };\n\n // Observe new link/style nodes appended to the document\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (!(node instanceof HTMLElement)) return;\n\n if (node.tagName === 'LINK' && (node.getAttribute('rel') || '').includes('stylesheet')) {\n attachLinkListeners(node, 'added');\n }\n\n if (node.tagName === 'STYLE') {\n recordStyleElement(node, 'added');\n }\n });\n });\n });\n\n try {\n const head = document.head || document.documentElement;\n if (head) {\n observer.observe(head, { childList: true, subtree: true });\n }\n } catch (e) {\n console.warn('\\u26A0\\uFE0F [OpenBuilder CSS] Failed to observe stylesheet mutations:', e);\n }\n\n // Log existing stylesheet/link elements when script runs\n document\n .querySelectorAll('link[rel~=\"stylesheet\"], style')\n .forEach((node) => {\n if (node.tagName === 'LINK') {\n attachLinkListeners(node, 'existing');\n } else if (node.tagName === 'STYLE') {\n recordStyleElement(node, 'existing');\n }\n });\n\n // Capture late load events (when link is in DOM before listener added)\n document.addEventListener(\n 'load',\n (event) => {\n const target = event.target;\n if (\n target instanceof HTMLLinkElement &&\n (target.getAttribute('rel') || '').includes('stylesheet')\n ) {\n attachLinkListeners(target, 'load event');\n }\n },\n true\n );\n }\n\n monitorStylesheets();\n\n // Create highlight overlay\n function createHighlightOverlay() {\n if (highlightOverlay) return highlightOverlay;\n\n const overlay = document.createElement('div');\n overlay.id = '__openbuilder-highlight';\n overlay.style.cssText = \\`\n position: absolute;\n pointer-events: none;\n border: 2px solid #7553FF;\n background: rgba(117, 83, 255, 0.1);\n z-index: 999999;\n transition: all 0.1s ease;\n box-shadow: 0 0 0 1px rgba(117, 83, 255, 0.3), 0 0 20px rgba(117, 83, 255, 0.4);\n \\`;\n document.body.appendChild(overlay);\n highlightOverlay = overlay;\n return overlay;\n }\n\n // Remove highlight overlay\n function removeHighlightOverlay() {\n if (highlightOverlay) {\n highlightOverlay.remove();\n highlightOverlay = null;\n }\n }\n\n // Highlight element on hover\n function highlightElement(element) {\n if (!element || !isInspectorActive) {\n removeHighlightOverlay();\n return;\n }\n\n const rect = element.getBoundingClientRect();\n const overlay = createHighlightOverlay();\n\n overlay.style.left = rect.left + window.scrollX + 'px';\n overlay.style.top = rect.top + window.scrollY + 'px';\n overlay.style.width = rect.width + 'px';\n overlay.style.height = rect.height + 'px';\n\n highlightedElement = element;\n }\n\n // Generate unique CSS selector for element\n function generateSelector(element) {\n // Strategy 1: data-testid (best)\n const testId = element.getAttribute('data-testid');\n if (testId) {\n return \\`[data-testid=\"\\${testId}\"]\\`;\n }\n\n // Strategy 2: ID (good)\n if (element.id) {\n return \\`#\\${element.id}\\`;\n }\n\n // Strategy 3: Class + tag (ok) - but skip classes with colons (Tailwind responsive)\n const classes = Array.from(element.classList)\n .filter(c => !c.match(/^(hover:|focus:|active:|group-|animate-|transition-)/))\n .filter(c => !c.includes(':')) // Skip Tailwind responsive classes\n .slice(0, 3) // Limit to first 3 classes\n .join('.');\n\n if (classes) {\n const tagName = element.tagName.toLowerCase();\n\n try {\n // Check if unique enough\n const selector = \\`\\${tagName}.\\${classes}\\`;\n const matches = document.querySelectorAll(selector);\n\n if (matches.length === 1) {\n return selector;\n }\n\n // Add nth-child if multiple matches\n const parent = element.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children);\n const index = siblings.indexOf(element) + 1;\n return \\`\\${selector}:nth-child(\\${index})\\`;\n }\n\n return selector;\n } catch (err) {\n console.warn('Invalid selector, falling back to path:', err);\n }\n }\n\n // Strategy 4: Full path (fallback)\n return getFullPath(element);\n }\n\n // Get full CSS path to element\n function getFullPath(element) {\n const path = [];\n let current = element;\n\n while (current && current !== document.body) {\n let selector = current.tagName.toLowerCase();\n\n if (current.id) {\n selector += \\`#\\${current.id}\\`;\n path.unshift(selector);\n break;\n }\n\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n child => child.tagName === current.tagName\n );\n\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n selector += \\`:nth-of-type(\\${index})\\`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n return path.join(' > ');\n }\n\n // Capture element data and click position\n function captureElementData(element, clickEvent) {\n const rect = element.getBoundingClientRect();\n\n return {\n selector: generateSelector(element),\n tagName: element.tagName.toLowerCase(),\n className: element.className,\n id: element.id,\n textContent: element.textContent?.trim().slice(0, 100),\n innerHTML: element.innerHTML?.slice(0, 200),\n attributes: Array.from(element.attributes).reduce((acc, attr) => {\n acc[attr.name] = attr.value;\n return acc;\n }, {}),\n boundingRect: {\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n },\n clickPosition: {\n x: clickEvent.clientX,\n y: clickEvent.clientY,\n },\n computedStyles: {\n backgroundColor: window.getComputedStyle(element).backgroundColor,\n color: window.getComputedStyle(element).color,\n fontSize: window.getComputedStyle(element).fontSize,\n fontFamily: window.getComputedStyle(element).fontFamily,\n }\n };\n }\n\n // Mouse move handler (hover preview)\n function handleMouseMove(e) {\n if (!isInspectorActive) return;\n\n const element = e.target;\n if (element && element !== highlightedElement) {\n highlightElement(element);\n }\n }\n\n // Click handler (select element)\n function handleClick(e) {\n console.log('\\u{1F5B1}\\uFE0F Click detected, selection mode:', isInspectorActive);\n\n if (!isInspectorActive) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const element = e.target;\n const data = captureElementData(element, e);\n\n console.log('\\u{1F3AF} Element captured:', data);\n console.log(' Click position:', data.clickPosition);\n console.log('\\u{1F4E4} Sending postMessage to parent...');\n\n // Send to parent window\n window.parent.postMessage({\n type: 'openbuilder:element-selected',\n data,\n }, '*');\n\n console.log('\\u2705 Message sent to parent');\n\n // Disable selection mode after selection\n setInspectorActive(false);\n }\n\n // Activate/deactivate inspector (DORMANT PATTERN)\n function setInspectorActive(active) {\n isInspectorActive = active;\n\n if (active) {\n // Add inspector styles ONLY when activated\n if (!inspectorStyle) {\n inspectorStyle = document.createElement('style');\n inspectorStyle.textContent = \\`\n .inspector-active * {\n cursor: crosshair !important;\n }\n .inspector-highlight {\n outline: 2px solid #7553FF !important;\n outline-offset: -2px !important;\n background-color: rgba(117, 83, 255, 0.1) !important;\n }\n \\`;\n document.head.appendChild(inspectorStyle);\n }\n\n document.body.classList.add('inspector-active');\n\n // Add event listeners ONLY when activated\n if (!mouseHandler) {\n mouseHandler = handleMouseMove;\n clickHandler = handleClick;\n document.addEventListener('mousemove', mouseHandler, true);\n document.addEventListener('click', clickHandler, true);\n console.log('\\u2705 Inspector event listeners attached');\n }\n } else {\n document.body.classList.remove('inspector-active');\n\n // Remove highlight\n if (highlightedElement) {\n highlightedElement = null;\n }\n removeHighlightOverlay();\n\n // Remove event listeners when deactivated\n if (mouseHandler) {\n document.removeEventListener('mousemove', mouseHandler, true);\n document.removeEventListener('click', clickHandler, true);\n mouseHandler = null;\n clickHandler = null;\n console.log('\\u{1F9F9} Inspector event listeners removed');\n }\n\n // Remove styles\n if (inspectorStyle) {\n inspectorStyle.remove();\n inspectorStyle = null;\n }\n }\n\n }\n\n // Listen for activation/deactivation from parent\n window.addEventListener('message', (e) => {\n if (e.data.type === 'openbuilder:toggle-selection-mode') {\n setInspectorActive(e.data.enabled);\n }\n });\n\n // Announce ready to parent\n window.parent.postMessage({ type: 'openbuilder:ready' }, '*');\n})();\n`;\nfunction injectSelectionScript(iframe, options) {\n try {\n const iframeWindow = iframe.contentWindow;\n if (!iframeWindow) {\n console.error(\"\\u274C Cannot access iframe window\");\n return false;\n }\n const iframeDoc = iframeWindow.document;\n if (!iframeDoc) {\n console.error(\"\\u274C Cannot access iframe document\");\n return false;\n }\n if (iframeDoc.getElementById(\"__openbuilder-selection-script\")) {\n console.log(\"\\u26A0\\uFE0F Selection script already injected\");\n return true;\n }\n if (options?.enableHmrProxy) {\n if (!iframeDoc.getElementById(\"__openbuilder-hmr-proxy-script\")) {\n const hmrScript = iframeDoc.createElement(\"script\");\n hmrScript.id = \"__openbuilder-hmr-proxy-script\";\n hmrScript.textContent = HMR_PROXY_SCRIPT;\n if (iframeDoc.head) {\n iframeDoc.head.insertBefore(hmrScript, iframeDoc.head.firstChild);\n } else if (iframeDoc.body) {\n iframeDoc.body.insertBefore(hmrScript, iframeDoc.body.firstChild);\n }\n console.log(\"\\u2705 HMR proxy script injected into iframe\");\n }\n }\n const script = iframeDoc.createElement(\"script\");\n script.id = \"__openbuilder-selection-script\";\n script.textContent = SELECTION_SCRIPT;\n iframeDoc.body.appendChild(script);\n console.log(\"\\u2705 Selection script injected into iframe\");\n return true;\n } catch (error) {\n console.error(\"\\u274C Failed to inject selection script:\", error);\n return false;\n }\n}\nfunction toggleSelectionMode(iframe, enabled) {\n const iframeWindow = iframe.contentWindow;\n if (!iframeWindow) {\n console.error(\"\\u274C Cannot access iframe window\");\n return;\n }\n iframeWindow.postMessage({\n type: \"openbuilder:toggle-selection-mode\",\n enabled\n }, \"*\");\n}\nexport {\n HMR_PROXY_SCRIPT,\n SELECTION_SCRIPT,\n injectSelectionScript,\n toggleSelectionMode\n};\n//# sourceMappingURL=injector.js.map","/**\n * Injection Proxy for Remote Runner Support\n * \n * This proxy sits between the dev server and the Cloudflare tunnel,\n * injecting the element selection script into HTML responses.\n * \n * This enables the \"select element\" feature to work when:\n * - Frontend is hosted remotely (e.g., Vercel)\n * - Runner is running locally on user's machine\n * - Traffic flows through Cloudflare tunnel\n * \n * Without this proxy, the selection script can't be injected because\n * the iframe loads from a different origin (the tunnel URL).\n */\n\nimport http from 'http';\nimport https from 'https';\nimport httpProxy from 'http-proxy';\nimport zlib from 'zlib';\nimport { SELECTION_SCRIPT } from '@openbuilder/agent-core/lib/selection/injector';\n\nexport interface InjectionProxyOptions {\n /** Dev server port to proxy to (e.g., 3000) */\n targetPort: number;\n /** Port for this proxy to listen on (default: 4000) */\n proxyPort?: number;\n /** Optional error handler */\n onError?: (err: Error) => void;\n /** Optional log function */\n log?: (...args: unknown[]) => void;\n}\n\nexport interface InjectionProxy {\n /** Port the proxy is listening on */\n port: number;\n /** The HTTP server instance */\n server: http.Server;\n /** Close the proxy server */\n close: () => Promise<void>;\n}\n\nconst DEFAULT_PROXY_PORT = 4000;\n\n/**\n * Create an injection proxy that forwards requests to a dev server\n * while injecting the selection script into HTML responses.\n */\nexport async function createInjectionProxy(options: InjectionProxyOptions): Promise<InjectionProxy> {\n const { \n targetPort, \n proxyPort = DEFAULT_PROXY_PORT, \n onError,\n log = console.log \n } = options;\n\n const targetUrl = `http://localhost:${targetPort}`;\n\n // Create proxy with WebSocket support\n const proxy = httpProxy.createProxyServer({\n target: targetUrl,\n ws: true,\n selfHandleResponse: true, // We need to modify HTML responses\n changeOrigin: true,\n });\n\n const server = http.createServer((req, res) => {\n // Forward the request through proxy\n proxy.web(req, res, {}, (err) => {\n if (err) {\n onError?.(err);\n // Try to send error response if headers not sent\n if (!res.headersSent) {\n res.writeHead(502, { 'Content-Type': 'text/plain' });\n res.end(`Proxy error: ${err.message}`);\n }\n }\n });\n });\n\n // Handle WebSocket upgrades (critical for HMR in Vite/Next.js/etc)\n server.on('upgrade', (req, socket, head) => {\n proxy.ws(req, socket, head, {}, (err) => {\n if (err) {\n onError?.(err);\n socket.destroy();\n }\n });\n });\n\n // Intercept responses to inject script into HTML\n proxy.on('proxyRes', (proxyRes, req, res) => {\n const contentType = proxyRes.headers['content-type'] || '';\n const isHtml = contentType.includes('text/html');\n\n if (!isHtml) {\n // Pass through non-HTML responses unchanged\n // Copy all headers\n res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\n proxyRes.pipe(res);\n return;\n }\n\n // Handle HTML - collect chunks and inject script\n const chunks: Buffer[] = [];\n const encoding = proxyRes.headers['content-encoding'];\n\n proxyRes.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n proxyRes.on('end', () => {\n try {\n let body = Buffer.concat(chunks);\n\n // Decompress if needed\n if (encoding === 'gzip') {\n try {\n body = zlib.gunzipSync(body);\n } catch {\n // If decompression fails, pass through unchanged\n const headers = { ...proxyRes.headers };\n res.writeHead(proxyRes.statusCode || 200, headers);\n res.end(Buffer.concat(chunks));\n return;\n }\n } else if (encoding === 'deflate') {\n try {\n body = zlib.inflateSync(body);\n } catch {\n const headers = { ...proxyRes.headers };\n res.writeHead(proxyRes.statusCode || 200, headers);\n res.end(Buffer.concat(chunks));\n return;\n }\n } else if (encoding === 'br') {\n try {\n body = zlib.brotliDecompressSync(body);\n } catch {\n const headers = { ...proxyRes.headers };\n res.writeHead(proxyRes.statusCode || 200, headers);\n res.end(Buffer.concat(chunks));\n return;\n }\n }\n\n let html = body.toString('utf-8');\n\n // Inject selection script before </body> or </html> or at end\n const scriptTag = `<script>${SELECTION_SCRIPT}</script>`;\n \n if (html.toLowerCase().includes('</body>')) {\n html = html.replace(/<\\/body>/i, `${scriptTag}</body>`);\n } else if (html.toLowerCase().includes('</html>')) {\n html = html.replace(/<\\/html>/i, `${scriptTag}</html>`);\n } else {\n // Fallback: append at end\n html += scriptTag;\n }\n\n // Prepare response\n const responseBody = Buffer.from(html, 'utf-8');\n \n // Copy headers, update content-length, remove encoding (we decompressed)\n const headers: Record<string, string | number | string[] | undefined> = { ...proxyRes.headers };\n delete headers['content-encoding'];\n delete headers['transfer-encoding'];\n headers['content-length'] = responseBody.length;\n\n res.writeHead(proxyRes.statusCode || 200, headers);\n res.end(responseBody);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n // On error, try to pass through original response\n if (!res.headersSent) {\n res.writeHead(proxyRes.statusCode || 500, proxyRes.headers);\n res.end(Buffer.concat(chunks));\n }\n }\n });\n\n proxyRes.on('error', (err) => {\n onError?.(err);\n if (!res.headersSent) {\n res.writeHead(502, { 'Content-Type': 'text/plain' });\n res.end(`Proxy response error: ${err.message}`);\n }\n });\n });\n\n // Handle proxy errors\n proxy.on('error', (err, req, res) => {\n onError?.(err);\n if (res && 'writeHead' in res && !res.headersSent) {\n (res as http.ServerResponse).writeHead(502, { 'Content-Type': 'text/plain' });\n (res as http.ServerResponse).end(`Proxy error: ${err.message}`);\n }\n });\n\n // Start server and return promise\n return new Promise((resolve, reject) => {\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n reject(new Error(`Injection proxy port ${proxyPort} is already in use`));\n } else {\n reject(err);\n }\n });\n\n server.listen(proxyPort, '127.0.0.1', () => {\n log(`[injection-proxy] Started on port ${proxyPort} → localhost:${targetPort}`);\n \n resolve({\n port: proxyPort,\n server,\n close: () => new Promise<void>((resolveClose) => {\n // Add timeout to prevent hanging if connections don't close\n const CLOSE_TIMEOUT_MS = 2000;\n let resolved = false;\n \n const timeoutId = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n log(`[injection-proxy] Force closing after ${CLOSE_TIMEOUT_MS}ms timeout`);\n // Force destroy the server if it hasn't closed\n try {\n server.closeAllConnections?.();\n } catch {\n // closeAllConnections may not be available in older Node versions\n }\n resolveClose();\n }\n }, CLOSE_TIMEOUT_MS);\n \n proxy.close(() => {\n server.close(() => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timeoutId);\n log(`[injection-proxy] Stopped`);\n }\n resolveClose();\n });\n });\n }),\n });\n });\n });\n}\n\n/**\n * Check if a port is available\n */\nexport async function isPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = http.createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close(() => resolve(true));\n });\n server.listen(port, '127.0.0.1');\n });\n}\n\n/**\n * Find an available port starting from the given port\n */\nexport async function findAvailablePort(startPort: number, maxAttempts = 10): Promise<number> {\n for (let i = 0; i < maxAttempts; i++) {\n const port = startPort + i;\n if (await isPortAvailable(port)) {\n return port;\n }\n }\n throw new Error(`No available port found starting from ${startPort}`);\n}\n","import { spawn, ChildProcess } from 'node:child_process';\nimport { EventEmitter } from 'node:events';\nimport { ensureCloudflared } from './auto-install.js';\nimport { createInjectionProxy, findAvailablePort, type InjectionProxy } from '../injection-proxy.js';\n\n/** Default port for the injection proxy */\nconst DEFAULT_INJECTION_PROXY_PORT = 4000;\n\ninterface TunnelInfo {\n url: string;\n /** Original dev server port */\n port: number;\n /** Injection proxy port (tunnel connects to this) */\n proxyPort: number;\n process: ChildProcess;\n /** Injection proxy instance (for cleanup) */\n injectionProxy?: InjectionProxy;\n}\n\nexport class TunnelManager extends EventEmitter {\n private tunnels = new Map<number, TunnelInfo>();\n private cloudflaredPath: string | null = null;\n private silent = false; // Suppress console output\n\n /**\n * Set silent mode (for TUI)\n */\n setSilent(silent: boolean): void {\n this.silent = silent;\n }\n\n /**\n * Conditional logging\n */\n private log(...args: unknown[]): void {\n if (!this.silent) {\n console.log(...args);\n }\n }\n\n /**\n * Create a tunnel for a specific port\n * Returns the public tunnel URL\n * \n * The tunnel is created through an injection proxy that adds the element\n * selection script to HTML responses. This enables the \"select element\"\n * feature to work when the frontend is hosted remotely.\n */\n async createTunnel(port: number, maxRetries = 5): Promise<string> {\n // Check if tunnel already exists for this port\n if (this.tunnels.has(port)) {\n const existing = this.tunnels.get(port)!;\n this.log(`🔗 Tunnel already exists for port ${port}: ${existing.url}`);\n return existing.url;\n }\n\n // Ensure cloudflared is installed\n if (!this.cloudflaredPath) {\n this.cloudflaredPath = await ensureCloudflared(this.silent);\n }\n\n // Step 1: Start injection proxy\n // This proxy injects the element selection script into HTML responses\n let injectionProxy: InjectionProxy | undefined;\n let proxyPort = DEFAULT_INJECTION_PROXY_PORT;\n\n try {\n // Find an available port for the proxy\n proxyPort = await findAvailablePort(DEFAULT_INJECTION_PROXY_PORT);\n \n injectionProxy = await createInjectionProxy({\n targetPort: port,\n proxyPort,\n onError: (err) => this.log(`[injection-proxy] Error: ${err.message}`),\n log: (...args) => this.log(...args),\n });\n \n this.log(`✅ Injection proxy started: localhost:${proxyPort} → localhost:${port}`);\n } catch (err) {\n // Fallback: tunnel directly to dev server (selection won't work but preview will)\n this.log(`⚠️ Injection proxy failed to start: ${err instanceof Error ? err.message : String(err)}`);\n this.log(`⚠️ Falling back to direct tunnel (element selection will not work)`);\n proxyPort = port; // Fall back to direct connection\n }\n\n // Step 2: Create tunnel to proxy port (or dev server if proxy failed)\n const tunnelTargetPort = injectionProxy ? proxyPort : port;\n\n // Try creating tunnel with smart retries\n const errors: string[] = [];\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await this._createTunnelAttempt(port, tunnelTargetPort, injectionProxy);\n } catch (error: any) {\n const errorMsg = error?.message || String(error);\n errors.push(errorMsg);\n console.error(`Tunnel creation attempt ${attempt}/${maxRetries} failed:`, errorMsg);\n\n // Check if this is a permanent error (fail fast)\n if (this._isPermanentError(errorMsg)) {\n // Clean up injection proxy on permanent failure\n if (injectionProxy) {\n await injectionProxy.close().catch(() => {});\n }\n throw new Error(`Permanent failure: ${errorMsg}`);\n }\n\n if (attempt === maxRetries) {\n // Clean up injection proxy on final failure\n if (injectionProxy) {\n await injectionProxy.close().catch(() => {});\n }\n throw new Error(`Failed to create tunnel after ${maxRetries} attempts: ${errors.join('; ')}`);\n }\n\n // Exponential backoff with jitter to prevent thundering herd\n const baseDelay = Math.pow(2, attempt) * 1000; // 2s, 4s, 8s, 16s\n const jitter = Math.random() * 1000; // 0-1s random jitter\n const delay = baseDelay + jitter;\n this.log(`Retrying in ${Math.round(delay)}ms...`);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n // Clean up injection proxy on failure\n if (injectionProxy) {\n await injectionProxy.close().catch(() => {});\n }\n throw new Error('Tunnel creation failed after all retries');\n }\n\n /**\n * Check if an error is permanent (no point retrying)\n */\n private _isPermanentError(errorMsg: string): boolean {\n const permanentErrors = [\n 'port already in use',\n 'cloudflared not found',\n 'permission denied',\n 'cannot find',\n 'enoent',\n 'eacces',\n ];\n\n const lowerMsg = errorMsg.toLowerCase();\n return permanentErrors.some(err => lowerMsg.includes(err));\n }\n\n /**\n * Extract tunnel URL from cloudflared output\n */\n private _extractTunnelUrl(output: string): string | null {\n // Format: \"Your quick Tunnel has been created! Visit it at: https://xxx.trycloudflare.com\"\n // Or just: \"https://xxx.trycloudflare.com\"\n const match = output.match(/https:\\/\\/[a-zA-Z0-9-]+\\.trycloudflare\\.com/);\n return match ? match[0] : null;\n }\n\n /**\n * Verify tunnel is actually responding (async, non-blocking)\n * This runs in background and only logs results\n */\n private async _verifyTunnelReady(url: string, maxWaitMs = 15000): Promise<boolean> {\n const startTime = Date.now();\n const checkInterval = 1000; // Check every 1 second (less aggressive)\n\n this.log(`🔍 [Background] Verifying tunnel is ready: ${url}`);\n\n while (Date.now() - startTime < maxWaitMs) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 2000);\n\n const response = await fetch(url, {\n method: 'HEAD',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Any response (even errors) means tunnel is connected\n // We just need to verify it's resolving and routing\n if (response.status < 500 || response.ok) {\n const elapsed = Date.now() - startTime;\n this.log(`✅ [Background] Tunnel verified in ${elapsed}ms`);\n return true;\n }\n } catch (error) {\n // Expected while DNS propagates or tunnel initializes\n // Will keep retrying silently\n }\n\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n }\n\n this.log(`⏱️ [Background] Verification timeout after ${maxWaitMs}ms (tunnel may still work)`);\n return false;\n }\n\n /**\n * Single attempt to create a tunnel\n * @param devServerPort - The original dev server port (used as key in tunnels map)\n * @param tunnelTargetPort - The port to tunnel to (proxy port or dev server port if proxy failed)\n * @param injectionProxy - Optional injection proxy instance for cleanup\n */\n private async _createTunnelAttempt(\n devServerPort: number, \n tunnelTargetPort: number,\n injectionProxy?: InjectionProxy\n ): Promise<string> {\n return new Promise((resolve, reject) => {\n const isUsingProxy = tunnelTargetPort !== devServerPort;\n this.log(`[tunnel] Creating tunnel for port ${tunnelTargetPort}${isUsingProxy ? ` (proxy for dev server on ${devServerPort})` : ''}...`);\n\n // Direct binary execution with unbuffered streams\n const proc = spawn(this.cloudflaredPath!, [\n 'tunnel',\n '--url', `http://localhost:${tunnelTargetPort}`,\n '--no-autoupdate',\n ], {\n cwd: process.cwd(),\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n // Set streams to unbuffered mode immediately for responsive output\n if (proc.stdout) {\n proc.stdout.setEncoding('utf8');\n proc.stdout.resume();\n }\n if (proc.stderr) {\n proc.stderr.setEncoding('utf8');\n proc.stderr.resume();\n }\n\n this.log(`[tunnel] Cloudflared spawned with PID: ${proc.pid}`);\n\n let resolved = false;\n let tunnelUrl: string | null = null;\n let tunnelRegistered = false;\n\n const timeout = setTimeout(() => {\n if (!resolved) {\n proc.kill();\n reject(new Error('Tunnel creation timeout (30s)'));\n }\n }, 30000);\n\n // Shared handler for both stdout and stderr\n const handleOutput = async (data: Buffer) => {\n const output = data.toString();\n\n // Step 1: Extract URL\n if (!tunnelUrl) {\n const url = this._extractTunnelUrl(output);\n if (url) {\n tunnelUrl = url;\n this.log(`✅ Tunnel URL received: ${url} → localhost:${tunnelTargetPort}${isUsingProxy ? ` → localhost:${devServerPort}` : ''}`);\n // Store with dev server port as key, but include proxy info\n this.tunnels.set(devServerPort, { \n url, \n port: devServerPort, \n proxyPort: tunnelTargetPort,\n process: proc,\n injectionProxy,\n });\n }\n }\n\n // Step 2: Wait for tunnel registration (edge connection established)\n if (tunnelUrl && !tunnelRegistered && output.includes('Registered tunnel connection')) {\n tunnelRegistered = true;\n this.log(`✅ Tunnel registered with Cloudflare edge (DNS propagating)`);\n\n // Wait 3 seconds after registration for DNS to propagate\n this.log(`⏳ Waiting 3 seconds for DNS to fully propagate...`);\n await new Promise(r => setTimeout(r, 3000));\n\n // Step 3: Return only after registration + 3 second buffer\n if (!resolved) {\n resolved = true;\n clearTimeout(timeout);\n\n this.log(`✅ Tunnel ready: ${tunnelUrl}`);\n if (isUsingProxy) {\n this.log(`✅ Element selection enabled via injection proxy`);\n }\n\n // Note: Backend verification skipped for localhost tunnels\n // The tunnel connects localhost to Cloudflare - backend can't verify it\n // Frontend will verify DNS before loading in iframe\n\n resolve(tunnelUrl);\n }\n }\n };\n\n proc.stdout.on('data', handleOutput);\n\n proc.stderr.on('data', (data: Buffer) => {\n const output = data.toString();\n\n // Log errors (cloudflared uses stderr for all output)\n // Only show real errors, not shutdown messages\n const lower = output.toLowerCase();\n if ((lower.includes('error') || lower.includes('fatal')) &&\n !lower.includes('context canceled') &&\n !lower.includes('connection terminated') &&\n !lower.includes('no more connections active')) {\n this.log(`[cloudflared:${devServerPort}] ${output.trim()}`);\n }\n\n // Check for tunnel URL in stderr too\n handleOutput(data);\n });\n\n proc.on('exit', (code, signal) => {\n this.log(`Tunnel exited for port ${devServerPort} with code ${code} signal ${signal}`);\n // Clean up injection proxy when tunnel exits\n const tunnel = this.tunnels.get(devServerPort);\n if (tunnel?.injectionProxy) {\n tunnel.injectionProxy.close().catch(() => {});\n }\n this.tunnels.delete(devServerPort);\n this.emit('tunnel-closed', devServerPort);\n });\n\n proc.on('error', (error) => {\n if (!resolved) {\n clearTimeout(timeout);\n reject(error);\n }\n });\n });\n }\n\n /**\n * Close tunnel for a specific port\n */\n async closeTunnel(port: number): Promise<void> {\n const tunnel = this.tunnels.get(port);\n if (!tunnel) {\n this.log(`No tunnel found for port ${port}`);\n return;\n }\n\n this.log(`🔗 Closing tunnel for port ${port}...`);\n\n // Close injection proxy first (if exists) with timeout\n if (tunnel.injectionProxy) {\n try {\n // Use Promise.race to enforce timeout - injection proxy close can hang\n // if there are active HTTP keep-alive connections\n const PROXY_CLOSE_TIMEOUT_MS = 3000;\n await Promise.race([\n tunnel.injectionProxy.close(),\n new Promise<void>((resolve) => setTimeout(() => {\n this.log(`⚠️ Injection proxy close timed out after ${PROXY_CLOSE_TIMEOUT_MS}ms, continuing...`);\n resolve();\n }, PROXY_CLOSE_TIMEOUT_MS))\n ]);\n this.log(`✅ Injection proxy closed for port ${port}`);\n } catch (err) {\n this.log(`⚠️ Error closing injection proxy: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n // Force kill if not dead after 1 second\n if (!tunnel.process.killed) {\n tunnel.process.kill('SIGKILL');\n }\n this.tunnels.delete(port);\n resolve();\n }, 1000);\n\n tunnel.process.once('exit', () => {\n clearTimeout(timeout);\n this.tunnels.delete(port);\n resolve();\n });\n\n // Send SIGTERM\n tunnel.process.kill('SIGTERM');\n });\n }\n\n /**\n * Close all active tunnels\n */\n async closeAll(): Promise<void> {\n this.log(`🔗 Closing ${this.tunnels.size} active tunnel(s)...`);\n\n const ports = Array.from(this.tunnels.keys());\n await Promise.all(ports.map(port => this.closeTunnel(port)));\n }\n\n /**\n * Get tunnel URL for a specific port (if exists)\n */\n getTunnelUrl(port: number): string | null {\n const tunnel = this.tunnels.get(port);\n return tunnel ? tunnel.url : null;\n }\n\n /**\n * Get all active tunnels\n */\n getActiveTunnels(): Array<{ port: number; url: string }> {\n return Array.from(this.tunnels.values()).map(({ port, url }) => ({ port, url }));\n }\n}\n\n// Singleton instance\nexport const tunnelManager = new TunnelManager();\n"],"names":[],"mappings":"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;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;;AChvBD;;;;;;;;;;;;;AAaG;AA4BH,MAAM,kBAAkB,GAAG,IAAI;AAE/B;;;AAGG;AACI,eAAe,oBAAoB,CAAC,OAA8B,EAAA;AACvE,IAAA,MAAM,EACJ,UAAU,EACV,SAAS,GAAG,kBAAkB,EAC9B,OAAO,EACP,GAAG,GAAG,OAAO,CAAC,GAAG,EAClB,GAAG,OAAO;AAEX,IAAA,MAAM,SAAS,GAAG,CAAA,iBAAA,EAAoB,UAAU,EAAE;;AAGlD,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,iBAAiB,CAAC;AACxC,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,EAAE,EAAE,IAAI;QACR,kBAAkB,EAAE,IAAI;AACxB,QAAA,YAAY,EAAE,IAAI;AACnB,KAAA,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,KAAI;;AAE5C,QAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAA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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"port-allocator-Ct3ioni4.js","sources":["../../../../packages/agent-core/dist/lib/port-allocator.js"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\n\n// src/lib/db/client.ts\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport pg from \"pg\";\n\n// src/lib/db/schema.ts\nvar schema_exports = {};\n__export(schema_exports, {\n accounts: () => accounts,\n cliAuthSessions: () => cliAuthSessions,\n generationNotes: () => generationNotes,\n generationSessions: () => generationSessions,\n generationTodos: () => generationTodos,\n generationToolCalls: () => generationToolCalls,\n messages: () => messages,\n portAllocations: () => portAllocations,\n projects: () => projects,\n runnerKeys: () => runnerKeys,\n runningProcesses: () => runningProcesses,\n serverOperations: () => serverOperations,\n sessions: () => sessions,\n users: () => users,\n verifications: () => verifications\n});\nimport { pgTable, text, integer, timestamp, uuid, jsonb, index, uniqueIndex, boolean } from \"drizzle-orm/pg-core\";\nimport { sql } from \"drizzle-orm\";\nvar users = pgTable(\"users\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n name: text(\"name\").notNull(),\n email: text(\"email\").notNull().unique(),\n emailVerified: boolean(\"email_verified\").notNull().default(false),\n image: text(\"image\"),\n hasCompletedOnboarding: boolean(\"has_completed_onboarding\").notNull().default(false),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n});\nvar sessions = pgTable(\"sessions\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").notNull().references(() => users.id, { onDelete: \"cascade\" }),\n token: text(\"token\").notNull().unique(),\n expiresAt: timestamp(\"expires_at\").notNull(),\n ipAddress: text(\"ip_address\"),\n userAgent: text(\"user_agent\"),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n userIdIdx: index(\"sessions_user_id_idx\").on(table.userId),\n tokenIdx: index(\"sessions_token_idx\").on(table.token)\n}));\nvar accounts = pgTable(\"accounts\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").notNull().references(() => users.id, { onDelete: \"cascade\" }),\n accountId: text(\"account_id\").notNull(),\n providerId: text(\"provider_id\").notNull(),\n // 'credential', 'google', etc.\n accessToken: text(\"access_token\"),\n refreshToken: text(\"refresh_token\"),\n accessTokenExpiresAt: timestamp(\"access_token_expires_at\"),\n refreshTokenExpiresAt: timestamp(\"refresh_token_expires_at\"),\n scope: text(\"scope\"),\n idToken: text(\"id_token\"),\n // ID token from OAuth providers\n password: text(\"password\"),\n // Hashed password for credential provider\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n userIdIdx: index(\"accounts_user_id_idx\").on(table.userId),\n providerAccountIdx: uniqueIndex(\"accounts_provider_account_idx\").on(table.providerId, table.accountId)\n}));\nvar verifications = pgTable(\"verifications\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n identifier: text(\"identifier\").notNull(),\n // email or other identifier\n value: text(\"value\").notNull(),\n // verification token\n expiresAt: timestamp(\"expires_at\").notNull(),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n identifierIdx: index(\"verifications_identifier_idx\").on(table.identifier)\n}));\nvar runnerKeys = pgTable(\"runner_keys\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").notNull().references(() => users.id, { onDelete: \"cascade\" }),\n name: text(\"name\").notNull(),\n // User-friendly name like \"My MacBook\"\n keyHash: text(\"key_hash\").notNull(),\n // SHA-256 hash of the full key\n keyPrefix: text(\"key_prefix\").notNull(),\n // First 8 chars for display: \"sv_abc123...\"\n source: text(\"source\").default(\"web\"),\n // 'web' | 'cli' - how the key was created\n lastUsedAt: timestamp(\"last_used_at\"),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n revokedAt: timestamp(\"revoked_at\")\n // Soft delete - null means active\n}, (table) => ({\n userIdIdx: index(\"runner_keys_user_id_idx\").on(table.userId),\n keyHashIdx: uniqueIndex(\"runner_keys_key_hash_idx\").on(table.keyHash)\n}));\nvar cliAuthSessions = pgTable(\"cli_auth_sessions\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n token: text(\"token\").notNull().unique(),\n // Random token for session identification\n callbackPort: integer(\"callback_port\").notNull(),\n // Port the CLI is listening on\n callbackHost: text(\"callback_host\").default(\"localhost\"),\n // Host for callback\n state: text(\"state\").notNull().default(\"pending\"),\n // 'pending' | 'authenticated' | 'completed' | 'expired'\n userId: uuid(\"user_id\").references(() => users.id, { onDelete: \"cascade\" }),\n // Set after auth\n runnerKeyId: uuid(\"runner_key_id\").references(() => runnerKeys.id, { onDelete: \"cascade\" }),\n // Created key\n deviceName: text(\"device_name\"),\n // Auto-detected device name\n expiresAt: timestamp(\"expires_at\").notNull(),\n // Session expiration (short-lived)\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n authenticatedAt: timestamp(\"authenticated_at\")\n // When user completed OAuth\n}, (table) => ({\n tokenIdx: uniqueIndex(\"cli_auth_sessions_token_idx\").on(table.token),\n expiresAtIdx: index(\"cli_auth_sessions_expires_at_idx\").on(table.expiresAt)\n}));\nvar projects = pgTable(\"projects\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").references(() => users.id, { onDelete: \"set null\" }),\n // Owner of the project (nullable for migration/local mode)\n name: text(\"name\").notNull(),\n slug: text(\"slug\").notNull().unique(),\n description: text(\"description\"),\n originalPrompt: text(\"original_prompt\"),\n icon: text(\"icon\").default(\"Folder\"),\n status: text(\"status\").notNull().default(\"pending\"),\n projectType: text(\"project_type\"),\n detectedFramework: text(\"detected_framework\"),\n // Auto-detected framework (astro, next, vite, etc.)\n path: text(\"path\"),\n // Nullable - deprecated, path should be calculated from slug\n runCommand: text(\"run_command\"),\n port: integer(\"port\"),\n devServerPid: integer(\"dev_server_pid\"),\n devServerPort: integer(\"dev_server_port\"),\n devServerStatus: text(\"dev_server_status\").default(\"stopped\"),\n devServerStatusUpdatedAt: timestamp(\"dev_server_status_updated_at\").defaultNow(),\n tunnelUrl: text(\"tunnel_url\"),\n runnerId: text(\"runner_id\"),\n // Runner that created/manages this project\n generationState: text(\"generation_state\"),\n designPreferences: jsonb(\"design_preferences\"),\n // User-specified design constraints (deprecated - use tags)\n tags: jsonb(\"tags\"),\n // Tag-based configuration system\n lastActivityAt: timestamp(\"last_activity_at\").defaultNow(),\n errorMessage: text(\"error_message\"),\n // GitHub integration fields\n githubRepo: text(\"github_repo\"),\n // e.g., \"owner/repo-name\"\n githubUrl: text(\"github_url\"),\n // Full repository URL\n githubBranch: text(\"github_branch\"),\n // Default branch (e.g., \"main\")\n githubLastPushedAt: timestamp(\"github_last_pushed_at\"),\n // Last push timestamp\n githubAutoPush: boolean(\"github_auto_push\").default(false),\n // Auto-push after builds\n githubLastSyncAt: timestamp(\"github_last_sync_at\"),\n // Last time we synced repo info\n githubMeta: jsonb(\"github_meta\"),\n // Additional metadata (issues count, recent commits, etc.)\n // NeonDB integration fields\n neondbConnectionString: text(\"neondb_connection_string\"),\n // DATABASE_URL (encrypted/partial)\n neondbClaimUrl: text(\"neondb_claim_url\"),\n // URL to claim the database\n neondbHost: text(\"neondb_host\"),\n // Database host endpoint\n neondbDatabase: text(\"neondb_database\"),\n // Database name\n neondbCreatedAt: timestamp(\"neondb_created_at\"),\n // When database was provisioned\n neondbExpiresAt: timestamp(\"neondb_expires_at\"),\n // When unclaimed DB expires (72 hours)\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n // Indexes for performance\n userIdIdx: index(\"projects_user_id_idx\").on(table.userId),\n runnerIdIdx: index(\"projects_runner_id_idx\").on(table.runnerId),\n statusIdx: index(\"projects_status_idx\").on(table.status),\n lastActivityIdx: index(\"projects_last_activity_idx\").on(table.lastActivityAt)\n}));\nvar messages = pgTable(\"messages\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n projectId: uuid(\"project_id\").notNull().references(() => projects.id, { onDelete: \"cascade\" }),\n role: text(\"role\").notNull(),\n content: text(\"content\").notNull(),\n createdAt: timestamp(\"created_at\").notNull().defaultNow()\n});\nvar portAllocations = pgTable(\"port_allocations\", {\n port: integer(\"port\").primaryKey(),\n framework: text(\"framework\").notNull(),\n projectId: uuid(\"project_id\").references(() => projects.id, { onDelete: \"set null\" }),\n reservedAt: timestamp(\"reserved_at\").defaultNow()\n});\nvar runningProcesses = pgTable(\"running_processes\", {\n projectId: uuid(\"project_id\").primaryKey().notNull().references(() => projects.id, { onDelete: \"cascade\" }),\n pid: integer(\"pid\").notNull(),\n port: integer(\"port\"),\n command: text(\"command\"),\n runnerId: text(\"runner_id\"),\n // Runner that manages this process\n startedAt: timestamp(\"started_at\").notNull().defaultNow(),\n lastHealthCheck: timestamp(\"last_health_check\"),\n healthCheckFailCount: integer(\"health_check_fail_count\").notNull().default(0)\n}, (table) => ({\n // Index for filtering by runner\n runnerIdIdx: index(\"running_processes_runner_id_idx\").on(table.runnerId)\n}));\nvar generationSessions = pgTable(\"generation_sessions\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n projectId: uuid(\"project_id\").notNull().references(() => projects.id, { onDelete: \"cascade\" }),\n buildId: text(\"build_id\").notNull(),\n operationType: text(\"operation_type\"),\n status: text(\"status\").notNull().default(\"active\"),\n startedAt: timestamp(\"started_at\").notNull().defaultNow(),\n endedAt: timestamp(\"ended_at\"),\n summary: text(\"summary\"),\n rawState: jsonb(\"raw_state\"),\n isAutoFix: boolean(\"is_auto_fix\").default(false),\n // Flag for auto-fix sessions triggered by startup errors\n autoFixError: text(\"auto_fix_error\"),\n // The error message that triggered the auto-fix\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n projectIdIdx: index(\"generation_sessions_project_id_idx\").on(table.projectId),\n buildIdUnique: uniqueIndex(\"generation_sessions_build_id_unique\").on(table.buildId)\n}));\nvar generationTodos = pgTable(\"generation_todos\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n sessionId: uuid(\"session_id\").notNull().references(() => generationSessions.id, { onDelete: \"cascade\" }),\n todoIndex: integer(\"todo_index\").notNull(),\n content: text(\"content\").notNull(),\n activeForm: text(\"active_form\"),\n status: text(\"status\").notNull(),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n sessionIdIdx: index(\"generation_todos_session_id_idx\").on(table.sessionId),\n sessionIndexUnique: uniqueIndex(\"generation_todos_session_index_unique\").on(table.sessionId, table.todoIndex)\n}));\nvar generationToolCalls = pgTable(\"generation_tool_calls\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n sessionId: uuid(\"session_id\").notNull().references(() => generationSessions.id, { onDelete: \"cascade\" }),\n todoIndex: integer(\"todo_index\").notNull(),\n toolCallId: text(\"tool_call_id\").notNull(),\n name: text(\"name\").notNull(),\n input: jsonb(\"input\"),\n output: jsonb(\"output\"),\n state: text(\"state\").notNull(),\n startedAt: timestamp(\"started_at\").notNull().defaultNow(),\n endedAt: timestamp(\"ended_at\"),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n sessionIdIdx: index(\"generation_tool_calls_session_id_idx\").on(table.sessionId),\n toolCallUnique: uniqueIndex(\"generation_tool_calls_call_id_unique\").on(table.sessionId, table.toolCallId)\n}));\nvar generationNotes = pgTable(\"generation_notes\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n sessionId: uuid(\"session_id\").notNull().references(() => generationSessions.id, { onDelete: \"cascade\" }),\n todoIndex: integer(\"todo_index\").notNull(),\n textId: text(\"text_id\"),\n kind: text(\"kind\").notNull().default(\"text\"),\n content: text(\"content\").notNull(),\n createdAt: timestamp(\"created_at\").notNull().defaultNow()\n}, (table) => ({\n sessionIdIdx: index(\"generation_notes_session_id_idx\").on(table.sessionId),\n textIdUnique: uniqueIndex(\"generation_notes_text_id_unique\").on(table.sessionId, table.textId).where(sql`${table.textId} is not null`)\n}));\nvar serverOperations = pgTable(\"server_operations\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n projectId: uuid(\"project_id\").notNull().references(() => projects.id, { onDelete: \"cascade\" }),\n operation: text(\"operation\").notNull(),\n // 'start', 'stop', 'restart'\n status: text(\"status\").notNull().default(\"pending\"),\n // 'pending', 'sent', 'ack', 'completed', 'failed', 'timeout'\n runnerId: text(\"runner_id\"),\n port: integer(\"port\"),\n pid: integer(\"pid\"),\n error: text(\"error\"),\n failureReason: text(\"failure_reason\"),\n // 'port_in_use', 'health_check_timeout', 'immediate_crash', etc.\n retryCount: integer(\"retry_count\").notNull().default(0),\n metadata: jsonb(\"metadata\"),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n sentAt: timestamp(\"sent_at\"),\n ackAt: timestamp(\"ack_at\"),\n completedAt: timestamp(\"completed_at\")\n}, (table) => ({\n projectIdIdx: index(\"server_operations_project_id_idx\").on(table.projectId),\n statusIdx: index(\"server_operations_status_idx\").on(table.status),\n createdAtIdx: index(\"server_operations_created_at_idx\").on(table.createdAt)\n}));\n\n// src/lib/db/client.ts\nvar { Pool } = pg;\nfunction createPostgresClient() {\n const connectionString = process.env.DATABASE_URL;\n if (!connectionString) {\n throw new Error(\n 'DATABASE_URL is not set. Please configure your database connection:\\n - Run \"openbuilder init\" to set up a Neon database\\n - Or set DATABASE_URL environment variable to your PostgreSQL connection string'\n );\n }\n const pool = new Pool({\n connectionString,\n ssl: process.env.PGSSLMODE === \"disable\" ? false : { rejectUnauthorized: false }\n });\n const client = drizzle(pool, { schema: schema_exports });\n return client;\n}\nvar db = new Proxy({}, {\n get(_target, prop) {\n if (!global.__db) {\n global.__db = createPostgresClient();\n }\n return global.__db[prop];\n }\n});\n\n// src/lib/port-allocator.ts\nimport { and, eq, isNull, sql as sql2, isNotNull, lt } from \"drizzle-orm\";\nimport { createServer } from \"net\";\nimport { readFile } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\n\n// src/lib/logging/build-logger.ts\nimport * as Sentry from \"@sentry/node\";\nvar BuildLogger = class {\n buildId = null;\n projectId = null;\n /**\n * Set correlation IDs for the current build\n * Call this at the start of each build to enable correlation tracking\n */\n setBuildContext(buildId, projectId) {\n this.buildId = buildId;\n this.projectId = projectId;\n this.log(\"debug\", \"runner\", `Build context set: ${buildId} / ${projectId}`);\n }\n /**\n * Clear correlation IDs after build completes\n */\n clearBuildContext() {\n this.log(\"debug\", \"runner\", \"Build context cleared\");\n this.buildId = null;\n this.projectId = null;\n }\n /**\n * Core logging method - creates structured log entries\n * Public for custom logging needs\n */\n log(level, context, message, data) {\n if (process.env.SILENT_MODE === \"1\") {\n return;\n }\n if (level === \"info\" || level === \"debug\") {\n if (process.env.DEBUG_BUILD === \"0\") {\n return;\n }\n }\n const entry = {\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n level,\n context,\n buildId: this.buildId ?? void 0,\n projectId: this.projectId ?? void 0,\n message,\n data\n };\n const prefix = `[${context}]`;\n const icon = {\n debug: \"\\u{1F50D}\",\n info: \"\\u{1F4CB}\",\n warn: \"\\u26A0\\uFE0F \",\n error: \"\\u274C\"\n }[level];\n const logFn = level === \"error\" ? console.error : level === \"warn\" ? console.warn : console.log;\n if (data && Object.keys(data).length > 0) {\n logFn(`${icon} ${prefix} ${message}`, data);\n } else {\n logFn(`${icon} ${prefix} ${message}`);\n }\n if (typeof process !== \"undefined\" && process.env.NODE_ENV !== \"test\") {\n try {\n if (level === \"warn\" || level === \"error\") {\n Sentry.addBreadcrumb({\n category: `build-logger.${context}`,\n message,\n level: level === \"error\" ? \"error\" : \"warning\",\n data: {\n ...data,\n buildId: this.buildId,\n projectId: this.projectId\n }\n });\n }\n } catch {\n }\n }\n }\n /**\n * Orchestrator-specific logging methods\n */\n orchestrator = {\n newProject: (operationType) => this.log(\"info\", \"orchestrator\", `NEW PROJECT (operationType: ${operationType})`),\n existingProject: (operationType) => this.log(\"info\", \"orchestrator\", `EXISTING PROJECT (operationType: ${operationType})`),\n templateProvided: (templateName, templateId, framework) => this.log(\"info\", \"orchestrator\", `Frontend provided template: ${templateName}`, {\n templateId,\n framework\n }),\n templateSelecting: (method) => this.log(\"info\", \"orchestrator\", `Template selection: ${method}`),\n templateSelected: (templateName, templateId) => this.log(\"info\", \"orchestrator\", `Selected template: ${templateName}`, { templateId }),\n templateDownloading: (templateName, repository, target) => this.log(\"info\", \"orchestrator\", `Downloading template: ${templateName}`, {\n repository,\n target\n }),\n templateDownloaded: (templateName, path, fileTreeSize) => this.log(\"info\", \"orchestrator\", `Template downloaded: ${templateName}`, {\n path,\n fileTreeSize\n }),\n catalogPrepared: (catalogSize) => this.log(\"info\", \"orchestrator\", `Template catalog prepared (${catalogSize} chars)`, {\n catalogSize\n }),\n systemPromptGenerated: (size) => this.log(\"info\", \"orchestrator\", `System prompt generated (${size} chars)`, { size }),\n orchestrationComplete: (data) => this.log(\"info\", \"orchestrator\", \"Orchestration complete\", data),\n error: (message, error) => this.log(\"error\", \"orchestrator\", message, {\n error: error instanceof Error ? error.message : String(error)\n })\n };\n /**\n * Message transformer-specific logging methods\n */\n transformer = {\n todoListFound: () => this.log(\"debug\", \"transformer\", \"Found Codex task list, parsing...\"),\n todoListParsed: (todoCount, completed, inProgress, pending) => this.log(\"info\", \"transformer\", `Parsed ${todoCount} todos`, {\n completed,\n inProgress,\n pending\n }),\n todoListInvalidFormat: (expected, got) => this.log(\"error\", \"transformer\", \"Invalid todo format from Codex\", {\n expected,\n got: JSON.stringify(got).substring(0, 200)\n }),\n todoListParseError: (error, rawJson) => this.log(\"error\", \"transformer\", \"Failed to parse Codex todolist\", {\n error: String(error),\n rawJson: rawJson.substring(0, 300)\n }),\n todoListRemoved: () => this.log(\"debug\", \"transformer\", \"Removed task list from chat text\"),\n toolStarted: (toolName, toolId) => this.log(\"debug\", \"transformer\", `Tool started: ${toolName}`, { toolName, toolId }),\n toolCompleted: (toolName, toolId) => this.log(\"debug\", \"transformer\", `Tool completed: ${toolName}`, { toolName, toolId }),\n pathViolationWarning: (toolName, path, workspace) => this.log(\"warn\", \"transformer\", `Path outside workspace: ${path}`, {\n toolName,\n path,\n workspace\n }),\n desktopPathDetected: (path) => this.log(\"error\", \"transformer\", `DESKTOP PATH DETECTED - Likely hallucinated: ${path}`, { path })\n };\n /**\n * Codex query-specific logging methods\n */\n codexQuery = {\n promptBuilding: (workingDirectory, systemPromptSize, userPromptSize) => this.log(\"info\", \"codex-query\", \"Building Codex prompt\", {\n workingDirectory,\n systemPromptSize,\n userPromptSize\n }),\n threadStarting: () => this.log(\"info\", \"codex-query\", \"Starting Codex thread (multi-turn)\"),\n turnStarted: (turnNumber, maxTurns, promptSize) => this.log(\"info\", \"codex-query\", `\\u2550\\u2550\\u2550 Turn ${turnNumber}/${maxTurns} \\u2550\\u2550\\u2550`, {\n turnNumber,\n maxTurns,\n promptSize\n }),\n taskListExtracted: () => this.log(\"info\", \"codex-query\", \"Task list extracted and updated\"),\n taskListStatus: (completed, inProgress, pending, total) => this.log(\"info\", \"codex-query\", `Tasks: ${completed} completed | ${inProgress} in_progress | ${pending} pending (total: ${total})`, {\n completed,\n inProgress,\n pending,\n total\n }),\n taskListTask: (index2, content, status, icon) => this.log(\"debug\", \"codex-query\", ` ${icon} ${index2 + 1}. ${content}`, { status }),\n taskListParseError: (error, rawContent) => this.log(\"error\", \"codex-query\", \"PARSE ERROR: Could not parse task list JSON\", {\n error: String(error),\n rawContent: rawContent.substring(0, 200)\n }),\n taskListMissing: (turnNumber) => this.log(\"warn\", \"codex-query\", `WARNING: No <start-todolist> tags found in Turn ${turnNumber}`, {\n turnNumber\n }),\n turnComplete: (turnNumber, hadToolCalls, messageLength) => this.log(\"info\", \"codex-query\", `Turn ${turnNumber} complete`, {\n hadToolCalls,\n messageLength\n }),\n tasksComplete: (completed, total) => this.log(\"info\", \"codex-query\", `Task status: ${completed}/${total} completed`, {\n completed,\n total\n }),\n allComplete: () => this.log(\"info\", \"codex-query\", \"\\u2705 All MVP tasks complete!\"),\n allTasksComplete: () => this.log(\"info\", \"codex-query\", \"\\u2705 All MVP tasks complete!\"),\n taskCompleteDetected: () => this.log(\"info\", \"codex-query\", \"\\u2705 Task complete (detected completion signal)\"),\n continuePrompting: (reason) => this.log(\"warn\", \"codex-query\", `No tools used but not done - ${reason}`),\n continuing: () => this.log(\"info\", \"codex-query\", \"\\u23ED\\uFE0F Continuing to next turn (had tool calls)\"),\n loopExited: (turnCount, maxTurns) => this.log(\"info\", \"codex-query\", `EXITED WHILE LOOP after ${turnCount} turns`, {\n turnCount,\n maxTurns\n }),\n sessionComplete: (turnCount) => this.log(\"info\", \"codex-query\", `Session complete after ${turnCount} turns`, { turnCount }),\n error: (message, error) => this.log(\"error\", \"codex-query\", message, {\n error: error instanceof Error ? error.message : String(error)\n })\n };\n /**\n * Claude query-specific logging methods\n */\n claudeQuery = {\n queryStarted: (model, cwd, maxTurns) => this.log(\"info\", \"claude-query\", `Starting Claude query (${model})`, {\n cwd,\n maxTurns\n }),\n error: (message, error) => this.log(\"error\", \"claude-query\", message, {\n error: error instanceof Error ? error.message : String(error)\n })\n };\n /**\n * Runner-specific logging methods\n */\n runner = {\n workspaceRoot: (path) => this.log(\"info\", \"runner\", `Workspace root: ${path}`, { path }),\n commandReceived: (commandType, projectId) => this.log(\"info\", \"runner\", `Received command: ${commandType}`, { commandType, projectId }),\n buildOperation: (operationType, projectSlug, agentId) => this.log(\"info\", \"runner\", `Build operation: ${operationType}`, {\n operationType,\n projectSlug,\n agentId\n }),\n templateProvided: (templateId) => this.log(\"info\", \"runner\", `Template provided by frontend: ${templateId}`, { templateId }),\n buildStreamCreated: () => this.log(\"info\", \"runner\", \"Build stream created, starting to process chunks...\"),\n firstChunkReceived: (agentLabel) => this.log(\"info\", \"runner\", `First chunk received from ${agentLabel}`, { agentLabel }),\n streamEnded: (chunkCount) => this.log(\"info\", \"runner\", `Stream ended after ${chunkCount} chunks`, { chunkCount }),\n buildCompleted: (projectId) => this.log(\"info\", \"runner\", `Build completed successfully`, { projectId }),\n buildFailed: (error) => this.log(\"error\", \"runner\", `Build failed: ${error}`, { error }),\n portDetected: (port) => this.log(\"info\", \"runner\", `Port detected: ${port}`, { port }),\n tunnelCreated: (port, tunnelUrl) => this.log(\"info\", \"runner\", `Tunnel created: ${tunnelUrl} \\u2192 localhost:${port}`, {\n port,\n tunnelUrl\n }),\n error: (message, error, context) => this.log(\"error\", \"runner\", message, {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : void 0,\n ...context\n })\n };\n /**\n * Build stream-specific logging (tool calls, text, etc.)\n */\n build = {\n agentText: (agentLabel, text2) => {\n const truncated = text2.length > 200 ? text2.slice(0, 200) + \"...\" : text2;\n this.log(\"debug\", \"build\", `${agentLabel}: ${truncated}`, {\n agentLabel,\n textLength: text2.length\n });\n },\n agentThinking: (thinking) => {\n const truncated = thinking.length > 300 ? thinking.slice(0, 300) + \"...\" : thinking;\n this.log(\"debug\", \"build\", `Thinking: ${truncated}`, {\n thinkingLength: thinking.length\n });\n },\n toolCalled: (toolName, toolId, inputSize) => this.log(\"info\", \"build\", `Tool called: ${toolName} (${toolId})`, {\n toolName,\n toolId,\n inputSize\n }),\n toolResult: (toolId, outputSize, isError) => this.log(isError ? \"error\" : \"info\", \"build\", `Tool result (${toolId})`, {\n toolId,\n outputSize,\n isError\n }),\n runCommandDetected: (runCommand) => this.log(\"info\", \"build\", `Detected runCommand: ${runCommand}`, { runCommand })\n };\n /**\n * WebSocket-specific logging methods\n */\n websocket = {\n serverCreated: (instanceId) => this.log(\"info\", \"websocket\", `WebSocket server instance created`, { instanceId }),\n serverInitialized: (path, runnerPath) => this.log(\"info\", \"websocket\", `Server initialized`, { path, runnerPath }),\n clientConnected: (clientId, projectId, sessionId) => this.log(\"info\", \"websocket\", `Client connected: ${clientId}`, { clientId, projectId, sessionId }),\n clientDisconnected: (clientId) => this.log(\"info\", \"websocket\", `Client disconnected: ${clientId}`, { clientId }),\n clientSubscribed: (clientId, projectId) => this.log(\"info\", \"websocket\", `Client subscribed to project: ${projectId}`, { clientId, projectId }),\n clientTimeout: (clientId) => this.log(\"warn\", \"websocket\", `Client timeout: ${clientId}`, { clientId }),\n runnerConnected: (runnerId) => this.log(\"info\", \"websocket\", `Runner connected: ${runnerId}`, { runnerId }),\n runnerDisconnected: (runnerId, code) => this.log(\"info\", \"websocket\", `Runner disconnected: ${runnerId}`, { runnerId, code }),\n runnerNotConnected: (runnerId, commandType) => this.log(\"warn\", \"websocket\", `Cannot send command to runner ${runnerId}: not connected`, {\n runnerId,\n commandType\n }),\n runnerAuthRejected: () => this.log(\"warn\", \"websocket\", `Runner connection rejected: invalid auth`),\n runnerAuthMissing: () => this.log(\"error\", \"websocket\", `RUNNER_SHARED_SECRET is not configured`),\n runnerStaleRemoved: (runnerId) => this.log(\"info\", \"websocket\", `Removing stale runner connection: ${runnerId}`, { runnerId }),\n commandSent: (runnerId, commandType, traceAttached) => this.log(\"debug\", \"websocket\", `Sent command to runner: ${commandType}`, {\n runnerId,\n commandType,\n traceAttached\n }),\n eventReceived: (runnerId, eventType) => this.log(\"debug\", \"websocket\", `Received event from runner: ${eventType}`, {\n runnerId,\n eventType\n }),\n broadcastToolCall: (toolName, toolState, subscriberCount) => this.log(\"info\", \"websocket\", `Broadcasting planning tool: ${toolName} (state=${toolState})`, {\n toolName,\n toolState,\n subscriberCount\n }),\n broadcastBuildComplete: (projectId, sessionId, subscriberCount) => this.log(\"info\", \"websocket\", `Broadcasting build-complete`, {\n projectId,\n sessionId,\n subscriberCount\n }),\n unknownUpgradePath: (pathname) => this.log(\"warn\", \"websocket\", `Unknown upgrade path: ${pathname}`, { pathname }),\n shutdown: () => this.log(\"info\", \"websocket\", `Shutting down server...`),\n shutdownComplete: () => this.log(\"info\", \"websocket\", `Server shut down`),\n error: (message, error, context) => this.log(\"error\", \"websocket\", message, {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : void 0,\n ...context\n })\n };\n /**\n * Port allocator-specific logging methods\n */\n portAllocator = {\n portAllocated: (port, projectId) => this.log(\"info\", \"port-allocator\", `Port allocated: ${port}`, { port, projectId }),\n portReleased: (port, projectId) => this.log(\"info\", \"port-allocator\", `Port released: ${port}`, { port, projectId }),\n portInUse: (port) => this.log(\"warn\", \"port-allocator\", `Port ${port} is already in use`, { port }),\n portRangeExhausted: (minPort, maxPort) => this.log(\"error\", \"port-allocator\", `No available ports in range ${minPort}-${maxPort}`, {\n minPort,\n maxPort\n }),\n portConflict: (port, projectId, existingProjectId) => this.log(\"warn\", \"port-allocator\", `Port ${port} conflict detected`, {\n port,\n projectId,\n existingProjectId\n }),\n allocationsCleared: (count) => this.log(\"info\", \"port-allocator\", `Cleared ${count} port allocations`, { count }),\n error: (message, error, context) => this.log(\"error\", \"port-allocator\", message, {\n error: error instanceof Error ? error.message : String(error),\n ...context\n })\n };\n /**\n * Process manager-specific logging methods\n */\n processManager = {\n processStarting: (projectId, command, cwd) => this.log(\"info\", \"process-manager\", `Starting process: ${command}`, {\n projectId,\n command,\n cwd\n }),\n processStarted: (projectId, pid) => this.log(\"info\", \"process-manager\", `Process started`, { projectId, pid }),\n processOutput: (projectId, output) => this.log(\"debug\", \"process-manager\", `Process output: ${output.substring(0, 100)}`, {\n projectId,\n outputLength: output.length\n }),\n processError: (projectId, error) => this.log(\"error\", \"process-manager\", `Process error: ${error}`, { projectId, error }),\n processExited: (projectId, code, signal) => this.log(\"info\", \"process-manager\", `Process exited`, { projectId, code, signal }),\n processStopped: (projectId) => this.log(\"info\", \"process-manager\", `Process stopped`, { projectId }),\n processNotFound: (projectId) => this.log(\"warn\", \"process-manager\", `Process not found for project: ${projectId}`, { projectId }),\n processKilled: (projectId, signal) => this.log(\"info\", \"process-manager\", `Process killed with signal: ${signal}`, {\n projectId,\n signal\n }),\n processCleanup: (projectId) => this.log(\"info\", \"process-manager\", `Cleaning up process`, { projectId }),\n processListRetrieved: (count) => this.log(\"debug\", \"process-manager\", `Retrieved ${count} running processes`, { count }),\n error: (message, error, context) => this.log(\"error\", \"process-manager\", message, {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : void 0,\n ...context\n })\n };\n /**\n * Build events-specific logging methods\n */\n buildEvents = {\n eventReceived: (eventType, projectId, sessionId) => this.log(\"info\", \"build-events\", `Received event: ${eventType}`, {\n eventType,\n projectId,\n sessionId\n }),\n eventProcessed: (eventType, projectId) => this.log(\"debug\", \"build-events\", `Processed event: ${eventType}`, { eventType, projectId }),\n buildStarted: (projectId, sessionId) => this.log(\"info\", \"build-events\", `Build started`, { projectId, sessionId }),\n buildCompleted: (projectId, sessionId, success) => this.log(\"info\", \"build-events\", `Build ${success ? \"completed\" : \"failed\"}`, {\n projectId,\n sessionId,\n success\n }),\n portDetected: (projectId, port) => this.log(\"info\", \"build-events\", `Port detected: ${port}`, { projectId, port }),\n devServerStarted: (projectId, port, url) => this.log(\"info\", \"build-events\", `Dev server started: ${url}`, { projectId, port, url }),\n devServerError: (projectId, error) => this.log(\"error\", \"build-events\", `Dev server error: ${error}`, { projectId, error }),\n toolCallReceived: (toolName, toolId) => this.log(\"debug\", \"build-events\", `Tool call: ${toolName}`, { toolName, toolId }),\n logChunkReceived: (projectId, chunkSize) => this.log(\"debug\", \"build-events\", `Log chunk received`, { projectId, chunkSize }),\n invalidEvent: (reason) => this.log(\"warn\", \"build-events\", `Invalid event: ${reason}`, { reason }),\n error: (message, error, context) => this.log(\"error\", \"build-events\", message, {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : void 0,\n ...context\n })\n };\n};\nvar buildLogger = new BuildLogger();\n\n// src/lib/port-allocator.ts\nvar FRAMEWORK_RANGES = {\n next: { start: 3101, end: 3200 },\n node: { start: 3101, end: 3200 },\n tanstack: { start: 3101, end: 3200 },\n astro: { start: 4321, end: 4421 },\n vite: { start: 5173, end: 5273 },\n default: { start: 6e3, end: 6100 }\n};\nvar FRAMEWORK_ENV_MAP = {\n next: [\"PORT\", \"NEXT_PUBLIC_PORT\"],\n node: [\"PORT\"],\n tanstack: [\"PORT\", \"VITE_PORT\"],\n astro: [\"PORT\", \"ASTRO_PORT\"],\n vite: [\"PORT\", \"VITE_PORT\"],\n default: [\"PORT\"]\n};\nasync function detectFrameworkFromFilesystem(projectPath) {\n try {\n let cachedPkg = null;\n const loadPackageJson = async () => {\n if (cachedPkg) return cachedPkg;\n const pkgPath = join(projectPath, \"package.json\");\n if (!existsSync(pkgPath)) {\n cachedPkg = null;\n return cachedPkg;\n }\n const pkgContent = await readFile(pkgPath, \"utf-8\");\n const pkg2 = JSON.parse(pkgContent);\n cachedPkg = {\n deps: { ...pkg2.dependencies ?? {}, ...pkg2.peerDependencies ?? {} },\n devDeps: pkg2.devDependencies ?? {},\n devScript: pkg2.scripts?.dev?.toLowerCase() ?? \"\"\n };\n return cachedPkg;\n };\n const hasTanStackDependency = async () => {\n const pkg2 = await loadPackageJson();\n if (!pkg2) return false;\n const combined = { ...pkg2.deps, ...pkg2.devDeps };\n if (combined[\"@tanstack/react-start\"]) return true;\n if (pkg2.devScript.includes(\"tanstack\")) return true;\n return false;\n };\n if (existsSync(join(projectPath, \"astro.config.mjs\")) || existsSync(join(projectPath, \"astro.config.ts\")) || existsSync(join(projectPath, \"astro.config.js\"))) {\n return \"astro\";\n }\n if (existsSync(join(projectPath, \"next.config.ts\")) || existsSync(join(projectPath, \"next.config.js\")) || existsSync(join(projectPath, \"next.config.mjs\"))) {\n return \"next\";\n }\n if (existsSync(join(projectPath, \"vite.config.ts\")) || existsSync(join(projectPath, \"vite.config.js\"))) {\n if (await hasTanStackDependency()) {\n return \"tanstack\";\n }\n return \"vite\";\n }\n const pkg = await loadPackageJson();\n if (pkg) {\n const allDeps = { ...pkg.deps, ...pkg.devDeps };\n if (allDeps[\"astro\"]) return \"astro\";\n if (allDeps[\"@tanstack/react-start\"]) return \"tanstack\";\n if (allDeps[\"next\"]) return \"next\";\n if (allDeps[\"vite\"]) return \"vite\";\n if (pkg.devScript.includes(\"tanstack\")) return \"tanstack\";\n if (pkg.devScript.includes(\"astro\")) return \"astro\";\n if (pkg.devScript.includes(\"next\")) return \"next\";\n if (pkg.devScript.includes(\"vite\")) return \"vite\";\n }\n } catch (error) {\n buildLogger.portAllocator.error(\"Failed to detect framework from filesystem\", error);\n }\n return null;\n}\nasync function resolveFramework(projectType, runCommand, savedFramework) {\n if (savedFramework) {\n const framework = toFrameworkKey(savedFramework);\n buildLogger.log(\"info\", \"port-allocator\", `Using saved framework (locked): ${framework}`, {\n savedFramework,\n projectType,\n runCommand\n });\n return framework;\n }\n buildLogger.log(\"warn\", \"port-allocator\", \"No saved framework found, falling back to detection (may cause port drift)\", {\n projectType,\n runCommand\n });\n const normalizedType = projectType?.toLowerCase() ?? \"\";\n if (normalizedType.includes(\"tanstack\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from projectType: tanstack\", { projectType });\n return \"tanstack\";\n }\n if (normalizedType.includes(\"vite\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from projectType: vite\", { projectType });\n return \"vite\";\n }\n if (normalizedType.includes(\"astro\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from projectType: astro\", { projectType });\n return \"astro\";\n }\n if (normalizedType.includes(\"next\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from projectType: next\", { projectType });\n return \"next\";\n }\n if (normalizedType.includes(\"node\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from projectType: node\", { projectType });\n return \"node\";\n }\n const normalizedCommand = runCommand?.toLowerCase() ?? \"\";\n if (normalizedCommand.includes(\"vite\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from runCommand: vite\", { runCommand });\n return \"vite\";\n }\n if (normalizedCommand.includes(\"astro\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from runCommand: astro\", { runCommand });\n return \"astro\";\n }\n if (normalizedCommand.includes(\"tanstack\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from runCommand: tanstack\", { runCommand });\n return \"tanstack\";\n }\n if (normalizedCommand.includes(\"next\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from runCommand: next\", { runCommand });\n return \"next\";\n }\n buildLogger.log(\"warn\", \"port-allocator\", \"No framework detected, using default (port 6000+)\", {\n projectType,\n runCommand\n });\n return \"default\";\n}\nfunction toFrameworkKey(value) {\n switch (value) {\n case \"next\":\n case \"astro\":\n case \"vite\":\n case \"tanstack\":\n case \"node\":\n return value;\n default:\n return \"default\";\n }\n}\nasync function reservePortForProject(params) {\n const framework = await resolveFramework(params.projectType, params.runCommand, params.detectedFramework);\n const range = FRAMEWORK_RANGES[framework];\n const preferred = params.preferredPort ?? void 0;\n return db.transaction(async (tx) => {\n await tx.update(portAllocations).set({ projectId: null, reservedAt: null }).where(eq(portAllocations.projectId, params.projectId)).execute();\n const now = /* @__PURE__ */ new Date();\n const tryReservePort = async (port) => {\n if (port < range.start || port > range.end) {\n return null;\n }\n const existing = await tx.select().from(portAllocations).where(eq(portAllocations.port, port)).limit(1).execute();\n if (existing.length === 0) {\n await tx.insert(portAllocations).values({\n port,\n framework,\n projectId: params.projectId,\n reservedAt: now\n }).execute();\n return port;\n }\n if (existing[0].projectId === null) {\n await tx.update(portAllocations).set({ projectId: params.projectId, reservedAt: now }).where(eq(portAllocations.port, port)).execute();\n return port;\n }\n return null;\n };\n if (preferred) {\n const reserved = await tryReservePort(preferred);\n if (reserved !== null) {\n return { port: reserved, framework };\n }\n }\n const reusable = await tx.select().from(portAllocations).where(and(eq(portAllocations.framework, framework), isNull(portAllocations.projectId))).orderBy(portAllocations.port).limit(1).execute();\n if (reusable.length > 0) {\n await tx.update(portAllocations).set({ projectId: params.projectId, reservedAt: now }).where(eq(portAllocations.port, reusable[0].port)).execute();\n return { port: reusable[0].port, framework };\n }\n const rows = await tx.select({\n maxPort: sql2`COALESCE(MAX(${portAllocations.port}), ${range.start - 1})`\n }).from(portAllocations).where(eq(portAllocations.framework, framework)).execute();\n const maxPort = rows[0]?.maxPort ?? range.start - 1;\n const nextPort = Math.max(range.start, maxPort + 1);\n if (nextPort > range.end) {\n throw new Error(`No available ports remaining for framework \"${framework}\" (${range.start}-${range.end}).`);\n }\n await tx.insert(portAllocations).values({\n port: nextPort,\n framework,\n projectId: params.projectId,\n reservedAt: now\n }).execute();\n return { port: nextPort, framework };\n });\n}\nasync function updatePortReservationForProject(projectId, actualPort) {\n await db.transaction(async (tx) => {\n const rows = await tx.select().from(portAllocations).where(eq(portAllocations.projectId, projectId)).limit(1).execute();\n if (rows.length === 0) {\n return;\n }\n const current = rows[0];\n if (current.port === actualPort) {\n return;\n }\n const frameworkKey = toFrameworkKey(current.framework);\n const range = FRAMEWORK_RANGES[frameworkKey] ?? FRAMEWORK_RANGES.default;\n if (actualPort < range.start || actualPort > range.end) {\n return;\n }\n const occupying = await tx.select().from(portAllocations).where(eq(portAllocations.port, actualPort)).limit(1).execute();\n if (occupying.length > 0 && occupying[0].projectId !== null && occupying[0].projectId !== projectId) {\n return;\n }\n await tx.delete(portAllocations).where(eq(portAllocations.port, current.port)).execute();\n const now = /* @__PURE__ */ new Date();\n if (occupying.length > 0) {\n await tx.update(portAllocations).set({ projectId, reservedAt: now }).where(eq(portAllocations.port, actualPort)).execute();\n } else {\n await tx.insert(portAllocations).values({\n port: actualPort,\n framework: current.framework,\n projectId,\n reservedAt: now\n }).execute();\n }\n });\n}\nasync function releasePortForProject(projectId) {\n await db.update(portAllocations).set({ projectId: null, reservedAt: null }).where(eq(portAllocations.projectId, projectId)).execute();\n}\nfunction buildEnvForFramework(framework, port) {\n const envKeys = FRAMEWORK_ENV_MAP[framework] ?? FRAMEWORK_ENV_MAP.default;\n const env = {};\n envKeys.forEach((key) => {\n env[key] = String(port);\n });\n env.DEV_SERVER_PORT = String(port);\n return env;\n}\nfunction getRunCommand(baseCommand) {\n if (!baseCommand || !baseCommand.trim()) {\n return \"npm run dev\";\n }\n return baseCommand;\n}\nasync function checkPortAvailability(port) {\n const localhostAvailable = await checkSingleInterface(port, \"localhost\");\n if (!localhostAvailable) {\n return false;\n }\n const allInterfacesAvailable = await checkSingleInterface(port, \"0.0.0.0\");\n return allInterfacesAvailable;\n}\nfunction checkSingleInterface(port, host) {\n return new Promise((resolve) => {\n const server = createServer();\n server.once(\"error\", (err) => {\n if (err.code === \"EADDRINUSE\") {\n resolve(false);\n } else {\n resolve(false);\n }\n });\n server.once(\"listening\", () => {\n server.close(() => {\n resolve(true);\n });\n });\n server.listen(port, host);\n });\n}\nasync function findAvailablePortInRange(range, preferredStart) {\n const scanStart = preferredStart && preferredStart >= range.start && preferredStart <= range.end ? preferredStart : range.start;\n buildLogger.log(\"debug\", \"port-allocator\", `Scanning for available port in range ${range.start}-${range.end}`, {\n scanStart,\n rangeStart: range.start,\n rangeEnd: range.end\n });\n for (let port = scanStart; port <= range.end; port++) {\n const isAvailable = await checkPortAvailability(port);\n if (isAvailable) {\n buildLogger.log(\"debug\", \"port-allocator\", `Found available port: ${port}`, { port });\n return port;\n }\n buildLogger.log(\"debug\", \"port-allocator\", `Port ${port} in use`, { port });\n }\n if (scanStart > range.start) {\n buildLogger.log(\"debug\", \"port-allocator\", `Wrapping around to scan ${range.start}-${scanStart - 1}`, {\n rangeStart: range.start,\n scanStart: scanStart - 1\n });\n for (let port = range.start; port < scanStart; port++) {\n const isAvailable = await checkPortAvailability(port);\n if (isAvailable) {\n buildLogger.log(\"debug\", \"port-allocator\", `Found available port: ${port}`, { port });\n return port;\n }\n buildLogger.log(\"debug\", \"port-allocator\", `Port ${port} in use`, { port });\n }\n }\n buildLogger.portAllocator.portRangeExhausted(range.start, range.end);\n return null;\n}\nasync function getPortForProject(projectId) {\n const rows = await db.select().from(portAllocations).where(eq(portAllocations.projectId, projectId)).limit(1).execute();\n if (rows.length === 0) {\n return null;\n }\n const allocation = rows[0];\n return {\n port: allocation.port,\n framework: toFrameworkKey(allocation.framework)\n };\n}\nasync function reserveOrReallocatePort(params, skipPortCheck = false) {\n const framework = await resolveFramework(params.projectType, params.runCommand, params.detectedFramework);\n const range = FRAMEWORK_RANGES[framework];\n buildLogger.log(\"info\", \"port-allocator\", `Allocating port for project ${params.projectId}`, {\n projectId: params.projectId,\n framework,\n rangeStart: range.start,\n rangeEnd: range.end,\n skipPortCheck\n });\n const existing = await getPortForProject(params.projectId);\n if (existing) {\n const withinRange = existing.port >= range.start && existing.port <= range.end;\n const sameFramework = existing.framework === framework;\n buildLogger.log(\"debug\", \"port-allocator\", `Found existing allocation: port ${existing.port}`, {\n port: existing.port,\n framework: existing.framework,\n projectId: params.projectId\n });\n if (!withinRange) {\n buildLogger.log(\"warn\", \"port-allocator\", `Port ${existing.port} outside valid range ${range.start}-${range.end}, will reallocate`, {\n port: existing.port,\n rangeStart: range.start,\n rangeEnd: range.end,\n projectId: params.projectId\n });\n await releasePortForProject(params.projectId);\n } else if (!sameFramework) {\n buildLogger.log(\"warn\", \"port-allocator\", `Framework mismatch (${existing.framework} \\u2192 ${framework}), will reallocate`, {\n oldFramework: existing.framework,\n newFramework: framework,\n projectId: params.projectId\n });\n await releasePortForProject(params.projectId);\n } else {\n if (skipPortCheck) {\n buildLogger.log(\"info\", \"port-allocator\", `Reusing port ${existing.port} (skipPortCheck=true)`, {\n port: existing.port,\n projectId: params.projectId\n });\n await db.update(portAllocations).set({ reservedAt: /* @__PURE__ */ new Date() }).where(eq(portAllocations.projectId, params.projectId)).execute();\n return existing;\n }\n const isAvailable = await checkPortAvailability(existing.port);\n if (isAvailable) {\n buildLogger.portAllocator.portAllocated(existing.port, params.projectId);\n await db.update(portAllocations).set({ reservedAt: /* @__PURE__ */ new Date() }).where(eq(portAllocations.projectId, params.projectId)).execute();\n return existing;\n }\n buildLogger.portAllocator.portInUse(existing.port);\n await releasePortForProject(params.projectId);\n }\n }\n let availablePort = null;\n if (skipPortCheck) {\n buildLogger.log(\"info\", \"port-allocator\", \"Remote runner mode: using DB allocation without OS check\", {\n projectId: params.projectId\n });\n try {\n const allocation = await reservePortForProject({\n ...params,\n detectedFramework: params.detectedFramework ?? framework\n });\n availablePort = allocation.port;\n buildLogger.log(\"info\", \"port-allocator\", `Allocated port ${availablePort} from DB`, {\n port: availablePort,\n projectId: params.projectId\n });\n } catch (error) {\n throw new Error(`Unable to allocate port for remote runner: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n } else {\n buildLogger.log(\"info\", \"port-allocator\", \"Local runner mode: scanning OS for available port\", {\n projectId: params.projectId,\n preferredPort: params.preferredPort\n });\n availablePort = await findAvailablePortInRange(range, params.preferredPort ?? void 0);\n if (!availablePort) {\n throw new Error(\n `All ports in range ${range.start}-${range.end} are in use. Please stop other dev servers or free up ports.`\n );\n }\n }\n buildLogger.log(\"debug\", \"port-allocator\", `Reserving port ${availablePort} in database`, {\n port: availablePort,\n projectId: params.projectId\n });\n await db.transaction(async (tx) => {\n await tx.update(portAllocations).set({ projectId: null, reservedAt: null }).where(eq(portAllocations.projectId, params.projectId)).execute();\n const existingPort = await tx.select().from(portAllocations).where(eq(portAllocations.port, availablePort)).limit(1).execute();\n const now = /* @__PURE__ */ new Date();\n if (existingPort.length === 0) {\n await tx.insert(portAllocations).values({\n port: availablePort,\n framework,\n projectId: params.projectId,\n reservedAt: now\n }).execute();\n } else {\n await tx.update(portAllocations).set({ projectId: params.projectId, framework, reservedAt: now }).where(eq(portAllocations.port, availablePort)).execute();\n }\n });\n buildLogger.portAllocator.portAllocated(availablePort, params.projectId);\n return { port: availablePort, framework };\n}\nasync function cleanupAbandonedPorts() {\n const threshold = new Date(Date.now() - 7 * 24 * 60 * 60 * 1e3);\n const result = await db.update(portAllocations).set({ projectId: null, reservedAt: null }).where(and(\n isNotNull(portAllocations.projectId),\n lt(portAllocations.reservedAt, threshold)\n )).returning();\n const cleanedCount = result.length;\n if (cleanedCount > 0) {\n buildLogger.portAllocator.allocationsCleared(cleanedCount);\n }\n return cleanedCount;\n}\nexport {\n buildEnvForFramework,\n checkPortAvailability,\n cleanupAbandonedPorts,\n detectFrameworkFromFilesystem,\n getPortForProject,\n getRunCommand,\n releasePortForProject,\n reserveOrReallocatePort,\n reservePortForProject,\n updatePortReservationForProject\n};\n//# sourceMappingURL=port-allocator.js.map"],"names":["Sentry.addBreadcrumb"],"mappings":";;;;;;;;;;;;AAAA,IAAI,SAAS,GAAG,MAAM,CAAC,cAAc;AACrC,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK;AAChC,EAAE,KAAK,IAAI,IAAI,IAAI,GAAG;AACtB,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACjE,CAAC;;AAMD;AACA,IAAI,cAAc,GAAG,EAAE;AACvB,QAAQ,CAAC,cAAc,EAAE;AACzB,EAAE,QAAQ,EAAE,MAAM,QAAQ;AAC1B,EAAE,eAAe,EAAE,MAAM,eAAe;AACxC,EAAE,eAAe,EAAE,MAAM,eAAe;AACxC,EAAE,kBAAkB,EAAE,MAAM,kBAAkB;AAC9C,EAAE,eAAe,EAAE,MAAM,eAAe;AACxC,EAAE,mBAAmB,EAAE,MAAM,mBAAmB;AAChD,EAAE,QAAQ,EAAE,MAAM,QAAQ;AAC1B,EAAE,eAAe,EAAE,MAAM,eAAe;AACxC,EAAE,QAAQ,EAAE,MAAM,QAAQ;AAC1B,EAAE,UAAU,EAAE,MAAM,UAAU;AAC9B,EAAE,gBAAgB,EAAE,MAAM,gBAAgB;AAC1C,EAAE,gBAAgB,EAAE,MAAM,gBAAgB;AAC1C,EAAE,QAAQ,EAAE,MAAM,QAAQ;AAC1B,EAAE,KAAK,EAAE,MAAM,KAAK;AACpB,EAAE,aAAa,EAAE,MAAM;AACvB,CAAC,CAAC;AAGF,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE;AAC7B,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;AAC9B,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;AACzC,EAAE,aAAa,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AACnE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;AACtB,EAAE,sBAAsB,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AACtF,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU;AACzD,CAAC,CAAC;AACF,IAAI,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE;AACnC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACvF,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;AACzC,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;AAC9C,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;AAC/B,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;AAC/B,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU;AACzD,CAAC,EAAE,CAAC,KAAK,MAAM;AACf,EAAE,SAAS,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;AAC3D,EAAE,QAAQ,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK;AACtD,CAAC,CAAC,CAAC;AACH,IAAI,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE;AACnC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACvF,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;AACzC,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;AAC3C;AACA,EAAE,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;AACnC,EAAE,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;AACrC,EAAE,oBAAoB,EAAE,SAAS,CAAC,yBAAyB,CAAC;AAC5D,EAAE,qBAAqB,EAAE,SAAS,CAAC,0BAA0B,CAAC;AAC9D,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;AACtB,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC;AAC3B;AACA,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;AAC5B;AACA,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU;AACzD,CAAC,EAAE,CAAC,KAAK,MAAM;AACf,EAAE,SAAS,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;AAC3D,EAAE,kBAAkB,EAAE,WAAW,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS;AACvG,CAAC,CAAC,CAAC;AACH,IAAI,aAAa,GAAG,OAAO,CAAC,eAAe,EAAE;AAC7C,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;AAC1C;AACA,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAChC;AACA,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;AAC9C,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU;AACzD,CAAC,EAAE,CAAC,KAAK,MAAM;AACf,EAAE,aAAa,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU;AAC1E,CAAC,CAAC,CAAC;AACH,IAAI,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE;AACxC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACvF,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;AAC9B;AACA,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;AACrC;AACA,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;AACzC;AACA,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AACvC;AACA,EAAE,UAAU,EAAE,SAAS,CAAC,cAAc,CAAC;AACvC,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY;AACnC;AACA,CAAC,EAAE,CAAC,KAAK,MAAM;AACf,EAAE,SAAS,EAAE,KAAK,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;AAC9D,EAAE,UAAU,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO;AACtE,CAAC,CAAC,CAAC;AACH,IAAI,eAAe,GAAG,OAAO,CAAC,mBAAmB,EAAE;AACnD,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;AACzC;AACA,EAAE,YAAY,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE;AAClD;AACA,EAAE,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;AAC1D;AACA,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AACnD;AACA,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC7E;AACA,EAAE,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,UAAU,CAAC,MAAM,UAAU,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC7F;AACA,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;AACjC;AACA,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;AAC9C;AACA,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,eAAe,EAAE,SAAS,CAAC,kBAAkB;AAC/C;AACA,CAAC,EAAE,CAAC,KAAK,MAAM;AACf,EAAE,QAAQ,EAAE,WAAW,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;AACtE,EAAE,YAAY,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS;AAC5E,CAAC,CAAC,CAAC;AACH,IAAI,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE;AACnC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAC9E;AACA,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;AAC9B,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;AACvC,EAAE,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;AAClC,EAAE,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC;AACzC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;AACtC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AACrD,EAAE,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;AACnC,EAAE,iBAAiB,EAAE,IAAI,CAAC,oBAAoB,CAAC;AAC/C;AACA,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;AACpB;AACA,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;AACjC,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;AACvB,EAAE,YAAY,EAAE,OAAO,CAAC,gBAAgB,CAAC;AACzC,EAAE,aAAa,EAAE,OAAO,CAAC,iBAAiB,CAAC;AAC3C,EAAE,eAAe,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;AAC/D,EAAE,wBAAwB,EAAE,SAAS,CAAC,8BAA8B,CAAC,CAAC,UAAU,EAAE;AAClF,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;AAC/B,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC;AAC7B;AACA,EAAE,eAAe,EAAE,IAAI,CAAC,kBAAkB,CAAC;AAC3C,EAAE,iBAAiB,EAAE,KAAK,CAAC,oBAAoB,CAAC;AAChD;AACA,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;AACrB;AACA,EAAE,cAAc,EAAE,SAAS,CAAC,kBAAkB,CAAC,CAAC,UAAU,EAAE;AAC5D,EAAE,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;AACrC;AACA,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;AACjC;AACA,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;AAC/B;AACA,EAAE,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;AACrC;AACA,EAAE,kBAAkB,EAAE,SAAS,CAAC,uBAAuB,CAAC;AACxD;AACA,EAAE,cAAc,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AAC5D;AACA,EAAE,gBAAgB,EAAE,SAAS,CAAC,qBAAqB,CAAC;AACpD;AACA,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC;AAClC;AACA;AACA,EAAE,sBAAsB,EAAE,IAAI,CAAC,0BAA0B,CAAC;AAC1D;AACA,EAAE,cAAc,EAAE,IAAI,CAAC,kBAAkB,CAAC;AAC1C;AACA,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;AACjC;AACA,EAAE,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC;AACzC;AACA,EAAE,eAAe,EAAE,SAAS,CAAC,mBAAmB,CAAC;AACjD;AACA,EAAE,eAAe,EAAE,SAAS,CAAC,mBAAmB,CAAC;AACjD;AACA,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU;AACzD,CAAC,EAAE,CAAC,KAAK,MAAM;AACf;AACA,EAAE,SAAS,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;AAC3D,EAAE,WAAW,EAAE,KAAK,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;AACjE,EAAE,SAAS,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;AAC1D,EAAE,eAAe,EAAE,KAAK,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc;AAC9E,CAAC,CAAC,CAAC;AACH,IAAI,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE;AACnC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAChG,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;AAC9B,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;AACpC,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU;AACzD,CAAC,CAAC;AACF,IAAI,eAAe,GAAG,OAAO,CAAC,kBAAkB,EAAE;AAClD,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE;AACpC,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;AACxC,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AACvF,EAAE,UAAU,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,UAAU;AACjD,CAAC,CAAC;AACF,IAAI,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE;AACpD,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC7G,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;AAC/B,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;AACvB,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;AAC1B,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC;AAC7B;AACA,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,eAAe,EAAE,SAAS,CAAC,mBAAmB,CAAC;AACjD,EAAE,oBAAoB,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;AAC9E,CAAC,EAAE,CAAC,KAAK,MAAM;AACf;AACA,EAAE,WAAW,EAAE,KAAK,CAAC,iCAAiC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ;AACzE,CAAC,CAAC,CAAC;AACH,IAAI,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,EAAE;AACxD,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAChG,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;AACrC,EAAE,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC;AACvC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;AACpD,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC;AAChC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;AAC1B,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC;AAC9B,EAAE,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AAClD;AACA,EAAE,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC;AACtC;AACA,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU;AACzD,CAAC,EAAE,CAAC,KAAK,MAAM;AACf,EAAE,YAAY,EAAE,KAAK,CAAC,oCAAoC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;AAC/E,EAAE,aAAa,EAAE,WAAW,CAAC,qCAAqC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO;AACpF,CAAC,CAAC,CAAC;AACH,IAAI,eAAe,GAAG,OAAO,CAAC,kBAAkB,EAAE;AAClD,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC1G,EAAE,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;AAC5C,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;AACpC,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;AACjC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;AAClC,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU;AACzD,CAAC,EAAE,CAAC,KAAK,MAAM;AACf,EAAE,YAAY,EAAE,KAAK,CAAC,iCAAiC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;AAC5E,EAAE,kBAAkB,EAAE,WAAW,CAAC,uCAAuC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS;AAC9G,CAAC,CAAC,CAAC;AACH,IAAI,mBAAmB,GAAG,OAAO,CAAC,uBAAuB,EAAE;AAC3D,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC1G,EAAE,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;AAC5C,EAAE,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;AAC5C,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;AAC9B,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;AACvB,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;AACzB,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAChC,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC;AAChC,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU;AACzD,CAAC,EAAE,CAAC,KAAK,MAAM;AACf,EAAE,YAAY,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;AACjF,EAAE,cAAc,EAAE,WAAW,CAAC,sCAAsC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU;AAC1G,CAAC,CAAC,CAAC;AACH,IAAI,eAAe,GAAG,OAAO,CAAC,kBAAkB,EAAE;AAClD,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC1G,EAAE,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;AAC5C,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;AACzB,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;AAC9C,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;AACpC,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU;AACzD,CAAC,EAAE,CAAC,KAAK,MAAM;AACf,EAAE,YAAY,EAAE,KAAK,CAAC,iCAAiC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;AAC5E,EAAE,YAAY,EAAE,WAAW,CAAC,iCAAiC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;AACvI,CAAC,CAAC,CAAC;AACH,IAAI,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE;AACpD,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;AAC7C,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAChG,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;AACxC;AACA,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AACrD;AACA,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC;AAC7B,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;AACvB,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC;AACrB,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;AACtB,EAAE,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC;AACvC;AACA,EAAE,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AACzD,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC;AAC7B,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;AAC3D,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC;AAC9B,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC;AAC5B,EAAE,WAAW,EAAE,SAAS,CAAC,cAAc;AACvC,CAAC,EAAE,CAAC,KAAK,MAAM;AACf,EAAE,YAAY,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;AAC7E,EAAE,SAAS,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;AACnE,EAAE,YAAY,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS;AAC5E,CAAC,CAAC,CAAC;;AAEH;AACA,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;AACjB,SAAS,oBAAoB,GAAG;AAChC,EAAE,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY;AACnD,EAAE,IAAI,CAAC,gBAAgB,EAAE;AACzB,IAAI,MAAM,IAAI,KAAK;AACnB,MAAM;AACN,KAAK;AACL,EAAE;AACF,EAAE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC;AACxB,IAAI,gBAAgB;AACpB,IAAI,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,GAAG,KAAK,GAAG,EAAE,kBAAkB,EAAE,KAAK;AAClF,GAAG,CAAC;AACJ,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;AAC1D,EAAE,OAAO,MAAM;AACf;AACS,IAAI,KAAK,CAAC,EAAE,EAAE;AACvB,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE;AACrB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AACtB,MAAM,MAAM,CAAC,IAAI,GAAG,oBAAoB,EAAE;AAC1C,IAAI;AACJ,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5B,EAAE;AACF,CAAC;AAWD,IAAI,WAAW,GAAG,MAAM;AACxB,EAAE,OAAO,GAAG,IAAI;AAChB,EAAE,SAAS,GAAG,IAAI;AAClB;AACA;AACA;AACA;AACA,EAAE,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE;AACtC,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO;AAC1B,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS;AAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;AAC/E,EAAE;AACF;AACA;AACA;AACA,EAAE,iBAAiB,GAAG;AACtB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,uBAAuB,CAAC;AACxD,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI;AACvB,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI;AACzB,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;AACrC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,EAAE;AACzC,MAAM;AACN,IAAI;AACJ,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE;AAC/C,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,EAAE;AAC3C,QAAQ;AACR,MAAM;AACN,IAAI;AACJ,KAAkB;AAClB,MAAM,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE;AAC3D,MAEM,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,MAAM;AACrC,MAAM,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,MAG/B;AACJ,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACjC,IAAI,MAAM,IAAI,GAAG;AACjB,MAAM,KAAK,EAAE,WAAW;AACxB,MAAM,IAAI,EAAE,WAAW;AACvB,MAAM,IAAI,EAAE,eAAe;AAC3B,MAAM,KAAK,EAAE;AACb,KAAK,CAAC,KAAK,CAAC;AACZ,IAAI,MAAM,KAAK,GAAG,KAAK,KAAK,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG;AACnG,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9C,MAAM,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC;AACjD,IAAI,CAAC,MAAM;AACX,MAAM,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3C,IAAI;AACJ,IAAI,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE;AAC3E,MAAM,IAAI;AACV,QAAQ,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE;AACnD,UAAUA,aAAoB,CAAC;AAC/B,YAAY,QAAQ,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AAC/C,YAAY,OAAO;AACnB,YAAY,KAAK,EAAE,KAAK,KAAK,OAAO,GAAG,OAAO,GAAG,SAAS;AAC1D,YAAY,IAAI,EAAE;AAClB,cAAc,GAAG,IAAI;AACrB,cAAc,OAAO,EAAE,IAAI,CAAC,OAAO;AACnC,cAAc,SAAS,EAAE,IAAI,CAAC;AAC9B;AACA,WAAW,CAAC;AACZ,QAAQ;AACR,MAAM,CAAC,CAAC,MAAM;AACd,MAAM;AACN,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA,EAAE,YAAY,GAAG;AACjB,IAAI,UAAU,EAAE,CAAC,aAAa,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,4BAA4B,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;AACpH,IAAI,eAAe,EAAE,CAAC,aAAa,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,iCAAiC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;AAC9H,IAAI,gBAAgB,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,4BAA4B,EAAE,YAAY,CAAC,CAAC,EAAE;AAC/I,MAAM,UAAU;AAChB,MAAM;AACN,KAAK,CAAC;AACN,IAAI,iBAAiB,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;AACpG,IAAI,gBAAgB,EAAE,CAAC,YAAY,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC;AAC1I,IAAI,mBAAmB,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC,EAAE;AACzI,MAAM,UAAU;AAChB,MAAM;AACN,KAAK,CAAC;AACN,IAAI,kBAAkB,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC,EAAE;AACvI,MAAM,IAAI;AACV,MAAM;AACN,KAAK,CAAC;AACN,IAAI,eAAe,EAAE,CAAC,WAAW,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,2BAA2B,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE;AAC3H,MAAM;AACN,KAAK,CAAC;AACN,IAAI,qBAAqB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,yBAAyB,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;AAC1H,IAAI,qBAAqB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,wBAAwB,EAAE,IAAI,CAAC;AACrG,IAAI,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE;AAC1E,MAAM,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK;AAClE,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA,EAAE,WAAW,GAAG;AAChB,IAAI,aAAa,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,mCAAmC,CAAC;AAC9F,IAAI,cAAc,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE;AAChI,MAAM,SAAS;AACf,MAAM,UAAU;AAChB,MAAM;AACN,KAAK,CAAC;AACN,IAAI,qBAAqB,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,gCAAgC,EAAE;AACjH,MAAM,QAAQ;AACd,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG;AAC/C,KAAK,CAAC;AACN,IAAI,kBAAkB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,gCAAgC,EAAE;AAC/G,MAAM,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;AAC1B,MAAM,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG;AACvC,KAAK,CAAC;AACN,IAAI,eAAe,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,kCAAkC,CAAC;AAC/F,IAAI,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC1H,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9H,IAAI,oBAAoB,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC,EAAE;AAC5H,MAAM,QAAQ;AACd,MAAM,IAAI;AACV,MAAM;AACN,KAAK,CAAC;AACN,IAAI,mBAAmB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,6CAA6C,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE;AACpI,GAAG;AACH;AACA;AACA;AACA,EAAE,UAAU,GAAG;AACf,IAAI,cAAc,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,uBAAuB,EAAE;AACrI,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM;AACN,KAAK,CAAC;AACN,IAAI,cAAc,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,oCAAoC,CAAC;AAC/F,IAAI,WAAW,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE;AAC/J,MAAM,UAAU;AAChB,MAAM,QAAQ;AACd,MAAM;AACN,KAAK,CAAC;AACN,IAAI,iBAAiB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,iCAAiC,CAAC;AAC/F,IAAI,cAAc,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,aAAa,EAAE,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;AACnM,MAAM,SAAS;AACf,MAAM,UAAU;AAChB,MAAM,OAAO;AACb,MAAM;AACN,KAAK,CAAC;AACN,IAAI,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;AACxI,IAAI,kBAAkB,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,6CAA6C,EAAE;AAC/H,MAAM,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;AAC1B,MAAM,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG;AAC7C,KAAK,CAAC;AACN,IAAI,eAAe,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,gDAAgD,EAAE,UAAU,CAAC,CAAC,EAAE;AACtI,MAAM;AACN,KAAK,CAAC;AACN,IAAI,YAAY,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE;AAC9H,MAAM,YAAY;AAClB,MAAM;AACN,KAAK,CAAC;AACN,IAAI,aAAa,EAAE,CAAC,SAAS,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE;AACzH,MAAM,SAAS;AACf,MAAM;AACN,KAAK,CAAC;AACN,IAAI,WAAW,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,gCAAgC,CAAC;AACxF,IAAI,gBAAgB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,gCAAgC,CAAC;AAC7F,IAAI,oBAAoB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,mDAAmD,CAAC;AACpH,IAAI,iBAAiB,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5G,IAAI,UAAU,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,wDAAwD,CAAC;AAC/G,IAAI,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,wBAAwB,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE;AACvH,MAAM,SAAS;AACf,MAAM;AACN,KAAK,CAAC;AACN,IAAI,eAAe,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,uBAAuB,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC;AAC/H,IAAI,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE;AACzE,MAAM,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK;AAClE,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA,EAAE,WAAW,GAAG;AAChB,IAAI,YAAY,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;AACjH,MAAM,GAAG;AACT,MAAM;AACN,KAAK,CAAC;AACN,IAAI,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE;AAC1E,MAAM,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK;AAClE,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA,EAAE,MAAM,GAAG;AACX,IAAI,aAAa,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;AAC5F,IAAI,eAAe,EAAE,CAAC,WAAW,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;AAC3I,IAAI,cAAc,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC,EAAE;AAC7H,MAAM,aAAa;AACnB,MAAM,WAAW;AACjB,MAAM;AACN,KAAK,CAAC;AACN,IAAI,gBAAgB,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,+BAA+B,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC;AAChI,IAAI,kBAAkB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,qDAAqD,CAAC;AAC/G,IAAI,kBAAkB,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC;AAC7H,IAAI,WAAW,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,mBAAmB,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC;AACtH,IAAI,cAAc,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,4BAA4B,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC;AAC5G,IAAI,WAAW,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AAC5F,IAAI,YAAY,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;AAC1F,IAAI,aAAa,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,EAAE;AAC5H,MAAM,IAAI;AACV,MAAM;AACN,KAAK,CAAC;AACN,IAAI,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC7E,MAAM,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AACnE,MAAM,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM;AAC1D,MAAM,GAAG;AACT,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA,EAAE,KAAK,GAAG;AACV,IAAI,SAAS,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK;AACtC,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK;AAChF,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,EAAE;AAChE,QAAQ,UAAU;AAClB,QAAQ,UAAU,EAAE,KAAK,CAAC;AAC1B,OAAO,CAAC;AACR,IAAI,CAAC;AACL,IAAI,aAAa,EAAE,CAAC,QAAQ,KAAK;AACjC,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,QAAQ;AACzF,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,EAAE;AAC3D,QAAQ,cAAc,EAAE,QAAQ,CAAC;AACjC,OAAO,CAAC;AACR,IAAI,CAAC;AACL,IAAI,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE;AACnH,MAAM,QAAQ;AACd,MAAM,MAAM;AACZ,MAAM;AACN,KAAK,CAAC;AACN,IAAI,UAAU,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE;AAC1H,MAAM,MAAM;AACZ,MAAM,UAAU;AAChB,MAAM;AACN,KAAK,CAAC;AACN,IAAI,kBAAkB,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,qBAAqB,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE;AACtH,GAAG;AACH;AACA;AACA;AACA,EAAE,SAAS,GAAG;AACd,IAAI,aAAa,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,iCAAiC,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC;AACrH,IAAI,iBAAiB,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACtH,IAAI,eAAe,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC3J,IAAI,kBAAkB,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC;AACrH,IAAI,gBAAgB,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,8BAA8B,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACnJ,IAAI,aAAa,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC;AAC3G,IAAI,eAAe,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC;AAC/G,IAAI,kBAAkB,EAAE,CAAC,QAAQ,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACjI,IAAI,kBAAkB,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,8BAA8B,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE;AAC7I,MAAM,QAAQ;AACd,MAAM;AACN,KAAK,CAAC;AACN,IAAI,kBAAkB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,wCAAwC,CAAC,CAAC;AACvG,IAAI,iBAAiB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,sCAAsC,CAAC,CAAC;AACrG,IAAI,kBAAkB,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,kCAAkC,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC;AAClI,IAAI,WAAW,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC,EAAE;AACpI,MAAM,QAAQ;AACd,MAAM,WAAW;AACjB,MAAM;AACN,KAAK,CAAC;AACN,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,4BAA4B,EAAE,SAAS,CAAC,CAAC,EAAE;AACvH,MAAM,QAAQ;AACd,MAAM;AACN,KAAK,CAAC;AACN,IAAI,iBAAiB,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,4BAA4B,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE;AAC/J,MAAM,QAAQ;AACd,MAAM,SAAS;AACf,MAAM;AACN,KAAK,CAAC;AACN,IAAI,sBAAsB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,2BAA2B,CAAC,EAAE;AACpI,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAM;AACN,KAAK,CAAC;AACN,IAAI,kBAAkB,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC;AACtH,IAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,uBAAuB,CAAC,CAAC;AAC5E,IAAI,gBAAgB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,gBAAgB,CAAC,CAAC;AAC7E,IAAI,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE;AAChF,MAAM,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AACnE,MAAM,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM;AAC1D,MAAM,GAAG;AACT,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA,EAAE,aAAa,GAAG;AAClB,IAAI,aAAa,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC1H,IAAI,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACxH,IAAI,SAAS,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;AACvG,IAAI,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE;AACvI,MAAM,OAAO;AACb,MAAM;AACN,KAAK,CAAC;AACN,IAAI,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,EAAE;AAC/H,MAAM,IAAI;AACV,MAAM,SAAS;AACf,MAAM;AACN,KAAK,CAAC;AACN,IAAI,kBAAkB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AACrH,IAAI,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE;AACrF,MAAM,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AACnE,MAAM,GAAG;AACT,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA,EAAE,cAAc,GAAG;AACnB,IAAI,eAAe,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,EAAE;AACtH,MAAM,SAAS;AACf,MAAM,OAAO;AACb,MAAM;AACN,KAAK,CAAC;AACN,IAAI,cAAc,EAAE,CAAC,SAAS,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAClH,IAAI,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;AAC9H,MAAM,SAAS;AACf,MAAM,YAAY,EAAE,MAAM,CAAC;AAC3B,KAAK,CAAC;AACN,IAAI,YAAY,EAAE,CAAC,SAAS,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC7H,IAAI,aAAa,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAClI,IAAI,cAAc,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC;AACxG,IAAI,eAAe,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC;AACrI,IAAI,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC,EAAE;AACvH,MAAM,SAAS;AACf,MAAM;AACN,KAAK,CAAC;AACN,IAAI,cAAc,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC;AAC5G,IAAI,oBAAoB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,kBAAkB,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AAC5H,IAAI,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE;AACtF,MAAM,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AACnE,MAAM,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM;AAC1D,MAAM,GAAG;AACT,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA,EAAE,WAAW,GAAG;AAChB,IAAI,aAAa,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,EAAE;AACzH,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAM;AACN,KAAK,CAAC;AACN,IAAI,cAAc,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC1I,IAAI,YAAY,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AACvH,IAAI,cAAc,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC,CAAC,EAAE;AACrI,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAM;AACN,KAAK,CAAC;AACN,IAAI,YAAY,EAAE,CAAC,SAAS,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACtH,IAAI,gBAAgB,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACxI,IAAI,cAAc,EAAE,CAAC,SAAS,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC/H,IAAI,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC7H,IAAI,gBAAgB,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AACjI,IAAI,YAAY,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;AACtG,IAAI,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE;AACnF,MAAM,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AACnE,MAAM,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM;AAC1D,MAAM,GAAG;AACT,KAAK;AACL,GAAG;AACH,CAAC;AACD,IAAI,WAAW,GAAG,IAAI,WAAW,EAAE;AAmBnC,eAAe,6BAA6B,CAAC,WAAW,EAAE;AAC1D,EAAE,IAAI;AACN,IAAI,IAAI,SAAS,GAAG,IAAI;AACxB,IAAI,MAAM,eAAe,GAAG,YAAY;AACxC,MAAM,IAAI,SAAS,EAAE,OAAO,SAAS;AACrC,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC;AACvD,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAChC,QAAQ,SAAS,GAAG,IAAI;AACxB,QAAQ,OAAO,SAAS;AACxB,MAAM;AACN,MAAM,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;AACzD,MAAM,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;AACzC,MAAM,SAAS,GAAG;AAClB,QAAQ,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAAE;AAC5E,QAAQ,OAAO,EAAE,IAAI,CAAC,eAAe,IAAI,EAAE;AAC3C,QAAQ,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI;AACvD,OAAO;AACP,MAAM,OAAO,SAAS;AACtB,IAAI,CAAC;AACL,IAAI,MAAM,qBAAqB,GAAG,YAAY;AAC9C,MAAM,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE;AAC1C,MAAM,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK;AAC7B,MAAM,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;AACxD,MAAM,IAAI,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,IAAI;AACxD,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,IAAI;AAC1D,MAAM,OAAO,KAAK;AAClB,IAAI,CAAC;AACL,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,EAAE;AACnK,MAAM,OAAO,OAAO;AACpB,IAAI;AACJ,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,EAAE;AAChK,MAAM,OAAO,MAAM;AACnB,IAAI;AACJ,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,EAAE;AAC5G,MAAM,IAAI,MAAM,qBAAqB,EAAE,EAAE;AACzC,QAAQ,OAAO,UAAU;AACzB,MAAM;AACN,MAAM,OAAO,MAAM;AACnB,IAAI;AACJ,IAAI,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE;AACvC,IAAI,IAAI,GAAG,EAAE;AACb,MAAM,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE;AACrD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,OAAO;AAC1C,MAAM,IAAI,OAAO,CAAC,uBAAuB,CAAC,EAAE,OAAO,UAAU;AAC7D,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,MAAM;AACxC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,MAAM;AACxC,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,UAAU;AAC/D,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,OAAO;AACzD,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,MAAM;AACvD,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,MAAM;AACvD,IAAI;AACJ,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,IAAI,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC;AACxF,EAAE;AACF,EAAE,OAAO,IAAI;AACb;;;;"}
|