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,315 +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, afterEach } from 'vitest';
|
|
8
|
-
import { getInstallationInfo, PackageManager } from './installationInfo.js';
|
|
9
|
-
import * as fs from 'fs';
|
|
10
|
-
import * as path from 'path';
|
|
11
|
-
import * as childProcess from 'child_process';
|
|
12
|
-
import { isGitRepository } from 'fss-link-core';
|
|
13
|
-
|
|
14
|
-
vi.mock('fss-link-core', () => ({
|
|
15
|
-
isGitRepository: vi.fn(),
|
|
16
|
-
}));
|
|
17
|
-
|
|
18
|
-
vi.mock('fs', async (importOriginal) => {
|
|
19
|
-
const actualFs = await importOriginal<typeof fs>();
|
|
20
|
-
return {
|
|
21
|
-
...actualFs,
|
|
22
|
-
realpathSync: vi.fn(),
|
|
23
|
-
existsSync: vi.fn(),
|
|
24
|
-
};
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
vi.mock('child_process', async (importOriginal) => {
|
|
28
|
-
const actual = await importOriginal<typeof import('child_process')>();
|
|
29
|
-
return {
|
|
30
|
-
...actual,
|
|
31
|
-
execSync: vi.fn(),
|
|
32
|
-
};
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
const mockedIsGitRepository = vi.mocked(isGitRepository);
|
|
36
|
-
const mockedRealPathSync = vi.mocked(fs.realpathSync);
|
|
37
|
-
const mockedExistsSync = vi.mocked(fs.existsSync);
|
|
38
|
-
const mockedExecSync = vi.mocked(childProcess.execSync);
|
|
39
|
-
|
|
40
|
-
describe('getInstallationInfo', () => {
|
|
41
|
-
const projectRoot = '/path/to/project';
|
|
42
|
-
let originalArgv: string[];
|
|
43
|
-
|
|
44
|
-
beforeEach(() => {
|
|
45
|
-
vi.resetAllMocks();
|
|
46
|
-
originalArgv = [...process.argv];
|
|
47
|
-
// Mock process.cwd() for isGitRepository
|
|
48
|
-
vi.spyOn(process, 'cwd').mockReturnValue(projectRoot);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
afterEach(() => {
|
|
52
|
-
process.argv = originalArgv;
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('should return UNKNOWN when cliPath is not available', () => {
|
|
56
|
-
process.argv[1] = '';
|
|
57
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
58
|
-
expect(info.packageManager).toBe(PackageManager.UNKNOWN);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('should return UNKNOWN and log error if realpathSync fails', () => {
|
|
62
|
-
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
63
|
-
process.argv[1] = '/path/to/cli';
|
|
64
|
-
const error = new Error('realpath failed');
|
|
65
|
-
mockedRealPathSync.mockImplementation(() => {
|
|
66
|
-
throw error;
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
70
|
-
|
|
71
|
-
expect(info.packageManager).toBe(PackageManager.UNKNOWN);
|
|
72
|
-
expect(consoleSpy).toHaveBeenCalledWith(error);
|
|
73
|
-
consoleSpy.mockRestore();
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it('should detect running from a local git clone', () => {
|
|
77
|
-
process.argv[1] = `${projectRoot}/packages/cli/dist/index.js`;
|
|
78
|
-
mockedRealPathSync.mockReturnValue(
|
|
79
|
-
`${projectRoot}/packages/cli/dist/index.js`,
|
|
80
|
-
);
|
|
81
|
-
mockedIsGitRepository.mockReturnValue(true);
|
|
82
|
-
|
|
83
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
84
|
-
|
|
85
|
-
expect(info.packageManager).toBe(PackageManager.UNKNOWN);
|
|
86
|
-
expect(info.isGlobal).toBe(false);
|
|
87
|
-
expect(info.updateMessage).toBe(
|
|
88
|
-
'Running from a local git clone. Please update with "git pull".',
|
|
89
|
-
);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('should detect running via npx', () => {
|
|
93
|
-
const npxPath = `/Users/test/.npm/_npx/12345/bin/gemini`;
|
|
94
|
-
process.argv[1] = npxPath;
|
|
95
|
-
mockedRealPathSync.mockReturnValue(npxPath);
|
|
96
|
-
|
|
97
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
98
|
-
|
|
99
|
-
expect(info.packageManager).toBe(PackageManager.NPX);
|
|
100
|
-
expect(info.isGlobal).toBe(false);
|
|
101
|
-
expect(info.updateMessage).toBe('Running via npx, update not applicable.');
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('should detect running via pnpx', () => {
|
|
105
|
-
const pnpxPath = `/Users/test/.pnpm/_pnpx/12345/bin/gemini`;
|
|
106
|
-
process.argv[1] = pnpxPath;
|
|
107
|
-
mockedRealPathSync.mockReturnValue(pnpxPath);
|
|
108
|
-
|
|
109
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
110
|
-
|
|
111
|
-
expect(info.packageManager).toBe(PackageManager.PNPX);
|
|
112
|
-
expect(info.isGlobal).toBe(false);
|
|
113
|
-
expect(info.updateMessage).toBe('Running via pnpx, update not applicable.');
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it('should detect running via bunx', () => {
|
|
117
|
-
const bunxPath = `/Users/test/.bun/install/cache/12345/bin/gemini`;
|
|
118
|
-
process.argv[1] = bunxPath;
|
|
119
|
-
mockedRealPathSync.mockReturnValue(bunxPath);
|
|
120
|
-
mockedExecSync.mockImplementation(() => {
|
|
121
|
-
throw new Error('Command failed');
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
125
|
-
|
|
126
|
-
expect(info.packageManager).toBe(PackageManager.BUNX);
|
|
127
|
-
expect(info.isGlobal).toBe(false);
|
|
128
|
-
expect(info.updateMessage).toBe('Running via bunx, update not applicable.');
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it('should detect Homebrew installation via execSync', () => {
|
|
132
|
-
Object.defineProperty(process, 'platform', {
|
|
133
|
-
value: 'darwin',
|
|
134
|
-
});
|
|
135
|
-
const cliPath = '/usr/local/bin/gemini';
|
|
136
|
-
process.argv[1] = cliPath;
|
|
137
|
-
mockedRealPathSync.mockReturnValue(cliPath);
|
|
138
|
-
mockedExecSync.mockReturnValue(Buffer.from('gemini-cli')); // Simulate successful command
|
|
139
|
-
|
|
140
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
141
|
-
|
|
142
|
-
expect(mockedExecSync).toHaveBeenCalledWith(
|
|
143
|
-
'brew list -1 | grep -q "^fss-link$"',
|
|
144
|
-
{ stdio: 'ignore' },
|
|
145
|
-
);
|
|
146
|
-
expect(info.packageManager).toBe(PackageManager.HOMEBREW);
|
|
147
|
-
expect(info.isGlobal).toBe(true);
|
|
148
|
-
expect(info.updateMessage).toContain('brew upgrade');
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it('should fall through if brew command fails', () => {
|
|
152
|
-
Object.defineProperty(process, 'platform', {
|
|
153
|
-
value: 'darwin',
|
|
154
|
-
});
|
|
155
|
-
const cliPath = '/usr/local/bin/gemini';
|
|
156
|
-
process.argv[1] = cliPath;
|
|
157
|
-
mockedRealPathSync.mockReturnValue(cliPath);
|
|
158
|
-
mockedExecSync.mockImplementation(() => {
|
|
159
|
-
throw new Error('Command failed');
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
163
|
-
|
|
164
|
-
expect(mockedExecSync).toHaveBeenCalledWith(
|
|
165
|
-
'brew list -1 | grep -q "^fss-link$"',
|
|
166
|
-
{ stdio: 'ignore' },
|
|
167
|
-
);
|
|
168
|
-
// Should fall back to default global npm
|
|
169
|
-
expect(info.packageManager).toBe(PackageManager.NPM);
|
|
170
|
-
expect(info.isGlobal).toBe(true);
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it('should detect global pnpm installation', () => {
|
|
174
|
-
const pnpmPath = `/Users/test/.pnpm/global/5/node_modules/.pnpm/some-hash/node_modules/fss-link-core/dist/index.js`;
|
|
175
|
-
process.argv[1] = pnpmPath;
|
|
176
|
-
mockedRealPathSync.mockReturnValue(pnpmPath);
|
|
177
|
-
mockedExecSync.mockImplementation(() => {
|
|
178
|
-
throw new Error('Command failed');
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
182
|
-
expect(info.packageManager).toBe(PackageManager.PNPM);
|
|
183
|
-
expect(info.isGlobal).toBe(true);
|
|
184
|
-
expect(info.updateCommand).toBe('pnpm add -g fss-link-core@latest');
|
|
185
|
-
expect(info.updateMessage).toContain('Attempting to automatically update');
|
|
186
|
-
|
|
187
|
-
const infoDisabled = getInstallationInfo(projectRoot, true);
|
|
188
|
-
expect(infoDisabled.updateMessage).toContain('Please run pnpm add');
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
it('should detect global yarn installation', () => {
|
|
192
|
-
const yarnPath = `/Users/test/.yarn/global/node_modules/fss-link-core/dist/index.js`;
|
|
193
|
-
process.argv[1] = yarnPath;
|
|
194
|
-
mockedRealPathSync.mockReturnValue(yarnPath);
|
|
195
|
-
mockedExecSync.mockImplementation(() => {
|
|
196
|
-
throw new Error('Command failed');
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
200
|
-
expect(info.packageManager).toBe(PackageManager.YARN);
|
|
201
|
-
expect(info.isGlobal).toBe(true);
|
|
202
|
-
expect(info.updateCommand).toBe(
|
|
203
|
-
'yarn global add fss-link-core@latest',
|
|
204
|
-
);
|
|
205
|
-
expect(info.updateMessage).toContain('Attempting to automatically update');
|
|
206
|
-
|
|
207
|
-
const infoDisabled = getInstallationInfo(projectRoot, true);
|
|
208
|
-
expect(infoDisabled.updateMessage).toContain('Please run yarn global add');
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
it('should detect global bun installation', () => {
|
|
212
|
-
const bunPath = `/Users/test/.bun/bin/gemini`;
|
|
213
|
-
process.argv[1] = bunPath;
|
|
214
|
-
mockedRealPathSync.mockReturnValue(bunPath);
|
|
215
|
-
mockedExecSync.mockImplementation(() => {
|
|
216
|
-
throw new Error('Command failed');
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
220
|
-
expect(info.packageManager).toBe(PackageManager.BUN);
|
|
221
|
-
expect(info.isGlobal).toBe(true);
|
|
222
|
-
expect(info.updateCommand).toBe('bun add -g fss-link-core@latest');
|
|
223
|
-
expect(info.updateMessage).toContain('Attempting to automatically update');
|
|
224
|
-
|
|
225
|
-
const infoDisabled = getInstallationInfo(projectRoot, true);
|
|
226
|
-
expect(infoDisabled.updateMessage).toContain('Please run bun add');
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
it('should detect local installation and identify yarn from lockfile', () => {
|
|
230
|
-
const localPath = `${projectRoot}/node_modules/.bin/gemini`;
|
|
231
|
-
process.argv[1] = localPath;
|
|
232
|
-
mockedRealPathSync.mockReturnValue(localPath);
|
|
233
|
-
mockedExecSync.mockImplementation(() => {
|
|
234
|
-
throw new Error('Command failed');
|
|
235
|
-
});
|
|
236
|
-
mockedExistsSync.mockImplementation(
|
|
237
|
-
(p) => p === path.join(projectRoot, 'yarn.lock'),
|
|
238
|
-
);
|
|
239
|
-
|
|
240
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
241
|
-
|
|
242
|
-
expect(info.packageManager).toBe(PackageManager.YARN);
|
|
243
|
-
expect(info.isGlobal).toBe(false);
|
|
244
|
-
expect(info.updateMessage).toContain('Locally installed');
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
it('should detect local installation and identify pnpm from lockfile', () => {
|
|
248
|
-
const localPath = `${projectRoot}/node_modules/.bin/gemini`;
|
|
249
|
-
process.argv[1] = localPath;
|
|
250
|
-
mockedRealPathSync.mockReturnValue(localPath);
|
|
251
|
-
mockedExecSync.mockImplementation(() => {
|
|
252
|
-
throw new Error('Command failed');
|
|
253
|
-
});
|
|
254
|
-
mockedExistsSync.mockImplementation(
|
|
255
|
-
(p) => p === path.join(projectRoot, 'pnpm-lock.yaml'),
|
|
256
|
-
);
|
|
257
|
-
|
|
258
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
259
|
-
|
|
260
|
-
expect(info.packageManager).toBe(PackageManager.PNPM);
|
|
261
|
-
expect(info.isGlobal).toBe(false);
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
it('should detect local installation and identify bun from lockfile', () => {
|
|
265
|
-
const localPath = `${projectRoot}/node_modules/.bin/gemini`;
|
|
266
|
-
process.argv[1] = localPath;
|
|
267
|
-
mockedRealPathSync.mockReturnValue(localPath);
|
|
268
|
-
mockedExecSync.mockImplementation(() => {
|
|
269
|
-
throw new Error('Command failed');
|
|
270
|
-
});
|
|
271
|
-
mockedExistsSync.mockImplementation(
|
|
272
|
-
(p) => p === path.join(projectRoot, 'bun.lockb'),
|
|
273
|
-
);
|
|
274
|
-
|
|
275
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
276
|
-
|
|
277
|
-
expect(info.packageManager).toBe(PackageManager.BUN);
|
|
278
|
-
expect(info.isGlobal).toBe(false);
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
it('should default to local npm installation if no lockfile is found', () => {
|
|
282
|
-
const localPath = `${projectRoot}/node_modules/.bin/gemini`;
|
|
283
|
-
process.argv[1] = localPath;
|
|
284
|
-
mockedRealPathSync.mockReturnValue(localPath);
|
|
285
|
-
mockedExecSync.mockImplementation(() => {
|
|
286
|
-
throw new Error('Command failed');
|
|
287
|
-
});
|
|
288
|
-
mockedExistsSync.mockReturnValue(false); // No lockfiles
|
|
289
|
-
|
|
290
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
291
|
-
|
|
292
|
-
expect(info.packageManager).toBe(PackageManager.NPM);
|
|
293
|
-
expect(info.isGlobal).toBe(false);
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
it('should default to global npm installation for unrecognized paths', () => {
|
|
297
|
-
const globalPath = `/usr/local/bin/gemini`;
|
|
298
|
-
process.argv[1] = globalPath;
|
|
299
|
-
mockedRealPathSync.mockReturnValue(globalPath);
|
|
300
|
-
mockedExecSync.mockImplementation(() => {
|
|
301
|
-
throw new Error('Command failed');
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
const info = getInstallationInfo(projectRoot, false);
|
|
305
|
-
expect(info.packageManager).toBe(PackageManager.NPM);
|
|
306
|
-
expect(info.isGlobal).toBe(true);
|
|
307
|
-
expect(info.updateCommand).toBe(
|
|
308
|
-
'npm install -g fss-link-core@latest',
|
|
309
|
-
);
|
|
310
|
-
expect(info.updateMessage).toContain('Attempting to automatically update');
|
|
311
|
-
|
|
312
|
-
const infoDisabled = getInstallationInfo(projectRoot, true);
|
|
313
|
-
expect(infoDisabled.updateMessage).toContain('Please run npm install');
|
|
314
|
-
});
|
|
315
|
-
});
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { isGitRepository } from 'fss-link-core';
|
|
8
|
-
import * as fs from 'fs';
|
|
9
|
-
import * as path from 'path';
|
|
10
|
-
import * as childProcess from 'child_process';
|
|
11
|
-
|
|
12
|
-
export enum PackageManager {
|
|
13
|
-
NPM = 'npm',
|
|
14
|
-
YARN = 'yarn',
|
|
15
|
-
PNPM = 'pnpm',
|
|
16
|
-
PNPX = 'pnpx',
|
|
17
|
-
BUN = 'bun',
|
|
18
|
-
BUNX = 'bunx',
|
|
19
|
-
HOMEBREW = 'homebrew',
|
|
20
|
-
NPX = 'npx',
|
|
21
|
-
UNKNOWN = 'unknown',
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface InstallationInfo {
|
|
25
|
-
packageManager: PackageManager;
|
|
26
|
-
isGlobal: boolean;
|
|
27
|
-
updateCommand?: string;
|
|
28
|
-
updateMessage?: string;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function getInstallationInfo(
|
|
32
|
-
projectRoot: string,
|
|
33
|
-
isAutoUpdateDisabled: boolean,
|
|
34
|
-
): InstallationInfo {
|
|
35
|
-
const cliPath = process.argv[1];
|
|
36
|
-
if (!cliPath) {
|
|
37
|
-
return { packageManager: PackageManager.UNKNOWN, isGlobal: false };
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
try {
|
|
41
|
-
// Normalize path separators to forward slashes for consistent matching.
|
|
42
|
-
const realPath = fs.realpathSync(cliPath).replace(/\\/g, '/');
|
|
43
|
-
const normalizedProjectRoot = projectRoot?.replace(/\\/g, '/');
|
|
44
|
-
const isGit = isGitRepository(process.cwd());
|
|
45
|
-
|
|
46
|
-
// Check for local git clone first
|
|
47
|
-
if (
|
|
48
|
-
isGit &&
|
|
49
|
-
normalizedProjectRoot &&
|
|
50
|
-
realPath.startsWith(normalizedProjectRoot) &&
|
|
51
|
-
!realPath.includes('/node_modules/')
|
|
52
|
-
) {
|
|
53
|
-
return {
|
|
54
|
-
packageManager: PackageManager.UNKNOWN, // Not managed by a package manager in this sense
|
|
55
|
-
isGlobal: false,
|
|
56
|
-
updateMessage:
|
|
57
|
-
'Running from a local git clone. Please update with "git pull".',
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Check for npx/pnpx
|
|
62
|
-
if (realPath.includes('/.npm/_npx') || realPath.includes('/npm/_npx')) {
|
|
63
|
-
return {
|
|
64
|
-
packageManager: PackageManager.NPX,
|
|
65
|
-
isGlobal: false,
|
|
66
|
-
updateMessage: 'Running via npx, update not applicable.',
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
if (realPath.includes('/.pnpm/_pnpx')) {
|
|
70
|
-
return {
|
|
71
|
-
packageManager: PackageManager.PNPX,
|
|
72
|
-
isGlobal: false,
|
|
73
|
-
updateMessage: 'Running via pnpx, update not applicable.',
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Check for Homebrew
|
|
78
|
-
if (process.platform === 'darwin') {
|
|
79
|
-
try {
|
|
80
|
-
// We do not support homebrew for now, keep forward compatibility for future use
|
|
81
|
-
childProcess.execSync('brew list -1 | grep -q "^fss-link$"', {
|
|
82
|
-
stdio: 'ignore',
|
|
83
|
-
});
|
|
84
|
-
return {
|
|
85
|
-
packageManager: PackageManager.HOMEBREW,
|
|
86
|
-
isGlobal: true,
|
|
87
|
-
updateMessage:
|
|
88
|
-
'Installed via Homebrew. Please update with "brew upgrade".',
|
|
89
|
-
};
|
|
90
|
-
} catch (_error) {
|
|
91
|
-
// continue to the next check
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Check for pnpm
|
|
96
|
-
if (realPath.includes('/.pnpm/global')) {
|
|
97
|
-
const updateCommand = 'pnpm add -g fss-link@latest';
|
|
98
|
-
return {
|
|
99
|
-
packageManager: PackageManager.PNPM,
|
|
100
|
-
isGlobal: true,
|
|
101
|
-
updateCommand,
|
|
102
|
-
updateMessage: isAutoUpdateDisabled
|
|
103
|
-
? `Please run ${updateCommand} to update`
|
|
104
|
-
: 'Installed with pnpm. Attempting to automatically update now...',
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Check for yarn
|
|
109
|
-
if (realPath.includes('/.yarn/global')) {
|
|
110
|
-
const updateCommand = 'yarn global add fss-link@latest';
|
|
111
|
-
return {
|
|
112
|
-
packageManager: PackageManager.YARN,
|
|
113
|
-
isGlobal: true,
|
|
114
|
-
updateCommand,
|
|
115
|
-
updateMessage: isAutoUpdateDisabled
|
|
116
|
-
? `Please run ${updateCommand} to update`
|
|
117
|
-
: 'Installed with yarn. Attempting to automatically update now...',
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Check for bun
|
|
122
|
-
if (realPath.includes('/.bun/install/cache')) {
|
|
123
|
-
return {
|
|
124
|
-
packageManager: PackageManager.BUNX,
|
|
125
|
-
isGlobal: false,
|
|
126
|
-
updateMessage: 'Running via bunx, update not applicable.',
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
if (realPath.includes('/.bun/bin')) {
|
|
130
|
-
const updateCommand = 'bun add -g fss-link@latest';
|
|
131
|
-
return {
|
|
132
|
-
packageManager: PackageManager.BUN,
|
|
133
|
-
isGlobal: true,
|
|
134
|
-
updateCommand,
|
|
135
|
-
updateMessage: isAutoUpdateDisabled
|
|
136
|
-
? `Please run ${updateCommand} to update`
|
|
137
|
-
: 'Installed with bun. Attempting to automatically update now...',
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Check for local install
|
|
142
|
-
if (
|
|
143
|
-
normalizedProjectRoot &&
|
|
144
|
-
realPath.startsWith(`${normalizedProjectRoot}/node_modules`)
|
|
145
|
-
) {
|
|
146
|
-
let pm = PackageManager.NPM;
|
|
147
|
-
if (fs.existsSync(path.join(projectRoot, 'yarn.lock'))) {
|
|
148
|
-
pm = PackageManager.YARN;
|
|
149
|
-
} else if (fs.existsSync(path.join(projectRoot, 'pnpm-lock.yaml'))) {
|
|
150
|
-
pm = PackageManager.PNPM;
|
|
151
|
-
} else if (fs.existsSync(path.join(projectRoot, 'bun.lockb'))) {
|
|
152
|
-
pm = PackageManager.BUN;
|
|
153
|
-
}
|
|
154
|
-
return {
|
|
155
|
-
packageManager: pm,
|
|
156
|
-
isGlobal: false,
|
|
157
|
-
updateMessage:
|
|
158
|
-
"Locally installed. Please update via your project's package.json.",
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Assume global npm
|
|
163
|
-
const updateCommand = 'npm install -g fss-link@latest';
|
|
164
|
-
return {
|
|
165
|
-
packageManager: PackageManager.NPM,
|
|
166
|
-
isGlobal: true,
|
|
167
|
-
updateCommand,
|
|
168
|
-
updateMessage: isAutoUpdateDisabled
|
|
169
|
-
? `Please run ${updateCommand} to update`
|
|
170
|
-
: 'Installed with npm. Attempting to automatically update now...',
|
|
171
|
-
};
|
|
172
|
-
} catch (error) {
|
|
173
|
-
console.log(error);
|
|
174
|
-
return { packageManager: PackageManager.UNKNOWN, isGlobal: false };
|
|
175
|
-
}
|
|
176
|
-
}
|
package/dist/utils/package.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
readPackageUp,
|
|
9
|
-
type PackageJson as BasePackageJson,
|
|
10
|
-
} from 'read-package-up';
|
|
11
|
-
import { fileURLToPath } from 'url';
|
|
12
|
-
import path from 'path';
|
|
13
|
-
|
|
14
|
-
export type PackageJson = BasePackageJson & {
|
|
15
|
-
config?: {
|
|
16
|
-
sandboxImageUri?: string;
|
|
17
|
-
};
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
21
|
-
const __dirname = path.dirname(__filename);
|
|
22
|
-
|
|
23
|
-
let packageJson: PackageJson | undefined;
|
|
24
|
-
|
|
25
|
-
export async function getPackageJson(): Promise<PackageJson | undefined> {
|
|
26
|
-
if (packageJson) {
|
|
27
|
-
return packageJson;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const result = await readPackageUp({ cwd: __dirname });
|
|
31
|
-
if (!result) {
|
|
32
|
-
// TODO: Maybe bubble this up as an error.
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
packageJson = result.packageJson;
|
|
37
|
-
return packageJson;
|
|
38
|
-
}
|
package/dist/utils/readStdin.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export async function readStdin(): Promise<string> {
|
|
8
|
-
const MAX_STDIN_SIZE = 8 * 1024 * 1024; // 8MB
|
|
9
|
-
return new Promise((resolve, reject) => {
|
|
10
|
-
let data = '';
|
|
11
|
-
let totalSize = 0;
|
|
12
|
-
process.stdin.setEncoding('utf8');
|
|
13
|
-
|
|
14
|
-
const onReadable = () => {
|
|
15
|
-
let chunk;
|
|
16
|
-
while ((chunk = process.stdin.read()) !== null) {
|
|
17
|
-
if (totalSize + chunk.length > MAX_STDIN_SIZE) {
|
|
18
|
-
const remainingSize = MAX_STDIN_SIZE - totalSize;
|
|
19
|
-
data += chunk.slice(0, remainingSize);
|
|
20
|
-
console.warn(
|
|
21
|
-
`Warning: stdin input truncated to ${MAX_STDIN_SIZE} bytes.`,
|
|
22
|
-
);
|
|
23
|
-
process.stdin.destroy(); // Stop reading further
|
|
24
|
-
break;
|
|
25
|
-
}
|
|
26
|
-
data += chunk;
|
|
27
|
-
totalSize += chunk.length;
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
const onEnd = () => {
|
|
32
|
-
cleanup();
|
|
33
|
-
resolve(data);
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const onError = (err: Error) => {
|
|
37
|
-
cleanup();
|
|
38
|
-
reject(err);
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const cleanup = () => {
|
|
42
|
-
process.stdin.removeListener('readable', onReadable);
|
|
43
|
-
process.stdin.removeListener('end', onEnd);
|
|
44
|
-
process.stdin.removeListener('error', onError);
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
process.stdin.on('readable', onReadable);
|
|
48
|
-
process.stdin.on('end', onEnd);
|
|
49
|
-
process.stdin.on('error', onError);
|
|
50
|
-
});
|
|
51
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import * as os from 'os';
|
|
8
|
-
import * as path from 'path';
|
|
9
|
-
|
|
10
|
-
export function resolvePath(p: string): string {
|
|
11
|
-
if (!p) {
|
|
12
|
-
return '';
|
|
13
|
-
}
|
|
14
|
-
let expandedPath = p;
|
|
15
|
-
if (p.toLowerCase().startsWith('%userprofile%')) {
|
|
16
|
-
expandedPath = os.homedir() + p.substring('%userprofile%'.length);
|
|
17
|
-
} else if (p === '~' || p.startsWith('~/')) {
|
|
18
|
-
expandedPath = os.homedir() + p.substring(1);
|
|
19
|
-
}
|
|
20
|
-
return path.normalize(expandedPath);
|
|
21
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
(version 1)
|
|
2
|
-
|
|
3
|
-
;; allow everything by default
|
|
4
|
-
(allow default)
|
|
5
|
-
|
|
6
|
-
;; deny all writes EXCEPT under specific paths
|
|
7
|
-
(deny file-write*)
|
|
8
|
-
(allow file-write*
|
|
9
|
-
(subpath (param "TARGET_DIR"))
|
|
10
|
-
(subpath (param "TMP_DIR"))
|
|
11
|
-
(subpath (param "CACHE_DIR"))
|
|
12
|
-
(subpath (string-append (param "HOME_DIR") "/.qwen"))
|
|
13
|
-
(subpath (string-append (param "HOME_DIR") "/.npm"))
|
|
14
|
-
(subpath (string-append (param "HOME_DIR") "/.cache"))
|
|
15
|
-
(subpath (string-append (param "HOME_DIR") "/.gitconfig"))
|
|
16
|
-
;; Allow writes to included directories from --include-directories
|
|
17
|
-
(subpath (param "INCLUDE_DIR_0"))
|
|
18
|
-
(subpath (param "INCLUDE_DIR_1"))
|
|
19
|
-
(subpath (param "INCLUDE_DIR_2"))
|
|
20
|
-
(subpath (param "INCLUDE_DIR_3"))
|
|
21
|
-
(subpath (param "INCLUDE_DIR_4"))
|
|
22
|
-
(literal "/dev/stdout")
|
|
23
|
-
(literal "/dev/stderr")
|
|
24
|
-
(literal "/dev/null")
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
;; deny all inbound network traffic EXCEPT on debugger port
|
|
28
|
-
(deny network-inbound)
|
|
29
|
-
(allow network-inbound (local ip "localhost:9229"))
|
|
30
|
-
|
|
31
|
-
;; deny all outbound network traffic
|
|
32
|
-
(deny network-outbound)
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
(version 1)
|
|
2
|
-
|
|
3
|
-
;; allow everything by default
|
|
4
|
-
(allow default)
|
|
5
|
-
|
|
6
|
-
;; deny all writes EXCEPT under specific paths
|
|
7
|
-
(deny file-write*)
|
|
8
|
-
(allow file-write*
|
|
9
|
-
(subpath (param "TARGET_DIR"))
|
|
10
|
-
(subpath (param "TMP_DIR"))
|
|
11
|
-
(subpath (param "CACHE_DIR"))
|
|
12
|
-
(subpath (string-append (param "HOME_DIR") "/.qwen"))
|
|
13
|
-
(subpath (string-append (param "HOME_DIR") "/.npm"))
|
|
14
|
-
(subpath (string-append (param "HOME_DIR") "/.cache"))
|
|
15
|
-
(subpath (string-append (param "HOME_DIR") "/.gitconfig"))
|
|
16
|
-
;; Allow writes to included directories from --include-directories
|
|
17
|
-
(subpath (param "INCLUDE_DIR_0"))
|
|
18
|
-
(subpath (param "INCLUDE_DIR_1"))
|
|
19
|
-
(subpath (param "INCLUDE_DIR_2"))
|
|
20
|
-
(subpath (param "INCLUDE_DIR_3"))
|
|
21
|
-
(subpath (param "INCLUDE_DIR_4"))
|
|
22
|
-
(literal "/dev/stdout")
|
|
23
|
-
(literal "/dev/stderr")
|
|
24
|
-
(literal "/dev/null")
|
|
25
|
-
)
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
(version 1)
|
|
2
|
-
|
|
3
|
-
;; allow everything by default
|
|
4
|
-
(allow default)
|
|
5
|
-
|
|
6
|
-
;; deny all writes EXCEPT under specific paths
|
|
7
|
-
(deny file-write*)
|
|
8
|
-
(allow file-write*
|
|
9
|
-
(subpath (param "TARGET_DIR"))
|
|
10
|
-
(subpath (param "TMP_DIR"))
|
|
11
|
-
(subpath (param "CACHE_DIR"))
|
|
12
|
-
(subpath (string-append (param "HOME_DIR") "/.qwen"))
|
|
13
|
-
(subpath (string-append (param "HOME_DIR") "/.npm"))
|
|
14
|
-
(subpath (string-append (param "HOME_DIR") "/.cache"))
|
|
15
|
-
(subpath (string-append (param "HOME_DIR") "/.gitconfig"))
|
|
16
|
-
;; Allow writes to included directories from --include-directories
|
|
17
|
-
(subpath (param "INCLUDE_DIR_0"))
|
|
18
|
-
(subpath (param "INCLUDE_DIR_1"))
|
|
19
|
-
(subpath (param "INCLUDE_DIR_2"))
|
|
20
|
-
(subpath (param "INCLUDE_DIR_3"))
|
|
21
|
-
(subpath (param "INCLUDE_DIR_4"))
|
|
22
|
-
(literal "/dev/stdout")
|
|
23
|
-
(literal "/dev/stderr")
|
|
24
|
-
(literal "/dev/null")
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
;; deny all inbound network traffic EXCEPT on debugger port
|
|
28
|
-
(deny network-inbound)
|
|
29
|
-
(allow network-inbound (local ip "localhost:9229"))
|
|
30
|
-
|
|
31
|
-
;; deny all outbound network traffic EXCEPT through proxy on localhost:8877
|
|
32
|
-
;; set `GEMINI_SANDBOX_PROXY_COMMAND=<command>` to run proxy alongside sandbox
|
|
33
|
-
;; proxy must listen on :::8877 (see docs/examples/proxy-script.md)
|
|
34
|
-
(deny network-outbound)
|
|
35
|
-
(allow network-outbound (remote tcp "localhost:8877"))
|
|
36
|
-
|
|
37
|
-
(allow network-bind (local ip "*:*"))
|