@expandai/sdk 0.19.0 → 0.20.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.
Files changed (72) hide show
  1. package/README.md +130 -4
  2. package/build/dts/AppendixMarkers.d.ts +30 -0
  3. package/build/dts/AppendixMarkers.d.ts.map +1 -0
  4. package/build/dts/Client.d.ts +41 -6
  5. package/build/dts/Client.d.ts.map +1 -1
  6. package/build/dts/Crawls.d.ts +568 -0
  7. package/build/dts/Crawls.d.ts.map +1 -0
  8. package/build/dts/EnvProxyHttpClient.d.ts +28 -0
  9. package/build/dts/EnvProxyHttpClient.d.ts.map +1 -0
  10. package/build/dts/FetchJson.d.ts +444 -37
  11. package/build/dts/FetchJson.d.ts.map +1 -1
  12. package/build/dts/Generated.d.ts +1545 -788
  13. package/build/dts/Generated.d.ts.map +1 -1
  14. package/build/dts/HttpClientHelpers.d.ts +13 -0
  15. package/build/dts/HttpClientHelpers.d.ts.map +1 -1
  16. package/build/dts/Internal.d.ts +6 -4
  17. package/build/dts/Internal.d.ts.map +1 -1
  18. package/build/dts/ParseErrorBody.d.ts +26 -0
  19. package/build/dts/ParseErrorBody.d.ts.map +1 -0
  20. package/build/dts/Playground.d.ts +20 -0
  21. package/build/dts/Playground.d.ts.map +1 -1
  22. package/build/dts/RetryAfter.d.ts +40 -0
  23. package/build/dts/RetryAfter.d.ts.map +1 -0
  24. package/build/dts/Service.d.ts +94 -45
  25. package/build/dts/Service.d.ts.map +1 -1
  26. package/build/dts/StreamPage.d.ts +10 -0
  27. package/build/dts/StreamPage.d.ts.map +1 -0
  28. package/build/dts/index.d.ts +9 -2
  29. package/build/dts/index.d.ts.map +1 -1
  30. package/build/esm/AppendixMarkers.js +307 -0
  31. package/build/esm/AppendixMarkers.js.map +1 -0
  32. package/build/esm/Client.js +96 -15
  33. package/build/esm/Client.js.map +1 -1
  34. package/build/esm/Crawls.js +786 -0
  35. package/build/esm/Crawls.js.map +1 -0
  36. package/build/esm/EnvProxyHttpClient.js +55 -0
  37. package/build/esm/EnvProxyHttpClient.js.map +1 -0
  38. package/build/esm/FetchJson.js +48 -22
  39. package/build/esm/FetchJson.js.map +1 -1
  40. package/build/esm/Generated.js +540 -112
  41. package/build/esm/Generated.js.map +1 -1
  42. package/build/esm/HttpClientHelpers.js +36 -1
  43. package/build/esm/HttpClientHelpers.js.map +1 -1
  44. package/build/esm/Internal.js +140 -33
  45. package/build/esm/Internal.js.map +1 -1
  46. package/build/esm/ParseErrorBody.js +41 -0
  47. package/build/esm/ParseErrorBody.js.map +1 -0
  48. package/build/esm/Playground.js +38 -0
  49. package/build/esm/Playground.js.map +1 -1
  50. package/build/esm/RetryAfter.js +104 -0
  51. package/build/esm/RetryAfter.js.map +1 -0
  52. package/build/esm/Service.js +96 -17
  53. package/build/esm/Service.js.map +1 -1
  54. package/build/esm/StreamPage.js +46 -0
  55. package/build/esm/StreamPage.js.map +1 -0
  56. package/build/esm/index.js +5 -1
  57. package/build/esm/index.js.map +1 -1
  58. package/package.json +8 -2
  59. package/src/AppendixMarkers.ts +370 -0
  60. package/src/Client.ts +131 -16
  61. package/src/Crawls.ts +1387 -0
  62. package/src/EnvProxyHttpClient.ts +71 -0
  63. package/src/FetchJson.ts +63 -25
  64. package/src/Generated.ts +738 -162
  65. package/src/HttpClientHelpers.ts +48 -1
  66. package/src/Internal.ts +163 -105
  67. package/src/ParseErrorBody.ts +42 -0
  68. package/src/Playground.ts +48 -0
  69. package/src/RetryAfter.ts +138 -0
  70. package/src/Service.ts +208 -25
  71. package/src/StreamPage.ts +47 -0
  72. package/src/index.ts +29 -3
