@machina.ai/cell-cli 1.13.0-rc5 → 1.16.0-rc2

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 (443) hide show
  1. package/dist/package.json +4 -4
  2. package/dist/src/commands/extensions/disable.js +2 -2
  3. package/dist/src/commands/extensions/disable.js.map +1 -1
  4. package/dist/src/commands/extensions/enable.js +4 -4
  5. package/dist/src/commands/extensions/enable.js.map +1 -1
  6. package/dist/src/commands/extensions/examples/mcp-server/package.json +1 -1
  7. package/dist/src/commands/extensions.js +1 -1
  8. package/dist/src/commands/extensions.js.map +1 -1
  9. package/dist/src/config/config.d.ts +4 -8
  10. package/dist/src/config/config.js +37 -24
  11. package/dist/src/config/config.js.map +1 -1
  12. package/dist/src/config/config.test.js +31 -11
  13. package/dist/src/config/config.test.js.map +1 -1
  14. package/dist/src/config/extension-manager.js +39 -14
  15. package/dist/src/config/extension-manager.js.map +1 -1
  16. package/dist/src/config/extension.test.js +65 -0
  17. package/dist/src/config/extension.test.js.map +1 -1
  18. package/dist/src/config/extensions/extensionSettings.js +3 -2
  19. package/dist/src/config/extensions/extensionSettings.js.map +1 -1
  20. package/dist/src/config/extensions/github.d.ts +1 -1
  21. package/dist/src/config/extensions/github.js +8 -2
  22. package/dist/src/config/extensions/github.js.map +1 -1
  23. package/dist/src/config/extensions/github.test.js +8 -10
  24. package/dist/src/config/extensions/github.test.js.map +1 -1
  25. package/dist/src/config/keyBindings.d.ts +19 -0
  26. package/dist/src/config/keyBindings.js +151 -0
  27. package/dist/src/config/keyBindings.js.map +1 -1
  28. package/dist/src/config/keyBindings.test.js +26 -1
  29. package/dist/src/config/keyBindings.test.js.map +1 -1
  30. package/dist/src/config/policy-engine.integration.test.js +62 -44
  31. package/dist/src/config/policy-engine.integration.test.js.map +1 -1
  32. package/dist/src/config/settingPaths.d.ts +10 -0
  33. package/dist/src/config/settingPaths.js +11 -0
  34. package/dist/src/config/settingPaths.js.map +1 -0
  35. package/dist/src/config/settings.d.ts +15 -5
  36. package/dist/src/config/settings.js +28 -8
  37. package/dist/src/config/settings.js.map +1 -1
  38. package/dist/src/config/settingsSchema.d.ts +64 -7
  39. package/dist/src/config/settingsSchema.js +68 -11
  40. package/dist/src/config/settingsSchema.js.map +1 -1
  41. package/dist/src/config/settingsSchema.test.js +9 -0
  42. package/dist/src/config/settingsSchema.test.js.map +1 -1
  43. package/dist/src/gemini.d.ts +2 -2
  44. package/dist/src/gemini.js +56 -27
  45. package/dist/src/gemini.js.map +1 -1
  46. package/dist/src/gemini.test.js +18 -7
  47. package/dist/src/gemini.test.js.map +1 -1
  48. package/dist/src/generated/git-commit.d.ts +2 -2
  49. package/dist/src/generated/git-commit.js +2 -2
  50. package/dist/src/nonInteractiveCli.d.ts +3 -2
  51. package/dist/src/nonInteractiveCli.js +6 -1
  52. package/dist/src/nonInteractiveCli.js.map +1 -1
  53. package/dist/src/nonInteractiveCli.test.js +2 -1
  54. package/dist/src/nonInteractiveCli.test.js.map +1 -1
  55. package/dist/src/services/BuiltinCommandLoader.d.ts +1 -1
  56. package/dist/src/services/BuiltinCommandLoader.js +2 -2
  57. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  58. package/dist/src/services/BuiltinCommandLoader.test.js +3 -1
  59. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
  60. package/dist/src/services/FileCommandLoader.js +9 -6
  61. package/dist/src/services/FileCommandLoader.js.map +1 -1
  62. package/dist/src/services/FileCommandLoader.test.js +76 -1
  63. package/dist/src/services/FileCommandLoader.test.js.map +1 -1
  64. package/dist/src/test-utils/render.d.ts +2 -2
  65. package/dist/src/test-utils/render.js +18 -3
  66. package/dist/src/test-utils/render.js.map +1 -1
  67. package/dist/src/ui/App.js +9 -1
  68. package/dist/src/ui/App.js.map +1 -1
  69. package/dist/src/ui/App.test.js +37 -1
  70. package/dist/src/ui/App.test.js.map +1 -1
  71. package/dist/src/ui/AppContainer.d.ts +2 -3
  72. package/dist/src/ui/AppContainer.js +126 -29
  73. package/dist/src/ui/AppContainer.js.map +1 -1
  74. package/dist/src/ui/AppContainer.test.js +356 -48
  75. package/dist/src/ui/AppContainer.test.js.map +1 -1
  76. package/dist/src/ui/auth/AuthDialog.js +1 -1
  77. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  78. package/dist/src/ui/auth/AuthDialog.test.js +1 -1
  79. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
  80. package/dist/src/ui/commands/chatCommand.js +15 -3
  81. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  82. package/dist/src/ui/commands/chatCommand.test.js +44 -5
  83. package/dist/src/ui/commands/chatCommand.test.js.map +1 -1
  84. package/dist/src/ui/commands/directoryCommand.js +2 -10
  85. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  86. package/dist/src/ui/commands/docsCommand.js +1 -1
  87. package/dist/src/ui/commands/docsCommand.js.map +1 -1
  88. package/dist/src/ui/commands/extensionsCommand.d.ts +7 -2
  89. package/dist/src/ui/commands/extensionsCommand.js +238 -24
  90. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  91. package/dist/src/ui/commands/extensionsCommand.test.js +323 -82
  92. package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
  93. package/dist/src/ui/commands/ideCommand.js +6 -4
  94. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  95. package/dist/src/ui/commands/memoryCommand.js +2 -10
  96. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  97. package/dist/src/ui/commands/memoryCommand.test.js +11 -28
  98. package/dist/src/ui/commands/memoryCommand.test.js.map +1 -1
  99. package/dist/src/ui/commands/settingsCommand.js +1 -1
  100. package/dist/src/ui/commands/settingsCommand.js.map +1 -1
  101. package/dist/src/ui/commands/settingsCommand.test.js +1 -1
  102. package/dist/src/ui/commands/settingsCommand.test.js.map +1 -1
  103. package/dist/src/ui/commands/setupGithubCommand.js +1 -1
  104. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
  105. package/dist/src/ui/commands/toolsCommand.js +1 -1
  106. package/dist/src/ui/commands/toolsCommand.js.map +1 -1
  107. package/dist/src/ui/commands/types.d.ts +1 -2
  108. package/dist/src/ui/commands/types.js.map +1 -1
  109. package/dist/src/ui/components/AboutBox.js +1 -1
  110. package/dist/src/ui/components/AboutBox.js.map +1 -1
  111. package/dist/src/ui/components/AlternateBufferQuittingDisplay.d.ts +6 -0
  112. package/dist/src/ui/components/AlternateBufferQuittingDisplay.js +24 -0
  113. package/dist/src/ui/components/AlternateBufferQuittingDisplay.js.map +1 -0
  114. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.d.ts +6 -0
  115. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +110 -0
  116. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +1 -0
  117. package/dist/src/ui/components/AppHeader.js +25 -3
  118. package/dist/src/ui/components/AppHeader.js.map +1 -1
  119. package/dist/src/ui/components/AppHeader.test.d.ts +6 -0
  120. package/dist/src/ui/components/AppHeader.test.js +138 -0
  121. package/dist/src/ui/components/AppHeader.test.js.map +1 -0
  122. package/dist/src/ui/components/AsciiArt.d.ts +6 -3
  123. package/dist/src/ui/components/AsciiArt.js +40 -3
  124. package/dist/src/ui/components/AsciiArt.js.map +1 -1
  125. package/dist/src/ui/components/Banner.d.ts +12 -0
  126. package/dist/src/ui/components/Banner.js +14 -0
  127. package/dist/src/ui/components/Banner.js.map +1 -0
  128. package/dist/src/ui/components/CliSpinner.d.ts +0 -1
  129. package/dist/src/ui/components/CliSpinner.js +3 -4
  130. package/dist/src/ui/components/CliSpinner.js.map +1 -1
  131. package/dist/src/ui/components/CliSpinner.test.d.ts +6 -0
  132. package/dist/src/ui/components/CliSpinner.test.js +23 -0
  133. package/dist/src/ui/components/CliSpinner.test.js.map +1 -0
  134. package/dist/src/ui/components/Composer.js +11 -4
  135. package/dist/src/ui/components/Composer.js.map +1 -1
  136. package/dist/src/ui/components/CopyModeWarning.d.ts +7 -0
  137. package/dist/src/ui/components/CopyModeWarning.js +12 -0
  138. package/dist/src/ui/components/CopyModeWarning.js.map +1 -0
  139. package/dist/src/ui/components/DebugProfiler.js +2 -2
  140. package/dist/src/ui/components/DebugProfiler.js.map +1 -1
  141. package/dist/src/ui/components/DebugProfiler.test.js +15 -0
  142. package/dist/src/ui/components/DebugProfiler.test.js.map +1 -1
  143. package/dist/src/ui/components/DetailedMessagesDisplay.d.ts +1 -0
  144. package/dist/src/ui/components/DetailedMessagesDisplay.js +47 -27
  145. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  146. package/dist/src/ui/components/DialogManager.js +1 -1
  147. package/dist/src/ui/components/DialogManager.js.map +1 -1
  148. package/dist/src/ui/components/EditorSettingsDialog.d.ts +3 -4
  149. package/dist/src/ui/components/EditorSettingsDialog.js +2 -2
  150. package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -1
  151. package/dist/src/ui/components/FolderTrustDialog.js +1 -1
  152. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  153. package/dist/src/ui/components/FolderTrustDialog.test.js +1 -1
  154. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  155. package/dist/src/ui/components/Footer.js +2 -2
  156. package/dist/src/ui/components/Footer.js.map +1 -1
  157. package/dist/src/ui/components/GradientRegression.test.d.ts +6 -0
  158. package/dist/src/ui/components/GradientRegression.test.js +84 -0
  159. package/dist/src/ui/components/GradientRegression.test.js.map +1 -0
  160. package/dist/src/ui/components/Header.js +9 -8
  161. package/dist/src/ui/components/Header.js.map +1 -1
  162. package/dist/src/ui/components/Header.test.js +102 -34
  163. package/dist/src/ui/components/Header.test.js.map +1 -1
  164. package/dist/src/ui/components/Help.js +1 -1
  165. package/dist/src/ui/components/Help.js.map +1 -1
  166. package/dist/src/ui/components/Help.test.js +9 -0
  167. package/dist/src/ui/components/Help.test.js.map +1 -1
  168. package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
  169. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  170. package/dist/src/ui/components/HistoryItemDisplay.test.js +51 -40
  171. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  172. package/dist/src/ui/components/InputPrompt.d.ts +3 -0
  173. package/dist/src/ui/components/InputPrompt.js +18 -8
  174. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  175. package/dist/src/ui/components/InputPrompt.test.js +99 -116
  176. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  177. package/dist/src/ui/components/MainContent.js +52 -15
  178. package/dist/src/ui/components/MainContent.js.map +1 -1
  179. package/dist/src/ui/components/ModelDialog.js +38 -29
  180. package/dist/src/ui/components/ModelDialog.js.map +1 -1
  181. package/dist/src/ui/components/ModelDialog.test.js +22 -11
  182. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  183. package/dist/src/ui/components/PermissionsModifyTrustDialog.js +1 -1
  184. package/dist/src/ui/components/PermissionsModifyTrustDialog.js.map +1 -1
  185. package/dist/src/ui/components/ProQuotaDialog.d.ts +7 -2
  186. package/dist/src/ui/components/ProQuotaDialog.js +80 -15
  187. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
  188. package/dist/src/ui/components/ProQuotaDialog.test.js +146 -40
  189. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
  190. package/dist/src/ui/components/SettingsDialog.js +1 -1
  191. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  192. package/dist/src/ui/components/SettingsDialog.test.js +12 -12
  193. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  194. package/dist/src/ui/components/StatsDisplay.js +2 -2
  195. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  196. package/dist/src/ui/components/StickyHeader.d.ts +14 -0
  197. package/dist/src/ui/components/StickyHeader.js +5 -0
  198. package/dist/src/ui/components/StickyHeader.js.map +1 -0
  199. package/dist/src/ui/components/StickyHeader.test.d.ts +6 -0
  200. package/dist/src/ui/components/StickyHeader.test.js +17 -0
  201. package/dist/src/ui/components/StickyHeader.test.js.map +1 -0
  202. package/dist/src/ui/components/ThemeDialog.d.ts +2 -3
  203. package/dist/src/ui/components/ThemeDialog.js +11 -3
  204. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  205. package/dist/src/ui/components/ThemeDialog.test.js +3 -3
  206. package/dist/src/ui/components/ThemeDialog.test.js.map +1 -1
  207. package/dist/src/ui/components/ThemedGradient.d.ts +8 -0
  208. package/dist/src/ui/components/ThemedGradient.js +15 -0
  209. package/dist/src/ui/components/ThemedGradient.js.map +1 -0
  210. package/dist/src/ui/components/messages/DiffRenderer.js +129 -89
  211. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  212. package/dist/src/ui/components/messages/DiffRenderer.test.js +107 -115
  213. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -1
  214. package/dist/src/ui/components/messages/GeminiMessage.js +3 -1
  215. package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
  216. package/dist/src/ui/components/messages/GeminiMessageContent.js +3 -1
  217. package/dist/src/ui/components/messages/GeminiMessageContent.js.map +1 -1
  218. package/dist/src/ui/components/messages/InfoMessage.d.ts +2 -0
  219. package/dist/src/ui/components/messages/InfoMessage.js +4 -3
  220. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
  221. package/dist/src/ui/components/messages/Todo.test.js +1 -1
  222. package/dist/src/ui/components/messages/Todo.test.js.map +1 -1
  223. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +151 -122
  224. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  225. package/dist/src/ui/components/messages/ToolGroupMessage.js +18 -14
  226. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  227. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +57 -32
  228. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  229. package/dist/src/ui/components/messages/ToolMessage.d.ts +3 -0
  230. package/dist/src/ui/components/messages/ToolMessage.js +36 -17
  231. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  232. package/dist/src/ui/components/messages/ToolMessage.test.js +3 -0
  233. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
  234. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js +36 -4
  235. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js.map +1 -1
  236. package/dist/src/ui/components/messages/UserMessage.d.ts +1 -0
  237. package/dist/src/ui/components/messages/UserMessage.js +2 -2
  238. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  239. package/dist/src/ui/components/shared/ScopeSelector.d.ts +4 -4
  240. package/dist/src/ui/components/shared/Scrollable.d.ts +18 -0
  241. package/dist/src/ui/components/shared/Scrollable.js +84 -0
  242. package/dist/src/ui/components/shared/Scrollable.js.map +1 -0
  243. package/dist/src/ui/components/shared/Scrollable.test.d.ts +6 -0
  244. package/dist/src/ui/components/shared/Scrollable.test.js +74 -0
  245. package/dist/src/ui/components/shared/Scrollable.test.js.map +1 -0
  246. package/dist/src/ui/components/shared/ScrollableList.d.ts +26 -0
  247. package/dist/src/ui/components/shared/ScrollableList.js +152 -0
  248. package/dist/src/ui/components/shared/ScrollableList.js.map +1 -0
  249. package/dist/src/ui/components/shared/ScrollableList.test.d.ts +6 -0
  250. package/dist/src/ui/components/shared/ScrollableList.test.js +228 -0
  251. package/dist/src/ui/components/shared/ScrollableList.test.js.map +1 -0
  252. package/dist/src/ui/components/shared/VirtualizedList.d.ts +44 -0
  253. package/dist/src/ui/components/shared/VirtualizedList.js +312 -0
  254. package/dist/src/ui/components/shared/VirtualizedList.js.map +1 -0
  255. package/dist/src/ui/components/shared/VirtualizedList.test.d.ts +6 -0
  256. package/dist/src/ui/components/shared/VirtualizedList.test.js +171 -0
  257. package/dist/src/ui/components/shared/VirtualizedList.test.js.map +1 -0
  258. package/dist/src/ui/components/shared/text-buffer.d.ts +2 -8
  259. package/dist/src/ui/components/shared/text-buffer.js +1 -1
  260. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  261. package/dist/src/ui/components/shared/text-buffer.test.js +35 -0
  262. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  263. package/dist/src/ui/components/views/ToolsList.js +1 -1
  264. package/dist/src/ui/components/views/ToolsList.js.map +1 -1
  265. package/dist/src/ui/constants.d.ts +1 -0
  266. package/dist/src/ui/constants.js +5 -0
  267. package/dist/src/ui/constants.js.map +1 -1
  268. package/dist/src/ui/contexts/KeypressContext.d.ts +6 -11
  269. package/dist/src/ui/contexts/KeypressContext.js +456 -756
  270. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  271. package/dist/src/ui/contexts/KeypressContext.test.js +103 -334
  272. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  273. package/dist/src/ui/contexts/MouseContext.js +16 -1
  274. package/dist/src/ui/contexts/MouseContext.js.map +1 -1
  275. package/dist/src/ui/contexts/MouseContext.test.js +34 -0
  276. package/dist/src/ui/contexts/MouseContext.test.js.map +1 -1
  277. package/dist/src/ui/contexts/ScrollProvider.d.ts +25 -0
  278. package/dist/src/ui/contexts/ScrollProvider.drag.test.d.ts +6 -0
  279. package/dist/src/ui/contexts/ScrollProvider.drag.test.js +319 -0
  280. package/dist/src/ui/contexts/ScrollProvider.drag.test.js.map +1 -0
  281. package/dist/src/ui/contexts/ScrollProvider.js +242 -0
  282. package/dist/src/ui/contexts/ScrollProvider.js.map +1 -0
  283. package/dist/src/ui/contexts/ScrollProvider.test.d.ts +6 -0
  284. package/dist/src/ui/contexts/ScrollProvider.test.js +377 -0
  285. package/dist/src/ui/contexts/ScrollProvider.test.js.map +1 -0
  286. package/dist/src/ui/contexts/UIActionsContext.d.ts +6 -5
  287. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  288. package/dist/src/ui/contexts/UIStateContext.d.ts +10 -0
  289. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  290. package/dist/src/ui/debug.d.ts +8 -0
  291. package/dist/src/ui/debug.js +11 -0
  292. package/dist/src/ui/debug.js.map +1 -0
  293. package/dist/src/ui/editors/editorSettingsManager.d.ts +0 -1
  294. package/dist/src/ui/editors/editorSettingsManager.js +1 -11
  295. package/dist/src/ui/editors/editorSettingsManager.js.map +1 -1
  296. package/dist/src/ui/hooks/atCommandProcessor.js +3 -3
  297. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  298. package/dist/src/ui/hooks/atCommandProcessor.test.js +2 -1
  299. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  300. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +1 -1
  301. package/dist/src/ui/hooks/slashCommandProcessor.js +23 -5
  302. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  303. package/dist/src/ui/hooks/slashCommandProcessor.test.js +103 -68
  304. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +1 -1
  305. package/dist/src/ui/hooks/useAlternateBuffer.d.ts +8 -0
  306. package/dist/src/ui/hooks/useAlternateBuffer.js +12 -0
  307. package/dist/src/ui/hooks/useAlternateBuffer.js.map +1 -0
  308. package/dist/src/ui/hooks/useAnimatedScrollbar.d.ts +10 -0
  309. package/dist/src/ui/hooks/useAnimatedScrollbar.js +91 -0
  310. package/dist/src/ui/hooks/useAnimatedScrollbar.js.map +1 -0
  311. package/dist/src/ui/hooks/useAnimatedScrollbar.test.d.ts +6 -0
  312. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js +85 -0
  313. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js.map +1 -0
  314. package/dist/src/ui/hooks/useBatchedScroll.d.ts +14 -0
  315. package/dist/src/ui/hooks/useBatchedScroll.js +27 -0
  316. package/dist/src/ui/hooks/useBatchedScroll.js.map +1 -0
  317. package/dist/src/ui/hooks/useBatchedScroll.test.d.ts +6 -0
  318. package/dist/src/ui/hooks/useBatchedScroll.test.js +62 -0
  319. package/dist/src/ui/hooks/useBatchedScroll.test.js.map +1 -0
  320. package/dist/src/ui/hooks/useEditorSettings.d.ts +2 -2
  321. package/dist/src/ui/hooks/useEditorSettings.js +4 -3
  322. package/dist/src/ui/hooks/useEditorSettings.js.map +1 -1
  323. package/dist/src/ui/hooks/useEditorSettings.test.js +17 -8
  324. package/dist/src/ui/hooks/useEditorSettings.test.js.map +1 -1
  325. package/dist/src/ui/hooks/useFocus.test.js +10 -10
  326. package/dist/src/ui/hooks/useFocus.test.js.map +1 -1
  327. package/dist/src/ui/hooks/useGeminiStream.js +2 -2
  328. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  329. package/dist/src/ui/hooks/useGeminiStream.test.js +4 -0
  330. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  331. package/dist/src/ui/hooks/useKeypress.test.js +9 -32
  332. package/dist/src/ui/hooks/useKeypress.test.js.map +1 -1
  333. package/dist/src/ui/hooks/usePhraseCycler.js +2 -2
  334. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  335. package/dist/src/ui/hooks/usePromptCompletion.js +2 -9
  336. package/dist/src/ui/hooks/usePromptCompletion.js.map +1 -1
  337. package/dist/src/ui/hooks/useQuotaAndFallback.d.ts +3 -5
  338. package/dist/src/ui/hooks/useQuotaAndFallback.js +62 -77
  339. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
  340. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +142 -106
  341. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  342. package/dist/src/ui/hooks/useSelectionList.test.js +3 -0
  343. package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -1
  344. package/dist/src/ui/hooks/useSessionBrowser.d.ts +18 -0
  345. package/dist/src/ui/hooks/useSessionBrowser.js +152 -0
  346. package/dist/src/ui/hooks/useSessionBrowser.js.map +1 -0
  347. package/dist/src/ui/hooks/useSessionBrowser.test.d.ts +6 -0
  348. package/dist/src/ui/hooks/useSessionBrowser.test.js +544 -0
  349. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +1 -0
  350. package/dist/src/ui/hooks/useSessionResume.d.ts +30 -0
  351. package/dist/src/ui/hooks/useSessionResume.js +56 -0
  352. package/dist/src/ui/hooks/useSessionResume.js.map +1 -0
  353. package/dist/src/ui/hooks/useSessionResume.test.d.ts +6 -0
  354. package/dist/src/ui/hooks/useSessionResume.test.js +325 -0
  355. package/dist/src/ui/hooks/useSessionResume.test.js.map +1 -0
  356. package/dist/src/ui/hooks/useThemeCommand.d.ts +2 -2
  357. package/dist/src/ui/hooks/useThemeCommand.js.map +1 -1
  358. package/dist/src/ui/hooks/useToolScheduler.test.js +1 -0
  359. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  360. package/dist/src/ui/hooks/vim.js +1 -0
  361. package/dist/src/ui/hooks/vim.js.map +1 -1
  362. package/dist/src/ui/hooks/vim.test.js +1 -0
  363. package/dist/src/ui/hooks/vim.test.js.map +1 -1
  364. package/dist/src/ui/keyMatchers.test.js +38 -0
  365. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  366. package/dist/src/ui/layouts/DefaultAppLayout.js +9 -1
  367. package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -1
  368. package/dist/src/ui/noninteractive/nonInteractiveUi.js +0 -1
  369. package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -1
  370. package/dist/src/ui/privacy/CloudFreePrivacyNotice.js +1 -1
  371. package/dist/src/ui/privacy/CloudFreePrivacyNotice.js.map +1 -1
  372. package/dist/src/ui/state/extensions.d.ts +5 -0
  373. package/dist/src/ui/state/extensions.js +12 -0
  374. package/dist/src/ui/state/extensions.js.map +1 -1
  375. package/dist/src/ui/state/extensions.test.d.ts +6 -0
  376. package/dist/src/ui/state/extensions.test.js +62 -0
  377. package/dist/src/ui/state/extensions.test.js.map +1 -0
  378. package/dist/src/ui/themes/color-utils.js +9 -0
  379. package/dist/src/ui/themes/color-utils.js.map +1 -1
  380. package/dist/src/ui/themes/color-utils.test.js +17 -0
  381. package/dist/src/ui/themes/color-utils.test.js.map +1 -1
  382. package/dist/src/ui/types.d.ts +6 -0
  383. package/dist/src/ui/types.js +4 -0
  384. package/dist/src/ui/types.js.map +1 -1
  385. package/dist/src/ui/utils/CodeColorizer.d.ts +11 -3
  386. package/dist/src/ui/utils/CodeColorizer.js +18 -9
  387. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  388. package/dist/src/ui/utils/CodeColorizer.test.d.ts +6 -0
  389. package/dist/src/ui/utils/CodeColorizer.test.js +38 -0
  390. package/dist/src/ui/utils/CodeColorizer.test.js.map +1 -0
  391. package/dist/src/ui/utils/MarkdownDisplay.js +32 -6
  392. package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
  393. package/dist/src/ui/utils/mouse.d.ts +2 -1
  394. package/dist/src/ui/utils/mouse.js +27 -1
  395. package/dist/src/ui/utils/mouse.js.map +1 -1
  396. package/dist/src/ui/utils/mouse.test.js +5 -0
  397. package/dist/src/ui/utils/mouse.test.js.map +1 -1
  398. package/dist/src/ui/utils/terminalSetup.d.ts +4 -0
  399. package/dist/src/ui/utils/terminalSetup.js +10 -3
  400. package/dist/src/ui/utils/terminalSetup.js.map +1 -1
  401. package/dist/src/ui/utils/textUtils.d.ts +1 -0
  402. package/dist/src/ui/utils/textUtils.js +3 -2
  403. package/dist/src/ui/utils/textUtils.js.map +1 -1
  404. package/dist/src/ui/utils/textUtils.test.js +7 -1
  405. package/dist/src/ui/utils/textUtils.test.js.map +1 -1
  406. package/dist/src/ui/utils/ui-sizing.js +10 -3
  407. package/dist/src/ui/utils/ui-sizing.js.map +1 -1
  408. package/dist/src/utils/cleanup.test.js +1 -1
  409. package/dist/src/utils/cleanup.test.js.map +1 -1
  410. package/dist/src/utils/dialogScopeUtils.d.ts +6 -13
  411. package/dist/src/utils/dialogScopeUtils.js +4 -2
  412. package/dist/src/utils/dialogScopeUtils.js.map +1 -1
  413. package/dist/src/utils/events.d.ts +5 -1
  414. package/dist/src/utils/events.js +2 -0
  415. package/dist/src/utils/events.js.map +1 -1
  416. package/dist/src/utils/persistentState.d.ts +19 -0
  417. package/dist/src/utils/persistentState.js +65 -0
  418. package/dist/src/utils/persistentState.js.map +1 -0
  419. package/dist/src/utils/sessionCleanup.test.js +76 -0
  420. package/dist/src/utils/sessionCleanup.test.js.map +1 -1
  421. package/dist/src/utils/sessionUtils.d.ts +54 -0
  422. package/dist/src/utils/sessionUtils.js +141 -1
  423. package/dist/src/utils/sessionUtils.js.map +1 -1
  424. package/dist/src/utils/sessionUtils.test.d.ts +6 -0
  425. package/dist/src/utils/sessionUtils.test.js +260 -0
  426. package/dist/src/utils/sessionUtils.test.js.map +1 -0
  427. package/dist/src/utils/sessions.d.ts +8 -0
  428. package/dist/src/utils/sessions.js +64 -0
  429. package/dist/src/utils/sessions.js.map +1 -0
  430. package/dist/src/utils/settingsUtils.d.ts +2 -2
  431. package/dist/src/utils/settingsUtils.js.map +1 -1
  432. package/dist/src/utils/userStartupWarnings.js +2 -2
  433. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  434. package/dist/src/utils/windowTitle.d.ts +1 -1
  435. package/dist/src/utils/windowTitle.js +1 -1
  436. package/dist/tsconfig.tsbuildinfo +1 -1
  437. package/package.json +4 -4
  438. package/dist/src/config/policies/read-only.toml +0 -56
  439. package/dist/src/config/policies/write.toml +0 -63
  440. package/dist/src/config/policies/yolo.toml +0 -31
  441. package/dist/src/ui/utils/platformConstants.d.ts +0 -75
  442. package/dist/src/ui/utils/platformConstants.js +0 -78
  443. package/dist/src/ui/utils/platformConstants.js.map +0 -1
