@protolabsai/proto 0.55.3 → 0.55.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.
Files changed (2) hide show
  1. package/cli.js +44 -26
  2. package/package.json +2 -2
package/cli.js CHANGED
@@ -146451,7 +146451,7 @@ var init_constants2 = __esm({
146451
146451
  "packages/core/dist/src/core/openaiContentGenerator/constants.js"() {
146452
146452
  "use strict";
146453
146453
  init_esbuild_shims();
146454
- DEFAULT_TIMEOUT = 12e4;
146454
+ DEFAULT_TIMEOUT = 6e5;
146455
146455
  DEFAULT_MAX_RETRIES = 3;
146456
146456
  DEFAULT_OPENAI_BASE_URL = "https://api.openai.com/v1";
146457
146457
  DEFAULT_DASHSCOPE_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1";
@@ -155562,7 +155562,8 @@ var init_pipeline = __esm({
155562
155562
  raiseAbortListenerCap(request3.config?.abortSignal);
155563
155563
  return this.executeWithErrorHandling(request3, userPromptId, true, effectiveModel, async (openaiRequest, context2) => {
155564
155564
  const stream2 = await this.client.chat.completions.create(openaiRequest, {
155565
- signal: request3.config?.abortSignal
155565
+ signal: request3.config?.abortSignal,
155566
+ timeout: 0
155566
155567
  });
155567
155568
  return this.processStreamWithLogging(stream2, context2, request3);
155568
155569
  });
@@ -167976,7 +167977,11 @@ var init_anthropicContentGenerator = __esm({
167976
167977
  stream: true
167977
167978
  };
167978
167979
  const stream2 = await this.client.messages.create(streamingRequest, {
167979
- signal: request3.config?.abortSignal
167980
+ signal: request3.config?.abortSignal,
167981
+ // Disable the client-level timeout for streaming requests. Same
167982
+ // rationale as the OpenAI pipeline: long agent turns can exceed
167983
+ // any fixed wall-clock timeout.
167984
+ timeout: 0
167980
167985
  });
167981
167986
  return this.processStreamWithSpan(stream2, span, startTime, modelId, logPrompts);
167982
167987
  } catch (error40) {
@@ -168684,7 +168689,7 @@ __export(geminiContentGenerator_exports, {
168684
168689
  createGeminiContentGenerator: () => createGeminiContentGenerator
168685
168690
  });
168686
168691
  function createGeminiContentGenerator(config2, gcConfig) {
168687
- const version2 = "0.55.3";
168692
+ const version2 = "0.55.4";
168688
168693
  const userAgent2 = config2.userAgent || `QwenCode/${version2} (${process.platform}; ${process.arch})`;
168689
168694
  const baseHeaders = {
168690
168695
  "User-Agent": userAgent2
@@ -169198,7 +169203,7 @@ var init_turn = __esm({
169198
169203
  init_errors();
169199
169204
  init_thoughtUtils();
169200
169205
  init_streamStall();
169201
- STREAM_STALL_TIMEOUT_MS = parseInt(process.env["PROTO_STREAM_STALL_TIMEOUT_MS"] ?? "300000", 10);
169206
+ STREAM_STALL_TIMEOUT_MS = parseInt(process.env["PROTO_STREAM_STALL_TIMEOUT_MS"] ?? "660000", 10);
169202
169207
  (function(GeminiEventType2) {
169203
169208
  GeminiEventType2["Content"] = "content";
169204
169209
  GeminiEventType2["ToolCallRequest"] = "tool_call_request";
@@ -169319,16 +169324,7 @@ ${[...this.pendingCitations].sort().join("\n")}`
169319
169324
  return;
169320
169325
  }
169321
169326
  if (e4 instanceof StreamStallError) {
169322
- yield {
169323
- type: GeminiEventType.Error,
169324
- value: {
169325
- error: {
169326
- message: e4.message,
169327
- status: void 0
169328
- }
169329
- }
169330
- };
169331
- return;
169327
+ throw e4;
169332
169328
  }
169333
169329
  const error40 = toFriendlyError(e4);
169334
169330
  if (error40 instanceof UnauthorizedError) {
@@ -172580,6 +172576,13 @@ function trimToolErrorsFromContext(contents, maxTrimPairs = 6) {
172580
172576
  }
172581
172577
  return trimmed2;
172582
172578
  }
172579
+ function isSdkTransportTimeoutError(error40) {
172580
+ if (!(error40 instanceof Error))
172581
+ return false;
172582
+ const msg = error40.message.toLowerCase();
172583
+ return msg.includes("request timed out") || msg.includes("request timeout") || msg.includes("connection timeout") || msg.includes("timed out") || error40.name === "TimeoutError" || // OpenAI SDK wraps transport timeouts with these codes
172584
+ error40.code === "ETIMEDOUT" || error40.code === "ESOCKETTIMEDOUT";
172585
+ }
172583
172586
  function isSchemaDepthError(errorMessage) {
172584
172587
  return errorMessage.includes("maximum schema depth exceeded");
172585
172588
  }
@@ -172601,6 +172604,7 @@ var init_geminiChat = __esm({
172601
172604
  init_tools();
172602
172605
  init_chatCompressionService();
172603
172606
  init_turn();
172607
+ init_streamStall();
172604
172608
  init_loggers();
172605
172609
  init_chatRecordingService();
172606
172610
  init_types4();
@@ -172644,6 +172648,7 @@ var init_geminiChat = __esm({
172644
172648
  this.type = type;
172645
172649
  }
172646
172650
  };
172651
+ __name(isSdkTransportTimeoutError, "isSdkTransportTimeoutError");
172647
172652
  GeminiChat = class {
172648
172653
  static {
172649
172654
  __name(this, "GeminiChat");
@@ -172758,12 +172763,18 @@ var init_geminiChat = __esm({
172758
172763
  await new Promise((res) => setTimeout(res, delayMs));
172759
172764
  continue;
172760
172765
  }
172761
- const isTransientStreamError = error40 instanceof InvalidStreamError;
172766
+ const isTransientStreamError = error40 instanceof InvalidStreamError || error40 instanceof StreamStallError || isSdkTransportTimeoutError(error40);
172762
172767
  if (isTransientStreamError && invalidStreamRetryCount < INVALID_STREAM_RETRY_CONFIG.maxRetries) {
172763
172768
  invalidStreamRetryCount++;
172764
172769
  const delayMs = INVALID_STREAM_RETRY_CONFIG.initialDelayMs * invalidStreamRetryCount;
172765
- debugLogger25.warn(`Invalid stream [${error40.type}] (retry ${invalidStreamRetryCount}/${INVALID_STREAM_RETRY_CONFIG.maxRetries}). Waiting ${delayMs / 1e3}s before retrying...`);
172766
- logContentRetry(self2.config, new ContentRetryEvent(invalidStreamRetryCount - 1, error40.type, delayMs, model));
172770
+ if (error40 instanceof StreamStallError) {
172771
+ debugLogger25.warn(`Stream stalled (retry ${invalidStreamRetryCount}/${INVALID_STREAM_RETRY_CONFIG.maxRetries}). Waiting ${delayMs / 1e3}s before retrying...`);
172772
+ } else if (isSdkTransportTimeoutError(error40)) {
172773
+ debugLogger25.warn(`SDK transport timeout (retry ${invalidStreamRetryCount}/${INVALID_STREAM_RETRY_CONFIG.maxRetries}). Waiting ${delayMs / 1e3}s before retrying...`);
172774
+ } else {
172775
+ debugLogger25.warn(`Invalid stream [${error40.type}] (retry ${invalidStreamRetryCount}/${INVALID_STREAM_RETRY_CONFIG.maxRetries}). Waiting ${delayMs / 1e3}s before retrying...`);
172776
+ }
172777
+ logContentRetry(self2.config, new ContentRetryEvent(invalidStreamRetryCount - 1, error40 instanceof StreamStallError ? "STREAM_STALL" : isSdkTransportTimeoutError(error40) ? "SDK_TRANSPORT_TIMEOUT" : error40.type, delayMs, model));
172767
172778
  yield { type: StreamEventType.RETRY };
172768
172779
  attempt--;
172769
172780
  await new Promise((res) => setTimeout(res, delayMs));
@@ -172835,6 +172846,12 @@ var init_geminiChat = __esm({
172835
172846
  if (lastError instanceof InvalidStreamError) {
172836
172847
  const totalAttempts = invalidStreamRetryCount + 1;
172837
172848
  logContentRetryFailure(self2.config, new ContentRetryFailureEvent(totalAttempts, lastError.type, model));
172849
+ } else if (lastError instanceof StreamStallError) {
172850
+ const totalAttempts = invalidStreamRetryCount + 1;
172851
+ logContentRetryFailure(self2.config, new ContentRetryFailureEvent(totalAttempts, "STREAM_STALL", model));
172852
+ } else if (isSdkTransportTimeoutError(lastError)) {
172853
+ const totalAttempts = invalidStreamRetryCount + 1;
172854
+ logContentRetryFailure(self2.config, new ContentRetryFailureEvent(totalAttempts, "SDK_TRANSPORT_TIMEOUT", model));
172838
172855
  }
172839
172856
  throw lastError;
172840
172857
  }
@@ -416974,7 +416991,7 @@ __name(getPackageJson, "getPackageJson");
416974
416991
  // packages/cli/src/utils/version.ts
416975
416992
  async function getCliVersion() {
416976
416993
  const pkgJson = await getPackageJson();
416977
- return "0.55.3";
416994
+ return "0.55.4";
416978
416995
  }
416979
416996
  __name(getCliVersion, "getCliVersion");
416980
416997
 
@@ -425174,7 +425191,7 @@ var formatDuration = /* @__PURE__ */ __name((milliseconds) => {
425174
425191
 
425175
425192
  // packages/cli/src/generated/git-commit.ts
425176
425193
  init_esbuild_shims();
425177
- var GIT_COMMIT_INFO = "72bbb0204";
425194
+ var GIT_COMMIT_INFO = "d473ef1d8";
425178
425195
 
425179
425196
  // packages/cli/src/utils/systemInfo.ts
425180
425197
  async function getNpmVersion() {
@@ -494063,7 +494080,7 @@ var QwenAgent = class {
494063
494080
  async initialize(args2) {
494064
494081
  this.clientCapabilities = args2.clientCapabilities;
494065
494082
  const authMethods = buildAuthMethods();
494066
- const version2 = "0.55.3";
494083
+ const version2 = "0.55.4";
494067
494084
  return {
494068
494085
  protocolVersion: PROTOCOL_VERSION,
494069
494086
  agentInfo: {
@@ -495160,11 +495177,12 @@ main().catch((error40) => {
495160
495177
  *
495161
495178
  * Stream stall detection — per-chunk idle watchdog for async generators.
495162
495179
  *
495163
- * The SDK's overall request timeout (120 s) covers the full lifetime of a
495164
- * request, but undici body/header timeouts are explicitly disabled in
495165
- * runtimeFetchOptions.ts to allow long streaming responses. This means a
495166
- * stream that *starts* and then *freezes* (connection open, no more chunks
495167
- * arriving) will not be detected until the full 120 s wall clock fires.
495180
+ * The SDK's overall request timeout (configurable via contentGenerator.timeout,
495181
+ * defaults to 600 s) covers the full lifetime of a request, but undici
495182
+ * body/header timeouts are explicitly disabled in runtimeFetchOptions.ts to
495183
+ * allow long streaming responses. This means a stream that *starts* and then
495184
+ * *freezes* (connection open, no more chunks arriving) will not be detected
495185
+ * until the full SDK wall clock fires.
495168
495186
  *
495169
495187
  * `withChunkTimeout` wraps any AsyncGenerator and races each `.next()` call
495170
495188
  * against a per-chunk idle timer. If no chunk arrives within `timeoutMs`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@protolabsai/proto",
3
- "version": "0.55.3",
3
+ "version": "0.55.4",
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.55.3"
24
+ "sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.55.4"
25
25
  },
26
26
  "dependencies": {},
27
27
  "optionalDependencies": {