@didim365/agent-cli 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1091) hide show
  1. package/dist/package.json +5 -2
  2. package/dist/src/config/settingsSchema.d.ts +85 -0
  3. package/dist/src/config/settingsSchema.js +85 -0
  4. package/dist/src/config/settingsSchema.js.map +1 -1
  5. package/dist/src/core/initializer.js +42 -3
  6. package/dist/src/core/initializer.js.map +1 -1
  7. package/dist/src/gemini.d.ts +6 -0
  8. package/dist/src/gemini.js +79 -5
  9. package/dist/src/gemini.js.map +1 -1
  10. package/dist/src/generated/git-commit.d.ts +1 -1
  11. package/dist/src/generated/git-commit.js +1 -1
  12. package/dist/src/test-utils/render.js +9 -0
  13. package/dist/src/test-utils/render.js.map +1 -1
  14. package/dist/src/ui/AppContainer.js +182 -9
  15. package/dist/src/ui/AppContainer.js.map +1 -1
  16. package/dist/src/ui/auth/ApiAuthDialog.d.ts +3 -1
  17. package/dist/src/ui/auth/ApiAuthDialog.js +7 -5
  18. package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -1
  19. package/dist/src/ui/auth/AuthDialog.d.ts +3 -1
  20. package/dist/src/ui/auth/AuthDialog.js +6 -6
  21. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  22. package/dist/src/ui/auth/ProviderSelectDialog.d.ts +15 -0
  23. package/dist/src/ui/auth/ProviderSelectDialog.js +39 -0
  24. package/dist/src/ui/auth/ProviderSelectDialog.js.map +1 -0
  25. package/dist/src/ui/auth/SlmConfigDialog.d.ts +21 -0
  26. package/dist/src/ui/auth/SlmConfigDialog.js +170 -0
  27. package/dist/src/ui/auth/SlmConfigDialog.js.map +1 -0
  28. package/dist/src/ui/auth/VertexConfigDialog.d.ts +18 -0
  29. package/dist/src/ui/auth/VertexConfigDialog.js +97 -0
  30. package/dist/src/ui/auth/VertexConfigDialog.js.map +1 -0
  31. package/dist/src/ui/auth/providerMetadata.d.ts +38 -0
  32. package/dist/src/ui/auth/providerMetadata.js +71 -0
  33. package/dist/src/ui/auth/providerMetadata.js.map +1 -0
  34. package/dist/src/ui/auth/useAuth.d.ts +3 -0
  35. package/dist/src/ui/auth/useAuth.js +243 -39
  36. package/dist/src/ui/auth/useAuth.js.map +1 -1
  37. package/dist/src/ui/commands/authCommand.js +18 -1
  38. package/dist/src/ui/commands/authCommand.js.map +1 -1
  39. package/dist/src/ui/commands/initCommand.js +1 -1
  40. package/dist/src/ui/commands/initCommand.js.map +1 -1
  41. package/dist/src/ui/commands/rewindCommand.js.map +1 -1
  42. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  43. package/dist/src/ui/components/DialogManager.js +27 -2
  44. package/dist/src/ui/components/DialogManager.js.map +1 -1
  45. package/dist/src/ui/components/InputPrompt.js +1 -1
  46. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  47. package/dist/src/ui/contexts/UIActionsContext.d.ts +14 -0
  48. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  49. package/dist/src/ui/contexts/UIStateContext.d.ts +4 -0
  50. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  51. package/dist/src/ui/hooks/useRewind.js.map +1 -1
  52. package/dist/src/ui/types.d.ts +4 -1
  53. package/dist/src/ui/types.js +6 -0
  54. package/dist/src/ui/types.js.map +1 -1
  55. package/dist/src/ui/utils/mouse.js +1 -1
  56. package/dist/src/ui/utils/mouse.js.map +1 -1
  57. package/dist/src/ui/utils/rewindFileOps.js.map +1 -1
  58. package/package.json +6 -3
  59. package/dist/src/commands/extensions/configure.test.d.ts +0 -1
  60. package/dist/src/commands/extensions/configure.test.js +0 -197
  61. package/dist/src/commands/extensions/configure.test.js.map +0 -1
  62. package/dist/src/commands/extensions/disable.test.d.ts +0 -6
  63. package/dist/src/commands/extensions/disable.test.js +0 -169
  64. package/dist/src/commands/extensions/disable.test.js.map +0 -1
  65. package/dist/src/commands/extensions/enable.test.d.ts +0 -6
  66. package/dist/src/commands/extensions/enable.test.js +0 -199
  67. package/dist/src/commands/extensions/enable.test.js.map +0 -1
  68. package/dist/src/commands/extensions/install.test.d.ts +0 -6
  69. package/dist/src/commands/extensions/install.test.js +0 -140
  70. package/dist/src/commands/extensions/install.test.js.map +0 -1
  71. package/dist/src/commands/extensions/link.test.d.ts +0 -6
  72. package/dist/src/commands/extensions/link.test.js +0 -137
  73. package/dist/src/commands/extensions/link.test.js.map +0 -1
  74. package/dist/src/commands/extensions/list.test.d.ts +0 -6
  75. package/dist/src/commands/extensions/list.test.js +0 -148
  76. package/dist/src/commands/extensions/list.test.js.map +0 -1
  77. package/dist/src/commands/extensions/new.test.d.ts +0 -6
  78. package/dist/src/commands/extensions/new.test.js +0 -62
  79. package/dist/src/commands/extensions/new.test.js.map +0 -1
  80. package/dist/src/commands/extensions/uninstall.test.d.ts +0 -6
  81. package/dist/src/commands/extensions/uninstall.test.js +0 -199
  82. package/dist/src/commands/extensions/uninstall.test.js.map +0 -1
  83. package/dist/src/commands/extensions/update.test.d.ts +0 -6
  84. package/dist/src/commands/extensions/update.test.js +0 -170
  85. package/dist/src/commands/extensions/update.test.js.map +0 -1
  86. package/dist/src/commands/extensions/validate.test.d.ts +0 -6
  87. package/dist/src/commands/extensions/validate.test.js +0 -96
  88. package/dist/src/commands/extensions/validate.test.js.map +0 -1
  89. package/dist/src/commands/extensions.test.d.ts +0 -6
  90. package/dist/src/commands/extensions.test.js +0 -67
  91. package/dist/src/commands/extensions.test.js.map +0 -1
  92. package/dist/src/commands/hooks/migrate.test.d.ts +0 -6
  93. package/dist/src/commands/hooks/migrate.test.js +0 -388
  94. package/dist/src/commands/hooks/migrate.test.js.map +0 -1
  95. package/dist/src/commands/mcp/add.test.d.ts +0 -6
  96. package/dist/src/commands/mcp/add.test.js +0 -274
  97. package/dist/src/commands/mcp/add.test.js.map +0 -1
  98. package/dist/src/commands/mcp/list.test.d.ts +0 -6
  99. package/dist/src/commands/mcp/list.test.js +0 -150
  100. package/dist/src/commands/mcp/list.test.js.map +0 -1
  101. package/dist/src/commands/mcp/remove.test.d.ts +0 -6
  102. package/dist/src/commands/mcp/remove.test.js +0 -189
  103. package/dist/src/commands/mcp/remove.test.js.map +0 -1
  104. package/dist/src/commands/mcp.test.d.ts +0 -6
  105. package/dist/src/commands/mcp.test.js +0 -65
  106. package/dist/src/commands/mcp.test.js.map +0 -1
  107. package/dist/src/commands/skills/disable.test.d.ts +0 -6
  108. package/dist/src/commands/skills/disable.test.js +0 -96
  109. package/dist/src/commands/skills/disable.test.js.map +0 -1
  110. package/dist/src/commands/skills/enable.test.d.ts +0 -6
  111. package/dist/src/commands/skills/enable.test.js +0 -107
  112. package/dist/src/commands/skills/enable.test.js.map +0 -1
  113. package/dist/src/commands/skills/install.test.d.ts +0 -6
  114. package/dist/src/commands/skills/install.test.js +0 -95
  115. package/dist/src/commands/skills/install.test.js.map +0 -1
  116. package/dist/src/commands/skills/list.test.d.ts +0 -6
  117. package/dist/src/commands/skills/list.test.js +0 -136
  118. package/dist/src/commands/skills/list.test.js.map +0 -1
  119. package/dist/src/commands/skills/uninstall.test.d.ts +0 -6
  120. package/dist/src/commands/skills/uninstall.test.js +0 -61
  121. package/dist/src/commands/skills/uninstall.test.js.map +0 -1
  122. package/dist/src/commands/skills.test.d.ts +0 -6
  123. package/dist/src/commands/skills.test.js +0 -49
  124. package/dist/src/commands/skills.test.js.map +0 -1
  125. package/dist/src/commands/utils.test.d.ts +0 -6
  126. package/dist/src/commands/utils.test.js +0 -35
  127. package/dist/src/commands/utils.test.js.map +0 -1
  128. package/dist/src/config/auth.test.d.ts +0 -6
  129. package/dist/src/config/auth.test.js +0 -89
  130. package/dist/src/config/auth.test.js.map +0 -1
  131. package/dist/src/config/config.integration.test.d.ts +0 -6
  132. package/dist/src/config/config.integration.test.js +0 -205
  133. package/dist/src/config/config.integration.test.js.map +0 -1
  134. package/dist/src/config/config.test.d.ts +0 -6
  135. package/dist/src/config/config.test.js +0 -2413
  136. package/dist/src/config/config.test.js.map +0 -1
  137. package/dist/src/config/extension-manager-agents.test.d.ts +0 -6
  138. package/dist/src/config/extension-manager-agents.test.js +0 -114
  139. package/dist/src/config/extension-manager-agents.test.js.map +0 -1
  140. package/dist/src/config/extension-manager-scope.test.d.ts +0 -6
  141. package/dist/src/config/extension-manager-scope.test.js +0 -153
  142. package/dist/src/config/extension-manager-scope.test.js.map +0 -1
  143. package/dist/src/config/extension-manager-skills.test.d.ts +0 -6
  144. package/dist/src/config/extension-manager-skills.test.js +0 -148
  145. package/dist/src/config/extension-manager-skills.test.js.map +0 -1
  146. package/dist/src/config/extension.test.d.ts +0 -6
  147. package/dist/src/config/extension.test.js +0 -1671
  148. package/dist/src/config/extension.test.js.map +0 -1
  149. package/dist/src/config/extensions/consent.test.d.ts +0 -6
  150. package/dist/src/config/extensions/consent.test.js +0 -280
  151. package/dist/src/config/extensions/consent.test.js.map +0 -1
  152. package/dist/src/config/extensions/extensionEnablement.test.d.ts +0 -6
  153. package/dist/src/config/extensions/extensionEnablement.test.js +0 -404
  154. package/dist/src/config/extensions/extensionEnablement.test.js.map +0 -1
  155. package/dist/src/config/extensions/extensionSettings.test.d.ts +0 -6
  156. package/dist/src/config/extensions/extensionSettings.test.js +0 -493
  157. package/dist/src/config/extensions/extensionSettings.test.js.map +0 -1
  158. package/dist/src/config/extensions/extensionUpdates.test.d.ts +0 -6
  159. package/dist/src/config/extensions/extensionUpdates.test.js +0 -230
  160. package/dist/src/config/extensions/extensionUpdates.test.js.map +0 -1
  161. package/dist/src/config/extensions/github.test.d.ts +0 -6
  162. package/dist/src/config/extensions/github.test.js +0 -441
  163. package/dist/src/config/extensions/github.test.js.map +0 -1
  164. package/dist/src/config/extensions/github_fetch.test.d.ts +0 -6
  165. package/dist/src/config/extensions/github_fetch.test.js +0 -169
  166. package/dist/src/config/extensions/github_fetch.test.js.map +0 -1
  167. package/dist/src/config/extensions/storage.test.d.ts +0 -6
  168. package/dist/src/config/extensions/storage.test.js +0 -64
  169. package/dist/src/config/extensions/storage.test.js.map +0 -1
  170. package/dist/src/config/extensions/update.test.d.ts +0 -6
  171. package/dist/src/config/extensions/update.test.js +0 -231
  172. package/dist/src/config/extensions/update.test.js.map +0 -1
  173. package/dist/src/config/extensions/variables.test.d.ts +0 -6
  174. package/dist/src/config/extensions/variables.test.js +0 -103
  175. package/dist/src/config/extensions/variables.test.js.map +0 -1
  176. package/dist/src/config/keyBindings.test.d.ts +0 -6
  177. package/dist/src/config/keyBindings.test.js +0 -108
  178. package/dist/src/config/keyBindings.test.js.map +0 -1
  179. package/dist/src/config/mcp/mcpServerEnablement.test.d.ts +0 -6
  180. package/dist/src/config/mcp/mcpServerEnablement.test.js +0 -147
  181. package/dist/src/config/mcp/mcpServerEnablement.test.js.map +0 -1
  182. package/dist/src/config/policy-engine.integration.test.d.ts +0 -6
  183. package/dist/src/config/policy-engine.integration.test.js +0 -353
  184. package/dist/src/config/policy-engine.integration.test.js.map +0 -1
  185. package/dist/src/config/sandboxConfig.test.d.ts +0 -6
  186. package/dist/src/config/sandboxConfig.test.js +0 -184
  187. package/dist/src/config/sandboxConfig.test.js.map +0 -1
  188. package/dist/src/config/settingPaths.test.d.ts +0 -6
  189. package/dist/src/config/settingPaths.test.js +0 -22
  190. package/dist/src/config/settingPaths.test.js.map +0 -1
  191. package/dist/src/config/settings-validation.test.d.ts +0 -6
  192. package/dist/src/config/settings-validation.test.js +0 -370
  193. package/dist/src/config/settings-validation.test.js.map +0 -1
  194. package/dist/src/config/settings.test.d.ts +0 -6
  195. package/dist/src/config/settings.test.js +0 -1822
  196. package/dist/src/config/settings.test.js.map +0 -1
  197. package/dist/src/config/settingsSchema.test.d.ts +0 -6
  198. package/dist/src/config/settingsSchema.test.js +0 -309
  199. package/dist/src/config/settingsSchema.test.js.map +0 -1
  200. package/dist/src/config/settings_repro.test.d.ts +0 -6
  201. package/dist/src/config/settings_repro.test.js +0 -166
  202. package/dist/src/config/settings_repro.test.js.map +0 -1
  203. package/dist/src/config/settings_validation_warning.test.d.ts +0 -6
  204. package/dist/src/config/settings_validation_warning.test.js +0 -123
  205. package/dist/src/config/settings_validation_warning.test.js.map +0 -1
  206. package/dist/src/config/skills-backward-compatibility.test.d.ts +0 -6
  207. package/dist/src/config/skills-backward-compatibility.test.js +0 -99
  208. package/dist/src/config/skills-backward-compatibility.test.js.map +0 -1
  209. package/dist/src/config/trustedFolders.test.d.ts +0 -6
  210. package/dist/src/config/trustedFolders.test.js +0 -385
  211. package/dist/src/config/trustedFolders.test.js.map +0 -1
  212. package/dist/src/core/auth.test.d.ts +0 -6
  213. package/dist/src/core/auth.test.js +0 -47
  214. package/dist/src/core/auth.test.js.map +0 -1
  215. package/dist/src/core/initializer.test.d.ts +0 -6
  216. package/dist/src/core/initializer.test.js +0 -101
  217. package/dist/src/core/initializer.test.js.map +0 -1
  218. package/dist/src/core/theme.test.d.ts +0 -6
  219. package/dist/src/core/theme.test.js +0 -46
  220. package/dist/src/core/theme.test.js.map +0 -1
  221. package/dist/src/deferred.test.d.ts +0 -6
  222. package/dist/src/deferred.test.js +0 -164
  223. package/dist/src/deferred.test.js.map +0 -1
  224. package/dist/src/gemini.test.d.ts +0 -6
  225. package/dist/src/gemini.test.js +0 -1334
  226. package/dist/src/gemini.test.js.map +0 -1
  227. package/dist/src/gemini_cleanup.test.d.ts +0 -6
  228. package/dist/src/gemini_cleanup.test.js +0 -208
  229. package/dist/src/gemini_cleanup.test.js.map +0 -1
  230. package/dist/src/nonInteractiveCli.test.d.ts +0 -6
  231. package/dist/src/nonInteractiveCli.test.js +0 -1687
  232. package/dist/src/nonInteractiveCli.test.js.map +0 -1
  233. package/dist/src/services/BuiltinCommandLoader.test.d.ts +0 -6
  234. package/dist/src/services/BuiltinCommandLoader.test.js +0 -254
  235. package/dist/src/services/BuiltinCommandLoader.test.js.map +0 -1
  236. package/dist/src/services/CommandService.test.d.ts +0 -6
  237. package/dist/src/services/CommandService.test.js +0 -234
  238. package/dist/src/services/CommandService.test.js.map +0 -1
  239. package/dist/src/services/FileCommandLoader.test.d.ts +0 -6
  240. package/dist/src/services/FileCommandLoader.test.js +0 -1102
  241. package/dist/src/services/FileCommandLoader.test.js.map +0 -1
  242. package/dist/src/services/McpPromptLoader.test.d.ts +0 -6
  243. package/dist/src/services/McpPromptLoader.test.js +0 -411
  244. package/dist/src/services/McpPromptLoader.test.js.map +0 -1
  245. package/dist/src/services/prompt-processors/argumentProcessor.test.d.ts +0 -6
  246. package/dist/src/services/prompt-processors/argumentProcessor.test.js +0 -40
  247. package/dist/src/services/prompt-processors/argumentProcessor.test.js.map +0 -1
  248. package/dist/src/services/prompt-processors/atFileProcessor.test.d.ts +0 -6
  249. package/dist/src/services/prompt-processors/atFileProcessor.test.js +0 -174
  250. package/dist/src/services/prompt-processors/atFileProcessor.test.js.map +0 -1
  251. package/dist/src/services/prompt-processors/injectionParser.test.d.ts +0 -6
  252. package/dist/src/services/prompt-processors/injectionParser.test.js +0 -189
  253. package/dist/src/services/prompt-processors/injectionParser.test.js.map +0 -1
  254. package/dist/src/services/prompt-processors/shellProcessor.test.d.ts +0 -6
  255. package/dist/src/services/prompt-processors/shellProcessor.test.js +0 -514
  256. package/dist/src/services/prompt-processors/shellProcessor.test.js.map +0 -1
  257. package/dist/src/test-utils/mockCommandContext.test.d.ts +0 -6
  258. package/dist/src/test-utils/mockCommandContext.test.js +0 -51
  259. package/dist/src/test-utils/mockCommandContext.test.js.map +0 -1
  260. package/dist/src/test-utils/render.test.d.ts +0 -6
  261. package/dist/src/test-utils/render.test.js +0 -79
  262. package/dist/src/test-utils/render.test.js.map +0 -1
  263. package/dist/src/ui/App.test.d.ts +0 -6
  264. package/dist/src/ui/App.test.js +0 -218
  265. package/dist/src/ui/App.test.js.map +0 -1
  266. package/dist/src/ui/AppContainer.test.d.ts +0 -6
  267. package/dist/src/ui/AppContainer.test.js +0 -2072
  268. package/dist/src/ui/AppContainer.test.js.map +0 -1
  269. package/dist/src/ui/IdeIntegrationNudge.test.d.ts +0 -6
  270. package/dist/src/ui/IdeIntegrationNudge.test.js +0 -158
  271. package/dist/src/ui/IdeIntegrationNudge.test.js.map +0 -1
  272. package/dist/src/ui/auth/ApiAuthDialog.test.d.ts +0 -6
  273. package/dist/src/ui/auth/ApiAuthDialog.test.js +0 -109
  274. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +0 -1
  275. package/dist/src/ui/auth/AuthDialog.test.d.ts +0 -6
  276. package/dist/src/ui/auth/AuthDialog.test.js +0 -309
  277. package/dist/src/ui/auth/AuthDialog.test.js.map +0 -1
  278. package/dist/src/ui/auth/AuthInProgress.test.d.ts +0 -6
  279. package/dist/src/ui/auth/AuthInProgress.test.js +0 -81
  280. package/dist/src/ui/auth/AuthInProgress.test.js.map +0 -1
  281. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.d.ts +0 -6
  282. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js +0 -66
  283. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js.map +0 -1
  284. package/dist/src/ui/auth/useAuth.test.d.ts +0 -6
  285. package/dist/src/ui/auth/useAuth.test.js +0 -189
  286. package/dist/src/ui/auth/useAuth.test.js.map +0 -1
  287. package/dist/src/ui/commands/aboutCommand.test.d.ts +0 -6
  288. package/dist/src/ui/commands/aboutCommand.test.js +0 -143
  289. package/dist/src/ui/commands/aboutCommand.test.js.map +0 -1
  290. package/dist/src/ui/commands/agentsCommand.test.d.ts +0 -6
  291. package/dist/src/ui/commands/agentsCommand.test.js +0 -344
  292. package/dist/src/ui/commands/agentsCommand.test.js.map +0 -1
  293. package/dist/src/ui/commands/authCommand.test.d.ts +0 -6
  294. package/dist/src/ui/commands/authCommand.test.js +0 -98
  295. package/dist/src/ui/commands/authCommand.test.js.map +0 -1
  296. package/dist/src/ui/commands/bugCommand.test.d.ts +0 -6
  297. package/dist/src/ui/commands/bugCommand.test.js +0 -186
  298. package/dist/src/ui/commands/bugCommand.test.js.map +0 -1
  299. package/dist/src/ui/commands/chatCommand.test.d.ts +0 -6
  300. package/dist/src/ui/commands/chatCommand.test.js +0 -620
  301. package/dist/src/ui/commands/chatCommand.test.js.map +0 -1
  302. package/dist/src/ui/commands/clearCommand.test.d.ts +0 -6
  303. package/dist/src/ui/commands/clearCommand.test.js +0 -87
  304. package/dist/src/ui/commands/clearCommand.test.js.map +0 -1
  305. package/dist/src/ui/commands/compressCommand.test.d.ts +0 -6
  306. package/dist/src/ui/commands/compressCommand.test.js +0 -98
  307. package/dist/src/ui/commands/compressCommand.test.js.map +0 -1
  308. package/dist/src/ui/commands/copyCommand.test.d.ts +0 -6
  309. package/dist/src/ui/commands/copyCommand.test.js +0 -242
  310. package/dist/src/ui/commands/copyCommand.test.js.map +0 -1
  311. package/dist/src/ui/commands/corgiCommand.test.d.ts +0 -6
  312. package/dist/src/ui/commands/corgiCommand.test.js +0 -28
  313. package/dist/src/ui/commands/corgiCommand.test.js.map +0 -1
  314. package/dist/src/ui/commands/directoryCommand.test.d.ts +0 -6
  315. package/dist/src/ui/commands/directoryCommand.test.js +0 -353
  316. package/dist/src/ui/commands/directoryCommand.test.js.map +0 -1
  317. package/dist/src/ui/commands/docsCommand.test.d.ts +0 -6
  318. package/dist/src/ui/commands/docsCommand.test.js +0 -72
  319. package/dist/src/ui/commands/docsCommand.test.js.map +0 -1
  320. package/dist/src/ui/commands/editorCommand.test.d.ts +0 -6
  321. package/dist/src/ui/commands/editorCommand.test.js +0 -27
  322. package/dist/src/ui/commands/editorCommand.test.js.map +0 -1
  323. package/dist/src/ui/commands/extensionsCommand.test.d.ts +0 -6
  324. package/dist/src/ui/commands/extensionsCommand.test.js +0 -778
  325. package/dist/src/ui/commands/extensionsCommand.test.js.map +0 -1
  326. package/dist/src/ui/commands/helpCommand.test.d.ts +0 -6
  327. package/dist/src/ui/commands/helpCommand.test.js +0 -42
  328. package/dist/src/ui/commands/helpCommand.test.js.map +0 -1
  329. package/dist/src/ui/commands/hooksCommand.test.d.ts +0 -6
  330. package/dist/src/ui/commands/hooksCommand.test.js +0 -572
  331. package/dist/src/ui/commands/hooksCommand.test.js.map +0 -1
  332. package/dist/src/ui/commands/ideCommand.test.d.ts +0 -6
  333. package/dist/src/ui/commands/ideCommand.test.js +0 -203
  334. package/dist/src/ui/commands/ideCommand.test.js.map +0 -1
  335. package/dist/src/ui/commands/initCommand.test.d.ts +0 -6
  336. package/dist/src/ui/commands/initCommand.test.js +0 -84
  337. package/dist/src/ui/commands/initCommand.test.js.map +0 -1
  338. package/dist/src/ui/commands/mcpCommand.test.d.ts +0 -6
  339. package/dist/src/ui/commands/mcpCommand.test.js +0 -189
  340. package/dist/src/ui/commands/mcpCommand.test.js.map +0 -1
  341. package/dist/src/ui/commands/memoryCommand.test.d.ts +0 -6
  342. package/dist/src/ui/commands/memoryCommand.test.js +0 -350
  343. package/dist/src/ui/commands/memoryCommand.test.js.map +0 -1
  344. package/dist/src/ui/commands/modelCommand.test.d.ts +0 -6
  345. package/dist/src/ui/commands/modelCommand.test.js +0 -41
  346. package/dist/src/ui/commands/modelCommand.test.js.map +0 -1
  347. package/dist/src/ui/commands/permissionsCommand.test.d.ts +0 -6
  348. package/dist/src/ui/commands/permissionsCommand.test.js +0 -86
  349. package/dist/src/ui/commands/permissionsCommand.test.js.map +0 -1
  350. package/dist/src/ui/commands/policiesCommand.test.d.ts +0 -6
  351. package/dist/src/ui/commands/policiesCommand.test.js +0 -87
  352. package/dist/src/ui/commands/policiesCommand.test.js.map +0 -1
  353. package/dist/src/ui/commands/privacyCommand.test.d.ts +0 -6
  354. package/dist/src/ui/commands/privacyCommand.test.js +0 -32
  355. package/dist/src/ui/commands/privacyCommand.test.js.map +0 -1
  356. package/dist/src/ui/commands/quitCommand.test.d.ts +0 -6
  357. package/dist/src/ui/commands/quitCommand.test.js +0 -50
  358. package/dist/src/ui/commands/quitCommand.test.js.map +0 -1
  359. package/dist/src/ui/commands/restoreCommand.test.d.ts +0 -6
  360. package/dist/src/ui/commands/restoreCommand.test.js +0 -190
  361. package/dist/src/ui/commands/restoreCommand.test.js.map +0 -1
  362. package/dist/src/ui/commands/rewindCommand.test.d.ts +0 -6
  363. package/dist/src/ui/commands/rewindCommand.test.js +0 -242
  364. package/dist/src/ui/commands/rewindCommand.test.js.map +0 -1
  365. package/dist/src/ui/commands/settingsCommand.test.d.ts +0 -6
  366. package/dist/src/ui/commands/settingsCommand.test.js +0 -30
  367. package/dist/src/ui/commands/settingsCommand.test.js.map +0 -1
  368. package/dist/src/ui/commands/setupGithubCommand.test.d.ts +0 -6
  369. package/dist/src/ui/commands/setupGithubCommand.test.js +0 -238
  370. package/dist/src/ui/commands/setupGithubCommand.test.js.map +0 -1
  371. package/dist/src/ui/commands/skillsCommand.test.d.ts +0 -6
  372. package/dist/src/ui/commands/skillsCommand.test.js +0 -426
  373. package/dist/src/ui/commands/skillsCommand.test.js.map +0 -1
  374. package/dist/src/ui/commands/statsCommand.test.d.ts +0 -6
  375. package/dist/src/ui/commands/statsCommand.test.js +0 -70
  376. package/dist/src/ui/commands/statsCommand.test.js.map +0 -1
  377. package/dist/src/ui/commands/terminalSetupCommand.test.d.ts +0 -6
  378. package/dist/src/ui/commands/terminalSetupCommand.test.js +0 -66
  379. package/dist/src/ui/commands/terminalSetupCommand.test.js.map +0 -1
  380. package/dist/src/ui/commands/themeCommand.test.d.ts +0 -6
  381. package/dist/src/ui/commands/themeCommand.test.js +0 -32
  382. package/dist/src/ui/commands/themeCommand.test.js.map +0 -1
  383. package/dist/src/ui/commands/toolsCommand.test.d.ts +0 -6
  384. package/dist/src/ui/commands/toolsCommand.test.js +0 -100
  385. package/dist/src/ui/commands/toolsCommand.test.js.map +0 -1
  386. package/dist/src/ui/components/AboutBox.test.d.ts +0 -6
  387. package/dist/src/ui/components/AboutBox.test.js +0 -59
  388. package/dist/src/ui/components/AboutBox.test.js.map +0 -1
  389. package/dist/src/ui/components/AdminSettingsChangedDialog.test.d.ts +0 -6
  390. package/dist/src/ui/components/AdminSettingsChangedDialog.test.js +0 -43
  391. package/dist/src/ui/components/AdminSettingsChangedDialog.test.js.map +0 -1
  392. package/dist/src/ui/components/AgentConfigDialog.test.d.ts +0 -6
  393. package/dist/src/ui/components/AgentConfigDialog.test.js +0 -241
  394. package/dist/src/ui/components/AgentConfigDialog.test.js.map +0 -1
  395. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.d.ts +0 -6
  396. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +0 -190
  397. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +0 -1
  398. package/dist/src/ui/components/AnsiOutput.test.d.ts +0 -6
  399. package/dist/src/ui/components/AnsiOutput.test.js +0 -92
  400. package/dist/src/ui/components/AnsiOutput.test.js.map +0 -1
  401. package/dist/src/ui/components/AppHeader.test.d.ts +0 -6
  402. package/dist/src/ui/components/AppHeader.test.js +0 -225
  403. package/dist/src/ui/components/AppHeader.test.js.map +0 -1
  404. package/dist/src/ui/components/ApprovalModeIndicator.test.d.ts +0 -6
  405. package/dist/src/ui/components/ApprovalModeIndicator.test.js +0 -37
  406. package/dist/src/ui/components/ApprovalModeIndicator.test.js.map +0 -1
  407. package/dist/src/ui/components/AskUserDialog.test.d.ts +0 -6
  408. package/dist/src/ui/components/AskUserDialog.test.js +0 -598
  409. package/dist/src/ui/components/AskUserDialog.test.js.map +0 -1
  410. package/dist/src/ui/components/Banner.test.d.ts +0 -6
  411. package/dist/src/ui/components/Banner.test.js +0 -24
  412. package/dist/src/ui/components/Banner.test.js.map +0 -1
  413. package/dist/src/ui/components/CliSpinner.test.d.ts +0 -6
  414. package/dist/src/ui/components/CliSpinner.test.js +0 -28
  415. package/dist/src/ui/components/CliSpinner.test.js.map +0 -1
  416. package/dist/src/ui/components/Composer.test.d.ts +0 -6
  417. package/dist/src/ui/components/Composer.test.js +0 -383
  418. package/dist/src/ui/components/Composer.test.js.map +0 -1
  419. package/dist/src/ui/components/ConfigInitDisplay.test.d.ts +0 -6
  420. package/dist/src/ui/components/ConfigInitDisplay.test.js +0 -117
  421. package/dist/src/ui/components/ConfigInitDisplay.test.js.map +0 -1
  422. package/dist/src/ui/components/ConsentPrompt.test.d.ts +0 -6
  423. package/dist/src/ui/components/ConsentPrompt.test.js +0 -77
  424. package/dist/src/ui/components/ConsentPrompt.test.js.map +0 -1
  425. package/dist/src/ui/components/ConsoleSummaryDisplay.test.d.ts +0 -6
  426. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js +0 -26
  427. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js.map +0 -1
  428. package/dist/src/ui/components/ContextSummaryDisplay.test.d.ts +0 -6
  429. package/dist/src/ui/components/ContextSummaryDisplay.test.js +0 -102
  430. package/dist/src/ui/components/ContextSummaryDisplay.test.js.map +0 -1
  431. package/dist/src/ui/components/ContextUsageDisplay.test.d.ts +0 -6
  432. package/dist/src/ui/components/ContextUsageDisplay.test.js +0 -43
  433. package/dist/src/ui/components/ContextUsageDisplay.test.js.map +0 -1
  434. package/dist/src/ui/components/CopyModeWarning.test.d.ts +0 -6
  435. package/dist/src/ui/components/CopyModeWarning.test.js +0 -33
  436. package/dist/src/ui/components/CopyModeWarning.test.js.map +0 -1
  437. package/dist/src/ui/components/DebugProfiler.test.d.ts +0 -6
  438. package/dist/src/ui/components/DebugProfiler.test.js +0 -229
  439. package/dist/src/ui/components/DebugProfiler.test.js.map +0 -1
  440. package/dist/src/ui/components/DetailedMessagesDisplay.test.d.ts +0 -6
  441. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +0 -39
  442. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +0 -1
  443. package/dist/src/ui/components/DialogManager.test.d.ts +0 -6
  444. package/dist/src/ui/components/DialogManager.test.js +0 -177
  445. package/dist/src/ui/components/DialogManager.test.js.map +0 -1
  446. package/dist/src/ui/components/EditorSettingsDialog.test.d.ts +0 -6
  447. package/dist/src/ui/components/EditorSettingsDialog.test.js +0 -119
  448. package/dist/src/ui/components/EditorSettingsDialog.test.js.map +0 -1
  449. package/dist/src/ui/components/ExitWarning.test.d.ts +0 -6
  450. package/dist/src/ui/components/ExitWarning.test.js +0 -54
  451. package/dist/src/ui/components/ExitWarning.test.js.map +0 -1
  452. package/dist/src/ui/components/FolderTrustDialog.test.d.ts +0 -6
  453. package/dist/src/ui/components/FolderTrustDialog.test.js +0 -102
  454. package/dist/src/ui/components/FolderTrustDialog.test.js.map +0 -1
  455. package/dist/src/ui/components/Footer.test.d.ts +0 -6
  456. package/dist/src/ui/components/Footer.test.js +0 -321
  457. package/dist/src/ui/components/Footer.test.js.map +0 -1
  458. package/dist/src/ui/components/GeminiRespondingSpinner.test.d.ts +0 -6
  459. package/dist/src/ui/components/GeminiRespondingSpinner.test.js +0 -61
  460. package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +0 -1
  461. package/dist/src/ui/components/GradientRegression.test.d.ts +0 -6
  462. package/dist/src/ui/components/GradientRegression.test.js +0 -105
  463. package/dist/src/ui/components/GradientRegression.test.js.map +0 -1
  464. package/dist/src/ui/components/Header.test.d.ts +0 -6
  465. package/dist/src/ui/components/Header.test.js +0 -147
  466. package/dist/src/ui/components/Header.test.js.map +0 -1
  467. package/dist/src/ui/components/Help.test.d.ts +0 -6
  468. package/dist/src/ui/components/Help.test.js +0 -67
  469. package/dist/src/ui/components/Help.test.js.map +0 -1
  470. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +0 -6
  471. package/dist/src/ui/components/HistoryItemDisplay.test.js +0 -207
  472. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +0 -1
  473. package/dist/src/ui/components/HookStatusDisplay.test.d.ts +0 -6
  474. package/dist/src/ui/components/HookStatusDisplay.test.js +0 -51
  475. package/dist/src/ui/components/HookStatusDisplay.test.js.map +0 -1
  476. package/dist/src/ui/components/IdeTrustChangeDialog.test.d.ts +0 -6
  477. package/dist/src/ui/components/IdeTrustChangeDialog.test.js +0 -58
  478. package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +0 -1
  479. package/dist/src/ui/components/InputPrompt.test.d.ts +0 -6
  480. package/dist/src/ui/components/InputPrompt.test.js +0 -2596
  481. package/dist/src/ui/components/InputPrompt.test.js.map +0 -1
  482. package/dist/src/ui/components/LoadingIndicator.test.d.ts +0 -6
  483. package/dist/src/ui/components/LoadingIndicator.test.js +0 -207
  484. package/dist/src/ui/components/LoadingIndicator.test.js.map +0 -1
  485. package/dist/src/ui/components/LogoutConfirmationDialog.test.d.ts +0 -6
  486. package/dist/src/ui/components/LogoutConfirmationDialog.test.js +0 -59
  487. package/dist/src/ui/components/LogoutConfirmationDialog.test.js.map +0 -1
  488. package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +0 -6
  489. package/dist/src/ui/components/LoopDetectionConfirmation.test.js +0 -25
  490. package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +0 -1
  491. package/dist/src/ui/components/MainContent.test.d.ts +0 -6
  492. package/dist/src/ui/components/MainContent.test.js +0 -83
  493. package/dist/src/ui/components/MainContent.test.js.map +0 -1
  494. package/dist/src/ui/components/MemoryUsageDisplay.test.d.ts +0 -6
  495. package/dist/src/ui/components/MemoryUsageDisplay.test.js +0 -49
  496. package/dist/src/ui/components/MemoryUsageDisplay.test.js.map +0 -1
  497. package/dist/src/ui/components/ModelDialog.test.d.ts +0 -6
  498. package/dist/src/ui/components/ModelDialog.test.js +0 -197
  499. package/dist/src/ui/components/ModelDialog.test.js.map +0 -1
  500. package/dist/src/ui/components/ModelStatsDisplay.test.d.ts +0 -6
  501. package/dist/src/ui/components/ModelStatsDisplay.test.js +0 -343
  502. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +0 -1
  503. package/dist/src/ui/components/MultiFolderTrustDialog.test.d.ts +0 -6
  504. package/dist/src/ui/components/MultiFolderTrustDialog.test.js +0 -162
  505. package/dist/src/ui/components/MultiFolderTrustDialog.test.js.map +0 -1
  506. package/dist/src/ui/components/NewAgentsNotification.test.d.ts +0 -6
  507. package/dist/src/ui/components/NewAgentsNotification.test.js +0 -48
  508. package/dist/src/ui/components/NewAgentsNotification.test.js.map +0 -1
  509. package/dist/src/ui/components/Notifications.test.d.ts +0 -6
  510. package/dist/src/ui/components/Notifications.test.js +0 -164
  511. package/dist/src/ui/components/Notifications.test.js.map +0 -1
  512. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.d.ts +0 -6
  513. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +0 -162
  514. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +0 -1
  515. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +0 -6
  516. package/dist/src/ui/components/ProQuotaDialog.test.js +0 -191
  517. package/dist/src/ui/components/ProQuotaDialog.test.js.map +0 -1
  518. package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +0 -6
  519. package/dist/src/ui/components/QueuedMessageDisplay.test.js +0 -65
  520. package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +0 -1
  521. package/dist/src/ui/components/QuittingDisplay.test.d.ts +0 -6
  522. package/dist/src/ui/components/QuittingDisplay.test.js +0 -49
  523. package/dist/src/ui/components/QuittingDisplay.test.js.map +0 -1
  524. package/dist/src/ui/components/RawMarkdownIndicator.test.d.ts +0 -6
  525. package/dist/src/ui/components/RawMarkdownIndicator.test.js +0 -34
  526. package/dist/src/ui/components/RawMarkdownIndicator.test.js.map +0 -1
  527. package/dist/src/ui/components/RewindConfirmation.test.d.ts +0 -6
  528. package/dist/src/ui/components/RewindConfirmation.test.js +0 -53
  529. package/dist/src/ui/components/RewindConfirmation.test.js.map +0 -1
  530. package/dist/src/ui/components/RewindViewer.test.d.ts +0 -6
  531. package/dist/src/ui/components/RewindViewer.test.js +0 -241
  532. package/dist/src/ui/components/RewindViewer.test.js.map +0 -1
  533. package/dist/src/ui/components/SessionBrowser.test.d.ts +0 -6
  534. package/dist/src/ui/components/SessionBrowser.test.js +0 -256
  535. package/dist/src/ui/components/SessionBrowser.test.js.map +0 -1
  536. package/dist/src/ui/components/SessionSummaryDisplay.test.d.ts +0 -6
  537. package/dist/src/ui/components/SessionSummaryDisplay.test.js +0 -75
  538. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +0 -1
  539. package/dist/src/ui/components/SettingsDialog.test.d.ts +0 -6
  540. package/dist/src/ui/components/SettingsDialog.test.js +0 -1150
  541. package/dist/src/ui/components/SettingsDialog.test.js.map +0 -1
  542. package/dist/src/ui/components/ShellInputPrompt.test.d.ts +0 -6
  543. package/dist/src/ui/components/ShellInputPrompt.test.js +0 -91
  544. package/dist/src/ui/components/ShellInputPrompt.test.js.map +0 -1
  545. package/dist/src/ui/components/ShellModeIndicator.test.d.ts +0 -6
  546. package/dist/src/ui/components/ShellModeIndicator.test.js +0 -17
  547. package/dist/src/ui/components/ShellModeIndicator.test.js.map +0 -1
  548. package/dist/src/ui/components/ShowMoreLines.test.d.ts +0 -6
  549. package/dist/src/ui/components/ShowMoreLines.test.js +0 -40
  550. package/dist/src/ui/components/ShowMoreLines.test.js.map +0 -1
  551. package/dist/src/ui/components/StatsDisplay.test.d.ts +0 -6
  552. package/dist/src/ui/components/StatsDisplay.test.js +0 -438
  553. package/dist/src/ui/components/StatsDisplay.test.js.map +0 -1
  554. package/dist/src/ui/components/StatusDisplay.test.d.ts +0 -6
  555. package/dist/src/ui/components/StatusDisplay.test.js +0 -155
  556. package/dist/src/ui/components/StatusDisplay.test.js.map +0 -1
  557. package/dist/src/ui/components/StickyHeader.test.d.ts +0 -6
  558. package/dist/src/ui/components/StickyHeader.test.js +0 -17
  559. package/dist/src/ui/components/StickyHeader.test.js.map +0 -1
  560. package/dist/src/ui/components/SuggestionsDisplay.test.d.ts +0 -6
  561. package/dist/src/ui/components/SuggestionsDisplay.test.js +0 -56
  562. package/dist/src/ui/components/SuggestionsDisplay.test.js.map +0 -1
  563. package/dist/src/ui/components/Table.test.d.ts +0 -6
  564. package/dist/src/ui/components/Table.test.js +0 -53
  565. package/dist/src/ui/components/Table.test.js.map +0 -1
  566. package/dist/src/ui/components/ThemeDialog.test.d.ts +0 -6
  567. package/dist/src/ui/components/ThemeDialog.test.js +0 -167
  568. package/dist/src/ui/components/ThemeDialog.test.js.map +0 -1
  569. package/dist/src/ui/components/ThemedGradient.test.d.ts +0 -6
  570. package/dist/src/ui/components/ThemedGradient.test.js +0 -30
  571. package/dist/src/ui/components/ThemedGradient.test.js.map +0 -1
  572. package/dist/src/ui/components/Tips.test.d.ts +0 -6
  573. package/dist/src/ui/components/Tips.test.js +0 -23
  574. package/dist/src/ui/components/Tips.test.js.map +0 -1
  575. package/dist/src/ui/components/ToolConfirmationQueue.test.d.ts +0 -6
  576. package/dist/src/ui/components/ToolConfirmationQueue.test.js +0 -71
  577. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +0 -1
  578. package/dist/src/ui/components/ToolStatsDisplay.test.d.ts +0 -6
  579. package/dist/src/ui/components/ToolStatsDisplay.test.js +0 -227
  580. package/dist/src/ui/components/ToolStatsDisplay.test.js.map +0 -1
  581. package/dist/src/ui/components/UpdateNotification.test.d.ts +0 -6
  582. package/dist/src/ui/components/UpdateNotification.test.js +0 -16
  583. package/dist/src/ui/components/UpdateNotification.test.js.map +0 -1
  584. package/dist/src/ui/components/ValidationDialog.test.d.ts +0 -6
  585. package/dist/src/ui/components/ValidationDialog.test.js +0 -153
  586. package/dist/src/ui/components/ValidationDialog.test.js.map +0 -1
  587. package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +0 -6
  588. package/dist/src/ui/components/messages/CompressionMessage.test.js +0 -191
  589. package/dist/src/ui/components/messages/CompressionMessage.test.js.map +0 -1
  590. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +0 -6
  591. package/dist/src/ui/components/messages/DiffRenderer.test.js +0 -240
  592. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +0 -1
  593. package/dist/src/ui/components/messages/ErrorMessage.test.d.ts +0 -6
  594. package/dist/src/ui/components/messages/ErrorMessage.test.js +0 -23
  595. package/dist/src/ui/components/messages/ErrorMessage.test.js.map +0 -1
  596. package/dist/src/ui/components/messages/GeminiMessage.test.d.ts +0 -6
  597. package/dist/src/ui/components/messages/GeminiMessage.test.js +0 -35
  598. package/dist/src/ui/components/messages/GeminiMessage.test.js.map +0 -1
  599. package/dist/src/ui/components/messages/InfoMessage.test.d.ts +0 -6
  600. package/dist/src/ui/components/messages/InfoMessage.test.js +0 -28
  601. package/dist/src/ui/components/messages/InfoMessage.test.js.map +0 -1
  602. package/dist/src/ui/components/messages/RedirectionConfirmation.test.d.ts +0 -6
  603. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +0 -33
  604. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +0 -1
  605. package/dist/src/ui/components/messages/ShellToolMessage.test.d.ts +0 -6
  606. package/dist/src/ui/components/messages/ShellToolMessage.test.js +0 -123
  607. package/dist/src/ui/components/messages/ShellToolMessage.test.js.map +0 -1
  608. package/dist/src/ui/components/messages/Todo.test.d.ts +0 -6
  609. package/dist/src/ui/components/messages/Todo.test.js +0 -114
  610. package/dist/src/ui/components/messages/Todo.test.js.map +0 -1
  611. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +0 -6
  612. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -232
  613. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +0 -1
  614. package/dist/src/ui/components/messages/ToolGroupMessage.test.d.ts +0 -6
  615. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +0 -529
  616. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +0 -1
  617. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +0 -6
  618. package/dist/src/ui/components/messages/ToolMessage.test.js +0 -217
  619. package/dist/src/ui/components/messages/ToolMessage.test.js.map +0 -1
  620. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.d.ts +0 -6
  621. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js +0 -89
  622. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js.map +0 -1
  623. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.d.ts +0 -6
  624. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js +0 -62
  625. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js.map +0 -1
  626. package/dist/src/ui/components/messages/ToolResultDisplay.test.d.ts +0 -6
  627. package/dist/src/ui/components/messages/ToolResultDisplay.test.js +0 -114
  628. package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +0 -1
  629. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.d.ts +0 -6
  630. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js +0 -134
  631. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js.map +0 -1
  632. package/dist/src/ui/components/messages/UserMessage.test.d.ts +0 -6
  633. package/dist/src/ui/components/messages/UserMessage.test.js +0 -32
  634. package/dist/src/ui/components/messages/UserMessage.test.js.map +0 -1
  635. package/dist/src/ui/components/messages/WarningMessage.test.d.ts +0 -6
  636. package/dist/src/ui/components/messages/WarningMessage.test.js +0 -23
  637. package/dist/src/ui/components/messages/WarningMessage.test.js.map +0 -1
  638. package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +0 -6
  639. package/dist/src/ui/components/shared/BaseSelectionList.test.js +0 -386
  640. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +0 -1
  641. package/dist/src/ui/components/shared/BaseSettingsDialog.test.d.ts +0 -6
  642. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js +0 -434
  643. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js.map +0 -1
  644. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +0 -6
  645. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +0 -79
  646. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +0 -1
  647. package/dist/src/ui/components/shared/EnumSelector.test.d.ts +0 -6
  648. package/dist/src/ui/components/shared/EnumSelector.test.js +0 -70
  649. package/dist/src/ui/components/shared/EnumSelector.test.js.map +0 -1
  650. package/dist/src/ui/components/shared/ExpandableText.test.d.ts +0 -6
  651. package/dist/src/ui/components/shared/ExpandableText.test.js +0 -88
  652. package/dist/src/ui/components/shared/ExpandableText.test.js.map +0 -1
  653. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.d.ts +0 -6
  654. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js +0 -34
  655. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js.map +0 -1
  656. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +0 -6
  657. package/dist/src/ui/components/shared/MaxSizedBox.test.js +0 -90
  658. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +0 -1
  659. package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +0 -6
  660. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +0 -134
  661. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +0 -1
  662. package/dist/src/ui/components/shared/Scrollable.test.d.ts +0 -6
  663. package/dist/src/ui/components/shared/Scrollable.test.js +0 -74
  664. package/dist/src/ui/components/shared/Scrollable.test.js.map +0 -1
  665. package/dist/src/ui/components/shared/ScrollableList.test.d.ts +0 -6
  666. package/dist/src/ui/components/shared/ScrollableList.test.js +0 -241
  667. package/dist/src/ui/components/shared/ScrollableList.test.js.map +0 -1
  668. package/dist/src/ui/components/shared/TabHeader.test.d.ts +0 -6
  669. package/dist/src/ui/components/shared/TabHeader.test.js +0 -106
  670. package/dist/src/ui/components/shared/TabHeader.test.js.map +0 -1
  671. package/dist/src/ui/components/shared/TextInput.test.d.ts +0 -6
  672. package/dist/src/ui/components/shared/TextInput.test.js +0 -242
  673. package/dist/src/ui/components/shared/TextInput.test.js.map +0 -1
  674. package/dist/src/ui/components/shared/VirtualizedList.test.d.ts +0 -6
  675. package/dist/src/ui/components/shared/VirtualizedList.test.js +0 -171
  676. package/dist/src/ui/components/shared/VirtualizedList.test.js.map +0 -1
  677. package/dist/src/ui/components/shared/performance.test.d.ts +0 -1
  678. package/dist/src/ui/components/shared/performance.test.js +0 -67
  679. package/dist/src/ui/components/shared/performance.test.js.map +0 -1
  680. package/dist/src/ui/components/shared/text-buffer.test.d.ts +0 -6
  681. package/dist/src/ui/components/shared/text-buffer.test.js +0 -2490
  682. package/dist/src/ui/components/shared/text-buffer.test.js.map +0 -1
  683. package/dist/src/ui/components/shared/vim-buffer-actions.test.d.ts +0 -6
  684. package/dist/src/ui/components/shared/vim-buffer-actions.test.js +0 -964
  685. package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +0 -1
  686. package/dist/src/ui/components/views/ChatList.test.d.ts +0 -6
  687. package/dist/src/ui/components/views/ChatList.test.js +0 -45
  688. package/dist/src/ui/components/views/ChatList.test.js.map +0 -1
  689. package/dist/src/ui/components/views/ExtensionsList.test.d.ts +0 -6
  690. package/dist/src/ui/components/views/ExtensionsList.test.js +0 -148
  691. package/dist/src/ui/components/views/ExtensionsList.test.js.map +0 -1
  692. package/dist/src/ui/components/views/McpStatus.test.d.ts +0 -6
  693. package/dist/src/ui/components/views/McpStatus.test.js +0 -153
  694. package/dist/src/ui/components/views/McpStatus.test.js.map +0 -1
  695. package/dist/src/ui/components/views/SkillsList.test.d.ts +0 -6
  696. package/dist/src/ui/components/views/SkillsList.test.js +0 -97
  697. package/dist/src/ui/components/views/SkillsList.test.js.map +0 -1
  698. package/dist/src/ui/components/views/ToolsList.test.d.ts +0 -6
  699. package/dist/src/ui/components/views/ToolsList.test.js +0 -45
  700. package/dist/src/ui/components/views/ToolsList.test.js.map +0 -1
  701. package/dist/src/ui/contexts/KeypressContext.test.d.ts +0 -6
  702. package/dist/src/ui/contexts/KeypressContext.test.js +0 -957
  703. package/dist/src/ui/contexts/KeypressContext.test.js.map +0 -1
  704. package/dist/src/ui/contexts/MouseContext.test.d.ts +0 -6
  705. package/dist/src/ui/contexts/MouseContext.test.js +0 -198
  706. package/dist/src/ui/contexts/MouseContext.test.js.map +0 -1
  707. package/dist/src/ui/contexts/ScrollProvider.drag.test.d.ts +0 -6
  708. package/dist/src/ui/contexts/ScrollProvider.drag.test.js +0 -319
  709. package/dist/src/ui/contexts/ScrollProvider.drag.test.js.map +0 -1
  710. package/dist/src/ui/contexts/ScrollProvider.test.d.ts +0 -6
  711. package/dist/src/ui/contexts/ScrollProvider.test.js +0 -377
  712. package/dist/src/ui/contexts/ScrollProvider.test.js.map +0 -1
  713. package/dist/src/ui/contexts/SessionContext.test.d.ts +0 -6
  714. package/dist/src/ui/contexts/SessionContext.test.js +0 -198
  715. package/dist/src/ui/contexts/SessionContext.test.js.map +0 -1
  716. package/dist/src/ui/contexts/ToolActionsContext.test.d.ts +0 -6
  717. package/dist/src/ui/contexts/ToolActionsContext.test.js +0 -166
  718. package/dist/src/ui/contexts/ToolActionsContext.test.js.map +0 -1
  719. package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +0 -6
  720. package/dist/src/ui/hooks/atCommandProcessor.test.js +0 -1032
  721. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +0 -1
  722. package/dist/src/ui/hooks/atCommandProcessor_agents.test.d.ts +0 -6
  723. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js +0 -183
  724. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js.map +0 -1
  725. package/dist/src/ui/hooks/shellCommandProcessor.test.d.ts +0 -6
  726. package/dist/src/ui/hooks/shellCommandProcessor.test.js +0 -521
  727. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +0 -1
  728. package/dist/src/ui/hooks/slashCommandProcessor.test.d.ts +0 -6
  729. package/dist/src/ui/hooks/slashCommandProcessor.test.js +0 -796
  730. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +0 -1
  731. package/dist/src/ui/hooks/toolMapping.test.d.ts +0 -6
  732. package/dist/src/ui/hooks/toolMapping.test.js +0 -209
  733. package/dist/src/ui/hooks/toolMapping.test.js.map +0 -1
  734. package/dist/src/ui/hooks/useAnimatedScrollbar.test.d.ts +0 -6
  735. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js +0 -85
  736. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js.map +0 -1
  737. package/dist/src/ui/hooks/useApprovalModeIndicator.test.d.ts +0 -6
  738. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js +0 -435
  739. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js.map +0 -1
  740. package/dist/src/ui/hooks/useAtCompletion.test.d.ts +0 -6
  741. package/dist/src/ui/hooks/useAtCompletion.test.js +0 -417
  742. package/dist/src/ui/hooks/useAtCompletion.test.js.map +0 -1
  743. package/dist/src/ui/hooks/useAtCompletion_agents.test.d.ts +0 -6
  744. package/dist/src/ui/hooks/useAtCompletion_agents.test.js +0 -87
  745. package/dist/src/ui/hooks/useAtCompletion_agents.test.js.map +0 -1
  746. package/dist/src/ui/hooks/useBanner.test.d.ts +0 -6
  747. package/dist/src/ui/hooks/useBanner.test.js +0 -92
  748. package/dist/src/ui/hooks/useBanner.test.js.map +0 -1
  749. package/dist/src/ui/hooks/useBatchedScroll.test.d.ts +0 -6
  750. package/dist/src/ui/hooks/useBatchedScroll.test.js +0 -62
  751. package/dist/src/ui/hooks/useBatchedScroll.test.js.map +0 -1
  752. package/dist/src/ui/hooks/useCommandCompletion.test.d.ts +0 -6
  753. package/dist/src/ui/hooks/useCommandCompletion.test.js +0 -462
  754. package/dist/src/ui/hooks/useCommandCompletion.test.js.map +0 -1
  755. package/dist/src/ui/hooks/useConsoleMessages.test.d.ts +0 -6
  756. package/dist/src/ui/hooks/useConsoleMessages.test.js +0 -159
  757. package/dist/src/ui/hooks/useConsoleMessages.test.js.map +0 -1
  758. package/dist/src/ui/hooks/useEditorSettings.test.d.ts +0 -6
  759. package/dist/src/ui/hooks/useEditorSettings.test.js +0 -179
  760. package/dist/src/ui/hooks/useEditorSettings.test.js.map +0 -1
  761. package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +0 -6
  762. package/dist/src/ui/hooks/useExtensionUpdates.test.js +0 -279
  763. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +0 -1
  764. package/dist/src/ui/hooks/useFlickerDetector.test.d.ts +0 -6
  765. package/dist/src/ui/hooks/useFlickerDetector.test.js +0 -106
  766. package/dist/src/ui/hooks/useFlickerDetector.test.js.map +0 -1
  767. package/dist/src/ui/hooks/useFocus.test.d.ts +0 -6
  768. package/dist/src/ui/hooks/useFocus.test.js +0 -131
  769. package/dist/src/ui/hooks/useFocus.test.js.map +0 -1
  770. package/dist/src/ui/hooks/useFolderTrust.test.d.ts +0 -6
  771. package/dist/src/ui/hooks/useFolderTrust.test.js +0 -218
  772. package/dist/src/ui/hooks/useFolderTrust.test.js.map +0 -1
  773. package/dist/src/ui/hooks/useGeminiStream.test.d.ts +0 -6
  774. package/dist/src/ui/hooks/useGeminiStream.test.js +0 -2149
  775. package/dist/src/ui/hooks/useGeminiStream.test.js.map +0 -1
  776. package/dist/src/ui/hooks/useGitBranchName.test.d.ts +0 -6
  777. package/dist/src/ui/hooks/useGitBranchName.test.js +0 -183
  778. package/dist/src/ui/hooks/useGitBranchName.test.js.map +0 -1
  779. package/dist/src/ui/hooks/useHistoryManager.test.d.ts +0 -6
  780. package/dist/src/ui/hooks/useHistoryManager.test.js +0 -188
  781. package/dist/src/ui/hooks/useHistoryManager.test.js.map +0 -1
  782. package/dist/src/ui/hooks/useHookDisplayState.test.d.ts +0 -6
  783. package/dist/src/ui/hooks/useHookDisplayState.test.js +0 -180
  784. package/dist/src/ui/hooks/useHookDisplayState.test.js.map +0 -1
  785. package/dist/src/ui/hooks/useIdeTrustListener.test.d.ts +0 -6
  786. package/dist/src/ui/hooks/useIdeTrustListener.test.js +0 -214
  787. package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +0 -1
  788. package/dist/src/ui/hooks/useIncludeDirsTrust.test.d.ts +0 -6
  789. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js +0 -172
  790. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +0 -1
  791. package/dist/src/ui/hooks/useInputHistory.test.d.ts +0 -6
  792. package/dist/src/ui/hooks/useInputHistory.test.js +0 -208
  793. package/dist/src/ui/hooks/useInputHistory.test.js.map +0 -1
  794. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +0 -6
  795. package/dist/src/ui/hooks/useInputHistoryStore.test.js +0 -238
  796. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +0 -1
  797. package/dist/src/ui/hooks/useKeypress.test.d.ts +0 -6
  798. package/dist/src/ui/hooks/useKeypress.test.js +0 -205
  799. package/dist/src/ui/hooks/useKeypress.test.js.map +0 -1
  800. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +0 -6
  801. package/dist/src/ui/hooks/useLoadingIndicator.test.js +0 -145
  802. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +0 -1
  803. package/dist/src/ui/hooks/useMcpStatus.test.d.ts +0 -6
  804. package/dist/src/ui/hooks/useMcpStatus.test.js +0 -69
  805. package/dist/src/ui/hooks/useMcpStatus.test.js.map +0 -1
  806. package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +0 -6
  807. package/dist/src/ui/hooks/useMemoryMonitor.test.js +0 -62
  808. package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +0 -1
  809. package/dist/src/ui/hooks/useMessageQueue.test.d.ts +0 -6
  810. package/dist/src/ui/hooks/useMessageQueue.test.js +0 -327
  811. package/dist/src/ui/hooks/useMessageQueue.test.js.map +0 -1
  812. package/dist/src/ui/hooks/useModelCommand.test.d.ts +0 -6
  813. package/dist/src/ui/hooks/useModelCommand.test.js +0 -45
  814. package/dist/src/ui/hooks/useModelCommand.test.js.map +0 -1
  815. package/dist/src/ui/hooks/useMouse.test.d.ts +0 -6
  816. package/dist/src/ui/hooks/useMouse.test.js +0 -57
  817. package/dist/src/ui/hooks/useMouse.test.js.map +0 -1
  818. package/dist/src/ui/hooks/useMouseClick.test.d.ts +0 -6
  819. package/dist/src/ui/hooks/useMouseClick.test.js +0 -59
  820. package/dist/src/ui/hooks/useMouseClick.test.js.map +0 -1
  821. package/dist/src/ui/hooks/useMouseDoubleClick.test.d.ts +0 -6
  822. package/dist/src/ui/hooks/useMouseDoubleClick.test.js +0 -125
  823. package/dist/src/ui/hooks/useMouseDoubleClick.test.js.map +0 -1
  824. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.d.ts +0 -6
  825. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +0 -291
  826. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +0 -1
  827. package/dist/src/ui/hooks/usePhraseCycler.test.d.ts +0 -6
  828. package/dist/src/ui/hooks/usePhraseCycler.test.js +0 -208
  829. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +0 -1
  830. package/dist/src/ui/hooks/usePrivacySettings.test.d.ts +0 -6
  831. package/dist/src/ui/hooks/usePrivacySettings.test.js +0 -104
  832. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +0 -1
  833. package/dist/src/ui/hooks/useQuotaAndFallback.test.d.ts +0 -6
  834. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +0 -477
  835. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +0 -1
  836. package/dist/src/ui/hooks/useReactToolScheduler.test.d.ts +0 -6
  837. package/dist/src/ui/hooks/useReactToolScheduler.test.js +0 -58
  838. package/dist/src/ui/hooks/useReactToolScheduler.test.js.map +0 -1
  839. package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +0 -6
  840. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +0 -169
  841. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +0 -1
  842. package/dist/src/ui/hooks/useRewind.test.d.ts +0 -6
  843. package/dist/src/ui/hooks/useRewind.test.js +0 -100
  844. package/dist/src/ui/hooks/useRewind.test.js.map +0 -1
  845. package/dist/src/ui/hooks/useSelectionList.test.d.ts +0 -6
  846. package/dist/src/ui/hooks/useSelectionList.test.js +0 -848
  847. package/dist/src/ui/hooks/useSelectionList.test.js.map +0 -1
  848. package/dist/src/ui/hooks/useSessionBrowser.test.d.ts +0 -6
  849. package/dist/src/ui/hooks/useSessionBrowser.test.js +0 -203
  850. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +0 -1
  851. package/dist/src/ui/hooks/useSessionResume.test.d.ts +0 -6
  852. package/dist/src/ui/hooks/useSessionResume.test.js +0 -336
  853. package/dist/src/ui/hooks/useSessionResume.test.js.map +0 -1
  854. package/dist/src/ui/hooks/useShellHistory.test.d.ts +0 -6
  855. package/dist/src/ui/hooks/useShellHistory.test.js +0 -223
  856. package/dist/src/ui/hooks/useShellHistory.test.js.map +0 -1
  857. package/dist/src/ui/hooks/useShellInactivityStatus.test.d.ts +0 -6
  858. package/dist/src/ui/hooks/useShellInactivityStatus.test.js +0 -84
  859. package/dist/src/ui/hooks/useShellInactivityStatus.test.js.map +0 -1
  860. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +0 -9
  861. package/dist/src/ui/hooks/useSlashCompletion.test.js +0 -845
  862. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +0 -1
  863. package/dist/src/ui/hooks/useSnowfall.test.d.ts +0 -6
  864. package/dist/src/ui/hooks/useSnowfall.test.js +0 -88
  865. package/dist/src/ui/hooks/useSnowfall.test.js.map +0 -1
  866. package/dist/src/ui/hooks/useTabbedNavigation.test.d.ts +0 -6
  867. package/dist/src/ui/hooks/useTabbedNavigation.test.js +0 -187
  868. package/dist/src/ui/hooks/useTabbedNavigation.test.js.map +0 -1
  869. package/dist/src/ui/hooks/useTimer.test.d.ts +0 -6
  870. package/dist/src/ui/hooks/useTimer.test.js +0 -119
  871. package/dist/src/ui/hooks/useTimer.test.js.map +0 -1
  872. package/dist/src/ui/hooks/useTips.test.d.ts +0 -6
  873. package/dist/src/ui/hooks/useTips.test.js +0 -33
  874. package/dist/src/ui/hooks/useTips.test.js.map +0 -1
  875. package/dist/src/ui/hooks/useToolExecutionScheduler.test.d.ts +0 -6
  876. package/dist/src/ui/hooks/useToolExecutionScheduler.test.js +0 -376
  877. package/dist/src/ui/hooks/useToolExecutionScheduler.test.js.map +0 -1
  878. package/dist/src/ui/hooks/useToolScheduler.test.d.ts +0 -6
  879. package/dist/src/ui/hooks/useToolScheduler.test.js +0 -881
  880. package/dist/src/ui/hooks/useToolScheduler.test.js.map +0 -1
  881. package/dist/src/ui/hooks/useToolSchedulerFacade.test.d.ts +0 -6
  882. package/dist/src/ui/hooks/useToolSchedulerFacade.test.js +0 -45
  883. package/dist/src/ui/hooks/useToolSchedulerFacade.test.js.map +0 -1
  884. package/dist/src/ui/hooks/useTurnActivityMonitor.test.d.ts +0 -6
  885. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js +0 -97
  886. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js.map +0 -1
  887. package/dist/src/ui/hooks/vim.test.d.ts +0 -6
  888. package/dist/src/ui/hooks/vim.test.js +0 -1384
  889. package/dist/src/ui/hooks/vim.test.js.map +0 -1
  890. package/dist/src/ui/keyMatchers.test.d.ts +0 -6
  891. package/dist/src/ui/keyMatchers.test.js +0 -386
  892. package/dist/src/ui/keyMatchers.test.js.map +0 -1
  893. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.d.ts +0 -6
  894. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js +0 -121
  895. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js.map +0 -1
  896. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.d.ts +0 -6
  897. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js +0 -34
  898. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js.map +0 -1
  899. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.d.ts +0 -6
  900. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js +0 -34
  901. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js.map +0 -1
  902. package/dist/src/ui/privacy/PrivacyNotice.test.d.ts +0 -6
  903. package/dist/src/ui/privacy/PrivacyNotice.test.js +0 -62
  904. package/dist/src/ui/privacy/PrivacyNotice.test.js.map +0 -1
  905. package/dist/src/ui/state/extensions.test.d.ts +0 -6
  906. package/dist/src/ui/state/extensions.test.js +0 -219
  907. package/dist/src/ui/state/extensions.test.js.map +0 -1
  908. package/dist/src/ui/themes/color-utils.test.d.ts +0 -6
  909. package/dist/src/ui/themes/color-utils.test.js +0 -245
  910. package/dist/src/ui/themes/color-utils.test.js.map +0 -1
  911. package/dist/src/ui/themes/theme-manager.test.d.ts +0 -6
  912. package/dist/src/ui/themes/theme-manager.test.js +0 -150
  913. package/dist/src/ui/themes/theme-manager.test.js.map +0 -1
  914. package/dist/src/ui/themes/theme.test.d.ts +0 -6
  915. package/dist/src/ui/themes/theme.test.js +0 -174
  916. package/dist/src/ui/themes/theme.test.js.map +0 -1
  917. package/dist/src/ui/utils/CodeColorizer.test.d.ts +0 -6
  918. package/dist/src/ui/utils/CodeColorizer.test.js +0 -38
  919. package/dist/src/ui/utils/CodeColorizer.test.js.map +0 -1
  920. package/dist/src/ui/utils/InlineMarkdownRenderer.test.d.ts +0 -6
  921. package/dist/src/ui/utils/InlineMarkdownRenderer.test.js +0 -21
  922. package/dist/src/ui/utils/InlineMarkdownRenderer.test.js.map +0 -1
  923. package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +0 -6
  924. package/dist/src/ui/utils/MarkdownDisplay.test.js +0 -159
  925. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +0 -1
  926. package/dist/src/ui/utils/clipboardUtils.test.d.ts +0 -6
  927. package/dist/src/ui/utils/clipboardUtils.test.js +0 -359
  928. package/dist/src/ui/utils/clipboardUtils.test.js.map +0 -1
  929. package/dist/src/ui/utils/clipboardUtils.windows.test.d.ts +0 -6
  930. package/dist/src/ui/utils/clipboardUtils.windows.test.js +0 -55
  931. package/dist/src/ui/utils/clipboardUtils.windows.test.js.map +0 -1
  932. package/dist/src/ui/utils/commandUtils.test.d.ts +0 -6
  933. package/dist/src/ui/utils/commandUtils.test.js +0 -479
  934. package/dist/src/ui/utils/commandUtils.test.js.map +0 -1
  935. package/dist/src/ui/utils/computeStats.test.d.ts +0 -6
  936. package/dist/src/ui/utils/computeStats.test.js +0 -271
  937. package/dist/src/ui/utils/computeStats.test.js.map +0 -1
  938. package/dist/src/ui/utils/directoryUtils.test.d.ts +0 -6
  939. package/dist/src/ui/utils/directoryUtils.test.js +0 -244
  940. package/dist/src/ui/utils/directoryUtils.test.js.map +0 -1
  941. package/dist/src/ui/utils/displayUtils.test.d.ts +0 -6
  942. package/dist/src/ui/utils/displayUtils.test.js +0 -61
  943. package/dist/src/ui/utils/displayUtils.test.js.map +0 -1
  944. package/dist/src/ui/utils/formatters.test.d.ts +0 -6
  945. package/dist/src/ui/utils/formatters.test.js +0 -124
  946. package/dist/src/ui/utils/formatters.test.js.map +0 -1
  947. package/dist/src/ui/utils/highlight.test.d.ts +0 -6
  948. package/dist/src/ui/utils/highlight.test.js +0 -198
  949. package/dist/src/ui/utils/highlight.test.js.map +0 -1
  950. package/dist/src/ui/utils/input.test.d.ts +0 -6
  951. package/dist/src/ui/utils/input.test.js +0 -44
  952. package/dist/src/ui/utils/input.test.js.map +0 -1
  953. package/dist/src/ui/utils/markdownUtilities.test.d.ts +0 -6
  954. package/dist/src/ui/utils/markdownUtilities.test.js +0 -42
  955. package/dist/src/ui/utils/markdownUtilities.test.js.map +0 -1
  956. package/dist/src/ui/utils/mouse.test.d.ts +0 -6
  957. package/dist/src/ui/utils/mouse.test.js +0 -136
  958. package/dist/src/ui/utils/mouse.test.js.map +0 -1
  959. package/dist/src/ui/utils/rewindFileOps.test.d.ts +0 -6
  960. package/dist/src/ui/utils/rewindFileOps.test.js +0 -375
  961. package/dist/src/ui/utils/rewindFileOps.test.js.map +0 -1
  962. package/dist/src/ui/utils/terminalCapabilityManager.test.d.ts +0 -6
  963. package/dist/src/ui/utils/terminalCapabilityManager.test.js +0 -220
  964. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +0 -1
  965. package/dist/src/ui/utils/terminalSetup.test.d.ts +0 -6
  966. package/dist/src/ui/utils/terminalSetup.test.js +0 -147
  967. package/dist/src/ui/utils/terminalSetup.test.js.map +0 -1
  968. package/dist/src/ui/utils/terminalUtils.test.d.ts +0 -6
  969. package/dist/src/ui/utils/terminalUtils.test.js +0 -40
  970. package/dist/src/ui/utils/terminalUtils.test.js.map +0 -1
  971. package/dist/src/ui/utils/textOutput.test.d.ts +0 -6
  972. package/dist/src/ui/utils/textOutput.test.js +0 -79
  973. package/dist/src/ui/utils/textOutput.test.js.map +0 -1
  974. package/dist/src/ui/utils/textUtils.test.d.ts +0 -6
  975. package/dist/src/ui/utils/textUtils.test.js +0 -168
  976. package/dist/src/ui/utils/textUtils.test.js.map +0 -1
  977. package/dist/src/ui/utils/ui-sizing.test.d.ts +0 -6
  978. package/dist/src/ui/utils/ui-sizing.test.js +0 -38
  979. package/dist/src/ui/utils/ui-sizing.test.js.map +0 -1
  980. package/dist/src/ui/utils/updateCheck.test.d.ts +0 -6
  981. package/dist/src/ui/utils/updateCheck.test.js +0 -134
  982. package/dist/src/ui/utils/updateCheck.test.js.map +0 -1
  983. package/dist/src/utils/agentUtils.test.d.ts +0 -6
  984. package/dist/src/utils/agentUtils.test.js +0 -121
  985. package/dist/src/utils/agentUtils.test.js.map +0 -1
  986. package/dist/src/utils/checks.test.d.ts +0 -6
  987. package/dist/src/utils/checks.test.js +0 -29
  988. package/dist/src/utils/checks.test.js.map +0 -1
  989. package/dist/src/utils/cleanup.test.d.ts +0 -6
  990. package/dist/src/utils/cleanup.test.js +0 -92
  991. package/dist/src/utils/cleanup.test.js.map +0 -1
  992. package/dist/src/utils/commands.test.d.ts +0 -6
  993. package/dist/src/utils/commands.test.js +0 -115
  994. package/dist/src/utils/commands.test.js.map +0 -1
  995. package/dist/src/utils/commentJson.test.d.ts +0 -6
  996. package/dist/src/utils/commentJson.test.js +0 -308
  997. package/dist/src/utils/commentJson.test.js.map +0 -1
  998. package/dist/src/utils/deepMerge.test.d.ts +0 -6
  999. package/dist/src/utils/deepMerge.test.js +0 -201
  1000. package/dist/src/utils/deepMerge.test.js.map +0 -1
  1001. package/dist/src/utils/dialogScopeUtils.test.d.ts +0 -6
  1002. package/dist/src/utils/dialogScopeUtils.test.js +0 -81
  1003. package/dist/src/utils/dialogScopeUtils.test.js.map +0 -1
  1004. package/dist/src/utils/envVarResolver.test.d.ts +0 -6
  1005. package/dist/src/utils/envVarResolver.test.js +0 -221
  1006. package/dist/src/utils/envVarResolver.test.js.map +0 -1
  1007. package/dist/src/utils/errors.test.d.ts +0 -6
  1008. package/dist/src/utils/errors.test.js +0 -435
  1009. package/dist/src/utils/errors.test.js.map +0 -1
  1010. package/dist/src/utils/events.test.d.ts +0 -6
  1011. package/dist/src/utils/events.test.js +0 -24
  1012. package/dist/src/utils/events.test.js.map +0 -1
  1013. package/dist/src/utils/gitUtils.test.d.ts +0 -6
  1014. package/dist/src/utils/gitUtils.test.js +0 -113
  1015. package/dist/src/utils/gitUtils.test.js.map +0 -1
  1016. package/dist/src/utils/handleAutoUpdate.test.d.ts +0 -6
  1017. package/dist/src/utils/handleAutoUpdate.test.js +0 -310
  1018. package/dist/src/utils/handleAutoUpdate.test.js.map +0 -1
  1019. package/dist/src/utils/installationInfo.test.d.ts +0 -6
  1020. package/dist/src/utils/installationInfo.test.js +0 -296
  1021. package/dist/src/utils/installationInfo.test.js.map +0 -1
  1022. package/dist/src/utils/jsonoutput.test.d.ts +0 -6
  1023. package/dist/src/utils/jsonoutput.test.js +0 -74
  1024. package/dist/src/utils/jsonoutput.test.js.map +0 -1
  1025. package/dist/src/utils/math.test.d.ts +0 -6
  1026. package/dist/src/utils/math.test.js +0 -23
  1027. package/dist/src/utils/math.test.js.map +0 -1
  1028. package/dist/src/utils/persistentState.test.d.ts +0 -6
  1029. package/dist/src/utils/persistentState.test.js +0 -68
  1030. package/dist/src/utils/persistentState.test.js.map +0 -1
  1031. package/dist/src/utils/processUtils.test.d.ts +0 -6
  1032. package/dist/src/utils/processUtils.test.js +0 -20
  1033. package/dist/src/utils/processUtils.test.js.map +0 -1
  1034. package/dist/src/utils/readStdin.test.d.ts +0 -6
  1035. package/dist/src/utils/readStdin.test.js +0 -117
  1036. package/dist/src/utils/readStdin.test.js.map +0 -1
  1037. package/dist/src/utils/readStdin_safety.test.d.ts +0 -6
  1038. package/dist/src/utils/readStdin_safety.test.js +0 -68
  1039. package/dist/src/utils/readStdin_safety.test.js.map +0 -1
  1040. package/dist/src/utils/relaunch.test.d.ts +0 -6
  1041. package/dist/src/utils/relaunch.test.js +0 -279
  1042. package/dist/src/utils/relaunch.test.js.map +0 -1
  1043. package/dist/src/utils/resolvePath.test.d.ts +0 -6
  1044. package/dist/src/utils/resolvePath.test.js +0 -34
  1045. package/dist/src/utils/resolvePath.test.js.map +0 -1
  1046. package/dist/src/utils/sandbox.test.d.ts +0 -6
  1047. package/dist/src/utils/sandbox.test.js +0 -314
  1048. package/dist/src/utils/sandbox.test.js.map +0 -1
  1049. package/dist/src/utils/sandboxUtils.test.d.ts +0 -6
  1050. package/dist/src/utils/sandboxUtils.test.js +0 -122
  1051. package/dist/src/utils/sandboxUtils.test.js.map +0 -1
  1052. package/dist/src/utils/sessionCleanup.integration.test.d.ts +0 -6
  1053. package/dist/src/utils/sessionCleanup.integration.test.js +0 -182
  1054. package/dist/src/utils/sessionCleanup.integration.test.js.map +0 -1
  1055. package/dist/src/utils/sessionCleanup.test.d.ts +0 -6
  1056. package/dist/src/utils/sessionCleanup.test.js +0 -1298
  1057. package/dist/src/utils/sessionCleanup.test.js.map +0 -1
  1058. package/dist/src/utils/sessionUtils.test.d.ts +0 -6
  1059. package/dist/src/utils/sessionUtils.test.js +0 -503
  1060. package/dist/src/utils/sessionUtils.test.js.map +0 -1
  1061. package/dist/src/utils/sessions.test.d.ts +0 -6
  1062. package/dist/src/utils/sessions.test.js +0 -581
  1063. package/dist/src/utils/sessions.test.js.map +0 -1
  1064. package/dist/src/utils/settingsUtils.test.d.ts +0 -6
  1065. package/dist/src/utils/settingsUtils.test.js +0 -808
  1066. package/dist/src/utils/settingsUtils.test.js.map +0 -1
  1067. package/dist/src/utils/skillUtils.test.d.ts +0 -6
  1068. package/dist/src/utils/skillUtils.test.js +0 -70
  1069. package/dist/src/utils/skillUtils.test.js.map +0 -1
  1070. package/dist/src/utils/startupWarnings.test.d.ts +0 -6
  1071. package/dist/src/utils/startupWarnings.test.js +0 -61
  1072. package/dist/src/utils/startupWarnings.test.js.map +0 -1
  1073. package/dist/src/utils/updateEventEmitter.test.d.ts +0 -6
  1074. package/dist/src/utils/updateEventEmitter.test.js +0 -18
  1075. package/dist/src/utils/updateEventEmitter.test.js.map +0 -1
  1076. package/dist/src/utils/userStartupWarnings.test.d.ts +0 -6
  1077. package/dist/src/utils/userStartupWarnings.test.js +0 -98
  1078. package/dist/src/utils/userStartupWarnings.test.js.map +0 -1
  1079. package/dist/src/utils/windowTitle.test.d.ts +0 -6
  1080. package/dist/src/utils/windowTitle.test.js +0 -216
  1081. package/dist/src/utils/windowTitle.test.js.map +0 -1
  1082. package/dist/src/validateNonInterActiveAuth.test.d.ts +0 -6
  1083. package/dist/src/validateNonInterActiveAuth.test.js +0 -319
  1084. package/dist/src/validateNonInterActiveAuth.test.js.map +0 -1
  1085. package/dist/src/zed-integration/fileSystemService.test.d.ts +0 -6
  1086. package/dist/src/zed-integration/fileSystemService.test.js +0 -88
  1087. package/dist/src/zed-integration/fileSystemService.test.js.map +0 -1
  1088. package/dist/src/zed-integration/zedIntegration.test.d.ts +0 -6
  1089. package/dist/src/zed-integration/zedIntegration.test.js +0 -625
  1090. package/dist/src/zed-integration/zedIntegration.test.js.map +0 -1
  1091. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,1822 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- /// <reference types="vitest/globals" />
