@google/gemini-cli 0.31.0 → 0.32.0

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 (327) hide show
  1. package/dist/package.json +2 -2
  2. package/dist/src/commands/extensions/examples/policies/README.md +41 -0
  3. package/dist/src/commands/extensions/examples/policies/gemini-extension.json +5 -0
  4. package/dist/src/commands/extensions/examples/policies/policies/policies.toml +28 -0
  5. package/dist/src/commands/extensions/link.test.js +5 -21
  6. package/dist/src/commands/extensions/link.test.js.map +1 -1
  7. package/dist/src/commands/extensions/list.test.js +10 -24
  8. package/dist/src/commands/extensions/list.test.js.map +1 -1
  9. package/dist/src/commands/mcp/list.js +32 -14
  10. package/dist/src/commands/mcp/list.js.map +1 -1
  11. package/dist/src/commands/mcp/list.test.js +22 -1
  12. package/dist/src/commands/mcp/list.test.js.map +1 -1
  13. package/dist/src/commands/skills/disable.test.js +4 -7
  14. package/dist/src/commands/skills/disable.test.js.map +1 -1
  15. package/dist/src/commands/skills/enable.test.js +4 -7
  16. package/dist/src/commands/skills/enable.test.js.map +1 -1
  17. package/dist/src/commands/skills/install.test.js +12 -9
  18. package/dist/src/commands/skills/install.test.js.map +1 -1
  19. package/dist/src/commands/skills/link.test.js +5 -2
  20. package/dist/src/commands/skills/link.test.js.map +1 -1
  21. package/dist/src/commands/skills/list.test.js +16 -29
  22. package/dist/src/commands/skills/list.test.js.map +1 -1
  23. package/dist/src/commands/skills/uninstall.test.js +9 -6
  24. package/dist/src/commands/skills/uninstall.test.js.map +1 -1
  25. package/dist/src/config/config.js +3 -0
  26. package/dist/src/config/config.js.map +1 -1
  27. package/dist/src/config/config.test.js +55 -0
  28. package/dist/src/config/config.test.js.map +1 -1
  29. package/dist/src/config/extension-manager.d.ts +8 -1
  30. package/dist/src/config/extension-manager.js +88 -23
  31. package/dist/src/config/extension-manager.js.map +1 -1
  32. package/dist/src/config/extension-manager.test.d.ts +6 -0
  33. package/dist/src/config/extension-manager.test.js +138 -0
  34. package/dist/src/config/extension-manager.test.js.map +1 -0
  35. package/dist/src/config/extension.test.js +93 -4
  36. package/dist/src/config/extension.test.js.map +1 -1
  37. package/dist/src/config/extensions/consent.test.js +35 -43
  38. package/dist/src/config/extensions/consent.test.js.map +1 -1
  39. package/dist/src/config/keyBindings.js +1 -1
  40. package/dist/src/config/keyBindings.js.map +1 -1
  41. package/dist/src/config/policy-engine.integration.test.js +12 -12
  42. package/dist/src/config/settingsSchema.d.ts +98 -3
  43. package/dist/src/config/settingsSchema.js +92 -1
  44. package/dist/src/config/settingsSchema.js.map +1 -1
  45. package/dist/src/config/settingsSchema.test.js +49 -0
  46. package/dist/src/config/settingsSchema.test.js.map +1 -1
  47. package/dist/src/gemini.js +7 -8
  48. package/dist/src/gemini.js.map +1 -1
  49. package/dist/src/gemini.test.js +5 -1
  50. package/dist/src/gemini.test.js.map +1 -1
  51. package/dist/src/generated/git-commit.d.ts +2 -2
  52. package/dist/src/generated/git-commit.js +2 -2
  53. package/dist/src/test-utils/AppRig.d.ts +26 -0
  54. package/dist/src/test-utils/AppRig.js +128 -6
  55. package/dist/src/test-utils/AppRig.js.map +1 -1
  56. package/dist/src/test-utils/customMatchers.d.ts +25 -5
  57. package/dist/src/test-utils/customMatchers.js +46 -0
  58. package/dist/src/test-utils/customMatchers.js.map +1 -1
  59. package/dist/src/test-utils/mockConfig.js +4 -0
  60. package/dist/src/test-utils/mockConfig.js.map +1 -1
  61. package/dist/src/test-utils/mockDebugLogger.d.ts +35 -0
  62. package/dist/src/test-utils/mockDebugLogger.js +67 -0
  63. package/dist/src/test-utils/mockDebugLogger.js.map +1 -0
  64. package/dist/src/test-utils/render.d.ts +13 -0
  65. package/dist/src/test-utils/render.js +48 -8
  66. package/dist/src/test-utils/render.js.map +1 -1
  67. package/dist/src/test-utils/svg.d.ts +7 -0
  68. package/dist/src/test-utils/svg.js +163 -0
  69. package/dist/src/test-utils/svg.js.map +1 -0
  70. package/dist/src/ui/AppContainer.js +48 -66
  71. package/dist/src/ui/AppContainer.js.map +1 -1
  72. package/dist/src/ui/AppContainer.test.js +89 -0
  73. package/dist/src/ui/AppContainer.test.js.map +1 -1
  74. package/dist/src/ui/commands/mcpCommand.js +17 -3
  75. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  76. package/dist/src/ui/commands/mcpCommand.test.js +10 -3
  77. package/dist/src/ui/commands/mcpCommand.test.js.map +1 -1
  78. package/dist/src/ui/commands/setupGithubCommand.js +2 -0
  79. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
  80. package/dist/src/ui/commands/statsCommand.js +10 -4
  81. package/dist/src/ui/commands/statsCommand.js.map +1 -1
  82. package/dist/src/ui/commands/statsCommand.test.js +12 -3
  83. package/dist/src/ui/commands/statsCommand.test.js.map +1 -1
  84. package/dist/src/ui/components/AnsiOutput.test.js +3 -3
  85. package/dist/src/ui/components/AnsiOutput.test.js.map +1 -1
  86. package/dist/src/ui/components/AskUserDialog.d.ts +4 -0
  87. package/dist/src/ui/components/AskUserDialog.js +5 -5
  88. package/dist/src/ui/components/AskUserDialog.js.map +1 -1
  89. package/dist/src/ui/components/AskUserDialog.test.js +6 -7
  90. package/dist/src/ui/components/AskUserDialog.test.js.map +1 -1
  91. package/dist/src/ui/components/Composer.js +17 -6
  92. package/dist/src/ui/components/Composer.js.map +1 -1
  93. package/dist/src/ui/components/Composer.test.js +47 -6
  94. package/dist/src/ui/components/Composer.test.js.map +1 -1
  95. package/dist/src/ui/components/ConfigInitDisplay.js +1 -1
  96. package/dist/src/ui/components/ConfigInitDisplay.js.map +1 -1
  97. package/dist/src/ui/components/ConfigInitDisplay.test.js +6 -6
  98. package/dist/src/ui/components/ConfigInitDisplay.test.js.map +1 -1
  99. package/dist/src/ui/components/DetailedMessagesDisplay.js +6 -1
  100. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  101. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +43 -4
  102. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +1 -1
  103. package/dist/src/ui/components/DialogManager.js +9 -1
  104. package/dist/src/ui/components/DialogManager.js.map +1 -1
  105. package/dist/src/ui/components/DialogManager.test.js +4 -0
  106. package/dist/src/ui/components/DialogManager.test.js.map +1 -1
  107. package/dist/src/ui/components/EmptyWalletDialog.d.ts +22 -0
  108. package/dist/src/ui/components/EmptyWalletDialog.js +33 -0
  109. package/dist/src/ui/components/EmptyWalletDialog.js.map +1 -0
  110. package/dist/src/ui/components/EmptyWalletDialog.test.d.ts +6 -0
  111. package/dist/src/ui/components/EmptyWalletDialog.test.js +127 -0
  112. package/dist/src/ui/components/EmptyWalletDialog.test.js.map +1 -0
  113. package/dist/src/ui/components/ExitPlanModeDialog.d.ts +2 -1
  114. package/dist/src/ui/components/ExitPlanModeDialog.js +34 -7
  115. package/dist/src/ui/components/ExitPlanModeDialog.js.map +1 -1
  116. package/dist/src/ui/components/ExitPlanModeDialog.test.js +31 -2
  117. package/dist/src/ui/components/ExitPlanModeDialog.test.js.map +1 -1
  118. package/dist/src/ui/components/FolderTrustDialog.test.js +1 -1
  119. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  120. package/dist/src/ui/components/Footer.js +3 -1
  121. package/dist/src/ui/components/Footer.js.map +1 -1
  122. package/dist/src/ui/components/Footer.test.js +63 -1
  123. package/dist/src/ui/components/Footer.test.js.map +1 -1
  124. package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +0 -5
  125. package/dist/src/ui/components/GeminiRespondingSpinner.js +1 -32
  126. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  127. package/dist/src/ui/components/GeminiRespondingSpinner.test.js +5 -10
  128. package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +1 -1
  129. package/dist/src/ui/components/GeminiSpinner.d.ts +13 -0
  130. package/dist/src/ui/components/GeminiSpinner.js +35 -0
  131. package/dist/src/ui/components/GeminiSpinner.js.map +1 -0
  132. package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
  133. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  134. package/dist/src/ui/components/InputPrompt.js +31 -3
  135. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  136. package/dist/src/ui/components/InputPrompt.test.js +82 -18
  137. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  138. package/dist/src/ui/components/OverageMenuDialog.d.ts +22 -0
  139. package/dist/src/ui/components/OverageMenuDialog.js +32 -0
  140. package/dist/src/ui/components/OverageMenuDialog.js.map +1 -0
  141. package/dist/src/ui/components/OverageMenuDialog.test.d.ts +6 -0
  142. package/dist/src/ui/components/OverageMenuDialog.test.js +129 -0
  143. package/dist/src/ui/components/OverageMenuDialog.test.js.map +1 -0
  144. package/dist/src/ui/components/ProQuotaDialog.d.ts +3 -1
  145. package/dist/src/ui/components/ProQuotaDialog.js +11 -6
  146. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
  147. package/dist/src/ui/components/ProQuotaDialog.test.js +27 -14
  148. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
  149. package/dist/src/ui/components/SettingsDialog.test.js +9 -11
  150. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  151. package/dist/src/ui/components/StatsDisplay.d.ts +1 -0
  152. package/dist/src/ui/components/StatsDisplay.js +2 -2
  153. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  154. package/dist/src/ui/components/Table.test.js +23 -4
  155. package/dist/src/ui/components/Table.test.js.map +1 -1
  156. package/dist/src/ui/components/ToastDisplay.js +1 -1
  157. package/dist/src/ui/components/ToastDisplay.js.map +1 -1
  158. package/dist/src/ui/components/ToastDisplay.test.js +2 -2
  159. package/dist/src/ui/components/ToastDisplay.test.js.map +1 -1
  160. package/dist/src/ui/components/ToolConfirmationQueue.js +3 -1
  161. package/dist/src/ui/components/ToolConfirmationQueue.js.map +1 -1
  162. package/dist/src/ui/components/ToolConfirmationQueue.test.js +3 -2
  163. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +1 -1
  164. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +1 -1
  165. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +1 -1
  166. package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +2 -1
  167. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +3 -2
  168. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  169. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +17 -17
  170. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  171. package/dist/src/ui/components/messages/ToolGroupMessage.js +17 -7
  172. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  173. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +88 -5
  174. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  175. package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.js +1 -1
  176. package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.js.map +1 -1
  177. package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.js +11 -4
  178. package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.js.map +1 -1
  179. package/dist/src/ui/components/shared/DialogFooter.d.ts +2 -0
  180. package/dist/src/ui/components/shared/DialogFooter.js +2 -1
  181. package/dist/src/ui/components/shared/DialogFooter.js.map +1 -1
  182. package/dist/src/ui/components/shared/ExpandableText.test.js +21 -16
  183. package/dist/src/ui/components/shared/ExpandableText.test.js.map +1 -1
  184. package/dist/src/ui/components/shared/MaxSizedBox.js +10 -1
  185. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  186. package/dist/src/ui/components/shared/MaxSizedBox.test.js +8 -8
  187. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -1
  188. package/dist/src/ui/components/shared/Scrollable.d.ts +1 -1
  189. package/dist/src/ui/components/shared/Scrollable.js +76 -43
  190. package/dist/src/ui/components/shared/Scrollable.js.map +1 -1
  191. package/dist/src/ui/components/shared/Scrollable.test.js +15 -20
  192. package/dist/src/ui/components/shared/Scrollable.test.js.map +1 -1
  193. package/dist/src/ui/components/shared/ScrollableList.js +14 -9
  194. package/dist/src/ui/components/shared/ScrollableList.js.map +1 -1
  195. package/dist/src/ui/components/shared/ScrollableList.test.js +153 -0
  196. package/dist/src/ui/components/shared/ScrollableList.test.js.map +1 -1
  197. package/dist/src/ui/components/shared/VirtualizedList.js +133 -88
  198. package/dist/src/ui/components/shared/VirtualizedList.js.map +1 -1
  199. package/dist/src/ui/components/shared/VirtualizedList.test.js +6 -3
  200. package/dist/src/ui/components/shared/VirtualizedList.test.js.map +1 -1
  201. package/dist/src/ui/components/shared/text-buffer.js +3 -30
  202. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  203. package/dist/src/ui/components/views/McpStatus.d.ts +1 -0
  204. package/dist/src/ui/components/views/McpStatus.js +2 -2
  205. package/dist/src/ui/components/views/McpStatus.js.map +1 -1
  206. package/dist/src/ui/components/views/McpStatus.test.js +7 -0
  207. package/dist/src/ui/components/views/McpStatus.test.js.map +1 -1
  208. package/dist/src/ui/contexts/UIActionsContext.d.ts +3 -0
  209. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  210. package/dist/src/ui/contexts/UIStateContext.d.ts +24 -1
  211. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  212. package/dist/src/ui/hooks/atCommandProcessor.js +4 -0
  213. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  214. package/dist/src/ui/hooks/creditsFlowHandler.d.ts +35 -0
  215. package/dist/src/ui/hooks/creditsFlowHandler.js +144 -0
  216. package/dist/src/ui/hooks/creditsFlowHandler.js.map +1 -0
  217. package/dist/src/ui/hooks/creditsFlowHandler.test.d.ts +6 -0
  218. package/dist/src/ui/hooks/creditsFlowHandler.test.js +180 -0
  219. package/dist/src/ui/hooks/creditsFlowHandler.test.js.map +1 -0
  220. package/dist/src/ui/hooks/shell-completions/gitProvider.d.ts +7 -0
  221. package/dist/src/ui/hooks/shell-completions/gitProvider.js +73 -0
  222. package/dist/src/ui/hooks/shell-completions/gitProvider.js.map +1 -0
  223. package/dist/src/ui/hooks/shell-completions/gitProvider.test.d.ts +6 -0
  224. package/dist/src/ui/hooks/shell-completions/gitProvider.test.js +73 -0
  225. package/dist/src/ui/hooks/shell-completions/gitProvider.test.js.map +1 -0
  226. package/dist/src/ui/hooks/shell-completions/index.d.ts +7 -0
  227. package/dist/src/ui/hooks/shell-completions/index.js +16 -0
  228. package/dist/src/ui/hooks/shell-completions/index.js.map +1 -0
  229. package/dist/src/ui/hooks/shell-completions/npmProvider.d.ts +7 -0
  230. package/dist/src/ui/hooks/shell-completions/npmProvider.js +67 -0
  231. package/dist/src/ui/hooks/shell-completions/npmProvider.js.map +1 -0
  232. package/dist/src/ui/hooks/shell-completions/npmProvider.test.d.ts +6 -0
  233. package/dist/src/ui/hooks/shell-completions/npmProvider.test.js +69 -0
  234. package/dist/src/ui/hooks/shell-completions/npmProvider.test.js.map +1 -0
  235. package/dist/src/ui/hooks/shell-completions/types.d.ts +16 -0
  236. package/dist/src/ui/hooks/shell-completions/types.js +7 -0
  237. package/dist/src/ui/hooks/shell-completions/types.js.map +1 -0
  238. package/dist/src/ui/hooks/shellCommandProcessor.js +1 -0
  239. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  240. package/dist/src/ui/hooks/slashCommandProcessor.js +1 -0
  241. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  242. package/dist/src/ui/hooks/toolMapping.js +1 -0
  243. package/dist/src/ui/hooks/toolMapping.js.map +1 -1
  244. package/dist/src/ui/hooks/toolMapping.test.js +25 -0
  245. package/dist/src/ui/hooks/toolMapping.test.js.map +1 -1
  246. package/dist/src/ui/hooks/useAlternateBuffer.d.ts +2 -2
  247. package/dist/src/ui/hooks/useAlternateBuffer.js +5 -4
  248. package/dist/src/ui/hooks/useAlternateBuffer.js.map +1 -1
  249. package/dist/src/ui/hooks/useAlternateBuffer.test.d.ts +6 -0
  250. package/dist/src/ui/hooks/useAlternateBuffer.test.js +57 -0
  251. package/dist/src/ui/hooks/useAlternateBuffer.test.js.map +1 -0
  252. package/dist/src/ui/hooks/useCommandCompletion.d.ts +2 -1
  253. package/dist/src/ui/hooks/useCommandCompletion.js +37 -5
  254. package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
  255. package/dist/src/ui/hooks/useCommandCompletion.test.js +23 -1
  256. package/dist/src/ui/hooks/useCommandCompletion.test.js.map +1 -1
  257. package/dist/src/ui/hooks/useGeminiStream.js +83 -5
  258. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  259. package/dist/src/ui/hooks/useGeminiStream.test.js +110 -4
  260. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  261. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +2 -1
  262. package/dist/src/ui/hooks/useLoadingIndicator.js +7 -2
  263. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  264. package/dist/src/ui/hooks/useLoadingIndicator.test.js +25 -4
  265. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  266. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +1 -1
  267. package/dist/src/ui/hooks/usePrivacySettings.js +9 -3
  268. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  269. package/dist/src/ui/hooks/useQuotaAndFallback.d.ts +11 -3
  270. package/dist/src/ui/hooks/useQuotaAndFallback.js +84 -12
  271. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
  272. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +278 -16
  273. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  274. package/dist/src/ui/hooks/useShellCompletion.d.ts +49 -0
  275. package/dist/src/ui/hooks/useShellCompletion.js +489 -0
  276. package/dist/src/ui/hooks/useShellCompletion.js.map +1 -0
  277. package/dist/src/ui/hooks/useShellCompletion.test.d.ts +6 -0
  278. package/dist/src/ui/hooks/useShellCompletion.test.js +354 -0
  279. package/dist/src/ui/hooks/useShellCompletion.test.js.map +1 -0
  280. package/dist/src/ui/hooks/useTimedMessage.d.ts +1 -1
  281. package/dist/src/ui/hooks/useTimedMessage.js +5 -3
  282. package/dist/src/ui/hooks/useTimedMessage.js.map +1 -1
  283. package/dist/src/ui/hooks/useToolScheduler.js +5 -0
  284. package/dist/src/ui/hooks/useToolScheduler.js.map +1 -1
  285. package/dist/src/ui/hooks/useToolScheduler.test.js +28 -19
  286. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  287. package/dist/src/ui/types.d.ts +3 -0
  288. package/dist/src/ui/types.js.map +1 -1
  289. package/dist/src/ui/utils/InlineMarkdownRenderer.js +4 -86
  290. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
  291. package/dist/src/ui/utils/MarkdownDisplay.test.js +2 -2
  292. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  293. package/dist/src/ui/utils/TableRenderer.js +18 -12
  294. package/dist/src/ui/utils/TableRenderer.js.map +1 -1
  295. package/dist/src/ui/utils/TableRenderer.test.js +152 -22
  296. package/dist/src/ui/utils/TableRenderer.test.js.map +1 -1
  297. package/dist/src/ui/utils/borderStyles.js +4 -1
  298. package/dist/src/ui/utils/borderStyles.js.map +1 -1
  299. package/dist/src/ui/utils/borderStyles.test.d.ts +6 -0
  300. package/dist/src/ui/utils/borderStyles.test.js +141 -0
  301. package/dist/src/ui/utils/borderStyles.test.js.map +1 -0
  302. package/dist/src/ui/utils/editorUtils.d.ts +17 -0
  303. package/dist/src/ui/utils/editorUtils.js +104 -0
  304. package/dist/src/ui/utils/editorUtils.js.map +1 -0
  305. package/dist/src/ui/utils/markdownParsingUtils.d.ts +10 -0
  306. package/dist/src/ui/utils/markdownParsingUtils.js +150 -0
  307. package/dist/src/ui/utils/markdownParsingUtils.js.map +1 -0
  308. package/dist/src/ui/utils/markdownParsingUtils.test.d.ts +6 -0
  309. package/dist/src/ui/utils/markdownParsingUtils.test.js +163 -0
  310. package/dist/src/ui/utils/markdownParsingUtils.test.js.map +1 -0
  311. package/dist/src/ui/utils/ui-sizing.d.ts +2 -2
  312. package/dist/src/ui/utils/ui-sizing.js +2 -3
  313. package/dist/src/ui/utils/ui-sizing.js.map +1 -1
  314. package/dist/src/ui/utils/ui-sizing.test.js +5 -19
  315. package/dist/src/ui/utils/ui-sizing.test.js.map +1 -1
  316. package/dist/src/utils/cleanup.d.ts +2 -0
  317. package/dist/src/utils/cleanup.js +51 -1
  318. package/dist/src/utils/cleanup.js.map +1 -1
  319. package/dist/src/utils/cleanup.test.js +130 -2
  320. package/dist/src/utils/cleanup.test.js.map +1 -1
  321. package/dist/src/zed-integration/zedIntegration.d.ts +2 -1
  322. package/dist/src/zed-integration/zedIntegration.js +35 -11
  323. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  324. package/dist/src/zed-integration/zedIntegration.test.js +17 -1
  325. package/dist/src/zed-integration/zedIntegration.test.js.map +1 -1
  326. package/dist/tsconfig.tsbuildinfo +1 -1
  327. package/package.json +3 -3
