fss-link 1.0.40 → 1.0.45

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.
Files changed (428) hide show
  1. package/dist/commands/mcp/add.test.ts +122 -0
  2. package/dist/commands/mcp/add.ts +222 -0
  3. package/dist/commands/mcp/list.test.ts +154 -0
  4. package/dist/commands/mcp/list.ts +139 -0
  5. package/dist/commands/mcp/remove.test.ts +69 -0
  6. package/dist/commands/mcp/remove.ts +60 -0
  7. package/dist/commands/mcp.test.ts +55 -0
  8. package/dist/commands/mcp.ts +27 -0
  9. package/dist/config/apiValidation.test.ts +118 -0
  10. package/dist/config/auth.test.ts +79 -0
  11. package/dist/config/auth.ts +100 -0
  12. package/dist/config/config.integration.test.ts +407 -0
  13. package/dist/config/config.test.ts +1952 -0
  14. package/dist/config/config.ts +690 -0
  15. package/dist/config/database.test.ts +96 -0
  16. package/dist/config/database.ts +752 -0
  17. package/dist/config/extension.test.ts +236 -0
  18. package/dist/config/extension.ts +180 -0
  19. package/dist/config/keyBindings.test.ts +62 -0
  20. package/dist/config/keyBindings.ts +184 -0
  21. package/dist/config/modelManager.ts +275 -0
  22. package/dist/config/providerManager.ts +244 -0
  23. package/dist/config/providerPersistence.test.ts +377 -0
  24. package/dist/config/providerPersistence.ts +105 -0
  25. package/dist/config/sandboxConfig.ts +107 -0
  26. package/dist/config/settings.test.ts +1424 -0
  27. package/dist/config/settings.ts +517 -0
  28. package/dist/config/settingsSchema.test.ts +252 -0
  29. package/dist/config/settingsSchema.ts +728 -0
  30. package/dist/config/trustedFolders.test.ts +208 -0
  31. package/dist/config/trustedFolders.ts +167 -0
  32. package/dist/gemini.test.tsx +252 -0
  33. package/dist/gemini.tsx +357 -0
  34. package/dist/generated/git-commit.ts +10 -0
  35. package/dist/index.ts +21 -0
  36. package/dist/nonInteractiveCli.test.ts +276 -0
  37. package/dist/nonInteractiveCli.ts +143 -0
  38. package/dist/package.json +87 -87
  39. package/dist/patches/is-in-ci.ts +17 -0
  40. package/dist/services/BuiltinCommandLoader.test.ts +127 -0
  41. package/dist/services/BuiltinCommandLoader.ts +95 -0
  42. package/dist/services/CommandService.test.ts +352 -0
  43. package/dist/services/CommandService.ts +103 -0
  44. package/dist/services/FileCommandLoader.test.ts +1002 -0
  45. package/dist/services/FileCommandLoader.ts +289 -0
  46. package/dist/services/McpPromptLoader.ts +231 -0
  47. package/dist/services/SearchEngineConfigProvider.ts +100 -0
  48. package/dist/services/prompt-processors/argumentProcessor.test.ts +41 -0
  49. package/dist/services/prompt-processors/argumentProcessor.ts +23 -0
  50. package/dist/services/prompt-processors/shellProcessor.test.ts +709 -0
  51. package/dist/services/prompt-processors/shellProcessor.ts +248 -0
  52. package/dist/services/prompt-processors/types.ts +44 -0
  53. package/dist/services/types.ts +24 -0
  54. package/dist/src/config/apiValidation.test.d.ts +6 -0
  55. package/dist/src/config/apiValidation.test.js +99 -0
  56. package/dist/src/config/apiValidation.test.js.map +1 -0
  57. package/dist/src/config/database.d.ts +32 -0
  58. package/dist/src/config/database.js +281 -2
  59. package/dist/src/config/database.js.map +1 -1
  60. package/dist/src/config/database.test.d.ts +6 -0
  61. package/dist/src/config/database.test.js +80 -0
  62. package/dist/src/config/database.test.js.map +1 -0
  63. package/dist/src/config/providerManager.d.ts +74 -0
  64. package/dist/src/config/providerManager.js +203 -0
  65. package/dist/src/config/providerManager.js.map +1 -0
  66. package/dist/src/config/providerPersistence.d.ts +75 -0
  67. package/dist/src/config/providerPersistence.js +55 -0
  68. package/dist/src/config/providerPersistence.js.map +1 -0
  69. package/dist/src/config/providerPersistence.test.d.ts +6 -0
  70. package/dist/src/config/providerPersistence.test.js +283 -0
  71. package/dist/src/config/providerPersistence.test.js.map +1 -0
  72. package/dist/src/config/settingsSchema.d.ts +9 -0
  73. package/dist/src/config/settingsSchema.js +9 -0
  74. package/dist/src/config/settingsSchema.js.map +1 -1
  75. package/dist/src/generated/git-commit.d.ts +1 -1
  76. package/dist/src/generated/git-commit.js +1 -1
  77. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  78. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  79. package/dist/src/ui/App.js +14 -2
  80. package/dist/src/ui/App.js.map +1 -1
  81. package/dist/src/ui/commands/contextCommand.d.ts +7 -0
  82. package/dist/src/ui/commands/contextCommand.js +115 -0
  83. package/dist/src/ui/commands/contextCommand.js.map +1 -0
  84. package/dist/src/ui/components/ContextUsageDisplay.d.ts +3 -1
  85. package/dist/src/ui/components/ContextUsageDisplay.js +43 -3
  86. package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -1
  87. package/dist/src/ui/components/Footer.d.ts +1 -0
  88. package/dist/src/ui/components/Footer.js +2 -2
  89. package/dist/src/ui/components/Footer.js.map +1 -1
  90. package/dist/src/ui/components/GeminiKeyDialog.d.ts +11 -0
  91. package/dist/src/ui/components/GeminiKeyDialog.js +156 -0
  92. package/dist/src/ui/components/GeminiKeyDialog.js.map +1 -0
  93. package/dist/src/ui/components/OpenAIEndpointDialog.d.ts +19 -0
  94. package/dist/src/ui/components/OpenAIEndpointDialog.js +163 -0
  95. package/dist/src/ui/components/OpenAIEndpointDialog.js.map +1 -0
  96. package/dist/src/ui/components/WelcomeBackDialog.d.ts +36 -0
  97. package/dist/src/ui/components/WelcomeBackDialog.js +109 -0
  98. package/dist/src/ui/components/WelcomeBackDialog.js.map +1 -0
  99. package/dist/src/ui/hooks/useWelcomeBack.d.ts +52 -0
  100. package/dist/src/ui/hooks/useWelcomeBack.js +214 -0
  101. package/dist/src/ui/hooks/useWelcomeBack.js.map +1 -0
  102. package/dist/src/zed-integration/schema.d.ts +1516 -1516
  103. package/dist/test-setup.ts +12 -0
  104. package/dist/test-utils/customMatchers.ts +65 -0
  105. package/dist/test-utils/mockCommandContext.test.ts +62 -0
  106. package/dist/test-utils/mockCommandContext.ts +105 -0
  107. package/dist/test-utils/render.tsx +18 -0
  108. package/dist/tsconfig.tsbuildinfo +1 -1
  109. package/dist/ui/App.test.tsx +2181 -0
  110. package/dist/ui/App.tsx +1344 -0
  111. package/dist/ui/IdeIntegrationNudge.tsx +98 -0
  112. package/dist/ui/__snapshots__/App.test.tsx.snap +124 -0
  113. package/dist/ui/colors.ts +56 -0
  114. package/dist/ui/commands/aboutCommand.test.ts +153 -0
  115. package/dist/ui/commands/aboutCommand.ts +49 -0
  116. package/dist/ui/commands/authCommand.test.ts +36 -0
  117. package/dist/ui/commands/authCommand.ts +17 -0
  118. package/dist/ui/commands/bugCommand.test.ts +114 -0
  119. package/dist/ui/commands/bugCommand.ts +92 -0
  120. package/dist/ui/commands/chatCommand.test.ts +414 -0
  121. package/dist/ui/commands/chatCommand.ts +280 -0
  122. package/dist/ui/commands/clearCommand.test.ts +100 -0
  123. package/dist/ui/commands/clearCommand.ts +29 -0
  124. package/dist/ui/commands/compressCommand.test.ts +129 -0
  125. package/dist/ui/commands/compressCommand.ts +78 -0
  126. package/dist/ui/commands/contextCommand.ts +132 -0
  127. package/dist/ui/commands/copyCommand.test.ts +296 -0
  128. package/dist/ui/commands/copyCommand.ts +67 -0
  129. package/dist/ui/commands/corgiCommand.test.ts +34 -0
  130. package/dist/ui/commands/corgiCommand.ts +16 -0
  131. package/dist/ui/commands/directoryCommand.test.tsx +185 -0
  132. package/dist/ui/commands/directoryCommand.tsx +179 -0
  133. package/dist/ui/commands/docsCommand.test.ts +99 -0
  134. package/dist/ui/commands/docsCommand.ts +42 -0
  135. package/dist/ui/commands/editorCommand.test.ts +30 -0
  136. package/dist/ui/commands/editorCommand.ts +21 -0
  137. package/dist/ui/commands/extensionsCommand.test.ts +67 -0
  138. package/dist/ui/commands/extensionsCommand.ts +46 -0
  139. package/dist/ui/commands/helpCommand.test.ts +52 -0
  140. package/dist/ui/commands/helpCommand.ts +23 -0
  141. package/dist/ui/commands/ideCommand.test.ts +255 -0
  142. package/dist/ui/commands/ideCommand.ts +283 -0
  143. package/dist/ui/commands/initCommand.test.ts +127 -0
  144. package/dist/ui/commands/initCommand.ts +117 -0
  145. package/dist/ui/commands/mcpCommand.test.ts +1057 -0
  146. package/dist/ui/commands/mcpCommand.ts +531 -0
  147. package/dist/ui/commands/memoryCommand.test.ts +344 -0
  148. package/dist/ui/commands/memoryCommand.ts +305 -0
  149. package/dist/ui/commands/privacyCommand.test.ts +38 -0
  150. package/dist/ui/commands/privacyCommand.ts +17 -0
  151. package/dist/ui/commands/quitCommand.test.ts +55 -0
  152. package/dist/ui/commands/quitCommand.ts +36 -0
  153. package/dist/ui/commands/restoreCommand.test.ts +250 -0
  154. package/dist/ui/commands/restoreCommand.ts +157 -0
  155. package/dist/ui/commands/searchEngineSetupCommand.ts +18 -0
  156. package/dist/ui/commands/settingsCommand.test.ts +36 -0
  157. package/dist/ui/commands/settingsCommand.ts +17 -0
  158. package/dist/ui/commands/setupGithubCommand.test.ts +238 -0
  159. package/dist/ui/commands/setupGithubCommand.ts +212 -0
  160. package/dist/ui/commands/speakCommand.ts +175 -0
  161. package/dist/ui/commands/statsCommand.test.ts +78 -0
  162. package/dist/ui/commands/statsCommand.ts +70 -0
  163. package/dist/ui/commands/terminalSetupCommand.test.ts +85 -0
  164. package/dist/ui/commands/terminalSetupCommand.ts +45 -0
  165. package/dist/ui/commands/themeCommand.test.ts +38 -0
  166. package/dist/ui/commands/themeCommand.ts +17 -0
  167. package/dist/ui/commands/toolsCommand.test.ts +105 -0
  168. package/dist/ui/commands/toolsCommand.ts +71 -0
  169. package/dist/ui/commands/ttsCommand.ts +143 -0
  170. package/dist/ui/commands/types.ts +204 -0
  171. package/dist/ui/commands/vimCommand.ts +25 -0
  172. package/dist/ui/commands/voiceCommand.ts +125 -0
  173. package/dist/ui/components/AboutBox.tsx +133 -0
  174. package/dist/ui/components/AsciiArt.ts +54 -0
  175. package/dist/ui/components/AuthDialog.test.tsx +334 -0
  176. package/dist/ui/components/AuthDialog.tsx +289 -0
  177. package/dist/ui/components/AuthInProgress.tsx +62 -0
  178. package/dist/ui/components/AutoAcceptIndicator.tsx +47 -0
  179. package/dist/ui/components/ConsoleSummaryDisplay.tsx +35 -0
  180. package/dist/ui/components/ContextSummaryDisplay.test.tsx +85 -0
  181. package/dist/ui/components/ContextSummaryDisplay.tsx +120 -0
  182. package/dist/ui/components/ContextUsageDisplay.tsx +77 -0
  183. package/dist/ui/components/DebugProfiler.tsx +36 -0
  184. package/dist/ui/components/DetailedMessagesDisplay.tsx +82 -0
  185. package/dist/ui/components/EditorSettingsDialog.tsx +172 -0
  186. package/dist/ui/components/FolderTrustDialog.test.tsx +36 -0
  187. package/dist/ui/components/FolderTrustDialog.tsx +74 -0
  188. package/dist/ui/components/Footer.test.tsx +159 -0
  189. package/dist/ui/components/Footer.tsx +158 -0
  190. package/dist/ui/components/GeminiKeyDialog.tsx +252 -0
  191. package/dist/ui/components/GeminiRespondingSpinner.tsx +34 -0
  192. package/dist/ui/components/Header.test.tsx +44 -0
  193. package/dist/ui/components/Header.tsx +70 -0
  194. package/dist/ui/components/Help.tsx +174 -0
  195. package/dist/ui/components/HistoryItemDisplay.test.tsx +125 -0
  196. package/dist/ui/components/HistoryItemDisplay.tsx +98 -0
  197. package/dist/ui/components/InputPrompt.test.tsx +1467 -0
  198. package/dist/ui/components/InputPrompt.tsx +641 -0
  199. package/dist/ui/components/LMStudioModelPrompt.tsx +215 -0
  200. package/dist/ui/components/LoadingIndicator.test.tsx +296 -0
  201. package/dist/ui/components/LoadingIndicator.tsx +82 -0
  202. package/dist/ui/components/MemoryUsageDisplay.tsx +36 -0
  203. package/dist/ui/components/ModelStatsDisplay.test.tsx +252 -0
  204. package/dist/ui/components/ModelStatsDisplay.tsx +197 -0
  205. package/dist/ui/components/OllamaModelPrompt.tsx +206 -0
  206. package/dist/ui/components/OpenAIEndpointDialog.tsx +261 -0
  207. package/dist/ui/components/OpenAIKeyPrompt.test.tsx +64 -0
  208. package/dist/ui/components/OpenAIKeyPrompt.tsx +197 -0
  209. package/dist/ui/components/PrepareLabel.tsx +48 -0
  210. package/dist/ui/components/SearchEngineConfigDialog.tsx +280 -0
  211. package/dist/ui/components/SessionSummaryDisplay.test.tsx +75 -0
  212. package/dist/ui/components/SessionSummaryDisplay.tsx +18 -0
  213. package/dist/ui/components/SettingsDialog.test.tsx +865 -0
  214. package/dist/ui/components/SettingsDialog.tsx +753 -0
  215. package/dist/ui/components/ShellConfirmationDialog.test.tsx +53 -0
  216. package/dist/ui/components/ShellConfirmationDialog.tsx +103 -0
  217. package/dist/ui/components/ShellModeIndicator.tsx +18 -0
  218. package/dist/ui/components/ShowMoreLines.tsx +40 -0
  219. package/dist/ui/components/StatsDisplay.test.tsx +401 -0
  220. package/dist/ui/components/StatsDisplay.tsx +273 -0
  221. package/dist/ui/components/SuggestionsDisplay.tsx +102 -0
  222. package/dist/ui/components/ThemeDialog.tsx +310 -0
  223. package/dist/ui/components/Tips.tsx +45 -0
  224. package/dist/ui/components/TodoDisplay.test.tsx +97 -0
  225. package/dist/ui/components/TodoDisplay.tsx +72 -0
  226. package/dist/ui/components/ToolStatsDisplay.test.tsx +180 -0
  227. package/dist/ui/components/ToolStatsDisplay.tsx +208 -0
  228. package/dist/ui/components/UpdateNotification.tsx +23 -0
  229. package/dist/ui/components/WelcomeBackDialog.tsx +290 -0
  230. package/dist/ui/components/__snapshots__/IDEContextDetailDisplay.test.tsx.snap +24 -0
  231. package/dist/ui/components/__snapshots__/ModelStatsDisplay.test.tsx.snap +121 -0
  232. package/dist/ui/components/__snapshots__/SessionSummaryDisplay.test.tsx.snap +30 -0
  233. package/dist/ui/components/__snapshots__/ShellConfirmationDialog.test.tsx.snap +21 -0
  234. package/dist/ui/components/__snapshots__/StatsDisplay.test.tsx.snap +264 -0
  235. package/dist/ui/components/__snapshots__/ToolStatsDisplay.test.tsx.snap +91 -0
  236. package/dist/ui/components/messages/CompressionMessage.tsx +49 -0
  237. package/dist/ui/components/messages/DiffRenderer.test.tsx +365 -0
  238. package/dist/ui/components/messages/DiffRenderer.tsx +358 -0
  239. package/dist/ui/components/messages/ErrorMessage.tsx +31 -0
  240. package/dist/ui/components/messages/GeminiMessage.tsx +43 -0
  241. package/dist/ui/components/messages/GeminiMessageContent.tsx +43 -0
  242. package/dist/ui/components/messages/InfoMessage.tsx +32 -0
  243. package/dist/ui/components/messages/ToolConfirmationMessage.test.tsx +58 -0
  244. package/dist/ui/components/messages/ToolConfirmationMessage.tsx +297 -0
  245. package/dist/ui/components/messages/ToolGroupMessage.tsx +126 -0
  246. package/dist/ui/components/messages/ToolMessage.test.tsx +183 -0
  247. package/dist/ui/components/messages/ToolMessage.tsx +296 -0
  248. package/dist/ui/components/messages/UserMessage.tsx +43 -0
  249. package/dist/ui/components/messages/UserShellMessage.tsx +25 -0
  250. package/dist/ui/components/shared/MaxSizedBox.test.tsx +425 -0
  251. package/dist/ui/components/shared/MaxSizedBox.tsx +624 -0
  252. package/dist/ui/components/shared/RadioButtonSelect.test.tsx +181 -0
  253. package/dist/ui/components/shared/RadioButtonSelect.tsx +234 -0
  254. package/dist/ui/components/shared/__snapshots__/RadioButtonSelect.test.tsx.snap +47 -0
  255. package/dist/ui/components/shared/text-buffer.test.ts +1728 -0
  256. package/dist/ui/components/shared/text-buffer.ts +2227 -0
  257. package/dist/ui/components/shared/vim-buffer-actions.test.ts +1119 -0
  258. package/dist/ui/components/shared/vim-buffer-actions.ts +814 -0
  259. package/dist/ui/constants.ts +17 -0
  260. package/dist/ui/contexts/KeypressContext.test.tsx +391 -0
  261. package/dist/ui/contexts/KeypressContext.tsx +440 -0
  262. package/dist/ui/contexts/OverflowContext.tsx +87 -0
  263. package/dist/ui/contexts/SessionContext.test.tsx +132 -0
  264. package/dist/ui/contexts/SessionContext.tsx +143 -0
  265. package/dist/ui/contexts/SettingsContext.tsx +20 -0
  266. package/dist/ui/contexts/StreamingContext.tsx +22 -0
  267. package/dist/ui/contexts/VimModeContext.tsx +79 -0
  268. package/dist/ui/editors/editorSettingsManager.ts +66 -0
  269. package/dist/ui/hooks/atCommandProcessor.test.ts +1102 -0
  270. package/dist/ui/hooks/atCommandProcessor.ts +485 -0
  271. package/dist/ui/hooks/shellCommandProcessor.test.ts +481 -0
  272. package/dist/ui/hooks/shellCommandProcessor.ts +314 -0
  273. package/dist/ui/hooks/slashCommandProcessor.test.ts +1044 -0
  274. package/dist/ui/hooks/slashCommandProcessor.ts +595 -0
  275. package/dist/ui/hooks/useAtCompletion.test.ts +497 -0
  276. package/dist/ui/hooks/useAtCompletion.ts +244 -0
  277. package/dist/ui/hooks/useAuthCommand.ts +129 -0
  278. package/dist/ui/hooks/useAutoAcceptIndicator.test.ts +300 -0
  279. package/dist/ui/hooks/useAutoAcceptIndicator.ts +52 -0
  280. package/dist/ui/hooks/useBracketedPaste.ts +37 -0
  281. package/dist/ui/hooks/useCommandCompletion.test.ts +518 -0
  282. package/dist/ui/hooks/useCommandCompletion.tsx +238 -0
  283. package/dist/ui/hooks/useCompletion.ts +128 -0
  284. package/dist/ui/hooks/useConsoleMessages.test.ts +147 -0
  285. package/dist/ui/hooks/useConsoleMessages.ts +110 -0
  286. package/dist/ui/hooks/useEditorSettings.test.ts +283 -0
  287. package/dist/ui/hooks/useEditorSettings.ts +75 -0
  288. package/dist/ui/hooks/useFocus.test.ts +119 -0
  289. package/dist/ui/hooks/useFocus.ts +48 -0
  290. package/dist/ui/hooks/useFolderTrust.test.ts +159 -0
  291. package/dist/ui/hooks/useFolderTrust.ts +72 -0
  292. package/dist/ui/hooks/useGeminiStream.test.tsx +1998 -0
  293. package/dist/ui/hooks/useGeminiStream.ts +1017 -0
  294. package/dist/ui/hooks/useGitBranchName.test.ts +280 -0
  295. package/dist/ui/hooks/useGitBranchName.ts +79 -0
  296. package/dist/ui/hooks/useHistoryManager.test.ts +202 -0
  297. package/dist/ui/hooks/useHistoryManager.ts +111 -0
  298. package/dist/ui/hooks/useInputHistory.test.ts +261 -0
  299. package/dist/ui/hooks/useInputHistory.ts +111 -0
  300. package/dist/ui/hooks/useKeypress.test.ts +280 -0
  301. package/dist/ui/hooks/useKeypress.ts +39 -0
  302. package/dist/ui/hooks/useKittyKeyboardProtocol.ts +31 -0
  303. package/dist/ui/hooks/useLoadingIndicator.test.ts +139 -0
  304. package/dist/ui/hooks/useLoadingIndicator.ts +57 -0
  305. package/dist/ui/hooks/useLogger.ts +32 -0
  306. package/dist/ui/hooks/useMessageQueue.test.ts +226 -0
  307. package/dist/ui/hooks/useMessageQueue.ts +69 -0
  308. package/dist/ui/hooks/usePhraseCycler.test.ts +145 -0
  309. package/dist/ui/hooks/usePhraseCycler.ts +198 -0
  310. package/dist/ui/hooks/usePrivacySettings.test.ts +242 -0
  311. package/dist/ui/hooks/usePrivacySettings.ts +150 -0
  312. package/dist/ui/hooks/useReactToolScheduler.ts +309 -0
  313. package/dist/ui/hooks/useRefreshMemoryCommand.ts +7 -0
  314. package/dist/ui/hooks/useReverseSearchCompletion.test.tsx +260 -0
  315. package/dist/ui/hooks/useReverseSearchCompletion.tsx +95 -0
  316. package/dist/ui/hooks/useSettingsCommand.ts +25 -0
  317. package/dist/ui/hooks/useShellHistory.test.ts +219 -0
  318. package/dist/ui/hooks/useShellHistory.ts +133 -0
  319. package/dist/ui/hooks/useShowMemoryCommand.ts +75 -0
  320. package/dist/ui/hooks/useSlashCompletion.test.ts +434 -0
  321. package/dist/ui/hooks/useSlashCompletion.ts +187 -0
  322. package/dist/ui/hooks/useStateAndRef.ts +36 -0
  323. package/dist/ui/hooks/useTerminalSize.ts +32 -0
  324. package/dist/ui/hooks/useThemeCommand.ts +110 -0
  325. package/dist/ui/hooks/useTimer.test.ts +120 -0
  326. package/dist/ui/hooks/useTimer.ts +65 -0
  327. package/dist/ui/hooks/useToolScheduler.test.ts +1123 -0
  328. package/dist/ui/hooks/useWelcomeBack.ts +253 -0
  329. package/dist/ui/hooks/vim.test.ts +1691 -0
  330. package/dist/ui/hooks/vim.ts +784 -0
  331. package/dist/ui/keyMatchers.test.ts +337 -0
  332. package/dist/ui/keyMatchers.ts +105 -0
  333. package/dist/ui/privacy/CloudFreePrivacyNotice.tsx +117 -0
  334. package/dist/ui/privacy/CloudPaidPrivacyNotice.tsx +59 -0
  335. package/dist/ui/privacy/GeminiPrivacyNotice.tsx +62 -0
  336. package/dist/ui/privacy/PrivacyNotice.tsx +42 -0
  337. package/dist/ui/semantic-colors.ts +26 -0
  338. package/dist/ui/themes/ansi-light.ts +150 -0
  339. package/dist/ui/themes/ansi.ts +159 -0
  340. package/dist/ui/themes/atom-one-dark.ts +147 -0
  341. package/dist/ui/themes/ayu-light.ts +139 -0
  342. package/dist/ui/themes/ayu.ts +113 -0
  343. package/dist/ui/themes/color-utils.test.ts +221 -0
  344. package/dist/ui/themes/color-utils.ts +231 -0
  345. package/dist/ui/themes/default-light.ts +108 -0
  346. package/dist/ui/themes/default.ts +151 -0
  347. package/dist/ui/themes/dracula.ts +124 -0
  348. package/dist/ui/themes/fss-code-dark.ts +156 -0
  349. package/dist/ui/themes/fss-dark.ts +113 -0
  350. package/dist/ui/themes/fss-light.ts +139 -0
  351. package/dist/ui/themes/github-dark.ts +147 -0
  352. package/dist/ui/themes/github-light.ts +149 -0
  353. package/dist/ui/themes/googlecode.ts +146 -0
  354. package/dist/ui/themes/no-color.ts +125 -0
  355. package/dist/ui/themes/qwen-dark.ts +118 -0
  356. package/dist/ui/themes/qwen-light.ts +144 -0
  357. package/dist/ui/themes/semantic-tokens.ts +127 -0
  358. package/dist/ui/themes/shades-of-purple.ts +352 -0
  359. package/dist/ui/themes/theme-manager.test.ts +99 -0
  360. package/dist/ui/themes/theme-manager.ts +257 -0
  361. package/dist/ui/themes/theme.test.ts +97 -0
  362. package/dist/ui/themes/theme.ts +451 -0
  363. package/dist/ui/themes/xcode.ts +154 -0
  364. package/dist/ui/types.ts +255 -0
  365. package/dist/ui/utils/CodeColorizer.tsx +217 -0
  366. package/dist/ui/utils/ConsolePatcher.ts +71 -0
  367. package/dist/ui/utils/InlineMarkdownRenderer.tsx +173 -0
  368. package/dist/ui/utils/MarkdownDisplay.test.tsx +244 -0
  369. package/dist/ui/utils/MarkdownDisplay.tsx +415 -0
  370. package/dist/ui/utils/TableRenderer.tsx +159 -0
  371. package/dist/ui/utils/__snapshots__/MarkdownDisplay.test.tsx.snap +93 -0
  372. package/dist/ui/utils/clipboardUtils.test.ts +76 -0
  373. package/dist/ui/utils/clipboardUtils.ts +149 -0
  374. package/dist/ui/utils/commandUtils.test.ts +384 -0
  375. package/dist/ui/utils/commandUtils.ts +106 -0
  376. package/dist/ui/utils/computeStats.test.ts +292 -0
  377. package/dist/ui/utils/computeStats.ts +86 -0
  378. package/dist/ui/utils/displayUtils.test.ts +58 -0
  379. package/dist/ui/utils/displayUtils.ts +32 -0
  380. package/dist/ui/utils/formatters.test.ts +72 -0
  381. package/dist/ui/utils/formatters.ts +63 -0
  382. package/dist/ui/utils/isNarrowWidth.ts +9 -0
  383. package/dist/ui/utils/kittyProtocolDetector.ts +105 -0
  384. package/dist/ui/utils/markdownUtilities.test.ts +50 -0
  385. package/dist/ui/utils/markdownUtilities.ts +125 -0
  386. package/dist/ui/utils/platformConstants.ts +52 -0
  387. package/dist/ui/utils/terminalSetup.ts +342 -0
  388. package/dist/ui/utils/textUtils.ts +40 -0
  389. package/dist/ui/utils/updateCheck.test.ts +163 -0
  390. package/dist/ui/utils/updateCheck.ts +100 -0
  391. package/dist/utils/checks.ts +28 -0
  392. package/dist/utils/cleanup.test.ts +68 -0
  393. package/dist/utils/cleanup.ts +36 -0
  394. package/dist/utils/dialogScopeUtils.ts +64 -0
  395. package/dist/utils/events.ts +14 -0
  396. package/dist/utils/gitUtils.test.ts +149 -0
  397. package/dist/utils/gitUtils.ts +116 -0
  398. package/dist/utils/handleAutoUpdate.test.ts +272 -0
  399. package/dist/utils/handleAutoUpdate.ts +145 -0
  400. package/dist/utils/installationInfo.test.ts +315 -0
  401. package/dist/utils/installationInfo.ts +176 -0
  402. package/dist/utils/package.ts +38 -0
  403. package/dist/utils/readStdin.ts +51 -0
  404. package/dist/utils/resolvePath.ts +21 -0
  405. package/dist/utils/sandbox-macos-permissive-closed.sb +32 -0
  406. package/dist/utils/sandbox-macos-permissive-open.sb +25 -0
  407. package/dist/utils/sandbox-macos-permissive-proxied.sb +37 -0
  408. package/dist/utils/sandbox-macos-restrictive-closed.sb +93 -0
  409. package/dist/utils/sandbox-macos-restrictive-open.sb +96 -0
  410. package/dist/utils/sandbox-macos-restrictive-proxied.sb +98 -0
  411. package/dist/utils/sandbox.ts +962 -0
  412. package/dist/utils/settingsUtils.test.ts +797 -0
  413. package/dist/utils/settingsUtils.ts +489 -0
  414. package/dist/utils/spawnWrapper.ts +9 -0
  415. package/dist/utils/startupWarnings.test.ts +83 -0
  416. package/dist/utils/startupWarnings.ts +40 -0
  417. package/dist/utils/updateEventEmitter.ts +13 -0
  418. package/dist/utils/userStartupWarnings.test.ts +87 -0
  419. package/dist/utils/userStartupWarnings.ts +69 -0
  420. package/dist/utils/version.ts +12 -0
  421. package/dist/validateNonInterActiveAuth.test.ts +260 -0
  422. package/dist/validateNonInterActiveAuth.ts +51 -0
  423. package/dist/vitest.config.ts +37 -0
  424. package/dist/zed-integration/acp.ts +366 -0
  425. package/dist/zed-integration/fileSystemService.ts +47 -0
  426. package/dist/zed-integration/schema.ts +466 -0
  427. package/dist/zed-integration/zedIntegration.ts +944 -0
  428. package/package.json +2 -2
