@google/gemini-cli-a2a-server 0.12.0-preview.4 → 0.13.0-nightly.20251031.c89bc30d

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.
@@ -123359,32 +123359,32 @@ var require_Meter = __commonJS({
123359
123359
  */
123360
123360
  createGauge(name4, options2) {
123361
123361
  const descriptor = (0, InstrumentDescriptor_1.createInstrumentDescriptor)(name4, MetricData_1.InstrumentType.GAUGE, options2);
123362
- const storage = this._meterSharedState.registerMetricStorage(descriptor);
123363
- return new Instruments_1.GaugeInstrument(storage, descriptor);
123362
+ const storage2 = this._meterSharedState.registerMetricStorage(descriptor);
123363
+ return new Instruments_1.GaugeInstrument(storage2, descriptor);
123364
123364
  }
123365
123365
  /**
123366
123366
  * Create a {@link Histogram} instrument.
123367
123367
  */
123368
123368
  createHistogram(name4, options2) {
123369
123369
  const descriptor = (0, InstrumentDescriptor_1.createInstrumentDescriptor)(name4, MetricData_1.InstrumentType.HISTOGRAM, options2);
123370
- const storage = this._meterSharedState.registerMetricStorage(descriptor);
123371
- return new Instruments_1.HistogramInstrument(storage, descriptor);
123370
+ const storage2 = this._meterSharedState.registerMetricStorage(descriptor);
123371
+ return new Instruments_1.HistogramInstrument(storage2, descriptor);
123372
123372
  }
123373
123373
  /**
123374
123374
  * Create a {@link Counter} instrument.
123375
123375
  */
123376
123376
  createCounter(name4, options2) {
123377
123377
  const descriptor = (0, InstrumentDescriptor_1.createInstrumentDescriptor)(name4, MetricData_1.InstrumentType.COUNTER, options2);
123378
- const storage = this._meterSharedState.registerMetricStorage(descriptor);
123379
- return new Instruments_1.CounterInstrument(storage, descriptor);
123378
+ const storage2 = this._meterSharedState.registerMetricStorage(descriptor);
123379
+ return new Instruments_1.CounterInstrument(storage2, descriptor);
123380
123380
  }
123381
123381
  /**
123382
123382
  * Create a {@link UpDownCounter} instrument.
123383
123383
  */
123384
123384
  createUpDownCounter(name4, options2) {
123385
123385
  const descriptor = (0, InstrumentDescriptor_1.createInstrumentDescriptor)(name4, MetricData_1.InstrumentType.UP_DOWN_COUNTER, options2);
123386
- const storage = this._meterSharedState.registerMetricStorage(descriptor);
123387
- return new Instruments_1.UpDownCounterInstrument(storage, descriptor);
123386
+ const storage2 = this._meterSharedState.registerMetricStorage(descriptor);
123387
+ return new Instruments_1.UpDownCounterInstrument(storage2, descriptor);
123388
123388
  }
123389
123389
  /**
123390
123390
  * Create a {@link ObservableGauge} instrument.
@@ -123870,16 +123870,16 @@ var require_MetricStorageRegistry = __commonJS({
123870
123870
  }
123871
123871
  return storages;
123872
123872
  }
123873
- register(storage) {
123874
- this._registerStorage(storage, this._sharedRegistry);
123873
+ register(storage2) {
123874
+ this._registerStorage(storage2, this._sharedRegistry);
123875
123875
  }
123876
- registerForCollector(collector, storage) {
123876
+ registerForCollector(collector, storage2) {
123877
123877
  let storageMap = this._perCollectorRegistry.get(collector);
123878
123878
  if (storageMap == null) {
123879
123879
  storageMap = /* @__PURE__ */ new Map();
123880
123880
  this._perCollectorRegistry.set(collector, storageMap);
123881
123881
  }
123882
- this._registerStorage(storage, storageMap);
123882
+ this._registerStorage(storage2, storageMap);
123883
123883
  }
