@worldlabsai/client 0.1.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 (54) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +109 -0
  3. package/dist/client.d.ts +34 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +31 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/core/assets.d.ts +138 -0
  8. package/dist/core/assets.d.ts.map +1 -0
  9. package/dist/core/assets.js +104 -0
  10. package/dist/core/assets.js.map +1 -0
  11. package/dist/core/index.d.ts +5 -0
  12. package/dist/core/index.d.ts.map +1 -0
  13. package/dist/core/index.js +5 -0
  14. package/dist/core/index.js.map +1 -0
  15. package/dist/core/operations.d.ts +52 -0
  16. package/dist/core/operations.d.ts.map +1 -0
  17. package/dist/core/operations.js +81 -0
  18. package/dist/core/operations.js.map +1 -0
  19. package/dist/core/sleep.d.ts +7 -0
  20. package/dist/core/sleep.d.ts.map +1 -0
  21. package/dist/core/sleep.js +23 -0
  22. package/dist/core/sleep.js.map +1 -0
  23. package/dist/core/tasks.d.ts +27 -0
  24. package/dist/core/tasks.d.ts.map +1 -0
  25. package/dist/core/tasks.js +26 -0
  26. package/dist/core/tasks.js.map +1 -0
  27. package/dist/core/transport.d.ts +84 -0
  28. package/dist/core/transport.d.ts.map +1 -0
  29. package/dist/core/transport.js +171 -0
  30. package/dist/core/transport.js.map +1 -0
  31. package/dist/generated/developer-api.gen.d.ts +2760 -0
  32. package/dist/generated/developer-api.gen.d.ts.map +1 -0
  33. package/dist/generated/developer-api.gen.js +6 -0
  34. package/dist/generated/developer-api.gen.js.map +1 -0
  35. package/dist/generated/tasks.gen.d.ts +153 -0
  36. package/dist/generated/tasks.gen.d.ts.map +1 -0
  37. package/dist/generated/tasks.gen.js +80 -0
  38. package/dist/generated/tasks.gen.js.map +1 -0
  39. package/dist/index.d.ts +4 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +3 -0
  42. package/dist/index.js.map +1 -0
  43. package/examples/posing.ts +62 -0
  44. package/package.json +49 -0
  45. package/src/client.ts +55 -0
  46. package/src/core/assets.ts +162 -0
  47. package/src/core/index.ts +27 -0
  48. package/src/core/operations.ts +114 -0
  49. package/src/core/sleep.ts +22 -0
  50. package/src/core/tasks.ts +45 -0
  51. package/src/core/transport.ts +246 -0
  52. package/src/generated/developer-api.gen.ts +2760 -0
  53. package/src/generated/tasks.gen.ts +110 -0
  54. package/src/index.ts +24 -0
