@ai-matrx/api 0.1.19 → 0.1.21

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 (130) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/account.d.cts +1 -1
  3. package/dist/account.d.ts +1 -1
  4. package/dist/agents.cjs +12 -12
  5. package/dist/agents.d.cts +1 -1
  6. package/dist/agents.d.ts +1 -1
  7. package/dist/agents.js +2 -2
  8. package/dist/ai.cjs +3 -3
  9. package/dist/ai.d.cts +1 -1
  10. package/dist/ai.d.ts +1 -1
  11. package/dist/ai.js +2 -2
  12. package/dist/apps.cjs +6 -6
  13. package/dist/apps.d.cts +1 -1
  14. package/dist/apps.d.ts +1 -1
  15. package/dist/apps.js +2 -2
  16. package/dist/architecture.cjs +11 -11
  17. package/dist/architecture.d.cts +1 -1
  18. package/dist/architecture.d.ts +1 -1
  19. package/dist/architecture.js +2 -2
  20. package/dist/audio.cjs +5 -5
  21. package/dist/audio.d.cts +1 -1
  22. package/dist/audio.d.ts +1 -1
  23. package/dist/audio.js +2 -2
  24. package/dist/chat.cjs +12 -12
  25. package/dist/chat.d.cts +1 -1
  26. package/dist/chat.d.ts +1 -1
  27. package/dist/chat.js +2 -2
  28. package/dist/{chunk-PKYPPATQ.cjs → chunk-2SXAAKGV.cjs} +45 -100
  29. package/dist/{chunk-JRPLPAIX.js → chunk-ER7WV43R.js} +4 -88
  30. package/dist/chunk-FNIYADWI.cjs +59 -0
  31. package/dist/{chunk-PIPE5OML.js → chunk-KIEAFMKB.js} +46 -100
  32. package/dist/{chunk-EV7AXV2X.cjs → chunk-SME66TWP.cjs} +7 -100
  33. package/dist/chunk-YTEOFGFC.js +57 -0
  34. package/dist/code.cjs +7 -7
  35. package/dist/code.d.cts +1 -1
  36. package/dist/code.d.ts +1 -1
  37. package/dist/code.js +2 -2
  38. package/dist/commerce.d.cts +1 -1
  39. package/dist/commerce.d.ts +1 -1
  40. package/dist/communications.cjs +5 -5
  41. package/dist/communications.d.cts +1 -1
  42. package/dist/communications.d.ts +1 -1
  43. package/dist/communications.js +2 -2
  44. package/dist/computer.cjs +5 -5
  45. package/dist/computer.d.cts +1 -1
  46. package/dist/computer.d.ts +1 -1
  47. package/dist/computer.js +2 -2
  48. package/dist/content.cjs +5 -5
  49. package/dist/content.d.cts +1 -1
  50. package/dist/content.d.ts +1 -1
  51. package/dist/content.js +2 -2
  52. package/dist/crm.cjs +3 -3
  53. package/dist/crm.d.cts +1 -1
  54. package/dist/crm.d.ts +1 -1
  55. package/dist/crm.js +2 -2
  56. package/dist/data.cjs +4 -4
  57. package/dist/data.d.cts +1 -1
  58. package/dist/data.d.ts +1 -1
  59. package/dist/data.js +2 -2
  60. package/dist/education.cjs +5 -5
  61. package/dist/education.d.cts +1 -1
  62. package/dist/education.d.ts +1 -1
  63. package/dist/education.js +2 -2
  64. package/dist/files.cjs +21 -21
  65. package/dist/files.d.cts +1 -1
  66. package/dist/files.d.ts +1 -1
  67. package/dist/files.js +2 -2
  68. package/dist/human-resources.d.cts +1 -1
  69. package/dist/human-resources.d.ts +1 -1
  70. package/dist/{index-YFW4xNti.d.cts → index-BXLIDtlM.d.cts} +1 -1
  71. package/dist/{index-YFW4xNti.d.ts → index-BXLIDtlM.d.ts} +1 -1
  72. package/dist/index.cjs +86 -129
  73. package/dist/index.d.cts +8 -123
  74. package/dist/index.d.ts +8 -123
  75. package/dist/index.js +8 -15
  76. package/dist/integrations.cjs +4 -4
  77. package/dist/integrations.d.cts +1 -1
  78. package/dist/integrations.d.ts +1 -1
  79. package/dist/integrations.js +2 -2
  80. package/dist/intelligence.cjs +11 -8
  81. package/dist/intelligence.d.cts +2 -2
  82. package/dist/intelligence.d.ts +2 -2
  83. package/dist/intelligence.js +6 -3
  84. package/dist/{keys.generated-BCPbimdi.d.cts → keys.generated-DE-t9kzx.d.cts} +6 -3
  85. package/dist/{keys.generated-BCPbimdi.d.ts → keys.generated-DE-t9kzx.d.ts} +6 -3
  86. package/dist/knowledge.cjs +43 -43
  87. package/dist/knowledge.d.cts +1 -1
  88. package/dist/knowledge.d.ts +1 -1
  89. package/dist/knowledge.js +2 -2
  90. package/dist/legal.cjs +7 -7
  91. package/dist/legal.d.cts +1 -1
  92. package/dist/legal.d.ts +1 -1
  93. package/dist/legal.js +2 -2
  94. package/dist/marketing.cjs +77 -77
  95. package/dist/marketing.d.cts +1 -1
  96. package/dist/marketing.d.ts +1 -1
  97. package/dist/marketing.js +2 -2
  98. package/dist/masterwork.cjs +33 -33
  99. package/dist/masterwork.d.cts +1 -1
  100. package/dist/masterwork.d.ts +1 -1
  101. package/dist/masterwork.js +2 -2
  102. package/dist/media.cjs +12 -12
  103. package/dist/media.d.cts +1 -1
  104. package/dist/media.d.ts +1 -1
  105. package/dist/media.js +2 -2
  106. package/dist/net.cjs +20 -19
  107. package/dist/net.js +2 -1
  108. package/dist/platform.cjs +4 -4
  109. package/dist/platform.d.cts +1 -1
  110. package/dist/platform.d.ts +1 -1
  111. package/dist/platform.js +2 -2
  112. package/dist/publish.cjs +8 -8
  113. package/dist/publish.d.cts +1 -1
  114. package/dist/publish.d.ts +1 -1
  115. package/dist/publish.js +2 -2
  116. package/dist/stream.cjs +11 -11
  117. package/dist/stream.d.cts +1 -1
  118. package/dist/stream.d.ts +1 -1
  119. package/dist/stream.js +2 -2
  120. package/dist/types.d.cts +2 -2
  121. package/dist/types.d.ts +2 -2
  122. package/dist/web.cjs +27 -27
  123. package/dist/web.d.cts +1 -1
  124. package/dist/web.d.ts +1 -1
  125. package/dist/web.js +2 -2
  126. package/dist/workflows.cjs +14 -14
  127. package/dist/workflows.d.cts +1 -1
  128. package/dist/workflows.d.ts +1 -1
  129. package/dist/workflows.js +2 -2
  130. package/package.json +2 -2