@@ -3,119 +3,104 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { AuthType, TerminalQuotaError, UserTierId, RetryableQuotaError, } from '@google/gemini-cli-core';
6
+ import { AuthType, TerminalQuotaError, ModelNotFoundError, PREVIEW_GEMINI_MODEL, } from '@google/gemini-cli-core';
7
7
  import { useCallback, useEffect, useRef, useState } from 'react';
8
8
  import {} from './useHistoryManager.js';
9
- import { AuthState, MessageType } from '../types.js';
9
+ import { MessageType } from '../types.js';
10
10
  import {} from '../contexts/UIStateContext.js';
11
- export function useQuotaAndFallback({ config, historyManager, userTier, setAuthState, setModelSwitchedFromQuotaError, }) {
11
+ export function useQuotaAndFallback({ config, historyManager, userTier, setModelSwitchedFromQuotaError, }) {
12
12
  const [proQuotaRequest, setProQuotaRequest] = useState(null);
13
13
  const isDialogPending = useRef(false);
14
14
  // Set up Flash fallback handler
15
15
  useEffect(() => {
16
16
  const fallbackHandler = async (failedModel, fallbackModel, error) => {
17
- if (config.isInFallbackMode()) {
18
- return null;
19
- }
20
17
  // Fallbacks are currently only handled for OAuth users.
21
18
  const contentGeneratorConfig = config.getContentGeneratorConfig();
22
19
  if (!contentGeneratorConfig ||
23
20
  contentGeneratorConfig.authType !== AuthType.LOGIN_WITH_GOOGLE) {
24
21
  return null;
25
22
  }
26
- // Use actual user tier if available; otherwise, default to FREE tier behavior (safe default)
27
- const isPaidTier = userTier === UserTierId.LEGACY || userTier === UserTierId.STANDARD;
28
23
  let message;
24
+ let isTerminalQuotaError = false;
25
+ let isModelNotFoundError = false;
29
26
  if (error instanceof TerminalQuotaError) {
30
- // Pro Quota specific messages (Interactive)
31
- if (isPaidTier) {
32
- message = `⚡ You have reached your daily ${failedModel} quota limit.
33
- You can choose to authenticate with a paid API key or continue with the fallback model.
34
- To continue accessing the ${failedModel} model today, consider using /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
35
- }
36
- else {
37
- message = `⚡ You have reached your daily ${failedModel} quota limit.
38
- You can choose to authenticate with a paid API key or continue with the fallback model.
39
- ⚡ To increase your limits, upgrade to a Gemini Code Assist Standard or Enterprise plan with higher limits at https://goo.gle/set-up-gemini-code-assist
40
- ⚡ Or you can utilize a Gemini API Key. See: https://goo.gle/gemini-cli-docs-auth#gemini-api-key
41
- ⚡ You can switch authentication methods by typing /auth`;
42
- }
27
+ isTerminalQuotaError = true;
28
+ // Common part of the message for both tiers
29
+ const messageLines = [
30
+ `Usage limit reached for ${failedModel}.`,
31
+ error.retryDelayMs ? getResetTimeMessage(error.retryDelayMs) : null,
32
+ `/stats for usage details`,
33
+ `/auth to switch to API key.`,
34
+ ].filter(Boolean);
35
+ message = messageLines.join('\n');
43
36
  }
44
- else if (error instanceof RetryableQuotaError) {
45
- // Short term quota retries exhausted (Automatic fallback)
46
- const actionMessage = `⚡ Your requests are being throttled right now due to server being at capacity for ${failedModel}.\n⚡ Automatically switching from ${failedModel} to ${fallbackModel} for the remainder of this session.`;
47
- if (isPaidTier) {
48
- message = `${actionMessage}
49
- To continue accessing the ${failedModel} model, retry your request after some time or consider using /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
50
- }
51
- else {
52
- message = `${actionMessage}
53
- ⚡ Retry your requests after some time. Otherwise consider upgrading to a Gemini Code Assist Standard or Enterprise plan with higher limits at https://goo.gle/set-up-gemini-code-assist
54
- ⚡ You can switch authentication methods by typing /auth`;
55
- }
37
+ else if (error instanceof ModelNotFoundError) {
38
+ isModelNotFoundError = true;
39
+ const messageLines = [
40
+ `It seems like you don't have access to Gemini 3.`,
41
+ `Learn more at https://goo.gle/enable-preview-features`,
42
+ `To disable Gemini 3, disable "Preview features" in /settings.`,
43
+ ];
44
+ message = messageLines.join('\n');
56
45
  }
57
46
  else {
58
- // Other errors (Automatic fallback)
59
- const actionMessage = `⚡ Automatically switching from ${failedModel} to ${fallbackModel} for faster responses for the remainder of this session.`;
60
- if (isPaidTier) {
61
- message = `${actionMessage}
62
- ⚡ Your requests are being throttled temporarily due to server being at capacity for ${failedModel} or there is a service outage.
63
- ⚡ To continue accessing the ${failedModel} model, you can retry your request after some time or consider using /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
64
- }
65
- else {
66
- message = `${actionMessage}
67
- ⚡ Your requests are being throttled temporarily due to server being at capacity for ${failedModel} or there is a service outage.
68
- ⚡ To avoid being throttled, you can retry your request after some time or upgrade to a Gemini Code Assist Standard or Enterprise plan with higher limits at https://goo.gle/set-up-gemini-code-assist
69
- ⚡ Or you can utilize a Gemini API Key. See: https://goo.gle/gemini-cli-docs-auth#gemini-api-key
70
- ⚡ You can switch authentication methods by typing /auth`;
71
- }
47
+ message = `${failedModel} is currently experiencing high demand. We apologize and appreciate your patience.`;
72
48
  }
73
- // Add message to UI history
74
- historyManager.addItem({
75
- type: MessageType.INFO,
76
- text: message,
77
- }, Date.now());
78
49
  setModelSwitchedFromQuotaError(true);
79
50
  config.setQuotaErrorOccurred(true);
80
- // Interactive Fallback for Pro quota
81
- if (error instanceof TerminalQuotaError) {
82
- if (isDialogPending.current) {
83
- return 'stop'; // A dialog is already active, so just stop this request.
84
- }
85
- isDialogPending.current = true;
86
- const intent = await new Promise((resolve) => {
87
- setProQuotaRequest({
88
- failedModel,
89
- fallbackModel,
90
- resolve,
91
- });
92
- });
93
- return intent;
51
+ if (isDialogPending.current) {
52
+ return 'stop'; // A dialog is already active, so just stop this request.
94
53
  }
95
- return 'stop';
54
+ isDialogPending.current = true;
55
+ const intent = await new Promise((resolve) => {
56
+ setProQuotaRequest({
57
+ failedModel,
58
+ fallbackModel,
59
+ resolve,
60
+ message,
61
+ isTerminalQuotaError,
62
+ isModelNotFoundError,
63
+ });
64
+ });
65
+ return intent;
96
66
  };
97
67
  config.setFallbackModelHandler(fallbackHandler);
98
68
  }, [config, historyManager, userTier, setModelSwitchedFromQuotaError]);
99
69
  const handleProQuotaChoice = useCallback((choice) => {
100
70
  if (!proQuotaRequest)
101
71
  return;
102
- const intent = choice === 'auth' ? 'auth' : 'retry';
72
+ const intent = choice;
103
73
  proQuotaRequest.resolve(intent);
104
74
  setProQuotaRequest(null);
105
75
  isDialogPending.current = false; // Reset the flag here
106
- if (choice === 'auth') {
107
- setAuthState(AuthState.Updating);
108
- }
109
- else {
110
- historyManager.addItem({
111
- type: MessageType.INFO,
112
- text: 'Switched to fallback model. Tip: Press Ctrl+P (or Up Arrow) to recall your previous prompt and submit it again if you wish.',
113
- }, Date.now());
76
+ if (choice === 'retry_always') {
77
+ // If we were recovering from a Preview Model failure, show a specific message.
78
+ if (proQuotaRequest.failedModel === PREVIEW_GEMINI_MODEL) {
79
+ historyManager.addItem({
80
+ type: MessageType.INFO,
81
+ text: `Switched to fallback model ${proQuotaRequest.fallbackModel}. ${!proQuotaRequest.isModelNotFoundError ? `We will periodically check if ${PREVIEW_GEMINI_MODEL} is available again.` : ''}`,
82
+ }, Date.now());
83
+ }
84
+ else {
85
+ historyManager.addItem({
86
+ type: MessageType.INFO,
87
+ text: 'Switched to fallback model.',
88
+ }, Date.now());
89
+ }
114
90
  }
115
- }, [proQuotaRequest, setAuthState, historyManager]);
91
+ }, [proQuotaRequest, historyManager]);
116
92
  return {
117
93
  proQuotaRequest,
118
94
  handleProQuotaChoice,
119
95
  };
120
96
  }
97
+ function getResetTimeMessage(delayMs) {
98
+ const resetDate = new Date(Date.now() + delayMs);
99
+ const timeFormatter = new Intl.DateTimeFormat('en-US', {
100
+ hour: 'numeric',
101
+ minute: '2-digit',
102
+ timeZoneName: 'short',
103
+ });
104
+ return `Access resets at ${timeFormatter.format(resetDate)}.`;
105
+ }
121
106
  //# sourceMappingURL=useQuotaAndFallback.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useQuotaAndFallback.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useQuotaAndFallback.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useQuotaAndFallback.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useQuotaAndFallback.ts"],"names":[],"mappings":"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"}
@@ -6,13 +6,12 @@
6
6
  import { vi, describe, it, expect, beforeEach, afterEach, } from 'vitest';
7
7
  import { act } from 'react';
8
8
  import { renderHook } from '../../test-utils/render.js';
9
- import { UserTierId, AuthType, TerminalQuotaError, makeFakeConfig, RetryableQuotaError, } from '@google/gemini-cli-core';
9
+ import { UserTierId, AuthType, TerminalQuotaError, makeFakeConfig, RetryableQuotaError, PREVIEW_GEMINI_MODEL, ModelNotFoundError, } from '@google/gemini-cli-core';
10
10
  import { useQuotaAndFallback } from './useQuotaAndFallback.js';
11
- import { AuthState, MessageType } from '../types.js';
11
+ import { MessageType } from '../types.js';
12
12
  describe('useQuotaAndFallback', () => {
13
13
  let mockConfig;
14
14
  let mockHistoryManager;
15
- let mockSetAuthState;
16
15
  let mockSetModelSwitchedFromQuotaError;
17
16
  let setFallbackHandlerSpy;
18
17
  let mockGoogleApiError;
@@ -35,7 +34,6 @@ describe('useQuotaAndFallback', () => {
35
34
  clearItems: vi.fn(),
36
35
  loadHistory: vi.fn(),
37
36
  };
38
- mockSetAuthState = vi.fn();
39
37
  mockSetModelSwitchedFromQuotaError = vi.fn();
40
38
  setFallbackHandlerSpy = vi.spyOn(mockConfig, 'setFallbackModelHandler');
41
39
  vi.spyOn(mockConfig, 'setQuotaErrorOccurred');
@@ -48,7 +46,6 @@ describe('useQuotaAndFallback', () => {
48
46
  config: mockConfig,
49
47
  historyManager: mockHistoryManager,
50
48
  userTier: UserTierId.FREE,
51
- setAuthState: mockSetAuthState,
52
49
  setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
53
50
  }));
54
51
  expect(setFallbackHandlerSpy).toHaveBeenCalledTimes(1);
@@ -56,23 +53,15 @@ describe('useQuotaAndFallback', () => {
56
53
  });
57
54
  describe('Fallback Handler Logic', () => {
58
55
  // Helper function to render the hook and extract the registered handler
59
- const getRegisteredHandler = (userTier = UserTierId.FREE) => {
60
- renderHook((props) => useQuotaAndFallback({
56
+ const getRegisteredHandler = () => {
57
+ renderHook(() => useQuotaAndFallback({
61
58
  config: mockConfig,
62
59
  historyManager: mockHistoryManager,
63
- userTier: props.userTier,
64
- setAuthState: mockSetAuthState,
60
+ userTier: UserTierId.FREE,
65
61
  setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
66
- }), { initialProps: { userTier } });
62
+ }));
67
63
  return setFallbackHandlerSpy.mock.calls[0][0];
68
64
  };
69
- it('should return null and take no action if already in fallback mode', async () => {
70
- vi.spyOn(mockConfig, 'isInFallbackMode').mockReturnValue(true);
71
- const handler = getRegisteredHandler();
72
- const result = await handler('gemini-pro', 'gemini-flash', new Error());
73
- expect(result).toBeNull();
74
- expect(mockHistoryManager.addItem).not.toHaveBeenCalled();
75
- });
76
65
  it('should return null and take no action if authType is not LOGIN_WITH_GOOGLE', async () => {
77
66
  // Override the default mock from beforeEach for this specific test
78
67
  vi.spyOn(mockConfig, 'getContentGeneratorConfig').mockReturnValue({
@@ -83,102 +72,48 @@ describe('useQuotaAndFallback', () => {
83
72
  expect(result).toBeNull();
84
73
  expect(mockHistoryManager.addItem).not.toHaveBeenCalled();
85
74
  });
86
- describe('Automatic Fallback Scenarios', () => {
87
- const testCases = [
88
- {
89
- description: 'other error for FREE tier',
90
- tier: UserTierId.FREE,
91
- error: new Error('some error'),
92
- expectedMessageSnippets: [
93
- 'Automatically switching from model-A to model-B for faster responses',
94
- 'upgrade to a Gemini Code Assist Standard or Enterprise plan',
95
- ],
96
- },
97
- {
98
- description: 'other error for LEGACY tier',
99
- tier: UserTierId.LEGACY, // Paid tier
100
- error: new Error('some error'),
101
- expectedMessageSnippets: [
102
- 'Automatically switching from model-A to model-B for faster responses',
103
- 'switch to using a paid API key from AI Studio',
104
- ],
105
- },
106
- {
107
- description: 'retryable quota error for FREE tier',
108
- tier: UserTierId.FREE,
109
- error: new RetryableQuotaError('retryable quota', mockGoogleApiError, 5),
110
- expectedMessageSnippets: [
111
- 'Your requests are being throttled right now due to server being at capacity for model-A',
112
- 'Automatically switching from model-A to model-B',
113
- 'upgrading to a Gemini Code Assist Standard or Enterprise plan',
114
- ],
115
- },
116
- {
117
- description: 'retryable quota error for LEGACY tier',
118
- tier: UserTierId.LEGACY, // Paid tier
119
- error: new RetryableQuotaError('retryable quota', mockGoogleApiError, 5),
120
- expectedMessageSnippets: [
121
- 'Your requests are being throttled right now due to server being at capacity for model-A',
122
- 'Automatically switching from model-A to model-B',
123
- 'switch to using a paid API key from AI Studio',
124
- ],
125
- },
126
- ];
127
- for (const { description, tier, error, expectedMessageSnippets, } of testCases) {
128
- it(`should handle ${description} correctly`, async () => {
129
- const handler = getRegisteredHandler(tier);
130
- let result;
131
- await act(async () => {
132
- result = await handler('model-A', 'model-B', error);
133
- });
134
- // Automatic fallbacks should return 'stop'
135
- expect(result).toBe('stop');
136
- expect(mockHistoryManager.addItem).toHaveBeenCalledWith(expect.objectContaining({ type: MessageType.INFO }), expect.any(Number));
137
- const message = mockHistoryManager.addItem.mock.calls[0][0]
138
- .text;
139
- for (const snippet of expectedMessageSnippets) {
140
- expect(message).toContain(snippet);
141
- }
142
- expect(mockSetModelSwitchedFromQuotaError).toHaveBeenCalledWith(true);
143
- expect(mockConfig.setQuotaErrorOccurred).toHaveBeenCalledWith(true);
144
- });
145
- }
146
- });
147
- describe('Interactive Fallback (Pro Quota Error)', () => {
148
- it('should set an interactive request and wait for user choice', async () => {
75
+ describe('Interactive Fallback', () => {
76
+ it('should set an interactive request for a terminal quota error', async () => {
149
77
  const { result } = renderHook(() => useQuotaAndFallback({
150
78
  config: mockConfig,
151
79
  historyManager: mockHistoryManager,
152
80
  userTier: UserTierId.FREE,
153
- setAuthState: mockSetAuthState,
154
81
  setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
155
82
  }));
156
83
  const handler = setFallbackHandlerSpy.mock
157
84
  .calls[0][0];
158
- // Call the handler but do not await it, to check the intermediate state
159
85
  let promise;
86
+ const error = new TerminalQuotaError('pro quota', mockGoogleApiError, 1000 * 60 * 5); // 5 minutes
160
87
  await act(() => {
161
- promise = handler('gemini-pro', 'gemini-flash', new TerminalQuotaError('pro quota', mockGoogleApiError));
88
+ promise = handler('gemini-pro', 'gemini-flash', error);
162
89
  });
163
90
  // The hook should now have a pending request for the UI to handle
164
- expect(result.current.proQuotaRequest).not.toBeNull();
165
- expect(result.current.proQuotaRequest?.failedModel).toBe('gemini-pro');
91
+ const request = result.current.proQuotaRequest;
92
+ expect(request).not.toBeNull();
93
+ expect(request?.failedModel).toBe('gemini-pro');
94
+ expect(request?.isTerminalQuotaError).toBe(true);
95
+ const message = request.message;
96
+ expect(message).toContain('Usage limit reached for gemini-pro.');
97
+ expect(message).toContain('Access resets at'); // From getResetTimeMessage
98
+ expect(message).toContain('/stats for usage details');
99
+ expect(message).toContain('/auth to switch to API key.');
100
+ expect(mockHistoryManager.addItem).not.toHaveBeenCalled();
166
101
  // Simulate the user choosing to continue with the fallback model
167
102
  await act(() => {
168
- result.current.handleProQuotaChoice('continue');
103
+ result.current.handleProQuotaChoice('retry_always');
169
104
  });
170
105
  // The original promise from the handler should now resolve
171
106
  const intent = await promise;
172
- expect(intent).toBe('retry');
107
+ expect(intent).toBe('retry_always');
173
108
  // The pending request should be cleared from the state
174
109
  expect(result.current.proQuotaRequest).toBeNull();
110
+ expect(mockHistoryManager.addItem).toHaveBeenCalledTimes(1);
175
111
  });
176
112
  it('should handle race conditions by stopping subsequent requests', async () => {
177
113
  const { result } = renderHook(() => useQuotaAndFallback({
178
114
  config: mockConfig,
179
115
  historyManager: mockHistoryManager,
180
116
  userTier: UserTierId.FREE,
181
- setAuthState: mockSetAuthState,
182
117
  setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
183
118
  }));
184
119
  const handler = setFallbackHandlerSpy.mock
@@ -197,10 +132,95 @@ describe('useQuotaAndFallback', () => {
197
132
  expect(result2).toBe('stop');
198
133
  expect(result.current.proQuotaRequest).toBe(firstRequest);
199
134
  await act(() => {
200
- result.current.handleProQuotaChoice('continue');
135
+ result.current.handleProQuotaChoice('retry_always');
201
136
  });
202
137
  const intent1 = await promise1;
203
- expect(intent1).toBe('retry');
138
+ expect(intent1).toBe('retry_always');
139
+ expect(result.current.proQuotaRequest).toBeNull();
140
+ });
141
+ // Non-TerminalQuotaError test cases
142
+ const testCases = [
143
+ {
144
+ description: 'generic error',
145
+ error: new Error('some error'),
146
+ },
147
+ {
148
+ description: 'retryable quota error',
149
+ error: new RetryableQuotaError('retryable quota', mockGoogleApiError, 5),
150
+ },
151
+ ];
152
+ for (const { description, error } of testCases) {
153
+ it(`should handle ${description} correctly`, async () => {
154
+ const { result } = renderHook(() => useQuotaAndFallback({
155
+ config: mockConfig,
156
+ historyManager: mockHistoryManager,
157
+ userTier: UserTierId.FREE,
158
+ setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
159
+ }));
160
+ const handler = setFallbackHandlerSpy.mock
161
+ .calls[0][0];
162
+ let promise;
163
+ await act(() => {
164
+ promise = handler('model-A', 'model-B', error);
165
+ });
166
+ // The hook should now have a pending request for the UI to handle
167
+ const request = result.current.proQuotaRequest;
168
+ expect(request).not.toBeNull();
169
+ expect(request?.failedModel).toBe('model-A');
170
+ expect(request?.isTerminalQuotaError).toBe(false);
171
+ // Check that the correct initial message was generated
172
+ expect(mockHistoryManager.addItem).not.toHaveBeenCalled();
173
+ const message = request.message;
174
+ expect(message).toContain('model-A is currently experiencing high demand. We apologize and appreciate your patience.');
175
+ // Simulate the user choosing to continue with the fallback model
176
+ await act(() => {
177
+ result.current.handleProQuotaChoice('retry_always');
178
+ });
179
+ expect(mockSetModelSwitchedFromQuotaError).toHaveBeenCalledWith(true);
180
+ // The original promise from the handler should now resolve
181
+ const intent = await promise;
182
+ expect(intent).toBe('retry_always');
183
+ // The pending request should be cleared from the state
184
+ expect(result.current.proQuotaRequest).toBeNull();
185
+ expect(mockConfig.setQuotaErrorOccurred).toHaveBeenCalledWith(true);
186
+ // Check for the "Switched to fallback model" message
187
+ expect(mockHistoryManager.addItem).toHaveBeenCalledTimes(1);
188
+ const lastCall = mockHistoryManager.addItem.mock
189
+ .calls[0][0];
190
+ expect(lastCall.type).toBe(MessageType.INFO);
191
+ expect(lastCall.text).toContain('Switched to fallback model.');
192
+ });
193
+ }
194
+ it('should handle ModelNotFoundError correctly', async () => {
195
+ const { result } = renderHook(() => useQuotaAndFallback({
196
+ config: mockConfig,
197
+ historyManager: mockHistoryManager,
198
+ userTier: UserTierId.FREE,
199
+ setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
200
+ }));
201
+ const handler = setFallbackHandlerSpy.mock
202
+ .calls[0][0];
203
+ let promise;
204
+ const error = new ModelNotFoundError('model not found', 404);
205
+ await act(() => {
206
+ promise = handler('gemini-3-pro-preview', 'gemini-2.5-pro', error);
207
+ });
208
+ // The hook should now have a pending request for the UI to handle
209
+ const request = result.current.proQuotaRequest;
210
+ expect(request).not.toBeNull();
211
+ expect(request?.failedModel).toBe('gemini-3-pro-preview');
212
+ expect(request?.isTerminalQuotaError).toBe(false);
213
+ expect(request?.isModelNotFoundError).toBe(true);
214
+ const message = request.message;
215
+ expect(message).toBe(`It seems like you don't have access to Gemini 3.
216
+ Learn more at https://goo.gle/enable-preview-features
217
+ To disable Gemini 3, disable "Preview features" in /settings.`);
218
+ // Simulate the user choosing to switch
219
+ await act(() => {
220
+ result.current.handleProQuotaChoice('retry_always');
221
+ });
222
+ const intent = await promise;
223
+ expect(intent).toBe('retry_always');
204
224
  expect(result.current.proQuotaRequest).toBeNull();
205
225
  });
206
226
  });
@@ -211,21 +231,18 @@ describe('useQuotaAndFallback', () => {
211
231
  config: mockConfig,
212
232
  historyManager: mockHistoryManager,
213
233
  userTier: UserTierId.FREE,
214
- setAuthState: mockSetAuthState,
215
234
  setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
216
235
  }));
217
236
  act(() => {
218
- result.current.handleProQuotaChoice('auth');
237
+ result.current.handleProQuotaChoice('retry_later');
219
238
  });
220
- expect(mockSetAuthState).not.toHaveBeenCalled();
221
239
  expect(mockHistoryManager.addItem).not.toHaveBeenCalled();
222
240
  });
223
- it('should resolve intent to "auth" and trigger auth state update', async () => {
241
+ it('should resolve intent to "retry_later"', async () => {
224
242
  const { result } = renderHook(() => useQuotaAndFallback({
225
243
  config: mockConfig,
226
244
  historyManager: mockHistoryManager,
227
245
  userTier: UserTierId.FREE,
228
- setAuthState: mockSetAuthState,
229
246
  setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
230
247
  }));
231
248
  const handler = setFallbackHandlerSpy.mock
@@ -235,40 +252,59 @@ describe('useQuotaAndFallback', () => {
235
252
  promise = handler('gemini-pro', 'gemini-flash', new TerminalQuotaError('pro quota', mockGoogleApiError));
236
253
  });
237
254
  await act(() => {
238
- result.current.handleProQuotaChoice('auth');
255
+ result.current.handleProQuotaChoice('retry_later');
239
256
  });
240
257
  const intent = await promise;
241
- expect(intent).toBe('auth');
242
- expect(mockSetAuthState).toHaveBeenCalledWith(AuthState.Updating);
258
+ expect(intent).toBe('retry_later');
243
259
  expect(result.current.proQuotaRequest).toBeNull();
244
260
  });
245
- it('should resolve intent to "retry" and add info message on continue', async () => {
261
+ it('should resolve intent to "retry_always" and add info message on continue', async () => {
246
262
  const { result } = renderHook(() => useQuotaAndFallback({
247
263
  config: mockConfig,
248
264
  historyManager: mockHistoryManager,
249
265
  userTier: UserTierId.FREE,
250
- setAuthState: mockSetAuthState,
251
266
  setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
252
267
  }));
253
268
  const handler = setFallbackHandlerSpy.mock
254
269
  .calls[0][0];
255
- // The first `addItem` call is for the initial quota error message
256
270
  let promise;
257
271
  await act(() => {
258
272
  promise = handler('gemini-pro', 'gemini-flash', new TerminalQuotaError('pro quota', mockGoogleApiError));
259
273
  });
260
274
  await act(() => {
261
- result.current.handleProQuotaChoice('continue');
275
+ result.current.handleProQuotaChoice('retry_always');
262
276
  });
263
277
  const intent = await promise;
264
- expect(intent).toBe('retry');
278
+ expect(intent).toBe('retry_always');
265
279
  expect(result.current.proQuotaRequest).toBeNull();
266
- // Check for the second "Switched to fallback model" message
267
- expect(mockHistoryManager.addItem).toHaveBeenCalledTimes(2);
268
- const lastCall = mockHistoryManager.addItem.mock.calls[1][0];
280
+ // Check for the "Switched to fallback model" message
281
+ expect(mockHistoryManager.addItem).toHaveBeenCalledTimes(1);
282
+ const lastCall = mockHistoryManager.addItem.mock.calls[0][0];
269
283
  expect(lastCall.type).toBe(MessageType.INFO);
270
284
  expect(lastCall.text).toContain('Switched to fallback model.');
271
285
  });
286
+ it('should show a special message when falling back from the preview model', async () => {
287
+ const { result } = renderHook(() => useQuotaAndFallback({
288
+ config: mockConfig,
289
+ historyManager: mockHistoryManager,
290
+ userTier: UserTierId.FREE,
291
+ setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
292
+ }));
293
+ const handler = setFallbackHandlerSpy.mock
294
+ .calls[0][0];
295
+ let promise;
296
+ await act(() => {
297
+ promise = handler(PREVIEW_GEMINI_MODEL, 'gemini-flash', new Error('preview model failed'));
298
+ });
299
+ await act(() => {
300
+ result.current.handleProQuotaChoice('retry_always');
301
+ });
302
+ await promise;
303
+ expect(mockHistoryManager.addItem).toHaveBeenCalledTimes(1);
304
+ const lastCall = mockHistoryManager.addItem.mock.calls[0][0];
305
+ expect(lastCall.type).toBe(MessageType.INFO);
306
+ expect(lastCall.text).toContain(`Switched to fallback model gemini-flash. We will periodically check if ${PREVIEW_GEMINI_MODEL} is available again.`);
307
+ });
272
308
  });
273
309
  });
274
310
  //# sourceMappingURL=useQuotaAndFallback.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useQuotaAndFallback.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useQuotaAndFallback.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useQuotaAndFallback.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useQuotaAndFallback.test.ts"],"names":[],"mappings":"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"}