@machina.ai/cell-cli 1.41.1-rc2 → 1.45.1-rc1

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 (560) hide show
  1. package/dist/index.js +17 -17
  2. package/dist/index.js.map +1 -1
  3. package/dist/package.json +4 -4
  4. package/dist/src/acp/README.md +81 -0
  5. package/dist/src/acp/{commandHandler.d.ts → acpCommandHandler.d.ts} +1 -1
  6. package/dist/src/acp/{commandHandler.js → acpCommandHandler.js} +2 -2
  7. package/dist/src/acp/acpCommandHandler.js.map +1 -0
  8. package/dist/src/acp/{commandHandler.test.js → acpCommandHandler.test.js} +4 -5
  9. package/dist/src/acp/acpCommandHandler.test.js.map +1 -0
  10. package/dist/src/acp/acpErrors.d.ts +1 -1
  11. package/dist/src/acp/acpErrors.js +1 -1
  12. package/dist/src/acp/acpErrors.test.d.ts +1 -1
  13. package/dist/src/acp/acpErrors.test.js +1 -1
  14. package/dist/src/acp/{fileSystemService.d.ts → acpFileSystemService.d.ts} +1 -1
  15. package/dist/src/acp/{fileSystemService.js → acpFileSystemService.js} +7 -4
  16. package/dist/src/acp/acpFileSystemService.js.map +1 -0
  17. package/dist/src/acp/{fileSystemService.test.js → acpFileSystemService.test.js} +3 -3
  18. package/dist/src/acp/acpFileSystemService.test.js.map +1 -0
  19. package/dist/src/acp/acpResume.test.d.ts +1 -1
  20. package/dist/src/acp/acpResume.test.js +12 -7
  21. package/dist/src/acp/acpResume.test.js.map +1 -1
  22. package/dist/src/acp/acpRpcDispatcher.d.ts +28 -0
  23. package/dist/src/acp/acpRpcDispatcher.js +177 -0
  24. package/dist/src/acp/acpRpcDispatcher.js.map +1 -0
  25. package/dist/src/acp/acpRpcDispatcher.test.d.ts +6 -0
  26. package/dist/src/acp/acpRpcDispatcher.test.js +238 -0
  27. package/dist/src/acp/acpRpcDispatcher.test.js.map +1 -0
  28. package/dist/src/acp/acpSession.d.ts +36 -0
  29. package/dist/src/acp/{acpClient.js → acpSession.js} +333 -781
  30. package/dist/src/acp/acpSession.js.map +1 -0
  31. package/dist/src/acp/acpSession.test.d.ts +6 -0
  32. package/dist/src/acp/acpSession.test.js +739 -0
  33. package/dist/src/acp/acpSession.test.js.map +1 -0
  34. package/dist/src/acp/acpSessionManager.d.ts +30 -0
  35. package/dist/src/acp/acpSessionManager.js +206 -0
  36. package/dist/src/acp/acpSessionManager.js.map +1 -0
  37. package/dist/src/acp/acpSessionManager.test.d.ts +6 -0
  38. package/dist/src/acp/acpSessionManager.test.js +283 -0
  39. package/dist/src/acp/acpSessionManager.test.js.map +1 -0
  40. package/dist/src/acp/acpStdioTransport.d.ts +9 -0
  41. package/dist/src/acp/acpStdioTransport.js +23 -0
  42. package/dist/src/acp/acpStdioTransport.js.map +1 -0
  43. package/dist/src/acp/acpUtils.d.ts +56 -0
  44. package/dist/src/acp/acpUtils.js +288 -0
  45. package/dist/src/acp/acpUtils.js.map +1 -0
  46. package/dist/src/acp/commands/commandRegistry.d.ts +1 -1
  47. package/dist/src/acp/commands/commandRegistry.js +1 -1
  48. package/dist/src/acp/commands/extensions.d.ts +1 -1
  49. package/dist/src/acp/commands/extensions.js +1 -1
  50. package/dist/src/acp/commands/extensions.test.d.ts +6 -0
  51. package/dist/src/acp/commands/extensions.test.js +70 -0
  52. package/dist/src/acp/commands/extensions.test.js.map +1 -0
  53. package/dist/src/acp/commands/init.d.ts +1 -1
  54. package/dist/src/acp/commands/init.js +1 -1
  55. package/dist/src/acp/commands/memory.d.ts +3 -8
  56. package/dist/src/acp/commands/memory.js +18 -47
  57. package/dist/src/acp/commands/memory.js.map +1 -1
  58. package/dist/src/acp/commands/restore.d.ts +1 -1
  59. package/dist/src/acp/commands/restore.js +1 -1
  60. package/dist/src/acp/commands/restore.test.js +7 -13
  61. package/dist/src/acp/commands/restore.test.js.map +1 -1
  62. package/dist/src/acp/commands/types.d.ts +1 -1
  63. package/dist/src/acp/commands/types.js +1 -1
  64. package/dist/src/commands/extensions/configure.test.js +6 -2
  65. package/dist/src/commands/extensions/configure.test.js.map +1 -1
  66. package/dist/src/commands/extensions/utils.d.ts +1 -1
  67. package/dist/src/commands/extensions/utils.js +1 -2
  68. package/dist/src/commands/extensions/utils.js.map +1 -1
  69. package/dist/src/commands/mcp/list.js +19 -5
  70. package/dist/src/commands/mcp/list.js.map +1 -1
  71. package/dist/src/commands/mcp/list.test.js +285 -100
  72. package/dist/src/commands/mcp/list.test.js.map +1 -1
  73. package/dist/src/config/auth.d.ts +1 -1
  74. package/dist/src/config/auth.js +4 -3
  75. package/dist/src/config/auth.js.map +1 -1
  76. package/dist/src/config/auth.test.js +11 -4
  77. package/dist/src/config/auth.test.js.map +1 -1
  78. package/dist/src/config/config.d.ts +4 -0
  79. package/dist/src/config/config.js +65 -47
  80. package/dist/src/config/config.js.map +1 -1
  81. package/dist/src/config/config.test.js +25 -106
  82. package/dist/src/config/config.test.js.map +1 -1
  83. package/dist/src/config/extension-manager-agents.test.js +2 -0
  84. package/dist/src/config/extension-manager-agents.test.js.map +1 -1
  85. package/dist/src/config/extension-manager-hydration.test.js +2 -0
  86. package/dist/src/config/extension-manager-hydration.test.js.map +1 -1
  87. package/dist/src/config/extension-manager-scope.test.js +4 -2
  88. package/dist/src/config/extension-manager-scope.test.js.map +1 -1
  89. package/dist/src/config/extension-manager-themes.spec.js +2 -0
  90. package/dist/src/config/extension-manager-themes.spec.js.map +1 -1
  91. package/dist/src/config/extension-manager.d.ts +2 -2
  92. package/dist/src/config/extension-manager.js +2 -1
  93. package/dist/src/config/extension-manager.js.map +1 -1
  94. package/dist/src/config/extensionRegistryClient.js +0 -1
  95. package/dist/src/config/extensionRegistryClient.js.map +1 -1
  96. package/dist/src/config/extensions/consent.d.ts +1 -1
  97. package/dist/src/config/extensions/consent.js +5 -4
  98. package/dist/src/config/extensions/consent.js.map +1 -1
  99. package/dist/src/config/extensions/consent.test.js +22 -0
  100. package/dist/src/config/extensions/consent.test.js.map +1 -1
  101. package/dist/src/config/extensions/extensionEnablement.js +4 -2
  102. package/dist/src/config/extensions/extensionEnablement.js.map +1 -1
  103. package/dist/src/config/extensions/extensionSettings.d.ts +3 -3
  104. package/dist/src/config/extensions/extensionSettings.js +7 -3
  105. package/dist/src/config/extensions/extensionSettings.js.map +1 -1
  106. package/dist/src/config/extensions/variables.js +1 -3
  107. package/dist/src/config/extensions/variables.js.map +1 -1
  108. package/dist/src/config/footerItems.d.ts +4 -0
  109. package/dist/src/config/footerItems.js +6 -0
  110. package/dist/src/config/footerItems.js.map +1 -1
  111. package/dist/src/config/footerItems.test.js +1 -0
  112. package/dist/src/config/footerItems.test.js.map +1 -1
  113. package/dist/src/config/mcp/mcpServerEnablement.js +1 -1
  114. package/dist/src/config/mcp/mcpServerEnablement.js.map +1 -1
  115. package/dist/src/config/mutual-exclusivity.test.js +33 -0
  116. package/dist/src/config/mutual-exclusivity.test.js.map +1 -0
  117. package/dist/src/config/settings-env-isolation.test.d.ts +6 -0
  118. package/dist/src/config/settings-env-isolation.test.js +188 -0
  119. package/dist/src/config/settings-env-isolation.test.js.map +1 -0
  120. package/dist/src/config/settings.d.ts +15 -1
  121. package/dist/src/config/settings.js +85 -10
  122. package/dist/src/config/settings.js.map +1 -1
  123. package/dist/src/config/settings.test.js +167 -0
  124. package/dist/src/config/settings.test.js.map +1 -1
  125. package/dist/src/config/settingsSchema.d.ts +56 -25
  126. package/dist/src/config/settingsSchema.js +66 -27
  127. package/dist/src/config/settingsSchema.js.map +1 -1
  128. package/dist/src/config/settingsSchema.test.js +8 -0
  129. package/dist/src/config/settingsSchema.test.js.map +1 -1
  130. package/dist/src/config/skipExtensions.test.d.ts +6 -0
  131. package/dist/src/config/skipExtensions.test.js +49 -0
  132. package/dist/src/config/skipExtensions.test.js.map +1 -0
  133. package/dist/src/config/workspace-policy-cli.test.js +0 -5
  134. package/dist/src/config/workspace-policy-cli.test.js.map +1 -1
  135. package/dist/src/gemini.d.ts +2 -2
  136. package/dist/src/gemini.js +108 -30
  137. package/dist/src/gemini.js.map +1 -1
  138. package/dist/src/gemini.test.js +147 -16
  139. package/dist/src/gemini.test.js.map +1 -1
  140. package/dist/src/gemini_cleanup.test.js +1 -1
  141. package/dist/src/gemini_cleanup.test.js.map +1 -1
  142. package/dist/src/generated/git-commit.d.ts +2 -2
  143. package/dist/src/generated/git-commit.js +2 -2
  144. package/dist/src/interactiveCli.js +1 -1
  145. package/dist/src/interactiveCli.js.map +1 -1
  146. package/dist/src/nonInteractiveCli.d.ts +7 -0
  147. package/dist/src/nonInteractiveCli.js +56 -6
  148. package/dist/src/nonInteractiveCli.js.map +1 -1
  149. package/dist/src/nonInteractiveCli.test.js +253 -18
  150. package/dist/src/nonInteractiveCli.test.js.map +1 -1
  151. package/dist/src/nonInteractiveCliAgentSession.d.ts +7 -0
  152. package/dist/src/nonInteractiveCliAgentSession.js +22 -3
  153. package/dist/src/nonInteractiveCliAgentSession.js.map +1 -1
  154. package/dist/src/nonInteractiveCliAgentSession.test.js +200 -20
  155. package/dist/src/nonInteractiveCliAgentSession.test.js.map +1 -1
  156. package/dist/src/output-redirection.test.d.ts +6 -0
  157. package/dist/src/output-redirection.test.js +77 -0
  158. package/dist/src/output-redirection.test.js.map +1 -0
  159. package/dist/src/patches/http-proxy-agent.d.ts +6 -0
  160. package/dist/src/patches/http-proxy-agent.js +8 -0
  161. package/dist/src/patches/http-proxy-agent.js.map +1 -0
  162. package/dist/src/patches/https-proxy-agent.d.ts +6 -0
  163. package/dist/src/patches/https-proxy-agent.js +8 -0
  164. package/dist/src/patches/https-proxy-agent.js.map +1 -0
  165. package/dist/src/services/BuiltinCommandLoader.js +5 -1
  166. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  167. package/dist/src/services/BuiltinCommandLoader.test.js +6 -1
  168. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
  169. package/dist/src/services/FileCommandLoader.d.ts +21 -0
  170. package/dist/src/services/FileCommandLoader.js +58 -6
  171. package/dist/src/services/FileCommandLoader.js.map +1 -1
  172. package/dist/src/services/FileCommandLoader.test.js +27 -1
  173. package/dist/src/services/FileCommandLoader.test.js.map +1 -1
  174. package/dist/src/test-utils/mockCommandContext.js +6 -1
  175. package/dist/src/test-utils/mockCommandContext.js.map +1 -1
  176. package/dist/src/test-utils/mockConfig.js +0 -3
  177. package/dist/src/test-utils/mockConfig.js.map +1 -1
  178. package/dist/src/test-utils/render.js +1 -0
  179. package/dist/src/test-utils/render.js.map +1 -1
  180. package/dist/src/test-utils/settings.d.ts +1 -0
  181. package/dist/src/test-utils/settings.js.map +1 -1
  182. package/dist/src/ui/AppContainer.js +60 -73
  183. package/dist/src/ui/AppContainer.js.map +1 -1
  184. package/dist/src/ui/AppContainer.test.js +101 -1
  185. package/dist/src/ui/AppContainer.test.js.map +1 -1
  186. package/dist/src/ui/auth/AuthDialog.js +6 -3
  187. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  188. package/dist/src/ui/auth/AuthDialog.test.js +33 -10
  189. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
  190. package/dist/src/ui/auth/LoginRestartDialog.d.ts +13 -0
  191. package/dist/src/ui/auth/{LoginWithGoogleRestartDialog.js → LoginRestartDialog.js} +7 -6
  192. package/dist/src/ui/auth/LoginRestartDialog.js.map +1 -0
  193. package/dist/src/ui/auth/LoginRestartDialog.test.d.ts +6 -0
  194. package/dist/src/ui/auth/{LoginWithGoogleRestartDialog.test.js → LoginRestartDialog.test.js} +13 -8
  195. package/dist/src/ui/auth/LoginRestartDialog.test.js.map +1 -0
  196. package/dist/src/ui/auth/useAuth.d.ts +1 -1
  197. package/dist/src/ui/auth/useAuth.js +2 -2
  198. package/dist/src/ui/auth/useAuth.js.map +1 -1
  199. package/dist/src/ui/auth/useAuth.test.js +10 -10
  200. package/dist/src/ui/auth/useAuth.test.js.map +1 -1
  201. package/dist/src/ui/commands/agentsCommand.js +19 -2
  202. package/dist/src/ui/commands/agentsCommand.js.map +1 -1
  203. package/dist/src/ui/commands/agentsCommand.test.js +34 -3
  204. package/dist/src/ui/commands/agentsCommand.test.js.map +1 -1
  205. package/dist/src/ui/commands/bugCommand.js +36 -0
  206. package/dist/src/ui/commands/bugCommand.js.map +1 -1
  207. package/dist/src/ui/commands/bugCommand.test.js +106 -1
  208. package/dist/src/ui/commands/bugCommand.test.js.map +1 -1
  209. package/dist/src/ui/commands/bugMemoryCommand.d.ts +7 -0
  210. package/dist/src/ui/commands/bugMemoryCommand.js +62 -0
  211. package/dist/src/ui/commands/bugMemoryCommand.js.map +1 -0
  212. package/dist/src/ui/commands/bugMemoryCommand.test.js +100 -0
  213. package/dist/src/ui/commands/bugMemoryCommand.test.js.map +1 -0
  214. package/dist/src/ui/commands/commandsCommand.js +52 -4
  215. package/dist/src/ui/commands/commandsCommand.js.map +1 -1
  216. package/dist/src/ui/commands/commandsCommand.test.js +75 -2
  217. package/dist/src/ui/commands/commandsCommand.test.js.map +1 -1
  218. package/dist/src/ui/commands/compressCommand.js +28 -26
  219. package/dist/src/ui/commands/compressCommand.js.map +1 -1
  220. package/dist/src/ui/commands/compressCommand.test.js +5 -0
  221. package/dist/src/ui/commands/compressCommand.test.js.map +1 -1
  222. package/dist/src/ui/commands/directoryCommand.js +2 -2
  223. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  224. package/dist/src/ui/commands/directoryCommand.test.js +1 -0
  225. package/dist/src/ui/commands/directoryCommand.test.js.map +1 -1
  226. package/dist/src/ui/commands/exportSessionCommand.d.ts +7 -0
  227. package/dist/src/ui/commands/exportSessionCommand.js +74 -0
  228. package/dist/src/ui/commands/exportSessionCommand.js.map +1 -0
  229. package/dist/src/ui/commands/exportSessionCommand.test.js +100 -0
  230. package/dist/src/ui/commands/exportSessionCommand.test.js.map +1 -0
  231. package/dist/src/ui/commands/extensionsCommand.js +1 -0
  232. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  233. package/dist/src/ui/commands/extensionsCommand.test.js +4 -0
  234. package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
  235. package/dist/src/ui/commands/memoryCommand.d.ts +2 -1
  236. package/dist/src/ui/commands/memoryCommand.js +110 -117
  237. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  238. package/dist/src/ui/commands/memoryCommand.test.js +18 -71
  239. package/dist/src/ui/commands/memoryCommand.test.js.map +1 -1
  240. package/dist/src/ui/commands/quitCommand.js +3 -1
  241. package/dist/src/ui/commands/quitCommand.js.map +1 -1
  242. package/dist/src/ui/commands/quitCommand.test.js +46 -1
  243. package/dist/src/ui/commands/quitCommand.test.js.map +1 -1
  244. package/dist/src/ui/commands/rewindCommand.js.map +1 -1
  245. package/dist/src/ui/commands/skillsCommand.js +1 -1
  246. package/dist/src/ui/commands/skillsCommand.js.map +1 -1
  247. package/dist/src/ui/commands/skillsCommand.test.js +19 -0
  248. package/dist/src/ui/commands/skillsCommand.test.js.map +1 -1
  249. package/dist/src/ui/commands/types.d.ts +3 -1
  250. package/dist/src/ui/commands/types.js.map +1 -1
  251. package/dist/src/ui/components/AsciiArt.d.ts +6 -6
  252. package/dist/src/ui/components/AsciiArt.js +6 -6
  253. package/dist/src/ui/components/AskUserDialog.js +3 -1
  254. package/dist/src/ui/components/AskUserDialog.js.map +1 -1
  255. package/dist/src/ui/components/AskUserDialog.test.js +43 -0
  256. package/dist/src/ui/components/AskUserDialog.test.js.map +1 -1
  257. package/dist/src/ui/components/Composer.js +1 -1
  258. package/dist/src/ui/components/Composer.js.map +1 -1
  259. package/dist/src/ui/components/DialogManager.js +4 -0
  260. package/dist/src/ui/components/DialogManager.js.map +1 -1
  261. package/dist/src/ui/components/EditorSettingsDialog.js +3 -6
  262. package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -1
  263. package/dist/src/ui/components/Footer.js +6 -0
  264. package/dist/src/ui/components/Footer.js.map +1 -1
  265. package/dist/src/ui/components/FooterConfigDialog.js +1 -0
  266. package/dist/src/ui/components/FooterConfigDialog.js.map +1 -1
  267. package/dist/src/ui/components/FooterConfigDialog.test.js +1 -1
  268. package/dist/src/ui/components/FooterConfigDialog.test.js.map +1 -1
  269. package/dist/src/ui/components/HistoryItemDisplay.js +3 -1
  270. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  271. package/dist/src/ui/components/HistoryItemDisplay.test.js +15 -0
  272. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  273. package/dist/src/ui/components/{SkillInboxDialog.d.ts → InboxDialog.d.ts} +3 -2
  274. package/dist/src/ui/components/InboxDialog.js +756 -0
  275. package/dist/src/ui/components/InboxDialog.js.map +1 -0
  276. package/dist/src/ui/components/InboxDialog.test.d.ts +6 -0
  277. package/dist/src/ui/components/InboxDialog.test.js +824 -0
  278. package/dist/src/ui/components/InboxDialog.test.js.map +1 -0
  279. package/dist/src/ui/components/InputPrompt.d.ts +3 -0
  280. package/dist/src/ui/components/InputPrompt.js +35 -17
  281. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  282. package/dist/src/ui/components/InputPrompt.test.js +95 -46
  283. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  284. package/dist/src/ui/components/ListeningIndicator.d.ts +10 -0
  285. package/dist/src/ui/components/ListeningIndicator.js +30 -0
  286. package/dist/src/ui/components/ListeningIndicator.js.map +1 -0
  287. package/dist/src/ui/components/MainContent.test.js +23 -3
  288. package/dist/src/ui/components/MainContent.test.js.map +1 -1
  289. package/dist/src/ui/components/ModelDialog.js +32 -37
  290. package/dist/src/ui/components/ModelDialog.js.map +1 -1
  291. package/dist/src/ui/components/ModelDialog.test.js +30 -27
  292. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  293. package/dist/src/ui/components/ModelStatsDisplay.js +1 -1
  294. package/dist/src/ui/components/ModelStatsDisplay.js.map +1 -1
  295. package/dist/src/ui/components/ModelStatsDisplay.test.js +41 -0
  296. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +1 -1
  297. package/dist/src/ui/components/SessionBrowser.js +7 -0
  298. package/dist/src/ui/components/SessionBrowser.js.map +1 -1
  299. package/dist/src/ui/components/SessionSummaryDisplay.js +9 -4
  300. package/dist/src/ui/components/SessionSummaryDisplay.js.map +1 -1
  301. package/dist/src/ui/components/SessionSummaryDisplay.test.js +12 -23
  302. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +1 -1
  303. package/dist/src/ui/components/SettingsDialog.js +37 -17
  304. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  305. package/dist/src/ui/components/SettingsDialog.test.js +83 -1
  306. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  307. package/dist/src/ui/components/StatsDisplay.js +2 -2
  308. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  309. package/dist/src/ui/components/StatsDisplay.test.js +24 -0
  310. package/dist/src/ui/components/StatsDisplay.test.js.map +1 -1
  311. package/dist/src/ui/components/ThemeDialog.constants.d.ts +26 -0
  312. package/dist/src/ui/components/ThemeDialog.constants.js +27 -0
  313. package/dist/src/ui/components/ThemeDialog.constants.js.map +1 -0
  314. package/dist/src/ui/components/ThemeDialog.js +5 -15
  315. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  316. package/dist/src/ui/components/ToolConfirmationQueue.test.js +1 -1
  317. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +1 -1
  318. package/dist/src/ui/components/VoiceModelDialog.js +7 -2
  319. package/dist/src/ui/components/VoiceModelDialog.js.map +1 -1
  320. package/dist/src/ui/components/VoiceModelDialog.test.d.ts +6 -0
  321. package/dist/src/ui/components/VoiceModelDialog.test.js +68 -0
  322. package/dist/src/ui/components/VoiceModelDialog.test.js.map +1 -0
  323. package/dist/src/ui/components/messages/ExportSessionMessage.d.ts +11 -0
  324. package/dist/src/ui/components/messages/ExportSessionMessage.js +15 -0
  325. package/dist/src/ui/components/messages/ExportSessionMessage.js.map +1 -0
  326. package/dist/src/ui/components/messages/ExportSessionMessage.test.d.ts +6 -0
  327. package/dist/src/ui/components/messages/ExportSessionMessage.test.js +31 -0
  328. package/dist/src/ui/components/messages/ExportSessionMessage.test.js.map +1 -0
  329. package/dist/src/ui/components/messages/ShellToolMessage.js +6 -2
  330. package/dist/src/ui/components/messages/ShellToolMessage.js.map +1 -1
  331. package/dist/src/ui/components/messages/ShellToolMessage.test.js +33 -0
  332. package/dist/src/ui/components/messages/ShellToolMessage.test.js.map +1 -1
  333. package/dist/src/ui/components/messages/SubagentGroupDisplay.js +13 -13
  334. package/dist/src/ui/components/messages/SubagentGroupDisplay.js.map +1 -1
  335. package/dist/src/ui/components/messages/SubagentGroupDisplay.test.js +5 -5
  336. package/dist/src/ui/components/messages/SubagentGroupDisplay.test.js.map +1 -1
  337. package/dist/src/ui/components/messages/SubagentHistoryMessage.test.js +4 -3
  338. package/dist/src/ui/components/messages/SubagentHistoryMessage.test.js.map +1 -1
  339. package/dist/src/ui/components/messages/SubagentProgressDisplay.d.ts +1 -1
  340. package/dist/src/ui/components/messages/SubagentProgressDisplay.js +7 -6
  341. package/dist/src/ui/components/messages/SubagentProgressDisplay.js.map +1 -1
  342. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.js +10 -9
  343. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.js.map +1 -1
  344. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +3 -9
  345. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  346. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +60 -0
  347. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  348. package/dist/src/ui/components/messages/ToolGroupDisplay.d.ts +13 -0
  349. package/dist/src/ui/components/messages/ToolGroupDisplay.js +78 -0
  350. package/dist/src/ui/components/messages/ToolGroupDisplay.js.map +1 -0
  351. package/dist/src/ui/components/messages/ToolGroupDisplay.test.d.ts +6 -0
  352. package/dist/src/ui/components/messages/ToolGroupDisplay.test.js +210 -0
  353. package/dist/src/ui/components/messages/ToolGroupDisplay.test.js.map +1 -0
  354. package/dist/src/ui/components/messages/ToolGroupMessage.js +4 -2
  355. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  356. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +28 -0
  357. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  358. package/dist/src/ui/components/messages/ToolGroupMessageRegression.test.js +3 -3
  359. package/dist/src/ui/components/messages/ToolGroupMessageRegression.test.js.map +1 -1
  360. package/dist/src/ui/components/messages/ToolMessage.js +6 -2
  361. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  362. package/dist/src/ui/components/messages/ToolShared.d.ts +1 -0
  363. package/dist/src/ui/components/messages/ToolShared.js +5 -3
  364. package/dist/src/ui/components/messages/ToolShared.js.map +1 -1
  365. package/dist/src/ui/components/messages/ToolShared.test.js +18 -1
  366. package/dist/src/ui/components/messages/ToolShared.test.js.map +1 -1
  367. package/dist/src/ui/components/shared/BaseSettingsDialog.d.ts +6 -1
  368. package/dist/src/ui/components/shared/BaseSettingsDialog.js +8 -8
  369. package/dist/src/ui/components/shared/BaseSettingsDialog.js.map +1 -1
  370. package/dist/src/ui/components/shared/performance.test.js +9 -0
  371. package/dist/src/ui/components/shared/performance.test.js.map +1 -1
  372. package/dist/src/ui/components/shared/text-buffer.js +22 -5
  373. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  374. package/dist/src/ui/components/shared/text-buffer.test.js +211 -0
  375. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  376. package/dist/src/ui/constants/tips.js +0 -1
  377. package/dist/src/ui/constants/tips.js.map +1 -1
  378. package/dist/src/ui/contexts/UIActionsContext.d.ts +1 -0
  379. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  380. package/dist/src/ui/contexts/UIStateContext.d.ts +2 -0
  381. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  382. package/dist/src/ui/hooks/atCommandProcessor.js +78 -69
  383. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  384. package/dist/src/ui/hooks/atCommandProcessor.test.js +128 -18
  385. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  386. package/dist/src/ui/hooks/slashCommandProcessor.js +13 -0
  387. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  388. package/dist/src/ui/hooks/slashCommandProcessor.test.js +85 -0
  389. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +1 -1
  390. package/dist/src/ui/hooks/useAgentStream.d.ts +2 -2
  391. package/dist/src/ui/hooks/useAgentStream.js +63 -30
  392. package/dist/src/ui/hooks/useAgentStream.js.map +1 -1
  393. package/dist/src/ui/hooks/useAgentStream.test.js +1 -1
  394. package/dist/src/ui/hooks/useAgentStream.test.js.map +1 -1
  395. package/dist/src/ui/hooks/useAtCompletion.js +0 -2
  396. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
  397. package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -2
  398. package/dist/src/ui/hooks/useGeminiStream.js +48 -29
  399. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  400. package/dist/src/ui/hooks/useGeminiStream.test.js +44 -82
  401. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  402. package/dist/src/ui/hooks/useGitBranchName.js +29 -16
  403. package/dist/src/ui/hooks/useGitBranchName.js.map +1 -1
  404. package/dist/src/ui/hooks/useGitBranchName.test.js +102 -51
  405. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
  406. package/dist/src/ui/hooks/useIncludeDirsTrust.js +2 -2
  407. package/dist/src/ui/hooks/useIncludeDirsTrust.js.map +1 -1
  408. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js +2 -0
  409. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +1 -1
  410. package/dist/src/ui/hooks/useMessageQueue.d.ts +2 -1
  411. package/dist/src/ui/hooks/useMessageQueue.js +3 -1
  412. package/dist/src/ui/hooks/useMessageQueue.js.map +1 -1
  413. package/dist/src/ui/hooks/useMessageQueue.test.js +38 -0
  414. package/dist/src/ui/hooks/useMessageQueue.test.js.map +1 -1
  415. package/dist/src/ui/hooks/useSessionBrowser.d.ts +3 -3
  416. package/dist/src/ui/hooks/useSessionBrowser.js.map +1 -1
  417. package/dist/src/ui/hooks/useSessionBrowser.test.js +44 -38
  418. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +1 -1
  419. package/dist/src/ui/hooks/useSessionResume.d.ts +3 -3
  420. package/dist/src/ui/hooks/useSessionResume.js.map +1 -1
  421. package/dist/src/ui/hooks/useSessionResume.test.js +6 -4
  422. package/dist/src/ui/hooks/useSessionResume.test.js.map +1 -1
  423. package/dist/src/ui/hooks/useSuspend.d.ts +1 -3
  424. package/dist/src/ui/hooks/useSuspend.js +3 -17
  425. package/dist/src/ui/hooks/useSuspend.js.map +1 -1
  426. package/dist/src/ui/hooks/useSuspend.test.js +0 -14
  427. package/dist/src/ui/hooks/useSuspend.test.js.map +1 -1
  428. package/dist/src/ui/hooks/useToolScheduler.test.js +6 -6
  429. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  430. package/dist/src/ui/hooks/useVoiceMode.js +25 -19
  431. package/dist/src/ui/hooks/useVoiceMode.js.map +1 -1
  432. package/dist/src/ui/hooks/vim-passthrough.test.js +10 -0
  433. package/dist/src/ui/hooks/vim-passthrough.test.js.map +1 -1
  434. package/dist/src/ui/hooks/vim.js +8 -0
  435. package/dist/src/ui/hooks/vim.js.map +1 -1
  436. package/dist/src/ui/hooks/vim.test.js +61 -0
  437. package/dist/src/ui/hooks/vim.test.js.map +1 -1
  438. package/dist/src/ui/key/keyBindings.d.ts +2 -0
  439. package/dist/src/ui/key/keyBindings.js +26 -9
  440. package/dist/src/ui/key/keyBindings.js.map +1 -1
  441. package/dist/src/ui/key/keyBindings.test.js +24 -0
  442. package/dist/src/ui/key/keyBindings.test.js.map +1 -1
  443. package/dist/src/ui/key/keyMatchers.test.js +26 -5
  444. package/dist/src/ui/key/keyMatchers.test.js.map +1 -1
  445. package/dist/src/ui/themes/theme-manager.js +0 -2
  446. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  447. package/dist/src/ui/types.d.ts +23 -2
  448. package/dist/src/ui/types.js +3 -2
  449. package/dist/src/ui/types.js.map +1 -1
  450. package/dist/src/ui/utils/TableRenderer.js +6 -6
  451. package/dist/src/ui/utils/TableRenderer.js.map +1 -1
  452. package/dist/src/ui/utils/TableRenderer.test.js +10 -0
  453. package/dist/src/ui/utils/TableRenderer.test.js.map +1 -1
  454. package/dist/src/ui/utils/directoryUtils.test.js +0 -5
  455. package/dist/src/ui/utils/directoryUtils.test.js.map +1 -1
  456. package/dist/src/ui/utils/editorUtils.d.ts +2 -1
  457. package/dist/src/ui/utils/editorUtils.js +75 -28
  458. package/dist/src/ui/utils/editorUtils.js.map +1 -1
  459. package/dist/src/ui/utils/latexToUnicode.d.ts +21 -0
  460. package/dist/src/ui/utils/latexToUnicode.js +538 -0
  461. package/dist/src/ui/utils/latexToUnicode.js.map +1 -0
  462. package/dist/src/ui/utils/latexToUnicode.test.d.ts +6 -0
  463. package/dist/src/ui/utils/latexToUnicode.test.js +222 -0
  464. package/dist/src/ui/utils/latexToUnicode.test.js.map +1 -0
  465. package/dist/src/ui/utils/markdownParsingUtils.d.ts +1 -5
  466. package/dist/src/ui/utils/markdownParsingUtils.js +36 -1
  467. package/dist/src/ui/utils/markdownParsingUtils.js.map +1 -1
  468. package/dist/src/ui/utils/markdownParsingUtils.test.js +35 -0
  469. package/dist/src/ui/utils/markdownParsingUtils.test.js.map +1 -1
  470. package/dist/src/ui/utils/memorySnapshot.d.ts +19 -0
  471. package/dist/src/ui/utils/memorySnapshot.js +28 -0
  472. package/dist/src/ui/utils/memorySnapshot.js.map +1 -0
  473. package/dist/src/ui/utils/memorySnapshot.test.d.ts +6 -0
  474. package/dist/src/ui/utils/memorySnapshot.test.js +62 -0
  475. package/dist/src/ui/utils/memorySnapshot.test.js.map +1 -0
  476. package/dist/src/ui/utils/updateCheck.js +11 -2
  477. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  478. package/dist/src/ui/utils/updateCheck.test.js +73 -0
  479. package/dist/src/ui/utils/updateCheck.test.js.map +1 -1
  480. package/dist/src/utils/commands.d.ts +1 -1
  481. package/dist/src/utils/commands.js +1 -1
  482. package/dist/src/utils/commands.test.js +14 -14
  483. package/dist/src/utils/commands.test.js.map +1 -1
  484. package/dist/src/utils/envVarResolver.js +10 -7
  485. package/dist/src/utils/envVarResolver.js.map +1 -1
  486. package/dist/src/utils/gitUtils.js +1 -2
  487. package/dist/src/utils/gitUtils.js.map +1 -1
  488. package/dist/src/utils/handleAutoUpdate.d.ts +1 -1
  489. package/dist/src/utils/handleAutoUpdate.js +15 -3
  490. package/dist/src/utils/handleAutoUpdate.js.map +1 -1
  491. package/dist/src/utils/handleAutoUpdate.test.js +45 -16
  492. package/dist/src/utils/handleAutoUpdate.test.js.map +1 -1
  493. package/dist/src/utils/installationInfo.d.ts +1 -0
  494. package/dist/src/utils/installationInfo.js +16 -1
  495. package/dist/src/utils/installationInfo.js.map +1 -1
  496. package/dist/src/utils/installationInfo.test.js +16 -0
  497. package/dist/src/utils/installationInfo.test.js.map +1 -1
  498. package/dist/src/utils/jsonoutput.js +0 -2
  499. package/dist/src/utils/jsonoutput.js.map +1 -1
  500. package/dist/src/utils/processUtils.d.ts +28 -0
  501. package/dist/src/utils/processUtils.js +71 -0
  502. package/dist/src/utils/processUtils.js.map +1 -1
  503. package/dist/src/utils/processUtils.test.js +122 -1
  504. package/dist/src/utils/processUtils.test.js.map +1 -1
  505. package/dist/src/utils/readStdin.js +22 -4
  506. package/dist/src/utils/readStdin.js.map +1 -1
  507. package/dist/src/utils/readStdin.test.js +32 -0
  508. package/dist/src/utils/readStdin.test.js.map +1 -1
  509. package/dist/src/utils/relaunch.js +6 -13
  510. package/dist/src/utils/relaunch.js.map +1 -1
  511. package/dist/src/utils/relaunch.test.js +82 -86
  512. package/dist/src/utils/relaunch.test.js.map +1 -1
  513. package/dist/src/utils/sandbox.js +34 -24
  514. package/dist/src/utils/sandbox.js.map +1 -1
  515. package/dist/src/utils/sandbox.test.js +108 -9
  516. package/dist/src/utils/sandbox.test.js.map +1 -1
  517. package/dist/src/utils/sandboxUtils.js +12 -7
  518. package/dist/src/utils/sandboxUtils.js.map +1 -1
  519. package/dist/src/utils/sandboxUtils.test.js +68 -0
  520. package/dist/src/utils/sandboxUtils.test.js.map +1 -1
  521. package/dist/src/utils/sessionCleanup.js +49 -14
  522. package/dist/src/utils/sessionCleanup.js.map +1 -1
  523. package/dist/src/utils/sessionCleanup.test.js +63 -0
  524. package/dist/src/utils/sessionCleanup.test.js.map +1 -1
  525. package/dist/src/utils/sessionUtils.js +22 -7
  526. package/dist/src/utils/sessionUtils.js.map +1 -1
  527. package/dist/src/utils/sessionUtils.test.js +99 -0
  528. package/dist/src/utils/sessionUtils.test.js.map +1 -1
  529. package/dist/src/utils/sessions.js +2 -4
  530. package/dist/src/utils/sessions.js.map +1 -1
  531. package/dist/src/utils/sessions.test.js +9 -12
  532. package/dist/src/utils/sessions.test.js.map +1 -1
  533. package/dist/src/utils/userStartupWarnings.js +4 -3
  534. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  535. package/dist/src/utils/userStartupWarnings.test.js +40 -3
  536. package/dist/src/utils/userStartupWarnings.test.js.map +1 -1
  537. package/dist/src/validateNonInterActiveAuth.js +1 -1
  538. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  539. package/dist/tsconfig.tsbuildinfo +1 -1
  540. package/package.json +4 -4
  541. package/dist/src/acp/acpClient.d.ts +0 -56
  542. package/dist/src/acp/acpClient.js.map +0 -1
  543. package/dist/src/acp/acpClient.test.js +0 -1816
  544. package/dist/src/acp/acpClient.test.js.map +0 -1
  545. package/dist/src/acp/commandHandler.js.map +0 -1
  546. package/dist/src/acp/commandHandler.test.js.map +0 -1
  547. package/dist/src/acp/fileSystemService.js.map +0 -1
  548. package/dist/src/acp/fileSystemService.test.js.map +0 -1
  549. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.d.ts +0 -12
  550. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.js.map +0 -1
  551. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js.map +0 -1
  552. package/dist/src/ui/components/SkillInboxDialog.js +0 -420
  553. package/dist/src/ui/components/SkillInboxDialog.js.map +0 -1
  554. package/dist/src/ui/components/SkillInboxDialog.test.js +0 -467
  555. package/dist/src/ui/components/SkillInboxDialog.test.js.map +0 -1
  556. /package/dist/src/acp/{commandHandler.test.d.ts → acpCommandHandler.test.d.ts} +0 -0
  557. /package/dist/src/{ui/components/SkillInboxDialog.test.d.ts → acp/acpFileSystemService.test.d.ts} +0 -0
  558. /package/dist/src/{acp/acpClient.test.d.ts → config/mutual-exclusivity.test.d.ts} +0 -0
  559. /package/dist/src/{acp/fileSystemService.test.d.ts → ui/commands/bugMemoryCommand.test.d.ts} +0 -0
  560. /package/dist/src/ui/{auth/LoginWithGoogleRestartDialog.test.d.ts → commands/exportSessionCommand.test.d.ts} +0 -0
