@nmakarov/cli-toolkit 0.7.2 → 0.9.0

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/init.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/screen/components.ts","../src/screen/list-components.ts","../src/screen/screens.ts","../src/screen/ui-elements.ts","../src/screen/utils.ts","../src/screen/footer-builder.ts","../src/screen/index.ts","../src/init.ts","../src/args/index.ts","../src/params/index.ts","../src/errors.ts","../src/params/custom-types.ts","../src/logger/index.ts","../src/logger/transports.ts","../src/init/index.ts"],"sourcesContent":["/**\n * Core screen layout components\n */\n\nimport React, { createElement as h } from \"react\";\nimport { Box, Text } from \"ink\";\n\n/**\n * Get screen width for borders\n * @param maxWidth - Optional max width (null = no limit)\n */\nexport function getScreenWidth(maxWidth: number | null = null): number {\n const terminalWidth = process.stdout.columns || 80;\n // Leave some margin for borders and padding\n const availableWidth = Math.max(20, terminalWidth - 4);\n return maxWidth ? Math.min(availableWidth, maxWidth) : availableWidth;\n}\n\n// Types\nexport interface ScreenContainerProps {\n children: React.ReactNode;\n}\n\nexport interface ScreenRowProps {\n children: React.ReactNode;\n}\n\nexport interface ScreenTitleProps {\n text: string;\n}\n\nexport interface ScreenDividerProps {\n width?: number;\n}\n\nexport interface ScreenBodyProps {\n children: React.ReactNode;\n alignItems?: \"flex-start\" | \"center\" | \"flex-end\";\n}\n\nexport interface ScreenFooterProps {\n lines: (string | JSX.Element)[];\n textStyle?: {\n color?: string;\n dimColor?: boolean;\n bold?: boolean;\n };\n}\n\n/**\n * Screen Container - uses Ink's built-in borderStyle for proper text wrapping\n */\nexport function ScreenContainer({ children }: ScreenContainerProps): JSX.Element {\n const width = getScreenWidth();\n\n return h(Box, {\n flexDirection: \"column\",\n marginTop: 1,\n borderStyle: \"single\",\n borderColor: \"cyan\",\n paddingX: 1,\n width: width // Use the calculated width directly\n }, children);\n}\n\n/**\n * Screen row - just a wrapper for spacing, borders handled by container\n */\nexport function ScreenRow({ children }: ScreenRowProps): JSX.Element {\n return h(Box, { flexDirection: \"column\" }, children);\n}\n\n/**\n * Screen Title - first line inside container (left-aligned, breadcrumb-style)\n */\nexport function ScreenTitle({ text }: ScreenTitleProps): JSX.Element {\n return h(ScreenRow, {},\n h(Text, { bold: true, color: \"cyan\" }, text)\n );\n}\n\n/**\n * Horizontal divider line\n */\nexport function ScreenDivider({ width }: ScreenDividerProps): JSX.Element {\n const dividerWidth = width || (getScreenWidth() - 4); // Account for border and padding\n return h(Text, { color: \"cyan\", dimColor: true }, \"─\".repeat(dividerWidth));\n}\n\n/**\n * Screen Body - main content area\n */\nexport function ScreenBody({ children, alignItems = \"flex-start\" }: ScreenBodyProps): JSX.Element {\n return h(Box, { flexDirection: \"column\", alignItems }, children);\n}\n\n/**\n * Screen Footer - bottom area with key bindings and status\n * \n * @example\n * <ScreenFooter lines={[\"esc to go back\", \"enter to select\"]} />\n * \n * @example\n * <ScreenFooter \n * lines={[\"esc to go back\", \"enter to select\"]} \n * textStyle={{ color: \"white\" }}\n * />\n * \n * @example\n * <ScreenFooter \n * lines={[\"esc to go back\", \"enter to select\"]} \n * textStyle={{ dimColor: false, color: \"green\" }}\n * />\n */\nexport function ScreenFooter({ lines, textStyle }: ScreenFooterProps): JSX.Element {\n const defaultTextStyle = {\n dimColor: true,\n color: \"white\"\n };\n \n const finalTextStyle = { ...defaultTextStyle, ...textStyle };\n\n // Flatten nested arrays and ensure all items are properly wrapped\n const flattenAndWrap = (items: (string | JSX.Element | (string | JSX.Element)[])[], keyPrefix: string = \"\"): JSX.Element[] => {\n const result: JSX.Element[] = [];\n let keyIndex = 0;\n\n items.forEach((item, index) => {\n if (Array.isArray(item)) {\n // Handle nested arrays\n const nested = flattenAndWrap(item, `${keyPrefix}-${index}`);\n result.push(...nested);\n } else if (typeof item === \"string\") {\n // Wrap strings in Text components\n result.push(\n h(Text, { key: `${keyPrefix}-${keyIndex++}`, ...finalTextStyle }, item)\n );\n } else {\n // JSX elements - add key if missing\n const element = item as JSX.Element;\n if (element.key === null || element.key === undefined) {\n result.push(\n h(Text, { key: `${keyPrefix}-${keyIndex++}`, ...finalTextStyle }, element)\n );\n } else {\n result.push(element);\n }\n }\n });\n\n return result;\n };\n\n const wrappedItems = flattenAndWrap(lines);\n\n return h(Box, { flexDirection: \"column\" },\n h(Box, { flexDirection: \"row\" }, ...wrappedItems)\n );\n}","/**\n * Reusable screen components for V2 architecture\n */\n\nimport React, { useState, useEffect, useRef, createElement } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { ScreenRow, ScreenDivider } from \"./components.js\";\n\nconst h = createElement;\n\n// TODO: Define proper context type interface\ninterface ScreenContext {\n setAction: (name: string, handler: () => void) => void;\n setKeyBinding: (bindings: KeyBinding | KeyBinding[]) => void;\n addFooter: (message: string) => void;\n setFooter: (items: string | string[]) => void;\n goBack: () => void;\n update: () => void;\n}\n\ninterface KeyBinding {\n key: string;\n caption: string;\n action: string;\n order: number;\n}\n\ninterface ListItem {\n name: string;\n value: any;\n}\n\ninterface MultiColumnListComponentProps {\n items: string[];\n ctx: ScreenContext;\n selectedIndexRef: { current: number };\n}\n\ninterface MultiColumnListWithPreviewComponentProps {\n items: string[];\n getPreviewContent?: (item: string) => string | JSX.Element | Record<string, any>;\n ctx: ScreenContext;\n selectedIndexRef: { current: number };\n}\n\ninterface ListComponentProps {\n items: ListItem[];\n ctx: ScreenContext;\n selectedIndexRef: { current: number };\n renderItem?: (item: ListItem, isSelected: boolean, displayIndex: number) => JSX.Element;\n getTitle?: (item: ListItem) => string;\n sortable?: boolean;\n maxHeight?: number;\n sortHighlightStyle?: {\n color?: string;\n backgroundColor?: string;\n bold?: boolean;\n };\n selectionMarker?: string; // Customizable selection marker, default: \" \"\n}\n\n/**\n * Multi-column list component\n * Handles its own navigation, actions, and key bindings\n */\nexport function MultiColumnListComponent({ items, ctx, selectedIndexRef }: MultiColumnListComponentProps): JSX.Element {\n const [, forceUpdate] = useState({});\n\n // Calculate layout\n const termWidth = (process.stdout.columns || 80) - 8;\n const maxItemLength = Math.max(...items.map(w => w.length));\n const columnWidth = maxItemLength + 3;\n const columns = Math.max(1, Math.floor(termWidth / columnWidth));\n const itemsPerColumn = Math.ceil(items.length / columns);\n\n // Set up actions in useEffect (runs once)\n useEffect(() => {\n ctx.setAction(\"moveUp\", () => {\n selectedIndexRef.current = Math.max(0, selectedIndexRef.current - 1);\n forceUpdate({});\n });\n\n ctx.setAction(\"moveDown\", () => {\n selectedIndexRef.current = Math.min(items.length - 1, selectedIndexRef.current + 1);\n forceUpdate({});\n });\n\n ctx.setAction(\"moveLeft\", () => {\n if (selectedIndexRef.current === 0) {\n ctx.goBack();\n } else {\n selectedIndexRef.current = Math.max(0, selectedIndexRef.current - itemsPerColumn);\n forceUpdate({});\n }\n });\n\n ctx.setAction(\"moveRight\", () => {\n selectedIndexRef.current = Math.min(items.length - 1, selectedIndexRef.current + itemsPerColumn);\n forceUpdate({});\n });\n\n // Set up key bindings\n ctx.setKeyBinding([\n { key: \"leftArrow\", caption: \"navigate\", action: \"moveLeft\", order: 0 },\n { key: \"rightArrow\", caption: \"navigate\", action: \"moveRight\", order: 0 },\n { key: \"upArrow\", caption: \"navigate\", action: \"moveUp\", order: 0 },\n { key: \"downArrow\", caption: \"navigate\", action: \"moveDown\", order: 0 }\n ]);\n\n // Add footer\n ctx.addFooter(`Total: ${items.length} items`);\n }, []);\n\n const selectedIndex = selectedIndexRef.current;\n\n // Build grid\n const rows: JSX.Element[] = [];\n for (let row = 0; row < itemsPerColumn; row++) {\n const cols: JSX.Element[] = [];\n for (let col = 0; col < columns; col++) {\n const index = col * itemsPerColumn + row;\n if (index < items.length) {\n const isSelected = index === selectedIndex;\n cols.push(\n h(Box, { key: index, width: columnWidth },\n h(Text, {\n color: isSelected ? \"black\" : \"white\",\n backgroundColor: isSelected ? \"cyan\" : undefined,\n bold: isSelected\n }, items[index].padEnd(maxItemLength))\n )\n );\n }\n }\n rows.push(\n h(ScreenRow, { key: row, children: h(Box, { flexDirection: \"row\" }, ...cols) })\n );\n }\n\n return h(Box, { flexDirection: \"column\" }, ...rows);\n}\n\n/**\n * Multi-column list with preview panel component\n * Shows selected item details below the list\n */\nexport function MultiColumnListWithPreviewComponent({\n items,\n getPreviewContent,\n ctx,\n selectedIndexRef\n}: MultiColumnListWithPreviewComponentProps): JSX.Element {\n const [, forceUpdate] = useState({});\n\n // Calculate layout\n const termWidth = (process.stdout.columns || 80) - 8;\n const maxItemLength = Math.max(...items.map(w => w.length));\n const columnWidth = maxItemLength + 3;\n const columns = Math.max(1, Math.floor(termWidth / columnWidth));\n const itemsPerColumn = Math.ceil(items.length / columns);\n\n // Set up actions in useEffect (runs once)\n useEffect(() => {\n ctx.setAction(\"moveUp\", () => {\n selectedIndexRef.current = Math.max(0, selectedIndexRef.current - 1);\n forceUpdate({});\n });\n\n ctx.setAction(\"moveDown\", () => {\n selectedIndexRef.current = Math.min(items.length - 1, selectedIndexRef.current + 1);\n forceUpdate({});\n });\n\n ctx.setAction(\"moveLeft\", () => {\n if (selectedIndexRef.current === 0) {\n ctx.goBack();\n } else {\n selectedIndexRef.current = Math.max(0, selectedIndexRef.current - itemsPerColumn);\n forceUpdate({});\n }\n });\n\n ctx.setAction(\"moveRight\", () => {\n selectedIndexRef.current = Math.min(items.length - 1, selectedIndexRef.current + itemsPerColumn);\n forceUpdate({});\n });\n\n // Set up key bindings\n ctx.setKeyBinding([\n { key: \"leftArrow\", caption: \"navigate\", action: \"moveLeft\", order: 0 },\n { key: \"rightArrow\", caption: \"navigate\", action: \"moveRight\", order: 0 },\n { key: \"upArrow\", caption: \"navigate\", action: \"moveUp\", order: 0 },\n { key: \"downArrow\", caption: \"navigate\", action: \"moveDown\", order: 0 }\n ]);\n\n // Add footer\n ctx.addFooter(`Total: ${items.length} items`);\n }, []);\n\n const selectedIndex = selectedIndexRef.current;\n const selectedItem = items[selectedIndex];\n\n // Build grid\n const rows: JSX.Element[] = [];\n for (let row = 0; row < itemsPerColumn; row++) {\n const cols: JSX.Element[] = [];\n for (let col = 0; col < columns; col++) {\n const index = col * itemsPerColumn + row;\n if (index < items.length) {\n const isSelected = index === selectedIndex;\n cols.push(\n h(Box, { key: index, width: columnWidth },\n h(Text, {\n color: isSelected ? \"black\" : \"white\",\n backgroundColor: isSelected ? \"cyan\" : undefined,\n bold: isSelected\n }, items[index].padEnd(maxItemLength))\n )\n );\n }\n }\n rows.push(\n h(ScreenRow, { key: row, children: h(Box, { flexDirection: \"row\" }, ...cols) })\n );\n }\n\n // Get preview content for selected item\n const previewContent = getPreviewContent ? getPreviewContent(selectedItem) : selectedItem;\n\n const previewRows: JSX.Element[] = [];\n if (typeof previewContent === \"string\") {\n previewRows.push(h(ScreenRow, { key: \"preview-string\", children: h(Text, { bold: true }, previewContent) }));\n } else if (typeof previewContent === \"object\" && !React.isValidElement(previewContent) && previewContent !== null) {\n Object.entries(previewContent).forEach(([key, value], idx) => {\n previewRows.push(h(ScreenRow, { key: `preview-${key}-${idx}`, children: h(Text, {}, `${key}: ${value}`) }));\n });\n } else if (React.isValidElement(previewContent)) {\n previewRows.push(h(ScreenRow, { key: \"preview-element\", children: previewContent }));\n }\n\n return h(Box, { flexDirection: \"column\" },\n ...rows,\n h(ScreenRow, { key: \"spacer-1\", children: h(Text, {}, \" \") }),\n h(ScreenDivider, { key: \"divider\" }),\n h(ScreenRow, { key: \"spacer-2\", children: h(Text, {}, \" \") }),\n ...previewRows\n );\n}\n\n/**\n * Single-column list component\n * Simple vertical menu with optional sorting\n */\nexport function ListComponent({ items, ctx, selectedIndexRef, renderItem, getTitle, sortable = false, maxHeight, sortHighlightStyle, selectionMarker = \" \" }: ListComponentProps): JSX.Element {\n const [, forceUpdate] = useState({});\n const [sortOrder, setSortOrder] = useState<\"none\" | \"asc\" | \"desc\">(\"none\");\n const [scrollOffset, setScrollOffset] = useState(0);\n \n // Use refs to store current scroll values to avoid stale closures\n const scrollStateRef = useRef({ scrollOffset: 0, maxHeight: 0, totalItems: 0 });\n\n // Default getTitle - returns item if string, otherwise item.title\n const defaultGetTitle = (item: ListItem): string => {\n return getTitle ? getTitle(item) : (typeof item.value === \"string\" ? item.value : (item.value?.title || item.name));\n };\n\n // Get title for sorting\n const titleGetter = getTitle || defaultGetTitle;\n\n // Apply sorting if enabled\n const displayItems = sortable && sortOrder !== \"none\" ? [...items].sort((a, b) => {\n const titleA = titleGetter(a).toLowerCase();\n const titleB = titleGetter(b).toLowerCase();\n if (sortOrder === \"asc\") {\n return titleA < titleB ? -1 : titleA > titleB ? 1 : 0;\n } else {\n return titleA > titleB ? -1 : titleA < titleB ? 1 : 0;\n }\n }) : items;\n\n // Calculate scrolling\n const effectiveMaxHeight = maxHeight || displayItems.length;\n const canScroll = displayItems.length > effectiveMaxHeight;\n const maxScrollOffset = Math.max(0, displayItems.length - effectiveMaxHeight);\n \n // Ensure scroll offset is within bounds\n const clampedScrollOffset = Math.min(Math.max(0, scrollOffset), maxScrollOffset);\n \n // Get visible items\n const visibleItems = displayItems.slice(clampedScrollOffset, clampedScrollOffset + effectiveMaxHeight);\n \n // Check if we can scroll up/down\n const canScrollUp = clampedScrollOffset > 0;\n const canScrollDown = clampedScrollOffset < maxScrollOffset;\n \n // Update scroll state ref with current values\n scrollStateRef.current = { scrollOffset, maxHeight: effectiveMaxHeight, totalItems: displayItems.length };\n \n\n // Set up actions in useEffect (runs once)\n useEffect(() => {\n ctx.setAction(\"moveUp\", () => {\n const newIndex = Math.max(0, selectedIndexRef.current - 1);\n selectedIndexRef.current = newIndex;\n \n // Auto-scroll to keep selected item visible\n const { scrollOffset: currentScrollOffset, maxHeight: currentMaxHeight, totalItems } = scrollStateRef.current;\n const currentMaxScrollOffset = Math.max(0, totalItems - currentMaxHeight);\n const currentClampedScrollOffset = Math.min(Math.max(0, currentScrollOffset), currentMaxScrollOffset);\n \n if (newIndex < currentClampedScrollOffset) {\n setScrollOffset(newIndex);\n }\n \n // Force update to trigger re-render with new selected index\n forceUpdate({});\n });\n\n ctx.setAction(\"moveDown\", () => {\n const currentItems = sortable && sortOrder !== \"none\" ? [...items].sort((a, b) => {\n const titleA = titleGetter(a).toLowerCase();\n const titleB = titleGetter(b).toLowerCase();\n if (sortOrder === \"asc\") {\n return titleA < titleB ? -1 : titleA > titleB ? 1 : 0;\n } else {\n return titleA > titleB ? -1 : titleA < titleB ? 1 : 0;\n }\n }) : items;\n \n const maxIndex = currentItems.length - 1;\n const newIndex = Math.min(maxIndex, selectedIndexRef.current + 1);\n selectedIndexRef.current = newIndex;\n \n // Auto-scroll to keep selected item visible\n const { scrollOffset: currentScrollOffset, maxHeight: currentMaxHeight, totalItems } = scrollStateRef.current;\n const currentMaxScrollOffset = Math.max(0, totalItems - currentMaxHeight);\n const currentClampedScrollOffset = Math.min(Math.max(0, currentScrollOffset), currentMaxScrollOffset);\n \n if (newIndex >= currentClampedScrollOffset + currentMaxHeight) {\n setScrollOffset(newIndex - currentMaxHeight + 1);\n }\n \n // Force update to trigger re-render with new selected index\n forceUpdate({});\n });\n\n // Add scroll actions for arrow clicks\n ctx.setAction(\"scrollUp\", () => {\n const { scrollOffset: currentScrollOffset, maxHeight: currentMaxHeight, totalItems } = scrollStateRef.current;\n const currentMaxScrollOffset = Math.max(0, totalItems - currentMaxHeight);\n const newScrollOffset = Math.max(0, currentScrollOffset - 1);\n setScrollOffset(newScrollOffset);\n forceUpdate({});\n });\n\n ctx.setAction(\"scrollDown\", () => {\n const { scrollOffset: currentScrollOffset, maxHeight: currentMaxHeight, totalItems } = scrollStateRef.current;\n const currentMaxScrollOffset = Math.max(0, totalItems - currentMaxHeight);\n const newScrollOffset = Math.min(currentMaxScrollOffset, currentScrollOffset + 1);\n setScrollOffset(newScrollOffset);\n forceUpdate({});\n });\n\n // Set up sort action if sortable\n if (sortable) {\n ctx.setAction(\"toggleSort\", () => {\n const nextSort: \"none\" | \"asc\" | \"desc\" = \n sortOrder === \"none\" ? \"asc\" : \n sortOrder === \"asc\" ? \"desc\" : \"none\";\n \n // Store the currently selected item from the current display items\n const currentSelectedItem = displayItems[selectedIndexRef.current];\n \n setSortOrder(nextSort);\n \n // Calculate the new sorted items\n const newSortedItems = nextSort !== \"none\" ? [...items].sort((a, b) => {\n const titleA = titleGetter(a).toLowerCase();\n const titleB = titleGetter(b).toLowerCase();\n if (nextSort === \"asc\") {\n return titleA < titleB ? -1 : titleA > titleB ? 1 : 0;\n } else {\n return titleA > titleB ? -1 : titleA < titleB ? 1 : 0;\n }\n }) : items;\n \n // Find the new index of the selected item in the new sorted list\n const newIndex = newSortedItems.findIndex(item => item === currentSelectedItem);\n if (newIndex !== -1) {\n selectedIndexRef.current = newIndex;\n // Set scroll position to show the selected item at the top\n setScrollOffset(newIndex);\n } else {\n // Fallback: if item not found, select first item\n selectedIndexRef.current = 0;\n setScrollOffset(0);\n }\n \n forceUpdate({});\n });\n\n // Default highlight style (green background, black text, bold)\n const defaultHighlightStyle = {\n color: \"black\",\n backgroundColor: \"green\", \n bold: true\n };\n const highlightStyle = { ...defaultHighlightStyle, ...sortHighlightStyle };\n\n // Create caption that includes sort status\n const sortCaption = () => {\n if (sortOrder === \"none\") {\n return h(Text, {}, \"s to toggle sort\");\n } else {\n const sortLabel = sortOrder === \"asc\" ? \"ASC\" : \"DESC\";\n return h(Text, {}, \n \"s to toggle \",\n h(Text, { color: \"white\", bold: true }, \"sort\"),\n \" \",\n h(Text, highlightStyle, ` ${sortLabel} `)\n );\n }\n };\n\n // Update key bindings with sort\n ctx.setKeyBinding([\n { key: \"upArrow\", caption: \"navigate\", action: \"moveUp\", order: 0 },\n { key: \"downArrow\", caption: \"navigate\", action: \"moveDown\", order: 0 },\n { \n key: \"s\", \n caption: sortCaption,\n action: \"toggleSort\", \n order: 5 \n }\n ]);\n\n // Force update to show the new caption in footer\n ctx.update();\n } else {\n // No sorting\n ctx.setKeyBinding([\n { key: \"upArrow\", caption: \"navigate\", action: \"moveUp\", order: 0 },\n { key: \"downArrow\", caption: \"navigate\", action: \"moveDown\", order: 0 }\n ]);\n }\n }, [sortOrder, sortable]);\n\n const selectedIndex = selectedIndexRef.current;\n \n\n // Default renderer with static scroll indicators for debugging\n const defaultRenderItem = (item: ListItem, isSelected: boolean, displayIndex: number, actualIndex: number) => {\n const isFirstVisible = displayIndex === 0;\n const isLastVisible = displayIndex === visibleItems.length - 1;\n \n // Build prefix with arrows and selection marker\n let arrowPrefix = \"\";\n let selectionPrefix = \"\";\n \n // Only show arrows when scrolling is actually needed and available\n if (isFirstVisible && canScrollUp) {\n arrowPrefix = \"↑ \";\n } else if (isLastVisible && canScrollDown) {\n arrowPrefix = \"↓ \";\n } else {\n // No arrow, but reserve the same space\n arrowPrefix = \" \";\n }\n \n // Always reserve space for selection marker (pad with spaces if not selected)\n if (isSelected) {\n selectionPrefix = selectionMarker;\n } else {\n // Pad with spaces to match the length of the selection marker\n selectionPrefix = \" \".repeat(selectionMarker.length);\n }\n \n return h(Box, { flexDirection: \"row\" },\n // Arrow (clickable if functional, not highlighted)\n h(Text, { \n key: `arrow-${actualIndex}`,\n color: \"white\"\n }, arrowPrefix),\n // Selection marker space (always same width, not highlighted) \n h(Text, { key: `marker-${actualIndex}`, color: \"white\" }, selectionPrefix),\n // Item name (highlighted if selected)\n h(Text, {\n key: `name-${actualIndex}`,\n color: isSelected ? \"black\" : \"white\",\n backgroundColor: isSelected ? \"cyan\" : undefined,\n bold: isSelected\n }, item.name)\n );\n };\n\n // Use custom renderer if provided, otherwise use default\n const itemRenderer = renderItem || defaultRenderItem;\n\n // Render visible menu items with scroll indicators\n return h(Box, { flexDirection: \"column\" },\n ...visibleItems.map((item, displayIndex) => {\n const actualIndex = clampedScrollOffset + displayIndex;\n const isSelected = actualIndex === selectedIndex;\n \n // If using custom renderer, wrap it with scroll indicators\n if (renderItem) {\n const isFirstVisible = displayIndex === 0;\n const isLastVisible = displayIndex === visibleItems.length - 1;\n \n // Build prefix with arrows and selection marker\n let arrowPrefix = \"\";\n let selectionPrefix = \"\";\n \n // Only show arrows when scrolling is actually needed and available\n if (isFirstVisible && canScrollUp) {\n arrowPrefix = \"↑ \";\n } else if (isLastVisible && canScrollDown) {\n arrowPrefix = \"↓ \";\n } else {\n // No arrow, but reserve the same space\n arrowPrefix = \" \";\n }\n \n // Always reserve space for selection marker (pad with spaces if not selected)\n if (isSelected) {\n selectionPrefix = selectionMarker;\n } else {\n // Pad with spaces to match the length of the selection marker\n selectionPrefix = \" \".repeat(selectionMarker.length);\n }\n \n return h(ScreenRow, {\n key: `item-${actualIndex}`,\n children: h(Box, { flexDirection: \"row\" },\n // Arrow (clickable if functional, not highlighted)\n h(Text, { \n key: `arrow-${actualIndex}`,\n color: \"white\"\n }, arrowPrefix),\n // Selection marker space (always same width, not highlighted) \n h(Text, { key: `marker-${actualIndex}`, color: \"white\" }, selectionPrefix),\n // Custom rendered content\n renderItem(item, isSelected, displayIndex)\n )\n });\n } else {\n // Use default renderer (which already includes scroll indicators)\n return h(ScreenRow, {\n key: `item-${actualIndex}`,\n children: itemRenderer(item, isSelected, displayIndex, actualIndex)\n });\n }\n })\n );\n}\n","/**\n * Screen System - Action-based architecture\n */\n\nimport React, { useState, useRef, useEffect, createElement as h } from \"react\";\nimport { render, useInput, Box, Text } from \"ink\";\nimport { ScreenContainer, ScreenRow, ScreenTitle, ScreenDivider, ScreenFooter } from \"./components.js\";\nimport { MultiColumnListComponent, MultiColumnListWithPreviewComponent, ListComponent } from \"./list-components.js\";\n\n// Types\ninterface KeyBinding {\n key: string;\n caption: string | (() => string | JSX.Element);\n action: string;\n order?: number;\n protected?: boolean;\n enabled?: boolean;\n condition?: (ctx: ScreenContext) => boolean;\n}\n\ninterface BindingGroup {\n keys: string[];\n caption: string;\n order: number;\n}\n\ninterface ActionPayload {\n input: string;\n key: any;\n binding: KeyBinding;\n}\n\ninterface ScreenContext {\n setAction: (actionName: string, handlerFn: (payload?: ActionPayload) => void | any) => void;\n setKeyBinding: (bindingOrBindings: KeyBinding | KeyBinding[]) => void;\n updateKeyBinding: (keyName: string, updates: Partial<KeyBinding>) => void;\n removeKeyBinding: (keyName: string) => void;\n addFooter: (item: string | JSX.Element) => void;\n clearFooter: () => void;\n setFooter: (items: string | string[] | JSX.Element | JSX.Element[]) => void;\n update: () => void;\n goBack: () => void;\n close: (result: any) => void;\n parentData: any;\n}\n\ninterface ShowScreenConfig {\n title: string;\n onRender: (ctx: ScreenContext) => JSX.Element;\n parentData?: any;\n}\n\ninterface ShowListScreenConfig {\n title: string;\n items: Array<{ name: string; value: any }>;\n onSelect?: (value: any, index: number) => any;\n onEscape?: (index: number) => any;\n parentData?: any;\n initialSelectedIndex?: number;\n renderItem?: (item: { name: string; value: any }, isSelected: boolean, displayIndex: number) => JSX.Element;\n getTitle?: (item: { name: string; value: any }) => string;\n sortable?: boolean;\n maxHeight?: number;\n sortHighlightStyle?: {\n color?: string;\n backgroundColor?: string;\n bold?: boolean;\n };\n selectionMarker?: string; // Customizable selection marker, default: \" \"\n}\n\ninterface ShowMultiColumnListScreenConfig {\n title: string;\n items: string[];\n onSelect?: (item: string, index: number) => any;\n onEscape?: (index: number) => any;\n parentData?: any;\n initialSelectedIndex?: number;\n}\n\ninterface ShowMultiColumnListWithPreviewScreenConfig {\n title: string;\n items: string[];\n getPreviewContent?: (item: string) => string | JSX.Element | Record<string, any>;\n onSelect?: (item: string, index: number) => any;\n onEscape?: (index: number) => any;\n parentData?: any;\n initialSelectedIndex?: number;\n}\n\n/**\n * Group key bindings by caption for footer display\n */\nexport function groupKeyBindings(bindings: KeyBinding[]): BindingGroup[] {\n const groups: Record<string, BindingGroup> = {};\n\n // Filter out disabled bindings\n const enabledBindings = bindings.filter(b => b.enabled !== false);\n\n enabledBindings.forEach(binding => {\n const caption = typeof binding.caption === \"string\" ? binding.caption : \"\";\n if (!groups[caption]) {\n groups[caption] = {\n keys: [],\n caption: caption,\n order: binding.order || 999\n };\n }\n groups[caption].keys.push(binding.key);\n });\n\n return Object.values(groups);\n}\n\n/**\n * Format key bindings for footer (returns array of strings/components)\n */\nexport function formatKeyBindings(bindings: KeyBinding[], mode: string = \"long\"): (string | JSX.Element)[] {\n // Resolve function captions\n const resolvedBindings = bindings.map(binding => {\n let resolvedCaption = binding.caption;\n\n // If caption is a function, call it\n if (typeof binding.caption === \"function\") {\n resolvedCaption = binding.caption();\n }\n\n return {\n ...binding,\n resolvedCaption\n };\n });\n\n const groups = groupKeyBindings(resolvedBindings.map(b => ({\n ...b,\n caption: typeof b.resolvedCaption === \"string\" ? b.resolvedCaption : \"\"\n })));\n\n // Sort by order\n groups.sort((a, b) => a.order - b.order);\n\n const items: (string | JSX.Element)[] = [];\n\n groups.forEach(group => {\n // Check if any binding in this group has a component/custom caption\n const bindingWithCustom = resolvedBindings.find(b =>\n group.keys.includes(b.key) && typeof b.resolvedCaption !== \"string\"\n );\n\n if (bindingWithCustom && bindingWithCustom.resolvedCaption) {\n // Use the full custom display (component or complex structure)\n items.push(bindingWithCustom.resolvedCaption as JSX.Element);\n } else {\n // Standard format with string caption\n const keyStr = formatKeys(group.keys);\n\n if (mode === \"long\") {\n items.push(`${keyStr} to ${group.caption}`);\n } else {\n items.push(keyStr);\n }\n }\n });\n\n return items;\n}\n\n/**\n * Format keys for display\n */\nexport function formatKeys(keys: string[]): string {\n const keyMap: Record<string, string> = {\n \"escape\": \"esc\",\n \"leftArrow\": \"←\",\n \"rightArrow\": \"→\",\n \"upArrow\": \"↑\",\n \"downArrow\": \"↓\",\n \"return\": \"enter\"\n };\n\n return keys.map(k => keyMap[k] || k).join(\"/\");\n}\n\n/**\n * Show screen with action-based architecture\n */\nexport async function showScreen(config: ShowScreenConfig): Promise<any> {\n const {\n title,\n onRender,\n parentData = {}\n } = config;\n\n\n return new Promise((resolve) => {\n let instance: any;\n\n // Persistent collections (closure variables survive re-renders)\n const keyBindings: KeyBinding[] = [];\n const actions: Record<string, (payload?: ActionPayload) => void | any> = {};\n const customFooterItems: (string | JSX.Element)[] = [];\n let renderResult: JSX.Element | null = null;\n let initialized = false;\n\n const Screen = (): JSX.Element => {\n const [updateCounter, setUpdateCounter] = useState(0);\n\n // Initialize defaults only once\n if (!initialized) {\n const defaultBindings: KeyBinding[] = [\n { key: \"escape\", caption: \"go back\", action: \"back\", protected: true, order: 1 },\n { key: \"leftArrow\", caption: \"go back\", action: \"back\", protected: false, order: 1 }\n // Note: 'select' is not a default - components add it if needed\n ];\n\n // Add defaults\n defaultBindings.forEach(binding => {\n keyBindings.push(binding);\n });\n\n // Default actions\n actions.back = () => {\n cleanup(null);\n };\n\n initialized = true;\n }\n\n // Context for onRender\n const context: ScreenContext = {\n setAction: (actionName: string, handlerFn: (payload?: ActionPayload) => void | any) => {\n actions[actionName] = handlerFn;\n },\n\n setKeyBinding: (bindingOrBindings: KeyBinding | KeyBinding[]) => {\n // Support both single object and array\n const bindingsToSet = Array.isArray(bindingOrBindings) ? bindingOrBindings : [bindingOrBindings];\n\n bindingsToSet.forEach(binding => {\n // Check if key already exists\n const existingIndex = keyBindings.findIndex(b => b.key === binding.key);\n\n if (existingIndex >= 0) {\n const existing = keyBindings[existingIndex];\n\n // Can't override protected keys\n if (existing.protected) {\n console.warn(`Cannot override protected key: ${binding.key}`);\n return;\n }\n\n // Replace binding (keep original order if not specified)\n keyBindings[existingIndex] = {\n ...existing,\n ...binding,\n order: binding.order !== undefined ? binding.order : existing.order,\n enabled: binding.enabled !== undefined ? binding.enabled : (existing.enabled !== undefined ? existing.enabled : true)\n };\n } else {\n // Add new binding\n keyBindings.push({\n protected: false,\n order: 999,\n enabled: true,\n ...binding\n });\n }\n });\n },\n\n updateKeyBinding: (keyName: string, updates: Partial<KeyBinding>) => {\n const index = keyBindings.findIndex(b => b.key === keyName);\n if (index >= 0) {\n // Update only specified properties\n keyBindings[index] = {\n ...keyBindings[index],\n ...updates\n };\n }\n },\n\n removeKeyBinding: (keyName: string) => {\n const index = keyBindings.findIndex(b => b.key === keyName);\n if (index >= 0) {\n if (keyBindings[index].protected) {\n console.warn(`Cannot remove protected key: ${keyName}`);\n return;\n }\n keyBindings.splice(index, 1);\n }\n },\n\n addFooter: (item: string | JSX.Element) => {\n customFooterItems.push(item);\n },\n\n clearFooter: () => {\n customFooterItems.length = 0;\n },\n\n setFooter: (items: string | string[] | JSX.Element | JSX.Element[]) => {\n customFooterItems.length = 0;\n const itemsArray = Array.isArray(items) ? items : [items];\n customFooterItems.push(...itemsArray);\n },\n\n update: () => {\n setUpdateCounter(c => c + 1);\n },\n\n goBack: () => {\n if (actions.back) {\n actions.back();\n }\n },\n\n close: (result: any) => {\n cleanup(result);\n },\n\n parentData\n };\n\n // Call onRender once to let component set up\n if (!renderResult) {\n renderResult = onRender(context);\n }\n\n // Handle input - dispatch to actions\n useInput((input: string, key: any) => {\n // Check Ctrl+C for exit\n if (key.ctrl && input === \"c\") {\n cleanup(null);\n process.exit(0);\n return;\n }\n\n // Find matching key binding\n let matchedBinding: KeyBinding | null = null;\n\n for (const binding of keyBindings) {\n let keyMatches = false;\n\n // Check key match\n if (key[binding.key]) {\n keyMatches = true;\n } else if (input === binding.key) {\n keyMatches = true;\n }\n\n if (keyMatches) {\n // Check if binding is enabled\n if (binding.enabled === false) {\n continue;\n }\n\n // Check condition if present\n if (binding.condition && !binding.condition(context)) {\n continue;\n }\n\n matchedBinding = binding;\n break;\n }\n }\n\n if (matchedBinding && actions[matchedBinding.action]) {\n // Execute action\n const actionResult = actions[matchedBinding.action]({\n input,\n key,\n binding: matchedBinding\n });\n\n // If action returns a value, might be used for something\n // For now, actions manage their own state via closures\n }\n });\n\n // Build footer\n const footerLines: (string | JSX.Element | (string | JSX.Element)[])[] = [];\n\n // Add key bindings (returns array of strings/components)\n const bindingItems = formatKeyBindings(keyBindings, \"long\");\n\n if (bindingItems.length > 0) {\n // Build a single line with all binding items separated by \", \"\n const bindingsLine: (string | JSX.Element)[] = [];\n bindingItems.forEach((item, idx) => {\n if (idx > 0) {\n bindingsLine.push(\", \");\n }\n bindingsLine.push(item);\n });\n\n // If all items are strings, join them; otherwise create a Box\n const allStrings = bindingItems.every(item => typeof item === \"string\");\n if (allStrings) {\n footerLines.push(bindingsLine.join(\"\"));\n } else {\n // Mixed strings and components - wrap all strings in Text components\n const wrappedBindingsLine = bindingsLine.map(item => \n typeof item === \"string\" ? h(Text, {}, item) : item\n );\n footerLines.push(wrappedBindingsLine);\n }\n }\n\n // Add custom footer items\n customFooterItems.forEach(item => {\n if (typeof item === \"string\") {\n footerLines.push(item);\n } else {\n footerLines.push(item);\n }\n });\n\n return h(ScreenContainer, {},\n h(ScreenTitle, { text: title }),\n h(ScreenDivider),\n h(ScreenRow, {}, h(Text, {}, \" \")),\n renderResult,\n h(ScreenRow, {}, h(Text, {}, \" \")),\n h(ScreenDivider),\n h(ScreenFooter, { lines: footerLines })\n );\n };\n\n const cleanup = (result: any) => {\n if (instance) instance.unmount();\n setTimeout(() => resolve(result), 50);\n };\n\n instance = render(h(Screen));\n });\n}\n\n/**\n * Helper: Show list screen (single column menu)\n */\nexport async function showListScreen(config: ShowListScreenConfig): Promise<any> {\n const { title, items, onSelect, onEscape, parentData, initialSelectedIndex = 0, renderItem, getTitle, sortable, maxHeight, sortHighlightStyle, selectionMarker } = config;\n\n return showScreen({\n title,\n parentData,\n onRender: (ctx) => {\n // Shared state ref\n const selectedIndexRef = { current: initialSelectedIndex };\n\n // Set up select action at screen level\n ctx.setAction(\"select\", () => {\n const selected = items[selectedIndexRef.current];\n if (onSelect) {\n const result = onSelect(selected.value, selectedIndexRef.current);\n ctx.close(result);\n }\n });\n\n // Set up back action if provided\n if (onEscape) {\n ctx.setAction(\"back\", () => {\n const result = onEscape(selectedIndexRef.current);\n ctx.close(result);\n });\n }\n\n // Add select key binding\n ctx.setKeyBinding({ key: \"return\", caption: \"select\", action: \"select\", order: 2 });\n\n // Return the component (it will set up its own navigation actions and bindings)\n return h(ListComponent, { items, ctx, selectedIndexRef, renderItem, getTitle, sortable, maxHeight, sortHighlightStyle, selectionMarker });\n }\n });\n}\n\n/**\n * Helper: Show multi-column list screen (grid layout)\n */\nexport async function showMultiColumnListScreen(config: ShowMultiColumnListScreenConfig): Promise<any> {\n const { title, items, onSelect, onEscape, parentData, initialSelectedIndex = 0 } = config;\n\n return showScreen({\n title,\n parentData,\n onRender: (ctx) => {\n // Shared state ref\n const selectedIndexRef = { current: initialSelectedIndex };\n\n // Set up select action at screen level\n ctx.setAction(\"select\", () => {\n const selected = items[selectedIndexRef.current];\n if (onSelect) {\n const result = onSelect(selected, selectedIndexRef.current);\n ctx.close(result);\n }\n });\n\n // Set up back action if provided\n if (onEscape) {\n ctx.setAction(\"back\", () => {\n const result = onEscape(selectedIndexRef.current);\n ctx.close(result);\n });\n }\n\n // Add select key binding\n ctx.setKeyBinding({ key: \"return\", caption: \"select\", action: \"select\", order: 2 });\n\n // Return the component (it will set up its own navigation actions and bindings)\n return h(MultiColumnListComponent, { items, ctx, selectedIndexRef });\n }\n });\n}\n\n/**\n * Helper: Show multi-column list with preview panel below\n */\nexport async function showMultiColumnListWithPreviewScreen(config: ShowMultiColumnListWithPreviewScreenConfig): Promise<any> {\n const { title, items, getPreviewContent, onSelect, onEscape, parentData, initialSelectedIndex = 0 } = config;\n\n return showScreen({\n title,\n parentData,\n onRender: (ctx) => {\n // Shared state ref\n const selectedIndexRef = { current: initialSelectedIndex };\n\n // Set up select action at screen level\n ctx.setAction(\"select\", () => {\n const selected = items[selectedIndexRef.current];\n if (onSelect) {\n const result = onSelect(selected, selectedIndexRef.current);\n ctx.close(result);\n }\n });\n\n // Set up back action if provided\n if (onEscape) {\n ctx.setAction(\"back\", () => {\n const result = onEscape(selectedIndexRef.current);\n ctx.close(result);\n });\n }\n\n // Add select key binding\n ctx.setKeyBinding({ key: \"return\", caption: \"select\", action: \"select\", order: 2 });\n\n // Return the component (it will set up its own navigation actions and bindings)\n return h(MultiColumnListWithPreviewComponent, { items, getPreviewContent, ctx, selectedIndexRef });\n }\n });\n}\n\n// Backward compatibility aliases\nexport const showMenuScreen = showListScreen;\nexport const showWordGridScreen = showMultiColumnListScreen;\n","/**\n * Reusable UI elements for the screen system\n */\n\nimport React, { createElement as h } from \"react\";\nimport { Box, Text } from \"ink\";\n\n// Types\nexport interface ListItemProps {\n children: React.ReactNode;\n isSelected?: boolean;\n color?: string;\n backgroundColor?: string;\n bold?: boolean;\n dimColor?: boolean;\n}\n\nexport interface TextBlockProps {\n text: string;\n color?: string;\n dimmed?: boolean;\n bold?: boolean;\n maxWidth?: number;\n}\n\nexport interface DividerProps {\n character?: string;\n width?: number;\n}\n\nexport interface GridCellProps {\n children: React.ReactNode;\n width?: number;\n color?: string;\n backgroundColor?: string;\n bold?: boolean;\n dimColor?: boolean;\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport interface InputFieldProps {\n prompt: string;\n value: string;\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n}\n\n/**\n * List item component\n */\nexport function ListItem({ \n children, \n isSelected = false, \n color = \"white\", \n backgroundColor, \n bold = false, \n dimColor = false \n}: ListItemProps): JSX.Element {\n return h(Box, {},\n h(Text, {\n color: isSelected ? backgroundColor || \"green\" : color,\n backgroundColor: isSelected ? color : backgroundColor,\n bold: isSelected || bold,\n dimColor: !isSelected && dimColor\n }, children)\n );\n}\n\n/**\n * Text block component with customizable styling\n */\nexport function TextBlock({ \n text, \n color = \"white\", \n dimmed = false, \n bold = false, \n maxWidth \n}: TextBlockProps): JSX.Element {\n return h(Box, {},\n h(Text, { \n color, \n dimColor: dimmed, \n bold \n }, text)\n );\n}\n\n/**\n * Horizontal divider\n */\nexport function Divider({ character = \"─\", width = 80 }: DividerProps): JSX.Element {\n return h(Box, { marginY: 1 },\n h(Text, { dimColor: true }, character.repeat(width))\n );\n}\n\n/**\n * Grid cell component\n */\nexport function GridCell({ \n children, \n width, \n color = \"white\", \n backgroundColor, \n bold = false, \n dimColor = false, \n align = \"left\" \n}: GridCellProps): JSX.Element {\n return h(Box, { width },\n h(Text, {\n color,\n backgroundColor,\n bold,\n dimColor,\n textAlign: align\n }, children)\n );\n}\n\n/**\n * Input field component\n */\nexport function InputField({ prompt, value, onChange, onSubmit }: InputFieldProps): JSX.Element {\n return h(Box, { flexDirection: \"column\" },\n h(Text, {}, prompt),\n h(Box, { marginTop: 1 },\n h(Text, { color: \"cyan\" }, \" > \", value, \"_\")\n )\n );\n}","/**\n * Utility functions for Screen System\n */\n\n/**\n * Build breadcrumb-style title\n * @param parts - Parts of the breadcrumb path\n * @returns Formatted breadcrumb\n *\n * Examples:\n * buildBreadcrumb(['Menu']) → 'Menu'\n * buildBreadcrumb(['Menu', 'Info']) → '← Info'\n * buildBreadcrumb(['Menu', 'Words', 'nefarious']) → '← Words ← nefarious'\n */\nexport function buildBreadcrumb(parts: string[]): string {\n if (parts.length === 0) return \"\";\n if (parts.length === 1) return parts[0];\n\n // Skip first part (root), add arrows with spaces to rest\n return parts.slice(1).map(part => `← ${part}`).join(\" \");\n}\n\n/**\n * Create multi-line breadcrumb with details\n * @param path - Navigation path\n * @param suffix - Additional suffix (e.g., 'Details')\n * @returns Formatted breadcrumb with suffix\n *\n * Example:\n * buildDetailBreadcrumb(['Menu', 'Words', 'nefarious'], 'Details')\n * → '← Words ← nefarious Details'\n */\nexport function buildDetailBreadcrumb(path: string[], suffix: string = \"\"): string {\n if (path.length <= 1) {\n return suffix ? `← ${suffix}` : path[0] || \"\";\n }\n\n const breadcrumb = buildBreadcrumb(path);\n return suffix ? `${breadcrumb} ${suffix}` : breadcrumb;\n}\n","/**\n * Footer builder - composes footer messages from multiple sources\n */\n\ninterface FooterConfig {\n navigation?: string | string[];\n actions?: string | string[];\n info?: string | string[];\n escape?: string | string[];\n custom?: string | string[];\n}\n\n/**\n * Build footer lines from multiple message sources\n *\n * @param config - Footer configuration object\n * @returns Array of footer lines\n */\nexport function buildFooter(config: FooterConfig = {}): string[] {\n const {\n navigation = null,\n actions = null,\n info = null,\n escape = \"Esc to go back\",\n custom = null\n } = config;\n\n const lines: string[] = [];\n\n // Build main help line (navigation + actions + escape)\n const mainParts: (string | string[])[] = [];\n\n if (navigation) {\n mainParts.push(navigation);\n }\n\n if (actions) {\n mainParts.push(actions);\n }\n\n if (escape) {\n mainParts.push(escape);\n }\n\n if (mainParts.length > 0) {\n lines.push(mainParts.join(\", \"));\n }\n\n // Add info line if present\n if (info) {\n const infoLines = Array.isArray(info) ? info : [info];\n lines.push(...infoLines);\n }\n\n // Add custom lines if present\n if (custom) {\n const customLines = Array.isArray(custom) ? custom : [custom];\n lines.push(...customLines);\n }\n\n return lines;\n}\n\n/**\n * Predefined footer configurations for common screen types\n */\nexport const FooterPresets = {\n /**\n * Menu screen footer\n */\n menu: (customInfo: string | string[] | null = null): string[] => buildFooter({\n navigation: \"↑/↓ to navigate\",\n actions: \"Enter to select\",\n escape: \"Esc to go back\",\n info: customInfo\n }),\n\n /**\n * Word grid footer\n */\n wordGrid: (totalWords: number): string[] => buildFooter({\n navigation: \"↑↓←→ to navigate\",\n actions: \"Enter to select\",\n escape: \"Esc to go back\",\n info: `Total: ${totalWords} words`\n }),\n\n /**\n * Text input footer\n */\n textInput: (): string[] => buildFooter({\n actions: \"Type and press Enter to submit\",\n escape: \"Esc to cancel\"\n }),\n\n /**\n * Info/static screen footer\n */\n info: (): string[] => buildFooter({\n escape: \"Esc to continue\"\n }),\n\n /**\n * Main menu footer (escape exits)\n */\n mainMenu: (): string[] => buildFooter({\n navigation: \"↑/↓ to navigate\",\n actions: \"Enter to select\",\n escape: \"Esc to exit\"\n }),\n\n /**\n * Action menu footer (for word cards, etc.)\n */\n actionMenu: (hasAudio: boolean = false): string[] => {\n const parts = buildFooter({\n navigation: \"↑/↓ to navigate\",\n actions: \"Enter to select\",\n escape: \"Esc to go back\"\n });\n\n if (hasAudio) {\n parts.push(\"Audio available\");\n }\n\n return parts;\n }\n};\n\n/**\n * Combine multiple footer messages into organized lines\n * Smart grouping of related messages\n *\n * @param messages - Individual footer messages\n * @returns Organized footer lines\n */\nexport function organizeFooterMessages(messages: string[] | null | undefined): string[] {\n if (!messages || messages.length === 0) {\n return [\"Esc to go back\"];\n }\n\n // Group similar messages\n const navigation = messages.filter(m => m.includes(\"↑\") || m.includes(\"↓\") || m.includes(\"←\") || m.includes(\"→\"));\n const actions = messages.filter(m => m.includes(\"Enter\") || m.includes(\"select\") || m.includes(\"submit\"));\n const escape = messages.filter(m => m.includes(\"Esc\"));\n const others = messages.filter(m =>\n !navigation.includes(m) &&\n !actions.includes(m) &&\n !escape.includes(m)\n );\n\n const lines: string[] = [];\n\n // Combine navigation, actions, and escape on one line\n const mainLine = [...navigation, ...actions, ...escape].join(\", \");\n if (mainLine) lines.push(mainLine);\n\n // Add other messages as separate lines\n lines.push(...others);\n\n return lines;\n}\n","/**\n * Screen System - Action-based architecture\n * Converted from legacy/screenSystem/src\n */\n\n// Re-export React and React hooks (encapsulated)\nimport React, { useState, useEffect, useRef, useMemo, useCallback, createElement } from \"react\";\nexport { React, useState, useEffect, useRef, useMemo, useCallback };\nexport { createElement as h };\n\n// Re-export Ink components (encapsulated)\nexport { Box, Text, useInput } from \"ink\";\n\n// Screen functions\nexport {\n showScreen,\n showListScreen,\n showMultiColumnListScreen,\n showMultiColumnListWithPreviewScreen,\n // Backward compatibility aliases\n showMenuScreen,\n showWordGridScreen\n} from \"./screens.js\";\n\n// Reusable components\nexport { MultiColumnListComponent, MultiColumnListWithPreviewComponent, ListComponent } from \"./list-components.js\";\nexport { ScreenContainer, ScreenRow, ScreenTitle, ScreenBody, ScreenFooter, ScreenDivider } from \"./components.js\";\nexport { ListItem, TextBlock, Divider, GridCell, InputField } from \"./ui-elements.js\";\n\n// Utilities\nexport { buildBreadcrumb, buildDetailBreadcrumb } from \"./utils.js\";\nexport { buildFooter, FooterPresets, organizeFooterMessages } from \"./footer-builder.js\";\n\n// For CommonJS compatibility: pre-load ESM dependencies\nlet loadPromise: Promise<void> | null = null;\nexport async function load(): Promise<void> {\n if (loadPromise) return loadPromise;\n loadPromise = Promise.all([\n import(\"react\"),\n import(\"ink\")\n ]).then(() => {}) as Promise<void>;\n return loadPromise;\n}\n// Auto-load in ESM, but CJS users should call load() explicitly\nif (typeof window === 'undefined') {\n load().catch(() => {\n // Ignore errors during auto-load, user can call load() explicitly\n });\n}\n","/**\n * Init module exports\n */\nexport * from \"./init/index.js\";\nexport * from \"./init/types.js\";\n\n","// Arguments discovery and parsing module\n// This module provides utilities for parsing CLI arguments and detecting flags\n\nimport { readFileSync, existsSync } from \"fs\";\nimport { resolve, dirname, basename, extname, join, isAbsolute } from \"path\";\nimport { config } from \"dotenv\";\n\nexport interface ArgsConfig {\n args?: string[]; // Default: process.argv.slice(2)\n aliases?: Record<string, string>; // Short → long mapping\n overrides?: Record<string, any>; // Highest precedence\n defaults?: Record<string, any>; // Lowest precedence\n prefixes?: string[]; // Negative flag prefixes (default: [\"not\", \"no\"])\n}\n\nexport interface ParsedArgs {\n command: string;\n flags: Record<string, boolean>;\n options: Record<string, string>;\n usedKeys: string[];\n}\n\n/**\n * Parse command line arguments with support for aliases, overrides, and defaults\n *\n * Precedence order (highest to lowest):\n * 1. Overrides (constructor config)\n * 2. CLI args (command line)\n * 3. Config files (loaded from files)\n * 4. Environment variables (process.env)\n * 5. Defaults (constructor config)\n */\nexport class Args {\n private args: Record<string, any> = {};\n private flags: Record<string, boolean> = {};\n private options: Record<string, string> = {};\n private commands: string[] = [];\n private usedKeys: Set<string> = new Set();\n private aliases: Record<string, string> = {};\n private overrides: Record<string, any> = {};\n private defaults: Record<string, any> = {};\n private prefixes: string[] = [];\n private nots: string[] = [];\n private configValues: Record<string, any> = {};\n private configsLoaded: string[] = [];\n private env: string = \"local\";\n\n constructor(config: ArgsConfig = {}) {\n // Set up configuration\n this.aliases = config.aliases || {};\n this.overrides = config.overrides || {};\n this.defaults = config.defaults || {};\n this.prefixes = config.prefixes || [\"not\", \"no\"];\n\n // Parse arguments first to get environment\n const args = config.args || process.argv.slice(2);\n this.parseArgs(args);\n\n // Set environment from parsed args\n this.env = this.get(\"env\")?.toLowerCase() || \"local\";\n\n // Load .env file\n this.loadDotEnv();\n\n // Load configuration files\n this.loadConfigFiles();\n\n // Check for conflicts (short + long form of same option)\n this.checkConflicts();\n }\n\n /**\n * Parse command line arguments\n */\n private parseArgs(args: string[]): void {\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n\n if (arg.startsWith(\"--\")) {\n // Long option: --key=value or --key\n const [key, value] = this.parseLongOption(arg);\n this.setValue(key, value);\n i++;\n } else if (arg.startsWith(\"-\")) {\n // Short option: -k=value, -k, or bundled -vsd\n const result = this.parseShortOption(arg, args, i);\n if (result.consumed > 0) {\n i += result.consumed;\n } else {\n i++;\n }\n } else {\n // Command (no prefix)\n this.commands.push(arg);\n i++;\n }\n }\n }\n\n /**\n * Parse long option (--key=value or --key)\n */\n private parseLongOption(arg: string): [string, string | boolean] {\n const key = arg.slice(2); // Remove '--'\n\n // Check for negative flags (--no-debug, --not-verbose)\n const prefix = this.prefixes.find((p) => key.startsWith(p));\n if (prefix) {\n let strippedKey = key.slice(prefix.length);\n // Remove leading dash if present\n if (strippedKey.startsWith(\"-\")) {\n strippedKey = strippedKey.slice(1);\n }\n this.nots.push(key);\n return [strippedKey, false];\n }\n\n if (key.includes(\"=\")) {\n // --key=value - need to handle quoted values properly\n const eqIndex = key.indexOf(\"=\");\n const optionKey = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n return [optionKey, this.parseValue(value)];\n } else {\n // --key (boolean flag)\n return [key, true];\n }\n }\n\n /**\n * Parse short option (-k=value, -k, or bundled -vsd)\n */\n private parseShortOption(arg: string, args: string[], index: number): { consumed: number } {\n const key = arg.slice(1); // Remove '-'\n\n // Check if it's a single short flag with value (like -vo file.txt)\n if (key.length === 1 && index + 1 < args.length && !args[index + 1].startsWith(\"-\")) {\n // Single short flag with separate value\n const value = args[index + 1];\n this.setValue(key, this.parseValue(value));\n return { consumed: 2 }; // Consumed this flag and the next argument\n }\n\n // Check if it's a bundled short flags (like -vsd)\n if (key.length > 1 && !key.includes(\"=\")) {\n // Handle bundled flags: -vsd = -v -s -d\n // Process each character, valid ones become flags, invalid ones become unused\n for (let i = 0; i < key.length; i++) {\n const shortKey = key[i];\n if (shortKey in this.aliases) {\n this.setValue(shortKey, true);\n } else {\n // Invalid short flag - add to unused keys\n this.args[shortKey] = true;\n }\n }\n return { consumed: 1 };\n }\n\n if (key.includes(\"=\")) {\n // -k=value or -vsdk=4 - need to handle quoted values properly\n const eqIndex = key.indexOf(\"=\");\n const optionKey = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n\n // Check if this is a bundled flag with value on the last one (like -vsdk=4)\n if (optionKey.length > 1) {\n // Handle bundled flags with value on the last one: -vsdk=4 = -v -s -d -k=4\n for (let i = 0; i < optionKey.length - 1; i++) {\n const shortKey = optionKey[i];\n if (shortKey in this.aliases) {\n this.setValue(shortKey, true);\n } else {\n this.args[shortKey] = true;\n }\n }\n // Handle the last flag with value\n const lastKey = optionKey[optionKey.length - 1];\n if (lastKey in this.aliases) {\n this.setValue(lastKey, this.parseValue(value));\n } else {\n this.args[lastKey] = this.parseValue(value);\n }\n } else {\n // Single flag with value: -k=value\n this.setValue(optionKey, this.parseValue(value));\n }\n return { consumed: 1 };\n } else {\n // -k (boolean flag)\n this.setValue(key, true);\n return { consumed: 1 };\n }\n }\n\n /**\n * Parse value (handle quotes)\n */\n private parseValue(value: string): string {\n // Remove surrounding quotes if present\n if (\n (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n }\n\n /**\n * Set a value with proper categorization\n */\n private setValue(key: string, value: string | boolean): void {\n // Resolve alias if it's a short form\n const resolvedKey = this.aliases[key] || key;\n\n if (typeof value === \"boolean\") {\n this.flags[resolvedKey] = value;\n } else {\n this.options[resolvedKey] = value;\n }\n\n // Always set the value in lowercase (for case-insensitive lookup, like legacy)\n this.args[resolvedKey.toLowerCase()] = value;\n }\n\n /**\n * Check for conflicts (short + long form of same option)\n */\n private checkConflicts(): void {\n const conflicts: string[] = [];\n\n for (const [shortKey, longKey] of Object.entries(this.aliases)) {\n const hasShort = this.args[shortKey] !== undefined;\n const hasLong = this.args[longKey] !== undefined;\n\n if (hasShort && hasLong) {\n conflicts.push(`Both -${shortKey} and --${longKey} specified`);\n }\n }\n\n if (conflicts.length > 0) {\n throw new Error(`Argument conflicts: ${conflicts.join(\", \")}`);\n }\n }\n\n /**\n * Get a value with precedence order\n */\n get(key: string): any {\n const resolvedKey = this.aliases[key] || key;\n this.usedKeys.add(resolvedKey);\n\n // Precedence order: overrides > CLI args > config files > env vars > defaults\n if (this.overrides[resolvedKey] !== undefined) {\n return this.overrides[resolvedKey];\n }\n\n // Case-insensitive lookup for CLI args (like legacy)\n const lcKey = resolvedKey.toLowerCase();\n\n // Try environment-specific CLI args first (e.g., --silent_local, --debug_production)\n const lcKeyWithEnv = `${lcKey}${this.env ? `_${this.env.toLowerCase()}` : \"\"}`;\n if (this.env && this.args[lcKeyWithEnv] !== undefined) {\n return this.args[lcKeyWithEnv];\n } else if (this.args[lcKey] !== undefined) {\n return this.args[lcKey];\n }\n\n // Config file values (case-sensitive)\n if (this.configValues[resolvedKey] !== undefined) {\n return this.configValues[resolvedKey];\n }\n\n // Environment variable (convert key to ENV_VAR format)\n const envKey = this.toEnvKey(resolvedKey);\n const envKeyWithEnv = `${envKey}${this.env ? `_${this.env.toUpperCase()}` : \"\"}`;\n\n // Try environment-specific env vars first (e.g., SILENT_LOCAL, DEBUG_PRODUCTION)\n const envSpecificKey = Object.keys(process.env).find(\n (k) => this.env && k.toUpperCase() === envKeyWithEnv\n );\n const envKeyFound = Object.keys(process.env).find((k) => k.toUpperCase() === envKey);\n\n if (envSpecificKey) {\n return process.env[envSpecificKey];\n } else if (envKeyFound) {\n return process.env[envKeyFound];\n }\n\n // Default value\n if (this.defaults[resolvedKey] !== undefined) {\n return this.defaults[resolvedKey];\n }\n\n // NODE_ENV fallback for 'env' key (like legacy)\n if (resolvedKey === \"env\" && process.env.NODE_ENV !== undefined) {\n return process.env.NODE_ENV;\n }\n\n return undefined;\n }\n\n /**\n * Set a value (for testing/internal use)\n */\n set(key: string, value: any): void {\n this.args[key] = value;\n }\n\n /**\n * Check if a command exists (case-insensitive)\n */\n hasCommand(cmd: string): boolean {\n return this.commands.some((command) => command.toLowerCase() === cmd.toLowerCase());\n }\n\n /**\n * Get all commands\n */\n getCommands(): string[] {\n return [...this.commands];\n }\n\n /**\n * Get used keys (as array)\n */\n getUsed(): string[] {\n return Array.from(this.usedKeys);\n }\n\n /**\n * Get unused keys (as array)\n */\n getUnused(): string[] {\n const unused: string[] = [];\n\n for (const key of Object.keys(this.args)) {\n if (!this.usedKeys.has(key) && !this.nots.includes(key)) {\n unused.push(key);\n }\n }\n\n return unused;\n }\n\n /**\n * Convert key to environment variable format\n */\n private toEnvKey(key: string): string {\n return key\n .replace(/[A-Z0-9]/g, (match, offset) =>\n offset === 0 ? match : \"_\" + match.toLowerCase()\n )\n .toUpperCase();\n }\n\n /**\n * Load .env file\n */\n private loadDotEnv(): void {\n const dotEnvPath = this.get(\"dotEnvPath\") || process.cwd();\n const dotEnvFile = this.get(\"dotEnvFile\") || \".env\";\n\n // If custom dotEnvFile is specified, use it as-is\n if (this.get(\"dotEnvFile\")) {\n const customPath = resolve(dotEnvPath, dotEnvFile);\n if (existsSync(customPath)) {\n config({ path: customPath, quiet: true });\n }\n return;\n }\n\n // Try environment-specific .env file first (e.g., .env.local, .env.production)\n let dotEnvPathFile: string | null = null;\n\n const envSpecificFile = `.env.${this.env}`;\n const envSpecificPath = resolve(dotEnvPath, envSpecificFile);\n if (existsSync(envSpecificPath)) {\n dotEnvPathFile = envSpecificPath;\n }\n\n // If no environment-specific file found in current directory, try examples folder\n if (!dotEnvPathFile && !this.get(\"dotEnvPath\")) {\n const examplesPath = resolve(dotEnvPath, \"examples\");\n const examplesEnvSpecificPath = resolve(examplesPath, envSpecificFile);\n if (existsSync(examplesEnvSpecificPath)) {\n dotEnvPathFile = examplesEnvSpecificPath;\n }\n }\n\n // If no environment-specific file found, try default .env\n if (!dotEnvPathFile) {\n dotEnvPathFile = resolve(dotEnvPath, dotEnvFile);\n\n // If .env file doesn't exist in current directory, try examples folder (for our examples)\n if (!existsSync(dotEnvPathFile)) {\n if (!this.get(\"dotEnvPath\")) {\n // Try examples folder first (for our examples)\n const examplesPath = resolve(dotEnvPath, \"examples\");\n const examplesEnvFile = resolve(examplesPath, dotEnvFile);\n if (existsSync(examplesEnvFile)) {\n dotEnvPathFile = examplesEnvFile;\n } else {\n // Try parent directory (like legacy)\n dotEnvPathFile = resolve(dotEnvPath, \"..\", dotEnvFile);\n }\n }\n }\n }\n\n // Load .env file if it exists\n if (dotEnvPathFile && existsSync(dotEnvPathFile)) {\n config({ path: dotEnvPathFile, quiet: true });\n }\n }\n\n /**\n * Load configuration files\n */\n private loadConfigFiles(): void {\n this.configsLoaded = [];\n this.configValues = {};\n\n const _defaultConfigExtension = this.get(\"defaultConfigExtension\") || \"js\";\n const optConfigFiles = this.get(\"config\") || this.get(\"configs\") || \"\";\n const configFiles = optConfigFiles ? optConfigFiles.split(/,\\s*/) : [];\n const optConfigFilePath = this.get(\"configPath\");\n\n if (configFiles.length > 0) {\n for (const cfgFile of configFiles) {\n let notLoaded = false;\n let notLoadedEnvSpecific = false;\n\n const cfgFileWithPath = this.resolveFileWithPath(optConfigFilePath, cfgFile);\n try {\n const cfgContents = this.requireConfigFile(cfgFileWithPath);\n this.configValues = { ...this.configValues, ...cfgContents };\n this.configsLoaded.push(cfgFileWithPath);\n } catch {\n notLoaded = true;\n }\n\n const cfgEnvFileWithPath = this.resolveFileWithPath(\n optConfigFilePath,\n cfgFile,\n this.env\n );\n if (cfgEnvFileWithPath !== cfgFileWithPath) {\n try {\n const cfgContents = this.requireConfigFile(cfgEnvFileWithPath);\n this.configValues = { ...this.configValues, ...cfgContents };\n this.configsLoaded.push(cfgEnvFileWithPath);\n } catch {\n notLoadedEnvSpecific = true;\n }\n } else {\n notLoadedEnvSpecific = true;\n }\n\n if (notLoaded && notLoadedEnvSpecific) {\n throw new Error(`can't load config file \"${cfgFileWithPath}\"`);\n }\n }\n }\n }\n\n /**\n * Resolve file path with environment-specific naming\n */\n private resolveFileWithPath(\n optConfigFilePath: string | undefined,\n cfgFile: string,\n env?: string\n ): string {\n let cfgFileWithPath = optConfigFilePath\n ? isAbsolute(optConfigFilePath)\n ? resolve(optConfigFilePath, cfgFile)\n : resolve(process.cwd(), optConfigFilePath, cfgFile)\n : isAbsolute(cfgFile)\n ? cfgFile\n : resolve(process.cwd(), cfgFile);\n\n const { basePathWithName, extension } = this.splitPath(cfgFileWithPath);\n if (env) {\n cfgFileWithPath = `${basePathWithName}.${env}.${extension || \"js\"}`;\n } else {\n cfgFileWithPath = `${basePathWithName}.${extension || \"js\"}`;\n }\n return cfgFileWithPath;\n }\n\n /**\n * Split file path into base path and extension\n */\n private splitPath(filePath: string): { basePathWithName: string; extension: string } {\n const basePathWithName = join(dirname(filePath), basename(filePath, extname(filePath)));\n const extension = extname(filePath).slice(1);\n return { basePathWithName, extension };\n }\n\n /**\n * Require a configuration file (supports .js and .json)\n */\n private requireConfigFile(filePath: string): any {\n if (!existsSync(filePath)) {\n throw new Error(`Config file not found: ${filePath}`);\n }\n\n const ext = extname(filePath).toLowerCase();\n if (ext === \".json\") {\n const content = readFileSync(filePath, \"utf8\");\n return JSON.parse(content);\n } else if (ext === \".js\") {\n // For .js files, use require() which is safer than eval\n try {\n // Clear require cache to ensure fresh load\n delete require.cache[require.resolve(filePath)];\n return require(filePath);\n } catch (error) {\n throw new Error(`Failed to load JS config file: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n throw new Error(`Unsupported file extension: ${ext}`);\n }\n }\n\n /**\n * Get all parsed data\n */\n getParsed(): ParsedArgs {\n return {\n command: this.commands[0] || \"\",\n flags: { ...this.flags },\n options: { ...this.options },\n usedKeys: Array.from(this.usedKeys)\n };\n }\n\n /**\n * Set prefixes dynamically and re-parse arguments (like legacy)\n */\n setPrefixes(prefixes: string | string[]): void {\n const arr = Array.isArray(prefixes) ? prefixes : prefixes.split(/,\\s*/);\n const sortedArr = arr.sort((a, b) =>\n a.length < b.length ? 1 : a.length > b.length ? -1 : 0\n );\n this.prefixes = sortedArr.map((el) => el.toLowerCase());\n // Re-parse arguments with new prefixes\n const args = process.argv.slice(2);\n this.parseArgs(args);\n }\n}\n\n// Singleton pattern (like legacy)\nlet instance: Args | null = null;\n\n/**\n * Initialize Args instance (singleton pattern)\n */\nexport function init(args?: string[]): Args {\n instance = new Args({ args });\n return instance;\n}\n\n/**\n * Get the current Args instance (singleton pattern)\n */\nexport function getArgsInstance(): Args | null {\n return instance;\n}\n\n\n","import Joi from \"joi\";\nimport { ParamError } from \"../errors\";\nimport { joiEdateType, joiStringArrayType } from \"./custom-types\";\n\n/**\n * Parameter definition types\n */\nexport type ParamDefinition = \n | string \n | Joi.Schema \n | { \n type?: string | Joi.Schema; \n values?: any[]; \n [key: string]: any; \n };\n\nexport type ParamGetter = (key: string, definition?: any) => any;\nexport type ParamSetter = (key: string, value: any) => boolean;\n\n/**\n * Args instance interface\n */\nexport interface ArgsInstance {\n get(key: string): any;\n}\n\n/**\n * Params constructor options\n */\nexport interface ParamsOptions {\n [key: string]: any;\n}\n\n/**\n * Params class for parameter validation and type checking\n * Built on top of Args library with Joi validation\n */\nexport class Params {\n private params: Record<string, any> = {};\n private definitions: Record<string, any> = {};\n private args: ArgsInstance;\n private paramSetters: ParamSetter[] = [];\n private paramGetters: ParamGetter[] = [];\n\n constructor({ args }: { args: ArgsInstance }, opts: ParamsOptions = {}) {\n this.args = args;\n\n for (const [k, v] of Object.entries(opts)) {\n // TODO: opt values might be an object with definitions in it, so perhaps `this.set` should be used\n this.params[k] = v;\n }\n }\n\n /**\n * Assign a parameter definition\n */\n assignDefinition(key: string, definition?: ParamDefinition): any {\n if (this.definitions[key] && !definition) {\n return this.definitions[key];\n }\n\n let type: Joi.Schema;\n if (!definition) {\n type = Joi.string();\n } else if (Joi.isSchema(definition)) {\n type = definition;\n } else if (Joi.isSchema(definition.type)) {\n type = definition.type;\n } else if (typeof definition === \"string\") {\n type = this.toJoi(definition);\n } else if (typeof definition.type === \"string\") {\n type = this.toJoi(definition.type);\n } else if (!definition.type) {\n type = Joi.string();\n } else {\n type = Joi.string();\n }\n\n if (!this.definitions[key]) {\n this.definitions[key] = {};\n }\n this.definitions[key].type = type;\n\n if (definition && definition.values) {\n if (Array.isArray(definition.values)) {\n this.definitions[key].values = definition.values;\n }\n }\n return this.definitions[key];\n }\n\n /**\n * Convert string definition to Joi schema\n */\n toJoi(str: string): Joi.Schema {\n let type: Joi.Schema;\n \n if (str.match(/^string|^text/i)) {\n type = Joi.string();\n } else if (str.match(/^number|^integer|^int/i)) {\n type = Joi.number();\n } else if (str.match(/^boolean|^bool/i)) {\n type = Joi.boolean();\n } else if (str.match(/^date/i)) {\n type = Joi.custom(joiEdateType);\n } else if (str.match(/^duration/i)) {\n type = Joi.string().isoDuration();\n } else if (str.match(/^array/i)) {\n let elementTypes = \"string\";\n const tmp = str.match(/\\((.*)\\)/);\n if (tmp && tmp[1].match(/string/i)) {\n elementTypes = \"string\";\n } else if (tmp && tmp[1].match(/number|integer|int/i)) {\n elementTypes = \"number\";\n } else if (tmp && tmp[1].match(/boolean|bool/i)) {\n elementTypes = \"boolean\";\n }\n type = Joi.custom(joiStringArrayType(elementTypes));\n } else {\n type = Joi.string();\n }\n\n // Handle default values\n const regexForDefault = /\\bdefault\\s+([^\\s]+)/;\n const matchForDefault = str.match(regexForDefault);\n if (matchForDefault) {\n const defValObj = type.validate(matchForDefault[1]);\n if (defValObj.error) {\n throw new ParamError(`default value \"${defValObj.value}\" type mismatch`);\n }\n type = type.default(defValObj.value);\n } else if (str.match(/required/)) {\n type = type.required();\n }\n\n return type;\n }\n\n /**\n * Validate a value against a definition\n */\n validate(key: string, val: any, def: any): any {\n // Pass current params as context to support cross-parameter references (e.g., @startTime+2h)\n const { value, error } = def.type.validate(val, { context: { params: this.params } });\n if (error) {\n const errs = error.details.map((el: any) => el.message).join(\", \");\n throw new ParamError(`\"${key}\" validation error: ${errs}`);\n }\n return value;\n }\n\n /**\n * Get a parameter value with validation\n */\n get(key: string, definition?: ParamDefinition): any {\n const def = this.assignDefinition(key, definition);\n let valFromGetters: any = undefined;\n \n if (def.volatile || true) {\n valFromGetters = this.runAllRegisteredGetters(key);\n }\n \n const valFromArgs = this.args.get(key);\n const valFromParams = this.params[key];\n\n const res = valFromGetters ? this.validate(key, valFromGetters, def) :\n valFromArgs ? this.validate(key, valFromArgs, def) :\n this.validate(key, valFromParams, def);\n\n if (res !== undefined && def.values && !def.values.includes(res)) {\n throw new ParamError(`key ${key} should be one of ${def.values}`);\n }\n return res;\n }\n\n /**\n * Set a parameter value with validation\n */\n set(key: string, val: any, definition?: ParamDefinition): void {\n // TODO: check if there's a test for this:\n if (val && val.type && val.value) {\n definition = val;\n val = val.value;\n }\n const def = this.assignDefinition(key, definition);\n\n if (!this.runAllRegisteredSetters(key, val)) {\n this.params[key] = val;\n }\n }\n\n /**\n * Get all parameters from definitions\n * Processes parameters left-to-right to support cross-parameter references\n */\n getAll(defs: Record<string, ParamDefinition>): Record<string, any> {\n const res: Record<string, any> = {};\n for (const [k, def] of Object.entries(defs)) {\n const value = this.get(k, def);\n res[k] = value;\n // Store validated value in params so subsequent params can reference it\n if (value !== undefined) {\n this.params[k] = value;\n }\n }\n return res;\n }\n\n /**\n * Run all registered getters for a key\n */\n runAllRegisteredGetters(key: string): any {\n let val: any = null;\n for (const getter of this.paramGetters) {\n val = getter(key, this.definitions[key]);\n if (val !== undefined) {\n break;\n }\n }\n return val;\n }\n\n /**\n * Run all registered setters for a key\n */\n runAllRegisteredSetters(key: string, value: any): boolean {\n let setterUsed: boolean = false;\n for (const setter of this.paramSetters) {\n setterUsed = setter(key, value);\n if (setterUsed) {\n break;\n }\n }\n return setterUsed;\n }\n\n /**\n * Register a parameter getter\n */\n registerParamGetter(fn: ParamGetter): void {\n this.paramGetters.push(fn);\n }\n\n /**\n * Register a parameter setter\n */\n registerParamSetter(fn: ParamSetter): void {\n this.paramSetters.push(fn);\n }\n}\n\n// Singleton instance\nlet paramsInstance: Params | null = null;\n\n/**\n * Initialize the singleton Params instance\n */\nexport const init = (fns: { args: ArgsInstance }, opts: ParamsOptions = {}): Params => {\n paramsInstance = new Params(fns, opts);\n return paramsInstance;\n};\n\n/**\n * Get the current singleton Params instance\n */\nexport const getParamsInstance = (): Params | null => paramsInstance;\n\n// Export custom types for external use\nexport { joiEdateType, joiStringArrayType };\n\n\n","/**\n * Error classes for the CLI toolkit\n */\n\nexport class FrameworkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FrameworkError\";\n }\n}\n\nexport class ParamError extends FrameworkError {\n constructor(message: string) {\n super(message);\n this.name = \"ParamError\";\n }\n}\n\nexport class InitError extends FrameworkError {\n constructor(message: string) {\n super(message);\n this.name = \"InitError\";\n }\n}\n\nexport class CriticalRequestError extends FrameworkError {\n constructor(message: string) {\n super(message);\n this.name = \"CriticalRequestError\";\n }\n}\n\nexport class ControlFlowError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ControlFlowError\";\n }\n}\n\n","import Joi from \"joi\";\nimport { ParamError } from \"../errors.js\";\n\n/**\n * Custom Joi type for enhanced date parsing with relative time support\n * Supports:\n * - ISO8601 strings: \"2025-01-01T01:01:01Z\"\n * - Relative time: \"-2h\", \"+1d\", \"now\"\n * - Cross-parameter references: \"@startTime+2h\", \"@endDate-30m\"\n * \n * Internal representation: UTC ISO8601 string (YYYY-MM-DDTHH:mm:ssZ)\n * \n * @param value - Date value to parse\n * @param helpers - Joi helpers (includes context with other params)\n * @returns ISO8601 string in UTC timezone\n */\nexport const joiEdateType = (value: any, helpers: Joi.CustomHelpers): string => {\n // If value is already a string in ISO format, validate and return\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$/.test(value)) {\n const testDate = new Date(value);\n if (!isNaN(testDate.getTime())) {\n return value;\n }\n }\n\n // If value is a Date object, convert to ISO string\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n // If value is not a string, try to convert it\n if (typeof value !== \"string\") {\n value = String(value);\n }\n\n // Handle special keyword \"now\"\n if (value.toLowerCase() === \"now\") {\n return new Date().toISOString();\n }\n\n // Check for cross-parameter reference with relative time: @paramName+2h, @paramName-30m\n const referenceRegex = /^@(\\w+)([+-]\\d+[smhdwy])$/i;\n const referenceMatch = value.match(referenceRegex);\n \n if (referenceMatch) {\n const [, paramName, relativeExpr] = referenceMatch;\n \n // Get the referenced parameter from context (if available via helpers.state.ancestors)\n // For now, we'll use helpers.prefs.context which Joi provides\n const context = (helpers as any).prefs?.context;\n \n if (!context || !context.params) {\n throw new ParamError(`Cannot resolve cross-parameter reference @${paramName}: context not available. Ensure parameters are processed with proper context.`);\n }\n\n const referencedValue = context.params[paramName];\n \n if (referencedValue === undefined || referencedValue === null) {\n throw new ParamError(`Cannot resolve @${paramName}: parameter \"${paramName}\" is not defined or has no value. Parameters are evaluated left-to-right.`);\n }\n\n // Referenced value should be an ISO string or Date\n let referenceDate: Date;\n if (referencedValue instanceof Date) {\n referenceDate = referencedValue;\n } else if (typeof referencedValue === \"string\") {\n referenceDate = new Date(referencedValue);\n if (isNaN(referenceDate.getTime())) {\n throw new ParamError(`Referenced parameter @${paramName} has invalid date value: ${referencedValue}`);\n }\n } else {\n throw new ParamError(`Referenced parameter @${paramName} is not a valid date type (found: ${typeof referencedValue})`);\n }\n\n // Parse the relative expression and apply to reference date\n const relativeMatch = relativeExpr.match(/^([+-])(\\d+)([smhdwy])$/i);\n if (!relativeMatch) {\n throw new ParamError(`Invalid relative time expression in @${paramName}${relativeExpr}`);\n }\n\n const [, sign, amount, unit] = relativeMatch;\n const offset = calculateTimeOffset(parseInt(amount, 10), unit, sign);\n const resultDate = new Date(referenceDate.getTime() + offset);\n \n return resultDate.toISOString();\n }\n\n // Check for relative time expressions like \"-2h\", \"+1d\", \"-30m\", etc.\n const relativeTimeRegex = /^([+-])(\\d+)([smhdwy])$/i;\n const relativeMatch = value.match(relativeTimeRegex);\n \n if (relativeMatch) {\n const [, sign, amount, unit] = relativeMatch;\n const numAmount = parseInt(amount, 10);\n \n if (isNaN(numAmount)) {\n throw new ParamError(`Invalid relative time amount: ${amount}`);\n }\n\n const offset = calculateTimeOffset(numAmount, unit, sign);\n const resultDate = new Date(Date.now() + offset);\n \n return resultDate.toISOString();\n }\n\n // Try to parse as a regular date string\n const parsedDate = new Date(value);\n \n // Check if the parsed date is valid\n if (isNaN(parsedDate.getTime())) {\n throw new ParamError(`Invalid date format: ${value}. Expected a valid date string, \"now\", relative time expression (e.g., \"-2h\", \"+1d\"), or cross-parameter reference (e.g., \"@startTime+2h\")`);\n }\n\n return parsedDate.toISOString();\n};\n\n/**\n * Calculate time offset in milliseconds\n */\nfunction calculateTimeOffset(amount: number, unit: string, sign: string): number {\n let multiplier = 1;\n \n // Convert to milliseconds based on unit\n switch (unit.toLowerCase()) {\n case \"s\": // seconds\n multiplier = 1000;\n break;\n case \"m\": // minutes\n multiplier = 60 * 1000;\n break;\n case \"h\": // hours\n multiplier = 60 * 60 * 1000;\n break;\n case \"d\": // days\n multiplier = 24 * 60 * 60 * 1000;\n break;\n case \"w\": // weeks\n multiplier = 7 * 24 * 60 * 60 * 1000;\n break;\n case \"y\": // years (approximate)\n multiplier = 365 * 24 * 60 * 60 * 1000;\n break;\n default:\n throw new ParamError(`Invalid time unit: ${unit}. Supported units: s, m, h, d, w, y`);\n }\n\n return sign === \"+\" ? amount * multiplier : -amount * multiplier;\n}\n\n/**\n * Custom Joi type for string array parsing\n * Converts comma-separated strings to typed arrays\n */\nexport const joiStringArrayType = (type: string) => (value: any, helpers: Joi.CustomHelpers): any[] => {\n if (value === undefined || typeof value === \"function\") {\n return [];\n }\n \n const arr = value.split(/,\\s*/).map((el: string) => {\n if (type === \"number\") {\n const v = parseInt(el, 10);\n if (isNaN(v)) {\n throw new ParamError(`array element \"${el}\" should be numeric`);\n }\n return v;\n } else if (type === \"boolean\") {\n const v = el.match(/true|t|yes|1/i) ? true :\n el.match(/false|f|no|0/i) ? false : null;\n if (v === null) {\n throw new ParamError(`array element \"${el}\" should be boolean`);\n }\n return v;\n } else if (type === \"string\") {\n return el;\n } else {\n throw new ParamError(`unknown type \"${type}\" for array elements`);\n }\n });\n \n return arr;\n};\n\n","import chalk from \"chalk\";\nimport util from \"util\";\n\nimport {\n Logger,\n LoggerOptions,\n LoggerProgressOptions,\n LogPayload,\n LevelName,\n LoggerTransport,\n LoggerMode\n} from \"./types.js\";\nimport { ConsoleTransport, ParentProcessTransport } from \"./transports.js\";\n\nconst ALL_LEVELS: LevelName[] = [\n \"silly\",\n \"debug\",\n \"logic\",\n \"info\",\n \"notice\",\n \"warn\",\n \"error\",\n \"results\",\n \"request\",\n \"response\",\n \"progress\"\n];\n\nconst LEVEL_COLORS: Record<LevelName, chalk.Chalk> = {\n error: chalk.red.bold,\n warn: chalk.rgb(255, 165, 0),\n notice: chalk.cyan,\n info: chalk.white.bold,\n logic: chalk.gray,\n debug: chalk.gray,\n silly: chalk.gray,\n request: chalk.green,\n response: chalk.yellow,\n progress: chalk.green,\n results: chalk.magenta\n};\n\ninterface NormalizedOptions {\n mode: LoggerMode;\n route: \"console\" | \"ipc\";\n prefix?: string;\n silent: boolean;\n showLevel: boolean;\n timestamp: boolean;\n levels: LevelName[];\n progressTimes: boolean;\n progressThrottle?: number;\n}\n\nexport class CliToolkitLogger implements Logger {\n private readonly options: NormalizedOptions;\n private transport: LoggerTransport;\n private readonly startTimes: Record<string, number> = {};\n private readonly lastProgressTimes: Record<string, number> = {};\n\n constructor(options: LoggerOptions = {}) {\n this.options = this.normalizeOptions(options);\n this.transport = this.options.route === \"ipc\"\n ? new ParentProcessTransport()\n : new ConsoleTransport();\n }\n\n setMode(mode: LoggerMode): void {\n if (!this.isValidMode(mode)) {\n throw new Error(`Unsupported logger mode: ${mode}`);\n }\n this.options.mode = mode;\n }\n\n debug(message?: any, ...chunks: any[]): void {\n this.out({ level: \"debug\", message, chunks });\n }\n\n info(message?: any, ...chunks: any[]): void {\n this.out({ level: \"info\", message, chunks });\n }\n\n notice(message?: any, ...chunks: any[]): void {\n this.out({ level: \"notice\", message, chunks });\n }\n\n warn(message?: any, ...chunks: any[]): void {\n this.out({ level: \"warn\", message, chunks });\n }\n\n error(message?: any, ...chunks: any[]): void {\n this.out({ level: \"error\", message, chunks });\n }\n\n logic(message?: any, ...chunks: any[]): void {\n this.out({ level: \"logic\", message, chunks });\n }\n\n silly(message?: any, ...chunks: any[]): void {\n this.out({ level: \"silly\", message, chunks });\n }\n\n results(results: unknown): void {\n this.out({ level: \"results\", message: \"results\", results });\n }\n\n request(operation: string, ...chunks: any[]): void {\n const message = this.inspectChunks([operation, ...chunks]);\n this.out({ level: \"request\", message });\n }\n\n response(operation: string, ...chunks: any[]): void {\n const message = this.inspectChunks([operation, ...chunks]);\n this.out({ level: \"response\", message });\n }\n\n progress(message: string, opts: LoggerProgressOptions): void {\n const { prefix, count, total } = opts;\n const paddedTotal = String(total).length;\n const paddedCount = String(count).padStart(paddedTotal, \" \");\n const payload: LogPayload = {\n level: \"progress\",\n message,\n count: paddedCount,\n total,\n prefix\n };\n\n if (!this.startTimes[prefix ?? \"\"]) {\n this.startTimes[prefix ?? \"\"] = Date.now();\n }\n if (this.options.progressTimes) {\n const elapsedSeconds = (Date.now() - this.startTimes[prefix ?? \"\"]) / 1000;\n let remaining = -1;\n if (count > 1) {\n const rate = elapsedSeconds / (count - 1);\n remaining = (total - count) * rate;\n }\n payload.elapsed = this.round(elapsedSeconds, 2);\n payload.remaining = remaining >= 0 ? this.round(remaining, 2) : remaining;\n }\n\n if (count >= total) {\n delete this.startTimes[prefix ?? \"\"];\n delete this.lastProgressTimes[prefix ?? \"\"];\n }\n\n if (this.shouldOutputProgress(prefix ?? \"\", count, total)) {\n this.out(payload);\n if (this.options.progressThrottle && prefix) {\n this.lastProgressTimes[prefix] = Date.now();\n }\n }\n }\n\n private shouldOutputProgress(prefix: string, count: number, total: number): boolean {\n if (!this.options.progressThrottle) {\n return true;\n }\n if (count === 1 || count === total || !prefix) {\n return true;\n }\n const lastTime = this.lastProgressTimes[prefix];\n if (!lastTime) {\n return true;\n }\n return Date.now() - lastTime >= this.options.progressThrottle;\n }\n\n private out(struct: LogPayload): void {\n if (this.options.silent) {\n return;\n }\n if (!this.options.levels.includes(struct.level)) {\n return;\n }\n\n if (this.options.prefix && !struct.prefix) {\n struct.prefix = this.options.prefix;\n }\n\n const output = this.options.mode === \"json\"\n ? struct\n : this.formatLog(struct);\n\n this.transport.write(output);\n }\n\n private formatLog(struct: LogPayload): string {\n const parts: string[] = [];\n const now = new Date();\n\n if (this.options.timestamp) {\n parts.push(now.toISOString());\n }\n\n if (this.options.showLevel) {\n parts.push(struct.level.toUpperCase());\n }\n\n if (struct.level === \"progress\") {\n if (struct.prefix) {\n parts.push(LEVEL_COLORS[struct.level].bold(struct.prefix));\n }\n if (struct.count !== undefined && struct.total !== undefined) {\n parts.push(LEVEL_COLORS[struct.level](`${struct.count}/${struct.total}`));\n }\n } else if (struct.prefix) {\n parts.push(chalk.cyan(`[${struct.prefix}]`));\n }\n\n if (struct.message) {\n const formatter = LEVEL_COLORS[struct.level] ?? chalk.white;\n parts.push(formatter.bold(struct.message));\n }\n\n if (struct.level === \"progress\") {\n if (struct.elapsed !== undefined && struct.remaining !== undefined) {\n const formatter = LEVEL_COLORS[struct.level];\n parts.push(formatter(`${struct.elapsed}/${struct.remaining}`));\n }\n }\n\n if (struct.chunks && struct.chunks.length) {\n parts.push(this.inspectChunks(struct.chunks));\n }\n\n if (struct.results) {\n const formatter = LEVEL_COLORS[struct.level] ?? chalk.white;\n parts.push(formatter(JSON.stringify(struct.results, null, 4)));\n }\n\n return parts.join(\" \");\n }\n\n private inspectChunks(chunks: any[]): string {\n return chunks\n .map(chunk => util.inspect(chunk, { colors: true, depth: null }))\n .join(\" \");\n }\n\n private normalizeOptions(options: LoggerOptions): NormalizedOptions {\n const { route, mode, prefix, silent, showLevel, timestamp, levels, progress } = options;\n const shouldUseIpc = this.shouldUseIpcRoute();\n const normalized: NormalizedOptions = {\n mode: this.isValidMode(mode) ? mode! : \"text\",\n route: route ?? (shouldUseIpc ? \"ipc\" : \"console\"),\n prefix,\n silent: silent ?? false,\n showLevel: showLevel ?? true,\n timestamp: timestamp ?? false,\n levels: this.normalizeLevels(levels),\n progressTimes: progress?.withTimes ?? false,\n progressThrottle: progress?.throttleMs\n };\n return normalized;\n }\n\n private shouldUseIpcRoute(): boolean {\n // Don't use IPC in test environments (Vitest workers interfere with process.send)\n if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n return false;\n }\n // Only use IPC if process.send exists AND we're connected to a parent\n // In Vitest workers, process.send exists but process.connected is undefined/false\n // process.connected is only true in actual child processes created with fork()\n return typeof process.send === \"function\" && process.connected === true;\n }\n\n private normalizeLevels(levels?: string[]): LevelName[] {\n if (!levels || !levels.length) {\n return ALL_LEVELS;\n }\n\n const includes = levels.filter(level => !level.startsWith(\"-\")) as LevelName[];\n const excludes = levels\n .filter(level => level.startsWith(\"-\"))\n .map(level => level.slice(1)) as LevelName[];\n\n const unknown = [...includes, ...excludes].filter(level => !ALL_LEVELS.includes(level));\n if (unknown.length) {\n console.warn(`[Logger] Unknown level(s): ${unknown.join(\", \")}`);\n }\n\n const base = includes.length ? includes : ALL_LEVELS;\n return base.filter(level => !excludes.includes(level));\n }\n\n private isValidMode(mode?: string | null): mode is LoggerMode | undefined {\n return mode === undefined || mode === null || mode === \"text\" || mode === \"json\";\n }\n\n private round(value: number, places: number): number {\n const factor = Math.pow(10, places);\n return Math.round(value * factor) / factor;\n }\n}\n\n\n","import { LoggerTransport } from \"./types.js\";\n\nexport class ConsoleTransport implements LoggerTransport {\n write(payload: any): void {\n console.info(payload);\n }\n}\n\nexport class ParentProcessTransport implements LoggerTransport {\n write(payload: any): void {\n // Don't use IPC in test environments (Vitest workers interfere with process.send)\n if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n console.info(payload);\n return;\n }\n // Only use process.send if we're actually connected to a parent process\n // In Vitest workers, process.send exists but shouldn't be used\n if (typeof process.send === \"function\" && process.connected === true) {\n process.send(payload);\n } else {\n console.info(payload);\n }\n }\n}\n\n\n","/**\n * Init component - Framework initialization and flow execution\n * \n * Provides a standardized way to initialize CLI scripts with Args, Params, Logger,\n * and other dependencies, then execute the main flow function.\n */\n\nimport { Args } from \"../args/index.js\";\nimport { Params } from \"../params/index.js\";\nimport { CliToolkitLogger } from \"../logger/index.js\";\nimport { ParamError, InitError } from \"../errors.js\";\nimport type { Context, InitOptions, FlowFunction } from \"./types.js\";\nimport { EventEmitter } from \"events\";\n\n/**\n * Setup initial context with Args, Params, and Logger\n */\nfunction setup(opts: InitOptions = {}): Context {\n // Initialize Args with overrides and defaults from opts\n const args = new Args({\n overrides: opts.overrides || {},\n defaults: opts.defaults || {},\n });\n\n // Initialize Params with Args instance\n const params = new Params({ args }, opts.overrides || {});\n\n // Initialize Logger with options from opts\n const loggerOptions = opts.logger || {};\n const logger = new CliToolkitLogger({\n mode: loggerOptions.mode || \"text\",\n route: loggerOptions.route || \"console\",\n prefix: loggerOptions.prefix,\n silent: loggerOptions.silent,\n showLevel: loggerOptions.showLevel,\n timestamp: loggerOptions.timestamp,\n levels: loggerOptions.levels,\n });\n\n // Create cleanup functions array\n const cleanupFunctions: Array<(context: Context) => Promise<void> | void> = [];\n\n // Create context\n const context: Context = {\n args,\n params,\n logger,\n emitter: new EventEmitter(),\n isStop: () => false, // Will be set in init function\n cleanupFunctions,\n registerCleanup: (fn: (context: Context) => Promise<void> | void) => {\n cleanupFunctions.push(fn);\n },\n };\n\n logger.debug(\"[setup] completed successfully\");\n return context;\n}\n\n/**\n * Setup modules (future feature - placeholder for now)\n */\nasync function setupModules(context: Context, opts: InitOptions = {}): Promise<Context> {\n // TODO: Implement module initialization\n // For now, just log that modules would be initialized\n if (opts.modules && opts.modules.length > 0) {\n context.logger.debug(`[setupModules] modules specified: ${opts.modules.join(\", \")} (not yet implemented)`);\n }\n context.logger.debug(\"[setupModules] completed successfully\");\n return context;\n}\n\n/**\n * Initialize framework and execute flow function\n * \n * Automatically handles async module loading (e.g., ESM dependencies for screen module)\n * so users don't need to call load() manually.\n * \n * @param flow - Main function that receives context and executes the script logic\n * @param opts - Configuration options for initialization\n */\nexport async function init(flow: FlowFunction, opts: InitOptions = {}): Promise<void> {\n let stop = false;\n let context: Context | null = null;\n\n try {\n // Pre-load ESM dependencies (ink, react) for CommonJS compatibility\n // This ensures screen-related functionality works in CommonJS environments\n // The load() function is available from the screen module or main package\n try {\n // Try to import screen module and call its load function\n // This works in both ESM and CommonJS (via dynamic import)\n const screenModule = await import(\"../screen/index.js\");\n if (screenModule && typeof screenModule.load === \"function\") {\n await screenModule.load();\n }\n } catch {\n // If screen module load fails, try accessing via main package (CommonJS)\n if (typeof require !== \"undefined\") {\n try {\n // In CommonJS, the main package may have been required and exports load()\n // We can't use require() here as it would be synchronous, so we skip it\n // The screen module import above should work in both cases\n } catch {\n // Ignore - screen functionality may not be needed\n }\n }\n }\n\n // Setup context with Args, Params, Logger\n context = setup(opts);\n \n // Set isStop function\n context.isStop = () => stop;\n\n // Setup modules (future feature)\n context = await setupModules(context, opts);\n\n // Setup SIGINT handler for graceful shutdown\n process.on(\"SIGINT\", async () => {\n if (stop) {\n context!.logger.warn(\"[process] killed\");\n process.exit(2);\n }\n stop = true;\n \n // Get stop allowance from params\n let allowance = 5; // default\n try {\n allowance = context!.params.get(\"stopAllowance\", \"number default 5\");\n } catch {\n // Use default if not provided\n }\n \n context!.logger.info(`>> emitting stop with allowance ${allowance}`);\n context!.emitter.emit(\"stop\", allowance);\n });\n\n // Execute the flow function\n await flow(context);\n\n } catch (error) {\n // Error handling with proper error types\n const errorLocation = error instanceof Error && error.stack\n ? error.stack.split(\"\\n\")[1]?.trim() || \"Unknown location\"\n : \"Unknown location\";\n\n if (error instanceof ParamError) {\n context?.logger.error(`[params]: ${error.message} (${errorLocation})`);\n process.exitCode = 3;\n } else if (error instanceof InitError) {\n context?.logger.error(`[init]: ${error.message} (${errorLocation})`);\n process.exitCode = 4;\n } else {\n context?.logger.error(`[other] error:`, error, errorLocation);\n process.exitCode = 5;\n }\n } finally {\n // Run cleanup functions in reverse order\n if (context) {\n for (const fn of context.cleanupFunctions.reverse()) {\n try {\n await fn(context);\n } catch (error) {\n context.logger.warn(\"[cleanup] error in cleanup function:\", error);\n }\n }\n\n // Warn about unused CLI args\n const unusedArgs = context.args.getUnused();\n if (unusedArgs.length > 0) {\n context.logger.warn(\"Unused CLI args:\", unusedArgs.join(\", \"));\n }\n }\n }\n}\n\n/**\n * Setup function - can be used independently to get context without executing flow\n * Useful for testing or advanced use cases\n */\nexport function setupContext(opts: InitOptions = {}): Context {\n return setup(opts);\n}\n\n"],"mappings":"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","names":["h","h","React","import_react","import_ink","config","resolve","h","import_react","import_ink","h","import_react","import_ink","config","React","import_react","import_ink","config","relativeMatch","Joi","chalk","util"]}
1
+ {"version":3,"sources":["../src/screen/components.ts","../src/screen/list-components.ts","../src/screen/screens.ts","../src/screen/ui-elements.ts","../src/screen/utils.ts","../src/screen/footer-builder.ts","../src/screen/index.ts","../src/init.ts","../src/args/index.ts","../src/params/index.ts","../src/errors.ts","../src/params/custom-types.ts","../src/logger/index.ts","../src/logger/transports.ts","../src/init/index.ts"],"sourcesContent":["/**\n * Core screen layout components\n */\n\nimport React, { createElement as h } from \"react\";\nimport { Box, Text } from \"ink\";\n\n/**\n * Get screen width for borders\n * @param maxWidth - Optional max width (null = no limit)\n */\nexport function getScreenWidth(maxWidth: number | null = null): number {\n const terminalWidth = process.stdout.columns || 80;\n // Leave some margin for borders and padding\n const availableWidth = Math.max(20, terminalWidth - 4);\n return maxWidth ? Math.min(availableWidth, maxWidth) : availableWidth;\n}\n\n// Types\nexport interface ScreenContainerProps {\n children: React.ReactNode;\n}\n\nexport interface ScreenRowProps {\n children: React.ReactNode;\n}\n\nexport interface ScreenTitleProps {\n text: string;\n}\n\nexport interface ScreenDividerProps {\n width?: number;\n}\n\nexport interface ScreenBodyProps {\n children: React.ReactNode;\n alignItems?: \"flex-start\" | \"center\" | \"flex-end\";\n}\n\nexport interface ScreenFooterProps {\n lines: (string | JSX.Element)[];\n textStyle?: {\n color?: string;\n dimColor?: boolean;\n bold?: boolean;\n };\n}\n\n/**\n * Screen Container - uses Ink's built-in borderStyle for proper text wrapping\n */\nexport function ScreenContainer({ children }: ScreenContainerProps): JSX.Element {\n const width = getScreenWidth();\n\n return h(Box, {\n flexDirection: \"column\",\n marginTop: 1,\n borderStyle: \"single\",\n borderColor: \"cyan\",\n paddingX: 1,\n width: width // Use the calculated width directly\n }, children);\n}\n\n/**\n * Screen row - just a wrapper for spacing, borders handled by container\n */\nexport function ScreenRow({ children }: ScreenRowProps): JSX.Element {\n return h(Box, { flexDirection: \"column\" }, children);\n}\n\n/**\n * Screen Title - first line inside container (left-aligned, breadcrumb-style)\n */\nexport function ScreenTitle({ text }: ScreenTitleProps): JSX.Element {\n return h(ScreenRow, {},\n h(Text, { bold: true, color: \"cyan\" }, text)\n );\n}\n\n/**\n * Horizontal divider line\n */\nexport function ScreenDivider({ width }: ScreenDividerProps): JSX.Element {\n const dividerWidth = width || (getScreenWidth() - 4); // Account for border and padding\n return h(Text, { color: \"cyan\", dimColor: true }, \"─\".repeat(dividerWidth));\n}\n\n/**\n * Screen Body - main content area\n */\nexport function ScreenBody({ children, alignItems = \"flex-start\" }: ScreenBodyProps): JSX.Element {\n return h(Box, { flexDirection: \"column\", alignItems }, children);\n}\n\n/**\n * Screen Footer - bottom area with key bindings and status\n * \n * @example\n * <ScreenFooter lines={[\"esc to go back\", \"enter to select\"]} />\n * \n * @example\n * <ScreenFooter \n * lines={[\"esc to go back\", \"enter to select\"]} \n * textStyle={{ color: \"white\" }}\n * />\n * \n * @example\n * <ScreenFooter \n * lines={[\"esc to go back\", \"enter to select\"]} \n * textStyle={{ dimColor: false, color: \"green\" }}\n * />\n */\nexport function ScreenFooter({ lines, textStyle }: ScreenFooterProps): JSX.Element {\n const defaultTextStyle = {\n dimColor: true,\n color: \"white\"\n };\n \n const finalTextStyle = { ...defaultTextStyle, ...textStyle };\n\n // Flatten nested arrays and ensure all items are properly wrapped\n const flattenAndWrap = (items: (string | JSX.Element | (string | JSX.Element)[])[], keyPrefix: string = \"\"): JSX.Element[] => {\n const result: JSX.Element[] = [];\n let keyIndex = 0;\n\n items.forEach((item, index) => {\n if (Array.isArray(item)) {\n // Handle nested arrays\n const nested = flattenAndWrap(item, `${keyPrefix}-${index}`);\n result.push(...nested);\n } else if (typeof item === \"string\") {\n // Wrap strings in Text components\n result.push(\n h(Text, { key: `${keyPrefix}-${keyIndex++}`, ...finalTextStyle }, item)\n );\n } else {\n // JSX elements - add key if missing\n const element = item as JSX.Element;\n if (element.key === null || element.key === undefined) {\n result.push(\n h(Text, { key: `${keyPrefix}-${keyIndex++}`, ...finalTextStyle }, element)\n );\n } else {\n result.push(element);\n }\n }\n });\n\n return result;\n };\n\n const wrappedItems = flattenAndWrap(lines);\n\n return h(Box, { flexDirection: \"column\" },\n h(Box, { flexDirection: \"row\" }, ...wrappedItems)\n );\n}","/**\n * Reusable screen components for V2 architecture\n */\n\nimport React, { useState, useEffect, useRef, createElement } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { ScreenRow, ScreenDivider } from \"./components.js\";\n\nconst h = createElement;\n\n// TODO: Define proper context type interface\ninterface ScreenContext {\n setAction: (name: string, handler: () => void) => void;\n setKeyBinding: (bindings: KeyBinding | KeyBinding[]) => void;\n addFooter: (message: string) => void;\n setFooter: (items: string | string[]) => void;\n goBack: () => void;\n update: () => void;\n}\n\ninterface KeyBinding {\n key: string;\n caption: string;\n action: string;\n order: number;\n}\n\ninterface ListItem {\n name: string;\n value: any;\n}\n\ninterface MultiColumnListComponentProps {\n items: string[];\n ctx: ScreenContext;\n selectedIndexRef: { current: number };\n}\n\ninterface MultiColumnListWithPreviewComponentProps {\n items: string[];\n getPreviewContent?: (item: string) => string | JSX.Element | Record<string, any>;\n ctx: ScreenContext;\n selectedIndexRef: { current: number };\n}\n\ninterface ListComponentProps {\n items: ListItem[];\n ctx: ScreenContext;\n selectedIndexRef: { current: number };\n renderItem?: (item: ListItem, isSelected: boolean, displayIndex: number) => JSX.Element;\n getTitle?: (item: ListItem) => string;\n sortable?: boolean;\n maxHeight?: number;\n sortHighlightStyle?: {\n color?: string;\n backgroundColor?: string;\n bold?: boolean;\n };\n selectionMarker?: string; // Customizable selection marker, default: \" \"\n}\n\n/**\n * Multi-column list component\n * Handles its own navigation, actions, and key bindings\n */\nexport function MultiColumnListComponent({ items, ctx, selectedIndexRef }: MultiColumnListComponentProps): JSX.Element {\n const [, forceUpdate] = useState({});\n\n // Calculate layout\n const termWidth = (process.stdout.columns || 80) - 8;\n const maxItemLength = Math.max(...items.map(w => w.length));\n const columnWidth = maxItemLength + 3;\n const columns = Math.max(1, Math.floor(termWidth / columnWidth));\n const itemsPerColumn = Math.ceil(items.length / columns);\n\n // Set up actions in useEffect (runs once)\n useEffect(() => {\n ctx.setAction(\"moveUp\", () => {\n selectedIndexRef.current = Math.max(0, selectedIndexRef.current - 1);\n forceUpdate({});\n });\n\n ctx.setAction(\"moveDown\", () => {\n selectedIndexRef.current = Math.min(items.length - 1, selectedIndexRef.current + 1);\n forceUpdate({});\n });\n\n ctx.setAction(\"moveLeft\", () => {\n if (selectedIndexRef.current === 0) {\n ctx.goBack();\n } else {\n selectedIndexRef.current = Math.max(0, selectedIndexRef.current - itemsPerColumn);\n forceUpdate({});\n }\n });\n\n ctx.setAction(\"moveRight\", () => {\n selectedIndexRef.current = Math.min(items.length - 1, selectedIndexRef.current + itemsPerColumn);\n forceUpdate({});\n });\n\n // Set up key bindings\n ctx.setKeyBinding([\n { key: \"leftArrow\", caption: \"navigate\", action: \"moveLeft\", order: 0 },\n { key: \"rightArrow\", caption: \"navigate\", action: \"moveRight\", order: 0 },\n { key: \"upArrow\", caption: \"navigate\", action: \"moveUp\", order: 0 },\n { key: \"downArrow\", caption: \"navigate\", action: \"moveDown\", order: 0 }\n ]);\n\n // Add footer\n ctx.addFooter(`Total: ${items.length} items`);\n }, []);\n\n const selectedIndex = selectedIndexRef.current;\n\n // Build grid\n const rows: JSX.Element[] = [];\n for (let row = 0; row < itemsPerColumn; row++) {\n const cols: JSX.Element[] = [];\n for (let col = 0; col < columns; col++) {\n const index = col * itemsPerColumn + row;\n if (index < items.length) {\n const isSelected = index === selectedIndex;\n cols.push(\n h(Box, { key: index, width: columnWidth },\n h(Text, {\n color: isSelected ? \"black\" : \"white\",\n backgroundColor: isSelected ? \"cyan\" : undefined,\n bold: isSelected\n }, items[index].padEnd(maxItemLength))\n )\n );\n }\n }\n rows.push(\n h(ScreenRow, { key: row, children: h(Box, { flexDirection: \"row\" }, ...cols) })\n );\n }\n\n return h(Box, { flexDirection: \"column\" }, ...rows);\n}\n\n/**\n * Multi-column list with preview panel component\n * Shows selected item details below the list\n */\nexport function MultiColumnListWithPreviewComponent({\n items,\n getPreviewContent,\n ctx,\n selectedIndexRef\n}: MultiColumnListWithPreviewComponentProps): JSX.Element {\n const [, forceUpdate] = useState({});\n\n // Calculate layout\n const termWidth = (process.stdout.columns || 80) - 8;\n const maxItemLength = Math.max(...items.map(w => w.length));\n const columnWidth = maxItemLength + 3;\n const columns = Math.max(1, Math.floor(termWidth / columnWidth));\n const itemsPerColumn = Math.ceil(items.length / columns);\n\n // Set up actions in useEffect (runs once)\n useEffect(() => {\n ctx.setAction(\"moveUp\", () => {\n selectedIndexRef.current = Math.max(0, selectedIndexRef.current - 1);\n forceUpdate({});\n });\n\n ctx.setAction(\"moveDown\", () => {\n selectedIndexRef.current = Math.min(items.length - 1, selectedIndexRef.current + 1);\n forceUpdate({});\n });\n\n ctx.setAction(\"moveLeft\", () => {\n if (selectedIndexRef.current === 0) {\n ctx.goBack();\n } else {\n selectedIndexRef.current = Math.max(0, selectedIndexRef.current - itemsPerColumn);\n forceUpdate({});\n }\n });\n\n ctx.setAction(\"moveRight\", () => {\n selectedIndexRef.current = Math.min(items.length - 1, selectedIndexRef.current + itemsPerColumn);\n forceUpdate({});\n });\n\n // Set up key bindings\n ctx.setKeyBinding([\n { key: \"leftArrow\", caption: \"navigate\", action: \"moveLeft\", order: 0 },\n { key: \"rightArrow\", caption: \"navigate\", action: \"moveRight\", order: 0 },\n { key: \"upArrow\", caption: \"navigate\", action: \"moveUp\", order: 0 },\n { key: \"downArrow\", caption: \"navigate\", action: \"moveDown\", order: 0 }\n ]);\n\n // Add footer\n ctx.addFooter(`Total: ${items.length} items`);\n }, []);\n\n const selectedIndex = selectedIndexRef.current;\n const selectedItem = items[selectedIndex];\n\n // Build grid\n const rows: JSX.Element[] = [];\n for (let row = 0; row < itemsPerColumn; row++) {\n const cols: JSX.Element[] = [];\n for (let col = 0; col < columns; col++) {\n const index = col * itemsPerColumn + row;\n if (index < items.length) {\n const isSelected = index === selectedIndex;\n cols.push(\n h(Box, { key: index, width: columnWidth },\n h(Text, {\n color: isSelected ? \"black\" : \"white\",\n backgroundColor: isSelected ? \"cyan\" : undefined,\n bold: isSelected\n }, items[index].padEnd(maxItemLength))\n )\n );\n }\n }\n rows.push(\n h(ScreenRow, { key: row, children: h(Box, { flexDirection: \"row\" }, ...cols) })\n );\n }\n\n // Get preview content for selected item\n const previewContent = getPreviewContent ? getPreviewContent(selectedItem) : selectedItem;\n\n const previewRows: JSX.Element[] = [];\n if (typeof previewContent === \"string\") {\n previewRows.push(h(ScreenRow, { key: \"preview-string\", children: h(Text, { bold: true }, previewContent) }));\n } else if (typeof previewContent === \"object\" && !React.isValidElement(previewContent) && previewContent !== null) {\n Object.entries(previewContent).forEach(([key, value], idx) => {\n previewRows.push(h(ScreenRow, { key: `preview-${key}-${idx}`, children: h(Text, {}, `${key}: ${value}`) }));\n });\n } else if (React.isValidElement(previewContent)) {\n previewRows.push(h(ScreenRow, { key: \"preview-element\", children: previewContent }));\n }\n\n return h(Box, { flexDirection: \"column\" },\n ...rows,\n h(ScreenRow, { key: \"spacer-1\", children: h(Text, {}, \" \") }),\n h(ScreenDivider, { key: \"divider\" }),\n h(ScreenRow, { key: \"spacer-2\", children: h(Text, {}, \" \") }),\n ...previewRows\n );\n}\n\n/**\n * Single-column list component\n * Simple vertical menu with optional sorting\n */\nexport function ListComponent({ items, ctx, selectedIndexRef, renderItem, getTitle, sortable = false, maxHeight, sortHighlightStyle, selectionMarker = \" \" }: ListComponentProps): JSX.Element {\n const [, forceUpdate] = useState({});\n const [sortOrder, setSortOrder] = useState<\"none\" | \"asc\" | \"desc\">(\"none\");\n const [scrollOffset, setScrollOffset] = useState(0);\n \n // Use refs to store current scroll values to avoid stale closures\n const scrollStateRef = useRef({ scrollOffset: 0, maxHeight: 0, totalItems: 0 });\n\n // Default getTitle - returns item if string, otherwise item.title\n const defaultGetTitle = (item: ListItem): string => {\n return getTitle ? getTitle(item) : (typeof item.value === \"string\" ? item.value : (item.value?.title || item.name));\n };\n\n // Get title for sorting\n const titleGetter = getTitle || defaultGetTitle;\n\n // Apply sorting if enabled\n const displayItems = sortable && sortOrder !== \"none\" ? [...items].sort((a, b) => {\n const titleA = titleGetter(a).toLowerCase();\n const titleB = titleGetter(b).toLowerCase();\n if (sortOrder === \"asc\") {\n return titleA < titleB ? -1 : titleA > titleB ? 1 : 0;\n } else {\n return titleA > titleB ? -1 : titleA < titleB ? 1 : 0;\n }\n }) : items;\n\n // Calculate scrolling\n const effectiveMaxHeight = maxHeight || displayItems.length;\n const canScroll = displayItems.length > effectiveMaxHeight;\n const maxScrollOffset = Math.max(0, displayItems.length - effectiveMaxHeight);\n \n // Ensure scroll offset is within bounds\n const clampedScrollOffset = Math.min(Math.max(0, scrollOffset), maxScrollOffset);\n \n // Get visible items\n const visibleItems = displayItems.slice(clampedScrollOffset, clampedScrollOffset + effectiveMaxHeight);\n \n // Check if we can scroll up/down\n const canScrollUp = clampedScrollOffset > 0;\n const canScrollDown = clampedScrollOffset < maxScrollOffset;\n \n // Update scroll state ref with current values\n scrollStateRef.current = { scrollOffset, maxHeight: effectiveMaxHeight, totalItems: displayItems.length };\n \n\n // Set up actions in useEffect (runs once)\n useEffect(() => {\n ctx.setAction(\"moveUp\", () => {\n const newIndex = Math.max(0, selectedIndexRef.current - 1);\n selectedIndexRef.current = newIndex;\n \n // Auto-scroll to keep selected item visible\n const { scrollOffset: currentScrollOffset, maxHeight: currentMaxHeight, totalItems } = scrollStateRef.current;\n const currentMaxScrollOffset = Math.max(0, totalItems - currentMaxHeight);\n const currentClampedScrollOffset = Math.min(Math.max(0, currentScrollOffset), currentMaxScrollOffset);\n \n if (newIndex < currentClampedScrollOffset) {\n setScrollOffset(newIndex);\n }\n \n // Force update to trigger re-render with new selected index\n forceUpdate({});\n });\n\n ctx.setAction(\"moveDown\", () => {\n const currentItems = sortable && sortOrder !== \"none\" ? [...items].sort((a, b) => {\n const titleA = titleGetter(a).toLowerCase();\n const titleB = titleGetter(b).toLowerCase();\n if (sortOrder === \"asc\") {\n return titleA < titleB ? -1 : titleA > titleB ? 1 : 0;\n } else {\n return titleA > titleB ? -1 : titleA < titleB ? 1 : 0;\n }\n }) : items;\n \n const maxIndex = currentItems.length - 1;\n const newIndex = Math.min(maxIndex, selectedIndexRef.current + 1);\n selectedIndexRef.current = newIndex;\n \n // Auto-scroll to keep selected item visible\n const { scrollOffset: currentScrollOffset, maxHeight: currentMaxHeight, totalItems } = scrollStateRef.current;\n const currentMaxScrollOffset = Math.max(0, totalItems - currentMaxHeight);\n const currentClampedScrollOffset = Math.min(Math.max(0, currentScrollOffset), currentMaxScrollOffset);\n \n if (newIndex >= currentClampedScrollOffset + currentMaxHeight) {\n setScrollOffset(newIndex - currentMaxHeight + 1);\n }\n \n // Force update to trigger re-render with new selected index\n forceUpdate({});\n });\n\n // Add scroll actions for arrow clicks\n ctx.setAction(\"scrollUp\", () => {\n const { scrollOffset: currentScrollOffset, maxHeight: currentMaxHeight, totalItems } = scrollStateRef.current;\n const currentMaxScrollOffset = Math.max(0, totalItems - currentMaxHeight);\n const newScrollOffset = Math.max(0, currentScrollOffset - 1);\n setScrollOffset(newScrollOffset);\n forceUpdate({});\n });\n\n ctx.setAction(\"scrollDown\", () => {\n const { scrollOffset: currentScrollOffset, maxHeight: currentMaxHeight, totalItems } = scrollStateRef.current;\n const currentMaxScrollOffset = Math.max(0, totalItems - currentMaxHeight);\n const newScrollOffset = Math.min(currentMaxScrollOffset, currentScrollOffset + 1);\n setScrollOffset(newScrollOffset);\n forceUpdate({});\n });\n\n // Set up sort action if sortable\n if (sortable) {\n ctx.setAction(\"toggleSort\", () => {\n const nextSort: \"none\" | \"asc\" | \"desc\" = \n sortOrder === \"none\" ? \"asc\" : \n sortOrder === \"asc\" ? \"desc\" : \"none\";\n \n // Store the currently selected item from the current display items\n const currentSelectedItem = displayItems[selectedIndexRef.current];\n \n setSortOrder(nextSort);\n \n // Calculate the new sorted items\n const newSortedItems = nextSort !== \"none\" ? [...items].sort((a, b) => {\n const titleA = titleGetter(a).toLowerCase();\n const titleB = titleGetter(b).toLowerCase();\n if (nextSort === \"asc\") {\n return titleA < titleB ? -1 : titleA > titleB ? 1 : 0;\n } else {\n return titleA > titleB ? -1 : titleA < titleB ? 1 : 0;\n }\n }) : items;\n \n // Find the new index of the selected item in the new sorted list\n const newIndex = newSortedItems.findIndex(item => item === currentSelectedItem);\n if (newIndex !== -1) {\n selectedIndexRef.current = newIndex;\n // Set scroll position to show the selected item at the top\n setScrollOffset(newIndex);\n } else {\n // Fallback: if item not found, select first item\n selectedIndexRef.current = 0;\n setScrollOffset(0);\n }\n \n forceUpdate({});\n });\n\n // Default highlight style (green background, black text, bold)\n const defaultHighlightStyle = {\n color: \"black\",\n backgroundColor: \"green\", \n bold: true\n };\n const highlightStyle = { ...defaultHighlightStyle, ...sortHighlightStyle };\n\n // Create caption that includes sort status\n const sortCaption = () => {\n if (sortOrder === \"none\") {\n return h(Text, {}, \"s to toggle sort\");\n } else {\n const sortLabel = sortOrder === \"asc\" ? \"ASC\" : \"DESC\";\n return h(Text, {}, \n \"s to toggle \",\n h(Text, { color: \"white\", bold: true }, \"sort\"),\n \" \",\n h(Text, highlightStyle, ` ${sortLabel} `)\n );\n }\n };\n\n // Update key bindings with sort\n ctx.setKeyBinding([\n { key: \"upArrow\", caption: \"navigate\", action: \"moveUp\", order: 0 },\n { key: \"downArrow\", caption: \"navigate\", action: \"moveDown\", order: 0 },\n { \n key: \"s\", \n caption: sortCaption,\n action: \"toggleSort\", \n order: 5 \n }\n ]);\n\n // Force update to show the new caption in footer\n ctx.update();\n } else {\n // No sorting\n ctx.setKeyBinding([\n { key: \"upArrow\", caption: \"navigate\", action: \"moveUp\", order: 0 },\n { key: \"downArrow\", caption: \"navigate\", action: \"moveDown\", order: 0 }\n ]);\n }\n }, [sortOrder, sortable]);\n\n const selectedIndex = selectedIndexRef.current;\n \n\n // Default renderer with static scroll indicators for debugging\n const defaultRenderItem = (item: ListItem, isSelected: boolean, displayIndex: number, actualIndex: number) => {\n const isFirstVisible = displayIndex === 0;\n const isLastVisible = displayIndex === visibleItems.length - 1;\n \n // Build prefix with arrows and selection marker\n let arrowPrefix = \"\";\n let selectionPrefix = \"\";\n \n // Only show arrows when scrolling is actually needed and available\n if (isFirstVisible && canScrollUp) {\n arrowPrefix = \"↑ \";\n } else if (isLastVisible && canScrollDown) {\n arrowPrefix = \"↓ \";\n } else {\n // No arrow, but reserve the same space\n arrowPrefix = \" \";\n }\n \n // Always reserve space for selection marker (pad with spaces if not selected)\n if (isSelected) {\n selectionPrefix = selectionMarker;\n } else {\n // Pad with spaces to match the length of the selection marker\n selectionPrefix = \" \".repeat(selectionMarker.length);\n }\n \n return h(Box, { flexDirection: \"row\" },\n // Arrow (clickable if functional, not highlighted)\n h(Text, { \n key: `arrow-${actualIndex}`,\n color: \"white\"\n }, arrowPrefix),\n // Selection marker space (always same width, not highlighted) \n h(Text, { key: `marker-${actualIndex}`, color: \"white\" }, selectionPrefix),\n // Item name (highlighted if selected)\n h(Text, {\n key: `name-${actualIndex}`,\n color: isSelected ? \"black\" : \"white\",\n backgroundColor: isSelected ? \"cyan\" : undefined,\n bold: isSelected\n }, item.name)\n );\n };\n\n // Use custom renderer if provided, otherwise use default\n const itemRenderer = renderItem || defaultRenderItem;\n\n // Render visible menu items with scroll indicators\n return h(Box, { flexDirection: \"column\" },\n ...visibleItems.map((item, displayIndex) => {\n const actualIndex = clampedScrollOffset + displayIndex;\n const isSelected = actualIndex === selectedIndex;\n \n // If using custom renderer, wrap it with scroll indicators\n if (renderItem) {\n const isFirstVisible = displayIndex === 0;\n const isLastVisible = displayIndex === visibleItems.length - 1;\n \n // Build prefix with arrows and selection marker\n let arrowPrefix = \"\";\n let selectionPrefix = \"\";\n \n // Only show arrows when scrolling is actually needed and available\n if (isFirstVisible && canScrollUp) {\n arrowPrefix = \"↑ \";\n } else if (isLastVisible && canScrollDown) {\n arrowPrefix = \"↓ \";\n } else {\n // No arrow, but reserve the same space\n arrowPrefix = \" \";\n }\n \n // Always reserve space for selection marker (pad with spaces if not selected)\n if (isSelected) {\n selectionPrefix = selectionMarker;\n } else {\n // Pad with spaces to match the length of the selection marker\n selectionPrefix = \" \".repeat(selectionMarker.length);\n }\n \n return h(ScreenRow, {\n key: `item-${actualIndex}`,\n children: h(Box, { flexDirection: \"row\" },\n // Arrow (clickable if functional, not highlighted)\n h(Text, { \n key: `arrow-${actualIndex}`,\n color: \"white\"\n }, arrowPrefix),\n // Selection marker space (always same width, not highlighted) \n h(Text, { key: `marker-${actualIndex}`, color: \"white\" }, selectionPrefix),\n // Custom rendered content\n renderItem(item, isSelected, displayIndex)\n )\n });\n } else {\n // Use default renderer (which already includes scroll indicators)\n return h(ScreenRow, {\n key: `item-${actualIndex}`,\n children: itemRenderer(item, isSelected, displayIndex, actualIndex)\n });\n }\n })\n );\n}\n","/**\n * Screen System - Action-based architecture\n */\n\nimport React, { useState, useRef, useEffect, createElement as h } from \"react\";\nimport { render, useInput, Box, Text } from \"ink\";\nimport { ScreenContainer, ScreenRow, ScreenTitle, ScreenDivider, ScreenFooter } from \"./components.js\";\nimport { MultiColumnListComponent, MultiColumnListWithPreviewComponent, ListComponent } from \"./list-components.js\";\n\n// Types\ninterface KeyBinding {\n key: string;\n caption: string | (() => string | JSX.Element);\n action: string;\n order?: number;\n protected?: boolean;\n enabled?: boolean;\n condition?: (ctx: ScreenContext) => boolean;\n}\n\ninterface BindingGroup {\n keys: string[];\n caption: string;\n order: number;\n}\n\ninterface ActionPayload {\n input: string;\n key: any;\n binding: KeyBinding;\n}\n\ninterface ScreenContext {\n setAction: (actionName: string, handlerFn: (payload?: ActionPayload) => void | any) => void;\n setKeyBinding: (bindingOrBindings: KeyBinding | KeyBinding[]) => void;\n updateKeyBinding: (keyName: string, updates: Partial<KeyBinding>) => void;\n removeKeyBinding: (keyName: string) => void;\n addFooter: (item: string | JSX.Element) => void;\n clearFooter: () => void;\n setFooter: (items: string | string[] | JSX.Element | JSX.Element[]) => void;\n update: () => void;\n goBack: () => void;\n close: (result: any) => void;\n parentData: any;\n}\n\ninterface ShowScreenConfig {\n title: string;\n onRender: (ctx: ScreenContext) => JSX.Element;\n parentData?: any;\n}\n\ninterface ShowListScreenConfig {\n title: string;\n items: Array<{ name: string; value: any }>;\n onSelect?: (value: any, index: number) => any;\n onEscape?: (index: number) => any;\n parentData?: any;\n initialSelectedIndex?: number;\n renderItem?: (item: { name: string; value: any }, isSelected: boolean, displayIndex: number) => JSX.Element;\n getTitle?: (item: { name: string; value: any }) => string;\n sortable?: boolean;\n maxHeight?: number;\n sortHighlightStyle?: {\n color?: string;\n backgroundColor?: string;\n bold?: boolean;\n };\n selectionMarker?: string; // Customizable selection marker, default: \" \"\n}\n\ninterface ShowMultiColumnListScreenConfig {\n title: string;\n items: string[];\n onSelect?: (item: string, index: number) => any;\n onEscape?: (index: number) => any;\n parentData?: any;\n initialSelectedIndex?: number;\n}\n\ninterface ShowMultiColumnListWithPreviewScreenConfig {\n title: string;\n items: string[];\n getPreviewContent?: (item: string) => string | JSX.Element | Record<string, any>;\n onSelect?: (item: string, index: number) => any;\n onEscape?: (index: number) => any;\n parentData?: any;\n initialSelectedIndex?: number;\n}\n\n/**\n * Group key bindings by caption for footer display\n */\nexport function groupKeyBindings(bindings: KeyBinding[]): BindingGroup[] {\n const groups: Record<string, BindingGroup> = {};\n\n // Filter out disabled bindings\n const enabledBindings = bindings.filter(b => b.enabled !== false);\n\n enabledBindings.forEach(binding => {\n const caption = typeof binding.caption === \"string\" ? binding.caption : \"\";\n if (!groups[caption]) {\n groups[caption] = {\n keys: [],\n caption: caption,\n order: binding.order || 999\n };\n }\n groups[caption].keys.push(binding.key);\n });\n\n return Object.values(groups);\n}\n\n/**\n * Format key bindings for footer (returns array of strings/components)\n */\nexport function formatKeyBindings(bindings: KeyBinding[], mode: string = \"long\"): (string | JSX.Element)[] {\n // Resolve function captions\n const resolvedBindings = bindings.map(binding => {\n let resolvedCaption = binding.caption;\n\n // If caption is a function, call it\n if (typeof binding.caption === \"function\") {\n resolvedCaption = binding.caption();\n }\n\n return {\n ...binding,\n resolvedCaption\n };\n });\n\n const groups = groupKeyBindings(resolvedBindings.map(b => ({\n ...b,\n caption: typeof b.resolvedCaption === \"string\" ? b.resolvedCaption : \"\"\n })));\n\n // Sort by order\n groups.sort((a, b) => a.order - b.order);\n\n const items: (string | JSX.Element)[] = [];\n\n groups.forEach(group => {\n // Check if any binding in this group has a component/custom caption\n const bindingWithCustom = resolvedBindings.find(b =>\n group.keys.includes(b.key) && typeof b.resolvedCaption !== \"string\"\n );\n\n if (bindingWithCustom && bindingWithCustom.resolvedCaption) {\n // Use the full custom display (component or complex structure)\n items.push(bindingWithCustom.resolvedCaption as JSX.Element);\n } else {\n // Standard format with string caption\n const keyStr = formatKeys(group.keys);\n\n if (mode === \"long\") {\n items.push(`${keyStr} to ${group.caption}`);\n } else {\n items.push(keyStr);\n }\n }\n });\n\n return items;\n}\n\n/**\n * Format keys for display\n */\nexport function formatKeys(keys: string[]): string {\n const keyMap: Record<string, string> = {\n \"escape\": \"esc\",\n \"leftArrow\": \"←\",\n \"rightArrow\": \"→\",\n \"upArrow\": \"↑\",\n \"downArrow\": \"↓\",\n \"return\": \"enter\"\n };\n\n return keys.map(k => keyMap[k] || k).join(\"/\");\n}\n\n/**\n * Show screen with action-based architecture\n */\nexport async function showScreen(config: ShowScreenConfig): Promise<any> {\n const {\n title,\n onRender,\n parentData = {}\n } = config;\n\n\n return new Promise((resolve) => {\n let instance: any;\n\n // Persistent collections (closure variables survive re-renders)\n const keyBindings: KeyBinding[] = [];\n const actions: Record<string, (payload?: ActionPayload) => void | any> = {};\n const customFooterItems: (string | JSX.Element)[] = [];\n let renderResult: JSX.Element | null = null;\n let initialized = false;\n\n const Screen = (): JSX.Element => {\n const [updateCounter, setUpdateCounter] = useState(0);\n\n // Initialize defaults only once\n if (!initialized) {\n const defaultBindings: KeyBinding[] = [\n { key: \"escape\", caption: \"go back\", action: \"back\", protected: true, order: 1 },\n { key: \"leftArrow\", caption: \"go back\", action: \"back\", protected: false, order: 1 }\n // Note: 'select' is not a default - components add it if needed\n ];\n\n // Add defaults\n defaultBindings.forEach(binding => {\n keyBindings.push(binding);\n });\n\n // Default actions\n actions.back = () => {\n cleanup(null);\n };\n\n initialized = true;\n }\n\n // Context for onRender\n const context: ScreenContext = {\n setAction: (actionName: string, handlerFn: (payload?: ActionPayload) => void | any) => {\n actions[actionName] = handlerFn;\n },\n\n setKeyBinding: (bindingOrBindings: KeyBinding | KeyBinding[]) => {\n // Support both single object and array\n const bindingsToSet = Array.isArray(bindingOrBindings) ? bindingOrBindings : [bindingOrBindings];\n\n bindingsToSet.forEach(binding => {\n // Check if key already exists\n const existingIndex = keyBindings.findIndex(b => b.key === binding.key);\n\n if (existingIndex >= 0) {\n const existing = keyBindings[existingIndex];\n\n // Can't override protected keys\n if (existing.protected) {\n console.warn(`Cannot override protected key: ${binding.key}`);\n return;\n }\n\n // Replace binding (keep original order if not specified)\n keyBindings[existingIndex] = {\n ...existing,\n ...binding,\n order: binding.order !== undefined ? binding.order : existing.order,\n enabled: binding.enabled !== undefined ? binding.enabled : (existing.enabled !== undefined ? existing.enabled : true)\n };\n } else {\n // Add new binding\n keyBindings.push({\n protected: false,\n order: 999,\n enabled: true,\n ...binding\n });\n }\n });\n },\n\n updateKeyBinding: (keyName: string, updates: Partial<KeyBinding>) => {\n const index = keyBindings.findIndex(b => b.key === keyName);\n if (index >= 0) {\n // Update only specified properties\n keyBindings[index] = {\n ...keyBindings[index],\n ...updates\n };\n }\n },\n\n removeKeyBinding: (keyName: string) => {\n const index = keyBindings.findIndex(b => b.key === keyName);\n if (index >= 0) {\n if (keyBindings[index].protected) {\n console.warn(`Cannot remove protected key: ${keyName}`);\n return;\n }\n keyBindings.splice(index, 1);\n }\n },\n\n addFooter: (item: string | JSX.Element) => {\n customFooterItems.push(item);\n },\n\n clearFooter: () => {\n customFooterItems.length = 0;\n },\n\n setFooter: (items: string | string[] | JSX.Element | JSX.Element[]) => {\n customFooterItems.length = 0;\n const itemsArray = Array.isArray(items) ? items : [items];\n customFooterItems.push(...itemsArray);\n },\n\n update: () => {\n setUpdateCounter(c => c + 1);\n },\n\n goBack: () => {\n if (actions.back) {\n actions.back();\n }\n },\n\n close: (result: any) => {\n cleanup(result);\n },\n\n parentData\n };\n\n // Call onRender once to let component set up\n if (!renderResult) {\n renderResult = onRender(context);\n }\n\n // Handle input - dispatch to actions\n useInput((input: string, key: any) => {\n // Check Ctrl+C for exit\n if (key.ctrl && input === \"c\") {\n cleanup(null);\n process.exit(0);\n return;\n }\n\n // Find matching key binding\n let matchedBinding: KeyBinding | null = null;\n\n for (const binding of keyBindings) {\n let keyMatches = false;\n\n // Check key match\n if (key[binding.key]) {\n keyMatches = true;\n } else if (input === binding.key) {\n keyMatches = true;\n }\n\n if (keyMatches) {\n // Check if binding is enabled\n if (binding.enabled === false) {\n continue;\n }\n\n // Check condition if present\n if (binding.condition && !binding.condition(context)) {\n continue;\n }\n\n matchedBinding = binding;\n break;\n }\n }\n\n if (matchedBinding && actions[matchedBinding.action]) {\n // Execute action\n const actionResult = actions[matchedBinding.action]({\n input,\n key,\n binding: matchedBinding\n });\n\n // If action returns a value, might be used for something\n // For now, actions manage their own state via closures\n }\n });\n\n // Build footer\n const footerLines: (string | JSX.Element | (string | JSX.Element)[])[] = [];\n\n // Add key bindings (returns array of strings/components)\n const bindingItems = formatKeyBindings(keyBindings, \"long\");\n\n if (bindingItems.length > 0) {\n // Build a single line with all binding items separated by \", \"\n const bindingsLine: (string | JSX.Element)[] = [];\n bindingItems.forEach((item, idx) => {\n if (idx > 0) {\n bindingsLine.push(\", \");\n }\n bindingsLine.push(item);\n });\n\n // If all items are strings, join them; otherwise create a Box\n const allStrings = bindingItems.every(item => typeof item === \"string\");\n if (allStrings) {\n footerLines.push(bindingsLine.join(\"\"));\n } else {\n // Mixed strings and components - wrap all strings in Text components\n const wrappedBindingsLine = bindingsLine.map(item => \n typeof item === \"string\" ? h(Text, {}, item) : item\n );\n footerLines.push(wrappedBindingsLine);\n }\n }\n\n // Add custom footer items\n customFooterItems.forEach(item => {\n if (typeof item === \"string\") {\n footerLines.push(item);\n } else {\n footerLines.push(item);\n }\n });\n\n return h(ScreenContainer, {},\n h(ScreenTitle, { text: title }),\n h(ScreenDivider),\n h(ScreenRow, {}, h(Text, {}, \" \")),\n renderResult,\n h(ScreenRow, {}, h(Text, {}, \" \")),\n h(ScreenDivider),\n h(ScreenFooter, { lines: footerLines })\n );\n };\n\n const cleanup = (result: any) => {\n if (instance) instance.unmount();\n setTimeout(() => resolve(result), 50);\n };\n\n instance = render(h(Screen));\n });\n}\n\n/**\n * Helper: Show list screen (single column menu)\n */\nexport async function showListScreen(config: ShowListScreenConfig): Promise<any> {\n const { title, items, onSelect, onEscape, parentData, initialSelectedIndex = 0, renderItem, getTitle, sortable, maxHeight, sortHighlightStyle, selectionMarker } = config;\n\n return showScreen({\n title,\n parentData,\n onRender: (ctx) => {\n // Shared state ref\n const selectedIndexRef = { current: initialSelectedIndex };\n\n // Set up select action at screen level\n ctx.setAction(\"select\", () => {\n const selected = items[selectedIndexRef.current];\n if (onSelect) {\n const result = onSelect(selected.value, selectedIndexRef.current);\n ctx.close(result);\n }\n });\n\n // Set up back action if provided\n if (onEscape) {\n ctx.setAction(\"back\", () => {\n const result = onEscape(selectedIndexRef.current);\n ctx.close(result);\n });\n }\n\n // Add select key binding\n ctx.setKeyBinding({ key: \"return\", caption: \"select\", action: \"select\", order: 2 });\n\n // Return the component (it will set up its own navigation actions and bindings)\n return h(ListComponent, { items, ctx, selectedIndexRef, renderItem, getTitle, sortable, maxHeight, sortHighlightStyle, selectionMarker });\n }\n });\n}\n\n/**\n * Helper: Show multi-column list screen (grid layout)\n */\nexport async function showMultiColumnListScreen(config: ShowMultiColumnListScreenConfig): Promise<any> {\n const { title, items, onSelect, onEscape, parentData, initialSelectedIndex = 0 } = config;\n\n return showScreen({\n title,\n parentData,\n onRender: (ctx) => {\n // Shared state ref\n const selectedIndexRef = { current: initialSelectedIndex };\n\n // Set up select action at screen level\n ctx.setAction(\"select\", () => {\n const selected = items[selectedIndexRef.current];\n if (onSelect) {\n const result = onSelect(selected, selectedIndexRef.current);\n ctx.close(result);\n }\n });\n\n // Set up back action if provided\n if (onEscape) {\n ctx.setAction(\"back\", () => {\n const result = onEscape(selectedIndexRef.current);\n ctx.close(result);\n });\n }\n\n // Add select key binding\n ctx.setKeyBinding({ key: \"return\", caption: \"select\", action: \"select\", order: 2 });\n\n // Return the component (it will set up its own navigation actions and bindings)\n return h(MultiColumnListComponent, { items, ctx, selectedIndexRef });\n }\n });\n}\n\n/**\n * Helper: Show multi-column list with preview panel below\n */\nexport async function showMultiColumnListWithPreviewScreen(config: ShowMultiColumnListWithPreviewScreenConfig): Promise<any> {\n const { title, items, getPreviewContent, onSelect, onEscape, parentData, initialSelectedIndex = 0 } = config;\n\n return showScreen({\n title,\n parentData,\n onRender: (ctx) => {\n // Shared state ref\n const selectedIndexRef = { current: initialSelectedIndex };\n\n // Set up select action at screen level\n ctx.setAction(\"select\", () => {\n const selected = items[selectedIndexRef.current];\n if (onSelect) {\n const result = onSelect(selected, selectedIndexRef.current);\n ctx.close(result);\n }\n });\n\n // Set up back action if provided\n if (onEscape) {\n ctx.setAction(\"back\", () => {\n const result = onEscape(selectedIndexRef.current);\n ctx.close(result);\n });\n }\n\n // Add select key binding\n ctx.setKeyBinding({ key: \"return\", caption: \"select\", action: \"select\", order: 2 });\n\n // Return the component (it will set up its own navigation actions and bindings)\n return h(MultiColumnListWithPreviewComponent, { items, getPreviewContent, ctx, selectedIndexRef });\n }\n });\n}\n\n// Backward compatibility aliases\nexport const showMenuScreen = showListScreen;\nexport const showWordGridScreen = showMultiColumnListScreen;\n","/**\n * Reusable UI elements for the screen system\n */\n\nimport React, { createElement as h } from \"react\";\nimport { Box, Text } from \"ink\";\n\n// Types\nexport interface ListItemProps {\n children: React.ReactNode;\n isSelected?: boolean;\n color?: string;\n backgroundColor?: string;\n bold?: boolean;\n dimColor?: boolean;\n}\n\nexport interface TextBlockProps {\n text: string;\n color?: string;\n dimmed?: boolean;\n bold?: boolean;\n maxWidth?: number;\n}\n\nexport interface DividerProps {\n character?: string;\n width?: number;\n}\n\nexport interface GridCellProps {\n children: React.ReactNode;\n width?: number;\n color?: string;\n backgroundColor?: string;\n bold?: boolean;\n dimColor?: boolean;\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport interface InputFieldProps {\n prompt: string;\n value: string;\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n}\n\n/**\n * List item component\n */\nexport function ListItem({ \n children, \n isSelected = false, \n color = \"white\", \n backgroundColor, \n bold = false, \n dimColor = false \n}: ListItemProps): JSX.Element {\n return h(Box, {},\n h(Text, {\n color: isSelected ? backgroundColor || \"green\" : color,\n backgroundColor: isSelected ? color : backgroundColor,\n bold: isSelected || bold,\n dimColor: !isSelected && dimColor\n }, children)\n );\n}\n\n/**\n * Text block component with customizable styling\n */\nexport function TextBlock({ \n text, \n color = \"white\", \n dimmed = false, \n bold = false, \n maxWidth \n}: TextBlockProps): JSX.Element {\n return h(Box, {},\n h(Text, { \n color, \n dimColor: dimmed, \n bold \n }, text)\n );\n}\n\n/**\n * Horizontal divider\n */\nexport function Divider({ character = \"─\", width = 80 }: DividerProps): JSX.Element {\n return h(Box, { marginY: 1 },\n h(Text, { dimColor: true }, character.repeat(width))\n );\n}\n\n/**\n * Grid cell component\n */\nexport function GridCell({ \n children, \n width, \n color = \"white\", \n backgroundColor, \n bold = false, \n dimColor = false, \n align = \"left\" \n}: GridCellProps): JSX.Element {\n return h(Box, { width },\n h(Text, {\n color,\n backgroundColor,\n bold,\n dimColor,\n textAlign: align\n }, children)\n );\n}\n\n/**\n * Input field component\n */\nexport function InputField({ prompt, value, onChange, onSubmit }: InputFieldProps): JSX.Element {\n return h(Box, { flexDirection: \"column\" },\n h(Text, {}, prompt),\n h(Box, { marginTop: 1 },\n h(Text, { color: \"cyan\" }, \" > \", value, \"_\")\n )\n );\n}","/**\n * Utility functions for Screen System\n */\n\n/**\n * Build breadcrumb-style title\n * @param parts - Parts of the breadcrumb path\n * @returns Formatted breadcrumb\n *\n * Examples:\n * buildBreadcrumb(['Menu']) → 'Menu'\n * buildBreadcrumb(['Menu', 'Info']) → '← Info'\n * buildBreadcrumb(['Menu', 'Words', 'nefarious']) → '← Words ← nefarious'\n */\nexport function buildBreadcrumb(parts: string[]): string {\n if (parts.length === 0) return \"\";\n if (parts.length === 1) return parts[0];\n\n // Skip first part (root), add arrows with spaces to rest\n return parts.slice(1).map(part => `← ${part}`).join(\" \");\n}\n\n/**\n * Create multi-line breadcrumb with details\n * @param path - Navigation path\n * @param suffix - Additional suffix (e.g., 'Details')\n * @returns Formatted breadcrumb with suffix\n *\n * Example:\n * buildDetailBreadcrumb(['Menu', 'Words', 'nefarious'], 'Details')\n * → '← Words ← nefarious Details'\n */\nexport function buildDetailBreadcrumb(path: string[], suffix: string = \"\"): string {\n if (path.length <= 1) {\n return suffix ? `← ${suffix}` : path[0] || \"\";\n }\n\n const breadcrumb = buildBreadcrumb(path);\n return suffix ? `${breadcrumb} ${suffix}` : breadcrumb;\n}\n","/**\n * Footer builder - composes footer messages from multiple sources\n */\n\ninterface FooterConfig {\n navigation?: string | string[];\n actions?: string | string[];\n info?: string | string[];\n escape?: string | string[];\n custom?: string | string[];\n}\n\n/**\n * Build footer lines from multiple message sources\n *\n * @param config - Footer configuration object\n * @returns Array of footer lines\n */\nexport function buildFooter(config: FooterConfig = {}): string[] {\n const {\n navigation = null,\n actions = null,\n info = null,\n escape = \"Esc to go back\",\n custom = null\n } = config;\n\n const lines: string[] = [];\n\n // Build main help line (navigation + actions + escape)\n const mainParts: (string | string[])[] = [];\n\n if (navigation) {\n mainParts.push(navigation);\n }\n\n if (actions) {\n mainParts.push(actions);\n }\n\n if (escape) {\n mainParts.push(escape);\n }\n\n if (mainParts.length > 0) {\n lines.push(mainParts.join(\", \"));\n }\n\n // Add info line if present\n if (info) {\n const infoLines = Array.isArray(info) ? info : [info];\n lines.push(...infoLines);\n }\n\n // Add custom lines if present\n if (custom) {\n const customLines = Array.isArray(custom) ? custom : [custom];\n lines.push(...customLines);\n }\n\n return lines;\n}\n\n/**\n * Predefined footer configurations for common screen types\n */\nexport const FooterPresets = {\n /**\n * Menu screen footer\n */\n menu: (customInfo: string | string[] | null = null): string[] => buildFooter({\n navigation: \"↑/↓ to navigate\",\n actions: \"Enter to select\",\n escape: \"Esc to go back\",\n info: customInfo\n }),\n\n /**\n * Word grid footer\n */\n wordGrid: (totalWords: number): string[] => buildFooter({\n navigation: \"↑↓←→ to navigate\",\n actions: \"Enter to select\",\n escape: \"Esc to go back\",\n info: `Total: ${totalWords} words`\n }),\n\n /**\n * Text input footer\n */\n textInput: (): string[] => buildFooter({\n actions: \"Type and press Enter to submit\",\n escape: \"Esc to cancel\"\n }),\n\n /**\n * Info/static screen footer\n */\n info: (): string[] => buildFooter({\n escape: \"Esc to continue\"\n }),\n\n /**\n * Main menu footer (escape exits)\n */\n mainMenu: (): string[] => buildFooter({\n navigation: \"↑/↓ to navigate\",\n actions: \"Enter to select\",\n escape: \"Esc to exit\"\n }),\n\n /**\n * Action menu footer (for word cards, etc.)\n */\n actionMenu: (hasAudio: boolean = false): string[] => {\n const parts = buildFooter({\n navigation: \"↑/↓ to navigate\",\n actions: \"Enter to select\",\n escape: \"Esc to go back\"\n });\n\n if (hasAudio) {\n parts.push(\"Audio available\");\n }\n\n return parts;\n }\n};\n\n/**\n * Combine multiple footer messages into organized lines\n * Smart grouping of related messages\n *\n * @param messages - Individual footer messages\n * @returns Organized footer lines\n */\nexport function organizeFooterMessages(messages: string[] | null | undefined): string[] {\n if (!messages || messages.length === 0) {\n return [\"Esc to go back\"];\n }\n\n // Group similar messages\n const navigation = messages.filter(m => m.includes(\"↑\") || m.includes(\"↓\") || m.includes(\"←\") || m.includes(\"→\"));\n const actions = messages.filter(m => m.includes(\"Enter\") || m.includes(\"select\") || m.includes(\"submit\"));\n const escape = messages.filter(m => m.includes(\"Esc\"));\n const others = messages.filter(m =>\n !navigation.includes(m) &&\n !actions.includes(m) &&\n !escape.includes(m)\n );\n\n const lines: string[] = [];\n\n // Combine navigation, actions, and escape on one line\n const mainLine = [...navigation, ...actions, ...escape].join(\", \");\n if (mainLine) lines.push(mainLine);\n\n // Add other messages as separate lines\n lines.push(...others);\n\n return lines;\n}\n","/**\n * Screen System - Action-based architecture\n * Converted from legacy/screenSystem/src\n */\n\n// Re-export React and React hooks (encapsulated)\nimport React, { useState, useEffect, useRef, useMemo, useCallback, createElement } from \"react\";\nexport { React, useState, useEffect, useRef, useMemo, useCallback };\nexport { createElement as h };\n\n// Re-export Ink components (encapsulated)\nexport { Box, Text, useInput } from \"ink\";\n\n// Screen functions\nexport {\n showScreen,\n showListScreen,\n showMultiColumnListScreen,\n showMultiColumnListWithPreviewScreen,\n // Backward compatibility aliases\n showMenuScreen,\n showWordGridScreen\n} from \"./screens.js\";\n\n// Reusable components\nexport { MultiColumnListComponent, MultiColumnListWithPreviewComponent, ListComponent } from \"./list-components.js\";\nexport { ScreenContainer, ScreenRow, ScreenTitle, ScreenBody, ScreenFooter, ScreenDivider } from \"./components.js\";\nexport { ListItem, TextBlock, Divider, GridCell, InputField } from \"./ui-elements.js\";\n\n// Utilities\nexport { buildBreadcrumb, buildDetailBreadcrumb } from \"./utils.js\";\nexport { buildFooter, FooterPresets, organizeFooterMessages } from \"./footer-builder.js\";\n\n// For CommonJS compatibility: pre-load ESM dependencies\nlet loadPromise: Promise<void> | null = null;\nexport async function load(): Promise<void> {\n if (loadPromise) return loadPromise;\n loadPromise = Promise.all([\n import(\"react\"),\n import(\"ink\")\n ]).then(() => {}) as Promise<void>;\n return loadPromise;\n}\n// Auto-load in ESM, but CJS users should call load() explicitly\nif (typeof window === 'undefined') {\n load().catch(() => {\n // Ignore errors during auto-load, user can call load() explicitly\n });\n}\n","/**\n * Init module exports\n */\nexport * from \"./init/index.js\";\nexport * from \"./init/types.js\";\n\n","// Arguments discovery and parsing module\n// This module provides utilities for parsing CLI arguments and detecting flags\n\nimport { readFileSync, existsSync } from \"fs\";\nimport { resolve, dirname, basename, extname, join, isAbsolute } from \"path\";\nimport { config } from \"dotenv\";\n\nexport interface ArgsConfig {\n args?: string[]; // Default: process.argv.slice(2)\n aliases?: Record<string, string>; // Short → long mapping\n overrides?: Record<string, any>; // Highest precedence\n defaults?: Record<string, any>; // Lowest precedence\n prefixes?: string[]; // Negative flag prefixes (default: [\"not\", \"no\"])\n}\n\nexport interface ParsedArgs {\n command: string;\n flags: Record<string, boolean>;\n options: Record<string, string>;\n usedKeys: string[];\n}\n\n/**\n * Parse command line arguments with support for aliases, overrides, and defaults\n *\n * Precedence order (highest to lowest):\n * 1. Overrides (constructor config)\n * 2. CLI args (command line)\n * 3. Config files (loaded from files)\n * 4. Environment variables (process.env)\n * 5. Defaults (constructor config)\n */\nexport class Args {\n private args: Record<string, any> = {};\n private flags: Record<string, boolean> = {};\n private options: Record<string, string> = {};\n private commands: string[] = [];\n private usedKeys: Set<string> = new Set();\n private aliases: Record<string, string> = {};\n private overrides: Record<string, any> = {};\n private defaults: Record<string, any> = {};\n private prefixes: string[] = [];\n private nots: string[] = [];\n private configValues: Record<string, any> = {};\n private configsLoaded: string[] = [];\n private env: string = \"local\";\n\n constructor(config: ArgsConfig = {}) {\n // Set defaults first\n this.aliases = {};\n this.overrides = {};\n this.defaults = {};\n this.prefixes = [\"not\", \"no\"];\n\n // Apply configuration\n if (Object.keys(config).length > 0) {\n this.configure(config);\n }\n\n // Parse arguments first to get environment\n const args = config.args || process.argv.slice(2);\n this.parseArgs(args);\n\n // Set environment from parsed args\n this.env = this.get(\"env\")?.toLowerCase() || \"local\";\n\n // Load .env file\n this.loadDotEnv();\n\n // Load configuration files\n this.loadConfigFiles();\n\n // Check for conflicts (short + long form of same option)\n this.checkConflicts();\n }\n\n /**\n * Configure Args options\n * Only parameters present in config are updated\n * Note: Args is special - it's initialized first, so it can't take context\n */\n configure(config: Partial<ArgsConfig>): void {\n if (config.aliases !== undefined) {\n this.aliases = config.aliases;\n }\n if (config.overrides !== undefined) {\n this.overrides = config.overrides;\n }\n if (config.defaults !== undefined) {\n this.defaults = config.defaults;\n }\n if (config.prefixes !== undefined) {\n this.prefixes = config.prefixes;\n }\n // Note: args array can't be reconfigured after construction\n }\n\n /**\n * Initialize Args instance\n * Note: Args is special - it's initialized first, so it can't take context\n * This static method is for consistency with other components\n */\n static init(config: ArgsConfig = {}): Args {\n return new Args(config);\n }\n\n /**\n * Parse command line arguments\n */\n private parseArgs(args: string[]): void {\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n\n if (arg.startsWith(\"--\")) {\n // Long option: --key=value or --key\n const [key, value] = this.parseLongOption(arg);\n this.setValue(key, value);\n i++;\n } else if (arg.startsWith(\"-\")) {\n // Short option: -k=value, -k, or bundled -vsd\n const result = this.parseShortOption(arg, args, i);\n if (result.consumed > 0) {\n i += result.consumed;\n } else {\n i++;\n }\n } else {\n // Command (no prefix)\n this.commands.push(arg);\n i++;\n }\n }\n }\n\n /**\n * Parse long option (--key=value or --key)\n */\n private parseLongOption(arg: string): [string, string | boolean] {\n const key = arg.slice(2); // Remove '--'\n\n // Check for negative flags (--no-debug, --not-verbose)\n const prefix = this.prefixes.find((p) => key.startsWith(p));\n if (prefix) {\n let strippedKey = key.slice(prefix.length);\n // Remove leading dash if present\n if (strippedKey.startsWith(\"-\")) {\n strippedKey = strippedKey.slice(1);\n }\n this.nots.push(key);\n return [strippedKey, false];\n }\n\n if (key.includes(\"=\")) {\n // --key=value - need to handle quoted values properly\n const eqIndex = key.indexOf(\"=\");\n const optionKey = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n return [optionKey, this.parseValue(value)];\n } else {\n // --key (boolean flag)\n return [key, true];\n }\n }\n\n /**\n * Parse short option (-k=value, -k, or bundled -vsd)\n */\n private parseShortOption(arg: string, args: string[], index: number): { consumed: number } {\n const key = arg.slice(1); // Remove '-'\n\n // Check if it's a single short flag with value (like -vo file.txt)\n if (key.length === 1 && index + 1 < args.length && !args[index + 1].startsWith(\"-\")) {\n // Single short flag with separate value\n const value = args[index + 1];\n this.setValue(key, this.parseValue(value));\n return { consumed: 2 }; // Consumed this flag and the next argument\n }\n\n // Check if it's a bundled short flags (like -vsd)\n if (key.length > 1 && !key.includes(\"=\")) {\n // Handle bundled flags: -vsd = -v -s -d\n // Process each character, valid ones become flags, invalid ones become unused\n for (let i = 0; i < key.length; i++) {\n const shortKey = key[i];\n if (shortKey in this.aliases) {\n this.setValue(shortKey, true);\n } else {\n // Invalid short flag - add to unused keys\n this.args[shortKey] = true;\n }\n }\n return { consumed: 1 };\n }\n\n if (key.includes(\"=\")) {\n // -k=value or -vsdk=4 - need to handle quoted values properly\n const eqIndex = key.indexOf(\"=\");\n const optionKey = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n\n // Check if this is a bundled flag with value on the last one (like -vsdk=4)\n if (optionKey.length > 1) {\n // Handle bundled flags with value on the last one: -vsdk=4 = -v -s -d -k=4\n for (let i = 0; i < optionKey.length - 1; i++) {\n const shortKey = optionKey[i];\n if (shortKey in this.aliases) {\n this.setValue(shortKey, true);\n } else {\n this.args[shortKey] = true;\n }\n }\n // Handle the last flag with value\n const lastKey = optionKey[optionKey.length - 1];\n if (lastKey in this.aliases) {\n this.setValue(lastKey, this.parseValue(value));\n } else {\n this.args[lastKey] = this.parseValue(value);\n }\n } else {\n // Single flag with value: -k=value\n this.setValue(optionKey, this.parseValue(value));\n }\n return { consumed: 1 };\n } else {\n // -k (boolean flag)\n this.setValue(key, true);\n return { consumed: 1 };\n }\n }\n\n /**\n * Parse value (handle quotes)\n */\n private parseValue(value: string): string {\n // Remove surrounding quotes if present\n if (\n (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n }\n\n /**\n * Set a value with proper categorization\n */\n private setValue(key: string, value: string | boolean): void {\n // Resolve alias if it's a short form\n const resolvedKey = this.aliases[key] || key;\n\n if (typeof value === \"boolean\") {\n this.flags[resolvedKey] = value;\n } else {\n this.options[resolvedKey] = value;\n }\n\n // Always set the value in lowercase (for case-insensitive lookup, like legacy)\n this.args[resolvedKey.toLowerCase()] = value;\n }\n\n /**\n * Check for conflicts (short + long form of same option)\n */\n private checkConflicts(): void {\n const conflicts: string[] = [];\n\n for (const [shortKey, longKey] of Object.entries(this.aliases)) {\n const hasShort = this.args[shortKey] !== undefined;\n const hasLong = this.args[longKey] !== undefined;\n\n if (hasShort && hasLong) {\n conflicts.push(`Both -${shortKey} and --${longKey} specified`);\n }\n }\n\n if (conflicts.length > 0) {\n throw new Error(`Argument conflicts: ${conflicts.join(\", \")}`);\n }\n }\n\n /**\n * Get a value with precedence order\n */\n get(key: string): any {\n const resolvedKey = this.aliases[key] || key;\n // Mark the lowercase version as used since args are stored in lowercase\n // This ensures getUnused() correctly identifies used keys\n const lcKey = resolvedKey.toLowerCase();\n this.usedKeys.add(lcKey);\n\n // Precedence order: overrides > CLI args > config files > env vars > defaults\n if (this.overrides[resolvedKey] !== undefined) {\n return this.overrides[resolvedKey];\n }\n\n // Case-insensitive lookup for CLI args (like legacy)\n\n // Try environment-specific CLI args first (e.g., --silent_local, --debug_production)\n const lcKeyWithEnv = `${lcKey}${this.env ? `_${this.env.toLowerCase()}` : \"\"}`;\n if (this.env && this.args[lcKeyWithEnv] !== undefined) {\n return this.args[lcKeyWithEnv];\n } else if (this.args[lcKey] !== undefined) {\n return this.args[lcKey];\n }\n\n // Config file values (case-sensitive)\n if (this.configValues[resolvedKey] !== undefined) {\n return this.configValues[resolvedKey];\n }\n\n // Environment variable (convert key to ENV_VAR format)\n const envKey = this.toEnvKey(resolvedKey);\n const envKeyWithEnv = `${envKey}${this.env ? `_${this.env.toUpperCase()}` : \"\"}`;\n\n // Try environment-specific env vars first (e.g., SILENT_LOCAL, DEBUG_PRODUCTION)\n const envSpecificKey = Object.keys(process.env).find(\n (k) => this.env && k.toUpperCase() === envKeyWithEnv\n );\n const envKeyFound = Object.keys(process.env).find((k) => k.toUpperCase() === envKey);\n\n if (envSpecificKey) {\n return process.env[envSpecificKey];\n } else if (envKeyFound) {\n return process.env[envKeyFound];\n }\n\n // Default value\n if (this.defaults[resolvedKey] !== undefined) {\n return this.defaults[resolvedKey];\n }\n\n // NODE_ENV fallback for 'env' key (like legacy)\n if (resolvedKey === \"env\" && process.env.NODE_ENV !== undefined) {\n return process.env.NODE_ENV;\n }\n\n return undefined;\n }\n\n /**\n * Set a value (for testing/internal use)\n */\n set(key: string, value: any): void {\n this.args[key] = value;\n }\n\n /**\n * Check if a command exists (case-insensitive)\n */\n hasCommand(cmd: string): boolean {\n return this.commands.some((command) => command.toLowerCase() === cmd.toLowerCase());\n }\n\n /**\n * Get all commands\n */\n getCommands(): string[] {\n return [...this.commands];\n }\n\n /**\n * Get used keys (as array)\n */\n getUsed(): string[] {\n return Array.from(this.usedKeys);\n }\n\n /**\n * Get unused keys (as array)\n */\n getUnused(): string[] {\n const unused: string[] = [];\n\n for (const key of Object.keys(this.args)) {\n if (!this.usedKeys.has(key) && !this.nots.includes(key)) {\n unused.push(key);\n }\n }\n\n return unused;\n }\n\n /**\n * Convert key to environment variable format\n */\n private toEnvKey(key: string): string {\n return key\n .replace(/[A-Z0-9]/g, (match, offset) =>\n offset === 0 ? match : \"_\" + match.toLowerCase()\n )\n .toUpperCase();\n }\n\n /**\n * Load .env file\n */\n private loadDotEnv(): void {\n const dotEnvPath = this.get(\"dotEnvPath\") || process.cwd();\n const dotEnvFile = this.get(\"dotEnvFile\") || \".env\";\n\n // If custom dotEnvFile is specified, use it as-is\n if (this.get(\"dotEnvFile\")) {\n const customPath = resolve(dotEnvPath, dotEnvFile);\n if (existsSync(customPath)) {\n config({ path: customPath, quiet: true });\n }\n return;\n }\n\n // Try environment-specific .env file first (e.g., .env.local, .env.production)\n let dotEnvPathFile: string | null = null;\n\n const envSpecificFile = `.env.${this.env}`;\n const envSpecificPath = resolve(dotEnvPath, envSpecificFile);\n if (existsSync(envSpecificPath)) {\n dotEnvPathFile = envSpecificPath;\n }\n\n // If no environment-specific file found in current directory, try examples folder\n if (!dotEnvPathFile && !this.get(\"dotEnvPath\")) {\n const examplesPath = resolve(dotEnvPath, \"examples\");\n const examplesEnvSpecificPath = resolve(examplesPath, envSpecificFile);\n if (existsSync(examplesEnvSpecificPath)) {\n dotEnvPathFile = examplesEnvSpecificPath;\n }\n }\n\n // If no environment-specific file found, try default .env\n if (!dotEnvPathFile) {\n dotEnvPathFile = resolve(dotEnvPath, dotEnvFile);\n\n // If .env file doesn't exist in current directory, try examples folder (for our examples)\n if (!existsSync(dotEnvPathFile)) {\n if (!this.get(\"dotEnvPath\")) {\n // Try examples folder first (for our examples)\n const examplesPath = resolve(dotEnvPath, \"examples\");\n const examplesEnvFile = resolve(examplesPath, dotEnvFile);\n if (existsSync(examplesEnvFile)) {\n dotEnvPathFile = examplesEnvFile;\n } else {\n // Try parent directory (like legacy)\n dotEnvPathFile = resolve(dotEnvPath, \"..\", dotEnvFile);\n }\n }\n }\n }\n\n // Load .env file if it exists\n if (dotEnvPathFile && existsSync(dotEnvPathFile)) {\n config({ path: dotEnvPathFile, quiet: true });\n }\n }\n\n /**\n * Load configuration files\n */\n private loadConfigFiles(): void {\n this.configsLoaded = [];\n this.configValues = {};\n\n const _defaultConfigExtension = this.get(\"defaultConfigExtension\") || \"js\";\n const optConfigFiles = this.get(\"config\") || this.get(\"configs\") || \"\";\n const configFiles = optConfigFiles ? optConfigFiles.split(/,\\s*/) : [];\n const optConfigFilePath = this.get(\"configPath\");\n\n if (configFiles.length > 0) {\n for (const cfgFile of configFiles) {\n let notLoaded = false;\n let notLoadedEnvSpecific = false;\n\n const cfgFileWithPath = this.resolveFileWithPath(optConfigFilePath, cfgFile);\n try {\n const cfgContents = this.requireConfigFile(cfgFileWithPath);\n this.configValues = { ...this.configValues, ...cfgContents };\n this.configsLoaded.push(cfgFileWithPath);\n } catch {\n notLoaded = true;\n }\n\n const cfgEnvFileWithPath = this.resolveFileWithPath(\n optConfigFilePath,\n cfgFile,\n this.env\n );\n if (cfgEnvFileWithPath !== cfgFileWithPath) {\n try {\n const cfgContents = this.requireConfigFile(cfgEnvFileWithPath);\n this.configValues = { ...this.configValues, ...cfgContents };\n this.configsLoaded.push(cfgEnvFileWithPath);\n } catch {\n notLoadedEnvSpecific = true;\n }\n } else {\n notLoadedEnvSpecific = true;\n }\n\n if (notLoaded && notLoadedEnvSpecific) {\n throw new Error(`can't load config file \"${cfgFileWithPath}\"`);\n }\n }\n }\n }\n\n /**\n * Resolve file path with environment-specific naming\n */\n private resolveFileWithPath(\n optConfigFilePath: string | undefined,\n cfgFile: string,\n env?: string\n ): string {\n let cfgFileWithPath = optConfigFilePath\n ? isAbsolute(optConfigFilePath)\n ? resolve(optConfigFilePath, cfgFile)\n : resolve(process.cwd(), optConfigFilePath, cfgFile)\n : isAbsolute(cfgFile)\n ? cfgFile\n : resolve(process.cwd(), cfgFile);\n\n const { basePathWithName, extension } = this.splitPath(cfgFileWithPath);\n if (env) {\n cfgFileWithPath = `${basePathWithName}.${env}.${extension || \"js\"}`;\n } else {\n cfgFileWithPath = `${basePathWithName}.${extension || \"js\"}`;\n }\n return cfgFileWithPath;\n }\n\n /**\n * Split file path into base path and extension\n */\n private splitPath(filePath: string): { basePathWithName: string; extension: string } {\n const basePathWithName = join(dirname(filePath), basename(filePath, extname(filePath)));\n const extension = extname(filePath).slice(1);\n return { basePathWithName, extension };\n }\n\n /**\n * Require a configuration file (supports .js and .json)\n */\n private requireConfigFile(filePath: string): any {\n if (!existsSync(filePath)) {\n throw new Error(`Config file not found: ${filePath}`);\n }\n\n const ext = extname(filePath).toLowerCase();\n if (ext === \".json\") {\n const content = readFileSync(filePath, \"utf8\");\n return JSON.parse(content);\n } else if (ext === \".js\") {\n // For .js files, use require() which is safer than eval\n try {\n // Clear require cache to ensure fresh load\n delete require.cache[require.resolve(filePath)];\n return require(filePath);\n } catch (error) {\n throw new Error(`Failed to load JS config file: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n throw new Error(`Unsupported file extension: ${ext}`);\n }\n }\n\n /**\n * Get all parsed data\n */\n getParsed(): ParsedArgs {\n return {\n command: this.commands[0] || \"\",\n flags: { ...this.flags },\n options: { ...this.options },\n usedKeys: Array.from(this.usedKeys)\n };\n }\n\n /**\n * Set prefixes dynamically and re-parse arguments (like legacy)\n */\n setPrefixes(prefixes: string | string[]): void {\n const arr = Array.isArray(prefixes) ? prefixes : prefixes.split(/,\\s*/);\n const sortedArr = arr.sort((a, b) =>\n a.length < b.length ? 1 : a.length > b.length ? -1 : 0\n );\n this.prefixes = sortedArr.map((el) => el.toLowerCase());\n // Re-parse arguments with new prefixes\n const args = process.argv.slice(2);\n this.parseArgs(args);\n }\n}\n\n// Singleton pattern (like legacy)\nlet instance: Args | null = null;\n\n/**\n * Initialize Args instance (singleton pattern)\n */\nexport function init(args?: string[]): Args {\n instance = new Args({ args });\n return instance;\n}\n\n/**\n * Get the current Args instance (singleton pattern)\n */\nexport function getArgsInstance(): Args | null {\n return instance;\n}\n\n\n","import Joi from \"joi\";\nimport { ParamError } from \"../errors\";\nimport { joiEdateType, joiStringArrayType } from \"./custom-types\";\n\n/**\n * Parameter definition types\n */\nexport type ParamDefinition = \n | string \n | Joi.Schema \n | { \n type?: string | Joi.Schema; \n values?: any[]; \n [key: string]: any; \n };\n\nexport type ParamGetter = (key: string, definition?: any) => any;\nexport type ParamSetter = (key: string, value: any) => boolean;\n\n/**\n * Args instance interface\n */\nexport interface ArgsInstance {\n get(key: string): any;\n}\n\n/**\n * Params constructor options\n */\nexport interface ParamsOptions {\n [key: string]: any;\n}\n\n/**\n * Tracked parameter information for --stopAfter=init\n */\ninterface TrackedParam {\n key: string;\n definition: ParamDefinition;\n value: any;\n source: \"cli\" | \"options\" | \"default\";\n}\n\n/**\n * Params class for parameter validation and type checking\n * Built on top of Args library with Joi validation\n */\nexport class Params {\n private context: any; // Partial context during initialization\n private params: Record<string, any> = {};\n private definitions: Record<string, any> = {};\n private args: ArgsInstance;\n private paramSetters: ParamSetter[] = [];\n private paramGetters: ParamGetter[] = [];\n private trackedParams: TrackedParam[] = [];\n\n constructor(context: any, options: ParamsOptions = {}) {\n // Context might be partial during initialization\n this.context = context;\n this.args = context.args;\n\n // Apply initial configuration\n if (Object.keys(options).length > 0) {\n this.configure(options);\n }\n }\n\n /**\n * Configure parameters\n * Only parameters present in options are updated\n */\n configure(options: ParamsOptions): void {\n for (const [k, v] of Object.entries(options)) {\n // TODO: opt values might be an object with definitions in it, so perhaps `this.set` should be used\n this.params[k] = v;\n }\n }\n\n /**\n * Initialize Params from context and CLI parameters\n * Note: Params is special - it's initialized early with partial context\n */\n static init(context: any, options?: ParamsOptions): Params {\n return new Params(context, options || {});\n }\n\n /**\n * Track a parameter request for --stopAfter=init feature\n */\n private trackParam(key: string, definition: ParamDefinition, value: any, source: \"cli\" | \"options\" | \"default\"): void {\n this.trackedParams.push({\n key,\n definition,\n value,\n source\n });\n }\n\n /**\n * Get all tracked parameters (for --stopAfter=init)\n */\n getTrackedParams(): TrackedParam[] {\n return [...this.trackedParams];\n }\n\n /**\n * Get all figured parameters as a record\n * Returns all parameters that were collected during initialization,\n * whether from CLI args, options, or defaults\n */\n getAllFigured(): Record<string, { value: any; source: \"cli\" | \"options\" | \"default\" }> {\n const result: Record<string, { value: any; source: \"cli\" | \"options\" | \"default\" }> = {};\n for (const param of this.trackedParams) {\n result[param.key] = {\n value: param.value,\n source: param.source,\n };\n }\n return result;\n }\n\n /**\n * Clear tracked parameters\n */\n clearTrackedParams(): void {\n this.trackedParams = [];\n }\n\n /**\n * Assign a parameter definition\n */\n assignDefinition(key: string, definition?: ParamDefinition): any {\n if (this.definitions[key] && !definition) {\n return this.definitions[key];\n }\n\n let type: Joi.Schema;\n if (!definition) {\n type = Joi.string();\n } else if (Joi.isSchema(definition)) {\n type = definition;\n } else if (Joi.isSchema(definition.type)) {\n type = definition.type;\n } else if (typeof definition === \"string\") {\n type = this.toJoi(definition);\n } else if (typeof definition.type === \"string\") {\n type = this.toJoi(definition.type);\n } else if (!definition.type) {\n type = Joi.string();\n } else {\n type = Joi.string();\n }\n\n if (!this.definitions[key]) {\n this.definitions[key] = {};\n }\n this.definitions[key].type = type;\n\n if (definition && definition.values) {\n if (Array.isArray(definition.values)) {\n this.definitions[key].values = definition.values;\n }\n }\n return this.definitions[key];\n }\n\n /**\n * Convert string definition to Joi schema\n */\n toJoi(str: string): Joi.Schema {\n let type: Joi.Schema;\n \n if (str.match(/^string|^text/i)) {\n type = Joi.string();\n } else if (str.match(/^number|^integer|^int/i)) {\n type = Joi.number();\n } else if (str.match(/^boolean|^bool/i)) {\n type = Joi.boolean();\n } else if (str.match(/^date/i)) {\n type = Joi.custom(joiEdateType);\n } else if (str.match(/^duration/i)) {\n type = Joi.string().isoDuration();\n } else if (str.match(/^array/i)) {\n let elementTypes = \"string\";\n const tmp = str.match(/\\((.*)\\)/);\n if (tmp && tmp[1].match(/string/i)) {\n elementTypes = \"string\";\n } else if (tmp && tmp[1].match(/number|integer|int/i)) {\n elementTypes = \"number\";\n } else if (tmp && tmp[1].match(/boolean|bool/i)) {\n elementTypes = \"boolean\";\n }\n type = Joi.custom(joiStringArrayType(elementTypes));\n } else {\n type = Joi.string();\n }\n\n // Handle default values\n const regexForDefault = /\\bdefault\\s+([^\\s]+)/;\n const matchForDefault = str.match(regexForDefault);\n if (matchForDefault) {\n const defValObj = type.validate(matchForDefault[1]);\n if (defValObj.error) {\n throw new ParamError(`default value \"${defValObj.value}\" type mismatch`);\n }\n // Joi's default() automatically allows undefined and applies the default\n type = type.default(defValObj.value);\n } else if (str.match(/required/)) {\n type = type.required();\n } else {\n // If not required and no default, make it optional\n type = type.optional();\n }\n\n return type;\n }\n\n /**\n * Validate a value against a definition\n */\n validate(key: string, val: any, def: any): any {\n // Convert null to undefined so Joi defaults can be applied\n // Joi's .default() only works with undefined, not null\n const normalizedVal = val === null ? undefined : val;\n \n // Pass current params as context to support cross-parameter references (e.g., @startTime+2h)\n // Use abortEarly: false to get all errors, and allowUnknown: false for strict validation\n const { value, error } = def.type.validate(normalizedVal, { \n context: { params: this.params },\n abortEarly: false,\n allowUnknown: false,\n });\n if (error) {\n const errs = error.details.map((el: any) => el.message).join(\", \");\n throw new ParamError(`\"${key}\" validation error: ${errs}`);\n }\n return value;\n }\n\n /**\n * Get a parameter value with validation\n */\n get(key: string, definition?: ParamDefinition): any {\n const def = this.assignDefinition(key, definition);\n let valFromGetters: any = undefined;\n \n if (def.volatile || true) {\n valFromGetters = this.runAllRegisteredGetters(key);\n }\n \n const valFromArgs = this.args.get(key);\n const valFromParams = this.params[key];\n\n let source: \"cli\" | \"options\" | \"default\" = \"default\";\n let value: any;\n\n if (valFromGetters !== undefined && valFromGetters !== null) {\n value = this.validate(key, valFromGetters, def);\n source = \"options\";\n } else if (valFromArgs !== undefined && valFromArgs !== null) {\n value = this.validate(key, valFromArgs, def);\n source = \"cli\";\n } else if (valFromParams !== undefined && valFromParams !== null) {\n value = this.validate(key, valFromParams, def);\n source = \"options\";\n } else {\n // Use default from definition - Joi will apply default when value is undefined\n // We need to pass undefined explicitly so Joi can apply the default\n value = this.validate(key, undefined, def);\n source = \"default\";\n }\n\n // Track parameter for --stopAfter=init\n this.trackParam(key, definition || \"string\", value, source);\n\n if (value !== undefined && def.values && !def.values.includes(value)) {\n throw new ParamError(`key ${key} should be one of ${def.values}`);\n }\n return value;\n }\n\n /**\n * Set a parameter value with validation\n */\n set(key: string, val: any, definition?: ParamDefinition): void {\n // TODO: check if there's a test for this:\n if (val && val.type && val.value) {\n definition = val;\n val = val.value;\n }\n const def = this.assignDefinition(key, definition);\n\n if (!this.runAllRegisteredSetters(key, val)) {\n this.params[key] = val;\n }\n }\n\n /**\n * Get all parameters from definitions\n * Processes parameters left-to-right to support cross-parameter references\n */\n getAll(defs: Record<string, ParamDefinition>): Record<string, any> {\n const res: Record<string, any> = {};\n for (const [k, def] of Object.entries(defs)) {\n const value = this.get(k, def);\n res[k] = value;\n // Store validated value in params so subsequent params can reference it\n if (value !== undefined) {\n this.params[k] = value;\n }\n }\n return res;\n }\n\n /**\n * Run all registered getters for a key\n */\n runAllRegisteredGetters(key: string): any {\n let val: any = undefined;\n for (const getter of this.paramGetters) {\n val = getter(key, this.definitions[key]);\n if (val !== undefined && val !== null) {\n break;\n }\n }\n return val;\n }\n\n /**\n * Run all registered setters for a key\n */\n runAllRegisteredSetters(key: string, value: any): boolean {\n let setterUsed: boolean = false;\n for (const setter of this.paramSetters) {\n setterUsed = setter(key, value);\n if (setterUsed) {\n break;\n }\n }\n return setterUsed;\n }\n\n /**\n * Register a parameter getter\n */\n registerParamGetter(fn: ParamGetter): void {\n this.paramGetters.push(fn);\n }\n\n /**\n * Register a parameter setter\n */\n registerParamSetter(fn: ParamSetter): void {\n this.paramSetters.push(fn);\n }\n}\n\n// Export custom types for external use\nexport { joiEdateType, joiStringArrayType };\n\n","/**\n * Error classes for the CLI toolkit\n */\n\nexport class FrameworkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FrameworkError\";\n }\n}\n\nexport class ParamError extends FrameworkError {\n constructor(message: string) {\n super(message);\n this.name = \"ParamError\";\n }\n}\n\nexport class InitError extends FrameworkError {\n constructor(message: string) {\n super(message);\n this.name = \"InitError\";\n }\n}\n\nexport class CriticalRequestError extends FrameworkError {\n constructor(message: string) {\n super(message);\n this.name = \"CriticalRequestError\";\n }\n}\n\nexport class ControlFlowError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ControlFlowError\";\n }\n}\n\n","import Joi from \"joi\";\nimport { ParamError } from \"../errors.js\";\n\n/**\n * Custom Joi type for enhanced date parsing with relative time support\n * Supports:\n * - ISO8601 strings: \"2025-01-01T01:01:01Z\"\n * - Relative time: \"-2h\", \"+1d\", \"now\"\n * - Cross-parameter references: \"@startTime+2h\", \"@endDate-30m\"\n * \n * Internal representation: UTC ISO8601 string (YYYY-MM-DDTHH:mm:ssZ)\n * \n * @param value - Date value to parse\n * @param helpers - Joi helpers (includes context with other params)\n * @returns ISO8601 string in UTC timezone\n */\nexport const joiEdateType = (value: any, helpers: Joi.CustomHelpers): string => {\n // If value is already a string in ISO format, validate and return\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$/.test(value)) {\n const testDate = new Date(value);\n if (!isNaN(testDate.getTime())) {\n return value;\n }\n }\n\n // If value is a Date object, convert to ISO string\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n // If value is not a string, try to convert it\n if (typeof value !== \"string\") {\n value = String(value);\n }\n\n // Handle special keyword \"now\"\n if (value.toLowerCase() === \"now\") {\n return new Date().toISOString();\n }\n\n // Check for cross-parameter reference with relative time: @paramName+2h, @paramName-30m\n const referenceRegex = /^@(\\w+)([+-]\\d+[smhdwy])$/i;\n const referenceMatch = value.match(referenceRegex);\n \n if (referenceMatch) {\n const [, paramName, relativeExpr] = referenceMatch;\n \n // Get the referenced parameter from context (if available via helpers.state.ancestors)\n // For now, we'll use helpers.prefs.context which Joi provides\n const context = (helpers as any).prefs?.context;\n \n if (!context || !context.params) {\n throw new ParamError(`Cannot resolve cross-parameter reference @${paramName}: context not available. Ensure parameters are processed with proper context.`);\n }\n\n const referencedValue = context.params[paramName];\n \n if (referencedValue === undefined || referencedValue === null) {\n throw new ParamError(`Cannot resolve @${paramName}: parameter \"${paramName}\" is not defined or has no value. Parameters are evaluated left-to-right.`);\n }\n\n // Referenced value should be an ISO string or Date\n let referenceDate: Date;\n if (referencedValue instanceof Date) {\n referenceDate = referencedValue;\n } else if (typeof referencedValue === \"string\") {\n referenceDate = new Date(referencedValue);\n if (isNaN(referenceDate.getTime())) {\n throw new ParamError(`Referenced parameter @${paramName} has invalid date value: ${referencedValue}`);\n }\n } else {\n throw new ParamError(`Referenced parameter @${paramName} is not a valid date type (found: ${typeof referencedValue})`);\n }\n\n // Parse the relative expression and apply to reference date\n const relativeMatch = relativeExpr.match(/^([+-])(\\d+)([smhdwy])$/i);\n if (!relativeMatch) {\n throw new ParamError(`Invalid relative time expression in @${paramName}${relativeExpr}`);\n }\n\n const [, sign, amount, unit] = relativeMatch;\n const offset = calculateTimeOffset(parseInt(amount, 10), unit, sign);\n const resultDate = new Date(referenceDate.getTime() + offset);\n \n return resultDate.toISOString();\n }\n\n // Check for relative time expressions like \"-2h\", \"+1d\", \"-30m\", etc.\n const relativeTimeRegex = /^([+-])(\\d+)([smhdwy])$/i;\n const relativeMatch = value.match(relativeTimeRegex);\n \n if (relativeMatch) {\n const [, sign, amount, unit] = relativeMatch;\n const numAmount = parseInt(amount, 10);\n \n if (isNaN(numAmount)) {\n throw new ParamError(`Invalid relative time amount: ${amount}`);\n }\n\n const offset = calculateTimeOffset(numAmount, unit, sign);\n const resultDate = new Date(Date.now() + offset);\n \n return resultDate.toISOString();\n }\n\n // Try to parse as a regular date string\n const parsedDate = new Date(value);\n \n // Check if the parsed date is valid\n if (isNaN(parsedDate.getTime())) {\n throw new ParamError(`Invalid date format: ${value}. Expected a valid date string, \"now\", relative time expression (e.g., \"-2h\", \"+1d\"), or cross-parameter reference (e.g., \"@startTime+2h\")`);\n }\n\n return parsedDate.toISOString();\n};\n\n/**\n * Calculate time offset in milliseconds\n */\nfunction calculateTimeOffset(amount: number, unit: string, sign: string): number {\n let multiplier = 1;\n \n // Convert to milliseconds based on unit\n switch (unit.toLowerCase()) {\n case \"s\": // seconds\n multiplier = 1000;\n break;\n case \"m\": // minutes\n multiplier = 60 * 1000;\n break;\n case \"h\": // hours\n multiplier = 60 * 60 * 1000;\n break;\n case \"d\": // days\n multiplier = 24 * 60 * 60 * 1000;\n break;\n case \"w\": // weeks\n multiplier = 7 * 24 * 60 * 60 * 1000;\n break;\n case \"y\": // years (approximate)\n multiplier = 365 * 24 * 60 * 60 * 1000;\n break;\n default:\n throw new ParamError(`Invalid time unit: ${unit}. Supported units: s, m, h, d, w, y`);\n }\n\n return sign === \"+\" ? amount * multiplier : -amount * multiplier;\n}\n\n/**\n * Custom Joi type for string array parsing\n * Converts comma-separated strings to typed arrays\n */\nexport const joiStringArrayType = (type: string) => (value: any, helpers: Joi.CustomHelpers): any[] => {\n if (value === undefined || typeof value === \"function\") {\n return [];\n }\n \n const arr = value.split(/,\\s*/).map((el: string) => {\n if (type === \"number\") {\n const v = parseInt(el, 10);\n if (isNaN(v)) {\n throw new ParamError(`array element \"${el}\" should be numeric`);\n }\n return v;\n } else if (type === \"boolean\") {\n const v = el.match(/true|t|yes|1/i) ? true :\n el.match(/false|f|no|0/i) ? false : null;\n if (v === null) {\n throw new ParamError(`array element \"${el}\" should be boolean`);\n }\n return v;\n } else if (type === \"string\") {\n return el;\n } else {\n throw new ParamError(`unknown type \"${type}\" for array elements`);\n }\n });\n \n return arr;\n};\n\n","import chalk from \"chalk\";\nimport util from \"util\";\n\nimport {\n Logger,\n LoggerOptions,\n LoggerProgressOptions,\n LogPayload,\n LevelName,\n LoggerTransport,\n LoggerMode\n} from \"./types.js\";\nimport { ConsoleTransport, ParentProcessTransport } from \"./transports.js\";\nimport type { Context } from \"../init/types.js\";\n\nconst ALL_LEVELS: LevelName[] = [\n \"silly\",\n \"debug\",\n \"logic\",\n \"info\",\n \"notice\",\n \"warn\",\n \"error\",\n \"results\",\n \"request\",\n \"response\",\n \"progress\"\n];\n\n// Calculate maximum level name length for alignment\nconst MAX_LEVEL_LENGTH = Math.max(...ALL_LEVELS.map(level => level.toUpperCase().length));\n\nconst LEVEL_COLORS: Record<LevelName, chalk.Chalk> = {\n error: chalk.red.bold,\n warn: chalk.rgb(255, 165, 0),\n notice: chalk.cyan,\n info: chalk.white.bold,\n logic: chalk.gray,\n debug: chalk.gray,\n silly: chalk.gray,\n request: chalk.green,\n response: chalk.yellow,\n progress: chalk.green,\n results: chalk.magenta\n};\n\ninterface NormalizedOptions {\n mode: LoggerMode;\n route: \"console\" | \"ipc\";\n prefix?: string;\n silent: boolean;\n showLevel: boolean;\n timestamp: boolean;\n levels: LevelName[];\n progressTimes: boolean;\n progressThrottle?: number;\n}\n\nexport class Logger implements Logger {\n private context: any; // Partial context during initialization\n private options: NormalizedOptions;\n private transport: LoggerTransport;\n private readonly startTimes: Record<string, number> = {};\n private readonly lastProgressTimes: Record<string, number> = {};\n\n constructor(context: any, options: LoggerOptions = {}) {\n this.context = context;\n // Set defaults first\n this.options = this.getDefaultOptions();\n // Apply configuration\n if (options) {\n this.configure(options);\n }\n // Initialize transport\n this.updateTransport();\n }\n\n /**\n * Configure logger options\n * Only parameters present in options are updated\n */\n configure(options: Partial<LoggerOptions>): void {\n if (options.mode !== undefined) {\n this.options.mode = this.isValidMode(options.mode) ? options.mode : \"text\";\n }\n if (options.route !== undefined) {\n this.options.route = options.route;\n this.updateTransport();\n }\n if (options.prefix !== undefined) {\n this.options.prefix = options.prefix;\n }\n if (options.silent !== undefined) {\n this.options.silent = options.silent;\n }\n if (options.showLevel !== undefined) {\n this.options.showLevel = options.showLevel;\n }\n if (options.timestamp !== undefined) {\n this.options.timestamp = options.timestamp;\n }\n if (options.levels !== undefined) {\n this.options.levels = this.normalizeLevels(options.levels);\n }\n if (options.progress !== undefined) {\n if (options.progress.withTimes !== undefined) {\n this.options.progressTimes = options.progress.withTimes;\n }\n if (options.progress.throttleMs !== undefined) {\n this.options.progressThrottle = options.progress.throttleMs;\n }\n }\n }\n\n /**\n * Initialize logger from context and CLI parameters\n */\n static init(context: any, options?: LoggerOptions): Logger {\n // Define parameter definitions for CLI (with defaults to make them optional)\n const paramDefs = {\n mode: \"string default text\",\n route: \"string default console\",\n prefix: \"string\",\n silent: \"boolean default false\",\n showLevel: \"boolean default true\",\n timestamp: \"boolean default false\",\n levels: \"string\",\n progressWithTimes: \"boolean default false\",\n progressThrottleMs: \"number\",\n };\n\n // Collect parameters from CLI\n const cliParams = context.params.getAll(paramDefs);\n\n // Merge CLI params with options (options take precedence)\n const config: LoggerOptions = {\n mode: options?.mode ?? cliParams.mode,\n route: options?.route ?? cliParams.route,\n prefix: options?.prefix ?? cliParams.prefix,\n silent: options?.silent ?? cliParams.silent,\n showLevel: options?.showLevel ?? cliParams.showLevel,\n timestamp: options?.timestamp ?? cliParams.timestamp,\n levels: options?.levels ?? (cliParams.levels ? cliParams.levels.split(\",\") : undefined),\n progress: options?.progress ?? {\n withTimes: cliParams.progressWithTimes,\n throttleMs: cliParams.progressThrottleMs,\n },\n };\n\n\n // Create and return instance\n const logger = new Logger(context, config);\n context.logger = logger; // Update context with the new logger instance\n return logger;\n }\n\n private getDefaultOptions(): NormalizedOptions {\n return {\n mode: \"text\",\n route: this.shouldUseIpcRoute() ? \"ipc\" : \"console\",\n prefix: undefined,\n silent: false,\n showLevel: true,\n timestamp: false,\n levels: ALL_LEVELS,\n progressTimes: false,\n progressThrottle: undefined,\n };\n }\n\n private updateTransport(): void {\n this.transport = this.options.route === \"ipc\"\n ? new ParentProcessTransport()\n : new ConsoleTransport();\n }\n\n setMode(mode: LoggerMode): void {\n if (!this.isValidMode(mode)) {\n throw new Error(`Unsupported logger mode: ${mode}`);\n }\n this.options.mode = mode;\n }\n\n debug(message?: any, ...chunks: any[]): void {\n this.out({ level: \"debug\", message, chunks });\n }\n\n info(message?: any, ...chunks: any[]): void {\n this.out({ level: \"info\", message, chunks });\n }\n\n notice(message?: any, ...chunks: any[]): void {\n this.out({ level: \"notice\", message, chunks });\n }\n\n warn(message?: any, ...chunks: any[]): void {\n this.out({ level: \"warn\", message, chunks });\n }\n\n error(message?: any, ...chunks: any[]): void {\n this.out({ level: \"error\", message, chunks });\n }\n\n logic(message?: any, ...chunks: any[]): void {\n this.out({ level: \"logic\", message, chunks });\n }\n\n silly(message?: any, ...chunks: any[]): void {\n this.out({ level: \"silly\", message, chunks });\n }\n\n results(results: unknown): void {\n this.out({ level: \"results\", message: \"results\", results });\n }\n\n request(operation: string, ...chunks: any[]): void {\n const message = this.inspectChunks([operation, ...chunks]);\n this.out({ level: \"request\", message });\n }\n\n response(operation: string, ...chunks: any[]): void {\n const message = this.inspectChunks([operation, ...chunks]);\n this.out({ level: \"response\", message });\n }\n\n progress(message: string, opts: LoggerProgressOptions): void {\n const { prefix, count, total } = opts;\n const paddedTotal = String(total).length;\n const paddedCount = String(count).padStart(paddedTotal, \" \");\n const payload: LogPayload = {\n level: \"progress\",\n message,\n count: paddedCount,\n total,\n prefix\n };\n\n if (!this.startTimes[prefix ?? \"\"]) {\n this.startTimes[prefix ?? \"\"] = Date.now();\n }\n if (this.options.progressTimes) {\n const elapsedSeconds = (Date.now() - this.startTimes[prefix ?? \"\"]) / 1000;\n let remaining = -1;\n if (count > 1) {\n const rate = elapsedSeconds / (count - 1);\n remaining = (total - count) * rate;\n }\n payload.elapsed = this.round(elapsedSeconds, 2);\n payload.remaining = remaining >= 0 ? this.round(remaining, 2) : remaining;\n }\n\n if (count >= total) {\n delete this.startTimes[prefix ?? \"\"];\n delete this.lastProgressTimes[prefix ?? \"\"];\n }\n\n if (this.shouldOutputProgress(prefix ?? \"\", count, total)) {\n this.out(payload);\n if (this.options.progressThrottle && prefix) {\n this.lastProgressTimes[prefix] = Date.now();\n }\n }\n }\n\n private shouldOutputProgress(prefix: string, count: number, total: number): boolean {\n if (!this.options.progressThrottle) {\n return true;\n }\n if (count === 1 || count === total || !prefix) {\n return true;\n }\n const lastTime = this.lastProgressTimes[prefix];\n if (!lastTime) {\n return true;\n }\n return Date.now() - lastTime >= this.options.progressThrottle;\n }\n\n private out(struct: LogPayload): void {\n if (this.options.silent) {\n return;\n }\n if (!this.options.levels.includes(struct.level)) {\n return;\n }\n\n if (this.options.prefix && !struct.prefix) {\n struct.prefix = this.options.prefix;\n }\n\n const output = this.options.mode === \"json\"\n ? struct\n : this.formatLog(struct);\n\n this.transport.write(output);\n }\n\n private formatLog(struct: LogPayload): string {\n const parts: string[] = [];\n const now = new Date();\n\n if (this.options.timestamp) {\n parts.push(now.toISOString());\n }\n\n if (this.options.showLevel) {\n parts.push(struct.level.toUpperCase().padEnd(MAX_LEVEL_LENGTH));\n }\n\n if (struct.level === \"progress\") {\n if (struct.prefix) {\n parts.push(LEVEL_COLORS[struct.level].bold(struct.prefix));\n }\n if (struct.count !== undefined && struct.total !== undefined) {\n parts.push(LEVEL_COLORS[struct.level](`${struct.count}/${struct.total}`));\n }\n } else if (struct.prefix) {\n parts.push(chalk.cyan(`[${struct.prefix}]`));\n }\n\n if (struct.message) {\n const formatter = LEVEL_COLORS[struct.level] ?? chalk.white;\n parts.push(formatter.bold(struct.message));\n }\n\n if (struct.level === \"progress\") {\n if (struct.elapsed !== undefined && struct.remaining !== undefined) {\n const formatter = LEVEL_COLORS[struct.level];\n parts.push(formatter(`${struct.elapsed}/${struct.remaining}`));\n }\n }\n\n if (struct.chunks && struct.chunks.length) {\n parts.push(this.inspectChunks(struct.chunks));\n }\n\n if (struct.results) {\n const formatter = LEVEL_COLORS[struct.level] ?? chalk.white;\n parts.push(formatter(JSON.stringify(struct.results, null, 4)));\n }\n\n return parts.join(\" \");\n }\n\n private inspectChunks(chunks: any[]): string {\n return chunks\n .map(chunk => util.inspect(chunk, { colors: true, depth: null }))\n .join(\" \");\n }\n\n private shouldUseIpcRoute(): boolean {\n // Don't use IPC in test environments (Vitest workers interfere with process.send)\n if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n return false;\n }\n // Only use IPC if process.send exists AND we're connected to a parent\n // In Vitest workers, process.send exists but process.connected is undefined/false\n // process.connected is only true in actual child processes created with fork()\n return typeof process.send === \"function\" && process.connected === true;\n }\n\n private normalizeLevels(levels?: string[]): LevelName[] {\n if (!levels || !levels.length) {\n return ALL_LEVELS;\n }\n\n const includes = levels.filter(level => !level.startsWith(\"-\")) as LevelName[];\n const excludes = levels\n .filter(level => level.startsWith(\"-\"))\n .map(level => level.slice(1)) as LevelName[];\n\n const unknown = [...includes, ...excludes].filter(level => !ALL_LEVELS.includes(level));\n if (unknown.length) {\n console.warn(`[Logger] Unknown level(s): ${unknown.join(\", \")}`);\n }\n\n const base = includes.length ? includes : ALL_LEVELS;\n return base.filter(level => !excludes.includes(level));\n }\n\n private isValidMode(mode?: string | null): mode is LoggerMode | undefined {\n return mode === undefined || mode === null || mode === \"text\" || mode === \"json\";\n }\n\n private round(value: number, places: number): number {\n const factor = Math.pow(10, places);\n return Math.round(value * factor) / factor;\n }\n}\n\n","import { LoggerTransport } from \"./types.js\";\n\nexport class ConsoleTransport implements LoggerTransport {\n write(payload: any): void {\n console.info(payload);\n }\n}\n\nexport class ParentProcessTransport implements LoggerTransport {\n write(payload: any): void {\n // Don't use IPC in test environments (Vitest workers interfere with process.send)\n if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n console.info(payload);\n return;\n }\n // Only use process.send if we're actually connected to a parent process\n // In Vitest workers, process.send exists but shouldn't be used\n if (typeof process.send === \"function\" && process.connected === true) {\n process.send(payload);\n } else {\n console.info(payload);\n }\n }\n}\n\n\n","/**\n * Init component - Framework initialization and flow execution\n * \n * Provides a standardized way to initialize CLI scripts with Args, Params, Logger,\n * and other dependencies, then execute the main flow function.\n */\n\nimport { Args } from \"../args/index.js\";\nimport { Params } from \"../params/index.js\";\nimport { Logger } from \"../logger/index.js\";\nimport { ParamError, InitError } from \"../errors.js\";\nimport type { Context, InitOptions, FlowFunction } from \"./types.js\";\nimport { EventEmitter } from \"events\";\n\n/**\n * Partial context used during initialization\n * Components are added as they're created\n */\ninterface PartialContext {\n args: Args;\n params?: Params;\n logger?: any;\n emitter: EventEmitter;\n isStop: () => boolean;\n cleanupFunctions: Array<(context: Context) => Promise<void> | void>;\n registerCleanup: (fn: (context: Context) => Promise<void> | void) => void;\n}\n\n/**\n * Extract component-specific options from InitOptions\n * Removes reserved keys (overrides, defaults, modules) and returns component options\n */\nfunction extractComponentOptions(opts: InitOptions, componentName: string): Record<string, any> {\n const reservedKeys = [\"overrides\", \"defaults\", \"modules\"];\n const componentOptions: Record<string, any> = {};\n \n for (const [key, value] of Object.entries(opts)) {\n if (!reservedKeys.includes(key)) {\n componentOptions[key] = value;\n }\n }\n \n return componentOptions;\n}\n\n/**\n * Setup initial context with Args, Params, and Logger\n * Uses staged initialization to handle circular dependencies\n */\nfunction setup(opts: InitOptions = {}): Context {\n // Stage 1: Initialize Args (no dependencies)\n const args = Args.init({\n overrides: opts.overrides || {},\n defaults: opts.defaults || {},\n });\n\n // Stage 2: Create partial context with Args\n const partialContext: PartialContext = {\n args,\n emitter: new EventEmitter(),\n isStop: () => false,\n cleanupFunctions: [],\n registerCleanup: (fn: (context: Context) => Promise<void> | void) => {\n partialContext.cleanupFunctions.push(fn);\n },\n };\n\n // Stage 3: Initialize Params with partial context\n const params = Params.init(partialContext as any, opts.overrides || {});\n partialContext.params = params;\n\n // Stage 4: Initialize Logger with partial context (now has Args and Params)\n // Extract logger options from top-level opts (mode, route, prefix, etc.)\n const loggerOptions = extractComponentOptions(opts, \"logger\");\n const logger = Logger.init(partialContext as any, loggerOptions);\n partialContext.logger = logger;\n\n // Stage 5: Create complete context\n const context: Context = {\n args,\n params,\n logger,\n emitter: partialContext.emitter,\n isStop: partialContext.isStop,\n cleanupFunctions: partialContext.cleanupFunctions,\n registerCleanup: partialContext.registerCleanup,\n };\n\n logger.debug(\"[setup] completed successfully\");\n return context;\n}\n\n/**\n * Setup modules (future feature - placeholder for now)\n */\nasync function setupModules(context: Context, opts: InitOptions = {}): Promise<Context> {\n // TODO: Implement module initialization\n // For now, just log that modules would be initialized\n if (opts.modules && opts.modules.length > 0) {\n context.logger.debug(`[setupModules] modules specified: ${opts.modules.join(\", \")} (not yet implemented)`);\n }\n context.logger.debug(\"[setupModules] completed successfully\");\n return context;\n}\n\n/**\n * Print all figured parameters for --stopAfter=init\n */\nfunction printAllParameters(context: Context): void {\n const trackedParams = context.params.getTrackedParams();\n \n console.log(\"\\n=== All Figured Parameters ===\");\n console.log(\"\\nComponent: Logger\");\n const loggerParams = trackedParams.filter(p => \n [\"mode\", \"route\", \"prefix\", \"silent\", \"showLevel\", \"timestamp\", \"levels\"].includes(p.key)\n );\n if (loggerParams.length > 0) {\n loggerParams.forEach(p => {\n console.log(` ${p.key}: ${JSON.stringify(p.value)} (from ${p.source})`);\n });\n } else {\n console.log(\" (no parameters requested)\");\n }\n\n // Add other components as they're initialized\n console.log(\"\\n=== End Parameters ===\\n\");\n}\n\n/**\n * Initialize framework and execute flow function\n * \n * Automatically handles async module loading (e.g., ESM dependencies for screen module)\n * so users don't need to call load() manually.\n * \n * @param flow - Main function that receives context and executes the script logic\n * @param opts - Configuration options for initialization\n */\nexport async function init(flow: FlowFunction, opts: InitOptions = {}): Promise<void> {\n let stop = false;\n let context: Context | null = null;\n\n try {\n // Pre-load ESM dependencies (ink, react) for CommonJS compatibility\n // This ensures screen-related functionality works in CommonJS environments\n // The load() function is available from the screen module or main package\n try {\n // Try to import screen module and call its load function\n // This works in both ESM and CommonJS (via dynamic import)\n const screenModule = await import(\"../screen/index.js\");\n if (screenModule && typeof screenModule.load === \"function\") {\n await screenModule.load();\n }\n } catch {\n // If screen module load fails, try accessing via main package (CommonJS)\n if (typeof require !== \"undefined\") {\n try {\n // In CommonJS, the main package may have been required and exports load()\n // We can't use require() here as it would be synchronous, so we skip it\n // The screen module import above should work in both cases\n } catch {\n // Ignore - screen functionality may not be needed\n }\n }\n }\n\n // Setup context with Args, Params, Logger\n context = setup(opts);\n \n // Set isStop function\n context.isStop = () => stop;\n\n // Setup modules (future feature)\n context = await setupModules(context, opts);\n\n // Check for --stopAfter=init\n const stopAfter = context.args.get(\"stopAfter\");\n if (stopAfter === \"init\") {\n printAllParameters(context);\n process.exit(0);\n }\n\n // Setup SIGINT handler for graceful shutdown\n process.on(\"SIGINT\", async () => {\n if (stop) {\n context!.logger.warn(\"[process] killed\");\n process.exit(2);\n }\n stop = true;\n \n // Get stop allowance from params\n let allowance = 5; // default\n try {\n allowance = context!.params.get(\"stopAllowance\", \"number default 5\");\n } catch {\n // Use default if not provided\n }\n \n context!.logger.info(`>> emitting stop with allowance ${allowance}`);\n context!.emitter.emit(\"stop\", allowance);\n });\n\n // Execute the flow function\n await flow(context);\n\n } catch (error) {\n // Error handling with proper error types\n const errorLocation = error instanceof Error && error.stack\n ? error.stack.split(\"\\n\")[1]?.trim() || \"Unknown location\"\n : \"Unknown location\";\n\n // Use logger if available, otherwise fall back to console.error\n const logError = (msg: string, ...args: any[]) => {\n if (context?.logger) {\n context.logger.error(msg, ...args);\n } else {\n console.error(msg, ...args);\n }\n };\n\n if (error instanceof ParamError) {\n logError(`[params]: ${error.message} (${errorLocation})`);\n process.exitCode = 3;\n } else if (error instanceof InitError) {\n logError(`[init]: ${error.message} (${errorLocation})`);\n process.exitCode = 4;\n } else {\n logError(`[other] error:`, error, errorLocation);\n process.exitCode = 5;\n }\n } finally {\n // Run cleanup functions in reverse order\n if (context) {\n for (const fn of context.cleanupFunctions.reverse()) {\n try {\n await fn(context);\n } catch (error) {\n context.logger.warn(\"[cleanup] error in cleanup function:\", error);\n }\n }\n\n // Warn about unused CLI args\n const unusedArgs = context.args.getUnused();\n if (unusedArgs.length > 0) {\n context.logger.warn(\"Unused CLI args:\", unusedArgs.join(\", \"));\n }\n }\n }\n}\n\n/**\n * Setup function - can be used independently to get context without executing flow\n * Useful for testing or advanced use cases\n */\nexport function setupContext(opts: InitOptions = {}): Context {\n return setup(opts);\n}\n\n"],"mappings":"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","names":["h","h","React","import_react","import_ink","config","resolve","h","import_react","import_ink","h","import_react","import_ink","config","React","import_react","import_ink","config","relativeMatch","Joi","chalk","config","util"]}