@didim365/agent-cli 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1091) hide show
  1. package/dist/package.json +5 -2
  2. package/dist/src/config/settingsSchema.d.ts +85 -0
  3. package/dist/src/config/settingsSchema.js +85 -0
  4. package/dist/src/config/settingsSchema.js.map +1 -1
  5. package/dist/src/core/initializer.js +42 -3
  6. package/dist/src/core/initializer.js.map +1 -1
  7. package/dist/src/gemini.d.ts +6 -0
  8. package/dist/src/gemini.js +79 -5
  9. package/dist/src/gemini.js.map +1 -1
  10. package/dist/src/generated/git-commit.d.ts +1 -1
  11. package/dist/src/generated/git-commit.js +1 -1
  12. package/dist/src/test-utils/render.js +9 -0
  13. package/dist/src/test-utils/render.js.map +1 -1
  14. package/dist/src/ui/AppContainer.js +182 -9
  15. package/dist/src/ui/AppContainer.js.map +1 -1
  16. package/dist/src/ui/auth/ApiAuthDialog.d.ts +3 -1
  17. package/dist/src/ui/auth/ApiAuthDialog.js +7 -5
  18. package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -1
  19. package/dist/src/ui/auth/AuthDialog.d.ts +3 -1
  20. package/dist/src/ui/auth/AuthDialog.js +6 -6
  21. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  22. package/dist/src/ui/auth/ProviderSelectDialog.d.ts +15 -0
  23. package/dist/src/ui/auth/ProviderSelectDialog.js +39 -0
  24. package/dist/src/ui/auth/ProviderSelectDialog.js.map +1 -0
  25. package/dist/src/ui/auth/SlmConfigDialog.d.ts +21 -0
  26. package/dist/src/ui/auth/SlmConfigDialog.js +170 -0
  27. package/dist/src/ui/auth/SlmConfigDialog.js.map +1 -0
  28. package/dist/src/ui/auth/VertexConfigDialog.d.ts +18 -0
  29. package/dist/src/ui/auth/VertexConfigDialog.js +97 -0
  30. package/dist/src/ui/auth/VertexConfigDialog.js.map +1 -0
  31. package/dist/src/ui/auth/providerMetadata.d.ts +38 -0
  32. package/dist/src/ui/auth/providerMetadata.js +71 -0
  33. package/dist/src/ui/auth/providerMetadata.js.map +1 -0
  34. package/dist/src/ui/auth/useAuth.d.ts +3 -0
  35. package/dist/src/ui/auth/useAuth.js +243 -39
  36. package/dist/src/ui/auth/useAuth.js.map +1 -1
  37. package/dist/src/ui/commands/authCommand.js +18 -1
  38. package/dist/src/ui/commands/authCommand.js.map +1 -1
  39. package/dist/src/ui/commands/initCommand.js +1 -1
  40. package/dist/src/ui/commands/initCommand.js.map +1 -1
  41. package/dist/src/ui/commands/rewindCommand.js.map +1 -1
  42. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  43. package/dist/src/ui/components/DialogManager.js +27 -2
  44. package/dist/src/ui/components/DialogManager.js.map +1 -1
  45. package/dist/src/ui/components/InputPrompt.js +1 -1
  46. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  47. package/dist/src/ui/contexts/UIActionsContext.d.ts +14 -0
  48. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  49. package/dist/src/ui/contexts/UIStateContext.d.ts +4 -0
  50. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  51. package/dist/src/ui/hooks/useRewind.js.map +1 -1
  52. package/dist/src/ui/types.d.ts +4 -1
  53. package/dist/src/ui/types.js +6 -0
  54. package/dist/src/ui/types.js.map +1 -1
  55. package/dist/src/ui/utils/mouse.js +1 -1
  56. package/dist/src/ui/utils/mouse.js.map +1 -1
  57. package/dist/src/ui/utils/rewindFileOps.js.map +1 -1
  58. package/package.json +6 -3
  59. package/dist/src/commands/extensions/configure.test.d.ts +0 -1
  60. package/dist/src/commands/extensions/configure.test.js +0 -197
  61. package/dist/src/commands/extensions/configure.test.js.map +0 -1
  62. package/dist/src/commands/extensions/disable.test.d.ts +0 -6
  63. package/dist/src/commands/extensions/disable.test.js +0 -169
  64. package/dist/src/commands/extensions/disable.test.js.map +0 -1
  65. package/dist/src/commands/extensions/enable.test.d.ts +0 -6
  66. package/dist/src/commands/extensions/enable.test.js +0 -199
  67. package/dist/src/commands/extensions/enable.test.js.map +0 -1
  68. package/dist/src/commands/extensions/install.test.d.ts +0 -6
  69. package/dist/src/commands/extensions/install.test.js +0 -140
  70. package/dist/src/commands/extensions/install.test.js.map +0 -1
  71. package/dist/src/commands/extensions/link.test.d.ts +0 -6
  72. package/dist/src/commands/extensions/link.test.js +0 -137
  73. package/dist/src/commands/extensions/link.test.js.map +0 -1
  74. package/dist/src/commands/extensions/list.test.d.ts +0 -6
  75. package/dist/src/commands/extensions/list.test.js +0 -148
  76. package/dist/src/commands/extensions/list.test.js.map +0 -1
  77. package/dist/src/commands/extensions/new.test.d.ts +0 -6
  78. package/dist/src/commands/extensions/new.test.js +0 -62
  79. package/dist/src/commands/extensions/new.test.js.map +0 -1
  80. package/dist/src/commands/extensions/uninstall.test.d.ts +0 -6
  81. package/dist/src/commands/extensions/uninstall.test.js +0 -199
  82. package/dist/src/commands/extensions/uninstall.test.js.map +0 -1
  83. package/dist/src/commands/extensions/update.test.d.ts +0 -6
  84. package/dist/src/commands/extensions/update.test.js +0 -170
  85. package/dist/src/commands/extensions/update.test.js.map +0 -1
  86. package/dist/src/commands/extensions/validate.test.d.ts +0 -6
  87. package/dist/src/commands/extensions/validate.test.js +0 -96
  88. package/dist/src/commands/extensions/validate.test.js.map +0 -1
  89. package/dist/src/commands/extensions.test.d.ts +0 -6
  90. package/dist/src/commands/extensions.test.js +0 -67
  91. package/dist/src/commands/extensions.test.js.map +0 -1
  92. package/dist/src/commands/hooks/migrate.test.d.ts +0 -6
  93. package/dist/src/commands/hooks/migrate.test.js +0 -388
  94. package/dist/src/commands/hooks/migrate.test.js.map +0 -1
  95. package/dist/src/commands/mcp/add.test.d.ts +0 -6
  96. package/dist/src/commands/mcp/add.test.js +0 -274
  97. package/dist/src/commands/mcp/add.test.js.map +0 -1
  98. package/dist/src/commands/mcp/list.test.d.ts +0 -6
  99. package/dist/src/commands/mcp/list.test.js +0 -150
  100. package/dist/src/commands/mcp/list.test.js.map +0 -1
  101. package/dist/src/commands/mcp/remove.test.d.ts +0 -6
  102. package/dist/src/commands/mcp/remove.test.js +0 -189
  103. package/dist/src/commands/mcp/remove.test.js.map +0 -1
  104. package/dist/src/commands/mcp.test.d.ts +0 -6
  105. package/dist/src/commands/mcp.test.js +0 -65
  106. package/dist/src/commands/mcp.test.js.map +0 -1
  107. package/dist/src/commands/skills/disable.test.d.ts +0 -6
  108. package/dist/src/commands/skills/disable.test.js +0 -96
  109. package/dist/src/commands/skills/disable.test.js.map +0 -1
  110. package/dist/src/commands/skills/enable.test.d.ts +0 -6
  111. package/dist/src/commands/skills/enable.test.js +0 -107
  112. package/dist/src/commands/skills/enable.test.js.map +0 -1
  113. package/dist/src/commands/skills/install.test.d.ts +0 -6
  114. package/dist/src/commands/skills/install.test.js +0 -95
  115. package/dist/src/commands/skills/install.test.js.map +0 -1
  116. package/dist/src/commands/skills/list.test.d.ts +0 -6
  117. package/dist/src/commands/skills/list.test.js +0 -136
  118. package/dist/src/commands/skills/list.test.js.map +0 -1
  119. package/dist/src/commands/skills/uninstall.test.d.ts +0 -6
  120. package/dist/src/commands/skills/uninstall.test.js +0 -61
  121. package/dist/src/commands/skills/uninstall.test.js.map +0 -1
  122. package/dist/src/commands/skills.test.d.ts +0 -6
  123. package/dist/src/commands/skills.test.js +0 -49
  124. package/dist/src/commands/skills.test.js.map +0 -1
  125. package/dist/src/commands/utils.test.d.ts +0 -6
  126. package/dist/src/commands/utils.test.js +0 -35
  127. package/dist/src/commands/utils.test.js.map +0 -1
  128. package/dist/src/config/auth.test.d.ts +0 -6
  129. package/dist/src/config/auth.test.js +0 -89
  130. package/dist/src/config/auth.test.js.map +0 -1
  131. package/dist/src/config/config.integration.test.d.ts +0 -6
  132. package/dist/src/config/config.integration.test.js +0 -205
  133. package/dist/src/config/config.integration.test.js.map +0 -1
  134. package/dist/src/config/config.test.d.ts +0 -6
  135. package/dist/src/config/config.test.js +0 -2413
  136. package/dist/src/config/config.test.js.map +0 -1
  137. package/dist/src/config/extension-manager-agents.test.d.ts +0 -6
  138. package/dist/src/config/extension-manager-agents.test.js +0 -114
  139. package/dist/src/config/extension-manager-agents.test.js.map +0 -1
  140. package/dist/src/config/extension-manager-scope.test.d.ts +0 -6
  141. package/dist/src/config/extension-manager-scope.test.js +0 -153
  142. package/dist/src/config/extension-manager-scope.test.js.map +0 -1
  143. package/dist/src/config/extension-manager-skills.test.d.ts +0 -6
  144. package/dist/src/config/extension-manager-skills.test.js +0 -148
  145. package/dist/src/config/extension-manager-skills.test.js.map +0 -1
  146. package/dist/src/config/extension.test.d.ts +0 -6
  147. package/dist/src/config/extension.test.js +0 -1671
  148. package/dist/src/config/extension.test.js.map +0 -1
  149. package/dist/src/config/extensions/consent.test.d.ts +0 -6
  150. package/dist/src/config/extensions/consent.test.js +0 -280
  151. package/dist/src/config/extensions/consent.test.js.map +0 -1
  152. package/dist/src/config/extensions/extensionEnablement.test.d.ts +0 -6
  153. package/dist/src/config/extensions/extensionEnablement.test.js +0 -404
  154. package/dist/src/config/extensions/extensionEnablement.test.js.map +0 -1
  155. package/dist/src/config/extensions/extensionSettings.test.d.ts +0 -6
  156. package/dist/src/config/extensions/extensionSettings.test.js +0 -493
  157. package/dist/src/config/extensions/extensionSettings.test.js.map +0 -1
  158. package/dist/src/config/extensions/extensionUpdates.test.d.ts +0 -6
  159. package/dist/src/config/extensions/extensionUpdates.test.js +0 -230
  160. package/dist/src/config/extensions/extensionUpdates.test.js.map +0 -1
  161. package/dist/src/config/extensions/github.test.d.ts +0 -6
  162. package/dist/src/config/extensions/github.test.js +0 -441
  163. package/dist/src/config/extensions/github.test.js.map +0 -1
  164. package/dist/src/config/extensions/github_fetch.test.d.ts +0 -6
  165. package/dist/src/config/extensions/github_fetch.test.js +0 -169
  166. package/dist/src/config/extensions/github_fetch.test.js.map +0 -1
  167. package/dist/src/config/extensions/storage.test.d.ts +0 -6
  168. package/dist/src/config/extensions/storage.test.js +0 -64
  169. package/dist/src/config/extensions/storage.test.js.map +0 -1
  170. package/dist/src/config/extensions/update.test.d.ts +0 -6
  171. package/dist/src/config/extensions/update.test.js +0 -231
  172. package/dist/src/config/extensions/update.test.js.map +0 -1
  173. package/dist/src/config/extensions/variables.test.d.ts +0 -6
  174. package/dist/src/config/extensions/variables.test.js +0 -103
  175. package/dist/src/config/extensions/variables.test.js.map +0 -1
  176. package/dist/src/config/keyBindings.test.d.ts +0 -6
  177. package/dist/src/config/keyBindings.test.js +0 -108
  178. package/dist/src/config/keyBindings.test.js.map +0 -1
  179. package/dist/src/config/mcp/mcpServerEnablement.test.d.ts +0 -6
  180. package/dist/src/config/mcp/mcpServerEnablement.test.js +0 -147
  181. package/dist/src/config/mcp/mcpServerEnablement.test.js.map +0 -1
  182. package/dist/src/config/policy-engine.integration.test.d.ts +0 -6
  183. package/dist/src/config/policy-engine.integration.test.js +0 -353
  184. package/dist/src/config/policy-engine.integration.test.js.map +0 -1
  185. package/dist/src/config/sandboxConfig.test.d.ts +0 -6
  186. package/dist/src/config/sandboxConfig.test.js +0 -184
  187. package/dist/src/config/sandboxConfig.test.js.map +0 -1
  188. package/dist/src/config/settingPaths.test.d.ts +0 -6
  189. package/dist/src/config/settingPaths.test.js +0 -22
  190. package/dist/src/config/settingPaths.test.js.map +0 -1
  191. package/dist/src/config/settings-validation.test.d.ts +0 -6
  192. package/dist/src/config/settings-validation.test.js +0 -370
  193. package/dist/src/config/settings-validation.test.js.map +0 -1
  194. package/dist/src/config/settings.test.d.ts +0 -6
  195. package/dist/src/config/settings.test.js +0 -1822
  196. package/dist/src/config/settings.test.js.map +0 -1
  197. package/dist/src/config/settingsSchema.test.d.ts +0 -6
  198. package/dist/src/config/settingsSchema.test.js +0 -309
  199. package/dist/src/config/settingsSchema.test.js.map +0 -1
  200. package/dist/src/config/settings_repro.test.d.ts +0 -6
  201. package/dist/src/config/settings_repro.test.js +0 -166
  202. package/dist/src/config/settings_repro.test.js.map +0 -1
  203. package/dist/src/config/settings_validation_warning.test.d.ts +0 -6
  204. package/dist/src/config/settings_validation_warning.test.js +0 -123
  205. package/dist/src/config/settings_validation_warning.test.js.map +0 -1
  206. package/dist/src/config/skills-backward-compatibility.test.d.ts +0 -6
  207. package/dist/src/config/skills-backward-compatibility.test.js +0 -99
  208. package/dist/src/config/skills-backward-compatibility.test.js.map +0 -1
  209. package/dist/src/config/trustedFolders.test.d.ts +0 -6
  210. package/dist/src/config/trustedFolders.test.js +0 -385
  211. package/dist/src/config/trustedFolders.test.js.map +0 -1
  212. package/dist/src/core/auth.test.d.ts +0 -6
  213. package/dist/src/core/auth.test.js +0 -47
  214. package/dist/src/core/auth.test.js.map +0 -1
  215. package/dist/src/core/initializer.test.d.ts +0 -6
  216. package/dist/src/core/initializer.test.js +0 -101
  217. package/dist/src/core/initializer.test.js.map +0 -1
  218. package/dist/src/core/theme.test.d.ts +0 -6
  219. package/dist/src/core/theme.test.js +0 -46
  220. package/dist/src/core/theme.test.js.map +0 -1
  221. package/dist/src/deferred.test.d.ts +0 -6
  222. package/dist/src/deferred.test.js +0 -164
  223. package/dist/src/deferred.test.js.map +0 -1
  224. package/dist/src/gemini.test.d.ts +0 -6
  225. package/dist/src/gemini.test.js +0 -1334
  226. package/dist/src/gemini.test.js.map +0 -1
  227. package/dist/src/gemini_cleanup.test.d.ts +0 -6
  228. package/dist/src/gemini_cleanup.test.js +0 -208
  229. package/dist/src/gemini_cleanup.test.js.map +0 -1
  230. package/dist/src/nonInteractiveCli.test.d.ts +0 -6
  231. package/dist/src/nonInteractiveCli.test.js +0 -1687
  232. package/dist/src/nonInteractiveCli.test.js.map +0 -1
  233. package/dist/src/services/BuiltinCommandLoader.test.d.ts +0 -6
  234. package/dist/src/services/BuiltinCommandLoader.test.js +0 -254
  235. package/dist/src/services/BuiltinCommandLoader.test.js.map +0 -1
  236. package/dist/src/services/CommandService.test.d.ts +0 -6
  237. package/dist/src/services/CommandService.test.js +0 -234
  238. package/dist/src/services/CommandService.test.js.map +0 -1
  239. package/dist/src/services/FileCommandLoader.test.d.ts +0 -6
  240. package/dist/src/services/FileCommandLoader.test.js +0 -1102
  241. package/dist/src/services/FileCommandLoader.test.js.map +0 -1
  242. package/dist/src/services/McpPromptLoader.test.d.ts +0 -6
  243. package/dist/src/services/McpPromptLoader.test.js +0 -411
  244. package/dist/src/services/McpPromptLoader.test.js.map +0 -1
  245. package/dist/src/services/prompt-processors/argumentProcessor.test.d.ts +0 -6
  246. package/dist/src/services/prompt-processors/argumentProcessor.test.js +0 -40
  247. package/dist/src/services/prompt-processors/argumentProcessor.test.js.map +0 -1
  248. package/dist/src/services/prompt-processors/atFileProcessor.test.d.ts +0 -6
  249. package/dist/src/services/prompt-processors/atFileProcessor.test.js +0 -174
  250. package/dist/src/services/prompt-processors/atFileProcessor.test.js.map +0 -1
  251. package/dist/src/services/prompt-processors/injectionParser.test.d.ts +0 -6
  252. package/dist/src/services/prompt-processors/injectionParser.test.js +0 -189
  253. package/dist/src/services/prompt-processors/injectionParser.test.js.map +0 -1
  254. package/dist/src/services/prompt-processors/shellProcessor.test.d.ts +0 -6
  255. package/dist/src/services/prompt-processors/shellProcessor.test.js +0 -514
  256. package/dist/src/services/prompt-processors/shellProcessor.test.js.map +0 -1
  257. package/dist/src/test-utils/mockCommandContext.test.d.ts +0 -6
  258. package/dist/src/test-utils/mockCommandContext.test.js +0 -51
  259. package/dist/src/test-utils/mockCommandContext.test.js.map +0 -1
  260. package/dist/src/test-utils/render.test.d.ts +0 -6
  261. package/dist/src/test-utils/render.test.js +0 -79
  262. package/dist/src/test-utils/render.test.js.map +0 -1
  263. package/dist/src/ui/App.test.d.ts +0 -6
  264. package/dist/src/ui/App.test.js +0 -218
  265. package/dist/src/ui/App.test.js.map +0 -1
  266. package/dist/src/ui/AppContainer.test.d.ts +0 -6
  267. package/dist/src/ui/AppContainer.test.js +0 -2072
  268. package/dist/src/ui/AppContainer.test.js.map +0 -1
  269. package/dist/src/ui/IdeIntegrationNudge.test.d.ts +0 -6
  270. package/dist/src/ui/IdeIntegrationNudge.test.js +0 -158
  271. package/dist/src/ui/IdeIntegrationNudge.test.js.map +0 -1
  272. package/dist/src/ui/auth/ApiAuthDialog.test.d.ts +0 -6
  273. package/dist/src/ui/auth/ApiAuthDialog.test.js +0 -109
  274. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +0 -1
  275. package/dist/src/ui/auth/AuthDialog.test.d.ts +0 -6
  276. package/dist/src/ui/auth/AuthDialog.test.js +0 -309
  277. package/dist/src/ui/auth/AuthDialog.test.js.map +0 -1
  278. package/dist/src/ui/auth/AuthInProgress.test.d.ts +0 -6
  279. package/dist/src/ui/auth/AuthInProgress.test.js +0 -81
  280. package/dist/src/ui/auth/AuthInProgress.test.js.map +0 -1
  281. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.d.ts +0 -6
  282. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js +0 -66
  283. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js.map +0 -1
  284. package/dist/src/ui/auth/useAuth.test.d.ts +0 -6
  285. package/dist/src/ui/auth/useAuth.test.js +0 -189
  286. package/dist/src/ui/auth/useAuth.test.js.map +0 -1
  287. package/dist/src/ui/commands/aboutCommand.test.d.ts +0 -6
  288. package/dist/src/ui/commands/aboutCommand.test.js +0 -143
  289. package/dist/src/ui/commands/aboutCommand.test.js.map +0 -1
  290. package/dist/src/ui/commands/agentsCommand.test.d.ts +0 -6
  291. package/dist/src/ui/commands/agentsCommand.test.js +0 -344
  292. package/dist/src/ui/commands/agentsCommand.test.js.map +0 -1
  293. package/dist/src/ui/commands/authCommand.test.d.ts +0 -6
  294. package/dist/src/ui/commands/authCommand.test.js +0 -98
  295. package/dist/src/ui/commands/authCommand.test.js.map +0 -1
  296. package/dist/src/ui/commands/bugCommand.test.d.ts +0 -6
  297. package/dist/src/ui/commands/bugCommand.test.js +0 -186
  298. package/dist/src/ui/commands/bugCommand.test.js.map +0 -1
  299. package/dist/src/ui/commands/chatCommand.test.d.ts +0 -6
  300. package/dist/src/ui/commands/chatCommand.test.js +0 -620
  301. package/dist/src/ui/commands/chatCommand.test.js.map +0 -1
  302. package/dist/src/ui/commands/clearCommand.test.d.ts +0 -6
  303. package/dist/src/ui/commands/clearCommand.test.js +0 -87
  304. package/dist/src/ui/commands/clearCommand.test.js.map +0 -1
  305. package/dist/src/ui/commands/compressCommand.test.d.ts +0 -6
  306. package/dist/src/ui/commands/compressCommand.test.js +0 -98
  307. package/dist/src/ui/commands/compressCommand.test.js.map +0 -1
  308. package/dist/src/ui/commands/copyCommand.test.d.ts +0 -6
  309. package/dist/src/ui/commands/copyCommand.test.js +0 -242
  310. package/dist/src/ui/commands/copyCommand.test.js.map +0 -1
  311. package/dist/src/ui/commands/corgiCommand.test.d.ts +0 -6
  312. package/dist/src/ui/commands/corgiCommand.test.js +0 -28
  313. package/dist/src/ui/commands/corgiCommand.test.js.map +0 -1
  314. package/dist/src/ui/commands/directoryCommand.test.d.ts +0 -6
  315. package/dist/src/ui/commands/directoryCommand.test.js +0 -353
  316. package/dist/src/ui/commands/directoryCommand.test.js.map +0 -1
  317. package/dist/src/ui/commands/docsCommand.test.d.ts +0 -6
  318. package/dist/src/ui/commands/docsCommand.test.js +0 -72
  319. package/dist/src/ui/commands/docsCommand.test.js.map +0 -1
  320. package/dist/src/ui/commands/editorCommand.test.d.ts +0 -6
  321. package/dist/src/ui/commands/editorCommand.test.js +0 -27
  322. package/dist/src/ui/commands/editorCommand.test.js.map +0 -1
  323. package/dist/src/ui/commands/extensionsCommand.test.d.ts +0 -6
  324. package/dist/src/ui/commands/extensionsCommand.test.js +0 -778
  325. package/dist/src/ui/commands/extensionsCommand.test.js.map +0 -1
  326. package/dist/src/ui/commands/helpCommand.test.d.ts +0 -6
  327. package/dist/src/ui/commands/helpCommand.test.js +0 -42
  328. package/dist/src/ui/commands/helpCommand.test.js.map +0 -1
  329. package/dist/src/ui/commands/hooksCommand.test.d.ts +0 -6
  330. package/dist/src/ui/commands/hooksCommand.test.js +0 -572
  331. package/dist/src/ui/commands/hooksCommand.test.js.map +0 -1
  332. package/dist/src/ui/commands/ideCommand.test.d.ts +0 -6
  333. package/dist/src/ui/commands/ideCommand.test.js +0 -203
  334. package/dist/src/ui/commands/ideCommand.test.js.map +0 -1
  335. package/dist/src/ui/commands/initCommand.test.d.ts +0 -6
  336. package/dist/src/ui/commands/initCommand.test.js +0 -84
  337. package/dist/src/ui/commands/initCommand.test.js.map +0 -1
  338. package/dist/src/ui/commands/mcpCommand.test.d.ts +0 -6
  339. package/dist/src/ui/commands/mcpCommand.test.js +0 -189
  340. package/dist/src/ui/commands/mcpCommand.test.js.map +0 -1
  341. package/dist/src/ui/commands/memoryCommand.test.d.ts +0 -6
  342. package/dist/src/ui/commands/memoryCommand.test.js +0 -350
  343. package/dist/src/ui/commands/memoryCommand.test.js.map +0 -1
  344. package/dist/src/ui/commands/modelCommand.test.d.ts +0 -6
  345. package/dist/src/ui/commands/modelCommand.test.js +0 -41
  346. package/dist/src/ui/commands/modelCommand.test.js.map +0 -1
  347. package/dist/src/ui/commands/permissionsCommand.test.d.ts +0 -6
  348. package/dist/src/ui/commands/permissionsCommand.test.js +0 -86
  349. package/dist/src/ui/commands/permissionsCommand.test.js.map +0 -1
  350. package/dist/src/ui/commands/policiesCommand.test.d.ts +0 -6
  351. package/dist/src/ui/commands/policiesCommand.test.js +0 -87
  352. package/dist/src/ui/commands/policiesCommand.test.js.map +0 -1
  353. package/dist/src/ui/commands/privacyCommand.test.d.ts +0 -6
  354. package/dist/src/ui/commands/privacyCommand.test.js +0 -32
  355. package/dist/src/ui/commands/privacyCommand.test.js.map +0 -1
  356. package/dist/src/ui/commands/quitCommand.test.d.ts +0 -6
  357. package/dist/src/ui/commands/quitCommand.test.js +0 -50
  358. package/dist/src/ui/commands/quitCommand.test.js.map +0 -1
  359. package/dist/src/ui/commands/restoreCommand.test.d.ts +0 -6
  360. package/dist/src/ui/commands/restoreCommand.test.js +0 -190
  361. package/dist/src/ui/commands/restoreCommand.test.js.map +0 -1
  362. package/dist/src/ui/commands/rewindCommand.test.d.ts +0 -6
  363. package/dist/src/ui/commands/rewindCommand.test.js +0 -242
  364. package/dist/src/ui/commands/rewindCommand.test.js.map +0 -1
  365. package/dist/src/ui/commands/settingsCommand.test.d.ts +0 -6
  366. package/dist/src/ui/commands/settingsCommand.test.js +0 -30
  367. package/dist/src/ui/commands/settingsCommand.test.js.map +0 -1
  368. package/dist/src/ui/commands/setupGithubCommand.test.d.ts +0 -6
  369. package/dist/src/ui/commands/setupGithubCommand.test.js +0 -238
  370. package/dist/src/ui/commands/setupGithubCommand.test.js.map +0 -1
  371. package/dist/src/ui/commands/skillsCommand.test.d.ts +0 -6
  372. package/dist/src/ui/commands/skillsCommand.test.js +0 -426
  373. package/dist/src/ui/commands/skillsCommand.test.js.map +0 -1
  374. package/dist/src/ui/commands/statsCommand.test.d.ts +0 -6
  375. package/dist/src/ui/commands/statsCommand.test.js +0 -70
  376. package/dist/src/ui/commands/statsCommand.test.js.map +0 -1
  377. package/dist/src/ui/commands/terminalSetupCommand.test.d.ts +0 -6
  378. package/dist/src/ui/commands/terminalSetupCommand.test.js +0 -66
  379. package/dist/src/ui/commands/terminalSetupCommand.test.js.map +0 -1
  380. package/dist/src/ui/commands/themeCommand.test.d.ts +0 -6
  381. package/dist/src/ui/commands/themeCommand.test.js +0 -32
  382. package/dist/src/ui/commands/themeCommand.test.js.map +0 -1
  383. package/dist/src/ui/commands/toolsCommand.test.d.ts +0 -6
  384. package/dist/src/ui/commands/toolsCommand.test.js +0 -100
  385. package/dist/src/ui/commands/toolsCommand.test.js.map +0 -1
  386. package/dist/src/ui/components/AboutBox.test.d.ts +0 -6
  387. package/dist/src/ui/components/AboutBox.test.js +0 -59
  388. package/dist/src/ui/components/AboutBox.test.js.map +0 -1
  389. package/dist/src/ui/components/AdminSettingsChangedDialog.test.d.ts +0 -6
  390. package/dist/src/ui/components/AdminSettingsChangedDialog.test.js +0 -43
  391. package/dist/src/ui/components/AdminSettingsChangedDialog.test.js.map +0 -1
  392. package/dist/src/ui/components/AgentConfigDialog.test.d.ts +0 -6
  393. package/dist/src/ui/components/AgentConfigDialog.test.js +0 -241
  394. package/dist/src/ui/components/AgentConfigDialog.test.js.map +0 -1
  395. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.d.ts +0 -6
  396. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +0 -190
  397. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +0 -1
  398. package/dist/src/ui/components/AnsiOutput.test.d.ts +0 -6
  399. package/dist/src/ui/components/AnsiOutput.test.js +0 -92
  400. package/dist/src/ui/components/AnsiOutput.test.js.map +0 -1
  401. package/dist/src/ui/components/AppHeader.test.d.ts +0 -6
  402. package/dist/src/ui/components/AppHeader.test.js +0 -225
  403. package/dist/src/ui/components/AppHeader.test.js.map +0 -1
  404. package/dist/src/ui/components/ApprovalModeIndicator.test.d.ts +0 -6
  405. package/dist/src/ui/components/ApprovalModeIndicator.test.js +0 -37
  406. package/dist/src/ui/components/ApprovalModeIndicator.test.js.map +0 -1
  407. package/dist/src/ui/components/AskUserDialog.test.d.ts +0 -6
  408. package/dist/src/ui/components/AskUserDialog.test.js +0 -598
  409. package/dist/src/ui/components/AskUserDialog.test.js.map +0 -1
  410. package/dist/src/ui/components/Banner.test.d.ts +0 -6
  411. package/dist/src/ui/components/Banner.test.js +0 -24
  412. package/dist/src/ui/components/Banner.test.js.map +0 -1
  413. package/dist/src/ui/components/CliSpinner.test.d.ts +0 -6
  414. package/dist/src/ui/components/CliSpinner.test.js +0 -28
  415. package/dist/src/ui/components/CliSpinner.test.js.map +0 -1
  416. package/dist/src/ui/components/Composer.test.d.ts +0 -6
  417. package/dist/src/ui/components/Composer.test.js +0 -383
  418. package/dist/src/ui/components/Composer.test.js.map +0 -1
  419. package/dist/src/ui/components/ConfigInitDisplay.test.d.ts +0 -6
  420. package/dist/src/ui/components/ConfigInitDisplay.test.js +0 -117
  421. package/dist/src/ui/components/ConfigInitDisplay.test.js.map +0 -1
  422. package/dist/src/ui/components/ConsentPrompt.test.d.ts +0 -6
  423. package/dist/src/ui/components/ConsentPrompt.test.js +0 -77
  424. package/dist/src/ui/components/ConsentPrompt.test.js.map +0 -1
  425. package/dist/src/ui/components/ConsoleSummaryDisplay.test.d.ts +0 -6
  426. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js +0 -26
  427. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js.map +0 -1
  428. package/dist/src/ui/components/ContextSummaryDisplay.test.d.ts +0 -6
  429. package/dist/src/ui/components/ContextSummaryDisplay.test.js +0 -102
  430. package/dist/src/ui/components/ContextSummaryDisplay.test.js.map +0 -1
  431. package/dist/src/ui/components/ContextUsageDisplay.test.d.ts +0 -6
  432. package/dist/src/ui/components/ContextUsageDisplay.test.js +0 -43
  433. package/dist/src/ui/components/ContextUsageDisplay.test.js.map +0 -1
  434. package/dist/src/ui/components/CopyModeWarning.test.d.ts +0 -6
  435. package/dist/src/ui/components/CopyModeWarning.test.js +0 -33
  436. package/dist/src/ui/components/CopyModeWarning.test.js.map +0 -1
  437. package/dist/src/ui/components/DebugProfiler.test.d.ts +0 -6
  438. package/dist/src/ui/components/DebugProfiler.test.js +0 -229
  439. package/dist/src/ui/components/DebugProfiler.test.js.map +0 -1
  440. package/dist/src/ui/components/DetailedMessagesDisplay.test.d.ts +0 -6
  441. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +0 -39
  442. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +0 -1
  443. package/dist/src/ui/components/DialogManager.test.d.ts +0 -6
  444. package/dist/src/ui/components/DialogManager.test.js +0 -177
  445. package/dist/src/ui/components/DialogManager.test.js.map +0 -1
  446. package/dist/src/ui/components/EditorSettingsDialog.test.d.ts +0 -6
  447. package/dist/src/ui/components/EditorSettingsDialog.test.js +0 -119
  448. package/dist/src/ui/components/EditorSettingsDialog.test.js.map +0 -1
  449. package/dist/src/ui/components/ExitWarning.test.d.ts +0 -6
  450. package/dist/src/ui/components/ExitWarning.test.js +0 -54
  451. package/dist/src/ui/components/ExitWarning.test.js.map +0 -1
  452. package/dist/src/ui/components/FolderTrustDialog.test.d.ts +0 -6
  453. package/dist/src/ui/components/FolderTrustDialog.test.js +0 -102
  454. package/dist/src/ui/components/FolderTrustDialog.test.js.map +0 -1
  455. package/dist/src/ui/components/Footer.test.d.ts +0 -6
  456. package/dist/src/ui/components/Footer.test.js +0 -321
  457. package/dist/src/ui/components/Footer.test.js.map +0 -1
  458. package/dist/src/ui/components/GeminiRespondingSpinner.test.d.ts +0 -6
  459. package/dist/src/ui/components/GeminiRespondingSpinner.test.js +0 -61
  460. package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +0 -1
  461. package/dist/src/ui/components/GradientRegression.test.d.ts +0 -6
  462. package/dist/src/ui/components/GradientRegression.test.js +0 -105
  463. package/dist/src/ui/components/GradientRegression.test.js.map +0 -1
  464. package/dist/src/ui/components/Header.test.d.ts +0 -6
  465. package/dist/src/ui/components/Header.test.js +0 -147
  466. package/dist/src/ui/components/Header.test.js.map +0 -1
  467. package/dist/src/ui/components/Help.test.d.ts +0 -6
  468. package/dist/src/ui/components/Help.test.js +0 -67
  469. package/dist/src/ui/components/Help.test.js.map +0 -1
  470. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +0 -6
  471. package/dist/src/ui/components/HistoryItemDisplay.test.js +0 -207
  472. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +0 -1
  473. package/dist/src/ui/components/HookStatusDisplay.test.d.ts +0 -6
  474. package/dist/src/ui/components/HookStatusDisplay.test.js +0 -51
  475. package/dist/src/ui/components/HookStatusDisplay.test.js.map +0 -1
  476. package/dist/src/ui/components/IdeTrustChangeDialog.test.d.ts +0 -6
  477. package/dist/src/ui/components/IdeTrustChangeDialog.test.js +0 -58
  478. package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +0 -1
  479. package/dist/src/ui/components/InputPrompt.test.d.ts +0 -6
  480. package/dist/src/ui/components/InputPrompt.test.js +0 -2596
  481. package/dist/src/ui/components/InputPrompt.test.js.map +0 -1
  482. package/dist/src/ui/components/LoadingIndicator.test.d.ts +0 -6
  483. package/dist/src/ui/components/LoadingIndicator.test.js +0 -207
  484. package/dist/src/ui/components/LoadingIndicator.test.js.map +0 -1
  485. package/dist/src/ui/components/LogoutConfirmationDialog.test.d.ts +0 -6
  486. package/dist/src/ui/components/LogoutConfirmationDialog.test.js +0 -59
  487. package/dist/src/ui/components/LogoutConfirmationDialog.test.js.map +0 -1
  488. package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +0 -6
  489. package/dist/src/ui/components/LoopDetectionConfirmation.test.js +0 -25
  490. package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +0 -1
  491. package/dist/src/ui/components/MainContent.test.d.ts +0 -6
  492. package/dist/src/ui/components/MainContent.test.js +0 -83
  493. package/dist/src/ui/components/MainContent.test.js.map +0 -1
  494. package/dist/src/ui/components/MemoryUsageDisplay.test.d.ts +0 -6
  495. package/dist/src/ui/components/MemoryUsageDisplay.test.js +0 -49
  496. package/dist/src/ui/components/MemoryUsageDisplay.test.js.map +0 -1
  497. package/dist/src/ui/components/ModelDialog.test.d.ts +0 -6
  498. package/dist/src/ui/components/ModelDialog.test.js +0 -197
  499. package/dist/src/ui/components/ModelDialog.test.js.map +0 -1
  500. package/dist/src/ui/components/ModelStatsDisplay.test.d.ts +0 -6
  501. package/dist/src/ui/components/ModelStatsDisplay.test.js +0 -343
  502. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +0 -1
  503. package/dist/src/ui/components/MultiFolderTrustDialog.test.d.ts +0 -6
  504. package/dist/src/ui/components/MultiFolderTrustDialog.test.js +0 -162
  505. package/dist/src/ui/components/MultiFolderTrustDialog.test.js.map +0 -1
  506. package/dist/src/ui/components/NewAgentsNotification.test.d.ts +0 -6
  507. package/dist/src/ui/components/NewAgentsNotification.test.js +0 -48
  508. package/dist/src/ui/components/NewAgentsNotification.test.js.map +0 -1
  509. package/dist/src/ui/components/Notifications.test.d.ts +0 -6
  510. package/dist/src/ui/components/Notifications.test.js +0 -164
  511. package/dist/src/ui/components/Notifications.test.js.map +0 -1
  512. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.d.ts +0 -6
  513. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +0 -162
  514. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +0 -1
  515. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +0 -6
  516. package/dist/src/ui/components/ProQuotaDialog.test.js +0 -191
  517. package/dist/src/ui/components/ProQuotaDialog.test.js.map +0 -1
  518. package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +0 -6
  519. package/dist/src/ui/components/QueuedMessageDisplay.test.js +0 -65
  520. package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +0 -1
  521. package/dist/src/ui/components/QuittingDisplay.test.d.ts +0 -6
  522. package/dist/src/ui/components/QuittingDisplay.test.js +0 -49
  523. package/dist/src/ui/components/QuittingDisplay.test.js.map +0 -1
  524. package/dist/src/ui/components/RawMarkdownIndicator.test.d.ts +0 -6
  525. package/dist/src/ui/components/RawMarkdownIndicator.test.js +0 -34
  526. package/dist/src/ui/components/RawMarkdownIndicator.test.js.map +0 -1
  527. package/dist/src/ui/components/RewindConfirmation.test.d.ts +0 -6
  528. package/dist/src/ui/components/RewindConfirmation.test.js +0 -53
  529. package/dist/src/ui/components/RewindConfirmation.test.js.map +0 -1
  530. package/dist/src/ui/components/RewindViewer.test.d.ts +0 -6
  531. package/dist/src/ui/components/RewindViewer.test.js +0 -241
  532. package/dist/src/ui/components/RewindViewer.test.js.map +0 -1
  533. package/dist/src/ui/components/SessionBrowser.test.d.ts +0 -6
  534. package/dist/src/ui/components/SessionBrowser.test.js +0 -256
  535. package/dist/src/ui/components/SessionBrowser.test.js.map +0 -1
  536. package/dist/src/ui/components/SessionSummaryDisplay.test.d.ts +0 -6
  537. package/dist/src/ui/components/SessionSummaryDisplay.test.js +0 -75
  538. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +0 -1
  539. package/dist/src/ui/components/SettingsDialog.test.d.ts +0 -6
  540. package/dist/src/ui/components/SettingsDialog.test.js +0 -1150
  541. package/dist/src/ui/components/SettingsDialog.test.js.map +0 -1
  542. package/dist/src/ui/components/ShellInputPrompt.test.d.ts +0 -6
  543. package/dist/src/ui/components/ShellInputPrompt.test.js +0 -91
  544. package/dist/src/ui/components/ShellInputPrompt.test.js.map +0 -1
  545. package/dist/src/ui/components/ShellModeIndicator.test.d.ts +0 -6
  546. package/dist/src/ui/components/ShellModeIndicator.test.js +0 -17
  547. package/dist/src/ui/components/ShellModeIndicator.test.js.map +0 -1
  548. package/dist/src/ui/components/ShowMoreLines.test.d.ts +0 -6
  549. package/dist/src/ui/components/ShowMoreLines.test.js +0 -40
  550. package/dist/src/ui/components/ShowMoreLines.test.js.map +0 -1
  551. package/dist/src/ui/components/StatsDisplay.test.d.ts +0 -6
  552. package/dist/src/ui/components/StatsDisplay.test.js +0 -438
  553. package/dist/src/ui/components/StatsDisplay.test.js.map +0 -1
  554. package/dist/src/ui/components/StatusDisplay.test.d.ts +0 -6
  555. package/dist/src/ui/components/StatusDisplay.test.js +0 -155
  556. package/dist/src/ui/components/StatusDisplay.test.js.map +0 -1
  557. package/dist/src/ui/components/StickyHeader.test.d.ts +0 -6
  558. package/dist/src/ui/components/StickyHeader.test.js +0 -17
  559. package/dist/src/ui/components/StickyHeader.test.js.map +0 -1
  560. package/dist/src/ui/components/SuggestionsDisplay.test.d.ts +0 -6
  561. package/dist/src/ui/components/SuggestionsDisplay.test.js +0 -56
  562. package/dist/src/ui/components/SuggestionsDisplay.test.js.map +0 -1
  563. package/dist/src/ui/components/Table.test.d.ts +0 -6
  564. package/dist/src/ui/components/Table.test.js +0 -53
  565. package/dist/src/ui/components/Table.test.js.map +0 -1
  566. package/dist/src/ui/components/ThemeDialog.test.d.ts +0 -6
  567. package/dist/src/ui/components/ThemeDialog.test.js +0 -167
  568. package/dist/src/ui/components/ThemeDialog.test.js.map +0 -1
  569. package/dist/src/ui/components/ThemedGradient.test.d.ts +0 -6
  570. package/dist/src/ui/components/ThemedGradient.test.js +0 -30
  571. package/dist/src/ui/components/ThemedGradient.test.js.map +0 -1
  572. package/dist/src/ui/components/Tips.test.d.ts +0 -6
  573. package/dist/src/ui/components/Tips.test.js +0 -23
  574. package/dist/src/ui/components/Tips.test.js.map +0 -1
  575. package/dist/src/ui/components/ToolConfirmationQueue.test.d.ts +0 -6
  576. package/dist/src/ui/components/ToolConfirmationQueue.test.js +0 -71
  577. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +0 -1
  578. package/dist/src/ui/components/ToolStatsDisplay.test.d.ts +0 -6
  579. package/dist/src/ui/components/ToolStatsDisplay.test.js +0 -227
  580. package/dist/src/ui/components/ToolStatsDisplay.test.js.map +0 -1
  581. package/dist/src/ui/components/UpdateNotification.test.d.ts +0 -6
  582. package/dist/src/ui/components/UpdateNotification.test.js +0 -16
  583. package/dist/src/ui/components/UpdateNotification.test.js.map +0 -1
  584. package/dist/src/ui/components/ValidationDialog.test.d.ts +0 -6
  585. package/dist/src/ui/components/ValidationDialog.test.js +0 -153
  586. package/dist/src/ui/components/ValidationDialog.test.js.map +0 -1
  587. package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +0 -6
  588. package/dist/src/ui/components/messages/CompressionMessage.test.js +0 -191
  589. package/dist/src/ui/components/messages/CompressionMessage.test.js.map +0 -1
  590. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +0 -6
  591. package/dist/src/ui/components/messages/DiffRenderer.test.js +0 -240
  592. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +0 -1
  593. package/dist/src/ui/components/messages/ErrorMessage.test.d.ts +0 -6
  594. package/dist/src/ui/components/messages/ErrorMessage.test.js +0 -23
  595. package/dist/src/ui/components/messages/ErrorMessage.test.js.map +0 -1
  596. package/dist/src/ui/components/messages/GeminiMessage.test.d.ts +0 -6
  597. package/dist/src/ui/components/messages/GeminiMessage.test.js +0 -35
  598. package/dist/src/ui/components/messages/GeminiMessage.test.js.map +0 -1
  599. package/dist/src/ui/components/messages/InfoMessage.test.d.ts +0 -6
  600. package/dist/src/ui/components/messages/InfoMessage.test.js +0 -28
  601. package/dist/src/ui/components/messages/InfoMessage.test.js.map +0 -1
  602. package/dist/src/ui/components/messages/RedirectionConfirmation.test.d.ts +0 -6
  603. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +0 -33
  604. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +0 -1
  605. package/dist/src/ui/components/messages/ShellToolMessage.test.d.ts +0 -6
  606. package/dist/src/ui/components/messages/ShellToolMessage.test.js +0 -123
  607. package/dist/src/ui/components/messages/ShellToolMessage.test.js.map +0 -1
  608. package/dist/src/ui/components/messages/Todo.test.d.ts +0 -6
  609. package/dist/src/ui/components/messages/Todo.test.js +0 -114
  610. package/dist/src/ui/components/messages/Todo.test.js.map +0 -1
  611. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +0 -6
  612. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -232
  613. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +0 -1
  614. package/dist/src/ui/components/messages/ToolGroupMessage.test.d.ts +0 -6
  615. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +0 -529
  616. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +0 -1
  617. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +0 -6
  618. package/dist/src/ui/components/messages/ToolMessage.test.js +0 -217
  619. package/dist/src/ui/components/messages/ToolMessage.test.js.map +0 -1
  620. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.d.ts +0 -6
  621. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js +0 -89
  622. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js.map +0 -1
  623. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.d.ts +0 -6
  624. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js +0 -62
  625. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js.map +0 -1
  626. package/dist/src/ui/components/messages/ToolResultDisplay.test.d.ts +0 -6
  627. package/dist/src/ui/components/messages/ToolResultDisplay.test.js +0 -114
  628. package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +0 -1
  629. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.d.ts +0 -6
  630. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js +0 -134
  631. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js.map +0 -1
  632. package/dist/src/ui/components/messages/UserMessage.test.d.ts +0 -6
  633. package/dist/src/ui/components/messages/UserMessage.test.js +0 -32
  634. package/dist/src/ui/components/messages/UserMessage.test.js.map +0 -1
  635. package/dist/src/ui/components/messages/WarningMessage.test.d.ts +0 -6
  636. package/dist/src/ui/components/messages/WarningMessage.test.js +0 -23
  637. package/dist/src/ui/components/messages/WarningMessage.test.js.map +0 -1
  638. package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +0 -6
  639. package/dist/src/ui/components/shared/BaseSelectionList.test.js +0 -386
  640. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +0 -1
  641. package/dist/src/ui/components/shared/BaseSettingsDialog.test.d.ts +0 -6
  642. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js +0 -434
  643. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js.map +0 -1
  644. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +0 -6
  645. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +0 -79
  646. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +0 -1
  647. package/dist/src/ui/components/shared/EnumSelector.test.d.ts +0 -6
  648. package/dist/src/ui/components/shared/EnumSelector.test.js +0 -70
  649. package/dist/src/ui/components/shared/EnumSelector.test.js.map +0 -1
  650. package/dist/src/ui/components/shared/ExpandableText.test.d.ts +0 -6
  651. package/dist/src/ui/components/shared/ExpandableText.test.js +0 -88
  652. package/dist/src/ui/components/shared/ExpandableText.test.js.map +0 -1
  653. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.d.ts +0 -6
  654. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js +0 -34
  655. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js.map +0 -1
  656. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +0 -6
  657. package/dist/src/ui/components/shared/MaxSizedBox.test.js +0 -90
  658. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +0 -1
  659. package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +0 -6
  660. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +0 -134
  661. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +0 -1
  662. package/dist/src/ui/components/shared/Scrollable.test.d.ts +0 -6
  663. package/dist/src/ui/components/shared/Scrollable.test.js +0 -74
  664. package/dist/src/ui/components/shared/Scrollable.test.js.map +0 -1
  665. package/dist/src/ui/components/shared/ScrollableList.test.d.ts +0 -6
  666. package/dist/src/ui/components/shared/ScrollableList.test.js +0 -241
  667. package/dist/src/ui/components/shared/ScrollableList.test.js.map +0 -1
  668. package/dist/src/ui/components/shared/TabHeader.test.d.ts +0 -6
  669. package/dist/src/ui/components/shared/TabHeader.test.js +0 -106
  670. package/dist/src/ui/components/shared/TabHeader.test.js.map +0 -1
  671. package/dist/src/ui/components/shared/TextInput.test.d.ts +0 -6
  672. package/dist/src/ui/components/shared/TextInput.test.js +0 -242
  673. package/dist/src/ui/components/shared/TextInput.test.js.map +0 -1
  674. package/dist/src/ui/components/shared/VirtualizedList.test.d.ts +0 -6
  675. package/dist/src/ui/components/shared/VirtualizedList.test.js +0 -171
  676. package/dist/src/ui/components/shared/VirtualizedList.test.js.map +0 -1
  677. package/dist/src/ui/components/shared/performance.test.d.ts +0 -1
  678. package/dist/src/ui/components/shared/performance.test.js +0 -67
  679. package/dist/src/ui/components/shared/performance.test.js.map +0 -1
  680. package/dist/src/ui/components/shared/text-buffer.test.d.ts +0 -6
  681. package/dist/src/ui/components/shared/text-buffer.test.js +0 -2490
  682. package/dist/src/ui/components/shared/text-buffer.test.js.map +0 -1
  683. package/dist/src/ui/components/shared/vim-buffer-actions.test.d.ts +0 -6
  684. package/dist/src/ui/components/shared/vim-buffer-actions.test.js +0 -964
  685. package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +0 -1
  686. package/dist/src/ui/components/views/ChatList.test.d.ts +0 -6
  687. package/dist/src/ui/components/views/ChatList.test.js +0 -45
  688. package/dist/src/ui/components/views/ChatList.test.js.map +0 -1
  689. package/dist/src/ui/components/views/ExtensionsList.test.d.ts +0 -6
  690. package/dist/src/ui/components/views/ExtensionsList.test.js +0 -148
  691. package/dist/src/ui/components/views/ExtensionsList.test.js.map +0 -1
  692. package/dist/src/ui/components/views/McpStatus.test.d.ts +0 -6
  693. package/dist/src/ui/components/views/McpStatus.test.js +0 -153
  694. package/dist/src/ui/components/views/McpStatus.test.js.map +0 -1
  695. package/dist/src/ui/components/views/SkillsList.test.d.ts +0 -6
  696. package/dist/src/ui/components/views/SkillsList.test.js +0 -97
  697. package/dist/src/ui/components/views/SkillsList.test.js.map +0 -1
  698. package/dist/src/ui/components/views/ToolsList.test.d.ts +0 -6
  699. package/dist/src/ui/components/views/ToolsList.test.js +0 -45
  700. package/dist/src/ui/components/views/ToolsList.test.js.map +0 -1
  701. package/dist/src/ui/contexts/KeypressContext.test.d.ts +0 -6
  702. package/dist/src/ui/contexts/KeypressContext.test.js +0 -957
  703. package/dist/src/ui/contexts/KeypressContext.test.js.map +0 -1
  704. package/dist/src/ui/contexts/MouseContext.test.d.ts +0 -6
  705. package/dist/src/ui/contexts/MouseContext.test.js +0 -198
  706. package/dist/src/ui/contexts/MouseContext.test.js.map +0 -1
  707. package/dist/src/ui/contexts/ScrollProvider.drag.test.d.ts +0 -6
  708. package/dist/src/ui/contexts/ScrollProvider.drag.test.js +0 -319
  709. package/dist/src/ui/contexts/ScrollProvider.drag.test.js.map +0 -1
  710. package/dist/src/ui/contexts/ScrollProvider.test.d.ts +0 -6
  711. package/dist/src/ui/contexts/ScrollProvider.test.js +0 -377
  712. package/dist/src/ui/contexts/ScrollProvider.test.js.map +0 -1
  713. package/dist/src/ui/contexts/SessionContext.test.d.ts +0 -6
  714. package/dist/src/ui/contexts/SessionContext.test.js +0 -198
  715. package/dist/src/ui/contexts/SessionContext.test.js.map +0 -1
  716. package/dist/src/ui/contexts/ToolActionsContext.test.d.ts +0 -6
  717. package/dist/src/ui/contexts/ToolActionsContext.test.js +0 -166
  718. package/dist/src/ui/contexts/ToolActionsContext.test.js.map +0 -1
  719. package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +0 -6
  720. package/dist/src/ui/hooks/atCommandProcessor.test.js +0 -1032
  721. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +0 -1
  722. package/dist/src/ui/hooks/atCommandProcessor_agents.test.d.ts +0 -6
  723. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js +0 -183
  724. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js.map +0 -1
  725. package/dist/src/ui/hooks/shellCommandProcessor.test.d.ts +0 -6
  726. package/dist/src/ui/hooks/shellCommandProcessor.test.js +0 -521
  727. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +0 -1
  728. package/dist/src/ui/hooks/slashCommandProcessor.test.d.ts +0 -6
  729. package/dist/src/ui/hooks/slashCommandProcessor.test.js +0 -796
  730. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +0 -1
  731. package/dist/src/ui/hooks/toolMapping.test.d.ts +0 -6
  732. package/dist/src/ui/hooks/toolMapping.test.js +0 -209
  733. package/dist/src/ui/hooks/toolMapping.test.js.map +0 -1
  734. package/dist/src/ui/hooks/useAnimatedScrollbar.test.d.ts +0 -6
  735. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js +0 -85
  736. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js.map +0 -1
  737. package/dist/src/ui/hooks/useApprovalModeIndicator.test.d.ts +0 -6
  738. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js +0 -435
  739. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js.map +0 -1
  740. package/dist/src/ui/hooks/useAtCompletion.test.d.ts +0 -6
  741. package/dist/src/ui/hooks/useAtCompletion.test.js +0 -417
  742. package/dist/src/ui/hooks/useAtCompletion.test.js.map +0 -1
  743. package/dist/src/ui/hooks/useAtCompletion_agents.test.d.ts +0 -6
  744. package/dist/src/ui/hooks/useAtCompletion_agents.test.js +0 -87
  745. package/dist/src/ui/hooks/useAtCompletion_agents.test.js.map +0 -1
  746. package/dist/src/ui/hooks/useBanner.test.d.ts +0 -6
  747. package/dist/src/ui/hooks/useBanner.test.js +0 -92
  748. package/dist/src/ui/hooks/useBanner.test.js.map +0 -1
  749. package/dist/src/ui/hooks/useBatchedScroll.test.d.ts +0 -6
  750. package/dist/src/ui/hooks/useBatchedScroll.test.js +0 -62
  751. package/dist/src/ui/hooks/useBatchedScroll.test.js.map +0 -1
  752. package/dist/src/ui/hooks/useCommandCompletion.test.d.ts +0 -6
  753. package/dist/src/ui/hooks/useCommandCompletion.test.js +0 -462
  754. package/dist/src/ui/hooks/useCommandCompletion.test.js.map +0 -1
  755. package/dist/src/ui/hooks/useConsoleMessages.test.d.ts +0 -6
  756. package/dist/src/ui/hooks/useConsoleMessages.test.js +0 -159
  757. package/dist/src/ui/hooks/useConsoleMessages.test.js.map +0 -1
  758. package/dist/src/ui/hooks/useEditorSettings.test.d.ts +0 -6
  759. package/dist/src/ui/hooks/useEditorSettings.test.js +0 -179
  760. package/dist/src/ui/hooks/useEditorSettings.test.js.map +0 -1
  761. package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +0 -6
  762. package/dist/src/ui/hooks/useExtensionUpdates.test.js +0 -279
  763. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +0 -1
  764. package/dist/src/ui/hooks/useFlickerDetector.test.d.ts +0 -6
  765. package/dist/src/ui/hooks/useFlickerDetector.test.js +0 -106
  766. package/dist/src/ui/hooks/useFlickerDetector.test.js.map +0 -1
  767. package/dist/src/ui/hooks/useFocus.test.d.ts +0 -6
  768. package/dist/src/ui/hooks/useFocus.test.js +0 -131
  769. package/dist/src/ui/hooks/useFocus.test.js.map +0 -1
  770. package/dist/src/ui/hooks/useFolderTrust.test.d.ts +0 -6
  771. package/dist/src/ui/hooks/useFolderTrust.test.js +0 -218
  772. package/dist/src/ui/hooks/useFolderTrust.test.js.map +0 -1
  773. package/dist/src/ui/hooks/useGeminiStream.test.d.ts +0 -6
  774. package/dist/src/ui/hooks/useGeminiStream.test.js +0 -2149
  775. package/dist/src/ui/hooks/useGeminiStream.test.js.map +0 -1
  776. package/dist/src/ui/hooks/useGitBranchName.test.d.ts +0 -6
  777. package/dist/src/ui/hooks/useGitBranchName.test.js +0 -183
  778. package/dist/src/ui/hooks/useGitBranchName.test.js.map +0 -1
  779. package/dist/src/ui/hooks/useHistoryManager.test.d.ts +0 -6
  780. package/dist/src/ui/hooks/useHistoryManager.test.js +0 -188
  781. package/dist/src/ui/hooks/useHistoryManager.test.js.map +0 -1
  782. package/dist/src/ui/hooks/useHookDisplayState.test.d.ts +0 -6
  783. package/dist/src/ui/hooks/useHookDisplayState.test.js +0 -180
  784. package/dist/src/ui/hooks/useHookDisplayState.test.js.map +0 -1
  785. package/dist/src/ui/hooks/useIdeTrustListener.test.d.ts +0 -6
  786. package/dist/src/ui/hooks/useIdeTrustListener.test.js +0 -214
  787. package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +0 -1
  788. package/dist/src/ui/hooks/useIncludeDirsTrust.test.d.ts +0 -6
  789. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js +0 -172
  790. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +0 -1
  791. package/dist/src/ui/hooks/useInputHistory.test.d.ts +0 -6
  792. package/dist/src/ui/hooks/useInputHistory.test.js +0 -208
  793. package/dist/src/ui/hooks/useInputHistory.test.js.map +0 -1
  794. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +0 -6
  795. package/dist/src/ui/hooks/useInputHistoryStore.test.js +0 -238
  796. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +0 -1
  797. package/dist/src/ui/hooks/useKeypress.test.d.ts +0 -6
  798. package/dist/src/ui/hooks/useKeypress.test.js +0 -205
  799. package/dist/src/ui/hooks/useKeypress.test.js.map +0 -1
  800. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +0 -6
  801. package/dist/src/ui/hooks/useLoadingIndicator.test.js +0 -145
  802. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +0 -1
  803. package/dist/src/ui/hooks/useMcpStatus.test.d.ts +0 -6
  804. package/dist/src/ui/hooks/useMcpStatus.test.js +0 -69
  805. package/dist/src/ui/hooks/useMcpStatus.test.js.map +0 -1
  806. package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +0 -6
  807. package/dist/src/ui/hooks/useMemoryMonitor.test.js +0 -62
  808. package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +0 -1
  809. package/dist/src/ui/hooks/useMessageQueue.test.d.ts +0 -6
  810. package/dist/src/ui/hooks/useMessageQueue.test.js +0 -327
  811. package/dist/src/ui/hooks/useMessageQueue.test.js.map +0 -1
  812. package/dist/src/ui/hooks/useModelCommand.test.d.ts +0 -6
  813. package/dist/src/ui/hooks/useModelCommand.test.js +0 -45
  814. package/dist/src/ui/hooks/useModelCommand.test.js.map +0 -1
  815. package/dist/src/ui/hooks/useMouse.test.d.ts +0 -6
  816. package/dist/src/ui/hooks/useMouse.test.js +0 -57
  817. package/dist/src/ui/hooks/useMouse.test.js.map +0 -1
  818. package/dist/src/ui/hooks/useMouseClick.test.d.ts +0 -6
  819. package/dist/src/ui/hooks/useMouseClick.test.js +0 -59
  820. package/dist/src/ui/hooks/useMouseClick.test.js.map +0 -1
  821. package/dist/src/ui/hooks/useMouseDoubleClick.test.d.ts +0 -6
  822. package/dist/src/ui/hooks/useMouseDoubleClick.test.js +0 -125
  823. package/dist/src/ui/hooks/useMouseDoubleClick.test.js.map +0 -1
  824. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.d.ts +0 -6
  825. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +0 -291
  826. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +0 -1
  827. package/dist/src/ui/hooks/usePhraseCycler.test.d.ts +0 -6
  828. package/dist/src/ui/hooks/usePhraseCycler.test.js +0 -208
  829. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +0 -1
  830. package/dist/src/ui/hooks/usePrivacySettings.test.d.ts +0 -6
  831. package/dist/src/ui/hooks/usePrivacySettings.test.js +0 -104
  832. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +0 -1
  833. package/dist/src/ui/hooks/useQuotaAndFallback.test.d.ts +0 -6
  834. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +0 -477
  835. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +0 -1
  836. package/dist/src/ui/hooks/useReactToolScheduler.test.d.ts +0 -6
  837. package/dist/src/ui/hooks/useReactToolScheduler.test.js +0 -58
  838. package/dist/src/ui/hooks/useReactToolScheduler.test.js.map +0 -1
  839. package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +0 -6
  840. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +0 -169
  841. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +0 -1
  842. package/dist/src/ui/hooks/useRewind.test.d.ts +0 -6
  843. package/dist/src/ui/hooks/useRewind.test.js +0 -100
  844. package/dist/src/ui/hooks/useRewind.test.js.map +0 -1
  845. package/dist/src/ui/hooks/useSelectionList.test.d.ts +0 -6
  846. package/dist/src/ui/hooks/useSelectionList.test.js +0 -848
  847. package/dist/src/ui/hooks/useSelectionList.test.js.map +0 -1
  848. package/dist/src/ui/hooks/useSessionBrowser.test.d.ts +0 -6
  849. package/dist/src/ui/hooks/useSessionBrowser.test.js +0 -203
  850. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +0 -1
  851. package/dist/src/ui/hooks/useSessionResume.test.d.ts +0 -6
  852. package/dist/src/ui/hooks/useSessionResume.test.js +0 -336
  853. package/dist/src/ui/hooks/useSessionResume.test.js.map +0 -1
  854. package/dist/src/ui/hooks/useShellHistory.test.d.ts +0 -6
  855. package/dist/src/ui/hooks/useShellHistory.test.js +0 -223
  856. package/dist/src/ui/hooks/useShellHistory.test.js.map +0 -1
  857. package/dist/src/ui/hooks/useShellInactivityStatus.test.d.ts +0 -6
  858. package/dist/src/ui/hooks/useShellInactivityStatus.test.js +0 -84
  859. package/dist/src/ui/hooks/useShellInactivityStatus.test.js.map +0 -1
  860. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +0 -9
  861. package/dist/src/ui/hooks/useSlashCompletion.test.js +0 -845
  862. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +0 -1
  863. package/dist/src/ui/hooks/useSnowfall.test.d.ts +0 -6
  864. package/dist/src/ui/hooks/useSnowfall.test.js +0 -88
  865. package/dist/src/ui/hooks/useSnowfall.test.js.map +0 -1
  866. package/dist/src/ui/hooks/useTabbedNavigation.test.d.ts +0 -6
  867. package/dist/src/ui/hooks/useTabbedNavigation.test.js +0 -187
  868. package/dist/src/ui/hooks/useTabbedNavigation.test.js.map +0 -1
  869. package/dist/src/ui/hooks/useTimer.test.d.ts +0 -6
  870. package/dist/src/ui/hooks/useTimer.test.js +0 -119
  871. package/dist/src/ui/hooks/useTimer.test.js.map +0 -1
  872. package/dist/src/ui/hooks/useTips.test.d.ts +0 -6
  873. package/dist/src/ui/hooks/useTips.test.js +0 -33
  874. package/dist/src/ui/hooks/useTips.test.js.map +0 -1
  875. package/dist/src/ui/hooks/useToolExecutionScheduler.test.d.ts +0 -6
  876. package/dist/src/ui/hooks/useToolExecutionScheduler.test.js +0 -376
  877. package/dist/src/ui/hooks/useToolExecutionScheduler.test.js.map +0 -1
  878. package/dist/src/ui/hooks/useToolScheduler.test.d.ts +0 -6
  879. package/dist/src/ui/hooks/useToolScheduler.test.js +0 -881
  880. package/dist/src/ui/hooks/useToolScheduler.test.js.map +0 -1
  881. package/dist/src/ui/hooks/useToolSchedulerFacade.test.d.ts +0 -6
  882. package/dist/src/ui/hooks/useToolSchedulerFacade.test.js +0 -45
  883. package/dist/src/ui/hooks/useToolSchedulerFacade.test.js.map +0 -1
  884. package/dist/src/ui/hooks/useTurnActivityMonitor.test.d.ts +0 -6
  885. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js +0 -97
  886. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js.map +0 -1
  887. package/dist/src/ui/hooks/vim.test.d.ts +0 -6
  888. package/dist/src/ui/hooks/vim.test.js +0 -1384
  889. package/dist/src/ui/hooks/vim.test.js.map +0 -1
  890. package/dist/src/ui/keyMatchers.test.d.ts +0 -6
  891. package/dist/src/ui/keyMatchers.test.js +0 -386
  892. package/dist/src/ui/keyMatchers.test.js.map +0 -1
  893. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.d.ts +0 -6
  894. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js +0 -121
  895. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js.map +0 -1
  896. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.d.ts +0 -6
  897. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js +0 -34
  898. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js.map +0 -1
  899. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.d.ts +0 -6
  900. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js +0 -34
  901. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js.map +0 -1
  902. package/dist/src/ui/privacy/PrivacyNotice.test.d.ts +0 -6
  903. package/dist/src/ui/privacy/PrivacyNotice.test.js +0 -62
  904. package/dist/src/ui/privacy/PrivacyNotice.test.js.map +0 -1
  905. package/dist/src/ui/state/extensions.test.d.ts +0 -6
  906. package/dist/src/ui/state/extensions.test.js +0 -219
  907. package/dist/src/ui/state/extensions.test.js.map +0 -1
  908. package/dist/src/ui/themes/color-utils.test.d.ts +0 -6
  909. package/dist/src/ui/themes/color-utils.test.js +0 -245
  910. package/dist/src/ui/themes/color-utils.test.js.map +0 -1
  911. package/dist/src/ui/themes/theme-manager.test.d.ts +0 -6
  912. package/dist/src/ui/themes/theme-manager.test.js +0 -150
  913. package/dist/src/ui/themes/theme-manager.test.js.map +0 -1
  914. package/dist/src/ui/themes/theme.test.d.ts +0 -6
  915. package/dist/src/ui/themes/theme.test.js +0 -174
  916. package/dist/src/ui/themes/theme.test.js.map +0 -1
  917. package/dist/src/ui/utils/CodeColorizer.test.d.ts +0 -6
  918. package/dist/src/ui/utils/CodeColorizer.test.js +0 -38
  919. package/dist/src/ui/utils/CodeColorizer.test.js.map +0 -1
  920. package/dist/src/ui/utils/InlineMarkdownRenderer.test.d.ts +0 -6
  921. package/dist/src/ui/utils/InlineMarkdownRenderer.test.js +0 -21
  922. package/dist/src/ui/utils/InlineMarkdownRenderer.test.js.map +0 -1
  923. package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +0 -6
  924. package/dist/src/ui/utils/MarkdownDisplay.test.js +0 -159
  925. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +0 -1
  926. package/dist/src/ui/utils/clipboardUtils.test.d.ts +0 -6
  927. package/dist/src/ui/utils/clipboardUtils.test.js +0 -359
  928. package/dist/src/ui/utils/clipboardUtils.test.js.map +0 -1
  929. package/dist/src/ui/utils/clipboardUtils.windows.test.d.ts +0 -6
  930. package/dist/src/ui/utils/clipboardUtils.windows.test.js +0 -55
  931. package/dist/src/ui/utils/clipboardUtils.windows.test.js.map +0 -1
  932. package/dist/src/ui/utils/commandUtils.test.d.ts +0 -6
  933. package/dist/src/ui/utils/commandUtils.test.js +0 -479
  934. package/dist/src/ui/utils/commandUtils.test.js.map +0 -1
  935. package/dist/src/ui/utils/computeStats.test.d.ts +0 -6
  936. package/dist/src/ui/utils/computeStats.test.js +0 -271
  937. package/dist/src/ui/utils/computeStats.test.js.map +0 -1
  938. package/dist/src/ui/utils/directoryUtils.test.d.ts +0 -6
  939. package/dist/src/ui/utils/directoryUtils.test.js +0 -244
  940. package/dist/src/ui/utils/directoryUtils.test.js.map +0 -1
  941. package/dist/src/ui/utils/displayUtils.test.d.ts +0 -6
  942. package/dist/src/ui/utils/displayUtils.test.js +0 -61
  943. package/dist/src/ui/utils/displayUtils.test.js.map +0 -1
  944. package/dist/src/ui/utils/formatters.test.d.ts +0 -6
  945. package/dist/src/ui/utils/formatters.test.js +0 -124
  946. package/dist/src/ui/utils/formatters.test.js.map +0 -1
  947. package/dist/src/ui/utils/highlight.test.d.ts +0 -6
  948. package/dist/src/ui/utils/highlight.test.js +0 -198
  949. package/dist/src/ui/utils/highlight.test.js.map +0 -1
  950. package/dist/src/ui/utils/input.test.d.ts +0 -6
  951. package/dist/src/ui/utils/input.test.js +0 -44
  952. package/dist/src/ui/utils/input.test.js.map +0 -1
  953. package/dist/src/ui/utils/markdownUtilities.test.d.ts +0 -6
  954. package/dist/src/ui/utils/markdownUtilities.test.js +0 -42
  955. package/dist/src/ui/utils/markdownUtilities.test.js.map +0 -1
  956. package/dist/src/ui/utils/mouse.test.d.ts +0 -6
  957. package/dist/src/ui/utils/mouse.test.js +0 -136
  958. package/dist/src/ui/utils/mouse.test.js.map +0 -1
  959. package/dist/src/ui/utils/rewindFileOps.test.d.ts +0 -6
  960. package/dist/src/ui/utils/rewindFileOps.test.js +0 -375
  961. package/dist/src/ui/utils/rewindFileOps.test.js.map +0 -1
  962. package/dist/src/ui/utils/terminalCapabilityManager.test.d.ts +0 -6
  963. package/dist/src/ui/utils/terminalCapabilityManager.test.js +0 -220
  964. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +0 -1
  965. package/dist/src/ui/utils/terminalSetup.test.d.ts +0 -6
  966. package/dist/src/ui/utils/terminalSetup.test.js +0 -147
  967. package/dist/src/ui/utils/terminalSetup.test.js.map +0 -1
  968. package/dist/src/ui/utils/terminalUtils.test.d.ts +0 -6
  969. package/dist/src/ui/utils/terminalUtils.test.js +0 -40
  970. package/dist/src/ui/utils/terminalUtils.test.js.map +0 -1
  971. package/dist/src/ui/utils/textOutput.test.d.ts +0 -6
  972. package/dist/src/ui/utils/textOutput.test.js +0 -79
  973. package/dist/src/ui/utils/textOutput.test.js.map +0 -1
  974. package/dist/src/ui/utils/textUtils.test.d.ts +0 -6
  975. package/dist/src/ui/utils/textUtils.test.js +0 -168
  976. package/dist/src/ui/utils/textUtils.test.js.map +0 -1
  977. package/dist/src/ui/utils/ui-sizing.test.d.ts +0 -6
  978. package/dist/src/ui/utils/ui-sizing.test.js +0 -38
  979. package/dist/src/ui/utils/ui-sizing.test.js.map +0 -1
  980. package/dist/src/ui/utils/updateCheck.test.d.ts +0 -6
  981. package/dist/src/ui/utils/updateCheck.test.js +0 -134
  982. package/dist/src/ui/utils/updateCheck.test.js.map +0 -1
  983. package/dist/src/utils/agentUtils.test.d.ts +0 -6
  984. package/dist/src/utils/agentUtils.test.js +0 -121
  985. package/dist/src/utils/agentUtils.test.js.map +0 -1
  986. package/dist/src/utils/checks.test.d.ts +0 -6
  987. package/dist/src/utils/checks.test.js +0 -29
  988. package/dist/src/utils/checks.test.js.map +0 -1
  989. package/dist/src/utils/cleanup.test.d.ts +0 -6
  990. package/dist/src/utils/cleanup.test.js +0 -92
  991. package/dist/src/utils/cleanup.test.js.map +0 -1
  992. package/dist/src/utils/commands.test.d.ts +0 -6
  993. package/dist/src/utils/commands.test.js +0 -115
  994. package/dist/src/utils/commands.test.js.map +0 -1
  995. package/dist/src/utils/commentJson.test.d.ts +0 -6
  996. package/dist/src/utils/commentJson.test.js +0 -308
  997. package/dist/src/utils/commentJson.test.js.map +0 -1
  998. package/dist/src/utils/deepMerge.test.d.ts +0 -6
  999. package/dist/src/utils/deepMerge.test.js +0 -201
  1000. package/dist/src/utils/deepMerge.test.js.map +0 -1
  1001. package/dist/src/utils/dialogScopeUtils.test.d.ts +0 -6
  1002. package/dist/src/utils/dialogScopeUtils.test.js +0 -81
  1003. package/dist/src/utils/dialogScopeUtils.test.js.map +0 -1
  1004. package/dist/src/utils/envVarResolver.test.d.ts +0 -6
  1005. package/dist/src/utils/envVarResolver.test.js +0 -221
  1006. package/dist/src/utils/envVarResolver.test.js.map +0 -1
  1007. package/dist/src/utils/errors.test.d.ts +0 -6
  1008. package/dist/src/utils/errors.test.js +0 -435
  1009. package/dist/src/utils/errors.test.js.map +0 -1
  1010. package/dist/src/utils/events.test.d.ts +0 -6
  1011. package/dist/src/utils/events.test.js +0 -24
  1012. package/dist/src/utils/events.test.js.map +0 -1
  1013. package/dist/src/utils/gitUtils.test.d.ts +0 -6
  1014. package/dist/src/utils/gitUtils.test.js +0 -113
  1015. package/dist/src/utils/gitUtils.test.js.map +0 -1
  1016. package/dist/src/utils/handleAutoUpdate.test.d.ts +0 -6
  1017. package/dist/src/utils/handleAutoUpdate.test.js +0 -310
  1018. package/dist/src/utils/handleAutoUpdate.test.js.map +0 -1
  1019. package/dist/src/utils/installationInfo.test.d.ts +0 -6
  1020. package/dist/src/utils/installationInfo.test.js +0 -296
  1021. package/dist/src/utils/installationInfo.test.js.map +0 -1
  1022. package/dist/src/utils/jsonoutput.test.d.ts +0 -6
  1023. package/dist/src/utils/jsonoutput.test.js +0 -74
  1024. package/dist/src/utils/jsonoutput.test.js.map +0 -1
  1025. package/dist/src/utils/math.test.d.ts +0 -6
  1026. package/dist/src/utils/math.test.js +0 -23
  1027. package/dist/src/utils/math.test.js.map +0 -1
  1028. package/dist/src/utils/persistentState.test.d.ts +0 -6
  1029. package/dist/src/utils/persistentState.test.js +0 -68
  1030. package/dist/src/utils/persistentState.test.js.map +0 -1
  1031. package/dist/src/utils/processUtils.test.d.ts +0 -6
  1032. package/dist/src/utils/processUtils.test.js +0 -20
  1033. package/dist/src/utils/processUtils.test.js.map +0 -1
  1034. package/dist/src/utils/readStdin.test.d.ts +0 -6
  1035. package/dist/src/utils/readStdin.test.js +0 -117
  1036. package/dist/src/utils/readStdin.test.js.map +0 -1
  1037. package/dist/src/utils/readStdin_safety.test.d.ts +0 -6
  1038. package/dist/src/utils/readStdin_safety.test.js +0 -68
  1039. package/dist/src/utils/readStdin_safety.test.js.map +0 -1
  1040. package/dist/src/utils/relaunch.test.d.ts +0 -6
  1041. package/dist/src/utils/relaunch.test.js +0 -279
  1042. package/dist/src/utils/relaunch.test.js.map +0 -1
  1043. package/dist/src/utils/resolvePath.test.d.ts +0 -6
  1044. package/dist/src/utils/resolvePath.test.js +0 -34
  1045. package/dist/src/utils/resolvePath.test.js.map +0 -1
  1046. package/dist/src/utils/sandbox.test.d.ts +0 -6
  1047. package/dist/src/utils/sandbox.test.js +0 -314
  1048. package/dist/src/utils/sandbox.test.js.map +0 -1
  1049. package/dist/src/utils/sandboxUtils.test.d.ts +0 -6
  1050. package/dist/src/utils/sandboxUtils.test.js +0 -122
  1051. package/dist/src/utils/sandboxUtils.test.js.map +0 -1
  1052. package/dist/src/utils/sessionCleanup.integration.test.d.ts +0 -6
  1053. package/dist/src/utils/sessionCleanup.integration.test.js +0 -182
  1054. package/dist/src/utils/sessionCleanup.integration.test.js.map +0 -1
  1055. package/dist/src/utils/sessionCleanup.test.d.ts +0 -6
  1056. package/dist/src/utils/sessionCleanup.test.js +0 -1298
  1057. package/dist/src/utils/sessionCleanup.test.js.map +0 -1
  1058. package/dist/src/utils/sessionUtils.test.d.ts +0 -6
  1059. package/dist/src/utils/sessionUtils.test.js +0 -503
  1060. package/dist/src/utils/sessionUtils.test.js.map +0 -1
  1061. package/dist/src/utils/sessions.test.d.ts +0 -6
  1062. package/dist/src/utils/sessions.test.js +0 -581
  1063. package/dist/src/utils/sessions.test.js.map +0 -1
  1064. package/dist/src/utils/settingsUtils.test.d.ts +0 -6
  1065. package/dist/src/utils/settingsUtils.test.js +0 -808
  1066. package/dist/src/utils/settingsUtils.test.js.map +0 -1
  1067. package/dist/src/utils/skillUtils.test.d.ts +0 -6
  1068. package/dist/src/utils/skillUtils.test.js +0 -70
  1069. package/dist/src/utils/skillUtils.test.js.map +0 -1
  1070. package/dist/src/utils/startupWarnings.test.d.ts +0 -6
  1071. package/dist/src/utils/startupWarnings.test.js +0 -61
  1072. package/dist/src/utils/startupWarnings.test.js.map +0 -1
  1073. package/dist/src/utils/updateEventEmitter.test.d.ts +0 -6
  1074. package/dist/src/utils/updateEventEmitter.test.js +0 -18
  1075. package/dist/src/utils/updateEventEmitter.test.js.map +0 -1
  1076. package/dist/src/utils/userStartupWarnings.test.d.ts +0 -6
  1077. package/dist/src/utils/userStartupWarnings.test.js +0 -98
  1078. package/dist/src/utils/userStartupWarnings.test.js.map +0 -1
  1079. package/dist/src/utils/windowTitle.test.d.ts +0 -6
  1080. package/dist/src/utils/windowTitle.test.js +0 -216
  1081. package/dist/src/utils/windowTitle.test.js.map +0 -1
  1082. package/dist/src/validateNonInterActiveAuth.test.d.ts +0 -6
  1083. package/dist/src/validateNonInterActiveAuth.test.js +0 -319
  1084. package/dist/src/validateNonInterActiveAuth.test.js.map +0 -1
  1085. package/dist/src/zed-integration/fileSystemService.test.d.ts +0 -6
  1086. package/dist/src/zed-integration/fileSystemService.test.js +0 -88
  1087. package/dist/src/zed-integration/fileSystemService.test.js.map +0 -1
  1088. package/dist/src/zed-integration/zedIntegration.test.d.ts +0 -6
  1089. package/dist/src/zed-integration/zedIntegration.test.js +0 -625
  1090. package/dist/src/zed-integration/zedIntegration.test.js.map +0 -1
  1091. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,2072 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- /**
3
- * @license
4
- * Copyright 2025 Google LLC
5
- * SPDX-License-Identifier: Apache-2.0
6
- */
7
- import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
8
- import { render } from '../test-utils/render.js';
9
- import { waitFor } from '../test-utils/async.js';
10
- import { cleanup } from 'ink-testing-library';
11
- import { act, useContext } from 'react';
12
- import { AppContainer } from './AppContainer.js';
13
- import { SettingsContext } from './contexts/SettingsContext.js';
14
- import {} from './hooks/useReactToolScheduler.js';
15
- import { makeFakeConfig, CoreEvent, AuthType, } from '@didim365/agent-cli-core';
16
- // Mock coreEvents
17
- const mockCoreEvents = vi.hoisted(() => ({
18
- on: vi.fn(),
19
- off: vi.fn(),
20
- drainBacklogs: vi.fn(),
21
- emit: vi.fn(),
22
- }));
23
- // Mock IdeClient
24
- const mockIdeClient = vi.hoisted(() => ({
25
- getInstance: vi.fn().mockReturnValue(new Promise(() => { })),
26
- }));
27
- // Mock stdout
28
- const mocks = vi.hoisted(() => ({
29
- mockStdout: { write: vi.fn() },
30
- }));
31
- vi.mock('@didim365/agent-cli-core', async (importOriginal) => {
32
- const actual = await importOriginal();
33
- return {
34
- ...actual,
35
- coreEvents: mockCoreEvents,
36
- IdeClient: mockIdeClient,
37
- writeToStdout: vi.fn((...args) => process.stdout.write(...args)),
38
- writeToStderr: vi.fn((...args) => process.stderr.write(...args)),
39
- patchStdio: vi.fn(() => () => { }),
40
- createWorkingStdio: vi.fn(() => ({
41
- stdout: process.stdout,
42
- stderr: process.stderr,
43
- })),
44
- enableMouseEvents: vi.fn(),
45
- disableMouseEvents: vi.fn(),
46
- FileDiscoveryService: vi.fn().mockImplementation(() => ({
47
- initialize: vi.fn(),
48
- })),
49
- startupProfiler: {
50
- flush: vi.fn(),
51
- start: vi.fn(),
52
- end: vi.fn(),
53
- },
54
- };
55
- });
56
- import ansiEscapes from 'ansi-escapes';
57
- import { mergeSettings } from '../config/settings.js';
58
- import { useQuotaAndFallback } from './hooks/useQuotaAndFallback.js';
59
- import { UIStateContext } from './contexts/UIStateContext.js';
60
- import { UIActionsContext, } from './contexts/UIActionsContext.js';
61
- // Mock useStdout to capture terminal title writes
62
- vi.mock('ink', async (importOriginal) => {
63
- const actual = await importOriginal();
64
- return {
65
- ...actual,
66
- useStdout: () => ({ stdout: mocks.mockStdout }),
67
- measureElement: vi.fn(),
68
- };
69
- });
70
- // Helper component will read the context values provided by AppContainer
71
- // so we can assert against them in our tests.
72
- let capturedUIState;
73
- let capturedUIActions;
74
- function TestContextConsumer() {
75
- capturedUIState = useContext(UIStateContext);
76
- capturedUIActions = useContext(UIActionsContext);
77
- return null;
78
- }
79
- vi.mock('./App.js', () => ({
80
- App: TestContextConsumer,
81
- }));
82
- vi.mock('./hooks/useQuotaAndFallback.js');
83
- vi.mock('./hooks/useHistoryManager.js');
84
- vi.mock('./hooks/useThemeCommand.js');
85
- vi.mock('./auth/useAuth.js');
86
- vi.mock('./hooks/useEditorSettings.js');
87
- vi.mock('./hooks/useSettingsCommand.js');
88
- vi.mock('./hooks/useModelCommand.js');
89
- vi.mock('./hooks/slashCommandProcessor.js');
90
- vi.mock('./hooks/useConsoleMessages.js');
91
- vi.mock('./hooks/useTerminalSize.js', () => ({
92
- useTerminalSize: vi.fn(() => ({ columns: 80, rows: 24 })),
93
- }));
94
- vi.mock('./hooks/useGeminiStream.js');
95
- vi.mock('./hooks/vim.js');
96
- vi.mock('./hooks/useFocus.js');
97
- vi.mock('./hooks/useBracketedPaste.js');
98
- vi.mock('./hooks/useKeypress.js');
99
- vi.mock('./hooks/useLoadingIndicator.js');
100
- vi.mock('./hooks/useFolderTrust.js');
101
- vi.mock('./hooks/useIdeTrustListener.js');
102
- vi.mock('./hooks/useMessageQueue.js');
103
- vi.mock('./hooks/useApprovalModeIndicator.js');
104
- vi.mock('./hooks/useGitBranchName.js');
105
- vi.mock('./contexts/VimModeContext.js');
106
- vi.mock('./contexts/SessionContext.js');
107
- vi.mock('./components/shared/text-buffer.js');
108
- vi.mock('./hooks/useLogger.js');
109
- vi.mock('./hooks/useInputHistoryStore.js');
110
- vi.mock('./hooks/useHookDisplayState.js');
111
- // Mock external utilities
112
- vi.mock('../utils/events.js');
113
- vi.mock('../utils/handleAutoUpdate.js');
114
- vi.mock('./utils/ConsolePatcher.js');
115
- vi.mock('../utils/cleanup.js');
116
- import { useHistory } from './hooks/useHistoryManager.js';
117
- import { useThemeCommand } from './hooks/useThemeCommand.js';
118
- import { useAuthCommand } from './auth/useAuth.js';
119
- import { useEditorSettings } from './hooks/useEditorSettings.js';
120
- import { useSettingsCommand } from './hooks/useSettingsCommand.js';
121
- import { useModelCommand } from './hooks/useModelCommand.js';
122
- import { useSlashCommandProcessor } from './hooks/slashCommandProcessor.js';
123
- import { useConsoleMessages } from './hooks/useConsoleMessages.js';
124
- import { useGeminiStream } from './hooks/useGeminiStream.js';
125
- import { useVim } from './hooks/vim.js';
126
- import { useFolderTrust } from './hooks/useFolderTrust.js';
127
- import { useIdeTrustListener } from './hooks/useIdeTrustListener.js';
128
- import { useMessageQueue } from './hooks/useMessageQueue.js';
129
- import { useApprovalModeIndicator } from './hooks/useApprovalModeIndicator.js';
130
- import { useGitBranchName } from './hooks/useGitBranchName.js';
131
- import { useVimMode } from './contexts/VimModeContext.js';
132
- import { useSessionStats } from './contexts/SessionContext.js';
133
- import { useTextBuffer } from './components/shared/text-buffer.js';
134
- import { useLogger } from './hooks/useLogger.js';
135
- import { useLoadingIndicator } from './hooks/useLoadingIndicator.js';
136
- import { useInputHistoryStore } from './hooks/useInputHistoryStore.js';
137
- import { useHookDisplayState } from './hooks/useHookDisplayState.js';
138
- import { useKeypress } from './hooks/useKeypress.js';
139
- import { measureElement } from 'ink';
140
- import { useTerminalSize } from './hooks/useTerminalSize.js';
141
- import { ShellExecutionService, writeToStdout, enableMouseEvents, disableMouseEvents, } from '@didim365/agent-cli-core';
142
- import {} from '../config/extension-manager.js';
143
- describe('AppContainer State Management', () => {
144
- let mockConfig;
145
- let mockSettings;
146
- let mockInitResult;
147
- let mockExtensionManager;
148
- // Helper to generate the AppContainer JSX for render and rerender
149
- const getAppContainer = ({ settings = mockSettings, config = mockConfig, version = '1.0.0', initResult = mockInitResult, startupWarnings, resumedSessionData, } = {}) => (_jsx(SettingsContext.Provider, { value: settings, children: _jsx(AppContainer, { config: config, version: version, initializationResult: initResult, startupWarnings: startupWarnings, resumedSessionData: resumedSessionData }) }));
150
- // Helper to render the AppContainer
151
- const renderAppContainer = (props) => render(getAppContainer(props));
152
- // Create typed mocks for all hooks
153
- const mockedUseQuotaAndFallback = useQuotaAndFallback;
154
- const mockedUseHistory = useHistory;
155
- const mockedUseThemeCommand = useThemeCommand;
156
- const mockedUseAuthCommand = useAuthCommand;
157
- const mockedUseEditorSettings = useEditorSettings;
158
- const mockedUseSettingsCommand = useSettingsCommand;
159
- const mockedUseModelCommand = useModelCommand;
160
- const mockedUseSlashCommandProcessor = useSlashCommandProcessor;
161
- const mockedUseConsoleMessages = useConsoleMessages;
162
- const mockedUseGeminiStream = useGeminiStream;
163
- const mockedUseVim = useVim;
164
- const mockedUseFolderTrust = useFolderTrust;
165
- const mockedUseIdeTrustListener = useIdeTrustListener;
166
- const mockedUseMessageQueue = useMessageQueue;
167
- const mockedUseApprovalModeIndicator = useApprovalModeIndicator;
168
- const mockedUseGitBranchName = useGitBranchName;
169
- const mockedUseVimMode = useVimMode;
170
- const mockedUseSessionStats = useSessionStats;
171
- const mockedUseTextBuffer = useTextBuffer;
172
- const mockedUseLogger = useLogger;
173
- const mockedUseLoadingIndicator = useLoadingIndicator;
174
- const mockedUseKeypress = useKeypress;
175
- const mockedUseInputHistoryStore = useInputHistoryStore;
176
- const mockedUseHookDisplayState = useHookDisplayState;
177
- beforeEach(() => {
178
- vi.clearAllMocks();
179
- mockIdeClient.getInstance.mockReturnValue(new Promise(() => { }));
180
- // Initialize mock stdout for terminal title tests
181
- mocks.mockStdout.write.mockClear();
182
- capturedUIState = null;
183
- // **Provide a default return value for EVERY mocked hook.**
184
- mockedUseQuotaAndFallback.mockReturnValue({
185
- proQuotaRequest: null,
186
- handleProQuotaChoice: vi.fn(),
187
- });
188
- mockedUseHistory.mockReturnValue({
189
- history: [],
190
- addItem: vi.fn(),
191
- updateItem: vi.fn(),
192
- clearItems: vi.fn(),
193
- loadHistory: vi.fn(),
194
- });
195
- mockedUseThemeCommand.mockReturnValue({
196
- isThemeDialogOpen: false,
197
- openThemeDialog: vi.fn(),
198
- handleThemeSelect: vi.fn(),
199
- handleThemeHighlight: vi.fn(),
200
- });
201
- mockedUseAuthCommand.mockReturnValue({
202
- authState: 'authenticated',
203
- setAuthState: vi.fn(),
204
- authError: null,
205
- onAuthError: vi.fn(),
206
- });
207
- mockedUseEditorSettings.mockReturnValue({
208
- isEditorDialogOpen: false,
209
- openEditorDialog: vi.fn(),
210
- handleEditorSelect: vi.fn(),
211
- exitEditorDialog: vi.fn(),
212
- });
213
- mockedUseSettingsCommand.mockReturnValue({
214
- isSettingsDialogOpen: false,
215
- openSettingsDialog: vi.fn(),
216
- closeSettingsDialog: vi.fn(),
217
- });
218
- mockedUseModelCommand.mockReturnValue({
219
- isModelDialogOpen: false,
220
- openModelDialog: vi.fn(),
221
- closeModelDialog: vi.fn(),
222
- });
223
- mockedUseSlashCommandProcessor.mockReturnValue({
224
- handleSlashCommand: vi.fn(),
225
- slashCommands: [],
226
- pendingHistoryItems: [],
227
- commandContext: {},
228
- shellConfirmationRequest: null,
229
- confirmationRequest: null,
230
- });
231
- mockedUseConsoleMessages.mockReturnValue({
232
- consoleMessages: [],
233
- handleNewMessage: vi.fn(),
234
- clearConsoleMessages: vi.fn(),
235
- });
236
- mockedUseGeminiStream.mockReturnValue({
237
- streamingState: 'idle',
238
- submitQuery: vi.fn(),
239
- initError: null,
240
- pendingHistoryItems: [],
241
- thought: null,
242
- cancelOngoingRequest: vi.fn(),
243
- });
244
- mockedUseVim.mockReturnValue({ handleInput: vi.fn() });
245
- mockedUseFolderTrust.mockReturnValue({
246
- isFolderTrustDialogOpen: false,
247
- handleFolderTrustSelect: vi.fn(),
248
- isRestarting: false,
249
- });
250
- mockedUseIdeTrustListener.mockReturnValue({
251
- needsRestart: false,
252
- restartReason: 'NONE',
253
- });
254
- mockedUseMessageQueue.mockReturnValue({
255
- messageQueue: [],
256
- addMessage: vi.fn(),
257
- clearQueue: vi.fn(),
258
- getQueuedMessagesText: vi.fn().mockReturnValue(''),
259
- });
260
- mockedUseApprovalModeIndicator.mockReturnValue(false);
261
- mockedUseGitBranchName.mockReturnValue('main');
262
- mockedUseVimMode.mockReturnValue({
263
- isVimEnabled: false,
264
- toggleVimEnabled: vi.fn(),
265
- });
266
- mockedUseSessionStats.mockReturnValue({ stats: {} });
267
- mockedUseTextBuffer.mockReturnValue({
268
- text: '',
269
- setText: vi.fn(),
270
- // Add other properties if AppContainer uses them
271
- });
272
- mockedUseLogger.mockReturnValue({
273
- getPreviousUserMessages: vi.fn().mockResolvedValue([]),
274
- });
275
- mockedUseInputHistoryStore.mockReturnValue({
276
- inputHistory: [],
277
- addInput: vi.fn(),
278
- initializeFromLogger: vi.fn(),
279
- });
280
- mockedUseLoadingIndicator.mockReturnValue({
281
- elapsedTime: '0.0s',
282
- currentLoadingPhrase: '',
283
- });
284
- mockedUseHookDisplayState.mockReturnValue([]);
285
- // Mock Config
286
- mockConfig = makeFakeConfig();
287
- // Mock config's getTargetDir to return consistent workspace directory
288
- vi.spyOn(mockConfig, 'getTargetDir').mockReturnValue('/test/workspace');
289
- vi.spyOn(mockConfig, 'initialize').mockResolvedValue(undefined);
290
- vi.spyOn(mockConfig, 'getDebugMode').mockReturnValue(false);
291
- mockExtensionManager = vi.mockObject({
292
- getExtensions: vi.fn().mockReturnValue([]),
293
- setRequestConsent: vi.fn(),
294
- setRequestSetting: vi.fn(),
295
- start: vi.fn(),
296
- });
297
- vi.spyOn(mockConfig, 'getExtensionLoader').mockReturnValue(mockExtensionManager);
298
- // Mock LoadedSettings
299
- const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
300
- mockSettings = {
301
- merged: {
302
- ...defaultMergedSettings,
303
- hideBanner: false,
304
- hideFooter: false,
305
- hideTips: false,
306
- showMemoryUsage: false,
307
- theme: 'default',
308
- ui: {
309
- ...defaultMergedSettings.ui,
310
- showStatusInTitle: false,
311
- hideWindowTitle: false,
312
- },
313
- useAlternateBuffer: false,
314
- },
315
- };
316
- // Mock InitializationResult
317
- mockInitResult = {
318
- themeError: null,
319
- authError: null,
320
- shouldOpenAuthDialog: false,
321
- geminiMdFileCount: 0,
322
- };
323
- });
324
- afterEach(() => {
325
- cleanup();
326
- vi.restoreAllMocks();
327
- });
328
- describe('Basic Rendering', () => {
329
- it('renders without crashing with minimal props', async () => {
330
- let unmount;
331
- await act(async () => {
332
- const result = renderAppContainer();
333
- unmount = result.unmount;
334
- });
335
- await waitFor(() => expect(capturedUIState).toBeTruthy());
336
- unmount();
337
- });
338
- it('renders with startup warnings', async () => {
339
- const startupWarnings = ['Warning 1', 'Warning 2'];
340
- let unmount;
341
- await act(async () => {
342
- const result = renderAppContainer({ startupWarnings });
343
- unmount = result.unmount;
344
- });
345
- await waitFor(() => expect(capturedUIState).toBeTruthy());
346
- unmount();
347
- });
348
- });
349
- describe('State Initialization', () => {
350
- it('initializes with theme error from initialization result', async () => {
351
- const initResultWithError = {
352
- ...mockInitResult,
353
- themeError: 'Failed to load theme',
354
- };
355
- let unmount;
356
- await act(async () => {
357
- const result = renderAppContainer({
358
- initResult: initResultWithError,
359
- });
360
- unmount = result.unmount;
361
- });
362
- await waitFor(() => expect(capturedUIState).toBeTruthy());
363
- unmount();
364
- });
365
- it('handles debug mode state', () => {
366
- const debugConfig = makeFakeConfig();
367
- vi.spyOn(debugConfig, 'getDebugMode').mockReturnValue(true);
368
- expect(() => {
369
- renderAppContainer({ config: debugConfig });
370
- }).not.toThrow();
371
- });
372
- });
373
- describe('Context Providers', () => {
374
- it('provides AppContext with correct values', async () => {
375
- let unmount;
376
- await act(async () => {
377
- const result = renderAppContainer({ version: '2.0.0' });
378
- unmount = result.unmount;
379
- });
380
- await waitFor(() => expect(capturedUIState).toBeTruthy());
381
- // Should render and unmount cleanly
382
- expect(() => unmount()).not.toThrow();
383
- });
384
- it('provides UIStateContext with state management', async () => {
385
- let unmount;
386
- await act(async () => {
387
- const result = renderAppContainer();
388
- unmount = result.unmount;
389
- });
390
- await waitFor(() => expect(capturedUIState).toBeTruthy());
391
- unmount();
392
- });
393
- it('provides UIActionsContext with action handlers', async () => {
394
- let unmount;
395
- await act(async () => {
396
- const result = renderAppContainer();
397
- unmount = result.unmount;
398
- });
399
- await waitFor(() => expect(capturedUIState).toBeTruthy());
400
- unmount();
401
- });
402
- it('provides ConfigContext with config object', async () => {
403
- let unmount;
404
- await act(async () => {
405
- const result = renderAppContainer();
406
- unmount = result.unmount;
407
- });
408
- await waitFor(() => expect(capturedUIState).toBeTruthy());
409
- unmount();
410
- });
411
- });
412
- describe('Settings Integration', () => {
413
- it('handles settings with all display options disabled', async () => {
414
- const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
415
- const settingsAllHidden = {
416
- merged: {
417
- ...defaultMergedSettings,
418
- hideBanner: true,
419
- hideFooter: true,
420
- hideTips: true,
421
- showMemoryUsage: false,
422
- },
423
- };
424
- let unmount;
425
- await act(async () => {
426
- const result = renderAppContainer({ settings: settingsAllHidden });
427
- unmount = result.unmount;
428
- });
429
- await waitFor(() => expect(capturedUIState).toBeTruthy());
430
- unmount();
431
- });
432
- it('handles settings with memory usage enabled', async () => {
433
- const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
434
- const settingsWithMemory = {
435
- merged: {
436
- ...defaultMergedSettings,
437
- hideBanner: false,
438
- hideFooter: false,
439
- hideTips: false,
440
- showMemoryUsage: true,
441
- },
442
- };
443
- let unmount;
444
- await act(async () => {
445
- const result = renderAppContainer({ settings: settingsWithMemory });
446
- unmount = result.unmount;
447
- });
448
- await waitFor(() => expect(capturedUIState).toBeTruthy());
449
- unmount();
450
- });
451
- });
452
- describe('Version Handling', () => {
453
- it.each(['1.0.0', '2.1.3-beta', '3.0.0-nightly'])('handles version format: %s', async (version) => {
454
- let unmount;
455
- await act(async () => {
456
- const result = renderAppContainer({ version });
457
- unmount = result.unmount;
458
- });
459
- await waitFor(() => expect(capturedUIState).toBeTruthy());
460
- unmount();
461
- });
462
- });
463
- describe('Error Handling', () => {
464
- it('handles config methods that might throw', async () => {
465
- const errorConfig = makeFakeConfig();
466
- vi.spyOn(errorConfig, 'getModel').mockImplementation(() => {
467
- throw new Error('Config error');
468
- });
469
- // Should still render without crashing - errors should be handled internally
470
- const { unmount } = renderAppContainer({ config: errorConfig });
471
- unmount();
472
- });
473
- it('handles undefined settings gracefully', async () => {
474
- const undefinedSettings = {
475
- merged: mergeSettings({}, {}, {}, {}, true),
476
- };
477
- let unmount;
478
- await act(async () => {
479
- const result = renderAppContainer({ settings: undefinedSettings });
480
- unmount = result.unmount;
481
- });
482
- await waitFor(() => expect(capturedUIState).toBeTruthy());
483
- unmount();
484
- });
485
- });
486
- describe('Provider Hierarchy', () => {
487
- it('establishes correct provider nesting order', () => {
488
- // This tests that all the context providers are properly nested
489
- // and that the component tree can be built without circular dependencies
490
- const { unmount } = renderAppContainer();
491
- expect(() => unmount()).not.toThrow();
492
- });
493
- });
494
- describe('Session Resumption', () => {
495
- it('handles resumed session data correctly', async () => {
496
- const mockResumedSessionData = {
497
- conversation: {
498
- sessionId: 'test-session-123',
499
- projectHash: 'test-project-hash',
500
- startTime: '2024-01-01T00:00:00Z',
501
- lastUpdated: '2024-01-01T00:00:01Z',
502
- messages: [
503
- {
504
- id: 'msg-1',
505
- type: 'user',
506
- content: 'Hello',
507
- timestamp: '2024-01-01T00:00:00Z',
508
- },
509
- {
510
- id: 'msg-2',
511
- type: 'gemini',
512
- content: 'Hi there!',
513
- role: 'model',
514
- parts: [{ text: 'Hi there!' }],
515
- timestamp: '2024-01-01T00:00:01Z',
516
- },
517
- ],
518
- },
519
- filePath: '/tmp/test-session.json',
520
- };
521
- let unmount;
522
- await act(async () => {
523
- const result = renderAppContainer({
524
- config: mockConfig,
525
- settings: mockSettings,
526
- version: '1.0.0',
527
- initResult: mockInitResult,
528
- resumedSessionData: mockResumedSessionData,
529
- });
530
- unmount = result.unmount;
531
- });
532
- await act(async () => {
533
- unmount();
534
- });
535
- });
536
- it('renders without resumed session data', async () => {
537
- let unmount;
538
- await act(async () => {
539
- const result = renderAppContainer({
540
- config: mockConfig,
541
- settings: mockSettings,
542
- version: '1.0.0',
543
- initResult: mockInitResult,
544
- resumedSessionData: undefined,
545
- });
546
- unmount = result.unmount;
547
- });
548
- await act(async () => {
549
- unmount();
550
- });
551
- });
552
- it('initializes chat recording service when config has it', () => {
553
- const mockChatRecordingService = {
554
- initialize: vi.fn(),
555
- recordMessage: vi.fn(),
556
- recordMessageTokens: vi.fn(),
557
- recordToolCalls: vi.fn(),
558
- };
559
- const mockGeminiClient = {
560
- isInitialized: vi.fn(() => true),
561
- resumeChat: vi.fn(),
562
- getUserTier: vi.fn(),
563
- getChatRecordingService: vi.fn(() => mockChatRecordingService),
564
- };
565
- const configWithRecording = {
566
- ...mockConfig,
567
- getGeminiClient: vi.fn(() => mockGeminiClient),
568
- };
569
- expect(() => {
570
- renderAppContainer({
571
- config: configWithRecording,
572
- settings: mockSettings,
573
- version: '1.0.0',
574
- initResult: mockInitResult,
575
- });
576
- }).not.toThrow();
577
- });
578
- });
579
- describe('Session Recording Integration', () => {
580
- it('provides chat recording service configuration', () => {
581
- const mockChatRecordingService = {
582
- initialize: vi.fn(),
583
- recordMessage: vi.fn(),
584
- recordMessageTokens: vi.fn(),
585
- recordToolCalls: vi.fn(),
586
- getSessionId: vi.fn(() => 'test-session-123'),
587
- getCurrentConversation: vi.fn(),
588
- };
589
- const mockGeminiClient = {
590
- isInitialized: vi.fn(() => true),
591
- resumeChat: vi.fn(),
592
- getUserTier: vi.fn(),
593
- getChatRecordingService: vi.fn(() => mockChatRecordingService),
594
- setHistory: vi.fn(),
595
- };
596
- const configWithRecording = {
597
- ...mockConfig,
598
- getGeminiClient: vi.fn(() => mockGeminiClient),
599
- getSessionId: vi.fn(() => 'test-session-123'),
600
- };
601
- expect(() => {
602
- renderAppContainer({
603
- config: configWithRecording,
604
- settings: mockSettings,
605
- version: '1.0.0',
606
- initResult: mockInitResult,
607
- });
608
- }).not.toThrow();
609
- // Verify the recording service structure is correct
610
- expect(configWithRecording.getGeminiClient).toBeDefined();
611
- expect(mockGeminiClient.getChatRecordingService).toBeDefined();
612
- expect(mockChatRecordingService.initialize).toBeDefined();
613
- expect(mockChatRecordingService.recordMessage).toBeDefined();
614
- });
615
- it('handles session recording when messages are added', () => {
616
- const mockRecordMessage = vi.fn();
617
- const mockRecordMessageTokens = vi.fn();
618
- const mockChatRecordingService = {
619
- initialize: vi.fn(),
620
- recordMessage: mockRecordMessage,
621
- recordMessageTokens: mockRecordMessageTokens,
622
- recordToolCalls: vi.fn(),
623
- getSessionId: vi.fn(() => 'test-session-123'),
624
- };
625
- const mockGeminiClient = {
626
- isInitialized: vi.fn(() => true),
627
- getChatRecordingService: vi.fn(() => mockChatRecordingService),
628
- getUserTier: vi.fn(),
629
- };
630
- const configWithRecording = {
631
- ...mockConfig,
632
- getGeminiClient: vi.fn(() => mockGeminiClient),
633
- };
634
- renderAppContainer({
635
- config: configWithRecording,
636
- settings: mockSettings,
637
- version: '1.0.0',
638
- initResult: mockInitResult,
639
- });
640
- // The actual recording happens through the useHistory hook
641
- // which would be triggered by user interactions
642
- expect(mockChatRecordingService.initialize).toBeDefined();
643
- expect(mockChatRecordingService.recordMessage).toBeDefined();
644
- });
645
- });
646
- describe('Session Resume Flow', () => {
647
- it('accepts resumed session data', () => {
648
- const mockResumeChat = vi.fn();
649
- const mockGeminiClient = {
650
- isInitialized: vi.fn(() => true),
651
- resumeChat: mockResumeChat,
652
- getUserTier: vi.fn(),
653
- getChatRecordingService: vi.fn(() => ({
654
- initialize: vi.fn(),
655
- recordMessage: vi.fn(),
656
- recordMessageTokens: vi.fn(),
657
- recordToolCalls: vi.fn(),
658
- })),
659
- };
660
- const configWithClient = {
661
- ...mockConfig,
662
- getGeminiClient: vi.fn(() => mockGeminiClient),
663
- };
664
- const resumedData = {
665
- conversation: {
666
- sessionId: 'resumed-session-456',
667
- projectHash: 'project-hash',
668
- startTime: '2024-01-01T00:00:00Z',
669
- lastUpdated: '2024-01-01T00:01:00Z',
670
- messages: [
671
- {
672
- id: 'msg-1',
673
- type: 'user',
674
- content: 'Previous question',
675
- timestamp: '2024-01-01T00:00:00Z',
676
- },
677
- {
678
- id: 'msg-2',
679
- type: 'gemini',
680
- content: 'Previous answer',
681
- role: 'model',
682
- parts: [{ text: 'Previous answer' }],
683
- timestamp: '2024-01-01T00:00:30Z',
684
- tokenCount: { input: 10, output: 20 },
685
- },
686
- ],
687
- },
688
- filePath: '/tmp/resumed-session.json',
689
- };
690
- expect(() => {
691
- renderAppContainer({
692
- config: configWithClient,
693
- settings: mockSettings,
694
- version: '1.0.0',
695
- initResult: mockInitResult,
696
- resumedSessionData: resumedData,
697
- });
698
- }).not.toThrow();
699
- // Verify the resume functionality structure is in place
700
- expect(mockGeminiClient.resumeChat).toBeDefined();
701
- expect(resumedData.conversation.messages).toHaveLength(2);
702
- });
703
- it('does not attempt resume when client is not initialized', () => {
704
- const mockResumeChat = vi.fn();
705
- const mockGeminiClient = {
706
- isInitialized: vi.fn(() => false), // Not initialized
707
- resumeChat: mockResumeChat,
708
- getUserTier: vi.fn(),
709
- getChatRecordingService: vi.fn(),
710
- };
711
- const configWithClient = {
712
- ...mockConfig,
713
- getGeminiClient: vi.fn(() => mockGeminiClient),
714
- };
715
- const resumedData = {
716
- conversation: {
717
- sessionId: 'test-session',
718
- projectHash: 'project-hash',
719
- startTime: '2024-01-01T00:00:00Z',
720
- lastUpdated: '2024-01-01T00:01:00Z',
721
- messages: [],
722
- },
723
- filePath: '/tmp/session.json',
724
- };
725
- renderAppContainer({
726
- config: configWithClient,
727
- settings: mockSettings,
728
- version: '1.0.0',
729
- initResult: mockInitResult,
730
- resumedSessionData: resumedData,
731
- });
732
- // Should not call resumeChat when client is not initialized
733
- expect(mockResumeChat).not.toHaveBeenCalled();
734
- });
735
- });
736
- describe('Token Counting from Session Stats', () => {
737
- it('tracks token counts from session messages', () => {
738
- // Session stats are provided through the SessionStatsProvider context
739
- // in the real app, not through the config directly
740
- const mockChatRecordingService = {
741
- initialize: vi.fn(),
742
- recordMessage: vi.fn(),
743
- recordMessageTokens: vi.fn(),
744
- recordToolCalls: vi.fn(),
745
- getSessionId: vi.fn(() => 'test-session-123'),
746
- getCurrentConversation: vi.fn(() => ({
747
- sessionId: 'test-session-123',
748
- messages: [],
749
- totalInputTokens: 150,
750
- totalOutputTokens: 350,
751
- })),
752
- };
753
- const mockGeminiClient = {
754
- isInitialized: vi.fn(() => true),
755
- getChatRecordingService: vi.fn(() => mockChatRecordingService),
756
- getUserTier: vi.fn(),
757
- };
758
- const configWithRecording = {
759
- ...mockConfig,
760
- getGeminiClient: vi.fn(() => mockGeminiClient),
761
- };
762
- renderAppContainer({
763
- config: configWithRecording,
764
- settings: mockSettings,
765
- version: '1.0.0',
766
- initResult: mockInitResult,
767
- });
768
- // In the actual app, these stats would be displayed in components
769
- // and updated as messages are processed through the recording service
770
- expect(mockChatRecordingService.recordMessageTokens).toBeDefined();
771
- expect(mockChatRecordingService.getCurrentConversation).toBeDefined();
772
- });
773
- });
774
- describe('Quota and Fallback Integration', () => {
775
- it('passes a null proQuotaRequest to UIStateContext by default', async () => {
776
- // The default mock from beforeEach already sets proQuotaRequest to null
777
- let unmount;
778
- await act(async () => {
779
- const result = renderAppContainer();
780
- unmount = result.unmount;
781
- });
782
- await waitFor(() => {
783
- // Assert that the context value is as expected
784
- expect(capturedUIState.proQuotaRequest).toBeNull();
785
- });
786
- unmount();
787
- });
788
- it('passes a valid proQuotaRequest to UIStateContext when provided by the hook', async () => {
789
- // Arrange: Create a mock request object that a UI dialog would receive
790
- const mockRequest = {
791
- failedModel: 'gemini-pro',
792
- fallbackModel: 'gemini-flash',
793
- resolve: vi.fn(),
794
- };
795
- mockedUseQuotaAndFallback.mockReturnValue({
796
- proQuotaRequest: mockRequest,
797
- handleProQuotaChoice: vi.fn(),
798
- });
799
- // Act: Render the container
800
- let unmount;
801
- await act(async () => {
802
- const result = renderAppContainer();
803
- unmount = result.unmount;
804
- });
805
- await waitFor(() => {
806
- // Assert: The mock request is correctly passed through the context
807
- expect(capturedUIState.proQuotaRequest).toEqual(mockRequest);
808
- });
809
- unmount();
810
- });
811
- it('passes the handleProQuotaChoice function to UIActionsContext', async () => {
812
- // Arrange: Create a mock handler function
813
- const mockHandler = vi.fn();
814
- mockedUseQuotaAndFallback.mockReturnValue({
815
- proQuotaRequest: null,
816
- handleProQuotaChoice: mockHandler,
817
- });
818
- // Act: Render the container
819
- let unmount;
820
- await act(async () => {
821
- const result = renderAppContainer();
822
- unmount = result.unmount;
823
- });
824
- await waitFor(() => {
825
- // Assert: The action in the context is the mock handler we provided
826
- expect(capturedUIActions.handleProQuotaChoice).toBe(mockHandler);
827
- });
828
- // You can even verify that the plumbed function is callable
829
- act(() => {
830
- capturedUIActions.handleProQuotaChoice('retry_later');
831
- });
832
- expect(mockHandler).toHaveBeenCalledWith('retry_later');
833
- unmount();
834
- });
835
- });
836
- describe('Terminal Title Update Feature', () => {
837
- beforeEach(() => {
838
- // Reset mock stdout for each test
839
- mocks.mockStdout.write.mockClear();
840
- });
841
- it('verifies useStdout is mocked', async () => {
842
- const { useStdout } = await import('ink');
843
- const { stdout } = useStdout();
844
- expect(stdout).toBe(mocks.mockStdout);
845
- });
846
- it('should update terminal title with Working… when showStatusInTitle is false', () => {
847
- // Arrange: Set up mock settings with showStatusInTitle disabled
848
- const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
849
- const mockSettingsWithShowStatusFalse = {
850
- ...mockSettings,
851
- merged: {
852
- ...defaultMergedSettings,
853
- ui: {
854
- ...defaultMergedSettings.ui,
855
- showStatusInTitle: false,
856
- hideWindowTitle: false,
857
- },
858
- },
859
- };
860
- // Mock the streaming state as Active
861
- mockedUseGeminiStream.mockReturnValue({
862
- streamingState: 'responding',
863
- submitQuery: vi.fn(),
864
- initError: null,
865
- pendingHistoryItems: [],
866
- thought: { subject: 'Some thought' },
867
- cancelOngoingRequest: vi.fn(),
868
- });
869
- // Act: Render the container
870
- const { unmount } = renderAppContainer({
871
- settings: mockSettingsWithShowStatusFalse,
872
- });
873
- // Assert: Check that title was updated with "Working…"
874
- const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
875
- expect(titleWrites).toHaveLength(1);
876
- expect(titleWrites[0][0]).toBe(`\x1b]0;${'✦ Working… (workspace)'.padEnd(80, ' ')}\x07`);
877
- unmount();
878
- });
879
- it('should use legacy terminal title when dynamicWindowTitle is false', () => {
880
- // Arrange: Set up mock settings with dynamicWindowTitle disabled
881
- const mockSettingsWithDynamicTitleFalse = {
882
- ...mockSettings,
883
- merged: {
884
- ...mockSettings.merged,
885
- ui: {
886
- ...mockSettings.merged.ui,
887
- dynamicWindowTitle: false,
888
- hideWindowTitle: false,
889
- },
890
- },
891
- };
892
- // Mock the streaming state
893
- mockedUseGeminiStream.mockReturnValue({
894
- streamingState: 'responding',
895
- submitQuery: vi.fn(),
896
- initError: null,
897
- pendingHistoryItems: [],
898
- thought: { subject: 'Some thought' },
899
- cancelOngoingRequest: vi.fn(),
900
- });
901
- // Act: Render the container
902
- const { unmount } = renderAppContainer({
903
- settings: mockSettingsWithDynamicTitleFalse,
904
- });
905
- // Assert: Check that legacy title was used
906
- const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
907
- expect(titleWrites).toHaveLength(1);
908
- expect(titleWrites[0][0]).toBe(`\x1b]0;${'Gemini CLI (workspace)'.padEnd(80, ' ')}\x07`);
909
- unmount();
910
- });
911
- it('should not update terminal title when hideWindowTitle is true', () => {
912
- // Arrange: Set up mock settings with hideWindowTitle enabled
913
- const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
914
- const mockSettingsWithHideTitleTrue = {
915
- ...mockSettings,
916
- merged: {
917
- ...defaultMergedSettings,
918
- ui: {
919
- ...defaultMergedSettings.ui,
920
- showStatusInTitle: true,
921
- hideWindowTitle: true,
922
- },
923
- },
924
- };
925
- // Act: Render the container
926
- const { unmount } = renderAppContainer({
927
- settings: mockSettingsWithHideTitleTrue,
928
- });
929
- // Assert: Check that no title-related writes occurred
930
- const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
931
- expect(titleWrites).toHaveLength(0);
932
- unmount();
933
- });
934
- it('should update terminal title with thought subject when in active state', () => {
935
- // Arrange: Set up mock settings with showStatusInTitle enabled
936
- const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
937
- const mockSettingsWithTitleEnabled = {
938
- ...mockSettings,
939
- merged: {
940
- ...defaultMergedSettings,
941
- ui: {
942
- ...defaultMergedSettings.ui,
943
- showStatusInTitle: true,
944
- hideWindowTitle: false,
945
- },
946
- },
947
- };
948
- // Mock the streaming state and thought
949
- const thoughtSubject = 'Processing request';
950
- mockedUseGeminiStream.mockReturnValue({
951
- streamingState: 'responding',
952
- submitQuery: vi.fn(),
953
- initError: null,
954
- pendingHistoryItems: [],
955
- thought: { subject: thoughtSubject },
956
- cancelOngoingRequest: vi.fn(),
957
- });
958
- // Act: Render the container
959
- const { unmount } = renderAppContainer({
960
- settings: mockSettingsWithTitleEnabled,
961
- });
962
- // Assert: Check that title was updated with thought subject and suffix
963
- const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
964
- expect(titleWrites).toHaveLength(1);
965
- expect(titleWrites[0][0]).toBe(`\x1b]0;${`✦ ${thoughtSubject} (workspace)`.padEnd(80, ' ')}\x07`);
966
- unmount();
967
- });
968
- it('should update terminal title with default text when in Idle state and no thought subject', () => {
969
- // Arrange: Set up mock settings with showStatusInTitle enabled
970
- const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
971
- const mockSettingsWithTitleEnabled = {
972
- ...mockSettings,
973
- merged: {
974
- ...defaultMergedSettings,
975
- ui: {
976
- ...defaultMergedSettings.ui,
977
- showStatusInTitle: true,
978
- hideWindowTitle: false,
979
- },
980
- },
981
- };
982
- // Mock the streaming state as Idle with no thought
983
- mockedUseGeminiStream.mockReturnValue({
984
- streamingState: 'idle',
985
- submitQuery: vi.fn(),
986
- initError: null,
987
- pendingHistoryItems: [],
988
- thought: null,
989
- cancelOngoingRequest: vi.fn(),
990
- });
991
- // Act: Render the container
992
- const { unmount } = renderAppContainer({
993
- settings: mockSettingsWithTitleEnabled,
994
- });
995
- // Assert: Check that title was updated with default Idle text
996
- const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
997
- expect(titleWrites).toHaveLength(1);
998
- expect(titleWrites[0][0]).toBe(`\x1b]0;${'◇ Ready (workspace)'.padEnd(80, ' ')}\x07`);
999
- unmount();
1000
- });
1001
- it('should update terminal title when in WaitingForConfirmation state with thought subject', async () => {
1002
- // Arrange: Set up mock settings with showStatusInTitle enabled
1003
- const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
1004
- const mockSettingsWithTitleEnabled = {
1005
- ...mockSettings,
1006
- merged: {
1007
- ...defaultMergedSettings,
1008
- ui: {
1009
- ...defaultMergedSettings.ui,
1010
- showStatusInTitle: true,
1011
- hideWindowTitle: false,
1012
- },
1013
- },
1014
- };
1015
- // Mock the streaming state and thought
1016
- const thoughtSubject = 'Confirm tool execution';
1017
- mockedUseGeminiStream.mockReturnValue({
1018
- streamingState: 'waiting_for_confirmation',
1019
- submitQuery: vi.fn(),
1020
- initError: null,
1021
- pendingHistoryItems: [],
1022
- thought: { subject: thoughtSubject },
1023
- cancelOngoingRequest: vi.fn(),
1024
- });
1025
- // Act: Render the container
1026
- let unmount;
1027
- await act(async () => {
1028
- const result = renderAppContainer({
1029
- settings: mockSettingsWithTitleEnabled,
1030
- });
1031
- unmount = result.unmount;
1032
- });
1033
- // Assert: Check that title was updated with confirmation text
1034
- const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
1035
- expect(titleWrites).toHaveLength(1);
1036
- expect(titleWrites[0][0]).toBe(`\x1b]0;${'✋ Action Required (workspace)'.padEnd(80, ' ')}\x07`);
1037
- unmount();
1038
- });
1039
- describe('Shell Focus Action Required', () => {
1040
- beforeEach(() => {
1041
- vi.useFakeTimers();
1042
- });
1043
- afterEach(() => {
1044
- vi.useRealTimers();
1045
- });
1046
- it('should show Action Required in title after a delay when shell is awaiting focus', async () => {
1047
- const startTime = 1000000;
1048
- vi.setSystemTime(startTime);
1049
- // Arrange: Set up mock settings with showStatusInTitle enabled
1050
- const mockSettingsWithTitleEnabled = {
1051
- ...mockSettings,
1052
- merged: {
1053
- ...mockSettings.merged,
1054
- ui: {
1055
- ...mockSettings.merged.ui,
1056
- showStatusInTitle: true,
1057
- hideWindowTitle: false,
1058
- },
1059
- },
1060
- };
1061
- // Mock an active shell pty but not focused
1062
- mockedUseGeminiStream.mockReturnValue({
1063
- streamingState: 'responding',
1064
- submitQuery: vi.fn(),
1065
- initError: null,
1066
- pendingHistoryItems: [],
1067
- thought: { subject: 'Executing shell command' },
1068
- cancelOngoingRequest: vi.fn(),
1069
- pendingToolCalls: [],
1070
- handleApprovalModeChange: vi.fn(),
1071
- activePtyId: 'pty-1',
1072
- loopDetectionConfirmationRequest: null,
1073
- lastOutputTime: startTime + 100, // Trigger aggressive delay
1074
- retryStatus: null,
1075
- });
1076
- vi.spyOn(mockConfig, 'isInteractive').mockReturnValue(true);
1077
- vi.spyOn(mockConfig, 'isInteractiveShellEnabled').mockReturnValue(true);
1078
- // Act: Render the container (embeddedShellFocused is false by default in state)
1079
- const { unmount } = renderAppContainer({
1080
- settings: mockSettingsWithTitleEnabled,
1081
- });
1082
- // Initially it should show the working status
1083
- const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
1084
- expect(titleWrites[titleWrites.length - 1][0]).toContain('✦ Executing shell command');
1085
- // Fast-forward time by 40 seconds
1086
- await act(async () => {
1087
- await vi.advanceTimersByTimeAsync(40000);
1088
- });
1089
- // Now it should show Action Required
1090
- const titleWritesDelayed = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
1091
- const lastTitle = titleWritesDelayed[titleWritesDelayed.length - 1][0];
1092
- expect(lastTitle).toContain('✋ Action Required');
1093
- unmount();
1094
- });
1095
- it('should show Working… in title for redirected commands after 2 mins', async () => {
1096
- const startTime = 1000000;
1097
- vi.setSystemTime(startTime);
1098
- // Arrange: Set up mock settings with showStatusInTitle enabled
1099
- const mockSettingsWithTitleEnabled = {
1100
- ...mockSettings,
1101
- merged: {
1102
- ...mockSettings.merged,
1103
- ui: {
1104
- ...mockSettings.merged.ui,
1105
- showStatusInTitle: true,
1106
- hideWindowTitle: false,
1107
- },
1108
- },
1109
- };
1110
- // Mock an active shell pty with redirection active
1111
- mockedUseGeminiStream.mockReturnValue({
1112
- streamingState: 'responding',
1113
- submitQuery: vi.fn(),
1114
- initError: null,
1115
- pendingHistoryItems: [],
1116
- thought: { subject: 'Executing shell command' },
1117
- cancelOngoingRequest: vi.fn(),
1118
- pendingToolCalls: [
1119
- {
1120
- request: {
1121
- name: 'run_shell_command',
1122
- args: { command: 'ls > out' },
1123
- },
1124
- status: 'executing',
1125
- },
1126
- ],
1127
- handleApprovalModeChange: vi.fn(),
1128
- activePtyId: 'pty-1',
1129
- loopDetectionConfirmationRequest: null,
1130
- lastOutputTime: startTime,
1131
- retryStatus: null,
1132
- });
1133
- vi.spyOn(mockConfig, 'isInteractive').mockReturnValue(true);
1134
- vi.spyOn(mockConfig, 'isInteractiveShellEnabled').mockReturnValue(true);
1135
- const { unmount } = renderAppContainer({
1136
- settings: mockSettingsWithTitleEnabled,
1137
- });
1138
- // Fast-forward time by 65 seconds - should still NOT be Action Required
1139
- await act(async () => {
1140
- await vi.advanceTimersByTimeAsync(65000);
1141
- });
1142
- const titleWritesMid = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
1143
- expect(titleWritesMid[titleWritesMid.length - 1][0]).not.toContain('✋ Action Required');
1144
- // Fast-forward to 2 minutes (120000ms)
1145
- await act(async () => {
1146
- await vi.advanceTimersByTimeAsync(60000);
1147
- });
1148
- const titleWritesEnd = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
1149
- expect(titleWritesEnd[titleWritesEnd.length - 1][0]).toContain('⏲ Working…');
1150
- unmount();
1151
- });
1152
- it('should show Working… in title for silent non-redirected commands after 1 min', async () => {
1153
- const startTime = 1000000;
1154
- vi.setSystemTime(startTime);
1155
- // Arrange: Set up mock settings with showStatusInTitle enabled
1156
- const mockSettingsWithTitleEnabled = {
1157
- ...mockSettings,
1158
- merged: {
1159
- ...mockSettings.merged,
1160
- ui: {
1161
- ...mockSettings.merged.ui,
1162
- showStatusInTitle: true,
1163
- hideWindowTitle: false,
1164
- },
1165
- },
1166
- };
1167
- // Mock an active shell pty with NO output since operation started (silent)
1168
- mockedUseGeminiStream.mockReturnValue({
1169
- streamingState: 'responding',
1170
- submitQuery: vi.fn(),
1171
- initError: null,
1172
- pendingHistoryItems: [],
1173
- thought: { subject: 'Executing shell command' },
1174
- cancelOngoingRequest: vi.fn(),
1175
- pendingToolCalls: [],
1176
- handleApprovalModeChange: vi.fn(),
1177
- activePtyId: 'pty-1',
1178
- loopDetectionConfirmationRequest: null,
1179
- lastOutputTime: startTime, // lastOutputTime <= operationStartTime
1180
- retryStatus: null,
1181
- });
1182
- vi.spyOn(mockConfig, 'isInteractive').mockReturnValue(true);
1183
- vi.spyOn(mockConfig, 'isInteractiveShellEnabled').mockReturnValue(true);
1184
- const { unmount } = renderAppContainer({
1185
- settings: mockSettingsWithTitleEnabled,
1186
- });
1187
- // Fast-forward time by 65 seconds
1188
- await act(async () => {
1189
- await vi.advanceTimersByTimeAsync(65000);
1190
- });
1191
- const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
1192
- const lastTitle = titleWrites[titleWrites.length - 1][0];
1193
- // Should show Working… (⏲) instead of Action Required (✋)
1194
- expect(lastTitle).toContain('⏲ Working…');
1195
- unmount();
1196
- });
1197
- it('should NOT show Action Required in title if shell is streaming output', async () => {
1198
- const startTime = 1000000;
1199
- vi.setSystemTime(startTime);
1200
- // Arrange: Set up mock settings with showStatusInTitle enabled
1201
- const mockSettingsWithTitleEnabled = {
1202
- ...mockSettings,
1203
- merged: {
1204
- ...mockSettings.merged,
1205
- ui: {
1206
- ...mockSettings.merged.ui,
1207
- showStatusInTitle: true,
1208
- hideWindowTitle: false,
1209
- },
1210
- },
1211
- };
1212
- // Mock an active shell pty but not focused
1213
- let lastOutputTime = startTime + 1000;
1214
- mockedUseGeminiStream.mockImplementation(() => ({
1215
- streamingState: 'responding',
1216
- submitQuery: vi.fn(),
1217
- initError: null,
1218
- pendingHistoryItems: [],
1219
- thought: { subject: 'Executing shell command' },
1220
- cancelOngoingRequest: vi.fn(),
1221
- activePtyId: 'pty-1',
1222
- lastOutputTime,
1223
- }));
1224
- vi.spyOn(mockConfig, 'isInteractive').mockReturnValue(true);
1225
- vi.spyOn(mockConfig, 'isInteractiveShellEnabled').mockReturnValue(true);
1226
- // Act: Render the container
1227
- const { unmount, rerender } = renderAppContainer({
1228
- settings: mockSettingsWithTitleEnabled,
1229
- });
1230
- // Fast-forward time by 20 seconds
1231
- await act(async () => {
1232
- await vi.advanceTimersByTimeAsync(20000);
1233
- });
1234
- // Update lastOutputTime to simulate new output
1235
- lastOutputTime = startTime + 21000;
1236
- mockedUseGeminiStream.mockImplementation(() => ({
1237
- streamingState: 'responding',
1238
- submitQuery: vi.fn(),
1239
- initError: null,
1240
- pendingHistoryItems: [],
1241
- thought: { subject: 'Executing shell command' },
1242
- cancelOngoingRequest: vi.fn(),
1243
- activePtyId: 'pty-1',
1244
- lastOutputTime,
1245
- }));
1246
- // Rerender to propagate the new lastOutputTime
1247
- await act(async () => {
1248
- rerender(getAppContainer({ settings: mockSettingsWithTitleEnabled }));
1249
- });
1250
- // Fast-forward time by another 20 seconds
1251
- // Total time elapsed: 40s.
1252
- // Time since last output: 20s.
1253
- // It should NOT show Action Required yet.
1254
- await act(async () => {
1255
- await vi.advanceTimersByTimeAsync(20000);
1256
- });
1257
- const titleWritesAfterOutput = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
1258
- const lastTitle = titleWritesAfterOutput[titleWritesAfterOutput.length - 1][0];
1259
- expect(lastTitle).not.toContain('✋ Action Required');
1260
- expect(lastTitle).toContain('✦ Executing shell command');
1261
- // Fast-forward another 40 seconds (Total 60s since last output)
1262
- await act(async () => {
1263
- await vi.advanceTimersByTimeAsync(40000);
1264
- });
1265
- // Now it SHOULD show Action Required
1266
- const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
1267
- const lastTitleFinal = titleWrites[titleWrites.length - 1][0];
1268
- expect(lastTitleFinal).toContain('✋ Action Required');
1269
- unmount();
1270
- });
1271
- });
1272
- it('should pad title to exactly 80 characters', () => {
1273
- // Arrange: Set up mock settings with showStatusInTitle enabled
1274
- const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
1275
- const mockSettingsWithTitleEnabled = {
1276
- ...mockSettings,
1277
- merged: {
1278
- ...defaultMergedSettings,
1279
- ui: {
1280
- ...defaultMergedSettings.ui,
1281
- showStatusInTitle: true,
1282
- hideWindowTitle: false,
1283
- },
1284
- },
1285
- };
1286
- // Mock the streaming state and thought with a short subject
1287
- const shortTitle = 'Short';
1288
- mockedUseGeminiStream.mockReturnValue({
1289
- streamingState: 'responding',
1290
- submitQuery: vi.fn(),
1291
- initError: null,
1292
- pendingHistoryItems: [],
1293
- thought: { subject: shortTitle },
1294
- cancelOngoingRequest: vi.fn(),
1295
- });
1296
- // Act: Render the container
1297
- const { unmount } = renderAppContainer({
1298
- settings: mockSettingsWithTitleEnabled,
1299
- });
1300
- // Assert: Check that title is padded to exactly 80 characters
1301
- const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
1302
- expect(titleWrites).toHaveLength(1);
1303
- const calledWith = titleWrites[0][0];
1304
- const expectedTitle = `✦ ${shortTitle} (workspace)`.padEnd(80, ' ');
1305
- const expectedEscapeSequence = `\x1b]0;${expectedTitle}\x07`;
1306
- expect(calledWith).toBe(expectedEscapeSequence);
1307
- unmount();
1308
- });
1309
- it('should use correct ANSI escape code format', () => {
1310
- // Arrange: Set up mock settings with showStatusInTitle enabled
1311
- const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
1312
- const mockSettingsWithTitleEnabled = {
1313
- ...mockSettings,
1314
- merged: {
1315
- ...defaultMergedSettings,
1316
- ui: {
1317
- ...defaultMergedSettings.ui,
1318
- showStatusInTitle: true,
1319
- hideWindowTitle: false,
1320
- },
1321
- },
1322
- };
1323
- // Mock the streaming state and thought
1324
- const title = 'Test Title';
1325
- mockedUseGeminiStream.mockReturnValue({
1326
- streamingState: 'responding',
1327
- submitQuery: vi.fn(),
1328
- initError: null,
1329
- pendingHistoryItems: [],
1330
- thought: { subject: title },
1331
- cancelOngoingRequest: vi.fn(),
1332
- });
1333
- // Act: Render the container
1334
- const { unmount } = renderAppContainer({
1335
- settings: mockSettingsWithTitleEnabled,
1336
- });
1337
- // Assert: Check that the correct ANSI escape sequence is used
1338
- const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
1339
- expect(titleWrites).toHaveLength(1);
1340
- const expectedEscapeSequence = `\x1b]0;${`✦ ${title} (workspace)`.padEnd(80, ' ')}\x07`;
1341
- expect(titleWrites[0][0]).toBe(expectedEscapeSequence);
1342
- unmount();
1343
- });
1344
- it('should use CLI_TITLE environment variable when set', () => {
1345
- // Arrange: Set up mock settings with showStatusInTitle disabled (so it shows suffix)
1346
- const mockSettingsWithTitleDisabled = {
1347
- ...mockSettings,
1348
- merged: {
1349
- ...mockSettings.merged,
1350
- ui: {
1351
- ...mockSettings.merged.ui,
1352
- showStatusInTitle: false,
1353
- hideWindowTitle: false,
1354
- },
1355
- },
1356
- };
1357
- // Mock CLI_TITLE environment variable
1358
- vi.stubEnv('CLI_TITLE', 'Custom Gemini Title');
1359
- // Mock the streaming state
1360
- mockedUseGeminiStream.mockReturnValue({
1361
- streamingState: 'responding',
1362
- submitQuery: vi.fn(),
1363
- initError: null,
1364
- pendingHistoryItems: [],
1365
- thought: null,
1366
- cancelOngoingRequest: vi.fn(),
1367
- });
1368
- // Act: Render the container
1369
- const { unmount } = renderAppContainer({
1370
- settings: mockSettingsWithTitleDisabled,
1371
- });
1372
- // Assert: Check that title was updated with CLI_TITLE value
1373
- const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
1374
- expect(titleWrites).toHaveLength(1);
1375
- expect(titleWrites[0][0]).toBe(`\x1b]0;${'✦ Working… (Custom Gemini Title)'.padEnd(80, ' ')}\x07`);
1376
- unmount();
1377
- });
1378
- });
1379
- describe('Queue Error Message', () => {
1380
- beforeEach(() => {
1381
- vi.useFakeTimers();
1382
- });
1383
- afterEach(() => {
1384
- vi.useRealTimers();
1385
- vi.restoreAllMocks();
1386
- });
1387
- it('should set and clear the queue error message after a timeout', async () => {
1388
- const { rerender, unmount } = renderAppContainer();
1389
- await act(async () => {
1390
- vi.advanceTimersByTime(0);
1391
- });
1392
- expect(capturedUIState.queueErrorMessage).toBeNull();
1393
- act(() => {
1394
- capturedUIActions.setQueueErrorMessage('Test error');
1395
- });
1396
- rerender(getAppContainer());
1397
- expect(capturedUIState.queueErrorMessage).toBe('Test error');
1398
- act(() => {
1399
- vi.advanceTimersByTime(3000);
1400
- });
1401
- rerender(getAppContainer());
1402
- expect(capturedUIState.queueErrorMessage).toBeNull();
1403
- unmount();
1404
- });
1405
- it('should reset the timer if a new error message is set', async () => {
1406
- const { rerender, unmount } = renderAppContainer();
1407
- await act(async () => {
1408
- vi.advanceTimersByTime(0);
1409
- });
1410
- act(() => {
1411
- capturedUIActions.setQueueErrorMessage('First error');
1412
- });
1413
- rerender(getAppContainer());
1414
- expect(capturedUIState.queueErrorMessage).toBe('First error');
1415
- act(() => {
1416
- vi.advanceTimersByTime(1500);
1417
- });
1418
- act(() => {
1419
- capturedUIActions.setQueueErrorMessage('Second error');
1420
- });
1421
- rerender(getAppContainer());
1422
- expect(capturedUIState.queueErrorMessage).toBe('Second error');
1423
- act(() => {
1424
- vi.advanceTimersByTime(2000);
1425
- });
1426
- rerender(getAppContainer());
1427
- expect(capturedUIState.queueErrorMessage).toBe('Second error');
1428
- // 5. Advance time past the 3 second timeout from the second message
1429
- act(() => {
1430
- vi.advanceTimersByTime(1000);
1431
- });
1432
- rerender(getAppContainer());
1433
- expect(capturedUIState.queueErrorMessage).toBeNull();
1434
- unmount();
1435
- });
1436
- });
1437
- describe('Terminal Height Calculation', () => {
1438
- const mockedMeasureElement = measureElement;
1439
- const mockedUseTerminalSize = useTerminalSize;
1440
- it('should prevent terminal height from being less than 1', async () => {
1441
- const resizePtySpy = vi.spyOn(ShellExecutionService, 'resizePty');
1442
- // Arrange: Simulate a small terminal and a large footer
1443
- mockedUseTerminalSize.mockReturnValue({ columns: 80, rows: 5 });
1444
- mockedMeasureElement.mockReturnValue({ width: 80, height: 10 }); // Footer is taller than the screen
1445
- mockedUseGeminiStream.mockReturnValue({
1446
- streamingState: 'idle',
1447
- submitQuery: vi.fn(),
1448
- initError: null,
1449
- pendingHistoryItems: [],
1450
- thought: null,
1451
- cancelOngoingRequest: vi.fn(),
1452
- activePtyId: 'some-id',
1453
- });
1454
- let unmount;
1455
- await act(async () => {
1456
- const result = renderAppContainer();
1457
- unmount = result.unmount;
1458
- });
1459
- await waitFor(() => expect(resizePtySpy).toHaveBeenCalled());
1460
- const lastCall = resizePtySpy.mock.calls[resizePtySpy.mock.calls.length - 1];
1461
- // Check the height argument specifically
1462
- expect(lastCall[2]).toBe(1);
1463
- unmount();
1464
- });
1465
- });
1466
- describe('Keyboard Input Handling (CTRL+C / CTRL+D)', () => {
1467
- let handleGlobalKeypress;
1468
- let mockHandleSlashCommand;
1469
- let mockCancelOngoingRequest;
1470
- let rerender;
1471
- let unmount;
1472
- // Helper function to reduce boilerplate in tests
1473
- const setupKeypressTest = async () => {
1474
- const renderResult = renderAppContainer();
1475
- await act(async () => {
1476
- vi.advanceTimersByTime(0);
1477
- });
1478
- rerender = () => renderResult.rerender(getAppContainer());
1479
- unmount = renderResult.unmount;
1480
- };
1481
- const pressKey = (key, times = 1) => {
1482
- for (let i = 0; i < times; i++) {
1483
- act(() => {
1484
- handleGlobalKeypress({
1485
- name: 'c',
1486
- shift: false,
1487
- alt: false,
1488
- ctrl: false,
1489
- cmd: false,
1490
- ...key,
1491
- });
1492
- });
1493
- rerender();
1494
- }
1495
- };
1496
- beforeEach(() => {
1497
- // Capture the keypress handler from the AppContainer
1498
- mockedUseKeypress.mockImplementation((callback) => {
1499
- handleGlobalKeypress = callback;
1500
- });
1501
- // Mock slash command handler
1502
- mockHandleSlashCommand = vi.fn();
1503
- mockedUseSlashCommandProcessor.mockReturnValue({
1504
- handleSlashCommand: mockHandleSlashCommand,
1505
- slashCommands: [],
1506
- pendingHistoryItems: [],
1507
- commandContext: {},
1508
- shellConfirmationRequest: null,
1509
- confirmationRequest: null,
1510
- });
1511
- // Mock request cancellation
1512
- mockCancelOngoingRequest = vi.fn();
1513
- mockedUseGeminiStream.mockReturnValue({
1514
- streamingState: 'idle',
1515
- submitQuery: vi.fn(),
1516
- initError: null,
1517
- pendingHistoryItems: [],
1518
- thought: null,
1519
- cancelOngoingRequest: mockCancelOngoingRequest,
1520
- });
1521
- // Default empty text buffer
1522
- mockedUseTextBuffer.mockReturnValue({
1523
- text: '',
1524
- setText: vi.fn(),
1525
- });
1526
- vi.useFakeTimers();
1527
- });
1528
- afterEach(() => {
1529
- vi.useRealTimers();
1530
- vi.restoreAllMocks();
1531
- });
1532
- describe('CTRL+C', () => {
1533
- it('should cancel ongoing request on first press', async () => {
1534
- mockedUseGeminiStream.mockReturnValue({
1535
- streamingState: 'responding',
1536
- submitQuery: vi.fn(),
1537
- initError: null,
1538
- pendingHistoryItems: [],
1539
- thought: null,
1540
- cancelOngoingRequest: mockCancelOngoingRequest,
1541
- });
1542
- await setupKeypressTest();
1543
- pressKey({ name: 'c', ctrl: true });
1544
- expect(mockCancelOngoingRequest).toHaveBeenCalledTimes(1);
1545
- expect(mockHandleSlashCommand).not.toHaveBeenCalled();
1546
- unmount();
1547
- });
1548
- it('should quit on second press', async () => {
1549
- await setupKeypressTest();
1550
- pressKey({ name: 'c', ctrl: true }, 2);
1551
- expect(mockCancelOngoingRequest).toHaveBeenCalledTimes(2);
1552
- expect(mockHandleSlashCommand).toHaveBeenCalledWith('/quit', undefined, undefined, false);
1553
- unmount();
1554
- });
1555
- it('should reset press count after a timeout', async () => {
1556
- await setupKeypressTest();
1557
- pressKey({ name: 'c', ctrl: true });
1558
- expect(mockHandleSlashCommand).not.toHaveBeenCalled();
1559
- // Advance timer past the reset threshold
1560
- act(() => {
1561
- vi.advanceTimersByTime(1001);
1562
- });
1563
- pressKey({ name: 'c', ctrl: true });
1564
- expect(mockHandleSlashCommand).not.toHaveBeenCalled();
1565
- unmount();
1566
- });
1567
- });
1568
- describe('CTRL+D', () => {
1569
- it('should do nothing if text buffer is not empty', async () => {
1570
- mockedUseTextBuffer.mockReturnValue({
1571
- text: 'some text',
1572
- setText: vi.fn(),
1573
- });
1574
- await setupKeypressTest();
1575
- pressKey({ name: 'd', ctrl: true }, 2);
1576
- expect(mockHandleSlashCommand).not.toHaveBeenCalled();
1577
- unmount();
1578
- });
1579
- it('should quit on second press if buffer is empty', async () => {
1580
- await setupKeypressTest();
1581
- pressKey({ name: 'd', ctrl: true }, 2);
1582
- expect(mockHandleSlashCommand).toHaveBeenCalledWith('/quit', undefined, undefined, false);
1583
- unmount();
1584
- });
1585
- it('should reset press count after a timeout', async () => {
1586
- await setupKeypressTest();
1587
- pressKey({ name: 'd', ctrl: true });
1588
- expect(mockHandleSlashCommand).not.toHaveBeenCalled();
1589
- // Advance timer past the reset threshold
1590
- act(() => {
1591
- vi.advanceTimersByTime(1001);
1592
- });
1593
- pressKey({ name: 'd', ctrl: true });
1594
- expect(mockHandleSlashCommand).not.toHaveBeenCalled();
1595
- unmount();
1596
- });
1597
- });
1598
- });
1599
- describe('Copy Mode (CTRL+S)', () => {
1600
- let handleGlobalKeypress;
1601
- let rerender;
1602
- let unmount;
1603
- const setupCopyModeTest = async (isAlternateMode = false) => {
1604
- // Update settings for this test run
1605
- const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
1606
- const testSettings = {
1607
- ...mockSettings,
1608
- merged: {
1609
- ...defaultMergedSettings,
1610
- ui: {
1611
- ...defaultMergedSettings.ui,
1612
- useAlternateBuffer: isAlternateMode,
1613
- },
1614
- },
1615
- };
1616
- const renderResult = renderAppContainer({ settings: testSettings });
1617
- await act(async () => {
1618
- vi.advanceTimersByTime(0);
1619
- });
1620
- rerender = () => renderResult.rerender(getAppContainer({ settings: testSettings }));
1621
- unmount = renderResult.unmount;
1622
- };
1623
- beforeEach(() => {
1624
- mocks.mockStdout.write.mockClear();
1625
- mockedUseKeypress.mockImplementation((callback) => {
1626
- handleGlobalKeypress = callback;
1627
- });
1628
- vi.useFakeTimers();
1629
- });
1630
- afterEach(() => {
1631
- vi.useRealTimers();
1632
- vi.restoreAllMocks();
1633
- });
1634
- describe.each([
1635
- {
1636
- isAlternateMode: false,
1637
- shouldEnable: false,
1638
- modeName: 'Normal Mode',
1639
- },
1640
- {
1641
- isAlternateMode: true,
1642
- shouldEnable: true,
1643
- modeName: 'Alternate Buffer Mode',
1644
- },
1645
- ])('$modeName', ({ isAlternateMode, shouldEnable }) => {
1646
- it(`should ${shouldEnable ? 'toggle' : 'NOT toggle'} mouse off when Ctrl+S is pressed`, async () => {
1647
- await setupCopyModeTest(isAlternateMode);
1648
- mocks.mockStdout.write.mockClear(); // Clear initial enable call
1649
- act(() => {
1650
- handleGlobalKeypress({
1651
- name: 's',
1652
- shift: false,
1653
- alt: false,
1654
- ctrl: true,
1655
- cmd: false,
1656
- insertable: false,
1657
- sequence: '\x13',
1658
- });
1659
- });
1660
- rerender();
1661
- if (shouldEnable) {
1662
- expect(disableMouseEvents).toHaveBeenCalled();
1663
- }
1664
- else {
1665
- expect(disableMouseEvents).not.toHaveBeenCalled();
1666
- }
1667
- unmount();
1668
- });
1669
- if (shouldEnable) {
1670
- it('should toggle mouse back on when Ctrl+S is pressed again', async () => {
1671
- await setupCopyModeTest(isAlternateMode);
1672
- writeToStdout.mockClear();
1673
- // Turn it on (disable mouse)
1674
- act(() => {
1675
- handleGlobalKeypress({
1676
- name: 's',
1677
- shift: false,
1678
- alt: false,
1679
- ctrl: true,
1680
- cmd: false,
1681
- insertable: false,
1682
- sequence: '\x13',
1683
- });
1684
- });
1685
- rerender();
1686
- expect(disableMouseEvents).toHaveBeenCalled();
1687
- // Turn it off (enable mouse)
1688
- act(() => {
1689
- handleGlobalKeypress({
1690
- name: 'any', // Any key should exit copy mode
1691
- shift: false,
1692
- alt: false,
1693
- ctrl: false,
1694
- cmd: false,
1695
- insertable: true,
1696
- sequence: 'a',
1697
- });
1698
- });
1699
- rerender();
1700
- expect(enableMouseEvents).toHaveBeenCalled();
1701
- unmount();
1702
- });
1703
- it('should exit copy mode on any key press', async () => {
1704
- await setupCopyModeTest(isAlternateMode);
1705
- // Enter copy mode
1706
- act(() => {
1707
- handleGlobalKeypress({
1708
- name: 's',
1709
- shift: false,
1710
- alt: false,
1711
- ctrl: true,
1712
- cmd: false,
1713
- insertable: false,
1714
- sequence: '\x13',
1715
- });
1716
- });
1717
- rerender();
1718
- writeToStdout.mockClear();
1719
- // Press any other key
1720
- act(() => {
1721
- handleGlobalKeypress({
1722
- name: 'a',
1723
- shift: false,
1724
- alt: false,
1725
- ctrl: false,
1726
- cmd: false,
1727
- insertable: true,
1728
- sequence: 'a',
1729
- });
1730
- });
1731
- rerender();
1732
- // Should have re-enabled mouse
1733
- expect(enableMouseEvents).toHaveBeenCalled();
1734
- unmount();
1735
- });
1736
- }
1737
- });
1738
- });
1739
- describe('Model Dialog Integration', () => {
1740
- it('should provide isModelDialogOpen in the UIStateContext', async () => {
1741
- mockedUseModelCommand.mockReturnValue({
1742
- isModelDialogOpen: true,
1743
- openModelDialog: vi.fn(),
1744
- closeModelDialog: vi.fn(),
1745
- });
1746
- let unmount;
1747
- await act(async () => {
1748
- const result = renderAppContainer();
1749
- unmount = result.unmount;
1750
- });
1751
- await waitFor(() => expect(capturedUIState).toBeTruthy());
1752
- expect(capturedUIState.isModelDialogOpen).toBe(true);
1753
- unmount();
1754
- });
1755
- it('should provide model dialog actions in the UIActionsContext', async () => {
1756
- const mockCloseModelDialog = vi.fn();
1757
- mockedUseModelCommand.mockReturnValue({
1758
- isModelDialogOpen: false,
1759
- openModelDialog: vi.fn(),
1760
- closeModelDialog: mockCloseModelDialog,
1761
- });
1762
- let unmount;
1763
- await act(async () => {
1764
- const result = renderAppContainer();
1765
- unmount = result.unmount;
1766
- });
1767
- await waitFor(() => expect(capturedUIState).toBeTruthy());
1768
- // Verify that the actions are correctly passed through context
1769
- act(() => {
1770
- capturedUIActions.closeModelDialog();
1771
- });
1772
- expect(mockCloseModelDialog).toHaveBeenCalled();
1773
- unmount();
1774
- });
1775
- });
1776
- describe('Agent Configuration Dialog Integration', () => {
1777
- it('should initialize with dialog closed and no agent selected', async () => {
1778
- let unmount;
1779
- await act(async () => {
1780
- const result = renderAppContainer();
1781
- unmount = result.unmount;
1782
- });
1783
- await waitFor(() => expect(capturedUIState).toBeTruthy());
1784
- expect(capturedUIState.isAgentConfigDialogOpen).toBe(false);
1785
- expect(capturedUIState.selectedAgentName).toBeUndefined();
1786
- expect(capturedUIState.selectedAgentDisplayName).toBeUndefined();
1787
- expect(capturedUIState.selectedAgentDefinition).toBeUndefined();
1788
- unmount();
1789
- });
1790
- it('should update state when openAgentConfigDialog is called', async () => {
1791
- let unmount;
1792
- await act(async () => {
1793
- const result = renderAppContainer();
1794
- unmount = result.unmount;
1795
- });
1796
- await waitFor(() => expect(capturedUIState).toBeTruthy());
1797
- const agentDefinition = { name: 'test-agent' };
1798
- act(() => {
1799
- capturedUIActions.openAgentConfigDialog('test-agent', 'Test Agent', agentDefinition);
1800
- });
1801
- expect(capturedUIState.isAgentConfigDialogOpen).toBe(true);
1802
- expect(capturedUIState.selectedAgentName).toBe('test-agent');
1803
- expect(capturedUIState.selectedAgentDisplayName).toBe('Test Agent');
1804
- expect(capturedUIState.selectedAgentDefinition).toEqual(agentDefinition);
1805
- unmount();
1806
- });
1807
- it('should clear state when closeAgentConfigDialog is called', async () => {
1808
- let unmount;
1809
- await act(async () => {
1810
- const result = renderAppContainer();
1811
- unmount = result.unmount;
1812
- });
1813
- await waitFor(() => expect(capturedUIState).toBeTruthy());
1814
- const agentDefinition = { name: 'test-agent' };
1815
- act(() => {
1816
- capturedUIActions.openAgentConfigDialog('test-agent', 'Test Agent', agentDefinition);
1817
- });
1818
- expect(capturedUIState.isAgentConfigDialogOpen).toBe(true);
1819
- act(() => {
1820
- capturedUIActions.closeAgentConfigDialog();
1821
- });
1822
- expect(capturedUIState.isAgentConfigDialogOpen).toBe(false);
1823
- expect(capturedUIState.selectedAgentName).toBeUndefined();
1824
- expect(capturedUIState.selectedAgentDisplayName).toBeUndefined();
1825
- expect(capturedUIState.selectedAgentDefinition).toBeUndefined();
1826
- unmount();
1827
- });
1828
- });
1829
- describe('CoreEvents Integration', () => {
1830
- it('subscribes to UserFeedback and drains backlog on mount', async () => {
1831
- let unmount;
1832
- await act(async () => {
1833
- const result = renderAppContainer();
1834
- unmount = result.unmount;
1835
- });
1836
- await waitFor(() => expect(capturedUIState).toBeTruthy());
1837
- expect(mockCoreEvents.on).toHaveBeenCalledWith(CoreEvent.UserFeedback, expect.any(Function));
1838
- expect(mockCoreEvents.drainBacklogs).toHaveBeenCalledTimes(1);
1839
- unmount();
1840
- });
1841
- it('unsubscribes from UserFeedback on unmount', async () => {
1842
- let unmount;
1843
- await act(async () => {
1844
- const result = renderAppContainer();
1845
- unmount = result.unmount;
1846
- });
1847
- await waitFor(() => expect(capturedUIState).toBeTruthy());
1848
- unmount();
1849
- expect(mockCoreEvents.off).toHaveBeenCalledWith(CoreEvent.UserFeedback, expect.any(Function));
1850
- });
1851
- it('adds history item when UserFeedback event is received', async () => {
1852
- let unmount;
1853
- await act(async () => {
1854
- const result = renderAppContainer();
1855
- unmount = result.unmount;
1856
- });
1857
- await waitFor(() => expect(capturedUIState).toBeTruthy());
1858
- // Get the registered handler
1859
- const handler = mockCoreEvents.on.mock.calls.find((call) => call[0] === CoreEvent.UserFeedback)?.[1];
1860
- expect(handler).toBeDefined();
1861
- // Simulate an event
1862
- const payload = {
1863
- severity: 'error',
1864
- message: 'Test error message',
1865
- };
1866
- act(() => {
1867
- handler(payload);
1868
- });
1869
- expect(mockedUseHistory().addItem).toHaveBeenCalledWith(expect.objectContaining({
1870
- type: 'error',
1871
- text: 'Test error message',
1872
- }), expect.any(Number));
1873
- unmount();
1874
- });
1875
- it('updates currentModel when ModelChanged event is received', async () => {
1876
- // Arrange: Mock initial model
1877
- vi.spyOn(mockConfig, 'getModel').mockReturnValue('initial-model');
1878
- let unmount;
1879
- await act(async () => {
1880
- const result = renderAppContainer();
1881
- unmount = result.unmount;
1882
- });
1883
- await waitFor(() => {
1884
- expect(capturedUIState?.currentModel).toBe('initial-model');
1885
- });
1886
- // Get the registered handler for ModelChanged
1887
- const handler = mockCoreEvents.on.mock.calls.find((call) => call[0] === CoreEvent.ModelChanged)?.[1];
1888
- expect(handler).toBeDefined();
1889
- // Act: Simulate ModelChanged event
1890
- // Update config mock to return new model since the handler reads from config
1891
- vi.spyOn(mockConfig, 'getModel').mockReturnValue('new-model');
1892
- act(() => {
1893
- handler({ model: 'new-model' });
1894
- });
1895
- // Assert: Verify model is updated
1896
- await waitFor(() => {
1897
- expect(capturedUIState.currentModel).toBe('new-model');
1898
- });
1899
- unmount();
1900
- });
1901
- it('provides activeHooks from useHookDisplayState', async () => {
1902
- const mockHooks = [{ name: 'hook1', eventName: 'event1' }];
1903
- mockedUseHookDisplayState.mockReturnValue(mockHooks);
1904
- let unmount;
1905
- await act(async () => {
1906
- const result = renderAppContainer();
1907
- unmount = result.unmount;
1908
- });
1909
- await waitFor(() => expect(capturedUIState).toBeTruthy());
1910
- expect(capturedUIState.activeHooks).toEqual(mockHooks);
1911
- unmount();
1912
- });
1913
- });
1914
- describe('Shell Interaction', () => {
1915
- it('should not crash if resizing the pty fails', async () => {
1916
- const resizePtySpy = vi
1917
- .spyOn(ShellExecutionService, 'resizePty')
1918
- .mockImplementation(() => {
1919
- throw new Error('Cannot resize a pty that has already exited');
1920
- });
1921
- mockedUseGeminiStream.mockReturnValue({
1922
- streamingState: 'idle',
1923
- submitQuery: vi.fn(),
1924
- initError: null,
1925
- pendingHistoryItems: [],
1926
- thought: null,
1927
- cancelOngoingRequest: vi.fn(),
1928
- activePtyId: 'some-pty-id', // Make sure activePtyId is set
1929
- });
1930
- // The main assertion is that the render does not throw.
1931
- let unmount;
1932
- await act(async () => {
1933
- const result = renderAppContainer();
1934
- unmount = result.unmount;
1935
- });
1936
- await waitFor(() => expect(resizePtySpy).toHaveBeenCalled());
1937
- unmount();
1938
- });
1939
- });
1940
- describe('Banner Text', () => {
1941
- it('should render placeholder banner text for USE_GEMINI auth type', async () => {
1942
- const config = makeFakeConfig();
1943
- vi.spyOn(config, 'getContentGeneratorConfig').mockReturnValue({
1944
- authType: AuthType.USE_GEMINI,
1945
- apiKey: 'fake-key',
1946
- });
1947
- let unmount;
1948
- await act(async () => {
1949
- const result = renderAppContainer();
1950
- unmount = result.unmount;
1951
- });
1952
- await waitFor(() => {
1953
- expect(capturedUIState.bannerData.defaultText).toBeDefined();
1954
- unmount();
1955
- });
1956
- });
1957
- });
1958
- describe('onCancelSubmit Behavior', () => {
1959
- let mockSetText;
1960
- // Helper to extract arguments from the useGeminiStream hook call
1961
- // This isolates the positional argument dependency to a single location
1962
- const extractUseGeminiStreamArgs = (args) => ({
1963
- onCancelSubmit: args[13],
1964
- });
1965
- beforeEach(() => {
1966
- mockSetText = vi.fn();
1967
- mockedUseTextBuffer.mockReturnValue({
1968
- text: '',
1969
- setText: mockSetText,
1970
- });
1971
- });
1972
- it('clears the prompt when onCancelSubmit is called with shouldRestorePrompt=false', async () => {
1973
- let unmount;
1974
- await act(async () => {
1975
- const result = renderAppContainer();
1976
- unmount = result.unmount;
1977
- });
1978
- await waitFor(() => expect(capturedUIState).toBeTruthy());
1979
- const { onCancelSubmit } = extractUseGeminiStreamArgs(mockedUseGeminiStream.mock.lastCall);
1980
- act(() => {
1981
- onCancelSubmit(false);
1982
- });
1983
- expect(mockSetText).toHaveBeenCalledWith('');
1984
- unmount();
1985
- });
1986
- it('restores the prompt when onCancelSubmit is called with shouldRestorePrompt=true (or undefined)', async () => {
1987
- // Mock useInputHistoryStore to provide input history
1988
- mockedUseInputHistoryStore.mockReturnValue({
1989
- inputHistory: ['previous message'],
1990
- addInput: vi.fn(),
1991
- initializeFromLogger: vi.fn(),
1992
- });
1993
- let unmount;
1994
- await act(async () => {
1995
- const result = renderAppContainer();
1996
- unmount = result.unmount;
1997
- });
1998
- await waitFor(() => expect(capturedUIState.userMessages).toContain('previous message'));
1999
- const { onCancelSubmit } = extractUseGeminiStreamArgs(mockedUseGeminiStream.mock.lastCall);
2000
- await act(async () => {
2001
- onCancelSubmit(true);
2002
- });
2003
- await waitFor(() => {
2004
- expect(mockSetText).toHaveBeenCalledWith('previous message');
2005
- });
2006
- unmount();
2007
- });
2008
- it('input history is independent from conversation history (survives /clear)', async () => {
2009
- // This test verifies that input history (used for up-arrow navigation) is maintained
2010
- // separately from conversation history and survives /clear operations.
2011
- const mockAddInput = vi.fn();
2012
- mockedUseInputHistoryStore.mockReturnValue({
2013
- inputHistory: ['first prompt', 'second prompt'],
2014
- addInput: mockAddInput,
2015
- initializeFromLogger: vi.fn(),
2016
- });
2017
- let rerender;
2018
- let unmount;
2019
- await act(async () => {
2020
- const result = renderAppContainer();
2021
- rerender = result.rerender;
2022
- unmount = result.unmount;
2023
- });
2024
- // Verify userMessages is populated from inputHistory
2025
- await waitFor(() => expect(capturedUIState.userMessages).toContain('first prompt'));
2026
- expect(capturedUIState.userMessages).toContain('second prompt');
2027
- // Clear the conversation history (simulating /clear command)
2028
- const mockClearItems = vi.fn();
2029
- mockedUseHistory.mockReturnValue({
2030
- history: [],
2031
- addItem: vi.fn(),
2032
- updateItem: vi.fn(),
2033
- clearItems: mockClearItems,
2034
- loadHistory: vi.fn(),
2035
- });
2036
- await act(async () => {
2037
- // Rerender to apply the new mock.
2038
- rerender(getAppContainer());
2039
- });
2040
- // Verify that userMessages still contains the input history
2041
- // (it should not be affected by clearing conversation history)
2042
- expect(capturedUIState.userMessages).toContain('first prompt');
2043
- expect(capturedUIState.userMessages).toContain('second prompt');
2044
- unmount();
2045
- });
2046
- });
2047
- describe('Regression Tests', () => {
2048
- it('does not refresh static on startup if banner text is empty', async () => {
2049
- // Mock banner text to be empty strings
2050
- vi.spyOn(mockConfig, 'getBannerTextNoCapacityIssues').mockResolvedValue('');
2051
- vi.spyOn(mockConfig, 'getBannerTextCapacityIssues').mockResolvedValue('');
2052
- // Clear previous calls
2053
- mocks.mockStdout.write.mockClear();
2054
- let compUnmount = () => { };
2055
- await act(async () => {
2056
- const { unmount } = renderAppContainer();
2057
- compUnmount = unmount;
2058
- });
2059
- // Allow async effects to run
2060
- await waitFor(() => expect(capturedUIState).toBeTruthy());
2061
- // Wait for fetchBannerTexts to complete
2062
- await act(async () => {
2063
- await new Promise((resolve) => setTimeout(resolve, 100));
2064
- });
2065
- // Check that clearTerminal was NOT written to stdout
2066
- const clearTerminalCalls = mocks.mockStdout.write.mock.calls.filter((call) => call[0] === ansiEscapes.clearTerminal);
2067
- expect(clearTerminalCalls).toHaveLength(0);
2068
- compUnmount();
2069
- });
2070
- });
2071
- });
2072
- //# sourceMappingURL=AppContainer.test.js.map