dexto 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -15
- package/dist/agents/agent-registry.json +9 -0
- package/dist/agents/coding-agent/coding-agent.yml +5 -0
- package/dist/agents/default-agent.yml +2 -2
- package/dist/api/server-hono.d.ts.map +1 -1
- package/dist/api/server-hono.js +39 -5
- package/dist/cli/cli-subscriber.d.ts.map +1 -1
- package/dist/cli/cli-subscriber.js +7 -1
- package/dist/cli/commands/helpers/formatters.d.ts.map +1 -1
- package/dist/cli/commands/helpers/formatters.js +2 -1
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +14 -40
- package/dist/cli/commands/interactive-commands/command-parser.d.ts +17 -14
- package/dist/cli/commands/interactive-commands/command-parser.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/command-parser.js +0 -15
- package/dist/cli/commands/interactive-commands/commands.d.ts +4 -4
- package/dist/cli/commands/interactive-commands/commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/commands.js +34 -42
- package/dist/cli/commands/interactive-commands/documentation-commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/documentation-commands.js +4 -7
- package/dist/cli/commands/interactive-commands/general-commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/general-commands.js +159 -117
- package/dist/cli/commands/interactive-commands/mcp/index.d.ts +9 -3
- package/dist/cli/commands/interactive-commands/mcp/index.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/mcp/index.js +18 -3
- package/dist/cli/commands/interactive-commands/model/index.d.ts +8 -6
- package/dist/cli/commands/interactive-commands/model/index.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/model/index.js +18 -6
- package/dist/cli/commands/interactive-commands/prompt-commands.d.ts +3 -2
- package/dist/cli/commands/interactive-commands/prompt-commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/prompt-commands.js +69 -52
- package/dist/cli/commands/interactive-commands/session/index.d.ts +7 -12
- package/dist/cli/commands/interactive-commands/session/index.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/session/index.js +7 -14
- package/dist/cli/commands/interactive-commands/session/session-commands.d.ts +10 -24
- package/dist/cli/commands/interactive-commands/session/session-commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/session/session-commands.js +16 -371
- package/dist/cli/commands/interactive-commands/system/system-commands.d.ts +1 -0
- package/dist/cli/commands/interactive-commands/system/system-commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/system/system-commands.js +103 -74
- package/dist/cli/commands/interactive-commands/tool-commands.d.ts +1 -1
- package/dist/cli/commands/interactive-commands/tool-commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/tool-commands.js +5 -62
- package/dist/cli/commands/interactive-commands/utils/command-output.d.ts +13 -17
- package/dist/cli/commands/interactive-commands/utils/command-output.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/utils/command-output.js +18 -37
- package/dist/cli/commands/list-agents.d.ts +2 -2
- package/dist/cli/commands/list-agents.d.ts.map +1 -1
- package/dist/cli/commands/list-agents.js +36 -32
- package/dist/cli/commands/uninstall.d.ts.map +1 -1
- package/dist/cli/commands/uninstall.js +4 -6
- package/dist/cli/commands/which.d.ts.map +1 -1
- package/dist/cli/commands/which.js +17 -3
- package/dist/cli/ink-cli/InkCLIRefactored.d.ts +9 -22
- package/dist/cli/ink-cli/InkCLIRefactored.d.ts.map +1 -1
- package/dist/cli/ink-cli/InkCLIRefactored.js +50 -133
- package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts +24 -3
- package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ApprovalPrompt.js +160 -45
- package/dist/cli/ink-cli/components/ElicitationForm.d.ts +22 -0
- package/dist/cli/ink-cli/components/ElicitationForm.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/ElicitationForm.js +358 -0
- package/dist/cli/ink-cli/components/Footer.d.ts +16 -0
- package/dist/cli/ink-cli/components/Footer.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/Footer.js +27 -0
- package/dist/cli/ink-cli/components/HistorySearchBar.d.ts +17 -0
- package/dist/cli/ink-cli/components/HistorySearchBar.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/HistorySearchBar.js +8 -0
- package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts +15 -2
- package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ResourceAutocomplete.js +126 -82
- package/dist/cli/ink-cli/components/SlashCommandAutocomplete.d.ts +15 -2
- package/dist/cli/ink-cli/components/SlashCommandAutocomplete.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/SlashCommandAutocomplete.js +228 -122
- package/dist/cli/ink-cli/components/StatusBar.d.ts +15 -2
- package/dist/cli/ink-cli/components/StatusBar.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/StatusBar.js +46 -8
- package/dist/cli/ink-cli/components/TextBufferInput.d.ts +52 -0
- package/dist/cli/ink-cli/components/TextBufferInput.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/TextBufferInput.js +471 -0
- package/dist/cli/ink-cli/components/base/BaseSelector.d.ts +11 -1
- package/dist/cli/ink-cli/components/base/BaseSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/base/BaseSelector.js +90 -49
- package/dist/cli/ink-cli/components/chat/Header.d.ts +1 -0
- package/dist/cli/ink-cli/components/chat/Header.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/chat/Header.js +7 -2
- package/dist/cli/ink-cli/components/chat/MessageItem.d.ts +3 -0
- package/dist/cli/ink-cli/components/chat/MessageItem.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/chat/MessageItem.js +95 -9
- package/dist/cli/ink-cli/components/chat/MessageList.js +1 -1
- package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.d.ts +16 -0
- package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.js +27 -0
- package/dist/cli/ink-cli/components/chat/ToolIcon.d.ts +4 -2
- package/dist/cli/ink-cli/components/chat/ToolIcon.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/chat/ToolIcon.js +19 -5
- package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.d.ts +10 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.js +6 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.d.ts +10 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.js +15 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.d.ts +10 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.js +9 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.d.ts +10 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.js +37 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.d.ts +10 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.js +9 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.d.ts +10 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.js +6 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.d.ts +10 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.js +29 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.d.ts +45 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.js +38 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/SyspromptBox.d.ts +10 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/SyspromptBox.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/SyspromptBox.js +6 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/index.d.ts +13 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/index.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/chat/styled-boxes/index.js +12 -0
- package/dist/cli/ink-cli/components/input/InputArea.d.ts +36 -8
- package/dist/cli/ink-cli/components/input/InputArea.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/input/InputArea.js +3 -3
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts +25 -0
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.js +166 -0
- package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts +27 -0
- package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/modes/StaticCLI.js +95 -0
- package/dist/cli/ink-cli/components/modes/index.d.ts +10 -0
- package/dist/cli/ink-cli/components/modes/index.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/modes/index.js +9 -0
- package/dist/cli/ink-cli/components/overlays/ApiKeyInput.d.ts +26 -0
- package/dist/cli/ink-cli/components/overlays/ApiKeyInput.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/ApiKeyInput.js +92 -0
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts +21 -0
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.js +177 -0
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts +22 -0
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.js +59 -0
- package/dist/cli/ink-cli/components/overlays/McpAddChoice.d.ts +22 -0
- package/dist/cli/ink-cli/components/overlays/McpAddChoice.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/McpAddChoice.js +59 -0
- package/dist/cli/ink-cli/components/overlays/McpAddSelector.d.ts +26 -0
- package/dist/cli/ink-cli/components/overlays/McpAddSelector.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/McpAddSelector.js +73 -0
- package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.d.ts +21 -0
- package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.js +51 -0
- package/dist/cli/ink-cli/components/overlays/McpCustomWizard.d.ts +29 -0
- package/dist/cli/ink-cli/components/overlays/McpCustomWizard.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/McpCustomWizard.js +215 -0
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.d.ts +22 -0
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.js +74 -0
- package/dist/cli/ink-cli/components/overlays/McpSelector.d.ts +21 -0
- package/dist/cli/ink-cli/components/overlays/McpSelector.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/McpSelector.js +52 -0
- package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts +28 -0
- package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/McpServerActions.js +84 -0
- package/dist/cli/ink-cli/components/overlays/McpServerList.d.ts +29 -0
- package/dist/cli/ink-cli/components/overlays/McpServerList.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/McpServerList.js +109 -0
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts +15 -8
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.js +247 -24
- package/dist/cli/ink-cli/components/overlays/PromptAddChoice.d.ts +22 -0
- package/dist/cli/ink-cli/components/overlays/PromptAddChoice.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/PromptAddChoice.js +52 -0
- package/dist/cli/ink-cli/components/overlays/PromptAddWizard.d.ts +29 -0
- package/dist/cli/ink-cli/components/overlays/PromptAddWizard.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/PromptAddWizard.js +166 -0
- package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.d.ts +27 -0
- package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.js +119 -0
- package/dist/cli/ink-cli/components/overlays/PromptList.d.ts +33 -0
- package/dist/cli/ink-cli/components/overlays/PromptList.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/PromptList.js +144 -0
- package/dist/cli/ink-cli/components/overlays/SearchOverlay.d.ts +23 -0
- package/dist/cli/ink-cli/components/overlays/SearchOverlay.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/SearchOverlay.js +189 -0
- package/dist/cli/ink-cli/components/overlays/SessionSelectorRefactored.d.ts +7 -2
- package/dist/cli/ink-cli/components/overlays/SessionSelectorRefactored.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/SessionSelectorRefactored.js +19 -5
- package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.d.ts +21 -0
- package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.js +42 -0
- package/dist/cli/ink-cli/components/overlays/StreamSelector.d.ts +20 -0
- package/dist/cli/ink-cli/components/overlays/StreamSelector.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/StreamSelector.js +58 -0
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts +25 -0
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.js +400 -0
- package/dist/cli/ink-cli/components/renderers/DiffRenderer.d.ts +21 -0
- package/dist/cli/ink-cli/components/renderers/DiffRenderer.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/renderers/DiffRenderer.js +65 -0
- package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.d.ts +28 -0
- package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.js +66 -0
- package/dist/cli/ink-cli/components/renderers/FileRenderer.d.ts +19 -0
- package/dist/cli/ink-cli/components/renderers/FileRenderer.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/renderers/FileRenderer.js +26 -0
- package/dist/cli/ink-cli/components/renderers/GenericRenderer.d.ts +21 -0
- package/dist/cli/ink-cli/components/renderers/GenericRenderer.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/renderers/GenericRenderer.js +26 -0
- package/dist/cli/ink-cli/components/renderers/SearchRenderer.d.ts +20 -0
- package/dist/cli/ink-cli/components/renderers/SearchRenderer.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/renderers/SearchRenderer.js +12 -0
- package/dist/cli/ink-cli/components/renderers/ShellRenderer.d.ts +21 -0
- package/dist/cli/ink-cli/components/renderers/ShellRenderer.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/renderers/ShellRenderer.js +25 -0
- package/dist/cli/ink-cli/components/renderers/diff-shared.d.ts +61 -0
- package/dist/cli/ink-cli/components/renderers/diff-shared.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/renderers/diff-shared.js +158 -0
- package/dist/cli/ink-cli/components/renderers/index.d.ts +28 -0
- package/dist/cli/ink-cli/components/renderers/index.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/renderers/index.js +36 -0
- package/dist/cli/ink-cli/components/shared/MarkdownText.d.ts +38 -0
- package/dist/cli/ink-cli/components/shared/MarkdownText.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/shared/MarkdownText.js +360 -0
- package/dist/cli/ink-cli/components/shared/VirtualizedList.d.ts +44 -0
- package/dist/cli/ink-cli/components/shared/VirtualizedList.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/shared/VirtualizedList.js +300 -0
- package/dist/cli/ink-cli/components/shared/text-buffer.d.ts +185 -0
- package/dist/cli/ink-cli/components/shared/text-buffer.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/shared/text-buffer.js +1338 -0
- package/dist/cli/ink-cli/constants/processingPhrases.d.ts +10 -0
- package/dist/cli/ink-cli/constants/processingPhrases.d.ts.map +1 -0
- package/dist/cli/ink-cli/constants/processingPhrases.js +64 -0
- package/dist/cli/ink-cli/constants/tips.d.ts +15 -0
- package/dist/cli/ink-cli/constants/tips.d.ts.map +1 -0
- package/dist/cli/ink-cli/constants/tips.js +53 -0
- package/dist/cli/ink-cli/containers/InputContainer.d.ts +42 -8
- package/dist/cli/ink-cli/containers/InputContainer.d.ts.map +1 -1
- package/dist/cli/ink-cli/containers/InputContainer.js +491 -85
- package/dist/cli/ink-cli/containers/OverlayContainer.d.ts +23 -5
- package/dist/cli/ink-cli/containers/OverlayContainer.d.ts.map +1 -1
- package/dist/cli/ink-cli/containers/OverlayContainer.js +1156 -130
- package/dist/cli/ink-cli/containers/index.d.ts +1 -1
- package/dist/cli/ink-cli/containers/index.d.ts.map +1 -1
- package/dist/cli/ink-cli/contexts/KeypressContext.d.ts +36 -0
- package/dist/cli/ink-cli/contexts/KeypressContext.d.ts.map +1 -0
- package/dist/cli/ink-cli/contexts/KeypressContext.js +461 -0
- package/dist/cli/ink-cli/contexts/MouseContext.d.ts +27 -0
- package/dist/cli/ink-cli/contexts/MouseContext.d.ts.map +1 -0
- package/dist/cli/ink-cli/contexts/MouseContext.js +102 -0
- package/dist/cli/ink-cli/contexts/ScrollProvider.d.ts +33 -0
- package/dist/cli/ink-cli/contexts/ScrollProvider.d.ts.map +1 -0
- package/dist/cli/ink-cli/contexts/ScrollProvider.js +170 -0
- package/dist/cli/ink-cli/contexts/index.d.ts +7 -0
- package/dist/cli/ink-cli/contexts/index.d.ts.map +1 -0
- package/dist/cli/ink-cli/contexts/index.js +6 -0
- package/dist/cli/ink-cli/hooks/index.d.ts +5 -0
- package/dist/cli/ink-cli/hooks/index.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/index.js +6 -1
- package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts +26 -9
- package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useAgentEvents.js +86 -198
- package/dist/cli/ink-cli/hooks/useBatchedScroll.d.ts +14 -0
- package/dist/cli/ink-cli/hooks/useBatchedScroll.d.ts.map +1 -0
- package/dist/cli/ink-cli/hooks/useBatchedScroll.js +25 -0
- package/dist/cli/ink-cli/hooks/useCLIState.d.ts +50 -0
- package/dist/cli/ink-cli/hooks/useCLIState.d.ts.map +1 -0
- package/dist/cli/ink-cli/hooks/useCLIState.js +188 -0
- package/dist/cli/ink-cli/hooks/useElapsedTime.d.ts +24 -0
- package/dist/cli/ink-cli/hooks/useElapsedTime.d.ts.map +1 -0
- package/dist/cli/ink-cli/hooks/useElapsedTime.js +69 -0
- package/dist/cli/ink-cli/hooks/useHistorySearch.d.ts +61 -0
- package/dist/cli/ink-cli/hooks/useHistorySearch.d.ts.map +1 -0
- package/dist/cli/ink-cli/hooks/useHistorySearch.js +210 -0
- package/dist/cli/ink-cli/hooks/useInputOrchestrator.d.ts +136 -0
- package/dist/cli/ink-cli/hooks/useInputOrchestrator.d.ts.map +1 -0
- package/dist/cli/ink-cli/hooks/useInputOrchestrator.js +663 -0
- package/dist/cli/ink-cli/hooks/useKeyboardShortcuts.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useKeyboardShortcuts.js +7 -26
- package/dist/cli/ink-cli/hooks/useKeypress.d.ts +18 -0
- package/dist/cli/ink-cli/hooks/useKeypress.d.ts.map +1 -0
- package/dist/cli/ink-cli/hooks/useKeypress.js +26 -0
- package/dist/cli/ink-cli/hooks/usePhraseCycler.d.ts +30 -0
- package/dist/cli/ink-cli/hooks/usePhraseCycler.d.ts.map +1 -0
- package/dist/cli/ink-cli/hooks/usePhraseCycler.js +68 -0
- package/dist/cli/ink-cli/hooks/useStreaming.d.ts +19 -0
- package/dist/cli/ink-cli/hooks/useStreaming.d.ts.map +1 -0
- package/dist/cli/ink-cli/hooks/useStreaming.js +26 -0
- package/dist/cli/ink-cli/hooks/useTerminalSize.d.ts +14 -0
- package/dist/cli/ink-cli/hooks/useTerminalSize.d.ts.map +1 -0
- package/dist/cli/ink-cli/hooks/useTerminalSize.js +31 -0
- package/dist/cli/ink-cli/hooks/useTokenCounter.d.ts +42 -0
- package/dist/cli/ink-cli/hooks/useTokenCounter.d.ts.map +1 -0
- package/dist/cli/ink-cli/hooks/useTokenCounter.js +96 -0
- package/dist/cli/ink-cli/services/CommandService.d.ts +32 -1
- package/dist/cli/ink-cli/services/CommandService.d.ts.map +1 -1
- package/dist/cli/ink-cli/services/CommandService.js +36 -5
- package/dist/cli/ink-cli/services/InputService.d.ts +1 -5
- package/dist/cli/ink-cli/services/InputService.d.ts.map +1 -1
- package/dist/cli/ink-cli/services/InputService.js +1 -8
- package/dist/cli/ink-cli/services/index.d.ts +2 -1
- package/dist/cli/ink-cli/services/index.d.ts.map +1 -1
- package/dist/cli/ink-cli/services/index.js +2 -1
- package/dist/cli/ink-cli/services/processStream.d.ts +69 -0
- package/dist/cli/ink-cli/services/processStream.d.ts.map +1 -0
- package/dist/cli/ink-cli/services/processStream.js +674 -0
- package/dist/cli/ink-cli/state/actions.d.ts +30 -60
- package/dist/cli/ink-cli/state/actions.d.ts.map +1 -1
- package/dist/cli/ink-cli/state/actions.js +3 -0
- package/dist/cli/ink-cli/state/index.d.ts +5 -3
- package/dist/cli/ink-cli/state/index.d.ts.map +1 -1
- package/dist/cli/ink-cli/state/index.js +4 -3
- package/dist/cli/ink-cli/state/initialState.d.ts +4 -3
- package/dist/cli/ink-cli/state/initialState.d.ts.map +1 -1
- package/dist/cli/ink-cli/state/initialState.js +20 -4
- package/dist/cli/ink-cli/state/reducer.d.ts +3 -0
- package/dist/cli/ink-cli/state/reducer.d.ts.map +1 -1
- package/dist/cli/ink-cli/state/reducer.js +62 -168
- package/dist/cli/ink-cli/state/streaming-state.d.ts +27 -0
- package/dist/cli/ink-cli/state/streaming-state.d.ts.map +1 -0
- package/dist/cli/ink-cli/state/streaming-state.js +39 -0
- package/dist/cli/ink-cli/state/types.d.ts +222 -6
- package/dist/cli/ink-cli/state/types.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/bracketedPaste.d.ts +22 -0
- package/dist/cli/ink-cli/utils/bracketedPaste.d.ts.map +1 -0
- package/dist/cli/ink-cli/utils/bracketedPaste.js +27 -0
- package/dist/cli/ink-cli/utils/clipboardUtils.d.ts +49 -0
- package/dist/cli/ink-cli/utils/clipboardUtils.d.ts.map +1 -0
- package/dist/cli/ink-cli/utils/clipboardUtils.js +356 -0
- package/dist/cli/ink-cli/utils/commandOverlays.d.ts +33 -0
- package/dist/cli/ink-cli/utils/commandOverlays.d.ts.map +1 -0
- package/dist/cli/ink-cli/utils/commandOverlays.js +78 -0
- package/dist/cli/ink-cli/utils/debugLog.d.ts +38 -0
- package/dist/cli/ink-cli/utils/debugLog.d.ts.map +1 -0
- package/dist/cli/ink-cli/utils/debugLog.js +66 -0
- package/dist/cli/ink-cli/utils/index.d.ts +2 -1
- package/dist/cli/ink-cli/utils/index.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/index.js +3 -1
- package/dist/cli/ink-cli/utils/input.d.ts +25 -0
- package/dist/cli/ink-cli/utils/input.d.ts.map +1 -0
- package/dist/cli/ink-cli/utils/input.js +56 -0
- package/dist/cli/ink-cli/utils/inputParsing.d.ts +0 -9
- package/dist/cli/ink-cli/utils/inputParsing.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/inputParsing.js +0 -27
- package/dist/cli/ink-cli/utils/messageFormatting.d.ts +54 -3
- package/dist/cli/ink-cli/utils/messageFormatting.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/messageFormatting.js +290 -20
- package/dist/cli/ink-cli/utils/mouse.d.ts +61 -0
- package/dist/cli/ink-cli/utils/mouse.d.ts.map +1 -0
- package/dist/cli/ink-cli/utils/mouse.js +209 -0
- package/dist/cli/ink-cli/utils/streamSplitter.d.ts +44 -0
- package/dist/cli/ink-cli/utils/streamSplitter.d.ts.map +1 -0
- package/dist/cli/ink-cli/utils/streamSplitter.js +154 -0
- package/dist/cli/ink-cli/utils/textUtils.d.ts +63 -0
- package/dist/cli/ink-cli/utils/textUtils.d.ts.map +1 -0
- package/dist/cli/ink-cli/utils/textUtils.js +248 -0
- package/dist/cli/ink-cli/utils/toolUtils.d.ts +9 -0
- package/dist/cli/ink-cli/utils/toolUtils.d.ts.map +1 -0
- package/dist/cli/ink-cli/utils/toolUtils.js +13 -0
- package/dist/cli/utils/options.d.ts.map +1 -1
- package/dist/cli/utils/options.js +0 -2
- package/dist/config/cli-overrides.d.ts +1 -1
- package/dist/config/cli-overrides.d.ts.map +1 -1
- package/dist/config/cli-overrides.js +5 -10
- package/dist/index.js +66 -48
- package/dist/utils/agent-helpers.d.ts +95 -0
- package/dist/utils/agent-helpers.d.ts.map +1 -0
- package/dist/utils/agent-helpers.js +117 -0
- package/dist/webui/assets/index-BkwPkZpd.css +1 -0
- package/dist/webui/assets/index-D9u1XfyH.js +2025 -0
- package/dist/webui/assets/{tanstack-DgxBONJY.js → tanstack-Br79RQ-n.js} +1 -1
- package/dist/webui/index.html +3 -3
- package/package.json +16 -14
- package/dist/cli/commands/interactive-commands/index.d.ts +0 -63
- package/dist/cli/commands/interactive-commands/index.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/index.js +0 -73
- package/dist/cli/commands/interactive-commands/mcp/mcp-add-utils.d.ts +0 -34
- package/dist/cli/commands/interactive-commands/mcp/mcp-add-utils.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/mcp/mcp-add-utils.js +0 -178
- package/dist/cli/commands/interactive-commands/mcp/mcp-commands.d.ts +0 -9
- package/dist/cli/commands/interactive-commands/mcp/mcp-commands.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/mcp/mcp-commands.js +0 -325
- package/dist/cli/commands/interactive-commands/model/model-commands.d.ts +0 -21
- package/dist/cli/commands/interactive-commands/model/model-commands.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/model/model-commands.js +0 -190
- package/dist/cli/ink-cli/components/MultiLineTextInput.d.ts +0 -26
- package/dist/cli/ink-cli/components/MultiLineTextInput.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/MultiLineTextInput.js +0 -220
- package/dist/discord/bot.d.ts +0 -4
- package/dist/discord/bot.d.ts.map +0 -1
- package/dist/discord/bot.js +0 -193
- package/dist/telegram/bot.d.ts +0 -5
- package/dist/telegram/bot.d.ts.map +0 -1
- package/dist/telegram/bot.js +0 -251
- package/dist/webui/assets/index-DKq5Xng1.js +0 -687
- package/dist/webui/assets/index-D_0_GBu5.css +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useEffect, useRef, useMemo, useCallback } from 'react';
|
|
3
|
-
import { Box, Text,
|
|
2
|
+
import React, { useState, useEffect, useRef, useMemo, useCallback, forwardRef, useImperativeHandle, } from 'react';
|
|
3
|
+
import { Box, Text, useStdout } from 'ink';
|
|
4
4
|
import { getAllCommands } from '../../commands/interactive-commands/commands.js';
|
|
5
5
|
/**
|
|
6
6
|
* Get match score for prompt: 0 = no match, 1 = description/title match, 2 = name includes, 3 = name starts with
|
|
@@ -74,22 +74,46 @@ function getSystemCommandMatchScore(cmd, query) {
|
|
|
74
74
|
function matchesSystemCommandQuery(cmd, query) {
|
|
75
75
|
return getSystemCommandMatchScore(cmd, query) > 0;
|
|
76
76
|
}
|
|
77
|
-
|
|
77
|
+
/**
|
|
78
|
+
* Truncate text to fit within maxLength, adding ellipsis if truncated
|
|
79
|
+
*/
|
|
80
|
+
function truncateText(text, maxLength) {
|
|
81
|
+
if (text.length <= maxLength)
|
|
82
|
+
return text;
|
|
83
|
+
if (maxLength <= 3)
|
|
84
|
+
return text.slice(0, maxLength);
|
|
85
|
+
return text.slice(0, maxLength - 1) + '…';
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Inner component - wrapped with React.memo below
|
|
89
|
+
*/
|
|
90
|
+
const SlashCommandAutocompleteInner = forwardRef(function SlashCommandAutocomplete({ isVisible, searchQuery, onSelectPrompt, onSelectSystemCommand, onLoadIntoInput, onSubmitRaw, onClose, agent, }, ref) {
|
|
78
91
|
const [prompts, setPrompts] = useState([]);
|
|
79
92
|
const [systemCommands, setSystemCommands] = useState([]);
|
|
80
93
|
const [isLoading, setIsLoading] = useState(false);
|
|
81
|
-
|
|
82
|
-
const [
|
|
94
|
+
// Combined state to guarantee single render on navigation
|
|
95
|
+
const [selection, setSelection] = useState({ index: 0, offset: 0 });
|
|
83
96
|
const selectedIndexRef = useRef(0);
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
97
|
+
const { stdout } = useStdout();
|
|
98
|
+
const terminalWidth = stdout?.columns || 80;
|
|
99
|
+
const MAX_VISIBLE_ITEMS = 8;
|
|
100
|
+
// Update selection AND scroll offset in a single state update
|
|
101
|
+
// This guarantees exactly one render per navigation action
|
|
102
|
+
const updateSelection = useCallback((indexUpdater) => {
|
|
103
|
+
setSelection((prev) => {
|
|
104
|
+
const newIndex = typeof indexUpdater === 'function' ? indexUpdater(prev.index) : indexUpdater;
|
|
105
|
+
selectedIndexRef.current = newIndex;
|
|
106
|
+
// Calculate new scroll offset
|
|
107
|
+
let newOffset = prev.offset;
|
|
108
|
+
if (newIndex < prev.offset) {
|
|
109
|
+
newOffset = newIndex;
|
|
110
|
+
}
|
|
111
|
+
else if (newIndex >= prev.offset + MAX_VISIBLE_ITEMS) {
|
|
112
|
+
newOffset = Math.max(0, newIndex - MAX_VISIBLE_ITEMS + 1);
|
|
113
|
+
}
|
|
114
|
+
return { index: newIndex, offset: newOffset };
|
|
91
115
|
});
|
|
92
|
-
}, []);
|
|
116
|
+
}, [MAX_VISIBLE_ITEMS]);
|
|
93
117
|
// Fetch prompts and system commands from agent
|
|
94
118
|
useEffect(() => {
|
|
95
119
|
if (!isVisible)
|
|
@@ -119,9 +143,9 @@ export default function SlashCommandAutocomplete({ isVisible, searchQuery, onSel
|
|
|
119
143
|
setIsLoading(false);
|
|
120
144
|
}
|
|
121
145
|
}
|
|
122
|
-
catch
|
|
146
|
+
catch {
|
|
123
147
|
if (!cancelled) {
|
|
124
|
-
|
|
148
|
+
// Silently fail - don't use console.error as it interferes with Ink rendering
|
|
125
149
|
setPrompts([]);
|
|
126
150
|
setSystemCommands([]);
|
|
127
151
|
setIsLoading(false);
|
|
@@ -169,150 +193,232 @@ export default function SlashCommandAutocomplete({ isVisible, searchQuery, onSel
|
|
|
169
193
|
return scoreB - scoreA; // Higher score first
|
|
170
194
|
});
|
|
171
195
|
}, [systemCommands, commandQuery]);
|
|
172
|
-
// Check if user has started typing arguments (hide autocomplete
|
|
196
|
+
// Check if user has started typing arguments (hide autocomplete)
|
|
173
197
|
const hasArguments = useMemo(() => {
|
|
174
198
|
if (!searchQuery.startsWith('/'))
|
|
175
199
|
return false;
|
|
176
200
|
const afterSlash = searchQuery.slice(1).trim();
|
|
177
201
|
return afterSlash.includes(' ');
|
|
178
202
|
}, [searchQuery]);
|
|
179
|
-
//
|
|
180
|
-
|
|
181
|
-
if (!commandQuery)
|
|
182
|
-
return false; // Don't show create when just "/"
|
|
183
|
-
if (hasArguments)
|
|
184
|
-
return false; // Don't show create when typing arguments
|
|
185
|
-
// Only show create if no matches and query looks like a prompt name (no spaces, valid chars)
|
|
186
|
-
return (filteredPrompts.length === 0 &&
|
|
187
|
-
filteredSystemCommands.length === 0 &&
|
|
188
|
-
commandQuery.length > 0);
|
|
189
|
-
}, [commandQuery, hasArguments, filteredPrompts.length, filteredSystemCommands.length]);
|
|
190
|
-
// Combine items: system commands first, then prompts, then create option
|
|
191
|
-
// Hide autocomplete if user has started typing arguments
|
|
203
|
+
// Combine items: system commands first, then prompts
|
|
204
|
+
// When typing arguments, show only exact matches (for argument hints)
|
|
192
205
|
const combinedItems = useMemo(() => {
|
|
206
|
+
const items = [];
|
|
193
207
|
if (hasArguments) {
|
|
194
|
-
|
|
208
|
+
// When typing arguments, only show exact match for the command
|
|
209
|
+
const exactSystemCmd = systemCommands.find((cmd) => cmd.name.toLowerCase() === commandQuery.toLowerCase());
|
|
210
|
+
if (exactSystemCmd) {
|
|
211
|
+
items.push({ kind: 'system', command: exactSystemCmd });
|
|
212
|
+
}
|
|
213
|
+
const exactPrompt = prompts.find((p) => p.name.toLowerCase() === commandQuery.toLowerCase() ||
|
|
214
|
+
(p.displayName && p.displayName.toLowerCase() === commandQuery.toLowerCase()));
|
|
215
|
+
if (exactPrompt) {
|
|
216
|
+
items.push({ kind: 'prompt', prompt: exactPrompt });
|
|
217
|
+
}
|
|
218
|
+
return items;
|
|
195
219
|
}
|
|
196
|
-
const items = [];
|
|
197
220
|
// System commands first (they're more commonly used)
|
|
198
221
|
filteredSystemCommands.forEach((cmd) => items.push({ kind: 'system', command: cmd }));
|
|
199
222
|
// Then prompts
|
|
200
223
|
filteredPrompts.forEach((prompt) => items.push({ kind: 'prompt', prompt }));
|
|
201
|
-
// Create option last
|
|
202
|
-
if (showCreateOption) {
|
|
203
|
-
items.push({ kind: 'create' });
|
|
204
|
-
}
|
|
205
224
|
return items;
|
|
206
|
-
}, [
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
225
|
+
}, [
|
|
226
|
+
hasArguments,
|
|
227
|
+
filteredPrompts,
|
|
228
|
+
filteredSystemCommands,
|
|
229
|
+
systemCommands,
|
|
230
|
+
prompts,
|
|
231
|
+
commandQuery,
|
|
232
|
+
]);
|
|
233
|
+
// Get stable identity for first item (used to detect content changes)
|
|
234
|
+
const getFirstItemId = () => {
|
|
235
|
+
const first = combinedItems[0];
|
|
236
|
+
if (!first)
|
|
237
|
+
return null;
|
|
238
|
+
if (first.kind === 'system')
|
|
239
|
+
return `sys:${first.command.name}`;
|
|
240
|
+
return `prompt:${first.prompt.name}`;
|
|
241
|
+
};
|
|
242
|
+
// Track items for reset detection (length + first item identity)
|
|
243
|
+
const currentFirstId = getFirstItemId();
|
|
244
|
+
const prevItemsRef = useRef({ length: combinedItems.length, firstId: currentFirstId });
|
|
245
|
+
const itemsChanged = combinedItems.length !== prevItemsRef.current.length ||
|
|
246
|
+
currentFirstId !== prevItemsRef.current.firstId;
|
|
247
|
+
// Derive clamped selection values during render (always valid, no setState needed)
|
|
248
|
+
// This prevents the double-render that was causing flickering
|
|
249
|
+
const selectedIndex = itemsChanged
|
|
250
|
+
? 0
|
|
251
|
+
: Math.min(selection.index, Math.max(0, combinedItems.length - 1));
|
|
252
|
+
const scrollOffset = itemsChanged
|
|
253
|
+
? 0
|
|
254
|
+
: Math.min(selection.offset, Math.max(0, combinedItems.length - MAX_VISIBLE_ITEMS));
|
|
255
|
+
// Sync state only when items actually changed AND state differs
|
|
256
|
+
// This effect runs AFTER render, updating state for next user interaction
|
|
213
257
|
useEffect(() => {
|
|
214
|
-
if (
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
258
|
+
if (itemsChanged) {
|
|
259
|
+
prevItemsRef.current = { length: combinedItems.length, firstId: currentFirstId };
|
|
260
|
+
// Only setState if values actually differ (prevents unnecessary re-render)
|
|
261
|
+
if (selection.index !== 0 || selection.offset !== 0) {
|
|
262
|
+
selectedIndexRef.current = 0;
|
|
263
|
+
setSelection({ index: 0, offset: 0 });
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
selectedIndexRef.current = 0;
|
|
267
|
+
}
|
|
221
268
|
}
|
|
222
|
-
}, [
|
|
269
|
+
}, [itemsChanged, combinedItems.length, currentFirstId, selection.index, selection.offset]);
|
|
223
270
|
// Calculate visible items based on scroll offset
|
|
224
271
|
const visibleItems = useMemo(() => {
|
|
225
272
|
return combinedItems.slice(scrollOffset, scrollOffset + MAX_VISIBLE_ITEMS);
|
|
226
|
-
}, [combinedItems, scrollOffset]);
|
|
227
|
-
//
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}
|
|
237
|
-
if (key.downArrow) {
|
|
238
|
-
setSelectedIndexSync((prev) => (prev + 1) % itemsLength);
|
|
239
|
-
}
|
|
240
|
-
if (key.escape) {
|
|
241
|
-
onClose();
|
|
242
|
-
}
|
|
243
|
-
// Tab: Load command into input (for editing before execution)
|
|
244
|
-
if (key.tab && itemsLength > 0) {
|
|
245
|
-
const item = combinedItems[selectedIndexRef.current];
|
|
246
|
-
if (!item)
|
|
247
|
-
return;
|
|
248
|
-
if (item.kind === 'create') {
|
|
249
|
-
// For create, load the command name into input
|
|
250
|
-
onLoadIntoInput?.(`/${commandQuery || 'name'}`);
|
|
273
|
+
}, [combinedItems, scrollOffset, MAX_VISIBLE_ITEMS]);
|
|
274
|
+
// Expose handleInput method via ref
|
|
275
|
+
useImperativeHandle(ref, () => ({
|
|
276
|
+
handleInput: (input, key) => {
|
|
277
|
+
if (!isVisible)
|
|
278
|
+
return false;
|
|
279
|
+
// Escape always closes, regardless of item count
|
|
280
|
+
if (key.escape) {
|
|
281
|
+
onClose();
|
|
282
|
+
return true;
|
|
251
283
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
284
|
+
const itemsLength = combinedItems.length;
|
|
285
|
+
// Handle Enter when no matches or typing arguments
|
|
286
|
+
// Submit raw text directly (main input won't handle it since overlay is active)
|
|
287
|
+
if (itemsLength === 0 || hasArguments) {
|
|
288
|
+
if (key.return) {
|
|
289
|
+
void Promise.resolve(onSubmitRaw?.(searchQuery)).catch((err) => {
|
|
290
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
291
|
+
agent.logger.error(`SlashCommandAutocomplete: Failed to submit raw command: ${message}`);
|
|
292
|
+
});
|
|
293
|
+
onClose();
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
// Let other keys (typing, backspace) fall through
|
|
297
|
+
return false;
|
|
255
298
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
? ' ' +
|
|
260
|
-
item.prompt.arguments
|
|
261
|
-
.map((arg) => `<${arg.name}${arg.required ? '' : '?'}>`)
|
|
262
|
-
.join(' ')
|
|
263
|
-
: '';
|
|
264
|
-
onLoadIntoInput?.(`/${item.prompt.name}${argsString}`);
|
|
299
|
+
if (key.upArrow) {
|
|
300
|
+
updateSelection((prev) => (prev - 1 + itemsLength) % itemsLength);
|
|
301
|
+
return true;
|
|
265
302
|
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
if (key.return && itemsLength > 0) {
|
|
270
|
-
const item = combinedItems[selectedIndexRef.current];
|
|
271
|
-
if (!item)
|
|
272
|
-
return;
|
|
273
|
-
if (item.kind === 'create') {
|
|
274
|
-
onCreatePrompt?.();
|
|
303
|
+
if (key.downArrow) {
|
|
304
|
+
updateSelection((prev) => (prev + 1) % itemsLength);
|
|
305
|
+
return true;
|
|
275
306
|
}
|
|
276
|
-
|
|
277
|
-
|
|
307
|
+
// Tab: For interactive commands (model, resume, switch), execute them like Enter
|
|
308
|
+
// For other commands, load into input for editing
|
|
309
|
+
if (key.tab) {
|
|
310
|
+
const item = combinedItems[selectedIndexRef.current];
|
|
311
|
+
if (!item)
|
|
312
|
+
return false;
|
|
313
|
+
// Check if this is an interactive command that should be executed
|
|
314
|
+
const interactiveCommands = ['model', 'resume', 'switch'];
|
|
315
|
+
const isInteractiveCommand = item.kind === 'system' && interactiveCommands.includes(item.command.name);
|
|
316
|
+
if (isInteractiveCommand && item.kind === 'system') {
|
|
317
|
+
// Execute interactive command (same as Enter)
|
|
318
|
+
onSelectSystemCommand?.(item.command.name);
|
|
319
|
+
}
|
|
320
|
+
else if (item.kind === 'system') {
|
|
321
|
+
// Load system command into input
|
|
322
|
+
onLoadIntoInput?.(`/${item.command.name}`);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
// Load prompt command into input
|
|
326
|
+
// Use displayName only if it's command-safe (no spaces/special chars)
|
|
327
|
+
const promptDisplayName = item.prompt.displayName || item.prompt.name;
|
|
328
|
+
const isCommandSafe = /^[A-Za-z0-9_-]+$/.test(promptDisplayName);
|
|
329
|
+
const commandName = isCommandSafe ? promptDisplayName : item.prompt.name;
|
|
330
|
+
const argsString = item.prompt.arguments && item.prompt.arguments.length > 0
|
|
331
|
+
? ' ' +
|
|
332
|
+
item.prompt.arguments
|
|
333
|
+
.map((arg) => `<${arg.name}${arg.required ? '' : '?'}>`)
|
|
334
|
+
.join(' ')
|
|
335
|
+
: '';
|
|
336
|
+
onLoadIntoInput?.(`/${commandName}${argsString}`);
|
|
337
|
+
}
|
|
338
|
+
return true;
|
|
278
339
|
}
|
|
279
|
-
|
|
280
|
-
|
|
340
|
+
// Enter: Execute the highlighted command/prompt and close overlay
|
|
341
|
+
if (key.return) {
|
|
342
|
+
const item = combinedItems[selectedIndexRef.current];
|
|
343
|
+
if (!item)
|
|
344
|
+
return false;
|
|
345
|
+
if (item.kind === 'system') {
|
|
346
|
+
onSelectSystemCommand?.(item.command.name);
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
onSelectPrompt(item.prompt);
|
|
350
|
+
}
|
|
351
|
+
onClose();
|
|
352
|
+
return true;
|
|
281
353
|
}
|
|
282
|
-
|
|
283
|
-
|
|
354
|
+
// Don't consume other keys (typing, backspace, etc.)
|
|
355
|
+
// Let them fall through to the input handler
|
|
356
|
+
return false;
|
|
357
|
+
},
|
|
358
|
+
}), [
|
|
359
|
+
isVisible,
|
|
360
|
+
combinedItems,
|
|
361
|
+
hasArguments,
|
|
362
|
+
selectedIndexRef,
|
|
363
|
+
searchQuery,
|
|
364
|
+
onClose,
|
|
365
|
+
onLoadIntoInput,
|
|
366
|
+
onSubmitRaw,
|
|
367
|
+
onSelectPrompt,
|
|
368
|
+
onSelectSystemCommand,
|
|
369
|
+
updateSelection,
|
|
370
|
+
agent,
|
|
371
|
+
]);
|
|
284
372
|
if (!isVisible)
|
|
285
373
|
return null;
|
|
286
|
-
//
|
|
287
|
-
if (hasArguments)
|
|
288
|
-
return null;
|
|
374
|
+
// Show loading state while fetching commands
|
|
289
375
|
if (isLoading) {
|
|
290
|
-
return (_jsx(Box, {
|
|
376
|
+
return (_jsx(Box, { width: terminalWidth, paddingX: 0, paddingY: 0, children: _jsx(Text, { dimColor: true, children: "Loading commands..." }) }));
|
|
291
377
|
}
|
|
378
|
+
// If no items after loading, don't render
|
|
292
379
|
if (combinedItems.length === 0) {
|
|
293
|
-
return
|
|
380
|
+
return null;
|
|
294
381
|
}
|
|
295
|
-
const hasMoreAbove = scrollOffset > 0;
|
|
296
|
-
const hasMoreBelow = scrollOffset + MAX_VISIBLE_ITEMS < combinedItems.length;
|
|
297
382
|
const totalItems = combinedItems.length;
|
|
298
|
-
|
|
383
|
+
// Show simplified header when user is typing arguments
|
|
384
|
+
const headerText = hasArguments
|
|
385
|
+
? 'Press Enter to execute'
|
|
386
|
+
: `Commands (${selectedIndex + 1}/${totalItems}) - ↑↓ navigate, Tab load, Enter execute, Esc close`;
|
|
387
|
+
return (_jsxs(Box, { flexDirection: "column", width: terminalWidth, children: [_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: "purple", bold: true, children: headerText }) }), visibleItems.map((item, visibleIndex) => {
|
|
299
388
|
const actualIndex = scrollOffset + visibleIndex;
|
|
300
389
|
const isSelected = actualIndex === selectedIndex;
|
|
301
|
-
if (item.kind === 'create') {
|
|
302
|
-
return (_jsx(Box, { paddingX: 1, paddingY: 0, backgroundColor: isSelected ? 'yellow' : undefined, children: _jsxs(Text, { color: isSelected ? 'black' : 'gray', bold: isSelected, children: ["+ Create new prompt: /", commandQuery || 'name'] }) }, "create"));
|
|
303
|
-
}
|
|
304
390
|
if (item.kind === 'system') {
|
|
305
391
|
const cmd = item.command;
|
|
306
|
-
|
|
392
|
+
const nameText = `/${cmd.name}`;
|
|
393
|
+
const categoryText = cmd.category ? ` (${cmd.category})` : '';
|
|
394
|
+
const descText = cmd.description || '';
|
|
395
|
+
// Two-line layout:
|
|
396
|
+
// Line 1: /command-name
|
|
397
|
+
// Line 2: Description text (category)
|
|
398
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 0, children: [_jsx(Text, { color: isSelected ? 'cyan' : 'gray', bold: isSelected, children: nameText }), _jsxs(Text, { color: isSelected ? 'white' : 'gray', dimColor: !isSelected, children: [' ', descText, categoryText] })] }, `system-${cmd.name}`));
|
|
307
399
|
}
|
|
308
|
-
// Prompt command
|
|
400
|
+
// Prompt command (MCP prompts)
|
|
309
401
|
const prompt = item.prompt;
|
|
310
|
-
|
|
402
|
+
// Use displayName for user-friendly display, fall back to full name
|
|
403
|
+
const displayName = prompt.displayName || prompt.name;
|
|
404
|
+
const nameText = `/${displayName}`;
|
|
311
405
|
const argsString = prompt.arguments && prompt.arguments.length > 0
|
|
312
|
-
?
|
|
313
|
-
.
|
|
314
|
-
|
|
406
|
+
? ' ' +
|
|
407
|
+
prompt.arguments
|
|
408
|
+
.map((arg) => `<${arg.name}${arg.required ? '' : '?'}>`)
|
|
409
|
+
.join(' ')
|
|
315
410
|
: '';
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
411
|
+
const description = prompt.title || prompt.description || '';
|
|
412
|
+
// Two-line layout:
|
|
413
|
+
// Line 1: /command-name <args>
|
|
414
|
+
// Line 2: Description text (source)
|
|
415
|
+
const commandText = nameText + argsString;
|
|
416
|
+
const sourceLabel = prompt.source || 'prompt';
|
|
417
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 0, children: [_jsx(Text, { color: isSelected ? 'cyan' : 'gray', bold: isSelected, children: commandText }), _jsxs(Text, { color: isSelected ? 'white' : 'gray', dimColor: !isSelected, children: [' ', description, ` (${sourceLabel})`] })] }, `prompt-${prompt.name}`));
|
|
418
|
+
})] }));
|
|
419
|
+
});
|
|
420
|
+
/**
|
|
421
|
+
* Export with React.memo to prevent unnecessary re-renders from parent
|
|
422
|
+
* Only re-renders when props actually change (shallow comparison)
|
|
423
|
+
*/
|
|
424
|
+
export const SlashCommandAutocomplete = React.memo(SlashCommandAutocompleteInner);
|
|
@@ -1,17 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* StatusBar Component
|
|
3
3
|
* Displays processing status and controls above the input area
|
|
4
|
+
*
|
|
5
|
+
* Layout:
|
|
6
|
+
* - Line 1: Spinner + phrase (+ queue count if any)
|
|
7
|
+
* - Line 2: Meta info (time, tokens, cancel hint)
|
|
8
|
+
* This 2-line layout prevents truncation on any terminal width.
|
|
4
9
|
*/
|
|
10
|
+
import type { DextoAgent } from '@dexto/core';
|
|
5
11
|
interface StatusBarProps {
|
|
12
|
+
agent: DextoAgent;
|
|
6
13
|
isProcessing: boolean;
|
|
7
14
|
isThinking: boolean;
|
|
8
15
|
approvalQueueCount: number;
|
|
9
|
-
|
|
16
|
+
copyModeEnabled?: boolean;
|
|
17
|
+
/** Whether an approval prompt is currently shown */
|
|
18
|
+
isAwaitingApproval?: boolean;
|
|
10
19
|
}
|
|
11
20
|
/**
|
|
12
21
|
* Status bar that shows processing state above input area
|
|
13
22
|
* Provides clear feedback on whether the agent is running or idle
|
|
23
|
+
*
|
|
24
|
+
* Design decisions:
|
|
25
|
+
* - Hide spinner during approval wait (user is reviewing, not waiting)
|
|
26
|
+
* - Only show elapsed time after 30s (avoid visual noise for fast operations)
|
|
14
27
|
*/
|
|
15
|
-
export declare function StatusBar({ isProcessing, isThinking, approvalQueueCount,
|
|
28
|
+
export declare function StatusBar({ agent, isProcessing, isThinking, approvalQueueCount, copyModeEnabled, isAwaitingApproval, }: StatusBarProps): import("react/jsx-runtime").JSX.Element | null;
|
|
16
29
|
export {};
|
|
17
30
|
//# sourceMappingURL=StatusBar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/components/StatusBar.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/components/StatusBar.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,UAAU,cAAc;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,eAAuB,EACvB,kBAA0B,GAC7B,EAAE,cAAc,kDAwFhB"}
|
|
@@ -2,28 +2,66 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
/**
|
|
3
3
|
* StatusBar Component
|
|
4
4
|
* Displays processing status and controls above the input area
|
|
5
|
+
*
|
|
6
|
+
* Layout:
|
|
7
|
+
* - Line 1: Spinner + phrase (+ queue count if any)
|
|
8
|
+
* - Line 2: Meta info (time, tokens, cancel hint)
|
|
9
|
+
* This 2-line layout prevents truncation on any terminal width.
|
|
5
10
|
*/
|
|
6
11
|
import { Box, Text } from 'ink';
|
|
7
12
|
import Spinner from 'ink-spinner';
|
|
13
|
+
import { usePhraseCycler } from '../hooks/usePhraseCycler.js';
|
|
14
|
+
import { useElapsedTime } from '../hooks/useElapsedTime.js';
|
|
15
|
+
import { useTokenCounter } from '../hooks/useTokenCounter.js';
|
|
8
16
|
/**
|
|
9
17
|
* Status bar that shows processing state above input area
|
|
10
18
|
* Provides clear feedback on whether the agent is running or idle
|
|
19
|
+
*
|
|
20
|
+
* Design decisions:
|
|
21
|
+
* - Hide spinner during approval wait (user is reviewing, not waiting)
|
|
22
|
+
* - Only show elapsed time after 30s (avoid visual noise for fast operations)
|
|
11
23
|
*/
|
|
12
|
-
export function StatusBar({ isProcessing, isThinking, approvalQueueCount,
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
24
|
+
export function StatusBar({ agent, isProcessing, isThinking, approvalQueueCount, copyModeEnabled = false, isAwaitingApproval = false, }) {
|
|
25
|
+
// Cycle through witty phrases while processing
|
|
26
|
+
const { phrase } = usePhraseCycler({ isActive: isProcessing });
|
|
27
|
+
// Track elapsed time during processing
|
|
28
|
+
const { formatted: elapsedTime, elapsedMs } = useElapsedTime({ isActive: isProcessing });
|
|
29
|
+
// Track token usage during processing
|
|
30
|
+
const { formatted: tokenCount } = useTokenCounter({ agent, isActive: isProcessing });
|
|
31
|
+
// Only show time after 30 seconds
|
|
32
|
+
const showTime = elapsedMs >= 30000;
|
|
33
|
+
// Show copy mode warning (highest priority)
|
|
34
|
+
if (copyModeEnabled) {
|
|
35
|
+
return (_jsx(Box, { paddingX: 1, marginBottom: 0, children: _jsx(Text, { color: "yellow", bold: true, children: "\uD83D\uDCCB Copy Mode - Select text with mouse. Press any key to exit." }) }));
|
|
16
36
|
}
|
|
17
37
|
if (!isProcessing) {
|
|
18
|
-
//
|
|
19
|
-
return
|
|
38
|
+
// No status bar when idle
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
// Hide status bar during approval wait - user is reviewing, not waiting
|
|
42
|
+
if (isAwaitingApproval) {
|
|
43
|
+
return null;
|
|
20
44
|
}
|
|
21
45
|
// Show initial processing state (before streaming starts) - magenta color
|
|
22
46
|
// TODO: Rename this event/state to "reasoning" and associate it with actual reasoning tokens
|
|
23
47
|
// Currently "thinking" event fires before any response, not during reasoning token generation
|
|
24
48
|
if (isThinking) {
|
|
25
|
-
|
|
49
|
+
const metaParts = [];
|
|
50
|
+
if (showTime)
|
|
51
|
+
metaParts.push(`(${elapsedTime})`);
|
|
52
|
+
metaParts.push('Esc to cancel');
|
|
53
|
+
const metaContent = metaParts.join(' • ');
|
|
54
|
+
return (_jsxs(Box, { paddingX: 1, marginTop: 1, marginBottom: 1, flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", alignItems: "center", children: [_jsx(Text, { color: "magenta", children: _jsx(Spinner, { type: "dots" }) }), _jsxs(Text, { color: "magenta", children: [" ", phrase] })] }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { color: "gray", dimColor: true, children: metaContent }) })] }));
|
|
26
55
|
}
|
|
27
56
|
// Show active streaming state - cyan color
|
|
28
|
-
|
|
57
|
+
// Always use 2-line layout: phrase on first line, meta on second
|
|
58
|
+
// This prevents truncation and messy wrapping on any terminal width
|
|
59
|
+
const metaParts = [];
|
|
60
|
+
if (showTime)
|
|
61
|
+
metaParts.push(`(${elapsedTime})`);
|
|
62
|
+
if (tokenCount)
|
|
63
|
+
metaParts.push(tokenCount);
|
|
64
|
+
metaParts.push('Esc to cancel');
|
|
65
|
+
const metaContent = metaParts.join(' • ');
|
|
66
|
+
return (_jsxs(Box, { paddingX: 1, marginTop: 1, marginBottom: 1, flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", alignItems: "center", children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), _jsxs(Text, { color: "cyan", children: [" ", phrase] }), approvalQueueCount > 0 && (_jsxs(Text, { color: "yellow", children: [" \u2022 ", approvalQueueCount, " queued"] }))] }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { color: "gray", dimColor: true, children: metaContent }) })] }));
|
|
29
67
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TextBufferInput Component
|
|
3
|
+
*
|
|
4
|
+
* Buffer is passed as prop from parent.
|
|
5
|
+
* Uses direct useKeypress for input handling (no ref chain).
|
|
6
|
+
* Parent owns the buffer and can read values directly.
|
|
7
|
+
*/
|
|
8
|
+
import type { TextBuffer } from './shared/text-buffer.js';
|
|
9
|
+
import type { PendingImage, PastedBlock } from '../state/types.js';
|
|
10
|
+
/** Overlay trigger types for event-driven overlay detection */
|
|
11
|
+
export type OverlayTrigger = 'slash-autocomplete' | 'resource-autocomplete' | 'close';
|
|
12
|
+
interface TextBufferInputProps {
|
|
13
|
+
/** Text buffer (owned by parent) */
|
|
14
|
+
buffer: TextBuffer;
|
|
15
|
+
/** Called when user presses Enter to submit */
|
|
16
|
+
onSubmit: (value: string) => void;
|
|
17
|
+
/** Placeholder text when empty */
|
|
18
|
+
placeholder?: string | undefined;
|
|
19
|
+
/** Whether input handling is disabled (e.g., during processing) */
|
|
20
|
+
isDisabled?: boolean | undefined;
|
|
21
|
+
/** Called for history navigation (up/down at boundaries) */
|
|
22
|
+
onHistoryNavigate?: ((direction: 'up' | 'down') => void) | undefined;
|
|
23
|
+
/** Called to trigger overlay (slash command, @mention) */
|
|
24
|
+
onTriggerOverlay?: ((trigger: OverlayTrigger) => void) | undefined;
|
|
25
|
+
/** Maximum lines to show in viewport */
|
|
26
|
+
maxViewportLines?: number | undefined;
|
|
27
|
+
/** Whether this input should handle keypresses */
|
|
28
|
+
isActive: boolean;
|
|
29
|
+
/** Optional handler for keyboard scroll (PageUp/PageDown, Shift+arrows) */
|
|
30
|
+
onKeyboardScroll?: ((direction: 'up' | 'down') => void) | undefined;
|
|
31
|
+
/** Current number of attached images (for placeholder numbering) */
|
|
32
|
+
imageCount?: number | undefined;
|
|
33
|
+
/** Called when image is pasted from clipboard */
|
|
34
|
+
onImagePaste?: ((image: PendingImage) => void) | undefined;
|
|
35
|
+
/** Current pending images (for placeholder removal detection) */
|
|
36
|
+
images?: PendingImage[] | undefined;
|
|
37
|
+
/** Called when an image placeholder is removed from text */
|
|
38
|
+
onImageRemove?: ((imageId: string) => void) | undefined;
|
|
39
|
+
/** Current pasted blocks for collapse/expand feature */
|
|
40
|
+
pastedBlocks?: PastedBlock[] | undefined;
|
|
41
|
+
/** Called when a large paste is detected and should be collapsed */
|
|
42
|
+
onPasteBlock?: ((block: PastedBlock) => void) | undefined;
|
|
43
|
+
/** Called to update a pasted block (e.g., toggle collapse) */
|
|
44
|
+
onPasteBlockUpdate?: ((blockId: string, updates: Partial<PastedBlock>) => void) | undefined;
|
|
45
|
+
/** Called when a paste block placeholder is removed from text */
|
|
46
|
+
onPasteBlockRemove?: ((blockId: string) => void) | undefined;
|
|
47
|
+
/** Query to highlight in input text (for history search) */
|
|
48
|
+
highlightQuery?: string | undefined;
|
|
49
|
+
}
|
|
50
|
+
export declare function TextBufferInput({ buffer, onSubmit, placeholder, isDisabled, onHistoryNavigate, onTriggerOverlay, maxViewportLines, isActive, onKeyboardScroll, imageCount, onImagePaste, images, onImageRemove, pastedBlocks, onPasteBlock, onPasteBlockUpdate, onPasteBlockRemove, highlightQuery, }: TextBufferInputProps): import("react/jsx-runtime").JSX.Element;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=TextBufferInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextBufferInput.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/components/TextBufferInput.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGnE,+DAA+D;AAC/D,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,uBAAuB,GAAG,OAAO,CAAC;AActF,UAAU,oBAAoB;IAC1B,oCAAoC;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACrE,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACnE,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACpE,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,iDAAiD;IACjD,YAAY,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3D,iEAAiE;IACjE,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;IACpC,4DAA4D;IAC5D,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACxD,wDAAwD;IACxD,YAAY,CAAC,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IACzC,oEAAoE;IACpE,YAAY,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1D,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5F,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7D,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAuCD,wBAAgB,eAAe,CAAC,EAC5B,MAAM,EACN,QAAQ,EACR,WAAW,EACX,UAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAqB,EACrB,QAAQ,EACR,gBAAgB,EAChB,UAAc,EACd,YAAY,EACZ,MAAW,EACX,aAAa,EACb,YAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,GACjB,EAAE,oBAAoB,2CA8gBtB"}
|