@navios/commander-tui 1.0.0 → 1.1.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.
Files changed (35) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/tsconfig.tsbuildinfo +1 -1
  3. package/lib/index.cjs +19 -10
  4. package/lib/index.cjs.map +1 -1
  5. package/lib/index.d.cts +37 -28
  6. package/lib/index.d.cts.map +1 -1
  7. package/lib/index.d.mts +48 -39
  8. package/lib/index.d.mts.map +1 -1
  9. package/lib/index.mjs +19 -10
  10. package/lib/index.mjs.map +1 -1
  11. package/lib/{screen_manager_bridge-CkV7637i.cjs → screen_manager_bridge-Cp2p1Ix3.cjs} +1 -1
  12. package/lib/{screen_manager_bridge-Dfg4QUrl.mjs → screen_manager_bridge-D2BBwKcF.mjs} +13 -1
  13. package/lib/screen_manager_bridge-D2BBwKcF.mjs.map +1 -0
  14. package/lib/{screen_manager_bridge-DN2J6_k1.mjs → screen_manager_bridge-DT-l0rxa.mjs} +1 -1
  15. package/lib/{screen_manager_bridge-BpDgVu3e.cjs → screen_manager_bridge-hMUrLiBP.cjs} +13 -1
  16. package/lib/screen_manager_bridge-hMUrLiBP.cjs.map +1 -0
  17. package/package.json +1 -1
  18. package/src/__tests__/components/__snapshots__/filter_bar.spec.tsx.snap +48 -0
  19. package/src/__tests__/components/__snapshots__/loading_message.spec.tsx.snap +32 -0
  20. package/src/__tests__/components/__snapshots__/log_message.spec.tsx.snap +76 -0
  21. package/src/__tests__/components/__snapshots__/progress_message.spec.tsx.snap +40 -0
  22. package/src/__tests__/components/__snapshots__/prompt_renderer.spec.tsx.snap +68 -0
  23. package/src/__tests__/components/__snapshots__/sidebar.spec.tsx.snap +240 -0
  24. package/src/__tests__/components/sidebar.spec.tsx +17 -0
  25. package/src/overrides/console.logger.override.ts +8 -1
  26. package/src/schemas/screen-options.ts +2 -0
  27. package/src/services/screen.ts +3 -0
  28. package/src/services/screen_manager.tsx +15 -11
  29. package/src/themes/dark.ts +4 -0
  30. package/src/themes/high-contrast.ts +4 -0
  31. package/src/themes/light.ts +4 -0
  32. package/src/types/screen.types.ts +1 -1
  33. package/src/types/theme.types.ts +1 -0
  34. package/lib/screen_manager_bridge-BpDgVu3e.cjs.map +0 -1
  35. package/lib/screen_manager_bridge-Dfg4QUrl.mjs.map +0 -1
@@ -1,3 +1,3 @@
1
- const require_screen_manager_bridge = require('./screen_manager_bridge-BpDgVu3e.cjs');
1
+ const require_screen_manager_bridge = require('./screen_manager_bridge-hMUrLiBP.cjs');
2
2
 
3
3
  exports.ScreenManagerBridge = require_screen_manager_bridge.ScreenManagerBridge;
@@ -95,6 +95,10 @@ import { useKeyboard } from "@opentui/react";
95
95
  fail: {
96
96
  icon: "✗",
97
97
  color: "#EF4444"
98
+ },
99
+ static: {
100
+ icon: "●",
101
+ color: "#3B82F6"
98
102
  }
99
103
  },
100
104
  separator: {
@@ -253,6 +257,10 @@ import { useKeyboard } from "@opentui/react";
253
257
  fail: {
254
258
  icon: "✗",
255
259
  color: "#DC2626"
260
+ },
261
+ static: {
262
+ icon: "●",
263
+ color: "#2563EB"
256
264
  }
257
265
  },
258
266
  separator: {
@@ -417,6 +425,10 @@ import { useKeyboard } from "@opentui/react";
417
425
  fail: {
418
426
  icon: "✗",
419
427
  color: "#EF4444"
428
+ },
429
+ static: {
430
+ icon: "●",
431
+ color: "#00FFFF"
420
432
  }
421
433
  },
