@machina.ai/cell-cli 1.18.4-rc1 → 1.19.4-rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.js +0 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/package.json +6 -6
  5. package/dist/src/commands/extensions.test.d.ts +6 -0
  6. package/dist/src/commands/extensions.test.js +67 -0
  7. package/dist/src/commands/extensions.test.js.map +1 -0
  8. package/dist/src/commands/utils.test.d.ts +6 -0
  9. package/dist/src/commands/utils.test.js +35 -0
  10. package/dist/src/commands/utils.test.js.map +1 -0
  11. package/dist/src/config/auth.js +4 -0
  12. package/dist/src/config/auth.js.map +1 -1
  13. package/dist/src/config/auth.test.js +1 -2
  14. package/dist/src/config/auth.test.js.map +1 -1
  15. package/dist/src/config/config.integration.test.js +81 -198
  16. package/dist/src/config/config.integration.test.js.map +1 -1
  17. package/dist/src/config/config.js +3 -9
  18. package/dist/src/config/config.js.map +1 -1
  19. package/dist/src/config/config.test.js +200 -316
  20. package/dist/src/config/config.test.js.map +1 -1
  21. package/dist/src/config/extension.test.js +109 -133
  22. package/dist/src/config/extension.test.js.map +1 -1
  23. package/dist/src/config/extensions/consent.test.d.ts +6 -0
  24. package/dist/src/config/extensions/consent.test.js +152 -0
  25. package/dist/src/config/extensions/consent.test.js.map +1 -0
  26. package/dist/src/config/extensions/extensionEnablement.test.js +82 -15
  27. package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -1
  28. package/dist/src/config/extensions/extensionSettings.test.js +105 -1
  29. package/dist/src/config/extensions/extensionSettings.test.js.map +1 -1
  30. package/dist/src/config/extensions/github.d.ts +1 -0
  31. package/dist/src/config/extensions/github.js +21 -5
  32. package/dist/src/config/extensions/github.js.map +1 -1
  33. package/dist/src/config/extensions/github.test.js +201 -318
  34. package/dist/src/config/extensions/github.test.js.map +1 -1
  35. package/dist/src/config/extensions/storage.test.d.ts +6 -0
  36. package/dist/src/config/extensions/storage.test.js +64 -0
  37. package/dist/src/config/extensions/storage.test.js.map +1 -0
  38. package/dist/src/config/extensions/update.test.js +154 -263
  39. package/dist/src/config/extensions/update.test.js.map +1 -1
  40. package/dist/src/config/extensions/variables.test.js +87 -1
  41. package/dist/src/config/extensions/variables.test.js.map +1 -1
  42. package/dist/src/config/sandboxConfig.d.ts +1 -1
  43. package/dist/src/config/sandboxConfig.js.map +1 -1
  44. package/dist/src/config/sandboxConfig.test.d.ts +6 -0
  45. package/dist/src/config/sandboxConfig.test.js +178 -0
  46. package/dist/src/config/sandboxConfig.test.js.map +1 -0
  47. package/dist/src/config/settingPaths.test.d.ts +6 -0
  48. package/dist/src/config/settingPaths.test.js +22 -0
  49. package/dist/src/config/settingPaths.test.js.map +1 -0
  50. package/dist/src/config/settings.js +12 -1
  51. package/dist/src/config/settings.js.map +1 -1
  52. package/dist/src/config/settings.test.js +233 -226
  53. package/dist/src/config/settings.test.js.map +1 -1
  54. package/dist/src/config/settingsSchema.d.ts +13 -4
  55. package/dist/src/config/settingsSchema.js +13 -4
  56. package/dist/src/config/settingsSchema.js.map +1 -1
  57. package/dist/src/config/settingsSchema.test.js +10 -5
  58. package/dist/src/config/settingsSchema.test.js.map +1 -1
  59. package/dist/src/core/auth.test.d.ts +6 -0
  60. package/dist/src/core/auth.test.js +43 -0
  61. package/dist/src/core/auth.test.js.map +1 -0
  62. package/dist/src/core/initializer.test.d.ts +6 -0
  63. package/dist/src/core/initializer.test.js +101 -0
  64. package/dist/src/core/initializer.test.js.map +1 -0
  65. package/dist/src/core/theme.test.d.ts +6 -0
  66. package/dist/src/core/theme.test.js +46 -0
  67. package/dist/src/core/theme.test.js.map +1 -0
  68. package/dist/src/gemini.d.ts +1 -0
  69. package/dist/src/gemini.js +19 -2
  70. package/dist/src/gemini.js.map +1 -1
  71. package/dist/src/gemini.test.js +634 -1
  72. package/dist/src/gemini.test.js.map +1 -1
  73. package/dist/src/gemini_cleanup.test.d.ts +6 -0
  74. package/dist/src/gemini_cleanup.test.js +201 -0
  75. package/dist/src/gemini_cleanup.test.js.map +1 -0
  76. package/dist/src/generated/git-commit.d.ts +2 -2
  77. package/dist/src/generated/git-commit.js +2 -2
  78. package/dist/src/nonInteractiveCli.test.js +336 -0
  79. package/dist/src/nonInteractiveCli.test.js.map +1 -1
  80. package/dist/src/services/BuiltinCommandLoader.js +3 -1
  81. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  82. package/dist/src/services/BuiltinCommandLoader.test.js +1 -22
  83. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
  84. package/dist/src/test-utils/mockCommandContext.js +1 -1
  85. package/dist/src/test-utils/render.js +4 -0
  86. package/dist/src/test-utils/render.js.map +1 -1
  87. package/dist/src/ui/App.test.js +28 -14
  88. package/dist/src/ui/App.test.js.map +1 -1
  89. package/dist/src/ui/AppContainer.js +30 -6
  90. package/dist/src/ui/AppContainer.js.map +1 -1
  91. package/dist/src/ui/IdeIntegrationNudge.test.d.ts +6 -0
  92. package/dist/src/ui/IdeIntegrationNudge.test.js +147 -0
  93. package/dist/src/ui/IdeIntegrationNudge.test.js.map +1 -0
  94. package/dist/src/ui/auth/ApiAuthDialog.test.js +12 -17
  95. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +1 -1
  96. package/dist/src/ui/auth/AuthDialog.test.js +48 -17
  97. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
  98. package/dist/src/ui/auth/AuthInProgress.test.d.ts +6 -0
  99. package/dist/src/ui/auth/AuthInProgress.test.js +71 -0
  100. package/dist/src/ui/auth/AuthInProgress.test.js.map +1 -0
  101. package/dist/src/ui/auth/useAuth.d.ts +2 -0
  102. package/dist/src/ui/auth/useAuth.js +6 -1
  103. package/dist/src/ui/auth/useAuth.js.map +1 -1
  104. package/dist/src/ui/auth/useAuth.test.d.ts +6 -0
  105. package/dist/src/ui/auth/useAuth.test.js +178 -0
  106. package/dist/src/ui/auth/useAuth.test.js.map +1 -0
  107. package/dist/src/ui/commands/extensionsCommand.js +28 -6
  108. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  109. package/dist/src/ui/commands/extensionsCommand.test.js +32 -0
  110. package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
  111. package/dist/src/ui/commands/resumeCommand.d.ts +7 -0
  112. package/dist/src/ui/commands/resumeCommand.js +16 -0
  113. package/dist/src/ui/commands/resumeCommand.js.map +1 -0
  114. package/dist/src/ui/commands/statsCommand.js +27 -16
  115. package/dist/src/ui/commands/statsCommand.js.map +1 -1
  116. package/dist/src/ui/commands/types.d.ts +1 -1
  117. package/dist/src/ui/commands/types.js.map +1 -1
  118. package/dist/src/ui/components/AboutBox.test.d.ts +6 -0
  119. package/dist/src/ui/components/AboutBox.test.js +53 -0
  120. package/dist/src/ui/components/AboutBox.test.js.map +1 -0
  121. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +62 -11
  122. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +1 -1
  123. package/dist/src/ui/components/AnsiOutput.test.js +18 -23
  124. package/dist/src/ui/components/AnsiOutput.test.js.map +1 -1
  125. package/dist/src/ui/components/AsciiArt.d.ts +6 -6
  126. package/dist/src/ui/components/AsciiArt.js +6 -6
  127. package/dist/src/ui/components/AutoAcceptIndicator.test.d.ts +6 -0
  128. package/dist/src/ui/components/AutoAcceptIndicator.test.js +31 -0
  129. package/dist/src/ui/components/AutoAcceptIndicator.test.js.map +1 -0
  130. package/dist/src/ui/components/Banner.test.d.ts +6 -0
  131. package/dist/src/ui/components/Banner.test.js +24 -0
  132. package/dist/src/ui/components/Banner.test.js.map +1 -0
  133. package/dist/src/ui/components/ConfigInitDisplay.test.d.ts +6 -0
  134. package/dist/src/ui/components/ConfigInitDisplay.test.js +103 -0
  135. package/dist/src/ui/components/ConfigInitDisplay.test.js.map +1 -0
  136. package/dist/src/ui/components/ConsoleSummaryDisplay.test.d.ts +6 -0
  137. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js +26 -0
  138. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js.map +1 -0
  139. package/dist/src/ui/components/ContextUsageDisplay.test.d.ts +6 -0
  140. package/dist/src/ui/components/ContextUsageDisplay.test.js +39 -0
  141. package/dist/src/ui/components/ContextUsageDisplay.test.js.map +1 -0
  142. package/dist/src/ui/components/CopyModeWarning.test.d.ts +6 -0
  143. package/dist/src/ui/components/CopyModeWarning.test.js +33 -0
  144. package/dist/src/ui/components/CopyModeWarning.test.js.map +1 -0
  145. package/dist/src/ui/components/DebugProfiler.js +1 -1
  146. package/dist/src/ui/components/DebugProfiler.js.map +1 -1
  147. package/dist/src/ui/components/DebugProfiler.test.js +46 -1
  148. package/dist/src/ui/components/DebugProfiler.test.js.map +1 -1
  149. package/dist/src/ui/components/DetailedMessagesDisplay.test.d.ts +6 -0
  150. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +49 -0
  151. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +1 -0
  152. package/dist/src/ui/components/DialogManager.js +4 -0
  153. package/dist/src/ui/components/DialogManager.js.map +1 -1
  154. package/dist/src/ui/components/DialogManager.test.d.ts +6 -0
  155. package/dist/src/ui/components/DialogManager.test.js +167 -0
  156. package/dist/src/ui/components/DialogManager.test.js.map +1 -0
  157. package/dist/src/ui/components/EditorSettingsDialog.test.d.ts +6 -0
  158. package/dist/src/ui/components/EditorSettingsDialog.test.js +111 -0
  159. package/dist/src/ui/components/EditorSettingsDialog.test.js.map +1 -0
  160. package/dist/src/ui/components/ExitWarning.test.d.ts +6 -0
  161. package/dist/src/ui/components/ExitWarning.test.js +54 -0
  162. package/dist/src/ui/components/ExitWarning.test.js.map +1 -0
  163. package/dist/src/ui/components/GeminiRespondingSpinner.test.d.ts +6 -0
  164. package/dist/src/ui/components/GeminiRespondingSpinner.test.js +58 -0
  165. package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +1 -0
  166. package/dist/src/ui/components/InputPrompt.js +1 -1
  167. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  168. package/dist/src/ui/components/InputPrompt.test.js +6 -0
  169. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  170. package/dist/src/ui/components/MainContent.test.d.ts +6 -0
  171. package/dist/src/ui/components/MainContent.test.js +73 -0
  172. package/dist/src/ui/components/MainContent.test.js.map +1 -0
  173. package/dist/src/ui/components/MemoryUsageDisplay.test.d.ts +6 -0
  174. package/dist/src/ui/components/MemoryUsageDisplay.test.js +49 -0
  175. package/dist/src/ui/components/MemoryUsageDisplay.test.js.map +1 -0
  176. package/dist/src/ui/components/ModelDialog.test.js +1 -1
  177. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  178. package/dist/src/ui/components/Notifications.js +5 -3
  179. package/dist/src/ui/components/Notifications.js.map +1 -1
  180. package/dist/src/ui/components/Notifications.test.d.ts +6 -0
  181. package/dist/src/ui/components/Notifications.test.js +153 -0
  182. package/dist/src/ui/components/Notifications.test.js.map +1 -0
  183. package/dist/src/ui/components/QuittingDisplay.test.d.ts +6 -0
  184. package/dist/src/ui/components/QuittingDisplay.test.js +49 -0
  185. package/dist/src/ui/components/QuittingDisplay.test.js.map +1 -0
  186. package/dist/src/ui/components/RawMarkdownIndicator.test.d.ts +6 -0
  187. package/dist/src/ui/components/RawMarkdownIndicator.test.js +34 -0
  188. package/dist/src/ui/components/RawMarkdownIndicator.test.js.map +1 -0
  189. package/dist/src/ui/components/SessionBrowser.d.ts +98 -0
  190. package/dist/src/ui/components/SessionBrowser.js +457 -0
  191. package/dist/src/ui/components/SessionBrowser.js.map +1 -0
  192. package/dist/src/ui/components/SessionBrowser.test.d.ts +6 -0
  193. package/dist/src/ui/components/SessionBrowser.test.js +250 -0
  194. package/dist/src/ui/components/SessionBrowser.test.js.map +1 -0
  195. package/dist/src/ui/components/ShellInputPrompt.test.d.ts +6 -0
  196. package/dist/src/ui/components/ShellInputPrompt.test.js +82 -0
  197. package/dist/src/ui/components/ShellInputPrompt.test.js.map +1 -0
  198. package/dist/src/ui/components/ShellModeIndicator.test.d.ts +6 -0
  199. package/dist/src/ui/components/ShellModeIndicator.test.js +17 -0
  200. package/dist/src/ui/components/ShellModeIndicator.test.js.map +1 -0
  201. package/dist/src/ui/components/ShowMoreLines.test.d.ts +6 -0
  202. package/dist/src/ui/components/ShowMoreLines.test.js +40 -0
  203. package/dist/src/ui/components/ShowMoreLines.test.js.map +1 -0
  204. package/dist/src/ui/components/SuggestionsDisplay.test.d.ts +6 -0
  205. package/dist/src/ui/components/SuggestionsDisplay.test.js +56 -0
  206. package/dist/src/ui/components/SuggestionsDisplay.test.js.map +1 -0
  207. package/dist/src/ui/components/ThemeDialog.js +6 -2
  208. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  209. package/dist/src/ui/components/ThemeDialog.test.js +20 -6
  210. package/dist/src/ui/components/ThemeDialog.test.js.map +1 -1
  211. package/dist/src/ui/components/ThemedGradient.test.d.ts +6 -0
  212. package/dist/src/ui/components/ThemedGradient.test.js +30 -0
  213. package/dist/src/ui/components/ThemedGradient.test.js.map +1 -0
  214. package/dist/src/ui/components/Tips.test.d.ts +6 -0
  215. package/dist/src/ui/components/Tips.test.js +23 -0
  216. package/dist/src/ui/components/Tips.test.js.map +1 -0
  217. package/dist/src/ui/components/UpdateNotification.test.d.ts +6 -0
  218. package/dist/src/ui/components/UpdateNotification.test.js +16 -0
  219. package/dist/src/ui/components/UpdateNotification.test.js.map +1 -0
  220. package/dist/src/ui/components/messages/ErrorMessage.test.d.ts +6 -0
  221. package/dist/src/ui/components/messages/ErrorMessage.test.js +23 -0
  222. package/dist/src/ui/components/messages/ErrorMessage.test.js.map +1 -0
  223. package/dist/src/ui/components/messages/InfoMessage.test.d.ts +6 -0
  224. package/dist/src/ui/components/messages/InfoMessage.test.js +28 -0
  225. package/dist/src/ui/components/messages/InfoMessage.test.js.map +1 -0
  226. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +5 -6
  227. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  228. package/dist/src/ui/components/messages/ToolMessage.test.js +13 -21
  229. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
  230. package/dist/src/ui/components/messages/ToolResultDisplay.js +1 -1
  231. package/dist/src/ui/components/messages/ToolResultDisplay.js.map +1 -1
  232. package/dist/src/ui/components/messages/ToolResultDisplay.test.d.ts +6 -0
  233. package/dist/src/ui/components/messages/ToolResultDisplay.test.js +96 -0
  234. package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +1 -0
  235. package/dist/src/ui/components/messages/UserMessage.test.d.ts +6 -0
  236. package/dist/src/ui/components/messages/UserMessage.test.js +32 -0
  237. package/dist/src/ui/components/messages/UserMessage.test.js.map +1 -0
  238. package/dist/src/ui/components/messages/WarningMessage.test.d.ts +6 -0
  239. package/dist/src/ui/components/messages/WarningMessage.test.js +23 -0
  240. package/dist/src/ui/components/messages/WarningMessage.test.js.map +1 -0
  241. package/dist/src/ui/components/shared/text-buffer.js +20 -4
  242. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  243. package/dist/src/ui/components/shared/text-buffer.test.js +20 -0
  244. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  245. package/dist/src/ui/contexts/UIActionsContext.d.ts +5 -0
  246. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  247. package/dist/src/ui/contexts/UIStateContext.d.ts +1 -0
  248. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  249. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +1 -0
  250. package/dist/src/ui/hooks/slashCommandProcessor.js +3 -0
  251. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  252. package/dist/src/ui/hooks/slashCommandProcessor.test.js +1 -0
  253. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +1 -1
  254. package/dist/src/ui/hooks/useBracketedPaste.js +3 -5
  255. package/dist/src/ui/hooks/useBracketedPaste.js.map +1 -1
  256. package/dist/src/ui/hooks/useGeminiStream.test.js +1 -1
  257. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  258. package/dist/src/ui/hooks/useSessionBrowser.d.ts +18 -1
  259. package/dist/src/ui/hooks/useSessionBrowser.js +63 -0
  260. package/dist/src/ui/hooks/useSessionBrowser.js.map +1 -1
  261. package/dist/src/ui/hooks/useSessionBrowser.test.js +154 -526
  262. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +1 -1
  263. package/dist/src/ui/hooks/useSlashCompletion.test.js +5 -5
  264. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  265. package/dist/src/ui/hooks/useToolScheduler.test.js +6 -2
  266. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  267. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.d.ts +6 -0
  268. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js +121 -0
  269. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js.map +1 -0
  270. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.d.ts +6 -0
  271. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js +34 -0
  272. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js.map +1 -0
  273. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.d.ts +6 -0
  274. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js +34 -0
  275. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js.map +1 -0
  276. package/dist/src/ui/privacy/PrivacyNotice.test.d.ts +6 -0
  277. package/dist/src/ui/privacy/PrivacyNotice.test.js +62 -0
  278. package/dist/src/ui/privacy/PrivacyNotice.test.js.map +1 -0
  279. package/dist/src/ui/state/extensions.test.js +208 -51
  280. package/dist/src/ui/state/extensions.test.js.map +1 -1
  281. package/dist/src/ui/themes/holiday.d.ts +7 -0
  282. package/dist/src/ui/themes/holiday.js +162 -0
  283. package/dist/src/ui/themes/holiday.js.map +1 -0
  284. package/dist/src/ui/themes/theme-manager.js +2 -0
  285. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  286. package/dist/src/ui/types.js +1 -1
  287. package/dist/src/ui/utils/bracketedPaste.d.ts +7 -0
  288. package/dist/src/ui/utils/bracketedPaste.js +15 -0
  289. package/dist/src/ui/utils/bracketedPaste.js.map +1 -0
  290. package/dist/src/ui/utils/kittyProtocolDetector.test.d.ts +6 -0
  291. package/dist/src/ui/utils/kittyProtocolDetector.test.js +113 -0
  292. package/dist/src/ui/utils/kittyProtocolDetector.test.js.map +1 -0
  293. package/dist/src/ui/utils/terminalSetup.js +39 -38
  294. package/dist/src/ui/utils/terminalSetup.js.map +1 -1
  295. package/dist/src/ui/utils/terminalSetup.test.d.ts +6 -0
  296. package/dist/src/ui/utils/terminalSetup.test.js +132 -0
  297. package/dist/src/ui/utils/terminalSetup.test.js.map +1 -0
  298. package/dist/src/ui/utils/ui-sizing.test.d.ts +6 -0
  299. package/dist/src/ui/utils/ui-sizing.test.js +56 -0
  300. package/dist/src/ui/utils/ui-sizing.test.js.map +1 -0
  301. package/dist/src/utils/checks.test.d.ts +6 -0
  302. package/dist/src/utils/checks.test.js +29 -0
  303. package/dist/src/utils/checks.test.js.map +1 -0
  304. package/dist/src/utils/cleanup.test.js +69 -16
  305. package/dist/src/utils/cleanup.test.js.map +1 -1
  306. package/dist/src/utils/dialogScopeUtils.test.d.ts +6 -0
  307. package/dist/src/utils/dialogScopeUtils.test.js +81 -0
  308. package/dist/src/utils/dialogScopeUtils.test.js.map +1 -0
  309. package/dist/src/utils/errors.test.js +62 -0
  310. package/dist/src/utils/errors.test.js.map +1 -1
  311. package/dist/src/utils/events.test.d.ts +6 -0
  312. package/dist/src/utils/events.test.js +24 -0
  313. package/dist/src/utils/events.test.js.map +1 -0
  314. package/dist/src/utils/handleAutoUpdate.test.js +103 -24
  315. package/dist/src/utils/handleAutoUpdate.test.js.map +1 -1
  316. package/dist/src/utils/math.test.d.ts +6 -0
  317. package/dist/src/utils/math.test.js +23 -0
  318. package/dist/src/utils/math.test.js.map +1 -0
  319. package/dist/src/utils/persistentState.test.d.ts +6 -0
  320. package/dist/src/utils/persistentState.test.js +68 -0
  321. package/dist/src/utils/persistentState.test.js.map +1 -0
  322. package/dist/src/utils/readStdin.js +1 -0
  323. package/dist/src/utils/readStdin.js.map +1 -1
  324. package/dist/src/utils/readStdin.test.js +25 -0
  325. package/dist/src/utils/readStdin.test.js.map +1 -1
  326. package/dist/src/utils/resolvePath.test.d.ts +6 -0
  327. package/dist/src/utils/resolvePath.test.js +31 -0
  328. package/dist/src/utils/resolvePath.test.js.map +1 -0
  329. package/dist/src/utils/sandbox.js +6 -137
  330. package/dist/src/utils/sandbox.js.map +1 -1
  331. package/dist/src/utils/sandbox.test.d.ts +6 -0
  332. package/dist/src/utils/sandbox.test.js +302 -0
  333. package/dist/src/utils/sandbox.test.js.map +1 -0
  334. package/dist/src/utils/sandboxUtils.d.ts +14 -0
  335. package/dist/src/utils/sandboxUtils.js +120 -0
  336. package/dist/src/utils/sandboxUtils.js.map +1 -0
  337. package/dist/src/utils/sandboxUtils.test.d.ts +6 -0
  338. package/dist/src/utils/sandboxUtils.test.js +119 -0
  339. package/dist/src/utils/sandboxUtils.test.js.map +1 -0
  340. package/dist/src/utils/sessionCleanup.test.js +38 -0
  341. package/dist/src/utils/sessionCleanup.test.js.map +1 -1
  342. package/dist/src/utils/sessionUtils.d.ts +49 -4
  343. package/dist/src/utils/sessionUtils.js +100 -25
  344. package/dist/src/utils/sessionUtils.js.map +1 -1
  345. package/dist/src/utils/sessionUtils.test.js +46 -3
  346. package/dist/src/utils/sessionUtils.test.js.map +1 -1
  347. package/dist/src/utils/sessions.js +4 -1
  348. package/dist/src/utils/sessions.js.map +1 -1
  349. package/dist/src/utils/sessions.test.js +42 -0
  350. package/dist/src/utils/sessions.test.js.map +1 -1
  351. package/dist/src/utils/updateEventEmitter.test.d.ts +6 -0
  352. package/dist/src/utils/updateEventEmitter.test.js +18 -0
  353. package/dist/src/utils/updateEventEmitter.test.js.map +1 -0
  354. package/dist/src/utils/version.test.d.ts +6 -0
  355. package/dist/src/utils/version.test.js +39 -0
  356. package/dist/src/utils/version.test.js.map +1 -0
  357. package/dist/src/zed-integration/connection.test.d.ts +6 -0
  358. package/dist/src/zed-integration/connection.test.js +175 -0
  359. package/dist/src/zed-integration/connection.test.js.map +1 -0
  360. package/dist/src/zed-integration/fileSystemService.test.d.ts +6 -0
  361. package/dist/src/zed-integration/fileSystemService.test.js +98 -0
  362. package/dist/src/zed-integration/fileSystemService.test.js.map +1 -0
  363. package/dist/src/zed-integration/zedIntegration.d.ts +31 -1
  364. package/dist/src/zed-integration/zedIntegration.js +5 -2
  365. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  366. package/dist/src/zed-integration/zedIntegration.test.d.ts +6 -0
  367. package/dist/src/zed-integration/zedIntegration.test.js +619 -0
  368. package/dist/src/zed-integration/zedIntegration.test.js.map +1 -0
  369. package/dist/tsconfig.tsbuildinfo +1 -1
  370. package/package.json +6 -6
