@pentoshi/clai 3.11.3 → 3.11.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 (47) hide show
  1. package/dist/agent/runner.js +51 -10
  2. package/dist/agent/runner.js.map +1 -1
  3. package/dist/agent/stream-recovery.d.ts +15 -1
  4. package/dist/agent/stream-recovery.js +42 -2
  5. package/dist/agent/stream-recovery.js.map +1 -1
  6. package/dist/llm/agentrouter.js +2 -2
  7. package/dist/llm/agentrouter.js.map +1 -1
  8. package/dist/llm/bynara.js +2 -2
  9. package/dist/llm/bynara.js.map +1 -1
  10. package/dist/llm/http.d.ts +29 -3
  11. package/dist/llm/http.js +110 -25
  12. package/dist/llm/http.js.map +1 -1
  13. package/dist/llm/modal.js +7 -2
  14. package/dist/llm/modal.js.map +1 -1
  15. package/dist/llm/nvidia.js +6 -6
  16. package/dist/llm/nvidia.js.map +1 -1
  17. package/dist/llm/router.d.ts +1 -1
  18. package/dist/llm/router.js +59 -15
  19. package/dist/llm/router.js.map +1 -1
  20. package/dist/modes/ask.js +91 -23
  21. package/dist/modes/ask.js.map +1 -1
  22. package/dist/prompts/embedded.js +2 -2
  23. package/dist/prompts/embedded.js.map +1 -1
  24. package/dist/prompts/index.d.ts +7 -0
  25. package/dist/prompts/index.js +44 -4
  26. package/dist/prompts/index.js.map +1 -1
  27. package/dist/prompts/system.agent.md +2 -1
  28. package/dist/prompts/system.ask.md +1 -0
  29. package/dist/safety/classifier.js +3 -0
  30. package/dist/safety/classifier.js.map +1 -1
  31. package/dist/tools/definitions.js +15 -0
  32. package/dist/tools/definitions.js.map +1 -1
  33. package/dist/tools/image.d.ts +19 -1
  34. package/dist/tools/image.js +149 -1
  35. package/dist/tools/image.js.map +1 -1
  36. package/dist/tools/registry.js +13 -1
  37. package/dist/tools/registry.js.map +1 -1
  38. package/dist/tools/tool-types.d.ts +8 -1
  39. package/dist/tui-v2/components/transcript/transcript-view.js +155 -28
  40. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
  41. package/dist/tui-v2/components/transcript/use-transcript-selection.d.ts +2 -2
  42. package/dist/tui-v2/components/transcript/use-transcript-selection.js +7 -8
  43. package/dist/tui-v2/components/transcript/use-transcript-selection.js.map +1 -1
  44. package/dist/types.d.ts +17 -0
  45. package/dist/version.generated.d.ts +2 -2
  46. package/dist/version.generated.js +2 -2
  47. package/package.json +1 -1
@@ -12,12 +12,23 @@
12
12
  * These helpers are pure so the escalation ladder and the "give up only in the
13
13
  * worst case" guarantee are unit-testable without a live provider.
14
14
  */
