@didim365/agent-cli 0.1.1 → 0.1.2

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 (1034) hide show
  1. package/package.json +6 -3
  2. package/dist/src/commands/extensions/configure.test.d.ts +0 -1
  3. package/dist/src/commands/extensions/configure.test.js +0 -197
  4. package/dist/src/commands/extensions/configure.test.js.map +0 -1
  5. package/dist/src/commands/extensions/disable.test.d.ts +0 -6
  6. package/dist/src/commands/extensions/disable.test.js +0 -169
  7. package/dist/src/commands/extensions/disable.test.js.map +0 -1
  8. package/dist/src/commands/extensions/enable.test.d.ts +0 -6
  9. package/dist/src/commands/extensions/enable.test.js +0 -199
  10. package/dist/src/commands/extensions/enable.test.js.map +0 -1
  11. package/dist/src/commands/extensions/install.test.d.ts +0 -6
  12. package/dist/src/commands/extensions/install.test.js +0 -140
  13. package/dist/src/commands/extensions/install.test.js.map +0 -1
  14. package/dist/src/commands/extensions/link.test.d.ts +0 -6
  15. package/dist/src/commands/extensions/link.test.js +0 -137
  16. package/dist/src/commands/extensions/link.test.js.map +0 -1
  17. package/dist/src/commands/extensions/list.test.d.ts +0 -6
  18. package/dist/src/commands/extensions/list.test.js +0 -148
  19. package/dist/src/commands/extensions/list.test.js.map +0 -1
  20. package/dist/src/commands/extensions/new.test.d.ts +0 -6
  21. package/dist/src/commands/extensions/new.test.js +0 -62
  22. package/dist/src/commands/extensions/new.test.js.map +0 -1
  23. package/dist/src/commands/extensions/uninstall.test.d.ts +0 -6
  24. package/dist/src/commands/extensions/uninstall.test.js +0 -199
  25. package/dist/src/commands/extensions/uninstall.test.js.map +0 -1
  26. package/dist/src/commands/extensions/update.test.d.ts +0 -6
  27. package/dist/src/commands/extensions/update.test.js +0 -170
  28. package/dist/src/commands/extensions/update.test.js.map +0 -1
  29. package/dist/src/commands/extensions/validate.test.d.ts +0 -6
  30. package/dist/src/commands/extensions/validate.test.js +0 -96
  31. package/dist/src/commands/extensions/validate.test.js.map +0 -1
  32. package/dist/src/commands/extensions.test.d.ts +0 -6
  33. package/dist/src/commands/extensions.test.js +0 -67
  34. package/dist/src/commands/extensions.test.js.map +0 -1
  35. package/dist/src/commands/hooks/migrate.test.d.ts +0 -6
  36. package/dist/src/commands/hooks/migrate.test.js +0 -388
  37. package/dist/src/commands/hooks/migrate.test.js.map +0 -1
  38. package/dist/src/commands/mcp/add.test.d.ts +0 -6
  39. package/dist/src/commands/mcp/add.test.js +0 -274
  40. package/dist/src/commands/mcp/add.test.js.map +0 -1
  41. package/dist/src/commands/mcp/list.test.d.ts +0 -6
  42. package/dist/src/commands/mcp/list.test.js +0 -150
  43. package/dist/src/commands/mcp/list.test.js.map +0 -1
  44. package/dist/src/commands/mcp/remove.test.d.ts +0 -6
  45. package/dist/src/commands/mcp/remove.test.js +0 -189
  46. package/dist/src/commands/mcp/remove.test.js.map +0 -1
  47. package/dist/src/commands/mcp.test.d.ts +0 -6
  48. package/dist/src/commands/mcp.test.js +0 -65
  49. package/dist/src/commands/mcp.test.js.map +0 -1
  50. package/dist/src/commands/skills/disable.test.d.ts +0 -6
  51. package/dist/src/commands/skills/disable.test.js +0 -96
  52. package/dist/src/commands/skills/disable.test.js.map +0 -1
  53. package/dist/src/commands/skills/enable.test.d.ts +0 -6
  54. package/dist/src/commands/skills/enable.test.js +0 -107
  55. package/dist/src/commands/skills/enable.test.js.map +0 -1
  56. package/dist/src/commands/skills/install.test.d.ts +0 -6
  57. package/dist/src/commands/skills/install.test.js +0 -95
  58. package/dist/src/commands/skills/install.test.js.map +0 -1
  59. package/dist/src/commands/skills/list.test.d.ts +0 -6
  60. package/dist/src/commands/skills/list.test.js +0 -136
  61. package/dist/src/commands/skills/list.test.js.map +0 -1
  62. package/dist/src/commands/skills/uninstall.test.d.ts +0 -6
  63. package/dist/src/commands/skills/uninstall.test.js +0 -61
  64. package/dist/src/commands/skills/uninstall.test.js.map +0 -1
  65. package/dist/src/commands/skills.test.d.ts +0 -6
  66. package/dist/src/commands/skills.test.js +0 -49
  67. package/dist/src/commands/skills.test.js.map +0 -1
  68. package/dist/src/commands/utils.test.d.ts +0 -6
  69. package/dist/src/commands/utils.test.js +0 -35
  70. package/dist/src/commands/utils.test.js.map +0 -1
  71. package/dist/src/config/auth.test.d.ts +0 -6
  72. package/dist/src/config/auth.test.js +0 -89
  73. package/dist/src/config/auth.test.js.map +0 -1
  74. package/dist/src/config/config.integration.test.d.ts +0 -6
  75. package/dist/src/config/config.integration.test.js +0 -205
  76. package/dist/src/config/config.integration.test.js.map +0 -1
  77. package/dist/src/config/config.test.d.ts +0 -6
  78. package/dist/src/config/config.test.js +0 -2413
  79. package/dist/src/config/config.test.js.map +0 -1
  80. package/dist/src/config/extension-manager-agents.test.d.ts +0 -6
  81. package/dist/src/config/extension-manager-agents.test.js +0 -114
  82. package/dist/src/config/extension-manager-agents.test.js.map +0 -1
  83. package/dist/src/config/extension-manager-scope.test.d.ts +0 -6
  84. package/dist/src/config/extension-manager-scope.test.js +0 -153
  85. package/dist/src/config/extension-manager-scope.test.js.map +0 -1
  86. package/dist/src/config/extension-manager-skills.test.d.ts +0 -6
  87. package/dist/src/config/extension-manager-skills.test.js +0 -148
  88. package/dist/src/config/extension-manager-skills.test.js.map +0 -1
  89. package/dist/src/config/extension.test.d.ts +0 -6
  90. package/dist/src/config/extension.test.js +0 -1671
  91. package/dist/src/config/extension.test.js.map +0 -1
  92. package/dist/src/config/extensions/consent.test.d.ts +0 -6
  93. package/dist/src/config/extensions/consent.test.js +0 -280
  94. package/dist/src/config/extensions/consent.test.js.map +0 -1
  95. package/dist/src/config/extensions/extensionEnablement.test.d.ts +0 -6
  96. package/dist/src/config/extensions/extensionEnablement.test.js +0 -404
  97. package/dist/src/config/extensions/extensionEnablement.test.js.map +0 -1
  98. package/dist/src/config/extensions/extensionSettings.test.d.ts +0 -6
  99. package/dist/src/config/extensions/extensionSettings.test.js +0 -493
  100. package/dist/src/config/extensions/extensionSettings.test.js.map +0 -1
  101. package/dist/src/config/extensions/extensionUpdates.test.d.ts +0 -6
  102. package/dist/src/config/extensions/extensionUpdates.test.js +0 -230
  103. package/dist/src/config/extensions/extensionUpdates.test.js.map +0 -1
  104. package/dist/src/config/extensions/github.test.d.ts +0 -6
  105. package/dist/src/config/extensions/github.test.js +0 -441
  106. package/dist/src/config/extensions/github.test.js.map +0 -1
  107. package/dist/src/config/extensions/github_fetch.test.d.ts +0 -6
  108. package/dist/src/config/extensions/github_fetch.test.js +0 -169
  109. package/dist/src/config/extensions/github_fetch.test.js.map +0 -1
  110. package/dist/src/config/extensions/storage.test.d.ts +0 -6
  111. package/dist/src/config/extensions/storage.test.js +0 -64
  112. package/dist/src/config/extensions/storage.test.js.map +0 -1
  113. package/dist/src/config/extensions/update.test.d.ts +0 -6
  114. package/dist/src/config/extensions/update.test.js +0 -231
  115. package/dist/src/config/extensions/update.test.js.map +0 -1
  116. package/dist/src/config/extensions/variables.test.d.ts +0 -6
  117. package/dist/src/config/extensions/variables.test.js +0 -103
  118. package/dist/src/config/extensions/variables.test.js.map +0 -1
  119. package/dist/src/config/keyBindings.test.d.ts +0 -6
  120. package/dist/src/config/keyBindings.test.js +0 -108
  121. package/dist/src/config/keyBindings.test.js.map +0 -1
  122. package/dist/src/config/mcp/mcpServerEnablement.test.d.ts +0 -6
  123. package/dist/src/config/mcp/mcpServerEnablement.test.js +0 -147
  124. package/dist/src/config/mcp/mcpServerEnablement.test.js.map +0 -1
  125. package/dist/src/config/policy-engine.integration.test.d.ts +0 -6
  126. package/dist/src/config/policy-engine.integration.test.js +0 -353
  127. package/dist/src/config/policy-engine.integration.test.js.map +0 -1
  128. package/dist/src/config/sandboxConfig.test.d.ts +0 -6
  129. package/dist/src/config/sandboxConfig.test.js +0 -184
  130. package/dist/src/config/sandboxConfig.test.js.map +0 -1
  131. package/dist/src/config/settingPaths.test.d.ts +0 -6
  132. package/dist/src/config/settingPaths.test.js +0 -22
  133. package/dist/src/config/settingPaths.test.js.map +0 -1
  134. package/dist/src/config/settings-validation.test.d.ts +0 -6
  135. package/dist/src/config/settings-validation.test.js +0 -370
  136. package/dist/src/config/settings-validation.test.js.map +0 -1
  137. package/dist/src/config/settings.test.d.ts +0 -6
  138. package/dist/src/config/settings.test.js +0 -1822
  139. package/dist/src/config/settings.test.js.map +0 -1
  140. package/dist/src/config/settingsSchema.test.d.ts +0 -6
  141. package/dist/src/config/settingsSchema.test.js +0 -309
  142. package/dist/src/config/settingsSchema.test.js.map +0 -1
  143. package/dist/src/config/settings_repro.test.d.ts +0 -6
  144. package/dist/src/config/settings_repro.test.js +0 -166
  145. package/dist/src/config/settings_repro.test.js.map +0 -1
  146. package/dist/src/config/settings_validation_warning.test.d.ts +0 -6
  147. package/dist/src/config/settings_validation_warning.test.js +0 -123
  148. package/dist/src/config/settings_validation_warning.test.js.map +0 -1
  149. package/dist/src/config/skills-backward-compatibility.test.d.ts +0 -6
  150. package/dist/src/config/skills-backward-compatibility.test.js +0 -99
  151. package/dist/src/config/skills-backward-compatibility.test.js.map +0 -1
  152. package/dist/src/config/trustedFolders.test.d.ts +0 -6
  153. package/dist/src/config/trustedFolders.test.js +0 -385
  154. package/dist/src/config/trustedFolders.test.js.map +0 -1
  155. package/dist/src/core/auth.test.d.ts +0 -6
  156. package/dist/src/core/auth.test.js +0 -47
  157. package/dist/src/core/auth.test.js.map +0 -1
  158. package/dist/src/core/initializer.test.d.ts +0 -6
  159. package/dist/src/core/initializer.test.js +0 -101
  160. package/dist/src/core/initializer.test.js.map +0 -1
  161. package/dist/src/core/theme.test.d.ts +0 -6
  162. package/dist/src/core/theme.test.js +0 -46
  163. package/dist/src/core/theme.test.js.map +0 -1
  164. package/dist/src/deferred.test.d.ts +0 -6
  165. package/dist/src/deferred.test.js +0 -164
  166. package/dist/src/deferred.test.js.map +0 -1
  167. package/dist/src/gemini.test.d.ts +0 -6
  168. package/dist/src/gemini.test.js +0 -1334
  169. package/dist/src/gemini.test.js.map +0 -1
  170. package/dist/src/gemini_cleanup.test.d.ts +0 -6
  171. package/dist/src/gemini_cleanup.test.js +0 -208
  172. package/dist/src/gemini_cleanup.test.js.map +0 -1
  173. package/dist/src/nonInteractiveCli.test.d.ts +0 -6
  174. package/dist/src/nonInteractiveCli.test.js +0 -1687
  175. package/dist/src/nonInteractiveCli.test.js.map +0 -1
  176. package/dist/src/services/BuiltinCommandLoader.test.d.ts +0 -6
  177. package/dist/src/services/BuiltinCommandLoader.test.js +0 -254
  178. package/dist/src/services/BuiltinCommandLoader.test.js.map +0 -1
  179. package/dist/src/services/CommandService.test.d.ts +0 -6
  180. package/dist/src/services/CommandService.test.js +0 -234
  181. package/dist/src/services/CommandService.test.js.map +0 -1
  182. package/dist/src/services/FileCommandLoader.test.d.ts +0 -6
  183. package/dist/src/services/FileCommandLoader.test.js +0 -1102
  184. package/dist/src/services/FileCommandLoader.test.js.map +0 -1
  185. package/dist/src/services/McpPromptLoader.test.d.ts +0 -6
  186. package/dist/src/services/McpPromptLoader.test.js +0 -411
  187. package/dist/src/services/McpPromptLoader.test.js.map +0 -1
  188. package/dist/src/services/prompt-processors/argumentProcessor.test.d.ts +0 -6
  189. package/dist/src/services/prompt-processors/argumentProcessor.test.js +0 -40
  190. package/dist/src/services/prompt-processors/argumentProcessor.test.js.map +0 -1
  191. package/dist/src/services/prompt-processors/atFileProcessor.test.d.ts +0 -6
  192. package/dist/src/services/prompt-processors/atFileProcessor.test.js +0 -174
  193. package/dist/src/services/prompt-processors/atFileProcessor.test.js.map +0 -1
  194. package/dist/src/services/prompt-processors/injectionParser.test.d.ts +0 -6
  195. package/dist/src/services/prompt-processors/injectionParser.test.js +0 -189
  196. package/dist/src/services/prompt-processors/injectionParser.test.js.map +0 -1
  197. package/dist/src/services/prompt-processors/shellProcessor.test.d.ts +0 -6
  198. package/dist/src/services/prompt-processors/shellProcessor.test.js +0 -514
  199. package/dist/src/services/prompt-processors/shellProcessor.test.js.map +0 -1
  200. package/dist/src/test-utils/mockCommandContext.test.d.ts +0 -6
  201. package/dist/src/test-utils/mockCommandContext.test.js +0 -51
  202. package/dist/src/test-utils/mockCommandContext.test.js.map +0 -1
  203. package/dist/src/test-utils/render.test.d.ts +0 -6
  204. package/dist/src/test-utils/render.test.js +0 -79
  205. package/dist/src/test-utils/render.test.js.map +0 -1
  206. package/dist/src/ui/App.test.d.ts +0 -6
  207. package/dist/src/ui/App.test.js +0 -218
  208. package/dist/src/ui/App.test.js.map +0 -1
  209. package/dist/src/ui/AppContainer.test.d.ts +0 -6
  210. package/dist/src/ui/AppContainer.test.js +0 -2072
  211. package/dist/src/ui/AppContainer.test.js.map +0 -1
  212. package/dist/src/ui/IdeIntegrationNudge.test.d.ts +0 -6
  213. package/dist/src/ui/IdeIntegrationNudge.test.js +0 -158
  214. package/dist/src/ui/IdeIntegrationNudge.test.js.map +0 -1
  215. package/dist/src/ui/auth/ApiAuthDialog.test.d.ts +0 -6
  216. package/dist/src/ui/auth/ApiAuthDialog.test.js +0 -109
  217. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +0 -1
  218. package/dist/src/ui/auth/AuthDialog.test.d.ts +0 -6
  219. package/dist/src/ui/auth/AuthDialog.test.js +0 -309
  220. package/dist/src/ui/auth/AuthDialog.test.js.map +0 -1
  221. package/dist/src/ui/auth/AuthInProgress.test.d.ts +0 -6
  222. package/dist/src/ui/auth/AuthInProgress.test.js +0 -81
  223. package/dist/src/ui/auth/AuthInProgress.test.js.map +0 -1
  224. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.d.ts +0 -6
  225. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js +0 -66
  226. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js.map +0 -1
  227. package/dist/src/ui/auth/useAuth.test.d.ts +0 -6
  228. package/dist/src/ui/auth/useAuth.test.js +0 -189
  229. package/dist/src/ui/auth/useAuth.test.js.map +0 -1
  230. package/dist/src/ui/commands/aboutCommand.test.d.ts +0 -6
  231. package/dist/src/ui/commands/aboutCommand.test.js +0 -143
  232. package/dist/src/ui/commands/aboutCommand.test.js.map +0 -1
  233. package/dist/src/ui/commands/agentsCommand.test.d.ts +0 -6
  234. package/dist/src/ui/commands/agentsCommand.test.js +0 -344
  235. package/dist/src/ui/commands/agentsCommand.test.js.map +0 -1
  236. package/dist/src/ui/commands/authCommand.test.d.ts +0 -6
  237. package/dist/src/ui/commands/authCommand.test.js +0 -98
  238. package/dist/src/ui/commands/authCommand.test.js.map +0 -1
  239. package/dist/src/ui/commands/bugCommand.test.d.ts +0 -6
  240. package/dist/src/ui/commands/bugCommand.test.js +0 -186
  241. package/dist/src/ui/commands/bugCommand.test.js.map +0 -1
  242. package/dist/src/ui/commands/chatCommand.test.d.ts +0 -6
  243. package/dist/src/ui/commands/chatCommand.test.js +0 -620
  244. package/dist/src/ui/commands/chatCommand.test.js.map +0 -1
  245. package/dist/src/ui/commands/clearCommand.test.d.ts +0 -6
  246. package/dist/src/ui/commands/clearCommand.test.js +0 -87
  247. package/dist/src/ui/commands/clearCommand.test.js.map +0 -1
  248. package/dist/src/ui/commands/compressCommand.test.d.ts +0 -6
  249. package/dist/src/ui/commands/compressCommand.test.js +0 -98
  250. package/dist/src/ui/commands/compressCommand.test.js.map +0 -1
  251. package/dist/src/ui/commands/copyCommand.test.d.ts +0 -6
  252. package/dist/src/ui/commands/copyCommand.test.js +0 -242
  253. package/dist/src/ui/commands/copyCommand.test.js.map +0 -1
  254. package/dist/src/ui/commands/corgiCommand.test.d.ts +0 -6
  255. package/dist/src/ui/commands/corgiCommand.test.js +0 -28
  256. package/dist/src/ui/commands/corgiCommand.test.js.map +0 -1
  257. package/dist/src/ui/commands/directoryCommand.test.d.ts +0 -6
  258. package/dist/src/ui/commands/directoryCommand.test.js +0 -353
  259. package/dist/src/ui/commands/directoryCommand.test.js.map +0 -1
  260. package/dist/src/ui/commands/docsCommand.test.d.ts +0 -6
  261. package/dist/src/ui/commands/docsCommand.test.js +0 -72
  262. package/dist/src/ui/commands/docsCommand.test.js.map +0 -1
  263. package/dist/src/ui/commands/editorCommand.test.d.ts +0 -6
  264. package/dist/src/ui/commands/editorCommand.test.js +0 -27
  265. package/dist/src/ui/commands/editorCommand.test.js.map +0 -1
  266. package/dist/src/ui/commands/extensionsCommand.test.d.ts +0 -6
  267. package/dist/src/ui/commands/extensionsCommand.test.js +0 -778
  268. package/dist/src/ui/commands/extensionsCommand.test.js.map +0 -1
  269. package/dist/src/ui/commands/helpCommand.test.d.ts +0 -6
  270. package/dist/src/ui/commands/helpCommand.test.js +0 -42
  271. package/dist/src/ui/commands/helpCommand.test.js.map +0 -1
  272. package/dist/src/ui/commands/hooksCommand.test.d.ts +0 -6
  273. package/dist/src/ui/commands/hooksCommand.test.js +0 -572
  274. package/dist/src/ui/commands/hooksCommand.test.js.map +0 -1
  275. package/dist/src/ui/commands/ideCommand.test.d.ts +0 -6
  276. package/dist/src/ui/commands/ideCommand.test.js +0 -203
  277. package/dist/src/ui/commands/ideCommand.test.js.map +0 -1
  278. package/dist/src/ui/commands/initCommand.test.d.ts +0 -6
  279. package/dist/src/ui/commands/initCommand.test.js +0 -84
  280. package/dist/src/ui/commands/initCommand.test.js.map +0 -1
  281. package/dist/src/ui/commands/mcpCommand.test.d.ts +0 -6
  282. package/dist/src/ui/commands/mcpCommand.test.js +0 -189
  283. package/dist/src/ui/commands/mcpCommand.test.js.map +0 -1
  284. package/dist/src/ui/commands/memoryCommand.test.d.ts +0 -6
  285. package/dist/src/ui/commands/memoryCommand.test.js +0 -350
  286. package/dist/src/ui/commands/memoryCommand.test.js.map +0 -1
  287. package/dist/src/ui/commands/modelCommand.test.d.ts +0 -6
  288. package/dist/src/ui/commands/modelCommand.test.js +0 -41
  289. package/dist/src/ui/commands/modelCommand.test.js.map +0 -1
  290. package/dist/src/ui/commands/permissionsCommand.test.d.ts +0 -6
  291. package/dist/src/ui/commands/permissionsCommand.test.js +0 -86
  292. package/dist/src/ui/commands/permissionsCommand.test.js.map +0 -1
  293. package/dist/src/ui/commands/policiesCommand.test.d.ts +0 -6
  294. package/dist/src/ui/commands/policiesCommand.test.js +0 -87
  295. package/dist/src/ui/commands/policiesCommand.test.js.map +0 -1
  296. package/dist/src/ui/commands/privacyCommand.test.d.ts +0 -6
  297. package/dist/src/ui/commands/privacyCommand.test.js +0 -32
  298. package/dist/src/ui/commands/privacyCommand.test.js.map +0 -1
  299. package/dist/src/ui/commands/quitCommand.test.d.ts +0 -6
  300. package/dist/src/ui/commands/quitCommand.test.js +0 -50
  301. package/dist/src/ui/commands/quitCommand.test.js.map +0 -1
  302. package/dist/src/ui/commands/restoreCommand.test.d.ts +0 -6
  303. package/dist/src/ui/commands/restoreCommand.test.js +0 -190
  304. package/dist/src/ui/commands/restoreCommand.test.js.map +0 -1
  305. package/dist/src/ui/commands/rewindCommand.test.d.ts +0 -6
  306. package/dist/src/ui/commands/rewindCommand.test.js +0 -242
  307. package/dist/src/ui/commands/rewindCommand.test.js.map +0 -1
  308. package/dist/src/ui/commands/settingsCommand.test.d.ts +0 -6
  309. package/dist/src/ui/commands/settingsCommand.test.js +0 -30
  310. package/dist/src/ui/commands/settingsCommand.test.js.map +0 -1
  311. package/dist/src/ui/commands/setupGithubCommand.test.d.ts +0 -6
  312. package/dist/src/ui/commands/setupGithubCommand.test.js +0 -238
  313. package/dist/src/ui/commands/setupGithubCommand.test.js.map +0 -1
  314. package/dist/src/ui/commands/skillsCommand.test.d.ts +0 -6
  315. package/dist/src/ui/commands/skillsCommand.test.js +0 -426
  316. package/dist/src/ui/commands/skillsCommand.test.js.map +0 -1
  317. package/dist/src/ui/commands/statsCommand.test.d.ts +0 -6
  318. package/dist/src/ui/commands/statsCommand.test.js +0 -70
  319. package/dist/src/ui/commands/statsCommand.test.js.map +0 -1
  320. package/dist/src/ui/commands/terminalSetupCommand.test.d.ts +0 -6
  321. package/dist/src/ui/commands/terminalSetupCommand.test.js +0 -66
  322. package/dist/src/ui/commands/terminalSetupCommand.test.js.map +0 -1
  323. package/dist/src/ui/commands/themeCommand.test.d.ts +0 -6
  324. package/dist/src/ui/commands/themeCommand.test.js +0 -32
  325. package/dist/src/ui/commands/themeCommand.test.js.map +0 -1
  326. package/dist/src/ui/commands/toolsCommand.test.d.ts +0 -6
  327. package/dist/src/ui/commands/toolsCommand.test.js +0 -100
  328. package/dist/src/ui/commands/toolsCommand.test.js.map +0 -1
  329. package/dist/src/ui/components/AboutBox.test.d.ts +0 -6
  330. package/dist/src/ui/components/AboutBox.test.js +0 -59
  331. package/dist/src/ui/components/AboutBox.test.js.map +0 -1
  332. package/dist/src/ui/components/AdminSettingsChangedDialog.test.d.ts +0 -6
  333. package/dist/src/ui/components/AdminSettingsChangedDialog.test.js +0 -43
  334. package/dist/src/ui/components/AdminSettingsChangedDialog.test.js.map +0 -1
  335. package/dist/src/ui/components/AgentConfigDialog.test.d.ts +0 -6
  336. package/dist/src/ui/components/AgentConfigDialog.test.js +0 -241
  337. package/dist/src/ui/components/AgentConfigDialog.test.js.map +0 -1
  338. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.d.ts +0 -6
  339. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +0 -190
  340. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +0 -1
  341. package/dist/src/ui/components/AnsiOutput.test.d.ts +0 -6
  342. package/dist/src/ui/components/AnsiOutput.test.js +0 -92
  343. package/dist/src/ui/components/AnsiOutput.test.js.map +0 -1
  344. package/dist/src/ui/components/AppHeader.test.d.ts +0 -6
  345. package/dist/src/ui/components/AppHeader.test.js +0 -225
  346. package/dist/src/ui/components/AppHeader.test.js.map +0 -1
  347. package/dist/src/ui/components/ApprovalModeIndicator.test.d.ts +0 -6
  348. package/dist/src/ui/components/ApprovalModeIndicator.test.js +0 -37
  349. package/dist/src/ui/components/ApprovalModeIndicator.test.js.map +0 -1
  350. package/dist/src/ui/components/AskUserDialog.test.d.ts +0 -6
  351. package/dist/src/ui/components/AskUserDialog.test.js +0 -598
  352. package/dist/src/ui/components/AskUserDialog.test.js.map +0 -1
  353. package/dist/src/ui/components/Banner.test.d.ts +0 -6
  354. package/dist/src/ui/components/Banner.test.js +0 -24
  355. package/dist/src/ui/components/Banner.test.js.map +0 -1
  356. package/dist/src/ui/components/CliSpinner.test.d.ts +0 -6
  357. package/dist/src/ui/components/CliSpinner.test.js +0 -28
  358. package/dist/src/ui/components/CliSpinner.test.js.map +0 -1
  359. package/dist/src/ui/components/Composer.test.d.ts +0 -6
  360. package/dist/src/ui/components/Composer.test.js +0 -383
  361. package/dist/src/ui/components/Composer.test.js.map +0 -1
  362. package/dist/src/ui/components/ConfigInitDisplay.test.d.ts +0 -6
  363. package/dist/src/ui/components/ConfigInitDisplay.test.js +0 -117
  364. package/dist/src/ui/components/ConfigInitDisplay.test.js.map +0 -1
  365. package/dist/src/ui/components/ConsentPrompt.test.d.ts +0 -6
  366. package/dist/src/ui/components/ConsentPrompt.test.js +0 -77
  367. package/dist/src/ui/components/ConsentPrompt.test.js.map +0 -1
  368. package/dist/src/ui/components/ConsoleSummaryDisplay.test.d.ts +0 -6
  369. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js +0 -26
  370. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js.map +0 -1
  371. package/dist/src/ui/components/ContextSummaryDisplay.test.d.ts +0 -6
  372. package/dist/src/ui/components/ContextSummaryDisplay.test.js +0 -102
  373. package/dist/src/ui/components/ContextSummaryDisplay.test.js.map +0 -1
  374. package/dist/src/ui/components/ContextUsageDisplay.test.d.ts +0 -6
  375. package/dist/src/ui/components/ContextUsageDisplay.test.js +0 -43
  376. package/dist/src/ui/components/ContextUsageDisplay.test.js.map +0 -1
  377. package/dist/src/ui/components/CopyModeWarning.test.d.ts +0 -6
  378. package/dist/src/ui/components/CopyModeWarning.test.js +0 -33
  379. package/dist/src/ui/components/CopyModeWarning.test.js.map +0 -1
  380. package/dist/src/ui/components/DebugProfiler.test.d.ts +0 -6
  381. package/dist/src/ui/components/DebugProfiler.test.js +0 -229
  382. package/dist/src/ui/components/DebugProfiler.test.js.map +0 -1
  383. package/dist/src/ui/components/DetailedMessagesDisplay.test.d.ts +0 -6
  384. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +0 -39
  385. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +0 -1
  386. package/dist/src/ui/components/DialogManager.test.d.ts +0 -6
  387. package/dist/src/ui/components/DialogManager.test.js +0 -177
  388. package/dist/src/ui/components/DialogManager.test.js.map +0 -1
  389. package/dist/src/ui/components/EditorSettingsDialog.test.d.ts +0 -6
  390. package/dist/src/ui/components/EditorSettingsDialog.test.js +0 -119
  391. package/dist/src/ui/components/EditorSettingsDialog.test.js.map +0 -1
  392. package/dist/src/ui/components/ExitWarning.test.d.ts +0 -6
  393. package/dist/src/ui/components/ExitWarning.test.js +0 -54
  394. package/dist/src/ui/components/ExitWarning.test.js.map +0 -1
  395. package/dist/src/ui/components/FolderTrustDialog.test.d.ts +0 -6
  396. package/dist/src/ui/components/FolderTrustDialog.test.js +0 -102
  397. package/dist/src/ui/components/FolderTrustDialog.test.js.map +0 -1
  398. package/dist/src/ui/components/Footer.test.d.ts +0 -6
  399. package/dist/src/ui/components/Footer.test.js +0 -321
  400. package/dist/src/ui/components/Footer.test.js.map +0 -1
  401. package/dist/src/ui/components/GeminiRespondingSpinner.test.d.ts +0 -6
  402. package/dist/src/ui/components/GeminiRespondingSpinner.test.js +0 -61
  403. package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +0 -1
  404. package/dist/src/ui/components/GradientRegression.test.d.ts +0 -6
  405. package/dist/src/ui/components/GradientRegression.test.js +0 -105
  406. package/dist/src/ui/components/GradientRegression.test.js.map +0 -1
  407. package/dist/src/ui/components/Header.test.d.ts +0 -6
  408. package/dist/src/ui/components/Header.test.js +0 -147
  409. package/dist/src/ui/components/Header.test.js.map +0 -1
  410. package/dist/src/ui/components/Help.test.d.ts +0 -6
  411. package/dist/src/ui/components/Help.test.js +0 -67
  412. package/dist/src/ui/components/Help.test.js.map +0 -1
  413. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +0 -6
  414. package/dist/src/ui/components/HistoryItemDisplay.test.js +0 -207
  415. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +0 -1
  416. package/dist/src/ui/components/HookStatusDisplay.test.d.ts +0 -6
  417. package/dist/src/ui/components/HookStatusDisplay.test.js +0 -51
  418. package/dist/src/ui/components/HookStatusDisplay.test.js.map +0 -1
  419. package/dist/src/ui/components/IdeTrustChangeDialog.test.d.ts +0 -6
  420. package/dist/src/ui/components/IdeTrustChangeDialog.test.js +0 -58
  421. package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +0 -1
  422. package/dist/src/ui/components/InputPrompt.test.d.ts +0 -6
  423. package/dist/src/ui/components/InputPrompt.test.js +0 -2596
  424. package/dist/src/ui/components/InputPrompt.test.js.map +0 -1
  425. package/dist/src/ui/components/LoadingIndicator.test.d.ts +0 -6
  426. package/dist/src/ui/components/LoadingIndicator.test.js +0 -207
  427. package/dist/src/ui/components/LoadingIndicator.test.js.map +0 -1
  428. package/dist/src/ui/components/LogoutConfirmationDialog.test.d.ts +0 -6
  429. package/dist/src/ui/components/LogoutConfirmationDialog.test.js +0 -59
  430. package/dist/src/ui/components/LogoutConfirmationDialog.test.js.map +0 -1
  431. package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +0 -6
  432. package/dist/src/ui/components/LoopDetectionConfirmation.test.js +0 -25
  433. package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +0 -1
  434. package/dist/src/ui/components/MainContent.test.d.ts +0 -6
  435. package/dist/src/ui/components/MainContent.test.js +0 -83
  436. package/dist/src/ui/components/MainContent.test.js.map +0 -1
  437. package/dist/src/ui/components/MemoryUsageDisplay.test.d.ts +0 -6
  438. package/dist/src/ui/components/MemoryUsageDisplay.test.js +0 -49
  439. package/dist/src/ui/components/MemoryUsageDisplay.test.js.map +0 -1
  440. package/dist/src/ui/components/ModelDialog.test.d.ts +0 -6
  441. package/dist/src/ui/components/ModelDialog.test.js +0 -197
  442. package/dist/src/ui/components/ModelDialog.test.js.map +0 -1
  443. package/dist/src/ui/components/ModelStatsDisplay.test.d.ts +0 -6
  444. package/dist/src/ui/components/ModelStatsDisplay.test.js +0 -343
  445. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +0 -1
  446. package/dist/src/ui/components/MultiFolderTrustDialog.test.d.ts +0 -6
  447. package/dist/src/ui/components/MultiFolderTrustDialog.test.js +0 -162
  448. package/dist/src/ui/components/MultiFolderTrustDialog.test.js.map +0 -1
  449. package/dist/src/ui/components/NewAgentsNotification.test.d.ts +0 -6
  450. package/dist/src/ui/components/NewAgentsNotification.test.js +0 -48
  451. package/dist/src/ui/components/NewAgentsNotification.test.js.map +0 -1
  452. package/dist/src/ui/components/Notifications.test.d.ts +0 -6
  453. package/dist/src/ui/components/Notifications.test.js +0 -164
  454. package/dist/src/ui/components/Notifications.test.js.map +0 -1
  455. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.d.ts +0 -6
  456. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +0 -162
  457. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +0 -1
  458. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +0 -6
  459. package/dist/src/ui/components/ProQuotaDialog.test.js +0 -191
  460. package/dist/src/ui/components/ProQuotaDialog.test.js.map +0 -1
  461. package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +0 -6
  462. package/dist/src/ui/components/QueuedMessageDisplay.test.js +0 -65
  463. package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +0 -1
  464. package/dist/src/ui/components/QuittingDisplay.test.d.ts +0 -6
  465. package/dist/src/ui/components/QuittingDisplay.test.js +0 -49
  466. package/dist/src/ui/components/QuittingDisplay.test.js.map +0 -1
  467. package/dist/src/ui/components/RawMarkdownIndicator.test.d.ts +0 -6
  468. package/dist/src/ui/components/RawMarkdownIndicator.test.js +0 -34
  469. package/dist/src/ui/components/RawMarkdownIndicator.test.js.map +0 -1
  470. package/dist/src/ui/components/RewindConfirmation.test.d.ts +0 -6
  471. package/dist/src/ui/components/RewindConfirmation.test.js +0 -53
  472. package/dist/src/ui/components/RewindConfirmation.test.js.map +0 -1
  473. package/dist/src/ui/components/RewindViewer.test.d.ts +0 -6
  474. package/dist/src/ui/components/RewindViewer.test.js +0 -241
  475. package/dist/src/ui/components/RewindViewer.test.js.map +0 -1
  476. package/dist/src/ui/components/SessionBrowser.test.d.ts +0 -6
  477. package/dist/src/ui/components/SessionBrowser.test.js +0 -256
  478. package/dist/src/ui/components/SessionBrowser.test.js.map +0 -1
  479. package/dist/src/ui/components/SessionSummaryDisplay.test.d.ts +0 -6
  480. package/dist/src/ui/components/SessionSummaryDisplay.test.js +0 -75
  481. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +0 -1
  482. package/dist/src/ui/components/SettingsDialog.test.d.ts +0 -6
  483. package/dist/src/ui/components/SettingsDialog.test.js +0 -1150
  484. package/dist/src/ui/components/SettingsDialog.test.js.map +0 -1
  485. package/dist/src/ui/components/ShellInputPrompt.test.d.ts +0 -6
  486. package/dist/src/ui/components/ShellInputPrompt.test.js +0 -91
  487. package/dist/src/ui/components/ShellInputPrompt.test.js.map +0 -1
  488. package/dist/src/ui/components/ShellModeIndicator.test.d.ts +0 -6
  489. package/dist/src/ui/components/ShellModeIndicator.test.js +0 -17
  490. package/dist/src/ui/components/ShellModeIndicator.test.js.map +0 -1
  491. package/dist/src/ui/components/ShowMoreLines.test.d.ts +0 -6
  492. package/dist/src/ui/components/ShowMoreLines.test.js +0 -40
  493. package/dist/src/ui/components/ShowMoreLines.test.js.map +0 -1
  494. package/dist/src/ui/components/StatsDisplay.test.d.ts +0 -6
  495. package/dist/src/ui/components/StatsDisplay.test.js +0 -438
  496. package/dist/src/ui/components/StatsDisplay.test.js.map +0 -1
  497. package/dist/src/ui/components/StatusDisplay.test.d.ts +0 -6
  498. package/dist/src/ui/components/StatusDisplay.test.js +0 -155
  499. package/dist/src/ui/components/StatusDisplay.test.js.map +0 -1
  500. package/dist/src/ui/components/StickyHeader.test.d.ts +0 -6
  501. package/dist/src/ui/components/StickyHeader.test.js +0 -17
  502. package/dist/src/ui/components/StickyHeader.test.js.map +0 -1
  503. package/dist/src/ui/components/SuggestionsDisplay.test.d.ts +0 -6
  504. package/dist/src/ui/components/SuggestionsDisplay.test.js +0 -56
  505. package/dist/src/ui/components/SuggestionsDisplay.test.js.map +0 -1
  506. package/dist/src/ui/components/Table.test.d.ts +0 -6
  507. package/dist/src/ui/components/Table.test.js +0 -53
  508. package/dist/src/ui/components/Table.test.js.map +0 -1
  509. package/dist/src/ui/components/ThemeDialog.test.d.ts +0 -6
  510. package/dist/src/ui/components/ThemeDialog.test.js +0 -167
  511. package/dist/src/ui/components/ThemeDialog.test.js.map +0 -1
  512. package/dist/src/ui/components/ThemedGradient.test.d.ts +0 -6
  513. package/dist/src/ui/components/ThemedGradient.test.js +0 -30
  514. package/dist/src/ui/components/ThemedGradient.test.js.map +0 -1
  515. package/dist/src/ui/components/Tips.test.d.ts +0 -6
  516. package/dist/src/ui/components/Tips.test.js +0 -23
  517. package/dist/src/ui/components/Tips.test.js.map +0 -1
  518. package/dist/src/ui/components/ToolConfirmationQueue.test.d.ts +0 -6
  519. package/dist/src/ui/components/ToolConfirmationQueue.test.js +0 -71
  520. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +0 -1
  521. package/dist/src/ui/components/ToolStatsDisplay.test.d.ts +0 -6
  522. package/dist/src/ui/components/ToolStatsDisplay.test.js +0 -227
  523. package/dist/src/ui/components/ToolStatsDisplay.test.js.map +0 -1
  524. package/dist/src/ui/components/UpdateNotification.test.d.ts +0 -6
  525. package/dist/src/ui/components/UpdateNotification.test.js +0 -16
  526. package/dist/src/ui/components/UpdateNotification.test.js.map +0 -1
  527. package/dist/src/ui/components/ValidationDialog.test.d.ts +0 -6
  528. package/dist/src/ui/components/ValidationDialog.test.js +0 -153
  529. package/dist/src/ui/components/ValidationDialog.test.js.map +0 -1
  530. package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +0 -6
  531. package/dist/src/ui/components/messages/CompressionMessage.test.js +0 -191
  532. package/dist/src/ui/components/messages/CompressionMessage.test.js.map +0 -1
  533. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +0 -6
  534. package/dist/src/ui/components/messages/DiffRenderer.test.js +0 -240
  535. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +0 -1
  536. package/dist/src/ui/components/messages/ErrorMessage.test.d.ts +0 -6
  537. package/dist/src/ui/components/messages/ErrorMessage.test.js +0 -23
  538. package/dist/src/ui/components/messages/ErrorMessage.test.js.map +0 -1
  539. package/dist/src/ui/components/messages/GeminiMessage.test.d.ts +0 -6
  540. package/dist/src/ui/components/messages/GeminiMessage.test.js +0 -35
  541. package/dist/src/ui/components/messages/GeminiMessage.test.js.map +0 -1
  542. package/dist/src/ui/components/messages/InfoMessage.test.d.ts +0 -6
  543. package/dist/src/ui/components/messages/InfoMessage.test.js +0 -28
  544. package/dist/src/ui/components/messages/InfoMessage.test.js.map +0 -1
  545. package/dist/src/ui/components/messages/RedirectionConfirmation.test.d.ts +0 -6
  546. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +0 -33
  547. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +0 -1
  548. package/dist/src/ui/components/messages/ShellToolMessage.test.d.ts +0 -6
  549. package/dist/src/ui/components/messages/ShellToolMessage.test.js +0 -123
  550. package/dist/src/ui/components/messages/ShellToolMessage.test.js.map +0 -1
  551. package/dist/src/ui/components/messages/Todo.test.d.ts +0 -6
  552. package/dist/src/ui/components/messages/Todo.test.js +0 -114
  553. package/dist/src/ui/components/messages/Todo.test.js.map +0 -1
  554. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +0 -6
  555. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -232
  556. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +0 -1
  557. package/dist/src/ui/components/messages/ToolGroupMessage.test.d.ts +0 -6
  558. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +0 -529
  559. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +0 -1
  560. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +0 -6
  561. package/dist/src/ui/components/messages/ToolMessage.test.js +0 -217
  562. package/dist/src/ui/components/messages/ToolMessage.test.js.map +0 -1
  563. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.d.ts +0 -6
  564. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js +0 -89
  565. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js.map +0 -1
  566. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.d.ts +0 -6
  567. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js +0 -62
  568. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js.map +0 -1
  569. package/dist/src/ui/components/messages/ToolResultDisplay.test.d.ts +0 -6
  570. package/dist/src/ui/components/messages/ToolResultDisplay.test.js +0 -114
  571. package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +0 -1
  572. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.d.ts +0 -6
  573. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js +0 -134
  574. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js.map +0 -1
  575. package/dist/src/ui/components/messages/UserMessage.test.d.ts +0 -6
  576. package/dist/src/ui/components/messages/UserMessage.test.js +0 -32
  577. package/dist/src/ui/components/messages/UserMessage.test.js.map +0 -1
  578. package/dist/src/ui/components/messages/WarningMessage.test.d.ts +0 -6
  579. package/dist/src/ui/components/messages/WarningMessage.test.js +0 -23
  580. package/dist/src/ui/components/messages/WarningMessage.test.js.map +0 -1
  581. package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +0 -6
  582. package/dist/src/ui/components/shared/BaseSelectionList.test.js +0 -386
  583. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +0 -1
  584. package/dist/src/ui/components/shared/BaseSettingsDialog.test.d.ts +0 -6
  585. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js +0 -434
  586. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js.map +0 -1
  587. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +0 -6
  588. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +0 -79
  589. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +0 -1
  590. package/dist/src/ui/components/shared/EnumSelector.test.d.ts +0 -6
  591. package/dist/src/ui/components/shared/EnumSelector.test.js +0 -70
  592. package/dist/src/ui/components/shared/EnumSelector.test.js.map +0 -1
  593. package/dist/src/ui/components/shared/ExpandableText.test.d.ts +0 -6
  594. package/dist/src/ui/components/shared/ExpandableText.test.js +0 -88
  595. package/dist/src/ui/components/shared/ExpandableText.test.js.map +0 -1
  596. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.d.ts +0 -6
  597. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js +0 -34
  598. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js.map +0 -1
  599. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +0 -6
  600. package/dist/src/ui/components/shared/MaxSizedBox.test.js +0 -90
  601. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +0 -1
  602. package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +0 -6
  603. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +0 -134
  604. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +0 -1
  605. package/dist/src/ui/components/shared/Scrollable.test.d.ts +0 -6
  606. package/dist/src/ui/components/shared/Scrollable.test.js +0 -74
  607. package/dist/src/ui/components/shared/Scrollable.test.js.map +0 -1
  608. package/dist/src/ui/components/shared/ScrollableList.test.d.ts +0 -6
  609. package/dist/src/ui/components/shared/ScrollableList.test.js +0 -241
  610. package/dist/src/ui/components/shared/ScrollableList.test.js.map +0 -1
  611. package/dist/src/ui/components/shared/TabHeader.test.d.ts +0 -6
  612. package/dist/src/ui/components/shared/TabHeader.test.js +0 -106
  613. package/dist/src/ui/components/shared/TabHeader.test.js.map +0 -1
  614. package/dist/src/ui/components/shared/TextInput.test.d.ts +0 -6
  615. package/dist/src/ui/components/shared/TextInput.test.js +0 -242
  616. package/dist/src/ui/components/shared/TextInput.test.js.map +0 -1
  617. package/dist/src/ui/components/shared/VirtualizedList.test.d.ts +0 -6
  618. package/dist/src/ui/components/shared/VirtualizedList.test.js +0 -171
  619. package/dist/src/ui/components/shared/VirtualizedList.test.js.map +0 -1
  620. package/dist/src/ui/components/shared/performance.test.d.ts +0 -1
  621. package/dist/src/ui/components/shared/performance.test.js +0 -67
  622. package/dist/src/ui/components/shared/performance.test.js.map +0 -1
  623. package/dist/src/ui/components/shared/text-buffer.test.d.ts +0 -6
  624. package/dist/src/ui/components/shared/text-buffer.test.js +0 -2490
  625. package/dist/src/ui/components/shared/text-buffer.test.js.map +0 -1
  626. package/dist/src/ui/components/shared/vim-buffer-actions.test.d.ts +0 -6
  627. package/dist/src/ui/components/shared/vim-buffer-actions.test.js +0 -964
  628. package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +0 -1
  629. package/dist/src/ui/components/views/ChatList.test.d.ts +0 -6
  630. package/dist/src/ui/components/views/ChatList.test.js +0 -45
  631. package/dist/src/ui/components/views/ChatList.test.js.map +0 -1
  632. package/dist/src/ui/components/views/ExtensionsList.test.d.ts +0 -6
  633. package/dist/src/ui/components/views/ExtensionsList.test.js +0 -148
  634. package/dist/src/ui/components/views/ExtensionsList.test.js.map +0 -1
  635. package/dist/src/ui/components/views/McpStatus.test.d.ts +0 -6
  636. package/dist/src/ui/components/views/McpStatus.test.js +0 -153
  637. package/dist/src/ui/components/views/McpStatus.test.js.map +0 -1
  638. package/dist/src/ui/components/views/SkillsList.test.d.ts +0 -6
  639. package/dist/src/ui/components/views/SkillsList.test.js +0 -97
  640. package/dist/src/ui/components/views/SkillsList.test.js.map +0 -1
  641. package/dist/src/ui/components/views/ToolsList.test.d.ts +0 -6
  642. package/dist/src/ui/components/views/ToolsList.test.js +0 -45
  643. package/dist/src/ui/components/views/ToolsList.test.js.map +0 -1
  644. package/dist/src/ui/contexts/KeypressContext.test.d.ts +0 -6
  645. package/dist/src/ui/contexts/KeypressContext.test.js +0 -957
  646. package/dist/src/ui/contexts/KeypressContext.test.js.map +0 -1
  647. package/dist/src/ui/contexts/MouseContext.test.d.ts +0 -6
  648. package/dist/src/ui/contexts/MouseContext.test.js +0 -198
  649. package/dist/src/ui/contexts/MouseContext.test.js.map +0 -1
  650. package/dist/src/ui/contexts/ScrollProvider.drag.test.d.ts +0 -6
  651. package/dist/src/ui/contexts/ScrollProvider.drag.test.js +0 -319
  652. package/dist/src/ui/contexts/ScrollProvider.drag.test.js.map +0 -1
  653. package/dist/src/ui/contexts/ScrollProvider.test.d.ts +0 -6
  654. package/dist/src/ui/contexts/ScrollProvider.test.js +0 -377
  655. package/dist/src/ui/contexts/ScrollProvider.test.js.map +0 -1
  656. package/dist/src/ui/contexts/SessionContext.test.d.ts +0 -6
  657. package/dist/src/ui/contexts/SessionContext.test.js +0 -198
  658. package/dist/src/ui/contexts/SessionContext.test.js.map +0 -1
  659. package/dist/src/ui/contexts/ToolActionsContext.test.d.ts +0 -6
  660. package/dist/src/ui/contexts/ToolActionsContext.test.js +0 -166
  661. package/dist/src/ui/contexts/ToolActionsContext.test.js.map +0 -1
  662. package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +0 -6
  663. package/dist/src/ui/hooks/atCommandProcessor.test.js +0 -1032
  664. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +0 -1
  665. package/dist/src/ui/hooks/atCommandProcessor_agents.test.d.ts +0 -6
  666. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js +0 -183
  667. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js.map +0 -1
  668. package/dist/src/ui/hooks/shellCommandProcessor.test.d.ts +0 -6
  669. package/dist/src/ui/hooks/shellCommandProcessor.test.js +0 -521
  670. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +0 -1
  671. package/dist/src/ui/hooks/slashCommandProcessor.test.d.ts +0 -6
  672. package/dist/src/ui/hooks/slashCommandProcessor.test.js +0 -796
  673. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +0 -1
  674. package/dist/src/ui/hooks/toolMapping.test.d.ts +0 -6
  675. package/dist/src/ui/hooks/toolMapping.test.js +0 -209
  676. package/dist/src/ui/hooks/toolMapping.test.js.map +0 -1
  677. package/dist/src/ui/hooks/useAnimatedScrollbar.test.d.ts +0 -6
  678. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js +0 -85
  679. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js.map +0 -1
  680. package/dist/src/ui/hooks/useApprovalModeIndicator.test.d.ts +0 -6
  681. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js +0 -435
  682. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js.map +0 -1
  683. package/dist/src/ui/hooks/useAtCompletion.test.d.ts +0 -6
  684. package/dist/src/ui/hooks/useAtCompletion.test.js +0 -417
  685. package/dist/src/ui/hooks/useAtCompletion.test.js.map +0 -1
  686. package/dist/src/ui/hooks/useAtCompletion_agents.test.d.ts +0 -6
  687. package/dist/src/ui/hooks/useAtCompletion_agents.test.js +0 -87
  688. package/dist/src/ui/hooks/useAtCompletion_agents.test.js.map +0 -1
  689. package/dist/src/ui/hooks/useBanner.test.d.ts +0 -6
  690. package/dist/src/ui/hooks/useBanner.test.js +0 -92
  691. package/dist/src/ui/hooks/useBanner.test.js.map +0 -1
  692. package/dist/src/ui/hooks/useBatchedScroll.test.d.ts +0 -6
  693. package/dist/src/ui/hooks/useBatchedScroll.test.js +0 -62
  694. package/dist/src/ui/hooks/useBatchedScroll.test.js.map +0 -1
  695. package/dist/src/ui/hooks/useCommandCompletion.test.d.ts +0 -6
  696. package/dist/src/ui/hooks/useCommandCompletion.test.js +0 -462
  697. package/dist/src/ui/hooks/useCommandCompletion.test.js.map +0 -1
  698. package/dist/src/ui/hooks/useConsoleMessages.test.d.ts +0 -6
  699. package/dist/src/ui/hooks/useConsoleMessages.test.js +0 -159
  700. package/dist/src/ui/hooks/useConsoleMessages.test.js.map +0 -1
  701. package/dist/src/ui/hooks/useEditorSettings.test.d.ts +0 -6
  702. package/dist/src/ui/hooks/useEditorSettings.test.js +0 -179
  703. package/dist/src/ui/hooks/useEditorSettings.test.js.map +0 -1
  704. package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +0 -6
  705. package/dist/src/ui/hooks/useExtensionUpdates.test.js +0 -279
  706. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +0 -1
  707. package/dist/src/ui/hooks/useFlickerDetector.test.d.ts +0 -6
  708. package/dist/src/ui/hooks/useFlickerDetector.test.js +0 -106
  709. package/dist/src/ui/hooks/useFlickerDetector.test.js.map +0 -1
  710. package/dist/src/ui/hooks/useFocus.test.d.ts +0 -6
  711. package/dist/src/ui/hooks/useFocus.test.js +0 -131
  712. package/dist/src/ui/hooks/useFocus.test.js.map +0 -1
  713. package/dist/src/ui/hooks/useFolderTrust.test.d.ts +0 -6
  714. package/dist/src/ui/hooks/useFolderTrust.test.js +0 -218
  715. package/dist/src/ui/hooks/useFolderTrust.test.js.map +0 -1
  716. package/dist/src/ui/hooks/useGeminiStream.test.d.ts +0 -6
  717. package/dist/src/ui/hooks/useGeminiStream.test.js +0 -2149
  718. package/dist/src/ui/hooks/useGeminiStream.test.js.map +0 -1
  719. package/dist/src/ui/hooks/useGitBranchName.test.d.ts +0 -6
  720. package/dist/src/ui/hooks/useGitBranchName.test.js +0 -183
  721. package/dist/src/ui/hooks/useGitBranchName.test.js.map +0 -1
  722. package/dist/src/ui/hooks/useHistoryManager.test.d.ts +0 -6
  723. package/dist/src/ui/hooks/useHistoryManager.test.js +0 -188
  724. package/dist/src/ui/hooks/useHistoryManager.test.js.map +0 -1
  725. package/dist/src/ui/hooks/useHookDisplayState.test.d.ts +0 -6
  726. package/dist/src/ui/hooks/useHookDisplayState.test.js +0 -180
  727. package/dist/src/ui/hooks/useHookDisplayState.test.js.map +0 -1
  728. package/dist/src/ui/hooks/useIdeTrustListener.test.d.ts +0 -6
  729. package/dist/src/ui/hooks/useIdeTrustListener.test.js +0 -214
  730. package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +0 -1
  731. package/dist/src/ui/hooks/useIncludeDirsTrust.test.d.ts +0 -6
  732. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js +0 -172
  733. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +0 -1
  734. package/dist/src/ui/hooks/useInputHistory.test.d.ts +0 -6
  735. package/dist/src/ui/hooks/useInputHistory.test.js +0 -208
  736. package/dist/src/ui/hooks/useInputHistory.test.js.map +0 -1
  737. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +0 -6
  738. package/dist/src/ui/hooks/useInputHistoryStore.test.js +0 -238
  739. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +0 -1
  740. package/dist/src/ui/hooks/useKeypress.test.d.ts +0 -6
  741. package/dist/src/ui/hooks/useKeypress.test.js +0 -205
  742. package/dist/src/ui/hooks/useKeypress.test.js.map +0 -1
  743. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +0 -6
  744. package/dist/src/ui/hooks/useLoadingIndicator.test.js +0 -145
  745. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +0 -1
  746. package/dist/src/ui/hooks/useMcpStatus.test.d.ts +0 -6
  747. package/dist/src/ui/hooks/useMcpStatus.test.js +0 -69
  748. package/dist/src/ui/hooks/useMcpStatus.test.js.map +0 -1
  749. package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +0 -6
  750. package/dist/src/ui/hooks/useMemoryMonitor.test.js +0 -62
  751. package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +0 -1
  752. package/dist/src/ui/hooks/useMessageQueue.test.d.ts +0 -6
  753. package/dist/src/ui/hooks/useMessageQueue.test.js +0 -327
  754. package/dist/src/ui/hooks/useMessageQueue.test.js.map +0 -1
  755. package/dist/src/ui/hooks/useModelCommand.test.d.ts +0 -6
  756. package/dist/src/ui/hooks/useModelCommand.test.js +0 -45
  757. package/dist/src/ui/hooks/useModelCommand.test.js.map +0 -1
  758. package/dist/src/ui/hooks/useMouse.test.d.ts +0 -6
  759. package/dist/src/ui/hooks/useMouse.test.js +0 -57
  760. package/dist/src/ui/hooks/useMouse.test.js.map +0 -1
  761. package/dist/src/ui/hooks/useMouseClick.test.d.ts +0 -6
  762. package/dist/src/ui/hooks/useMouseClick.test.js +0 -59
  763. package/dist/src/ui/hooks/useMouseClick.test.js.map +0 -1
  764. package/dist/src/ui/hooks/useMouseDoubleClick.test.d.ts +0 -6
  765. package/dist/src/ui/hooks/useMouseDoubleClick.test.js +0 -125
  766. package/dist/src/ui/hooks/useMouseDoubleClick.test.js.map +0 -1
  767. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.d.ts +0 -6
  768. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +0 -291
  769. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +0 -1
  770. package/dist/src/ui/hooks/usePhraseCycler.test.d.ts +0 -6
  771. package/dist/src/ui/hooks/usePhraseCycler.test.js +0 -208
  772. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +0 -1
  773. package/dist/src/ui/hooks/usePrivacySettings.test.d.ts +0 -6
  774. package/dist/src/ui/hooks/usePrivacySettings.test.js +0 -104
  775. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +0 -1
  776. package/dist/src/ui/hooks/useQuotaAndFallback.test.d.ts +0 -6
  777. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +0 -477
  778. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +0 -1
  779. package/dist/src/ui/hooks/useReactToolScheduler.test.d.ts +0 -6
  780. package/dist/src/ui/hooks/useReactToolScheduler.test.js +0 -58
  781. package/dist/src/ui/hooks/useReactToolScheduler.test.js.map +0 -1
  782. package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +0 -6
  783. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +0 -169
  784. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +0 -1
  785. package/dist/src/ui/hooks/useRewind.test.d.ts +0 -6
  786. package/dist/src/ui/hooks/useRewind.test.js +0 -100
  787. package/dist/src/ui/hooks/useRewind.test.js.map +0 -1
  788. package/dist/src/ui/hooks/useSelectionList.test.d.ts +0 -6
  789. package/dist/src/ui/hooks/useSelectionList.test.js +0 -848
  790. package/dist/src/ui/hooks/useSelectionList.test.js.map +0 -1
  791. package/dist/src/ui/hooks/useSessionBrowser.test.d.ts +0 -6
  792. package/dist/src/ui/hooks/useSessionBrowser.test.js +0 -203
  793. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +0 -1
  794. package/dist/src/ui/hooks/useSessionResume.test.d.ts +0 -6
  795. package/dist/src/ui/hooks/useSessionResume.test.js +0 -336
  796. package/dist/src/ui/hooks/useSessionResume.test.js.map +0 -1
  797. package/dist/src/ui/hooks/useShellHistory.test.d.ts +0 -6
  798. package/dist/src/ui/hooks/useShellHistory.test.js +0 -223
  799. package/dist/src/ui/hooks/useShellHistory.test.js.map +0 -1
  800. package/dist/src/ui/hooks/useShellInactivityStatus.test.d.ts +0 -6
  801. package/dist/src/ui/hooks/useShellInactivityStatus.test.js +0 -84
  802. package/dist/src/ui/hooks/useShellInactivityStatus.test.js.map +0 -1
  803. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +0 -9
  804. package/dist/src/ui/hooks/useSlashCompletion.test.js +0 -845
  805. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +0 -1
  806. package/dist/src/ui/hooks/useSnowfall.test.d.ts +0 -6
  807. package/dist/src/ui/hooks/useSnowfall.test.js +0 -88
  808. package/dist/src/ui/hooks/useSnowfall.test.js.map +0 -1
  809. package/dist/src/ui/hooks/useTabbedNavigation.test.d.ts +0 -6
  810. package/dist/src/ui/hooks/useTabbedNavigation.test.js +0 -187
  811. package/dist/src/ui/hooks/useTabbedNavigation.test.js.map +0 -1
  812. package/dist/src/ui/hooks/useTimer.test.d.ts +0 -6
  813. package/dist/src/ui/hooks/useTimer.test.js +0 -119
  814. package/dist/src/ui/hooks/useTimer.test.js.map +0 -1
  815. package/dist/src/ui/hooks/useTips.test.d.ts +0 -6
  816. package/dist/src/ui/hooks/useTips.test.js +0 -33
  817. package/dist/src/ui/hooks/useTips.test.js.map +0 -1
  818. package/dist/src/ui/hooks/useToolExecutionScheduler.test.d.ts +0 -6
  819. package/dist/src/ui/hooks/useToolExecutionScheduler.test.js +0 -376
  820. package/dist/src/ui/hooks/useToolExecutionScheduler.test.js.map +0 -1
  821. package/dist/src/ui/hooks/useToolScheduler.test.d.ts +0 -6
  822. package/dist/src/ui/hooks/useToolScheduler.test.js +0 -881
  823. package/dist/src/ui/hooks/useToolScheduler.test.js.map +0 -1
  824. package/dist/src/ui/hooks/useToolSchedulerFacade.test.d.ts +0 -6
  825. package/dist/src/ui/hooks/useToolSchedulerFacade.test.js +0 -45
  826. package/dist/src/ui/hooks/useToolSchedulerFacade.test.js.map +0 -1
  827. package/dist/src/ui/hooks/useTurnActivityMonitor.test.d.ts +0 -6
  828. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js +0 -97
  829. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js.map +0 -1
  830. package/dist/src/ui/hooks/vim.test.d.ts +0 -6
  831. package/dist/src/ui/hooks/vim.test.js +0 -1384
  832. package/dist/src/ui/hooks/vim.test.js.map +0 -1
  833. package/dist/src/ui/keyMatchers.test.d.ts +0 -6
  834. package/dist/src/ui/keyMatchers.test.js +0 -386
  835. package/dist/src/ui/keyMatchers.test.js.map +0 -1
  836. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.d.ts +0 -6
  837. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js +0 -121
  838. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js.map +0 -1
  839. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.d.ts +0 -6
  840. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js +0 -34
  841. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js.map +0 -1
  842. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.d.ts +0 -6
  843. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js +0 -34
  844. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js.map +0 -1
  845. package/dist/src/ui/privacy/PrivacyNotice.test.d.ts +0 -6
  846. package/dist/src/ui/privacy/PrivacyNotice.test.js +0 -62
  847. package/dist/src/ui/privacy/PrivacyNotice.test.js.map +0 -1
  848. package/dist/src/ui/state/extensions.test.d.ts +0 -6
  849. package/dist/src/ui/state/extensions.test.js +0 -219
  850. package/dist/src/ui/state/extensions.test.js.map +0 -1
  851. package/dist/src/ui/themes/color-utils.test.d.ts +0 -6
  852. package/dist/src/ui/themes/color-utils.test.js +0 -245
  853. package/dist/src/ui/themes/color-utils.test.js.map +0 -1
  854. package/dist/src/ui/themes/theme-manager.test.d.ts +0 -6
  855. package/dist/src/ui/themes/theme-manager.test.js +0 -150
  856. package/dist/src/ui/themes/theme-manager.test.js.map +0 -1
  857. package/dist/src/ui/themes/theme.test.d.ts +0 -6
  858. package/dist/src/ui/themes/theme.test.js +0 -174
  859. package/dist/src/ui/themes/theme.test.js.map +0 -1
  860. package/dist/src/ui/utils/CodeColorizer.test.d.ts +0 -6
  861. package/dist/src/ui/utils/CodeColorizer.test.js +0 -38
  862. package/dist/src/ui/utils/CodeColorizer.test.js.map +0 -1
  863. package/dist/src/ui/utils/InlineMarkdownRenderer.test.d.ts +0 -6
  864. package/dist/src/ui/utils/InlineMarkdownRenderer.test.js +0 -21
  865. package/dist/src/ui/utils/InlineMarkdownRenderer.test.js.map +0 -1
  866. package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +0 -6
  867. package/dist/src/ui/utils/MarkdownDisplay.test.js +0 -159
  868. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +0 -1
  869. package/dist/src/ui/utils/clipboardUtils.test.d.ts +0 -6
  870. package/dist/src/ui/utils/clipboardUtils.test.js +0 -359
  871. package/dist/src/ui/utils/clipboardUtils.test.js.map +0 -1
  872. package/dist/src/ui/utils/clipboardUtils.windows.test.d.ts +0 -6
  873. package/dist/src/ui/utils/clipboardUtils.windows.test.js +0 -55
  874. package/dist/src/ui/utils/clipboardUtils.windows.test.js.map +0 -1
  875. package/dist/src/ui/utils/commandUtils.test.d.ts +0 -6
  876. package/dist/src/ui/utils/commandUtils.test.js +0 -479
  877. package/dist/src/ui/utils/commandUtils.test.js.map +0 -1
  878. package/dist/src/ui/utils/computeStats.test.d.ts +0 -6
  879. package/dist/src/ui/utils/computeStats.test.js +0 -271
  880. package/dist/src/ui/utils/computeStats.test.js.map +0 -1
  881. package/dist/src/ui/utils/directoryUtils.test.d.ts +0 -6
  882. package/dist/src/ui/utils/directoryUtils.test.js +0 -244
  883. package/dist/src/ui/utils/directoryUtils.test.js.map +0 -1
  884. package/dist/src/ui/utils/displayUtils.test.d.ts +0 -6
  885. package/dist/src/ui/utils/displayUtils.test.js +0 -61
  886. package/dist/src/ui/utils/displayUtils.test.js.map +0 -1
  887. package/dist/src/ui/utils/formatters.test.d.ts +0 -6
  888. package/dist/src/ui/utils/formatters.test.js +0 -124
  889. package/dist/src/ui/utils/formatters.test.js.map +0 -1
  890. package/dist/src/ui/utils/highlight.test.d.ts +0 -6
  891. package/dist/src/ui/utils/highlight.test.js +0 -198
  892. package/dist/src/ui/utils/highlight.test.js.map +0 -1
  893. package/dist/src/ui/utils/input.test.d.ts +0 -6
  894. package/dist/src/ui/utils/input.test.js +0 -44
  895. package/dist/src/ui/utils/input.test.js.map +0 -1
  896. package/dist/src/ui/utils/markdownUtilities.test.d.ts +0 -6
  897. package/dist/src/ui/utils/markdownUtilities.test.js +0 -42
  898. package/dist/src/ui/utils/markdownUtilities.test.js.map +0 -1
  899. package/dist/src/ui/utils/mouse.test.d.ts +0 -6
  900. package/dist/src/ui/utils/mouse.test.js +0 -136
  901. package/dist/src/ui/utils/mouse.test.js.map +0 -1
  902. package/dist/src/ui/utils/rewindFileOps.test.d.ts +0 -6
  903. package/dist/src/ui/utils/rewindFileOps.test.js +0 -375
  904. package/dist/src/ui/utils/rewindFileOps.test.js.map +0 -1
  905. package/dist/src/ui/utils/terminalCapabilityManager.test.d.ts +0 -6
  906. package/dist/src/ui/utils/terminalCapabilityManager.test.js +0 -220
  907. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +0 -1
  908. package/dist/src/ui/utils/terminalSetup.test.d.ts +0 -6
  909. package/dist/src/ui/utils/terminalSetup.test.js +0 -147
  910. package/dist/src/ui/utils/terminalSetup.test.js.map +0 -1
  911. package/dist/src/ui/utils/terminalUtils.test.d.ts +0 -6
  912. package/dist/src/ui/utils/terminalUtils.test.js +0 -40
  913. package/dist/src/ui/utils/terminalUtils.test.js.map +0 -1
  914. package/dist/src/ui/utils/textOutput.test.d.ts +0 -6
  915. package/dist/src/ui/utils/textOutput.test.js +0 -79
  916. package/dist/src/ui/utils/textOutput.test.js.map +0 -1
  917. package/dist/src/ui/utils/textUtils.test.d.ts +0 -6
  918. package/dist/src/ui/utils/textUtils.test.js +0 -168
  919. package/dist/src/ui/utils/textUtils.test.js.map +0 -1
  920. package/dist/src/ui/utils/ui-sizing.test.d.ts +0 -6
  921. package/dist/src/ui/utils/ui-sizing.test.js +0 -38
  922. package/dist/src/ui/utils/ui-sizing.test.js.map +0 -1
  923. package/dist/src/ui/utils/updateCheck.test.d.ts +0 -6
  924. package/dist/src/ui/utils/updateCheck.test.js +0 -134
  925. package/dist/src/ui/utils/updateCheck.test.js.map +0 -1
  926. package/dist/src/utils/agentUtils.test.d.ts +0 -6
  927. package/dist/src/utils/agentUtils.test.js +0 -121
  928. package/dist/src/utils/agentUtils.test.js.map +0 -1
  929. package/dist/src/utils/checks.test.d.ts +0 -6
  930. package/dist/src/utils/checks.test.js +0 -29
  931. package/dist/src/utils/checks.test.js.map +0 -1
  932. package/dist/src/utils/cleanup.test.d.ts +0 -6
  933. package/dist/src/utils/cleanup.test.js +0 -92
  934. package/dist/src/utils/cleanup.test.js.map +0 -1
  935. package/dist/src/utils/commands.test.d.ts +0 -6
  936. package/dist/src/utils/commands.test.js +0 -115
  937. package/dist/src/utils/commands.test.js.map +0 -1
  938. package/dist/src/utils/commentJson.test.d.ts +0 -6
  939. package/dist/src/utils/commentJson.test.js +0 -308
  940. package/dist/src/utils/commentJson.test.js.map +0 -1
  941. package/dist/src/utils/deepMerge.test.d.ts +0 -6
  942. package/dist/src/utils/deepMerge.test.js +0 -201
  943. package/dist/src/utils/deepMerge.test.js.map +0 -1
  944. package/dist/src/utils/dialogScopeUtils.test.d.ts +0 -6
  945. package/dist/src/utils/dialogScopeUtils.test.js +0 -81
  946. package/dist/src/utils/dialogScopeUtils.test.js.map +0 -1
  947. package/dist/src/utils/envVarResolver.test.d.ts +0 -6
  948. package/dist/src/utils/envVarResolver.test.js +0 -221
  949. package/dist/src/utils/envVarResolver.test.js.map +0 -1
  950. package/dist/src/utils/errors.test.d.ts +0 -6
  951. package/dist/src/utils/errors.test.js +0 -435
  952. package/dist/src/utils/errors.test.js.map +0 -1
  953. package/dist/src/utils/events.test.d.ts +0 -6
  954. package/dist/src/utils/events.test.js +0 -24
  955. package/dist/src/utils/events.test.js.map +0 -1
  956. package/dist/src/utils/gitUtils.test.d.ts +0 -6
  957. package/dist/src/utils/gitUtils.test.js +0 -113
  958. package/dist/src/utils/gitUtils.test.js.map +0 -1
  959. package/dist/src/utils/handleAutoUpdate.test.d.ts +0 -6
  960. package/dist/src/utils/handleAutoUpdate.test.js +0 -310
  961. package/dist/src/utils/handleAutoUpdate.test.js.map +0 -1
  962. package/dist/src/utils/installationInfo.test.d.ts +0 -6
  963. package/dist/src/utils/installationInfo.test.js +0 -296
  964. package/dist/src/utils/installationInfo.test.js.map +0 -1
  965. package/dist/src/utils/jsonoutput.test.d.ts +0 -6
  966. package/dist/src/utils/jsonoutput.test.js +0 -74
  967. package/dist/src/utils/jsonoutput.test.js.map +0 -1
  968. package/dist/src/utils/math.test.d.ts +0 -6
  969. package/dist/src/utils/math.test.js +0 -23
  970. package/dist/src/utils/math.test.js.map +0 -1
  971. package/dist/src/utils/persistentState.test.d.ts +0 -6
  972. package/dist/src/utils/persistentState.test.js +0 -68
  973. package/dist/src/utils/persistentState.test.js.map +0 -1
  974. package/dist/src/utils/processUtils.test.d.ts +0 -6
  975. package/dist/src/utils/processUtils.test.js +0 -20
  976. package/dist/src/utils/processUtils.test.js.map +0 -1
  977. package/dist/src/utils/readStdin.test.d.ts +0 -6
  978. package/dist/src/utils/readStdin.test.js +0 -117
  979. package/dist/src/utils/readStdin.test.js.map +0 -1
  980. package/dist/src/utils/readStdin_safety.test.d.ts +0 -6
  981. package/dist/src/utils/readStdin_safety.test.js +0 -68
  982. package/dist/src/utils/readStdin_safety.test.js.map +0 -1
  983. package/dist/src/utils/relaunch.test.d.ts +0 -6
  984. package/dist/src/utils/relaunch.test.js +0 -279
  985. package/dist/src/utils/relaunch.test.js.map +0 -1
  986. package/dist/src/utils/resolvePath.test.d.ts +0 -6
  987. package/dist/src/utils/resolvePath.test.js +0 -34
  988. package/dist/src/utils/resolvePath.test.js.map +0 -1
  989. package/dist/src/utils/sandbox.test.d.ts +0 -6
  990. package/dist/src/utils/sandbox.test.js +0 -314
  991. package/dist/src/utils/sandbox.test.js.map +0 -1
  992. package/dist/src/utils/sandboxUtils.test.d.ts +0 -6
  993. package/dist/src/utils/sandboxUtils.test.js +0 -122
  994. package/dist/src/utils/sandboxUtils.test.js.map +0 -1
  995. package/dist/src/utils/sessionCleanup.integration.test.d.ts +0 -6
  996. package/dist/src/utils/sessionCleanup.integration.test.js +0 -182
  997. package/dist/src/utils/sessionCleanup.integration.test.js.map +0 -1
  998. package/dist/src/utils/sessionCleanup.test.d.ts +0 -6
  999. package/dist/src/utils/sessionCleanup.test.js +0 -1298
  1000. package/dist/src/utils/sessionCleanup.test.js.map +0 -1
  1001. package/dist/src/utils/sessionUtils.test.d.ts +0 -6
  1002. package/dist/src/utils/sessionUtils.test.js +0 -503
  1003. package/dist/src/utils/sessionUtils.test.js.map +0 -1
  1004. package/dist/src/utils/sessions.test.d.ts +0 -6
  1005. package/dist/src/utils/sessions.test.js +0 -581
  1006. package/dist/src/utils/sessions.test.js.map +0 -1
  1007. package/dist/src/utils/settingsUtils.test.d.ts +0 -6
  1008. package/dist/src/utils/settingsUtils.test.js +0 -808
  1009. package/dist/src/utils/settingsUtils.test.js.map +0 -1
  1010. package/dist/src/utils/skillUtils.test.d.ts +0 -6
  1011. package/dist/src/utils/skillUtils.test.js +0 -70
  1012. package/dist/src/utils/skillUtils.test.js.map +0 -1
  1013. package/dist/src/utils/startupWarnings.test.d.ts +0 -6
  1014. package/dist/src/utils/startupWarnings.test.js +0 -61
  1015. package/dist/src/utils/startupWarnings.test.js.map +0 -1
  1016. package/dist/src/utils/updateEventEmitter.test.d.ts +0 -6
  1017. package/dist/src/utils/updateEventEmitter.test.js +0 -18
  1018. package/dist/src/utils/updateEventEmitter.test.js.map +0 -1
  1019. package/dist/src/utils/userStartupWarnings.test.d.ts +0 -6
  1020. package/dist/src/utils/userStartupWarnings.test.js +0 -98
  1021. package/dist/src/utils/userStartupWarnings.test.js.map +0 -1
  1022. package/dist/src/utils/windowTitle.test.d.ts +0 -6
  1023. package/dist/src/utils/windowTitle.test.js +0 -216
  1024. package/dist/src/utils/windowTitle.test.js.map +0 -1
  1025. package/dist/src/validateNonInterActiveAuth.test.d.ts +0 -6
  1026. package/dist/src/validateNonInterActiveAuth.test.js +0 -319
  1027. package/dist/src/validateNonInterActiveAuth.test.js.map +0 -1
  1028. package/dist/src/zed-integration/fileSystemService.test.d.ts +0 -6
  1029. package/dist/src/zed-integration/fileSystemService.test.js +0 -88
  1030. package/dist/src/zed-integration/fileSystemService.test.js.map +0 -1
  1031. package/dist/src/zed-integration/zedIntegration.test.d.ts +0 -6
  1032. package/dist/src/zed-integration/zedIntegration.test.js +0 -625
  1033. package/dist/src/zed-integration/zedIntegration.test.js.map +0 -1
  1034. 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