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,273 +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 { Box, Text } from 'ink';
|
|
9
|
-
import Gradient from 'ink-gradient';
|
|
10
|
-
import { theme } from '../semantic-colors.js';
|
|
11
|
-
import { formatDuration } from '../utils/formatters.js';
|
|
12
|
-
import { useSessionStats, ModelMetrics } from '../contexts/SessionContext.js';
|
|
13
|
-
import {
|
|
14
|
-
getStatusColor,
|
|
15
|
-
TOOL_SUCCESS_RATE_HIGH,
|
|
16
|
-
TOOL_SUCCESS_RATE_MEDIUM,
|
|
17
|
-
USER_AGREEMENT_RATE_HIGH,
|
|
18
|
-
USER_AGREEMENT_RATE_MEDIUM,
|
|
19
|
-
} from '../utils/displayUtils.js';
|
|
20
|
-
import { computeSessionStats } from '../utils/computeStats.js';
|
|
21
|
-
|
|
22
|
-
// A more flexible and powerful StatRow component
|
|
23
|
-
interface StatRowProps {
|
|
24
|
-
title: string;
|
|
25
|
-
children: React.ReactNode; // Use children to allow for complex, colored values
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const StatRow: React.FC<StatRowProps> = ({ title, children }) => (
|
|
29
|
-
<Box>
|
|
30
|
-
{/* Fixed width for the label creates a clean "gutter" for alignment */}
|
|
31
|
-
<Box width={28}>
|
|
32
|
-
<Text color={theme.text.link}>{title}</Text>
|
|
33
|
-
</Box>
|
|
34
|
-
{children}
|
|
35
|
-
</Box>
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
// A SubStatRow for indented, secondary information
|
|
39
|
-
interface SubStatRowProps {
|
|
40
|
-
title: string;
|
|
41
|
-
children: React.ReactNode;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const SubStatRow: React.FC<SubStatRowProps> = ({ title, children }) => (
|
|
45
|
-
<Box paddingLeft={2}>
|
|
46
|
-
{/* Adjust width for the "» " prefix */}
|
|
47
|
-
<Box width={26}>
|
|
48
|
-
<Text>» {title}</Text>
|
|
49
|
-
</Box>
|
|
50
|
-
{children}
|
|
51
|
-
</Box>
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
// A Section component to group related stats
|
|
55
|
-
interface SectionProps {
|
|
56
|
-
title: string;
|
|
57
|
-
children: React.ReactNode;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const Section: React.FC<SectionProps> = ({ title, children }) => (
|
|
61
|
-
<Box flexDirection="column" width="100%" marginBottom={1}>
|
|
62
|
-
<Text bold>{title}</Text>
|
|
63
|
-
{children}
|
|
64
|
-
</Box>
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
const ModelUsageTable: React.FC<{
|
|
68
|
-
models: Record<string, ModelMetrics>;
|
|
69
|
-
totalCachedTokens: number;
|
|
70
|
-
cacheEfficiency: number;
|
|
71
|
-
}> = ({ models, totalCachedTokens, cacheEfficiency }) => {
|
|
72
|
-
const nameWidth = 25;
|
|
73
|
-
const requestsWidth = 8;
|
|
74
|
-
const inputTokensWidth = 15;
|
|
75
|
-
const outputTokensWidth = 15;
|
|
76
|
-
|
|
77
|
-
return (
|
|
78
|
-
<Box flexDirection="column" marginTop={1}>
|
|
79
|
-
{/* Header */}
|
|
80
|
-
<Box>
|
|
81
|
-
<Box width={nameWidth}>
|
|
82
|
-
<Text bold>Model Usage</Text>
|
|
83
|
-
</Box>
|
|
84
|
-
<Box width={requestsWidth} justifyContent="flex-end">
|
|
85
|
-
<Text bold>Reqs</Text>
|
|
86
|
-
</Box>
|
|
87
|
-
<Box width={inputTokensWidth} justifyContent="flex-end">
|
|
88
|
-
<Text bold>Input Tokens</Text>
|
|
89
|
-
</Box>
|
|
90
|
-
<Box width={outputTokensWidth} justifyContent="flex-end">
|
|
91
|
-
<Text bold>Output Tokens</Text>
|
|
92
|
-
</Box>
|
|
93
|
-
</Box>
|
|
94
|
-
{/* Divider */}
|
|
95
|
-
<Box
|
|
96
|
-
borderStyle="round"
|
|
97
|
-
borderBottom={true}
|
|
98
|
-
borderTop={false}
|
|
99
|
-
borderLeft={false}
|
|
100
|
-
borderRight={false}
|
|
101
|
-
width={nameWidth + requestsWidth + inputTokensWidth + outputTokensWidth}
|
|
102
|
-
></Box>
|
|
103
|
-
|
|
104
|
-
{/* Rows */}
|
|
105
|
-
{Object.entries(models).map(([name, modelMetrics]) => (
|
|
106
|
-
<Box key={name}>
|
|
107
|
-
<Box width={nameWidth}>
|
|
108
|
-
<Text>{name.replace('-001', '')}</Text>
|
|
109
|
-
</Box>
|
|
110
|
-
<Box width={requestsWidth} justifyContent="flex-end">
|
|
111
|
-
<Text>{modelMetrics.api.totalRequests}</Text>
|
|
112
|
-
</Box>
|
|
113
|
-
<Box width={inputTokensWidth} justifyContent="flex-end">
|
|
114
|
-
<Text color={theme.status.warning}>
|
|
115
|
-
{modelMetrics.tokens.prompt.toLocaleString()}
|
|
116
|
-
</Text>
|
|
117
|
-
</Box>
|
|
118
|
-
<Box width={outputTokensWidth} justifyContent="flex-end">
|
|
119
|
-
<Text color={theme.status.warning}>
|
|
120
|
-
{modelMetrics.tokens.candidates.toLocaleString()}
|
|
121
|
-
</Text>
|
|
122
|
-
</Box>
|
|
123
|
-
</Box>
|
|
124
|
-
))}
|
|
125
|
-
{cacheEfficiency > 0 && (
|
|
126
|
-
<Box flexDirection="column" marginTop={1}>
|
|
127
|
-
<Text>
|
|
128
|
-
<Text color={theme.status.success}>Savings Highlight:</Text>{' '}
|
|
129
|
-
{totalCachedTokens.toLocaleString()} ({cacheEfficiency.toFixed(1)}
|
|
130
|
-
%) of input tokens were served from the cache, reducing costs.
|
|
131
|
-
</Text>
|
|
132
|
-
<Box height={1} />
|
|
133
|
-
<Text color={theme.text.secondary}>
|
|
134
|
-
» Tip: For a full token breakdown, run `/stats model`.
|
|
135
|
-
</Text>
|
|
136
|
-
</Box>
|
|
137
|
-
)}
|
|
138
|
-
</Box>
|
|
139
|
-
);
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
interface StatsDisplayProps {
|
|
143
|
-
duration: string;
|
|
144
|
-
title?: string;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export const StatsDisplay: React.FC<StatsDisplayProps> = ({
|
|
148
|
-
duration,
|
|
149
|
-
title,
|
|
150
|
-
}) => {
|
|
151
|
-
const { stats } = useSessionStats();
|
|
152
|
-
const { metrics } = stats;
|
|
153
|
-
const { models, tools, files } = metrics;
|
|
154
|
-
const computed = computeSessionStats(metrics);
|
|
155
|
-
|
|
156
|
-
const successThresholds = {
|
|
157
|
-
green: TOOL_SUCCESS_RATE_HIGH,
|
|
158
|
-
yellow: TOOL_SUCCESS_RATE_MEDIUM,
|
|
159
|
-
};
|
|
160
|
-
const agreementThresholds = {
|
|
161
|
-
green: USER_AGREEMENT_RATE_HIGH,
|
|
162
|
-
yellow: USER_AGREEMENT_RATE_MEDIUM,
|
|
163
|
-
};
|
|
164
|
-
const successColor = getStatusColor(computed.successRate, successThresholds);
|
|
165
|
-
const agreementColor = getStatusColor(
|
|
166
|
-
computed.agreementRate,
|
|
167
|
-
agreementThresholds,
|
|
168
|
-
);
|
|
169
|
-
|
|
170
|
-
const renderTitle = () => {
|
|
171
|
-
if (title) {
|
|
172
|
-
return theme.ui.gradient && theme.ui.gradient.length > 0 ? (
|
|
173
|
-
<Gradient colors={theme.ui.gradient}>
|
|
174
|
-
<Text bold>{title}</Text>
|
|
175
|
-
</Gradient>
|
|
176
|
-
) : (
|
|
177
|
-
<Text bold color={theme.text.accent}>
|
|
178
|
-
{title}
|
|
179
|
-
</Text>
|
|
180
|
-
);
|
|
181
|
-
}
|
|
182
|
-
return (
|
|
183
|
-
<Text bold color={theme.text.accent}>
|
|
184
|
-
Session Stats
|
|
185
|
-
</Text>
|
|
186
|
-
);
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
return (
|
|
190
|
-
<Box
|
|
191
|
-
borderStyle="round"
|
|
192
|
-
borderColor={theme.border.default}
|
|
193
|
-
flexDirection="column"
|
|
194
|
-
paddingY={1}
|
|
195
|
-
paddingX={2}
|
|
196
|
-
>
|
|
197
|
-
{renderTitle()}
|
|
198
|
-
<Box height={1} />
|
|
199
|
-
|
|
200
|
-
<Section title="Interaction Summary">
|
|
201
|
-
<StatRow title="Session ID:">
|
|
202
|
-
<Text>{stats.sessionId}</Text>
|
|
203
|
-
</StatRow>
|
|
204
|
-
<StatRow title="Tool Calls:">
|
|
205
|
-
<Text>
|
|
206
|
-
{tools.totalCalls} ({' '}
|
|
207
|
-
<Text color={theme.status.success}>✔ {tools.totalSuccess}</Text>{' '}
|
|
208
|
-
<Text color={theme.status.error}>✖ {tools.totalFail}</Text> )
|
|
209
|
-
</Text>
|
|
210
|
-
</StatRow>
|
|
211
|
-
<StatRow title="Success Rate:">
|
|
212
|
-
<Text color={successColor}>{computed.successRate.toFixed(1)}%</Text>
|
|
213
|
-
</StatRow>
|
|
214
|
-
{computed.totalDecisions > 0 && (
|
|
215
|
-
<StatRow title="User Agreement:">
|
|
216
|
-
<Text color={agreementColor}>
|
|
217
|
-
{computed.agreementRate.toFixed(1)}%{' '}
|
|
218
|
-
<Text color={theme.text.secondary}>
|
|
219
|
-
({computed.totalDecisions} reviewed)
|
|
220
|
-
</Text>
|
|
221
|
-
</Text>
|
|
222
|
-
</StatRow>
|
|
223
|
-
)}
|
|
224
|
-
{files &&
|
|
225
|
-
(files.totalLinesAdded > 0 || files.totalLinesRemoved > 0) && (
|
|
226
|
-
<StatRow title="Code Changes:">
|
|
227
|
-
<Text>
|
|
228
|
-
<Text color={theme.status.success}>
|
|
229
|
-
+{files.totalLinesAdded}
|
|
230
|
-
</Text>{' '}
|
|
231
|
-
<Text color={theme.status.error}>
|
|
232
|
-
-{files.totalLinesRemoved}
|
|
233
|
-
</Text>
|
|
234
|
-
</Text>
|
|
235
|
-
</StatRow>
|
|
236
|
-
)}
|
|
237
|
-
</Section>
|
|
238
|
-
|
|
239
|
-
<Section title="Performance">
|
|
240
|
-
<StatRow title="Wall Time:">
|
|
241
|
-
<Text>{duration}</Text>
|
|
242
|
-
</StatRow>
|
|
243
|
-
<StatRow title="Agent Active:">
|
|
244
|
-
<Text>{formatDuration(computed.agentActiveTime)}</Text>
|
|
245
|
-
</StatRow>
|
|
246
|
-
<SubStatRow title="API Time:">
|
|
247
|
-
<Text>
|
|
248
|
-
{formatDuration(computed.totalApiTime)}{' '}
|
|
249
|
-
<Text color={theme.text.secondary}>
|
|
250
|
-
({computed.apiTimePercent.toFixed(1)}%)
|
|
251
|
-
</Text>
|
|
252
|
-
</Text>
|
|
253
|
-
</SubStatRow>
|
|
254
|
-
<SubStatRow title="Tool Time:">
|
|
255
|
-
<Text>
|
|
256
|
-
{formatDuration(computed.totalToolTime)}{' '}
|
|
257
|
-
<Text color={theme.text.secondary}>
|
|
258
|
-
({computed.toolTimePercent.toFixed(1)}%)
|
|
259
|
-
</Text>
|
|
260
|
-
</Text>
|
|
261
|
-
</SubStatRow>
|
|
262
|
-
</Section>
|
|
263
|
-
|
|
264
|
-
{Object.keys(models).length > 0 && (
|
|
265
|
-
<ModelUsageTable
|
|
266
|
-
models={models}
|
|
267
|
-
totalCachedTokens={computed.totalCachedTokens}
|
|
268
|
-
cacheEfficiency={computed.cacheEfficiency}
|
|
269
|
-
/>
|
|
270
|
-
)}
|
|
271
|
-
</Box>
|
|
272
|
-
);
|
|
273
|
-
};
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { Box, Text } from 'ink';
|
|
8
|
-
import { Colors } from '../colors.js';
|
|
9
|
-
import { PrepareLabel } from './PrepareLabel.js';
|
|
10
|
-
export interface Suggestion {
|
|
11
|
-
label: string;
|
|
12
|
-
value: string;
|
|
13
|
-
description?: string;
|
|
14
|
-
matchedIndex?: number;
|
|
15
|
-
}
|
|
16
|
-
interface SuggestionsDisplayProps {
|
|
17
|
-
suggestions: Suggestion[];
|
|
18
|
-
activeIndex: number;
|
|
19
|
-
isLoading: boolean;
|
|
20
|
-
width: number;
|
|
21
|
-
scrollOffset: number;
|
|
22
|
-
userInput: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const MAX_SUGGESTIONS_TO_SHOW = 8;
|
|
26
|
-
|
|
27
|
-
export function SuggestionsDisplay({
|
|
28
|
-
suggestions,
|
|
29
|
-
activeIndex,
|
|
30
|
-
isLoading,
|
|
31
|
-
width,
|
|
32
|
-
scrollOffset,
|
|
33
|
-
userInput,
|
|
34
|
-
}: SuggestionsDisplayProps) {
|
|
35
|
-
if (isLoading) {
|
|
36
|
-
return (
|
|
37
|
-
<Box paddingX={1} width={width}>
|
|
38
|
-
<Text color="gray">Loading suggestions...</Text>
|
|
39
|
-
</Box>
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (suggestions.length === 0) {
|
|
44
|
-
return null; // Don't render anything if there are no suggestions
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Calculate the visible slice based on scrollOffset
|
|
48
|
-
const startIndex = scrollOffset;
|
|
49
|
-
const endIndex = Math.min(
|
|
50
|
-
scrollOffset + MAX_SUGGESTIONS_TO_SHOW,
|
|
51
|
-
suggestions.length,
|
|
52
|
-
);
|
|
53
|
-
const visibleSuggestions = suggestions.slice(startIndex, endIndex);
|
|
54
|
-
|
|
55
|
-
return (
|
|
56
|
-
<Box flexDirection="column" paddingX={1} width={width}>
|
|
57
|
-
{scrollOffset > 0 && <Text color={Colors.Foreground}>▲</Text>}
|
|
58
|
-
|
|
59
|
-
{visibleSuggestions.map((suggestion, index) => {
|
|
60
|
-
const originalIndex = startIndex + index;
|
|
61
|
-
const isActive = originalIndex === activeIndex;
|
|
62
|
-
const textColor = isActive ? Colors.AccentPurple : Colors.Gray;
|
|
63
|
-
const labelElement = (
|
|
64
|
-
<PrepareLabel
|
|
65
|
-
label={suggestion.label}
|
|
66
|
-
matchedIndex={suggestion.matchedIndex}
|
|
67
|
-
userInput={userInput}
|
|
68
|
-
textColor={textColor}
|
|
69
|
-
/>
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
return (
|
|
73
|
-
<Box key={`${suggestion.value}-${originalIndex}`} width={width}>
|
|
74
|
-
<Box flexDirection="row">
|
|
75
|
-
{userInput.startsWith('/') ? (
|
|
76
|
-
// only use box model for (/) command mode
|
|
77
|
-
<Box width={20} flexShrink={0}>
|
|
78
|
-
{labelElement}
|
|
79
|
-
</Box>
|
|
80
|
-
) : (
|
|
81
|
-
labelElement
|
|
82
|
-
)}
|
|
83
|
-
{suggestion.description ? (
|
|
84
|
-
<Box flexGrow={1}>
|
|
85
|
-
<Text color={textColor} wrap="truncate">
|
|
86
|
-
{suggestion.description}
|
|
87
|
-
</Text>
|
|
88
|
-
</Box>
|
|
89
|
-
) : null}
|
|
90
|
-
</Box>
|
|
91
|
-
</Box>
|
|
92
|
-
);
|
|
93
|
-
})}
|
|
94
|
-
{endIndex < suggestions.length && <Text color="gray">▼</Text>}
|
|
95
|
-
{suggestions.length > MAX_SUGGESTIONS_TO_SHOW && (
|
|
96
|
-
<Text color="gray">
|
|
97
|
-
({activeIndex + 1}/{suggestions.length})
|
|
98
|
-
</Text>
|
|
99
|
-
)}
|
|
100
|
-
</Box>
|
|
101
|
-
);
|
|
102
|
-
}
|
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import React, { useCallback, useState } from 'react';
|
|
8
|
-
import { Box, Text } from 'ink';
|
|
9
|
-
import { Colors } from '../colors.js';
|
|
10
|
-
import { themeManager, DEFAULT_THEME } from '../themes/theme-manager.js';
|
|
11
|
-
import { RadioButtonSelect } from './shared/RadioButtonSelect.js';
|
|
12
|
-
import { DiffRenderer } from './messages/DiffRenderer.js';
|
|
13
|
-
import { colorizeCode } from '../utils/CodeColorizer.js';
|
|
14
|
-
import { LoadedSettings, SettingScope } from '../../config/settings.js';
|
|
15
|
-
import {
|
|
16
|
-
getScopeItems,
|
|
17
|
-
getScopeMessageForSetting,
|
|
18
|
-
} from '../../utils/dialogScopeUtils.js';
|
|
19
|
-
import { useKeypress } from '../hooks/useKeypress.js';
|
|
20
|
-
|
|
21
|
-
interface ThemeDialogProps {
|
|
22
|
-
/** Callback function when a theme is selected */
|
|
23
|
-
onSelect: (themeName: string | undefined, scope: SettingScope) => void;
|
|
24
|
-
|
|
25
|
-
/** Callback function when a theme is highlighted */
|
|
26
|
-
onHighlight: (themeName: string | undefined) => void;
|
|
27
|
-
/** The settings object */
|
|
28
|
-
settings: LoadedSettings;
|
|
29
|
-
availableTerminalHeight?: number;
|
|
30
|
-
terminalWidth: number;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function ThemeDialog({
|
|
34
|
-
onSelect,
|
|
35
|
-
onHighlight,
|
|
36
|
-
settings,
|
|
37
|
-
availableTerminalHeight,
|
|
38
|
-
terminalWidth,
|
|
39
|
-
}: ThemeDialogProps): React.JSX.Element {
|
|
40
|
-
const [selectedScope, setSelectedScope] = useState<SettingScope>(
|
|
41
|
-
SettingScope.User,
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
// Track the currently highlighted theme name
|
|
45
|
-
const [highlightedThemeName, setHighlightedThemeName] = useState<
|
|
46
|
-
string | undefined
|
|
47
|
-
>(settings.merged.theme || DEFAULT_THEME.name);
|
|
48
|
-
|
|
49
|
-
// Generate theme items filtered by selected scope
|
|
50
|
-
const customThemes =
|
|
51
|
-
selectedScope === SettingScope.User
|
|
52
|
-
? settings.user.settings.customThemes || {}
|
|
53
|
-
: settings.merged.customThemes || {};
|
|
54
|
-
const builtInThemes = themeManager
|
|
55
|
-
.getAvailableThemes()
|
|
56
|
-
.filter((theme) => theme.type !== 'custom');
|
|
57
|
-
const customThemeNames = Object.keys(customThemes);
|
|
58
|
-
const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
59
|
-
// Generate theme items
|
|
60
|
-
const themeItems = [
|
|
61
|
-
...builtInThemes.map((theme) => ({
|
|
62
|
-
label: theme.name,
|
|
63
|
-
value: theme.name,
|
|
64
|
-
themeNameDisplay: theme.name,
|
|
65
|
-
themeTypeDisplay: capitalize(theme.type),
|
|
66
|
-
})),
|
|
67
|
-
...customThemeNames.map((name) => ({
|
|
68
|
-
label: name,
|
|
69
|
-
value: name,
|
|
70
|
-
themeNameDisplay: name,
|
|
71
|
-
themeTypeDisplay: 'Custom',
|
|
72
|
-
})),
|
|
73
|
-
];
|
|
74
|
-
const [selectInputKey, setSelectInputKey] = useState(Date.now());
|
|
75
|
-
|
|
76
|
-
// Find the index of the selected theme, but only if it exists in the list
|
|
77
|
-
const selectedThemeName = settings.merged.theme || DEFAULT_THEME.name;
|
|
78
|
-
const initialThemeIndex = themeItems.findIndex(
|
|
79
|
-
(item) => item.value === selectedThemeName,
|
|
80
|
-
);
|
|
81
|
-
// If not found, fall back to the first theme
|
|
82
|
-
const safeInitialThemeIndex = initialThemeIndex >= 0 ? initialThemeIndex : 0;
|
|
83
|
-
|
|
84
|
-
const scopeItems = getScopeItems();
|
|
85
|
-
|
|
86
|
-
const handleThemeSelect = useCallback(
|
|
87
|
-
(themeName: string) => {
|
|
88
|
-
onSelect(themeName, selectedScope);
|
|
89
|
-
},
|
|
90
|
-
[onSelect, selectedScope],
|
|
91
|
-
);
|
|
92
|
-
|
|
93
|
-
const handleThemeHighlight = (themeName: string) => {
|
|
94
|
-
setHighlightedThemeName(themeName);
|
|
95
|
-
onHighlight(themeName);
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
const handleScopeHighlight = useCallback((scope: SettingScope) => {
|
|
99
|
-
setSelectedScope(scope);
|
|
100
|
-
setSelectInputKey(Date.now());
|
|
101
|
-
}, []);
|
|
102
|
-
|
|
103
|
-
const handleScopeSelect = useCallback(
|
|
104
|
-
(scope: SettingScope) => {
|
|
105
|
-
handleScopeHighlight(scope);
|
|
106
|
-
setFocusedSection('theme'); // Reset focus to theme section
|
|
107
|
-
},
|
|
108
|
-
[handleScopeHighlight],
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
const [focusedSection, setFocusedSection] = useState<'theme' | 'scope'>(
|
|
112
|
-
'theme',
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
useKeypress(
|
|
116
|
-
(key) => {
|
|
117
|
-
if (key.name === 'tab') {
|
|
118
|
-
setFocusedSection((prev) => (prev === 'theme' ? 'scope' : 'theme'));
|
|
119
|
-
}
|
|
120
|
-
if (key.name === 'escape') {
|
|
121
|
-
onSelect(undefined, selectedScope);
|
|
122
|
-
}
|
|
123
|
-
},
|
|
124
|
-
{ isActive: true },
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
// Generate scope message for theme setting
|
|
128
|
-
const otherScopeModifiedMessage = getScopeMessageForSetting(
|
|
129
|
-
'theme',
|
|
130
|
-
selectedScope,
|
|
131
|
-
settings,
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
// Constants for calculating preview pane layout.
|
|
135
|
-
// These values are based on the JSX structure below.
|
|
136
|
-
const PREVIEW_PANE_WIDTH_PERCENTAGE = 0.55;
|
|
137
|
-
// A safety margin to prevent text from touching the border.
|
|
138
|
-
// This is a complete hack unrelated to the 0.9 used in App.tsx
|
|
139
|
-
const PREVIEW_PANE_WIDTH_SAFETY_MARGIN = 0.9;
|
|
140
|
-
// Combined horizontal padding from the dialog and preview pane.
|
|
141
|
-
const TOTAL_HORIZONTAL_PADDING = 4;
|
|
142
|
-
const colorizeCodeWidth = Math.max(
|
|
143
|
-
Math.floor(
|
|
144
|
-
(terminalWidth - TOTAL_HORIZONTAL_PADDING) *
|
|
145
|
-
PREVIEW_PANE_WIDTH_PERCENTAGE *
|
|
146
|
-
PREVIEW_PANE_WIDTH_SAFETY_MARGIN,
|
|
147
|
-
),
|
|
148
|
-
1,
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
const DIALOG_PADDING = 2;
|
|
152
|
-
const selectThemeHeight = themeItems.length + 1;
|
|
153
|
-
const SCOPE_SELECTION_HEIGHT = 4; // Height for the scope selection section + margin.
|
|
154
|
-
const SPACE_BETWEEN_THEME_SELECTION_AND_APPLY_TO = 1;
|
|
155
|
-
const TAB_TO_SELECT_HEIGHT = 2;
|
|
156
|
-
availableTerminalHeight = availableTerminalHeight ?? Number.MAX_SAFE_INTEGER;
|
|
157
|
-
availableTerminalHeight -= 2; // Top and bottom borders.
|
|
158
|
-
availableTerminalHeight -= TAB_TO_SELECT_HEIGHT;
|
|
159
|
-
|
|
160
|
-
let totalLeftHandSideHeight =
|
|
161
|
-
DIALOG_PADDING +
|
|
162
|
-
selectThemeHeight +
|
|
163
|
-
SCOPE_SELECTION_HEIGHT +
|
|
164
|
-
SPACE_BETWEEN_THEME_SELECTION_AND_APPLY_TO;
|
|
165
|
-
|
|
166
|
-
let showScopeSelection = true;
|
|
167
|
-
let includePadding = true;
|
|
168
|
-
|
|
169
|
-
// Remove content from the LHS that can be omitted if it exceeds the available height.
|
|
170
|
-
if (totalLeftHandSideHeight > availableTerminalHeight) {
|
|
171
|
-
includePadding = false;
|
|
172
|
-
totalLeftHandSideHeight -= DIALOG_PADDING;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
if (totalLeftHandSideHeight > availableTerminalHeight) {
|
|
176
|
-
// First, try hiding the scope selection
|
|
177
|
-
totalLeftHandSideHeight -= SCOPE_SELECTION_HEIGHT;
|
|
178
|
-
showScopeSelection = false;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Don't focus the scope selection if it is hidden due to height constraints.
|
|
182
|
-
const currentFocusedSection = !showScopeSelection ? 'theme' : focusedSection;
|
|
183
|
-
|
|
184
|
-
// Vertical space taken by elements other than the two code blocks in the preview pane.
|
|
185
|
-
// Includes "Preview" title, borders, and margin between blocks.
|
|
186
|
-
const PREVIEW_PANE_FIXED_VERTICAL_SPACE = 8;
|
|
187
|
-
|
|
188
|
-
// The right column doesn't need to ever be shorter than the left column.
|
|
189
|
-
availableTerminalHeight = Math.max(
|
|
190
|
-
availableTerminalHeight,
|
|
191
|
-
totalLeftHandSideHeight,
|
|
192
|
-
);
|
|
193
|
-
const availableTerminalHeightCodeBlock =
|
|
194
|
-
availableTerminalHeight -
|
|
195
|
-
PREVIEW_PANE_FIXED_VERTICAL_SPACE -
|
|
196
|
-
(includePadding ? 2 : 0) * 2;
|
|
197
|
-
|
|
198
|
-
// Subtract margin between code blocks from available height.
|
|
199
|
-
const availableHeightForPanes = Math.max(
|
|
200
|
-
0,
|
|
201
|
-
availableTerminalHeightCodeBlock - 1,
|
|
202
|
-
);
|
|
203
|
-
|
|
204
|
-
// The code block is slightly longer than the diff, so give it more space.
|
|
205
|
-
const codeBlockHeight = Math.ceil(availableHeightForPanes * 0.6);
|
|
206
|
-
const diffHeight = Math.floor(availableHeightForPanes * 0.4);
|
|
207
|
-
return (
|
|
208
|
-
<Box
|
|
209
|
-
borderStyle="round"
|
|
210
|
-
borderColor={Colors.Gray}
|
|
211
|
-
flexDirection="column"
|
|
212
|
-
paddingTop={includePadding ? 1 : 0}
|
|
213
|
-
paddingBottom={includePadding ? 1 : 0}
|
|
214
|
-
paddingLeft={1}
|
|
215
|
-
paddingRight={1}
|
|
216
|
-
width="100%"
|
|
217
|
-
>
|
|
218
|
-
<Box flexDirection="row">
|
|
219
|
-
{/* Left Column: Selection */}
|
|
220
|
-
<Box flexDirection="column" width="45%" paddingRight={2}>
|
|
221
|
-
<Text bold={currentFocusedSection === 'theme'} wrap="truncate">
|
|
222
|
-
{currentFocusedSection === 'theme' ? '> ' : ' '}Select Theme{' '}
|
|
223
|
-
<Text color={Colors.Gray}>{otherScopeModifiedMessage}</Text>
|
|
224
|
-
</Text>
|
|
225
|
-
<RadioButtonSelect
|
|
226
|
-
key={selectInputKey}
|
|
227
|
-
items={themeItems}
|
|
228
|
-
initialIndex={safeInitialThemeIndex}
|
|
229
|
-
onSelect={handleThemeSelect}
|
|
230
|
-
onHighlight={handleThemeHighlight}
|
|
231
|
-
isFocused={currentFocusedSection === 'theme'}
|
|
232
|
-
maxItemsToShow={8}
|
|
233
|
-
showScrollArrows={true}
|
|
234
|
-
showNumbers={currentFocusedSection === 'theme'}
|
|
235
|
-
/>
|
|
236
|
-
|
|
237
|
-
{/* Scope Selection */}
|
|
238
|
-
{showScopeSelection && (
|
|
239
|
-
<Box marginTop={1} flexDirection="column">
|
|
240
|
-
<Text bold={currentFocusedSection === 'scope'} wrap="truncate">
|
|
241
|
-
{currentFocusedSection === 'scope' ? '> ' : ' '}Apply To
|
|
242
|
-
</Text>
|
|
243
|
-
<RadioButtonSelect
|
|
244
|
-
items={scopeItems}
|
|
245
|
-
initialIndex={0} // Default to User Settings
|
|
246
|
-
onSelect={handleScopeSelect}
|
|
247
|
-
onHighlight={handleScopeHighlight}
|
|
248
|
-
isFocused={currentFocusedSection === 'scope'}
|
|
249
|
-
showNumbers={currentFocusedSection === 'scope'}
|
|
250
|
-
/>
|
|
251
|
-
</Box>
|
|
252
|
-
)}
|
|
253
|
-
</Box>
|
|
254
|
-
|
|
255
|
-
{/* Right Column: Preview */}
|
|
256
|
-
<Box flexDirection="column" width="55%" paddingLeft={2}>
|
|
257
|
-
<Text bold>Preview</Text>
|
|
258
|
-
{/* Get the Theme object for the highlighted theme, fall back to default if not found */}
|
|
259
|
-
{(() => {
|
|
260
|
-
const previewTheme =
|
|
261
|
-
themeManager.getTheme(
|
|
262
|
-
highlightedThemeName || DEFAULT_THEME.name,
|
|
263
|
-
) || DEFAULT_THEME;
|
|
264
|
-
return (
|
|
265
|
-
<Box
|
|
266
|
-
borderStyle="single"
|
|
267
|
-
borderColor={Colors.Gray}
|
|
268
|
-
paddingTop={includePadding ? 1 : 0}
|
|
269
|
-
paddingBottom={includePadding ? 1 : 0}
|
|
270
|
-
paddingLeft={1}
|
|
271
|
-
paddingRight={1}
|
|
272
|
-
flexDirection="column"
|
|
273
|
-
>
|
|
274
|
-
{colorizeCode(
|
|
275
|
-
`# function
|
|
276
|
-
def fibonacci(n):
|
|
277
|
-
a, b = 0, 1
|
|
278
|
-
for _ in range(n):
|
|
279
|
-
a, b = b, a + b
|
|
280
|
-
return a`,
|
|
281
|
-
'python',
|
|
282
|
-
codeBlockHeight,
|
|
283
|
-
colorizeCodeWidth,
|
|
284
|
-
)}
|
|
285
|
-
<Box marginTop={1} />
|
|
286
|
-
<DiffRenderer
|
|
287
|
-
diffContent={`--- a/util.py
|
|
288
|
-
+++ b/util.py
|
|
289
|
-
@@ -1,2 +1,2 @@
|
|
290
|
-
- print("Hello, " + name)
|
|
291
|
-
+ print(f"Hello, {name}!")
|
|
292
|
-
`}
|
|
293
|
-
availableTerminalHeight={diffHeight}
|
|
294
|
-
terminalWidth={colorizeCodeWidth}
|
|
295
|
-
theme={previewTheme}
|
|
296
|
-
/>
|
|
297
|
-
</Box>
|
|
298
|
-
);
|
|
299
|
-
})()}
|
|
300
|
-
</Box>
|
|
301
|
-
</Box>
|
|
302
|
-
<Box marginTop={1}>
|
|
303
|
-
<Text color={Colors.Gray} wrap="truncate">
|
|
304
|
-
(Use Enter to select
|
|
305
|
-
{showScopeSelection ? ', Tab to change focus' : ''})
|
|
306
|
-
</Text>
|
|
307
|
-
</Box>
|
|
308
|
-
</Box>
|
|
309
|
-
);
|
|
310
|
-
}
|