@aexhq/sdk 0.40.6 → 0.40.8

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 (53) hide show
  1. package/README.md +159 -159
  2. package/dist/_contracts/asset-upload-helper.d.ts +38 -0
  3. package/dist/_contracts/asset-upload-helper.js +111 -0
  4. package/dist/_contracts/internal.d.ts +5 -9
  5. package/dist/_contracts/internal.js +5 -79
  6. package/dist/_contracts/operations.d.ts +9 -2
  7. package/dist/_contracts/operations.js +141 -16
  8. package/dist/_contracts/retry-core.d.ts +27 -0
  9. package/dist/_contracts/retry-core.js +75 -0
  10. package/dist/_contracts/runtime-types.d.ts +6 -0
  11. package/dist/_contracts/stable.d.ts +10 -5
  12. package/dist/_contracts/stable.js +10 -5
  13. package/dist/asset-upload.d.ts +2 -1
  14. package/dist/asset-upload.js +28 -61
  15. package/dist/asset-upload.js.map +1 -1
  16. package/dist/cli.mjs +297 -80
  17. package/dist/cli.mjs.sha256 +1 -1
  18. package/dist/client.d.ts +5 -0
  19. package/dist/client.js +8 -13
  20. package/dist/client.js.map +1 -1
  21. package/dist/retry.js +13 -41
  22. package/dist/retry.js.map +1 -1
  23. package/dist/version.d.ts +1 -1
  24. package/dist/version.js +1 -1
  25. package/docs/authentication.md +125 -125
  26. package/docs/billing.md +118 -118
  27. package/docs/concepts/agent-tools.md +66 -66
  28. package/docs/concepts/composition.md +37 -37
  29. package/docs/concepts/providers-and-runtimes.md +54 -54
  30. package/docs/concepts/runs.md +49 -49
  31. package/docs/concepts/subagents.md +88 -88
  32. package/docs/credentials.md +125 -125
  33. package/docs/defaults.md +64 -64
  34. package/docs/errors.md +196 -196
  35. package/docs/events.md +243 -243
  36. package/docs/limits-and-quotas.md +144 -144
  37. package/docs/limits.md +50 -50
  38. package/docs/mcp.md +44 -44
  39. package/docs/networking.md +163 -163
  40. package/docs/outputs.md +267 -267
  41. package/docs/public-surface.json +77 -77
  42. package/docs/quickstart.md +119 -119
  43. package/docs/release.md +38 -38
  44. package/docs/retries.md +129 -129
  45. package/docs/run-config.md +58 -58
  46. package/docs/run-record.md +55 -55
  47. package/docs/secrets.md +125 -125
  48. package/docs/testing.md +35 -35
  49. package/docs/vision-skills.md +91 -91
  50. package/docs/webhooks.md +127 -127
  51. package/examples/feature-tour.ts +282 -282
  52. package/examples/spike-settle-latency.ts +125 -125
  53. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import { strToU8, zipSync } from "fflate";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { normalizeRunUnit } from "./run-unit.js";
4
- import { RunConfigValidationError, RunStateError } from "./sdk-errors.js";
4
+ import { AexNetworkError, RunConfigValidationError, RunStateError } from "./sdk-errors.js";
5
5
  import { assertRunRecordArchivePublicSafeV1, buildRunRecordDownloadManifestV1 } from "./run-record.js";
6
6
  /**
7
7
  * The single source of truth for SDK<->BFF transport. The SDK class
@@ -369,17 +369,22 @@ export function resolveOutputFileSelector(outputs, selector, runId) {
369
369
  }
370
370
  return { ...selector, id: selector.id };
371
371
  }
372
- export async function downloadOutput(http, runId, selector) {
372
+ export async function downloadOutput(http, runId, selector, options) {
373
373
  const output = isPathSelector(selector)
374
374
  ? resolveOutputFileSelector(await listOutputs(http, runId), selector, runId)
375
375
  : resolveOutputFileSelector([], selector, runId);
376
- const { response } = await http.download(`/api/runs/${encodeURIComponent(runId)}/outputs/${encodeURIComponent(output.id)}/download`);
377
- return { output, bytes: new Uint8Array(await response.arrayBuffer()) };
376
+ const timeoutMs = normalizeOutputTransferTimeoutMs(options?.timeoutMs);
377
+ const path = `/api/runs/${encodeURIComponent(runId)}/outputs/${encodeURIComponent(output.id)}/download`;
378
+ return { output, bytes: await downloadOutputBytesWithRetry(http, path, timeoutMs) };
378
379
  }
379
380
  /** Byte ceiling for {@link readOutputText} — a hard cap even if a caller asks for more. */
