@google/gemini-cli 0.1.20 → 0.1.22

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 (328) hide show
  1. package/README.md +27 -29
  2. package/dist/package.json +4 -4
  3. package/dist/src/commands/mcp/add.js +21 -10
  4. package/dist/src/commands/mcp/add.js.map +1 -1
  5. package/dist/src/commands/mcp/remove.js +2 -2
  6. package/dist/src/commands/mcp/remove.js.map +1 -1
  7. package/dist/src/config/auth.js +4 -3
  8. package/dist/src/config/auth.js.map +1 -1
  9. package/dist/src/config/auth.test.d.ts +6 -0
  10. package/dist/src/config/auth.test.js +57 -0
  11. package/dist/src/config/auth.test.js.map +1 -0
  12. package/dist/src/config/config.d.ts +2 -1
  13. package/dist/src/config/config.js +28 -18
  14. package/dist/src/config/config.js.map +1 -1
  15. package/dist/src/config/keyBindings.js +7 -2
  16. package/dist/src/config/keyBindings.js.map +1 -1
  17. package/dist/src/config/keyBindings.test.d.ts +6 -0
  18. package/dist/src/config/keyBindings.test.js +51 -0
  19. package/dist/src/config/keyBindings.test.js.map +1 -0
  20. package/dist/src/config/sandboxConfig.js +3 -3
  21. package/dist/src/config/sandboxConfig.js.map +1 -1
  22. package/dist/src/config/settings.js +7 -7
  23. package/dist/src/config/settings.js.map +1 -1
  24. package/dist/src/config/settingsSchema.test.d.ts +6 -0
  25. package/dist/src/config/settingsSchema.test.js +195 -0
  26. package/dist/src/config/settingsSchema.test.js.map +1 -0
  27. package/dist/src/config/trustedFolders.d.ts +37 -0
  28. package/dist/src/config/trustedFolders.js +118 -0
  29. package/dist/src/config/trustedFolders.js.map +1 -0
  30. package/dist/src/config/trustedFolders.test.d.ts +6 -0
  31. package/dist/src/config/trustedFolders.test.js +160 -0
  32. package/dist/src/config/trustedFolders.test.js.map +1 -0
  33. package/dist/src/gemini.js +23 -10
  34. package/dist/src/gemini.js.map +1 -1
  35. package/dist/src/gemini.test.d.ts +6 -0
  36. package/dist/src/gemini.test.js +193 -0
  37. package/dist/src/gemini.test.js.map +1 -0
  38. package/dist/src/generated/git-commit.d.ts +2 -1
  39. package/dist/src/generated/git-commit.js +2 -1
  40. package/dist/src/generated/git-commit.js.map +1 -1
  41. package/dist/src/nonInteractiveCli.js +1 -4
  42. package/dist/src/nonInteractiveCli.js.map +1 -1
  43. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  44. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  45. package/dist/src/services/BuiltinCommandLoader.test.d.ts +6 -0
  46. package/dist/src/services/BuiltinCommandLoader.test.js +108 -0
  47. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -0
  48. package/dist/src/services/CommandService.test.d.ts +6 -0
  49. package/dist/src/services/CommandService.test.js +232 -0
  50. package/dist/src/services/CommandService.test.js.map +1 -0
  51. package/dist/src/services/FileCommandLoader.js +10 -8
  52. package/dist/src/services/FileCommandLoader.js.map +1 -1
  53. package/dist/src/services/McpPromptLoader.js +3 -3
  54. package/dist/src/services/McpPromptLoader.js.map +1 -1
  55. package/dist/src/services/prompt-processors/argumentProcessor.d.ts +2 -7
  56. package/dist/src/services/prompt-processors/argumentProcessor.js +2 -10
  57. package/dist/src/services/prompt-processors/argumentProcessor.js.map +1 -1
  58. package/dist/src/services/prompt-processors/shellProcessor.d.ts +16 -13
  59. package/dist/src/services/prompt-processors/shellProcessor.js +133 -40
  60. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
  61. package/dist/src/services/prompt-processors/types.d.ts +2 -0
  62. package/dist/src/services/prompt-processors/types.js +2 -0
  63. package/dist/src/services/prompt-processors/types.js.map +1 -1
  64. package/dist/src/test-utils/customMatchers.d.ts +14 -0
  65. package/dist/src/test-utils/customMatchers.js +46 -0
  66. package/dist/src/test-utils/customMatchers.js.map +1 -0
  67. package/dist/src/test-utils/mockCommandContext.d.ts +18 -0
  68. package/dist/src/test-utils/mockCommandContext.js +86 -0
  69. package/dist/src/test-utils/mockCommandContext.js.map +1 -0
  70. package/dist/src/test-utils/mockCommandContext.test.d.ts +6 -0
  71. package/dist/src/test-utils/mockCommandContext.test.js +51 -0
  72. package/dist/src/test-utils/mockCommandContext.test.js.map +1 -0
  73. package/dist/src/test-utils/render.d.ts +8 -0
  74. package/dist/src/test-utils/render.js +10 -0
  75. package/dist/src/test-utils/render.js.map +1 -0
  76. package/dist/src/ui/App.js +14 -6
  77. package/dist/src/ui/App.js.map +1 -1
  78. package/dist/src/ui/IdeIntegrationNudge.js +3 -3
  79. package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
  80. package/dist/src/ui/commands/aboutCommand.js +8 -5
  81. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  82. package/dist/src/ui/commands/bugCommand.js +6 -4
  83. package/dist/src/ui/commands/bugCommand.js.map +1 -1
  84. package/dist/src/ui/commands/chatCommand.js +8 -6
  85. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  86. package/dist/src/ui/commands/directoryCommand.js +2 -4
  87. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  88. package/dist/src/ui/commands/docsCommand.js +1 -1
  89. package/dist/src/ui/commands/docsCommand.js.map +1 -1
  90. package/dist/src/ui/commands/ideCommand.js +2 -2
  91. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  92. package/dist/src/ui/commands/mcpCommand.js +4 -0
  93. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  94. package/dist/src/ui/commands/setupGithubCommand.test.d.ts +6 -0
  95. package/dist/src/ui/commands/setupGithubCommand.test.js +74 -0
  96. package/dist/src/ui/commands/setupGithubCommand.test.js.map +1 -0
  97. package/dist/src/ui/commands/terminalSetupCommand.d.ts +13 -0
  98. package/dist/src/ui/commands/terminalSetupCommand.js +41 -0
  99. package/dist/src/ui/commands/terminalSetupCommand.js.map +1 -0
  100. package/dist/src/ui/commands/types.d.ts +1 -0
  101. package/dist/src/ui/commands/types.js.map +1 -1
  102. package/dist/src/ui/components/AboutBox.d.ts +1 -0
  103. package/dist/src/ui/components/AboutBox.js +1 -1
  104. package/dist/src/ui/components/AboutBox.js.map +1 -1
  105. package/dist/src/ui/components/AuthDialog.js +8 -8
  106. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  107. package/dist/src/ui/components/AuthDialog.test.d.ts +6 -0
  108. package/dist/src/ui/components/AuthDialog.test.js +242 -0
  109. package/dist/src/ui/components/AuthDialog.test.js.map +1 -0
  110. package/dist/src/ui/components/ContextSummaryDisplay.js +1 -1
  111. package/dist/src/ui/components/FolderTrustDialog.test.d.ts +6 -0
  112. package/dist/src/ui/components/FolderTrustDialog.test.js +26 -0
  113. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -0
  114. package/dist/src/ui/components/Footer.d.ts +1 -0
  115. package/dist/src/ui/components/Footer.js +3 -2
  116. package/dist/src/ui/components/Footer.js.map +1 -1
  117. package/dist/src/ui/components/Header.test.d.ts +6 -0
  118. package/dist/src/ui/components/Header.test.js +37 -0
  119. package/dist/src/ui/components/Header.test.js.map +1 -0
  120. package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
  121. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  122. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +6 -0
  123. package/dist/src/ui/components/HistoryItemDisplay.test.js +91 -0
  124. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -0
  125. package/dist/src/ui/components/InputPrompt.js +3 -1
  126. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  127. package/dist/src/ui/components/LoadingIndicator.test.d.ts +6 -0
  128. package/dist/src/ui/components/LoadingIndicator.test.js +190 -0
  129. package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -0
  130. package/dist/src/ui/components/SettingsDialog.test.d.ts +6 -0
  131. package/dist/src/ui/components/SettingsDialog.test.js +555 -0
  132. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -0
  133. package/dist/src/ui/components/ShellConfirmationDialog.js +2 -1
  134. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
  135. package/dist/src/ui/components/ShellConfirmationDialog.test.d.ts +6 -0
  136. package/dist/src/ui/components/ShellConfirmationDialog.test.js +40 -0
  137. package/dist/src/ui/components/ShellConfirmationDialog.test.js.map +1 -0
  138. package/dist/src/ui/components/StatsDisplay.js +1 -1
  139. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  140. package/dist/src/ui/components/messages/DiffRenderer.js +10 -1
  141. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  142. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +6 -0
  143. package/dist/src/ui/components/messages/DiffRenderer.test.js +239 -0
  144. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -0
  145. package/dist/src/ui/components/messages/InfoMessage.js +2 -1
  146. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
  147. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +2 -1
  148. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  149. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +6 -0
  150. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +37 -0
  151. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -0
  152. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +6 -0
  153. package/dist/src/ui/components/messages/ToolMessage.test.js +118 -0
  154. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -0
  155. package/dist/src/ui/components/shared/MaxSizedBox.js +1 -1
  156. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  157. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +6 -0
  158. package/dist/src/ui/components/shared/MaxSizedBox.test.js +154 -0
  159. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -0
  160. package/dist/src/ui/components/shared/RadioButtonSelect.js +1 -1
  161. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  162. package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +6 -0
  163. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +111 -0
  164. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -0
  165. package/dist/src/ui/components/shared/text-buffer.js +32 -10
  166. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  167. package/dist/src/ui/components/shared/vim-buffer-actions.js +2 -1
  168. package/dist/src/ui/components/shared/vim-buffer-actions.js.map +1 -1
  169. package/dist/src/ui/contexts/KeypressContext.d.ts +30 -0
  170. package/dist/src/ui/contexts/KeypressContext.js +310 -0
  171. package/dist/src/ui/contexts/KeypressContext.js.map +1 -0
  172. package/dist/src/ui/contexts/KeypressContext.test.d.ts +6 -0
  173. package/dist/src/ui/contexts/KeypressContext.test.js +220 -0
  174. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -0
  175. package/dist/src/ui/contexts/SessionContext.d.ts +1 -0
  176. package/dist/src/ui/contexts/SessionContext.js +2 -1
  177. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  178. package/dist/src/ui/hooks/atCommandProcessor.js +9 -9
  179. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  180. package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +6 -0
  181. package/dist/src/ui/hooks/atCommandProcessor.test.js +802 -0
  182. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -0
  183. package/dist/src/ui/hooks/shellCommandProcessor.test.d.ts +6 -0
  184. package/dist/src/ui/hooks/shellCommandProcessor.test.js +328 -0
  185. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -0
  186. package/dist/src/ui/hooks/slashCommandProcessor.js +74 -53
  187. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  188. package/dist/src/ui/hooks/useAtCompletion.js +3 -5
  189. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
  190. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.d.ts +6 -0
  191. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +191 -0
  192. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -0
  193. package/dist/src/ui/hooks/useEditorSettings.test.d.ts +6 -0
  194. package/dist/src/ui/hooks/useEditorSettings.test.js +164 -0
  195. package/dist/src/ui/hooks/useEditorSettings.test.js.map +1 -0
  196. package/dist/src/ui/hooks/useFocus.d.ts +4 -0
  197. package/dist/src/ui/hooks/useFocus.js +4 -4
  198. package/dist/src/ui/hooks/useFocus.js.map +1 -1
  199. package/dist/src/ui/hooks/useFolderTrust.d.ts +3 -2
  200. package/dist/src/ui/hooks/useFolderTrust.js +43 -10
  201. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  202. package/dist/src/ui/hooks/useGeminiStream.js +1 -2
  203. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  204. package/dist/src/ui/hooks/useGitBranchName.test.d.ts +6 -0
  205. package/dist/src/ui/hooks/useGitBranchName.test.js +175 -0
  206. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -0
  207. package/dist/src/ui/hooks/useHistoryManager.test.d.ts +6 -0
  208. package/dist/src/ui/hooks/useHistoryManager.test.js +171 -0
  209. package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -0
  210. package/dist/src/ui/hooks/useInputHistory.test.d.ts +6 -0
  211. package/dist/src/ui/hooks/useInputHistory.test.js +207 -0
  212. package/dist/src/ui/hooks/useInputHistory.test.js.map +1 -0
  213. package/dist/src/ui/hooks/useKeypress.d.ts +4 -16
  214. package/dist/src/ui/hooks/useKeypress.js +8 -140
  215. package/dist/src/ui/hooks/useKeypress.js.map +1 -1
  216. package/dist/src/ui/hooks/useKittyKeyboardProtocol.d.ts +15 -0
  217. package/dist/src/ui/hooks/useKittyKeyboardProtocol.js +20 -0
  218. package/dist/src/ui/hooks/useKittyKeyboardProtocol.js.map +1 -0
  219. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +6 -0
  220. package/dist/src/ui/hooks/useLoadingIndicator.test.js +91 -0
  221. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -0
  222. package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +6 -0
  223. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +163 -0
  224. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -0
  225. package/dist/src/ui/hooks/useShellHistory.test.d.ts +6 -0
  226. package/dist/src/ui/hooks/useShellHistory.test.js +162 -0
  227. package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -0
  228. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +6 -0
  229. package/dist/src/ui/hooks/useSlashCompletion.test.js +272 -0
  230. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -0
  231. package/dist/src/ui/hooks/useThemeCommand.js +1 -1
  232. package/dist/src/ui/hooks/useThemeCommand.js.map +1 -1
  233. package/dist/src/ui/hooks/useTimer.test.d.ts +6 -0
  234. package/dist/src/ui/hooks/useTimer.test.js +90 -0
  235. package/dist/src/ui/hooks/useTimer.test.js.map +1 -0
  236. package/dist/src/ui/hooks/useToolScheduler.test.d.ts +6 -0
  237. package/dist/src/ui/hooks/useToolScheduler.test.js +841 -0
  238. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -0
  239. package/dist/src/ui/keyMatchers.test.d.ts +6 -0
  240. package/dist/src/ui/keyMatchers.test.js +276 -0
  241. package/dist/src/ui/keyMatchers.test.js.map +1 -0
  242. package/dist/src/ui/themes/color-utils.test.d.ts +6 -0
  243. package/dist/src/ui/themes/color-utils.test.js +197 -0
  244. package/dist/src/ui/themes/color-utils.test.js.map +1 -0
  245. package/dist/src/ui/themes/theme-manager.js +1 -1
  246. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  247. package/dist/src/ui/themes/theme-manager.test.d.ts +6 -0
  248. package/dist/src/ui/themes/theme-manager.test.js +83 -0
  249. package/dist/src/ui/themes/theme-manager.test.js.map +1 -0
  250. package/dist/src/ui/types.d.ts +2 -0
  251. package/dist/src/ui/types.js.map +1 -1
  252. package/dist/src/ui/utils/CodeColorizer.js +1 -1
  253. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  254. package/dist/src/ui/utils/InlineMarkdownRenderer.js +8 -1
  255. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
  256. package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +6 -0
  257. package/dist/src/ui/utils/MarkdownDisplay.test.js +151 -0
  258. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -0
  259. package/dist/src/ui/utils/clipboardUtils.test.d.ts +6 -0
  260. package/dist/src/ui/utils/clipboardUtils.test.js +65 -0
  261. package/dist/src/ui/utils/clipboardUtils.test.js.map +1 -0
  262. package/dist/src/ui/utils/commandUtils.test.d.ts +6 -0
  263. package/dist/src/ui/utils/commandUtils.test.js +294 -0
  264. package/dist/src/ui/utils/commandUtils.test.js.map +1 -0
  265. package/dist/src/ui/utils/displayUtils.test.d.ts +6 -0
  266. package/dist/src/ui/utils/displayUtils.test.js +42 -0
  267. package/dist/src/ui/utils/displayUtils.test.js.map +1 -0
  268. package/dist/src/ui/utils/formatters.test.d.ts +6 -0
  269. package/dist/src/ui/utils/formatters.test.js +56 -0
  270. package/dist/src/ui/utils/formatters.test.js.map +1 -0
  271. package/dist/src/ui/utils/kittyProtocolDetector.d.ts +13 -0
  272. package/dist/src/ui/utils/kittyProtocolDetector.js +88 -0
  273. package/dist/src/ui/utils/kittyProtocolDetector.js.map +1 -0
  274. package/dist/src/ui/utils/markdownUtilities.test.d.ts +6 -0
  275. package/dist/src/ui/utils/markdownUtilities.test.js +42 -0
  276. package/dist/src/ui/utils/markdownUtilities.test.js.map +1 -0
  277. package/dist/src/ui/utils/platformConstants.d.ts +43 -0
  278. package/dist/src/ui/utils/platformConstants.js +44 -0
  279. package/dist/src/ui/utils/platformConstants.js.map +1 -0
  280. package/dist/src/ui/utils/terminalSetup.d.ts +30 -0
  281. package/dist/src/ui/utils/terminalSetup.js +281 -0
  282. package/dist/src/ui/utils/terminalSetup.js.map +1 -0
  283. package/dist/src/ui/utils/updateCheck.js +1 -1
  284. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  285. package/dist/src/ui/utils/updateCheck.test.d.ts +6 -0
  286. package/dist/src/ui/utils/updateCheck.test.js +145 -0
  287. package/dist/src/ui/utils/updateCheck.test.js.map +1 -0
  288. package/dist/src/utils/checks.d.ts +19 -0
  289. package/dist/src/utils/checks.js +24 -0
  290. package/dist/src/utils/checks.js.map +1 -0
  291. package/dist/src/utils/gitUtils.test.d.ts +6 -0
  292. package/dist/src/utils/gitUtils.test.js +113 -0
  293. package/dist/src/utils/gitUtils.test.js.map +1 -0
  294. package/dist/src/utils/installationInfo.test.d.ts +6 -0
  295. package/dist/src/utils/installationInfo.test.js +242 -0
  296. package/dist/src/utils/installationInfo.test.js.map +1 -0
  297. package/dist/src/utils/readStdin.js +10 -0
  298. package/dist/src/utils/readStdin.js.map +1 -1
  299. package/dist/src/utils/sandbox.js +62 -60
  300. package/dist/src/utils/sandbox.js.map +1 -1
  301. package/dist/src/utils/settingsUtils.test.d.ts +6 -0
  302. package/dist/src/utils/settingsUtils.test.js +514 -0
  303. package/dist/src/utils/settingsUtils.test.js.map +1 -0
  304. package/dist/src/utils/userStartupWarnings.test.d.ts +6 -0
  305. package/dist/src/utils/userStartupWarnings.test.js +67 -0
  306. package/dist/src/utils/userStartupWarnings.test.js.map +1 -0
  307. package/dist/src/utils/version.js +1 -1
  308. package/dist/src/utils/version.js.map +1 -1
  309. package/dist/src/validateNonInterActiveAuth.js +3 -3
  310. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  311. package/dist/src/zed-integration/acp.d.ts +63 -0
  312. package/dist/src/{acp → zed-integration}/acp.js +76 -44
  313. package/dist/src/zed-integration/acp.js.map +1 -0
  314. package/dist/src/zed-integration/schema.d.ts +11679 -0
  315. package/dist/src/zed-integration/schema.js +305 -0
  316. package/dist/src/zed-integration/schema.js.map +1 -0
  317. package/dist/src/zed-integration/zedIntegration.d.ts +10 -0
  318. package/dist/src/{acp/acpPeer.js → zed-integration/zedIntegration.js} +333 -187
  319. package/dist/src/zed-integration/zedIntegration.js.map +1 -0
  320. package/dist/tsconfig.tsbuildinfo +1 -1
  321. package/package.json +5 -5
  322. package/dist/src/acp/acp.d.ts +0 -208
  323. package/dist/src/acp/acp.js.map +0 -1
  324. package/dist/src/acp/acpPeer.d.ts +0 -8
  325. package/dist/src/acp/acpPeer.js.map +0 -1
  326. package/dist/src/ui/utils/errorParsing.d.ts +0 -7
  327. package/dist/src/ui/utils/errorParsing.js +0 -90
  328. package/dist/src/ui/utils/errorParsing.js.map +0 -1
