@machina.ai/cell-cli 1.20.2-rc1 → 1.25.0-rc3

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 (873) hide show
  1. package/dist/package.json +5 -4
  2. package/dist/src/commands/extensions/configure.d.ts +13 -0
  3. package/dist/src/commands/extensions/configure.js +131 -0
  4. package/dist/src/commands/extensions/configure.js.map +1 -0
  5. package/dist/src/commands/extensions/configure.test.d.ts +1 -0
  6. package/dist/src/commands/extensions/configure.test.js +197 -0
  7. package/dist/src/commands/extensions/configure.test.js.map +1 -0
  8. package/dist/src/commands/extensions/disable.js.map +1 -1
  9. package/dist/src/commands/extensions/disable.test.js.map +1 -1
  10. package/dist/src/commands/extensions/enable.js.map +1 -1
  11. package/dist/src/commands/extensions/enable.test.js.map +1 -1
  12. package/dist/src/commands/extensions/examples/mcp-server/example.test.js +1 -1
  13. package/dist/src/commands/extensions/examples/mcp-server/example.test.js.map +1 -1
  14. package/dist/src/commands/extensions/examples/mcp-server/example.test.ts +4 -12
  15. package/dist/src/commands/extensions/install.js +7 -31
  16. package/dist/src/commands/extensions/install.js.map +1 -1
  17. package/dist/src/commands/extensions/install.test.js +21 -3
  18. package/dist/src/commands/extensions/install.test.js.map +1 -1
  19. package/dist/src/commands/extensions/link.test.js.map +1 -1
  20. package/dist/src/commands/extensions/list.test.js +0 -1
  21. package/dist/src/commands/extensions/list.test.js.map +1 -1
  22. package/dist/src/commands/extensions/uninstall.js.map +1 -1
  23. package/dist/src/commands/extensions/uninstall.test.js.map +1 -1
  24. package/dist/src/commands/extensions/update.test.js.map +1 -1
  25. package/dist/src/commands/extensions/utils.d.ts +14 -0
  26. package/dist/src/commands/extensions/utils.js +33 -0
  27. package/dist/src/commands/extensions/utils.js.map +1 -0
  28. package/dist/src/commands/extensions/validate.js +1 -1
  29. package/dist/src/commands/extensions/validate.js.map +1 -1
  30. package/dist/src/commands/extensions/validate.test.js +1 -1
  31. package/dist/src/commands/extensions/validate.test.js.map +1 -1
  32. package/dist/src/commands/extensions.js +2 -0
  33. package/dist/src/commands/extensions.js.map +1 -1
  34. package/dist/src/commands/hooks/migrate.d.ts +11 -0
  35. package/dist/src/commands/hooks/migrate.js +206 -0
  36. package/dist/src/commands/hooks/migrate.js.map +1 -0
  37. package/dist/src/commands/hooks/migrate.test.js +389 -0
  38. package/dist/src/commands/hooks/migrate.test.js.map +1 -0
  39. package/dist/src/commands/hooks.d.ts +7 -0
  40. package/dist/src/commands/hooks.js +22 -0
  41. package/dist/src/commands/hooks.js.map +1 -0
  42. package/dist/src/commands/mcp/add.js +4 -2
  43. package/dist/src/commands/mcp/add.js.map +1 -1
  44. package/dist/src/commands/mcp/add.test.js +24 -2
  45. package/dist/src/commands/mcp/add.test.js.map +1 -1
  46. package/dist/src/commands/mcp/list.js +7 -1
  47. package/dist/src/commands/mcp/list.js.map +1 -1
  48. package/dist/src/commands/skills/disable.d.ts +14 -0
  49. package/dist/src/commands/skills/disable.js +45 -0
  50. package/dist/src/commands/skills/disable.js.map +1 -0
  51. package/dist/src/commands/skills/disable.test.d.ts +6 -0
  52. package/dist/src/commands/skills/disable.test.js +80 -0
  53. package/dist/src/commands/skills/disable.test.js.map +1 -0
  54. package/dist/src/commands/skills/enable.d.ts +12 -0
  55. package/dist/src/commands/skills/enable.js +35 -0
  56. package/dist/src/commands/skills/enable.js.map +1 -0
  57. package/dist/src/commands/skills/enable.test.d.ts +6 -0
  58. package/dist/src/commands/skills/enable.test.js +107 -0
  59. package/dist/src/commands/skills/enable.test.js.map +1 -0
  60. package/dist/src/commands/skills/install.d.ts +14 -0
  61. package/dist/src/commands/skills/install.js +61 -0
  62. package/dist/src/commands/skills/install.js.map +1 -0
  63. package/dist/src/commands/skills/install.test.d.ts +6 -0
  64. package/dist/src/commands/skills/install.test.js +57 -0
  65. package/dist/src/commands/skills/install.test.js.map +1 -0
  66. package/dist/src/commands/skills/list.d.ts +10 -0
  67. package/dist/src/commands/skills/list.js +60 -0
  68. package/dist/src/commands/skills/list.js.map +1 -0
  69. package/dist/src/commands/skills/list.test.d.ts +6 -0
  70. package/dist/src/commands/skills/list.test.js +136 -0
  71. package/dist/src/commands/skills/list.test.js.map +1 -0
  72. package/dist/src/commands/skills/uninstall.d.ts +13 -0
  73. package/dist/src/commands/skills/uninstall.js +56 -0
  74. package/dist/src/commands/skills/uninstall.js.map +1 -0
  75. package/dist/src/commands/skills/uninstall.test.d.ts +6 -0
  76. package/dist/src/commands/skills/uninstall.test.js +61 -0
  77. package/dist/src/commands/skills/uninstall.test.js.map +1 -0
  78. package/dist/src/commands/skills.d.ts +7 -0
  79. package/dist/src/commands/skills.js +30 -0
  80. package/dist/src/commands/skills.js.map +1 -0
  81. package/dist/src/commands/skills.test.d.ts +6 -0
  82. package/dist/src/commands/skills.test.js +49 -0
  83. package/dist/src/commands/skills.test.js.map +1 -0
  84. package/dist/src/config/config.d.ts +10 -3
  85. package/dist/src/config/config.js +101 -34
  86. package/dist/src/config/config.js.map +1 -1
  87. package/dist/src/config/config.test.js +225 -16
  88. package/dist/src/config/config.test.js.map +1 -1
  89. package/dist/src/config/extension-manager-agents.test.d.ts +6 -0
  90. package/dist/src/config/extension-manager-agents.test.js +115 -0
  91. package/dist/src/config/extension-manager-agents.test.js.map +1 -0
  92. package/dist/src/config/extension-manager-scope.test.js +164 -0
  93. package/dist/src/config/extension-manager-scope.test.js.map +1 -0
  94. package/dist/src/config/extension-manager-skills.test.js +150 -0
  95. package/dist/src/config/extension-manager-skills.test.js.map +1 -0
  96. package/dist/src/config/extension-manager.d.ts +7 -1
  97. package/dist/src/config/extension-manager.js +202 -37
  98. package/dist/src/config/extension-manager.js.map +1 -1
  99. package/dist/src/config/extension.test.js +178 -13
  100. package/dist/src/config/extension.test.js.map +1 -1
  101. package/dist/src/config/extensions/consent.d.ts +5 -3
  102. package/dist/src/config/extensions/consent.js +33 -7
  103. package/dist/src/config/extensions/consent.js.map +1 -1
  104. package/dist/src/config/extensions/consent.test.js +114 -10
  105. package/dist/src/config/extensions/consent.test.js.map +1 -1
  106. package/dist/src/config/extensions/extensionSettings.d.ts +9 -1
  107. package/dist/src/config/extensions/extensionSettings.js +107 -17
  108. package/dist/src/config/extensions/extensionSettings.js.map +1 -1
  109. package/dist/src/config/extensions/extensionSettings.test.js +189 -54
  110. package/dist/src/config/extensions/extensionSettings.test.js.map +1 -1
  111. package/dist/src/config/extensions/extensionUpdates.test.js +231 -0
  112. package/dist/src/config/extensions/extensionUpdates.test.js.map +1 -0
  113. package/dist/src/config/extensions/github.d.ts +4 -1
  114. package/dist/src/config/extensions/github.js +33 -7
  115. package/dist/src/config/extensions/github.js.map +1 -1
  116. package/dist/src/config/extensions/github.test.js +190 -2
  117. package/dist/src/config/extensions/github.test.js.map +1 -1
  118. package/dist/src/config/extensions/github_fetch.js.map +1 -1
  119. package/dist/src/config/extensions/storage.js +2 -2
  120. package/dist/src/config/extensions/storage.js.map +1 -1
  121. package/dist/src/config/extensions/update.js +1 -1
  122. package/dist/src/config/extensions/update.js.map +1 -1
  123. package/dist/src/config/extensions/update.test.js +8 -8
  124. package/dist/src/config/extensions/update.test.js.map +1 -1
  125. package/dist/src/config/keyBindings.d.ts +14 -2
  126. package/dist/src/config/keyBindings.js +89 -11
  127. package/dist/src/config/keyBindings.js.map +1 -1
  128. package/dist/src/config/policy-engine.integration.test.js +13 -1
  129. package/dist/src/config/policy-engine.integration.test.js.map +1 -1
  130. package/dist/src/config/settings-validation.d.ts +23 -0
  131. package/dist/src/config/settings-validation.js +249 -0
  132. package/dist/src/config/settings-validation.js.map +1 -0
  133. package/dist/src/config/settings-validation.test.d.ts +6 -0
  134. package/dist/src/config/settings-validation.test.js +370 -0
  135. package/dist/src/config/settings-validation.test.js.map +1 -0
  136. package/dist/src/config/settings.d.ts +9 -7
  137. package/dist/src/config/settings.js +138 -233
  138. package/dist/src/config/settings.js.map +1 -1
  139. package/dist/src/config/settings.test.js +245 -571
  140. package/dist/src/config/settings.test.js.map +1 -1
  141. package/dist/src/config/settingsSchema.d.ts +459 -35
  142. package/dist/src/config/settingsSchema.js +541 -32
  143. package/dist/src/config/settingsSchema.js.map +1 -1
  144. package/dist/src/config/settingsSchema.test.js +22 -4
  145. package/dist/src/config/settingsSchema.test.js.map +1 -1
  146. package/dist/src/config/settings_repro.test.d.ts +6 -0
  147. package/dist/src/config/settings_repro.test.js +162 -0
  148. package/dist/src/config/settings_repro.test.js.map +1 -0
  149. package/dist/src/config/settings_validation_warning.test.d.ts +6 -0
  150. package/dist/src/config/settings_validation_warning.test.js +123 -0
  151. package/dist/src/config/settings_validation_warning.test.js.map +1 -0
  152. package/dist/src/config/trustedFolders.d.ts +1 -0
  153. package/dist/src/config/trustedFolders.js +18 -4
  154. package/dist/src/config/trustedFolders.js.map +1 -1
  155. package/dist/src/config/trustedFolders.test.js +45 -0
  156. package/dist/src/config/trustedFolders.test.js.map +1 -1
  157. package/dist/src/gemini.js +135 -69
  158. package/dist/src/gemini.js.map +1 -1
  159. package/dist/src/gemini.test.js +85 -99
  160. package/dist/src/gemini.test.js.map +1 -1
  161. package/dist/src/gemini_cleanup.test.js +7 -0
  162. package/dist/src/gemini_cleanup.test.js.map +1 -1
  163. package/dist/src/generated/git-commit.d.ts +3 -3
  164. package/dist/src/generated/git-commit.js +3 -3
  165. package/dist/src/nonInteractiveCli.js +59 -9
  166. package/dist/src/nonInteractiveCli.js.map +1 -1
  167. package/dist/src/nonInteractiveCli.test.js +114 -21
  168. package/dist/src/nonInteractiveCli.test.js.map +1 -1
  169. package/dist/src/services/BuiltinCommandLoader.d.ts +1 -1
  170. package/dist/src/services/BuiltinCommandLoader.js +66 -8
  171. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  172. package/dist/src/services/BuiltinCommandLoader.test.js +70 -12
  173. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
  174. package/dist/src/services/FeedbackService.js.map +1 -1
  175. package/dist/src/services/FileCommandLoader.js +6 -6
  176. package/dist/src/services/FileCommandLoader.js.map +1 -1
  177. package/dist/src/services/FileCommandLoader.test.js.map +1 -1
  178. package/dist/src/services/McpPromptLoader.js +1 -0
  179. package/dist/src/services/McpPromptLoader.js.map +1 -1
  180. package/dist/src/services/McpPromptLoader.test.js +40 -0
  181. package/dist/src/services/McpPromptLoader.test.js.map +1 -1
  182. package/dist/src/services/prompt-processors/shellProcessor.js +13 -11
  183. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
  184. package/dist/src/services/prompt-processors/shellProcessor.test.js +93 -61
  185. package/dist/src/services/prompt-processors/shellProcessor.test.js.map +1 -1
  186. package/dist/src/test-utils/render.js +5 -2
  187. package/dist/src/test-utils/render.js.map +1 -1
  188. package/dist/src/ui/App.test.js +2 -2
  189. package/dist/src/ui/App.test.js.map +1 -1
  190. package/dist/src/ui/AppContainer.js +200 -94
  191. package/dist/src/ui/AppContainer.js.map +1 -1
  192. package/dist/src/ui/AppContainer.test.js +405 -69
  193. package/dist/src/ui/AppContainer.test.js.map +1 -1
  194. package/dist/src/ui/IdeIntegrationNudge.test.js +18 -7
  195. package/dist/src/ui/IdeIntegrationNudge.test.js.map +1 -1
  196. package/dist/src/ui/auth/ApiAuthDialog.js +36 -3
  197. package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -1
  198. package/dist/src/ui/auth/ApiAuthDialog.test.js +26 -2
  199. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +1 -1
  200. package/dist/src/ui/auth/AuthDialog.d.ts +4 -1
  201. package/dist/src/ui/auth/AuthDialog.js +11 -4
  202. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  203. package/dist/src/ui/auth/AuthDialog.test.js +19 -2
  204. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
  205. package/dist/src/ui/auth/AuthInProgress.test.js +16 -6
  206. package/dist/src/ui/auth/AuthInProgress.test.js.map +1 -1
  207. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.d.ts +10 -0
  208. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.js +27 -0
  209. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.js.map +1 -0
  210. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.d.ts +6 -0
  211. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js +68 -0
  212. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js.map +1 -0
  213. package/dist/src/ui/auth/useAuth.js +9 -4
  214. package/dist/src/ui/auth/useAuth.js.map +1 -1
  215. package/dist/src/ui/auth/useAuth.test.js +2 -2
  216. package/dist/src/ui/auth/useAuth.test.js.map +1 -1
  217. package/dist/src/ui/commands/aboutCommand.js +3 -4
  218. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  219. package/dist/src/ui/commands/aboutCommand.test.js +7 -10
  220. package/dist/src/ui/commands/aboutCommand.test.js.map +1 -1
  221. package/dist/src/ui/commands/agentsCommand.d.ts +7 -0
  222. package/dist/src/ui/commands/agentsCommand.js +79 -0
  223. package/dist/src/ui/commands/agentsCommand.js.map +1 -0
  224. package/dist/src/ui/commands/agentsCommand.test.d.ts +6 -0
  225. package/dist/src/ui/commands/agentsCommand.test.js +91 -0
  226. package/dist/src/ui/commands/agentsCommand.test.js.map +1 -0
  227. package/dist/src/ui/commands/authCommand.js +30 -3
  228. package/dist/src/ui/commands/authCommand.js.map +1 -1
  229. package/dist/src/ui/commands/authCommand.test.js +72 -4
  230. package/dist/src/ui/commands/authCommand.test.js.map +1 -1
  231. package/dist/src/ui/commands/bugCommand.js +37 -6
  232. package/dist/src/ui/commands/bugCommand.js.map +1 -1
  233. package/dist/src/ui/commands/bugCommand.test.js +86 -5
  234. package/dist/src/ui/commands/bugCommand.test.js.map +1 -1
  235. package/dist/src/ui/commands/chatCommand.d.ts +1 -2
  236. package/dist/src/ui/commands/chatCommand.js +52 -52
  237. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  238. package/dist/src/ui/commands/chatCommand.test.js +95 -69
  239. package/dist/src/ui/commands/chatCommand.test.js.map +1 -1
  240. package/dist/src/ui/commands/clearCommand.js +22 -1
  241. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  242. package/dist/src/ui/commands/clearCommand.test.js +6 -0
  243. package/dist/src/ui/commands/clearCommand.test.js.map +1 -1
  244. package/dist/src/ui/commands/copyCommand.js +1 -1
  245. package/dist/src/ui/commands/copyCommand.js.map +1 -1
  246. package/dist/src/ui/commands/directoryCommand.js +27 -10
  247. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  248. package/dist/src/ui/commands/directoryCommand.test.js +49 -11
  249. package/dist/src/ui/commands/directoryCommand.test.js.map +1 -1
  250. package/dist/src/ui/commands/extensionsCommand.js +194 -24
  251. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  252. package/dist/src/ui/commands/extensionsCommand.test.js +217 -27
  253. package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
  254. package/dist/src/ui/commands/helpCommand.js +1 -1
  255. package/dist/src/ui/commands/helpCommand.js.map +1 -1
  256. package/dist/src/ui/commands/helpCommand.test.js +1 -1
  257. package/dist/src/ui/commands/helpCommand.test.js.map +1 -1
  258. package/dist/src/ui/commands/hooksCommand.d.ts +7 -0
  259. package/dist/src/ui/commands/hooksCommand.js +342 -0
  260. package/dist/src/ui/commands/hooksCommand.js.map +1 -0
  261. package/dist/src/ui/commands/hooksCommand.test.d.ts +6 -0
  262. package/dist/src/ui/commands/hooksCommand.test.js +575 -0
  263. package/dist/src/ui/commands/hooksCommand.test.js.map +1 -0
  264. package/dist/src/ui/commands/ideCommand.test.js.map +1 -1
  265. package/dist/src/ui/commands/initCommand.js +10 -50
  266. package/dist/src/ui/commands/initCommand.js.map +1 -1
  267. package/dist/src/ui/commands/initCommand.test.js.map +1 -1
  268. package/dist/src/ui/commands/mcpCommand.js +34 -16
  269. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  270. package/dist/src/ui/commands/mcpCommand.test.js +43 -6
  271. package/dist/src/ui/commands/mcpCommand.test.js.map +1 -1
  272. package/dist/src/ui/commands/memoryCommand.js +19 -33
  273. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  274. package/dist/src/ui/commands/memoryCommand.test.js +112 -16
  275. package/dist/src/ui/commands/memoryCommand.test.js.map +1 -1
  276. package/dist/src/ui/commands/modelCommand.js +10 -5
  277. package/dist/src/ui/commands/modelCommand.js.map +1 -1
  278. package/dist/src/ui/commands/modelCommand.test.js +12 -1
  279. package/dist/src/ui/commands/modelCommand.test.js.map +1 -1
  280. package/dist/src/ui/commands/restoreCommand.d.ts +1 -1
  281. package/dist/src/ui/commands/restoreCommand.js +38 -33
  282. package/dist/src/ui/commands/restoreCommand.js.map +1 -1
  283. package/dist/src/ui/commands/restoreCommand.test.js +6 -6
  284. package/dist/src/ui/commands/restoreCommand.test.js.map +1 -1
  285. package/dist/src/ui/commands/setupGithubCommand.test.js.map +1 -1
  286. package/dist/src/ui/commands/skillsCommand.d.ts +7 -0
  287. package/dist/src/ui/commands/skillsCommand.js +235 -0
  288. package/dist/src/ui/commands/skillsCommand.js.map +1 -0
  289. package/dist/src/ui/commands/skillsCommand.test.d.ts +6 -0
  290. package/dist/src/ui/commands/skillsCommand.test.js +405 -0
  291. package/dist/src/ui/commands/skillsCommand.test.js.map +1 -0
  292. package/dist/src/ui/commands/statsCommand.js +6 -10
  293. package/dist/src/ui/commands/statsCommand.js.map +1 -1
  294. package/dist/src/ui/commands/statsCommand.test.js +20 -3
  295. package/dist/src/ui/commands/statsCommand.test.js.map +1 -1
  296. package/dist/src/ui/commands/terminalSetupCommand.js +1 -0
  297. package/dist/src/ui/commands/terminalSetupCommand.js.map +1 -1
  298. package/dist/src/ui/commands/toolsCommand.js +2 -2
  299. package/dist/src/ui/commands/toolsCommand.js.map +1 -1
  300. package/dist/src/ui/commands/toolsCommand.test.js +2 -2
  301. package/dist/src/ui/commands/toolsCommand.test.js.map +1 -1
  302. package/dist/src/ui/commands/types.d.ts +16 -38
  303. package/dist/src/ui/commands/types.js +1 -0
  304. package/dist/src/ui/commands/types.js.map +1 -1
  305. package/dist/src/ui/components/AnsiOutput.js +1 -1
  306. package/dist/src/ui/components/AnsiOutput.js.map +1 -1
  307. package/dist/src/ui/components/AppHeader.test.js +8 -0
  308. package/dist/src/ui/components/AppHeader.test.js.map +1 -1
  309. package/dist/src/ui/components/AsciiArt.d.ts +6 -6
  310. package/dist/src/ui/components/AsciiArt.js +6 -6
  311. package/dist/src/ui/components/Composer.js +7 -7
  312. package/dist/src/ui/components/Composer.js.map +1 -1
  313. package/dist/src/ui/components/Composer.test.js +23 -4
  314. package/dist/src/ui/components/Composer.test.js.map +1 -1
  315. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +1 -0
  316. package/dist/src/ui/components/ContextSummaryDisplay.js +12 -5
  317. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  318. package/dist/src/ui/components/ContextSummaryDisplay.test.js +56 -25
  319. package/dist/src/ui/components/ContextSummaryDisplay.test.js.map +1 -1
  320. package/dist/src/ui/components/DetailedMessagesDisplay.js +3 -3
  321. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  322. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +2 -12
  323. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +1 -1
  324. package/dist/src/ui/components/DialogManager.js +3 -3
  325. package/dist/src/ui/components/DialogManager.js.map +1 -1
  326. package/dist/src/ui/components/EditorSettingsDialog.js +2 -1
  327. package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -1
  328. package/dist/src/ui/components/EditorSettingsDialog.test.js +10 -2
  329. package/dist/src/ui/components/EditorSettingsDialog.test.js.map +1 -1
  330. package/dist/src/ui/components/FolderTrustDialog.js +20 -14
  331. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  332. package/dist/src/ui/components/FolderTrustDialog.test.js +12 -2
  333. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  334. package/dist/src/ui/components/Footer.js +6 -6
  335. package/dist/src/ui/components/Footer.js.map +1 -1
  336. package/dist/src/ui/components/GeminiRespondingSpinner.test.js +3 -0
  337. package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +1 -1
  338. package/dist/src/ui/components/Header.js +3 -1
  339. package/dist/src/ui/components/Header.js.map +1 -1
  340. package/dist/src/ui/components/Header.test.js +3 -1
  341. package/dist/src/ui/components/Header.test.js.map +1 -1
  342. package/dist/src/ui/components/Help.js +1 -1
  343. package/dist/src/ui/components/Help.js.map +1 -1
  344. package/dist/src/ui/components/HistoryItemDisplay.js +4 -1
  345. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  346. package/dist/src/ui/components/HistoryItemDisplay.test.js +21 -0
  347. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  348. package/dist/src/ui/components/HookStatusDisplay.d.ts +12 -0
  349. package/dist/src/ui/components/HookStatusDisplay.js +20 -0
  350. package/dist/src/ui/components/HookStatusDisplay.js.map +1 -0
  351. package/dist/src/ui/components/HookStatusDisplay.test.d.ts +6 -0
  352. package/dist/src/ui/components/HookStatusDisplay.test.js +51 -0
  353. package/dist/src/ui/components/HookStatusDisplay.test.js.map +1 -0
  354. package/dist/src/ui/components/IdeTrustChangeDialog.js +3 -1
  355. package/dist/src/ui/components/IdeTrustChangeDialog.js.map +1 -1
  356. package/dist/src/ui/components/IdeTrustChangeDialog.test.js +4 -3
  357. package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +1 -1
  358. package/dist/src/ui/components/InputPrompt.js +77 -26
  359. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  360. package/dist/src/ui/components/InputPrompt.test.js +307 -7
  361. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  362. package/dist/src/ui/components/LogoutConfirmationDialog.d.ts +15 -0
  363. package/dist/src/ui/components/LogoutConfirmationDialog.js +37 -0
  364. package/dist/src/ui/components/LogoutConfirmationDialog.js.map +1 -0
  365. package/dist/src/ui/components/LogoutConfirmationDialog.test.d.ts +6 -0
  366. package/dist/src/ui/components/LogoutConfirmationDialog.test.js +59 -0
  367. package/dist/src/ui/components/LogoutConfirmationDialog.test.js.map +1 -0
  368. package/dist/src/ui/components/MainContent.js +12 -10
  369. package/dist/src/ui/components/MainContent.js.map +1 -1
  370. package/dist/src/ui/components/MainContent.test.js +19 -9
  371. package/dist/src/ui/components/MainContent.test.js.map +1 -1
  372. package/dist/src/ui/components/ModelDialog.js +122 -41
  373. package/dist/src/ui/components/ModelDialog.js.map +1 -1
  374. package/dist/src/ui/components/ModelDialog.test.js +171 -148
  375. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  376. package/dist/src/ui/components/ModelStatsDisplay.js +68 -14
  377. package/dist/src/ui/components/ModelStatsDisplay.js.map +1 -1
  378. package/dist/src/ui/components/ModelStatsDisplay.test.js +62 -4
  379. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +1 -1
  380. package/dist/src/ui/components/MultiFolderTrustDialog.d.ts +2 -2
  381. package/dist/src/ui/components/MultiFolderTrustDialog.js +3 -2
  382. package/dist/src/ui/components/MultiFolderTrustDialog.js.map +1 -1
  383. package/dist/src/ui/components/MultiFolderTrustDialog.test.js +9 -9
  384. package/dist/src/ui/components/MultiFolderTrustDialog.test.js.map +1 -1
  385. package/dist/src/ui/components/Notifications.js +5 -4
  386. package/dist/src/ui/components/Notifications.js.map +1 -1
  387. package/dist/src/ui/components/Notifications.test.js +1 -0
  388. package/dist/src/ui/components/Notifications.test.js.map +1 -1
  389. package/dist/src/ui/components/PermissionsModifyTrustDialog.js +1 -0
  390. package/dist/src/ui/components/PermissionsModifyTrustDialog.js.map +1 -1
  391. package/dist/src/ui/components/ProQuotaDialog.d.ts +1 -3
  392. package/dist/src/ui/components/ProQuotaDialog.js +16 -32
  393. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
  394. package/dist/src/ui/components/ProQuotaDialog.test.js +43 -29
  395. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
  396. package/dist/src/ui/components/QuittingDisplay.test.js.map +1 -1
  397. package/dist/src/ui/components/SessionBrowser.js +2 -0
  398. package/dist/src/ui/components/SessionBrowser.js.map +1 -1
  399. package/dist/src/ui/components/SessionSummaryDisplay.test.js +1 -0
  400. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +1 -1
  401. package/dist/src/ui/components/SettingsDialog.js +166 -77
  402. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  403. package/dist/src/ui/components/SettingsDialog.test.js +118 -13
  404. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  405. package/dist/src/ui/components/ShellConfirmationDialog.js +4 -4
  406. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
  407. package/dist/src/ui/components/ShellConfirmationDialog.test.js +4 -4
  408. package/dist/src/ui/components/ShellConfirmationDialog.test.js.map +1 -1
  409. package/dist/src/ui/components/StatsDisplay.d.ts +1 -1
  410. package/dist/src/ui/components/StatsDisplay.js +66 -21
  411. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  412. package/dist/src/ui/components/StatsDisplay.test.js +44 -7
  413. package/dist/src/ui/components/StatsDisplay.test.js.map +1 -1
  414. package/dist/src/ui/components/StatusDisplay.d.ts +11 -0
  415. package/dist/src/ui/components/StatusDisplay.js +40 -0
  416. package/dist/src/ui/components/StatusDisplay.js.map +1 -0
  417. package/dist/src/ui/components/StatusDisplay.test.d.ts +6 -0
  418. package/dist/src/ui/components/StatusDisplay.test.js +144 -0
  419. package/dist/src/ui/components/StatusDisplay.test.js.map +1 -0
  420. package/dist/src/ui/components/StickyHeader.d.ts +2 -0
  421. package/dist/src/ui/components/StickyHeader.js +1 -1
  422. package/dist/src/ui/components/StickyHeader.js.map +1 -1
  423. package/dist/src/ui/components/SuggestionsDisplay.js +7 -2
  424. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  425. package/dist/src/ui/components/Table.d.ts +21 -0
  426. package/dist/src/ui/components/Table.js +7 -0
  427. package/dist/src/ui/components/Table.js.map +1 -0
  428. package/dist/src/ui/components/Table.test.d.ts +6 -0
  429. package/dist/src/ui/components/Table.test.js +53 -0
  430. package/dist/src/ui/components/Table.test.js.map +1 -0
  431. package/dist/src/ui/components/ThemeDialog.js +63 -17
  432. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  433. package/dist/src/ui/components/ThemeDialog.test.js +66 -1
  434. package/dist/src/ui/components/ThemeDialog.test.js.map +1 -1
  435. package/dist/src/ui/components/ToolStatsDisplay.js.map +1 -1
  436. package/dist/src/ui/components/messages/DiffRenderer.js +5 -13
  437. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  438. package/dist/src/ui/components/messages/DiffRenderer.test.js +26 -17
  439. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -1
  440. package/dist/src/ui/components/messages/ShellToolMessage.js +8 -5
  441. package/dist/src/ui/components/messages/ShellToolMessage.js.map +1 -1
  442. package/dist/src/ui/components/messages/Todo.js.map +1 -1
  443. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +55 -24
  444. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  445. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +40 -4
  446. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  447. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +45 -1
  448. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  449. package/dist/src/ui/components/messages/ToolMessage.js +6 -2
  450. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  451. package/dist/src/ui/components/messages/ToolMessage.test.js +1 -0
  452. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
  453. package/dist/src/ui/components/messages/ToolResultDisplay.js +22 -16
  454. package/dist/src/ui/components/messages/ToolResultDisplay.js.map +1 -1
  455. package/dist/src/ui/components/messages/ToolResultDisplay.test.js +36 -18
  456. package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +1 -1
  457. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.d.ts +6 -0
  458. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js +134 -0
  459. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js.map +1 -0
  460. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.d.ts +1 -1
  461. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js +1 -1
  462. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js.map +1 -1
  463. package/dist/src/ui/components/shared/MaxSizedBox.d.ts +2 -38
  464. package/dist/src/ui/components/shared/MaxSizedBox.js +34 -418
  465. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  466. package/dist/src/ui/components/shared/MaxSizedBox.test.js +48 -133
  467. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -1
  468. package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +4 -1
  469. package/dist/src/ui/components/shared/RadioButtonSelect.js +11 -10
  470. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  471. package/dist/src/ui/components/shared/VirtualizedList.js.map +1 -1
  472. package/dist/src/ui/components/shared/text-buffer.d.ts +40 -4
  473. package/dist/src/ui/components/shared/text-buffer.js +279 -102
  474. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  475. package/dist/src/ui/components/shared/text-buffer.test.js +247 -1
  476. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  477. package/dist/src/ui/components/shared/vim-buffer-actions.test.js +3 -0
  478. package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +1 -1
  479. package/dist/src/ui/components/views/AgentsStatus.d.ts +13 -0
  480. package/dist/src/ui/components/views/AgentsStatus.js +23 -0
  481. package/dist/src/ui/components/views/AgentsStatus.js.map +1 -0
  482. package/dist/src/ui/components/views/ExtensionsList.js +3 -2
  483. package/dist/src/ui/components/views/ExtensionsList.js.map +1 -1
  484. package/dist/src/ui/components/views/ExtensionsList.test.js +37 -0
  485. package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -1
  486. package/dist/src/ui/components/views/HooksList.d.ts +24 -0
  487. package/dist/src/ui/components/views/HooksList.js +28 -0
  488. package/dist/src/ui/components/views/HooksList.js.map +1 -0
  489. package/dist/src/ui/components/views/McpStatus.d.ts +2 -1
  490. package/dist/src/ui/components/views/McpStatus.js +18 -3
  491. package/dist/src/ui/components/views/McpStatus.js.map +1 -1
  492. package/dist/src/ui/components/views/McpStatus.test.js +23 -0
  493. package/dist/src/ui/components/views/McpStatus.test.js.map +1 -1
  494. package/dist/src/ui/components/views/SkillsList.d.ts +13 -0
  495. package/dist/src/ui/components/views/SkillsList.js +17 -0
  496. package/dist/src/ui/components/views/SkillsList.js.map +1 -0
  497. package/dist/src/ui/components/views/SkillsList.test.d.ts +6 -0
  498. package/dist/src/ui/components/views/SkillsList.test.js +97 -0
  499. package/dist/src/ui/components/views/SkillsList.test.js.map +1 -0
  500. package/dist/src/ui/constants/tips.js +1 -5
  501. package/dist/src/ui/constants/tips.js.map +1 -1
  502. package/dist/src/ui/constants.d.ts +4 -3
  503. package/dist/src/ui/constants.js +5 -6
  504. package/dist/src/ui/constants.js.map +1 -1
  505. package/dist/src/ui/contexts/KeypressContext.d.ts +1 -0
  506. package/dist/src/ui/contexts/KeypressContext.js +84 -6
  507. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  508. package/dist/src/ui/contexts/KeypressContext.test.js +136 -9
  509. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  510. package/dist/src/ui/contexts/SessionContext.d.ts +1 -0
  511. package/dist/src/ui/contexts/SessionContext.js +2 -1
  512. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  513. package/dist/src/ui/contexts/SessionContext.test.js +3 -0
  514. package/dist/src/ui/contexts/SessionContext.test.js.map +1 -1
  515. package/dist/src/ui/contexts/UIActionsContext.d.ts +3 -0
  516. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  517. package/dist/src/ui/contexts/UIStateContext.d.ts +5 -1
  518. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  519. package/dist/src/ui/contexts/VimModeContext.js +1 -1
  520. package/dist/src/ui/contexts/VimModeContext.js.map +1 -1
  521. package/dist/src/ui/hooks/atCommandProcessor.d.ts +7 -6
  522. package/dist/src/ui/hooks/atCommandProcessor.js +156 -29
  523. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  524. package/dist/src/ui/hooks/atCommandProcessor.test.js +133 -35
  525. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  526. package/dist/src/ui/hooks/atCommandProcessor_agents.test.d.ts +6 -0
  527. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js +183 -0
  528. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js.map +1 -0
  529. package/dist/src/ui/hooks/shellCommandProcessor.js +2 -0
  530. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  531. package/dist/src/ui/hooks/slashCommandProcessor.js +21 -7
  532. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  533. package/dist/src/ui/hooks/slashCommandProcessor.test.js +2 -3
  534. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +1 -1
  535. package/dist/src/ui/hooks/useAtCompletion.js +83 -2
  536. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
  537. package/dist/src/ui/hooks/useAtCompletion.test.js +21 -0
  538. package/dist/src/ui/hooks/useAtCompletion.test.js.map +1 -1
  539. package/dist/src/ui/hooks/useAtCompletion_agents.test.d.ts +6 -0
  540. package/dist/src/ui/hooks/useAtCompletion_agents.test.js +85 -0
  541. package/dist/src/ui/hooks/useAtCompletion_agents.test.js.map +1 -0
  542. package/dist/src/ui/hooks/useAutoAcceptIndicator.d.ts +2 -1
  543. package/dist/src/ui/hooks/useAutoAcceptIndicator.js +5 -4
  544. package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -1
  545. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +1 -1
  546. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
  547. package/dist/src/ui/hooks/useCommandCompletion.d.ts +3 -0
  548. package/dist/src/ui/hooks/useCommandCompletion.js +13 -8
  549. package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
  550. package/dist/src/ui/hooks/useCommandCompletion.test.js +88 -2
  551. package/dist/src/ui/hooks/useCommandCompletion.test.js.map +1 -1
  552. package/dist/src/ui/hooks/useExtensionUpdates.js +7 -7
  553. package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
  554. package/dist/src/ui/hooks/useExtensionUpdates.test.js +20 -4
  555. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
  556. package/dist/src/ui/hooks/useFolderTrust.js +14 -19
  557. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  558. package/dist/src/ui/hooks/useFolderTrust.test.js +31 -23
  559. package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
  560. package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -1
  561. package/dist/src/ui/hooks/useGeminiStream.js +102 -71
  562. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  563. package/dist/src/ui/hooks/useGeminiStream.test.js +294 -10
  564. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  565. package/dist/src/ui/hooks/useGitBranchName.js +3 -0
  566. package/dist/src/ui/hooks/useGitBranchName.js.map +1 -1
  567. package/dist/src/ui/hooks/useHistoryManager.d.ts +1 -1
  568. package/dist/src/ui/hooks/useHistoryManager.js +1 -1
  569. package/dist/src/ui/hooks/useHistoryManager.js.map +1 -1
  570. package/dist/src/ui/hooks/useHistoryManager.test.js +16 -0
  571. package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -1
  572. package/dist/src/ui/hooks/useHookDisplayState.d.ts +7 -0
  573. package/dist/src/ui/hooks/useHookDisplayState.js +83 -0
  574. package/dist/src/ui/hooks/useHookDisplayState.js.map +1 -0
  575. package/dist/src/ui/hooks/useHookDisplayState.test.d.ts +6 -0
  576. package/dist/src/ui/hooks/useHookDisplayState.test.js +180 -0
  577. package/dist/src/ui/hooks/useHookDisplayState.test.js.map +1 -0
  578. package/dist/src/ui/hooks/useIdeTrustListener.js +2 -0
  579. package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -1
  580. package/dist/src/ui/hooks/useIncludeDirsTrust.js +6 -4
  581. package/dist/src/ui/hooks/useIncludeDirsTrust.js.map +1 -1
  582. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js +2 -2
  583. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +1 -1
  584. package/dist/src/ui/hooks/useKittyKeyboardProtocol.js +2 -2
  585. package/dist/src/ui/hooks/useKittyKeyboardProtocol.js.map +1 -1
  586. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +2 -1
  587. package/dist/src/ui/hooks/useLoadingIndicator.js +7 -3
  588. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  589. package/dist/src/ui/hooks/useLoadingIndicator.test.js +15 -4
  590. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  591. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +10 -3
  592. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -1
  593. package/dist/src/ui/hooks/usePhraseCycler.d.ts +1 -1
  594. package/dist/src/ui/hooks/usePhraseCycler.js +2 -2
  595. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  596. package/dist/src/ui/hooks/usePrivacySettings.js +5 -16
  597. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  598. package/dist/src/ui/hooks/usePrivacySettings.test.js +3 -9
  599. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -1
  600. package/dist/src/ui/hooks/usePromptCompletion.js +1 -2
  601. package/dist/src/ui/hooks/usePromptCompletion.js.map +1 -1
  602. package/dist/src/ui/hooks/useQuotaAndFallback.js +19 -18
  603. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
  604. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +29 -23
  605. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  606. package/dist/src/ui/hooks/useReactToolScheduler.d.ts +1 -1
  607. package/dist/src/ui/hooks/useReactToolScheduler.js +1 -1
  608. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  609. package/dist/src/ui/hooks/useRewind.d.ts +14 -0
  610. package/dist/src/ui/hooks/useRewind.js +31 -0
  611. package/dist/src/ui/hooks/useRewind.js.map +1 -0
  612. package/dist/src/ui/hooks/useRewind.test.d.ts +6 -0
  613. package/dist/src/ui/hooks/useRewind.test.js +100 -0
  614. package/dist/src/ui/hooks/useRewind.test.js.map +1 -0
  615. package/dist/src/ui/hooks/useSelectionList.js +2 -1
  616. package/dist/src/ui/hooks/useSelectionList.js.map +1 -1
  617. package/dist/src/ui/hooks/useSelectionList.test.js +2 -0
  618. package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -1
  619. package/dist/src/ui/hooks/useSessionBrowser.js +3 -3
  620. package/dist/src/ui/hooks/useSessionBrowser.js.map +1 -1
  621. package/dist/src/ui/hooks/useSessionBrowser.test.js +4 -10
  622. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +1 -1
  623. package/dist/src/ui/hooks/useSessionResume.js +1 -0
  624. package/dist/src/ui/hooks/useSessionResume.js.map +1 -1
  625. package/dist/src/ui/hooks/useShellHistory.js +5 -3
  626. package/dist/src/ui/hooks/useShellHistory.js.map +1 -1
  627. package/dist/src/ui/hooks/useSlashCompletion.d.ts +2 -0
  628. package/dist/src/ui/hooks/useSlashCompletion.js +29 -11
  629. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  630. package/dist/src/ui/hooks/useSlashCompletion.test.js +115 -5
  631. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  632. package/dist/src/{utils/version.d.ts → ui/hooks/useSnowfall.d.ts} +1 -1
  633. package/dist/src/ui/hooks/useSnowfall.js +126 -0
  634. package/dist/src/ui/hooks/useSnowfall.js.map +1 -0
  635. package/dist/src/ui/hooks/useSnowfall.test.d.ts +6 -0
  636. package/dist/src/ui/hooks/useSnowfall.test.js +88 -0
  637. package/dist/src/ui/hooks/useSnowfall.test.js.map +1 -0
  638. package/dist/src/ui/hooks/useToolScheduler.test.js +86 -53
  639. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  640. package/dist/src/ui/hooks/vim.test.js +7 -0
  641. package/dist/src/ui/hooks/vim.test.js.map +1 -1
  642. package/dist/src/ui/keyMatchers.test.js +79 -53
  643. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  644. package/dist/src/ui/privacy/CloudFreePrivacyNotice.js +1 -0
  645. package/dist/src/ui/privacy/CloudFreePrivacyNotice.js.map +1 -1
  646. package/dist/src/ui/themes/ansi-light.js +1 -1
  647. package/dist/src/ui/themes/ansi-light.js.map +1 -1
  648. package/dist/src/ui/themes/ansi.js +1 -1
  649. package/dist/src/ui/themes/ansi.js.map +1 -1
  650. package/dist/src/ui/themes/color-utils.d.ts +1 -0
  651. package/dist/src/ui/themes/color-utils.js +13 -0
  652. package/dist/src/ui/themes/color-utils.js.map +1 -1
  653. package/dist/src/ui/themes/color-utils.test.js +20 -1
  654. package/dist/src/ui/themes/color-utils.test.js.map +1 -1
  655. package/dist/src/ui/themes/shades-of-purple.js +1 -1
  656. package/dist/src/ui/themes/shades-of-purple.js.map +1 -1
  657. package/dist/src/ui/themes/theme-manager.d.ts +5 -0
  658. package/dist/src/ui/themes/theme-manager.js +9 -3
  659. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  660. package/dist/src/ui/themes/theme-manager.test.js +7 -0
  661. package/dist/src/ui/themes/theme-manager.test.js.map +1 -1
  662. package/dist/src/ui/themes/theme.d.ts +12 -0
  663. package/dist/src/ui/themes/theme.js +34 -4
  664. package/dist/src/ui/themes/theme.js.map +1 -1
  665. package/dist/src/ui/themes/theme.test.js +23 -0
  666. package/dist/src/ui/themes/theme.test.js.map +1 -1
  667. package/dist/src/ui/types.d.ts +48 -5
  668. package/dist/src/ui/types.js +5 -0
  669. package/dist/src/ui/types.js.map +1 -1
  670. package/dist/src/ui/utils/CodeColorizer.js +2 -2
  671. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  672. package/dist/src/ui/utils/CodeColorizer.test.js +1 -1
  673. package/dist/src/ui/utils/CodeColorizer.test.js.map +1 -1
  674. package/dist/src/ui/utils/ConsolePatcher.js +1 -0
  675. package/dist/src/ui/utils/ConsolePatcher.js.map +1 -1
  676. package/dist/src/ui/utils/InlineMarkdownRenderer.js +2 -1
  677. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
  678. package/dist/src/ui/utils/MarkdownDisplay.test.js +1 -1
  679. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  680. package/dist/src/ui/utils/clipboardUtils.d.ts +27 -2
  681. package/dist/src/ui/utils/clipboardUtils.js +148 -16
  682. package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
  683. package/dist/src/ui/utils/clipboardUtils.test.js +135 -13
  684. package/dist/src/ui/utils/clipboardUtils.test.js.map +1 -1
  685. package/dist/src/ui/utils/clipboardUtils.windows.test.d.ts +6 -0
  686. package/dist/src/ui/utils/clipboardUtils.windows.test.js +52 -0
  687. package/dist/src/ui/utils/clipboardUtils.windows.test.js.map +1 -0
  688. package/dist/src/ui/utils/commandUtils.d.ts +1 -1
  689. package/dist/src/ui/utils/commandUtils.js +111 -1
  690. package/dist/src/ui/utils/commandUtils.js.map +1 -1
  691. package/dist/src/ui/utils/commandUtils.test.js +200 -6
  692. package/dist/src/ui/utils/commandUtils.test.js.map +1 -1
  693. package/dist/src/ui/utils/computeStats.js +2 -0
  694. package/dist/src/ui/utils/computeStats.js.map +1 -1
  695. package/dist/src/ui/utils/computeStats.test.js +9 -0
  696. package/dist/src/ui/utils/computeStats.test.js.map +1 -1
  697. package/dist/src/ui/utils/directoryUtils.d.ts +8 -0
  698. package/dist/src/ui/utils/directoryUtils.js +95 -3
  699. package/dist/src/ui/utils/directoryUtils.js.map +1 -1
  700. package/dist/src/ui/utils/directoryUtils.test.js +193 -3
  701. package/dist/src/ui/utils/directoryUtils.test.js.map +1 -1
  702. package/dist/src/ui/utils/highlight.d.ts +3 -2
  703. package/dist/src/ui/utils/highlight.js +51 -37
  704. package/dist/src/ui/utils/highlight.js.map +1 -1
  705. package/dist/src/ui/utils/highlight.test.js +75 -0
  706. package/dist/src/ui/utils/highlight.test.js.map +1 -1
  707. package/dist/src/ui/utils/historyExportUtils.d.ts +21 -0
  708. package/dist/src/ui/utils/historyExportUtils.js +59 -0
  709. package/dist/src/ui/utils/historyExportUtils.js.map +1 -0
  710. package/dist/src/ui/utils/rewindFileOps.d.ts +47 -0
  711. package/dist/src/ui/utils/rewindFileOps.js +190 -0
  712. package/dist/src/ui/utils/rewindFileOps.js.map +1 -0
  713. package/dist/src/ui/utils/rewindFileOps.test.d.ts +6 -0
  714. package/dist/src/ui/utils/rewindFileOps.test.js +375 -0
  715. package/dist/src/ui/utils/rewindFileOps.test.js.map +1 -0
  716. package/dist/src/ui/utils/terminalCapabilityManager.d.ts +41 -0
  717. package/dist/src/ui/utils/terminalCapabilityManager.js +209 -0
  718. package/dist/src/ui/utils/terminalCapabilityManager.js.map +1 -0
  719. package/dist/src/ui/utils/terminalCapabilityManager.test.d.ts +6 -0
  720. package/dist/src/ui/utils/terminalCapabilityManager.test.js +221 -0
  721. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +1 -0
  722. package/dist/src/ui/utils/terminalSetup.d.ts +1 -1
  723. package/dist/src/ui/utils/terminalSetup.js +21 -6
  724. package/dist/src/ui/utils/terminalSetup.js.map +1 -1
  725. package/dist/src/ui/utils/terminalSetup.test.js +16 -2
  726. package/dist/src/ui/utils/terminalSetup.test.js.map +1 -1
  727. package/dist/src/ui/utils/textUtils.js +9 -1
  728. package/dist/src/ui/utils/textUtils.js.map +1 -1
  729. package/dist/src/ui/utils/textUtils.test.js +12 -1
  730. package/dist/src/ui/utils/textUtils.test.js.map +1 -1
  731. package/dist/src/ui/utils/ui-sizing.js +1 -1
  732. package/dist/src/ui/utils/ui-sizing.js.map +1 -1
  733. package/dist/src/ui/utils/ui-sizing.test.js +2 -2
  734. package/dist/src/ui/utils/ui-sizing.test.js.map +1 -1
  735. package/dist/src/utils/activityLogger.d.ts +47 -0
  736. package/dist/src/utils/activityLogger.js +297 -0
  737. package/dist/src/utils/activityLogger.js.map +1 -0
  738. package/dist/src/utils/cleanup.d.ts +11 -0
  739. package/dist/src/utils/cleanup.js +36 -1
  740. package/dist/src/utils/cleanup.js.map +1 -1
  741. package/dist/src/utils/cleanup.test.js +21 -31
  742. package/dist/src/utils/cleanup.test.js.map +1 -1
  743. package/dist/src/utils/deepMerge.js +7 -2
  744. package/dist/src/utils/deepMerge.js.map +1 -1
  745. package/dist/src/utils/deepMerge.test.js +58 -0
  746. package/dist/src/utils/deepMerge.test.js.map +1 -1
  747. package/dist/src/utils/envVarResolver.js.map +1 -1
  748. package/dist/src/utils/envVarResolver.test.js.map +1 -1
  749. package/dist/src/utils/errors.js +13 -14
  750. package/dist/src/utils/errors.js.map +1 -1
  751. package/dist/src/utils/errors.test.js +115 -39
  752. package/dist/src/utils/errors.test.js.map +1 -1
  753. package/dist/src/utils/handleAutoUpdate.d.ts +1 -1
  754. package/dist/src/utils/handleAutoUpdate.js +7 -10
  755. package/dist/src/utils/handleAutoUpdate.js.map +1 -1
  756. package/dist/src/utils/handleAutoUpdate.test.js +12 -10
  757. package/dist/src/utils/handleAutoUpdate.test.js.map +1 -1
  758. package/dist/src/utils/installationInfo.js +1 -1
  759. package/dist/src/utils/installationInfo.js.map +1 -1
  760. package/dist/src/utils/installationInfo.test.js +1 -1
  761. package/dist/src/utils/installationInfo.test.js.map +1 -1
  762. package/dist/src/utils/processUtils.d.ts +1 -1
  763. package/dist/src/utils/processUtils.js +1 -1
  764. package/dist/src/utils/processUtils.js.map +1 -1
  765. package/dist/src/utils/readStdin.js +7 -0
  766. package/dist/src/utils/readStdin.js.map +1 -1
  767. package/dist/src/utils/readStdin.test.js +4 -0
  768. package/dist/src/utils/readStdin.test.js.map +1 -1
  769. package/dist/src/utils/readStdin_safety.test.d.ts +6 -0
  770. package/dist/src/utils/readStdin_safety.test.js +68 -0
  771. package/dist/src/utils/readStdin_safety.test.js.map +1 -0
  772. package/dist/src/utils/relaunch.js +3 -1
  773. package/dist/src/utils/relaunch.js.map +1 -1
  774. package/dist/src/utils/relaunch.test.js +13 -7
  775. package/dist/src/utils/relaunch.test.js.map +1 -1
  776. package/dist/src/utils/resolvePath.js +3 -3
  777. package/dist/src/utils/resolvePath.js.map +1 -1
  778. package/dist/src/utils/resolvePath.test.js +3 -0
  779. package/dist/src/utils/resolvePath.test.js.map +1 -1
  780. package/dist/src/utils/sandbox.js +27 -17
  781. package/dist/src/utils/sandbox.js.map +1 -1
  782. package/dist/src/utils/sandbox.test.js +17 -5
  783. package/dist/src/utils/sandbox.test.js.map +1 -1
  784. package/dist/src/utils/sandboxUtils.js +3 -2
  785. package/dist/src/utils/sandboxUtils.js.map +1 -1
  786. package/dist/src/utils/sandboxUtils.test.js +3 -0
  787. package/dist/src/utils/sandboxUtils.test.js.map +1 -1
  788. package/dist/src/utils/sessionCleanup.integration.test.js +2 -2
  789. package/dist/src/utils/sessionCleanup.integration.test.js.map +1 -1
  790. package/dist/src/utils/sessionCleanup.js +16 -4
  791. package/dist/src/utils/sessionCleanup.js.map +1 -1
  792. package/dist/src/utils/sessionCleanup.test.js +18 -68
  793. package/dist/src/utils/sessionCleanup.test.js.map +1 -1
  794. package/dist/src/utils/sessionUtils.d.ts +22 -0
  795. package/dist/src/utils/sessionUtils.js +37 -5
  796. package/dist/src/utils/sessionUtils.js.map +1 -1
  797. package/dist/src/utils/sessionUtils.test.js +3 -3
  798. package/dist/src/utils/sessionUtils.test.js.map +1 -1
  799. package/dist/src/utils/sessions.js +14 -12
  800. package/dist/src/utils/sessions.js.map +1 -1
  801. package/dist/src/utils/sessions.test.js +62 -39
  802. package/dist/src/utils/sessions.test.js.map +1 -1
  803. package/dist/src/utils/settingsUtils.js +0 -5
  804. package/dist/src/utils/settingsUtils.js.map +1 -1
  805. package/dist/src/utils/skillSettings.d.ts +33 -0
  806. package/dist/src/utils/skillSettings.js +101 -0
  807. package/dist/src/utils/skillSettings.js.map +1 -0
  808. package/dist/src/utils/skillUtils.d.ts +29 -0
  809. package/dist/src/utils/skillUtils.js +144 -0
  810. package/dist/src/utils/skillUtils.js.map +1 -0
  811. package/dist/src/utils/skillUtils.test.d.ts +6 -0
  812. package/dist/src/utils/skillUtils.test.js +57 -0
  813. package/dist/src/utils/skillUtils.test.js.map +1 -0
  814. package/dist/src/utils/terminalTheme.d.ts +15 -0
  815. package/dist/src/utils/terminalTheme.js +50 -0
  816. package/dist/src/utils/terminalTheme.js.map +1 -0
  817. package/dist/src/utils/userStartupWarnings.d.ts +2 -1
  818. package/dist/src/utils/userStartupWarnings.js +17 -7
  819. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  820. package/dist/src/utils/userStartupWarnings.test.js +37 -6
  821. package/dist/src/utils/userStartupWarnings.test.js.map +1 -1
  822. package/dist/src/utils/windowTitle.d.ts +13 -4
  823. package/dist/src/utils/windowTitle.js +65 -7
  824. package/dist/src/utils/windowTitle.js.map +1 -1
  825. package/dist/src/utils/windowTitle.test.js +183 -40
  826. package/dist/src/utils/windowTitle.test.js.map +1 -1
  827. package/dist/src/validateNonInterActiveAuth.d.ts +1 -1
  828. package/dist/src/validateNonInterActiveAuth.js +1 -2
  829. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  830. package/dist/src/zed-integration/fileSystemService.d.ts +3 -4
  831. package/dist/src/zed-integration/fileSystemService.js +5 -10
  832. package/dist/src/zed-integration/fileSystemService.js.map +1 -1
  833. package/dist/src/zed-integration/fileSystemService.test.js +11 -21
  834. package/dist/src/zed-integration/fileSystemService.test.js.map +1 -1
  835. package/dist/src/zed-integration/zedIntegration.d.ts +5 -5
  836. package/dist/src/zed-integration/zedIntegration.js +54 -24
  837. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  838. package/dist/src/zed-integration/zedIntegration.test.js +29 -18
  839. package/dist/src/zed-integration/zedIntegration.test.js.map +1 -1
  840. package/dist/tsconfig.tsbuildinfo +1 -1
  841. package/package.json +5 -4
  842. package/dist/src/ui/hooks/useBracketedPaste.d.ts +0 -12
  843. package/dist/src/ui/hooks/useBracketedPaste.js +0 -31
  844. package/dist/src/ui/hooks/useBracketedPaste.js.map +0 -1
  845. package/dist/src/ui/utils/bracketedPaste.d.ts +0 -7
  846. package/dist/src/ui/utils/bracketedPaste.js +0 -15
  847. package/dist/src/ui/utils/bracketedPaste.js.map +0 -1
  848. package/dist/src/ui/utils/kittyProtocolDetector.d.ts +0 -17
  849. package/dist/src/ui/utils/kittyProtocolDetector.js +0 -111
  850. package/dist/src/ui/utils/kittyProtocolDetector.js.map +0 -1
  851. package/dist/src/ui/utils/kittyProtocolDetector.test.js +0 -113
  852. package/dist/src/ui/utils/kittyProtocolDetector.test.js.map +0 -1
  853. package/dist/src/utils/version.js +0 -15
  854. package/dist/src/utils/version.js.map +0 -1
  855. package/dist/src/utils/version.test.js +0 -39
  856. package/dist/src/utils/version.test.js.map +0 -1
  857. package/dist/src/zed-integration/acp.d.ts +0 -41
  858. package/dist/src/zed-integration/acp.js +0 -72
  859. package/dist/src/zed-integration/acp.js.map +0 -1
  860. package/dist/src/zed-integration/acp.test.js +0 -222
  861. package/dist/src/zed-integration/acp.test.js.map +0 -1
  862. package/dist/src/zed-integration/connection.d.ts +0 -28
  863. package/dist/src/zed-integration/connection.js +0 -163
  864. package/dist/src/zed-integration/connection.js.map +0 -1
  865. package/dist/src/zed-integration/connection.test.js +0 -175
  866. package/dist/src/zed-integration/connection.test.js.map +0 -1
  867. package/dist/src/zed-integration/schema.d.ts +0 -11792
  868. package/dist/src/zed-integration/schema.js +0 -311
  869. package/dist/src/zed-integration/schema.js.map +0 -1
  870. /package/dist/src/{ui/utils/kittyProtocolDetector.test.d.ts → commands/hooks/migrate.test.d.ts} +0 -0
  871. /package/dist/src/{utils/version.test.d.ts → config/extension-manager-scope.test.d.ts} +0 -0
  872. /package/dist/src/{zed-integration/acp.test.d.ts → config/extension-manager-skills.test.d.ts} +0 -0
  873. /package/dist/src/{zed-integration/connection.test.d.ts → config/extensions/extensionUpdates.test.d.ts} +0 -0