422
434
  separator: {
@@ -3031,4 +3043,4 @@ function ScreenManagerBridge({ manager, theme }) {
3031
3043
 
3032
3044
  //#endregion
3033
3045
  export { createDefaultFilterState as $, FILE_COLORS as A, VARIANT_COLORS as B, COMMON_FILETYPES as C, createTintedColor as D, createBorderColor as E, SEPARATOR_COLORS as F, createThemeFrom as G, LoggerProvider as H, SIDEBAR_COLORS as I, resolveTheme as J, getThemePreset as K, STATUS_INDICATORS as L, GROUP_COLORS as M, PROGRESS_COLORS as N, getLogLevelColors as O, HEADER_COLORS as P, ALL_LOG_LEVELS as Q, DEFAULT_LOG_LEVEL_COLORS as R, printMessagesToStdout as S, resolveFiletype as T, useLoggerContext as U, useTheme as V, createTheme as W, lightTheme as X, highContrastTheme as Y, darkTheme as Z, PromptRenderer as _, formatKeyBinding as a, captureTrace as b, SidebarSeparator as c, GroupMessageRenderer as d, hasActiveFilter as et, GroupRenderer as f, LoadingMessage as g, ProgressMessage as h, KeyboardManager as i, TABLE_COLORS as j, PROMPT_COLORS as k, SidebarItem as l, TableMessage as m, createDefaultBindings as n, FilterEngine as o, MessageRenderer as p, mergeThemes as q, handlePrintableInput as r, Sidebar as s, ScreenManagerBridge as t, ScreenBridge as u, FileLog as v, getFileName as w, formatObject as x, LogMessage as y, ERROR_HIGHLIGHT_COLORS as z };
3034
- //# sourceMappingURL=screen_manager_bridge-Dfg4QUrl.mjs.map
3046
+ //# sourceMappingURL=screen_manager_bridge-D2BBwKcF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen_manager_bridge-D2BBwKcF.mjs","names":["ALL_LOG_LEVELS","createDefaultFilterState","enabledLevels","Set","searchQuery","isVisible","focusedField","hasActiveFilter","filter","size","length","darkTheme","name","logLevels","verbose","border","background","debug","log","warn","error","fatal","text","sidebar","undefined","selectedBackground","hoverBackground","textDim","badge","focusBorder","header","statusIndicators","waiting","icon","color","pending","success","fail","static","separator","line","progress","barFilled","barEmpty","complete","completeBackground","failed","failedBackground","group","headerText","table","cellText","title","file","headerBackground","prompt","question","optionText","optionTextDim","optionSelected","optionSelectedBackground","confirmButton","cancelButton","buttonBackground","buttonSelectedBackground","inputBorder","inputBackground","inputText","inputPlaceholder","inputCursor","errorHighlight","gutterBackground","filter","cursor","activeLevel","inactiveLevel","help","category","key","description","hint","colors","primary","secondary","warning","muted","foreground","lightTheme","name","logLevels","verbose","border","background","debug","log","warn","error","fatal","text","sidebar","selectedBackground","hoverBackground","textDim","badge","focusBorder","header","statusIndicators","waiting","icon","color","pending","success","fail","static","separator","line","progress","barFilled","barEmpty","complete","completeBackground","failed","failedBackground","group","headerText","table","cellText","title","file","headerBackground","prompt","question","optionText","optionTextDim","optionSelected","optionSelectedBackground","confirmButton","cancelButton","buttonBackground","buttonSelectedBackground","inputBorder","inputBackground","inputText","inputPlaceholder","inputCursor","errorHighlight","gutterBackground","filter","cursor","activeLevel","inactiveLevel","help","category","key","description","hint","colors","primary","secondary","warning","muted","foreground","highContrastTheme","name","logLevels","verbose","border","background","text","debug","log","warn","error","fatal","sidebar","selectedBackground","hoverBackground","textDim","badge","focusBorder","header","statusIndicators","waiting","icon","color","pending","success","fail","static","separator","line","progress","barFilled","barEmpty","complete","completeBackground","failed","failedBackground","group","headerText","table","cellText","title","file","headerBackground","prompt","question","optionText","optionTextDim","optionSelected","optionSelectedBackground","confirmButton","cancelButton","buttonBackground","buttonSelectedBackground","inputBorder","inputBackground","inputText","inputPlaceholder","inputCursor","errorHighlight","gutterBackground","filter","cursor","activeLevel","inactiveLevel","help","category","key","description","hint","colors","primary","secondary","warning","muted","foreground","darkTheme","highContrastTheme","lightTheme","deepMerge","target","source","result","key","Object","prototype","hasOwnProperty","call","sourceValue","targetValue","undefined","Array","isArray","getThemePreset","preset","mergeThemes","base","overrides","createTheme","createThemeFrom","baseTheme","resolveTheme","theme","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","DEFAULT_LOG_LEVEL_COLORS","verbose","border","background","debug","log","warn","error","fatal","text","VARIANT_COLORS","success","trace","ERROR_HIGHLIGHT_COLORS","gutterBackground","SIDEBAR_COLORS","background","undefined","selectedBackground","hoverBackground","text","textDim","border","badge","focusBorder","HEADER_COLORS","STATUS_INDICATORS","waiting","icon","color","pending","success","fail","SEPARATOR_COLORS","line","PROGRESS_COLORS","border","background","barFilled","barEmpty","text","textDim","complete","completeBackground","failed","failedBackground","GROUP_COLORS","headerText","icon","TABLE_COLORS","border","background","headerText","cellText","title","separator","FILE_COLORS","border","background","headerText","headerBackground","PROMPT_COLORS","question","optionText","optionTextDim","optionSelected","optionSelectedBackground","confirmButton","cancelButton","buttonBackground","buttonSelectedBackground","inputBorder","inputBackground","inputText","inputPlaceholder","inputCursor","border","focusBorder","RGBA","DEFAULT_LOG_LEVEL_COLORS","createTintedColor","color","alpha","rgba","fromHex","fromValues","r","g","b","createBorderColor","getLogLevelColors","level","customColors","defaultColors","custom","border","background","text","COMMON_FILETYPES","ts","tsx","js","jsx","json","md","py","rs","go","java","c","cpp","h","hpp","css","html","yaml","yml","sh","bash","zsh","toml","xml","sql","rb","php","swift","kt","scala","hs","elm","vue","svelte","resolveFiletype","filePath","lastDot","lastIndexOf","undefined","ext","slice","toLowerCase","getFileName","lastSlash","Math","max","DEFAULT_LOG_LEVEL_COLORS","GROUP_COLORS","PROGRESS_COLORS","TABLE_COLORS","VARIANT_COLORS","RESET","BOLD","DIM","hexToAnsi","hex","isForeground","cleanHex","replace","slice","test","r","parseInt","g","b","code","getLogLevelAnsiColor","level","variant","colors","border","formatLevel","color","displayName","label","toUpperCase","padEnd","formatTimestamp","date","toLocaleTimeString","printMessage","message","stream","type","logMessage","timestamp","write","content","header","filePath","coloredDiff","diff","split","map","line","startsWith","join","errorLineSet","Set","errorLines","startLine","lines","numberedLines","index","lineNum","numStr","String","padStart","isError","has","loadingMessage","status","resolvedContent","levelStr","prefix","progressMessage","current","total","percentage","Math","round","barWidth","filledWidth","emptyWidth","progressColor","barFilled","emptyColor","barEmpty","filledBar","repeat","emptyBar","statusIcon","statusColor","complete","failed","displayLabel","progressBar","percentStr","groupMessage","collapsed","isEnd","groupColor","iconColor","icon","tableMessage","headers","rows","title","tableColor","headerColor","headerText","cellColor","cellText","colWidths","h","i","maxRowWidth","reduce","max","row","length","separator","w","topBorder","bottomBorder","headerRow","rowStr","_","printMessagesToStdout","messages","screenName","process","stderr","stdout","formatObject","obj","depth","currentDepth","Array","isArray","constructorName","name","String","undefined","Date","toISOString","Error","message","indent","repeat","childIndent","length","items","map","item","join","entries","Object","pairs","key","value","captureTrace","err","stack","lines","split","slice","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","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","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","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","ALL_LOG_LEVELS","FilterEngine","filterMessages","messages","filter","searchQuery","enabledLevels","size","length","msg","type","messageMatchesSearch","logMsg","has","level","query","lowerQuery","toLowerCase","content","includes","label","filePath","diff","resolvedContent","title","headers","some","h","rows","row","cell","countByLevel","counts","debug","log","verbose","error","fatal","warn","KeyboardManager","bindings","disabled","Set","config","sortBindings","addBindings","push","removeBinding","key","filter","b","keys","Array","isArray","includes","disableKey","add","enableKey","delete","handleKey","context","binding","findMatchingBinding","result","handler","getBindingsForHelp","description","getBindingsByCategory","grouped","general","navigation","screen","prompt","category","keyMatches","conditionMatches","when","isDisabled","name","sequence","ctrlMatches","ctrl","metaMatches","meta","shiftMatches","shift","condition","hasPrompt","undefined","inInputMode","focusArea","isFilterActive","isHelpVisible","hasSidebar","some","k","has","sort","a","priority","formatKeyBinding","parts","keyDisplay","map","join","createDefaultBindings","handlers","manager","getActiveScreen","toggleHelp","toggleFilter","closeFilter","bindings","push","key","handler","screen","isPromptInInputMode","promptExitInputMode","description","category","when","hasPrompt","inInputMode","priority","promptSubmit","promptDeleteLastChar","prompt","getActivePrompt","type","promptNavigateUp","promptNavigateDown","promptNavigateLeft","promptNavigateRight","promptToggleSelection","entered","promptEnterInputMode","canSubmitPrompt","isFilterActive","isHelpVisible","filterCycleField","filterDeleteChar","i","String","filterToggleLevel","unbind","_","ctx","hasSidebar","toggleFocus","navigateUp","focusArea","navigateDown","selectCurrent","screens","getScreens","length","setActiveScreen","setSelectedIndex","clear","handlePrintableInput","context","sequence","ctrl","meta","charCode","charCodeAt","filterAppendChar","promptAppendInput","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","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"],"sources":["../src/types/filter.types.ts","../src/themes/dark.ts","../src/themes/light.ts","../src/themes/high-contrast.ts","../src/themes/utils.ts","../src/context/logger_context.tsx","../src/hooks/use_theme.ts","../src/utils/colors/log-colors.ts","../src/utils/colors/sidebar-colors.ts","../src/utils/colors/progress-colors.ts","../src/utils/colors/table-colors.ts","../src/utils/colors/file-colors.ts","../src/utils/colors/prompt-colors.ts","../src/utils/colors/helpers.ts","../src/utils/filetype.ts","../src/utils/stdout-printer.ts","../src/utils/format.ts","../src/components/log/log_message.tsx","../src/components/file/file_log.tsx","../src/components/prompt/prompt_renderer.tsx","../src/components/screen/loading_message.tsx","../src/components/screen/progress_message.tsx","../src/components/screen/table_message.tsx","../src/components/screen/message_renderer.tsx","../src/components/screen/group_renderer.tsx","../src/components/screen/screen_bridge.tsx","../src/components/sidebar/sidebar_item.tsx","../src/components/sidebar/sidebar_separator.tsx","../src/components/sidebar/sidebar.tsx","../src/filter/filter_engine.ts","../src/keyboard/keyboard_manager.ts","../src/keyboard/create_bindings.ts","../src/components/filter/filter_bar.tsx","../src/components/help/help_overlay.tsx","../src/components/screen_manager_bridge.tsx"],"sourcesContent":["// ============================================\n// Filter Types\n// ============================================\n\nimport type { LogLevel } from '@navios/core'\n\n/**\n * Filter state for log filtering.\n */\nexport interface FilterState {\n /** Which log levels are enabled (shown) */\n enabledLevels: Set<LogLevel>\n\n /** Text search query */\n searchQuery: string\n\n /** Whether the filter bar is visible */\n isVisible: boolean\n\n /** Which filter field is focused */\n focusedField: 'search' | 'levels'\n}\n\n/**\n * All log levels in order.\n */\nexport const ALL_LOG_LEVELS: LogLevel[] = ['verbose', 'debug', 'log', 'warn', 'error', 'fatal']\n\n/**\n * Create a default filter state.\n */\nexport function createDefaultFilterState(): FilterState {\n return {\n enabledLevels: new Set(ALL_LOG_LEVELS),\n searchQuery: '',\n isVisible: false,\n focusedField: 'search',\n }\n}\n\n/**\n * Check if any filtering is active.\n */\nexport function hasActiveFilter(filter: FilterState): boolean {\n return filter.searchQuery !== '' || filter.enabledLevels.size < ALL_LOG_LEVELS.length\n}\n\n/**\n * Level counts for display.\n */\nexport type LevelCounts = Record<LogLevel, number>\n","import type { Theme } from '../types/index.ts'\n\n/**\n * Default dark theme.\n * Migrated from the scattered color files in utils/colors/.\n */\nexport const darkTheme: Theme = {\n name: 'dark',\n\n logLevels: {\n verbose: {\n border: '#6B7280', // Gray-500\n background: '#6B728015', // Gray with 8% opacity\n },\n debug: {\n border: '#8B5CF6', // Violet-500\n background: '#8B5CF615', // Violet with 8% opacity\n },\n log: {\n border: '#3B82F6', // Blue-500\n background: '#3B82F615', // Blue with 8% opacity\n },\n warn: {\n border: '#F59E0B', // Amber-500\n background: '#F59E0B15', // Amber with 8% opacity\n },\n error: {\n border: '#EF4444', // Red-500\n background: '#EF444415', // Red with 8% opacity\n },\n fatal: {\n border: '#DC2626', // Red-600\n background: '#DC262625', // Red with 15% opacity\n text: '#FCA5A5', // Light red text\n },\n },\n\n sidebar: {\n background: undefined,\n selectedBackground: '#1F293780', // Gray-800 with 50% opacity\n hoverBackground: '#374151', // Gray-700\n text: '#E5E7EB', // Gray-200\n textDim: '#6B7280', // Gray-500\n border: '#374151', // Gray-700\n badge: '#3B82F6', // Blue-500\n focusBorder: '#3B82F6', // Blue-500\n },\n\n header: {\n background: undefined,\n text: '#F9FAFB', // Gray-50\n border: '#374151', // Gray-700\n },\n\n statusIndicators: {\n waiting: {\n icon: '○',\n color: '#6B7280', // Gray-500\n },\n pending: {\n icon: '◐',\n color: '#F59E0B', // Amber-500\n },\n success: {\n icon: '✓',\n color: '#22C55E', // Green-500\n },\n fail: {\n icon: '✗',\n color: '#EF4444', // Red-500\n },\n static: {\n icon: '●',\n color: '#3B82F6', // Blue-500\n },\n },\n\n separator: {\n line: '#374151', // Gray-700\n text: '#6B7280', // Gray-500\n },\n\n progress: {\n border: '#3B82F6', // Blue-500\n background: '#3B82F615', // Blue with 8% opacity\n barFilled: '#3B82F6', // Blue-500\n barEmpty: '#374151', // Gray-700\n text: '#E5E7EB', // Gray-200\n textDim: '#9CA3AF', // Gray-400\n complete: '#22C55E', // Green-500\n completeBackground: '#22C55E15',\n failed: '#EF4444', // Red-500\n failedBackground: '#EF444415',\n },\n\n group: {\n border: '#6B7280', // Gray-500\n background: '#6B728010', // Gray with 6% opacity\n headerText: '#E5E7EB', // Gray-200\n icon: '#9CA3AF', // Gray-400\n },\n\n table: {\n border: '#3B82F6', // Blue-500\n background: '#3B82F615', // Blue with 8% opacity\n headerText: '#F9FAFB', // Gray-50\n cellText: '#E5E7EB', // Gray-200\n title: '#F9FAFB', // Gray-50\n separator: '#3B82F650', // Blue with 30% opacity\n },\n\n file: {\n border: '#3B82F6', // Blue-500\n background: '#3B82F615', // Blue with 8% opacity\n headerText: '#F9FAFB', // Gray-50\n headerBackground: '#3B82F625', // Blue with 15% opacity\n },\n\n prompt: {\n question: '#F9FAFB', // Gray-50\n optionText: '#E5E7EB', // Gray-200\n optionTextDim: '#9CA3AF', // Gray-400\n optionSelected: '#3B82F6', // Blue-500\n optionSelectedBackground: '#1E3A5F', // Dark blue\n confirmButton: '#22C55E', // Green-500\n cancelButton: '#EF4444', // Red-500\n buttonBackground: '#374151', // Gray-700\n buttonSelectedBackground: '#1F2937', // Gray-800\n inputBorder: '#3B82F6', // Blue-500\n inputBackground: '#1F2937', // Gray-800\n inputText: '#F9FAFB', // Gray-50\n inputPlaceholder: '#6B7280', // Gray-500\n inputCursor: '#3B82F6', // Blue-500\n border: '#374151', // Gray-700\n focusBorder: '#3B82F6', // Blue-500\n },\n\n errorHighlight: {\n background: '#EF444425', // Red with 15% opacity\n border: '#EF4444', // Red-500\n gutterBackground: '#EF444440', // Red with 25% opacity\n },\n\n filter: {\n background: '#1F293780', // Gray-800 with 50% opacity\n border: '#3B82F6', // Blue-500\n text: '#E5E7EB', // Gray-200\n textDim: '#6B7280', // Gray-500\n inputBackground: '#1F2937', // Gray-800\n inputText: '#F9FAFB', // Gray-50\n inputPlaceholder: '#6B7280', // Gray-500\n cursor: '#3B82F6', // Blue-500\n activeLevel: '#3B82F6', // Blue-500\n inactiveLevel: '#4B5563', // Gray-600\n },\n\n help: {\n background: '#1F2937', // Gray-800\n border: '#3B82F6', // Blue-500\n title: '#F9FAFB', // Gray-50\n category: '#3B82F6', // Blue-500\n key: '#F59E0B', // Amber-500\n description: '#E5E7EB', // Gray-200\n hint: '#6B7280', // Gray-500\n },\n\n colors: {\n primary: '#3B82F6', // Blue-500\n secondary: '#8B5CF6', // Violet-500\n success: '#22C55E', // Green-500\n warning: '#F59E0B', // Amber-500\n error: '#EF4444', // Red-500\n muted: '#6B7280', // Gray-500\n background: '#111827', // Gray-900\n foreground: '#F9FAFB', // Gray-50\n },\n}\n","import type { Theme } from '../types/index.ts'\n\n/**\n * Light theme for terminals with light backgrounds.\n */\nexport const lightTheme: Theme = {\n name: 'light',\n\n logLevels: {\n verbose: {\n border: '#9CA3AF', // Gray-400\n background: '#F3F4F6', // Gray-100\n },\n debug: {\n border: '#7C3AED', // Violet-600\n background: '#EDE9FE', // Violet-100\n },\n log: {\n border: '#2563EB', // Blue-600\n background: '#DBEAFE', // Blue-100\n },\n warn: {\n border: '#D97706', // Amber-600\n background: '#FEF3C7', // Amber-100\n },\n error: {\n border: '#DC2626', // Red-600\n background: '#FEE2E2', // Red-100\n },\n fatal: {\n border: '#991B1B', // Red-800\n background: '#FECACA', // Red-200\n text: '#7F1D1D', // Red-900\n },\n },\n\n sidebar: {\n background: '#F9FAFB', // Gray-50\n selectedBackground: '#E5E7EB', // Gray-200\n hoverBackground: '#F3F4F6', // Gray-100\n text: '#1F2937', // Gray-800\n textDim: '#6B7280', // Gray-500\n border: '#D1D5DB', // Gray-300\n badge: '#2563EB', // Blue-600\n focusBorder: '#2563EB', // Blue-600\n },\n\n header: {\n background: '#F9FAFB', // Gray-50\n text: '#111827', // Gray-900\n border: '#D1D5DB', // Gray-300\n },\n\n statusIndicators: {\n waiting: {\n icon: '○',\n color: '#9CA3AF', // Gray-400\n },\n pending: {\n icon: '◐',\n color: '#D97706', // Amber-600\n },\n success: {\n icon: '✓',\n color: '#16A34A', // Green-600\n },\n fail: {\n icon: '✗',\n color: '#DC2626', // Red-600\n },\n static: {\n icon: '●',\n color: '#2563EB', // Blue-600\n },\n },\n\n separator: {\n line: '#D1D5DB', // Gray-300\n text: '#6B7280', // Gray-500\n },\n\n progress: {\n border: '#2563EB', // Blue-600\n background: '#DBEAFE', // Blue-100\n barFilled: '#2563EB', // Blue-600\n barEmpty: '#E5E7EB', // Gray-200\n text: '#1F2937', // Gray-800\n textDim: '#6B7280', // Gray-500\n complete: '#16A34A', // Green-600\n completeBackground: '#DCFCE7', // Green-100\n failed: '#DC2626', // Red-600\n failedBackground: '#FEE2E2', // Red-100\n },\n\n group: {\n border: '#9CA3AF', // Gray-400\n background: '#F3F4F6', // Gray-100\n headerText: '#1F2937', // Gray-800\n icon: '#6B7280', // Gray-500\n },\n\n table: {\n border: '#2563EB', // Blue-600\n background: '#DBEAFE', // Blue-100\n headerText: '#111827', // Gray-900\n cellText: '#1F2937', // Gray-800\n title: '#111827', // Gray-900\n separator: '#93C5FD', // Blue-300\n },\n\n file: {\n border: '#2563EB', // Blue-600\n background: '#DBEAFE', // Blue-100\n headerText: '#111827', // Gray-900\n headerBackground: '#BFDBFE', // Blue-200\n },\n\n prompt: {\n question: '#111827', // Gray-900\n optionText: '#1F2937', // Gray-800\n optionTextDim: '#6B7280', // Gray-500\n optionSelected: '#2563EB', // Blue-600\n optionSelectedBackground: '#DBEAFE', // Blue-100\n confirmButton: '#16A34A', // Green-600\n cancelButton: '#DC2626', // Red-600\n buttonBackground: '#E5E7EB', // Gray-200\n buttonSelectedBackground: '#D1D5DB', // Gray-300\n inputBorder: '#2563EB', // Blue-600\n inputBackground: '#FFFFFF', // White\n inputText: '#111827', // Gray-900\n inputPlaceholder: '#9CA3AF', // Gray-400\n inputCursor: '#2563EB', // Blue-600\n border: '#D1D5DB', // Gray-300\n focusBorder: '#2563EB', // Blue-600\n },\n\n errorHighlight: {\n background: '#FEE2E2', // Red-100\n border: '#DC2626', // Red-600\n gutterBackground: '#FECACA', // Red-200\n },\n\n filter: {\n background: '#F3F4F6', // Gray-100\n border: '#2563EB', // Blue-600\n text: '#1F2937', // Gray-800\n textDim: '#6B7280', // Gray-500\n inputBackground: '#FFFFFF', // White\n inputText: '#111827', // Gray-900\n inputPlaceholder: '#9CA3AF', // Gray-400\n cursor: '#2563EB', // Blue-600\n activeLevel: '#2563EB', // Blue-600\n inactiveLevel: '#D1D5DB', // Gray-300\n },\n\n help: {\n background: '#FFFFFF', // White\n border: '#2563EB', // Blue-600\n title: '#111827', // Gray-900\n category: '#2563EB', // Blue-600\n key: '#D97706', // Amber-600\n description: '#1F2937', // Gray-800\n hint: '#6B7280', // Gray-500\n },\n\n colors: {\n primary: '#2563EB', // Blue-600\n secondary: '#7C3AED', // Violet-600\n success: '#16A34A', // Green-600\n warning: '#D97706', // Amber-600\n error: '#DC2626', // Red-600\n muted: '#6B7280', // Gray-500\n background: '#FFFFFF', // White\n foreground: '#111827', // Gray-900\n },\n}\n","import type { Theme } from '../types/index.ts'\n\n/**\n * High contrast theme for accessibility.\n * Uses pure black/white with saturated colors for maximum visibility.\n */\nexport const highContrastTheme: Theme = {\n name: 'high-contrast',\n\n logLevels: {\n verbose: {\n border: '#FFFFFF',\n background: '#1A1A1A',\n text: '#FFFFFF',\n },\n debug: {\n border: '#A855F7', // Purple-500\n background: '#1A1A1A',\n text: '#E9D5FF', // Purple-200\n },\n log: {\n border: '#3B82F6', // Blue-500\n background: '#1A1A1A',\n text: '#BFDBFE', // Blue-200\n },\n warn: {\n border: '#FBBF24', // Amber-400\n background: '#1A1A1A',\n text: '#FEF08A', // Yellow-200\n },\n error: {\n border: '#EF4444', // Red-500\n background: '#1A1A1A',\n text: '#FECACA', // Red-200\n },\n fatal: {\n border: '#FF0000', // Pure red\n background: '#330000',\n text: '#FFFFFF',\n },\n },\n\n sidebar: {\n background: '#000000',\n selectedBackground: '#333333',\n hoverBackground: '#1A1A1A',\n text: '#FFFFFF',\n textDim: '#AAAAAA',\n border: '#FFFFFF',\n badge: '#FFFF00', // Yellow for high visibility\n focusBorder: '#FFFF00',\n },\n\n header: {\n background: '#000000',\n text: '#FFFFFF',\n border: '#FFFFFF',\n },\n\n statusIndicators: {\n waiting: {\n icon: '○',\n color: '#AAAAAA',\n },\n pending: {\n icon: '◐',\n color: '#FBBF24', // Amber-400\n },\n success: {\n icon: '✓',\n color: '#22C55E', // Green-500\n },\n fail: {\n icon: '✗',\n color: '#EF4444', // Red-500\n },\n static: {\n icon: '●',\n color: '#00FFFF', // Cyan for high visibility\n },\n },\n\n separator: {\n line: '#FFFFFF',\n text: '#AAAAAA',\n },\n\n progress: {\n border: '#3B82F6',\n background: '#1A1A1A',\n barFilled: '#3B82F6',\n barEmpty: '#333333',\n text: '#FFFFFF',\n textDim: '#AAAAAA',\n complete: '#22C55E',\n completeBackground: '#1A1A1A',\n failed: '#EF4444',\n failedBackground: '#1A1A1A',\n },\n\n group: {\n border: '#FFFFFF',\n background: '#1A1A1A',\n headerText: '#FFFFFF',\n icon: '#AAAAAA',\n },\n\n table: {\n border: '#FFFFFF',\n background: '#1A1A1A',\n headerText: '#FFFFFF',\n cellText: '#FFFFFF',\n title: '#FFFFFF',\n separator: '#666666',\n },\n\n file: {\n border: '#FFFFFF',\n background: '#1A1A1A',\n headerText: '#FFFFFF',\n headerBackground: '#333333',\n },\n\n prompt: {\n question: '#FFFFFF',\n optionText: '#FFFFFF',\n optionTextDim: '#AAAAAA',\n optionSelected: '#FFFF00', // Yellow for high visibility\n optionSelectedBackground: '#333333',\n confirmButton: '#22C55E',\n cancelButton: '#EF4444',\n buttonBackground: '#333333',\n buttonSelectedBackground: '#1A1A1A',\n inputBorder: '#FFFF00',\n inputBackground: '#1A1A1A',\n inputText: '#FFFFFF',\n inputPlaceholder: '#666666',\n inputCursor: '#FFFF00',\n border: '#FFFFFF',\n focusBorder: '#FFFF00',\n },\n\n errorHighlight: {\n background: '#330000',\n border: '#FF0000',\n gutterBackground: '#660000',\n },\n\n filter: {\n background: '#1A1A1A',\n border: '#FFFF00',\n text: '#FFFFFF',\n textDim: '#AAAAAA',\n inputBackground: '#000000',\n inputText: '#FFFFFF',\n inputPlaceholder: '#666666',\n cursor: '#FFFF00',\n activeLevel: '#FFFF00',\n inactiveLevel: '#666666',\n },\n\n help: {\n background: '#000000',\n border: '#FFFFFF',\n title: '#FFFFFF',\n category: '#FFFF00',\n key: '#00FFFF', // Cyan for contrast\n description: '#FFFFFF',\n hint: '#AAAAAA',\n },\n\n colors: {\n primary: '#3B82F6',\n secondary: '#A855F7',\n success: '#22C55E',\n warning: '#FBBF24',\n error: '#EF4444',\n muted: '#AAAAAA',\n background: '#000000',\n foreground: '#FFFFFF',\n },\n}\n","import type { PartialTheme, Theme, ThemePreset } from '../types/index.ts'\n\nimport { darkTheme } from './dark.ts'\nimport { highContrastTheme } from './high-contrast.ts'\nimport { lightTheme } from './light.ts'\n\n/**\n * Deep merge two objects, with source taking precedence.\n */\nfunction deepMerge<T extends object>(target: T, source: Partial<T>): T {\n const result = { ...target }\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key]\n const targetValue = target[key]\n\n if (\n sourceValue !== undefined &&\n typeof sourceValue === 'object' &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === 'object' &&\n targetValue !== null &&\n !Array.isArray(targetValue)\n ) {\n ;(result as Record<string, unknown>)[key] = deepMerge(\n targetValue as object,\n sourceValue as object,\n )\n } else if (sourceValue !== undefined) {\n ;(result as Record<string, unknown>)[key] = sourceValue\n }\n }\n }\n\n return result\n}\n\n/**\n * Get a theme by preset name.\n */\nexport function getThemePreset(preset: ThemePreset): Theme {\n switch (preset) {\n case 'dark':\n return darkTheme\n case 'light':\n return lightTheme\n case 'high-contrast':\n return highContrastTheme\n default:\n return darkTheme\n }\n}\n\n/**\n * Merge a base theme with partial overrides.\n */\nexport function mergeThemes(base: Theme, overrides: PartialTheme): Theme {\n return deepMerge(base, overrides as Partial<Theme>)\n}\n\n/**\n * Create a custom theme by extending the dark theme with overrides.\n */\nexport function createTheme(overrides: PartialTheme): Theme {\n return mergeThemes(darkTheme, overrides)\n}\n\n/**\n * Create a custom theme by extending a specific base theme.\n */\nexport function createThemeFrom(base: Theme | ThemePreset, overrides: PartialTheme): Theme {\n const baseTheme = typeof base === 'string' ? getThemePreset(base) : base\n return mergeThemes(baseTheme, overrides)\n}\n\n/**\n * Resolve a theme value which can be a Theme object or a preset name.\n */\nexport function resolveTheme(theme: Theme | ThemePreset): Theme {\n return typeof theme === 'string' ? getThemePreset(theme) : theme\n}\n","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 type { LogLevelColorMap, LogLevelColors, LogMessageVariant } from '../../types/index.ts'\n\n/**\n * Default color scheme for all log levels.\n * Each level has a prominent border color and a subtle background tint.\n */\nexport const DEFAULT_LOG_LEVEL_COLORS: LogLevelColorMap = {\n verbose: {\n border: '#6B7280', // Gray-500\n background: '#6B728015', // Gray with 8% opacity\n },\n debug: {\n border: '#8B5CF6', // Violet-500\n background: '#8B5CF615', // Violet with 8% opacity\n },\n log: {\n border: '#3B82F6', // Blue-500\n background: '#3B82F615', // Blue with 8% opacity\n },\n warn: {\n border: '#F59E0B', // Amber-500\n background: '#F59E0B15', // Amber with 8% opacity\n },\n error: {\n border: '#EF4444', // Red-500\n background: '#EF444415', // Red with 8% opacity\n },\n fatal: {\n border: '#DC2626', // Red-600\n background: '#DC262625', // Red with 15% opacity (more prominent)\n text: '#FCA5A5', // Light red text for contrast\n },\n}\n\n/**\n * Colors for semantic variants (override level colors when variant is set).\n */\nexport const VARIANT_COLORS: Record<LogMessageVariant, LogLevelColors> = {\n success: {\n border: '#22C55E', // Green-500\n background: '#22C55E15', // Green with 8% opacity\n },\n trace: {\n border: '#6B7280', // Gray-500\n background: '#6B728015', // Gray with 8% opacity\n },\n}\n\n/**\n * Error highlighting colors.\n */\nexport const ERROR_HIGHLIGHT_COLORS = {\n background: '#EF444425', // Red with 15% opacity\n border: '#EF4444', // Red-500\n gutterBackground: '#EF444440', // Red with 25% opacity for line number gutter\n}\n","/**\n * Sidebar colors.\n */\nexport const SIDEBAR_COLORS = {\n background: undefined, // Transparent - blend with terminal\n selectedBackground: '#1F293780', // Gray-800 with 50% opacity\n hoverBackground: '#374151', // Gray-700\n text: '#E5E7EB', // Gray-200\n textDim: '#6B7280', // Gray-500\n border: '#374151', // Gray-700\n badge: '#3B82F6', // Blue-500\n focusBorder: '#3B82F6', // Blue-500\n}\n\n/**\n * Screen header colors.\n */\nexport const HEADER_COLORS = {\n background: undefined, // Transparent - blend with terminal\n text: '#F9FAFB', // Gray-50\n border: '#374151', // Gray-700\n}\n\n/**\n * Screen status indicator colors and icons.\n */\nexport const STATUS_INDICATORS = {\n waiting: {\n icon: '○', // Empty circle\n color: '#6B7280', // Gray-500\n },\n pending: {\n icon: '◐', // Half circle (spinner-like)\n color: '#F59E0B', // Amber-500\n },\n success: {\n icon: '✓', // Checkmark\n color: '#22C55E', // Green-500\n },\n fail: {\n icon: '✗', // X mark\n color: '#EF4444', // Red-500\n },\n} as const\n\n/**\n * Separator colors for sidebar sections.\n */\nexport const SEPARATOR_COLORS = {\n line: '#374151', // Gray-700\n text: '#6B7280', // Gray-500\n}\n","/**\n * Progress bar colors.\n */\nexport const PROGRESS_COLORS = {\n border: '#3B82F6', // Blue-500\n background: '#3B82F615', // Blue with 8% opacity\n barFilled: '#3B82F6', // Blue-500\n barEmpty: '#374151', // Gray-700\n text: '#E5E7EB', // Gray-200\n textDim: '#9CA3AF', // Gray-400\n complete: '#22C55E', // Green-500\n completeBackground: '#22C55E15',\n failed: '#EF4444', // Red-500\n failedBackground: '#EF444415',\n}\n\n/**\n * Group colors for collapsible log groups.\n */\nexport const GROUP_COLORS = {\n border: '#6B7280', // Gray-500\n background: '#6B728010', // Gray with 6% opacity\n headerText: '#E5E7EB', // Gray-200\n icon: '#9CA3AF', // Gray-400\n}\n","/**\n * Table colors (uses info/blue scheme).\n */\nexport const TABLE_COLORS = {\n border: '#3B82F6', // Blue-500 (same as info)\n background: '#3B82F615', // Blue with 8% opacity\n headerText: '#F9FAFB', // Gray-50\n cellText: '#E5E7EB', // Gray-200\n title: '#F9FAFB', // Gray-50\n separator: '#3B82F650', // Blue with 30% opacity\n}\n","/**\n * File display colors (uses info/blue scheme).\n */\nexport const FILE_COLORS = {\n border: '#3B82F6', // Blue-500 (same as info)\n background: '#3B82F615', // Blue with 8% opacity\n headerText: '#F9FAFB', // Gray-50\n headerBackground: '#3B82F625', // Blue with 15% opacity\n}\n","/**\n * Prompt colors for interactive prompts.\n */\nexport const PROMPT_COLORS = {\n // Question text\n question: '#F9FAFB', // Gray-50\n\n // Choice options\n optionText: '#E5E7EB', // Gray-200\n optionTextDim: '#9CA3AF', // Gray-400\n optionSelected: '#3B82F6', // Blue-500\n optionSelectedBackground: '#1E3A5F', // Dark blue\n\n // Confirm buttons\n confirmButton: '#22C55E', // Green-500\n cancelButton: '#EF4444', // Red-500\n buttonBackground: '#374151', // Gray-700\n buttonSelectedBackground: '#1F2937', // Gray-800\n\n // Input field\n inputBorder: '#3B82F6', // Blue-500\n inputBackground: '#1F2937', // Gray-800\n inputText: '#F9FAFB', // Gray-50\n inputPlaceholder: '#6B7280', // Gray-500\n inputCursor: '#3B82F6', // Blue-500\n\n // General\n border: '#374151', // Gray-700\n focusBorder: '#3B82F6', // Blue-500\n}\n","import { RGBA } from '@opentui/core'\n\nimport type { LogLevel } from '@navios/core'\n\nimport type { LogLevelColorMap, LogLevelColors } from '../../types/index.ts'\n\nimport { DEFAULT_LOG_LEVEL_COLORS } from './log-colors.ts'\n\n/**\n * Creates a tinted (subtle) version of a color by setting alpha.\n *\n * @param color - The base color (hex string or RGBA)\n * @param alpha - Target alpha value (0-1), default 0.08 for subtle tinting\n * @returns New RGBA with adjusted alpha\n */\nexport function createTintedColor(color: string | RGBA, alpha: number = 0.08): RGBA {\n const rgba = typeof color === 'string' ? RGBA.fromHex(color) : color\n return RGBA.fromValues(rgba.r, rgba.g, rgba.b, alpha)\n}\n\n/**\n * Creates a more prominent version of a color for borders.\n *\n * @param color - The base color\n * @param alpha - Target alpha, default 1.0 for solid borders\n */\nexport function createBorderColor(color: string | RGBA, alpha: number = 1.0): RGBA {\n const rgba = typeof color === 'string' ? RGBA.fromHex(color) : color\n return RGBA.fromValues(rgba.r, rgba.g, rgba.b, alpha)\n}\n\n/**\n * Gets colors for a specific log level.\n *\n * @param level - The log level\n * @param customColors - Optional custom color map\n */\nexport function getLogLevelColors(\n level: LogLevel,\n customColors?: Partial<LogLevelColorMap>,\n): LogLevelColors {\n const defaultColors = DEFAULT_LOG_LEVEL_COLORS[level]\n const custom = customColors?.[level]\n\n return {\n border: custom?.border ?? defaultColors.border,\n background: custom?.background ?? defaultColors.background,\n text: custom?.text ?? defaultColors.text,\n }\n}\n","/**\n * Common file extension to filetype mapping for syntax highlighting.\n */\nexport const COMMON_FILETYPES: Record<string, string> = {\n ts: 'typescript',\n tsx: 'tsx',\n js: 'javascript',\n jsx: 'javascript',\n json: 'json',\n md: 'markdown',\n py: 'python',\n rs: 'rust',\n go: 'go',\n java: 'java',\n c: 'c',\n cpp: 'cpp',\n h: 'c',\n hpp: 'cpp',\n css: 'css',\n html: 'html',\n yaml: 'yaml',\n yml: 'yaml',\n sh: 'bash',\n bash: 'bash',\n zsh: 'bash',\n toml: 'toml',\n xml: 'xml',\n sql: 'sql',\n rb: 'ruby',\n php: 'php',\n swift: 'swift',\n kt: 'kotlin',\n scala: 'scala',\n hs: 'haskell',\n elm: 'elm',\n vue: 'vue',\n svelte: 'svelte',\n}\n\n/**\n * Resolves filetype from file path for syntax highlighting.\n *\n * @param filePath - Full file path or just filename\n * @returns Filetype string for tree-sitter, or undefined\n */\nexport function resolveFiletype(filePath: string): string | undefined {\n // Extract extension from path\n const lastDot = filePath.lastIndexOf('.')\n if (lastDot === -1) return undefined\n\n const ext = filePath.slice(lastDot + 1).toLowerCase()\n return COMMON_FILETYPES[ext]\n}\n\n/**\n * Gets the filename from a full path.\n *\n * @param filePath - Full file path\n * @returns Just the filename\n */\nexport function getFileName(filePath: string): string {\n const lastSlash = Math.max(filePath.lastIndexOf('/'), filePath.lastIndexOf('\\\\'))\n return lastSlash === -1 ? filePath : filePath.slice(lastSlash + 1)\n}\n","import type {\n GroupMessageData,\n LoadingMessageData,\n LogMessageData,\n LogMessageVariant,\n MessageData,\n ProgressMessageData,\n TableMessageData,\n} from '../types/index.ts'\nimport type { LogLevel } from '@navios/core'\n\nimport { DEFAULT_LOG_LEVEL_COLORS, GROUP_COLORS, PROGRESS_COLORS, TABLE_COLORS, VARIANT_COLORS } from './colors/index.ts'\n\n// ANSI escape codes\nconst RESET = '\\x1b[0m'\nconst BOLD = '\\x1b[1m'\nconst DIM = '\\x1b[2m'\n\n// Convert hex color to ANSI 24-bit color\nfunction hexToAnsi(hex: string, isForeground = true): string {\n // Remove # if present and take first 6 chars\n const cleanHex = hex.replace('#', '').slice(0, 6)\n\n // Validate hex format\n if (!/^[0-9A-Fa-f]{6}$/.test(cleanHex)) {\n return '' // Return empty string for invalid colors (no styling)\n }\n\n const r = parseInt(cleanHex.slice(0, 2), 16)\n const g = parseInt(cleanHex.slice(2, 4), 16)\n const b = parseInt(cleanHex.slice(4, 6), 16)\n\n const code = isForeground ? 38 : 48\n return `\\x1b[${code};2;${r};${g};${b}m`\n}\n\n// Get ANSI color for log level or variant\nfunction getLogLevelAnsiColor(level: LogLevel, variant?: LogMessageVariant): string {\n const colors = variant ? VARIANT_COLORS[variant] : DEFAULT_LOG_LEVEL_COLORS[level]\n return hexToAnsi(colors.border, true)\n}\n\n// Format a log level label\nfunction formatLevel(level: LogLevel, variant?: LogMessageVariant): string {\n const color = getLogLevelAnsiColor(level, variant)\n // Use variant name if present, otherwise use level name\n const displayName = variant ?? level\n const label = displayName.toUpperCase().padEnd(7)\n return `${color}${BOLD}[${label}]${RESET}`\n}\n\n// Format timestamp\nfunction formatTimestamp(date: Date): string {\n return `${DIM}${date.toLocaleTimeString()}${RESET}`\n}\n\n// Print a single message\nfunction printMessage(message: MessageData, stream: NodeJS.WriteStream): void {\n switch (message.type) {\n case 'log': {\n const logMessage = message as LogMessageData\n const timestamp = formatTimestamp(message.timestamp)\n const level = formatLevel(logMessage.level, logMessage.variant)\n const label = logMessage.label ? ` ${DIM}[${logMessage.label}]${RESET}` : ''\n stream.write(`${timestamp} ${level}${label} ${logMessage.content}\\n`)\n break\n }\n\n case 'file': {\n const header = `${DIM}─── ${message.filePath} ───${RESET}`\n stream.write(`${header}\\n${message.content}\\n`)\n break\n }\n\n case 'diff': {\n const header = `${DIM}─── ${message.filePath} (diff) ───${RESET}`\n // Color diff lines\n const coloredDiff = message.diff\n .split('\\n')\n .map((line) => {\n if (line.startsWith('+') && !line.startsWith('+++')) {\n return `\\x1b[32m${line}${RESET}` // Green for additions\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n return `\\x1b[31m${line}${RESET}` // Red for deletions\n } else if (line.startsWith('@@')) {\n return `\\x1b[36m${line}${RESET}` // Cyan for hunk headers\n }\n return line\n })\n .join('\\n')\n stream.write(`${header}\\n${coloredDiff}\\n`)\n break\n }\n\n case 'fileError': {\n const header = `${DIM}─── ${message.filePath} ───${RESET}`\n const errorLineSet = new Set(message.errorLines)\n const startLine = message.startLine ?? 1\n\n const lines = message.content.split('\\n')\n const numberedLines = lines.map((line, index) => {\n const lineNum = startLine + index\n const numStr = String(lineNum).padStart(4)\n const isError = errorLineSet.has(lineNum)\n\n if (isError) {\n return `\\x1b[31m${numStr} │ ${line}${RESET}`\n }\n return `${DIM}${numStr}${RESET} │ ${line}`\n })\n\n stream.write(`${header}\\n${numberedLines.join('\\n')}\\n`)\n break\n }\n\n case 'loading': {\n const loadingMessage = message as LoadingMessageData\n const status = loadingMessage.status\n const content = loadingMessage.resolvedContent ?? loadingMessage.content\n\n let level: LogLevel = 'log'\n let variant: LogMessageVariant | undefined\n if (status === 'success') {\n level = 'log'\n variant = 'success'\n } else if (status === 'fail') {\n level = 'error'\n }\n\n const timestamp = formatTimestamp(message.timestamp)\n const levelStr = formatLevel(level, variant)\n const prefix = status === 'loading' ? '... ' : ''\n stream.write(`${timestamp} ${levelStr} ${prefix}${content}\\n`)\n break\n }\n\n case 'progress': {\n const progressMessage = message as ProgressMessageData\n const { label, current, total, status, resolvedContent } = progressMessage\n const percentage = total > 0 ? Math.round((current / total) * 100) : 0\n const barWidth = 20\n const filledWidth = Math.round((percentage / 100) * barWidth)\n const emptyWidth = barWidth - filledWidth\n\n const progressColor = hexToAnsi(PROGRESS_COLORS.barFilled)\n const emptyColor = hexToAnsi(PROGRESS_COLORS.barEmpty)\n const filledBar = '█'.repeat(filledWidth)\n const emptyBar = '░'.repeat(emptyWidth)\n\n let statusIcon = ''\n let statusColor = ''\n if (status === 'complete') {\n statusIcon = '✓'\n statusColor = hexToAnsi(PROGRESS_COLORS.complete)\n } else if (status === 'failed') {\n statusIcon = '✗'\n statusColor = hexToAnsi(PROGRESS_COLORS.failed)\n }\n\n const displayLabel = resolvedContent ?? label\n const progressBar = `${progressColor}${filledBar}${RESET}${emptyColor}${emptyBar}${RESET}`\n const percentStr = `${String(percentage).padStart(3)}%`\n\n if (statusIcon) {\n stream.write(`${statusColor}${statusIcon}${RESET} ${displayLabel} [${progressBar}] ${percentStr}\\n`)\n } else {\n stream.write(` ${displayLabel} [${progressBar}] ${percentStr} (${current}/${total})\\n`)\n }\n break\n }\n\n case 'group': {\n const groupMessage = message as GroupMessageData\n const { label, collapsed, isEnd } = groupMessage\n const groupColor = hexToAnsi(GROUP_COLORS.border)\n const iconColor = hexToAnsi(GROUP_COLORS.icon)\n\n if (isEnd) {\n stream.write(`${groupColor}└─${RESET} ${DIM}end ${label}${RESET}\\n`)\n } else {\n const icon = collapsed ? '▶' : '▼'\n stream.write(`${groupColor}┌─${RESET} ${iconColor}${icon}${RESET} ${BOLD}${label}${RESET}\\n`)\n }\n break\n }\n\n case 'table': {\n const tableMessage = message as TableMessageData\n const { headers, rows, title } = tableMessage\n\n const tableColor = hexToAnsi(TABLE_COLORS.border)\n const headerColor = hexToAnsi(TABLE_COLORS.headerText)\n const cellColor = hexToAnsi(TABLE_COLORS.cellText)\n\n // Calculate column widths\n const colWidths = headers.map((h, i) => {\n const maxRowWidth = rows.reduce((max, row) => Math.max(max, (row[i] ?? '').length), 0)\n return Math.max(h.length, maxRowWidth)\n })\n\n // Build separator line\n const separator = `${tableColor}├${colWidths.map((w) => '─'.repeat(w + 2)).join('┼')}┤${RESET}`\n const topBorder = `${tableColor}┌${colWidths.map((w) => '─'.repeat(w + 2)).join('┬')}┐${RESET}`\n const bottomBorder = `${tableColor}└${colWidths.map((w) => '─'.repeat(w + 2)).join('┴')}┘${RESET}`\n\n // Print title if present\n if (title) {\n stream.write(`${BOLD}${title}${RESET}\\n`)\n }\n\n // Print top border\n stream.write(`${topBorder}\\n`)\n\n // Print headers\n const headerRow = headers.map((h, i) => ` ${h.padEnd(colWidths[i])} `).join(`${tableColor}│${RESET}`)\n stream.write(`${tableColor}│${RESET}${headerColor}${headerRow}${RESET}${tableColor}│${RESET}\\n`)\n\n // Print separator\n stream.write(`${separator}\\n`)\n\n // Print rows\n for (const row of rows) {\n const rowStr = headers.map((_, i) => ` ${(row[i] ?? '').padEnd(colWidths[i])} `).join(`${tableColor}│${RESET}`)\n stream.write(`${tableColor}│${RESET}${cellColor}${rowStr}${RESET}${tableColor}│${RESET}\\n`)\n }\n\n // Print bottom border\n stream.write(`${bottomBorder}\\n`)\n break\n }\n }\n}\n\n/**\n * Print all messages to stdout (or stderr if isError)\n */\nexport function printMessagesToStdout(\n messages: MessageData[],\n screenName: string,\n isError: boolean = false,\n): void {\n const stream = isError ? process.stderr : process.stdout\n\n // Print screen header\n const headerColor = isError ? '\\x1b[31m' : '\\x1b[32m'\n const status = isError ? 'FAILED' : 'COMPLETED'\n stream.write(`\\n${headerColor}${BOLD}═══ ${screenName} [${status}] ═══${RESET}\\n\\n`)\n\n // Print each message\n for (const message of messages) {\n printMessage(message, stream)\n }\n\n stream.write('\\n')\n}\n","/**\n * Format an object for display with configurable depth\n */\nexport function formatObject(obj: unknown, depth: number = 2, currentDepth: number = 0): string {\n if (currentDepth >= depth) {\n if (Array.isArray(obj)) return '[Array]'\n if (typeof obj === 'object' && obj !== null) {\n const constructorName = obj.constructor?.name ?? 'Object'\n return `[${constructorName}]`\n }\n return String(obj)\n }\n\n if (obj === null) return 'null'\n if (obj === undefined) return 'undefined'\n if (typeof obj === 'string') return `\"${obj}\"`\n if (typeof obj === 'number' || typeof obj === 'boolean') return String(obj)\n if (typeof obj === 'function') return '[Function]'\n if (obj instanceof Date) return obj.toISOString()\n if (obj instanceof Error) return `${obj.name}: ${obj.message}`\n\n const indent = ' '.repeat(currentDepth)\n const childIndent = ' '.repeat(currentDepth + 1)\n\n if (Array.isArray(obj)) {\n if (obj.length === 0) return '[]'\n const items = obj.map((item) => formatObject(item, depth, currentDepth + 1))\n return `[\\n${childIndent}${items.join(`,\\n${childIndent}`)}\\n${indent}]`\n }\n\n if (typeof obj === 'object') {\n const entries = Object.entries(obj)\n if (entries.length === 0) return '{}'\n const pairs = entries.map(\n ([key, value]) => `${key}: ${formatObject(value, depth, currentDepth + 1)}`,\n )\n return `{\\n${childIndent}${pairs.join(`,\\n${childIndent}`)}\\n${indent}}`\n }\n\n return String(obj)\n}\n\n/**\n * Capture a stack trace, filtering out internal frames\n */\nexport function captureTrace(): string {\n const err = new Error()\n const stack = err.stack ?? ''\n const lines = stack.split('\\n')\n // Skip the first 4 lines: Error, captureTrace, trace method, and the log method\n return lines.slice(4).join('\\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 { 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'\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 { 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}\n {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 { ALL_LOG_LEVELS } from '../types/index.ts'\n\nimport type { FilterState, LevelCounts, LogMessageData, MessageData } from '../types/index.ts'\n\n/**\n * Filter engine for filtering log messages.\n */\nexport class FilterEngine {\n /**\n * Apply filter to messages array.\n */\n static filterMessages(messages: MessageData[], filter: FilterState): MessageData[] {\n // If no filtering active, return original\n if (filter.searchQuery === '' && filter.enabledLevels.size === ALL_LOG_LEVELS.length) {\n return messages\n }\n\n return messages.filter((msg) => {\n // Always show non-log messages unless searching\n if (msg.type !== 'log') {\n // For search, check if any content matches\n if (filter.searchQuery) {\n return this.messageMatchesSearch(msg, filter.searchQuery)\n }\n // Group markers need special handling\n if (msg.type === 'group') {\n return true // Always show group markers\n }\n return true\n }\n\n // Log message filtering\n const logMsg = msg as LogMessageData\n\n // Check log level\n if (!filter.enabledLevels.has(logMsg.level)) {\n return false\n }\n\n // Check search query\n if (filter.searchQuery && !this.messageMatchesSearch(logMsg, filter.searchQuery)) {\n return false\n }\n\n return true\n })\n }\n\n /**\n * Check if a message matches the search query.\n */\n private static messageMatchesSearch(msg: MessageData, query: string): boolean {\n const lowerQuery = query.toLowerCase()\n\n switch (msg.type) {\n case 'log':\n return (\n msg.content.toLowerCase().includes(lowerQuery) ||\n (msg.label?.toLowerCase().includes(lowerQuery) ?? false)\n )\n case 'file':\n case 'fileError':\n return (\n msg.filePath.toLowerCase().includes(lowerQuery) ||\n msg.content.toLowerCase().includes(lowerQuery)\n )\n case 'diff':\n return (\n msg.filePath.toLowerCase().includes(lowerQuery) ||\n msg.diff.toLowerCase().includes(lowerQuery)\n )\n case 'loading':\n return (\n msg.content.toLowerCase().includes(lowerQuery) ||\n (msg.resolvedContent?.toLowerCase().includes(lowerQuery) ?? false)\n )\n case 'progress':\n return msg.label.toLowerCase().includes(lowerQuery)\n case 'group':\n return msg.label.toLowerCase().includes(lowerQuery)\n case 'table':\n return (\n (msg.title?.toLowerCase().includes(lowerQuery) ?? false) ||\n msg.headers.some((h) => h.toLowerCase().includes(lowerQuery)) ||\n msg.rows.some((row) => row.some((cell) => cell.toLowerCase().includes(lowerQuery)))\n )\n default:\n return false\n }\n }\n\n /**\n * Count messages by log level.\n */\n static countByLevel(messages: MessageData[]): LevelCounts {\n const counts: LevelCounts = {\n debug: 0,\n log: 0,\n verbose: 0,\n error: 0,\n fatal: 0,\n warn: 0,\n }\n\n for (const msg of messages) {\n if (msg.type === 'log') {\n counts[(msg as LogMessageData).level]++\n }\n }\n\n return counts\n }\n}\n","import type {\n KeyBinding,\n KeyBindingCategory,\n KeyBindingsConfig,\n KeyboardContext,\n KeyEvent,\n} from '../types/index.ts'\n\n/**\n * Manages keyboard bindings and dispatches key events to handlers.\n */\nexport class KeyboardManager {\n private bindings: KeyBinding[] = []\n private disabled: Set<string> = new Set()\n\n constructor(config?: KeyBindingsConfig) {\n if (config?.bindings) {\n this.bindings = [...config.bindings]\n }\n\n if (config?.disabled) {\n this.disabled = new Set(config.disabled)\n }\n\n // Sort bindings by priority (higher first)\n this.sortBindings()\n }\n\n /**\n * Add bindings to the manager.\n */\n addBindings(bindings: KeyBinding[]): void {\n this.bindings.push(...bindings)\n this.sortBindings()\n }\n\n /**\n * Remove a binding by key name.\n */\n removeBinding(key: string): void {\n this.bindings = this.bindings.filter((b) => {\n const keys = Array.isArray(b.key) ? b.key : [b.key]\n return !keys.includes(key)\n })\n }\n\n /**\n * Disable a key (prevents it from being matched).\n */\n disableKey(key: string): void {\n this.disabled.add(key)\n }\n\n /**\n * Enable a previously disabled key.\n */\n enableKey(key: string): void {\n this.disabled.delete(key)\n }\n\n /**\n * Handle a key event, dispatching to the appropriate handler.\n * Returns true if a handler consumed the event.\n */\n handleKey(key: KeyEvent, context: KeyboardContext): boolean {\n const binding = this.findMatchingBinding(key, context)\n if (binding) {\n const result = binding.handler(key, context)\n return result !== false\n }\n return false\n }\n\n /**\n * Get all bindings for display in help overlay.\n */\n getBindingsForHelp(): KeyBinding[] {\n return this.bindings.filter((b) => b.description)\n }\n\n /**\n * Get bindings grouped by category.\n */\n getBindingsByCategory(): Record<KeyBindingCategory, KeyBinding[]> {\n const grouped: Record<KeyBindingCategory, KeyBinding[]> = {\n general: [],\n navigation: [],\n screen: [],\n prompt: [],\n filter: [],\n }\n\n for (const binding of this.bindings) {\n if (binding.description) {\n grouped[binding.category].push(binding)\n }\n }\n\n return grouped\n }\n\n /**\n * Find a matching binding for the given key and context.\n */\n private findMatchingBinding(key: KeyEvent, context: KeyboardContext): KeyBinding | null {\n for (const binding of this.bindings) {\n if (\n this.keyMatches(key, binding) &&\n this.conditionMatches(binding.when, context) &&\n !this.isDisabled(binding)\n ) {\n return binding\n }\n }\n return null\n }\n\n /**\n * Check if a key event matches a binding's key specification.\n */\n private keyMatches(key: KeyEvent, binding: KeyBinding): boolean {\n const keys = Array.isArray(binding.key) ? binding.key : [binding.key]\n\n // Check key name or sequence\n const keyMatches = keys.includes(key.name) || (key.sequence && keys.includes(key.sequence))\n\n if (!keyMatches) return false\n\n // Check modifiers\n const ctrlMatches = (binding.ctrl ?? false) === (key.ctrl ?? false)\n const metaMatches = (binding.meta ?? false) === (key.meta ?? false)\n const shiftMatches = (binding.shift ?? false) === (key.shift ?? false)\n\n return ctrlMatches && metaMatches && shiftMatches\n }\n\n /**\n * Check if context matches a binding's condition.\n */\n private conditionMatches(condition: KeyBinding['when'], context: KeyboardContext): boolean {\n if (!condition) return true\n\n if (condition.hasPrompt !== undefined && condition.hasPrompt !== context.hasPrompt) {\n return false\n }\n\n if (condition.inInputMode !== undefined && condition.inInputMode !== context.inInputMode) {\n return false\n }\n\n if (condition.focusArea !== undefined && condition.focusArea !== context.focusArea) {\n return false\n }\n\n if (\n condition.isFilterActive !== undefined &&\n condition.isFilterActive !== context.isFilterActive\n ) {\n return false\n }\n\n if (\n condition.isHelpVisible !== undefined &&\n condition.isHelpVisible !== context.isHelpVisible\n ) {\n return false\n }\n\n if (condition.hasSidebar !== undefined && condition.hasSidebar !== context.hasSidebar) {\n return false\n }\n\n return true\n }\n\n /**\n * Check if a binding is disabled.\n */\n private isDisabled(binding: KeyBinding): boolean {\n const keys = Array.isArray(binding.key) ? binding.key : [binding.key]\n return keys.some((k) => this.disabled.has(k))\n }\n\n /**\n * Sort bindings by priority (higher first).\n */\n private sortBindings(): void {\n this.bindings.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n }\n}\n\n/**\n * Format a key binding for display.\n */\nexport function formatKeyBinding(binding: KeyBinding): string {\n const keys = Array.isArray(binding.key) ? binding.key : [binding.key]\n const parts: string[] = []\n\n if (binding.ctrl) parts.push('Ctrl')\n if (binding.meta) parts.push('Cmd')\n if (binding.shift) parts.push('Shift')\n\n // Format key names for display\n const keyDisplay = keys\n .map((k) => {\n switch (k) {\n case 'up':\n return '↑'\n case 'down':\n return '↓'\n case 'left':\n return '←'\n case 'right':\n return '→'\n case 'return':\n return 'Enter'\n case 'escape':\n return 'Esc'\n case 'space':\n return 'Space'\n case 'tab':\n return 'Tab'\n case '\\\\':\n return '\\\\'\n default:\n return k\n }\n })\n .join('/')\n\n parts.push(keyDisplay)\n return parts.join('+')\n}\n","import type { ScreenInstance, ScreenManager } from '../services/index.ts'\nimport type { KeyBinding, KeyboardContext, KeyEvent } from '../types/index.ts'\n\n/**\n * Interface for binding handlers that need manager/screen access.\n */\nexport interface BindingHandlers {\n manager: ScreenManager\n getActiveScreen: () => ScreenInstance | null\n toggleHelp: () => void\n toggleFilter: () => void\n closeFilter: () => void\n filterAppendChar: (char: string) => void\n filterDeleteChar: () => void\n filterToggleLevel: (index: number) => void\n filterCycleField: () => void\n}\n\n/**\n * Create the default keybindings with access to manager and screens.\n */\nexport function createDefaultBindings(handlers: BindingHandlers): KeyBinding[] {\n const { manager, getActiveScreen, toggleHelp, toggleFilter, closeFilter } = handlers\n\n const bindings: KeyBinding[] = []\n\n // ============================================\n // PROMPT INPUT MODE (highest priority)\n // ============================================\n\n // Escape to exit input mode\n bindings.push({\n key: 'escape',\n handler: () => {\n const screen = getActiveScreen()\n if (screen?.isPromptInInputMode()) {\n screen.promptExitInputMode()\n return true\n }\n },\n description: 'Exit input mode',\n category: 'prompt',\n when: { hasPrompt: true, inInputMode: true },\n priority: 100,\n })\n\n // Enter to submit in input mode\n bindings.push({\n key: 'return',\n handler: () => {\n const screen = getActiveScreen()\n if (screen?.isPromptInInputMode()) {\n screen.promptSubmit()\n return true\n }\n },\n description: 'Submit input',\n category: 'prompt',\n when: { hasPrompt: true, inInputMode: true },\n priority: 100,\n })\n\n // Backspace to delete in input mode\n bindings.push({\n key: 'backspace',\n handler: () => {\n const screen = getActiveScreen()\n if (screen?.isPromptInInputMode()) {\n screen.promptDeleteLastChar()\n return true\n }\n },\n description: 'Delete character',\n category: 'prompt',\n when: { hasPrompt: true, inInputMode: true },\n priority: 100,\n })\n\n // ============================================\n // PROMPT NAVIGATION (high priority)\n // ============================================\n\n // Choice prompt: up/down to navigate, enter to select\n bindings.push({\n key: ['up', 'k'],\n handler: () => {\n const screen = getActiveScreen()\n const prompt = screen?.getActivePrompt()\n if (prompt?.type === 'choice' || prompt?.type === 'multiChoice') {\n screen?.promptNavigateUp()\n return true\n }\n },\n description: 'Navigate up',\n category: 'prompt',\n when: { hasPrompt: true, inInputMode: false },\n priority: 90,\n })\n\n bindings.push({\n key: ['down', 'j'],\n handler: () => {\n const screen = getActiveScreen()\n const prompt = screen?.getActivePrompt()\n if (prompt?.type === 'choice' || prompt?.type === 'multiChoice') {\n screen?.promptNavigateDown()\n return true\n }\n },\n description: 'Navigate down',\n category: 'prompt',\n when: { hasPrompt: true, inInputMode: false },\n priority: 90,\n })\n\n // Confirm prompt: left/right to toggle\n bindings.push({\n key: ['left', 'h'],\n handler: () => {\n const screen = getActiveScreen()\n const prompt = screen?.getActivePrompt()\n if (prompt?.type === 'confirm') {\n screen?.promptNavigateLeft()\n return true\n }\n },\n description: 'Select confirm',\n category: 'prompt',\n when: { hasPrompt: true, inInputMode: false },\n priority: 90,\n })\n\n bindings.push({\n key: ['right', 'l'],\n handler: () => {\n const screen = getActiveScreen()\n const prompt = screen?.getActivePrompt()\n if (prompt?.type === 'confirm') {\n screen?.promptNavigateRight()\n return true\n }\n },\n description: 'Select cancel',\n category: 'prompt',\n when: { hasPrompt: true, inInputMode: false },\n priority: 90,\n })\n\n // Space to toggle in multiChoice\n bindings.push({\n key: 'space',\n handler: () => {\n const screen = getActiveScreen()\n const prompt = screen?.getActivePrompt()\n if (prompt?.type === 'multiChoice') {\n screen?.promptToggleSelection()\n return true\n }\n },\n description: 'Toggle selection',\n category: 'prompt',\n when: { hasPrompt: true, inInputMode: false },\n priority: 90,\n })\n\n // Enter to submit prompt (or enter input mode for choice with input)\n bindings.push({\n key: 'return',\n handler: () => {\n const screen = getActiveScreen()\n const prompt = screen?.getActivePrompt()\n if (!prompt) return false\n\n if (prompt.type === 'choice') {\n const entered = screen?.promptEnterInputMode()\n if (!entered) {\n screen?.promptSubmit()\n }\n return true\n } else if (prompt.type === 'confirm') {\n screen?.promptSubmit()\n return true\n } else if (prompt.type === 'multiChoice') {\n if (screen?.canSubmitPrompt()) {\n screen.promptSubmit()\n }\n return true\n }\n },\n description: 'Submit selection',\n category: 'prompt',\n when: { hasPrompt: true, inInputMode: false },\n priority: 90,\n })\n\n // ============================================\n // HELP OVERLAY\n // ============================================\n\n bindings.push({\n key: '?',\n handler: () => {\n toggleHelp()\n return true\n },\n description: 'Toggle help',\n category: 'general',\n when: { hasPrompt: false, isFilterActive: false },\n priority: 50,\n })\n\n // Escape to close help\n bindings.push({\n key: 'escape',\n handler: () => {\n toggleHelp()\n return true\n },\n description: 'Close help',\n category: 'general',\n when: { isHelpVisible: true },\n priority: 80,\n })\n\n // ============================================\n // FILTER\n // ============================================\n\n bindings.push({\n key: '/',\n handler: () => {\n toggleFilter()\n return true\n },\n description: 'Toggle filter',\n category: 'filter',\n when: { hasPrompt: false, isHelpVisible: false },\n priority: 50,\n })\n\n // Escape to close filter\n bindings.push({\n key: 'escape',\n handler: () => {\n closeFilter()\n return true\n },\n description: 'Close filter',\n category: 'filter',\n when: { isFilterActive: true },\n priority: 70,\n })\n\n // Tab to cycle filter fields\n bindings.push({\n key: 'tab',\n handler: () => {\n handlers.filterCycleField()\n return true\n },\n description: 'Cycle filter fields',\n category: 'filter',\n when: { isFilterActive: true },\n priority: 70,\n })\n\n // Backspace in filter\n bindings.push({\n key: 'backspace',\n handler: () => {\n handlers.filterDeleteChar()\n return true\n },\n description: 'Delete character',\n category: 'filter',\n when: { isFilterActive: true },\n priority: 70,\n })\n\n // Number keys 1-7 to toggle log levels in filter\n for (let i = 1; i <= 7; i++) {\n bindings.push({\n key: String(i),\n handler: () => {\n handlers.filterToggleLevel(i - 1)\n return true\n },\n description: `Toggle level ${i}`,\n category: 'filter',\n when: { isFilterActive: true },\n priority: 70,\n })\n }\n\n // ============================================\n // GENERAL\n // ============================================\n\n bindings.push({\n key: 'q',\n handler: () => {\n manager.unbind()\n return true\n },\n description: 'Exit',\n category: 'general',\n when: { hasPrompt: false, isFilterActive: false, isHelpVisible: false },\n priority: 10,\n })\n\n // Tab to switch focus\n bindings.push({\n key: 'tab',\n handler: (_, ctx) => {\n if (ctx.hasSidebar) {\n manager.toggleFocus()\n return true\n }\n },\n description: 'Toggle focus',\n category: 'navigation',\n when: { hasPrompt: false, isFilterActive: false },\n priority: 20,\n })\n\n // Backslash to toggle focus (alternate)\n bindings.push({\n key: '\\\\',\n handler: (_, ctx) => {\n if (ctx.hasSidebar) {\n manager.toggleFocus()\n return true\n }\n },\n description: 'Toggle focus',\n category: 'navigation',\n when: { hasPrompt: false, isFilterActive: false },\n priority: 20,\n })\n\n // ============================================\n // SIDEBAR NAVIGATION\n // ============================================\n\n bindings.push({\n key: ['up', 'k'],\n handler: () => {\n manager.navigateUp()\n return true\n },\n description: 'Navigate up',\n category: 'navigation',\n when: { focusArea: 'sidebar', hasPrompt: false },\n priority: 30,\n })\n\n bindings.push({\n key: ['down', 'j'],\n handler: () => {\n manager.navigateDown()\n return true\n },\n description: 'Navigate down',\n category: 'navigation',\n when: { focusArea: 'sidebar', hasPrompt: false },\n priority: 30,\n })\n\n bindings.push({\n key: 'return',\n handler: () => {\n manager.selectCurrent()\n return true\n },\n description: 'Select screen',\n category: 'navigation',\n when: { focusArea: 'sidebar', hasPrompt: false },\n priority: 30,\n })\n\n // ============================================\n // SCREEN SHORTCUTS (1-9)\n // ============================================\n\n for (let i = 1; i <= 9; i++) {\n bindings.push({\n key: String(i),\n handler: () => {\n const screens = manager.getScreens()\n if (i <= screens.length) {\n manager.setActiveScreen(screens[i - 1]!)\n manager.setSelectedIndex(i - 1)\n return true\n }\n },\n description: `Jump to screen ${i}`,\n category: 'screen',\n when: { hasPrompt: false, isFilterActive: false },\n priority: 15,\n })\n }\n\n // ============================================\n // SCREEN ACTIONS\n // ============================================\n\n bindings.push({\n key: 'c',\n handler: () => {\n const screen = getActiveScreen()\n screen?.clear()\n return true\n },\n description: 'Clear screen',\n category: 'screen',\n when: { focusArea: 'content', hasPrompt: false, isFilterActive: false },\n priority: 15,\n })\n\n return bindings\n}\n\n/**\n * Handle printable character input for prompts and filter.\n * This should be called for any key not handled by bindings.\n */\nexport function handlePrintableInput(\n key: KeyEvent,\n context: KeyboardContext,\n handlers: BindingHandlers,\n): boolean {\n // Only handle single printable characters without modifiers\n if (!key.sequence || key.sequence.length !== 1 || key.ctrl || key.meta) {\n return false\n }\n\n const charCode = key.sequence.charCodeAt(0)\n // Printable ASCII (space to tilde)\n if (charCode < 32 || charCode > 126) {\n return false\n }\n\n // Handle filter input\n if (context.isFilterActive) {\n handlers.filterAppendChar(key.sequence)\n return true\n }\n\n // Handle prompt input mode\n if (context.hasPrompt && context.inInputMode) {\n const screen = handlers.getActiveScreen()\n screen?.promptAppendInput(key.sequence)\n return true\n }\n\n return false\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 { 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 { ScreenManager } 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: ScreenManager\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"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { t as ScreenManagerBridge } from "./screen_manager_bridge-Dfg4QUrl.mjs";
1
+ import { t as ScreenManagerBridge } from "./screen_manager_bridge-D2BBwKcF.mjs";
2
2
 
3
3
  export { ScreenManagerBridge };
@@ -95,6 +95,10 @@ let _opentui_react = require("@opentui/react");
95
95
  fail: {
96
96
  icon: "✗",
97
97
  color: "#EF4444"
98
+ },
99
+ static: {
100
+ icon: "●",
101
+ color: "#3B82F6"
98
102
  }
99
103
  },
100
104
  separator: {
@@ -253,6 +257,10 @@ let _opentui_react = require("@opentui/react");
253
257
  fail: {
254
258
  icon: "✗",
255
259
  color: "#DC2626"
260
+ },
261
+ static: {
262
+ icon: "●",
263
+ color: "#2563EB"
256
264
  }
257
265
  },
258
266
  separator: {
@@ -417,6 +425,10 @@ let _opentui_react = require("@opentui/react");
417
425
  fail: {
418
426
  icon: "✗",
419
427
  color: "#EF4444"
428
+ },
429
+ static: {
430
+ icon: "●",
431
+ color: "#00FFFF"
420
432
  }
421
433
  },
422
434
  separator: {
@@ -3354,4 +3366,4 @@ Object.defineProperty(exports, 'useTheme', {
3354
3366
  return useTheme;
3355
3367
  }
3356
3368
  });
3357
- //# sourceMappingURL=screen_manager_bridge-BpDgVu3e.cjs.map
3369
+ //# sourceMappingURL=screen_manager_bridge-hMUrLiBP.cjs.map