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,344 +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 { memoryCommand } from './memoryCommand.js';
|
|
9
|
-
import { type CommandContext, SlashCommand } from './types.js';
|
|
10
|
-
import { createMockCommandContext } from '../../test-utils/mockCommandContext.js';
|
|
11
|
-
import { MessageType } from '../types.js';
|
|
12
|
-
import { LoadedSettings } from '../../config/settings.js';
|
|
13
|
-
import {
|
|
14
|
-
getErrorMessage,
|
|
15
|
-
loadServerHierarchicalMemory,
|
|
16
|
-
type FileDiscoveryService,
|
|
17
|
-
} from 'fss-link-core';
|
|
18
|
-
|
|
19
|
-
vi.mock('fss-link-core', async (importOriginal) => {
|
|
20
|
-
const original =
|
|
21
|
-
await importOriginal<typeof import('fss-link-core')>();
|
|
22
|
-
return {
|
|
23
|
-
...original,
|
|
24
|
-
getErrorMessage: vi.fn((error: unknown) => {
|
|
25
|
-
if (error instanceof Error) return error.message;
|
|
26
|
-
return String(error);
|
|
27
|
-
}),
|
|
28
|
-
loadServerHierarchicalMemory: vi.fn(),
|
|
29
|
-
};
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
const mockLoadServerHierarchicalMemory = loadServerHierarchicalMemory as Mock;
|
|
33
|
-
|
|
34
|
-
describe('memoryCommand', () => {
|
|
35
|
-
let mockContext: CommandContext;
|
|
36
|
-
|
|
37
|
-
const getSubCommand = (name: 'show' | 'add' | 'refresh'): SlashCommand => {
|
|
38
|
-
const subCommand = memoryCommand.subCommands?.find(
|
|
39
|
-
(cmd) => cmd.name === name,
|
|
40
|
-
);
|
|
41
|
-
if (!subCommand) {
|
|
42
|
-
throw new Error(`/memory ${name} command not found.`);
|
|
43
|
-
}
|
|
44
|
-
return subCommand;
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
describe('/memory show', () => {
|
|
48
|
-
let showCommand: SlashCommand;
|
|
49
|
-
let mockGetUserMemory: Mock;
|
|
50
|
-
let mockGetGeminiMdFileCount: Mock;
|
|
51
|
-
|
|
52
|
-
beforeEach(() => {
|
|
53
|
-
showCommand = getSubCommand('show');
|
|
54
|
-
|
|
55
|
-
mockGetUserMemory = vi.fn();
|
|
56
|
-
mockGetGeminiMdFileCount = vi.fn();
|
|
57
|
-
|
|
58
|
-
mockContext = createMockCommandContext({
|
|
59
|
-
services: {
|
|
60
|
-
config: {
|
|
61
|
-
getUserMemory: mockGetUserMemory,
|
|
62
|
-
getGeminiMdFileCount: mockGetGeminiMdFileCount,
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('should display a message if memory is empty', async () => {
|
|
69
|
-
if (!showCommand.action) throw new Error('Command has no action');
|
|
70
|
-
|
|
71
|
-
mockGetUserMemory.mockReturnValue('');
|
|
72
|
-
mockGetGeminiMdFileCount.mockReturnValue(0);
|
|
73
|
-
|
|
74
|
-
await showCommand.action(mockContext, '');
|
|
75
|
-
|
|
76
|
-
expect(mockContext.ui.addItem).toHaveBeenCalledWith(
|
|
77
|
-
{
|
|
78
|
-
type: MessageType.INFO,
|
|
79
|
-
text: 'Memory is currently empty.',
|
|
80
|
-
},
|
|
81
|
-
expect.any(Number),
|
|
82
|
-
);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it('should display the memory content and file count if it exists', async () => {
|
|
86
|
-
if (!showCommand.action) throw new Error('Command has no action');
|
|
87
|
-
|
|
88
|
-
const memoryContent = 'This is a test memory.';
|
|
89
|
-
|
|
90
|
-
mockGetUserMemory.mockReturnValue(memoryContent);
|
|
91
|
-
mockGetGeminiMdFileCount.mockReturnValue(1);
|
|
92
|
-
|
|
93
|
-
await showCommand.action(mockContext, '');
|
|
94
|
-
|
|
95
|
-
expect(mockContext.ui.addItem).toHaveBeenCalledWith(
|
|
96
|
-
{
|
|
97
|
-
type: MessageType.INFO,
|
|
98
|
-
text: `Current memory content from 1 file(s):\n\n---\n${memoryContent}\n---`,
|
|
99
|
-
},
|
|
100
|
-
expect.any(Number),
|
|
101
|
-
);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
describe('/memory add', () => {
|
|
106
|
-
let addCommand: SlashCommand;
|
|
107
|
-
|
|
108
|
-
beforeEach(() => {
|
|
109
|
-
addCommand = getSubCommand('add');
|
|
110
|
-
mockContext = createMockCommandContext();
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it('should return an error message if no arguments are provided', () => {
|
|
114
|
-
if (!addCommand.action) throw new Error('Command has no action');
|
|
115
|
-
|
|
116
|
-
const result = addCommand.action(mockContext, ' ');
|
|
117
|
-
expect(result).toEqual({
|
|
118
|
-
type: 'message',
|
|
119
|
-
messageType: 'error',
|
|
120
|
-
content: 'Usage: /memory add [--global|--project] <text to remember>',
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
expect(mockContext.ui.addItem).not.toHaveBeenCalled();
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it('should return a tool action and add an info message when arguments are provided', () => {
|
|
127
|
-
if (!addCommand.action) throw new Error('Command has no action');
|
|
128
|
-
|
|
129
|
-
const fact = 'remember this';
|
|
130
|
-
const result = addCommand.action(mockContext, ` ${fact} `);
|
|
131
|
-
|
|
132
|
-
expect(mockContext.ui.addItem).toHaveBeenCalledWith(
|
|
133
|
-
{
|
|
134
|
-
type: MessageType.INFO,
|
|
135
|
-
text: `Attempting to save to memory : "${fact}"`,
|
|
136
|
-
},
|
|
137
|
-
expect.any(Number),
|
|
138
|
-
);
|
|
139
|
-
|
|
140
|
-
expect(result).toEqual({
|
|
141
|
-
type: 'tool',
|
|
142
|
-
toolName: 'save_memory',
|
|
143
|
-
toolArgs: { fact },
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
it('should handle --global flag and add scope to tool args', () => {
|
|
148
|
-
if (!addCommand.action) throw new Error('Command has no action');
|
|
149
|
-
|
|
150
|
-
const fact = 'remember this globally';
|
|
151
|
-
const result = addCommand.action(mockContext, `--global ${fact}`);
|
|
152
|
-
|
|
153
|
-
expect(mockContext.ui.addItem).toHaveBeenCalledWith(
|
|
154
|
-
{
|
|
155
|
-
type: MessageType.INFO,
|
|
156
|
-
text: `Attempting to save to memory (global): "${fact}"`,
|
|
157
|
-
},
|
|
158
|
-
expect.any(Number),
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
expect(result).toEqual({
|
|
162
|
-
type: 'tool',
|
|
163
|
-
toolName: 'save_memory',
|
|
164
|
-
toolArgs: { fact, scope: 'global' },
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
it('should handle --project flag and add scope to tool args', () => {
|
|
169
|
-
if (!addCommand.action) throw new Error('Command has no action');
|
|
170
|
-
|
|
171
|
-
const fact = 'remember this for project';
|
|
172
|
-
const result = addCommand.action(mockContext, `--project ${fact}`);
|
|
173
|
-
|
|
174
|
-
expect(mockContext.ui.addItem).toHaveBeenCalledWith(
|
|
175
|
-
{
|
|
176
|
-
type: MessageType.INFO,
|
|
177
|
-
text: `Attempting to save to memory (project): "${fact}"`,
|
|
178
|
-
},
|
|
179
|
-
expect.any(Number),
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
expect(result).toEqual({
|
|
183
|
-
type: 'tool',
|
|
184
|
-
toolName: 'save_memory',
|
|
185
|
-
toolArgs: { fact, scope: 'project' },
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
it('should return error if flag is provided but no fact follows', () => {
|
|
190
|
-
if (!addCommand.action) throw new Error('Command has no action');
|
|
191
|
-
|
|
192
|
-
const result = addCommand.action(mockContext, '--global ');
|
|
193
|
-
expect(result).toEqual({
|
|
194
|
-
type: 'message',
|
|
195
|
-
messageType: 'error',
|
|
196
|
-
content: 'Usage: /memory add [--global|--project] <text to remember>',
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
expect(mockContext.ui.addItem).not.toHaveBeenCalled();
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
describe('/memory refresh', () => {
|
|
204
|
-
let refreshCommand: SlashCommand;
|
|
205
|
-
let mockSetUserMemory: Mock;
|
|
206
|
-
let mockSetGeminiMdFileCount: Mock;
|
|
207
|
-
|
|
208
|
-
beforeEach(() => {
|
|
209
|
-
refreshCommand = getSubCommand('refresh');
|
|
210
|
-
mockSetUserMemory = vi.fn();
|
|
211
|
-
mockSetGeminiMdFileCount = vi.fn();
|
|
212
|
-
const mockConfig = {
|
|
213
|
-
setUserMemory: mockSetUserMemory,
|
|
214
|
-
setGeminiMdFileCount: mockSetGeminiMdFileCount,
|
|
215
|
-
getWorkingDir: () => '/test/dir',
|
|
216
|
-
getDebugMode: () => false,
|
|
217
|
-
getFileService: () => ({}) as FileDiscoveryService,
|
|
218
|
-
getExtensionContextFilePaths: () => [],
|
|
219
|
-
shouldLoadMemoryFromIncludeDirectories: () => false,
|
|
220
|
-
getWorkspaceContext: () => ({
|
|
221
|
-
getDirectories: () => [],
|
|
222
|
-
}),
|
|
223
|
-
getFileFilteringOptions: () => ({
|
|
224
|
-
ignore: [],
|
|
225
|
-
include: [],
|
|
226
|
-
}),
|
|
227
|
-
};
|
|
228
|
-
|
|
229
|
-
mockContext = createMockCommandContext({
|
|
230
|
-
services: {
|
|
231
|
-
config: mockConfig,
|
|
232
|
-
settings: {
|
|
233
|
-
merged: {
|
|
234
|
-
memoryDiscoveryMaxDirs: 1000,
|
|
235
|
-
},
|
|
236
|
-
} as LoadedSettings,
|
|
237
|
-
},
|
|
238
|
-
});
|
|
239
|
-
mockLoadServerHierarchicalMemory.mockClear();
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
it('should display success message when memory is refreshed with content', async () => {
|
|
243
|
-
if (!refreshCommand.action) throw new Error('Command has no action');
|
|
244
|
-
|
|
245
|
-
const refreshResult = {
|
|
246
|
-
memoryContent: 'new memory content',
|
|
247
|
-
fileCount: 2,
|
|
248
|
-
};
|
|
249
|
-
mockLoadServerHierarchicalMemory.mockResolvedValue(refreshResult);
|
|
250
|
-
|
|
251
|
-
await refreshCommand.action(mockContext, '');
|
|
252
|
-
|
|
253
|
-
expect(mockContext.ui.addItem).toHaveBeenCalledWith(
|
|
254
|
-
{
|
|
255
|
-
type: MessageType.INFO,
|
|
256
|
-
text: 'Refreshing memory from source files...',
|
|
257
|
-
},
|
|
258
|
-
expect.any(Number),
|
|
259
|
-
);
|
|
260
|
-
|
|
261
|
-
expect(loadServerHierarchicalMemory).toHaveBeenCalledOnce();
|
|
262
|
-
expect(mockSetUserMemory).toHaveBeenCalledWith(
|
|
263
|
-
refreshResult.memoryContent,
|
|
264
|
-
);
|
|
265
|
-
expect(mockSetGeminiMdFileCount).toHaveBeenCalledWith(
|
|
266
|
-
refreshResult.fileCount,
|
|
267
|
-
);
|
|
268
|
-
|
|
269
|
-
expect(mockContext.ui.addItem).toHaveBeenCalledWith(
|
|
270
|
-
{
|
|
271
|
-
type: MessageType.INFO,
|
|
272
|
-
text: 'Memory refreshed successfully. Loaded 18 characters from 2 file(s).',
|
|
273
|
-
},
|
|
274
|
-
expect.any(Number),
|
|
275
|
-
);
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
it('should display success message when memory is refreshed with no content', async () => {
|
|
279
|
-
if (!refreshCommand.action) throw new Error('Command has no action');
|
|
280
|
-
|
|
281
|
-
const refreshResult = { memoryContent: '', fileCount: 0 };
|
|
282
|
-
mockLoadServerHierarchicalMemory.mockResolvedValue(refreshResult);
|
|
283
|
-
|
|
284
|
-
await refreshCommand.action(mockContext, '');
|
|
285
|
-
|
|
286
|
-
expect(loadServerHierarchicalMemory).toHaveBeenCalledOnce();
|
|
287
|
-
expect(mockSetUserMemory).toHaveBeenCalledWith('');
|
|
288
|
-
expect(mockSetGeminiMdFileCount).toHaveBeenCalledWith(0);
|
|
289
|
-
|
|
290
|
-
expect(mockContext.ui.addItem).toHaveBeenCalledWith(
|
|
291
|
-
{
|
|
292
|
-
type: MessageType.INFO,
|
|
293
|
-
text: 'Memory refreshed successfully. No memory content found.',
|
|
294
|
-
},
|
|
295
|
-
expect.any(Number),
|
|
296
|
-
);
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
it('should display an error message if refreshing fails', async () => {
|
|
300
|
-
if (!refreshCommand.action) throw new Error('Command has no action');
|
|
301
|
-
|
|
302
|
-
const error = new Error('Failed to read memory files.');
|
|
303
|
-
mockLoadServerHierarchicalMemory.mockRejectedValue(error);
|
|
304
|
-
|
|
305
|
-
await refreshCommand.action(mockContext, '');
|
|
306
|
-
|
|
307
|
-
expect(loadServerHierarchicalMemory).toHaveBeenCalledOnce();
|
|
308
|
-
expect(mockSetUserMemory).not.toHaveBeenCalled();
|
|
309
|
-
expect(mockSetGeminiMdFileCount).not.toHaveBeenCalled();
|
|
310
|
-
|
|
311
|
-
expect(mockContext.ui.addItem).toHaveBeenCalledWith(
|
|
312
|
-
{
|
|
313
|
-
type: MessageType.ERROR,
|
|
314
|
-
text: `Error refreshing memory: ${error.message}`,
|
|
315
|
-
},
|
|
316
|
-
expect.any(Number),
|
|
317
|
-
);
|
|
318
|
-
|
|
319
|
-
expect(getErrorMessage).toHaveBeenCalledWith(error);
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
it('should not throw if config service is unavailable', async () => {
|
|
323
|
-
if (!refreshCommand.action) throw new Error('Command has no action');
|
|
324
|
-
|
|
325
|
-
const nullConfigContext = createMockCommandContext({
|
|
326
|
-
services: { config: null },
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
await expect(
|
|
330
|
-
refreshCommand.action(nullConfigContext, ''),
|
|
331
|
-
).resolves.toBeUndefined();
|
|
332
|
-
|
|
333
|
-
expect(nullConfigContext.ui.addItem).toHaveBeenCalledWith(
|
|
334
|
-
{
|
|
335
|
-
type: MessageType.INFO,
|
|
336
|
-
text: 'Refreshing memory from source files...',
|
|
337
|
-
},
|
|
338
|
-
expect.any(Number),
|
|
339
|
-
);
|
|
340
|
-
|
|
341
|
-
expect(loadServerHierarchicalMemory).not.toHaveBeenCalled();
|
|
342
|
-
});
|
|
343
|
-
});
|
|
344
|
-
});
|
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
getErrorMessage,
|
|
9
|
-
loadServerHierarchicalMemory,
|
|
10
|
-
FSS_LINK_DIR,
|
|
11
|
-
} from 'fss-link-core';
|
|
12
|
-
import path from 'node:path';
|
|
13
|
-
import os from 'os';
|
|
14
|
-
import fs from 'fs/promises';
|
|
15
|
-
import { MessageType } from '../types.js';
|
|
16
|
-
import {
|
|
17
|
-
CommandKind,
|
|
18
|
-
SlashCommand,
|
|
19
|
-
SlashCommandActionReturn,
|
|
20
|
-
} from './types.js';
|
|
21
|
-
|
|
22
|
-
export const memoryCommand: SlashCommand = {
|
|
23
|
-
name: 'memory',
|
|
24
|
-
description: 'Commands for interacting with memory.',
|
|
25
|
-
kind: CommandKind.BUILT_IN,
|
|
26
|
-
subCommands: [
|
|
27
|
-
{
|
|
28
|
-
name: 'show',
|
|
29
|
-
description: 'Show the current memory contents.',
|
|
30
|
-
kind: CommandKind.BUILT_IN,
|
|
31
|
-
action: async (context) => {
|
|
32
|
-
const memoryContent = context.services.config?.getUserMemory() || '';
|
|
33
|
-
const fileCount = context.services.config?.getGeminiMdFileCount() || 0;
|
|
34
|
-
|
|
35
|
-
const messageContent =
|
|
36
|
-
memoryContent.length > 0
|
|
37
|
-
? `Current memory content from ${fileCount} file(s):\n\n---\n${memoryContent}\n---`
|
|
38
|
-
: 'Memory is currently empty.';
|
|
39
|
-
|
|
40
|
-
context.ui.addItem(
|
|
41
|
-
{
|
|
42
|
-
type: MessageType.INFO,
|
|
43
|
-
text: messageContent,
|
|
44
|
-
},
|
|
45
|
-
Date.now(),
|
|
46
|
-
);
|
|
47
|
-
},
|
|
48
|
-
subCommands: [
|
|
49
|
-
{
|
|
50
|
-
name: '--project',
|
|
51
|
-
description: 'Show project-level memory contents.',
|
|
52
|
-
kind: CommandKind.BUILT_IN,
|
|
53
|
-
action: async (context) => {
|
|
54
|
-
try {
|
|
55
|
-
const projectMemoryPath = path.join(process.cwd(), 'LINK.md');
|
|
56
|
-
const memoryContent = await fs.readFile(
|
|
57
|
-
projectMemoryPath,
|
|
58
|
-
'utf-8',
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
const messageContent =
|
|
62
|
-
memoryContent.trim().length > 0
|
|
63
|
-
? `Project memory content from ${projectMemoryPath}:\n\n---\n${memoryContent}\n---`
|
|
64
|
-
: 'Project memory is currently empty.';
|
|
65
|
-
|
|
66
|
-
context.ui.addItem(
|
|
67
|
-
{
|
|
68
|
-
type: MessageType.INFO,
|
|
69
|
-
text: messageContent,
|
|
70
|
-
},
|
|
71
|
-
Date.now(),
|
|
72
|
-
);
|
|
73
|
-
} catch (_error) {
|
|
74
|
-
context.ui.addItem(
|
|
75
|
-
{
|
|
76
|
-
type: MessageType.INFO,
|
|
77
|
-
text: 'Project memory file not found or is currently empty.',
|
|
78
|
-
},
|
|
79
|
-
Date.now(),
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
name: '--global',
|
|
86
|
-
description: 'Show global memory contents.',
|
|
87
|
-
kind: CommandKind.BUILT_IN,
|
|
88
|
-
action: async (context) => {
|
|
89
|
-
try {
|
|
90
|
-
const globalMemoryPath = path.join(
|
|
91
|
-
os.homedir(),
|
|
92
|
-
FSS_LINK_DIR,
|
|
93
|
-
'LINK.md',
|
|
94
|
-
);
|
|
95
|
-
const globalMemoryContent = await fs.readFile(
|
|
96
|
-
globalMemoryPath,
|
|
97
|
-
'utf-8',
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
const messageContent =
|
|
101
|
-
globalMemoryContent.trim().length > 0
|
|
102
|
-
? `Global memory content:\n\n---\n${globalMemoryContent}\n---`
|
|
103
|
-
: 'Global memory is currently empty.';
|
|
104
|
-
|
|
105
|
-
context.ui.addItem(
|
|
106
|
-
{
|
|
107
|
-
type: MessageType.INFO,
|
|
108
|
-
text: messageContent,
|
|
109
|
-
},
|
|
110
|
-
Date.now(),
|
|
111
|
-
);
|
|
112
|
-
} catch (_error) {
|
|
113
|
-
context.ui.addItem(
|
|
114
|
-
{
|
|
115
|
-
type: MessageType.INFO,
|
|
116
|
-
text: 'Global memory file not found or is currently empty.',
|
|
117
|
-
},
|
|
118
|
-
Date.now(),
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
},
|
|
123
|
-
],
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
name: 'add',
|
|
127
|
-
description:
|
|
128
|
-
'Add content to the memory. Use --global for global memory or --project for project memory.',
|
|
129
|
-
kind: CommandKind.BUILT_IN,
|
|
130
|
-
action: (context, args): SlashCommandActionReturn | void => {
|
|
131
|
-
if (!args || args.trim() === '') {
|
|
132
|
-
return {
|
|
133
|
-
type: 'message',
|
|
134
|
-
messageType: 'error',
|
|
135
|
-
content:
|
|
136
|
-
'Usage: /memory add [--global|--project] <text to remember>',
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const trimmedArgs = args.trim();
|
|
141
|
-
let scope: 'global' | 'project' | undefined;
|
|
142
|
-
let fact: string;
|
|
143
|
-
|
|
144
|
-
// Check for scope flags
|
|
145
|
-
if (trimmedArgs.startsWith('--global ')) {
|
|
146
|
-
scope = 'global';
|
|
147
|
-
fact = trimmedArgs.substring('--global '.length).trim();
|
|
148
|
-
} else if (trimmedArgs.startsWith('--project ')) {
|
|
149
|
-
scope = 'project';
|
|
150
|
-
fact = trimmedArgs.substring('--project '.length).trim();
|
|
151
|
-
} else if (trimmedArgs === '--global' || trimmedArgs === '--project') {
|
|
152
|
-
// Flag provided but no text after it
|
|
153
|
-
return {
|
|
154
|
-
type: 'message',
|
|
155
|
-
messageType: 'error',
|
|
156
|
-
content:
|
|
157
|
-
'Usage: /memory add [--global|--project] <text to remember>',
|
|
158
|
-
};
|
|
159
|
-
} else {
|
|
160
|
-
// No scope specified, will be handled by the tool
|
|
161
|
-
fact = trimmedArgs;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (!fact || fact.trim() === '') {
|
|
165
|
-
return {
|
|
166
|
-
type: 'message',
|
|
167
|
-
messageType: 'error',
|
|
168
|
-
content:
|
|
169
|
-
'Usage: /memory add [--global|--project] <text to remember>',
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const scopeText = scope ? `(${scope})` : '';
|
|
174
|
-
context.ui.addItem(
|
|
175
|
-
{
|
|
176
|
-
type: MessageType.INFO,
|
|
177
|
-
text: `Attempting to save to memory ${scopeText}: "${fact}"`,
|
|
178
|
-
},
|
|
179
|
-
Date.now(),
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
return {
|
|
183
|
-
type: 'tool',
|
|
184
|
-
toolName: 'save_memory',
|
|
185
|
-
toolArgs: scope ? { fact, scope } : { fact },
|
|
186
|
-
};
|
|
187
|
-
},
|
|
188
|
-
subCommands: [
|
|
189
|
-
{
|
|
190
|
-
name: '--project',
|
|
191
|
-
description: 'Add content to project-level memory.',
|
|
192
|
-
kind: CommandKind.BUILT_IN,
|
|
193
|
-
action: (context, args): SlashCommandActionReturn | void => {
|
|
194
|
-
if (!args || args.trim() === '') {
|
|
195
|
-
return {
|
|
196
|
-
type: 'message',
|
|
197
|
-
messageType: 'error',
|
|
198
|
-
content: 'Usage: /memory add --project <text to remember>',
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
context.ui.addItem(
|
|
203
|
-
{
|
|
204
|
-
type: MessageType.INFO,
|
|
205
|
-
text: `Attempting to save to project memory: "${args.trim()}"`,
|
|
206
|
-
},
|
|
207
|
-
Date.now(),
|
|
208
|
-
);
|
|
209
|
-
|
|
210
|
-
return {
|
|
211
|
-
type: 'tool',
|
|
212
|
-
toolName: 'save_memory',
|
|
213
|
-
toolArgs: { fact: args.trim(), scope: 'project' },
|
|
214
|
-
};
|
|
215
|
-
},
|
|
216
|
-
},
|
|
217
|
-
{
|
|
218
|
-
name: '--global',
|
|
219
|
-
description: 'Add content to global memory.',
|
|
220
|
-
kind: CommandKind.BUILT_IN,
|
|
221
|
-
action: (context, args): SlashCommandActionReturn | void => {
|
|
222
|
-
if (!args || args.trim() === '') {
|
|
223
|
-
return {
|
|
224
|
-
type: 'message',
|
|
225
|
-
messageType: 'error',
|
|
226
|
-
content: 'Usage: /memory add --global <text to remember>',
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
context.ui.addItem(
|
|
231
|
-
{
|
|
232
|
-
type: MessageType.INFO,
|
|
233
|
-
text: `Attempting to save to global memory: "${args.trim()}"`,
|
|
234
|
-
},
|
|
235
|
-
Date.now(),
|
|
236
|
-
);
|
|
237
|
-
|
|
238
|
-
return {
|
|
239
|
-
type: 'tool',
|
|
240
|
-
toolName: 'save_memory',
|
|
241
|
-
toolArgs: { fact: args.trim(), scope: 'global' },
|
|
242
|
-
};
|
|
243
|
-
},
|
|
244
|
-
},
|
|
245
|
-
],
|
|
246
|
-
},
|
|
247
|
-
{
|
|
248
|
-
name: 'refresh',
|
|
249
|
-
description: 'Refresh the memory from the source.',
|
|
250
|
-
kind: CommandKind.BUILT_IN,
|
|
251
|
-
action: async (context) => {
|
|
252
|
-
context.ui.addItem(
|
|
253
|
-
{
|
|
254
|
-
type: MessageType.INFO,
|
|
255
|
-
text: 'Refreshing memory from source files...',
|
|
256
|
-
},
|
|
257
|
-
Date.now(),
|
|
258
|
-
);
|
|
259
|
-
|
|
260
|
-
try {
|
|
261
|
-
const config = context.services.config;
|
|
262
|
-
if (config) {
|
|
263
|
-
const { memoryContent, fileCount } =
|
|
264
|
-
await loadServerHierarchicalMemory(
|
|
265
|
-
config.getWorkingDir(),
|
|
266
|
-
config.shouldLoadMemoryFromIncludeDirectories()
|
|
267
|
-
? config.getWorkspaceContext().getDirectories()
|
|
268
|
-
: [],
|
|
269
|
-
config.getDebugMode(),
|
|
270
|
-
config.getFileService(),
|
|
271
|
-
config.getExtensionContextFilePaths(),
|
|
272
|
-
context.services.settings.merged.memoryImportFormat || 'tree', // Use setting or default to 'tree'
|
|
273
|
-
config.getFileFilteringOptions(),
|
|
274
|
-
context.services.settings.merged.memoryDiscoveryMaxDirs,
|
|
275
|
-
);
|
|
276
|
-
config.setUserMemory(memoryContent);
|
|
277
|
-
config.setGeminiMdFileCount(fileCount);
|
|
278
|
-
|
|
279
|
-
const successMessage =
|
|
280
|
-
memoryContent.length > 0
|
|
281
|
-
? `Memory refreshed successfully. Loaded ${memoryContent.length} characters from ${fileCount} file(s).`
|
|
282
|
-
: 'Memory refreshed successfully. No memory content found.';
|
|
283
|
-
|
|
284
|
-
context.ui.addItem(
|
|
285
|
-
{
|
|
286
|
-
type: MessageType.INFO,
|
|
287
|
-
text: successMessage,
|
|
288
|
-
},
|
|
289
|
-
Date.now(),
|
|
290
|
-
);
|
|
291
|
-
}
|
|
292
|
-
} catch (error) {
|
|
293
|
-
const errorMessage = getErrorMessage(error);
|
|
294
|
-
context.ui.addItem(
|
|
295
|
-
{
|
|
296
|
-
type: MessageType.ERROR,
|
|
297
|
-
text: `Error refreshing memory: ${errorMessage}`,
|
|
298
|
-
},
|
|
299
|
-
Date.now(),
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
},
|
|
303
|
-
},
|
|
304
|
-
],
|
|
305
|
-
};
|
|
@@ -1,38 +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 } from 'vitest';
|
|
8
|
-
import { privacyCommand } from './privacyCommand.js';
|
|
9
|
-
import { type CommandContext } from './types.js';
|
|
10
|
-
import { createMockCommandContext } from '../../test-utils/mockCommandContext.js';
|
|
11
|
-
|
|
12
|
-
describe('privacyCommand', () => {
|
|
13
|
-
let mockContext: CommandContext;
|
|
14
|
-
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
mockContext = createMockCommandContext();
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
it('should return a dialog action to open the privacy dialog', () => {
|
|
20
|
-
// Ensure the command has an action to test.
|
|
21
|
-
if (!privacyCommand.action) {
|
|
22
|
-
throw new Error('The privacy command must have an action.');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const result = privacyCommand.action(mockContext, '');
|
|
26
|
-
|
|
27
|
-
// Assert that the action returns the correct object to trigger the privacy dialog.
|
|
28
|
-
expect(result).toEqual({
|
|
29
|
-
type: 'dialog',
|
|
30
|
-
dialog: 'privacy',
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('should have the correct name and description', () => {
|
|
35
|
-
expect(privacyCommand.name).toBe('privacy');
|
|
36
|
-
expect(privacyCommand.description).toBe('display the privacy notice');
|
|
37
|
-
});
|
|
38
|
-
});
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { CommandKind, OpenDialogActionReturn, SlashCommand } from './types.js';
|
|
8
|
-
|
|
9
|
-
export const privacyCommand: SlashCommand = {
|
|
10
|
-
name: 'privacy',
|
|
11
|
-
description: 'display the privacy notice',
|
|
12
|
-
kind: CommandKind.BUILT_IN,
|
|
13
|
-
action: (): OpenDialogActionReturn => ({
|
|
14
|
-
type: 'dialog',
|
|
15
|
-
dialog: 'privacy',
|
|
16
|
-
}),
|
|
17
|
-
};
|