@@ -29,18 +29,26 @@ vi.mock('./trustedFolders.js', () => ({
29
29
  .fn()
30
30
  .mockReturnValue({ isTrusted: true, source: 'file' }),
31
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
+ });
32
39
  // NOW import everything else, including the (now effectively re-exported) settings.js
33
- import path, * as pathActual from 'node:path'; // Restored for MOCK_WORKSPACE_SETTINGS_PATH
40
+ import * as pathActual from 'node:path'; // Restored for MOCK_WORKSPACE_SETTINGS_PATH
41
+ import path from 'node:path';
34
42
  import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
35
43
  import * as fs from 'node:fs'; // fs will be mocked separately
36
44
  import stripJsonComments from 'strip-json-comments'; // Will be mocked separately
37
45
  import { isWorkspaceTrusted } from './trustedFolders.js';
38
46
  // These imports will get the versions from the vi.mock('./settings.js', ...) factory.
39
47
  import { loadSettings, USER_SETTINGS_PATH, // This IS the mocked path.
40
- getSystemSettingsPath, getSystemDefaultsPath, migrateSettingsToV1, needsMigration, loadEnvironment, migrateDeprecatedSettings, SettingScope, saveSettings, } from './settings.js';
48
+ getSystemSettingsPath, getSystemDefaultsPath, saveSettings, getDefaultsFromSchema, loadEnvironment, } from './settings.js';
41
49
  import { FatalConfigError, CELL_DIR, AuthType } from '@google/gemini-cli-core';