@@ -0,0 +1,739 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
7
+ import { Session } from './acpSession.js';
8
+ import { ReadManyFilesTool, InvalidStreamError, GeminiEventType, PolicyDecision, MessageBusType, DiscoveredMCPTool, } from '@google/gemini-cli-core';
9
+ import { FinishReason } from '@google/genai';
10
+ import * as fs from 'node:fs/promises';
11
+ import * as path from 'node:path';
12
+ vi.mock('node:fs/promises');
13
+ vi.mock('node:path', async (importOriginal) => {
14
+ const actual = await importOriginal();
15
+ return {
16
+ ...actual,
17
+ resolve: vi.fn(),
18
+ };
19
+ });
20
+ vi.mock('@google/gemini-cli-core', async (importOriginal) => {
21
+ const actual = await importOriginal();
22
+ return {
23
+ ...actual,
24
+ updatePolicy: vi.fn(),
25
+ ReadManyFilesTool: vi.fn(),
26
+ logToolCall: vi.fn(),
27
+ processSingleFileContent: vi.fn(),
28
+ };
29
+ });
30
+ async function* createMockStream(items) {
31
+ for (const item of items) {
32
+ yield item;
33
+ }
34
+ yield {
35
+ type: GeminiEventType.Finished,
36
+ value: {
37
+ reason: FinishReason.STOP,
38
+ usageMetadata: {
39
+ promptTokenCount: 5,
40
+ candidatesTokenCount: 10,
41
+ },
42
+ },
43
+ };
44
+ }
45
+ describe('Session', () => {
46
+ let mockChat;
47
+ let mockConfig;
48
+ let mockConnection;
49
+ let session;
50
+ let mockToolRegistry;
51
+ let mockTool;
52
+ let mockMessageBus;
53
+ let mockSendMessageStream;
54
+ beforeEach(() => {
55
+ mockChat = {
56
+ sendMessageStream: vi.fn(),
57
+ addHistory: vi.fn(),
58
+ recordCompletedToolCalls: vi.fn(),
59
+ getHistory: vi.fn().mockReturnValue([]),
60
+ };
61
+ mockTool = {
62
+ kind: 'read',
63
+ build: vi.fn().mockReturnValue({
64
+ getDescription: () => 'Test Tool',
65
+ toolLocations: () => [],
66
+ shouldConfirmExecute: vi.fn().mockResolvedValue(null),
67
+ execute: vi.fn().mockResolvedValue({ llmContent: 'Tool Result' }),
68
+ }),
69
+ };
70
+ mockToolRegistry = {
71
+ getTool: vi.fn().mockReturnValue(mockTool),
72
+ };
73
+ mockMessageBus = {
74
+ publish: vi.fn(),
75
+ subscribe: vi.fn(),
76
+ unsubscribe: vi.fn(),
77
+ };
78
+ mockSendMessageStream = vi.fn();
79
+ mockConfig = {
80
+ getModel: vi.fn().mockReturnValue('gemini-pro'),
81
+ getActiveModel: vi.fn().mockReturnValue('gemini-pro'),
82
+ getModelRouterService: vi.fn().mockReturnValue({
83
+ route: vi.fn().mockResolvedValue({ model: 'resolved-model' }),
84
+ }),
85
+ getToolRegistry: vi.fn().mockReturnValue(mockToolRegistry),
86
+ getFileService: vi.fn().mockReturnValue({
87
+ shouldIgnoreFile: vi.fn().mockReturnValue(false),
88
+ }),
89
+ getFileFilteringOptions: vi.fn().mockReturnValue({}),
90
+ getFileSystemService: vi.fn().mockReturnValue({}),
91
+ getTargetDir: vi.fn().mockReturnValue('/tmp'),
92
+ getEnableRecursiveFileSearch: vi.fn().mockReturnValue(false),
93
+ getDebugMode: vi.fn().mockReturnValue(false),
94
+ getMessageBus: vi.fn().mockReturnValue(mockMessageBus),
95
+ setApprovalMode: vi.fn(),
96
+ setModel: vi.fn(),
97
+ isPlanEnabled: vi.fn().mockReturnValue(true),
98
+ getCheckpointingEnabled: vi.fn().mockReturnValue(false),
99
+ getGitService: vi.fn().mockResolvedValue({}),
100
+ getPolicyEngine: vi.fn().mockReturnValue({
101
+ check: vi.fn(),
102
+ }),
103
+ validatePathAccess: vi.fn().mockReturnValue(null),
104
+ getWorkspaceContext: vi.fn().mockReturnValue({
105
+ addReadOnlyPath: vi.fn(),
106
+ getDirectories: vi.fn().mockReturnValue(['/tmp']),
107
+ }),
108
+ waitForMcpInit: vi.fn(),
109
+ getDisableAlwaysAllow: vi.fn().mockReturnValue(false),
110
+ getMaxSessionTurns: vi.fn().mockReturnValue(-1),
111
+ geminiClient: {
112
+ sendMessageStream: mockSendMessageStream,
113
+ getChat: vi.fn().mockReturnValue(mockChat),
114
+ },
115
+ get config() {
116
+ return this;
117
+ },
118
+ get toolRegistry() {
119
+ return mockToolRegistry;
120
+ },
121
+ };
122
+ mockConnection = {
123
+ sessionUpdate: vi.fn(),
124
+ requestPermission: vi.fn(),
125
+ };
126
+ session = new Session('session-1', mockChat, mockConfig, mockConnection, {
127
+ merged: {
128
+ security: { enablePermanentToolApproval: true },
129
+ mcpServers: {},
130
+ },
131
+ errors: [],
132
+ });
133
+ ReadManyFilesTool.mockImplementation(() => ({
134
+ name: 'read_many_files',
135
+ kind: 'read',
136
+ build: vi.fn().mockReturnValue({
137
+ getDescription: () => 'Read files',
138
+ toolLocations: () => [],
139
+ execute: vi.fn().mockResolvedValue({
140
+ llmContent: ['--- file.txt ---\n\nFile content\n\n'],
141
+ }),
142
+ }),
143
+ }));
144
+ });
145
+ afterEach(() => {
146
+ vi.restoreAllMocks();
147
+ });
148
+ it('should send available commands', async () => {
149
+ await session.sendAvailableCommands();
150
+ expect(mockConnection.sessionUpdate).toHaveBeenCalledWith(expect.objectContaining({
151
+ update: expect.objectContaining({
152
+ sessionUpdate: 'available_commands_update',
153
+ }),
154
+ }));
155
+ });
156
+ it('should await MCP initialization before processing a prompt', async () => {
157
+ const stream = createMockStream([
158
+ {
159
+ type: GeminiEventType.Content,
160
+ value: 'Hi',
161
+ },
162
+ ]);
163
+ mockSendMessageStream.mockReturnValue(stream);
164
+ await session.prompt({
165
+ sessionId: 'session-1',
166
+ prompt: [{ type: 'text', text: 'test' }],
167
+ });
168
+ expect(mockConfig.waitForMcpInit).toHaveBeenCalledOnce();
169
+ });
170
+ it('should handle prompt with text response', async () => {
171
+ const stream = createMockStream([
172
+ {
173
+ type: GeminiEventType.Content,
174
+ value: 'Hello',
175
+ },
176
+ ]);
177
+ mockSendMessageStream.mockReturnValue(stream);
178
+ const result = await session.prompt({
179
+ sessionId: 'session-1',
180
+ prompt: [{ type: 'text', text: 'Hi' }],
181
+ });
182
+ expect(mockSendMessageStream).toHaveBeenCalled();
183
+ expect(mockConnection.sessionUpdate).toHaveBeenCalledWith({
184
+ sessionId: 'session-1',
185
+ update: {
186
+ sessionUpdate: 'agent_message_chunk',
187
+ content: { type: 'text', text: 'Hello' },
188
+ },
189
+ });
190
+ expect(result).toMatchObject({ stopReason: 'end_turn' });
191
+ });
192
+ it('should pass current session information directly onto geminiClient.sendMessageStream', async () => {
193
+ const stream = createMockStream([
194
+ {
195
+ type: GeminiEventType.Content,
196
+ value: 'Hello',
197
+ },
198
+ ]);
199
+ mockSendMessageStream.mockReturnValue(stream);
200
+ await session.prompt({
201
+ sessionId: 'session-1',
202
+ prompt: [{ type: 'text', text: 'Hi' }],
203
+ });
204
+ expect(mockSendMessageStream).toHaveBeenCalledWith(expect.arrayContaining([{ text: 'Hi' }]), expect.any(AbortSignal), expect.any(String));
205
+ });
206
+ it('should handle prompt with empty response (InvalidStreamError)', async () => {
207
+ const error = new InvalidStreamError('Empty response', 'NO_RESPONSE_TEXT');
208
+ mockSendMessageStream.mockImplementation(() => {
209
+ async function* errorGen() {
210
+ yield* [];
211
+ throw error;
212
+ }
213
+ return errorGen();
214
+ });
215
+ const result = await session.prompt({
216
+ sessionId: 'session-1',
217
+ prompt: [{ type: 'text', text: 'Hi' }],
218
+ });
219
+ expect(result).toMatchObject({ stopReason: 'end_turn' });
220
+ });
221
+ it('should handle prompt with no finish reason (InvalidStreamError)', async () => {
222
+ const error = new InvalidStreamError('No finish reason', 'NO_FINISH_REASON');
223
+ mockSendMessageStream.mockImplementation(() => {
224
+ async function* errorGen() {
225
+ yield* [];
226
+ throw error;
227
+ }
228
+ return errorGen();
229
+ });
230
+ const result = await session.prompt({
231
+ sessionId: 'session-1',
232
+ prompt: [{ type: 'text', text: 'Hi' }],
233
+ });
234
+ expect(result).toMatchObject({ stopReason: 'end_turn' });
235
+ });
236
+ it('should handle /memory command', async () => {
237
+ const handleCommandSpy = vi
238
+ .spyOn(session
239
+ .commandHandler, 'handleCommand')
240
+ .mockResolvedValue(true);
241
+ const result = await session.prompt({
242
+ sessionId: 'session-1',
243
+ prompt: [{ type: 'text', text: '/memory view' }],
244
+ });
245
+ expect(result).toMatchObject({ stopReason: 'end_turn' });
246
+ expect(handleCommandSpy).toHaveBeenCalledWith('/memory view', expect.any(Object));
247
+ });
248
+ it('should handle tool calls', async () => {
249
+ const stream1 = createMockStream([
250
+ {
251
+ type: GeminiEventType.ToolCallRequest,
252
+ value: {
253
+ callId: 'call-1',
254
+ name: 'test_tool',
255
+ args: { foo: 'bar' },
256
+ isClientInitiated: false,
257
+ prompt_id: 'prompt-1',
258
+ },
259
+ },
260
+ ]);
261
+ const stream2 = createMockStream([
262
+ {
263
+ type: GeminiEventType.Content,
264
+ value: 'Result',
265
+ },
266
+ ]);
267
+ mockSendMessageStream
268
+ .mockReturnValueOnce(stream1)
269
+ .mockReturnValueOnce(stream2);
270
+ const result = await session.prompt({
271
+ sessionId: 'session-1',
272
+ prompt: [{ type: 'text', text: 'Call tool' }],
273
+ });
274
+ expect(mockToolRegistry.getTool).toHaveBeenCalledWith('test_tool');
275
+ expect(result).toMatchObject({ stopReason: 'end_turn' });
276
+ });
277
+ it('should handle tool call permission request', async () => {
278
+ const confirmationDetails = {
279
+ type: 'info',
280
+ onConfirm: vi.fn(),
281
+ };
282
+ mockTool.build.mockReturnValue({
283
+ getDescription: () => 'Test Tool',
284
+ toolLocations: () => [],
285
+ shouldConfirmExecute: vi.fn().mockResolvedValue(confirmationDetails),
286
+ execute: vi.fn().mockResolvedValue({ llmContent: 'Tool Result' }),
287
+ });
288
+ mockConnection.requestPermission.mockResolvedValue({
289
+ outcome: {
290
+ outcome: 'selected',
291
+ optionId: 'proceed_once',
292
+ },
293
+ });
294
+ const stream1 = createMockStream([
295
+ {
296
+ type: GeminiEventType.ToolCallRequest,
297
+ value: {
298
+ callId: 'call-1',
299
+ name: 'test_tool',
300
+ args: {},
301
+ isClientInitiated: false,
302
+ prompt_id: 'prompt-1',
303
+ },
304
+ },
305
+ ]);
306
+ const stream2 = createMockStream([
307
+ {
308
+ type: GeminiEventType.Content,
309
+ value: '',
310
+ },
311
+ ]);
312
+ mockSendMessageStream
313
+ .mockReturnValueOnce(stream1)
314
+ .mockReturnValueOnce(stream2);
315
+ await session.prompt({
316
+ sessionId: 'session-1',
317
+ prompt: [{ type: 'text', text: 'Call tool' }],
318
+ });
319
+ expect(mockConnection.requestPermission).toHaveBeenCalled();
320
+ expect(confirmationDetails.onConfirm).toHaveBeenCalled();
321
+ });
322
+ it('should handle @path resolution', async () => {
323
+ path.resolve.mockReturnValue('/tmp/file.txt');
324
+ fs.stat.mockResolvedValue({
325
+ isDirectory: () => false,
326
+ });
327
+ const stream = createMockStream([
328
+ {
329
+ type: GeminiEventType.Content,
330
+ value: '',
331
+ },
332
+ ]);
333
+ mockSendMessageStream.mockReturnValue(stream);
334
+ await session.prompt({
335
+ sessionId: 'session-1',
336
+ prompt: [
337
+ { type: 'text', text: 'Read' },
338
+ {
339
+ type: 'resource_link',
340
+ uri: 'file://file.txt',
341
+ mimeType: 'text/plain',
342
+ name: 'file.txt',
343
+ },
344
+ ],
345
+ });
346
+ expect(path.resolve).toHaveBeenCalled();
347
+ expect(fs.stat).toHaveBeenCalled();
348
+ expect(mockSendMessageStream).toHaveBeenCalledWith(expect.arrayContaining([
349
+ expect.objectContaining({
350
+ text: expect.stringContaining('Content from @file.txt'),
351
+ }),
352
+ ]), expect.any(AbortSignal), expect.any(String));
353
+ });
354
+ it('should handle rate limit error', async () => {
355
+ const error = new Error('Rate limit');
356
+ const customError = error;
357
+ customError.status = 429;
358
+ mockSendMessageStream.mockImplementation(() => {
359
+ async function* errorGen() {
360
+ yield* [];
361
+ throw customError;
362
+ }
363
+ return errorGen();
364
+ });
365
+ await expect(session.prompt({
366
+ sessionId: 'session-1',
367
+ prompt: [{ type: 'text', text: 'Hi' }],
368
+ })).rejects.toMatchObject({
369
+ code: 429,
370
+ message: 'Rate limit exceeded. Try again later.',
371
+ });
372
+ });
373
+ it('should handle missing tool', async () => {
374
+ mockToolRegistry.getTool.mockReturnValue(undefined);
375
+ const stream1 = createMockStream([
376
+ {
377
+ type: GeminiEventType.ToolCallRequest,
378
+ value: {
379
+ callId: 'call-1',
380
+ name: 'unknown_tool',
381
+ args: {},
382
+ isClientInitiated: false,
383
+ prompt_id: 'prompt-1',
384
+ },
385
+ },
386
+ ]);
387
+ const stream2 = createMockStream([
388
+ {
389
+ type: GeminiEventType.Content,
390
+ value: '',
391
+ },
392
+ ]);
393
+ mockSendMessageStream
394
+ .mockReturnValueOnce(stream1)
395
+ .mockReturnValueOnce(stream2);
396
+ await session.prompt({
397
+ sessionId: 'session-1',
398
+ prompt: [{ type: 'text', text: 'Call tool' }],
399
+ });
400
+ expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
401
+ });
402
+ it('should handle GeminiEventType.LoopDetected', async () => {
403
+ const stream = createMockStream([
404
+ {
405
+ type: GeminiEventType.LoopDetected,
406
+ },
407
+ ]);
408
+ mockSendMessageStream.mockReturnValue(stream);
409
+ const result = await session.prompt({
410
+ sessionId: 'session-1',
411
+ prompt: [{ type: 'text', text: 'Trigger Loop Simulation' }],
412
+ });
413
+ expect(result.stopReason).toBe('max_turn_requests');
414
+ });
415
+ it('should handle GeminiEventType.ContextWindowWillOverflow', async () => {
416
+ const stream = createMockStream([
417
+ {
418
+ type: GeminiEventType.ContextWindowWillOverflow,
419
+ value: { estimatedRequestTokenCount: 1000, remainingTokenCount: 200 },
420
+ },
421
+ ]);
422
+ mockSendMessageStream.mockReturnValue(stream);
423
+ const result = await session.prompt({
424
+ sessionId: 'session-1',
425
+ prompt: [{ type: 'text', text: 'Trigger Overflow Simulation' }],
426
+ });
427
+ expect(result.stopReason).toBe('max_tokens');
428
+ });
429
+ it('should handle GeminiEventType.MaxSessionTurns', async () => {
430
+ const stream = createMockStream([
431
+ {
432
+ type: GeminiEventType.MaxSessionTurns,
433
+ },
434
+ ]);
435
+ mockSendMessageStream.mockReturnValue(stream);
436
+ const result = await session.prompt({
437
+ sessionId: 'session-1',
438
+ prompt: [{ type: 'text', text: 'Trigger Safety Limits' }],
439
+ });
440
+ expect(result.stopReason).toBe('max_turn_requests');
441
+ });
442
+ it('should send sessionUpdate when approval mode changes', async () => {
443
+ const { coreEvents, CoreEvent, ApprovalMode } = await import('@google/gemini-cli-core');
444
+ coreEvents.emit(CoreEvent.ApprovalModeChanged, {
445
+ sessionId: 'session-1',
446
+ mode: ApprovalMode.PLAN,
447
+ });
448
+ expect(mockConnection.sessionUpdate).toHaveBeenCalledWith({
449
+ sessionId: 'session-1',
450
+ update: {
451
+ sessionUpdate: 'agent_message_chunk',
452
+ content: {
453
+ type: 'text',
454
+ text: `[MODE_UPDATE] ${ApprovalMode.PLAN}`,
455
+ },
456
+ },
457
+ });
458
+ });
459
+ it('should add explanation to tool call content instead of thought chunk', async () => {
460
+ mockTool.build.mockReturnValue({
461
+ getDescription: () => 'Test Tool',
462
+ getExplanation: () => 'Test Explanation',
463
+ toolLocations: () => [],
464
+ shouldConfirmExecute: vi
465
+ .fn()
466
+ .mockResolvedValue({ type: 'info', onConfirm: vi.fn() }),
467
+ execute: vi.fn().mockResolvedValue({ llmContent: 'Tool Result' }),
468
+ });
469
+ mockConnection.requestPermission.mockResolvedValue({
470
+ outcome: {
471
+ outcome: 'selected',
472
+ optionId: 'proceed_once',
473
+ },
474
+ });
475
+ const stream1 = createMockStream([
476
+ {
477
+ type: GeminiEventType.ToolCallRequest,
478
+ value: {
479
+ callId: 'call-1',
480
+ name: 'test_tool',
481
+ args: {},
482
+ isClientInitiated: false,
483
+ prompt_id: 'prompt-1',
484
+ },
485
+ },
486
+ ]);
487
+ const stream2 = createMockStream([
488
+ {
489
+ type: GeminiEventType.Content,
490
+ value: '',
491
+ },
492
+ ]);
493
+ mockSendMessageStream
494
+ .mockReturnValueOnce(stream1)
495
+ .mockReturnValueOnce(stream2);
496
+ await session.prompt({
497
+ sessionId: 'session-1',
498
+ prompt: [{ type: 'text', text: 'Call tool' }],
499
+ });
500
+ expect(mockConnection.sessionUpdate).not.toHaveBeenCalledWith(expect.objectContaining({
501
+ update: expect.objectContaining({
502
+ sessionUpdate: 'agent_thought_chunk',
503
+ content: { type: 'text', text: 'Test Explanation' },
504
+ }),
505
+ }));
506
+ expect(mockConnection.requestPermission).toHaveBeenCalledWith(expect.objectContaining({
507
+ toolCall: expect.objectContaining({
508
+ content: expect.arrayContaining([
509
+ {
510
+ type: 'content',
511
+ content: { type: 'text', text: 'Test Explanation' },
512
+ },
513
+ ]),
514
+ }),
515
+ }));
516
+ });
517
+ it('should add explanation to tool_call update content instead of thought chunk when no permission required', async () => {
518
+ mockTool.build.mockReturnValue({
519
+ getDescription: () => 'Test Tool',
520
+ getExplanation: () => 'Test Explanation',
521
+ toolLocations: () => [],
522
+ shouldConfirmExecute: vi.fn().mockResolvedValue(null),
523
+ execute: vi.fn().mockResolvedValue({ llmContent: 'Tool Result' }),
524
+ });
525
+ const stream1 = createMockStream([
526
+ {
527
+ type: GeminiEventType.ToolCallRequest,
528
+ value: {
529
+ callId: 'call-1',
530
+ name: 'test_tool',
531
+ args: {},
532
+ isClientInitiated: false,
533
+ prompt_id: 'prompt-1',
534
+ },
535
+ },
536
+ ]);
537
+ const stream2 = createMockStream([
538
+ {
539
+ type: GeminiEventType.Content,
540
+ value: '',
541
+ },
542
+ ]);
543
+ mockSendMessageStream
544
+ .mockReturnValueOnce(stream1)
545
+ .mockReturnValueOnce(stream2);
546
+ await session.prompt({
547
+ sessionId: 'session-1',
548
+ prompt: [{ type: 'text', text: 'Call tool' }],
549
+ });
550
+ expect(mockConnection.sessionUpdate).toHaveBeenCalledWith(expect.objectContaining({
551
+ update: expect.objectContaining({
552
+ sessionUpdate: 'tool_call',
553
+ content: expect.arrayContaining([
554
+ {
555
+ type: 'content',
556
+ content: { type: 'text', text: 'Test Explanation' },
557
+ },
558
+ ]),
559
+ }),
560
+ }));
561
+ });
562
+ describe('Policy Handling', () => {
563
+ it('should auto-approve tool calls when PolicyEngine returns ALLOW', async () => {
564
+ const mockPolicyEngine = mockConfig.getPolicyEngine();
565
+ mockPolicyEngine.check.mockResolvedValue({
566
+ decision: PolicyDecision.ALLOW,
567
+ });
568
+ // Trigger the subscription handler
569
+ const handler = mockMessageBus.subscribe.mock.calls.find((call) => call[0] === MessageBusType.TOOL_CONFIRMATION_REQUEST)?.[1];
570
+ expect(handler).toBeDefined();
571
+ await handler({
572
+ type: MessageBusType.TOOL_CONFIRMATION_REQUEST,
573
+ correlationId: 'test-id',
574
+ toolCall: { name: 'ls', args: {} },
575
+ });
576
+ expect(mockMessageBus.publish).toHaveBeenCalledWith(expect.objectContaining({
577
+ type: MessageBusType.TOOL_CONFIRMATION_RESPONSE,
578
+ correlationId: 'test-id',
579
+ confirmed: true,
580
+ requiresUserConfirmation: false,
581
+ }));
582
+ });
583
+ it('should request user confirmation when PolicyEngine returns ASK_USER', async () => {
584
+ const mockPolicyEngine = mockConfig.getPolicyEngine();
585
+ mockPolicyEngine.check.mockResolvedValue({
586
+ decision: PolicyDecision.ASK_USER,
587
+ });
588
+ const handler = mockMessageBus.subscribe.mock.calls.find((call) => call[0] === MessageBusType.TOOL_CONFIRMATION_REQUEST)?.[1];
589
+ await handler({
590
+ type: MessageBusType.TOOL_CONFIRMATION_REQUEST,
591
+ correlationId: 'test-id-2',
592
+ toolCall: { name: 'rm', args: { path: '/' } },
593
+ });
594
+ expect(mockMessageBus.publish).toHaveBeenCalledWith(expect.objectContaining({
595
+ type: MessageBusType.TOOL_CONFIRMATION_RESPONSE,
596
+ correlationId: 'test-id-2',
597
+ confirmed: false,
598
+ requiresUserConfirmation: true,
599
+ }));
600
+ });
601
+ it('should deny tool calls when PolicyEngine returns DENY', async () => {
602
+ const mockPolicyEngine = mockConfig.getPolicyEngine();
603
+ mockPolicyEngine.check.mockResolvedValue({
604
+ decision: PolicyDecision.DENY,
605
+ });
606
+ const handler = mockMessageBus.subscribe.mock.calls.find((call) => call[0] === MessageBusType.TOOL_CONFIRMATION_REQUEST)?.[1];
607
+ await handler({
608
+ type: MessageBusType.TOOL_CONFIRMATION_REQUEST,
609
+ correlationId: 'test-id-3',
610
+ toolCall: { name: 'forbidden', args: {} },
611
+ });
612
+ expect(mockMessageBus.publish).toHaveBeenCalledWith(expect.objectContaining({
613
+ type: MessageBusType.TOOL_CONFIRMATION_RESPONSE,
614
+ correlationId: 'test-id-3',
615
+ confirmed: false,
616
+ requiresUserConfirmation: false,
617
+ }));
618
+ });
619
+ it('should pass subagent and trusted tool info to PolicyEngine', async () => {
620
+ const mockPolicyEngine = mockConfig.getPolicyEngine();
621
+ mockPolicyEngine.check.mockResolvedValue({
622
+ decision: PolicyDecision.ALLOW,
623
+ });
624
+ // Mock tool in registry with trusted annotations
625
+ const trustedAnnotations = { safe: true };
626
+ mockToolRegistry.getTool.mockReturnValue({
627
+ name: 'ls',
628
+ toolAnnotations: trustedAnnotations,
629
+ });
630
+ const handler = mockMessageBus.subscribe.mock.calls.find((call) => call[0] === MessageBusType.TOOL_CONFIRMATION_REQUEST)?.[1];
631
+ await handler({
632
+ type: MessageBusType.TOOL_CONFIRMATION_REQUEST,
633
+ correlationId: 'test-id-trusted',
634
+ toolCall: { name: 'ls', args: {} },
635
+ subagent: 'restricted-subagent',
636
+ serverName: 'spoofed-server', // Should be ignored
637
+ toolAnnotations: { malicious: true }, // Should be ignored
638
+ });
639
+ expect(mockPolicyEngine.check).toHaveBeenCalledWith(expect.anything(), undefined, // serverName for non-MCP tool
640
+ trustedAnnotations, 'restricted-subagent');
641
+ });
642
+ it('should handle exceptions in PolicyEngine by failing closed', async () => {
643
+ const mockPolicyEngine = mockConfig.getPolicyEngine();
644
+ mockPolicyEngine.check.mockRejectedValue(new Error('Policy check failed'));
645
+ const handler = mockMessageBus.subscribe.mock.calls.find((call) => call[0] === MessageBusType.TOOL_CONFIRMATION_REQUEST)?.[1];
646
+ await handler({
647
+ type: MessageBusType.TOOL_CONFIRMATION_REQUEST,
648
+ correlationId: 'test-id-error',
649
+ toolCall: { name: 'ls', args: {} },
650
+ });
651
+ expect(mockMessageBus.publish).toHaveBeenCalledWith(expect.objectContaining({
652
+ type: MessageBusType.TOOL_CONFIRMATION_RESPONSE,
653
+ correlationId: 'test-id-error',
654
+ confirmed: false,
655
+ requiresUserConfirmation: false,
656
+ }));
657
+ });
658
+ it('should fail closed when PolicyEngine is missing', async () => {
659
+ mockConfig.getPolicyEngine.mockReturnValue(undefined);
660
+ const handler = mockMessageBus.subscribe.mock.calls.find((call) => call[0] === MessageBusType.TOOL_CONFIRMATION_REQUEST)?.[1];
661
+ await handler({
662
+ type: MessageBusType.TOOL_CONFIRMATION_REQUEST,
663
+ correlationId: 'test-id-no-engine',
664
+ toolCall: { name: 'ls', args: {} },
665
+ });
666
+ expect(mockMessageBus.publish).toHaveBeenCalledWith(expect.objectContaining({
667
+ type: MessageBusType.TOOL_CONFIRMATION_RESPONSE,
668
+ correlationId: 'test-id-no-engine',
669
+ confirmed: false,
670
+ requiresUserConfirmation: false,
671
+ }));
672
+ });
673
+ it('should handle missing tool name in request by failing closed', async () => {
674
+ const handler = mockMessageBus.subscribe.mock.calls.find((call) => call[0] === MessageBusType.TOOL_CONFIRMATION_REQUEST)?.[1];
675
+ await handler({
676
+ type: MessageBusType.TOOL_CONFIRMATION_REQUEST,
677
+ correlationId: 'test-id-no-name',
678
+ toolCall: { name: '', args: {} },
679
+ });
680
+ expect(mockMessageBus.publish).toHaveBeenCalledWith(expect.objectContaining({
681
+ type: MessageBusType.TOOL_CONFIRMATION_RESPONSE,
682
+ correlationId: 'test-id-no-name',
683
+ confirmed: false,
684
+ requiresUserConfirmation: false,
685
+ }));
686
+ });
687
+ it('should trim tool name before lookup and validation', async () => {
688
+ const handler = mockMessageBus.subscribe.mock.calls.find((call) => call[0] === MessageBusType.TOOL_CONFIRMATION_REQUEST)?.[1];
689
+ await handler({
690
+ type: MessageBusType.TOOL_CONFIRMATION_REQUEST,
691
+ correlationId: 'test-id-whitespace',
692
+ toolCall: { name: ' ', args: {} },
693
+ });
694
+ expect(mockMessageBus.publish).toHaveBeenCalledWith(expect.objectContaining({
695
+ type: MessageBusType.TOOL_CONFIRMATION_RESPONSE,
696
+ correlationId: 'test-id-whitespace',
697
+ confirmed: false,
698
+ requiresUserConfirmation: false,
699
+ }));
700
+ });
701
+ it('should pass serverName from DiscoveredMCPTool to PolicyEngine', async () => {
702
+ const mockPolicyEngine = mockConfig.getPolicyEngine();
703
+ mockPolicyEngine.check.mockResolvedValue({
704
+ decision: PolicyDecision.ALLOW,
705
+ });
706
+ // Mock tool in registry as a DiscoveredMCPTool instance
707
+ const mcpTool = {
708
+ name: 'mcp_server_tool',
709
+ serverName: 'test-server',
710
+ toolAnnotations: { mcp: true },
711
+ };
712
+ Object.setPrototypeOf(mcpTool, DiscoveredMCPTool.prototype);
713
+ mockToolRegistry.getTool.mockReturnValue(mcpTool);
714
+ const handler = mockMessageBus.subscribe.mock.calls.find((call) => call[0] === MessageBusType.TOOL_CONFIRMATION_REQUEST)?.[1];
715
+ await handler({
716
+ type: MessageBusType.TOOL_CONFIRMATION_REQUEST,
717
+ correlationId: 'test-id-mcp',
718
+ toolCall: { name: 'mcp_server_tool', args: {} },
719
+ });
720
+ expect(mockPolicyEngine.check).toHaveBeenCalledWith(expect.anything(), 'test-server', { mcp: true }, undefined);
721
+ });
722
+ it('should fail closed and deny unknown tools', async () => {
723
+ mockToolRegistry.getTool.mockReturnValue(undefined);
724
+ const handler = mockMessageBus.subscribe.mock.calls.find((call) => call[0] === MessageBusType.TOOL_CONFIRMATION_REQUEST)?.[1];
725
+ await handler({
726
+ type: MessageBusType.TOOL_CONFIRMATION_REQUEST,
727
+ correlationId: 'test-id-unknown',
728
+ toolCall: { name: 'unknown_tool', args: {} },
729
+ });
730
+ expect(mockMessageBus.publish).toHaveBeenCalledWith(expect.objectContaining({
731
+ type: MessageBusType.TOOL_CONFIRMATION_RESPONSE,
732
+ correlationId: 'test-id-unknown',
733
+ confirmed: false,
734
+ requiresUserConfirmation: false,
735
+ }));
736
+ });
737
+ });
738
+ });
739
+ //# sourceMappingURL=acpSession.test.js.map