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,384 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { vi, describe, it, expect, beforeEach, Mock } from 'vitest';
8
+ import { spawn } from 'child_process';
9
+ import { EventEmitter } from 'events';
10
+ import {
11
+ isAtCommand,
12
+ isSlashCommand,
13
+ copyToClipboard,
14
+ getUrlOpenCommand,
15
+ } from './commandUtils.js';
16
+
17
+ // Mock child_process
18
+ vi.mock('child_process');
19
+
20
+ // Mock process.platform for platform-specific tests
21
+ const mockProcess = vi.hoisted(() => ({
22
+ platform: 'darwin',
23
+ }));
24
+
25
+ vi.stubGlobal('process', {
26
+ ...process,
27
+ get platform() {
28
+ return mockProcess.platform;
29
+ },
30
+ });
31
+
32
+ interface MockChildProcess extends EventEmitter {
33
+ stdin: EventEmitter & {
34
+ write: Mock;
35
+ end: Mock;
36
+ };
37
+ stderr: EventEmitter;
38
+ }
39
+
40
+ describe('commandUtils', () => {
41
+ let mockSpawn: Mock;
42
+ let mockChild: MockChildProcess;
43
+
44
+ beforeEach(async () => {
45
+ vi.clearAllMocks();
46
+ // Dynamically import and set up spawn mock
47
+ const { spawn } = await import('child_process');
48
+ mockSpawn = spawn as Mock;
49
+
50
+ // Create mock child process with stdout/stderr emitters
51
+ mockChild = Object.assign(new EventEmitter(), {
52
+ stdin: Object.assign(new EventEmitter(), {
53
+ write: vi.fn(),
54
+ end: vi.fn(),
55
+ }),
56
+ stderr: new EventEmitter(),
57
+ }) as MockChildProcess;
58
+
59
+ mockSpawn.mockReturnValue(mockChild as unknown as ReturnType<typeof spawn>);
60
+ });
61
+
62
+ describe('isAtCommand', () => {
63
+ it('should return true when query starts with @', () => {
64
+ expect(isAtCommand('@file')).toBe(true);
65
+ expect(isAtCommand('@path/to/file')).toBe(true);
66
+ expect(isAtCommand('@')).toBe(true);
67
+ });
68
+
69
+ it('should return true when query contains @ preceded by whitespace', () => {
70
+ expect(isAtCommand('hello @file')).toBe(true);
71
+ expect(isAtCommand('some text @path/to/file')).toBe(true);
72
+ expect(isAtCommand(' @file')).toBe(true);
73
+ });
74
+
75
+ it('should return false when query does not start with @ and has no spaced @', () => {
76
+ expect(isAtCommand('file')).toBe(false);
77
+ expect(isAtCommand('hello')).toBe(false);
78
+ expect(isAtCommand('')).toBe(false);
79
+ expect(isAtCommand('email@domain.com')).toBe(false);
80
+ expect(isAtCommand('user@host')).toBe(false);
81
+ });
82
+
83
+ it('should return false when @ is not preceded by whitespace', () => {
84
+ expect(isAtCommand('hello@file')).toBe(false);
85
+ expect(isAtCommand('text@path')).toBe(false);
86
+ });
87
+ });
88
+
89
+ describe('isSlashCommand', () => {
90
+ it('should return true when query starts with /', () => {
91
+ expect(isSlashCommand('/help')).toBe(true);
92
+ expect(isSlashCommand('/memory show')).toBe(true);
93
+ expect(isSlashCommand('/clear')).toBe(true);
94
+ expect(isSlashCommand('/')).toBe(true);
95
+ });
96
+
97
+ it('should return false when query does not start with /', () => {
98
+ expect(isSlashCommand('help')).toBe(false);
99
+ expect(isSlashCommand('memory show')).toBe(false);
100
+ expect(isSlashCommand('')).toBe(false);
101
+ expect(isSlashCommand('path/to/file')).toBe(false);
102
+ expect(isSlashCommand(' /help')).toBe(false);
103
+ });
104
+ });
105
+
106
+ describe('copyToClipboard', () => {
107
+ describe('on macOS (darwin)', () => {
108
+ beforeEach(() => {
109
+ mockProcess.platform = 'darwin';
110
+ });
111
+
112
+ it('should successfully copy text to clipboard using pbcopy', async () => {
113
+ const testText = 'Hello, world!';
114
+
115
+ // Simulate successful execution
116
+ setTimeout(() => {
117
+ mockChild.emit('close', 0);
118
+ }, 0);
119
+
120
+ await copyToClipboard(testText);
121
+
122
+ expect(mockSpawn).toHaveBeenCalledWith('pbcopy', []);
123
+ expect(mockChild.stdin.write).toHaveBeenCalledWith(testText);
124
+ expect(mockChild.stdin.end).toHaveBeenCalled();
125
+ });
126
+
127
+ it('should handle pbcopy command failure', async () => {
128
+ const testText = 'Hello, world!';
129
+
130
+ // Simulate command failure
131
+ setTimeout(() => {
132
+ mockChild.stderr.emit('data', 'Command not found');
133
+ mockChild.emit('close', 1);
134
+ }, 0);
135
+
136
+ await expect(copyToClipboard(testText)).rejects.toThrow(
137
+ "'pbcopy' exited with code 1: Command not found",
138
+ );
139
+ });
140
+
141
+ it('should handle spawn error', async () => {
142
+ const testText = 'Hello, world!';
143
+
144
+ setTimeout(() => {
145
+ mockChild.emit('error', new Error('spawn error'));
146
+ }, 0);
147
+
148
+ await expect(copyToClipboard(testText)).rejects.toThrow('spawn error');
149
+ });
150
+
151
+ it('should handle stdin write error', async () => {
152
+ const testText = 'Hello, world!';
153
+
154
+ setTimeout(() => {
155
+ mockChild.stdin.emit('error', new Error('stdin error'));
156
+ }, 0);
157
+
158
+ await expect(copyToClipboard(testText)).rejects.toThrow('stdin error');
159
+ });
160
+ });
161
+
162
+ describe('on Windows (win32)', () => {
163
+ beforeEach(() => {
164
+ mockProcess.platform = 'win32';
165
+ });
166
+
167
+ it('should successfully copy text to clipboard using clip', async () => {
168
+ const testText = 'Hello, world!';
169
+
170
+ setTimeout(() => {
171
+ mockChild.emit('close', 0);
172
+ }, 0);
173
+
174
+ await copyToClipboard(testText);
175
+
176
+ expect(mockSpawn).toHaveBeenCalledWith('clip', []);
177
+ expect(mockChild.stdin.write).toHaveBeenCalledWith(testText);
178
+ expect(mockChild.stdin.end).toHaveBeenCalled();
179
+ });
180
+ });
181
+
182
+ describe('on Linux', () => {
183
+ beforeEach(() => {
184
+ mockProcess.platform = 'linux';
185
+ });
186
+
187
+ it('should successfully copy text to clipboard using xclip', async () => {
188
+ const testText = 'Hello, world!';
189
+
190
+ setTimeout(() => {
191
+ mockChild.emit('close', 0);
192
+ }, 0);
193
+
194
+ await copyToClipboard(testText);
195
+
196
+ expect(mockSpawn).toHaveBeenCalledWith('xclip', [
197
+ '-selection',
198
+ 'clipboard',
199
+ ]);
200
+ expect(mockChild.stdin.write).toHaveBeenCalledWith(testText);
201
+ expect(mockChild.stdin.end).toHaveBeenCalled();
202
+ });
203
+
204
+ it('should fall back to xsel when xclip fails', async () => {
205
+ const testText = 'Hello, world!';
206
+ let callCount = 0;
207
+
208
+ mockSpawn.mockImplementation(() => {
209
+ const child = Object.assign(new EventEmitter(), {
210
+ stdin: Object.assign(new EventEmitter(), {
211
+ write: vi.fn(),
212
+ end: vi.fn(),
213
+ }),
214
+ stderr: new EventEmitter(),
215
+ }) as MockChildProcess;
216
+
217
+ setTimeout(() => {
218
+ if (callCount === 0) {
219
+ // First call (xclip) fails
220
+ child.stderr.emit('data', 'xclip not found');
221
+ child.emit('close', 1);
222
+ callCount++;
223
+ } else {
224
+ // Second call (xsel) succeeds
225
+ child.emit('close', 0);
226
+ }
227
+ }, 0);
228
+
229
+ return child as unknown as ReturnType<typeof spawn>;
230
+ });
231
+
232
+ await copyToClipboard(testText);
233
+
234
+ expect(mockSpawn).toHaveBeenCalledTimes(2);
235
+ expect(mockSpawn).toHaveBeenNthCalledWith(1, 'xclip', [
236
+ '-selection',
237
+ 'clipboard',
238
+ ]);
239
+ expect(mockSpawn).toHaveBeenNthCalledWith(2, 'xsel', [
240
+ '--clipboard',
241
+ '--input',
242
+ ]);
243
+ });
244
+
245
+ it('should throw error when both xclip and xsel fail', async () => {
246
+ const testText = 'Hello, world!';
247
+ let callCount = 0;
248
+
249
+ mockSpawn.mockImplementation(() => {
250
+ const child = Object.assign(new EventEmitter(), {
251
+ stdin: Object.assign(new EventEmitter(), {
252
+ write: vi.fn(),
253
+ end: vi.fn(),
254
+ }),
255
+ stderr: new EventEmitter(),
256
+ });
257
+
258
+ setTimeout(() => {
259
+ if (callCount === 0) {
260
+ // First call (xclip) fails
261
+ child.stderr.emit('data', 'xclip command not found');
262
+ child.emit('close', 1);
263
+ callCount++;
264
+ } else {
265
+ // Second call (xsel) fails
266
+ child.stderr.emit('data', 'xsel command not found');
267
+ child.emit('close', 1);
268
+ }
269
+ }, 0);
270
+
271
+ return child as unknown as ReturnType<typeof spawn>;
272
+ });
273
+
274
+ await expect(copyToClipboard(testText)).rejects.toThrow(
275
+ /All copy commands failed/,
276
+ );
277
+
278
+ expect(mockSpawn).toHaveBeenCalledTimes(2);
279
+ });
280
+ });
281
+
282
+ describe('on unsupported platform', () => {
283
+ beforeEach(() => {
284
+ mockProcess.platform = 'unsupported';
285
+ });
286
+
287
+ it('should throw error for unsupported platform', async () => {
288
+ await expect(copyToClipboard('test')).rejects.toThrow(
289
+ 'Unsupported platform: unsupported',
290
+ );
291
+ });
292
+ });
293
+
294
+ describe('error handling', () => {
295
+ beforeEach(() => {
296
+ mockProcess.platform = 'darwin';
297
+ });
298
+
299
+ it('should handle command exit without stderr', async () => {
300
+ const testText = 'Hello, world!';
301
+
302
+ setTimeout(() => {
303
+ mockChild.emit('close', 1);
304
+ }, 0);
305
+
306
+ await expect(copyToClipboard(testText)).rejects.toThrow(
307
+ "'pbcopy' exited with code 1",
308
+ );
309
+ });
310
+
311
+ it('should handle empty text', async () => {
312
+ setTimeout(() => {
313
+ mockChild.emit('close', 0);
314
+ }, 0);
315
+
316
+ await copyToClipboard('');
317
+
318
+ expect(mockChild.stdin.write).toHaveBeenCalledWith('');
319
+ });
320
+
321
+ it('should handle multiline text', async () => {
322
+ const multilineText = 'Line 1\nLine 2\nLine 3';
323
+
324
+ setTimeout(() => {
325
+ mockChild.emit('close', 0);
326
+ }, 0);
327
+
328
+ await copyToClipboard(multilineText);
329
+
330
+ expect(mockChild.stdin.write).toHaveBeenCalledWith(multilineText);
331
+ });
332
+
333
+ it('should handle special characters', async () => {
334
+ const specialText = 'Special chars: !@#$%^&*()_+-=[]{}|;:,.<>?';
335
+
336
+ setTimeout(() => {
337
+ mockChild.emit('close', 0);
338
+ }, 0);
339
+
340
+ await copyToClipboard(specialText);
341
+
342
+ expect(mockChild.stdin.write).toHaveBeenCalledWith(specialText);
343
+ });
344
+ });
345
+ });
346
+
347
+ describe('getUrlOpenCommand', () => {
348
+ describe('on macOS (darwin)', () => {
349
+ beforeEach(() => {
350
+ mockProcess.platform = 'darwin';
351
+ });
352
+ it('should return open', () => {
353
+ expect(getUrlOpenCommand()).toBe('open');
354
+ });
355
+ });
356
+
357
+ describe('on Windows (win32)', () => {
358
+ beforeEach(() => {
359
+ mockProcess.platform = 'win32';
360
+ });
361
+ it('should return start', () => {
362
+ expect(getUrlOpenCommand()).toBe('start');
363
+ });
364
+ });
365
+
366
+ describe('on Linux (linux)', () => {
367
+ beforeEach(() => {
368
+ mockProcess.platform = 'linux';
369
+ });
370
+ it('should return xdg-open', () => {
371
+ expect(getUrlOpenCommand()).toBe('xdg-open');
372
+ });
373
+ });
374
+
375
+ describe('on unmatched OS', () => {
376
+ beforeEach(() => {
377
+ mockProcess.platform = 'unmatched';
378
+ });
379
+ it('should return xdg-open', () => {
380
+ expect(getUrlOpenCommand()).toBe('xdg-open');
381
+ });
382
+ });
383
+ });
384
+ });
@@ -0,0 +1,106 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { spawn } from 'child_process';
8
+
9
+ /**
10
+ * Checks if a query string potentially represents an '@' command.
11
+ * It triggers if the query starts with '@' or contains '@' preceded by whitespace
12
+ * and followed by a non-whitespace character.
13
+ *
14
+ * @param query The input query string.
15
+ * @returns True if the query looks like an '@' command, false otherwise.
16
+ */
17
+ export const isAtCommand = (query: string): boolean =>
18
+ // Check if starts with @ OR has a space, then @
19
+ query.startsWith('@') || /\s@/.test(query);
20
+
21
+ /**
22
+ * Checks if a query string potentially represents an '/' command.
23
+ * It triggers if the query starts with '/'
24
+ *
25
+ * @param query The input query string.
26
+ * @returns True if the query looks like an '/' command, false otherwise.
27
+ */
28
+ export const isSlashCommand = (query: string): boolean => query.startsWith('/');
29
+
30
+ // Copies a string snippet to the clipboard for different platforms
31
+ export const copyToClipboard = async (text: string): Promise<void> => {
32
+ const run = (cmd: string, args: string[]) =>
33
+ new Promise<void>((resolve, reject) => {
34
+ const child = spawn(cmd, args);
35
+ let stderr = '';
36
+ child.stderr.on('data', (chunk) => (stderr += chunk.toString()));
37
+ child.on('error', reject);
38
+ child.on('close', (code) => {
39
+ if (code === 0) return resolve();
40
+ const errorMsg = stderr.trim();
41
+ reject(
42
+ new Error(
43
+ `'${cmd}' exited with code ${code}${errorMsg ? `: ${errorMsg}` : ''}`,
44
+ ),
45
+ );
46
+ });
47
+ child.stdin.on('error', reject);
48
+ child.stdin.write(text);
49
+ child.stdin.end();
50
+ });
51
+
52
+ switch (process.platform) {
53
+ case 'win32':
54
+ return run('clip', []);
55
+ case 'darwin':
56
+ return run('pbcopy', []);
57
+ case 'linux':
58
+ try {
59
+ await run('xclip', ['-selection', 'clipboard']);
60
+ } catch (primaryError) {
61
+ try {
62
+ // If xclip fails for any reason, try xsel as a fallback.
63
+ await run('xsel', ['--clipboard', '--input']);
64
+ } catch (fallbackError) {
65
+ const primaryMsg =
66
+ primaryError instanceof Error
67
+ ? primaryError.message
68
+ : String(primaryError);
69
+ const fallbackMsg =
70
+ fallbackError instanceof Error
71
+ ? fallbackError.message
72
+ : String(fallbackError);
73
+ throw new Error(
74
+ `All copy commands failed. xclip: "${primaryMsg}", xsel: "${fallbackMsg}". Please ensure xclip or xsel is installed and configured.`,
75
+ );
76
+ }
77
+ }
78
+ return;
79
+ default:
80
+ throw new Error(`Unsupported platform: ${process.platform}`);
81
+ }
82
+ };
83
+
84
+ export const getUrlOpenCommand = (): string => {
85
+ // --- Determine the OS-specific command to open URLs ---
86
+ let openCmd: string;
87
+ switch (process.platform) {
88
+ case 'darwin':
89
+ openCmd = 'open';
90
+ break;
91
+ case 'win32':
92
+ openCmd = 'start';
93
+ break;
94
+ case 'linux':
95
+ openCmd = 'xdg-open';
96
+ break;
97
+ default:
98
+ // Default to xdg-open, which appears to be supported for the less popular operating systems.
99
+ openCmd = 'xdg-open';
100
+ console.warn(
101
+ `Unknown platform: ${process.platform}. Attempting to open URLs with: ${openCmd}.`,
102
+ );
103
+ break;
104
+ }
105
+ return openCmd;
106
+ };