@machina.ai/cell-cli 1.0.21-rc4 → 1.2.2-rc1

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 (556) hide show
  1. package/dist/index.js +9 -0
  2. package/dist/index.js.map +1 -1
  3. package/dist/package.json +7 -8
  4. package/dist/src/commands/extensions/disable.d.ts +14 -0
  5. package/dist/src/commands/extensions/disable.js +42 -0
  6. package/dist/src/commands/extensions/disable.js.map +1 -0
  7. package/dist/src/commands/extensions/enable.d.ts +14 -0
  8. package/dist/src/commands/extensions/enable.js +48 -0
  9. package/dist/src/commands/extensions/enable.js.map +1 -0
  10. package/dist/src/commands/extensions/install.d.ts +13 -0
  11. package/dist/src/commands/extensions/install.js +48 -0
  12. package/dist/src/commands/extensions/install.js.map +1 -0
  13. package/dist/src/commands/extensions/install.test.d.ts +6 -0
  14. package/dist/src/commands/extensions/install.test.js +19 -0
  15. package/dist/src/commands/extensions/install.test.js.map +1 -0
  16. package/dist/src/commands/extensions/list.d.ts +8 -0
  17. package/dist/src/commands/extensions/list.js +32 -0
  18. package/dist/src/commands/extensions/list.js.map +1 -0
  19. package/dist/src/commands/extensions/uninstall.d.ts +12 -0
  20. package/dist/src/commands/extensions/uninstall.js +38 -0
  21. package/dist/src/commands/extensions/uninstall.js.map +1 -0
  22. package/dist/src/commands/extensions/uninstall.test.d.ts +6 -0
  23. package/dist/src/commands/extensions/uninstall.test.js +15 -0
  24. package/dist/src/commands/extensions/uninstall.test.js.map +1 -0
  25. package/dist/src/commands/extensions/update.d.ts +13 -0
  26. package/dist/src/commands/extensions/update.js +60 -0
  27. package/dist/src/commands/extensions/update.js.map +1 -0
  28. package/dist/src/commands/extensions.d.ts +7 -0
  29. package/dist/src/commands/extensions.js +29 -0
  30. package/dist/src/commands/extensions.js.map +1 -0
  31. package/dist/src/commands/mcp/list.js +1 -1
  32. package/dist/src/commands/mcp/list.js.map +1 -1
  33. package/dist/src/config/auth.js +2 -2
  34. package/dist/src/config/auth.js.map +1 -1
  35. package/dist/src/config/auth.test.js +4 -3
  36. package/dist/src/config/auth.test.js.map +1 -1
  37. package/dist/src/config/config.d.ts +10 -7
  38. package/dist/src/config/config.js +95 -56
  39. package/dist/src/config/config.js.map +1 -1
  40. package/dist/src/config/extension.d.ts +42 -2
  41. package/dist/src/config/extension.js +285 -15
  42. package/dist/src/config/extension.js.map +1 -1
  43. package/dist/src/config/extensions/variableSchema.d.ts +28 -0
  44. package/dist/src/config/extensions/variableSchema.js +18 -0
  45. package/dist/src/config/extensions/variableSchema.js.map +1 -0
  46. package/dist/src/config/extensions/variables.d.ts +17 -0
  47. package/dist/src/config/extensions/variables.js +40 -0
  48. package/dist/src/config/extensions/variables.js.map +1 -0
  49. package/dist/src/config/extensions/variables.test.d.ts +6 -0
  50. package/dist/src/config/extensions/variables.test.js +17 -0
  51. package/dist/src/config/extensions/variables.test.js.map +1 -0
  52. package/dist/src/config/keyBindings.test.js +1 -1
  53. package/dist/src/config/keyBindings.test.js.map +1 -1
  54. package/dist/src/config/sandboxConfig.d.ts +2 -2
  55. package/dist/src/config/sandboxConfig.js +5 -7
  56. package/dist/src/config/sandboxConfig.js.map +1 -1
  57. package/dist/src/config/settings.d.ts +13 -7
  58. package/dist/src/config/settings.js +375 -119
  59. package/dist/src/config/settings.js.map +1 -1
  60. package/dist/src/config/settingsSchema.d.ts +654 -338
  61. package/dist/src/config/settingsSchema.js +649 -333
  62. package/dist/src/config/settingsSchema.js.map +1 -1
  63. package/dist/src/config/settingsSchema.test.js +87 -89
  64. package/dist/src/config/settingsSchema.test.js.map +1 -1
  65. package/dist/src/config/trustedFolders.d.ts +14 -4
  66. package/dist/src/config/trustedFolders.js +53 -41
  67. package/dist/src/config/trustedFolders.js.map +1 -1
  68. package/dist/src/config/trustedFolders.test.js +43 -5
  69. package/dist/src/config/trustedFolders.test.js.map +1 -1
  70. package/dist/src/gemini.d.ts +3 -1
  71. package/dist/src/gemini.js +115 -50
  72. package/dist/src/gemini.js.map +1 -1
  73. package/dist/src/gemini.test.js +79 -25
  74. package/dist/src/gemini.test.js.map +1 -1
  75. package/dist/src/generated/git-commit.d.ts +2 -2
  76. package/dist/src/generated/git-commit.js +2 -2
  77. package/dist/src/generated/git-commit.js.map +1 -1
  78. package/dist/src/nonInteractiveCli.d.ts +1 -1
  79. package/dist/src/nonInteractiveCli.js +25 -37
  80. package/dist/src/nonInteractiveCli.js.map +1 -1
  81. package/dist/src/services/BuiltinCommandLoader.d.ts +3 -3
  82. package/dist/src/services/CommandService.d.ts +2 -2
  83. package/dist/src/services/CommandService.test.js +1 -0
  84. package/dist/src/services/CommandService.test.js.map +1 -1
  85. package/dist/src/services/FileCommandLoader.d.ts +5 -3
  86. package/dist/src/services/FileCommandLoader.js +33 -16
  87. package/dist/src/services/FileCommandLoader.js.map +1 -1
  88. package/dist/src/services/McpPromptLoader.d.ts +14 -4
  89. package/dist/src/services/McpPromptLoader.js +43 -17
  90. package/dist/src/services/McpPromptLoader.js.map +1 -1
  91. package/dist/src/services/McpPromptLoader.test.d.ts +6 -0
  92. package/dist/src/services/McpPromptLoader.test.js +114 -0
  93. package/dist/src/services/McpPromptLoader.test.js.map +1 -0
  94. package/dist/src/services/prompt-processors/argumentProcessor.d.ts +3 -3
  95. package/dist/src/services/prompt-processors/argumentProcessor.js +3 -2
  96. package/dist/src/services/prompt-processors/argumentProcessor.js.map +1 -1
  97. package/dist/src/services/prompt-processors/atFileProcessor.d.ts +12 -0
  98. package/dist/src/services/prompt-processors/atFileProcessor.js +62 -0
  99. package/dist/src/services/prompt-processors/atFileProcessor.js.map +1 -0
  100. package/dist/src/services/prompt-processors/atFileProcessor.test.d.ts +6 -0
  101. package/dist/src/services/prompt-processors/atFileProcessor.test.js +174 -0
  102. package/dist/src/services/prompt-processors/atFileProcessor.test.js.map +1 -0
  103. package/dist/src/services/prompt-processors/injectionParser.d.ts +29 -0
  104. package/dist/src/services/prompt-processors/injectionParser.js +60 -0
  105. package/dist/src/services/prompt-processors/injectionParser.js.map +1 -0
  106. package/dist/src/services/prompt-processors/injectionParser.test.d.ts +6 -0
  107. package/dist/src/services/prompt-processors/injectionParser.test.js +189 -0
  108. package/dist/src/services/prompt-processors/injectionParser.test.js.map +1 -0
  109. package/dist/src/services/prompt-processors/shellProcessor.d.ts +4 -12
  110. package/dist/src/services/prompt-processors/shellProcessor.js +19 -68
  111. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
  112. package/dist/src/services/prompt-processors/types.d.ts +13 -8
  113. package/dist/src/services/prompt-processors/types.js +4 -0
  114. package/dist/src/services/prompt-processors/types.js.map +1 -1
  115. package/dist/src/services/types.d.ts +1 -1
  116. package/dist/src/test-utils/customMatchers.js +0 -6
  117. package/dist/src/test-utils/customMatchers.js.map +1 -1
  118. package/dist/src/test-utils/mockCommandContext.d.ts +1 -1
  119. package/dist/src/test-utils/render.d.ts +1 -1
  120. package/dist/src/ui/App.d.ts +2 -2
  121. package/dist/src/ui/App.js +124 -66
  122. package/dist/src/ui/App.js.map +1 -1
  123. package/dist/src/ui/IdeIntegrationNudge.d.ts +1 -1
  124. package/dist/src/ui/IdeIntegrationNudge.js +2 -7
  125. package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
  126. package/dist/src/ui/colors.d.ts +1 -1
  127. package/dist/src/ui/commands/aboutCommand.d.ts +1 -1
  128. package/dist/src/ui/commands/aboutCommand.js +1 -1
  129. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  130. package/dist/src/ui/commands/authCommand.d.ts +1 -1
  131. package/dist/src/ui/commands/authCommand.js.map +1 -1
  132. package/dist/src/ui/commands/chatCommand.d.ts +1 -1
  133. package/dist/src/ui/commands/chatCommand.js +5 -4
  134. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  135. package/dist/src/ui/commands/clearCommand.d.ts +1 -1
  136. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  137. package/dist/src/ui/commands/compressCommand.d.ts +1 -1
  138. package/dist/src/ui/commands/compressCommand.js +2 -0
  139. package/dist/src/ui/commands/compressCommand.js.map +1 -1
  140. package/dist/src/ui/commands/copyCommand.d.ts +1 -1
  141. package/dist/src/ui/commands/copyCommand.js +2 -2
  142. package/dist/src/ui/commands/copyCommand.js.map +1 -1
  143. package/dist/src/ui/commands/directoryCommand.d.ts +1 -1
  144. package/dist/src/ui/commands/directoryCommand.js +5 -4
  145. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  146. package/dist/src/ui/commands/helpCommand.d.ts +1 -1
  147. package/dist/src/ui/commands/helpCommand.js.map +1 -1
  148. package/dist/src/ui/commands/ideCommand.d.ts +2 -2
  149. package/dist/src/ui/commands/ideCommand.js +31 -12
  150. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  151. package/dist/src/ui/commands/initCommand.d.ts +1 -1
  152. package/dist/src/ui/commands/initCommand.js +3 -3
  153. package/dist/src/ui/commands/initCommand.js.map +1 -1
  154. package/dist/src/ui/commands/mcpCommand.d.ts +1 -1
  155. package/dist/src/ui/commands/mcpCommand.js +4 -4
  156. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  157. package/dist/src/ui/commands/memoryCommand.d.ts +1 -1
  158. package/dist/src/ui/commands/memoryCommand.js +4 -3
  159. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  160. package/dist/src/ui/commands/privacyCommand.d.ts +1 -1
  161. package/dist/src/ui/commands/privacyCommand.js.map +1 -1
  162. package/dist/src/ui/commands/restoreCommand.d.ts +1 -1
  163. package/dist/src/ui/commands/restoreCommand.js +5 -9
  164. package/dist/src/ui/commands/restoreCommand.js.map +1 -1
  165. package/dist/src/ui/commands/settingsCommand.d.ts +1 -1
  166. package/dist/src/ui/commands/settingsCommand.js.map +1 -1
  167. package/dist/src/ui/commands/setupGithubCommand.d.ts +3 -1
  168. package/dist/src/ui/commands/setupGithubCommand.js +48 -9
  169. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
  170. package/dist/src/ui/commands/setupGithubCommand.test.js +100 -7
  171. package/dist/src/ui/commands/setupGithubCommand.test.js.map +1 -1
  172. package/dist/src/ui/commands/statsCommand.js.map +1 -1
  173. package/dist/src/ui/commands/terminalSetupCommand.d.ts +1 -1
  174. package/dist/src/ui/commands/terminalSetupCommand.js.map +1 -1
  175. package/dist/src/ui/commands/themeCommand.d.ts +1 -1
  176. package/dist/src/ui/commands/themeCommand.js.map +1 -1
  177. package/dist/src/ui/commands/toolsCommand.js +2 -2
  178. package/dist/src/ui/commands/toolsCommand.js.map +1 -1
  179. package/dist/src/ui/commands/types.d.ts +7 -8
  180. package/dist/src/ui/commands/types.js +1 -0
  181. package/dist/src/ui/commands/types.js.map +1 -1
  182. package/dist/src/ui/commands/vimCommand.d.ts +1 -1
  183. package/dist/src/ui/commands/vimCommand.js.map +1 -1
  184. package/dist/src/ui/components/AboutBox.d.ts +1 -1
  185. package/dist/src/ui/components/AsciiArt.d.ts +3 -3
  186. package/dist/src/ui/components/AsciiArt.js +3 -3
  187. package/dist/src/ui/components/AuthDialog.d.ts +3 -2
  188. package/dist/src/ui/components/AuthDialog.js +7 -7
  189. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  190. package/dist/src/ui/components/AuthDialog.test.js +36 -18
  191. package/dist/src/ui/components/AuthDialog.test.js.map +1 -1
  192. package/dist/src/ui/components/AuthInProgress.d.ts +1 -1
  193. package/dist/src/ui/components/AuthInProgress.js +0 -5
  194. package/dist/src/ui/components/AuthInProgress.js.map +1 -1
  195. package/dist/src/ui/components/AutoAcceptIndicator.d.ts +1 -1
  196. package/dist/src/ui/components/ConsoleSummaryDisplay.d.ts +1 -1
  197. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +1 -1
  198. package/dist/src/ui/components/ContextSummaryDisplay.js +1 -0
  199. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  200. package/dist/src/ui/components/DetailedMessagesDisplay.d.ts +2 -2
  201. package/dist/src/ui/components/DetailedMessagesDisplay.js +1 -1
  202. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  203. package/dist/src/ui/components/EditorSettingsDialog.d.ts +4 -3
  204. package/dist/src/ui/components/EditorSettingsDialog.js +8 -11
  205. package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -1
  206. package/dist/src/ui/components/FolderTrustDialog.d.ts +2 -1
  207. package/dist/src/ui/components/FolderTrustDialog.js +13 -5
  208. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  209. package/dist/src/ui/components/FolderTrustDialog.test.js +55 -3
  210. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  211. package/dist/src/ui/components/Footer.d.ts +1 -1
  212. package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +1 -1
  213. package/dist/src/ui/components/GeminiRespondingSpinner.js +5 -3
  214. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  215. package/dist/src/ui/components/Header.d.ts +1 -1
  216. package/dist/src/ui/components/Help.d.ts +2 -2
  217. package/dist/src/ui/components/Help.js +1 -1
  218. package/dist/src/ui/components/Help.js.map +1 -1
  219. package/dist/src/ui/components/HistoryItemDisplay.d.ts +4 -4
  220. package/dist/src/ui/components/HistoryItemDisplay.test.js +2 -0
  221. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  222. package/dist/src/ui/components/InputPrompt.d.ts +5 -5
  223. package/dist/src/ui/components/InputPrompt.js +142 -20
  224. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  225. package/dist/src/ui/components/LoadingIndicator.d.ts +2 -2
  226. package/dist/src/ui/components/MemoryUsageDisplay.d.ts +1 -1
  227. package/dist/src/ui/components/MemoryUsageDisplay.js +0 -5
  228. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  229. package/dist/src/ui/components/ModelStatsDisplay.d.ts +1 -1
  230. package/dist/src/ui/components/ModelStatsDisplay.js.map +1 -1
  231. package/dist/src/ui/components/PrepareLabel.d.ts +1 -1
  232. package/dist/src/ui/components/ProQuotaDialog.d.ts +13 -0
  233. package/dist/src/ui/components/ProQuotaDialog.js +21 -0
  234. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -0
  235. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +6 -0
  236. package/dist/src/ui/components/ProQuotaDialog.test.js +56 -0
  237. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -0
  238. package/dist/src/ui/components/SessionSummaryDisplay.d.ts +1 -1
  239. package/dist/src/ui/components/SettingsDialog.d.ts +2 -1
  240. package/dist/src/ui/components/SettingsDialog.js +67 -36
  241. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  242. package/dist/src/ui/components/SettingsDialog.test.js +134 -56
  243. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  244. package/dist/src/ui/components/ShellConfirmationDialog.d.ts +1 -1
  245. package/dist/src/ui/components/ShellConfirmationDialog.js +1 -1
  246. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
  247. package/dist/src/ui/components/ShellModeIndicator.d.ts +1 -1
  248. package/dist/src/ui/components/StatsDisplay.d.ts +1 -1
  249. package/dist/src/ui/components/StatsDisplay.js +3 -3
  250. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  251. package/dist/src/ui/components/SuggestionsDisplay.js +12 -4
  252. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  253. package/dist/src/ui/components/ThemeDialog.d.ts +3 -2
  254. package/dist/src/ui/components/ThemeDialog.js +5 -10
  255. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  256. package/dist/src/ui/components/Tips.d.ts +1 -1
  257. package/dist/src/ui/components/Tips.js +1 -0
  258. package/dist/src/ui/components/Tips.js.map +1 -1
  259. package/dist/src/ui/components/ToolStatsDisplay.d.ts +1 -1
  260. package/dist/src/ui/components/WorkspaceMigrationDialog.d.ts +11 -0
  261. package/dist/src/ui/components/WorkspaceMigrationDialog.js +42 -0
  262. package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -0
  263. package/dist/src/ui/components/messages/CompressionMessage.d.ts +2 -2
  264. package/dist/src/ui/components/messages/CompressionMessage.js +2 -1
  265. package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
  266. package/dist/src/ui/components/messages/DiffRenderer.d.ts +1 -1
  267. package/dist/src/ui/components/messages/DiffRenderer.js +6 -2
  268. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  269. package/dist/src/ui/components/messages/ErrorMessage.d.ts +1 -1
  270. package/dist/src/ui/components/messages/GeminiMessage.d.ts +1 -1
  271. package/dist/src/ui/components/messages/GeminiMessage.js +2 -1
  272. package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
  273. package/dist/src/ui/components/messages/GeminiMessageContent.d.ts +1 -1
  274. package/dist/src/ui/components/messages/InfoMessage.d.ts +1 -1
  275. package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +3 -3
  276. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +41 -24
  277. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  278. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +79 -2
  279. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  280. package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +4 -4
  281. package/dist/src/ui/components/messages/ToolGroupMessage.js +1 -6
  282. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  283. package/dist/src/ui/components/messages/ToolGroupMessage.test.d.ts +6 -0
  284. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +259 -0
  285. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -0
  286. package/dist/src/ui/components/messages/ToolMessage.d.ts +1 -1
  287. package/dist/src/ui/components/messages/ToolMessage.js +2 -1
  288. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  289. package/dist/src/ui/components/messages/ToolMessage.test.js +6 -6
  290. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
  291. package/dist/src/ui/components/messages/UserMessage.d.ts +1 -1
  292. package/dist/src/ui/components/messages/UserMessage.js +4 -2
  293. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  294. package/dist/src/ui/components/messages/UserShellMessage.d.ts +1 -1
  295. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  296. package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +1 -1
  297. package/dist/src/ui/components/shared/RadioButtonSelect.js +1 -6
  298. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  299. package/dist/src/ui/components/shared/text-buffer.js +5 -49
  300. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  301. package/dist/src/ui/components/shared/vim-buffer-actions.d.ts +1 -1
  302. package/dist/src/ui/components/shared/vim-buffer-actions.js.map +1 -1
  303. package/dist/src/ui/constants.d.ts +8 -0
  304. package/dist/src/ui/constants.js +9 -0
  305. package/dist/src/ui/constants.js.map +1 -1
  306. package/dist/src/ui/contexts/KeypressContext.d.ts +4 -3
  307. package/dist/src/ui/contexts/KeypressContext.js +34 -25
  308. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  309. package/dist/src/ui/contexts/KeypressContext.test.js +176 -10
  310. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  311. package/dist/src/ui/contexts/OverflowContext.d.ts +1 -1
  312. package/dist/src/ui/contexts/OverflowContext.js +0 -5
  313. package/dist/src/ui/contexts/OverflowContext.js.map +1 -1
  314. package/dist/src/ui/contexts/SessionContext.d.ts +2 -2
  315. package/dist/src/ui/contexts/SessionContext.js +1 -6
  316. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  317. package/dist/src/ui/contexts/SettingsContext.d.ts +1 -1
  318. package/dist/src/ui/contexts/StreamingContext.d.ts +1 -1
  319. package/dist/src/ui/contexts/VimModeContext.d.ts +1 -1
  320. package/dist/src/ui/contexts/VimModeContext.js +4 -4
  321. package/dist/src/ui/contexts/VimModeContext.js.map +1 -1
  322. package/dist/src/ui/hooks/atCommandProcessor.d.ts +3 -3
  323. package/dist/src/ui/hooks/atCommandProcessor.js +4 -7
  324. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  325. package/dist/src/ui/hooks/atCommandProcessor.test.js +33 -10
  326. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  327. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +3 -3
  328. package/dist/src/ui/hooks/shellCommandProcessor.js +15 -19
  329. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  330. package/dist/src/ui/hooks/shellCommandProcessor.test.js +16 -19
  331. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
  332. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +5 -4
  333. package/dist/src/ui/hooks/slashCommandProcessor.js +8 -6
  334. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  335. package/dist/src/ui/hooks/useAtCompletion.d.ts +2 -2
  336. package/dist/src/ui/hooks/useAtCompletion.js +3 -2
  337. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
  338. package/dist/src/ui/hooks/useAuthCommand.d.ts +2 -2
  339. package/dist/src/ui/hooks/useAuthCommand.js +5 -4
  340. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
  341. package/dist/src/ui/hooks/useAutoAcceptIndicator.d.ts +3 -1
  342. package/dist/src/ui/hooks/useAutoAcceptIndicator.js +13 -4
  343. package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -1
  344. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +122 -2
  345. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
  346. package/dist/src/ui/hooks/useCommandCompletion.d.ts +8 -5
  347. package/dist/src/ui/hooks/useCommandCompletion.js +30 -9
  348. package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
  349. package/dist/src/ui/hooks/useCompletion.d.ts +1 -1
  350. package/dist/src/ui/hooks/useCompletion.js +1 -1
  351. package/dist/src/ui/hooks/useCompletion.js.map +1 -1
  352. package/dist/src/ui/hooks/useConsoleMessages.d.ts +1 -1
  353. package/dist/src/ui/hooks/useEditorSettings.d.ts +2 -2
  354. package/dist/src/ui/hooks/useEditorSettings.js.map +1 -1
  355. package/dist/src/ui/hooks/useEditorSettings.test.js.map +1 -1
  356. package/dist/src/ui/hooks/useFolderTrust.d.ts +2 -1
  357. package/dist/src/ui/hooks/useFolderTrust.js +25 -12
  358. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  359. package/dist/src/ui/hooks/useGeminiStream.d.ts +6 -5
  360. package/dist/src/ui/hooks/useGeminiStream.js +66 -45
  361. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  362. package/dist/src/ui/hooks/useGitBranchName.js +1 -1
  363. package/dist/src/ui/hooks/useGitBranchName.js.map +1 -1
  364. package/dist/src/ui/hooks/useGitBranchName.test.js +1 -1
  365. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
  366. package/dist/src/ui/hooks/useHistoryManager.d.ts +1 -1
  367. package/dist/src/ui/hooks/useInputHistoryStore.d.ts +19 -0
  368. package/dist/src/ui/hooks/useInputHistoryStore.js +81 -0
  369. package/dist/src/ui/hooks/useInputHistoryStore.js.map +1 -0
  370. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +6 -0
  371. package/dist/src/ui/hooks/useInputHistoryStore.test.js +234 -0
  372. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -0
  373. package/dist/src/ui/hooks/useKeypress.d.ts +2 -2
  374. package/dist/src/ui/hooks/useKeypress.js +1 -1
  375. package/dist/src/ui/hooks/useKeypress.js.map +1 -1
  376. package/dist/src/ui/hooks/useLogger.d.ts +2 -1
  377. package/dist/src/ui/hooks/useLogger.js +3 -3
  378. package/dist/src/ui/hooks/useLogger.js.map +1 -1
  379. package/dist/src/ui/hooks/usePrivacySettings.d.ts +1 -1
  380. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  381. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -1
  382. package/dist/src/ui/hooks/usePromptCompletion.d.ts +23 -0
  383. package/dist/src/ui/hooks/usePromptCompletion.js +177 -0
  384. package/dist/src/ui/hooks/usePromptCompletion.js.map +1 -0
  385. package/dist/src/ui/hooks/useReactToolScheduler.d.ts +2 -2
  386. package/dist/src/ui/hooks/useReactToolScheduler.js +2 -3
  387. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  388. package/dist/src/ui/hooks/useReverseSearchCompletion.d.ts +2 -2
  389. package/dist/src/ui/hooks/useShellHistory.d.ts +2 -1
  390. package/dist/src/ui/hooks/useShellHistory.js +9 -10
  391. package/dist/src/ui/hooks/useShellHistory.js.map +1 -1
  392. package/dist/src/ui/hooks/useShellHistory.test.js +30 -4
  393. package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -1
  394. package/dist/src/ui/hooks/useShowMemoryCommand.d.ts +3 -3
  395. package/dist/src/ui/hooks/useShowMemoryCommand.js +1 -1
  396. package/dist/src/ui/hooks/useShowMemoryCommand.js.map +1 -1
  397. package/dist/src/ui/hooks/useSlashCompletion.d.ts +2 -2
  398. package/dist/src/ui/hooks/useSlashCompletion.js +263 -67
  399. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  400. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +4 -1
  401. package/dist/src/ui/hooks/useSlashCompletion.test.js +452 -59
  402. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  403. package/dist/src/ui/hooks/useThemeCommand.d.ts +1 -1
  404. package/dist/src/ui/hooks/useThemeCommand.js +8 -8
  405. package/dist/src/ui/hooks/useThemeCommand.js.map +1 -1
  406. package/dist/src/ui/hooks/useToolScheduler.test.js +96 -96
  407. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  408. package/dist/src/ui/hooks/useWorkspaceMigration.d.ts +13 -0
  409. package/dist/src/ui/hooks/useWorkspaceMigration.js +53 -0
  410. package/dist/src/ui/hooks/useWorkspaceMigration.js.map +1 -0
  411. package/dist/src/ui/keyMatchers.d.ts +2 -1
  412. package/dist/src/ui/keyMatchers.js +1 -1
  413. package/dist/src/ui/keyMatchers.js.map +1 -1
  414. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  415. package/dist/src/ui/privacy/CloudFreePrivacyNotice.d.ts +1 -1
  416. package/dist/src/ui/semantic-colors.d.ts +1 -1
  417. package/dist/src/ui/textConstants.d.ts +9 -0
  418. package/dist/src/ui/textConstants.js +10 -0
  419. package/dist/src/ui/textConstants.js.map +1 -0
  420. package/dist/src/ui/themes/atom-one-dark.js +1 -2
  421. package/dist/src/ui/themes/atom-one-dark.js.map +1 -1
  422. package/dist/src/ui/themes/ayu-light.js +1 -2
  423. package/dist/src/ui/themes/ayu-light.js.map +1 -1
  424. package/dist/src/ui/themes/ayu.js +1 -2
  425. package/dist/src/ui/themes/ayu.js.map +1 -1
  426. package/dist/src/ui/themes/default-light.js +1 -2
  427. package/dist/src/ui/themes/default-light.js.map +1 -1
  428. package/dist/src/ui/themes/default.js +1 -2
  429. package/dist/src/ui/themes/default.js.map +1 -1
  430. package/dist/src/ui/themes/dracula.js +1 -2
  431. package/dist/src/ui/themes/dracula.js.map +1 -1
  432. package/dist/src/ui/themes/github-dark.js +1 -2
  433. package/dist/src/ui/themes/github-dark.js.map +1 -1
  434. package/dist/src/ui/themes/github-light.js +1 -2
  435. package/dist/src/ui/themes/github-light.js.map +1 -1
  436. package/dist/src/ui/themes/googlecode.js +2 -3
  437. package/dist/src/ui/themes/googlecode.js.map +1 -1
  438. package/dist/src/ui/themes/no-color.js.map +1 -1
  439. package/dist/src/ui/themes/shades-of-purple.js +1 -2
  440. package/dist/src/ui/themes/shades-of-purple.js.map +1 -1
  441. package/dist/src/ui/themes/theme-manager.d.ts +4 -2
  442. package/dist/src/ui/themes/theme-manager.js +73 -6
  443. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  444. package/dist/src/ui/themes/theme-manager.test.js +60 -1
  445. package/dist/src/ui/themes/theme-manager.test.js.map +1 -1
  446. package/dist/src/ui/themes/theme.d.ts +3 -3
  447. package/dist/src/ui/themes/theme.js +30 -2
  448. package/dist/src/ui/themes/theme.js.map +1 -1
  449. package/dist/src/ui/themes/xcode.js +1 -2
  450. package/dist/src/ui/themes/xcode.js.map +1 -1
  451. package/dist/src/ui/types.d.ts +4 -2
  452. package/dist/src/ui/types.js.map +1 -1
  453. package/dist/src/ui/utils/CodeColorizer.d.ts +2 -2
  454. package/dist/src/ui/utils/CodeColorizer.js +1 -1
  455. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  456. package/dist/src/ui/utils/ConsolePatcher.d.ts +1 -1
  457. package/dist/src/ui/utils/ConsolePatcher.js +1 -1
  458. package/dist/src/ui/utils/ConsolePatcher.js.map +1 -1
  459. package/dist/src/ui/utils/MarkdownDisplay.js +2 -1
  460. package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
  461. package/dist/src/ui/utils/MarkdownDisplay.test.js +17 -16
  462. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  463. package/dist/src/ui/utils/clipboardUtils.js +6 -6
  464. package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
  465. package/dist/src/ui/utils/commandUtils.d.ts +1 -1
  466. package/dist/src/ui/utils/commandUtils.js +52 -14
  467. package/dist/src/ui/utils/commandUtils.js.map +1 -1
  468. package/dist/src/ui/utils/commandUtils.test.js +76 -21
  469. package/dist/src/ui/utils/commandUtils.test.js.map +1 -1
  470. package/dist/src/ui/utils/computeStats.d.ts +1 -1
  471. package/dist/src/ui/utils/platformConstants.d.ts +9 -0
  472. package/dist/src/ui/utils/platformConstants.js +9 -0
  473. package/dist/src/ui/utils/platformConstants.js.map +1 -1
  474. package/dist/src/ui/utils/terminalSetup.js +5 -5
  475. package/dist/src/ui/utils/terminalSetup.js.map +1 -1
  476. package/dist/src/ui/utils/textUtils.d.ts +18 -0
  477. package/dist/src/ui/utils/textUtils.js +44 -0
  478. package/dist/src/ui/utils/textUtils.js.map +1 -1
  479. package/dist/src/ui/utils/updateCheck.d.ts +1 -1
  480. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  481. package/dist/src/utils/cleanup.js +5 -4
  482. package/dist/src/utils/cleanup.js.map +1 -1
  483. package/dist/src/utils/dialogScopeUtils.d.ts +2 -1
  484. package/dist/src/utils/dialogScopeUtils.js.map +1 -1
  485. package/dist/src/utils/envVarResolver.d.ts +39 -0
  486. package/dist/src/utils/envVarResolver.js +97 -0
  487. package/dist/src/utils/envVarResolver.js.map +1 -0
  488. package/dist/src/utils/envVarResolver.test.d.ts +6 -0
  489. package/dist/src/utils/envVarResolver.test.js +221 -0
  490. package/dist/src/utils/envVarResolver.test.js.map +1 -0
  491. package/dist/src/utils/errors.d.ts +6 -0
  492. package/dist/src/utils/errors.js +12 -0
  493. package/dist/src/utils/errors.js.map +1 -0
  494. package/dist/src/utils/events.d.ts +1 -1
  495. package/dist/src/utils/events.js +1 -1
  496. package/dist/src/utils/events.js.map +1 -1
  497. package/dist/src/utils/gitUtils.js +1 -1
  498. package/dist/src/utils/gitUtils.js.map +1 -1
  499. package/dist/src/utils/gitUtils.test.js +4 -4
  500. package/dist/src/utils/gitUtils.test.js.map +1 -1
  501. package/dist/src/utils/handleAutoUpdate.d.ts +4 -4
  502. package/dist/src/utils/handleAutoUpdate.js +4 -3
  503. package/dist/src/utils/handleAutoUpdate.js.map +1 -1
  504. package/dist/src/utils/installationInfo.js +3 -3
  505. package/dist/src/utils/installationInfo.js.map +1 -1
  506. package/dist/src/utils/installationInfo.test.js +3 -3
  507. package/dist/src/utils/installationInfo.test.js.map +1 -1
  508. package/dist/src/utils/package.js +2 -2
  509. package/dist/src/utils/package.js.map +1 -1
  510. package/dist/src/utils/readStdin.js +15 -0
  511. package/dist/src/utils/readStdin.js.map +1 -1
  512. package/dist/src/utils/readStdin.test.d.ts +6 -0
  513. package/dist/src/utils/readStdin.test.js +88 -0
  514. package/dist/src/utils/readStdin.test.js.map +1 -0
  515. package/dist/src/utils/resolvePath.js +2 -2
  516. package/dist/src/utils/resolvePath.js.map +1 -1
  517. package/dist/src/utils/sandbox-macos-permissive-closed.sb +1 -1
  518. package/dist/src/utils/sandbox-macos-permissive-open.sb +2 -2
  519. package/dist/src/utils/sandbox-macos-permissive-proxied.sb +1 -1
  520. package/dist/src/utils/sandbox-macos-restrictive-closed.sb +2 -2
  521. package/dist/src/utils/sandbox-macos-restrictive-open.sb +2 -2
  522. package/dist/src/utils/sandbox-macos-restrictive-proxied.sb +1 -1
  523. package/dist/src/utils/sandbox.d.ts +2 -2
  524. package/dist/src/utils/sandbox.js +20 -27
  525. package/dist/src/utils/sandbox.js.map +1 -1
  526. package/dist/src/utils/settingsUtils.d.ts +2 -2
  527. package/dist/src/utils/settingsUtils.js +2 -8
  528. package/dist/src/utils/settingsUtils.js.map +1 -1
  529. package/dist/src/utils/settingsUtils.test.js +145 -148
  530. package/dist/src/utils/settingsUtils.test.js.map +1 -1
  531. package/dist/src/utils/spawnWrapper.d.ts +1 -1
  532. package/dist/src/utils/spawnWrapper.js +1 -1
  533. package/dist/src/utils/spawnWrapper.js.map +1 -1
  534. package/dist/src/utils/startupWarnings.js +2 -2
  535. package/dist/src/utils/startupWarnings.js.map +1 -1
  536. package/dist/src/utils/updateEventEmitter.d.ts +1 -1
  537. package/dist/src/utils/updateEventEmitter.js +1 -1
  538. package/dist/src/utils/updateEventEmitter.js.map +1 -1
  539. package/dist/src/utils/userStartupWarnings.js +3 -3
  540. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  541. package/dist/src/utils/userStartupWarnings.test.js +3 -3
  542. package/dist/src/utils/userStartupWarnings.test.js.map +1 -1
  543. package/dist/src/validateNonInterActiveAuth.d.ts +2 -1
  544. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  545. package/dist/src/zed-integration/acp.d.ts +1 -1
  546. package/dist/src/zed-integration/acp.js +2 -1
  547. package/dist/src/zed-integration/acp.js.map +1 -1
  548. package/dist/src/zed-integration/fileSystemService.d.ts +2 -2
  549. package/dist/src/zed-integration/schema.d.ts +116 -13
  550. package/dist/src/zed-integration/schema.js +7 -1
  551. package/dist/src/zed-integration/schema.js.map +1 -1
  552. package/dist/src/zed-integration/zedIntegration.d.ts +4 -4
  553. package/dist/src/zed-integration/zedIntegration.js +190 -154
  554. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  555. package/dist/tsconfig.tsbuildinfo +1 -1
  556. package/package.json +10 -10
