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,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Calculates the maximum width of a multi-line ASCII art string.
|
|
9
|
-
* @param asciiArt The ASCII art string.
|
|
10
|
-
* @returns The length of the longest line in the ASCII art.
|
|
11
|
-
*/
|
|
12
|
-
export const getAsciiArtWidth = (asciiArt: string): number => {
|
|
13
|
-
if (!asciiArt) {
|
|
14
|
-
return 0;
|
|
15
|
-
}
|
|
16
|
-
const lines = asciiArt.split('\n');
|
|
17
|
-
return Math.max(...lines.map((line) => line.length));
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
/*
|
|
21
|
-
* -------------------------------------------------------------------------
|
|
22
|
-
* Unicode‑aware helpers (work at the code‑point level rather than UTF‑16
|
|
23
|
-
* code units so that surrogate‑pair emoji count as one "column".)
|
|
24
|
-
* ---------------------------------------------------------------------- */
|
|
25
|
-
|
|
26
|
-
export function toCodePoints(str: string): string[] {
|
|
27
|
-
// [...str] or Array.from both iterate by UTF‑32 code point, handling
|
|
28
|
-
// surrogate pairs correctly.
|
|
29
|
-
return Array.from(str);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function cpLen(str: string): number {
|
|
33
|
-
return toCodePoints(str).length;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function cpSlice(str: string, start: number, end?: number): string {
|
|
37
|
-
// Slice by code‑point indices and re‑join.
|
|
38
|
-
const arr = toCodePoints(str).slice(start, end);
|
|
39
|
-
return arr.join('');
|
|
40
|
-
}
|
|
@@ -1,163 +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 } from 'vitest';
|
|
8
|
-
import { checkForUpdates } from './updateCheck.js';
|
|
9
|
-
|
|
10
|
-
const getPackageJson = vi.hoisted(() => vi.fn());
|
|
11
|
-
vi.mock('../../utils/package.js', () => ({
|
|
12
|
-
getPackageJson,
|
|
13
|
-
}));
|
|
14
|
-
|
|
15
|
-
const updateNotifier = vi.hoisted(() => vi.fn());
|
|
16
|
-
vi.mock('update-notifier', () => ({
|
|
17
|
-
default: updateNotifier,
|
|
18
|
-
}));
|
|
19
|
-
|
|
20
|
-
describe('checkForUpdates', () => {
|
|
21
|
-
beforeEach(() => {
|
|
22
|
-
vi.useFakeTimers();
|
|
23
|
-
vi.resetAllMocks();
|
|
24
|
-
// Clear DEV environment variable before each test
|
|
25
|
-
delete process.env['DEV'];
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
afterEach(() => {
|
|
29
|
-
vi.useRealTimers();
|
|
30
|
-
vi.restoreAllMocks();
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('should return null when running from source (DEV=true)', async () => {
|
|
34
|
-
process.env['DEV'] = 'true';
|
|
35
|
-
getPackageJson.mockResolvedValue({
|
|
36
|
-
name: 'test-package',
|
|
37
|
-
version: '1.0.0',
|
|
38
|
-
});
|
|
39
|
-
updateNotifier.mockReturnValue({
|
|
40
|
-
fetchInfo: vi
|
|
41
|
-
.fn()
|
|
42
|
-
.mockResolvedValue({ current: '1.0.0', latest: '1.1.0' }),
|
|
43
|
-
});
|
|
44
|
-
const result = await checkForUpdates();
|
|
45
|
-
expect(result).toBeNull();
|
|
46
|
-
expect(getPackageJson).not.toHaveBeenCalled();
|
|
47
|
-
expect(updateNotifier).not.toHaveBeenCalled();
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('should return null if package.json is missing', async () => {
|
|
51
|
-
getPackageJson.mockResolvedValue(null);
|
|
52
|
-
const result = await checkForUpdates();
|
|
53
|
-
expect(result).toBeNull();
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it('should return null if there is no update', async () => {
|
|
57
|
-
getPackageJson.mockResolvedValue({
|
|
58
|
-
name: 'test-package',
|
|
59
|
-
version: '1.0.0',
|
|
60
|
-
});
|
|
61
|
-
updateNotifier.mockReturnValue({
|
|
62
|
-
fetchInfo: vi.fn().mockResolvedValue(null),
|
|
63
|
-
});
|
|
64
|
-
const result = await checkForUpdates();
|
|
65
|
-
expect(result).toBeNull();
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('should return a message if a newer version is available', async () => {
|
|
69
|
-
getPackageJson.mockResolvedValue({
|
|
70
|
-
name: 'test-package',
|
|
71
|
-
version: '1.0.0',
|
|
72
|
-
});
|
|
73
|
-
updateNotifier.mockReturnValue({
|
|
74
|
-
fetchInfo: vi
|
|
75
|
-
.fn()
|
|
76
|
-
.mockResolvedValue({ current: '1.0.0', latest: '1.1.0' }),
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
const result = await checkForUpdates();
|
|
80
|
-
expect(result?.message).toContain('1.0.0 → 1.1.0');
|
|
81
|
-
expect(result?.update).toEqual({ current: '1.0.0', latest: '1.1.0' });
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('should return null if the latest version is the same as the current version', async () => {
|
|
85
|
-
getPackageJson.mockResolvedValue({
|
|
86
|
-
name: 'test-package',
|
|
87
|
-
version: '1.0.0',
|
|
88
|
-
});
|
|
89
|
-
updateNotifier.mockReturnValue({
|
|
90
|
-
fetchInfo: vi
|
|
91
|
-
.fn()
|
|
92
|
-
.mockResolvedValue({ current: '1.0.0', latest: '1.0.0' }),
|
|
93
|
-
});
|
|
94
|
-
const result = await checkForUpdates();
|
|
95
|
-
expect(result).toBeNull();
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it('should return null if the latest version is older than the current version', async () => {
|
|
99
|
-
getPackageJson.mockResolvedValue({
|
|
100
|
-
name: 'test-package',
|
|
101
|
-
version: '1.1.0',
|
|
102
|
-
});
|
|
103
|
-
updateNotifier.mockReturnValue({
|
|
104
|
-
fetchInfo: vi
|
|
105
|
-
.fn()
|
|
106
|
-
.mockResolvedValue({ current: '1.1.0', latest: '1.0.0' }),
|
|
107
|
-
});
|
|
108
|
-
const result = await checkForUpdates();
|
|
109
|
-
expect(result).toBeNull();
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('should return null if fetchInfo rejects', async () => {
|
|
113
|
-
getPackageJson.mockResolvedValue({
|
|
114
|
-
name: 'test-package',
|
|
115
|
-
version: '1.0.0',
|
|
116
|
-
});
|
|
117
|
-
updateNotifier.mockReturnValue({
|
|
118
|
-
fetchInfo: vi.fn().mockRejectedValue(new Error('Timeout')),
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
const result = await checkForUpdates();
|
|
122
|
-
expect(result).toBeNull();
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it('should handle errors gracefully', async () => {
|
|
126
|
-
getPackageJson.mockRejectedValue(new Error('test error'));
|
|
127
|
-
const result = await checkForUpdates();
|
|
128
|
-
expect(result).toBeNull();
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
describe('nightly updates', () => {
|
|
132
|
-
it('should notify for a newer nightly version when current is nightly', async () => {
|
|
133
|
-
getPackageJson.mockResolvedValue({
|
|
134
|
-
name: 'test-package',
|
|
135
|
-
version: '1.2.3-nightly.1',
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
const fetchInfoMock = vi.fn().mockImplementation(({ distTag }) => {
|
|
139
|
-
if (distTag === 'nightly') {
|
|
140
|
-
return Promise.resolve({
|
|
141
|
-
latest: '1.2.3-nightly.2',
|
|
142
|
-
current: '1.2.3-nightly.1',
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
if (distTag === 'latest') {
|
|
146
|
-
return Promise.resolve({
|
|
147
|
-
latest: '1.2.3',
|
|
148
|
-
current: '1.2.3-nightly.1',
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
return Promise.resolve(null);
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
updateNotifier.mockImplementation(({ pkg, distTag }) => ({
|
|
155
|
-
fetchInfo: () => fetchInfoMock({ pkg, distTag }),
|
|
156
|
-
}));
|
|
157
|
-
|
|
158
|
-
const result = await checkForUpdates();
|
|
159
|
-
expect(result?.message).toContain('1.2.3-nightly.1 → 1.2.3-nightly.2');
|
|
160
|
-
expect(result?.update.latest).toBe('1.2.3-nightly.2');
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
});
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import updateNotifier, { UpdateInfo } from 'update-notifier';
|
|
8
|
-
import semver from 'semver';
|
|
9
|
-
import { getPackageJson } from '../../utils/package.js';
|
|
10
|
-
|
|
11
|
-
export const FETCH_TIMEOUT_MS = 2000;
|
|
12
|
-
|
|
13
|
-
export interface UpdateObject {
|
|
14
|
-
message: string;
|
|
15
|
-
update: UpdateInfo;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* From a nightly and stable update, determines which is the "best" one to offer.
|
|
20
|
-
* The rule is to always prefer nightly if the base versions are the same.
|
|
21
|
-
*/
|
|
22
|
-
function getBestAvailableUpdate(
|
|
23
|
-
nightly?: UpdateInfo,
|
|
24
|
-
stable?: UpdateInfo,
|
|
25
|
-
): UpdateInfo | null {
|
|
26
|
-
if (!nightly) return stable || null;
|
|
27
|
-
if (!stable) return nightly || null;
|
|
28
|
-
|
|
29
|
-
const nightlyVer = nightly.latest;
|
|
30
|
-
const stableVer = stable.latest;
|
|
31
|
-
|
|
32
|
-
if (
|
|
33
|
-
semver.coerce(stableVer)?.version === semver.coerce(nightlyVer)?.version
|
|
34
|
-
) {
|
|
35
|
-
return nightly;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return semver.gt(stableVer, nightlyVer) ? stable : nightly;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export async function checkForUpdates(): Promise<UpdateObject | null> {
|
|
42
|
-
try {
|
|
43
|
-
// Skip update check when running from source (development mode)
|
|
44
|
-
if (process.env['DEV'] === 'true') {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
const packageJson = await getPackageJson();
|
|
48
|
-
if (!packageJson || !packageJson.name || !packageJson.version) {
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const { name, version: currentVersion } = packageJson;
|
|
53
|
-
const isNightly = currentVersion.includes('nightly');
|
|
54
|
-
const createNotifier = (distTag: 'latest' | 'nightly') =>
|
|
55
|
-
updateNotifier({
|
|
56
|
-
pkg: {
|
|
57
|
-
name,
|
|
58
|
-
version: currentVersion,
|
|
59
|
-
},
|
|
60
|
-
updateCheckInterval: 0,
|
|
61
|
-
shouldNotifyInNpmScript: true,
|
|
62
|
-
distTag,
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
if (isNightly) {
|
|
66
|
-
const [nightlyUpdateInfo, latestUpdateInfo] = await Promise.all([
|
|
67
|
-
createNotifier('nightly').fetchInfo(),
|
|
68
|
-
createNotifier('latest').fetchInfo(),
|
|
69
|
-
]);
|
|
70
|
-
|
|
71
|
-
const bestUpdate = getBestAvailableUpdate(
|
|
72
|
-
nightlyUpdateInfo,
|
|
73
|
-
latestUpdateInfo,
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
if (bestUpdate && semver.gt(bestUpdate.latest, currentVersion)) {
|
|
77
|
-
const message = `A new version of FSS Link is available! ${currentVersion} → ${bestUpdate.latest}`;
|
|
78
|
-
return {
|
|
79
|
-
message,
|
|
80
|
-
update: { ...bestUpdate, current: currentVersion },
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
} else {
|
|
84
|
-
const updateInfo = await createNotifier('latest').fetchInfo();
|
|
85
|
-
|
|
86
|
-
if (updateInfo && semver.gt(updateInfo.latest, currentVersion)) {
|
|
87
|
-
const message = `FSS Link update available! ${currentVersion} → ${updateInfo.latest}`;
|
|
88
|
-
return {
|
|
89
|
-
message,
|
|
90
|
-
update: { ...updateInfo, current: currentVersion },
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return null;
|
|
96
|
-
} catch (e) {
|
|
97
|
-
console.warn('Failed to check for updates: ' + e);
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
}
|
package/dist/utils/checks.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
/* Fail to compile on unexpected values. */
|
|
8
|
-
export function assumeExhaustive(_value: never): void {}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Throws an exception on unexpected values.
|
|
12
|
-
*
|
|
13
|
-
* A common use case is switch statements:
|
|
14
|
-
* switch(enumValue) {
|
|
15
|
-
* case Enum.A:
|
|
16
|
-
* case Enum.B:
|
|
17
|
-
* break;
|
|
18
|
-
* default:
|
|
19
|
-
* checkExhaustive(enumValue);
|
|
20
|
-
* }
|
|
21
|
-
*/
|
|
22
|
-
export function checkExhaustive(
|
|
23
|
-
value: never,
|
|
24
|
-
msg = `unexpected value ${value}!`,
|
|
25
|
-
): never {
|
|
26
|
-
assumeExhaustive(value);
|
|
27
|
-
throw new Error(msg);
|
|
28
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { vi } from 'vitest';
|
|
8
|
-
import { registerCleanup, runExitCleanup } from './cleanup';
|
|
9
|
-
|
|
10
|
-
describe('cleanup', () => {
|
|
11
|
-
const originalCleanupFunctions = global['cleanupFunctions'];
|
|
12
|
-
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
// Isolate cleanup functions for each test
|
|
15
|
-
global['cleanupFunctions'] = [];
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
afterAll(() => {
|
|
19
|
-
// Restore original cleanup functions
|
|
20
|
-
global['cleanupFunctions'] = originalCleanupFunctions;
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('should run a registered synchronous function', async () => {
|
|
24
|
-
const cleanupFn = vi.fn();
|
|
25
|
-
registerCleanup(cleanupFn);
|
|
26
|
-
|
|
27
|
-
await runExitCleanup();
|
|
28
|
-
|
|
29
|
-
expect(cleanupFn).toHaveBeenCalledTimes(1);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('should run a registered asynchronous function', async () => {
|
|
33
|
-
const cleanupFn = vi.fn().mockResolvedValue(undefined);
|
|
34
|
-
registerCleanup(cleanupFn);
|
|
35
|
-
|
|
36
|
-
await runExitCleanup();
|
|
37
|
-
|
|
38
|
-
expect(cleanupFn).toHaveBeenCalledTimes(1);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it('should run multiple registered functions', async () => {
|
|
42
|
-
const syncFn = vi.fn();
|
|
43
|
-
const asyncFn = vi.fn().mockResolvedValue(undefined);
|
|
44
|
-
|
|
45
|
-
registerCleanup(syncFn);
|
|
46
|
-
registerCleanup(asyncFn);
|
|
47
|
-
|
|
48
|
-
await runExitCleanup();
|
|
49
|
-
|
|
50
|
-
expect(syncFn).toHaveBeenCalledTimes(1);
|
|
51
|
-
expect(asyncFn).toHaveBeenCalledTimes(1);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('should continue running cleanup functions even if one throws an error', async () => {
|
|
55
|
-
const errorFn = vi.fn(() => {
|
|
56
|
-
throw new Error('Test Error');
|
|
57
|
-
});
|
|
58
|
-
const successFn = vi.fn();
|
|
59
|
-
|
|
60
|
-
registerCleanup(errorFn);
|
|
61
|
-
registerCleanup(successFn);
|
|
62
|
-
|
|
63
|
-
await runExitCleanup();
|
|
64
|
-
|
|
65
|
-
expect(errorFn).toHaveBeenCalledTimes(1);
|
|
66
|
-
expect(successFn).toHaveBeenCalledTimes(1);
|
|
67
|
-
});
|
|
68
|
-
});
|
package/dist/utils/cleanup.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { promises as fs } from 'fs';
|
|
8
|
-
import { join } from 'path';
|
|
9
|
-
import { getProjectTempDir } from 'fss-link-core';
|
|
10
|
-
|
|
11
|
-
const cleanupFunctions: Array<(() => void) | (() => Promise<void>)> = [];
|
|
12
|
-
|
|
13
|
-
export function registerCleanup(fn: (() => void) | (() => Promise<void>)) {
|
|
14
|
-
cleanupFunctions.push(fn);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export async function runExitCleanup() {
|
|
18
|
-
for (const fn of cleanupFunctions) {
|
|
19
|
-
try {
|
|
20
|
-
await fn();
|
|
21
|
-
} catch (_) {
|
|
22
|
-
// Ignore errors during cleanup.
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
cleanupFunctions.length = 0; // Clear the array
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export async function cleanupCheckpoints() {
|
|
29
|
-
const tempDir = getProjectTempDir(process.cwd());
|
|
30
|
-
const checkpointsDir = join(tempDir, 'checkpoints');
|
|
31
|
-
try {
|
|
32
|
-
await fs.rm(checkpointsDir, { recursive: true, force: true });
|
|
33
|
-
} catch {
|
|
34
|
-
// Ignore errors if the directory doesn't exist or fails to delete.
|
|
35
|
-
}
|
|
36
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { SettingScope, LoadedSettings } from '../config/settings.js';
|
|
8
|
-
import { settingExistsInScope } from './settingsUtils.js';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Shared scope labels for dialog components that need to display setting scopes
|
|
12
|
-
*/
|
|
13
|
-
export const SCOPE_LABELS = {
|
|
14
|
-
[SettingScope.User]: 'User Settings',
|
|
15
|
-
[SettingScope.Workspace]: 'Workspace Settings',
|
|
16
|
-
[SettingScope.System]: 'System Settings',
|
|
17
|
-
} as const;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Helper function to get scope items for radio button selects
|
|
21
|
-
*/
|
|
22
|
-
export function getScopeItems() {
|
|
23
|
-
return [
|
|
24
|
-
{ label: SCOPE_LABELS[SettingScope.User], value: SettingScope.User },
|
|
25
|
-
{
|
|
26
|
-
label: SCOPE_LABELS[SettingScope.Workspace],
|
|
27
|
-
value: SettingScope.Workspace,
|
|
28
|
-
},
|
|
29
|
-
{ label: SCOPE_LABELS[SettingScope.System], value: SettingScope.System },
|
|
30
|
-
];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Generate scope message for a specific setting
|
|
35
|
-
*/
|
|
36
|
-
export function getScopeMessageForSetting(
|
|
37
|
-
settingKey: string,
|
|
38
|
-
selectedScope: SettingScope,
|
|
39
|
-
settings: LoadedSettings,
|
|
40
|
-
): string {
|
|
41
|
-
const otherScopes = Object.values(SettingScope).filter(
|
|
42
|
-
(scope) => scope !== selectedScope,
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
const modifiedInOtherScopes = otherScopes.filter((scope) => {
|
|
46
|
-
const scopeSettings = settings.forScope(scope).settings;
|
|
47
|
-
return settingExistsInScope(settingKey, scopeSettings);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
if (modifiedInOtherScopes.length === 0) {
|
|
51
|
-
return '';
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const modifiedScopesStr = modifiedInOtherScopes.join(', ');
|
|
55
|
-
const currentScopeSettings = settings.forScope(selectedScope).settings;
|
|
56
|
-
const existsInCurrentScope = settingExistsInScope(
|
|
57
|
-
settingKey,
|
|
58
|
-
currentScopeSettings,
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
return existsInCurrentScope
|
|
62
|
-
? `(Also modified in ${modifiedScopesStr})`
|
|
63
|
-
: `(Modified in ${modifiedScopesStr})`;
|
|
64
|
-
}
|
package/dist/utils/events.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { EventEmitter } from 'events';
|
|
8
|
-
|
|
9
|
-
export enum AppEvent {
|
|
10
|
-
OpenDebugConsole = 'open-debug-console',
|
|
11
|
-
LogError = 'log-error',
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export const appEvents = new EventEmitter();
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { vi, describe, expect, it, afterEach, beforeEach } from 'vitest';
|
|
8
|
-
import * as child_process from 'child_process';
|
|
9
|
-
import {
|
|
10
|
-
isGitHubRepository,
|
|
11
|
-
getGitRepoRoot,
|
|
12
|
-
getLatestGitHubRelease,
|
|
13
|
-
getGitHubRepoInfo,
|
|
14
|
-
} from './gitUtils.js';
|
|
15
|
-
|
|
16
|
-
vi.mock('child_process');
|
|
17
|
-
|
|
18
|
-
describe('isGitHubRepository', async () => {
|
|
19
|
-
beforeEach(() => {
|
|
20
|
-
vi.resetAllMocks();
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
afterEach(() => {
|
|
24
|
-
vi.restoreAllMocks();
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('returns false if the git command fails', async () => {
|
|
28
|
-
vi.mocked(child_process.execSync).mockImplementation((): string => {
|
|
29
|
-
throw new Error('oops');
|
|
30
|
-
});
|
|
31
|
-
expect(isGitHubRepository()).toBe(false);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('returns false if the remote is not github.com', async () => {
|
|
35
|
-
vi.mocked(child_process.execSync).mockReturnValueOnce('https://gitlab.com');
|
|
36
|
-
expect(isGitHubRepository()).toBe(false);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('returns true if the remote is github.com', async () => {
|
|
40
|
-
vi.mocked(child_process.execSync).mockReturnValueOnce(`
|
|
41
|
-
origin https://github.com/sethvargo/gemini-cli (fetch)
|
|
42
|
-
origin https://github.com/sethvargo/gemini-cli (push)
|
|
43
|
-
`);
|
|
44
|
-
expect(isGitHubRepository()).toBe(true);
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
describe('getGitHubRepoInfo', async () => {
|
|
49
|
-
beforeEach(() => {
|
|
50
|
-
vi.resetAllMocks();
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
afterEach(() => {
|
|
54
|
-
vi.restoreAllMocks();
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('throws an error if github repo info cannot be determined', async () => {
|
|
58
|
-
vi.mocked(child_process.execSync).mockImplementation((): string => {
|
|
59
|
-
throw new Error('oops');
|
|
60
|
-
});
|
|
61
|
-
expect(() => {
|
|
62
|
-
getGitHubRepoInfo();
|
|
63
|
-
}).toThrowError(/oops/);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('throws an error if owner/repo could not be determined', async () => {
|
|
67
|
-
vi.mocked(child_process.execSync).mockReturnValueOnce('');
|
|
68
|
-
expect(() => {
|
|
69
|
-
getGitHubRepoInfo();
|
|
70
|
-
}).toThrowError(/Owner & repo could not be extracted from remote URL/);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('returns the owner and repo', async () => {
|
|
74
|
-
vi.mocked(child_process.execSync).mockReturnValueOnce(
|
|
75
|
-
'https://github.com/owner/repo.git ',
|
|
76
|
-
);
|
|
77
|
-
expect(getGitHubRepoInfo()).toEqual({ owner: 'owner', repo: 'repo' });
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
describe('getGitRepoRoot', async () => {
|
|
82
|
-
beforeEach(() => {
|
|
83
|
-
vi.resetAllMocks();
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
afterEach(() => {
|
|
87
|
-
vi.restoreAllMocks();
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it('throws an error if git root cannot be determined', async () => {
|
|
91
|
-
vi.mocked(child_process.execSync).mockImplementation((): string => {
|
|
92
|
-
throw new Error('oops');
|
|
93
|
-
});
|
|
94
|
-
expect(() => {
|
|
95
|
-
getGitRepoRoot();
|
|
96
|
-
}).toThrowError(/oops/);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('throws an error if git root is empty', async () => {
|
|
100
|
-
vi.mocked(child_process.execSync).mockReturnValueOnce('');
|
|
101
|
-
expect(() => {
|
|
102
|
-
getGitRepoRoot();
|
|
103
|
-
}).toThrowError(/Git repo returned empty value/);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('returns the root', async () => {
|
|
107
|
-
vi.mocked(child_process.execSync).mockReturnValueOnce('/path/to/git/repo');
|
|
108
|
-
expect(getGitRepoRoot()).toBe('/path/to/git/repo');
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
describe('getLatestRelease', async () => {
|
|
113
|
-
beforeEach(() => {
|
|
114
|
-
vi.resetAllMocks();
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
afterEach(() => {
|
|
118
|
-
vi.restoreAllMocks();
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('throws an error if the fetch fails', async () => {
|
|
122
|
-
global.fetch = vi.fn(() => Promise.reject('nope'));
|
|
123
|
-
expect(getLatestGitHubRelease()).rejects.toThrowError(
|
|
124
|
-
/Unable to determine the latest/,
|
|
125
|
-
);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it('throws an error if the fetch does not return a json body', async () => {
|
|
129
|
-
global.fetch = vi.fn(() =>
|
|
130
|
-
Promise.resolve({
|
|
131
|
-
ok: true,
|
|
132
|
-
json: () => Promise.resolve({ foo: 'bar' }),
|
|
133
|
-
} as Response),
|
|
134
|
-
);
|
|
135
|
-
expect(getLatestGitHubRelease()).rejects.toThrowError(
|
|
136
|
-
/Unable to determine the latest/,
|
|
137
|
-
);
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it('returns the release version', async () => {
|
|
141
|
-
global.fetch = vi.fn(() =>
|
|
142
|
-
Promise.resolve({
|
|
143
|
-
ok: true,
|
|
144
|
-
json: () => Promise.resolve({ tag_name: 'v1.2.3' }),
|
|
145
|
-
} as Response),
|
|
146
|
-
);
|
|
147
|
-
expect(getLatestGitHubRelease()).resolves.toBe('v1.2.3');
|
|
148
|
-
});
|
|
149
|
-
});
|