380
381
  export const READ_OUTPUT_TEXT_MAX_BYTES = 10_000_000;
381
382
  /** Default `maxBytes` for {@link readOutputText} — a chat-sized preview. */
382
383
  export const READ_OUTPUT_TEXT_DEFAULT_BYTES = 50_000;
384
+ /** Default per-attempt timeout while fetching or reading one output body. */
385
+ export const OUTPUT_FILE_TRANSFER_DEFAULT_TIMEOUT_MS = 15_000;
386
+ /** Idempotent output GETs retry once on a transfer timeout. */
387
+ export const OUTPUT_FILE_TRANSFER_ATTEMPTS = 2;
383
388
  /**
384
389
  * Read ONE output file as byte-capped, decoded UTF-8 text. Built for handing a run
385
390
  * deliverable to an LLM tool: it streams the file body and STOPS at `maxBytes`, so
@@ -394,25 +399,140 @@ export async function readOutputText(http, runId, selector, options) {
394
399
  const output = isPathSelector(selector)
395
400
  ? resolveOutputFileSelector(await listOutputs(http, runId), selector, runId)
396
401
  : resolveOutputFileSelector([], selector, runId);
397
- const { response } = await http.download(`/api/runs/${encodeURIComponent(runId)}/outputs/${encodeURIComponent(output.id)}/download`);
398
- const capped = await readCappedText(response, maxBytes);
402
+ const timeoutMs = normalizeOutputTransferTimeoutMs(options?.timeoutMs);
403
+ const path = `/api/runs/${encodeURIComponent(runId)}/outputs/${encodeURIComponent(output.id)}/download`;
404
+ const capped = await readOutputTextWithRetry(http, path, maxBytes, timeoutMs);
399
405
  const text = options?.grep === undefined ? capped.text : grepLines(capped.text, options.grep);
400
406
  return { output, text, truncated: capped.truncated, totalBytes: capped.totalBytes };
401
407
  }
408
+ async function downloadOutputBytesWithRetry(http, path, timeoutMs) {
409
+ return outputTransferWithRetry(path, timeoutMs, async () => {
410
+ const response = await downloadOutputResponse(http, path, timeoutMs);
411
+ return readResponseBytes(response, timeoutMs);
412
+ });
413
+ }
414
+ async function readOutputTextWithRetry(http, path, maxBytes, timeoutMs) {
415
+ return outputTransferWithRetry(path, timeoutMs, async () => {
416
+ const response = await downloadOutputResponse(http, path, timeoutMs);
417
+ return readCappedText(response, maxBytes, timeoutMs);
418
+ });
419
+ }
420
+ async function downloadOutputResponse(http, path, timeoutMs) {
421
+ const controller = new AbortController();
422
+ const { response } = await withOutputTransferTimeout(http.download(path, { signal: controller.signal }), timeoutMs, () => controller.abort(), "output response");
423
+ return response;
424
+ }
425
+ async function outputTransferWithRetry(path, timeoutMs, action) {
426
+ const startedMs = Date.now();
427
+ let lastTimeout;
428
+ for (let attempt = 1; attempt <= OUTPUT_FILE_TRANSFER_ATTEMPTS; attempt += 1) {
429
+ try {
430
+ return await action();
431
+ }
432
+ catch (err) {
433
+ if (!(err instanceof OutputTransferTimeoutError))
434
+ throw err;
435
+ lastTimeout = err;
436
+ }
437
+ }
438
+ throw new AexNetworkError({
439
+ method: "GET",
440
+ host: "",
441
+ path,
442
+ cause: lastTimeout ?? new OutputTransferTimeoutError("output transfer", timeoutMs),
443
+ attempts: OUTPUT_FILE_TRANSFER_ATTEMPTS,
444
+ elapsedMs: Date.now() - startedMs
445
+ });
446
+ }
447
+ function normalizeOutputTransferTimeoutMs(value) {
448
+ if (value === undefined)
449
+ return OUTPUT_FILE_TRANSFER_DEFAULT_TIMEOUT_MS;
450
+ if (!Number.isFinite(value) || value <= 0) {
451
+ throw new RunConfigValidationError("outputs.download: timeoutMs must be a positive finite number", {
452
+ timeoutMs: value
453
+ });
454
+ }
455
+ return Math.max(1, Math.floor(value));
456
+ }
457
+ class OutputTransferTimeoutError extends Error {
458
+ code = "ETIMEDOUT";
459
+ constructor(label, timeoutMs) {
460
+ super(`${label} timed out after ${timeoutMs}ms`);
461
+ this.name = "OutputTransferTimeoutError";
462
+ }
463
+ }
464
+ async function withOutputTransferTimeout(promise, timeoutMs, abort, label) {
465
+ let timedOut = false;
466
+ let timeout;
467
+ const timeoutPromise = new Promise((_, reject) => {
468
+ timeout = setTimeout(() => {
469
+ timedOut = true;
470
+ reject(new OutputTransferTimeoutError(label, timeoutMs));
471
+ queueMicrotask(() => {
472
+ try {
473
+ abort();
474
+ }
475
+ catch {
476
+ // Best effort: the timeout itself is the user-facing failure.
477
+ }
478
+ });
479
+ }, timeoutMs);
480
+ });
481
+ try {
482
+ return await Promise.race([promise, timeoutPromise]);
483
+ }
484
+ catch (err) {
485
+ if (timedOut && isAbortLikeError(err))
486
+ throw new OutputTransferTimeoutError(label, timeoutMs);
487
+ throw err;
488
+ }
489
+ finally {
490
+ if (timeout !== undefined)
491
+ clearTimeout(timeout);
492
+ }
493
+ }
494
+ function isAbortLikeError(err) {
495
+ const name = err?.name;
496
+ return name === "AbortError";
497
+ }
498
+ async function readResponseBytes(response, timeoutMs) {
499
+ const body = response.body;
500
+ if (!body) {
501
+ const buffer = await withOutputTransferTimeout(response.arrayBuffer(), timeoutMs, () => { }, "output body");
502
+ return new Uint8Array(buffer);
503
+ }
504
+ const reader = body.getReader();
505
+ const chunks = [];
506
+ try {
507
+ while (true) {
508
+ const { done, value } = await withOutputTransferTimeout(reader.read(), timeoutMs, () => {
509
+ void reader.cancel().catch(() => { });
510
+ }, "output body");
511
+ if (done)
512
+ break;
513
+ if (value && value.byteLength > 0)
514
+ chunks.push(value);
515
+ }
516
+ }
517
+ finally {
518
+ void reader.cancel().catch(() => { });
519
+ }
520
+ return concatBytes(chunks);
521
+ }
402
522
  /**
403
523
  * Read a streamed response body up to `maxBytes`, decode as UTF-8, and report
404
524
  * whether the file was larger than the cap. Prefers the `content-length` header
405
525
  * for `totalBytes`; falls back to the bytes actually read. Cancels the stream
406
526
  * once the cap is reached so the remainder is never transferred.
407
527
  */
