@qwen-code/qwen-code 0.10.0-preview.3 → 0.10.0-preview.4

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.
package/cli.js CHANGED
@@ -71639,17 +71639,6 @@ var init_tools = __esm({
71639
71639
  });
71640
71640
 
71641
71641
  // packages/core/dist/src/tools/mcp-tool.js
71642
- function wrapMcpCallToolResultAsParts(toolName, result) {
71643
- const response = result.isError ? { error: result, content: result.content } : result;
71644
- return [
71645
- {
71646
- functionResponse: {
71647
- name: toolName,
71648
- response
71649
- }
71650
- }
71651
- ];
71652
- }
71653
71642
  function transformTextBlock(block2) {
71654
71643
  return { text: block2.text };
71655
71644
  }
@@ -71767,10 +71756,8 @@ var init_mcp_tool = __esm({
71767
71756
  displayName;
71768
71757
  trust;
71769
71758
  cliConfig;
71770
- mcpClient;
71771
- mcpTimeout;
71772
71759
  static allowlist = /* @__PURE__ */ new Set();
71773
- constructor(mcpTool, serverName, serverToolName, displayName, trust, params = {}, cliConfig, mcpClient, mcpTimeout) {
71760
+ constructor(mcpTool, serverName, serverToolName, displayName, trust, params = {}, cliConfig) {
71774
71761
  super(params);
71775
71762
  this.mcpTool = mcpTool;
71776
71763
  this.serverName = serverName;
@@ -71778,8 +71765,6 @@ var init_mcp_tool = __esm({
71778
71765
  this.displayName = displayName;
71779
71766
  this.trust = trust;
71780
71767
  this.cliConfig = cliConfig;
71781
- this.mcpClient = mcpClient;
71782
- this.mcpTimeout = mcpTimeout;
71783
71768
  }
71784
71769
  async shouldConfirmExecute(_abortSignal) {
71785
71770
  const serverAllowListKey = this.serverName;
@@ -71823,63 +71808,7 @@ var init_mcp_tool = __esm({
71823
71808
  }
71824
71809
  return false;
71825
71810
  }
71826
- async execute(signal, updateOutput2) {
71827
- if (this.mcpClient) {
71828
- return this.executeWithDirectClient(signal, updateOutput2);
71829
- }
71830
- return this.executeWithCallableTool(signal);
71831
- }
71832
- /**
71833
- * Execute using the raw MCP SDK Client, which supports progress
71834
- * notifications via the onprogress callback. This enables real-time
71835
- * streaming of progress updates to the user during long-running
71836
- * MCP tool calls (e.g., browser automation).
71837
- */
71838
- async executeWithDirectClient(signal, updateOutput2) {
71839
- const callToolResult = await this.mcpClient.callTool({
71840
- name: this.serverToolName,
71841
- arguments: this.params
71842
- }, void 0, {
71843
- onprogress: /* @__PURE__ */ __name((progress) => {
71844
- if (updateOutput2) {
71845
- const progressData = {
71846
- type: "mcp_tool_progress",
71847
- progress: progress.progress,
71848
- ...progress.total != null && { total: progress.total },
71849
- ...progress.message != null && { message: progress.message }
71850
- };
71851
- updateOutput2(progressData);
71852
- }
71853
- }, "onprogress"),
71854
- timeout: this.mcpTimeout,
71855
- signal
71856
- });
71857
- const rawResponseParts = wrapMcpCallToolResultAsParts(this.serverToolName, callToolResult);
71858
- if (this.isMCPToolError(rawResponseParts)) {
71859
- const errorMessage = `MCP tool '${this.serverToolName}' reported tool error for function call: ${safeJsonStringify({
71860
- name: this.serverToolName,
71861
- args: this.params
71862
- })} with response: ${safeJsonStringify(rawResponseParts)}`;
71863
- return {
71864
- llmContent: errorMessage,
71865
- returnDisplay: `Error: MCP tool '${this.serverToolName}' reported an error.`,
71866
- error: {
71867
- message: errorMessage,
71868
- type: ToolErrorType.MCP_TOOL_ERROR
71869
- }
71870
- };
71871
- }
71872
- const transformedParts = transformMcpContentToParts(rawResponseParts);
71873
- return {
71874
- llmContent: transformedParts,
71875
- returnDisplay: getStringifiedResultForDisplay(rawResponseParts)
71876
- };
71877
- }
71878
- /**
71879
- * Fallback: execute using the @google/genai CallableTool wrapper.
71880
- * This path does NOT support progress notifications.
71881
- */
71882
- async executeWithCallableTool(signal) {
71811
+ async execute(signal) {
71883
71812
  const functionCalls = [
71884
71813
  {
71885
71814
  name: this.serverToolName,
@@ -71942,9 +71871,7 @@ var init_mcp_tool = __esm({
71942
71871
  parameterSchema;
71943
71872
  trust;
71944
71873
  cliConfig;
71945
- mcpClient;
71946
- mcpTimeout;
71947
- constructor(mcpTool, serverName, serverToolName, description, parameterSchema, trust, nameOverride, cliConfig, mcpClient, mcpTimeout) {
71874
+ constructor(mcpTool, serverName, serverToolName, description, parameterSchema, trust, nameOverride, cliConfig) {
71948
71875
  super(
71949
71876
  nameOverride ?? generateValidName(`mcp__${serverName}__${serverToolName}`),
71950
71877
  `${serverToolName} (${serverName} MCP Server)`,
@@ -71953,7 +71880,7 @@ var init_mcp_tool = __esm({
71953
71880
  parameterSchema,
71954
71881
  true,
71955
71882
  // isOutputMarkdown
71956
- true
71883
+ false
71957
71884
  );
71958
71885
  this.mcpTool = mcpTool;
71959
71886
  this.serverName = serverName;
@@ -71961,17 +71888,14 @@ var init_mcp_tool = __esm({
71961
71888
  this.parameterSchema = parameterSchema;
71962
71889
  this.trust = trust;
71963
71890
  this.cliConfig = cliConfig;
71964
- this.mcpClient = mcpClient;
71965
- this.mcpTimeout = mcpTimeout;
71966
71891
  }
71967
71892
  asFullyQualifiedTool() {
71968
- return new _DiscoveredMCPTool(this.mcpTool, this.serverName, this.serverToolName, this.description, this.parameterSchema, this.trust, generateValidName(`mcp__${this.serverName}__${this.serverToolName}`), this.cliConfig, this.mcpClient, this.mcpTimeout);
71893
+ return new _DiscoveredMCPTool(this.mcpTool, this.serverName, this.serverToolName, this.description, this.parameterSchema, this.trust, generateValidName(`mcp__${this.serverName}__${this.serverToolName}`), this.cliConfig);
71969
71894
  }
71970
71895
  createInvocation(params) {
71971
- return new DiscoveredMCPToolInvocation(this.mcpTool, this.serverName, this.serverToolName, this.displayName, this.trust, params, this.cliConfig, this.mcpClient, this.mcpTimeout);
71896
+ return new DiscoveredMCPToolInvocation(this.mcpTool, this.serverName, this.serverToolName, this.displayName, this.trust, params, this.cliConfig);
71972
71897
  }
71973
71898
  };
71974
- __name(wrapMcpCallToolResultAsParts, "wrapMcpCallToolResultAsParts");
71975
71899
  __name(transformTextBlock, "transformTextBlock");
71976
71900
  __name(transformImageAudioBlock, "transformImageAudioBlock");
71977
71901
  __name(transformResourceBlock, "transformResourceBlock");
@@ -132884,11 +132808,16 @@ var init_modelRegistry = __esm({
132884
132808
  }
132885
132809
  }
132886
132810
  /**
132887
- * Register models for an authType
132811
+ * Register models for an authType.
132812
+ * If multiple models have the same id, the first one takes precedence.
132888
132813
  */
132889
132814
  registerAuthTypeModels(authType, models) {
132890
132815
  const modelMap = /* @__PURE__ */ new Map();
132891
132816
  for (const config2 of models) {
132817
+ if (modelMap.has(config2.id)) {
132818
+ debugLogger5.warn(`Duplicate model id "${config2.id}" for authType "${authType}". Using the first registered config.`);
132819
+ continue;
132820
+ }
132892
132821
  const resolved = this.resolveModelConfig(config2, authType);
132893
132822
  modelMap.set(config2.id, resolved);
132894
132823
  }
@@ -132962,6 +132891,31 @@ var init_modelRegistry = __esm({
132962
132891
  throw new Error(`Model config in authType '${authType}' missing required field: id`);
132963
132892
  }
132964
132893
  }
132894
+ /**
132895
+ * Reload models from updated configuration.
132896
+ * Clears existing user-configured models and re-registers from new config.
132897
+ * Preserves hard-coded qwen-oauth models.
132898
+ */
132899
+ reloadModels(modelProvidersConfig) {
132900
+ for (const authType of this.modelsByAuthType.keys()) {
132901
+ if (authType !== AuthType2.QWEN_OAUTH) {
132902
+ this.modelsByAuthType.delete(authType);
132903
+ }
132904
+ }
132905
+ if (modelProvidersConfig) {
132906
+ for (const [rawKey, models] of Object.entries(modelProvidersConfig)) {
132907
+ const authType = validateAuthTypeKey(rawKey);
132908
+ if (!authType) {
132909
+ debugLogger5.warn(`Invalid authType key "${rawKey}" in modelProviders config. Expected one of: ${Object.values(AuthType2).join(", ")}. Skipping.`);
132910
+ continue;
132911
+ }
132912
+ if (authType === AuthType2.QWEN_OAUTH) {
132913
+ continue;
132914
+ }
132915
+ this.registerAuthTypeModels(authType, models);
132916
+ }
132917
+ }
132918
+ }
132965
132919
  };
132966
132920
  }
132967
132921
  });
@@ -133774,6 +133728,15 @@ var init_modelsConfig = __esm({
133774
133728
  this.activeRuntimeModelSnapshotId = void 0;
133775
133729
  }
133776
133730
  }
133731
+ /**
133732
+ * Reload model providers configuration at runtime.
133733
+ * This enables hot-reloading of modelProviders settings without restarting the CLI.
133734
+ *
133735
+ * @param modelProvidersConfig - The updated model providers configuration
133736
+ */
133737
+ reloadModelProvidersConfig(modelProvidersConfig) {
133738
+ this.modelRegistry.reloadModels(modelProvidersConfig);
133739
+ }
133777
133740
  };
133778
133741
  }
133779
133742
  });
@@ -156388,7 +156351,7 @@ __export(geminiContentGenerator_exports, {
156388
156351
  createGeminiContentGenerator: () => createGeminiContentGenerator
156389
156352
  });
156390
156353
  function createGeminiContentGenerator(config2, gcConfig) {
156391
- const version2 = "0.10.0-preview.3";
156354
+ const version2 = "0.10.0-preview.4";
156392
156355
  const userAgent2 = config2.userAgent || `QwenCode/${version2} (${process.platform}; ${process.arch})`;
156393
156356
  const baseHeaders = {
156394
156357
  "User-Agent": userAgent2
@@ -210595,26 +210558,13 @@ async function discoverTools(mcpServerName, mcpServerConfig, mcpClient, cliConfi
210595
210558
  if (!Array.isArray(tool.functionDeclarations)) {
210596
210559
  return [];
210597
210560
  }
210598
- const mcpTimeout = mcpServerConfig.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC;
210599
210561
  const discoveredTools = [];
210600
210562
  for (const funcDecl of tool.functionDeclarations) {
210601
210563
  try {
210602
210564
  if (!isEnabled(funcDecl, mcpServerName, mcpServerConfig)) {
210603
210565
  continue;
210604
210566
  }
210605
- discoveredTools.push(new DiscoveredMCPTool(
210606
- mcpCallableTool,
210607
- mcpServerName,
210608
- funcDecl.name,
210609
- funcDecl.description ?? "",
210610
- funcDecl.parametersJsonSchema ?? { type: "object", properties: {} },
210611
- mcpServerConfig.trust,
210612
- void 0,
210613
- cliConfig,
210614
- mcpClient,
210615
- // raw MCP Client for direct callTool with progress
210616
- mcpTimeout
210617
- ));
210567
+ discoveredTools.push(new DiscoveredMCPTool(mcpCallableTool, mcpServerName, funcDecl.name, funcDecl.description ?? "", funcDecl.parametersJsonSchema ?? { type: "object", properties: {} }, mcpServerConfig.trust, void 0, cliConfig));
210618
210568
  } catch (error2) {
210619
210569
  debugLogger49.error(`Error discovering tool: '${funcDecl.name}' from MCP server '${mcpServerName}': ${error2.message}`);
210620
210570
  }
@@ -242504,6 +242454,16 @@ var init_config3 = __esm({
242504
242454
  updateCredentials(credentials, settingsGenerationConfig) {
242505
242455
  this.modelsConfig.updateCredentials(credentials, settingsGenerationConfig);
242506
242456
  }
242457
+ /**
242458
+ * Reload model providers configuration at runtime.
242459
+ * This enables hot-reloading of modelProviders settings without restarting the CLI.
242460
+ * Should be called before refreshAuth when settings.json has been updated.
242461
+ *
242462
+ * @param modelProvidersConfig - The updated model providers configuration
242463
+ */
242464
+ reloadModelProvidersConfig(modelProvidersConfig) {
242465
+ this.modelsConfig.reloadModelProvidersConfig(modelProvidersConfig);
242466
+ }
242507
242467
  /**
242508
242468
  * Refresh authentication and rebuild ContentGenerator.
242509
242469
  */
@@ -281707,7 +281667,7 @@ var require_backend = __commonJS({
281707
281667
  ) : symbolOrNumber;
281708
281668
  }
281709
281669
  __name(getTypeSymbol, "getTypeSymbol");
281710
- var _ReactTypeOfWork = ReactTypeOfWork, CacheComponent = _ReactTypeOfWork.CacheComponent, ClassComponent = _ReactTypeOfWork.ClassComponent, IncompleteClassComponent = _ReactTypeOfWork.IncompleteClassComponent, FunctionComponent = _ReactTypeOfWork.FunctionComponent, IndeterminateComponent = _ReactTypeOfWork.IndeterminateComponent, ForwardRef = _ReactTypeOfWork.ForwardRef, HostRoot = _ReactTypeOfWork.HostRoot, HostHoistable = _ReactTypeOfWork.HostHoistable, HostSingleton = _ReactTypeOfWork.HostSingleton, HostComponent = _ReactTypeOfWork.HostComponent, HostPortal = _ReactTypeOfWork.HostPortal, HostText = _ReactTypeOfWork.HostText, Fragment15 = _ReactTypeOfWork.Fragment, LazyComponent = _ReactTypeOfWork.LazyComponent, LegacyHiddenComponent = _ReactTypeOfWork.LegacyHiddenComponent, MemoComponent = _ReactTypeOfWork.MemoComponent, OffscreenComponent = _ReactTypeOfWork.OffscreenComponent, Profiler = _ReactTypeOfWork.Profiler, ScopeComponent = _ReactTypeOfWork.ScopeComponent, SimpleMemoComponent = _ReactTypeOfWork.SimpleMemoComponent, SuspenseComponent = _ReactTypeOfWork.SuspenseComponent, SuspenseListComponent = _ReactTypeOfWork.SuspenseListComponent, TracingMarkerComponent = _ReactTypeOfWork.TracingMarkerComponent;
281670
+ var _ReactTypeOfWork = ReactTypeOfWork, CacheComponent = _ReactTypeOfWork.CacheComponent, ClassComponent = _ReactTypeOfWork.ClassComponent, IncompleteClassComponent = _ReactTypeOfWork.IncompleteClassComponent, FunctionComponent = _ReactTypeOfWork.FunctionComponent, IndeterminateComponent = _ReactTypeOfWork.IndeterminateComponent, ForwardRef = _ReactTypeOfWork.ForwardRef, HostRoot = _ReactTypeOfWork.HostRoot, HostHoistable = _ReactTypeOfWork.HostHoistable, HostSingleton = _ReactTypeOfWork.HostSingleton, HostComponent = _ReactTypeOfWork.HostComponent, HostPortal = _ReactTypeOfWork.HostPortal, HostText = _ReactTypeOfWork.HostText, Fragment16 = _ReactTypeOfWork.Fragment, LazyComponent = _ReactTypeOfWork.LazyComponent, LegacyHiddenComponent = _ReactTypeOfWork.LegacyHiddenComponent, MemoComponent = _ReactTypeOfWork.MemoComponent, OffscreenComponent = _ReactTypeOfWork.OffscreenComponent, Profiler = _ReactTypeOfWork.Profiler, ScopeComponent = _ReactTypeOfWork.ScopeComponent, SimpleMemoComponent = _ReactTypeOfWork.SimpleMemoComponent, SuspenseComponent = _ReactTypeOfWork.SuspenseComponent, SuspenseListComponent = _ReactTypeOfWork.SuspenseListComponent, TracingMarkerComponent = _ReactTypeOfWork.TracingMarkerComponent;
281711
281671
  function resolveFiberType(type) {
281712
281672
  var typeSymbol = getTypeSymbol(type);
281713
281673
  switch (typeSymbol) {
@@ -281753,7 +281713,7 @@ var require_backend = __commonJS({
281753
281713
  case HostPortal:
281754
281714
  case HostText:
281755
281715
  return null;
281756
- case Fragment15:
281716
+ case Fragment16:
281757
281717
  return "Fragment";
281758
281718
  case LazyComponent:
281759
281719
  return "Lazy";
@@ -281819,7 +281779,7 @@ var require_backend = __commonJS({
281819
281779
  function attach(hook2, rendererID, renderer2, global2) {
281820
281780
  var version2 = renderer2.reconcilerVersion || renderer2.version;
281821
281781
  var _getInternalReactCons = getInternalReactConstants(version2), getDisplayNameForFiber = _getInternalReactCons.getDisplayNameForFiber, getTypeSymbol = _getInternalReactCons.getTypeSymbol, ReactPriorityLevels = _getInternalReactCons.ReactPriorityLevels, ReactTypeOfWork = _getInternalReactCons.ReactTypeOfWork, StrictModeBits = _getInternalReactCons.StrictModeBits;
281822
- var CacheComponent = ReactTypeOfWork.CacheComponent, ClassComponent = ReactTypeOfWork.ClassComponent, ContextConsumer = ReactTypeOfWork.ContextConsumer, DehydratedSuspenseComponent = ReactTypeOfWork.DehydratedSuspenseComponent, ForwardRef = ReactTypeOfWork.ForwardRef, Fragment15 = ReactTypeOfWork.Fragment, FunctionComponent = ReactTypeOfWork.FunctionComponent, HostRoot = ReactTypeOfWork.HostRoot, HostHoistable = ReactTypeOfWork.HostHoistable, HostSingleton = ReactTypeOfWork.HostSingleton, HostPortal = ReactTypeOfWork.HostPortal, HostComponent = ReactTypeOfWork.HostComponent, HostText = ReactTypeOfWork.HostText, IncompleteClassComponent = ReactTypeOfWork.IncompleteClassComponent, IndeterminateComponent = ReactTypeOfWork.IndeterminateComponent, LegacyHiddenComponent = ReactTypeOfWork.LegacyHiddenComponent, MemoComponent = ReactTypeOfWork.MemoComponent, OffscreenComponent = ReactTypeOfWork.OffscreenComponent, SimpleMemoComponent = ReactTypeOfWork.SimpleMemoComponent, SuspenseComponent = ReactTypeOfWork.SuspenseComponent, SuspenseListComponent = ReactTypeOfWork.SuspenseListComponent, TracingMarkerComponent = ReactTypeOfWork.TracingMarkerComponent;
281782
+ var CacheComponent = ReactTypeOfWork.CacheComponent, ClassComponent = ReactTypeOfWork.ClassComponent, ContextConsumer = ReactTypeOfWork.ContextConsumer, DehydratedSuspenseComponent = ReactTypeOfWork.DehydratedSuspenseComponent, ForwardRef = ReactTypeOfWork.ForwardRef, Fragment16 = ReactTypeOfWork.Fragment, FunctionComponent = ReactTypeOfWork.FunctionComponent, HostRoot = ReactTypeOfWork.HostRoot, HostHoistable = ReactTypeOfWork.HostHoistable, HostSingleton = ReactTypeOfWork.HostSingleton, HostPortal = ReactTypeOfWork.HostPortal, HostComponent = ReactTypeOfWork.HostComponent, HostText = ReactTypeOfWork.HostText, IncompleteClassComponent = ReactTypeOfWork.IncompleteClassComponent, IndeterminateComponent = ReactTypeOfWork.IndeterminateComponent, LegacyHiddenComponent = ReactTypeOfWork.LegacyHiddenComponent, MemoComponent = ReactTypeOfWork.MemoComponent, OffscreenComponent = ReactTypeOfWork.OffscreenComponent, SimpleMemoComponent = ReactTypeOfWork.SimpleMemoComponent, SuspenseComponent = ReactTypeOfWork.SuspenseComponent, SuspenseListComponent = ReactTypeOfWork.SuspenseListComponent, TracingMarkerComponent = ReactTypeOfWork.TracingMarkerComponent;
281823
281783
  var ImmediatePriority = ReactPriorityLevels.ImmediatePriority, UserBlockingPriority = ReactPriorityLevels.UserBlockingPriority, NormalPriority = ReactPriorityLevels.NormalPriority, LowPriority = ReactPriorityLevels.LowPriority, IdlePriority = ReactPriorityLevels.IdlePriority, NoPriority = ReactPriorityLevels.NoPriority;
281824
281784
  var getLaneLabelMap = renderer2.getLaneLabelMap, injectProfilingHooks = renderer2.injectProfilingHooks, overrideHookState = renderer2.overrideHookState, overrideHookStateDeletePath = renderer2.overrideHookStateDeletePath, overrideHookStateRenamePath = renderer2.overrideHookStateRenamePath, overrideProps = renderer2.overrideProps, overridePropsDeletePath = renderer2.overridePropsDeletePath, overridePropsRenamePath = renderer2.overridePropsRenamePath, scheduleRefresh = renderer2.scheduleRefresh, setErrorHandler = renderer2.setErrorHandler, setSuspenseHandler = renderer2.setSuspenseHandler, scheduleUpdate = renderer2.scheduleUpdate;
281825
281785
  var supportsTogglingError = typeof setErrorHandler === "function" && typeof scheduleUpdate === "function";
@@ -282034,7 +281994,7 @@ var require_backend = __commonJS({
282034
281994
  return true;
282035
281995
  case HostRoot:
282036
281996
  return false;
282037
- case Fragment15:
281997
+ case Fragment16:
282038
281998
  return key === null;
282039
281999
  default:
282040
282000
  var typeSymbol = getTypeSymbol(type);
@@ -282109,7 +282069,7 @@ var require_backend = __commonJS({
282109
282069
  return ElementTypeHostComponent;
282110
282070
  case HostPortal:
282111
282071
  case HostText:
282112
- case Fragment15:
282072
+ case Fragment16:
282113
282073
  return ElementTypeOtherOrUnknown;
282114
282074
  case MemoComponent:
282115
282075
  case SimpleMemoComponent:
@@ -297343,7 +297303,17 @@ var init_de = __esm({
297343
297303
  "Opening extensions page in your browser: {{url}}": "Erweiterungsseite wird im Browser ge\xF6ffnet: {{url}}",
297344
297304
  "Failed to open browser. Check out the extensions gallery at {{url}}": "Browser konnte nicht ge\xF6ffnet werden. Besuchen Sie die Erweiterungsgalerie unter {{url}}",
297345
297305
  "You can switch permission mode quickly with Shift+Tab or /approval-mode.": "Sie k\xF6nnen den Berechtigungsmodus schnell mit Shift+Tab oder /approval-mode wechseln.",
297346
- "You can switch permission mode quickly with Tab or /approval-mode.": "Sie k\xF6nnen den Berechtigungsmodus schnell mit Tab oder /approval-mode wechseln."
297306
+ "You can switch permission mode quickly with Tab or /approval-mode.": "Sie k\xF6nnen den Berechtigungsmodus schnell mit Tab oder /approval-mode wechseln.",
297307
+ // ============================================================================
297308
+ // Custom API-KEY Configuration
297309
+ // ============================================================================
297310
+ "For advanced users who want to configure models manually.": "F\xFCr fortgeschrittene Benutzer, die Modelle manuell konfigurieren m\xF6chten.",
297311
+ "Please configure your models in settings.json:": "Bitte konfigurieren Sie Ihre Modelle in settings.json:",
297312
+ "Set API key via environment variable (e.g., OPENAI_API_KEY)": "API-Schl\xFCssel \xFCber Umgebungsvariable setzen (z.B. OPENAI_API_KEY)",
297313
+ "Add model configuration to modelProviders['openai'] (or other auth types)": "Modellkonfiguration zu modelProviders['openai'] (oder anderen Authentifizierungstypen) hinzuf\xFCgen",
297314
+ "Each provider needs: id, envKey (required), plus optional baseUrl, generationConfig": "Jeder Anbieter ben\xF6tigt: id, envKey (erforderlich), plus optionale baseUrl, generationConfig",
297315
+ "Use /model command to select your preferred model from the configured list": "Verwenden Sie den /model-Befehl, um Ihr bevorzugtes Modell aus der konfigurierten Liste auszuw\xE4hlen",
297316
+ "Supported auth types: openai, anthropic, gemini, vertex-ai, etc.": "Unterst\xFCtzte Authentifizierungstypen: openai, anthropic, gemini, vertex-ai, usw."
297347
297317
  };
297348
297318
  }
297349
297319
  });
@@ -298381,7 +298351,32 @@ var init_en3 = __esm({
298381
298351
  "Would open extensions page in your browser: {{url}} (skipped in test environment)": "Would open extensions page in your browser: {{url}} (skipped in test environment)",
298382
298352
  "View available extensions at {{url}}": "View available extensions at {{url}}",
298383
298353
  "Opening extensions page in your browser: {{url}}": "Opening extensions page in your browser: {{url}}",
298384
- "Failed to open browser. Check out the extensions gallery at {{url}}": "Failed to open browser. Check out the extensions gallery at {{url}}"
298354
+ "Failed to open browser. Check out the extensions gallery at {{url}}": "Failed to open browser. Check out the extensions gallery at {{url}}",
298355
+ // ============================================================================
298356
+ // Coding Plan Authentication
298357
+ // ============================================================================
298358
+ "Please enter your API key:": "Please enter your API key:",
298359
+ "API key cannot be empty.": "API key cannot be empty.",
298360
+ "API key is stored in settings.env. You can migrate it to a .env file for better security.": "API key is stored in settings.env. You can migrate it to a .env file for better security.",
298361
+ // ============================================================================
298362
+ // Custom API-KEY Configuration
298363
+ // ============================================================================
298364
+ "For advanced users who want to configure models manually.": "For advanced users who want to configure models manually.",
298365
+ "Please configure your models in settings.json:": "Please configure your models in settings.json:",
298366
+ "Set API key via environment variable (e.g., OPENAI_API_KEY)": "Set API key via environment variable (e.g., OPENAI_API_KEY)",
298367
+ "Add model configuration to modelProviders['openai'] (or other auth types)": "Add model configuration to modelProviders['openai'] (or other auth types)",
298368
+ "Each provider needs: id, envKey (required), plus optional baseUrl, generationConfig": "Each provider needs: id, envKey (required), plus optional baseUrl, generationConfig",
298369
+ "Use /model command to select your preferred model from the configured list": "Use /model command to select your preferred model from the configured list",
298370
+ "Supported auth types: openai, anthropic, gemini, vertex-ai, etc.": "Supported auth types: openai, anthropic, gemini, vertex-ai, etc.",
298371
+ // ============================================================================
298372
+ // Auth Dialog - View Titles and Labels
298373
+ // ============================================================================
298374
+ "API-KEY": "API-KEY",
298375
+ "Coding Plan": "Coding Plan",
298376
+ Custom: "Custom",
298377
+ "Select API-KEY configuration mode:": "Select API-KEY configuration mode:",
298378
+ "(Press Escape to go back)": "(Press Escape to go back)",
298379
+ "(Press Enter to submit, Escape to cancel)": "(Press Enter to submit, Escape to cancel)"
298385
298380
  };
298386
298381
  }
298387
298382
  });
@@ -299063,7 +299058,17 @@ var init_ja = __esm({
299063
299058
  "\u30D7\u30ED\u30B0\u30E9\u30DE\u30FC\u304C\u30C0\u30FC\u30AF\u30E2\u30FC\u30C9\u306A\u306E\u306F\u30D0\u30B0\u3092\u898B\u305F\u304F\u306A\u3044\u304B\u3089...",
299064
299059
  "\u30B3\u30FC\u30C9\u304C\u58CA\u308C\u305F?\u53E9\u3051\u3070\u6CBB\u308B\u3055",
299065
299060
  "USB\u306E\u5DEE\u3057\u8FBC\u307F\u306B\u6311\u6226\u4E2D..."
299066
- ]
299061
+ ],
299062
+ // ============================================================================
299063
+ // Custom API-KEY Configuration
299064
+ // ============================================================================
299065
+ "For advanced users who want to configure models manually.": "\u30E2\u30C7\u30EB\u3092\u624B\u52D5\u3067\u8A2D\u5B9A\u3057\u305F\u3044\u4E0A\u7D1A\u30E6\u30FC\u30B6\u30FC\u5411\u3051\u3002",
299066
+ "Please configure your models in settings.json:": "settings.json \u3067\u30E2\u30C7\u30EB\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF1A",
299067
+ "Set API key via environment variable (e.g., OPENAI_API_KEY)": "\u74B0\u5883\u5909\u6570\u3092\u4F7F\u7528\u3057\u3066 API \u30AD\u30FC\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u4F8B\uFF1AOPENAI_API_KEY\uFF09",
299068
+ "Add model configuration to modelProviders['openai'] (or other auth types)": "modelProviders['openai']\uFF08\u307E\u305F\u306F\u4ED6\u306E\u8A8D\u8A3C\u30BF\u30A4\u30D7\uFF09\u306B\u30E2\u30C7\u30EB\u8A2D\u5B9A\u3092\u8FFD\u52A0\u3057\u3066\u304F\u3060\u3055\u3044",
299069
+ "Each provider needs: id, envKey (required), plus optional baseUrl, generationConfig": "\u5404\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u306B\u306F\uFF1Aid\u3001envKey\uFF08\u5FC5\u9808\uFF09\u3001\u304A\u3088\u3073\u30AA\u30D7\u30B7\u30E7\u30F3\u306E baseUrl\u3001generationConfig \u304C\u5FC5\u8981\u3067\u3059",
299070
+ "Use /model command to select your preferred model from the configured list": "/model \u30B3\u30DE\u30F3\u30C9\u3092\u4F7F\u7528\u3057\u3066\u3001\u8A2D\u5B9A\u6E08\u307F\u30EA\u30B9\u30C8\u304B\u3089\u304A\u597D\u307F\u306E\u30E2\u30C7\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044",
299071
+ "Supported auth types: openai, anthropic, gemini, vertex-ai, etc.": "\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u308B\u8A8D\u8A3C\u30BF\u30A4\u30D7\uFF1Aopenai\u3001anthropic\u3001gemini\u3001vertex-ai \u306A\u3069"
299067
299072
  };
299068
299073
  }
299069
299074
  });
@@ -300091,7 +300096,17 @@ var init_pt = __esm({
300091
300096
  "Would open extensions page in your browser: {{url}} (skipped in test environment)": "Abriria a p\xE1gina de extens\xF5es no seu navegador: {{url}} (pulado no ambiente de teste)",
300092
300097
  "View available extensions at {{url}}": "Ver extens\xF5es dispon\xEDveis em {{url}}",
300093
300098
  "Opening extensions page in your browser: {{url}}": "Abrindo p\xE1gina de extens\xF5es no seu navegador: {{url}}",
300094
- "Failed to open browser. Check out the extensions gallery at {{url}}": "Falha ao abrir o navegador. Confira a galeria de extens\xF5es em {{url}}"
300099
+ "Failed to open browser. Check out the extensions gallery at {{url}}": "Falha ao abrir o navegador. Confira a galeria de extens\xF5es em {{url}}",
300100
+ // ============================================================================
300101
+ // Custom API-KEY Configuration
300102
+ // ============================================================================
300103
+ "For advanced users who want to configure models manually.": "Para usu\xE1rios avan\xE7ados que desejam configurar modelos manualmente.",
300104
+ "Please configure your models in settings.json:": "Por favor, configure seus modelos em settings.json:",
300105
+ "Set API key via environment variable (e.g., OPENAI_API_KEY)": "Defina a chave de API via vari\xE1vel de ambiente (ex: OPENAI_API_KEY)",
300106
+ "Add model configuration to modelProviders['openai'] (or other auth types)": "Adicione a configura\xE7\xE3o do modelo a modelProviders['openai'] (ou outros tipos de autentica\xE7\xE3o)",
300107
+ "Each provider needs: id, envKey (required), plus optional baseUrl, generationConfig": "Cada provedor precisa de: id, envKey (obrigat\xF3rio), al\xE9m de baseUrl e generationConfig opcionais",
300108
+ "Use /model command to select your preferred model from the configured list": "Use o comando /model para selecionar seu modelo preferido da lista configurada",
300109
+ "Supported auth types: openai, anthropic, gemini, vertex-ai, etc.": "Tipos de autentica\xE7\xE3o suportados: openai, anthropic, gemini, vertex-ai, etc."
300095
300110
  };
300096
300111
  }
300097
300112
  });
@@ -301127,7 +301142,17 @@ var init_ru = __esm({
301127
301142
  "Opening extensions page in your browser: {{url}}": "\u041E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u043C \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0439 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435: {{url}}",
301128
301143
  "Failed to open browser. Check out the extensions gallery at {{url}}": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0431\u0440\u0430\u0443\u0437\u0435\u0440. \u041F\u043E\u0441\u0435\u0442\u0438\u0442\u0435 \u0433\u0430\u043B\u0435\u0440\u0435\u044E \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0439 \u043F\u043E \u0430\u0434\u0440\u0435\u0441\u0443 {{url}}",
301129
301144
  "You can switch permission mode quickly with Shift+Tab or /approval-mode.": "\u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0431\u044B\u0441\u0442\u0440\u043E \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0439 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E Shift+Tab \u0438\u043B\u0438 /approval-mode.",
301130
- "You can switch permission mode quickly with Tab or /approval-mode.": "\u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0431\u044B\u0441\u0442\u0440\u043E \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0439 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E Tab \u0438\u043B\u0438 /approval-mode."
301145
+ "You can switch permission mode quickly with Tab or /approval-mode.": "\u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0431\u044B\u0441\u0442\u0440\u043E \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0439 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E Tab \u0438\u043B\u0438 /approval-mode.",
301146
+ // ============================================================================
301147
+ // Custom API-KEY Configuration
301148
+ // ============================================================================
301149
+ "For advanced users who want to configure models manually.": "\u0414\u043B\u044F \u043F\u0440\u043E\u0434\u0432\u0438\u043D\u0443\u0442\u044B\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0445\u043E\u0442\u044F\u0442 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044C \u043C\u043E\u0434\u0435\u043B\u0438 \u0432\u0440\u0443\u0447\u043D\u0443\u044E.",
301150
+ "Please configure your models in settings.json:": "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u0442\u0435 \u0432\u0430\u0448\u0438 \u043C\u043E\u0434\u0435\u043B\u0438 \u0432 settings.json:",
301151
+ "Set API key via environment variable (e.g., OPENAI_API_KEY)": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0435 \u043A\u043B\u044E\u0447 API \u0447\u0435\u0440\u0435\u0437 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u0443\u044E \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044F (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, OPENAI_API_KEY)",
301152
+ "Add model configuration to modelProviders['openai'] (or other auth types)": "\u0414\u043E\u0431\u0430\u0432\u044C\u0442\u0435 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044E \u043C\u043E\u0434\u0435\u043B\u0438 \u0432 modelProviders['openai'] (\u0438\u043B\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0438\u043F\u044B \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0438)",
301153
+ "Each provider needs: id, envKey (required), plus optional baseUrl, generationConfig": "\u041A\u0430\u0436\u0434\u043E\u043C\u0443 \u043F\u0440\u043E\u0432\u0430\u0439\u0434\u0435\u0440\u0443 \u043D\u0443\u0436\u043D\u044B: id, envKey (\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E), \u0430 \u0442\u0430\u043A\u0436\u0435 \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 baseUrl, generationConfig",
301154
+ "Use /model command to select your preferred model from the configured list": "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 /model, \u0447\u0442\u043E\u0431\u044B \u0432\u044B\u0431\u0440\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0438\u0442\u0430\u0435\u043C\u0443\u044E \u043C\u043E\u0434\u0435\u043B\u044C \u0438\u0437 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0433\u043E \u0441\u043F\u0438\u0441\u043A\u0430",
301155
+ "Supported auth types: openai, anthropic, gemini, vertex-ai, etc.": "\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0435 \u0442\u0438\u043F\u044B \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0438: openai, anthropic, gemini, vertex-ai \u0438 \u0434\u0440."
301131
301156
  };
301132
301157
  }
301133
301158
  });
@@ -302064,7 +302089,32 @@ var init_zh = __esm({
302064
302089
  "Would open extensions page in your browser: {{url}} (skipped in test environment)": "\u5C06\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u6269\u5C55\u9875\u9762\uFF1A{{url}}\uFF08\u6D4B\u8BD5\u73AF\u5883\u4E2D\u5DF2\u8DF3\u8FC7\uFF09",
302065
302090
  "View available extensions at {{url}}": "\u5728 {{url}} \u67E5\u770B\u53EF\u7528\u6269\u5C55",
302066
302091
  "Opening extensions page in your browser: {{url}}": "\u6B63\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u6269\u5C55\u9875\u9762\uFF1A{{url}}",
302067
- "Failed to open browser. Check out the extensions gallery at {{url}}": "\u6253\u5F00\u6D4F\u89C8\u5668\u5931\u8D25\u3002\u8BF7\u8BBF\u95EE\u6269\u5C55\u5E02\u573A\uFF1A{{url}}"
302092
+ "Failed to open browser. Check out the extensions gallery at {{url}}": "\u6253\u5F00\u6D4F\u89C8\u5668\u5931\u8D25\u3002\u8BF7\u8BBF\u95EE\u6269\u5C55\u5E02\u573A\uFF1A{{url}}",
302093
+ // ============================================================================
302094
+ // Coding Plan Authentication
302095
+ // ============================================================================
302096
+ "Please enter your API key:": "\u8BF7\u8F93\u5165\u60A8\u7684 API Key\uFF1A",
302097
+ "API key cannot be empty.": "API Key \u4E0D\u80FD\u4E3A\u7A7A\u3002",
302098
+ "API key is stored in settings.env. You can migrate it to a .env file for better security.": "API Key \u5DF2\u5B58\u50A8\u5728 settings.env \u4E2D\u3002\u60A8\u53EF\u4EE5\u5C06\u5176\u8FC1\u79FB\u5230 .env \u6587\u4EF6\u4EE5\u83B7\u5F97\u66F4\u597D\u7684\u5B89\u5168\u6027\u3002",
302099
+ // ============================================================================
302100
+ // Custom API-KEY Configuration
302101
+ // ============================================================================
302102
+ "For advanced users who want to configure models manually.": "\u9002\u5408\u9700\u8981\u624B\u52A8\u914D\u7F6E\u6A21\u578B\u7684\u9AD8\u7EA7\u7528\u6237\u3002",
302103
+ "Please configure your models in settings.json:": "\u8BF7\u5728 settings.json \u4E2D\u914D\u7F6E\u60A8\u7684\u6A21\u578B\uFF1A",
302104
+ "Set API key via environment variable (e.g., OPENAI_API_KEY)": "\u901A\u8FC7\u73AF\u5883\u53D8\u91CF\u8BBE\u7F6E API Key\uFF08\u4F8B\u5982\uFF1AOPENAI_API_KEY\uFF09",
302105
+ "Add model configuration to modelProviders['openai'] (or other auth types)": "\u5C06\u6A21\u578B\u914D\u7F6E\u6DFB\u52A0\u5230 modelProviders['openai']\uFF08\u6216\u5176\u4ED6\u8BA4\u8BC1\u7C7B\u578B\uFF09",
302106
+ "Each provider needs: id, envKey (required), plus optional baseUrl, generationConfig": "\u6BCF\u4E2A\u63D0\u4F9B\u5546\u9700\u8981\uFF1Aid\u3001envKey\uFF08\u5FC5\u9700\uFF09\uFF0C\u4EE5\u53CA\u53EF\u9009\u7684 baseUrl\u3001generationConfig",
302107
+ "Use /model command to select your preferred model from the configured list": "\u4F7F\u7528 /model \u547D\u4EE4\u4ECE\u914D\u7F6E\u5217\u8868\u4E2D\u9009\u62E9\u60A8\u504F\u597D\u7684\u6A21\u578B",
302108
+ "Supported auth types: openai, anthropic, gemini, vertex-ai, etc.": "\u652F\u6301\u7684\u8BA4\u8BC1\u7C7B\u578B\uFF1Aopenai\u3001anthropic\u3001gemini\u3001vertex-ai \u7B49",
302109
+ // ============================================================================
302110
+ // Auth Dialog - View Titles and Labels
302111
+ // ============================================================================
302112
+ "API-KEY": "API-KEY",
302113
+ "Coding Plan": "Coding Plan",
302114
+ Custom: "\u81EA\u5B9A\u4E49",
302115
+ "Select API-KEY configuration mode:": "\u9009\u62E9 API-KEY \u914D\u7F6E\u6A21\u5F0F\uFF1A",
302116
+ "(Press Escape to go back)": "(\u6309 Escape \u952E\u8FD4\u56DE)",
302117
+ "(Press Enter to submit, Escape to cancel)": "(\u6309 Enter \u63D0\u4EA4\uFF0CEscape \u53D6\u6D88)"
302068
302118
  };
302069
302119
  }
302070
302120
  });
@@ -337572,7 +337622,7 @@ var require_react_is_development = __commonJS({
337572
337622
  var ContextProvider = REACT_PROVIDER_TYPE;
337573
337623
  var Element2 = REACT_ELEMENT_TYPE;
337574
337624
  var ForwardRef = REACT_FORWARD_REF_TYPE;
337575
- var Fragment15 = REACT_FRAGMENT_TYPE;
337625
+ var Fragment16 = REACT_FRAGMENT_TYPE;
337576
337626
  var Lazy = REACT_LAZY_TYPE;
337577
337627
  var Memo = REACT_MEMO_TYPE;
337578
337628
  var Portal = REACT_PORTAL_TYPE;
@@ -337644,7 +337694,7 @@ var require_react_is_development = __commonJS({
337644
337694
  exports2.ContextProvider = ContextProvider;
337645
337695
  exports2.Element = Element2;
337646
337696
  exports2.ForwardRef = ForwardRef;
337647
- exports2.Fragment = Fragment15;
337697
+ exports2.Fragment = Fragment16;
337648
337698
  exports2.Lazy = Lazy;
337649
337699
  exports2.Memo = Memo;
337650
337700
  exports2.Portal = Portal;
@@ -373111,7 +373161,7 @@ __name(getPackageJson, "getPackageJson");
373111
373161
  // packages/cli/src/utils/version.ts
373112
373162
  async function getCliVersion() {
373113
373163
  const pkgJson = await getPackageJson();
373114
- return "0.10.0-preview.3";
373164
+ return "0.10.0-preview.4";
373115
373165
  }
373116
373166
  __name(getCliVersion, "getCliVersion");
373117
373167
 
@@ -380634,7 +380684,7 @@ var formatDuration = /* @__PURE__ */ __name((milliseconds) => {
380634
380684
 
380635
380685
  // packages/cli/src/generated/git-commit.ts
380636
380686
  init_esbuild_shims();
380637
- var GIT_COMMIT_INFO = "4ee4bd08";
380687
+ var GIT_COMMIT_INFO = "3f4cd8cb";
380638
380688
 
380639
380689
  // packages/cli/src/utils/systemInfo.ts
380640
380690
  async function getNpmVersion() {
@@ -387351,19 +387401,6 @@ async function buildSystemMessage(config2, sessionId, permissionMode, allowedBui
387351
387401
  return systemMessage;
387352
387402
  }
387353
387403
  __name(buildSystemMessage, "buildSystemMessage");
387354
- function isMcpToolProgressData(output) {
387355
- return typeof output === "object" && output !== null && "type" in output && output.type === "mcp_tool_progress";
387356
- }
387357
- __name(isMcpToolProgressData, "isMcpToolProgressData");
387358
- function createToolProgressHandler(request4, adapter) {
387359
- const handler = /* @__PURE__ */ __name((_callId, output) => {
387360
- if (isMcpToolProgressData(output)) {
387361
- adapter.emitToolProgress(request4, output);
387362
- }
387363
- }, "handler");
387364
- return { handler };
387365
- }
387366
- __name(createToolProgressHandler, "createToolProgressHandler");
387367
387404
  function createTaskToolProgressHandler(config2, taskToolCallId, adapter) {
387368
387405
  const previousTaskStates = /* @__PURE__ */ new Map();
387369
387406
  const emittedToolUseIds = /* @__PURE__ */ new Set();
@@ -388196,16 +388233,6 @@ ${event.value}`, null);
388196
388233
  };
388197
388234
  this.emitMessageImpl(systemMessage);
388198
388235
  }
388199
- /**
388200
- * Emits a tool progress stream event.
388201
- * Default implementation is a no-op. StreamJsonOutputAdapter overrides this
388202
- * to emit stream events when includePartialMessages is enabled.
388203
- *
388204
- * @param _request - Tool call request info
388205
- * @param _progress - Structured MCP progress data
388206
- */
388207
- emitToolProgress(_request, _progress) {
388208
- }
388209
388236
  /**
388210
388237
  * Builds a result message from options.
388211
388238
  * Helper method used by both emitResult implementations.
@@ -388585,27 +388612,6 @@ var StreamJsonOutputAdapter = class extends BaseJsonOutputAdapter {
388585
388612
  );
388586
388613
  }
388587
388614
  }
388588
- /**
388589
- * Emits a tool progress stream event when partial messages are enabled.
388590
- * This overrides the no-op in BaseJsonOutputAdapter.
388591
- */
388592
- emitToolProgress(request4, progress) {
388593
- if (!this.includePartialMessages) {
388594
- return;
388595
- }
388596
- const partial2 = {
388597
- type: "stream_event",
388598
- uuid: randomUUID8(),
388599
- session_id: this.getSessionId(),
388600
- parent_tool_use_id: null,
388601
- event: {
388602
- type: "tool_progress",
388603
- tool_use_id: request4.callId,
388604
- content: progress
388605
- }
388606
- };
388607
- this.emitMessageImpl(partial2);
388608
- }
388609
388615
  /**
388610
388616
  * Emits stream events when partial messages are enabled.
388611
388617
  * This is a private method specific to StreamJsonOutputAdapter.
@@ -389095,21 +389101,24 @@ async function runNonInteractive(config2, settings, input, prompt_id, options2 =
389095
389101
  const inputFormat = typeof config2.getInputFormat === "function" ? config2.getInputFormat() : InputFormat.TEXT;
389096
389102
  const toolCallUpdateCallback = inputFormat === InputFormat.STREAM_JSON && options2.controlService ? options2.controlService.permission.getToolCallUpdateCallback() : void 0;
389097
389103
  const isTaskTool = finalRequestInfo.name === "task";
389098
- const { handler: outputUpdateHandler } = isTaskTool ? createTaskToolProgressHandler(
389104
+ const taskToolProgress = isTaskTool ? createTaskToolProgressHandler(
389099
389105
  config2,
389100
389106
  finalRequestInfo.callId,
389101
389107
  adapter
389102
- ) : createToolProgressHandler(finalRequestInfo, adapter);
389108
+ ) : void 0;
389109
+ const taskToolProgressHandler = taskToolProgress?.handler;
389103
389110
  const toolResponse = await executeToolCall(
389104
389111
  config2,
389105
389112
  finalRequestInfo,
389106
389113
  abortController.signal,
389107
- {
389108
- outputUpdateHandler,
389114
+ taskToolProgressHandler || toolCallUpdateCallback ? {
389115
+ ...taskToolProgressHandler && {
389116
+ outputUpdateHandler: taskToolProgressHandler
389117
+ },
389109
389118
  ...toolCallUpdateCallback && {
389110
389119
  onToolCallsUpdate: toolCallUpdateCallback
389111
389120
  }
389112
- }
389121
+ } : void 0
389113
389122
  );
389114
389123
  if (toolResponse.error) {
389115
389124
  handleToolError(
@@ -412929,15 +412938,6 @@ var useResultDisplayRenderer = /* @__PURE__ */ __name((resultDisplay) => import_
412929
412938
  data: resultDisplay
412930
412939
  };
412931
412940
  }
412932
- if (typeof resultDisplay === "object" && resultDisplay !== null && "type" in resultDisplay && resultDisplay.type === "mcp_tool_progress") {
412933
- const progress = resultDisplay;
412934
- const msg = progress.message ?? `Progress: ${progress.progress}`;
412935
- const totalStr = progress.total != null ? `/${progress.total}` : "";
412936
- return {
412937
- type: "string",
412938
- data: `\u23F3 [${progress.progress}${totalStr}] ${msg}`
412939
- };
412940
- }
412941
412941
  if (typeof resultDisplay === "object" && resultDisplay !== null && "ansiOutput" in resultDisplay) {
412942
412942
  return { type: "ansi", data: resultDisplay.ansiOutput };
412943
412943
  }
@@ -415132,9 +415132,10 @@ var import_jsx_runtime63 = __toESM(require_jsx_runtime(), 1);
415132
415132
  var AppHeader = /* @__PURE__ */ __name(({ version: version2 }) => {
415133
415133
  const settings = useSettings();
415134
415134
  const config2 = useConfig();
415135
+ const uiState = useUIState();
415135
415136
  const contentGeneratorConfig = config2.getContentGeneratorConfig();
415136
415137
  const authType = contentGeneratorConfig?.authType;
415137
- const model = config2.getModel();
415138
+ const model = uiState.currentModel;
415138
415139
  const targetDir = config2.getTargetDir();
415139
415140
  const showBanner = !config2.getScreenReader();
415140
415141
  const showTips = !(settings.merged.ui?.hideTips || config2.getScreenReader());
@@ -415209,7 +415210,7 @@ var MainContent = /* @__PURE__ */ __name(() => {
415209
415210
  ],
415210
415211
  children: (item) => item
415211
415212
  },
415212
- uiState.historyRemountKey
415213
+ `${uiState.historyRemountKey}-${uiState.currentModel}`
415213
415214
  ),
415214
415215
  /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(OverflowProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(Box_default, { flexDirection: "column", children: [
415215
415216
  pendingHistoryItems.map((item, i3) => /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
@@ -417468,13 +417469,47 @@ __name(QwenOAuthProgress, "QwenOAuthProgress");
417468
417469
  init_esbuild_shims();
417469
417470
  var import_react81 = __toESM(require_react(), 1);
417470
417471
 
417472
+ // packages/cli/src/ui/components/ApiKeyInput.tsx
417473
+ init_esbuild_shims();
417474
+ var import_react79 = __toESM(require_react(), 1);
417475
+ var import_jsx_runtime79 = __toESM(require_jsx_runtime(), 1);
417476
+ function ApiKeyInput({
417477
+ onSubmit,
417478
+ onCancel
417479
+ }) {
417480
+ const [apiKey, setApiKey] = (0, import_react79.useState)("");
417481
+ const [error2, setError] = (0, import_react79.useState)(null);
417482
+ useKeypress(
417483
+ (key) => {
417484
+ if (key.name === "escape") {
417485
+ onCancel();
417486
+ } else if (key.name === "return") {
417487
+ const trimmedKey = apiKey.trim();
417488
+ if (!trimmedKey) {
417489
+ setError(t4("API key cannot be empty."));
417490
+ return;
417491
+ }
417492
+ onSubmit(trimmedKey);
417493
+ }
417494
+ },
417495
+ { isActive: true }
417496
+ );
417497
+ return /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(Box_default, { flexDirection: "column", children: [
417498
+ /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Box_default, { marginBottom: 1, children: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Text3, { children: t4("Please enter your API key:") }) }),
417499
+ /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(TextInput, { value: apiKey, onChange: setApiKey, placeholder: "sk-..." }),
417500
+ error2 && /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Text3, { color: Colors.AccentRed, children: error2 }) }),
417501
+ /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Text3, { color: Colors.Gray, children: t4("(Press Enter to submit, Escape to cancel)") }) })
417502
+ ] });
417503
+ }
417504
+ __name(ApiKeyInput, "ApiKeyInput");
417505
+
417471
417506
  // packages/cli/src/ui/contexts/UIActionsContext.tsx
417472
417507
  init_esbuild_shims();
417473
417508
  var import_react80 = __toESM(require_react(), 1);
417474
417509
 
417475
417510
  // packages/cli/src/ui/components/ModelSwitchDialog.tsx
417476
417511
  init_esbuild_shims();
417477
- var import_jsx_runtime79 = __toESM(require_jsx_runtime(), 1);
417512
+ var import_jsx_runtime80 = __toESM(require_jsx_runtime(), 1);
417478
417513
  var ModelSwitchDialog = /* @__PURE__ */ __name(({
417479
417514
  onSelect
417480
417515
  }) => {
@@ -417506,7 +417541,7 @@ var ModelSwitchDialog = /* @__PURE__ */ __name(({
417506
417541
  const handleSelect = /* @__PURE__ */ __name((outcome) => {
417507
417542
  onSelect(outcome);
417508
417543
  }, "handleSelect");
417509
- return /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(
417544
+ return /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(
417510
417545
  Box_default,
417511
417546
  {
417512
417547
  flexDirection: "column",
@@ -417516,12 +417551,12 @@ var ModelSwitchDialog = /* @__PURE__ */ __name(({
417516
417551
  width: "100%",
417517
417552
  marginLeft: 1,
417518
417553
  children: [
417519
- /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(Box_default, { flexDirection: "column", marginBottom: 1, children: [
417520
- /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Text3, { bold: true, children: "Vision Model Switch Required" }),
417521
- /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Text3, { children: "Your message contains an image, but the current model doesn't support vision." }),
417522
- /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Text3, { children: "How would you like to proceed?" })
417554
+ /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(Box_default, { flexDirection: "column", marginBottom: 1, children: [
417555
+ /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Text3, { bold: true, children: "Vision Model Switch Required" }),
417556
+ /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Text3, { children: "Your message contains an image, but the current model doesn't support vision." }),
417557
+ /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Text3, { children: "How would you like to proceed?" })
417523
417558
  ] }),
417524
- /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Box_default, { marginBottom: 1, children: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
417559
+ /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Box_default, { marginBottom: 1, children: /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
417525
417560
  RadioButtonSelect,
417526
417561
  {
417527
417562
  items: options2,
@@ -417530,209 +417565,12 @@ var ModelSwitchDialog = /* @__PURE__ */ __name(({
417530
417565
  isFocused: true
417531
417566
  }
417532
417567
  ) }),
417533
- /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Box_default, { children: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Text3, { color: Colors.Gray, children: "Press Enter to select, Esc to cancel" }) })
417568
+ /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Box_default, { children: /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Text3, { color: Colors.Gray, children: "Press Enter to select, Esc to cancel" }) })
417534
417569
  ]
417535
417570
  }
417536
417571
  );
417537
417572
  }, "ModelSwitchDialog");
417538
417573
 
417539
- // packages/cli/src/ui/components/OpenAIKeyPrompt.tsx
417540
- init_esbuild_shims();
417541
- var import_react79 = __toESM(require_react(), 1);
417542
- init_zod();
417543
- var import_jsx_runtime80 = __toESM(require_jsx_runtime(), 1);
417544
- var credentialSchema = external_exports.object({
417545
- apiKey: external_exports.string().min(1, "API key is required"),
417546
- baseUrl: external_exports.union([external_exports.string().url("Base URL must be a valid URL"), external_exports.literal("")]).optional(),
417547
- model: external_exports.string().min(1, "Model must be a non-empty string").optional()
417548
- });
417549
- function OpenAIKeyPrompt({
417550
- onSubmit,
417551
- onCancel,
417552
- defaultApiKey,
417553
- defaultBaseUrl,
417554
- defaultModel
417555
- }) {
417556
- const [apiKey, setApiKey] = (0, import_react79.useState)(defaultApiKey || "");
417557
- const [baseUrl, setBaseUrl] = (0, import_react79.useState)(defaultBaseUrl || "");
417558
- const [model, setModel] = (0, import_react79.useState)(defaultModel || "");
417559
- const [currentField, setCurrentField] = (0, import_react79.useState)("apiKey");
417560
- const [validationError, setValidationError] = (0, import_react79.useState)(null);
417561
- const validateAndSubmit = /* @__PURE__ */ __name(() => {
417562
- setValidationError(null);
417563
- try {
417564
- const validated = credentialSchema.parse({
417565
- apiKey: apiKey.trim(),
417566
- baseUrl: baseUrl.trim() || void 0,
417567
- model: model.trim() || void 0
417568
- });
417569
- onSubmit(
417570
- validated.apiKey,
417571
- validated.baseUrl === "" ? "" : validated.baseUrl || "",
417572
- validated.model || ""
417573
- );
417574
- } catch (error2) {
417575
- if (error2 instanceof external_exports.ZodError) {
417576
- const errorMessage = error2.errors.map((e4) => `${e4.path.join(".")}: ${e4.message}`).join(", ");
417577
- setValidationError(
417578
- t4("Invalid credentials: {{errorMessage}}", { errorMessage })
417579
- );
417580
- } else {
417581
- setValidationError(t4("Failed to validate credentials"));
417582
- }
417583
- }
417584
- }, "validateAndSubmit");
417585
- useKeypress(
417586
- (key) => {
417587
- if (key.name === "escape") {
417588
- onCancel();
417589
- return;
417590
- }
417591
- if (key.name === "return") {
417592
- if (currentField === "apiKey") {
417593
- setCurrentField("baseUrl");
417594
- return;
417595
- } else if (currentField === "baseUrl") {
417596
- setCurrentField("model");
417597
- return;
417598
- } else if (currentField === "model") {
417599
- if (apiKey.trim()) {
417600
- validateAndSubmit();
417601
- } else {
417602
- setCurrentField("apiKey");
417603
- }
417604
- }
417605
- return;
417606
- }
417607
- if (key.name === "tab") {
417608
- if (currentField === "apiKey") {
417609
- setCurrentField("baseUrl");
417610
- } else if (currentField === "baseUrl") {
417611
- setCurrentField("model");
417612
- } else if (currentField === "model") {
417613
- setCurrentField("apiKey");
417614
- }
417615
- return;
417616
- }
417617
- if (key.name === "up") {
417618
- if (currentField === "baseUrl") {
417619
- setCurrentField("apiKey");
417620
- } else if (currentField === "model") {
417621
- setCurrentField("baseUrl");
417622
- }
417623
- return;
417624
- }
417625
- if (key.name === "down") {
417626
- if (currentField === "apiKey") {
417627
- setCurrentField("baseUrl");
417628
- } else if (currentField === "baseUrl") {
417629
- setCurrentField("model");
417630
- }
417631
- return;
417632
- }
417633
- if (key.name === "backspace" || key.name === "delete") {
417634
- if (currentField === "apiKey") {
417635
- setApiKey((prev) => prev.slice(0, -1));
417636
- } else if (currentField === "baseUrl") {
417637
- setBaseUrl((prev) => prev.slice(0, -1));
417638
- } else if (currentField === "model") {
417639
- setModel((prev) => prev.slice(0, -1));
417640
- }
417641
- return;
417642
- }
417643
- if (key.paste && key.sequence) {
417644
- let cleanInput = key.sequence.replace(/\u001b\[[0-9;]*[a-zA-Z]/g, "").replace(/\[200~/g, "").replace(/\[201~/g, "").replace(/^\[|~$/g, "");
417645
- cleanInput = cleanInput.split("").filter((ch) => ch.charCodeAt(0) >= 32).join("");
417646
- if (cleanInput.length > 0) {
417647
- if (currentField === "apiKey") {
417648
- setApiKey((prev) => prev + cleanInput);
417649
- } else if (currentField === "baseUrl") {
417650
- setBaseUrl((prev) => prev + cleanInput);
417651
- } else if (currentField === "model") {
417652
- setModel((prev) => prev + cleanInput);
417653
- }
417654
- }
417655
- return;
417656
- }
417657
- if (key.sequence && !key.ctrl && !key.meta) {
417658
- const cleanInput = key.sequence.split("").filter((ch) => ch.charCodeAt(0) >= 32).join("");
417659
- if (cleanInput.length > 0) {
417660
- if (currentField === "apiKey") {
417661
- setApiKey((prev) => prev + cleanInput);
417662
- } else if (currentField === "baseUrl") {
417663
- setBaseUrl((prev) => prev + cleanInput);
417664
- } else if (currentField === "model") {
417665
- setModel((prev) => prev + cleanInput);
417666
- }
417667
- }
417668
- }
417669
- },
417670
- { isActive: true }
417671
- );
417672
- return /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(
417673
- Box_default,
417674
- {
417675
- borderStyle: "round",
417676
- borderColor: Colors.AccentBlue,
417677
- flexDirection: "column",
417678
- padding: 1,
417679
- width: "100%",
417680
- children: [
417681
- /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Text3, { bold: true, color: Colors.AccentBlue, children: t4("OpenAI Configuration Required") }),
417682
- validationError && /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Text3, { color: Colors.AccentRed, children: validationError }) }),
417683
- /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(Text3, { children: [
417684
- t4(
417685
- "Please enter your OpenAI configuration. You can get an API key from"
417686
- ),
417687
- " ",
417688
- /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Text3, { color: Colors.AccentBlue, children: "https://bailian.console.aliyun.com/?tab=model#/api-key" })
417689
- ] }) }),
417690
- /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(Box_default, { marginTop: 1, flexDirection: "row", children: [
417691
- /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Box_default, { width: 12, children: /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
417692
- Text3,
417693
- {
417694
- color: currentField === "apiKey" ? Colors.AccentBlue : Colors.Gray,
417695
- children: t4("API Key:")
417696
- }
417697
- ) }),
417698
- /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Box_default, { flexGrow: 1, children: /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(Text3, { children: [
417699
- currentField === "apiKey" ? "> " : " ",
417700
- apiKey || " "
417701
- ] }) })
417702
- ] }),
417703
- /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(Box_default, { marginTop: 1, flexDirection: "row", children: [
417704
- /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Box_default, { width: 12, children: /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
417705
- Text3,
417706
- {
417707
- color: currentField === "baseUrl" ? Colors.AccentBlue : Colors.Gray,
417708
- children: t4("Base URL:")
417709
- }
417710
- ) }),
417711
- /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Box_default, { flexGrow: 1, children: /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(Text3, { children: [
417712
- currentField === "baseUrl" ? "> " : " ",
417713
- baseUrl
417714
- ] }) })
417715
- ] }),
417716
- /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(Box_default, { marginTop: 1, flexDirection: "row", children: [
417717
- /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Box_default, { width: 12, children: /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
417718
- Text3,
417719
- {
417720
- color: currentField === "model" ? Colors.AccentBlue : Colors.Gray,
417721
- children: t4("Model:")
417722
- }
417723
- ) }),
417724
- /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Box_default, { flexGrow: 1, children: /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(Text3, { children: [
417725
- currentField === "model" ? "> " : " ",
417726
- model
417727
- ] }) })
417728
- ] }),
417729
- /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(Text3, { color: Colors.Gray, children: t4("Press Enter to continue, Tab/\u2191\u2193 to navigate, Esc to cancel") }) })
417730
- ]
417731
- }
417732
- );
417733
- }
417734
- __name(OpenAIKeyPrompt, "OpenAIKeyPrompt");
417735
-
417736
417574
  // packages/cli/src/ui/contexts/UIActionsContext.tsx
417737
417575
  var UIActionsContext = (0, import_react80.createContext)(null);
417738
417576
  var useUIActions = /* @__PURE__ */ __name(() => {
@@ -417754,25 +417592,39 @@ function parseDefaultAuthType(defaultAuthType) {
417754
417592
  __name(parseDefaultAuthType, "parseDefaultAuthType");
417755
417593
  function AuthDialog() {
417756
417594
  const { pendingAuthType, authError } = useUIState();
417757
- const { handleAuthSelect: onAuthSelect } = useUIActions();
417595
+ const { handleAuthSelect: onAuthSelect, handleCodingPlanSubmit } = useUIActions();
417758
417596
  const config2 = useConfig();
417759
417597
  const [errorMessage, setErrorMessage] = (0, import_react81.useState)(null);
417760
417598
  const [selectedIndex, setSelectedIndex] = (0, import_react81.useState)(null);
417761
- const items = [
417599
+ const [viewLevel, setViewLevel] = (0, import_react81.useState)("main");
417600
+ const [apiKeySubModeIndex, setApiKeySubModeIndex] = (0, import_react81.useState)(0);
417601
+ const mainItems = [
417762
417602
  {
417763
417603
  key: AuthType2.QWEN_OAUTH,
417764
417604
  label: t4("Qwen OAuth"),
417765
417605
  value: AuthType2.QWEN_OAUTH
417766
417606
  },
417767
417607
  {
417768
- key: AuthType2.USE_OPENAI,
417769
- label: t4("OpenAI"),
417770
- value: AuthType2.USE_OPENAI
417608
+ key: "API-KEY",
417609
+ label: t4("API-KEY"),
417610
+ value: "API-KEY"
417611
+ }
417612
+ ];
417613
+ const apiKeySubItems = [
417614
+ {
417615
+ key: "coding-plan",
417616
+ label: t4("Coding Plan"),
417617
+ value: "coding-plan"
417618
+ },
417619
+ {
417620
+ key: "custom",
417621
+ label: t4("Custom"),
417622
+ value: "custom"
417771
417623
  }
417772
417624
  ];
417773
417625
  const initialAuthIndex = Math.max(
417774
417626
  0,
417775
- items.findIndex((item) => {
417627
+ mainItems.findIndex((item) => {
417776
417628
  if (pendingAuthType) {
417777
417629
  return item.value === pendingAuthType;
417778
417630
  }
@@ -417790,18 +417642,50 @@ function AuthDialog() {
417790
417642
  })
417791
417643
  );
417792
417644
  const hasApiKey = Boolean(config2.getContentGeneratorConfig()?.apiKey);
417793
- const currentSelectedAuthType = selectedIndex !== null ? items[selectedIndex]?.value : items[initialAuthIndex]?.value;
417794
- const handleAuthSelect = /* @__PURE__ */ __name(async (authMethod) => {
417645
+ const currentSelectedAuthType = selectedIndex !== null ? mainItems[selectedIndex]?.value : mainItems[initialAuthIndex]?.value;
417646
+ const handleMainSelect = /* @__PURE__ */ __name(async (value) => {
417795
417647
  setErrorMessage(null);
417796
- await onAuthSelect(authMethod);
417797
- }, "handleAuthSelect");
417798
- const handleHighlight = /* @__PURE__ */ __name((authMethod) => {
417799
- const index = items.findIndex((item) => item.value === authMethod);
417800
- setSelectedIndex(index);
417801
- }, "handleHighlight");
417648
+ if (value === "API-KEY") {
417649
+ setViewLevel("api-key-sub");
417650
+ return;
417651
+ }
417652
+ await onAuthSelect(value);
417653
+ }, "handleMainSelect");
417654
+ const handleApiKeySubSelect = /* @__PURE__ */ __name(async (subMode) => {
417655
+ setErrorMessage(null);
417656
+ if (subMode === "coding-plan") {
417657
+ setViewLevel("api-key-input");
417658
+ } else {
417659
+ setViewLevel("custom-info");
417660
+ }
417661
+ }, "handleApiKeySubSelect");
417662
+ const handleApiKeyInputSubmit = /* @__PURE__ */ __name(async (apiKey) => {
417663
+ setErrorMessage(null);
417664
+ if (!apiKey.trim()) {
417665
+ setErrorMessage(t4("API key cannot be empty."));
417666
+ return;
417667
+ }
417668
+ await handleCodingPlanSubmit(apiKey);
417669
+ }, "handleApiKeyInputSubmit");
417670
+ const handleGoBack = /* @__PURE__ */ __name(() => {
417671
+ setErrorMessage(null);
417672
+ if (viewLevel === "api-key-sub") {
417673
+ setViewLevel("main");
417674
+ } else if (viewLevel === "api-key-input" || viewLevel === "custom-info") {
417675
+ setViewLevel("api-key-sub");
417676
+ }
417677
+ }, "handleGoBack");
417802
417678
  useKeypress(
417803
417679
  (key) => {
417804
417680
  if (key.name === "escape") {
417681
+ if (viewLevel === "api-key-sub") {
417682
+ handleGoBack();
417683
+ return;
417684
+ }
417685
+ if (viewLevel === "api-key-input" || viewLevel === "custom-info") {
417686
+ handleGoBack();
417687
+ return;
417688
+ }
417805
417689
  if (errorMessage) {
417806
417690
  return;
417807
417691
  }
@@ -417818,6 +417702,88 @@ function AuthDialog() {
417818
417702
  },
417819
417703
  { isActive: true }
417820
417704
  );
417705
+ const renderMainView = /* @__PURE__ */ __name(() => /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(import_jsx_runtime81.Fragment, { children: [
417706
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { children: t4("How would you like to authenticate for this project?") }) }),
417707
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
417708
+ RadioButtonSelect,
417709
+ {
417710
+ items: mainItems,
417711
+ initialIndex: initialAuthIndex,
417712
+ onSelect: handleMainSelect,
417713
+ onHighlight: (value) => {
417714
+ const index = mainItems.findIndex((item) => item.value === value);
417715
+ setSelectedIndex(index);
417716
+ }
417717
+ }
417718
+ ) })
417719
+ ] }), "renderMainView");
417720
+ const renderApiKeySubView = /* @__PURE__ */ __name(() => /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(import_jsx_runtime81.Fragment, { children: [
417721
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { children: t4("Select API-KEY configuration mode:") }) }),
417722
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
417723
+ RadioButtonSelect,
417724
+ {
417725
+ items: apiKeySubItems,
417726
+ initialIndex: apiKeySubModeIndex,
417727
+ onSelect: handleApiKeySubSelect,
417728
+ onHighlight: (value) => {
417729
+ const index = apiKeySubItems.findIndex(
417730
+ (item) => item.value === value
417731
+ );
417732
+ setApiKeySubModeIndex(index);
417733
+ }
417734
+ }
417735
+ ) }),
417736
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { color: Colors.Gray, children: t4("(Press Escape to go back)") }) })
417737
+ ] }), "renderApiKeySubView");
417738
+ const renderApiKeyInputView = /* @__PURE__ */ __name(() => /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ApiKeyInput, { onSubmit: handleApiKeyInputSubmit, onCancel: handleGoBack }) }), "renderApiKeyInputView");
417739
+ const renderCustomInfoView = /* @__PURE__ */ __name(() => /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(import_jsx_runtime81.Fragment, { children: [
417740
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { bold: true, children: t4("Custom API-KEY Configuration") }) }),
417741
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { children: t4("For advanced users who want to configure models manually.") }) }),
417742
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { children: t4("Please configure your models in settings.json:") }) }),
417743
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, paddingLeft: 2, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(Text3, { color: Colors.AccentYellow, children: [
417744
+ "1. ",
417745
+ t4("Set API key via environment variable (e.g., OPENAI_API_KEY)")
417746
+ ] }) }),
417747
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 0, paddingLeft: 2, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(Text3, { color: Colors.AccentYellow, children: [
417748
+ "2.",
417749
+ " ",
417750
+ t4(
417751
+ "Add model configuration to modelProviders['openai'] (or other auth types)"
417752
+ )
417753
+ ] }) }),
417754
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 0, paddingLeft: 2, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(Text3, { color: Colors.AccentYellow, children: [
417755
+ "3.",
417756
+ " ",
417757
+ t4(
417758
+ "Each provider needs: id, envKey (required), plus optional baseUrl, generationConfig"
417759
+ )
417760
+ ] }) }),
417761
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 0, paddingLeft: 2, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(Text3, { color: Colors.AccentYellow, children: [
417762
+ "4.",
417763
+ " ",
417764
+ t4(
417765
+ "Use /model command to select your preferred model from the configured list"
417766
+ )
417767
+ ] }) }),
417768
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { color: Colors.Gray, children: t4(
417769
+ "Supported auth types: openai, anthropic, gemini, vertex-ai, etc."
417770
+ ) }) }),
417771
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { color: Colors.Gray, children: t4("(Press Escape to go back)") }) })
417772
+ ] }), "renderCustomInfoView");
417773
+ const getViewTitle = /* @__PURE__ */ __name(() => {
417774
+ switch (viewLevel) {
417775
+ case "main":
417776
+ return t4("Get started");
417777
+ case "api-key-sub":
417778
+ return t4("API-KEY Configuration");
417779
+ case "api-key-input":
417780
+ return t4("Coding Plan Setup");
417781
+ case "custom-info":
417782
+ return t4("Custom Configuration");
417783
+ default:
417784
+ return t4("Get started");
417785
+ }
417786
+ }, "getViewTitle");
417821
417787
  return /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(
417822
417788
  Box_default,
417823
417789
  {
@@ -417827,24 +417793,20 @@ function AuthDialog() {
417827
417793
  padding: 1,
417828
417794
  width: "100%",
417829
417795
  children: [
417830
- /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { bold: true, children: t4("Get started") }),
417831
- /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { children: t4("How would you like to authenticate for this project?") }) }),
417832
- /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
417833
- RadioButtonSelect,
417834
- {
417835
- items,
417836
- initialIndex: initialAuthIndex,
417837
- onSelect: handleAuthSelect,
417838
- onHighlight: handleHighlight
417839
- }
417840
- ) }),
417796
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { bold: true, children: getViewTitle() }),
417797
+ viewLevel === "main" && renderMainView(),
417798
+ viewLevel === "api-key-sub" && renderApiKeySubView(),
417799
+ viewLevel === "api-key-input" && renderApiKeyInputView(),
417800
+ viewLevel === "custom-info" && renderCustomInfoView(),
417841
417801
  (authError || errorMessage) && /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { color: Colors.AccentRed, children: authError || errorMessage }) }),
417842
- /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { color: Colors.AccentPurple, children: t4("(Use Enter to Set Auth)") }) }),
417843
- hasApiKey && currentSelectedAuthType === AuthType2.QWEN_OAUTH && /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { color: Colors.Gray, children: t4(
417844
- "Note: Your existing API key in settings.json will not be cleared when using Qwen OAuth. You can switch back to OpenAI authentication later if needed."
417845
- ) }) }),
417846
- /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { children: t4("Terms of Services and Privacy Notice for Qwen Code") }) }),
417847
- /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { color: Colors.AccentBlue, children: "https://github.com/QwenLM/Qwen3-Coder/blob/main/README.md" }) })
417802
+ viewLevel === "main" && /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(import_jsx_runtime81.Fragment, { children: [
417803
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { color: Colors.AccentPurple, children: t4("(Use Enter to Set Auth)") }) }),
417804
+ hasApiKey && currentSelectedAuthType === AuthType2.QWEN_OAUTH && /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { color: Colors.Gray, children: t4(
417805
+ "Note: Your existing API key in settings.json will not be cleared when using Qwen OAuth. You can switch back to OpenAI authentication later if needed."
417806
+ ) }) }),
417807
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { children: t4("Terms of Services and Privacy Notice for Qwen Code") }) }),
417808
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Text3, { color: Colors.AccentBlue, children: "https://github.com/QwenLM/Qwen3-Coder/blob/main/README.md" }) })
417809
+ ] })
417848
417810
  ]
417849
417811
  }
417850
417812
  );
@@ -419254,15 +419216,6 @@ var DialogManager = /* @__PURE__ */ __name(({
419254
419216
  const uiState = useUIState();
419255
419217
  const uiActions = useUIActions();
419256
419218
  const { constrainHeight, terminalHeight, staticExtraHeight, mainAreaWidth } = uiState;
419257
- const getDefaultOpenAIConfig = /* @__PURE__ */ __name(() => {
419258
- const fromSettings = settings.merged.security?.auth;
419259
- const modelSettings = settings.merged.model;
419260
- return {
419261
- apiKey: fromSettings?.apiKey || process35.env["OPENAI_API_KEY"] || "",
419262
- baseUrl: fromSettings?.baseUrl || process35.env["OPENAI_BASE_URL"] || "",
419263
- model: modelSettings?.name || process35.env["OPENAI_MODEL"] || ""
419264
- };
419265
- }, "getDefaultOpenAIConfig");
419266
419219
  if (uiState.showWelcomeBackDialog && uiState.welcomeBackInfo?.hasHistory) {
419267
419220
  return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
419268
419221
  WelcomeBackDialog,
@@ -419436,28 +419389,6 @@ var DialogManager = /* @__PURE__ */ __name(({
419436
419389
  return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(Box_default, { flexDirection: "column", children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(AuthDialog, {}) });
419437
419390
  }
419438
419391
  if (uiState.isAuthenticating) {
419439
- if (uiState.pendingAuthType === AuthType2.USE_OPENAI) {
419440
- const defaults3 = getDefaultOpenAIConfig();
419441
- return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
419442
- OpenAIKeyPrompt,
419443
- {
419444
- onSubmit: (apiKey, baseUrl, model) => {
419445
- uiActions.handleAuthSelect(AuthType2.USE_OPENAI, {
419446
- apiKey,
419447
- baseUrl,
419448
- model
419449
- });
419450
- },
419451
- onCancel: () => {
419452
- uiActions.cancelAuthentication();
419453
- uiActions.setAuthState("updating" /* Updating */);
419454
- },
419455
- defaultApiKey: defaults3.apiKey,
419456
- defaultBaseUrl: defaults3.baseUrl,
419457
- defaultModel: defaults3.model
419458
- }
419459
- );
419460
- }
419461
419392
  if (uiState.pendingAuthType === AuthType2.QWEN_OAUTH) {
419462
419393
  return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
419463
419394
  QwenOAuthProgress,
@@ -422844,6 +422775,31 @@ var useQwenAuth = /* @__PURE__ */ __name((pendingAuthType, isAuthenticating) =>
422844
422775
  };
422845
422776
  }, "useQwenAuth");
422846
422777
 
422778
+ // packages/cli/src/constants/codingPlanTemplates.ts
422779
+ init_esbuild_shims();
422780
+ var CODING_PLAN_ENV_KEY = "BAILIAN_CODING_PLAN_API_KEY";
422781
+ var CODING_PLAN_TEMPLATE = [
422782
+ {
422783
+ id: "qwen3-coder-plus",
422784
+ name: "qwen3-coder-plur",
422785
+ baseUrl: "https://coding.dashscope.aliyuncs.com/v1",
422786
+ description: "Qwen3 Coder Plus model from Bailian Coding Plan",
422787
+ envKey: CODING_PLAN_ENV_KEY
422788
+ },
422789
+ {
422790
+ id: "qwen3-max-2026-01-23",
422791
+ name: "qwen3-max-2026-01-23",
422792
+ description: "Qwen3 Max Thinking model from Bailian Coding Plan",
422793
+ baseUrl: "https://coding.dashscope.aliyuncs.com/v1",
422794
+ envKey: CODING_PLAN_ENV_KEY,
422795
+ generationConfig: {
422796
+ extra_body: {
422797
+ enable_thinking: true
422798
+ }
422799
+ }
422800
+ }
422801
+ ];
422802
+
422847
422803
  // packages/cli/src/ui/auth/useAuth.ts
422848
422804
  var useAuthCommand = /* @__PURE__ */ __name((settings, config2, addItem, onAuthChange) => {
422849
422805
  const unAuthenticated = config2.getAuthType() === void 0;
@@ -423036,6 +422992,74 @@ var useAuthCommand = /* @__PURE__ */ __name((settings, config2, addItem, onAuthC
423036
422992
  setIsAuthDialogOpen(true);
423037
422993
  setAuthError(null);
423038
422994
  }, [isAuthenticating, pendingAuthType, cancelQwenAuth, config2]);
422995
+ const handleCodingPlanSubmit = (0, import_react103.useCallback)(
422996
+ async (apiKey) => {
422997
+ try {
422998
+ setIsAuthenticating(true);
422999
+ setAuthError(null);
423000
+ const envKeyName = CODING_PLAN_ENV_KEY;
423001
+ const persistScope = getPersistScopeForModelSelection(settings);
423002
+ settings.setValue(persistScope, `env.${envKeyName}`, apiKey);
423003
+ process.env[envKeyName] = apiKey;
423004
+ const newConfigs = CODING_PLAN_TEMPLATE.map(
423005
+ (templateConfig) => ({
423006
+ ...templateConfig,
423007
+ envKey: envKeyName
423008
+ })
423009
+ );
423010
+ const existingConfigs = settings.merged.modelProviders?.[AuthType2.USE_OPENAI] || [];
423011
+ const isDuplicate = /* @__PURE__ */ __name((config3) => existingConfigs.some(
423012
+ (existing) => existing.id === config3.id && existing.baseUrl === config3.baseUrl && existing.envKey === config3.envKey
423013
+ ), "isDuplicate");
423014
+ const uniqueNewConfigs = newConfigs.filter(
423015
+ (config3) => !isDuplicate(config3)
423016
+ );
423017
+ const updatedConfigs = [...uniqueNewConfigs, ...existingConfigs];
423018
+ settings.setValue(
423019
+ persistScope,
423020
+ `modelProviders.${AuthType2.USE_OPENAI}`,
423021
+ updatedConfigs
423022
+ );
423023
+ settings.setValue(
423024
+ persistScope,
423025
+ "security.auth.selectedType",
423026
+ AuthType2.USE_OPENAI
423027
+ );
423028
+ if (updatedConfigs.length > 0 && updatedConfigs[0]?.id) {
423029
+ settings.setValue(persistScope, "model.name", updatedConfigs[0].id);
423030
+ }
423031
+ const updatedModelProviders = {
423032
+ ...settings.merged.modelProviders,
423033
+ [AuthType2.USE_OPENAI]: updatedConfigs
423034
+ };
423035
+ config2.reloadModelProvidersConfig(updatedModelProviders);
423036
+ await config2.refreshAuth(AuthType2.USE_OPENAI);
423037
+ setAuthError(null);
423038
+ setAuthState("authenticated" /* Authenticated */);
423039
+ setIsAuthDialogOpen(false);
423040
+ setIsAuthenticating(false);
423041
+ onAuthChange?.();
423042
+ addItem(
423043
+ {
423044
+ type: "info" /* INFO */,
423045
+ text: t4(
423046
+ "Authenticated successfully with Coding Plan. API key is stored in settings.env."
423047
+ )
423048
+ },
423049
+ Date.now()
423050
+ );
423051
+ const authEvent = new AuthEvent(
423052
+ AuthType2.USE_OPENAI,
423053
+ "coding-plan",
423054
+ "success"
423055
+ );
423056
+ logAuth(config2, authEvent);
423057
+ } catch (error2) {
423058
+ handleAuthFailure(error2);
423059
+ }
423060
+ },
423061
+ [settings, config2, handleAuthFailure, addItem, onAuthChange]
423062
+ );
423039
423063
  (0, import_react103.useEffect)(() => {
423040
423064
  const defaultAuthType = process.env["QWEN_DEFAULT_AUTH_TYPE"];
423041
423065
  if (defaultAuthType && ![
@@ -423072,6 +423096,7 @@ var useAuthCommand = /* @__PURE__ */ __name((settings, config2, addItem, onAuthC
423072
423096
  pendingAuthType,
423073
423097
  qwenAuthState,
423074
423098
  handleAuthSelect,
423099
+ handleCodingPlanSubmit,
423075
423100
  openAuthDialog,
423076
423101
  cancelAuthentication
423077
423102
  };
@@ -430993,6 +431018,7 @@ var AppContainer = /* @__PURE__ */ __name((props) => {
430993
431018
  pendingAuthType,
430994
431019
  qwenAuthState,
430995
431020
  handleAuthSelect,
431021
+ handleCodingPlanSubmit,
430996
431022
  openAuthDialog,
430997
431023
  cancelAuthentication
430998
431024
  } = useAuthCommand(settings, config2, historyManager.addItem, refreshStatic);
@@ -431858,6 +431884,7 @@ ${migrationResult.failedFiles.map((f5) => ` \u2022 ${f5.file}: ${f5.error}`).jo
431858
431884
  setAuthState,
431859
431885
  onAuthError,
431860
431886
  cancelAuthentication,
431887
+ handleCodingPlanSubmit,
431861
431888
  handleEditorSelect,
431862
431889
  exitEditorDialog,
431863
431890
  closeSettingsDialog,
@@ -431902,6 +431929,7 @@ ${migrationResult.failedFiles.map((f5) => ` \u2022 ${f5.file}: ${f5.error}`).jo
431902
431929
  setAuthState,
431903
431930
  onAuthError,
431904
431931
  cancelAuthentication,
431932
+ handleCodingPlanSubmit,
431905
431933
  handleEditorSelect,
431906
431934
  exitEditorDialog,
431907
431935
  closeSettingsDialog,
@@ -434952,7 +434980,7 @@ var GeminiAgent = class {
434952
434980
  name: APPROVAL_MODE_INFO[mode].name,
434953
434981
  description: APPROVAL_MODE_INFO[mode].description
434954
434982
  }));
434955
- const version2 = "0.10.0-preview.3";
434983
+ const version2 = "0.10.0-preview.4";
434956
434984
  return {
434957
434985
  protocolVersion: PROTOCOL_VERSION,
434958
434986
  agentInfo: {