@@ -143,58 +143,6 @@ function toNetError(err) {
143
143
  );
144
144
  }
145
145
 
146
- // src/net/retry.ts
147
- function defaultRetryOn(err) {
148
- return isNetError(err) && err.retryable;
149
- }
150
- function sleep(ms, signal) {
151
- return new Promise((resolve, reject) => {
152
- const timer = setTimeout(() => {
153
- resolve();
154
- if (signal) signal.removeEventListener("abort", onAbort);
155
- }, ms);
156
- const onAbort = () => {
157
- clearTimeout(timer);
158
- reject(signal?.reason ?? new Error("Aborted"));
159
- };
160
- if (signal) {
161
- if (signal.aborted) {
162
- clearTimeout(timer);
163
- reject(signal.reason);
164
- } else {
165
- signal.addEventListener("abort", onAbort, { once: true });
166
- }
167
- }
168
- });
169
- }
170
- async function withRetry(fn, opts = {}) {
171
- const attempts = Math.max(1, opts.attempts ?? 3);
172
- const initialDelayMs = opts.initialDelayMs ?? 250;
173
- const maxDelayMs = opts.maxDelayMs ?? 4e3;
174
- const factor = opts.backoffFactor ?? 2;
175
- const jitter = Math.max(0, Math.min(1, opts.jitter ?? 0.25));
176
- const retryOn = opts.retryOn ?? defaultRetryOn;
177
- let lastErr;
178
- for (let attempt = 1; attempt <= attempts; attempt++) {
179
- if (opts.signal?.aborted) throw opts.signal.reason;
180
- try {
181
- return await fn(attempt);
182
- } catch (err) {
183
- lastErr = err;
184
- if (attempt === attempts || !retryOn(err)) throw err;
185
- const base = Math.min(
186
- maxDelayMs,
187
- initialDelayMs * Math.pow(factor, attempt - 1)
188
- );
189
- const jitterAmount = base * jitter * (Math.random() * 2 - 1);
190
- const delayMs = Math.max(0, Math.round(base + jitterAmount));
191
- opts.onRetry?.(attempt, err, delayMs);
192
- await sleep(delayMs, opts.signal);
193
- }
194
- }
195
- throw lastErr;
196
- }
197
-
198
146
  // src/net/resilient-fetch.ts