408
- async function readCappedText(response, maxBytes) {
528
+ async function readCappedText(response, maxBytes, timeoutMs) {
409
529
  const declaredRaw = response.headers.get("content-length");
410
530
  const declared = declaredRaw !== null && /^\d+$/.test(declaredRaw) ? Number(declaredRaw) : undefined;
411
531
  const decoder = new TextDecoder("utf-8");
412
532
  const body = response.body;
413
533
  if (!body) {
414
534
  // No streaming body (some fetch polyfills) — buffer, then slice to the cap.
415
- const buf = new Uint8Array(await response.arrayBuffer());
535
+ const buf = new Uint8Array(await withOutputTransferTimeout(response.arrayBuffer(), timeoutMs, () => { }, "output body"));
416
536
  const total = declared ?? buf.byteLength;
417
537
  return {
418
538
  text: decoder.decode(buf.subarray(0, maxBytes)),
@@ -426,7 +546,9 @@ async function readCappedText(response, maxBytes) {
426
546
  let sawMore = false;
427
547
  try {
428
548
  while (read < maxBytes) {
429
- const { done, value } = await reader.read();
549
+ const { done, value } = await withOutputTransferTimeout(reader.read(), timeoutMs, () => {
550
+ void reader.cancel().catch(() => { });
551
+ }, "output body");
430
552
  if (done)
431
553
  break;
432
554
  if (value && value.byteLength > 0) {
@@ -436,13 +558,15 @@ async function readCappedText(response, maxBytes) {
436
558
  }
437
559
  if (read >= maxBytes) {
438
560
  // We hit the cap; peek once more to learn whether bytes remain, then stop.
439
- const next = await reader.read();
561
+ const next = await withOutputTransferTimeout(reader.read(), timeoutMs, () => {
562
+ void reader.cancel().catch(() => { });
563
+ }, "output body");
440
564
  if (!next.done && next.value && next.value.byteLength > 0)
441
565
  sawMore = true;
442
566
  }
443
567
  }
444
568
  finally {
445
- await reader.cancel().catch(() => { });
569
+ void reader.cancel().catch(() => { });
446
570
  }
447
571
  const merged = concatBytes(chunks).subarray(0, maxBytes);
448
572
  const truncated = declared !== undefined ? declared > maxBytes : read > maxBytes || sawMore;
@@ -578,17 +702,17 @@ export async function getWebhookSigningSecret(http) {
578
702
  * surfaced (never silent) while a partially-available run still yields a
579
703
  * usable zip.
580
704
  */
581
- async function collectArtifactBytes(http, runId, items, zipPrefix, namespace) {
705
+ async function collectArtifactBytes(http, runId, items, zipPrefix, namespace, timeoutMs = OUTPUT_FILE_TRANSFER_DEFAULT_TIMEOUT_MS) {
582
706
  const entries = [];
583
707
  const captured = [];
584
708
  const errors = [];
585
709
  for (const item of items) {
586
710
  const rel = item.filename ?? item.id;
587
711
  try {
588
- const { response } = await http.download(`/api/runs/${encodeURIComponent(runId)}/${namespace}/${encodeURIComponent(item.id)}/download`);
712
+ const path = `/api/runs/${encodeURIComponent(runId)}/${namespace}/${encodeURIComponent(item.id)}/download`;
589
713
  entries.push({
590
714
  path: `${zipPrefix}${rel}`,
591
- bytes: new Uint8Array(await response.arrayBuffer()),
715
+ bytes: await downloadOutputBytesWithRetry(http, path, timeoutMs),
592
716
  ...(item.contentType !== undefined ? { contentType: item.contentType } : {}),
593
717
  customerContent: true
594
718
  });
@@ -843,9 +967,10 @@ export async function download(http, runId) {
843
967
  * layout: `<rel>` per file plus a `manifest.json`
844
968
  * (`{ runId, namespace: "outputs", outputs[], errors[] }`).
845
969
  */
846
- export async function downloadOutputs(http, runId) {
970
+ export async function downloadOutputs(http, runId, options) {
847
971
  const outputs = await listOutputs(http, runId);
848
- const { entries, captured, errors } = await collectArtifactBytes(http, runId, outputs, "", "outputs");
972
+ const timeoutMs = normalizeOutputTransferTimeoutMs(options?.timeoutMs);
973
+ const { entries, captured, errors } = await collectArtifactBytes(http, runId, outputs, "", "outputs", timeoutMs);
849
974
  return zipEntries([
850
975
  ...entries,
851
976
  jsonEntry("manifest.json", { runId, namespace: "outputs", outputs: captured, errors })
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Public-safe retry primitives shared by public packages through the
3
+ * `@aexhq/contracts/internal` subpath. Keep this module free of hosted
4
+ * implementation details and do not export it from the public contracts root.
5
+ */
6
+ export declare const RETRYABLE_HTTP_STATUS: readonly number[];
7
+ export declare const RATE_LIMIT_HTTP_STATUS: readonly number[];
8
+ export interface RetryBackoffConfig {
9
+ readonly initialDelayMs: number;
10
+ readonly maxDelayMs: number;
11
+ }
12
+ export type RetryRandom = () => number;
13
+ export declare function isRetryableHttpStatus(status: number): boolean;
14
+ export declare function isRateLimitHttpStatus(status: number): boolean;
15
+ /**
16
+ * Parse an HTTP `Retry-After` header into milliseconds. RFC 7231 permits either
17
+ * a non-negative integer number of seconds or an HTTP-date.
18
+ */
19
+ export declare function parseRetryAfterMs(headerValue: string | null | undefined, now?: number): number | undefined;
20
+ /**
21
+ * Full-jitter exponential backoff: the nominal wait doubles per failed attempt
22
+ * and the actual delay is sampled uniformly in `[0, nominal]`.
23
+ */
24
+ export declare function computeRetryBackoffDelayMs(config: RetryBackoffConfig, attemptNumber: number, random: RetryRandom): number;
25
+ /** Combine a server `Retry-After` floor with the jittered backoff delay. */
26
+ export declare function computeRetryDelayMs(config: RetryBackoffConfig, attemptNumber: number, random: RetryRandom, retryAfterMs: number | undefined): number;
27
+ export declare function abortableSleep(ms: number, signal?: AbortSignal): Promise<void>;
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Public-safe retry primitives shared by public packages through the
3
+ * `@aexhq/contracts/internal` subpath. Keep this module free of hosted
4
+ * implementation details and do not export it from the public contracts root.
5
+ */
6
+ export const RETRYABLE_HTTP_STATUS = [429, 500, 502, 503, 504, 529];
7
+ export const RATE_LIMIT_HTTP_STATUS = [429, 503, 529];
8
+ const RETRYABLE_HTTP_STATUS_SET = new Set(RETRYABLE_HTTP_STATUS);
9
+ const RATE_LIMIT_HTTP_STATUS_SET = new Set(RATE_LIMIT_HTTP_STATUS);
10
+ export function isRetryableHttpStatus(status) {
11
+ return RETRYABLE_HTTP_STATUS_SET.has(status);
12
+ }
13
+ export function isRateLimitHttpStatus(status) {
14
+ return RATE_LIMIT_HTTP_STATUS_SET.has(status);
15
+ }
16
+ /**
17
+ * Parse an HTTP `Retry-After` header into milliseconds. RFC 7231 permits either
18
+ * a non-negative integer number of seconds or an HTTP-date.
19
+ */
20
+ export function parseRetryAfterMs(headerValue, now = Date.now()) {
21
+ if (headerValue === null || headerValue === undefined)
22
+ return undefined;
23
+ const trimmed = headerValue.trim();
24
+ if (trimmed.length === 0)
25
+ return undefined;
26
+ if (/^\d+$/.test(trimmed)) {
27
+ return Number(trimmed) * 1000;
28
+ }
29
+ const dateMs = Date.parse(trimmed);
30
+ if (!Number.isNaN(dateMs)) {
31
+ return Math.max(0, dateMs - now);
32
+ }
33
+ return undefined;
34
+ }
35
+ /**
36
+ * Full-jitter exponential backoff: the nominal wait doubles per failed attempt
37
+ * and the actual delay is sampled uniformly in `[0, nominal]`.
38
+ */
39
+ export function computeRetryBackoffDelayMs(config, attemptNumber, random) {
40
+ const exponent = Math.max(0, attemptNumber - 1);
41
+ const nominal = Math.min(config.maxDelayMs, config.initialDelayMs * 2 ** exponent);
42
+ return Math.round(random() * nominal);
43
+ }
44
+ /** Combine a server `Retry-After` floor with the jittered backoff delay. */
45
+ export function computeRetryDelayMs(config, attemptNumber, random, retryAfterMs) {
46
+ const backoff = computeRetryBackoffDelayMs(config, attemptNumber, random);
47
+ return retryAfterMs === undefined ? backoff : Math.max(retryAfterMs, backoff);
48
+ }
49
+ export function abortableSleep(ms, signal) {
50
+ return new Promise((resolve, reject) => {
51
+ if (signal?.aborted) {
52
+ reject(abortReason(signal));
53
+ return;
54
+ }
55
+ const timer = setTimeout(() => {
56
+ signal?.removeEventListener("abort", onAbort);
57
+ resolve();
58
+ }, ms);
59
+ const onAbort = () => {
60
+ clearTimeout(timer);
61
+ reject(signal ? abortReason(signal) : makeAbortError());
62
+ };
63
+ signal?.addEventListener("abort", onAbort, { once: true });
64
+ });
65
+ }
66
+ function abortReason(signal) {
67
+ return signal.reason instanceof Error ? signal.reason : makeAbortError();
68
+ }
69
+ function makeAbortError() {
70
+ if (typeof DOMException !== "undefined")
71
+ return new DOMException("Aborted", "AbortError");
72
+ const err = new Error("Aborted");
73
+ err.name = "AbortError";
74
+ return err;
75
+ }
@@ -432,6 +432,12 @@ export interface ReadOutputTextOptions {
432
432
  * reached, so the remainder of a large file is never transferred.
433
433
  */
434
434
  readonly maxBytes?: number;
435
+ /**
436
+ * Per-attempt timeout for fetching and reading the selected output body.
437
+ * Defaults to 15_000ms; idempotent output reads retry once on timeout before
438
+ * surfacing a structured NETWORK_ERROR.
439
+ */
440
+ readonly timeoutMs?: number;
435
441
  /**
436
442
  * When set, return only the lines of the (capped) text matching this pattern.
437
443
  * A string is matched literally (case-insensitive); a RegExp is used as given.
@@ -22,18 +22,23 @@
22
22
  * exact default API plane.
23
23
  */
24
24
  export declare const AEX_DEFAULT_BASE_URL = "https://api.aex.dev";
25
+ /**
26
+ * Canonical hosted dev API plane URL. Used when a self-describing dev API key is
27
+ * passed with no explicit `baseUrl`.
28
+ */
29
+ export declare const AEX_DEV_BASE_URL = "https://dev-api.aex.dev";
25
30
  /**
26
31
  * Plane → API base URL. When the SDK constructor is given no explicit `baseUrl`
27
32
  * it DERIVES the target from the API key's embedded plane (see
28
33
  * {@link import("./api-key.js").parseApiKey}) rather than blindly defaulting to
29
- * prod — so a dev key never silently 401s against `api.aex.dev`.
34
+ * prod — so a dev key routes to `dev-api.aex.dev` and a prd key routes to
35
+ * `api.aex.dev`.
30
36
  *
31
- * `prd` is {@link AEX_DEFAULT_BASE_URL}. `dev` is `null`: the dev plane has no
32
- * stable public hostname yet, so a dev key still requires an explicit `baseUrl`
33
- * — but the plane-mismatch guard (dev key + prd baseUrl) still fires.
37
+ * The plane-mismatch guard still fires when a key is pointed at the wrong
38
+ * canonical host (for example, a dev key with `baseUrl=https://api.aex.dev`).
34
39
  */
35
40
  export declare const PLANE_BASE_URLS: {
36
- readonly dev: null;
41
+ readonly dev: "https://dev-api.aex.dev";
37
42
  readonly prd: "https://api.aex.dev";
38
43
  };
39
44
  export declare function stableStringify(value: unknown): string;
@@ -23,18 +23,23 @@ import { createHash } from "node:crypto";
23
23
  * exact default API plane.
24
24
  */
25
25
  export const AEX_DEFAULT_BASE_URL = "https://api.aex.dev";
26
+ /**
27
+ * Canonical hosted dev API plane URL. Used when a self-describing dev API key is
28
+ * passed with no explicit `baseUrl`.
29
+ */
30
+ export const AEX_DEV_BASE_URL = "https://dev-api.aex.dev";
26
31
  /**
27
32
  * Plane → API base URL. When the SDK constructor is given no explicit `baseUrl`
28
33
  * it DERIVES the target from the API key's embedded plane (see
29
34
  * {@link import("./api-key.js").parseApiKey}) rather than blindly defaulting to
30
- * prod — so a dev key never silently 401s against `api.aex.dev`.
35
+ * prod — so a dev key routes to `dev-api.aex.dev` and a prd key routes to
36
+ * `api.aex.dev`.
31
37
  *
32
- * `prd` is {@link AEX_DEFAULT_BASE_URL}. `dev` is `null`: the dev plane has no
33
- * stable public hostname yet, so a dev key still requires an explicit `baseUrl`
34
- * — but the plane-mismatch guard (dev key + prd baseUrl) still fires.
38
+ * The plane-mismatch guard still fires when a key is pointed at the wrong
39
+ * canonical host (for example, a dev key with `baseUrl=https://api.aex.dev`).
35
40
  */
36
41
  export const PLANE_BASE_URLS = {
37
- dev: null,
42
+ dev: AEX_DEV_BASE_URL,
38
43
  prd: AEX_DEFAULT_BASE_URL
39
44
  };
40
45
  export function stableStringify(value) {
@@ -19,7 +19,7 @@
19
19
  * 3. POST /assets/finalize → confirms the object exists (HEAD only).
20
20
  *
21
21
  */
22
- import type { AssetFetch, AssetsHttpClient, UploadedAsset } from "./_contracts/internal.js";
22
+ import { type AssetFetch, type AssetUploadRetryOptions, type AssetsHttpClient, type UploadedAsset } from "./_contracts/internal.js";
23
23
  import type { ByteSink } from "./canonical-zip.js";
24
24
  export { uploadAsset } from "./_contracts/internal.js";
25
25
  export type { AssetFetch, AssetsHttpClient, UploadAssetArgs, UploadedAsset } from "./_contracts/internal.js";
@@ -39,6 +39,7 @@ export interface UploadAssetStreamArgs {
39
39
  readonly drive: ZipStreamDriver;
40
40
  readonly contentType?: string;
41
41
  readonly fetch?: AssetFetch;
42
+ readonly retry?: AssetUploadRetryOptions;
42
43
  readonly partSize?: number;
43
44
  readonly partConcurrency?: number;
44
45
  }
@@ -19,9 +19,8 @@
19
19
  * 3. POST /assets/finalize → confirms the object exists (HEAD only).
20
20
  *
21
21
  */
22
- import { extractErrorCode, redactUrl } from "./_contracts/index.js";
22
+ import { abortableSleep, directUploadRetryDelayMs, directUploadNetworkError, directUploadResponseError, isRetryableUploadError, isRetryableUploadStatus, parseRetryAfterMs, resolveAssetUploadRetryConfig, withinDirectUploadRetryBudget } from "./_contracts/internal.js";
23
23
  export { uploadAsset } from "./_contracts/internal.js";
24
- const DIRECT_UPLOAD_MAX_ATTEMPTS = 3;
25
24
  // ---------------------------------------------------------------------------
26
25
  // Internal helpers
27
26
  // ---------------------------------------------------------------------------
@@ -93,7 +92,10 @@ export async function uploadAssetMultipart(args) {
93
92
  let url = urlByPart.get(partNumber);
94
93
  if (!url)
95
94
  url = await refreshPartUrl(partNumber);
96
- const etag = await putPartWithRetry(doFetch, url, bytes, args.contentType, () => refreshPartUrl(partNumber));
95
+ const etag = await putPartWithRetry(doFetch, url, bytes, args.contentType, () => refreshPartUrl(partNumber), args.retry);
96
+ if (!etag) {
97
+ throw new Error(`uploadAssetMultipart: part ${partNumber} PUT succeeded without an ETag header`);
98
+ }
97
99
  parts.push({ partNumber, etag });
98
100
  };
99
101
  const submitPart = async (partNumber, bytes) => {
@@ -207,10 +209,15 @@ function makePartChunker(partSize, emit) {
207
209
  };
208
210
  }
209
211
  /** PUT one part with bounded retry; refreshes the URL once on a 403 (expiry). Returns the ETag. */
210
- async function putPartWithRetry(fetchImpl, url, bytes, contentType, refreshUrl) {
212
+ async function putPartWithRetry(fetchImpl, url, bytes, contentType, refreshUrl, retryOptions) {
211
213
  let currentUrl = url;
212
214
  let refreshed = false;
213
- for (let attempt = 1; attempt <= DIRECT_UPLOAD_MAX_ATTEMPTS; attempt++) {
215
+ const retryConfig = resolveAssetUploadRetryConfig(retryOptions);
216
+ const sleep = retryOptions?.sleep ?? abortableSleep;
217
+ const random = retryOptions?.random ?? Math.random;
218
+ const now = retryOptions?.now ?? Date.now;
219
+ const startedAt = now();
220
+ for (let attempt = 1; attempt <= retryConfig.maxAttempts; attempt++) {
214
221
  let response;
215
222
  try {
216
223
  response = await fetchImpl(currentUrl, {
@@ -220,8 +227,14 @@ async function putPartWithRetry(fetchImpl, url, bytes, contentType, refreshUrl)
220
227
  });
221
228
  }
222
229
  catch (err) {
223
- if (attempt < DIRECT_UPLOAD_MAX_ATTEMPTS && isRetryableUploadError(err))
230
+ if (attempt < retryConfig.maxAttempts && isRetryableUploadError(err)) {
231
+ const delay = directUploadRetryDelayMs(retryConfig, attempt, random, undefined);
232
+ if (!withinDirectUploadRetryBudget(retryConfig, startedAt, delay, now)) {
233
+ throw directUploadNetworkError(currentUrl, err, attempt);
234
+ }
235
+ await sleep(delay);
224
236
  continue;
237
+ }
225
238
  throw directUploadNetworkError(currentUrl, err, attempt);
226
239
  }
227
240
  if (response.ok) {
@@ -235,66 +248,20 @@ async function putPartWithRetry(fetchImpl, url, bytes, contentType, refreshUrl)
235
248
  currentUrl = await refreshUrl();
236
249
  continue;
237
250
  }
238
- if (attempt < DIRECT_UPLOAD_MAX_ATTEMPTS && isRetryableUploadStatus(response.status)) {
251
+ if (attempt < retryConfig.maxAttempts && isRetryableUploadStatus(response.status)) {
252
+ const retryAfterMs = parseRetryAfterMs(response.headers?.get("retry-after"), now());
253
+ const delay = directUploadRetryDelayMs(retryConfig, attempt, random, retryAfterMs);
254
+ if (!withinDirectUploadRetryBudget(retryConfig, startedAt, delay, now)) {
255
+ const detail = await response.text().catch(() => "");
256
+ throw directUploadResponseError(currentUrl, response.status, detail, attempt);
257
+ }
239
258
  await response.text().catch(() => "");
259
+ await sleep(delay);
240
260
  continue;
241
261
  }
242
262
  const detail = await response.text().catch(() => "");
243
263
  throw directUploadResponseError(currentUrl, response.status, detail, attempt);
244
264
  }
245
- throw directUploadResponseError(currentUrl, 0, "exhausted retries", DIRECT_UPLOAD_MAX_ATTEMPTS);
246
- }
247
- function isRetryableUploadStatus(status) {
248
- return status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599);
249
- }
250
- function isRetryableUploadError(err) {
251
- if (isNamedError(err, "AbortError"))
252
- return false;
253
- return true;
254
- }
255
- function directUploadNetworkError(uploadUrl, err, attempts) {
256
- const safeUrl = redactUrl(uploadUrl);
257
- const code = extractErrorCode(err);
258
- const detail = sanitizeUploadText(errorMessage(err)).slice(0, 500);
259
- return new Error(`uploadAsset: direct upload PUT failed for ${safeUrl} after ${attemptsLabel(attempts)}` +
260
- (code ? ` (${code})` : "") +
261
- (detail ? `: ${detail}` : ""));
262
- }
263
- function directUploadResponseError(uploadUrl, status, detail, attempts) {
264
- const safeUrl = redactUrl(uploadUrl);
265
- const safeDetail = sanitizeUploadText(detail).slice(0, 500);
266
- return new Error(`uploadAsset: direct upload PUT failed for ${safeUrl} with status ${status}` +
267
- (attempts > 1 ? ` after ${attemptsLabel(attempts)}` : "") +
268
- (safeDetail ? `: ${safeDetail}` : ""));
269
- }
270
- function attemptsLabel(attempts) {
271
- return attempts === 1 ? "1 attempt" : `${attempts} attempts`;
272
- }
273
- function errorMessage(err) {
274
- if (err instanceof Error)
275
- return err.message || err.name;
276
- if (typeof err === "string")
277
- return err;
278
- return String(err);
279
- }
280
- function isNamedError(err, name) {
281
- return stringProperty(err, "name") === name;
282
- }
283
- function stringProperty(value, key) {
284
- if (!value || typeof value !== "object")
285
- return undefined;
286
- const prop = value[key];
287
- return typeof prop === "string" && prop.length > 0 ? prop : undefined;
288
- }
289
- function sanitizeUploadText(text) {
290
- return text
291
- .replace(/https?:\/\/[^\s<>"'`]+/g, (raw) => redactUrlPreservingTrailingPunctuation(raw))
292
- .replace(/\b(?:X-Amz-(?:Algorithm|Credential|Date|Expires|Security-Token|Signature|SignedHeaders)|AWSAccessKeyId|Signature|Credential|Security-Token|AccessKeyId|SecretAccessKey|SessionToken)=([^&\s<>"'`]+)/gi, "[redacted]")
293
- .replace(/\bAKIA[0-9A-Z]{8,}\b/g, "[redacted]");
294
- }
295
- function redactUrlPreservingTrailingPunctuation(raw) {
296
- const trailing = raw.match(/[),.;:!?]+$/)?.[0] ?? "";
297
- const candidate = trailing ? raw.slice(0, -trailing.length) : raw;
298
- return `${redactUrl(candidate)}${trailing}`;
265
+ throw directUploadResponseError(currentUrl, 0, "exhausted retries", retryConfig.maxAttempts);
299
266
  }
300
267
  //# sourceMappingURL=asset-upload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"asset-upload.js","sourceRoot":"","sources":["../src/asset-upload.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"asset-upload.js","sourceRoot":"","sources":["../src/asset-upload.ts"],"names":[],"mappings":"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"}