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
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Migration Manager for FSS Link Database
|
|
8
|
+
* Handles schema versioning and safe upgrades
|
|
9
|
+
*/
|
|
10
|
+
export class MigrationManager {
|
|
11
|
+
migrations = [];
|
|
12
|
+
constructor() {
|
|
13
|
+
this.registerMigrations();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Register all available migrations
|
|
17
|
+
*/
|
|
18
|
+
registerMigrations() {
|
|
19
|
+
// Migration 1: Initial schema (v1.0.0)
|
|
20
|
+
this.migrations.push({
|
|
21
|
+
version: 1,
|
|
22
|
+
name: 'initial_schema',
|
|
23
|
+
up: (db) => {
|
|
24
|
+
db.exec(`
|
|
25
|
+
CREATE TABLE IF NOT EXISTS model_configs (
|
|
26
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
27
|
+
auth_type TEXT NOT NULL,
|
|
28
|
+
model_name TEXT NOT NULL,
|
|
29
|
+
endpoint_url TEXT,
|
|
30
|
+
api_key TEXT,
|
|
31
|
+
display_name TEXT,
|
|
32
|
+
is_favorite BOOLEAN DEFAULT 0,
|
|
33
|
+
is_active BOOLEAN DEFAULT 0,
|
|
34
|
+
last_used DATETIME,
|
|
35
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
36
|
+
source TEXT DEFAULT 'db',
|
|
37
|
+
UNIQUE(auth_type, model_name, endpoint_url)
|
|
38
|
+
)
|
|
39
|
+
`);
|
|
40
|
+
db.exec(`
|
|
41
|
+
CREATE TABLE IF NOT EXISTS user_preferences (
|
|
42
|
+
key TEXT PRIMARY KEY,
|
|
43
|
+
value TEXT NOT NULL,
|
|
44
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
45
|
+
)
|
|
46
|
+
`);
|
|
47
|
+
db.exec(`
|
|
48
|
+
CREATE TABLE IF NOT EXISTS custom_endpoints (
|
|
49
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
50
|
+
provider_id INTEGER NOT NULL,
|
|
51
|
+
name TEXT NOT NULL,
|
|
52
|
+
url TEXT NOT NULL,
|
|
53
|
+
description TEXT,
|
|
54
|
+
is_default BOOLEAN DEFAULT 0,
|
|
55
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
56
|
+
)
|
|
57
|
+
`);
|
|
58
|
+
db.exec(`
|
|
59
|
+
CREATE TABLE IF NOT EXISTS provider_settings (
|
|
60
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
61
|
+
provider_id INTEGER NOT NULL,
|
|
62
|
+
setting_key TEXT NOT NULL,
|
|
63
|
+
setting_value TEXT NOT NULL,
|
|
64
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
65
|
+
UNIQUE(provider_id, setting_key)
|
|
66
|
+
)
|
|
67
|
+
`);
|
|
68
|
+
db.exec(`
|
|
69
|
+
CREATE TABLE IF NOT EXISTS provider_usage_stats (
|
|
70
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
71
|
+
provider_id INTEGER NOT NULL,
|
|
72
|
+
tokens_used INTEGER DEFAULT 0,
|
|
73
|
+
session_duration_seconds INTEGER DEFAULT 0,
|
|
74
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
75
|
+
)
|
|
76
|
+
`);
|
|
77
|
+
},
|
|
78
|
+
down: (db) => {
|
|
79
|
+
db.exec('DROP TABLE IF EXISTS provider_usage_stats');
|
|
80
|
+
db.exec('DROP TABLE IF EXISTS provider_settings');
|
|
81
|
+
db.exec('DROP TABLE IF EXISTS custom_endpoints');
|
|
82
|
+
db.exec('DROP TABLE IF EXISTS user_preferences');
|
|
83
|
+
db.exec('DROP TABLE IF EXISTS model_configs');
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// Migration 2: Add unique active model constraint (v1.0.43)
|
|
87
|
+
this.migrations.push({
|
|
88
|
+
version: 2,
|
|
89
|
+
name: 'unique_active_constraint',
|
|
90
|
+
up: (db) => {
|
|
91
|
+
db.exec(`
|
|
92
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_model_configs_active_unique
|
|
93
|
+
ON model_configs(auth_type)
|
|
94
|
+
WHERE is_active = 1
|
|
95
|
+
`);
|
|
96
|
+
},
|
|
97
|
+
down: (db) => {
|
|
98
|
+
db.exec('DROP INDEX IF EXISTS idx_model_configs_active_unique');
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
// Migration 3: Add performance indexes (current)
|
|
102
|
+
this.migrations.push({
|
|
103
|
+
version: 3,
|
|
104
|
+
name: 'performance_indexes',
|
|
105
|
+
up: (db) => {
|
|
106
|
+
// Index for favorite models lookup
|
|
107
|
+
db.exec(`
|
|
108
|
+
CREATE INDEX IF NOT EXISTS idx_model_configs_favorite
|
|
109
|
+
ON model_configs(is_favorite, last_used DESC)
|
|
110
|
+
WHERE is_favorite = 1
|
|
111
|
+
`);
|
|
112
|
+
// Index for recent models lookup
|
|
113
|
+
db.exec(`
|
|
114
|
+
CREATE INDEX IF NOT EXISTS idx_model_configs_recent
|
|
115
|
+
ON model_configs(last_used DESC)
|
|
116
|
+
WHERE last_used IS NOT NULL
|
|
117
|
+
`);
|
|
118
|
+
// Index for provider settings lookup
|
|
119
|
+
db.exec(`
|
|
120
|
+
CREATE INDEX IF NOT EXISTS idx_provider_settings_lookup
|
|
121
|
+
ON provider_settings(provider_id, setting_key)
|
|
122
|
+
`);
|
|
123
|
+
// Index for usage stats aggregation
|
|
124
|
+
db.exec(`
|
|
125
|
+
CREATE INDEX IF NOT EXISTS idx_provider_usage_stats_aggregation
|
|
126
|
+
ON provider_usage_stats(provider_id, created_at DESC)
|
|
127
|
+
`);
|
|
128
|
+
},
|
|
129
|
+
down: (db) => {
|
|
130
|
+
db.exec('DROP INDEX IF EXISTS idx_provider_usage_stats_aggregation');
|
|
131
|
+
db.exec('DROP INDEX IF EXISTS idx_provider_settings_lookup');
|
|
132
|
+
db.exec('DROP INDEX IF EXISTS idx_model_configs_recent');
|
|
133
|
+
db.exec('DROP INDEX IF EXISTS idx_model_configs_favorite');
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
// Migration 4: Add database health monitoring
|
|
137
|
+
this.migrations.push({
|
|
138
|
+
version: 4,
|
|
139
|
+
name: 'health_monitoring',
|
|
140
|
+
up: (db) => {
|
|
141
|
+
db.exec(`
|
|
142
|
+
CREATE TABLE IF NOT EXISTS schema_info (
|
|
143
|
+
key TEXT PRIMARY KEY,
|
|
144
|
+
value TEXT NOT NULL,
|
|
145
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
146
|
+
)
|
|
147
|
+
`);
|
|
148
|
+
// Store initial health metrics
|
|
149
|
+
const now = new Date().toISOString();
|
|
150
|
+
db.exec(`
|
|
151
|
+
INSERT OR REPLACE INTO schema_info (key, value, updated_at)
|
|
152
|
+
VALUES
|
|
153
|
+
('schema_version', '4', '${now}'),
|
|
154
|
+
('last_migration', 'health_monitoring', '${now}'),
|
|
155
|
+
('total_migrations', '4', '${now}')
|
|
156
|
+
`);
|
|
157
|
+
},
|
|
158
|
+
down: (db) => {
|
|
159
|
+
db.exec('DROP TABLE IF EXISTS schema_info');
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get current schema version from database
|
|
165
|
+
*/
|
|
166
|
+
getCurrentVersion(db) {
|
|
167
|
+
try {
|
|
168
|
+
// Check if schema_info table exists
|
|
169
|
+
const result = db.exec(`
|
|
170
|
+
SELECT name FROM sqlite_master
|
|
171
|
+
WHERE type='table' AND name='schema_info'
|
|
172
|
+
`);
|
|
173
|
+
if (result.length === 0) {
|
|
174
|
+
// No schema_info table means we need to check for legacy tables
|
|
175
|
+
const modelConfigsResult = db.exec(`
|
|
176
|
+
SELECT name FROM sqlite_master
|
|
177
|
+
WHERE type='table' AND name='model_configs'
|
|
178
|
+
`);
|
|
179
|
+
if (modelConfigsResult.length > 0) {
|
|
180
|
+
// Legacy database exists, assume version 1
|
|
181
|
+
return 1;
|
|
182
|
+
}
|
|
183
|
+
// Fresh database
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
// Get version from schema_info
|
|
187
|
+
const versionResult = db.exec(`
|
|
188
|
+
SELECT value FROM schema_info WHERE key = 'schema_version'
|
|
189
|
+
`);
|
|
190
|
+
if (versionResult.length > 0 && versionResult[0].values.length > 0) {
|
|
191
|
+
return parseInt(versionResult[0].values[0][0], 10);
|
|
192
|
+
}
|
|
193
|
+
return 1; // Default to version 1 if schema_info exists but no version
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
console.warn('Failed to get schema version:', error);
|
|
197
|
+
return 0;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get latest migration version
|
|
202
|
+
*/
|
|
203
|
+
getLatestVersion() {
|
|
204
|
+
return Math.max(...this.migrations.map(m => m.version));
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Check if migrations are needed
|
|
208
|
+
*/
|
|
209
|
+
needsMigration(db) {
|
|
210
|
+
const currentVersion = this.getCurrentVersion(db);
|
|
211
|
+
const latestVersion = this.getLatestVersion();
|
|
212
|
+
return currentVersion < latestVersion;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Run all pending migrations
|
|
216
|
+
*/
|
|
217
|
+
async migrate(db) {
|
|
218
|
+
const currentVersion = this.getCurrentVersion(db);
|
|
219
|
+
const latestVersion = this.getLatestVersion();
|
|
220
|
+
if (currentVersion >= latestVersion) {
|
|
221
|
+
console.log(`Database is up to date (version ${currentVersion})`);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
console.log(`Migrating database from version ${currentVersion} to ${latestVersion}`);
|
|
225
|
+
// Sort migrations by version
|
|
226
|
+
const sortedMigrations = this.migrations.sort((a, b) => a.version - b.version);
|
|
227
|
+
// Run pending migrations in transaction
|
|
228
|
+
db.exec('BEGIN TRANSACTION');
|
|
229
|
+
try {
|
|
230
|
+
for (const migration of sortedMigrations) {
|
|
231
|
+
if (migration.version > currentVersion) {
|
|
232
|
+
console.log(`Running migration ${migration.version}: ${migration.name}`);
|
|
233
|
+
migration.up(db);
|
|
234
|
+
// Update schema version
|
|
235
|
+
this.updateSchemaVersion(db, migration.version, migration.name);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
db.exec('COMMIT');
|
|
239
|
+
console.log(`Database migration completed successfully`);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
db.exec('ROLLBACK');
|
|
243
|
+
console.error('Database migration failed:', error);
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Rollback to a specific version
|
|
249
|
+
*/
|
|
250
|
+
async rollback(db, targetVersion) {
|
|
251
|
+
const currentVersion = this.getCurrentVersion(db);
|
|
252
|
+
if (targetVersion >= currentVersion) {
|
|
253
|
+
console.log(`Already at or below target version ${targetVersion}`);
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
console.log(`Rolling back database from version ${currentVersion} to ${targetVersion}`);
|
|
257
|
+
// Sort migrations by version (descending for rollback)
|
|
258
|
+
const sortedMigrations = this.migrations.sort((a, b) => b.version - a.version);
|
|
259
|
+
// Run rollback migrations in transaction
|
|
260
|
+
db.exec('BEGIN TRANSACTION');
|
|
261
|
+
try {
|
|
262
|
+
for (const migration of sortedMigrations) {
|
|
263
|
+
if (migration.version > targetVersion && migration.version <= currentVersion) {
|
|
264
|
+
console.log(`Rolling back migration ${migration.version}: ${migration.name}`);
|
|
265
|
+
migration.down(db);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Update schema version
|
|
269
|
+
this.updateSchemaVersion(db, targetVersion, 'rollback');
|
|
270
|
+
db.exec('COMMIT');
|
|
271
|
+
console.log(`Database rollback completed successfully`);
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
db.exec('ROLLBACK');
|
|
275
|
+
console.error('Database rollback failed:', error);
|
|
276
|
+
throw error;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Update schema version in database
|
|
281
|
+
*/
|
|
282
|
+
updateSchemaVersion(db, version, migrationName) {
|
|
283
|
+
const now = new Date().toISOString();
|
|
284
|
+
// Ensure schema_info table exists
|
|
285
|
+
db.exec(`
|
|
286
|
+
CREATE TABLE IF NOT EXISTS schema_info (
|
|
287
|
+
key TEXT PRIMARY KEY,
|
|
288
|
+
value TEXT NOT NULL,
|
|
289
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
290
|
+
)
|
|
291
|
+
`);
|
|
292
|
+
// Update version info
|
|
293
|
+
db.exec(`
|
|
294
|
+
INSERT OR REPLACE INTO schema_info (key, value, updated_at)
|
|
295
|
+
VALUES
|
|
296
|
+
('schema_version', '${version}', '${now}'),
|
|
297
|
+
('last_migration', '${migrationName}', '${now}')
|
|
298
|
+
`);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Get migration history
|
|
302
|
+
*/
|
|
303
|
+
getMigrationHistory(db) {
|
|
304
|
+
try {
|
|
305
|
+
const result = db.exec(`
|
|
306
|
+
SELECT key, value, updated_at FROM schema_info
|
|
307
|
+
WHERE key IN ('schema_version', 'last_migration')
|
|
308
|
+
ORDER BY updated_at DESC
|
|
309
|
+
`);
|
|
310
|
+
if (result.length === 0)
|
|
311
|
+
return [];
|
|
312
|
+
const history = [];
|
|
313
|
+
// This is a simplified version - in a real system you'd track each migration
|
|
314
|
+
const currentVersion = this.getCurrentVersion(db);
|
|
315
|
+
const appliedMigrations = this.migrations
|
|
316
|
+
.filter(m => m.version <= currentVersion)
|
|
317
|
+
.sort((a, b) => a.version - b.version);
|
|
318
|
+
for (const migration of appliedMigrations) {
|
|
319
|
+
history.push({
|
|
320
|
+
version: migration.version,
|
|
321
|
+
name: migration.name,
|
|
322
|
+
date: new Date().toISOString() // Placeholder - real system would track actual dates
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
return history;
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
console.warn('Failed to get migration history:', error);
|
|
329
|
+
return [];
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Validate database schema integrity
|
|
334
|
+
*/
|
|
335
|
+
validateSchema(db) {
|
|
336
|
+
try {
|
|
337
|
+
// Check that all expected tables exist
|
|
338
|
+
const requiredTables = [
|
|
339
|
+
'model_configs',
|
|
340
|
+
'user_preferences',
|
|
341
|
+
'custom_endpoints',
|
|
342
|
+
'provider_settings',
|
|
343
|
+
'provider_usage_stats',
|
|
344
|
+
'schema_info'
|
|
345
|
+
];
|
|
346
|
+
for (const table of requiredTables) {
|
|
347
|
+
const result = db.exec(`
|
|
348
|
+
SELECT name FROM sqlite_master
|
|
349
|
+
WHERE type='table' AND name='${table}'
|
|
350
|
+
`);
|
|
351
|
+
if (result.length === 0) {
|
|
352
|
+
console.error(`Required table '${table}' is missing`);
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Check critical indexes
|
|
357
|
+
const requiredIndexes = [
|
|
358
|
+
'idx_model_configs_active_unique',
|
|
359
|
+
'idx_model_configs_favorite',
|
|
360
|
+
'idx_model_configs_recent'
|
|
361
|
+
];
|
|
362
|
+
for (const index of requiredIndexes) {
|
|
363
|
+
const result = db.exec(`
|
|
364
|
+
SELECT name FROM sqlite_master
|
|
365
|
+
WHERE type='index' AND name='${index}'
|
|
366
|
+
`);
|
|
367
|
+
if (result.length === 0) {
|
|
368
|
+
console.warn(`Recommended index '${index}' is missing`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return true;
|
|
372
|
+
}
|
|
373
|
+
catch (error) {
|
|
374
|
+
console.error('Schema validation failed:', error);
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=databaseMigrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"databaseMigrations.js","sourceRoot":"","sources":["../../../src/config/databaseMigrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { Database } from 'sql.js';
|
|
7
|
+
/**
|
|
8
|
+
* Database Connection Pool for SQLite
|
|
9
|
+
* Manages multiple database connections for better concurrency
|
|
10
|
+
*/
|
|
11
|
+
export declare class DatabaseConnectionPool {
|
|
12
|
+
private connections;
|
|
13
|
+
private availableConnections;
|
|
14
|
+
private readonly maxConnections;
|
|
15
|
+
private readonly dbPath;
|
|
16
|
+
private SQL;
|
|
17
|
+
private initialized;
|
|
18
|
+
private pendingRequests;
|
|
19
|
+
constructor(dbPath: string, maxConnections?: number);
|
|
20
|
+
/**
|
|
21
|
+
* Initialize the connection pool
|
|
22
|
+
*/
|
|
23
|
+
initialize(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Create a new database connection
|
|
26
|
+
*/
|
|
27
|
+
private createConnection;
|
|
28
|
+
/**
|
|
29
|
+
* Get a connection from the pool
|
|
30
|
+
*/
|
|
31
|
+
getConnection(): Promise<Database>;
|
|
32
|
+
/**
|
|
33
|
+
* Release a connection back to the pool
|
|
34
|
+
*/
|
|
35
|
+
releaseConnection(connection: Database): void;
|
|
36
|
+
/**
|
|
37
|
+
* Execute a function with a pooled connection
|
|
38
|
+
*/
|
|
39
|
+
withConnection<T>(fn: (db: Database) => Promise<T> | T): Promise<T>;
|
|
40
|
+
/**
|
|
41
|
+
* Execute a function within a transaction
|
|
42
|
+
*/
|
|
43
|
+
withTransaction<T>(fn: (db: Database) => Promise<T> | T): Promise<T>;
|
|
44
|
+
/**
|
|
45
|
+
* Sync all connections to disk
|
|
46
|
+
*/
|
|
47
|
+
syncToDisk(): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Close all connections
|
|
50
|
+
*/
|
|
51
|
+
close(): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Get pool statistics
|
|
54
|
+
*/
|
|
55
|
+
getStats(): {
|
|
56
|
+
totalConnections: number;
|
|
57
|
+
availableConnections: number;
|
|
58
|
+
activeConnections: number;
|
|
59
|
+
pendingRequests: number;
|
|
60
|
+
maxConnections: number;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get the global database connection pool
|
|
65
|
+
*/
|
|
66
|
+
export declare function getDatabasePool(dbPath?: string): DatabaseConnectionPool;
|
|
67
|
+
/**
|
|
68
|
+
* Close the global database pool
|
|
69
|
+
*/
|
|
70
|
+
export declare function closeDatabasePool(): Promise<void>;
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import initSqlJs from 'sql.js';
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
/**
|
|
9
|
+
* Database Connection Pool for SQLite
|
|
10
|
+
* Manages multiple database connections for better concurrency
|
|
11
|
+
*/
|
|
12
|
+
export class DatabaseConnectionPool {
|
|
13
|
+
connections = [];
|
|
14
|
+
availableConnections = [];
|
|
15
|
+
maxConnections;
|
|
16
|
+
dbPath;
|
|
17
|
+
SQL;
|
|
18
|
+
initialized = false;
|
|
19
|
+
pendingRequests = [];
|
|
20
|
+
constructor(dbPath, maxConnections = 5) {
|
|
21
|
+
this.dbPath = dbPath;
|
|
22
|
+
this.maxConnections = maxConnections;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Initialize the connection pool
|
|
26
|
+
*/
|
|
27
|
+
async initialize() {
|
|
28
|
+
if (this.initialized)
|
|
29
|
+
return;
|
|
30
|
+
this.SQL = await initSqlJs();
|
|
31
|
+
// Create initial connection pool
|
|
32
|
+
for (let i = 0; i < Math.min(2, this.maxConnections); i++) {
|
|
33
|
+
const connection = await this.createConnection();
|
|
34
|
+
this.connections.push(connection);
|
|
35
|
+
this.availableConnections.push(connection);
|
|
36
|
+
}
|
|
37
|
+
this.initialized = true;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create a new database connection
|
|
41
|
+
*/
|
|
42
|
+
async createConnection() {
|
|
43
|
+
let db;
|
|
44
|
+
if (fs.existsSync(this.dbPath)) {
|
|
45
|
+
const data = fs.readFileSync(this.dbPath);
|
|
46
|
+
db = new this.SQL.Database(data);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
db = new this.SQL.Database();
|
|
50
|
+
}
|
|
51
|
+
// Enable WAL mode for better concurrency
|
|
52
|
+
db.exec('PRAGMA journal_mode=WAL;');
|
|
53
|
+
// Set reasonable timeout for busy connections
|
|
54
|
+
db.exec('PRAGMA busy_timeout=5000;');
|
|
55
|
+
// Enable foreign key constraints
|
|
56
|
+
db.exec('PRAGMA foreign_keys=ON;');
|
|
57
|
+
return db;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get a connection from the pool
|
|
61
|
+
*/
|
|
62
|
+
async getConnection() {
|
|
63
|
+
if (!this.initialized) {
|
|
64
|
+
await this.initialize();
|
|
65
|
+
}
|
|
66
|
+
// If we have available connections, return one immediately
|
|
67
|
+
if (this.availableConnections.length > 0) {
|
|
68
|
+
return this.availableConnections.pop();
|
|
69
|
+
}
|
|
70
|
+
// If we can create more connections, create one
|
|
71
|
+
if (this.connections.length < this.maxConnections) {
|
|
72
|
+
const connection = await this.createConnection();
|
|
73
|
+
this.connections.push(connection);
|
|
74
|
+
return connection;
|
|
75
|
+
}
|
|
76
|
+
// Otherwise, wait for a connection to become available
|
|
77
|
+
return new Promise((resolve) => {
|
|
78
|
+
this.pendingRequests.push(resolve);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Release a connection back to the pool
|
|
83
|
+
*/
|
|
84
|
+
releaseConnection(connection) {
|
|
85
|
+
// If there are pending requests, satisfy them first
|
|
86
|
+
if (this.pendingRequests.length > 0) {
|
|
87
|
+
const request = this.pendingRequests.shift();
|
|
88
|
+
request(connection);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Otherwise, return to available pool
|
|
92
|
+
if (!this.availableConnections.includes(connection)) {
|
|
93
|
+
this.availableConnections.push(connection);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Execute a function with a pooled connection
|
|
98
|
+
*/
|
|
99
|
+
async withConnection(fn) {
|
|
100
|
+
const connection = await this.getConnection();
|
|
101
|
+
try {
|
|
102
|
+
return await fn(connection);
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
this.releaseConnection(connection);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Execute a function within a transaction
|
|
110
|
+
*/
|
|
111
|
+
async withTransaction(fn) {
|
|
112
|
+
return this.withConnection(async (db) => {
|
|
113
|
+
db.exec('BEGIN TRANSACTION;');
|
|
114
|
+
try {
|
|
115
|
+
const result = await fn(db);
|
|
116
|
+
db.exec('COMMIT;');
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
db.exec('ROLLBACK;');
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Sync all connections to disk
|
|
127
|
+
*/
|
|
128
|
+
async syncToDisk() {
|
|
129
|
+
if (!this.initialized || this.connections.length === 0)
|
|
130
|
+
return;
|
|
131
|
+
// Use the first connection to save to disk
|
|
132
|
+
const connection = await this.getConnection();
|
|
133
|
+
try {
|
|
134
|
+
const data = connection.export();
|
|
135
|
+
fs.writeFileSync(this.dbPath, Buffer.from(data));
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
this.releaseConnection(connection);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Close all connections
|
|
143
|
+
*/
|
|
144
|
+
async close() {
|
|
145
|
+
// Sync to disk before closing
|
|
146
|
+
await this.syncToDisk();
|
|
147
|
+
// Close all connections
|
|
148
|
+
for (const connection of this.connections) {
|
|
149
|
+
connection.close();
|
|
150
|
+
}
|
|
151
|
+
this.connections = [];
|
|
152
|
+
this.availableConnections = [];
|
|
153
|
+
this.initialized = false;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get pool statistics
|
|
157
|
+
*/
|
|
158
|
+
getStats() {
|
|
159
|
+
return {
|
|
160
|
+
totalConnections: this.connections.length,
|
|
161
|
+
availableConnections: this.availableConnections.length,
|
|
162
|
+
activeConnections: this.connections.length - this.availableConnections.length,
|
|
163
|
+
pendingRequests: this.pendingRequests.length,
|
|
164
|
+
maxConnections: this.maxConnections
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Singleton connection pool instance
|
|
170
|
+
*/
|
|
171
|
+
let globalPool = null;
|
|
172
|
+
/**
|
|
173
|
+
* Get the global database connection pool
|
|
174
|
+
*/
|
|
175
|
+
export function getDatabasePool(dbPath) {
|
|
176
|
+
if (!globalPool && dbPath) {
|
|
177
|
+
globalPool = new DatabaseConnectionPool(dbPath);
|
|
178
|
+
}
|
|
179
|
+
if (!globalPool) {
|
|
180
|
+
throw new Error('Database pool not initialized. Call with dbPath first.');
|
|
181
|
+
}
|
|
182
|
+
return globalPool;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Close the global database pool
|
|
186
|
+
*/
|
|
187
|
+
export async function closeDatabasePool() {
|
|
188
|
+
if (globalPool) {
|
|
189
|
+
await globalPool.close();
|
|
190
|
+
globalPool = null;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=databasePool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"databasePool.js","sourceRoot":"","sources":["../../../src/config/databasePool.ts"],"names":[],"mappings":"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"}
|