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,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import React from 'react';
|
|
8
|
-
import { Text, Box } from 'ink';
|
|
9
|
-
import { Colors } from '../colors.js';
|
|
10
|
-
import { RenderInline, getPlainTextLength } from './InlineMarkdownRenderer.js';
|
|
11
|
-
|
|
12
|
-
interface TableRendererProps {
|
|
13
|
-
headers: string[];
|
|
14
|
-
rows: string[][];
|
|
15
|
-
terminalWidth: number;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Custom table renderer for markdown tables
|
|
20
|
-
* We implement our own instead of using ink-table due to module compatibility issues
|
|
21
|
-
*/
|
|
22
|
-
export const TableRenderer: React.FC<TableRendererProps> = ({
|
|
23
|
-
headers,
|
|
24
|
-
rows,
|
|
25
|
-
terminalWidth,
|
|
26
|
-
}) => {
|
|
27
|
-
// Calculate column widths using actual display width after markdown processing
|
|
28
|
-
const columnWidths = headers.map((header, index) => {
|
|
29
|
-
const headerWidth = getPlainTextLength(header);
|
|
30
|
-
const maxRowWidth = Math.max(
|
|
31
|
-
...rows.map((row) => getPlainTextLength(row[index] || '')),
|
|
32
|
-
);
|
|
33
|
-
return Math.max(headerWidth, maxRowWidth) + 2; // Add padding
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
// Ensure table fits within terminal width
|
|
37
|
-
const totalWidth = columnWidths.reduce((sum, width) => sum + width + 1, 1);
|
|
38
|
-
const scaleFactor =
|
|
39
|
-
totalWidth > terminalWidth ? terminalWidth / totalWidth : 1;
|
|
40
|
-
const adjustedWidths = columnWidths.map((width) =>
|
|
41
|
-
Math.floor(width * scaleFactor),
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
// Helper function to render a cell with proper width
|
|
45
|
-
const renderCell = (
|
|
46
|
-
content: string,
|
|
47
|
-
width: number,
|
|
48
|
-
isHeader = false,
|
|
49
|
-
): React.ReactNode => {
|
|
50
|
-
const contentWidth = Math.max(0, width - 2);
|
|
51
|
-
const displayWidth = getPlainTextLength(content);
|
|
52
|
-
|
|
53
|
-
let cellContent = content;
|
|
54
|
-
if (displayWidth > contentWidth) {
|
|
55
|
-
if (contentWidth <= 3) {
|
|
56
|
-
// Just truncate by character count
|
|
57
|
-
cellContent = content.substring(
|
|
58
|
-
0,
|
|
59
|
-
Math.min(content.length, contentWidth),
|
|
60
|
-
);
|
|
61
|
-
} else {
|
|
62
|
-
// Truncate preserving markdown formatting using binary search
|
|
63
|
-
let left = 0;
|
|
64
|
-
let right = content.length;
|
|
65
|
-
let bestTruncated = content;
|
|
66
|
-
|
|
67
|
-
// Binary search to find the optimal truncation point
|
|
68
|
-
while (left <= right) {
|
|
69
|
-
const mid = Math.floor((left + right) / 2);
|
|
70
|
-
const candidate = content.substring(0, mid);
|
|
71
|
-
const candidateWidth = getPlainTextLength(candidate);
|
|
72
|
-
|
|
73
|
-
if (candidateWidth <= contentWidth - 3) {
|
|
74
|
-
bestTruncated = candidate;
|
|
75
|
-
left = mid + 1;
|
|
76
|
-
} else {
|
|
77
|
-
right = mid - 1;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
cellContent = bestTruncated + '...';
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Calculate exact padding needed
|
|
86
|
-
const actualDisplayWidth = getPlainTextLength(cellContent);
|
|
87
|
-
const paddingNeeded = Math.max(0, contentWidth - actualDisplayWidth);
|
|
88
|
-
|
|
89
|
-
return (
|
|
90
|
-
<Text>
|
|
91
|
-
{isHeader ? (
|
|
92
|
-
<Text bold color={Colors.AccentCyan}>
|
|
93
|
-
<RenderInline text={cellContent} />
|
|
94
|
-
</Text>
|
|
95
|
-
) : (
|
|
96
|
-
<RenderInline text={cellContent} />
|
|
97
|
-
)}
|
|
98
|
-
{' '.repeat(paddingNeeded)}
|
|
99
|
-
</Text>
|
|
100
|
-
);
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
// Helper function to render border
|
|
104
|
-
const renderBorder = (type: 'top' | 'middle' | 'bottom'): React.ReactNode => {
|
|
105
|
-
const chars = {
|
|
106
|
-
top: { left: '┌', middle: '┬', right: '┐', horizontal: '─' },
|
|
107
|
-
middle: { left: '├', middle: '┼', right: '┤', horizontal: '─' },
|
|
108
|
-
bottom: { left: '└', middle: '┴', right: '┘', horizontal: '─' },
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
const char = chars[type];
|
|
112
|
-
const borderParts = adjustedWidths.map((w) => char.horizontal.repeat(w));
|
|
113
|
-
const border = char.left + borderParts.join(char.middle) + char.right;
|
|
114
|
-
|
|
115
|
-
return <Text>{border}</Text>;
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
// Helper function to render a table row
|
|
119
|
-
const renderRow = (cells: string[], isHeader = false): React.ReactNode => {
|
|
120
|
-
const renderedCells = cells.map((cell, index) => {
|
|
121
|
-
const width = adjustedWidths[index] || 0;
|
|
122
|
-
return renderCell(cell || '', width, isHeader);
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
return (
|
|
126
|
-
<Text>
|
|
127
|
-
│{' '}
|
|
128
|
-
{renderedCells.map((cell, index) => (
|
|
129
|
-
<React.Fragment key={index}>
|
|
130
|
-
{cell}
|
|
131
|
-
{index < renderedCells.length - 1 ? ' │ ' : ''}
|
|
132
|
-
</React.Fragment>
|
|
133
|
-
))}{' '}
|
|
134
|
-
│
|
|
135
|
-
</Text>
|
|
136
|
-
);
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
return (
|
|
140
|
-
<Box flexDirection="column" marginY={1}>
|
|
141
|
-
{/* Top border */}
|
|
142
|
-
{renderBorder('top')}
|
|
143
|
-
|
|
144
|
-
{/* Header row */}
|
|
145
|
-
{renderRow(headers, true)}
|
|
146
|
-
|
|
147
|
-
{/* Middle border */}
|
|
148
|
-
{renderBorder('middle')}
|
|
149
|
-
|
|
150
|
-
{/* Data rows */}
|
|
151
|
-
{rows.map((row, index) => (
|
|
152
|
-
<React.Fragment key={index}>{renderRow(row)}</React.Fragment>
|
|
153
|
-
))}
|
|
154
|
-
|
|
155
|
-
{/* Bottom border */}
|
|
156
|
-
{renderBorder('bottom')}
|
|
157
|
-
</Box>
|
|
158
|
-
);
|
|
159
|
-
};
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
-
|
|
3
|
-
exports[`<MarkdownDisplay /> > correctly parses a mix of markdown elements 1`] = `
|
|
4
|
-
"Main Title
|
|
5
|
-
|
|
6
|
-
Here is a paragraph.
|
|
7
|
-
|
|
8
|
-
- List item 1
|
|
9
|
-
- List item 2
|
|
10
|
-
|
|
11
|
-
1 some code
|
|
12
|
-
|
|
13
|
-
Another paragraph.
|
|
14
|
-
"
|
|
15
|
-
`;
|
|
16
|
-
|
|
17
|
-
exports[`<MarkdownDisplay /> > handles a table at the end of the input 1`] = `
|
|
18
|
-
"Some text before.
|
|
19
|
-
| A | B |
|
|
20
|
-
|---|
|
|
21
|
-
| 1 | 2 |"
|
|
22
|
-
`;
|
|
23
|
-
|
|
24
|
-
exports[`<MarkdownDisplay /> > handles unclosed (pending) code blocks 1`] = `" 1 let y = 2;"`;
|
|
25
|
-
|
|
26
|
-
exports[`<MarkdownDisplay /> > hides line numbers in code blocks when showLineNumbers is false 1`] = `" const x = 1;"`;
|
|
27
|
-
|
|
28
|
-
exports[`<MarkdownDisplay /> > inserts a single space between paragraphs 1`] = `
|
|
29
|
-
"Paragraph 1.
|
|
30
|
-
|
|
31
|
-
Paragraph 2."
|
|
32
|
-
`;
|
|
33
|
-
|
|
34
|
-
exports[`<MarkdownDisplay /> > renders a fenced code block with a language 1`] = `
|
|
35
|
-
" 1 const x = 1;
|
|
36
|
-
2 console.log(x);"
|
|
37
|
-
`;
|
|
38
|
-
|
|
39
|
-
exports[`<MarkdownDisplay /> > renders a fenced code block without a language 1`] = `" 1 plain text"`;
|
|
40
|
-
|
|
41
|
-
exports[`<MarkdownDisplay /> > renders a simple paragraph 1`] = `"Hello, world."`;
|
|
42
|
-
|
|
43
|
-
exports[`<MarkdownDisplay /> > renders headers with correct levels 1`] = `
|
|
44
|
-
"Header 1
|
|
45
|
-
Header 2
|
|
46
|
-
Header 3
|
|
47
|
-
Header 4
|
|
48
|
-
"
|
|
49
|
-
`;
|
|
50
|
-
|
|
51
|
-
exports[`<MarkdownDisplay /> > renders horizontal rules 1`] = `
|
|
52
|
-
"Hello
|
|
53
|
-
---
|
|
54
|
-
World
|
|
55
|
-
---
|
|
56
|
-
Test
|
|
57
|
-
"
|
|
58
|
-
`;
|
|
59
|
-
|
|
60
|
-
exports[`<MarkdownDisplay /> > renders nested unordered lists 1`] = `
|
|
61
|
-
" * Level 1
|
|
62
|
-
* Level 2
|
|
63
|
-
* Level 3
|
|
64
|
-
"
|
|
65
|
-
`;
|
|
66
|
-
|
|
67
|
-
exports[`<MarkdownDisplay /> > renders nothing for empty text 1`] = `""`;
|
|
68
|
-
|
|
69
|
-
exports[`<MarkdownDisplay /> > renders ordered lists 1`] = `
|
|
70
|
-
" 1. First item
|
|
71
|
-
2. Second item
|
|
72
|
-
"
|
|
73
|
-
`;
|
|
74
|
-
|
|
75
|
-
exports[`<MarkdownDisplay /> > renders tables correctly 1`] = `
|
|
76
|
-
"
|
|
77
|
-
┌──────────┬──────────┐
|
|
78
|
-
│ Header 1 │ Header 2 │
|
|
79
|
-
├──────────┼──────────┤
|
|
80
|
-
│ Cell 1 │ Cell 2 │
|
|
81
|
-
│ Cell 3 │ Cell 4 │
|
|
82
|
-
└──────────┴──────────┘
|
|
83
|
-
"
|
|
84
|
-
`;
|
|
85
|
-
|
|
86
|
-
exports[`<MarkdownDisplay /> > renders unordered lists with different markers 1`] = `
|
|
87
|
-
" - item A
|
|
88
|
-
* item B
|
|
89
|
-
+ item C
|
|
90
|
-
"
|
|
91
|
-
`;
|
|
92
|
-
|
|
93
|
-
exports[`<MarkdownDisplay /> > shows line numbers in code blocks by default 1`] = `" 1 const x = 1;"`;
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { describe, it, expect } from 'vitest';
|
|
8
|
-
import {
|
|
9
|
-
clipboardHasImage,
|
|
10
|
-
saveClipboardImage,
|
|
11
|
-
cleanupOldClipboardImages,
|
|
12
|
-
} from './clipboardUtils.js';
|
|
13
|
-
|
|
14
|
-
describe('clipboardUtils', () => {
|
|
15
|
-
describe('clipboardHasImage', () => {
|
|
16
|
-
it('should return false on non-macOS platforms', async () => {
|
|
17
|
-
if (process.platform !== 'darwin') {
|
|
18
|
-
const result = await clipboardHasImage();
|
|
19
|
-
expect(result).toBe(false);
|
|
20
|
-
} else {
|
|
21
|
-
// Skip on macOS as it would require actual clipboard state
|
|
22
|
-
expect(true).toBe(true);
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('should return boolean on macOS', async () => {
|
|
27
|
-
if (process.platform === 'darwin') {
|
|
28
|
-
const result = await clipboardHasImage();
|
|
29
|
-
expect(typeof result).toBe('boolean');
|
|
30
|
-
} else {
|
|
31
|
-
// Skip on non-macOS
|
|
32
|
-
expect(true).toBe(true);
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
describe('saveClipboardImage', () => {
|
|
38
|
-
it('should return null on non-macOS platforms', async () => {
|
|
39
|
-
if (process.platform !== 'darwin') {
|
|
40
|
-
const result = await saveClipboardImage();
|
|
41
|
-
expect(result).toBe(null);
|
|
42
|
-
} else {
|
|
43
|
-
// Skip on macOS
|
|
44
|
-
expect(true).toBe(true);
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('should handle errors gracefully', async () => {
|
|
49
|
-
// Test with invalid directory (should not throw)
|
|
50
|
-
const result = await saveClipboardImage(
|
|
51
|
-
'/invalid/path/that/does/not/exist',
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
if (process.platform === 'darwin') {
|
|
55
|
-
// On macOS, might return null due to various errors
|
|
56
|
-
expect(result === null || typeof result === 'string').toBe(true);
|
|
57
|
-
} else {
|
|
58
|
-
// On other platforms, should always return null
|
|
59
|
-
expect(result).toBe(null);
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
describe('cleanupOldClipboardImages', () => {
|
|
65
|
-
it('should not throw errors', async () => {
|
|
66
|
-
// Should handle missing directories gracefully
|
|
67
|
-
await expect(
|
|
68
|
-
cleanupOldClipboardImages('/path/that/does/not/exist'),
|
|
69
|
-
).resolves.not.toThrow();
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('should complete without errors on valid directory', async () => {
|
|
73
|
-
await expect(cleanupOldClipboardImages('.')).resolves.not.toThrow();
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
});
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { exec } from 'child_process';
|
|
8
|
-
import { promisify } from 'util';
|
|
9
|
-
import * as fs from 'fs/promises';
|
|
10
|
-
import * as path from 'path';
|
|
11
|
-
|
|
12
|
-
const execAsync = promisify(exec);
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Checks if the system clipboard contains an image (macOS only for now)
|
|
16
|
-
* @returns true if clipboard contains an image
|
|
17
|
-
*/
|
|
18
|
-
export async function clipboardHasImage(): Promise<boolean> {
|
|
19
|
-
if (process.platform !== 'darwin') {
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
try {
|
|
24
|
-
// Use osascript to check clipboard type
|
|
25
|
-
const { stdout } = await execAsync(
|
|
26
|
-
`osascript -e 'clipboard info' 2>/dev/null | grep -qE "«class PNGf»|TIFF picture|JPEG picture|GIF picture|«class JPEG»|«class TIFF»" && echo "true" || echo "false"`,
|
|
27
|
-
{ shell: '/bin/bash' },
|
|
28
|
-
);
|
|
29
|
-
return stdout.trim() === 'true';
|
|
30
|
-
} catch {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Saves the image from clipboard to a temporary file (macOS only for now)
|
|
37
|
-
* @param targetDir The target directory to create temp files within
|
|
38
|
-
* @returns The path to the saved image file, or null if no image or error
|
|
39
|
-
*/
|
|
40
|
-
export async function saveClipboardImage(
|
|
41
|
-
targetDir?: string,
|
|
42
|
-
): Promise<string | null> {
|
|
43
|
-
if (process.platform !== 'darwin') {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
try {
|
|
48
|
-
// Create a temporary directory for clipboard images within the target directory
|
|
49
|
-
// This avoids security restrictions on paths outside the target directory
|
|
50
|
-
const baseDir = targetDir || process.cwd();
|
|
51
|
-
const tempDir = path.join(baseDir, '.gemini-clipboard');
|
|
52
|
-
await fs.mkdir(tempDir, { recursive: true });
|
|
53
|
-
|
|
54
|
-
// Generate a unique filename with timestamp
|
|
55
|
-
const timestamp = new Date().getTime();
|
|
56
|
-
|
|
57
|
-
// Try different image formats in order of preference
|
|
58
|
-
const formats = [
|
|
59
|
-
{ class: 'PNGf', extension: 'png' },
|
|
60
|
-
{ class: 'JPEG', extension: 'jpg' },
|
|
61
|
-
{ class: 'TIFF', extension: 'tiff' },
|
|
62
|
-
{ class: 'GIFf', extension: 'gif' },
|
|
63
|
-
];
|
|
64
|
-
|
|
65
|
-
for (const format of formats) {
|
|
66
|
-
const tempFilePath = path.join(
|
|
67
|
-
tempDir,
|
|
68
|
-
`clipboard-${timestamp}.${format.extension}`,
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
// Try to save clipboard as this format
|
|
72
|
-
const script = `
|
|
73
|
-
try
|
|
74
|
-
set imageData to the clipboard as «class ${format.class}»
|
|
75
|
-
set fileRef to open for access POSIX file "${tempFilePath}" with write permission
|
|
76
|
-
write imageData to fileRef
|
|
77
|
-
close access fileRef
|
|
78
|
-
return "success"
|
|
79
|
-
on error errMsg
|
|
80
|
-
try
|
|
81
|
-
close access POSIX file "${tempFilePath}"
|
|
82
|
-
end try
|
|
83
|
-
return "error"
|
|
84
|
-
end try
|
|
85
|
-
`;
|
|
86
|
-
|
|
87
|
-
const { stdout } = await execAsync(`osascript -e '${script}'`);
|
|
88
|
-
|
|
89
|
-
if (stdout.trim() === 'success') {
|
|
90
|
-
// Verify the file was created and has content
|
|
91
|
-
try {
|
|
92
|
-
const stats = await fs.stat(tempFilePath);
|
|
93
|
-
if (stats.size > 0) {
|
|
94
|
-
return tempFilePath;
|
|
95
|
-
}
|
|
96
|
-
} catch {
|
|
97
|
-
// File doesn't exist, continue to next format
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Clean up failed attempt
|
|
102
|
-
try {
|
|
103
|
-
await fs.unlink(tempFilePath);
|
|
104
|
-
} catch {
|
|
105
|
-
// Ignore cleanup errors
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// No format worked
|
|
110
|
-
return null;
|
|
111
|
-
} catch (error) {
|
|
112
|
-
console.error('Error saving clipboard image:', error);
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Cleans up old temporary clipboard image files
|
|
119
|
-
* Removes files older than 1 hour
|
|
120
|
-
* @param targetDir The target directory where temp files are stored
|
|
121
|
-
*/
|
|
122
|
-
export async function cleanupOldClipboardImages(
|
|
123
|
-
targetDir?: string,
|
|
124
|
-
): Promise<void> {
|
|
125
|
-
try {
|
|
126
|
-
const baseDir = targetDir || process.cwd();
|
|
127
|
-
const tempDir = path.join(baseDir, '.gemini-clipboard');
|
|
128
|
-
const files = await fs.readdir(tempDir);
|
|
129
|
-
const oneHourAgo = Date.now() - 60 * 60 * 1000;
|
|
130
|
-
|
|
131
|
-
for (const file of files) {
|
|
132
|
-
if (
|
|
133
|
-
file.startsWith('clipboard-') &&
|
|
134
|
-
(file.endsWith('.png') ||
|
|
135
|
-
file.endsWith('.jpg') ||
|
|
136
|
-
file.endsWith('.tiff') ||
|
|
137
|
-
file.endsWith('.gif'))
|
|
138
|
-
) {
|
|
139
|
-
const filePath = path.join(tempDir, file);
|
|
140
|
-
const stats = await fs.stat(filePath);
|
|
141
|
-
if (stats.mtimeMs < oneHourAgo) {
|
|
142
|
-
await fs.unlink(filePath);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
} catch {
|
|
147
|
-
// Ignore errors in cleanup
|
|
148
|
-
}
|
|
149
|
-
}
|