@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.
- package/cli.js +275 -8
- 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.
|
|
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.
|
|
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 = "
|
|
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
|
-
|
|
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
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
24
|
+
"sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.50.0"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {},
|
|
27
27
|
"optionalDependencies": {
|