@domino-sdk/relay 1.0.0-next.10 → 1.0.0-next.13

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 (46) hide show
  1. package/dist/authoring.d.ts +39 -36
  2. package/dist/authoring.js +10 -3
  3. package/dist/avatar.d.ts +2 -2
  4. package/dist/browser.d.ts +153 -129
  5. package/dist/browser.js +6 -6
  6. package/dist/{pages-D3titw5B.d.ts → catalog-C85V1NgW.d.ts} +178 -216
  7. package/dist/{chunk-ZWY3R6B3.js → chunk-6A2V4L3T.js} +4 -0
  8. package/dist/{chunk-YYD4QUBO.js → chunk-CRNQP7NV.js} +550 -470
  9. package/dist/{chunk-X2F2RAR3.js → chunk-EZWNGI5B.js} +23 -4
  10. package/dist/{chunk-7Q4BGGT6.js → chunk-FXYJ4OMX.js} +1 -1
  11. package/dist/{chunk-4LBUTHD6.js → chunk-II7DRZSL.js} +1 -1
  12. package/dist/chunk-KS33GOUL.js +83 -0
  13. package/dist/{chunk-QR7ZA2BJ.js → chunk-M64XHC42.js} +48 -4
  14. package/dist/chunk-MNQI35OG.js +100 -0
  15. package/dist/{chunk-PHU5VDLR.js → chunk-OA2KMQVZ.js} +41 -26
  16. package/dist/{chunk-P6FK43GG.js → chunk-WQ24ILGO.js} +140 -41
  17. package/dist/{client-CT4-S5vc.d.ts → client-Bf9PNUIi.d.ts} +61 -80
  18. package/dist/deployments-CNCP0JnD.d.ts +4250 -0
  19. package/dist/identity-integration-CBR8l3ju.d.ts +37 -0
  20. package/dist/images-BG4pdO4y.d.ts +234 -0
  21. package/dist/index.d.ts +10 -8
  22. package/dist/index.js +8 -5
  23. package/dist/{integrations-Ba5TtqTv.d.ts → integrations-EjQzIApL.d.ts} +1 -88
  24. package/dist/internal.d.ts +7 -38
  25. package/dist/internal.js +15 -88
  26. package/dist/observations-CQ6IcNuQ.d.ts +90 -0
  27. package/dist/pages-KYK1L60W.d.ts +152 -0
  28. package/dist/portal-proxy.js +5 -4
  29. package/dist/{profiles-DDMFBRKe.d.ts → profiles-BtOXMGcC.d.ts} +1 -1
  30. package/dist/react/index.d.ts +150 -31
  31. package/dist/react/index.js +149 -11
  32. package/dist/{submission-input-0OOGaq8c.d.ts → referrals-KQfP4pBf.d.ts} +189 -182
  33. package/dist/request-error-VnTiMXc3.d.ts +52 -0
  34. package/dist/{schema-Di3aLSiK.d.ts → schema-BF_TQsmT.d.ts} +338 -47
  35. package/dist/schema.d.ts +14 -4126
  36. package/dist/schema.js +46 -40
  37. package/dist/server/index.d.ts +19445 -0
  38. package/dist/server/index.js +1884 -0
  39. package/dist/{streaks-CwGReWGt.d.ts → streaks-CWyq8Px5.d.ts} +2 -4
  40. package/dist/submission-input-CccwAl5Z.d.ts +83 -0
  41. package/dist/{images-BTgk6OmC.d.ts → trackers-W7nRdRr7.d.ts} +1 -232
  42. package/dist/vite.d.ts +1 -1
  43. package/dist/vite.js +1 -0
  44. package/dist/{wallet-BGOfFkG9.d.ts → wallet-BtiG0Xhr.d.ts} +1 -1
  45. package/package.json +5 -1
  46. package/dist/point-ledgers-iS00Z_v0.d.ts +0 -37
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createRelayClient
3
- } from "./chunk-X2F2RAR3.js";
3
+ } from "./chunk-EZWNGI5B.js";
4
4
  import {
5
5
  RelayErrorCode,
6
6
  clientError,
7
7
  cosmosChain
8
- } from "./chunk-PHU5VDLR.js";
8
+ } from "./chunk-OA2KMQVZ.js";
9
9
 
10
10
  // src/base58.ts
