@google/gemini-cli 0.32.0-preview.0 → 0.33.0-preview.0

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 (239) hide show
  1. package/README.md +11 -9
  2. package/dist/package.json +3 -3
  3. package/dist/src/config/config.js +6 -1
  4. package/dist/src/config/config.js.map +1 -1
  5. package/dist/src/config/config.test.js +70 -1
  6. package/dist/src/config/config.test.js.map +1 -1
  7. package/dist/src/config/extension-manager.js +1 -0
  8. package/dist/src/config/extension-manager.js.map +1 -1
  9. package/dist/src/config/extension.d.ts +9 -0
  10. package/dist/src/config/extension.js.map +1 -1
  11. package/dist/src/config/sandboxConfig.js +3 -1
  12. package/dist/src/config/sandboxConfig.js.map +1 -1
  13. package/dist/src/config/settings.d.ts +0 -2
  14. package/dist/src/config/settings.js.map +1 -1
  15. package/dist/src/config/settingsSchema.d.ts +9 -13
  16. package/dist/src/config/settingsSchema.js +5 -13
  17. package/dist/src/config/settingsSchema.js.map +1 -1
  18. package/dist/src/gemini.js +1 -1
  19. package/dist/src/gemini.js.map +1 -1
  20. package/dist/src/generated/git-commit.d.ts +2 -2
  21. package/dist/src/generated/git-commit.js +2 -2
  22. package/dist/src/test-utils/render.js +5 -1
  23. package/dist/src/test-utils/render.js.map +1 -1
  24. package/dist/src/ui/AppContainer.js +1 -18
  25. package/dist/src/ui/AppContainer.js.map +1 -1
  26. package/dist/src/ui/commands/extensionsCommand.js +3 -1
  27. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  28. package/dist/src/ui/commands/extensionsCommand.test.js +45 -0
  29. package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
  30. package/dist/src/ui/commands/hooksCommand.js +12 -8
  31. package/dist/src/ui/commands/hooksCommand.js.map +1 -1
  32. package/dist/src/ui/commands/hooksCommand.test.js +15 -23
  33. package/dist/src/ui/commands/hooksCommand.test.js.map +1 -1
  34. package/dist/src/ui/commands/planCommand.js +33 -3
  35. package/dist/src/ui/commands/planCommand.js.map +1 -1
  36. package/dist/src/ui/commands/planCommand.test.js +29 -1
  37. package/dist/src/ui/commands/planCommand.test.js.map +1 -1
  38. package/dist/src/ui/components/AgentConfigDialog.js +17 -33
  39. package/dist/src/ui/components/AgentConfigDialog.js.map +1 -1
  40. package/dist/src/ui/components/AppHeader.d.ts +1 -1
  41. package/dist/src/ui/components/AppHeader.js +15 -8
  42. package/dist/src/ui/components/AppHeader.js.map +1 -1
  43. package/dist/src/ui/components/AppHeader.test.js +7 -0
  44. package/dist/src/ui/components/AppHeader.test.js.map +1 -1
  45. package/dist/src/ui/components/ContextUsageDisplay.d.ts +1 -1
  46. package/dist/src/ui/components/ContextUsageDisplay.js +15 -3
  47. package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -1
  48. package/dist/src/ui/components/ContextUsageDisplay.test.js +25 -19
  49. package/dist/src/ui/components/ContextUsageDisplay.test.js.map +1 -1
  50. package/dist/src/ui/components/DetailedMessagesDisplay.js +1 -6
  51. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  52. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +2 -2
  53. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +1 -1
  54. package/dist/src/ui/components/DialogManager.js +3 -19
  55. package/dist/src/ui/components/DialogManager.js.map +1 -1
  56. package/dist/src/ui/components/ExitPlanModeDialog.js +2 -1
  57. package/dist/src/ui/components/ExitPlanModeDialog.js.map +1 -1
  58. package/dist/src/ui/components/ExitPlanModeDialog.test.js +2 -13
  59. package/dist/src/ui/components/ExitPlanModeDialog.test.js.map +1 -1
  60. package/dist/src/ui/components/Footer.js +3 -1
  61. package/dist/src/ui/components/Footer.js.map +1 -1
  62. package/dist/src/ui/components/Footer.test.js +41 -6
  63. package/dist/src/ui/components/Footer.test.js.map +1 -1
  64. package/dist/src/ui/components/HistoryItemDisplay.js +2 -3
  65. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  66. package/dist/src/ui/components/HooksDialog.d.ts +36 -0
  67. package/dist/src/ui/components/HooksDialog.js +81 -0
  68. package/dist/src/ui/components/HooksDialog.js.map +1 -0
  69. package/dist/src/ui/components/HooksDialog.test.js +187 -0
  70. package/dist/src/ui/components/HooksDialog.test.js.map +1 -0
  71. package/dist/src/ui/components/MainContent.js +2 -1
  72. package/dist/src/ui/components/MainContent.js.map +1 -1
  73. package/dist/src/ui/components/SettingsDialog.d.ts +1 -5
  74. package/dist/src/ui/components/SettingsDialog.js +90 -254
  75. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  76. package/dist/src/ui/components/SettingsDialog.test.js +127 -105
  77. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  78. package/dist/src/ui/components/StatusDisplay.test.js +5 -4
  79. package/dist/src/ui/components/StatusDisplay.test.js.map +1 -1
  80. package/dist/src/ui/components/Tips.d.ts +1 -1
  81. package/dist/src/ui/components/Tips.js +1 -1
  82. package/dist/src/ui/components/Tips.js.map +1 -1
  83. package/dist/src/ui/components/Tips.test.d.ts +1 -1
  84. package/dist/src/ui/components/Tips.test.js +6 -7
  85. package/dist/src/ui/components/Tips.test.js.map +1 -1
  86. package/dist/src/ui/components/UserIdentity.d.ts +1 -1
  87. package/dist/src/ui/components/UserIdentity.js +10 -12
  88. package/dist/src/ui/components/UserIdentity.js.map +1 -1
  89. package/dist/src/ui/components/UserIdentity.test.js +23 -10
  90. package/dist/src/ui/components/UserIdentity.test.js.map +1 -1
  91. package/dist/src/ui/components/messages/InfoMessage.d.ts +1 -0
  92. package/dist/src/ui/components/messages/InfoMessage.js +2 -2
  93. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
  94. package/dist/src/ui/components/messages/SubagentProgressDisplay.d.ts +11 -0
  95. package/dist/src/ui/components/messages/SubagentProgressDisplay.js +73 -0
  96. package/dist/src/ui/components/messages/SubagentProgressDisplay.js.map +1 -0
  97. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.d.ts +6 -0
  98. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.js +158 -0
  99. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.js.map +1 -0
  100. package/dist/src/ui/components/messages/ToolGroupMessage.js +1 -0
  101. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  102. package/dist/src/ui/components/messages/ToolResultDisplay.js +5 -0
  103. package/dist/src/ui/components/messages/ToolResultDisplay.js.map +1 -1
  104. package/dist/src/ui/components/shared/BaseSettingsDialog.d.ts +5 -2
  105. package/dist/src/ui/components/shared/BaseSettingsDialog.js +3 -2
  106. package/dist/src/ui/components/shared/BaseSettingsDialog.js.map +1 -1
  107. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js +24 -0
  108. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js.map +1 -1
  109. package/dist/src/ui/components/views/ExtensionRegistryView.d.ts +1 -2
  110. package/dist/src/ui/constants/tips.js +1 -1
  111. package/dist/src/ui/constants/tips.js.map +1 -1
  112. package/dist/src/ui/constants.d.ts +4 -0
  113. package/dist/src/ui/constants.js +4 -0
  114. package/dist/src/ui/constants.js.map +1 -1
  115. package/dist/src/ui/contexts/SettingsContext.js +2 -1
  116. package/dist/src/ui/contexts/SettingsContext.js.map +1 -1
  117. package/dist/src/ui/contexts/UIStateContext.d.ts +0 -2
  118. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  119. package/dist/src/ui/contexts/VimModeContext.d.ts +1 -3
  120. package/dist/src/ui/contexts/VimModeContext.js +7 -16
  121. package/dist/src/ui/contexts/VimModeContext.js.map +1 -1
  122. package/dist/src/ui/hooks/toolMapping.js +1 -0
  123. package/dist/src/ui/hooks/toolMapping.js.map +1 -1
  124. package/dist/src/ui/hooks/useGeminiStream.js +16 -13
  125. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  126. package/dist/src/ui/hooks/useGeminiStream.test.js +31 -2
  127. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  128. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
  129. package/dist/src/ui/hooks/useLoadingIndicator.js +1 -1
  130. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  131. package/dist/src/ui/hooks/useTerminalTheme.js +6 -3
  132. package/dist/src/ui/hooks/useTerminalTheme.js.map +1 -1
  133. package/dist/src/ui/hooks/useTerminalTheme.test.js +19 -0
  134. package/dist/src/ui/hooks/useTerminalTheme.test.js.map +1 -1
  135. package/dist/src/ui/hooks/useToolScheduler.js +26 -12
  136. package/dist/src/ui/hooks/useToolScheduler.js.map +1 -1
  137. package/dist/src/ui/hooks/useToolScheduler.test.js +101 -8
  138. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  139. package/dist/src/ui/themes/theme-manager.d.ts +26 -4
  140. package/dist/src/ui/themes/theme-manager.js +40 -7
  141. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  142. package/dist/src/ui/themes/theme-manager.test.js +2 -1
  143. package/dist/src/ui/themes/theme-manager.test.js.map +1 -1
  144. package/dist/src/ui/types.d.ts +3 -17
  145. package/dist/src/ui/types.js +0 -1
  146. package/dist/src/ui/types.js.map +1 -1
  147. package/dist/src/ui/utils/commandUtils.d.ts +6 -2
  148. package/dist/src/ui/utils/commandUtils.js +12 -5
  149. package/dist/src/ui/utils/commandUtils.js.map +1 -1
  150. package/dist/src/ui/utils/commandUtils.test.js +21 -7
  151. package/dist/src/ui/utils/commandUtils.test.js.map +1 -1
  152. package/dist/src/utils/agentSettings.d.ts +3 -11
  153. package/dist/src/utils/agentSettings.js +23 -81
  154. package/dist/src/utils/agentSettings.js.map +1 -1
  155. package/dist/src/{ui/components/SessionRetentionWarningDialog.test.d.ts → utils/agentSettings.test.d.ts} +0 -2
  156. package/dist/src/utils/agentSettings.test.js +111 -0
  157. package/dist/src/utils/agentSettings.test.js.map +1 -0
  158. package/dist/src/utils/dialogScopeUtils.d.ts +6 -2
  159. package/dist/src/utils/dialogScopeUtils.js +3 -3
  160. package/dist/src/utils/dialogScopeUtils.js.map +1 -1
  161. package/dist/src/utils/dialogScopeUtils.test.js +5 -5
  162. package/dist/src/utils/dialogScopeUtils.test.js.map +1 -1
  163. package/dist/src/utils/featureToggleUtils.d.ts +55 -0
  164. package/dist/src/utils/featureToggleUtils.js +95 -0
  165. package/dist/src/utils/featureToggleUtils.js.map +1 -0
  166. package/dist/src/utils/featureToggleUtils.test.d.ts +6 -0
  167. package/dist/src/utils/featureToggleUtils.test.js +126 -0
  168. package/dist/src/utils/featureToggleUtils.test.js.map +1 -0
  169. package/dist/src/utils/handleAutoUpdate.d.ts +7 -0
  170. package/dist/src/utils/handleAutoUpdate.js +41 -0
  171. package/dist/src/utils/handleAutoUpdate.js.map +1 -1
  172. package/dist/src/utils/handleAutoUpdate.test.js +52 -1
  173. package/dist/src/utils/handleAutoUpdate.test.js.map +1 -1
  174. package/dist/src/utils/processUtils.js +2 -0
  175. package/dist/src/utils/processUtils.js.map +1 -1
  176. package/dist/src/utils/processUtils.test.js +7 -1
  177. package/dist/src/utils/processUtils.test.js.map +1 -1
  178. package/dist/src/utils/sessionCleanup.js +8 -0
  179. package/dist/src/utils/sessionCleanup.js.map +1 -1
  180. package/dist/src/utils/sessionCleanup.test.js +19 -0
  181. package/dist/src/utils/sessionCleanup.test.js.map +1 -1
  182. package/dist/src/utils/settingsUtils.d.ts +18 -91
  183. package/dist/src/utils/settingsUtils.js +127 -207
  184. package/dist/src/utils/settingsUtils.js.map +1 -1
  185. package/dist/src/utils/settingsUtils.test.js +78 -264
  186. package/dist/src/utils/settingsUtils.test.js.map +1 -1
  187. package/dist/src/utils/skillSettings.d.ts +4 -14
  188. package/dist/src/utils/skillSettings.js +32 -81
  189. package/dist/src/utils/skillSettings.js.map +1 -1
  190. package/dist/src/utils/skillSettings.test.d.ts +6 -0
  191. package/dist/src/utils/skillSettings.test.js +142 -0
  192. package/dist/src/utils/skillSettings.test.js.map +1 -0
  193. package/dist/src/zed-integration/acpResume.test.js +8 -0
  194. package/dist/src/zed-integration/acpResume.test.js.map +1 -1
  195. package/dist/src/zed-integration/commandHandler.d.ts +26 -0
  196. package/dist/src/zed-integration/commandHandler.js +102 -0
  197. package/dist/src/zed-integration/commandHandler.js.map +1 -0
  198. package/dist/src/zed-integration/commandHandler.test.d.ts +6 -0
  199. package/dist/src/zed-integration/commandHandler.test.js +25 -0
  200. package/dist/src/zed-integration/commandHandler.test.js.map +1 -0
  201. package/dist/src/zed-integration/commands/commandRegistry.d.ts +12 -0
  202. package/dist/src/zed-integration/commands/commandRegistry.js +26 -0
  203. package/dist/src/zed-integration/commands/commandRegistry.js.map +1 -0
  204. package/dist/src/zed-integration/commands/extensions.d.ts +57 -0
  205. package/dist/src/zed-integration/commands/extensions.js +320 -0
  206. package/dist/src/zed-integration/commands/extensions.js.map +1 -0
  207. package/dist/src/zed-integration/commands/init.d.ts +12 -0
  208. package/dist/src/zed-integration/commands/init.js +47 -0
  209. package/dist/src/zed-integration/commands/init.js.map +1 -0
  210. package/dist/src/zed-integration/commands/memory.d.ts +34 -0
  211. package/dist/src/zed-integration/commands/memory.js +83 -0
  212. package/dist/src/zed-integration/commands/memory.js.map +1 -0
  213. package/dist/src/zed-integration/commands/restore.d.ts +18 -0
  214. package/dist/src/zed-integration/commands/restore.js +140 -0
  215. package/dist/src/zed-integration/commands/restore.js.map +1 -0
  216. package/dist/src/zed-integration/commands/types.d.ts +31 -0
  217. package/dist/src/zed-integration/commands/types.js +7 -0
  218. package/dist/src/zed-integration/commands/types.js.map +1 -0
  219. package/dist/src/zed-integration/zedIntegration.d.ts +9 -2
  220. package/dist/src/zed-integration/zedIntegration.js +170 -8
  221. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  222. package/dist/src/zed-integration/zedIntegration.test.js +329 -2
  223. package/dist/src/zed-integration/zedIntegration.test.js.map +1 -1
  224. package/dist/tsconfig.tsbuildinfo +1 -1
  225. package/package.json +4 -4
  226. package/dist/src/ui/components/SessionRetentionWarningDialog.d.ts +0 -12
  227. package/dist/src/ui/components/SessionRetentionWarningDialog.js +0 -27
  228. package/dist/src/ui/components/SessionRetentionWarningDialog.js.map +0 -1
  229. package/dist/src/ui/components/SessionRetentionWarningDialog.test.js +0 -72
  230. package/dist/src/ui/components/SessionRetentionWarningDialog.test.js.map +0 -1
  231. package/dist/src/ui/components/views/HooksList.d.ts +0 -24
  232. package/dist/src/ui/components/views/HooksList.js +0 -28
  233. package/dist/src/ui/components/views/HooksList.js.map +0 -1
  234. package/dist/src/ui/hooks/useSessionRetentionCheck.d.ts +0 -12
  235. package/dist/src/ui/hooks/useSessionRetentionCheck.js +0 -57
  236. package/dist/src/ui/hooks/useSessionRetentionCheck.js.map +0 -1
  237. package/dist/src/ui/hooks/useSessionRetentionCheck.test.js +0 -169
  238. package/dist/src/ui/hooks/useSessionRetentionCheck.test.js.map +0 -1
  239. /package/dist/src/ui/{hooks/useSessionRetentionCheck.test.d.ts → components/HooksDialog.test.d.ts} +0 -0
