@navios/commander-tui 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/{src/__tests__/mocks/scm-mock.ts → dist/base/src/__tests__/mocks/scm-mock.d.ts} +3 -1
- package/dist/base/src/__tests__/mocks/scm-mock.d.ts.map +1 -0
- package/dist/base/src/__tests__/setup.d.ts +2 -0
- package/dist/base/src/__tests__/setup.d.ts.map +1 -0
- package/dist/base/src/__tests__/utils/factories.d.ts +67 -0
- package/dist/base/src/__tests__/utils/factories.d.ts.map +1 -0
- package/dist/base/src/__tests__/utils/render-utils.d.ts +21 -0
- package/dist/base/src/__tests__/utils/render-utils.d.ts.map +1 -0
- package/dist/base/src/__tests__/utils/test-container.d.ts +20 -0
- package/dist/base/src/__tests__/utils/test-container.d.ts.map +1 -0
- package/dist/base/src/adapters/interface.d.ts +9 -2
- package/dist/base/src/adapters/interface.d.ts.map +1 -1
- package/dist/base/src/overrides/missing-adapter.override.d.ts +10 -0
- package/dist/base/src/overrides/missing-adapter.override.d.ts.map +1 -1
- package/dist/base/src/schemas/logger-options.d.ts +1 -1
- package/dist/base/src/services/index.d.ts +1 -0
- package/dist/base/src/services/index.d.ts.map +1 -1
- package/dist/base/src/services/logger.d.ts.map +1 -1
- package/dist/base/src/services/readline_prompt.d.ts +27 -0
- package/dist/base/src/services/readline_prompt.d.ts.map +1 -0
- package/dist/base/src/services/screen.d.ts +14 -8
- package/dist/base/src/services/screen.d.ts.map +1 -1
- package/dist/base/src/services/screen_manager.d.ts +62 -12
- package/dist/base/src/services/screen_manager.d.ts.map +1 -1
- package/dist/base/src/types/events.types.d.ts +40 -0
- package/dist/base/src/types/events.types.d.ts.map +1 -0
- package/dist/base/src/types/index.d.ts +1 -0
- package/dist/base/src/types/index.d.ts.map +1 -1
- package/dist/base/src/types/screen.types.d.ts +28 -0
- package/dist/base/src/types/screen.types.d.ts.map +1 -1
- package/dist/base/src/utils/colors/helpers.d.ts +0 -16
- package/dist/base/src/utils/colors/helpers.d.ts.map +1 -1
- package/dist/base/src/utils/index.d.ts +2 -0
- package/dist/base/src/utils/index.d.ts.map +1 -1
- package/dist/base/src/utils/prompt.d.ts +7 -0
- package/dist/base/src/utils/prompt.d.ts.map +1 -0
- package/dist/base/src/utils/runtime.d.ts +10 -0
- package/dist/base/src/utils/runtime.d.ts.map +1 -0
- package/dist/base/src/utils/stdout-printer.d.ts +5 -0
- package/dist/base/src/utils/stdout-printer.d.ts.map +1 -1
- package/dist/base/tsconfig.base.tsbuildinfo +1 -1
- package/dist/base/tsconfig.tsbuildinfo +1 -0
- package/dist/ink/src/adapters/ink/components/file/file_log.d.ts +28 -0
- package/dist/ink/src/adapters/ink/components/file/file_log.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/file/index.d.ts +2 -0
- package/dist/ink/src/adapters/ink/components/file/index.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/filter/filter_bar.d.ts +7 -0
- package/dist/ink/src/adapters/ink/components/filter/filter_bar.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/filter/index.d.ts +2 -0
- package/dist/ink/src/adapters/ink/components/filter/index.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/help/help_overlay.d.ts +6 -0
- package/dist/ink/src/adapters/ink/components/help/help_overlay.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/help/index.d.ts +2 -0
- package/dist/ink/src/adapters/ink/components/help/index.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/index.d.ts +9 -0
- package/dist/ink/src/adapters/ink/components/index.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/log/index.d.ts +2 -0
- package/dist/ink/src/adapters/ink/components/log/index.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/log/log_message.d.ts +15 -0
- package/dist/ink/src/adapters/ink/components/log/log_message.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/prompt/index.d.ts +2 -0
- package/dist/ink/src/adapters/ink/components/prompt/index.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/prompt/prompt_renderer.d.ts +6 -0
- package/dist/ink/src/adapters/ink/components/prompt/prompt_renderer.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/screen/group_renderer.d.ts +14 -0
- package/dist/ink/src/adapters/ink/components/screen/group_renderer.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/screen/index.d.ts +7 -0
- package/dist/ink/src/adapters/ink/components/screen/index.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/screen/loading_message.d.ts +6 -0
- package/dist/ink/src/adapters/ink/components/screen/loading_message.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/screen/message_renderer.d.ts +6 -0
- package/dist/ink/src/adapters/ink/components/screen/message_renderer.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/screen/progress_message.d.ts +6 -0
- package/dist/ink/src/adapters/ink/components/screen/progress_message.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/screen/screen_bridge.d.ts +14 -0
- package/dist/ink/src/adapters/ink/components/screen/screen_bridge.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/screen/table_message.d.ts +6 -0
- package/dist/ink/src/adapters/ink/components/screen/table_message.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/screen_manager_bridge.d.ts +8 -0
- package/dist/ink/src/adapters/ink/components/screen_manager_bridge.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/sidebar/index.d.ts +4 -0
- package/dist/ink/src/adapters/ink/components/sidebar/index.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/sidebar/sidebar.d.ts +11 -0
- package/dist/ink/src/adapters/ink/components/sidebar/sidebar.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/sidebar/sidebar_item.d.ts +9 -0
- package/dist/ink/src/adapters/ink/components/sidebar/sidebar_item.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/components/sidebar/sidebar_separator.d.ts +2 -0
- package/dist/ink/src/adapters/ink/components/sidebar/sidebar_separator.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/context/index.d.ts +2 -0
- package/dist/ink/src/adapters/ink/context/index.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/context/logger_context.d.ts +33 -0
- package/dist/ink/src/adapters/ink/context/logger_context.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/hooks/index.d.ts +2 -0
- package/dist/ink/src/adapters/ink/hooks/index.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/hooks/use_theme.d.ts +7 -0
- package/dist/ink/src/adapters/ink/hooks/use_theme.d.ts.map +1 -0
- package/dist/ink/src/adapters/ink/index.d.ts +18 -0
- package/dist/ink/src/adapters/ink/index.d.ts.map +1 -0
- package/dist/ink/src/adapters/react-shared/hooks/index.d.ts +4 -0
- package/dist/ink/src/adapters/react-shared/hooks/index.d.ts.map +1 -0
- package/dist/ink/src/adapters/react-shared/hooks/use_filter_state.d.ts +18 -0
- package/dist/ink/src/adapters/react-shared/hooks/use_filter_state.d.ts.map +1 -0
- package/dist/ink/src/adapters/react-shared/hooks/use_keyboard_manager.d.ts +26 -0
- package/dist/ink/src/adapters/react-shared/hooks/use_keyboard_manager.d.ts.map +1 -0
- package/dist/ink/src/adapters/react-shared/hooks/use_manager_subscription.d.ts +7 -0
- package/dist/ink/src/adapters/react-shared/hooks/use_manager_subscription.d.ts.map +1 -0
- package/dist/ink/src/adapters/react-shared/index.d.ts +2 -0
- package/dist/ink/src/adapters/react-shared/index.d.ts.map +1 -0
- package/dist/ink/tsconfig.ink.tsbuildinfo +1 -0
- package/dist/react/src/adapters/react-shared/hooks/index.d.ts +4 -0
- package/dist/react/src/adapters/react-shared/hooks/index.d.ts.map +1 -0
- package/dist/react/src/adapters/react-shared/hooks/use_filter_state.d.ts +18 -0
- package/dist/react/src/adapters/react-shared/hooks/use_filter_state.d.ts.map +1 -0
- package/dist/react/src/adapters/react-shared/hooks/use_keyboard_manager.d.ts +26 -0
- package/dist/react/src/adapters/react-shared/hooks/use_keyboard_manager.d.ts.map +1 -0
- package/dist/react/src/adapters/react-shared/hooks/use_manager_subscription.d.ts +7 -0
- package/dist/react/src/adapters/react-shared/hooks/use_manager_subscription.d.ts.map +1 -0
- package/dist/react/src/adapters/react-shared/index.d.ts +2 -0
- package/dist/react/src/adapters/react-shared/index.d.ts.map +1 -0
- package/dist/react/tsconfig.react.tsbuildinfo +1 -1
- package/dist/solid/tsconfig.solid.tsbuildinfo +1 -1
- package/lib/index.cjs +2177 -178
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +942 -78
- package/lib/index.d.cts.map +1 -0
- package/lib/index.d.mts +902 -38
- package/lib/index.d.mts.map +1 -0
- package/lib/index.mjs +2098 -135
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -31
- package/src/__tests__/services/logger.spec.ts +32 -0
- package/src/__tests__/services/screen.spec.ts +106 -95
- package/src/__tests__/utils/factories.ts +2 -0
- package/src/adapters/interface.ts +10 -2
- package/src/overrides/missing-adapter.override.ts +16 -6
- package/src/services/index.ts +1 -0
- package/src/services/logger.ts +7 -1
- package/src/services/readline_prompt.ts +194 -0
- package/src/services/screen.ts +106 -54
- package/src/services/screen_manager.ts +282 -74
- package/src/types/events.types.ts +84 -0
- package/src/types/index.ts +3 -0
- package/src/types/screen.types.ts +34 -0
- package/src/utils/colors/helpers.ts +0 -25
- package/src/utils/index.ts +6 -0
- package/src/utils/prompt.ts +18 -0
- package/src/utils/runtime.ts +14 -0
- package/src/utils/stdout-printer.ts +16 -5
- package/tsconfig.base.json +1 -17
- package/tsconfig.json +1 -6
- package/tsdown.config.mts +13 -70
- package/lib/adapters/react/index.cjs +0 -1768
- package/lib/adapters/react/index.cjs.map +0 -1
- package/lib/adapters/react/index.d.cts +0 -80
- package/lib/adapters/react/index.d.mts +0 -80
- package/lib/adapters/react/index.mjs +0 -1760
- package/lib/adapters/react/index.mjs.map +0 -1
- package/lib/adapters/solid/index.cjs +0 -3855
- package/lib/adapters/solid/index.cjs.map +0 -1
- package/lib/adapters/solid/index.d.cts +0 -74
- package/lib/adapters/solid/index.d.mts +0 -74
- package/lib/adapters/solid/index.mjs +0 -3847
- package/lib/adapters/solid/index.mjs.map +0 -1
- package/lib/filter_engine-DXqu9Vaq.cjs +0 -1836
- package/lib/filter_engine-DXqu9Vaq.cjs.map +0 -1
- package/lib/filter_engine-DmqhEhpA.mjs +0 -1609
- package/lib/filter_engine-DmqhEhpA.mjs.map +0 -1
- package/lib/interface-CTHQ08aY.d.mts +0 -699
- package/lib/interface-DQEIz9Mb.d.cts +0 -699
- package/src/__tests__/components/__snapshots__/filter_bar.spec.tsx.snap +0 -2293
- package/src/__tests__/components/__snapshots__/loading_message.spec.tsx.snap +0 -1414
- package/src/__tests__/components/__snapshots__/log_message.spec.tsx.snap +0 -3245
- package/src/__tests__/components/__snapshots__/progress_message.spec.tsx.snap +0 -1783
- package/src/__tests__/components/__snapshots__/prompt_renderer.spec.tsx.snap +0 -3203
- package/src/__tests__/components/__snapshots__/sidebar.spec.tsx.snap +0 -2857
- package/src/__tests__/components/filter_bar.spec.tsx +0 -190
- package/src/__tests__/components/loading_message.spec.tsx +0 -110
- package/src/__tests__/components/log_message.spec.tsx +0 -166
- package/src/__tests__/components/progress_message.spec.tsx +0 -147
- package/src/__tests__/components/prompt_renderer.spec.tsx +0 -274
- package/src/__tests__/components/sidebar.spec.tsx +0 -322
- package/src/__tests__/utils/render-utils.tsx +0 -39
- package/src/adapters/react/components/file/file_log.tsx +0 -241
- package/src/adapters/react/components/file/index.ts +0 -1
- package/src/adapters/react/components/filter/filter_bar.tsx +0 -79
- package/src/adapters/react/components/filter/index.ts +0 -1
- package/src/adapters/react/components/help/help_overlay.tsx +0 -100
- package/src/adapters/react/components/help/index.ts +0 -1
- package/src/adapters/react/components/log/index.ts +0 -1
- package/src/adapters/react/components/log/log_message.tsx +0 -102
- package/src/adapters/react/components/prompt/index.ts +0 -2
- package/src/adapters/react/components/prompt/prompt_renderer.tsx +0 -346
- package/src/adapters/react/components/screen/group_renderer.tsx +0 -64
- package/src/adapters/react/components/screen/index.ts +0 -6
- package/src/adapters/react/components/screen/loading_message.tsx +0 -43
- package/src/adapters/react/components/screen/message_renderer.tsx +0 -108
- package/src/adapters/react/components/screen/progress_message.tsx +0 -60
- package/src/adapters/react/components/screen/screen_bridge.tsx +0 -149
- package/src/adapters/react/components/screen/table_message.tsx +0 -57
- package/src/adapters/react/components/screen_manager_bridge.tsx +0 -245
- package/src/adapters/react/components/sidebar/index.ts +0 -3
- package/src/adapters/react/components/sidebar/sidebar.tsx +0 -102
- package/src/adapters/react/components/sidebar/sidebar_item.tsx +0 -50
- package/src/adapters/react/components/sidebar/sidebar_separator.tsx +0 -13
- package/src/adapters/react/context/index.ts +0 -1
- package/src/adapters/react/context/logger_context.tsx +0 -109
- package/src/adapters/react/hooks/index.ts +0 -1
- package/src/adapters/react/hooks/use_theme.ts +0 -12
- package/src/adapters/react/index.ts +0 -39
- package/src/adapters/solid/components/file/file_log.tsx +0 -221
- package/src/adapters/solid/components/file/index.ts +0 -1
- package/src/adapters/solid/components/filter/filter_bar.tsx +0 -84
- package/src/adapters/solid/components/filter/index.ts +0 -1
- package/src/adapters/solid/components/help/help_overlay.tsx +0 -106
- package/src/adapters/solid/components/help/index.ts +0 -1
- package/src/adapters/solid/components/log/index.ts +0 -1
- package/src/adapters/solid/components/log/log_message.tsx +0 -92
- package/src/adapters/solid/components/prompt/index.ts +0 -2
- package/src/adapters/solid/components/prompt/prompt_renderer.tsx +0 -350
- package/src/adapters/solid/components/screen/group_renderer.tsx +0 -61
- package/src/adapters/solid/components/screen/index.ts +0 -6
- package/src/adapters/solid/components/screen/loading_message.tsx +0 -39
- package/src/adapters/solid/components/screen/message_renderer.tsx +0 -122
- package/src/adapters/solid/components/screen/progress_message.tsx +0 -61
- package/src/adapters/solid/components/screen/screen_bridge.tsx +0 -155
- package/src/adapters/solid/components/screen/table_message.tsx +0 -58
- package/src/adapters/solid/components/screen_manager_bridge.tsx +0 -243
- package/src/adapters/solid/components/sidebar/index.ts +0 -3
- package/src/adapters/solid/components/sidebar/sidebar.tsx +0 -108
- package/src/adapters/solid/components/sidebar/sidebar_item.tsx +0 -55
- package/src/adapters/solid/components/sidebar/sidebar_separator.tsx +0 -13
- package/src/adapters/solid/context/index.ts +0 -2
- package/src/adapters/solid/context/logger_context.tsx +0 -95
- package/src/adapters/solid/hooks/index.ts +0 -1
- package/src/adapters/solid/hooks/use_theme.ts +0 -12
- package/src/adapters/solid/index.tsx +0 -43
- package/src/adapters/solid/jsx.d.ts +0 -98
- package/tsconfig.react.json +0 -16
- package/tsconfig.solid.json +0 -16
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["SyntaxStyle","createContext","useContext","useMemo","darkTheme","resolveTheme","LoggerContext","LoggerProvider","children","syntaxStyle","customSyntaxStyle","treeSitterClient","theme","themeProp","levelColors","customLevelColors","create","logLevels","value","Provider","useLoggerContext","context","undefined","useLoggerContext","useTheme","theme","TextAttributes","useTheme","ALL_LOG_LEVELS","LEVEL_LABELS","verbose","debug","log","warn","error","fatal","FilterBar","filter","levelCounts","theme","isSearchFocused","focusedField","box","flexDirection","backgroundColor","background","borderColor","border","paddingLeft","paddingRight","gap","text","fg","colors","primary","textDim","searchQuery","inputText","inputPlaceholder","cursor","attributes","BLINK","map","level","index","isEnabled","enabledLevels","has","count","levelColor","logLevels","isLevelsFocused","inactiveLevel","BOLD","undefined","TextAttributes","useTheme","formatKeyBinding","CATEGORY_ORDER","CATEGORY_LABELS","general","navigation","screen","filter","prompt","groupByCategory","bindings","grouped","binding","description","category","push","HelpOverlay","theme","box","position","top","left","right","bottom","backgroundColor","help","background","borderColor","border","flexDirection","paddingLeft","paddingRight","paddingTop","paddingBottom","marginBottom","text","fg","title","attributes","BOLD","scrollbox","scrollY","flexGrow","gap","map","categoryBindings","length","index","key","width","marginTop","separator","line","hint","TextAttributes","useTheme","PromptRenderer","prompt","theme","timeoutRemaining","getTimeoutRemaining","type","ChoicePromptRenderer","colors","ConfirmPromptRenderer","InputPromptRenderer","MultiChoicePromptRenderer","timeout","timeoutStarted","elapsed","Date","now","remaining","Math","max","ceil","TimeoutIndicator","seconds","text","fg","optionTextDim","attributes","DIM","box","flexDirection","borderColor","focusBorder","border","paddingLeft","paddingRight","gap","question","BOLD","choices","map","choice","index","isSelected","selectedIndex","showInput","input","inputMode","optionSelected","optionText","undefined","label","marginLeft","inputText","inputValue","inputCursor","BLINK","value","confirmSelected","selectedValue","cancelSelected","backgroundColor","buttonSelectedBackground","confirmButton","confirmText","cancelButton","cancelText","hasValue","length","inputBorder","inputPlaceholder","placeholder","selectedCount","selectedIndices","size","canSubmit","minSelect","maxSelect","isFocused","focusedIndex","isChecked","has","useMemo","useLoggerContext","ERROR_HIGHLIGHT_COLORS","HEADER_COLORS","resolveFiletype","FileLog","props","syntaxStyle","treeSitterClient","filetype","filePath","showHeader","showLineNumbers","box","flexDirection","marginBottom","backgroundColor","headerBackgroundColor","background","paddingLeft","paddingRight","border","borderColor","text","fg","mode","FileLogFull","FileLogDiff","FileLogPartial","content","code","diff","view","startLine","errorLines","errorLineBackground","errorLineBorderColor","lines","split","errorLineSet","Set","errorBg","errorBorder","maxLineNum","length","lineNumWidth","Math","max","String","map","line","index","lineNumber","isError","has","undefined","width","gutterBackground","padStart","flexGrow","TextAttributes","useTheme","VARIANT_COLORS","LogMessage","level","variant","children","timestamp","label","trace","borderColor","customBorderColor","backgroundColor","customBackgroundColor","borderStyle","padding","margin","theme","levelColors","logLevels","border","background","textColor","text","colors","foreground","borderSides","formattedTimestamp","Date","toLocaleTimeString","box","flexDirection","paddingLeft","paddingRight","marginBottom","gap","fg","muted","attributes","BOLD","marginTop","useState","useEffect","useRef","LogMessage","SPINNER_FRAMES","LoadingMessage","message","frameIndex","setFrameIndex","intervalRef","status","current","setInterval","prev","length","clearInterval","level","variant","undefined","displayContent","resolvedContent","content","spinner","timestamp","useTheme","ProgressMessage","message","theme","percent","Math","round","current","total","barWidth","filled","empty","barFilled","repeat","barEmpty","borderColor","status","progress","complete","failed","border","backgroundColor","completeBackground","failedBackground","background","barColor","displayLabel","resolvedContent","label","box","flexDirection","paddingLeft","paddingRight","gap","text","fg","textDim","TextAttributes","TABLE_COLORS","TableMessage","message","colWidths","headers","map","h","i","headerLen","length","maxRowLen","rows","Math","max","r","pad","str","width","padEnd","headerRow","join","separator","w","repeat","dataRows","row","cell","box","flexDirection","border","borderColor","backgroundColor","background","paddingLeft","paddingRight","title","text","fg","attributes","BOLD","headerText","cellText","useTheme","FileLog","LogMessage","GroupMessageRenderer","LoadingMessage","ProgressMessage","TableMessage","MessageRenderer","message","theme","type","level","timestamp","variant","label","trace","content","box","flexDirection","border","borderColor","file","backgroundColor","background","mode","filePath","headerBackgroundColor","headerBackground","diff","view","startLine","errorLines","TextAttributes","useTheme","MessageRenderer","GroupRenderer","label","messages","theme","box","flexDirection","border","borderColor","group","backgroundColor","background","paddingLeft","marginBottom","text","fg","icon","headerText","attributes","BOLD","gap","map","msg","message","id","GroupMessageRenderer","isEnd","TextAttributes","useState","useEffect","useTheme","PromptRenderer","GroupRenderer","MessageRenderer","processMessagesIntoGroups","messages","result","i","length","msg","type","isEnd","groupLabel","label","groupMessages","innerMsg","push","message","ScreenBridge","screen","focused","filteredMessages","isFiltering","totalMessages","theme","forceUpdate","onChange","getMessages","activePrompt","getActivePrompt","processedMessages","filteredCount","total","showFilterStatus","box","flexDirection","flexGrow","backgroundColor","header","background","borderColor","sidebar","focusBorder","border","paddingLeft","paddingRight","justifyContent","text","fg","attributes","BOLD","getName","textDim","scrollbox","scrollY","stickyScroll","stickyStart","contentOptions","paddingTop","paddingBottom","gap","map","item","index","id","prompt","TextAttributes","useTheme","SidebarItem","screen","isSelected","isActive","focused","theme","status","getStatus","statusIndicator","statusIndicators","backgroundColor","undefined","sidebar","selectedBackground","box","flexDirection","paddingLeft","paddingRight","text","fg","focusBorder","color","icon","textDim","flexGrow","getName","getBadgeCount","badge","colors","foreground","attributes","BOLD","useTheme","SidebarSeparator","theme","box","flexDirection","paddingTop","flexGrow","text","fg","separator","line","TextAttributes","useTheme","SidebarItem","SidebarSeparator","Sidebar","screens","selectedIndex","activeScreenId","focused","width","title","theme","pendingScreens","otherScreens","forEach","screen","index","status","getStatus","push","originalIndex","hasPending","length","hasOther","showSeparator","box","flexDirection","borderColor","sidebar","focusBorder","border","backgroundColor","header","background","paddingLeft","paddingRight","text","fg","attributes","BOLD","scrollbox","scrollY","stickyScroll","flexGrow","contentOptions","map","isSelected","isActive","getId","useKeyboard","useState","useEffect","useCallback","useMemo","useSyncExternalStore","LoggerProvider","FilterEngine","KeyboardManager","createDefaultBindings","handlePrintableInput","ALL_LOG_LEVELS","createDefaultFilterState","hasActiveFilter","FilterBar","HelpOverlay","ScreenBridge","Sidebar","ScreenManagerBridge","manager","theme","forceUpdate","showHelp","setShowHelp","filter","setFilter","onChange","getActiveScreen","toggleHelp","prev","toggleFilter","isVisible","focusedField","closeFilter","filterAppendChar","char","searchQuery","filterDeleteChar","slice","filterToggleLevel","index","level","newLevels","Set","enabledLevels","has","delete","add","filterCycleField","keyboardManager","km","bindings","addBindings","handleKeyboard","key","screens","getScreens","activeScreen","context","hasSidebar","length","focusArea","hasPrompt","hasActivePrompt","inInputMode","isPromptInInputMode","isFilterActive","isHelpVisible","handleKey","activeScreenId","getId","bindOptions","getBindOptions","activeScreenVersion","updater","getVersion","levelCounts","verbose","debug","log","warn","error","fatal","countByLevel","getMessages","filteredMessages","filterMessages","isFiltering","box","flexDirection","flexGrow","selectedIndex","focused","width","sidebarWidth","title","sidebarTitle","screen","totalMessages","getBindingsForHelp","Injectable","createRoot","reactCreateRoot","createElement","Adapter","ScreenManagerBridge","token","ReactAdapter","renderer","root","render","element","unmount","renderToRoot","props"],"sources":["../../../src/adapters/react/context/logger_context.tsx","../../../src/adapters/react/hooks/use_theme.ts","../../../src/adapters/react/components/filter/filter_bar.tsx","../../../src/adapters/react/components/help/help_overlay.tsx","../../../src/adapters/react/components/prompt/prompt_renderer.tsx","../../../src/adapters/react/components/file/file_log.tsx","../../../src/adapters/react/components/log/log_message.tsx","../../../src/adapters/react/components/screen/loading_message.tsx","../../../src/adapters/react/components/screen/progress_message.tsx","../../../src/adapters/react/components/screen/table_message.tsx","../../../src/adapters/react/components/screen/message_renderer.tsx","../../../src/adapters/react/components/screen/group_renderer.tsx","../../../src/adapters/react/components/screen/screen_bridge.tsx","../../../src/adapters/react/components/sidebar/sidebar_item.tsx","../../../src/adapters/react/components/sidebar/sidebar_separator.tsx","../../../src/adapters/react/components/sidebar/sidebar.tsx","../../../src/adapters/react/components/screen_manager_bridge.tsx","../../../src/adapters/react/index.ts"],"sourcesContent":["import { SyntaxStyle, type TreeSitterClient } from '@opentui/core'\nimport { createContext, useContext, useMemo, type ReactNode } from 'react'\n\nimport { darkTheme, resolveTheme } from '../../../themes/index.ts'\n\nimport type { LoggerContextValue, LogLevelColorMap, Theme, ThemePreset } from '../../../types/index.ts'\n\nconst LoggerContext = createContext<LoggerContextValue | null>(null)\n\nexport interface LoggerProviderProps {\n children: ReactNode\n\n /** Custom syntax style for code highlighting */\n syntaxStyle?: SyntaxStyle\n\n /** Tree-sitter client for parsing */\n treeSitterClient?: TreeSitterClient\n\n /**\n * Theme configuration.\n * Can be a preset name (\"dark\", \"light\", \"high-contrast\") or a Theme object.\n * @default \"dark\"\n */\n theme?: Theme | ThemePreset\n\n /**\n * @deprecated Use `theme` instead. Custom log level colors.\n * If both `theme` and `levelColors` are provided, `levelColors` takes precedence.\n */\n levelColors?: Partial<LogLevelColorMap>\n}\n\n/**\n * LoggerProvider - Provides shared context for logger components.\n *\n * This context provides:\n * - Shared SyntaxStyle instance for consistent code highlighting\n * - Optional TreeSitterClient for advanced parsing\n * - Theme configuration for consistent styling\n * - Log level color configuration (for backwards compatibility)\n *\n * @example\n * // Using a preset theme\n * <LoggerProvider theme=\"dark\">\n * <ScreenManager screens={screens} activeScreenId={activeId}>\n * <Screen name=\"Logs\">\n * <LogMessage level=\"info\">Hello</LogMessage>\n * </Screen>\n * </ScreenManager>\n * </LoggerProvider>\n *\n * @example\n * // Using a custom theme\n * <LoggerProvider theme={myCustomTheme}>\n * ...\n * </LoggerProvider>\n */\nexport function LoggerProvider({\n children,\n syntaxStyle: customSyntaxStyle,\n treeSitterClient,\n theme: themeProp = 'dark',\n levelColors: customLevelColors,\n}: LoggerProviderProps) {\n // Create or use provided SyntaxStyle\n const syntaxStyle = useMemo(() => customSyntaxStyle ?? SyntaxStyle.create(), [customSyntaxStyle])\n\n // Resolve theme (could be a preset name or a theme object)\n const theme = useMemo(() => resolveTheme(themeProp), [themeProp])\n\n // Derive levelColors from theme, allowing custom overrides for backwards compatibility\n const levelColors = useMemo(\n () => ({\n ...theme.logLevels,\n ...customLevelColors,\n }),\n [theme.logLevels, customLevelColors],\n )\n\n const value: LoggerContextValue = useMemo(\n () => ({\n syntaxStyle,\n treeSitterClient,\n levelColors,\n theme,\n }),\n [syntaxStyle, treeSitterClient, levelColors, theme],\n )\n\n return <LoggerContext.Provider value={value}>{children}</LoggerContext.Provider>\n}\n\n/**\n * Hook to access logger context.\n * Returns default values if used outside LoggerProvider.\n */\nexport function useLoggerContext(): LoggerContextValue {\n const context = useContext(LoggerContext)\n if (!context) {\n // Return defaults if not in a provider (allows standalone usage)\n return {\n syntaxStyle: undefined,\n treeSitterClient: undefined,\n levelColors: darkTheme.logLevels,\n theme: darkTheme,\n }\n }\n return context\n}\n","import { useLoggerContext } from '../context/index.ts'\n\nimport type { Theme } from '../../../types/index.ts'\n\n/**\n * Hook to access the current theme.\n * Returns the theme from LoggerContext.\n */\nexport function useTheme(): Theme {\n const { theme } = useLoggerContext()\n return theme\n}\n","import { TextAttributes } from '@opentui/core'\n\nimport type { LogLevel } from '@navios/core'\n\nimport { useTheme } from '../../hooks/index.ts'\nimport { ALL_LOG_LEVELS } from '../../../../types/index.ts'\n\nimport type { FilterState, LevelCounts } from '../../../../types/index.ts'\n\nexport interface FilterBarProps {\n filter: FilterState\n levelCounts: LevelCounts\n}\n\nconst LEVEL_LABELS: Record<LogLevel, string> = {\n verbose: 'V',\n debug: 'D',\n log: 'L',\n warn: 'W',\n error: 'E',\n fatal: 'F',\n}\n\nexport function FilterBar({ filter, levelCounts }: FilterBarProps) {\n const theme = useTheme()\n const isSearchFocused = filter.focusedField === 'search'\n\n return (\n <box\n flexDirection=\"column\"\n backgroundColor={theme.filter.background}\n borderColor={theme.filter.border}\n border={['bottom']}\n paddingLeft={1}\n paddingRight={1}\n >\n {/* Search input row */}\n <box flexDirection=\"row\" gap={1}>\n <text fg={isSearchFocused ? theme.colors.primary : theme.filter.textDim}>/</text>\n <text fg={filter.searchQuery ? theme.filter.inputText : theme.filter.inputPlaceholder}>\n {filter.searchQuery || 'Search logs...'}\n </text>\n {isSearchFocused && (\n <text fg={theme.filter.cursor} attributes={TextAttributes.BLINK}>\n _\n </text>\n )}\n </box>\n\n {/* Level filters row */}\n <box flexDirection=\"row\" gap={1}>\n <text fg={theme.filter.textDim}>Levels:</text>\n {ALL_LOG_LEVELS.map((level, index) => {\n const isEnabled = filter.enabledLevels.has(level)\n const count = levelCounts[level]\n const levelColor = theme.logLevels[level].border\n const isLevelsFocused = filter.focusedField === 'levels'\n\n return (\n <box key={level} flexDirection=\"row\">\n <text\n fg={isEnabled ? levelColor : theme.filter.inactiveLevel}\n attributes={isLevelsFocused ? TextAttributes.BOLD : undefined}\n >\n {index + 1}:{LEVEL_LABELS[level]}\n </text>\n {count > 0 && <text fg={theme.filter.textDim}>({count > 99 ? '99+' : count})</text>}\n </box>\n )\n })}\n </box>\n\n {/* Hints */}\n <box flexDirection=\"row\">\n <text fg={theme.filter.textDim}>Tab: switch fields | 1-7: toggle levels | Esc: close</text>\n </box>\n </box>\n )\n}\n","import { TextAttributes } from '@opentui/core'\n\nimport { useTheme } from '../../hooks/index.ts'\nimport { formatKeyBinding } from '../../../../keyboard/index.ts'\n\nimport type { KeyBinding, KeyBindingCategory } from '../../../../types/index.ts'\n\nexport interface HelpOverlayProps {\n bindings: KeyBinding[]\n}\n\nconst CATEGORY_ORDER: KeyBindingCategory[] = ['general', 'navigation', 'screen', 'filter', 'prompt']\n\nconst CATEGORY_LABELS: Record<KeyBindingCategory, string> = {\n general: 'General',\n navigation: 'Navigation',\n screen: 'Screen',\n filter: 'Filter',\n prompt: 'Prompts',\n}\n\nfunction groupByCategory(bindings: KeyBinding[]): Record<KeyBindingCategory, KeyBinding[]> {\n const grouped: Record<KeyBindingCategory, KeyBinding[]> = {\n general: [],\n navigation: [],\n screen: [],\n filter: [],\n prompt: [],\n }\n\n for (const binding of bindings) {\n if (binding.description) {\n grouped[binding.category].push(binding)\n }\n }\n\n return grouped\n}\n\nexport function HelpOverlay({ bindings }: HelpOverlayProps) {\n const theme = useTheme()\n const grouped = groupByCategory(bindings)\n\n return (\n <box\n position=\"absolute\"\n top={1}\n left={2}\n right={2}\n bottom={1}\n backgroundColor={theme.help.background}\n borderColor={theme.help.border}\n border={['top', 'bottom', 'left', 'right']}\n flexDirection=\"column\"\n paddingLeft={2}\n paddingRight={2}\n paddingTop={1}\n paddingBottom={1}\n >\n {/* Header */}\n <box marginBottom={1}>\n <text fg={theme.help.title} attributes={TextAttributes.BOLD}>\n Keyboard Shortcuts\n </text>\n </box>\n\n {/* Categories */}\n <scrollbox scrollY flexGrow={1}>\n <box flexDirection=\"column\" gap={1}>\n {CATEGORY_ORDER.map((category) => {\n const categoryBindings = grouped[category]\n if (categoryBindings.length === 0) return null\n\n return (\n <box key={category} flexDirection=\"column\">\n <text fg={theme.help.category} attributes={TextAttributes.BOLD}>\n {CATEGORY_LABELS[category]}\n </text>\n\n {categoryBindings.map((binding, index) => (\n <box key={`${binding.key}-${index}`} flexDirection=\"row\" paddingLeft={2}>\n <text fg={theme.help.key} width={14}>\n {formatKeyBinding(binding)}\n </text>\n <text fg={theme.help.description}>{binding.description}</text>\n </box>\n ))}\n </box>\n )\n })}\n </box>\n </scrollbox>\n\n {/* Footer */}\n <box marginTop={1} borderColor={theme.separator.line} border={['top']} paddingTop={1}>\n <text fg={theme.help.hint}>Press ? or Esc to close</text>\n </box>\n </box>\n )\n}\n","import { TextAttributes } from '@opentui/core'\n\nimport { useTheme } from '../../hooks/index.ts'\n\nimport type {\n PromptData,\n ChoicePromptData,\n ConfirmPromptData,\n InputPromptData,\n MultiChoicePromptData,\n PromptTheme,\n} from '../../../../types/index.ts'\n\nexport interface PromptRendererProps {\n prompt: PromptData\n}\n\nexport function PromptRenderer({ prompt }: PromptRendererProps) {\n const theme = useTheme()\n // Calculate timeout remaining if applicable\n const timeoutRemaining = getTimeoutRemaining(prompt)\n\n switch (prompt.type) {\n case 'choice':\n return (\n <ChoicePromptRenderer\n prompt={prompt}\n timeoutRemaining={timeoutRemaining}\n colors={theme.prompt}\n />\n )\n case 'confirm':\n return (\n <ConfirmPromptRenderer\n prompt={prompt}\n timeoutRemaining={timeoutRemaining}\n colors={theme.prompt}\n />\n )\n case 'input':\n return (\n <InputPromptRenderer\n prompt={prompt}\n timeoutRemaining={timeoutRemaining}\n colors={theme.prompt}\n />\n )\n case 'multiChoice':\n return (\n <MultiChoicePromptRenderer\n prompt={prompt}\n timeoutRemaining={timeoutRemaining}\n colors={theme.prompt}\n />\n )\n default:\n return null\n }\n}\n\nfunction getTimeoutRemaining(prompt: PromptData): number | null {\n if (!prompt.timeout || !prompt.timeoutStarted) return null\n const elapsed = Date.now() - prompt.timeoutStarted\n const remaining = Math.max(0, prompt.timeout - elapsed)\n return Math.ceil(remaining / 1000)\n}\n\nfunction TimeoutIndicator({ seconds, colors }: { seconds: number | null; colors: PromptTheme }) {\n if (seconds === null) return null\n return (\n <text fg={colors.optionTextDim} attributes={TextAttributes.DIM}>\n {' '}\n (auto-select in {seconds}s)\n </text>\n )\n}\n\ninterface ChoicePromptRendererProps {\n prompt: ChoicePromptData\n timeoutRemaining: number | null\n colors: PromptTheme\n}\n\nfunction ChoicePromptRenderer({ prompt, timeoutRemaining, colors }: ChoicePromptRendererProps) {\n return (\n <box\n flexDirection=\"column\"\n borderColor={colors.focusBorder}\n border={['left']}\n paddingLeft={1}\n paddingRight={1}\n gap={1}\n >\n {/* Question */}\n <box flexDirection=\"row\">\n <text fg={colors.question} attributes={TextAttributes.BOLD}>\n ? {prompt.question}\n </text>\n <TimeoutIndicator seconds={timeoutRemaining} colors={colors} />\n </box>\n\n {/* Choices */}\n <box flexDirection=\"column\">\n {prompt.choices.map((choice, index) => {\n const isSelected = index === prompt.selectedIndex\n const showInput = isSelected && choice.input && prompt.inputMode\n\n return (\n <box key={choice.value} flexDirection=\"row\">\n {/* Selection indicator */}\n <text fg={isSelected ? colors.optionSelected : 'transparent'}>{'>'} </text>\n\n {/* Choice label */}\n <text\n fg={isSelected ? colors.optionText : colors.optionTextDim}\n attributes={isSelected ? TextAttributes.BOLD : undefined}\n >\n {choice.label}\n </text>\n\n {/* Input field (if applicable) */}\n {showInput && (\n <box flexDirection=\"row\" marginLeft={1}>\n <text fg={colors.inputText}>: </text>\n <text fg={colors.inputText}>{prompt.inputValue}</text>\n <text fg={colors.inputCursor} attributes={TextAttributes.BLINK}>\n _\n </text>\n </box>\n )}\n\n {/* Show hint for input option when selected but not in input mode */}\n {isSelected && choice.input && !prompt.inputMode && (\n <text fg={colors.optionTextDim}> (press Enter to type)</text>\n )}\n </box>\n )\n })}\n </box>\n\n {/* Instructions */}\n {prompt.inputMode ? (\n <text fg={colors.optionTextDim} attributes={TextAttributes.DIM}>\n Type your answer, Enter to submit, Esc to cancel\n </text>\n ) : (\n <text fg={colors.optionTextDim} attributes={TextAttributes.DIM}>\n ↑/↓ to navigate, Enter to select\n </text>\n )}\n </box>\n )\n}\n\ninterface ConfirmPromptRendererProps {\n prompt: ConfirmPromptData\n timeoutRemaining: number | null\n colors: PromptTheme\n}\n\nfunction ConfirmPromptRenderer({ prompt, timeoutRemaining, colors }: ConfirmPromptRendererProps) {\n const confirmSelected = prompt.selectedValue === true\n const cancelSelected = prompt.selectedValue === false\n\n return (\n <box\n flexDirection=\"column\"\n borderColor={colors.focusBorder}\n border={['left']}\n paddingLeft={1}\n paddingRight={1}\n gap={1}\n >\n {/* Question */}\n <box flexDirection=\"row\">\n <text fg={colors.question} attributes={TextAttributes.BOLD}>\n ? {prompt.question}\n </text>\n <TimeoutIndicator seconds={timeoutRemaining} colors={colors} />\n </box>\n\n {/* Buttons */}\n <box flexDirection=\"row\" gap={2}>\n {/* Confirm button */}\n <box\n backgroundColor={confirmSelected ? colors.buttonSelectedBackground : undefined}\n paddingLeft={1}\n paddingRight={1}\n >\n <text\n fg={confirmSelected ? colors.confirmButton : colors.optionTextDim}\n attributes={confirmSelected ? TextAttributes.BOLD : undefined}\n >\n {confirmSelected ? '>' : ' '} {prompt.confirmText}\n </text>\n </box>\n\n {/* Cancel button */}\n <box\n backgroundColor={cancelSelected ? colors.buttonSelectedBackground : undefined}\n paddingLeft={1}\n paddingRight={1}\n >\n <text\n fg={cancelSelected ? colors.cancelButton : colors.optionTextDim}\n attributes={cancelSelected ? TextAttributes.BOLD : undefined}\n >\n {cancelSelected ? '>' : ' '} {prompt.cancelText}\n </text>\n </box>\n </box>\n\n {/* Instructions */}\n <text fg={colors.optionTextDim} attributes={TextAttributes.DIM}>\n ←/→ to select, Enter to confirm\n </text>\n </box>\n )\n}\n\ninterface InputPromptRendererProps {\n prompt: InputPromptData\n timeoutRemaining: number | null\n colors: PromptTheme\n}\n\nfunction InputPromptRenderer({ prompt, timeoutRemaining, colors }: InputPromptRendererProps) {\n const hasValue = prompt.value.length > 0\n\n return (\n <box\n flexDirection=\"column\"\n borderColor={colors.focusBorder}\n border={['left']}\n paddingLeft={1}\n paddingRight={1}\n gap={1}\n >\n {/* Question */}\n <box flexDirection=\"row\">\n <text fg={colors.question} attributes={TextAttributes.BOLD}>\n ? {prompt.question}\n </text>\n <TimeoutIndicator seconds={timeoutRemaining} colors={colors} />\n </box>\n\n {/* Input field */}\n <box flexDirection=\"row\" borderColor={colors.inputBorder} border={['left']} paddingLeft={1}>\n <text fg={hasValue ? colors.inputText : colors.inputPlaceholder}>\n {hasValue ? prompt.value : prompt.placeholder}\n </text>\n <text fg={colors.inputCursor} attributes={TextAttributes.BLINK}>\n _\n </text>\n </box>\n\n {/* Instructions */}\n <text fg={colors.optionTextDim} attributes={TextAttributes.DIM}>\n Type your answer, Enter to submit\n </text>\n </box>\n )\n}\n\ninterface MultiChoicePromptRendererProps {\n prompt: MultiChoicePromptData\n timeoutRemaining: number | null\n colors: PromptTheme\n}\n\nfunction MultiChoicePromptRenderer({\n prompt,\n timeoutRemaining,\n colors,\n}: MultiChoicePromptRendererProps) {\n const selectedCount = prompt.selectedIndices.size\n const canSubmit = selectedCount >= prompt.minSelect\n\n return (\n <box\n flexDirection=\"column\"\n borderColor={colors.focusBorder}\n border={['left']}\n paddingLeft={1}\n paddingRight={1}\n gap={1}\n >\n {/* Question */}\n <box flexDirection=\"row\">\n <text fg={colors.question} attributes={TextAttributes.BOLD}>\n ? {prompt.question}\n </text>\n <text fg={colors.optionTextDim}>\n {' '}\n ({selectedCount}/{prompt.maxSelect} selected)\n </text>\n <TimeoutIndicator seconds={timeoutRemaining} colors={colors} />\n </box>\n\n {/* Choices */}\n <box flexDirection=\"column\">\n {prompt.choices.map((choice, index) => {\n const isFocused = index === prompt.focusedIndex\n const isChecked = prompt.selectedIndices.has(index)\n\n return (\n <box key={choice.value} flexDirection=\"row\">\n {/* Focus indicator */}\n <text fg={isFocused ? colors.optionSelected : 'transparent'}>{'>'} </text>\n\n {/* Checkbox */}\n <text fg={isChecked ? colors.optionSelected : colors.optionTextDim}>\n {isChecked ? '[✓]' : '[ ]'}{' '}\n </text>\n\n {/* Choice label */}\n <text\n fg={isFocused ? colors.optionText : colors.optionTextDim}\n attributes={isFocused ? TextAttributes.BOLD : undefined}\n >\n {choice.label}\n </text>\n </box>\n )\n })}\n </box>\n\n {/* Instructions */}\n <box flexDirection=\"column\">\n <text fg={colors.optionTextDim} attributes={TextAttributes.DIM}>\n ↑/↓ to navigate, Space to toggle\n </text>\n {canSubmit ? (\n <text fg={colors.optionTextDim} attributes={TextAttributes.DIM}>\n Enter to confirm\n </text>\n ) : (\n <text fg={colors.cancelButton} attributes={TextAttributes.DIM}>\n Select at least {prompt.minSelect} option\n {prompt.minSelect > 1 ? 's' : ''}\n </text>\n )}\n </box>\n </box>\n )\n}\n","import { useMemo } from 'react'\n\nimport { useLoggerContext } from '../../context/index.ts'\nimport { ERROR_HIGHLIGHT_COLORS, HEADER_COLORS, resolveFiletype } from '../../../../utils/index.ts'\n\nimport type {\n FileLogProps,\n FileLogFullProps,\n FileLogDiffProps,\n FileLogPartialProps,\n} from '../../../../types/index.ts'\n\n/**\n * FileLog - Displays file content, diffs, or partial files with error highlighting.\n *\n * Three modes:\n * 1. \"full\" - Display complete file with syntax highlighting\n * 2. \"diff\" - Display unified diff using <diff> component\n * 3. \"partial\" - Display file excerpt with optional error line highlighting\n *\n * @example Full file\n * <FileLog\n * mode=\"full\"\n * filePath=\"src/index.ts\"\n * content={fileContent}\n * />\n *\n * @example Diff\n * <FileLog\n * mode=\"diff\"\n * filePath=\"src/api.ts\"\n * diff={unifiedDiff}\n * view=\"unified\"\n * />\n *\n * @example Partial with error\n * <FileLog\n * mode=\"partial\"\n * filePath=\"src/utils.ts\"\n * content={excerpt}\n * startLine={42}\n * errorLines={[45, 46]}\n * />\n */\nexport function FileLog(props: FileLogProps) {\n const { syntaxStyle, treeSitterClient } = useLoggerContext()\n\n // Auto-detect filetype from path\n const filetype = props.filetype ?? resolveFiletype(props.filePath)\n const showHeader = props.showHeader ?? true\n const showLineNumbers = props.showLineNumbers ?? true\n\n return (\n <box flexDirection=\"column\" marginBottom={1}>\n {/* File header */}\n {showHeader && (\n <box\n backgroundColor={props.headerBackgroundColor ?? HEADER_COLORS.background}\n paddingLeft={1}\n paddingRight={1}\n border={['bottom']}\n borderColor={HEADER_COLORS.border}\n >\n <text fg={HEADER_COLORS.text}>{props.filePath}</text>\n </box>\n )}\n\n {/* Content based on mode */}\n {props.mode === 'full' && (\n <FileLogFull\n {...props}\n filetype={filetype}\n syntaxStyle={syntaxStyle}\n treeSitterClient={treeSitterClient}\n showLineNumbers={showLineNumbers}\n />\n )}\n\n {props.mode === 'diff' && (\n <FileLogDiff\n {...props}\n filetype={filetype}\n syntaxStyle={syntaxStyle}\n treeSitterClient={treeSitterClient}\n />\n )}\n\n {props.mode === 'partial' && (\n <FileLogPartial\n {...props}\n filetype={filetype}\n syntaxStyle={syntaxStyle}\n treeSitterClient={treeSitterClient}\n showLineNumbers={showLineNumbers}\n />\n )}\n </box>\n )\n}\n\ninterface FileLogInternalProps {\n filetype?: string\n syntaxStyle?: ReturnType<typeof useLoggerContext>['syntaxStyle']\n treeSitterClient?: ReturnType<typeof useLoggerContext>['treeSitterClient']\n}\n\n/**\n * Full file display with syntax highlighting.\n */\nfunction FileLogFull({\n content,\n filetype,\n syntaxStyle,\n treeSitterClient,\n}: FileLogFullProps & FileLogInternalProps) {\n if (!syntaxStyle) {\n // Fallback to plain text display if no syntax style available\n return (\n <box paddingLeft={1} paddingRight={1}>\n <text>{content}</text>\n </box>\n )\n }\n\n return (\n <code\n content={content}\n filetype={filetype}\n syntaxStyle={syntaxStyle}\n treeSitterClient={treeSitterClient}\n />\n )\n}\n\n/**\n * Diff display using the built-in <diff> component.\n */\nfunction FileLogDiff({\n diff,\n view = 'unified',\n filetype,\n syntaxStyle,\n treeSitterClient,\n}: FileLogDiffProps & FileLogInternalProps) {\n if (!syntaxStyle) {\n // Fallback to plain text display if no syntax style available\n return (\n <box paddingLeft={1} paddingRight={1}>\n <text>{diff}</text>\n </box>\n )\n }\n\n return (\n <diff\n diff={diff}\n view={view}\n filetype={filetype}\n syntaxStyle={syntaxStyle}\n treeSitterClient={treeSitterClient}\n />\n )\n}\n\n/**\n * Partial file display with error line highlighting.\n *\n * This component renders a file excerpt and highlights specific lines\n * as errors using box overlays with colored backgrounds.\n */\nfunction FileLogPartial({\n content,\n startLine,\n errorLines = [],\n errorLineBackground,\n errorLineBorderColor,\n filetype,\n syntaxStyle,\n treeSitterClient,\n showLineNumbers,\n}: FileLogPartialProps & FileLogInternalProps) {\n // Parse content into lines for error highlighting\n const lines = useMemo(() => content.split('\\n'), [content])\n\n // Calculate which lines are errors (relative to startLine)\n const errorLineSet = useMemo(() => new Set(errorLines), [errorLines])\n\n // Error colors\n const errorBg = errorLineBackground ?? ERROR_HIGHLIGHT_COLORS.background\n const errorBorder = errorLineBorderColor ?? ERROR_HIGHLIGHT_COLORS.border\n\n // Line number width based on max line number\n const maxLineNum = startLine + lines.length - 1\n const lineNumWidth = Math.max(4, String(maxLineNum).length + 1)\n\n return (\n <box flexDirection=\"column\">\n {lines.map((line, index) => {\n const lineNumber = startLine + index\n const isError = errorLineSet.has(lineNumber)\n\n return (\n <box\n key={lineNumber}\n flexDirection=\"row\"\n backgroundColor={isError ? errorBg : undefined}\n border={isError ? ['left'] : undefined}\n borderColor={isError ? errorBorder : undefined}\n >\n {/* Line number gutter */}\n {showLineNumbers && (\n <box\n width={lineNumWidth}\n backgroundColor={\n isError ? ERROR_HIGHLIGHT_COLORS.gutterBackground : HEADER_COLORS.background\n }\n paddingRight={1}\n >\n <text fg=\"#6B7280\">{String(lineNumber).padStart(lineNumWidth - 1)}</text>\n </box>\n )}\n\n {/* Code line */}\n <box flexGrow={1} paddingLeft={1}>\n {syntaxStyle ? (\n <code\n content={line}\n filetype={filetype}\n syntaxStyle={syntaxStyle}\n treeSitterClient={treeSitterClient}\n />\n ) : (\n <text>{line}</text>\n )}\n </box>\n </box>\n )\n })}\n </box>\n )\n}\n","import { TextAttributes } from '@opentui/core'\n\nimport { useTheme } from '../../hooks/index.ts'\nimport { VARIANT_COLORS } from '../../../../utils/index.ts'\n\nimport type { LogMessageProps } from '../../../../types/index.ts'\n\n/**\n * LogMessage - A chat-like styled log message with level-based coloring.\n *\n * Features:\n * - Left border with prominent color based on log level\n * - Subtle tinted background matching the log level\n * - Optional timestamp and label display\n * - Supports both simple text and complex React children\n * - Optional variant for semantic styling (e.g., 'success', 'trace')\n *\n * @example\n * <LogMessage level=\"error\">\n * Connection failed: timeout after 30s\n * </LogMessage>\n *\n * @example\n * <LogMessage level=\"log\" timestamp={new Date()} label=\"API\">\n * Request completed successfully\n * </LogMessage>\n *\n * @example\n * <LogMessage level=\"log\" variant=\"success\">\n * Operation completed successfully\n * </LogMessage>\n */\nexport function LogMessage({\n level,\n variant,\n children,\n timestamp,\n label,\n trace,\n borderColor: customBorderColor,\n backgroundColor: customBackgroundColor,\n borderStyle = 'thin',\n padding = 1,\n margin = 0,\n}: LogMessageProps) {\n const theme = useTheme()\n\n // Get colors: variant colors take precedence over level colors\n const levelColors = variant ? VARIANT_COLORS[variant] : theme.logLevels[level]\n\n // Resolve final colors (custom overrides level colors)\n const borderColor = customBorderColor ?? levelColors.border\n const backgroundColor = customBackgroundColor ?? levelColors.background\n\n // Text color: use level-specific text color if defined, otherwise use foreground\n const textColor = levelColors.text ?? theme.colors.foreground\n\n // Determine border sides based on style\n const borderSides: ('left' | 'top' | 'bottom')[] =\n borderStyle === 'thin' ? ['left'] : ['left', 'top', 'bottom']\n\n // Format timestamp if provided\n const formattedTimestamp = timestamp\n ? timestamp instanceof Date\n ? timestamp.toLocaleTimeString()\n : timestamp\n : null\n\n return (\n <box\n flexDirection=\"column\"\n border={borderSides}\n borderColor={borderColor}\n backgroundColor={backgroundColor}\n paddingLeft={padding}\n paddingRight={padding}\n marginBottom={margin}\n >\n {/* Header row with timestamp and label */}\n {(formattedTimestamp || label) && (\n <box flexDirection=\"row\" gap={1}>\n {formattedTimestamp && <text fg={theme.colors.muted}>{formattedTimestamp}</text>}\n {label && (\n <text fg={levelColors.border} attributes={TextAttributes.BOLD}>\n [{label}]\n </text>\n )}\n </box>\n )}\n\n {/* Message content */}\n <text fg={textColor}>{children}</text>\n\n {/* Stack trace (for trace level) */}\n {trace && (\n <box marginTop={1}>\n <text fg={theme.colors.muted}>{trace}</text>\n </box>\n )}\n </box>\n )\n}\n","import { useState, useEffect, useRef } from 'react'\n\nimport { LogMessage } from '../log/index.ts'\n\nimport type { LoadingMessageData, LogMessageVariant } from '../../../../types/index.ts'\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\nexport interface LoadingMessageProps {\n message: LoadingMessageData\n}\n\nexport function LoadingMessage({ message }: LoadingMessageProps) {\n const [frameIndex, setFrameIndex] = useState(0)\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n useEffect(() => {\n if (message.status === 'loading') {\n intervalRef.current = setInterval(() => {\n setFrameIndex((prev) => (prev + 1) % SPINNER_FRAMES.length)\n }, 80)\n }\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n }\n }, [message.status])\n\n // Map loading status to log level and variant for display\n const level = message.status === 'fail' ? 'error' : 'log'\n const variant: LogMessageVariant | undefined = message.status === 'success' ? 'success' : undefined\n\n const displayContent = message.resolvedContent ?? message.content\n const spinner = message.status === 'loading' ? SPINNER_FRAMES[frameIndex] + ' ' : ''\n\n return (\n <LogMessage level={level} variant={variant} timestamp={message.timestamp}>\n {spinner + displayContent}\n </LogMessage>\n )\n}\n","import { useTheme } from '../../hooks/index.ts'\n\nimport type { ProgressMessageData } from '../../../../types/index.ts'\n\nexport interface ProgressMessageProps {\n message: ProgressMessageData\n}\n\nexport function ProgressMessage({ message }: ProgressMessageProps) {\n const theme = useTheme()\n const percent = Math.round((message.current / message.total) * 100)\n const barWidth = 20\n const filled = Math.round((percent / 100) * barWidth)\n const empty = barWidth - filled\n\n const barFilled = '█'.repeat(filled)\n const barEmpty = '░'.repeat(empty)\n\n // Determine colors based on status\n const borderColor =\n message.status === 'complete'\n ? theme.progress.complete\n : message.status === 'failed'\n ? theme.progress.failed\n : theme.progress.border\n\n const backgroundColor =\n message.status === 'complete'\n ? theme.progress.completeBackground\n : message.status === 'failed'\n ? theme.progress.failedBackground\n : theme.progress.background\n\n const barColor =\n message.status === 'complete'\n ? theme.progress.complete\n : message.status === 'failed'\n ? theme.progress.failed\n : theme.progress.barFilled\n\n const displayLabel = message.resolvedContent ?? message.label\n\n return (\n <box\n flexDirection=\"column\"\n border={['left']}\n borderColor={borderColor}\n backgroundColor={backgroundColor}\n paddingLeft={1}\n paddingRight={1}\n >\n <box flexDirection=\"row\" gap={1}>\n <text fg={barColor}>[{barFilled}</text>\n <text fg={theme.progress.barEmpty}>{barEmpty}]</text>\n <text fg={theme.progress.textDim}>{percent}%</text>\n <text fg={theme.progress.text}>{displayLabel}</text>\n </box>\n </box>\n )\n}\n","import { TextAttributes } from '@opentui/core'\n\nimport { TABLE_COLORS } from '../../../../utils/index.ts'\n\nimport type { TableMessageData } from '../../../../types/index.ts'\n\nexport interface TableMessageProps {\n message: TableMessageData\n}\n\nexport function TableMessage({ message }: TableMessageProps) {\n // Calculate column widths\n const colWidths = message.headers.map((h, i) => {\n const headerLen = h.length\n const maxRowLen =\n message.rows.length > 0\n ? Math.max(...message.rows.map((r) => (r[i] ?? '').length))\n : 0\n return Math.max(headerLen, maxRowLen)\n })\n\n const pad = (str: string, width: number) => str.padEnd(width)\n\n const headerRow = message.headers.map((h, i) => pad(h, colWidths[i] ?? 0)).join(' │ ')\n\n const separator = colWidths.map((w) => '─'.repeat(w)).join('─┼─')\n\n const dataRows = message.rows.map((row) =>\n row.map((cell, i) => pad(cell, colWidths[i] ?? 0)).join(' │ '),\n )\n\n return (\n <box\n flexDirection=\"column\"\n border={['left']}\n borderColor={TABLE_COLORS.border}\n backgroundColor={TABLE_COLORS.background}\n paddingLeft={1}\n paddingRight={1}\n >\n {message.title && (\n <text fg={TABLE_COLORS.title} attributes={TextAttributes.BOLD}>\n {message.title}\n </text>\n )}\n <text fg={TABLE_COLORS.headerText} attributes={TextAttributes.BOLD}>\n {headerRow}\n </text>\n <text fg={TABLE_COLORS.separator}>{separator}</text>\n {dataRows.map((row, i) => (\n <text key={i} fg={TABLE_COLORS.cellText}>\n {row}\n </text>\n ))}\n </box>\n )\n}\n","import { useTheme } from '../../hooks/index.ts'\nimport { FileLog } from '../file/index.ts'\nimport { LogMessage } from '../log/index.ts'\n\nimport type {\n MessageData,\n LoadingMessageData,\n ProgressMessageData,\n GroupMessageData,\n TableMessageData,\n} from '../../../../types/index.ts'\n\nimport { GroupMessageRenderer } from './group_renderer.tsx'\nimport { LoadingMessage } from './loading_message.tsx'\nimport { ProgressMessage } from './progress_message.tsx'\nimport { TableMessage } from './table_message.tsx'\n\nexport interface MessageRendererProps {\n message: MessageData\n}\n\nexport function MessageRenderer({ message }: MessageRendererProps) {\n const theme = useTheme()\n\n switch (message.type) {\n case 'log':\n return (\n <LogMessage\n level={message.level}\n timestamp={message.timestamp}\n variant={message.variant}\n label={message.label}\n trace={message.trace}\n >\n {message.content}\n </LogMessage>\n )\n\n case 'file':\n return (\n <box\n flexDirection=\"column\"\n border={['left']}\n borderColor={theme.file.border}\n backgroundColor={theme.file.background}\n >\n <FileLog\n mode=\"full\"\n filePath={message.filePath}\n content={message.content}\n headerBackgroundColor={theme.file.headerBackground}\n />\n </box>\n )\n\n case 'diff':\n return (\n <box\n flexDirection=\"column\"\n border={['left']}\n borderColor={theme.file.border}\n backgroundColor={theme.file.background}\n >\n <FileLog\n mode=\"diff\"\n filePath={message.filePath}\n diff={message.diff}\n view={message.view}\n headerBackgroundColor={theme.file.headerBackground}\n />\n </box>\n )\n\n case 'fileError':\n return (\n <box\n flexDirection=\"column\"\n border={['left']}\n borderColor={theme.file.border}\n backgroundColor={theme.file.background}\n >\n <FileLog\n mode=\"partial\"\n filePath={message.filePath}\n content={message.content}\n startLine={message.startLine}\n errorLines={message.errorLines}\n headerBackgroundColor={theme.file.headerBackground}\n />\n </box>\n )\n\n case 'loading':\n return <LoadingMessage message={message as LoadingMessageData} />\n\n case 'progress':\n return <ProgressMessage message={message as ProgressMessageData} />\n\n case 'group':\n return <GroupMessageRenderer message={message as GroupMessageData} />\n\n case 'table':\n return <TableMessage message={message as TableMessageData} />\n\n default:\n return null\n }\n}\n","import { TextAttributes } from '@opentui/core'\n\nimport { useTheme } from '../../hooks/index.ts'\n\nimport type { MessageData, GroupMessageData } from '../../../../types/index.ts'\n\nimport { MessageRenderer } from './message_renderer.tsx'\n\nexport interface GroupRendererProps {\n label: string\n messages: MessageData[]\n}\n\nexport function GroupRenderer({ label, messages }: GroupRendererProps) {\n const theme = useTheme()\n\n return (\n <box\n flexDirection=\"column\"\n border={['left']}\n borderColor={theme.group.border}\n backgroundColor={theme.group.background}\n paddingLeft={1}\n >\n {/* Group header */}\n <box flexDirection=\"row\" marginBottom={1}>\n <text fg={theme.group.icon}>▼ </text>\n <text fg={theme.group.headerText} attributes={TextAttributes.BOLD}>\n {label}\n </text>\n </box>\n\n {/* Group content */}\n <box flexDirection=\"column\" gap={1}>\n {messages.map((msg) => (\n <MessageRenderer key={msg.id} message={msg} />\n ))}\n </box>\n </box>\n )\n}\n\nexport interface GroupMessageRendererProps {\n message: GroupMessageData\n}\n\n/**\n * Fallback renderer for group markers (when not processed at higher level)\n */\nexport function GroupMessageRenderer({ message }: GroupMessageRendererProps) {\n const theme = useTheme()\n\n if (message.isEnd) {\n return null\n }\n\n return (\n <box flexDirection=\"row\" borderColor={theme.group.border} border={['left']} paddingLeft={1}>\n <text fg={theme.group.headerText} attributes={TextAttributes.BOLD}>\n ▼ {message.label}\n </text>\n </box>\n )\n}\n","import { TextAttributes } from '@opentui/core'\nimport { useState, useEffect } from 'react'\n\nimport { useTheme } from '../../hooks/index.ts'\nimport { PromptRenderer } from '../prompt/index.ts'\n\nimport type { ScreenInstance } from '../../../../services/index.ts'\nimport type { MessageData } from '../../../../types/index.ts'\n\nimport { GroupRenderer } from './group_renderer.tsx'\nimport { MessageRenderer } from './message_renderer.tsx'\n\nexport interface ScreenBridgeProps {\n screen: ScreenInstance\n focused: boolean\n /** Pre-filtered messages (if filtering is active) */\n filteredMessages?: MessageData[]\n /** Whether any filter is currently active */\n isFiltering?: boolean\n /** Total message count (before filtering) */\n totalMessages?: number\n}\n\n// Helper to process messages and organize them into groups\ninterface ProcessedMessage {\n type: 'single' | 'group'\n message?: MessageData\n label?: string\n messages?: MessageData[]\n}\n\nfunction processMessagesIntoGroups(messages: MessageData[]): ProcessedMessage[] {\n const result: ProcessedMessage[] = []\n let i = 0\n\n while (i < messages.length) {\n const msg = messages[i]!\n\n if (msg.type === 'group' && !msg.isEnd) {\n // Start of a group - collect all messages until groupEnd\n const groupLabel = msg.label\n const groupMessages: MessageData[] = []\n i++ // Move past the group start\n\n while (i < messages.length) {\n const innerMsg = messages[i]!\n if (innerMsg.type === 'group' && innerMsg.isEnd) {\n i++ // Move past the group end\n break\n }\n groupMessages.push(innerMsg)\n i++\n }\n\n result.push({\n type: 'group',\n label: groupLabel,\n messages: groupMessages,\n })\n } else if (msg.type === 'group' && msg.isEnd) {\n // Stray group end - skip it\n i++\n } else {\n // Regular message\n result.push({ type: 'single', message: msg })\n i++\n }\n }\n\n return result\n}\n\nexport function ScreenBridge({\n screen,\n focused,\n filteredMessages,\n isFiltering,\n totalMessages,\n}: ScreenBridgeProps) {\n const theme = useTheme()\n const [, forceUpdate] = useState({})\n\n // Subscribe to screen changes\n useEffect(() => {\n return screen.onChange(() => forceUpdate({}))\n }, [screen])\n\n // Use filtered messages if provided, otherwise get from screen\n const messages = filteredMessages ?? screen.getMessages()\n const activePrompt = screen.getActivePrompt()\n const processedMessages = processMessagesIntoGroups(messages)\n\n // Calculate filter stats\n const filteredCount = messages.length\n const total = totalMessages ?? messages.length\n const showFilterStatus = isFiltering && filteredCount !== total\n\n return (\n <box flexDirection=\"column\" flexGrow={1}>\n {/* Screen header */}\n <box\n backgroundColor={theme.header.background}\n borderColor={focused ? theme.sidebar.focusBorder : theme.header.border}\n border={['bottom']}\n paddingLeft={1}\n paddingRight={1}\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n >\n <text fg={theme.header.text} attributes={TextAttributes.BOLD}>\n {screen.getName()}\n </text>\n {showFilterStatus && (\n <text fg={theme.sidebar.textDim}>\n {filteredCount}/{total} messages\n </text>\n )}\n </box>\n\n {/* Scrollable content area */}\n <scrollbox\n flexGrow={1}\n scrollY\n stickyScroll\n stickyStart=\"bottom\"\n contentOptions={{\n paddingLeft: 1,\n paddingRight: 1,\n paddingTop: 1,\n paddingBottom: 1,\n gap: 1,\n }}\n >\n {processedMessages.map((item, index) => {\n if (item.type === 'group') {\n return (\n <GroupRenderer key={`group-${index}`} label={item.label!} messages={item.messages!} />\n )\n } else {\n return <MessageRenderer key={item.message!.id} message={item.message!} />\n }\n })}\n\n {/* Render active prompt at the end of messages */}\n {activePrompt && <PromptRenderer prompt={activePrompt} />}\n </scrollbox>\n </box>\n )\n}\n","import { TextAttributes } from '@opentui/core'\n\nimport { useTheme } from '../../hooks/index.ts'\n\nimport type { ScreenInstance } from '../../../../services/index.ts'\n\nexport interface SidebarItemProps {\n screen: ScreenInstance\n isSelected: boolean\n isActive: boolean\n focused: boolean\n}\n\nexport function SidebarItem({ screen, isSelected, isActive, focused }: SidebarItemProps) {\n const theme = useTheme()\n const status = screen.getStatus()\n const statusIndicator = theme.statusIndicators[status]\n\n // Determine background color based on state\n let backgroundColor: string | undefined = undefined\n if (isSelected && focused) {\n backgroundColor = theme.sidebar.selectedBackground\n } else if (isActive) {\n backgroundColor = theme.sidebar.selectedBackground + '80'\n }\n\n return (\n <box flexDirection=\"row\" paddingLeft={1} paddingRight={1} backgroundColor={backgroundColor}>\n {/* Selection indicator */}\n <text fg={isSelected && focused ? theme.sidebar.focusBorder : 'transparent'}>{'>'} </text>\n\n {/* Status indicator */}\n <text fg={statusIndicator.color}>{statusIndicator.icon} </text>\n\n {/* Screen name */}\n <text fg={isActive ? theme.sidebar.text : theme.sidebar.textDim} flexGrow={1}>\n {screen.getName()}\n </text>\n\n {/* Badge if present */}\n {screen.getBadgeCount() > 0 && (\n <box backgroundColor={theme.sidebar.badge} paddingLeft={1} paddingRight={1}>\n <text fg={theme.colors.foreground} attributes={TextAttributes.BOLD}>\n {screen.getBadgeCount() > 99 ? '99+' : screen.getBadgeCount()}\n </text>\n </box>\n )}\n </box>\n )\n}\n","import { useTheme } from '../../hooks/index.ts'\n\nexport function SidebarSeparator() {\n const theme = useTheme()\n\n return (\n <box flexDirection=\"row\" paddingTop={1}>\n <box flexGrow={1} />\n <text fg={theme.separator.line}>· · ·</text>\n <box flexGrow={1} />\n </box>\n )\n}\n","import { TextAttributes } from '@opentui/core'\n\nimport { useTheme } from '../../hooks/index.ts'\n\nimport type { ScreenInstance } from '../../../../services/index.ts'\n\nimport { SidebarItem } from './sidebar_item.tsx'\nimport { SidebarSeparator } from './sidebar_separator.tsx'\n\nexport interface SidebarProps {\n screens: ScreenInstance[]\n selectedIndex: number\n activeScreenId: string\n focused: boolean\n width: number\n title: string\n}\n\nexport function Sidebar({\n screens,\n selectedIndex,\n activeScreenId,\n focused,\n width,\n title,\n}: SidebarProps) {\n const theme = useTheme()\n\n // Separate screens: only \"pending\" status on top, everything else below\n const pendingScreens: { screen: ScreenInstance; originalIndex: number }[] = []\n const otherScreens: { screen: ScreenInstance; originalIndex: number }[] = []\n\n screens.forEach((screen, index) => {\n const status = screen.getStatus()\n if (status === 'pending') {\n pendingScreens.push({ screen, originalIndex: index })\n } else {\n otherScreens.push({ screen, originalIndex: index })\n }\n })\n\n const hasPending = pendingScreens.length > 0\n const hasOther = otherScreens.length > 0\n const showSeparator = hasPending && hasOther\n\n return (\n <box\n flexDirection=\"column\"\n width={width}\n borderColor={focused ? theme.sidebar.focusBorder : theme.sidebar.border}\n border={['right']}\n >\n {/* Sidebar header */}\n <box\n backgroundColor={theme.header.background}\n paddingLeft={1}\n paddingRight={1}\n borderColor={theme.header.border}\n border={['bottom']}\n >\n <text fg={theme.header.text} attributes={TextAttributes.BOLD}>\n {title}\n </text>\n </box>\n\n {/* Screen list */}\n <scrollbox scrollY stickyScroll={false} flexGrow={1} contentOptions={{ flexGrow: 1 }}>\n <box flexDirection=\"column\">\n {/* Pending screens (active work) */}\n {pendingScreens.map(({ screen, originalIndex }) => (\n <SidebarItem\n key={screen.getId()}\n screen={screen}\n isSelected={originalIndex === selectedIndex}\n isActive={screen.getId() === activeScreenId}\n focused={focused}\n />\n ))}\n\n {/* Separator between pending and other screens */}\n {showSeparator && <SidebarSeparator />}\n\n {/* Other screens (waiting, success, fail) */}\n {otherScreens.map(({ screen, originalIndex }) => (\n <SidebarItem\n key={screen.getId()}\n screen={screen}\n isSelected={originalIndex === selectedIndex}\n isActive={screen.getId() === activeScreenId}\n focused={focused}\n />\n ))}\n </box>\n </scrollbox>\n\n {/* Footer with keybindings hint */}\n <box paddingLeft={1} paddingRight={1} borderColor={theme.sidebar.border} border={['top']}>\n <text fg={theme.sidebar.text}>q: exit | Tab: focus | ?: help</text>\n </box>\n </box>\n )\n}\n","import { useKeyboard } from '@opentui/react'\nimport { useState, useEffect, useCallback, useMemo, useSyncExternalStore } from 'react'\n\nimport { LoggerProvider } from '../context/index.ts'\nimport { FilterEngine } from '../../../filter/index.ts'\nimport { KeyboardManager, createDefaultBindings, handlePrintableInput } from '../../../keyboard/index.ts'\nimport {\n ALL_LOG_LEVELS,\n createDefaultFilterState,\n hasActiveFilter,\n type FilterState,\n type KeyboardContext,\n type Theme,\n} from '../../../types/index.ts'\n\nimport type { ScreenManagerInstance } from '../../../services/index.ts'\n\nimport { FilterBar } from './filter/filter_bar.tsx'\nimport { HelpOverlay } from './help/help_overlay.tsx'\nimport { ScreenBridge } from './screen/screen_bridge.tsx'\nimport { Sidebar } from './sidebar/sidebar.tsx'\n\nexport interface ScreenManagerBridgeProps {\n manager: ScreenManagerInstance\n theme?: Theme\n}\n\nexport function ScreenManagerBridge({ manager, theme }: ScreenManagerBridgeProps) {\n const [, forceUpdate] = useState({})\n const [showHelp, setShowHelp] = useState(false)\n const [filter, setFilter] = useState<FilterState>(createDefaultFilterState)\n\n // Subscribe to manager changes\n useEffect(() => {\n return manager.onChange(() => forceUpdate({}))\n }, [manager])\n\n // Helper functions for keyboard bindings\n const getActiveScreen = useCallback(() => manager.getActiveScreen(), [manager])\n\n const toggleHelp = useCallback(() => {\n setShowHelp((prev) => !prev)\n }, [])\n\n const toggleFilter = useCallback(() => {\n setFilter((prev) => ({\n ...prev,\n isVisible: !prev.isVisible,\n focusedField: 'search',\n }))\n }, [])\n\n const closeFilter = useCallback(() => {\n setFilter((prev) => ({ ...prev, isVisible: false }))\n }, [])\n\n const filterAppendChar = useCallback((char: string) => {\n setFilter((prev) => ({\n ...prev,\n searchQuery: prev.searchQuery + char,\n }))\n }, [])\n\n const filterDeleteChar = useCallback(() => {\n setFilter((prev) => ({\n ...prev,\n searchQuery: prev.searchQuery.slice(0, -1),\n }))\n }, [])\n\n const filterToggleLevel = useCallback((index: number) => {\n setFilter((prev) => {\n const level = ALL_LOG_LEVELS[index]\n if (!level) return prev\n\n const newLevels = new Set(prev.enabledLevels)\n if (newLevels.has(level)) {\n newLevels.delete(level)\n } else {\n newLevels.add(level)\n }\n\n return { ...prev, enabledLevels: newLevels }\n })\n }, [])\n\n const filterCycleField = useCallback(() => {\n setFilter((prev) => ({\n ...prev,\n focusedField: prev.focusedField === 'search' ? 'levels' : 'search',\n }))\n }, [])\n\n // Create keyboard manager with bindings\n const keyboardManager = useMemo(() => {\n const km = new KeyboardManager()\n const bindings = createDefaultBindings({\n manager,\n getActiveScreen,\n toggleHelp,\n toggleFilter,\n closeFilter,\n filterAppendChar,\n filterDeleteChar,\n filterToggleLevel,\n filterCycleField,\n })\n km.addBindings(bindings)\n return km\n }, [\n manager,\n getActiveScreen,\n toggleHelp,\n toggleFilter,\n closeFilter,\n filterAppendChar,\n filterDeleteChar,\n filterToggleLevel,\n filterCycleField,\n ])\n\n // Keyboard handler\n const handleKeyboard = useCallback(\n (key: { name: string; ctrl?: boolean; meta?: boolean; sequence?: string }) => {\n const screens = manager.getScreens()\n const activeScreen = manager.getActiveScreen()\n\n const context: KeyboardContext = {\n hasSidebar: screens.length > 1,\n focusArea: manager.focusArea,\n hasPrompt: activeScreen?.hasActivePrompt() ?? false,\n inInputMode: activeScreen?.isPromptInInputMode() ?? false,\n isFilterActive: filter.isVisible,\n isHelpVisible: showHelp,\n }\n\n // Try keyboard manager first\n if (keyboardManager.handleKey(key, context)) {\n return\n }\n\n // Handle printable characters (for input mode and filter)\n handlePrintableInput(key, context, {\n manager,\n getActiveScreen,\n toggleHelp,\n toggleFilter,\n closeFilter,\n filterAppendChar,\n filterDeleteChar,\n filterToggleLevel,\n filterCycleField,\n })\n },\n [\n manager,\n keyboardManager,\n filter.isVisible,\n showHelp,\n getActiveScreen,\n toggleHelp,\n toggleFilter,\n closeFilter,\n filterAppendChar,\n filterDeleteChar,\n filterToggleLevel,\n filterCycleField,\n ],\n )\n\n // Handle keyboard input\n useKeyboard(handleKeyboard)\n\n const screens = manager.getScreens()\n const activeScreen = manager.getActiveScreen()\n const activeScreenId = activeScreen?.getId() ?? screens[0]?.getId() ?? ''\n const bindOptions = manager.getBindOptions()\n const hasSidebar = screens.length > 1\n\n const activeScreenVersion = useSyncExternalStore(\n (updater) => activeScreen?.onChange(updater) ?? (() => {}),\n () => activeScreen?.getVersion() ?? -1,\n )\n // Get level counts for filter bar\n const levelCounts = useMemo(() => {\n if (!activeScreen) {\n return {\n verbose: 0,\n debug: 0,\n log: 0,\n warn: 0,\n error: 0,\n fatal: 0,\n }\n }\n return FilterEngine.countByLevel(activeScreen.getMessages())\n }, [activeScreenVersion, activeScreen])\n\n // Filter messages for the active screen\n const filteredMessages = useMemo(() => {\n if (!activeScreen) return []\n return FilterEngine.filterMessages(activeScreen.getMessages(), filter)\n }, [activeScreenVersion, activeScreen, filter])\n\n const isFiltering = useMemo(() => hasActiveFilter(filter), [filter])\n\n return (\n <LoggerProvider theme={theme}>\n <box flexDirection=\"row\" flexGrow={1}>\n {/* Sidebar */}\n {hasSidebar && (\n <Sidebar\n screens={screens}\n selectedIndex={manager.selectedIndex}\n activeScreenId={activeScreenId}\n focused={manager.focusArea === 'sidebar'}\n width={bindOptions.sidebarWidth ?? 25}\n title={bindOptions.sidebarTitle ?? 'Screens'}\n />\n )}\n\n {/* Main content area */}\n <box flexDirection=\"column\" flexGrow={1}>\n {/* Filter bar */}\n {filter.isVisible && <FilterBar filter={filter} levelCounts={levelCounts} />}\n\n {/* Screen content */}\n {activeScreen && (\n <ScreenBridge\n key={activeScreen.getId()}\n screen={activeScreen}\n focused={manager.focusArea === 'content'}\n filteredMessages={filteredMessages}\n isFiltering={isFiltering}\n totalMessages={activeScreen.getMessages().length}\n />\n )}\n </box>\n\n {/* Help overlay */}\n {showHelp && <HelpOverlay bindings={keyboardManager.getBindingsForHelp()} />}\n </box>\n </LoggerProvider>\n )\n}\n","import { Injectable } from '@navios/core'\nimport { createRoot as reactCreateRoot } from '@opentui/react'\nimport { createElement } from 'react'\n\nimport type { CliRenderer } from '@opentui/core'\n\nimport { Adapter } from '../../tokens/adapter.ts'\n\nimport type { AdapterInterface, AdapterRoot, AdapterRenderProps } from '../interface.ts'\n\nimport { ScreenManagerBridge } from './components/screen_manager_bridge.tsx'\n\n/**\n * React adapter for TUI rendering.\n * Automatically registers to DI when this module is imported.\n */\n@Injectable({ token: Adapter })\nexport class ReactAdapter implements AdapterInterface {\n createRoot(renderer: CliRenderer): AdapterRoot {\n const root = reactCreateRoot(renderer)\n return {\n render(element: unknown): void {\n root.render(element as React.ReactNode)\n },\n unmount(): void {\n root.unmount()\n },\n }\n }\n\n renderToRoot(root: AdapterRoot, props: AdapterRenderProps): void {\n const element = createElement(ScreenManagerBridge, props as any)\n root.render(element)\n }\n}\n\n// Re-export context and hooks for external use\nexport * from './context/index.ts'\nexport * from './hooks/index.ts'\n"],"mappings":"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"}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { Q as ThemePreset, Z as Theme, at as LogLevelColorMap, k as LoggerContextValue, n as AdapterRenderProps, r as AdapterRoot, t as AdapterInterface } from "../../interface-DQEIz9Mb.cjs";
|
|
2
|
-
import { CliRenderer, SyntaxStyle, TreeSitterClient } from "@opentui/core";
|
|
3
|
-
import { ReactNode } from "react";
|
|
4
|
-
|
|
5
|
-
//#region src/adapters/react/context/logger_context.d.ts
|
|
6
|
-
interface LoggerProviderProps {
|
|
7
|
-
children: ReactNode;
|
|
8
|
-
/** Custom syntax style for code highlighting */
|
|
9
|
-
syntaxStyle?: SyntaxStyle;
|
|
10
|
-
/** Tree-sitter client for parsing */
|
|
11
|
-
treeSitterClient?: TreeSitterClient;
|
|
12
|
-
/**
|
|
13
|
-
* Theme configuration.
|
|
14
|
-
* Can be a preset name ("dark", "light", "high-contrast") or a Theme object.
|
|
15
|
-
* @default "dark"
|
|
16
|
-
*/
|
|
17
|
-
theme?: Theme | ThemePreset;
|
|
18
|
-
/**
|
|
19
|
-
* @deprecated Use `theme` instead. Custom log level colors.
|
|
20
|
-
* If both `theme` and `levelColors` are provided, `levelColors` takes precedence.
|
|
21
|
-
*/
|
|
22
|
-
levelColors?: Partial<LogLevelColorMap>;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* LoggerProvider - Provides shared context for logger components.
|
|
26
|
-
*
|
|
27
|
-
* This context provides:
|
|
28
|
-
* - Shared SyntaxStyle instance for consistent code highlighting
|
|
29
|
-
* - Optional TreeSitterClient for advanced parsing
|
|
30
|
-
* - Theme configuration for consistent styling
|
|
31
|
-
* - Log level color configuration (for backwards compatibility)
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* // Using a preset theme
|
|
35
|
-
* <LoggerProvider theme="dark">
|
|
36
|
-
* <ScreenManager screens={screens} activeScreenId={activeId}>
|
|
37
|
-
* <Screen name="Logs">
|
|
38
|
-
* <LogMessage level="info">Hello</LogMessage>
|
|
39
|
-
* </Screen>
|
|
40
|
-
* </ScreenManager>
|
|
41
|
-
* </LoggerProvider>
|
|
42
|
-
*
|
|
43
|
-
* @example
|
|
44
|
-
* // Using a custom theme
|
|
45
|
-
* <LoggerProvider theme={myCustomTheme}>
|
|
46
|
-
* ...
|
|
47
|
-
* </LoggerProvider>
|
|
48
|
-
*/
|
|
49
|
-
declare function LoggerProvider({
|
|
50
|
-
children,
|
|
51
|
-
syntaxStyle: customSyntaxStyle,
|
|
52
|
-
treeSitterClient,
|
|
53
|
-
theme: themeProp,
|
|
54
|
-
levelColors: customLevelColors
|
|
55
|
-
}: LoggerProviderProps): ReactNode;
|
|
56
|
-
/**
|
|
57
|
-
* Hook to access logger context.
|
|
58
|
-
* Returns default values if used outside LoggerProvider.
|
|
59
|
-
*/
|
|
60
|
-
declare function useLoggerContext(): LoggerContextValue;
|
|
61
|
-
//#endregion
|
|
62
|
-
//#region src/adapters/react/hooks/use_theme.d.ts
|
|
63
|
-
/**
|
|
64
|
-
* Hook to access the current theme.
|
|
65
|
-
* Returns the theme from LoggerContext.
|
|
66
|
-
*/
|
|
67
|
-
declare function useTheme(): Theme;
|
|
68
|
-
//#endregion
|
|
69
|
-
//#region src/adapters/react/index.d.ts
|
|
70
|
-
/**
|
|
71
|
-
* React adapter for TUI rendering.
|
|
72
|
-
* Automatically registers to DI when this module is imported.
|
|
73
|
-
*/
|
|
74
|
-
declare class ReactAdapter implements AdapterInterface {
|
|
75
|
-
createRoot(renderer: CliRenderer): AdapterRoot;
|
|
76
|
-
renderToRoot(root: AdapterRoot, props: AdapterRenderProps): void;
|
|
77
|
-
}
|
|
78
|
-
//#endregion
|
|
79
|
-
export { LoggerProvider, LoggerProviderProps, ReactAdapter, useLoggerContext, useTheme };
|
|
80
|
-
//# sourceMappingURL=index.d.cts.map
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { Q as ThemePreset, Z as Theme, at as LogLevelColorMap, k as LoggerContextValue, n as AdapterRenderProps, r as AdapterRoot, t as AdapterInterface } from "../../interface-CTHQ08aY.mjs";
|
|
2
|
-
import { CliRenderer, SyntaxStyle, TreeSitterClient } from "@opentui/core";
|
|
3
|
-
import { ReactNode } from "react";
|
|
4
|
-
|
|
5
|
-
//#region src/adapters/react/context/logger_context.d.ts
|
|
6
|
-
interface LoggerProviderProps {
|
|
7
|
-
children: ReactNode;
|
|
8
|
-
/** Custom syntax style for code highlighting */
|
|
9
|
-
syntaxStyle?: SyntaxStyle;
|
|
10
|
-
/** Tree-sitter client for parsing */
|
|
11
|
-
treeSitterClient?: TreeSitterClient;
|
|
12
|
-
/**
|
|
13
|
-
* Theme configuration.
|
|
14
|
-
* Can be a preset name ("dark", "light", "high-contrast") or a Theme object.
|
|
15
|
-
* @default "dark"
|
|
16
|
-
*/
|
|
17
|
-
theme?: Theme | ThemePreset;
|
|
18
|
-
/**
|
|
19
|
-
* @deprecated Use `theme` instead. Custom log level colors.
|
|
20
|
-
* If both `theme` and `levelColors` are provided, `levelColors` takes precedence.
|
|
21
|
-
*/
|
|
22
|
-
levelColors?: Partial<LogLevelColorMap>;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* LoggerProvider - Provides shared context for logger components.
|
|
26
|
-
*
|
|
27
|
-
* This context provides:
|
|
28
|
-
* - Shared SyntaxStyle instance for consistent code highlighting
|
|
29
|
-
* - Optional TreeSitterClient for advanced parsing
|
|
30
|
-
* - Theme configuration for consistent styling
|
|
31
|
-
* - Log level color configuration (for backwards compatibility)
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* // Using a preset theme
|
|
35
|
-
* <LoggerProvider theme="dark">
|
|
36
|
-
* <ScreenManager screens={screens} activeScreenId={activeId}>
|
|
37
|
-
* <Screen name="Logs">
|
|
38
|
-
* <LogMessage level="info">Hello</LogMessage>
|
|
39
|
-
* </Screen>
|
|
40
|
-
* </ScreenManager>
|
|
41
|
-
* </LoggerProvider>
|
|
42
|
-
*
|
|
43
|
-
* @example
|
|
44
|
-
* // Using a custom theme
|
|
45
|
-
* <LoggerProvider theme={myCustomTheme}>
|
|
46
|
-
* ...
|
|
47
|
-
* </LoggerProvider>
|
|
48
|
-
*/
|
|
49
|
-
declare function LoggerProvider({
|
|
50
|
-
children,
|
|
51
|
-
syntaxStyle: customSyntaxStyle,
|
|
52
|
-
treeSitterClient,
|
|
53
|
-
theme: themeProp,
|
|
54
|
-
levelColors: customLevelColors
|
|
55
|
-
}: LoggerProviderProps): ReactNode;
|
|
56
|
-
/**
|
|
57
|
-
* Hook to access logger context.
|
|
58
|
-
* Returns default values if used outside LoggerProvider.
|
|
59
|
-
*/
|
|
60
|
-
declare function useLoggerContext(): LoggerContextValue;
|
|
61
|
-
//#endregion
|
|
62
|
-
//#region src/adapters/react/hooks/use_theme.d.ts
|
|
63
|
-
/**
|
|
64
|
-
* Hook to access the current theme.
|
|
65
|
-
* Returns the theme from LoggerContext.
|
|
66
|
-
*/
|
|
67
|
-
declare function useTheme(): Theme;
|
|
68
|
-
//#endregion
|
|
69
|
-
//#region src/adapters/react/index.d.ts
|
|
70
|
-
/**
|
|
71
|
-
* React adapter for TUI rendering.
|
|
72
|
-
* Automatically registers to DI when this module is imported.
|
|
73
|
-
*/
|
|
74
|
-
declare class ReactAdapter implements AdapterInterface {
|
|
75
|
-
createRoot(renderer: CliRenderer): AdapterRoot;
|
|
76
|
-
renderToRoot(root: AdapterRoot, props: AdapterRenderProps): void;
|
|
77
|
-
}
|
|
78
|
-
//#endregion
|
|
79
|
-
export { LoggerProvider, LoggerProviderProps, ReactAdapter, useLoggerContext, useTheme };
|
|
80
|
-
//# sourceMappingURL=index.d.mts.map
|