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,132 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { CommandKind, SlashCommand } from './types.js';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Parse context size string to number of tokens
|
|
11
|
-
* Supports: 32k, 64k, 128k, or raw numbers like 32000, 64000
|
|
12
|
-
*/
|
|
13
|
-
function parseContextSize(sizeStr: string): number | null {
|
|
14
|
-
const normalized = sizeStr.toLowerCase().trim();
|
|
15
|
-
|
|
16
|
-
// Handle 'k' suffix format (32k, 64k, etc.)
|
|
17
|
-
if (normalized.endsWith('k')) {
|
|
18
|
-
const num = parseInt(normalized.slice(0, -1), 10);
|
|
19
|
-
if (isNaN(num) || num <= 0) return null;
|
|
20
|
-
return num * 1000;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// Handle raw numbers
|
|
24
|
-
const num = parseInt(normalized, 10);
|
|
25
|
-
if (isNaN(num) || num <= 0) return null;
|
|
26
|
-
return num;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Format context size for display
|
|
31
|
-
*/
|
|
32
|
-
function formatContextSize(size: number): string {
|
|
33
|
-
if (size >= 1000 && size % 1000 === 0) {
|
|
34
|
-
return `${size / 1000}k`;
|
|
35
|
-
}
|
|
36
|
-
return size.toString();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Check if the current provider is Ollama
|
|
41
|
-
*/
|
|
42
|
-
function isOllamaProvider(config: unknown): boolean {
|
|
43
|
-
const baseUrl = config?.getContentGeneratorConfig()?.baseUrl;
|
|
44
|
-
if (!baseUrl) return false;
|
|
45
|
-
|
|
46
|
-
return (
|
|
47
|
-
baseUrl.includes('localhost:11434') ||
|
|
48
|
-
baseUrl.includes('127.0.0.1:11434') ||
|
|
49
|
-
baseUrl.includes(':11434/v1') ||
|
|
50
|
-
baseUrl.includes('/ollama')
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export const contextCommand: SlashCommand = {
|
|
55
|
-
name: 'context',
|
|
56
|
-
description: 'Manage Ollama context window size (Ollama only)',
|
|
57
|
-
kind: CommandKind.BUILT_IN,
|
|
58
|
-
action: async (context, args) => {
|
|
59
|
-
const config = context.services.config;
|
|
60
|
-
|
|
61
|
-
if (!config) {
|
|
62
|
-
return {
|
|
63
|
-
type: 'message' as const,
|
|
64
|
-
messageType: 'error' as const,
|
|
65
|
-
content: 'Configuration not available',
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Check if we're using Ollama
|
|
70
|
-
if (!isOllamaProvider(config)) {
|
|
71
|
-
return {
|
|
72
|
-
type: 'message' as const,
|
|
73
|
-
messageType: 'error' as const,
|
|
74
|
-
content: '/context command is only available for Ollama providers',
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const trimmedArgs = args.trim();
|
|
79
|
-
|
|
80
|
-
if (!trimmedArgs || trimmedArgs === 'show') {
|
|
81
|
-
// Show current context configuration
|
|
82
|
-
const samplingParams = config.getContentGeneratorSamplingParams() as Record<string, unknown> | undefined;
|
|
83
|
-
const currentContext = samplingParams?.['num_ctx'] as number || 32768; // Our default
|
|
84
|
-
|
|
85
|
-
return {
|
|
86
|
-
type: 'message' as const,
|
|
87
|
-
messageType: 'info' as const,
|
|
88
|
-
content: `Current context window: ${formatContextSize(currentContext)} tokens\n\nUsage:\n /context 64k - Set to 64,000 tokens\n /context 128k - Set to 128,000 tokens\n /context show - Show current setting\n /context 32768 - Set exact number of tokens\n\nNote: Larger context windows use more VRAM`,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Parse the new context size
|
|
93
|
-
const newSize = parseContextSize(trimmedArgs);
|
|
94
|
-
if (newSize === null) {
|
|
95
|
-
return {
|
|
96
|
-
type: 'message' as const,
|
|
97
|
-
messageType: 'error' as const,
|
|
98
|
-
content: `Invalid context size: "${trimmedArgs}"\nValid formats: 32k, 64k, 128k, or exact numbers like 32000`,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Validate reasonable ranges
|
|
103
|
-
if (newSize < 1000) {
|
|
104
|
-
return {
|
|
105
|
-
type: 'message' as const,
|
|
106
|
-
messageType: 'error' as const,
|
|
107
|
-
content: 'Context size too small (minimum: 1000 tokens)',
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
if (newSize > 200000) {
|
|
112
|
-
return {
|
|
113
|
-
type: 'message' as const,
|
|
114
|
-
messageType: 'error' as const,
|
|
115
|
-
content: 'Context size too large (maximum: 200k tokens)\nLarge contexts require significant VRAM',
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Update the sampling params with the new context size
|
|
120
|
-
config.setContentGeneratorSamplingParams({ num_ctx: newSize });
|
|
121
|
-
|
|
122
|
-
const memoryEstimate = Math.ceil(newSize / 4096); // Rough VRAM estimate in GB
|
|
123
|
-
const warningMessage = memoryEstimate > 8 ?
|
|
124
|
-
`\n⚠️ Warning: ${formatContextSize(newSize)} tokens may require ${memoryEstimate}+ GB VRAM` : '';
|
|
125
|
-
|
|
126
|
-
return {
|
|
127
|
-
type: 'message' as const,
|
|
128
|
-
messageType: 'info' as const,
|
|
129
|
-
content: `✅ Context window set to ${formatContextSize(newSize)} tokens${warningMessage}\n\nThis setting applies to subsequent requests. Check the status bar to see updated context information.`,
|
|
130
|
-
};
|
|
131
|
-
},
|
|
132
|
-
};
|
|
@@ -1,296 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { vi, describe, it, expect, beforeEach, Mock } from 'vitest';
|
|
8
|
-
import { copyCommand } from './copyCommand.js';
|
|
9
|
-
import { type CommandContext } from './types.js';
|
|
10
|
-
import { createMockCommandContext } from '../../test-utils/mockCommandContext.js';
|
|
11
|
-
import { copyToClipboard } from '../utils/commandUtils.js';
|
|
12
|
-
|
|
13
|
-
vi.mock('../utils/commandUtils.js', () => ({
|
|
14
|
-
copyToClipboard: vi.fn(),
|
|
15
|
-
}));
|
|
16
|
-
|
|
17
|
-
describe('copyCommand', () => {
|
|
18
|
-
let mockContext: CommandContext;
|
|
19
|
-
let mockCopyToClipboard: Mock;
|
|
20
|
-
let mockGetChat: Mock;
|
|
21
|
-
let mockGetHistory: Mock;
|
|
22
|
-
|
|
23
|
-
beforeEach(() => {
|
|
24
|
-
vi.clearAllMocks();
|
|
25
|
-
|
|
26
|
-
mockCopyToClipboard = vi.mocked(copyToClipboard);
|
|
27
|
-
mockGetChat = vi.fn();
|
|
28
|
-
mockGetHistory = vi.fn();
|
|
29
|
-
|
|
30
|
-
mockContext = createMockCommandContext({
|
|
31
|
-
services: {
|
|
32
|
-
config: {
|
|
33
|
-
getGeminiClient: () => ({
|
|
34
|
-
getChat: mockGetChat,
|
|
35
|
-
}),
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
mockGetChat.mockReturnValue({
|
|
41
|
-
getHistory: mockGetHistory,
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('should return info message when no history is available', async () => {
|
|
46
|
-
if (!copyCommand.action) throw new Error('Command has no action');
|
|
47
|
-
|
|
48
|
-
mockGetChat.mockReturnValue(undefined);
|
|
49
|
-
|
|
50
|
-
const result = await copyCommand.action(mockContext, '');
|
|
51
|
-
|
|
52
|
-
expect(result).toEqual({
|
|
53
|
-
type: 'message',
|
|
54
|
-
messageType: 'info',
|
|
55
|
-
content: 'No output in history',
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
expect(mockCopyToClipboard).not.toHaveBeenCalled();
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('should return info message when history is empty', async () => {
|
|
62
|
-
if (!copyCommand.action) throw new Error('Command has no action');
|
|
63
|
-
|
|
64
|
-
mockGetHistory.mockReturnValue([]);
|
|
65
|
-
|
|
66
|
-
const result = await copyCommand.action(mockContext, '');
|
|
67
|
-
|
|
68
|
-
expect(result).toEqual({
|
|
69
|
-
type: 'message',
|
|
70
|
-
messageType: 'info',
|
|
71
|
-
content: 'No output in history',
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
expect(mockCopyToClipboard).not.toHaveBeenCalled();
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('should return info message when no AI messages are found in history', async () => {
|
|
78
|
-
if (!copyCommand.action) throw new Error('Command has no action');
|
|
79
|
-
|
|
80
|
-
const historyWithUserOnly = [
|
|
81
|
-
{
|
|
82
|
-
role: 'user',
|
|
83
|
-
parts: [{ text: 'Hello' }],
|
|
84
|
-
},
|
|
85
|
-
];
|
|
86
|
-
|
|
87
|
-
mockGetHistory.mockReturnValue(historyWithUserOnly);
|
|
88
|
-
|
|
89
|
-
const result = await copyCommand.action(mockContext, '');
|
|
90
|
-
|
|
91
|
-
expect(result).toEqual({
|
|
92
|
-
type: 'message',
|
|
93
|
-
messageType: 'info',
|
|
94
|
-
content: 'No output in history',
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
expect(mockCopyToClipboard).not.toHaveBeenCalled();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('should copy last AI message to clipboard successfully', async () => {
|
|
101
|
-
if (!copyCommand.action) throw new Error('Command has no action');
|
|
102
|
-
|
|
103
|
-
const historyWithAiMessage = [
|
|
104
|
-
{
|
|
105
|
-
role: 'user',
|
|
106
|
-
parts: [{ text: 'Hello' }],
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
role: 'model',
|
|
110
|
-
parts: [{ text: 'Hi there! How can I help you?' }],
|
|
111
|
-
},
|
|
112
|
-
];
|
|
113
|
-
|
|
114
|
-
mockGetHistory.mockReturnValue(historyWithAiMessage);
|
|
115
|
-
mockCopyToClipboard.mockResolvedValue(undefined);
|
|
116
|
-
|
|
117
|
-
const result = await copyCommand.action(mockContext, '');
|
|
118
|
-
|
|
119
|
-
expect(result).toEqual({
|
|
120
|
-
type: 'message',
|
|
121
|
-
messageType: 'info',
|
|
122
|
-
content: 'Last output copied to the clipboard',
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
expect(mockCopyToClipboard).toHaveBeenCalledWith(
|
|
126
|
-
'Hi there! How can I help you?',
|
|
127
|
-
);
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
it('should handle multiple text parts in AI message', async () => {
|
|
131
|
-
if (!copyCommand.action) throw new Error('Command has no action');
|
|
132
|
-
|
|
133
|
-
const historyWithMultipleParts = [
|
|
134
|
-
{
|
|
135
|
-
role: 'model',
|
|
136
|
-
parts: [{ text: 'Part 1: ' }, { text: 'Part 2: ' }, { text: 'Part 3' }],
|
|
137
|
-
},
|
|
138
|
-
];
|
|
139
|
-
|
|
140
|
-
mockGetHistory.mockReturnValue(historyWithMultipleParts);
|
|
141
|
-
mockCopyToClipboard.mockResolvedValue(undefined);
|
|
142
|
-
|
|
143
|
-
const result = await copyCommand.action(mockContext, '');
|
|
144
|
-
|
|
145
|
-
expect(mockCopyToClipboard).toHaveBeenCalledWith('Part 1: Part 2: Part 3');
|
|
146
|
-
expect(result).toEqual({
|
|
147
|
-
type: 'message',
|
|
148
|
-
messageType: 'info',
|
|
149
|
-
content: 'Last output copied to the clipboard',
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it('should filter out non-text parts', async () => {
|
|
154
|
-
if (!copyCommand.action) throw new Error('Command has no action');
|
|
155
|
-
|
|
156
|
-
const historyWithMixedParts = [
|
|
157
|
-
{
|
|
158
|
-
role: 'model',
|
|
159
|
-
parts: [
|
|
160
|
-
{ text: 'Text part' },
|
|
161
|
-
{ image: 'base64data' }, // Non-text part
|
|
162
|
-
{ text: ' more text' },
|
|
163
|
-
],
|
|
164
|
-
},
|
|
165
|
-
];
|
|
166
|
-
|
|
167
|
-
mockGetHistory.mockReturnValue(historyWithMixedParts);
|
|
168
|
-
mockCopyToClipboard.mockResolvedValue(undefined);
|
|
169
|
-
|
|
170
|
-
const result = await copyCommand.action(mockContext, '');
|
|
171
|
-
|
|
172
|
-
expect(mockCopyToClipboard).toHaveBeenCalledWith('Text part more text');
|
|
173
|
-
expect(result).toEqual({
|
|
174
|
-
type: 'message',
|
|
175
|
-
messageType: 'info',
|
|
176
|
-
content: 'Last output copied to the clipboard',
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it('should get the last AI message when multiple AI messages exist', async () => {
|
|
181
|
-
if (!copyCommand.action) throw new Error('Command has no action');
|
|
182
|
-
|
|
183
|
-
const historyWithMultipleAiMessages = [
|
|
184
|
-
{
|
|
185
|
-
role: 'model',
|
|
186
|
-
parts: [{ text: 'First AI response' }],
|
|
187
|
-
},
|
|
188
|
-
{
|
|
189
|
-
role: 'user',
|
|
190
|
-
parts: [{ text: 'User message' }],
|
|
191
|
-
},
|
|
192
|
-
{
|
|
193
|
-
role: 'model',
|
|
194
|
-
parts: [{ text: 'Second AI response' }],
|
|
195
|
-
},
|
|
196
|
-
];
|
|
197
|
-
|
|
198
|
-
mockGetHistory.mockReturnValue(historyWithMultipleAiMessages);
|
|
199
|
-
mockCopyToClipboard.mockResolvedValue(undefined);
|
|
200
|
-
|
|
201
|
-
const result = await copyCommand.action(mockContext, '');
|
|
202
|
-
|
|
203
|
-
expect(mockCopyToClipboard).toHaveBeenCalledWith('Second AI response');
|
|
204
|
-
expect(result).toEqual({
|
|
205
|
-
type: 'message',
|
|
206
|
-
messageType: 'info',
|
|
207
|
-
content: 'Last output copied to the clipboard',
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
it('should handle clipboard copy error', async () => {
|
|
212
|
-
if (!copyCommand.action) throw new Error('Command has no action');
|
|
213
|
-
|
|
214
|
-
const historyWithAiMessage = [
|
|
215
|
-
{
|
|
216
|
-
role: 'model',
|
|
217
|
-
parts: [{ text: 'AI response' }],
|
|
218
|
-
},
|
|
219
|
-
];
|
|
220
|
-
|
|
221
|
-
mockGetHistory.mockReturnValue(historyWithAiMessage);
|
|
222
|
-
const clipboardError = new Error('Clipboard access denied');
|
|
223
|
-
mockCopyToClipboard.mockRejectedValue(clipboardError);
|
|
224
|
-
|
|
225
|
-
const result = await copyCommand.action(mockContext, '');
|
|
226
|
-
|
|
227
|
-
expect(result).toEqual({
|
|
228
|
-
type: 'message',
|
|
229
|
-
messageType: 'error',
|
|
230
|
-
content: 'Failed to copy to the clipboard.',
|
|
231
|
-
});
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
it('should handle non-Error clipboard errors', async () => {
|
|
235
|
-
if (!copyCommand.action) throw new Error('Command has no action');
|
|
236
|
-
|
|
237
|
-
const historyWithAiMessage = [
|
|
238
|
-
{
|
|
239
|
-
role: 'model',
|
|
240
|
-
parts: [{ text: 'AI response' }],
|
|
241
|
-
},
|
|
242
|
-
];
|
|
243
|
-
|
|
244
|
-
mockGetHistory.mockReturnValue(historyWithAiMessage);
|
|
245
|
-
mockCopyToClipboard.mockRejectedValue('String error');
|
|
246
|
-
|
|
247
|
-
const result = await copyCommand.action(mockContext, '');
|
|
248
|
-
|
|
249
|
-
expect(result).toEqual({
|
|
250
|
-
type: 'message',
|
|
251
|
-
messageType: 'error',
|
|
252
|
-
content: 'Failed to copy to the clipboard.',
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
it('should return info message when no text parts found in AI message', async () => {
|
|
257
|
-
if (!copyCommand.action) throw new Error('Command has no action');
|
|
258
|
-
|
|
259
|
-
const historyWithEmptyParts = [
|
|
260
|
-
{
|
|
261
|
-
role: 'model',
|
|
262
|
-
parts: [{ image: 'base64data' }], // No text parts
|
|
263
|
-
},
|
|
264
|
-
];
|
|
265
|
-
|
|
266
|
-
mockGetHistory.mockReturnValue(historyWithEmptyParts);
|
|
267
|
-
|
|
268
|
-
const result = await copyCommand.action(mockContext, '');
|
|
269
|
-
|
|
270
|
-
expect(result).toEqual({
|
|
271
|
-
type: 'message',
|
|
272
|
-
messageType: 'info',
|
|
273
|
-
content: 'Last AI output contains no text to copy.',
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
expect(mockCopyToClipboard).not.toHaveBeenCalled();
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
it('should handle unavailable config service', async () => {
|
|
280
|
-
if (!copyCommand.action) throw new Error('Command has no action');
|
|
281
|
-
|
|
282
|
-
const nullConfigContext = createMockCommandContext({
|
|
283
|
-
services: { config: null },
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
const result = await copyCommand.action(nullConfigContext, '');
|
|
287
|
-
|
|
288
|
-
expect(result).toEqual({
|
|
289
|
-
type: 'message',
|
|
290
|
-
messageType: 'info',
|
|
291
|
-
content: 'No output in history',
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
expect(mockCopyToClipboard).not.toHaveBeenCalled();
|
|
295
|
-
});
|
|
296
|
-
});
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { copyToClipboard } from '../utils/commandUtils.js';
|
|
8
|
-
import {
|
|
9
|
-
CommandKind,
|
|
10
|
-
SlashCommand,
|
|
11
|
-
SlashCommandActionReturn,
|
|
12
|
-
} from './types.js';
|
|
13
|
-
|
|
14
|
-
export const copyCommand: SlashCommand = {
|
|
15
|
-
name: 'copy',
|
|
16
|
-
description: 'Copy the last result or code snippet to clipboard',
|
|
17
|
-
kind: CommandKind.BUILT_IN,
|
|
18
|
-
action: async (context, _args): Promise<SlashCommandActionReturn | void> => {
|
|
19
|
-
const chat = await context.services.config?.getGeminiClient()?.getChat();
|
|
20
|
-
const history = chat?.getHistory();
|
|
21
|
-
|
|
22
|
-
// Get the last message from the AI (model role)
|
|
23
|
-
const lastAiMessage = history
|
|
24
|
-
? history.filter((item) => item.role === 'model').pop()
|
|
25
|
-
: undefined;
|
|
26
|
-
|
|
27
|
-
if (!lastAiMessage) {
|
|
28
|
-
return {
|
|
29
|
-
type: 'message',
|
|
30
|
-
messageType: 'info',
|
|
31
|
-
content: 'No output in history',
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
// Extract text from the parts
|
|
35
|
-
const lastAiOutput = lastAiMessage.parts
|
|
36
|
-
?.filter((part) => part.text)
|
|
37
|
-
.map((part) => part.text)
|
|
38
|
-
.join('');
|
|
39
|
-
|
|
40
|
-
if (lastAiOutput) {
|
|
41
|
-
try {
|
|
42
|
-
await copyToClipboard(lastAiOutput);
|
|
43
|
-
|
|
44
|
-
return {
|
|
45
|
-
type: 'message',
|
|
46
|
-
messageType: 'info',
|
|
47
|
-
content: 'Last output copied to the clipboard',
|
|
48
|
-
};
|
|
49
|
-
} catch (error) {
|
|
50
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
51
|
-
console.debug(message);
|
|
52
|
-
|
|
53
|
-
return {
|
|
54
|
-
type: 'message',
|
|
55
|
-
messageType: 'error',
|
|
56
|
-
content: 'Failed to copy to the clipboard.',
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
} else {
|
|
60
|
-
return {
|
|
61
|
-
type: 'message',
|
|
62
|
-
messageType: 'info',
|
|
63
|
-
content: 'Last AI output contains no text to copy.',
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
};
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
8
|
-
import { corgiCommand } from './corgiCommand.js';
|
|
9
|
-
import { type CommandContext } from './types.js';
|
|
10
|
-
import { createMockCommandContext } from '../../test-utils/mockCommandContext.js';
|
|
11
|
-
|
|
12
|
-
describe('corgiCommand', () => {
|
|
13
|
-
let mockContext: CommandContext;
|
|
14
|
-
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
mockContext = createMockCommandContext();
|
|
17
|
-
vi.spyOn(mockContext.ui, 'toggleCorgiMode');
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it('should call the toggleCorgiMode function on the UI context', async () => {
|
|
21
|
-
if (!corgiCommand.action) {
|
|
22
|
-
throw new Error('The corgi command must have an action.');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
await corgiCommand.action(mockContext, '');
|
|
26
|
-
|
|
27
|
-
expect(mockContext.ui.toggleCorgiMode).toHaveBeenCalledTimes(1);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('should have the correct name and description', () => {
|
|
31
|
-
expect(corgiCommand.name).toBe('corgi');
|
|
32
|
-
expect(corgiCommand.description).toBe('Toggles corgi mode.');
|
|
33
|
-
});
|
|
34
|
-
});
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { CommandKind, type SlashCommand } from './types.js';
|
|
8
|
-
|
|
9
|
-
export const corgiCommand: SlashCommand = {
|
|
10
|
-
name: 'corgi',
|
|
11
|
-
description: 'Toggles corgi mode.',
|
|
12
|
-
kind: CommandKind.BUILT_IN,
|
|
13
|
-
action: (context, _args) => {
|
|
14
|
-
context.ui.toggleCorgiMode();
|
|
15
|
-
},
|
|
16
|
-
};
|