fss-link 1.0.49 → 1.0.51
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/index.js +0 -0
- package/dist/package.json +2 -2
- package/dist/src/config/auth.js +8 -5
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/database.d.ts +103 -11
- package/dist/src/config/database.js +301 -59
- package/dist/src/config/database.js.map +1 -1
- package/dist/src/config/databaseBackup.d.ts +114 -0
- package/dist/src/config/databaseBackup.js +334 -0
- package/dist/src/config/databaseBackup.js.map +1 -0
- package/dist/src/config/databaseMigrations.d.ts +63 -0
- package/dist/src/config/databaseMigrations.js +379 -0
- package/dist/src/config/databaseMigrations.js.map +1 -0
- package/dist/src/config/databasePool.d.ts +70 -0
- package/dist/src/config/databasePool.js +193 -0
- package/dist/src/config/databasePool.js.map +1 -0
- package/dist/src/config/queryOptimizer.d.ts +127 -0
- package/dist/src/config/queryOptimizer.js +309 -0
- package/dist/src/config/queryOptimizer.js.map +1 -0
- package/dist/src/utils/sandbox.js +2 -8
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/validateNonInterActiveAuth.js +3 -7
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/dist/commands/mcp/add.test.ts +0 -122
- package/dist/commands/mcp/add.ts +0 -222
- package/dist/commands/mcp/list.test.ts +0 -154
- package/dist/commands/mcp/list.ts +0 -139
- package/dist/commands/mcp/remove.test.ts +0 -69
- package/dist/commands/mcp/remove.ts +0 -60
- package/dist/commands/mcp.test.ts +0 -55
- package/dist/commands/mcp.ts +0 -27
- package/dist/config/apiValidation.test.ts +0 -118
- package/dist/config/auth.test.ts +0 -79
- package/dist/config/auth.ts +0 -100
- package/dist/config/config.integration.test.ts +0 -407
- package/dist/config/config.test.ts +0 -1952
- package/dist/config/config.ts +0 -690
- package/dist/config/database.test.ts +0 -96
- package/dist/config/database.ts +0 -824
- package/dist/config/extension.test.ts +0 -236
- package/dist/config/extension.ts +0 -180
- package/dist/config/keyBindings.test.ts +0 -62
- package/dist/config/keyBindings.ts +0 -184
- package/dist/config/modelManager.ts +0 -326
- package/dist/config/providerManager.ts +0 -244
- package/dist/config/providerPersistence.test.ts +0 -377
- package/dist/config/providerPersistence.ts +0 -105
- package/dist/config/sandboxConfig.ts +0 -107
- package/dist/config/settings.test.ts +0 -1424
- package/dist/config/settings.ts +0 -517
- package/dist/config/settingsSchema.test.ts +0 -252
- package/dist/config/settingsSchema.ts +0 -728
- package/dist/config/trustedFolders.test.ts +0 -208
- package/dist/config/trustedFolders.ts +0 -167
- package/dist/gemini.test.tsx +0 -252
- package/dist/gemini.tsx +0 -357
- package/dist/generated/git-commit.ts +0 -10
- package/dist/index.ts +0 -21
- package/dist/nonInteractiveCli.test.ts +0 -276
- package/dist/nonInteractiveCli.ts +0 -143
- package/dist/patches/is-in-ci.ts +0 -17
- package/dist/services/BuiltinCommandLoader.test.ts +0 -127
- package/dist/services/BuiltinCommandLoader.ts +0 -95
- package/dist/services/CommandService.test.ts +0 -352
- package/dist/services/CommandService.ts +0 -103
- package/dist/services/FileCommandLoader.test.ts +0 -1002
- package/dist/services/FileCommandLoader.ts +0 -289
- package/dist/services/McpPromptLoader.ts +0 -231
- package/dist/services/SearchEngineConfigProvider.ts +0 -100
- package/dist/services/prompt-processors/argumentProcessor.test.ts +0 -41
- package/dist/services/prompt-processors/argumentProcessor.ts +0 -23
- package/dist/services/prompt-processors/shellProcessor.test.ts +0 -709
- package/dist/services/prompt-processors/shellProcessor.ts +0 -248
- package/dist/services/prompt-processors/types.ts +0 -44
- package/dist/services/types.ts +0 -24
- package/dist/src/config/apiValidation.test.d.ts +0 -6
- package/dist/src/config/apiValidation.test.js +0 -99
- package/dist/src/config/apiValidation.test.js.map +0 -1
- package/dist/src/config/database.test.d.ts +0 -6
- package/dist/src/config/database.test.js +0 -80
- package/dist/src/config/database.test.js.map +0 -1
- package/dist/src/config/providerManager.d.ts +0 -74
- package/dist/src/config/providerManager.js +0 -203
- package/dist/src/config/providerManager.js.map +0 -1
- package/dist/src/config/providerPersistence.test.d.ts +0 -6
- package/dist/src/config/providerPersistence.test.js +0 -283
- package/dist/src/config/providerPersistence.test.js.map +0 -1
- package/dist/src/ui/components/GeminiKeyDialog.d.ts +0 -11
- package/dist/src/ui/components/GeminiKeyDialog.js +0 -156
- package/dist/src/ui/components/GeminiKeyDialog.js.map +0 -1
- package/dist/src/ui/components/OpenAIEndpointDialog.d.ts +0 -19
- package/dist/src/ui/components/OpenAIEndpointDialog.js +0 -163
- package/dist/src/ui/components/OpenAIEndpointDialog.js.map +0 -1
- package/dist/test-setup.ts +0 -12
- package/dist/test-utils/customMatchers.ts +0 -65
- package/dist/test-utils/mockCommandContext.test.ts +0 -62
- package/dist/test-utils/mockCommandContext.ts +0 -105
- package/dist/test-utils/render.tsx +0 -18
- package/dist/ui/App.test.tsx +0 -2181
- package/dist/ui/App.tsx +0 -1344
- package/dist/ui/IdeIntegrationNudge.tsx +0 -98
- package/dist/ui/__snapshots__/App.test.tsx.snap +0 -124
- package/dist/ui/colors.ts +0 -56
- package/dist/ui/commands/aboutCommand.test.ts +0 -153
- package/dist/ui/commands/aboutCommand.ts +0 -49
- package/dist/ui/commands/authCommand.test.ts +0 -36
- package/dist/ui/commands/authCommand.ts +0 -17
- package/dist/ui/commands/bugCommand.test.ts +0 -114
- package/dist/ui/commands/bugCommand.ts +0 -92
- package/dist/ui/commands/chatCommand.test.ts +0 -414
- package/dist/ui/commands/chatCommand.ts +0 -280
- package/dist/ui/commands/clearCommand.test.ts +0 -100
- package/dist/ui/commands/clearCommand.ts +0 -29
- package/dist/ui/commands/compressCommand.test.ts +0 -129
- package/dist/ui/commands/compressCommand.ts +0 -78
- package/dist/ui/commands/contextCommand.ts +0 -132
- package/dist/ui/commands/copyCommand.test.ts +0 -296
- package/dist/ui/commands/copyCommand.ts +0 -67
- package/dist/ui/commands/corgiCommand.test.ts +0 -34
- package/dist/ui/commands/corgiCommand.ts +0 -16
- package/dist/ui/commands/directoryCommand.test.tsx +0 -185
- package/dist/ui/commands/directoryCommand.tsx +0 -179
- package/dist/ui/commands/docsCommand.test.ts +0 -99
- package/dist/ui/commands/docsCommand.ts +0 -42
- package/dist/ui/commands/editorCommand.test.ts +0 -30
- package/dist/ui/commands/editorCommand.ts +0 -21
- package/dist/ui/commands/extensionsCommand.test.ts +0 -67
- package/dist/ui/commands/extensionsCommand.ts +0 -46
- package/dist/ui/commands/helpCommand.test.ts +0 -52
- package/dist/ui/commands/helpCommand.ts +0 -23
- package/dist/ui/commands/ideCommand.test.ts +0 -255
- package/dist/ui/commands/ideCommand.ts +0 -283
- package/dist/ui/commands/initCommand.test.ts +0 -127
- package/dist/ui/commands/initCommand.ts +0 -117
- package/dist/ui/commands/mcpCommand.test.ts +0 -1057
- package/dist/ui/commands/mcpCommand.ts +0 -531
- package/dist/ui/commands/memoryCommand.test.ts +0 -344
- package/dist/ui/commands/memoryCommand.ts +0 -305
- package/dist/ui/commands/privacyCommand.test.ts +0 -38
- package/dist/ui/commands/privacyCommand.ts +0 -17
- package/dist/ui/commands/quitCommand.test.ts +0 -55
- package/dist/ui/commands/quitCommand.ts +0 -36
- package/dist/ui/commands/restoreCommand.test.ts +0 -250
- package/dist/ui/commands/restoreCommand.ts +0 -157
- package/dist/ui/commands/searchEngineSetupCommand.ts +0 -18
- package/dist/ui/commands/settingsCommand.test.ts +0 -36
- package/dist/ui/commands/settingsCommand.ts +0 -17
- package/dist/ui/commands/setupGithubCommand.test.ts +0 -238
- package/dist/ui/commands/setupGithubCommand.ts +0 -212
- package/dist/ui/commands/speakCommand.ts +0 -175
- package/dist/ui/commands/statsCommand.test.ts +0 -78
- package/dist/ui/commands/statsCommand.ts +0 -70
- package/dist/ui/commands/terminalSetupCommand.test.ts +0 -85
- package/dist/ui/commands/terminalSetupCommand.ts +0 -45
- package/dist/ui/commands/themeCommand.test.ts +0 -38
- package/dist/ui/commands/themeCommand.ts +0 -17
- package/dist/ui/commands/toolsCommand.test.ts +0 -105
- package/dist/ui/commands/toolsCommand.ts +0 -71
- package/dist/ui/commands/ttsCommand.ts +0 -143
- package/dist/ui/commands/types.ts +0 -204
- package/dist/ui/commands/vimCommand.ts +0 -25
- package/dist/ui/commands/voiceCommand.ts +0 -125
- package/dist/ui/components/AboutBox.tsx +0 -133
- package/dist/ui/components/AsciiArt.ts +0 -54
- package/dist/ui/components/AuthDialog.test.tsx +0 -334
- package/dist/ui/components/AuthDialog.tsx +0 -289
- package/dist/ui/components/AuthInProgress.tsx +0 -62
- package/dist/ui/components/AutoAcceptIndicator.tsx +0 -47
- package/dist/ui/components/ConsoleSummaryDisplay.tsx +0 -35
- package/dist/ui/components/ContextSummaryDisplay.test.tsx +0 -85
- package/dist/ui/components/ContextSummaryDisplay.tsx +0 -120
- package/dist/ui/components/ContextUsageDisplay.tsx +0 -77
- package/dist/ui/components/DebugProfiler.tsx +0 -36
- package/dist/ui/components/DetailedMessagesDisplay.tsx +0 -82
- package/dist/ui/components/EditorSettingsDialog.tsx +0 -172
- package/dist/ui/components/FolderTrustDialog.test.tsx +0 -36
- package/dist/ui/components/FolderTrustDialog.tsx +0 -74
- package/dist/ui/components/Footer.test.tsx +0 -159
- package/dist/ui/components/Footer.tsx +0 -158
- package/dist/ui/components/GeminiKeyDialog.tsx +0 -252
- package/dist/ui/components/GeminiRespondingSpinner.tsx +0 -34
- package/dist/ui/components/Header.test.tsx +0 -44
- package/dist/ui/components/Header.tsx +0 -70
- package/dist/ui/components/Help.tsx +0 -174
- package/dist/ui/components/HistoryItemDisplay.test.tsx +0 -125
- package/dist/ui/components/HistoryItemDisplay.tsx +0 -98
- package/dist/ui/components/InputPrompt.test.tsx +0 -1467
- package/dist/ui/components/InputPrompt.tsx +0 -641
- package/dist/ui/components/LMStudioModelPrompt.tsx +0 -215
- package/dist/ui/components/LoadingIndicator.test.tsx +0 -296
- package/dist/ui/components/LoadingIndicator.tsx +0 -82
- package/dist/ui/components/MemoryUsageDisplay.tsx +0 -36
- package/dist/ui/components/ModelStatsDisplay.test.tsx +0 -252
- package/dist/ui/components/ModelStatsDisplay.tsx +0 -197
- package/dist/ui/components/OllamaModelPrompt.tsx +0 -206
- package/dist/ui/components/OpenAIEndpointDialog.tsx +0 -261
- package/dist/ui/components/OpenAIKeyPrompt.test.tsx +0 -64
- package/dist/ui/components/OpenAIKeyPrompt.tsx +0 -197
- package/dist/ui/components/PrepareLabel.tsx +0 -48
- package/dist/ui/components/SearchEngineConfigDialog.tsx +0 -280
- package/dist/ui/components/SessionSummaryDisplay.test.tsx +0 -75
- package/dist/ui/components/SessionSummaryDisplay.tsx +0 -18
- package/dist/ui/components/SettingsDialog.test.tsx +0 -865
- package/dist/ui/components/SettingsDialog.tsx +0 -753
- package/dist/ui/components/ShellConfirmationDialog.test.tsx +0 -53
- package/dist/ui/components/ShellConfirmationDialog.tsx +0 -103
- package/dist/ui/components/ShellModeIndicator.tsx +0 -18
- package/dist/ui/components/ShowMoreLines.tsx +0 -40
- package/dist/ui/components/StatsDisplay.test.tsx +0 -401
- package/dist/ui/components/StatsDisplay.tsx +0 -273
- package/dist/ui/components/SuggestionsDisplay.tsx +0 -102
- package/dist/ui/components/ThemeDialog.tsx +0 -310
- package/dist/ui/components/Tips.tsx +0 -45
- package/dist/ui/components/TodoDisplay.test.tsx +0 -97
- package/dist/ui/components/TodoDisplay.tsx +0 -72
- package/dist/ui/components/ToolStatsDisplay.test.tsx +0 -180
- package/dist/ui/components/ToolStatsDisplay.tsx +0 -208
- package/dist/ui/components/UpdateNotification.tsx +0 -23
- package/dist/ui/components/WelcomeBackDialog.tsx +0 -290
- package/dist/ui/components/__snapshots__/IDEContextDetailDisplay.test.tsx.snap +0 -24
- package/dist/ui/components/__snapshots__/ModelStatsDisplay.test.tsx.snap +0 -121
- package/dist/ui/components/__snapshots__/SessionSummaryDisplay.test.tsx.snap +0 -30
- package/dist/ui/components/__snapshots__/ShellConfirmationDialog.test.tsx.snap +0 -21
- package/dist/ui/components/__snapshots__/StatsDisplay.test.tsx.snap +0 -264
- package/dist/ui/components/__snapshots__/ToolStatsDisplay.test.tsx.snap +0 -91
- package/dist/ui/components/messages/CompressionMessage.tsx +0 -49
- package/dist/ui/components/messages/DiffRenderer.test.tsx +0 -365
- package/dist/ui/components/messages/DiffRenderer.tsx +0 -358
- package/dist/ui/components/messages/ErrorMessage.tsx +0 -31
- package/dist/ui/components/messages/GeminiMessage.tsx +0 -43
- package/dist/ui/components/messages/GeminiMessageContent.tsx +0 -43
- package/dist/ui/components/messages/InfoMessage.tsx +0 -32
- package/dist/ui/components/messages/ToolConfirmationMessage.test.tsx +0 -58
- package/dist/ui/components/messages/ToolConfirmationMessage.tsx +0 -297
- package/dist/ui/components/messages/ToolGroupMessage.tsx +0 -126
- package/dist/ui/components/messages/ToolMessage.test.tsx +0 -183
- package/dist/ui/components/messages/ToolMessage.tsx +0 -296
- package/dist/ui/components/messages/UserMessage.tsx +0 -43
- package/dist/ui/components/messages/UserShellMessage.tsx +0 -25
- package/dist/ui/components/shared/MaxSizedBox.test.tsx +0 -425
- package/dist/ui/components/shared/MaxSizedBox.tsx +0 -624
- package/dist/ui/components/shared/RadioButtonSelect.test.tsx +0 -181
- package/dist/ui/components/shared/RadioButtonSelect.tsx +0 -234
- package/dist/ui/components/shared/__snapshots__/RadioButtonSelect.test.tsx.snap +0 -47
- package/dist/ui/components/shared/text-buffer.test.ts +0 -1728
- package/dist/ui/components/shared/text-buffer.ts +0 -2227
- package/dist/ui/components/shared/vim-buffer-actions.test.ts +0 -1119
- package/dist/ui/components/shared/vim-buffer-actions.ts +0 -814
- package/dist/ui/constants.ts +0 -17
- package/dist/ui/contexts/KeypressContext.test.tsx +0 -391
- package/dist/ui/contexts/KeypressContext.tsx +0 -440
- package/dist/ui/contexts/OverflowContext.tsx +0 -87
- package/dist/ui/contexts/SessionContext.test.tsx +0 -132
- package/dist/ui/contexts/SessionContext.tsx +0 -143
- package/dist/ui/contexts/SettingsContext.tsx +0 -20
- package/dist/ui/contexts/StreamingContext.tsx +0 -22
- package/dist/ui/contexts/VimModeContext.tsx +0 -79
- package/dist/ui/editors/editorSettingsManager.ts +0 -66
- package/dist/ui/hooks/atCommandProcessor.test.ts +0 -1102
- package/dist/ui/hooks/atCommandProcessor.ts +0 -485
- package/dist/ui/hooks/shellCommandProcessor.test.ts +0 -481
- package/dist/ui/hooks/shellCommandProcessor.ts +0 -314
- package/dist/ui/hooks/slashCommandProcessor.test.ts +0 -1044
- package/dist/ui/hooks/slashCommandProcessor.ts +0 -595
- package/dist/ui/hooks/useAtCompletion.test.ts +0 -497
- package/dist/ui/hooks/useAtCompletion.ts +0 -244
- package/dist/ui/hooks/useAuthCommand.ts +0 -129
- package/dist/ui/hooks/useAutoAcceptIndicator.test.ts +0 -300
- package/dist/ui/hooks/useAutoAcceptIndicator.ts +0 -52
- package/dist/ui/hooks/useBracketedPaste.ts +0 -37
- package/dist/ui/hooks/useCommandCompletion.test.ts +0 -518
- package/dist/ui/hooks/useCommandCompletion.tsx +0 -238
- package/dist/ui/hooks/useCompletion.ts +0 -128
- package/dist/ui/hooks/useConsoleMessages.test.ts +0 -147
- package/dist/ui/hooks/useConsoleMessages.ts +0 -110
- package/dist/ui/hooks/useEditorSettings.test.ts +0 -283
- package/dist/ui/hooks/useEditorSettings.ts +0 -75
- package/dist/ui/hooks/useFocus.test.ts +0 -119
- package/dist/ui/hooks/useFocus.ts +0 -48
- package/dist/ui/hooks/useFolderTrust.test.ts +0 -159
- package/dist/ui/hooks/useFolderTrust.ts +0 -72
- package/dist/ui/hooks/useGeminiStream.test.tsx +0 -1998
- package/dist/ui/hooks/useGeminiStream.ts +0 -1017
- package/dist/ui/hooks/useGitBranchName.test.ts +0 -280
- package/dist/ui/hooks/useGitBranchName.ts +0 -79
- package/dist/ui/hooks/useHistoryManager.test.ts +0 -202
- package/dist/ui/hooks/useHistoryManager.ts +0 -111
- package/dist/ui/hooks/useInputHistory.test.ts +0 -261
- package/dist/ui/hooks/useInputHistory.ts +0 -111
- package/dist/ui/hooks/useKeypress.test.ts +0 -280
- package/dist/ui/hooks/useKeypress.ts +0 -39
- package/dist/ui/hooks/useKittyKeyboardProtocol.ts +0 -31
- package/dist/ui/hooks/useLoadingIndicator.test.ts +0 -139
- package/dist/ui/hooks/useLoadingIndicator.ts +0 -57
- package/dist/ui/hooks/useLogger.ts +0 -32
- package/dist/ui/hooks/useMessageQueue.test.ts +0 -226
- package/dist/ui/hooks/useMessageQueue.ts +0 -69
- package/dist/ui/hooks/usePhraseCycler.test.ts +0 -145
- package/dist/ui/hooks/usePhraseCycler.ts +0 -198
- package/dist/ui/hooks/usePrivacySettings.test.ts +0 -242
- package/dist/ui/hooks/usePrivacySettings.ts +0 -150
- package/dist/ui/hooks/useReactToolScheduler.ts +0 -309
- package/dist/ui/hooks/useRefreshMemoryCommand.ts +0 -7
- package/dist/ui/hooks/useReverseSearchCompletion.test.tsx +0 -260
- package/dist/ui/hooks/useReverseSearchCompletion.tsx +0 -95
- package/dist/ui/hooks/useSettingsCommand.ts +0 -25
- package/dist/ui/hooks/useShellHistory.test.ts +0 -219
- package/dist/ui/hooks/useShellHistory.ts +0 -133
- package/dist/ui/hooks/useShowMemoryCommand.ts +0 -75
- package/dist/ui/hooks/useSlashCompletion.test.ts +0 -434
- package/dist/ui/hooks/useSlashCompletion.ts +0 -187
- package/dist/ui/hooks/useStateAndRef.ts +0 -36
- package/dist/ui/hooks/useTerminalSize.ts +0 -32
- package/dist/ui/hooks/useThemeCommand.ts +0 -110
- package/dist/ui/hooks/useTimer.test.ts +0 -120
- package/dist/ui/hooks/useTimer.ts +0 -65
- package/dist/ui/hooks/useToolScheduler.test.ts +0 -1123
- package/dist/ui/hooks/useWelcomeBack.ts +0 -253
- package/dist/ui/hooks/vim.test.ts +0 -1691
- package/dist/ui/hooks/vim.ts +0 -784
- package/dist/ui/keyMatchers.test.ts +0 -337
- package/dist/ui/keyMatchers.ts +0 -105
- package/dist/ui/privacy/CloudFreePrivacyNotice.tsx +0 -117
- package/dist/ui/privacy/CloudPaidPrivacyNotice.tsx +0 -59
- package/dist/ui/privacy/GeminiPrivacyNotice.tsx +0 -62
- package/dist/ui/privacy/PrivacyNotice.tsx +0 -42
- package/dist/ui/semantic-colors.ts +0 -26
- package/dist/ui/themes/ansi-light.ts +0 -150
- package/dist/ui/themes/ansi.ts +0 -159
- package/dist/ui/themes/atom-one-dark.ts +0 -147
- package/dist/ui/themes/ayu-light.ts +0 -139
- package/dist/ui/themes/ayu.ts +0 -113
- package/dist/ui/themes/color-utils.test.ts +0 -221
- package/dist/ui/themes/color-utils.ts +0 -231
- package/dist/ui/themes/default-light.ts +0 -108
- package/dist/ui/themes/default.ts +0 -151
- package/dist/ui/themes/dracula.ts +0 -124
- package/dist/ui/themes/fss-code-dark.ts +0 -156
- package/dist/ui/themes/fss-dark.ts +0 -113
- package/dist/ui/themes/fss-light.ts +0 -139
- package/dist/ui/themes/github-dark.ts +0 -147
- package/dist/ui/themes/github-light.ts +0 -149
- package/dist/ui/themes/googlecode.ts +0 -146
- package/dist/ui/themes/no-color.ts +0 -125
- package/dist/ui/themes/qwen-dark.ts +0 -118
- package/dist/ui/themes/qwen-light.ts +0 -144
- package/dist/ui/themes/semantic-tokens.ts +0 -127
- package/dist/ui/themes/shades-of-purple.ts +0 -352
- package/dist/ui/themes/theme-manager.test.ts +0 -99
- package/dist/ui/themes/theme-manager.ts +0 -257
- package/dist/ui/themes/theme.test.ts +0 -97
- package/dist/ui/themes/theme.ts +0 -451
- package/dist/ui/themes/xcode.ts +0 -154
- package/dist/ui/types.ts +0 -255
- package/dist/ui/utils/CodeColorizer.tsx +0 -217
- package/dist/ui/utils/ConsolePatcher.ts +0 -71
- package/dist/ui/utils/InlineMarkdownRenderer.tsx +0 -173
- package/dist/ui/utils/MarkdownDisplay.test.tsx +0 -244
- package/dist/ui/utils/MarkdownDisplay.tsx +0 -415
- package/dist/ui/utils/TableRenderer.tsx +0 -159
- package/dist/ui/utils/__snapshots__/MarkdownDisplay.test.tsx.snap +0 -93
- package/dist/ui/utils/clipboardUtils.test.ts +0 -76
- package/dist/ui/utils/clipboardUtils.ts +0 -149
- package/dist/ui/utils/commandUtils.test.ts +0 -384
- package/dist/ui/utils/commandUtils.ts +0 -106
- package/dist/ui/utils/computeStats.test.ts +0 -292
- package/dist/ui/utils/computeStats.ts +0 -86
- package/dist/ui/utils/displayUtils.test.ts +0 -58
- package/dist/ui/utils/displayUtils.ts +0 -32
- package/dist/ui/utils/formatters.test.ts +0 -72
- package/dist/ui/utils/formatters.ts +0 -63
- package/dist/ui/utils/isNarrowWidth.ts +0 -9
- package/dist/ui/utils/kittyProtocolDetector.ts +0 -105
- package/dist/ui/utils/markdownUtilities.test.ts +0 -50
- package/dist/ui/utils/markdownUtilities.ts +0 -125
- package/dist/ui/utils/platformConstants.ts +0 -52
- package/dist/ui/utils/terminalSetup.ts +0 -342
- package/dist/ui/utils/textUtils.ts +0 -40
- package/dist/ui/utils/updateCheck.test.ts +0 -163
- package/dist/ui/utils/updateCheck.ts +0 -100
- package/dist/utils/checks.ts +0 -28
- package/dist/utils/cleanup.test.ts +0 -68
- package/dist/utils/cleanup.ts +0 -36
- package/dist/utils/dialogScopeUtils.ts +0 -64
- package/dist/utils/events.ts +0 -14
- package/dist/utils/gitUtils.test.ts +0 -149
- package/dist/utils/gitUtils.ts +0 -116
- package/dist/utils/handleAutoUpdate.test.ts +0 -272
- package/dist/utils/handleAutoUpdate.ts +0 -145
- package/dist/utils/installationInfo.test.ts +0 -315
- package/dist/utils/installationInfo.ts +0 -176
- package/dist/utils/package.ts +0 -38
- package/dist/utils/readStdin.ts +0 -51
- package/dist/utils/resolvePath.ts +0 -21
- package/dist/utils/sandbox-macos-permissive-closed.sb +0 -32
- package/dist/utils/sandbox-macos-permissive-open.sb +0 -25
- package/dist/utils/sandbox-macos-permissive-proxied.sb +0 -37
- package/dist/utils/sandbox-macos-restrictive-closed.sb +0 -93
- package/dist/utils/sandbox-macos-restrictive-open.sb +0 -96
- package/dist/utils/sandbox-macos-restrictive-proxied.sb +0 -98
- package/dist/utils/sandbox.ts +0 -962
- package/dist/utils/settingsUtils.test.ts +0 -797
- package/dist/utils/settingsUtils.ts +0 -489
- package/dist/utils/spawnWrapper.ts +0 -9
- package/dist/utils/startupWarnings.test.ts +0 -83
- package/dist/utils/startupWarnings.ts +0 -40
- package/dist/utils/updateEventEmitter.ts +0 -13
- package/dist/utils/userStartupWarnings.test.ts +0 -87
- package/dist/utils/userStartupWarnings.ts +0 -69
- package/dist/utils/version.ts +0 -12
- package/dist/validateNonInterActiveAuth.test.ts +0 -260
- package/dist/validateNonInterActiveAuth.ts +0 -51
- package/dist/vitest.config.ts +0 -37
- package/dist/zed-integration/acp.ts +0 -366
- package/dist/zed-integration/fileSystemService.ts +0 -47
- package/dist/zed-integration/schema.ts +0 -466
- package/dist/zed-integration/zedIntegration.ts +0 -944
|
@@ -1,297 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import React from 'react';
|
|
8
|
-
import { Box, Text } from 'ink';
|
|
9
|
-
import { DiffRenderer } from './DiffRenderer.js';
|
|
10
|
-
import { Colors } from '../../colors.js';
|
|
11
|
-
import { RenderInline } from '../../utils/InlineMarkdownRenderer.js';
|
|
12
|
-
import {
|
|
13
|
-
ToolCallConfirmationDetails,
|
|
14
|
-
ToolConfirmationOutcome,
|
|
15
|
-
ToolExecuteConfirmationDetails,
|
|
16
|
-
ToolMcpConfirmationDetails,
|
|
17
|
-
Config,
|
|
18
|
-
} from 'fss-link-core';
|
|
19
|
-
import {
|
|
20
|
-
RadioButtonSelect,
|
|
21
|
-
RadioSelectItem,
|
|
22
|
-
} from '../shared/RadioButtonSelect.js';
|
|
23
|
-
import { MaxSizedBox } from '../shared/MaxSizedBox.js';
|
|
24
|
-
import { useKeypress } from '../../hooks/useKeypress.js';
|
|
25
|
-
|
|
26
|
-
export interface ToolConfirmationMessageProps {
|
|
27
|
-
confirmationDetails: ToolCallConfirmationDetails;
|
|
28
|
-
config?: Config;
|
|
29
|
-
isFocused?: boolean;
|
|
30
|
-
availableTerminalHeight?: number;
|
|
31
|
-
terminalWidth: number;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export const ToolConfirmationMessage: React.FC<
|
|
35
|
-
ToolConfirmationMessageProps
|
|
36
|
-
> = ({
|
|
37
|
-
confirmationDetails,
|
|
38
|
-
config,
|
|
39
|
-
isFocused = true,
|
|
40
|
-
availableTerminalHeight,
|
|
41
|
-
terminalWidth,
|
|
42
|
-
}) => {
|
|
43
|
-
const { onConfirm } = confirmationDetails;
|
|
44
|
-
const childWidth = terminalWidth - 2; // 2 for padding
|
|
45
|
-
|
|
46
|
-
const handleConfirm = async (outcome: ToolConfirmationOutcome) => {
|
|
47
|
-
if (confirmationDetails.type === 'edit') {
|
|
48
|
-
const ideClient = config?.getIdeClient();
|
|
49
|
-
if (config?.getIdeMode()) {
|
|
50
|
-
const cliOutcome =
|
|
51
|
-
outcome === ToolConfirmationOutcome.Cancel ? 'rejected' : 'accepted';
|
|
52
|
-
await ideClient?.resolveDiffFromCli(
|
|
53
|
-
confirmationDetails.filePath,
|
|
54
|
-
cliOutcome,
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
onConfirm(outcome);
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
useKeypress(
|
|
62
|
-
(key) => {
|
|
63
|
-
if (!isFocused) return;
|
|
64
|
-
if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {
|
|
65
|
-
handleConfirm(ToolConfirmationOutcome.Cancel);
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
{ isActive: isFocused },
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
const handleSelect = (item: ToolConfirmationOutcome) => handleConfirm(item);
|
|
72
|
-
|
|
73
|
-
let bodyContent: React.ReactNode | null = null; // Removed contextDisplay here
|
|
74
|
-
let question: string;
|
|
75
|
-
|
|
76
|
-
const options: Array<RadioSelectItem<ToolConfirmationOutcome>> = new Array<
|
|
77
|
-
RadioSelectItem<ToolConfirmationOutcome>
|
|
78
|
-
>();
|
|
79
|
-
|
|
80
|
-
// Body content is now the DiffRenderer, passing filename to it
|
|
81
|
-
// The bordered box is removed from here and handled within DiffRenderer
|
|
82
|
-
|
|
83
|
-
function availableBodyContentHeight() {
|
|
84
|
-
if (options.length === 0) {
|
|
85
|
-
// This should not happen in practice as options are always added before this is called.
|
|
86
|
-
throw new Error('Options not provided for confirmation message');
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (availableTerminalHeight === undefined) {
|
|
90
|
-
return undefined;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Calculate the vertical space (in lines) consumed by UI elements
|
|
94
|
-
// surrounding the main body content.
|
|
95
|
-
const PADDING_OUTER_Y = 2; // Main container has `padding={1}` (top & bottom).
|
|
96
|
-
const MARGIN_BODY_BOTTOM = 1; // margin on the body container.
|
|
97
|
-
const HEIGHT_QUESTION = 1; // The question text is one line.
|
|
98
|
-
const MARGIN_QUESTION_BOTTOM = 1; // Margin on the question container.
|
|
99
|
-
const HEIGHT_OPTIONS = options.length; // Each option in the radio select takes one line.
|
|
100
|
-
|
|
101
|
-
const surroundingElementsHeight =
|
|
102
|
-
PADDING_OUTER_Y +
|
|
103
|
-
MARGIN_BODY_BOTTOM +
|
|
104
|
-
HEIGHT_QUESTION +
|
|
105
|
-
MARGIN_QUESTION_BOTTOM +
|
|
106
|
-
HEIGHT_OPTIONS;
|
|
107
|
-
return Math.max(availableTerminalHeight - surroundingElementsHeight, 1);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
if (confirmationDetails.type === 'edit') {
|
|
111
|
-
if (confirmationDetails.isModifying) {
|
|
112
|
-
return (
|
|
113
|
-
<Box
|
|
114
|
-
minWidth="90%"
|
|
115
|
-
borderStyle="round"
|
|
116
|
-
borderColor={Colors.Gray}
|
|
117
|
-
justifyContent="space-around"
|
|
118
|
-
padding={1}
|
|
119
|
-
overflow="hidden"
|
|
120
|
-
>
|
|
121
|
-
<Text>Modify in progress: </Text>
|
|
122
|
-
<Text color={Colors.AccentGreen}>
|
|
123
|
-
Save and close external editor to continue
|
|
124
|
-
</Text>
|
|
125
|
-
</Box>
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
question = `Apply this change?`;
|
|
130
|
-
options.push(
|
|
131
|
-
{
|
|
132
|
-
label: 'Yes, allow once',
|
|
133
|
-
value: ToolConfirmationOutcome.ProceedOnce,
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
label: 'Yes, allow always',
|
|
137
|
-
value: ToolConfirmationOutcome.ProceedAlways,
|
|
138
|
-
},
|
|
139
|
-
);
|
|
140
|
-
if (config?.getIdeMode()) {
|
|
141
|
-
options.push({
|
|
142
|
-
label: 'No (esc)',
|
|
143
|
-
value: ToolConfirmationOutcome.Cancel,
|
|
144
|
-
});
|
|
145
|
-
} else {
|
|
146
|
-
options.push({
|
|
147
|
-
label: 'Modify with external editor',
|
|
148
|
-
value: ToolConfirmationOutcome.ModifyWithEditor,
|
|
149
|
-
});
|
|
150
|
-
options.push({
|
|
151
|
-
label: 'No, suggest changes (esc)',
|
|
152
|
-
value: ToolConfirmationOutcome.Cancel,
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
bodyContent = (
|
|
157
|
-
<DiffRenderer
|
|
158
|
-
diffContent={confirmationDetails.fileDiff}
|
|
159
|
-
filename={confirmationDetails.fileName}
|
|
160
|
-
availableTerminalHeight={availableBodyContentHeight()}
|
|
161
|
-
terminalWidth={childWidth}
|
|
162
|
-
/>
|
|
163
|
-
);
|
|
164
|
-
} else if (confirmationDetails.type === 'exec') {
|
|
165
|
-
const executionProps =
|
|
166
|
-
confirmationDetails as ToolExecuteConfirmationDetails;
|
|
167
|
-
|
|
168
|
-
question = `Allow execution of: '${executionProps.rootCommand}'?`;
|
|
169
|
-
options.push(
|
|
170
|
-
{
|
|
171
|
-
label: `Yes, allow once`,
|
|
172
|
-
value: ToolConfirmationOutcome.ProceedOnce,
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
label: `Yes, allow always ...`,
|
|
176
|
-
value: ToolConfirmationOutcome.ProceedAlways,
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
label: 'No, suggest changes (esc)',
|
|
180
|
-
value: ToolConfirmationOutcome.Cancel,
|
|
181
|
-
},
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
let bodyContentHeight = availableBodyContentHeight();
|
|
185
|
-
if (bodyContentHeight !== undefined) {
|
|
186
|
-
bodyContentHeight -= 2; // Account for padding;
|
|
187
|
-
}
|
|
188
|
-
bodyContent = (
|
|
189
|
-
<Box flexDirection="column">
|
|
190
|
-
<Box paddingX={1} marginLeft={1}>
|
|
191
|
-
<MaxSizedBox
|
|
192
|
-
maxHeight={bodyContentHeight}
|
|
193
|
-
maxWidth={Math.max(childWidth - 4, 1)}
|
|
194
|
-
>
|
|
195
|
-
<Box>
|
|
196
|
-
<Text color={Colors.AccentCyan}>{executionProps.command}</Text>
|
|
197
|
-
</Box>
|
|
198
|
-
</MaxSizedBox>
|
|
199
|
-
</Box>
|
|
200
|
-
</Box>
|
|
201
|
-
);
|
|
202
|
-
} else if (confirmationDetails.type === 'info') {
|
|
203
|
-
const infoProps = confirmationDetails;
|
|
204
|
-
const displayUrls =
|
|
205
|
-
infoProps.urls &&
|
|
206
|
-
!(infoProps.urls.length === 1 && infoProps.urls[0] === infoProps.prompt);
|
|
207
|
-
|
|
208
|
-
question = `Do you want to proceed?`;
|
|
209
|
-
options.push(
|
|
210
|
-
{
|
|
211
|
-
label: 'Yes, allow once',
|
|
212
|
-
value: ToolConfirmationOutcome.ProceedOnce,
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
label: 'Yes, allow always',
|
|
216
|
-
value: ToolConfirmationOutcome.ProceedAlways,
|
|
217
|
-
},
|
|
218
|
-
{
|
|
219
|
-
label: 'No, suggest changes (esc)',
|
|
220
|
-
value: ToolConfirmationOutcome.Cancel,
|
|
221
|
-
},
|
|
222
|
-
);
|
|
223
|
-
|
|
224
|
-
bodyContent = (
|
|
225
|
-
<Box flexDirection="column" paddingX={1} marginLeft={1}>
|
|
226
|
-
<Text color={Colors.AccentCyan}>
|
|
227
|
-
<RenderInline text={infoProps.prompt} />
|
|
228
|
-
</Text>
|
|
229
|
-
{displayUrls && infoProps.urls && infoProps.urls.length > 0 && (
|
|
230
|
-
<Box flexDirection="column" marginTop={1}>
|
|
231
|
-
<Text>URLs to fetch:</Text>
|
|
232
|
-
{infoProps.urls.map((url) => (
|
|
233
|
-
<Text key={url}>
|
|
234
|
-
{' '}
|
|
235
|
-
- <RenderInline text={url} />
|
|
236
|
-
</Text>
|
|
237
|
-
))}
|
|
238
|
-
</Box>
|
|
239
|
-
)}
|
|
240
|
-
</Box>
|
|
241
|
-
);
|
|
242
|
-
} else {
|
|
243
|
-
// mcp tool confirmation
|
|
244
|
-
const mcpProps = confirmationDetails as ToolMcpConfirmationDetails;
|
|
245
|
-
|
|
246
|
-
bodyContent = (
|
|
247
|
-
<Box flexDirection="column" paddingX={1} marginLeft={1}>
|
|
248
|
-
<Text color={Colors.AccentCyan}>MCP Server: {mcpProps.serverName}</Text>
|
|
249
|
-
<Text color={Colors.AccentCyan}>Tool: {mcpProps.toolName}</Text>
|
|
250
|
-
</Box>
|
|
251
|
-
);
|
|
252
|
-
|
|
253
|
-
question = `Allow execution of MCP tool "${mcpProps.toolName}" from server "${mcpProps.serverName}"?`;
|
|
254
|
-
options.push(
|
|
255
|
-
{
|
|
256
|
-
label: 'Yes, allow once',
|
|
257
|
-
value: ToolConfirmationOutcome.ProceedOnce,
|
|
258
|
-
},
|
|
259
|
-
{
|
|
260
|
-
label: `Yes, always allow tool "${mcpProps.toolName}" from server "${mcpProps.serverName}"`,
|
|
261
|
-
value: ToolConfirmationOutcome.ProceedAlwaysTool, // Cast until types are updated
|
|
262
|
-
},
|
|
263
|
-
{
|
|
264
|
-
label: `Yes, always allow all tools from server "${mcpProps.serverName}"`,
|
|
265
|
-
value: ToolConfirmationOutcome.ProceedAlwaysServer,
|
|
266
|
-
},
|
|
267
|
-
{
|
|
268
|
-
label: 'No, suggest changes (esc)',
|
|
269
|
-
value: ToolConfirmationOutcome.Cancel,
|
|
270
|
-
},
|
|
271
|
-
);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
return (
|
|
275
|
-
<Box flexDirection="column" padding={1} width={childWidth}>
|
|
276
|
-
{/* Body Content (Diff Renderer or Command Info) */}
|
|
277
|
-
{/* No separate context display here anymore for edits */}
|
|
278
|
-
<Box flexGrow={1} flexShrink={1} overflow="hidden" marginBottom={1}>
|
|
279
|
-
{bodyContent}
|
|
280
|
-
</Box>
|
|
281
|
-
|
|
282
|
-
{/* Confirmation Question */}
|
|
283
|
-
<Box marginBottom={1} flexShrink={0}>
|
|
284
|
-
<Text wrap="truncate">{question}</Text>
|
|
285
|
-
</Box>
|
|
286
|
-
|
|
287
|
-
{/* Select Input for Options */}
|
|
288
|
-
<Box flexShrink={0}>
|
|
289
|
-
<RadioButtonSelect
|
|
290
|
-
items={options}
|
|
291
|
-
onSelect={handleSelect}
|
|
292
|
-
isFocused={isFocused}
|
|
293
|
-
/>
|
|
294
|
-
</Box>
|
|
295
|
-
</Box>
|
|
296
|
-
);
|
|
297
|
-
};
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import React, { useMemo } from 'react';
|
|
8
|
-
import { Box } from 'ink';
|
|
9
|
-
import { IndividualToolCallDisplay, ToolCallStatus } from '../../types.js';
|
|
10
|
-
import { ToolMessage } from './ToolMessage.js';
|
|
11
|
-
import { ToolConfirmationMessage } from './ToolConfirmationMessage.js';
|
|
12
|
-
import { Colors } from '../../colors.js';
|
|
13
|
-
import { Config } from 'fss-link-core';
|
|
14
|
-
import { SHELL_COMMAND_NAME } from '../../constants.js';
|
|
15
|
-
|
|
16
|
-
interface ToolGroupMessageProps {
|
|
17
|
-
groupId: number;
|
|
18
|
-
toolCalls: IndividualToolCallDisplay[];
|
|
19
|
-
availableTerminalHeight?: number;
|
|
20
|
-
terminalWidth: number;
|
|
21
|
-
config?: Config;
|
|
22
|
-
isFocused?: boolean;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Main component renders the border and maps the tools using ToolMessage
|
|
26
|
-
export const ToolGroupMessage: React.FC<ToolGroupMessageProps> = ({
|
|
27
|
-
toolCalls,
|
|
28
|
-
availableTerminalHeight,
|
|
29
|
-
terminalWidth,
|
|
30
|
-
config,
|
|
31
|
-
isFocused = true,
|
|
32
|
-
}) => {
|
|
33
|
-
const hasPending = !toolCalls.every(
|
|
34
|
-
(t) => t.status === ToolCallStatus.Success,
|
|
35
|
-
);
|
|
36
|
-
const isShellCommand = toolCalls.some((t) => t.name === SHELL_COMMAND_NAME);
|
|
37
|
-
const borderColor =
|
|
38
|
-
hasPending || isShellCommand ? Colors.AccentYellow : Colors.Gray;
|
|
39
|
-
|
|
40
|
-
const staticHeight = /* border */ 2 + /* marginBottom */ 1;
|
|
41
|
-
// This is a bit of a magic number, but it accounts for the border and
|
|
42
|
-
// marginLeft.
|
|
43
|
-
const innerWidth = terminalWidth - 4;
|
|
44
|
-
|
|
45
|
-
// only prompt for tool approval on the first 'confirming' tool in the list
|
|
46
|
-
// note, after the CTA, this automatically moves over to the next 'confirming' tool
|
|
47
|
-
const toolAwaitingApproval = useMemo(
|
|
48
|
-
() => toolCalls.find((tc) => tc.status === ToolCallStatus.Confirming),
|
|
49
|
-
[toolCalls],
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
let countToolCallsWithResults = 0;
|
|
53
|
-
for (const tool of toolCalls) {
|
|
54
|
-
if (tool.resultDisplay !== undefined && tool.resultDisplay !== '') {
|
|
55
|
-
countToolCallsWithResults++;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
const countOneLineToolCalls = toolCalls.length - countToolCallsWithResults;
|
|
59
|
-
const availableTerminalHeightPerToolMessage = availableTerminalHeight
|
|
60
|
-
? Math.max(
|
|
61
|
-
Math.floor(
|
|
62
|
-
(availableTerminalHeight - staticHeight - countOneLineToolCalls) /
|
|
63
|
-
Math.max(1, countToolCallsWithResults),
|
|
64
|
-
),
|
|
65
|
-
1,
|
|
66
|
-
)
|
|
67
|
-
: undefined;
|
|
68
|
-
|
|
69
|
-
return (
|
|
70
|
-
<Box
|
|
71
|
-
flexDirection="column"
|
|
72
|
-
borderStyle="round"
|
|
73
|
-
/*
|
|
74
|
-
This width constraint is highly important and protects us from an Ink rendering bug.
|
|
75
|
-
Since the ToolGroup can typically change rendering states frequently, it can cause
|
|
76
|
-
Ink to render the border of the box incorrectly and span multiple lines and even
|
|
77
|
-
cause tearing.
|
|
78
|
-
*/
|
|
79
|
-
width="100%"
|
|
80
|
-
marginLeft={1}
|
|
81
|
-
borderDimColor={hasPending}
|
|
82
|
-
borderColor={borderColor}
|
|
83
|
-
>
|
|
84
|
-
{toolCalls.map((tool) => {
|
|
85
|
-
const isConfirming = toolAwaitingApproval?.callId === tool.callId;
|
|
86
|
-
return (
|
|
87
|
-
<Box key={tool.callId} flexDirection="column" minHeight={1}>
|
|
88
|
-
<Box flexDirection="row" alignItems="center">
|
|
89
|
-
<ToolMessage
|
|
90
|
-
callId={tool.callId}
|
|
91
|
-
name={tool.name}
|
|
92
|
-
description={tool.description}
|
|
93
|
-
resultDisplay={tool.resultDisplay}
|
|
94
|
-
status={tool.status}
|
|
95
|
-
confirmationDetails={tool.confirmationDetails}
|
|
96
|
-
availableTerminalHeight={availableTerminalHeightPerToolMessage}
|
|
97
|
-
terminalWidth={innerWidth}
|
|
98
|
-
emphasis={
|
|
99
|
-
isConfirming
|
|
100
|
-
? 'high'
|
|
101
|
-
: toolAwaitingApproval
|
|
102
|
-
? 'low'
|
|
103
|
-
: 'medium'
|
|
104
|
-
}
|
|
105
|
-
renderOutputAsMarkdown={tool.renderOutputAsMarkdown}
|
|
106
|
-
/>
|
|
107
|
-
</Box>
|
|
108
|
-
{tool.status === ToolCallStatus.Confirming &&
|
|
109
|
-
isConfirming &&
|
|
110
|
-
tool.confirmationDetails && (
|
|
111
|
-
<ToolConfirmationMessage
|
|
112
|
-
confirmationDetails={tool.confirmationDetails}
|
|
113
|
-
config={config}
|
|
114
|
-
isFocused={isFocused}
|
|
115
|
-
availableTerminalHeight={
|
|
116
|
-
availableTerminalHeightPerToolMessage
|
|
117
|
-
}
|
|
118
|
-
terminalWidth={innerWidth}
|
|
119
|
-
/>
|
|
120
|
-
)}
|
|
121
|
-
</Box>
|
|
122
|
-
);
|
|
123
|
-
})}
|
|
124
|
-
</Box>
|
|
125
|
-
);
|
|
126
|
-
};
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import React from 'react';
|
|
8
|
-
import { render } from 'ink-testing-library';
|
|
9
|
-
import { ToolMessage, ToolMessageProps } from './ToolMessage.js';
|
|
10
|
-
import { StreamingState, ToolCallStatus } from '../../types.js';
|
|
11
|
-
import { Text } from 'ink';
|
|
12
|
-
import { StreamingContext } from '../../contexts/StreamingContext.js';
|
|
13
|
-
|
|
14
|
-
// Mock child components or utilities if they are complex or have side effects
|
|
15
|
-
vi.mock('../GeminiRespondingSpinner.js', () => ({
|
|
16
|
-
GeminiRespondingSpinner: ({
|
|
17
|
-
nonRespondingDisplay,
|
|
18
|
-
}: {
|
|
19
|
-
nonRespondingDisplay?: string;
|
|
20
|
-
}) => {
|
|
21
|
-
const streamingState = React.useContext(StreamingContext)!;
|
|
22
|
-
if (streamingState === StreamingState.Responding) {
|
|
23
|
-
return <Text>MockRespondingSpinner</Text>;
|
|
24
|
-
}
|
|
25
|
-
return nonRespondingDisplay ? <Text>{nonRespondingDisplay}</Text> : null;
|
|
26
|
-
},
|
|
27
|
-
}));
|
|
28
|
-
vi.mock('./DiffRenderer.js', () => ({
|
|
29
|
-
DiffRenderer: function MockDiffRenderer({
|
|
30
|
-
diffContent,
|
|
31
|
-
}: {
|
|
32
|
-
diffContent: string;
|
|
33
|
-
}) {
|
|
34
|
-
return <Text>MockDiff:{diffContent}</Text>;
|
|
35
|
-
},
|
|
36
|
-
}));
|
|
37
|
-
vi.mock('../../utils/MarkdownDisplay.js', () => ({
|
|
38
|
-
MarkdownDisplay: function MockMarkdownDisplay({ text }: { text: string }) {
|
|
39
|
-
return <Text>MockMarkdown:{text}</Text>;
|
|
40
|
-
},
|
|
41
|
-
}));
|
|
42
|
-
|
|
43
|
-
// Helper to render with context
|
|
44
|
-
const renderWithContext = (
|
|
45
|
-
ui: React.ReactElement,
|
|
46
|
-
streamingState: StreamingState,
|
|
47
|
-
) => {
|
|
48
|
-
const contextValue: StreamingState = streamingState;
|
|
49
|
-
return render(
|
|
50
|
-
<StreamingContext.Provider value={contextValue}>
|
|
51
|
-
{ui}
|
|
52
|
-
</StreamingContext.Provider>,
|
|
53
|
-
);
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
describe('<ToolMessage />', () => {
|
|
57
|
-
const baseProps: ToolMessageProps = {
|
|
58
|
-
callId: 'tool-123',
|
|
59
|
-
name: 'test-tool',
|
|
60
|
-
description: 'A tool for testing',
|
|
61
|
-
resultDisplay: 'Test result',
|
|
62
|
-
status: ToolCallStatus.Success,
|
|
63
|
-
terminalWidth: 80,
|
|
64
|
-
confirmationDetails: undefined,
|
|
65
|
-
emphasis: 'medium',
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
it('renders basic tool information', () => {
|
|
69
|
-
const { lastFrame } = renderWithContext(
|
|
70
|
-
<ToolMessage {...baseProps} />,
|
|
71
|
-
StreamingState.Idle,
|
|
72
|
-
);
|
|
73
|
-
const output = lastFrame();
|
|
74
|
-
expect(output).toContain('✔'); // Success indicator
|
|
75
|
-
expect(output).toContain('test-tool');
|
|
76
|
-
expect(output).toContain('A tool for testing');
|
|
77
|
-
expect(output).toContain('MockMarkdown:Test result');
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
describe('ToolStatusIndicator rendering', () => {
|
|
81
|
-
it('shows ✔ for Success status', () => {
|
|
82
|
-
const { lastFrame } = renderWithContext(
|
|
83
|
-
<ToolMessage {...baseProps} status={ToolCallStatus.Success} />,
|
|
84
|
-
StreamingState.Idle,
|
|
85
|
-
);
|
|
86
|
-
expect(lastFrame()).toContain('✔');
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it('shows o for Pending status', () => {
|
|
90
|
-
const { lastFrame } = renderWithContext(
|
|
91
|
-
<ToolMessage {...baseProps} status={ToolCallStatus.Pending} />,
|
|
92
|
-
StreamingState.Idle,
|
|
93
|
-
);
|
|
94
|
-
expect(lastFrame()).toContain('o');
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('shows ? for Confirming status', () => {
|
|
98
|
-
const { lastFrame } = renderWithContext(
|
|
99
|
-
<ToolMessage {...baseProps} status={ToolCallStatus.Confirming} />,
|
|
100
|
-
StreamingState.Idle,
|
|
101
|
-
);
|
|
102
|
-
expect(lastFrame()).toContain('?');
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it('shows - for Canceled status', () => {
|
|
106
|
-
const { lastFrame } = renderWithContext(
|
|
107
|
-
<ToolMessage {...baseProps} status={ToolCallStatus.Canceled} />,
|
|
108
|
-
StreamingState.Idle,
|
|
109
|
-
);
|
|
110
|
-
expect(lastFrame()).toContain('-');
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it('shows x for Error status', () => {
|
|
114
|
-
const { lastFrame } = renderWithContext(
|
|
115
|
-
<ToolMessage {...baseProps} status={ToolCallStatus.Error} />,
|
|
116
|
-
StreamingState.Idle,
|
|
117
|
-
);
|
|
118
|
-
expect(lastFrame()).toContain('x');
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('shows paused spinner for Executing status when streamingState is Idle', () => {
|
|
122
|
-
const { lastFrame } = renderWithContext(
|
|
123
|
-
<ToolMessage {...baseProps} status={ToolCallStatus.Executing} />,
|
|
124
|
-
StreamingState.Idle,
|
|
125
|
-
);
|
|
126
|
-
expect(lastFrame()).toContain('⊷');
|
|
127
|
-
expect(lastFrame()).not.toContain('MockRespondingSpinner');
|
|
128
|
-
expect(lastFrame()).not.toContain('✔');
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it('shows paused spinner for Executing status when streamingState is WaitingForConfirmation', () => {
|
|
132
|
-
const { lastFrame } = renderWithContext(
|
|
133
|
-
<ToolMessage {...baseProps} status={ToolCallStatus.Executing} />,
|
|
134
|
-
StreamingState.WaitingForConfirmation,
|
|
135
|
-
);
|
|
136
|
-
expect(lastFrame()).toContain('⊷');
|
|
137
|
-
expect(lastFrame()).not.toContain('MockRespondingSpinner');
|
|
138
|
-
expect(lastFrame()).not.toContain('✔');
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('shows MockRespondingSpinner for Executing status when streamingState is Responding', () => {
|
|
142
|
-
const { lastFrame } = renderWithContext(
|
|
143
|
-
<ToolMessage {...baseProps} status={ToolCallStatus.Executing} />,
|
|
144
|
-
StreamingState.Responding, // Simulate app still responding
|
|
145
|
-
);
|
|
146
|
-
expect(lastFrame()).toContain('MockRespondingSpinner');
|
|
147
|
-
expect(lastFrame()).not.toContain('✔');
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it('renders DiffRenderer for diff results', () => {
|
|
152
|
-
const diffResult = {
|
|
153
|
-
fileDiff: '--- a/file.txt\n+++ b/file.txt\n@@ -1 +1 @@\n-old\n+new',
|
|
154
|
-
fileName: 'file.txt',
|
|
155
|
-
originalContent: 'old',
|
|
156
|
-
newContent: 'new',
|
|
157
|
-
};
|
|
158
|
-
const { lastFrame } = renderWithContext(
|
|
159
|
-
<ToolMessage {...baseProps} resultDisplay={diffResult} />,
|
|
160
|
-
StreamingState.Idle,
|
|
161
|
-
);
|
|
162
|
-
// Check that the output contains the MockDiff content as part of the whole message
|
|
163
|
-
expect(lastFrame()).toMatch(/MockDiff:--- a\/file\.txt/);
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it('renders emphasis correctly', () => {
|
|
167
|
-
const { lastFrame: highEmphasisFrame } = renderWithContext(
|
|
168
|
-
<ToolMessage {...baseProps} emphasis="high" />,
|
|
169
|
-
StreamingState.Idle,
|
|
170
|
-
);
|
|
171
|
-
// Check for trailing indicator or specific color if applicable (Colors are not easily testable here)
|
|
172
|
-
expect(highEmphasisFrame()).toContain('←'); // Trailing indicator for high emphasis
|
|
173
|
-
|
|
174
|
-
const { lastFrame: lowEmphasisFrame } = renderWithContext(
|
|
175
|
-
<ToolMessage {...baseProps} emphasis="low" />,
|
|
176
|
-
StreamingState.Idle,
|
|
177
|
-
);
|
|
178
|
-
// For low emphasis, the name and description might be dimmed (check for dimColor if possible)
|
|
179
|
-
// This is harder to assert directly in text output without color checks.
|
|
180
|
-
// We can at least ensure it doesn't have the high emphasis indicator.
|
|
181
|
-
expect(lowEmphasisFrame()).not.toContain('←');
|
|
182
|
-
});
|
|
183
|
-
});
|