@@ -0,0 +1,41 @@
1
+ import { Option, ParseResult, Predicate } from 'effect';
2
+ import { ExpandApiError, ExpandClientApiError } from './Error.js';
3
+ /**
4
+ * The response body a decode failed on.
5
+ *
6
+ * A body that does not satisfy the declared schema arrives as a `ParseError`, which carries none of
7
+ * the body's own fields — not its `_tag`, not its `retryable` verdict, not its `retryAfterSeconds`.
8
+ * Read naively, every one of those looks absent, and absent means "fall back to a client-side
9
+ * guess" at three separate call sites.
10
+ *
11
+ * That is not a hypothetical. This client requires `retryable` on the classes that carry it, so
12
+ * every body from a replica that predates the field fails to decode, and a rolling update runs
13
+ * mixed versions on every deploy. The rejected input survives on the issue, so the fields the
14
+ * server did send are still readable even though the body as a whole was refused.
15
+ *
16
+ * This is deliberately the single place that reaches into a `ParseError` for the body. Each caller
17
+ * that grew its own copy of the check ended up covering a different subset of the fields.
18
+ */
19
+ export function parseErrorBody(error) {
20
+ if (!ParseResult.isParseError(error))
21
+ return Option.none();
22
+ const actual = error.issue.actual;
23
+ return typeof actual === 'object' && actual !== null ? Option.some(actual) : Option.none();
24
+ }
25
+ /**
26
+ * A field read off either a decoded error or the raw body of an undecodable one.
27
+ *
28
+ * The decoded case is just the property; the fallback is what keeps a server's own answer
29
+ * authoritative when this client rejected the envelope around it.
30
+ */
31
+ export function errorField(error, key, refine) {
32
+ const read = (source) => Predicate.hasProperty(source, key) && refine(source[key]) ? Option.some(source[key]) : Option.none();
33
+ return Option.orElse(read(error), () => {
34
+ if (error instanceof ExpandApiError || error instanceof ExpandClientApiError) {
35
+ const body = error.body;
36
+ return Predicate.hasProperty(body, 'error') ? read(body.error) : read(body);
37
+ }
38
+ return Option.flatMap(parseErrorBody(error), read);
39
+ });
40
+ }
41
+ //# sourceMappingURL=ParseErrorBody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParseErrorBody.js","sourceRoot":"","sources":["../../src/ParseErrorBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEjE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC5C,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAA;IACjC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;AAC3F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAI,KAAc,EAAE,GAAW,EAAE,MAAwC;IAClG,MAAM,IAAI,GAAG,CAAC,MAAe,EAAoB,EAAE,CAClD,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;IACrG,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE;QACtC,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;YAC9E,MAAM,IAAI,GAAY,KAAK,CAAC,IAAI,CAAA;YAChC,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5E,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;AACH,CAAC"}
@@ -24,6 +24,44 @@ function legacyArchiveId(value) {
24
24
  export function playgroundBase(snapshotId, host = DEFAULT_PLAYGROUND_HOST) {
25
25
  return `${normalizeHost(host)}/s/${encodeURIComponent(snapshotId)}`;
26
26
  }
27
+ /** Appendix-only Markdown: `${host}/s/${snapshotId}/appendix` (public, `text/markdown`). */
28
+ export function playgroundAppendixUrl(snapshotId, host = DEFAULT_PLAYGROUND_HOST) {
29
+ return `${playgroundBase(snapshotId, host)}/appendix`;
30
+ }
31
+ /**
32
+ * One block as Markdown by evidence id: `${host}/s/${snapshotId}/content?id=N`
33
+ * (public, request with `Accept: text/markdown`). Without an id, the whole
34
+ * public Markdown document.
35
+ */
36
+ export function playgroundContentUrl(snapshotId, evidenceId, host = DEFAULT_PLAYGROUND_HOST) {
37
+ const base = `${playgroundBase(snapshotId, host)}/content`;
38
+ const id = publicEvidenceId(evidenceId);
39
+ return id === undefined ? base : `${base}?id=${id}`;
40
+ }
41
+ const SNAPSHOT_ID_PATTERN = /^[A-Za-z0-9._~-]+$/u;
42
+ /**
43
+ * Accept either a bare snapshot id or any playground URL for the snapshot
44
+ * (`https://expand.land/s/<id>`, `/s/<id>/appendix`, `/s/<id>?id=612`) and
45
+ * return the id plus the host it was served from. Text-mode fetch output
46
+ * has no `meta.snapshotId`; the `playground:` front-matter line is the handle.
47
+ */
48
+ export function parseSnapshotHandle(handle) {
49
+ const trimmed = handle.trim();
50
+ if (trimmed.length === 0)
51
+ return undefined;
52
+ if (SNAPSHOT_ID_PATTERN.test(trimmed))
53
+ return { snapshotId: trimmed };
54
+ try {
55
+ const url = new URL(trimmed);
56
+ const match = /^\/s\/([^/]+)/u.exec(url.pathname);
57
+ if (!match?.[1])
58
+ return undefined;
59
+ return { snapshotId: decodeURIComponent(match[1]), host: url.origin };
60
+ }
61
+ catch {
62
+ return undefined;
63
+ }
64
+ }
27
65
  /** Origin of a server-provided `meta.playground` URL, for reuse as the host (staging-safe). */
28
66
  export function playgroundOrigin(metaPlayground) {
29
67
  return new URL(metaPlayground).origin;
@@ -1 +1 @@
1
- {"version":3,"file":"Playground.js","sourceRoot":"","sources":["../../src/Playground.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Playground.js","sourceRoot":"","sources":["../../src/Playground.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import { Headers, HttpClient } from '@effect/platform';
2
+ import { Duration, Effect, FiberRef, Option, Random } from 'effect';
3
+ import { errorField } from './ParseErrorBody.js';
4
+ const RETRY_AFTER_HEADER = 'retry-after';
5
+ /**
6
+ * Upper bound on any single wait between attempts, server-requested or our own. `Retry-After` is a
7
+ * hint from a remote we do not control, and honouring an arbitrarily large one would park a
8
+ * caller's request far past its own timeout budget; the same bound applies to the exponential
9
+ * backoff, which a large `maxRetries` would otherwise grow past it. Two minutes is well above the
10
+ * largest value the API sends and well below any plausible caller patience.
11
+ */
12
+ export const MAX_RETRY_AFTER = Duration.minutes(2);
13
+ /**
14
+ * `Retry-After` from the most recent response received on this fiber, or `None` if that response
15
+ * carried no usable value.
16
+ *
17
+ * The header cannot travel on the error: `HttpApiClient`-style decoding fails with the schema
18
+ * instance parsed from the body, and the `HttpClientResponse` — the only thing that has headers —
19
+ * is gone by the time a retry schedule runs. Recording it here keeps the signal reachable without
20
+ * threading a response through every call site. Every response overwrites it, so a value can never
21
+ * outlive the attempt that produced it, and a fiber only ever observes its own requests.
22
+ */
23
+ const currentRetryAfter = FiberRef.unsafeMake(Option.none());
24
+ /**
25
+ * Rounded to whole milliseconds rather than kept as fractional seconds.
26
+ *
27
+ * `Duration.seconds(1.001)` is representable only in nanoseconds, so Effect backs it with a
28
+ * `bigint`, and arithmetic on a `bigint` duration rejects a fractional operand outright —
29
+ * `Duration.times(d, 1.125)` throws `RangeError: The number 1.125 cannot be converted to a BigInt`.
30
+ * Both callers can produce a fraction: an HTTP-date differs from now by an arbitrary sub-second
31
+ * amount, and `retryAfterSeconds` is a JSON number. Normalizing here keeps every downstream
32
+ * duration millisecond-backed, so the jitter below is plain number arithmetic. Sub-millisecond
33
+ * precision is meaningless for a retry wait.
34
+ */
35
+ const positiveSeconds = (seconds) => Number.isFinite(seconds) && seconds > 0
36
+ ? Option.some(Duration.min(Duration.millis(Math.round(seconds * 1_000)), MAX_RETRY_AFTER))
37
+ : Option.none();
38
+ /** Parses both `Retry-After` forms: delta-seconds and an HTTP-date. */
39
+ const parseRetryAfter = (value) => {
40
+ const trimmed = value.trim();
41
+ if (/^\d+$/.test(trimmed))
42
+ return positiveSeconds(Number(trimmed));
43
+ const retryAt = Date.parse(trimmed);
44
+ return Number.isNaN(retryAt) ? Option.none() : positiveSeconds((retryAt - Date.now()) / 1_000);
45
+ };
46
+ /**
47
+ * Records the `Retry-After` of every response the client receives, so {@link retryAfterDelay} can
48
+ * read it back when a failure is about to be retried.
49
+ */
50
+ export const recordRetryAfter = (client) => HttpClient.tap(
51
+ // Cleared before the request, not just overwritten after it. An attempt that fails at the
52
+ // transport level never produces a response to overwrite the previous one, so without this the
53
+ // next attempt would sleep on a wait some earlier response asked for — a connection reset would
54
+ // inherit a saturated gate's 20s.
55
+ HttpClient.tapRequest(client, () => FiberRef.set(currentRetryAfter, Option.none())), (response) => FiberRef.set(currentRetryAfter, Option.flatMap(Headers.get(response.headers, RETRY_AFTER_HEADER), parseRetryAfter)));
56
+ /**
57
+ * Reads `retryAfterSeconds` off a decoded error body. Errors that can name their own recovery time
58
+ * say so in the body as well as the header; the body wins because it survives proxies that strip
59
+ * headers, and because it is the value the server actually chose for this error rather than for
60
+ * this status.
61
+ */
62
+ const bodyRetryAfter = (error) => Option.flatMap(
63
+ // Through `errorField` rather than off the error directly, so a body this client could not
64
+ // decode still gets to name its own wait. An unknown error class is both the one whose delay
65
+ // no client-side default can guess and the one certain to fail the decode.
66
+ errorField(error, 'retryAfterSeconds', (value) => typeof value === 'number'), positiveSeconds);
67
+ /**
68
+ * Widest multiple of a server-requested wait this will actually sleep. Jitter only ever runs the
69
+ * wait *longer*: the server named the earliest moment worth trying again, so spreading below it
70
+ * would retry sooner than asked, which is the thing the header exists to prevent.
71
+ */
72
+ const RETRY_AFTER_JITTER = 1.25;
73
+ /**
74
+ * Spreads a server-requested wait across a window so a whole rejected population does not wake at
75
+ * once. The value is a policy constant chosen per status rather than per caller, so every client
76
+ * refused in the same burst is handed the identical number; sleeping it raw would reconverge them
77
+ * on one instant and march them into the same saturated gate together, which is the behaviour the
78
+ * wait was supposed to break up.
79
+ */
80
+ export const spreadRetryAfter = (retryAfter) => Effect.map(Random.next, (factor) =>
81
+ // Scaled as milliseconds rather than with `Duration.times`, which throws on a fractional
82
+ // factor whenever the duration happens to be nanosecond-backed. `positiveSeconds` already
83
+ // keeps our own values millisecond-backed; doing the arithmetic in numbers means an
84
+ // unrounded duration arriving from anywhere else cannot reintroduce that crash.
85
+ Duration.min(Duration.millis(Math.round(Duration.toMillis(retryAfter) * (1 + factor * (RETRY_AFTER_JITTER - 1)))), MAX_RETRY_AFTER));
86
+ /**
87
+ * How long the server asked us to wait before retrying this failure — `Duration.zero` when it asked
88
+ * for nothing, which leaves the caller's own backoff untouched.
89
+ */
90
+ export const retryAfterDelay = (error) => Effect.map(FiberRef.get(currentRetryAfter), (fromHeader) => bodyRetryAfter(error).pipe(Option.orElse(() => fromHeader), Option.getOrElse(() => Duration.zero)));
91
+ /**
92
+ * The wait before the next attempt, given the failure and the backoff the schedule computed.
93
+ *
94
+ * A server that asked for a wait gets at least that wait: retrying sooner than it asked only
95
+ * spends the caller's timeout budget on a refusal it already predicted. The floor is re-jittered
96
+ * ({@link spreadRetryAfter}) because the server hands every client refused in the same burst the
97
+ * identical constant. Backoff wins when it is the longer of the two, but never past
98
+ * {@link MAX_RETRY_AFTER} — a large `maxRetries` must not grow the exponential past what we would
99
+ * accept from the server.
100
+ */
101
+ export const nextRetryDelay = (error, backoff) => Effect.flatMap(retryAfterDelay(error), (retryAfter) => Duration.greaterThan(retryAfter, backoff)
102
+ ? spreadRetryAfter(retryAfter)
103
+ : Effect.succeed(Duration.min(backoff, MAX_RETRY_AFTER)));
104
+ //# sourceMappingURL=RetryAfter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RetryAfter.js","sourceRoot":"","sources":["../../src/RetryAfter.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  import { HttpClient, HttpClientRequest, HttpClientResponse } from '@effect/platform';
2
- import { NodeHttpClient } from '@effect/platform-node';
3
- import { Context, Duration, Effect, flow, Layer, Option, Random, Schedule, Schema } from 'effect';
4
- import { ExpandSdkError } from './Error.js';
5
- import { fetchObjectModeJson, fetchSnapshotSearch, } from './FetchJson.js';
2
+ import { Cause, Context, Duration, Effect, flow, Layer, MutableRef, Option, Random, Schedule, Schema } from 'effect';
3
+ import * as EnvProxyHttpClient from './EnvProxyHttpClient.js';
4
+ import { ExpandApiError, ExpandSdkError } from './Error.js';
5
+ import { fetchObjectModeJson, fetchSnapshotHighlights, } from './FetchJson.js';
6
6
  import * as Generated from './Generated.js';
7
7
  import { decodeError, unexpectedStatus } from './HttpClientHelpers.js';
8
8
  import { isRetryable, toExpandError } from './Internal.js';
9
+ import { nextRetryDelay, recordRetryAfter } from './RetryAfter.js';
9
10
  const DEFAULT_BASE_URL = 'https://api.expand.ai';
10
11
  const DEFAULT_TIMEOUT_MS = 60_000;
11
12
  const DEFAULT_MAX_RETRIES = 2;
@@ -74,6 +75,12 @@ export const buildServiceConfig = Effect.fn('buildServiceConfig')(function* (opt
74
75
  if (!apiKey) {
75
76
  return yield* new ExpandSdkError({ message: 'Missing Expand API key. Pass apiKey or set EXPAND_API_KEY.' });
76
77
  }
78
+ // Checked here, not only in the HttpClient layer, so `new ExpandClient()` keeps its
79
+ // documented sync-throw contract for bad configuration instead of rejecting later.
80
+ const invalidProxy = EnvProxyHttpClient.invalidProxyEnvMessage();
81
+ if (Option.isSome(invalidProxy)) {
82
+ return yield* new ExpandSdkError({ message: invalidProxy.value });
83
+ }
77
84
  return yield* Schema.decode(ServiceConfig)({
78
85
  apiKey,
79
86
  baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
@@ -95,11 +102,14 @@ export const buildServiceConfig = Effect.fn('buildServiceConfig')(function* (opt
95
102
  * ```
96
103
  */
97
104
  export class ExpandService extends Effect.Service()('@expandai/sdk/ExpandService', {
98
- dependencies: [NodeHttpClient.layer],
105
+ dependencies: [EnvProxyHttpClient.layer],
99
106
  effect: Effect.gen(function* () {
100
107
  const config = yield* ServiceConfigTag;
101
108
  const httpClient = yield* HttpClient.HttpClient;
102
- const authedClient = httpClient.pipe(HttpClient.mapRequest(flow(HttpClientRequest.prependUrl(config.baseUrl), HttpClientRequest.setHeader('x-expand-api-key', config.apiKey))));
109
+ const authedClient = httpClient.pipe(HttpClient.mapRequest(flow(HttpClientRequest.prependUrl(config.baseUrl), HttpClientRequest.setHeader('x-expand-api-key', config.apiKey))),
110
+ // Wraps every path, generated and hand-written alike, so `withRetries` can honour a
111
+ // `Retry-After` no matter which call produced the failure.
112
+ recordRetryAfter);
103
113
  const generated = Generated.make(authedClient);
104
114
  const fetchMarkdown = (params, queryParams = {}) => HttpClientRequest.make('POST')('/v1/fetch').pipe(
105
115
  // Coalesce null -> undefined: the generated `include` schema is nullable, but `setUrlParams`
@@ -109,11 +119,15 @@ export class ExpandService extends Effect.Service()('@expandai/sdk/ExpandService
109
119
  '400': (response) => decodeError(response, Generated.FetchFetch400),
110
120
  '401': (response) => decodeError(response, Generated.AuthFailed),
111
121
  '403': (response) => decodeError(response, Generated.FetchFetch403),
112
- '413': (response) => decodeError(response, Generated.PayloadTooLarge),
113
- '429': (response) => decodeError(response, Generated.TooManyRequests),
122
+ '404': (response) => decodeError(response, Generated.FetchOriginNotFound),
123
+ '410': (response) => decodeError(response, Generated.FetchOriginGone),
124
+ '413': (response) => decodeError(response, Generated.FetchFetch413),
125
+ '415': (response) => decodeError(response, Generated.FetchUnsupportedContentType),
126
+ '422': (response) => decodeError(response, Generated.FetchVideoUnavailable),
127
+ '429': (response) => decodeError(response, Generated.FetchFetch429),
114
128
  '500': (response) => decodeError(response, Generated.InternalError),
115
- '502': (response) => decodeError(response, Generated.FetchNavigationFailed),
116
- '503': (response) => decodeError(response, Generated.ServiceUnavailable),
129
+ '502': (response) => decodeError(response, Generated.FetchFetch502),
130
+ '503': (response) => decodeError(response, Generated.FetchFetch503),
117
131
  '504': (response) => decodeError(response, Generated.FetchCaptureTimeout),
118
132
  '529': (response) => decodeError(response, Generated.FetchCapacityTimeout),
119
133
  orElse: (response) => unexpectedStatus(request, response),
@@ -123,10 +137,25 @@ export class ExpandService extends Effect.Service()('@expandai/sdk/ExpandService
123
137
  const withRetries = Effect.fn('ExpandService.withRetries')(function* (operation, requestOptions = {}) {
124
138
  const totalTimeoutMs = requestOptions.timeoutMs ?? config.timeoutMs;
125
139
  const maxRetries = requestOptions.maxRetries ?? config.maxRetries;
140
+ // The failure the schedule last chose to wait on, while the fiber is inside that wait.
141
+ // If the wall-clock budget expires mid-wait, the caller is handed this refusal rather
142
+ // than a timeout: the server said "not before X", the caller said "no later than Y",
143
+ // and a timeout would hide the 429/503 the caller branches on. Cleared before every
144
+ // attempt, so a budget that expires during a live attempt still reports as a timeout.
145
+ const pendingRefusal = MutableRef.make(Option.none());
126
146
  // `timeoutMs` is one wall-clock budget for the operation, including retries and backoff. A slow
127
147
  // valid capture may use most of that budget; only failures that arrive before it expires can retry.
128
- const retrySchedule = Schedule.exponential(Duration.millis(250)).pipe(Schedule.jittered, Schedule.compose(Schedule.recurs(maxRetries)), Schedule.whileInput((error) => isRetryable(error, totalTimeoutMs)));
129
- return yield* operation.pipe(Effect.retry(retrySchedule), Effect.timeout(Duration.millis(totalTimeoutMs)), Effect.mapError((error) => toExpandError(error, totalTimeoutMs)));
148
+ const retrySchedule = Schedule.exponential(Duration.millis(250)).pipe(Schedule.jittered, Schedule.compose(Schedule.recurs(maxRetries)), Schedule.whileInput((error) => isRetryable(error, totalTimeoutMs)),
149
+ // `passthrough` republishes the failure as the schedule's output so the delay function
150
+ // can see which error it is about to wait on.
151
+ Schedule.passthrough,
152
+ // Floors the delay at the server's requested wait (re-jittered) and caps it at
153
+ // `MAX_RETRY_AFTER`; the whole policy lives with its inputs in `RetryAfter.ts`.
154
+ Schedule.modifyDelayEffect((error, backoff) => Effect.zipLeft(nextRetryDelay(error, backoff), Effect.sync(() => MutableRef.set(pendingRefusal, Option.some(error))))));
155
+ return yield* Effect.sync(() => MutableRef.set(pendingRefusal, Option.none())).pipe(Effect.zipRight(operation), Effect.retry(retrySchedule), Effect.timeoutFail({
156
+ duration: Duration.millis(totalTimeoutMs),
157
+ onTimeout: () => Option.getOrElse(MutableRef.get(pendingRefusal), () => new Cause.TimeoutException()),
158
+ }), Effect.mapError((error) => toExpandError(error, totalTimeoutMs)));
130
159
  });
131
160
  const fetch = Effect.fn('ExpandService.fetch')(function* (params, requestOptions = {}) {
132
161
  const { include, ...retryOptions } = requestOptions;
@@ -138,10 +167,15 @@ export class ExpandService extends Effect.Service()('@expandai/sdk/ExpandService
138
167
  // Coalesce null -> undefined before `setUrlParams`, which throws on null.
139
168
  return yield* withRetries(fetchObjectModeJson(authedClient, { params: { include: include ?? undefined }, payload: params }), retryOptions);
140
169
  });
141
- const fetchSearch = Effect.fn('ExpandService.fetchSearch')(function* (params, requestOptions = {}) {
142
- // `fetchSnapshotSearch` mirrors the generated call but preserves the statejson snippet `json`.
143
- return yield* withRetries(fetchSnapshotSearch(authedClient, params), requestOptions);
144
- });
170
+ const publicClient = httpClient.pipe(HttpClient.mapRequest(HttpClientRequest.prependUrl(config.baseUrl)), recordRetryAfter);
171
+ function getSnapshot(params, options = {}) {
172
+ return params.highlights === undefined
173
+ ? withRetries(Generated.make(publicClient).publicSnapshotsGetCatalog(encodeURIComponent(params.snapshotId), {}), options)
174
+ : withRetries(fetchSnapshotHighlights(authedClient, params.snapshotId, {
175
+ highlights: params.highlights,
176
+ include: params.include,
177
+ }), options);
178
+ }
145
179
  const batched = Effect.fn('ExpandService.batched')(function* (params, requestOptions = {}) {
146
180
  const { idempotencyKey: providedIdempotencyKey, ...retryOptions } = requestOptions;
147
181
  const idempotencyKey = yield* Option.fromNullable(providedIdempotencyKey).pipe(Option.match({
@@ -182,7 +216,52 @@ export class ExpandService extends Effect.Service()('@expandai/sdk/ExpandService
182
216
  const cancelBatched = Effect.fn('ExpandService.cancelBatched')(function* (id, requestOptions = {}) {
183
217
  return yield* withRetries(generated.fetchCancelBatched(id), requestOptions);
184
218
  });
185
- return { fetch, fetchJson, fetchSearch, batched, getBatched, cancelBatched };
219
+ // Crawl control routes intentionally do not use the fetch-only generator. They still
220
+ // share this service's authenticated client, wall-clock budget, and retry policy.
221
+ const crawlRequest = Effect.fn('ExpandService.crawlRequest')(function* (path, method, options = {}, body, idempotencyKey) {
222
+ const request = HttpClientRequest.make(method)(path);
223
+ const keyed = idempotencyKey === undefined
224
+ ? request
225
+ : HttpClientRequest.setHeader(request, 'x-idempotency-key', idempotencyKey);
226
+ const encoded = body === undefined
227
+ ? keyed
228
+ : yield* HttpClientRequest.bodyJson(keyed, body).pipe(Effect.mapError((cause) => new ExpandSdkError({ message: 'Invalid Crawl request body.', cause })));
229
+ return yield* withRetries(authedClient.execute(encoded).pipe(Effect.flatMap((response) => (response.status >= 200 && response.status < 300
230
+ ? response.json
231
+ : response.json.pipe(Effect.catchAll(() => Effect.void))).pipe(Effect.flatMap((value) => {
232
+ if (response.status >= 200 && response.status < 300) {
233
+ // The hand-written interfaces mirror the versioned Crawl HTTP contract.
234
+ return Effect.succeed(value);
235
+ }
236
+ const error = typeof value === 'object' && value !== null && 'error' in value ? value.error : undefined;
237
+ const message = typeof error === 'object' && error !== null && 'message' in error && typeof error.message === 'string'
238
+ ? error.message
239
+ : `HTTP ${response.status}`;
240
+ return new ExpandApiError({ message, status: response.status, body: value });
241
+ })))), options);
242
+ });
243
+ // Mirrors the Promise client: a durable caller key is required before any request is issued,
244
+ // or an unretryable failure could not be replayed by key.
245
+ // Takes `string | undefined`: TypeScript does not stop a JavaScript caller, and
246
+ // reading `.length` off undefined threw where the contract promises a typed failure.
247
+ const requireCrawlIdempotencyKey = (value, operation) => value !== undefined && value.length >= 1 && value.length <= 255
248
+ ? Effect.succeed(value)
249
+ : new ExpandSdkError({ message: `${operation} requires an idempotencyKey between 1 and 255 characters.` });
250
+ function crawlById(id) {
251
+ const path = `/v1/crawls/${encodeURIComponent(id)}`;
252
+ return {
253
+ id,
254
+ status: (options = {}) => crawlRequest(path, 'GET', options),
255
+ cancel: (options = {}) => crawlRequest(`${path}/cancel`, 'POST', options),
256
+ update: (patch, options = {}) => crawlRequest(path, 'PATCH', options, patch),
257
+ run: (options) => requireCrawlIdempotencyKey(options.idempotencyKey, 'Crawl.run').pipe(Effect.flatMap((idempotencyKey) => crawlRequest(`${path}/runs${options.replayOnly ? '/replay' : ''}`, 'POST', options, undefined, idempotencyKey))),
258
+ };
259
+ }
260
+ const crawls = Object.assign(crawlById, {
261
+ list: (options = {}) => crawlRequest(options.limit === undefined ? '/v1/crawls' : `/v1/crawls?limit=${encodeURIComponent(options.limit)}`, 'GET', options),
262
+ create: (request, options) => requireCrawlIdempotencyKey(options.idempotencyKey, 'Crawls.create').pipe(Effect.flatMap((idempotencyKey) => crawlRequest('/v1/crawls', 'POST', options, request, idempotencyKey)), Effect.map((created) => created.map(({ id }) => crawlById(id)))),
263
+ });
264
+ return { fetch, fetchJson, snapshots: { get: getSnapshot }, batched, getBatched, cancelBatched, crawls };
186
265
  }),
187
266
  }) {
188
267
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Service.js","sourceRoot":"","sources":["../../src/Service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Service.js","sourceRoot":"","sources":["../../src/Service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { BackoffDefaults, stream } from '@durable-streams/client';
2
+ /** live:false reads one bounded server response, never the complete retained history. */
3
+ export async function readStreamPage(response) {
4
+ if (response.live !== false)
5
+ throw new Error('A bounded stream page requires live:false.');
6
+ try {
7
+ const items = await response.json();
8
+ return {
9
+ items,
10
+ offset: response.offset,
11
+ upToDate: response.upToDate,
12
+ streamClosed: response.streamClosed,
13
+ cursor: response.cursor,
14
+ };
15
+ }
16
+ finally {
17
+ response.cancel();
18
+ }
19
+ }
20
+ /** Decode bounded responses with the official protocol client while preserving the caller's auth transport. */
21
+ export class DurableStreamReader {
22
+ cursors = new Map();
23
+ cursor(key) {
24
+ return this.cursors.get(key);
25
+ }
26
+ async read(key, response, offset) {
27
+ const page = await readStreamPage(await stream({
28
+ url: response.url || 'https://stream.invalid/',
29
+ offset,
30
+ live: false,
31
+ json: true,
32
+ fetch: async () => response,
33
+ backoffOptions: { ...BackoffDefaults, maxRetries: 0 },
34
+ }));
35
+ this.cursors.delete(key);
36
+ if (!page.streamClosed && page.cursor !== undefined)
37
+ this.cursors.set(key, page.cursor);
38
+ if (this.cursors.size > 128) {
39
+ const oldest = this.cursors.keys().next().value;
40
+ if (oldest !== undefined)
41
+ this.cursors.delete(oldest);
42
+ }
43
+ return page;
44
+ }
45
+ }
46
+ //# sourceMappingURL=StreamPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamPage.js","sourceRoot":"","sources":["../../src/StreamPage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAuC,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEtG,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAI,QAA2B;IAClE,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC1F,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAK,CAAA;QACtC,OAAO;YACN,KAAK;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;SACvB,CAAA;IACF,CAAC;YAAS,CAAC;QACV,QAAQ,CAAC,MAAM,EAAE,CAAA;IAClB,CAAC;AACF,CAAC;AAED,+GAA+G;AAC/G,MAAM,OAAO,mBAAmB;IACd,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEpD,MAAM,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI,CAAI,GAAW,EAAE,QAAkB,EAAE,MAAc;QAC5D,MAAM,IAAI,GAAG,MAAM,cAAc,CAChC,MAAM,MAAM,CAAI;YACf,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,yBAAyB;YAC9C,MAAM;YACN,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ;YAC3B,cAAc,EAAE,EAAE,GAAG,eAAe,EAAE,UAAU,EAAE,CAAC,EAAE;SACrD,CAAC,CACF,CAAA;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACxB,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACvF,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;YAC/C,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACtD,CAAC;QACD,OAAO,IAAI,CAAA;IACZ,CAAC;CACD"}
@@ -1,4 +1,8 @@
1
- export { ExpandClient } from './Client.js';
1
+ export { APPENDIX_MARKER_PREFIX, AppendixMarkerLevel, isAppendixMarkerLine, parseAppendixMarkerLine, parseAppendixMarkers, stripAppendixMarkers, withoutFencedCode, } from './AppendixMarkers.js';
2
+ export { Expand, ExpandClient } from './Client.js';
3
+ export * from './Crawls.js';
2
4
  export { ExpandApiError, ExpandClientApiError, ExpandClientConnectionError, ExpandClientError, ExpandClientTimeoutError, ExpandConnectionError, ExpandSdkError, ExpandTimeoutError, } from './Error.js';
5
+ export { isFetchOriginError } from './FetchJson.js';
6
+ export { citationUrl, DEFAULT_PLAYGROUND_HOST, parseSnapshotHandle, playgroundAppendixUrl, playgroundBase, playgroundContentUrl, resolvePlaygroundHost, } from './Playground.js';
3
7
  export { ExpandService, ExpandServiceOptions, RequestOptions } from './Service.js';
4
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EACN,cAAc,EACd,oBAAoB,EACpB,2BAA2B,EAC3B,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GAClB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACN,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,GACjB,MAAM,sBAAsB,CAAA;AAqB7B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAClD,cAAc,aAAa,CAAA;AAE3B,OAAO,EACN,cAAc,EACd,oBAAoB,EACpB,2BAA2B,EAC3B,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GAClB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAEnD,OAAO,EACN,WAAW,EACX,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,qBAAqB,GACrB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,10 @@
1
1
  {
2
2
  "name": "@expandai/sdk",
3
3
  "type": "module",
4
- "version": "0.19.0",
4
+ "engines": {
5
+ "node": ">=20.3.0"
6
+ },
7
+ "version": "0.20.0",
5
8
  "private": false,
6
9
  "description": "TypeScript SDK for ExpandAI",
7
10
  "author": "ExpandAI",
@@ -49,6 +52,7 @@
49
52
  },
50
53
  "scripts": {
51
54
  "generate": "tsx scripts/generate-client.ts",
55
+ "example:disclosure": "tsx --tsconfig tsconfig.src.json examples/progressive-disclosure.ts",
52
56
  "build": "tsc -b tsconfig.build.json",
53
57
  "check": "tsc -b tsconfig.json",
54
58
  "check:test": "tsc -b tsconfig.test.json",
@@ -60,6 +64,7 @@
60
64
  "test:integration": "vitest run integration --fileParallelism=false --testTimeout=30000"
61
65
  },
62
66
  "dependencies": {
67
+ "@durable-streams/client": "^0.2.6",
63
68
  "@effect/platform": "0.96.1",
64
69
  "@effect/platform-node": "0.106.0",
65
70
  "effect": "3.21.2"
@@ -70,5 +75,6 @@
70
75
  "@tim-smart/openapi-gen": "0.3.12",
71
76
  "@types/node": "^25.5.2",
72
77
  "vitest": "4.1.4"
73
- }
78
+ },
79
+ "expandSourceSha": "78c2a275281da76a71e19dcf978f3a32fe66e0fd"
74
80
  }