@quantum-ai/gemini-cli 0.45.4 → 0.45.5

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 (1440) hide show
  1. package/README.md +394 -0
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/package.json +12 -11
  5. package/dist/src/config/settingsSchema.d.ts +1 -1
  6. package/dist/src/index.d.ts +1 -0
  7. package/dist/src/index.js +1 -0
  8. package/dist/src/index.js.map +1 -1
  9. package/dist/src/ui/App.d.ts +1 -1
  10. package/dist/src/ui/AppContainer.d.ts +1 -1
  11. package/dist/src/ui/IdeIntegrationNudge.d.ts +1 -1
  12. package/dist/src/ui/auth/LoginRestartDialog.d.ts +1 -1
  13. package/dist/src/ui/components/AdminSettingsChangedDialog.d.ts +1 -1
  14. package/dist/src/ui/components/AlternateBufferQuittingDisplay.d.ts +1 -1
  15. package/dist/src/ui/components/AppHeader.d.ts +1 -1
  16. package/dist/src/ui/components/BackgroundTaskDisplay.d.ts +1 -1
  17. package/dist/src/ui/components/Banner.d.ts +1 -1
  18. package/dist/src/ui/components/CliSpinner.d.ts +1 -1
  19. package/dist/src/ui/components/Composer.d.ts +1 -1
  20. package/dist/src/ui/components/ConfigInitDisplay.d.ts +1 -1
  21. package/dist/src/ui/components/ConsentPrompt.d.ts +1 -1
  22. package/dist/src/ui/components/ContextUsageDisplay.d.ts +1 -1
  23. package/dist/src/ui/components/DebugProfiler.d.ts +1 -1
  24. package/dist/src/ui/components/DialogManager.d.ts +1 -1
  25. package/dist/src/ui/components/IdeTrustChangeDialog.d.ts +1 -1
  26. package/dist/src/ui/components/LoopDetectionConfirmation.d.ts +1 -1
  27. package/dist/src/ui/components/MainContent.d.ts +1 -1
  28. package/dist/src/ui/components/ModelQuotaDisplay.d.ts +1 -1
  29. package/dist/src/ui/components/NewAgentsNotification.d.ts +1 -1
  30. package/dist/src/ui/components/Notifications.d.ts +1 -1
  31. package/dist/src/ui/components/QueuedMessageDisplay.d.ts +1 -1
  32. package/dist/src/ui/components/QuittingDisplay.d.ts +1 -1
  33. package/dist/src/ui/components/ShowMoreLines.d.ts +1 -1
  34. package/dist/src/ui/components/SuggestionsDisplay.d.ts +1 -1
  35. package/dist/src/ui/components/Table.d.ts +1 -1
  36. package/dist/src/ui/components/UpdateNotification.d.ts +1 -1
  37. package/dist/src/ui/components/shared/SlicingMaxSizedBox.d.ts +1 -1
  38. package/dist/src/ui/components/triage/TriageDuplicates.d.ts +1 -1
  39. package/dist/src/ui/components/triage/TriageIssues.d.ts +1 -1
  40. package/dist/src/ui/contexts/KeypressContext.d.ts +1 -1
  41. package/dist/src/ui/contexts/MouseContext.d.ts +1 -1
  42. package/dist/src/ui/contexts/TerminalContext.d.ts +1 -1
  43. package/dist/src/ui/contexts/VimModeContext.d.ts +1 -1
  44. package/dist/src/ui/hooks/useExtensionUpdates.d.ts +2 -2
  45. package/dist/src/ui/hooks/useInlineEditBuffer.d.ts +1 -1
  46. package/dist/src/ui/hooks/useStateAndRef.d.ts +1 -1
  47. package/dist/src/ui/privacy/CloudFreePrivacyNotice.d.ts +1 -1
  48. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.d.ts +1 -1
  49. package/dist/src/ui/privacy/GeminiPrivacyNotice.d.ts +1 -1
  50. package/dist/src/ui/privacy/PrivacyNotice.d.ts +1 -1
  51. package/dist/src/utils/devtoolsService.js +1 -1
  52. package/dist/src/utils/devtoolsService.js.map +1 -1
  53. package/dist/tsconfig.tsbuildinfo +1 -1
  54. package/package.json +12 -11
  55. package/dist/src/acp/acpCommandHandler.test.d.ts +0 -6
  56. package/dist/src/acp/acpCommandHandler.test.js +0 -28
  57. package/dist/src/acp/acpCommandHandler.test.js.map +0 -1
  58. package/dist/src/acp/acpErrors.test.d.ts +0 -6
  59. package/dist/src/acp/acpErrors.test.js +0 -38
  60. package/dist/src/acp/acpErrors.test.js.map +0 -1
  61. package/dist/src/acp/acpFileSystemService.test.d.ts +0 -6
  62. package/dist/src/acp/acpFileSystemService.test.js +0 -162
  63. package/dist/src/acp/acpFileSystemService.test.js.map +0 -1
  64. package/dist/src/acp/acpResume.test.d.ts +0 -6
  65. package/dist/src/acp/acpResume.test.js +0 -260
  66. package/dist/src/acp/acpResume.test.js.map +0 -1
  67. package/dist/src/acp/acpRpcDispatcher.test.d.ts +0 -6
  68. package/dist/src/acp/acpRpcDispatcher.test.js +0 -238
  69. package/dist/src/acp/acpRpcDispatcher.test.js.map +0 -1
  70. package/dist/src/acp/acpSession.test.d.ts +0 -6
  71. package/dist/src/acp/acpSession.test.js +0 -742
  72. package/dist/src/acp/acpSession.test.js.map +0 -1
  73. package/dist/src/acp/acpSessionManager.test.d.ts +0 -6
  74. package/dist/src/acp/acpSessionManager.test.js +0 -283
  75. package/dist/src/acp/acpSessionManager.test.js.map +0 -1
  76. package/dist/src/acp/commands/extensions.test.d.ts +0 -6
  77. package/dist/src/acp/commands/extensions.test.js +0 -70
  78. package/dist/src/acp/commands/extensions.test.js.map +0 -1
  79. package/dist/src/acp/commands/help.test.d.ts +0 -6
  80. package/dist/src/acp/commands/help.test.js +0 -40
  81. package/dist/src/acp/commands/help.test.js.map +0 -1
  82. package/dist/src/acp/commands/restore.test.d.ts +0 -6
  83. package/dist/src/acp/commands/restore.test.js +0 -173
  84. package/dist/src/acp/commands/restore.test.js.map +0 -1
  85. package/dist/src/commands/extensions/configure.test.d.ts +0 -1
  86. package/dist/src/commands/extensions/configure.test.js +0 -195
  87. package/dist/src/commands/extensions/configure.test.js.map +0 -1
  88. package/dist/src/commands/extensions/disable.test.d.ts +0 -6
  89. package/dist/src/commands/extensions/disable.test.js +0 -169
  90. package/dist/src/commands/extensions/disable.test.js.map +0 -1
  91. package/dist/src/commands/extensions/enable.test.d.ts +0 -6
  92. package/dist/src/commands/extensions/enable.test.js +0 -199
  93. package/dist/src/commands/extensions/enable.test.js.map +0 -1
  94. package/dist/src/commands/extensions/install.test.d.ts +0 -6
  95. package/dist/src/commands/extensions/install.test.js +0 -311
  96. package/dist/src/commands/extensions/install.test.js.map +0 -1
  97. package/dist/src/commands/extensions/link.test.d.ts +0 -6
  98. package/dist/src/commands/extensions/link.test.js +0 -121
  99. package/dist/src/commands/extensions/link.test.js.map +0 -1
  100. package/dist/src/commands/extensions/list.test.d.ts +0 -6
  101. package/dist/src/commands/extensions/list.test.js +0 -132
  102. package/dist/src/commands/extensions/list.test.js.map +0 -1
  103. package/dist/src/commands/extensions/new.test.d.ts +0 -6
  104. package/dist/src/commands/extensions/new.test.js +0 -62
  105. package/dist/src/commands/extensions/new.test.js.map +0 -1
  106. package/dist/src/commands/extensions/uninstall.test.d.ts +0 -6
  107. package/dist/src/commands/extensions/uninstall.test.js +0 -240
  108. package/dist/src/commands/extensions/uninstall.test.js.map +0 -1
  109. package/dist/src/commands/extensions/update.test.d.ts +0 -6
  110. package/dist/src/commands/extensions/update.test.js +0 -196
  111. package/dist/src/commands/extensions/update.test.js.map +0 -1
  112. package/dist/src/commands/extensions/validate.test.d.ts +0 -6
  113. package/dist/src/commands/extensions/validate.test.js +0 -96
  114. package/dist/src/commands/extensions/validate.test.js.map +0 -1
  115. package/dist/src/commands/extensions.test.d.ts +0 -6
  116. package/dist/src/commands/extensions.test.js +0 -67
  117. package/dist/src/commands/extensions.test.js.map +0 -1
  118. package/dist/src/commands/gemma/logs.test.d.ts +0 -6
  119. package/dist/src/commands/gemma/logs.test.js +0 -122
  120. package/dist/src/commands/gemma/logs.test.js.map +0 -1
  121. package/dist/src/commands/gemma/platform.test.d.ts +0 -6
  122. package/dist/src/commands/gemma/platform.test.js +0 -108
  123. package/dist/src/commands/gemma/platform.test.js.map +0 -1
  124. package/dist/src/commands/gemma/setup.test.d.ts +0 -6
  125. package/dist/src/commands/gemma/setup.test.js +0 -36
  126. package/dist/src/commands/gemma/setup.test.js.map +0 -1
  127. package/dist/src/commands/gemma/stop.test.d.ts +0 -6
  128. package/dist/src/commands/gemma/stop.test.js +0 -89
  129. package/dist/src/commands/gemma/stop.test.js.map +0 -1
  130. package/dist/src/commands/hooks/migrate.test.d.ts +0 -6
  131. package/dist/src/commands/hooks/migrate.test.js +0 -388
  132. package/dist/src/commands/hooks/migrate.test.js.map +0 -1
  133. package/dist/src/commands/mcp/add.test.d.ts +0 -6
  134. package/dist/src/commands/mcp/add.test.js +0 -274
  135. package/dist/src/commands/mcp/add.test.js.map +0 -1
  136. package/dist/src/commands/mcp/list.test.d.ts +0 -6
  137. package/dist/src/commands/mcp/list.test.js +0 -477
  138. package/dist/src/commands/mcp/list.test.js.map +0 -1
  139. package/dist/src/commands/mcp/remove.test.d.ts +0 -6
  140. package/dist/src/commands/mcp/remove.test.js +0 -206
  141. package/dist/src/commands/mcp/remove.test.js.map +0 -1
  142. package/dist/src/commands/mcp.test.d.ts +0 -6
  143. package/dist/src/commands/mcp.test.js +0 -64
  144. package/dist/src/commands/mcp.test.js.map +0 -1
  145. package/dist/src/commands/skills/disable.test.d.ts +0 -6
  146. package/dist/src/commands/skills/disable.test.js +0 -93
  147. package/dist/src/commands/skills/disable.test.js.map +0 -1
  148. package/dist/src/commands/skills/enable.test.d.ts +0 -6
  149. package/dist/src/commands/skills/enable.test.js +0 -104
  150. package/dist/src/commands/skills/enable.test.js.map +0 -1
  151. package/dist/src/commands/skills/install.test.d.ts +0 -6
  152. package/dist/src/commands/skills/install.test.js +0 -99
  153. package/dist/src/commands/skills/install.test.js.map +0 -1
  154. package/dist/src/commands/skills/link.test.d.ts +0 -6
  155. package/dist/src/commands/skills/link.test.js +0 -53
  156. package/dist/src/commands/skills/link.test.js.map +0 -1
  157. package/dist/src/commands/skills/list.test.d.ts +0 -6
  158. package/dist/src/commands/skills/list.test.js +0 -127
  159. package/dist/src/commands/skills/list.test.js.map +0 -1
  160. package/dist/src/commands/skills/uninstall.test.d.ts +0 -6
  161. package/dist/src/commands/skills/uninstall.test.js +0 -65
  162. package/dist/src/commands/skills/uninstall.test.js.map +0 -1
  163. package/dist/src/commands/skills.test.d.ts +0 -6
  164. package/dist/src/commands/skills.test.js +0 -49
  165. package/dist/src/commands/skills.test.js.map +0 -1
  166. package/dist/src/commands/utils.test.d.ts +0 -6
  167. package/dist/src/commands/utils.test.js +0 -35
  168. package/dist/src/commands/utils.test.js.map +0 -1
  169. package/dist/src/config/auth.test.d.ts +0 -6
  170. package/dist/src/config/auth.test.js +0 -96
  171. package/dist/src/config/auth.test.js.map +0 -1
  172. package/dist/src/config/config.integration.test.d.ts +0 -6
  173. package/dist/src/config/config.integration.test.js +0 -205
  174. package/dist/src/config/config.integration.test.js.map +0 -1
  175. package/dist/src/config/config.test.d.ts +0 -6
  176. package/dist/src/config/config.test.js +0 -3124
  177. package/dist/src/config/config.test.js.map +0 -1
  178. package/dist/src/config/extension-manager-agents.test.d.ts +0 -6
  179. package/dist/src/config/extension-manager-agents.test.js +0 -116
  180. package/dist/src/config/extension-manager-agents.test.js.map +0 -1
  181. package/dist/src/config/extension-manager-hydration.test.d.ts +0 -6
  182. package/dist/src/config/extension-manager-hydration.test.js +0 -262
  183. package/dist/src/config/extension-manager-hydration.test.js.map +0 -1
  184. package/dist/src/config/extension-manager-permissions.test.d.ts +0 -6
  185. package/dist/src/config/extension-manager-permissions.test.js +0 -107
  186. package/dist/src/config/extension-manager-permissions.test.js.map +0 -1
  187. package/dist/src/config/extension-manager-scope.test.d.ts +0 -6
  188. package/dist/src/config/extension-manager-scope.test.js +0 -158
  189. package/dist/src/config/extension-manager-scope.test.js.map +0 -1
  190. package/dist/src/config/extension-manager-skills.test.d.ts +0 -6
  191. package/dist/src/config/extension-manager-skills.test.js +0 -157
  192. package/dist/src/config/extension-manager-skills.test.js.map +0 -1
  193. package/dist/src/config/extension-manager.test.d.ts +0 -6
  194. package/dist/src/config/extension-manager.test.js +0 -430
  195. package/dist/src/config/extension-manager.test.js.map +0 -1
  196. package/dist/src/config/extension.test.d.ts +0 -6
  197. package/dist/src/config/extension.test.js +0 -1800
  198. package/dist/src/config/extension.test.js.map +0 -1
  199. package/dist/src/config/extensionRegistryClient.test.d.ts +0 -6
  200. package/dist/src/config/extensionRegistryClient.test.js +0 -261
  201. package/dist/src/config/extensionRegistryClient.test.js.map +0 -1
  202. package/dist/src/config/extensions/consent.test.d.ts +0 -6
  203. package/dist/src/config/extensions/consent.test.js +0 -302
  204. package/dist/src/config/extensions/consent.test.js.map +0 -1
  205. package/dist/src/config/extensions/extensionEnablement.test.d.ts +0 -6
  206. package/dist/src/config/extensions/extensionEnablement.test.js +0 -404
  207. package/dist/src/config/extensions/extensionEnablement.test.js.map +0 -1
  208. package/dist/src/config/extensions/extensionSettings.test.d.ts +0 -6
  209. package/dist/src/config/extensions/extensionSettings.test.js +0 -575
  210. package/dist/src/config/extensions/extensionSettings.test.js.map +0 -1
  211. package/dist/src/config/extensions/extensionUpdates.test.d.ts +0 -6
  212. package/dist/src/config/extensions/extensionUpdates.test.js +0 -265
  213. package/dist/src/config/extensions/extensionUpdates.test.js.map +0 -1
  214. package/dist/src/config/extensions/github.test.d.ts +0 -6
  215. package/dist/src/config/extensions/github.test.js +0 -454
  216. package/dist/src/config/extensions/github.test.js.map +0 -1
  217. package/dist/src/config/extensions/github_fetch.test.d.ts +0 -6
  218. package/dist/src/config/extensions/github_fetch.test.js +0 -171
  219. package/dist/src/config/extensions/github_fetch.test.js.map +0 -1
  220. package/dist/src/config/extensions/storage.test.d.ts +0 -6
  221. package/dist/src/config/extensions/storage.test.js +0 -64
  222. package/dist/src/config/extensions/storage.test.js.map +0 -1
  223. package/dist/src/config/extensions/update.test.d.ts +0 -6
  224. package/dist/src/config/extensions/update.test.js +0 -296
  225. package/dist/src/config/extensions/update.test.js.map +0 -1
  226. package/dist/src/config/extensions/variables.test.d.ts +0 -6
  227. package/dist/src/config/extensions/variables.test.js +0 -119
  228. package/dist/src/config/extensions/variables.test.js.map +0 -1
  229. package/dist/src/config/footerItems.test.d.ts +0 -6
  230. package/dist/src/config/footerItems.test.js +0 -180
  231. package/dist/src/config/footerItems.test.js.map +0 -1
  232. package/dist/src/config/mcp/mcpServerEnablement.test.d.ts +0 -6
  233. package/dist/src/config/mcp/mcpServerEnablement.test.js +0 -148
  234. package/dist/src/config/mcp/mcpServerEnablement.test.js.map +0 -1
  235. package/dist/src/config/mutual-exclusivity.test.d.ts +0 -6
  236. package/dist/src/config/mutual-exclusivity.test.js +0 -33
  237. package/dist/src/config/mutual-exclusivity.test.js.map +0 -1
  238. package/dist/src/config/policy-engine.integration.test.d.ts +0 -6
  239. package/dist/src/config/policy-engine.integration.test.js +0 -394
  240. package/dist/src/config/policy-engine.integration.test.js.map +0 -1
  241. package/dist/src/config/policy.test.d.ts +0 -6
  242. package/dist/src/config/policy.test.js +0 -199
  243. package/dist/src/config/policy.test.js.map +0 -1
  244. package/dist/src/config/sandboxConfig.test.d.ts +0 -6
  245. package/dist/src/config/sandboxConfig.test.js +0 -401
  246. package/dist/src/config/sandboxConfig.test.js.map +0 -1
  247. package/dist/src/config/settingPaths.test.d.ts +0 -6
  248. package/dist/src/config/settingPaths.test.js +0 -22
  249. package/dist/src/config/settingPaths.test.js.map +0 -1
  250. package/dist/src/config/settings-env-isolation.test.d.ts +0 -6
  251. package/dist/src/config/settings-env-isolation.test.js +0 -188
  252. package/dist/src/config/settings-env-isolation.test.js.map +0 -1
  253. package/dist/src/config/settings-validation.test.d.ts +0 -6
  254. package/dist/src/config/settings-validation.test.js +0 -464
  255. package/dist/src/config/settings-validation.test.js.map +0 -1
  256. package/dist/src/config/settings.test.d.ts +0 -6
  257. package/dist/src/config/settings.test.js +0 -2660
  258. package/dist/src/config/settings.test.js.map +0 -1
  259. package/dist/src/config/settingsSchema.test.d.ts +0 -6
  260. package/dist/src/config/settingsSchema.test.js +0 -450
  261. package/dist/src/config/settingsSchema.test.js.map +0 -1
  262. package/dist/src/config/settings_repro.test.d.ts +0 -6
  263. package/dist/src/config/settings_repro.test.js +0 -163
  264. package/dist/src/config/settings_repro.test.js.map +0 -1
  265. package/dist/src/config/settings_validation_warning.test.d.ts +0 -6
  266. package/dist/src/config/settings_validation_warning.test.js +0 -124
  267. package/dist/src/config/settings_validation_warning.test.js.map +0 -1
  268. package/dist/src/config/skipExtensions.test.d.ts +0 -6
  269. package/dist/src/config/skipExtensions.test.js +0 -49
  270. package/dist/src/config/skipExtensions.test.js.map +0 -1
  271. package/dist/src/config/trustedFolders.test.d.ts +0 -6
  272. package/dist/src/config/trustedFolders.test.js +0 -411
  273. package/dist/src/config/trustedFolders.test.js.map +0 -1
  274. package/dist/src/config/workspace-policy-cli.test.d.ts +0 -6
  275. package/dist/src/config/workspace-policy-cli.test.js +0 -204
  276. package/dist/src/config/workspace-policy-cli.test.js.map +0 -1
  277. package/dist/src/core/auth.test.d.ts +0 -6
  278. package/dist/src/core/auth.test.js +0 -93
  279. package/dist/src/core/auth.test.js.map +0 -1
  280. package/dist/src/core/initializer.test.d.ts +0 -6
  281. package/dist/src/core/initializer.test.js +0 -111
  282. package/dist/src/core/initializer.test.js.map +0 -1
  283. package/dist/src/core/theme.test.d.ts +0 -6
  284. package/dist/src/core/theme.test.js +0 -46
  285. package/dist/src/core/theme.test.js.map +0 -1
  286. package/dist/src/deferred.test.d.ts +0 -6
  287. package/dist/src/deferred.test.js +0 -180
  288. package/dist/src/deferred.test.js.map +0 -1
  289. package/dist/src/gemini.test.d.ts +0 -6
  290. package/dist/src/gemini.test.js +0 -1432
  291. package/dist/src/gemini.test.js.map +0 -1
  292. package/dist/src/gemini_cleanup.test.d.ts +0 -6
  293. package/dist/src/gemini_cleanup.test.js +0 -391
  294. package/dist/src/gemini_cleanup.test.js.map +0 -1
  295. package/dist/src/integration-tests/modelSteering.test.d.ts +0 -6
  296. package/dist/src/integration-tests/modelSteering.test.js +0 -62
  297. package/dist/src/integration-tests/modelSteering.test.js.map +0 -1
  298. package/dist/src/nonInteractiveCli.test.d.ts +0 -6
  299. package/dist/src/nonInteractiveCli.test.js +0 -1921
  300. package/dist/src/nonInteractiveCli.test.js.map +0 -1
  301. package/dist/src/nonInteractiveCliAgentSession.test.d.ts +0 -6
  302. package/dist/src/nonInteractiveCliAgentSession.test.js +0 -2015
  303. package/dist/src/nonInteractiveCliAgentSession.test.js.map +0 -1
  304. package/dist/src/output-redirection.test.d.ts +0 -6
  305. package/dist/src/output-redirection.test.js +0 -77
  306. package/dist/src/output-redirection.test.js.map +0 -1
  307. package/dist/src/services/BuiltinCommandLoader.test.d.ts +0 -6
  308. package/dist/src/services/BuiltinCommandLoader.test.js +0 -369
  309. package/dist/src/services/BuiltinCommandLoader.test.js.map +0 -1
  310. package/dist/src/services/CommandService.test.d.ts +0 -6
  311. package/dist/src/services/CommandService.test.js +0 -74
  312. package/dist/src/services/CommandService.test.js.map +0 -1
  313. package/dist/src/services/FileCommandLoader.test.d.ts +0 -6
  314. package/dist/src/services/FileCommandLoader.test.js +0 -1128
  315. package/dist/src/services/FileCommandLoader.test.js.map +0 -1
  316. package/dist/src/services/McpPromptLoader.test.d.ts +0 -6
  317. package/dist/src/services/McpPromptLoader.test.js +0 -411
  318. package/dist/src/services/McpPromptLoader.test.js.map +0 -1
  319. package/dist/src/services/SkillCommandLoader.test.d.ts +0 -6
  320. package/dist/src/services/SkillCommandLoader.test.js +0 -113
  321. package/dist/src/services/SkillCommandLoader.test.js.map +0 -1
  322. package/dist/src/services/SlashCommandConflictHandler.test.d.ts +0 -6
  323. package/dist/src/services/SlashCommandConflictHandler.test.js +0 -144
  324. package/dist/src/services/SlashCommandConflictHandler.test.js.map +0 -1
  325. package/dist/src/services/SlashCommandResolver.test.d.ts +0 -6
  326. package/dist/src/services/SlashCommandResolver.test.js +0 -186
  327. package/dist/src/services/SlashCommandResolver.test.js.map +0 -1
  328. package/dist/src/services/liteRtServerManager.test.d.ts +0 -6
  329. package/dist/src/services/liteRtServerManager.test.js +0 -54
  330. package/dist/src/services/liteRtServerManager.test.js.map +0 -1
  331. package/dist/src/services/prompt-processors/argumentProcessor.test.d.ts +0 -6
  332. package/dist/src/services/prompt-processors/argumentProcessor.test.js +0 -40
  333. package/dist/src/services/prompt-processors/argumentProcessor.test.js.map +0 -1
  334. package/dist/src/services/prompt-processors/atFileProcessor.test.d.ts +0 -6
  335. package/dist/src/services/prompt-processors/atFileProcessor.test.js +0 -177
  336. package/dist/src/services/prompt-processors/atFileProcessor.test.js.map +0 -1
  337. package/dist/src/services/prompt-processors/injectionParser.test.d.ts +0 -6
  338. package/dist/src/services/prompt-processors/injectionParser.test.js +0 -189
  339. package/dist/src/services/prompt-processors/injectionParser.test.js.map +0 -1
  340. package/dist/src/services/prompt-processors/shellProcessor.test.d.ts +0 -6
  341. package/dist/src/services/prompt-processors/shellProcessor.test.js +0 -525
  342. package/dist/src/services/prompt-processors/shellProcessor.test.js.map +0 -1
  343. package/dist/src/test-utils/AppRig.test.d.ts +0 -6
  344. package/dist/src/test-utils/AppRig.test.js +0 -60
  345. package/dist/src/test-utils/AppRig.test.js.map +0 -1
  346. package/dist/src/test-utils/mockCommandContext.test.d.ts +0 -6
  347. package/dist/src/test-utils/mockCommandContext.test.js +0 -51
  348. package/dist/src/test-utils/mockCommandContext.test.js.map +0 -1
  349. package/dist/src/test-utils/render.test.d.ts +0 -6
  350. package/dist/src/test-utils/render.test.js +0 -84
  351. package/dist/src/test-utils/render.test.js.map +0 -1
  352. package/dist/src/ui/App.test.d.ts +0 -6
  353. package/dist/src/ui/App.test.js +0 -244
  354. package/dist/src/ui/App.test.js.map +0 -1
  355. package/dist/src/ui/AppContainer.test.d.ts +0 -6
  356. package/dist/src/ui/AppContainer.test.js +0 -2824
  357. package/dist/src/ui/AppContainer.test.js.map +0 -1
  358. package/dist/src/ui/IdeIntegrationNudge.test.d.ts +0 -6
  359. package/dist/src/ui/IdeIntegrationNudge.test.js +0 -149
  360. package/dist/src/ui/IdeIntegrationNudge.test.js.map +0 -1
  361. package/dist/src/ui/ToolConfirmationFullFrame.test.d.ts +0 -1
  362. package/dist/src/ui/ToolConfirmationFullFrame.test.js +0 -153
  363. package/dist/src/ui/ToolConfirmationFullFrame.test.js.map +0 -1
  364. package/dist/src/ui/auth/ApiAuthDialog.test.d.ts +0 -6
  365. package/dist/src/ui/auth/ApiAuthDialog.test.js +0 -127
  366. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +0 -1
  367. package/dist/src/ui/auth/AuthDialog.test.d.ts +0 -6
  368. package/dist/src/ui/auth/AuthDialog.test.js +0 -350
  369. package/dist/src/ui/auth/AuthDialog.test.js.map +0 -1
  370. package/dist/src/ui/auth/AuthInProgress.test.d.ts +0 -6
  371. package/dist/src/ui/auth/AuthInProgress.test.js +0 -99
  372. package/dist/src/ui/auth/AuthInProgress.test.js.map +0 -1
  373. package/dist/src/ui/auth/BannedAccountDialog.test.d.ts +0 -6
  374. package/dist/src/ui/auth/BannedAccountDialog.test.js +0 -141
  375. package/dist/src/ui/auth/BannedAccountDialog.test.js.map +0 -1
  376. package/dist/src/ui/auth/LoginRestartDialog.test.d.ts +0 -6
  377. package/dist/src/ui/auth/LoginRestartDialog.test.js +0 -79
  378. package/dist/src/ui/auth/LoginRestartDialog.test.js.map +0 -1
  379. package/dist/src/ui/auth/useAuth.test.d.ts +0 -6
  380. package/dist/src/ui/auth/useAuth.test.js +0 -214
  381. package/dist/src/ui/auth/useAuth.test.js.map +0 -1
  382. package/dist/src/ui/commands/aboutCommand.test.d.ts +0 -6
  383. package/dist/src/ui/commands/aboutCommand.test.js +0 -145
  384. package/dist/src/ui/commands/aboutCommand.test.js.map +0 -1
  385. package/dist/src/ui/commands/agentsCommand.test.d.ts +0 -6
  386. package/dist/src/ui/commands/agentsCommand.test.js +0 -382
  387. package/dist/src/ui/commands/agentsCommand.test.js.map +0 -1
  388. package/dist/src/ui/commands/authCommand.test.d.ts +0 -6
  389. package/dist/src/ui/commands/authCommand.test.js +0 -103
  390. package/dist/src/ui/commands/authCommand.test.js.map +0 -1
  391. package/dist/src/ui/commands/bugCommand.test.d.ts +0 -6
  392. package/dist/src/ui/commands/bugCommand.test.js +0 -305
  393. package/dist/src/ui/commands/bugCommand.test.js.map +0 -1
  394. package/dist/src/ui/commands/bugMemoryCommand.test.d.ts +0 -6
  395. package/dist/src/ui/commands/bugMemoryCommand.test.js +0 -100
  396. package/dist/src/ui/commands/bugMemoryCommand.test.js.map +0 -1
  397. package/dist/src/ui/commands/chatCommand.test.d.ts +0 -6
  398. package/dist/src/ui/commands/chatCommand.test.js +0 -627
  399. package/dist/src/ui/commands/chatCommand.test.js.map +0 -1
  400. package/dist/src/ui/commands/clearCommand.test.d.ts +0 -6
  401. package/dist/src/ui/commands/clearCommand.test.js +0 -98
  402. package/dist/src/ui/commands/clearCommand.test.js.map +0 -1
  403. package/dist/src/ui/commands/commandsCommand.test.d.ts +0 -6
  404. package/dist/src/ui/commands/commandsCommand.test.js +0 -115
  405. package/dist/src/ui/commands/commandsCommand.test.js.map +0 -1
  406. package/dist/src/ui/commands/compressCommand.test.d.ts +0 -6
  407. package/dist/src/ui/commands/compressCommand.test.js +0 -110
  408. package/dist/src/ui/commands/compressCommand.test.js.map +0 -1
  409. package/dist/src/ui/commands/copyCommand.test.d.ts +0 -6
  410. package/dist/src/ui/commands/copyCommand.test.js +0 -244
  411. package/dist/src/ui/commands/copyCommand.test.js.map +0 -1
  412. package/dist/src/ui/commands/corgiCommand.test.d.ts +0 -6
  413. package/dist/src/ui/commands/corgiCommand.test.js +0 -28
  414. package/dist/src/ui/commands/corgiCommand.test.js.map +0 -1
  415. package/dist/src/ui/commands/directoryCommand.test.d.ts +0 -6
  416. package/dist/src/ui/commands/directoryCommand.test.js +0 -365
  417. package/dist/src/ui/commands/directoryCommand.test.js.map +0 -1
  418. package/dist/src/ui/commands/docsCommand.test.d.ts +0 -6
  419. package/dist/src/ui/commands/docsCommand.test.js +0 -72
  420. package/dist/src/ui/commands/docsCommand.test.js.map +0 -1
  421. package/dist/src/ui/commands/editorCommand.test.d.ts +0 -6
  422. package/dist/src/ui/commands/editorCommand.test.js +0 -27
  423. package/dist/src/ui/commands/editorCommand.test.js.map +0 -1
  424. package/dist/src/ui/commands/exportSessionCommand.test.d.ts +0 -6
  425. package/dist/src/ui/commands/exportSessionCommand.test.js +0 -100
  426. package/dist/src/ui/commands/exportSessionCommand.test.js.map +0 -1
  427. package/dist/src/ui/commands/extensionsCommand.test.d.ts +0 -6
  428. package/dist/src/ui/commands/extensionsCommand.test.js +0 -947
  429. package/dist/src/ui/commands/extensionsCommand.test.js.map +0 -1
  430. package/dist/src/ui/commands/helpCommand.test.d.ts +0 -6
  431. package/dist/src/ui/commands/helpCommand.test.js +0 -94
  432. package/dist/src/ui/commands/helpCommand.test.js.map +0 -1
  433. package/dist/src/ui/commands/hooksCommand.test.d.ts +0 -6
  434. package/dist/src/ui/commands/hooksCommand.test.js +0 -562
  435. package/dist/src/ui/commands/hooksCommand.test.js.map +0 -1
  436. package/dist/src/ui/commands/ideCommand.test.d.ts +0 -6
  437. package/dist/src/ui/commands/ideCommand.test.js +0 -205
  438. package/dist/src/ui/commands/ideCommand.test.js.map +0 -1
  439. package/dist/src/ui/commands/initCommand.test.d.ts +0 -6
  440. package/dist/src/ui/commands/initCommand.test.js +0 -86
  441. package/dist/src/ui/commands/initCommand.test.js.map +0 -1
  442. package/dist/src/ui/commands/mcpCommand.test.d.ts +0 -6
  443. package/dist/src/ui/commands/mcpCommand.test.js +0 -231
  444. package/dist/src/ui/commands/mcpCommand.test.js.map +0 -1
  445. package/dist/src/ui/commands/memoryCommand.test.d.ts +0 -6
  446. package/dist/src/ui/commands/memoryCommand.test.js +0 -361
  447. package/dist/src/ui/commands/memoryCommand.test.js.map +0 -1
  448. package/dist/src/ui/commands/modelCommand.test.d.ts +0 -6
  449. package/dist/src/ui/commands/modelCommand.test.js +0 -135
  450. package/dist/src/ui/commands/modelCommand.test.js.map +0 -1
  451. package/dist/src/ui/commands/permissionsCommand.test.d.ts +0 -6
  452. package/dist/src/ui/commands/permissionsCommand.test.js +0 -86
  453. package/dist/src/ui/commands/permissionsCommand.test.js.map +0 -1
  454. package/dist/src/ui/commands/planCommand.test.d.ts +0 -6
  455. package/dist/src/ui/commands/planCommand.test.js +0 -146
  456. package/dist/src/ui/commands/planCommand.test.js.map +0 -1
  457. package/dist/src/ui/commands/policiesCommand.test.d.ts +0 -6
  458. package/dist/src/ui/commands/policiesCommand.test.js +0 -133
  459. package/dist/src/ui/commands/policiesCommand.test.js.map +0 -1
  460. package/dist/src/ui/commands/privacyCommand.test.d.ts +0 -6
  461. package/dist/src/ui/commands/privacyCommand.test.js +0 -32
  462. package/dist/src/ui/commands/privacyCommand.test.js.map +0 -1
  463. package/dist/src/ui/commands/quitCommand.test.d.ts +0 -6
  464. package/dist/src/ui/commands/quitCommand.test.js +0 -95
  465. package/dist/src/ui/commands/quitCommand.test.js.map +0 -1
  466. package/dist/src/ui/commands/restoreCommand.test.d.ts +0 -6
  467. package/dist/src/ui/commands/restoreCommand.test.js +0 -193
  468. package/dist/src/ui/commands/restoreCommand.test.js.map +0 -1
  469. package/dist/src/ui/commands/resumeCommand.test.d.ts +0 -6
  470. package/dist/src/ui/commands/resumeCommand.test.js +0 -28
  471. package/dist/src/ui/commands/resumeCommand.test.js.map +0 -1
  472. package/dist/src/ui/commands/rewindCommand.test.d.ts +0 -6
  473. package/dist/src/ui/commands/rewindCommand.test.js +0 -256
  474. package/dist/src/ui/commands/rewindCommand.test.js.map +0 -1
  475. package/dist/src/ui/commands/settingsCommand.test.d.ts +0 -6
  476. package/dist/src/ui/commands/settingsCommand.test.js +0 -30
  477. package/dist/src/ui/commands/settingsCommand.test.js.map +0 -1
  478. package/dist/src/ui/commands/setupGithubCommand.test.d.ts +0 -6
  479. package/dist/src/ui/commands/setupGithubCommand.test.js +0 -238
  480. package/dist/src/ui/commands/setupGithubCommand.test.js.map +0 -1
  481. package/dist/src/ui/commands/skillsCommand.test.d.ts +0 -6
  482. package/dist/src/ui/commands/skillsCommand.test.js +0 -500
  483. package/dist/src/ui/commands/skillsCommand.test.js.map +0 -1
  484. package/dist/src/ui/commands/statsCommand.test.d.ts +0 -6
  485. package/dist/src/ui/commands/statsCommand.test.js +0 -122
  486. package/dist/src/ui/commands/statsCommand.test.js.map +0 -1
  487. package/dist/src/ui/commands/tasksCommand.test.d.ts +0 -6
  488. package/dist/src/ui/commands/tasksCommand.test.js +0 -30
  489. package/dist/src/ui/commands/tasksCommand.test.js.map +0 -1
  490. package/dist/src/ui/commands/terminalSetupCommand.test.d.ts +0 -6
  491. package/dist/src/ui/commands/terminalSetupCommand.test.js +0 -66
  492. package/dist/src/ui/commands/terminalSetupCommand.test.js.map +0 -1
  493. package/dist/src/ui/commands/themeCommand.test.d.ts +0 -6
  494. package/dist/src/ui/commands/themeCommand.test.js +0 -32
  495. package/dist/src/ui/commands/themeCommand.test.js.map +0 -1
  496. package/dist/src/ui/commands/toolsCommand.test.d.ts +0 -6
  497. package/dist/src/ui/commands/toolsCommand.test.js +0 -187
  498. package/dist/src/ui/commands/toolsCommand.test.js.map +0 -1
  499. package/dist/src/ui/commands/upgradeCommand.test.d.ts +0 -6
  500. package/dist/src/ui/commands/upgradeCommand.test.js +0 -102
  501. package/dist/src/ui/commands/upgradeCommand.test.js.map +0 -1
  502. package/dist/src/ui/components/AboutBox.test.d.ts +0 -6
  503. package/dist/src/ui/components/AboutBox.test.js +0 -63
  504. package/dist/src/ui/components/AboutBox.test.js.map +0 -1
  505. package/dist/src/ui/components/AdminSettingsChangedDialog.test.d.ts +0 -6
  506. package/dist/src/ui/components/AdminSettingsChangedDialog.test.js +0 -43
  507. package/dist/src/ui/components/AdminSettingsChangedDialog.test.js.map +0 -1
  508. package/dist/src/ui/components/AgentConfigDialog.test.d.ts +0 -6
  509. package/dist/src/ui/components/AgentConfigDialog.test.js +0 -267
  510. package/dist/src/ui/components/AgentConfigDialog.test.js.map +0 -1
  511. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.d.ts +0 -6
  512. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +0 -196
  513. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +0 -1
  514. package/dist/src/ui/components/AnsiOutput.test.d.ts +0 -6
  515. package/dist/src/ui/components/AnsiOutput.test.js +0 -142
  516. package/dist/src/ui/components/AnsiOutput.test.js.map +0 -1
  517. package/dist/src/ui/components/AppHeader.test.d.ts +0 -6
  518. package/dist/src/ui/components/AppHeader.test.js +0 -212
  519. package/dist/src/ui/components/AppHeader.test.js.map +0 -1
  520. package/dist/src/ui/components/AppHeaderIcon.test.d.ts +0 -6
  521. package/dist/src/ui/components/AppHeaderIcon.test.js +0 -39
  522. package/dist/src/ui/components/AppHeaderIcon.test.js.map +0 -1
  523. package/dist/src/ui/components/ApprovalModeIndicator.test.d.ts +0 -6
  524. package/dist/src/ui/components/ApprovalModeIndicator.test.js +0 -37
  525. package/dist/src/ui/components/ApprovalModeIndicator.test.js.map +0 -1
  526. package/dist/src/ui/components/AskUserDialog.test.d.ts +0 -6
  527. package/dist/src/ui/components/AskUserDialog.test.js +0 -1121
  528. package/dist/src/ui/components/AskUserDialog.test.js.map +0 -1
  529. package/dist/src/ui/components/BackgroundTaskDisplay.test.d.ts +0 -6
  530. package/dist/src/ui/components/BackgroundTaskDisplay.test.js +0 -209
  531. package/dist/src/ui/components/BackgroundTaskDisplay.test.js.map +0 -1
  532. package/dist/src/ui/components/Banner.test.d.ts +0 -6
  533. package/dist/src/ui/components/Banner.test.js +0 -29
  534. package/dist/src/ui/components/Banner.test.js.map +0 -1
  535. package/dist/src/ui/components/BubblingRegression.test.d.ts +0 -6
  536. package/dist/src/ui/components/BubblingRegression.test.js +0 -60
  537. package/dist/src/ui/components/BubblingRegression.test.js.map +0 -1
  538. package/dist/src/ui/components/Checklist.test.d.ts +0 -6
  539. package/dist/src/ui/components/Checklist.test.js +0 -46
  540. package/dist/src/ui/components/Checklist.test.js.map +0 -1
  541. package/dist/src/ui/components/ChecklistItem.test.d.ts +0 -6
  542. package/dist/src/ui/components/ChecklistItem.test.js +0 -40
  543. package/dist/src/ui/components/ChecklistItem.test.js.map +0 -1
  544. package/dist/src/ui/components/CliSpinner.test.d.ts +0 -6
  545. package/dist/src/ui/components/CliSpinner.test.js +0 -32
  546. package/dist/src/ui/components/CliSpinner.test.js.map +0 -1
  547. package/dist/src/ui/components/ColorsDisplay.test.d.ts +0 -6
  548. package/dist/src/ui/components/ColorsDisplay.test.js +0 -107
  549. package/dist/src/ui/components/ColorsDisplay.test.js.map +0 -1
  550. package/dist/src/ui/components/Composer.test.d.ts +0 -6
  551. package/dist/src/ui/components/Composer.test.js +0 -853
  552. package/dist/src/ui/components/Composer.test.js.map +0 -1
  553. package/dist/src/ui/components/ConfigInitDisplay.test.d.ts +0 -6
  554. package/dist/src/ui/components/ConfigInitDisplay.test.js +0 -118
  555. package/dist/src/ui/components/ConfigInitDisplay.test.js.map +0 -1
  556. package/dist/src/ui/components/ConsentPrompt.test.d.ts +0 -6
  557. package/dist/src/ui/components/ConsentPrompt.test.js +0 -80
  558. package/dist/src/ui/components/ConsentPrompt.test.js.map +0 -1
  559. package/dist/src/ui/components/ConsoleSummaryDisplay.test.d.ts +0 -6
  560. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js +0 -28
  561. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js.map +0 -1
  562. package/dist/src/ui/components/ContextSummaryDisplay.test.d.ts +0 -6
  563. package/dist/src/ui/components/ContextSummaryDisplay.test.js +0 -81
  564. package/dist/src/ui/components/ContextSummaryDisplay.test.js.map +0 -1
  565. package/dist/src/ui/components/ContextUsageDisplay.test.d.ts +0 -6
  566. package/dist/src/ui/components/ContextUsageDisplay.test.js +0 -50
  567. package/dist/src/ui/components/ContextUsageDisplay.test.js.map +0 -1
  568. package/dist/src/ui/components/CopyModeWarning.test.d.ts +0 -6
  569. package/dist/src/ui/components/CopyModeWarning.test.js +0 -35
  570. package/dist/src/ui/components/CopyModeWarning.test.js.map +0 -1
  571. package/dist/src/ui/components/DebugProfiler.test.d.ts +0 -6
  572. package/dist/src/ui/components/DebugProfiler.test.js +0 -228
  573. package/dist/src/ui/components/DebugProfiler.test.js.map +0 -1
  574. package/dist/src/ui/components/DetailedMessagesDisplay.test.d.ts +0 -6
  575. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +0 -81
  576. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +0 -1
  577. package/dist/src/ui/components/DialogManager.test.d.ts +0 -6
  578. package/dist/src/ui/components/DialogManager.test.js +0 -187
  579. package/dist/src/ui/components/DialogManager.test.js.map +0 -1
  580. package/dist/src/ui/components/EditorSettingsDialog.test.d.ts +0 -6
  581. package/dist/src/ui/components/EditorSettingsDialog.test.js +0 -145
  582. package/dist/src/ui/components/EditorSettingsDialog.test.js.map +0 -1
  583. package/dist/src/ui/components/EmptyWalletDialog.test.d.ts +0 -6
  584. package/dist/src/ui/components/EmptyWalletDialog.test.js +0 -116
  585. package/dist/src/ui/components/EmptyWalletDialog.test.js.map +0 -1
  586. package/dist/src/ui/components/ExitPlanModeDialog.test.d.ts +0 -6
  587. package/dist/src/ui/components/ExitPlanModeDialog.test.js +0 -443
  588. package/dist/src/ui/components/ExitPlanModeDialog.test.js.map +0 -1
  589. package/dist/src/ui/components/ExitWarning.test.d.ts +0 -6
  590. package/dist/src/ui/components/ExitWarning.test.js +0 -58
  591. package/dist/src/ui/components/ExitWarning.test.js.map +0 -1
  592. package/dist/src/ui/components/FolderTrustDialog.test.d.ts +0 -6
  593. package/dist/src/ui/components/FolderTrustDialog.test.js +0 -342
  594. package/dist/src/ui/components/FolderTrustDialog.test.js.map +0 -1
  595. package/dist/src/ui/components/Footer.test.d.ts +0 -6
  596. package/dist/src/ui/components/Footer.test.js +0 -806
  597. package/dist/src/ui/components/Footer.test.js.map +0 -1
  598. package/dist/src/ui/components/FooterConfigDialog.test.d.ts +0 -6
  599. package/dist/src/ui/components/FooterConfigDialog.test.js +0 -191
  600. package/dist/src/ui/components/FooterConfigDialog.test.js.map +0 -1
  601. package/dist/src/ui/components/GeminiRespondingSpinner.test.d.ts +0 -6
  602. package/dist/src/ui/components/GeminiRespondingSpinner.test.js +0 -63
  603. package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +0 -1
  604. package/dist/src/ui/components/GradientRegression.test.d.ts +0 -6
  605. package/dist/src/ui/components/GradientRegression.test.js +0 -116
  606. package/dist/src/ui/components/GradientRegression.test.js.map +0 -1
  607. package/dist/src/ui/components/Header.test.d.ts +0 -6
  608. package/dist/src/ui/components/Header.test.js +0 -131
  609. package/dist/src/ui/components/Header.test.js.map +0 -1
  610. package/dist/src/ui/components/Help.test.d.ts +0 -6
  611. package/dist/src/ui/components/Help.test.js +0 -67
  612. package/dist/src/ui/components/Help.test.js.map +0 -1
  613. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +0 -6
  614. package/dist/src/ui/components/HistoryItemDisplay.test.js +0 -302
  615. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +0 -1
  616. package/dist/src/ui/components/HookStatusDisplay.test.d.ts +0 -6
  617. package/dist/src/ui/components/HookStatusDisplay.test.js +0 -77
  618. package/dist/src/ui/components/HookStatusDisplay.test.js.map +0 -1
  619. package/dist/src/ui/components/HooksDialog.test.d.ts +0 -6
  620. package/dist/src/ui/components/HooksDialog.test.js +0 -175
  621. package/dist/src/ui/components/HooksDialog.test.js.map +0 -1
  622. package/dist/src/ui/components/IdeTrustChangeDialog.test.d.ts +0 -6
  623. package/dist/src/ui/components/IdeTrustChangeDialog.test.js +0 -78
  624. package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +0 -1
  625. package/dist/src/ui/components/InboxDialog.test.d.ts +0 -6
  626. package/dist/src/ui/components/InboxDialog.test.js +0 -804
  627. package/dist/src/ui/components/InboxDialog.test.js.map +0 -1
  628. package/dist/src/ui/components/InputPrompt.test.d.ts +0 -17
  629. package/dist/src/ui/components/InputPrompt.test.js +0 -4078
  630. package/dist/src/ui/components/InputPrompt.test.js.map +0 -1
  631. package/dist/src/ui/components/LoadingIndicator.test.d.ts +0 -6
  632. package/dist/src/ui/components/LoadingIndicator.test.js +0 -325
  633. package/dist/src/ui/components/LoadingIndicator.test.js.map +0 -1
  634. package/dist/src/ui/components/LogoutConfirmationDialog.test.d.ts +0 -6
  635. package/dist/src/ui/components/LogoutConfirmationDialog.test.js +0 -74
  636. package/dist/src/ui/components/LogoutConfirmationDialog.test.js.map +0 -1
  637. package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +0 -6
  638. package/dist/src/ui/components/LoopDetectionConfirmation.test.js +0 -27
  639. package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +0 -1
  640. package/dist/src/ui/components/MainContent.test.d.ts +0 -6
  641. package/dist/src/ui/components/MainContent.test.js +0 -750
  642. package/dist/src/ui/components/MainContent.test.js.map +0 -1
  643. package/dist/src/ui/components/MemoryUsageDisplay.test.d.ts +0 -6
  644. package/dist/src/ui/components/MemoryUsageDisplay.test.js +0 -52
  645. package/dist/src/ui/components/MemoryUsageDisplay.test.js.map +0 -1
  646. package/dist/src/ui/components/ModelDialog.test.d.ts +0 -6
  647. package/dist/src/ui/components/ModelDialog.test.js +0 -356
  648. package/dist/src/ui/components/ModelDialog.test.js.map +0 -1
  649. package/dist/src/ui/components/ModelQuotaDisplay.test.d.ts +0 -6
  650. package/dist/src/ui/components/ModelQuotaDisplay.test.js +0 -62
  651. package/dist/src/ui/components/ModelQuotaDisplay.test.js.map +0 -1
  652. package/dist/src/ui/components/ModelStatsDisplay.test.d.ts +0 -6
  653. package/dist/src/ui/components/ModelStatsDisplay.test.js +0 -651
  654. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +0 -1
  655. package/dist/src/ui/components/MultiFolderTrustDialog.test.d.ts +0 -6
  656. package/dist/src/ui/components/MultiFolderTrustDialog.test.js +0 -177
  657. package/dist/src/ui/components/MultiFolderTrustDialog.test.js.map +0 -1
  658. package/dist/src/ui/components/NewAgentsNotification.test.d.ts +0 -6
  659. package/dist/src/ui/components/NewAgentsNotification.test.js +0 -83
  660. package/dist/src/ui/components/NewAgentsNotification.test.js.map +0 -1
  661. package/dist/src/ui/components/Notifications.test.d.ts +0 -6
  662. package/dist/src/ui/components/Notifications.test.js +0 -285
  663. package/dist/src/ui/components/Notifications.test.js.map +0 -1
  664. package/dist/src/ui/components/OverageMenuDialog.test.d.ts +0 -6
  665. package/dist/src/ui/components/OverageMenuDialog.test.js +0 -118
  666. package/dist/src/ui/components/OverageMenuDialog.test.js.map +0 -1
  667. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.d.ts +0 -6
  668. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +0 -181
  669. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +0 -1
  670. package/dist/src/ui/components/PolicyUpdateDialog.test.d.ts +0 -6
  671. package/dist/src/ui/components/PolicyUpdateDialog.test.js +0 -92
  672. package/dist/src/ui/components/PolicyUpdateDialog.test.js.map +0 -1
  673. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +0 -6
  674. package/dist/src/ui/components/ProQuotaDialog.test.js +0 -222
  675. package/dist/src/ui/components/ProQuotaDialog.test.js.map +0 -1
  676. package/dist/src/ui/components/ProgressBar.test.d.ts +0 -6
  677. package/dist/src/ui/components/ProgressBar.test.js +0 -28
  678. package/dist/src/ui/components/ProgressBar.test.js.map +0 -1
  679. package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +0 -6
  680. package/dist/src/ui/components/QueuedMessageDisplay.test.js +0 -65
  681. package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +0 -1
  682. package/dist/src/ui/components/QuittingDisplay.test.d.ts +0 -6
  683. package/dist/src/ui/components/QuittingDisplay.test.js +0 -60
  684. package/dist/src/ui/components/QuittingDisplay.test.js.map +0 -1
  685. package/dist/src/ui/components/QuotaDisplay.test.d.ts +0 -6
  686. package/dist/src/ui/components/QuotaDisplay.test.js +0 -68
  687. package/dist/src/ui/components/QuotaDisplay.test.js.map +0 -1
  688. package/dist/src/ui/components/RawMarkdownIndicator.test.d.ts +0 -6
  689. package/dist/src/ui/components/RawMarkdownIndicator.test.js +0 -38
  690. package/dist/src/ui/components/RawMarkdownIndicator.test.js.map +0 -1
  691. package/dist/src/ui/components/RewindConfirmation.test.d.ts +0 -6
  692. package/dist/src/ui/components/RewindConfirmation.test.js +0 -57
  693. package/dist/src/ui/components/RewindConfirmation.test.js.map +0 -1
  694. package/dist/src/ui/components/RewindViewer.test.d.ts +0 -6
  695. package/dist/src/ui/components/RewindViewer.test.js +0 -334
  696. package/dist/src/ui/components/RewindViewer.test.js.map +0 -1
  697. package/dist/src/ui/components/SessionBrowser/SessionBrowserSearchNav.test.d.ts +0 -6
  698. package/dist/src/ui/components/SessionBrowser/SessionBrowserSearchNav.test.js +0 -47
  699. package/dist/src/ui/components/SessionBrowser/SessionBrowserSearchNav.test.js.map +0 -1
  700. package/dist/src/ui/components/SessionBrowser/SessionBrowserStates.test.d.ts +0 -6
  701. package/dist/src/ui/components/SessionBrowser/SessionBrowserStates.test.js +0 -27
  702. package/dist/src/ui/components/SessionBrowser/SessionBrowserStates.test.js.map +0 -1
  703. package/dist/src/ui/components/SessionBrowser/utils.test.d.ts +0 -6
  704. package/dist/src/ui/components/SessionBrowser/utils.test.js +0 -108
  705. package/dist/src/ui/components/SessionBrowser/utils.test.js.map +0 -1
  706. package/dist/src/ui/components/SessionBrowser.test.d.ts +0 -6
  707. package/dist/src/ui/components/SessionBrowser.test.js +0 -266
  708. package/dist/src/ui/components/SessionBrowser.test.js.map +0 -1
  709. package/dist/src/ui/components/SessionSummaryDisplay.test.d.ts +0 -6
  710. package/dist/src/ui/components/SessionSummaryDisplay.test.js +0 -164
  711. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +0 -1
  712. package/dist/src/ui/components/SettingsDialog.test.d.ts +0 -6
  713. package/dist/src/ui/components/SettingsDialog.test.js +0 -1499
  714. package/dist/src/ui/components/SettingsDialog.test.js.map +0 -1
  715. package/dist/src/ui/components/ShellInputPrompt.test.d.ts +0 -6
  716. package/dist/src/ui/components/ShellInputPrompt.test.js +0 -201
  717. package/dist/src/ui/components/ShellInputPrompt.test.js.map +0 -1
  718. package/dist/src/ui/components/ShellModeIndicator.test.d.ts +0 -6
  719. package/dist/src/ui/components/ShellModeIndicator.test.js +0 -18
  720. package/dist/src/ui/components/ShellModeIndicator.test.js.map +0 -1
  721. package/dist/src/ui/components/ShortcutsHelp.test.d.ts +0 -6
  722. package/dist/src/ui/components/ShortcutsHelp.test.js +0 -45
  723. package/dist/src/ui/components/ShortcutsHelp.test.js.map +0 -1
  724. package/dist/src/ui/components/ShowMoreLines.test.d.ts +0 -6
  725. package/dist/src/ui/components/ShowMoreLines.test.js +0 -79
  726. package/dist/src/ui/components/ShowMoreLines.test.js.map +0 -1
  727. package/dist/src/ui/components/ShowMoreLinesLayout.test.d.ts +0 -1
  728. package/dist/src/ui/components/ShowMoreLinesLayout.test.js +0 -68
  729. package/dist/src/ui/components/ShowMoreLinesLayout.test.js.map +0 -1
  730. package/dist/src/ui/components/StatsDisplay.test.d.ts +0 -6
  731. package/dist/src/ui/components/StatsDisplay.test.js +0 -489
  732. package/dist/src/ui/components/StatsDisplay.test.js.map +0 -1
  733. package/dist/src/ui/components/StatusDisplay.test.d.ts +0 -6
  734. package/dist/src/ui/components/StatusDisplay.test.js +0 -117
  735. package/dist/src/ui/components/StatusDisplay.test.js.map +0 -1
  736. package/dist/src/ui/components/StatusRow.test.d.ts +0 -6
  737. package/dist/src/ui/components/StatusRow.test.js +0 -99
  738. package/dist/src/ui/components/StatusRow.test.js.map +0 -1
  739. package/dist/src/ui/components/StickyHeader.test.d.ts +0 -6
  740. package/dist/src/ui/components/StickyHeader.test.js +0 -19
  741. package/dist/src/ui/components/StickyHeader.test.js.map +0 -1
  742. package/dist/src/ui/components/SuggestionsDisplay.test.d.ts +0 -6
  743. package/dist/src/ui/components/SuggestionsDisplay.test.js +0 -82
  744. package/dist/src/ui/components/SuggestionsDisplay.test.js.map +0 -1
  745. package/dist/src/ui/components/Table.test.d.ts +0 -6
  746. package/dist/src/ui/components/Table.test.js +0 -72
  747. package/dist/src/ui/components/Table.test.js.map +0 -1
  748. package/dist/src/ui/components/ThemeDialog.test.d.ts +0 -6
  749. package/dist/src/ui/components/ThemeDialog.test.js +0 -162
  750. package/dist/src/ui/components/ThemeDialog.test.js.map +0 -1
  751. package/dist/src/ui/components/ThemedGradient.test.d.ts +0 -6
  752. package/dist/src/ui/components/ThemedGradient.test.js +0 -35
  753. package/dist/src/ui/components/ThemedGradient.test.js.map +0 -1
  754. package/dist/src/ui/components/Tips.test.d.ts +0 -6
  755. package/dist/src/ui/components/Tips.test.js +0 -23
  756. package/dist/src/ui/components/Tips.test.js.map +0 -1
  757. package/dist/src/ui/components/ToastDisplay.test.d.ts +0 -6
  758. package/dist/src/ui/components/ToastDisplay.test.js +0 -167
  759. package/dist/src/ui/components/ToastDisplay.test.js.map +0 -1
  760. package/dist/src/ui/components/ToolConfirmationQueue.test.d.ts +0 -6
  761. package/dist/src/ui/components/ToolConfirmationQueue.test.js +0 -444
  762. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +0 -1
  763. package/dist/src/ui/components/ToolStatsDisplay.test.d.ts +0 -6
  764. package/dist/src/ui/components/ToolStatsDisplay.test.js +0 -234
  765. package/dist/src/ui/components/ToolStatsDisplay.test.js.map +0 -1
  766. package/dist/src/ui/components/UpdateNotification.test.d.ts +0 -6
  767. package/dist/src/ui/components/UpdateNotification.test.js +0 -17
  768. package/dist/src/ui/components/UpdateNotification.test.js.map +0 -1
  769. package/dist/src/ui/components/UserIdentity.test.d.ts +0 -6
  770. package/dist/src/ui/components/UserIdentity.test.js +0 -138
  771. package/dist/src/ui/components/UserIdentity.test.js.map +0 -1
  772. package/dist/src/ui/components/ValidationDialog.test.d.ts +0 -6
  773. package/dist/src/ui/components/ValidationDialog.test.js +0 -162
  774. package/dist/src/ui/components/ValidationDialog.test.js.map +0 -1
  775. package/dist/src/ui/components/VoiceModelDialog.test.d.ts +0 -6
  776. package/dist/src/ui/components/VoiceModelDialog.test.js +0 -68
  777. package/dist/src/ui/components/VoiceModelDialog.test.js.map +0 -1
  778. package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +0 -6
  779. package/dist/src/ui/components/messages/CompressionMessage.test.js +0 -180
  780. package/dist/src/ui/components/messages/CompressionMessage.test.js.map +0 -1
  781. package/dist/src/ui/components/messages/DenseToolMessage.test.d.ts +0 -6
  782. package/dist/src/ui/components/messages/DenseToolMessage.test.js +0 -406
  783. package/dist/src/ui/components/messages/DenseToolMessage.test.js.map +0 -1
  784. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +0 -6
  785. package/dist/src/ui/components/messages/DiffRenderer.test.js +0 -269
  786. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +0 -1
  787. package/dist/src/ui/components/messages/ErrorMessage.test.d.ts +0 -6
  788. package/dist/src/ui/components/messages/ErrorMessage.test.js +0 -25
  789. package/dist/src/ui/components/messages/ErrorMessage.test.js.map +0 -1
  790. package/dist/src/ui/components/messages/ExportSessionMessage.test.d.ts +0 -6
  791. package/dist/src/ui/components/messages/ExportSessionMessage.test.js +0 -32
  792. package/dist/src/ui/components/messages/ExportSessionMessage.test.js.map +0 -1
  793. package/dist/src/ui/components/messages/GeminiMessage.test.d.ts +0 -6
  794. package/dist/src/ui/components/messages/GeminiMessage.test.js +0 -46
  795. package/dist/src/ui/components/messages/GeminiMessage.test.js.map +0 -1
  796. package/dist/src/ui/components/messages/HintMessage.test.d.ts +0 -6
  797. package/dist/src/ui/components/messages/HintMessage.test.js +0 -42
  798. package/dist/src/ui/components/messages/HintMessage.test.js.map +0 -1
  799. package/dist/src/ui/components/messages/InfoMessage.test.d.ts +0 -6
  800. package/dist/src/ui/components/messages/InfoMessage.test.js +0 -31
  801. package/dist/src/ui/components/messages/InfoMessage.test.js.map +0 -1
  802. package/dist/src/ui/components/messages/RedirectionConfirmation.test.d.ts +0 -6
  803. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +0 -35
  804. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +0 -1
  805. package/dist/src/ui/components/messages/ShellToolMessage.test.d.ts +0 -6
  806. package/dist/src/ui/components/messages/ShellToolMessage.test.js +0 -290
  807. package/dist/src/ui/components/messages/ShellToolMessage.test.js.map +0 -1
  808. package/dist/src/ui/components/messages/SubagentGroupDisplay.test.d.ts +0 -1
  809. package/dist/src/ui/components/messages/SubagentGroupDisplay.test.js +0 -92
  810. package/dist/src/ui/components/messages/SubagentGroupDisplay.test.js.map +0 -1
  811. package/dist/src/ui/components/messages/SubagentHistoryMessage.test.d.ts +0 -6
  812. package/dist/src/ui/components/messages/SubagentHistoryMessage.test.js +0 -69
  813. package/dist/src/ui/components/messages/SubagentHistoryMessage.test.js.map +0 -1
  814. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.d.ts +0 -6
  815. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.js +0 -164
  816. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.js.map +0 -1
  817. package/dist/src/ui/components/messages/ThinkingMessage.test.d.ts +0 -6
  818. package/dist/src/ui/components/messages/ThinkingMessage.test.js +0 -104
  819. package/dist/src/ui/components/messages/ThinkingMessage.test.js.map +0 -1
  820. package/dist/src/ui/components/messages/Todo.test.d.ts +0 -6
  821. package/dist/src/ui/components/messages/Todo.test.js +0 -129
  822. package/dist/src/ui/components/messages/Todo.test.js.map +0 -1
  823. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +0 -6
  824. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -558
  825. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +0 -1
  826. package/dist/src/ui/components/messages/ToolGroupDisplay.test.d.ts +0 -6
  827. package/dist/src/ui/components/messages/ToolGroupDisplay.test.js +0 -210
  828. package/dist/src/ui/components/messages/ToolGroupDisplay.test.js.map +0 -1
  829. package/dist/src/ui/components/messages/ToolGroupMessage.compact.test.d.ts +0 -6
  830. package/dist/src/ui/components/messages/ToolGroupMessage.compact.test.js +0 -147
  831. package/dist/src/ui/components/messages/ToolGroupMessage.compact.test.js.map +0 -1
  832. package/dist/src/ui/components/messages/ToolGroupMessage.test.d.ts +0 -6
  833. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +0 -828
  834. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +0 -1
  835. package/dist/src/ui/components/messages/ToolGroupMessageRegression.test.d.ts +0 -6
  836. package/dist/src/ui/components/messages/ToolGroupMessageRegression.test.js +0 -101
  837. package/dist/src/ui/components/messages/ToolGroupMessageRegression.test.js.map +0 -1
  838. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +0 -6
  839. package/dist/src/ui/components/messages/ToolMessage.test.js +0 -292
  840. package/dist/src/ui/components/messages/ToolMessage.test.js.map +0 -1
  841. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.d.ts +0 -6
  842. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js +0 -96
  843. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js.map +0 -1
  844. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.d.ts +0 -6
  845. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js +0 -72
  846. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js.map +0 -1
  847. package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.d.ts +0 -6
  848. package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.js +0 -88
  849. package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.js.map +0 -1
  850. package/dist/src/ui/components/messages/ToolResultDisplay.test.d.ts +0 -6
  851. package/dist/src/ui/components/messages/ToolResultDisplay.test.js +0 -333
  852. package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +0 -1
  853. package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.d.ts +0 -6
  854. package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.js +0 -77
  855. package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.js.map +0 -1
  856. package/dist/src/ui/components/messages/ToolShared.test.d.ts +0 -6
  857. package/dist/src/ui/components/messages/ToolShared.test.js +0 -65
  858. package/dist/src/ui/components/messages/ToolShared.test.js.map +0 -1
  859. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.d.ts +0 -6
  860. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js +0 -142
  861. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js.map +0 -1
  862. package/dist/src/ui/components/messages/TopicMessage.test.d.ts +0 -6
  863. package/dist/src/ui/components/messages/TopicMessage.test.js +0 -77
  864. package/dist/src/ui/components/messages/TopicMessage.test.js.map +0 -1
  865. package/dist/src/ui/components/messages/UserMessage.test.d.ts +0 -6
  866. package/dist/src/ui/components/messages/UserMessage.test.js +0 -67
  867. package/dist/src/ui/components/messages/UserMessage.test.js.map +0 -1
  868. package/dist/src/ui/components/messages/UserShellMessage.test.d.ts +0 -6
  869. package/dist/src/ui/components/messages/UserShellMessage.test.js +0 -40
  870. package/dist/src/ui/components/messages/UserShellMessage.test.js.map +0 -1
  871. package/dist/src/ui/components/messages/WarningMessage.test.d.ts +0 -6
  872. package/dist/src/ui/components/messages/WarningMessage.test.js +0 -25
  873. package/dist/src/ui/components/messages/WarningMessage.test.js.map +0 -1
  874. package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +0 -6
  875. package/dist/src/ui/components/shared/BaseSelectionList.test.js +0 -441
  876. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +0 -1
  877. package/dist/src/ui/components/shared/BaseSettingsDialog.test.d.ts +0 -6
  878. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js +0 -710
  879. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js.map +0 -1
  880. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +0 -6
  881. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +0 -89
  882. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +0 -1
  883. package/dist/src/ui/components/shared/EnumSelector.test.d.ts +0 -6
  884. package/dist/src/ui/components/shared/EnumSelector.test.js +0 -83
  885. package/dist/src/ui/components/shared/EnumSelector.test.js.map +0 -1
  886. package/dist/src/ui/components/shared/ExpandableText.test.d.ts +0 -6
  887. package/dist/src/ui/components/shared/ExpandableText.test.js +0 -95
  888. package/dist/src/ui/components/shared/ExpandableText.test.js.map +0 -1
  889. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.d.ts +0 -1
  890. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js +0 -47
  891. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js.map +0 -1
  892. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +0 -6
  893. package/dist/src/ui/components/shared/MaxSizedBox.test.js +0 -161
  894. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +0 -1
  895. package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +0 -6
  896. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +0 -146
  897. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +0 -1
  898. package/dist/src/ui/components/shared/Scrollable.test.d.ts +0 -6
  899. package/dist/src/ui/components/shared/Scrollable.test.js +0 -143
  900. package/dist/src/ui/components/shared/Scrollable.test.js.map +0 -1
  901. package/dist/src/ui/components/shared/ScrollableList.test.d.ts +0 -6
  902. package/dist/src/ui/components/shared/ScrollableList.test.js +0 -438
  903. package/dist/src/ui/components/shared/ScrollableList.test.js.map +0 -1
  904. package/dist/src/ui/components/shared/SearchableList.test.d.ts +0 -6
  905. package/dist/src/ui/components/shared/SearchableList.test.js +0 -169
  906. package/dist/src/ui/components/shared/SearchableList.test.js.map +0 -1
  907. package/dist/src/ui/components/shared/SectionHeader.test.d.ts +0 -6
  908. package/dist/src/ui/components/shared/SectionHeader.test.js +0 -42
  909. package/dist/src/ui/components/shared/SectionHeader.test.js.map +0 -1
  910. package/dist/src/ui/components/shared/SlicingMaxSizedBox.test.d.ts +0 -6
  911. package/dist/src/ui/components/shared/SlicingMaxSizedBox.test.js +0 -54
  912. package/dist/src/ui/components/shared/SlicingMaxSizedBox.test.js.map +0 -1
  913. package/dist/src/ui/components/shared/TabHeader.test.d.ts +0 -6
  914. package/dist/src/ui/components/shared/TabHeader.test.js +0 -144
  915. package/dist/src/ui/components/shared/TabHeader.test.js.map +0 -1
  916. package/dist/src/ui/components/shared/TextInput.test.d.ts +0 -6
  917. package/dist/src/ui/components/shared/TextInput.test.js +0 -353
  918. package/dist/src/ui/components/shared/TextInput.test.js.map +0 -1
  919. package/dist/src/ui/components/shared/VirtualizedList.test.d.ts +0 -6
  920. package/dist/src/ui/components/shared/VirtualizedList.test.js +0 -174
  921. package/dist/src/ui/components/shared/VirtualizedList.test.js.map +0 -1
  922. package/dist/src/ui/components/shared/performance.test.d.ts +0 -1
  923. package/dist/src/ui/components/shared/performance.test.js +0 -74
  924. package/dist/src/ui/components/shared/performance.test.js.map +0 -1
  925. package/dist/src/ui/components/shared/text-buffer.test.d.ts +0 -6
  926. package/dist/src/ui/components/shared/text-buffer.test.js +0 -2965
  927. package/dist/src/ui/components/shared/text-buffer.test.js.map +0 -1
  928. package/dist/src/ui/components/shared/vim-buffer-actions.test.d.ts +0 -6
  929. package/dist/src/ui/components/shared/vim-buffer-actions.test.js +0 -2272
  930. package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +0 -1
  931. package/dist/src/ui/components/views/ChatList.test.d.ts +0 -6
  932. package/dist/src/ui/components/views/ChatList.test.js +0 -45
  933. package/dist/src/ui/components/views/ChatList.test.js.map +0 -1
  934. package/dist/src/ui/components/views/ExtensionDetails.test.d.ts +0 -6
  935. package/dist/src/ui/components/views/ExtensionDetails.test.js +0 -154
  936. package/dist/src/ui/components/views/ExtensionDetails.test.js.map +0 -1
  937. package/dist/src/ui/components/views/ExtensionRegistryView.test.d.ts +0 -6
  938. package/dist/src/ui/components/views/ExtensionRegistryView.test.js +0 -222
  939. package/dist/src/ui/components/views/ExtensionRegistryView.test.js.map +0 -1
  940. package/dist/src/ui/components/views/ExtensionsList.test.d.ts +0 -6
  941. package/dist/src/ui/components/views/ExtensionsList.test.js +0 -145
  942. package/dist/src/ui/components/views/ExtensionsList.test.js.map +0 -1
  943. package/dist/src/ui/components/views/McpStatus.test.d.ts +0 -6
  944. package/dist/src/ui/components/views/McpStatus.test.js +0 -174
  945. package/dist/src/ui/components/views/McpStatus.test.js.map +0 -1
  946. package/dist/src/ui/components/views/SkillsList.test.d.ts +0 -6
  947. package/dist/src/ui/components/views/SkillsList.test.js +0 -99
  948. package/dist/src/ui/components/views/SkillsList.test.js.map +0 -1
  949. package/dist/src/ui/components/views/ToolsList.test.d.ts +0 -6
  950. package/dist/src/ui/components/views/ToolsList.test.js +0 -45
  951. package/dist/src/ui/components/views/ToolsList.test.js.map +0 -1
  952. package/dist/src/ui/contexts/KeypressContext.test.d.ts +0 -6
  953. package/dist/src/ui/contexts/KeypressContext.test.js +0 -1133
  954. package/dist/src/ui/contexts/KeypressContext.test.js.map +0 -1
  955. package/dist/src/ui/contexts/MouseContext.test.d.ts +0 -6
  956. package/dist/src/ui/contexts/MouseContext.test.js +0 -269
  957. package/dist/src/ui/contexts/MouseContext.test.js.map +0 -1
  958. package/dist/src/ui/contexts/ScrollProvider.drag.test.d.ts +0 -6
  959. package/dist/src/ui/contexts/ScrollProvider.drag.test.js +0 -320
  960. package/dist/src/ui/contexts/ScrollProvider.drag.test.js.map +0 -1
  961. package/dist/src/ui/contexts/ScrollProvider.test.d.ts +0 -6
  962. package/dist/src/ui/contexts/ScrollProvider.test.js +0 -478
  963. package/dist/src/ui/contexts/ScrollProvider.test.js.map +0 -1
  964. package/dist/src/ui/contexts/SessionContext.test.d.ts +0 -6
  965. package/dist/src/ui/contexts/SessionContext.test.js +0 -213
  966. package/dist/src/ui/contexts/SessionContext.test.js.map +0 -1
  967. package/dist/src/ui/contexts/SettingsContext.test.d.ts +0 -6
  968. package/dist/src/ui/contexts/SettingsContext.test.js +0 -106
  969. package/dist/src/ui/contexts/SettingsContext.test.js.map +0 -1
  970. package/dist/src/ui/contexts/TerminalContext.test.d.ts +0 -6
  971. package/dist/src/ui/contexts/TerminalContext.test.js +0 -75
  972. package/dist/src/ui/contexts/TerminalContext.test.js.map +0 -1
  973. package/dist/src/ui/contexts/ToolActionsContext.test.d.ts +0 -6
  974. package/dist/src/ui/contexts/ToolActionsContext.test.js +0 -247
  975. package/dist/src/ui/contexts/ToolActionsContext.test.js.map +0 -1
  976. package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +0 -6
  977. package/dist/src/ui/hooks/atCommandProcessor.test.js +0 -1265
  978. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +0 -1
  979. package/dist/src/ui/hooks/atCommandProcessor_agents.test.d.ts +0 -6
  980. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js +0 -210
  981. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js.map +0 -1
  982. package/dist/src/ui/hooks/creditsFlowHandler.test.d.ts +0 -6
  983. package/dist/src/ui/hooks/creditsFlowHandler.test.js +0 -211
  984. package/dist/src/ui/hooks/creditsFlowHandler.test.js.map +0 -1
  985. package/dist/src/ui/hooks/shell-completions/gitProvider.test.d.ts +0 -6
  986. package/dist/src/ui/hooks/shell-completions/gitProvider.test.js +0 -73
  987. package/dist/src/ui/hooks/shell-completions/gitProvider.test.js.map +0 -1
  988. package/dist/src/ui/hooks/shell-completions/npmProvider.test.d.ts +0 -6
  989. package/dist/src/ui/hooks/shell-completions/npmProvider.test.js +0 -69
  990. package/dist/src/ui/hooks/shell-completions/npmProvider.test.js.map +0 -1
  991. package/dist/src/ui/hooks/shellReducer.test.d.ts +0 -6
  992. package/dist/src/ui/hooks/shellReducer.test.js +0 -341
  993. package/dist/src/ui/hooks/shellReducer.test.js.map +0 -1
  994. package/dist/src/ui/hooks/slashCommandProcessor.test.d.ts +0 -6
  995. package/dist/src/ui/hooks/slashCommandProcessor.test.js +0 -881
  996. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +0 -1
  997. package/dist/src/ui/hooks/toolMapping.test.d.ts +0 -6
  998. package/dist/src/ui/hooks/toolMapping.test.js +0 -292
  999. package/dist/src/ui/hooks/toolMapping.test.js.map +0 -1
  1000. package/dist/src/ui/hooks/useAgentStream.test.d.ts +0 -6
  1001. package/dist/src/ui/hooks/useAgentStream.test.js +0 -161
  1002. package/dist/src/ui/hooks/useAgentStream.test.js.map +0 -1
  1003. package/dist/src/ui/hooks/useAlternateBuffer.test.d.ts +0 -6
  1004. package/dist/src/ui/hooks/useAlternateBuffer.test.js +0 -62
  1005. package/dist/src/ui/hooks/useAlternateBuffer.test.js.map +0 -1
  1006. package/dist/src/ui/hooks/useAnimatedScrollbar.test.d.ts +0 -6
  1007. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js +0 -85
  1008. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js.map +0 -1
  1009. package/dist/src/ui/hooks/useApprovalModeIndicator.test.d.ts +0 -6
  1010. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js +0 -477
  1011. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js.map +0 -1
  1012. package/dist/src/ui/hooks/useAtCompletion.test.d.ts +0 -6
  1013. package/dist/src/ui/hooks/useAtCompletion.test.js +0 -567
  1014. package/dist/src/ui/hooks/useAtCompletion.test.js.map +0 -1
  1015. package/dist/src/ui/hooks/useAtCompletion_agents.test.d.ts +0 -6
  1016. package/dist/src/ui/hooks/useAtCompletion_agents.test.js +0 -87
  1017. package/dist/src/ui/hooks/useAtCompletion_agents.test.js.map +0 -1
  1018. package/dist/src/ui/hooks/useBackgroundTaskManager.test.d.ts +0 -6
  1019. package/dist/src/ui/hooks/useBackgroundTaskManager.test.js +0 -168
  1020. package/dist/src/ui/hooks/useBackgroundTaskManager.test.js.map +0 -1
  1021. package/dist/src/ui/hooks/useBanner.test.d.ts +0 -6
  1022. package/dist/src/ui/hooks/useBanner.test.js +0 -144
  1023. package/dist/src/ui/hooks/useBanner.test.js.map +0 -1
  1024. package/dist/src/ui/hooks/useBatchedScroll.test.d.ts +0 -6
  1025. package/dist/src/ui/hooks/useBatchedScroll.test.js +0 -62
  1026. package/dist/src/ui/hooks/useBatchedScroll.test.js.map +0 -1
  1027. package/dist/src/ui/hooks/useCommandCompletion.test.d.ts +0 -6
  1028. package/dist/src/ui/hooks/useCommandCompletion.test.js +0 -722
  1029. package/dist/src/ui/hooks/useCommandCompletion.test.js.map +0 -1
  1030. package/dist/src/ui/hooks/useConsoleMessages.test.d.ts +0 -6
  1031. package/dist/src/ui/hooks/useConsoleMessages.test.js +0 -201
  1032. package/dist/src/ui/hooks/useConsoleMessages.test.js.map +0 -1
  1033. package/dist/src/ui/hooks/useEditorSettings.test.d.ts +0 -6
  1034. package/dist/src/ui/hooks/useEditorSettings.test.js +0 -179
  1035. package/dist/src/ui/hooks/useEditorSettings.test.js.map +0 -1
  1036. package/dist/src/ui/hooks/useExecutionLifecycle.test.d.ts +0 -6
  1037. package/dist/src/ui/hooks/useExecutionLifecycle.test.js +0 -903
  1038. package/dist/src/ui/hooks/useExecutionLifecycle.test.js.map +0 -1
  1039. package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +0 -6
  1040. package/dist/src/ui/hooks/useExtensionUpdates.test.js +0 -280
  1041. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +0 -1
  1042. package/dist/src/ui/hooks/useFlickerDetector.test.d.ts +0 -6
  1043. package/dist/src/ui/hooks/useFlickerDetector.test.js +0 -106
  1044. package/dist/src/ui/hooks/useFlickerDetector.test.js.map +0 -1
  1045. package/dist/src/ui/hooks/useFocus.test.d.ts +0 -6
  1046. package/dist/src/ui/hooks/useFocus.test.js +0 -140
  1047. package/dist/src/ui/hooks/useFocus.test.js.map +0 -1
  1048. package/dist/src/ui/hooks/useFolderTrust.test.d.ts +0 -6
  1049. package/dist/src/ui/hooks/useFolderTrust.test.js +0 -268
  1050. package/dist/src/ui/hooks/useFolderTrust.test.js.map +0 -1
  1051. package/dist/src/ui/hooks/useGeminiStream.test.d.ts +0 -6
  1052. package/dist/src/ui/hooks/useGeminiStream.test.js +0 -2855
  1053. package/dist/src/ui/hooks/useGeminiStream.test.js.map +0 -1
  1054. package/dist/src/ui/hooks/useGitBranchName.test.d.ts +0 -6
  1055. package/dist/src/ui/hooks/useGitBranchName.test.js +0 -237
  1056. package/dist/src/ui/hooks/useGitBranchName.test.js.map +0 -1
  1057. package/dist/src/ui/hooks/useHistoryManager.test.d.ts +0 -6
  1058. package/dist/src/ui/hooks/useHistoryManager.test.js +0 -259
  1059. package/dist/src/ui/hooks/useHistoryManager.test.js.map +0 -1
  1060. package/dist/src/ui/hooks/useHookDisplayState.test.d.ts +0 -6
  1061. package/dist/src/ui/hooks/useHookDisplayState.test.js +0 -200
  1062. package/dist/src/ui/hooks/useHookDisplayState.test.js.map +0 -1
  1063. package/dist/src/ui/hooks/useIdeTrustListener.test.d.ts +0 -6
  1064. package/dist/src/ui/hooks/useIdeTrustListener.test.js +0 -225
  1065. package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +0 -1
  1066. package/dist/src/ui/hooks/useIncludeDirsTrust.test.d.ts +0 -6
  1067. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js +0 -174
  1068. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +0 -1
  1069. package/dist/src/ui/hooks/useInlineEditBuffer.test.d.ts +0 -6
  1070. package/dist/src/ui/hooks/useInlineEditBuffer.test.js +0 -112
  1071. package/dist/src/ui/hooks/useInlineEditBuffer.test.js.map +0 -1
  1072. package/dist/src/ui/hooks/useInputHistory.test.d.ts +0 -6
  1073. package/dist/src/ui/hooks/useInputHistory.test.js +0 -389
  1074. package/dist/src/ui/hooks/useInputHistory.test.js.map +0 -1
  1075. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +0 -6
  1076. package/dist/src/ui/hooks/useInputHistoryStore.test.js +0 -238
  1077. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +0 -1
  1078. package/dist/src/ui/hooks/useKeypress.test.d.ts +0 -6
  1079. package/dist/src/ui/hooks/useKeypress.test.js +0 -198
  1080. package/dist/src/ui/hooks/useKeypress.test.js.map +0 -1
  1081. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +0 -6
  1082. package/dist/src/ui/hooks/useLoadingIndicator.test.js +0 -177
  1083. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +0 -1
  1084. package/dist/src/ui/hooks/useLogger.test.d.ts +0 -6
  1085. package/dist/src/ui/hooks/useLogger.test.js +0 -44
  1086. package/dist/src/ui/hooks/useLogger.test.js.map +0 -1
  1087. package/dist/src/ui/hooks/useMcpStatus.test.d.ts +0 -6
  1088. package/dist/src/ui/hooks/useMcpStatus.test.js +0 -69
  1089. package/dist/src/ui/hooks/useMcpStatus.test.js.map +0 -1
  1090. package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +0 -6
  1091. package/dist/src/ui/hooks/useMemoryMonitor.test.js +0 -62
  1092. package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +0 -1
  1093. package/dist/src/ui/hooks/useMessageQueue.test.d.ts +0 -6
  1094. package/dist/src/ui/hooks/useMessageQueue.test.js +0 -365
  1095. package/dist/src/ui/hooks/useMessageQueue.test.js.map +0 -1
  1096. package/dist/src/ui/hooks/useModelCommand.test.d.ts +0 -6
  1097. package/dist/src/ui/hooks/useModelCommand.test.js +0 -45
  1098. package/dist/src/ui/hooks/useModelCommand.test.js.map +0 -1
  1099. package/dist/src/ui/hooks/useMouse.test.d.ts +0 -6
  1100. package/dist/src/ui/hooks/useMouse.test.js +0 -52
  1101. package/dist/src/ui/hooks/useMouse.test.js.map +0 -1
  1102. package/dist/src/ui/hooks/useMouseClick.test.d.ts +0 -6
  1103. package/dist/src/ui/hooks/useMouseClick.test.js +0 -68
  1104. package/dist/src/ui/hooks/useMouseClick.test.js.map +0 -1
  1105. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.d.ts +0 -6
  1106. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +0 -291
  1107. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +0 -1
  1108. package/dist/src/ui/hooks/usePhraseCycler.test.d.ts +0 -6
  1109. package/dist/src/ui/hooks/usePhraseCycler.test.js +0 -187
  1110. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +0 -1
  1111. package/dist/src/ui/hooks/usePrivacySettings.test.d.ts +0 -6
  1112. package/dist/src/ui/hooks/usePrivacySettings.test.js +0 -113
  1113. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +0 -1
  1114. package/dist/src/ui/hooks/useQuotaAndFallback.test.d.ts +0 -6
  1115. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +0 -817
  1116. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +0 -1
  1117. package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +0 -6
  1118. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +0 -168
  1119. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +0 -1
  1120. package/dist/src/ui/hooks/useRewind.test.d.ts +0 -6
  1121. package/dist/src/ui/hooks/useRewind.test.js +0 -100
  1122. package/dist/src/ui/hooks/useRewind.test.js.map +0 -1
  1123. package/dist/src/ui/hooks/useSelectionList.test.d.ts +0 -6
  1124. package/dist/src/ui/hooks/useSelectionList.test.js +0 -960
  1125. package/dist/src/ui/hooks/useSelectionList.test.js.map +0 -1
  1126. package/dist/src/ui/hooks/useSessionBrowser.test.d.ts +0 -6
  1127. package/dist/src/ui/hooks/useSessionBrowser.test.js +0 -277
  1128. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +0 -1
  1129. package/dist/src/ui/hooks/useSessionResume.test.d.ts +0 -6
  1130. package/dist/src/ui/hooks/useSessionResume.test.js +0 -402
  1131. package/dist/src/ui/hooks/useSessionResume.test.js.map +0 -1
  1132. package/dist/src/ui/hooks/useSettingsNavigation.test.d.ts +0 -6
  1133. package/dist/src/ui/hooks/useSettingsNavigation.test.js +0 -87
  1134. package/dist/src/ui/hooks/useSettingsNavigation.test.js.map +0 -1
  1135. package/dist/src/ui/hooks/useShellCompletion.test.d.ts +0 -6
  1136. package/dist/src/ui/hooks/useShellCompletion.test.js +0 -354
  1137. package/dist/src/ui/hooks/useShellCompletion.test.js.map +0 -1
  1138. package/dist/src/ui/hooks/useShellHistory.test.d.ts +0 -6
  1139. package/dist/src/ui/hooks/useShellHistory.test.js +0 -226
  1140. package/dist/src/ui/hooks/useShellHistory.test.js.map +0 -1
  1141. package/dist/src/ui/hooks/useShellInactivityStatus.test.d.ts +0 -6
  1142. package/dist/src/ui/hooks/useShellInactivityStatus.test.js +0 -84
  1143. package/dist/src/ui/hooks/useShellInactivityStatus.test.js.map +0 -1
  1144. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +0 -10
  1145. package/dist/src/ui/hooks/useSlashCompletion.test.js +0 -977
  1146. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +0 -1
  1147. package/dist/src/ui/hooks/useSnowfall.test.d.ts +0 -6
  1148. package/dist/src/ui/hooks/useSnowfall.test.js +0 -92
  1149. package/dist/src/ui/hooks/useSnowfall.test.js.map +0 -1
  1150. package/dist/src/ui/hooks/useSuspend.test.d.ts +0 -6
  1151. package/dist/src/ui/hooks/useSuspend.test.js +0 -136
  1152. package/dist/src/ui/hooks/useSuspend.test.js.map +0 -1
  1153. package/dist/src/ui/hooks/useTabbedNavigation.test.d.ts +0 -6
  1154. package/dist/src/ui/hooks/useTabbedNavigation.test.js +0 -243
  1155. package/dist/src/ui/hooks/useTabbedNavigation.test.js.map +0 -1
  1156. package/dist/src/ui/hooks/useTerminalTheme.test.d.ts +0 -6
  1157. package/dist/src/ui/hooks/useTerminalTheme.test.js +0 -169
  1158. package/dist/src/ui/hooks/useTerminalTheme.test.js.map +0 -1
  1159. package/dist/src/ui/hooks/useTimer.test.d.ts +0 -6
  1160. package/dist/src/ui/hooks/useTimer.test.js +0 -119
  1161. package/dist/src/ui/hooks/useTimer.test.js.map +0 -1
  1162. package/dist/src/ui/hooks/useTips.test.d.ts +0 -6
  1163. package/dist/src/ui/hooks/useTips.test.js +0 -33
  1164. package/dist/src/ui/hooks/useTips.test.js.map +0 -1
  1165. package/dist/src/ui/hooks/useToolScheduler.test.d.ts +0 -6
  1166. package/dist/src/ui/hooks/useToolScheduler.test.js +0 -534
  1167. package/dist/src/ui/hooks/useToolScheduler.test.js.map +0 -1
  1168. package/dist/src/ui/hooks/useTurnActivityMonitor.test.d.ts +0 -6
  1169. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js +0 -99
  1170. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js.map +0 -1
  1171. package/dist/src/ui/hooks/vim-passthrough.test.d.ts +0 -6
  1172. package/dist/src/ui/hooks/vim-passthrough.test.js +0 -84
  1173. package/dist/src/ui/hooks/vim-passthrough.test.js.map +0 -1
  1174. package/dist/src/ui/hooks/vim.test.d.ts +0 -6
  1175. package/dist/src/ui/hooks/vim.test.js +0 -2156
  1176. package/dist/src/ui/hooks/vim.test.js.map +0 -1
  1177. package/dist/src/ui/key/keyBindings.test.d.ts +0 -6
  1178. package/dist/src/ui/key/keyBindings.test.js +0 -225
  1179. package/dist/src/ui/key/keyBindings.test.js.map +0 -1
  1180. package/dist/src/ui/key/keyMatchers.test.d.ts +0 -6
  1181. package/dist/src/ui/key/keyMatchers.test.js +0 -524
  1182. package/dist/src/ui/key/keyMatchers.test.js.map +0 -1
  1183. package/dist/src/ui/key/keybindingUtils.test.d.ts +0 -6
  1184. package/dist/src/ui/key/keybindingUtils.test.js +0 -121
  1185. package/dist/src/ui/key/keybindingUtils.test.js.map +0 -1
  1186. package/dist/src/ui/layouts/DefaultAppLayout.test.d.ts +0 -6
  1187. package/dist/src/ui/layouts/DefaultAppLayout.test.js +0 -126
  1188. package/dist/src/ui/layouts/DefaultAppLayout.test.js.map +0 -1
  1189. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.d.ts +0 -6
  1190. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js +0 -134
  1191. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js.map +0 -1
  1192. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.d.ts +0 -6
  1193. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js +0 -43
  1194. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js.map +0 -1
  1195. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.d.ts +0 -6
  1196. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js +0 -43
  1197. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js.map +0 -1
  1198. package/dist/src/ui/privacy/PrivacyNotice.test.d.ts +0 -6
  1199. package/dist/src/ui/privacy/PrivacyNotice.test.js +0 -63
  1200. package/dist/src/ui/privacy/PrivacyNotice.test.js.map +0 -1
  1201. package/dist/src/ui/state/extensions.test.d.ts +0 -6
  1202. package/dist/src/ui/state/extensions.test.js +0 -219
  1203. package/dist/src/ui/state/extensions.test.js.map +0 -1
  1204. package/dist/src/ui/themes/color-utils.test.d.ts +0 -6
  1205. package/dist/src/ui/themes/color-utils.test.js +0 -326
  1206. package/dist/src/ui/themes/color-utils.test.js.map +0 -1
  1207. package/dist/src/ui/themes/theme-manager.test.d.ts +0 -6
  1208. package/dist/src/ui/themes/theme-manager.test.js +0 -274
  1209. package/dist/src/ui/themes/theme-manager.test.js.map +0 -1
  1210. package/dist/src/ui/themes/theme.test.d.ts +0 -6
  1211. package/dist/src/ui/themes/theme.test.js +0 -171
  1212. package/dist/src/ui/themes/theme.test.js.map +0 -1
  1213. package/dist/src/ui/utils/CodeColorizer.test.d.ts +0 -6
  1214. package/dist/src/ui/utils/CodeColorizer.test.js +0 -74
  1215. package/dist/src/ui/utils/CodeColorizer.test.js.map +0 -1
  1216. package/dist/src/ui/utils/ConsolePatcher.test.d.ts +0 -6
  1217. package/dist/src/ui/utils/ConsolePatcher.test.js +0 -199
  1218. package/dist/src/ui/utils/ConsolePatcher.test.js.map +0 -1
  1219. package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +0 -6
  1220. package/dist/src/ui/utils/MarkdownDisplay.test.js +0 -175
  1221. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +0 -1
  1222. package/dist/src/ui/utils/TableRenderer.test.d.ts +0 -1
  1223. package/dist/src/ui/utils/TableRenderer.test.js +0 -396
  1224. package/dist/src/ui/utils/TableRenderer.test.js.map +0 -1
  1225. package/dist/src/ui/utils/antigravityUtils.test.d.ts +0 -6
  1226. package/dist/src/ui/utils/antigravityUtils.test.js +0 -54
  1227. package/dist/src/ui/utils/antigravityUtils.test.js.map +0 -1
  1228. package/dist/src/ui/utils/borderStyles.test.d.ts +0 -6
  1229. package/dist/src/ui/utils/borderStyles.test.js +0 -172
  1230. package/dist/src/ui/utils/borderStyles.test.js.map +0 -1
  1231. package/dist/src/ui/utils/clipboardUtils.test.d.ts +0 -6
  1232. package/dist/src/ui/utils/clipboardUtils.test.js +0 -442
  1233. package/dist/src/ui/utils/clipboardUtils.test.js.map +0 -1
  1234. package/dist/src/ui/utils/clipboardUtils.windows.test.d.ts +0 -6
  1235. package/dist/src/ui/utils/clipboardUtils.windows.test.js +0 -56
  1236. package/dist/src/ui/utils/clipboardUtils.windows.test.js.map +0 -1
  1237. package/dist/src/ui/utils/commandUtils.test.d.ts +0 -6
  1238. package/dist/src/ui/utils/commandUtils.test.js +0 -511
  1239. package/dist/src/ui/utils/commandUtils.test.js.map +0 -1
  1240. package/dist/src/ui/utils/computeStats.test.d.ts +0 -6
  1241. package/dist/src/ui/utils/computeStats.test.js +0 -279
  1242. package/dist/src/ui/utils/computeStats.test.js.map +0 -1
  1243. package/dist/src/ui/utils/directoryUtils.test.d.ts +0 -6
  1244. package/dist/src/ui/utils/directoryUtils.test.js +0 -239
  1245. package/dist/src/ui/utils/directoryUtils.test.js.map +0 -1
  1246. package/dist/src/ui/utils/displayUtils.test.d.ts +0 -6
  1247. package/dist/src/ui/utils/displayUtils.test.js +0 -61
  1248. package/dist/src/ui/utils/displayUtils.test.js.map +0 -1
  1249. package/dist/src/ui/utils/formatters.test.d.ts +0 -6
  1250. package/dist/src/ui/utils/formatters.test.js +0 -152
  1251. package/dist/src/ui/utils/formatters.test.js.map +0 -1
  1252. package/dist/src/ui/utils/highlight.test.d.ts +0 -6
  1253. package/dist/src/ui/utils/highlight.test.js +0 -205
  1254. package/dist/src/ui/utils/highlight.test.js.map +0 -1
  1255. package/dist/src/ui/utils/input.test.d.ts +0 -6
  1256. package/dist/src/ui/utils/input.test.js +0 -44
  1257. package/dist/src/ui/utils/input.test.js.map +0 -1
  1258. package/dist/src/ui/utils/latexToUnicode.test.d.ts +0 -6
  1259. package/dist/src/ui/utils/latexToUnicode.test.js +0 -222
  1260. package/dist/src/ui/utils/latexToUnicode.test.js.map +0 -1
  1261. package/dist/src/ui/utils/markdownParsingUtils.test.d.ts +0 -6
  1262. package/dist/src/ui/utils/markdownParsingUtils.test.js +0 -201
  1263. package/dist/src/ui/utils/markdownParsingUtils.test.js.map +0 -1
  1264. package/dist/src/ui/utils/markdownUtilities.test.d.ts +0 -6
  1265. package/dist/src/ui/utils/markdownUtilities.test.js +0 -42
  1266. package/dist/src/ui/utils/markdownUtilities.test.js.map +0 -1
  1267. package/dist/src/ui/utils/memorySnapshot.test.d.ts +0 -6
  1268. package/dist/src/ui/utils/memorySnapshot.test.js +0 -62
  1269. package/dist/src/ui/utils/memorySnapshot.test.js.map +0 -1
  1270. package/dist/src/ui/utils/mouse.test.d.ts +0 -6
  1271. package/dist/src/ui/utils/mouse.test.js +0 -136
  1272. package/dist/src/ui/utils/mouse.test.js.map +0 -1
  1273. package/dist/src/ui/utils/pendingAttentionNotification.test.d.ts +0 -6
  1274. package/dist/src/ui/utils/pendingAttentionNotification.test.js +0 -79
  1275. package/dist/src/ui/utils/pendingAttentionNotification.test.js.map +0 -1
  1276. package/dist/src/ui/utils/rewindFileOps.test.d.ts +0 -6
  1277. package/dist/src/ui/utils/rewindFileOps.test.js +0 -375
  1278. package/dist/src/ui/utils/rewindFileOps.test.js.map +0 -1
  1279. package/dist/src/ui/utils/terminalCapabilityManager.test.d.ts +0 -6
  1280. package/dist/src/ui/utils/terminalCapabilityManager.test.js +0 -400
  1281. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +0 -1
  1282. package/dist/src/ui/utils/terminalSetup.test.d.ts +0 -6
  1283. package/dist/src/ui/utils/terminalSetup.test.js +0 -201
  1284. package/dist/src/ui/utils/terminalSetup.test.js.map +0 -1
  1285. package/dist/src/ui/utils/textOutput.test.d.ts +0 -6
  1286. package/dist/src/ui/utils/textOutput.test.js +0 -80
  1287. package/dist/src/ui/utils/textOutput.test.js.map +0 -1
  1288. package/dist/src/ui/utils/textUtils.test.d.ts +0 -6
  1289. package/dist/src/ui/utils/textUtils.test.js +0 -430
  1290. package/dist/src/ui/utils/textUtils.test.js.map +0 -1
  1291. package/dist/src/ui/utils/toolLayoutUtils.test.d.ts +0 -6
  1292. package/dist/src/ui/utils/toolLayoutUtils.test.js +0 -187
  1293. package/dist/src/ui/utils/toolLayoutUtils.test.js.map +0 -1
  1294. package/dist/src/ui/utils/ui-sizing.test.d.ts +0 -6
  1295. package/dist/src/ui/utils/ui-sizing.test.js +0 -25
  1296. package/dist/src/ui/utils/ui-sizing.test.js.map +0 -1
  1297. package/dist/src/ui/utils/updateCheck.test.d.ts +0 -6
  1298. package/dist/src/ui/utils/updateCheck.test.js +0 -207
  1299. package/dist/src/ui/utils/updateCheck.test.js.map +0 -1
  1300. package/dist/src/ui/utils/urlSecurityUtils.test.d.ts +0 -6
  1301. package/dist/src/ui/utils/urlSecurityUtils.test.js +0 -49
  1302. package/dist/src/ui/utils/urlSecurityUtils.test.js.map +0 -1
  1303. package/dist/src/utils/activityLogger.test.d.ts +0 -6
  1304. package/dist/src/utils/activityLogger.test.js +0 -196
  1305. package/dist/src/utils/activityLogger.test.js.map +0 -1
  1306. package/dist/src/utils/agentSettings.test.d.ts +0 -6
  1307. package/dist/src/utils/agentSettings.test.js +0 -111
  1308. package/dist/src/utils/agentSettings.test.js.map +0 -1
  1309. package/dist/src/utils/agentUtils.test.d.ts +0 -6
  1310. package/dist/src/utils/agentUtils.test.js +0 -121
  1311. package/dist/src/utils/agentUtils.test.js.map +0 -1
  1312. package/dist/src/utils/cleanup.test.d.ts +0 -6
  1313. package/dist/src/utils/cleanup.test.js +0 -256
  1314. package/dist/src/utils/cleanup.test.js.map +0 -1
  1315. package/dist/src/utils/commands.test.d.ts +0 -6
  1316. package/dist/src/utils/commands.test.js +0 -194
  1317. package/dist/src/utils/commands.test.js.map +0 -1
  1318. package/dist/src/utils/commentJson.test.d.ts +0 -6
  1319. package/dist/src/utils/commentJson.test.js +0 -308
  1320. package/dist/src/utils/commentJson.test.js.map +0 -1
  1321. package/dist/src/utils/deepMerge.test.d.ts +0 -6
  1322. package/dist/src/utils/deepMerge.test.js +0 -211
  1323. package/dist/src/utils/deepMerge.test.js.map +0 -1
  1324. package/dist/src/utils/devtoolsService.test.d.ts +0 -6
  1325. package/dist/src/utils/devtoolsService.test.js +0 -346
  1326. package/dist/src/utils/devtoolsService.test.js.map +0 -1
  1327. package/dist/src/utils/dialogScopeUtils.test.d.ts +0 -6
  1328. package/dist/src/utils/dialogScopeUtils.test.js +0 -81
  1329. package/dist/src/utils/dialogScopeUtils.test.js.map +0 -1
  1330. package/dist/src/utils/envVarResolver.test.d.ts +0 -6
  1331. package/dist/src/utils/envVarResolver.test.js +0 -238
  1332. package/dist/src/utils/envVarResolver.test.js.map +0 -1
  1333. package/dist/src/utils/errors.test.d.ts +0 -6
  1334. package/dist/src/utils/errors.test.js +0 -420
  1335. package/dist/src/utils/errors.test.js.map +0 -1
  1336. package/dist/src/utils/events.test.d.ts +0 -6
  1337. package/dist/src/utils/events.test.js +0 -24
  1338. package/dist/src/utils/events.test.js.map +0 -1
  1339. package/dist/src/utils/featureToggleUtils.test.d.ts +0 -6
  1340. package/dist/src/utils/featureToggleUtils.test.js +0 -126
  1341. package/dist/src/utils/featureToggleUtils.test.js.map +0 -1
  1342. package/dist/src/utils/gitUtils.test.d.ts +0 -6
  1343. package/dist/src/utils/gitUtils.test.js +0 -172
  1344. package/dist/src/utils/gitUtils.test.js.map +0 -1
  1345. package/dist/src/utils/handleAutoUpdate.test.d.ts +0 -6
  1346. package/dist/src/utils/handleAutoUpdate.test.js +0 -399
  1347. package/dist/src/utils/handleAutoUpdate.test.js.map +0 -1
  1348. package/dist/src/utils/hookSettings.test.d.ts +0 -6
  1349. package/dist/src/utils/hookSettings.test.js +0 -117
  1350. package/dist/src/utils/hookSettings.test.js.map +0 -1
  1351. package/dist/src/utils/hookUtils.test.d.ts +0 -6
  1352. package/dist/src/utils/hookUtils.test.js +0 -113
  1353. package/dist/src/utils/hookUtils.test.js.map +0 -1
  1354. package/dist/src/utils/installationInfo.test.d.ts +0 -6
  1355. package/dist/src/utils/installationInfo.test.js +0 -322
  1356. package/dist/src/utils/installationInfo.test.js.map +0 -1
  1357. package/dist/src/utils/jsonoutput.test.d.ts +0 -6
  1358. package/dist/src/utils/jsonoutput.test.js +0 -74
  1359. package/dist/src/utils/jsonoutput.test.js.map +0 -1
  1360. package/dist/src/utils/logCleanup.test.d.ts +0 -6
  1361. package/dist/src/utils/logCleanup.test.js +0 -87
  1362. package/dist/src/utils/logCleanup.test.js.map +0 -1
  1363. package/dist/src/utils/math.test.d.ts +0 -6
  1364. package/dist/src/utils/math.test.js +0 -23
  1365. package/dist/src/utils/math.test.js.map +0 -1
  1366. package/dist/src/utils/persistentState.test.d.ts +0 -6
  1367. package/dist/src/utils/persistentState.test.js +0 -68
  1368. package/dist/src/utils/persistentState.test.js.map +0 -1
  1369. package/dist/src/utils/processUtils.test.d.ts +0 -6
  1370. package/dist/src/utils/processUtils.test.js +0 -150
  1371. package/dist/src/utils/processUtils.test.js.map +0 -1
  1372. package/dist/src/utils/readStdin.test.d.ts +0 -6
  1373. package/dist/src/utils/readStdin.test.js +0 -149
  1374. package/dist/src/utils/readStdin.test.js.map +0 -1
  1375. package/dist/src/utils/readStdin_safety.test.d.ts +0 -6
  1376. package/dist/src/utils/readStdin_safety.test.js +0 -68
  1377. package/dist/src/utils/readStdin_safety.test.js.map +0 -1
  1378. package/dist/src/utils/relaunch.test.d.ts +0 -6
  1379. package/dist/src/utils/relaunch.test.js +0 -275
  1380. package/dist/src/utils/relaunch.test.js.map +0 -1
  1381. package/dist/src/utils/resolvePath.test.d.ts +0 -6
  1382. package/dist/src/utils/resolvePath.test.js +0 -34
  1383. package/dist/src/utils/resolvePath.test.js.map +0 -1
  1384. package/dist/src/utils/sandbox.test.d.ts +0 -6
  1385. package/dist/src/utils/sandbox.test.js +0 -725
  1386. package/dist/src/utils/sandbox.test.js.map +0 -1
  1387. package/dist/src/utils/sandboxUtils.test.d.ts +0 -6
  1388. package/dist/src/utils/sandboxUtils.test.js +0 -190
  1389. package/dist/src/utils/sandboxUtils.test.js.map +0 -1
  1390. package/dist/src/utils/sessionCleanup.integration.test.d.ts +0 -6
  1391. package/dist/src/utils/sessionCleanup.integration.test.js +0 -276
  1392. package/dist/src/utils/sessionCleanup.integration.test.js.map +0 -1
  1393. package/dist/src/utils/sessionCleanup.test.d.ts +0 -6
  1394. package/dist/src/utils/sessionCleanup.test.js +0 -829
  1395. package/dist/src/utils/sessionCleanup.test.js.map +0 -1
  1396. package/dist/src/utils/sessionUtils.test.d.ts +0 -6
  1397. package/dist/src/utils/sessionUtils.test.js +0 -815
  1398. package/dist/src/utils/sessionUtils.test.js.map +0 -1
  1399. package/dist/src/utils/sessions.test.d.ts +0 -6
  1400. package/dist/src/utils/sessions.test.js +0 -580
  1401. package/dist/src/utils/sessions.test.js.map +0 -1
  1402. package/dist/src/utils/settingsUtils.test.d.ts +0 -6
  1403. package/dist/src/utils/settingsUtils.test.js +0 -673
  1404. package/dist/src/utils/settingsUtils.test.js.map +0 -1
  1405. package/dist/src/utils/skillSettings.test.d.ts +0 -6
  1406. package/dist/src/utils/skillSettings.test.js +0 -142
  1407. package/dist/src/utils/skillSettings.test.js.map +0 -1
  1408. package/dist/src/utils/skillUtils.test.d.ts +0 -6
  1409. package/dist/src/utils/skillUtils.test.js +0 -248
  1410. package/dist/src/utils/skillUtils.test.js.map +0 -1
  1411. package/dist/src/utils/startupWarnings.test.d.ts +0 -6
  1412. package/dist/src/utils/startupWarnings.test.js +0 -61
  1413. package/dist/src/utils/startupWarnings.test.js.map +0 -1
  1414. package/dist/src/utils/terminalNotifications.test.d.ts +0 -6
  1415. package/dist/src/utils/terminalNotifications.test.js +0 -219
  1416. package/dist/src/utils/terminalNotifications.test.js.map +0 -1
  1417. package/dist/src/utils/terminalTheme.test.d.ts +0 -6
  1418. package/dist/src/utils/terminalTheme.test.js +0 -91
  1419. package/dist/src/utils/terminalTheme.test.js.map +0 -1
  1420. package/dist/src/utils/tierUtils.test.d.ts +0 -6
  1421. package/dist/src/utils/tierUtils.test.js +0 -25
  1422. package/dist/src/utils/tierUtils.test.js.map +0 -1
  1423. package/dist/src/utils/toolOutputCleanup.test.d.ts +0 -6
  1424. package/dist/src/utils/toolOutputCleanup.test.js +0 -280
  1425. package/dist/src/utils/toolOutputCleanup.test.js.map +0 -1
  1426. package/dist/src/utils/updateEventEmitter.test.d.ts +0 -6
  1427. package/dist/src/utils/updateEventEmitter.test.js +0 -18
  1428. package/dist/src/utils/updateEventEmitter.test.js.map +0 -1
  1429. package/dist/src/utils/userStartupWarnings.test.d.ts +0 -6
  1430. package/dist/src/utils/userStartupWarnings.test.js +0 -225
  1431. package/dist/src/utils/userStartupWarnings.test.js.map +0 -1
  1432. package/dist/src/utils/windowTitle.test.d.ts +0 -6
  1433. package/dist/src/utils/windowTitle.test.js +0 -216
  1434. package/dist/src/utils/windowTitle.test.js.map +0 -1
  1435. package/dist/src/utils/worktreeSetup.test.d.ts +0 -6
  1436. package/dist/src/utils/worktreeSetup.test.js +0 -89
  1437. package/dist/src/utils/worktreeSetup.test.js.map +0 -1
  1438. package/dist/src/validateNonInterActiveAuth.test.d.ts +0 -6
  1439. package/dist/src/validateNonInterActiveAuth.test.js +0 -319
  1440. package/dist/src/validateNonInterActiveAuth.test.js.map +0 -1