11
11
  var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
@@ -492,59 +492,158 @@ function createBrowserRelayClient(options) {
492
492
  submissionStore: options.submissionStore ?? browserSubmissionStore()
493
493
  });
494
494
  }
495
+ var DATABASE = "domino-relay-submissions";
496
+ var STORE = "submissions";
497
+ var BLOCKED_GRACE_MS = 1e3;
498
+ function errorName(error) {
499
+ return typeof error === "object" && error !== null && "name" in error ? String(error.name) : void 0;
500
+ }
501
+ function storageError(error, action) {
502
+ const name = errorName(error);
503
+ if (name === "QuotaExceededError") {
504
+ return clientError(
505
+ "Browser storage is full, so submission progress could not be saved. Free some space, then resume the saved submission.",
506
+ RelayErrorCode.SubmissionStorageQuota,
507
+ { cause: error }
508
+ );
509
+ }
510
+ if (name === "VersionError") {
511
+ return clientError(
512
+ "Another tab upgraded submission storage. Reload this page to continue.",
513
+ RelayErrorCode.SubmissionStorage,
514
+ { cause: error }
515
+ );
516
+ }
517
+ return clientError(
518
+ action === "open" ? "Could not open submission storage. Try again, and check that this browser allows site storage (private browsing can turn it off)." : action === "read" ? "Could not read the saved submission. Do not start another claim; try again when browser storage is available." : "Could not save submission progress. Resume the saved submission when browser storage is available.",
519
+ RelayErrorCode.SubmissionStorage,
520
+ { cause: error }
521
+ );
522
+ }
495
523
  function browserSubmissionStore() {
496
- let database;
497
- function open() {
524
+ let opening;
525
+ function release(db) {
526
+ db.close();
527
+ if (opening?.db === db) {
528
+ opening = void 0;
529
+ }
530
+ }
531
+ function start() {
532
+ let unblock;
533
+ const current = {
534
+ blocked: new Promise((resolve) => unblock = resolve),
535
+ done: new Promise((resolve, reject) => {
536
+ let request;
537
+ try {
538
+ request = indexedDB.open(DATABASE, 1);
539
+ } catch (error) {
540
+ reject(storageError(error, "open"));
541
+ return;
542
+ }
543
+ request.onupgradeneeded = () => {
544
+ if (!request.result.objectStoreNames.contains(STORE)) {
545
+ request.result.createObjectStore(STORE);
546
+ }
547
+ };
548
+ request.onblocked = unblock;
549
+ request.onerror = () => reject(storageError(request.error, "open"));
550
+ request.onsuccess = () => {
551
+ const db = request.result;
552
+ db.onversionchange = () => release(db);
553
+ db.onclose = () => release(db);
554
+ current.db = db;
555
+ resolve(db);
556
+ };
557
+ })
558
+ };
559
+ current.done.catch(() => {
560
+ if (opening === current) {
561
+ opening = void 0;
562
+ }
563
+ });
564
+ return current;
565
+ }
566
+ async function connect() {
498
567
  if (!globalThis.indexedDB || !globalThis.navigator?.locks) {
499
568
  throw clientError(
500
569
  "This browser cannot safely save submissions. Use a browser with IndexedDB and Web Locks enabled.",
501
570
  RelayErrorCode.SubmissionStorage
502
571
  );
503
572
  }
504
- return database ??= new Promise((resolve, reject) => {
505
- const request = indexedDB.open("domino-relay-submissions", 1);
506
- request.onupgradeneeded = () => request.result.createObjectStore("submissions");
507
- request.onerror = () => reject(
508
- clientError(
509
- "Could not open submission storage",
510
- RelayErrorCode.SubmissionStorage
511
- )
512
- );
513
- request.onsuccess = () => resolve(request.result);
514
- request.onblocked = () => reject(
515
- clientError(
516
- "Close other Relay tabs and try again",
517
- RelayErrorCode.SubmissionStorage
573
+ if (opening?.db) {
574
+ return opening.db;
575
+ }
576
+ const attempt = opening ??= start();
577
+ let timer;
578
+ try {
579
+ return await Promise.race([
580
+ attempt.done,
581
+ attempt.blocked.then(
582
+ () => new Promise((_, reject) => {
583
+ timer = setTimeout(
584
+ () => reject(
585
+ clientError(
586
+ "Submission storage is blocked by another Relay tab. Close or reload other Relay tabs, then try again.",
587
+ RelayErrorCode.SubmissionStorage
588
+ )
589
+ ),
590
+ BLOCKED_GRACE_MS
591
+ );
592
+ })
518
593
  )
519
- );
520
- });
594
+ ]);
595
+ } finally {
596
+ clearTimeout(timer);
597
+ }
521
598
  }
522
- async function transact(key, value) {
523
- const db = await open();
524
- return new Promise((resolve, reject) => {
525
- const transaction = db.transaction(
526
- "submissions",
527
- value === void 0 ? "readonly" : "readwrite",
528
- { durability: "strict" }
529
- );
530
- const store = transaction.objectStore("submissions");
531
- const request = value === void 0 ? store.get(key) : store.put(value, key);
532
- transaction.oncomplete = () => resolve(request.result);
533
- transaction.onerror = transaction.onabort = () => reject(
534
- clientError(
535
- "Could not save submission progress. Resume the saved submission when browser storage is available.",
536
- RelayErrorCode.SubmissionStorage
537
- )
538
- );
539
- });
599
+ async function transact(key, action, value) {
600
+ for (let retry = true; ; retry = false) {
601
+ const db = await connect();
602
+ let transaction;
603
+ try {
604
+ transaction = db.transaction(
605
+ STORE,
606
+ action === "read" ? "readonly" : "readwrite",
607
+ { durability: "strict" }
608
+ );
609
+ } catch (error) {
610
+ release(db);
611
+ if (retry && errorName(error) === "InvalidStateError") {
612
+ continue;
613
+ }
614
+ throw storageError(error, action);
615
+ }
616
+ return new Promise((resolve, reject) => {
617
+ let request;
618
+ function fail(error) {
619
+ if (errorName(error) !== "QuotaExceededError") {
620
+ release(db);
621
+ }
622
+ reject(storageError(error, action));
623
+ }
624
+ try {
625
+ const objects = transaction.objectStore(STORE);
626
+ request = action === "read" ? objects.get(key) : objects.put(value, key);
627
+ } catch (error) {
628
+ try {
629
+ transaction.abort();
630
+ } catch {
631
+ }
632
+ fail(error);
633
+ return;
634
+ }
635
+ transaction.oncomplete = () => resolve(request.result);
636
+ transaction.onabort = () => fail(transaction.error ?? request.error);
637
+ });
638
+ }
540
639
  }
541
640
  return {
542
- read: (key) => transact(key),
641
+ read: (key) => transact(key, "read"),
543
642
  write: async (key, value) => {
544
- await transact(key, value);
643
+ await transact(key, "write", value);
545
644
  },
546
645
  exclusive: async (key, task) => {
547
- await open();
646
+ await connect();
548
647
  return navigator.locks.request(key, task);
549
648
  }
550
649
  };
@@ -1,60 +1,12 @@
1
- import { V as ValueEvidence, i as referralAcceptSchema, d as LeaderboardQuery, a as AuthProvider, j as engagementPageQuerySchema, k as contentQualificationQuerySchema, m as contentAdmissionQuerySchema, n as contentEnrollmentInputSchema, o as contentReleaseInputSchema } from './submission-input-0OOGaq8c.js';
2
- import { b as QuizEvidence, A as Attempt, M as MemberProgress, s as submitSchema, g as contentPerformanceQuerySchema } from './schema-Di3aLSiK.js';
3
- import { c as ParticipantSession, e as QuestView, a as PageQuery, q as questExperienceSchema, f as exchangeSchema } from './pages-D3titw5B.js';
1
+ import { h as QuestView, J as questExperienceSchema, e as PointHistoryQuery, c as PointEntryKind } from './catalog-C85V1NgW.js';
2
+ import { V as ValueEvidence, a as AuthProvider } from './submission-input-CccwAl5Z.js';
3
+ import { R as RequestError, a as RequestErrorDetails, b as RequestErrorKind } from './request-error-VnTiMXc3.js';
4
+ import { b as QuizEvidence, A as Attempt, M as MemberProgress, ao as submitSchema, x as contentPerformanceQuerySchema } from './schema-BF_TQsmT.js';
4
5
  import { z } from 'zod';
5
- import { p as profileUpdateSchema, c as ProfileCompletionQuery } from './profiles-DDMFBRKe.js';
6
- import { w as walletAddressInputSchema, l as walletSignatureSchema, L as LinkedWallet, f as WalletSigner } from './wallet-BGOfFkG9.js';
7
-
8
- /**
9
- * The request-error core every Domino client error extends: the participant `RelayError` and the
10
- * management client's error share these fields, so one handler serves both.
11
- *
12
- * `kind` says what happened:
13
- *
14
- * - `http`: the server answered with an error status.
15
- * - `network`: the transport failed, including a response body cut off after its headers.
16
- * - `timeout`: the client's deadline passed.
17
- * - `aborted`: the caller cancelled the request.
18
- * - `invalid-response`: a 2xx answer that is not JSON, or not the shape this SDK version expects.
19
- * - `client`: the client refused the call without sending it, such as for invalid input.
20
- */
21
- type RequestErrorKind = "http" | "network" | "timeout" | "aborted" | "invalid-response" | "client";
22
- /**
23
- * What to do when `uncertain` is true. `replay`: sending the call again with the same
24
- * `operationId` is safe, because the server applies it at most once. `reconcile`: read the state
25
- * first, since repeating the call could apply it twice.
26
- */
27
- type RequestRecovery = "replay" | "reconcile";
28
- type RequestErrorDetails = {
29
- kind: RequestErrorKind;
30
- /** True only when a write may have been applied. Reads are never uncertain. */
31
- uncertain?: boolean;
32
- /** The HTTP status, whenever response headers arrived. Never invented. */
33
- status?: number;
34
- /** A machine-readable code: open, so a newer server's codes are kept. */
35
- code?: string;
36
- /** The call's idempotency or action ID, to replay it with. */
37
- operationId?: string;
38
- cause?: unknown;
39
- };
40
- declare const requestErrorBrand: unique symbol;
41
- /**
42
- * Whether `value` is a `RequestError` from any copy of the SDK. Prefer it to `instanceof`, which
43
- * fails when an app bundles two copies of the package.
44
- */
45
- declare function isRequestError(value: unknown): value is RequestError;
46
- declare class RequestError extends Error {
47
- readonly name: string;
48
- readonly [requestErrorBrand] = true;
49
- readonly kind: RequestErrorKind;
50
- readonly uncertain: boolean;
51
- readonly status: number | undefined;
52
- readonly code: string | undefined;
53
- readonly operationId: string | undefined;
54
- /** `replay` when there is an `operationId`, else `reconcile`; only when `uncertain`. */
55
- readonly recovery: RequestRecovery | undefined;
56
- constructor(message: string, details: RequestErrorDetails);
57
- }
6
+ import { c as ParticipantSession, a as PageQuery, f as exchangeSchema } from './pages-KYK1L60W.js';
7
+ import { a6 as referralAcceptSchema, c as LeaderboardQuery, G as engagementPageQuerySchema, s as contentQualificationQuerySchema, i as contentAdmissionQuerySchema, k as contentEnrollmentInputSchema, u as contentReleaseInputSchema } from './referrals-KQfP4pBf.js';
8
+ import { F as profileUpdateSchema, c as ProfileCompletionQuery } from './profiles-BtOXMGcC.js';
9
+ import { x as walletAddressInputSchema, M as walletSignatureSchema, L as LinkedWallet, f as WalletSigner } from './wallet-BtiG0Xhr.js';
58
10
 
59
11
  /** What happened, as in every Domino client error (see `RequestError`). */
60
12
  type RelayErrorKind = RequestErrorKind;
@@ -82,8 +34,13 @@ declare const RelayErrorCode: {
82
34
  readonly NotFound: "not-found";
83
35
  /** The quest has no failed attempt the member can retry. */
84
36
  readonly RetryUnavailable: "retry-unavailable";
85
- /** Durable submission storage is missing, blocked or unreadable. */
37
+ /**
38
+ * Durable submission storage is missing, blocked or unreadable. Nothing was lost: call the
39
+ * handle's `status()` or `resume()` again once storage is available.
40
+ */
86
41
  readonly SubmissionStorage: "submission-storage";
42
+ /** Browser storage is full, so submission progress was not saved. Free space, then resume. */
43
+ readonly SubmissionStorageQuota: "submission-storage-quota";
87
44
  /** The saved submission is in a state that does not allow this action. */
88
45
  readonly SubmissionConflict: "submission-conflict";
89
46
  /** The quest changed since the member saw it; review it before submitting again. */
@@ -94,6 +51,10 @@ declare const RelayErrorCode: {
94
51
  readonly InvalidSubmission: "invalid-submission";
95
52
  /** A page cursor Relay cannot read; start again from the first page. */
96
53
  readonly InvalidCursor: "invalid-cursor";
54
+ /** No point ledger in the project has the key or ID the call named. */
55
+ readonly PointLedgerNotFound: "point-ledger-not-found";
56
+ /** The member has not joined this project, so it holds no points here. */
57
+ readonly NotJoined: "not-joined";
97
58
  /** A wallet signer failed or the member refused to sign; `cause` is the wallet's own error. */
98
59
  readonly WalletSigner: "wallet-signer";
99
60
  };
@@ -517,7 +478,6 @@ declare function createRelayClient(options: RelayClientOptions): {
517
478
  } | {
518
479
  kind: "calendar";
519
480
  period: "day" | "week" | "month";
520
- timeZone: string;
521
481
  };
522
482
  kind: "earned";
523
483
  quests?: string[] | undefined;
@@ -535,7 +495,6 @@ declare function createRelayClient(options: RelayClientOptions): {
535
495
  } | {
536
496
  kind: "calendar";
537
497
  period: "day" | "week" | "month";
538
- timeZone: string;
539
498
  };
540
499
  };
541
500
  access: "participants" | "public";
@@ -933,7 +892,6 @@ declare function createRelayClient(options: RelayClientOptions): {
933
892
  completion: {
934
893
  kind: "streak";
935
894
  days: number;
936
- timeZone: string;
937
895
  } | {
938
896
  kind: "once";
939
897
  } | {
@@ -1249,7 +1207,6 @@ declare function createRelayClient(options: RelayClientOptions): {
1249
1207
  completion: {
1250
1208
  kind: "streak";
1251
1209
  days: number;
1252
- timeZone: string;
1253
1210
  } | {
1254
1211
  kind: "once";
1255
1212
  } | {
@@ -1511,7 +1468,6 @@ declare function createRelayClient(options: RelayClientOptions): {
1511
1468
  completion: {
1512
1469
  kind: "streak";
1513
1470
  days: number;
1514
- timeZone: string;
1515
1471
  } | {
1516
1472
  kind: "once";
1517
1473
  } | {
@@ -1776,7 +1732,6 @@ declare function createRelayClient(options: RelayClientOptions): {
1776
1732
  completion: {
1777
1733
  kind: "streak";
1778
1734
  days: number;
1779
- timeZone: string;
1780
1735
  } | {
1781
1736
  kind: "once";
1782
1737
  } | {
@@ -2276,7 +2231,6 @@ declare function createRelayClient(options: RelayClientOptions): {
2276
2231
  completion: {
2277
2232
  kind: "streak";
2278
2233
  days: number;
2279
- timeZone: string;
2280
2234
  } | {
2281
2235
  kind: "once";
2282
2236
  } | {
@@ -2470,6 +2424,33 @@ declare function createRelayClient(options: RelayClientOptions): {
2470
2424
  deliveredAt: number | null;
2471
2425
  }[];
2472
2426
  }>;
2427
+ /**
2428
+ * `{ items }`: the member's balance in each of the project's point ledgers, in the project's
2429
+ * ledger order, zero in a ledger they have no entries in.
2430
+ */
2431
+ balances: (requestOptions?: RelayRequestOptions) => Promise<{
2432
+ items: {
2433
+ ledger: {
2434
+ id: string;
2435
+ key: string | null;
2436
+ name: string;
2437
+ };
2438
+ balance: number;
2439
+ available: number;
2440
+ }[];
2441
+ }>;
2442
+ /** The member's own entries in one ledger, by key or ID, most recently recorded first. */
2443
+ pointHistory: (query: PointHistoryQuery, requestOptions?: RelayRequestOptions) => Promise<{
2444
+ items: {
2445
+ id: string;
2446
+ amount: number;
2447
+ kind: PointEntryKind;
2448
+ at: number;
2449
+ quest: string | null;
2450
+ reverses: string | null;
2451
+ }[];
2452
+ nextCursor: string | null;
2453
+ }>;
2473
2454
  /** Claims a quest for the signed-in member. Quest controllers (`quests.open`) call this. */
2474
2455
  claim: (value: Omit<z.input<typeof submitSchema>, "member">, requestOptions?: RelayRequestOptions) => Promise<{
2475
2456
  id: string;
@@ -2548,11 +2529,11 @@ declare function createRelayClient(options: RelayClientOptions): {
2548
2529
  metrics: ("likes" | "replies" | "reposts" | "quotes" | "views" | "bookmarks")[];
2549
2530
  baseline: "historical";
2550
2531
  maxAgeMs: number;
2551
- budget: {
2552
- projectDaily?: number | undefined;
2553
- memberDaily?: number | undefined;
2554
- projectLifetime?: number | undefined;
2555
- };
2532
+ budgets: {
2533
+ scope: "member" | "project";
2534
+ period: "lifetime" | "day" | "week" | "month";
2535
+ limit: number;
2536
+ }[];
2556
2537
  };
2557
2538
  publishedAt: number;
2558
2539
  };
@@ -2594,11 +2575,11 @@ declare function createRelayClient(options: RelayClientOptions): {
2594
2575
  metrics: ("likes" | "replies" | "reposts" | "quotes" | "views" | "bookmarks")[];
2595
2576
  baseline: "historical";
2596
2577
  maxAgeMs: number;
2597
- budget: {
2598
- projectDaily?: number | undefined;
2599
- memberDaily?: number | undefined;
2600
- projectLifetime?: number | undefined;
2601
- };
2578
+ budgets: {
2579
+ scope: "member" | "project";
2580
+ period: "lifetime" | "day" | "week" | "month";
2581
+ limit: number;
2582
+ }[];
2602
2583
  };
2603
2584
  publishedAt: number;
2604
2585
  } | null;
@@ -2611,11 +2592,11 @@ declare function createRelayClient(options: RelayClientOptions): {
2611
2592
  metrics: ("likes" | "replies" | "reposts" | "quotes" | "views" | "bookmarks")[];
2612
2593
  baseline: "historical";
2613
2594
  maxAgeMs: number;
2614
- budget: {
2615
- projectDaily?: number | undefined;
2616
- memberDaily?: number | undefined;
2617
- projectLifetime?: number | undefined;
2618
- };
2595
+ budgets: {
2596
+ scope: "member" | "project";
2597
+ period: "lifetime" | "day" | "week" | "month";
2598
+ limit: number;
2599
+ }[];
2619
2600
  };
2620
2601
  publishedAt: number;
2621
2602
  };
@@ -2713,4 +2694,4 @@ declare function createRelayClient(options: RelayClientOptions): {
2713
2694
  /** The participant client `createRelayClient` returns. */
2714
2695
  type RelayClient = ReturnType<typeof createRelayClient>;
2715
2696
 
2716
- export { type ClaimSubmission as C, type KnownRelayErrorCode as K, type PhotoSubmission as P, type QuestActionResult as Q, type RelayClient as R, type SubmissionDraft as S, type ValueSubmission as V, type ProgressObservation as a, type ProgressObserver as b, type QuestController as c, QuestUpdatedError as d, type QuizSubmission as e, type RelayClientOptions as f, RelayError as g, RelayErrorCode as h, type RelayErrorDetails as i, type RelayErrorKind as j, type RelayRequestOptions as k, RequestError as l, type RequestErrorDetails as m, type RequestErrorKind as n, type RequestRecovery as o, type SubmissionStatus as p, type SubmissionStore as q, createRelayClient as r, isRelayError as s, isRequestError as t };
2697
+ export { type ClaimSubmission as C, type KnownRelayErrorCode as K, type PhotoSubmission as P, type QuestActionResult as Q, type RelayClient as R, type SubmissionDraft as S, type ValueSubmission as V, type ProgressObservation as a, type ProgressObserver as b, type QuestController as c, QuestUpdatedError as d, type QuizSubmission as e, type RelayClientOptions as f, RelayError as g, RelayErrorCode as h, type RelayErrorDetails as i, type RelayErrorKind as j, type RelayRequestOptions as k, type SubmissionStatus as l, type SubmissionStore as m, createRelayClient as n, isRelayError as o };