@google/gemini-cli 0.31.0-preview.2 → 0.32.0-preview.0

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 (335) hide show
  1. package/dist/package.json +2 -2
  2. package/dist/src/commands/extensions/examples/policies/README.md +41 -0
  3. package/dist/src/commands/extensions/examples/policies/gemini-extension.json +5 -0
  4. package/dist/src/commands/extensions/examples/policies/policies/policies.toml +28 -0
  5. package/dist/src/commands/extensions/link.test.js +5 -21
  6. package/dist/src/commands/extensions/link.test.js.map +1 -1
  7. package/dist/src/commands/extensions/list.test.js +10 -24
  8. package/dist/src/commands/extensions/list.test.js.map +1 -1
  9. package/dist/src/commands/mcp/list.js +32 -14
  10. package/dist/src/commands/mcp/list.js.map +1 -1
  11. package/dist/src/commands/mcp/list.test.js +22 -1
  12. package/dist/src/commands/mcp/list.test.js.map +1 -1
  13. package/dist/src/commands/skills/disable.test.js +4 -7
  14. package/dist/src/commands/skills/disable.test.js.map +1 -1
  15. package/dist/src/commands/skills/enable.test.js +4 -7
  16. package/dist/src/commands/skills/enable.test.js.map +1 -1
  17. package/dist/src/commands/skills/install.test.js +12 -9
  18. package/dist/src/commands/skills/install.test.js.map +1 -1
  19. package/dist/src/commands/skills/link.test.js +5 -2
  20. package/dist/src/commands/skills/link.test.js.map +1 -1
  21. package/dist/src/commands/skills/list.test.js +16 -29
  22. package/dist/src/commands/skills/list.test.js.map +1 -1
  23. package/dist/src/commands/skills/uninstall.test.js +9 -6
  24. package/dist/src/commands/skills/uninstall.test.js.map +1 -1
  25. package/dist/src/config/config.js +3 -0
  26. package/dist/src/config/config.js.map +1 -1
  27. package/dist/src/config/config.test.js +55 -0
  28. package/dist/src/config/config.test.js.map +1 -1
  29. package/dist/src/config/extension-manager.d.ts +8 -1
  30. package/dist/src/config/extension-manager.js +88 -23
  31. package/dist/src/config/extension-manager.js.map +1 -1
  32. package/dist/src/config/extension-manager.test.d.ts +6 -0
  33. package/dist/src/config/extension-manager.test.js +138 -0
  34. package/dist/src/config/extension-manager.test.js.map +1 -0
  35. package/dist/src/config/extension.test.js +93 -4
  36. package/dist/src/config/extension.test.js.map +1 -1
  37. package/dist/src/config/extensions/consent.test.js +35 -43
  38. package/dist/src/config/extensions/consent.test.js.map +1 -1
  39. package/dist/src/config/keyBindings.js +1 -1
  40. package/dist/src/config/keyBindings.js.map +1 -1
  41. package/dist/src/config/policy-engine.integration.test.js +12 -12
  42. package/dist/src/config/policy.d.ts +20 -0
  43. package/dist/src/config/policy.js +35 -7
  44. package/dist/src/config/policy.js.map +1 -1
  45. package/dist/src/config/policy.test.js +71 -24
  46. package/dist/src/config/policy.test.js.map +1 -1
  47. package/dist/src/config/settingsSchema.d.ts +98 -3
  48. package/dist/src/config/settingsSchema.js +92 -1
  49. package/dist/src/config/settingsSchema.js.map +1 -1
  50. package/dist/src/config/settingsSchema.test.js +49 -0
  51. package/dist/src/config/settingsSchema.test.js.map +1 -1
  52. package/dist/src/config/workspace-policy-cli.test.js +48 -19
  53. package/dist/src/config/workspace-policy-cli.test.js.map +1 -1
  54. package/dist/src/gemini.js +7 -8
  55. package/dist/src/gemini.js.map +1 -1
  56. package/dist/src/gemini.test.js +5 -1
  57. package/dist/src/gemini.test.js.map +1 -1
  58. package/dist/src/generated/git-commit.d.ts +2 -2
  59. package/dist/src/generated/git-commit.js +2 -2
  60. package/dist/src/test-utils/AppRig.d.ts +26 -0
  61. package/dist/src/test-utils/AppRig.js +128 -6
  62. package/dist/src/test-utils/AppRig.js.map +1 -1
  63. package/dist/src/test-utils/customMatchers.d.ts +25 -5
  64. package/dist/src/test-utils/customMatchers.js +46 -0
  65. package/dist/src/test-utils/customMatchers.js.map +1 -1
  66. package/dist/src/test-utils/mockConfig.js +4 -0
  67. package/dist/src/test-utils/mockConfig.js.map +1 -1
  68. package/dist/src/test-utils/mockDebugLogger.d.ts +35 -0
  69. package/dist/src/test-utils/mockDebugLogger.js +67 -0
  70. package/dist/src/test-utils/mockDebugLogger.js.map +1 -0
  71. package/dist/src/test-utils/render.d.ts +13 -0
  72. package/dist/src/test-utils/render.js +48 -8
  73. package/dist/src/test-utils/render.js.map +1 -1
  74. package/dist/src/test-utils/svg.d.ts +7 -0
  75. package/dist/src/test-utils/svg.js +163 -0
  76. package/dist/src/test-utils/svg.js.map +1 -0
  77. package/dist/src/ui/AppContainer.js +48 -66
  78. package/dist/src/ui/AppContainer.js.map +1 -1
  79. package/dist/src/ui/AppContainer.test.js +89 -0
  80. package/dist/src/ui/AppContainer.test.js.map +1 -1
  81. package/dist/src/ui/commands/mcpCommand.js +17 -3
  82. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  83. package/dist/src/ui/commands/mcpCommand.test.js +10 -3
  84. package/dist/src/ui/commands/mcpCommand.test.js.map +1 -1
  85. package/dist/src/ui/commands/setupGithubCommand.js +2 -0
  86. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
  87. package/dist/src/ui/commands/statsCommand.js +10 -4
  88. package/dist/src/ui/commands/statsCommand.js.map +1 -1
  89. package/dist/src/ui/commands/statsCommand.test.js +12 -3
  90. package/dist/src/ui/commands/statsCommand.test.js.map +1 -1
  91. package/dist/src/ui/components/AnsiOutput.test.js +3 -3
  92. package/dist/src/ui/components/AnsiOutput.test.js.map +1 -1
  93. package/dist/src/ui/components/AskUserDialog.d.ts +4 -0
  94. package/dist/src/ui/components/AskUserDialog.js +5 -5
  95. package/dist/src/ui/components/AskUserDialog.js.map +1 -1
  96. package/dist/src/ui/components/AskUserDialog.test.js +6 -7
  97. package/dist/src/ui/components/AskUserDialog.test.js.map +1 -1
  98. package/dist/src/ui/components/Composer.js +17 -6
  99. package/dist/src/ui/components/Composer.js.map +1 -1
  100. package/dist/src/ui/components/Composer.test.js +47 -6
  101. package/dist/src/ui/components/Composer.test.js.map +1 -1
  102. package/dist/src/ui/components/ConfigInitDisplay.js +1 -1
  103. package/dist/src/ui/components/ConfigInitDisplay.js.map +1 -1
  104. package/dist/src/ui/components/ConfigInitDisplay.test.js +6 -6
  105. package/dist/src/ui/components/ConfigInitDisplay.test.js.map +1 -1
  106. package/dist/src/ui/components/DetailedMessagesDisplay.js +6 -1
  107. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  108. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +43 -4
  109. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +1 -1
  110. package/dist/src/ui/components/DialogManager.js +9 -1
  111. package/dist/src/ui/components/DialogManager.js.map +1 -1
  112. package/dist/src/ui/components/DialogManager.test.js +4 -0
  113. package/dist/src/ui/components/DialogManager.test.js.map +1 -1
  114. package/dist/src/ui/components/EmptyWalletDialog.d.ts +22 -0
  115. package/dist/src/ui/components/EmptyWalletDialog.js +33 -0
  116. package/dist/src/ui/components/EmptyWalletDialog.js.map +1 -0
  117. package/dist/src/ui/components/EmptyWalletDialog.test.d.ts +6 -0
  118. package/dist/src/ui/components/EmptyWalletDialog.test.js +127 -0
  119. package/dist/src/ui/components/EmptyWalletDialog.test.js.map +1 -0
  120. package/dist/src/ui/components/ExitPlanModeDialog.d.ts +2 -1
  121. package/dist/src/ui/components/ExitPlanModeDialog.js +34 -7
  122. package/dist/src/ui/components/ExitPlanModeDialog.js.map +1 -1
  123. package/dist/src/ui/components/ExitPlanModeDialog.test.js +31 -2
  124. package/dist/src/ui/components/ExitPlanModeDialog.test.js.map +1 -1
  125. package/dist/src/ui/components/FolderTrustDialog.test.js +1 -1
  126. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  127. package/dist/src/ui/components/Footer.js +3 -1
  128. package/dist/src/ui/components/Footer.js.map +1 -1
  129. package/dist/src/ui/components/Footer.test.js +63 -1
  130. package/dist/src/ui/components/Footer.test.js.map +1 -1
  131. package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +0 -5
  132. package/dist/src/ui/components/GeminiRespondingSpinner.js +1 -32
  133. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  134. package/dist/src/ui/components/GeminiRespondingSpinner.test.js +5 -10
  135. package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +1 -1
  136. package/dist/src/ui/components/GeminiSpinner.d.ts +13 -0
  137. package/dist/src/ui/components/GeminiSpinner.js +35 -0
  138. package/dist/src/ui/components/GeminiSpinner.js.map +1 -0
  139. package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
  140. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  141. package/dist/src/ui/components/InputPrompt.js +31 -3
  142. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  143. package/dist/src/ui/components/InputPrompt.test.js +82 -18
  144. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  145. package/dist/src/ui/components/OverageMenuDialog.d.ts +22 -0
  146. package/dist/src/ui/components/OverageMenuDialog.js +32 -0
  147. package/dist/src/ui/components/OverageMenuDialog.js.map +1 -0
  148. package/dist/src/ui/components/OverageMenuDialog.test.d.ts +6 -0
  149. package/dist/src/ui/components/OverageMenuDialog.test.js +129 -0
  150. package/dist/src/ui/components/OverageMenuDialog.test.js.map +1 -0
  151. package/dist/src/ui/components/ProQuotaDialog.d.ts +3 -1
  152. package/dist/src/ui/components/ProQuotaDialog.js +11 -6
  153. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
  154. package/dist/src/ui/components/ProQuotaDialog.test.js +27 -14
  155. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
  156. package/dist/src/ui/components/SettingsDialog.test.js +9 -11
  157. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  158. package/dist/src/ui/components/StatsDisplay.d.ts +1 -0
  159. package/dist/src/ui/components/StatsDisplay.js +2 -2
  160. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  161. package/dist/src/ui/components/Table.test.js +23 -4
  162. package/dist/src/ui/components/Table.test.js.map +1 -1
  163. package/dist/src/ui/components/ToastDisplay.js +1 -1
  164. package/dist/src/ui/components/ToastDisplay.js.map +1 -1
  165. package/dist/src/ui/components/ToastDisplay.test.js +2 -2
  166. package/dist/src/ui/components/ToastDisplay.test.js.map +1 -1
  167. package/dist/src/ui/components/ToolConfirmationQueue.js +3 -1
  168. package/dist/src/ui/components/ToolConfirmationQueue.js.map +1 -1
  169. package/dist/src/ui/components/ToolConfirmationQueue.test.js +3 -2
  170. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +1 -1
  171. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +1 -1
  172. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +1 -1
  173. package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +2 -1
  174. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +3 -2
  175. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  176. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +17 -17
  177. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  178. package/dist/src/ui/components/messages/ToolGroupMessage.js +17 -7
  179. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  180. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +88 -5
  181. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  182. package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.js +1 -1
  183. package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.js.map +1 -1
  184. package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.js +11 -4
  185. package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.js.map +1 -1
  186. package/dist/src/ui/components/shared/DialogFooter.d.ts +2 -0
  187. package/dist/src/ui/components/shared/DialogFooter.js +2 -1
  188. package/dist/src/ui/components/shared/DialogFooter.js.map +1 -1
  189. package/dist/src/ui/components/shared/ExpandableText.test.js +21 -16
  190. package/dist/src/ui/components/shared/ExpandableText.test.js.map +1 -1
  191. package/dist/src/ui/components/shared/MaxSizedBox.js +10 -1
  192. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  193. package/dist/src/ui/components/shared/MaxSizedBox.test.js +8 -8
  194. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -1
  195. package/dist/src/ui/components/shared/Scrollable.d.ts +1 -1
  196. package/dist/src/ui/components/shared/Scrollable.js +76 -43
  197. package/dist/src/ui/components/shared/Scrollable.js.map +1 -1
  198. package/dist/src/ui/components/shared/Scrollable.test.js +15 -20
  199. package/dist/src/ui/components/shared/Scrollable.test.js.map +1 -1
  200. package/dist/src/ui/components/shared/ScrollableList.js +14 -9
  201. package/dist/src/ui/components/shared/ScrollableList.js.map +1 -1
  202. package/dist/src/ui/components/shared/ScrollableList.test.js +153 -0
  203. package/dist/src/ui/components/shared/ScrollableList.test.js.map +1 -1
  204. package/dist/src/ui/components/shared/VirtualizedList.js +133 -88
  205. package/dist/src/ui/components/shared/VirtualizedList.js.map +1 -1
  206. package/dist/src/ui/components/shared/VirtualizedList.test.js +6 -3
  207. package/dist/src/ui/components/shared/VirtualizedList.test.js.map +1 -1
  208. package/dist/src/ui/components/shared/text-buffer.js +3 -30
  209. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  210. package/dist/src/ui/components/views/McpStatus.d.ts +1 -0
  211. package/dist/src/ui/components/views/McpStatus.js +2 -2
  212. package/dist/src/ui/components/views/McpStatus.js.map +1 -1
  213. package/dist/src/ui/components/views/McpStatus.test.js +7 -0
  214. package/dist/src/ui/components/views/McpStatus.test.js.map +1 -1
  215. package/dist/src/ui/contexts/UIActionsContext.d.ts +3 -0
  216. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  217. package/dist/src/ui/contexts/UIStateContext.d.ts +24 -1
  218. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  219. package/dist/src/ui/hooks/atCommandProcessor.js +4 -0
  220. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  221. package/dist/src/ui/hooks/creditsFlowHandler.d.ts +35 -0
  222. package/dist/src/ui/hooks/creditsFlowHandler.js +144 -0
  223. package/dist/src/ui/hooks/creditsFlowHandler.js.map +1 -0
  224. package/dist/src/ui/hooks/creditsFlowHandler.test.d.ts +6 -0
  225. package/dist/src/ui/hooks/creditsFlowHandler.test.js +180 -0
  226. package/dist/src/ui/hooks/creditsFlowHandler.test.js.map +1 -0
  227. package/dist/src/ui/hooks/shell-completions/gitProvider.d.ts +7 -0
  228. package/dist/src/ui/hooks/shell-completions/gitProvider.js +73 -0
  229. package/dist/src/ui/hooks/shell-completions/gitProvider.js.map +1 -0
  230. package/dist/src/ui/hooks/shell-completions/gitProvider.test.d.ts +6 -0
  231. package/dist/src/ui/hooks/shell-completions/gitProvider.test.js +73 -0
  232. package/dist/src/ui/hooks/shell-completions/gitProvider.test.js.map +1 -0
  233. package/dist/src/ui/hooks/shell-completions/index.d.ts +7 -0
  234. package/dist/src/ui/hooks/shell-completions/index.js +16 -0
  235. package/dist/src/ui/hooks/shell-completions/index.js.map +1 -0
  236. package/dist/src/ui/hooks/shell-completions/npmProvider.d.ts +7 -0
  237. package/dist/src/ui/hooks/shell-completions/npmProvider.js +67 -0
  238. package/dist/src/ui/hooks/shell-completions/npmProvider.js.map +1 -0
  239. package/dist/src/ui/hooks/shell-completions/npmProvider.test.d.ts +6 -0
  240. package/dist/src/ui/hooks/shell-completions/npmProvider.test.js +69 -0
  241. package/dist/src/ui/hooks/shell-completions/npmProvider.test.js.map +1 -0
  242. package/dist/src/ui/hooks/shell-completions/types.d.ts +16 -0
  243. package/dist/src/ui/hooks/shell-completions/types.js +7 -0
  244. package/dist/src/ui/hooks/shell-completions/types.js.map +1 -0
  245. package/dist/src/ui/hooks/shellCommandProcessor.js +1 -0
  246. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  247. package/dist/src/ui/hooks/slashCommandProcessor.js +1 -0
  248. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  249. package/dist/src/ui/hooks/toolMapping.js +1 -0
  250. package/dist/src/ui/hooks/toolMapping.js.map +1 -1
  251. package/dist/src/ui/hooks/toolMapping.test.js +25 -0
  252. package/dist/src/ui/hooks/toolMapping.test.js.map +1 -1
  253. package/dist/src/ui/hooks/useAlternateBuffer.d.ts +2 -2
  254. package/dist/src/ui/hooks/useAlternateBuffer.js +5 -4
  255. package/dist/src/ui/hooks/useAlternateBuffer.js.map +1 -1
  256. package/dist/src/ui/hooks/useAlternateBuffer.test.d.ts +6 -0
  257. package/dist/src/ui/hooks/useAlternateBuffer.test.js +57 -0
  258. package/dist/src/ui/hooks/useAlternateBuffer.test.js.map +1 -0
  259. package/dist/src/ui/hooks/useCommandCompletion.d.ts +2 -1
  260. package/dist/src/ui/hooks/useCommandCompletion.js +37 -5
  261. package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
  262. package/dist/src/ui/hooks/useCommandCompletion.test.js +23 -1
  263. package/dist/src/ui/hooks/useCommandCompletion.test.js.map +1 -1
  264. package/dist/src/ui/hooks/useGeminiStream.js +83 -5
  265. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  266. package/dist/src/ui/hooks/useGeminiStream.test.js +110 -4
  267. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  268. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +2 -1
  269. package/dist/src/ui/hooks/useLoadingIndicator.js +7 -2
  270. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  271. package/dist/src/ui/hooks/useLoadingIndicator.test.js +25 -4
  272. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  273. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +1 -1
  274. package/dist/src/ui/hooks/usePrivacySettings.js +9 -3
  275. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  276. package/dist/src/ui/hooks/useQuotaAndFallback.d.ts +11 -3
  277. package/dist/src/ui/hooks/useQuotaAndFallback.js +84 -12
  278. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
  279. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +278 -16
  280. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  281. package/dist/src/ui/hooks/useShellCompletion.d.ts +49 -0
  282. package/dist/src/ui/hooks/useShellCompletion.js +489 -0
  283. package/dist/src/ui/hooks/useShellCompletion.js.map +1 -0
  284. package/dist/src/ui/hooks/useShellCompletion.test.d.ts +6 -0
  285. package/dist/src/ui/hooks/useShellCompletion.test.js +354 -0
  286. package/dist/src/ui/hooks/useShellCompletion.test.js.map +1 -0
  287. package/dist/src/ui/hooks/useTimedMessage.d.ts +1 -1
  288. package/dist/src/ui/hooks/useTimedMessage.js +5 -3
  289. package/dist/src/ui/hooks/useTimedMessage.js.map +1 -1
  290. package/dist/src/ui/hooks/useToolScheduler.js +5 -0
  291. package/dist/src/ui/hooks/useToolScheduler.js.map +1 -1
  292. package/dist/src/ui/hooks/useToolScheduler.test.js +28 -19
  293. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  294. package/dist/src/ui/types.d.ts +3 -0
  295. package/dist/src/ui/types.js.map +1 -1
  296. package/dist/src/ui/utils/InlineMarkdownRenderer.js +4 -86
  297. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
  298. package/dist/src/ui/utils/MarkdownDisplay.test.js +2 -2
  299. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  300. package/dist/src/ui/utils/TableRenderer.js +18 -12
  301. package/dist/src/ui/utils/TableRenderer.js.map +1 -1
  302. package/dist/src/ui/utils/TableRenderer.test.js +152 -22
  303. package/dist/src/ui/utils/TableRenderer.test.js.map +1 -1
  304. package/dist/src/ui/utils/borderStyles.js +4 -1
  305. package/dist/src/ui/utils/borderStyles.js.map +1 -1
  306. package/dist/src/ui/utils/borderStyles.test.d.ts +6 -0
  307. package/dist/src/ui/utils/borderStyles.test.js +141 -0
  308. package/dist/src/ui/utils/borderStyles.test.js.map +1 -0
  309. package/dist/src/ui/utils/editorUtils.d.ts +17 -0
  310. package/dist/src/ui/utils/editorUtils.js +104 -0
  311. package/dist/src/ui/utils/editorUtils.js.map +1 -0
  312. package/dist/src/ui/utils/markdownParsingUtils.d.ts +10 -0
  313. package/dist/src/ui/utils/markdownParsingUtils.js +150 -0
  314. package/dist/src/ui/utils/markdownParsingUtils.js.map +1 -0
  315. package/dist/src/ui/utils/markdownParsingUtils.test.d.ts +6 -0
  316. package/dist/src/ui/utils/markdownParsingUtils.test.js +163 -0
  317. package/dist/src/ui/utils/markdownParsingUtils.test.js.map +1 -0
  318. package/dist/src/ui/utils/ui-sizing.d.ts +2 -2
  319. package/dist/src/ui/utils/ui-sizing.js +2 -3
  320. package/dist/src/ui/utils/ui-sizing.js.map +1 -1
  321. package/dist/src/ui/utils/ui-sizing.test.js +5 -19
  322. package/dist/src/ui/utils/ui-sizing.test.js.map +1 -1
  323. package/dist/src/utils/cleanup.d.ts +2 -0
  324. package/dist/src/utils/cleanup.js +51 -1
  325. package/dist/src/utils/cleanup.js.map +1 -1
  326. package/dist/src/utils/cleanup.test.js +130 -2
  327. package/dist/src/utils/cleanup.test.js.map +1 -1
  328. package/dist/src/zed-integration/zedIntegration.d.ts +2 -1
  329. package/dist/src/zed-integration/zedIntegration.js +35 -11
  330. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  331. package/dist/src/zed-integration/zedIntegration.test.js +17 -1
  332. package/dist/src/zed-integration/zedIntegration.test.js.map +1 -1
  333. package/dist/tsconfig.tsbuildinfo +1 -1
  334. package/package.json +3 -3
  335. package/dist/google-gemini-cli-0.31.0-preview.1.tgz +0 -0