@@ -0,0 +1,140 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { getCheckpointInfoList, getToolCallDataSchema, isNodeError, performRestore, } from '@google/gemini-cli-core';
7
+ import * as fs from 'node:fs/promises';
8
+ import * as path from 'node:path';
9
+ export class RestoreCommand {
10
+ name = 'restore';
11
+ description = 'Restore to a previous checkpoint, or list available checkpoints to restore. This will reset the conversation and file history to the state it was in when the checkpoint was created';
12
+ requiresWorkspace = true;
13
+ subCommands = [new ListCheckpointsCommand()];
14
+ async execute(context, args) {
15
+ const { config, git: gitService } = context;
16
+ const argsStr = args.join(' ');
17
+ try {
18
+ if (!argsStr) {
19
+ return await new ListCheckpointsCommand().execute(context);
20
+ }
21
+ if (!config.getCheckpointingEnabled()) {
22
+ return {
23
+ name: this.name,
24
+ data: 'Checkpointing is not enabled. Please enable it in your settings (`general.checkpointing.enabled: true`) to use /restore.',
25
+ };
26
+ }
27
+ const selectedFile = argsStr.endsWith('.json')
28
+ ? argsStr
29
+ : `${argsStr}.json`;
30
+ const checkpointDir = config.storage.getProjectTempCheckpointsDir();
31
+ const filePath = path.join(checkpointDir, selectedFile);
32
+ let data;
33
+ try {
34
+ data = await fs.readFile(filePath, 'utf-8');
35
+ }
36
+ catch (error) {
37
+ if (isNodeError(error) && error.code === 'ENOENT') {
38
+ return {
39
+ name: this.name,
40
+ data: `File not found: ${selectedFile}`,
41
+ };
42
+ }
43
+ throw error;
44
+ }
45
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
46
+ const toolCallData = JSON.parse(data);
47
+ const ToolCallDataSchema = getToolCallDataSchema();
48
+ const parseResult = ToolCallDataSchema.safeParse(toolCallData);
49
+ if (!parseResult.success) {
50
+ return {
51
+ name: this.name,
52
+ data: 'Checkpoint file is invalid or corrupted.',
53
+ };
54
+ }
55
+ const restoreResultGenerator = performRestore(parseResult.data, gitService);
56
+ const restoreResult = [];
57
+ for await (const result of restoreResultGenerator) {
58
+ restoreResult.push(result);
59
+ }
60
+ // Format the result nicely since Zed just dumps data
61
+ const formattedResult = restoreResult
62
+ .map((r) => {
63
+ if (r.type === 'message') {
64
+ return `[${r.messageType.toUpperCase()}] ${r.content}`;
65
+ }
66
+ else if (r.type === 'load_history') {
67
+ return `Loaded history with ${r.clientHistory.length} messages.`;
68
+ }
69
+ return `Restored: ${JSON.stringify(r)}`;
70
+ })
71
+ .join('\n');
72
+ return {
73
+ name: this.name,
74
+ data: formattedResult,
75
+ };
76
+ }
77
+ catch (error) {
78
+ return {
79
+ name: this.name,
80
+ data: `An unexpected error occurred during restore: ${error}`,
81
+ };
82
+ }
83
+ }
84
+ }
85
+ export class ListCheckpointsCommand {
86
+ name = 'restore list';
87
+ description = 'Lists all available checkpoints.';
88
+ async execute(context) {
89
+ const { config } = context;
90
+ try {
91
+ if (!config.getCheckpointingEnabled()) {
92
+ return {
93
+ name: this.name,
94
+ data: 'Checkpointing is not enabled. Please enable it in your settings (`general.checkpointing.enabled: true`) to use /restore.',
95
+ };
96
+ }
97
+ const checkpointDir = config.storage.getProjectTempCheckpointsDir();
98
+ try {
99
+ await fs.mkdir(checkpointDir, { recursive: true });
100
+ }
101
+ catch (_e) {
102
+ // Ignore
103
+ }
104
+ const files = await fs.readdir(checkpointDir);
105
+ const jsonFiles = files.filter((file) => file.endsWith('.json'));
106
+ if (jsonFiles.length === 0) {
107
+ return { name: this.name, data: 'No checkpoints found.' };
108
+ }
109
+ const checkpointFiles = new Map();
110
+ for (const file of jsonFiles) {
111
+ const filePath = path.join(checkpointDir, file);
112
+ const data = await fs.readFile(filePath, 'utf-8');
113
+ checkpointFiles.set(file, data);
114
+ }
115
+ const checkpointInfoList = getCheckpointInfoList(checkpointFiles);
116
+ const formatted = checkpointInfoList
117
+ .map((info) => {
118
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
119
+ const i = info;
120
+ const fileName = String(i['fileName'] || 'Unknown');
121
+ const toolName = String(i['toolName'] || 'Unknown');
122
+ const status = String(i['status'] || 'Unknown');
123
+ const timestamp = new Date(Number(i['timestamp']) || 0).toLocaleString();
124
+ return `- **${fileName}**: ${toolName} (Status: ${status}) [${timestamp}]`;
125
+ })
126
+ .join('\n');
127
+ return {
128
+ name: this.name,
129
+ data: `Available Checkpoints:\n${formatted}`,
130
+ };
131
+ }
132
+ catch (_error) {
133
+ return {
134
+ name: this.name,
135
+ data: 'An unexpected error occurred while listing checkpoints.',
136
+ };
137
+ }
138
+ }
139
+ }
140
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../../../src/zed-integration/commands/restore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,EACX,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAOlC,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAClB,sLAAsL,CAAC;IAChL,iBAAiB,GAAG,IAAI,CAAC;IACzB,WAAW,GAAG,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;IAEtD,KAAK,CAAC,OAAO,CACX,OAAuB,EACvB,IAAc;QAEd,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE/B,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,MAAM,IAAI,sBAAsB,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7D,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,EAAE,CAAC;gBACtC,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,0HAA0H;iBACjI,CAAC;YACJ,CAAC;YAED,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC5C,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,GAAG,OAAO,OAAO,CAAC;YAEtB,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC;YACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;YAExD,IAAI,IAAY,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAClD,OAAO;wBACL,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,IAAI,EAAE,mBAAmB,YAAY,EAAE;qBACxC,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YAED,mEAAmE;YACnE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,CAAC;YACnD,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAE/D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,0CAA0C;iBACjD,CAAC;YACJ,CAAC;YAED,MAAM,sBAAsB,GAAG,cAAc,CAC3C,WAAW,CAAC,IAAI,EAChB,UAAU,CACX,CAAC;YAEF,MAAM,aAAa,GAAG,EAAE,CAAC;YACzB,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,sBAAsB,EAAE,CAAC;gBAClD,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;YAED,qDAAqD;YACrD,MAAM,eAAe,GAAG,aAAa;iBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;gBACzD,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBACrC,OAAO,uBAAuB,CAAC,CAAC,aAAa,CAAC,MAAM,YAAY,CAAC;gBACnE,CAAC;gBACD,OAAO,aAAa,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,eAAe;aACtB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,gDAAgD,KAAK,EAAE;aAC9D,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,sBAAsB;IACxB,IAAI,GAAG,cAAc,CAAC;IACtB,WAAW,GAAG,kCAAkC,CAAC;IAE1D,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAE3B,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,EAAE,CAAC;gBACtC,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,0HAA0H;iBACjI,CAAC;YACJ,CAAC;YAED,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC;YACpE,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAEjE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;YAC5D,CAAC;YAED,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;YAClD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;gBAChD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC;YAED,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;YAElE,MAAM,SAAS,GAAG,kBAAkB;iBACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,8DAA8D;gBAC9D,MAAM,CAAC,GAAG,IAA2B,CAAC;gBACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,CAAC;gBACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC;gBAChD,MAAM,SAAS,GAAG,IAAI,IAAI,CACxB,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAC5B,CAAC,cAAc,EAAE,CAAC;gBAEnB,OAAO,OAAO,QAAQ,OAAO,QAAQ,aAAa,MAAM,MAAM,SAAS,GAAG,CAAC;YAC7E,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,2BAA2B,SAAS,EAAE;aAC7C,CAAC;QACJ,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,yDAAyD;aAChE,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { Config, GitService } from '@google/gemini-cli-core';
7
+ import type { LoadedSettings } from '../../config/settings.js';
8
+ export interface CommandContext {
9
+ config: Config;
10
+ settings: LoadedSettings;
11
+ git?: GitService;
12
+ sendMessage: (text: string) => Promise<void>;
13
+ }
14
+ export interface CommandArgument {
15
+ readonly name: string;
16
+ readonly description: string;
17
+ readonly isRequired?: boolean;
18
+ }
19
+ export interface Command {
20
+ readonly name: string;
21
+ readonly aliases?: string[];
22
+ readonly description: string;
23
+ readonly arguments?: CommandArgument[];
24
+ readonly subCommands?: Command[];
25
+ readonly requiresWorkspace?: boolean;
26
+ execute(context: CommandContext, args: string[]): Promise<CommandExecutionResponse>;
27
+ }
28
+ export interface CommandExecutionResponse {
29
+ readonly name: string;
30
+ readonly data: unknown;
31
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/zed-integration/commands/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -3,7 +3,7 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import type { Config, GeminiChat, ConversationRecord } from '@google/gemini-cli-core';
6
+ import { type Config, type GeminiChat, type ConversationRecord } from '@google/gemini-cli-core';
7
7
  import * as acp from '@agentclientprotocol/sdk';
8
8
  import type { LoadedSettings } from '../config/settings.js';
9
9
  import type { CliArgs } from '../config/config.js';
@@ -26,6 +26,7 @@ export declare class GeminiAgent {
26
26
  cancel(params: acp.CancelNotification): Promise<void>;
27
27
  prompt(params: acp.PromptRequest): Promise<acp.PromptResponse>;
28
28
  setSessionMode(params: acp.SetSessionModeRequest): Promise<acp.SetSessionModeResponse>;
29
+ unstable_setSessionModel(params: acp.SetSessionModelRequest): Promise<acp.SetSessionModelResponse>;
29
30
  }
30
31
  export declare class Session {
31
32
  #private;
@@ -33,12 +34,18 @@ export declare class Session {
33
34
  private readonly chat;
34
35
  private readonly config;
35
36
  private readonly connection;
37
+ private readonly settings;
36
38
  private pendingPrompt;
37
- constructor(id: string, chat: GeminiChat, config: Config, connection: acp.AgentSideConnection);
39
+ private commandHandler;
40
+ constructor(id: string, chat: GeminiChat, config: Config, connection: acp.AgentSideConnection, settings: LoadedSettings);
38
41
  cancelPendingPrompt(): Promise<void>;
39
42
  setMode(modeId: acp.SessionModeId): acp.SetSessionModeResponse;
43
+ private getAvailableCommands;
44
+ sendAvailableCommands(): Promise<void>;
45
+ setModel(modelId: acp.ModelId): acp.SetSessionModelResponse;
40
46
  streamHistory(messages: ConversationRecord['messages']): Promise<void>;
41
47
  prompt(params: acp.PromptRequest): Promise<acp.PromptResponse>;
48
+ private handleCommand;
42
49
  private sendUpdate;
43
50
  private runTool;
44
51
  debug(msg: string): void;
@@ -3,7 +3,7 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { CoreToolCallStatus, AuthType, logToolCall, convertToFunctionResponse, ToolConfirmationOutcome, clearCachedCredentialFile, isNodeError, getErrorMessage, isWithinRoot, getErrorStatus, MCPServerConfig, DiscoveredMCPTool, StreamEventType, ToolCallEvent, debugLogger, ReadManyFilesTool, REFERENCE_CONTENT_START, resolveModel, createWorkingStdio, startupProfiler, Kind, partListUnionToString, LlmRole, ApprovalMode, getVersion, convertSessionToClientHistory, } from '@google/gemini-cli-core';
6
+ import { CoreToolCallStatus, AuthType, logToolCall, convertToFunctionResponse, ToolConfirmationOutcome, clearCachedCredentialFile, isNodeError, getErrorMessage, isWithinRoot, getErrorStatus, MCPServerConfig, DiscoveredMCPTool, StreamEventType, ToolCallEvent, debugLogger, ReadManyFilesTool, REFERENCE_CONTENT_START, resolveModel, createWorkingStdio, startupProfiler, Kind, partListUnionToString, LlmRole, ApprovalMode, getVersion, convertSessionToClientHistory, DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_FLASH_LITE_MODEL, PREVIEW_GEMINI_MODEL, PREVIEW_GEMINI_3_1_MODEL, PREVIEW_GEMINI_3_1_CUSTOM_TOOLS_MODEL, PREVIEW_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_MODEL_AUTO, PREVIEW_GEMINI_MODEL_AUTO, getDisplayString, } from '@google/gemini-cli-core';
7
7
  import * as acp from '@agentclientprotocol/sdk';
8
8
  import { AcpFileSystemService } from './fileSystemService.js';
9
9
  import { getAcpErrorMessage } from './acpErrors.js';
@@ -19,7 +19,9 @@ import { randomUUID } from 'node:crypto';
19
19
  import { loadCliConfig } from '../config/config.js';
20
20
  import { runExitCleanup } from '../utils/cleanup.js';
21
21
  import { SessionSelector } from '../utils/sessionUtils.js';
22
+ import { CommandHandler } from './commandHandler.js';
22
23
  export async function runZedIntegration(config, settings, argv) {
24
+ // ... (skip unchanged lines) ...
23
25
  const { stdout: workingStdout } = createWorkingStdio();
24
26
  const stdout = Writable.toWeb(workingStdout);
25
27
  // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
@@ -152,15 +154,25 @@ export class GeminiAgent {
152
154
  startupProfiler.flush(config);
153
155
  const geminiClient = config.getGeminiClient();
154
156
  const chat = await geminiClient.startChat();
155
- const session = new Session(sessionId, chat, config, this.connection);
157
+ const session = new Session(sessionId, chat, config, this.connection, this.settings);
156
158
  this.sessions.set(sessionId, session);
157
- return {
159
+ setTimeout(() => {
160
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
161
+ session.sendAvailableCommands();
162
+ }, 0);
163
+ const { availableModels, currentModelId } = buildAvailableModels(config, loadedSettings);
164
+ const response = {
158
165
  sessionId,
159
166
  modes: {
160
167
  availableModes: buildAvailableModes(config.isPlanEnabled()),
161
168
  currentModeId: config.getApprovalMode(),
162
169
  },
170
+ models: {
171
+ availableModels,
172
+ currentModelId,
173
+ },
163
174
  };
175
+ return response;
164
176
  }
165
177
  async loadSession({ sessionId, cwd, mcpServers, }) {
166
178
  const config = await this.initializeSessionConfig(sessionId, cwd, mcpServers);
@@ -177,17 +189,27 @@ export class GeminiAgent {
177
189
  conversation: sessionData,
178
190
  filePath: sessionPath,
179
191
  });
180
- const session = new Session(sessionId, geminiClient.getChat(), config, this.connection);
192
+ const session = new Session(sessionId, geminiClient.getChat(), config, this.connection, this.settings);
181
193
  this.sessions.set(sessionId, session);
182
194
  // Stream history back to client
183
195
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
184
196
  session.streamHistory(sessionData.messages);
185
- return {
197
+ setTimeout(() => {
198
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
199
+ session.sendAvailableCommands();
200
+ }, 0);
201
+ const { availableModels, currentModelId } = buildAvailableModels(config, this.settings);
202
+ const response = {
186
203
  modes: {
187
204
  availableModes: buildAvailableModes(config.isPlanEnabled()),
188
205
  currentModeId: config.getApprovalMode(),
189
206
  },
207
+ models: {
208
+ availableModels,
209
+ currentModelId,
210
+ },
190
211
  };
212
+ return response;
191
213
  }
192
214
  async initializeSessionConfig(sessionId, cwd, mcpServers) {
193
215
  const selectedAuthType = this.settings.merged.security.auth.selectedType;
@@ -265,18 +287,28 @@ export class GeminiAgent {
265
287
  }
266
288
  return session.setMode(params.modeId);
267
289
  }
290
+ async unstable_setSessionModel(params) {
291
+ const session = this.sessions.get(params.sessionId);
292
+ if (!session) {
293
+ throw new Error(`Session not found: ${params.sessionId}`);
294
+ }
295
+ return session.setModel(params.modelId);
296
+ }
268
297
  }
269
298
  export class Session {
270
299
  id;
271
300
  chat;
272
301
  config;
273
302
  connection;
303
+ settings;
274
304
  pendingPrompt = null;
275
- constructor(id, chat, config, connection) {
305
+ commandHandler = new CommandHandler();
306
+ constructor(id, chat, config, connection, settings) {
276
307
  this.id = id;
277
308
  this.chat = chat;
278
309
  this.config = config;
279
310
  this.connection = connection;
311
+ this.settings = settings;
280
312
  }
281
313
  async cancelPendingPrompt() {
282
314
  if (!this.pendingPrompt) {
@@ -295,6 +327,23 @@ export class Session {
295
327
  this.config.setApprovalMode(mode.id);
296
328
  return {};
297
329
  }
330
+ getAvailableCommands() {
331
+ return this.commandHandler.getAvailableCommands();
332
+ }
333
+ async sendAvailableCommands() {
334
+ const availableCommands = this.getAvailableCommands().map((command) => ({
335
+ name: command.name,
336
+ description: command.description,
337
+ }));
338
+ await this.sendUpdate({
339
+ sessionUpdate: 'available_commands_update',
340
+ availableCommands,
341
+ });
342
+ }
343
+ setModel(modelId) {
344
+ this.config.setModel(modelId);
345
+ return {};
346
+ }
298
347
  async streamHistory(messages) {
299
348
  for (const msg of messages) {
300
349
  const contentString = partListUnionToString(msg.content);
@@ -364,9 +413,40 @@ export class Session {
364
413
  this.pendingPrompt?.abort();
365
414
  const pendingSend = new AbortController();
366
415
  this.pendingPrompt = pendingSend;
416
+ await this.config.waitForMcpInit();
367
417
  const promptId = Math.random().toString(16).slice(2);
368
418
  const chat = this.chat;
369
419
  const parts = await this.#resolvePrompt(params.prompt, pendingSend.signal);
420
+ // Command interception
421
+ let commandText = '';
422
+ for (const part of parts) {
423
+ if (typeof part === 'object' && part !== null) {
424
+ if ('text' in part) {
425
+ // It is a text part
426
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-type-assertion
427
+ const text = part.text;
428
+ if (typeof text === 'string') {
429
+ commandText += text;
430
+ }
431
+ }
432
+ else {
433
+ // Non-text part (image, embedded resource)
434
+ // Stop looking for command
435
+ break;
436
+ }
437
+ }
438
+ }
439
+ commandText = commandText.trim();
440
+ if (commandText &&
441
+ (commandText.startsWith('/') || commandText.startsWith('$'))) {
442
+ // If we found a command, pass it to handleCommand
443
+ // Note: handleCommand currently expects `commandText` to be the command string
444
+ // It uses `parts` argument but effectively ignores it in current implementation
445
+ const handled = await this.handleCommand(commandText, parts);
446
+ if (handled) {
447
+ return { stopReason: 'end_turn' };
448
+ }
449
+ }
370
450
  let nextMessage = { role: 'user', parts };
371
451
  while (nextMessage !== null) {
372
452
  if (pendingSend.signal.aborted) {
@@ -432,6 +512,23 @@ export class Session {
432
512
  }
433
513
  return { stopReason: 'end_turn' };
434
514
  }
515
+ async handleCommand(commandText,
516
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
517
+ parts) {
518
+ const gitService = await this.config.getGitService();
519
+ const commandContext = {
520
+ config: this.config,
521
+ settings: this.settings,
522
+ git: gitService,
523
+ sendMessage: async (text) => {
524
+ await this.sendUpdate({
525
+ sessionUpdate: 'agent_message_chunk',
526
+ content: { type: 'text', text },
527
+ });
528
+ },
529
+ };
530
+ return this.commandHandler.handleCommand(commandText, commandContext);
531
+ }
435
532
  async sendUpdate(update) {
436
533
  const params = {
437
534
  sessionId: this.id,
@@ -474,7 +571,7 @@ export class Session {
474
571
  if (confirmationDetails.type === 'edit') {
475
572
  content.push({
476
573
  type: 'diff',
477
- path: confirmationDetails.fileName,
574
+ path: confirmationDetails.filePath,
478
575
  oldText: confirmationDetails.originalContent,
479
576
  newText: confirmationDetails.newContent,
480
577
  _meta: {
@@ -915,7 +1012,8 @@ function toToolCallContent(toolResult) {
915
1012
  if ('fileName' in toolResult.returnDisplay) {
916
1013
  return {
917
1014
  type: 'diff',
918
- path: toolResult.returnDisplay.fileName,
1015
+ path: toolResult.returnDisplay.filePath ??
1016
+ toolResult.returnDisplay.fileName,
919
1017
  oldText: toolResult.returnDisplay.originalContent,
920
1018
  newText: toolResult.returnDisplay.newContent,
921
1019
  _meta: {
@@ -1053,4 +1151,68 @@ function buildAvailableModes(isPlanEnabled) {
1053
1151
  }
1054
1152
  return modes;
1055
1153
  }
1154
+ function buildAvailableModels(config, settings) {
1155
+ const preferredModel = config.getModel() || DEFAULT_GEMINI_MODEL_AUTO;
1156
+ const shouldShowPreviewModels = config.getHasAccessToPreviewModel();
1157
+ const useGemini31 = config.getGemini31LaunchedSync?.() ?? false;
1158
+ const selectedAuthType = settings.merged.security.auth.selectedType;
1159
+ const useCustomToolModel = useGemini31 && selectedAuthType === AuthType.USE_GEMINI;
1160
+ const mainOptions = [
1161
+ {
1162
+ value: DEFAULT_GEMINI_MODEL_AUTO,
1163
+ title: getDisplayString(DEFAULT_GEMINI_MODEL_AUTO),
1164
+ description: 'Let Gemini CLI decide the best model for the task: gemini-2.5-pro, gemini-2.5-flash',
1165
+ },
1166
+ ];
1167
+ if (shouldShowPreviewModels) {
1168
+ mainOptions.unshift({
1169
+ value: PREVIEW_GEMINI_MODEL_AUTO,
1170
+ title: getDisplayString(PREVIEW_GEMINI_MODEL_AUTO),
1171
+ description: useGemini31
1172
+ ? 'Let Gemini CLI decide the best model for the task: gemini-3.1-pro, gemini-3-flash'
1173
+ : 'Let Gemini CLI decide the best model for the task: gemini-3-pro, gemini-3-flash',
1174
+ });
1175
+ }
1176
+ const manualOptions = [
1177
+ {
1178
+ value: DEFAULT_GEMINI_MODEL,
1179
+ title: getDisplayString(DEFAULT_GEMINI_MODEL),
1180
+ },
1181
+ {
1182
+ value: DEFAULT_GEMINI_FLASH_MODEL,
1183
+ title: getDisplayString(DEFAULT_GEMINI_FLASH_MODEL),
1184
+ },
1185
+ {
1186
+ value: DEFAULT_GEMINI_FLASH_LITE_MODEL,
1187
+ title: getDisplayString(DEFAULT_GEMINI_FLASH_LITE_MODEL),
1188
+ },
1189
+ ];
1190
+ if (shouldShowPreviewModels) {
1191
+ const previewProModel = useGemini31
1192
+ ? PREVIEW_GEMINI_3_1_MODEL
1193
+ : PREVIEW_GEMINI_MODEL;
1194
+ const previewProValue = useCustomToolModel
1195
+ ? PREVIEW_GEMINI_3_1_CUSTOM_TOOLS_MODEL
1196
+ : previewProModel;
1197
+ manualOptions.unshift({
1198
+ value: previewProValue,
1199
+ title: getDisplayString(previewProModel),
1200
+ }, {
1201
+ value: PREVIEW_GEMINI_FLASH_MODEL,
1202
+ title: getDisplayString(PREVIEW_GEMINI_FLASH_MODEL),
1203
+ });
1204
+ }
1205
+ const scaleOptions = (options) => options.map((o) => ({
1206
+ modelId: o.value,
1207
+ name: o.title,
1208
+ description: o.description,
1209
+ }));
1210
+ return {
1211
+ availableModels: [
1212
+ ...scaleOptions(mainOptions),
1213
+ ...scaleOptions(manualOptions),
1214
+ ],
1215
+ currentModelId: preferredModel,
1216
+ };
1217
+ }
1056
1218
  //# sourceMappingURL=zedIntegration.js.map