@aexhq/sdk 0.33.1 → 0.35.0
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.
- package/README.md +19 -27
- package/dist/_contracts/operations.d.ts +2 -54
- package/dist/_contracts/operations.js +2 -87
- package/dist/_contracts/run-config.d.ts +19 -13
- package/dist/_contracts/run-config.js +6 -33
- package/dist/_contracts/run-unit.d.ts +1 -33
- package/dist/_contracts/run-unit.js +2 -21
- package/dist/_contracts/runtime-sizes.d.ts +2 -2
- package/dist/_contracts/runtime-sizes.js +2 -2
- package/dist/_contracts/status.d.ts +2 -2
- package/dist/_contracts/status.js +3 -0
- package/dist/_contracts/submission.d.ts +80 -41
- package/dist/_contracts/submission.js +114 -52
- package/dist/agents-md.d.ts +5 -5
- package/dist/agents-md.js +7 -7
- package/dist/agents-md.js.map +1 -1
- package/dist/asset-upload.d.ts +4 -4
- package/dist/asset-upload.js +4 -4
- package/dist/bundle.d.ts +2 -2
- package/dist/bundle.js +2 -2
- package/dist/cli.mjs +369 -12918
- package/dist/cli.mjs.sha256 +1 -1
- package/dist/client.d.ts +234 -383
- package/dist/client.js +436 -648
- package/dist/client.js.map +1 -1
- package/dist/data-tools.d.ts +25 -22
- package/dist/data-tools.js +75 -62
- package/dist/data-tools.js.map +1 -1
- package/dist/fetch-archive.js +16 -16
- package/dist/fetch-archive.js.map +1 -1
- package/dist/file.d.ts +5 -5
- package/dist/file.js +7 -7
- package/dist/file.js.map +1 -1
- package/dist/index.d.ts +11 -9
- package/dist/index.js +20 -13
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts +4 -4
- package/dist/mcp-server.js +4 -4
- package/dist/proxy-endpoint.d.ts +4 -4
- package/dist/proxy-endpoint.js +1 -1
- package/dist/retry.d.ts +162 -0
- package/dist/retry.js +320 -0
- package/dist/retry.js.map +1 -0
- package/dist/secret.d.ts +8 -8
- package/dist/secret.js +8 -8
- package/dist/secret.js.map +1 -1
- package/dist/skill-tool.d.ts +102 -0
- package/dist/skill-tool.js +190 -0
- package/dist/skill-tool.js.map +1 -0
- package/dist/tool.d.ts +1 -1
- package/dist/tool.js +3 -3
- package/dist/tool.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/cleanup.md +3 -3
- package/docs/concepts/agent-tools.md +6 -25
- package/docs/concepts/composition.md +15 -12
- package/docs/concepts/providers-and-runtimes.md +3 -3
- package/docs/concepts/runs.md +27 -22
- package/docs/credentials.md +52 -84
- package/docs/defaults.md +6 -6
- package/docs/events.md +65 -44
- package/docs/limits-and-quotas.md +3 -4
- package/docs/mcp.md +3 -3
- package/docs/networking.md +8 -8
- package/docs/outputs.md +44 -40
- package/docs/provider-runtime-capabilities.md +1 -1
- package/docs/public-surface.json +2 -2
- package/docs/quickstart.md +20 -10
- package/docs/retries.md +129 -0
- package/docs/run-config.md +12 -14
- package/docs/run-record.md +8 -8
- package/docs/secrets.md +16 -26
- package/docs/skills.md +55 -110
- package/docs/vision-skills.md +29 -40
- package/examples/chat-corpus.ts +8 -9
- package/examples/feature-tour.ts +301 -0
- package/package.json +1 -1
- package/dist/skill.d.ts +0 -149
- package/dist/skill.js +0 -198
- package/dist/skill.js.map +0 -1
package/dist/retry.d.ts
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in transport resilience for the aex SDK.
|
|
3
|
+
*
|
|
4
|
+
* Every BFF-bound request the SDK makes goes through one {@link FetchLike}. This
|
|
5
|
+
* module wraps that fetch so a transient failure — an HTTP 429 (rate limited),
|
|
6
|
+
* a 500/502/503/504 (server hiccup), a 529 (upstream overloaded), or a network
|
|
7
|
+
* error — is retried with BOUNDED exponential backoff + full jitter, honoring
|
|
8
|
+
* the server's `Retry-After` header when present. Non-retryable 4xx responses
|
|
9
|
+
* (400/401/403/404/…) fail fast — retrying them only wastes the caller's time.
|
|
10
|
+
*
|
|
11
|
+
* Retries are SAFE to enable by default because the billable submits
|
|
12
|
+
* (`createSession` / `sendSessionMessage`) carry a stable `Idempotency-Key`
|
|
13
|
+
* header: re-sending the identical request de-duplicates server-side, so a retry
|
|
14
|
+
* never creates a duplicate billable turn.
|
|
15
|
+
*
|
|
16
|
+
* When retries are exhausted on a rate-limit / overloaded status the wrapper
|
|
17
|
+
* surfaces an {@link AexRateLimitError} — a structured, non-leaky throttle error
|
|
18
|
+
* carrying the parsed `retryAfterMs`, the attempt count, and (when the runtime
|
|
19
|
+
* supplies it) an upstream {@link ProviderFault}. All other exhausted retries
|
|
20
|
+
* fall through to the transport's usual `AexApiError` / network rejection.
|
|
21
|
+
*/
|
|
22
|
+
import { AexApiError, type FetchLike } from "./_contracts/index.js";
|
|
23
|
+
/**
|
|
24
|
+
* HTTP statuses that are transient and worth retrying. The billable submits
|
|
25
|
+
* carry an idempotency key, so re-issuing them is safe. Everything not in this
|
|
26
|
+
* set (400/401/403/404/409/422/…) is a definitive client error and fails fast.
|
|
27
|
+
*/
|
|
28
|
+
export declare const RETRYABLE_STATUS: readonly number[];
|
|
29
|
+
/**
|
|
30
|
+
* The subset of {@link RETRYABLE_STATUS} the platform / upstream provider uses to
|
|
31
|
+
* say "slow down": 429 rate-limit, 503 unavailable, 529 overloaded. When retries
|
|
32
|
+
* for one of these run out, the wrapper raises an {@link AexRateLimitError}.
|
|
33
|
+
*/
|
|
34
|
+
export declare const RATE_LIMIT_STATUS: readonly number[];
|
|
35
|
+
/**
|
|
36
|
+
* Tunes the built-in retry loop. All fields are optional; omit the whole
|
|
37
|
+
* `retry` option (or pass `retry: false` on the client) to accept the defaults
|
|
38
|
+
* or turn the loop off entirely.
|
|
39
|
+
*/
|
|
40
|
+
export interface RetryOptions {
|
|
41
|
+
/**
|
|
42
|
+
* Maximum attempts INCLUDING the first try. Default `4` (one try + three
|
|
43
|
+
* retries). `1` performs a single attempt with no retries (but still maps a
|
|
44
|
+
* final rate-limit status to {@link AexRateLimitError}).
|
|
45
|
+
*/
|
|
46
|
+
readonly maxAttempts?: number;
|
|
47
|
+
/**
|
|
48
|
+
* Base delay (ms) for the exponential backoff — the nominal wait before the
|
|
49
|
+
* first retry, doubling each subsequent retry. Default `500`.
|
|
50
|
+
*/
|
|
51
|
+
readonly initialDelayMs?: number;
|
|
52
|
+
/** Upper bound (ms) on any single backoff wait. Default `20_000`. */
|
|
53
|
+
readonly maxDelayMs?: number;
|
|
54
|
+
/**
|
|
55
|
+
* Overall wall-clock budget (ms) across all attempts. Once the next backoff
|
|
56
|
+
* would push past this, the loop stops and surfaces the last error. Default
|
|
57
|
+
* `120_000`.
|
|
58
|
+
*/
|
|
59
|
+
readonly maxElapsedMs?: number;
|
|
60
|
+
}
|
|
61
|
+
interface ResolvedRetryConfig {
|
|
62
|
+
readonly maxAttempts: number;
|
|
63
|
+
readonly initialDelayMs: number;
|
|
64
|
+
readonly maxDelayMs: number;
|
|
65
|
+
readonly maxElapsedMs: number;
|
|
66
|
+
}
|
|
67
|
+
/** Resolve caller options over the defaults, clamping to sane bounds. */
|
|
68
|
+
export declare function resolveRetryConfig(options: RetryOptions | undefined): ResolvedRetryConfig;
|
|
69
|
+
export declare function isRetryableStatus(status: number): boolean;
|
|
70
|
+
export declare function isRateLimitStatus(status: number): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Parse an HTTP `Retry-After` header into milliseconds. Per RFC 7231 the value
|
|
73
|
+
* is either a non-negative integer number of seconds or an HTTP-date; both are
|
|
74
|
+
* handled. Returns `undefined` for a missing or unparseable value.
|
|
75
|
+
*/
|
|
76
|
+
export declare function parseRetryAfterMs(headerValue: string | null | undefined, now?: number): number | undefined;
|
|
77
|
+
/**
|
|
78
|
+
* Full-jitter exponential backoff (AWS-style): the nominal wait doubles per
|
|
79
|
+
* retry up to `maxDelayMs`, and the actual wait is a uniform sample in
|
|
80
|
+
* `[0, nominal]` to de-correlate concurrent clients. `attemptNumber` is the
|
|
81
|
+
* 1-based number of the attempt that just failed.
|
|
82
|
+
*/
|
|
83
|
+
export declare function computeBackoffDelayMs(config: ResolvedRetryConfig, attemptNumber: number, random: () => number): number;
|
|
84
|
+
/**
|
|
85
|
+
* A structured, redaction-safe description of an UPSTREAM provider fault the aex
|
|
86
|
+
* runtime surfaces on a failed turn (a rate limit, an overloaded provider, a
|
|
87
|
+
* quota exhaustion, or a generic provider error). It is a sibling of the
|
|
88
|
+
* API-plane throttle: the container/runtime emits this shape on the terminal
|
|
89
|
+
* error and the SDK re-exposes it on {@link AexRateLimitError.providerFault} so
|
|
90
|
+
* callers get one place to read "the model provider throttled us".
|
|
91
|
+
*/
|
|
92
|
+
export interface ProviderFault {
|
|
93
|
+
/** Upstream provider id, e.g. `"anthropic"`, when the runtime reports one. */
|
|
94
|
+
readonly provider?: string;
|
|
95
|
+
/** Coarse fault class. */
|
|
96
|
+
readonly kind: "rate_limit" | "overloaded" | "quota_exceeded" | "provider_error";
|
|
97
|
+
/** Upstream HTTP status when the provider surfaced one (e.g. `429`, `529`). */
|
|
98
|
+
readonly status?: number;
|
|
99
|
+
/** Milliseconds the upstream asked the caller to wait, when it supplied one. */
|
|
100
|
+
readonly retryAfterMs?: number;
|
|
101
|
+
/** Short, already-redacted upstream message. */
|
|
102
|
+
readonly message?: string;
|
|
103
|
+
}
|
|
104
|
+
/** True when a {@link ProviderFault} represents a "back off and retry" signal. */
|
|
105
|
+
export declare function isThrottleFault(fault: ProviderFault): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Structured throttle error. Extends {@link AexApiError} so existing
|
|
108
|
+
* `catch (err instanceof AexApiError)` sites keep working, while callers that
|
|
109
|
+
* want the details narrow with {@link isRateLimited} and read `retryAfterMs`,
|
|
110
|
+
* `attempts`, `source`, and `providerFault`. The `message` is a fixed,
|
|
111
|
+
* non-leaky summary — it never echoes the raw error body (which is still
|
|
112
|
+
* available, redacted, on `.body`).
|
|
113
|
+
*/
|
|
114
|
+
export declare class AexRateLimitError extends AexApiError {
|
|
115
|
+
/** Milliseconds the server/provider asked us to wait, when known. */
|
|
116
|
+
readonly retryAfterMs?: number;
|
|
117
|
+
/** How many attempts were made before giving up. */
|
|
118
|
+
readonly attempts: number;
|
|
119
|
+
/** Whether the throttle came from the aex API plane or the upstream provider. */
|
|
120
|
+
readonly source: "api" | "provider";
|
|
121
|
+
/** The upstream provider fault, when the throttle originated there. */
|
|
122
|
+
readonly providerFault?: ProviderFault;
|
|
123
|
+
constructor(args: {
|
|
124
|
+
readonly status: number;
|
|
125
|
+
readonly attempts: number;
|
|
126
|
+
readonly retryAfterMs?: number;
|
|
127
|
+
readonly source?: "api" | "provider";
|
|
128
|
+
readonly providerFault?: ProviderFault;
|
|
129
|
+
readonly body?: unknown;
|
|
130
|
+
readonly message?: string;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/** Type guard for {@link AexRateLimitError}. */
|
|
134
|
+
export declare function isRateLimited(err: unknown): err is AexRateLimitError;
|
|
135
|
+
/**
|
|
136
|
+
* Best-effort parse of an unknown value into a {@link ProviderFault}. Tolerant
|
|
137
|
+
* of two shapes so the SDK consumes the runtime fault the moment it starts
|
|
138
|
+
* emitting one, without a contracts change:
|
|
139
|
+
*
|
|
140
|
+
* 1. The canonical `{ provider?, kind, status?, retryAfterMs?, message? }`
|
|
141
|
+
* (optionally nested under a `providerFault` key), OR
|
|
142
|
+
* 2. A raw upstream error `{ type: "rate_limit_error" | "overloaded_error"
|
|
143
|
+
* | ..., message?, retry_after? | retryAfter? }` — `type` maps to `kind`
|
|
144
|
+
* and `retry_after` (seconds) maps to `retryAfterMs`.
|
|
145
|
+
*
|
|
146
|
+
* Returns `undefined` when the value carries no recognizable fault.
|
|
147
|
+
*/
|
|
148
|
+
export declare function parseProviderFault(value: unknown): ProviderFault | undefined;
|
|
149
|
+
/** Hooks the retry loop needs, injectable so tests run without real timers. */
|
|
150
|
+
export interface RetryDeps {
|
|
151
|
+
readonly sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
152
|
+
readonly random?: () => number;
|
|
153
|
+
readonly now?: () => number;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Wrap a {@link FetchLike} with the bounded-retry loop. `retry === false`
|
|
157
|
+
* disables the layer entirely (the input fetch is returned unchanged). Otherwise
|
|
158
|
+
* the returned fetch retries transient failures per {@link RetryOptions} and, on
|
|
159
|
+
* an exhausted rate-limit/overloaded status, throws {@link AexRateLimitError}.
|
|
160
|
+
*/
|
|
161
|
+
export declare function withRetry(fetchImpl: FetchLike, retry: RetryOptions | false | undefined, deps?: RetryDeps): FetchLike;
|
|
162
|
+
export {};
|
package/dist/retry.js
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in transport resilience for the aex SDK.
|
|
3
|
+
*
|
|
4
|
+
* Every BFF-bound request the SDK makes goes through one {@link FetchLike}. This
|
|
5
|
+
* module wraps that fetch so a transient failure — an HTTP 429 (rate limited),
|
|
6
|
+
* a 500/502/503/504 (server hiccup), a 529 (upstream overloaded), or a network
|
|
7
|
+
* error — is retried with BOUNDED exponential backoff + full jitter, honoring
|
|
8
|
+
* the server's `Retry-After` header when present. Non-retryable 4xx responses
|
|
9
|
+
* (400/401/403/404/…) fail fast — retrying them only wastes the caller's time.
|
|
10
|
+
*
|
|
11
|
+
* Retries are SAFE to enable by default because the billable submits
|
|
12
|
+
* (`createSession` / `sendSessionMessage`) carry a stable `Idempotency-Key`
|
|
13
|
+
* header: re-sending the identical request de-duplicates server-side, so a retry
|
|
14
|
+
* never creates a duplicate billable turn.
|
|
15
|
+
*
|
|
16
|
+
* When retries are exhausted on a rate-limit / overloaded status the wrapper
|
|
17
|
+
* surfaces an {@link AexRateLimitError} — a structured, non-leaky throttle error
|
|
18
|
+
* carrying the parsed `retryAfterMs`, the attempt count, and (when the runtime
|
|
19
|
+
* supplies it) an upstream {@link ProviderFault}. All other exhausted retries
|
|
20
|
+
* fall through to the transport's usual `AexApiError` / network rejection.
|
|
21
|
+
*/
|
|
22
|
+
import { AexApiError } from "./_contracts/index.js";
|
|
23
|
+
/**
|
|
24
|
+
* HTTP statuses that are transient and worth retrying. The billable submits
|
|
25
|
+
* carry an idempotency key, so re-issuing them is safe. Everything not in this
|
|
26
|
+
* set (400/401/403/404/409/422/…) is a definitive client error and fails fast.
|
|
27
|
+
*/
|
|
28
|
+
export const RETRYABLE_STATUS = [429, 500, 502, 503, 504, 529];
|
|
29
|
+
/**
|
|
30
|
+
* The subset of {@link RETRYABLE_STATUS} the platform / upstream provider uses to
|
|
31
|
+
* say "slow down": 429 rate-limit, 503 unavailable, 529 overloaded. When retries
|
|
32
|
+
* for one of these run out, the wrapper raises an {@link AexRateLimitError}.
|
|
33
|
+
*/
|
|
34
|
+
export const RATE_LIMIT_STATUS = [429, 503, 529];
|
|
35
|
+
const DEFAULT_RETRY = {
|
|
36
|
+
maxAttempts: 4,
|
|
37
|
+
initialDelayMs: 500,
|
|
38
|
+
maxDelayMs: 20_000,
|
|
39
|
+
maxElapsedMs: 120_000
|
|
40
|
+
};
|
|
41
|
+
/** Resolve caller options over the defaults, clamping to sane bounds. */
|
|
42
|
+
export function resolveRetryConfig(options) {
|
|
43
|
+
const maxAttempts = Math.max(1, Math.floor(options?.maxAttempts ?? DEFAULT_RETRY.maxAttempts));
|
|
44
|
+
const initialDelayMs = Math.max(0, options?.initialDelayMs ?? DEFAULT_RETRY.initialDelayMs);
|
|
45
|
+
const maxDelayMs = Math.max(initialDelayMs, options?.maxDelayMs ?? DEFAULT_RETRY.maxDelayMs);
|
|
46
|
+
const maxElapsedMs = Math.max(0, options?.maxElapsedMs ?? DEFAULT_RETRY.maxElapsedMs);
|
|
47
|
+
return { maxAttempts, initialDelayMs, maxDelayMs, maxElapsedMs };
|
|
48
|
+
}
|
|
49
|
+
export function isRetryableStatus(status) {
|
|
50
|
+
return RETRYABLE_STATUS.includes(status);
|
|
51
|
+
}
|
|
52
|
+
export function isRateLimitStatus(status) {
|
|
53
|
+
return RATE_LIMIT_STATUS.includes(status);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse an HTTP `Retry-After` header into milliseconds. Per RFC 7231 the value
|
|
57
|
+
* is either a non-negative integer number of seconds or an HTTP-date; both are
|
|
58
|
+
* handled. Returns `undefined` for a missing or unparseable value.
|
|
59
|
+
*/
|
|
60
|
+
export function parseRetryAfterMs(headerValue, now = Date.now()) {
|
|
61
|
+
if (headerValue === null || headerValue === undefined)
|
|
62
|
+
return undefined;
|
|
63
|
+
const trimmed = headerValue.trim();
|
|
64
|
+
if (trimmed.length === 0)
|
|
65
|
+
return undefined;
|
|
66
|
+
if (/^\d+$/.test(trimmed)) {
|
|
67
|
+
return Number(trimmed) * 1000;
|
|
68
|
+
}
|
|
69
|
+
const dateMs = Date.parse(trimmed);
|
|
70
|
+
if (!Number.isNaN(dateMs)) {
|
|
71
|
+
return Math.max(0, dateMs - now);
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Full-jitter exponential backoff (AWS-style): the nominal wait doubles per
|
|
77
|
+
* retry up to `maxDelayMs`, and the actual wait is a uniform sample in
|
|
78
|
+
* `[0, nominal]` to de-correlate concurrent clients. `attemptNumber` is the
|
|
79
|
+
* 1-based number of the attempt that just failed.
|
|
80
|
+
*/
|
|
81
|
+
export function computeBackoffDelayMs(config, attemptNumber, random) {
|
|
82
|
+
const exponent = Math.max(0, attemptNumber - 1);
|
|
83
|
+
const nominal = Math.min(config.maxDelayMs, config.initialDelayMs * 2 ** exponent);
|
|
84
|
+
return Math.round(random() * nominal);
|
|
85
|
+
}
|
|
86
|
+
/** Combine the server's `Retry-After` (a floor) with our jittered backoff. */
|
|
87
|
+
function nextDelayMs(config, attemptNumber, random, retryAfterMs) {
|
|
88
|
+
const backoff = computeBackoffDelayMs(config, attemptNumber, random);
|
|
89
|
+
return retryAfterMs === undefined ? backoff : Math.max(retryAfterMs, backoff);
|
|
90
|
+
}
|
|
91
|
+
const THROTTLE_KINDS = new Set(["rate_limit", "overloaded", "quota_exceeded"]);
|
|
92
|
+
/** True when a {@link ProviderFault} represents a "back off and retry" signal. */
|
|
93
|
+
export function isThrottleFault(fault) {
|
|
94
|
+
return THROTTLE_KINDS.has(fault.kind);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Structured throttle error. Extends {@link AexApiError} so existing
|
|
98
|
+
* `catch (err instanceof AexApiError)` sites keep working, while callers that
|
|
99
|
+
* want the details narrow with {@link isRateLimited} and read `retryAfterMs`,
|
|
100
|
+
* `attempts`, `source`, and `providerFault`. The `message` is a fixed,
|
|
101
|
+
* non-leaky summary — it never echoes the raw error body (which is still
|
|
102
|
+
* available, redacted, on `.body`).
|
|
103
|
+
*/
|
|
104
|
+
export class AexRateLimitError extends AexApiError {
|
|
105
|
+
/** Milliseconds the server/provider asked us to wait, when known. */
|
|
106
|
+
retryAfterMs;
|
|
107
|
+
/** How many attempts were made before giving up. */
|
|
108
|
+
attempts;
|
|
109
|
+
/** Whether the throttle came from the aex API plane or the upstream provider. */
|
|
110
|
+
source;
|
|
111
|
+
/** The upstream provider fault, when the throttle originated there. */
|
|
112
|
+
providerFault;
|
|
113
|
+
constructor(args) {
|
|
114
|
+
super(args.status, args.message ?? defaultThrottleMessage(args), args.body);
|
|
115
|
+
this.attempts = args.attempts;
|
|
116
|
+
this.source = args.source ?? "api";
|
|
117
|
+
if (args.retryAfterMs !== undefined)
|
|
118
|
+
this.retryAfterMs = args.retryAfterMs;
|
|
119
|
+
if (args.providerFault !== undefined)
|
|
120
|
+
this.providerFault = args.providerFault;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/** Type guard for {@link AexRateLimitError}. */
|
|
124
|
+
export function isRateLimited(err) {
|
|
125
|
+
return err instanceof AexRateLimitError;
|
|
126
|
+
}
|
|
127
|
+
function defaultThrottleMessage(args) {
|
|
128
|
+
const who = args.source === "provider" ? "upstream provider" : "aex API";
|
|
129
|
+
const label = args.status === 529 ? "overloaded" : "rate limit reached";
|
|
130
|
+
const attempts = `${args.attempts} attempt${args.attempts === 1 ? "" : "s"}`;
|
|
131
|
+
const wait = args.retryAfterMs !== undefined
|
|
132
|
+
? `; retry after ~${Math.ceil(args.retryAfterMs / 1000)}s`
|
|
133
|
+
: "";
|
|
134
|
+
return `${who} ${label} (HTTP ${args.status}) after ${attempts}${wait}`;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Best-effort parse of an unknown value into a {@link ProviderFault}. Tolerant
|
|
138
|
+
* of two shapes so the SDK consumes the runtime fault the moment it starts
|
|
139
|
+
* emitting one, without a contracts change:
|
|
140
|
+
*
|
|
141
|
+
* 1. The canonical `{ provider?, kind, status?, retryAfterMs?, message? }`
|
|
142
|
+
* (optionally nested under a `providerFault` key), OR
|
|
143
|
+
* 2. A raw upstream error `{ type: "rate_limit_error" | "overloaded_error"
|
|
144
|
+
* | ..., message?, retry_after? | retryAfter? }` — `type` maps to `kind`
|
|
145
|
+
* and `retry_after` (seconds) maps to `retryAfterMs`.
|
|
146
|
+
*
|
|
147
|
+
* Returns `undefined` when the value carries no recognizable fault.
|
|
148
|
+
*/
|
|
149
|
+
export function parseProviderFault(value) {
|
|
150
|
+
if (value === null || typeof value !== "object")
|
|
151
|
+
return undefined;
|
|
152
|
+
const record = value;
|
|
153
|
+
const nested = record.providerFault ?? record.provider_fault;
|
|
154
|
+
if (nested !== undefined && nested !== value) {
|
|
155
|
+
const fromNested = parseProviderFault(nested);
|
|
156
|
+
if (fromNested)
|
|
157
|
+
return fromNested;
|
|
158
|
+
}
|
|
159
|
+
const kind = coerceFaultKind(record.kind ?? record.type ?? record.code);
|
|
160
|
+
if (kind === undefined)
|
|
161
|
+
return undefined;
|
|
162
|
+
const provider = typeof record.provider === "string" ? record.provider : undefined;
|
|
163
|
+
const status = coerceStatus(record.status ?? record.statusCode ?? record.httpStatus);
|
|
164
|
+
const retryAfterMs = coerceRetryAfterMs(record.retryAfterMs ?? record.retry_after_ms ?? record.retryAfter ?? record.retry_after);
|
|
165
|
+
const message = typeof record.message === "string" ? record.message : undefined;
|
|
166
|
+
return {
|
|
167
|
+
kind,
|
|
168
|
+
...(provider !== undefined ? { provider } : {}),
|
|
169
|
+
...(status !== undefined ? { status } : {}),
|
|
170
|
+
...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
|
|
171
|
+
...(message !== undefined ? { message } : {})
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function coerceFaultKind(raw) {
|
|
175
|
+
if (typeof raw !== "string")
|
|
176
|
+
return undefined;
|
|
177
|
+
const value = raw.toLowerCase();
|
|
178
|
+
if (value.includes("rate_limit") || value.includes("rate limit") || value === "429")
|
|
179
|
+
return "rate_limit";
|
|
180
|
+
if (value.includes("overload") || value === "529")
|
|
181
|
+
return "overloaded";
|
|
182
|
+
if (value.includes("quota") || value.includes("insufficient"))
|
|
183
|
+
return "quota_exceeded";
|
|
184
|
+
if (value.includes("provider_error") || value.includes("provider error") || value.includes("api_error")) {
|
|
185
|
+
return "provider_error";
|
|
186
|
+
}
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
function coerceStatus(raw) {
|
|
190
|
+
if (typeof raw === "number" && Number.isFinite(raw))
|
|
191
|
+
return raw;
|
|
192
|
+
if (typeof raw === "string" && /^\d+$/.test(raw.trim()))
|
|
193
|
+
return Number(raw.trim());
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
/** Accept a ms number, a `<digits>` string, or seconds under a `retry_after` alias. */
|
|
197
|
+
function coerceRetryAfterMs(raw) {
|
|
198
|
+
if (typeof raw === "number" && Number.isFinite(raw)) {
|
|
199
|
+
// Heuristic: small integers are seconds (the upstream convention), large
|
|
200
|
+
// ones are already milliseconds.
|
|
201
|
+
return raw > 0 && raw < 1000 ? raw * 1000 : raw;
|
|
202
|
+
}
|
|
203
|
+
if (typeof raw === "string" && /^\d+$/.test(raw.trim())) {
|
|
204
|
+
const n = Number(raw.trim());
|
|
205
|
+
return n > 0 && n < 1000 ? n * 1000 : n;
|
|
206
|
+
}
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
const defaultSleep = (ms, signal) => new Promise((resolve, reject) => {
|
|
210
|
+
if (signal?.aborted) {
|
|
211
|
+
reject(signal.reason instanceof Error ? signal.reason : new DOMException("Aborted", "AbortError"));
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const timer = setTimeout(() => {
|
|
215
|
+
signal?.removeEventListener("abort", onAbort);
|
|
216
|
+
resolve();
|
|
217
|
+
}, ms);
|
|
218
|
+
const onAbort = () => {
|
|
219
|
+
clearTimeout(timer);
|
|
220
|
+
reject(signal?.reason instanceof Error ? signal.reason : new DOMException("Aborted", "AbortError"));
|
|
221
|
+
};
|
|
222
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
223
|
+
});
|
|
224
|
+
function isAbortError(err) {
|
|
225
|
+
return err instanceof Error && err.name === "AbortError";
|
|
226
|
+
}
|
|
227
|
+
async function drain(response) {
|
|
228
|
+
try {
|
|
229
|
+
if (response.body && typeof response.body.cancel === "function") {
|
|
230
|
+
await response.body.cancel();
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
await response.text();
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
// Draining is best-effort; a discarded retryable response never surfaces.
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async function readBodyForError(response) {
|
|
240
|
+
try {
|
|
241
|
+
const text = await response.text();
|
|
242
|
+
if (text.length === 0)
|
|
243
|
+
return {};
|
|
244
|
+
try {
|
|
245
|
+
return JSON.parse(text);
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return { raw: text };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return {};
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Wrap a {@link FetchLike} with the bounded-retry loop. `retry === false`
|
|
257
|
+
* disables the layer entirely (the input fetch is returned unchanged). Otherwise
|
|
258
|
+
* the returned fetch retries transient failures per {@link RetryOptions} and, on
|
|
259
|
+
* an exhausted rate-limit/overloaded status, throws {@link AexRateLimitError}.
|
|
260
|
+
*/
|
|
261
|
+
export function withRetry(fetchImpl, retry, deps = {}) {
|
|
262
|
+
if (retry === false)
|
|
263
|
+
return fetchImpl;
|
|
264
|
+
const config = resolveRetryConfig(retry);
|
|
265
|
+
const sleep = deps.sleep ?? defaultSleep;
|
|
266
|
+
const random = deps.random ?? Math.random;
|
|
267
|
+
const now = deps.now ?? Date.now;
|
|
268
|
+
return async (input, init) => {
|
|
269
|
+
const startedAt = now();
|
|
270
|
+
const signal = init?.signal ?? undefined;
|
|
271
|
+
let attempt = 0;
|
|
272
|
+
for (;;) {
|
|
273
|
+
attempt += 1;
|
|
274
|
+
let response;
|
|
275
|
+
try {
|
|
276
|
+
response = await fetchImpl(input, init);
|
|
277
|
+
}
|
|
278
|
+
catch (err) {
|
|
279
|
+
// A caller-initiated abort is terminal, never transient.
|
|
280
|
+
if (isAbortError(err))
|
|
281
|
+
throw err;
|
|
282
|
+
if (attempt >= config.maxAttempts)
|
|
283
|
+
throw err;
|
|
284
|
+
const delay = computeBackoffDelayMs(config, attempt, random);
|
|
285
|
+
if (now() - startedAt + delay > config.maxElapsedMs)
|
|
286
|
+
throw err;
|
|
287
|
+
await sleep(delay, signal ?? undefined);
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
// Success or a definitive (non-retryable) response — hand straight back so
|
|
291
|
+
// the transport reads/throws exactly as it does without the retry layer.
|
|
292
|
+
if (!isRetryableStatus(response.status)) {
|
|
293
|
+
return response;
|
|
294
|
+
}
|
|
295
|
+
const retryAfterMs = parseRetryAfterMs(response.headers.get("retry-after"), now());
|
|
296
|
+
const willRetry = attempt < config.maxAttempts &&
|
|
297
|
+
now() - startedAt + nextDelayMs(config, attempt, random, retryAfterMs) <= config.maxElapsedMs;
|
|
298
|
+
if (willRetry) {
|
|
299
|
+
await drain(response);
|
|
300
|
+
await sleep(nextDelayMs(config, attempt, random, retryAfterMs), signal ?? undefined);
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
// Retries exhausted (or budget spent). A rate-limit/overloaded status
|
|
304
|
+
// becomes a structured throttle error; any other transient status falls
|
|
305
|
+
// through to the transport's normal AexApiError.
|
|
306
|
+
if (isRateLimitStatus(response.status)) {
|
|
307
|
+
const body = await readBodyForError(response);
|
|
308
|
+
throw new AexRateLimitError({
|
|
309
|
+
status: response.status,
|
|
310
|
+
attempts: attempt,
|
|
311
|
+
source: "api",
|
|
312
|
+
...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
|
|
313
|
+
body
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
return response;
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAC;AAE/D;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAElF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAoCpE,MAAM,aAAa,GAAwB;IACzC,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,GAAG;IACnB,UAAU,EAAE,MAAM;IAClB,YAAY,EAAE,OAAO;CACtB,CAAC;AAEF,yEAAyE;AACzE,MAAM,UAAU,kBAAkB,CAAC,OAAiC;IAClE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/F,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,IAAI,aAAa,CAAC,cAAc,CAAC,CAAC;IAC5F,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,EAAE,UAAU,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;IAC7F,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,IAAI,aAAa,CAAC,YAAY,CAAC,CAAC;IACtF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAsC,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IAChG,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAChC,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA2B,EAC3B,aAAqB,EACrB,MAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,cAAc,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC;IACnF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,8EAA8E;AAC9E,SAAS,WAAW,CAClB,MAA2B,EAC3B,aAAqB,EACrB,MAAoB,EACpB,YAAgC;IAEhC,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACrE,OAAO,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAChF,CAAC;AAuBD,MAAM,cAAc,GAAuC,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEnH,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IAChD,qEAAqE;IAC5D,YAAY,CAAU;IAC/B,oDAAoD;IAC3C,QAAQ,CAAS;IAC1B,iFAAiF;IACxE,MAAM,CAAqB;IACpC,uEAAuE;IAC9D,aAAa,CAAiB;IAEvC,YAAY,IAQX;QACC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5E,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACnC,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QAC3E,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;YAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IAChF,CAAC;CACF;AAED,gDAAgD;AAChD,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,OAAO,GAAG,YAAY,iBAAiB,CAAC;AAC1C,CAAC;AAED,SAAS,sBAAsB,CAAC,IAK/B;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACxE,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,QAAQ,WAAW,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC7E,MAAM,IAAI,GACR,IAAI,CAAC,YAAY,KAAK,SAAS;QAC7B,CAAC,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG;QAC1D,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,GAAG,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,MAAM,WAAW,QAAQ,GAAG,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,cAAc,CAAC;IAC7D,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;IACpC,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IACxE,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;IACrF,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC;IACjI,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhF,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAY;IACnC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,YAAY,CAAC;IACzG,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,YAAY,CAAC;IACvE,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACvF,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACxG,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAChE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,uFAAuF;AACvF,SAAS,kBAAkB,CAAC,GAAY;IACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,yEAAyE;QACzE,iCAAiC;QACjC,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AASD,MAAM,YAAY,GAAG,CAAC,EAAU,EAAE,MAAoB,EAAiB,EAAE,CACvE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QACnG,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,CAAC,MAAM,EAAE,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IACtG,CAAC,CAAC;IACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEL,SAAS,YAAY,CAAC,GAAY;IAChC,OAAO,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,QAAkB;IACrC,IAAI,CAAC;QACH,IAAI,QAAQ,CAAC,IAAI,IAAI,OAAQ,QAAQ,CAAC,IAAuB,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACpF,MAAO,QAAQ,CAAC,IAAuB,CAAC,MAAM,EAAE,CAAC;YACjD,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAkB;IAChD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CACvB,SAAoB,EACpB,KAAuC,EACvC,OAAkB,EAAE;IAEpB,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAEjC,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,SAAS,CAAC;QACzC,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,SAAS,CAAC;YACR,OAAO,IAAI,CAAC,CAAC;YAEb,IAAI,QAA8B,CAAC;YACnC,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,yDAAyD;gBACzD,IAAI,YAAY,CAAC,GAAG,CAAC;oBAAE,MAAM,GAAG,CAAC;gBACjC,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW;oBAAE,MAAM,GAAG,CAAC;gBAC7C,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC7D,IAAI,GAAG,EAAE,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC,YAAY;oBAAE,MAAM,GAAG,CAAC;gBAC/D,MAAM,KAAK,CAAC,KAAK,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC;gBACxC,SAAS;YACX,CAAC;YAED,2EAA2E;YAC3E,yEAAyE;YACzE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YACnF,MAAM,SAAS,GACb,OAAO,GAAG,MAAM,CAAC,WAAW;gBAC5B,GAAG,EAAE,GAAG,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC;YAEhG,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACtB,MAAM,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC;gBACrF,SAAS;YACX,CAAC;YAED,sEAAsE;YACtE,wEAAwE;YACxE,iDAAiD;YACjD,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBAC9C,MAAM,IAAI,iBAAiB,CAAC;oBAC1B,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,QAAQ,EAAE,OAAO;oBACjB,MAAM,EAAE,KAAK;oBACb,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvD,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/secret.d.ts
CHANGED
|
@@ -26,19 +26,19 @@ export interface SecretUploader {
|
|
|
26
26
|
}>;
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
|
-
* A secret with the SAME lifecycle semantic as `
|
|
29
|
+
* A secret with the SAME lifecycle semantic as `File` / `AgentsMd`:
|
|
30
30
|
* EPHEMERAL per-run by default, PROMOTABLE to a persisted, name-searchable
|
|
31
31
|
* workspace secret you can reference and reuse.
|
|
32
32
|
*
|
|
33
|
-
* - `Secret.value(v)` — EPHEMERAL per-run: the value is vaulted
|
|
33
|
+
* - `Secret.value(v)` — EPHEMERAL per-run: the value is vaulted when the session is created and
|
|
34
34
|
* excluded from the idempotency hash; only a `{ ephemeral: true }`
|
|
35
35
|
* placeholder rides the (hashed) submission. Deleted when the run finishes.
|
|
36
|
-
* Clean, no workspace dependency. ≙ `
|
|
36
|
+
* Clean, no workspace dependency. ≙ `File.fromBytes(...)` (a draft).
|
|
37
37
|
* - `secret.upload(client, { name })` — PROMOTE that value into the workspace
|
|
38
|
-
* secret store under `name`; resolves to a `Secret.ref`.
|
|
38
|
+
* secret store under `name`; resolves to a `Secret.ref`.
|
|
39
39
|
* - `Secret.ref(handle)` — WORKSPACE: only the handle rides the submission;
|
|
40
40
|
* the value is resolved server-side from the workspace secret store. No
|
|
41
|
-
* value ever travels.
|
|
41
|
+
* value ever travels.
|
|
42
42
|
*
|
|
43
43
|
* The SDK splits each `Secret` BEFORE the wire payload is built (exactly how
|
|
44
44
|
* `McpServer` splits `headers` into `secrets.mcpServers`): the env-var name keys
|
|
@@ -58,9 +58,9 @@ export declare class Secret {
|
|
|
58
58
|
readonly kind: "ref";
|
|
59
59
|
readonly handle: string;
|
|
60
60
|
});
|
|
61
|
-
/** Ephemeral per-run value. Vaulted
|
|
61
|
+
/** Ephemeral per-run value. Vaulted when the session is created; never in the spec/hash; gone at terminal. */
|
|
62
62
|
static value(value: string | SecretString): Secret;
|
|
63
|
-
/** Reference a workspace secret by handle; resolved server-side
|
|
63
|
+
/** Reference a workspace secret by handle; resolved server-side when the session is created. */
|
|
64
64
|
static ref(handle: string): Secret;
|
|
65
65
|
/** True once this ephemeral secret has been promoted via `upload`. */
|
|
66
66
|
get isConsumed(): boolean;
|
|
@@ -68,7 +68,7 @@ export declare class Secret {
|
|
|
68
68
|
* Promote this EPHEMERAL secret into the workspace secret store under `name`
|
|
69
69
|
* and return a `Secret.ref(name)` for reuse across runs. Blocking: the store
|
|
70
70
|
* write completes before this resolves. Consumes this instance (an ephemeral
|
|
71
|
-
* value is promoted exactly once)
|
|
71
|
+
* value is promoted exactly once).
|
|
72
72
|
*
|
|
73
73
|
* Only valid on a `Secret.value(...)`; a `Secret.ref(...)` is already
|
|
74
74
|
* persisted.
|
package/dist/secret.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { SECRET_ENV_NAME_PATTERN, SECRET_HANDLE_PATTERN, SecretString } from "./_contracts/index.js";
|
|
2
2
|
/**
|
|
3
|
-
* A secret with the SAME lifecycle semantic as `
|
|
3
|
+
* A secret with the SAME lifecycle semantic as `File` / `AgentsMd`:
|
|
4
4
|
* EPHEMERAL per-run by default, PROMOTABLE to a persisted, name-searchable
|
|
5
5
|
* workspace secret you can reference and reuse.
|
|
6
6
|
*
|
|
7
|
-
* - `Secret.value(v)` — EPHEMERAL per-run: the value is vaulted
|
|
7
|
+
* - `Secret.value(v)` — EPHEMERAL per-run: the value is vaulted when the session is created and
|
|
8
8
|
* excluded from the idempotency hash; only a `{ ephemeral: true }`
|
|
9
9
|
* placeholder rides the (hashed) submission. Deleted when the run finishes.
|
|
10
|
-
* Clean, no workspace dependency. ≙ `
|
|
10
|
+
* Clean, no workspace dependency. ≙ `File.fromBytes(...)` (a draft).
|
|
11
11
|
* - `secret.upload(client, { name })` — PROMOTE that value into the workspace
|
|
12
|
-
* secret store under `name`; resolves to a `Secret.ref`.
|
|
12
|
+
* secret store under `name`; resolves to a `Secret.ref`.
|
|
13
13
|
* - `Secret.ref(handle)` — WORKSPACE: only the handle rides the submission;
|
|
14
14
|
* the value is resolved server-side from the workspace secret store. No
|
|
15
|
-
* value ever travels.
|
|
15
|
+
* value ever travels.
|
|
16
16
|
*
|
|
17
17
|
* The SDK splits each `Secret` BEFORE the wire payload is built (exactly how
|
|
18
18
|
* `McpServer` splits `headers` into `secrets.mcpServers`): the env-var name keys
|
|
@@ -44,7 +44,7 @@ export class Secret {
|
|
|
44
44
|
this.handle = undefined;
|
|
45
45
|
this.#value = args.value;
|
|
46
46
|
}
|
|
47
|
-
/** Ephemeral per-run value. Vaulted
|
|
47
|
+
/** Ephemeral per-run value. Vaulted when the session is created; never in the spec/hash; gone at terminal. */
|
|
48
48
|
static value(value) {
|
|
49
49
|
const wrapped = value instanceof SecretString ? value : new SecretString(value, "secret");
|
|
50
50
|
if (!wrapped.unwrap()) {
|
|
@@ -52,7 +52,7 @@ export class Secret {
|
|
|
52
52
|
}
|
|
53
53
|
return new Secret({ kind: "value", value: wrapped });
|
|
54
54
|
}
|
|
55
|
-
/** Reference a workspace secret by handle; resolved server-side
|
|
55
|
+
/** Reference a workspace secret by handle; resolved server-side when the session is created. */
|
|
56
56
|
static ref(handle) {
|
|
57
57
|
return new Secret({ kind: "ref", handle });
|
|
58
58
|
}
|
|
@@ -64,7 +64,7 @@ export class Secret {
|
|
|
64
64
|
* Promote this EPHEMERAL secret into the workspace secret store under `name`
|
|
65
65
|
* and return a `Secret.ref(name)` for reuse across runs. Blocking: the store
|
|
66
66
|
* write completes before this resolves. Consumes this instance (an ephemeral
|
|
67
|
-
* value is promoted exactly once)
|
|
67
|
+
* value is promoted exactly once).
|
|
68
68
|
*
|
|
69
69
|
* Only valid on a `Secret.value(...)`; a `Secret.ref(...)` is already
|
|
70
70
|
* persisted.
|
package/dist/secret.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret.js","sourceRoot":"","sources":["../src/secret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAqBhG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,MAAM;IACR,IAAI,CAAkB;IAC/B,0EAA0E;IACjE,MAAM,CAAqB;IAC3B,MAAM,CAA2B;IAC1C,8EAA8E;IAC9E,SAAS,GAAG,KAAK,CAAC;IAElB,0EAA0E;IAC1E,YAAY,IAAkH;QAC5H,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACxB,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChF,MAAM,IAAI,KAAK,CAAC,iCAAiC,qBAAqB,CAAC,MAAM,EAAE,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"secret.js","sourceRoot":"","sources":["../src/secret.ts"],"names":[],"mappings":"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"}
|