@@ -3,90 +3,349 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import * as fs from 'fs';
7
- import * as path from 'path';
8
- import { homedir, platform } from 'os';
6
+ import * as fs from 'node:fs';
7
+ import * as path from 'node:path';
8
+ import { homedir, platform } from 'node:os';
9
9
  import * as dotenv from 'dotenv';
10
- import { GEMINI_CONFIG_DIR as GEMINI_DIR, getErrorMessage, } from '@machina.ai/cell-cli-core';
10
+ import process from 'node:process';
11
+ import { CELL_CONFIG_DIR as CELL_DIR, getErrorMessage, Storage, } from '@machina.ai/cell-cli-core';
12
+ /*
11
13
  import { loadYamlConfig } from '@machina.ai/config-yaml';
14
+ */
12
15
  import stripJsonComments from 'strip-json-comments';
13
16
  import { DefaultLight } from '../ui/themes/default-light.js';
14
17
  import { DefaultDark } from '../ui/themes/default.js';
18
+ import { isWorkspaceTrusted } from './trustedFolders.js';
19
+ import { resolveEnvVarsInObject } from '../utils/envVarResolver.js';
20
+ import { mergeWith } from 'lodash-es';
15
21
  export const SETTINGS_DIRECTORY_NAME = '.cell-cli';