@@ -0,0 +1,163 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeAll, vi } from 'vitest';
7
+ import chalk from 'chalk';
8
+ import { parseMarkdownToANSI } from './markdownParsingUtils.js';
9
+ // Mock the theme to use explicit colors instead of empty strings from the default theme.
10
+ // This ensures that ansiColorize actually applies ANSI codes that we can verify.
11
+ vi.mock('../semantic-colors.js', () => ({
12
+ theme: {
13
+ text: {
14
+ primary: 'white',
15
+ accent: 'cyan',
16
+ link: 'blue',
17
+ },
18
+ },
19
+ }));
20
+ import { theme } from '../semantic-colors.js';
21
+ import { resolveColor, INK_NAME_TO_HEX_MAP } from '../themes/color-utils.js';
22
+ import { themeManager, DEFAULT_THEME } from '../themes/theme-manager.js';
23
+ describe('parsingUtils', () => {
24
+ beforeAll(() => {
25
+ themeManager.setActiveTheme(DEFAULT_THEME.name);
26
+ themeManager.setTerminalBackground(undefined);
27
+ });
28
+ /**
29
+ * Helper to replicate the colorization logic for expected values.
30
+ */
31
+ const expectedColorize = (str, color) => {
32
+ const resolved = resolveColor(color);
33
+ if (!resolved)
34
+ return str;
35
+ if (resolved.startsWith('#'))
36
+ return chalk.hex(resolved)(str);
37
+ const mappedHex = INK_NAME_TO_HEX_MAP[resolved];
38
+ if (mappedHex)
39
+ return chalk.hex(mappedHex)(str);
40
+ // Simple mapping for standard colors if they aren't in the hex map
41
+ switch (resolved) {
42
+ case 'black':
43
+ return chalk.black(str);
44
+ case 'red':
45
+ return chalk.red(str);
46
+ case 'green':
47
+ return chalk.green(str);
48
+ case 'yellow':
49
+ return chalk.yellow(str);
50
+ case 'blue':
51
+ return chalk.blue(str);
52
+ case 'magenta':
53
+ return chalk.magenta(str);
54
+ case 'cyan':
55
+ return chalk.cyan(str);
56
+ case 'white':
57
+ return chalk.white(str);
58
+ case 'gray':
59
+ case 'grey':
60
+ return chalk.gray(str);
61
+ default:
62
+ return str;
63
+ }
64
+ };
65
+ const primary = (str) => expectedColorize(str, theme.text.primary);
66
+ const accent = (str) => expectedColorize(str, theme.text.accent);
67
+ const link = (str) => expectedColorize(str, theme.text.link);
68
+ describe('parseMarkdownToANSI', () => {
69
+ it('should return plain text with default color', () => {
70
+ const input = 'Hello world';
71
+ const output = parseMarkdownToANSI(input);
72
+ expect(output).toBe(primary(input));
73
+ });
74
+ it('should handle bold text', () => {
75
+ const input = 'This is **bold** text';
76
+ const output = parseMarkdownToANSI(input);
77
+ expect(output).toBe(`${primary('This is ')}${chalk.bold(primary('bold'))}${primary(' text')}`);
78
+ });
79
+ it('should handle italic text with *', () => {
80
+ const input = 'This is *italic* text';
81
+ const output = parseMarkdownToANSI(input);
82
+ expect(output).toBe(`${primary('This is ')}${chalk.italic(primary('italic'))}${primary(' text')}`);
83
+ });
84
+ it('should handle italic text with _', () => {
85
+ const input = 'This is _italic_ text';
86
+ const output = parseMarkdownToANSI(input);
87
+ expect(output).toBe(`${primary('This is ')}${chalk.italic(primary('italic'))}${primary(' text')}`);
88
+ });
89
+ it('should handle bold italic text with ***', () => {
90
+ const input = 'This is ***bold italic*** text';
91
+ const output = parseMarkdownToANSI(input);
92
+ expect(output).toBe(`${primary('This is ')}${chalk.bold(chalk.italic(primary('bold italic')))}${primary(' text')}`);
93
+ });
94
+ it('should handle strikethrough text', () => {
95
+ const input = 'This is ~~strikethrough~~ text';
96
+ const output = parseMarkdownToANSI(input);
97
+ expect(output).toBe(`${primary('This is ')}${chalk.strikethrough(primary('strikethrough'))}${primary(' text')}`);
98
+ });
99
+ it('should handle inline code', () => {
100
+ const input = 'This is `code` text';
101
+ const output = parseMarkdownToANSI(input);
102
+ expect(output).toBe(`${primary('This is ')}${accent('code')}${primary(' text')}`);
103
+ });
104
+ it('should handle links', () => {
105
+ const input = 'Check [this link](https://example.com)';
106
+ const output = parseMarkdownToANSI(input);
107
+ expect(output).toBe(`${primary('Check ')}${primary('this link')}${primary(' (')}${link('https://example.com')}${primary(')')}`);
108
+ });
109
+ it('should handle bare URLs', () => {
110
+ const input = 'Visit https://google.com now';
111
+ const output = parseMarkdownToANSI(input);
112
+ expect(output).toBe(`${primary('Visit ')}${link('https://google.com')}${primary(' now')}`);
113
+ });
114
+ it('should handle underline tags', () => {
115
+ const input = 'This is <u>underlined</u> text';
116
+ const output = parseMarkdownToANSI(input);
117
+ expect(output).toBe(`${primary('This is ')}${chalk.underline(primary('underlined'))}${primary(' text')}`);
118
+ });
119
+ it('should handle complex mixed markdown', () => {
120
+ const input = '**Bold** and *italic* and `code` and [link](url)';
121
+ const output = parseMarkdownToANSI(input);
122
+ expect(output).toBe(`${chalk.bold(primary('Bold'))}${primary(' and ')}${chalk.italic(primary('italic'))}${primary(' and ')}${accent('code')}${primary(' and ')}${primary('link')}${primary(' (')}${link('url')}${primary(')')}`);
123
+ });
124
+ it('should respect custom default color', () => {
125
+ const customColor = 'cyan';
126
+ const input = 'Hello **world**';
127
+ const output = parseMarkdownToANSI(input, customColor);
128
+ const cyan = (str) => expectedColorize(str, 'cyan');
129
+ expect(output).toBe(`${cyan('Hello ')}${chalk.bold(cyan('world'))}`);
130
+ });
131
+ it('should handle nested formatting in bold/italic', () => {
132
+ const input = '**Bold with *italic* inside**';
133
+ const output = parseMarkdownToANSI(input);
134
+ expect(output).toBe(chalk.bold(`${primary('Bold with ')}${chalk.italic(primary('italic'))}${primary(' inside')}`));
135
+ });
136
+ it('should handle hex colors as default', () => {
137
+ const hexColor = '#ff00ff';
138
+ const input = 'Hello **world**';
139
+ const output = parseMarkdownToANSI(input, hexColor);
140
+ const magenta = (str) => chalk.hex('#ff00ff')(str);
141
+ expect(output).toBe(`${magenta('Hello ')}${chalk.bold(magenta('world'))}`);
142
+ });
143
+ it('should override default color with link color', () => {
144
+ const input = 'Check [link](url)';
145
+ const output = parseMarkdownToANSI(input, 'red');
146
+ const red = (str) => chalk.red(str);
147
+ expect(output).toBe(`${red('Check ')}${red('link')}${red(' (')}${link('url')}${red(')')}`);
148
+ });
149
+ it('should override default color with accent color for code', () => {
150
+ const input = 'Code: `const x = 1`';
151
+ const output = parseMarkdownToANSI(input, 'green');
152
+ const green = (str) => chalk.green(str);
153
+ const cyan = (str) => chalk.cyan(str);
154
+ expect(output).toBe(`${green('Code: ')}${cyan('const x = 1')}`);
155
+ });
156
+ it('should handle nested formatting with color overrides', () => {
157
+ const input = '**Bold with `code` inside**';
158
+ const output = parseMarkdownToANSI(input);
159
+ expect(output).toBe(chalk.bold(`${primary('Bold with ')}${accent('code')}${primary(' inside')}`));
160
+ });
161
+ });
162
+ });
163
+ //# sourceMappingURL=markdownParsingUtils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdownParsingUtils.test.js","sourceRoot":"","sources":["../../../../src/ui/utils/markdownParsingUtils.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,yFAAyF;AACzF,iFAAiF;AACjF,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,KAAK,EAAE;QACL,IAAI,EAAE;YACJ,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,MAAM;SACb;KACF;CACF,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEzE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAChD,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE;QACtD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ;YAAE,OAAO,GAAG,CAAC;QAC1B,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,SAAS;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;QAEhD,mEAAmE;QACnE,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,OAAO;gBACV,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1B,KAAK,KAAK;gBACR,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,KAAK,OAAO;gBACV,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1B,KAAK,QAAQ;gBACX,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,KAAK,MAAM;gBACT,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,KAAK,SAAS;gBACZ,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC5B,KAAK,MAAM;gBACT,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,KAAK,OAAO;gBACV,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1B,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM;gBACT,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB;gBACE,OAAO,GAAG,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAErE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,KAAK,GAAG,aAAa,CAAC;YAC5B,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,KAAK,GAAG,uBAAuB,CAAC;YACtC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAC1E,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,KAAK,GAAG,uBAAuB,CAAC;YACtC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAC9E,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,KAAK,GAAG,uBAAuB,CAAC;YACtC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAC9E,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,KAAK,GAAG,gCAAgC,CAAC;YAC/C,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAC/F,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,KAAK,GAAG,gCAAgC,CAAC;YAC/C,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAC5F,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,KAAK,GAAG,qBAAqB,CAAC;YACpC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAC7D,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC7B,MAAM,KAAK,GAAG,wCAAwC,CAAC;YACvD,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAChE,qBAAqB,CACtB,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CACnB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,KAAK,GAAG,8BAA8B,CAAC;YAC7C,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CACtE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,KAAK,GAAG,gCAAgC,CAAC;YAC/C,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CACrF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,kDAAkD,CAAC;YACjE,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAC9D,OAAO,CAAC,QAAQ,CAAC,CAClB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAChE,MAAM,CACP,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CACjD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,WAAW,GAAG,MAAM,CAAC;YAC3B,MAAM,KAAK,GAAG,iBAAiB,CAAC;YAChC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,KAAK,GAAG,+BAA+B,CAAC;YAC9C,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,KAAK,CAAC,IAAI,CACR,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,OAAO,CAClE,SAAS,CACV,EAAE,CACJ,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC;YAC3B,MAAM,KAAK,GAAG,iBAAiB,CAAC;YAChC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CACtD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,KAAK,GAAG,mBAAmB,CAAC;YAClC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CACtE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,KAAK,GAAG,qBAAqB,CAAC;YACpC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,KAAK,GAAG,6BAA6B,CAAC;YAC5C,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,KAAK,CAAC,IAAI,CACR,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CACjE,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -3,5 +3,5 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { type LoadedSettings } from '../../config/settings.js';
7
- export declare const calculateMainAreaWidth: (terminalWidth: number, settings: LoadedSettings) => number;
6
+ import type { Config } from '@google/gemini-cli-core';
7
+ export declare const calculateMainAreaWidth: (terminalWidth: number, config: Config) => number;
@@ -3,10 +3,9 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import {} from '../../config/settings.js';
7
6
  import { isAlternateBufferEnabled } from '../hooks/useAlternateBuffer.js';
