@dexto/tui 1.15.0-beta.0 → 1.15.0-beta.1
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/InkCLIRefactored.cjs +30 -24
- package/dist/InkCLIRefactored.d.ts.map +1 -1
- package/dist/InkCLIRefactored.js +30 -24
- package/dist/components/ApprovalPrompt.cjs +128 -40
- package/dist/components/ApprovalPrompt.d.ts +2 -0
- package/dist/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/ApprovalPrompt.js +128 -41
- package/dist/components/CustomInput.cjs +4 -3
- package/dist/components/CustomInput.d.ts.map +1 -1
- package/dist/components/CustomInput.js +4 -3
- package/dist/components/DeckArea.cjs +43 -0
- package/dist/components/DeckArea.d.ts +14 -0
- package/dist/components/DeckArea.d.ts.map +1 -0
- package/dist/components/DeckArea.js +19 -0
- package/dist/components/EditableMultiLineInput.cjs +9 -8
- package/dist/components/EditableMultiLineInput.d.ts.map +1 -1
- package/dist/components/EditableMultiLineInput.js +9 -8
- package/dist/components/ElicitationForm.cjs +78 -18
- package/dist/components/ElicitationForm.d.ts.map +1 -1
- package/dist/components/ElicitationForm.js +78 -18
- package/dist/components/ErrorBoundary.cjs +15 -5
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/ErrorBoundary.js +15 -5
- package/dist/components/Footer.cjs +37 -113
- package/dist/components/Footer.d.ts +2 -2
- package/dist/components/Footer.d.ts.map +1 -1
- package/dist/components/Footer.js +40 -119
- package/dist/components/HistorySearchBar.cjs +6 -5
- package/dist/components/HistorySearchBar.d.ts.map +1 -1
- package/dist/components/HistorySearchBar.js +6 -5
- package/dist/components/MultiLineInput.cjs +6 -5
- package/dist/components/MultiLineInput.d.ts.map +1 -1
- package/dist/components/MultiLineInput.js +6 -5
- package/dist/components/ResourceAutocomplete.cjs +5 -4
- package/dist/components/ResourceAutocomplete.d.ts.map +1 -1
- package/dist/components/ResourceAutocomplete.js +5 -4
- package/dist/components/SignalGates.test.cjs +215 -0
- package/dist/components/SignalGates.test.d.ts +2 -0
- package/dist/components/SignalGates.test.d.ts.map +1 -0
- package/dist/components/SignalGates.test.js +217 -0
- package/dist/components/SlashCommandAutocomplete.cjs +4 -3
- package/dist/components/SlashCommandAutocomplete.d.ts.map +1 -1
- package/dist/components/SlashCommandAutocomplete.js +4 -3
- package/dist/components/StatusBar.cjs +13 -30
- package/dist/components/StatusBar.d.ts +1 -3
- package/dist/components/StatusBar.d.ts.map +1 -1
- package/dist/components/StatusBar.js +13 -30
- package/dist/components/TextBufferInput.cjs +13 -12
- package/dist/components/TextBufferInput.d.ts.map +1 -1
- package/dist/components/TextBufferInput.js +13 -12
- package/dist/components/TodoPanel.cjs +23 -16
- package/dist/components/TodoPanel.d.ts.map +1 -1
- package/dist/components/TodoPanel.js +23 -16
- package/dist/components/base/BaseAutocomplete.cjs +7 -6
- package/dist/components/base/BaseAutocomplete.d.ts.map +1 -1
- package/dist/components/base/BaseAutocomplete.js +7 -6
- package/dist/components/base/BaseSelector.cjs +5 -4
- package/dist/components/base/BaseSelector.d.ts.map +1 -1
- package/dist/components/base/BaseSelector.js +5 -4
- package/dist/components/chat/Footer.cjs +2 -1
- package/dist/components/chat/Footer.d.ts.map +1 -1
- package/dist/components/chat/Footer.js +2 -1
- package/dist/components/chat/Header.cjs +20 -16
- package/dist/components/chat/Header.d.ts.map +1 -1
- package/dist/components/chat/Header.js +20 -16
- package/dist/components/chat/MessageItem.cjs +47 -30
- package/dist/components/chat/MessageItem.d.ts.map +1 -1
- package/dist/components/chat/MessageItem.js +52 -29
- package/dist/components/chat/MessageList.cjs +3 -2
- package/dist/components/chat/MessageList.d.ts.map +1 -1
- package/dist/components/chat/MessageList.js +3 -2
- package/dist/components/chat/QueuedMessagesDisplay.cjs +17 -5
- package/dist/components/chat/QueuedMessagesDisplay.d.ts.map +1 -1
- package/dist/components/chat/QueuedMessagesDisplay.js +18 -6
- package/dist/components/chat/SignalMessage.cjs +116 -0
- package/dist/components/chat/SignalMessage.d.ts +18 -0
- package/dist/components/chat/SignalMessage.d.ts.map +1 -0
- package/dist/components/chat/SignalMessage.js +96 -0
- package/dist/components/chat/SignalMessage.test.cjs +112 -0
- package/dist/components/chat/SignalMessage.test.d.ts +2 -0
- package/dist/components/chat/SignalMessage.test.d.ts.map +1 -0
- package/dist/components/chat/SignalMessage.test.js +116 -0
- package/dist/components/chat/ToolIcon.cjs +6 -5
- package/dist/components/chat/ToolIcon.d.ts.map +1 -1
- package/dist/components/chat/ToolIcon.js +6 -5
- package/dist/components/chat/styled-boxes/ConfigBox.cjs +8 -7
- package/dist/components/chat/styled-boxes/ConfigBox.d.ts.map +1 -1
- package/dist/components/chat/styled-boxes/ConfigBox.js +8 -7
- package/dist/components/chat/styled-boxes/HelpBox.cjs +4 -3
- package/dist/components/chat/styled-boxes/HelpBox.d.ts.map +1 -1
- package/dist/components/chat/styled-boxes/HelpBox.js +4 -3
- package/dist/components/chat/styled-boxes/LogConfigBox.cjs +11 -3
- package/dist/components/chat/styled-boxes/LogConfigBox.d.ts.map +1 -1
- package/dist/components/chat/styled-boxes/LogConfigBox.js +11 -3
- package/dist/components/chat/styled-boxes/SessionHistoryBox.cjs +8 -7
- package/dist/components/chat/styled-boxes/SessionHistoryBox.d.ts.map +1 -1
- package/dist/components/chat/styled-boxes/SessionHistoryBox.js +8 -7
- package/dist/components/chat/styled-boxes/SessionListBox.cjs +19 -11
- package/dist/components/chat/styled-boxes/SessionListBox.d.ts.map +1 -1
- package/dist/components/chat/styled-boxes/SessionListBox.js +19 -11
- package/dist/components/chat/styled-boxes/ShortcutsBox.cjs +4 -3
- package/dist/components/chat/styled-boxes/ShortcutsBox.d.ts.map +1 -1
- package/dist/components/chat/styled-boxes/ShortcutsBox.js +4 -3
- package/dist/components/chat/styled-boxes/StatsBox.cjs +13 -5
- package/dist/components/chat/styled-boxes/StatsBox.d.ts.map +1 -1
- package/dist/components/chat/styled-boxes/StatsBox.js +13 -5
- package/dist/components/chat/styled-boxes/StyledBox.cjs +7 -6
- package/dist/components/chat/styled-boxes/StyledBox.d.ts.map +1 -1
- package/dist/components/chat/styled-boxes/StyledBox.js +7 -6
- package/dist/components/chat/styled-boxes/SyspromptBox.cjs +2 -1
- package/dist/components/chat/styled-boxes/SyspromptBox.d.ts.map +1 -1
- package/dist/components/chat/styled-boxes/SyspromptBox.js +2 -1
- package/dist/components/modes/AlternateBufferCLI.cjs +53 -43
- package/dist/components/modes/AlternateBufferCLI.d.ts.map +1 -1
- package/dist/components/modes/AlternateBufferCLI.js +53 -43
- package/dist/components/modes/StaticCLI.cjs +53 -42
- package/dist/components/modes/StaticCLI.d.ts.map +1 -1
- package/dist/components/modes/StaticCLI.js +53 -42
- package/dist/components/overlays/ApiKeyInput.cjs +12 -11
- package/dist/components/overlays/ApiKeyInput.d.ts.map +1 -1
- package/dist/components/overlays/ApiKeyInput.js +12 -11
- package/dist/components/overlays/ChatGPTUsageCapOverlay.cjs +7 -6
- package/dist/components/overlays/ChatGPTUsageCapOverlay.d.ts.map +1 -1
- package/dist/components/overlays/ChatGPTUsageCapOverlay.js +7 -6
- package/dist/components/overlays/CommandOutputOverlay.cjs +2 -1
- package/dist/components/overlays/CommandOutputOverlay.d.ts.map +1 -1
- package/dist/components/overlays/CommandOutputOverlay.js +2 -1
- package/dist/components/overlays/ConnectOverlay.cjs +10 -9
- package/dist/components/overlays/ConnectOverlay.d.ts.map +1 -1
- package/dist/components/overlays/ConnectOverlay.js +10 -9
- package/dist/components/overlays/ContextStatsOverlay.cjs +48 -37
- package/dist/components/overlays/ContextStatsOverlay.d.ts.map +1 -1
- package/dist/components/overlays/ContextStatsOverlay.js +48 -37
- package/dist/components/overlays/CustomModelWizard.cjs +5 -4
- package/dist/components/overlays/CustomModelWizard.d.ts.map +1 -1
- package/dist/components/overlays/CustomModelWizard.js +5 -4
- package/dist/components/overlays/ExportWizard.cjs +28 -27
- package/dist/components/overlays/ExportWizard.d.ts.map +1 -1
- package/dist/components/overlays/ExportWizard.js +28 -27
- package/dist/components/overlays/InsufficientCreditsOverlay.cjs +8 -7
- package/dist/components/overlays/InsufficientCreditsOverlay.d.ts.map +1 -1
- package/dist/components/overlays/InsufficientCreditsOverlay.js +8 -7
- package/dist/components/overlays/LogLevelSelector.cjs +6 -5
- package/dist/components/overlays/LogLevelSelector.d.ts.map +1 -1
- package/dist/components/overlays/LogLevelSelector.js +6 -5
- package/dist/components/overlays/LoginOverlay.cjs +7 -6
- package/dist/components/overlays/LoginOverlay.d.ts.map +1 -1
- package/dist/components/overlays/LoginOverlay.js +7 -6
- package/dist/components/overlays/LogoutOverlay.cjs +10 -9
- package/dist/components/overlays/LogoutOverlay.d.ts.map +1 -1
- package/dist/components/overlays/LogoutOverlay.js +10 -9
- package/dist/components/overlays/MarketplaceAddPrompt.cjs +12 -11
- package/dist/components/overlays/MarketplaceAddPrompt.d.ts.map +1 -1
- package/dist/components/overlays/MarketplaceAddPrompt.js +12 -11
- package/dist/components/overlays/MarketplaceBrowser.cjs +27 -26
- package/dist/components/overlays/MarketplaceBrowser.d.ts.map +1 -1
- package/dist/components/overlays/MarketplaceBrowser.js +27 -26
- package/dist/components/overlays/McpAddChoice.cjs +4 -3
- package/dist/components/overlays/McpAddChoice.d.ts.map +1 -1
- package/dist/components/overlays/McpAddChoice.js +4 -3
- package/dist/components/overlays/McpAddSelector.cjs +4 -3
- package/dist/components/overlays/McpAddSelector.d.ts.map +1 -1
- package/dist/components/overlays/McpAddSelector.js +4 -3
- package/dist/components/overlays/McpCustomTypeSelector.cjs +4 -3
- package/dist/components/overlays/McpCustomTypeSelector.d.ts.map +1 -1
- package/dist/components/overlays/McpCustomTypeSelector.js +4 -3
- package/dist/components/overlays/McpCustomWizard.cjs +9 -8
- package/dist/components/overlays/McpCustomWizard.d.ts.map +1 -1
- package/dist/components/overlays/McpCustomWizard.js +9 -8
- package/dist/components/overlays/McpRemoveSelector.cjs +5 -4
- package/dist/components/overlays/McpRemoveSelector.d.ts.map +1 -1
- package/dist/components/overlays/McpRemoveSelector.js +5 -4
- package/dist/components/overlays/McpSelector.cjs +4 -3
- package/dist/components/overlays/McpSelector.d.ts.map +1 -1
- package/dist/components/overlays/McpSelector.js +4 -3
- package/dist/components/overlays/McpServerActions.cjs +7 -6
- package/dist/components/overlays/McpServerActions.d.ts.map +1 -1
- package/dist/components/overlays/McpServerActions.js +7 -6
- package/dist/components/overlays/McpServerList.cjs +6 -5
- package/dist/components/overlays/McpServerList.d.ts.map +1 -1
- package/dist/components/overlays/McpServerList.js +6 -5
- package/dist/components/overlays/ModelSelectorRefactored.cjs +32 -17
- package/dist/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
- package/dist/components/overlays/ModelSelectorRefactored.js +32 -17
- package/dist/components/overlays/PermissionsSelector.cjs +6 -5
- package/dist/components/overlays/PermissionsSelector.d.ts.map +1 -1
- package/dist/components/overlays/PermissionsSelector.js +6 -5
- package/dist/components/overlays/PluginActions.cjs +7 -6
- package/dist/components/overlays/PluginActions.d.ts.map +1 -1
- package/dist/components/overlays/PluginActions.js +7 -6
- package/dist/components/overlays/PluginList.cjs +12 -11
- package/dist/components/overlays/PluginList.d.ts.map +1 -1
- package/dist/components/overlays/PluginList.js +12 -11
- package/dist/components/overlays/PluginManager.cjs +13 -5
- package/dist/components/overlays/PluginManager.d.ts.map +1 -1
- package/dist/components/overlays/PluginManager.js +13 -5
- package/dist/components/overlays/PromptAddChoice.cjs +5 -4
- package/dist/components/overlays/PromptAddChoice.d.ts.map +1 -1
- package/dist/components/overlays/PromptAddChoice.js +5 -4
- package/dist/components/overlays/PromptAddWizard.cjs +10 -9
- package/dist/components/overlays/PromptAddWizard.d.ts.map +1 -1
- package/dist/components/overlays/PromptAddWizard.js +10 -9
- package/dist/components/overlays/PromptDeleteSelector.cjs +6 -5
- package/dist/components/overlays/PromptDeleteSelector.d.ts.map +1 -1
- package/dist/components/overlays/PromptDeleteSelector.js +6 -5
- package/dist/components/overlays/PromptList.cjs +10 -9
- package/dist/components/overlays/PromptList.d.ts.map +1 -1
- package/dist/components/overlays/PromptList.js +10 -9
- package/dist/components/overlays/ReasoningOverlay.cjs +30 -23
- package/dist/components/overlays/ReasoningOverlay.d.ts.map +1 -1
- package/dist/components/overlays/ReasoningOverlay.js +30 -23
- package/dist/components/overlays/SearchOverlay.cjs +15 -14
- package/dist/components/overlays/SearchOverlay.d.ts.map +1 -1
- package/dist/components/overlays/SearchOverlay.js +15 -14
- package/dist/components/overlays/SessionRenameOverlay.cjs +9 -8
- package/dist/components/overlays/SessionRenameOverlay.d.ts.map +1 -1
- package/dist/components/overlays/SessionRenameOverlay.js +9 -8
- package/dist/components/overlays/SessionSelectorRefactored.cjs +4 -3
- package/dist/components/overlays/SessionSelectorRefactored.d.ts.map +1 -1
- package/dist/components/overlays/SessionSelectorRefactored.js +4 -3
- package/dist/components/overlays/SessionSubcommandSelector.cjs +4 -3
- package/dist/components/overlays/SessionSubcommandSelector.d.ts.map +1 -1
- package/dist/components/overlays/SessionSubcommandSelector.js +4 -3
- package/dist/components/overlays/SoundsSelector.cjs +15 -7
- package/dist/components/overlays/SoundsSelector.d.ts.map +1 -1
- package/dist/components/overlays/SoundsSelector.js +15 -7
- package/dist/components/overlays/StreamSelector.cjs +5 -4
- package/dist/components/overlays/StreamSelector.d.ts.map +1 -1
- package/dist/components/overlays/StreamSelector.js +5 -4
- package/dist/components/overlays/ToolBrowser.cjs +73 -56
- package/dist/components/overlays/ToolBrowser.d.ts.map +1 -1
- package/dist/components/overlays/ToolBrowser.js +73 -56
- package/dist/components/overlays/custom-model-wizard/LocalModelWizard.cjs +103 -69
- package/dist/components/overlays/custom-model-wizard/LocalModelWizard.d.ts.map +1 -1
- package/dist/components/overlays/custom-model-wizard/LocalModelWizard.js +103 -69
- package/dist/components/overlays/custom-model-wizard/shared/ApiKeyStep.cjs +3 -2
- package/dist/components/overlays/custom-model-wizard/shared/ApiKeyStep.d.ts.map +1 -1
- package/dist/components/overlays/custom-model-wizard/shared/ApiKeyStep.js +3 -2
- package/dist/components/overlays/custom-model-wizard/shared/ProviderSelector.cjs +5 -4
- package/dist/components/overlays/custom-model-wizard/shared/ProviderSelector.d.ts.map +1 -1
- package/dist/components/overlays/custom-model-wizard/shared/ProviderSelector.js +5 -4
- package/dist/components/overlays/custom-model-wizard/shared/SetupInfoBanner.cjs +4 -3
- package/dist/components/overlays/custom-model-wizard/shared/SetupInfoBanner.d.ts.map +1 -1
- package/dist/components/overlays/custom-model-wizard/shared/SetupInfoBanner.js +4 -3
- package/dist/components/overlays/custom-model-wizard/shared/WizardStepInput.cjs +7 -6
- package/dist/components/overlays/custom-model-wizard/shared/WizardStepInput.d.ts.map +1 -1
- package/dist/components/overlays/custom-model-wizard/shared/WizardStepInput.js +7 -6
- package/dist/components/renderers/DiffRenderer.cjs +5 -4
- package/dist/components/renderers/DiffRenderer.d.ts.map +1 -1
- package/dist/components/renderers/DiffRenderer.js +5 -4
- package/dist/components/renderers/FilePreviewRenderer.cjs +23 -13
- package/dist/components/renderers/FilePreviewRenderer.d.ts.map +1 -1
- package/dist/components/renderers/FilePreviewRenderer.js +23 -13
- package/dist/components/renderers/FileRenderer.cjs +9 -8
- package/dist/components/renderers/FileRenderer.d.ts.map +1 -1
- package/dist/components/renderers/FileRenderer.js +9 -8
- package/dist/components/renderers/GenericRenderer.cjs +5 -4
- package/dist/components/renderers/GenericRenderer.d.ts.map +1 -1
- package/dist/components/renderers/GenericRenderer.js +5 -4
- package/dist/components/renderers/SearchRenderer.cjs +4 -3
- package/dist/components/renderers/SearchRenderer.d.ts.map +1 -1
- package/dist/components/renderers/SearchRenderer.js +4 -3
- package/dist/components/renderers/ShellRenderer.cjs +6 -5
- package/dist/components/renderers/ShellRenderer.d.ts.map +1 -1
- package/dist/components/renderers/ShellRenderer.js +6 -5
- package/dist/components/renderers/SignalDiff.cjs +139 -0
- package/dist/components/renderers/SignalDiff.d.ts +21 -0
- package/dist/components/renderers/SignalDiff.d.ts.map +1 -0
- package/dist/components/renderers/SignalDiff.js +106 -0
- package/dist/components/renderers/SignalDiff.test.cjs +78 -0
- package/dist/components/renderers/SignalDiff.test.d.ts +2 -0
- package/dist/components/renderers/SignalDiff.test.d.ts.map +1 -0
- package/dist/components/renderers/SignalDiff.test.js +77 -0
- package/dist/components/renderers/diff-shared.cjs +13 -7
- package/dist/components/renderers/diff-shared.d.ts +5 -0
- package/dist/components/renderers/diff-shared.d.ts.map +1 -1
- package/dist/components/renderers/diff-shared.js +12 -7
- package/dist/components/shared/FocusOverlayFrame.cjs +3 -2
- package/dist/components/shared/FocusOverlayFrame.d.ts.map +1 -1
- package/dist/components/shared/FocusOverlayFrame.js +3 -2
- package/dist/components/shared/HintBar.cjs +2 -1
- package/dist/components/shared/HintBar.d.ts.map +1 -1
- package/dist/components/shared/HintBar.js +2 -1
- package/dist/components/shared/MarkdownText.cjs +36 -53
- package/dist/components/shared/MarkdownText.d.ts +2 -0
- package/dist/components/shared/MarkdownText.d.ts.map +1 -1
- package/dist/components/shared/MarkdownText.js +36 -54
- package/dist/components/shared/VirtualizedList.cjs +2 -1
- package/dist/components/shared/VirtualizedList.d.ts.map +1 -1
- package/dist/components/shared/VirtualizedList.js +2 -1
- package/dist/containers/OverlayContainer.cjs +2 -4
- package/dist/containers/OverlayContainer.d.ts.map +1 -1
- package/dist/containers/OverlayContainer.js +2 -4
- package/dist/contexts/KeypressContext.cjs +7 -1
- package/dist/contexts/KeypressContext.d.ts.map +1 -1
- package/dist/contexts/KeypressContext.js +7 -1
- package/dist/contexts/KeypressContext.test.cjs +82 -0
- package/dist/contexts/KeypressContext.test.d.ts +2 -0
- package/dist/contexts/KeypressContext.test.d.ts.map +1 -0
- package/dist/contexts/KeypressContext.test.js +81 -0
- package/dist/hooks/useAgentEvents.cjs +1 -74
- package/dist/hooks/useAgentEvents.d.ts.map +1 -1
- package/dist/hooks/useAgentEvents.js +1 -74
- package/dist/hooks/useCLIState.cjs +0 -3
- package/dist/hooks/useCLIState.d.ts.map +1 -1
- package/dist/hooks/useCLIState.js +0 -3
- package/dist/hooks/useContextStats.cjs +91 -0
- package/dist/hooks/useContextStats.d.ts +13 -0
- package/dist/hooks/useContextStats.d.ts.map +1 -0
- package/dist/hooks/useContextStats.js +67 -0
- package/dist/hooks/useDeckState.cjs +140 -0
- package/dist/hooks/useDeckState.d.ts +20 -0
- package/dist/hooks/useDeckState.d.ts.map +1 -0
- package/dist/hooks/useDeckState.js +123 -0
- package/dist/hooks/useDextoCredits.cjs +81 -0
- package/dist/hooks/useDextoCredits.d.ts +14 -0
- package/dist/hooks/useDextoCredits.d.ts.map +1 -0
- package/dist/hooks/useDextoCredits.js +56 -0
- package/dist/hooks/useDextoCredits.test.cjs +73 -0
- package/dist/hooks/useDextoCredits.test.d.ts +2 -0
- package/dist/hooks/useDextoCredits.test.d.ts.map +1 -0
- package/dist/hooks/useDextoCredits.test.js +72 -0
- package/dist/hooks/useElapsedTime.cjs +13 -24
- package/dist/hooks/useElapsedTime.d.ts +3 -1
- package/dist/hooks/useElapsedTime.d.ts.map +1 -1
- package/dist/hooks/useElapsedTime.js +13 -24
- package/dist/hooks/useElapsedTime.test.cjs +35 -0
- package/dist/hooks/useElapsedTime.test.d.ts +2 -0
- package/dist/hooks/useElapsedTime.test.d.ts.map +1 -0
- package/dist/hooks/useElapsedTime.test.js +34 -0
- package/dist/hooks/useGitDirtyFiles.cjs +59 -0
- package/dist/hooks/useGitDirtyFiles.d.ts +5 -0
- package/dist/hooks/useGitDirtyFiles.d.ts.map +1 -0
- package/dist/hooks/useGitDirtyFiles.js +34 -0
- package/dist/hooks/useGitDirtyFiles.test.cjs +9 -0
- package/dist/hooks/useGitDirtyFiles.test.d.ts +2 -0
- package/dist/hooks/useGitDirtyFiles.test.d.ts.map +1 -0
- package/dist/hooks/useGitDirtyFiles.test.js +8 -0
- package/dist/hooks/useHeldValue.cjs +33 -0
- package/dist/hooks/useHeldValue.d.ts +3 -0
- package/dist/hooks/useHeldValue.d.ts.map +1 -0
- package/dist/hooks/useHeldValue.js +9 -0
- package/dist/hooks/useHeldValue.test.cjs +31 -0
- package/dist/hooks/useHeldValue.test.d.ts +2 -0
- package/dist/hooks/useHeldValue.test.d.ts.map +1 -0
- package/dist/hooks/useHeldValue.test.js +30 -0
- package/dist/hooks/useInputOrchestrator.cjs +22 -30
- package/dist/hooks/useInputOrchestrator.d.ts +2 -0
- package/dist/hooks/useInputOrchestrator.d.ts.map +1 -1
- package/dist/hooks/useInputOrchestrator.js +21 -30
- package/dist/hooks/useInputOrchestrator.test.cjs +24 -0
- package/dist/hooks/useInputOrchestrator.test.d.ts +2 -0
- package/dist/hooks/useInputOrchestrator.test.d.ts.map +1 -0
- package/dist/hooks/useInputOrchestrator.test.js +23 -0
- package/dist/interactive-commands/command-parser.cjs +13 -21
- package/dist/interactive-commands/command-parser.d.ts.map +1 -1
- package/dist/interactive-commands/command-parser.js +13 -11
- package/dist/interactive-commands/general-commands.cjs +8 -7
- package/dist/interactive-commands/general-commands.d.ts.map +1 -1
- package/dist/interactive-commands/general-commands.js +8 -7
- package/dist/services/processStream.cjs +31 -19
- package/dist/services/processStream.d.ts.map +1 -1
- package/dist/services/processStream.js +32 -20
- package/dist/services/processStream.test.cjs +51 -3
- package/dist/services/processStream.test.js +51 -3
- package/dist/signal/background.cjs +154 -0
- package/dist/signal/background.d.ts +43 -0
- package/dist/signal/background.d.ts.map +1 -0
- package/dist/signal/background.js +124 -0
- package/dist/signal/background.test.cjs +186 -0
- package/dist/signal/background.test.d.ts +2 -0
- package/dist/signal/background.test.d.ts.map +1 -0
- package/dist/signal/background.test.js +192 -0
- package/dist/signal/caps.cjs +100 -0
- package/dist/signal/caps.d.ts +23 -0
- package/dist/signal/caps.d.ts.map +1 -0
- package/dist/signal/caps.js +73 -0
- package/dist/signal/caps.test.cjs +56 -0
- package/dist/signal/caps.test.d.ts +2 -0
- package/dist/signal/caps.test.d.ts.map +1 -0
- package/dist/signal/caps.test.js +55 -0
- package/dist/signal/components.cjs +257 -0
- package/dist/signal/components.d.ts +120 -0
- package/dist/signal/components.d.ts.map +1 -0
- package/dist/signal/components.js +226 -0
- package/dist/signal/components.test.cjs +156 -0
- package/dist/signal/components.test.d.ts +2 -0
- package/dist/signal/components.test.d.ts.map +1 -0
- package/dist/signal/components.test.js +133 -0
- package/dist/signal/cut.cjs +103 -0
- package/dist/signal/cut.d.ts +11 -0
- package/dist/signal/cut.d.ts.map +1 -0
- package/dist/signal/cut.js +77 -0
- package/dist/signal/cut.test.cjs +20 -0
- package/dist/signal/cut.test.d.ts +2 -0
- package/dist/signal/cut.test.d.ts.map +1 -0
- package/dist/signal/cut.test.js +19 -0
- package/dist/signal/deck-layout.cjs +57 -0
- package/dist/signal/deck-layout.d.ts +29 -0
- package/dist/signal/deck-layout.d.ts.map +1 -0
- package/dist/signal/deck-layout.js +30 -0
- package/dist/signal/deck-parts.cjs +243 -0
- package/dist/signal/deck-parts.d.ts +55 -0
- package/dist/signal/deck-parts.d.ts.map +1 -0
- package/dist/signal/deck-parts.js +205 -0
- package/dist/signal/deck.test.cjs +311 -0
- package/dist/signal/deck.test.d.ts +2 -0
- package/dist/signal/deck.test.d.ts.map +1 -0
- package/dist/signal/deck.test.js +288 -0
- package/dist/signal/glyphs.cjs +195 -0
- package/dist/signal/glyphs.d.ts +8 -0
- package/dist/signal/glyphs.d.ts.map +1 -0
- package/dist/signal/glyphs.js +171 -0
- package/dist/signal/glyphs.test.cjs +17 -0
- package/dist/signal/glyphs.test.d.ts +2 -0
- package/dist/signal/glyphs.test.d.ts.map +1 -0
- package/dist/signal/glyphs.test.js +16 -0
- package/dist/signal/harness.cjs +103 -0
- package/dist/signal/harness.d.ts +70 -0
- package/dist/signal/harness.d.ts.map +1 -0
- package/dist/signal/harness.js +67 -0
- package/dist/signal/harness.test.cjs +84 -0
- package/dist/signal/harness.test.d.ts +2 -0
- package/dist/signal/harness.test.d.ts.map +1 -0
- package/dist/signal/harness.test.js +61 -0
- package/dist/signal/index.cjs +76 -0
- package/dist/signal/index.d.ts +8 -0
- package/dist/signal/index.d.ts.map +1 -0
- package/dist/signal/index.js +45 -0
- package/dist/signal/kit.snapshot.test.cjs +56 -0
- package/dist/signal/kit.snapshot.test.d.ts +2 -0
- package/dist/signal/kit.snapshot.test.d.ts.map +1 -0
- package/dist/signal/kit.snapshot.test.js +55 -0
- package/dist/signal/no-raw-colours.test.cjs +32 -0
- package/dist/signal/no-raw-colours.test.d.ts +2 -0
- package/dist/signal/no-raw-colours.test.d.ts.map +1 -0
- package/dist/signal/no-raw-colours.test.js +30 -0
- package/dist/signal/paint.cjs +76 -0
- package/dist/signal/paint.d.ts +15 -0
- package/dist/signal/paint.d.ts.map +1 -0
- package/dist/signal/paint.js +41 -0
- package/dist/signal/paint.test.cjs +98 -0
- package/dist/signal/paint.test.d.ts +2 -0
- package/dist/signal/paint.test.d.ts.map +1 -0
- package/dist/signal/paint.test.js +75 -0
- package/dist/signal/tone.cjs +109 -0
- package/dist/signal/tone.d.ts +17 -0
- package/dist/signal/tone.d.ts.map +1 -0
- package/dist/signal/tone.js +83 -0
- package/dist/signal/tone.test.cjs +70 -0
- package/dist/signal/tone.test.d.ts +2 -0
- package/dist/signal/tone.test.d.ts.map +1 -0
- package/dist/signal/tone.test.js +69 -0
- package/dist/signal/trace.cjs +142 -0
- package/dist/signal/trace.d.ts +41 -0
- package/dist/signal/trace.d.ts.map +1 -0
- package/dist/signal/trace.js +113 -0
- package/dist/signal/trace.test.cjs +50 -0
- package/dist/signal/trace.test.d.ts +2 -0
- package/dist/signal/trace.test.d.ts.map +1 -0
- package/dist/signal/trace.test.js +49 -0
- package/dist/signal/use-trace.cjs +73 -0
- package/dist/signal/use-trace.d.ts +5 -0
- package/dist/signal/use-trace.d.ts.map +1 -0
- package/dist/signal/use-trace.js +48 -0
- package/dist/signal/wordmark-art.generated.cjs +375 -0
- package/dist/signal/wordmark-art.generated.d.ts +3 -0
- package/dist/signal/wordmark-art.generated.d.ts.map +1 -0
- package/dist/signal/wordmark-art.generated.js +351 -0
- package/dist/signal/wordmark.cjs +60 -0
- package/dist/signal/wordmark.d.ts +23 -0
- package/dist/signal/wordmark.d.ts.map +1 -0
- package/dist/signal/wordmark.js +34 -0
- package/dist/signal/wordmark.test.cjs +71 -0
- package/dist/signal/wordmark.test.d.ts +2 -0
- package/dist/signal/wordmark.test.d.ts.map +1 -0
- package/dist/signal/wordmark.test.js +70 -0
- package/dist/state/initialState.cjs +0 -3
- package/dist/state/initialState.d.ts.map +1 -1
- package/dist/state/initialState.js +0 -3
- package/dist/state/types.d.ts +13 -7
- package/dist/state/types.d.ts.map +1 -1
- package/dist/utils/approval-response.cjs +45 -0
- package/dist/utils/approval-response.d.ts +14 -0
- package/dist/utils/approval-response.d.ts.map +1 -0
- package/dist/utils/approval-response.js +21 -0
- package/dist/utils/approval-response.test.cjs +49 -0
- package/dist/utils/approval-response.test.d.ts +2 -0
- package/dist/utils/approval-response.test.d.ts.map +1 -0
- package/dist/utils/approval-response.test.js +55 -0
- package/dist/utils/approvalScope.cjs +12 -0
- package/dist/utils/approvalScope.d.ts.map +1 -1
- package/dist/utils/approvalScope.js +12 -0
- package/dist/utils/approvalScope.test.cjs +23 -0
- package/dist/utils/approvalScope.test.d.ts +2 -0
- package/dist/utils/approvalScope.test.d.ts.map +1 -0
- package/dist/utils/approvalScope.test.js +22 -0
- package/dist/utils/background-failure.cjs +51 -0
- package/dist/utils/background-failure.d.ts +12 -0
- package/dist/utils/background-failure.d.ts.map +1 -0
- package/dist/utils/background-failure.js +26 -0
- package/dist/utils/chatgpt-rate-limit.cjs +10 -0
- package/dist/utils/chatgpt-rate-limit.d.ts +9 -0
- package/dist/utils/chatgpt-rate-limit.d.ts.map +1 -1
- package/dist/utils/chatgpt-rate-limit.js +9 -0
- package/dist/utils/chatgpt-rate-limit.test.cjs +10 -0
- package/dist/utils/chatgpt-rate-limit.test.js +11 -0
- package/dist/utils/deck-state.cjs +107 -0
- package/dist/utils/deck-state.d.ts +79 -0
- package/dist/utils/deck-state.d.ts.map +1 -0
- package/dist/utils/deck-state.js +76 -0
- package/dist/utils/deck-state.test.cjs +208 -0
- package/dist/utils/deck-state.test.d.ts +2 -0
- package/dist/utils/deck-state.test.d.ts.map +1 -0
- package/dist/utils/deck-state.test.js +216 -0
- package/dist/utils/fault-block.cjs +37 -0
- package/dist/utils/fault-block.d.ts +13 -0
- package/dist/utils/fault-block.d.ts.map +1 -0
- package/dist/utils/fault-block.js +13 -0
- package/dist/utils/fault-block.test.cjs +23 -0
- package/dist/utils/fault-block.test.d.ts +2 -0
- package/dist/utils/fault-block.test.d.ts.map +1 -0
- package/dist/utils/fault-block.test.js +22 -0
- package/dist/utils/messageFormatting.cjs +26 -23
- package/dist/utils/messageFormatting.d.ts +5 -2
- package/dist/utils/messageFormatting.d.ts.map +1 -1
- package/dist/utils/messageFormatting.js +25 -21
- package/dist/utils/messageFormatting.test.cjs +34 -0
- package/dist/utils/messageFormatting.test.js +35 -1
- package/dist/utils/reasoning-variant.cjs +35 -0
- package/dist/utils/reasoning-variant.d.ts +13 -0
- package/dist/utils/reasoning-variant.d.ts.map +1 -0
- package/dist/utils/reasoning-variant.js +11 -0
- package/dist/utils/resize-reflow.cjs +119 -0
- package/dist/utils/resize-reflow.d.ts +18 -0
- package/dist/utils/resize-reflow.d.ts.map +1 -0
- package/dist/utils/resize-reflow.js +83 -0
- package/dist/utils/resize-reflow.test.cjs +100 -0
- package/dist/utils/resize-reflow.test.d.ts +2 -0
- package/dist/utils/resize-reflow.test.d.ts.map +1 -0
- package/dist/utils/resize-reflow.test.js +99 -0
- package/dist/utils/tool-step.cjs +183 -0
- package/dist/utils/tool-step.d.ts +28 -0
- package/dist/utils/tool-step.d.ts.map +1 -0
- package/dist/utils/tool-step.js +156 -0
- package/dist/utils/tool-step.test.cjs +263 -0
- package/dist/utils/tool-step.test.d.ts +2 -0
- package/dist/utils/tool-step.test.d.ts.map +1 -0
- package/dist/utils/tool-step.test.js +262 -0
- package/package.json +7 -3
- package/dist/components/BackgroundTasksPanel.cjs +0 -117
- package/dist/components/BackgroundTasksPanel.d.ts +0 -18
- package/dist/components/BackgroundTasksPanel.d.ts.map +0 -1
- package/dist/components/BackgroundTasksPanel.js +0 -93
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
deckCollapsed,
|
|
4
|
+
deckCredits,
|
|
5
|
+
deckMode,
|
|
6
|
+
deckModelId,
|
|
7
|
+
deckReadout,
|
|
8
|
+
keepsTurnSpend,
|
|
9
|
+
nextTurnBaseline,
|
|
10
|
+
permissionLabel
|
|
11
|
+
} from "./deck-state.js";
|
|
12
|
+
const idle = {
|
|
13
|
+
isProcessing: false,
|
|
14
|
+
isCancelling: false,
|
|
15
|
+
isThinking: false,
|
|
16
|
+
isCompacting: false,
|
|
17
|
+
awaitingUser: false,
|
|
18
|
+
toolRunning: false,
|
|
19
|
+
steerCount: 0,
|
|
20
|
+
lastRunFailed: false
|
|
21
|
+
};
|
|
22
|
+
describe("deckMode", () => {
|
|
23
|
+
it("is READY when nothing runs", () => {
|
|
24
|
+
expect(deckMode(idle)).toBe("idle");
|
|
25
|
+
});
|
|
26
|
+
it("is FAULT after a run that failed, until the next one starts", () => {
|
|
27
|
+
expect(deckMode({ ...idle, lastRunFailed: true })).toBe("fault");
|
|
28
|
+
expect(deckMode({ ...idle, lastRunFailed: true, isProcessing: true })).toBe("stream");
|
|
29
|
+
});
|
|
30
|
+
it("puts waiting on you above everything the agent is doing", () => {
|
|
31
|
+
const busy = { ...idle, isProcessing: true, isThinking: true, toolRunning: true };
|
|
32
|
+
expect(deckMode({ ...busy, awaitingUser: true })).toBe("wait");
|
|
33
|
+
});
|
|
34
|
+
it("shows STOPPED while a cancel lands", () => {
|
|
35
|
+
expect(deckMode({ ...idle, isCancelling: true })).toBe("stop");
|
|
36
|
+
expect(deckMode({ ...idle, isCancelling: true, lastRunFailed: true })).toBe("stop");
|
|
37
|
+
});
|
|
38
|
+
it("shows STEERING while a steer waits for the current step", () => {
|
|
39
|
+
expect(deckMode({ ...idle, isProcessing: true, toolRunning: true, steerCount: 1 })).toBe(
|
|
40
|
+
"steer"
|
|
41
|
+
);
|
|
42
|
+
});
|
|
43
|
+
it("tells thinking, tools and streaming apart", () => {
|
|
44
|
+
const run = { ...idle, isProcessing: true };
|
|
45
|
+
expect(deckMode({ ...run, isThinking: true })).toBe("think");
|
|
46
|
+
expect(deckMode({ ...run, toolRunning: true })).toBe("tool");
|
|
47
|
+
expect(deckMode({ ...run, isCompacting: true })).toBe("tool");
|
|
48
|
+
expect(deckMode(run)).toBe("stream");
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe("deckReadout", () => {
|
|
52
|
+
const base = {
|
|
53
|
+
elapsed: "12s",
|
|
54
|
+
tokens: "1.9K tokens",
|
|
55
|
+
compacting: false,
|
|
56
|
+
steerCount: 0,
|
|
57
|
+
permission: null,
|
|
58
|
+
reasoning: null,
|
|
59
|
+
rateLimitHint: null
|
|
60
|
+
};
|
|
61
|
+
it("reads tokens and time while the agent works", () => {
|
|
62
|
+
expect(deckReadout("stream", base)).toBe("1.9K tokens \xB7 12s");
|
|
63
|
+
expect(deckReadout("think", { ...base, tokens: "" })).toBe("12s");
|
|
64
|
+
});
|
|
65
|
+
it("says what it is doing when it compacts", () => {
|
|
66
|
+
expect(deckReadout("tool", { ...base, compacting: true })).toBe("compacting \xB7 12s");
|
|
67
|
+
});
|
|
68
|
+
it("counts queued steers", () => {
|
|
69
|
+
expect(deckReadout("steer", { ...base, steerCount: 2 })).toBe("2 steers queued");
|
|
70
|
+
});
|
|
71
|
+
it("leads with the permission mode during a run, since Shift+Tab still changes it", () => {
|
|
72
|
+
const auto = { ...base, permission: "auto-approve" };
|
|
73
|
+
expect(deckReadout("stream", auto)).toBe("auto-approve \xB7 1.9K tokens \xB7 12s");
|
|
74
|
+
expect(deckReadout("tool", { ...auto, compacting: true })).toBe(
|
|
75
|
+
"auto-approve \xB7 compacting \xB7 12s"
|
|
76
|
+
);
|
|
77
|
+
expect(deckReadout("steer", { ...auto, steerCount: 1 })).toBe(
|
|
78
|
+
"auto-approve \xB7 1 steer queued"
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
it("shows how long it has waited on you", () => {
|
|
82
|
+
expect(deckReadout("wait", base)).toBe("paused 12s");
|
|
83
|
+
});
|
|
84
|
+
it("shows the permission mode, then a rate-limit hint, when idle", () => {
|
|
85
|
+
expect(deckReadout("idle", base)).toBeNull();
|
|
86
|
+
expect(deckReadout("idle", { ...base, permission: "plan mode" })).toBe("plan mode");
|
|
87
|
+
expect(
|
|
88
|
+
deckReadout("idle", { ...base, permission: "plan mode", rateLimitHint: "91% used" })
|
|
89
|
+
).toBe("plan mode \xB7 91% used");
|
|
90
|
+
});
|
|
91
|
+
it("puts the usage warning before the reasoning variant, since the end truncates first", () => {
|
|
92
|
+
expect(
|
|
93
|
+
deckReadout("idle", {
|
|
94
|
+
...base,
|
|
95
|
+
permission: "auto-approve",
|
|
96
|
+
reasoning: "medium",
|
|
97
|
+
rateLimitHint: "cap 95%"
|
|
98
|
+
})
|
|
99
|
+
).toBe("auto-approve \xB7 cap 95% \xB7 r:medium");
|
|
100
|
+
});
|
|
101
|
+
it("shows the reasoning variant when idle, so Tab has visible feedback", () => {
|
|
102
|
+
expect(deckReadout("idle", { ...base, reasoning: "high" })).toBe("r:high");
|
|
103
|
+
expect(deckReadout("idle", { ...base, permission: "plan mode", reasoning: "low" })).toBe(
|
|
104
|
+
"plan mode \xB7 r:low"
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe("deckModelId", () => {
|
|
109
|
+
it("names Dexto models dexto/\u2026 and own-key models by provider", () => {
|
|
110
|
+
expect(deckModelId("dexto-nova", "anthropic/claude-sonnet-4.5")).toBe(
|
|
111
|
+
"dexto/anthropic/claude-sonnet-4.5"
|
|
112
|
+
);
|
|
113
|
+
expect(deckModelId("openai", "gpt-5")).toBe("openai/gpt-5");
|
|
114
|
+
expect(deckModelId(null, "gpt-5")).toBe("gpt-5");
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe("deckCredits", () => {
|
|
118
|
+
it("is signed out without an account", () => {
|
|
119
|
+
expect(deckCredits({ signedIn: false, balance: null, turnStartBalance: null })).toEqual({
|
|
120
|
+
kind: "signed-out"
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
it("is out at or below zero", () => {
|
|
124
|
+
expect(deckCredits({ signedIn: true, balance: 0, turnStartBalance: null })).toEqual({
|
|
125
|
+
kind: "out"
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
it("reports what this turn spent", () => {
|
|
129
|
+
expect(deckCredits({ signedIn: true, balance: 12.5, turnStartBalance: 12.81 })).toEqual({
|
|
130
|
+
kind: "balance",
|
|
131
|
+
balance: 12.5,
|
|
132
|
+
spend: 0.31
|
|
133
|
+
});
|
|
134
|
+
expect(deckCredits({ signedIn: true, balance: 12.5, turnStartBalance: 12.5 })).toEqual({
|
|
135
|
+
kind: "balance",
|
|
136
|
+
balance: 12.5,
|
|
137
|
+
spend: null
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe("permissionLabel", () => {
|
|
142
|
+
const none = {
|
|
143
|
+
isShellMode: false,
|
|
144
|
+
planModeActive: false,
|
|
145
|
+
autoApproveEdits: false,
|
|
146
|
+
bypassPermissions: false,
|
|
147
|
+
configuredMode: "manual"
|
|
148
|
+
};
|
|
149
|
+
it("is null for manual approvals", () => {
|
|
150
|
+
expect(permissionLabel(none)).toBeNull();
|
|
151
|
+
});
|
|
152
|
+
it("shows an agent configured to auto-approve, with no session override", () => {
|
|
153
|
+
expect(permissionLabel({ ...none, configuredMode: "auto-approve" })).toBe("auto-approve");
|
|
154
|
+
});
|
|
155
|
+
it("names the session mode first and keeps configured auto-approval beside it", () => {
|
|
156
|
+
const configured = { ...none, configuredMode: "auto-approve" };
|
|
157
|
+
expect(permissionLabel({ ...configured, planModeActive: true })).toBe(
|
|
158
|
+
"plan mode \xB7 auto-approve"
|
|
159
|
+
);
|
|
160
|
+
expect(permissionLabel({ ...configured, autoApproveEdits: true })).toBe(
|
|
161
|
+
"accept edits \xB7 auto-approve"
|
|
162
|
+
);
|
|
163
|
+
expect(permissionLabel({ ...none, autoApproveEdits: true })).toBe("accept edits");
|
|
164
|
+
expect(permissionLabel({ ...none, bypassPermissions: true })).toBe("auto-approve");
|
|
165
|
+
expect(permissionLabel({ ...configured, isShellMode: true })).toBe(
|
|
166
|
+
"shell mode \xB7 auto-approve"
|
|
167
|
+
);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe("keepsTurnSpend", () => {
|
|
171
|
+
it("keeps the spend when the first turn creates its session", () => {
|
|
172
|
+
expect(keepsTurnSpend(null, "s1")).toBe(true);
|
|
173
|
+
});
|
|
174
|
+
it("clears the spend on a switch to another session", () => {
|
|
175
|
+
expect(keepsTurnSpend("s1", "s2")).toBe(false);
|
|
176
|
+
expect(keepsTurnSpend("s1", null)).toBe(false);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
describe("nextTurnBaseline", () => {
|
|
180
|
+
const before = { sessionId: "s1", account: "ada", isProcessing: false, balance: 12.84 };
|
|
181
|
+
const now = { sessionId: "s1", account: "ada", isProcessing: false, balance: 12.5 };
|
|
182
|
+
it("takes the balance when a turn starts and holds it through the turn", () => {
|
|
183
|
+
const started = nextTurnBaseline(before, { ...now, isProcessing: true });
|
|
184
|
+
expect(started.balance).toBe(12.5);
|
|
185
|
+
const later = nextTurnBaseline(started, { ...now, isProcessing: true, balance: 12.1 });
|
|
186
|
+
expect(later.balance).toBe(12.5);
|
|
187
|
+
});
|
|
188
|
+
it("keeps the baseline while the first turn creates its session", () => {
|
|
189
|
+
const prev = { sessionId: null, account: "ada", isProcessing: true, balance: 12.84 };
|
|
190
|
+
const next = nextTurnBaseline(prev, { ...now, isProcessing: true });
|
|
191
|
+
expect(next).toEqual({
|
|
192
|
+
sessionId: "s1",
|
|
193
|
+
account: "ada",
|
|
194
|
+
isProcessing: true,
|
|
195
|
+
balance: 12.84
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
it("clears the baseline on a session switch", () => {
|
|
199
|
+
expect(nextTurnBaseline(before, { ...now, sessionId: "s2" }).balance).toBeNull();
|
|
200
|
+
});
|
|
201
|
+
it("clears the baseline on sign-out, so it never carries to another account", () => {
|
|
202
|
+
expect(nextTurnBaseline(before, { ...now, account: null }).balance).toBeNull();
|
|
203
|
+
});
|
|
204
|
+
it("clears the baseline when another account signs in without a sign-out", () => {
|
|
205
|
+
expect(nextTurnBaseline(before, { ...now, account: "grace" }).balance).toBeNull();
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe("deckCollapsed", () => {
|
|
209
|
+
it("collapses under focused overlays, which budget for the whole screen", () => {
|
|
210
|
+
expect(deckCollapsed("model-selector")).toBe(true);
|
|
211
|
+
});
|
|
212
|
+
it("stays up with no overlay and under inline ones", () => {
|
|
213
|
+
expect(deckCollapsed("none")).toBe(false);
|
|
214
|
+
expect(deckCollapsed("slash-autocomplete")).toBe(false);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var fault_block_exports = {};
|
|
20
|
+
__export(fault_block_exports, {
|
|
21
|
+
faultBlock: () => faultBlock
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(fault_block_exports);
|
|
24
|
+
const RECOVERY = /^💡\s*/u;
|
|
25
|
+
function faultBlock(content) {
|
|
26
|
+
const lines = content.replace(/^Error:\s*/, "").split("\n").map((line) => line.trim()).filter((line) => line.length > 0);
|
|
27
|
+
const rest = lines.slice(1);
|
|
28
|
+
return {
|
|
29
|
+
title: lines[0] ?? "Something went wrong",
|
|
30
|
+
body: rest.filter((line) => !RECOVERY.test(line)),
|
|
31
|
+
next: rest.filter((line) => RECOVERY.test(line)).map((line) => line.replace(RECOVERY, ""))
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
35
|
+
0 && (module.exports = {
|
|
36
|
+
faultBlock
|
|
37
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits an error message's text into what the Signal FAULT block shows. Errors reach the
|
|
3
|
+
* transcript as one string: "Error: what happened", then any detail, then "💡 what to try".
|
|
4
|
+
*/
|
|
5
|
+
export interface FaultBlock {
|
|
6
|
+
title: string;
|
|
7
|
+
/** Further lines of the error. */
|
|
8
|
+
body: string[];
|
|
9
|
+
/** Recovery steps. */
|
|
10
|
+
next: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare function faultBlock(content: string): FaultBlock;
|
|
13
|
+
//# sourceMappingURL=fault-block.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fault-block.d.ts","sourceRoot":"","sources":["../../src/utils/fault-block.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,sBAAsB;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAClB;AAID,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAYtD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const RECOVERY = /^💡\s*/u;
|
|
2
|
+
function faultBlock(content) {
|
|
3
|
+
const lines = content.replace(/^Error:\s*/, "").split("\n").map((line) => line.trim()).filter((line) => line.length > 0);
|
|
4
|
+
const rest = lines.slice(1);
|
|
5
|
+
return {
|
|
6
|
+
title: lines[0] ?? "Something went wrong",
|
|
7
|
+
body: rest.filter((line) => !RECOVERY.test(line)),
|
|
8
|
+
next: rest.filter((line) => RECOVERY.test(line)).map((line) => line.replace(RECOVERY, ""))
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
faultBlock
|
|
13
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var import_vitest = require("vitest");
|
|
3
|
+
var import_fault_block = require("./fault-block.js");
|
|
4
|
+
(0, import_vitest.describe)("faultBlock", () => {
|
|
5
|
+
(0, import_vitest.it)('takes the title without its "Error:" prefix', () => {
|
|
6
|
+
(0, import_vitest.expect)((0, import_fault_block.faultBlock)("Error: Model rate limit")).toEqual({
|
|
7
|
+
title: "Model rate limit",
|
|
8
|
+
body: [],
|
|
9
|
+
next: []
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
(0, import_vitest.it)("separates further lines from recovery steps", () => {
|
|
13
|
+
const block = (0, import_fault_block.faultBlock)(
|
|
14
|
+
"Error: Cloud unreachable\ntimed out\n\n\u{1F4A1} Check your connection\n\u{1F4A1} Try /status"
|
|
15
|
+
);
|
|
16
|
+
(0, import_vitest.expect)(block.title).toBe("Cloud unreachable");
|
|
17
|
+
(0, import_vitest.expect)(block.body).toEqual(["timed out"]);
|
|
18
|
+
(0, import_vitest.expect)(block.next).toEqual(["Check your connection", "Try /status"]);
|
|
19
|
+
});
|
|
20
|
+
(0, import_vitest.it)("still has a title when the error is empty", () => {
|
|
21
|
+
(0, import_vitest.expect)((0, import_fault_block.faultBlock)("Error: ").title).toBe("Something went wrong");
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fault-block.test.d.ts","sourceRoot":"","sources":["../../src/utils/fault-block.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { faultBlock } from "./fault-block.js";
|
|
3
|
+
describe("faultBlock", () => {
|
|
4
|
+
it('takes the title without its "Error:" prefix', () => {
|
|
5
|
+
expect(faultBlock("Error: Model rate limit")).toEqual({
|
|
6
|
+
title: "Model rate limit",
|
|
7
|
+
body: [],
|
|
8
|
+
next: []
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
it("separates further lines from recovery steps", () => {
|
|
12
|
+
const block = faultBlock(
|
|
13
|
+
"Error: Cloud unreachable\ntimed out\n\n\u{1F4A1} Check your connection\n\u{1F4A1} Try /status"
|
|
14
|
+
);
|
|
15
|
+
expect(block.title).toBe("Cloud unreachable");
|
|
16
|
+
expect(block.body).toEqual(["timed out"]);
|
|
17
|
+
expect(block.next).toEqual(["Check your connection", "Try /status"]);
|
|
18
|
+
});
|
|
19
|
+
it("still has a title when the error is empty", () => {
|
|
20
|
+
expect(faultBlock("Error: ").title).toBe("Something went wrong");
|
|
21
|
+
});
|
|
22
|
+
});
|
|
@@ -37,6 +37,7 @@ __export(messageFormatting_exports, {
|
|
|
37
37
|
createToolMessage: () => createToolMessage,
|
|
38
38
|
createUserMessage: () => createUserMessage,
|
|
39
39
|
extractAutomationTriggerInfo: () => extractAutomationTriggerInfo,
|
|
40
|
+
formatDuration: () => formatDuration,
|
|
40
41
|
formatPathForDisplay: () => formatPathForDisplay,
|
|
41
42
|
formatToolHeader: () => formatToolHeader,
|
|
42
43
|
formatToolResultPreview: () => formatToolResultPreview,
|
|
@@ -44,8 +45,6 @@ __export(messageFormatting_exports, {
|
|
|
44
45
|
getToolDisplayName: () => getToolDisplayName,
|
|
45
46
|
getToolTypeBadge: () => getToolTypeBadge,
|
|
46
47
|
makeRelativePath: () => makeRelativePath,
|
|
47
|
-
normalizeToolName: () => normalizeToolName,
|
|
48
|
-
shouldHideTool: () => shouldHideTool,
|
|
49
48
|
stripAutomationTriggerTags: () => stripAutomationTriggerTags
|
|
50
49
|
});
|
|
51
50
|
module.exports = __toCommonJS(messageFormatting_exports);
|
|
@@ -53,22 +52,8 @@ var import_path = __toESM(require("path"), 1);
|
|
|
53
52
|
var import_os = __toESM(require("os"), 1);
|
|
54
53
|
var import_core = require("@dexto/core");
|
|
55
54
|
var import_agent_backend = require("../agent-backend.js");
|
|
55
|
+
var import_background_failure = require("./background-failure.js");
|
|
56
56
|
var import_idGenerator = require("./idGenerator.js");
|
|
57
|
-
const HIDDEN_TOOL_NAMES = /* @__PURE__ */ new Set(["wait_for"]);
|
|
58
|
-
function normalizeToolName(toolName) {
|
|
59
|
-
if (toolName.startsWith("mcp--")) {
|
|
60
|
-
const trimmed = toolName.substring("mcp--".length);
|
|
61
|
-
const parts = trimmed.split("--");
|
|
62
|
-
return parts.length >= 2 ? parts.slice(1).join("--") : trimmed;
|
|
63
|
-
}
|
|
64
|
-
return toolName;
|
|
65
|
-
}
|
|
66
|
-
function shouldHideTool(toolName) {
|
|
67
|
-
if (!toolName) {
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
return HIDDEN_TOOL_NAMES.has(normalizeToolName(toolName));
|
|
71
|
-
}
|
|
72
57
|
const backgroundCompletionRegex = /<background-task-completion>[\s\S]*?<\/background-task-completion>/g;
|
|
73
58
|
const stripBackgroundCompletion = (text) => text.replace(backgroundCompletionRegex, "").replace("<background-task-completion>", "").trim();
|
|
74
59
|
const AUTOMATION_TRIGGER_REGEX = /<scheduled_automation_trigger>[\s\S]*?<\/scheduled_automation_trigger>/;
|
|
@@ -216,7 +201,8 @@ function createErrorMessage(error) {
|
|
|
216
201
|
id: (0, import_idGenerator.generateMessageId)("error"),
|
|
217
202
|
role: "system",
|
|
218
203
|
content: `Error: ${content}`,
|
|
219
|
-
timestamp: /* @__PURE__ */ new Date()
|
|
204
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
205
|
+
systemKind: "fault"
|
|
220
206
|
};
|
|
221
207
|
}
|
|
222
208
|
function createToolMessage(toolName) {
|
|
@@ -242,6 +228,21 @@ function extractTextContent(content) {
|
|
|
242
228
|
}
|
|
243
229
|
return content.filter(import_core.isTextPart).map((part) => part.text).join("\n");
|
|
244
230
|
}
|
|
231
|
+
function formatDuration(ms) {
|
|
232
|
+
const seconds = Math.floor(ms / 1e3);
|
|
233
|
+
const tenths = Math.floor(ms % 1e3 / 100);
|
|
234
|
+
if (seconds < 60) {
|
|
235
|
+
return `${seconds}.${tenths}s`;
|
|
236
|
+
}
|
|
237
|
+
const minutes = Math.floor(seconds / 60);
|
|
238
|
+
const remainingSeconds = seconds % 60;
|
|
239
|
+
if (minutes < 60) {
|
|
240
|
+
return `${minutes}m ${remainingSeconds}s`;
|
|
241
|
+
}
|
|
242
|
+
const hours = Math.floor(minutes / 60);
|
|
243
|
+
const remainingMinutes = minutes % 60;
|
|
244
|
+
return `${hours}h ${remainingMinutes}m`;
|
|
245
|
+
}
|
|
245
246
|
function formatToolResultPreview(result) {
|
|
246
247
|
try {
|
|
247
248
|
const parsed = JSON.parse(result);
|
|
@@ -303,15 +304,14 @@ function convertHistoryToUIMessages(history, sessionId) {
|
|
|
303
304
|
history.forEach((msg, index) => {
|
|
304
305
|
const timestamp = new Date(msg.timestamp ?? Date.now() - (history.length - index) * 1e3);
|
|
305
306
|
if ((0, import_core.isToolMessage)(msg)) {
|
|
306
|
-
if (shouldHideTool(msg.name)) {
|
|
307
|
-
return;
|
|
308
|
-
}
|
|
309
307
|
const toolCall = toolCallMap.get(msg.toolCallId);
|
|
310
308
|
const displayName = msg.presentationSnapshot?.header?.title ?? getToolDisplayName(msg.name);
|
|
311
309
|
let toolContent = displayName;
|
|
310
|
+
let toolArgs = "";
|
|
312
311
|
const snapshotArgsText = msg.presentationSnapshot?.header?.argsText;
|
|
313
312
|
if (typeof snapshotArgsText === "string" && snapshotArgsText.length > 0) {
|
|
314
313
|
toolContent = `${displayName}(${snapshotArgsText})`;
|
|
314
|
+
toolArgs = snapshotArgsText;
|
|
315
315
|
}
|
|
316
316
|
if (!snapshotArgsText && toolCall) {
|
|
317
317
|
try {
|
|
@@ -319,6 +319,7 @@ function convertHistoryToUIMessages(history, sessionId) {
|
|
|
319
319
|
const argsFormatted = formatArgsFallback(args);
|
|
320
320
|
if (argsFormatted) {
|
|
321
321
|
toolContent = `${displayName}(${argsFormatted})`;
|
|
322
|
+
toolArgs = argsFormatted;
|
|
322
323
|
}
|
|
323
324
|
} catch {
|
|
324
325
|
}
|
|
@@ -333,9 +334,12 @@ function convertHistoryToUIMessages(history, sessionId) {
|
|
|
333
334
|
role: "tool",
|
|
334
335
|
content: toolContent,
|
|
335
336
|
timestamp,
|
|
337
|
+
toolName: msg.name,
|
|
338
|
+
toolArgs,
|
|
336
339
|
toolStatus: "finished",
|
|
337
340
|
toolResult: resultPreview,
|
|
338
341
|
isError: msg.success === false,
|
|
342
|
+
...(0, import_background_failure.storedBackgroundFailure)(msg.name, extractTextContent(msg.content)),
|
|
339
343
|
// Store content parts for potential rich rendering
|
|
340
344
|
toolContent: msg.content,
|
|
341
345
|
// Restore structured display data for rich rendering (diffs, shell output, etc.)
|
|
@@ -423,6 +427,7 @@ async function getStartupInfo(agent, sessionId) {
|
|
|
423
427
|
createToolMessage,
|
|
424
428
|
createUserMessage,
|
|
425
429
|
extractAutomationTriggerInfo,
|
|
430
|
+
formatDuration,
|
|
426
431
|
formatPathForDisplay,
|
|
427
432
|
formatToolHeader,
|
|
428
433
|
formatToolResultPreview,
|
|
@@ -430,7 +435,5 @@ async function getStartupInfo(agent, sessionId) {
|
|
|
430
435
|
getToolDisplayName,
|
|
431
436
|
getToolTypeBadge,
|
|
432
437
|
makeRelativePath,
|
|
433
|
-
normalizeToolName,
|
|
434
|
-
shouldHideTool,
|
|
435
438
|
stripAutomationTriggerTags
|
|
436
439
|
});
|
|
@@ -5,8 +5,6 @@
|
|
|
5
5
|
import type { InternalMessage, ToolPresentationSnapshotV1 } from '@dexto/core';
|
|
6
6
|
import type { Message, ExternalTriggerStyledData } from '../state/types.js';
|
|
7
7
|
import { type TuiAgentBackend } from '../agent-backend.js';
|
|
8
|
-
export declare function normalizeToolName(toolName: string): string;
|
|
9
|
-
export declare function shouldHideTool(toolName: string | undefined): boolean;
|
|
10
8
|
export declare function extractAutomationTriggerInfo(content: string): {
|
|
11
9
|
label: string;
|
|
12
10
|
timestamp: string | null;
|
|
@@ -96,6 +94,11 @@ export declare function createToolMessage(toolName: string): Message;
|
|
|
96
94
|
* Formats a streaming placeholder message
|
|
97
95
|
*/
|
|
98
96
|
export declare function createStreamingMessage(): Message;
|
|
97
|
+
/**
|
|
98
|
+
* Format milliseconds into a compact human-readable string
|
|
99
|
+
* Examples: "1.2s", "1m 23s", "1h 2m"
|
|
100
|
+
*/
|
|
101
|
+
export declare function formatDuration(ms: number): string;
|
|
99
102
|
/**
|
|
100
103
|
* Generates a preview of tool result content for display
|
|
101
104
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageFormatting.d.ts","sourceRoot":"","sources":["../../src/utils/messageFormatting.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACR,eAAe,EAGf,0BAA0B,EAC7B,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"messageFormatting.d.ts","sourceRoot":"","sources":["../../src/utils/messageFormatting.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACR,eAAe,EAGf,0BAA0B,EAC7B,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAahF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;CAC/C,GAAG,IAAI,CAiBP;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMlE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAmB1F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,GAAE,MAAW,EACrB,GAAG,GAAE,MAAsB,GAC5B,MAAM,CAWR;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiC7E;AAgBD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWzD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,EAAE,0BAA0B,CAAC;CACrD,GAAG,mBAAmB,CAuBtB;AAqBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO1D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CASvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CASjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAO3D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAQhD;AAgBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAkBjD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAkC9D;AA+CD;;GAEG;AACH,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,eAAe,EAAE,EAC1B,SAAS,EAAE,MAAM,GAClB,OAAO,EAAE,CAiIX;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;;;;;;;;GA+BpF"}
|
|
@@ -2,23 +2,9 @@ import path from "path";
|
|
|
2
2
|
import os from "os";
|
|
3
3
|
import { isTextPart, isAssistantMessage, isToolMessage } from "@dexto/core";
|
|
4
4
|
import { supportsStartupInfo } from "../agent-backend.js";
|
|
5
|
-
const HIDDEN_TOOL_NAMES = /* @__PURE__ */ new Set(["wait_for"]);
|
|
6
|
-
function normalizeToolName(toolName) {
|
|
7
|
-
if (toolName.startsWith("mcp--")) {
|
|
8
|
-
const trimmed = toolName.substring("mcp--".length);
|
|
9
|
-
const parts = trimmed.split("--");
|
|
10
|
-
return parts.length >= 2 ? parts.slice(1).join("--") : trimmed;
|
|
11
|
-
}
|
|
12
|
-
return toolName;
|
|
13
|
-
}
|
|
14
|
-
function shouldHideTool(toolName) {
|
|
15
|
-
if (!toolName) {
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
return HIDDEN_TOOL_NAMES.has(normalizeToolName(toolName));
|
|
19
|
-
}
|
|
20
5
|
const backgroundCompletionRegex = /<background-task-completion>[\s\S]*?<\/background-task-completion>/g;
|
|
21
6
|
const stripBackgroundCompletion = (text) => text.replace(backgroundCompletionRegex, "").replace("<background-task-completion>", "").trim();
|
|
7
|
+
import { storedBackgroundFailure } from "./background-failure.js";
|
|
22
8
|
import { generateMessageId } from "./idGenerator.js";
|
|
23
9
|
const AUTOMATION_TRIGGER_REGEX = /<scheduled_automation_trigger>[\s\S]*?<\/scheduled_automation_trigger>/;
|
|
24
10
|
function extractAutomationTriggerInfo(content) {
|
|
@@ -165,7 +151,8 @@ function createErrorMessage(error) {
|
|
|
165
151
|
id: generateMessageId("error"),
|
|
166
152
|
role: "system",
|
|
167
153
|
content: `Error: ${content}`,
|
|
168
|
-
timestamp: /* @__PURE__ */ new Date()
|
|
154
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
155
|
+
systemKind: "fault"
|
|
169
156
|
};
|
|
170
157
|
}
|
|
171
158
|
function createToolMessage(toolName) {
|
|
@@ -191,6 +178,21 @@ function extractTextContent(content) {
|
|
|
191
178
|
}
|
|
192
179
|
return content.filter(isTextPart).map((part) => part.text).join("\n");
|
|
193
180
|
}
|
|
181
|
+
function formatDuration(ms) {
|
|
182
|
+
const seconds = Math.floor(ms / 1e3);
|
|
183
|
+
const tenths = Math.floor(ms % 1e3 / 100);
|
|
184
|
+
if (seconds < 60) {
|
|
185
|
+
return `${seconds}.${tenths}s`;
|
|
186
|
+
}
|
|
187
|
+
const minutes = Math.floor(seconds / 60);
|
|
188
|
+
const remainingSeconds = seconds % 60;
|
|
189
|
+
if (minutes < 60) {
|
|
190
|
+
return `${minutes}m ${remainingSeconds}s`;
|
|
191
|
+
}
|
|
192
|
+
const hours = Math.floor(minutes / 60);
|
|
193
|
+
const remainingMinutes = minutes % 60;
|
|
194
|
+
return `${hours}h ${remainingMinutes}m`;
|
|
195
|
+
}
|
|
194
196
|
function formatToolResultPreview(result) {
|
|
195
197
|
try {
|
|
196
198
|
const parsed = JSON.parse(result);
|
|
@@ -252,15 +254,14 @@ function convertHistoryToUIMessages(history, sessionId) {
|
|
|
252
254
|
history.forEach((msg, index) => {
|
|
253
255
|
const timestamp = new Date(msg.timestamp ?? Date.now() - (history.length - index) * 1e3);
|
|
254
256
|
if (isToolMessage(msg)) {
|
|
255
|
-
if (shouldHideTool(msg.name)) {
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
257
|
const toolCall = toolCallMap.get(msg.toolCallId);
|
|
259
258
|
const displayName = msg.presentationSnapshot?.header?.title ?? getToolDisplayName(msg.name);
|
|
260
259
|
let toolContent = displayName;
|
|
260
|
+
let toolArgs = "";
|
|
261
261
|
const snapshotArgsText = msg.presentationSnapshot?.header?.argsText;
|
|
262
262
|
if (typeof snapshotArgsText === "string" && snapshotArgsText.length > 0) {
|
|
263
263
|
toolContent = `${displayName}(${snapshotArgsText})`;
|
|
264
|
+
toolArgs = snapshotArgsText;
|
|
264
265
|
}
|
|
265
266
|
if (!snapshotArgsText && toolCall) {
|
|
266
267
|
try {
|
|
@@ -268,6 +269,7 @@ function convertHistoryToUIMessages(history, sessionId) {
|
|
|
268
269
|
const argsFormatted = formatArgsFallback(args);
|
|
269
270
|
if (argsFormatted) {
|
|
270
271
|
toolContent = `${displayName}(${argsFormatted})`;
|
|
272
|
+
toolArgs = argsFormatted;
|
|
271
273
|
}
|
|
272
274
|
} catch {
|
|
273
275
|
}
|
|
@@ -282,9 +284,12 @@ function convertHistoryToUIMessages(history, sessionId) {
|
|
|
282
284
|
role: "tool",
|
|
283
285
|
content: toolContent,
|
|
284
286
|
timestamp,
|
|
287
|
+
toolName: msg.name,
|
|
288
|
+
toolArgs,
|
|
285
289
|
toolStatus: "finished",
|
|
286
290
|
toolResult: resultPreview,
|
|
287
291
|
isError: msg.success === false,
|
|
292
|
+
...storedBackgroundFailure(msg.name, extractTextContent(msg.content)),
|
|
288
293
|
// Store content parts for potential rich rendering
|
|
289
294
|
toolContent: msg.content,
|
|
290
295
|
// Restore structured display data for rich rendering (diffs, shell output, etc.)
|
|
@@ -371,6 +376,7 @@ export {
|
|
|
371
376
|
createToolMessage,
|
|
372
377
|
createUserMessage,
|
|
373
378
|
extractAutomationTriggerInfo,
|
|
379
|
+
formatDuration,
|
|
374
380
|
formatPathForDisplay,
|
|
375
381
|
formatToolHeader,
|
|
376
382
|
formatToolResultPreview,
|
|
@@ -378,7 +384,5 @@ export {
|
|
|
378
384
|
getToolDisplayName,
|
|
379
385
|
getToolTypeBadge,
|
|
380
386
|
makeRelativePath,
|
|
381
|
-
normalizeToolName,
|
|
382
|
-
shouldHideTool,
|
|
383
387
|
stripAutomationTriggerTags
|
|
384
388
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var import_vitest = require("vitest");
|
|
3
3
|
var import_messageFormatting = require("./messageFormatting.js");
|
|
4
|
+
var import_tool_step = require("./tool-step.js");
|
|
4
5
|
(0, import_vitest.describe)("formatToolHeader fallback args", () => {
|
|
5
6
|
(0, import_vitest.it)("truncates from the start (not mid-string)", () => {
|
|
6
7
|
const long = "with base path set to packages/server (or absolute if needed). Summarize key directories and notable config/source files.";
|
|
@@ -14,3 +15,36 @@ var import_messageFormatting = require("./messageFormatting.js");
|
|
|
14
15
|
(0, import_vitest.expect)(header).toContain("...");
|
|
15
16
|
});
|
|
16
17
|
});
|
|
18
|
+
(0, import_vitest.describe)("convertHistoryToUIMessages for a background command read back", () => {
|
|
19
|
+
function resumed(text) {
|
|
20
|
+
const history = [
|
|
21
|
+
{
|
|
22
|
+
role: "tool",
|
|
23
|
+
name: "bash_output",
|
|
24
|
+
toolCallId: "c1",
|
|
25
|
+
success: true,
|
|
26
|
+
content: [{ type: "text", text }],
|
|
27
|
+
timestamp: 1
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
const message = (0, import_messageFormatting.convertHistoryToUIMessages)(history, "s1")[0];
|
|
31
|
+
if (message === void 0) throw new Error("expected a tool message");
|
|
32
|
+
return message;
|
|
33
|
+
}
|
|
34
|
+
(0, import_vitest.it)("shows a failed command as failed, with its output", () => {
|
|
35
|
+
const message = resumed(
|
|
36
|
+
JSON.stringify({ status: "failed", stderr: "boom", stdout: "", exit_code: 2 })
|
|
37
|
+
);
|
|
38
|
+
(0, import_vitest.expect)((0, import_tool_step.toolStep)(message).state).toBe("fail");
|
|
39
|
+
(0, import_vitest.expect)((0, import_tool_step.toolOutput)(message)).toEqual(["boom"]);
|
|
40
|
+
});
|
|
41
|
+
(0, import_vitest.it)("leaves a completed command as it was", () => {
|
|
42
|
+
const message = resumed(JSON.stringify({ status: "completed", stdout: "done" }));
|
|
43
|
+
(0, import_vitest.expect)((0, import_tool_step.toolStep)(message).state).toBe("ok");
|
|
44
|
+
});
|
|
45
|
+
(0, import_vitest.it)("leaves a row as it was when the stored text cannot be parsed", () => {
|
|
46
|
+
const message = resumed('{"status":"failed","stderr":"bo\n\n[Output truncated: ...]');
|
|
47
|
+
(0, import_vitest.expect)((0, import_tool_step.toolStep)(message).state).toBe("ok");
|
|
48
|
+
(0, import_vitest.expect)(message.toolOutcome).toBeUndefined();
|
|
49
|
+
});
|
|
50
|
+
});
|