@@ -0,0 +1,531 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import {
8
+ SlashCommand,
9
+ SlashCommandActionReturn,
10
+ CommandContext,
11
+ CommandKind,
12
+ MessageActionReturn,
13
+ } from './types.js';
14
+ import {
15
+ DiscoveredMCPPrompt,
16
+ DiscoveredMCPTool,
17
+ getMCPDiscoveryState,
18
+ getMCPServerStatus,
19
+ MCPDiscoveryState,
20
+ MCPServerStatus,
21
+ mcpServerRequiresOAuth,
22
+ getErrorMessage,
23
+ } from 'fss-link-core';
24
+
25
+ const COLOR_GREEN = '\u001b[32m';
26
+ const COLOR_YELLOW = '\u001b[33m';
27
+ const COLOR_RED = '\u001b[31m';
28
+ const COLOR_CYAN = '\u001b[36m';
29
+ const COLOR_GREY = '\u001b[90m';
30
+ const RESET_COLOR = '\u001b[0m';
31
+
32
+ const getMcpStatus = async (
33
+ context: CommandContext,
34
+ showDescriptions: boolean,
35
+ showSchema: boolean,
36
+ showTips: boolean = false,
37
+ ): Promise<SlashCommandActionReturn> => {
38
+ const { config } = context.services;
39
+ if (!config) {
40
+ return {
41
+ type: 'message',
42
+ messageType: 'error',
43
+ content: 'Config not loaded.',
44
+ };
45
+ }
46
+
47
+ const toolRegistry = config.getToolRegistry();
48
+ if (!toolRegistry) {
49
+ return {
50
+ type: 'message',
51
+ messageType: 'error',
52
+ content: 'Could not retrieve tool registry.',
53
+ };
54
+ }
55
+
56
+ const mcpServers = config.getMcpServers() || {};
57
+ const serverNames = Object.keys(mcpServers);
58
+ const blockedMcpServers = config.getBlockedMcpServers() || [];
59
+
60
+ if (serverNames.length === 0 && blockedMcpServers.length === 0) {
61
+ const docsUrl =
62
+ 'https://docs.anthropic.com/en/docs/claude-code/tools/mcp-server/#how-to-set-up-your-mcp-server';
63
+ return {
64
+ type: 'message',
65
+ messageType: 'info',
66
+ content: `No MCP servers configured. Please view MCP documentation in your browser: ${docsUrl} or use the cli /docs command`,
67
+ };
68
+ }
69
+
70
+ // Check if any servers are still connecting
71
+ const connectingServers = serverNames.filter(
72
+ (name) => getMCPServerStatus(name) === MCPServerStatus.CONNECTING,
73
+ );
74
+ const discoveryState = getMCPDiscoveryState();
75
+
76
+ let message = '';
77
+
78
+ // Add overall discovery status message if needed
79
+ if (
80
+ discoveryState === MCPDiscoveryState.IN_PROGRESS ||
81
+ connectingServers.length > 0
82
+ ) {
83
+ message += `${COLOR_YELLOW}⏳ MCP servers are starting up (${connectingServers.length} initializing)...${RESET_COLOR}\n`;
84
+ message += `${COLOR_CYAN}Note: First startup may take longer. Tool availability will update automatically.${RESET_COLOR}\n\n`;
85
+ }
86
+
87
+ message += 'Configured MCP servers:\n\n';
88
+
89
+ const allTools = toolRegistry.getAllTools();
90
+ for (const serverName of serverNames) {
91
+ const serverTools = allTools.filter(
92
+ (tool) =>
93
+ tool instanceof DiscoveredMCPTool && tool.serverName === serverName,
94
+ ) as DiscoveredMCPTool[];
95
+ const promptRegistry = await config.getPromptRegistry();
96
+ const serverPrompts = promptRegistry.getPromptsByServer(serverName) || [];
97
+
98
+ const originalStatus = getMCPServerStatus(serverName);
99
+ const hasCachedItems = serverTools.length > 0 || serverPrompts.length > 0;
100
+
101
+ // If the server is "disconnected" but has prompts or cached tools, display it as Ready
102
+ // by using CONNECTED as the display status.
103
+ const status =
104
+ originalStatus === MCPServerStatus.DISCONNECTED && hasCachedItems
105
+ ? MCPServerStatus.CONNECTED
106
+ : originalStatus;
107
+
108
+ // Add status indicator with descriptive text
109
+ let statusIndicator = '';
110
+ let statusText = '';
111
+ switch (status) {
112
+ case MCPServerStatus.CONNECTED:
113
+ statusIndicator = '🟢';
114
+ statusText = 'Ready';
115
+ break;
116
+ case MCPServerStatus.CONNECTING:
117
+ statusIndicator = '🔄';
118
+ statusText = 'Starting... (first startup may take longer)';
119
+ break;
120
+ case MCPServerStatus.DISCONNECTED:
121
+ default:
122
+ statusIndicator = '🔴';
123
+ statusText = 'Disconnected';
124
+ break;
125
+ }
126
+
127
+ // Get server description if available
128
+ const server = mcpServers[serverName];
129
+ let serverDisplayName = serverName;
130
+ if (server.extensionName) {
131
+ serverDisplayName += ` (from ${server.extensionName})`;
132
+ }
133
+
134
+ // Format server header with bold formatting and status
135
+ message += `${statusIndicator} \u001b[1m${serverDisplayName}\u001b[0m - ${statusText}`;
136
+
137
+ let needsAuthHint = mcpServerRequiresOAuth.get(serverName) || false;
138
+ // Add OAuth status if applicable
139
+ if (server?.oauth?.enabled) {
140
+ needsAuthHint = true;
141
+ try {
142
+ const { MCPOAuthTokenStorage } = await import(
143
+ 'fss-link-core'
144
+ );
145
+ const hasToken = await MCPOAuthTokenStorage.getToken(serverName);
146
+ if (hasToken) {
147
+ const isExpired = MCPOAuthTokenStorage.isTokenExpired(hasToken.token);
148
+ if (isExpired) {
149
+ message += ` ${COLOR_YELLOW}(OAuth token expired)${RESET_COLOR}`;
150
+ } else {
151
+ message += ` ${COLOR_GREEN}(OAuth authenticated)${RESET_COLOR}`;
152
+ needsAuthHint = false;
153
+ }
154
+ } else {
155
+ message += ` ${COLOR_RED}(OAuth not authenticated)${RESET_COLOR}`;
156
+ }
157
+ } catch (_err) {
158
+ // If we can't check OAuth status, just continue
159
+ }
160
+ }
161
+
162
+ // Add tool count with conditional messaging
163
+ if (status === MCPServerStatus.CONNECTED) {
164
+ const parts = [];
165
+ if (serverTools.length > 0) {
166
+ parts.push(
167
+ `${serverTools.length} ${serverTools.length === 1 ? 'tool' : 'tools'}`,
168
+ );
169
+ }
170
+ if (serverPrompts.length > 0) {
171
+ parts.push(
172
+ `${serverPrompts.length} ${
173
+ serverPrompts.length === 1 ? 'prompt' : 'prompts'
174
+ }`,
175
+ );
176
+ }
177
+ if (parts.length > 0) {
178
+ message += ` (${parts.join(', ')})`;
179
+ } else {
180
+ message += ` (0 tools)`;
181
+ }
182
+ } else if (status === MCPServerStatus.CONNECTING) {
183
+ message += ` (tools and prompts will appear when ready)`;
184
+ } else {
185
+ message += ` (${serverTools.length} tools cached)`;
186
+ }
187
+
188
+ // Add server description with proper handling of multi-line descriptions
189
+ if (showDescriptions && server?.description) {
190
+ const descLines = server.description.trim().split('\n');
191
+ if (descLines) {
192
+ message += ':\n';
193
+ for (const descLine of descLines) {
194
+ message += ` ${COLOR_GREEN}${descLine}${RESET_COLOR}\n`;
195
+ }
196
+ } else {
197
+ message += '\n';
198
+ }
199
+ } else {
200
+ message += '\n';
201
+ }
202
+
203
+ // Reset formatting after server entry
204
+ message += RESET_COLOR;
205
+
206
+ if (serverTools.length > 0) {
207
+ message += ` ${COLOR_CYAN}Tools:${RESET_COLOR}\n`;
208
+ serverTools.forEach((tool) => {
209
+ if (showDescriptions && tool.description) {
210
+ // Format tool name in cyan using simple ANSI cyan color
211
+ message += ` - ${COLOR_CYAN}${tool.name}${RESET_COLOR}`;
212
+
213
+ // Handle multi-line descriptions by properly indenting and preserving formatting
214
+ const descLines = tool.description.trim().split('\n');
215
+ if (descLines) {
216
+ message += ':\n';
217
+ for (const descLine of descLines) {
218
+ message += ` ${COLOR_GREEN}${descLine}${RESET_COLOR}\n`;
219
+ }
220
+ } else {
221
+ message += '\n';
222
+ }
223
+ // Reset is handled inline with each line now
224
+ } else {
225
+ // Use cyan color for the tool name even when not showing descriptions
226
+ message += ` - ${COLOR_CYAN}${tool.name}${RESET_COLOR}\n`;
227
+ }
228
+ const parameters =
229
+ tool.schema.parametersJsonSchema ?? tool.schema.parameters;
230
+ if (showSchema && parameters) {
231
+ // Prefix the parameters in cyan
232
+ message += ` ${COLOR_CYAN}Parameters:${RESET_COLOR}\n`;
233
+
234
+ const paramsLines = JSON.stringify(parameters, null, 2)
235
+ .trim()
236
+ .split('\n');
237
+ if (paramsLines) {
238
+ for (const paramsLine of paramsLines) {
239
+ message += ` ${COLOR_GREEN}${paramsLine}${RESET_COLOR}\n`;
240
+ }
241
+ }
242
+ }
243
+ });
244
+ }
245
+ if (serverPrompts.length > 0) {
246
+ if (serverTools.length > 0) {
247
+ message += '\n';
248
+ }
249
+ message += ` ${COLOR_CYAN}Prompts:${RESET_COLOR}\n`;
250
+ serverPrompts.forEach((prompt: DiscoveredMCPPrompt) => {
251
+ if (showDescriptions && prompt.description) {
252
+ message += ` - ${COLOR_CYAN}${prompt.name}${RESET_COLOR}`;
253
+ const descLines = prompt.description.trim().split('\n');
254
+ if (descLines) {
255
+ message += ':\n';
256
+ for (const descLine of descLines) {
257
+ message += ` ${COLOR_GREEN}${descLine}${RESET_COLOR}\n`;
258
+ }
259
+ } else {
260
+ message += '\n';
261
+ }
262
+ } else {
263
+ message += ` - ${COLOR_CYAN}${prompt.name}${RESET_COLOR}\n`;
264
+ }
265
+ });
266
+ }
267
+
268
+ if (serverTools.length === 0 && serverPrompts.length === 0) {
269
+ message += ' No tools or prompts available\n';
270
+ } else if (serverTools.length === 0) {
271
+ message += ' No tools available';
272
+ if (originalStatus === MCPServerStatus.DISCONNECTED && needsAuthHint) {
273
+ message += ` ${COLOR_GREY}(type: "/mcp auth ${serverName}" to authenticate this server)${RESET_COLOR}`;
274
+ }
275
+ message += '\n';
276
+ } else if (
277
+ originalStatus === MCPServerStatus.DISCONNECTED &&
278
+ needsAuthHint
279
+ ) {
280
+ // This case is for when serverTools.length > 0
281
+ message += ` ${COLOR_GREY}(type: "/mcp auth ${serverName}" to authenticate this server)${RESET_COLOR}\n`;
282
+ }
283
+ message += '\n';
284
+ }
285
+
286
+ for (const server of blockedMcpServers) {
287
+ let serverDisplayName = server.name;
288
+ if (server.extensionName) {
289
+ serverDisplayName += ` (from ${server.extensionName})`;
290
+ }
291
+ message += `🔴 \u001b[1m${serverDisplayName}\u001b[0m - Blocked\n\n`;
292
+ }
293
+
294
+ // Add helpful tips when no arguments are provided
295
+ if (showTips) {
296
+ message += '\n';
297
+ message += `${COLOR_CYAN}💡 Tips:${RESET_COLOR}\n`;
298
+ message += ` • Use ${COLOR_CYAN}/mcp desc${RESET_COLOR} to show server and tool descriptions\n`;
299
+ message += ` • Use ${COLOR_CYAN}/mcp schema${RESET_COLOR} to show tool parameter schemas\n`;
300
+ message += ` • Use ${COLOR_CYAN}/mcp nodesc${RESET_COLOR} to hide descriptions\n`;
301
+ message += ` • Use ${COLOR_CYAN}/mcp auth <server-name>${RESET_COLOR} to authenticate with OAuth-enabled servers\n`;
302
+ message += ` • Press ${COLOR_CYAN}Ctrl+T${RESET_COLOR} to toggle tool descriptions on/off\n`;
303
+ message += '\n';
304
+ }
305
+
306
+ // Make sure to reset any ANSI formatting at the end to prevent it from affecting the terminal
307
+ message += RESET_COLOR;
308
+
309
+ return {
310
+ type: 'message',
311
+ messageType: 'info',
312
+ content: message,
313
+ };
314
+ };
315
+
316
+ const authCommand: SlashCommand = {
317
+ name: 'auth',
318
+ description: 'Authenticate with an OAuth-enabled MCP server',
319
+ kind: CommandKind.BUILT_IN,
320
+ action: async (
321
+ context: CommandContext,
322
+ args: string,
323
+ ): Promise<MessageActionReturn> => {
324
+ const serverName = args.trim();
325
+ const { config } = context.services;
326
+
327
+ if (!config) {
328
+ return {
329
+ type: 'message',
330
+ messageType: 'error',
331
+ content: 'Config not loaded.',
332
+ };
333
+ }
334
+
335
+ const mcpServers = config.getMcpServers() || {};
336
+
337
+ if (!serverName) {
338
+ // List servers that support OAuth
339
+ const oauthServers = Object.entries(mcpServers)
340
+ .filter(([_, server]) => server.oauth?.enabled)
341
+ .map(([name, _]) => name);
342
+
343
+ if (oauthServers.length === 0) {
344
+ return {
345
+ type: 'message',
346
+ messageType: 'info',
347
+ content: 'No MCP servers configured with OAuth authentication.',
348
+ };
349
+ }
350
+
351
+ return {
352
+ type: 'message',
353
+ messageType: 'info',
354
+ content: `MCP servers with OAuth authentication:\n${oauthServers.map((s) => ` - ${s}`).join('\n')}\n\nUse /mcp auth <server-name> to authenticate.`,
355
+ };
356
+ }
357
+
358
+ const server = mcpServers[serverName];
359
+ if (!server) {
360
+ return {
361
+ type: 'message',
362
+ messageType: 'error',
363
+ content: `MCP server '${serverName}' not found.`,
364
+ };
365
+ }
366
+
367
+ // Always attempt OAuth authentication, even if not explicitly configured
368
+ // The authentication process will discover OAuth requirements automatically
369
+
370
+ try {
371
+ context.ui.addItem(
372
+ {
373
+ type: 'info',
374
+ text: `Starting OAuth authentication for MCP server '${serverName}'...`,
375
+ },
376
+ Date.now(),
377
+ );
378
+
379
+ // Import dynamically to avoid circular dependencies
380
+ const { MCPOAuthProvider } = await import('fss-link-core');
381
+
382
+ let oauthConfig = server.oauth;
383
+ if (!oauthConfig) {
384
+ oauthConfig = { enabled: false };
385
+ }
386
+
387
+ // Pass the MCP server URL for OAuth discovery
388
+ const mcpServerUrl = server.httpUrl || server.url;
389
+ await MCPOAuthProvider.authenticate(
390
+ serverName,
391
+ oauthConfig,
392
+ mcpServerUrl,
393
+ );
394
+
395
+ context.ui.addItem(
396
+ {
397
+ type: 'info',
398
+ text: `✅ Successfully authenticated with MCP server '${serverName}'!`,
399
+ },
400
+ Date.now(),
401
+ );
402
+
403
+ // Trigger tool re-discovery to pick up authenticated server
404
+ const toolRegistry = config.getToolRegistry();
405
+ if (toolRegistry) {
406
+ context.ui.addItem(
407
+ {
408
+ type: 'info',
409
+ text: `Re-discovering tools from '${serverName}'...`,
410
+ },
411
+ Date.now(),
412
+ );
413
+ await toolRegistry.discoverToolsForServer(serverName);
414
+ }
415
+ // Update the client with the new tools
416
+ const geminiClient = config.getGeminiClient();
417
+ if (geminiClient) {
418
+ await geminiClient.setTools();
419
+ }
420
+
421
+ // Reload the slash commands to reflect the changes.
422
+ context.ui.reloadCommands();
423
+
424
+ return {
425
+ type: 'message',
426
+ messageType: 'info',
427
+ content: `Successfully authenticated and refreshed tools for '${serverName}'.`,
428
+ };
429
+ } catch (error) {
430
+ return {
431
+ type: 'message',
432
+ messageType: 'error',
433
+ content: `Failed to authenticate with MCP server '${serverName}': ${getErrorMessage(error)}`,
434
+ };
435
+ }
436
+ },
437
+ completion: async (context: CommandContext, partialArg: string) => {
438
+ const { config } = context.services;
439
+ if (!config) return [];
440
+
441
+ const mcpServers = config.getMcpServers() || {};
442
+ return Object.keys(mcpServers).filter((name) =>
443
+ name.startsWith(partialArg),
444
+ );
445
+ },
446
+ };
447
+
448
+ const listCommand: SlashCommand = {
449
+ name: 'list',
450
+ description: 'List configured MCP servers and tools',
451
+ kind: CommandKind.BUILT_IN,
452
+ action: async (context: CommandContext, args: string) => {
453
+ const lowerCaseArgs = args.toLowerCase().split(/\s+/).filter(Boolean);
454
+
455
+ const hasDesc =
456
+ lowerCaseArgs.includes('desc') || lowerCaseArgs.includes('descriptions');
457
+ const hasNodesc =
458
+ lowerCaseArgs.includes('nodesc') ||
459
+ lowerCaseArgs.includes('nodescriptions');
460
+ const showSchema = lowerCaseArgs.includes('schema');
461
+
462
+ // Show descriptions if `desc` or `schema` is present,
463
+ // but `nodesc` takes precedence and disables them.
464
+ const showDescriptions = !hasNodesc && (hasDesc || showSchema);
465
+
466
+ // Show tips only when no arguments are provided
467
+ const showTips = lowerCaseArgs.length === 0;
468
+
469
+ return getMcpStatus(context, showDescriptions, showSchema, showTips);
470
+ },
471
+ };
472
+
473
+ const refreshCommand: SlashCommand = {
474
+ name: 'refresh',
475
+ description: 'Restarts MCP servers.',
476
+ kind: CommandKind.BUILT_IN,
477
+ action: async (
478
+ context: CommandContext,
479
+ ): Promise<SlashCommandActionReturn> => {
480
+ const { config } = context.services;
481
+ if (!config) {
482
+ return {
483
+ type: 'message',
484
+ messageType: 'error',
485
+ content: 'Config not loaded.',
486
+ };
487
+ }
488
+
489
+ const toolRegistry = config.getToolRegistry();
490
+ if (!toolRegistry) {
491
+ return {
492
+ type: 'message',
493
+ messageType: 'error',
494
+ content: 'Could not retrieve tool registry.',
495
+ };
496
+ }
497
+
498
+ context.ui.addItem(
499
+ {
500
+ type: 'info',
501
+ text: 'Restarting MCP servers...',
502
+ },
503
+ Date.now(),
504
+ );
505
+
506
+ await toolRegistry.restartMcpServers();
507
+
508
+ // Update the client with the new tools
509
+ const geminiClient = config.getGeminiClient();
510
+ if (geminiClient) {
511
+ await geminiClient.setTools();
512
+ }
513
+
514
+ // Reload the slash commands to reflect the changes.
515
+ context.ui.reloadCommands();
516
+
517
+ return getMcpStatus(context, false, false, false);
518
+ },
519
+ };
520
+
521
+ export const mcpCommand: SlashCommand = {
522
+ name: 'mcp',
523
+ description:
524
+ 'list configured MCP servers and tools, or authenticate with OAuth-enabled servers',
525
+ kind: CommandKind.BUILT_IN,
526
+ subCommands: [listCommand, authCommand, refreshCommand],
527
+ // Default action when no subcommand is provided
528
+ action: async (context: CommandContext, args: string) =>
529
+ // If no subcommand, run the list command
530
+ listCommand.action!(context, args),
531
+ };