@protolabsai/proto 0.48.1 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/cli.js +275 -8
  2. package/package.json +2 -2
package/cli.js CHANGED
@@ -19092,7 +19092,7 @@ function parseResponseData(error40) {
19092
19092
  }
19093
19093
  return error40.response?.data;
19094
19094
  }
19095
- var FatalError, FatalAuthenticationError, FatalInputError, FatalSandboxError, FatalConfigError, FatalTurnLimitedError, FatalToolExecutionError, FatalCancellationError, ForbiddenError, UnauthorizedError, BadRequestError;
19095
+ var FatalError, FatalAuthenticationError, FatalInputError, FatalSandboxError, FatalConfigError, FatalTurnLimitedError, FatalToolExecutionError, FatalBudgetExceededError, FatalCancellationError, ForbiddenError, UnauthorizedError, BadRequestError;
19096
19096
  var init_errors = __esm({
19097
19097
  "packages/core/dist/src/utils/errors.js"() {
19098
19098
  "use strict";
@@ -19160,6 +19160,14 @@ var init_errors = __esm({
19160
19160
  super(message, 54);
19161
19161
  }
19162
19162
  };
19163
+ FatalBudgetExceededError = class extends FatalError {
19164
+ static {
19165
+ __name(this, "FatalBudgetExceededError");
19166
+ }
19167
+ constructor(message) {
19168
+ super(message, 55);
19169
+ }
19170
+ };
19163
19171
  FatalCancellationError = class extends FatalError {
19164
19172
  static {
19165
19173
  __name(this, "FatalCancellationError");
@@ -168676,7 +168684,7 @@ __export(geminiContentGenerator_exports, {
168676
168684
  createGeminiContentGenerator: () => createGeminiContentGenerator
168677
168685
  });
168678
168686
  function createGeminiContentGenerator(config2, gcConfig) {
168679
- const version2 = "0.48.1";
168687
+ const version2 = "0.50.0";
168680
168688
  const userAgent2 = config2.userAgent || `QwenCode/${version2} (${process.platform}; ${process.arch})`;
168681
168689
  const baseHeaders = {
168682
168690
  "User-Agent": userAgent2
@@ -275236,6 +275244,8 @@ var init_config3 = __esm({
275236
275244
  folderTrust;
275237
275245
  ideMode;
275238
275246
  maxSessionTurns;
275247
+ maxToolCalls;
275248
+ maxWallTimeSeconds;
275239
275249
  sessionTokenLimit;
275240
275250
  listExtensions;
275241
275251
  overrideExtensions;
@@ -275348,6 +275358,8 @@ var init_config3 = __esm({
275348
275358
  this.fileDiscoveryService = params.fileDiscoveryService ?? null;
275349
275359
  this.bugCommand = params.bugCommand;
275350
275360
  this.maxSessionTurns = params.maxSessionTurns ?? -1;
275361
+ this.maxToolCalls = params.maxToolCalls ?? -1;
275362
+ this.maxWallTimeSeconds = params.maxWallTimeSeconds ?? -1;
275351
275363
  this.sessionTokenLimit = params.sessionTokenLimit ?? -1;
275352
275364
  this.experimentalZedIntegration = params.experimentalZedIntegration ?? false;
275353
275365
  this.cronEnabled = params.cronEnabled ?? false;
@@ -275776,6 +275788,12 @@ var init_config3 = __esm({
275776
275788
  getMaxSessionTurns() {
275777
275789
  return this.maxSessionTurns;
275778
275790
  }
275791
+ getMaxToolCalls() {
275792
+ return this.maxToolCalls;
275793
+ }
275794
+ getMaxWallTimeSeconds() {
275795
+ return this.maxWallTimeSeconds;
275796
+ }
275779
275797
  getSessionTokenLimit() {
275780
275798
  return this.sessionTokenLimit;
275781
275799
  }
@@ -288111,6 +288129,7 @@ __export(dist_exports, {
288111
288129
  ExtensionUpdateState: () => ExtensionUpdateState,
288112
288130
  FILE_MUTATING_TOOLS: () => FILE_MUTATING_TOOLS,
288113
288131
  FatalAuthenticationError: () => FatalAuthenticationError,
288132
+ FatalBudgetExceededError: () => FatalBudgetExceededError,
288114
288133
  FatalCancellationError: () => FatalCancellationError,
288115
288134
  FatalConfigError: () => FatalConfigError,
288116
288135
  FatalError: () => FatalError,
@@ -405844,6 +405863,24 @@ var SETTINGS_SCHEMA = {
405844
405863
  description: "Maximum number of user/model/tool turns to keep in a session. -1 means unlimited.",
405845
405864
  showInDialog: false
405846
405865
  },
405866
+ maxToolCalls: {
405867
+ type: "number",
405868
+ label: "Max Tool Calls",
405869
+ category: "Model",
405870
+ requiresRestart: false,
405871
+ default: -1,
405872
+ description: "Maximum number of tool calls for a headless run before aborting (exit code 55). -1 means unlimited.",
405873
+ showInDialog: false
405874
+ },
405875
+ maxWallTimeSeconds: {
405876
+ type: "number",
405877
+ label: "Max Wall Time (seconds)",
405878
+ category: "Model",
405879
+ requiresRestart: false,
405880
+ default: -1,
405881
+ description: "Wall-clock budget in seconds for a headless run before aborting (exit code 55). -1 means unlimited.",
405882
+ showInDialog: false
405883
+ },
405847
405884
  chatCompression: {
405848
405885
  type: "object",
405849
405886
  label: "Chat Compression",
@@ -408902,6 +408939,17 @@ function handleMaxTurnsExceededError(config2) {
408902
408939
  }
408903
408940
  }
408904
408941
  __name(handleMaxTurnsExceededError, "handleMaxTurnsExceededError");
408942
+ function handleBudgetExceededError(config2, exceeded) {
408943
+ const budgetError = new FatalBudgetExceededError(exceeded.message);
408944
+ if (config2.getOutputFormat() === OutputFormat.JSON) {
408945
+ const formatter = new JsonFormatter();
408946
+ writeStderrLine(formatter.formatError(budgetError, budgetError.exitCode));
408947
+ } else {
408948
+ writeStderrLine(budgetError.message);
408949
+ }
408950
+ process.exit(budgetError.exitCode);
408951
+ }
408952
+ __name(handleBudgetExceededError, "handleBudgetExceededError");
408905
408953
 
408906
408954
  // packages/cli/src/commands/extensions/consent.ts
408907
408955
  init_esbuild_shims();
@@ -415376,6 +415424,8 @@ async function handleQwenAuth(command2, options2) {
415376
415424
  resume: void 0,
415377
415425
  sessionId: void 0,
415378
415426
  maxSessionTurns: void 0,
415427
+ maxToolCalls: void 0,
415428
+ maxWallTime: void 0,
415379
415429
  coreTools: void 0,
415380
415430
  excludeTools: void 0,
415381
415431
  disabledSlashCommands: void 0,
@@ -416526,7 +416576,7 @@ __name(getPackageJson, "getPackageJson");
416526
416576
  // packages/cli/src/utils/version.ts
416527
416577
  async function getCliVersion() {
416528
416578
  const pkgJson = await getPackageJson();
416529
- return "0.48.1";
416579
+ return "0.50.0";
416530
416580
  }
416531
416581
  __name(getCliVersion, "getCliVersion");
416532
416582
 
@@ -420634,6 +420684,179 @@ function buildWebSearchConfig(argv, settings2, authType) {
420634
420684
  }
420635
420685
  __name(buildWebSearchConfig, "buildWebSearchConfig");
420636
420686
 
420687
+ // packages/cli/src/utils/runBudget.ts
420688
+ init_esbuild_shims();
420689
+ var SECOND = 1e3;
420690
+ var MAX_TIMEOUT_MS = 2147483647;
420691
+ var MAX_WALL_TIME_SECONDS = Math.floor(MAX_TIMEOUT_MS / SECOND);
420692
+ var MIN_WALL_TIME_SECONDS = 1;
420693
+ function parseDurationSeconds(input) {
420694
+ const trimmed2 = input.trim().toLowerCase();
420695
+ if (trimmed2.length === 0) {
420696
+ throw new Error("Invalid duration: empty string");
420697
+ }
420698
+ const match2 = /^(\d+(?:\.\d+)?)\s*(ms|s|m|h)?$/.exec(trimmed2);
420699
+ if (!match2) {
420700
+ throw new Error(
420701
+ `Invalid duration "${input}". Use a positive number of seconds (e.g. 90) or a duration with unit (e.g. 30s, 5m, 1h, 500ms).`
420702
+ );
420703
+ }
420704
+ const value = Number.parseFloat(match2[1]);
420705
+ const unit = match2[2] ?? "s";
420706
+ let seconds;
420707
+ switch (unit) {
420708
+ case "ms":
420709
+ seconds = value / 1e3;
420710
+ break;
420711
+ case "s":
420712
+ seconds = value;
420713
+ break;
420714
+ case "m":
420715
+ seconds = value * 60;
420716
+ break;
420717
+ case "h":
420718
+ seconds = value * 3600;
420719
+ break;
420720
+ default:
420721
+ throw new Error(`Invalid duration unit "${unit}"`);
420722
+ }
420723
+ if (seconds <= 0) {
420724
+ throw new Error(
420725
+ `Invalid duration "${input}": must be greater than zero. Omit the flag entirely if you don't want a wall-clock budget.`
420726
+ );
420727
+ }
420728
+ if (seconds < MIN_WALL_TIME_SECONDS) {
420729
+ const hint = /ms\b/i.test(trimmed2) ? ` (probably a typo \u2014 did you mean ${input.replace(/ms\b/i, "s")}?)` : "";
420730
+ throw new Error(
420731
+ `Invalid duration "${input}": below the ${MIN_WALL_TIME_SECONDS}s minimum${hint}. Sub-second wall-clock budgets fire before any model round-trip can complete.`
420732
+ );
420733
+ }
420734
+ if (seconds > MAX_WALL_TIME_SECONDS) {
420735
+ throw new Error(
420736
+ `Invalid duration "${input}": exceeds the maximum supported wall-clock budget (${MAX_WALL_TIME_SECONDS}s \u2248 24 days). Use a smaller value.`
420737
+ );
420738
+ }
420739
+ return seconds;
420740
+ }
420741
+ __name(parseDurationSeconds, "parseDurationSeconds");
420742
+ function validateMaxWallTimeSetting(value) {
420743
+ if (value === -1) return -1;
420744
+ if (!Number.isFinite(value)) {
420745
+ throw new Error(
420746
+ `model.maxWallTimeSeconds must be a finite number; got ${value}.`
420747
+ );
420748
+ }
420749
+ if (value <= 0) {
420750
+ throw new Error(
420751
+ `model.maxWallTimeSeconds must be > 0 (or -1 for unlimited); got ${value}. Use -1 to disable, not 0.`
420752
+ );
420753
+ }
420754
+ if (value < MIN_WALL_TIME_SECONDS) {
420755
+ throw new Error(
420756
+ `model.maxWallTimeSeconds ${value} is below the ${MIN_WALL_TIME_SECONDS}s minimum. Sub-second budgets fire before any model round-trip can complete.`
420757
+ );
420758
+ }
420759
+ if (value > MAX_WALL_TIME_SECONDS) {
420760
+ throw new Error(
420761
+ `model.maxWallTimeSeconds ${value} exceeds the maximum supported wall-clock budget (${MAX_WALL_TIME_SECONDS}s \u2248 24 days).`
420762
+ );
420763
+ }
420764
+ return value;
420765
+ }
420766
+ __name(validateMaxWallTimeSetting, "validateMaxWallTimeSetting");
420767
+ var MAX_TOOL_CALLS = 1e6;
420768
+ function validateMaxToolCalls(value) {
420769
+ if (value === -1) return -1;
420770
+ if (!Number.isFinite(value)) {
420771
+ throw new Error(`maxToolCalls must be a finite number; got ${value}.`);
420772
+ }
420773
+ if (!Number.isInteger(value)) {
420774
+ throw new Error(
420775
+ `maxToolCalls must be an integer (or -1 for unlimited); got ${value}.`
420776
+ );
420777
+ }
420778
+ if (value < 0) {
420779
+ throw new Error(
420780
+ `maxToolCalls must be >= 0 (or -1 for unlimited); got ${value}. Use -1 to disable, not a negative number.`
420781
+ );
420782
+ }
420783
+ if (value > MAX_TOOL_CALLS) {
420784
+ throw new Error(
420785
+ `maxToolCalls ${value} exceeds the supported ceiling (${MAX_TOOL_CALLS}). Likely a typo \u2014 use a smaller value or -1 for unlimited.`
420786
+ );
420787
+ }
420788
+ return value;
420789
+ }
420790
+ __name(validateMaxToolCalls, "validateMaxToolCalls");
420791
+ var RunBudgetEnforcer = class {
420792
+ static {
420793
+ __name(this, "RunBudgetEnforcer");
420794
+ }
420795
+ maxWallTimeSeconds;
420796
+ maxToolCalls;
420797
+ abortController;
420798
+ wallTimer = null;
420799
+ toolCallCount = 0;
420800
+ exceeded = null;
420801
+ constructor(opts, abortController) {
420802
+ this.maxWallTimeSeconds = opts.maxWallTimeSeconds ?? -1;
420803
+ this.maxToolCalls = opts.maxToolCalls ?? -1;
420804
+ this.abortController = abortController;
420805
+ }
420806
+ /**
420807
+ * Starts the wall-clock timer (if configured). Idempotent so callers
420808
+ * don't need to thread "did I already start?" state.
420809
+ */
420810
+ start() {
420811
+ if (this.wallTimer !== null) return;
420812
+ if (this.maxWallTimeSeconds <= 0) return;
420813
+ this.wallTimer = setTimeout(() => {
420814
+ this.markExceeded({
420815
+ kind: "wall-time",
420816
+ limit: this.maxWallTimeSeconds,
420817
+ observed: this.maxWallTimeSeconds,
420818
+ message: `Run aborted: wall-clock budget of ${this.maxWallTimeSeconds}s exceeded (--max-wall-time).`
420819
+ });
420820
+ }, this.maxWallTimeSeconds * SECOND);
420821
+ this.wallTimer.unref?.();
420822
+ }
420823
+ /** Records one tool execution and enforces `maxToolCalls`. */
420824
+ tickToolCall() {
420825
+ this.toolCallCount += 1;
420826
+ if (this.maxToolCalls >= 0 && this.toolCallCount > this.maxToolCalls) {
420827
+ this.markExceeded({
420828
+ kind: "tool-calls",
420829
+ limit: this.maxToolCalls,
420830
+ observed: this.toolCallCount,
420831
+ message: `Run aborted: tool-call budget of ${this.maxToolCalls} exceeded (--max-tool-calls); observed ${this.toolCallCount}.`
420832
+ });
420833
+ }
420834
+ }
420835
+ /**
420836
+ * Returns the budget-exceeded record if one fired, else null. The
420837
+ * non-interactive loop checks this after `abortController.signal`
420838
+ * fires to distinguish "budget abort" from "user SIGINT" so it can
420839
+ * emit a structured-error envelope with the right reason.
420840
+ */
420841
+ getExceeded() {
420842
+ return this.exceeded;
420843
+ }
420844
+ /** Cancels the wall-clock timer. Safe to call multiple times. */
420845
+ stop() {
420846
+ if (this.wallTimer !== null) {
420847
+ clearTimeout(this.wallTimer);
420848
+ this.wallTimer = null;
420849
+ }
420850
+ }
420851
+ markExceeded(record2) {
420852
+ if (this.exceeded !== null) return;
420853
+ if (this.abortController.signal.aborted) return;
420854
+ this.exceeded = record2;
420855
+ this.stop();
420856
+ this.abortController.abort();
420857
+ }
420858
+ };
420859
+
420637
420860
  // packages/cli/src/config/config.ts
420638
420861
  var SESSION_ID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}(-agent-[a-zA-Z0-9_.-]+)?$/i;
420639
420862
  function isValidSessionId(value) {
@@ -420913,6 +421136,12 @@ async function parseArguments() {
420913
421136
  }).option("max-session-turns", {
420914
421137
  type: "number",
420915
421138
  description: "Maximum number of session turns"
421139
+ }).option("max-tool-calls", {
421140
+ type: "number",
421141
+ description: "Maximum number of tool calls for a headless run before aborting (exit code 55). Defaults to unlimited."
421142
+ }).option("max-wall-time", {
421143
+ type: "string",
421144
+ description: "Wall-clock budget for a headless run before aborting (exit code 55). Accepts seconds or a unit suffix (e.g. 90, 30s, 5m, 1h). Defaults to unlimited."
420916
421145
  }).option("core-tools", {
420917
421146
  type: "array",
420918
421147
  string: true,
@@ -421308,6 +421537,13 @@ async function loadCliConfig(settings2, argv, cwd6 = process.cwd(), overrideExte
421308
421537
  outputLanguageFilePath,
421309
421538
  sessionTokenLimit: settings2.model?.sessionTokenLimit ?? -1,
421310
421539
  maxSessionTurns: argv.maxSessionTurns ?? settings2.model?.maxSessionTurns ?? -1,
421540
+ maxToolCalls: validateMaxToolCalls(
421541
+ argv.maxToolCalls ?? settings2.model?.maxToolCalls ?? -1
421542
+ ),
421543
+ // The CLI flag is a duration string (parsed/validated by
421544
+ // parseDurationSeconds); the settings entry is a plain number of seconds
421545
+ // (validated by validateMaxWallTimeSetting). Flag wins when both are set.
421546
+ maxWallTimeSeconds: argv.maxWallTime !== void 0 ? parseDurationSeconds(argv.maxWallTime) : validateMaxWallTimeSetting(settings2.model?.maxWallTimeSeconds ?? -1),
421311
421547
  experimentalZedIntegration: argv.acp || argv.experimentalAcp || false,
421312
421548
  cronEnabled: settings2.experimental?.cron ?? false,
421313
421549
  listExtensions: argv.listExtensions || false,
@@ -424540,7 +424776,7 @@ var formatDuration = /* @__PURE__ */ __name((milliseconds) => {
424540
424776
 
424541
424777
  // packages/cli/src/generated/git-commit.ts
424542
424778
  init_esbuild_shims();
424543
- var GIT_COMMIT_INFO = "47108a5d6";
424779
+ var GIT_COMMIT_INFO = "8a7cb3843";
424544
424780
 
424545
424781
  // packages/cli/src/utils/systemInfo.ts
424546
424782
  async function getNpmVersion() {
@@ -436700,6 +436936,20 @@ async function runNonInteractive(config2, settings2, input, prompt_id, options2
436700
436936
  }, "stdoutErrorHandler");
436701
436937
  const geminiClient = config2.getGeminiClient();
436702
436938
  const abortController = options2.abortController ?? new AbortController();
436939
+ const budgetEnforcer = new RunBudgetEnforcer(
436940
+ {
436941
+ maxToolCalls: config2.getMaxToolCalls(),
436942
+ maxWallTimeSeconds: config2.getMaxWallTimeSeconds()
436943
+ },
436944
+ abortController
436945
+ );
436946
+ const routeAbort = /* @__PURE__ */ __name(() => {
436947
+ const exceeded = budgetEnforcer.getExceeded();
436948
+ if (exceeded) {
436949
+ handleBudgetExceededError(config2, exceeded);
436950
+ }
436951
+ handleCancellationError(config2);
436952
+ }, "routeAbort");
436703
436953
  const authError = await checkAuthPreflight(config2);
436704
436954
  if (authError) {
436705
436955
  if (outputFormat === OutputFormat.JSON || outputFormat === OutputFormat.STREAM_JSON) {
@@ -436809,12 +437059,16 @@ async function runNonInteractive(config2, settings2, input, prompt_id, options2
436809
437059
  }
436810
437060
  const initialParts = normalizePartList(initialPartList);
436811
437061
  let currentMessages = [{ role: "user", parts: initialParts }];
437062
+ budgetEnforcer.start();
436812
437063
  let isFirstTurn = true;
436813
437064
  while (true) {
436814
437065
  turnCount++;
436815
437066
  if (config2.getMaxSessionTurns() >= 0 && turnCount > config2.getMaxSessionTurns()) {
436816
437067
  handleMaxTurnsExceededError(config2);
436817
437068
  }
437069
+ if (abortController.signal.aborted) {
437070
+ routeAbort();
437071
+ }
436818
437072
  const toolCallRequests = [];
436819
437073
  const apiStartTime = Date.now();
436820
437074
  const responseStream = geminiClient.sendMessageStream(
@@ -436829,7 +437083,7 @@ async function runNonInteractive(config2, settings2, input, prompt_id, options2
436829
437083
  adapter.startAssistantMessage();
436830
437084
  for await (const event of responseStream) {
436831
437085
  if (abortController.signal.aborted) {
436832
- handleCancellationError(config2);
437086
+ routeAbort();
436833
437087
  }
436834
437088
  adapter.processEvent(event);
436835
437089
  if (event.type === GeminiEventType.ToolCallRequest) {
@@ -436862,6 +437116,10 @@ async function runNonInteractive(config2, settings2, input, prompt_id, options2
436862
437116
  finalRequestInfo.callId,
436863
437117
  adapter
436864
437118
  ) : createToolProgressHandler(finalRequestInfo, adapter);
437119
+ budgetEnforcer.tickToolCall();
437120
+ if (abortController.signal.aborted) {
437121
+ routeAbort();
437122
+ }
436865
437123
  const toolResponse = await executeToolCall(
436866
437124
  config2,
436867
437125
  finalRequestInfo,
@@ -436926,6 +437184,10 @@ async function runNonInteractive(config2, settings2, input, prompt_id, options2
436926
437184
  adapter.startAssistantMessage();
436927
437185
  for await (const event of cronStream) {
436928
437186
  if (abortController.signal.aborted) {
437187
+ if (budgetEnforcer.getExceeded()) {
437188
+ scheduler.stop();
437189
+ routeAbort();
437190
+ }
436929
437191
  const summary = scheduler.getExitSummary();
436930
437192
  scheduler.stop();
436931
437193
  if (summary) {
@@ -436950,6 +437212,10 @@ async function runNonInteractive(config2, settings2, input, prompt_id, options2
436950
437212
  requestInfo.callId,
436951
437213
  adapter
436952
437214
  ) : createToolProgressHandler(requestInfo, adapter);
437215
+ budgetEnforcer.tickToolCall();
437216
+ if (abortController.signal.aborted) {
437217
+ routeAbort();
437218
+ }
436953
437219
  const toolResponse = await executeToolCall(
436954
437220
  config2,
436955
437221
  requestInfo,
@@ -437028,6 +437294,7 @@ async function runNonInteractive(config2, settings2, input, prompt_id, options2
437028
437294
  });
437029
437295
  handleError(error40, config2);
437030
437296
  } finally {
437297
+ budgetEnforcer.stop();
437031
437298
  process.stdout.removeListener("error", stdoutErrorHandler);
437032
437299
  process.removeListener("SIGINT", shutdownHandler);
437033
437300
  process.removeListener("SIGTERM", shutdownHandler);
@@ -461455,7 +461722,7 @@ var getStatusText = /* @__PURE__ */ __name((status) => {
461455
461722
  return "Unknown";
461456
461723
  }
461457
461724
  }, "getStatusText");
461458
- var MAX_TOOL_CALLS = 5;
461725
+ var MAX_TOOL_CALLS2 = 5;
461459
461726
  var MAX_VERBOSE_TOOL_CALLS = 12;
461460
461727
  var MAX_TASK_PROMPT_LINES = 5;
461461
461728
  var DEFAULT_DETAIL_HEIGHT = 18;
@@ -461510,7 +461777,7 @@ var AgentExecutionDisplay = /* @__PURE__ */ __name(({
461510
461777
  Math.floor((renderableBudget - promptBudget) / ROWS_PER_TOOL_CALL)
461511
461778
  );
461512
461779
  const maxTaskPromptLines = displayMode === "verbose" ? Math.min(8, promptBudget) : Math.min(MAX_TASK_PROMPT_LINES, promptBudget);
461513
- const maxToolCalls = displayMode === "verbose" ? Math.min(MAX_VERBOSE_TOOL_CALLS, toolBudget) : Math.min(MAX_TOOL_CALLS, toolBudget);
461780
+ const maxToolCalls = displayMode === "verbose" ? Math.min(MAX_VERBOSE_TOOL_CALLS, toolBudget) : Math.min(MAX_TOOL_CALLS2, toolBudget);
461514
461781
  const agentColor = (0, import_react62.useMemo)(() => {
461515
461782
  const colorOption = COLOR_OPTIONS.find(
461516
461783
  (option2) => option2.name === data.subagentColor
@@ -493287,7 +493554,7 @@ var QwenAgent = class {
493287
493554
  async initialize(args2) {
493288
493555
  this.clientCapabilities = args2.clientCapabilities;
493289
493556
  const authMethods = buildAuthMethods();
493290
- const version2 = "0.48.1";
493557
+ const version2 = "0.50.0";
493291
493558
  return {
493292
493559
  protocolVersion: PROTOCOL_VERSION,
493293
493560
  agentInfo: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@protolabsai/proto",
3
- "version": "0.48.1",
3
+ "version": "0.50.0",
4
4
  "description": "proto - AI-powered coding agent",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21,7 +21,7 @@
21
21
  "bundled"
22
22
  ],
23
23
  "config": {
24
- "sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.48.1"
24
+ "sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.50.0"
25
25
  },
26
26
  "dependencies": {},
27
27
  "optionalDependencies": {