@@ -0,0 +1,294 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { vi, describe, it, expect, beforeEach } from 'vitest';
7
+ import { EventEmitter } from 'events';
8
+ import { isAtCommand, isSlashCommand, copyToClipboard, getUrlOpenCommand, } from './commandUtils.js';
9
+ // Mock child_process
10
+ vi.mock('child_process');
11
+ // Mock process.platform for platform-specific tests
12
+ const mockProcess = vi.hoisted(() => ({
13
+ platform: 'darwin',
14
+ }));
15
+ vi.stubGlobal('process', {
16
+ ...process,
17
+ get platform() {
18
+ return mockProcess.platform;
19
+ },
20
+ });
21
+ describe('commandUtils', () => {
22
+ let mockSpawn;
23
+ let mockChild;
24
+ beforeEach(async () => {
25
+ vi.clearAllMocks();
26
+ // Dynamically import and set up spawn mock
27
+ const { spawn } = await import('child_process');
28
+ mockSpawn = spawn;
29
+ // Create mock child process with stdout/stderr emitters
30
+ mockChild = Object.assign(new EventEmitter(), {
31
+ stdin: Object.assign(new EventEmitter(), {
32
+ write: vi.fn(),
33
+ end: vi.fn(),
34
+ }),
35
+ stderr: new EventEmitter(),
36
+ });
37
+ mockSpawn.mockReturnValue(mockChild);
38
+ });
39
+ describe('isAtCommand', () => {
40
+ it('should return true when query starts with @', () => {
41
+ expect(isAtCommand('@file')).toBe(true);
42
+ expect(isAtCommand('@path/to/file')).toBe(true);
43
+ expect(isAtCommand('@')).toBe(true);
44
+ });
45
+ it('should return true when query contains @ preceded by whitespace', () => {
46
+ expect(isAtCommand('hello @file')).toBe(true);
47
+ expect(isAtCommand('some text @path/to/file')).toBe(true);
48
+ expect(isAtCommand(' @file')).toBe(true);
49
+ });
50
+ it('should return false when query does not start with @ and has no spaced @', () => {
51
+ expect(isAtCommand('file')).toBe(false);
52
+ expect(isAtCommand('hello')).toBe(false);
53
+ expect(isAtCommand('')).toBe(false);
54
+ expect(isAtCommand('email@domain.com')).toBe(false);
55
+ expect(isAtCommand('user@host')).toBe(false);
56
+ });
57
+ it('should return false when @ is not preceded by whitespace', () => {
58
+ expect(isAtCommand('hello@file')).toBe(false);
59
+ expect(isAtCommand('text@path')).toBe(false);
60
+ });
61
+ });
62
+ describe('isSlashCommand', () => {
63
+ it('should return true when query starts with /', () => {
64
+ expect(isSlashCommand('/help')).toBe(true);
65
+ expect(isSlashCommand('/memory show')).toBe(true);
66
+ expect(isSlashCommand('/clear')).toBe(true);
67
+ expect(isSlashCommand('/')).toBe(true);
68
+ });
69
+ it('should return false when query does not start with /', () => {
70
+ expect(isSlashCommand('help')).toBe(false);
71
+ expect(isSlashCommand('memory show')).toBe(false);
72
+ expect(isSlashCommand('')).toBe(false);
73
+ expect(isSlashCommand('path/to/file')).toBe(false);
74
+ expect(isSlashCommand(' /help')).toBe(false);
75
+ });
76
+ });
77
+ describe('copyToClipboard', () => {
78
+ describe('on macOS (darwin)', () => {
79
+ beforeEach(() => {
80
+ mockProcess.platform = 'darwin';
81
+ });
82
+ it('should successfully copy text to clipboard using pbcopy', async () => {
83
+ const testText = 'Hello, world!';
84
+ // Simulate successful execution
85
+ setTimeout(() => {
86
+ mockChild.emit('close', 0);
87
+ }, 0);
88
+ await copyToClipboard(testText);
89
+ expect(mockSpawn).toHaveBeenCalledWith('pbcopy', []);
90
+ expect(mockChild.stdin.write).toHaveBeenCalledWith(testText);
91
+ expect(mockChild.stdin.end).toHaveBeenCalled();
92
+ });
93
+ it('should handle pbcopy command failure', async () => {
94
+ const testText = 'Hello, world!';
95
+ // Simulate command failure
96
+ setTimeout(() => {
97
+ mockChild.stderr.emit('data', 'Command not found');
98
+ mockChild.emit('close', 1);
99
+ }, 0);
100
+ await expect(copyToClipboard(testText)).rejects.toThrow("'pbcopy' exited with code 1: Command not found");
101
+ });
102
+ it('should handle spawn error', async () => {
103
+ const testText = 'Hello, world!';
104
+ setTimeout(() => {
105
+ mockChild.emit('error', new Error('spawn error'));
106
+ }, 0);
107
+ await expect(copyToClipboard(testText)).rejects.toThrow('spawn error');
108
+ });
109
+ it('should handle stdin write error', async () => {
110
+ const testText = 'Hello, world!';
111
+ setTimeout(() => {
112
+ mockChild.stdin.emit('error', new Error('stdin error'));
113
+ }, 0);
114
+ await expect(copyToClipboard(testText)).rejects.toThrow('stdin error');
115
+ });
116
+ });
117
+ describe('on Windows (win32)', () => {
118
+ beforeEach(() => {
119
+ mockProcess.platform = 'win32';
120
+ });
121
+ it('should successfully copy text to clipboard using clip', async () => {
122
+ const testText = 'Hello, world!';
123
+ setTimeout(() => {
124
+ mockChild.emit('close', 0);
125
+ }, 0);
126
+ await copyToClipboard(testText);
127
+ expect(mockSpawn).toHaveBeenCalledWith('clip', []);
128
+ expect(mockChild.stdin.write).toHaveBeenCalledWith(testText);
129
+ expect(mockChild.stdin.end).toHaveBeenCalled();
130
+ });
131
+ });
132
+ describe('on Linux', () => {
133
+ beforeEach(() => {
134
+ mockProcess.platform = 'linux';
135
+ });
136
+ it('should successfully copy text to clipboard using xclip', async () => {
137
+ const testText = 'Hello, world!';
138
+ setTimeout(() => {
139
+ mockChild.emit('close', 0);
140
+ }, 0);
141
+ await copyToClipboard(testText);
142
+ expect(mockSpawn).toHaveBeenCalledWith('xclip', [
143
+ '-selection',
144
+ 'clipboard',
145
+ ]);
146
+ expect(mockChild.stdin.write).toHaveBeenCalledWith(testText);
147
+ expect(mockChild.stdin.end).toHaveBeenCalled();
148
+ });
149
+ it('should fall back to xsel when xclip fails', async () => {
150
+ const testText = 'Hello, world!';
151
+ let callCount = 0;
152
+ mockSpawn.mockImplementation(() => {
153
+ const child = Object.assign(new EventEmitter(), {
154
+ stdin: Object.assign(new EventEmitter(), {
155
+ write: vi.fn(),
156
+ end: vi.fn(),
157
+ }),
158
+ stderr: new EventEmitter(),
159
+ });
160
+ setTimeout(() => {
161
+ if (callCount === 0) {
162
+ // First call (xclip) fails
163
+ child.stderr.emit('data', 'xclip not found');
164
+ child.emit('close', 1);
165
+ callCount++;
166
+ }
167
+ else {
168
+ // Second call (xsel) succeeds
169
+ child.emit('close', 0);
170
+ }
171
+ }, 0);
172
+ return child;
173
+ });
174
+ await copyToClipboard(testText);
175
+ expect(mockSpawn).toHaveBeenCalledTimes(2);
176
+ expect(mockSpawn).toHaveBeenNthCalledWith(1, 'xclip', [
177
+ '-selection',
178
+ 'clipboard',
179
+ ]);
180
+ expect(mockSpawn).toHaveBeenNthCalledWith(2, 'xsel', [
181
+ '--clipboard',
182
+ '--input',
183
+ ]);
184
+ });
185
+ it('should throw error when both xclip and xsel fail', async () => {
186
+ const testText = 'Hello, world!';
187
+ let callCount = 0;
188
+ mockSpawn.mockImplementation(() => {
189
+ const child = Object.assign(new EventEmitter(), {
190
+ stdin: Object.assign(new EventEmitter(), {
191
+ write: vi.fn(),
192
+ end: vi.fn(),
193
+ }),
194
+ stderr: new EventEmitter(),
195
+ });
196
+ setTimeout(() => {
197
+ if (callCount === 0) {
198
+ // First call (xclip) fails
199
+ child.stderr.emit('data', 'xclip command not found');
200
+ child.emit('close', 1);
201
+ callCount++;
202
+ }
203
+ else {
204
+ // Second call (xsel) fails
205
+ child.stderr.emit('data', 'xsel command not found');
206
+ child.emit('close', 1);
207
+ }
208
+ }, 0);
209
+ return child;
210
+ });
211
+ await expect(copyToClipboard(testText)).rejects.toThrow(/All copy commands failed/);
212
+ expect(mockSpawn).toHaveBeenCalledTimes(2);
213
+ });
214
+ });
215
+ describe('on unsupported platform', () => {
216
+ beforeEach(() => {
217
+ mockProcess.platform = 'unsupported';
218
+ });
219
+ it('should throw error for unsupported platform', async () => {
220
+ await expect(copyToClipboard('test')).rejects.toThrow('Unsupported platform: unsupported');
221
+ });
222
+ });
223
+ describe('error handling', () => {
224
+ beforeEach(() => {
225
+ mockProcess.platform = 'darwin';
226
+ });
227
+ it('should handle command exit without stderr', async () => {
228
+ const testText = 'Hello, world!';
229
+ setTimeout(() => {
230
+ mockChild.emit('close', 1);
231
+ }, 0);
232
+ await expect(copyToClipboard(testText)).rejects.toThrow("'pbcopy' exited with code 1");
233
+ });
234
+ it('should handle empty text', async () => {
235
+ setTimeout(() => {
236
+ mockChild.emit('close', 0);
237
+ }, 0);
238
+ await copyToClipboard('');
239
+ expect(mockChild.stdin.write).toHaveBeenCalledWith('');
240
+ });
241
+ it('should handle multiline text', async () => {
242
+ const multilineText = 'Line 1\nLine 2\nLine 3';
243
+ setTimeout(() => {
244
+ mockChild.emit('close', 0);
245
+ }, 0);
246
+ await copyToClipboard(multilineText);
247
+ expect(mockChild.stdin.write).toHaveBeenCalledWith(multilineText);
248
+ });
249
+ it('should handle special characters', async () => {
250
+ const specialText = 'Special chars: !@#$%^&*()_+-=[]{}|;:,.<>?';
251
+ setTimeout(() => {
252
+ mockChild.emit('close', 0);
253
+ }, 0);
254
+ await copyToClipboard(specialText);
255
+ expect(mockChild.stdin.write).toHaveBeenCalledWith(specialText);
256
+ });
257
+ });
258
+ });
259
+ describe('getUrlOpenCommand', () => {
260
+ describe('on macOS (darwin)', () => {
261
+ beforeEach(() => {
262
+ mockProcess.platform = 'darwin';
263
+ });
264
+ it('should return open', () => {
265
+ expect(getUrlOpenCommand()).toBe('open');
266
+ });
267
+ });
268
+ describe('on Windows (win32)', () => {
269
+ beforeEach(() => {
270
+ mockProcess.platform = 'win32';
271
+ });
272
+ it('should return start', () => {
273
+ expect(getUrlOpenCommand()).toBe('start');
274
+ });
275
+ });
276
+ describe('on Linux (linux)', () => {
277
+ beforeEach(() => {
278
+ mockProcess.platform = 'linux';
279
+ });
280
+ it('should return xdg-open', () => {
281
+ expect(getUrlOpenCommand()).toBe('xdg-open');
282
+ });
283
+ });
284
+ describe('on unmatched OS', () => {
285
+ beforeEach(() => {
286
+ mockProcess.platform = 'unmatched';
287
+ });
288
+ it('should return xdg-open', () => {
289
+ expect(getUrlOpenCommand()).toBe('xdg-open');
290
+ });
291
+ });
292
+ });
293
+ });
294
+ //# sourceMappingURL=commandUtils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandUtils.test.js","sourceRoot":"","sources":["../../../../src/ui/utils/commandUtils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { getStatusColor, TOOL_SUCCESS_RATE_HIGH, TOOL_SUCCESS_RATE_MEDIUM, USER_AGREEMENT_RATE_HIGH, USER_AGREEMENT_RATE_MEDIUM, CACHE_EFFICIENCY_HIGH, CACHE_EFFICIENCY_MEDIUM, } from './displayUtils.js';
8
+ import { Colors } from '../colors.js';
9
+ describe('displayUtils', () => {
10
+ describe('getStatusColor', () => {
11
+ const thresholds = {
12
+ green: 80,
13
+ yellow: 50,
14
+ };
15
+ it('should return green for values >= green threshold', () => {
16
+ expect(getStatusColor(90, thresholds)).toBe(Colors.AccentGreen);
17
+ expect(getStatusColor(80, thresholds)).toBe(Colors.AccentGreen);
18
+ });
19
+ it('should return yellow for values < green and >= yellow threshold', () => {
20
+ expect(getStatusColor(79, thresholds)).toBe(Colors.AccentYellow);
21
+ expect(getStatusColor(50, thresholds)).toBe(Colors.AccentYellow);
22
+ });
23
+ it('should return red for values < yellow threshold', () => {
24
+ expect(getStatusColor(49, thresholds)).toBe(Colors.AccentRed);
25
+ expect(getStatusColor(0, thresholds)).toBe(Colors.AccentRed);
26
+ });
27
+ it('should return defaultColor for values < yellow threshold when provided', () => {
28
+ expect(getStatusColor(49, thresholds, { defaultColor: Colors.Foreground })).toBe(Colors.Foreground);
29
+ });
30
+ });
31
+ describe('Threshold Constants', () => {
32
+ it('should have the correct values', () => {
33
+ expect(TOOL_SUCCESS_RATE_HIGH).toBe(95);
34
+ expect(TOOL_SUCCESS_RATE_MEDIUM).toBe(85);
35
+ expect(USER_AGREEMENT_RATE_HIGH).toBe(75);
36
+ expect(USER_AGREEMENT_RATE_MEDIUM).toBe(45);
37
+ expect(CACHE_EFFICIENCY_HIGH).toBe(40);
38
+ expect(CACHE_EFFICIENCY_MEDIUM).toBe(15);
39
+ });
40
+ });
41
+ });
42
+ //# sourceMappingURL=displayUtils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"displayUtils.test.js","sourceRoot":"","sources":["../../../../src/ui/utils/displayUtils.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,MAAM,UAAU,GAAG;YACjB,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;SACX,CAAC;QAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAChE,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACjE,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC9D,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;YAChF,MAAM,CACJ,cAAc,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CACpE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5C,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { formatDuration, formatMemoryUsage } from './formatters.js';
8
+ describe('formatters', () => {
9
+ describe('formatMemoryUsage', () => {
10
+ it('should format bytes into KB', () => {
11
+ expect(formatMemoryUsage(12345)).toBe('12.1 KB');
12
+ });
13
+ it('should format bytes into MB', () => {
14
+ expect(formatMemoryUsage(12345678)).toBe('11.8 MB');
15
+ });
16
+ it('should format bytes into GB', () => {
17
+ expect(formatMemoryUsage(12345678901)).toBe('11.50 GB');
18
+ });
19
+ });
20
+ describe('formatDuration', () => {
21
+ it('should format milliseconds less than a second', () => {
22
+ expect(formatDuration(500)).toBe('500ms');
23
+ });
24
+ it('should format a duration of 0', () => {
25
+ expect(formatDuration(0)).toBe('0s');
26
+ });
27
+ it('should format an exact number of seconds', () => {
28
+ expect(formatDuration(5000)).toBe('5.0s');
29
+ });
30
+ it('should format a duration in seconds with one decimal place', () => {
31
+ expect(formatDuration(12345)).toBe('12.3s');
32
+ });
33
+ it('should format an exact number of minutes', () => {
34
+ expect(formatDuration(120000)).toBe('2m');
35
+ });
36
+ it('should format a duration in minutes and seconds', () => {
37
+ expect(formatDuration(123000)).toBe('2m 3s');
38
+ });
39
+ it('should format an exact number of hours', () => {
40
+ expect(formatDuration(3600000)).toBe('1h');
41
+ });
42
+ it('should format a duration in hours and seconds', () => {
43
+ expect(formatDuration(3605000)).toBe('1h 5s');
44
+ });
45
+ it('should format a duration in hours, minutes, and seconds', () => {
46
+ expect(formatDuration(3723000)).toBe('1h 2m 3s');
47
+ });
48
+ it('should handle large durations', () => {
49
+ expect(formatDuration(86400000 + 3600000 + 120000 + 1000)).toBe('25h 2m 1s');
50
+ });
51
+ it('should handle negative durations', () => {
52
+ expect(formatDuration(-100)).toBe('0s');
53
+ });
54
+ });
55
+ });
56
+ //# sourceMappingURL=formatters.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.test.js","sourceRoot":"","sources":["../../../../src/ui/utils/formatters.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Detects Kitty keyboard protocol support.
8
+ * Definitive document about this protocol lives at https://sw.kovidgoyal.net/kitty/keyboard-protocol/
9
+ * This function should be called once at app startup.
10
+ */
11
+ export declare function detectAndEnableKittyProtocol(): Promise<boolean>;
12
+ export declare function isKittyProtocolEnabled(): boolean;
13
+ export declare function isKittyProtocolSupported(): boolean;
@@ -0,0 +1,88 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ let detectionComplete = false;
7
+ let protocolSupported = false;
8
+ let protocolEnabled = false;
9
+ /**
10
+ * Detects Kitty keyboard protocol support.
11
+ * Definitive document about this protocol lives at https://sw.kovidgoyal.net/kitty/keyboard-protocol/
12
+ * This function should be called once at app startup.
13
+ */
14
+ export async function detectAndEnableKittyProtocol() {
15
+ if (detectionComplete) {
16
+ return protocolSupported;
17
+ }
18
+ return new Promise((resolve) => {
19
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
20
+ detectionComplete = true;
21
+ resolve(false);
22
+ return;
23
+ }
24
+ const originalRawMode = process.stdin.isRaw;
25
+ if (!originalRawMode) {
26
+ process.stdin.setRawMode(true);
27
+ }
28
+ let responseBuffer = '';
29
+ let progressiveEnhancementReceived = false;
30
+ let checkFinished = false;
31
+ const handleData = (data) => {
32
+ responseBuffer += data.toString();
33
+ // Check for progressive enhancement response (CSI ? <flags> u)
34
+ if (responseBuffer.includes('\x1b[?') && responseBuffer.includes('u')) {
35
+ progressiveEnhancementReceived = true;
36
+ }
37
+ // Check for device attributes response (CSI ? <attrs> c)
38
+ if (responseBuffer.includes('\x1b[?') && responseBuffer.includes('c')) {
39
+ if (!checkFinished) {
40
+ checkFinished = true;
41
+ process.stdin.removeListener('data', handleData);
42
+ if (!originalRawMode) {
43
+ process.stdin.setRawMode(false);
44
+ }
45
+ if (progressiveEnhancementReceived) {
46
+ // Enable the protocol
47
+ process.stdout.write('\x1b[>1u');
48
+ protocolSupported = true;
49
+ protocolEnabled = true;
50
+ // Set up cleanup on exit
51
+ process.on('exit', disableProtocol);
52
+ process.on('SIGTERM', disableProtocol);
53
+ }
54
+ detectionComplete = true;
55
+ resolve(protocolSupported);
56
+ }
57
+ }
58
+ };
59
+ process.stdin.on('data', handleData);
60
+ // Send queries
61
+ process.stdout.write('\x1b[?u'); // Query progressive enhancement
62
+ process.stdout.write('\x1b[c'); // Query device attributes
63
+ // Timeout after 50ms
64
+ setTimeout(() => {
65
+ if (!checkFinished) {
66
+ process.stdin.removeListener('data', handleData);
67
+ if (!originalRawMode) {
68
+ process.stdin.setRawMode(false);
69
+ }
70
+ detectionComplete = true;
71
+ resolve(false);
72
+ }
73
+ }, 50);
74
+ });
75
+ }
76
+ function disableProtocol() {
77
+ if (protocolEnabled) {
78
+ process.stdout.write('\x1b[<u');
79
+ protocolEnabled = false;
80
+ }
81
+ }
82
+ export function isKittyProtocolEnabled() {
83
+ return protocolEnabled;
84
+ }
85
+ export function isKittyProtocolSupported() {
86
+ return protocolSupported;
87
+ }
88
+ //# sourceMappingURL=kittyProtocolDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kittyProtocolDetector.js","sourceRoot":"","sources":["../../../../src/ui/utils/kittyProtocolDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { findLastSafeSplitPoint } from './markdownUtilities.js';
8
+ describe('markdownUtilities', () => {
9
+ describe('findLastSafeSplitPoint', () => {
10
+ it('should split at the last double newline if not in a code block', () => {
11
+ const content = 'paragraph1\n\nparagraph2\n\nparagraph3';
12
+ expect(findLastSafeSplitPoint(content)).toBe(24); // After the second \n\n
13
+ });
14
+ it('should return content.length if no safe split point is found', () => {
15
+ const content = 'longstringwithoutanysafesplitpoint';
16
+ expect(findLastSafeSplitPoint(content)).toBe(content.length);
17
+ });
18
+ it('should prioritize splitting at \n\n over being at the very end of the string if the end is not in a code block', () => {
19
+ const content = 'Some text here.\n\nAnd more text here.';
20
+ expect(findLastSafeSplitPoint(content)).toBe(17); // after the \n\n
21
+ });
22
+ it('should return content.length if the only \n\n is inside a code block and the end of content is not', () => {
23
+ const content = '```\nignore this\n\nnewline\n```KeepThis';
24
+ expect(findLastSafeSplitPoint(content)).toBe(content.length);
25
+ });
26
+ it('should correctly identify the last \n\n even if it is followed by text not in a code block', () => {
27
+ const content = 'First part.\n\nSecond part.\n\nThird part, then some more text.';
28
+ // Split should be after "Second part.\n\n"
29
+ // "First part.\n\n" is 13 chars. "Second part.\n\n" is 14 chars. Total 27.
30
+ expect(findLastSafeSplitPoint(content)).toBe(27);
31
+ });
32
+ it('should return content.length if content is empty', () => {
33
+ const content = '';
34
+ expect(findLastSafeSplitPoint(content)).toBe(0);
35
+ });
36
+ it('should return content.length if content has no newlines and no code blocks', () => {
37
+ const content = 'Single line of text';
38
+ expect(findLastSafeSplitPoint(content)).toBe(content.length);
39
+ });
40
+ });
41
+ });
42
+ //# sourceMappingURL=markdownUtilities.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdownUtilities.test.js","sourceRoot":"","sources":["../../../../src/ui/utils/markdownUtilities.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,MAAM,OAAO,GAAG,wCAAwC,CAAC;YACzD,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,MAAM,OAAO,GAAG,oCAAoC,CAAC;YACrD,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gHAAgH,EAAE,GAAG,EAAE;YACxH,MAAM,OAAO,GAAG,wCAAwC,CAAC;YACzD,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oGAAoG,EAAE,GAAG,EAAE;YAC5G,MAAM,OAAO,GAAG,0CAA0C,CAAC;YAC3D,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4FAA4F,EAAE,GAAG,EAAE;YACpG,MAAM,OAAO,GACX,iEAAiE,CAAC;YACpE,2CAA2C;YAC3C,2EAA2E;YAC3E,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;YACpF,MAAM,OAAO,GAAG,qBAAqB,CAAC;YACtC,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Terminal Platform Constants
8
+ *
9
+ * This file contains terminal-related constants used throughout the application,
10
+ * specifically for handling keyboard inputs and terminal protocols.
11
+ */
12
+ /**
13
+ * Kitty keyboard protocol sequences for enhanced keyboard input.
14
+ * @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/
15
+ */
16
+ export declare const KITTY_CTRL_C = "[99;5u";
17
+ /**
18
+ * Kitty keyboard protocol keycodes
19
+ */
20
+ export declare const KITTY_KEYCODE_ENTER = 13;
21
+ export declare const KITTY_KEYCODE_NUMPAD_ENTER = 57414;
22
+ /**
23
+ * Timing constants for terminal interactions
24
+ */
25
+ export declare const CTRL_EXIT_PROMPT_DURATION_MS = 1000;
26
+ /**
27
+ * VS Code terminal integration constants
28
+ */
29
+ export declare const VSCODE_SHIFT_ENTER_SEQUENCE = "\\\r\n";
30
+ /**
31
+ * Backslash + Enter detection window in milliseconds.
32
+ * Used to detect Shift+Enter pattern where backslash
33
+ * is followed by Enter within this timeframe.
34
+ */
35
+ export declare const BACKSLASH_ENTER_DETECTION_WINDOW_MS = 5;
36
+ /**
37
+ * Maximum expected length of a Kitty keyboard protocol sequence.
38
+ * Format: ESC [ <keycode> ; <modifiers> u/~
39
+ * Example: \x1b[13;2u (Shift+Enter) = 8 chars
40
+ * Longest reasonable: \x1b[127;15~ = 11 chars (Del with all modifiers)
41
+ * We use 12 to provide a small buffer.
42
+ */
43
+ export declare const MAX_KITTY_SEQUENCE_LENGTH = 12;