@@ -0,0 +1,5 @@
1
+ export { assetId, assetRef, createAssets, } from "./assets.js";
2
+ export { createOperations, waitForOperation, } from "./operations.js";
3
+ export { submitTask } from "./tasks.js";
4
+ export { ApiError, apiKeyAuth, createTransport, withHeader, } from "./transport.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,QAAQ,EACR,YAAY,GAGb,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAGhB,gBAAgB,GAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAsB,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EACL,QAAQ,EAER,UAAU,EACV,eAAe,EAMf,UAAU,GACX,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { Operation as WireOperation } from "../generated/developer-api.gen.ts";
2
+ import type { Transport } from "./transport.ts";
3
+ /**
4
+ * A long-running task operation whose `response` is typed by the task that created it.
5
+ * A pending operation has `done: false`; a finished operation has `done: true` and
6
+ * may contain either a response or an error reported by the task.
7
+ */
8
+ export type Operation<TResponse = Record<string, unknown>> = Omit<WireOperation, "response"> & {
9
+ response?: TResponse | null;
10
+ };
11
+ /** A task operation known to have finished. Inspect `error` before using `response`. */
12
+ export type DoneOperation<TResponse> = Operation<TResponse> & {
13
+ done: true;
14
+ };
15
+ /** Polling and local cancellation settings. Waiting has no default overall timeout. */
16
+ export interface WaitOptions extends Pick<RequestInit, "signal"> {
17
+ /** Delay after an incomplete poll, in milliseconds. Defaults to 1,000 ms. */
18
+ pollIntervalMs?: number;
19
+ }
20
+ /**
21
+ * Poll an operation until it reports `done`.
22
+ * Checks for cancellation before each poll and passes the signal to `fetchOperation`.
23
+ *
24
+ * @param fetchOperation - Fetches the current state; honor its signal to abort an in-flight poll.
25
+ * @param options - Polling interval and cancellation settings.
26
+ * @returns The finished operation, which may contain `error` instead of `response`.
27
+ */
28
+ export declare const waitForOperation: <TResponse>(fetchOperation: (signal?: AbortSignal | null) => Promise<Operation<TResponse>>, { pollIntervalMs, signal }?: WaitOptions) => Promise<DoneOperation<TResponse>>;
29
+ /**
30
+ * Create operation lookup and polling methods.
31
+ * @param transport - Authenticated API transport.
32
+ * @param operationPath - Lookup route containing an `{operation}` placeholder.
33
+ */
34
+ export declare const createOperations: (transport: Transport, operationPath: string) => {
35
+ /** Fetch the current state of an operation by its id. */
36
+ get: (operationId: string, options?: Pick<RequestInit, "signal">) => Promise<Operation<Record<string, unknown>>>;
37
+ /**
38
+ * Poll until an operation is done. The returned operation keeps the response type
39
+ * associated with the task that created it.
40
+ *
41
+ * An operation can finish with an API-reported task error; inspect `error` before
42
+ * reading `response`. Aborting stops local waiting without canceling the task.
43
+ * HTTP 502, 503, and 504 polling failures are retried up to three times in a row;
44
+ * a successful poll resets the retry count.
45
+ *
46
+ * @param operation - Operation returned by task submission. Completed operations return immediately.
47
+ * @param options - Polling interval and abort signal; no overall timeout by default.
48
+ * @throws {ApiError} If polling fails with an unretried status or exhausts gateway retries.
49
+ */
50
+ wait: <TResponse>(operation: Operation<TResponse>, options?: WaitOptions) => Promise<DoneOperation<TResponse>>;
51
+ };
52
+ //# sourceMappingURL=operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/core/operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,MAAM,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG;IAC7F,QAAQ,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,wFAAwF;AACxF,MAAM,MAAM,aAAa,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAE7E,uFAAuF;AACvF,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC9D,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,GAAU,SAAS,EAC9C,gBAAgB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAC9E,6BAAuD,WAAgB,KACtE,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAWlC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,SAAS,EAAE,eAAe,MAAM;IAYxE,yDAAyD;uBAChC,MAAM,YAAW,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IAGrE;;;;;;;;;;;;OAYG;WACU,SAAS,aAAa,SAAS,CAAC,SAAS,CAAC,YAAY,WAAW;CA8BjF,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { sleep } from "./sleep.js";
2
+ import { ApiError } from "./transport.js";
3
+ const DEFAULT_POLL_INTERVAL_MS = 1000;
4
+ /**
5
+ * Poll an operation until it reports `done`.
6
+ * Checks for cancellation before each poll and passes the signal to `fetchOperation`.
7
+ *
8
+ * @param fetchOperation - Fetches the current state; honor its signal to abort an in-flight poll.
9
+ * @param options - Polling interval and cancellation settings.
10
+ * @returns The finished operation, which may contain `error` instead of `response`.
11
+ */
12
+ export const waitForOperation = async (fetchOperation, { pollIntervalMs = DEFAULT_POLL_INTERVAL_MS, signal } = {}) => {
13
+ // oxlint-disable no-await-in-loop -- polling is sequential by definition
14
+ for (;;) {
15
+ signal?.throwIfAborted();
16
+ const operation = await fetchOperation(signal);
17
+ if (operation.done) {
18
+ return { ...operation, done: true };
19
+ }
20
+ await sleep(pollIntervalMs, signal);
21
+ }
22
+ // oxlint-enable no-await-in-loop
23
+ };
24
+ /**
25
+ * Create operation lookup and polling methods.
26
+ * @param transport - Authenticated API transport.
27
+ * @param operationPath - Lookup route containing an `{operation}` placeholder.
28
+ */
29
+ export const createOperations = (transport, operationPath) => {
30
+ const get = async (operationId, { signal, wait } = {}) => await transport.request(operationPath, {
31
+ params: { operation: operationId },
32
+ query: { wait },
33
+ ...(signal ? { signal } : {}),
34
+ });
35
+ return {
36
+ /** Fetch the current state of an operation by its id. */
37
+ get: async (operationId, options = {}) => await get(operationId, options),
38
+ /**
39
+ * Poll until an operation is done. The returned operation keeps the response type
40
+ * associated with the task that created it.
41
+ *
42
+ * An operation can finish with an API-reported task error; inspect `error` before
43
+ * reading `response`. Aborting stops local waiting without canceling the task.
44
+ * HTTP 502, 503, and 504 polling failures are retried up to three times in a row;
45
+ * a successful poll resets the retry count.
46
+ *
47
+ * @param operation - Operation returned by task submission. Completed operations return immediately.
48
+ * @param options - Polling interval and abort signal; no overall timeout by default.
49
+ * @throws {ApiError} If polling fails with an unretried status or exhausts gateway retries.
50
+ */
51
+ wait: async (operation, options) => {
52
+ options?.signal?.throwIfAborted();
53
+ if (operation.done) {
54
+ return { ...operation, done: true };
55
+ }
56
+ let gatewayErrors = 0;
57
+ return await waitForOperation(async (signal) => {
58
+ try {
59
+ const current = await get(operation.id, {
60
+ ...(signal ? { signal } : {}),
61
+ wait: true,
62
+ });
63
+ gatewayErrors = 0;
64
+ return current;
65
+ }
66
+ catch (error) {
67
+ // A gateway timeout does not cancel the task. Resume the same read;
68
+ // the caller's signal still bounds the entire wait, including retries.
69
+ gatewayErrors += 1;
70
+ if (!(error instanceof ApiError) ||
71
+ ![502, 503, 504].includes(error.response.status) ||
72
+ gatewayErrors > 3) {
73
+ throw error;
74
+ }
75
+ return operation;
76
+ }
77
+ }, options);
78
+ },
79
+ };
80
+ };
81
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/core/operations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAqB1C,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,cAA8E,EAC9E,EAAE,cAAc,GAAG,wBAAwB,EAAE,MAAM,KAAkB,EAAE,EACpC,EAAE;IACrC,yEAAyE;IACzE,SAAS,CAAC;QACR,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACtC,CAAC;QACD,MAAM,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,iCAAiC;AACnC,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAoB,EAAE,aAAqB,EAAE,EAAE;IAC9E,MAAM,GAAG,GAAG,KAAK,EACf,WAAmB,EACnB,EAAE,MAAM,EAAE,IAAI,KAAuD,EAAE,EACvE,EAAE,CACF,MAAM,SAAS,CAAC,OAAO,CAAuB,aAAa,EAAE;QAC3D,MAAM,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE;QAClC,KAAK,EAAE,EAAE,IAAI,EAAE;QACf,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC,CAAC;IAEL,OAAO;QACL,yDAAyD;QACzD,GAAG,EAAE,KAAK,EAAE,WAAmB,EAAE,UAAuC,EAAE,EAAE,EAAE,CAC5E,MAAM,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC;QAEjC;;;;;;;;;;;;WAYG;QACH,IAAI,EAAE,KAAK,EAAa,SAA+B,EAAE,OAAqB,EAAE,EAAE;YAChF,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;YAClC,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBACnB,OAAO,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,IAAa,EAAE,CAAC;YAC/C,CAAC;YACD,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,OAAO,MAAM,gBAAgB,CAAY,KAAK,EAAE,MAAM,EAAE,EAAE;gBACxD,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAY,SAAS,CAAC,EAAE,EAAE;wBACjD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC7B,IAAI,EAAE,IAAI;qBACX,CAAC,CAAC;oBACH,aAAa,GAAG,CAAC,CAAC;oBAClB,OAAO,OAAO,CAAC;gBACjB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,oEAAoE;oBACpE,uEAAuE;oBACvE,aAAa,IAAI,CAAC,CAAC;oBACnB,IACE,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC;wBAC5B,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;wBAChD,aAAa,GAAG,CAAC,EACjB,CAAC;wBACD,MAAM,KAAK,CAAC;oBACd,CAAC;oBACD,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC,EAAE,OAAO,CAAC,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Resolves after `ms`, or as soon as `signal` aborts. Uses `setTimeout` rather than
3
+ * `AbortSignal.timeout` because Node does not keep the event loop alive for the latter;
4
+ * a script whose only pending work is this sleep would exit before the next poll.
5
+ */
6
+ export declare const sleep: (ms: number, signal?: AbortSignal | null) => Promise<void>;
7
+ //# sourceMappingURL=sleep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/core/sleep.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAU,IAAI,MAAM,EAAE,SAAS,WAAW,GAAG,IAAI,KAAG,OAAO,CAAC,IAAI,CAgBjF,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Resolves after `ms`, or as soon as `signal` aborts. Uses `setTimeout` rather than
3
+ * `AbortSignal.timeout` because Node does not keep the event loop alive for the latter;
4
+ * a script whose only pending work is this sleep would exit before the next poll.
5
+ */
6
+ export const sleep = async (ms, signal) => {
7
+ if (signal?.aborted) {
8
+ return;
9
+ }
10
+ // oxlint-disable-next-line promise/avoid-new -- waiting on a timer has no promise-returning API
11
+ await new Promise((resolve) => {
12
+ const finish = () => {
13
+ // oxlint-disable-next-line no-use-before-define -- finish runs after the timer is initialized
14
+ clearTimeout(timer);
15
+ signal?.removeEventListener("abort", finish);
16
+ // oxlint-disable-next-line promise/no-multiple-resolved -- cleanup does not invoke the callbacks
17
+ resolve();
18
+ };
19
+ const timer = setTimeout(finish, ms);
20
+ signal?.addEventListener("abort", finish, { once: true });
21
+ });
22
+ };
23
+ //# sourceMappingURL=sleep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../src/core/sleep.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,EAAE,EAAU,EAAE,MAA2B,EAAiB,EAAE;IACpF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IACD,gGAAgG;IAChG,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,8FAA8F;YAC9F,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7C,iGAAiG;YACjG,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { Transport } from "./transport.ts";
2
+ export interface SubmitOptions extends Pick<RequestInit, "signal"> {
3
+ /**
4
+ * Ask the server to wait up to its time limit. The returned operation may still
5
+ * be running; use `operations.wait` to await completion. Defaults to false.
6
+ */
7
+ wait?: boolean;
8
+ /**
9
+ * Nonempty key shared by every attempt. Defaults to a fresh UUID per call;
10
+ * reuse your own key when retrying across calls or processes.
11
+ */
12
+ idempotencyKey?: string;
13
+ }
14
+ /**
15
+ * Submit a task request and return its operation resource.
16
+ * Retries network failures and HTTP 429/502/503/504 up to three times with the
17
+ * same key and body. Uses jittered exponential backoff and honors Retry-After.
18
+ *
19
+ * @param transport - Transport used to send the request.
20
+ * @param path - Task submission path.
21
+ * @param body - Task-specific request payload.
22
+ * @param options - Server wait, idempotency key, and local cancellation settings.
23
+ * @returns The operation created for the task.
24
+ * @throws {ApiError} If the API rejects the submission or retries are exhausted.
25
+ */
26
+ export declare const submitTask: <TOperation>(transport: Transport, path: string, body: unknown, { idempotencyKey, signal, wait }?: SubmitOptions) => Promise<TOperation>;
27
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/core/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IAChE;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,GAAU,UAAU,EACzC,WAAW,SAAS,EACpB,MAAM,MAAM,EACZ,MAAM,OAAO,EACb,mCAAwD,aAAkB,KACzE,OAAO,CAAC,UAAU,CAYpB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Submit a task request and return its operation resource.
3
+ * Retries network failures and HTTP 429/502/503/504 up to three times with the
4
+ * same key and body. Uses jittered exponential backoff and honors Retry-After.
5
+ *
6
+ * @param transport - Transport used to send the request.
7
+ * @param path - Task submission path.
8
+ * @param body - Task-specific request payload.
9
+ * @param options - Server wait, idempotency key, and local cancellation settings.
10
+ * @returns The operation created for the task.
11
+ * @throws {ApiError} If the API rejects the submission or retries are exhausted.
12
+ */
13
+ export const submitTask = async (transport, path, body, { idempotencyKey = crypto.randomUUID(), signal, wait } = {}) => {
14
+ if (idempotencyKey.trim() === "") {
15
+ throw new Error("Idempotency key must not be empty");
16
+ }
17
+ return await transport.request(path, {
18
+ body,
19
+ headers: { "Idempotency-Key": idempotencyKey },
20
+ method: "POST",
21
+ query: { wait },
22
+ retry: true,
23
+ ...(signal ? { signal } : {}),
24
+ });
25
+ };
26
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/core/tasks.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,SAAoB,EACpB,IAAY,EACZ,IAAa,EACb,EAAE,cAAc,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,KAAoB,EAAE,EACrD,EAAE;IACvB,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,SAAS,CAAC,OAAO,CAAa,IAAI,EAAE;QAC/C,IAAI;QACJ,OAAO,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE;QAC9C,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,EAAE,IAAI,EAAE;QACf,KAAK,EAAE,IAAI;QACX,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,84 @@
1
+ /** Handles a `Request` for API calls and signed uploads; standard `fetch` is compatible. */
2
+ export type Fetch = (request: Request) => Promise<Response>;
3
+ /**
4
+ * Middleware around a request handler. It may alter the request, return a response
5
+ * without calling `next`, call `next` more than once for retries, or inspect the response.
6
+ * Clone requests before sending them if a retry may need to reuse the body.
7
+ */
8
+ export type Middleware = (request: Request, next: Fetch) => Promise<Response>;
9
+ /** Values accepted in a request query. `null` and `undefined` are omitted. */
10
+ export type QueryValue = string | number | boolean | null | undefined;
11
+ /**
12
+ * Options for a JSON API request. Other Fetch settings, including headers and an
13
+ * abort signal, pass through to the request.
14
+ */
15
+ export interface RequestOptions extends Omit<RequestInit, "body"> {
16
+ /** Values URL-encoded into `{name}` placeholders in the path. */
17
+ params?: Record<string, string>;
18
+ /** Query values. `null` and `undefined` entries are omitted. */
19
+ query?: Record<string, QueryValue>;
20
+ /** JSON-serializable request body. */
21
+ body?: unknown;
22
+ /** Retry transient failures up to three times. Requires an idempotent request. */
23
+ retry?: boolean;
24
+ }
25
+ /** Configuration for the fetch transport. */
26
+ export interface TransportOptions {
27
+ /** API origin used to resolve request paths. Trailing slashes are ignored. */
28
+ baseUrl: string | URL;
29
+ /** Fetch implementation for API requests and uploads. Defaults to `globalThis.fetch`. */
30
+ fetch?: Fetch;
31
+ /** Middleware applied to API requests, in outermost-first order. */
32
+ middleware?: Middleware[];
33
+ /** Path values used when a request does not provide its own value. */
34
+ pathParams?: Record<string, string>;
35
+ }
36
+ /** An API request or signed upload returned a non-2xx HTTP status. */
37
+ export declare class ApiError extends Error {
38
+ name: string;
39
+ /** HTTP status and headers. The response body has already been consumed. */
40
+ readonly response: Response;
41
+ /**
42
+ * Parsed JSON or text for API failures; raw text for upload failures.
43
+ * Empty API response bodies are `undefined`.
44
+ */
45
+ readonly body: unknown;
46
+ constructor(response: Response, body: unknown);
47
+ }
48
+ export interface Transport {
49
+ /**
50
+ * Send a request and parse its response as JSON, falling back to text.
51
+ * Empty responses resolve to `undefined`; `T` is not validated at runtime.
52
+ * @throws {ApiError} If the response has a non-2xx status.
53
+ */
54
+ request: <T>(path: string, init?: RequestOptions) => Promise<T>;
55
+ /** Run middleware and fetch, leaving status handling and body parsing to the caller. */
56
+ send: Fetch;
57
+ /**
58
+ * Send a request without the API base URL, middleware, or auth. Use for URLs
59
+ * supplied by the API, such as signed upload URLs.
60
+ */
61
+ fetch: Fetch;
62
+ }
63
+ /**
64
+ * Create a JSON-over-fetch transport for an API surface.
65
+ *
66
+ * Requests use `baseUrl`, substitute path and query values, serialize `body` as JSON,
67
+ * and pass through middleware. Non-2xx responses reject with {@link ApiError}.
68
+ *
69
+ * @param options - Transport origin, fetch implementation, middleware, and bound paths.
70
+ * @returns JSON requests, raw requests through middleware, and the underlying fetch function.
71
+ */
72
+ export declare const createTransport: (options: TransportOptions) => Transport;
73
+ /** Return a request with one header set, preserving its method, body, and other headers. */
74
+ export declare const withHeader: (request: Request, name: string, value: string) => Request;
75
+ /** API key, or a provider resolved immediately before each API request. */
76
+ export type ApiKey = string | (() => string | Promise<string>);
77
+ /**
78
+ * Create middleware that resolves an API key and sends it as `WLT-Api-Key`.
79
+ *
80
+ * @param apiKey - Key or provider resolved before each request.
81
+ * @throws {Error} On a request whose key is empty. Provider failures also propagate before sending.
82
+ */
83
+ export declare const apiKeyAuth: (apiKey: ApiKey) => Middleware;
84
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/core/transport.ts"],"names":[],"mappings":"AAEA,4FAA4F;AAC5F,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE5D;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE9E,8EAA8E;AAC9E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAEtE;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;IAC/D,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,sCAAsC;IACtC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,kFAAkF;IAClF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;IACtB,yFAAyF;IACzF,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,oEAAoE;IACpE,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;IAC1B,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAgBD,sEAAsE;AACtE,qBAAa,QAAS,SAAQ,KAAK;IACxB,IAAI,SAAc;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBAEX,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO;CAM9C;AA6CD,MAAM,WAAW,SAAS;IACxB;;;;OAIG;IACH,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,wFAAwF;IACxF,IAAI,EAAE,KAAK,CAAC;IACZ;;;OAGG;IACH,KAAK,EAAE,KAAK,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,gBAAgB,KAAG,SA8E3D,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,UAAU,GAAI,SAAS,OAAO,EAAE,MAAM,MAAM,EAAE,OAAO,MAAM,KAAG,OAI1E,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAE/D;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GACpB,QAAQ,MAAM,KAAG,UAKjB,CAAC"}
@@ -0,0 +1,171 @@
1
+ import { sleep } from "./sleep.js";
2
+ /** FastAPI puts its reason under `detail`; operation and storage errors use `message`. */
3
+ const errorDetail = (body) => {
4
+ if (typeof body !== "object" || body === null) {
5
+ return undefined;
6
+ }
7
+ for (const key of ["detail", "message"]) {
8
+ const value = Reflect.get(body, key);
9
+ if (typeof value === "string" && value !== "") {
10
+ return value;
11
+ }
12
+ }
13
+ return undefined;
14
+ };
15
+ /** An API request or signed upload returned a non-2xx HTTP status. */
16
+ export class ApiError extends Error {
17
+ name = "ApiError";
18
+ /** HTTP status and headers. The response body has already been consumed. */
19
+ response;
20
+ /**
21
+ * Parsed JSON or text for API failures; raw text for upload failures.
22
+ * Empty API response bodies are `undefined`.
23
+ */
24
+ body;
25
+ constructor(response, body) {
26
+ const where = response.url === "" ? "" : ` for ${response.url}`;
27
+ super(`${response.status} ${errorDetail(body) ?? response.statusText}${where}`);
28
+ this.response = response;
29
+ this.body = body;
30
+ }
31
+ }
32
+ const fillPath = (path, params) => path.replaceAll(/\{(?<name>\w+)\}/gu, (_, name) => {
33
+ const value = params[name];
34
+ if (value === undefined) {
35
+ throw new Error(`Missing path parameter "${name}" for ${path}`);
36
+ }
37
+ return encodeURIComponent(value);
38
+ });
39
+ const compose = (middleware, fetch) => {
40
+ let next = fetch;
41
+ for (const layer of middleware.toReversed()) {
42
+ const inner = next;
43
+ next = async (request) => await layer(request, inner);
44
+ }
45
+ return next;
46
+ };
47
+ const parseBody = async (response) => {
48
+ const text = await response.text();
49
+ if (text === "") {
50
+ return undefined;
51
+ }
52
+ try {
53
+ return JSON.parse(text);
54
+ }
55
+ catch {
56
+ return text;
57
+ }
58
+ };
59
+ const RETRYABLE_STATUS_CODES = new Set([429, 502, 503, 504]);
60
+ const retryDelay = (error, attempt) => {
61
+ const backoff = 1000 * 2 ** attempt * (0.5 + Math.random() / 2);
62
+ const value = error instanceof ApiError ? error.response.headers.get("retry-after")?.trim() : undefined;
63
+ if (!value) {
64
+ return backoff;
65
+ }
66
+ const delay = /^\d+$/u.test(value) ? Number(value) * 1000 : Date.parse(value) - Date.now();
67
+ return Math.max(backoff, Number.isFinite(delay) ? delay : 0);
68
+ };
69
+ /**
70
+ * Create a JSON-over-fetch transport for an API surface.
71
+ *
72
+ * Requests use `baseUrl`, substitute path and query values, serialize `body` as JSON,
73
+ * and pass through middleware. Non-2xx responses reject with {@link ApiError}.
74
+ *
75
+ * @param options - Transport origin, fetch implementation, middleware, and bound paths.
76
+ * @returns JSON requests, raw requests through middleware, and the underlying fetch function.
77
+ */
78
+ export const createTransport = (options) => {
79
+ const fetch = options.fetch ?? (async (request) => await globalThis.fetch(request));
80
+ const send = compose(options.middleware ?? [], fetch);
81
+ const baseUrl = String(options.baseUrl).replace(/\/+$/u, "");
82
+ const boundParams = options.pathParams ?? {};
83
+ return {
84
+ fetch,
85
+ send,
86
+ request: async (path, { body, params, query, retry = false, ...init } = {}) => {
87
+ const url = new URL(baseUrl + fillPath(path, { ...boundParams, ...params }));
88
+ for (const [key, value] of Object.entries(query ?? {})) {
89
+ if (value !== undefined && value !== null) {
90
+ url.searchParams.set(key, String(value));
91
+ }
92
+ }
93
+ const headers = new Headers(init.headers);
94
+ if (body !== undefined) {
95
+ headers.set("content-type", "application/json");
96
+ }
97
+ const request = new Request(url, {
98
+ ...init,
99
+ headers,
100
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
101
+ });
102
+ // Provider and middleware TypeErrors must not be mistaken for network failures.
103
+ let networkError;
104
+ const sendRequest = retry
105
+ ? compose(options.middleware ?? [], async (attempt) => {
106
+ try {
107
+ return await fetch(attempt);
108
+ }
109
+ catch (error) {
110
+ networkError = error;
111
+ throw error;
112
+ }
113
+ })
114
+ : send;
115
+ // oxlint-disable no-await-in-loop -- retries are sequential and preserve the original request
116
+ for (let attempt = 0;; attempt += 1) {
117
+ request.signal.throwIfAborted();
118
+ networkError = undefined;
119
+ try {
120
+ const response = await sendRequest(retry ? request.clone() : request);
121
+ let parsed;
122
+ try {
123
+ parsed = await parseBody(response);
124
+ }
125
+ catch (error) {
126
+ if (!response.ok) {
127
+ throw new ApiError(response, undefined);
128
+ }
129
+ networkError = error;
130
+ throw error;
131
+ }
132
+ if (!response.ok) {
133
+ throw new ApiError(response, parsed);
134
+ }
135
+ // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- JSON boundary
136
+ return parsed;
137
+ }
138
+ catch (error) {
139
+ request.signal.throwIfAborted();
140
+ const transient = error instanceof ApiError
141
+ ? RETRYABLE_STATUS_CODES.has(error.response.status)
142
+ : error instanceof TypeError && error === networkError;
143
+ if (!retry || attempt >= 3 || !transient) {
144
+ throw error;
145
+ }
146
+ await sleep(retryDelay(error, attempt), request.signal);
147
+ }
148
+ }
149
+ // oxlint-enable no-await-in-loop
150
+ },
151
+ };
152
+ };
153
+ /** Return a request with one header set, preserving its method, body, and other headers. */
154
+ export const withHeader = (request, name, value) => {
155
+ const headers = new Headers(request.headers);
156
+ headers.set(name, value);
157
+ return new Request(request, { headers });
158
+ };
159
+ /**
160
+ * Create middleware that resolves an API key and sends it as `WLT-Api-Key`.
161
+ *
162
+ * @param apiKey - Key or provider resolved before each request.
163
+ * @throws {Error} On a request whose key is empty. Provider failures also propagate before sending.
164
+ */
165
+ export const apiKeyAuth = (apiKey) => async (request, next) => {
166
+ const key = typeof apiKey === "function" ? await apiKey() : apiKey;
167
+ if (!key)
168
+ throw new Error("No API key is available for the Developer API request");
169
+ return await next(withHeader(request, "WLT-Api-Key", key));
170
+ };
171
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/core/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AA0CnC,0FAA0F;AAC1F,MAAM,WAAW,GAAG,CAAC,IAAa,EAAsB,EAAE;IACxD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,sEAAsE;AACtE,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,GAAG,UAAU,CAAC;IAC3B,4EAA4E;IACnE,QAAQ,CAAW;IAC5B;;;OAGG;IACM,IAAI,CAAU;IAEvB,YAAY,QAAkB,EAAE,IAAa;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,GAAG,EAAE,CAAC;QAChE,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,UAAU,GAAG,KAAK,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,MAA8B,EAAU,EAAE,CACxE,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,SAAS,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEL,MAAM,OAAO,GAAG,CAAC,UAAwB,EAAE,KAAY,EAAS,EAAE;IAChE,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC;QACnB,IAAI,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,KAAK,EAAE,QAAkB,EAAoB,EAAE;IAC/D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAE7D,MAAM,UAAU,GAAG,CAAC,KAAc,EAAE,OAAe,EAAU,EAAE;IAC7D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GACT,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5F,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3F,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC;AAkBF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAyB,EAAa,EAAE;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7F,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAE7C,OAAO;QACL,KAAK;QACL,IAAI;QACJ,OAAO,EAAE,KAAK,EACZ,IAAY,EACZ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,IAAI,KAAqB,EAAE,EACxD,EAAE;YACd,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;gBACvD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBAC1C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;gBAC/B,GAAG,IAAI;gBACP,OAAO;gBACP,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;aAC9D,CAAC,CAAC;YAEH,gFAAgF;YAChF,IAAI,YAAqB,CAAC;YAC1B,MAAM,WAAW,GAAG,KAAK;gBACvB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;oBAClD,IAAI,CAAC;wBACH,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC9B,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,YAAY,GAAG,KAAK,CAAC;wBACrB,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC,CAAC;gBACJ,CAAC,CAAC,IAAI,CAAC;YAET,8FAA8F;YAC9F,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,IAAI,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBAChC,YAAY,GAAG,SAAS,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBACtE,IAAI,MAAe,CAAC;oBACpB,IAAI,CAAC;wBACH,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;oBACrC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;4BACjB,MAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;wBAC1C,CAAC;wBACD,YAAY,GAAG,KAAK,CAAC;wBACrB,MAAM,KAAK,CAAC;oBACd,CAAC;oBACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;wBACjB,MAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;oBACvC,CAAC;oBACD,gFAAgF;oBAChF,OAAO,MAAW,CAAC;gBACrB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;oBAChC,MAAM,SAAS,GACb,KAAK,YAAY,QAAQ;wBACvB,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;wBACnD,CAAC,CAAC,KAAK,YAAY,SAAS,IAAI,KAAK,KAAK,YAAY,CAAC;oBAC3D,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACzC,MAAM,KAAK,CAAC;oBACd,CAAC;oBACD,MAAM,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YACD,iCAAiC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,IAAY,EAAE,KAAa,EAAW,EAAE;IACnF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3C,CAAC,CAAC;AAKF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GACrB,CAAC,MAAc,EAAc,EAAE,CAC/B,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IACtB,MAAM,GAAG,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IACnE,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACnF,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC"}