@@ -38,7 +38,7 @@ import { isWorkspaceTrusted } from './trustedFolders.js';
38
38
  // These imports will get the versions from the vi.mock('./settings.js', ...) factory.
39
39
  import { loadSettings, USER_SETTINGS_PATH, // This IS the mocked path.
40
40
  getSystemSettingsPath, getSystemDefaultsPath, migrateSettingsToV1, needsMigration, loadEnvironment, migrateDeprecatedSettings, SettingScope, saveSettings, } from './settings.js';
41
- import { FatalConfigError, CELL_DIR } from '@google/gemini-cli-core';
41
+ import { FatalConfigError, CELL_DIR, AuthType } from '@google/gemini-cli-core';
42
42
  import { ExtensionManager } from './extension-manager.js';
43
43
  import { updateSettingsFilePreservingFormat } from '../utils/commentJson.js';
44
44
  const MOCK_WORKSPACE_DIR = '/mock/workspace';
@@ -106,80 +106,74 @@ describe('Settings Loading and Merging', () => {
106
106
  it('should load empty settings if no files exist', () => {
107
107
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
108
108
  expect(settings.system.settings).toEqual({});
109
- expect(settings.user.settings).toEqual({});
110
- expect(settings.workspace.settings).toEqual({});
111
- expect(settings.merged).toEqual({});
112
- });
113
- it('should load system settings if only system file exists', () => {
114
- mockFsExistsSync.mockImplementation((p) => p === getSystemSettingsPath());
115
- const systemSettingsContent = {
116
- ui: {
117
- theme: 'system-default',
118
- },
119
- tools: {
120
- sandbox: false,
109
+ expect(settings.user.settings).toEqual({
110
+ security: {
111
+ auth: {
112
+ selectedType: AuthType.KEYCLOAK,
113
+ },
121
114
  },
122
- };
123
- fs.readFileSync.mockImplementation((p) => {
124
- if (p === getSystemSettingsPath())
125
- return JSON.stringify(systemSettingsContent);
126
- return '{}';
127
115
  });
128
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
129
- expect(fs.readFileSync).toHaveBeenCalledWith(getSystemSettingsPath(), 'utf-8');
130
- expect(settings.system.settings).toEqual(systemSettingsContent);
131
- expect(settings.user.settings).toEqual({});
132
116
  expect(settings.workspace.settings).toEqual({});
133
117
  expect(settings.merged).toEqual({
134
- ...systemSettingsContent,
118
+ security: {
119
+ auth: {
120
+ selectedType: AuthType.KEYCLOAK,
121
+ },
122
+ },
135
123
  });
136
124
  });
137
- it('should load user settings if only user file exists', () => {
138
- const expectedUserSettingsPath = USER_SETTINGS_PATH; // Use the path actually resolved by the (mocked) module
139
- mockFsExistsSync.mockImplementation((p) => p === expectedUserSettingsPath);
140
- const userSettingsContent = {
141
- ui: {
142
- theme: 'dark',
143
- },
144
- context: {
145
- fileName: 'USER_CONTEXT.md',
125
+ it.each([
126
+ {
127
+ scope: 'system',
128
+ path: getSystemSettingsPath(),
129
+ content: {
130
+ ui: { theme: 'system-default' },
131
+ tools: { sandbox: false },
132
+ },
133
+ },
134
+ {
135
+ scope: 'user',
136
+ path: USER_SETTINGS_PATH,
137
+ content: {
138
+ ui: { theme: 'dark' },
139
+ context: { fileName: 'USER_CONTEXT.md' },
140
+ },
141
+ },
142
+ {
143
+ scope: 'workspace',
144
+ path: MOCK_WORKSPACE_SETTINGS_PATH,
145
+ content: {
146
+ tools: { sandbox: true },
147
+ context: { fileName: 'WORKSPACE_CONTEXT.md' },
146
148
  },
147
- };
149
+ },
150
+ ])('should load $scope settings if only $scope file exists', ({ scope, path, content }) => {
151
+ mockFsExistsSync.mockImplementation((p) => p === path);
148
152
  fs.readFileSync.mockImplementation((p) => {
149
- if (p === expectedUserSettingsPath)
150
- return JSON.stringify(userSettingsContent);
153
+ if (p === path)
154
+ return JSON.stringify(content);
151
155
  return '{}';
152
156
  });
153
157
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
154
- expect(fs.readFileSync).toHaveBeenCalledWith(expectedUserSettingsPath, 'utf-8');
155
- expect(settings.user.settings).toEqual(userSettingsContent);
156
- expect(settings.workspace.settings).toEqual({});
157
- expect(settings.merged).toEqual({
158
- ...userSettingsContent,
159
- });
160
- });
161
- it('should load workspace settings if only workspace file exists', () => {
162
- mockFsExistsSync.mockImplementation((p) => p === MOCK_WORKSPACE_SETTINGS_PATH);
163
- const workspaceSettingsContent = {
164
- tools: {
165
- sandbox: true,
166
- },
167
- context: {
168
- fileName: 'WORKSPACE_CONTEXT.md',
158
+ expect(fs.readFileSync).toHaveBeenCalledWith(path, 'utf-8');
159
+ // Prepare expected object with default auth
160
+ const expectedWithAuth = {
161
+ ...content,
162
+ security: {
163
+ ...(content.security || {}),
164
+ auth: {
165
+ ...(content.security?.auth || {}),
166
+ selectedType: AuthType.KEYCLOAK,
167
+ },
169
168
  },
170
169
  };
171
- fs.readFileSync.mockImplementation((p) => {
172
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
173
- return JSON.stringify(workspaceSettingsContent);
174
- return '';
175
- });
176
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
177
- expect(fs.readFileSync).toHaveBeenCalledWith(MOCK_WORKSPACE_SETTINGS_PATH, 'utf-8');
178
- expect(settings.user.settings).toEqual({});
179
- expect(settings.workspace.settings).toEqual(workspaceSettingsContent);
180
- expect(settings.merged).toEqual({
181
- ...workspaceSettingsContent,
182
- });
170
+ if (scope === 'user') {
171
+ expect(settings.user.settings).toEqual(expectedWithAuth);
172
+ }
173
+ else {
174
+ expect(settings[scope].settings).toEqual(content);
175
+ }
176
+ expect(settings.merged).toEqual(expectedWithAuth);
183
177
  });
184
178
  it('should merge system, user and workspace settings, with system taking precedence over workspace, and workspace over user', () => {
185
179
  mockFsExistsSync.mockImplementation((p) => p === getSystemSettingsPath() ||
@@ -231,7 +225,14 @@ describe('Settings Loading and Merging', () => {
231
225
  });
232
226
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
233
227
  expect(settings.system.settings).toEqual(systemSettingsContent);
234
- expect(settings.user.settings).toEqual(userSettingsContent);
228
+ expect(settings.user.settings).toEqual({
229
+ ...userSettingsContent,
230
+ security: {
231
+ auth: {
232
+ selectedType: AuthType.KEYCLOAK,
233
+ },
234
+ },
235
+ });
235
236
  expect(settings.workspace.settings).toEqual(workspaceSettingsContent);
236
237
  expect(settings.merged).toEqual({
237
238
  ui: {
@@ -248,6 +249,11 @@ describe('Settings Loading and Merging', () => {
248
249
  mcp: {
249
250
  allowed: ['server1', 'server2'],
250
251
  },
252
+ security: {
253
+ auth: {
254
+ selectedType: AuthType.KEYCLOAK,
255
+ },
256
+ },
251
257
  });
252
258
  });
253
259
  it('should correctly migrate a complex legacy (v1) settings file', () => {
@@ -307,6 +313,11 @@ describe('Settings Loading and Merging', () => {
307
313
  allowed: ['legacy-server-1'],
308
314
  },
309
315
  someUnrecognizedSetting: 'should-be-preserved',
316
+ security: {
317
+ auth: {
318
+ selectedType: AuthType.KEYCLOAK,
319
+ },
320
+ },
310
321
  });
311
322
  });
312
323
  it('should rewrite allowedTools to tools.allowed during migration', () => {
@@ -412,7 +423,14 @@ describe('Settings Loading and Merging', () => {
412
423
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
413
424
  expect(settings.systemDefaults.settings).toEqual(systemDefaultsContent);
414
425
  expect(settings.system.settings).toEqual(systemSettingsContent);
415
- expect(settings.user.settings).toEqual(userSettingsContent);
426
+ expect(settings.user.settings).toEqual({
427
+ ...userSettingsContent,
428
+ security: {
429
+ auth: {
430
+ selectedType: AuthType.KEYCLOAK,
431
+ },
432
+ },
433
+ });
416
434
  expect(settings.workspace.settings).toEqual(workspaceSettingsContent);
417
435
  expect(settings.merged).toEqual({
418
436
  context: {
@@ -432,6 +450,11 @@ describe('Settings Loading and Merging', () => {
432
450
  ui: {
433
451
  theme: 'system-theme',
434
452
  },
453
+ security: {
454
+ auth: {
455
+ selectedType: AuthType.KEYCLOAK,
456
+ },
457
+ },
435
458
  });
436
459
  });
437
460
  it('should use folderTrust from workspace settings when trusted', () => {
@@ -529,64 +552,55 @@ describe('Settings Loading and Merging', () => {
529
552
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
530
553
  expect(settings.merged.security?.disableYoloMode).toBe(true); // System setting should be used
531
554
  });
532
- it('should handle contextFileName correctly when only in user settings', () => {
533
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
534
- const userSettingsContent = { context: { fileName: 'CUSTOM.md' } };
535
- fs.readFileSync.mockImplementation((p) => {
536
- if (p === USER_SETTINGS_PATH)
537
- return JSON.stringify(userSettingsContent);
538
- return '';
539
- });
540
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
541
- expect(settings.merged.context?.fileName).toBe('CUSTOM.md');
542
- });
543
- it('should handle contextFileName correctly when only in workspace settings', () => {
544
- mockFsExistsSync.mockImplementation((p) => p === MOCK_WORKSPACE_SETTINGS_PATH);
545
- const workspaceSettingsContent = {
546
- context: { fileName: 'PROJECT_SPECIFIC.md' },
547
- };
548
- fs.readFileSync.mockImplementation((p) => {
549
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
550
- return JSON.stringify(workspaceSettingsContent);
551
- return '';
552
- });
553
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
554
- expect(settings.merged.context?.fileName).toBe('PROJECT_SPECIFIC.md');
555
- });
556
- it('should handle excludedProjectEnvVars correctly when only in user settings', () => {
557
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
558
- const userSettingsContent = {
559
- general: {},
560
- advanced: { excludedEnvVars: ['DEBUG', 'NODE_ENV', 'CUSTOM_VAR'] },
561
- };
555
+ it.each([
556
+ {
557
+ description: 'contextFileName in user settings',
558
+ path: USER_SETTINGS_PATH,
559
+ content: { context: { fileName: 'CUSTOM.md' } },
560
+ expected: { key: 'context.fileName', value: 'CUSTOM.md' },
561
+ },
562
+ {
563
+ description: 'contextFileName in workspace settings',
564
+ path: MOCK_WORKSPACE_SETTINGS_PATH,
565
+ content: { context: { fileName: 'PROJECT_SPECIFIC.md' } },
566
+ expected: { key: 'context.fileName', value: 'PROJECT_SPECIFIC.md' },
567
+ },
568
+ {
569
+ description: 'excludedProjectEnvVars in user settings',
570
+ path: USER_SETTINGS_PATH,
571
+ content: {
572
+ advanced: { excludedEnvVars: ['DEBUG', 'NODE_ENV', 'CUSTOM_VAR'] },
573
+ },
574
+ expected: {
575
+ key: 'advanced.excludedEnvVars',
576
+ value: ['DEBUG', 'NODE_ENV', 'CUSTOM_VAR'],
577
+ },
578
+ },
579
+ {
580
+ description: 'excludedProjectEnvVars in workspace settings',
581
+ path: MOCK_WORKSPACE_SETTINGS_PATH,
582
+ content: {
583
+ advanced: { excludedEnvVars: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'] },
584
+ },
585
+ expected: {
586
+ key: 'advanced.excludedEnvVars',
587
+ value: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'],
588
+ },
589
+ },
590
+ ])('should handle $description correctly', ({ path, content, expected }) => {
591
+ mockFsExistsSync.mockImplementation((p) => p === path);
562
592
  fs.readFileSync.mockImplementation((p) => {
563
- if (p === USER_SETTINGS_PATH)
564
- return JSON.stringify(userSettingsContent);
565
- return '';
566
- });
567
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
568
- expect(settings.merged.advanced?.excludedEnvVars).toEqual([
569
- 'DEBUG',
570
- 'NODE_ENV',
571
- 'CUSTOM_VAR',
572
- ]);
573
- });
574
- it('should handle excludedProjectEnvVars correctly when only in workspace settings', () => {
575
- mockFsExistsSync.mockImplementation((p) => p === MOCK_WORKSPACE_SETTINGS_PATH);
576
- const workspaceSettingsContent = {
577
- general: {},
578
- advanced: { excludedEnvVars: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'] },
579
- };
580
- fs.readFileSync.mockImplementation((p) => {
581
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
582
- return JSON.stringify(workspaceSettingsContent);
583
- return '';
593
+ if (p === path)
594
+ return JSON.stringify(content);
595
+ return '{}';
584
596
  });
585
597
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
586
- expect(settings.merged.advanced?.excludedEnvVars).toEqual([
587
- 'WORKSPACE_DEBUG',
588
- 'WORKSPACE_VAR',
589
- ]);
598
+ const keys = expected.key.split('.');
599
+ let result = settings.merged;
600
+ for (const key of keys) {
601
+ result = result[key];
602
+ }
603
+ expect(result).toEqual(expected.value);
590
604
  });
591
605
  it('should merge excludedProjectEnvVars with workspace taking precedence over user', () => {
592
606
  mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH || p === MOCK_WORKSPACE_SETTINGS_PATH);
@@ -637,27 +651,28 @@ describe('Settings Loading and Merging', () => {
637
651
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
638
652
  expect(settings.merged.context?.fileName).toBeUndefined();
639
653
  });
640
- it('should load telemetry setting from user settings', () => {
641
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
642
- const userSettingsContent = { telemetry: { enabled: true } };
643
- fs.readFileSync.mockImplementation((p) => {
644
- if (p === USER_SETTINGS_PATH)
645
- return JSON.stringify(userSettingsContent);
646
- return '{}';
647
- });
648
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
649
- expect(settings.merged.telemetry?.enabled).toBe(true);
650
- });
651
- it('should load telemetry setting from workspace settings', () => {
652
- mockFsExistsSync.mockImplementation((p) => p === MOCK_WORKSPACE_SETTINGS_PATH);
653
- const workspaceSettingsContent = { telemetry: { enabled: false } };
654
+ it.each([
655
+ {
656
+ scope: 'user',
657
+ path: USER_SETTINGS_PATH,
658
+ content: { telemetry: { enabled: true } },
659
+ expected: true,
660
+ },
661
+ {
662
+ scope: 'workspace',
663
+ path: MOCK_WORKSPACE_SETTINGS_PATH,
664
+ content: { telemetry: { enabled: false } },
665
+ expected: false,
666
+ },
667
+ ])('should load telemetry setting from $scope settings', ({ path, content, expected }) => {
668
+ mockFsExistsSync.mockImplementation((p) => p === path);
654
669
  fs.readFileSync.mockImplementation((p) => {
655
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
656
- return JSON.stringify(workspaceSettingsContent);
670
+ if (p === path)
671
+ return JSON.stringify(content);
657
672
  return '{}';
658
673
  });
659
674
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
660
- expect(settings.merged.telemetry?.enabled).toBe(false);
675
+ expect(settings.merged.telemetry?.enabled).toBe(expected);
661
676
  });
662
677
  it('should prioritize workspace telemetry setting over user setting', () => {
663
678
  mockFsExistsSync.mockReturnValue(true);
@@ -717,7 +732,14 @@ describe('Settings Loading and Merging', () => {
717
732
  return '';
718
733
  });
719
734
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
720
- expect(settings.user.settings).toEqual(userSettingsContent);
735
+ expect(settings.user.settings).toEqual({
736
+ ...userSettingsContent,
737
+ security: {
738
+ auth: {
739
+ selectedType: AuthType.KEYCLOAK,
740
+ },
741
+ },
742
+ });
721
743
  expect(settings.workspace.settings).toEqual(workspaceSettingsContent);
722
744
  expect(settings.merged.mcpServers).toEqual({
723
745
  'user-server': {
@@ -736,51 +758,52 @@ describe('Settings Loading and Merging', () => {
736
758
  },
737
759
  });
738
760
  });
739
- it('should handle MCP servers when only in user settings', () => {
740
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
741
- const userSettingsContent = {
742
- mcpServers: {
761
+ it.each([
762
+ {
763
+ scope: 'user',
764
+ path: USER_SETTINGS_PATH,
765
+ content: {
766
+ mcpServers: {
767
+ 'user-only-server': {
768
+ command: 'user-only-command',
769
+ description: 'User only server',
770
+ },
771
+ },
772
+ },
773
+ expected: {
743
774
  'user-only-server': {
744
775
  command: 'user-only-command',
745
776
  description: 'User only server',
746
777
  },
747
778
  },
748
- };
749
- fs.readFileSync.mockImplementation((p) => {
750
- if (p === USER_SETTINGS_PATH)
751
- return JSON.stringify(userSettingsContent);
752
- return '';
753
- });
754
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
755
- expect(settings.merged.mcpServers).toEqual({
756
- 'user-only-server': {
757
- command: 'user-only-command',
758
- description: 'User only server',
779
+ },
780
+ {
781
+ scope: 'workspace',
782
+ path: MOCK_WORKSPACE_SETTINGS_PATH,
783
+ content: {
784
+ mcpServers: {
785
+ 'workspace-only-server': {
786
+ command: 'workspace-only-command',
787
+ description: 'Workspace only server',
788
+ },
789
+ },
759
790
  },
760
- });
761
- });
762
- it('should handle MCP servers when only in workspace settings', () => {
763
- mockFsExistsSync.mockImplementation((p) => p === MOCK_WORKSPACE_SETTINGS_PATH);
764
- const workspaceSettingsContent = {
765
- mcpServers: {
791
+ expected: {
766
792
  'workspace-only-server': {
767
793
  command: 'workspace-only-command',
768
794
  description: 'Workspace only server',
769
795
  },
770
796
  },
771
- };
797
+ },
798
+ ])('should handle MCP servers when only in $scope settings', ({ path, content, expected }) => {
799
+ mockFsExistsSync.mockImplementation((p) => p === path);
772
800
  fs.readFileSync.mockImplementation((p) => {
773
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
774
- return JSON.stringify(workspaceSettingsContent);
775
- return '';
801
+ if (p === path)
802
+ return JSON.stringify(content);
803
+ return '{}';
776
804
  });
777
805
  const settings = loadSettings(MOCK_WORKSPACE_DIR);
778
- expect(settings.merged.mcpServers).toEqual({
779
- 'workspace-only-server': {
780
- command: 'workspace-only-command',
781
- description: 'Workspace only server',
782
- },
783
- });
806
+ expect(settings.merged.mcpServers).toEqual(expected);
784
807
  });
785
808
  it('should have mcpServers as undefined if not in any settings file', () => {
786
809
  mockFsExistsSync.mockReturnValue(false); // No settings files exist
@@ -883,65 +906,44 @@ describe('Settings Loading and Merging', () => {
883
906
  excluded: ['workspace-excluded'],
884
907
  });
885
908
  });
886
- it('should merge compressionThreshold settings, with workspace taking precedence', () => {
887
- mockFsExistsSync.mockReturnValue(true);
888
- const userSettingsContent = {
889
- general: {},
890
- model: { compressionThreshold: 0.5 },
891
- };
892
- const workspaceSettingsContent = {
893
- general: {},
894
- model: { compressionThreshold: 0.8 },
895
- };
896
- fs.readFileSync.mockImplementation((p) => {
897
- if (p === USER_SETTINGS_PATH)
898
- return JSON.stringify(userSettingsContent);
899
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
900
- return JSON.stringify(workspaceSettingsContent);
901
- return '{}';
902
- });
903
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
904
- expect(settings.user.settings.model?.compressionThreshold).toEqual(0.5);
905
- expect(settings.workspace.settings.model?.compressionThreshold).toEqual(0.8);
906
- expect(settings.merged.model?.compressionThreshold).toEqual(0.8);
907
- });
908
- it('should merge output format settings, with workspace taking precedence', () => {
909
- mockFsExistsSync.mockReturnValue(true);
910
- const userSettingsContent = {
911
- output: { format: 'text' },
912
- };
913
- const workspaceSettingsContent = {
914
- output: { format: 'json' },
915
- };
916
- fs.readFileSync.mockImplementation((p) => {
917
- if (p === USER_SETTINGS_PATH)
918
- return JSON.stringify(userSettingsContent);
919
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
920
- return JSON.stringify(workspaceSettingsContent);
921
- return '{}';
922
- });
923
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
924
- expect(settings.merged.output?.format).toBe('json');
925
- });
926
- it('should handle compressionThreshold when only in user settings', () => {
927
- mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
928
- const userSettingsContent = {
929
- general: {},
930
- model: { compressionThreshold: 0.5 },
931
- };
932
- fs.readFileSync.mockImplementation((p) => {
933
- if (p === USER_SETTINGS_PATH)
934
- return JSON.stringify(userSettingsContent);
935
- return '{}';
909
+ describe('compressionThreshold settings', () => {
910
+ it.each([
911
+ {
912
+ description: 'should be taken from user settings if only present there',
913
+ userContent: { model: { compressionThreshold: 0.5 } },
914
+ workspaceContent: {},
915
+ expected: 0.5,
916
+ },
917
+ {
918
+ description: 'should be taken from workspace settings if only present there',
919
+ userContent: {},
920
+ workspaceContent: { model: { compressionThreshold: 0.8 } },
921
+ expected: 0.8,
922
+ },
923
+ {
924
+ description: 'should prioritize workspace settings over user settings',
925
+ userContent: { model: { compressionThreshold: 0.5 } },
926
+ workspaceContent: { model: { compressionThreshold: 0.8 } },
927
+ expected: 0.8,
928
+ },
929
+ {
930
+ description: 'should be undefined if not in any settings file',
931
+ userContent: {},
932
+ workspaceContent: {},
933
+ expected: undefined,
934
+ },
935
+ ])('$description', ({ userContent, workspaceContent, expected }) => {
936
+ mockFsExistsSync.mockReturnValue(true);
937
+ fs.readFileSync.mockImplementation((p) => {
938
+ if (p === USER_SETTINGS_PATH)
939
+ return JSON.stringify(userContent);
940
+ if (p === MOCK_WORKSPACE_SETTINGS_PATH)
941
+ return JSON.stringify(workspaceContent);
942
+ return '{}';
943
+ });
944
+ const settings = loadSettings(MOCK_WORKSPACE_DIR);
945
+ expect(settings.merged.model?.compressionThreshold).toEqual(expected);
936
946
  });
937
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
938
- expect(settings.merged.model?.compressionThreshold).toEqual(0.5);
939
- });
940
- it('should have model as undefined if not in any settings file', () => {
941
- mockFsExistsSync.mockReturnValue(false); // No settings files exist
942
- fs.readFileSync.mockReturnValue('{}');
943
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
944
- expect(settings.merged.model).toBeUndefined();
945
947
  });
946
948
  it('should use user compressionThreshold if workspace does not define it', () => {
947
949
  mockFsExistsSync.mockReturnValue(true);
@@ -1288,6 +1290,11 @@ describe('Settings Loading and Merging', () => {
1288
1290
  expect(settings.system.settings).toEqual(systemSettingsContent);
1289
1291
  expect(settings.merged).toEqual({
1290
1292
  ...systemSettingsContent,
1293
+ security: {
1294
+ auth: {
1295
+ selectedType: AuthType.KEYCLOAK,
1296
+ },
1297
+ },
1291
1298
  });
1292
1299
  });
1293
1300
  });