{"version":3,"sources":["../src/screen/screen-layout.js","../src/screen/visible-text.js","../src/screen/components.js","../src/screen/scrollbar.js","../src/screen/list-components.js","../src/screen/key-bindings.js","../src/screen/flicker-free-stdout.js","../src/screen/screens.js","../src/screen/ui-elements.js","../src/screen/follow-scroll.js","../src/screen/scrollable-text.js","../src/screen/text-input.js","../src/screen/utils.js","../src/screen/footer-builder.js","../src/screen/index.js","../src/init/index.js","../src/args/index.js","../src/params/index.js","../src/errors.js","../src/params/custom-types.js","../src/logger/index.js","../src/logger/transports.js"],"sourcesContent":["/**\n * showScreen chrome (must match screens.js + ScreenContainer):\n *   1 marginTop\n *   1 border top + 1 border bottom\n *   1 title\n *   1 divider\n *   1 blank spacer\n *   1 blank spacer\n *   1 divider\n *   N footer lines (default 1)\n *\n * Ink’s log-update does clearTerminal when outputHeight >= stdout.rows.\n * That wipe is the “everything flickers, title scrolled off” failure mode.\n * Keep one unused row so the frame always fits.\n */\n\nexport const SCREEN_MARGIN_TOP = 1;\nexport const SCREEN_CHROME_WITHOUT_FOOTER = 8;\nexport const INK_HEIGHT_SLACK = 1;\n\nexport function getScreenChromeRows({ footerLines = 1 } = {}) {\n    return SCREEN_CHROME_WITHOUT_FOOTER + Math.max(0, Number(footerLines) || 0);\n}\n\n/**\n * Rows left for a scroll viewport (log lines, list rows) after chrome +\n * any extra header/status lines the body renders.\n */\nexport function getScreenBodyRows({\n    extraRows = 0,\n    footerLines = 1,\n    minRows = 4,\n    termRows = process.stdout.rows || 24,\n} = {}) {\n    const rows = Number(termRows) || 24;\n    const reserved =\n        getScreenChromeRows({ footerLines }) +\n        Math.max(0, Number(extraRows) || 0) +\n        INK_HEIGHT_SLACK;\n    return Math.max(minRows, rows - reserved);\n}\n\n/**\n * ScreenContainer Box maxHeight (margin is outside). margin + this <= termRows - slack.\n */\nexport function getScreenFrameBoxHeight({ termRows = process.stdout.rows || 24 } = {}) {\n    const rows = Number(termRows) || 24;\n    return Math.max(8, rows - SCREEN_MARGIN_TOP - INK_HEIGHT_SLACK);\n}\n","/**\n * Terminal-visible width: ignore ANSI, count code points as one cell.\n * Keeps scrollbar / pad math aligned when log lines carry chalk codes.\n */\n\nconst ANSI_RE = /\\u001b(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~])/g;\n\nexport function stripAnsi(text) {\n    return String(text ?? \"\").replace(ANSI_RE, \"\");\n}\n\nexport function visibleWidth(text) {\n    return [...stripAnsi(text)].length;\n}\n\n/**\n * First `cols` visible cells, preserving ANSI in that span.\n */\nexport function sliceVisible(text, cols) {\n    const w = Math.max(0, Math.floor(Number(cols) || 0));\n    const s = String(text ?? \"\");\n    if (w === 0) return \"\";\n    let vis = 0;\n    let out = \"\";\n    let i = 0;\n    while (i < s.length && vis < w) {\n        ANSI_RE.lastIndex = i;\n        const m = ANSI_RE.exec(s);\n        if (m && m.index === i) {\n            out += m[0];\n            i += m[0].length;\n            continue;\n        }\n        const cp = s.codePointAt(i);\n        const ch = String.fromCodePoint(cp);\n        out += ch;\n        i += ch.length;\n        vis += 1;\n    }\n    return out;\n}\n\nexport function padEndVisible(text, cols) {\n    const w = Math.max(0, Math.floor(Number(cols) || 0));\n    const s = String(text ?? \"\");\n    const vis = visibleWidth(s);\n    if (vis === w) return s;\n    if (vis > w) return sliceVisible(s, w);\n    return s + \" \".repeat(w - vis);\n}\n\n/**\n * Hard-wrap on visible columns (keeps empty lines). ANSI stays with its text.\n */\nexport function wrapTextLines(text, cols) {\n    const w = Math.max(1, Math.floor(Number(cols) || 1));\n    const out = [];\n    for (const raw of String(text ?? \"\").split(\"\\n\")) {\n        if (raw.length === 0) {\n            out.push(\"\");\n            continue;\n        }\n        if (visibleWidth(raw) <= w) {\n            out.push(raw);\n            continue;\n        }\n        let rest = raw;\n        while (visibleWidth(rest) > w) {\n            const head = sliceVisible(rest, w);\n            out.push(head);\n            rest = rest.slice(head.length);\n        }\n        if (rest.length > 0) out.push(rest);\n    }\n    return out;\n}\n","/**\n * Core screen layout components\n */\n\nimport React, { createElement as h } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { getScreenFrameBoxHeight } from \"./screen-layout.js\";\nimport { stripAnsi } from \"./visible-text.js\";\n\n/**\n * Get screen width for borders\n * @param maxWidth - Optional max width (null = no limit)\n */\nexport function getScreenWidth(maxWidth = null) {\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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Screen Container - uses Ink's built-in borderStyle for proper text wrapping\n */\nexport function ScreenContainer({ children }) {\n    const width = getScreenWidth();\n    const maxHeight = getScreenFrameBoxHeight();\n\n    return h(Box, {\n        flexDirection: \"column\",\n        marginTop: 1,\n        borderStyle: \"single\",\n        borderColor: \"cyan\",\n        paddingX: 1,\n        width,\n        maxHeight,\n        overflow: \"hidden\",\n    }, children);\n}\n\n/**\n * Screen row - just a wrapper for spacing, borders handled by container\n */\nexport function ScreenRow({ children, ...boxProps }) {\n    return h(Box, { flexDirection: \"column\", ...boxProps }, children);\n}\n\n/**\n * Screen Title - first line inside container (left-aligned, breadcrumb-style)\n */\nexport function ScreenTitle({ text }) {\n    return h(ScreenRow, { flexShrink: 0 },\n        h(Text, { bold: true, color: \"cyan\", wrap: \"truncate\" }, text)\n    );\n}\n\n/**\n * Horizontal divider line\n */\nexport function ScreenDivider({ width }) {\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\" }) {\n    return h(Box, { flexDirection: \"column\", alignItems }, children);\n}\n\n/** Bold key label. Do not use dimColor here — dim and bold share SGR 22. */\nexport const FOOTER_HOTKEY_STYLE = { bold: true };\n\n/** Caption / separator. Gray, not dim, so later keys stay bold. */\nexport const FOOTER_MUTED_STYLE = { color: \"gray\" };\n\n/**\n * Normalize one footer item: `{ hotkey, caption }` (aliases: key, title, text).\n * `hotkey` may be a string (`\"esc/←\"`) or an array of labels.\n */\nexport function normalizeFooterHotkey(item) {\n    if (item == null) return null;\n    if (typeof item === \"string\") {\n        return { hotkey: [item], caption: \"\" };\n    }\n    const raw = item.hotkey ?? item.key;\n    const hotkey = Array.isArray(raw)\n        ? raw.map(String)\n        : String(raw ?? \"\").split(\"/\").map((s) => s.trim()).filter(Boolean);\n    return {\n        ...item,\n        hotkey,\n        caption: item.caption ?? item.title ?? item.text ?? \"\",\n    };\n}\n\nfunction renderHotkeyPieces(item, reactKey) {\n    const normalized = normalizeFooterHotkey(item);\n    if (!normalized) return [];\n    if (normalized.node && React.isValidElement(normalized.node)) {\n        return [\n            normalized.node.key == null\n                ? React.cloneElement(normalized.node, { key: reactKey })\n                : normalized.node,\n        ];\n    }\n\n    const pieces = [];\n    normalized.hotkey.forEach((label, i) => {\n        if (i > 0) {\n            pieces.push(h(Text, { key: `${reactKey}-sep${i}`, ...FOOTER_MUTED_STYLE }, \"/\"));\n        }\n        pieces.push(h(Text, { key: `${reactKey}-k${i}`, ...FOOTER_HOTKEY_STYLE }, label));\n    });\n\n    if (normalized.caption) {\n        pieces.push(h(Text, { key: `${reactKey}-cap`, ...FOOTER_MUTED_STYLE }, ` to ${normalized.caption}`));\n    }\n\n    if (normalized.kind === \"toggle\" && normalized.value) {\n        pieces.push(h(Text, { key: `${reactKey}-sp`, ...FOOTER_MUTED_STYLE }, \" \"));\n        pieces.push(h(\n            Text,\n            { key: `${reactKey}-val`, ...(normalized.valueStyle || FOOTER_HOTKEY_STYLE) },\n            ` ${normalized.value} `,\n        ));\n    }\n\n    return pieces;\n}\n\n/**\n * Screen Footer — hotkeys are structured items, styled here (not parsed from a string).\n *\n * @example\n * <ScreenFooter hotkeys={[\n *   { hotkey: [\"esc\", \"←\"], caption: \"go back\" },\n *   { hotkey: \"enter\", caption: \"select\" },\n *   { hotkey: \"s\", caption: \"sort\", kind: \"toggle\", value: \"ASC\" },\n * ]} />\n *\n * Extra status lines (not hotkeys) still go in `lines`.\n */\nexport function ScreenFooter({ hotkeys, lines, textStyle }) {\n    const defaultTextStyle = {\n        dimColor: true,\n        color: \"white\"\n    };\n    \n    const finalTextStyle = { ...defaultTextStyle, ...textStyle };\n\n    const flattenAndWrap = (items, keyPrefix = \"\") => {\n        const result = [];\n        let keyIndex = 0;\n\n        (items || []).forEach((item, index) => {\n            if (Array.isArray(item)) {\n                const nested = flattenAndWrap(item, `${keyPrefix}-${index}`);\n                result.push(...nested);\n            } else if (typeof item === \"string\") {\n                const preStyled = stripAnsi(item) !== item;\n                result.push(\n                    h(Text, {\n                        key: `${keyPrefix}-${keyIndex++}`,\n                        ...(preStyled ? {} : finalTextStyle),\n                    }, item)\n                );\n            } else if (React.isValidElement(item)) {\n                result.push(\n                    item.key == null\n                        ? React.cloneElement(item, { key: `${keyPrefix}-${keyIndex++}` })\n                        : item\n                );\n            } else if (item != null) {\n                result.push(item);\n            }\n        });\n\n        return result;\n    };\n\n    const hotkeyPieces = [];\n    (hotkeys || []).forEach((item, idx) => {\n        if (idx > 0) {\n            hotkeyPieces.push(h(Text, { key: `hk-join-${idx}`, ...FOOTER_MUTED_STYLE }, \", \"));\n        }\n        hotkeyPieces.push(...renderHotkeyPieces(item, `hk-${idx}`));\n    });\n\n    const extraRows = (lines && lines.length)\n        ? flattenAndWrap(lines, \"line\")\n        : [];\n\n    const rows = [];\n    if (hotkeyPieces.length) {\n        rows.push(h(Box, { key: \"hotkeys\", flexDirection: \"row\" }, ...hotkeyPieces));\n    }\n    if (extraRows.length) {\n        rows.push(h(Box, { key: \"lines\", flexDirection: \"row\" }, ...extraRows));\n    }\n\n    return h(Box, { flexDirection: \"column\" }, ...rows);\n}","/**\n * Shared proportional scrollbar (ASCII — block glyphs are often double-width).\n */\n\nexport const BAR_THUMB = \"#\";\nexport const BAR_TRACK = \"|\";\n\n/**\n * Proportional scrollbar glyphs for a viewport.\n * @returns {string[]|null} one glyph per viewport row, or null when no overflow\n */\nexport function scrollbarGlyphs(viewportRows, totalLines, scrollTop) {\n    const view = Math.max(1, Math.floor(viewportRows));\n    const total = Math.max(0, Math.floor(totalLines));\n    if (total <= view) return null;\n\n    const maxScroll = total - view;\n    const thumbSize = Math.max(1, Math.round((view / total) * view));\n    const travel = Math.max(0, view - thumbSize);\n    const s = Math.min(Math.max(0, Math.floor(scrollTop)), maxScroll);\n    const thumbStart = maxScroll === 0 ? 0 : Math.round((s / maxScroll) * travel);\n\n    const glyphs = [];\n    for (let i = 0; i < view; i++) {\n        glyphs.push(i >= thumbStart && i < thumbStart + thumbSize ? BAR_THUMB : BAR_TRACK);\n    }\n    return glyphs;\n}\n\n/** ⌥/Ctrl + arrows and PgUp/PgDn → pageUp / pageDown actions. */\nexport const PAGE_SCROLL_KEY_BINDINGS = [\n    { key: \"upArrow\", meta: true, caption: \"page\", action: \"pageUp\", order: 0 },\n    { key: \"downArrow\", meta: true, caption: \"page\", action: \"pageDown\", order: 0 },\n    { key: \"upArrow\", ctrl: true, caption: \"page\", action: \"pageUp\", order: 0 },\n    { key: \"downArrow\", ctrl: true, caption: \"page\", action: \"pageDown\", order: 0 },\n    { key: \"pageUp\", caption: \"page\", action: \"pageUp\", order: 0 },\n    { key: \"pageDown\", caption: \"page\", action: \"pageDown\", order: 0 },\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\";\nimport {\n    BAR_THUMB,\n    BAR_TRACK,\n    PAGE_SCROLL_KEY_BINDINGS,\n    scrollbarGlyphs,\n} from \"./scrollbar.js\";\n\nconst h = createElement;\n\n/**\n * Make room for a 1-cell scrollbar. Full-width table rows are padEnd'd (trailing\n * space) — trim one cell. Short labels are left alone (bar just appends).\n */\nfunction clipNameForScrollbar(name, needsBar) {\n    if (!needsBar || name == null) return name;\n    const s = String(name);\n    if (s.length <= 1) return s;\n    if (/\\s$/.test(s)) return s.slice(0, -1);\n    return s;\n}\n\n// TODO: Define proper context type interface\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Multi-column list component\n * Handles its own navigation, actions, and key bindings\n */\nexport function MultiColumnListComponent({ items, ctx, selectedIndexRef }) {\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 = [];\n    for (let row = 0; row < itemsPerColumn; row++) {\n        const cols = [];\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}) {\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 = [];\n    for (let row = 0; row < itemsPerColumn; row++) {\n        const cols = [];\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 = [];\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 = \" \", onSelectionChange }) {\n    const [, forceUpdate] = useState({});\n    const [sortOrder, setSortOrder] = useState(\"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    const itemsRef = useRef(items);\n    itemsRef.current = items;\n\n    // Default getTitle - returns item if string, otherwise item.title\n    const defaultGetTitle = (item) => {\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    const displayItemsRef = useRef(displayItems);\n    displayItemsRef.current = displayItems;\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    const onSelectionChangeRef = useRef(onSelectionChange);\n    onSelectionChangeRef.current = onSelectionChange;\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            const list = displayItemsRef.current;\n            onSelectionChangeRef.current?.(newIndex, list[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            forceUpdate({});\n        });\n\n        ctx.setAction(\"moveDown\", () => {\n            const currentItems = displayItemsRef.current;\n            const maxIndex = Math.max(0, currentItems.length - 1);\n            const newIndex = Math.min(maxIndex, selectedIndexRef.current + 1);\n            selectedIndexRef.current = newIndex;\n            onSelectionChangeRef.current?.(newIndex, currentItems[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            forceUpdate({});\n        });\n\n        // Viewport scroll (without moving selection)\n        ctx.setAction(\"scrollUp\", () => {\n            const { scrollOffset: currentScrollOffset } = scrollStateRef.current;\n            setScrollOffset(Math.max(0, currentScrollOffset - 1));\n            forceUpdate({});\n        });\n\n        ctx.setAction(\"scrollDown\", () => {\n            const { scrollOffset: currentScrollOffset, maxHeight: currentMaxHeight, totalItems } =\n                scrollStateRef.current;\n            const currentMaxScrollOffset = Math.max(0, totalItems - currentMaxHeight);\n            setScrollOffset(Math.min(currentMaxScrollOffset, currentScrollOffset + 1));\n            forceUpdate({});\n        });\n\n        // Page: move selection by one viewport, keep it visible (⌥/Ctrl+↑↓, PgUp/PgDn)\n        ctx.setAction(\"pageUp\", () => {\n            const { maxHeight: vh } = scrollStateRef.current;\n            const page = Math.max(1, vh || 1);\n            const newIndex = Math.max(0, selectedIndexRef.current - page);\n            selectedIndexRef.current = newIndex;\n            const list = displayItemsRef.current;\n            onSelectionChangeRef.current?.(newIndex, list[newIndex]);\n            setScrollOffset(newIndex);\n            forceUpdate({});\n        });\n\n        ctx.setAction(\"pageDown\", () => {\n            const { maxHeight: vh, totalItems } = scrollStateRef.current;\n            const page = Math.max(1, vh || 1);\n            const maxIndex = Math.max(0, totalItems - 1);\n            const newIndex = Math.min(maxIndex, selectedIndexRef.current + page);\n            selectedIndexRef.current = newIndex;\n            const list = displayItemsRef.current;\n            onSelectionChangeRef.current?.(newIndex, list[newIndex]);\n            const maxScroll = Math.max(0, totalItems - page);\n            setScrollOffset(Math.min(maxScroll, Math.max(0, newIndex - page + 1)));\n            forceUpdate({});\n        });\n\n        const navBindings = [\n            { key: \"upArrow\", caption: \"navigate\", action: \"moveUp\", order: 0 },\n            { key: \"downArrow\", caption: \"navigate\", action: \"moveDown\", order: 0 },\n            ...PAGE_SCROLL_KEY_BINDINGS,\n        ];\n\n        // Set up sort action if sortable\n        if (sortable) {\n            ctx.setAction(\"toggleSort\", () => {\n                const nextSort = \n                    sortOrder === \"none\" ? \"asc\" : \n                        sortOrder === \"asc\" ? \"desc\" : \"none\";\n                \n                // Store the currently selected item from the current display items\n                const currentSelectedItem = displayItemsRef.current[selectedIndexRef.current];\n                \n                setSortOrder(nextSort);\n                \n                // Calculate the new sorted items\n                const newSortedItems = nextSort !== \"none\" ? [...itemsRef.current].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                }) : itemsRef.current;\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            ctx.setKeyBinding([\n                ...navBindings,\n                {\n                    key: \"s\",\n                    caption: \"toggle sort\",\n                    action: \"toggleSort\",\n                    order: 5,\n                    kind: \"toggle\",\n                    value: sortOrder === \"none\" ? undefined : sortOrder === \"asc\" ? \"ASC\" : \"DESC\",\n                    valueStyle: highlightStyle,\n                },\n            ]);\n\n            // Force update to show the new caption in footer\n            ctx.update();\n        } else {\n            ctx.setKeyBinding(navBindings);\n        }\n    }, [sortOrder, sortable]);\n\n    const selectedIndex = selectedIndexRef.current;\n    const needsBar = displayItems.length > effectiveMaxHeight;\n    const barGlyphs = needsBar\n        ? scrollbarGlyphs(effectiveMaxHeight, displayItems.length, clampedScrollOffset)\n        : null;\n\n    const appendBar = (rowContent, displayIndex) => {\n        if (!barGlyphs) return rowContent;\n        const glyph = barGlyphs[displayIndex] ?? BAR_TRACK;\n        return h(\n            Box,\n            { flexDirection: \"row\" },\n            rowContent,\n            h(Text, { color: glyph === BAR_THUMB ? \"cyan\" : \"gray\" }, glyph),\n        );\n    };\n\n    // Default renderer — edge ↑/↓ only when there is no scrollbar (bar replaces them).\n    const defaultRenderItem = (item, isSelected, displayIndex, actualIndex) => {\n        const isFirstVisible = displayIndex === 0;\n        const isLastVisible = displayIndex === visibleItems.length - 1;\n\n        let arrowPrefix = \"  \";\n        if (!needsBar) {\n            if (isFirstVisible && canScrollUp) arrowPrefix = \"↑ \";\n            else if (isLastVisible && canScrollDown) arrowPrefix = \"↓ \";\n        }\n\n        const selectionPrefix = isSelected\n            ? selectionMarker\n            : \" \".repeat(selectionMarker.length);\n\n        const label = clipNameForScrollbar(item.name, needsBar);\n\n        return h(\n            Box,\n            { flexDirection: \"row\" },\n            h(Text, { key: \"arrow\", color: \"white\" }, arrowPrefix),\n            h(Text, { key: \"marker\", color: \"white\" }, selectionPrefix),\n            h(\n                Text,\n                {\n                    key: \"name\",\n                    color: isSelected ? \"black\" : \"white\",\n                    backgroundColor: isSelected ? \"cyan\" : undefined,\n                    bold: isSelected,\n                },\n                label,\n            ),\n        );\n    };\n\n    const itemRenderer = renderItem || defaultRenderItem;\n\n    return h(\n        Box,\n        { flexDirection: \"column\" },\n        ...visibleItems.map((item, displayIndex) => {\n            const actualIndex = clampedScrollOffset + displayIndex;\n            const isSelected = actualIndex === selectedIndex;\n\n            if (renderItem) {\n                const isFirstVisible = displayIndex === 0;\n                const isLastVisible = displayIndex === visibleItems.length - 1;\n\n                let arrowPrefix = \"  \";\n                if (!needsBar) {\n                    if (isFirstVisible && canScrollUp) arrowPrefix = \"↑ \";\n                    else if (isLastVisible && canScrollDown) arrowPrefix = \"↓ \";\n                }\n\n                const selectionPrefix = isSelected\n                    ? selectionMarker\n                    : \" \".repeat(selectionMarker.length);\n\n                const clipped = needsBar\n                    ? { ...item, name: clipNameForScrollbar(item.name, true) }\n                    : item;\n\n                const row = h(\n                    Box,\n                    { flexDirection: \"row\" },\n                    h(Text, { key: \"arrow\", color: \"white\" }, arrowPrefix),\n                    h(Text, { key: \"marker\", color: \"white\" }, selectionPrefix),\n                    renderItem(clipped, isSelected, displayIndex),\n                );\n\n                return h(ScreenRow, {\n                    key: `slot-${displayIndex}`,\n                    children: appendBar(row, displayIndex),\n                });\n            }\n\n            return h(ScreenRow, {\n                key: `slot-${displayIndex}`,\n                children: appendBar(\n                    itemRenderer(item, isSelected, displayIndex, actualIndex),\n                    displayIndex,\n                ),\n            });\n        }),\n    );\n}\n","/**\n * Key-binding helpers for showScreen (matching + footer labels).\n *\n * Bindings may set `meta` / `ctrl` / `shift` booleans. Plain bindings (flags\n * omitted) do not match when that modifier is held, so `↑` and `⌥↑` can coexist.\n */\n\n/**\n * Stable identity for replace/remove (key + modifiers).\n * @param {{ key: string, meta?: boolean, ctrl?: boolean, shift?: boolean }} b\n */\nexport function bindingIdentity(b) {\n    return [\n        String(b?.key ?? \"\"),\n        b?.meta ? \"m\" : \"\",\n        b?.ctrl ? \"c\" : \"\",\n        b?.shift ? \"s\" : \"\",\n    ].join(\"|\");\n}\n\n/**\n * @param {{ key: string, meta?: boolean, ctrl?: boolean, shift?: boolean }} binding\n * @param {string} input\n * @param {import(\"ink\").Key} key\n */\nexport function bindingMatchesInput(binding, input, key) {\n    if (!binding?.key) return false;\n\n    let keyMatches = false;\n    if (key?.[binding.key]) {\n        keyMatches = true;\n    } else if (input === binding.key) {\n        keyMatches = true;\n    } else if (key?.name === binding.key) {\n        keyMatches = true;\n    }\n    if (!keyMatches) return false;\n\n    // Explicit true → require; explicit false → forbid; omitted → forbid if pressed\n    // (so plain upArrow does not fire for meta+up).\n    const modOk = (flag, pressed) => {\n        if (flag === true) return !!pressed;\n        if (flag === false) return !pressed;\n        return !pressed;\n    };\n\n    // Ink's useInput sets `meta: true` whenever `name === \"escape\"` (Escape is\n    // the terminal meta prefix). Treat that as a lone Esc, not Option+key.\n    const inkEscapeMeta = binding.key === \"escape\" && key?.escape;\n    if (!inkEscapeMeta && !modOk(binding.meta, key?.meta)) return false;\n    if (!modOk(binding.ctrl, key?.ctrl)) return false;\n    if (binding.shift !== undefined && !!key?.shift !== !!binding.shift) return false;\n\n    return true;\n}\n\nconst KEY_LABELS = {\n    escape: \"esc\",\n    leftArrow: \"←\",\n    rightArrow: \"→\",\n    upArrow: \"↑\",\n    downArrow: \"↓\",\n    return: \"enter\",\n    pageUp: \"PgUp\",\n    pageDown: \"PgDn\",\n};\n\n/**\n * Human label for one binding (modifiers + key), e.g. `⌥↑`, `^↓`, `PgUp`.\n * @param {{ key: string, meta?: boolean, ctrl?: boolean, shift?: boolean }} binding\n */\nexport function formatBindingKey(binding) {\n    let label = KEY_LABELS[binding.key] || binding.key;\n    if (binding.shift) label = `⇧${label}`;\n    if (binding.ctrl) label = `^${label}`;\n    // ink `meta` is Option/Alt on macOS (⌘ is usually eaten by the terminal).\n    if (binding.meta) label = `⌥${label}`;\n    return label;\n}\n","/**\n * Ink's log-update always does eraseLines(whole frame) + reprint. That blank\n * intermediate is the flicker. We intercept those writes and update only\n * changed lines in place (like less).\n *\n * Ink writes `yogaOutput + \"\\n\"`. After that, the cursor sits on a new empty\n * line — not on a trailing content row. split(\"\\n\") includes a final \"\" for\n * that newline; CUU must use the content-row count, not the split length.\n */\n\nconst ESC = \"\\u001b[\";\nconst ERASE_LINE = `${ESC}2K`;\nconst CURSOR_UP = `${ESC}1A`;\nconst CURSOR_LEFT = `${ESC}G`;\n\n/** Same formula as ansi-escapes `eraseLines(count)`. */\nexport function inkEraseLines(count) {\n    let clear = \"\";\n    for (let i = 0; i < count; i++) {\n        clear += ERASE_LINE + (i < count - 1 ? CURSOR_UP : \"\");\n    }\n    if (count) clear += CURSOR_LEFT;\n    return clear;\n}\n\nconst ERASE_LINES_RE = /^(?:\\u001b\\[2K\\u001b\\[1A)*\\u001b\\[2K\\u001b\\[G/;\nconst CLEAR_TERMINAL_RE = /^\\u001b\\[2J(?:\\u001b\\[3J)?(?:\\u001b\\[H|\\u001b\\[0f)?/;\n\nexport function splitInkLogWrite(str) {\n    const s = String(str ?? \"\");\n    if (CLEAR_TERMINAL_RE.test(s)) {\n        return { kind: \"clear\", body: s };\n    }\n    const m = s.match(ERASE_LINES_RE);\n    if (m) {\n        return { kind: \"frame\", body: s.slice(m[0].length) };\n    }\n    return { kind: \"raw\", body: s };\n}\n\nexport function splitFrameLines(body) {\n    return String(body ?? \"\").split(\"\\n\");\n}\n\n/** Drop the trailing \"\" that split() adds for Ink's final newline. */\nexport function contentRows(lines) {\n    const rows = Array.isArray(lines) ? lines.slice() : [];\n    if (rows.length > 0 && rows[rows.length - 1] === \"\") rows.pop();\n    return rows;\n}\n\n/**\n * Cursor is on the empty line after the previous frame. Move to the first\n * content row and rewrite only diffs, then park on the line after the new\n * last content row (Ink's convention).\n */\nexport function paintFrameDiff(prevLines, nextLines) {\n    const prev = contentRows(prevLines);\n    const next = contentRows(nextLines);\n    if (prev.length === 0 && next.length === 0) return \"\";\n\n    let out = \"\";\n    if (prev.length > 0) {\n        out += `${ESC}${prev.length}A`;\n    }\n\n    for (let i = 0; i < next.length; i++) {\n        if (prev[i] !== next[i]) {\n            out += ERASE_LINE + CURSOR_LEFT + next[i];\n        }\n        out += \"\\n\";\n    }\n\n    const leftovers = prev.length - next.length;\n    if (leftovers > 0) {\n        for (let i = 0; i < leftovers; i++) {\n            out += ERASE_LINE;\n            if (i < leftovers - 1) out += \"\\n\";\n        }\n        if (leftovers > 1) {\n            out += `${ESC}${leftovers - 1}A`;\n        }\n        out += CURSOR_LEFT;\n    }\n\n    return out;\n}\n\nfunction finishWrite(stdout, payload, enc, done) {\n    const ok = stdout.write(payload, enc);\n    if (typeof done === \"function\") done();\n    return ok;\n}\n\n/**\n * @param {NodeJS.WriteStream} [stdout]\n * @returns {NodeJS.WriteStream}\n */\nexport function createFlickerFreeStdout(stdout = process.stdout) {\n    let prevLines = [];\n\n    const write = (chunk, encoding, cb) => {\n        const done = typeof encoding === \"function\" ? encoding : cb;\n        const enc = typeof encoding === \"function\" ? undefined : encoding;\n        const str = typeof chunk === \"string\" ? chunk : Buffer.from(chunk).toString();\n        const parsed = splitInkLogWrite(str);\n\n        if (parsed.kind === \"clear\") {\n            const after = str.replace(CLEAR_TERMINAL_RE, \"\");\n            prevLines = after ? splitFrameLines(after) : [];\n            return finishWrite(stdout, str, enc, done);\n        }\n\n        if (parsed.kind === \"frame\") {\n            if (parsed.body === \"\") {\n                prevLines = [];\n                return finishWrite(stdout, str, enc, done);\n            }\n            const nextLines = splitFrameLines(parsed.body);\n            if (prevLines.length === 0) {\n                prevLines = nextLines;\n                return finishWrite(stdout, parsed.body, enc, done);\n            }\n            const painted = paintFrameDiff(prevLines, nextLines);\n            prevLines = nextLines;\n            return finishWrite(stdout, painted, enc, done);\n        }\n\n        if (prevLines.length === 0 && parsed.body.includes(\"\\n\")) {\n            prevLines = splitFrameLines(parsed.body);\n        }\n        return stdout.write(chunk, encoding, cb);\n    };\n\n    return new Proxy(stdout, {\n        get(target, prop) {\n            if (prop === \"write\") return write;\n            const value = Reflect.get(target, prop, target);\n            return typeof value === \"function\" ? value.bind(target) : value;\n        },\n    });\n}\n","/**\n * Screen System - Action-based architecture\n */\n\nimport { useState, createElement as h } from \"react\";\nimport { render, useInput, Box, Text } from \"ink\";\nimport chalk from \"chalk\";\nimport { ScreenContainer, ScreenRow, ScreenTitle, ScreenDivider, ScreenFooter, normalizeFooterHotkey } from \"./components.js\";\nimport { MultiColumnListComponent, MultiColumnListWithPreviewComponent, ListComponent } from \"./list-components.js\";\nimport {\n    bindingIdentity,\n    bindingMatchesInput,\n    formatBindingKey,\n} from \"./key-bindings.js\";\nimport { createFlickerFreeStdout } from \"./flicker-free-stdout.js\";\n\n// Types\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Group key bindings by caption for footer display\n */\nexport function groupKeyBindings(bindings) {\n    const groups = {};\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(formatBindingKey(binding));\n        if (binding.kind) groups[caption].kind = binding.kind;\n        if (binding.value !== undefined) groups[caption].value = binding.value;\n        if (binding.valueStyle) groups[caption].valueStyle = binding.valueStyle;\n    });\n\n    return Object.values(groups);\n}\n\n/**\n * Turn key bindings into `{ hotkey, caption }` items for ScreenFooter.\n * Does not style anything — ScreenFooter paints each hotkey.\n *\n * @param {object[]} bindings\n * @param {\"long\"|\"short\"} [mode]\n */\nexport function bindingsToFooterHotkeys(bindings, mode = \"long\") {\n    const customItems = [];\n    const stringBindings = [];\n\n    (bindings || []).forEach((binding) => {\n        if (binding.enabled === false) return;\n        let caption = binding.caption;\n        if (typeof caption === \"function\") {\n            caption = caption();\n        }\n        if (caption != null && typeof caption !== \"string\") {\n            customItems.push({\n                hotkey: [formatBindingKey(binding)],\n                caption: \"\",\n                node: caption,\n                order: binding.order || 999,\n                kind: binding.kind,\n                value: binding.value,\n                valueStyle: binding.valueStyle,\n            });\n            return;\n        }\n        stringBindings.push({ ...binding, caption: caption || \"\" });\n    });\n\n    const groups = groupKeyBindings(stringBindings);\n    groups.sort((a, b) => a.order - b.order);\n\n    const items = groups.map((group) => {\n        const item = {\n            hotkey: group.keys,\n            caption: mode === \"short\" ? \"\" : group.caption,\n            order: group.order,\n        };\n        if (group.kind) item.kind = group.kind;\n        if (group.value !== undefined) item.value = group.value;\n        if (group.valueStyle) item.valueStyle = group.valueStyle;\n        return item;\n    });\n\n    customItems.forEach((item) => items.push(item));\n    items.sort((a, b) => (a.order || 999) - (b.order || 999));\n    return items;\n}\n\n/** @deprecated Use bindingsToFooterHotkeys — returns structured footer items. */\nexport function formatKeyBindings(bindings, mode = \"long\") {\n    return bindingsToFooterHotkeys(bindings, mode);\n}\n\nexport { FOOTER_HOTKEY_STYLE, FOOTER_MUTED_STYLE, normalizeFooterHotkey } from \"./components.js\";\n\n/** Bold default-fg key; `reset` clears a prior dim so later keys stay bright. */\nexport function styleFooterHotkey(label) {\n    return chalk.reset.bold(String(label));\n}\n\n/** Dim caption / separator; `reset` clears bold from the preceding key. */\nexport function styleFooterMuted(text) {\n    return chalk.reset.dim(String(text));\n}\n\n/**\n * One footer binding: highlighted keys, dim \"to …\" caption.\n * Returns a chalk string (not Ink nodes) so every key is independently bright.\n * @param {string} keyStr\n * @param {string} [caption]\n * @param {\"long\"|\"short\"} [mode]\n */\nexport function formatFooterHotkey(keyStr, caption = \"\", mode = \"long\") {\n    const keys = String(keyStr)\n        .split(\"/\")\n        .map((part) => styleFooterHotkey(part))\n        .join(styleFooterMuted(\"/\"));\n    if (mode === \"long\" && caption) {\n        return keys + styleFooterMuted(` to ${caption}`);\n    }\n    return keys;\n}\n\n/**\n * Format keys for display\n */\nexport function formatKeys(keys) {\n    // `keys` may already be display labels (from groupKeyBindings) or raw key names.\n    const keyMap = {\n        escape: \"esc\",\n        leftArrow: \"←\",\n        rightArrow: \"→\",\n        upArrow: \"↑\",\n        downArrow: \"↓\",\n        return: \"enter\",\n        pageUp: \"PgUp\",\n        pageDown: \"PgDn\",\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) {\n    const {\n        title,\n        onRender,\n        parentData = {}\n    } = config;\n\n\n    return new Promise((resolve) => {\n        // eslint-disable-next-line prefer-const\n        let instance;\n\n        // Persistent collections (closure variables survive re-renders)\n        const keyBindings = [];\n        const actions = {};\n        const customFooterItems = [];\n        let smartFooterHotkeys = null;\n        let renderResult = null;\n        let initialized = false;\n\n        const Screen = () => {\n            const [, setUpdateCounter] = useState(0);\n\n            // Initialize defaults only once\n            if (!initialized) {\n                const defaultBindings = [\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 = {\n                setAction: (actionName, handlerFn) => {\n                    actions[actionName] = handlerFn;\n                },\n\n                setKeyBinding: (bindingOrBindings) => {\n                    // Support both single object and array\n                    const bindingsToSet = Array.isArray(bindingOrBindings) ? bindingOrBindings : [bindingOrBindings];\n\n                    bindingsToSet.forEach(binding => {\n                        const id = bindingIdentity(binding);\n                        const existingIndex = keyBindings.findIndex(\n                            (b) => bindingIdentity(b) === id,\n                        );\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, updates) => {\n                    // Prefer identity match when updates carry modifiers; else first key name.\n                    const id =\n                        updates && (updates.meta != null || updates.ctrl != null || updates.shift != null)\n                            ? bindingIdentity({ key: keyName, ...updates })\n                            : null;\n                    const index = keyBindings.findIndex((b) =>\n                        id ? bindingIdentity(b) === id : b.key === keyName,\n                    );\n                    if (index >= 0) {\n                        // Update only specified properties\n                        keyBindings[index] = {\n                            ...keyBindings[index],\n                            ...updates\n                        };\n                    }\n                },\n\n                removeKeyBinding: (keyNameOrBinding) => {\n                    const index =\n                        typeof keyNameOrBinding === \"object\" && keyNameOrBinding\n                            ? keyBindings.findIndex(\n                                  (b) => bindingIdentity(b) === bindingIdentity(keyNameOrBinding),\n                              )\n                            : keyBindings.findIndex((b) => b.key === keyNameOrBinding);\n                    if (index >= 0) {\n                        if (keyBindings[index].protected) {\n                            console.warn(`Cannot remove protected key: ${keyNameOrBinding}`);\n                            return;\n                        }\n                        keyBindings.splice(index, 1);\n                    }\n                },\n\n                addFooter: (item) => {\n                    customFooterItems.push(item);\n                },\n\n                clearFooter: () => {\n                    customFooterItems.length = 0;\n                },\n\n                setFooter: (items) => {\n                    customFooterItems.length = 0;\n                    const itemsArray = Array.isArray(items) ? items : [items];\n                    customFooterItems.push(...itemsArray);\n                },\n\n                /**\n                 * Structured hotkey footer. With no args, rebuild from current\n                 * key bindings. With an array, use those `{ hotkey, caption }`\n                 * items (and optional `kind: \"toggle\", value`) instead.\n                 */\n                setSmartFooter: (items) => {\n                    if (items == null) {\n                        smartFooterHotkeys = null;\n                    } else {\n                        const arr = Array.isArray(items) ? items : [items];\n                        smartFooterHotkeys = arr.map(normalizeFooterHotkey).filter(Boolean);\n                    }\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) => {\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, key) => {\n                // Check Ctrl+C for exit\n                if (key.ctrl && input === \"c\") {\n                    cleanup(null);\n                    process.exit(0);\n                    return;\n                }\n\n                // Paste is a multi-char string; Ink leaves only shift/meta/ctrl\n                // on `key`. Do not treat that as a hotkey (`s`, `r`, …).\n                const keyFlags = Object.entries(key || {})\n                    .filter(([, v]) => v === true)\n                    .map(([k]) => k);\n                const pasteLike = keyFlags.every((k) => k === \"shift\" || k === \"meta\" || k === \"ctrl\");\n                if (typeof input === \"string\" && input.length > 1 && pasteLike) {\n                    return;\n                }\n\n                // Find matching key binding\n                let matchedBinding = null;\n\n                for (const binding of keyBindings) {\n                    if (binding.enabled === false) continue;\n                    if (!bindingMatchesInput(binding, input, key)) continue;\n                    if (binding.condition && !binding.condition(context)) continue;\n\n                    matchedBinding = binding;\n                    break;\n                }\n\n                if (matchedBinding && actions[matchedBinding.action]) {\n                    // Execute action\n                    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            const footerHotkeys = smartFooterHotkeys\n                ?? bindingsToFooterHotkeys(keyBindings, \"long\");\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, {\n                    hotkeys: footerHotkeys,\n                    lines: customFooterItems,\n                })\n            );\n        };\n\n        const cleanup = (result) => {\n            if (instance) instance.unmount();\n            setTimeout(() => resolve(result), 50);\n        };\n\n        instance = render(h(Screen), {\n            patchConsole: false,\n            stdout: createFlickerFreeStdout(process.stdout),\n        });\n    });\n}\n\n/**\n * Helper: Show list screen (single column menu)\n */\nexport async function showListScreen(config) {\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) {\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) {\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 { createElement as h } from \"react\";\nimport { Box, Text } from \"ink\";\n\n// Types\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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}) {\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: _maxWidth \n}) {\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 }) {\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}) {\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: _onChange, onSubmit: _onSubmit }) {\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 * Tail-follow helpers for ScrollableText.\n * Follow while the viewport is pinned to the last line; leave follow on\n * scroll-up; resume when the user scrolls back to the bottom.\n */\n\nexport function clampScroll(scrollTop, maxScroll) {\n    const max = Math.max(0, Number(maxScroll) || 0);\n    const top = Number(scrollTop) || 0;\n    return Math.min(Math.max(0, top), max);\n}\n\nexport function isScrolledToBottom(scrollTop, maxScroll) {\n    return clampScroll(scrollTop, maxScroll) >= Math.max(0, Number(maxScroll) || 0);\n}\n\nexport function nextScrollAfterUserMove(scrollTop, maxScroll, delta) {\n    const next = clampScroll((Number(scrollTop) || 0) + (Number(delta) || 0), maxScroll);\n    return { scrollTop: next, following: isScrolledToBottom(next, maxScroll) };\n}\n\nexport function nextScrollAfterContentChange({ following, scrollTop, maxScroll }) {\n    const max = Math.max(0, Number(maxScroll) || 0);\n    if (following) return { scrollTop: max, following: true };\n    const next = clampScroll(scrollTop, max);\n    return { scrollTop: next, following: isScrolledToBottom(next, max) };\n}\n","/**\n * ScrollableText — wrap long text, line/page scroll, proportional scrollbar.\n *\n *   h(ScrollableText, { ctx, text: json, bindKeys: true })\n *\n * Keys (when bindKeys):\n *   ↑/↓         — one line\n *   ⌥↑/↓ ^↑/↓   — one page (ink `meta` ≈ Option/Alt; ⌘ often never reaches the TTY)\n *   PgUp/PgDn   — one page\n */\n\nimport { useState, useEffect, useMemo, useRef, createElement } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { getScreenWidth } from \"./components.js\";\nimport { getScreenBodyRows } from \"./screen-layout.js\";\nimport {\n    BAR_THUMB,\n    BAR_TRACK,\n    PAGE_SCROLL_KEY_BINDINGS,\n    scrollbarGlyphs,\n} from \"./scrollbar.js\";\nimport { nextScrollAfterContentChange, nextScrollAfterUserMove } from \"./follow-scroll.js\";\nimport { padEndVisible, wrapTextLines } from \"./visible-text.js\";\n\nexport { scrollbarGlyphs } from \"./scrollbar.js\";\nexport { wrapTextLines } from \"./visible-text.js\";\n\nconst h = createElement;\n\nconst SCROLL_KEYS = [\n    { key: \"upArrow\", caption: \"scroll\", action: \"scrollUp\", order: 0 },\n    { key: \"downArrow\", caption: \"scroll\", action: \"scrollDown\", order: 0 },\n    ...PAGE_SCROLL_KEY_BINDINGS,\n];\n/**\n * @param {{\n *   ctx: object,\n *   text?: string,\n *   lines?: string[],\n *   maxHeight?: number,\n *   wrap?: boolean,\n *   showScrollbar?: boolean,\n *   showStatus?: boolean,\n *   bindKeys?: boolean,\n *   header?: unknown,\n *   followBottom?: boolean,\n *   reserveRows?: number,\n * }} props\n */\nexport function ScrollableText({\n    ctx,\n    text = \"\",\n    lines: linesProp,\n    maxHeight,\n    wrap = true,\n    showScrollbar = true,\n    showStatus = true,\n    bindKeys = true,\n    header = null,\n    followBottom = false,\n    reserveRows = 0,\n}) {\n    const [scrollTop, setScrollTop] = useState(0);\n    const [following, setFollowing] = useState(() => !!followBottom);\n\n    const extraRows = (header == null ? 0 : 1) + (showStatus ? 1 : 0) + (Number(reserveRows) || 0);\n    const viewportRows = Math.max(\n        4,\n        maxHeight != null ? Math.floor(maxHeight) : getScreenBodyRows({ extraRows }),\n    );\n\n    // Match ScreenContainer inner width: container is term-4, minus border+paddingX → term-8\n    // (same heuristic as ListComponent / ScreenDivider).\n    const contentCols = Math.max(20, getScreenWidth() - 4);\n    // Always reserve the bar column when enabled so wrap width does not jump when overflow starts.\n    const barCols = showScrollbar ? 1 : 0;\n    const textWidth = Math.max(8, contentCols - barCols);\n\n    const allLines = useMemo(() => {\n        if (Array.isArray(linesProp)) return linesProp.map((l) => String(l ?? \"\"));\n        return wrap ? wrapTextLines(text, textWidth) : String(text ?? \"\").split(\"\\n\");\n    }, [linesProp, text, wrap, textWidth]);\n\n    const needsBar = showScrollbar && allLines.length > viewportRows;\n    const maxScroll = Math.max(0, allLines.length - viewportRows);\n    const clamped = Math.min(Math.max(0, scrollTop), maxScroll);\n    const visible = allLines.slice(clamped, clamped + viewportRows);\n    const bar = needsBar ? scrollbarGlyphs(viewportRows, allLines.length, clamped) : null;\n\n    const maxScrollRef = useRef(maxScroll);\n    const pageSizeRef = useRef(viewportRows);\n    const scrollTopRef = useRef(scrollTop);\n    const followingRef = useRef(following);\n    maxScrollRef.current = maxScroll;\n    pageSizeRef.current = viewportRows;\n    scrollTopRef.current = scrollTop;\n    followingRef.current = following;\n\n    useEffect(() => {\n        const next = nextScrollAfterContentChange({\n            following: followBottom && followingRef.current,\n            scrollTop: scrollTopRef.current,\n            maxScroll,\n        });\n        if (next.scrollTop !== scrollTopRef.current) setScrollTop(next.scrollTop);\n        if (followBottom && next.following !== followingRef.current) setFollowing(next.following);\n    }, [maxScroll, followBottom]);\n\n    const applyUserScroll = (delta) => {\n        const next = nextScrollAfterUserMove(scrollTopRef.current, maxScrollRef.current, delta);\n        setScrollTop(next.scrollTop);\n        if (followBottom) setFollowing(next.following);\n        // Do not ctx.update() — that remounts the bordered Screen and flashes.\n        // Slot keys stay `slot-i` so Ink patches line text in place (like less).\n    };\n\n    useEffect(() => {\n        if (!ctx || !bindKeys) return undefined;\n\n        ctx.setKeyBinding(SCROLL_KEYS);\n\n        ctx.setAction(\"scrollUp\", () => applyUserScroll(-1));\n        ctx.setAction(\"scrollDown\", () => applyUserScroll(1));\n        ctx.setAction(\"pageUp\", () => applyUserScroll(-pageSizeRef.current));\n        ctx.setAction(\"pageDown\", () => applyUserScroll(pageSizeRef.current));\n\n        return undefined;\n    }, [ctx, bindKeys, followBottom]);\n\n    const status =\n        allLines.length === 0\n            ? \"empty\"\n            : `lines ${clamped + 1}-${Math.min(clamped + visible.length, allLines.length)} of ${allLines.length}` +\n              (needsBar ? \" · ⌥↑/↓ or PgUp/Dn page\" : \"\") +\n              (followBottom && following ? \" · follow\" : followBottom ? \" · follow off\" : \"\");\n\n    // Fixed-width rows + stable slot keys: scrolling updates text, does not remount.\n    // Always emit `viewportRows` slots so the pane height (and Screen border) stay put.\n    const rowNodes = [];\n    for (let i = 0; i < viewportRows; i++) {\n        const line = visible[i] ?? \"\";\n        const glyph = bar ? bar[i] ?? BAR_TRACK : showScrollbar ? \" \" : \"\";\n        const isThumb = glyph === BAR_THUMB;\n        rowNodes.push(\n            h(\n                Box,\n                { key: `slot-${i}`, flexDirection: \"row\", width: contentCols, flexShrink: 0 },\n                h(\n                    Box,\n                    { width: textWidth, flexShrink: 0 },\n                    h(Text, { wrap: \"truncate\" }, padEndVisible(line, textWidth)),\n                ),\n                showScrollbar\n                    ? h(Box, { width: 1, flexShrink: 0 }, h(Text, { color: isThumb ? \"cyan\" : \"gray\" }, glyph))\n                    : null,\n            ),\n        );\n    }\n\n    return h(\n        Box,\n        { flexDirection: \"column\", overflow: \"hidden\" },\n        header == null\n            ? null\n            : typeof header === \"string\"\n              ? h(Text, { color: \"gray\" }, header)\n              : header,\n        showStatus ? h(Text, { color: \"gray\" }, status) : null,\n        ...rowNodes,\n    );\n}\n","/**\n * Typed + pasted text for Ink `useInput`.\n *\n * Ink calls the handler once with the full string when the user pastes more\n * than one character. Terminals also wrap paste in CSI 200~/201~ (bracketed\n * paste); those markers must not land in the field.\n */\n\nconst BRACKETED_PASTE_RE = /\\u001b\\[200~|\\u001b\\[201~|\\[200~|\\[201~/g;\nconst CONTROL_RE = /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f]/g;\n\nexport function sanitizeTextInput(input, { allowNewlines = false } = {}) {\n    let s = String(input ?? \"\").replace(BRACKETED_PASTE_RE, \"\");\n    if (!allowNewlines) s = s.replace(/[\\r\\n]+/g, \"\");\n    else s = s.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n    return s.replace(CONTROL_RE, \"\");\n}\n\nfunction isTextInsertKey(key) {\n    if (!key) return true;\n    if (key.return || key.escape || key.tab) return false;\n    if (key.backspace || key.delete) return false;\n    if (key.upArrow || key.downArrow || key.leftArrow || key.rightArrow) return false;\n    if (key.pageUp || key.pageDown) return false;\n    if (key.ctrl) return false;\n    return true;\n}\n\n/**\n * @param {string} current\n * @param {string} input\n * @param {object} key\n * @param {{ allowNewlines?: boolean, accept?: RegExp }} [opts]\n * @returns {string|null} next value, or null if this key is not text\n */\nexport function nextTextInputValue(current, input, key, opts = {}) {\n    const cur = String(current ?? \"\");\n    if (key?.backspace || key?.delete) return cur.slice(0, -1);\n    if (!isTextInsertKey(key)) return null;\n\n    let chunk = sanitizeTextInput(input, opts);\n    if (opts.accept instanceof RegExp) {\n        chunk = [...chunk].filter((ch) => opts.accept.test(ch)).join(\"\");\n    }\n    if (!chunk) return null;\n    return cur + chunk;\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) {\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, suffix = \"\") {\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\n\n\n\n\n\n\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 = {}) {\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 = [];\n\n    // Build main help line (navigation + actions + escape)\n    const mainParts = [];\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 = null) => 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) => 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: () => 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: () => buildFooter({\n        escape: \"Esc to continue\"\n    }),\n\n    /**\n     * Main menu footer (escape exits)\n     */\n    mainMenu: () => 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 = false) => {\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) {\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 = [];\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, useLayoutEffect, useRef, useMemo, useCallback, memo, createElement } from \"react\";\nexport { React, useState, useEffect, useLayoutEffect, useRef, useMemo, useCallback, memo };\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    formatFooterHotkey,\n    formatKeyBindings,\n    bindingsToFooterHotkeys,\n    FOOTER_HOTKEY_STYLE,\n    FOOTER_MUTED_STYLE,\n    styleFooterHotkey,\n    styleFooterMuted,\n} from \"./screens.js\";\n\n// Reusable components\nexport { MultiColumnListComponent, MultiColumnListWithPreviewComponent, ListComponent } from \"./list-components.js\";\nexport { ScreenContainer, ScreenRow, ScreenTitle, ScreenBody, ScreenFooter, ScreenDivider, normalizeFooterHotkey } from \"./components.js\";\nexport {\n    getScreenBodyRows,\n    getScreenChromeRows,\n    getScreenFrameBoxHeight,\n} from \"./screen-layout.js\";\nexport { ListItem, TextBlock, Divider, GridCell, InputField } from \"./ui-elements.js\";\nexport { ScrollableText, wrapTextLines, scrollbarGlyphs } from \"./scrollable-text.js\";\nexport { createFlickerFreeStdout } from \"./flicker-free-stdout.js\";\nexport { stripAnsi, visibleWidth, padEndVisible, sliceVisible } from \"./visible-text.js\";\nexport {\n    clampScroll,\n    isScrolledToBottom,\n    nextScrollAfterUserMove,\n    nextScrollAfterContentChange,\n} from \"./follow-scroll.js\";\nexport {\n    PAGE_SCROLL_KEY_BINDINGS,\n    BAR_THUMB,\n    BAR_TRACK,\n} from \"./scrollbar.js\";\nexport {\n    bindingIdentity,\n    bindingMatchesInput,\n    formatBindingKey,\n} from \"./key-bindings.js\";\nexport { nextTextInputValue, sanitizeTextInput } from \"./text-input.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 = null;\nexport async function load() {\n    if (loadPromise) return loadPromise;\n    loadPromise = Promise.all([\n        import(\"react\"),\n        import(\"ink\")\n    ]).then(() => {}) ;\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 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\";\n\nimport { EventEmitter } from \"events\";\n\n/**\n * Partial context used during initialization\n * Components are added as they're created\n */\n\n\n\n\n\n\n\n\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, _componentName) {\n    const reservedKeys = [\"overrides\", \"defaults\", \"modules\"];\n    const componentOptions = {};\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 = {}) {\n    // Stage 1: Create partial context first (Args will register its cleanup on it)\n    const partialContext = {\n        emitter: new EventEmitter(),\n        isStop: () => false,\n        isKill: () => false,\n        cleanupFunctions: [],\n        registerCleanup: (fn) => {\n            partialContext.cleanupFunctions.push(fn);\n        },\n    };\n\n    // Stage 2: Initialize Args with partial context so it can register unused-args cleanup\n    const args = Args.init(partialContext , {\n        overrides: opts.overrides || {},\n        defaults: opts.defaults || {},\n    });\n    partialContext.args = args;\n\n    // Stage 3: Initialize Params with partial context\n    const params = Params.init(partialContext , 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 , loggerOptions);\n    partialContext.logger = logger;\n\n    // Stage 5: Create complete context\n    const context = {\n        args,\n        params,\n        logger,\n        emitter: partialContext.emitter,\n        isStop: partialContext.isStop,\n        isKill: partialContext.isKill,\n        cleanupFunctions: partialContext.cleanupFunctions,\n        registerCleanup: partialContext.registerCleanup,\n        // For long-running scripts (servers): with --showUsedParams=top, print\n        // the used-params list now (after the script has initialized all its\n        // own components), instead of at exit. No-op for the default mode,\n        // which prints at exit via the cleanup registered by Params.\n        //\n        // --showUsedParams=stop behaves like \"top\" but then exits immediately —\n        // a quick \"show me the figured params and quit\" that skips the flow's\n        // actual work. Like --stopAfter=init, this is a hard exit(0) (registered\n        // cleanups are skipped); call it once components/params are resolved.\n        _requestExitCode: null,\n        requestExit: null,\n        showUsedParamsIfNeeded: () => {\n            const mode = params.getShowUsedParamsMode?.();\n            if (mode !== \"top\" && mode !== \"stop\") return;\n            params.printUsedParams(logger);\n            if (mode === \"stop\") {\n                logger.debug?.(\"[showUsedParams=stop] params printed — exiting\");\n                process.exit(0);\n            }\n        },\n    };\n\n    // Interactive CLIs (tasksmm) call this before returning so leftover\n    // knex/DNS handles cannot keep the process alive after cleanup.\n    context.requestExit = (code = 0) => {\n        context._requestExitCode = code;\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, opts = {}) {\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) {\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, opts = {}) {\n    let stop = false;\n    let kill = false;\n    let context = null;\n    let cleanupRan = false;\n\n    const runRegisteredCleanups = async (ctx) => {\n        if (cleanupRan) return;\n        cleanupRan = true;\n        const fns = [...ctx.cleanupFunctions].reverse();\n        const budgetMs = 5_000;\n        const started = Date.now();\n        for (const fn of fns) {\n            const left = budgetMs - (Date.now() - started);\n            if (left <= 0) {\n                ctx.logger.warn(\"[cleanup] budget exhausted — skipping remaining cleanup\");\n                break;\n            }\n            try {\n                await Promise.race([\n                    Promise.resolve(fn(ctx)),\n                    new Promise((_, reject) => {\n                        const t = setTimeout(\n                            () => reject(new Error(`cleanup timed out after ${left}ms`)),\n                            left,\n                        );\n                        t.unref?.();\n                    }),\n                ]);\n            } catch (error) {\n                ctx.logger.warn(\"[cleanup] error in cleanup function:\", error);\n            }\n        }\n    };\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        // Cooperative stop (SIGINT/SIGTERM) vs urgent kill (SIGUSR2).\n        // Kill also sets stop so existing `isStop()` loops exit promptly.\n        context.isStop = () => stop;\n        context.isKill = () => kill;\n\n        // Setup modules (future feature)\n        context = await setupModules(context, opts);\n\n        // Resolve params used by init (stopAfter, stopAllowance) early.\n        // `stopAllowance` is seconds (CLI/env); runners and pm2 kill_timeout use ms.\n        const stopAfter = context.args.get(\"stopAfter\");\n        const stopAllowanceSec = Number(context.params.get(\"stopAllowance\", \"number default 60\"));\n        const stopAllowanceMs = (Number.isFinite(stopAllowanceSec) && stopAllowanceSec >= 0\n            ? stopAllowanceSec\n            : 60) * 1000;\n        context.stopAllowanceSec = stopAllowanceSec;\n        context.stopAllowanceMs = stopAllowanceMs;\n\n        if (stopAfter === \"init\") {\n            printAllParameters(context);\n            process.exit(0);\n        }\n\n        // Graceful shutdown: first Ctrl+C sets stop + emits; second runs registered cleanups then exits.\n        // (Previously, process.exit(2) on second SIGINT skipped try/finally, so registerCleanup never ran.)\n        let sigintCount = 0;\n        let firstSigintAt = 0;\n        process.on(\"SIGINT\", async () => {\n            if (!context) return;\n            const now = Date.now();\n            if (sigintCount === 0) {\n                sigintCount = 1;\n                firstSigintAt = now;\n                stop = true;\n                context.logger.info(\n                    `>> emitting stop with allowance ${stopAllowanceSec}s (${stopAllowanceMs}ms)`\n                );\n                context.emitter.emit(\"stop\", stopAllowanceMs);\n                return;\n            }\n            // A single Ctrl+C can reach Node as TWO SIGINTs (e.g. under\n            // `npm run`: the terminal signals the whole process group AND npm\n            // forwards the signal). Those duplicates land within a few ms, so\n            // ignore a second SIGINT that arrives shortly after the first —\n            // otherwise we'd force-exit (below) before the graceful cleanup\n            // chain finishes, skipping late cleanups like --showUsedParams.\n            if (now - firstSigintAt < 250) return;\n            context.logger.warn(\"[process] second SIGINT: running cleanup then exit\");\n            await runRegisteredCleanups(context);\n            process.exit(2);\n        });\n\n        process.on(\"SIGTERM\", () => {\n            if (!context || stop) return;\n            stop = true;\n            context.logger.info(\n                `>> SIGTERM: emitting stop with allowance ${stopAllowanceSec}s (${stopAllowanceMs}ms)`\n            );\n            context.emitter.emit(\"stop\", stopAllowanceMs);\n        });\n\n        // Urgent abort (e.g. `pm2 sendSignal SIGUSR2 <app>`). Parents that spawn\n        // children (retro loops) should forward SIGUSR2 on the \"kill\" event so the\n        // child init flips isKill() and breaks its own loops cooperatively.\n        process.on(\"SIGUSR2\", () => {\n            if (!context || kill) return;\n            kill = true;\n            stop = true;\n            context.logger.warn(\">> SIGUSR2: emitting kill (urgent stop)\");\n            context.emitter.emit(\"kill\");\n            context.emitter.emit(\"stop\", stopAllowanceMs);\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, ...args) => {\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        if (context) {\n            await runRegisteredCleanups(context);\n        }\n        // Open handles (logger, SDK agents, signal listeners, …) can keep Node\n        // alive after the flow returns. Under pm2 that becomes a zombie: the\n        // runner has unregistered and disconnected, but pm2 waits kill_timeout\n        // then SIGKILL. Force-exit on errors and on cooperative/signal stop.\n        if (process.exitCode && process.exitCode !== 0) {\n            process.exit(process.exitCode);\n        } else if (stop || kill) {\n            process.exit(0);\n        } else if (context._requestExitCode != null) {\n            process.exit(context._requestExitCode);\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 = {}) {\n    return setup(opts);\n}\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\n\n\n\n\n\n\n\n\n\n\n\n\n\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    args = {};\n    flags = {};\n    options = {};\n    commands = [];\n    usedKeys = new Set();\n    aliases = {};\n    overrides = {};\n    defaults = {};\n    prefixes = [];\n    nots = [];\n    configValues = {};\n    configsLoaded = [];\n    env = \"local\";\n\n    constructor(contextOrConfig = {}, config) {\n        // Support (context, config) or (config) for backward compatibility\n        const hasContext = config !== undefined;\n        const configToUse = hasContext ? (config ?? {}) : (contextOrConfig ?? {});\n        const context = hasContext ? contextOrConfig : undefined;\n\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(configToUse).length > 0) {\n            this.configure(configToUse);\n        }\n\n        // Parse arguments first to get environment\n        const args = configToUse.args || process.argv.slice(2);\n        this.parseArgs(args);\n\n        // Runtime environment selector (--env / ENV / NODE_ENV). Default \"local\".\n        // Prefer process env before .env (pm2 ecosystem / ensure-env.cjs). After\n        // loadDotEnv, re-resolve so a late ENV (or .env ENV=) still applies —\n        // pm2 has been observed to omit ecosystem env on the first start after\n        // a kill_timeout SIGKILL.\n        this.env = this.get(\"env\")?.toLowerCase() || \"local\";\n\n        // Load .env file (single file with LOCAL / PRODUCTION / STAGE variants)\n        this.loadDotEnv();\n\n        const envAfterDotEnv = this.get(\"env\")?.toLowerCase();\n        if (envAfterDotEnv) {\n            this.env = envAfterDotEnv;\n        }\n\n        // Load configuration files\n        this.loadConfigFiles();\n\n        // Check for conflicts (short + long form of same option)\n        this.checkConflicts();\n\n        // Register cleanup to warn about unused CLI args on exit (when context has registerCleanup)\n        if (context && typeof context.registerCleanup === \"function\") {\n            context.registerCleanup((ctx) => {\n                const unusedArgs = ctx.args.getUnused();\n                if (unusedArgs.length > 0) {\n                    ctx.logger.warn(\"Unused CLI args:\", unusedArgs.join(\", \"));\n                }\n            });\n        }\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) {\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     * Args.init(context, config) when used from init/setup: context has registerCleanup, Args registers unused-args cleanup.\n     * Args.init(config) for standalone use (no cleanup).\n     */\n    static init(contextOrConfig, config) {\n        if (config !== undefined) {\n            return new Args(contextOrConfig, config);\n        }\n        return new Args(contextOrConfig ?? {});\n    }\n\n    /**\n     * Parse command line arguments\n     */\n    parseArgs(args) {\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    parseLongOption(arg) {\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    parseShortOption(arg, args, index) {\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    parseValue(value) {\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    setValue(key, value) {\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    checkConflicts() {\n        const conflicts = [];\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) {\n        const resolvedKey = this.aliases[key] || key;\n        // Normalize key to lowercase for case-insensitive lookups\n        // This ensures that params.get(\"showAuthRequest\") works regardless of how\n        // the key was provided (CLI: --showAuthRequest, --showauthrequest, env: SHOW_AUTH_REQUEST)\n        const lcKey = resolvedKey.toLowerCase();\n        this.usedKeys.add(lcKey);\n\n        // Precedence order: overrides > CLI args > config files > env vars > defaults\n        // All lookups are case-insensitive using lcKey\n        \n        // Case-insensitive lookup for overrides\n        const overrideKey = Object.keys(this.overrides).find(k => k.toLowerCase() === lcKey);\n        if (overrideKey !== undefined) {\n            return this.overrides[overrideKey];\n        }\n\n        // Case-insensitive lookup for CLI args\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        // Case-insensitive lookup for config file values\n        const configKey = Object.keys(this.configValues).find(k => k.toLowerCase() === lcKey);\n        if (configKey !== undefined) {\n            return this.configValues[configKey];\n        }\n\n        // Environment variable (convert key to ENV_VAR format)\n        // Use resolvedKey (original case) for env var conversion to preserve camelCase -> SNAKE_CASE\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        \n        // Try exact match first (case-insensitive)\n        const envKeyFound = Object.keys(process.env).find((k) => k.toUpperCase() === envKey);\n        \n        // If not found, try alternative formats (e.g., TRESTLE_IDXPLUS_2_ID -> TRESTLE_IDXPLUS2_ID)\n        // This handles cases where env var names don't follow standard camelCase->SNAKE_CASE conversion\n        const envKeyAlt = envKey.replace(/_([0-9])/g, \"$1\"); // Remove underscore before numbers\n        const envKeyAltFound = !envKeyFound ? Object.keys(process.env).find((k) => k.toUpperCase() === envKeyAlt) : null;\n\n        if (envSpecificKey) {\n            return process.env[envSpecificKey];\n        } else if (envKeyFound) {\n            return process.env[envKeyFound];\n        } else if (envKeyAltFound) {\n            return process.env[envKeyAltFound];\n        }\n\n        // Case-insensitive lookup for defaults\n        const defaultKey = Object.keys(this.defaults).find(k => k.toLowerCase() === lcKey);\n        if (defaultKey !== undefined) {\n            return this.defaults[defaultKey];\n        }\n\n        // NODE_ENV fallback for 'env' key (like legacy)\n        if (lcKey === \"env\" && process.env.NODE_ENV !== undefined) {\n            return process.env.NODE_ENV;\n        }\n\n        return undefined;\n    }\n\n    /**\n     * Return which layer provided the value for get(key): overrides, cli, config, env, or default.\n     * Does not add key to usedKeys. Use after get(key) when you need the origin.\n     */\n    getSource(key) {\n        const resolvedKey = this.aliases[key] || key;\n        const lcKey = resolvedKey.toLowerCase();\n\n        const overrideKey = Object.keys(this.overrides).find(k => k.toLowerCase() === lcKey);\n        if (overrideKey !== undefined) return \"overrides\";\n\n        const lcKeyWithEnv = `${lcKey}${this.env ? `_${this.env.toLowerCase()}` : \"\"}`;\n        if (this.env && this.args[lcKeyWithEnv] !== undefined) return \"cli\";\n        if (this.args[lcKey] !== undefined) return \"cli\";\n\n        const configKey = Object.keys(this.configValues).find(k => k.toLowerCase() === lcKey);\n        if (configKey !== undefined) return \"config\";\n\n        const envKey = this.toEnvKey(resolvedKey);\n        const envKeyWithEnv = `${envKey}${this.env ? `_${this.env.toUpperCase()}` : \"\"}`;\n        const envSpecificKey = Object.keys(process.env).find(k => this.env && k.toUpperCase() === envKeyWithEnv);\n        const envKeyFound = Object.keys(process.env).find(k => k.toUpperCase() === envKey);\n        const envKeyAlt = envKey.replace(/_([0-9])/g, \"$1\");\n        const envKeyAltFound = !envKeyFound ? Object.keys(process.env).find(k => k.toUpperCase() === envKeyAlt) : null;\n        if (envSpecificKey || envKeyFound || envKeyAltFound) return \"env\";\n\n        const defaultKey = Object.keys(this.defaults).find(k => k.toLowerCase() === lcKey);\n        if (defaultKey !== undefined) return \"default\";\n        if (lcKey === \"env\" && process.env.NODE_ENV !== undefined) return \"env\";\n\n        return undefined;\n    }\n\n    /**\n     * Set a value (for testing/internal use)\n     */\n    set(key, value) {\n        this.args[key] = value;\n    }\n\n    /**\n     * Check if a command exists (case-insensitive)\n     */\n    hasCommand(cmd) {\n        return this.commands.some((command) => command.toLowerCase() === cmd.toLowerCase());\n    }\n\n    /**\n     * Get all commands\n     */\n    getCommands() {\n        return [...this.commands];\n    }\n\n    /**\n     * Get used keys (as array)\n     */\n    getUsed() {\n        return Array.from(this.usedKeys);\n    }\n\n    /**\n     * Get unused keys (as array)\n     */\n    getUnused() {\n        const unused = [];\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     * Converts camelCase to SNAKE_CASE\n     */\n    toEnvKey(key) {\n        // If already in SNAKE_CASE (contains underscores and is uppercase), return as-is\n        if (key.includes(\"_\") && key === key.toUpperCase()) {\n            return key;\n        }\n\n        // Convert camelCase to SNAKE_CASE\n        // Standard conversion: add underscore before capitals and numbers\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    loadDotEnv() {\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        // Prefer a single .env that holds all env-suffixed keys (KEY_LOCAL,\n        // KEY_PRODUCTION, …). Optional `.env.<env>` overlay is still supported\n        // for examples / one-off overrides, but only after the base .env.\n        let dotEnvPathFile = resolve(dotEnvPath, dotEnvFile);\n\n        if (!existsSync(dotEnvPathFile) && !this.get(\"dotEnvPath\")) {\n            const examplesPath = resolve(dotEnvPath, \"examples\");\n            const examplesEnvFile = resolve(examplesPath, dotEnvFile);\n            if (existsSync(examplesEnvFile)) {\n                dotEnvPathFile = examplesEnvFile;\n            } else {\n                dotEnvPathFile = resolve(dotEnvPath, \"..\", dotEnvFile);\n            }\n        }\n\n        if (dotEnvPathFile && existsSync(dotEnvPathFile)) {\n            config({ path: dotEnvPathFile, quiet: true });\n        }\n\n        // Optional overlay: .env.production / .env.local (does not replace base .env)\n        const envSpecificFile = `.env.${this.env}`;\n        const envSpecificPath = resolve(dotEnvPath, envSpecificFile);\n        if (existsSync(envSpecificPath) && envSpecificPath !== dotEnvPathFile) {\n            config({ path: envSpecificPath, quiet: true });\n        } else if (!this.get(\"dotEnvPath\")) {\n            const examplesOverlay = resolve(dotEnvPath, \"examples\", envSpecificFile);\n            if (existsSync(examplesOverlay)) {\n                config({ path: examplesOverlay, quiet: true });\n            }\n        }\n    }\n\n    /**\n     * Load configuration files\n     */\n    loadConfigFiles() {\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    resolveFileWithPath(\n        optConfigFilePath,\n        cfgFile,\n        env\n    ) {\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    splitPath(filePath) {\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    requireConfigFile(filePath) {\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() {\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) {\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 = null;\n\n/**\n * Initialize Args instance (singleton pattern)\n */\nexport function init(args) {\n    instance = new Args({ args });\n    return instance;\n}\n\n/**\n * Get the current Args instance (singleton pattern)\n */\nexport function getArgsInstance() {\n    return instance;\n}\n\n\n","import Joi from \"joi\";\nimport { ParamError } from \"../errors.js\";\nimport { joiEdateType, joiStringArrayType } from \"./custom-types.js\";\n\n/**\n * Parameter definition types\n */\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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    context; // Partial context during initialization\n    params = {};\n    paramSources = {};\n    definitions = {};\n    args;\n    paramSetters = [];\n    paramGetters = [];\n    trackedParams = [];\n    _currentModule = \"script\";\n    /**\n     * Resolved early in constructor so cleanup does not read params lazily.\n     * One of: false (off) | \"end\" (print at exit) | \"top\" (print after init,\n     * via context.showUsedParamsIfNeeded()) | \"stop\" (print after init, then\n     * exit the process — also via context.showUsedParamsIfNeeded()).\n     */\n    _showUsedParamsMode = false;\n    /** Guard so the dump prints at most once (top OR end, never both). */\n    _usedParamsPrinted = false;\n\n    constructor(context, options = {}) {\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        // Resolve showUsedParams early (fail fast, consistent with \"params figured in init\")\n        this._resolveShowUsedParams();\n\n        if (context && typeof context.registerCleanup === \"function\") {\n            context.registerCleanup((ctx) => {\n                // Print at exit unless it was already printed at the top\n                // (--showUsedParams=top via context.showUsedParamsIfNeeded()).\n                // printUsedParams is idempotent, so \"top\" runs here are no-ops;\n                // it also acts as a fallback if a \"top\" script never called\n                // showUsedParamsIfNeeded().\n                if (!ctx.params.getShowUsedParamsMode()) return;\n                ctx.params.printUsedParams(ctx.logger);\n            });\n        }\n    }\n\n    /**\n     * Resolve the --showUsedParams mode. The flag is intentionally dual-typed:\n     *   (absent) / --no-showUsedParams / =false   -> false  (off)\n     *   --showUsedParams / =true                   -> \"end\"  (print at exit)\n     *   --showUsedParams=top                       -> \"top\"  (print after init)\n     *   --showUsedParams=stop                      -> \"stop\" (print after init, then exit)\n     * Read raw (uncoerced) from args so the string \"top\"/\"stop\" isn't forced to\n     * a boolean, then track it under the \"script\" module for the dump itself.\n     */\n    _resolveShowUsedParams() {\n        const raw = this.args.get(\"showUsedParams\"); // also marks the key as used\n        const source = this.args.getSource?.(\"showUsedParams\") ?? \"default\";\n\n        let mode = false;\n        if (raw === undefined || raw === null) {\n            mode = false;\n        } else if (typeof raw === \"string\" && raw.trim().toLowerCase() === \"top\") {\n            mode = \"top\";\n        } else if (typeof raw === \"string\" && raw.trim().toLowerCase() === \"stop\") {\n            mode = \"stop\";\n        } else {\n            const s = typeof raw === \"string\" ? raw.trim().toLowerCase() : raw;\n            const falsey = s === false || s === \"false\" || s === \"0\" || s === \"no\" || s === \"off\";\n            mode = falsey ? false : \"end\";\n        }\n\n        this._showUsedParamsMode = mode;\n        this.trackParam(\"showUsedParams\", \"string\", mode, raw === undefined ? \"default\" : source, \"script\");\n        return mode;\n    }\n\n    /** Whether --showUsedParams was requested in any mode (truthy = on). */\n    getShowUsedParams() {\n        return this._showUsedParamsMode !== false;\n    }\n\n    /** Resolved mode: false | \"end\" | \"top\" | \"stop\". */\n    getShowUsedParamsMode() {\n        return this._showUsedParamsMode;\n    }\n\n    /**\n     * Print the module-grouped list of figured params (the --showUsedParams\n     * dump). Idempotent: only the first call prints, so callers can invoke it\n     * at the top (long-running services) without double-printing at exit.\n     */\n    printUsedParams(logger) {\n        if (this._usedParamsPrinted) return;\n        const byModule = this.getFiguredByModule();\n        const modules = Object.keys(byModule).sort();\n        if (modules.length === 0) return;\n        this._usedParamsPrinted = true;\n\n        logger = logger ?? this.context?.logger ?? console;\n        const hasHighlight = typeof logger.highlight === \"function\";\n        logger.debug(\"[Params]: list of used params:\");\n        for (const mod of modules) {\n            logger.debug(`  [${mod}]`);\n            for (const [key, entry] of Object.entries(byModule[mod])) {\n                const valueStr = JSON.stringify(entry.value);\n                const display = (hasHighlight && entry.source !== \"default\")\n                    ? logger.highlight(valueStr)\n                    : valueStr;\n                logger.debug(`    ${key}: ${display} (${entry.source})`);\n            }\n        }\n    }\n\n    /**\n     * Configure parameters\n     * Only parameters present in options are updated\n     */\n    configure(options) {\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, options) {\n        return new Params(context, options || {});\n    }\n\n    /**\n     * Track a parameter request for --stopAfter=init and --showUsedParams\n     */\n    trackParam(key, definition, value, source, moduleName) {\n        this.trackedParams.push({\n            key,\n            definition,\n            value,\n            source,\n            module: moduleName ?? this._currentModule,\n        });\n    }\n\n    /**\n     * Report a param value that a component RESOLVED ON ITS OWN — outside\n     * Params.get() — e.g. discovered by combining its config files (the way\n     * blueprints merge defaults/aggregator/feed data). Without this, every\n     * key such a component probed for an override shows up in the\n     * --showUsedParams dump as \"undefined (default)\"; reporting upgrades the\n     * entry to the value the component actually works with.\n     *\n     * Attribution rules:\n     *   - entries figured from an explicit input (cli/env/options/…) are left\n     *     untouched — the component merely confirmed them, the origin stands;\n     *   - \"default\" entries (Params had nothing) and earlier reports are\n     *     replaced by the report;\n     *   - keys never seen by Params are appended as new entries.\n     * The LATEST report wins — a component may resolve the same key several\n     * times with increasing specificity (e.g. a blueprint re-merged for a\n     * concrete resource) and the dump should show what it settled on.\n     * Later params.get() probes that find nothing (\"default\") never shadow a\n     * reported value — see {@link getFiguredByModule}.\n     *\n     * @param {string} key\n     * @param {*} value - the value the component actually uses\n     * @param {string} [source=\"discovered\"] - short origin label, e.g. \"blueprint\"\n     * @param {string} [moduleName] - dump section; defaults to the current module\n     */\n    reportResolved(key, value, source = \"discovered\", moduleName) {\n        const mod = moduleName ?? this._currentModule;\n        const mine = this.trackedParams.filter((e) => e.key === key && e.module === mod);\n        if (mine.some((e) => e.source !== \"default\" && !e.reported)) {\n            return; // explicitly figured (cli/env/options/…) — that origin stands\n        }\n        // Replace default probes and earlier reports with this report.\n        this.trackedParams = this.trackedParams.filter(\n            (e) => !(e.key === key && e.module === mod)\n        );\n        this.trackedParams.push({\n            key,\n            definition: \"reported\",\n            value,\n            source,\n            module: mod,\n            reported: true,\n        });\n    }\n\n    /**\n     * Get all tracked parameters (for --stopAfter=init)\n     */\n    getTrackedParams() {\n        return [...this.trackedParams];\n    }\n\n    /**\n     * Get all figured parameters as a record (flat, last occurrence per key)\n     * Returns all parameters that were collected during initialization,\n     * whether from CLI args, options, or defaults\n     */\n    getAllFigured() {\n        const result = {};\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     * Get figured parameters grouped by module name.\n     * Same param can appear in multiple modules (e.g. source, resource).\n     * Last occurrence per key wins, EXCEPT that an empty probe — a\n     * params.get() that found nothing (\"default\", undefined) — never shadows\n     * a value reported via {@link reportResolved}: components probe for\n     * overrides on every resolution cycle, and those misses say nothing about\n     * the value the component actually uses.\n     */\n    getFiguredByModule() {\n        const reported = new Set();\n        for (const param of this.trackedParams) {\n            if (param.reported) reported.add(`${param.module}\\u0000${param.key}`);\n        }\n        const byModule = {};\n        for (const param of this.trackedParams) {\n            const mod = param.module;\n            if (!byModule[mod]) byModule[mod] = {};\n            if (\n                !param.reported &&\n                param.source === \"default\" &&\n                reported.has(`${mod}\\u0000${param.key}`)\n            ) {\n                continue;\n            }\n            byModule[mod][param.key] = { value: param.value, source: param.source };\n        }\n        return byModule;\n    }\n\n    /**\n     * Clear tracked parameters\n     */\n    clearTrackedParams() {\n        this.trackedParams = [];\n    }\n\n    /**\n     * Assign a parameter definition\n     */\n    assignDefinition(key, definition) {\n        if (this.definitions[key] && !definition) {\n            return this.definitions[key];\n        }\n\n        let type;\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) {\n        let type;\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(/\\s*required\\s*/)) {\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, val, def) {\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) => 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, definition) {\n        const def = this.assignDefinition(key, definition);\n        let valFromGetters = undefined;\n        \n        // eslint-disable-next-line no-constant-condition\n        if (def.volatile || true) {\n            valFromGetters = this.runAllRegisteredGetters(key);\n        }\n        \n        // Always call args.get() to mark the key as used, even if it doesn't exist\n        const valFromArgs = this.args.get(key);\n        const valFromParams = this.params[key];\n\n        let source = \"default\";\n        let value;\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            const argsSource = (this.args ).getSource?.(key);\n            if (argsSource === \"overrides\") source = \"options\";\n            else if (argsSource === \"cli\" || argsSource === \"env\" || argsSource === \"config\") source = argsSource;\n            else if (argsSource === \"default\") source = \"default\";\n            else source = \"cli\";\n        } else if (valFromParams !== undefined && valFromParams !== null) {\n            value = this.validate(key, valFromParams, def);\n            source = this.paramSources[key] ?? \"options\";\n        } else {\n            value = this.validate(key, undefined, def);\n            source = \"default\";\n        }\n\n        this.paramSources[key] = source;\n        // Track parameter for --stopAfter=init and --showUsedParams\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, val, definition) {\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        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 (main script).\n     * Same as getAllForModule(\"script\", defs). Processes left-to-right for cross-parameter references.\n     * Libraries should use {@link getAllForModule} with an explicit module name (or {@link runWithModule}\n     * around {@link get}) so --showUsedParams groups usage correctly.\n     */\n    getAll(defs) {\n        return this.getAllForModule(\"script\", defs);\n    }\n\n    /**\n     * Get all parameters from definitions for a given module name.\n     * Figured params are grouped by module when using --showUsedParams.\n     * Processes parameters left-to-right to support cross-parameter references.\n     * If moduleName is omitted, it is inferred from the caller's file path (directory name under src/).\n     */\n    getAllForModule(moduleNameOrDefs, defs) {\n        let moduleName;\n        let definitions;\n        if (defs !== undefined) {\n            moduleName = moduleNameOrDefs ;\n            definitions = defs;\n        } else {\n            definitions = moduleNameOrDefs ;\n            moduleName = this._inferModuleNameFromStack();\n        }\n        const prev = this._currentModule;\n        this._currentModule = moduleName;\n        try {\n            const res = {};\n            for (const [k, def] of Object.entries(definitions)) {\n                const value = this.get(k, def);\n                res[k] = value;\n                if (value !== undefined) {\n                    this.params[k] = value;\n                }\n            }\n            return res;\n        } finally {\n            this._currentModule = prev;\n        }\n    }\n\n    /**\n     * Run a callback with {@link _currentModule} set so single {@link get} calls are tracked\n     * under the same module (for --showUsedParams / getFiguredByModule).\n     */\n    runWithModule(moduleName, fn) {\n        const prev = this._currentModule;\n        this._currentModule = moduleName;\n        try {\n            return fn();\n        } finally {\n            this._currentModule = prev;\n        }\n    }\n\n    /**\n     * Async variant of {@link runWithModule} for modules that await params.get().\n     */\n    async runWithModuleAsync(moduleName, fn) {\n        const prev = this._currentModule;\n        this._currentModule = moduleName;\n        try {\n            return await fn();\n        } finally {\n            this._currentModule = prev;\n        }\n    }\n\n    /**\n     * Infer module name from call stack: first caller outside params/index gives path like .../src/<moduleName>/...\n     */\n    _inferModuleNameFromStack() {\n        const stack = new Error().stack;\n        if (!stack) return \"script\";\n        const lines = stack.split(\"\\n\");\n        const paramsIndexPath = \"params\" + (typeof process !== \"undefined\" && process.platform === \"win32\" ? \"\\\\\" : \"/\") + \"index.\";\n        for (const line of lines) {\n            const parenMatch = line.match(/\\(([^)]+)\\)/);\n            if (!parenMatch) continue;\n            const parts = parenMatch[1].split(\":\");\n            if (parts.length < 3) continue;\n            const path = parts.slice(0, -2).join(\":\").replace(/^file:\\/\\//, \"\");\n            if (!path || path.includes(paramsIndexPath)) continue;\n            const srcMatch = path.match(/[/\\\\]src[/\\\\]([^/\\\\]+)(?:[/\\\\]|$)/);\n            if (srcMatch) return srcMatch[1];\n        }\n        return \"script\";\n    }\n\n    /**\n     * Run all registered getters for a key\n     */\n    runAllRegisteredGetters(key) {\n        let val = 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, value) {\n        let setterUsed = 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) {\n        this.paramGetters.push(fn);\n    }\n\n    /**\n     * Register a parameter setter\n     */\n    registerParamSetter(fn) {\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) {\n        super(message);\n        this.name = \"FrameworkError\";\n    }\n}\n\nexport class ParamError extends FrameworkError {\n    constructor(message) {\n        super(message);\n        this.name = \"ParamError\";\n    }\n}\n\nexport class InitError extends FrameworkError {\n    constructor(message) {\n        super(message);\n        this.name = \"InitError\";\n    }\n}\n\nexport class CriticalRequestError extends FrameworkError {\n    constructor(message) {\n        super(message);\n        this.name = \"CriticalRequestError\";\n    }\n}\n\nexport class ControlFlowError extends Error {\n    constructor(message) {\n        super(message);\n        this.name = \"ControlFlowError\";\n    }\n}\n\nexport class HttpClientError extends FrameworkError {\n    constructor(message,   cause) {\n        super(message);this.cause = cause;;\n        this.name = \"HttpClientError\";\n    }\n}\n\nexport class FileDatabaseError extends FrameworkError {\n    constructor(message) {\n        super(message);\n        this.name = \"FileDatabaseError\";\n    }\n}\n\n","\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, helpers) => {\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 ).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;\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, unit, sign) {\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) => (value, _helpers) => {\n    if (value === undefined || typeof value === \"function\") {\n        return [];\n    }\n    \n    const arr = value.split(/,\\s*/).map((el) => {\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\n\n\n\n\n\n\n\n\n\nimport { ConsoleTransport, ParentProcessTransport } from \"./transports.js\";\n\n\nconst ALL_LEVELS = [\n    \"silly\",\n    \"debug\",\n    \"logic\",\n    \"info\",\n    \"notice\",\n    \"warn\",\n    \"error\",\n    \"results\",\n    \"request\",\n    \"response\",\n    \"progress\"\n];\nconst DEFAULT_LEVELS = ALL_LEVELS.filter((l) => l !== \"silly\");\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 = {\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    // Magenta stands out from white info / green request lines.\n    progress: chalk.magentaBright,\n    results: chalk.magenta\n};\n\nfunction paint(level, text, { color = true, bold = false } = {}) {\n    if (!color || text == null || text === \"\") return text == null ? \"\" : String(text);\n    const formatter = LEVEL_COLORS[level] ?? chalk.white;\n    return bold ? formatter.bold(text) : formatter(text);\n}\n\nfunction inspectChunks(chunks, color = true) {\n    return (chunks ?? [])\n        .map((chunk) => util.inspect(chunk, { colors: color, depth: null }))\n        .join(\" \");\n}\n\n/**\n * Format a log struct for a terminal. Used by Logger and by UIs (tasksmm)\n * that persist structs and render them later.\n *\n * @param {{ level?: string, message?: string, name?: string, task?: string, prefix?: string, count?: unknown, total?: unknown,\n *           elapsed?: number, remaining?: number, rate?: number, chunks?: unknown[], results?: unknown }} struct\n * @param {{ timestamp?: boolean, showLevel?: boolean, color?: boolean, now?: Date|string|number }} [options]\n */\nexport function formatLog(struct = {}, options = {}) {\n    const level = String(struct.level || \"info\").toLowerCase();\n    const color = options.color !== false;\n    const parts = [];\n    const now = options.now != null ? new Date(options.now) : new Date();\n\n    if (options.timestamp) {\n        const d = Number.isNaN(now.getTime()) ? new Date() : now;\n        parts.push(d.toISOString());\n    }\n\n    if (options.showLevel) {\n        parts.push(level.toUpperCase().padEnd(MAX_LEVEL_LENGTH));\n    }\n\n    const taskName = struct.task != null ? String(struct.task).trim() : \"\";\n    if (taskName) {\n        parts.push(color ? chalk.cyan(`[${taskName}]`) : `[${taskName}]`);\n    }\n\n    if (level === \"progress\") {\n        if (struct.prefix) {\n            parts.push(paint(level, struct.prefix, { color, bold: true }));\n        }\n        if (struct.count !== undefined && struct.total !== undefined) {\n            parts.push(paint(level, `${struct.count}/${struct.total}`, { color }));\n        }\n    } else if (struct.prefix) {\n        parts.push(color ? chalk.cyan(`[${struct.prefix}]`) : `[${struct.prefix}]`);\n    }\n\n    if (struct.message) {\n        parts.push(paint(level, struct.message, { color, bold: true }));\n    }\n\n    if (level === \"progress\") {\n        if (struct.elapsed !== undefined && struct.remaining !== undefined) {\n            parts.push(paint(level, `${struct.elapsed}/${struct.remaining}`, { color }));\n        }\n        if (struct.rate !== undefined) {\n            parts.push(paint(level, Number(struct.rate) >= 0 ? `${struct.rate}/s` : \"-/s\", { color }));\n        }\n    }\n\n    if (struct.chunks && struct.chunks.length) {\n        parts.push(inspectChunks(struct.chunks, color));\n    }\n\n    if (struct.results) {\n        parts.push(paint(level, JSON.stringify(struct.results, null, 4), { color }));\n    }\n\n    return parts.join(\" \");\n}\n\nexport class Logger  {\n    context; // Partial context during initialization\n    options;\n    transport;\n    startTimes = {};\n    /** Count at the first progress sample for each prefix (rate baseline). */\n    startCounts = {};\n    lastProgressTimes = {};\n\n    constructor(context, options = {}) {\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. Accepts both LoggerOptions shape and flat param names\n     * (levels string, progressWithTimes, progressWithRate, progressThrottleMs).\n     */\n    configure(options) {\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) this.options.prefix = options.prefix;\n        if (options.name !== undefined) this.options.name = options.name;\n        if (options.logName !== undefined) this.options.name = options.logName;\n        if (options.task !== undefined) this.options.task = options.task;\n        if (options.silent !== undefined) this.options.silent = options.silent;\n        if (options.showLevel !== undefined) this.options.showLevel = options.showLevel;\n        if (options.timestamp !== undefined) this.options.timestamp = options.timestamp;\n        if (options.levels !== undefined) {\n            const levels = typeof options.levels === \"string\" ? options.levels.split(\",\") : options.levels;\n            this.options.levels = this.normalizeLevels(levels);\n        }\n        if (options.progress !== undefined) {\n            if (options.progress.withTimes !== undefined) this.options.progressTimes = options.progress.withTimes;\n            if (options.progress.withRate !== undefined) this.options.progressRate = options.progress.withRate;\n            if (options.progress.throttleMs !== undefined) this.options.progressThrottle = options.progress.throttleMs;\n        }\n        const flat = options ;\n        if (flat.progressWithTimes !== undefined) this.options.progressTimes = flat.progressWithTimes;\n        if (flat.progressWithRate !== undefined) this.options.progressRate = flat.progressWithRate;\n        if (flat.progressThrottleMs !== undefined) this.options.progressThrottle = flat.progressThrottleMs;\n    }\n\n    /**\n     * Initialize logger from context and CLI parameters. Whatever is in options goes (after discovered params).\n     * Params are tracked under the `logger` module for --showUsedParams.\n     */\n    static init(context, options) {\n        const paramDefs = {\n            mode: \"string default text\",\n            route: \"string default console\",\n            prefix: \"string\",\n            logName: \"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            progressWithRate: \"boolean default false\",\n            progressThrottleMs: \"number\",\n        };\n        const discovered = context.params.getAllForModule(\"logger\", paramDefs);\n        const config = { ...discovered, ...options } ;\n        if (!config.name && !config.logName) {\n            const fromEnv = process.env.name || process.env.SERVICE_NAME;\n            if (fromEnv) config.name = fromEnv;\n        }\n        const logger = new Logger(context, config);\n        context.logger = logger;\n        return logger;\n    }\n\n    getDefaultOptions() {\n        return {\n            mode: \"text\",\n            route: this.shouldUseIpcRoute() ? \"ipc\" : \"console\",\n            prefix: undefined,\n            name: undefined,\n            task: undefined,\n            silent: false,\n            showLevel: false,\n            timestamp: false,\n            levels: DEFAULT_LEVELS,\n            progressTimes: false,\n            progressRate: false,\n            progressThrottle: undefined,\n        };\n    }\n\n    updateTransport() {\n        this.transport = this.options.route === \"ipc\"\n            ? new ParentProcessTransport()\n            : new ConsoleTransport();\n    }\n\n    /**\n     * Same transport, tagged with a task name on every line. Does not mutate\n     * this instance — safe when maxParallel > 1.\n     *\n     * @param {string} task\n     * @returns {Logger}\n     */\n    child(task) {\n        const next = Object.create(this);\n        next.options = { ...this.options, task: task ? String(task) : this.options.task };\n        return next;\n    }\n\n    setMode(mode) {\n        if (!this.isValidMode(mode)) {\n            throw new Error(`Unsupported logger mode: ${mode}`);\n        }\n        this.options.mode = mode;\n    }\n\n    /** Returns a styled string (bright white) for highlighting; keeps chalk inside logger. */\n    highlight(text) {\n        return chalk.whiteBright(text);\n    }\n\n    debug(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"debug\", message, chunks });\n    }\n\n    info(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"info\", message, chunks });\n    }\n\n    notice(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"notice\", message, chunks });\n    }\n\n    warn(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"warn\", message, chunks });\n    }\n\n    error(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"error\", message, chunks });\n    }\n\n    logic(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"logic\", message, chunks });\n    }\n\n    silly(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"silly\", message, chunks });\n    }\n\n    results(results) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"results\", message: \"results\", results });\n    }\n\n    request(operation, ...chunks) {\n        const message = this.inspectChunks([operation, ...chunks]);\n        this.out({ level: \"request\", message });\n    }\n\n    response(operation, ...chunks) {\n        const message = this.inspectChunks([operation, ...chunks]);\n        this.out({ level: \"response\", message });\n    }\n\n    /**\n     * @returns {boolean} true when the progress line was emitted (not throttled)\n     */\n    progress(message, opts) {\n        const { prefix, count, total } = opts;\n        // If count briefly overshoots a stale total, display without negative ETA;\n        // callers should raise `total` when the feed revises @odata.count.\n        const displayTotal = Math.max(Number(total) || 0, Number(count) || 0);\n        const paddedTotal = String(displayTotal).length;\n        const paddedCount = String(count).padStart(paddedTotal, \" \");\n        const payload = {\n            level: \"progress\",\n            message,\n            count: paddedCount,\n            total: displayTotal,\n            prefix\n        };\n\n        const key = prefix ?? \"\";\n        // First sample for this prefix: establish baseline only (no rate yet).\n        // Rate/ETA use items completed since that sample, so batched reporters\n        // (e.g. every 500 records) don't inflate early /s from a late start clock.\n        if (this.startTimes[key] === undefined) {\n            this.startTimes[key] = Date.now();\n            this.startCounts[key] = count;\n        }\n        const wantTimes = this.options.progressTimes;\n        const wantRate = this.options.progressRate;\n        if (wantTimes || wantRate) {\n            const elapsedSeconds = (Date.now() - this.startTimes[key]) / 1000;\n            const done = count - (this.startCounts[key] ?? count);\n            const itemsPerSec = done > 0 && elapsedSeconds > 0 ? done / elapsedSeconds : -1;\n            if (wantTimes) {\n                let remaining = -1;\n                if (itemsPerSec > 0) {\n                    remaining = Math.max(0, (displayTotal - count) / itemsPerSec);\n                }\n                payload.elapsed = this.round(elapsedSeconds, 2);\n                payload.remaining = remaining >= 0 ? this.round(remaining, 2) : remaining;\n            }\n            if (wantRate) {\n                payload.rate = itemsPerSec >= 0 ? this.round(itemsPerSec, 2) : itemsPerSec;\n            }\n        }\n\n        // Clear rate baseline on exact completion so the next job with the same\n        // prefix re-baselines. Do not clear on overrun (count > total) — that\n        // would zero the rate until total is corrected.\n        if (count === total) {\n            delete this.startTimes[key];\n            delete this.startCounts[key];\n            delete this.lastProgressTimes[key];\n        }\n\n        if (this.shouldOutputProgress(prefix ?? \"\", count, displayTotal)) {\n            this.out(payload);\n            if (this.options.progressThrottle && prefix) {\n                this.lastProgressTimes[prefix] = Date.now();\n            }\n            return true;\n        }\n        return false;\n    }\n\n    shouldOutputProgress(prefix, count, total) {\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    out(struct) {\n        if (this.options.silent) {\n            return;\n        }\n        if (!this.options.levels.includes(struct.level)) {\n            return;\n        }\n\n        if (this.options.task && !struct.task) {\n            struct.task = this.options.task;\n        }\n        if (this.options.prefix && !struct.prefix) {\n            struct.prefix = this.options.prefix;\n        }\n\n        const output = this.options.mode === \"json\"\n            ? JSON.stringify(struct)\n            : this.formatLog(struct);\n\n        this.transport.write(output);\n    }\n\n    formatLog(struct) {\n        return formatLog(struct, {\n            timestamp: this.options.timestamp,\n            showLevel: this.options.showLevel,\n            color: true,\n        });\n    }\n\n    inspectChunks(chunks) {\n        return inspectChunks(chunks, true);\n    }\n\n    shouldUseIpcRoute() {\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    normalizeLevels(levels) {\n        if (!levels || !levels.length) {\n            return DEFAULT_LEVELS;\n        }\n\n        const tokens = levels.map((t) => String(t).trim()).filter(Boolean);\n        const explicitIncludes = tokens\n            .filter((t) => !t.startsWith(\"+\") && !t.startsWith(\"-\"))\n            .map((t) => t );\n        const addIncludes = tokens\n            .filter((t) => t.startsWith(\"+\"))\n            .map((t) => t.slice(1) );\n        const excludes = tokens\n            .filter((t) => t.startsWith(\"-\"))\n            .map((t) => t.slice(1) );\n\n        const unknown = [...explicitIncludes, ...addIncludes, ...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 = explicitIncludes.length\n            ? explicitIncludes\n            : Array.from(new Set([...DEFAULT_LEVELS, ...addIncludes]));\n        return base.filter(level => !excludes.includes(level));\n    }\n\n    isValidMode(mode) {\n        return mode === undefined || mode === null || mode === \"text\" || mode === \"json\";\n    }\n\n    round(value, places) {\n        const factor = Math.pow(10, places);\n        return Math.round(value * factor) / factor;\n    }\n}\n\n","\n\nexport class ConsoleTransport  {\n    write(payload) {\n        console.info(payload);\n    }\n}\n\nexport class ParentProcessTransport  {\n    write(payload) {\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"],"mappings":"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","names":["h","React","h","React","import_react","import_ink","chalk","config","resolve","h","import_react","import_ink","import_chalk","h","import_react","import_ink","h","import_react","import_ink","config","React","import_react","import_ink","config","relativeMatch","Joi","chalk","util","config"]}