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