@didim365/agent-cli 0.1.1 → 0.1.3

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 (1091) hide show
  1. package/dist/package.json +5 -2
  2. package/dist/src/config/settingsSchema.d.ts +85 -0
  3. package/dist/src/config/settingsSchema.js +85 -0
  4. package/dist/src/config/settingsSchema.js.map +1 -1
  5. package/dist/src/core/initializer.js +42 -3
  6. package/dist/src/core/initializer.js.map +1 -1
  7. package/dist/src/gemini.d.ts +6 -0
  8. package/dist/src/gemini.js +79 -5
  9. package/dist/src/gemini.js.map +1 -1
  10. package/dist/src/generated/git-commit.d.ts +1 -1
  11. package/dist/src/generated/git-commit.js +1 -1
  12. package/dist/src/test-utils/render.js +9 -0
  13. package/dist/src/test-utils/render.js.map +1 -1
  14. package/dist/src/ui/AppContainer.js +182 -9
  15. package/dist/src/ui/AppContainer.js.map +1 -1
  16. package/dist/src/ui/auth/ApiAuthDialog.d.ts +3 -1
  17. package/dist/src/ui/auth/ApiAuthDialog.js +7 -5
  18. package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -1
  19. package/dist/src/ui/auth/AuthDialog.d.ts +3 -1
  20. package/dist/src/ui/auth/AuthDialog.js +6 -6
  21. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  22. package/dist/src/ui/auth/ProviderSelectDialog.d.ts +15 -0
  23. package/dist/src/ui/auth/ProviderSelectDialog.js +39 -0
  24. package/dist/src/ui/auth/ProviderSelectDialog.js.map +1 -0
  25. package/dist/src/ui/auth/SlmConfigDialog.d.ts +21 -0
  26. package/dist/src/ui/auth/SlmConfigDialog.js +170 -0
  27. package/dist/src/ui/auth/SlmConfigDialog.js.map +1 -0
  28. package/dist/src/ui/auth/VertexConfigDialog.d.ts +18 -0
  29. package/dist/src/ui/auth/VertexConfigDialog.js +97 -0
  30. package/dist/src/ui/auth/VertexConfigDialog.js.map +1 -0
  31. package/dist/src/ui/auth/providerMetadata.d.ts +38 -0
  32. package/dist/src/ui/auth/providerMetadata.js +71 -0
  33. package/dist/src/ui/auth/providerMetadata.js.map +1 -0
  34. package/dist/src/ui/auth/useAuth.d.ts +3 -0
  35. package/dist/src/ui/auth/useAuth.js +243 -39
  36. package/dist/src/ui/auth/useAuth.js.map +1 -1
  37. package/dist/src/ui/commands/authCommand.js +18 -1
  38. package/dist/src/ui/commands/authCommand.js.map +1 -1
  39. package/dist/src/ui/commands/initCommand.js +1 -1
  40. package/dist/src/ui/commands/initCommand.js.map +1 -1
  41. package/dist/src/ui/commands/rewindCommand.js.map +1 -1
  42. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  43. package/dist/src/ui/components/DialogManager.js +27 -2
  44. package/dist/src/ui/components/DialogManager.js.map +1 -1
  45. package/dist/src/ui/components/InputPrompt.js +1 -1
  46. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  47. package/dist/src/ui/contexts/UIActionsContext.d.ts +14 -0
  48. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  49. package/dist/src/ui/contexts/UIStateContext.d.ts +4 -0
  50. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  51. package/dist/src/ui/hooks/useRewind.js.map +1 -1
  52. package/dist/src/ui/types.d.ts +4 -1
  53. package/dist/src/ui/types.js +6 -0
  54. package/dist/src/ui/types.js.map +1 -1
  55. package/dist/src/ui/utils/mouse.js +1 -1
  56. package/dist/src/ui/utils/mouse.js.map +1 -1
  57. package/dist/src/ui/utils/rewindFileOps.js.map +1 -1
  58. package/package.json +6 -3
  59. package/dist/src/commands/extensions/configure.test.d.ts +0 -1
  60. package/dist/src/commands/extensions/configure.test.js +0 -197
  61. package/dist/src/commands/extensions/configure.test.js.map +0 -1
  62. package/dist/src/commands/extensions/disable.test.d.ts +0 -6
  63. package/dist/src/commands/extensions/disable.test.js +0 -169
  64. package/dist/src/commands/extensions/disable.test.js.map +0 -1
  65. package/dist/src/commands/extensions/enable.test.d.ts +0 -6
  66. package/dist/src/commands/extensions/enable.test.js +0 -199
  67. package/dist/src/commands/extensions/enable.test.js.map +0 -1
  68. package/dist/src/commands/extensions/install.test.d.ts +0 -6
  69. package/dist/src/commands/extensions/install.test.js +0 -140
  70. package/dist/src/commands/extensions/install.test.js.map +0 -1
  71. package/dist/src/commands/extensions/link.test.d.ts +0 -6
  72. package/dist/src/commands/extensions/link.test.js +0 -137
  73. package/dist/src/commands/extensions/link.test.js.map +0 -1
  74. package/dist/src/commands/extensions/list.test.d.ts +0 -6
  75. package/dist/src/commands/extensions/list.test.js +0 -148
  76. package/dist/src/commands/extensions/list.test.js.map +0 -1
  77. package/dist/src/commands/extensions/new.test.d.ts +0 -6
  78. package/dist/src/commands/extensions/new.test.js +0 -62
  79. package/dist/src/commands/extensions/new.test.js.map +0 -1
  80. package/dist/src/commands/extensions/uninstall.test.d.ts +0 -6
  81. package/dist/src/commands/extensions/uninstall.test.js +0 -199
  82. package/dist/src/commands/extensions/uninstall.test.js.map +0 -1
  83. package/dist/src/commands/extensions/update.test.d.ts +0 -6
  84. package/dist/src/commands/extensions/update.test.js +0 -170
  85. package/dist/src/commands/extensions/update.test.js.map +0 -1
  86. package/dist/src/commands/extensions/validate.test.d.ts +0 -6
  87. package/dist/src/commands/extensions/validate.test.js +0 -96
  88. package/dist/src/commands/extensions/validate.test.js.map +0 -1
  89. package/dist/src/commands/extensions.test.d.ts +0 -6
  90. package/dist/src/commands/extensions.test.js +0 -67
  91. package/dist/src/commands/extensions.test.js.map +0 -1
  92. package/dist/src/commands/hooks/migrate.test.d.ts +0 -6
  93. package/dist/src/commands/hooks/migrate.test.js +0 -388
  94. package/dist/src/commands/hooks/migrate.test.js.map +0 -1
  95. package/dist/src/commands/mcp/add.test.d.ts +0 -6
  96. package/dist/src/commands/mcp/add.test.js +0 -274
  97. package/dist/src/commands/mcp/add.test.js.map +0 -1
  98. package/dist/src/commands/mcp/list.test.d.ts +0 -6
  99. package/dist/src/commands/mcp/list.test.js +0 -150
  100. package/dist/src/commands/mcp/list.test.js.map +0 -1
  101. package/dist/src/commands/mcp/remove.test.d.ts +0 -6
  102. package/dist/src/commands/mcp/remove.test.js +0 -189
  103. package/dist/src/commands/mcp/remove.test.js.map +0 -1
  104. package/dist/src/commands/mcp.test.d.ts +0 -6
  105. package/dist/src/commands/mcp.test.js +0 -65
  106. package/dist/src/commands/mcp.test.js.map +0 -1
  107. package/dist/src/commands/skills/disable.test.d.ts +0 -6
  108. package/dist/src/commands/skills/disable.test.js +0 -96
  109. package/dist/src/commands/skills/disable.test.js.map +0 -1
  110. package/dist/src/commands/skills/enable.test.d.ts +0 -6
  111. package/dist/src/commands/skills/enable.test.js +0 -107
  112. package/dist/src/commands/skills/enable.test.js.map +0 -1
  113. package/dist/src/commands/skills/install.test.d.ts +0 -6
  114. package/dist/src/commands/skills/install.test.js +0 -95
  115. package/dist/src/commands/skills/install.test.js.map +0 -1
  116. package/dist/src/commands/skills/list.test.d.ts +0 -6
  117. package/dist/src/commands/skills/list.test.js +0 -136
  118. package/dist/src/commands/skills/list.test.js.map +0 -1
  119. package/dist/src/commands/skills/uninstall.test.d.ts +0 -6
  120. package/dist/src/commands/skills/uninstall.test.js +0 -61
  121. package/dist/src/commands/skills/uninstall.test.js.map +0 -1
  122. package/dist/src/commands/skills.test.d.ts +0 -6
  123. package/dist/src/commands/skills.test.js +0 -49
  124. package/dist/src/commands/skills.test.js.map +0 -1
  125. package/dist/src/commands/utils.test.d.ts +0 -6
  126. package/dist/src/commands/utils.test.js +0 -35
  127. package/dist/src/commands/utils.test.js.map +0 -1
  128. package/dist/src/config/auth.test.d.ts +0 -6
  129. package/dist/src/config/auth.test.js +0 -89
  130. package/dist/src/config/auth.test.js.map +0 -1
  131. package/dist/src/config/config.integration.test.d.ts +0 -6
  132. package/dist/src/config/config.integration.test.js +0 -205
  133. package/dist/src/config/config.integration.test.js.map +0 -1
  134. package/dist/src/config/config.test.d.ts +0 -6
  135. package/dist/src/config/config.test.js +0 -2413
  136. package/dist/src/config/config.test.js.map +0 -1
  137. package/dist/src/config/extension-manager-agents.test.d.ts +0 -6
  138. package/dist/src/config/extension-manager-agents.test.js +0 -114
  139. package/dist/src/config/extension-manager-agents.test.js.map +0 -1
  140. package/dist/src/config/extension-manager-scope.test.d.ts +0 -6
  141. package/dist/src/config/extension-manager-scope.test.js +0 -153
  142. package/dist/src/config/extension-manager-scope.test.js.map +0 -1
  143. package/dist/src/config/extension-manager-skills.test.d.ts +0 -6
  144. package/dist/src/config/extension-manager-skills.test.js +0 -148
  145. package/dist/src/config/extension-manager-skills.test.js.map +0 -1
  146. package/dist/src/config/extension.test.d.ts +0 -6
  147. package/dist/src/config/extension.test.js +0 -1671
  148. package/dist/src/config/extension.test.js.map +0 -1
  149. package/dist/src/config/extensions/consent.test.d.ts +0 -6
  150. package/dist/src/config/extensions/consent.test.js +0 -280
  151. package/dist/src/config/extensions/consent.test.js.map +0 -1
  152. package/dist/src/config/extensions/extensionEnablement.test.d.ts +0 -6
  153. package/dist/src/config/extensions/extensionEnablement.test.js +0 -404
  154. package/dist/src/config/extensions/extensionEnablement.test.js.map +0 -1
  155. package/dist/src/config/extensions/extensionSettings.test.d.ts +0 -6
  156. package/dist/src/config/extensions/extensionSettings.test.js +0 -493
  157. package/dist/src/config/extensions/extensionSettings.test.js.map +0 -1
  158. package/dist/src/config/extensions/extensionUpdates.test.d.ts +0 -6
  159. package/dist/src/config/extensions/extensionUpdates.test.js +0 -230
  160. package/dist/src/config/extensions/extensionUpdates.test.js.map +0 -1
  161. package/dist/src/config/extensions/github.test.d.ts +0 -6
  162. package/dist/src/config/extensions/github.test.js +0 -441
  163. package/dist/src/config/extensions/github.test.js.map +0 -1
  164. package/dist/src/config/extensions/github_fetch.test.d.ts +0 -6
  165. package/dist/src/config/extensions/github_fetch.test.js +0 -169
  166. package/dist/src/config/extensions/github_fetch.test.js.map +0 -1
  167. package/dist/src/config/extensions/storage.test.d.ts +0 -6
  168. package/dist/src/config/extensions/storage.test.js +0 -64
  169. package/dist/src/config/extensions/storage.test.js.map +0 -1
  170. package/dist/src/config/extensions/update.test.d.ts +0 -6
  171. package/dist/src/config/extensions/update.test.js +0 -231
  172. package/dist/src/config/extensions/update.test.js.map +0 -1
  173. package/dist/src/config/extensions/variables.test.d.ts +0 -6
  174. package/dist/src/config/extensions/variables.test.js +0 -103
  175. package/dist/src/config/extensions/variables.test.js.map +0 -1
  176. package/dist/src/config/keyBindings.test.d.ts +0 -6
  177. package/dist/src/config/keyBindings.test.js +0 -108
  178. package/dist/src/config/keyBindings.test.js.map +0 -1
  179. package/dist/src/config/mcp/mcpServerEnablement.test.d.ts +0 -6
  180. package/dist/src/config/mcp/mcpServerEnablement.test.js +0 -147
  181. package/dist/src/config/mcp/mcpServerEnablement.test.js.map +0 -1
  182. package/dist/src/config/policy-engine.integration.test.d.ts +0 -6
  183. package/dist/src/config/policy-engine.integration.test.js +0 -353
  184. package/dist/src/config/policy-engine.integration.test.js.map +0 -1
  185. package/dist/src/config/sandboxConfig.test.d.ts +0 -6
  186. package/dist/src/config/sandboxConfig.test.js +0 -184
  187. package/dist/src/config/sandboxConfig.test.js.map +0 -1
  188. package/dist/src/config/settingPaths.test.d.ts +0 -6
  189. package/dist/src/config/settingPaths.test.js +0 -22
  190. package/dist/src/config/settingPaths.test.js.map +0 -1
  191. package/dist/src/config/settings-validation.test.d.ts +0 -6
  192. package/dist/src/config/settings-validation.test.js +0 -370
  193. package/dist/src/config/settings-validation.test.js.map +0 -1
  194. package/dist/src/config/settings.test.d.ts +0 -6
  195. package/dist/src/config/settings.test.js +0 -1822
  196. package/dist/src/config/settings.test.js.map +0 -1
  197. package/dist/src/config/settingsSchema.test.d.ts +0 -6
  198. package/dist/src/config/settingsSchema.test.js +0 -309
  199. package/dist/src/config/settingsSchema.test.js.map +0 -1
  200. package/dist/src/config/settings_repro.test.d.ts +0 -6
  201. package/dist/src/config/settings_repro.test.js +0 -166
  202. package/dist/src/config/settings_repro.test.js.map +0 -1
  203. package/dist/src/config/settings_validation_warning.test.d.ts +0 -6
  204. package/dist/src/config/settings_validation_warning.test.js +0 -123
  205. package/dist/src/config/settings_validation_warning.test.js.map +0 -1
  206. package/dist/src/config/skills-backward-compatibility.test.d.ts +0 -6
  207. package/dist/src/config/skills-backward-compatibility.test.js +0 -99
  208. package/dist/src/config/skills-backward-compatibility.test.js.map +0 -1
  209. package/dist/src/config/trustedFolders.test.d.ts +0 -6
  210. package/dist/src/config/trustedFolders.test.js +0 -385
  211. package/dist/src/config/trustedFolders.test.js.map +0 -1
  212. package/dist/src/core/auth.test.d.ts +0 -6
  213. package/dist/src/core/auth.test.js +0 -47
  214. package/dist/src/core/auth.test.js.map +0 -1
  215. package/dist/src/core/initializer.test.d.ts +0 -6
  216. package/dist/src/core/initializer.test.js +0 -101
  217. package/dist/src/core/initializer.test.js.map +0 -1
  218. package/dist/src/core/theme.test.d.ts +0 -6
  219. package/dist/src/core/theme.test.js +0 -46
  220. package/dist/src/core/theme.test.js.map +0 -1
  221. package/dist/src/deferred.test.d.ts +0 -6
  222. package/dist/src/deferred.test.js +0 -164
  223. package/dist/src/deferred.test.js.map +0 -1
  224. package/dist/src/gemini.test.d.ts +0 -6
  225. package/dist/src/gemini.test.js +0 -1334
  226. package/dist/src/gemini.test.js.map +0 -1
  227. package/dist/src/gemini_cleanup.test.d.ts +0 -6
  228. package/dist/src/gemini_cleanup.test.js +0 -208
  229. package/dist/src/gemini_cleanup.test.js.map +0 -1
  230. package/dist/src/nonInteractiveCli.test.d.ts +0 -6
  231. package/dist/src/nonInteractiveCli.test.js +0 -1687
  232. package/dist/src/nonInteractiveCli.test.js.map +0 -1
  233. package/dist/src/services/BuiltinCommandLoader.test.d.ts +0 -6
  234. package/dist/src/services/BuiltinCommandLoader.test.js +0 -254
  235. package/dist/src/services/BuiltinCommandLoader.test.js.map +0 -1
  236. package/dist/src/services/CommandService.test.d.ts +0 -6
  237. package/dist/src/services/CommandService.test.js +0 -234
  238. package/dist/src/services/CommandService.test.js.map +0 -1
  239. package/dist/src/services/FileCommandLoader.test.d.ts +0 -6
  240. package/dist/src/services/FileCommandLoader.test.js +0 -1102
  241. package/dist/src/services/FileCommandLoader.test.js.map +0 -1
  242. package/dist/src/services/McpPromptLoader.test.d.ts +0 -6
  243. package/dist/src/services/McpPromptLoader.test.js +0 -411
  244. package/dist/src/services/McpPromptLoader.test.js.map +0 -1
  245. package/dist/src/services/prompt-processors/argumentProcessor.test.d.ts +0 -6
  246. package/dist/src/services/prompt-processors/argumentProcessor.test.js +0 -40
  247. package/dist/src/services/prompt-processors/argumentProcessor.test.js.map +0 -1
  248. package/dist/src/services/prompt-processors/atFileProcessor.test.d.ts +0 -6
  249. package/dist/src/services/prompt-processors/atFileProcessor.test.js +0 -174
  250. package/dist/src/services/prompt-processors/atFileProcessor.test.js.map +0 -1
  251. package/dist/src/services/prompt-processors/injectionParser.test.d.ts +0 -6
  252. package/dist/src/services/prompt-processors/injectionParser.test.js +0 -189
  253. package/dist/src/services/prompt-processors/injectionParser.test.js.map +0 -1
  254. package/dist/src/services/prompt-processors/shellProcessor.test.d.ts +0 -6
  255. package/dist/src/services/prompt-processors/shellProcessor.test.js +0 -514
  256. package/dist/src/services/prompt-processors/shellProcessor.test.js.map +0 -1
  257. package/dist/src/test-utils/mockCommandContext.test.d.ts +0 -6
  258. package/dist/src/test-utils/mockCommandContext.test.js +0 -51
  259. package/dist/src/test-utils/mockCommandContext.test.js.map +0 -1
  260. package/dist/src/test-utils/render.test.d.ts +0 -6
  261. package/dist/src/test-utils/render.test.js +0 -79
  262. package/dist/src/test-utils/render.test.js.map +0 -1
  263. package/dist/src/ui/App.test.d.ts +0 -6
  264. package/dist/src/ui/App.test.js +0 -218
  265. package/dist/src/ui/App.test.js.map +0 -1
  266. package/dist/src/ui/AppContainer.test.d.ts +0 -6
  267. package/dist/src/ui/AppContainer.test.js +0 -2072
  268. package/dist/src/ui/AppContainer.test.js.map +0 -1
  269. package/dist/src/ui/IdeIntegrationNudge.test.d.ts +0 -6
  270. package/dist/src/ui/IdeIntegrationNudge.test.js +0 -158
  271. package/dist/src/ui/IdeIntegrationNudge.test.js.map +0 -1
  272. package/dist/src/ui/auth/ApiAuthDialog.test.d.ts +0 -6
  273. package/dist/src/ui/auth/ApiAuthDialog.test.js +0 -109
  274. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +0 -1
  275. package/dist/src/ui/auth/AuthDialog.test.d.ts +0 -6
  276. package/dist/src/ui/auth/AuthDialog.test.js +0 -309
  277. package/dist/src/ui/auth/AuthDialog.test.js.map +0 -1
  278. package/dist/src/ui/auth/AuthInProgress.test.d.ts +0 -6
  279. package/dist/src/ui/auth/AuthInProgress.test.js +0 -81
  280. package/dist/src/ui/auth/AuthInProgress.test.js.map +0 -1
  281. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.d.ts +0 -6
  282. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js +0 -66
  283. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js.map +0 -1
  284. package/dist/src/ui/auth/useAuth.test.d.ts +0 -6
  285. package/dist/src/ui/auth/useAuth.test.js +0 -189
  286. package/dist/src/ui/auth/useAuth.test.js.map +0 -1
  287. package/dist/src/ui/commands/aboutCommand.test.d.ts +0 -6
  288. package/dist/src/ui/commands/aboutCommand.test.js +0 -143
  289. package/dist/src/ui/commands/aboutCommand.test.js.map +0 -1
  290. package/dist/src/ui/commands/agentsCommand.test.d.ts +0 -6
  291. package/dist/src/ui/commands/agentsCommand.test.js +0 -344
  292. package/dist/src/ui/commands/agentsCommand.test.js.map +0 -1
  293. package/dist/src/ui/commands/authCommand.test.d.ts +0 -6
  294. package/dist/src/ui/commands/authCommand.test.js +0 -98
  295. package/dist/src/ui/commands/authCommand.test.js.map +0 -1
  296. package/dist/src/ui/commands/bugCommand.test.d.ts +0 -6
  297. package/dist/src/ui/commands/bugCommand.test.js +0 -186
  298. package/dist/src/ui/commands/bugCommand.test.js.map +0 -1
  299. package/dist/src/ui/commands/chatCommand.test.d.ts +0 -6
  300. package/dist/src/ui/commands/chatCommand.test.js +0 -620
  301. package/dist/src/ui/commands/chatCommand.test.js.map +0 -1
  302. package/dist/src/ui/commands/clearCommand.test.d.ts +0 -6
  303. package/dist/src/ui/commands/clearCommand.test.js +0 -87
  304. package/dist/src/ui/commands/clearCommand.test.js.map +0 -1
  305. package/dist/src/ui/commands/compressCommand.test.d.ts +0 -6
  306. package/dist/src/ui/commands/compressCommand.test.js +0 -98
  307. package/dist/src/ui/commands/compressCommand.test.js.map +0 -1
  308. package/dist/src/ui/commands/copyCommand.test.d.ts +0 -6
  309. package/dist/src/ui/commands/copyCommand.test.js +0 -242
  310. package/dist/src/ui/commands/copyCommand.test.js.map +0 -1
  311. package/dist/src/ui/commands/corgiCommand.test.d.ts +0 -6
  312. package/dist/src/ui/commands/corgiCommand.test.js +0 -28
  313. package/dist/src/ui/commands/corgiCommand.test.js.map +0 -1
  314. package/dist/src/ui/commands/directoryCommand.test.d.ts +0 -6
  315. package/dist/src/ui/commands/directoryCommand.test.js +0 -353
  316. package/dist/src/ui/commands/directoryCommand.test.js.map +0 -1
  317. package/dist/src/ui/commands/docsCommand.test.d.ts +0 -6
  318. package/dist/src/ui/commands/docsCommand.test.js +0 -72
  319. package/dist/src/ui/commands/docsCommand.test.js.map +0 -1
  320. package/dist/src/ui/commands/editorCommand.test.d.ts +0 -6
  321. package/dist/src/ui/commands/editorCommand.test.js +0 -27
  322. package/dist/src/ui/commands/editorCommand.test.js.map +0 -1
  323. package/dist/src/ui/commands/extensionsCommand.test.d.ts +0 -6
  324. package/dist/src/ui/commands/extensionsCommand.test.js +0 -778
  325. package/dist/src/ui/commands/extensionsCommand.test.js.map +0 -1
  326. package/dist/src/ui/commands/helpCommand.test.d.ts +0 -6
  327. package/dist/src/ui/commands/helpCommand.test.js +0 -42
  328. package/dist/src/ui/commands/helpCommand.test.js.map +0 -1
  329. package/dist/src/ui/commands/hooksCommand.test.d.ts +0 -6
  330. package/dist/src/ui/commands/hooksCommand.test.js +0 -572
  331. package/dist/src/ui/commands/hooksCommand.test.js.map +0 -1
  332. package/dist/src/ui/commands/ideCommand.test.d.ts +0 -6
  333. package/dist/src/ui/commands/ideCommand.test.js +0 -203
  334. package/dist/src/ui/commands/ideCommand.test.js.map +0 -1
  335. package/dist/src/ui/commands/initCommand.test.d.ts +0 -6
  336. package/dist/src/ui/commands/initCommand.test.js +0 -84
  337. package/dist/src/ui/commands/initCommand.test.js.map +0 -1
  338. package/dist/src/ui/commands/mcpCommand.test.d.ts +0 -6
  339. package/dist/src/ui/commands/mcpCommand.test.js +0 -189
  340. package/dist/src/ui/commands/mcpCommand.test.js.map +0 -1
  341. package/dist/src/ui/commands/memoryCommand.test.d.ts +0 -6
  342. package/dist/src/ui/commands/memoryCommand.test.js +0 -350
  343. package/dist/src/ui/commands/memoryCommand.test.js.map +0 -1
  344. package/dist/src/ui/commands/modelCommand.test.d.ts +0 -6
  345. package/dist/src/ui/commands/modelCommand.test.js +0 -41
  346. package/dist/src/ui/commands/modelCommand.test.js.map +0 -1
  347. package/dist/src/ui/commands/permissionsCommand.test.d.ts +0 -6
  348. package/dist/src/ui/commands/permissionsCommand.test.js +0 -86
  349. package/dist/src/ui/commands/permissionsCommand.test.js.map +0 -1
  350. package/dist/src/ui/commands/policiesCommand.test.d.ts +0 -6
  351. package/dist/src/ui/commands/policiesCommand.test.js +0 -87
  352. package/dist/src/ui/commands/policiesCommand.test.js.map +0 -1
  353. package/dist/src/ui/commands/privacyCommand.test.d.ts +0 -6
  354. package/dist/src/ui/commands/privacyCommand.test.js +0 -32
  355. package/dist/src/ui/commands/privacyCommand.test.js.map +0 -1
  356. package/dist/src/ui/commands/quitCommand.test.d.ts +0 -6
  357. package/dist/src/ui/commands/quitCommand.test.js +0 -50
  358. package/dist/src/ui/commands/quitCommand.test.js.map +0 -1
  359. package/dist/src/ui/commands/restoreCommand.test.d.ts +0 -6
  360. package/dist/src/ui/commands/restoreCommand.test.js +0 -190
  361. package/dist/src/ui/commands/restoreCommand.test.js.map +0 -1
  362. package/dist/src/ui/commands/rewindCommand.test.d.ts +0 -6
  363. package/dist/src/ui/commands/rewindCommand.test.js +0 -242
  364. package/dist/src/ui/commands/rewindCommand.test.js.map +0 -1
  365. package/dist/src/ui/commands/settingsCommand.test.d.ts +0 -6
  366. package/dist/src/ui/commands/settingsCommand.test.js +0 -30
  367. package/dist/src/ui/commands/settingsCommand.test.js.map +0 -1
  368. package/dist/src/ui/commands/setupGithubCommand.test.d.ts +0 -6
  369. package/dist/src/ui/commands/setupGithubCommand.test.js +0 -238
  370. package/dist/src/ui/commands/setupGithubCommand.test.js.map +0 -1
  371. package/dist/src/ui/commands/skillsCommand.test.d.ts +0 -6
  372. package/dist/src/ui/commands/skillsCommand.test.js +0 -426
  373. package/dist/src/ui/commands/skillsCommand.test.js.map +0 -1
  374. package/dist/src/ui/commands/statsCommand.test.d.ts +0 -6
  375. package/dist/src/ui/commands/statsCommand.test.js +0 -70
  376. package/dist/src/ui/commands/statsCommand.test.js.map +0 -1
  377. package/dist/src/ui/commands/terminalSetupCommand.test.d.ts +0 -6
  378. package/dist/src/ui/commands/terminalSetupCommand.test.js +0 -66
  379. package/dist/src/ui/commands/terminalSetupCommand.test.js.map +0 -1
  380. package/dist/src/ui/commands/themeCommand.test.d.ts +0 -6
  381. package/dist/src/ui/commands/themeCommand.test.js +0 -32
  382. package/dist/src/ui/commands/themeCommand.test.js.map +0 -1
  383. package/dist/src/ui/commands/toolsCommand.test.d.ts +0 -6
  384. package/dist/src/ui/commands/toolsCommand.test.js +0 -100
  385. package/dist/src/ui/commands/toolsCommand.test.js.map +0 -1
  386. package/dist/src/ui/components/AboutBox.test.d.ts +0 -6
  387. package/dist/src/ui/components/AboutBox.test.js +0 -59
  388. package/dist/src/ui/components/AboutBox.test.js.map +0 -1
  389. package/dist/src/ui/components/AdminSettingsChangedDialog.test.d.ts +0 -6
  390. package/dist/src/ui/components/AdminSettingsChangedDialog.test.js +0 -43
  391. package/dist/src/ui/components/AdminSettingsChangedDialog.test.js.map +0 -1
  392. package/dist/src/ui/components/AgentConfigDialog.test.d.ts +0 -6
  393. package/dist/src/ui/components/AgentConfigDialog.test.js +0 -241
  394. package/dist/src/ui/components/AgentConfigDialog.test.js.map +0 -1
  395. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.d.ts +0 -6
  396. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +0 -190
  397. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +0 -1
  398. package/dist/src/ui/components/AnsiOutput.test.d.ts +0 -6
  399. package/dist/src/ui/components/AnsiOutput.test.js +0 -92
  400. package/dist/src/ui/components/AnsiOutput.test.js.map +0 -1
  401. package/dist/src/ui/components/AppHeader.test.d.ts +0 -6
  402. package/dist/src/ui/components/AppHeader.test.js +0 -225
  403. package/dist/src/ui/components/AppHeader.test.js.map +0 -1
  404. package/dist/src/ui/components/ApprovalModeIndicator.test.d.ts +0 -6
  405. package/dist/src/ui/components/ApprovalModeIndicator.test.js +0 -37
  406. package/dist/src/ui/components/ApprovalModeIndicator.test.js.map +0 -1
  407. package/dist/src/ui/components/AskUserDialog.test.d.ts +0 -6
  408. package/dist/src/ui/components/AskUserDialog.test.js +0 -598
  409. package/dist/src/ui/components/AskUserDialog.test.js.map +0 -1
  410. package/dist/src/ui/components/Banner.test.d.ts +0 -6
  411. package/dist/src/ui/components/Banner.test.js +0 -24
  412. package/dist/src/ui/components/Banner.test.js.map +0 -1
  413. package/dist/src/ui/components/CliSpinner.test.d.ts +0 -6
  414. package/dist/src/ui/components/CliSpinner.test.js +0 -28
  415. package/dist/src/ui/components/CliSpinner.test.js.map +0 -1
  416. package/dist/src/ui/components/Composer.test.d.ts +0 -6
  417. package/dist/src/ui/components/Composer.test.js +0 -383
  418. package/dist/src/ui/components/Composer.test.js.map +0 -1
  419. package/dist/src/ui/components/ConfigInitDisplay.test.d.ts +0 -6
  420. package/dist/src/ui/components/ConfigInitDisplay.test.js +0 -117
  421. package/dist/src/ui/components/ConfigInitDisplay.test.js.map +0 -1
  422. package/dist/src/ui/components/ConsentPrompt.test.d.ts +0 -6
  423. package/dist/src/ui/components/ConsentPrompt.test.js +0 -77
  424. package/dist/src/ui/components/ConsentPrompt.test.js.map +0 -1
  425. package/dist/src/ui/components/ConsoleSummaryDisplay.test.d.ts +0 -6
  426. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js +0 -26
  427. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js.map +0 -1
  428. package/dist/src/ui/components/ContextSummaryDisplay.test.d.ts +0 -6
  429. package/dist/src/ui/components/ContextSummaryDisplay.test.js +0 -102
  430. package/dist/src/ui/components/ContextSummaryDisplay.test.js.map +0 -1
  431. package/dist/src/ui/components/ContextUsageDisplay.test.d.ts +0 -6
  432. package/dist/src/ui/components/ContextUsageDisplay.test.js +0 -43
  433. package/dist/src/ui/components/ContextUsageDisplay.test.js.map +0 -1
  434. package/dist/src/ui/components/CopyModeWarning.test.d.ts +0 -6
  435. package/dist/src/ui/components/CopyModeWarning.test.js +0 -33
  436. package/dist/src/ui/components/CopyModeWarning.test.js.map +0 -1
  437. package/dist/src/ui/components/DebugProfiler.test.d.ts +0 -6
  438. package/dist/src/ui/components/DebugProfiler.test.js +0 -229
  439. package/dist/src/ui/components/DebugProfiler.test.js.map +0 -1
  440. package/dist/src/ui/components/DetailedMessagesDisplay.test.d.ts +0 -6
  441. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +0 -39
  442. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +0 -1
  443. package/dist/src/ui/components/DialogManager.test.d.ts +0 -6
  444. package/dist/src/ui/components/DialogManager.test.js +0 -177
  445. package/dist/src/ui/components/DialogManager.test.js.map +0 -1
  446. package/dist/src/ui/components/EditorSettingsDialog.test.d.ts +0 -6
  447. package/dist/src/ui/components/EditorSettingsDialog.test.js +0 -119
  448. package/dist/src/ui/components/EditorSettingsDialog.test.js.map +0 -1
  449. package/dist/src/ui/components/ExitWarning.test.d.ts +0 -6
  450. package/dist/src/ui/components/ExitWarning.test.js +0 -54
  451. package/dist/src/ui/components/ExitWarning.test.js.map +0 -1
  452. package/dist/src/ui/components/FolderTrustDialog.test.d.ts +0 -6
  453. package/dist/src/ui/components/FolderTrustDialog.test.js +0 -102
  454. package/dist/src/ui/components/FolderTrustDialog.test.js.map +0 -1
  455. package/dist/src/ui/components/Footer.test.d.ts +0 -6
  456. package/dist/src/ui/components/Footer.test.js +0 -321
  457. package/dist/src/ui/components/Footer.test.js.map +0 -1
  458. package/dist/src/ui/components/GeminiRespondingSpinner.test.d.ts +0 -6
  459. package/dist/src/ui/components/GeminiRespondingSpinner.test.js +0 -61
  460. package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +0 -1
  461. package/dist/src/ui/components/GradientRegression.test.d.ts +0 -6
  462. package/dist/src/ui/components/GradientRegression.test.js +0 -105
  463. package/dist/src/ui/components/GradientRegression.test.js.map +0 -1
  464. package/dist/src/ui/components/Header.test.d.ts +0 -6
  465. package/dist/src/ui/components/Header.test.js +0 -147
  466. package/dist/src/ui/components/Header.test.js.map +0 -1
  467. package/dist/src/ui/components/Help.test.d.ts +0 -6
  468. package/dist/src/ui/components/Help.test.js +0 -67
  469. package/dist/src/ui/components/Help.test.js.map +0 -1
  470. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +0 -6
  471. package/dist/src/ui/components/HistoryItemDisplay.test.js +0 -207
  472. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +0 -1
  473. package/dist/src/ui/components/HookStatusDisplay.test.d.ts +0 -6
  474. package/dist/src/ui/components/HookStatusDisplay.test.js +0 -51
  475. package/dist/src/ui/components/HookStatusDisplay.test.js.map +0 -1
  476. package/dist/src/ui/components/IdeTrustChangeDialog.test.d.ts +0 -6
  477. package/dist/src/ui/components/IdeTrustChangeDialog.test.js +0 -58
  478. package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +0 -1
  479. package/dist/src/ui/components/InputPrompt.test.d.ts +0 -6
  480. package/dist/src/ui/components/InputPrompt.test.js +0 -2596
  481. package/dist/src/ui/components/InputPrompt.test.js.map +0 -1
  482. package/dist/src/ui/components/LoadingIndicator.test.d.ts +0 -6
  483. package/dist/src/ui/components/LoadingIndicator.test.js +0 -207
  484. package/dist/src/ui/components/LoadingIndicator.test.js.map +0 -1
  485. package/dist/src/ui/components/LogoutConfirmationDialog.test.d.ts +0 -6
  486. package/dist/src/ui/components/LogoutConfirmationDialog.test.js +0 -59
  487. package/dist/src/ui/components/LogoutConfirmationDialog.test.js.map +0 -1
  488. package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +0 -6
  489. package/dist/src/ui/components/LoopDetectionConfirmation.test.js +0 -25
  490. package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +0 -1
  491. package/dist/src/ui/components/MainContent.test.d.ts +0 -6
  492. package/dist/src/ui/components/MainContent.test.js +0 -83
  493. package/dist/src/ui/components/MainContent.test.js.map +0 -1
  494. package/dist/src/ui/components/MemoryUsageDisplay.test.d.ts +0 -6
  495. package/dist/src/ui/components/MemoryUsageDisplay.test.js +0 -49
  496. package/dist/src/ui/components/MemoryUsageDisplay.test.js.map +0 -1
  497. package/dist/src/ui/components/ModelDialog.test.d.ts +0 -6
  498. package/dist/src/ui/components/ModelDialog.test.js +0 -197
  499. package/dist/src/ui/components/ModelDialog.test.js.map +0 -1
  500. package/dist/src/ui/components/ModelStatsDisplay.test.d.ts +0 -6
  501. package/dist/src/ui/components/ModelStatsDisplay.test.js +0 -343
  502. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +0 -1
  503. package/dist/src/ui/components/MultiFolderTrustDialog.test.d.ts +0 -6
  504. package/dist/src/ui/components/MultiFolderTrustDialog.test.js +0 -162
  505. package/dist/src/ui/components/MultiFolderTrustDialog.test.js.map +0 -1
  506. package/dist/src/ui/components/NewAgentsNotification.test.d.ts +0 -6
  507. package/dist/src/ui/components/NewAgentsNotification.test.js +0 -48
  508. package/dist/src/ui/components/NewAgentsNotification.test.js.map +0 -1
  509. package/dist/src/ui/components/Notifications.test.d.ts +0 -6
  510. package/dist/src/ui/components/Notifications.test.js +0 -164
  511. package/dist/src/ui/components/Notifications.test.js.map +0 -1
  512. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.d.ts +0 -6
  513. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +0 -162
  514. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +0 -1
  515. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +0 -6
  516. package/dist/src/ui/components/ProQuotaDialog.test.js +0 -191
  517. package/dist/src/ui/components/ProQuotaDialog.test.js.map +0 -1
  518. package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +0 -6
  519. package/dist/src/ui/components/QueuedMessageDisplay.test.js +0 -65
  520. package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +0 -1
  521. package/dist/src/ui/components/QuittingDisplay.test.d.ts +0 -6
  522. package/dist/src/ui/components/QuittingDisplay.test.js +0 -49
  523. package/dist/src/ui/components/QuittingDisplay.test.js.map +0 -1
  524. package/dist/src/ui/components/RawMarkdownIndicator.test.d.ts +0 -6
  525. package/dist/src/ui/components/RawMarkdownIndicator.test.js +0 -34
  526. package/dist/src/ui/components/RawMarkdownIndicator.test.js.map +0 -1
  527. package/dist/src/ui/components/RewindConfirmation.test.d.ts +0 -6
  528. package/dist/src/ui/components/RewindConfirmation.test.js +0 -53
  529. package/dist/src/ui/components/RewindConfirmation.test.js.map +0 -1
  530. package/dist/src/ui/components/RewindViewer.test.d.ts +0 -6
  531. package/dist/src/ui/components/RewindViewer.test.js +0 -241
  532. package/dist/src/ui/components/RewindViewer.test.js.map +0 -1
  533. package/dist/src/ui/components/SessionBrowser.test.d.ts +0 -6
  534. package/dist/src/ui/components/SessionBrowser.test.js +0 -256
  535. package/dist/src/ui/components/SessionBrowser.test.js.map +0 -1
  536. package/dist/src/ui/components/SessionSummaryDisplay.test.d.ts +0 -6
  537. package/dist/src/ui/components/SessionSummaryDisplay.test.js +0 -75
  538. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +0 -1
  539. package/dist/src/ui/components/SettingsDialog.test.d.ts +0 -6
  540. package/dist/src/ui/components/SettingsDialog.test.js +0 -1150
  541. package/dist/src/ui/components/SettingsDialog.test.js.map +0 -1
  542. package/dist/src/ui/components/ShellInputPrompt.test.d.ts +0 -6
  543. package/dist/src/ui/components/ShellInputPrompt.test.js +0 -91
  544. package/dist/src/ui/components/ShellInputPrompt.test.js.map +0 -1
  545. package/dist/src/ui/components/ShellModeIndicator.test.d.ts +0 -6
  546. package/dist/src/ui/components/ShellModeIndicator.test.js +0 -17
  547. package/dist/src/ui/components/ShellModeIndicator.test.js.map +0 -1
  548. package/dist/src/ui/components/ShowMoreLines.test.d.ts +0 -6
  549. package/dist/src/ui/components/ShowMoreLines.test.js +0 -40
  550. package/dist/src/ui/components/ShowMoreLines.test.js.map +0 -1
  551. package/dist/src/ui/components/StatsDisplay.test.d.ts +0 -6
  552. package/dist/src/ui/components/StatsDisplay.test.js +0 -438
  553. package/dist/src/ui/components/StatsDisplay.test.js.map +0 -1
  554. package/dist/src/ui/components/StatusDisplay.test.d.ts +0 -6
  555. package/dist/src/ui/components/StatusDisplay.test.js +0 -155
  556. package/dist/src/ui/components/StatusDisplay.test.js.map +0 -1
  557. package/dist/src/ui/components/StickyHeader.test.d.ts +0 -6
  558. package/dist/src/ui/components/StickyHeader.test.js +0 -17
  559. package/dist/src/ui/components/StickyHeader.test.js.map +0 -1
  560. package/dist/src/ui/components/SuggestionsDisplay.test.d.ts +0 -6
  561. package/dist/src/ui/components/SuggestionsDisplay.test.js +0 -56
  562. package/dist/src/ui/components/SuggestionsDisplay.test.js.map +0 -1
  563. package/dist/src/ui/components/Table.test.d.ts +0 -6
  564. package/dist/src/ui/components/Table.test.js +0 -53
  565. package/dist/src/ui/components/Table.test.js.map +0 -1
  566. package/dist/src/ui/components/ThemeDialog.test.d.ts +0 -6
  567. package/dist/src/ui/components/ThemeDialog.test.js +0 -167
  568. package/dist/src/ui/components/ThemeDialog.test.js.map +0 -1
  569. package/dist/src/ui/components/ThemedGradient.test.d.ts +0 -6
  570. package/dist/src/ui/components/ThemedGradient.test.js +0 -30
  571. package/dist/src/ui/components/ThemedGradient.test.js.map +0 -1
  572. package/dist/src/ui/components/Tips.test.d.ts +0 -6
  573. package/dist/src/ui/components/Tips.test.js +0 -23
  574. package/dist/src/ui/components/Tips.test.js.map +0 -1
  575. package/dist/src/ui/components/ToolConfirmationQueue.test.d.ts +0 -6
  576. package/dist/src/ui/components/ToolConfirmationQueue.test.js +0 -71
  577. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +0 -1
  578. package/dist/src/ui/components/ToolStatsDisplay.test.d.ts +0 -6
  579. package/dist/src/ui/components/ToolStatsDisplay.test.js +0 -227
  580. package/dist/src/ui/components/ToolStatsDisplay.test.js.map +0 -1
  581. package/dist/src/ui/components/UpdateNotification.test.d.ts +0 -6
  582. package/dist/src/ui/components/UpdateNotification.test.js +0 -16
  583. package/dist/src/ui/components/UpdateNotification.test.js.map +0 -1
  584. package/dist/src/ui/components/ValidationDialog.test.d.ts +0 -6
  585. package/dist/src/ui/components/ValidationDialog.test.js +0 -153
  586. package/dist/src/ui/components/ValidationDialog.test.js.map +0 -1
  587. package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +0 -6
  588. package/dist/src/ui/components/messages/CompressionMessage.test.js +0 -191
  589. package/dist/src/ui/components/messages/CompressionMessage.test.js.map +0 -1
  590. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +0 -6
  591. package/dist/src/ui/components/messages/DiffRenderer.test.js +0 -240
  592. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +0 -1
  593. package/dist/src/ui/components/messages/ErrorMessage.test.d.ts +0 -6
  594. package/dist/src/ui/components/messages/ErrorMessage.test.js +0 -23
  595. package/dist/src/ui/components/messages/ErrorMessage.test.js.map +0 -1
  596. package/dist/src/ui/components/messages/GeminiMessage.test.d.ts +0 -6
  597. package/dist/src/ui/components/messages/GeminiMessage.test.js +0 -35
  598. package/dist/src/ui/components/messages/GeminiMessage.test.js.map +0 -1
  599. package/dist/src/ui/components/messages/InfoMessage.test.d.ts +0 -6
  600. package/dist/src/ui/components/messages/InfoMessage.test.js +0 -28
  601. package/dist/src/ui/components/messages/InfoMessage.test.js.map +0 -1
  602. package/dist/src/ui/components/messages/RedirectionConfirmation.test.d.ts +0 -6
  603. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +0 -33
  604. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +0 -1
  605. package/dist/src/ui/components/messages/ShellToolMessage.test.d.ts +0 -6
  606. package/dist/src/ui/components/messages/ShellToolMessage.test.js +0 -123
  607. package/dist/src/ui/components/messages/ShellToolMessage.test.js.map +0 -1
  608. package/dist/src/ui/components/messages/Todo.test.d.ts +0 -6
  609. package/dist/src/ui/components/messages/Todo.test.js +0 -114
  610. package/dist/src/ui/components/messages/Todo.test.js.map +0 -1
  611. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +0 -6
  612. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -232
  613. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +0 -1
  614. package/dist/src/ui/components/messages/ToolGroupMessage.test.d.ts +0 -6
  615. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +0 -529
  616. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +0 -1
  617. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +0 -6
  618. package/dist/src/ui/components/messages/ToolMessage.test.js +0 -217
  619. package/dist/src/ui/components/messages/ToolMessage.test.js.map +0 -1
  620. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.d.ts +0 -6
  621. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js +0 -89
  622. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js.map +0 -1
  623. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.d.ts +0 -6
  624. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js +0 -62
  625. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js.map +0 -1
  626. package/dist/src/ui/components/messages/ToolResultDisplay.test.d.ts +0 -6
  627. package/dist/src/ui/components/messages/ToolResultDisplay.test.js +0 -114
  628. package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +0 -1
  629. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.d.ts +0 -6
  630. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js +0 -134
  631. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js.map +0 -1
  632. package/dist/src/ui/components/messages/UserMessage.test.d.ts +0 -6
  633. package/dist/src/ui/components/messages/UserMessage.test.js +0 -32
  634. package/dist/src/ui/components/messages/UserMessage.test.js.map +0 -1
  635. package/dist/src/ui/components/messages/WarningMessage.test.d.ts +0 -6
  636. package/dist/src/ui/components/messages/WarningMessage.test.js +0 -23
  637. package/dist/src/ui/components/messages/WarningMessage.test.js.map +0 -1
  638. package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +0 -6
  639. package/dist/src/ui/components/shared/BaseSelectionList.test.js +0 -386
  640. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +0 -1
  641. package/dist/src/ui/components/shared/BaseSettingsDialog.test.d.ts +0 -6
  642. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js +0 -434
  643. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js.map +0 -1
  644. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +0 -6
  645. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +0 -79
  646. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +0 -1
  647. package/dist/src/ui/components/shared/EnumSelector.test.d.ts +0 -6
  648. package/dist/src/ui/components/shared/EnumSelector.test.js +0 -70
  649. package/dist/src/ui/components/shared/EnumSelector.test.js.map +0 -1
  650. package/dist/src/ui/components/shared/ExpandableText.test.d.ts +0 -6
  651. package/dist/src/ui/components/shared/ExpandableText.test.js +0 -88
  652. package/dist/src/ui/components/shared/ExpandableText.test.js.map +0 -1
  653. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.d.ts +0 -6
  654. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js +0 -34
  655. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js.map +0 -1
  656. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +0 -6
  657. package/dist/src/ui/components/shared/MaxSizedBox.test.js +0 -90
  658. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +0 -1
  659. package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +0 -6
  660. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +0 -134
  661. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +0 -1
  662. package/dist/src/ui/components/shared/Scrollable.test.d.ts +0 -6
  663. package/dist/src/ui/components/shared/Scrollable.test.js +0 -74
  664. package/dist/src/ui/components/shared/Scrollable.test.js.map +0 -1
  665. package/dist/src/ui/components/shared/ScrollableList.test.d.ts +0 -6
  666. package/dist/src/ui/components/shared/ScrollableList.test.js +0 -241
  667. package/dist/src/ui/components/shared/ScrollableList.test.js.map +0 -1
  668. package/dist/src/ui/components/shared/TabHeader.test.d.ts +0 -6
  669. package/dist/src/ui/components/shared/TabHeader.test.js +0 -106
  670. package/dist/src/ui/components/shared/TabHeader.test.js.map +0 -1
  671. package/dist/src/ui/components/shared/TextInput.test.d.ts +0 -6
  672. package/dist/src/ui/components/shared/TextInput.test.js +0 -242
  673. package/dist/src/ui/components/shared/TextInput.test.js.map +0 -1
  674. package/dist/src/ui/components/shared/VirtualizedList.test.d.ts +0 -6
  675. package/dist/src/ui/components/shared/VirtualizedList.test.js +0 -171
  676. package/dist/src/ui/components/shared/VirtualizedList.test.js.map +0 -1
  677. package/dist/src/ui/components/shared/performance.test.d.ts +0 -1
  678. package/dist/src/ui/components/shared/performance.test.js +0 -67
  679. package/dist/src/ui/components/shared/performance.test.js.map +0 -1
  680. package/dist/src/ui/components/shared/text-buffer.test.d.ts +0 -6
  681. package/dist/src/ui/components/shared/text-buffer.test.js +0 -2490
  682. package/dist/src/ui/components/shared/text-buffer.test.js.map +0 -1
  683. package/dist/src/ui/components/shared/vim-buffer-actions.test.d.ts +0 -6
  684. package/dist/src/ui/components/shared/vim-buffer-actions.test.js +0 -964
  685. package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +0 -1
  686. package/dist/src/ui/components/views/ChatList.test.d.ts +0 -6
  687. package/dist/src/ui/components/views/ChatList.test.js +0 -45
  688. package/dist/src/ui/components/views/ChatList.test.js.map +0 -1
  689. package/dist/src/ui/components/views/ExtensionsList.test.d.ts +0 -6
  690. package/dist/src/ui/components/views/ExtensionsList.test.js +0 -148
  691. package/dist/src/ui/components/views/ExtensionsList.test.js.map +0 -1
  692. package/dist/src/ui/components/views/McpStatus.test.d.ts +0 -6
  693. package/dist/src/ui/components/views/McpStatus.test.js +0 -153
  694. package/dist/src/ui/components/views/McpStatus.test.js.map +0 -1
  695. package/dist/src/ui/components/views/SkillsList.test.d.ts +0 -6
  696. package/dist/src/ui/components/views/SkillsList.test.js +0 -97
  697. package/dist/src/ui/components/views/SkillsList.test.js.map +0 -1
  698. package/dist/src/ui/components/views/ToolsList.test.d.ts +0 -6
  699. package/dist/src/ui/components/views/ToolsList.test.js +0 -45
  700. package/dist/src/ui/components/views/ToolsList.test.js.map +0 -1
  701. package/dist/src/ui/contexts/KeypressContext.test.d.ts +0 -6
  702. package/dist/src/ui/contexts/KeypressContext.test.js +0 -957
  703. package/dist/src/ui/contexts/KeypressContext.test.js.map +0 -1
  704. package/dist/src/ui/contexts/MouseContext.test.d.ts +0 -6
  705. package/dist/src/ui/contexts/MouseContext.test.js +0 -198
  706. package/dist/src/ui/contexts/MouseContext.test.js.map +0 -1
  707. package/dist/src/ui/contexts/ScrollProvider.drag.test.d.ts +0 -6
  708. package/dist/src/ui/contexts/ScrollProvider.drag.test.js +0 -319
  709. package/dist/src/ui/contexts/ScrollProvider.drag.test.js.map +0 -1
  710. package/dist/src/ui/contexts/ScrollProvider.test.d.ts +0 -6
  711. package/dist/src/ui/contexts/ScrollProvider.test.js +0 -377
  712. package/dist/src/ui/contexts/ScrollProvider.test.js.map +0 -1
  713. package/dist/src/ui/contexts/SessionContext.test.d.ts +0 -6
  714. package/dist/src/ui/contexts/SessionContext.test.js +0 -198
  715. package/dist/src/ui/contexts/SessionContext.test.js.map +0 -1
  716. package/dist/src/ui/contexts/ToolActionsContext.test.d.ts +0 -6
  717. package/dist/src/ui/contexts/ToolActionsContext.test.js +0 -166
  718. package/dist/src/ui/contexts/ToolActionsContext.test.js.map +0 -1
  719. package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +0 -6
  720. package/dist/src/ui/hooks/atCommandProcessor.test.js +0 -1032
  721. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +0 -1
  722. package/dist/src/ui/hooks/atCommandProcessor_agents.test.d.ts +0 -6
  723. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js +0 -183
  724. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js.map +0 -1
  725. package/dist/src/ui/hooks/shellCommandProcessor.test.d.ts +0 -6
  726. package/dist/src/ui/hooks/shellCommandProcessor.test.js +0 -521
  727. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +0 -1
  728. package/dist/src/ui/hooks/slashCommandProcessor.test.d.ts +0 -6
  729. package/dist/src/ui/hooks/slashCommandProcessor.test.js +0 -796
  730. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +0 -1
  731. package/dist/src/ui/hooks/toolMapping.test.d.ts +0 -6
  732. package/dist/src/ui/hooks/toolMapping.test.js +0 -209
  733. package/dist/src/ui/hooks/toolMapping.test.js.map +0 -1
  734. package/dist/src/ui/hooks/useAnimatedScrollbar.test.d.ts +0 -6
  735. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js +0 -85
  736. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js.map +0 -1
  737. package/dist/src/ui/hooks/useApprovalModeIndicator.test.d.ts +0 -6
  738. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js +0 -435
  739. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js.map +0 -1
  740. package/dist/src/ui/hooks/useAtCompletion.test.d.ts +0 -6
  741. package/dist/src/ui/hooks/useAtCompletion.test.js +0 -417
  742. package/dist/src/ui/hooks/useAtCompletion.test.js.map +0 -1
  743. package/dist/src/ui/hooks/useAtCompletion_agents.test.d.ts +0 -6
  744. package/dist/src/ui/hooks/useAtCompletion_agents.test.js +0 -87
  745. package/dist/src/ui/hooks/useAtCompletion_agents.test.js.map +0 -1
  746. package/dist/src/ui/hooks/useBanner.test.d.ts +0 -6
  747. package/dist/src/ui/hooks/useBanner.test.js +0 -92
  748. package/dist/src/ui/hooks/useBanner.test.js.map +0 -1
  749. package/dist/src/ui/hooks/useBatchedScroll.test.d.ts +0 -6
  750. package/dist/src/ui/hooks/useBatchedScroll.test.js +0 -62
  751. package/dist/src/ui/hooks/useBatchedScroll.test.js.map +0 -1
  752. package/dist/src/ui/hooks/useCommandCompletion.test.d.ts +0 -6
  753. package/dist/src/ui/hooks/useCommandCompletion.test.js +0 -462
  754. package/dist/src/ui/hooks/useCommandCompletion.test.js.map +0 -1
  755. package/dist/src/ui/hooks/useConsoleMessages.test.d.ts +0 -6
  756. package/dist/src/ui/hooks/useConsoleMessages.test.js +0 -159
  757. package/dist/src/ui/hooks/useConsoleMessages.test.js.map +0 -1
  758. package/dist/src/ui/hooks/useEditorSettings.test.d.ts +0 -6
  759. package/dist/src/ui/hooks/useEditorSettings.test.js +0 -179
  760. package/dist/src/ui/hooks/useEditorSettings.test.js.map +0 -1
  761. package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +0 -6
  762. package/dist/src/ui/hooks/useExtensionUpdates.test.js +0 -279
  763. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +0 -1
  764. package/dist/src/ui/hooks/useFlickerDetector.test.d.ts +0 -6
  765. package/dist/src/ui/hooks/useFlickerDetector.test.js +0 -106
  766. package/dist/src/ui/hooks/useFlickerDetector.test.js.map +0 -1
  767. package/dist/src/ui/hooks/useFocus.test.d.ts +0 -6
  768. package/dist/src/ui/hooks/useFocus.test.js +0 -131
  769. package/dist/src/ui/hooks/useFocus.test.js.map +0 -1
  770. package/dist/src/ui/hooks/useFolderTrust.test.d.ts +0 -6
  771. package/dist/src/ui/hooks/useFolderTrust.test.js +0 -218
  772. package/dist/src/ui/hooks/useFolderTrust.test.js.map +0 -1
  773. package/dist/src/ui/hooks/useGeminiStream.test.d.ts +0 -6
  774. package/dist/src/ui/hooks/useGeminiStream.test.js +0 -2149
  775. package/dist/src/ui/hooks/useGeminiStream.test.js.map +0 -1
  776. package/dist/src/ui/hooks/useGitBranchName.test.d.ts +0 -6
  777. package/dist/src/ui/hooks/useGitBranchName.test.js +0 -183
  778. package/dist/src/ui/hooks/useGitBranchName.test.js.map +0 -1
  779. package/dist/src/ui/hooks/useHistoryManager.test.d.ts +0 -6
  780. package/dist/src/ui/hooks/useHistoryManager.test.js +0 -188
  781. package/dist/src/ui/hooks/useHistoryManager.test.js.map +0 -1
  782. package/dist/src/ui/hooks/useHookDisplayState.test.d.ts +0 -6
  783. package/dist/src/ui/hooks/useHookDisplayState.test.js +0 -180
  784. package/dist/src/ui/hooks/useHookDisplayState.test.js.map +0 -1
  785. package/dist/src/ui/hooks/useIdeTrustListener.test.d.ts +0 -6
  786. package/dist/src/ui/hooks/useIdeTrustListener.test.js +0 -214
  787. package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +0 -1
  788. package/dist/src/ui/hooks/useIncludeDirsTrust.test.d.ts +0 -6
  789. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js +0 -172
  790. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +0 -1
  791. package/dist/src/ui/hooks/useInputHistory.test.d.ts +0 -6
  792. package/dist/src/ui/hooks/useInputHistory.test.js +0 -208
  793. package/dist/src/ui/hooks/useInputHistory.test.js.map +0 -1
  794. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +0 -6
  795. package/dist/src/ui/hooks/useInputHistoryStore.test.js +0 -238
  796. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +0 -1
  797. package/dist/src/ui/hooks/useKeypress.test.d.ts +0 -6
  798. package/dist/src/ui/hooks/useKeypress.test.js +0 -205
  799. package/dist/src/ui/hooks/useKeypress.test.js.map +0 -1
  800. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +0 -6
  801. package/dist/src/ui/hooks/useLoadingIndicator.test.js +0 -145
  802. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +0 -1
  803. package/dist/src/ui/hooks/useMcpStatus.test.d.ts +0 -6
  804. package/dist/src/ui/hooks/useMcpStatus.test.js +0 -69
  805. package/dist/src/ui/hooks/useMcpStatus.test.js.map +0 -1
  806. package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +0 -6
  807. package/dist/src/ui/hooks/useMemoryMonitor.test.js +0 -62
  808. package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +0 -1
  809. package/dist/src/ui/hooks/useMessageQueue.test.d.ts +0 -6
  810. package/dist/src/ui/hooks/useMessageQueue.test.js +0 -327
  811. package/dist/src/ui/hooks/useMessageQueue.test.js.map +0 -1
  812. package/dist/src/ui/hooks/useModelCommand.test.d.ts +0 -6
  813. package/dist/src/ui/hooks/useModelCommand.test.js +0 -45
  814. package/dist/src/ui/hooks/useModelCommand.test.js.map +0 -1
  815. package/dist/src/ui/hooks/useMouse.test.d.ts +0 -6
  816. package/dist/src/ui/hooks/useMouse.test.js +0 -57
  817. package/dist/src/ui/hooks/useMouse.test.js.map +0 -1
  818. package/dist/src/ui/hooks/useMouseClick.test.d.ts +0 -6
  819. package/dist/src/ui/hooks/useMouseClick.test.js +0 -59
  820. package/dist/src/ui/hooks/useMouseClick.test.js.map +0 -1
  821. package/dist/src/ui/hooks/useMouseDoubleClick.test.d.ts +0 -6
  822. package/dist/src/ui/hooks/useMouseDoubleClick.test.js +0 -125
  823. package/dist/src/ui/hooks/useMouseDoubleClick.test.js.map +0 -1
  824. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.d.ts +0 -6
  825. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +0 -291
  826. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +0 -1
  827. package/dist/src/ui/hooks/usePhraseCycler.test.d.ts +0 -6
  828. package/dist/src/ui/hooks/usePhraseCycler.test.js +0 -208
  829. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +0 -1
  830. package/dist/src/ui/hooks/usePrivacySettings.test.d.ts +0 -6
  831. package/dist/src/ui/hooks/usePrivacySettings.test.js +0 -104
  832. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +0 -1
  833. package/dist/src/ui/hooks/useQuotaAndFallback.test.d.ts +0 -6
  834. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +0 -477
  835. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +0 -1
  836. package/dist/src/ui/hooks/useReactToolScheduler.test.d.ts +0 -6
  837. package/dist/src/ui/hooks/useReactToolScheduler.test.js +0 -58
  838. package/dist/src/ui/hooks/useReactToolScheduler.test.js.map +0 -1
  839. package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +0 -6
  840. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +0 -169
  841. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +0 -1
  842. package/dist/src/ui/hooks/useRewind.test.d.ts +0 -6
  843. package/dist/src/ui/hooks/useRewind.test.js +0 -100
  844. package/dist/src/ui/hooks/useRewind.test.js.map +0 -1
  845. package/dist/src/ui/hooks/useSelectionList.test.d.ts +0 -6
  846. package/dist/src/ui/hooks/useSelectionList.test.js +0 -848
  847. package/dist/src/ui/hooks/useSelectionList.test.js.map +0 -1
  848. package/dist/src/ui/hooks/useSessionBrowser.test.d.ts +0 -6
  849. package/dist/src/ui/hooks/useSessionBrowser.test.js +0 -203
  850. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +0 -1
  851. package/dist/src/ui/hooks/useSessionResume.test.d.ts +0 -6
  852. package/dist/src/ui/hooks/useSessionResume.test.js +0 -336
  853. package/dist/src/ui/hooks/useSessionResume.test.js.map +0 -1
  854. package/dist/src/ui/hooks/useShellHistory.test.d.ts +0 -6
  855. package/dist/src/ui/hooks/useShellHistory.test.js +0 -223
  856. package/dist/src/ui/hooks/useShellHistory.test.js.map +0 -1
  857. package/dist/src/ui/hooks/useShellInactivityStatus.test.d.ts +0 -6
  858. package/dist/src/ui/hooks/useShellInactivityStatus.test.js +0 -84
  859. package/dist/src/ui/hooks/useShellInactivityStatus.test.js.map +0 -1
  860. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +0 -9
  861. package/dist/src/ui/hooks/useSlashCompletion.test.js +0 -845
  862. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +0 -1
  863. package/dist/src/ui/hooks/useSnowfall.test.d.ts +0 -6
  864. package/dist/src/ui/hooks/useSnowfall.test.js +0 -88
  865. package/dist/src/ui/hooks/useSnowfall.test.js.map +0 -1
  866. package/dist/src/ui/hooks/useTabbedNavigation.test.d.ts +0 -6
  867. package/dist/src/ui/hooks/useTabbedNavigation.test.js +0 -187
  868. package/dist/src/ui/hooks/useTabbedNavigation.test.js.map +0 -1
  869. package/dist/src/ui/hooks/useTimer.test.d.ts +0 -6
  870. package/dist/src/ui/hooks/useTimer.test.js +0 -119
  871. package/dist/src/ui/hooks/useTimer.test.js.map +0 -1
  872. package/dist/src/ui/hooks/useTips.test.d.ts +0 -6
  873. package/dist/src/ui/hooks/useTips.test.js +0 -33
  874. package/dist/src/ui/hooks/useTips.test.js.map +0 -1
  875. package/dist/src/ui/hooks/useToolExecutionScheduler.test.d.ts +0 -6
  876. package/dist/src/ui/hooks/useToolExecutionScheduler.test.js +0 -376
  877. package/dist/src/ui/hooks/useToolExecutionScheduler.test.js.map +0 -1
  878. package/dist/src/ui/hooks/useToolScheduler.test.d.ts +0 -6
  879. package/dist/src/ui/hooks/useToolScheduler.test.js +0 -881
  880. package/dist/src/ui/hooks/useToolScheduler.test.js.map +0 -1
  881. package/dist/src/ui/hooks/useToolSchedulerFacade.test.d.ts +0 -6
  882. package/dist/src/ui/hooks/useToolSchedulerFacade.test.js +0 -45
  883. package/dist/src/ui/hooks/useToolSchedulerFacade.test.js.map +0 -1
  884. package/dist/src/ui/hooks/useTurnActivityMonitor.test.d.ts +0 -6
  885. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js +0 -97
  886. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js.map +0 -1
  887. package/dist/src/ui/hooks/vim.test.d.ts +0 -6
  888. package/dist/src/ui/hooks/vim.test.js +0 -1384
  889. package/dist/src/ui/hooks/vim.test.js.map +0 -1
  890. package/dist/src/ui/keyMatchers.test.d.ts +0 -6
  891. package/dist/src/ui/keyMatchers.test.js +0 -386
  892. package/dist/src/ui/keyMatchers.test.js.map +0 -1
  893. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.d.ts +0 -6
  894. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js +0 -121
  895. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js.map +0 -1
  896. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.d.ts +0 -6
  897. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js +0 -34
  898. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js.map +0 -1
  899. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.d.ts +0 -6
  900. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js +0 -34
  901. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js.map +0 -1
  902. package/dist/src/ui/privacy/PrivacyNotice.test.d.ts +0 -6
  903. package/dist/src/ui/privacy/PrivacyNotice.test.js +0 -62
  904. package/dist/src/ui/privacy/PrivacyNotice.test.js.map +0 -1
  905. package/dist/src/ui/state/extensions.test.d.ts +0 -6
  906. package/dist/src/ui/state/extensions.test.js +0 -219
  907. package/dist/src/ui/state/extensions.test.js.map +0 -1
  908. package/dist/src/ui/themes/color-utils.test.d.ts +0 -6
  909. package/dist/src/ui/themes/color-utils.test.js +0 -245
  910. package/dist/src/ui/themes/color-utils.test.js.map +0 -1
  911. package/dist/src/ui/themes/theme-manager.test.d.ts +0 -6
  912. package/dist/src/ui/themes/theme-manager.test.js +0 -150
  913. package/dist/src/ui/themes/theme-manager.test.js.map +0 -1
  914. package/dist/src/ui/themes/theme.test.d.ts +0 -6
  915. package/dist/src/ui/themes/theme.test.js +0 -174
  916. package/dist/src/ui/themes/theme.test.js.map +0 -1
  917. package/dist/src/ui/utils/CodeColorizer.test.d.ts +0 -6
  918. package/dist/src/ui/utils/CodeColorizer.test.js +0 -38
  919. package/dist/src/ui/utils/CodeColorizer.test.js.map +0 -1
  920. package/dist/src/ui/utils/InlineMarkdownRenderer.test.d.ts +0 -6
  921. package/dist/src/ui/utils/InlineMarkdownRenderer.test.js +0 -21
  922. package/dist/src/ui/utils/InlineMarkdownRenderer.test.js.map +0 -1
  923. package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +0 -6
  924. package/dist/src/ui/utils/MarkdownDisplay.test.js +0 -159
  925. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +0 -1
  926. package/dist/src/ui/utils/clipboardUtils.test.d.ts +0 -6
  927. package/dist/src/ui/utils/clipboardUtils.test.js +0 -359
  928. package/dist/src/ui/utils/clipboardUtils.test.js.map +0 -1
  929. package/dist/src/ui/utils/clipboardUtils.windows.test.d.ts +0 -6
  930. package/dist/src/ui/utils/clipboardUtils.windows.test.js +0 -55
  931. package/dist/src/ui/utils/clipboardUtils.windows.test.js.map +0 -1
  932. package/dist/src/ui/utils/commandUtils.test.d.ts +0 -6
  933. package/dist/src/ui/utils/commandUtils.test.js +0 -479
  934. package/dist/src/ui/utils/commandUtils.test.js.map +0 -1
  935. package/dist/src/ui/utils/computeStats.test.d.ts +0 -6
  936. package/dist/src/ui/utils/computeStats.test.js +0 -271
  937. package/dist/src/ui/utils/computeStats.test.js.map +0 -1
  938. package/dist/src/ui/utils/directoryUtils.test.d.ts +0 -6
  939. package/dist/src/ui/utils/directoryUtils.test.js +0 -244
  940. package/dist/src/ui/utils/directoryUtils.test.js.map +0 -1
  941. package/dist/src/ui/utils/displayUtils.test.d.ts +0 -6
  942. package/dist/src/ui/utils/displayUtils.test.js +0 -61
  943. package/dist/src/ui/utils/displayUtils.test.js.map +0 -1
  944. package/dist/src/ui/utils/formatters.test.d.ts +0 -6
  945. package/dist/src/ui/utils/formatters.test.js +0 -124
  946. package/dist/src/ui/utils/formatters.test.js.map +0 -1
  947. package/dist/src/ui/utils/highlight.test.d.ts +0 -6
  948. package/dist/src/ui/utils/highlight.test.js +0 -198
  949. package/dist/src/ui/utils/highlight.test.js.map +0 -1
  950. package/dist/src/ui/utils/input.test.d.ts +0 -6
  951. package/dist/src/ui/utils/input.test.js +0 -44
  952. package/dist/src/ui/utils/input.test.js.map +0 -1
  953. package/dist/src/ui/utils/markdownUtilities.test.d.ts +0 -6
  954. package/dist/src/ui/utils/markdownUtilities.test.js +0 -42
  955. package/dist/src/ui/utils/markdownUtilities.test.js.map +0 -1
  956. package/dist/src/ui/utils/mouse.test.d.ts +0 -6
  957. package/dist/src/ui/utils/mouse.test.js +0 -136
  958. package/dist/src/ui/utils/mouse.test.js.map +0 -1
  959. package/dist/src/ui/utils/rewindFileOps.test.d.ts +0 -6
  960. package/dist/src/ui/utils/rewindFileOps.test.js +0 -375
  961. package/dist/src/ui/utils/rewindFileOps.test.js.map +0 -1
  962. package/dist/src/ui/utils/terminalCapabilityManager.test.d.ts +0 -6
  963. package/dist/src/ui/utils/terminalCapabilityManager.test.js +0 -220
  964. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +0 -1
  965. package/dist/src/ui/utils/terminalSetup.test.d.ts +0 -6
  966. package/dist/src/ui/utils/terminalSetup.test.js +0 -147
  967. package/dist/src/ui/utils/terminalSetup.test.js.map +0 -1
  968. package/dist/src/ui/utils/terminalUtils.test.d.ts +0 -6
  969. package/dist/src/ui/utils/terminalUtils.test.js +0 -40
  970. package/dist/src/ui/utils/terminalUtils.test.js.map +0 -1
  971. package/dist/src/ui/utils/textOutput.test.d.ts +0 -6
  972. package/dist/src/ui/utils/textOutput.test.js +0 -79
  973. package/dist/src/ui/utils/textOutput.test.js.map +0 -1
  974. package/dist/src/ui/utils/textUtils.test.d.ts +0 -6
  975. package/dist/src/ui/utils/textUtils.test.js +0 -168
  976. package/dist/src/ui/utils/textUtils.test.js.map +0 -1
  977. package/dist/src/ui/utils/ui-sizing.test.d.ts +0 -6
  978. package/dist/src/ui/utils/ui-sizing.test.js +0 -38
  979. package/dist/src/ui/utils/ui-sizing.test.js.map +0 -1
  980. package/dist/src/ui/utils/updateCheck.test.d.ts +0 -6
  981. package/dist/src/ui/utils/updateCheck.test.js +0 -134
  982. package/dist/src/ui/utils/updateCheck.test.js.map +0 -1
  983. package/dist/src/utils/agentUtils.test.d.ts +0 -6
  984. package/dist/src/utils/agentUtils.test.js +0 -121
  985. package/dist/src/utils/agentUtils.test.js.map +0 -1
  986. package/dist/src/utils/checks.test.d.ts +0 -6
  987. package/dist/src/utils/checks.test.js +0 -29
  988. package/dist/src/utils/checks.test.js.map +0 -1
  989. package/dist/src/utils/cleanup.test.d.ts +0 -6
  990. package/dist/src/utils/cleanup.test.js +0 -92
  991. package/dist/src/utils/cleanup.test.js.map +0 -1
  992. package/dist/src/utils/commands.test.d.ts +0 -6
  993. package/dist/src/utils/commands.test.js +0 -115
  994. package/dist/src/utils/commands.test.js.map +0 -1
  995. package/dist/src/utils/commentJson.test.d.ts +0 -6
  996. package/dist/src/utils/commentJson.test.js +0 -308
  997. package/dist/src/utils/commentJson.test.js.map +0 -1
  998. package/dist/src/utils/deepMerge.test.d.ts +0 -6
  999. package/dist/src/utils/deepMerge.test.js +0 -201
  1000. package/dist/src/utils/deepMerge.test.js.map +0 -1
  1001. package/dist/src/utils/dialogScopeUtils.test.d.ts +0 -6
  1002. package/dist/src/utils/dialogScopeUtils.test.js +0 -81
  1003. package/dist/src/utils/dialogScopeUtils.test.js.map +0 -1
  1004. package/dist/src/utils/envVarResolver.test.d.ts +0 -6
  1005. package/dist/src/utils/envVarResolver.test.js +0 -221
  1006. package/dist/src/utils/envVarResolver.test.js.map +0 -1
  1007. package/dist/src/utils/errors.test.d.ts +0 -6
  1008. package/dist/src/utils/errors.test.js +0 -435
  1009. package/dist/src/utils/errors.test.js.map +0 -1
  1010. package/dist/src/utils/events.test.d.ts +0 -6
  1011. package/dist/src/utils/events.test.js +0 -24
  1012. package/dist/src/utils/events.test.js.map +0 -1
  1013. package/dist/src/utils/gitUtils.test.d.ts +0 -6
  1014. package/dist/src/utils/gitUtils.test.js +0 -113
  1015. package/dist/src/utils/gitUtils.test.js.map +0 -1
  1016. package/dist/src/utils/handleAutoUpdate.test.d.ts +0 -6
  1017. package/dist/src/utils/handleAutoUpdate.test.js +0 -310
  1018. package/dist/src/utils/handleAutoUpdate.test.js.map +0 -1
  1019. package/dist/src/utils/installationInfo.test.d.ts +0 -6
  1020. package/dist/src/utils/installationInfo.test.js +0 -296
  1021. package/dist/src/utils/installationInfo.test.js.map +0 -1
  1022. package/dist/src/utils/jsonoutput.test.d.ts +0 -6
  1023. package/dist/src/utils/jsonoutput.test.js +0 -74
  1024. package/dist/src/utils/jsonoutput.test.js.map +0 -1
  1025. package/dist/src/utils/math.test.d.ts +0 -6
  1026. package/dist/src/utils/math.test.js +0 -23
  1027. package/dist/src/utils/math.test.js.map +0 -1
  1028. package/dist/src/utils/persistentState.test.d.ts +0 -6
  1029. package/dist/src/utils/persistentState.test.js +0 -68
  1030. package/dist/src/utils/persistentState.test.js.map +0 -1
  1031. package/dist/src/utils/processUtils.test.d.ts +0 -6
  1032. package/dist/src/utils/processUtils.test.js +0 -20
  1033. package/dist/src/utils/processUtils.test.js.map +0 -1
  1034. package/dist/src/utils/readStdin.test.d.ts +0 -6
  1035. package/dist/src/utils/readStdin.test.js +0 -117
  1036. package/dist/src/utils/readStdin.test.js.map +0 -1
  1037. package/dist/src/utils/readStdin_safety.test.d.ts +0 -6
  1038. package/dist/src/utils/readStdin_safety.test.js +0 -68
  1039. package/dist/src/utils/readStdin_safety.test.js.map +0 -1
  1040. package/dist/src/utils/relaunch.test.d.ts +0 -6
  1041. package/dist/src/utils/relaunch.test.js +0 -279
  1042. package/dist/src/utils/relaunch.test.js.map +0 -1
  1043. package/dist/src/utils/resolvePath.test.d.ts +0 -6
  1044. package/dist/src/utils/resolvePath.test.js +0 -34
  1045. package/dist/src/utils/resolvePath.test.js.map +0 -1
  1046. package/dist/src/utils/sandbox.test.d.ts +0 -6
  1047. package/dist/src/utils/sandbox.test.js +0 -314
  1048. package/dist/src/utils/sandbox.test.js.map +0 -1
  1049. package/dist/src/utils/sandboxUtils.test.d.ts +0 -6
  1050. package/dist/src/utils/sandboxUtils.test.js +0 -122
  1051. package/dist/src/utils/sandboxUtils.test.js.map +0 -1
  1052. package/dist/src/utils/sessionCleanup.integration.test.d.ts +0 -6
  1053. package/dist/src/utils/sessionCleanup.integration.test.js +0 -182
  1054. package/dist/src/utils/sessionCleanup.integration.test.js.map +0 -1
  1055. package/dist/src/utils/sessionCleanup.test.d.ts +0 -6
  1056. package/dist/src/utils/sessionCleanup.test.js +0 -1298
  1057. package/dist/src/utils/sessionCleanup.test.js.map +0 -1
  1058. package/dist/src/utils/sessionUtils.test.d.ts +0 -6
  1059. package/dist/src/utils/sessionUtils.test.js +0 -503
  1060. package/dist/src/utils/sessionUtils.test.js.map +0 -1
  1061. package/dist/src/utils/sessions.test.d.ts +0 -6
  1062. package/dist/src/utils/sessions.test.js +0 -581
  1063. package/dist/src/utils/sessions.test.js.map +0 -1
  1064. package/dist/src/utils/settingsUtils.test.d.ts +0 -6
  1065. package/dist/src/utils/settingsUtils.test.js +0 -808
  1066. package/dist/src/utils/settingsUtils.test.js.map +0 -1
  1067. package/dist/src/utils/skillUtils.test.d.ts +0 -6
  1068. package/dist/src/utils/skillUtils.test.js +0 -70
  1069. package/dist/src/utils/skillUtils.test.js.map +0 -1
  1070. package/dist/src/utils/startupWarnings.test.d.ts +0 -6
  1071. package/dist/src/utils/startupWarnings.test.js +0 -61
  1072. package/dist/src/utils/startupWarnings.test.js.map +0 -1
  1073. package/dist/src/utils/updateEventEmitter.test.d.ts +0 -6
  1074. package/dist/src/utils/updateEventEmitter.test.js +0 -18
  1075. package/dist/src/utils/updateEventEmitter.test.js.map +0 -1
  1076. package/dist/src/utils/userStartupWarnings.test.d.ts +0 -6
  1077. package/dist/src/utils/userStartupWarnings.test.js +0 -98
  1078. package/dist/src/utils/userStartupWarnings.test.js.map +0 -1
  1079. package/dist/src/utils/windowTitle.test.d.ts +0 -6
  1080. package/dist/src/utils/windowTitle.test.js +0 -216
  1081. package/dist/src/utils/windowTitle.test.js.map +0 -1
  1082. package/dist/src/validateNonInterActiveAuth.test.d.ts +0 -6
  1083. package/dist/src/validateNonInterActiveAuth.test.js +0 -319
  1084. package/dist/src/validateNonInterActiveAuth.test.js.map +0 -1
  1085. package/dist/src/zed-integration/fileSystemService.test.d.ts +0 -6
  1086. package/dist/src/zed-integration/fileSystemService.test.js +0 -88
  1087. package/dist/src/zed-integration/fileSystemService.test.js.map +0 -1
  1088. package/dist/src/zed-integration/zedIntegration.test.d.ts +0 -6
  1089. package/dist/src/zed-integration/zedIntegration.test.js +0 -625
  1090. package/dist/src/zed-integration/zedIntegration.test.js.map +0 -1
  1091. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,2149 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
