@docyrus/docyrus 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/main.js +1 -1
- package/main.js.map +1 -1
- package/package.json +1 -1
- package/tui.mjs +493 -63
- package/tui.mjs.map +4 -4
package/tui.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../apps/api-cli/src/tui/opentuiMain.tsx", "../../../apps/api-cli/src/tui/opentui/DocyrusOpenTuiApp.tsx", "../../../apps/api-cli/src/services/tuiProcessExecutor.ts", "../../../apps/api-cli/src/errors.ts", "../../../apps/api-cli/src/tui/opentui/commandInput.ts", "../../../apps/api-cli/src/tui/opentui/renderResult.tsx", "../../../apps/api-cli/src/tui/opentui/resultDocument.ts"],
|
|
4
|
-
"sourcesContent": ["/** @jsxImportSource @opentui/react */\nimport { createCliRenderer } from \"@opentui/core\";\nimport { createRoot } from \"@opentui/react\";\nimport { DocyrusOpenTuiApp } from \"./opentui/DocyrusOpenTuiApp\";\nimport type { ITuiProcessExecutionConfig } from \"../types\";\n\ninterface ITuiLaunchConfig {\n executionConfig: ITuiProcessExecutionConfig;\n version: string;\n}\n\nfunction readRequiredEnv(name: string): string {\n const value = process.env[name];\n if (!value || value.trim().length === 0) {\n throw new Error(`Missing required launch variable: ${name}`);\n }\n\n return value;\n}\n\nfunction readLaunchConfig(): ITuiLaunchConfig {\n return {\n version: process.env.DOCYRUS_TUI_VERSION || \"dev\",\n executionConfig: {\n executable: readRequiredEnv(\"DOCYRUS_TUI_EXECUTABLE\"),\n scriptPath: readRequiredEnv(\"DOCYRUS_TUI_SCRIPT\"),\n },\n };\n}\n\nasync function startTui(): Promise<void> {\n const launchConfig = readLaunchConfig();\n const renderer = await createCliRenderer({\n exitOnCtrlC: false,\n });\n\n const root = createRoot(renderer);\n root.render(\n <DocyrusOpenTuiApp\n executionConfig={launchConfig.executionConfig}\n version={launchConfig.version}\n />,\n );\n}\n\nvoid startTui().catch((error: unknown) => {\n const message = error instanceof Error\n ? error.message\n : String(error);\n\n console.error(`Failed to start Docyrus OpenTUI: ${message}`);\n process.exitCode = 1;\n});\n", "/** @jsxImportSource @opentui/react */\nimport { useKeyboard, useRenderer } from \"@opentui/react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createTuiProcessExecutor } from \"../../services/tuiProcessExecutor\";\nimport { parseCommandLine, useCommandInput } from \"./commandInput\";\nimport { renderResult } from \"./renderResult\";\nimport type {\n IDocyrusOpenTuiAppProps,\n ITuiContextSummary,\n ITuiEnvironmentSummary,\n ITuiHistoryEntry,\n ITuiLeftSection,\n ITuiPanelFocus,\n ITuiShortcutAction,\n} from \"./types\";\nimport type { ITuiCommandResult } from \"../../types\";\n\nconst SHORTCUTS: ITuiShortcutAction[] = [\n {\n id: 1,\n run: \"env list\",\n label: \"env list\",\n },\n {\n id: 2,\n run: \"auth who\",\n label: \"auth who\",\n },\n {\n id: 3,\n run: \"apps list\",\n label: \"apps list\",\n },\n {\n id: 4,\n run: \"discover namespaces\",\n label: \"discover namespaces\",\n },\n {\n id: 5,\n template: \"studio list-data-sources --appSlug \",\n label: \"insert: studio list-data-sources --appSlug \",\n },\n {\n id: 6,\n template: \"ds list <appSlug> <dataSourceSlug>\",\n label: \"insert: ds list <appSlug> <dataSourceSlug>\",\n },\n];\n\nconst SECTION_ORDER: ITuiLeftSection[] = [\"shortcuts\", \"history\", \"messages\", \"help\"];\nconst FOCUS_ORDER: ITuiPanelFocus[] = [\"input\", \"left\", \"result\"];\nconst ESC_ARM_TIMEOUT_MS = 1400;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction extractMetadata(payload: unknown): {\n environment?: ITuiEnvironmentSummary;\n context?: ITuiContextSummary | null;\n} {\n if (!isRecord(payload)) {\n return {};\n }\n\n const environmentValue = payload.environment;\n const contextValue = payload.context;\n\n const environment = isRecord(environmentValue)\n && typeof environmentValue.id === \"string\"\n && typeof environmentValue.name === \"string\"\n ? { id: environmentValue.id, name: environmentValue.name }\n : undefined;\n\n if (contextValue === null) {\n return {\n environment,\n context: null,\n };\n }\n\n const context = isRecord(contextValue)\n && typeof contextValue.email === \"string\"\n && typeof contextValue.tenantDisplay === \"string\"\n ? {\n email: contextValue.email,\n tenantDisplay: contextValue.tenantDisplay,\n }\n : undefined;\n\n return {\n environment,\n context,\n };\n}\n\nfunction toFailedResult(error: unknown, command: string): ITuiCommandResult {\n const message = error instanceof Error\n ? error.message\n : \"Invalid command syntax.\";\n\n return {\n ok: false,\n command,\n rawOutput: \"\",\n error: {\n message,\n },\n durationMs: 0,\n };\n}\n\nfunction formatHistoryLabel(entry: ITuiHistoryEntry): string {\n const status = entry.result.ok ? \"OK\" : \"ERR\";\n const command = entry.command || \"(root)\";\n return `${status} ${command} [${entry.result.durationMs}ms]`;\n}\n\nfunction preventDefault(keyEvent: { preventDefault?: () => void }): void {\n if (typeof keyEvent.preventDefault === \"function\") {\n keyEvent.preventDefault();\n }\n}\n\nfunction isEscapeKey(keyName: string): boolean {\n return keyName === \"escape\" || keyName === \"esc\";\n}\n\nfunction isEnterKey(keyName: string): boolean {\n return keyName === \"enter\" || keyName === \"return\";\n}\n\nexport function DocyrusOpenTuiApp(props: IDocyrusOpenTuiAppProps) {\n const renderer = useRenderer();\n\n const [input, setInput] = useState(\"\");\n const [entries, setEntries] = useState<ITuiHistoryEntry[]>([]);\n const [activeEntryId, setActiveEntryId] = useState<string | null>(null);\n const [systemMessages, setSystemMessages] = useState<string[]>([]);\n const [activeSection, setActiveSection] = useState<ITuiLeftSection>(\"shortcuts\");\n const [focusedPanel, setFocusedPanel] = useState<ITuiPanelFocus>(\"left\");\n const [environment, setEnvironment] = useState<ITuiEnvironmentSummary | undefined>();\n const [context, setContext] = useState<ITuiContextSummary | null | undefined>(undefined);\n const [isRunning, setIsRunning] = useState(false);\n const [spinnerFrame, setSpinnerFrame] = useState(0);\n const [selectedShortcutIndex, setSelectedShortcutIndex] = useState(0);\n const [selectedHistoryIndex, setSelectedHistoryIndex] = useState(0);\n const [isExitConfirmOpen, setIsExitConfirmOpen] = useState(false);\n const [isEscArmed, setIsEscArmed] = useState(false);\n\n const executor = useMemo(() => {\n return createTuiProcessExecutor({\n executionConfig: props.executionConfig,\n });\n }, [props.executionConfig]);\n\n const applyCommandResult = useCallback((result: ITuiCommandResult, command: string) => {\n const entry: ITuiHistoryEntry = {\n id: `${Date.now()}-${Math.random().toString(16).slice(2)}`,\n command,\n result,\n createdAt: Date.now(),\n };\n\n setEntries((previous) => [entry, ...previous]);\n setActiveEntryId(entry.id);\n setSelectedHistoryIndex(0);\n\n if (result.messages && result.messages.length > 0) {\n setSystemMessages((previous) => [...previous, ...result.messages || []]);\n }\n\n if (result.ok && result.data !== undefined) {\n const metadata = extractMetadata(result.data);\n if (metadata.environment) {\n setEnvironment(metadata.environment);\n }\n\n if (metadata.context !== undefined) {\n setContext(metadata.context);\n }\n }\n }, []);\n\n const executeArgs = useCallback(async(args: string[], commandText: string) => {\n setIsRunning(true);\n try {\n const result = await executor.runCliCommand(args);\n applyCommandResult(result, commandText);\n }\n finally {\n setIsRunning(false);\n }\n }, [applyCommandResult, executor]);\n\n const executeLine = useCallback((line: string) => {\n let args: string[];\n\n try {\n args = parseCommandLine(line);\n }\n catch (error: unknown) {\n applyCommandResult(toFailedResult(error, line.trim()), line.trim());\n return;\n }\n\n if (args.length === 0) {\n return;\n }\n\n void executeArgs(args, line.trim());\n }, [applyCommandResult, executeArgs]);\n\n const runHistoryEntry = useCallback(async(entry: ITuiHistoryEntry) => {\n if (entry.command === \"(root)\") {\n await executeArgs([], \"(root)\");\n return;\n }\n\n try {\n const args = parseCommandLine(entry.command);\n await executeArgs(args, entry.command);\n }\n catch (error: unknown) {\n applyCommandResult(toFailedResult(error, entry.command), entry.command);\n }\n }, [applyCommandResult, executeArgs]);\n\n const applyShortcut = useCallback((shortcutId: number) => {\n const action = SHORTCUTS.find((shortcut) => shortcut.id === shortcutId);\n if (!action || isRunning) {\n return;\n }\n\n if (action.template) {\n setInput(action.template);\n setFocusedPanel(\"input\");\n return;\n }\n\n if (action.run) {\n void executeArgs(parseCommandLine(action.run), action.run);\n }\n }, [executeArgs, isRunning]);\n\n const setSectionByIndex = useCallback((index: number) => {\n const safeIndex = index < 0\n ? SECTION_ORDER.length - 1\n : index >= SECTION_ORDER.length\n ? 0\n : index;\n\n const section = SECTION_ORDER[safeIndex];\n if (section) {\n setActiveSection(section);\n }\n }, []);\n\n const nextSection = useCallback(() => {\n const currentIndex = SECTION_ORDER.indexOf(activeSection);\n setSectionByIndex(currentIndex + 1);\n }, [activeSection, setSectionByIndex]);\n\n const previousSection = useCallback(() => {\n const currentIndex = SECTION_ORDER.indexOf(activeSection);\n setSectionByIndex(currentIndex - 1);\n }, [activeSection, setSectionByIndex]);\n\n const setPanelByIndex = useCallback((index: number) => {\n const safeIndex = index < 0\n ? FOCUS_ORDER.length - 1\n : index >= FOCUS_ORDER.length\n ? 0\n : index;\n\n const panel = FOCUS_ORDER[safeIndex];\n if (panel) {\n setFocusedPanel(panel);\n }\n }, []);\n\n const nextPanel = useCallback(() => {\n const currentIndex = FOCUS_ORDER.indexOf(focusedPanel);\n setPanelByIndex(currentIndex + 1);\n }, [focusedPanel, setPanelByIndex]);\n\n const previousPanel = useCallback(() => {\n const currentIndex = FOCUS_ORDER.indexOf(focusedPanel);\n setPanelByIndex(currentIndex - 1);\n }, [focusedPanel, setPanelByIndex]);\n\n const openExitConfirmation = useCallback(() => {\n setIsEscArmed(false);\n setIsExitConfirmOpen(true);\n }, []);\n\n const closeExitConfirmation = useCallback(() => {\n setIsExitConfirmOpen(false);\n setIsEscArmed(false);\n }, []);\n\n const armEscapeExit = useCallback(() => {\n setIsEscArmed(true);\n setSystemMessages((previous) => {\n const lastMessage = previous[previous.length - 1];\n const message = \"Press Esc again to open exit confirmation.\";\n if (lastMessage === message) {\n return previous;\n }\n\n return [...previous, message];\n });\n }, []);\n\n const { submitInput } = useCommandInput({\n busy: isRunning,\n input,\n isInputFocused: focusedPanel === \"input\",\n isModalOpen: isExitConfirmOpen,\n setInput,\n onSubmit: executeLine,\n onClear: () => {\n setEntries([]);\n setActiveEntryId(null);\n setSystemMessages([]);\n setSelectedHistoryIndex(0);\n },\n onShortcut: applyShortcut,\n onNextSection: nextSection,\n onPreviousSection: previousSection,\n onJumpSection: (section) => {\n setActiveSection(section);\n setFocusedPanel(\"left\");\n },\n });\n\n useKeyboard((keyEvent) => {\n const keyName = keyEvent.name;\n\n if (isExitConfirmOpen) {\n if (isEscapeKey(keyName)) {\n preventDefault(keyEvent);\n closeExitConfirmation();\n return;\n }\n\n if (isEnterKey(keyName)) {\n preventDefault(keyEvent);\n renderer.destroy();\n return;\n }\n\n if (keyEvent.ctrl && keyName === \"c\") {\n renderer.destroy();\n }\n\n return;\n }\n\n if (keyEvent.ctrl && keyName === \"c\") {\n renderer.destroy();\n return;\n }\n\n if (isEscapeKey(keyName)) {\n preventDefault(keyEvent);\n\n if (focusedPanel !== \"input\") {\n setFocusedPanel(\"input\");\n armEscapeExit();\n return;\n }\n\n if (!isEscArmed) {\n armEscapeExit();\n return;\n }\n\n openExitConfirmation();\n return;\n }\n\n if (keyName === \"left\" || keyName === \"right\") {\n if (focusedPanel === \"input\" && input.length > 0) {\n return;\n }\n\n preventDefault(keyEvent);\n setIsEscArmed(false);\n if (keyName === \"left\") {\n previousPanel();\n }\n else {\n nextPanel();\n }\n return;\n }\n\n if (\n keyName === \"r\"\n && activeSection === \"history\"\n && focusedPanel === \"left\"\n && input.length === 0\n && !isRunning\n ) {\n const entry = entries[selectedHistoryIndex];\n if (entry) {\n void runHistoryEntry(entry);\n }\n }\n });\n\n useEffect(() => {\n void executeArgs([], \"(root)\");\n }, [executeArgs]);\n\n useEffect(() => {\n if (!isEscArmed) {\n return;\n }\n\n const timer = setTimeout(() => {\n setIsEscArmed(false);\n }, ESC_ARM_TIMEOUT_MS);\n\n return () => {\n clearTimeout(timer);\n };\n }, [isEscArmed]);\n\n useEffect(() => {\n if (!isRunning) {\n return;\n }\n\n const timer = setInterval(() => {\n setSpinnerFrame((previous) => (previous + 1) % 4);\n }, 120);\n\n return () => {\n clearInterval(timer);\n };\n }, [isRunning]);\n\n useEffect(() => {\n if (selectedHistoryIndex < entries.length) {\n return;\n }\n\n const nextIndex = Math.max(entries.length - 1, 0);\n setSelectedHistoryIndex(nextIndex);\n }, [entries.length, selectedHistoryIndex]);\n\n const spinner = useMemo(() => {\n return [\"|\", \"/\", \"-\", \"\\\\\"][spinnerFrame] || \"|\";\n }, [spinnerFrame]);\n\n const activeEntry = useMemo(() => {\n if (activeEntryId) {\n const found = entries.find((entry) => entry.id === activeEntryId);\n if (found) {\n return found;\n }\n }\n\n return entries[0] || null;\n }, [activeEntryId, entries]);\n\n const sectionOptions = useMemo(() => {\n const ordered = [\n activeSection,\n ...SECTION_ORDER.filter((section) => section !== activeSection),\n ];\n\n return ordered.map((section) => ({\n name: section === \"shortcuts\"\n ? \"Shortcuts\"\n : section === \"history\"\n ? \"History\"\n : section === \"messages\"\n ? \"Messages\"\n : \"Help\",\n description: section === \"shortcuts\"\n ? \"Quick actions\"\n : section === \"history\"\n ? \"Past runs\"\n : section === \"messages\"\n ? \"System output\"\n : \"Key map\",\n value: section,\n }));\n }, [activeSection]);\n\n const shortcutOptions = useMemo(() => {\n return SHORTCUTS.map((shortcut) => ({\n name: `${shortcut.id}. ${shortcut.label}`,\n description: shortcut.run || shortcut.template || \"\",\n value: shortcut.id,\n }));\n }, []);\n\n const historyOptions = useMemo(() => {\n return entries.map((entry) => ({\n name: formatHistoryLabel(entry),\n description: new Date(entry.createdAt).toLocaleTimeString(),\n value: entry.id,\n }));\n }, [entries]);\n\n const renderLeftSection = () => {\n if (activeSection === \"shortcuts\") {\n return (\n <select\n focused={focusedPanel === \"left\" && !isExitConfirmOpen}\n options={shortcutOptions}\n selectedIndex={selectedShortcutIndex}\n onChange={(index) => {\n setSelectedShortcutIndex(index);\n }}\n onSelect={(index, option) => {\n setSelectedShortcutIndex(index);\n const shortcutId = Number(option?.value || 0);\n if (Number.isFinite(shortcutId) && shortcutId > 0) {\n applyShortcut(shortcutId);\n }\n }}\n showScrollIndicator\n style={{\n flexGrow: 1,\n }}\n />\n );\n }\n\n if (activeSection === \"history\") {\n if (entries.length === 0) {\n return <text fg=\"gray\">No command history yet.</text>;\n }\n\n return (\n <box flexDirection=\"column\" flexGrow={1}>\n <text fg=\"cyan\">Press `r` to re-run selected command.</text>\n <select\n focused={focusedPanel === \"left\" && !isExitConfirmOpen}\n options={historyOptions}\n selectedIndex={selectedHistoryIndex}\n onChange={(index, option) => {\n setSelectedHistoryIndex(index);\n if (typeof option?.value === \"string\") {\n setActiveEntryId(option.value);\n }\n }}\n onSelect={(index, option) => {\n setSelectedHistoryIndex(index);\n if (typeof option?.value === \"string\") {\n setActiveEntryId(option.value);\n }\n }}\n showScrollIndicator\n style={{\n flexGrow: 1,\n }}\n />\n </box>\n );\n }\n\n if (activeSection === \"messages\") {\n return (\n <scrollbox focused={focusedPanel === \"left\" && !isExitConfirmOpen} style={{ height: \"100%\" }}>\n {systemMessages.length === 0 && <text fg=\"gray\">No messages yet.</text>}\n {systemMessages.map((line, index) => (\n <text key={`message-${index}`}>{line}</text>\n ))}\n </scrollbox>\n );\n }\n\n return (\n <scrollbox focused={focusedPanel === \"left\" && !isExitConfirmOpen} style={{ height: \"100%\" }}>\n <text fg=\"cyan\">Key Bindings</text>\n <text>Left/Right: switch focused panel</text>\n <text>Up/Down in left lists: selection</text>\n <text>Up/Down in result: scroll</text>\n <text>Enter: run command</text>\n <text>Up/Down in input: command history</text>\n <text>Tab / Shift+Tab: next/prev left section</text>\n <text>[ / ]: next/prev left section</text>\n <text>s/h/m/?: jump to section</text>\n <text>1..6: run shortcut</text>\n <text>Ctrl+L: clear command and message history</text>\n <text>Esc (other panel): focus command input</text>\n <text>Esc then Esc: open exit confirmation</text>\n <text>Enter (confirm): exit, Esc (confirm): cancel</text>\n <text>Ctrl+C: force quit</text>\n </scrollbox>\n );\n };\n\n return (\n <box flexDirection=\"column\" width=\"100%\" height=\"100%\" padding={1}>\n <box flexDirection=\"row\" justifyContent=\"space-between\" marginBottom={1} paddingX={1}>\n <ascii-font text=\"DOCYRUS\" font=\"tiny\" color=\"#7aa2f7\" />\n\n <box flexDirection=\"column\" alignItems=\"flex-end\" justifyContent=\"center\">\n <text>env: {environment ? `${environment.name} (${environment.id})` : \"unknown\"}</text>\n <text>status: {isRunning ? `${spinner} running` : \"idle\"}</text>\n <text>account: {context ? context.email : \"not-authenticated\"}</text>\n <text>tenant: {context ? context.tenantDisplay : \"-\"}</text>\n </box>\n </box>\n\n <box flexDirection=\"row\" flexGrow={1}>\n <box\n width={46}\n marginRight={1}\n border\n borderStyle=\"rounded\"\n borderColor={focusedPanel === \"left\" ? \"#7aa2f7\" : \"#3b4261\"}\n padding={1}\n flexDirection=\"column\"\n >\n <tab-select\n options={sectionOptions}\n onChange={(_index, option) => {\n if (typeof option?.value === \"string\") {\n setActiveSection(option.value as ITuiLeftSection);\n }\n }}\n />\n\n <box marginTop={1} flexGrow={1} border borderStyle=\"single\" borderColor=\"#414868\" padding={1}>\n {renderLeftSection()}\n </box>\n </box>\n\n <box\n border\n borderStyle=\"double\"\n borderColor={focusedPanel === \"result\" ? \"#9ece6a\" : \"#3b4261\"}\n padding={1}\n flexGrow={1}\n >\n {renderResult({\n entry: activeEntry,\n isFocused: focusedPanel === \"result\" && !isExitConfirmOpen,\n })}\n </box>\n </box>\n\n <box\n border\n borderStyle=\"rounded\"\n borderColor={focusedPanel === \"input\" ? \"#e0af68\" : \"#3b4261\"}\n padding={1}\n marginTop={1}\n >\n <text fg=\"cyan\">> </text>\n <input\n style={{ flexGrow: 1 }}\n value={input}\n placeholder=\"Type a command...\"\n onChange={(value) => {\n setInput(value);\n }}\n onSubmit={(value) => {\n submitInput(typeof value === \"string\" ? value : undefined);\n }}\n focused={!isRunning && focusedPanel === \"input\" && !isExitConfirmOpen}\n />\n </box>\n\n {isExitConfirmOpen && (\n <box\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n }}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <box\n width={58}\n padding={1}\n border\n borderStyle=\"double\"\n borderColor=\"#f7768e\"\n flexDirection=\"column\"\n style={{\n backgroundColor: \"#1f2335\",\n }}\n >\n <text fg=\"#f7768e\">Exit Docyrus TUI?</text>\n <text>Press Enter to exit.</text>\n <text>Press Esc to stay in this session.</text>\n </box>\n </box>\n )}\n </box>\n );\n}\n", "import { spawnSync } from \"node:child_process\";\nimport { UserInputError } from \"../errors\";\nimport type { ITuiCommandResult, ITuiProcessExecutionConfig } from \"../types\";\n\ninterface ICreateTuiProcessExecutorOptions {\n executionConfig: ITuiProcessExecutionConfig;\n spawnSyncFn?: typeof spawnSync;\n now?: () => number;\n}\n\ninterface IParsedCommandOutput {\n data: unknown;\n messages: string[];\n}\n\nfunction normalizeCommandArg(arg: string): string {\n return arg.trim();\n}\n\nexport function sanitizeTuiCommandArgs(args: string[]): string[] {\n const normalized = args\n .map(normalizeCommandArg)\n .filter((value) => value.length > 0);\n\n const withoutBinary = normalized[0] === \"docyrus\"\n ? normalized.slice(1)\n : normalized;\n\n const withoutJson = withoutBinary.filter((value) => value !== \"--json\");\n\n const firstArg = withoutJson[0];\n if (firstArg === \"tui\" || firstArg === \"interactive\") {\n throw new UserInputError(\"Already in TUI session.\");\n }\n\n return withoutJson;\n}\n\nfunction parseJsonOutput(rawOutput: string): IParsedCommandOutput {\n const trimmedOutput = rawOutput.trim();\n if (!trimmedOutput) {\n throw new UserInputError(\"Command produced no output.\");\n }\n\n const lines = trimmedOutput\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const lastLine = lines.at(-1);\n if (lastLine) {\n try {\n return {\n data: JSON.parse(lastLine) as unknown,\n messages: lines.slice(0, -1),\n };\n }\n catch {\n // fallback to whole-output JSON parsing below\n }\n }\n\n try {\n return {\n data: JSON.parse(trimmedOutput) as unknown,\n messages: [],\n };\n }\n catch (error: unknown) {\n throw new UserInputError(\"Invalid command output format. Expected JSON output.\", {\n cause: error,\n rawOutput: trimmedOutput,\n });\n }\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n\n return \"Failed to execute command.\";\n}\n\nexport function createTuiProcessExecutor(options: ICreateTuiProcessExecutorOptions) {\n const spawnCommand = options.spawnSyncFn ?? spawnSync;\n const now = options.now ?? Date.now;\n\n const runCliCommand = async(args: string[]): Promise<ITuiCommandResult> => {\n const startedAt = now();\n let commandArgs: string[] = [];\n let commandLabel = \"\";\n let rawOutput = \"\";\n let messageLines: string[] = [];\n\n try {\n commandArgs = sanitizeTuiCommandArgs(args);\n commandLabel = commandArgs.join(\" \").trim();\n\n const spawnResult = spawnCommand(\n options.executionConfig.executable,\n [\n options.executionConfig.scriptPath,\n ...commandArgs,\n \"--json\",\n ],\n {\n encoding: \"utf8\",\n cwd: options.executionConfig.cwd,\n env: {\n ...process.env,\n ...(options.executionConfig.env || {}),\n },\n },\n );\n\n const stdout = spawnResult.stdout?.toString() || \"\";\n const stderr = spawnResult.stderr?.toString() || \"\";\n rawOutput = stdout.trim();\n\n if (spawnResult.error) {\n throw spawnResult.error;\n }\n\n if (spawnResult.status !== 0) {\n const details = [rawOutput, stderr.trim()]\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n\n return {\n ok: false,\n command: commandLabel,\n rawOutput: details,\n error: {\n message: stderr.trim() || `Command exited with code ${spawnResult.status ?? \"unknown\"}.`,\n details: details || undefined,\n },\n durationMs: now() - startedAt,\n };\n }\n\n const parsed = parseJsonOutput(stdout);\n messageLines = parsed.messages;\n\n return {\n ok: true,\n command: commandLabel,\n rawOutput,\n data: parsed.data,\n durationMs: now() - startedAt,\n messages: messageLines.length > 0 ? messageLines : undefined,\n };\n }\n catch (error: unknown) {\n return {\n ok: false,\n command: commandLabel,\n rawOutput,\n error: {\n message: toErrorMessage(error),\n details: rawOutput || undefined,\n },\n durationMs: now() - startedAt,\n messages: messageLines.length > 0 ? messageLines : undefined,\n };\n }\n };\n\n return {\n runCliCommand,\n };\n}\n", "import type { IApiErrorResponse } from \"./types\";\n\nexport class ApplicationError extends Error {\n constructor(\n message: string,\n public readonly data: Record<string, unknown> = {},\n public readonly httpStatusCode = 500,\n ) {\n super(message);\n }\n}\n\nexport class UserInputError extends ApplicationError {\n constructor(message: string, data: Record<string, unknown> = {}) {\n super(message, data, 400);\n }\n}\n\nexport class AuthSessionError extends ApplicationError {\n constructor(message: string, data: Record<string, unknown> = {}) {\n super(message, data, 401);\n }\n}\n\nexport class ApiResponseError extends ApplicationError {\n constructor(public readonly details: IApiErrorResponse) {\n super(details.error_description || details.error || \"Docyrus API request failed\", details, details.status || 500);\n }\n}\n", "import { useKeyboard } from \"@opentui/react\";\nimport { useCallback, useState } from \"react\";\nimport type { KeyEvent } from \"@opentui/core\";\nimport type { ITuiLeftSection } from \"./types\";\n\ninterface IUseCommandInputOptions {\n busy: boolean;\n input: string;\n isInputFocused: boolean;\n isModalOpen?: boolean;\n setInput: (value: string) => void;\n onSubmit: (command: string) => void;\n onClear: () => void;\n onShortcut: (shortcut: number) => void;\n onNextSection: () => void;\n onPreviousSection: () => void;\n onJumpSection: (section: ITuiLeftSection) => void;\n}\n\ninterface IUseCommandInputResult {\n submitInput: (value?: string) => void;\n}\n\nexport function parseCommandLine(command: string): string[] {\n const args: string[] = [];\n let current = \"\";\n let quote: \"\\\"\" | \"'\" | null = null;\n let escaped = false;\n\n for (const char of command) {\n if (escaped) {\n current += char;\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (quote) {\n if (char === quote) {\n quote = null;\n }\n else {\n current += char;\n }\n continue;\n }\n\n if (char === \"\\\"\" || char === \"'\") {\n quote = char;\n continue;\n }\n\n if (/\\s/.test(char)) {\n if (current.length > 0) {\n args.push(current);\n current = \"\";\n }\n continue;\n }\n\n current += char;\n }\n\n if (quote) {\n throw new Error(\"Invalid command syntax: unmatched quote.\");\n }\n\n if (escaped) {\n current += \"\\\\\";\n }\n\n if (current.length > 0) {\n args.push(current);\n }\n\n return args;\n}\n\nfunction preventDefault(event: KeyEvent): void {\n if (typeof event.preventDefault === \"function\") {\n event.preventDefault();\n }\n}\n\nfunction resolveSectionJumpKey(keyName: string, shift: boolean): ITuiLeftSection | null {\n if (keyName === \"s\") {\n return \"shortcuts\";\n }\n\n if (keyName === \"h\") {\n return \"history\";\n }\n\n if (keyName === \"m\") {\n return \"messages\";\n }\n\n if (keyName === \"?\" || (keyName === \"/\" && shift)) {\n return \"help\";\n }\n\n return null;\n}\n\nexport function useCommandInput(options: IUseCommandInputOptions): IUseCommandInputResult {\n const [history, setHistory] = useState<string[]>([]);\n const [historyCursor, setHistoryCursor] = useState<number | null>(null);\n const [draftInput, setDraftInput] = useState(\"\");\n\n const submitInput = useCallback((value?: string) => {\n if (options.busy) {\n return;\n }\n\n const trimmed = (value ?? options.input).trim();\n if (trimmed.length === 0) {\n return;\n }\n\n setHistory((previous) => {\n if (previous[0] === trimmed) {\n return previous;\n }\n\n return [trimmed, ...previous];\n });\n\n setHistoryCursor(null);\n setDraftInput(\"\");\n options.setInput(\"\");\n options.onSubmit(trimmed);\n }, [options]);\n\n const recallHistory = useCallback((direction: \"up\" | \"down\") => {\n if (history.length === 0) {\n return;\n }\n\n if (direction === \"up\") {\n if (historyCursor === null) {\n setDraftInput(options.input);\n setHistoryCursor(0);\n options.setInput(history[0] || \"\");\n return;\n }\n\n const nextCursor = Math.min(historyCursor + 1, history.length - 1);\n setHistoryCursor(nextCursor);\n options.setInput(history[nextCursor] || \"\");\n return;\n }\n\n if (historyCursor === null) {\n return;\n }\n\n const nextCursor = historyCursor - 1;\n if (nextCursor < 0) {\n setHistoryCursor(null);\n options.setInput(draftInput);\n return;\n }\n\n setHistoryCursor(nextCursor);\n options.setInput(history[nextCursor] || \"\");\n }, [draftInput, history, historyCursor, options]);\n\n useKeyboard((keyEvent) => {\n if (options.isModalOpen) {\n return;\n }\n\n const keyName = keyEvent.name;\n\n if (keyEvent.ctrl && keyName === \"l\") {\n preventDefault(keyEvent);\n options.onClear();\n return;\n }\n\n if (keyName === \"tab\") {\n preventDefault(keyEvent);\n if (keyEvent.shift) {\n options.onPreviousSection();\n return;\n }\n\n options.onNextSection();\n return;\n }\n\n if (keyName === \"[\") {\n preventDefault(keyEvent);\n options.onPreviousSection();\n return;\n }\n\n if (keyName === \"]\") {\n preventDefault(keyEvent);\n options.onNextSection();\n return;\n }\n\n if (options.isInputFocused && keyName === \"up\") {\n preventDefault(keyEvent);\n recallHistory(\"up\");\n return;\n }\n\n if (options.isInputFocused && keyName === \"down\") {\n preventDefault(keyEvent);\n recallHistory(\"down\");\n return;\n }\n\n if (options.input.length === 0) {\n const jumpSection = resolveSectionJumpKey(keyName, Boolean(keyEvent.shift));\n if (jumpSection) {\n preventDefault(keyEvent);\n options.onJumpSection(jumpSection);\n return;\n }\n }\n\n if (options.busy) {\n return;\n }\n\n if (options.input.length === 0 && /^[1-6]$/.test(keyName)) {\n preventDefault(keyEvent);\n options.onShortcut(Number(keyName));\n }\n });\n\n return {\n submitInput,\n };\n}\n", "/** @jsxImportSource @opentui/react */\nimport { RGBA, SyntaxStyle } from \"@opentui/core\";\nimport type { ReactNode } from \"react\";\nimport { buildResultDocument, serializeResultDocument } from \"./resultDocument\";\nimport type { ITuiHistoryEntry } from \"./types\";\n\nlet jsonSyntaxStyle: SyntaxStyle | null = null;\n\nfunction getJsonSyntaxStyle(): SyntaxStyle {\n if (jsonSyntaxStyle) {\n return jsonSyntaxStyle;\n }\n\n jsonSyntaxStyle = SyntaxStyle.fromStyles({\n default: {\n fg: RGBA.fromHex(\"#d4d4d4\"),\n },\n property: {\n fg: RGBA.fromHex(\"#9cdcfe\"),\n },\n string: {\n fg: RGBA.fromHex(\"#ce9178\"),\n },\n number: {\n fg: RGBA.fromHex(\"#b5cea8\"),\n },\n keyword: {\n fg: RGBA.fromHex(\"#569cd6\"),\n },\n constant: {\n fg: RGBA.fromHex(\"#4fc1ff\"),\n },\n punctuation: {\n fg: RGBA.fromHex(\"#c586c0\"),\n },\n operator: {\n fg: RGBA.fromHex(\"#d4d4d4\"),\n },\n });\n\n return jsonSyntaxStyle;\n}\n\nexport function renderResult(params: {\n entry: ITuiHistoryEntry | null;\n isFocused: boolean;\n}): ReactNode {\n const {\n entry,\n isFocused,\n } = params;\n\n if (!entry) {\n return <text fg=\"yellow\">No command executed yet.</text>;\n }\n\n const document = buildResultDocument(entry);\n const json = serializeResultDocument(document);\n\n return (\n <box flexDirection=\"column\" width=\"100%\" height=\"100%\">\n <box paddingBottom={1}>\n <text fg={document.ok ? \"green\" : \"red\"}>\n {document.ok ? \"OK\" : \"ERR\"} {document.command} [{document.durationMs}ms]\n </text>\n </box>\n\n <box flexGrow={1} width=\"100%\" height=\"100%\">\n <scrollbox focused={isFocused} style={{ height: \"100%\" }}>\n <code\n width=\"100%\"\n content={json}\n filetype=\"json\"\n syntaxStyle={getJsonSyntaxStyle()}\n streaming={false}\n conceal={false}\n />\n </scrollbox>\n </box>\n </box>\n );\n}\n", "import type { ITuiHistoryEntry, ITuiResultDocument } from \"./types\";\n\nfunction toErrorPayload(entry: ITuiHistoryEntry): Record<string, unknown> {\n return {\n message: entry.result.error?.message || \"Command failed.\",\n details: entry.result.error?.details,\n };\n}\n\nfunction buildPayload(entry: ITuiHistoryEntry): unknown {\n if (entry.result.ok) {\n return entry.result.data ?? null;\n }\n\n return toErrorPayload(entry);\n}\n\nexport function buildResultDocument(entry: ITuiHistoryEntry): ITuiResultDocument {\n return {\n command: entry.command || \"(root)\",\n ok: entry.result.ok,\n durationMs: entry.result.durationMs,\n timestamp: new Date(entry.createdAt).toISOString(),\n payload: buildPayload(entry),\n messages: entry.result.messages,\n rawOutput: entry.result.rawOutput || undefined,\n };\n}\n\nexport function serializeResultDocument(document: ITuiResultDocument): string {\n try {\n const result = JSON.stringify(document, null, 2);\n if (!result) {\n return \"null\";\n }\n\n return result;\n }\n catch (error: unknown) {\n const message = error instanceof Error\n ? error.message\n : String(error);\n\n return JSON.stringify({\n command: document.command,\n ok: false,\n durationMs: document.durationMs,\n timestamp: document.timestamp,\n payload: {\n message: \"Serialization failed\",\n details: message,\n },\n }, null, 2);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["useKeyboard", "useCallback", "useState", "nextCursor", "jsx", "jsxs", "preventDefault", "useState", "useCallback", "useKeyboard", "jsx"]
|
|
3
|
+
"sources": ["../../../apps/api-cli/src/tui/opentuiMain.tsx", "../../../apps/api-cli/src/tui/opentui/DocyrusOpenTuiApp.tsx", "../../../apps/api-cli/src/services/tuiProcessExecutor.ts", "../../../apps/api-cli/src/errors.ts", "../../../apps/api-cli/src/tui/opentui/commandInput.ts", "../../../apps/api-cli/src/tui/opentui/dataSourceCatalog.ts", "../../../apps/api-cli/src/tui/opentui/renderResult.tsx", "../../../apps/api-cli/src/tui/opentui/resultDocument.ts"],
|
|
4
|
+
"sourcesContent": ["/** @jsxImportSource @opentui/react */\nimport { createCliRenderer } from \"@opentui/core\";\nimport { createRoot } from \"@opentui/react\";\nimport { DocyrusOpenTuiApp } from \"./opentui/DocyrusOpenTuiApp\";\nimport type { ITuiProcessExecutionConfig } from \"../types\";\n\ninterface ITuiLaunchConfig {\n executionConfig: ITuiProcessExecutionConfig;\n version: string;\n}\n\nfunction readRequiredEnv(name: string): string {\n const value = process.env[name];\n if (!value || value.trim().length === 0) {\n throw new Error(`Missing required launch variable: ${name}`);\n }\n\n return value;\n}\n\nfunction readLaunchConfig(): ITuiLaunchConfig {\n return {\n version: process.env.DOCYRUS_TUI_VERSION || \"dev\",\n executionConfig: {\n executable: readRequiredEnv(\"DOCYRUS_TUI_EXECUTABLE\"),\n scriptPath: readRequiredEnv(\"DOCYRUS_TUI_SCRIPT\"),\n },\n };\n}\n\nasync function startTui(): Promise<void> {\n const launchConfig = readLaunchConfig();\n const renderer = await createCliRenderer({\n exitOnCtrlC: false,\n });\n\n const root = createRoot(renderer);\n root.render(\n <DocyrusOpenTuiApp\n executionConfig={launchConfig.executionConfig}\n version={launchConfig.version}\n />,\n );\n}\n\nvoid startTui().catch((error: unknown) => {\n const message = error instanceof Error\n ? error.message\n : String(error);\n\n console.error(`Failed to start Docyrus OpenTUI: ${message}`);\n process.exitCode = 1;\n});\n", "/** @jsxImportSource @opentui/react */\nimport { useKeyboard, useRenderer } from \"@opentui/react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createTuiProcessExecutor } from \"../../services/tuiProcessExecutor\";\nimport { parseCommandLine, useCommandInput } from \"./commandInput\";\nimport {\n extractAppsFromPayload,\n extractDataSourcesFromPayload,\n filterDataSources,\n flattenTreeRows,\n groupDataSourcesByApp,\n} from \"./dataSourceCatalog\";\nimport { renderResult } from \"./renderResult\";\nimport type {\n IDocyrusOpenTuiAppProps,\n ITuiAppCatalogItem,\n ITuiContextSummary,\n ITuiDataSourceCatalogItem,\n ITuiDataSourcePanelFocus,\n ITuiDataSourceTreeRow,\n ITuiEnvironmentSummary,\n ITuiHistoryEntry,\n ITuiLeftSection,\n ITuiPanelFocus,\n ITuiShortcutAction,\n} from \"./types\";\nimport type { ITuiCommandResult } from \"../../types\";\n\nconst SHORTCUTS: ITuiShortcutAction[] = [\n {\n id: 1,\n run: \"env list\",\n label: \"env list\",\n },\n {\n id: 2,\n run: \"auth who\",\n label: \"auth who\",\n },\n {\n id: 3,\n run: \"apps list\",\n label: \"apps list\",\n },\n {\n id: 4,\n run: \"discover namespaces\",\n label: \"discover namespaces\",\n },\n {\n id: 5,\n template: \"studio list-data-sources --appSlug \",\n label: \"insert: studio list-data-sources --appSlug \",\n },\n {\n id: 6,\n template: \"ds list <appSlug> <dataSourceSlug>\",\n label: \"insert: ds list <appSlug> <dataSourceSlug>\",\n },\n];\n\nconst SECTION_ORDER: ITuiLeftSection[] = [\"shortcuts\", \"datasources\", \"history\", \"messages\", \"help\"];\nconst FOCUS_ORDER: ITuiPanelFocus[] = [\"input\", \"left\", \"result\"];\nconst ESC_ARM_TIMEOUT_MS = 1400;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction extractMetadata(payload: unknown): {\n environment?: ITuiEnvironmentSummary;\n context?: ITuiContextSummary | null;\n} {\n if (!isRecord(payload)) {\n return {};\n }\n\n const environmentValue = payload.environment;\n const contextValue = payload.context;\n\n const environment = isRecord(environmentValue)\n && typeof environmentValue.id === \"string\"\n && typeof environmentValue.name === \"string\"\n ? { id: environmentValue.id, name: environmentValue.name }\n : undefined;\n\n if (contextValue === null) {\n return {\n environment,\n context: null,\n };\n }\n\n const context = isRecord(contextValue)\n && typeof contextValue.email === \"string\"\n && typeof contextValue.tenantDisplay === \"string\"\n ? {\n email: contextValue.email,\n tenantDisplay: contextValue.tenantDisplay,\n }\n : undefined;\n\n return {\n environment,\n context,\n };\n}\n\nfunction toFailedResult(error: unknown, command: string): ITuiCommandResult {\n const message = error instanceof Error\n ? error.message\n : \"Invalid command syntax.\";\n\n return {\n ok: false,\n command,\n rawOutput: \"\",\n error: {\n message,\n },\n durationMs: 0,\n };\n}\n\nfunction formatHistoryLabel(entry: ITuiHistoryEntry): string {\n const status = entry.result.ok ? \"OK\" : \"ERR\";\n const command = entry.command || \"(root)\";\n return `${status} ${command} [${entry.result.durationMs}ms]`;\n}\n\nfunction preventDefault(keyEvent: { preventDefault?: () => void }): void {\n if (typeof keyEvent.preventDefault === \"function\") {\n keyEvent.preventDefault();\n }\n}\n\nfunction isEscapeKey(keyName: string): boolean {\n return keyName === \"escape\" || keyName === \"esc\";\n}\n\nfunction isEnterKey(keyName: string): boolean {\n return keyName === \"enter\" || keyName === \"return\";\n}\n\nfunction isSlashKey(keyName: string): boolean {\n return keyName === \"/\" || keyName === \"slash\";\n}\n\nfunction toCatalogErrorMessage(command: string, result: ITuiCommandResult): string {\n const details = result.error?.details || result.error?.message || \"Unknown error.\";\n if (\n details.includes(\"Architect.Read.All\")\n || details.includes(\"Architect.ReadWrite.All\")\n ) {\n return `${command} failed: missing required scope Architect.Read.All or Architect.ReadWrite.All.`;\n }\n\n const message = result.error?.message || \"Command failed.\";\n return `${command} failed: ${message}`;\n}\n\nexport function DocyrusOpenTuiApp(props: IDocyrusOpenTuiAppProps) {\n const renderer = useRenderer();\n\n const [input, setInput] = useState(\"\");\n const [entries, setEntries] = useState<ITuiHistoryEntry[]>([]);\n const [activeEntryId, setActiveEntryId] = useState<string | null>(null);\n const [systemMessages, setSystemMessages] = useState<string[]>([]);\n const [activeSection, setActiveSection] = useState<ITuiLeftSection>(\"shortcuts\");\n const [focusedPanel, setFocusedPanel] = useState<ITuiPanelFocus>(\"left\");\n const [environment, setEnvironment] = useState<ITuiEnvironmentSummary | undefined>();\n const [context, setContext] = useState<ITuiContextSummary | null | undefined>(undefined);\n const [isRunning, setIsRunning] = useState(false);\n const [spinnerFrame, setSpinnerFrame] = useState(0);\n const [selectedShortcutIndex, setSelectedShortcutIndex] = useState(0);\n const [selectedHistoryIndex, setSelectedHistoryIndex] = useState(0);\n const [isExitConfirmOpen, setIsExitConfirmOpen] = useState(false);\n const [isEscArmed, setIsEscArmed] = useState(false);\n\n const [dataSourceSearch, setDataSourceSearch] = useState(\"\");\n const [dataSourcePanelFocus, setDataSourcePanelFocus] = useState<ITuiDataSourcePanelFocus>(\"tree\");\n const [selectedDataSourceRowIndex, setSelectedDataSourceRowIndex] = useState(0);\n const [expandedAppKeys, setExpandedAppKeys] = useState<string[]>([]);\n const [appsCatalog, setAppsCatalog] = useState<ITuiAppCatalogItem[]>([]);\n const [dataSourcesCatalog, setDataSourcesCatalog] = useState<ITuiDataSourceCatalogItem[]>([]);\n const [isCatalogLoading, setIsCatalogLoading] = useState(false);\n const [catalogError, setCatalogError] = useState<string | null>(null);\n const [catalogLoadedAt, setCatalogLoadedAt] = useState<number | null>(null);\n\n const catalogScopeRef = useRef(\"\");\n\n const executor = useMemo(() => {\n return createTuiProcessExecutor({\n executionConfig: props.executionConfig,\n });\n }, [props.executionConfig]);\n\n const applyMetadataFromPayload = useCallback((payload: unknown) => {\n const metadata = extractMetadata(payload);\n if (metadata.environment) {\n setEnvironment(metadata.environment);\n }\n\n if (metadata.context !== undefined) {\n setContext(metadata.context);\n }\n }, []);\n\n const appendSystemMessages = useCallback((messages: string[]) => {\n if (messages.length === 0) {\n return;\n }\n\n setSystemMessages((previous) => [...previous, ...messages]);\n }, []);\n\n const applyCommandResult = useCallback((result: ITuiCommandResult, command: string) => {\n const entry: ITuiHistoryEntry = {\n id: `${Date.now()}-${Math.random().toString(16).slice(2)}`,\n command,\n result,\n createdAt: Date.now(),\n };\n\n setEntries((previous) => [entry, ...previous]);\n setActiveEntryId(entry.id);\n setSelectedHistoryIndex(0);\n\n if (result.messages && result.messages.length > 0) {\n appendSystemMessages(result.messages);\n }\n\n if (result.ok && result.data !== undefined) {\n applyMetadataFromPayload(result.data);\n }\n }, [appendSystemMessages, applyMetadataFromPayload]);\n\n const executeArgs = useCallback(async(args: string[], commandText: string) => {\n setIsRunning(true);\n try {\n const result = await executor.runCliCommand(args);\n applyCommandResult(result, commandText);\n }\n finally {\n setIsRunning(false);\n }\n }, [applyCommandResult, executor]);\n\n const runInternalArgs = useCallback(async(args: string[]): Promise<ITuiCommandResult> => {\n const result = await executor.runCliCommand(args);\n if (result.ok && result.data !== undefined) {\n applyMetadataFromPayload(result.data);\n }\n\n return result;\n }, [applyMetadataFromPayload, executor]);\n\n const executeLine = useCallback((line: string) => {\n let args: string[];\n\n try {\n args = parseCommandLine(line);\n }\n catch (error: unknown) {\n applyCommandResult(toFailedResult(error, line.trim()), line.trim());\n return;\n }\n\n if (args.length === 0) {\n return;\n }\n\n void executeArgs(args, line.trim());\n }, [applyCommandResult, executeArgs]);\n\n const runHistoryEntry = useCallback(async(entry: ITuiHistoryEntry) => {\n if (entry.command === \"(root)\") {\n await executeArgs([], \"(root)\");\n return;\n }\n\n try {\n const args = parseCommandLine(entry.command);\n await executeArgs(args, entry.command);\n }\n catch (error: unknown) {\n applyCommandResult(toFailedResult(error, entry.command), entry.command);\n }\n }, [applyCommandResult, executeArgs]);\n\n const applyShortcut = useCallback((shortcutId: number) => {\n const action = SHORTCUTS.find((shortcut) => shortcut.id === shortcutId);\n if (!action || isRunning || isCatalogLoading) {\n return;\n }\n\n if (action.template) {\n setInput(action.template);\n setFocusedPanel(\"input\");\n return;\n }\n\n if (action.run) {\n void executeArgs(parseCommandLine(action.run), action.run);\n }\n }, [executeArgs, isCatalogLoading, isRunning]);\n\n const groupedDataSourceItems = useMemo(() => {\n return groupDataSourcesByApp({\n apps: appsCatalog,\n dataSources: dataSourcesCatalog,\n });\n }, [appsCatalog, dataSourcesCatalog]);\n\n const filteredDataSourceGroups = useMemo(() => {\n return filterDataSources(groupedDataSourceItems, dataSourceSearch);\n }, [dataSourceSearch, groupedDataSourceItems]);\n\n const dataSourceCountByAppKey = useMemo(() => {\n const result = new Map<string, number>();\n for (const group of filteredDataSourceGroups) {\n result.set(group.appKey, group.dataSources.length);\n }\n\n return result;\n }, [filteredDataSourceGroups]);\n\n const expandedAppKeySet = useMemo(() => {\n return new Set(expandedAppKeys);\n }, [expandedAppKeys]);\n\n const dataSourceRows = useMemo(() => {\n return flattenTreeRows({\n groups: filteredDataSourceGroups,\n expandedAppKeys: expandedAppKeySet,\n query: dataSourceSearch,\n });\n }, [dataSourceSearch, expandedAppKeySet, filteredDataSourceGroups]);\n\n const selectedDataSourceRow = useMemo(() => {\n if (dataSourceRows.length === 0) {\n return null;\n }\n\n return dataSourceRows[selectedDataSourceRowIndex] || dataSourceRows[0] || null;\n }, [dataSourceRows, selectedDataSourceRowIndex]);\n\n const toggleAppExpansion = useCallback((appKey: string) => {\n setExpandedAppKeys((previous) => {\n if (previous.includes(appKey)) {\n return previous.filter((key) => key !== appKey);\n }\n\n return [...previous, appKey];\n });\n }, []);\n\n const loadDataSourceCatalog = useCallback(async() => {\n if (isCatalogLoading) {\n return;\n }\n\n setIsCatalogLoading(true);\n setCatalogError(null);\n\n try {\n const nextMessages: string[] = [];\n\n const appsResult = await runInternalArgs([\"apps\", \"list\"]);\n const dataSourcesResult = await runInternalArgs([\"curl\", \"/dev/data-sources\"]);\n\n const nextApps = appsResult.ok && appsResult.data !== undefined\n ? extractAppsFromPayload(appsResult.data)\n : [];\n const nextDataSources = dataSourcesResult.ok && dataSourcesResult.data !== undefined\n ? extractDataSourcesFromPayload(dataSourcesResult.data)\n : [];\n\n if (!appsResult.ok) {\n nextMessages.push(toCatalogErrorMessage(\"apps list\", appsResult));\n }\n\n if (!dataSourcesResult.ok) {\n nextMessages.push(toCatalogErrorMessage(\"curl /dev/data-sources\", dataSourcesResult));\n }\n\n setAppsCatalog(nextApps);\n setDataSourcesCatalog(nextDataSources);\n setCatalogLoadedAt(Date.now());\n\n const nextGroups = groupDataSourcesByApp({\n apps: nextApps,\n dataSources: nextDataSources,\n });\n\n setExpandedAppKeys((previous) => {\n if (previous.length > 0) {\n const allowed = new Set(nextGroups.map((group) => group.appKey));\n return previous.filter((key) => allowed.has(key));\n }\n\n return nextGroups.map((group) => group.appKey);\n });\n\n if (nextMessages.length > 0) {\n appendSystemMessages(nextMessages);\n setCatalogError(nextMessages[0] || \"Failed to load catalog.\");\n }\n else {\n setCatalogError(null);\n }\n }\n finally {\n setIsCatalogLoading(false);\n }\n }, [appendSystemMessages, isCatalogLoading, runInternalArgs]);\n\n const runSelectedDataSourceRow = useCallback(async(row: ITuiDataSourceTreeRow | null) => {\n if (!row || isRunning || isCatalogLoading) {\n return;\n }\n\n if (row.kind === \"app\") {\n toggleAppExpansion(row.appKey);\n return;\n }\n\n if (!row.appSlug || !row.dataSourceSlug) {\n appendSystemMessages([\n \"Cannot execute ds get because selected row is missing appSlug or dataSourceSlug.\",\n ]);\n return;\n }\n\n const command = `ds get ${row.appSlug} ${row.dataSourceSlug}`;\n setFocusedPanel(\"result\");\n await executeArgs([\"ds\", \"get\", row.appSlug, row.dataSourceSlug], command);\n }, [appendSystemMessages, executeArgs, isCatalogLoading, isRunning, toggleAppExpansion]);\n\n const setSectionByIndex = useCallback((index: number) => {\n const safeIndex = index < 0\n ? SECTION_ORDER.length - 1\n : index >= SECTION_ORDER.length\n ? 0\n : index;\n\n const section = SECTION_ORDER[safeIndex];\n if (section) {\n setActiveSection(section);\n }\n }, []);\n\n const nextSection = useCallback(() => {\n const currentIndex = SECTION_ORDER.indexOf(activeSection);\n setSectionByIndex(currentIndex + 1);\n }, [activeSection, setSectionByIndex]);\n\n const previousSection = useCallback(() => {\n const currentIndex = SECTION_ORDER.indexOf(activeSection);\n setSectionByIndex(currentIndex - 1);\n }, [activeSection, setSectionByIndex]);\n\n const setPanelByIndex = useCallback((index: number) => {\n const safeIndex = index < 0\n ? FOCUS_ORDER.length - 1\n : index >= FOCUS_ORDER.length\n ? 0\n : index;\n\n const panel = FOCUS_ORDER[safeIndex];\n if (panel) {\n setFocusedPanel(panel);\n }\n }, []);\n\n const nextPanel = useCallback(() => {\n const currentIndex = FOCUS_ORDER.indexOf(focusedPanel);\n setPanelByIndex(currentIndex + 1);\n }, [focusedPanel, setPanelByIndex]);\n\n const previousPanel = useCallback(() => {\n const currentIndex = FOCUS_ORDER.indexOf(focusedPanel);\n setPanelByIndex(currentIndex - 1);\n }, [focusedPanel, setPanelByIndex]);\n\n const openExitConfirmation = useCallback(() => {\n setIsEscArmed(false);\n setIsExitConfirmOpen(true);\n }, []);\n\n const closeExitConfirmation = useCallback(() => {\n setIsExitConfirmOpen(false);\n setIsEscArmed(false);\n }, []);\n\n const armEscapeExit = useCallback(() => {\n setIsEscArmed(true);\n setSystemMessages((previous) => {\n const lastMessage = previous[previous.length - 1];\n const message = \"Press Esc again to open exit confirmation.\";\n if (lastMessage === message) {\n return previous;\n }\n\n return [...previous, message];\n });\n }, []);\n\n const isDataSourceSearchFocused = activeSection === \"datasources\"\n && focusedPanel === \"left\"\n && dataSourcePanelFocus === \"search\"\n && !isRunning\n && !isExitConfirmOpen;\n\n const { submitInput } = useCommandInput({\n busy: isRunning || isCatalogLoading,\n input,\n isInputFocused: focusedPanel === \"input\",\n isModalOpen: isExitConfirmOpen,\n hotkeysEnabled: !isRunning && !isDataSourceSearchFocused,\n setInput,\n onSubmit: executeLine,\n onClear: () => {\n setEntries([]);\n setActiveEntryId(null);\n setSystemMessages([]);\n setSelectedHistoryIndex(0);\n },\n onShortcut: applyShortcut,\n onNextSection: nextSection,\n onPreviousSection: previousSection,\n });\n\n useKeyboard((keyEvent) => {\n const keyName = keyEvent.name;\n\n if (isExitConfirmOpen) {\n if (isEscapeKey(keyName)) {\n preventDefault(keyEvent);\n closeExitConfirmation();\n return;\n }\n\n if (isEnterKey(keyName)) {\n preventDefault(keyEvent);\n renderer.destroy();\n return;\n }\n\n if (keyEvent.ctrl && keyName === \"c\") {\n renderer.destroy();\n }\n\n return;\n }\n\n if (\n activeSection === \"datasources\"\n && focusedPanel === \"left\"\n && dataSourcePanelFocus === \"search\"\n && isEscapeKey(keyName)\n ) {\n preventDefault(keyEvent);\n setDataSourcePanelFocus(\"tree\");\n return;\n }\n\n if (\n activeSection === \"datasources\"\n && focusedPanel === \"left\"\n && dataSourcePanelFocus === \"tree\"\n && isSlashKey(keyName)\n ) {\n preventDefault(keyEvent);\n setDataSourcePanelFocus(\"search\");\n return;\n }\n\n if (keyEvent.ctrl && keyName === \"c\") {\n renderer.destroy();\n return;\n }\n\n if (isRunning) {\n return;\n }\n\n if (isEscapeKey(keyName)) {\n preventDefault(keyEvent);\n\n if (focusedPanel !== \"input\") {\n setFocusedPanel(\"input\");\n armEscapeExit();\n return;\n }\n\n if (!isEscArmed) {\n armEscapeExit();\n return;\n }\n\n openExitConfirmation();\n return;\n }\n\n if (\n activeSection === \"datasources\"\n && focusedPanel === \"left\"\n && dataSourcePanelFocus === \"tree\"\n && keyName === \"space\"\n ) {\n preventDefault(keyEvent);\n if (selectedDataSourceRow?.kind === \"app\") {\n toggleAppExpansion(selectedDataSourceRow.appKey);\n }\n return;\n }\n\n if (keyName === \"left\" || keyName === \"right\") {\n if (focusedPanel === \"input\" && input.length > 0) {\n return;\n }\n\n preventDefault(keyEvent);\n setIsEscArmed(false);\n if (keyName === \"left\") {\n previousPanel();\n }\n else {\n nextPanel();\n }\n return;\n }\n\n if (\n keyName === \"r\"\n && activeSection === \"datasources\"\n && focusedPanel === \"left\"\n && dataSourcePanelFocus === \"tree\"\n && !isCatalogLoading\n ) {\n preventDefault(keyEvent);\n void loadDataSourceCatalog();\n return;\n }\n\n if (\n keyName === \"r\"\n && activeSection === \"history\"\n && focusedPanel === \"left\"\n && input.length === 0\n && !isRunning\n && !isCatalogLoading\n ) {\n const entry = entries[selectedHistoryIndex];\n if (entry) {\n void runHistoryEntry(entry);\n }\n }\n });\n\n useEffect(() => {\n void executeArgs([], \"(root)\");\n }, [executeArgs]);\n\n useEffect(() => {\n if (!isEscArmed) {\n return;\n }\n\n const timer = setTimeout(() => {\n setIsEscArmed(false);\n }, ESC_ARM_TIMEOUT_MS);\n\n return () => {\n clearTimeout(timer);\n };\n }, [isEscArmed]);\n\n useEffect(() => {\n if (!isRunning && !isCatalogLoading) {\n return;\n }\n\n const timer = setInterval(() => {\n setSpinnerFrame((previous) => (previous + 1) % 4);\n }, 120);\n\n return () => {\n clearInterval(timer);\n };\n }, [isCatalogLoading, isRunning]);\n\n useEffect(() => {\n if (selectedHistoryIndex < entries.length) {\n return;\n }\n\n const nextIndex = Math.max(entries.length - 1, 0);\n setSelectedHistoryIndex(nextIndex);\n }, [entries.length, selectedHistoryIndex]);\n\n useEffect(() => {\n if (selectedDataSourceRowIndex < dataSourceRows.length) {\n return;\n }\n\n const nextIndex = Math.max(dataSourceRows.length - 1, 0);\n setSelectedDataSourceRowIndex(nextIndex);\n }, [dataSourceRows.length, selectedDataSourceRowIndex]);\n\n useEffect(() => {\n if (activeSection !== \"datasources\" && dataSourcePanelFocus !== \"tree\") {\n setDataSourcePanelFocus(\"tree\");\n }\n }, [activeSection, dataSourcePanelFocus]);\n\n useEffect(() => {\n const scopeKey = `${environment?.id || \"\"}::${context?.tenantDisplay || \"\"}`;\n if (catalogScopeRef.current.length === 0) {\n catalogScopeRef.current = scopeKey;\n return;\n }\n\n if (catalogScopeRef.current === scopeKey) {\n return;\n }\n\n catalogScopeRef.current = scopeKey;\n if (catalogLoadedAt !== null) {\n setCatalogLoadedAt(null);\n setAppsCatalog([]);\n setDataSourcesCatalog([]);\n setExpandedAppKeys([]);\n setSelectedDataSourceRowIndex(0);\n setCatalogError(null);\n }\n }, [catalogLoadedAt, context?.tenantDisplay, environment?.id]);\n\n useEffect(() => {\n if (\n activeSection !== \"datasources\"\n || catalogLoadedAt !== null\n || isCatalogLoading\n ) {\n return;\n }\n\n void loadDataSourceCatalog();\n }, [activeSection, catalogLoadedAt, isCatalogLoading, loadDataSourceCatalog]);\n\n const spinner = useMemo(() => {\n return [\"|\", \"/\", \"-\", \"\\\\\"][spinnerFrame] || \"|\";\n }, [spinnerFrame]);\n\n const activeEntry = useMemo(() => {\n if (activeEntryId) {\n const found = entries.find((entry) => entry.id === activeEntryId);\n if (found) {\n return found;\n }\n }\n\n return entries[0] || null;\n }, [activeEntryId, entries]);\n\n const sectionOptions = useMemo(() => {\n const ordered = [\n activeSection,\n ...SECTION_ORDER.filter((section) => section !== activeSection),\n ];\n\n return ordered.map((section) => ({\n name: section === \"shortcuts\"\n ? \"Shortcuts\"\n : section === \"datasources\"\n ? \"DataSources\"\n : section === \"history\"\n ? \"History\"\n : section === \"messages\"\n ? \"Messages\"\n : \"Help\",\n description: section === \"shortcuts\"\n ? \"Quick actions\"\n : section === \"datasources\"\n ? \"App tree\"\n : section === \"history\"\n ? \"Past runs\"\n : section === \"messages\"\n ? \"System output\"\n : \"Key map\",\n value: section,\n }));\n }, [activeSection]);\n\n const shortcutOptions = useMemo(() => {\n return SHORTCUTS.map((shortcut) => ({\n name: `${shortcut.id}. ${shortcut.label}`,\n description: shortcut.run || shortcut.template || \"\",\n value: shortcut.id,\n }));\n }, []);\n\n const historyOptions = useMemo(() => {\n return entries.map((entry) => ({\n name: formatHistoryLabel(entry),\n description: new Date(entry.createdAt).toLocaleTimeString(),\n value: entry.id,\n }));\n }, [entries]);\n\n const dataSourceOptions = useMemo(() => {\n return dataSourceRows.map((row) => {\n if (row.kind === \"app\") {\n const itemCount = dataSourceCountByAppKey.get(row.appKey) || 0;\n return {\n name: `${row.expanded ? \"[-]\" : \"[+]\"} ${row.appName}${row.appSlug ? ` (${row.appSlug})` : \"\"}`,\n description: `${itemCount} data source${itemCount === 1 ? \"\" : \"s\"}`,\n value: row.id,\n };\n }\n\n const dataSourceLabel = row.dataSourceName || row.dataSourceSlug || row.dataSourceId || \"Unknown\";\n return {\n name: ` - ${dataSourceLabel}${row.dataSourceSlug ? ` (${row.dataSourceSlug})` : \"\"}`,\n description: row.appSlug ? `app: ${row.appSlug}` : \"missing app slug\",\n value: row.id,\n };\n });\n }, [dataSourceCountByAppKey, dataSourceRows]);\n\n const renderLeftSection = () => {\n if (activeSection === \"shortcuts\") {\n return (\n <select\n focused={focusedPanel === \"left\" && !isExitConfirmOpen && !isRunning}\n options={shortcutOptions}\n selectedIndex={selectedShortcutIndex}\n onChange={(index) => {\n setSelectedShortcutIndex(index);\n }}\n onSelect={(index, option) => {\n setSelectedShortcutIndex(index);\n const shortcutId = Number(option?.value || 0);\n if (Number.isFinite(shortcutId) && shortcutId > 0) {\n applyShortcut(shortcutId);\n }\n }}\n showScrollIndicator\n style={{\n flexGrow: 1,\n }}\n />\n );\n }\n\n if (activeSection === \"datasources\") {\n const treeFocused = focusedPanel === \"left\"\n && dataSourcePanelFocus === \"tree\"\n && !isRunning\n && !isExitConfirmOpen;\n const searchFocused = focusedPanel === \"left\"\n && dataSourcePanelFocus === \"search\"\n && !isRunning\n && !isExitConfirmOpen;\n\n return (\n <box flexDirection=\"column\" flexGrow={1}>\n <box border borderStyle=\"single\" borderColor={searchFocused ? \"#7aa2f7\" : \"#414868\"} paddingX={1}>\n <input\n value={dataSourceSearch}\n placeholder=\"Search data sources...\"\n onChange={(value) => {\n setDataSourceSearch(value);\n setSelectedDataSourceRowIndex(0);\n }}\n onSubmit={() => {\n setDataSourcePanelFocus(\"tree\");\n }}\n focused={searchFocused}\n style={{\n flexGrow: 1,\n }}\n />\n </box>\n\n <box marginTop={1} marginBottom={1}>\n <text fg=\"gray\">/ to search, Esc to tree, Space toggle app, Enter run ds get, r refresh</text>\n </box>\n\n {isCatalogLoading && <text fg=\"cyan\">Loading DataSources catalog...</text>}\n {catalogError && <text fg=\"red\">{catalogError}</text>}\n\n {dataSourceOptions.length === 0\n ? (\n <text fg=\"gray\">\n {dataSourceSearch.trim().length > 0\n ? `No data sources match \"${dataSourceSearch}\".`\n : \"No data sources available for this tenant.\"}\n </text>\n )\n : (\n <select\n focused={treeFocused}\n options={dataSourceOptions}\n selectedIndex={selectedDataSourceRowIndex}\n onChange={(index) => {\n setSelectedDataSourceRowIndex(index);\n }}\n onSelect={(index) => {\n setSelectedDataSourceRowIndex(index);\n const row = dataSourceRows[index] || null;\n void runSelectedDataSourceRow(row);\n }}\n showScrollIndicator\n style={{\n flexGrow: 1,\n }}\n />\n )}\n </box>\n );\n }\n\n if (activeSection === \"history\") {\n if (entries.length === 0) {\n return <text fg=\"gray\">No command history yet.</text>;\n }\n\n return (\n <box flexDirection=\"column\" flexGrow={1}>\n <text fg=\"cyan\">Press `r` to re-run selected command.</text>\n <select\n focused={focusedPanel === \"left\" && !isExitConfirmOpen && !isRunning}\n options={historyOptions}\n selectedIndex={selectedHistoryIndex}\n onChange={(index, option) => {\n setSelectedHistoryIndex(index);\n if (typeof option?.value === \"string\") {\n setActiveEntryId(option.value);\n }\n }}\n onSelect={(index, option) => {\n setSelectedHistoryIndex(index);\n if (typeof option?.value === \"string\") {\n setActiveEntryId(option.value);\n }\n }}\n showScrollIndicator\n style={{\n flexGrow: 1,\n }}\n />\n </box>\n );\n }\n\n if (activeSection === \"messages\") {\n return (\n <scrollbox focused={focusedPanel === \"left\" && !isExitConfirmOpen && !isRunning} style={{ height: \"100%\" }}>\n {systemMessages.length === 0 && <text fg=\"gray\">No messages yet.</text>}\n {systemMessages.map((line, index) => (\n <text key={`message-${index}`}>{line}</text>\n ))}\n </scrollbox>\n );\n }\n\n return (\n <scrollbox focused={focusedPanel === \"left\" && !isExitConfirmOpen && !isRunning} style={{ height: \"100%\" }}>\n <text fg=\"cyan\">Key Bindings</text>\n <text>Left/Right: switch focused panel</text>\n <text>Up/Down in left lists: selection</text>\n <text>Up/Down in result: scroll</text>\n <text>Enter: run command</text>\n <text>Up/Down in input: command history</text>\n <text>Tab / Shift+Tab: next/prev left section</text>\n <text>[ / ]: next/prev left section</text>\n <text>1..6: run shortcut</text>\n <text>/ in DataSources: focus search</text>\n <text>Esc in DataSources search: return to tree</text>\n <text>Space in DataSources tree: toggle app folder</text>\n <text>Enter in DataSources tree: run ds get or toggle app</text>\n <text>Ctrl+L: clear command and message history</text>\n <text>Esc (other panel): focus command input</text>\n <text>Esc then Esc: open exit confirmation</text>\n <text>Enter (confirm): exit, Esc (confirm): cancel</text>\n <text>Ctrl+C: force quit</text>\n </scrollbox>\n );\n };\n\n return (\n <box flexDirection=\"column\" width=\"100%\" height=\"100%\" padding={1}>\n <box flexDirection=\"row\" justifyContent=\"space-between\" marginBottom={1} paddingX={1}>\n <ascii-font text=\"DOCYRUS\" font=\"tiny\" color=\"#7aa2f7\" />\n\n <box flexDirection=\"column\" alignItems=\"flex-end\" justifyContent=\"center\">\n <text>env: {environment ? `${environment.name} (${environment.id})` : \"unknown\"}</text>\n <text>\n status: {isRunning\n ? `${spinner} running`\n : isCatalogLoading\n ? `${spinner} loading-catalog`\n : \"idle\"}\n </text>\n <text>account: {context ? context.email : \"not-authenticated\"}</text>\n <text>tenant: {context ? context.tenantDisplay : \"-\"}</text>\n </box>\n </box>\n\n <box flexDirection=\"row\" flexGrow={1}>\n <box\n width={46}\n marginRight={1}\n border\n borderStyle=\"rounded\"\n borderColor={focusedPanel === \"left\" ? \"#7aa2f7\" : \"#3b4261\"}\n padding={1}\n flexDirection=\"column\"\n >\n <tab-select\n focused={focusedPanel === \"left\" && !isExitConfirmOpen && !isRunning}\n options={sectionOptions}\n onChange={(_index, option) => {\n if (typeof option?.value === \"string\") {\n setActiveSection(option.value as ITuiLeftSection);\n setDataSourcePanelFocus(\"tree\");\n }\n }}\n />\n\n <box marginTop={1} flexGrow={1} border borderStyle=\"single\" borderColor=\"#414868\" padding={1}>\n {renderLeftSection()}\n </box>\n </box>\n\n <box\n border\n borderStyle=\"double\"\n borderColor={focusedPanel === \"result\" ? \"#9ece6a\" : \"#3b4261\"}\n padding={1}\n flexGrow={1}\n >\n {isRunning\n ? (\n <box width=\"100%\" height=\"100%\" alignItems=\"center\" justifyContent=\"center\" flexDirection=\"column\">\n <text fg=\"cyan\">{spinner}</text>\n <text fg=\"gray\">Running command...</text>\n </box>\n )\n : renderResult({\n entry: activeEntry,\n isFocused: focusedPanel === \"result\" && !isExitConfirmOpen,\n })}\n </box>\n </box>\n\n <box\n border\n borderStyle=\"rounded\"\n borderColor={focusedPanel === \"input\" ? \"#e0af68\" : \"#3b4261\"}\n padding={1}\n marginTop={1}\n >\n <text fg=\"cyan\">> </text>\n <input\n style={{ flexGrow: 1 }}\n value={input}\n placeholder=\"Type a command...\"\n onChange={(value) => {\n setInput(value);\n }}\n onSubmit={(value) => {\n submitInput(typeof value === \"string\" ? value : undefined);\n }}\n focused={!isRunning && !isCatalogLoading && focusedPanel === \"input\" && !isExitConfirmOpen}\n />\n </box>\n\n {isExitConfirmOpen && (\n <box\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n }}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <box\n width={58}\n padding={1}\n border\n borderStyle=\"double\"\n borderColor=\"#f7768e\"\n flexDirection=\"column\"\n style={{\n backgroundColor: \"#1f2335\",\n }}\n >\n <text fg=\"#f7768e\">Exit Docyrus TUI?</text>\n <text>Press Enter to exit.</text>\n <text>Press Esc to stay in this session.</text>\n </box>\n </box>\n )}\n </box>\n );\n}\n", "import { spawnSync } from \"node:child_process\";\nimport { UserInputError } from \"../errors\";\nimport type { ITuiCommandResult, ITuiProcessExecutionConfig } from \"../types\";\n\ninterface ICreateTuiProcessExecutorOptions {\n executionConfig: ITuiProcessExecutionConfig;\n spawnSyncFn?: typeof spawnSync;\n now?: () => number;\n}\n\ninterface IParsedCommandOutput {\n data: unknown;\n messages: string[];\n}\n\nfunction normalizeCommandArg(arg: string): string {\n return arg.trim();\n}\n\nexport function sanitizeTuiCommandArgs(args: string[]): string[] {\n const normalized = args\n .map(normalizeCommandArg)\n .filter((value) => value.length > 0);\n\n const withoutBinary = normalized[0] === \"docyrus\"\n ? normalized.slice(1)\n : normalized;\n\n const withoutJson = withoutBinary.filter((value) => value !== \"--json\");\n\n const firstArg = withoutJson[0];\n if (firstArg === \"tui\" || firstArg === \"interactive\") {\n throw new UserInputError(\"Already in TUI session.\");\n }\n\n return withoutJson;\n}\n\nfunction parseJsonOutput(rawOutput: string): IParsedCommandOutput {\n const trimmedOutput = rawOutput.trim();\n if (!trimmedOutput) {\n throw new UserInputError(\"Command produced no output.\");\n }\n\n const lines = trimmedOutput\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const lastLine = lines.at(-1);\n if (lastLine) {\n try {\n return {\n data: JSON.parse(lastLine) as unknown,\n messages: lines.slice(0, -1),\n };\n }\n catch {\n // fallback to whole-output JSON parsing below\n }\n }\n\n try {\n return {\n data: JSON.parse(trimmedOutput) as unknown,\n messages: [],\n };\n }\n catch (error: unknown) {\n throw new UserInputError(\"Invalid command output format. Expected JSON output.\", {\n cause: error,\n rawOutput: trimmedOutput,\n });\n }\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n\n return \"Failed to execute command.\";\n}\n\nexport function createTuiProcessExecutor(options: ICreateTuiProcessExecutorOptions) {\n const spawnCommand = options.spawnSyncFn ?? spawnSync;\n const now = options.now ?? Date.now;\n\n const runCliCommand = async(args: string[]): Promise<ITuiCommandResult> => {\n const startedAt = now();\n let commandArgs: string[] = [];\n let commandLabel = \"\";\n let rawOutput = \"\";\n let messageLines: string[] = [];\n\n try {\n commandArgs = sanitizeTuiCommandArgs(args);\n commandLabel = commandArgs.join(\" \").trim();\n\n const spawnResult = spawnCommand(\n options.executionConfig.executable,\n [\n options.executionConfig.scriptPath,\n ...commandArgs,\n \"--json\",\n ],\n {\n encoding: \"utf8\",\n cwd: options.executionConfig.cwd,\n env: {\n ...process.env,\n ...(options.executionConfig.env || {}),\n },\n },\n );\n\n const stdout = spawnResult.stdout?.toString() || \"\";\n const stderr = spawnResult.stderr?.toString() || \"\";\n rawOutput = stdout.trim();\n\n if (spawnResult.error) {\n throw spawnResult.error;\n }\n\n if (spawnResult.status !== 0) {\n const details = [rawOutput, stderr.trim()]\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n\n return {\n ok: false,\n command: commandLabel,\n rawOutput: details,\n error: {\n message: stderr.trim() || `Command exited with code ${spawnResult.status ?? \"unknown\"}.`,\n details: details || undefined,\n },\n durationMs: now() - startedAt,\n };\n }\n\n const parsed = parseJsonOutput(stdout);\n messageLines = parsed.messages;\n\n return {\n ok: true,\n command: commandLabel,\n rawOutput,\n data: parsed.data,\n durationMs: now() - startedAt,\n messages: messageLines.length > 0 ? messageLines : undefined,\n };\n }\n catch (error: unknown) {\n return {\n ok: false,\n command: commandLabel,\n rawOutput,\n error: {\n message: toErrorMessage(error),\n details: rawOutput || undefined,\n },\n durationMs: now() - startedAt,\n messages: messageLines.length > 0 ? messageLines : undefined,\n };\n }\n };\n\n return {\n runCliCommand,\n };\n}\n", "import type { IApiErrorResponse } from \"./types\";\n\nexport class ApplicationError extends Error {\n constructor(\n message: string,\n public readonly data: Record<string, unknown> = {},\n public readonly httpStatusCode = 500,\n ) {\n super(message);\n }\n}\n\nexport class UserInputError extends ApplicationError {\n constructor(message: string, data: Record<string, unknown> = {}) {\n super(message, data, 400);\n }\n}\n\nexport class AuthSessionError extends ApplicationError {\n constructor(message: string, data: Record<string, unknown> = {}) {\n super(message, data, 401);\n }\n}\n\nexport class ApiResponseError extends ApplicationError {\n constructor(public readonly details: IApiErrorResponse) {\n super(details.error_description || details.error || \"Docyrus API request failed\", details, details.status || 500);\n }\n}\n", "import { useKeyboard } from \"@opentui/react\";\nimport { useCallback, useState } from \"react\";\nimport type { KeyEvent } from \"@opentui/core\";\n\ninterface IUseCommandInputOptions {\n busy: boolean;\n input: string;\n isInputFocused: boolean;\n isModalOpen?: boolean;\n hotkeysEnabled?: boolean;\n setInput: (value: string) => void;\n onSubmit: (command: string) => void;\n onClear: () => void;\n onShortcut: (shortcut: number) => void;\n onNextSection: () => void;\n onPreviousSection: () => void;\n}\n\ninterface IUseCommandInputResult {\n submitInput: (value?: string) => void;\n}\n\nexport function parseCommandLine(command: string): string[] {\n const args: string[] = [];\n let current = \"\";\n let quote: \"\\\"\" | \"'\" | null = null;\n let escaped = false;\n\n for (const char of command) {\n if (escaped) {\n current += char;\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (quote) {\n if (char === quote) {\n quote = null;\n }\n else {\n current += char;\n }\n continue;\n }\n\n if (char === \"\\\"\" || char === \"'\") {\n quote = char;\n continue;\n }\n\n if (/\\s/.test(char)) {\n if (current.length > 0) {\n args.push(current);\n current = \"\";\n }\n continue;\n }\n\n current += char;\n }\n\n if (quote) {\n throw new Error(\"Invalid command syntax: unmatched quote.\");\n }\n\n if (escaped) {\n current += \"\\\\\";\n }\n\n if (current.length > 0) {\n args.push(current);\n }\n\n return args;\n}\n\nfunction preventDefault(event: KeyEvent): void {\n if (typeof event.preventDefault === \"function\") {\n event.preventDefault();\n }\n}\n\nexport function useCommandInput(options: IUseCommandInputOptions): IUseCommandInputResult {\n const [history, setHistory] = useState<string[]>([]);\n const [historyCursor, setHistoryCursor] = useState<number | null>(null);\n const [draftInput, setDraftInput] = useState(\"\");\n\n const submitInput = useCallback((value?: string) => {\n if (options.busy) {\n return;\n }\n\n const trimmed = (value ?? options.input).trim();\n if (trimmed.length === 0) {\n return;\n }\n\n setHistory((previous) => {\n if (previous[0] === trimmed) {\n return previous;\n }\n\n return [trimmed, ...previous];\n });\n\n setHistoryCursor(null);\n setDraftInput(\"\");\n options.setInput(\"\");\n options.onSubmit(trimmed);\n }, [options]);\n\n const recallHistory = useCallback((direction: \"up\" | \"down\") => {\n if (history.length === 0) {\n return;\n }\n\n if (direction === \"up\") {\n if (historyCursor === null) {\n setDraftInput(options.input);\n setHistoryCursor(0);\n options.setInput(history[0] || \"\");\n return;\n }\n\n const nextCursor = Math.min(historyCursor + 1, history.length - 1);\n setHistoryCursor(nextCursor);\n options.setInput(history[nextCursor] || \"\");\n return;\n }\n\n if (historyCursor === null) {\n return;\n }\n\n const nextCursor = historyCursor - 1;\n if (nextCursor < 0) {\n setHistoryCursor(null);\n options.setInput(draftInput);\n return;\n }\n\n setHistoryCursor(nextCursor);\n options.setInput(history[nextCursor] || \"\");\n }, [draftInput, history, historyCursor, options]);\n\n useKeyboard((keyEvent) => {\n if (options.isModalOpen) {\n return;\n }\n\n const keyName = keyEvent.name;\n const hotkeysEnabled = options.hotkeysEnabled !== false;\n\n if (keyEvent.ctrl && keyName === \"l\") {\n preventDefault(keyEvent);\n options.onClear();\n return;\n }\n\n if (hotkeysEnabled && keyName === \"tab\") {\n preventDefault(keyEvent);\n if (keyEvent.shift) {\n options.onPreviousSection();\n return;\n }\n\n options.onNextSection();\n return;\n }\n\n if (hotkeysEnabled && keyName === \"[\") {\n preventDefault(keyEvent);\n options.onPreviousSection();\n return;\n }\n\n if (hotkeysEnabled && keyName === \"]\") {\n preventDefault(keyEvent);\n options.onNextSection();\n return;\n }\n\n if (options.isInputFocused && keyName === \"up\") {\n preventDefault(keyEvent);\n recallHistory(\"up\");\n return;\n }\n\n if (options.isInputFocused && keyName === \"down\") {\n preventDefault(keyEvent);\n recallHistory(\"down\");\n return;\n }\n\n if (options.busy) {\n return;\n }\n\n if (hotkeysEnabled && options.input.length === 0 && /^[1-6]$/.test(keyName)) {\n preventDefault(keyEvent);\n options.onShortcut(Number(keyName));\n }\n });\n\n return {\n submitInput,\n };\n}\n", "import type {\n ITuiAppCatalogItem,\n ITuiDataSourceAppGroup,\n ITuiDataSourceCatalogItem,\n ITuiDataSourceTreeRow,\n} from \"./types\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction toNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction toStringValue(value: unknown, fallback: string): string {\n return toNonEmptyString(value) || fallback;\n}\n\nfunction getArrayCandidates(payload: unknown): unknown[] {\n if (Array.isArray(payload)) {\n return payload;\n }\n\n if (!isRecord(payload)) {\n return [];\n }\n\n const directData = payload.data;\n if (Array.isArray(directData)) {\n return directData;\n }\n\n if (isRecord(directData) && Array.isArray(directData.data)) {\n return directData.data;\n }\n\n if (Array.isArray(payload.items)) {\n return payload.items;\n }\n\n if (Array.isArray(payload.dataSources)) {\n return payload.dataSources;\n }\n\n return [];\n}\n\nfunction compareByName(a: string, b: string): number {\n return a.localeCompare(b, undefined, { sensitivity: \"base\" });\n}\n\nfunction getDataSourceDisplayName(dataSource: ITuiDataSourceCatalogItem): string {\n return dataSource.title || dataSource.name || dataSource.slug;\n}\n\nexport function extractAppsFromPayload(payload: unknown): ITuiAppCatalogItem[] {\n const result: ITuiAppCatalogItem[] = [];\n const seen = new Set<string>();\n\n for (const candidate of getArrayCandidates(payload)) {\n if (!isRecord(candidate)) {\n continue;\n }\n\n const id = toNonEmptyString(candidate.id);\n const slug = toNonEmptyString(candidate.slug);\n if (!id || !slug) {\n continue;\n }\n\n const name = toStringValue(candidate.name, slug);\n const dedupeKey = `${id}::${slug}`;\n if (seen.has(dedupeKey)) {\n continue;\n }\n\n seen.add(dedupeKey);\n result.push({ id, slug, name });\n }\n\n result.sort((a, b) => compareByName(a.name, b.name));\n return result;\n}\n\nexport function extractDataSourcesFromPayload(payload: unknown): ITuiDataSourceCatalogItem[] {\n const result: ITuiDataSourceCatalogItem[] = [];\n const seen = new Set<string>();\n\n for (const candidate of getArrayCandidates(payload)) {\n if (!isRecord(candidate)) {\n continue;\n }\n\n const id = toNonEmptyString(candidate.id);\n const slug = toNonEmptyString(candidate.slug);\n if (!id || !slug) {\n continue;\n }\n\n const title = toNonEmptyString(candidate.title);\n const name = toStringValue(candidate.name, slug);\n const appSlug = toNonEmptyString(candidate.app_slug);\n const tenantAppId = toNonEmptyString(candidate.tenant_app_id);\n const dedupeKey = `${id}::${slug}`;\n\n if (seen.has(dedupeKey)) {\n continue;\n }\n\n seen.add(dedupeKey);\n result.push({\n id,\n name,\n title,\n slug,\n app_slug: appSlug,\n tenant_app_id: tenantAppId,\n });\n }\n\n result.sort((a, b) => compareByName(getDataSourceDisplayName(a), getDataSourceDisplayName(b)));\n return result;\n}\n\nexport function groupDataSourcesByApp(params: {\n apps: ITuiAppCatalogItem[];\n dataSources: ITuiDataSourceCatalogItem[];\n}): ITuiDataSourceAppGroup[] {\n const { apps, dataSources } = params;\n const appById = new Map<string, ITuiAppCatalogItem>();\n const appBySlug = new Map<string, ITuiAppCatalogItem>();\n const groups = new Map<string, ITuiDataSourceAppGroup>();\n\n for (const app of apps) {\n appById.set(app.id, app);\n appBySlug.set(app.slug, app);\n }\n\n for (const dataSource of dataSources) {\n const byId = dataSource.tenant_app_id\n ? appById.get(dataSource.tenant_app_id)\n : undefined;\n const bySlug = dataSource.app_slug\n ? appBySlug.get(dataSource.app_slug)\n : undefined;\n const matchedApp = byId || bySlug;\n\n const appKey = matchedApp\n ? matchedApp.id\n : dataSource.app_slug\n ? `slug:${dataSource.app_slug}`\n : \"unknown\";\n\n const group = groups.get(appKey)\n || {\n appKey,\n appId: matchedApp?.id || dataSource.tenant_app_id,\n appName: matchedApp?.name || dataSource.app_slug || \"Unknown App\",\n appSlug: matchedApp?.slug || dataSource.app_slug,\n dataSources: [],\n };\n\n group.dataSources.push(dataSource);\n groups.set(appKey, group);\n }\n\n const list = Array.from(groups.values());\n for (const group of list) {\n group.dataSources.sort((a, b) => compareByName(getDataSourceDisplayName(a), getDataSourceDisplayName(b)));\n }\n\n list.sort((a, b) => compareByName(a.appName, b.appName));\n return list;\n}\n\nexport function filterDataSources(groups: ITuiDataSourceAppGroup[], query: string): ITuiDataSourceAppGroup[] {\n const normalizedQuery = query.trim().toLowerCase();\n if (normalizedQuery.length === 0) {\n return groups;\n }\n\n return groups\n .map((group) => {\n const filteredDataSources = group.dataSources.filter((dataSource) => {\n const haystack = [\n dataSource.title,\n dataSource.name,\n dataSource.slug,\n ]\n .filter((value): value is string => Boolean(value))\n .join(\" \")\n .toLowerCase();\n\n return haystack.includes(normalizedQuery);\n });\n\n return {\n ...group,\n dataSources: filteredDataSources,\n };\n })\n .filter((group) => group.dataSources.length > 0);\n}\n\nexport function flattenTreeRows(params: {\n groups: ITuiDataSourceAppGroup[];\n expandedAppKeys: ReadonlySet<string>;\n query: string;\n}): ITuiDataSourceTreeRow[] {\n const rows: ITuiDataSourceTreeRow[] = [];\n const alwaysExpanded = params.query.trim().length > 0;\n\n for (const group of params.groups) {\n const expanded = alwaysExpanded || params.expandedAppKeys.has(group.appKey);\n rows.push({\n id: `app:${group.appKey}`,\n kind: \"app\",\n appKey: group.appKey,\n appName: group.appName,\n appSlug: group.appSlug,\n expanded,\n });\n\n if (!expanded) {\n continue;\n }\n\n for (const dataSource of group.dataSources) {\n const dataSourceName = getDataSourceDisplayName(dataSource);\n rows.push({\n id: `ds:${group.appKey}:${dataSource.id}`,\n kind: \"datasource\",\n appKey: group.appKey,\n appName: group.appName,\n appSlug: group.appSlug || dataSource.app_slug,\n dataSourceId: dataSource.id,\n dataSourceName,\n dataSourceSlug: dataSource.slug,\n });\n }\n }\n\n return rows;\n}\n", "/** @jsxImportSource @opentui/react */\nimport { RGBA, SyntaxStyle } from \"@opentui/core\";\nimport type { ReactNode } from \"react\";\nimport { buildResultDocument, serializeResultDocument } from \"./resultDocument\";\nimport type { ITuiHistoryEntry } from \"./types\";\n\nlet jsonSyntaxStyle: SyntaxStyle | null = null;\n\nfunction getJsonSyntaxStyle(): SyntaxStyle {\n if (jsonSyntaxStyle) {\n return jsonSyntaxStyle;\n }\n\n jsonSyntaxStyle = SyntaxStyle.fromStyles({\n default: {\n fg: RGBA.fromHex(\"#d4d4d4\"),\n },\n property: {\n fg: RGBA.fromHex(\"#9cdcfe\"),\n },\n string: {\n fg: RGBA.fromHex(\"#ce9178\"),\n },\n number: {\n fg: RGBA.fromHex(\"#b5cea8\"),\n },\n keyword: {\n fg: RGBA.fromHex(\"#569cd6\"),\n },\n constant: {\n fg: RGBA.fromHex(\"#4fc1ff\"),\n },\n punctuation: {\n fg: RGBA.fromHex(\"#c586c0\"),\n },\n operator: {\n fg: RGBA.fromHex(\"#d4d4d4\"),\n },\n });\n\n return jsonSyntaxStyle;\n}\n\nexport function renderResult(params: {\n entry: ITuiHistoryEntry | null;\n isFocused: boolean;\n}): ReactNode {\n const {\n entry,\n isFocused,\n } = params;\n\n if (!entry) {\n return <text fg=\"yellow\">No command executed yet.</text>;\n }\n\n const document = buildResultDocument(entry);\n const json = serializeResultDocument(document);\n\n return (\n <box flexDirection=\"column\" width=\"100%\" height=\"100%\">\n <box paddingBottom={1}>\n <text fg={document.ok ? \"green\" : \"red\"}>\n {document.ok ? \"OK\" : \"ERR\"} {document.command} [{document.durationMs}ms]\n </text>\n </box>\n\n <box flexGrow={1} width=\"100%\" height=\"100%\">\n <scrollbox focused={isFocused} style={{ height: \"100%\" }}>\n <code\n width=\"100%\"\n content={json}\n filetype=\"json\"\n syntaxStyle={getJsonSyntaxStyle()}\n streaming={false}\n conceal={false}\n />\n </scrollbox>\n </box>\n </box>\n );\n}\n", "import type { ITuiHistoryEntry, ITuiResultDocument } from \"./types\";\n\nfunction toErrorPayload(entry: ITuiHistoryEntry): Record<string, unknown> {\n return {\n message: entry.result.error?.message || \"Command failed.\",\n details: entry.result.error?.details,\n };\n}\n\nfunction buildPayload(entry: ITuiHistoryEntry): unknown {\n if (entry.result.ok) {\n return entry.result.data ?? null;\n }\n\n return toErrorPayload(entry);\n}\n\nexport function buildResultDocument(entry: ITuiHistoryEntry): ITuiResultDocument {\n return {\n command: entry.command || \"(root)\",\n ok: entry.result.ok,\n durationMs: entry.result.durationMs,\n timestamp: new Date(entry.createdAt).toISOString(),\n payload: buildPayload(entry),\n messages: entry.result.messages,\n rawOutput: entry.result.rawOutput || undefined,\n };\n}\n\nexport function serializeResultDocument(document: ITuiResultDocument): string {\n try {\n const result = JSON.stringify(document, null, 2);\n if (!result) {\n return \"null\";\n }\n\n return result;\n }\n catch (error: unknown) {\n const message = error instanceof Error\n ? error.message\n : String(error);\n\n return JSON.stringify({\n command: document.command,\n ok: false,\n durationMs: document.durationMs,\n timestamp: document.timestamp,\n payload: {\n message: \"Serialization failed\",\n details: message,\n },\n }, null, 2);\n }\n}\n"],
|
|
5
|
+
"mappings": ";AACA,SAAS,yBAAyB;AAClC,SAAS,kBAAkB;;;ACD3B,SAAS,eAAAA,cAAa,mBAAmB;AACzC,SAAS,eAAAC,cAAa,WAAW,SAAS,QAAQ,YAAAC,iBAAgB;;;ACFlE,SAAS,iBAAiB;;;ACEnB,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C,YACE,SACgB,OAAgC,CAAC,GACjC,iBAAiB,KACjC;AACA,UAAM,OAAO;AAHG;AACA;AAAA,EAGlB;AACF;AAEO,IAAM,iBAAN,cAA6B,iBAAiB;AAAA,EACnD,YAAY,SAAiB,OAAgC,CAAC,GAAG;AAC/D,UAAM,SAAS,MAAM,GAAG;AAAA,EAC1B;AACF;;;ADDA,SAAS,oBAAoB,KAAqB;AAChD,SAAO,IAAI,KAAK;AAClB;AAEO,SAAS,uBAAuB,MAA0B;AAC/D,QAAM,aAAa,KAChB,IAAI,mBAAmB,EACvB,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC;AAErC,QAAM,gBAAgB,WAAW,CAAC,MAAM,YACpC,WAAW,MAAM,CAAC,IAClB;AAEJ,QAAM,cAAc,cAAc,OAAO,CAAC,UAAU,UAAU,QAAQ;AAEtE,QAAM,WAAW,YAAY,CAAC;AAC9B,MAAI,aAAa,SAAS,aAAa,eAAe;AACpD,UAAM,IAAI,eAAe,yBAAyB;AAAA,EACpD;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,WAAyC;AAChE,QAAM,gBAAgB,UAAU,KAAK;AACrC,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,eAAe,6BAA6B;AAAA,EACxD;AAEA,QAAM,QAAQ,cACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAEnC,QAAM,WAAW,MAAM,GAAG,EAAE;AAC5B,MAAI,UAAU;AACZ,QAAI;AACF,aAAO;AAAA,QACL,MAAM,KAAK,MAAM,QAAQ;AAAA,QACzB,UAAU,MAAM,MAAM,GAAG,EAAE;AAAA,MAC7B;AAAA,IACF,QACM;AAAA,IAEN;AAAA,EACF;AAEA,MAAI;AACF,WAAO;AAAA,MACL,MAAM,KAAK,MAAM,aAAa;AAAA,MAC9B,UAAU,CAAC;AAAA,IACb;AAAA,EACF,SACO,OAAgB;AACrB,UAAM,IAAI,eAAe,wDAAwD;AAAA,MAC/E,OAAO;AAAA,MACP,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eAAe,OAAwB;AAC9C,MAAI,iBAAiB,SAAS,MAAM,QAAQ,KAAK,EAAE,SAAS,GAAG;AAC7D,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AACT;AAEO,SAAS,yBAAyB,SAA2C;AAClF,QAAM,eAAe,QAAQ,eAAe;AAC5C,QAAM,MAAM,QAAQ,OAAO,KAAK;AAEhC,QAAM,gBAAgB,OAAM,SAA+C;AACzE,UAAM,YAAY,IAAI;AACtB,QAAI,cAAwB,CAAC;AAC7B,QAAI,eAAe;AACnB,QAAI,YAAY;AAChB,QAAI,eAAyB,CAAC;AAE9B,QAAI;AACF,oBAAc,uBAAuB,IAAI;AACzC,qBAAe,YAAY,KAAK,GAAG,EAAE,KAAK;AAE1C,YAAM,cAAc;AAAA,QAClB,QAAQ,gBAAgB;AAAA,QACxB;AAAA,UACE,QAAQ,gBAAgB;AAAA,UACxB,GAAG;AAAA,UACH;AAAA,QACF;AAAA,QACA;AAAA,UACE,UAAU;AAAA,UACV,KAAK,QAAQ,gBAAgB;AAAA,UAC7B,KAAK;AAAA,YACH,GAAG,QAAQ;AAAA,YACX,GAAI,QAAQ,gBAAgB,OAAO,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,YAAY,QAAQ,SAAS,KAAK;AACjD,YAAM,SAAS,YAAY,QAAQ,SAAS,KAAK;AACjD,kBAAY,OAAO,KAAK;AAExB,UAAI,YAAY,OAAO;AACrB,cAAM,YAAY;AAAA,MACpB;AAEA,UAAI,YAAY,WAAW,GAAG;AAC5B,cAAM,UAAU,CAAC,WAAW,OAAO,KAAK,CAAC,EACtC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,KAAK,IAAI;AAEZ,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,SAAS;AAAA,UACT,WAAW;AAAA,UACX,OAAO;AAAA,YACL,SAAS,OAAO,KAAK,KAAK,4BAA4B,YAAY,UAAU,SAAS;AAAA,YACrF,SAAS,WAAW;AAAA,UACtB;AAAA,UACA,YAAY,IAAI,IAAI;AAAA,QACtB;AAAA,MACF;AAEA,YAAM,SAAS,gBAAgB,MAAM;AACrC,qBAAe,OAAO;AAEtB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,SAAS;AAAA,QACT;AAAA,QACA,MAAM,OAAO;AAAA,QACb,YAAY,IAAI,IAAI;AAAA,QACpB,UAAU,aAAa,SAAS,IAAI,eAAe;AAAA,MACrD;AAAA,IACF,SACO,OAAgB;AACrB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,SAAS;AAAA,QACT;AAAA,QACA,OAAO;AAAA,UACL,SAAS,eAAe,KAAK;AAAA,UAC7B,SAAS,aAAa;AAAA,QACxB;AAAA,QACA,YAAY,IAAI,IAAI;AAAA,QACpB,UAAU,aAAa,SAAS,IAAI,eAAe;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;AE3KA,SAAS,mBAAmB;AAC5B,SAAS,aAAa,gBAAgB;AAqB/B,SAAS,iBAAiB,SAA2B;AAC1D,QAAM,OAAiB,CAAC;AACxB,MAAI,UAAU;AACd,MAAI,QAA2B;AAC/B,MAAI,UAAU;AAEd,aAAW,QAAQ,SAAS;AAC1B,QAAI,SAAS;AACX,iBAAW;AACX,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,SAAS,MAAM;AACjB,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,OAAO;AACT,UAAI,SAAS,OAAO;AAClB,gBAAQ;AAAA,MACV,OACK;AACH,mBAAW;AAAA,MACb;AACA;AAAA,IACF;AAEA,QAAI,SAAS,OAAQ,SAAS,KAAK;AACjC,cAAQ;AACR;AAAA,IACF;AAEA,QAAI,KAAK,KAAK,IAAI,GAAG;AACnB,UAAI,QAAQ,SAAS,GAAG;AACtB,aAAK,KAAK,OAAO;AACjB,kBAAU;AAAA,MACZ;AACA;AAAA,IACF;AAEA,eAAW;AAAA,EACb;AAEA,MAAI,OAAO;AACT,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,MAAI,SAAS;AACX,eAAW;AAAA,EACb;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,SAAK,KAAK,OAAO;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAuB;AAC7C,MAAI,OAAO,MAAM,mBAAmB,YAAY;AAC9C,UAAM,eAAe;AAAA,EACvB;AACF;AAEO,SAAS,gBAAgB,SAA0D;AACxF,QAAM,CAAC,SAAS,UAAU,IAAI,SAAmB,CAAC,CAAC;AACnD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAwB,IAAI;AACtE,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,EAAE;AAE/C,QAAM,cAAc,YAAY,CAAC,UAAmB;AAClD,QAAI,QAAQ,MAAM;AAChB;AAAA,IACF;AAEA,UAAM,WAAW,SAAS,QAAQ,OAAO,KAAK;AAC9C,QAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,IACF;AAEA,eAAW,CAAC,aAAa;AACvB,UAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,eAAO;AAAA,MACT;AAEA,aAAO,CAAC,SAAS,GAAG,QAAQ;AAAA,IAC9B,CAAC;AAED,qBAAiB,IAAI;AACrB,kBAAc,EAAE;AAChB,YAAQ,SAAS,EAAE;AACnB,YAAQ,SAAS,OAAO;AAAA,EAC1B,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,gBAAgB,YAAY,CAAC,cAA6B;AAC9D,QAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,IACF;AAEA,QAAI,cAAc,MAAM;AACtB,UAAI,kBAAkB,MAAM;AAC1B,sBAAc,QAAQ,KAAK;AAC3B,yBAAiB,CAAC;AAClB,gBAAQ,SAAS,QAAQ,CAAC,KAAK,EAAE;AACjC;AAAA,MACF;AAEA,YAAMC,cAAa,KAAK,IAAI,gBAAgB,GAAG,QAAQ,SAAS,CAAC;AACjE,uBAAiBA,WAAU;AAC3B,cAAQ,SAAS,QAAQA,WAAU,KAAK,EAAE;AAC1C;AAAA,IACF;AAEA,QAAI,kBAAkB,MAAM;AAC1B;AAAA,IACF;AAEA,UAAM,aAAa,gBAAgB;AACnC,QAAI,aAAa,GAAG;AAClB,uBAAiB,IAAI;AACrB,cAAQ,SAAS,UAAU;AAC3B;AAAA,IACF;AAEA,qBAAiB,UAAU;AAC3B,YAAQ,SAAS,QAAQ,UAAU,KAAK,EAAE;AAAA,EAC5C,GAAG,CAAC,YAAY,SAAS,eAAe,OAAO,CAAC;AAEhD,cAAY,CAAC,aAAa;AACxB,QAAI,QAAQ,aAAa;AACvB;AAAA,IACF;AAEA,UAAM,UAAU,SAAS;AACzB,UAAM,iBAAiB,QAAQ,mBAAmB;AAElD,QAAI,SAAS,QAAQ,YAAY,KAAK;AACpC,qBAAe,QAAQ;AACvB,cAAQ,QAAQ;AAChB;AAAA,IACF;AAEA,QAAI,kBAAkB,YAAY,OAAO;AACvC,qBAAe,QAAQ;AACvB,UAAI,SAAS,OAAO;AAClB,gBAAQ,kBAAkB;AAC1B;AAAA,MACF;AAEA,cAAQ,cAAc;AACtB;AAAA,IACF;AAEA,QAAI,kBAAkB,YAAY,KAAK;AACrC,qBAAe,QAAQ;AACvB,cAAQ,kBAAkB;AAC1B;AAAA,IACF;AAEA,QAAI,kBAAkB,YAAY,KAAK;AACrC,qBAAe,QAAQ;AACvB,cAAQ,cAAc;AACtB;AAAA,IACF;AAEA,QAAI,QAAQ,kBAAkB,YAAY,MAAM;AAC9C,qBAAe,QAAQ;AACvB,oBAAc,IAAI;AAClB;AAAA,IACF;AAEA,QAAI,QAAQ,kBAAkB,YAAY,QAAQ;AAChD,qBAAe,QAAQ;AACvB,oBAAc,MAAM;AACpB;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM;AAChB;AAAA,IACF;AAEA,QAAI,kBAAkB,QAAQ,MAAM,WAAW,KAAK,UAAU,KAAK,OAAO,GAAG;AAC3E,qBAAe,QAAQ;AACvB,cAAQ,WAAW,OAAO,OAAO,CAAC;AAAA,IACpC;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;AC7MA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,iBAAiB,OAAoC;AAC5D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEA,SAAS,cAAc,OAAgB,UAA0B;AAC/D,SAAO,iBAAiB,KAAK,KAAK;AACpC;AAEA,SAAS,mBAAmB,SAA6B;AACvD,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAa,QAAQ;AAC3B,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,UAAU,KAAK,MAAM,QAAQ,WAAW,IAAI,GAAG;AAC1D,WAAO,WAAW;AAAA,EACpB;AAEA,MAAI,MAAM,QAAQ,QAAQ,KAAK,GAAG;AAChC,WAAO,QAAQ;AAAA,EACjB;AAEA,MAAI,MAAM,QAAQ,QAAQ,WAAW,GAAG;AACtC,WAAO,QAAQ;AAAA,EACjB;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,cAAc,GAAW,GAAmB;AACnD,SAAO,EAAE,cAAc,GAAG,QAAW,EAAE,aAAa,OAAO,CAAC;AAC9D;AAEA,SAAS,yBAAyB,YAA+C;AAC/E,SAAO,WAAW,SAAS,WAAW,QAAQ,WAAW;AAC3D;AAEO,SAAS,uBAAuB,SAAwC;AAC7E,QAAM,SAA+B,CAAC;AACtC,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,aAAa,mBAAmB,OAAO,GAAG;AACnD,QAAI,CAAC,SAAS,SAAS,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,KAAK,iBAAiB,UAAU,EAAE;AACxC,UAAM,OAAO,iBAAiB,UAAU,IAAI;AAC5C,QAAI,CAAC,MAAM,CAAC,MAAM;AAChB;AAAA,IACF;AAEA,UAAM,OAAO,cAAc,UAAU,MAAM,IAAI;AAC/C,UAAM,YAAY,GAAG,EAAE,KAAK,IAAI;AAChC,QAAI,KAAK,IAAI,SAAS,GAAG;AACvB;AAAA,IACF;AAEA,SAAK,IAAI,SAAS;AAClB,WAAO,KAAK,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,EAChC;AAEA,SAAO,KAAK,CAAC,GAAG,MAAM,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC;AACnD,SAAO;AACT;AAEO,SAAS,8BAA8B,SAA+C;AAC3F,QAAM,SAAsC,CAAC;AAC7C,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,aAAa,mBAAmB,OAAO,GAAG;AACnD,QAAI,CAAC,SAAS,SAAS,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,KAAK,iBAAiB,UAAU,EAAE;AACxC,UAAM,OAAO,iBAAiB,UAAU,IAAI;AAC5C,QAAI,CAAC,MAAM,CAAC,MAAM;AAChB;AAAA,IACF;AAEA,UAAM,QAAQ,iBAAiB,UAAU,KAAK;AAC9C,UAAM,OAAO,cAAc,UAAU,MAAM,IAAI;AAC/C,UAAM,UAAU,iBAAiB,UAAU,QAAQ;AACnD,UAAM,cAAc,iBAAiB,UAAU,aAAa;AAC5D,UAAM,YAAY,GAAG,EAAE,KAAK,IAAI;AAEhC,QAAI,KAAK,IAAI,SAAS,GAAG;AACvB;AAAA,IACF;AAEA,SAAK,IAAI,SAAS;AAClB,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,SAAO,KAAK,CAAC,GAAG,MAAM,cAAc,yBAAyB,CAAC,GAAG,yBAAyB,CAAC,CAAC,CAAC;AAC7F,SAAO;AACT;AAEO,SAAS,sBAAsB,QAGT;AAC3B,QAAM,EAAE,MAAM,YAAY,IAAI;AAC9B,QAAM,UAAU,oBAAI,IAAgC;AACpD,QAAM,YAAY,oBAAI,IAAgC;AACtD,QAAM,SAAS,oBAAI,IAAoC;AAEvD,aAAW,OAAO,MAAM;AACtB,YAAQ,IAAI,IAAI,IAAI,GAAG;AACvB,cAAU,IAAI,IAAI,MAAM,GAAG;AAAA,EAC7B;AAEA,aAAW,cAAc,aAAa;AACpC,UAAM,OAAO,WAAW,gBACpB,QAAQ,IAAI,WAAW,aAAa,IACpC;AACJ,UAAM,SAAS,WAAW,WACtB,UAAU,IAAI,WAAW,QAAQ,IACjC;AACJ,UAAM,aAAa,QAAQ;AAE3B,UAAM,SAAS,aACX,WAAW,KACX,WAAW,WACT,QAAQ,WAAW,QAAQ,KAC3B;AAEN,UAAM,QAAQ,OAAO,IAAI,MAAM,KAC1B;AAAA,MACD;AAAA,MACA,OAAO,YAAY,MAAM,WAAW;AAAA,MACpC,SAAS,YAAY,QAAQ,WAAW,YAAY;AAAA,MACpD,SAAS,YAAY,QAAQ,WAAW;AAAA,MACxC,aAAa,CAAC;AAAA,IAChB;AAEF,UAAM,YAAY,KAAK,UAAU;AACjC,WAAO,IAAI,QAAQ,KAAK;AAAA,EAC1B;AAEA,QAAM,OAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AACvC,aAAW,SAAS,MAAM;AACxB,UAAM,YAAY,KAAK,CAAC,GAAG,MAAM,cAAc,yBAAyB,CAAC,GAAG,yBAAyB,CAAC,CAAC,CAAC;AAAA,EAC1G;AAEA,OAAK,KAAK,CAAC,GAAG,MAAM,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC;AACvD,SAAO;AACT;AAEO,SAAS,kBAAkB,QAAkC,OAAyC;AAC3G,QAAM,kBAAkB,MAAM,KAAK,EAAE,YAAY;AACjD,MAAI,gBAAgB,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,OACJ,IAAI,CAAC,UAAU;AACd,UAAM,sBAAsB,MAAM,YAAY,OAAO,CAAC,eAAe;AACnE,YAAM,WAAW;AAAA,QACf,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,MACb,EACG,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,EACjD,KAAK,GAAG,EACR,YAAY;AAEf,aAAO,SAAS,SAAS,eAAe;AAAA,IAC1C,CAAC;AAED,WAAO;AAAA,MACL,GAAG;AAAA,MACH,aAAa;AAAA,IACf;AAAA,EACF,CAAC,EACA,OAAO,CAAC,UAAU,MAAM,YAAY,SAAS,CAAC;AACnD;AAEO,SAAS,gBAAgB,QAIJ;AAC1B,QAAM,OAAgC,CAAC;AACvC,QAAM,iBAAiB,OAAO,MAAM,KAAK,EAAE,SAAS;AAEpD,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,WAAW,kBAAkB,OAAO,gBAAgB,IAAI,MAAM,MAAM;AAC1E,SAAK,KAAK;AAAA,MACR,IAAI,OAAO,MAAM,MAAM;AAAA,MACvB,MAAM;AAAA,MACN,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,SAAS,MAAM;AAAA,MACf;AAAA,IACF,CAAC;AAED,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,eAAW,cAAc,MAAM,aAAa;AAC1C,YAAM,iBAAiB,yBAAyB,UAAU;AAC1D,WAAK,KAAK;AAAA,QACR,IAAI,MAAM,MAAM,MAAM,IAAI,WAAW,EAAE;AAAA,QACvC,MAAM;AAAA,QACN,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,SAAS,MAAM,WAAW,WAAW;AAAA,QACrC,cAAc,WAAW;AAAA,QACzB;AAAA,QACA,gBAAgB,WAAW;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;ACxPA,SAAS,MAAM,mBAAmB;;;ACClC,SAAS,eAAe,OAAkD;AACxE,SAAO;AAAA,IACL,SAAS,MAAM,OAAO,OAAO,WAAW;AAAA,IACxC,SAAS,MAAM,OAAO,OAAO;AAAA,EAC/B;AACF;AAEA,SAAS,aAAa,OAAkC;AACtD,MAAI,MAAM,OAAO,IAAI;AACnB,WAAO,MAAM,OAAO,QAAQ;AAAA,EAC9B;AAEA,SAAO,eAAe,KAAK;AAC7B;AAEO,SAAS,oBAAoB,OAA6C;AAC/E,SAAO;AAAA,IACL,SAAS,MAAM,WAAW;AAAA,IAC1B,IAAI,MAAM,OAAO;AAAA,IACjB,YAAY,MAAM,OAAO;AAAA,IACzB,WAAW,IAAI,KAAK,MAAM,SAAS,EAAE,YAAY;AAAA,IACjD,SAAS,aAAa,KAAK;AAAA,IAC3B,UAAU,MAAM,OAAO;AAAA,IACvB,WAAW,MAAM,OAAO,aAAa;AAAA,EACvC;AACF;AAEO,SAAS,wBAAwB,UAAsC;AAC5E,MAAI;AACF,UAAM,SAAS,KAAK,UAAU,UAAU,MAAM,CAAC;AAC/C,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,SACO,OAAgB;AACrB,UAAM,UAAU,iBAAiB,QAC7B,MAAM,UACN,OAAO,KAAK;AAEhB,WAAO,KAAK,UAAU;AAAA,MACpB,SAAS,SAAS;AAAA,MAClB,IAAI;AAAA,MACJ,YAAY,SAAS;AAAA,MACrB,WAAW,SAAS;AAAA,MACpB,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF,GAAG,MAAM,CAAC;AAAA,EACZ;AACF;;;ADDW,cASH,YATG;AA/CX,IAAI,kBAAsC;AAE1C,SAAS,qBAAkC;AACzC,MAAI,iBAAiB;AACnB,WAAO;AAAA,EACT;AAEA,oBAAkB,YAAY,WAAW;AAAA,IACvC,SAAS;AAAA,MACP,IAAI,KAAK,QAAQ,SAAS;AAAA,IAC5B;AAAA,IACA,UAAU;AAAA,MACR,IAAI,KAAK,QAAQ,SAAS;AAAA,IAC5B;AAAA,IACA,QAAQ;AAAA,MACN,IAAI,KAAK,QAAQ,SAAS;AAAA,IAC5B;AAAA,IACA,QAAQ;AAAA,MACN,IAAI,KAAK,QAAQ,SAAS;AAAA,IAC5B;AAAA,IACA,SAAS;AAAA,MACP,IAAI,KAAK,QAAQ,SAAS;AAAA,IAC5B;AAAA,IACA,UAAU;AAAA,MACR,IAAI,KAAK,QAAQ,SAAS;AAAA,IAC5B;AAAA,IACA,aAAa;AAAA,MACX,IAAI,KAAK,QAAQ,SAAS;AAAA,IAC5B;AAAA,IACA,UAAU;AAAA,MACR,IAAI,KAAK,QAAQ,SAAS;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,SAAS,aAAa,QAGf;AACZ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI,CAAC,OAAO;AACV,WAAO,oBAAC,UAAK,IAAG,UAAS,sCAAwB;AAAA,EACnD;AAEA,QAAM,WAAW,oBAAoB,KAAK;AAC1C,QAAM,OAAO,wBAAwB,QAAQ;AAE7C,SACE,qBAAC,SAAI,eAAc,UAAS,OAAM,QAAO,QAAO,QAC9C;AAAA,wBAAC,SAAI,eAAe,GAClB,+BAAC,UAAK,IAAI,SAAS,KAAK,UAAU,OAC/B;AAAA,eAAS,KAAK,OAAO;AAAA,MAAM;AAAA,MAAE,SAAS;AAAA,MAAQ;AAAA,MAAG,SAAS;AAAA,MAAW;AAAA,OACxE,GACF;AAAA,IAEA,oBAAC,SAAI,UAAU,GAAG,OAAM,QAAO,QAAO,QACpC,8BAAC,eAAU,SAAS,WAAW,OAAO,EAAE,QAAQ,OAAO,GACrD;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAS;AAAA,QACT,aAAa,mBAAmB;AAAA,QAChC,WAAW;AAAA,QACX,SAAS;AAAA;AAAA,IACX,GACF,GACF;AAAA,KACF;AAEJ;;;ALivBQ,gBAAAC,MAiCA,QAAAC,aAjCA;AAtyBR,IAAM,YAAkC;AAAA,EACtC;AAAA,IACE,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AACF;AAEA,IAAM,gBAAmC,CAAC,aAAa,eAAe,WAAW,YAAY,MAAM;AACnG,IAAM,cAAgC,CAAC,SAAS,QAAQ,QAAQ;AAChE,IAAM,qBAAqB;AAE3B,SAASC,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,gBAAgB,SAGvB;AACA,MAAI,CAACA,UAAS,OAAO,GAAG;AACtB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,mBAAmB,QAAQ;AACjC,QAAM,eAAe,QAAQ;AAE7B,QAAM,cAAcA,UAAS,gBAAgB,KACxC,OAAO,iBAAiB,OAAO,YAC/B,OAAO,iBAAiB,SAAS,WAClC,EAAE,IAAI,iBAAiB,IAAI,MAAM,iBAAiB,KAAK,IACvD;AAEJ,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,UAAUA,UAAS,YAAY,KAChC,OAAO,aAAa,UAAU,YAC9B,OAAO,aAAa,kBAAkB,WACvC;AAAA,IACA,OAAO,aAAa;AAAA,IACpB,eAAe,aAAa;AAAA,EAC9B,IACE;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAAgB,SAAoC;AAC1E,QAAM,UAAU,iBAAiB,QAC7B,MAAM,UACN;AAEJ,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,MACL;AAAA,IACF;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAEA,SAAS,mBAAmB,OAAiC;AAC3D,QAAM,SAAS,MAAM,OAAO,KAAK,OAAO;AACxC,QAAM,UAAU,MAAM,WAAW;AACjC,SAAO,GAAG,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,UAAU;AACzD;AAEA,SAASC,gBAAe,UAAiD;AACvE,MAAI,OAAO,SAAS,mBAAmB,YAAY;AACjD,aAAS,eAAe;AAAA,EAC1B;AACF;AAEA,SAAS,YAAY,SAA0B;AAC7C,SAAO,YAAY,YAAY,YAAY;AAC7C;AAEA,SAAS,WAAW,SAA0B;AAC5C,SAAO,YAAY,WAAW,YAAY;AAC5C;AAEA,SAAS,WAAW,SAA0B;AAC5C,SAAO,YAAY,OAAO,YAAY;AACxC;AAEA,SAAS,sBAAsB,SAAiB,QAAmC;AACjF,QAAM,UAAU,OAAO,OAAO,WAAW,OAAO,OAAO,WAAW;AAClE,MACE,QAAQ,SAAS,oBAAoB,KAClC,QAAQ,SAAS,yBAAyB,GAC7C;AACA,WAAO,GAAG,OAAO;AAAA,EACnB;AAEA,QAAM,UAAU,OAAO,OAAO,WAAW;AACzC,SAAO,GAAG,OAAO,YAAY,OAAO;AACtC;AAEO,SAAS,kBAAkB,OAAgC;AAChE,QAAM,WAAW,YAAY;AAE7B,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAA6B,CAAC,CAAC;AAC7D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAwB,IAAI;AACtE,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAmB,CAAC,CAAC;AACjE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAA0B,WAAW;AAC/E,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAyB,MAAM;AACvE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA6C;AACnF,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAgD,MAAS;AACvF,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,CAAC;AAClD,QAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAAS,CAAC;AACpE,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,UAAS,CAAC;AAClE,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,KAAK;AAChE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAElD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,EAAE;AAC3D,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,UAAmC,MAAM;AACjG,QAAM,CAAC,4BAA4B,6BAA6B,IAAIA,UAAS,CAAC;AAC9E,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAmB,CAAC,CAAC;AACnE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA+B,CAAC,CAAC;AACvE,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAsC,CAAC,CAAC;AAC5F,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,KAAK;AAC9D,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAwB,IAAI;AACpE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAwB,IAAI;AAE1E,QAAM,kBAAkB,OAAO,EAAE;AAEjC,QAAM,WAAW,QAAQ,MAAM;AAC7B,WAAO,yBAAyB;AAAA,MAC9B,iBAAiB,MAAM;AAAA,IACzB,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,eAAe,CAAC;AAE1B,QAAM,2BAA2BC,aAAY,CAAC,YAAqB;AACjE,UAAM,WAAW,gBAAgB,OAAO;AACxC,QAAI,SAAS,aAAa;AACxB,qBAAe,SAAS,WAAW;AAAA,IACrC;AAEA,QAAI,SAAS,YAAY,QAAW;AAClC,iBAAW,SAAS,OAAO;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAuBA,aAAY,CAAC,aAAuB;AAC/D,QAAI,SAAS,WAAW,GAAG;AACzB;AAAA,IACF;AAEA,sBAAkB,CAAC,aAAa,CAAC,GAAG,UAAU,GAAG,QAAQ,CAAC;AAAA,EAC5D,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqBA,aAAY,CAAC,QAA2B,YAAoB;AACrF,UAAM,QAA0B;AAAA,MAC9B,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,MACxD;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB;AAEA,eAAW,CAAC,aAAa,CAAC,OAAO,GAAG,QAAQ,CAAC;AAC7C,qBAAiB,MAAM,EAAE;AACzB,4BAAwB,CAAC;AAEzB,QAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AACjD,2BAAqB,OAAO,QAAQ;AAAA,IACtC;AAEA,QAAI,OAAO,MAAM,OAAO,SAAS,QAAW;AAC1C,+BAAyB,OAAO,IAAI;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,sBAAsB,wBAAwB,CAAC;AAEnD,QAAM,cAAcA,aAAY,OAAM,MAAgB,gBAAwB;AAC5E,iBAAa,IAAI;AACjB,QAAI;AACF,YAAM,SAAS,MAAM,SAAS,cAAc,IAAI;AAChD,yBAAmB,QAAQ,WAAW;AAAA,IACxC,UACA;AACE,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,oBAAoB,QAAQ,CAAC;AAEjC,QAAM,kBAAkBA,aAAY,OAAM,SAA+C;AACvF,UAAM,SAAS,MAAM,SAAS,cAAc,IAAI;AAChD,QAAI,OAAO,MAAM,OAAO,SAAS,QAAW;AAC1C,+BAAyB,OAAO,IAAI;AAAA,IACtC;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,0BAA0B,QAAQ,CAAC;AAEvC,QAAM,cAAcA,aAAY,CAAC,SAAiB;AAChD,QAAI;AAEJ,QAAI;AACF,aAAO,iBAAiB,IAAI;AAAA,IAC9B,SACO,OAAgB;AACrB,yBAAmB,eAAe,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC;AAClE;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,GAAG;AACrB;AAAA,IACF;AAEA,SAAK,YAAY,MAAM,KAAK,KAAK,CAAC;AAAA,EACpC,GAAG,CAAC,oBAAoB,WAAW,CAAC;AAEpC,QAAM,kBAAkBA,aAAY,OAAM,UAA4B;AACpE,QAAI,MAAM,YAAY,UAAU;AAC9B,YAAM,YAAY,CAAC,GAAG,QAAQ;AAC9B;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAO,iBAAiB,MAAM,OAAO;AAC3C,YAAM,YAAY,MAAM,MAAM,OAAO;AAAA,IACvC,SACO,OAAgB;AACrB,yBAAmB,eAAe,OAAO,MAAM,OAAO,GAAG,MAAM,OAAO;AAAA,IACxE;AAAA,EACF,GAAG,CAAC,oBAAoB,WAAW,CAAC;AAEpC,QAAM,gBAAgBA,aAAY,CAAC,eAAuB;AACxD,UAAM,SAAS,UAAU,KAAK,CAAC,aAAa,SAAS,OAAO,UAAU;AACtE,QAAI,CAAC,UAAU,aAAa,kBAAkB;AAC5C;AAAA,IACF;AAEA,QAAI,OAAO,UAAU;AACnB,eAAS,OAAO,QAAQ;AACxB,sBAAgB,OAAO;AACvB;AAAA,IACF;AAEA,QAAI,OAAO,KAAK;AACd,WAAK,YAAY,iBAAiB,OAAO,GAAG,GAAG,OAAO,GAAG;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,aAAa,kBAAkB,SAAS,CAAC;AAE7C,QAAM,yBAAyB,QAAQ,MAAM;AAC3C,WAAO,sBAAsB;AAAA,MAC3B,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,kBAAkB,CAAC;AAEpC,QAAM,2BAA2B,QAAQ,MAAM;AAC7C,WAAO,kBAAkB,wBAAwB,gBAAgB;AAAA,EACnE,GAAG,CAAC,kBAAkB,sBAAsB,CAAC;AAE7C,QAAM,0BAA0B,QAAQ,MAAM;AAC5C,UAAM,SAAS,oBAAI,IAAoB;AACvC,eAAW,SAAS,0BAA0B;AAC5C,aAAO,IAAI,MAAM,QAAQ,MAAM,YAAY,MAAM;AAAA,IACnD;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,wBAAwB,CAAC;AAE7B,QAAM,oBAAoB,QAAQ,MAAM;AACtC,WAAO,IAAI,IAAI,eAAe;AAAA,EAChC,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,iBAAiB,QAAQ,MAAM;AACnC,WAAO,gBAAgB;AAAA,MACrB,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB,OAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,kBAAkB,mBAAmB,wBAAwB,CAAC;AAElE,QAAM,wBAAwB,QAAQ,MAAM;AAC1C,QAAI,eAAe,WAAW,GAAG;AAC/B,aAAO;AAAA,IACT;AAEA,WAAO,eAAe,0BAA0B,KAAK,eAAe,CAAC,KAAK;AAAA,EAC5E,GAAG,CAAC,gBAAgB,0BAA0B,CAAC;AAE/C,QAAM,qBAAqBA,aAAY,CAAC,WAAmB;AACzD,uBAAmB,CAAC,aAAa;AAC/B,UAAI,SAAS,SAAS,MAAM,GAAG;AAC7B,eAAO,SAAS,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAChD;AAEA,aAAO,CAAC,GAAG,UAAU,MAAM;AAAA,IAC7B,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAwBA,aAAY,YAAW;AACnD,QAAI,kBAAkB;AACpB;AAAA,IACF;AAEA,wBAAoB,IAAI;AACxB,oBAAgB,IAAI;AAEpB,QAAI;AACF,YAAM,eAAyB,CAAC;AAEhC,YAAM,aAAa,MAAM,gBAAgB,CAAC,QAAQ,MAAM,CAAC;AACzD,YAAM,oBAAoB,MAAM,gBAAgB,CAAC,QAAQ,mBAAmB,CAAC;AAE7E,YAAM,WAAW,WAAW,MAAM,WAAW,SAAS,SAClD,uBAAuB,WAAW,IAAI,IACtC,CAAC;AACL,YAAM,kBAAkB,kBAAkB,MAAM,kBAAkB,SAAS,SACvE,8BAA8B,kBAAkB,IAAI,IACpD,CAAC;AAEL,UAAI,CAAC,WAAW,IAAI;AAClB,qBAAa,KAAK,sBAAsB,aAAa,UAAU,CAAC;AAAA,MAClE;AAEA,UAAI,CAAC,kBAAkB,IAAI;AACzB,qBAAa,KAAK,sBAAsB,0BAA0B,iBAAiB,CAAC;AAAA,MACtF;AAEA,qBAAe,QAAQ;AACvB,4BAAsB,eAAe;AACrC,yBAAmB,KAAK,IAAI,CAAC;AAE7B,YAAM,aAAa,sBAAsB;AAAA,QACvC,MAAM;AAAA,QACN,aAAa;AAAA,MACf,CAAC;AAED,yBAAmB,CAAC,aAAa;AAC/B,YAAI,SAAS,SAAS,GAAG;AACvB,gBAAM,UAAU,IAAI,IAAI,WAAW,IAAI,CAAC,UAAU,MAAM,MAAM,CAAC;AAC/D,iBAAO,SAAS,OAAO,CAAC,QAAQ,QAAQ,IAAI,GAAG,CAAC;AAAA,QAClD;AAEA,eAAO,WAAW,IAAI,CAAC,UAAU,MAAM,MAAM;AAAA,MAC/C,CAAC;AAED,UAAI,aAAa,SAAS,GAAG;AAC3B,6BAAqB,YAAY;AACjC,wBAAgB,aAAa,CAAC,KAAK,yBAAyB;AAAA,MAC9D,OACK;AACH,wBAAgB,IAAI;AAAA,MACtB;AAAA,IACF,UACA;AACE,0BAAoB,KAAK;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,sBAAsB,kBAAkB,eAAe,CAAC;AAE5D,QAAM,2BAA2BA,aAAY,OAAM,QAAsC;AACvF,QAAI,CAAC,OAAO,aAAa,kBAAkB;AACzC;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,OAAO;AACtB,yBAAmB,IAAI,MAAM;AAC7B;AAAA,IACF;AAEA,QAAI,CAAC,IAAI,WAAW,CAAC,IAAI,gBAAgB;AACvC,2BAAqB;AAAA,QACnB;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,UAAM,UAAU,UAAU,IAAI,OAAO,IAAI,IAAI,cAAc;AAC3D,oBAAgB,QAAQ;AACxB,UAAM,YAAY,CAAC,MAAM,OAAO,IAAI,SAAS,IAAI,cAAc,GAAG,OAAO;AAAA,EAC3E,GAAG,CAAC,sBAAsB,aAAa,kBAAkB,WAAW,kBAAkB,CAAC;AAEvF,QAAM,oBAAoBA,aAAY,CAAC,UAAkB;AACvD,UAAM,YAAY,QAAQ,IACtB,cAAc,SAAS,IACvB,SAAS,cAAc,SACrB,IACA;AAEN,UAAM,UAAU,cAAc,SAAS;AACvC,QAAI,SAAS;AACX,uBAAiB,OAAO;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcA,aAAY,MAAM;AACpC,UAAM,eAAe,cAAc,QAAQ,aAAa;AACxD,sBAAkB,eAAe,CAAC;AAAA,EACpC,GAAG,CAAC,eAAe,iBAAiB,CAAC;AAErC,QAAM,kBAAkBA,aAAY,MAAM;AACxC,UAAM,eAAe,cAAc,QAAQ,aAAa;AACxD,sBAAkB,eAAe,CAAC;AAAA,EACpC,GAAG,CAAC,eAAe,iBAAiB,CAAC;AAErC,QAAM,kBAAkBA,aAAY,CAAC,UAAkB;AACrD,UAAM,YAAY,QAAQ,IACtB,YAAY,SAAS,IACrB,SAAS,YAAY,SACnB,IACA;AAEN,UAAM,QAAQ,YAAY,SAAS;AACnC,QAAI,OAAO;AACT,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,YAAYA,aAAY,MAAM;AAClC,UAAM,eAAe,YAAY,QAAQ,YAAY;AACrD,oBAAgB,eAAe,CAAC;AAAA,EAClC,GAAG,CAAC,cAAc,eAAe,CAAC;AAElC,QAAM,gBAAgBA,aAAY,MAAM;AACtC,UAAM,eAAe,YAAY,QAAQ,YAAY;AACrD,oBAAgB,eAAe,CAAC;AAAA,EAClC,GAAG,CAAC,cAAc,eAAe,CAAC;AAElC,QAAM,uBAAuBA,aAAY,MAAM;AAC7C,kBAAc,KAAK;AACnB,yBAAqB,IAAI;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAwBA,aAAY,MAAM;AAC9C,yBAAqB,KAAK;AAC1B,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgBA,aAAY,MAAM;AACtC,kBAAc,IAAI;AAClB,sBAAkB,CAAC,aAAa;AAC9B,YAAM,cAAc,SAAS,SAAS,SAAS,CAAC;AAChD,YAAM,UAAU;AAChB,UAAI,gBAAgB,SAAS;AAC3B,eAAO;AAAA,MACT;AAEA,aAAO,CAAC,GAAG,UAAU,OAAO;AAAA,IAC9B,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,4BAA4B,kBAAkB,iBAC/C,iBAAiB,UACjB,yBAAyB,YACzB,CAAC,aACD,CAAC;AAEN,QAAM,EAAE,YAAY,IAAI,gBAAgB;AAAA,IACtC,MAAM,aAAa;AAAA,IACnB;AAAA,IACA,gBAAgB,iBAAiB;AAAA,IACjC,aAAa;AAAA,IACb,gBAAgB,CAAC,aAAa,CAAC;AAAA,IAC/B;AAAA,IACA,UAAU;AAAA,IACV,SAAS,MAAM;AACb,iBAAW,CAAC,CAAC;AACb,uBAAiB,IAAI;AACrB,wBAAkB,CAAC,CAAC;AACpB,8BAAwB,CAAC;AAAA,IAC3B;AAAA,IACA,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,mBAAmB;AAAA,EACrB,CAAC;AAED,EAAAC,aAAY,CAAC,aAAa;AACxB,UAAM,UAAU,SAAS;AAEzB,QAAI,mBAAmB;AACrB,UAAI,YAAY,OAAO,GAAG;AACxB,QAAAH,gBAAe,QAAQ;AACvB,8BAAsB;AACtB;AAAA,MACF;AAEA,UAAI,WAAW,OAAO,GAAG;AACvB,QAAAA,gBAAe,QAAQ;AACvB,iBAAS,QAAQ;AACjB;AAAA,MACF;AAEA,UAAI,SAAS,QAAQ,YAAY,KAAK;AACpC,iBAAS,QAAQ;AAAA,MACnB;AAEA;AAAA,IACF;AAEA,QACE,kBAAkB,iBACf,iBAAiB,UACjB,yBAAyB,YACzB,YAAY,OAAO,GACtB;AACA,MAAAA,gBAAe,QAAQ;AACvB,8BAAwB,MAAM;AAC9B;AAAA,IACF;AAEA,QACE,kBAAkB,iBACf,iBAAiB,UACjB,yBAAyB,UACzB,WAAW,OAAO,GACrB;AACA,MAAAA,gBAAe,QAAQ;AACvB,8BAAwB,QAAQ;AAChC;AAAA,IACF;AAEA,QAAI,SAAS,QAAQ,YAAY,KAAK;AACpC,eAAS,QAAQ;AACjB;AAAA,IACF;AAEA,QAAI,WAAW;AACb;AAAA,IACF;AAEA,QAAI,YAAY,OAAO,GAAG;AACxB,MAAAA,gBAAe,QAAQ;AAEvB,UAAI,iBAAiB,SAAS;AAC5B,wBAAgB,OAAO;AACvB,sBAAc;AACd;AAAA,MACF;AAEA,UAAI,CAAC,YAAY;AACf,sBAAc;AACd;AAAA,MACF;AAEA,2BAAqB;AACrB;AAAA,IACF;AAEA,QACE,kBAAkB,iBACf,iBAAiB,UACjB,yBAAyB,UACzB,YAAY,SACf;AACA,MAAAA,gBAAe,QAAQ;AACvB,UAAI,uBAAuB,SAAS,OAAO;AACzC,2BAAmB,sBAAsB,MAAM;AAAA,MACjD;AACA;AAAA,IACF;AAEA,QAAI,YAAY,UAAU,YAAY,SAAS;AAC7C,UAAI,iBAAiB,WAAW,MAAM,SAAS,GAAG;AAChD;AAAA,MACF;AAEA,MAAAA,gBAAe,QAAQ;AACvB,oBAAc,KAAK;AACnB,UAAI,YAAY,QAAQ;AACtB,sBAAc;AAAA,MAChB,OACK;AACH,kBAAU;AAAA,MACZ;AACA;AAAA,IACF;AAEA,QACE,YAAY,OACT,kBAAkB,iBAClB,iBAAiB,UACjB,yBAAyB,UACzB,CAAC,kBACJ;AACA,MAAAA,gBAAe,QAAQ;AACvB,WAAK,sBAAsB;AAC3B;AAAA,IACF;AAEA,QACE,YAAY,OACT,kBAAkB,aAClB,iBAAiB,UACjB,MAAM,WAAW,KACjB,CAAC,aACD,CAAC,kBACJ;AACA,YAAM,QAAQ,QAAQ,oBAAoB;AAC1C,UAAI,OAAO;AACT,aAAK,gBAAgB,KAAK;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAC;AAED,YAAU,MAAM;AACd,SAAK,YAAY,CAAC,GAAG,QAAQ;AAAA,EAC/B,GAAG,CAAC,WAAW,CAAC;AAEhB,YAAU,MAAM;AACd,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AAEA,UAAM,QAAQ,WAAW,MAAM;AAC7B,oBAAc,KAAK;AAAA,IACrB,GAAG,kBAAkB;AAErB,WAAO,MAAM;AACX,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,YAAU,MAAM;AACd,QAAI,CAAC,aAAa,CAAC,kBAAkB;AACnC;AAAA,IACF;AAEA,UAAM,QAAQ,YAAY,MAAM;AAC9B,sBAAgB,CAAC,cAAc,WAAW,KAAK,CAAC;AAAA,IAClD,GAAG,GAAG;AAEN,WAAO,MAAM;AACX,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,kBAAkB,SAAS,CAAC;AAEhC,YAAU,MAAM;AACd,QAAI,uBAAuB,QAAQ,QAAQ;AACzC;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,IAAI,QAAQ,SAAS,GAAG,CAAC;AAChD,4BAAwB,SAAS;AAAA,EACnC,GAAG,CAAC,QAAQ,QAAQ,oBAAoB,CAAC;AAEzC,YAAU,MAAM;AACd,QAAI,6BAA6B,eAAe,QAAQ;AACtD;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,IAAI,eAAe,SAAS,GAAG,CAAC;AACvD,kCAA8B,SAAS;AAAA,EACzC,GAAG,CAAC,eAAe,QAAQ,0BAA0B,CAAC;AAEtD,YAAU,MAAM;AACd,QAAI,kBAAkB,iBAAiB,yBAAyB,QAAQ;AACtE,8BAAwB,MAAM;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,eAAe,oBAAoB,CAAC;AAExC,YAAU,MAAM;AACd,UAAM,WAAW,GAAG,aAAa,MAAM,EAAE,KAAK,SAAS,iBAAiB,EAAE;AAC1E,QAAI,gBAAgB,QAAQ,WAAW,GAAG;AACxC,sBAAgB,UAAU;AAC1B;AAAA,IACF;AAEA,QAAI,gBAAgB,YAAY,UAAU;AACxC;AAAA,IACF;AAEA,oBAAgB,UAAU;AAC1B,QAAI,oBAAoB,MAAM;AAC5B,yBAAmB,IAAI;AACvB,qBAAe,CAAC,CAAC;AACjB,4BAAsB,CAAC,CAAC;AACxB,yBAAmB,CAAC,CAAC;AACrB,oCAA8B,CAAC;AAC/B,sBAAgB,IAAI;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,iBAAiB,SAAS,eAAe,aAAa,EAAE,CAAC;AAE7D,YAAU,MAAM;AACd,QACE,kBAAkB,iBACf,oBAAoB,QACpB,kBACH;AACA;AAAA,IACF;AAEA,SAAK,sBAAsB;AAAA,EAC7B,GAAG,CAAC,eAAe,iBAAiB,kBAAkB,qBAAqB,CAAC;AAE5E,QAAM,UAAU,QAAQ,MAAM;AAC5B,WAAO,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,YAAY,KAAK;AAAA,EAChD,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,cAAc,QAAQ,MAAM;AAChC,QAAI,eAAe;AACjB,YAAM,QAAQ,QAAQ,KAAK,CAAC,UAAU,MAAM,OAAO,aAAa;AAChE,UAAI,OAAO;AACT,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,QAAQ,CAAC,KAAK;AAAA,EACvB,GAAG,CAAC,eAAe,OAAO,CAAC;AAE3B,QAAM,iBAAiB,QAAQ,MAAM;AACnC,UAAM,UAAU;AAAA,MACd;AAAA,MACA,GAAG,cAAc,OAAO,CAAC,YAAY,YAAY,aAAa;AAAA,IAChE;AAEA,WAAO,QAAQ,IAAI,CAAC,aAAa;AAAA,MAC/B,MAAM,YAAY,cACd,cACA,YAAY,gBACV,gBACA,YAAY,YACV,YACA,YAAY,aACV,aACA;AAAA,MACV,aAAa,YAAY,cACrB,kBACA,YAAY,gBACV,aACA,YAAY,YACV,cACA,YAAY,aACV,kBACA;AAAA,MACV,OAAO;AAAA,IACT,EAAE;AAAA,EACJ,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,kBAAkB,QAAQ,MAAM;AACpC,WAAO,UAAU,IAAI,CAAC,cAAc;AAAA,MAClC,MAAM,GAAG,SAAS,EAAE,KAAK,SAAS,KAAK;AAAA,MACvC,aAAa,SAAS,OAAO,SAAS,YAAY;AAAA,MAClD,OAAO,SAAS;AAAA,IAClB,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiB,QAAQ,MAAM;AACnC,WAAO,QAAQ,IAAI,CAAC,WAAW;AAAA,MAC7B,MAAM,mBAAmB,KAAK;AAAA,MAC9B,aAAa,IAAI,KAAK,MAAM,SAAS,EAAE,mBAAmB;AAAA,MAC1D,OAAO,MAAM;AAAA,IACf,EAAE;AAAA,EACJ,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,oBAAoB,QAAQ,MAAM;AACtC,WAAO,eAAe,IAAI,CAAC,QAAQ;AACjC,UAAI,IAAI,SAAS,OAAO;AACtB,cAAM,YAAY,wBAAwB,IAAI,IAAI,MAAM,KAAK;AAC7D,eAAO;AAAA,UACL,MAAM,GAAG,IAAI,WAAW,QAAQ,KAAK,IAAI,IAAI,OAAO,GAAG,IAAI,UAAU,KAAK,IAAI,OAAO,MAAM,EAAE;AAAA,UAC7F,aAAa,GAAG,SAAS,eAAe,cAAc,IAAI,KAAK,GAAG;AAAA,UAClE,OAAO,IAAI;AAAA,QACb;AAAA,MACF;AAEA,YAAM,kBAAkB,IAAI,kBAAkB,IAAI,kBAAkB,IAAI,gBAAgB;AACxF,aAAO;AAAA,QACL,MAAM,OAAO,eAAe,GAAG,IAAI,iBAAiB,KAAK,IAAI,cAAc,MAAM,EAAE;AAAA,QACnF,aAAa,IAAI,UAAU,QAAQ,IAAI,OAAO,KAAK;AAAA,QACnD,OAAO,IAAI;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,yBAAyB,cAAc,CAAC;AAE5C,QAAM,oBAAoB,MAAM;AAC9B,QAAI,kBAAkB,aAAa;AACjC,aACE,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,iBAAiB,UAAU,CAAC,qBAAqB,CAAC;AAAA,UAC3D,SAAS;AAAA,UACT,eAAe;AAAA,UACf,UAAU,CAAC,UAAU;AACnB,qCAAyB,KAAK;AAAA,UAChC;AAAA,UACA,UAAU,CAAC,OAAO,WAAW;AAC3B,qCAAyB,KAAK;AAC9B,kBAAM,aAAa,OAAO,QAAQ,SAAS,CAAC;AAC5C,gBAAI,OAAO,SAAS,UAAU,KAAK,aAAa,GAAG;AACjD,4BAAc,UAAU;AAAA,YAC1B;AAAA,UACF;AAAA,UACA,qBAAmB;AAAA,UACnB,OAAO;AAAA,YACL,UAAU;AAAA,UACZ;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,kBAAkB,eAAe;AACnC,YAAM,cAAc,iBAAiB,UAChC,yBAAyB,UACzB,CAAC,aACD,CAAC;AACN,YAAM,gBAAgB,iBAAiB,UAClC,yBAAyB,YACzB,CAAC,aACD,CAAC;AAEN,aACE,gBAAAC,MAAC,SAAI,eAAc,UAAS,UAAU,GACpC;AAAA,wBAAAD,KAAC,SAAI,QAAM,MAAC,aAAY,UAAS,aAAa,gBAAgB,YAAY,WAAW,UAAU,GAC7F,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,aAAY;AAAA,YACZ,UAAU,CAAC,UAAU;AACnB,kCAAoB,KAAK;AACzB,4CAA8B,CAAC;AAAA,YACjC;AAAA,YACA,UAAU,MAAM;AACd,sCAAwB,MAAM;AAAA,YAChC;AAAA,YACA,SAAS;AAAA,YACT,OAAO;AAAA,cACL,UAAU;AAAA,YACZ;AAAA;AAAA,QACF,GACF;AAAA,QAEA,gBAAAA,KAAC,SAAI,WAAW,GAAG,cAAc,GAC/B,0BAAAA,KAAC,UAAK,IAAG,QAAO,qFAAuE,GACzF;AAAA,QAEC,oBAAoB,gBAAAA,KAAC,UAAK,IAAG,QAAO,4CAA8B;AAAA,QAClE,gBAAgB,gBAAAA,KAAC,UAAK,IAAG,OAAO,wBAAa;AAAA,QAE7C,kBAAkB,WAAW,IAExB,gBAAAA,KAAC,UAAK,IAAG,QACN,2BAAiB,KAAK,EAAE,SAAS,IAC9B,0BAA0B,gBAAgB,OAC1C,8CACN,IAGA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,SAAS;AAAA,YACT,eAAe;AAAA,YACf,UAAU,CAAC,UAAU;AACnB,4CAA8B,KAAK;AAAA,YACrC;AAAA,YACA,UAAU,CAAC,UAAU;AACnB,4CAA8B,KAAK;AACnC,oBAAM,MAAM,eAAe,KAAK,KAAK;AACrC,mBAAK,yBAAyB,GAAG;AAAA,YACnC;AAAA,YACA,qBAAmB;AAAA,YACnB,OAAO;AAAA,cACL,UAAU;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,SAER;AAAA,IAEJ;AAEA,QAAI,kBAAkB,WAAW;AAC/B,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO,gBAAAA,KAAC,UAAK,IAAG,QAAO,qCAAuB;AAAA,MAChD;AAEA,aACE,gBAAAC,MAAC,SAAI,eAAc,UAAS,UAAU,GACpC;AAAA,wBAAAD,KAAC,UAAK,IAAG,QAAO,mDAAqC;AAAA,QACrD,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,iBAAiB,UAAU,CAAC,qBAAqB,CAAC;AAAA,YAC3D,SAAS;AAAA,YACT,eAAe;AAAA,YACf,UAAU,CAAC,OAAO,WAAW;AAC3B,sCAAwB,KAAK;AAC7B,kBAAI,OAAO,QAAQ,UAAU,UAAU;AACrC,iCAAiB,OAAO,KAAK;AAAA,cAC/B;AAAA,YACF;AAAA,YACA,UAAU,CAAC,OAAO,WAAW;AAC3B,sCAAwB,KAAK;AAC7B,kBAAI,OAAO,QAAQ,UAAU,UAAU;AACrC,iCAAiB,OAAO,KAAK;AAAA,cAC/B;AAAA,YACF;AAAA,YACA,qBAAmB;AAAA,YACnB,OAAO;AAAA,cACL,UAAU;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,SACF;AAAA,IAEJ;AAEA,QAAI,kBAAkB,YAAY;AAChC,aACE,gBAAAC,MAAC,eAAU,SAAS,iBAAiB,UAAU,CAAC,qBAAqB,CAAC,WAAW,OAAO,EAAE,QAAQ,OAAO,GACtG;AAAA,uBAAe,WAAW,KAAK,gBAAAD,KAAC,UAAK,IAAG,QAAO,8BAAgB;AAAA,QAC/D,eAAe,IAAI,CAAC,MAAM,UACzB,gBAAAA,KAAC,UAA+B,kBAArB,WAAW,KAAK,EAAU,CACtC;AAAA,SACH;AAAA,IAEJ;AAEA,WACE,gBAAAC,MAAC,eAAU,SAAS,iBAAiB,UAAU,CAAC,qBAAqB,CAAC,WAAW,OAAO,EAAE,QAAQ,OAAO,GACvG;AAAA,sBAAAD,KAAC,UAAK,IAAG,QAAO,0BAAY;AAAA,MAC5B,gBAAAA,KAAC,UAAK,8CAAgC;AAAA,MACtC,gBAAAA,KAAC,UAAK,8CAAgC;AAAA,MACtC,gBAAAA,KAAC,UAAK,uCAAyB;AAAA,MAC/B,gBAAAA,KAAC,UAAK,gCAAkB;AAAA,MACxB,gBAAAA,KAAC,UAAK,+CAAiC;AAAA,MACvC,gBAAAA,KAAC,UAAK,qDAAuC;AAAA,MAC7C,gBAAAA,KAAC,UAAK,2CAA6B;AAAA,MACnC,gBAAAA,KAAC,UAAK,gCAAkB;AAAA,MACxB,gBAAAA,KAAC,UAAK,4CAA8B;AAAA,MACpC,gBAAAA,KAAC,UAAK,uDAAyC;AAAA,MAC/C,gBAAAA,KAAC,UAAK,0DAA4C;AAAA,MAClD,gBAAAA,KAAC,UAAK,iEAAmD;AAAA,MACzD,gBAAAA,KAAC,UAAK,uDAAyC;AAAA,MAC/C,gBAAAA,KAAC,UAAK,oDAAsC;AAAA,MAC5C,gBAAAA,KAAC,UAAK,kDAAoC;AAAA,MAC1C,gBAAAA,KAAC,UAAK,0DAA4C;AAAA,MAClD,gBAAAA,KAAC,UAAK,gCAAkB;AAAA,OAC1B;AAAA,EAEJ;AAEA,SACE,gBAAAC,MAAC,SAAI,eAAc,UAAS,OAAM,QAAO,QAAO,QAAO,SAAS,GAC9D;AAAA,oBAAAA,MAAC,SAAI,eAAc,OAAM,gBAAe,iBAAgB,cAAc,GAAG,UAAU,GACjF;AAAA,sBAAAD,KAAC,gBAAW,MAAK,WAAU,MAAK,QAAO,OAAM,WAAU;AAAA,MAEvD,gBAAAC,MAAC,SAAI,eAAc,UAAS,YAAW,YAAW,gBAAe,UAC/D;AAAA,wBAAAA,MAAC,UAAK;AAAA;AAAA,UAAM,cAAc,GAAG,YAAY,IAAI,KAAK,YAAY,EAAE,MAAM;AAAA,WAAU;AAAA,QAChF,gBAAAA,MAAC,UAAK;AAAA;AAAA,UACK,YACL,GAAG,OAAO,aACV,mBACE,GAAG,OAAO,qBACV;AAAA,WACR;AAAA,QACA,gBAAAA,MAAC,UAAK;AAAA;AAAA,UAAU,UAAU,QAAQ,QAAQ;AAAA,WAAoB;AAAA,QAC9D,gBAAAA,MAAC,UAAK;AAAA;AAAA,UAAS,UAAU,QAAQ,gBAAgB;AAAA,WAAI;AAAA,SACvD;AAAA,OACF;AAAA,IAEA,gBAAAA,MAAC,SAAI,eAAc,OAAM,UAAU,GACjC;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,aAAa;AAAA,UACb,QAAM;AAAA,UACN,aAAY;AAAA,UACZ,aAAa,iBAAiB,SAAS,YAAY;AAAA,UACnD,SAAS;AAAA,UACT,eAAc;AAAA,UAEd;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,iBAAiB,UAAU,CAAC,qBAAqB,CAAC;AAAA,gBAC3D,SAAS;AAAA,gBACT,UAAU,CAAC,QAAQ,WAAW;AAC5B,sBAAI,OAAO,QAAQ,UAAU,UAAU;AACrC,qCAAiB,OAAO,KAAwB;AAChD,4CAAwB,MAAM;AAAA,kBAChC;AAAA,gBACF;AAAA;AAAA,YACF;AAAA,YAEA,gBAAAA,KAAC,SAAI,WAAW,GAAG,UAAU,GAAG,QAAM,MAAC,aAAY,UAAS,aAAY,WAAU,SAAS,GACxF,4BAAkB,GACrB;AAAA;AAAA;AAAA,MACF;AAAA,MAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAM;AAAA,UACN,aAAY;AAAA,UACZ,aAAa,iBAAiB,WAAW,YAAY;AAAA,UACrD,SAAS;AAAA,UACT,UAAU;AAAA,UAET,sBAEK,gBAAAC,MAAC,SAAI,OAAM,QAAO,QAAO,QAAO,YAAW,UAAS,gBAAe,UAAS,eAAc,UACxF;AAAA,4BAAAD,KAAC,UAAK,IAAG,QAAQ,mBAAQ;AAAA,YACzB,gBAAAA,KAAC,UAAK,IAAG,QAAO,gCAAkB;AAAA,aACpC,IAEF,aAAa;AAAA,YACX,OAAO;AAAA,YACP,WAAW,iBAAiB,YAAY,CAAC;AAAA,UAC3C,CAAC;AAAA;AAAA,MACP;AAAA,OACF;AAAA,IAEA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,QAAM;AAAA,QACN,aAAY;AAAA,QACZ,aAAa,iBAAiB,UAAU,YAAY;AAAA,QACpD,SAAS;AAAA,QACT,WAAW;AAAA,QAEX;AAAA,0BAAAD,KAAC,UAAK,IAAG,QAAO,gBAAK;AAAA,UACrB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,EAAE,UAAU,EAAE;AAAA,cACrB,OAAO;AAAA,cACP,aAAY;AAAA,cACZ,UAAU,CAAC,UAAU;AACnB,yBAAS,KAAK;AAAA,cAChB;AAAA,cACA,UAAU,CAAC,UAAU;AACnB,4BAAY,OAAO,UAAU,WAAW,QAAQ,MAAS;AAAA,cAC3D;AAAA,cACA,SAAS,CAAC,aAAa,CAAC,oBAAoB,iBAAiB,WAAW,CAAC;AAAA;AAAA,UAC3E;AAAA;AAAA;AAAA,IACF;AAAA,IAEC,qBACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,QACV;AAAA,QACA,YAAW;AAAA,QACX,gBAAe;AAAA,QAEf,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAM;AAAA,YACN,aAAY;AAAA,YACZ,aAAY;AAAA,YACZ,eAAc;AAAA,YACd,OAAO;AAAA,cACL,iBAAiB;AAAA,YACnB;AAAA,YAEA;AAAA,8BAAAD,KAAC,UAAK,IAAG,WAAU,+BAAiB;AAAA,cACpC,gBAAAA,KAAC,UAAK,kCAAoB;AAAA,cAC1B,gBAAAA,KAAC,UAAK,gDAAkC;AAAA;AAAA;AAAA,QAC1C;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;;;ADjjCI,gBAAAO,YAAA;AA3BJ,SAAS,gBAAgB,MAAsB;AAC7C,QAAM,QAAQ,QAAQ,IAAI,IAAI;AAC9B,MAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACvC,UAAM,IAAI,MAAM,qCAAqC,IAAI,EAAE;AAAA,EAC7D;AAEA,SAAO;AACT;AAEA,SAAS,mBAAqC;AAC5C,SAAO;AAAA,IACL,SAAS,QAAQ,IAAI,uBAAuB;AAAA,IAC5C,iBAAiB;AAAA,MACf,YAAY,gBAAgB,wBAAwB;AAAA,MACpD,YAAY,gBAAgB,oBAAoB;AAAA,IAClD;AAAA,EACF;AACF;AAEA,eAAe,WAA0B;AACvC,QAAM,eAAe,iBAAiB;AACtC,QAAM,WAAW,MAAM,kBAAkB;AAAA,IACvC,aAAa;AAAA,EACf,CAAC;AAED,QAAM,OAAO,WAAW,QAAQ;AAChC,OAAK;AAAA,IACH,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAiB,aAAa;AAAA,QAC9B,SAAS,aAAa;AAAA;AAAA,IACxB;AAAA,EACF;AACF;AAEA,KAAK,SAAS,EAAE,MAAM,CAAC,UAAmB;AACxC,QAAM,UAAU,iBAAiB,QAC7B,MAAM,UACN,OAAO,KAAK;AAEhB,UAAQ,MAAM,oCAAoC,OAAO,EAAE;AAC3D,UAAQ,WAAW;AACrB,CAAC;",
|
|
6
|
+
"names": ["useKeyboard", "useCallback", "useState", "nextCursor", "jsx", "jsxs", "isRecord", "preventDefault", "useState", "useCallback", "useKeyboard", "jsx"]
|
|
7
7
|
}
|