16
- export const USER_SETTINGS_DIR = path.join(homedir(), SETTINGS_DIRECTORY_NAME);
17
- export const USER_SETTINGS_PATH = path.join(USER_SETTINGS_DIR, 'settings.json');
22
+ export const USER_SETTINGS_PATH = Storage.getGlobalSettingsPath();
23
+ export const USER_SETTINGS_DIR = path.dirname(USER_SETTINGS_PATH);
18
24
  export const DEFAULT_EXCLUDED_ENV_VARS = ['DEBUG', 'DEBUG_MODE'];
25
+ const MIGRATE_V2_OVERWRITE = false;
26
+ // As defined in spec.md
27
+ const MIGRATION_MAP = {
28
+ preferredEditor: 'general.preferredEditor',
29
+ vimMode: 'general.vimMode',
30
+ disableAutoUpdate: 'general.disableAutoUpdate',
31
+ disableUpdateNag: 'general.disableUpdateNag',
32
+ checkpointing: 'general.checkpointing',
33
+ theme: 'ui.theme',
34
+ customThemes: 'ui.customThemes',
35
+ hideWindowTitle: 'ui.hideWindowTitle',
36
+ hideTips: 'ui.hideTips',
37
+ hideBanner: 'ui.hideBanner',
38
+ hideFooter: 'ui.hideFooter',
39
+ showMemoryUsage: 'ui.showMemoryUsage',
40
+ showLineNumbers: 'ui.showLineNumbers',
41
+ showCitations: 'ui.showCitations',
42
+ accessibility: 'ui.accessibility',
43
+ ideMode: 'ide.enabled',
44
+ hasSeenIdeIntegrationNudge: 'ide.hasSeenNudge',
45
+ usageStatisticsEnabled: 'privacy.usageStatisticsEnabled',
46
+ telemetry: 'telemetry',
47
+ model: 'model.name',
48
+ maxSessionTurns: 'model.maxSessionTurns',
49
+ summarizeToolOutput: 'model.summarizeToolOutput',
50
+ chatCompression: 'model.chatCompression',
51
+ skipNextSpeakerCheck: 'model.skipNextSpeakerCheck',
52
+ contextFileName: 'context.fileName',
53
+ memoryImportFormat: 'context.importFormat',
54
+ memoryDiscoveryMaxDirs: 'context.discoveryMaxDirs',
55
+ includeDirectories: 'context.includeDirectories',
56
+ loadMemoryFromIncludeDirectories: 'context.loadFromIncludeDirectories',
57
+ fileFiltering: 'context.fileFiltering',
58
+ sandbox: 'tools.sandbox',
59
+ shouldUseNodePtyShell: 'tools.usePty',
60
+ allowedTools: 'tools.allowed',
61
+ coreTools: 'tools.core',
62
+ excludeTools: 'tools.exclude',
63
+ toolDiscoveryCommand: 'tools.discoveryCommand',
64
+ toolCallCommand: 'tools.callCommand',
65
+ mcpServerCommand: 'mcp.serverCommand',
66
+ allowMCPServers: 'mcp.allowed',
67
+ excludeMCPServers: 'mcp.excluded',
68
+ folderTrustFeature: 'security.folderTrust.featureEnabled',
69
+ folderTrust: 'security.folderTrust.enabled',
70
+ selectedAuthType: 'security.auth.selectedType',
71
+ useExternalAuth: 'security.auth.useExternal',
72
+ autoConfigureMaxOldSpaceSize: 'advanced.autoConfigureMemory',
73
+ dnsResolutionOrder: 'advanced.dnsResolutionOrder',
74
+ excludedProjectEnvVars: 'advanced.excludedEnvVars',
75
+ bugCommand: 'advanced.bugCommand',
76
+ };
19
77
  export function getSystemSettingsPath() {
20
- if (process.env['GEMINI_CLI_SYSTEM_SETTINGS_PATH']) {
21
- return process.env['GEMINI_CLI_SYSTEM_SETTINGS_PATH'];
78
+ if (process.env['CELL_CLI_SYSTEM_SETTINGS_PATH']) {
79
+ return process.env['CELL_CLI_SYSTEM_SETTINGS_PATH'];
22
80
  }
23
81
  if (platform() === 'darwin') {
24
- return '/Library/Application Support/GeminiCli/settings.json';
82
+ return '/Library/Application Support/CellCli/settings.json';
25
83
  }
26
84
  else if (platform() === 'win32') {
27
- return 'C:\\ProgramData\\gemini-cli\\settings.json';
85
+ return 'C:\\ProgramData\\cell-cli\\settings.json';
28
86
  }
29
87
  else {
30
- return '/etc/gemini-cli/settings.json';
88
+ return '/etc/cell-cli/settings.json';
31
89
  }
32
90
  }
33
- export function getWorkspaceSettingsPath(workspaceDir) {
34
- return path.join(workspaceDir, SETTINGS_DIRECTORY_NAME, 'settings.json');
91
+ export function getSystemDefaultsPath() {
92
+ if (process.env['CELL_CLI_SYSTEM_DEFAULTS_PATH']) {
93
+ return process.env['CELL_CLI_SYSTEM_DEFAULTS_PATH'];
94
+ }
95
+ return path.join(path.dirname(getSystemSettingsPath()), 'system-defaults.json');
35
96
  }
36
97
  export var SettingScope;
37
98
  (function (SettingScope) {
38
99
  SettingScope["User"] = "User";
39
100
  SettingScope["Workspace"] = "Workspace";
40
101
  SettingScope["System"] = "System";
102
+ SettingScope["SystemDefaults"] = "SystemDefaults";
41
103
  })(SettingScope || (SettingScope = {}));
42
- function mergeSettings(system, user, workspace) {
104
+ function setNestedProperty(obj, path, value) {
105
+ const keys = path.split('.');
106
+ const lastKey = keys.pop();
107
+ if (!lastKey)
108
+ return;
109
+ let current = obj;
110
+ for (const key of keys) {
111
+ if (current[key] === undefined) {
112
+ current[key] = {};
113
+ }
114
+ const next = current[key];
115
+ if (typeof next === 'object' && next !== null) {
116
+ current = next;
117
+ }
118
+ else {
119
+ // This path is invalid, so we stop.
120
+ return;
121
+ }
122
+ }
123
+ current[lastKey] = value;
124
+ }
125
+ function needsMigration(settings) {
126
+ return !('general' in settings);
127
+ }
128
+ function migrateSettingsToV2(flatSettings) {
129
+ if (!needsMigration(flatSettings)) {
130
+ return null;
131
+ }
132
+ const v2Settings = {};
133
+ const flatKeys = new Set(Object.keys(flatSettings));
134
+ for (const [oldKey, newPath] of Object.entries(MIGRATION_MAP)) {
135
+ if (flatKeys.has(oldKey)) {
136
+ setNestedProperty(v2Settings, newPath, flatSettings[oldKey]);
137
+ flatKeys.delete(oldKey);
138
+ }
139
+ }
140
+ // Preserve mcpServers at the top level
141
+ if (flatSettings['mcpServers']) {
142
+ v2Settings['mcpServers'] = flatSettings['mcpServers'];
143
+ flatKeys.delete('mcpServers');
144
+ }
145
+ // Carry over any unrecognized keys
146
+ for (const remainingKey of flatKeys) {
147
+ v2Settings[remainingKey] = flatSettings[remainingKey];
148
+ }
149
+ return v2Settings;
150
+ }
151
+ function getNestedProperty(obj, path) {
152
+ const keys = path.split('.');
153
+ let current = obj;
154
+ for (const key of keys) {
155
+ if (typeof current !== 'object' || current === null || !(key in current)) {
156
+ return undefined;
157
+ }
158
+ current = current[key];
159
+ }
160
+ return current;
161
+ }
162
+ const REVERSE_MIGRATION_MAP = Object.fromEntries(Object.entries(MIGRATION_MAP).map(([key, value]) => [value, key]));
163
+ // Dynamically determine the top-level keys from the V2 settings structure.
164
+ const KNOWN_V2_CONTAINERS = new Set(Object.values(MIGRATION_MAP).map((path) => path.split('.')[0]));
165
+ export function migrateSettingsToV1(v2Settings) {
166
+ const v1Settings = {};
167
+ const v2Keys = new Set(Object.keys(v2Settings));
168
+ for (const [newPath, oldKey] of Object.entries(REVERSE_MIGRATION_MAP)) {
169
+ const value = getNestedProperty(v2Settings, newPath);
170
+ if (value !== undefined) {
171
+ v1Settings[oldKey] = value;
172
+ v2Keys.delete(newPath.split('.')[0]);
173
+ }
174
+ }
175
+ // Preserve mcpServers at the top level
176
+ if (v2Settings['mcpServers']) {
177
+ v1Settings['mcpServers'] = v2Settings['mcpServers'];
178
+ v2Keys.delete('mcpServers');
179
+ }
180
+ // Carry over any unrecognized keys
181
+ for (const remainingKey of v2Keys) {
182
+ const value = v2Settings[remainingKey];
183
+ if (value === undefined) {
184
+ continue;
185
+ }
186
+ // Don't carry over empty objects that were just containers for migrated settings.
187
+ if (KNOWN_V2_CONTAINERS.has(remainingKey) &&
188
+ typeof value === 'object' &&
189
+ value !== null &&
190
+ !Array.isArray(value) &&
191
+ Object.keys(value).length === 0) {
192
+ continue;
193
+ }
194
+ v1Settings[remainingKey] = value;
195
+ }
196
+ return v1Settings;
197
+ }
198
+ function mergeSettings(system, systemDefaults, user, workspace, isTrusted) {
199
+ const safeWorkspace = isTrusted ? workspace : {};
43
200
  // folderTrust is not supported at workspace level.
44
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
45
- const { folderTrust, ...workspaceWithoutFolderTrust } = workspace;
201
+ const { security, ...restOfWorkspace } = safeWorkspace;
202
+ const safeWorkspaceWithoutFolderTrust = security
203
+ ? {
204
+ ...restOfWorkspace,
205
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
206
+ security: (({ folderTrust, ...rest }) => rest)(security),
207
+ }
208
+ : {
209
+ ...restOfWorkspace,
210
+ security: {},
211
+ };
212
+ // Settings are merged with the following precedence (last one wins for
213
+ // single values):
214
+ // 1. System Defaults
215
+ // 2. User Settings
216
+ // 3. Workspace Settings
217
+ // 4. System Settings (as overrides)
218
+ //
219
+ // For properties that are arrays (e.g., includeDirectories), the arrays
220
+ // are concatenated. For objects (e.g., customThemes), they are merged.
46
221
  return {
222
+ ...systemDefaults,
47
223
  ...user,
48
- ...workspaceWithoutFolderTrust,
224
+ ...safeWorkspaceWithoutFolderTrust,
49
225
  ...system,
50
- customThemes: {
51
- ...(user.customThemes || {}),
52
- ...(workspace.customThemes || {}),
53
- ...(system.customThemes || {}),
226
+ general: {
227
+ ...(systemDefaults.general || {}),
228
+ ...(user.general || {}),
229
+ ...(safeWorkspaceWithoutFolderTrust.general || {}),
230
+ ...(system.general || {}),
231
+ },
232
+ ui: {
233
+ ...(systemDefaults.ui || {}),
234
+ ...(user.ui || {}),
235
+ ...(safeWorkspaceWithoutFolderTrust.ui || {}),
236
+ ...(system.ui || {}),
237
+ customThemes: {
238
+ ...(systemDefaults.ui?.customThemes || {}),
239
+ ...(user.ui?.customThemes || {}),
240
+ ...(safeWorkspaceWithoutFolderTrust.ui?.customThemes || {}),
241
+ ...(system.ui?.customThemes || {}),
242
+ },
243
+ },
244
+ security: {
245
+ ...(systemDefaults.security || {}),
246
+ ...(user.security || {}),
247
+ ...(safeWorkspaceWithoutFolderTrust.security || {}),
248
+ ...(system.security || {}),
249
+ },
250
+ mcp: {
251
+ ...(systemDefaults.mcp || {}),
252
+ ...(user.mcp || {}),
253
+ ...(safeWorkspaceWithoutFolderTrust.mcp || {}),
254
+ ...(system.mcp || {}),
54
255
  },
55
256
  mcpServers: {
257
+ ...(systemDefaults.mcpServers || {}),
56
258
  ...(user.mcpServers || {}),
57
- ...(workspace.mcpServers || {}),
259
+ ...(safeWorkspaceWithoutFolderTrust.mcpServers || {}),
58
260
  ...(system.mcpServers || {}),
59
261
  },
60
- includeDirectories: [
61
- ...(system.includeDirectories || []),
62
- ...(user.includeDirectories || []),
63
- ...(workspace.includeDirectories || []),
64
- ],
65
- chatCompression: {
66
- ...(system.chatCompression || {}),
67
- ...(user.chatCompression || {}),
68
- ...(workspace.chatCompression || {}),
262
+ context: {
263
+ ...(systemDefaults.context || {}),
264
+ ...(user.context || {}),
265
+ ...(safeWorkspaceWithoutFolderTrust.context || {}),
266
+ ...(system.context || {}),
267
+ includeDirectories: [
268
+ ...(systemDefaults.context?.includeDirectories || []),
269
+ ...(user.context?.includeDirectories || []),
270
+ ...(safeWorkspaceWithoutFolderTrust.context?.includeDirectories || []),
271
+ ...(system.context?.includeDirectories || []),
272
+ ],
273
+ },
274
+ model: {
275
+ ...(systemDefaults.model || {}),
276
+ ...(user.model || {}),
277
+ ...(safeWorkspaceWithoutFolderTrust.model || {}),
278
+ ...(system.model || {}),
279
+ chatCompression: {
280
+ ...(systemDefaults.model?.chatCompression || {}),
281
+ ...(user.model?.chatCompression || {}),
282
+ ...(safeWorkspaceWithoutFolderTrust.model?.chatCompression || {}),
283
+ ...(system.model?.chatCompression || {}),
284
+ },
285
+ },
286
+ advanced: {
287
+ ...(systemDefaults.advanced || {}),
288
+ ...(user.advanced || {}),
289
+ ...(safeWorkspaceWithoutFolderTrust.advanced || {}),
290
+ ...(system.advanced || {}),
291
+ excludedEnvVars: [
292
+ ...new Set([
293
+ ...(systemDefaults.advanced?.excludedEnvVars || []),
294
+ ...(user.advanced?.excludedEnvVars || []),
295
+ ...(safeWorkspaceWithoutFolderTrust.advanced?.excludedEnvVars || []),
296
+ ...(system.advanced?.excludedEnvVars || []),
297
+ ]),
298
+ ],
299
+ },
300
+ extensions: {
301
+ ...(systemDefaults.extensions || {}),
302
+ ...(user.extensions || {}),
303
+ ...(safeWorkspaceWithoutFolderTrust.extensions || {}),
304
+ ...(system.extensions || {}),
305
+ disabled: [
306
+ ...new Set([
307
+ ...(systemDefaults.extensions?.disabled || []),
308
+ ...(user.extensions?.disabled || []),
309
+ ...(safeWorkspaceWithoutFolderTrust.extensions?.disabled || []),
310
+ ...(system.extensions?.disabled || []),
311
+ ]),
312
+ ],
313
+ workspacesWithMigrationNudge: [
314
+ ...new Set([
315
+ ...(systemDefaults.extensions?.workspacesWithMigrationNudge || []),
316
+ ...(user.extensions?.workspacesWithMigrationNudge || []),
317
+ ...(safeWorkspaceWithoutFolderTrust.extensions
318
+ ?.workspacesWithMigrationNudge || []),
319
+ ...(system.extensions?.workspacesWithMigrationNudge || []),
320
+ ]),
321
+ ],
69
322
  },
70
323
  };
71
324
  }
72
325
  export class LoadedSettings {
73
- constructor(system, user, workspace, errors) {
326
+ constructor(system, systemDefaults, user, workspace, errors, isTrusted, migratedInMemorScopes) {
74
327
  this.system = system;
328
+ this.systemDefaults = systemDefaults;
75
329
  this.user = user;
76
330
  this.workspace = workspace;
77
331
  this.errors = errors;
332
+ this.isTrusted = isTrusted;
333
+ this.migratedInMemorScopes = migratedInMemorScopes;
78
334
  this._merged = this.computeMergedSettings();
79
335
  }
80
336
  system;
337
+ systemDefaults;
81
338
  user;
82
339
  workspace;
83
340
  errors;
341
+ isTrusted;
342
+ migratedInMemorScopes;
84
343
  _merged;
85
344
  get merged() {
86
345
  return this._merged;
87
346
  }
88
347
  computeMergedSettings() {
89
- return mergeSettings(this.system.settings, this.user.settings, this.workspace.settings);
348
+ return mergeSettings(this.system.settings, this.systemDefaults.settings, this.user.settings, this.workspace.settings, this.isTrusted);
90
349
  }
91
350
  forScope(scope) {
92
351
  switch (scope) {
@@ -96,56 +355,24 @@ export class LoadedSettings {
96
355
  return this.workspace;
97
356
  case SettingScope.System:
98
357
  return this.system;
358
+ case SettingScope.SystemDefaults:
359
+ return this.systemDefaults;
99
360
  default:
100
361
  throw new Error(`Invalid scope: ${scope}`);
101
362
  }
102
363
  }
103
364
  setValue(scope, key, value) {
104
365
  const settingsFile = this.forScope(scope);
105
- settingsFile.settings[key] = value;
366
+ setNestedProperty(settingsFile.settings, key, value);
106
367
  this._merged = this.computeMergedSettings();
107
368
  saveSettings(settingsFile);
108
369
  }
109
370
  }
110
- function resolveEnvVarsInString(value) {
111
- const envVarRegex = /\$(?:(\w+)|{([^}]+)})/g; // Find $VAR_NAME or ${VAR_NAME}
112
- return value.replace(envVarRegex, (match, varName1, varName2) => {
113
- const varName = varName1 || varName2;
114
- if (process && process.env && typeof process.env[varName] === 'string') {
115
- return process.env[varName];
116
- }
117
- return match;
118
- });
119
- }
120
- function resolveEnvVarsInObject(obj) {
121
- if (obj === null ||
122
- obj === undefined ||
123
- typeof obj === 'boolean' ||
124
- typeof obj === 'number') {
125
- return obj;
126
- }
127
- if (typeof obj === 'string') {
128
- return resolveEnvVarsInString(obj);
129
- }
130
- if (Array.isArray(obj)) {
131
- return obj.map((item) => resolveEnvVarsInObject(item));
132
- }
133
- if (typeof obj === 'object') {
134
- const newObj = { ...obj };
135
- for (const key in newObj) {
136
- if (Object.prototype.hasOwnProperty.call(newObj, key)) {
137
- newObj[key] = resolveEnvVarsInObject(newObj[key]);
138
- }
139
- }
140
- return newObj;
141
- }
142
- return obj;
143
- }
144
371
  function findEnvFile(startDir) {
145
372
  let currentDir = path.resolve(startDir);
146
373
  while (true) {
147
- // prefer gemini-specific .env under GEMINI_DIR
148
- const geminiEnvPath = path.join(currentDir, GEMINI_DIR, '.env');
374
+ // prefer gemini-specific .env under CELL_DIR
375
+ const geminiEnvPath = path.join(currentDir, CELL_DIR, '.env');
149
376
  if (fs.existsSync(geminiEnvPath)) {
150
377
  return geminiEnvPath;
151
378
  }
@@ -156,7 +383,7 @@ function findEnvFile(startDir) {
156
383
  const parentDir = path.dirname(currentDir);
157
384
  if (parentDir === currentDir || !parentDir) {
158
385
  // check .env under home as fallback, again preferring gemini-specific .env
159
- const homeGeminiEnvPath = path.join(homedir(), GEMINI_DIR, '.env');
386
+ const homeGeminiEnvPath = path.join(homedir(), CELL_DIR, '.env');
160
387
  if (fs.existsSync(homeGeminiEnvPath)) {
161
388
  return homeGeminiEnvPath;
162
389
  }
@@ -194,33 +421,21 @@ export function setUpCloudShellEnvironment(envFilePath) {
194
421
  }
195
422
  export function loadEnvironment(settings) {
196
423
  const envFilePath = findEnvFile(process.cwd());
424
+ if (!isWorkspaceTrusted(settings)) {
425
+ return;
426
+ }
197
427
  // Cloud Shell environment variable handling
198
428
  if (process.env['CLOUD_SHELL'] === 'true') {
199
429
  setUpCloudShellEnvironment(envFilePath);
200
430
  }
201
- // If no settings provided, try to load workspace settings for exclusions
202
- let resolvedSettings = settings;
203
- if (!resolvedSettings) {
204
- const workspaceSettingsPath = getWorkspaceSettingsPath(process.cwd());
205
- try {
206
- if (fs.existsSync(workspaceSettingsPath)) {
207
- const workspaceContent = fs.readFileSync(workspaceSettingsPath, 'utf-8');
208
- const parsedWorkspaceSettings = JSON.parse(stripJsonComments(workspaceContent));
209
- resolvedSettings = resolveEnvVarsInObject(parsedWorkspaceSettings);
210
- }
211
- }
212
- catch (_e) {
213
- // Ignore errors loading workspace settings
214
- }
215
- }
216
431
  if (envFilePath) {
217
432
  // Manually parse and load environment variables to handle exclusions correctly.
218
433
  // This avoids modifying environment variables that were already set from the shell.
219
434
  try {
220
435
  const envFileContent = fs.readFileSync(envFilePath, 'utf-8');
221
436
  const parsedEnv = dotenv.parse(envFileContent);
222
- const excludedVars = resolvedSettings?.excludedProjectEnvVars || DEFAULT_EXCLUDED_ENV_VARS;
223
- const isProjectEnvFile = !envFilePath.includes(GEMINI_DIR);
437
+ const excludedVars = settings?.advanced?.excludedEnvVars || DEFAULT_EXCLUDED_ENV_VARS;
438
+ const isProjectEnvFile = !envFilePath.includes(CELL_DIR);
224
439
  for (const key in parsedEnv) {
225
440
  if (Object.hasOwn(parsedEnv, key)) {
226
441
  // If it's a project .env file, skip loading excluded variables.
@@ -245,10 +460,13 @@ export function loadEnvironment(settings) {
245
460
  */
246
461
  export function loadSettings(workspaceDir) {
247
462
  let systemSettings = {};
463
+ let systemDefaultSettings = {};
248
464
  let userSettings = {};
249
465
  let workspaceSettings = {};
250
466
  const settingsErrors = [];
251
467
  const systemSettingsPath = getSystemSettingsPath();
468
+ const systemDefaultsPath = getSystemDefaultsPath();
469
+ const migratedInMemorScopes = new Set();
252
470
  // Resolve paths to their canonical representation to handle symlinks
253
471
  const resolvedWorkspaceDir = path.resolve(workspaceDir);
254
472
  const resolvedHomeDir = path.resolve(homedir());
@@ -262,7 +480,7 @@ export function loadSettings(workspaceDir) {
262
480
  }
263
481
  // We expect homedir to always exist and be resolvable.
264
482
  const realHomeDir = fs.realpathSync(resolvedHomeDir);
265
- const workspaceSettingsPath = getWorkspaceSettingsPath(workspaceDir);
483
+ const workspaceSettingsPath = new Storage(workspaceDir).getWorkspaceSettingsPath();
266
484
  // Load system settings
267
485
  try {
268
486
  if (fs.existsSync(systemSettingsPath)) {
@@ -281,13 +499,6 @@ export function loadSettings(workspaceDir) {
281
499
  if (fs.existsSync(USER_SETTINGS_PATH)) {
282
500
  const userContent = fs.readFileSync(USER_SETTINGS_PATH, 'utf-8');
283
501
  userSettings = JSON.parse(stripJsonComments(userContent));
284
- // Support legacy theme names
285
- if (userSettings.theme && userSettings.theme === 'VS') {
286
- userSettings.theme = DefaultLight.name;
287
- }
288
- else if (userSettings.theme && userSettings.theme === 'VS2015') {
289
- userSettings.theme = DefaultDark.name;
290
- }
291
502
  }
292
503
  }
293
504
  catch (error) {
@@ -300,7 +511,7 @@ export function loadSettings(workspaceDir) {
300
511
  const defaultMcpServerConfig = {
301
512
  Cell: {
302
513
  url: 'https://api.machina.ai/mcp/v1/cell/sse',
303
- timeout: 5000,
514
+ timeout: 10000,
304
515
  },
305
516
  };
306
517
  let settingsModified = false;
@@ -318,33 +529,79 @@ export function loadSettings(workspaceDir) {
318
529
  settings: userSettings,
319
530
  });
320
531
  }
532
+ /*
321
533
  // Load YAML config and merge
322
534
  const yamlSettings = loadYamlConfig();
323
535
  userSettings = { ...userSettings, ...yamlSettings };
324
- if (realWorkspaceDir !== realHomeDir) {
325
- // Load workspace settings
536
+ */
537
+ const loadAndMigrate = (filePath, scope) => {
326
538
  try {
327
- if (fs.existsSync(workspaceSettingsPath)) {
328
- const projectContent = fs.readFileSync(workspaceSettingsPath, 'utf-8');
329
- workspaceSettings = JSON.parse(stripJsonComments(projectContent));
330
- if (workspaceSettings.theme && workspaceSettings.theme === 'VS') {
331
- workspaceSettings.theme = DefaultLight.name;
539
+ if (fs.existsSync(filePath)) {
540
+ const content = fs.readFileSync(filePath, 'utf-8');
541
+ const rawSettings = JSON.parse(stripJsonComments(content));
542
+ if (typeof rawSettings !== 'object' ||
543
+ rawSettings === null ||
544
+ Array.isArray(rawSettings)) {
545
+ settingsErrors.push({
546
+ message: 'Settings file is not a valid JSON object.',
547
+ path: filePath,
548
+ });
549
+ return {};
332
550
  }
333
- else if (workspaceSettings.theme &&
334
- workspaceSettings.theme === 'VS2015') {
335
- workspaceSettings.theme = DefaultDark.name;
551
+ let settingsObject = rawSettings;
552
+ if (needsMigration(settingsObject)) {
553
+ const migratedSettings = migrateSettingsToV2(settingsObject);
554
+ if (migratedSettings) {
555
+ if (MIGRATE_V2_OVERWRITE) {
556
+ try {
557
+ fs.renameSync(filePath, `${filePath}.orig`);
558
+ fs.writeFileSync(filePath, JSON.stringify(migratedSettings, null, 2), 'utf-8');
559
+ }
560
+ catch (e) {
561
+ console.error(`Error migrating settings file on disk: ${getErrorMessage(e)}`);
562
+ }
563
+ }
564
+ else {
565
+ migratedInMemorScopes.add(scope);
566
+ }
567
+ settingsObject = migratedSettings;
568
+ }
336
569
  }
570
+ return settingsObject;
337
571
  }
338
572
  }
339
573
  catch (error) {
340
574
  settingsErrors.push({
341
575
  message: getErrorMessage(error),
342
- path: workspaceSettingsPath,
576
+ path: filePath,
343
577
  });
344
578
  }
579
+ return {};
580
+ };
581
+ systemSettings = loadAndMigrate(systemSettingsPath, SettingScope.System);
582
+ systemDefaultSettings = loadAndMigrate(systemDefaultsPath, SettingScope.SystemDefaults);
583
+ userSettings = loadAndMigrate(USER_SETTINGS_PATH, SettingScope.User);
584
+ if (realWorkspaceDir !== realHomeDir) {
585
+ workspaceSettings = loadAndMigrate(workspaceSettingsPath, SettingScope.Workspace);
345
586
  }
587
+ // Support legacy theme names
588
+ if (userSettings.ui?.theme === 'VS') {
589
+ userSettings.ui.theme = DefaultLight.name;
590
+ }
591
+ else if (userSettings.ui?.theme === 'VS2015') {
592
+ userSettings.ui.theme = DefaultDark.name;
593
+ }
594
+ if (workspaceSettings.ui?.theme === 'VS') {
595
+ workspaceSettings.ui.theme = DefaultLight.name;
596
+ }
597
+ else if (workspaceSettings.ui?.theme === 'VS2015') {
598
+ workspaceSettings.ui.theme = DefaultDark.name;
599
+ }
600
+ // For the initial trust check, we can only use user and system settings.
601
+ const initialTrustCheckSettings = mergeWith({}, systemSettings, userSettings);
602
+ const isTrusted = isWorkspaceTrusted(initialTrustCheckSettings) ?? true;
346
603
  // Create a temporary merged settings object to pass to loadEnvironment.
347
- const tempMergedSettings = mergeSettings(systemSettings, userSettings, workspaceSettings);
604
+ const tempMergedSettings = mergeSettings(systemSettings, systemDefaultSettings, userSettings, workspaceSettings, isTrusted);
348
605
  // loadEnviroment depends on settings so we have to create a temp version of
349
606
  // the settings to avoid a cycle
350
607
  loadEnvironment(tempMergedSettings);
@@ -356,21 +613,16 @@ export function loadSettings(workspaceDir) {
356
613
  const loadedSettings = new LoadedSettings({
357
614
  path: systemSettingsPath,
358
615
  settings: systemSettings,
616
+ }, {
617
+ path: systemDefaultsPath,
618
+ settings: systemDefaultSettings,
359
619
  }, {
360
620
  path: USER_SETTINGS_PATH,
361
621
  settings: userSettings,
362
622
  }, {
363
623
  path: workspaceSettingsPath,
364
624
  settings: workspaceSettings,
365
- }, settingsErrors);
366
- // Validate chatCompression settings
367
- const chatCompression = loadedSettings.merged.chatCompression;
368
- const threshold = chatCompression?.contextPercentageThreshold;
369
- if (threshold != null &&
370
- (typeof threshold !== 'number' || threshold < 0 || threshold > 1)) {
371
- console.warn(`Invalid value for chatCompression.contextPercentageThreshold: "${threshold}". Please use a value between 0 and 1. Using default compression settings.`);
372
- delete loadedSettings.merged.chatCompression;
373
- }
625
+ }, settingsErrors, isTrusted, migratedInMemorScopes);
374
626
  return loadedSettings;
375
627
  }
376
628
  export function saveSettings(settingsFile) {
@@ -380,7 +632,11 @@ export function saveSettings(settingsFile) {
380
632
  if (!fs.existsSync(dirPath)) {
381
633
  fs.mkdirSync(dirPath, { recursive: true });
382
634
  }
383
- fs.writeFileSync(settingsFile.path, JSON.stringify(settingsFile.settings, null, 2), 'utf-8');
635
+ let settingsToSave = settingsFile.settings;
636
+ if (!MIGRATE_V2_OVERWRITE) {
637
+ settingsToSave = migrateSettingsToV1(settingsToSave);
638
+ }
639
+ fs.writeFileSync(settingsFile.path, JSON.stringify(settingsToSave, null, 2), 'utf-8');
384
640
  }
385
641
  catch (error) {
386
642
  console.error('Error saving user settings file:', error);