8
- export const calculateMainAreaWidth = (terminalWidth, settings) => {
9
- if (isAlternateBufferEnabled(settings)) {
7
+ export const calculateMainAreaWidth = (terminalWidth, config) => {
8
+ if (isAlternateBufferEnabled(config)) {
10
9
  return terminalWidth - 1;
11
10
  }
12
11
  return terminalWidth;
@@ -1 +1 @@
1
- {"version":3,"file":"ui-sizing.js","sourceRoot":"","sources":["../../../../src/ui/utils/ui-sizing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAuB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,aAAqB,EACrB,QAAwB,EAChB,EAAE;IACV,IAAI,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,OAAO,aAAa,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC"}
1
+ {"version":3,"file":"ui-sizing.js","sourceRoot":"","sources":["../../../../src/ui/utils/ui-sizing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,aAAqB,EACrB,MAAc,EACN,EAAE;IACV,IAAI,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,aAAa,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC"}
@@ -3,24 +3,9 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { describe, it, expect, vi } from 'vitest';
6
+ import { describe, it, expect } from 'vitest';
7
7
  import { calculateMainAreaWidth } from './ui-sizing.js';
8
- import {} from '../../config/settings.js';
9
- // Mock dependencies
10
- const mocks = vi.hoisted(() => ({
11
- isAlternateBufferEnabled: vi.fn(),
12
- }));
13
- vi.mock('../hooks/useAlternateBuffer.js', () => ({
14
- isAlternateBufferEnabled: mocks.isAlternateBufferEnabled,
15
- }));
16
8
  describe('ui-sizing', () => {
17
- const createSettings = (useFullWidth) => ({
18
- merged: {
19
- ui: {
20
- useFullWidth,
21
- },
22
- },
23
- });
24
9
  describe('calculateMainAreaWidth', () => {
25
10
  it.each([
26
11
  // expected, width, altBuffer
@@ -29,9 +14,10 @@ describe('ui-sizing', () => {
29
14
  [79, 80, true],
30
15
  [99, 100, true],
31
16
  ])('should return %i when width=%i and altBuffer=%s', (expected, width, altBuffer) => {
32
- mocks.isAlternateBufferEnabled.mockReturnValue(altBuffer);
33
- const settings = createSettings();
34
- expect(calculateMainAreaWidth(width, settings)).toBe(expected);
17
+ const mockConfig = {
18
+ getUseAlternateBuffer: () => altBuffer,
19
+ };
20
+ expect(calculateMainAreaWidth(width, mockConfig)).toBe(expected);
35
21
  });
36
22
  });
37
23
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ui-sizing.test.js","sourceRoot":"","sources":["../../../../src/ui/utils/ui-sizing.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAuB,MAAM,0BAA0B,CAAC;AAE/D,oBAAoB;AACpB,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9B,wBAAwB,EAAE,EAAE,CAAC,EAAE,EAAE;CAClC,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/C,wBAAwB,EAAE,KAAK,CAAC,wBAAwB;CACzD,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,MAAM,cAAc,GAAG,CAAC,YAAsB,EAAkB,EAAE,CAChE,CAAC;QACC,MAAM,EAAE;YACN,EAAE,EAAE;gBACF,YAAY;aACb;SACF;KACF,CAA8B,CAAC;IAElC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,IAAI,CAAC;YACN,6BAA6B;YAC7B,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC;YACf,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;YACjB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC;YACd,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC;SAChB,CAAC,CACA,iDAAiD,EACjD,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YAC7B,KAAK,CAAC,wBAAwB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;YAElC,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjE,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"ui-sizing.test.js","sourceRoot":"","sources":["../../../../src/ui/utils/ui-sizing.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,IAAI,CAAC;YACN,6BAA6B;YAC7B,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC;YACf,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;YACjB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC;YACd,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC;SAChB,CAAC,CACA,iDAAiD,EACjD,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YAC7B,MAAM,UAAU,GAAG;gBACjB,qBAAqB,EAAE,GAAG,EAAE,CAAC,SAAS;aAClB,CAAC;YACvB,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnE,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -18,4 +18,6 @@ export declare function runSyncCleanup(): void;
18
18
  */
19
19
  export declare function registerTelemetryConfig(config: Config): void;
20
20
  export declare function runExitCleanup(): Promise<void>;
21
+ export declare function setupSignalHandlers(): void;
22
+ export declare function setupTtyCheck(): () => void;
21
23
  export declare function cleanupCheckpoints(): Promise<void>;
@@ -5,10 +5,11 @@
5
5
  */
6
6
  import { promises as fs } from 'node:fs';
7
7
  import { join } from 'node:path';
8
- import { Storage, shutdownTelemetry, isTelemetrySdkInitialized, } from '@google/gemini-cli-core';
8
+ import { Storage, shutdownTelemetry, isTelemetrySdkInitialized, ExitCodes, } from '@google/gemini-cli-core';
9
9
  const cleanupFunctions = [];
10
10
  const syncCleanupFunctions = [];
11
11
  let configForTelemetry = null;
12
+ let isShuttingDown = false;
12
13
  export function registerCleanup(fn) {
13
14
  cleanupFunctions.push(fn);
14
15
  }
@@ -23,6 +24,7 @@ export function resetCleanupForTesting() {
23
24
  cleanupFunctions.length = 0;
24
25
  syncCleanupFunctions.length = 0;
25
26
  configForTelemetry = null;
27
+ isShuttingDown = false;
26
28
  }
27
29
  export function runSyncCleanup() {
28
30
  for (const fn of syncCleanupFunctions) {
@@ -87,6 +89,54 @@ async function drainStdin() {
87
89
  // Give it a moment to flush the OS buffer.
88
90
  await new Promise((resolve) => setTimeout(resolve, 50));
89
91
  }
92
+ /**
93
+ * Gracefully shuts down the process, ensuring cleanup runs exactly once.
94
+ * Guards against concurrent shutdown from signals (SIGHUP, SIGTERM, SIGINT)
95
+ * and TTY loss detection racing each other.
96
+ *
97
+ * @see https://github.com/google-gemini/gemini-cli/issues/15874
98
+ */
99
+ async function gracefulShutdown(_reason) {
100
+ if (isShuttingDown) {
101
+ return;
102
+ }
103
+ isShuttingDown = true;
104
+ await runExitCleanup();
105
+ process.exit(ExitCodes.SUCCESS);
106
+ }
107
+ export function setupSignalHandlers() {
108
+ process.on('SIGHUP', () => gracefulShutdown('SIGHUP'));
109
+ process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
110
+ process.on('SIGINT', () => gracefulShutdown('SIGINT'));
111
+ }
112
+ export function setupTtyCheck() {
113
+ let intervalId = null;
114
+ let isCheckingTty = false;
115
+ intervalId = setInterval(async () => {
116
+ if (isCheckingTty || isShuttingDown) {
117
+ return;
118
+ }
119
+ if (process.env['SANDBOX']) {
120
+ return;
121
+ }
122
+ if (!process.stdin.isTTY && !process.stdout.isTTY) {
123
+ isCheckingTty = true;
124
+ if (intervalId) {
125
+ clearInterval(intervalId);
126
+ intervalId = null;
127
+ }
128
+ await gracefulShutdown('TTY loss');
129
+ }
130
+ }, 5000);
131
+ // Don't keep the process alive just for this interval
132
+ intervalId.unref();
133
+ return () => {
134
+ if (intervalId) {
135
+ clearInterval(intervalId);
136
+ intervalId = null;
137
+ }
138
+ };
139
+ }
90
140
  export async function cleanupCheckpoints() {
91
141
  const storage = new Storage(process.cwd());
92
142
  await storage.initialize();
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../../src/utils/cleanup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../../src/utils/cleanup.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { vi, describe, it, expect, beforeEach } from 'vitest';
6
+ import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
7
7
  import { promises as fs } from 'node:fs';
8
8
  import * as path from 'node:path';
9
9
  vi.mock('@google/gemini-cli-core', () => ({
@@ -13,13 +13,14 @@ vi.mock('@google/gemini-cli-core', () => ({
13
13
  })),
14
14
  shutdownTelemetry: vi.fn(),
15
15
  isTelemetrySdkInitialized: vi.fn().mockReturnValue(false),
16
+ ExitCodes: { SUCCESS: 0 },
16
17
  }));
17
18
  vi.mock('node:fs', () => ({
18
19
  promises: {
19
20
  rm: vi.fn(),
20
21
  },
21
22
  }));
22
- import { registerCleanup, runExitCleanup, registerSyncCleanup, runSyncCleanup, cleanupCheckpoints, resetCleanupForTesting, } from './cleanup.js';
23
+ import { registerCleanup, runExitCleanup, registerSyncCleanup, runSyncCleanup, cleanupCheckpoints, resetCleanupForTesting, setupSignalHandlers, setupTtyCheck, } from './cleanup.js';
23
24
  describe('cleanup', () => {
24
25
  beforeEach(async () => {
25
26
  vi.clearAllMocks();
@@ -90,4 +91,131 @@ describe('cleanup', () => {
90
91
  });
91
92
  });
92
93
  });
94
+ describe('signal and TTY handling', () => {
95
+ let processOnHandlers;
96
+ beforeEach(() => {
97
+ processOnHandlers = new Map();
98
+ resetCleanupForTesting();
99
+ vi.spyOn(process, 'on').mockImplementation((event, handler) => {
100
+ if (typeof event === 'string') {
101
+ const handlers = processOnHandlers.get(event) || [];
102
+ handlers.push(handler);
103
+ processOnHandlers.set(event, handlers);
104
+ }
105
+ return process;
106
+ });
107
+ vi.spyOn(process, 'exit').mockImplementation((() => {
108
+ // Don't actually exit
109
+ }));
110
+ });
111
+ afterEach(() => {
112
+ vi.restoreAllMocks();
113
+ processOnHandlers.clear();
114
+ });
115
+ describe('setupSignalHandlers', () => {
116
+ it('should register handlers for SIGHUP, SIGTERM, and SIGINT', () => {
117
+ setupSignalHandlers();
118
+ expect(processOnHandlers.has('SIGHUP')).toBe(true);
119
+ expect(processOnHandlers.has('SIGTERM')).toBe(true);
120
+ expect(processOnHandlers.has('SIGINT')).toBe(true);
121
+ });
122
+ it('should gracefully shutdown when SIGHUP is received', async () => {
123
+ setupSignalHandlers();
124
+ const sighupHandlers = processOnHandlers.get('SIGHUP') || [];
125
+ expect(sighupHandlers.length).toBeGreaterThan(0);
126
+ await sighupHandlers[0]?.();
127
+ expect(process.exit).toHaveBeenCalledWith(0);
128
+ });
129
+ it('should register SIGTERM handler that can trigger shutdown', () => {
130
+ setupSignalHandlers();
131
+ const sigtermHandlers = processOnHandlers.get('SIGTERM') || [];
132
+ expect(sigtermHandlers.length).toBeGreaterThan(0);
133
+ expect(typeof sigtermHandlers[0]).toBe('function');
134
+ });
135
+ });
136
+ describe('setupTtyCheck', () => {
137
+ let originalStdinIsTTY;
138
+ let originalStdoutIsTTY;
139
+ beforeEach(() => {
140
+ originalStdinIsTTY = process.stdin.isTTY;
141
+ originalStdoutIsTTY = process.stdout.isTTY;
142
+ vi.useFakeTimers();
143
+ });
144
+ afterEach(() => {
145
+ vi.useRealTimers();
146
+ Object.defineProperty(process.stdin, 'isTTY', {
147
+ value: originalStdinIsTTY,
148
+ writable: true,
149
+ configurable: true,
150
+ });
151
+ Object.defineProperty(process.stdout, 'isTTY', {
152
+ value: originalStdoutIsTTY,
153
+ writable: true,
154
+ configurable: true,
155
+ });
156
+ });
157
+ it('should return a cleanup function', () => {
158
+ const cleanup = setupTtyCheck();
159
+ expect(typeof cleanup).toBe('function');
160
+ cleanup();
161
+ });
162
+ it('should not exit when both stdin and stdout are TTY', async () => {
163
+ Object.defineProperty(process.stdin, 'isTTY', {
164
+ value: true,
165
+ writable: true,
166
+ configurable: true,
167
+ });
168
+ Object.defineProperty(process.stdout, 'isTTY', {
169
+ value: true,
170
+ writable: true,
171
+ configurable: true,
172
+ });
173
+ const cleanup = setupTtyCheck();
174
+ await vi.advanceTimersByTimeAsync(5000);
175
+ expect(process.exit).not.toHaveBeenCalled();
176
+ cleanup();
177
+ });
178
+ it('should exit when both stdin and stdout are not TTY', async () => {
179
+ Object.defineProperty(process.stdin, 'isTTY', {
180
+ value: false,
181
+ writable: true,
182
+ configurable: true,
183
+ });
184
+ Object.defineProperty(process.stdout, 'isTTY', {
185
+ value: false,
186
+ writable: true,
187
+ configurable: true,
188
+ });
189
+ const cleanup = setupTtyCheck();
190
+ await vi.advanceTimersByTimeAsync(5000);
191
+ expect(process.exit).toHaveBeenCalledWith(0);
192
+ cleanup();
193
+ });
194
+ it('should not check when SANDBOX env is set', async () => {
195
+ const originalSandbox = process.env['SANDBOX'];
196
+ process.env['SANDBOX'] = 'true';
197
+ Object.defineProperty(process.stdin, 'isTTY', {
198
+ value: false,
199
+ writable: true,
200
+ configurable: true,
201
+ });
202
+ Object.defineProperty(process.stdout, 'isTTY', {
203
+ value: false,
204
+ writable: true,
205
+ configurable: true,
206
+ });
207
+ const cleanup = setupTtyCheck();
208
+ await vi.advanceTimersByTimeAsync(5000);
209
+ expect(process.exit).not.toHaveBeenCalled();
210
+ cleanup();
211
+ process.env['SANDBOX'] = originalSandbox;
212
+ });
213
+ it('cleanup function should stop the interval', () => {
214
+ const cleanup = setupTtyCheck();
215
+ cleanup();
216
+ vi.advanceTimersByTime(10000);
217
+ expect(process.exit).not.toHaveBeenCalled();
218
+ });
219
+ });
220
+ });
93
221
  //# sourceMappingURL=cleanup.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup.test.js","sourceRoot":"","sources":["../../../src/utils/cleanup.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cleanup.test.js","sourceRoot":"","sources":["../../../src/utils/cleanup.test.ts"],"names":[],"mappings":"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"}
@@ -15,9 +15,10 @@ export declare class GeminiAgent {
15
15
  private connection;
16
16
  private sessions;
17
17
  private clientCapabilities;
18
+ private apiKey;
18
19
  constructor(config: Config, settings: LoadedSettings, argv: CliArgs, connection: acp.AgentSideConnection);
19
20
  initialize(args: acp.InitializeRequest): Promise<acp.InitializeResponse>;
20
- authenticate({ methodId }: acp.AuthenticateRequest): Promise<void>;
21
+ authenticate(req: acp.AuthenticateRequest): Promise<void>;
21
22
  newSession({ cwd, mcpServers, }: acp.NewSessionRequest): Promise<acp.NewSessionResponse>;
22
23
  loadSession({ sessionId, cwd, mcpServers, }: acp.LoadSessionRequest): Promise<acp.LoadSessionResponse>;
23
24
  private initializeSessionConfig;