@@ -1,3124 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
- import * as os from 'node:os';
8
- import * as path from 'node:path';
9
- import { DEFAULT_FILE_FILTERING_OPTIONS, OutputFormat, SHELL_TOOL_NAME, WRITE_FILE_TOOL_NAME, EDIT_TOOL_NAME, WEB_FETCH_TOOL_NAME, ASK_USER_TOOL_NAME, debugLogger, ApprovalMode, Storage, } from '@google/gemini-cli-core';
10
- import { loadCliConfig, parseArguments } from './config.js';
11
- import { createTestMergedSettings, } from './settings.js';
12
- import * as ServerConfig from '@google/gemini-cli-core';
13
- import { isWorkspaceTrusted } from './trustedFolders.js';
14
- import { ExtensionManager } from './extension-manager.js';
15
- import { RESUME_LATEST } from '../utils/sessionUtils.js';
16
- vi.mock('./trustedFolders.js', () => ({
17
- isWorkspaceTrusted: vi.fn(() => ({ isTrusted: true, source: 'file' })), // Default to trusted
18
- }));
19
- vi.mock('./sandboxConfig.js', () => ({
20
- loadSandboxConfig: vi.fn(async () => undefined),
21
- }));
22
- vi.mock('../commands/utils.js', () => ({
23
- exitCli: vi.fn(),
24
- }));
25
- vi.mock('fs', async (importOriginal) => {
26
- const actualFs = await importOriginal();
27
- const pathMod = await import('node:path');
28
- const mockHome = pathMod.resolve(pathMod.sep, 'mock', 'home', 'user');
29
- const MOCK_CWD1 = process.cwd();
30
- const MOCK_CWD2 = pathMod.resolve(pathMod.sep, 'home', 'user', 'project');
31
- const mockPaths = new Set([
32
- MOCK_CWD1,
33
- MOCK_CWD2,
34
- pathMod.resolve(pathMod.sep, 'cli', 'path1'),
35
- pathMod.resolve(pathMod.sep, 'settings', 'path1'),
36
- pathMod.join(mockHome, 'settings', 'path2'),
37
- pathMod.join(MOCK_CWD2, 'cli', 'path2'),
38
- pathMod.join(MOCK_CWD2, 'settings', 'path3'),
39
- ]);
40
- return {
41
- ...actualFs,
42
- mkdirSync: vi.fn((p) => {
43
- mockPaths.add(p.toString());
44
- }),
45
- writeFileSync: vi.fn(),
46
- existsSync: vi.fn((p) => mockPaths.has(p.toString())),
47
- statSync: vi.fn((p) => {
48
- if (mockPaths.has(p.toString())) {
49
- return { isDirectory: () => true };
50
- }
51
- return actualFs.statSync(p);
52
- }),
53
- realpathSync: vi.fn((p) => p),
54
- };
55
- });
56
- vi.mock('os', async (importOriginal) => {
57
- const actualOs = await importOriginal();
58
- return {
59
- ...actualOs,
60
- homedir: vi.fn(() => path.resolve(path.sep, 'mock', 'home', 'user')),
61
- };
62
- });
63
- vi.mock('open', () => ({
64
- default: vi.fn(),
65
- }));
66
- vi.mock('read-package-up', () => ({
67
- readPackageUp: vi.fn(() => Promise.resolve({ packageJson: { version: 'test-version' } })),
68
- }));
69
- vi.mock('@google/gemini-cli-core', async () => {
70
- const actualServer = await vi.importActual('@google/gemini-cli-core');
71
- return {
72
- ...actualServer,
73
- IdeClient: {
74
- getInstance: vi.fn().mockResolvedValue({
75
- getConnectionStatus: vi.fn(),
76
- initialize: vi.fn(),
77
- shutdown: vi.fn(),
78
- }),
79
- },
80
- loadEnvironment: vi.fn(),
81
- DEFAULT_MEMORY_FILE_FILTERING_OPTIONS: {
82
- respectGitIgnore: false,
83
- respectGeminiIgnore: true,
84
- customIgnoreFilePaths: [],
85
- },
86
- DEFAULT_FILE_FILTERING_OPTIONS: {
87
- respectGitIgnore: true,
88
- respectGeminiIgnore: true,
89
- customIgnoreFilePaths: [],
90
- },
91
- createPolicyEngineConfig: vi.fn(async (_settings, approvalMode, _workspacePoliciesDir, interactive) => ({
92
- rules: [],
93
- checkers: [],
94
- defaultDecision: interactive
95
- ? ServerConfig.PolicyDecision.ASK_USER
96
- : ServerConfig.PolicyDecision.DENY,
97
- approvalMode: approvalMode ?? ServerConfig.ApprovalMode.DEFAULT,
98
- nonInteractive: !interactive,
99
- })),
100
- getAdminErrorMessage: vi.fn((_feature) => `YOLO mode is disabled by your administrator. To enable it, please request an update to the settings at: https://goo.gle/manage-gemini-cli`),
101
- isHeadlessMode: vi.fn((opts) => {
102
- if (process.env['VITEST'] === 'true') {
103
- return (!!opts?.prompt ||
104
- (!!process.stdin && !process.stdin.isTTY) ||
105
- (!!process.stdout && !process.stdout.isTTY));
106
- }
107
- return (!!opts?.prompt ||
108
- process.env['CI'] === 'true' ||
109
- process.env['GITHUB_ACTIONS'] === 'true' ||
110
- (!!process.stdin && !process.stdin.isTTY) ||
111
- (!!process.stdout && !process.stdout.isTTY));
112
- }),
113
- };
114
- });
115
- vi.mock('./extension-manager.js', () => {
116
- const ExtensionManager = vi.fn();
117
- ExtensionManager.prototype.loadExtensions = vi.fn();
118
- ExtensionManager.prototype.getExtensions = vi.fn().mockReturnValue([]);
119
- return { ExtensionManager };
120
- });
121
- // Global setup to ensure clean environment for all tests in this file
122
- const originalArgv = process.argv;
123
- const originalGeminiModel = process.env['GEMINI_MODEL'];
124
- const originalStdoutIsTTY = process.stdout.isTTY;
125
- const originalStdinIsTTY = process.stdin.isTTY;
126
- beforeEach(() => {
127
- delete process.env['GEMINI_MODEL'];
128
- // Restore ExtensionManager mocks by re-assigning them
129
- ExtensionManager.prototype.getExtensions = vi.fn().mockReturnValue([]);
130
- ExtensionManager.prototype.loadExtensions = vi
131
- .fn()
132
- .mockResolvedValue(undefined);
133
- // Default to interactive mode for tests unless otherwise specified
134
- Object.defineProperty(process.stdout, 'isTTY', {
135
- value: true,
136
- configurable: true,
137
- writable: true,
138
- });
139
- Object.defineProperty(process.stdin, 'isTTY', {
140
- value: true,
141
- configurable: true,
142
- writable: true,
143
- });
144
- });
145
- afterEach(() => {
146
- process.argv = originalArgv;
147
- if (originalGeminiModel !== undefined) {
148
- process.env['GEMINI_MODEL'] = originalGeminiModel;
149
- }
150
- else {
151
- delete process.env['GEMINI_MODEL'];
152
- }
153
- Object.defineProperty(process.stdout, 'isTTY', {
154
- value: originalStdoutIsTTY,
155
- configurable: true,
156
- writable: true,
157
- });
158
- Object.defineProperty(process.stdin, 'isTTY', {
159
- value: originalStdinIsTTY,
160
- configurable: true,
161
- writable: true,
162
- });
163
- });
164
- describe('parseArguments', () => {
165
- afterEach(() => {
166
- vi.restoreAllMocks();
167
- });
168
- it('should fail if multiple session flags are provided', async () => {
169
- process.argv = [
170
- 'node',
171
- 'script.js',
172
- '--resume',
173
- '--session-id',
174
- 'test-uuid-1234',
175
- ];
176
- const mockConsoleError = vi
177
- .spyOn(console, 'error')
178
- .mockImplementation(() => { });
179
- vi.spyOn(process, 'exit').mockImplementation(() => {
180
- throw new Error('process.exit called');
181
- });
182
- await expect(parseArguments(createTestMergedSettings())).rejects.toThrow('process.exit called');
183
- expect(mockConsoleError).toHaveBeenCalledWith(expect.stringContaining('The flags --resume, --session-id, and --session-file are mutually exclusive. Please provide only one.'));
184
- });
185
- it('should parse --session-id option correctly', async () => {
186
- process.argv = ['node', 'script.js', '--session-id', 'test-uuid-1234'];
187
- vi.spyOn(process, 'exit').mockImplementation(() => {
188
- throw new Error('process.exit called');
189
- });
190
- const parsedArgs = await parseArguments(createTestMergedSettings());
191
- expect(parsedArgs.sessionId).toBe('test-uuid-1234');
192
- });
193
- describe('worktree', () => {
194
- it('should parse --worktree flag when provided with a name', async () => {
195
- process.argv = ['node', 'script.js', '--worktree', 'my-feature'];
196
- const settings = createTestMergedSettings();
197
- settings.experimental.worktrees = true;
198
- const argv = await parseArguments(settings);
199
- expect(argv.worktree).toBe('my-feature');
200
- });
201
- it('should generate a random name when --worktree is provided without a name', async () => {
202
- process.argv = ['node', 'script.js', '--worktree'];
203
- const settings = createTestMergedSettings();
204
- settings.experimental.worktrees = true;
205
- const argv = await parseArguments(settings);
206
- expect(argv.worktree).toBeDefined();
207
- expect(argv.worktree).not.toBe('');
208
- expect(typeof argv.worktree).toBe('string');
209
- });
210
- it('should throw an error when --worktree is used but experimental.worktrees is not enabled', async () => {
211
- process.argv = ['node', 'script.js', '--worktree', 'feature'];
212
- const settings = createTestMergedSettings();
213
- settings.experimental.worktrees = false;
214
- vi.spyOn(process, 'exit').mockImplementation(() => {
215
- throw new Error('process.exit called');
216
- });
217
- const mockConsoleError = vi
218
- .spyOn(console, 'error')
219
- .mockImplementation(() => { });
220
- await expect(parseArguments(settings)).rejects.toThrow('process.exit called');
221
- expect(mockConsoleError).toHaveBeenCalledWith(expect.stringContaining('The --worktree flag is only available when experimental.worktrees is enabled in your settings.'));
222
- });
223
- });
224
- it.each([
225
- {
226
- description: 'long flags',
227
- argv: [
228
- 'node',
229
- 'script.js',
230
- '--prompt',
231
- 'test prompt',
232
- '--prompt-interactive',
233
- 'interactive prompt',
234
- ],
235
- },
236
- {
237
- description: 'short flags',
238
- argv: [
239
- 'node',
240
- 'script.js',
241
- '-p',
242
- 'test prompt',
243
- '-i',
244
- 'interactive prompt',
245
- ],
246
- },
247
- ])('should throw an error when using conflicting prompt flags ($description)', async ({ argv }) => {
248
- process.argv = argv;
249
- vi.spyOn(process, 'exit').mockImplementation(() => {
250
- throw new Error('process.exit called');
251
- });
252
- const mockConsoleError = vi
253
- .spyOn(console, 'error')
254
- .mockImplementation(() => { });
255
- await expect(parseArguments(createTestMergedSettings())).rejects.toThrow('process.exit called');
256
- expect(mockConsoleError).toHaveBeenCalledWith(expect.stringContaining('Cannot use both --prompt (-p) and --prompt-interactive (-i) together'));
257
- });
258
- describe('isCommand middleware', () => {
259
- it.each([
260
- { cmd: 'mcp list', expected: true },
261
- { cmd: 'extensions list', expected: true },
262
- { cmd: 'extension list', expected: true },
263
- { cmd: 'skills list', expected: true },
264
- { cmd: 'skill list', expected: true },
265
- { cmd: 'hooks migrate', expected: true },
266
- { cmd: 'hook migrate', expected: true },
267
- { cmd: 'gemma status', expected: true },
268
- { cmd: 'some query', expected: undefined },
269
- { cmd: 'hello world', expected: undefined },
270
- ])('should set isCommand to $expected for "$cmd"', async ({ cmd, expected }) => {
271
- process.argv = ['node', 'script.js', ...cmd.split(' ')];
272
- const settings = createTestMergedSettings({
273
- admin: {
274
- mcp: { enabled: true },
275
- },
276
- experimental: {
277
- extensionManagement: true,
278
- },
279
- skills: {
280
- enabled: true,
281
- },
282
- hooksConfig: {
283
- enabled: true,
284
- },
285
- });
286
- const parsedArgs = await parseArguments(settings);
287
- expect(parsedArgs.isCommand).toBe(expected);
288
- });
289
- });
290
- it.each([
291
- {
292
- description: 'should allow --prompt without --prompt-interactive',
293
- argv: ['node', 'script.js', '--prompt', 'test prompt'],
294
- expected: { prompt: 'test prompt', promptInteractive: undefined },
295
- },
296
- {
297
- description: 'should allow --prompt-interactive without --prompt',
298
- argv: ['node', 'script.js', '--prompt-interactive', 'interactive prompt'],
299
- expected: { prompt: undefined, promptInteractive: 'interactive prompt' },
300
- },
301
- {
302
- description: 'should allow -i flag as alias for --prompt-interactive',
303
- argv: ['node', 'script.js', '-i', 'interactive prompt'],
304
- expected: { prompt: undefined, promptInteractive: 'interactive prompt' },
305
- },
306
- ])('$description', async ({ argv, expected }) => {
307
- process.argv = argv;
308
- const parsedArgs = await parseArguments(createTestMergedSettings());
309
- expect(parsedArgs.prompt).toBe(expected.prompt);
310
- expect(parsedArgs.promptInteractive).toBe(expected.promptInteractive);
311
- });
312
- describe('positional arguments and @commands', () => {
313
- beforeEach(() => {
314
- // Default to headless mode for these tests as they mostly expect one-shot behavior
315
- process.stdin.isTTY = false;
316
- Object.defineProperty(process.stdout, 'isTTY', {
317
- value: false,
318
- configurable: true,
319
- writable: true,
320
- });
321
- });
322
- it.each([
323
- {
324
- description: 'should convert positional query argument to prompt by default',
325
- argv: ['node', 'script.js', 'Hi Gemini'],
326
- expectedQuery: 'Hi Gemini',
327
- expectedModel: undefined,
328
- debug: false,
329
- },
330
- {
331
- description: 'should map @path to prompt (one-shot) when it starts with @',
332
- argv: ['node', 'script.js', '@path ./file.md'],
333
- expectedQuery: '@path ./file.md',
334
- expectedModel: undefined,
335
- debug: false,
336
- },
337
- {
338
- description: 'should map @path to prompt even when config flags are present',
339
- argv: [
340
- 'node',
341
- 'script.js',
342
- '@path',
343
- './file.md',
344
- '--model',
345
- 'gemini-2.5-pro',
346
- ],
347
- expectedQuery: '@path ./file.md',
348
- expectedModel: 'gemini-2.5-pro',
349
- debug: false,
350
- },
351
- {
352
- description: 'maps unquoted positional @path + arg to prompt (one-shot)',
353
- argv: ['node', 'script.js', '@path', './file.md'],
354
- expectedQuery: '@path ./file.md',
355
- expectedModel: undefined,
356
- debug: false,
357
- },
358
- {
359
- description: 'should handle multiple @path arguments in a single command (one-shot)',
360
- argv: [
361
- 'node',
362
- 'script.js',
363
- '@path',
364
- './file1.md',
365
- '@path',
366
- './file2.md',
367
- ],
368
- expectedQuery: '@path ./file1.md @path ./file2.md',
369
- expectedModel: undefined,
370
- debug: false,
371
- },
372
- {
373
- description: 'should handle mixed quoted and unquoted @path arguments (one-shot)',
374
- argv: [
375
- 'node',
376
- 'script.js',
377
- '@path ./file1.md',
378
- '@path',
379
- './file2.md',
380
- 'additional text',
381
- ],
382
- expectedQuery: '@path ./file1.md @path ./file2.md additional text',
383
- expectedModel: undefined,
384
- debug: false,
385
- },
386
- {
387
- description: 'should map @path to prompt with ambient flags (debug)',
388
- argv: ['node', 'script.js', '@path', './file.md', '--debug'],
389
- expectedQuery: '@path ./file.md',
390
- expectedModel: undefined,
391
- debug: true,
392
- },
393
- {
394
- description: 'should map @include to prompt (one-shot)',
395
- argv: ['node', 'script.js', '@include src/'],
396
- expectedQuery: '@include src/',
397
- expectedModel: undefined,
398
- debug: false,
399
- },
400
- {
401
- description: 'should map @search to prompt (one-shot)',
402
- argv: ['node', 'script.js', '@search pattern'],
403
- expectedQuery: '@search pattern',
404
- expectedModel: undefined,
405
- debug: false,
406
- },
407
- {
408
- description: 'should map @web to prompt (one-shot)',
409
- argv: ['node', 'script.js', '@web query'],
410
- expectedQuery: '@web query',
411
- expectedModel: undefined,
412
- debug: false,
413
- },
414
- {
415
- description: 'should map @git to prompt (one-shot)',
416
- argv: ['node', 'script.js', '@git status'],
417
- expectedQuery: '@git status',
418
- expectedModel: undefined,
419
- debug: false,
420
- },
421
- {
422
- description: 'should handle @command with leading whitespace',
423
- argv: ['node', 'script.js', ' @path ./file.md'],
424
- expectedQuery: ' @path ./file.md',
425
- expectedModel: undefined,
426
- debug: false,
427
- },
428
- ])('$description', async ({ argv, expectedQuery, expectedModel, debug }) => {
429
- process.argv = argv;
430
- const parsedArgs = await parseArguments(createTestMergedSettings());
431
- expect(parsedArgs.query).toBe(expectedQuery);
432
- expect(parsedArgs.prompt).toBe(expectedQuery);
433
- expect(parsedArgs.promptInteractive).toBeUndefined();
434
- if (expectedModel) {
435
- expect(parsedArgs.model).toBe(expectedModel);
436
- }
437
- if (debug) {
438
- expect(parsedArgs.debug).toBe(true);
439
- }
440
- });
441
- it('should include a startup message when converting positional query to interactive prompt', async () => {
442
- process.stdin.isTTY = true;
443
- Object.defineProperty(process.stdout, 'isTTY', {
444
- value: true,
445
- configurable: true,
446
- writable: true,
447
- });
448
- process.argv = ['node', 'script.js', 'hello'];
449
- try {
450
- const argv = await parseArguments(createTestMergedSettings());
451
- expect(argv.startupMessages).toContain('Positional arguments now default to interactive mode. To run in non-interactive mode, use the --prompt (-p) flag.');
452
- }
453
- finally {
454
- // beforeEach handles resetting
455
- }
456
- });
457
- });
458
- it.each([
459
- {
460
- description: 'long flags',
461
- argv: ['node', 'script.js', '--yolo', '--approval-mode', 'default'],
462
- },
463
- {
464
- description: 'short flags',
465
- argv: ['node', 'script.js', '-y', '--approval-mode', 'yolo'],
466
- },
467
- ])('should throw an error when using conflicting yolo/approval-mode flags ($description)', async ({ argv }) => {
468
- process.argv = argv;
469
- vi.spyOn(process, 'exit').mockImplementation(() => {
470
- throw new Error('process.exit called');
471
- });
472
- const mockConsoleError = vi
473
- .spyOn(console, 'error')
474
- .mockImplementation(() => { });
475
- await expect(parseArguments(createTestMergedSettings())).rejects.toThrow('process.exit called');
476
- expect(mockConsoleError).toHaveBeenCalledWith(expect.stringContaining('Cannot use both --yolo (-y) and --approval-mode together. Use --approval-mode=yolo instead.'));
477
- });
478
- it.each([
479
- {
480
- description: 'should allow --approval-mode without --yolo',
481
- argv: ['node', 'script.js', '--approval-mode', 'auto_edit'],
482
- expected: { approvalMode: 'auto_edit', yolo: false },
483
- },
484
- {
485
- description: 'should allow --yolo without --approval-mode',
486
- argv: ['node', 'script.js', '--yolo'],
487
- expected: { approvalMode: undefined, yolo: true },
488
- },
489
- ])('$description', async ({ argv, expected }) => {
490
- process.argv = argv;
491
- const parsedArgs = await parseArguments(createTestMergedSettings());
492
- expect(parsedArgs.approvalMode).toBe(expected.approvalMode);
493
- expect(parsedArgs.yolo).toBe(expected.yolo);
494
- });
495
- it('should reject invalid --approval-mode values', async () => {
496
- process.argv = ['node', 'script.js', '--approval-mode', 'invalid'];
497
- vi.spyOn(process, 'exit').mockImplementation(() => {
498
- throw new Error('process.exit called');
499
- });
500
- const mockConsoleError = vi
501
- .spyOn(console, 'error')
502
- .mockImplementation(() => { });
503
- const debugErrorSpy = vi
504
- .spyOn(debugLogger, 'error')
505
- .mockImplementation(() => { });
506
- await expect(parseArguments(createTestMergedSettings())).rejects.toThrow('process.exit called');
507
- expect(debugErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Invalid values:'));
508
- expect(mockConsoleError).toHaveBeenCalled();
509
- });
510
- it('should allow resuming a session without prompt argument in non-interactive mode (expecting stdin)', async () => {
511
- const originalIsTTY = process.stdin.isTTY;
512
- process.stdin.isTTY = false;
513
- process.argv = ['node', 'script.js', '--resume', 'session-id'];
514
- try {
515
- const argv = await parseArguments(createTestMergedSettings());
516
- expect(argv.resume).toBe('session-id');
517
- }
518
- finally {
519
- process.stdin.isTTY = originalIsTTY;
520
- }
521
- });
522
- it('should return RESUME_LATEST constant when --resume is passed without a value', async () => {
523
- const originalIsTTY = process.stdin.isTTY;
524
- process.stdin.isTTY = true; // Make it interactive to avoid validation error
525
- process.argv = ['node', 'script.js', '--resume'];
526
- try {
527
- const argv = await parseArguments(createTestMergedSettings());
528
- expect(argv.resume).toBe(RESUME_LATEST);
529
- expect(argv.resume).toBe('latest');
530
- }
531
- finally {
532
- process.stdin.isTTY = originalIsTTY;
533
- }
534
- });
535
- it('should support comma-separated values for --allowed-tools', async () => {
536
- process.argv = [
537
- 'node',
538
- 'script.js',
539
- '--allowed-tools',
540
- 'read_file,ShellTool(git status)',
541
- ];
542
- const argv = await parseArguments(createTestMergedSettings());
543
- expect(argv.allowedTools).toEqual(['read_file', 'ShellTool(git status)']);
544
- });
545
- it('should support comma-separated values for --allowed-mcp-server-names', async () => {
546
- process.argv = [
547
- 'node',
548
- 'script.js',
549
- '--allowed-mcp-server-names',
550
- 'server1,server2',
551
- ];
552
- const argv = await parseArguments(createTestMergedSettings());
553
- expect(argv.allowedMcpServerNames).toEqual(['server1', 'server2']);
554
- });
555
- it('should support comma-separated values for --extensions', async () => {
556
- process.argv = ['node', 'script.js', '--extensions', 'ext1,ext2'];
557
- const argv = await parseArguments(createTestMergedSettings());
558
- expect(argv.extensions).toEqual(['ext1', 'ext2']);
559
- });
560
- it('should correctly parse positional arguments when flags with arguments are present', async () => {
561
- process.argv = [
562
- 'node',
563
- 'script.js',
564
- '--model',
565
- 'test-model-string',
566
- 'my-positional-arg',
567
- ];
568
- const argv = await parseArguments(createTestMergedSettings());
569
- expect(argv.model).toBe('test-model-string');
570
- expect(argv.query).toBe('my-positional-arg');
571
- });
572
- it('should handle long positional prompts with multiple flags', async () => {
573
- process.argv = [
574
- 'node',
575
- 'script.js',
576
- '-e',
577
- 'none',
578
- '--approval-mode=auto_edit',
579
- '--allowed-tools=ShellTool',
580
- '--allowed-tools=ShellTool(whoami)',
581
- '--allowed-tools=ShellTool(wc)',
582
- 'Use whoami to write a poem in file poem.md about my username in pig latin and use wc to tell me how many lines are in the poem you wrote.',
583
- ];
584
- const argv = await parseArguments(createTestMergedSettings());
585
- expect(argv.extensions).toEqual(['none']);
586
- expect(argv.approvalMode).toBe('auto_edit');
587
- expect(argv.allowedTools).toEqual([
588
- 'ShellTool',
589
- 'ShellTool(whoami)',
590
- 'ShellTool(wc)',
591
- ]);
592
- expect(argv.query).toBe('Use whoami to write a poem in file poem.md about my username in pig latin and use wc to tell me how many lines are in the poem you wrote.');
593
- });
594
- it('should set isCommand to true for mcp command', async () => {
595
- process.argv = ['node', 'script.js', 'mcp', 'list'];
596
- const argv = await parseArguments(createTestMergedSettings());
597
- expect(argv.isCommand).toBe(true);
598
- });
599
- it('should set isCommand to true for extensions command', async () => {
600
- process.argv = ['node', 'script.js', 'extensions', 'list'];
601
- // Extensions command uses experimental settings
602
- const settings = createTestMergedSettings({
603
- experimental: { extensionManagement: true },
604
- });
605
- const argv = await parseArguments(settings);
606
- expect(argv.isCommand).toBe(true);
607
- });
608
- it('should set isCommand to true for skills command', async () => {
609
- process.argv = ['node', 'script.js', 'skills', 'list'];
610
- // Skills command enabled by default or via experimental
611
- const settings = createTestMergedSettings({
612
- skills: { enabled: true },
613
- });
614
- const argv = await parseArguments(settings);
615
- expect(argv.isCommand).toBe(true);
616
- });
617
- it('should set isCommand to true for hooks command', async () => {
618
- process.argv = ['node', 'script.js', 'hooks', 'migrate'];
619
- // Hooks command enabled via hooksConfig settings
620
- const settings = createTestMergedSettings({
621
- hooksConfig: { enabled: true },
622
- });
623
- const argv = await parseArguments(settings);
624
- expect(argv.isCommand).toBe(true);
625
- });
626
- it('should set isCommand to true for gemma command', async () => {
627
- process.argv = ['node', 'script.js', 'gemma', 'status'];
628
- const argv = await parseArguments(createTestMergedSettings());
629
- expect(argv.isCommand).toBe(true);
630
- });
631
- });
632
- describe('loadCliConfig', () => {
633
- beforeEach(() => {
634
- vi.resetAllMocks();
635
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
636
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
637
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
638
- });
639
- afterEach(() => {
640
- vi.unstubAllEnvs();
641
- vi.restoreAllMocks();
642
- });
643
- describe('Model resolution', () => {
644
- it('should handle multiple --model flags by taking the last one', async () => {
645
- const argv = {
646
- query: undefined,
647
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
648
- model: ['gemini-1.5-pro', 'gemini-2.0-flash'],
649
- sandbox: undefined,
650
- debug: false,
651
- prompt: undefined,
652
- promptInteractive: undefined,
653
- yolo: undefined,
654
- approvalMode: undefined,
655
- policy: undefined,
656
- adminPolicy: undefined,
657
- allowedMcpServerNames: undefined,
658
- allowedTools: undefined,
659
- extensions: undefined,
660
- listExtensions: false,
661
- listSessions: false,
662
- deleteSession: undefined,
663
- screenReader: undefined,
664
- isCommand: false,
665
- rawOutput: false,
666
- acceptRawOutputRisk: false,
667
- startupMessages: [],
668
- resume: undefined,
669
- includeDirectories: [],
670
- useWriteTodos: false,
671
- outputFormat: undefined,
672
- fakeResponses: undefined,
673
- recordResponses: undefined,
674
- skipTrust: false,
675
- };
676
- const settings = createTestMergedSettings();
677
- const config = await loadCliConfig(settings, 'test-session', argv, {
678
- cwd: process.cwd(),
679
- });
680
- expect(config.getModel()).toBe('gemini-2.0-flash');
681
- });
682
- it('should handle non-string model flags by coercing to string', async () => {
683
- const argv = {
684
- query: undefined,
685
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
686
- model: true,
687
- sandbox: undefined,
688
- debug: false,
689
- prompt: undefined,
690
- promptInteractive: undefined,
691
- yolo: undefined,
692
- approvalMode: undefined,
693
- policy: undefined,
694
- adminPolicy: undefined,
695
- allowedMcpServerNames: undefined,
696
- allowedTools: undefined,
697
- extensions: undefined,
698
- listExtensions: false,
699
- listSessions: false,
700
- deleteSession: undefined,
701
- screenReader: undefined,
702
- isCommand: false,
703
- rawOutput: false,
704
- acceptRawOutputRisk: false,
705
- startupMessages: [],
706
- resume: undefined,
707
- includeDirectories: [],
708
- useWriteTodos: false,
709
- outputFormat: undefined,
710
- fakeResponses: undefined,
711
- recordResponses: undefined,
712
- skipTrust: false,
713
- };
714
- const settings = createTestMergedSettings();
715
- const config = await loadCliConfig(settings, 'test-session', argv, {
716
- cwd: process.cwd(),
717
- });
718
- expect(config.getModel()).toBe('true');
719
- });
720
- });
721
- describe('Proxy configuration', () => {
722
- const originalProxyEnv = {};
723
- const proxyEnvVars = [
724
- 'HTTP_PROXY',
725
- 'HTTPS_PROXY',
726
- 'http_proxy',
727
- 'https_proxy',
728
- ];
729
- beforeEach(() => {
730
- for (const key of proxyEnvVars) {
731
- originalProxyEnv[key] = process.env[key];
732
- delete process.env[key];
733
- }
734
- });
735
- afterEach(() => {
736
- for (const key of proxyEnvVars) {
737
- if (originalProxyEnv[key]) {
738
- process.env[key] = originalProxyEnv[key];
739
- }
740
- else {
741
- delete process.env[key];
742
- }
743
- }
744
- });
745
- it(`should leave proxy to empty by default`, async () => {
746
- process.argv = ['node', 'script.js'];
747
- const argv = await parseArguments(createTestMergedSettings());
748
- const settings = createTestMergedSettings();
749
- const config = await loadCliConfig(settings, 'test-session', argv);
750
- expect(config.getProxy()).toBeFalsy();
751
- });
752
- const proxy_url = 'http://localhost:7890';
753
- const testCases = [
754
- {
755
- input: {
756
- env_name: 'https_proxy',
757
- proxy_url,
758
- },
759
- expected: proxy_url,
760
- },
761
- {
762
- input: {
763
- env_name: 'http_proxy',
764
- proxy_url,
765
- },
766
- expected: proxy_url,
767
- },
768
- {
769
- input: {
770
- env_name: 'HTTPS_PROXY',
771
- proxy_url,
772
- },
773
- expected: proxy_url,
774
- },
775
- {
776
- input: {
777
- env_name: 'HTTP_PROXY',
778
- proxy_url,
779
- },
780
- expected: proxy_url,
781
- },
782
- ];
783
- testCases.forEach(({ input, expected }) => {
784
- it(`should set proxy to ${expected} according to environment variable [${input.env_name}]`, async () => {
785
- vi.stubEnv(input.env_name, input.proxy_url);
786
- process.argv = ['node', 'script.js'];
787
- const argv = await parseArguments(createTestMergedSettings());
788
- const settings = createTestMergedSettings();
789
- const config = await loadCliConfig(settings, 'test-session', argv);
790
- expect(config.getProxy()).toBe(expected);
791
- });
792
- });
793
- });
794
- it('should add IDE workspace folders from GEMINI_CLI_IDE_WORKSPACE_PATH to include directories', async () => {
795
- vi.stubEnv('GEMINI_CLI_IDE_WORKSPACE_PATH', ['/project/folderA', '/project/folderB'].join(path.delimiter));
796
- process.argv = ['node', 'script.js'];
797
- const argv = await parseArguments(createTestMergedSettings());
798
- const settings = createTestMergedSettings();
799
- const config = await loadCliConfig(settings, 'test-session', argv);
800
- const dirs = config.getPendingIncludeDirectories();
801
- expect(dirs).toContain('/project/folderA');
802
- expect(dirs).toContain('/project/folderB');
803
- });
804
- it('should skip inaccessible workspace folders from GEMINI_CLI_IDE_WORKSPACE_PATH', async () => {
805
- vi.spyOn(ServerConfig, 'resolveToRealPath').mockImplementation((p) => {
806
- if (p.toString().includes('restricted')) {
807
- const err = new Error('EACCES: permission denied');
808
- err.code = 'EACCES';
809
- throw err;
810
- }
811
- return p.toString();
812
- });
813
- vi.stubEnv('GEMINI_CLI_IDE_WORKSPACE_PATH', ['/project/folderA', '/nonexistent/restricted/folder'].join(path.delimiter));
814
- process.argv = ['node', 'script.js'];
815
- const argv = await parseArguments(createTestMergedSettings());
816
- const settings = createTestMergedSettings();
817
- const config = await loadCliConfig(settings, 'test-session', argv);
818
- const dirs = config.getPendingIncludeDirectories();
819
- expect(dirs).toContain('/project/folderA');
820
- expect(dirs).not.toContain('/nonexistent/restricted/folder');
821
- });
822
- it('should use default fileFilter options when unconfigured', async () => {
823
- process.argv = ['node', 'script.js'];
824
- const argv = await parseArguments(createTestMergedSettings());
825
- const settings = createTestMergedSettings();
826
- const config = await loadCliConfig(settings, 'test-session', argv);
827
- expect(config.getFileFilteringRespectGitIgnore()).toBe(DEFAULT_FILE_FILTERING_OPTIONS.respectGitIgnore);
828
- expect(config.getFileFilteringRespectGeminiIgnore()).toBe(DEFAULT_FILE_FILTERING_OPTIONS.respectGeminiIgnore);
829
- expect(config.getCustomIgnoreFilePaths()).toEqual(DEFAULT_FILE_FILTERING_OPTIONS.customIgnoreFilePaths);
830
- expect(config.getApprovalMode()).toBe(ApprovalMode.DEFAULT);
831
- });
832
- it('should be non-interactive when isCommand is set', async () => {
833
- process.argv = ['node', 'script.js', 'mcp', 'list'];
834
- const argv = await parseArguments(createTestMergedSettings());
835
- argv.isCommand = true; // explicitly set it as if middleware ran (it does in parseArguments but we want to be sure for this isolated test if we were mocking argv)
836
- // reset tty for this test
837
- process.stdin.isTTY = true;
838
- const settings = createTestMergedSettings();
839
- const config = await loadCliConfig(settings, 'test-session', argv);
840
- expect(config.isInteractive()).toBe(false);
841
- });
842
- describe('isAcpMode', () => {
843
- it('should force skipNextSpeakerCheck to true when in ACP mode', async () => {
844
- process.argv = ['node', 'script.js', '--acp'];
845
- const argv = await parseArguments(createTestMergedSettings());
846
- const settings = createTestMergedSettings({
847
- model: { skipNextSpeakerCheck: false },
848
- });
849
- const config = await loadCliConfig(settings, 'test-session', argv);
850
- expect(config.getSkipNextSpeakerCheck()).toBe(true);
851
- });
852
- it('should respect settings.model.skipNextSpeakerCheck when not in ACP mode', async () => {
853
- process.argv = ['node', 'script.js'];
854
- const argv = await parseArguments(createTestMergedSettings());
855
- const settings = createTestMergedSettings({
856
- model: { skipNextSpeakerCheck: false },
857
- });
858
- const config = await loadCliConfig(settings, 'test-session', argv);
859
- expect(config.getSkipNextSpeakerCheck()).toBe(false);
860
- });
861
- });
862
- });
863
- describe('mergeMcpServers', () => {
864
- it('should not modify the original settings object', async () => {
865
- const settings = createTestMergedSettings({
866
- mcpServers: {
867
- 'test-server': {
868
- url: 'http://localhost:8080',
869
- },
870
- },
871
- });
872
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
873
- {
874
- path: '/path/to/ext1',
875
- name: 'ext1',
876
- id: 'ext1-id',
877
- version: '1.0.0',
878
- mcpServers: {
879
- 'ext1-server': {
880
- url: 'http://localhost:8081',
881
- },
882
- },
883
- contextFiles: [],
884
- isActive: true,
885
- },
886
- ]);
887
- const originalSettings = JSON.parse(JSON.stringify(settings));
888
- process.argv = ['node', 'script.js'];
889
- const argv = await parseArguments(createTestMergedSettings());
890
- await loadCliConfig(settings, 'test-session', argv);
891
- expect(settings).toEqual(originalSettings);
892
- });
893
- });
894
- describe('mergeExcludeTools', () => {
895
- const originalIsTTY = process.stdin.isTTY;
896
- beforeEach(() => {
897
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
898
- process.stdin.isTTY = true;
899
- });
900
- afterEach(() => {
901
- process.stdin.isTTY = originalIsTTY;
902
- });
903
- it('should merge excludeTools from settings and extensions', async () => {
904
- const settings = createTestMergedSettings({
905
- tools: { exclude: ['tool1', 'tool2'] },
906
- });
907
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
908
- {
909
- path: '/path/to/ext1',
910
- name: 'ext1',
911
- id: 'ext1-id',
912
- version: '1.0.0',
913
- excludeTools: ['tool3', 'tool4'],
914
- contextFiles: [],
915
- isActive: true,
916
- },
917
- {
918
- path: '/path/to/ext2',
919
- name: 'ext2',
920
- id: 'ext2-id',
921
- version: '1.0.0',
922
- excludeTools: ['tool5'],
923
- contextFiles: [],
924
- isActive: true,
925
- },
926
- ]);
927
- process.argv = ['node', 'script.js'];
928
- const argv = await parseArguments(createTestMergedSettings());
929
- const config = await loadCliConfig(settings, 'test-session', argv);
930
- expect(config.getExcludeTools()).toEqual(new Set(['tool1', 'tool2', 'tool3', 'tool4', 'tool5']));
931
- expect(config.getExcludeTools()).toHaveLength(5);
932
- });
933
- it('should handle overlapping excludeTools between settings and extensions', async () => {
934
- const settings = createTestMergedSettings({
935
- tools: { exclude: ['tool1', 'tool2'] },
936
- });
937
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
938
- {
939
- path: '/path/to/ext1',
940
- name: 'ext1',
941
- id: 'ext1-id',
942
- version: '1.0.0',
943
- excludeTools: ['tool2', 'tool3'],
944
- contextFiles: [],
945
- isActive: true,
946
- },
947
- ]);
948
- process.argv = ['node', 'script.js'];
949
- const argv = await parseArguments(createTestMergedSettings());
950
- const config = await loadCliConfig(settings, 'test-session', argv);
951
- expect(config.getExcludeTools()).toEqual(new Set(['tool1', 'tool2', 'tool3']));
952
- expect(config.getExcludeTools()).toHaveLength(3);
953
- });
954
- it('should handle overlapping excludeTools between extensions', async () => {
955
- const settings = createTestMergedSettings({
956
- tools: { exclude: ['tool1'] },
957
- });
958
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
959
- {
960
- path: '/path/to/ext1',
961
- name: 'ext1',
962
- id: 'ext1-id',
963
- version: '1.0.0',
964
- excludeTools: ['tool2', 'tool3'],
965
- contextFiles: [],
966
- isActive: true,
967
- },
968
- {
969
- path: '/path/to/ext2',
970
- name: 'ext2',
971
- id: 'ext2-id',
972
- version: '1.0.0',
973
- excludeTools: ['tool3', 'tool4'],
974
- contextFiles: [],
975
- isActive: true,
976
- },
977
- ]);
978
- process.argv = ['node', 'script.js'];
979
- const argv = await parseArguments(createTestMergedSettings());
980
- const config = await loadCliConfig(settings, 'test-session', argv);
981
- expect(config.getExcludeTools()).toEqual(new Set(['tool1', 'tool2', 'tool3', 'tool4']));
982
- expect(config.getExcludeTools()).toHaveLength(4);
983
- });
984
- it('should return an empty array when no excludeTools are specified and it is interactive', async () => {
985
- process.stdin.isTTY = true;
986
- const settings = createTestMergedSettings();
987
- process.argv = ['node', 'script.js'];
988
- const argv = await parseArguments(createTestMergedSettings());
989
- const config = await loadCliConfig(settings, 'test-session', argv);
990
- expect(config.getExcludeTools()).toEqual(new Set([]));
991
- });
992
- it('should return default excludes when no excludeTools are specified and it is not interactive', async () => {
993
- process.stdin.isTTY = false;
994
- const settings = createTestMergedSettings();
995
- process.argv = ['node', 'script.js', '-p', 'test'];
996
- const argv = await parseArguments(createTestMergedSettings());
997
- const config = await loadCliConfig(settings, 'test-session', argv);
998
- expect(config.getExcludeTools()).toEqual(new Set([ASK_USER_TOOL_NAME]));
999
- });
1000
- it('should handle settings with excludeTools but no extensions', async () => {
1001
- process.argv = ['node', 'script.js'];
1002
- const argv = await parseArguments(createTestMergedSettings());
1003
- const settings = createTestMergedSettings({
1004
- tools: { exclude: ['tool1', 'tool2'] },
1005
- });
1006
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1007
- const config = await loadCliConfig(settings, 'test-session', argv);
1008
- expect(config.getExcludeTools()).toEqual(new Set(['tool1', 'tool2']));
1009
- expect(config.getExcludeTools()).toHaveLength(2);
1010
- });
1011
- it('should handle extensions with excludeTools but no settings', async () => {
1012
- const settings = createTestMergedSettings();
1013
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
1014
- {
1015
- path: '/path/to/ext',
1016
- name: 'ext1',
1017
- id: 'ext1-id',
1018
- version: '1.0.0',
1019
- excludeTools: ['tool1', 'tool2'],
1020
- contextFiles: [],
1021
- isActive: true,
1022
- },
1023
- ]);
1024
- process.argv = ['node', 'script.js'];
1025
- const argv = await parseArguments(createTestMergedSettings());
1026
- const config = await loadCliConfig(settings, 'test-session', argv);
1027
- expect(config.getExcludeTools()).toEqual(new Set(['tool1', 'tool2']));
1028
- expect(config.getExcludeTools()).toHaveLength(2);
1029
- });
1030
- it('should not modify the original settings object', async () => {
1031
- const settings = createTestMergedSettings({
1032
- tools: { exclude: ['tool1'] },
1033
- });
1034
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
1035
- {
1036
- path: '/path/to/ext',
1037
- name: 'ext1',
1038
- id: 'ext1-id',
1039
- version: '1.0.0',
1040
- excludeTools: ['tool2'],
1041
- contextFiles: [],
1042
- isActive: true,
1043
- },
1044
- ]);
1045
- const originalSettings = JSON.parse(JSON.stringify(settings));
1046
- process.argv = ['node', 'script.js'];
1047
- const argv = await parseArguments(createTestMergedSettings());
1048
- await loadCliConfig(settings, 'test-session', argv);
1049
- expect(settings).toEqual(originalSettings);
1050
- });
1051
- });
1052
- describe('Approval mode tool exclusion logic', () => {
1053
- const originalIsTTY = process.stdin.isTTY;
1054
- beforeEach(() => {
1055
- process.stdin.isTTY = false; // Ensure non-interactive mode
1056
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
1057
- isTrusted: true,
1058
- source: undefined,
1059
- });
1060
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1061
- });
1062
- afterEach(() => {
1063
- process.stdin.isTTY = originalIsTTY;
1064
- });
1065
- it('should exclude all interactive tools in non-interactive mode with default approval mode', async () => {
1066
- process.argv = ['node', 'script.js', '-p', 'test'];
1067
- const argv = await parseArguments(createTestMergedSettings());
1068
- const settings = createTestMergedSettings();
1069
- const config = await loadCliConfig(settings, 'test-session', argv);
1070
- const excludedTools = config.getExcludeTools();
1071
- expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
1072
- expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
1073
- expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME);
1074
- expect(excludedTools).toContain(ASK_USER_TOOL_NAME);
1075
- });
1076
- it('should exclude all interactive tools in non-interactive mode with explicit default approval mode', async () => {
1077
- process.argv = [
1078
- 'node',
1079
- 'script.js',
1080
- '--approval-mode',
1081
- 'default',
1082
- '-p',
1083
- 'test',
1084
- ];
1085
- const argv = await parseArguments(createTestMergedSettings());
1086
- const settings = createTestMergedSettings();
1087
- const config = await loadCliConfig(settings, 'test-session', argv);
1088
- const excludedTools = config.getExcludeTools();
1089
- expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
1090
- expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
1091
- expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME);
1092
- expect(excludedTools).toContain(ASK_USER_TOOL_NAME);
1093
- });
1094
- it('should exclude only shell tools in non-interactive mode with auto_edit approval mode', async () => {
1095
- process.argv = [
1096
- 'node',
1097
- 'script.js',
1098
- '--approval-mode',
1099
- 'auto_edit',
1100
- '-p',
1101
- 'test',
1102
- ];
1103
- const argv = await parseArguments(createTestMergedSettings());
1104
- const settings = createTestMergedSettings();
1105
- const config = await loadCliConfig(settings, 'test-session', argv);
1106
- const excludedTools = config.getExcludeTools();
1107
- expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
1108
- expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
1109
- expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME);
1110
- expect(excludedTools).toContain(ASK_USER_TOOL_NAME);
1111
- });
1112
- it('should exclude only ask_user in non-interactive mode with yolo approval mode', async () => {
1113
- process.argv = [
1114
- 'node',
1115
- 'script.js',
1116
- '--approval-mode',
1117
- 'yolo',
1118
- '-p',
1119
- 'test',
1120
- ];
1121
- const argv = await parseArguments(createTestMergedSettings());
1122
- const settings = createTestMergedSettings();
1123
- const config = await loadCliConfig(settings, 'test-session', argv);
1124
- const excludedTools = config.getExcludeTools();
1125
- expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
1126
- expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
1127
- expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME);
1128
- expect(excludedTools).toContain(ASK_USER_TOOL_NAME);
1129
- });
1130
- it('should exclude all interactive tools in non-interactive mode with plan approval mode', async () => {
1131
- process.argv = [
1132
- 'node',
1133
- 'script.js',
1134
- '--approval-mode',
1135
- 'plan',
1136
- '-p',
1137
- 'test',
1138
- ];
1139
- const settings = createTestMergedSettings({
1140
- general: {
1141
- plan: { enabled: true },
1142
- },
1143
- });
1144
- const argv = await parseArguments(createTestMergedSettings());
1145
- const config = await loadCliConfig(settings, 'test-session', argv);
1146
- const excludedTools = config.getExcludeTools();
1147
- expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
1148
- expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
1149
- expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME);
1150
- expect(excludedTools).toContain(ASK_USER_TOOL_NAME);
1151
- });
1152
- it('should exclude only ask_user in non-interactive mode with legacy yolo flag', async () => {
1153
- process.argv = ['node', 'script.js', '--yolo', '-p', 'test'];
1154
- const argv = await parseArguments(createTestMergedSettings());
1155
- const settings = createTestMergedSettings();
1156
- const config = await loadCliConfig(settings, 'test-session', argv);
1157
- const excludedTools = config.getExcludeTools();
1158
- expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
1159
- expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
1160
- expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME);
1161
- expect(excludedTools).toContain(ASK_USER_TOOL_NAME);
1162
- });
1163
- it('should not exclude interactive tools in interactive mode regardless of approval mode', async () => {
1164
- process.stdin.isTTY = true; // Interactive mode
1165
- const testCases = [
1166
- { args: ['node', 'script.js'] }, // default
1167
- { args: ['node', 'script.js', '--approval-mode', 'default'] },
1168
- { args: ['node', 'script.js', '--approval-mode', 'auto_edit'] },
1169
- { args: ['node', 'script.js', '--approval-mode', 'yolo'] },
1170
- { args: ['node', 'script.js', '--yolo'] },
1171
- ];
1172
- for (const testCase of testCases) {
1173
- process.argv = testCase.args;
1174
- const argv = await parseArguments(createTestMergedSettings());
1175
- const settings = createTestMergedSettings();
1176
- const config = await loadCliConfig(settings, 'test-session', argv);
1177
- const excludedTools = config.getExcludeTools();
1178
- expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
1179
- expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
1180
- expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME);
1181
- expect(excludedTools).not.toContain(ASK_USER_TOOL_NAME);
1182
- }
1183
- });
1184
- it('should merge approval mode exclusions with settings exclusions in auto_edit mode', async () => {
1185
- process.argv = [
1186
- 'node',
1187
- 'script.js',
1188
- '--approval-mode',
1189
- 'auto_edit',
1190
- '-p',
1191
- 'test',
1192
- ];
1193
- const argv = await parseArguments(createTestMergedSettings());
1194
- const settings = createTestMergedSettings({
1195
- tools: { exclude: ['custom_tool'] },
1196
- });
1197
- const config = await loadCliConfig(settings, 'test-session', argv);
1198
- const excludedTools = config.getExcludeTools();
1199
- expect(excludedTools).toContain('custom_tool'); // From settings
1200
- expect(excludedTools).not.toContain(SHELL_TOOL_NAME); // No longer from approval mode
1201
- expect(excludedTools).not.toContain(EDIT_TOOL_NAME); // Should be allowed in auto_edit
1202
- expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME); // Should be allowed in auto_edit
1203
- expect(excludedTools).toContain(ASK_USER_TOOL_NAME);
1204
- });
1205
- it('should throw an error if YOLO mode is attempted when disableYoloMode is true', async () => {
1206
- process.argv = ['node', 'script.js', '--yolo'];
1207
- const argv = await parseArguments(createTestMergedSettings());
1208
- const settings = createTestMergedSettings({
1209
- security: {
1210
- disableYoloMode: true,
1211
- },
1212
- });
1213
- await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow('YOLO mode is disabled by your administrator. To enable it, please request an update to the settings at: https://goo.gle/manage-gemini-cli');
1214
- });
1215
- it('should throw an error for invalid approval mode values in loadCliConfig', async () => {
1216
- // Create a mock argv with an invalid approval mode that bypasses argument parsing validation
1217
- const invalidArgv = {
1218
- approvalMode: 'invalid_mode',
1219
- promptInteractive: '',
1220
- prompt: '',
1221
- yolo: false,
1222
- };
1223
- const settings = createTestMergedSettings();
1224
- await expect(loadCliConfig(settings, 'test-session', invalidArgv)).rejects.toThrow('Invalid approval mode: invalid_mode. Valid values are: yolo, auto_edit, plan, default');
1225
- });
1226
- it('should fall back to default approval mode if plan mode is requested but not enabled', async () => {
1227
- process.argv = ['node', 'script.js'];
1228
- const settings = createTestMergedSettings({
1229
- general: {
1230
- defaultApprovalMode: 'plan',
1231
- plan: { enabled: false },
1232
- },
1233
- });
1234
- const argv = await parseArguments(settings);
1235
- const config = await loadCliConfig(settings, 'test-session', argv);
1236
- expect(config.getApprovalMode()).toBe(ApprovalMode.DEFAULT);
1237
- });
1238
- it('should allow plan approval mode if plan is enabled', async () => {
1239
- process.argv = ['node', 'script.js'];
1240
- const settings = createTestMergedSettings({
1241
- general: {
1242
- defaultApprovalMode: 'plan',
1243
- plan: { enabled: true },
1244
- },
1245
- });
1246
- const argv = await parseArguments(settings);
1247
- const config = await loadCliConfig(settings, 'test-session', argv);
1248
- expect(config.getApprovalMode()).toBe(ApprovalMode.PLAN);
1249
- });
1250
- });
1251
- describe('loadCliConfig with allowed-mcp-server-names', () => {
1252
- beforeEach(() => {
1253
- vi.resetAllMocks();
1254
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
1255
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
1256
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1257
- });
1258
- afterEach(() => {
1259
- vi.unstubAllEnvs();
1260
- vi.restoreAllMocks();
1261
- });
1262
- const baseSettings = createTestMergedSettings({
1263
- mcpServers: {
1264
- server1: { url: 'http://localhost:8080' },
1265
- server2: { url: 'http://localhost:8081' },
1266
- server3: { url: 'http://localhost:8082' },
1267
- },
1268
- });
1269
- it('should allow all MCP servers if the flag is not provided', async () => {
1270
- process.argv = ['node', 'script.js'];
1271
- const argv = await parseArguments(createTestMergedSettings());
1272
- const config = await loadCliConfig(baseSettings, 'test-session', argv);
1273
- expect(config.getMcpServers()).toEqual(baseSettings.mcpServers);
1274
- });
1275
- it('should allow only the specified MCP server', async () => {
1276
- process.argv = [
1277
- 'node',
1278
- 'script.js',
1279
- '--allowed-mcp-server-names',
1280
- 'server1',
1281
- ];
1282
- const argv = await parseArguments(createTestMergedSettings());
1283
- const config = await loadCliConfig(baseSettings, 'test-session', argv);
1284
- expect(config.getAllowedMcpServers()).toEqual(['server1']);
1285
- });
1286
- it('should allow multiple specified MCP servers', async () => {
1287
- process.argv = [
1288
- 'node',
1289
- 'script.js',
1290
- '--allowed-mcp-server-names',
1291
- 'server1',
1292
- '--allowed-mcp-server-names',
1293
- 'server3',
1294
- ];
1295
- const argv = await parseArguments(createTestMergedSettings());
1296
- const config = await loadCliConfig(baseSettings, 'test-session', argv);
1297
- expect(config.getAllowedMcpServers()).toEqual(['server1', 'server3']);
1298
- });
1299
- it('should handle server names that do not exist', async () => {
1300
- process.argv = [
1301
- 'node',
1302
- 'script.js',
1303
- '--allowed-mcp-server-names',
1304
- 'server1',
1305
- '--allowed-mcp-server-names',
1306
- 'server4',
1307
- ];
1308
- const argv = await parseArguments(createTestMergedSettings());
1309
- const config = await loadCliConfig(baseSettings, 'test-session', argv);
1310
- expect(config.getAllowedMcpServers()).toEqual(['server1', 'server4']);
1311
- });
1312
- it('should allow no MCP servers if the flag is provided but empty', async () => {
1313
- process.argv = ['node', 'script.js', '--allowed-mcp-server-names', ''];
1314
- const argv = await parseArguments(createTestMergedSettings());
1315
- const config = await loadCliConfig(baseSettings, 'test-session', argv);
1316
- expect(config.getAllowedMcpServers()).toEqual(['']);
1317
- });
1318
- it('should read allowMCPServers from settings', async () => {
1319
- process.argv = ['node', 'script.js'];
1320
- const argv = await parseArguments(createTestMergedSettings());
1321
- const settings = createTestMergedSettings({
1322
- ...baseSettings,
1323
- mcp: { allowed: ['server1', 'server2'] },
1324
- });
1325
- const config = await loadCliConfig(settings, 'test-session', argv);
1326
- expect(config.getAllowedMcpServers()).toEqual(['server1', 'server2']);
1327
- });
1328
- it('should read excludeMCPServers from settings', async () => {
1329
- process.argv = ['node', 'script.js'];
1330
- const argv = await parseArguments(createTestMergedSettings());
1331
- const settings = createTestMergedSettings({
1332
- ...baseSettings,
1333
- mcp: { excluded: ['server1', 'server2'] },
1334
- });
1335
- const config = await loadCliConfig(settings, 'test-session', argv);
1336
- expect(config.getBlockedMcpServers()).toEqual(['server1', 'server2']);
1337
- });
1338
- it('should override allowMCPServers with excludeMCPServers if overlapping', async () => {
1339
- process.argv = ['node', 'script.js'];
1340
- const argv = await parseArguments(createTestMergedSettings());
1341
- const settings = createTestMergedSettings({
1342
- ...baseSettings,
1343
- mcp: {
1344
- excluded: ['server1'],
1345
- allowed: ['server1', 'server2'],
1346
- },
1347
- });
1348
- const config = await loadCliConfig(settings, 'test-session', argv);
1349
- expect(config.getAllowedMcpServers()).toEqual(['server1', 'server2']);
1350
- expect(config.getBlockedMcpServers()).toEqual(['server1']);
1351
- });
1352
- it('should prioritize mcp server flag if set', async () => {
1353
- process.argv = [
1354
- 'node',
1355
- 'script.js',
1356
- '--allowed-mcp-server-names',
1357
- 'server1',
1358
- ];
1359
- const argv = await parseArguments(createTestMergedSettings());
1360
- const settings = createTestMergedSettings({
1361
- ...baseSettings,
1362
- mcp: {
1363
- excluded: ['server1'],
1364
- allowed: ['server2'],
1365
- },
1366
- });
1367
- const config = await loadCliConfig(settings, 'test-session', argv);
1368
- expect(config.getAllowedMcpServers()).toEqual(['server1']);
1369
- });
1370
- it('should prioritize CLI flag over both allowed and excluded settings', async () => {
1371
- process.argv = [
1372
- 'node',
1373
- 'script.js',
1374
- '--allowed-mcp-server-names',
1375
- 'server2',
1376
- '--allowed-mcp-server-names',
1377
- 'server3',
1378
- ];
1379
- const argv = await parseArguments(createTestMergedSettings());
1380
- const settings = createTestMergedSettings({
1381
- ...baseSettings,
1382
- mcp: {
1383
- allowed: ['server1', 'server2'], // Should be ignored
1384
- excluded: ['server3'], // Should be ignored
1385
- },
1386
- });
1387
- const config = await loadCliConfig(settings, 'test-session', argv);
1388
- expect(config.getAllowedMcpServers()).toEqual(['server2', 'server3']);
1389
- expect(config.getBlockedMcpServers()).toEqual([]);
1390
- });
1391
- });
1392
- describe('loadCliConfig with admin.mcp.config', () => {
1393
- beforeEach(() => {
1394
- vi.resetAllMocks();
1395
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
1396
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
1397
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1398
- });
1399
- afterEach(() => {
1400
- vi.unstubAllEnvs();
1401
- vi.restoreAllMocks();
1402
- });
1403
- const localMcpServers = {
1404
- serverA: {
1405
- command: 'npx',
1406
- args: ['-y', '@mcp/server-a'],
1407
- env: { KEY: 'VALUE' },
1408
- cwd: '/local/cwd',
1409
- trust: false,
1410
- },
1411
- serverB: {
1412
- command: 'npx',
1413
- args: ['-y', '@mcp/server-b'],
1414
- trust: false,
1415
- },
1416
- };
1417
- const baseSettings = createTestMergedSettings({
1418
- mcp: { serverCommand: 'npx -y @mcp/default-server' },
1419
- mcpServers: localMcpServers,
1420
- });
1421
- it('should use local configuration if admin allowlist is empty', async () => {
1422
- process.argv = ['node', 'script.js'];
1423
- const argv = await parseArguments(createTestMergedSettings());
1424
- const settings = createTestMergedSettings({
1425
- mcp: baseSettings.mcp,
1426
- mcpServers: localMcpServers,
1427
- admin: {
1428
- ...baseSettings.admin,
1429
- mcp: { enabled: true, config: {} },
1430
- },
1431
- });
1432
- const config = await loadCliConfig(settings, 'test-session', argv);
1433
- expect(config.getMcpServers()).toEqual(localMcpServers);
1434
- expect(config.getMcpServerCommand()).toBe('npx -y @mcp/default-server');
1435
- });
1436
- it('should ignore locally configured servers not present in the allowlist', async () => {
1437
- process.argv = ['node', 'script.js'];
1438
- const argv = await parseArguments(createTestMergedSettings());
1439
- const adminAllowlist = {
1440
- serverA: {
1441
- type: 'sse',
1442
- url: 'https://admin-server-a.com/sse',
1443
- trust: true,
1444
- },
1445
- };
1446
- const settings = createTestMergedSettings({
1447
- mcp: baseSettings.mcp,
1448
- mcpServers: localMcpServers,
1449
- admin: {
1450
- ...baseSettings.admin,
1451
- mcp: { enabled: true, config: adminAllowlist },
1452
- },
1453
- });
1454
- const config = await loadCliConfig(settings, 'test-session', argv);
1455
- const mergedServers = config.getMcpServers() ?? {};
1456
- expect(mergedServers).toHaveProperty('serverA');
1457
- expect(mergedServers).not.toHaveProperty('serverB');
1458
- });
1459
- it('should clear command, args, env, and cwd for present servers', async () => {
1460
- process.argv = ['node', 'script.js'];
1461
- const argv = await parseArguments(createTestMergedSettings());
1462
- const adminAllowlist = {
1463
- serverA: {
1464
- type: 'sse',
1465
- url: 'https://admin-server-a.com/sse',
1466
- trust: true,
1467
- },
1468
- };
1469
- const settings = createTestMergedSettings({
1470
- mcpServers: localMcpServers,
1471
- admin: {
1472
- ...baseSettings.admin,
1473
- mcp: { enabled: true, config: adminAllowlist },
1474
- },
1475
- });
1476
- const config = await loadCliConfig(settings, 'test-session', argv);
1477
- const serverA = config.getMcpServers()?.['serverA'];
1478
- expect(serverA).toEqual({
1479
- // eslint-disable-next-line @typescript-eslint/no-misused-spread
1480
- ...localMcpServers['serverA'],
1481
- type: 'sse',
1482
- url: 'https://admin-server-a.com/sse',
1483
- trust: true,
1484
- command: undefined,
1485
- args: undefined,
1486
- env: undefined,
1487
- cwd: undefined,
1488
- httpUrl: undefined,
1489
- tcp: undefined,
1490
- });
1491
- });
1492
- it('should not initialize a server if it is in allowlist but missing locally', async () => {
1493
- process.argv = ['node', 'script.js'];
1494
- const argv = await parseArguments(createTestMergedSettings());
1495
- const adminAllowlist = {
1496
- serverC: {
1497
- type: 'sse',
1498
- url: 'https://admin-server-c.com/sse',
1499
- trust: true,
1500
- },
1501
- };
1502
- const settings = createTestMergedSettings({
1503
- mcpServers: localMcpServers,
1504
- admin: {
1505
- ...baseSettings.admin,
1506
- mcp: { enabled: true, config: adminAllowlist },
1507
- },
1508
- });
1509
- const config = await loadCliConfig(settings, 'test-session', argv);
1510
- const mergedServers = config.getMcpServers() ?? {};
1511
- expect(mergedServers).not.toHaveProperty('serverC');
1512
- expect(Object.keys(mergedServers)).toHaveLength(0);
1513
- });
1514
- it('should merge local fields and prefer admin tool filters', async () => {
1515
- process.argv = ['node', 'script.js'];
1516
- const argv = await parseArguments(createTestMergedSettings());
1517
- const adminAllowlist = {
1518
- serverA: {
1519
- type: 'sse',
1520
- url: 'https://admin-server-a.com/sse',
1521
- trust: true,
1522
- includeTools: ['admin_tool'],
1523
- },
1524
- };
1525
- const localMcpServersWithTools = {
1526
- serverA: {
1527
- // eslint-disable-next-line @typescript-eslint/no-misused-spread
1528
- ...localMcpServers['serverA'],
1529
- includeTools: ['local_tool'],
1530
- timeout: 1234,
1531
- },
1532
- };
1533
- const settings = createTestMergedSettings({
1534
- mcpServers: localMcpServersWithTools,
1535
- admin: {
1536
- ...baseSettings.admin,
1537
- mcp: { enabled: true, config: adminAllowlist },
1538
- },
1539
- });
1540
- const config = await loadCliConfig(settings, 'test-session', argv);
1541
- const serverA = (config.getMcpServers() ?? {})['serverA'];
1542
- expect(serverA).toMatchObject({
1543
- timeout: 1234,
1544
- includeTools: ['admin_tool'],
1545
- type: 'sse',
1546
- url: 'https://admin-server-a.com/sse',
1547
- trust: true,
1548
- });
1549
- expect(serverA).not.toHaveProperty('command');
1550
- expect(serverA).not.toHaveProperty('args');
1551
- expect(serverA).not.toHaveProperty('env');
1552
- expect(serverA).not.toHaveProperty('cwd');
1553
- expect(serverA).not.toHaveProperty('httpUrl');
1554
- expect(serverA).not.toHaveProperty('tcp');
1555
- });
1556
- it('should use local tool filters when admin does not define them', async () => {
1557
- process.argv = ['node', 'script.js'];
1558
- const argv = await parseArguments(createTestMergedSettings());
1559
- const adminAllowlist = {
1560
- serverA: {
1561
- type: 'sse',
1562
- url: 'https://admin-server-a.com/sse',
1563
- trust: true,
1564
- },
1565
- };
1566
- const localMcpServersWithTools = {
1567
- serverA: {
1568
- // eslint-disable-next-line @typescript-eslint/no-misused-spread
1569
- ...localMcpServers['serverA'],
1570
- includeTools: ['local_tool'],
1571
- },
1572
- };
1573
- const settings = createTestMergedSettings({
1574
- mcpServers: localMcpServersWithTools,
1575
- admin: {
1576
- ...baseSettings.admin,
1577
- mcp: { enabled: true, config: adminAllowlist },
1578
- },
1579
- });
1580
- const config = await loadCliConfig(settings, 'test-session', argv);
1581
- const serverA = config.getMcpServers()?.['serverA'];
1582
- expect(serverA?.includeTools).toEqual(['local_tool']);
1583
- });
1584
- });
1585
- describe('loadCliConfig model selection', () => {
1586
- beforeEach(() => {
1587
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1588
- });
1589
- afterEach(() => {
1590
- vi.resetAllMocks();
1591
- });
1592
- it('selects a model from settings.json if provided', async () => {
1593
- process.argv = ['node', 'script.js'];
1594
- const argv = await parseArguments(createTestMergedSettings());
1595
- const config = await loadCliConfig(createTestMergedSettings({
1596
- model: {
1597
- name: 'gemini-2.5-pro',
1598
- },
1599
- }), 'test-session', argv);
1600
- expect(config.getModel()).toBe('gemini-2.5-pro');
1601
- });
1602
- it('uses the default gemini model if nothing is set', async () => {
1603
- process.argv = ['node', 'script.js']; // No model set.
1604
- const argv = await parseArguments(createTestMergedSettings());
1605
- const config = await loadCliConfig(createTestMergedSettings({
1606
- // No model set.
1607
- }), 'test-session', argv);
1608
- expect(config.getModel()).toBe('auto');
1609
- });
1610
- it('always prefers model from argv', async () => {
1611
- process.argv = ['node', 'script.js', '--model', 'gemini-2.5-flash-preview'];
1612
- const argv = await parseArguments(createTestMergedSettings());
1613
- const config = await loadCliConfig(createTestMergedSettings({
1614
- model: {
1615
- name: 'gemini-2.5-pro',
1616
- },
1617
- }), 'test-session', argv);
1618
- expect(config.getModel()).toBe('gemini-2.5-flash-preview');
1619
- });
1620
- it('selects the model from argv if provided', async () => {
1621
- process.argv = ['node', 'script.js', '--model', 'gemini-2.5-flash-preview'];
1622
- const argv = await parseArguments(createTestMergedSettings());
1623
- const config = await loadCliConfig(createTestMergedSettings({
1624
- // No model provided via settings.
1625
- }), 'test-session', argv);
1626
- expect(config.getModel()).toBe('gemini-2.5-flash-preview');
1627
- });
1628
- it('selects the default auto model if provided via auto alias', async () => {
1629
- process.argv = ['node', 'script.js', '--model', 'auto'];
1630
- const argv = await parseArguments(createTestMergedSettings());
1631
- const config = await loadCliConfig(createTestMergedSettings({
1632
- // No model provided via settings.
1633
- }), 'test-session', argv);
1634
- expect(config.getModel()).toBe('auto');
1635
- });
1636
- });
1637
- describe('loadCliConfig folderTrust', () => {
1638
- let originalVitest;
1639
- let originalIntegrationTest;
1640
- beforeEach(() => {
1641
- vi.resetAllMocks();
1642
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
1643
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
1644
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1645
- originalVitest = process.env['VITEST'];
1646
- originalIntegrationTest = process.env['GEMINI_CLI_INTEGRATION_TEST'];
1647
- delete process.env['VITEST'];
1648
- delete process.env['GEMINI_CLI_INTEGRATION_TEST'];
1649
- });
1650
- afterEach(() => {
1651
- if (originalVitest !== undefined) {
1652
- process.env['VITEST'] = originalVitest;
1653
- }
1654
- if (originalIntegrationTest !== undefined) {
1655
- process.env['GEMINI_CLI_INTEGRATION_TEST'] = originalIntegrationTest;
1656
- }
1657
- vi.unstubAllEnvs();
1658
- vi.restoreAllMocks();
1659
- });
1660
- it('should be false when folderTrust is false', async () => {
1661
- process.argv = ['node', 'script.js'];
1662
- const settings = createTestMergedSettings({
1663
- security: {
1664
- folderTrust: {
1665
- enabled: false,
1666
- },
1667
- },
1668
- });
1669
- const argv = await parseArguments(createTestMergedSettings());
1670
- const config = await loadCliConfig(settings, 'test-session', argv);
1671
- expect(config.getFolderTrust()).toBe(false);
1672
- });
1673
- it('should be true when folderTrust is true', async () => {
1674
- process.argv = ['node', 'script.js'];
1675
- const argv = await parseArguments(createTestMergedSettings());
1676
- const settings = createTestMergedSettings({
1677
- security: {
1678
- folderTrust: {
1679
- enabled: true,
1680
- },
1681
- },
1682
- });
1683
- const config = await loadCliConfig(settings, 'test-session', argv);
1684
- expect(config.getFolderTrust()).toBe(true);
1685
- });
1686
- it('should be true by default', async () => {
1687
- process.argv = ['node', 'script.js'];
1688
- const argv = await parseArguments(createTestMergedSettings());
1689
- const settings = createTestMergedSettings();
1690
- const config = await loadCliConfig(settings, 'test-session', argv);
1691
- expect(config.getFolderTrust()).toBe(true);
1692
- });
1693
- });
1694
- describe('loadCliConfig with includeDirectories', () => {
1695
- beforeEach(() => {
1696
- vi.resetAllMocks();
1697
- vi.mocked(os.homedir).mockReturnValue(path.resolve(path.sep, 'mock', 'home', 'user'));
1698
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
1699
- vi.spyOn(process, 'cwd').mockReturnValue(path.resolve(path.sep, 'home', 'user', 'project'));
1700
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1701
- });
1702
- afterEach(() => {
1703
- vi.restoreAllMocks();
1704
- });
1705
- it.skip('should combine and resolve paths from settings and CLI arguments', async () => {
1706
- const mockCwd = path.resolve(path.sep, 'home', 'user', 'project');
1707
- process.argv = [
1708
- 'node',
1709
- 'script.js',
1710
- '--include-directories',
1711
- `${path.resolve(path.sep, 'cli', 'path1')},${path.join(mockCwd, 'cli', 'path2')}`,
1712
- ];
1713
- const argv = await parseArguments(createTestMergedSettings());
1714
- const settings = createTestMergedSettings({
1715
- context: {
1716
- includeDirectories: [
1717
- path.resolve(path.sep, 'settings', 'path1'),
1718
- path.join(os.homedir(), 'settings', 'path2'),
1719
- path.join(mockCwd, 'settings', 'path3'),
1720
- ],
1721
- },
1722
- });
1723
- const config = await loadCliConfig(settings, 'test-session', argv);
1724
- const expected = [
1725
- mockCwd,
1726
- path.resolve(path.sep, 'cli', 'path1'),
1727
- path.join(mockCwd, 'cli', 'path2'),
1728
- path.resolve(path.sep, 'settings', 'path1'),
1729
- path.join(os.homedir(), 'settings', 'path2'),
1730
- path.join(mockCwd, 'settings', 'path3'),
1731
- ];
1732
- const directories = config.getWorkspaceContext().getDirectories();
1733
- expect(directories).toEqual([mockCwd]);
1734
- expect(config.getPendingIncludeDirectories()).toEqual(expect.arrayContaining(expected.filter((dir) => dir !== mockCwd)));
1735
- expect(config.getPendingIncludeDirectories()).toHaveLength(expected.length - 1);
1736
- });
1737
- });
1738
- describe('loadCliConfig compressionThreshold', () => {
1739
- beforeEach(() => {
1740
- vi.resetAllMocks();
1741
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
1742
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
1743
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1744
- });
1745
- afterEach(() => {
1746
- vi.unstubAllEnvs();
1747
- vi.restoreAllMocks();
1748
- });
1749
- it('should pass settings to the core config', async () => {
1750
- process.argv = ['node', 'script.js'];
1751
- const argv = await parseArguments(createTestMergedSettings());
1752
- const settings = createTestMergedSettings({
1753
- model: {
1754
- compressionThreshold: 0.5,
1755
- },
1756
- });
1757
- const config = await loadCliConfig(settings, 'test-session', argv);
1758
- expect(await config.getCompressionThreshold()).toBe(0.5);
1759
- });
1760
- it('should have default compressionThreshold if not in settings', async () => {
1761
- process.argv = ['node', 'script.js'];
1762
- const argv = await parseArguments(createTestMergedSettings());
1763
- const settings = createTestMergedSettings();
1764
- const config = await loadCliConfig(settings, 'test-session', argv);
1765
- expect(await config.getCompressionThreshold()).toBe(0.5);
1766
- });
1767
- });
1768
- describe('loadCliConfig useRipgrep', () => {
1769
- beforeEach(() => {
1770
- vi.resetAllMocks();
1771
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
1772
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
1773
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1774
- });
1775
- afterEach(() => {
1776
- vi.unstubAllEnvs();
1777
- vi.restoreAllMocks();
1778
- });
1779
- it('should be true by default when useRipgrep is not set in settings', async () => {
1780
- process.argv = ['node', 'script.js'];
1781
- const argv = await parseArguments(createTestMergedSettings());
1782
- const settings = createTestMergedSettings();
1783
- const config = await loadCliConfig(settings, 'test-session', argv);
1784
- expect(config.getUseRipgrep()).toBe(true);
1785
- });
1786
- it('should be false when useRipgrep is set to false in settings', async () => {
1787
- process.argv = ['node', 'script.js'];
1788
- const argv = await parseArguments(createTestMergedSettings());
1789
- const settings = createTestMergedSettings({ tools: { useRipgrep: false } });
1790
- const config = await loadCliConfig(settings, 'test-session', argv);
1791
- expect(config.getUseRipgrep()).toBe(false);
1792
- });
1793
- it('should be true when useRipgrep is explicitly set to true in settings', async () => {
1794
- process.argv = ['node', 'script.js'];
1795
- const argv = await parseArguments(createTestMergedSettings());
1796
- const settings = createTestMergedSettings({ tools: { useRipgrep: true } });
1797
- const config = await loadCliConfig(settings, 'test-session', argv);
1798
- expect(config.getUseRipgrep()).toBe(true);
1799
- });
1800
- });
1801
- describe('loadCliConfig directWebFetch', () => {
1802
- beforeEach(() => {
1803
- vi.resetAllMocks();
1804
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
1805
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
1806
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1807
- });
1808
- afterEach(() => {
1809
- vi.unstubAllEnvs();
1810
- vi.restoreAllMocks();
1811
- });
1812
- it('should be false by default when directWebFetch is not set in settings', async () => {
1813
- process.argv = ['node', 'script.js'];
1814
- const argv = await parseArguments(createTestMergedSettings());
1815
- const settings = createTestMergedSettings();
1816
- const config = await loadCliConfig(settings, 'test-session', argv);
1817
- expect(config.getDirectWebFetch()).toBe(false);
1818
- });
1819
- it('should be true when directWebFetch is set to true in settings', async () => {
1820
- process.argv = ['node', 'script.js'];
1821
- const argv = await parseArguments(createTestMergedSettings());
1822
- const settings = createTestMergedSettings({
1823
- experimental: {
1824
- directWebFetch: true,
1825
- },
1826
- });
1827
- const config = await loadCliConfig(settings, 'test-session', argv);
1828
- expect(config.getDirectWebFetch()).toBe(true);
1829
- });
1830
- });
1831
- describe('loadCliConfig context management', () => {
1832
- beforeEach(() => {
1833
- vi.resetAllMocks();
1834
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
1835
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
1836
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1837
- });
1838
- afterEach(() => {
1839
- vi.unstubAllEnvs();
1840
- vi.restoreAllMocks();
1841
- });
1842
- it('should be false by default when generalistProfile / context management is not set in settings', async () => {
1843
- process.argv = ['node', 'script.js'];
1844
- const argv = await parseArguments(createTestMergedSettings());
1845
- const settings = createTestMergedSettings();
1846
- const config = await loadCliConfig(settings, 'test-session', argv);
1847
- expect(config.getContextManagementConfig()).haveOwnProperty('enabled', false);
1848
- expect(config.isContextManagementEnabled()).toBe(false);
1849
- });
1850
- it('should be true when generalistProfile is set to true in settings', async () => {
1851
- process.argv = ['node', 'script.js'];
1852
- const argv = await parseArguments(createTestMergedSettings());
1853
- const settings = createTestMergedSettings({
1854
- experimental: {
1855
- generalistProfile: true,
1856
- },
1857
- });
1858
- const config = await loadCliConfig(settings, 'test-session', argv);
1859
- expect(config.isContextManagementEnabled()).toBe(true);
1860
- });
1861
- });
1862
- describe('screenReader configuration', () => {
1863
- beforeEach(() => {
1864
- vi.resetAllMocks();
1865
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
1866
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
1867
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1868
- });
1869
- afterEach(() => {
1870
- vi.unstubAllEnvs();
1871
- vi.restoreAllMocks();
1872
- });
1873
- it('should use screenReader value from settings if CLI flag is not present (settings true)', async () => {
1874
- process.argv = ['node', 'script.js'];
1875
- const argv = await parseArguments(createTestMergedSettings());
1876
- const settings = createTestMergedSettings({
1877
- ui: { accessibility: { screenReader: true } },
1878
- });
1879
- const config = await loadCliConfig(settings, 'test-session', argv);
1880
- expect(config.getScreenReader()).toBe(true);
1881
- });
1882
- it('should use screenReader value from settings if CLI flag is not present (settings false)', async () => {
1883
- process.argv = ['node', 'script.js'];
1884
- const argv = await parseArguments(createTestMergedSettings());
1885
- const settings = createTestMergedSettings({
1886
- ui: { accessibility: { screenReader: false } },
1887
- });
1888
- const config = await loadCliConfig(settings, 'test-session', argv);
1889
- expect(config.getScreenReader()).toBe(false);
1890
- });
1891
- it('should prioritize --screen-reader CLI flag (true) over settings (false)', async () => {
1892
- process.argv = ['node', 'script.js', '--screen-reader'];
1893
- const argv = await parseArguments(createTestMergedSettings());
1894
- const settings = createTestMergedSettings({
1895
- ui: { accessibility: { screenReader: false } },
1896
- });
1897
- const config = await loadCliConfig(settings, 'test-session', argv);
1898
- expect(config.getScreenReader()).toBe(true);
1899
- });
1900
- it('should be false by default when no flag or setting is present', async () => {
1901
- process.argv = ['node', 'script.js'];
1902
- const argv = await parseArguments(createTestMergedSettings());
1903
- const settings = createTestMergedSettings();
1904
- const config = await loadCliConfig(settings, 'test-session', argv);
1905
- expect(config.getScreenReader()).toBe(false);
1906
- });
1907
- });
1908
- describe('loadCliConfig tool exclusions', () => {
1909
- const originalIsTTY = process.stdin.isTTY;
1910
- beforeEach(() => {
1911
- vi.resetAllMocks();
1912
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
1913
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
1914
- process.stdin.isTTY = true;
1915
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
1916
- isTrusted: true,
1917
- source: undefined,
1918
- });
1919
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1920
- });
1921
- afterEach(() => {
1922
- process.stdin.isTTY = originalIsTTY;
1923
- vi.unstubAllEnvs();
1924
- vi.restoreAllMocks();
1925
- });
1926
- it('should not exclude interactive tools in interactive mode without YOLO', async () => {
1927
- process.stdin.isTTY = true;
1928
- process.argv = ['node', 'script.js'];
1929
- const argv = await parseArguments(createTestMergedSettings());
1930
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
1931
- expect(config.getExcludeTools()).not.toContain('run_shell_command');
1932
- expect(config.getExcludeTools()).not.toContain('replace');
1933
- expect(config.getExcludeTools()).not.toContain('write_file');
1934
- expect(config.getExcludeTools()).not.toContain('ask_user');
1935
- });
1936
- it('should not exclude interactive tools in interactive mode with YOLO', async () => {
1937
- process.stdin.isTTY = true;
1938
- process.argv = ['node', 'script.js', '--yolo'];
1939
- const argv = await parseArguments(createTestMergedSettings());
1940
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
1941
- expect(config.getExcludeTools()).not.toContain('run_shell_command');
1942
- expect(config.getExcludeTools()).not.toContain('replace');
1943
- expect(config.getExcludeTools()).not.toContain('write_file');
1944
- expect(config.getExcludeTools()).not.toContain('ask_user');
1945
- });
1946
- it('should exclude interactive tools in non-interactive mode without YOLO', async () => {
1947
- process.stdin.isTTY = false;
1948
- process.argv = ['node', 'script.js', '-p', 'test'];
1949
- const argv = await parseArguments(createTestMergedSettings());
1950
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
1951
- expect(config.getExcludeTools()).not.toContain('run_shell_command');
1952
- expect(config.getExcludeTools()).not.toContain('replace');
1953
- expect(config.getExcludeTools()).not.toContain('write_file');
1954
- expect(config.getExcludeTools()).toContain('ask_user');
1955
- });
1956
- it('should exclude only ask_user in non-interactive mode with YOLO', async () => {
1957
- process.stdin.isTTY = false;
1958
- process.argv = ['node', 'script.js', '-p', 'test', '--yolo'];
1959
- const argv = await parseArguments(createTestMergedSettings());
1960
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
1961
- expect(config.getExcludeTools()).not.toContain('run_shell_command');
1962
- expect(config.getExcludeTools()).not.toContain('replace');
1963
- expect(config.getExcludeTools()).not.toContain('write_file');
1964
- expect(config.getExcludeTools()).toContain('ask_user');
1965
- });
1966
- it('should exclude ask_user in interactive mode when --acp is provided', async () => {
1967
- process.stdin.isTTY = true;
1968
- process.argv = ['node', 'script.js', '--acp'];
1969
- const argv = await parseArguments(createTestMergedSettings());
1970
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
1971
- expect(config.getExcludeTools()).toContain('ask_user');
1972
- });
1973
- it('should exclude ask_user in interactive mode when --experimental-acp is provided', async () => {
1974
- process.stdin.isTTY = true;
1975
- process.argv = ['node', 'script.js', '--experimental-acp'];
1976
- const argv = await parseArguments(createTestMergedSettings());
1977
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
1978
- expect(config.getExcludeTools()).toContain('ask_user');
1979
- });
1980
- it('should not exclude shell tool in non-interactive mode when --allowed-tools="ShellTool" is set', async () => {
1981
- process.stdin.isTTY = false;
1982
- process.argv = [
1983
- 'node',
1984
- 'script.js',
1985
- '-p',
1986
- 'test',
1987
- '--allowed-tools',
1988
- 'ShellTool',
1989
- ];
1990
- const argv = await parseArguments(createTestMergedSettings());
1991
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
1992
- expect(config.getExcludeTools()).not.toContain(SHELL_TOOL_NAME);
1993
- });
1994
- it('should not exclude web-fetch in non-interactive mode at config level', async () => {
1995
- process.stdin.isTTY = false;
1996
- process.argv = ['node', 'script.js', '-p', 'test'];
1997
- const argv = await parseArguments(createTestMergedSettings());
1998
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
1999
- expect(config.getExcludeTools()).not.toContain(WEB_FETCH_TOOL_NAME);
2000
- });
2001
- it('should not exclude web-fetch in non-interactive mode when allowed', async () => {
2002
- process.stdin.isTTY = false;
2003
- process.argv = [
2004
- 'node',
2005
- 'script.js',
2006
- '-p',
2007
- 'test',
2008
- '--allowed-tools',
2009
- WEB_FETCH_TOOL_NAME,
2010
- ];
2011
- const argv = await parseArguments(createTestMergedSettings());
2012
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2013
- expect(config.getExcludeTools()).not.toContain(WEB_FETCH_TOOL_NAME);
2014
- });
2015
- it('should not exclude shell tool in non-interactive mode when --allowed-tools="run_shell_command" is set', async () => {
2016
- process.stdin.isTTY = false;
2017
- process.argv = [
2018
- 'node',
2019
- 'script.js',
2020
- '-p',
2021
- 'test',
2022
- '--allowed-tools',
2023
- 'run_shell_command',
2024
- ];
2025
- const argv = await parseArguments(createTestMergedSettings());
2026
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2027
- expect(config.getExcludeTools()).not.toContain(SHELL_TOOL_NAME);
2028
- });
2029
- it('should not exclude shell tool in non-interactive mode when --allowed-tools="ShellTool(wc)" is set', async () => {
2030
- process.stdin.isTTY = false;
2031
- process.argv = [
2032
- 'node',
2033
- 'script.js',
2034
- '-p',
2035
- 'test',
2036
- '--allowed-tools',
2037
- 'ShellTool(wc)',
2038
- ];
2039
- const argv = await parseArguments(createTestMergedSettings());
2040
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2041
- expect(config.getExcludeTools()).not.toContain(SHELL_TOOL_NAME);
2042
- });
2043
- });
2044
- describe('loadCliConfig interactive', () => {
2045
- const originalIsTTY = process.stdin.isTTY;
2046
- beforeEach(() => {
2047
- vi.resetAllMocks();
2048
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
2049
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
2050
- process.stdin.isTTY = true;
2051
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
2052
- });
2053
- afterEach(() => {
2054
- process.stdin.isTTY = originalIsTTY;
2055
- vi.unstubAllEnvs();
2056
- vi.restoreAllMocks();
2057
- });
2058
- it('should be interactive if isTTY and no prompt', async () => {
2059
- process.stdin.isTTY = true;
2060
- process.argv = ['node', 'script.js'];
2061
- const argv = await parseArguments(createTestMergedSettings());
2062
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2063
- expect(config.isInteractive()).toBe(true);
2064
- });
2065
- it('should be interactive if prompt-interactive is set', async () => {
2066
- process.stdin.isTTY = false;
2067
- process.argv = ['node', 'script.js', '--prompt-interactive', 'test'];
2068
- const argv = await parseArguments(createTestMergedSettings());
2069
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2070
- expect(config.isInteractive()).toBe(true);
2071
- });
2072
- it('should not be interactive if not isTTY and no prompt', async () => {
2073
- process.stdin.isTTY = false;
2074
- process.argv = ['node', 'script.js'];
2075
- const argv = await parseArguments(createTestMergedSettings());
2076
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2077
- expect(config.isInteractive()).toBe(false);
2078
- });
2079
- it('should not be interactive if prompt is set', async () => {
2080
- process.stdin.isTTY = true;
2081
- process.argv = ['node', 'script.js', '--prompt', 'test'];
2082
- const argv = await parseArguments(createTestMergedSettings());
2083
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2084
- expect(config.isInteractive()).toBe(false);
2085
- });
2086
- it('should be interactive if positional prompt words are provided with other flags', async () => {
2087
- process.stdin.isTTY = true;
2088
- process.argv = ['node', 'script.js', '--model', 'gemini-2.5-pro', 'Hello'];
2089
- const argv = await parseArguments(createTestMergedSettings());
2090
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2091
- expect(config.isInteractive()).toBe(true);
2092
- });
2093
- it('should be interactive if positional prompt words are provided with multiple flags', async () => {
2094
- process.stdin.isTTY = true;
2095
- process.argv = [
2096
- 'node',
2097
- 'script.js',
2098
- '--model',
2099
- 'gemini-2.5-pro',
2100
- '--yolo',
2101
- 'Hello world',
2102
- ];
2103
- const argv = await parseArguments(createTestMergedSettings());
2104
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2105
- expect(config.isInteractive()).toBe(true);
2106
- // Verify the question is preserved for one-shot execution
2107
- expect(argv.prompt).toBeUndefined();
2108
- expect(argv.promptInteractive).toBe('Hello world');
2109
- });
2110
- it('should be interactive if positional prompt words are provided with extensions flag', async () => {
2111
- process.stdin.isTTY = true;
2112
- process.argv = ['node', 'script.js', '-e', 'none', 'hello'];
2113
- const argv = await parseArguments(createTestMergedSettings());
2114
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2115
- expect(config.isInteractive()).toBe(true);
2116
- expect(argv.query).toBe('hello');
2117
- expect(argv.promptInteractive).toBe('hello');
2118
- expect(argv.extensions).toEqual(['none']);
2119
- });
2120
- it('should handle multiple positional words correctly', async () => {
2121
- process.stdin.isTTY = true;
2122
- process.argv = ['node', 'script.js', 'hello world how are you'];
2123
- const argv = await parseArguments(createTestMergedSettings());
2124
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2125
- expect(config.isInteractive()).toBe(true);
2126
- expect(argv.query).toBe('hello world how are you');
2127
- expect(argv.promptInteractive).toBe('hello world how are you');
2128
- });
2129
- it('should handle multiple positional words with flags', async () => {
2130
- process.stdin.isTTY = true;
2131
- process.argv = [
2132
- 'node',
2133
- 'script.js',
2134
- '--model',
2135
- 'gemini-2.5-pro',
2136
- 'write',
2137
- 'a',
2138
- 'function',
2139
- 'to',
2140
- 'sort',
2141
- 'array',
2142
- ];
2143
- const argv = await parseArguments(createTestMergedSettings());
2144
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2145
- expect(config.isInteractive()).toBe(true);
2146
- expect(argv.query).toBe('write a function to sort array');
2147
- expect(argv.promptInteractive).toBe('write a function to sort array');
2148
- expect(argv.model).toBe('gemini-2.5-pro');
2149
- });
2150
- it('should handle empty positional arguments', async () => {
2151
- process.stdin.isTTY = true;
2152
- process.argv = ['node', 'script.js', ''];
2153
- const argv = await parseArguments(createTestMergedSettings());
2154
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2155
- expect(config.isInteractive()).toBe(true);
2156
- expect(argv.query).toBeUndefined();
2157
- });
2158
- it('should handle extensions flag with positional arguments correctly', async () => {
2159
- process.stdin.isTTY = true;
2160
- process.argv = [
2161
- 'node',
2162
- 'script.js',
2163
- '-e',
2164
- 'none',
2165
- 'hello',
2166
- 'world',
2167
- 'how',
2168
- 'are',
2169
- 'you',
2170
- ];
2171
- const argv = await parseArguments(createTestMergedSettings());
2172
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2173
- expect(config.isInteractive()).toBe(true);
2174
- expect(argv.query).toBe('hello world how are you');
2175
- expect(argv.promptInteractive).toBe('hello world how are you');
2176
- expect(argv.extensions).toEqual(['none']);
2177
- });
2178
- it('should be interactive if no positional prompt words are provided with flags', async () => {
2179
- process.stdin.isTTY = true;
2180
- process.argv = ['node', 'script.js', '--model', 'gemini-2.5-pro'];
2181
- const argv = await parseArguments(createTestMergedSettings());
2182
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2183
- expect(config.isInteractive()).toBe(true);
2184
- });
2185
- });
2186
- describe('loadCliConfig approval mode', () => {
2187
- const originalArgv = process.argv;
2188
- beforeEach(() => {
2189
- vi.resetAllMocks();
2190
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
2191
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
2192
- process.argv = ['node', 'script.js']; // Reset argv for each test
2193
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2194
- isTrusted: true,
2195
- source: undefined,
2196
- });
2197
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
2198
- });
2199
- afterEach(() => {
2200
- process.argv = originalArgv;
2201
- vi.unstubAllEnvs();
2202
- vi.restoreAllMocks();
2203
- });
2204
- it('should default to DEFAULT approval mode when no flags are set', async () => {
2205
- process.argv = ['node', 'script.js'];
2206
- const argv = await parseArguments(createTestMergedSettings());
2207
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2208
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
2209
- });
2210
- it('should set YOLO approval mode when --yolo flag is used', async () => {
2211
- process.argv = ['node', 'script.js', '--yolo'];
2212
- const argv = await parseArguments(createTestMergedSettings());
2213
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2214
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
2215
- });
2216
- it('should set YOLO approval mode when -y flag is used', async () => {
2217
- process.argv = ['node', 'script.js', '-y'];
2218
- const argv = await parseArguments(createTestMergedSettings());
2219
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2220
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
2221
- });
2222
- it('should set DEFAULT approval mode when --approval-mode=default', async () => {
2223
- process.argv = ['node', 'script.js', '--approval-mode', 'default'];
2224
- const argv = await parseArguments(createTestMergedSettings());
2225
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2226
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
2227
- });
2228
- it('should set AUTO_EDIT approval mode when --approval-mode=auto_edit', async () => {
2229
- process.argv = ['node', 'script.js', '--approval-mode', 'auto_edit'];
2230
- const argv = await parseArguments(createTestMergedSettings());
2231
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2232
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.AUTO_EDIT);
2233
- });
2234
- it('should set YOLO approval mode when --approval-mode=yolo', async () => {
2235
- process.argv = ['node', 'script.js', '--approval-mode', 'yolo'];
2236
- const argv = await parseArguments(createTestMergedSettings());
2237
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2238
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
2239
- });
2240
- it('should prioritize --approval-mode over --yolo when both would be valid (but validation prevents this)', async () => {
2241
- // Note: This test documents the intended behavior, but in practice the validation
2242
- // prevents both flags from being used together
2243
- process.argv = ['node', 'script.js', '--approval-mode', 'default'];
2244
- const argv = await parseArguments(createTestMergedSettings());
2245
- // Manually set yolo to true to simulate what would happen if validation didn't prevent it
2246
- argv.yolo = true;
2247
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2248
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
2249
- });
2250
- it('should fall back to --yolo behavior when --approval-mode is not set', async () => {
2251
- process.argv = ['node', 'script.js', '--yolo'];
2252
- const argv = await parseArguments(createTestMergedSettings());
2253
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2254
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
2255
- });
2256
- it('should set Plan approval mode when --approval-mode=plan is used and plan is enabled', async () => {
2257
- process.argv = ['node', 'script.js', '--approval-mode', 'plan'];
2258
- const argv = await parseArguments(createTestMergedSettings());
2259
- const settings = createTestMergedSettings({
2260
- general: {
2261
- plan: { enabled: true },
2262
- },
2263
- });
2264
- const config = await loadCliConfig(settings, 'test-session', argv);
2265
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.PLAN);
2266
- });
2267
- it('should ignore "yolo" in settings.tools.approvalMode and fall back to DEFAULT', async () => {
2268
- process.argv = ['node', 'script.js'];
2269
- const settings = createTestMergedSettings({
2270
- tools: {
2271
- // @ts-expect-error: testing invalid value
2272
- approvalMode: 'yolo',
2273
- },
2274
- });
2275
- const argv = await parseArguments(settings);
2276
- const config = await loadCliConfig(settings, 'test-session', argv);
2277
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
2278
- });
2279
- it('should throw error when --approval-mode=plan is used but plan is disabled', async () => {
2280
- process.argv = ['node', 'script.js', '--approval-mode', 'plan'];
2281
- const argv = await parseArguments(createTestMergedSettings());
2282
- const settings = createTestMergedSettings({
2283
- general: {
2284
- plan: { enabled: false },
2285
- },
2286
- });
2287
- const config = await loadCliConfig(settings, 'test-session', argv);
2288
- expect(config.getApprovalMode()).toBe(ApprovalMode.DEFAULT);
2289
- });
2290
- it('should allow plan approval mode by default when --approval-mode=plan is used', async () => {
2291
- process.argv = ['node', 'script.js', '--approval-mode', 'plan'];
2292
- const argv = await parseArguments(createTestMergedSettings());
2293
- const settings = createTestMergedSettings({});
2294
- const config = await loadCliConfig(settings, 'test-session', argv);
2295
- expect(config.getApprovalMode()).toBe(ApprovalMode.PLAN);
2296
- });
2297
- it('should pass planSettings.directory from settings to config', async () => {
2298
- process.argv = ['node', 'script.js'];
2299
- const settings = createTestMergedSettings({
2300
- general: {
2301
- plan: {
2302
- directory: '.custom-plans',
2303
- },
2304
- },
2305
- });
2306
- const argv = await parseArguments(settings);
2307
- const config = await loadCliConfig(settings, 'test-session', argv);
2308
- const plansDir = config.storage.getPlansDir();
2309
- expect(plansDir).toContain('.custom-plans');
2310
- });
2311
- // --- Untrusted Folder Scenarios ---
2312
- describe('when folder is NOT trusted', () => {
2313
- beforeEach(() => {
2314
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2315
- isTrusted: false,
2316
- source: 'file',
2317
- });
2318
- });
2319
- it('should override --approval-mode=yolo to DEFAULT', async () => {
2320
- process.argv = ['node', 'script.js', '--approval-mode', 'yolo'];
2321
- const argv = await parseArguments(createTestMergedSettings());
2322
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2323
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
2324
- });
2325
- it('should override --approval-mode=auto_edit to DEFAULT', async () => {
2326
- process.argv = ['node', 'script.js', '--approval-mode', 'auto_edit'];
2327
- const argv = await parseArguments(createTestMergedSettings());
2328
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2329
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
2330
- });
2331
- it('should override --yolo flag to DEFAULT', async () => {
2332
- process.argv = ['node', 'script.js', '--yolo'];
2333
- const argv = await parseArguments(createTestMergedSettings());
2334
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2335
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
2336
- });
2337
- it('should remain DEFAULT when --approval-mode=default', async () => {
2338
- process.argv = ['node', 'script.js', '--approval-mode', 'default'];
2339
- const argv = await parseArguments(createTestMergedSettings());
2340
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2341
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
2342
- });
2343
- });
2344
- describe('Persistent approvalMode setting', () => {
2345
- it('should use approvalMode from settings when no CLI flags are set', async () => {
2346
- process.argv = ['node', 'script.js'];
2347
- const settings = createTestMergedSettings({
2348
- general: { defaultApprovalMode: 'auto_edit' },
2349
- });
2350
- const argv = await parseArguments(settings);
2351
- const config = await loadCliConfig(settings, 'test-session', argv);
2352
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.AUTO_EDIT);
2353
- });
2354
- it('should prioritize --approval-mode flag over settings', async () => {
2355
- process.argv = ['node', 'script.js', '--approval-mode', 'auto_edit'];
2356
- const settings = createTestMergedSettings({
2357
- general: { defaultApprovalMode: 'default' },
2358
- });
2359
- const argv = await parseArguments(settings);
2360
- const config = await loadCliConfig(settings, 'test-session', argv);
2361
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.AUTO_EDIT);
2362
- });
2363
- it('should prioritize --yolo flag over settings', async () => {
2364
- process.argv = ['node', 'script.js', '--yolo'];
2365
- const settings = createTestMergedSettings({
2366
- general: { defaultApprovalMode: 'auto_edit' },
2367
- });
2368
- const argv = await parseArguments(settings);
2369
- const config = await loadCliConfig(settings, 'test-session', argv);
2370
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
2371
- });
2372
- it('should respect plan mode from settings when plan is enabled', async () => {
2373
- process.argv = ['node', 'script.js'];
2374
- const settings = createTestMergedSettings({
2375
- general: {
2376
- defaultApprovalMode: 'plan',
2377
- plan: { enabled: true },
2378
- },
2379
- });
2380
- const argv = await parseArguments(settings);
2381
- const config = await loadCliConfig(settings, 'test-session', argv);
2382
- expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.PLAN);
2383
- });
2384
- it('should fall back to default if plan mode is in settings but disabled', async () => {
2385
- process.argv = ['node', 'script.js'];
2386
- const settings = createTestMergedSettings({
2387
- general: {
2388
- defaultApprovalMode: 'plan',
2389
- plan: { enabled: false },
2390
- },
2391
- });
2392
- const argv = await parseArguments(settings);
2393
- const config = await loadCliConfig(settings, 'test-session', argv);
2394
- expect(config.getApprovalMode()).toBe(ApprovalMode.DEFAULT);
2395
- });
2396
- });
2397
- });
2398
- describe('loadCliConfig gemmaModelRouter', () => {
2399
- beforeEach(() => {
2400
- vi.resetAllMocks();
2401
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
2402
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
2403
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
2404
- });
2405
- afterEach(() => {
2406
- vi.unstubAllEnvs();
2407
- vi.restoreAllMocks();
2408
- });
2409
- it('should have gemmaModelRouter disabled by default', async () => {
2410
- process.argv = ['node', 'script.js'];
2411
- const argv = await parseArguments(createTestMergedSettings());
2412
- const settings = createTestMergedSettings();
2413
- const config = await loadCliConfig(settings, 'test-session', argv);
2414
- expect(config.getGemmaModelRouterEnabled()).toBe(false);
2415
- });
2416
- it('should load gemmaModelRouter settings from merged settings', async () => {
2417
- process.argv = ['node', 'script.js'];
2418
- const argv = await parseArguments(createTestMergedSettings());
2419
- const settings = createTestMergedSettings({
2420
- experimental: {
2421
- gemmaModelRouter: {
2422
- enabled: true,
2423
- autoStartServer: false,
2424
- binaryPath: '/custom/lit',
2425
- classifier: {
2426
- host: 'http://custom:1234',
2427
- model: 'custom-gemma',
2428
- },
2429
- },
2430
- },
2431
- });
2432
- const config = await loadCliConfig(settings, 'test-session', argv);
2433
- expect(config.getGemmaModelRouterEnabled()).toBe(true);
2434
- const gemmaSettings = config.getGemmaModelRouterSettings();
2435
- expect(gemmaSettings.autoStartServer).toBe(false);
2436
- expect(gemmaSettings.binaryPath).toBe('/custom/lit');
2437
- expect(gemmaSettings.classifier?.host).toBe('http://custom:1234');
2438
- expect(gemmaSettings.classifier?.model).toBe('custom-gemma');
2439
- });
2440
- it('should load experimental.gemma setting from merged settings', async () => {
2441
- process.argv = ['node', 'script.js'];
2442
- const argv = await parseArguments(createTestMergedSettings());
2443
- const settings = createTestMergedSettings({
2444
- experimental: {
2445
- gemma: true,
2446
- },
2447
- });
2448
- const config = await loadCliConfig(settings, 'test-session', argv);
2449
- expect(config.getExperimentalGemma()).toBe(true);
2450
- });
2451
- it('should handle partial gemmaModelRouter settings', async () => {
2452
- process.argv = ['node', 'script.js'];
2453
- const argv = await parseArguments(createTestMergedSettings());
2454
- const settings = createTestMergedSettings({
2455
- experimental: {
2456
- gemmaModelRouter: {
2457
- enabled: true,
2458
- },
2459
- },
2460
- });
2461
- const config = await loadCliConfig(settings, 'test-session', argv);
2462
- expect(config.getGemmaModelRouterEnabled()).toBe(true);
2463
- const gemmaSettings = config.getGemmaModelRouterSettings();
2464
- expect(gemmaSettings.autoStartServer).toBe(false);
2465
- expect(gemmaSettings.binaryPath).toBe('');
2466
- expect(gemmaSettings.classifier?.host).toBe('http://localhost:9379');
2467
- expect(gemmaSettings.classifier?.model).toBe('gemma3-1b-gpu-custom');
2468
- });
2469
- });
2470
- describe('loadCliConfig fileFiltering', () => {
2471
- const originalArgv = process.argv;
2472
- beforeEach(() => {
2473
- vi.resetAllMocks();
2474
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
2475
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
2476
- process.argv = ['node', 'script.js']; // Reset argv for each test
2477
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
2478
- });
2479
- afterEach(() => {
2480
- process.argv = originalArgv;
2481
- vi.unstubAllEnvs();
2482
- vi.restoreAllMocks();
2483
- });
2484
- const testCases = [
2485
- {
2486
- property: 'enableFuzzySearch',
2487
- getter: (c) => c.getFileFilteringEnableFuzzySearch(),
2488
- value: true,
2489
- },
2490
- {
2491
- property: 'enableFuzzySearch',
2492
- getter: (c) => c.getFileFilteringEnableFuzzySearch(),
2493
- value: false,
2494
- },
2495
- {
2496
- property: 'respectGitIgnore',
2497
- getter: (c) => c.getFileFilteringRespectGitIgnore(),
2498
- value: true,
2499
- },
2500
- {
2501
- property: 'respectGitIgnore',
2502
- getter: (c) => c.getFileFilteringRespectGitIgnore(),
2503
- value: false,
2504
- },
2505
- {
2506
- property: 'respectGeminiIgnore',
2507
- getter: (c) => c.getFileFilteringRespectGeminiIgnore(),
2508
- value: true,
2509
- },
2510
- {
2511
- property: 'respectGeminiIgnore',
2512
- getter: (c) => c.getFileFilteringRespectGeminiIgnore(),
2513
- value: false,
2514
- },
2515
- {
2516
- property: 'enableRecursiveFileSearch',
2517
- getter: (c) => c.getEnableRecursiveFileSearch(),
2518
- value: true,
2519
- },
2520
- {
2521
- property: 'enableRecursiveFileSearch',
2522
- getter: (c) => c.getEnableRecursiveFileSearch(),
2523
- value: false,
2524
- },
2525
- ];
2526
- it.each(testCases)('should pass $property from settings to config when $value', async ({ property, getter, value }) => {
2527
- const settings = createTestMergedSettings({
2528
- context: {
2529
- fileFiltering: { [property]: value },
2530
- },
2531
- });
2532
- const argv = await parseArguments(settings);
2533
- const config = await loadCliConfig(settings, 'test-session', argv);
2534
- expect(getter(config)).toBe(value);
2535
- });
2536
- });
2537
- describe('Output format', () => {
2538
- beforeEach(() => {
2539
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
2540
- });
2541
- afterEach(() => {
2542
- vi.resetAllMocks();
2543
- });
2544
- it('should default to TEXT', async () => {
2545
- process.argv = ['node', 'script.js'];
2546
- const argv = await parseArguments(createTestMergedSettings());
2547
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2548
- expect(config.getOutputFormat()).toBe(OutputFormat.TEXT);
2549
- });
2550
- it('should use the format from settings', async () => {
2551
- process.argv = ['node', 'script.js'];
2552
- const argv = await parseArguments(createTestMergedSettings());
2553
- const config = await loadCliConfig(createTestMergedSettings({ output: { format: OutputFormat.JSON } }), 'test-session', argv);
2554
- expect(config.getOutputFormat()).toBe(OutputFormat.JSON);
2555
- });
2556
- it('should prioritize the format from argv', async () => {
2557
- process.argv = ['node', 'script.js', '--output-format', 'json'];
2558
- const argv = await parseArguments(createTestMergedSettings());
2559
- const config = await loadCliConfig(createTestMergedSettings({ output: { format: OutputFormat.JSON } }), 'test-session', argv);
2560
- expect(config.getOutputFormat()).toBe(OutputFormat.JSON);
2561
- });
2562
- it('should accept stream-json as a valid output format', async () => {
2563
- process.argv = ['node', 'script.js', '--output-format', 'stream-json'];
2564
- const argv = await parseArguments(createTestMergedSettings());
2565
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2566
- expect(config.getOutputFormat()).toBe(OutputFormat.STREAM_JSON);
2567
- });
2568
- it('should error on invalid --output-format argument', async () => {
2569
- process.argv = ['node', 'script.js', '--output-format', 'invalid'];
2570
- vi.spyOn(process, 'exit').mockImplementation(() => {
2571
- throw new Error('process.exit called');
2572
- });
2573
- const mockConsoleError = vi
2574
- .spyOn(console, 'error')
2575
- .mockImplementation(() => { });
2576
- const debugErrorSpy = vi
2577
- .spyOn(debugLogger, 'error')
2578
- .mockImplementation(() => { });
2579
- await expect(parseArguments(createTestMergedSettings())).rejects.toThrow('process.exit called');
2580
- expect(debugErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Invalid values:'));
2581
- expect(mockConsoleError).toHaveBeenCalled();
2582
- });
2583
- });
2584
- describe('parseArguments with positional prompt', () => {
2585
- const originalArgv = process.argv;
2586
- beforeEach(() => {
2587
- // Default to headless mode for these tests as they mostly expect one-shot behavior
2588
- process.stdin.isTTY = false;
2589
- Object.defineProperty(process.stdout, 'isTTY', {
2590
- value: false,
2591
- configurable: true,
2592
- writable: true,
2593
- });
2594
- });
2595
- afterEach(() => {
2596
- process.argv = originalArgv;
2597
- });
2598
- it('should throw an error when both a positional prompt and the --prompt flag are used', async () => {
2599
- process.argv = [
2600
- 'node',
2601
- 'script.js',
2602
- 'positional',
2603
- 'prompt',
2604
- '--prompt',
2605
- 'test prompt',
2606
- ];
2607
- vi.spyOn(process, 'exit').mockImplementation(() => {
2608
- throw new Error('process.exit called');
2609
- });
2610
- vi.spyOn(console, 'error').mockImplementation(() => { });
2611
- const debugErrorSpy = vi
2612
- .spyOn(debugLogger, 'error')
2613
- .mockImplementation(() => { });
2614
- await expect(parseArguments(createTestMergedSettings())).rejects.toThrow('process.exit called');
2615
- expect(debugErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Cannot use both a positional prompt and the --prompt (-p) flag together'));
2616
- });
2617
- it('should correctly parse a positional prompt to query field', async () => {
2618
- process.argv = ['node', 'script.js', 'positional', 'prompt'];
2619
- const argv = await parseArguments(createTestMergedSettings());
2620
- expect(argv.query).toBe('positional prompt');
2621
- // Since no explicit prompt flags are set and query doesn't start with @, should map to prompt (one-shot)
2622
- expect(argv.prompt).toBe('positional prompt');
2623
- expect(argv.promptInteractive).toBeUndefined();
2624
- });
2625
- it('should have correct positional argument description', async () => {
2626
- // Test that the positional argument has the expected description
2627
- const yargsInstance = await import('./config.js');
2628
- // This test verifies that the positional 'query' argument is properly configured
2629
- // with the description: "Positional prompt. Defaults to one-shot; use -i/--prompt-interactive for interactive."
2630
- process.argv = ['node', 'script.js', 'test', 'query'];
2631
- const argv = await yargsInstance.parseArguments(createTestMergedSettings());
2632
- expect(argv.query).toBe('test query');
2633
- });
2634
- it('should correctly parse a prompt from the --prompt flag', async () => {
2635
- process.argv = ['node', 'script.js', '--prompt', 'test prompt'];
2636
- const argv = await parseArguments(createTestMergedSettings());
2637
- expect(argv.prompt).toBe('test prompt');
2638
- });
2639
- });
2640
- describe('Telemetry configuration via environment variables', () => {
2641
- beforeEach(() => {
2642
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
2643
- });
2644
- afterEach(() => {
2645
- vi.resetAllMocks();
2646
- });
2647
- it('should prioritize GEMINI_TELEMETRY_ENABLED over settings', async () => {
2648
- vi.stubEnv('GEMINI_TELEMETRY_ENABLED', 'true');
2649
- process.argv = ['node', 'script.js'];
2650
- const argv = await parseArguments(createTestMergedSettings());
2651
- const settings = createTestMergedSettings({
2652
- telemetry: { enabled: false },
2653
- });
2654
- const config = await loadCliConfig(settings, 'test-session', argv);
2655
- expect(config.getTelemetryEnabled()).toBe(true);
2656
- });
2657
- it('should prioritize GEMINI_TELEMETRY_TARGET over settings', async () => {
2658
- vi.stubEnv('GEMINI_TELEMETRY_TARGET', 'gcp');
2659
- process.argv = ['node', 'script.js'];
2660
- const argv = await parseArguments(createTestMergedSettings());
2661
- const settings = createTestMergedSettings({
2662
- telemetry: { target: ServerConfig.TelemetryTarget.LOCAL },
2663
- });
2664
- const config = await loadCliConfig(settings, 'test-session', argv);
2665
- expect(config.getTelemetryTarget()).toBe('gcp');
2666
- });
2667
- it('should throw when GEMINI_TELEMETRY_TARGET is invalid', async () => {
2668
- vi.stubEnv('GEMINI_TELEMETRY_TARGET', 'bogus');
2669
- process.argv = ['node', 'script.js'];
2670
- const argv = await parseArguments(createTestMergedSettings());
2671
- const settings = createTestMergedSettings({
2672
- telemetry: { target: ServerConfig.TelemetryTarget.GCP },
2673
- });
2674
- await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow(/Invalid telemetry configuration: .*Invalid telemetry target/i);
2675
- vi.unstubAllEnvs();
2676
- });
2677
- it('should prioritize GEMINI_TELEMETRY_OTLP_ENDPOINT over settings and default env var', async () => {
2678
- vi.stubEnv('OTEL_EXPORTER_OTLP_ENDPOINT', 'http://default.env.com');
2679
- vi.stubEnv('GEMINI_TELEMETRY_OTLP_ENDPOINT', 'http://gemini.env.com');
2680
- process.argv = ['node', 'script.js'];
2681
- const argv = await parseArguments(createTestMergedSettings());
2682
- const settings = createTestMergedSettings({
2683
- telemetry: { otlpEndpoint: 'http://settings.com' },
2684
- });
2685
- const config = await loadCliConfig(settings, 'test-session', argv);
2686
- expect(config.getTelemetryOtlpEndpoint()).toBe('http://gemini.env.com');
2687
- });
2688
- it('should prioritize GEMINI_TELEMETRY_OTLP_PROTOCOL over settings', async () => {
2689
- vi.stubEnv('GEMINI_TELEMETRY_OTLP_PROTOCOL', 'http');
2690
- process.argv = ['node', 'script.js'];
2691
- const argv = await parseArguments(createTestMergedSettings());
2692
- const settings = createTestMergedSettings({
2693
- telemetry: { otlpProtocol: 'grpc' },
2694
- });
2695
- const config = await loadCliConfig(settings, 'test-session', argv);
2696
- expect(config.getTelemetryOtlpProtocol()).toBe('http');
2697
- });
2698
- it('should prioritize GEMINI_TELEMETRY_LOG_PROMPTS over settings', async () => {
2699
- vi.stubEnv('GEMINI_TELEMETRY_LOG_PROMPTS', 'false');
2700
- process.argv = ['node', 'script.js'];
2701
- const argv = await parseArguments(createTestMergedSettings());
2702
- const settings = createTestMergedSettings({
2703
- telemetry: { logPrompts: true },
2704
- });
2705
- const config = await loadCliConfig(settings, 'test-session', argv);
2706
- expect(config.getTelemetryLogPromptsEnabled()).toBe(false);
2707
- });
2708
- it('should prioritize GEMINI_TELEMETRY_OUTFILE over settings', async () => {
2709
- vi.stubEnv('GEMINI_TELEMETRY_OUTFILE', '/gemini/env/telemetry.log');
2710
- process.argv = ['node', 'script.js'];
2711
- const argv = await parseArguments(createTestMergedSettings());
2712
- const settings = createTestMergedSettings({
2713
- telemetry: { outfile: '/settings/telemetry.log' },
2714
- });
2715
- const config = await loadCliConfig(settings, 'test-session', argv);
2716
- expect(config.getTelemetryOutfile()).toBe('/gemini/env/telemetry.log');
2717
- });
2718
- it('should prioritize GEMINI_TELEMETRY_USE_COLLECTOR over settings', async () => {
2719
- vi.stubEnv('GEMINI_TELEMETRY_USE_COLLECTOR', 'true');
2720
- process.argv = ['node', 'script.js'];
2721
- const argv = await parseArguments(createTestMergedSettings());
2722
- const settings = createTestMergedSettings({
2723
- telemetry: { useCollector: false },
2724
- });
2725
- const config = await loadCliConfig(settings, 'test-session', argv);
2726
- expect(config.getTelemetryUseCollector()).toBe(true);
2727
- });
2728
- it('should use settings value when GEMINI_TELEMETRY_ENABLED is not set', async () => {
2729
- vi.stubEnv('GEMINI_TELEMETRY_ENABLED', undefined);
2730
- process.argv = ['node', 'script.js'];
2731
- const argv = await parseArguments(createTestMergedSettings());
2732
- const settings = createTestMergedSettings({ telemetry: { enabled: true } });
2733
- const config = await loadCliConfig(settings, 'test-session', argv);
2734
- expect(config.getTelemetryEnabled()).toBe(true);
2735
- });
2736
- it('should use settings value when GEMINI_TELEMETRY_TARGET is not set', async () => {
2737
- vi.stubEnv('GEMINI_TELEMETRY_TARGET', undefined);
2738
- process.argv = ['node', 'script.js'];
2739
- const argv = await parseArguments(createTestMergedSettings());
2740
- const settings = createTestMergedSettings({
2741
- telemetry: { target: ServerConfig.TelemetryTarget.LOCAL },
2742
- });
2743
- const config = await loadCliConfig(settings, 'test-session', argv);
2744
- expect(config.getTelemetryTarget()).toBe('local');
2745
- });
2746
- it("should treat GEMINI_TELEMETRY_ENABLED='1' as true", async () => {
2747
- vi.stubEnv('GEMINI_TELEMETRY_ENABLED', '1');
2748
- process.argv = ['node', 'script.js'];
2749
- const argv = await parseArguments(createTestMergedSettings());
2750
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2751
- expect(config.getTelemetryEnabled()).toBe(true);
2752
- });
2753
- it("should treat GEMINI_TELEMETRY_ENABLED='0' as false", async () => {
2754
- vi.stubEnv('GEMINI_TELEMETRY_ENABLED', '0');
2755
- process.argv = ['node', 'script.js'];
2756
- const argv = await parseArguments(createTestMergedSettings());
2757
- const config = await loadCliConfig(createTestMergedSettings({ telemetry: { enabled: true } }), 'test-session', argv);
2758
- expect(config.getTelemetryEnabled()).toBe(false);
2759
- });
2760
- it("should treat GEMINI_TELEMETRY_LOG_PROMPTS='1' as true", async () => {
2761
- vi.stubEnv('GEMINI_TELEMETRY_LOG_PROMPTS', '1');
2762
- process.argv = ['node', 'script.js'];
2763
- const argv = await parseArguments(createTestMergedSettings());
2764
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2765
- expect(config.getTelemetryLogPromptsEnabled()).toBe(true);
2766
- });
2767
- it("should treat GEMINI_TELEMETRY_LOG_PROMPTS='false' as false", async () => {
2768
- vi.stubEnv('GEMINI_TELEMETRY_LOG_PROMPTS', 'false');
2769
- process.argv = ['node', 'script.js'];
2770
- const argv = await parseArguments(createTestMergedSettings());
2771
- const config = await loadCliConfig(createTestMergedSettings({ telemetry: { logPrompts: true } }), 'test-session', argv);
2772
- expect(config.getTelemetryLogPromptsEnabled()).toBe(false);
2773
- });
2774
- });
2775
- describe('PolicyEngine nonInteractive wiring', () => {
2776
- const originalIsTTY = process.stdin.isTTY;
2777
- beforeEach(() => {
2778
- vi.resetAllMocks();
2779
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
2780
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
2781
- });
2782
- afterEach(() => {
2783
- process.stdin.isTTY = originalIsTTY;
2784
- vi.restoreAllMocks();
2785
- });
2786
- it('should set nonInteractive to true when -p flag is used', async () => {
2787
- process.stdin.isTTY = true;
2788
- process.argv = ['node', 'script.js', '-p', 'echo hello'];
2789
- const argv = await parseArguments(createTestMergedSettings());
2790
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2791
- expect(config.isInteractive()).toBe(false);
2792
- expect(config.getPolicyEngine()
2793
- .nonInteractive).toBe(true);
2794
- });
2795
- it('should set nonInteractive to false in interactive mode', async () => {
2796
- process.stdin.isTTY = true;
2797
- process.argv = ['node', 'script.js'];
2798
- const argv = await parseArguments(createTestMergedSettings());
2799
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
2800
- expect(config.isInteractive()).toBe(true);
2801
- expect(config.getPolicyEngine()
2802
- .nonInteractive).toBe(false);
2803
- });
2804
- });
2805
- describe('Policy Engine Integration in loadCliConfig', () => {
2806
- beforeEach(() => {
2807
- vi.resetAllMocks();
2808
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
2809
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
2810
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
2811
- });
2812
- afterEach(() => {
2813
- vi.unstubAllEnvs();
2814
- vi.restoreAllMocks();
2815
- });
2816
- it('should pass merged allowed tools from CLI and settings to createPolicyEngineConfig', async () => {
2817
- process.argv = ['node', 'script.js', '--allowed-tools', 'cli-tool'];
2818
- const settings = createTestMergedSettings({
2819
- tools: { allowed: ['settings-tool'] },
2820
- });
2821
- const argv = await parseArguments(createTestMergedSettings());
2822
- await loadCliConfig(settings, 'test-session', argv);
2823
- expect(ServerConfig.createPolicyEngineConfig).toHaveBeenCalledWith(expect.objectContaining({
2824
- tools: expect.objectContaining({
2825
- allowed: expect.arrayContaining(['cli-tool']),
2826
- }),
2827
- }), expect.anything(), undefined, expect.anything());
2828
- });
2829
- it('should pass merged exclude tools from CLI logic and settings to createPolicyEngineConfig', async () => {
2830
- process.stdin.isTTY = false; // Non-interactive to trigger default excludes
2831
- process.argv = ['node', 'script.js', '-p', 'test'];
2832
- const settings = createTestMergedSettings({
2833
- tools: { exclude: ['settings-exclude'] },
2834
- });
2835
- const argv = await parseArguments(createTestMergedSettings());
2836
- await loadCliConfig(settings, 'test-session', argv);
2837
- // In non-interactive mode, only ask_user is excluded by default
2838
- expect(ServerConfig.createPolicyEngineConfig).toHaveBeenCalledWith(expect.objectContaining({
2839
- tools: expect.objectContaining({
2840
- exclude: expect.arrayContaining([ASK_USER_TOOL_NAME]),
2841
- }),
2842
- }), expect.anything(), undefined, expect.anything());
2843
- });
2844
- it('should pass user-provided policy paths from --policy flag to createPolicyEngineConfig', async () => {
2845
- process.argv = [
2846
- 'node',
2847
- 'script.js',
2848
- '--policy',
2849
- '/path/to/policy1.toml,/path/to/policy2.toml',
2850
- ];
2851
- const settings = createTestMergedSettings();
2852
- const argv = await parseArguments(settings);
2853
- await loadCliConfig(settings, 'test-session', argv);
2854
- expect(ServerConfig.createPolicyEngineConfig).toHaveBeenCalledWith(expect.objectContaining({
2855
- policyPaths: [
2856
- path.normalize('/path/to/policy1.toml'),
2857
- path.normalize('/path/to/policy2.toml'),
2858
- ],
2859
- }), expect.anything(), undefined, expect.anything());
2860
- });
2861
- });
2862
- describe('loadCliConfig disableYoloMode', () => {
2863
- beforeEach(() => {
2864
- vi.resetAllMocks();
2865
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
2866
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
2867
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
2868
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2869
- isTrusted: true,
2870
- source: undefined,
2871
- });
2872
- });
2873
- afterEach(() => {
2874
- vi.unstubAllEnvs();
2875
- vi.restoreAllMocks();
2876
- });
2877
- it('should allow auto_edit mode even if yolo mode is disabled', async () => {
2878
- process.argv = ['node', 'script.js', '--approval-mode=auto_edit'];
2879
- const argv = await parseArguments(createTestMergedSettings());
2880
- const settings = createTestMergedSettings({
2881
- security: { disableYoloMode: true },
2882
- });
2883
- const config = await loadCliConfig(settings, 'test-session', argv);
2884
- expect(config.getApprovalMode()).toBe(ApprovalMode.AUTO_EDIT);
2885
- });
2886
- it('should throw if YOLO mode is attempted when disableYoloMode is true', async () => {
2887
- process.argv = ['node', 'script.js', '--yolo'];
2888
- const argv = await parseArguments(createTestMergedSettings());
2889
- const settings = createTestMergedSettings({
2890
- security: { disableYoloMode: true },
2891
- });
2892
- await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow('YOLO mode is disabled by your administrator. To enable it, please request an update to the settings at: https://goo.gle/manage-gemini-cli');
2893
- });
2894
- });
2895
- describe('loadCliConfig secureModeEnabled', () => {
2896
- beforeEach(() => {
2897
- vi.resetAllMocks();
2898
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
2899
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
2900
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
2901
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2902
- isTrusted: true,
2903
- source: undefined,
2904
- });
2905
- });
2906
- afterEach(() => {
2907
- vi.unstubAllEnvs();
2908
- vi.restoreAllMocks();
2909
- });
2910
- it('should throw an error if YOLO mode is attempted when secureModeEnabled is true', async () => {
2911
- process.argv = ['node', 'script.js', '--yolo'];
2912
- const argv = await parseArguments(createTestMergedSettings());
2913
- const settings = createTestMergedSettings({
2914
- admin: {
2915
- secureModeEnabled: true,
2916
- },
2917
- });
2918
- await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow('YOLO mode is disabled by your administrator. To enable it, please request an update to the settings at: https://goo.gle/manage-gemini-cli');
2919
- });
2920
- it('should throw an error if approval-mode=yolo is attempted when secureModeEnabled is true', async () => {
2921
- process.argv = ['node', 'script.js', '--approval-mode=yolo'];
2922
- const argv = await parseArguments(createTestMergedSettings());
2923
- const settings = createTestMergedSettings({
2924
- admin: {
2925
- secureModeEnabled: true,
2926
- },
2927
- });
2928
- await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow('YOLO mode is disabled by your administrator. To enable it, please request an update to the settings at: https://goo.gle/manage-gemini-cli');
2929
- });
2930
- it('should set disableYoloMode to true when secureModeEnabled is true', async () => {
2931
- process.argv = ['node', 'script.js'];
2932
- const argv = await parseArguments(createTestMergedSettings());
2933
- const settings = createTestMergedSettings({
2934
- admin: {
2935
- secureModeEnabled: true,
2936
- },
2937
- });
2938
- const config = await loadCliConfig(settings, 'test-session', argv);
2939
- expect(config.isYoloModeDisabled()).toBe(true);
2940
- });
2941
- });
2942
- describe('loadCliConfig mcpEnabled', () => {
2943
- beforeEach(() => {
2944
- vi.resetAllMocks();
2945
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
2946
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
2947
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
2948
- });
2949
- afterEach(() => {
2950
- vi.unstubAllEnvs();
2951
- vi.restoreAllMocks();
2952
- });
2953
- const mcpSettings = {
2954
- mcp: {
2955
- serverCommand: 'mcp-server',
2956
- allowed: ['serverA'],
2957
- excluded: ['serverB'],
2958
- },
2959
- mcpServers: { serverA: { url: 'http://a' } },
2960
- };
2961
- it('should enable MCP by default', async () => {
2962
- process.argv = ['node', 'script.js'];
2963
- const argv = await parseArguments(createTestMergedSettings());
2964
- const settings = createTestMergedSettings({ ...mcpSettings });
2965
- const config = await loadCliConfig(settings, 'test-session', argv);
2966
- expect(config.getMcpEnabled()).toBe(true);
2967
- expect(config.getMcpServerCommand()).toBe('mcp-server');
2968
- expect(config.getMcpServers()).toEqual({ serverA: { url: 'http://a' } });
2969
- expect(config.getAllowedMcpServers()).toEqual(['serverA']);
2970
- expect(config.getBlockedMcpServers()).toEqual(['serverB']);
2971
- });
2972
- it('should disable MCP when mcpEnabled is false', async () => {
2973
- process.argv = ['node', 'script.js'];
2974
- const argv = await parseArguments(createTestMergedSettings());
2975
- const settings = createTestMergedSettings({
2976
- ...mcpSettings,
2977
- admin: {
2978
- mcp: {
2979
- enabled: false,
2980
- },
2981
- },
2982
- });
2983
- const config = await loadCliConfig(settings, 'test-session', argv);
2984
- expect(config.getMcpEnabled()).toBe(false);
2985
- expect(config.getMcpServerCommand()).toBeUndefined();
2986
- expect(config.getMcpServers()).toEqual({});
2987
- expect(config.getAllowedMcpServers()).toEqual([]);
2988
- expect(config.getBlockedMcpServers()).toEqual([]);
2989
- });
2990
- it('should enable MCP when mcpEnabled is true', async () => {
2991
- process.argv = ['node', 'script.js'];
2992
- const argv = await parseArguments(createTestMergedSettings());
2993
- const settings = createTestMergedSettings({
2994
- ...mcpSettings,
2995
- admin: {
2996
- mcp: {
2997
- enabled: true,
2998
- },
2999
- },
3000
- });
3001
- const config = await loadCliConfig(settings, 'test-session', argv);
3002
- expect(config.getMcpEnabled()).toBe(true);
3003
- expect(config.getMcpServerCommand()).toBe('mcp-server');
3004
- expect(config.getMcpServers()).toEqual({ serverA: { url: 'http://a' } });
3005
- expect(config.getAllowedMcpServers()).toEqual(['serverA']);
3006
- expect(config.getBlockedMcpServers()).toEqual(['serverB']);
3007
- });
3008
- describe('extension plan settings', () => {
3009
- beforeEach(() => {
3010
- vi.spyOn(Storage.prototype, 'getProjectTempDir').mockReturnValue('/mock/home/user/.gemini/tmp/test-project');
3011
- });
3012
- it('should use plan directory from active extension when user has not specified one', async () => {
3013
- process.argv = ['node', 'script.js'];
3014
- const settings = createTestMergedSettings({
3015
- general: {
3016
- plan: { enabled: true },
3017
- },
3018
- });
3019
- const argv = await parseArguments(settings);
3020
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
3021
- {
3022
- name: 'ext-plan',
3023
- isActive: true,
3024
- plan: { directory: 'ext-plans-dir' },
3025
- },
3026
- ]);
3027
- const config = await loadCliConfig(settings, 'test-session', argv);
3028
- expect(config.storage.getPlansDir()).toContain('ext-plans-dir');
3029
- });
3030
- it('should NOT use plan directory from active extension when user has specified one', async () => {
3031
- process.argv = ['node', 'script.js'];
3032
- const settings = createTestMergedSettings({
3033
- general: {
3034
- plan: {
3035
- enabled: true,
3036
- directory: 'user-plans-dir',
3037
- },
3038
- },
3039
- });
3040
- const argv = await parseArguments(settings);
3041
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
3042
- {
3043
- name: 'ext-plan',
3044
- isActive: true,
3045
- plan: { directory: 'ext-plans-dir' },
3046
- },
3047
- ]);
3048
- const config = await loadCliConfig(settings, 'test-session', argv);
3049
- expect(config.storage.getPlansDir()).toContain('user-plans-dir');
3050
- expect(config.storage.getPlansDir()).not.toContain('ext-plans-dir');
3051
- });
3052
- it('should NOT use plan directory from inactive extension', async () => {
3053
- process.argv = ['node', 'script.js'];
3054
- const settings = createTestMergedSettings({
3055
- general: {
3056
- plan: { enabled: true },
3057
- },
3058
- });
3059
- const argv = await parseArguments(settings);
3060
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
3061
- {
3062
- name: 'ext-plan',
3063
- isActive: false,
3064
- plan: { directory: 'ext-plans-dir-inactive' },
3065
- },
3066
- ]);
3067
- const config = await loadCliConfig(settings, 'test-session', argv);
3068
- expect(config.storage.getPlansDir()).not.toContain('ext-plans-dir-inactive');
3069
- });
3070
- it('should use default path if neither user nor extension settings provide a plan directory', async () => {
3071
- process.argv = ['node', 'script.js'];
3072
- const settings = createTestMergedSettings({
3073
- general: {
3074
- plan: { enabled: true },
3075
- },
3076
- });
3077
- const argv = await parseArguments(settings);
3078
- // No extensions providing plan directory
3079
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
3080
- const config = await loadCliConfig(settings, 'test-session', argv);
3081
- // Should return the default managed temp directory path
3082
- expect(config.storage.getPlansDir()).toBe(path.join('/mock', 'home', 'user', '.gemini', 'tmp', 'test-project', 'test-session', 'plans'));
3083
- });
3084
- });
3085
- });
3086
- describe('loadCliConfig acpMode and clientName', () => {
3087
- beforeEach(() => {
3088
- vi.resetAllMocks();
3089
- vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
3090
- vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
3091
- vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
3092
- });
3093
- afterEach(() => {
3094
- vi.unstubAllEnvs();
3095
- });
3096
- it('should set acpMode to true and detect clientName when --acp flag is used', async () => {
3097
- process.argv = ['node', 'script.js', '--acp'];
3098
- vi.stubEnv('TERM_PROGRAM', 'vscode');
3099
- vi.stubEnv('VSCODE_GIT_ASKPASS_MAIN', '');
3100
- vi.stubEnv('ANTIGRAVITY_CLI_ALIAS', '');
3101
- const argv = await parseArguments(createTestMergedSettings());
3102
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
3103
- expect(config.getAcpMode()).toBe(true);
3104
- expect(config.getClientName()).toBe('acp-vscode');
3105
- });
3106
- it('should set acpMode to true and set clientName to acp for generic terminals', async () => {
3107
- process.argv = ['node', 'script.js', '--acp'];
3108
- vi.stubEnv('TERM_PROGRAM', 'iTerm.app'); // Generic terminal
3109
- vi.stubEnv('VSCODE_GIT_ASKPASS_MAIN', '');
3110
- vi.stubEnv('ANTIGRAVITY_CLI_ALIAS', '');
3111
- const argv = await parseArguments(createTestMergedSettings());
3112
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
3113
- expect(config.getAcpMode()).toBe(true);
3114
- expect(config.getClientName()).toBe('acp');
3115
- });
3116
- it('should set acpMode to false and clientName to tui by default', async () => {
3117
- process.argv = ['node', 'script.js'];
3118
- const argv = await parseArguments(createTestMergedSettings());
3119
- const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
3120
- expect(config.getAcpMode()).toBe(false);
3121
- expect(config.getClientName()).toBe('tui');
3122
- });
3123
- });
3124
- //# sourceMappingURL=config.test.js.map