nexrall-code 0.5.103 → 0.5.104

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/dist/index.js +17 -4
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -9973,6 +9973,11 @@ var require_client = __commonJS({
9973
9973
  var MAX_RETRIES = 5;
9974
9974
  var RETRY_BASE_MS = 1e3;
9975
9975
  var RETRY_MAX_MS = 3e4;
9976
+ var HOUSEKEEPING_FRAMES = /* @__PURE__ */ new Set([
9977
+ "resumable",
9978
+ "context_warning",
9979
+ "tool_progress"
9980
+ ]);
9976
9981
  var MAX_TOTAL_RETRY_MS = (() => {
9977
9982
  const raw = Number(process.env.NEXRALL_MAX_RETRY_MS);
9978
9983
  return Number.isFinite(raw) && raw > 0 ? raw : 5 * 6e4;
@@ -10063,7 +10068,12 @@ var require_client = __commonJS({
10063
10068
  }
10064
10069
  ];
10065
10070
  };
10066
- const isRetryableStreamMsg = (m2) => /overloaded|rate.?limit|temporarily|unavailable|try again|internal server error/i.test(String(m2 ?? ""));
10071
+ const isRetryableStreamMsg = (m2) => {
10072
+ const s2 = String(m2 ?? "");
10073
+ if (/403[\s\S]*"type"\s*:\s*"forbidden"/i.test(s2))
10074
+ return true;
10075
+ return /overloaded|rate.?limit|temporarily|unavailable|try again|internal server error/i.test(s2);
10076
+ };
10067
10077
  let didRetry = false;
10068
10078
  let totalAttemptsMade = 0;
10069
10079
  let retryDeadline = 0;
@@ -10335,7 +10345,8 @@ var require_client = __commonJS({
10335
10345
  }
10336
10346
  const evt = parsed;
10337
10347
  lastProgressAt = Date.now();
10338
- sawModelEvent = true;
10348
+ if (!HOUSEKEEPING_FRAMES.has(evt.type))
10349
+ sawModelEvent = true;
10339
10350
  clearRetryIfNeeded();
10340
10351
  switch (evt.type) {
10341
10352
  case "text": {
@@ -10461,6 +10472,7 @@ var require_client = __commonJS({
10461
10472
  case "error": {
10462
10473
  const message = typeof evt.message === "string" ? evt.message : typeof evt.error === "string" ? evt.error : "Unknown SSE error";
10463
10474
  const notResumable = evt.notResumable === true;
10475
+ const serverSaysRetryable = evt.retryable === true;
10464
10476
  if (haveCompleteMessage()) {
10465
10477
  clearInterval(heartbeatWatchdog);
10466
10478
  onEvent({ type: "error", message });
@@ -10469,7 +10481,7 @@ var require_client = __commonJS({
10469
10481
  clearInterval(heartbeatWatchdog);
10470
10482
  stream.destroy?.();
10471
10483
  reject(Object.assign(tagTransient(new Error(message)), { forceRestart: true }));
10472
- } else if (isRetryableStreamMsg(message) && (!emittedToCaller || allowRestartAfterRender)) {
10484
+ } else if ((serverSaysRetryable || isRetryableStreamMsg(message)) && (!emittedToCaller || allowRestartAfterRender)) {
10473
10485
  clearInterval(heartbeatWatchdog);
10474
10486
  stream.destroy?.();
10475
10487
  reject(tagTransient(new Error(message)));
@@ -10494,7 +10506,8 @@ var require_client = __commonJS({
10494
10506
  });
10495
10507
  stream.on("end", () => {
10496
10508
  clearInterval(heartbeatWatchdog);
10497
- if (!sawModelEvent && !completedMessage) {
10509
+ const producedNothing = !completedMessage && textParts.length === 0 && toolUseBlocks.length === 0;
10510
+ if (producedNothing) {
10498
10511
  reject(Object.assign(new Error("Connection closed before the model responded. Retrying\u2026"), { retryable: true }));
10499
10512
  return;
10500
10513
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexrall-code",
3
- "version": "0.5.103",
3
+ "version": "0.5.104",
4
4
  "description": "Nexrall Code — AI coding assistant for your terminal (headless agent for scripts, CI and automation)",
5
5
  "keywords": [
6
6
  "ai",