@google/gemini-cli 0.3.0-nightly.20250822.15c62bad → 0.3.0-preview.1

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