15
- export type StreamFailureKind = "aborted" | "empty" | "context-overflow" | "rate-limit" | "server" | "network" | "auth" | "not-found" | "unknown";
15
+ export type StreamFailureKind = "aborted" | "empty" | "context-overflow" | "rate-limit" | "server"
16
+ /** Transport died: the socket dropped or never delivered a byte. */
17
+ | "network"
18
+ /**
19
+ * The connection stayed healthy but the model stopped producing output —
20
+ * almost always a runtime buffering one very large `tool_calls` argument
21
+ * string. Distinct from `network` because the request was accepted and the
22
+ * work was done: retrying the identical request on the identical route
23
+ * replays the whole generation and stalls again the same way.
24
+ */
25
+ | "stall" | "auth" | "not-found" | "unknown";
16
26
  export interface StreamRecoveryState {
17
27
  empty: number;
18
28
  rateLimit: number;
19
29
  server: number;
20
30
  network: number;
31
+ stall: number;
21
32
  context: number;
22
33
  /** auth / not-found / unknown share one "structural" bucket. */
23
34
  structural: number;
@@ -28,6 +39,7 @@ export interface StreamRecoveryLimits {
28
39
  readonly maxRateLimit: number;
29
40
  readonly maxServer: number;
30
41
  readonly maxNetwork: number;
42
+ readonly maxStall: number;
31
43
  readonly maxContext: number;
32
44
  readonly maxStructural: number;
33
45
  /** Hard cap across every failure class so a turn can never loop forever. */
@@ -48,6 +60,8 @@ export interface StreamRecoveryPlan {
48
60
  readonly disableThinking: boolean;
49
61
  /** Let the router fall back to another provider/model on the retry. */
50
62
  readonly allowModelFallback: boolean;
63
+ /** Try alternates before replaying the selected route (stall recovery only). */
64
+ readonly preferModelFallback?: boolean | undefined;
51
65
  /** Optional trailing user nudge (empty-admission recovery). */
52
66
  readonly nudge?: string | undefined;
53
67
  /** Human-facing one-liner; only set on the FIRST retry of a class (low noise). */
@@ -12,13 +12,16 @@
12
12
  * These helpers are pure so the escalation ladder and the "give up only in the
13
13
  * worst case" guarantee are unit-testable without a live provider.
14
14
  */
15
- import { ProviderError } from "../llm/http.js";
15
+ import { ProviderError, STREAM_STALL_MARKER } from "../llm/http.js";
16
16
  import { isEmptyCompletionError } from "../llm/router.js";
17
17
  export const DEFAULT_STREAM_RECOVERY_LIMITS = {
18
18
  maxEmpty: 4,
19
19
  maxRateLimit: 3,
20
20
  maxServer: 3,
21
21
  maxNetwork: 3,
22
+ // A stall costs a full generation per attempt, so the budget is tight and
23
+ // each attempt changes something (smaller writes, then another route).
24
+ maxStall: 2,
22
25
  maxContext: 2,
23
26
  maxStructural: 1,
24
27
  maxTotal: 10,
@@ -27,6 +30,10 @@ export const DEFAULT_STREAM_RECOVERY_LIMITS = {
27
30
  const EMPTY_NUDGE = "Your previous response was empty. Continue the task now: emit your next tool call, " +
28
31
  "or give your final answer if every required step is already complete and verified. " +
29
32
  "Do not reply with an empty message.";
33
+ const STALL_NUDGE = "The previous attempt stopped while the provider was buffering a large tool-call payload; the incomplete call was discarded. " +
34
+ "Keep each call small from here on: write or edit at most ~150 lines per call. For a new large file, use one initial " +
35
+ "fs.write followed by sequential fs.append calls; for an existing file, use several bounded fs.edit / fs.replaceLines calls. " +
36
+ "Continue from the preserved progress without restarting the task or repeating prior prose.";
30
37
  function errorStatus(error) {
31
38
  if (error instanceof ProviderError)
32
39
  return error.status ?? 0;
@@ -68,7 +75,12 @@ export function classifyStreamFailure(error) {
68
75
  /\b50[0-4]\b|upstream provider (unavailable|error)|server error \(5|bad gateway|service unavailable|gateway timeout|overloaded/.test(msg)) {
69
76
  return "server";
70
77
  }
71
- if (/connection glitch|socket connection was closed|econnreset|etimedout|econnrefused|enotfound|fetch failed|network error|premature close|stream stalled|unexpected end of file|request timed out|connection dropped|timed out before any response/.test(msg)) {
78
+ // A stall on a live connection must be checked BEFORE the network patterns:
79
+ // its message also contains "stream stalled", but the transport was fine and
80
+ // the fix is different (shrink the tool call / change route, not just retry).
81
+ if (new RegExp(STREAM_STALL_MARKER, "i").test(msg))
82
+ return "stall";
83
+ if (/connection glitch|socket connection was closed|econnreset|etimedout|econnrefused|enotfound|fetch failed|network error|premature close|stream stalled|transport timeout|unexpected end of file|request timed out|connection dropped|timed out before any response/.test(msg)) {
72
84
  return "network";
73
85
  }
74
86
  // Empty admission (no visible text, no tool calls). Cheap to retry / nudge.
@@ -92,6 +104,7 @@ export function createStreamRecoveryState() {
92
104
  rateLimit: 0,
93
105
  server: 0,
94
106
  network: 0,
107
+ stall: 0,
95
108
  context: 0,
96
109
  structural: 0,
97
110
  total: 0,
@@ -102,6 +115,7 @@ export function resetStreamRecoveryState(state) {
102
115
  state.rateLimit = 0;
103
116
  state.server = 0;
104
117
  state.network = 0;
118
+ state.stall = 0;
105
119
  state.context = 0;
106
120
  state.structural = 0;
107
121
  state.total = 0;
@@ -122,6 +136,9 @@ export function recordRecoveryAttempt(state, kind) {
122
136
  case "network":
123
137
  state.network += 1;
124
138
  break;
139
+ case "stall":
140
+ state.stall += 1;
141
+ break;
125
142
  case "context-overflow":
126
143
  state.context += 1;
127
144
  break;
@@ -226,6 +243,29 @@ export function planStreamRecovery(input) {
226
243
  notice: n === 0 ? "connection dropped — retrying" : undefined,
227
244
  };
228
245
  }
246
+ case "stall": {
247
+ const n = state.stall;
248
+ if (n >= limits.maxStall)
249
+ return giveUp;
250
+ return {
251
+ action: "retry",
252
+ kind,
253
+ // The transport is healthy, so there is nothing to wait out. Retry
254
+ // promptly and spend the budget on changing the request instead.
255
+ delayMs: pick([1_000, 3_000], n, cap),
256
+ forceCompact: false,
257
+ // Thinking multiplies the silent window before a tool call appears.
258
+ disableThinking: n >= 1,
259
+ // The same route will buffer the same way. Prefer a configured
260
+ // alternate first, but keep the selected route as the final fallback.
261
+ allowModelFallback: true,
262
+ preferModelFallback: true,
263
+ nudge: STALL_NUDGE,
264
+ notice: n === 0
265
+ ? "provider stopped streaming mid-response — retrying with smaller tool calls"
266
+ : undefined,
267
+ };
268
+ }
229
269
  case "context-overflow": {
230
270
  const n = state.context;
231
271
  if (n >= limits.maxContext)
@@ -1 +1 @@
1
- {"version":3,"file":"stream-recovery.js","sourceRoot":"","sources":["../../src/agent/stream-recovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stream-recovery.js","sourceRoot":"","sources":["../../src/agent/stream-recovery.ts"],"names":[],"mappings":"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"}
@@ -201,8 +201,8 @@ export const agentrouterProvider = {
201
201
  onToolCallDelta: request.onToolCallDelta,
202
202
  reasoning: request.thinking,
203
203
  reasoningStyle: "agentrouter",
204
- // Unified 60s stall budget (see DEFAULT_STREAM_IDLE_TIMEOUT_MS).
205
- idleTimeoutMs: 60_000,
204
+ // 60s first byte, but the mid-stream budget has to survive a fully
205
+ // buffered tool call (see DEFAULT_STREAM_IDLE_TIMEOUT_MS).
206
206
  initialIdleTimeoutMs: 60_000,
207
207
  headers,
208
208
  tools: request.tools,
@@ -1 +1 @@
1
- {"version":3,"file":"agentrouter.js","sourceRoot":"","sources":["../../src/llm/agentrouter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agentrouter.js","sourceRoot":"","sources":["../../src/llm/agentrouter.ts"],"names":[],"mappings":"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"}
@@ -79,8 +79,8 @@ export const bynaraProvider = {
79
79
  onToolCallDelta: request.onToolCallDelta,
80
80
  reasoning: request.thinking,
81
81
  reasoningStyle: "openai",
82
- // Unified 60s stall budget (see DEFAULT_STREAM_IDLE_TIMEOUT_MS).
83
- idleTimeoutMs: 60_000,
82
+ // 60s first byte, but the mid-stream budget has to survive a fully
83
+ // buffered tool call (see DEFAULT_STREAM_IDLE_TIMEOUT_MS).
84
84
  initialIdleTimeoutMs: 60_000,
85
85
  tools: request.tools,
86
86
  toolChoice: request.toolChoice,
@@ -1 +1 @@
1
- {"version":3,"file":"bynara.js","sourceRoot":"","sources":["../../src/llm/bynara.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bynara.js","sourceRoot":"","sources":["../../src/llm/bynara.ts"],"names":[],"mappings":"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"}
@@ -9,9 +9,29 @@ export declare function catalogEntryVision(entry: unknown): boolean | undefined;
9
9
  export declare function ingestModelCatalogEntries(provider: ProviderId, entries: readonly unknown[]): string[];
10
10
  export declare function ingestOpenAiModelCatalog(provider: ProviderId, payload: unknown): string[];
11
11
  export declare function readJson<T>(response: Response): Promise<T>;
12
- export declare const DEFAULT_STREAM_IDLE_TIMEOUT_MS = 90000;
13
- export declare const THINKING_STREAM_IDLE_TIMEOUT_MS = 120000;
12
+ /**
13
+ * Mid-stream silence budget.
14
+ *
15
+ * This is deliberately generous because "no bytes" does **not** mean "dead
16
+ * socket" on an OpenAI-compatible endpoint. Most self-hosted runtimes (vLLM /
17
+ * SGLang and the tool-call parsers layered on top of them) buffer an entire
18
+ * `tool_calls` delta before emitting it, so a model writing a large file goes
19
+ * completely silent on the wire for as long as the generation takes. A 90s
20
+ * budget aborted those healthy streams at `firstToken + 90s`, reported the
21
+ * abort as a network failure, and burned three identical retries that each
22
+ * re-generated the same prefix before one happened to finish inside the window.
23
+ */
24
+ export declare const DEFAULT_STREAM_IDLE_TIMEOUT_MS = 240000;
25
+ export declare const THINKING_STREAM_IDLE_TIMEOUT_MS = 300000;
14
26
  export declare const THINKING_STREAM_INITIAL_IDLE_TIMEOUT_MS = 300000;
27
+ /**
28
+ * Marker appended to the message of a stall that happened on a **live**
29
+ * connection (bytes/keepalives were still arriving, or output had already
30
+ * started and simply stopped). Such a stall is not a transport failure, so the
31
+ * recovery layer must not classify it as `network` and retry the identical
32
+ * request against the identical route.
33
+ */
34
+ export declare const STREAM_STALL_MARKER = "no model output";
15
35
  export interface StreamLineReaderOptions {
16
36
  signal?: AbortSignal | undefined;
17
37
  idleTimeoutMs?: number | undefined;
@@ -138,8 +158,14 @@ export declare function openAiCompatibleStream(options: {
138
158
  name?: string;
139
159
  argumentsBytes?: number;
140
160
  }) => void) | undefined;
141
- /** Abort a stream that produces no bytes for this long. Default 30s. */
161
+ /** Abort a stream that delivers no bytes for this long (mid-stream). */
142
162
  idleTimeoutMs?: number | undefined;
143
163
  initialIdleTimeoutMs?: number | undefined;
164
+ /**
165
+ * Abort a stream that delivers bytes but no model output for this long.
166
+ * Bounds a keepalive-only stream. Defaults to 1.5x the largest byte budget so
167
+ * it always outlasts the transport watchdog.
168
+ */
169
+ outputIdleTimeoutMs?: number | undefined;
144
170
  }): Promise<OpenAiCompatibleResult>;
145
171
  export declare function openAiCompatiblePing(baseUrl: string, apiKey: string, headers?: Record<string, string> | undefined): Promise<void>;
package/dist/llm/http.js CHANGED
@@ -229,9 +229,29 @@ async function readBodyCapped(response, maxBytes) {
229
229
  }
230
230
  return collected;
231
231
  }
232
- export const DEFAULT_STREAM_IDLE_TIMEOUT_MS = 90_000;
233
- export const THINKING_STREAM_IDLE_TIMEOUT_MS = 120_000;
232
+ /**
233
+ * Mid-stream silence budget.
234
+ *
235
+ * This is deliberately generous because "no bytes" does **not** mean "dead
236
+ * socket" on an OpenAI-compatible endpoint. Most self-hosted runtimes (vLLM /
237
+ * SGLang and the tool-call parsers layered on top of them) buffer an entire
238
+ * `tool_calls` delta before emitting it, so a model writing a large file goes
239
+ * completely silent on the wire for as long as the generation takes. A 90s
240
+ * budget aborted those healthy streams at `firstToken + 90s`, reported the
241
+ * abort as a network failure, and burned three identical retries that each
242
+ * re-generated the same prefix before one happened to finish inside the window.
243
+ */
244
+ export const DEFAULT_STREAM_IDLE_TIMEOUT_MS = 240_000;
245
+ export const THINKING_STREAM_IDLE_TIMEOUT_MS = 300_000;
234
246
  export const THINKING_STREAM_INITIAL_IDLE_TIMEOUT_MS = 300_000;
247
+ /**
248
+ * Marker appended to the message of a stall that happened on a **live**
249
+ * connection (bytes/keepalives were still arriving, or output had already
250
+ * started and simply stopped). Such a stall is not a transport failure, so the
251
+ * recovery layer must not classify it as `network` and retry the identical
252
+ * request against the identical route.
253
+ */
254
+ export const STREAM_STALL_MARKER = "no model output";
235
255
  function readWithAbort(reader, signal) {
236
256
  if (signal.aborted) {
237
257
  return Promise.reject(signal.reason ?? new Error("Stream aborted"));
@@ -861,21 +881,67 @@ export async function openAiCompatibleStream(options) {
861
881
  (reasoningOn
862
882
  ? THINKING_STREAM_INITIAL_IDLE_TIMEOUT_MS
863
883
  : idleTimeoutMs);
884
+ // "No bytes" and "no output" are different failures and need separate
885
+ // budgets. The transport watchdog is re-armed by every read, so an SSE
886
+ // keepalive comment, a `delta:{}` heartbeat, a role-only opening delta, or a
887
+ // multi-line frame still being assembled all count as proof that the
888
+ // connection is healthy. The output watchdog is re-armed only by real model
889
+ // progress, so a stream that keepalives forever without ever producing
890
+ // anything still fails instead of hanging.
891
+ const outputIdleTimeoutMs = options.outputIdleTimeoutMs ??
892
+ Math.round(Math.max(idleTimeoutMs, initialIdleTimeoutMs) * 1.5);
864
893
  const idleController = new AbortController();
865
- let idleTimer;
894
+ let transportTimer;
895
+ let outputTimer;
866
896
  let idleFired = false;
897
+ let firedWatchdog;
898
+ /** Budget of whichever watchdog fired, for the error message. */
899
+ let firedBudgetMs = initialIdleTimeoutMs;
900
+ /**
901
+ * Any bytes at all read off the socket, whether or not the frame carried
902
+ * model output. Separates "the route never answered" (retry the request) from
903
+ * "the model was working and went quiet" (a retry replays all of that work).
904
+ */
905
+ let sawTransportActivity = false;
906
+ /** Model-visible progress: content, reasoning, tool-call delta, or usage. */
867
907
  let sawStreamProgress = false;
868
- let activeIdleTimeoutMs = initialIdleTimeoutMs;
908
+ const fireStall = (watchdog, budgetMs) => {
909
+ // The two timers can expire in the same event-loop turn. Preserve the first
910
+ // cause so a transport outage is never relabeled by the output watchdog.
911
+ if (idleFired)
912
+ return;
913
+ idleFired = true;
914
+ firedWatchdog = watchdog;
915
+ firedBudgetMs = budgetMs;
916
+ idleController.abort();
917
+ };
918
+ const armTransportTimer = (budgetMs) => {
919
+ if (transportTimer)
920
+ clearTimeout(transportTimer);
921
+ transportTimer = setTimeout(() => fireStall("transport", budgetMs), budgetMs);
922
+ };
923
+ /** Bytes arrived — the connection is alive; re-arm the mid-stream budget. */
924
+ const noteTransportActivity = () => {
925
+ sawTransportActivity = true;
926
+ armTransportTimer(idleTimeoutMs);
927
+ };
869
928
  const resetIdleTimer = () => {
870
- if (idleTimer)
871
- clearTimeout(idleTimer);
872
- activeIdleTimeoutMs = sawStreamProgress ? idleTimeoutMs : initialIdleTimeoutMs;
873
- idleTimer = setTimeout(() => {
874
- idleFired = true;
875
- idleController.abort();
876
- }, activeIdleTimeoutMs);
929
+ sawStreamProgress = true;
930
+ noteTransportActivity();
931
+ if (outputTimer)
932
+ clearTimeout(outputTimer);
933
+ outputTimer = setTimeout(() => fireStall("output", outputIdleTimeoutMs), outputIdleTimeoutMs);
934
+ };
935
+ armTransportTimer(initialIdleTimeoutMs);
936
+ outputTimer = setTimeout(() => fireStall("output", outputIdleTimeoutMs), outputIdleTimeoutMs);
937
+ const clearIdleTimers = () => {
938
+ if (transportTimer)
939
+ clearTimeout(transportTimer);
940
+ if (outputTimer)
941
+ clearTimeout(outputTimer);
942
+ transportTimer = undefined;
943
+ outputTimer = undefined;
877
944
  };
878
- resetIdleTimer();
879
945
  const onCallerAbort = () => idleController.abort(options.signal?.reason);
880
946
  options.signal?.addEventListener("abort", onCallerAbort, { once: true });
881
947
  const supportsVision = modelAcceptsImages(options.providerId, options.model);
@@ -909,17 +975,15 @@ export async function openAiCompatibleStream(options) {
909
975
  });
910
976
  }
911
977
  catch (error) {
912
- if (idleTimer)
913
- clearTimeout(idleTimer);
978
+ clearIdleTimers();
914
979
  options.signal?.removeEventListener("abort", onCallerAbort);
915
980
  if (idleFired) {
916
- throw new ProviderError(`${options.provider} request timed out before any response (${Math.round(activeIdleTimeoutMs / 1000)}s)`);
981
+ throw new ProviderError(`${options.provider} request timed out before any response (${Math.round(firedBudgetMs / 1000)}s)`);
917
982
  }
918
983
  throw error;
919
984
  }
920
985
  if (!response.ok) {
921
- if (idleTimer)
922
- clearTimeout(idleTimer);
986
+ clearIdleTimers();
923
987
  options.signal?.removeEventListener("abort", onCallerAbort);
924
988
  try {
925
989
  await readJson(response);
@@ -932,15 +996,13 @@ export async function openAiCompatibleStream(options) {
932
996
  }
933
997
  }
934
998
  if (!response.body) {
935
- if (idleTimer)
936
- clearTimeout(idleTimer);
999
+ clearIdleTimers();
937
1000
  options.signal?.removeEventListener("abort", onCallerAbort);
938
1001
  throw new ProviderError(`${options.provider} returned no stream body`);
939
1002
  }
940
1003
  const contentType = response.headers.get("content-type") ?? "";
941
1004
  if (response.status === 202 || /\bapplication\/json\b/i.test(contentType)) {
942
- if (idleTimer)
943
- clearTimeout(idleTimer);
1005
+ clearIdleTimers();
944
1006
  options.signal?.removeEventListener("abort", onCallerAbort);
945
1007
  const data = await readJson(response);
946
1008
  if (response.status === 202) {
@@ -1091,8 +1153,7 @@ export async function openAiCompatibleStream(options) {
1091
1153
  }
1092
1154
  };
1093
1155
  const cleanup = () => {
1094
- if (idleTimer)
1095
- clearTimeout(idleTimer);
1156
+ clearIdleTimers();
1096
1157
  options.signal?.removeEventListener("abort", onCallerAbort);
1097
1158
  idleController.signal.removeEventListener("abort", cancelReaderOnAbort);
1098
1159
  };
@@ -1116,6 +1177,11 @@ export async function openAiCompatibleStream(options) {
1116
1177
  }
1117
1178
  if (done)
1118
1179
  break;
1180
+ // Bytes off the wire re-arm the watchdog before anything is parsed.
1181
+ // Keepalives and empty deltas are proof of a live connection, so they
1182
+ // must not be allowed to age out a stream that is merely quiet.
1183
+ if (value && value.byteLength > 0)
1184
+ noteTransportActivity();
1119
1185
  buffer += decoder.decode(value, { stream: true });
1120
1186
  const lines = buffer.split("\n");
1121
1187
  buffer = lines.pop() ?? "";
@@ -1189,7 +1255,6 @@ export async function openAiCompatibleStream(options) {
1189
1255
  reasoningToken ||
1190
1256
  token ||
1191
1257
  toolProgress) {
1192
- sawStreamProgress = true;
1193
1258
  resetIdleTimer();
1194
1259
  }
1195
1260
  if (choice?.finish_reason)
@@ -1260,7 +1325,27 @@ export async function openAiCompatibleStream(options) {
1260
1325
  }
1261
1326
  catch (error) {
1262
1327
  if (idleFired) {
1263
- throw new ProviderError(`${options.provider} stream stalled — no model output for ${Math.round(activeIdleTimeoutMs / 1000)}s. Try a smaller model or disable thinking with /variants off.`);
1328
+ const seconds = Math.round(firedBudgetMs / 1000);
1329
+ // Preserve the actual watchdog source. Any byte proves the route admitted
1330
+ // the request, but a later byte-silence timeout is still a transport
1331
+ // failure; only the output watchdog denotes a live keepalive-only/model
1332
+ // stall and receives STREAM_STALL_MARKER.
1333
+ if (firedWatchdog === "transport" || !sawTransportActivity) {
1334
+ if (!sawTransportActivity) {
1335
+ // Keep the established wording: both the router's transparent-retry
1336
+ // check and classifyStreamFailure key off this phrase to treat a route
1337
+ // that never answered as a retriable transport failure.
1338
+ throw new ProviderError(`${options.provider} request timed out before any response (${seconds}s) — no data arrived on the connection.`);
1339
+ }
1340
+ throw new ProviderError(`${options.provider} stream transport timeout (${seconds}s) — no data arrived on the connection after it had started.`);
1341
+ }
1342
+ throw new ProviderError(`${options.provider} stream stalled — ${STREAM_STALL_MARKER} for ${seconds}s` +
1343
+ (sawStreamProgress
1344
+ ? " after it had already started producing output. " +
1345
+ "The connection stayed open, so the model was most likely buffering one very large tool call. " +
1346
+ "Split large writes into smaller sequential calls, or try a smaller model / disable thinking with /variants off."
1347
+ : " — the connection stayed open but the model never produced anything. " +
1348
+ "Try another model, or disable thinking with /variants off."));
1264
1349
  }
1265
1350
  throw error;
1266
1351
  }