42
- import { ExtensionManager } from './extension-manager.js';
43
50
  import { updateSettingsFilePreservingFormat } from '../utils/commentJson.js';
51
+ import { getSettingsSchema, MergeStrategy, } from './settingsSchema.js';
44
52
  const MOCK_WORKSPACE_DIR = '/mock/workspace';
45
53
  // Use the (mocked) CELL_DIR for consistency
46
54
  const MOCK_WORKSPACE_SETTINGS_PATH = pathActual.join(MOCK_WORKSPACE_DIR, CELL_DIR, 'settings.json');
@@ -60,6 +68,7 @@ vi.mock('fs', async (importOriginal) => {
60
68
  vi.mock('./extension.js');
61
69
  const mockCoreEvents = vi.hoisted(() => ({
62
70
  emitFeedback: vi.fn(),
71
+ emitSettingsChanged: vi.fn(),
63
72
  }));
64
73
  vi.mock('@google/gemini-cli-core', async (importOriginal) => {
65
74
  const actual = await importOriginal();
@@ -114,7 +123,7 @@ describe('Settings Loading and Merging', () => {
114
123
  },
115
124
  });
116
125
  expect(settings.workspace.settings).toEqual({});
117
- expect(settings.merged).toEqual({
126
+ expect(settings.merged).toMatchObject({
118
127
  security: {
119
128
  auth: {
120
129
  selectedType: AuthType.KEYCLOAK,
@@ -173,7 +182,7 @@ describe('Settings Loading and Merging', () => {
173
182
  else {
174
183
  expect(settings[scope].settings).toEqual(content);
175
184
  }
176
- expect(settings.merged).toEqual(expectedWithAuth);
185
+ expect(settings.merged).toMatchObject(expectedWithAuth);
177
186
  });
178
187
  it('should merge system, user and workspace settings, with system taking precedence over workspace, and workspace over user', () => {
179
188
  mockFsExistsSync.mockImplementation((p) => p === getSystemSettingsPath() ||
@@ -234,7 +243,7 @@ describe('Settings Loading and Merging', () => {
234
243
  },
235
244
  });
236
245
  expect(settings.workspace.settings).toEqual(workspaceSettingsContent);
237
- expect(settings.merged).toEqual({
246
+ expect(settings.merged).toMatchObject({
238
247
  ui: {
239
248
  theme: 'system-theme',
240
249
  },
@@ -256,101 +265,23 @@ describe('Settings Loading and Merging', () => {
256
265
  },
257
266
  });
258
267
  });
259
- it('should correctly migrate a complex legacy (v1) settings file', () => {
260
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
261
- const legacySettingsContent = {
262
- theme: 'legacy-dark',
263
- vimMode: true,
264
- contextFileName: 'LEGACY_CONTEXT.md',
265
- model: 'gemini-pro',
266
- mcpServers: {
267
- 'legacy-server-1': {
268
- command: 'npm',
269
- args: ['run', 'start:server1'],
270
- description: 'Legacy Server 1',
271
- },
272
- 'legacy-server-2': {
273
- command: 'node',
274
- args: ['server2.js'],
275
- description: 'Legacy Server 2',
276
- },
277
- },
278
- allowMCPServers: ['legacy-server-1'],
279
- someUnrecognizedSetting: 'should-be-preserved',
280
- };
281
- fs.readFileSync.mockImplementation((p) => {
282
- if (p === USER_SETTINGS_PATH)
283
- return JSON.stringify(legacySettingsContent);
284
- return '{}';
285
- });
286
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
287
- expect(settings.merged).toEqual({
288
- ui: {
289
- theme: 'legacy-dark',
290
- },
291
- general: {
292
- vimMode: true,
293
- },
294
- context: {
295
- fileName: 'LEGACY_CONTEXT.md',
296
- },
297
- model: {
298
- name: 'gemini-pro',
299
- },
300
- mcpServers: {
301
- 'legacy-server-1': {
302
- command: 'npm',
303
- args: ['run', 'start:server1'],
304
- description: 'Legacy Server 1',
305
- },
306
- 'legacy-server-2': {
307
- command: 'node',
308
- args: ['server2.js'],
309
- description: 'Legacy Server 2',
310
- },
311
- },
312
- mcp: {
313
- allowed: ['legacy-server-1'],
314
- },
315
- someUnrecognizedSetting: 'should-be-preserved',
316
- security: {
317
- auth: {
318
- selectedType: AuthType.KEYCLOAK,
319
- },
320
- },
321
- });
322
- });
323
- it('should rewrite allowedTools to tools.allowed during migration', () => {
324
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
325
- const legacySettingsContent = {
326
- allowedTools: ['fs', 'shell'],
327
- };
328
- fs.readFileSync.mockImplementation((p) => {
329
- if (p === USER_SETTINGS_PATH)
330
- return JSON.stringify(legacySettingsContent);
331
- return '{}';
332
- });
333
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
334
- expect(settings.merged.tools?.allowed).toEqual(['fs', 'shell']);
335
- expect(settings.merged['allowedTools']).toBeUndefined();
336
- });
337
- it('should correctly merge and migrate legacy array properties from multiple scopes', () => {
268
+ it('should correctly merge array properties from multiple scopes', () => {
338
269
  mockFsExistsSync.mockReturnValue(true);
339
- const legacyUserSettings = {
340
- includeDirectories: ['/user/dir'],
341
- excludeTools: ['user-tool'],
342
- excludedProjectEnvVars: ['USER_VAR'],
270
+ const userSettings = {
271
+ context: { includeDirectories: ['/user/dir'] },
272
+ tools: { exclude: ['user-tool'] },
273
+ advanced: { excludedEnvVars: ['USER_VAR'] },
343
274
  };
344
- const legacyWorkspaceSettings = {
345
- includeDirectories: ['/workspace/dir'],
346
- excludeTools: ['workspace-tool'],
347
- excludedProjectEnvVars: ['WORKSPACE_VAR', 'USER_VAR'],
275
+ const workspaceSettings = {
276
+ context: { includeDirectories: ['/workspace/dir'] },
277
+ tools: { exclude: ['workspace-tool'] },
278
+ advanced: { excludedEnvVars: ['WORKSPACE_VAR', 'USER_VAR'] },
348
279
  };
349
280
  fs.readFileSync.mockImplementation((p) => {
350
281
  if (p === USER_SETTINGS_PATH)
351
- return JSON.stringify(legacyUserSettings);
282
+ return JSON.stringify(userSettings);
352
283
  if (p === MOCK_WORKSPACE_SETTINGS_PATH)
353
- return JSON.stringify(legacyWorkspaceSettings);
284
+ return JSON.stringify(workspaceSettings);
354
285
  return '{}';
355
286
  });
356
287
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
@@ -366,9 +297,28 @@ describe('Settings Loading and Merging', () => {
366
297
  ]);
367
298
  // Verify excludedProjectEnvVars are concatenated and de-duped
368
299
  expect(settings.merged.advanced?.excludedEnvVars).toEqual(expect.arrayContaining(['USER_VAR', 'WORKSPACE_VAR']));
369
- expect(settings.merged.advanced?.excludedEnvVars).toHaveLength(2);
300
+ expect(settings.merged.advanced?.excludedEnvVars).toHaveLength(4);
370
301
  });
371
302
  it('should merge all settings files with the correct precedence', () => {
303
+ // Mock schema to test defaults application
304
+ const mockSchema = {
305
+ ui: { type: 'object', default: {}, properties: {} },
306
+ tools: { type: 'object', default: {}, properties: {} },
307
+ context: {
308
+ type: 'object',
309
+ default: {},
310
+ properties: {
311
+ discoveryMaxDirs: { type: 'number', default: 200 },
312
+ includeDirectories: {
313
+ type: 'array',
314
+ default: [],
315
+ mergeStrategy: MergeStrategy.CONCAT,
316
+ },
317
+ },
318
+ },
319
+ mcpServers: { type: 'object', default: {} },
320
+ };
321
+ getSettingsSchema.mockReturnValue(mockSchema);
372
322
  mockFsExistsSync.mockReturnValue(true);
373
323
  const systemDefaultsContent = {
374
324
  ui: {
@@ -434,7 +384,7 @@ describe('Settings Loading and Merging', () => {
434
384
  expect(settings.workspace.settings).toEqual(workspaceSettingsContent);
435
385
  expect(settings.merged).toEqual({
436
386
  context: {
437
- fileName: 'WORKSPACE_CONTEXT.md',
387
+ discoveryMaxDirs: 200,
438
388
  includeDirectories: [
439
389
  '/system/defaults/dir',
440
390
  '/user/dir1',
@@ -442,14 +392,12 @@ describe('Settings Loading and Merging', () => {
442
392
  '/workspace/dir',
443
393
  '/system/dir',
444
394
  ],
395
+ fileName: 'WORKSPACE_CONTEXT.md',
445
396
  },
397
+ mcpServers: {},
398
+ ui: { theme: 'system-theme' },
399
+ tools: { sandbox: false },
446
400
  telemetry: false,
447
- tools: {
448
- sandbox: false,
449
- },
450
- ui: {
451
- theme: 'system-theme',
452
- },
453
401
  security: {
454
402
  auth: {
455
403
  selectedType: AuthType.KEYCLOAK,
@@ -573,7 +521,7 @@ describe('Settings Loading and Merging', () => {
573
521
  },
574
522
  expected: {
575
523
  key: 'advanced.excludedEnvVars',
576
- value: ['DEBUG', 'NODE_ENV', 'CUSTOM_VAR'],
524
+ value: ['DEBUG', 'DEBUG_MODE', 'NODE_ENV', 'CUSTOM_VAR'],
577
525
  },
578
526
  },
579
527
  {
@@ -584,7 +532,7 @@ describe('Settings Loading and Merging', () => {
584
532
  },
585
533
  expected: {
586
534
  key: 'advanced.excludedEnvVars',
587
- value: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'],
535
+ value: ['DEBUG', 'DEBUG_MODE', 'WORKSPACE_DEBUG', 'WORKSPACE_VAR'],
588
536
  },
589
537
  },
590
538
  ])('should handle $description correctly', ({ path, content, expected }) => {
@@ -631,6 +579,7 @@ describe('Settings Loading and Merging', () => {
631
579
  ]);
632
580
  expect(settings.merged.advanced?.excludedEnvVars).toEqual([
633
581
  'DEBUG',
582
+ 'DEBUG_MODE',
634
583
  'NODE_ENV',
635
584
  'USER_VAR',
636
585
  'WORKSPACE_DEBUG',
@@ -693,8 +642,8 @@ describe('Settings Loading and Merging', () => {
693
642
  fs.readFileSync.mockReturnValue('{}');
694
643
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
695
644
  expect(settings.merged.telemetry).toBeUndefined();
696
- expect(settings.merged.ui).toBeUndefined();
697
- expect(settings.merged.mcpServers).toBeUndefined();
645
+ expect(settings.merged.ui).toBeDefined();
646
+ expect(settings.merged.mcpServers).toEqual({});
698
647
  });
699
648
  it('should merge MCP servers correctly, with workspace taking precedence', () => {
700
649
  mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH || p === MOCK_WORKSPACE_SETTINGS_PATH);
@@ -809,7 +758,7 @@ describe('Settings Loading and Merging', () => {
809
758
  mockFsExistsSync.mockReturnValue(false); // No settings files exist
810
759
  fs.readFileSync.mockReturnValue('{}');
811
760
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
812
- expect(settings.merged.mcpServers).toBeUndefined();
761
+ expect(settings.merged.mcpServers).toEqual({});
813
762
  });
814
763
  it('should merge MCP servers from system, user, and workspace with system taking precedence', () => {
815
764
  mockFsExistsSync.mockReturnValue(true);
@@ -927,10 +876,10 @@ describe('Settings Loading and Merging', () => {
927
876
  expected: 0.8,
928
877
  },
929
878
  {
930
- description: 'should be undefined if not in any settings file',
879
+ description: 'should be default if not in any settings file',
931
880
  userContent: {},
932
881
  workspaceContent: {},
933
- expected: undefined,
882
+ expected: 0.5,
934
883
  },
935
884
  ])('$description', ({ userContent, workspaceContent, expected }) => {
936
885
  mockFsExistsSync.mockReturnValue(true);
@@ -1288,7 +1237,7 @@ describe('Settings Loading and Merging', () => {
1288
1237
  expect(fs.readFileSync).toHaveBeenCalledWith(MOCK_ENV_SYSTEM_SETTINGS_PATH, 'utf-8');
1289
1238
  expect(settings.system.path).toBe(MOCK_ENV_SYSTEM_SETTINGS_PATH);
1290
1239
  expect(settings.system.settings).toEqual(systemSettingsContent);
1291
- expect(settings.merged).toEqual({
1240
+ expect(settings.merged).toMatchObject({
1292
1241
  ...systemSettingsContent,
1293
1242
  security: {
1294
1243
  auth: {
@@ -1369,8 +1318,9 @@ describe('Settings Loading and Merging', () => {
1369
1318
  'DEBUG',
1370
1319
  ]);
1371
1320
  expect(settings.merged.advanced?.excludedEnvVars).toEqual([
1372
- 'NODE_ENV',
1373
1321
  'DEBUG',
1322
+ 'DEBUG_MODE',
1323
+ 'NODE_ENV',
1374
1324
  ]);
1375
1325
  });
1376
1326
  it('should merge excludedProjectEnvVars with workspace taking precedence', () => {
@@ -1402,6 +1352,7 @@ describe('Settings Loading and Merging', () => {
1402
1352
  ]);
1403
1353
  expect(settings.merged.advanced?.excludedEnvVars).toEqual([
1404
1354
  'DEBUG',
1355
+ 'DEBUG_MODE',
1405
1356
  'NODE_ENV',
1406
1357
  'USER_VAR',
1407
1358
  'WORKSPACE_DEBUG',
@@ -1460,315 +1411,6 @@ describe('Settings Loading and Merging', () => {
1460
1411
  expect(settings.merged.ui?.theme).toBe('dark'); // User setting
1461
1412
  });
1462
1413
  });
1463
- describe('migrateSettingsToV1', () => {
1464
- it('should handle an empty object', () => {
1465
- const v2Settings = {};
1466
- const v1Settings = migrateSettingsToV1(v2Settings);
1467
- expect(v1Settings).toEqual({});
1468
- });
1469
- it('should migrate a simple v2 settings object to v1', () => {
1470
- const v2Settings = {
1471
- general: {
1472
- preferredEditor: 'vscode',
1473
- vimMode: true,
1474
- },
1475
- ui: {
1476
- theme: 'dark',
1477
- },
1478
- };
1479
- const v1Settings = migrateSettingsToV1(v2Settings);
1480
- expect(v1Settings).toEqual({
1481
- preferredEditor: 'vscode',
1482
- vimMode: true,
1483
- theme: 'dark',
1484
- });
1485
- });
1486
- it('should handle nested properties correctly', () => {
1487
- const v2Settings = {
1488
- security: {
1489
- folderTrust: {
1490
- enabled: true,
1491
- },
1492
- auth: {
1493
- selectedType: 'oauth',
1494
- },
1495
- },
1496
- advanced: {
1497
- autoConfigureMemory: true,
1498
- },
1499
- };
1500
- const v1Settings = migrateSettingsToV1(v2Settings);
1501
- expect(v1Settings).toEqual({
1502
- folderTrust: true,
1503
- selectedAuthType: 'oauth',
1504
- autoConfigureMaxOldSpaceSize: true,
1505
- });
1506
- });
1507
- it('should preserve mcpServers at the top level', () => {
1508
- const v2Settings = {
1509
- general: {
1510
- preferredEditor: 'vscode',
1511
- },
1512
- mcpServers: {
1513
- 'my-server': {
1514
- command: 'npm start',
1515
- },
1516
- },
1517
- };
1518
- const v1Settings = migrateSettingsToV1(v2Settings);
1519
- expect(v1Settings).toEqual({
1520
- preferredEditor: 'vscode',
1521
- mcpServers: {
1522
- 'my-server': {
1523
- command: 'npm start',
1524
- },
1525
- },
1526
- });
1527
- });
1528
- it('should carry over unrecognized top-level properties', () => {
1529
- const v2Settings = {
1530
- general: {
1531
- vimMode: false,
1532
- },
1533
- unrecognized: 'value',
1534
- another: {
1535
- nested: true,
1536
- },
1537
- };
1538
- const v1Settings = migrateSettingsToV1(v2Settings);
1539
- expect(v1Settings).toEqual({
1540
- vimMode: false,
1541
- unrecognized: 'value',
1542
- another: {
1543
- nested: true,
1544
- },
1545
- });
1546
- });
1547
- it('should handle a complex object with mixed properties', () => {
1548
- const v2Settings = {
1549
- general: {
1550
- disableAutoUpdate: true,
1551
- },
1552
- ui: {
1553
- hideBanner: true,
1554
- customThemes: {
1555
- myTheme: {},
1556
- },
1557
- },
1558
- model: {
1559
- name: 'gemini-pro',
1560
- },
1561
- mcpServers: {
1562
- 'server-1': {
1563
- command: 'node server.js',
1564
- },
1565
- },
1566
- unrecognized: {
1567
- should: 'be-preserved',
1568
- },
1569
- };
1570
- const v1Settings = migrateSettingsToV1(v2Settings);
1571
- expect(v1Settings).toEqual({
1572
- disableAutoUpdate: true,
1573
- hideBanner: true,
1574
- customThemes: {
1575
- myTheme: {},
1576
- },
1577
- model: 'gemini-pro',
1578
- mcpServers: {
1579
- 'server-1': {
1580
- command: 'node server.js',
1581
- },
1582
- },
1583
- unrecognized: {
1584
- should: 'be-preserved',
1585
- },
1586
- });
1587
- });
1588
- it('should not migrate a v1 settings object', () => {
1589
- const v1Settings = {
1590
- preferredEditor: 'vscode',
1591
- vimMode: true,
1592
- theme: 'dark',
1593
- };
1594
- const migratedSettings = migrateSettingsToV1(v1Settings);
1595
- expect(migratedSettings).toEqual({
1596
- preferredEditor: 'vscode',
1597
- vimMode: true,
1598
- theme: 'dark',
1599
- });
1600
- });
1601
- it('should migrate a full v2 settings object to v1', () => {
1602
- const v2Settings = {
1603
- general: {
1604
- preferredEditor: 'code',
1605
- vimMode: true,
1606
- },
1607
- ui: {
1608
- theme: 'dark',
1609
- },
1610
- privacy: {
1611
- usageStatisticsEnabled: false,
1612
- },
1613
- model: {
1614
- name: 'gemini-pro',
1615
- },
1616
- context: {
1617
- fileName: 'CONTEXT.md',
1618
- includeDirectories: ['/src'],
1619
- },
1620
- tools: {
1621
- sandbox: true,
1622
- exclude: ['toolA'],
1623
- },
1624
- mcp: {
1625
- allowed: ['server1'],
1626
- },
1627
- security: {
1628
- folderTrust: {
1629
- enabled: true,
1630
- },
1631
- },
1632
- advanced: {
1633
- dnsResolutionOrder: 'ipv4first',
1634
- excludedEnvVars: ['SECRET'],
1635
- },
1636
- mcpServers: {
1637
- 'my-server': {
1638
- command: 'npm start',
1639
- },
1640
- },
1641
- unrecognizedTopLevel: {
1642
- value: 'should be preserved',
1643
- },
1644
- };
1645
- const v1Settings = migrateSettingsToV1(v2Settings);
1646
- expect(v1Settings).toEqual({
1647
- preferredEditor: 'code',
1648
- vimMode: true,
1649
- theme: 'dark',
1650
- usageStatisticsEnabled: false,
1651
- model: 'gemini-pro',
1652
- contextFileName: 'CONTEXT.md',
1653
- includeDirectories: ['/src'],
1654
- sandbox: true,
1655
- excludeTools: ['toolA'],
1656
- allowMCPServers: ['server1'],
1657
- folderTrust: true,
1658
- dnsResolutionOrder: 'ipv4first',
1659
- excludedProjectEnvVars: ['SECRET'],
1660
- mcpServers: {
1661
- 'my-server': {
1662
- command: 'npm start',
1663
- },
1664
- },
1665
- unrecognizedTopLevel: {
1666
- value: 'should be preserved',
1667
- },
1668
- });
1669
- });
1670
- it('should handle partial v2 settings', () => {
1671
- const v2Settings = {
1672
- general: {
1673
- vimMode: false,
1674
- },
1675
- ui: {},
1676
- model: {
1677
- name: 'gemini-2.5-pro',
1678
- },
1679
- unrecognized: 'value',
1680
- };
1681
- const v1Settings = migrateSettingsToV1(v2Settings);
1682
- expect(v1Settings).toEqual({
1683
- vimMode: false,
1684
- model: 'gemini-2.5-pro',
1685
- unrecognized: 'value',
1686
- });
1687
- });
1688
- it('should handle settings with different data types', () => {
1689
- const v2Settings = {
1690
- general: {
1691
- vimMode: false,
1692
- },
1693
- model: {
1694
- maxSessionTurns: -1,
1695
- },
1696
- context: {
1697
- includeDirectories: [],
1698
- },
1699
- security: {
1700
- folderTrust: {
1701
- enabled: undefined,
1702
- },
1703
- },
1704
- };
1705
- const v1Settings = migrateSettingsToV1(v2Settings);
1706
- expect(v1Settings).toEqual({
1707
- vimMode: false,
1708
- maxSessionTurns: -1,
1709
- includeDirectories: [],
1710
- security: {
1711
- folderTrust: {
1712
- enabled: undefined,
1713
- },
1714
- },
1715
- });
1716
- });
1717
- it('should preserve unrecognized top-level keys', () => {
1718
- const v2Settings = {
1719
- general: {
1720
- vimMode: true,
1721
- },
1722
- customTopLevel: {
1723
- a: 1,
1724
- b: [2],
1725
- },
1726
- anotherOne: 'hello',
1727
- };
1728
- const v1Settings = migrateSettingsToV1(v2Settings);
1729
- expect(v1Settings).toEqual({
1730
- vimMode: true,
1731
- customTopLevel: {
1732
- a: 1,
1733
- b: [2],
1734
- },
1735
- anotherOne: 'hello',
1736
- });
1737
- });
1738
- it('should handle an empty v2 settings object', () => {
1739
- const v2Settings = {};
1740
- const v1Settings = migrateSettingsToV1(v2Settings);
1741
- expect(v1Settings).toEqual({});
1742
- });
1743
- it('should correctly handle mcpServers at the top level', () => {
1744
- const v2Settings = {
1745
- mcpServers: {
1746
- serverA: { command: 'a' },
1747
- },
1748
- mcp: {
1749
- allowed: ['serverA'],
1750
- },
1751
- };
1752
- const v1Settings = migrateSettingsToV1(v2Settings);
1753
- expect(v1Settings).toEqual({
1754
- mcpServers: {
1755
- serverA: { command: 'a' },
1756
- },
1757
- allowMCPServers: ['serverA'],
1758
- });
1759
- });
1760
- it('should correctly migrate customWittyPhrases', () => {
1761
- const v2Settings = {
1762
- ui: {
1763
- customWittyPhrases: ['test phrase'],
1764
- },
1765
- };
1766
- const v1Settings = migrateSettingsToV1(v2Settings);
1767
- expect(v1Settings).toEqual({
1768
- customWittyPhrases: ['test phrase'],
1769
- });
1770
- });
1771
- });
1772
1414
  describe('loadEnvironment', () => {
1773
1415
  function setup({ isFolderTrustEnabled = true, isWorkspaceTrustedValue = true, }) {
1774
1416
  delete process.env['TESTTEST']; // reset
@@ -1810,156 +1452,6 @@ describe('Settings Loading and Merging', () => {
1810
1452
  expect(process.env['TESTTEST']).not.toEqual('1234');
1811
1453
  });
1812
1454
  });
1813
- describe('needsMigration', () => {
1814
- it('should return false for an empty object', () => {
1815
- expect(needsMigration({})).toBe(false);
1816
- });
1817
- it('should return false for settings that are already in V2 format', () => {
1818
- const v2Settings = {
1819
- ui: {
1820
- theme: 'dark',
1821
- },
1822
- tools: {
1823
- sandbox: true,
1824
- },
1825
- };
1826
- expect(needsMigration(v2Settings)).toBe(false);
1827
- });
1828
- it('should return true for settings with a V1 key that needs to be moved', () => {
1829
- const v1Settings = {
1830
- theme: 'dark', // v1 key
1831
- };
1832
- expect(needsMigration(v1Settings)).toBe(true);
1833
- });
1834
- it('should return true for settings with a mix of V1 and V2 keys', () => {
1835
- const mixedSettings = {
1836
- theme: 'dark', // v1 key
1837
- tools: {
1838
- sandbox: true, // v2 key
1839
- },
1840
- };
1841
- expect(needsMigration(mixedSettings)).toBe(true);
1842
- });
1843
- it('should return false for settings with only V1 keys that are the same in V2', () => {
1844
- const v1Settings = {
1845
- mcpServers: {},
1846
- telemetry: {},
1847
- extensions: [],
1848
- };
1849
- expect(needsMigration(v1Settings)).toBe(false);
1850
- });
1851
- it('should return true for settings with a mix of V1 keys that are the same in V2 and V1 keys that need moving', () => {
1852
- const v1Settings = {
1853
- mcpServers: {}, // same in v2
1854
- theme: 'dark', // needs moving
1855
- };
1856
- expect(needsMigration(v1Settings)).toBe(true);
1857
- });
1858
- it('should return false for settings with unrecognized keys', () => {
1859
- const settings = {
1860
- someUnrecognizedKey: 'value',
1861
- };
1862
- expect(needsMigration(settings)).toBe(false);
1863
- });
1864
- it('should return false for settings with v2 keys and unrecognized keys', () => {
1865
- const settings = {
1866
- ui: { theme: 'dark' },
1867
- someUnrecognizedKey: 'value',
1868
- };
1869
- expect(needsMigration(settings)).toBe(false);
1870
- });
1871
- });
1872
- describe('migrateDeprecatedSettings', () => {
1873
- let mockFsExistsSync;
1874
- let mockFsReadFileSync;
1875
- beforeEach(() => {
1876
- vi.resetAllMocks();
1877
- mockFsExistsSync = vi.mocked(fs.existsSync);
1878
- mockFsExistsSync.mockReturnValue(true);
1879
- mockFsReadFileSync = vi.mocked(fs.readFileSync);
1880
- mockFsReadFileSync.mockReturnValue('{}');
1881
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
1882
- isTrusted: true,
1883
- source: undefined,
1884
- });
1885
- });
1886
- afterEach(() => {
1887
- vi.restoreAllMocks();
1888
- });
1889
- it('should migrate disabled extensions from user and workspace settings', () => {
1890
- const userSettingsContent = {
1891
- extensions: {
1892
- disabled: ['user-ext-1', 'shared-ext'],
1893
- },
1894
- };
1895
- const workspaceSettingsContent = {
1896
- extensions: {
1897
- disabled: ['workspace-ext-1', 'shared-ext'],
1898
- },
1899
- };
1900
- mockFsReadFileSync.mockImplementation((p) => {
1901
- if (p === USER_SETTINGS_PATH)
1902
- return JSON.stringify(userSettingsContent);
1903
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1904
- return JSON.stringify(workspaceSettingsContent);
1905
- return '{}';
1906
- });
1907
- const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1908
- const setValueSpy = vi.spyOn(loadedSettings, 'setValue');
1909
- const extensionManager = new ExtensionManager({
1910
- settings: loadedSettings.merged,
1911
- workspaceDir: MOCK_WORKSPACE_DIR,
1912
- requestConsent: vi.fn(),
1913
- requestSetting: vi.fn(),
1914
- });
1915
- const mockDisableExtension = vi.spyOn(extensionManager, 'disableExtension');
1916
- mockDisableExtension.mockImplementation(async () => { });
1917
- migrateDeprecatedSettings(loadedSettings, extensionManager);
1918
- // Check user settings migration
1919
- expect(mockDisableExtension).toHaveBeenCalledWith('user-ext-1', SettingScope.User);
1920
- expect(mockDisableExtension).toHaveBeenCalledWith('shared-ext', SettingScope.User);
1921
- // Check workspace settings migration
1922
- expect(mockDisableExtension).toHaveBeenCalledWith('workspace-ext-1', SettingScope.Workspace);
1923
- expect(mockDisableExtension).toHaveBeenCalledWith('shared-ext', SettingScope.Workspace);
1924
- // Check that setValue was called to remove the deprecated setting
1925
- expect(setValueSpy).toHaveBeenCalledWith(SettingScope.User, 'extensions', {
1926
- disabled: undefined,
1927
- });
1928
- expect(setValueSpy).toHaveBeenCalledWith(SettingScope.Workspace, 'extensions', {
1929
- disabled: undefined,
1930
- });
1931
- });
1932
- it('should not do anything if there are no deprecated settings', () => {
1933
- const userSettingsContent = {
1934
- extensions: {
1935
- enabled: ['user-ext-1'],
1936
- },
1937
- };
1938
- const workspaceSettingsContent = {
1939
- someOtherSetting: 'value',
1940
- };
1941
- mockFsReadFileSync.mockImplementation((p) => {
1942
- if (p === USER_SETTINGS_PATH)
1943
- return JSON.stringify(userSettingsContent);
1944
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1945
- return JSON.stringify(workspaceSettingsContent);
1946
- return '{}';
1947
- });
1948
- const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1949
- const setValueSpy = vi.spyOn(loadedSettings, 'setValue');
1950
- const extensionManager = new ExtensionManager({
1951
- settings: loadedSettings.merged,
1952
- workspaceDir: MOCK_WORKSPACE_DIR,
1953
- requestConsent: vi.fn(),
1954
- requestSetting: vi.fn(),
1955
- });
1956
- const mockDisableExtension = vi.spyOn(extensionManager, 'disableExtension');
1957
- mockDisableExtension.mockImplementation(async () => { });
1958
- migrateDeprecatedSettings(loadedSettings, extensionManager);
1959
- expect(mockDisableExtension).not.toHaveBeenCalled();
1960
- expect(setValueSpy).not.toHaveBeenCalled();
1961
- });
1962
- });
1963
1455
  describe('saveSettings', () => {
1964
1456
  it('should save settings using updateSettingsFilePreservingFormat', () => {
1965
1457
  const mockUpdateSettings = vi.mocked(updateSettingsFilePreservingFormat);
@@ -2003,5 +1495,187 @@ describe('Settings Loading and Merging', () => {
2003
1495
  expect(mockCoreEvents.emitFeedback).toHaveBeenCalledWith('error', 'There was an error saving your latest settings changes.', error);
2004
1496
  });
2005
1497
  });
1498
+ describe('LoadedSettings and remote admin settings', () => {
1499
+ it('should prioritize remote admin settings over file-based admin settings', () => {
1500
+ mockFsExistsSync.mockReturnValue(true);
1501
+ const systemSettingsContent = {
1502
+ admin: {
1503
+ // These should be ignored
1504
+ secureModeEnabled: true,
1505
+ mcp: { enabled: false },
1506
+ extensions: { enabled: false },
1507
+ },
1508
+ // A non-admin setting to ensure it's still processed
1509
+ ui: { theme: 'system-theme' },
1510
+ };
1511
+ fs.readFileSync.mockImplementation((p) => {
1512
+ if (p === getSystemSettingsPath()) {
1513
+ return JSON.stringify(systemSettingsContent);
1514
+ }
1515
+ return '{}';
1516
+ });
1517
+ const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1518
+ // 1. Verify that on initial load, file-based admin settings are ignored
1519
+ // and schema defaults are used instead.
1520
+ expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false); // default: false
1521
+ expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true); // default: true
1522
+ expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true); // default: true
1523
+ expect(loadedSettings.merged.ui?.theme).toBe('system-theme'); // non-admin setting should be loaded
1524
+ // 2. Now, set remote admin settings.
1525
+ loadedSettings.setRemoteAdminSettings({
1526
+ secureModeEnabled: true,
1527
+ mcpSetting: { mcpEnabled: false },
1528
+ cliFeatureSetting: { extensionsSetting: { extensionsEnabled: false } },
1529
+ });
1530
+ // 3. Verify that remote admin settings take precedence.
1531
+ expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(true);
1532
+ expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(false);
1533
+ expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(false);
1534
+ // non-admin setting should remain unchanged
1535
+ expect(loadedSettings.merged.ui?.theme).toBe('system-theme');
1536
+ });
1537
+ it('should set remote admin settings and recompute merged settings', () => {
1538
+ mockFsExistsSync.mockReturnValue(true);
1539
+ const systemSettingsContent = {
1540
+ admin: {
1541
+ secureModeEnabled: false,
1542
+ mcp: { enabled: false },
1543
+ extensions: { enabled: false },
1544
+ },
1545
+ ui: { theme: 'initial-theme' },
1546
+ };
1547
+ fs.readFileSync.mockImplementation((p) => {
1548
+ if (p === getSystemSettingsPath()) {
1549
+ return JSON.stringify(systemSettingsContent);
1550
+ }
1551
+ return '{}';
1552
+ });
1553
+ const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1554
+ // Ensure initial state from defaults (as file-based admin settings are ignored)
1555
+ expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1556
+ expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
1557
+ expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
1558
+ expect(loadedSettings.merged.ui?.theme).toBe('initial-theme');
1559
+ const newRemoteSettings = {
1560
+ secureModeEnabled: true,
1561
+ mcpSetting: { mcpEnabled: false },
1562
+ cliFeatureSetting: { extensionsSetting: { extensionsEnabled: false } },
1563
+ };
1564
+ loadedSettings.setRemoteAdminSettings(newRemoteSettings);
1565
+ // Verify that remote admin settings are applied
1566
+ expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(true);
1567
+ expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(false);
1568
+ expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(false);
1569
+ // Non-admin settings should remain untouched
1570
+ expect(loadedSettings.merged.ui?.theme).toBe('initial-theme');
1571
+ // Verify that calling setRemoteAdminSettings with partial data overwrites previous remote settings
1572
+ // and missing properties revert to schema defaults.
1573
+ loadedSettings.setRemoteAdminSettings({ secureModeEnabled: false });
1574
+ expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1575
+ expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true); // Reverts to default: true
1576
+ expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true); // Reverts to default: true
1577
+ });
1578
+ it('should correctly handle undefined remote admin settings', () => {
1579
+ mockFsExistsSync.mockReturnValue(true);
1580
+ const systemSettingsContent = {
1581
+ ui: { theme: 'initial-theme' },
1582
+ };
1583
+ fs.readFileSync.mockImplementation((p) => {
1584
+ if (p === getSystemSettingsPath()) {
1585
+ return JSON.stringify(systemSettingsContent);
1586
+ }
1587
+ return '{}';
1588
+ });
1589
+ const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1590
+ // Should have default admin settings
1591
+ expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1592
+ expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
1593
+ expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
1594
+ loadedSettings.setRemoteAdminSettings({}); // Set empty remote settings
1595
+ // Admin settings should revert to defaults because there are no remote overrides
1596
+ expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1597
+ expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
1598
+ expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
1599
+ });
1600
+ it('should correctly handle missing properties in remote admin settings', () => {
1601
+ mockFsExistsSync.mockReturnValue(true);
1602
+ const systemSettingsContent = {
1603
+ admin: {
1604
+ secureModeEnabled: true,
1605
+ },
1606
+ };
1607
+ fs.readFileSync.mockImplementation((p) => {
1608
+ if (p === getSystemSettingsPath()) {
1609
+ return JSON.stringify(systemSettingsContent);
1610
+ }
1611
+ return '{}';
1612
+ });
1613
+ const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
1614
+ // Ensure initial state from defaults (as file-based admin settings are ignored)
1615
+ expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1616
+ expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
1617
+ expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
1618
+ // Set remote settings with only secureModeEnabled
1619
+ loadedSettings.setRemoteAdminSettings({
1620
+ secureModeEnabled: true,
1621
+ });
1622
+ // Verify secureModeEnabled is updated, others remain defaults
1623
+ expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(true);
1624
+ expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
1625
+ expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
1626
+ // Set remote settings with only mcpSetting.mcpEnabled
1627
+ loadedSettings.setRemoteAdminSettings({
1628
+ mcpSetting: { mcpEnabled: false },
1629
+ });
1630
+ // Verify mcpEnabled is updated, others remain defaults (secureModeEnabled reverts to default:false)
1631
+ expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1632
+ expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(false);
1633
+ expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
1634
+ // Set remote settings with only cliFeatureSetting.extensionsSetting.extensionsEnabled
1635
+ loadedSettings.setRemoteAdminSettings({
1636
+ cliFeatureSetting: { extensionsSetting: { extensionsEnabled: false } },
1637
+ });
1638
+ // Verify extensionsEnabled is updated, others remain defaults
1639
+ expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
1640
+ expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
1641
+ expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(false);
1642
+ });
1643
+ });
1644
+ describe('getDefaultsFromSchema', () => {
1645
+ it('should extract defaults from a schema', () => {
1646
+ const mockSchema = {
1647
+ prop1: {
1648
+ type: 'string',
1649
+ default: 'default1',
1650
+ label: 'Prop 1',
1651
+ category: 'General',
1652
+ requiresRestart: false,
1653
+ },
1654
+ nested: {
1655
+ type: 'object',
1656
+ label: 'Nested',
1657
+ category: 'General',
1658
+ requiresRestart: false,
1659
+ default: {},
1660
+ properties: {
1661
+ prop2: {
1662
+ type: 'number',
1663
+ default: 42,
1664
+ label: 'Prop 2',
1665
+ category: 'General',
1666
+ requiresRestart: false,
1667
+ },
1668
+ },
1669
+ },
1670
+ };
1671
+ const defaults = getDefaultsFromSchema(mockSchema);
1672
+ expect(defaults).toEqual({
1673
+ prop1: 'default1',
1674
+ nested: {
1675
+ prop2: 42,
1676
+ },
1677
+ });
1678
+ });
1679
+ });
2006
1680
  });
2007
1681
  //# sourceMappingURL=settings.test.js.map