123884
123884
  findOrUpdateCompatibleStorage(expectedDescriptor) {
123885
123885
  const storages = this._sharedRegistry.get(expectedDescriptor.name);
@@ -123899,14 +123899,14 @@ var require_MetricStorageRegistry = __commonJS({
123899
123899
  }
123900
123900
  return this._findOrUpdateCompatibleStorage(expectedDescriptor, storages);
123901
123901
  }
123902
- _registerStorage(storage, storageMap) {
123903
- const descriptor = storage.getInstrumentDescriptor();
123902
+ _registerStorage(storage2, storageMap) {
123903
+ const descriptor = storage2.getInstrumentDescriptor();
123904
123904
  const storages = storageMap.get(descriptor.name);
123905
123905
  if (storages === void 0) {
123906
- storageMap.set(descriptor.name, [storage]);
123906
+ storageMap.set(descriptor.name, [storage2]);
123907
123907
  return;
123908
123908
  }
123909
- storages.push(storage);
123909
+ storages.push(storage2);
123910
123910
  }
123911
123911
  _findOrUpdateCompatibleStorage(expectedDescriptor, existingStorages) {
123912
123912
  let compatibleStorage = null;
@@ -124324,9 +124324,9 @@ var require_MeterSharedState = __commonJS({
124324
124324
  }
124325
124325
  const aggregator = aggregation.createAggregator(descriptor);
124326
124326
  const cardinalityLimit = collector.selectCardinalityLimit(descriptor.type);
124327
- const storage = new MetricStorageType(descriptor, aggregator, (0, AttributesProcessor_1.createNoopAttributesProcessor)(), [collector], cardinalityLimit);
124328
- this.metricStorageRegistry.registerForCollector(collector, storage);
124329
- return storage;
124327
+ const storage2 = new MetricStorageType(descriptor, aggregator, (0, AttributesProcessor_1.createNoopAttributesProcessor)(), [collector], cardinalityLimit);
124328
+ this.metricStorageRegistry.registerForCollector(collector, storage2);
124329
+ return storage2;
124330
124330
  });
124331
124331
  storages = storages.concat(collectorStorages);
124332
124332
  }
@@ -233447,8 +233447,8 @@ var require_cache4 = __commonJS({
233447
233447
  */
233448
233448
  #queryCache(requestQuery, options2, targetStorage) {
233449
233449
  const resultList = [];
233450
- const storage = targetStorage ?? this.#relevantRequestResponseList;
233451
- for (const requestResponse of storage) {
233450
+ const storage2 = targetStorage ?? this.#relevantRequestResponseList;
233451
+ for (const requestResponse of storage2) {
233452
233452
  const [cachedRequest, cachedResponse] = requestResponse;
233453
233453
  if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options2)) {
233454
233454
  resultList.push(requestResponse);
@@ -252648,11 +252648,11 @@ var SignerExceptionMessages;
252648
252648
  var DEFAULT_SIGNING_VERSION = "v2";
252649
252649
  var SEVEN_DAYS = 7 * 24 * 60 * 60;
252650
252650
  var URLSigner = class {
252651
- constructor(auth2, bucket, file, storage = new Storage()) {
252651
+ constructor(auth2, bucket, file, storage2 = new Storage()) {
252652
252652
  this.auth = auth2;
252653
252653
  this.bucket = bucket;
252654
252654
  this.file = file;
252655
- this.storage = storage;
252655
+ this.storage = storage2;
252656
252656
  }
252657
252657
  getSignedUrl(cfg) {
252658
252658
  const expiresInSeconds = this.parseExpires(cfg.expires);
@@ -257203,7 +257203,7 @@ var Bucket = class _Bucket extends ServiceObject {
257203
257203
  getFilesStream(query) {
257204
257204
  return new Readable2();
257205
257205
  }
257206
- constructor(storage, name4, options2) {
257206
+ constructor(storage2, name4, options2) {
257207
257207
  var _a3, _b, _c, _d;
257208
257208
  options2 = options2 || {};
257209
257209
  name4 = name4.replace(/^gs:\/\//, "").replace(/\/+$/, "");
@@ -257565,14 +257565,14 @@ var Bucket = class _Bucket extends ServiceObject {
257565
257565
  }
257566
257566
  };
257567
257567
  super({
257568
- parent: storage,
257568
+ parent: storage2,
257569
257569
  baseUrl: "/b",
257570
257570
  id: name4,
257571
- createMethod: storage.createBucket.bind(storage),
257571
+ createMethod: storage2.createBucket.bind(storage2),
257572
257572
  methods
257573
257573
  });
257574
257574
  this.name = name4;
257575
- this.storage = storage;
257575
+ this.storage = storage2;
257576
257576
  this.userProject = options2.userProject;
257577
257577
  this.acl = new Acl({
257578
257578
  request: this.request.bind(this),
@@ -257585,7 +257585,7 @@ var Bucket = class _Bucket extends ServiceObject {
257585
257585
  this.crc32cGenerator = options2.crc32cGenerator || this.storage.crc32cGenerator;
257586
257586
  this.iam = new Iam(this);
257587
257587
  this.getFilesStream = import_paginator.paginator.streamify("getFiles");
257588
- this.instanceRetryValue = storage.retryOptions.autoRetry;
257588
+ this.instanceRetryValue = storage2.retryOptions.autoRetry;
257589
257589
  this.instancePreconditionOpts = options2 === null || options2 === void 0 ? void 0 : options2.preconditionOpts;
257590
257590
  }
257591
257591
  /**
@@ -260271,9 +260271,9 @@ import_paginator.paginator.extend(Bucket, "getFiles");
260271
260271
  // node_modules/@google-cloud/storage/build/esm/src/channel.js
260272
260272
  var import_promisify7 = __toESM(require_src14(), 1);
260273
260273
  var Channel = class extends ServiceObject {
260274
- constructor(storage, id, resourceId) {
260274
+ constructor(storage2, id, resourceId) {
260275
260275
  const config2 = {
260276
- parent: storage,
260276
+ parent: storage2,
260277
260277
  baseUrl: "/channels",
260278
260278
  // An ID shouldn't be included in the API requests.
260279
260279
  // RE:
@@ -260363,7 +260363,7 @@ var HmacKey = class extends ServiceObject {
260363
260363
  * const hmacKey = storage.hmacKey('access-id');
260364
260364
  * ```
260365
260365
  */
260366
- constructor(storage, accessId, options2) {
260366
+ constructor(storage2, accessId, options2) {
260367
260367
  const methods = {
260368
260368
  /**
260369
260369
  * @typedef {object} DeleteHmacKeyOptions
@@ -260601,15 +260601,15 @@ var HmacKey = class extends ServiceObject {
260601
260601
  }
260602
260602
  }
260603
260603
  };
260604
- const projectId = options2 && options2.projectId || storage.projectId;
260604
+ const projectId = options2 && options2.projectId || storage2.projectId;
260605
260605
  super({
260606
- parent: storage,
260606
+ parent: storage2,
260607
260607
  id: accessId,
260608
260608
  baseUrl: `/projects/${projectId}/hmacKeys`,
260609
260609
  methods
260610
260610
  });
260611
- this.storage = storage;
260612
- this.instanceRetryValue = storage.retryOptions.autoRetry;
260611
+ this.storage = storage2;
260612
+ this.instanceRetryValue = storage2.retryOptions.autoRetry;
260613
260613
  }
260614
260614
  setMetadata(metadata2, optionsOrCallback, cb) {
260615
260615
  if (this.storage.retryOptions.idempotencyStrategy !== IdempotencyStrategy.RetryAlways) {
@@ -285567,28 +285567,28 @@ var HybridTokenStorage = class extends BaseTokenStorage {
285567
285567
  return await this.storageInitPromise;
285568
285568
  }
285569
285569
  async getCredentials(serverName) {
285570
- const storage = await this.getStorage();
285571
- return storage.getCredentials(serverName);
285570
+ const storage2 = await this.getStorage();
285571
+ return storage2.getCredentials(serverName);
285572
285572
  }
285573
285573
  async setCredentials(credentials) {
285574
- const storage = await this.getStorage();
285575
- await storage.setCredentials(credentials);
285574
+ const storage2 = await this.getStorage();
285575
+ await storage2.setCredentials(credentials);
285576
285576
  }
285577
285577
  async deleteCredentials(serverName) {
285578
- const storage = await this.getStorage();
285579
- await storage.deleteCredentials(serverName);
285578
+ const storage2 = await this.getStorage();
285579
+ await storage2.deleteCredentials(serverName);
285580
285580
  }
285581
285581
  async listServers() {
285582
- const storage = await this.getStorage();
285583
- return storage.listServers();
285582
+ const storage2 = await this.getStorage();
285583
+ return storage2.listServers();
285584
285584
  }
285585
285585
  async getAllCredentials() {
285586
- const storage = await this.getStorage();
285587
- return storage.getAllCredentials();
285586
+ const storage2 = await this.getStorage();
285587
+ return storage2.getAllCredentials();
285588
285588
  }
285589
285589
  async clearAll() {
285590
- const storage = await this.getStorage();
285591
- await storage.clearAll();
285590
+ const storage2 = await this.getStorage();
285591
+ await storage2.clearAll();
285592
285592
  }
285593
285593
  async getStorageType() {
285594
285594
  await this.getStorage();
@@ -285600,6 +285600,7 @@ var HybridTokenStorage = class extends BaseTokenStorage {
285600
285600
  import * as path14 from "node:path";
285601
285601
  import * as os5 from "node:os";
285602
285602
  import { promises as fs21 } from "node:fs";
285603
+ init_events();
285603
285604
  var KEYCHAIN_SERVICE_NAME = "gemini-cli-oauth";
285604
285605
  var MAIN_ACCOUNT_KEY = "main-account";
285605
285606
  var OAuthCredentialStorage = class {
@@ -285625,8 +285626,8 @@ var OAuthCredentialStorage = class {
285625
285626
  }
285626
285627
  return await this.migrateFromFileStorage();
285627
285628
  } catch (error) {
285628
- console.error(error);
285629
- throw new Error("Failed to load OAuth credentials");
285629
+ coreEvents.emitFeedback("error", "Failed to load OAuth credentials", error);
285630
+ throw new Error("Failed to load OAuth credentials", { cause: error });
285630
285631
  }
285631
285632
  }
285632
285633
  /**
@@ -285659,8 +285660,8 @@ var OAuthCredentialStorage = class {
285659
285660
  await fs21.rm(oldFilePath, { force: true }).catch(() => {
285660
285661
  });
285661
285662
  } catch (error) {
285662
- console.error(error);
285663
- throw new Error("Failed to clear OAuth credentials");
285663
+ coreEvents.emitFeedback("error", "Failed to clear OAuth credentials", error);
285664
+ throw new Error("Failed to clear OAuth credentials", { cause: error });
285664
285665
  }
285665
285666
  }
285666
285667
  /**
@@ -287210,6 +287211,7 @@ var API_REQUEST_LATENCY = "gemini_cli.api.request.latency";
287210
287211
  var TOKEN_USAGE = "gemini_cli.token.usage";
287211
287212
  var SESSION_COUNT = "gemini_cli.session.count";
287212
287213
  var FILE_OPERATION_COUNT = "gemini_cli.file.operation.count";
287214
+ var LINES_CHANGED = "gemini_cli.lines.changed";
287213
287215
  var INVALID_CHUNK_COUNT = "gemini_cli.chat.invalid_chunk.count";
287214
287216
  var CONTENT_RETRY_COUNT = "gemini_cli.chat.content_retry.count";
287215
287217
  var CONTENT_RETRY_FAILURE_COUNT = "gemini_cli.chat.content_retry_failure.count";
@@ -287268,6 +287270,12 @@ var COUNTER_DEFINITIONS = {
287268
287270
  assign: (c4) => fileOperationCounter = c4,
287269
287271
  attributes: {}
287270
287272
  },
287273
+ [LINES_CHANGED]: {
287274
+ description: "Number of lines changed (from file diffs).",
287275
+ valueType: ValueType.INT,
287276
+ assign: (c4) => linesChangedCounter = c4,
287277
+ attributes: {}
287278
+ },
287271
287279
  [INVALID_CHUNK_COUNT]: {
287272
287280
  description: "Counts invalid chunks received from a stream.",
287273
287281
  valueType: ValueType.INT,
@@ -287512,6 +287520,7 @@ var apiRequestLatencyHistogram;
287512
287520
  var tokenUsageCounter;
287513
287521
  var sessionCounter;
287514
287522
  var fileOperationCounter;
287523
+ var linesChangedCounter;
287515
287524
  var chatCompressionCounter;
287516
287525
  var invalidChunkCounter;
287517
287526
  var contentRetryCounter;
@@ -287627,6 +287636,17 @@ function recordFileOperationMetric(config2, attributes) {
287627
287636
  ...attributes
287628
287637
  });
287629
287638
  }
287639
+ function recordLinesChanged(config2, lines, changeType, attributes) {
287640
+ if (!linesChangedCounter || !isMetricsInitialized)
287641
+ return;
287642
+ if (!Number.isFinite(lines) || lines <= 0)
287643
+ return;
287644
+ linesChangedCounter.add(lines, {
287645
+ ...baseMetricDefinition.getCommonAttributes(config2),
287646
+ type: changeType,
287647
+ ...attributes ?? {}
287648
+ });
287649
+ }
287630
287650
  function recordContentRetry(config2) {
287631
287651
  if (!contentRetryCounter || !isMetricsInitialized)
287632
287652
  return;
@@ -288967,8 +288987,8 @@ var Float64Vector = import_vector.default.Float64Vector;
288967
288987
  var PointerVector = import_vector.default.PointerVector;
288968
288988
 
288969
288989
  // packages/core/dist/src/generated/git-commit.js
288970
- var GIT_COMMIT_INFO = "66b61a13";
288971
- var CLI_VERSION = "0.12.0-preview.4";
288990
+ var GIT_COMMIT_INFO = "c89bc30d";
288991
+ var CLI_VERSION = "0.13.0-nightly.20251031.c89bc30d";
288972
288992
 
288973
288993
  // packages/core/dist/src/ide/detect-ide.js
288974
288994
  var IDE_DEFINITIONS = {
@@ -289337,6 +289357,7 @@ var ClearcutLogger = class _ClearcutLogger {
289337
289357
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_EXTENSIONS_COUNT,
289338
289358
  value: event.extensions_count.toString()
289339
289359
  },
289360
+ // We deliberately do not log the names of extensions here, to be safe.
289340
289361
  {
289341
289362
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_EXTENSION_IDS,
289342
289363
  value: event.extension_ids.toString()
@@ -289414,6 +289435,12 @@ var ClearcutLogger = class _ClearcutLogger {
289414
289435
  }
289415
289436
  }
289416
289437
  }
289438
+ if (event.extension_id) {
289439
+ data.push({
289440
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_ID,
289441
+ value: event.extension_id
289442
+ });
289443
+ }
289417
289444
  const logEvent = this.createLogEvent(EventNames.TOOL_CALL, data);
289418
289445
  this.enqueueLogEvent(logEvent);
289419
289446
  this.flushIfNeeded();
@@ -289594,6 +289621,12 @@ var ClearcutLogger = class _ClearcutLogger {
289594
289621
  value: JSON.stringify(event.status)
289595
289622
  });
289596
289623
  }
289624
+ if (event.extension_id) {
289625
+ data.push({
289626
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_ID,
289627
+ value: event.extension_id
289628
+ });
289629
+ }
289597
289630
  this.enqueueLogEvent(this.createLogEvent(EventNames.SLASH_COMMAND, data));
289598
289631
  this.flushIfNeeded();
289599
289632
  }
@@ -291092,14 +291125,22 @@ function logToolCall(config2, event) {
291092
291125
  function_name: event.function_name,
291093
291126
  success: event.success,
291094
291127
  decision: event.decision,
291095
- tool_type: event.tool_type,
291096
- ...event.metadata ? {
291097
- model_added_lines: event.metadata["model_added_lines"],
291098
- model_removed_lines: event.metadata["model_removed_lines"],
291099
- user_added_lines: event.metadata["user_added_lines"],
291100
- user_removed_lines: event.metadata["user_removed_lines"]
291101
- } : {}
291128
+ tool_type: event.tool_type
291102
291129
  });
291130
+ if (event.metadata) {
291131
+ const added = event.metadata["model_added_lines"];
291132
+ if (typeof added === "number" && added > 0) {
291133
+ recordLinesChanged(config2, added, "added", {
291134
+ function_name: event.function_name
291135
+ });
291136
+ }
291137
+ const removed = event.metadata["model_removed_lines"];
291138
+ if (typeof removed === "number" && removed > 0) {
291139
+ recordLinesChanged(config2, removed, "removed", {
291140
+ function_name: event.function_name
291141
+ });
291142
+ }
291143
+ }
291103
291144
  }
291104
291145
  function logToolOutputTruncated(config2, event) {
291105
291146
  ClearcutLogger.getInstance(config2)?.logToolOutputTruncatedEvent(event);
@@ -291536,6 +291577,26 @@ async function createCodeAssistContentGenerator(httpOptions, authType, config2,
291536
291577
  throw new Error(`Unsupported authType: ${authType}`);
291537
291578
  }
291538
291579
 
291580
+ // packages/core/dist/src/core/apiKeyCredentialStorage.js
291581
+ var KEYCHAIN_SERVICE_NAME2 = "gemini-cli-api-key";
291582
+ var DEFAULT_API_KEY_ENTRY = "default-api-key";
291583
+ var storage = new HybridTokenStorage(KEYCHAIN_SERVICE_NAME2);
291584
+ async function loadApiKey() {
291585
+ try {
291586
+ const credentials = await storage.getCredentials(DEFAULT_API_KEY_ENTRY);
291587
+ if (credentials?.token?.accessToken) {
291588
+ return credentials.token.accessToken;
291589
+ }
291590
+ return null;
291591
+ } catch (error) {
291592
+ if (error instanceof Error && error.message === "Token file does not exist") {
291593
+ return null;
291594
+ }
291595
+ debugLogger.error("Failed to load API key from storage:", error);
291596
+ return null;
291597
+ }
291598
+ }
291599
+
291539
291600
  // packages/core/dist/src/core/fakeContentGenerator.js
291540
291601
  import { promises } from "node:fs";
291541
291602
  var FakeContentGenerator = class _FakeContentGenerator {
@@ -291659,8 +291720,8 @@ var AuthType2;
291659
291720
  AuthType3["USE_VERTEX_AI"] = "vertex-ai";
291660
291721
  AuthType3["CLOUD_SHELL"] = "cloud-shell";
291661
291722
  })(AuthType2 || (AuthType2 = {}));
291662
- function createContentGeneratorConfig(config2, authType) {
291663
- const geminiApiKey = process.env["GEMINI_API_KEY"] || void 0;
291723
+ async function createContentGeneratorConfig(config2, authType) {
291724
+ const geminiApiKey = await loadApiKey() || process.env["GEMINI_API_KEY"] || void 0;
291664
291725
  const googleApiKey = process.env["GOOGLE_API_KEY"] || void 0;
291665
291726
  const googleCloudProject = process.env["GOOGLE_CLOUD_PROJECT"] || process.env["GOOGLE_CLOUD_PROJECT_ID"] || void 0;
291666
291727
  const googleCloudLocation = process.env["GOOGLE_CLOUD_LOCATION"] || void 0;
@@ -291688,7 +291749,7 @@ async function createContentGenerator(config2, gcConfig, sessionId2) {
291688
291749
  if (gcConfig.fakeResponses) {
291689
291750
  return FakeContentGenerator.fromFile(gcConfig.fakeResponses);
291690
291751
  }
291691
- const version3 = "0.12.0-preview.4";
291752
+ const version3 = "0.13.0-nightly.20251031.c89bc30d";
291692
291753
  const userAgent = `GeminiCLI/${version3} (${process.platform}; ${process.arch})`;
291693
291754
  const baseHeaders = {
291694
291755
  "User-Agent": userAgent
@@ -300244,6 +300305,7 @@ var McpClient = class {
300244
300305
  if (this.status !== MCPServerStatus.CONNECTED) {
300245
300306
  return;
300246
300307
  }
300308
+ this.toolRegistry.removeMcpToolsByServer(this.serverName);
300247
300309
  this.updateStatus(MCPServerStatus.DISCONNECTING);
300248
300310
  const client = this.client;
300249
300311
  this.client = void 0;
@@ -300809,40 +300871,123 @@ init_events();
300809
300871
  var McpClientManager = class {
300810
300872
  clients = /* @__PURE__ */ new Map();
300811
300873
  toolRegistry;
300874
+ cliConfig;
300875
+ // If we have ongoing MCP client discovery, this completes once that is done.
300876
+ discoveryPromise;
300812
300877
  discoveryState = MCPDiscoveryState.NOT_STARTED;
300813
300878
  eventEmitter;
300814
- constructor(toolRegistry, eventEmitter) {
300879
+ constructor(toolRegistry, cliConfig, eventEmitter) {
300815
300880
  this.toolRegistry = toolRegistry;
300881
+ this.cliConfig = cliConfig;
300816
300882
  this.eventEmitter = eventEmitter;
300883
+ if (this.cliConfig.getEnableExtensionReloading()) {
300884
+ this.cliConfig.getExtensionLoader().extensionEvents().on("extensionLoaded", (event) => this.loadExtension(event.extension)).on("extensionEnabled", (event) => this.loadExtension(event.extension)).on("extensionDisabled", (event) => this.unloadExtension(event.extension)).on("extensionUnloaded", (event) => this.unloadExtension(event.extension));
300885
+ }
300886
+ }
300887
+ /**
300888
+ * For all the MCP servers associated with this extension:
300889
+ *
300890
+ * - Removes all its MCP servers from the global configuration object.
300891
+ * - Disconnects all MCP clients from their servers.
300892
+ * - Updates the Gemini chat configuration to load the new tools.
300893
+ */
300894
+ async unloadExtension(extension) {
300895
+ debugLogger.log(`Unloading extension: ${extension.name}`);
300896
+ await Promise.all(Object.keys(extension.mcpServers ?? {}).map((name4) => {
300897
+ const newMcpServers = {
300898
+ ...this.cliConfig.getMcpServers()
300899
+ };
300900
+ delete newMcpServers[name4];
300901
+ this.cliConfig.setMcpServers(newMcpServers);
300902
+ return this.disconnectClient(name4);
300903
+ }));
300904
+ this.cliConfig.getGeminiClient().setTools();
300905
+ }
300906
+ /**
300907
+ * For all the MCP servers associated with this extension:
300908
+ *
300909
+ * - Adds all its MCP servers to the global configuration object.
300910
+ * - Connects MCP clients to each server and discovers their tools.
300911
+ * - Updates the Gemini chat configuration to load the new tools.
300912
+ */
300913
+ async loadExtension(extension) {
300914
+ debugLogger.log(`Loading extension: ${extension.name}`);
300915
+ await Promise.all(Object.entries(extension.mcpServers ?? {}).map(([name4, config2]) => {
300916
+ this.cliConfig.setMcpServers({
300917
+ ...this.cliConfig.getMcpServers(),
300918
+ [name4]: config2
300919
+ });
300920
+ return this.discoverMcpTools(name4, config2);
300921
+ }));
300922
+ this.cliConfig.getGeminiClient().setTools();
300923
+ }
300924
+ async disconnectClient(name4) {
300925
+ const existing = this.clients.get(name4);
300926
+ if (existing) {
300927
+ try {
300928
+ this.clients.delete(name4);
300929
+ this.eventEmitter?.emit("mcp-client-update", this.clients);
300930
+ await existing.disconnect();
300931
+ } catch (error) {
300932
+ debugLogger.warn(`Error stopping client '${name4}': ${getErrorMessage(error)}`);
300933
+ }
300934
+ }
300935
+ }
300936
+ discoverMcpTools(name4, config2) {
300937
+ if (!this.cliConfig.isTrustedFolder()) {
300938
+ return;
300939
+ }
300940
+ if (config2.extension && !config2.extension.isActive) {
300941
+ return;
300942
+ }
300943
+ const currentDiscoveryPromise = new Promise((resolve13, _reject) => {
300944
+ (async () => {
300945
+ try {
300946
+ await this.disconnectClient(name4);
300947
+ const client = new McpClient(name4, config2, this.toolRegistry, this.cliConfig.getPromptRegistry(), this.cliConfig.getWorkspaceContext(), this.cliConfig.getDebugMode());
300948
+ this.clients.set(name4, client);
300949
+ this.eventEmitter?.emit("mcp-client-update", this.clients);
300950
+ try {
300951
+ await client.connect();
300952
+ await client.discover(this.cliConfig);
300953
+ this.eventEmitter?.emit("mcp-client-update", this.clients);
300954
+ } catch (error) {
300955
+ this.eventEmitter?.emit("mcp-client-update", this.clients);
300956
+ coreEvents.emitFeedback("error", `Error during discovery for server '${name4}': ${getErrorMessage(error)}`, error);
300957
+ }
300958
+ } finally {
300959
+ resolve13();
300960
+ }
300961
+ })();
300962
+ });
300963
+ if (this.discoveryPromise) {
300964
+ this.discoveryPromise = this.discoveryPromise.then(() => currentDiscoveryPromise);
300965
+ } else {
300966
+ this.discoveryState = MCPDiscoveryState.IN_PROGRESS;
300967
+ this.discoveryPromise = currentDiscoveryPromise;
300968
+ }
300969
+ const currentPromise = this.discoveryPromise;
300970
+ currentPromise.then((_) => {
300971
+ if (currentPromise === this.discoveryPromise) {
300972
+ this.discoveryPromise = void 0;
300973
+ this.discoveryState = MCPDiscoveryState.COMPLETED;
300974
+ }
300975
+ });
300976
+ return currentPromise;
300817
300977
  }
300818
300978
  /**
300819
300979
  * Initiates the tool discovery process for all configured MCP servers.
300820
300980
  * It connects to each server, discovers its available tools, and registers
300821
300981
  * them with the `ToolRegistry`.
300822
300982
  */
300823
- async discoverAllMcpTools(cliConfig) {
300824
- if (!cliConfig.isTrustedFolder()) {
300983
+ async discoverAllMcpTools() {
300984
+ if (!this.cliConfig.isTrustedFolder()) {
300825
300985
  return;
300826
300986
  }
300827
300987
  await this.stop();
300828
- const servers = populateMcpServerCommand(cliConfig.getMcpServers() || {}, cliConfig.getMcpServerCommand());
300829
- this.discoveryState = MCPDiscoveryState.IN_PROGRESS;
300988
+ const servers = populateMcpServerCommand(this.cliConfig.getMcpServers() || {}, this.cliConfig.getMcpServerCommand());
300830
300989
  this.eventEmitter?.emit("mcp-client-update", this.clients);
300831
- const discoveryPromises = Object.entries(servers).filter(([_, config2]) => !config2.extension || config2.extension.isActive).map(async ([name4, config2]) => {
300832
- const client = new McpClient(name4, config2, this.toolRegistry, cliConfig.getPromptRegistry(), cliConfig.getWorkspaceContext(), cliConfig.getDebugMode());
300833
- this.clients.set(name4, client);
300834
- this.eventEmitter?.emit("mcp-client-update", this.clients);
300835
- try {
300836
- await client.connect();
300837
- await client.discover(cliConfig);
300838
- this.eventEmitter?.emit("mcp-client-update", this.clients);
300839
- } catch (error) {
300840
- this.eventEmitter?.emit("mcp-client-update", this.clients);
300841
- coreEvents.emitFeedback("error", `Error during discovery for server '${name4}': ${getErrorMessage(error)}`, error);
300842
- }
300843
- });
300844
- await Promise.all(discoveryPromises);
300845
- this.discoveryState = MCPDiscoveryState.COMPLETED;
300990
+ await Promise.all(Object.entries(servers).map(async ([name4, config2]) => this.discoverMcpTools(name4, config2)));
300846
300991
  }
300847
300992
  /**
300848
300993
  * Stops all running local MCP servers and closes all client connections.
@@ -300990,7 +301135,7 @@ var ToolRegistry = class {
300990
301135
  messageBus;
300991
301136
  constructor(config2, eventEmitter) {
300992
301137
  this.config = config2;
300993
- this.mcpClientManager = new McpClientManager(this, eventEmitter);
301138
+ this.mcpClientManager = new McpClientManager(this, config2, eventEmitter);
300994
301139
  }
300995
301140
  setMessageBus(messageBus) {
300996
301141
  this.messageBus = messageBus;
@@ -301039,7 +301184,7 @@ var ToolRegistry = class {
301039
301184
  this.removeDiscoveredTools();
301040
301185
  this.config.getPromptRegistry().clear();
301041
301186
  await this.discoverAndRegisterToolsFromCommand();
301042
- await this.mcpClientManager.discoverAllMcpTools(this.config);
301187
+ await this.mcpClientManager.discoverAllMcpTools();
301043
301188
  }
301044
301189
  /**
301045
301190
  * Discovers tools from project (if available and configured).
@@ -301049,7 +301194,7 @@ var ToolRegistry = class {
301049
301194
  async discoverMcpTools() {
301050
301195
  this.removeDiscoveredTools();
301051
301196
  this.config.getPromptRegistry().clear();
301052
- await this.mcpClientManager.discoverAllMcpTools(this.config);
301197
+ await this.mcpClientManager.discoverAllMcpTools();
301053
301198
  }
301054
301199
  /**
301055
301200
  * Restarts all MCP servers and re-discovers tools.
@@ -326421,8 +326566,7 @@ var EditToolInvocation2 = class extends BaseToolInvocation {
326421
326566
  "Proposed",
326422
326567
  DEFAULT_DIFF_OPTIONS
326423
326568
  );
326424
- const originallyProposedContent = this.params.ai_proposed_string || this.params.new_string;
326425
- const diffStat = getDiffStat(fileName, editData.currentContent ?? "", originallyProposedContent, this.params.new_string);
326569
+ const diffStat = getDiffStat(fileName, editData.currentContent ?? "", editData.newContent, this.params.new_string);
326426
326570
  displayResult = {
326427
326571
  fileDiff,
326428
326572
  fileName,
@@ -332285,7 +332429,7 @@ var ShellToolInvocation = class extends BaseToolInvocation {
332285
332429
  const pgrepLines = fs41.readFileSync(tempFilePath, "utf8").split(EOL3).filter(Boolean);
332286
332430
  for (const line of pgrepLines) {
332287
332431
  if (!/^\d+$/.test(line)) {
332288
- console.error(`pgrep: ${line}`);
332432
+ debugLogger.error(`pgrep: ${line}`);
332289
332433
  }
332290
332434
  const pid2 = Number(line);
332291
332435
  if (pid2 !== result.pid) {
@@ -332294,7 +332438,7 @@ var ShellToolInvocation = class extends BaseToolInvocation {
332294
332438
  }
332295
332439
  } else {
332296
332440
  if (!signal.aborted) {
332297
- console.error("missing pgrep output");
332441
+ debugLogger.error("missing pgrep output");
332298
332442
  }
332299
332443
  }
332300
332444
  }
@@ -332446,7 +332590,7 @@ var ShellTool = class _ShellTool extends BaseDeclarativeTool {
332446
332590
  const commandCheck = isCommandAllowed(params.command, this.config);
332447
332591
  if (!commandCheck.allowed) {
332448
332592
  if (!commandCheck.reason) {
332449
- console.error("Unexpected: isCommandAllowed returned false without a reason");
332593
+ debugLogger.error("Unexpected: isCommandAllowed returned false without a reason");
332450
332594
  return `Command is not allowed: ${params.command}`;
332451
332595
  }
332452
332596
  return commandCheck.reason;
@@ -339853,6 +339997,7 @@ var GeminiChat = class {
339853
339997
  // model.
339854
339998
  sendPromise = Promise.resolve();
339855
339999
  chatRecordingService;
340000
+ lastPromptTokenCount;
339856
340001
  constructor(config2, generationConfig = {}, history = []) {
339857
340002
  this.config = config2;
339858
340003
  this.generationConfig = generationConfig;
@@ -339860,6 +340005,7 @@ var GeminiChat = class {
339860
340005
  validateHistory2(history);
339861
340006
  this.chatRecordingService = new ChatRecordingService(config2);
339862
340007
  this.chatRecordingService.initialize();
340008
+ this.lastPromptTokenCount = Math.ceil(JSON.stringify(this.history).length / 4);
339863
340009
  }
339864
340010
  setSystemInstruction(sysInstr) {
339865
340011
  this.generationConfig.systemInstruction = sysInstr;
@@ -340075,7 +340221,7 @@ This error was probably caused by cyclic schema references in one of the followi
340075
340221
  if (chunk2.usageMetadata) {
340076
340222
  this.chatRecordingService.recordMessageTokens(chunk2.usageMetadata);
340077
340223
  if (chunk2.usageMetadata.promptTokenCount !== void 0) {
340078
- uiTelemetryService.setLastPromptTokenCount(chunk2.usageMetadata.promptTokenCount);
340224
+ this.lastPromptTokenCount = chunk2.usageMetadata.promptTokenCount;
340079
340225
  }
340080
340226
  }
340081
340227
  yield chunk2;
@@ -340106,6 +340252,9 @@ This error was probably caused by cyclic schema references in one of the followi
340106
340252
  }
340107
340253
  this.history.push({ role: "model", parts: consolidatedParts });
340108
340254
  }
340255
+ getLastPromptTokenCount() {
340256
+ return this.lastPromptTokenCount;
340257
+ }
340109
340258
  /**
340110
340259
  * Gets the chat recording service instance.
340111
340260
  */
@@ -341164,9 +341313,9 @@ var ChatCompressionService = class {
341164
341313
  }
341165
341314
  };
341166
341315
  }
341167
- const originalTokenCount = uiTelemetryService.getLastPromptTokenCount();
341316
+ const originalTokenCount = chat.getLastPromptTokenCount();
341168
341317
  if (!force) {
341169
- const threshold = config2.getChatCompression()?.contextPercentageThreshold ?? DEFAULT_COMPRESSION_TOKEN_THRESHOLD;
341318
+ const threshold = config2.getCompressionThreshold() ?? DEFAULT_COMPRESSION_TOKEN_THRESHOLD;
341170
341319
  if (originalTokenCount < threshold * tokenLimit(model)) {
341171
341320
  return {
341172
341321
  newHistory: null,
@@ -341236,7 +341385,6 @@ var ChatCompressionService = class {
341236
341385
  }
341237
341386
  };
341238
341387
  } else {
341239
- uiTelemetryService.setLastPromptTokenCount(newTokenCount);
341240
341388
  return {
341241
341389
  newHistory: extraHistory,
341242
341390
  info: {
@@ -341279,8 +341427,14 @@ var GeminiClient = class {
341279
341427
  this.compressionService = new ChatCompressionService();
341280
341428
  this.lastPromptId = this.config.getSessionId();
341281
341429
  }
341430
+ updateTelemetryTokenCount() {
341431
+ if (this.chat) {
341432
+ uiTelemetryService.setLastPromptTokenCount(this.chat.getLastPromptTokenCount());
341433
+ }
341434
+ }
341282
341435
  async initialize() {
341283
341436
  this.chat = await this.startChat();
341437
+ this.updateTelemetryTokenCount();
341284
341438
  }
341285
341439
  getContentGeneratorOrFail() {
341286
341440
  if (!this.config.getContentGenerator()) {
@@ -341318,6 +341472,7 @@ var GeminiClient = class {
341318
341472
  }
341319
341473
  async resetChat() {
341320
341474
  this.chat = await this.startChat();
341475
+ this.updateTelemetryTokenCount();
341321
341476
  }
341322
341477
  getChatRecordingService() {
341323
341478
  return this.chat?.getChatRecordingService();
@@ -341515,7 +341670,7 @@ var GeminiClient = class {
341515
341670
  }
341516
341671
  const modelForLimitCheck = this._getEffectiveModelForCurrentTurn();
341517
341672
  const estimatedRequestTokenCount = Math.floor(JSON.stringify(request3).length / 4);
341518
- const remainingTokenCount = tokenLimit(modelForLimitCheck) - uiTelemetryService.getLastPromptTokenCount();
341673
+ const remainingTokenCount = tokenLimit(modelForLimitCheck) - this.getChat().getLastPromptTokenCount();
341519
341674
  if (estimatedRequestTokenCount > remainingTokenCount * 0.95) {
341520
341675
  yield {
341521
341676
  type: GeminiEventType.ContextWindowWillOverflow,
@@ -341574,6 +341729,7 @@ var GeminiClient = class {
341574
341729
  return turn;
341575
341730
  }
341576
341731
  yield event;
341732
+ this.updateTelemetryTokenCount();
341577
341733
  if (event.type === GeminiEventType.InvalidStream) {
341578
341734
  if (this.config.getContinueOnFailedApiCall()) {
341579
341735
  if (isInvalidStreamRetry) {
@@ -341661,6 +341817,7 @@ var GeminiClient = class {
341661
341817
  } else if (info2.compressionStatus === CompressionStatus.COMPRESSED) {
341662
341818
  if (newHistory) {
341663
341819
  this.chat = await this.startChat(newHistory);
341820
+ this.updateTelemetryTokenCount();
341664
341821
  this.forceFullIdeContext = true;
341665
341822
  }
341666
341823
  }
@@ -346411,9 +346568,9 @@ var simpleGit = gitInstanceFactory;
346411
346568
  var GitService = class {
346412
346569
  projectRoot;
346413
346570
  storage;
346414
- constructor(projectRoot, storage) {
346571
+ constructor(projectRoot, storage2) {
346415
346572
  this.projectRoot = path53.resolve(projectRoot);
346416
- this.storage = storage;
346573
+ this.storage = storage2;
346417
346574
  }
346418
346575
  getHistoryDir() {
346419
346576
  return this.storage.getHistoryDir();
@@ -349505,13 +349662,14 @@ var Config = class {
349505
349662
  listExtensions;
349506
349663
  _extensionLoader;
349507
349664
  _enabledExtensions;
349665
+ enableExtensionReloading;
349508
349666
  _blockedMcpServers;
349509
349667
  fallbackModelHandler;
349510
349668
  quotaErrorOccurred = false;
349511
349669
  summarizeToolOutput;
349512
349670
  experimentalZedIntegration = false;
349513
349671
  loadMemoryFromIncludeDirectories = false;
349514
- chatCompression;
349672
+ compressionThreshold;
349515
349673
  interactive;
349516
349674
  ptyInfo;
349517
349675
  trustedFolder;
@@ -349599,7 +349757,7 @@ var Config = class {
349599
349757
  this.folderTrust = params.folderTrust ?? false;
349600
349758
  this.ideMode = params.ideMode ?? false;
349601
349759
  this.loadMemoryFromIncludeDirectories = params.loadMemoryFromIncludeDirectories ?? false;
349602
- this.chatCompression = params.chatCompression;
349760
+ this.compressionThreshold = params.compressionThreshold;
349603
349761
  this.interactive = params.interactive ?? false;
349604
349762
  this.ptyInfo = params.ptyInfo ?? "child_process";
349605
349763
  this.trustedFolder = params.trustedFolder;
@@ -349619,9 +349777,7 @@ var Config = class {
349619
349777
  this.useWriteTodos = params.useWriteTodos ?? false;
349620
349778
  this.initialUseModelRouter = params.useModelRouter ?? false;
349621
349779
  this.useModelRouter = this.initialUseModelRouter;
349622
- this.disableModelRouterForAuth = params.disableModelRouterForAuth ?? [
349623
- AuthType2.LOGIN_WITH_GOOGLE
349624
- ];
349780
+ this.disableModelRouterForAuth = params.disableModelRouterForAuth ?? [];
349625
349781
  this.enableMessageBusIntegration = params.enableMessageBusIntegration ?? false;
349626
349782
  this.codebaseInvestigatorSettings = {
349627
349783
  enabled: params.codebaseInvestigatorSettings?.enabled ?? false,
@@ -349633,6 +349789,7 @@ var Config = class {
349633
349789
  this.continueOnFailedApiCall = params.continueOnFailedApiCall ?? true;
349634
349790
  this.enableShellOutputEfficiency = params.enableShellOutputEfficiency ?? true;
349635
349791
  this.extensionManagement = params.extensionManagement ?? true;
349792
+ this.enableExtensionReloading = params.enableExtensionReloading ?? false;
349636
349793
  this.storage = new Storage2(this.targetDir);
349637
349794
  this.fakeResponses = params.fakeResponses;
349638
349795
  this.recordResponses = params.recordResponses;
@@ -349692,7 +349849,7 @@ var Config = class {
349692
349849
  if (this.contentGeneratorConfig?.authType === AuthType2.USE_GEMINI && authMethod === AuthType2.LOGIN_WITH_GOOGLE) {
349693
349850
  this.geminiClient.stripThoughtsFromHistory();
349694
349851
  }
349695
- const newContentGeneratorConfig = createContentGeneratorConfig(this, authMethod);
349852
+ const newContentGeneratorConfig = await createContentGeneratorConfig(this, authMethod);
349696
349853
  this.contentGenerator = await createContentGenerator(newContentGeneratorConfig, this, this.getSessionId());
349697
349854
  this.contentGeneratorConfig = newContentGeneratorConfig;
349698
349855
  this.baseLlmClient = new BaseLlmClient(this.contentGenerator, this);
@@ -349806,6 +349963,9 @@ var Config = class {
349806
349963
  getMcpServers() {
349807
349964
  return this.mcpServers;
349808
349965
  }
349966
+ setMcpServers(mcpServers) {
349967
+ this.mcpServers = mcpServers;
349968
+ }
349809
349969
  getUserMemory() {
349810
349970
  return this.userMemory;
349811
349971
  }
@@ -349936,6 +350096,9 @@ var Config = class {
349936
350096
  getEnabledExtensions() {
349937
350097
  return this._enabledExtensions;
349938
350098
  }
350099
+ getEnableExtensionReloading() {
350100
+ return this.enableExtensionReloading;
350101
+ }
349939
350102
  getBlockedMcpServers() {
349940
350103
  return this._blockedMcpServers;
349941
350104
  }
@@ -349983,8 +350146,8 @@ var Config = class {
349983
350146
  setFileSystemService(fileSystemService) {
349984
350147
  this.fileSystemService = fileSystemService;
349985
350148
  }
349986
- getChatCompression() {
349987
- return this.chatCompression;
350149
+ getCompressionThreshold() {
350150
+ return this.compressionThreshold;
349988
350151
  }
349989
350152
  isInteractiveShellEnabled() {
349990
350153
  return this.interactive && this.ptyInfo !== "child_process" && this.enableInteractiveShell;