199
147
  var DEFAULTS = {
200
148
  connectTimeoutMs: 15e3,
@@ -263,58 +211,56 @@ async function resilientFetch(url, init = {}, opts = {}) {
263
211
  }
264
212
  }
265
213
 
266
- // src/net/stream-monitor.ts
267
- var DEFAULTS2 = {
268
- heartbeatTimeoutMs: 3e4,
269
- maxLifetimeMs: 6e5
270
- };
271
- async function* monitorStream(source, opts = {}) {
272
- const heartbeatTimeoutMs = opts.heartbeatTimeoutMs ?? DEFAULTS2.heartbeatTimeoutMs;
273
- const maxLifetimeMs = opts.maxLifetimeMs ?? DEFAULTS2.maxLifetimeMs;
274
- const abort = opts.abortController;
275
- const startedAt = Date.now();
276
- const iter = source[Symbol.asyncIterator]();
277
- while (true) {
278
- const elapsed = Date.now() - startedAt;
279
- const remainingLifetime = maxLifetimeMs - elapsed;
280
- if (remainingLifetime <= 0) {
281
- abort?.abort("total-timeout");
282
- throw new TotalTimeoutError(maxLifetimeMs);
214
+ // src/net/retry.ts
215
+ function defaultRetryOn(err) {
216
+ return isNetError(err) && err.retryable;
217
+ }
218
+ function sleep(ms, signal) {
219
+ return new Promise((resolve, reject) => {
220
+ const timer = setTimeout(() => {
221
+ resolve();
222
+ if (signal) signal.removeEventListener("abort", onAbort);
223
+ }, ms);
224
+ const onAbort = () => {
225
+ clearTimeout(timer);
226
+ reject(signal?.reason ?? new Error("Aborted"));
227
+ };
228
+ if (signal) {
229
+ if (signal.aborted) {
230
+ clearTimeout(timer);
231
+ reject(signal.reason);
232
+ } else {
233
+ signal.addEventListener("abort", onAbort, { once: true });
234
+ }
283
235
  }
284
- const deadline = Math.min(heartbeatTimeoutMs, remainingLifetime);
285
- let timer = null;
286
- let timedOutKind = null;
287
- const timeoutPromise = new Promise((_, reject) => {
288
- timer = setTimeout(() => {
289
- timedOutKind = deadline === remainingLifetime ? "total" : "heartbeat";
290
- abort?.abort(
291
- timedOutKind === "total" ? "total-timeout" : "heartbeat-timeout"
292
- );
293
- reject(
294
- timedOutKind === "total" ? new TotalTimeoutError(maxLifetimeMs) : new HeartbeatTimeoutError(heartbeatTimeoutMs)
295
- );
296
- }, deadline);
297
- });
298
- let result;
236
+ });
237
+ }
238
+ async function withRetry(fn, opts = {}) {
239
+ const attempts = Math.max(1, opts.attempts ?? 3);
240
+ const initialDelayMs = opts.initialDelayMs ?? 250;
241
+ const maxDelayMs = opts.maxDelayMs ?? 4e3;
242
+ const factor = opts.backoffFactor ?? 2;
243
+ const jitter = Math.max(0, Math.min(1, opts.jitter ?? 0.25));
244
+ const retryOn = opts.retryOn ?? defaultRetryOn;
245
+ let lastErr;
246
+ for (let attempt = 1; attempt <= attempts; attempt++) {
247
+ if (opts.signal?.aborted) throw opts.signal.reason;
299
248
  try {
300
- result = await Promise.race([iter.next(), timeoutPromise]);
249
+ return await fn(attempt);
301
250
  } catch (err) {
302
- if (timer !== null) clearTimeout(timer);
303
- try {
304
- const cleanup = iter.return?.(void 0);
305
- if (cleanup) {
306
- void Promise.resolve(cleanup).catch(() => {
307
- });
308
- }
309
- } catch {
310
- }
311
- throw err;
251
+ lastErr = err;
252
+ if (attempt === attempts || !retryOn(err)) throw err;
253
+ const base = Math.min(
254
+ maxDelayMs,
255
+ initialDelayMs * Math.pow(factor, attempt - 1)
256
+ );
257
+ const jitterAmount = base * jitter * (Math.random() * 2 - 1);
258
+ const delayMs = Math.max(0, Math.round(base + jitterAmount));
259
+ opts.onRetry?.(attempt, err, delayMs);
260
+ await sleep(delayMs, opts.signal);
312
261
  }
313
- if (timer !== null) clearTimeout(timer);
314
- if (result.done) return;
315
- opts.onHeartbeat?.(Date.now());
316
- yield result.value;
317
262
  }
263
+ throw lastErr;
318
264
  }
319
265
 
320
266
  exports.AbortedError = AbortedError;
@@ -328,7 +274,6 @@ exports.TotalTimeoutError = TotalTimeoutError;
328
274
  exports.extractErrorMessage = extractErrorMessage;
329
275
  exports.isNetError = isNetError;
330
276
  exports.isTransportFailure = isTransportFailure;
331
- exports.monitorStream = monitorStream;
332
277
  exports.resilientFetch = resilientFetch;
333
278
  exports.toNetError = toNetError;
334
279
  exports.withRetry = withRetry;
@@ -1,90 +1,7 @@
1
- import { resilientFetch, isNetError, withRetry, isTransportFailure, AbortedError, TotalTimeoutError } from './chunk-PIPE5OML.js';
1
+ import { withRetry, isTransportFailure, AbortedError, resilientFetch, TotalTimeoutError } from './chunk-KIEAFMKB.js';
2
2
  import { isUuidShape } from '@ai-matrx/kit/uuid';
3
3
  import { credentialToHeaders, toCredentialsPort, MATRX_HEADERS } from '@ai-matrx/auth/credentials';
4
4
 
5
- // src/core/protocol.ts
6
- var MATRX_AI_API_VERSION_DEFAULT = "v2";
7
- var V2_COVERED_AI_PATH_TEMPLATES = [
8
- "/ai/manual",
9
- "/ai/chat",
10
- "/ai/agents/{agent_id}",
11
- "/ai/agent/{agent_id}",
12
- // singular alias — behaves identically
13
- "/ai/conversations/{conversation_id}",
14
- "/ai/conversation/{conversation_id}",
15
- // singular alias
16
- "/ai/prompts/{prompt_id}",
17
- // saved-prompt execution
18
- "/ai/mandates/{mandate_key}"
19
- // THE MANDATE DOOR — `/v2` sibling exists (routers/v2.py)
20
- ];
21
- function toV2Path(path) {
22
- const withLead = path.startsWith("/") ? path : `/${path}`;
23
- if (withLead.startsWith("/api/")) {
24
- const rest = withLead.slice("/api".length);
25
- return rest.startsWith("/v2/") ? withLead : `/api/v2${rest}`;
26
- }
27
- return withLead.startsWith("/v2/") ? withLead : `/v2${withLead}`;
28
- }
29
- var COVERED_INTERPOLATED_PATH = [
30
- /^(?:\/api)?\/ai\/manual$/,
31
- /^(?:\/api)?\/ai\/chat$/,
32
- /^(?:\/api)?\/ai\/agents\/[^/]+$/,
33
- /^(?:\/api)?\/ai\/agent\/[^/]+$/,
34
- /^(?:\/api)?\/ai\/conversations\/[^/]+$/,
35
- /^(?:\/api)?\/ai\/conversation\/[^/]+$/,
36
- /^(?:\/api)?\/ai\/prompts\/[^/]+$/,
37
- // `/warm` etc. deliberately don't match
38
- /^(?:\/api)?\/ai\/mandates\/[^/]+$/
39
- // the mandate door
40
- ];
41
- function isCoveredAiPath(path) {
42
- return COVERED_INTERPOLATED_PATH.some((re) => re.test(path));
43
- }
44
- function isV2Path(pathOrUrl) {
45
- return /\/v2\/ai\//.test(pathOrUrl);
46
- }
47
- function toV1FallbackUrl(url) {
48
- return url.replace(/\/v2\/ai\//, "/ai/");
49
- }
50
- function applyAiApiVersion(path, version) {
51
- if (version !== "v2") return path;
52
- return isCoveredAiPath(path) ? toV2Path(path) : path;
53
- }
54
- async function fetchWithMatrxProtocolFallback(url, init, opts = {}) {
55
- const { onDowngrade, ...fetchOpts } = opts;
56
- const logDowngrade = (reason, status2) => {
57
- console.warn(
58
- `[matrx] ai_v2_downgrade \u2192 retrying on v1. v2=${url} reason=${reason}`
59
- );
60
- onDowngrade?.({ url, reason, ...status2 !== void 0 ? { status: status2 } : {} });
61
- };
62
- if (!isV2Path(url)) return resilientFetch(url, init, fetchOpts);
63
- let result;
64
- try {
65
- result = await resilientFetch(url, init, fetchOpts);
66
- } catch (err) {
67
- const isAbort = isNetError(err) && err.code === "aborted" || err instanceof Error && err.name === "AbortError";
68
- if (isAbort) throw err;
69
- logDowngrade(String(err));
70
- return resilientFetch(toV1FallbackUrl(url), init, fetchOpts);
71
- }
72
- const status = result.response.status;
73
- if (status === 404 || status === 405 || status >= 500) {
74
- logDowngrade(`HTTP ${status}`, status);
75
- return resilientFetch(toV1FallbackUrl(url), init, fetchOpts);
76
- }
77
- return result;
78
- }
79
- function aiVersionPathOverrides(version) {
80
- if (version !== "v2") return {};
81
- const map = {};
82
- for (const template of V2_COVERED_AI_PATH_TEMPLATES) {
83
- map[template] = toV2Path(template);
84
- }
85
- return map;
86
- }
87
-
88
5
  // src/core/backend-errors.ts
89
6
  var BackendApiError = class extends Error {
90
7
  /** Machine-readable error code */
@@ -1049,15 +966,14 @@ async function sendOnWire(request, auth = {}) {
1049
966
  );
1050
967
  }
1051
968
  }
1052
- return fetchWithMatrxProtocolFallback(
969
+ return resilientFetch(
1053
970
  request.url,
1054
971
  { ...request.fetchOptions, method, headers: merged, ...body !== void 0 ? { body } : {} },
1055
972
  {
1056
973
  ...request.signal ? { signal: request.signal } : {},
1057
974
  connectTimeoutMs: request.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS,
1058
975
  totalTimeoutMs: request.totalTimeoutMs !== void 0 ? request.totalTimeoutMs : null,
1059
- throwOnHttpError: false,
1060
- ...request.onProtocolDowngrade ? { onDowngrade: request.onProtocolDowngrade } : {}
976
+ throwOnHttpError: false
1061
977
  }
1062
978
  ).then((result) => {
1063
979
  if (request.onUploadProgress && body !== void 0) {
@@ -1278,4 +1194,4 @@ async function openJsonOrStream(api, op, args, options) {
1278
1194
  return { kind: "stream", stream: toStream(op, response, requestId, controller) };
1279
1195
  }
1280
1196
 
1281
- export { BackendApiError, CONTRACT_SHA256, DEFAULT_MATRX_NDJSON_READ_AHEAD, DEPLOYMENTS, DOMAINS, MATRX_AI_API_VERSION_DEFAULT, MatrxApiError, OrganizationContextError, StreamTransportError, V2_COVERED_AI_PATH_TEMPLATES, WIRE_FETCH_OPTION_KEYS, aiVersionPathOverrides, applyAiApiVersion, applyOrganizationContextHeader, assertOrganizationMatchesOperation, assertQueryOrganizationMatchesContext, createApi, createMatrxNdjsonFramer, createMatrxSseFramer, createOrganizationOperation, describeBackendFailure, extractMatrxErrorCode, extractMatrxErrorMessage, fetchWithMatrxProtocolFallback, getUserMessage, isBinaryType, isCoveredAiPath, isGenericUserMessage, isStreamTransportLost, isV2Path, normalizeMatrxStreamEnvelope, openJsonOrStream, openStream, parseCallApiError, parseHttpError, parseHttpErrorBody, parseMatrxSseFrame, parsePersistedBackendError, parseStreamError, readMatrxNdjsonStream, readMatrxSseStream, requireOrganizationContext, sendOnWire, toV1FallbackUrl, toV2Path, unwrapUpstreamError };
1197
+ export { BackendApiError, CONTRACT_SHA256, DEFAULT_MATRX_NDJSON_READ_AHEAD, DEPLOYMENTS, DOMAINS, MatrxApiError, OrganizationContextError, StreamTransportError, WIRE_FETCH_OPTION_KEYS, applyOrganizationContextHeader, assertOrganizationMatchesOperation, assertQueryOrganizationMatchesContext, createApi, createMatrxNdjsonFramer, createMatrxSseFramer, createOrganizationOperation, describeBackendFailure, extractMatrxErrorCode, extractMatrxErrorMessage, getUserMessage, isBinaryType, isGenericUserMessage, isStreamTransportLost, normalizeMatrxStreamEnvelope, openJsonOrStream, openStream, parseCallApiError, parseHttpError, parseHttpErrorBody, parseMatrxSseFrame, parsePersistedBackendError, parseStreamError, readMatrxNdjsonStream, readMatrxSseStream, requireOrganizationContext, sendOnWire, unwrapUpstreamError };
@@ -0,0 +1,59 @@
1
+ 'use strict';
2
+
3
+ var chunk2SXAAKGV_cjs = require('./chunk-2SXAAKGV.cjs');
4
+
5
+ // src/net/stream-monitor.ts
6
+ var DEFAULTS = {
7
+ heartbeatTimeoutMs: 3e4,
8
+ maxLifetimeMs: 6e5
9
+ };
10
+ async function* monitorStream(source, opts = {}) {
11
+ const heartbeatTimeoutMs = opts.heartbeatTimeoutMs ?? DEFAULTS.heartbeatTimeoutMs;
12
+ const maxLifetimeMs = opts.maxLifetimeMs ?? DEFAULTS.maxLifetimeMs;
13
+ const abort = opts.abortController;
14
+ const startedAt = Date.now();
15
+ const iter = source[Symbol.asyncIterator]();
16
+ while (true) {
17
+ const elapsed = Date.now() - startedAt;
18
+ const remainingLifetime = maxLifetimeMs - elapsed;
19
+ if (remainingLifetime <= 0) {
20
+ abort?.abort("total-timeout");
21
+ throw new chunk2SXAAKGV_cjs.TotalTimeoutError(maxLifetimeMs);
22
+ }
23
+ const deadline = Math.min(heartbeatTimeoutMs, remainingLifetime);
24
+ let timer = null;
25
+ let timedOutKind = null;
26
+ const timeoutPromise = new Promise((_, reject) => {
27
+ timer = setTimeout(() => {
28
+ timedOutKind = deadline === remainingLifetime ? "total" : "heartbeat";
29
+ abort?.abort(
30
+ timedOutKind === "total" ? "total-timeout" : "heartbeat-timeout"
31
+ );
32
+ reject(
33
+ timedOutKind === "total" ? new chunk2SXAAKGV_cjs.TotalTimeoutError(maxLifetimeMs) : new chunk2SXAAKGV_cjs.HeartbeatTimeoutError(heartbeatTimeoutMs)
34
+ );
35
+ }, deadline);
36
+ });
37
+ let result;
38
+ try {
39
+ result = await Promise.race([iter.next(), timeoutPromise]);
40
+ } catch (err) {
41
+ if (timer !== null) clearTimeout(timer);
42
+ try {
43
+ const cleanup = iter.return?.(void 0);
44
+ if (cleanup) {
45
+ void Promise.resolve(cleanup).catch(() => {
46
+ });
47
+ }
48
+ } catch {
49
+ }
50
+ throw err;
51
+ }
52
+ if (timer !== null) clearTimeout(timer);
53
+ if (result.done) return;
54
+ opts.onHeartbeat?.(Date.now());
55
+ yield result.value;
56
+ }
57
+ }
58
+
59
+ exports.monitorStream = monitorStream;
@@ -141,58 +141,6 @@ function toNetError(err) {
141
141
  );
142
142
  }
143
143
 
144
- // src/net/retry.ts
145
- function defaultRetryOn(err) {
146
- return isNetError(err) && err.retryable;
147
- }
148
- function sleep(ms, signal) {
149
- return new Promise((resolve, reject) => {
150
- const timer = setTimeout(() => {
151
- resolve();
152
- if (signal) signal.removeEventListener("abort", onAbort);
153
- }, ms);
154
- const onAbort = () => {
155
- clearTimeout(timer);
156
- reject(signal?.reason ?? new Error("Aborted"));
157
- };
158
- if (signal) {
159
- if (signal.aborted) {
160
- clearTimeout(timer);
161
- reject(signal.reason);
162
- } else {
163
- signal.addEventListener("abort", onAbort, { once: true });
164
- }
165
- }
166
- });
167
- }
168
- async function withRetry(fn, opts = {}) {
169
- const attempts = Math.max(1, opts.attempts ?? 3);
170
- const initialDelayMs = opts.initialDelayMs ?? 250;
171
- const maxDelayMs = opts.maxDelayMs ?? 4e3;
172
- const factor = opts.backoffFactor ?? 2;
173
- const jitter = Math.max(0, Math.min(1, opts.jitter ?? 0.25));
174
- const retryOn = opts.retryOn ?? defaultRetryOn;
175
- let lastErr;
176
- for (let attempt = 1; attempt <= attempts; attempt++) {
177
- if (opts.signal?.aborted) throw opts.signal.reason;
178
- try {
179
- return await fn(attempt);
180
- } catch (err) {
181
- lastErr = err;
182
- if (attempt === attempts || !retryOn(err)) throw err;
183
- const base = Math.min(
184
- maxDelayMs,
185
- initialDelayMs * Math.pow(factor, attempt - 1)
186
- );
187
- const jitterAmount = base * jitter * (Math.random() * 2 - 1);
188
- const delayMs = Math.max(0, Math.round(base + jitterAmount));
189
- opts.onRetry?.(attempt, err, delayMs);
190
- await sleep(delayMs, opts.signal);
191
- }
192
- }
193
- throw lastErr;
194
- }
195
-
196
144
  // src/net/resilient-fetch.ts
197
145
  var DEFAULTS = {
198
146
  connectTimeoutMs: 15e3,
@@ -261,58 +209,56 @@ async function resilientFetch(url, init = {}, opts = {}) {
261
209
  }
262
210
  }
263
211
 
264
- // src/net/stream-monitor.ts
265
- var DEFAULTS2 = {
266
- heartbeatTimeoutMs: 3e4,
267
- maxLifetimeMs: 6e5
268
- };
269
- async function* monitorStream(source, opts = {}) {
270
- const heartbeatTimeoutMs = opts.heartbeatTimeoutMs ?? DEFAULTS2.heartbeatTimeoutMs;
271
- const maxLifetimeMs = opts.maxLifetimeMs ?? DEFAULTS2.maxLifetimeMs;
272
- const abort = opts.abortController;
273
- const startedAt = Date.now();
274
- const iter = source[Symbol.asyncIterator]();
275
- while (true) {
276
- const elapsed = Date.now() - startedAt;
277
- const remainingLifetime = maxLifetimeMs - elapsed;
278
- if (remainingLifetime <= 0) {
279
- abort?.abort("total-timeout");
280
- throw new TotalTimeoutError(maxLifetimeMs);
212
+ // src/net/retry.ts
213
+ function defaultRetryOn(err) {
214
+ return isNetError(err) && err.retryable;
215
+ }
216
+ function sleep(ms, signal) {
217
+ return new Promise((resolve, reject) => {
218
+ const timer = setTimeout(() => {
219
+ resolve();
220
+ if (signal) signal.removeEventListener("abort", onAbort);
221
+ }, ms);
222
+ const onAbort = () => {
223
+ clearTimeout(timer);
224
+ reject(signal?.reason ?? new Error("Aborted"));
225
+ };
226
+ if (signal) {
227
+ if (signal.aborted) {
228
+ clearTimeout(timer);
229
+ reject(signal.reason);
230
+ } else {
231
+ signal.addEventListener("abort", onAbort, { once: true });
232
+ }
281
233
  }
282
- const deadline = Math.min(heartbeatTimeoutMs, remainingLifetime);
283
- let timer = null;
284
- let timedOutKind = null;
285
- const timeoutPromise = new Promise((_, reject) => {
286
- timer = setTimeout(() => {
287
- timedOutKind = deadline === remainingLifetime ? "total" : "heartbeat";
288
- abort?.abort(
289
- timedOutKind === "total" ? "total-timeout" : "heartbeat-timeout"
290
- );
291
- reject(
292
- timedOutKind === "total" ? new TotalTimeoutError(maxLifetimeMs) : new HeartbeatTimeoutError(heartbeatTimeoutMs)
293
- );
294
- }, deadline);
295
- });
296
- let result;
234
+ });
235
+ }
236
+ async function withRetry(fn, opts = {}) {
237
+ const attempts = Math.max(1, opts.attempts ?? 3);
238
+ const initialDelayMs = opts.initialDelayMs ?? 250;
239
+ const maxDelayMs = opts.maxDelayMs ?? 4e3;
240
+ const factor = opts.backoffFactor ?? 2;
241
+ const jitter = Math.max(0, Math.min(1, opts.jitter ?? 0.25));
242
+ const retryOn = opts.retryOn ?? defaultRetryOn;
243
+ let lastErr;
244
+ for (let attempt = 1; attempt <= attempts; attempt++) {
245
+ if (opts.signal?.aborted) throw opts.signal.reason;
297
246
  try {
298
- result = await Promise.race([iter.next(), timeoutPromise]);
247
+ return await fn(attempt);
299
248
  } catch (err) {
300
- if (timer !== null) clearTimeout(timer);
301
- try {
302
- const cleanup = iter.return?.(void 0);
303
- if (cleanup) {
304
- void Promise.resolve(cleanup).catch(() => {
305
- });
306
- }
307
- } catch {
308
- }
309
- throw err;
249
+ lastErr = err;
250
+ if (attempt === attempts || !retryOn(err)) throw err;
251
+ const base = Math.min(
252
+ maxDelayMs,
253
+ initialDelayMs * Math.pow(factor, attempt - 1)
254
+ );
255
+ const jitterAmount = base * jitter * (Math.random() * 2 - 1);
256
+ const delayMs = Math.max(0, Math.round(base + jitterAmount));
257
+ opts.onRetry?.(attempt, err, delayMs);
258
+ await sleep(delayMs, opts.signal);
310
259
  }
311
- if (timer !== null) clearTimeout(timer);
312
- if (result.done) return;
313
- opts.onHeartbeat?.(Date.now());
314
- yield result.value;
315
260
  }
261
+ throw lastErr;
316
262
  }
317
263
 
318
- export { AbortedError, ConnectTimeoutError, HeartbeatTimeoutError, HttpError, NetError, NetworkError, OfflineError, TotalTimeoutError, extractErrorMessage, isNetError, isTransportFailure, monitorStream, resilientFetch, toNetError, withRetry };
264
+ export { AbortedError, ConnectTimeoutError, HeartbeatTimeoutError, HttpError, NetError, NetworkError, OfflineError, TotalTimeoutError, extractErrorMessage, isNetError, isTransportFailure, resilientFetch, toNetError, withRetry };