- import { act } from 'react';
8
- import { renderHook } from '../../test-utils/render.js';
9
- import { waitFor } from '../../test-utils/async.js';
10
- import { useGeminiStream } from './useGeminiStream.js';
11
- import { useKeypress } from './useKeypress.js';
12
- import * as atCommandProcessor from './atCommandProcessor.js';
13
- import { useToolScheduler } from './useToolScheduler.js';
14
- import { ApprovalMode, AuthType, LlmEventType, ToolErrorType, ToolConfirmationOutcome, tokenLimit, debugLogger, coreEvents, CoreEvent, MCPDiscoveryState, } from '@didim365/agent-cli-core';
15
- import { MessageType, StreamingState, ToolCallStatus } from '../types.js';
16
- // --- MOCKS ---
17
- const mockSendMessageStream = vi
18
- .fn()
19
- .mockReturnValue((async function* () { })());
20
- const mockStartChat = vi.fn();
21
- const MockedGeminiClientClass = vi.hoisted(() => vi.fn().mockImplementation(function (_config) {
22
- // _config
23
- this.startChat = mockStartChat;
24
- this.sendMessageStream = mockSendMessageStream;
25
- this.addHistory = vi.fn();
26
- this.getCurrentSequenceModel = vi.fn().mockReturnValue(null);
27
- this.getChat = vi.fn().mockReturnValue({
28
- recordCompletedToolCalls: vi.fn(),
29
- });
30
- this.getChatRecordingService = vi.fn().mockReturnValue({
31
- recordThought: vi.fn(),
32
- initialize: vi.fn(),
33
- recordMessage: vi.fn(),
34
- recordMessageTokens: vi.fn(),
35
- recordToolCalls: vi.fn(),
36
- getConversationFile: vi.fn(),
37
- });
38
- }));
39
- const MockedUserPromptEvent = vi.hoisted(() => vi.fn().mockImplementation(() => { }));
40
- const mockParseAndFormatApiError = vi.hoisted(() => vi.fn());
41
- vi.mock('@didim365/agent-cli-core', async (importOriginal) => {
42
- const actualCoreModule = (await importOriginal());
43
- return {
44
- ...actualCoreModule,
45
- GitService: vi.fn(),
46
- GeminiClient: MockedGeminiClientClass,
47
- UserPromptEvent: MockedUserPromptEvent,
48
- parseAndFormatApiError: mockParseAndFormatApiError,
49
- tokenLimit: vi.fn().mockReturnValue(100), // Mock tokenLimit
50
- };
51
- });
52
- const mockUseToolScheduler = useToolScheduler;
53
- vi.mock('./useToolScheduler.js', async (importOriginal) => {
54
- const actualSchedulerModule = (await importOriginal());
55
- return {
56
- ...(actualSchedulerModule || {}),
57
- useToolScheduler: vi.fn(),
58
- };
59
- });
60
- vi.mock('./useKeypress.js', () => ({
61
- useKeypress: vi.fn(),
62
- }));
63
- vi.mock('./shellCommandProcessor.js', () => ({
64
- useShellCommandProcessor: vi.fn().mockReturnValue({
65
- handleShellCommand: vi.fn(),
66
- activeShellPtyId: null,
67
- lastShellOutputTime: 0,
68
- }),
69
- }));
70
- vi.mock('./atCommandProcessor.js');
71
- vi.mock('../utils/markdownUtilities.js', () => ({
72
- findLastSafeSplitPoint: vi.fn((s) => s.length),
73
- }));
74
- vi.mock('./useStateAndRef.js', () => ({
75
- useStateAndRef: vi.fn((initial) => {
76
- let val = initial;
77
- const ref = { current: val };
78
- const setVal = vi.fn((updater) => {
79
- if (typeof updater === 'function') {
80
- val = updater(val);
81
- }
82
- else {
83
- val = updater;
84
- }
85
- ref.current = val;
86
- });
87
- return [val, ref, setVal];
88
- }),
89
- }));
90
- vi.mock('./useLogger.js', () => ({
91
- useLogger: vi.fn().mockReturnValue({
92
- logMessage: vi.fn().mockResolvedValue(undefined),
93
- }),
94
- }));
95
- const mockStartNewPrompt = vi.fn();
96
- const mockAddUsage = vi.fn();
97
- vi.mock('../contexts/SessionContext.js', () => ({
98
- useSessionStats: vi.fn(() => ({
99
- startNewPrompt: mockStartNewPrompt,
100
- addUsage: mockAddUsage,
101
- getPromptCount: vi.fn(() => 5),
102
- })),
103
- }));
104
- vi.mock('./slashCommandProcessor.js', () => ({
105
- handleSlashCommand: vi.fn().mockReturnValue(false),
106
- }));
107
- vi.mock('./useAlternateBuffer.js', () => ({
108
- useAlternateBuffer: vi.fn(() => false),
109
- }));
110
- // --- END MOCKS ---
111
- // --- Tests for useGeminiStream Hook ---
112
- describe('useGeminiStream', () => {
113
- let mockAddItem;
114
- let mockConfig;
115
- let mockOnDebugMessage;
116
- let mockHandleSlashCommand;
117
- let mockScheduleToolCalls;
118
- let mockCancelAllToolCalls;
119
- let mockMarkToolsAsSubmitted;
120
- let handleAtCommandSpy;
121
- beforeEach(() => {
122
- vi.clearAllMocks(); // Clear mocks before each test
123
- mockAddItem = vi.fn();
124
- // Define the mock for getGeminiClient
125
- const mockGetGeminiClient = vi.fn().mockImplementation(() => {
126
- // MockedGeminiClientClass is defined in the module scope by the previous change.
127
- // It will use the mockStartChat and mockSendMessageStream that are managed within beforeEach.
128
- const clientInstance = new MockedGeminiClientClass(mockConfig);
129
- return clientInstance;
130
- });
131
- const mockMcpClientManager = {
132
- getDiscoveryState: vi.fn().mockReturnValue(MCPDiscoveryState.COMPLETED),
133
- getMcpServerCount: vi.fn().mockReturnValue(0),
134
- };
135
- const contentGeneratorConfig = {
136
- model: 'test-model',
137
- apiKey: 'test-key',
138
- vertexai: false,
139
- authType: AuthType.USE_GEMINI,
140
- };
141
- mockConfig = {
142
- apiKey: 'test-api-key',
143
- model: 'gemini-pro',
144
- sandbox: false,
145
- targetDir: '/test/dir',
146
- debugMode: false,
147
- question: undefined,
148
- coreTools: [],
149
- toolDiscoveryCommand: undefined,
150
- toolCallCommand: undefined,
151
- mcpServerCommand: undefined,
152
- mcpServers: undefined,
153
- userAgent: 'test-agent',
154
- userMemory: '',
155
- geminiMdFileCount: 0,
156
- alwaysSkipModificationConfirmation: false,
157
- vertexai: false,
158
- showMemoryUsage: false,
159
- contextFileName: undefined,
160
- getToolRegistry: vi.fn(() => ({ getToolSchemaList: vi.fn(() => []) })),
161
- getProjectRoot: vi.fn(() => '/test/dir'),
162
- getCheckpointingEnabled: vi.fn(() => false),
163
- getGeminiClient: mockGetGeminiClient,
164
- getMcpClientManager: () => mockMcpClientManager,
165
- getApprovalMode: () => ApprovalMode.DEFAULT,
166
- getUsageStatisticsEnabled: () => true,
167
- getDebugMode: () => false,
168
- addHistory: vi.fn(),
169
- getSessionId() {
170
- return 'test-session-id';
171
- },
172
- setQuotaErrorOccurred: vi.fn(),
173
- getQuotaErrorOccurred: vi.fn(() => false),
174
- getModel: vi.fn(() => 'gemini-2.5-pro'),
175
- getContentGenerator: vi.fn().mockReturnValue(undefined),
176
- getContentGeneratorConfig: vi
177
- .fn()
178
- .mockReturnValue(contentGeneratorConfig),
179
- isInteractive: () => false,
180
- getExperiments: () => { },
181
- };
182
- mockOnDebugMessage = vi.fn();
183
- mockHandleSlashCommand = vi.fn().mockResolvedValue(false);
184
- // Mock return value for useReactToolScheduler
185
- mockScheduleToolCalls = vi.fn();
186
- mockCancelAllToolCalls = vi.fn();
187
- mockMarkToolsAsSubmitted = vi.fn();
188
- // Default mock for useReactToolScheduler to prevent toolCalls being undefined initially
189
- mockUseToolScheduler.mockReturnValue([
190
- [], // Default to empty array for toolCalls
191
- mockScheduleToolCalls,
192
- mockMarkToolsAsSubmitted,
193
- vi.fn(), // setToolCallsForDisplay
194
- mockCancelAllToolCalls,
195
- 0, // lastToolOutputTime
196
- ]);
197
- // Reset mocks for GeminiClient instance methods (startChat and sendMessageStream)
198
- // The GeminiClient constructor itself is mocked at the module level.
199
- mockStartChat.mockClear().mockResolvedValue({
200
- sendMessageStream: mockSendMessageStream,
201
- }); // GeminiChat -> any
202
- mockSendMessageStream
203
- .mockClear()
204
- .mockReturnValue((async function* () { })());
205
- handleAtCommandSpy = vi.spyOn(atCommandProcessor, 'handleAtCommand');
206
- vi.spyOn(coreEvents, 'emitFeedback');
207
- });
208
- afterEach(() => {
209
- coreEvents.removeAllListeners(CoreEvent.RetryAttempt);
210
- });
211
- const mockLoadedSettings = {
212
- merged: { preferredEditor: 'vscode' },
213
- user: { path: '/user/settings.json', settings: {} },
214
- workspace: { path: '/workspace/.gemini/settings.json', settings: {} },
215
- errors: [],
216
- forScope: vi.fn(),
217
- setValue: vi.fn(),
218
- };
219
- const renderTestHook = (initialToolCalls = [], geminiClient) => {
220
- const client = geminiClient || mockConfig.getGeminiClient();
221
- const initialProps = {
222
- client,
223
- history: [],
224
- addItem: mockAddItem,
225
- config: mockConfig,
226
- onDebugMessage: mockOnDebugMessage,
227
- handleSlashCommand: mockHandleSlashCommand,
228
- shellModeActive: false,
229
- loadedSettings: mockLoadedSettings,
230
- toolCalls: initialToolCalls,
231
- };
232
- const { result, rerender } = renderHook((props) => {
233
- // This mock needs to be stateful. When setToolCallsForDisplay is called,
234
- // it should trigger a rerender with the new state.
235
- const mockSetToolCallsForDisplay = vi.fn((updater) => {
236
- const newToolCalls = typeof updater === 'function' ? updater(props.toolCalls) : updater;
237
- rerender({ ...props, toolCalls: newToolCalls });
238
- });
239
- // Create a stateful mock for cancellation that updates the toolCalls state.
240
- const statefulCancelAllToolCalls = vi.fn((...args) => {
241
- // Call the original spy so `toHaveBeenCalled` checks still work.
242
- mockCancelAllToolCalls(...args);
243
- const newToolCalls = props.toolCalls.map((tc) => {
244
- // Only cancel tools that are in a cancellable state.
245
- if (tc.status === 'awaiting_approval' ||
246
- tc.status === 'executing' ||
247
- tc.status === 'scheduled' ||
248
- tc.status === 'validating') {
249
- // A real cancelled tool call has a response object.
250
- // We need to simulate this to avoid type errors downstream.
251
- return {
252
- ...tc,
253
- status: 'cancelled',
254
- response: {
255
- callId: tc.request.callId,
256
- responseParts: [],
257
- resultDisplay: 'Request cancelled.',
258
- },
259
- responseSubmittedToGemini: true, // Mark as "processed"
260
- };
261
- }
262
- return tc;
263
- });
264
- rerender({ ...props, toolCalls: newToolCalls });
265
- });
266
- mockUseToolScheduler.mockImplementation(() => [
267
- props.toolCalls,
268
- mockScheduleToolCalls,
269
- mockMarkToolsAsSubmitted,
270
- mockSetToolCallsForDisplay,
271
- statefulCancelAllToolCalls, // Use the stateful mock
272
- ]);
273
- return useGeminiStream(props.client, props.history, props.addItem, props.config, props.loadedSettings, props.onDebugMessage, props.handleSlashCommand, props.shellModeActive, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24);
274
- }, {
275
- initialProps,
276
- });
277
- return {
278
- result,
279
- rerender,
280
- mockMarkToolsAsSubmitted,
281
- mockSendMessageStream,
282
- client,
283
- };
284
- };
285
- // Helper to create mock tool calls - reduces boilerplate
286
- const createMockToolCall = (toolName, callId, confirmationType, mockOnConfirm, status = 'awaiting_approval') => ({
287
- request: {
288
- callId,
289
- name: toolName,
290
- args: {},
291
- isClientInitiated: false,
292
- prompt_id: 'prompt-id-1',
293
- },
294
- status: status,
295
- responseSubmittedToGemini: false,
296
- confirmationDetails: confirmationType === 'edit'
297
- ? {
298
- type: 'edit',
299
- title: 'Confirm Edit',
300
- onConfirm: mockOnConfirm,
301
- fileName: 'file.txt',
302
- filePath: '/test/file.txt',
303
- fileDiff: 'fake diff',
304
- originalContent: 'old',
305
- newContent: 'new',
306
- }
307
- : {
308
- type: 'info',
309
- title: `${toolName} confirmation`,
310
- onConfirm: mockOnConfirm,
311
- prompt: `Execute ${toolName}?`,
312
- },
313
- tool: {
314
- name: toolName,
315
- displayName: toolName,
316
- description: `${toolName} description`,
317
- build: vi.fn(),
318
- },
319
- invocation: {
320
- getDescription: () => 'Mock description',
321
- },
322
- });
323
- // Helper to render hook with default parameters - reduces boilerplate
324
- const renderHookWithDefaults = (options = {}) => {
325
- const { shellModeActive = false, onCancelSubmit = () => { }, setShellInputFocused = () => { }, performMemoryRefresh = () => Promise.resolve(), onAuthError = () => { }, setModelSwitched = vi.fn(), modelSwitched = false, } = options;
326
- return renderHook(() => useGeminiStream(new MockedGeminiClientClass(mockConfig), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, shellModeActive, () => 'vscode', onAuthError, performMemoryRefresh, modelSwitched, setModelSwitched, onCancelSubmit, setShellInputFocused, 80, 24));
327
- };
328
- it('should not submit tool responses if not all tool calls are completed', () => {
329
- const toolCalls = [
330
- {
331
- request: {
332
- callId: 'call1',
333
- name: 'tool1',
334
- args: {},
335
- isClientInitiated: false,
336
- prompt_id: 'prompt-id-1',
337
- },
338
- status: 'success',
339
- responseSubmittedToGemini: false,
340
- response: {
341
- callId: 'call1',
342
- responseParts: [{ text: 'tool 1 response' }],
343
- error: undefined,
344
- errorType: undefined, // FIX: Added missing property
345
- resultDisplay: 'Tool 1 success display',
346
- },
347
- tool: {
348
- name: 'tool1',
349
- displayName: 'tool1',
350
- description: 'desc1',
351
- build: vi.fn(),
352
- },
353
- invocation: {
354
- getDescription: () => `Mock description`,
355
- },
356
- startTime: Date.now(),
357
- endTime: Date.now(),
358
- },
359
- {
360
- request: {
361
- callId: 'call2',
362
- name: 'tool2',
363
- args: {},
364
- prompt_id: 'prompt-id-1',
365
- },
366
- status: 'executing',
367
- responseSubmittedToGemini: false,
368
- tool: {
369
- name: 'tool2',
370
- displayName: 'tool2',
371
- description: 'desc2',
372
- build: vi.fn(),
373
- },
374
- invocation: {
375
- getDescription: () => `Mock description`,
376
- },
377
- startTime: Date.now(),
378
- liveOutput: '...',
379
- },
380
- ];
381
- const { mockMarkToolsAsSubmitted, mockSendMessageStream } = renderTestHook(toolCalls);
382
- // Effect for submitting tool responses depends on toolCalls and isResponding
383
- // isResponding is initially false, so the effect should run.
384
- expect(mockMarkToolsAsSubmitted).not.toHaveBeenCalled();
385
- expect(mockSendMessageStream).not.toHaveBeenCalled(); // submitQuery uses this
386
- });
387
- it('should submit tool responses when all tool calls are completed and ready', async () => {
388
- const toolCall1ResponseParts = [{ text: 'tool 1 final response' }];
389
- const toolCall2ResponseParts = [{ text: 'tool 2 final response' }];
390
- const completedToolCalls = [
391
- {
392
- request: {
393
- callId: 'call1',
394
- name: 'tool1',
395
- args: {},
396
- isClientInitiated: false,
397
- prompt_id: 'prompt-id-2',
398
- },
399
- status: 'success',
400
- responseSubmittedToGemini: false,
401
- response: {
402
- callId: 'call1',
403
- responseParts: toolCall1ResponseParts,
404
- errorType: undefined, // FIX: Added missing property
405
- },
406
- tool: {
407
- displayName: 'MockTool',
408
- },
409
- invocation: {
410
- getDescription: () => `Mock description`,
411
- },
412
- },
413
- {
414
- request: {
415
- callId: 'call2',
416
- name: 'tool2',
417
- args: {},
418
- isClientInitiated: false,
419
- prompt_id: 'prompt-id-2',
420
- },
421
- status: 'error',
422
- responseSubmittedToGemini: false,
423
- response: {
424
- callId: 'call2',
425
- responseParts: toolCall2ResponseParts,
426
- errorType: ToolErrorType.UNHANDLED_EXCEPTION, // FIX: Added missing property
427
- },
428
- },
429
- ];
430
- // Capture the onComplete callback
431
- let capturedOnComplete = null;
432
- mockUseToolScheduler.mockImplementation((onComplete) => {
433
- capturedOnComplete = onComplete;
434
- return [[], mockScheduleToolCalls, mockMarkToolsAsSubmitted, vi.fn()];
435
- });
436
- renderHook(() => useGeminiStream(new MockedGeminiClientClass(mockConfig), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
437
- // Trigger the onComplete callback with completed tools
438
- await act(async () => {
439
- if (capturedOnComplete) {
440
- await capturedOnComplete(completedToolCalls);
441
- }
442
- });
443
- await waitFor(() => {
444
- expect(mockMarkToolsAsSubmitted).toHaveBeenCalledTimes(1);
445
- expect(mockSendMessageStream).toHaveBeenCalledTimes(1);
446
- });
447
- const expectedMergedResponse = [
448
- ...toolCall1ResponseParts,
449
- ...toolCall2ResponseParts,
450
- ];
451
- expect(mockSendMessageStream).toHaveBeenCalledWith(expectedMergedResponse, expect.any(AbortSignal), 'prompt-id-2');
452
- });
453
- it('should handle all tool calls being cancelled', async () => {
454
- const cancelledToolCalls = [
455
- {
456
- request: {
457
- callId: '1',
458
- name: 'testTool',
459
- args: {},
460
- isClientInitiated: false,
461
- prompt_id: 'prompt-id-3',
462
- },
463
- status: 'cancelled',
464
- response: {
465
- callId: '1',
466
- responseParts: [{ text: 'cancelled' }],
467
- errorType: undefined, // FIX: Added missing property
468
- },
469
- responseSubmittedToGemini: false,
470
- tool: {
471
- displayName: 'mock tool',
472
- },
473
- invocation: {
474
- getDescription: () => `Mock description`,
475
- },
476
- },
477
- ];
478
- const client = new MockedGeminiClientClass(mockConfig);
479
- // Capture the onComplete callback
480
- let capturedOnComplete = null;
481
- mockUseToolScheduler.mockImplementation((onComplete) => {
482
- capturedOnComplete = onComplete;
483
- return [[], mockScheduleToolCalls, mockMarkToolsAsSubmitted, vi.fn()];
484
- });
485
- renderHook(() => useGeminiStream(client, [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
486
- // Trigger the onComplete callback with cancelled tools
487
- await act(async () => {
488
- if (capturedOnComplete) {
489
- await capturedOnComplete(cancelledToolCalls);
490
- }
491
- });
492
- await waitFor(() => {
493
- expect(mockMarkToolsAsSubmitted).toHaveBeenCalledWith(['1']);
494
- expect(client.addHistory).toHaveBeenCalledWith({
495
- role: 'user',
496
- parts: [{ text: 'cancelled' }],
497
- });
498
- // Ensure we do NOT call back to the API
499
- expect(mockSendMessageStream).not.toHaveBeenCalled();
500
- });
501
- });
502
- it('should stop agent execution immediately when a tool call returns STOP_EXECUTION error', async () => {
503
- const stopExecutionToolCalls = [
504
- {
505
- request: {
506
- callId: 'stop-call',
507
- name: 'stopTool',
508
- args: {},
509
- isClientInitiated: false,
510
- prompt_id: 'prompt-id-stop',
511
- },
512
- status: 'error',
513
- response: {
514
- callId: 'stop-call',
515
- responseParts: [{ text: 'error occurred' }],
516
- errorType: ToolErrorType.STOP_EXECUTION,
517
- error: new Error('Stop reason from hook'),
518
- resultDisplay: undefined,
519
- },
520
- responseSubmittedToGemini: false,
521
- tool: {
522
- displayName: 'stop tool',
523
- },
524
- invocation: {
525
- getDescription: () => `Mock description`,
526
- },
527
- },
528
- ];
529
- const client = new MockedGeminiClientClass(mockConfig);
530
- // Capture the onComplete callback
531
- let capturedOnComplete = null;
532
- mockUseToolScheduler.mockImplementation((onComplete) => {
533
- capturedOnComplete = onComplete;
534
- return [
535
- [],
536
- mockScheduleToolCalls,
537
- mockMarkToolsAsSubmitted,
538
- vi.fn(),
539
- mockCancelAllToolCalls,
540
- ];
541
- });
542
- const { result } = renderHook(() => useGeminiStream(client, [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
543
- // Trigger the onComplete callback with STOP_EXECUTION tool
544
- await act(async () => {
545
- if (capturedOnComplete) {
546
- await capturedOnComplete(stopExecutionToolCalls);
547
- }
548
- });
549
- await waitFor(() => {
550
- expect(mockMarkToolsAsSubmitted).toHaveBeenCalledWith(['stop-call']);
551
- // Should add an info message to history
552
- expect(mockAddItem).toHaveBeenCalledWith(expect.objectContaining({
553
- type: MessageType.INFO,
554
- text: expect.stringContaining('Agent execution stopped: Stop reason from hook'),
555
- }));
556
- // Ensure we do NOT call back to the API
557
- expect(mockSendMessageStream).not.toHaveBeenCalled();
558
- // Streaming state should be Idle
559
- expect(result.current.streamingState).toBe(StreamingState.Idle);
560
- });
561
- });
562
- it('should group multiple cancelled tool call responses into a single history entry', async () => {
563
- const cancelledToolCall1 = {
564
- request: {
565
- callId: 'cancel-1',
566
- name: 'toolA',
567
- args: {},
568
- isClientInitiated: false,
569
- prompt_id: 'prompt-id-7',
570
- },
571
- tool: {
572
- name: 'toolA',
573
- displayName: 'toolA',
574
- description: 'descA',
575
- build: vi.fn(),
576
- },
577
- invocation: {
578
- getDescription: () => `Mock description`,
579
- },
580
- status: 'cancelled',
581
- response: {
582
- callId: 'cancel-1',
583
- responseParts: [
584
- { functionResponse: { name: 'toolA', id: 'cancel-1' } },
585
- ],
586
- resultDisplay: undefined,
587
- error: undefined,
588
- errorType: undefined, // FIX: Added missing property
589
- },
590
- responseSubmittedToGemini: false,
591
- };
592
- const cancelledToolCall2 = {
593
- request: {
594
- callId: 'cancel-2',
595
- name: 'toolB',
596
- args: {},
597
- isClientInitiated: false,
598
- prompt_id: 'prompt-id-8',
599
- },
600
- tool: {
601
- name: 'toolB',
602
- displayName: 'toolB',
603
- description: 'descB',
604
- build: vi.fn(),
605
- },
606
- invocation: {
607
- getDescription: () => `Mock description`,
608
- },
609
- status: 'cancelled',
610
- response: {
611
- callId: 'cancel-2',
612
- responseParts: [
613
- { functionResponse: { name: 'toolB', id: 'cancel-2' } },
614
- ],
615
- resultDisplay: undefined,
616
- error: undefined,
617
- errorType: undefined, // FIX: Added missing property
618
- },
619
- responseSubmittedToGemini: false,
620
- };
621
- const allCancelledTools = [cancelledToolCall1, cancelledToolCall2];
622
- const client = new MockedGeminiClientClass(mockConfig);
623
- let capturedOnComplete = null;
624
- mockUseToolScheduler.mockImplementation((onComplete) => {
625
- capturedOnComplete = onComplete;
626
- return [[], mockScheduleToolCalls, mockMarkToolsAsSubmitted, vi.fn()];
627
- });
628
- renderHook(() => useGeminiStream(client, [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
629
- // Trigger the onComplete callback with multiple cancelled tools
630
- await act(async () => {
631
- if (capturedOnComplete) {
632
- await capturedOnComplete(allCancelledTools);
633
- }
634
- });
635
- await waitFor(() => {
636
- // The tools should be marked as submitted locally
637
- expect(mockMarkToolsAsSubmitted).toHaveBeenCalledWith([
638
- 'cancel-1',
639
- 'cancel-2',
640
- ]);
641
- // Crucially, addHistory should be called only ONCE
642
- expect(client.addHistory).toHaveBeenCalledTimes(1);
643
- // And that single call should contain BOTH function responses
644
- expect(client.addHistory).toHaveBeenCalledWith({
645
- role: 'user',
646
- parts: [
647
- ...cancelledToolCall1.response.responseParts,
648
- ...cancelledToolCall2.response.responseParts,
649
- ],
650
- });
651
- // No message should be sent back to the API for a turn with only cancellations
652
- expect(mockSendMessageStream).not.toHaveBeenCalled();
653
- });
654
- });
655
- it('should not flicker streaming state to Idle between tool completion and submission', async () => {
656
- const toolCallResponseParts = [
657
- { text: 'tool 1 final response' },
658
- ];
659
- const initialToolCalls = [
660
- {
661
- request: {
662
- callId: 'call1',
663
- name: 'tool1',
664
- args: {},
665
- isClientInitiated: false,
666
- prompt_id: 'prompt-id-4',
667
- },
668
- status: 'executing',
669
- responseSubmittedToGemini: false,
670
- tool: {
671
- name: 'tool1',
672
- displayName: 'tool1',
673
- description: 'desc',
674
- build: vi.fn(),
675
- },
676
- invocation: {
677
- getDescription: () => `Mock description`,
678
- },
679
- startTime: Date.now(),
680
- },
681
- ];
682
- const completedToolCalls = [
683
- {
684
- ...initialToolCalls[0],
685
- status: 'success',
686
- response: {
687
- callId: 'call1',
688
- responseParts: toolCallResponseParts,
689
- error: undefined,
690
- errorType: undefined, // FIX: Added missing property
691
- resultDisplay: 'Tool 1 success display',
692
- },
693
- endTime: Date.now(),
694
- },
695
- ];
696
- // Capture the onComplete callback
697
- let capturedOnComplete = null;
698
- let currentToolCalls = initialToolCalls;
699
- mockUseToolScheduler.mockImplementation((onComplete) => {
700
- capturedOnComplete = onComplete;
701
- return [
702
- currentToolCalls,
703
- mockScheduleToolCalls,
704
- mockMarkToolsAsSubmitted,
705
- vi.fn(), // setToolCallsForDisplay
706
- ];
707
- });
708
- const { result, rerender } = renderHook(() => useGeminiStream(new MockedGeminiClientClass(mockConfig), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
709
- // 1. Initial state should be Responding because a tool is executing.
710
- expect(result.current.streamingState).toBe(StreamingState.Responding);
711
- // 2. Update the tool calls to completed state and rerender
712
- currentToolCalls = completedToolCalls;
713
- mockUseToolScheduler.mockImplementation((onComplete) => {
714
- capturedOnComplete = onComplete;
715
- return [
716
- completedToolCalls,
717
- mockScheduleToolCalls,
718
- mockMarkToolsAsSubmitted,
719
- vi.fn(), // setToolCallsForDisplay
720
- ];
721
- });
722
- act(() => {
723
- rerender();
724
- });
725
- // 3. The state should *still* be Responding, not Idle.
726
- // This is because the completed tool's response has not been submitted yet.
727
- expect(result.current.streamingState).toBe(StreamingState.Responding);
728
- // 4. Trigger the onComplete callback to simulate tool completion
729
- await act(async () => {
730
- if (capturedOnComplete) {
731
- await capturedOnComplete(completedToolCalls);
732
- }
733
- });
734
- // 5. Wait for submitQuery to be called
735
- await waitFor(() => {
736
- expect(mockSendMessageStream).toHaveBeenCalledWith(toolCallResponseParts, expect.any(AbortSignal), 'prompt-id-4');
737
- });
738
- // 6. After submission, the state should remain Responding until the stream completes.
739
- expect(result.current.streamingState).toBe(StreamingState.Responding);
740
- });
741
- describe('User Cancellation', () => {
742
- let keypressCallback;
743
- const mockUseKeypress = useKeypress;
744
- beforeEach(() => {
745
- // Capture the callback passed to useKeypress
746
- mockUseKeypress.mockImplementation((callback, options) => {
747
- if (options.isActive) {
748
- keypressCallback = callback;
749
- }
750
- else {
751
- keypressCallback = () => { };
752
- }
753
- });
754
- });
755
- const simulateEscapeKeyPress = () => {
756
- act(() => {
757
- keypressCallback({ name: 'escape' });
758
- });
759
- };
760
- it('should cancel an in-progress stream when escape is pressed', async () => {
761
- const mockStream = (async function* () {
762
- yield { type: LlmEventType.TextDelta, text: 'Part 1' };
763
- // Keep the stream open
764
- await new Promise(() => { });
765
- })();
766
- mockSendMessageStream.mockReturnValue(mockStream);
767
- const { result } = renderTestHook();
768
- // Start a query
769
- await act(async () => {
770
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
771
- result.current.submitQuery('test query');
772
- });
773
- // Wait for the first part of the response
774
- await waitFor(() => {
775
- expect(result.current.streamingState).toBe(StreamingState.Responding);
776
- });
777
- // Simulate escape key press
778
- simulateEscapeKeyPress();
779
- // Verify cancellation message is added
780
- await waitFor(() => {
781
- expect(mockAddItem).toHaveBeenCalledWith({
782
- type: MessageType.INFO,
783
- text: 'Request cancelled.',
784
- });
785
- });
786
- // Verify state is reset
787
- expect(result.current.streamingState).toBe(StreamingState.Idle);
788
- });
789
- it('should call onCancelSubmit handler when escape is pressed', async () => {
790
- const cancelSubmitSpy = vi.fn();
791
- const mockStream = (async function* () {
792
- yield { type: LlmEventType.TextDelta, text: 'Part 1' };
793
- // Keep the stream open
794
- await new Promise(() => { });
795
- })();
796
- mockSendMessageStream.mockReturnValue(mockStream);
797
- const { result } = renderHook(() => useGeminiStream(mockConfig.getGeminiClient(), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, cancelSubmitSpy, () => { }, 80, 24));
798
- // Start a query
799
- await act(async () => {
800
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
801
- result.current.submitQuery('test query');
802
- });
803
- simulateEscapeKeyPress();
804
- expect(cancelSubmitSpy).toHaveBeenCalledWith(false);
805
- });
806
- it('should call setShellInputFocused(false) when escape is pressed', async () => {
807
- const setShellInputFocusedSpy = vi.fn();
808
- const mockStream = (async function* () {
809
- yield { type: LlmEventType.TextDelta, text: 'Part 1' };
810
- await new Promise(() => { }); // Keep stream open
811
- })();
812
- mockSendMessageStream.mockReturnValue(mockStream);
813
- const { result } = renderHook(() => useGeminiStream(mockConfig.getGeminiClient(), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, vi.fn(), setShellInputFocusedSpy, // Pass the spy here
814
- 80, 24));
815
- // Start a query
816
- await act(async () => {
817
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
818
- result.current.submitQuery('test query');
819
- });
820
- simulateEscapeKeyPress();
821
- expect(setShellInputFocusedSpy).toHaveBeenCalledWith(false);
822
- });
823
- it('should not do anything if escape is pressed when not responding', () => {
824
- const { result } = renderTestHook();
825
- expect(result.current.streamingState).toBe(StreamingState.Idle);
826
- // Simulate escape key press
827
- simulateEscapeKeyPress();
828
- // No change should happen, no cancellation message
829
- expect(mockAddItem).not.toHaveBeenCalledWith(expect.objectContaining({
830
- text: 'Request cancelled.',
831
- }));
832
- });
833
- it('should prevent further processing after cancellation', async () => {
834
- let continueStream;
835
- const streamPromise = new Promise((resolve) => {
836
- continueStream = resolve;
837
- });
838
- const mockStream = (async function* () {
839
- yield { type: LlmEventType.TextDelta, text: 'Initial' };
840
- await streamPromise; // Wait until we manually continue
841
- yield { type: LlmEventType.TextDelta, text: ' Canceled' };
842
- })();
843
- mockSendMessageStream.mockReturnValue(mockStream);
844
- const { result } = renderTestHook();
845
- await act(async () => {
846
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
847
- result.current.submitQuery('long running query');
848
- });
849
- await waitFor(() => {
850
- expect(result.current.streamingState).toBe(StreamingState.Responding);
851
- });
852
- // Cancel the request
853
- simulateEscapeKeyPress();
854
- // Allow the stream to continue
855
- await act(async () => {
856
- continueStream();
857
- // Wait a bit to see if the second part is processed
858
- await new Promise((resolve) => setTimeout(resolve, 50));
859
- });
860
- // The text should not have been updated with " Canceled"
861
- const lastCall = mockAddItem.mock.calls.find((call) => call[0].type === 'gemini');
862
- expect(lastCall?.[0].text).toBe('Initial');
863
- // The final state should be idle after cancellation
864
- expect(result.current.streamingState).toBe(StreamingState.Idle);
865
- });
866
- it('should cancel if a tool call is in progress', async () => {
867
- const toolCalls = [
868
- {
869
- request: { callId: 'call1', name: 'tool1', args: {} },
870
- status: 'executing',
871
- responseSubmittedToGemini: false,
872
- tool: {
873
- name: 'tool1',
874
- description: 'desc1',
875
- build: vi.fn().mockImplementation((_) => ({
876
- getDescription: () => `Mock description`,
877
- })),
878
- },
879
- invocation: {
880
- getDescription: () => `Mock description`,
881
- },
882
- startTime: Date.now(),
883
- liveOutput: '...',
884
- },
885
- ];
886
- const { result } = renderTestHook(toolCalls);
887
- // State is `Responding` because a tool is running
888
- expect(result.current.streamingState).toBe(StreamingState.Responding);
889
- // Try to cancel
890
- simulateEscapeKeyPress();
891
- // The cancel function should be called
892
- expect(mockCancelAllToolCalls).toHaveBeenCalled();
893
- });
894
- it('should cancel a request when a tool is awaiting confirmation', async () => {
895
- const mockOnConfirm = vi.fn().mockResolvedValue(undefined);
896
- const toolCalls = [
897
- {
898
- request: {
899
- callId: 'confirm-call',
900
- name: 'some_tool',
901
- args: {},
902
- isClientInitiated: false,
903
- prompt_id: 'prompt-id-1',
904
- },
905
- status: 'awaiting_approval',
906
- responseSubmittedToGemini: false,
907
- tool: {
908
- name: 'some_tool',
909
- description: 'a tool',
910
- build: vi.fn().mockImplementation((_) => ({
911
- getDescription: () => `Mock description`,
912
- })),
913
- },
914
- invocation: {
915
- getDescription: () => `Mock description`,
916
- },
917
- confirmationDetails: {
918
- type: 'edit',
919
- title: 'Confirm Edit',
920
- onConfirm: mockOnConfirm,
921
- fileName: 'file.txt',
922
- filePath: '/test/file.txt',
923
- fileDiff: 'fake diff',
924
- originalContent: 'old',
925
- newContent: 'new',
926
- },
927
- },
928
- ];
929
- const { result } = renderTestHook(toolCalls);
930
- // State is `WaitingForConfirmation` because a tool is awaiting approval
931
- expect(result.current.streamingState).toBe(StreamingState.WaitingForConfirmation);
932
- // Try to cancel
933
- simulateEscapeKeyPress();
934
- // The imperative cancel function should be called on the scheduler
935
- expect(mockCancelAllToolCalls).toHaveBeenCalled();
936
- // A cancellation message should be added to history
937
- await waitFor(() => {
938
- expect(mockAddItem).toHaveBeenCalledWith(expect.objectContaining({
939
- text: 'Request cancelled.',
940
- }));
941
- });
942
- // The final state should be idle
943
- expect(result.current.streamingState).toBe(StreamingState.Idle);
944
- });
945
- });
946
- describe('Retry Handling', () => {
947
- it('should update retryStatus when CoreEvent.RetryAttempt is emitted', async () => {
948
- const { result } = renderHookWithDefaults();
949
- const retryPayload = {
950
- model: 'gemini-2.5-pro',
951
- attempt: 2,
952
- maxAttempts: 3,
953
- delayMs: 1000,
954
- };
955
- await act(async () => {
956
- coreEvents.emit(CoreEvent.RetryAttempt, retryPayload);
957
- });
958
- expect(result.current.retryStatus).toEqual(retryPayload);
959
- });
960
- it('should reset retryStatus when isResponding becomes false', async () => {
961
- const { result } = renderTestHook();
962
- const retryPayload = {
963
- model: 'gemini-2.5-pro',
964
- attempt: 2,
965
- maxAttempts: 3,
966
- delayMs: 1000,
967
- };
968
- // Start a query to make isResponding true
969
- const mockStream = (async function* () {
970
- yield { type: LlmEventType.TextDelta, text: 'Part 1' };
971
- await new Promise(() => { }); // Keep stream open
972
- })();
973
- mockSendMessageStream.mockReturnValue(mockStream);
974
- await act(async () => {
975
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
976
- result.current.submitQuery('test query');
977
- });
978
- await waitFor(() => {
979
- expect(result.current.streamingState).toBe(StreamingState.Responding);
980
- });
981
- // Emit retry event
982
- await act(async () => {
983
- coreEvents.emit(CoreEvent.RetryAttempt, retryPayload);
984
- });
985
- expect(result.current.retryStatus).toEqual(retryPayload);
986
- // Cancel to make isResponding false
987
- await act(async () => {
988
- result.current.cancelOngoingRequest();
989
- });
990
- expect(result.current.retryStatus).toBeNull();
991
- });
992
- });
993
- describe('Slash Command Handling', () => {
994
- it('should schedule a tool call when the command processor returns a schedule_tool action', async () => {
995
- const clientToolRequest = {
996
- type: 'schedule_tool',
997
- toolName: 'save_memory',
998
- toolArgs: { fact: 'test fact' },
999
- };
1000
- mockHandleSlashCommand.mockResolvedValue(clientToolRequest);
1001
- const { result } = renderTestHook();
1002
- await act(async () => {
1003
- await result.current.submitQuery('/memory add "test fact"');
1004
- });
1005
- await waitFor(() => {
1006
- expect(mockScheduleToolCalls).toHaveBeenCalledWith([
1007
- expect.objectContaining({
1008
- name: 'save_memory',
1009
- args: { fact: 'test fact' },
1010
- isClientInitiated: true,
1011
- }),
1012
- ], expect.any(AbortSignal));
1013
- expect(mockSendMessageStream).not.toHaveBeenCalled();
1014
- });
1015
- });
1016
- it('should stop processing and not call Gemini when a command is handled without a tool call', async () => {
1017
- const uiOnlyCommandResult = {
1018
- type: 'handled',
1019
- };
1020
- mockHandleSlashCommand.mockResolvedValue(uiOnlyCommandResult);
1021
- const { result } = renderTestHook();
1022
- await act(async () => {
1023
- await result.current.submitQuery('/help');
1024
- });
1025
- await waitFor(() => {
1026
- expect(mockHandleSlashCommand).toHaveBeenCalledWith('/help');
1027
- expect(mockScheduleToolCalls).not.toHaveBeenCalled();
1028
- expect(mockSendMessageStream).not.toHaveBeenCalled(); // No LLM call made
1029
- });
1030
- });
1031
- it('should call Gemini with prompt content when slash command returns a `submit_prompt` action', async () => {
1032
- const customCommandResult = {
1033
- type: 'submit_prompt',
1034
- content: 'This is the actual prompt from the command file.',
1035
- };
1036
- mockHandleSlashCommand.mockResolvedValue(customCommandResult);
1037
- const { result, mockSendMessageStream: localMockSendMessageStream } = renderTestHook();
1038
- await act(async () => {
1039
- await result.current.submitQuery('/my-custom-command');
1040
- });
1041
- await waitFor(() => {
1042
- expect(mockHandleSlashCommand).toHaveBeenCalledWith('/my-custom-command');
1043
- expect(localMockSendMessageStream).not.toHaveBeenCalledWith('/my-custom-command', expect.anything(), expect.anything());
1044
- expect(localMockSendMessageStream).toHaveBeenCalledWith('This is the actual prompt from the command file.', expect.any(AbortSignal), expect.any(String));
1045
- expect(mockScheduleToolCalls).not.toHaveBeenCalled();
1046
- });
1047
- });
1048
- it('should correctly handle a submit_prompt action with empty content', async () => {
1049
- const emptyPromptResult = {
1050
- type: 'submit_prompt',
1051
- content: '',
1052
- };
1053
- mockHandleSlashCommand.mockResolvedValue(emptyPromptResult);
1054
- const { result, mockSendMessageStream: localMockSendMessageStream } = renderTestHook();
1055
- await act(async () => {
1056
- await result.current.submitQuery('/emptycmd');
1057
- });
1058
- await waitFor(() => {
1059
- expect(mockHandleSlashCommand).toHaveBeenCalledWith('/emptycmd');
1060
- expect(localMockSendMessageStream).toHaveBeenCalledWith('', expect.any(AbortSignal), expect.any(String));
1061
- });
1062
- });
1063
- it('should not call handleSlashCommand for line comments', async () => {
1064
- const { result, mockSendMessageStream: localMockSendMessageStream } = renderTestHook();
1065
- await act(async () => {
1066
- await result.current.submitQuery('// This is a line comment');
1067
- });
1068
- await waitFor(() => {
1069
- expect(mockHandleSlashCommand).not.toHaveBeenCalled();
1070
- expect(localMockSendMessageStream).toHaveBeenCalledWith('// This is a line comment', expect.any(AbortSignal), expect.any(String));
1071
- });
1072
- });
1073
- it('should not call handleSlashCommand for block comments', async () => {
1074
- const { result, mockSendMessageStream: localMockSendMessageStream } = renderTestHook();
1075
- await act(async () => {
1076
- await result.current.submitQuery('/* This is a block comment */');
1077
- });
1078
- await waitFor(() => {
1079
- expect(mockHandleSlashCommand).not.toHaveBeenCalled();
1080
- expect(localMockSendMessageStream).toHaveBeenCalledWith('/* This is a block comment */', expect.any(AbortSignal), expect.any(String));
1081
- });
1082
- });
1083
- it('should not call handleSlashCommand is shell mode is active', async () => {
1084
- const { result } = renderHook(() => useGeminiStream(new MockedGeminiClientClass(mockConfig), [], mockAddItem, mockConfig, mockLoadedSettings, () => { }, mockHandleSlashCommand, true, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
1085
- await act(async () => {
1086
- await result.current.submitQuery('/about');
1087
- });
1088
- await waitFor(() => {
1089
- expect(mockHandleSlashCommand).not.toHaveBeenCalled();
1090
- });
1091
- });
1092
- });
1093
- describe('Memory Refresh on save_memory', () => {
1094
- it('should call performMemoryRefresh when a save_memory tool call completes successfully', async () => {
1095
- const mockPerformMemoryRefresh = vi.fn();
1096
- const completedToolCall = {
1097
- request: {
1098
- callId: 'save-mem-call-1',
1099
- name: 'save_memory',
1100
- args: { fact: 'test' },
1101
- isClientInitiated: true,
1102
- prompt_id: 'prompt-id-6',
1103
- },
1104
- status: 'success',
1105
- responseSubmittedToGemini: false,
1106
- response: {
1107
- callId: 'save-mem-call-1',
1108
- responseParts: [{ text: 'Memory saved' }],
1109
- resultDisplay: 'Success: Memory saved',
1110
- error: undefined,
1111
- errorType: undefined, // FIX: Added missing property
1112
- },
1113
- tool: {
1114
- name: 'save_memory',
1115
- displayName: 'save_memory',
1116
- description: 'Saves memory',
1117
- build: vi.fn(),
1118
- },
1119
- invocation: {
1120
- getDescription: () => `Mock description`,
1121
- },
1122
- };
1123
- // Capture the onComplete callback
1124
- let capturedOnComplete = null;
1125
- mockUseToolScheduler.mockImplementation((onComplete) => {
1126
- capturedOnComplete = onComplete;
1127
- return [[], mockScheduleToolCalls, mockMarkToolsAsSubmitted, vi.fn()];
1128
- });
1129
- renderHook(() => useGeminiStream(new MockedGeminiClientClass(mockConfig), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, mockPerformMemoryRefresh, false, () => { }, () => { }, () => { }, 80, 24));
1130
- // Trigger the onComplete callback with the completed save_memory tool
1131
- await act(async () => {
1132
- if (capturedOnComplete) {
1133
- await capturedOnComplete([completedToolCall]);
1134
- }
1135
- });
1136
- await waitFor(() => {
1137
- expect(mockPerformMemoryRefresh).toHaveBeenCalledTimes(1);
1138
- });
1139
- });
1140
- });
1141
- describe('Error Handling', () => {
1142
- it('should call parseAndFormatApiError with the correct authType on stream initialization failure', async () => {
1143
- // 1. Setup
1144
- const mockError = new Error('Rate limit exceeded');
1145
- const mockAuthType = AuthType.LOGIN_WITH_GOOGLE;
1146
- mockParseAndFormatApiError.mockClear();
1147
- mockSendMessageStream.mockReturnValue((async function* () {
1148
- yield { type: LlmEventType.TextDelta, text: '' };
1149
- throw mockError;
1150
- })());
1151
- const testConfig = {
1152
- ...mockConfig,
1153
- getContentGeneratorConfig: vi.fn(() => ({
1154
- authType: mockAuthType,
1155
- })),
1156
- getModel: vi.fn(() => 'gemini-2.5-pro'),
1157
- };
1158
- const { result } = renderHook(() => useGeminiStream(new MockedGeminiClientClass(testConfig), [], mockAddItem, testConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
1159
- // 2. Action
1160
- await act(async () => {
1161
- await result.current.submitQuery('test query');
1162
- });
1163
- // 3. Assertion
1164
- await waitFor(() => {
1165
- expect(mockParseAndFormatApiError).toHaveBeenCalledWith('Rate limit exceeded', mockAuthType, undefined, 'gemini-2.5-pro', 'gemini-2.5-flash');
1166
- });
1167
- });
1168
- });
1169
- describe('handleApprovalModeChange', () => {
1170
- it('should auto-approve all pending tool calls when switching to YOLO mode', async () => {
1171
- const mockOnConfirm = vi.fn().mockResolvedValue(undefined);
1172
- const awaitingApprovalToolCalls = [
1173
- createMockToolCall('replace', 'call1', 'edit', mockOnConfirm),
1174
- createMockToolCall('read_file', 'call2', 'info', mockOnConfirm),
1175
- ];
1176
- const { result } = renderTestHook(awaitingApprovalToolCalls);
1177
- await act(async () => {
1178
- await result.current.handleApprovalModeChange(ApprovalMode.YOLO);
1179
- });
1180
- // Both tool calls should be auto-approved
1181
- expect(mockOnConfirm).toHaveBeenCalledTimes(2);
1182
- expect(mockOnConfirm).toHaveBeenCalledWith(ToolConfirmationOutcome.ProceedOnce);
1183
- });
1184
- it('should only auto-approve edit tools when switching to AUTO_EDIT mode', async () => {
1185
- const mockOnConfirmReplace = vi.fn().mockResolvedValue(undefined);
1186
- const mockOnConfirmWrite = vi.fn().mockResolvedValue(undefined);
1187
- const mockOnConfirmRead = vi.fn().mockResolvedValue(undefined);
1188
- const awaitingApprovalToolCalls = [
1189
- createMockToolCall('replace', 'call1', 'edit', mockOnConfirmReplace),
1190
- createMockToolCall('write_file', 'call2', 'edit', mockOnConfirmWrite),
1191
- createMockToolCall('read_file', 'call3', 'info', mockOnConfirmRead),
1192
- ];
1193
- const { result } = renderTestHook(awaitingApprovalToolCalls);
1194
- await act(async () => {
1195
- await result.current.handleApprovalModeChange(ApprovalMode.AUTO_EDIT);
1196
- });
1197
- // Only replace and write_file should be auto-approved
1198
- expect(mockOnConfirmReplace).toHaveBeenCalledWith(ToolConfirmationOutcome.ProceedOnce);
1199
- expect(mockOnConfirmWrite).toHaveBeenCalledWith(ToolConfirmationOutcome.ProceedOnce);
1200
- // read_file should not be auto-approved
1201
- expect(mockOnConfirmRead).not.toHaveBeenCalled();
1202
- });
1203
- it('should not auto-approve any tools when switching to REQUIRE_CONFIRMATION mode', async () => {
1204
- const mockOnConfirm = vi.fn().mockResolvedValue(undefined);
1205
- const awaitingApprovalToolCalls = [
1206
- createMockToolCall('replace', 'call1', 'edit', mockOnConfirm),
1207
- ];
1208
- const { result } = renderTestHook(awaitingApprovalToolCalls);
1209
- await act(async () => {
1210
- await result.current.handleApprovalModeChange(ApprovalMode.DEFAULT);
1211
- });
1212
- // No tools should be auto-approved
1213
- expect(mockOnConfirm).not.toHaveBeenCalled();
1214
- });
1215
- it('should handle errors gracefully when auto-approving tool calls', async () => {
1216
- const debuggerSpy = vi
1217
- .spyOn(debugLogger, 'warn')
1218
- .mockImplementation(() => { });
1219
- const mockOnConfirmSuccess = vi.fn().mockResolvedValue(undefined);
1220
- const mockOnConfirmError = vi
1221
- .fn()
1222
- .mockRejectedValue(new Error('Approval failed'));
1223
- const awaitingApprovalToolCalls = [
1224
- createMockToolCall('replace', 'call1', 'edit', mockOnConfirmSuccess),
1225
- createMockToolCall('write_file', 'call2', 'edit', mockOnConfirmError),
1226
- ];
1227
- const { result } = renderTestHook(awaitingApprovalToolCalls);
1228
- await act(async () => {
1229
- await result.current.handleApprovalModeChange(ApprovalMode.YOLO);
1230
- });
1231
- // Both confirmation methods should be called
1232
- expect(mockOnConfirmSuccess).toHaveBeenCalled();
1233
- expect(mockOnConfirmError).toHaveBeenCalled();
1234
- // Error should be logged
1235
- expect(debuggerSpy).toHaveBeenCalledWith('Failed to auto-approve tool call call2:', expect.any(Error));
1236
- debuggerSpy.mockRestore();
1237
- });
1238
- it('should skip tool calls without confirmationDetails', async () => {
1239
- const awaitingApprovalToolCalls = [
1240
- {
1241
- request: {
1242
- callId: 'call1',
1243
- name: 'replace',
1244
- args: { old_string: 'old', new_string: 'new' },
1245
- isClientInitiated: false,
1246
- prompt_id: 'prompt-id-1',
1247
- },
1248
- status: 'awaiting_approval',
1249
- responseSubmittedToGemini: false,
1250
- // No confirmationDetails
1251
- tool: {
1252
- name: 'replace',
1253
- displayName: 'replace',
1254
- description: 'Replace text',
1255
- build: vi.fn(),
1256
- },
1257
- invocation: {
1258
- getDescription: () => 'Mock description',
1259
- },
1260
- },
1261
- ];
1262
- const { result } = renderTestHook(awaitingApprovalToolCalls);
1263
- // Should not throw an error
1264
- await act(async () => {
1265
- await result.current.handleApprovalModeChange(ApprovalMode.YOLO);
1266
- });
1267
- });
1268
- it('should skip tool calls without onConfirm method in confirmationDetails', async () => {
1269
- const awaitingApprovalToolCalls = [
1270
- {
1271
- request: {
1272
- callId: 'call1',
1273
- name: 'replace',
1274
- args: { old_string: 'old', new_string: 'new' },
1275
- isClientInitiated: false,
1276
- prompt_id: 'prompt-id-1',
1277
- },
1278
- status: 'awaiting_approval',
1279
- responseSubmittedToGemini: false,
1280
- confirmationDetails: {
1281
- type: 'edit',
1282
- title: 'Confirm Edit',
1283
- // No onConfirm method
1284
- fileName: 'file.txt',
1285
- filePath: '/test/file.txt',
1286
- fileDiff: 'fake diff',
1287
- originalContent: 'old',
1288
- newContent: 'new',
1289
- },
1290
- tool: {
1291
- name: 'replace',
1292
- displayName: 'replace',
1293
- description: 'Replace text',
1294
- build: vi.fn(),
1295
- },
1296
- invocation: {
1297
- getDescription: () => 'Mock description',
1298
- },
1299
- },
1300
- ];
1301
- const { result } = renderTestHook(awaitingApprovalToolCalls);
1302
- // Should not throw an error
1303
- await act(async () => {
1304
- await result.current.handleApprovalModeChange(ApprovalMode.YOLO);
1305
- });
1306
- });
1307
- it('should only process tool calls with awaiting_approval status', async () => {
1308
- const mockOnConfirmAwaiting = vi.fn().mockResolvedValue(undefined);
1309
- const mockOnConfirmExecuting = vi.fn().mockResolvedValue(undefined);
1310
- const mixedStatusToolCalls = [
1311
- {
1312
- request: {
1313
- callId: 'call1',
1314
- name: 'replace',
1315
- args: { old_string: 'old', new_string: 'new' },
1316
- isClientInitiated: false,
1317
- prompt_id: 'prompt-id-1',
1318
- },
1319
- status: 'awaiting_approval',
1320
- responseSubmittedToGemini: false,
1321
- confirmationDetails: {
1322
- type: 'edit',
1323
- title: 'Confirm Edit',
1324
- onConfirm: mockOnConfirmAwaiting,
1325
- fileName: 'file.txt',
1326
- filePath: '/test/file.txt',
1327
- fileDiff: 'fake diff',
1328
- originalContent: 'old',
1329
- newContent: 'new',
1330
- },
1331
- tool: {
1332
- name: 'replace',
1333
- displayName: 'replace',
1334
- description: 'Replace text',
1335
- build: vi.fn(),
1336
- },
1337
- invocation: {
1338
- getDescription: () => 'Mock description',
1339
- },
1340
- },
1341
- {
1342
- request: {
1343
- callId: 'call2',
1344
- name: 'write_file',
1345
- args: { path: '/test/file.txt', content: 'content' },
1346
- isClientInitiated: false,
1347
- prompt_id: 'prompt-id-1',
1348
- },
1349
- status: 'executing',
1350
- responseSubmittedToGemini: false,
1351
- tool: {
1352
- name: 'write_file',
1353
- displayName: 'write_file',
1354
- description: 'Write file',
1355
- build: vi.fn(),
1356
- },
1357
- invocation: {
1358
- getDescription: () => 'Mock description',
1359
- },
1360
- startTime: Date.now(),
1361
- liveOutput: 'Writing...',
1362
- },
1363
- ];
1364
- const { result } = renderTestHook(mixedStatusToolCalls);
1365
- await act(async () => {
1366
- await result.current.handleApprovalModeChange(ApprovalMode.YOLO);
1367
- });
1368
- // Only the awaiting_approval tool should be processed
1369
- expect(mockOnConfirmAwaiting).toHaveBeenCalledTimes(1);
1370
- expect(mockOnConfirmExecuting).not.toHaveBeenCalled();
1371
- });
1372
- });
1373
- describe('handleFinishedEvent', () => {
1374
- it('should add info message for MAX_TOKENS finish reason', async () => {
1375
- // Setup mock to return a stream with MAX_TOKENS finish reason
1376
- mockSendMessageStream.mockReturnValue((async function* () {
1377
- yield {
1378
- type: LlmEventType.TextDelta,
1379
- text: 'This is a truncated response...',
1380
- };
1381
- yield {
1382
- type: LlmEventType.Finished,
1383
- finishReason: 'max_tokens',
1384
- };
1385
- })());
1386
- const { result } = renderHook(() => useGeminiStream(new MockedGeminiClientClass(mockConfig), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
1387
- // Submit a query
1388
- await act(async () => {
1389
- await result.current.submitQuery('Generate long text');
1390
- });
1391
- // Check that the info message was added
1392
- await waitFor(() => {
1393
- expect(mockAddItem).toHaveBeenCalledWith({
1394
- type: 'info',
1395
- text: '⚠️ Response truncated due to token limits.',
1396
- }, expect.any(Number));
1397
- });
1398
- });
1399
- describe('ContextWindowWillOverflow event', () => {
1400
- beforeEach(() => {
1401
- vi.mocked(tokenLimit).mockReturnValue(100);
1402
- });
1403
- it.each([
1404
- {
1405
- name: 'without suggestion when remaining tokens are > 75% of limit',
1406
- requestTokens: 20,
1407
- remainingTokens: 80,
1408
- expectedMessage: 'Sending this message (20 tokens) might exceed the remaining context window limit (80 tokens).',
1409
- },
1410
- {
1411
- name: 'with suggestion when remaining tokens are < 75% of limit',
1412
- requestTokens: 30,
1413
- remainingTokens: 70,
1414
- expectedMessage: 'Sending this message (30 tokens) might exceed the remaining context window limit (70 tokens). Please try reducing the size of your message or use the `/compress` command to compress the chat history.',
1415
- },
1416
- ])('should add message $name', async ({ requestTokens, remainingTokens, expectedMessage }) => {
1417
- mockSendMessageStream.mockReturnValue((async function* () {
1418
- yield {
1419
- type: LlmEventType.ContextWindowOverflow,
1420
- currentTokens: requestTokens,
1421
- maxTokens: remainingTokens,
1422
- };
1423
- })());
1424
- const { result } = renderHookWithDefaults();
1425
- await act(async () => {
1426
- await result.current.submitQuery('Test overflow');
1427
- });
1428
- await waitFor(() => {
1429
- expect(mockAddItem).toHaveBeenCalledWith({
1430
- type: 'info',
1431
- text: expectedMessage,
1432
- });
1433
- });
1434
- });
1435
- });
1436
- it('should call onCancelSubmit when ContextWindowWillOverflow event is received', async () => {
1437
- const onCancelSubmitSpy = vi.fn();
1438
- // Setup mock to return a stream with ContextWindowWillOverflow event
1439
- mockSendMessageStream.mockReturnValue((async function* () {
1440
- yield {
1441
- type: LlmEventType.ContextWindowOverflow,
1442
- currentTokens: 100,
1443
- maxTokens: 50,
1444
- };
1445
- })());
1446
- const { result } = renderHook(() => useGeminiStream(new MockedGeminiClientClass(mockConfig), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, onCancelSubmitSpy, () => { }, 80, 24));
1447
- // Submit a query
1448
- await act(async () => {
1449
- await result.current.submitQuery('Test overflow');
1450
- });
1451
- // Check that onCancelSubmit was called
1452
- await waitFor(() => {
1453
- expect(onCancelSubmitSpy).toHaveBeenCalledWith(true);
1454
- });
1455
- });
1456
- it.each([
1457
- {
1458
- reason: 'end_turn',
1459
- shouldAddMessage: false,
1460
- },
1461
- {
1462
- reason: undefined,
1463
- shouldAddMessage: false,
1464
- },
1465
- {
1466
- reason: 'max_tokens',
1467
- message: '⚠️ Response truncated due to token limits.',
1468
- },
1469
- {
1470
- reason: 'content_filter',
1471
- message: '⚠️ Response stopped due to content filtering.',
1472
- },
1473
- {
1474
- reason: 'error',
1475
- message: '⚠️ Response stopped due to an error.',
1476
- },
1477
- {
1478
- reason: 'unknown',
1479
- shouldAddMessage: false,
1480
- },
1481
- ])('should handle $reason finish reason correctly', async ({ reason, shouldAddMessage = true, message }) => {
1482
- mockSendMessageStream.mockReturnValue((async function* () {
1483
- yield {
1484
- type: LlmEventType.TextDelta,
1485
- text: `Response for ${reason}`,
1486
- };
1487
- yield {
1488
- type: LlmEventType.Finished,
1489
- finishReason: reason,
1490
- };
1491
- })());
1492
- const { result } = renderHookWithDefaults();
1493
- await act(async () => {
1494
- await result.current.submitQuery(`Test ${reason}`);
1495
- });
1496
- if (shouldAddMessage) {
1497
- await waitFor(() => {
1498
- expect(mockAddItem).toHaveBeenCalledWith({
1499
- type: 'info',
1500
- text: message,
1501
- }, expect.any(Number));
1502
- });
1503
- }
1504
- else {
1505
- // Verify state returns to idle without any info messages
1506
- await waitFor(() => {
1507
- expect(result.current.streamingState).toBe(StreamingState.Idle);
1508
- });
1509
- const infoMessages = mockAddItem.mock.calls.filter((call) => call[0].type === 'info');
1510
- expect(infoMessages).toHaveLength(0);
1511
- }
1512
- });
1513
- });
1514
- it('should flush pending text rationale before scheduling tool calls to ensure correct history order', async () => {
1515
- const addItemOrder = [];
1516
- let capturedOnComplete;
1517
- const mockScheduleToolCalls = vi.fn(async (requests) => {
1518
- addItemOrder.push('scheduleToolCalls_START');
1519
- // Simulate tools completing and triggering onComplete immediately.
1520
- // This mimics the behavior that caused the regression where tool results
1521
- // were added to history during the await scheduleToolCalls(...) block.
1522
- const tools = requests.map((r) => ({
1523
- request: r,
1524
- status: 'success',
1525
- tool: { displayName: r.name, name: r.name },
1526
- invocation: { getDescription: () => 'desc' },
1527
- response: { responseParts: [], resultDisplay: 'done' },
1528
- startTime: Date.now(),
1529
- endTime: Date.now(),
1530
- }));
1531
- await capturedOnComplete(tools);
1532
- addItemOrder.push('scheduleToolCalls_END');
1533
- });
1534
- mockAddItem.mockImplementation((item) => {
1535
- addItemOrder.push(`addItem:${item.type}`);
1536
- });
1537
- // We need to capture the onComplete callback from useToolScheduler
1538
- mockUseToolScheduler.mockImplementation((onComplete) => {
1539
- capturedOnComplete = onComplete;
1540
- return [
1541
- [], // toolCalls
1542
- mockScheduleToolCalls,
1543
- vi.fn(), // markToolsAsSubmitted
1544
- vi.fn(), // setToolCallsForDisplay
1545
- vi.fn(), // cancelAllToolCalls
1546
- 0, // lastToolOutputTime
1547
- ];
1548
- });
1549
- const { result } = renderHook(() => useGeminiStream(new MockedGeminiClientClass(mockConfig), [], mockAddItem, mockConfig, mockLoadedSettings, vi.fn(), vi.fn(), false, () => 'vscode', vi.fn(), vi.fn(), false, vi.fn(), vi.fn(), vi.fn(), 80, 24));
1550
- const mockStream = (async function* () {
1551
- yield {
1552
- type: LlmEventType.TextDelta,
1553
- text: 'Rationale rationale.',
1554
- };
1555
- yield {
1556
- type: LlmEventType.ToolCallRequest,
1557
- callId: '1',
1558
- name: 'test_tool',
1559
- args: {},
1560
- };
1561
- })();
1562
- mockSendMessageStream.mockReturnValue(mockStream);
1563
- await act(async () => {
1564
- await result.current.submitQuery('test input');
1565
- });
1566
- // Expectation: addItem:gemini (rationale) MUST happen before scheduleToolCalls_START
1567
- const rationaleIndex = addItemOrder.indexOf('addItem:gemini');
1568
- const scheduleIndex = addItemOrder.indexOf('scheduleToolCalls_START');
1569
- const toolGroupIndex = addItemOrder.indexOf('addItem:tool_group');
1570
- expect(rationaleIndex).toBeGreaterThan(-1);
1571
- expect(scheduleIndex).toBeGreaterThan(-1);
1572
- expect(toolGroupIndex).toBeGreaterThan(-1);
1573
- // This is the core fix validation: Rationale comes before tools are even scheduled (awaited)
1574
- expect(rationaleIndex).toBeLessThan(scheduleIndex);
1575
- expect(rationaleIndex).toBeLessThan(toolGroupIndex);
1576
- });
1577
- it('should process @include commands, adding user turn after processing to prevent race conditions', async () => {
1578
- const rawQuery = '@include file.txt Summarize this.';
1579
- const processedQueryParts = [
1580
- { text: 'Summarize this with content from @file.txt' },
1581
- { text: 'File content...' },
1582
- ];
1583
- const userMessageTimestamp = Date.now();
1584
- vi.spyOn(Date, 'now').mockReturnValue(userMessageTimestamp);
1585
- handleAtCommandSpy.mockResolvedValue({
1586
- processedQuery: processedQueryParts,
1587
- shouldProceed: true,
1588
- });
1589
- const { result } = renderHook(() => useGeminiStream(mockConfig.getGeminiClient(), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, // shellModeActive
1590
- vi.fn(), // getPreferredEditor
1591
- vi.fn(), // onAuthError
1592
- vi.fn(), // performMemoryRefresh
1593
- false, // modelSwitched
1594
- vi.fn(), // setModelSwitched
1595
- vi.fn(), // onCancelSubmit
1596
- vi.fn(), // setShellInputFocused
1597
- 80, // terminalWidth
1598
- 24));
1599
- await act(async () => {
1600
- await result.current.submitQuery(rawQuery);
1601
- });
1602
- expect(handleAtCommandSpy).toHaveBeenCalledWith(expect.objectContaining({
1603
- query: rawQuery,
1604
- }));
1605
- expect(mockAddItem).toHaveBeenCalledWith({
1606
- type: MessageType.USER,
1607
- text: rawQuery,
1608
- }, userMessageTimestamp);
1609
- // FIX: The expectation now matches the actual call signature.
1610
- expect(mockSendMessageStream).toHaveBeenCalledWith(processedQueryParts, // Argument 1: The parts array directly
1611
- expect.any(AbortSignal), // Argument 2: An AbortSignal
1612
- expect.any(String));
1613
- });
1614
- it('should display user query, then tool execution, then model response', async () => {
1615
- const userQuery = 'read this @file(test.txt)';
1616
- const toolExecutionMessage = 'Reading file: test.txt';
1617
- const modelResponseContent = 'The content of test.txt is: Hello World!';
1618
- // Mock handleAtCommand to simulate a tool call and add a tool_group message
1619
- handleAtCommandSpy.mockImplementation(async ({ addItem: atCommandAddItem, messageId }) => {
1620
- atCommandAddItem({
1621
- type: 'tool_group',
1622
- tools: [
1623
- {
1624
- callId: 'client-read-123',
1625
- name: 'read_file',
1626
- description: toolExecutionMessage,
1627
- status: ToolCallStatus.Success,
1628
- resultDisplay: toolExecutionMessage,
1629
- confirmationDetails: undefined,
1630
- },
1631
- ],
1632
- }, messageId);
1633
- return { shouldProceed: true, processedQuery: userQuery };
1634
- });
1635
- // Mock the Gemini stream to return a model response after the tool
1636
- mockSendMessageStream.mockReturnValue((async function* () {
1637
- yield {
1638
- type: LlmEventType.TextDelta,
1639
- text: modelResponseContent,
1640
- };
1641
- yield {
1642
- type: LlmEventType.Finished,
1643
- finishReason: 'end_turn',
1644
- };
1645
- })());
1646
- const { result } = renderTestHook();
1647
- await act(async () => {
1648
- await result.current.submitQuery(userQuery);
1649
- });
1650
- // Assert the order of messages added to the history
1651
- await waitFor(() => {
1652
- expect(mockAddItem).toHaveBeenCalledTimes(3); // User prompt + tool execution + model response
1653
- // 1. User's prompt
1654
- expect(mockAddItem).toHaveBeenNthCalledWith(1, expect.objectContaining({
1655
- type: MessageType.USER,
1656
- text: userQuery,
1657
- }), expect.any(Number));
1658
- // 2. Tool execution message
1659
- expect(mockAddItem).toHaveBeenNthCalledWith(2, expect.objectContaining({
1660
- type: 'tool_group',
1661
- tools: expect.arrayContaining([
1662
- expect.objectContaining({
1663
- name: 'read_file',
1664
- status: ToolCallStatus.Success,
1665
- }),
1666
- ]),
1667
- }), expect.any(Number));
1668
- // 3. Model's response
1669
- expect(mockAddItem).toHaveBeenNthCalledWith(3, expect.objectContaining({
1670
- type: 'gemini',
1671
- text: modelResponseContent,
1672
- }), expect.any(Number));
1673
- });
1674
- });
1675
- describe('Thought Reset', () => {
1676
- it('should reset thought to null when starting a new prompt', async () => {
1677
- // First, simulate a response with a thought
1678
- mockSendMessageStream.mockReturnValue((async function* () {
1679
- yield {
1680
- type: LlmEventType.ThoughtDelta,
1681
- thought: 'Old description',
1682
- metadata: { subject: 'Previous thought' },
1683
- };
1684
- yield {
1685
- type: LlmEventType.TextDelta,
1686
- text: 'Some response content',
1687
- };
1688
- yield {
1689
- type: LlmEventType.Finished,
1690
- finishReason: 'end_turn',
1691
- };
1692
- })());
1693
- const { result } = renderHook(() => useGeminiStream(new MockedGeminiClientClass(mockConfig), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
1694
- // Submit first query to set a thought
1695
- await act(async () => {
1696
- await result.current.submitQuery('First query');
1697
- });
1698
- // Wait for the first response to complete
1699
- await waitFor(() => {
1700
- expect(mockAddItem).toHaveBeenCalledWith(expect.objectContaining({
1701
- type: 'gemini',
1702
- text: 'Some response content',
1703
- }), expect.any(Number));
1704
- });
1705
- // Now simulate a new response without a thought
1706
- mockSendMessageStream.mockReturnValue((async function* () {
1707
- yield {
1708
- type: LlmEventType.TextDelta,
1709
- text: 'New response content',
1710
- };
1711
- yield {
1712
- type: LlmEventType.Finished,
1713
- finishReason: 'end_turn',
1714
- };
1715
- })());
1716
- // Submit second query - thought should be reset
1717
- await act(async () => {
1718
- await result.current.submitQuery('Second query');
1719
- });
1720
- // The thought should be reset to null when starting the new prompt
1721
- // We can verify this by checking that the LoadingIndicator would not show the previous thought
1722
- // The actual thought state is internal to the hook, but we can verify the behavior
1723
- // by ensuring the second response doesn't show the previous thought
1724
- await waitFor(() => {
1725
- expect(mockAddItem).toHaveBeenCalledWith(expect.objectContaining({
1726
- type: 'gemini',
1727
- text: 'New response content',
1728
- }), expect.any(Number));
1729
- });
1730
- });
1731
- it('should memoize pendingHistoryItems', () => {
1732
- mockUseToolScheduler.mockReturnValue([
1733
- [],
1734
- mockScheduleToolCalls,
1735
- mockCancelAllToolCalls,
1736
- mockMarkToolsAsSubmitted,
1737
- ]);
1738
- const { result, rerender } = renderHook(() => useGeminiStream(mockConfig.getGeminiClient(), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
1739
- const firstResult = result.current.pendingHistoryItems;
1740
- rerender();
1741
- const secondResult = result.current.pendingHistoryItems;
1742
- expect(firstResult).toStrictEqual(secondResult);
1743
- const newToolCalls = [
1744
- {
1745
- request: { callId: 'call1', name: 'tool1', args: {} },
1746
- status: 'executing',
1747
- tool: {
1748
- name: 'tool1',
1749
- displayName: 'tool1',
1750
- description: 'desc1',
1751
- build: vi.fn(),
1752
- },
1753
- invocation: {
1754
- getDescription: () => 'Mock description',
1755
- },
1756
- },
1757
- ];
1758
- mockUseToolScheduler.mockReturnValue([
1759
- newToolCalls,
1760
- mockScheduleToolCalls,
1761
- mockCancelAllToolCalls,
1762
- mockMarkToolsAsSubmitted,
1763
- ]);
1764
- rerender();
1765
- const thirdResult = result.current.pendingHistoryItems;
1766
- expect(thirdResult).not.toStrictEqual(secondResult);
1767
- });
1768
- it('should reset thought to null when user cancels', async () => {
1769
- // Mock a stream that yields a thought then gets cancelled
1770
- mockSendMessageStream.mockReturnValue((async function* () {
1771
- yield {
1772
- type: LlmEventType.ThoughtDelta,
1773
- thought: 'Description',
1774
- metadata: { subject: 'Some thought' },
1775
- };
1776
- yield { type: LlmEventType.UserCancelled };
1777
- })());
1778
- const { result } = renderHook(() => useGeminiStream(new MockedGeminiClientClass(mockConfig), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
1779
- // Submit query
1780
- await act(async () => {
1781
- await result.current.submitQuery('Test query');
1782
- });
1783
- // Verify cancellation message was added
1784
- await waitFor(() => {
1785
- expect(mockAddItem).toHaveBeenCalledWith(expect.objectContaining({
1786
- type: 'info',
1787
- text: 'User cancelled the request.',
1788
- }), expect.any(Number));
1789
- });
1790
- // Verify state is reset to idle
1791
- expect(result.current.streamingState).toBe(StreamingState.Idle);
1792
- });
1793
- it('should reset thought to null when there is an error', async () => {
1794
- // Mock a stream that yields a thought then encounters an error
1795
- mockSendMessageStream.mockReturnValue((async function* () {
1796
- yield {
1797
- type: LlmEventType.ThoughtDelta,
1798
- thought: 'Description',
1799
- metadata: { subject: 'Some thought' },
1800
- };
1801
- yield {
1802
- type: LlmEventType.Error,
1803
- error: new Error('Test error'),
1804
- };
1805
- })());
1806
- const { result } = renderHook(() => useGeminiStream(new MockedGeminiClientClass(mockConfig), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
1807
- // Submit query
1808
- await act(async () => {
1809
- await result.current.submitQuery('Test query');
1810
- });
1811
- // Verify error message was added
1812
- await waitFor(() => {
1813
- expect(mockAddItem).toHaveBeenCalledWith(expect.objectContaining({
1814
- type: 'error',
1815
- }), expect.any(Number));
1816
- });
1817
- // Verify parseAndFormatApiError was called
1818
- expect(mockParseAndFormatApiError).toHaveBeenCalledWith(expect.objectContaining({ message: 'Test error' }), expect.any(String), undefined, 'gemini-2.5-pro', 'gemini-2.5-flash');
1819
- });
1820
- it('should update lastOutputTime on Gemini thought and content events', async () => {
1821
- vi.useFakeTimers();
1822
- const startTime = 1000000;
1823
- vi.setSystemTime(startTime);
1824
- // Mock a stream that yields a thought then content
1825
- mockSendMessageStream.mockReturnValue((async function* () {
1826
- yield {
1827
- type: LlmEventType.ThoughtDelta,
1828
- thought: '',
1829
- metadata: { subject: 'Thinking...' },
1830
- };
1831
- // Advance time for the next event
1832
- vi.advanceTimersByTime(1000);
1833
- yield {
1834
- type: LlmEventType.TextDelta,
1835
- text: 'Hello',
1836
- };
1837
- })());
1838
- const { result } = renderHook(() => useGeminiStream(new MockedGeminiClientClass(mockConfig), [], mockAddItem, mockConfig, mockLoadedSettings, mockOnDebugMessage, mockHandleSlashCommand, false, () => 'vscode', () => { }, () => Promise.resolve(), false, () => { }, () => { }, () => { }, 80, 24));
1839
- // Submit query
1840
- await act(async () => {
1841
- await result.current.submitQuery('Test query');
1842
- });
1843
- // Verify lastOutputTime was updated
1844
- // It should be the time of the last event (startTime + 1000)
1845
- expect(result.current.lastOutputTime).toBe(startTime + 1000);
1846
- vi.useRealTimers();
1847
- });
1848
- });
1849
- describe('Loop Detection Confirmation', () => {
1850
- beforeEach(() => {
1851
- // Add mock for getLoopDetectionService to the config
1852
- const mockLoopDetectionService = {
1853
- disableForSession: vi.fn(),
1854
- };
1855
- mockConfig.getGeminiClient = vi.fn().mockReturnValue({
1856
- ...new MockedGeminiClientClass(mockConfig),
1857
- getLoopDetectionService: () => mockLoopDetectionService,
1858
- });
1859
- });
1860
- it('should set loopDetectionConfirmationRequest when LoopDetected event is received', async () => {
1861
- mockSendMessageStream.mockReturnValue((async function* () {
1862
- yield {
1863
- type: LlmEventType.TextDelta,
1864
- text: 'Some content',
1865
- };
1866
- yield {
1867
- type: LlmEventType.LoopDetected,
1868
- };
1869
- })());
1870
- const { result } = renderTestHook();
1871
- await act(async () => {
1872
- await result.current.submitQuery('test query');
1873
- });
1874
- await waitFor(() => {
1875
- expect(result.current.loopDetectionConfirmationRequest).not.toBeNull();
1876
- expect(typeof result.current.loopDetectionConfirmationRequest?.onComplete).toBe('function');
1877
- });
1878
- });
1879
- it('should disable loop detection and show message when user selects "disable"', async () => {
1880
- const mockLoopDetectionService = {
1881
- disableForSession: vi.fn(),
1882
- };
1883
- const mockClient = {
1884
- ...new MockedGeminiClientClass(mockConfig),
1885
- getLoopDetectionService: () => mockLoopDetectionService,
1886
- };
1887
- mockConfig.getGeminiClient = vi.fn().mockReturnValue(mockClient);
1888
- // Mock for the initial request
1889
- mockSendMessageStream.mockReturnValueOnce((async function* () {
1890
- yield {
1891
- type: LlmEventType.LoopDetected,
1892
- };
1893
- })());
1894
- // Mock for the retry request
1895
- mockSendMessageStream.mockReturnValueOnce((async function* () {
1896
- yield {
1897
- type: LlmEventType.TextDelta,
1898
- text: 'Retry successful',
1899
- };
1900
- yield {
1901
- type: LlmEventType.Finished,
1902
- finishReason: 'end_turn',
1903
- };
1904
- })());
1905
- const { result } = renderTestHook();
1906
- await act(async () => {
1907
- await result.current.submitQuery('test query');
1908
- });
1909
- // Wait for confirmation request to be set
1910
- await waitFor(() => {
1911
- expect(result.current.loopDetectionConfirmationRequest).not.toBeNull();
1912
- });
1913
- // Simulate user selecting "disable"
1914
- await act(async () => {
1915
- result.current.loopDetectionConfirmationRequest?.onComplete({
1916
- userSelection: 'disable',
1917
- });
1918
- });
1919
- // Verify loop detection was disabled
1920
- expect(mockLoopDetectionService.disableForSession).toHaveBeenCalledTimes(1);
1921
- // Verify confirmation request was cleared
1922
- expect(result.current.loopDetectionConfirmationRequest).toBeNull();
1923
- // Verify appropriate message was added
1924
- expect(mockAddItem).toHaveBeenCalledWith({
1925
- type: 'info',
1926
- text: 'Loop detection has been disabled for this session. Retrying request...',
1927
- });
1928
- // Verify that the request was retried
1929
- await waitFor(() => {
1930
- expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
1931
- expect(mockSendMessageStream).toHaveBeenNthCalledWith(2, 'test query', expect.any(AbortSignal), expect.any(String));
1932
- });
1933
- });
1934
- it('should keep loop detection enabled and show message when user selects "keep"', async () => {
1935
- const mockLoopDetectionService = {
1936
- disableForSession: vi.fn(),
1937
- };
1938
- const mockClient = {
1939
- ...new MockedGeminiClientClass(mockConfig),
1940
- getLoopDetectionService: () => mockLoopDetectionService,
1941
- };
1942
- mockConfig.getGeminiClient = vi.fn().mockReturnValue(mockClient);
1943
- mockSendMessageStream.mockReturnValue((async function* () {
1944
- yield {
1945
- type: LlmEventType.LoopDetected,
1946
- };
1947
- })());
1948
- const { result } = renderTestHook();
1949
- await act(async () => {
1950
- await result.current.submitQuery('test query');
1951
- });
1952
- // Wait for confirmation request to be set
1953
- await waitFor(() => {
1954
- expect(result.current.loopDetectionConfirmationRequest).not.toBeNull();
1955
- });
1956
- // Simulate user selecting "keep"
1957
- await act(async () => {
1958
- result.current.loopDetectionConfirmationRequest?.onComplete({
1959
- userSelection: 'keep',
1960
- });
1961
- });
1962
- // Verify loop detection was NOT disabled
1963
- expect(mockLoopDetectionService.disableForSession).not.toHaveBeenCalled();
1964
- // Verify confirmation request was cleared
1965
- expect(result.current.loopDetectionConfirmationRequest).toBeNull();
1966
- // Verify appropriate message was added
1967
- expect(mockAddItem).toHaveBeenCalledWith({
1968
- type: 'info',
1969
- text: 'A potential loop was detected. This can happen due to repetitive tool calls or other model behavior. The request has been halted.',
1970
- });
1971
- // Verify that the request was NOT retried
1972
- expect(mockSendMessageStream).toHaveBeenCalledTimes(1);
1973
- });
1974
- it('should handle multiple loop detection events properly', async () => {
1975
- const { result } = renderTestHook();
1976
- // First loop detection - set up fresh mock for first call
1977
- mockSendMessageStream.mockReturnValueOnce((async function* () {
1978
- yield {
1979
- type: LlmEventType.LoopDetected,
1980
- };
1981
- })());
1982
- // First loop detection
1983
- await act(async () => {
1984
- await result.current.submitQuery('first query');
1985
- });
1986
- await waitFor(() => {
1987
- expect(result.current.loopDetectionConfirmationRequest).not.toBeNull();
1988
- });
1989
- // Simulate user selecting "keep" for first request
1990
- await act(async () => {
1991
- result.current.loopDetectionConfirmationRequest?.onComplete({
1992
- userSelection: 'keep',
1993
- });
1994
- });
1995
- expect(result.current.loopDetectionConfirmationRequest).toBeNull();
1996
- // Verify first message was added
1997
- expect(mockAddItem).toHaveBeenCalledWith({
1998
- type: 'info',
1999
- text: 'A potential loop was detected. This can happen due to repetitive tool calls or other model behavior. The request has been halted.',
2000
- });
2001
- // Second loop detection - set up fresh mock for second call
2002
- mockSendMessageStream.mockReturnValueOnce((async function* () {
2003
- yield {
2004
- type: LlmEventType.LoopDetected,
2005
- };
2006
- })());
2007
- // Mock for the retry request
2008
- mockSendMessageStream.mockReturnValueOnce((async function* () {
2009
- yield {
2010
- type: LlmEventType.TextDelta,
2011
- text: 'Retry successful',
2012
- };
2013
- yield {
2014
- type: LlmEventType.Finished,
2015
- finishReason: 'end_turn',
2016
- };
2017
- })());
2018
- // Second loop detection
2019
- await act(async () => {
2020
- await result.current.submitQuery('second query');
2021
- });
2022
- await waitFor(() => {
2023
- expect(result.current.loopDetectionConfirmationRequest).not.toBeNull();
2024
- });
2025
- // Simulate user selecting "disable" for second request
2026
- await act(async () => {
2027
- result.current.loopDetectionConfirmationRequest?.onComplete({
2028
- userSelection: 'disable',
2029
- });
2030
- });
2031
- expect(result.current.loopDetectionConfirmationRequest).toBeNull();
2032
- // Verify second message was added
2033
- expect(mockAddItem).toHaveBeenCalledWith({
2034
- type: 'info',
2035
- text: 'Loop detection has been disabled for this session. Retrying request...',
2036
- });
2037
- // Verify that the request was retried
2038
- await waitFor(() => {
2039
- expect(mockSendMessageStream).toHaveBeenCalledTimes(3); // 1st query, 2nd query, retry of 2nd query
2040
- expect(mockSendMessageStream).toHaveBeenNthCalledWith(3, 'second query', expect.any(AbortSignal), expect.any(String));
2041
- });
2042
- });
2043
- it('should process LoopDetected event after moving pending history to history', async () => {
2044
- mockSendMessageStream.mockReturnValue((async function* () {
2045
- yield {
2046
- type: LlmEventType.TextDelta,
2047
- text: 'Some response content',
2048
- };
2049
- yield {
2050
- type: LlmEventType.LoopDetected,
2051
- };
2052
- })());
2053
- const { result } = renderTestHook();
2054
- await act(async () => {
2055
- await result.current.submitQuery('test query');
2056
- });
2057
- // Verify that the content was added to history before the loop detection dialog
2058
- await waitFor(() => {
2059
- expect(mockAddItem).toHaveBeenCalledWith(expect.objectContaining({
2060
- type: 'gemini',
2061
- text: 'Some response content',
2062
- }), expect.any(Number));
2063
- });
2064
- // Then verify loop detection confirmation request was set
2065
- await waitFor(() => {
2066
- expect(result.current.loopDetectionConfirmationRequest).not.toBeNull();
2067
- });
2068
- });
2069
- });
2070
- describe('Agent Execution Events', () => {
2071
- it('should handle AgentExecutionStopped event with systemMessage', async () => {
2072
- mockSendMessageStream.mockReturnValue((async function* () {
2073
- yield {
2074
- type: LlmEventType.AgentStopped,
2075
- reason: 'hook-reason',
2076
- systemMessage: 'Custom stop message',
2077
- };
2078
- })());
2079
- const { result } = renderTestHook();
2080
- await act(async () => {
2081
- await result.current.submitQuery('test stop');
2082
- });
2083
- await waitFor(() => {
2084
- expect(mockAddItem).toHaveBeenCalledWith({
2085
- type: MessageType.INFO,
2086
- text: 'Agent execution stopped: Custom stop message',
2087
- }, expect.any(Number));
2088
- expect(result.current.streamingState).toBe(StreamingState.Idle);
2089
- });
2090
- });
2091
- it('should handle AgentExecutionStopped event by falling back to reason when systemMessage is missing', async () => {
2092
- mockSendMessageStream.mockReturnValue((async function* () {
2093
- yield {
2094
- type: LlmEventType.AgentStopped,
2095
- reason: 'Stopped by hook',
2096
- };
2097
- })());
2098
- const { result } = renderTestHook();
2099
- await act(async () => {
2100
- await result.current.submitQuery('test stop');
2101
- });
2102
- await waitFor(() => {
2103
- expect(mockAddItem).toHaveBeenCalledWith({
2104
- type: MessageType.INFO,
2105
- text: 'Agent execution stopped: Stopped by hook',
2106
- }, expect.any(Number));
2107
- expect(result.current.streamingState).toBe(StreamingState.Idle);
2108
- });
2109
- });
2110
- it('should handle AgentExecutionBlocked event with systemMessage', async () => {
2111
- mockSendMessageStream.mockReturnValue((async function* () {
2112
- yield {
2113
- type: LlmEventType.AgentBlocked,
2114
- reason: 'hook-reason',
2115
- systemMessage: 'Custom block message',
2116
- };
2117
- })());
2118
- const { result } = renderTestHook();
2119
- await act(async () => {
2120
- await result.current.submitQuery('test block');
2121
- });
2122
- await waitFor(() => {
2123
- expect(mockAddItem).toHaveBeenCalledWith({
2124
- type: MessageType.WARNING,
2125
- text: 'Agent execution blocked: Custom block message',
2126
- }, expect.any(Number));
2127
- });
2128
- });
2129
- it('should handle AgentExecutionBlocked event by falling back to reason when systemMessage is missing', async () => {
2130
- mockSendMessageStream.mockReturnValue((async function* () {
2131
- yield {
2132
- type: LlmEventType.AgentBlocked,
2133
- reason: 'Blocked by hook',
2134
- };
2135
- })());
2136
- const { result } = renderTestHook();
2137
- await act(async () => {
2138
- await result.current.submitQuery('test block');
2139
- });
2140
- await waitFor(() => {
2141
- expect(mockAddItem).toHaveBeenCalledWith({
2142
- type: MessageType.WARNING,
2143
- text: 'Agent execution blocked: Blocked by hook',
2144
- }, expect.any(Number));
2145
- });
2146
- });
2147
- });
2148
- });
2149
- //# sourceMappingURL=useGeminiStream.test.js.map