@@ -99,11 +99,11 @@ describe('Policy Engine Integration Tests', () => {
99
99
  };
100
100
  const config = await createPolicyEngineConfig(settings, ApprovalMode.DEFAULT);
101
101
  const engine = new PolicyEngine(config);
102
- // MCP server allowed (priority 3.1) provides general allow for server
103
- // MCP server allowed (priority 3.1) provides general allow for server
102
+ // MCP server allowed (priority 4.1) provides general allow for server
103
+ // MCP server allowed (priority 4.1) provides general allow for server
104
104
  expect((await engine.check({ name: 'my-server__safe-tool' }, undefined))
105
105
  .decision).toBe(PolicyDecision.ALLOW);
106
- // But specific tool exclude (priority 3.4) wins over server allow
106
+ // But specific tool exclude (priority 4.4) wins over server allow
107
107
  expect((await engine.check({ name: 'my-server__dangerous-tool' }, undefined))
108
108
  .decision).toBe(PolicyDecision.DENY);
109
109
  });
@@ -264,15 +264,15 @@ describe('Policy Engine Integration Tests', () => {
264
264
  const rules = config.rules || [];
265
265
  // Find rules and verify their priorities
266
266
  const blockedToolRule = rules.find((r) => r.toolName === 'blocked-tool');
267
- expect(blockedToolRule?.priority).toBe(3.4); // Command line exclude
267
+ expect(blockedToolRule?.priority).toBe(4.4); // Command line exclude
268
268
  const blockedServerRule = rules.find((r) => r.toolName === 'blocked-server__*');
269
- expect(blockedServerRule?.priority).toBe(3.9); // MCP server exclude
269
+ expect(blockedServerRule?.priority).toBe(4.9); // MCP server exclude
270
270
  const specificToolRule = rules.find((r) => r.toolName === 'specific-tool');
271
- expect(specificToolRule?.priority).toBe(3.3); // Command line allow
271
+ expect(specificToolRule?.priority).toBe(4.3); // Command line allow
272
272
  const trustedServerRule = rules.find((r) => r.toolName === 'trusted-server__*');
273
- expect(trustedServerRule?.priority).toBe(3.2); // MCP trusted server
273
+ expect(trustedServerRule?.priority).toBe(4.2); // MCP trusted server
274
274
  const mcpServerRule = rules.find((r) => r.toolName === 'mcp-server__*');
275
- expect(mcpServerRule?.priority).toBe(3.1); // MCP allowed server
275
+ expect(mcpServerRule?.priority).toBe(4.1); // MCP allowed server
276
276
  const readOnlyToolRule = rules.find((r) => r.toolName === 'glob');
277
277
  // Priority 70 in default tier → 1.07 (Overriding Plan Mode Deny)
278
278
  expect(readOnlyToolRule?.priority).toBeCloseTo(1.07, 5);
@@ -358,13 +358,13 @@ describe('Policy Engine Integration Tests', () => {
358
358
  const rules = config.rules || [];
359
359
  // Verify each rule has the expected priority
360
360
  const tool3Rule = rules.find((r) => r.toolName === 'tool3');
361
- expect(tool3Rule?.priority).toBe(3.4); // Excluded tools (user tier)
361
+ expect(tool3Rule?.priority).toBe(4.4); // Excluded tools (user tier)
362
362
  const server2Rule = rules.find((r) => r.toolName === 'server2__*');
363
- expect(server2Rule?.priority).toBe(3.9); // Excluded servers (user tier)
363
+ expect(server2Rule?.priority).toBe(4.9); // Excluded servers (user tier)
364
364
  const tool1Rule = rules.find((r) => r.toolName === 'tool1');
365
- expect(tool1Rule?.priority).toBe(3.3); // Allowed tools (user tier)
365
+ expect(tool1Rule?.priority).toBe(4.3); // Allowed tools (user tier)
366
366
  const server1Rule = rules.find((r) => r.toolName === 'server1__*');
367
- expect(server1Rule?.priority).toBe(3.1); // Allowed servers (user tier)
367
+ expect(server1Rule?.priority).toBe(4.1); // Allowed servers (user tier)
368
368
  const globRule = rules.find((r) => r.toolName === 'glob');
369
369
  // Priority 70 in default tier → 1.07
370
370
  expect(globRule?.priority).toBeCloseTo(1.07, 5); // Auto-accept read-only
@@ -5,6 +5,26 @@
5
5
  */
6
6
  import { type PolicyEngineConfig, type ApprovalMode, type PolicyEngine, type MessageBus, Storage, type PolicyUpdateConfirmationRequest } from '@google/gemini-cli-core';
7
7
  import { type Settings } from './settings.js';
8
+ /**
9
+ * Temporary flag to automatically accept workspace policies to reduce friction.
10
+ * Exported as 'let' to allow monkey patching in tests via the setter.
11
+ */
12
+ export declare let autoAcceptWorkspacePolicies: boolean;
13
+ /**
14
+ * Sets the autoAcceptWorkspacePolicies flag.
15
+ * Used primarily for testing purposes.
16
+ */
17
+ export declare function setAutoAcceptWorkspacePolicies(value: boolean): void;
18
+ /**
19
+ * Temporary flag to disable workspace level policies altogether.
20
+ * Exported as 'let' to allow monkey patching in tests via the setter.
21
+ */
22
+ export declare let disableWorkspacePolicies: boolean;
23
+ /**
24
+ * Sets the disableWorkspacePolicies flag.
25
+ * Used primarily for testing purposes.
26
+ */
27
+ export declare function setDisableWorkspacePolicies(value: boolean): void;
8
28
  export declare function createPolicyEngineConfig(settings: Settings, approvalMode: ApprovalMode, workspacePoliciesDir?: string): Promise<PolicyEngineConfig>;
9
29
  export declare function createPolicyUpdater(policyEngine: PolicyEngine, messageBus: MessageBus, storage: Storage): void;
10
30
  export interface WorkspacePolicyState {
@@ -3,8 +3,32 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { createPolicyEngineConfig as createCorePolicyEngineConfig, createPolicyUpdater as createCorePolicyUpdater, PolicyIntegrityManager, IntegrityStatus, Storage, writeToStderr, } from '@google/gemini-cli-core';
6
+ import { createPolicyEngineConfig as createCorePolicyEngineConfig, createPolicyUpdater as createCorePolicyUpdater, PolicyIntegrityManager, IntegrityStatus, Storage, writeToStderr, debugLogger, } from '@google/gemini-cli-core';
7
7
  import {} from './settings.js';
8
+ /**
9
+ * Temporary flag to automatically accept workspace policies to reduce friction.
10
+ * Exported as 'let' to allow monkey patching in tests via the setter.
11
+ */
12
+ export let autoAcceptWorkspacePolicies = true;
13
+ /**
14
+ * Sets the autoAcceptWorkspacePolicies flag.
15
+ * Used primarily for testing purposes.
16
+ */
17
+ export function setAutoAcceptWorkspacePolicies(value) {
18
+ autoAcceptWorkspacePolicies = value;
19
+ }
20
+ /**
21
+ * Temporary flag to disable workspace level policies altogether.
22
+ * Exported as 'let' to allow monkey patching in tests via the setter.
23
+ */
24
+ export let disableWorkspacePolicies = true;
25
+ /**
26
+ * Sets the disableWorkspacePolicies flag.
27
+ * Used primarily for testing purposes.
28
+ */
29
+ export function setDisableWorkspacePolicies(value) {
30
+ disableWorkspacePolicies = value;
31
+ }
8
32
  export async function createPolicyEngineConfig(settings, approvalMode, workspacePoliciesDir) {
9
33
  // Explicitly construct PolicySettings from Settings to ensure type safety
10
34
  // and avoid accidental leakage of other settings properties.
@@ -27,7 +51,7 @@ export async function resolveWorkspacePolicyState(options) {
27
51
  const { cwd, trustedFolder, interactive } = options;
28
52
  let workspacePoliciesDir;
29
53
  let policyUpdateConfirmationRequest;
30
- if (trustedFolder) {
54
+ if (trustedFolder && !disableWorkspacePolicies) {
31
55
  const storage = new Storage(cwd);
32
56
  // If we are in the home directory (or rather, our target Gemini dir is the global one),
33
57
  // don't treat it as a workspace to avoid loading global policies twice.
@@ -45,8 +69,8 @@ export async function resolveWorkspacePolicyState(options) {
45
69
  // No workspace policies found
46
70
  workspacePoliciesDir = undefined;
47
71
  }
48
- else if (interactive) {
49
- // Policies changed or are new, and we are in interactive mode
72
+ else if (interactive && !autoAcceptWorkspacePolicies) {
73
+ // Policies changed or are new, and we are in interactive mode and auto-accept is disabled
50
74
  policyUpdateConfirmationRequest = {
51
75
  scope: 'workspace',
52
76
  identifier: cwd,
@@ -55,11 +79,15 @@ export async function resolveWorkspacePolicyState(options) {
55
79
  };
56
80
  }
57
81
  else {
58
- // Non-interactive mode: warn and automatically accept/load
82
+ // Non-interactive mode or auto-accept is enabled: automatically accept/load
59
83
  await integrityManager.acceptIntegrity('workspace', cwd, integrityResult.hash);
60
84
  workspacePoliciesDir = potentialWorkspacePoliciesDir;
61
- // debugLogger.warn here doesn't show up in the terminal. It is showing up only in debug mode on the debug console
62
- writeToStderr('WARNING: Workspace policies changed or are new. Automatically accepting and loading them in non-interactive mode.\n');
85
+ if (!interactive) {
86
+ writeToStderr('WARNING: Workspace policies changed or are new. Automatically accepting and loading them.\n');
87
+ }
88
+ else {
89
+ debugLogger.warn('Workspace policies changed or are new. Automatically accepting and loading them.');
90
+ }
63
91
  }
64
92
  }
65
93
  return { workspacePoliciesDir, policyUpdateConfirmationRequest };
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/config/policy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAML,wBAAwB,IAAI,4BAA4B,EACxD,mBAAmB,IAAI,uBAAuB,EAC9C,sBAAsB,EACtB,eAAe,EACf,OAAO,EAEP,aAAa,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAiB,MAAM,eAAe,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,QAAkB,EAClB,YAA0B,EAC1B,oBAA6B;IAE7B,0EAA0E;IAC1E,6DAA6D;IAC7D,MAAM,cAAc,GAAmB;QACrC,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,oBAAoB;KACrB,CAAC;IAEF,OAAO,4BAA4B,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,YAA0B,EAC1B,UAAsB,EACtB,OAAgB;IAEhB,OAAO,uBAAuB,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAOD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAIjD;IACC,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEpD,IAAI,oBAAwC,CAAC;IAC7C,IAAI,+BAES,CAAC;IAEd,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,wFAAwF;QACxF,wEAAwE;QACxE,IAAI,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACjC,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC;QAC7C,CAAC;QAED,MAAM,6BAA6B,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;QACxE,MAAM,gBAAgB,GAAG,IAAI,sBAAsB,EAAE,CAAC;QACtD,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAAC,cAAc,CAC3D,WAAW,EACX,GAAG,EACH,6BAA6B,CAC9B,CAAC;QAEF,IAAI,eAAe,CAAC,MAAM,KAAK,eAAe,CAAC,KAAK,EAAE,CAAC;YACrD,oBAAoB,GAAG,6BAA6B,CAAC;QACvD,CAAC;aAAM,IACL,eAAe,CAAC,MAAM,KAAK,eAAe,CAAC,GAAG;YAC9C,eAAe,CAAC,SAAS,KAAK,CAAC,EAC/B,CAAC;YACD,8BAA8B;YAC9B,oBAAoB,GAAG,SAAS,CAAC;QACnC,CAAC;aAAM,IAAI,WAAW,EAAE,CAAC;YACvB,8DAA8D;YAC9D,+BAA+B,GAAG;gBAChC,KAAK,EAAE,WAAW;gBAClB,UAAU,EAAE,GAAG;gBACf,SAAS,EAAE,6BAA6B;gBACxC,OAAO,EAAE,eAAe,CAAC,IAAI;aAC9B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,2DAA2D;YAC3D,MAAM,gBAAgB,CAAC,eAAe,CACpC,WAAW,EACX,GAAG,EACH,eAAe,CAAC,IAAI,CACrB,CAAC;YACF,oBAAoB,GAAG,6BAA6B,CAAC;YACrD,kHAAkH;YAClH,aAAa,CACX,qHAAqH,CACtH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,oBAAoB,EAAE,+BAA+B,EAAE,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/config/policy.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
7
  import * as fs from 'node:fs';
8
8
  import * as path from 'node:path';
9
9
  import * as os from 'node:os';
10
- import { resolveWorkspacePolicyState } from './policy.js';
10
+ import { resolveWorkspacePolicyState, autoAcceptWorkspacePolicies, setAutoAcceptWorkspacePolicies, disableWorkspacePolicies, setDisableWorkspacePolicies, } from './policy.js';
11
11
  import { writeToStderr } from '@google/gemini-cli-core';
12
12
  // Mock debugLogger to avoid noise in test output
13
13
  vi.mock('@google/gemini-cli-core', async (importOriginal) => {
@@ -34,6 +34,8 @@ describe('resolveWorkspacePolicyState', () => {
34
34
  workspaceDir = path.join(tempDir, 'workspace');
35
35
  fs.mkdirSync(workspaceDir);
36
36
  policiesDir = path.join(workspaceDir, '.gemini', 'policies');
37
+ // Enable policies for these tests to verify loading logic
38
+ setDisableWorkspacePolicies(false);
37
39
  vi.clearAllMocks();
38
40
  });
39
41
  afterEach(() => {
@@ -52,21 +54,25 @@ describe('resolveWorkspacePolicyState', () => {
52
54
  policyUpdateConfirmationRequest: undefined,
53
55
  });
54
56
  });
57
+ it('should have disableWorkspacePolicies set to true by default', () => {
58
+ // We explicitly set it to false in beforeEach for other tests,
59
+ // so here we test that setting it to true works.
60
+ setDisableWorkspacePolicies(true);
61
+ expect(disableWorkspacePolicies).toBe(true);
62
+ });
55
63
  it('should return policy directory if integrity matches', async () => {
56
64
  // Set up policies directory with a file
57
65
  fs.mkdirSync(policiesDir, { recursive: true });
58
66
  fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
59
- // First call to establish integrity (interactive accept)
67
+ // First call to establish integrity (interactive auto-accept)
60
68
  const firstResult = await resolveWorkspacePolicyState({
61
69
  cwd: workspaceDir,
62
70
  trustedFolder: true,
63
71
  interactive: true,
64
72
  });
65
- expect(firstResult.policyUpdateConfirmationRequest).toBeDefined();
66
- // Establish integrity manually as if accepted
67
- const { PolicyIntegrityManager } = await import('@google/gemini-cli-core');
68
- const integrityManager = new PolicyIntegrityManager();
69
- await integrityManager.acceptIntegrity('workspace', workspaceDir, firstResult.policyUpdateConfirmationRequest.newHash);
73
+ expect(firstResult.workspacePoliciesDir).toBe(policiesDir);
74
+ expect(firstResult.policyUpdateConfirmationRequest).toBeUndefined();
75
+ expect(writeToStderr).not.toHaveBeenCalled();
70
76
  // Second call should match
71
77
  const result = await resolveWorkspacePolicyState({
72
78
  cwd: workspaceDir,
@@ -85,23 +91,30 @@ describe('resolveWorkspacePolicyState', () => {
85
91
  expect(result.workspacePoliciesDir).toBeUndefined();
86
92
  expect(result.policyUpdateConfirmationRequest).toBeUndefined();
87
93
  });
88
- it('should return confirmation request if changed in interactive mode', async () => {
89
- fs.mkdirSync(policiesDir, { recursive: true });
90
- fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
91
- const result = await resolveWorkspacePolicyState({
92
- cwd: workspaceDir,
93
- trustedFolder: true,
94
- interactive: true,
95
- });
96
- expect(result.workspacePoliciesDir).toBeUndefined();
97
- expect(result.policyUpdateConfirmationRequest).toEqual({
98
- scope: 'workspace',
99
- identifier: workspaceDir,
100
- policyDir: policiesDir,
101
- newHash: expect.any(String),
102
- });
94
+ it('should return confirmation request if changed in interactive mode when AUTO_ACCEPT is false', async () => {
95
+ const originalValue = autoAcceptWorkspacePolicies;
96
+ setAutoAcceptWorkspacePolicies(false);
97
+ try {
98
+ fs.mkdirSync(policiesDir, { recursive: true });
99
+ fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
100
+ const result = await resolveWorkspacePolicyState({
101
+ cwd: workspaceDir,
102
+ trustedFolder: true,
103
+ interactive: true,
104
+ });
105
+ expect(result.workspacePoliciesDir).toBeUndefined();
106
+ expect(result.policyUpdateConfirmationRequest).toEqual({
107
+ scope: 'workspace',
108
+ identifier: workspaceDir,
109
+ policyDir: policiesDir,
110
+ newHash: expect.any(String),
111
+ });
112
+ }
113
+ finally {
114
+ setAutoAcceptWorkspacePolicies(originalValue);
115
+ }
103
116
  });
104
- it('should warn and auto-accept if changed in non-interactive mode', async () => {
117
+ it('should warn and auto-accept if changed in non-interactive mode when AUTO_ACCEPT is true', async () => {
105
118
  fs.mkdirSync(policiesDir, { recursive: true });
106
119
  fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
107
120
  const result = await resolveWorkspacePolicyState({
@@ -113,6 +126,25 @@ describe('resolveWorkspacePolicyState', () => {
113
126
  expect(result.policyUpdateConfirmationRequest).toBeUndefined();
114
127
  expect(writeToStderr).toHaveBeenCalledWith(expect.stringContaining('Automatically accepting and loading'));
115
128
  });
129
+ it('should warn and auto-accept if changed in non-interactive mode when AUTO_ACCEPT is false', async () => {
130
+ const originalValue = autoAcceptWorkspacePolicies;
131
+ setAutoAcceptWorkspacePolicies(false);
132
+ try {
133
+ fs.mkdirSync(policiesDir, { recursive: true });
134
+ fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
135
+ const result = await resolveWorkspacePolicyState({
136
+ cwd: workspaceDir,
137
+ trustedFolder: true,
138
+ interactive: false,
139
+ });
140
+ expect(result.workspacePoliciesDir).toBe(policiesDir);
141
+ expect(result.policyUpdateConfirmationRequest).toBeUndefined();
142
+ expect(writeToStderr).toHaveBeenCalledWith(expect.stringContaining('Automatically accepting and loading'));
143
+ }
144
+ finally {
145
+ setAutoAcceptWorkspacePolicies(originalValue);
146
+ }
147
+ });
116
148
  it('should not return workspace policies if cwd is the home directory', async () => {
117
149
  const policiesDir = path.join(tempDir, '.gemini', 'policies');
118
150
  fs.mkdirSync(policiesDir, { recursive: true });
@@ -126,7 +158,22 @@ describe('resolveWorkspacePolicyState', () => {
126
158
  expect(result.workspacePoliciesDir).toBeUndefined();
127
159
  expect(result.policyUpdateConfirmationRequest).toBeUndefined();
128
160
  });
129
- it('should not return workspace policies if cwd is a symlink to the home directory', async () => {
161
+ it('should return empty state if disableWorkspacePolicies is true even if folder is trusted', async () => {
162
+ setDisableWorkspacePolicies(true);
163
+ // Set up policies directory with a file
164
+ fs.mkdirSync(policiesDir, { recursive: true });
165
+ fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
166
+ const result = await resolveWorkspacePolicyState({
167
+ cwd: workspaceDir,
168
+ trustedFolder: true,
169
+ interactive: true,
170
+ });
171
+ expect(result).toEqual({
172
+ workspacePoliciesDir: undefined,
173
+ policyUpdateConfirmationRequest: undefined,
174
+ });
175
+ });
176
+ it('should return empty state if cwd is a symlink to the home directory', async () => {
130
177
  const policiesDir = path.join(tempDir, '.gemini', 'policies');
131
178
  fs.mkdirSync(policiesDir, { recursive: true });
132
179
  fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
@@ -1 +1 @@
1
- {"version":3,"file":"policy.test.js","sourceRoot":"","sources":["../../../src/config/policy.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"policy.test.js","sourceRoot":"","sources":["../../../src/config/policy.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,8BAA8B,EAC9B,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,iDAAiD;AACjD,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAC1D,MAAM,MAAM,GACV,MAAM,cAAc,EAA4C,CAAC;IACnE,OAAO;QACL,GAAG,MAAM;QACT,WAAW,EAAE;YACX,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;YACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;YACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;SACf;QACD,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;KACvB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,IAAI,OAAe,CAAC;IACpB,IAAI,YAAoB,CAAC;IACzB,IAAI,WAAmB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,4CAA4C;QAC5C,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACrE,8EAA8E;QAC9E,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAEvC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC/C,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC3B,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAE7D,0DAA0D;QAC1D,2BAA2B,CAAC,KAAK,CAAC,CAAC;QAEnC,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,+BAA+B;QAC/B,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC;YAC/C,GAAG,EAAE,YAAY;YACjB,aAAa,EAAE,KAAK;YACpB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,oBAAoB,EAAE,SAAS;YAC/B,+BAA+B,EAAE,SAAS;SAC3C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,+DAA+D;QAC/D,iDAAiD;QACjD,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,wCAAwC;QACxC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC;QAEtE,8DAA8D;QAC9D,MAAM,WAAW,GAAG,MAAM,2BAA2B,CAAC;YACpD,GAAG,EAAE,YAAY;YACjB,aAAa,EAAE,IAAI;YACnB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3D,MAAM,CAAC,WAAW,CAAC,+BAA+B,CAAC,CAAC,aAAa,EAAE,CAAC;QACpE,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAE7C,2BAA2B;QAE3B,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC;YAC/C,GAAG,EAAE,YAAY;YACjB,aAAa,EAAE,IAAI;YACnB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,aAAa,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC;YAC/C,GAAG,EAAE,YAAY;YACjB,aAAa,EAAE,IAAI;YACnB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,aAAa,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;QAC3G,MAAM,aAAa,GAAG,2BAA2B,CAAC;QAClD,8BAA8B,CAAC,KAAK,CAAC,CAAC;QAEtC,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC;YAEtE,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC;gBAC/C,GAAG,EAAE,YAAY;gBACjB,aAAa,EAAE,IAAI;gBACnB,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,aAAa,EAAE,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,OAAO,CAAC;gBACrD,KAAK,EAAE,WAAW;gBAClB,UAAU,EAAE,YAAY;gBACxB,SAAS,EAAE,WAAW;gBACtB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;aAC5B,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,8BAA8B,CAAC,aAAa,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;QACvG,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC;YAC/C,GAAG,EAAE,YAAY;YACjB,aAAa,EAAE,IAAI;YACnB,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/D,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC,qCAAqC,CAAC,CAC/D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;QACxG,MAAM,aAAa,GAAG,2BAA2B,CAAC;QAClD,8BAA8B,CAAC,KAAK,CAAC,CAAC;QAEtC,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC;YAEtE,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC;gBAC/C,GAAG,EAAE,YAAY;gBACjB,aAAa,EAAE,IAAI;gBACnB,WAAW,EAAE,KAAK;aACnB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,aAAa,EAAE,CAAC;YAC/D,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC,qCAAqC,CAAC,CAC/D,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,8BAA8B,CAAC,aAAa,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC9D,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC;QAEtE,oEAAoE;QACpE,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC;YAC/C,GAAG,EAAE,OAAO;YACZ,aAAa,EAAE,IAAI;YACnB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,aAAa,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;QACvG,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAElC,wCAAwC;QACxC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC;YAC/C,GAAG,EAAE,YAAY;YACjB,aAAa,EAAE,IAAI;YACnB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,oBAAoB,EAAE,SAAS;YAC/B,+BAA+B,EAAE,SAAS;SAC3C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC9D,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC;QAEtE,yCAAyC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAC1B,EAAE,CAAC,MAAM,EAAE,EACX,sBAAsB,IAAI,CAAC,GAAG,EAAE,EAAE,CACnC,CAAC;QACF,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAE3C,IAAI,CAAC;YACH,qCAAqC;YACrC,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC;gBAC/C,GAAG,EAAE,UAAU;gBACf,aAAa,EAAE,IAAI;gBACnB,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,aAAa,EAAE,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,aAAa,EAAE,CAAC;QACjE,CAAC;gBAAS,CAAC;YACT,mBAAmB;YACnB,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -655,6 +655,22 @@ declare const SETTINGS_SCHEMA: {
655
655
  readonly label: "Off";
656
656
  }];
657
657
  };
658
+ readonly errorVerbosity: {
659
+ readonly type: "enum";
660
+ readonly label: "Error Verbosity";
661
+ readonly category: "UI";
662
+ readonly requiresRestart: false;
663
+ readonly default: "low";
664
+ readonly description: "Controls whether recoverable errors are hidden (low) or fully shown (full).";
665
+ readonly showInDialog: true;
666
+ readonly options: readonly [{
667
+ readonly value: "low";
668
+ readonly label: "Low";
669
+ }, {
670
+ readonly value: "full";
671
+ readonly label: "Full";
672
+ }];
673
+ };
658
674
  readonly customWittyPhrases: {
659
675
  readonly type: "array";
660
676
  readonly label: "Custom Witty Phrases";
@@ -757,6 +773,36 @@ declare const SETTINGS_SCHEMA: {
757
773
  readonly showInDialog: false;
758
774
  readonly ref: "TelemetrySettings";
759
775
  };
776
+ readonly billing: {
777
+ readonly type: "object";
778
+ readonly label: "Billing";
779
+ readonly category: "Advanced";
780
+ readonly requiresRestart: false;
781
+ readonly default: {};
782
+ readonly description: "Billing and AI credits settings.";
783
+ readonly showInDialog: false;
784
+ readonly properties: {
785
+ readonly overageStrategy: {
786
+ readonly type: "enum";
787
+ readonly label: "Overage Strategy";
788
+ readonly category: "Advanced";
789
+ readonly requiresRestart: false;
790
+ readonly default: "ask";
791
+ readonly description: string;
792
+ readonly showInDialog: true;
793
+ readonly options: readonly [{
794
+ readonly value: "ask";
795
+ readonly label: "Ask each time";
796
+ }, {
797
+ readonly value: "always";
798
+ readonly label: "Always use credits";
799
+ }, {
800
+ readonly value: "never";
801
+ readonly label: "Never use credits";
802
+ }];
803
+ };
804
+ };
805
+ };
760
806
  readonly model: {
761
807
  readonly type: "object";
762
808
  readonly label: "Model";
@@ -773,7 +819,7 @@ declare const SETTINGS_SCHEMA: {
773
819
  readonly requiresRestart: false;
774
820
  readonly default: string | undefined;
775
821
  readonly description: "The Gemini model to use for conversations.";
776
- readonly showInDialog: false;
822
+ readonly showInDialog: true;
777
823
  };
778
824
  readonly maxSessionTurns: {
779
825
  readonly type: "number";
@@ -1668,6 +1714,55 @@ declare const SETTINGS_SCHEMA: {
1668
1714
  readonly description: "Enable web fetch behavior that bypasses LLM summarization.";
1669
1715
  readonly showInDialog: true;
1670
1716
  };
1717
+ readonly gemmaModelRouter: {
1718
+ readonly type: "object";
1719
+ readonly label: "Gemma Model Router";
1720
+ readonly category: "Experimental";
1721
+ readonly requiresRestart: true;
1722
+ readonly default: {};
1723
+ readonly description: "Enable Gemma model router (experimental).";
1724
+ readonly showInDialog: true;
1725
+ readonly properties: {
1726
+ readonly enabled: {
1727
+ readonly type: "boolean";
1728
+ readonly label: "Enable Gemma Model Router";
1729
+ readonly category: "Experimental";
1730
+ readonly requiresRestart: true;
1731
+ readonly default: false;
1732
+ readonly description: "Enable the Gemma Model Router. Requires a local endpoint serving Gemma via the Gemini API using LiteRT-LM shim.";
1733
+ readonly showInDialog: true;
1734
+ };
1735
+ readonly classifier: {
1736
+ readonly type: "object";
1737
+ readonly label: "Classifier";
1738
+ readonly category: "Experimental";
1739
+ readonly requiresRestart: true;
1740
+ readonly default: {};
1741
+ readonly description: "Classifier configuration.";
1742
+ readonly showInDialog: false;
1743
+ readonly properties: {
1744
+ readonly host: {
1745
+ readonly type: "string";
1746
+ readonly label: "Host";
1747
+ readonly category: "Experimental";
1748
+ readonly requiresRestart: true;
1749
+ readonly default: "http://localhost:9379";
1750
+ readonly description: "The host of the classifier.";
1751
+ readonly showInDialog: false;
1752
+ };
1753
+ readonly model: {
1754
+ readonly type: "string";
1755
+ readonly label: "Model";
1756
+ readonly category: "Experimental";
1757
+ readonly requiresRestart: true;
1758
+ readonly default: "gemma3-1b-gpu-custom";
1759
+ readonly description: "The model to use for the classifier. Only tested on `gemma3-1b-gpu-custom`.";
1760
+ readonly showInDialog: false;
1761
+ };
1762
+ };
1763
+ };
1764
+ };
1765
+ };
1671
1766
  };
1672
1767
  };
1673
1768
  readonly extensions: {
@@ -2030,12 +2125,12 @@ export declare function getSettingsSchema(): SettingsSchemaType;
2030
2125
  type InferSettings<T extends SettingsSchema> = {
2031
2126
  -readonly [K in keyof T]?: T[K] extends {
2032
2127
  properties: SettingsSchema;
2033
- } ? InferSettings<T[K]['properties']> : T[K]['type'] extends 'enum' ? T[K]['options'] extends readonly SettingEnumOption[] ? T[K]['options'][number]['value'] : T[K]['default'] : T[K]['default'] extends boolean ? boolean : T[K]['default'];
2128
+ } ? InferSettings<T[K]['properties']> : T[K]['type'] extends 'enum' ? T[K]['options'] extends readonly SettingEnumOption[] ? T[K]['options'][number]['value'] : T[K]['default'] : T[K]['default'] extends boolean ? boolean : T[K]['default'] extends string ? string : T[K]['default'];
2034
2129
  };
2035
2130
  type InferMergedSettings<T extends SettingsSchema> = {
2036
2131
  -readonly [K in keyof T]-?: T[K] extends {
2037
2132
  properties: SettingsSchema;
2038
- } ? InferMergedSettings<T[K]['properties']> : T[K]['type'] extends 'enum' ? T[K]['options'] extends readonly SettingEnumOption[] ? T[K]['options'][number]['value'] : T[K]['default'] : T[K]['default'] extends boolean ? boolean : T[K]['default'];
2133
+ } ? InferMergedSettings<T[K]['properties']> : T[K]['type'] extends 'enum' ? T[K]['options'] extends readonly SettingEnumOption[] ? T[K]['options'][number]['value'] : T[K]['default'] : T[K]['default'] extends boolean ? boolean : T[K]['default'] extends string ? string : T[K]['default'];
2039
2134
  };
2040
2135
  export type Settings = InferSettings<SettingsSchemaType>;
2041
2136
  export type MergedSettings = InferMergedSettings<SettingsSchemaType>;
@@ -605,6 +605,19 @@ const SETTINGS_SCHEMA = {
605
605
  { value: 'off', label: 'Off' },
606
606
  ],
607
607
  },
608
+ errorVerbosity: {
609
+ type: 'enum',
610
+ label: 'Error Verbosity',
611
+ category: 'UI',
612
+ requiresRestart: false,
613
+ default: 'low',
614
+ description: 'Controls whether recoverable errors are hidden (low) or fully shown (full).',
615
+ showInDialog: true,
616
+ options: [
617
+ { value: 'low', label: 'Low' },
618
+ { value: 'full', label: 'Full' },
619
+ ],
620
+ },
608
621
  customWittyPhrases: {
609
622
  type: 'array',
610
623
  label: 'Custom Witty Phrases',
@@ -708,6 +721,35 @@ const SETTINGS_SCHEMA = {
708
721
  showInDialog: false,
709
722
  ref: 'TelemetrySettings',
710
723
  },
724
+ billing: {
725
+ type: 'object',
726
+ label: 'Billing',
727
+ category: 'Advanced',
728
+ requiresRestart: false,
729
+ default: {},
730
+ description: 'Billing and AI credits settings.',
731
+ showInDialog: false,
732
+ properties: {
733
+ overageStrategy: {
734
+ type: 'enum',
735
+ label: 'Overage Strategy',
736
+ category: 'Advanced',
737
+ requiresRestart: false,
738
+ default: 'ask',
739
+ description: oneLine `
740
+ How to handle quota exhaustion when AI credits are available.
741
+ 'ask' prompts each time, 'always' automatically uses credits,
742
+ 'never' disables credit usage.
743
+ `,
744
+ showInDialog: true,
745
+ options: [
746
+ { value: 'ask', label: 'Ask each time' },
747
+ { value: 'always', label: 'Always use credits' },
748
+ { value: 'never', label: 'Never use credits' },
749
+ ],
750
+ },
751
+ },
752
+ },
711
753
  model: {
712
754
  type: 'object',
713
755
  label: 'Model',
@@ -724,7 +766,7 @@ const SETTINGS_SCHEMA = {
724
766
  requiresRestart: false,
725
767
  default: undefined,
726
768
  description: 'The Gemini model to use for conversations.',
727
- showInDialog: false,
769
+ showInDialog: true,
728
770
  },
729
771
  maxSessionTurns: {
730
772
  type: 'number',
@@ -1621,6 +1663,55 @@ const SETTINGS_SCHEMA = {
1621
1663
  description: 'Enable web fetch behavior that bypasses LLM summarization.',
1622
1664
  showInDialog: true,
1623
1665
  },
1666
+ gemmaModelRouter: {
1667
+ type: 'object',
1668
+ label: 'Gemma Model Router',
1669
+ category: 'Experimental',
1670
+ requiresRestart: true,
1671
+ default: {},
1672
+ description: 'Enable Gemma model router (experimental).',
1673
+ showInDialog: true,
1674
+ properties: {
1675
+ enabled: {
1676
+ type: 'boolean',
1677
+ label: 'Enable Gemma Model Router',
1678
+ category: 'Experimental',
1679
+ requiresRestart: true,
1680
+ default: false,
1681
+ description: 'Enable the Gemma Model Router. Requires a local endpoint serving Gemma via the Gemini API using LiteRT-LM shim.',
1682
+ showInDialog: true,
1683
+ },
1684
+ classifier: {
1685
+ type: 'object',
1686
+ label: 'Classifier',
1687
+ category: 'Experimental',
1688
+ requiresRestart: true,
1689
+ default: {},
1690
+ description: 'Classifier configuration.',
1691
+ showInDialog: false,
1692
+ properties: {
1693
+ host: {
1694
+ type: 'string',
1695
+ label: 'Host',
1696
+ category: 'Experimental',
1697
+ requiresRestart: true,
1698
+ default: 'http://localhost:9379',
1699
+ description: 'The host of the classifier.',
1700
+ showInDialog: false,
1701
+ },
1702
+ model: {
1703
+ type: 'string',
1704
+ label: 'Model',
1705
+ category: 'Experimental',
1706
+ requiresRestart: true,
1707
+ default: 'gemma3-1b-gpu-custom',
1708
+ description: 'The model to use for the classifier. Only tested on `gemma3-1b-gpu-custom`.',
1709
+ showInDialog: false,
1710
+ },
1711
+ },
1712
+ },
1713
+ },
1714
+ },
1624
1715
  },
1625
1716
  },
1626
1717
  extensions: {