7
- // Mock 'os' first.
8
- import * as osActual from 'node:os'; // Import for type info for the mock factory
9
- vi.mock('os', async (importOriginal) => {
10
- const actualOs = await importOriginal();
11
- return {
12
- ...actualOs,
13
- homedir: vi.fn(() => '/mock/home/user'),
14
- platform: vi.fn(() => 'linux'),
15
- };
16
- });
17
- // Mock './settings.js' to ensure it uses the mocked 'os.homedir()' for its internal constants.
18
- vi.mock('./settings.js', async (importActual) => {
19
- const originalModule = await importActual();
20
- return {
21
- __esModule: true, // Ensure correct module shape
22
- ...originalModule, // Re-export all original members
23
- // We are relying on originalModule's USER_SETTINGS_PATH being constructed with mocked os.homedir()
24
- };
25
- });
26
- // Mock trustedFolders
27
- vi.mock('./trustedFolders.js', () => ({
28
- isWorkspaceTrusted: vi
29
- .fn()
30
- .mockReturnValue({ isTrusted: true, source: 'file' }),
31
- }));
32
- vi.mock('./settingsSchema.js', async (importOriginal) => {
33
- const actual = await importOriginal();
34
- return {
35
- ...actual,
36
- getSettingsSchema: vi.fn(actual.getSettingsSchema),
37
- };
38
- });
39
- // NOW import everything else, including the (now effectively re-exported) settings.js
40
- import * as path from 'node:path'; // Restored for MOCK_WORKSPACE_SETTINGS_PATH
41
- import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
42
- import * as fs from 'node:fs'; // fs will be mocked separately
43
- import stripJsonComments from 'strip-json-comments'; // Will be mocked separately
44
- import { isWorkspaceTrusted } from './trustedFolders.js';
45
- // These imports will get the versions from the vi.mock('./settings.js', ...) factory.
46
- import { loadSettings, USER_SETTINGS_PATH, // This IS the mocked path.
47
- getSystemSettingsPath, getSystemDefaultsPath, saveSettings, getDefaultsFromSchema, loadEnvironment, migrateDeprecatedSettings, SettingScope, LoadedSettings, } from './settings.js';
48
- import { FatalConfigError, GEMINI_DIR } from '@didim365/agent-cli-core';
49
- import { updateSettingsFilePreservingFormat } from '../utils/commentJson.js';
50
- import { getSettingsSchema, MergeStrategy, } from './settingsSchema.js';
51
- const MOCK_WORKSPACE_DIR = '/mock/workspace';
52
- // Use the (mocked) GEMINI_DIR for consistency
53
- const MOCK_WORKSPACE_SETTINGS_PATH = path.join(MOCK_WORKSPACE_DIR, GEMINI_DIR, 'settings.json');
54
- vi.mock('fs', async (importOriginal) => {
55
- // Get all the functions from the real 'fs' module
56
- const actualFs = await importOriginal();
57
- return {
58
- ...actualFs, // Keep all the real functions
59
- // Now, just override the ones we need for the test
60
- existsSync: vi.fn(),
61
- readFileSync: vi.fn(),
62
- writeFileSync: vi.fn(),
63
- mkdirSync: vi.fn(),
64
- realpathSync: (p) => p,
65
- };
66
- });
67
- vi.mock('./extension.js');
68
- const mockCoreEvents = vi.hoisted(() => ({
69
- emitFeedback: vi.fn(),
70
- emitSettingsChanged: vi.fn(),
71
- }));
72
- vi.mock('@didim365/agent-cli-core', async (importOriginal) => {
73
- const actual = await importOriginal();
74
- return {
75
- ...actual,
76
- coreEvents: mockCoreEvents,
77
- };
78
- });
79
- vi.mock('../utils/commentJson.js', () => ({
80
- updateSettingsFilePreservingFormat: vi.fn(),
81
- }));
82
- vi.mock('strip-json-comments', () => ({
83
- default: vi.fn((content) => content),
84
- }));
85
- describe('Settings Loading and Merging', () => {
86
- let mockFsExistsSync;
87
- let mockStripJsonComments;
88
- let mockFsMkdirSync;
89
- beforeEach(() => {
90
- vi.resetAllMocks();
91
- mockFsExistsSync = vi.mocked(fs.existsSync);
92
- mockFsMkdirSync = vi.mocked(fs.mkdirSync);
93
- mockStripJsonComments = vi.mocked(stripJsonComments);
94
- vi.mocked(osActual.homedir).mockReturnValue('/mock/home/user');
95
- mockStripJsonComments.mockImplementation((jsonString) => jsonString);
96
- mockFsExistsSync.mockReturnValue(false);
97
- fs.readFileSync.mockReturnValue('{}'); // Return valid empty JSON
98
- mockFsMkdirSync.mockImplementation(() => undefined);
99
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
100
- isTrusted: true,
101
- source: 'file',
102
- });
103
- });
104
- afterEach(() => {
105
- vi.restoreAllMocks();
106
- });
107
- describe('loadSettings', () => {
108
- it.each([
109
- {
110
- scope: 'system',
111
- path: getSystemSettingsPath(),
112
- content: {
113
- ui: { theme: 'system-default' },
114
- tools: { sandbox: false },
115
- },
116
- },
117
- {
118
- scope: 'user',
119
- path: USER_SETTINGS_PATH,
120
- content: {
121
- ui: { theme: 'dark' },
122
- context: { fileName: 'USER_CONTEXT.md' },
123
- },
124
- },
125
- {
126
- scope: 'workspace',
127
- path: MOCK_WORKSPACE_SETTINGS_PATH,
128
- content: {
129
- tools: { sandbox: true },
130
- context: { fileName: 'WORKSPACE_CONTEXT.md' },
131
- },
132
- },
133
- ])('should load $scope settings if only $scope file exists', ({ scope, path, content }) => {
134
- mockFsExistsSync.mockImplementation((p) => p === path);
135
- fs.readFileSync.mockImplementation((p) => {
136
- if (p === path)
137
- return JSON.stringify(content);
138
- return '{}';
139
- });
140
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
141
- expect(fs.readFileSync).toHaveBeenCalledWith(path, 'utf-8');
142
- expect(settings[scope].settings).toEqual(content);
143
- expect(settings.merged).toMatchObject(content);
144
- });
145
- it('should merge system, user and workspace settings, with system taking precedence over workspace, and workspace over user', () => {
146
- mockFsExistsSync.mockImplementation((p) => p === getSystemSettingsPath() ||
147
- p === USER_SETTINGS_PATH ||
148
- p === MOCK_WORKSPACE_SETTINGS_PATH);
149
- const systemSettingsContent = {
150
- ui: {
151
- theme: 'system-theme',
152
- },
153
- tools: {
154
- sandbox: false,
155
- },
156
- mcp: {
157
- allowed: ['server1', 'server2'],
158
- },
159
- telemetry: { enabled: false },
160
- };
161
- const userSettingsContent = {
162
- ui: {
163
- theme: 'dark',
164
- },
165
- tools: {
166
- sandbox: true,
167
- },
168
- context: {
169
- fileName: 'USER_CONTEXT.md',
170
- },
171
- };
172
- const workspaceSettingsContent = {
173
- tools: {
174
- sandbox: false,
175
- core: ['tool1'],
176
- },
177
- context: {
178
- fileName: 'WORKSPACE_CONTEXT.md',
179
- },
180
- mcp: {
181
- allowed: ['server1', 'server2', 'server3'],
182
- },
183
- };
184
- fs.readFileSync.mockImplementation((p) => {
185
- if (p === getSystemSettingsPath())
186
- return JSON.stringify(systemSettingsContent);
187
- if (p === USER_SETTINGS_PATH)
188
- return JSON.stringify(userSettingsContent);
189
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
190
- return JSON.stringify(workspaceSettingsContent);
191
- return '';
192
- });
193
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
194
- expect(settings.system.settings).toEqual(systemSettingsContent);
195
- expect(settings.user.settings).toEqual(userSettingsContent);
196
- expect(settings.workspace.settings).toEqual(workspaceSettingsContent);
197
- expect(settings.merged).toMatchObject({
198
- ui: {
199
- theme: 'system-theme',
200
- },
201
- tools: {
202
- sandbox: false,
203
- core: ['tool1'],
204
- },
205
- telemetry: { enabled: false },
206
- context: {
207
- fileName: 'WORKSPACE_CONTEXT.md',
208
- },
209
- mcp: {
210
- allowed: ['server1', 'server2'],
211
- },
212
- });
213
- });
214
- it('should merge all settings files with the correct precedence', () => {
215
- // Mock schema to test defaults application
216
- const mockSchema = {
217
- ui: { type: 'object', default: {}, properties: {} },
218
- tools: { type: 'object', default: {}, properties: {} },
219
- context: {
220
- type: 'object',
221
- default: {},
222
- properties: {
223
- discoveryMaxDirs: { type: 'number', default: 200 },
224
- includeDirectories: {
225
- type: 'array',
226
- default: [],
227
- mergeStrategy: MergeStrategy.CONCAT,
228
- },
229
- },
230
- },
231
- mcpServers: { type: 'object', default: {} },
232
- };
233
- getSettingsSchema.mockReturnValue(mockSchema);
234
- mockFsExistsSync.mockReturnValue(true);
235
- const systemDefaultsContent = {
236
- ui: {
237
- theme: 'default-theme',
238
- },
239
- tools: {
240
- sandbox: true,
241
- },
242
- telemetry: true,
243
- context: {
244
- includeDirectories: ['/system/defaults/dir'],
245
- },
246
- };
247
- const userSettingsContent = {
248
- ui: {
249
- theme: 'user-theme',
250
- },
251
- context: {
252
- fileName: 'USER_CONTEXT.md',
253
- includeDirectories: ['/user/dir1', '/user/dir2'],
254
- },
255
- };
256
- const workspaceSettingsContent = {
257
- tools: {
258
- sandbox: false,
259
- },
260
- context: {
261
- fileName: 'WORKSPACE_CONTEXT.md',
262
- includeDirectories: ['/workspace/dir'],
263
- },
264
- };
265
- const systemSettingsContent = {
266
- ui: {
267
- theme: 'system-theme',
268
- },
269
- telemetry: false,
270
- context: {
271
- includeDirectories: ['/system/dir'],
272
- },
273
- };
274
- fs.readFileSync.mockImplementation((p) => {
275
- if (p === getSystemDefaultsPath())
276
- return JSON.stringify(systemDefaultsContent);
277
- if (p === getSystemSettingsPath())
278
- return JSON.stringify(systemSettingsContent);
279
- if (p === USER_SETTINGS_PATH)
280
- return JSON.stringify(userSettingsContent);
281
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
282
- return JSON.stringify(workspaceSettingsContent);
283
- return '';
284
- });
285
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
286
- expect(settings.systemDefaults.settings).toEqual(systemDefaultsContent);
287
- expect(settings.system.settings).toEqual(systemSettingsContent);
288
- expect(settings.user.settings).toEqual(userSettingsContent);
289
- expect(settings.workspace.settings).toEqual(workspaceSettingsContent);
290
- expect(settings.merged).toEqual({
291
- context: {
292
- discoveryMaxDirs: 200,
293
- includeDirectories: [
294
- '/system/defaults/dir',
295
- '/user/dir1',
296
- '/user/dir2',
297
- '/workspace/dir',
298
- '/system/dir',
299
- ],
300
- fileName: 'WORKSPACE_CONTEXT.md',
301
- },
302
- mcpServers: {},
303
- ui: { theme: 'system-theme' },
304
- tools: { sandbox: false },
305
- telemetry: false,
306
- });
307
- });
308
- it('should use folderTrust from workspace settings when trusted', () => {
309
- mockFsExistsSync.mockReturnValue(true);
310
- const userSettingsContent = {
311
- security: {
312
- folderTrust: {
313
- enabled: true,
314
- },
315
- },
316
- };
317
- const workspaceSettingsContent = {
318
- security: {
319
- folderTrust: {
320
- enabled: false, // This should be used
321
- },
322
- },
323
- };
324
- const systemSettingsContent = {
325
- // No folderTrust here
326
- };
327
- fs.readFileSync.mockImplementation((p) => {
328
- if (p === getSystemSettingsPath())
329
- return JSON.stringify(systemSettingsContent);
330
- if (p === USER_SETTINGS_PATH)
331
- return JSON.stringify(userSettingsContent);
332
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
333
- return JSON.stringify(workspaceSettingsContent);
334
- return '{}';
335
- });
336
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
337
- expect(settings.merged.security?.folderTrust?.enabled).toBe(false); // Workspace setting should be used
338
- });
339
- it('should use system folderTrust over user setting', () => {
340
- mockFsExistsSync.mockReturnValue(true);
341
- const userSettingsContent = {
342
- security: {
343
- folderTrust: {
344
- enabled: false,
345
- },
346
- },
347
- };
348
- const workspaceSettingsContent = {
349
- security: {
350
- folderTrust: {
351
- enabled: true, // This should be ignored
352
- },
353
- },
354
- };
355
- const systemSettingsContent = {
356
- security: {
357
- folderTrust: {
358
- enabled: true,
359
- },
360
- },
361
- };
362
- fs.readFileSync.mockImplementation((p) => {
363
- if (p === getSystemSettingsPath())
364
- return JSON.stringify(systemSettingsContent);
365
- if (p === USER_SETTINGS_PATH)
366
- return JSON.stringify(userSettingsContent);
367
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
368
- return JSON.stringify(workspaceSettingsContent);
369
- return '{}';
370
- });
371
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
372
- expect(settings.merged.security?.folderTrust?.enabled).toBe(true); // System setting should be used
373
- });
374
- it('should not allow user or workspace to override system disableYoloMode', () => {
375
- mockFsExistsSync.mockReturnValue(true);
376
- const userSettingsContent = {
377
- security: {
378
- disableYoloMode: false,
379
- },
380
- };
381
- const workspaceSettingsContent = {
382
- security: {
383
- disableYoloMode: false, // This should be ignored
384
- },
385
- };
386
- const systemSettingsContent = {
387
- security: {
388
- disableYoloMode: true,
389
- },
390
- };
391
- fs.readFileSync.mockImplementation((p) => {
392
- if (p === getSystemSettingsPath())
393
- return JSON.stringify(systemSettingsContent);
394
- if (p === USER_SETTINGS_PATH)
395
- return JSON.stringify(userSettingsContent);
396
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
397
- return JSON.stringify(workspaceSettingsContent);
398
- return '{}';
399
- });
400
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
401
- expect(settings.merged.security?.disableYoloMode).toBe(true); // System setting should be used
402
- });
403
- it.each([
404
- {
405
- description: 'contextFileName in user settings',
406
- path: USER_SETTINGS_PATH,
407
- content: { context: { fileName: 'CUSTOM.md' } },
408
- expected: { key: 'context.fileName', value: 'CUSTOM.md' },
409
- },
410
- {
411
- description: 'contextFileName in workspace settings',
412
- path: MOCK_WORKSPACE_SETTINGS_PATH,
413
- content: { context: { fileName: 'PROJECT_SPECIFIC.md' } },
414
- expected: { key: 'context.fileName', value: 'PROJECT_SPECIFIC.md' },
415
- },
416
- {
417
- description: 'excludedProjectEnvVars in user settings',
418
- path: USER_SETTINGS_PATH,
419
- content: {
420
- advanced: { excludedEnvVars: ['DEBUG', 'NODE_ENV', 'CUSTOM_VAR'] },
421
- },
422
- expected: {
423
- key: 'advanced.excludedEnvVars',
424
- value: ['DEBUG', 'DEBUG_MODE', 'NODE_ENV', 'CUSTOM_VAR'],
425
- },
426
- },
427
- {
428
- description: 'excludedProjectEnvVars in workspace settings',
429
- path: MOCK_WORKSPACE_SETTINGS_PATH,
430
- content: {
431
- advanced: { excludedEnvVars: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'] },
432
- },
433
- expected: {
434
- key: 'advanced.excludedEnvVars',
435
- value: ['DEBUG', 'DEBUG_MODE', 'WORKSPACE_DEBUG', 'WORKSPACE_VAR'],
436
- },
437
- },
438
- ])('should handle $description correctly', ({ path, content, expected }) => {
439
- mockFsExistsSync.mockImplementation((p) => p === path);
440
- fs.readFileSync.mockImplementation((p) => {
441
- if (p === path)
442
- return JSON.stringify(content);
443
- return '{}';
444
- });
445
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
446
- const keys = expected.key.split('.');
447
- let result = settings.merged;
448
- for (const key of keys) {
449
- result = result[key];
450
- }
451
- expect(result).toEqual(expected.value);
452
- });
453
- it('should merge excludedProjectEnvVars with workspace taking precedence over user', () => {
454
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH || p === MOCK_WORKSPACE_SETTINGS_PATH);
455
- const userSettingsContent = {
456
- general: {},
457
- advanced: { excludedEnvVars: ['DEBUG', 'NODE_ENV', 'USER_VAR'] },
458
- };
459
- const workspaceSettingsContent = {
460
- general: {},
461
- advanced: { excludedEnvVars: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'] },
462
- };
463
- fs.readFileSync.mockImplementation((p) => {
464
- if (p === USER_SETTINGS_PATH)
465
- return JSON.stringify(userSettingsContent);
466
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
467
- return JSON.stringify(workspaceSettingsContent);
468
- return '';
469
- });
470
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
471
- expect(settings.user.settings.advanced?.excludedEnvVars).toEqual([
472
- 'DEBUG',
473
- 'NODE_ENV',
474
- 'USER_VAR',
475
- ]);
476
- expect(settings.workspace.settings.advanced?.excludedEnvVars).toEqual([
477
- 'WORKSPACE_DEBUG',
478
- 'WORKSPACE_VAR',
479
- ]);
480
- expect(settings.merged.advanced?.excludedEnvVars).toEqual([
481
- 'DEBUG',
482
- 'DEBUG_MODE',
483
- 'NODE_ENV',
484
- 'USER_VAR',
485
- 'WORKSPACE_DEBUG',
486
- 'WORKSPACE_VAR',
487
- ]);
488
- });
489
- it('should default contextFileName to undefined if not in any settings file', () => {
490
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH || p === MOCK_WORKSPACE_SETTINGS_PATH);
491
- const userSettingsContent = { ui: { theme: 'dark' } };
492
- const workspaceSettingsContent = { tools: { sandbox: true } };
493
- fs.readFileSync.mockImplementation((p) => {
494
- if (p === USER_SETTINGS_PATH)
495
- return JSON.stringify(userSettingsContent);
496
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
497
- return JSON.stringify(workspaceSettingsContent);
498
- return '';
499
- });
500
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
501
- expect(settings.merged.context?.fileName).toBeUndefined();
502
- });
503
- it.each([
504
- {
505
- scope: 'user',
506
- path: USER_SETTINGS_PATH,
507
- content: { telemetry: { enabled: true } },
508
- expected: true,
509
- },
510
- {
511
- scope: 'workspace',
512
- path: MOCK_WORKSPACE_SETTINGS_PATH,
513
- content: { telemetry: { enabled: false } },
514
- expected: false,
515
- },
516
- ])('should load telemetry setting from $scope settings', ({ path, content, expected }) => {
517
- mockFsExistsSync.mockImplementation((p) => p === path);
518
- fs.readFileSync.mockImplementation((p) => {
519
- if (p === path)
520
- return JSON.stringify(content);
521
- return '{}';
522
- });
523
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
524
- expect(settings.merged.telemetry?.enabled).toBe(expected);
525
- });
526
- it('should prioritize workspace telemetry setting over user setting', () => {
527
- mockFsExistsSync.mockReturnValue(true);
528
- const userSettingsContent = { telemetry: { enabled: true } };
529
- const workspaceSettingsContent = { telemetry: { enabled: false } };
530
- fs.readFileSync.mockImplementation((p) => {
531
- if (p === USER_SETTINGS_PATH)
532
- return JSON.stringify(userSettingsContent);
533
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
534
- return JSON.stringify(workspaceSettingsContent);
535
- return '{}';
536
- });
537
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
538
- expect(settings.merged.telemetry?.enabled).toBe(false);
539
- });
540
- it('should have telemetry as undefined if not in any settings file', () => {
541
- mockFsExistsSync.mockReturnValue(false); // No settings files exist
542
- fs.readFileSync.mockReturnValue('{}');
543
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
544
- expect(settings.merged.telemetry).toBeUndefined();
545
- expect(settings.merged.ui).toBeDefined();
546
- expect(settings.merged.mcpServers).toEqual({});
547
- });
548
- it('should merge MCP servers correctly, with workspace taking precedence', () => {
549
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH || p === MOCK_WORKSPACE_SETTINGS_PATH);
550
- const userSettingsContent = {
551
- mcpServers: {
552
- 'user-server': {
553
- command: 'user-command',
554
- args: ['--user-arg'],
555
- description: 'User MCP server',
556
- },
557
- 'shared-server': {
558
- command: 'user-shared-command',
559
- description: 'User shared server config',
560
- },
561
- },
562
- };
563
- const workspaceSettingsContent = {
564
- mcpServers: {
565
- 'workspace-server': {
566
- command: 'workspace-command',
567
- args: ['--workspace-arg'],
568
- description: 'Workspace MCP server',
569
- },
570
- 'shared-server': {
571
- command: 'workspace-shared-command',
572
- description: 'Workspace shared server config',
573
- },
574
- },
575
- };
576
- fs.readFileSync.mockImplementation((p) => {
577
- if (p === USER_SETTINGS_PATH)
578
- return JSON.stringify(userSettingsContent);
579
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
580
- return JSON.stringify(workspaceSettingsContent);
581
- return '';
582
- });
583
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
584
- expect(settings.user.settings).toEqual(userSettingsContent);
585
- expect(settings.workspace.settings).toEqual(workspaceSettingsContent);
586
- expect(settings.merged.mcpServers).toEqual({
587
- 'user-server': {
588
- command: 'user-command',
589
- args: ['--user-arg'],
590
- description: 'User MCP server',
591
- },
592
- 'workspace-server': {
593
- command: 'workspace-command',
594
- args: ['--workspace-arg'],
595
- description: 'Workspace MCP server',
596
- },
597
- 'shared-server': {
598
- command: 'workspace-shared-command',
599
- description: 'Workspace shared server config',
600
- },
601
- });
602
- });
603
- it.each([
604
- {
605
- scope: 'user',
606
- path: USER_SETTINGS_PATH,
607
- content: {
608
- mcpServers: {
609
- 'user-only-server': {
610
- command: 'user-only-command',
611
- description: 'User only server',
612
- },
613
- },
614
- },
615
- expected: {
616
- 'user-only-server': {
617
- command: 'user-only-command',
618
- description: 'User only server',
619
- },
620
- },
621
- },
622
- {
623
- scope: 'workspace',
624
- path: MOCK_WORKSPACE_SETTINGS_PATH,
625
- content: {
626
- mcpServers: {
627
- 'workspace-only-server': {
628
- command: 'workspace-only-command',
629
- description: 'Workspace only server',
630
- },
631
- },
632
- },
633
- expected: {
634
- 'workspace-only-server': {
635
- command: 'workspace-only-command',
636
- description: 'Workspace only server',
637
- },
638
- },
639
- },
640
- ])('should handle MCP servers when only in $scope settings', ({ path, content, expected }) => {
641
- mockFsExistsSync.mockImplementation((p) => p === path);
642
- fs.readFileSync.mockImplementation((p) => {
643
- if (p === path)
644
- return JSON.stringify(content);
645
- return '{}';
646
- });
647
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
648
- expect(settings.merged.mcpServers).toEqual(expected);
649
- });
650
- it('should have mcpServers as undefined if not in any settings file', () => {
651
- mockFsExistsSync.mockReturnValue(false); // No settings files exist
652
- fs.readFileSync.mockReturnValue('{}');
653
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
654
- expect(settings.merged.mcpServers).toEqual({});
655
- });
656
- it('should merge MCP servers from system, user, and workspace with system taking precedence', () => {
657
- mockFsExistsSync.mockReturnValue(true);
658
- const systemSettingsContent = {
659
- mcpServers: {
660
- 'shared-server': {
661
- command: 'system-command',
662
- args: ['--system-arg'],
663
- },
664
- 'system-only-server': {
665
- command: 'system-only-command',
666
- },
667
- },
668
- };
669
- const userSettingsContent = {
670
- mcpServers: {
671
- 'user-server': {
672
- command: 'user-command',
673
- },
674
- 'shared-server': {
675
- command: 'user-command',
676
- description: 'from user',
677
- },
678
- },
679
- };
680
- const workspaceSettingsContent = {
681
- mcpServers: {
682
- 'workspace-server': {
683
- command: 'workspace-command',
684
- },
685
- 'shared-server': {
686
- command: 'workspace-command',
687
- args: ['--workspace-arg'],
688
- },
689
- },
690
- };
691
- fs.readFileSync.mockImplementation((p) => {
692
- if (p === getSystemSettingsPath())
693
- return JSON.stringify(systemSettingsContent);
694
- if (p === USER_SETTINGS_PATH)
695
- return JSON.stringify(userSettingsContent);
696
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
697
- return JSON.stringify(workspaceSettingsContent);
698
- return '{}';
699
- });
700
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
701
- expect(settings.merged.mcpServers).toEqual({
702
- 'user-server': {
703
- command: 'user-command',
704
- },
705
- 'workspace-server': {
706
- command: 'workspace-command',
707
- },
708
- 'system-only-server': {
709
- command: 'system-only-command',
710
- },
711
- 'shared-server': {
712
- command: 'system-command',
713
- args: ['--system-arg'],
714
- },
715
- });
716
- });
717
- it('should merge mcp allowed/excluded lists with system taking precedence over workspace', () => {
718
- mockFsExistsSync.mockReturnValue(true);
719
- const systemSettingsContent = {
720
- mcp: {
721
- allowed: ['system-allowed'],
722
- },
723
- };
724
- const userSettingsContent = {
725
- mcp: {
726
- allowed: ['user-allowed'],
727
- excluded: ['user-excluded'],
728
- },
729
- };
730
- const workspaceSettingsContent = {
731
- mcp: {
732
- allowed: ['workspace-allowed'],
733
- excluded: ['workspace-excluded'],
734
- },
735
- };
736
- fs.readFileSync.mockImplementation((p) => {
737
- if (p === getSystemSettingsPath())
738
- return JSON.stringify(systemSettingsContent);
739
- if (p === USER_SETTINGS_PATH)
740
- return JSON.stringify(userSettingsContent);
741
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
742
- return JSON.stringify(workspaceSettingsContent);
743
- return '{}';
744
- });
745
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
746
- expect(settings.merged.mcp).toEqual({
747
- allowed: ['system-allowed'],
748
- excluded: ['workspace-excluded'],
749
- });
750
- });
751
- describe('compressionThreshold settings', () => {
752
- it.each([
753
- {
754
- description: 'should be taken from user settings if only present there',
755
- userContent: { model: { compressionThreshold: 0.5 } },
756
- workspaceContent: {},
757
- expected: 0.5,
758
- },
759
- {
760
- description: 'should be taken from workspace settings if only present there',
761
- userContent: {},
762
- workspaceContent: { model: { compressionThreshold: 0.8 } },
763
- expected: 0.8,
764
- },
765
- {
766
- description: 'should prioritize workspace settings over user settings',
767
- userContent: { model: { compressionThreshold: 0.5 } },
768
- workspaceContent: { model: { compressionThreshold: 0.8 } },
769
- expected: 0.8,
770
- },
771
- {
772
- description: 'should be default if not in any settings file',
773
- userContent: {},
774
- workspaceContent: {},
775
- expected: 0.5,
776
- },
777
- ])('$description', ({ userContent, workspaceContent, expected }) => {
778
- mockFsExistsSync.mockReturnValue(true);
779
- fs.readFileSync.mockImplementation((p) => {
780
- if (p === USER_SETTINGS_PATH)
781
- return JSON.stringify(userContent);
782
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
783
- return JSON.stringify(workspaceContent);
784
- return '{}';
785
- });
786
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
787
- expect(settings.merged.model?.compressionThreshold).toEqual(expected);
788
- });
789
- });
790
- it('should use user compressionThreshold if workspace does not define it', () => {
791
- mockFsExistsSync.mockReturnValue(true);
792
- const userSettingsContent = {
793
- general: {},
794
- model: { compressionThreshold: 0.5 },
795
- };
796
- const workspaceSettingsContent = {
797
- general: {},
798
- model: {},
799
- };
800
- fs.readFileSync.mockImplementation((p) => {
801
- if (p === USER_SETTINGS_PATH)
802
- return JSON.stringify(userSettingsContent);
803
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
804
- return JSON.stringify(workspaceSettingsContent);
805
- return '{}';
806
- });
807
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
808
- expect(settings.merged.model?.compressionThreshold).toEqual(0.5);
809
- });
810
- it('should merge includeDirectories from all scopes', () => {
811
- mockFsExistsSync.mockReturnValue(true);
812
- const systemSettingsContent = {
813
- context: { includeDirectories: ['/system/dir'] },
814
- };
815
- const systemDefaultsContent = {
816
- context: { includeDirectories: ['/system/defaults/dir'] },
817
- };
818
- const userSettingsContent = {
819
- context: { includeDirectories: ['/user/dir1', '/user/dir2'] },
820
- };
821
- const workspaceSettingsContent = {
822
- context: { includeDirectories: ['/workspace/dir'] },
823
- };
824
- fs.readFileSync.mockImplementation((p) => {
825
- if (p === getSystemSettingsPath())
826
- return JSON.stringify(systemSettingsContent);
827
- if (p === getSystemDefaultsPath())
828
- return JSON.stringify(systemDefaultsContent);
829
- if (p === USER_SETTINGS_PATH)
830
- return JSON.stringify(userSettingsContent);
831
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
832
- return JSON.stringify(workspaceSettingsContent);
833
- return '{}';
834
- });
835
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
836
- expect(settings.merged.context?.includeDirectories).toEqual([
837
- '/system/defaults/dir',
838
- '/user/dir1',
839
- '/user/dir2',
840
- '/workspace/dir',
841
- '/system/dir',
842
- ]);
843
- });
844
- it('should handle JSON parsing errors gracefully', () => {
845
- mockFsExistsSync.mockReturnValue(true); // Both files "exist"
846
- const invalidJsonContent = 'invalid json';
847
- const userReadError = new SyntaxError("Expected ',' or '}' after property value in JSON at position 10");
848
- const workspaceReadError = new SyntaxError('Unexpected token i in JSON at position 0');
849
- fs.readFileSync.mockImplementation((p) => {
850
- if (p === USER_SETTINGS_PATH) {
851
- // Simulate JSON.parse throwing for user settings
852
- vi.spyOn(JSON, 'parse').mockImplementationOnce(() => {
853
- throw userReadError;
854
- });
855
- return invalidJsonContent; // Content that would cause JSON.parse to throw
856
- }
857
- if (p === MOCK_WORKSPACE_SETTINGS_PATH) {
858
- // Simulate JSON.parse throwing for workspace settings
859
- vi.spyOn(JSON, 'parse').mockImplementationOnce(() => {
860
- throw workspaceReadError;
861
- });
862
- return invalidJsonContent;
863
- }
864
- return '{}'; // Default for other reads
865
- });
866
- try {
867
- loadSettings(MOCK_WORKSPACE_DIR);
868
- throw new Error('loadSettings should have thrown a FatalConfigError');
869
- }
870
- catch (e) {
871
- expect(e).toBeInstanceOf(FatalConfigError);
872
- const error = e;
873
- expect(error.message).toContain(`Error in ${USER_SETTINGS_PATH}: ${userReadError.message}`);
874
- expect(error.message).toContain(`Error in ${MOCK_WORKSPACE_SETTINGS_PATH}: ${workspaceReadError.message}`);
875
- expect(error.message).toContain('Please fix the configuration file(s) and try again.');
876
- }
877
- // Restore JSON.parse mock if it was spied on specifically for this test
878
- vi.restoreAllMocks(); // Or more targeted restore if needed
879
- });
880
- it('should resolve environment variables in user settings', () => {
881
- process.env['TEST_API_KEY'] = 'user_api_key_from_env';
882
- const userSettingsContent = {
883
- apiKey: '$TEST_API_KEY',
884
- someUrl: 'https://test.com/${TEST_API_KEY}',
885
- };
886
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
887
- fs.readFileSync.mockImplementation((p) => {
888
- if (p === USER_SETTINGS_PATH)
889
- return JSON.stringify(userSettingsContent);
890
- return '{}';
891
- });
892
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
893
- expect(settings.user.settings['apiKey']).toBe('user_api_key_from_env');
894
- expect(settings.user.settings['someUrl']).toBe('https://test.com/user_api_key_from_env');
895
- expect(settings.merged['apiKey']).toBe('user_api_key_from_env');
896
- delete process.env['TEST_API_KEY'];
897
- });
898
- it('should resolve environment variables in workspace settings', () => {
899
- process.env['WORKSPACE_ENDPOINT'] = 'workspace_endpoint_from_env';
900
- const workspaceSettingsContent = {
901
- endpoint: '${WORKSPACE_ENDPOINT}/api',
902
- nested: { value: '$WORKSPACE_ENDPOINT' },
903
- };
904
- mockFsExistsSync.mockImplementation((p) => p === MOCK_WORKSPACE_SETTINGS_PATH);
905
- fs.readFileSync.mockImplementation((p) => {
906
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
907
- return JSON.stringify(workspaceSettingsContent);
908
- return '{}';
909
- });
910
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
911
- expect(settings.workspace.settings['endpoint']).toBe('workspace_endpoint_from_env/api');
912
- const nested = settings.workspace.settings['nested'];
913
- expect(nested['value']).toBe('workspace_endpoint_from_env');
914
- expect(settings.merged['endpoint']).toBe('workspace_endpoint_from_env/api');
915
- delete process.env['WORKSPACE_ENDPOINT'];
916
- });
917
- it('should correctly resolve and merge env variables from different scopes', () => {
918
- process.env['SYSTEM_VAR'] = 'system_value';
919
- process.env['USER_VAR'] = 'user_value';
920
- process.env['WORKSPACE_VAR'] = 'workspace_value';
921
- process.env['SHARED_VAR'] = 'final_value';
922
- const systemSettingsContent = {
923
- configValue: '$SHARED_VAR',
924
- systemOnly: '$SYSTEM_VAR',
925
- };
926
- const userSettingsContent = {
927
- configValue: '$SHARED_VAR',
928
- userOnly: '$USER_VAR',
929
- ui: {
930
- theme: 'dark',
931
- },
932
- };
933
- const workspaceSettingsContent = {
934
- configValue: '$SHARED_VAR',
935
- workspaceOnly: '$WORKSPACE_VAR',
936
- ui: {
937
- theme: 'light',
938
- },
939
- };
940
- mockFsExistsSync.mockReturnValue(true);
941
- fs.readFileSync.mockImplementation((p) => {
942
- if (p === getSystemSettingsPath()) {
943
- return JSON.stringify(systemSettingsContent);
944
- }
945
- if (p === USER_SETTINGS_PATH) {
946
- return JSON.stringify(userSettingsContent);
947
- }
948
- if (p === MOCK_WORKSPACE_SETTINGS_PATH) {
949
- return JSON.stringify(workspaceSettingsContent);
950
- }
951
- return '{}';
952
- });
953
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
954
- // Check resolved values in individual scopes
955
- expect(settings.system.settings['configValue']).toBe('final_value');
956
- expect(settings.system.settings['systemOnly']).toBe('system_value');
957
- expect(settings.user.settings['configValue']).toBe('final_value');
958
- expect(settings.user.settings['userOnly']).toBe('user_value');
959
- expect(settings.workspace.settings['configValue']).toBe('final_value');
960
- expect(settings.workspace.settings['workspaceOnly']).toBe('workspace_value');
961
- // Check merged values (system > workspace > user)
962
- expect(settings.merged['configValue']).toBe('final_value');
963
- expect(settings.merged['systemOnly']).toBe('system_value');
964
- expect(settings.merged['userOnly']).toBe('user_value');
965
- expect(settings.merged['workspaceOnly']).toBe('workspace_value');
966
- expect(settings.merged.ui?.theme).toBe('light'); // workspace overrides user
967
- delete process.env['SYSTEM_VAR'];
968
- delete process.env['USER_VAR'];
969
- delete process.env['WORKSPACE_VAR'];
970
- delete process.env['SHARED_VAR'];
971
- });
972
- it('should correctly merge dnsResolutionOrder with workspace taking precedence', () => {
973
- mockFsExistsSync.mockReturnValue(true);
974
- const userSettingsContent = {
975
- advanced: { dnsResolutionOrder: 'ipv4first' },
976
- };
977
- const workspaceSettingsContent = {
978
- advanced: { dnsResolutionOrder: 'verbatim' },
979
- };
980
- fs.readFileSync.mockImplementation((p) => {
981
- if (p === USER_SETTINGS_PATH)
982
- return JSON.stringify(userSettingsContent);
983
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
984
- return JSON.stringify(workspaceSettingsContent);
985
- return '{}';
986
- });
987
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
988
- expect(settings.merged.advanced?.dnsResolutionOrder).toBe('verbatim');
989
- });
990
- it('should use user dnsResolutionOrder if workspace is not defined', () => {
991
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
992
- const userSettingsContent = {
993
- advanced: { dnsResolutionOrder: 'verbatim' },
994
- };
995
- fs.readFileSync.mockImplementation((p) => {
996
- if (p === USER_SETTINGS_PATH)
997
- return JSON.stringify(userSettingsContent);
998
- return '{}';
999
- });
1000
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1001
- expect(settings.merged.advanced?.dnsResolutionOrder).toBe('verbatim');
1002
- });
1003
- it('should leave unresolved environment variables as is', () => {
1004
- const userSettingsContent = { apiKey: '$UNDEFINED_VAR' };
1005
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
1006
- fs.readFileSync.mockImplementation((p) => {
1007
- if (p === USER_SETTINGS_PATH)
1008
- return JSON.stringify(userSettingsContent);
1009
- return '{}';
1010
- });
1011
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1012
- expect(settings.user.settings['apiKey']).toBe('$UNDEFINED_VAR');
1013
- expect(settings.merged['apiKey']).toBe('$UNDEFINED_VAR');
1014
- });
1015
- it('should resolve multiple environment variables in a single string', () => {
1016
- process.env['VAR_A'] = 'valueA';
1017
- process.env['VAR_B'] = 'valueB';
1018
- const userSettingsContent = {
1019
- path: '/path/$VAR_A/${VAR_B}/end',
1020
- };
1021
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
1022
- fs.readFileSync.mockImplementation((p) => {
1023
- if (p === USER_SETTINGS_PATH)
1024
- return JSON.stringify(userSettingsContent);
1025
- return '{}';
1026
- });
1027
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1028
- expect(settings.user.settings['path']).toBe('/path/valueA/valueB/end');
1029
- delete process.env['VAR_A'];
1030
- delete process.env['VAR_B'];
1031
- });
1032
- it('should resolve environment variables in arrays', () => {
1033
- process.env['ITEM_1'] = 'item1_env';
1034
- process.env['ITEM_2'] = 'item2_env';
1035
- const userSettingsContent = {
1036
- list: ['$ITEM_1', '${ITEM_2}', 'literal'],
1037
- };
1038
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
1039
- fs.readFileSync.mockImplementation((p) => {
1040
- if (p === USER_SETTINGS_PATH)
1041
- return JSON.stringify(userSettingsContent);
1042
- return '{}';
1043
- });
1044
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1045
- expect(settings.user.settings['list']).toEqual([
1046
- 'item1_env',
1047
- 'item2_env',
1048
- 'literal',
1049
- ]);
1050
- delete process.env['ITEM_1'];
1051
- delete process.env['ITEM_2'];
1052
- });
1053
- it('should correctly pass through null, boolean, and number types, and handle undefined properties', () => {
1054
- process.env['MY_ENV_STRING'] = 'env_string_value';
1055
- process.env['MY_ENV_STRING_NESTED'] = 'env_string_nested_value';
1056
- const userSettingsContent = {
1057
- nullVal: null,
1058
- trueVal: true,
1059
- falseVal: false,
1060
- numberVal: 123.45,
1061
- stringVal: '$MY_ENV_STRING',
1062
- nestedObj: {
1063
- nestedNull: null,
1064
- nestedBool: true,
1065
- nestedNum: 0,
1066
- nestedString: 'literal',
1067
- anotherEnv: '${MY_ENV_STRING_NESTED}',
1068
- },
1069
- };
1070
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
1071
- fs.readFileSync.mockImplementation((p) => {
1072
- if (p === USER_SETTINGS_PATH)
1073
- return JSON.stringify(userSettingsContent);
1074
- return '{}';
1075
- });
1076
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1077
- expect(settings.user.settings['nullVal']).toBeNull();
1078
- expect(settings.user.settings['trueVal']).toBe(true);
1079
- expect(settings.user.settings['falseVal']).toBe(false);
1080
- expect(settings.user.settings['numberVal']).toBe(123.45);
1081
- expect(settings.user.settings['stringVal']).toBe('env_string_value');
1082
- expect(settings.user.settings['undefinedVal']).toBeUndefined();
1083
- const nestedObj = settings.user.settings['nestedObj'];
1084
- expect(nestedObj['nestedNull']).toBeNull();
1085
- expect(nestedObj['nestedBool']).toBe(true);
1086
- expect(nestedObj['nestedNum']).toBe(0);
1087
- expect(nestedObj['nestedString']).toBe('literal');
1088
- expect(nestedObj['anotherEnv']).toBe('env_string_nested_value');
1089
- delete process.env['MY_ENV_STRING'];
1090
- delete process.env['MY_ENV_STRING_NESTED'];
1091
- });
1092
- it('should resolve multiple concatenated environment variables in a single string value', () => {
1093
- process.env['TEST_HOST'] = 'myhost';
1094
- process.env['TEST_PORT'] = '9090';
1095
- const userSettingsContent = {
1096
- serverAddress: '${TEST_HOST}:${TEST_PORT}/api',
1097
- };
1098
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
1099
- fs.readFileSync.mockImplementation((p) => {
1100
- if (p === USER_SETTINGS_PATH)
1101
- return JSON.stringify(userSettingsContent);
1102
- return '{}';
1103
- });
1104
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1105
- expect(settings.user.settings['serverAddress']).toBe('myhost:9090/api');
1106
- delete process.env['TEST_HOST'];
1107
- delete process.env['TEST_PORT'];
1108
- });
1109
- describe('when GEMINI_CLI_SYSTEM_SETTINGS_PATH is set', () => {
1110
- const MOCK_ENV_SYSTEM_SETTINGS_PATH = '/mock/env/system/settings.json';
1111
- beforeEach(() => {
1112
- process.env['GEMINI_CLI_SYSTEM_SETTINGS_PATH'] =
1113
- MOCK_ENV_SYSTEM_SETTINGS_PATH;
1114
- });
1115
- afterEach(() => {
1116
- delete process.env['GEMINI_CLI_SYSTEM_SETTINGS_PATH'];
1117
- });
1118
- it('should load system settings from the path specified in the environment variable', () => {
1119
- mockFsExistsSync.mockImplementation((p) => p === MOCK_ENV_SYSTEM_SETTINGS_PATH);
1120
- const systemSettingsContent = {
1121
- ui: { theme: 'env-var-theme' },
1122
- tools: { sandbox: true },
1123
- };
1124
- fs.readFileSync.mockImplementation((p) => {
1125
- if (p === MOCK_ENV_SYSTEM_SETTINGS_PATH)
1126
- return JSON.stringify(systemSettingsContent);
1127
- return '{}';
1128
- });
1129
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1130
- expect(fs.readFileSync).toHaveBeenCalledWith(MOCK_ENV_SYSTEM_SETTINGS_PATH, 'utf-8');
1131
- expect(settings.system.path).toBe(MOCK_ENV_SYSTEM_SETTINGS_PATH);
1132
- expect(settings.system.settings).toEqual(systemSettingsContent);
1133
- expect(settings.merged).toMatchObject({
1134
- ...systemSettingsContent,
1135
- });
1136
- });
1137
- });
1138
- });
1139
- describe('excludedProjectEnvVars integration', () => {
1140
- const originalEnv = { ...process.env };
1141
- beforeEach(() => {
1142
- process.env = { ...originalEnv };
1143
- });
1144
- afterEach(() => {
1145
- process.env = originalEnv;
1146
- });
1147
- it('should exclude DEBUG and DEBUG_MODE from project .env files by default', () => {
1148
- // Create a workspace settings file with excludedProjectEnvVars
1149
- const workspaceSettingsContent = {
1150
- general: {},
1151
- advanced: { excludedEnvVars: ['DEBUG', 'DEBUG_MODE'] },
1152
- };
1153
- mockFsExistsSync.mockImplementation((p) => p === MOCK_WORKSPACE_SETTINGS_PATH);
1154
- fs.readFileSync.mockImplementation((p) => {
1155
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1156
- return JSON.stringify(workspaceSettingsContent);
1157
- return '{}';
1158
- });
1159
- // Mock findEnvFile to return a project .env file
1160
- const originalFindEnvFile = loadSettings.findEnvFile;
1161
- loadSettings.findEnvFile =
1162
- () => '/mock/project/.env';
1163
- // Mock fs.readFileSync for .env file content
1164
- const originalReadFileSync = fs.readFileSync;
1165
- fs.readFileSync.mockImplementation((p) => {
1166
- if (p === '/mock/project/.env') {
1167
- return 'DEBUG=true\nDEBUG_MODE=1\nGEMINI_API_KEY=test-key';
1168
- }
1169
- if (p === MOCK_WORKSPACE_SETTINGS_PATH) {
1170
- return JSON.stringify(workspaceSettingsContent);
1171
- }
1172
- return '{}';
1173
- });
1174
- try {
1175
- // This will call loadEnvironment internally with the merged settings
1176
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1177
- // Verify the settings were loaded correctly
1178
- expect(settings.merged.advanced?.excludedEnvVars).toEqual([
1179
- 'DEBUG',
1180
- 'DEBUG_MODE',
1181
- ]);
1182
- // Note: We can't directly test process.env changes here because the mocking
1183
- // prevents the actual file system operations, but we can verify the settings
1184
- // are correctly merged and passed to loadEnvironment
1185
- }
1186
- finally {
1187
- loadSettings.findEnvFile =
1188
- originalFindEnvFile;
1189
- fs.readFileSync.mockImplementation(originalReadFileSync);
1190
- }
1191
- });
1192
- it('should respect custom excludedProjectEnvVars from user settings', () => {
1193
- const userSettingsContent = {
1194
- general: {},
1195
- advanced: { excludedEnvVars: ['NODE_ENV', 'DEBUG'] },
1196
- };
1197
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
1198
- fs.readFileSync.mockImplementation((p) => {
1199
- if (p === USER_SETTINGS_PATH)
1200
- return JSON.stringify(userSettingsContent);
1201
- return '{}';
1202
- });
1203
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1204
- expect(settings.user.settings.advanced?.excludedEnvVars).toEqual([
1205
- 'NODE_ENV',
1206
- 'DEBUG',
1207
- ]);
1208
- expect(settings.merged.advanced?.excludedEnvVars).toEqual([
1209
- 'DEBUG',
1210
- 'DEBUG_MODE',
1211
- 'NODE_ENV',
1212
- ]);
1213
- });
1214
- it('should merge excludedProjectEnvVars with workspace taking precedence', () => {
1215
- const userSettingsContent = {
1216
- general: {},
1217
- advanced: { excludedEnvVars: ['DEBUG', 'NODE_ENV', 'USER_VAR'] },
1218
- };
1219
- const workspaceSettingsContent = {
1220
- general: {},
1221
- advanced: { excludedEnvVars: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'] },
1222
- };
1223
- mockFsExistsSync.mockReturnValue(true);
1224
- fs.readFileSync.mockImplementation((p) => {
1225
- if (p === USER_SETTINGS_PATH)
1226
- return JSON.stringify(userSettingsContent);
1227
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1228
- return JSON.stringify(workspaceSettingsContent);
1229
- return '{}';
1230
- });
1231
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1232
- expect(settings.user.settings.advanced?.excludedEnvVars).toEqual([
1233
- 'DEBUG',
1234
- 'NODE_ENV',
1235
- 'USER_VAR',
1236
- ]);
1237
- expect(settings.workspace.settings.advanced?.excludedEnvVars).toEqual([
1238
- 'WORKSPACE_DEBUG',
1239
- 'WORKSPACE_VAR',
1240
- ]);
1241
- expect(settings.merged.advanced?.excludedEnvVars).toEqual([
1242
- 'DEBUG',
1243
- 'DEBUG_MODE',
1244
- 'NODE_ENV',
1245
- 'USER_VAR',
1246
- 'WORKSPACE_DEBUG',
1247
- 'WORKSPACE_VAR',
1248
- ]);
1249
- });
1250
- });
1251
- describe('with workspace trust', () => {
1252
- it('should merge workspace settings when workspace is trusted', () => {
1253
- mockFsExistsSync.mockReturnValue(true);
1254
- const userSettingsContent = {
1255
- ui: { theme: 'dark' },
1256
- tools: { sandbox: false },
1257
- };
1258
- const workspaceSettingsContent = {
1259
- tools: { sandbox: true },
1260
- context: { fileName: 'WORKSPACE.md' },
1261
- };
1262
- fs.readFileSync.mockImplementation((p) => {
1263
- if (p === USER_SETTINGS_PATH)
1264
- return JSON.stringify(userSettingsContent);
1265
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1266
- return JSON.stringify(workspaceSettingsContent);
1267
- return '{}';
1268
- });
1269
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1270
- expect(settings.merged.tools?.sandbox).toBe(true);
1271
- expect(settings.merged.context?.fileName).toBe('WORKSPACE.md');
1272
- expect(settings.merged.ui?.theme).toBe('dark');
1273
- });
1274
- it('should NOT merge workspace settings when workspace is not trusted', () => {
1275
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
1276
- isTrusted: false,
1277
- source: 'file',
1278
- });
1279
- mockFsExistsSync.mockReturnValue(true);
1280
- const userSettingsContent = {
1281
- ui: { theme: 'dark' },
1282
- tools: { sandbox: false },
1283
- context: { fileName: 'USER.md' },
1284
- };
1285
- const workspaceSettingsContent = {
1286
- tools: { sandbox: true },
1287
- context: { fileName: 'WORKSPACE.md' },
1288
- };
1289
- fs.readFileSync.mockImplementation((p) => {
1290
- if (p === USER_SETTINGS_PATH)
1291
- return JSON.stringify(userSettingsContent);
1292
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1293
- return JSON.stringify(workspaceSettingsContent);
1294
- return '{}';
1295
- });
1296
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1297
- expect(settings.merged.tools?.sandbox).toBe(false); // User setting
1298
- expect(settings.merged.context?.fileName).toBe('USER.md'); // User setting
1299
- expect(settings.merged.ui?.theme).toBe('dark'); // User setting
1300
- });
1301
- });
1302
- describe('loadEnvironment', () => {
1303
- function setup({ isFolderTrustEnabled = true, isWorkspaceTrustedValue = true, }) {
1304
- delete process.env['TESTTEST']; // reset
1305
- const geminiEnvPath = path.resolve(path.join(GEMINI_DIR, '.env'));
1306
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
1307
- isTrusted: isWorkspaceTrustedValue,
1308
- source: 'file',
1309
- });
1310
- mockFsExistsSync.mockImplementation((p) => [USER_SETTINGS_PATH, geminiEnvPath].includes(p.toString()));
1311
- const userSettingsContent = {
1312
- ui: {
1313
- theme: 'dark',
1314
- },
1315
- security: {
1316
- folderTrust: {
1317
- enabled: isFolderTrustEnabled,
1318
- },
1319
- },
1320
- context: {
1321
- fileName: 'USER_CONTEXT.md',
1322
- },
1323
- };
1324
- fs.readFileSync.mockImplementation((p) => {
1325
- if (p === USER_SETTINGS_PATH)
1326
- return JSON.stringify(userSettingsContent);
1327
- if (p === geminiEnvPath)
1328
- return 'TESTTEST=1234';
1329
- return '{}';
1330
- });
1331
- }
1332
- it('sets environment variables from .env files', () => {
1333
- setup({ isFolderTrustEnabled: false, isWorkspaceTrustedValue: true });
1334
- loadEnvironment(loadSettings(MOCK_WORKSPACE_DIR).merged);
1335
- expect(process.env['TESTTEST']).toEqual('1234');
1336
- });
1337
- it('does not load env files from untrusted spaces', () => {
1338
- setup({ isFolderTrustEnabled: true, isWorkspaceTrustedValue: false });
1339
- loadEnvironment(loadSettings(MOCK_WORKSPACE_DIR).merged);
1340
- expect(process.env['TESTTEST']).not.toEqual('1234');
1341
- });
1342
- });
1343
- describe('migrateDeprecatedSettings', () => {
1344
- let mockFsExistsSync;
1345
- let mockFsReadFileSync;
1346
- beforeEach(() => {
1347
- vi.resetAllMocks();
1348
- mockFsExistsSync = vi.mocked(fs.existsSync);
1349
- mockFsExistsSync.mockReturnValue(true);
1350
- mockFsReadFileSync = vi.mocked(fs.readFileSync);
1351
- mockFsReadFileSync.mockReturnValue('{}');
1352
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
1353
- isTrusted: true,
1354
- source: undefined,
1355
- });
1356
- });
1357
- afterEach(() => {
1358
- vi.restoreAllMocks();
1359
- });
1360
- it('should not do anything if there are no deprecated settings', () => {
1361
- const userSettingsContent = {
1362
- extensions: {
1363
- enabled: ['user-ext-1'],
1364
- },
1365
- };
1366
- const workspaceSettingsContent = {
1367
- someOtherSetting: 'value',
1368
- };
1369
- fs.readFileSync.mockImplementation((p) => {
1370
- if (p === USER_SETTINGS_PATH)
1371
- return JSON.stringify(userSettingsContent);
1372
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1373
- return JSON.stringify(workspaceSettingsContent);
1374
- return '{}';
1375
- });
1376
- const setValueSpy = vi.spyOn(LoadedSettings.prototype, 'setValue');
1377
- const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1378
- setValueSpy.mockClear();
1379
- migrateDeprecatedSettings(loadedSettings, true);
1380
- expect(setValueSpy).not.toHaveBeenCalled();
1381
- });
1382
- it('should migrate general.disableAutoUpdate to general.enableAutoUpdate with inverted value', () => {
1383
- const userSettingsContent = {
1384
- general: {
1385
- disableAutoUpdate: true,
1386
- },
1387
- };
1388
- fs.readFileSync.mockImplementation((p) => {
1389
- if (p === USER_SETTINGS_PATH)
1390
- return JSON.stringify(userSettingsContent);
1391
- return '{}';
1392
- });
1393
- const setValueSpy = vi.spyOn(LoadedSettings.prototype, 'setValue');
1394
- const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1395
- migrateDeprecatedSettings(loadedSettings, true);
1396
- // Should set new value to false (inverted from true)
1397
- expect(setValueSpy).toHaveBeenCalledWith(SettingScope.User, 'general', expect.objectContaining({ enableAutoUpdate: false }));
1398
- });
1399
- it('should migrate all 4 inverted boolean settings', () => {
1400
- const userSettingsContent = {
1401
- general: {
1402
- disableAutoUpdate: false,
1403
- disableUpdateNag: true,
1404
- },
1405
- context: {
1406
- fileFiltering: {
1407
- disableFuzzySearch: false,
1408
- },
1409
- },
1410
- ui: {
1411
- accessibility: {
1412
- disableLoadingPhrases: true,
1413
- },
1414
- },
1415
- };
1416
- fs.readFileSync.mockImplementation((p) => {
1417
- if (p === USER_SETTINGS_PATH)
1418
- return JSON.stringify(userSettingsContent);
1419
- return '{}';
1420
- });
1421
- const setValueSpy = vi.spyOn(LoadedSettings.prototype, 'setValue');
1422
- const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1423
- migrateDeprecatedSettings(loadedSettings, true);
1424
- // Check that general settings were migrated with inverted values
1425
- expect(setValueSpy).toHaveBeenCalledWith(SettingScope.User, 'general', expect.objectContaining({ enableAutoUpdate: true }));
1426
- expect(setValueSpy).toHaveBeenCalledWith(SettingScope.User, 'general', expect.objectContaining({ enableAutoUpdateNotification: false }));
1427
- // Check context.fileFiltering was migrated
1428
- expect(setValueSpy).toHaveBeenCalledWith(SettingScope.User, 'context', expect.objectContaining({
1429
- fileFiltering: expect.objectContaining({ enableFuzzySearch: true }),
1430
- }));
1431
- // Check ui.accessibility was migrated
1432
- expect(setValueSpy).toHaveBeenCalledWith(SettingScope.User, 'ui', expect.objectContaining({
1433
- accessibility: expect.objectContaining({
1434
- enableLoadingPhrases: false,
1435
- }),
1436
- }));
1437
- });
1438
- it('should prioritize new settings over deprecated ones and respect removeDeprecated flag', () => {
1439
- const userSettingsContent = {
1440
- general: {
1441
- disableAutoUpdate: true,
1442
- enableAutoUpdate: true, // Trust this (true) over disableAutoUpdate (true -> false)
1443
- },
1444
- context: {
1445
- fileFiltering: {
1446
- disableFuzzySearch: false,
1447
- enableFuzzySearch: false, // Trust this (false) over disableFuzzySearch (false -> true)
1448
- },
1449
- },
1450
- };
1451
- const loadedSettings = new LoadedSettings({
1452
- path: getSystemSettingsPath(),
1453
- settings: {},
1454
- originalSettings: {},
1455
- }, {
1456
- path: getSystemDefaultsPath(),
1457
- settings: {},
1458
- originalSettings: {},
1459
- }, {
1460
- path: USER_SETTINGS_PATH,
1461
- settings: userSettingsContent,
1462
- originalSettings: userSettingsContent,
1463
- }, {
1464
- path: MOCK_WORKSPACE_SETTINGS_PATH,
1465
- settings: {},
1466
- originalSettings: {},
1467
- }, true);
1468
- const setValueSpy = vi.spyOn(loadedSettings, 'setValue');
1469
- // 1. removeDeprecated = false (default)
1470
- migrateDeprecatedSettings(loadedSettings);
1471
- // Should still have old settings
1472
- expect(loadedSettings.forScope(SettingScope.User).settings.general).toHaveProperty('disableAutoUpdate');
1473
- expect(loadedSettings.forScope(SettingScope.User).settings.context.fileFiltering).toHaveProperty('disableFuzzySearch');
1474
- // 2. removeDeprecated = true
1475
- migrateDeprecatedSettings(loadedSettings, true);
1476
- // Should remove disableAutoUpdate and trust enableAutoUpdate: true
1477
- expect(setValueSpy).toHaveBeenCalledWith(SettingScope.User, 'general', {
1478
- enableAutoUpdate: true,
1479
- });
1480
- // Should remove disableFuzzySearch and trust enableFuzzySearch: false
1481
- expect(setValueSpy).toHaveBeenCalledWith(SettingScope.User, 'context', {
1482
- fileFiltering: { enableFuzzySearch: false },
1483
- });
1484
- });
1485
- it('should trigger migration automatically during loadSettings', () => {
1486
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
1487
- const userSettingsContent = {
1488
- general: {
1489
- disableAutoUpdate: true,
1490
- },
1491
- };
1492
- fs.readFileSync.mockImplementation((p) => {
1493
- if (p === USER_SETTINGS_PATH)
1494
- return JSON.stringify(userSettingsContent);
1495
- return '{}';
1496
- });
1497
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1498
- // Verify it was migrated in the merged settings
1499
- expect(settings.merged.general?.enableAutoUpdate).toBe(false);
1500
- // Verify it was saved back to disk (via setValue calling updateSettingsFilePreservingFormat)
1501
- expect(updateSettingsFilePreservingFormat).toHaveBeenCalledWith(USER_SETTINGS_PATH, expect.objectContaining({
1502
- general: expect.objectContaining({ enableAutoUpdate: false }),
1503
- }));
1504
- });
1505
- it('should migrate disableUpdateNag to enableAutoUpdateNotification in system and system defaults settings', () => {
1506
- const systemSettingsContent = {
1507
- general: {
1508
- disableUpdateNag: true,
1509
- },
1510
- };
1511
- const systemDefaultsContent = {
1512
- general: {
1513
- disableUpdateNag: false,
1514
- },
1515
- };
1516
- vi.mocked(fs.existsSync).mockReturnValue(true);
1517
- fs.readFileSync.mockImplementation((p) => {
1518
- if (p === getSystemSettingsPath()) {
1519
- return JSON.stringify(systemSettingsContent);
1520
- }
1521
- if (p === getSystemDefaultsPath()) {
1522
- return JSON.stringify(systemDefaultsContent);
1523
- }
1524
- return '{}';
1525
- });
1526
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1527
- // Verify system settings were migrated
1528
- expect(settings.system.settings.general).toHaveProperty('enableAutoUpdateNotification');
1529
- expect(settings.system.settings.general['enableAutoUpdateNotification']).toBe(false);
1530
- // Verify system defaults settings were migrated
1531
- expect(settings.systemDefaults.settings.general).toHaveProperty('enableAutoUpdateNotification');
1532
- expect(settings.systemDefaults.settings.general['enableAutoUpdateNotification']).toBe(true);
1533
- // Merged should also reflect it (system overrides defaults, but both are migrated)
1534
- expect(settings.merged.general?.enableAutoUpdateNotification).toBe(false);
1535
- });
1536
- it('should migrate experimental agent settings to agents overrides', () => {
1537
- const userSettingsContent = {
1538
- experimental: {
1539
- codebaseInvestigatorSettings: {
1540
- enabled: true,
1541
- maxNumTurns: 15,
1542
- maxTimeMinutes: 5,
1543
- thinkingBudget: 16384,
1544
- model: 'gemini-1.5-pro',
1545
- },
1546
- cliHelpAgentSettings: {
1547
- enabled: false,
1548
- },
1549
- },
1550
- };
1551
- vi.mocked(fs.existsSync).mockReturnValue(true);
1552
- fs.readFileSync.mockImplementation((p) => {
1553
- if (p === USER_SETTINGS_PATH)
1554
- return JSON.stringify(userSettingsContent);
1555
- return '{}';
1556
- });
1557
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1558
- // Verify migration to agents.overrides
1559
- expect(settings.user.settings.agents?.overrides).toMatchObject({
1560
- codebase_investigator: {
1561
- enabled: true,
1562
- runConfig: {
1563
- maxTurns: 15,
1564
- maxTimeMinutes: 5,
1565
- },
1566
- modelConfig: {
1567
- model: 'gemini-1.5-pro',
1568
- generateContentConfig: {
1569
- thinkingConfig: {
1570
- thinkingBudget: 16384,
1571
- },
1572
- },
1573
- },
1574
- },
1575
- cli_help: {
1576
- enabled: false,
1577
- },
1578
- });
1579
- });
1580
- });
1581
- describe('saveSettings', () => {
1582
- it('should save settings using updateSettingsFilePreservingFormat', () => {
1583
- const mockUpdateSettings = vi.mocked(updateSettingsFilePreservingFormat);
1584
- const settingsFile = {
1585
- path: '/mock/settings.json',
1586
- settings: { ui: { theme: 'dark' } },
1587
- originalSettings: { ui: { theme: 'dark' } },
1588
- };
1589
- saveSettings(settingsFile);
1590
- expect(mockUpdateSettings).toHaveBeenCalledWith('/mock/settings.json', {
1591
- ui: { theme: 'dark' },
1592
- });
1593
- });
1594
- it('should create directory if it does not exist', () => {
1595
- const mockFsExistsSync = vi.mocked(fs.existsSync);
1596
- const mockFsMkdirSync = vi.mocked(fs.mkdirSync);
1597
- mockFsExistsSync.mockReturnValue(false);
1598
- const settingsFile = {
1599
- path: '/mock/new/dir/settings.json',
1600
- settings: {},
1601
- originalSettings: {},
1602
- };
1603
- saveSettings(settingsFile);
1604
- expect(mockFsExistsSync).toHaveBeenCalledWith('/mock/new/dir');
1605
- expect(mockFsMkdirSync).toHaveBeenCalledWith('/mock/new/dir', {
1606
- recursive: true,
1607
- });
1608
- });
1609
- it('should emit error feedback if saving fails', () => {
1610
- const mockUpdateSettings = vi.mocked(updateSettingsFilePreservingFormat);
1611
- const error = new Error('Write failed');
1612
- mockUpdateSettings.mockImplementation(() => {
1613
- throw error;
1614
- });
1615
- const settingsFile = {
1616
- path: '/mock/settings.json',
1617
- settings: {},
1618
- originalSettings: {},
1619
- };
1620
- saveSettings(settingsFile);
1621
- expect(mockCoreEvents.emitFeedback).toHaveBeenCalledWith('error', 'There was an error saving your latest settings changes.', error);
1622
- });
1623
- });
1624
- describe('LoadedSettings and remote admin settings', () => {
1625
- it('should prioritize remote admin settings over file-based admin settings', () => {
1626
- mockFsExistsSync.mockReturnValue(true);
1627
- const systemSettingsContent = {
1628
- admin: {
1629
- // These should be ignored
1630
- secureModeEnabled: true,
1631
- mcp: { enabled: false },
1632
- extensions: { enabled: false },
1633
- },
1634
- // A non-admin setting to ensure it's still processed
1635
- ui: { theme: 'system-theme' },
1636
- };
1637
- fs.readFileSync.mockImplementation((p) => {
1638
- if (p === getSystemSettingsPath()) {
1639
- return JSON.stringify(systemSettingsContent);
1640
- }
1641
- return '{}';
1642
- });
1643
- const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1644
- // 1. Verify that on initial load, file-based admin settings are ignored
1645
- // and schema defaults are used instead.
1646
- expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false); // default: false
1647
- expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true); // default: true
1648
- expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true); // default: true
1649
- expect(loadedSettings.merged.ui?.theme).toBe('system-theme'); // non-admin setting should be loaded
1650
- // 2. Now, set remote admin settings.
1651
- loadedSettings.setRemoteAdminSettings({
1652
- secureModeEnabled: true,
1653
- mcpSetting: { mcpEnabled: false },
1654
- cliFeatureSetting: { extensionsSetting: { extensionsEnabled: false } },
1655
- });
1656
- // 3. Verify that remote admin settings take precedence.
1657
- expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(true);
1658
- expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(false);
1659
- expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(false);
1660
- // non-admin setting should remain unchanged
1661
- expect(loadedSettings.merged.ui?.theme).toBe('system-theme');
1662
- });
1663
- it('should set remote admin settings and recompute merged settings', () => {
1664
- mockFsExistsSync.mockReturnValue(true);
1665
- const systemSettingsContent = {
1666
- admin: {
1667
- secureModeEnabled: false,
1668
- mcp: { enabled: false },
1669
- extensions: { enabled: false },
1670
- },
1671
- ui: { theme: 'initial-theme' },
1672
- };
1673
- fs.readFileSync.mockImplementation((p) => {
1674
- if (p === getSystemSettingsPath()) {
1675
- return JSON.stringify(systemSettingsContent);
1676
- }
1677
- return '{}';
1678
- });
1679
- const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1680
- // Ensure initial state from defaults (as file-based admin settings are ignored)
1681
- expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1682
- expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
1683
- expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
1684
- expect(loadedSettings.merged.ui?.theme).toBe('initial-theme');
1685
- const newRemoteSettings = {
1686
- secureModeEnabled: true,
1687
- mcpSetting: { mcpEnabled: false },
1688
- cliFeatureSetting: { extensionsSetting: { extensionsEnabled: false } },
1689
- };
1690
- loadedSettings.setRemoteAdminSettings(newRemoteSettings);
1691
- // Verify that remote admin settings are applied
1692
- expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(true);
1693
- expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(false);
1694
- expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(false);
1695
- // Non-admin settings should remain untouched
1696
- expect(loadedSettings.merged.ui?.theme).toBe('initial-theme');
1697
- // Verify that calling setRemoteAdminSettings with partial data overwrites previous remote settings
1698
- // and missing properties revert to schema defaults.
1699
- loadedSettings.setRemoteAdminSettings({ secureModeEnabled: false });
1700
- expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1701
- expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true); // Reverts to default: true
1702
- expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true); // Reverts to default: true
1703
- });
1704
- it('should correctly handle undefined remote admin settings', () => {
1705
- mockFsExistsSync.mockReturnValue(true);
1706
- const systemSettingsContent = {
1707
- ui: { theme: 'initial-theme' },
1708
- };
1709
- fs.readFileSync.mockImplementation((p) => {
1710
- if (p === getSystemSettingsPath()) {
1711
- return JSON.stringify(systemSettingsContent);
1712
- }
1713
- return '{}';
1714
- });
1715
- const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1716
- // Should have default admin settings
1717
- expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1718
- expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
1719
- expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
1720
- loadedSettings.setRemoteAdminSettings({}); // Set empty remote settings
1721
- // Admin settings should revert to defaults because there are no remote overrides
1722
- expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1723
- expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
1724
- expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
1725
- });
1726
- it('should correctly handle missing properties in remote admin settings', () => {
1727
- mockFsExistsSync.mockReturnValue(true);
1728
- const systemSettingsContent = {
1729
- admin: {
1730
- secureModeEnabled: true,
1731
- },
1732
- };
1733
- fs.readFileSync.mockImplementation((p) => {
1734
- if (p === getSystemSettingsPath()) {
1735
- return JSON.stringify(systemSettingsContent);
1736
- }
1737
- return '{}';
1738
- });
1739
- const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1740
- // Ensure initial state from defaults (as file-based admin settings are ignored)
1741
- expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1742
- expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
1743
- expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
1744
- // Set remote settings with only secureModeEnabled
1745
- loadedSettings.setRemoteAdminSettings({
1746
- secureModeEnabled: true,
1747
- });
1748
- // Verify secureModeEnabled is updated, others remain defaults
1749
- expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(true);
1750
- expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
1751
- expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
1752
- // Set remote settings with only mcpSetting.mcpEnabled
1753
- loadedSettings.setRemoteAdminSettings({
1754
- mcpSetting: { mcpEnabled: false },
1755
- });
1756
- // Verify mcpEnabled is updated, others remain defaults (secureModeEnabled reverts to default:false)
1757
- expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1758
- expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(false);
1759
- expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
1760
- // Set remote settings with only cliFeatureSetting.extensionsSetting.extensionsEnabled
1761
- loadedSettings.setRemoteAdminSettings({
1762
- cliFeatureSetting: { extensionsSetting: { extensionsEnabled: false } },
1763
- });
1764
- // Verify extensionsEnabled is updated, others remain defaults
1765
- expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1766
- expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
1767
- expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(false);
1768
- });
1769
- it('should set skills based on advancedFeaturesEnabled', () => {
1770
- const loadedSettings = loadSettings();
1771
- loadedSettings.setRemoteAdminSettings({
1772
- cliFeatureSetting: {
1773
- advancedFeaturesEnabled: true,
1774
- },
1775
- });
1776
- expect(loadedSettings.merged.admin.skills?.enabled).toBe(true);
1777
- loadedSettings.setRemoteAdminSettings({
1778
- cliFeatureSetting: {
1779
- advancedFeaturesEnabled: false,
1780
- },
1781
- });
1782
- expect(loadedSettings.merged.admin.skills?.enabled).toBe(false);
1783
- });
1784
- });
1785
- describe('getDefaultsFromSchema', () => {
1786
- it('should extract defaults from a schema', () => {
1787
- const mockSchema = {
1788
- prop1: {
1789
- type: 'string',
1790
- default: 'default1',
1791
- label: 'Prop 1',
1792
- category: 'General',
1793
- requiresRestart: false,
1794
- },
1795
- nested: {
1796
- type: 'object',
1797
- label: 'Nested',
1798
- category: 'General',
1799
- requiresRestart: false,
1800
- default: {},
1801
- properties: {
1802
- prop2: {
1803
- type: 'number',
1804
- default: 42,
1805
- label: 'Prop 2',
1806
- category: 'General',
1807
- requiresRestart: false,
1808
- },
1809
- },
1810
- },
1811
- };
1812
- const defaults = getDefaultsFromSchema(mockSchema);
1813
- expect(defaults).toEqual({
1814
- prop1: 'default1',
1815
- nested: {
1816
- prop2: 42,
1817
- },
1818
- });
1819
- });
1820
- });
1821
- });
1822
- //# sourceMappingURL=settings.test.js.map