@mks2508/mks-ui 0.3.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react-ui/blocks/Terminal/ResttyAdapter.d.ts +146 -0
- package/dist/react-ui/blocks/Terminal/ResttyAdapter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/ResttyAdapter.js +213 -0
- package/dist/react-ui/blocks/Terminal/Terminal.adapter.d.ts +55 -0
- package/dist/react-ui/blocks/Terminal/Terminal.adapter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/Terminal.adapter.js +68 -0
- package/dist/react-ui/blocks/Terminal/Terminal.theme.d.ts +43 -0
- package/dist/react-ui/blocks/Terminal/Terminal.theme.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/Terminal.theme.js +59 -0
- package/dist/react-ui/blocks/Terminal/Terminal.theme.restty.d.ts +63 -0
- package/dist/react-ui/blocks/Terminal/Terminal.theme.restty.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/Terminal.theme.restty.js +109 -0
- package/dist/react-ui/blocks/Terminal/Terminal.types.d.ts +351 -0
- package/dist/react-ui/blocks/Terminal/Terminal.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.d.ts +46 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.js +168 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.styles.d.ts +21 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.styles.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.styles.js +31 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.types.d.ts +56 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalPanel.d.ts +60 -0
- package/dist/react-ui/blocks/Terminal/TerminalPanel.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalPanel.js +183 -0
- package/dist/react-ui/blocks/Terminal/TerminalRestty.d.ts +111 -0
- package/dist/react-ui/blocks/Terminal/TerminalRestty.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalRestty.js +185 -0
- package/dist/react-ui/blocks/Terminal/TerminalXterm.d.ts +58 -0
- package/dist/react-ui/blocks/Terminal/TerminalXterm.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalXterm.js +143 -0
- package/dist/react-ui/blocks/Terminal/XTermAdapter.d.ts +87 -0
- package/dist/react-ui/blocks/Terminal/XTermAdapter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/XTermAdapter.js +135 -0
- package/dist/react-ui/blocks/Terminal/chrome.d.ts +14 -0
- package/dist/react-ui/blocks/Terminal/chrome.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/chrome.js +6 -0
- package/dist/react-ui/blocks/Terminal/components/LogLineBadges.d.ts +160 -0
- package/dist/react-ui/blocks/Terminal/components/LogLineBadges.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/components/LogLineBadges.js +185 -0
- package/dist/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.d.ts +48 -0
- package/dist/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.js +139 -0
- package/dist/react-ui/blocks/Terminal/components/SyntaxHighlight.d.ts +60 -0
- package/dist/react-ui/blocks/Terminal/components/SyntaxHighlight.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/components/SyntaxHighlight.js +352 -0
- package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge.d.ts +36 -0
- package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge.js +52 -0
- package/dist/react-ui/blocks/Terminal/components/index.d.ts +10 -0
- package/dist/react-ui/blocks/Terminal/components/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/components/index.js +4 -0
- package/dist/react-ui/blocks/Terminal/display.d.ts +20 -0
- package/dist/react-ui/blocks/Terminal/display.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/display.js +9 -0
- package/dist/react-ui/blocks/Terminal/hooks/index.d.ts +11 -0
- package/dist/react-ui/blocks/Terminal/hooks/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/hooks/index.js +2 -0
- package/dist/react-ui/blocks/Terminal/hooks/useTerminalSettings.d.ts +69 -0
- package/dist/react-ui/blocks/Terminal/hooks/useTerminalSettings.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/hooks/useTerminalSettings.js +162 -0
- package/dist/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.d.ts +104 -0
- package/dist/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.js +180 -0
- package/dist/react-ui/blocks/Terminal/index.d.ts +43 -0
- package/dist/react-ui/blocks/Terminal/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/index.js +41 -0
- package/dist/react-ui/blocks/Terminal/panel/LogLinesViewer.d.ts +58 -0
- package/dist/react-ui/blocks/Terminal/panel/LogLinesViewer.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/LogLinesViewer.js +222 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel.d.ts +74 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel.js +168 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.d.ts +42 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.js +175 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterTabs.d.ts +43 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterTabs.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.d.ts +38 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.js +62 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.d.ts +67 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.d.ts +32 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.js +326 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.d.ts +36 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.js +371 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.d.ts +67 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.js +417 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.d.ts +197 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.d.ts +55 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.js +214 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.d.ts +35 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.js +57 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.d.ts +62 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter.d.ts +30 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter.js +126 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader.d.ts +31 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader.js +149 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.d.ts +35 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionControl.d.ts +58 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionControl.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs.d.ts +63 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs.js +245 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.d.ts +24 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.js +225 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector.d.ts +35 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector.js +187 -0
- package/dist/react-ui/blocks/Terminal/panel/index.d.ts +30 -0
- package/dist/react-ui/blocks/Terminal/panel/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module-CNVWCefU.css +60 -0
- package/dist/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.js +5 -0
- package/dist/react-ui/blocks/Terminal/panel/terminal-session-tabs.module-cmyJ11jP.css +60 -0
- package/dist/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.js +5 -0
- package/dist/react-ui/blocks/Terminal/parsing/BadgeFormatter.d.ts +73 -0
- package/dist/react-ui/blocks/Terminal/parsing/BadgeFormatter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/BadgeFormatter.js +136 -0
- package/dist/react-ui/blocks/Terminal/parsing/HttpLogParser.d.ts +117 -0
- package/dist/react-ui/blocks/Terminal/parsing/HttpLogParser.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/HttpLogParser.js +174 -0
- package/dist/react-ui/blocks/Terminal/parsing/LogParser.types.d.ts +221 -0
- package/dist/react-ui/blocks/Terminal/parsing/LogParser.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/LogParserService.d.ts +184 -0
- package/dist/react-ui/blocks/Terminal/parsing/LogParserService.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/LogParserService.js +478 -0
- package/dist/react-ui/blocks/Terminal/parsing/MultilineAggregator.d.ts +173 -0
- package/dist/react-ui/blocks/Terminal/parsing/MultilineAggregator.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/MultilineAggregator.js +313 -0
- package/dist/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.d.ts +181 -0
- package/dist/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.js +221 -0
- package/dist/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.d.ts +69 -0
- package/dist/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.js +142 -0
- package/dist/react-ui/blocks/Terminal/parsing/TableParser.d.ts +125 -0
- package/dist/react-ui/blocks/Terminal/parsing/TableParser.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/TableParser.js +245 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.d.ts +165 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.js +225 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.d.ts +164 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.js +285 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.d.ts +188 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.js +178 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/index.d.ts +12 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/index.d.ts +24 -0
- package/dist/react-ui/blocks/Terminal/parsing/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.d.ts +56 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.d.ts +140 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.js +325 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/index.d.ts +10 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/index.d.ts +11 -0
- package/dist/react-ui/blocks/index.d.ts.map +1 -0
- package/dist/react-ui/icons/lucide-animated/activity.js +1 -1
- package/dist/react-ui/icons/lucide-animated/bell-electric.js +1 -1
- package/dist/react-ui/icons/lucide-animated/bell.js +1 -1
- package/dist/react-ui/icons/lucide-animated/bot.js +1 -1
- package/dist/react-ui/icons/lucide-animated/box.js +1 -1
- package/dist/react-ui/icons/lucide-animated/circle-check.js +1 -1
- package/dist/react-ui/icons/lucide-animated/delete.js +1 -1
- package/dist/react-ui/icons/lucide-animated/download.js +1 -1
- package/dist/react-ui/icons/lucide-animated/home.js +1 -1
- package/dist/react-ui/icons/lucide-animated/layout-panel-top.js +1 -1
- package/dist/react-ui/icons/lucide-animated/plus.js +1 -1
- package/dist/react-ui/icons/lucide-animated/search.js +1 -1
- package/dist/react-ui/icons/lucide-animated/settings.js +1 -1
- package/dist/react-ui/icons/lucide-animated/trending-down.js +1 -1
- package/dist/react-ui/icons/lucide-animated/trending-up.js +1 -1
- package/dist/react-ui/icons/lucide-animated/x.js +1 -1
- package/dist/react-ui/index.js +3 -1
- package/dist/react-ui/lib/icon-wrapper.d.ts +37 -0
- package/dist/react-ui/lib/icon-wrapper.d.ts.map +1 -0
- package/dist/react-ui/lib/icon-wrapper.js +55 -0
- package/dist/react-ui/lib/index.d.ts +1 -0
- package/dist/react-ui/lib/index.d.ts.map +1 -1
- package/dist/react-ui/lib/index.js +1 -0
- package/dist/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.js +2 -0
- package/dist/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.js +2 -0
- package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.js +2 -0
- package/dist/react-ui/primitives/waapi/Morph/useMorph.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Morph/useMorph.js +2 -0
- package/dist/react-ui/primitives/waapi/Reorder/useReorder.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Reorder/useReorder.js +2 -0
- package/dist/react-ui/primitives/waapi/Reorder/useReorderPresence.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Reorder/useReorderPresence.js +2 -0
- package/dist/react-ui/primitives/waapi/core/useAnimationOrchestrator.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/core/useAnimationOrchestrator.js +2 -0
- package/dist/react-ui/primitives/waapi/core/useElementRegistry.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/core/useElementRegistry.js +2 -0
- package/dist/react-ui/primitives/waapi/core/useFLIPAnimation.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/core/useFLIPAnimation.js +2 -0
- package/dist/react-ui/primitives/waapi/core/usePositionCapture.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/core/usePositionCapture.js +2 -0
- package/dist/react-ui/ui/Button/Button.styles.d.ts +1 -1
- package/dist/react-ui/ui/CornerBracket/CornerBracket.styles.d.ts +1 -1
- package/dist/react-ui/ui/CornerBracket/CornerBracket.styles.js +1 -1
- package/dist/react-ui/ui/InputGroup/index.d.ts.map +1 -1
- package/dist/react-ui/ui/InputGroup/index.js +2 -0
- package/dist/react-ui/ui/Tabs/Tabs.styles.d.ts +43 -25
- package/dist/react-ui/ui/Tabs/Tabs.styles.d.ts.map +1 -1
- package/dist/react-ui/ui/Tabs/Tabs.styles.js +105 -13
- package/dist/react-ui/ui/Tabs/Tabs.types.d.ts +6 -3
- package/dist/react-ui/ui/Tabs/Tabs.types.d.ts.map +1 -1
- package/dist/react-ui/ui/Tabs/index.d.ts +18 -9
- package/dist/react-ui/ui/Tabs/index.d.ts.map +1 -1
- package/dist/react-ui/ui/Tabs/index.js +99 -27
- package/dist/react-ui/ui/index.js +1 -0
- package/package.json +84 -29
- package/src/css.d.ts +6 -0
- package/src/react-ui/blocks/Terminal/ResttyAdapter.ts +278 -0
- package/src/react-ui/blocks/Terminal/Terminal.adapter.ts +97 -0
- package/src/react-ui/blocks/Terminal/Terminal.theme.restty.ts +155 -0
- package/src/react-ui/blocks/Terminal/Terminal.theme.ts +80 -0
- package/src/react-ui/blocks/Terminal/Terminal.types.ts +438 -0
- package/src/react-ui/blocks/Terminal/TerminalDisplay.styles.ts +38 -0
- package/src/react-ui/blocks/Terminal/TerminalDisplay.tsx +243 -0
- package/src/react-ui/blocks/Terminal/TerminalDisplay.types.ts +73 -0
- package/src/react-ui/blocks/Terminal/TerminalPanel.tsx +269 -0
- package/src/react-ui/blocks/Terminal/TerminalRestty.tsx +326 -0
- package/src/react-ui/blocks/Terminal/TerminalXterm.tsx +230 -0
- package/src/react-ui/blocks/Terminal/XTermAdapter.ts +163 -0
- package/src/react-ui/blocks/Terminal/chrome.ts +25 -0
- package/src/react-ui/blocks/Terminal/components/LogLineBadges.tsx +316 -0
- package/src/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.tsx +218 -0
- package/src/react-ui/blocks/Terminal/components/SyntaxHighlight.tsx +386 -0
- package/src/react-ui/blocks/Terminal/components/TerminalLogBadge.tsx +67 -0
- package/src/react-ui/blocks/Terminal/components/index.ts +10 -0
- package/src/react-ui/blocks/Terminal/display.ts +46 -0
- package/src/react-ui/blocks/Terminal/hooks/index.ts +22 -0
- package/src/react-ui/blocks/Terminal/hooks/useTerminalSettings.ts +229 -0
- package/src/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.ts +292 -0
- package/src/react-ui/blocks/Terminal/index.ts +111 -0
- package/src/react-ui/blocks/Terminal/panel/LogLinesViewer.tsx +330 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalDebugPanel.tsx +242 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.tsx +202 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalFilterTabs.tsx +140 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.tsx +68 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.ts +85 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.tsx +383 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.tsx +439 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.tsx +550 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.ts +259 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.ts +75 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.tsx +266 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.ts +82 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelFooter.tsx +112 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelHeader.tsx +178 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.tsx +203 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalSessionControl.tsx +252 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalSessionTabs.tsx +334 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.tsx +261 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalThemeSelector.tsx +248 -0
- package/src/react-ui/blocks/Terminal/panel/index.ts +72 -0
- package/src/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.css +59 -0
- package/src/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.css +59 -0
- package/src/react-ui/blocks/Terminal/parsing/BadgeFormatter.ts +180 -0
- package/src/react-ui/blocks/Terminal/parsing/HttpLogParser.ts +248 -0
- package/src/react-ui/blocks/Terminal/parsing/LogParser.types.ts +283 -0
- package/src/react-ui/blocks/Terminal/parsing/LogParserService.ts +686 -0
- package/src/react-ui/blocks/Terminal/parsing/MultilineAggregator.ts +466 -0
- package/src/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.ts +343 -0
- package/src/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.ts +167 -0
- package/src/react-ui/blocks/Terminal/parsing/TableParser.ts +348 -0
- package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.ts +251 -0
- package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.ts +390 -0
- package/src/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.ts +320 -0
- package/src/react-ui/blocks/Terminal/parsing/ansi/index.ts +20 -0
- package/src/react-ui/blocks/Terminal/parsing/index.ts +69 -0
- package/src/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.ts +68 -0
- package/src/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.ts +436 -0
- package/src/react-ui/blocks/Terminal/parsing/levels/index.ts +14 -0
- package/src/react-ui/blocks/index.ts +11 -0
- package/src/react-ui/icons/lucide-animated/activity.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/bell-electric.tsx +1 -1
- package/src/react-ui/icons/lucide-animated/bell.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/bot.tsx +1 -1
- package/src/react-ui/icons/lucide-animated/box.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/circle-check.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/delete.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/download.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/home.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/layout-panel-top.tsx +1 -1
- package/src/react-ui/icons/lucide-animated/plus.tsx +1 -1
- package/src/react-ui/icons/lucide-animated/search.tsx +1 -1
- package/src/react-ui/icons/lucide-animated/settings.tsx +1 -1
- package/src/react-ui/icons/lucide-animated/trending-down.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/trending-up.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/x.tsx +2 -2
- package/src/react-ui/lib/icon-wrapper.tsx +70 -0
- package/src/react-ui/lib/index.ts +1 -0
- package/src/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.ts +1 -0
- package/src/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.ts +1 -0
- package/src/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.ts +1 -0
- package/src/react-ui/primitives/waapi/Morph/useMorph.ts +1 -0
- package/src/react-ui/primitives/waapi/Reorder/useReorder.ts +1 -0
- package/src/react-ui/primitives/waapi/Reorder/useReorderPresence.ts +1 -0
- package/src/react-ui/primitives/waapi/core/useAnimationOrchestrator.ts +1 -0
- package/src/react-ui/primitives/waapi/core/useElementRegistry.ts +1 -0
- package/src/react-ui/primitives/waapi/core/useFLIPAnimation.ts +1 -0
- package/src/react-ui/primitives/waapi/core/usePositionCapture.ts +1 -0
- package/src/react-ui/ui/Accordion/index.tsx +3 -3
- package/src/react-ui/ui/CornerBracket/CornerBracket.styles.ts +1 -1
- package/src/react-ui/ui/InputGroup/index.tsx +2 -0
- package/src/react-ui/ui/Tabs/Tabs.css +39 -0
- package/src/react-ui/ui/Tabs/Tabs.styles.ts +119 -31
- package/src/react-ui/ui/Tabs/Tabs.types.ts +8 -3
- package/src/react-ui/ui/Tabs/index.tsx +135 -27
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multiline log aggregator for JSON and structured data.
|
|
3
|
+
*
|
|
4
|
+
* Detects and aggregates multiline log entries such as JSON objects,
|
|
5
|
+
* tables, and structured data that span multiple lines. Prevents
|
|
6
|
+
* timestamp/level repetition on continuation lines.
|
|
7
|
+
*
|
|
8
|
+
* @module components/devenv/terminal/parsing/multiline
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { IParsedLogEntry, TLogLevel } from './LogParser.types';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Box-drawing characters used for table borders.
|
|
15
|
+
* Unicode range: U+2500-U+257F
|
|
16
|
+
*/
|
|
17
|
+
const TABLE_CHARS = [
|
|
18
|
+
'─', '│', '┌', '┐', '└', '┘',
|
|
19
|
+
'├', '┤', '┬', '┴', '┼',
|
|
20
|
+
'═', '║', '╔', '╗', '╚', '╝',
|
|
21
|
+
'╠', '╣', '╦', '╩', '╬',
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Multiline aggregation state.
|
|
26
|
+
*
|
|
27
|
+
* Tracks buffer and context while aggregating multiline logs.
|
|
28
|
+
*/
|
|
29
|
+
export interface IMultilineState {
|
|
30
|
+
/** Buffered lines for current multiline entry */
|
|
31
|
+
buffer: string[];
|
|
32
|
+
|
|
33
|
+
/** Parent entry for continuation lines (only line_number is used) */
|
|
34
|
+
parentEntry?: {
|
|
35
|
+
line_number: number;
|
|
36
|
+
level: TLogLevel;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/** Whether currently in multiline mode */
|
|
40
|
+
isMultiline: boolean;
|
|
41
|
+
|
|
42
|
+
/** Expected closing bracket/brace for current multiline */
|
|
43
|
+
expectedClose?: '}' | ']';
|
|
44
|
+
|
|
45
|
+
/** Current depth of nested braces/brackets */
|
|
46
|
+
depth: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Multiline log aggregator class.
|
|
51
|
+
*
|
|
52
|
+
* Detects and aggregates lines that are part of a multiline JSON
|
|
53
|
+
* or structured data entry. Marks continuation lines so they don't
|
|
54
|
+
* get timestamp/level prefixes.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* const aggregator = new MultilineAggregator();
|
|
59
|
+
* const aggregated = aggregator.aggregate(entries);
|
|
60
|
+
* // Lines like '{', ' filter: {},', '}' get marked as continuation
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export class MultilineAggregator {
|
|
64
|
+
/**
|
|
65
|
+
* Detect if a line is a continuation of multiline JSON/structured data.
|
|
66
|
+
*
|
|
67
|
+
* Continuation indicators:
|
|
68
|
+
* - Line starts with `{` or `[` alone → opens multiline
|
|
69
|
+
* - Line has indentation + `key: value,` → continuation
|
|
70
|
+
* - Line is just `}` or `]` → closes multiline
|
|
71
|
+
* - Line ends with `{` or `[` without match → opens multiline
|
|
72
|
+
* - When in multiline mode: lines ending with comma or containing key-value patterns
|
|
73
|
+
*
|
|
74
|
+
* @param line - Line to check
|
|
75
|
+
* @param state - Current multiline state
|
|
76
|
+
* @returns true if line is a continuation
|
|
77
|
+
*/
|
|
78
|
+
detectContinuation(line: string, state: IMultilineState): boolean {
|
|
79
|
+
const trimmed = line.trim();
|
|
80
|
+
|
|
81
|
+
// Already in multiline mode - more permissive detection
|
|
82
|
+
if (state.isMultiline) {
|
|
83
|
+
// Check if this closes the multiline
|
|
84
|
+
if (this.isClosingBrace(trimmed, state.expectedClose)) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
// Check if this opens another level
|
|
88
|
+
if (this.isOpeningBrace(trimmed)) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
// Check if this looks like a continuation (indented content)
|
|
92
|
+
if (this.isContinuationLine(line)) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
// NEW: When in multiline mode, lines ending with comma or containing JSON patterns
|
|
96
|
+
// are continuations even if they have their own timestamp/level metadata
|
|
97
|
+
if (this.isJsonContinuation(trimmed)) {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Not in multiline mode - check if this opens one
|
|
104
|
+
return this.opensMultiline(trimmed);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Aggregate entries, marking continuation lines.
|
|
109
|
+
*
|
|
110
|
+
* Processes entries and marks lines that are continuations
|
|
111
|
+
* of a previous multiline entry. Handles:
|
|
112
|
+
* - JSON/structured data blocks
|
|
113
|
+
* - Table borders (box-drawing characters)
|
|
114
|
+
* - Indented continuation lines
|
|
115
|
+
*
|
|
116
|
+
* @param entries - Parsed log entries to aggregate
|
|
117
|
+
* @param initialState - Optional initial multiline state (for persistence across chunks)
|
|
118
|
+
* @returns Entries with continuation marking and new multiline state
|
|
119
|
+
*/
|
|
120
|
+
aggregate(entries: IParsedLogEntry[], initialState?: IMultilineState): { entries: IParsedLogEntry[]; state: IMultilineState } {
|
|
121
|
+
const result: IParsedLogEntry[] = [];
|
|
122
|
+
const state: IMultilineState = initialState ?? {
|
|
123
|
+
buffer: [],
|
|
124
|
+
isMultiline: false,
|
|
125
|
+
depth: 0,
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
for (const entry of entries) {
|
|
129
|
+
const raw = entry.raw;
|
|
130
|
+
const trimmed = raw.trim();
|
|
131
|
+
|
|
132
|
+
// Skip empty lines (end previous blocks)
|
|
133
|
+
if (trimmed.length === 0) {
|
|
134
|
+
if (state.isMultiline) {
|
|
135
|
+
// End the current block
|
|
136
|
+
state.isMultiline = false;
|
|
137
|
+
state.buffer = [];
|
|
138
|
+
state.parentEntry = undefined;
|
|
139
|
+
state.depth = 0;
|
|
140
|
+
state.expectedClose = undefined;
|
|
141
|
+
}
|
|
142
|
+
// Don't add empty lines to result
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Check if this line starts a multiline block
|
|
147
|
+
if (!state.isMultiline && this.opensMultiline(trimmed)) {
|
|
148
|
+
// This is the start of multiline
|
|
149
|
+
state.isMultiline = true;
|
|
150
|
+
state.parentEntry = entry;
|
|
151
|
+
state.depth = this.countOpeningBraces(trimmed);
|
|
152
|
+
state.expectedClose = this.getExpectedClose(trimmed);
|
|
153
|
+
|
|
154
|
+
// Mark entry as multiline start (not a continuation)
|
|
155
|
+
entry.is_continuation = false;
|
|
156
|
+
result.push(entry);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Check if this is a continuation line
|
|
161
|
+
if (state.isMultiline) {
|
|
162
|
+
// Check if this line closes the multiline
|
|
163
|
+
if (this.isClosingBrace(trimmed, state.expectedClose)) {
|
|
164
|
+
state.depth--;
|
|
165
|
+
if (state.depth <= 0) {
|
|
166
|
+
// This closes the multiline block
|
|
167
|
+
entry.is_continuation = true;
|
|
168
|
+
entry.parent_line_number = state.parentEntry?.line_number;
|
|
169
|
+
result.push(entry);
|
|
170
|
+
|
|
171
|
+
// Reset state
|
|
172
|
+
state.isMultiline = false;
|
|
173
|
+
state.buffer = [];
|
|
174
|
+
state.parentEntry = undefined;
|
|
175
|
+
state.depth = 0;
|
|
176
|
+
state.expectedClose = undefined;
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Check if this opens another level
|
|
182
|
+
if (this.isOpeningBrace(trimmed)) {
|
|
183
|
+
state.depth += this.countOpeningBraces(trimmed);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Check if this looks like a continuation (even with timestamp)
|
|
187
|
+
if (this.isJsonContinuation(trimmed)) {
|
|
188
|
+
entry.is_continuation = true;
|
|
189
|
+
entry.parent_line_number = state.parentEntry?.line_number;
|
|
190
|
+
result.push(entry);
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// If we're in multiline mode but this line doesn't look like a continuation,
|
|
195
|
+
// it might be a new log entry ending the multiline block
|
|
196
|
+
if (this.looksLikeNewEntry(trimmed)) {
|
|
197
|
+
// End the multiline block
|
|
198
|
+
state.isMultiline = false;
|
|
199
|
+
state.parentEntry = undefined;
|
|
200
|
+
state.depth = 0;
|
|
201
|
+
state.expectedClose = undefined;
|
|
202
|
+
|
|
203
|
+
// Check if this new line also starts a multiline
|
|
204
|
+
if (this.opensMultiline(trimmed)) {
|
|
205
|
+
state.isMultiline = true;
|
|
206
|
+
state.parentEntry = entry;
|
|
207
|
+
state.depth = this.countOpeningBraces(trimmed);
|
|
208
|
+
state.expectedClose = this.getExpectedClose(trimmed);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
entry.is_continuation = false;
|
|
212
|
+
result.push(entry);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Default: treat as continuation if in multiline mode
|
|
217
|
+
entry.is_continuation = true;
|
|
218
|
+
entry.parent_line_number = state.parentEntry?.line_number;
|
|
219
|
+
result.push(entry);
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Normal line, not part of multiline
|
|
224
|
+
entry.is_continuation = false;
|
|
225
|
+
result.push(entry);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return { entries: result, state };
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Check if a line opens a multiline block.
|
|
233
|
+
*
|
|
234
|
+
* @param trimmed - Trimmed line to check
|
|
235
|
+
* @returns true if line opens multiline
|
|
236
|
+
* @private
|
|
237
|
+
*/
|
|
238
|
+
private opensMultiline(trimmed: string): boolean {
|
|
239
|
+
// Line is just an opening brace
|
|
240
|
+
if (trimmed === '{' || trimmed === '[') {
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Line ends with opening brace without match
|
|
245
|
+
const openCount = (trimmed.match(/\{/g) ?? []).length;
|
|
246
|
+
const closeCount = (trimmed.match(/\}/g) ?? []).length;
|
|
247
|
+
const bracketOpen = (trimmed.match(/\[/g) ?? []).length;
|
|
248
|
+
const bracketClose = (trimmed.match(/\]/g) ?? []).length;
|
|
249
|
+
|
|
250
|
+
// More opening than closing = multiline start
|
|
251
|
+
if ((openCount > closeCount) || (bracketOpen > bracketClose)) {
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Line ends with opening brace (e.g., "GET /api/endpoint {")
|
|
256
|
+
if (trimmed.endsWith('{') || trimmed.endsWith('[')) {
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Check if a line is an opening brace/bracket.
|
|
265
|
+
*
|
|
266
|
+
* @param trimmed - Trimmed line to check
|
|
267
|
+
* @returns true if line contains opening brace/bracket
|
|
268
|
+
* @private
|
|
269
|
+
*/
|
|
270
|
+
private isOpeningBrace(trimmed: string): boolean {
|
|
271
|
+
return trimmed.includes('{') || trimmed.includes('[');
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Check if a line is a closing brace/bracket for expected type.
|
|
276
|
+
*
|
|
277
|
+
* @param trimmed - Trimmed line to check
|
|
278
|
+
* @param expected - Expected close type
|
|
279
|
+
* @returns true if line closes the multiline block
|
|
280
|
+
* @private
|
|
281
|
+
*/
|
|
282
|
+
private isClosingBrace(trimmed: string, expected?: '}' | ']'): boolean {
|
|
283
|
+
if (!expected) return false;
|
|
284
|
+
|
|
285
|
+
if (expected === '}' && trimmed === '}') {
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
if (expected === ']' && trimmed === ']') {
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Get the expected closing character for a line.
|
|
297
|
+
*
|
|
298
|
+
* @param trimmed - Trimmed line to check
|
|
299
|
+
* @returns Expected closing character or undefined
|
|
300
|
+
* @private
|
|
301
|
+
*/
|
|
302
|
+
private getExpectedClose(trimmed: string): '}' | ']' | undefined {
|
|
303
|
+
if (trimmed.includes('{')) return '}';
|
|
304
|
+
if (trimmed.includes('[')) return ']';
|
|
305
|
+
return undefined;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Count opening braces/brackets in a line.
|
|
310
|
+
*
|
|
311
|
+
* @param trimmed - Trimmed line to check
|
|
312
|
+
* @returns Count of opening braces/brackets
|
|
313
|
+
* @private
|
|
314
|
+
*/
|
|
315
|
+
private countOpeningBraces(trimmed: string): number {
|
|
316
|
+
const openCount = (trimmed.match(/\{/g) ?? []).length;
|
|
317
|
+
const bracketOpen = (trimmed.match(/\[/g) ?? []).length;
|
|
318
|
+
return openCount + bracketOpen;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Check if a line is a table line (contains box-drawing characters).
|
|
323
|
+
*
|
|
324
|
+
* @param trimmed - Trimmed line to check
|
|
325
|
+
* @returns true if line contains table borders
|
|
326
|
+
* @private
|
|
327
|
+
*/
|
|
328
|
+
private isTableLine(trimmed: string): boolean {
|
|
329
|
+
// Check if line contains multiple box-drawing characters
|
|
330
|
+
// (to avoid false positives on single characters)
|
|
331
|
+
let count = 0;
|
|
332
|
+
for (const char of TABLE_CHARS) {
|
|
333
|
+
if (trimmed.includes(char)) count++;
|
|
334
|
+
if (count >= 2) return true;
|
|
335
|
+
}
|
|
336
|
+
return count >= 2;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Check if a line looks like a new log entry (not a continuation).
|
|
341
|
+
*
|
|
342
|
+
* New entries typically start with:
|
|
343
|
+
* - Timestamp followed by log level
|
|
344
|
+
* - HTTP method followed by path
|
|
345
|
+
* - Component/module tag
|
|
346
|
+
*
|
|
347
|
+
* @param trimmed - Trimmed line to check
|
|
348
|
+
* @returns true if line looks like a new entry
|
|
349
|
+
* @private
|
|
350
|
+
*/
|
|
351
|
+
private looksLikeNewEntry(trimmed: string): boolean {
|
|
352
|
+
// Pattern: timestamp followed by level (e.g., "01:18:52 INFO")
|
|
353
|
+
const timestampLevelPattern = /^\d{1,2}:\d{2}:\d{2}(\.\d+)?\s+(TRACE|DEBUG|INFO|WARN|ERROR|FATAL)/i;
|
|
354
|
+
if (timestampLevelPattern.test(trimmed)) {
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Pattern: ISO timestamp followed by level
|
|
359
|
+
const isoTimestampPattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/;
|
|
360
|
+
if (isoTimestampPattern.test(trimmed)) {
|
|
361
|
+
return true;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Pattern: HTTP method at start (e.g., "GET /api/...")
|
|
365
|
+
const httpPattern = /^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS|CONNECT|TRACE)\s+/i;
|
|
366
|
+
if (httpPattern.test(trimmed)) {
|
|
367
|
+
return true;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Pattern: Component tag at start (e.g., "⦗API⦘")
|
|
371
|
+
if (trimmed.startsWith('⦗') && trimmed.includes('⦘')) {
|
|
372
|
+
return true;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Check if a trimmed line is a JSON/structured data continuation.
|
|
380
|
+
*
|
|
381
|
+
* This handles lines that have their own timestamp/level metadata
|
|
382
|
+
* but are actually continuations of a multiline JSON block.
|
|
383
|
+
*
|
|
384
|
+
* Examples:
|
|
385
|
+
* - `container: "name",` - ends with comma
|
|
386
|
+
* - `tail: 100,` - ends with comma
|
|
387
|
+
* - `key: "value"` - key-value pattern
|
|
388
|
+
* - `}` - closing brace
|
|
389
|
+
* - Lines with pipe characters (table rows)
|
|
390
|
+
*
|
|
391
|
+
* @param trimmed - Trimmed line to check
|
|
392
|
+
* @returns true if line is a JSON continuation
|
|
393
|
+
* @private
|
|
394
|
+
*/
|
|
395
|
+
private isJsonContinuation(trimmed: string): boolean {
|
|
396
|
+
// Line is just a closing brace - closes the multiline
|
|
397
|
+
if (trimmed === '}' || trimmed === ']') {
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Line ends with comma - likely JSON continuation
|
|
402
|
+
if (trimmed.endsWith(',')) {
|
|
403
|
+
return true;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// Line ends with opening brace - extends multiline
|
|
407
|
+
if (trimmed.endsWith('{') || trimmed.endsWith('[')) {
|
|
408
|
+
return true;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// Line contains pipe characters (table row with content)
|
|
412
|
+
// Pattern: │ key │ value │
|
|
413
|
+
if (trimmed.includes('│') && !this.isTableLine(trimmed)) {
|
|
414
|
+
// Has pipe but not enough box-drawing chars to be a border line
|
|
415
|
+
// This is likely a table content row
|
|
416
|
+
return true;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// Check for key-value pattern after timestamp/level removal
|
|
420
|
+
// Remove common prefixes: "01:18:52 INFO " or "[INFO] "
|
|
421
|
+
let content = trimmed
|
|
422
|
+
.replace(/^\d{1,2}:\d{2}:\d{2}(\.\d+)?\s+(TRACE|DEBUG|INFO|WARN|ERROR|FATAL)\s*/i, '')
|
|
423
|
+
.replace(/^\[(TRACE|DEBUG|INFO|WARN|ERROR|FATAL)\]\s*/i, '')
|
|
424
|
+
.replace(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.*?\s+/, '')
|
|
425
|
+
.trim();
|
|
426
|
+
|
|
427
|
+
// Pattern: "key": value or key: value or "key": "value"
|
|
428
|
+
const keyValuePatterns = [
|
|
429
|
+
/^[\w"']+\s*:\s*[\w"'\{[]/, // "key": { or key: [
|
|
430
|
+
/^[\w"']+\s*:\s*".*",?\s*$/, // "key": "value",
|
|
431
|
+
/^[\w"']+\s*:\s*\d+/, // key: 123
|
|
432
|
+
/^[\w"']+\s*:\s*true|false/, // key: true
|
|
433
|
+
];
|
|
434
|
+
|
|
435
|
+
if (keyValuePatterns.some(pattern => pattern.test(content))) {
|
|
436
|
+
return true;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Check if a line looks like a continuation line (indented content).
|
|
444
|
+
*
|
|
445
|
+
* @param line - Line to check (not trimmed, to check indentation)
|
|
446
|
+
* @returns true if line appears to be a continuation
|
|
447
|
+
* @private
|
|
448
|
+
*/
|
|
449
|
+
private isContinuationLine(line: string): boolean {
|
|
450
|
+
// Check if line starts with whitespace (indented)
|
|
451
|
+
return line.length > 0 && (line[0] === ' ' || line[0] === '\t');
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Create initial multiline state.
|
|
456
|
+
*
|
|
457
|
+
* @returns Fresh multiline state
|
|
458
|
+
*/
|
|
459
|
+
createInitialState(): IMultilineState {
|
|
460
|
+
return {
|
|
461
|
+
buffer: [],
|
|
462
|
+
isMultiline: false,
|
|
463
|
+
depth: 0,
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
}
|