@domino-sdk/relay 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.
@@ -0,0 +1,2274 @@
1
+ import { SubmitInput, ReviewListOptions, MemberListOptions, ReleaseInput, beginHandoverSchema } from './schema.js';
2
+ import { SubmissionStore, createRelayClient, QuestView, QuestController, ProgressObservation, questExperienceSchema, ProgressObserver, ExchangeInput, PhotoSubmission, QuizSubmission, ClaimSubmission } from './index.js';
3
+ import { w as walletChallengeInputSchema, a as walletProofSchema } from './settings-BEbCiuhH.js';
4
+ import * as zod from 'zod';
5
+
6
+ /** Browser client with durable submission recovery; safe to construct during SSR. */
7
+ declare function createBrowserRelayClient(options: Parameters<typeof createRelayClient>[0]): {
8
+ quests: {
9
+ get: (id: string) => Promise<{
10
+ quest: string;
11
+ title: string;
12
+ presentation: {
13
+ quiz?: {
14
+ id: string;
15
+ prompt: string;
16
+ choices: {
17
+ id: string;
18
+ label: string;
19
+ }[];
20
+ }[] | undefined;
21
+ instructions?: string | undefined;
22
+ video?: {
23
+ url: string;
24
+ poster?: string | undefined;
25
+ captions?: {
26
+ url: string;
27
+ language: string;
28
+ label: string;
29
+ } | undefined;
30
+ } | undefined;
31
+ };
32
+ trigger: {
33
+ kind: "manual";
34
+ input: "quiz" | "photo" | "none";
35
+ actor?: "member" | "staff" | undefined;
36
+ } | {
37
+ kind: "automatic";
38
+ };
39
+ availability: {
40
+ kind: "available";
41
+ input: "quiz" | "photo" | "none";
42
+ } | {
43
+ kind: "completed";
44
+ } | {
45
+ kind: "locked";
46
+ missing: {
47
+ quest: string;
48
+ title: string;
49
+ }[];
50
+ } | {
51
+ kind: "staff-required";
52
+ } | {
53
+ kind: "automatic";
54
+ } | {
55
+ kind: "checking";
56
+ attempt: string;
57
+ } | {
58
+ kind: "needs-review";
59
+ attempt: string;
60
+ } | {
61
+ kind: "retryable";
62
+ attempt: string;
63
+ };
64
+ completed: boolean;
65
+ missing: {
66
+ quest: string;
67
+ title: string;
68
+ }[];
69
+ attempt: {
70
+ id: string;
71
+ release: string;
72
+ quest: string;
73
+ member: string;
74
+ evidence: string | null;
75
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
76
+ reason: string | null;
77
+ retries: number;
78
+ generation: number;
79
+ completion: string | null;
80
+ reviewRewards: ({
81
+ kind: "tier";
82
+ reward: {
83
+ id: string;
84
+ title: string;
85
+ tiers: {
86
+ id: string;
87
+ title: string;
88
+ }[];
89
+ inventory: {
90
+ kind: "untracked";
91
+ };
92
+ fulfillment: {
93
+ kind: "staff-handover";
94
+ };
95
+ };
96
+ tier: string;
97
+ } | {
98
+ kind: "points";
99
+ balance: string;
100
+ amount: number;
101
+ })[] | null;
102
+ createdAt: number;
103
+ input?: {
104
+ kind: "quiz";
105
+ answers: {
106
+ [k: string]: string;
107
+ };
108
+ release?: string | undefined;
109
+ } | undefined;
110
+ } | null;
111
+ release: string;
112
+ interaction: "staff" | "quiz" | "photo" | "automatic" | "claim";
113
+ lifecycle: "active" | "paused" | "archived";
114
+ rewards: {
115
+ label: string;
116
+ }[];
117
+ }>;
118
+ retry: (view: QuestView) => Promise<{
119
+ id: string;
120
+ release: string;
121
+ quest: string;
122
+ member: string;
123
+ evidence: string | null;
124
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
125
+ reason: string | null;
126
+ retries: number;
127
+ generation: number;
128
+ completion: string | null;
129
+ reviewRewards: ({
130
+ kind: "tier";
131
+ reward: {
132
+ id: string;
133
+ title: string;
134
+ tiers: {
135
+ id: string;
136
+ title: string;
137
+ }[];
138
+ inventory: {
139
+ kind: "untracked";
140
+ };
141
+ fulfillment: {
142
+ kind: "staff-handover";
143
+ };
144
+ };
145
+ tier: string;
146
+ } | {
147
+ kind: "points";
148
+ balance: string;
149
+ amount: number;
150
+ })[] | null;
151
+ createdAt: number;
152
+ input?: {
153
+ kind: "quiz";
154
+ answers: {
155
+ [k: string]: string;
156
+ };
157
+ release?: string | undefined;
158
+ } | undefined;
159
+ }>;
160
+ experience: () => Promise<{
161
+ member: string;
162
+ quests: {
163
+ quest: string;
164
+ title: string;
165
+ presentation: {
166
+ quiz?: {
167
+ id: string;
168
+ prompt: string;
169
+ choices: {
170
+ id: string;
171
+ label: string;
172
+ }[];
173
+ }[] | undefined;
174
+ instructions?: string | undefined;
175
+ video?: {
176
+ url: string;
177
+ poster?: string | undefined;
178
+ captions?: {
179
+ url: string;
180
+ language: string;
181
+ label: string;
182
+ } | undefined;
183
+ } | undefined;
184
+ };
185
+ trigger: {
186
+ kind: "manual";
187
+ input: "quiz" | "photo" | "none";
188
+ actor?: "member" | "staff" | undefined;
189
+ } | {
190
+ kind: "automatic";
191
+ };
192
+ availability: {
193
+ kind: "available";
194
+ input: "quiz" | "photo" | "none";
195
+ } | {
196
+ kind: "completed";
197
+ } | {
198
+ kind: "locked";
199
+ missing: {
200
+ quest: string;
201
+ title: string;
202
+ }[];
203
+ } | {
204
+ kind: "staff-required";
205
+ } | {
206
+ kind: "automatic";
207
+ } | {
208
+ kind: "checking";
209
+ attempt: string;
210
+ } | {
211
+ kind: "needs-review";
212
+ attempt: string;
213
+ } | {
214
+ kind: "retryable";
215
+ attempt: string;
216
+ };
217
+ completed: boolean;
218
+ missing: {
219
+ quest: string;
220
+ title: string;
221
+ }[];
222
+ attempt: {
223
+ id: string;
224
+ release: string;
225
+ quest: string;
226
+ member: string;
227
+ evidence: string | null;
228
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
229
+ reason: string | null;
230
+ retries: number;
231
+ generation: number;
232
+ completion: string | null;
233
+ reviewRewards: ({
234
+ kind: "tier";
235
+ reward: {
236
+ id: string;
237
+ title: string;
238
+ tiers: {
239
+ id: string;
240
+ title: string;
241
+ }[];
242
+ inventory: {
243
+ kind: "untracked";
244
+ };
245
+ fulfillment: {
246
+ kind: "staff-handover";
247
+ };
248
+ };
249
+ tier: string;
250
+ } | {
251
+ kind: "points";
252
+ balance: string;
253
+ amount: number;
254
+ })[] | null;
255
+ createdAt: number;
256
+ input?: {
257
+ kind: "quiz";
258
+ answers: {
259
+ [k: string]: string;
260
+ };
261
+ release?: string | undefined;
262
+ } | undefined;
263
+ } | null;
264
+ release: string;
265
+ interaction: "staff" | "quiz" | "photo" | "automatic" | "claim";
266
+ lifecycle: "active" | "paused" | "archived";
267
+ rewards: {
268
+ label: string;
269
+ }[];
270
+ }[];
271
+ collections: {
272
+ id: string;
273
+ title: string;
274
+ quests: {
275
+ quest: string;
276
+ title: string;
277
+ presentation: {
278
+ quiz?: {
279
+ id: string;
280
+ prompt: string;
281
+ choices: {
282
+ id: string;
283
+ label: string;
284
+ }[];
285
+ }[] | undefined;
286
+ instructions?: string | undefined;
287
+ video?: {
288
+ url: string;
289
+ poster?: string | undefined;
290
+ captions?: {
291
+ url: string;
292
+ language: string;
293
+ label: string;
294
+ } | undefined;
295
+ } | undefined;
296
+ };
297
+ trigger: {
298
+ kind: "manual";
299
+ input: "quiz" | "photo" | "none";
300
+ actor?: "member" | "staff" | undefined;
301
+ } | {
302
+ kind: "automatic";
303
+ };
304
+ availability: {
305
+ kind: "available";
306
+ input: "quiz" | "photo" | "none";
307
+ } | {
308
+ kind: "completed";
309
+ } | {
310
+ kind: "locked";
311
+ missing: {
312
+ quest: string;
313
+ title: string;
314
+ }[];
315
+ } | {
316
+ kind: "staff-required";
317
+ } | {
318
+ kind: "automatic";
319
+ } | {
320
+ kind: "checking";
321
+ attempt: string;
322
+ } | {
323
+ kind: "needs-review";
324
+ attempt: string;
325
+ } | {
326
+ kind: "retryable";
327
+ attempt: string;
328
+ };
329
+ completed: boolean;
330
+ missing: {
331
+ quest: string;
332
+ title: string;
333
+ }[];
334
+ attempt: {
335
+ id: string;
336
+ release: string;
337
+ quest: string;
338
+ member: string;
339
+ evidence: string | null;
340
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
341
+ reason: string | null;
342
+ retries: number;
343
+ generation: number;
344
+ completion: string | null;
345
+ reviewRewards: ({
346
+ kind: "tier";
347
+ reward: {
348
+ id: string;
349
+ title: string;
350
+ tiers: {
351
+ id: string;
352
+ title: string;
353
+ }[];
354
+ inventory: {
355
+ kind: "untracked";
356
+ };
357
+ fulfillment: {
358
+ kind: "staff-handover";
359
+ };
360
+ };
361
+ tier: string;
362
+ } | {
363
+ kind: "points";
364
+ balance: string;
365
+ amount: number;
366
+ })[] | null;
367
+ createdAt: number;
368
+ input?: {
369
+ kind: "quiz";
370
+ answers: {
371
+ [k: string]: string;
372
+ };
373
+ release?: string | undefined;
374
+ } | undefined;
375
+ } | null;
376
+ release: string;
377
+ interaction: "staff" | "quiz" | "photo" | "automatic" | "claim";
378
+ lifecycle: "active" | "paused" | "archived";
379
+ rewards: {
380
+ label: string;
381
+ }[];
382
+ }[];
383
+ }[];
384
+ }>;
385
+ collection: (id: string) => Promise<{
386
+ id: string;
387
+ title: string;
388
+ quests: {
389
+ quest: string;
390
+ title: string;
391
+ presentation: {
392
+ quiz?: {
393
+ id: string;
394
+ prompt: string;
395
+ choices: {
396
+ id: string;
397
+ label: string;
398
+ }[];
399
+ }[] | undefined;
400
+ instructions?: string | undefined;
401
+ video?: {
402
+ url: string;
403
+ poster?: string | undefined;
404
+ captions?: {
405
+ url: string;
406
+ language: string;
407
+ label: string;
408
+ } | undefined;
409
+ } | undefined;
410
+ };
411
+ trigger: {
412
+ kind: "manual";
413
+ input: "quiz" | "photo" | "none";
414
+ actor?: "member" | "staff" | undefined;
415
+ } | {
416
+ kind: "automatic";
417
+ };
418
+ availability: {
419
+ kind: "available";
420
+ input: "quiz" | "photo" | "none";
421
+ } | {
422
+ kind: "completed";
423
+ } | {
424
+ kind: "locked";
425
+ missing: {
426
+ quest: string;
427
+ title: string;
428
+ }[];
429
+ } | {
430
+ kind: "staff-required";
431
+ } | {
432
+ kind: "automatic";
433
+ } | {
434
+ kind: "checking";
435
+ attempt: string;
436
+ } | {
437
+ kind: "needs-review";
438
+ attempt: string;
439
+ } | {
440
+ kind: "retryable";
441
+ attempt: string;
442
+ };
443
+ completed: boolean;
444
+ missing: {
445
+ quest: string;
446
+ title: string;
447
+ }[];
448
+ attempt: {
449
+ id: string;
450
+ release: string;
451
+ quest: string;
452
+ member: string;
453
+ evidence: string | null;
454
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
455
+ reason: string | null;
456
+ retries: number;
457
+ generation: number;
458
+ completion: string | null;
459
+ reviewRewards: ({
460
+ kind: "tier";
461
+ reward: {
462
+ id: string;
463
+ title: string;
464
+ tiers: {
465
+ id: string;
466
+ title: string;
467
+ }[];
468
+ inventory: {
469
+ kind: "untracked";
470
+ };
471
+ fulfillment: {
472
+ kind: "staff-handover";
473
+ };
474
+ };
475
+ tier: string;
476
+ } | {
477
+ kind: "points";
478
+ balance: string;
479
+ amount: number;
480
+ })[] | null;
481
+ createdAt: number;
482
+ input?: {
483
+ kind: "quiz";
484
+ answers: {
485
+ [k: string]: string;
486
+ };
487
+ release?: string | undefined;
488
+ } | undefined;
489
+ } | null;
490
+ release: string;
491
+ interaction: "staff" | "quiz" | "photo" | "automatic" | "claim";
492
+ lifecycle: "active" | "paused" | "archived";
493
+ rewards: {
494
+ label: string;
495
+ }[];
496
+ }[];
497
+ }>;
498
+ open: (view: QuestView) => Promise<QuestController>;
499
+ observe: (listener: (value: ProgressObservation<zod.infer<typeof questExperienceSchema>>) => void, options?: {
500
+ intervalMs?: number;
501
+ maxBackoffMs?: number;
502
+ }) => ProgressObserver;
503
+ };
504
+ wallet: {
505
+ connection: () => Promise<{
506
+ chain: "solana";
507
+ address: string;
508
+ verifiedAt: number;
509
+ revision: number;
510
+ } | null>;
511
+ challenge: (input: zod.input<typeof walletChallengeInputSchema>, session: string) => Promise<{
512
+ chain: "solana";
513
+ address: string;
514
+ id: string;
515
+ message: string;
516
+ expiresAt: number;
517
+ }>;
518
+ verify: (input: zod.input<typeof walletProofSchema>, session: string) => Promise<{
519
+ chain: "solana";
520
+ address: string;
521
+ verifiedAt: number;
522
+ revision: number;
523
+ }>;
524
+ };
525
+ auth: {
526
+ providers: () => Promise<{
527
+ providers: {
528
+ provider: "google" | "apple" | "x" | "discord";
529
+ configured: boolean;
530
+ }[];
531
+ email: boolean;
532
+ demo: boolean;
533
+ }>;
534
+ start: (provider: "google" | "apple" | "x" | "discord", mode: "sign-in" | "connect") => Promise<{
535
+ url: string;
536
+ }>;
537
+ emailStart: (email: string) => Promise<{
538
+ challenge: string;
539
+ }>;
540
+ emailVerify: (challenge: string, code: string) => Promise<{
541
+ organization: string;
542
+ project: string;
543
+ environment: "test" | "live";
544
+ id: string;
545
+ principal: {
546
+ kind: "member";
547
+ member: string;
548
+ } | {
549
+ kind: "staff";
550
+ subject: string;
551
+ } | {
552
+ kind: "operator";
553
+ subject: string;
554
+ };
555
+ expiresAt: number;
556
+ }>;
557
+ connections: () => Promise<{
558
+ provider: string;
559
+ subject: string;
560
+ signInEnabled: boolean;
561
+ }[]>;
562
+ session: () => Promise<{
563
+ organization: string;
564
+ project: string;
565
+ environment: "test" | "live";
566
+ id: string;
567
+ principal: {
568
+ kind: "member";
569
+ member: string;
570
+ } | {
571
+ kind: "staff";
572
+ subject: string;
573
+ } | {
574
+ kind: "operator";
575
+ subject: string;
576
+ };
577
+ expiresAt: number;
578
+ } | null>;
579
+ demoSignIn: (code: string) => Promise<{
580
+ organization: string;
581
+ project: string;
582
+ environment: "test" | "live";
583
+ id: string;
584
+ principal: {
585
+ kind: "member";
586
+ member: string;
587
+ } | {
588
+ kind: "staff";
589
+ subject: string;
590
+ } | {
591
+ kind: "operator";
592
+ subject: string;
593
+ };
594
+ expiresAt: number;
595
+ }>;
596
+ signOut: () => Promise<{
597
+ ok: boolean;
598
+ }>;
599
+ exchange: (input: ExchangeInput) => Promise<{
600
+ token: string;
601
+ session: {
602
+ organization: string;
603
+ project: string;
604
+ environment: "test" | "live";
605
+ id: string;
606
+ principal: {
607
+ kind: "member";
608
+ member: string;
609
+ } | {
610
+ kind: "staff";
611
+ subject: string;
612
+ } | {
613
+ kind: "operator";
614
+ subject: string;
615
+ };
616
+ expiresAt: number;
617
+ };
618
+ }>;
619
+ };
620
+ me: {
621
+ observeProgress: (listener: (value: ProgressObservation) => void, options?: {
622
+ intervalMs?: number;
623
+ maxBackoffMs?: number;
624
+ }) => ProgressObserver;
625
+ submission: {
626
+ (quest: string, options?: {
627
+ input: "photo";
628
+ release?: string;
629
+ recoverPrevious?: boolean;
630
+ }): Promise<PhotoSubmission>;
631
+ (quest: string, options: {
632
+ input: "quiz";
633
+ release?: string;
634
+ recoverPrevious?: boolean;
635
+ }): Promise<QuizSubmission>;
636
+ (quest: string, options: {
637
+ input: "none";
638
+ release?: string;
639
+ recoverPrevious?: boolean;
640
+ }): Promise<ClaimSubmission>;
641
+ };
642
+ collectionPass: (entitlement: string, session: string) => Promise<{
643
+ code: string;
644
+ expiresAt: number;
645
+ entitlement: string;
646
+ }>;
647
+ linkPass: (code: string) => Promise<{
648
+ id: string;
649
+ release: string;
650
+ quest: string;
651
+ member: string;
652
+ evidence: string | null;
653
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
654
+ reason: string | null;
655
+ retries: number;
656
+ generation: number;
657
+ completion: string | null;
658
+ reviewRewards: ({
659
+ kind: "tier";
660
+ reward: {
661
+ id: string;
662
+ title: string;
663
+ tiers: {
664
+ id: string;
665
+ title: string;
666
+ }[];
667
+ inventory: {
668
+ kind: "untracked";
669
+ };
670
+ fulfillment: {
671
+ kind: "staff-handover";
672
+ };
673
+ };
674
+ tier: string;
675
+ } | {
676
+ kind: "points";
677
+ balance: string;
678
+ amount: number;
679
+ })[] | null;
680
+ createdAt: number;
681
+ input?: {
682
+ kind: "quiz";
683
+ answers: {
684
+ [k: string]: string;
685
+ };
686
+ release?: string | undefined;
687
+ } | undefined;
688
+ }>;
689
+ progress: () => Promise<{
690
+ member: string;
691
+ quests: {
692
+ quest: string;
693
+ title: string;
694
+ presentation: {
695
+ quiz?: {
696
+ id: string;
697
+ prompt: string;
698
+ choices: {
699
+ id: string;
700
+ label: string;
701
+ }[];
702
+ }[] | undefined;
703
+ instructions?: string | undefined;
704
+ video?: {
705
+ url: string;
706
+ poster?: string | undefined;
707
+ captions?: {
708
+ url: string;
709
+ language: string;
710
+ label: string;
711
+ } | undefined;
712
+ } | undefined;
713
+ };
714
+ trigger: {
715
+ kind: "manual";
716
+ input: "quiz" | "photo" | "none";
717
+ actor?: "member" | "staff" | undefined;
718
+ } | {
719
+ kind: "automatic";
720
+ };
721
+ availability: {
722
+ kind: "available";
723
+ input: "quiz" | "photo" | "none";
724
+ } | {
725
+ kind: "completed";
726
+ } | {
727
+ kind: "locked";
728
+ missing: {
729
+ quest: string;
730
+ title: string;
731
+ }[];
732
+ } | {
733
+ kind: "staff-required";
734
+ } | {
735
+ kind: "automatic";
736
+ } | {
737
+ kind: "checking";
738
+ attempt: string;
739
+ } | {
740
+ kind: "needs-review";
741
+ attempt: string;
742
+ } | {
743
+ kind: "retryable";
744
+ attempt: string;
745
+ };
746
+ completed: boolean;
747
+ missing: {
748
+ quest: string;
749
+ title: string;
750
+ }[];
751
+ attempt: {
752
+ id: string;
753
+ release: string;
754
+ quest: string;
755
+ member: string;
756
+ evidence: string | null;
757
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
758
+ reason: string | null;
759
+ retries: number;
760
+ generation: number;
761
+ completion: string | null;
762
+ reviewRewards: ({
763
+ kind: "tier";
764
+ reward: {
765
+ id: string;
766
+ title: string;
767
+ tiers: {
768
+ id: string;
769
+ title: string;
770
+ }[];
771
+ inventory: {
772
+ kind: "untracked";
773
+ };
774
+ fulfillment: {
775
+ kind: "staff-handover";
776
+ };
777
+ };
778
+ tier: string;
779
+ } | {
780
+ kind: "points";
781
+ balance: string;
782
+ amount: number;
783
+ })[] | null;
784
+ createdAt: number;
785
+ input?: {
786
+ kind: "quiz";
787
+ answers: {
788
+ [k: string]: string;
789
+ };
790
+ release?: string | undefined;
791
+ } | undefined;
792
+ } | null;
793
+ release?: string | undefined;
794
+ }[];
795
+ entitlements: ({
796
+ status: "available";
797
+ id: string;
798
+ member: string;
799
+ reward: {
800
+ id: string;
801
+ title: string;
802
+ tiers: {
803
+ id: string;
804
+ title: string;
805
+ }[];
806
+ inventory: {
807
+ kind: "untracked";
808
+ };
809
+ fulfillment: {
810
+ kind: "staff-handover";
811
+ };
812
+ };
813
+ earnedTier: string;
814
+ tier: string;
815
+ revision: number;
816
+ } | {
817
+ status: "handing-over";
818
+ handover: string;
819
+ startedAt: number;
820
+ id: string;
821
+ member: string;
822
+ reward: {
823
+ id: string;
824
+ title: string;
825
+ tiers: {
826
+ id: string;
827
+ title: string;
828
+ }[];
829
+ inventory: {
830
+ kind: "untracked";
831
+ };
832
+ fulfillment: {
833
+ kind: "staff-handover";
834
+ };
835
+ };
836
+ earnedTier: string;
837
+ tier: string;
838
+ revision: number;
839
+ allocation?: {
840
+ item: string;
841
+ label: string;
842
+ } | undefined;
843
+ } | {
844
+ status: "collected";
845
+ handover: string;
846
+ startedAt: number;
847
+ collectedAt: number;
848
+ id: string;
849
+ member: string;
850
+ reward: {
851
+ id: string;
852
+ title: string;
853
+ tiers: {
854
+ id: string;
855
+ title: string;
856
+ }[];
857
+ inventory: {
858
+ kind: "untracked";
859
+ };
860
+ fulfillment: {
861
+ kind: "staff-handover";
862
+ };
863
+ };
864
+ earnedTier: string;
865
+ tier: string;
866
+ revision: number;
867
+ allocation?: {
868
+ item: string;
869
+ label: string;
870
+ } | undefined;
871
+ })[];
872
+ }>;
873
+ claim: (input: Omit<SubmitInput, "member">, options?: {
874
+ session: string;
875
+ }) => Promise<{
876
+ id: string;
877
+ release: string;
878
+ quest: string;
879
+ member: string;
880
+ evidence: string | null;
881
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
882
+ reason: string | null;
883
+ retries: number;
884
+ generation: number;
885
+ completion: string | null;
886
+ reviewRewards: ({
887
+ kind: "tier";
888
+ reward: {
889
+ id: string;
890
+ title: string;
891
+ tiers: {
892
+ id: string;
893
+ title: string;
894
+ }[];
895
+ inventory: {
896
+ kind: "untracked";
897
+ };
898
+ fulfillment: {
899
+ kind: "staff-handover";
900
+ };
901
+ };
902
+ tier: string;
903
+ } | {
904
+ kind: "points";
905
+ balance: string;
906
+ amount: number;
907
+ })[] | null;
908
+ createdAt: number;
909
+ input?: {
910
+ kind: "quiz";
911
+ answers: {
912
+ [k: string]: string;
913
+ };
914
+ release?: string | undefined;
915
+ } | undefined;
916
+ }>;
917
+ upload: (file: File) => Promise<{
918
+ id: string;
919
+ member: string;
920
+ type: "image/jpeg" | "image/png";
921
+ size: number;
922
+ }>;
923
+ };
924
+ reviews: {
925
+ list: (options?: ReviewListOptions, requestOptions?: {
926
+ signal?: AbortSignal;
927
+ }) => Promise<{
928
+ items: {
929
+ attempt: {
930
+ id: string;
931
+ release: string;
932
+ quest: string;
933
+ member: string;
934
+ evidence: string | null;
935
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
936
+ reason: string | null;
937
+ retries: number;
938
+ generation: number;
939
+ completion: string | null;
940
+ reviewRewards: ({
941
+ kind: "tier";
942
+ reward: {
943
+ id: string;
944
+ title: string;
945
+ tiers: {
946
+ id: string;
947
+ title: string;
948
+ }[];
949
+ inventory: {
950
+ kind: "untracked";
951
+ };
952
+ fulfillment: {
953
+ kind: "staff-handover";
954
+ };
955
+ };
956
+ tier: string;
957
+ } | {
958
+ kind: "points";
959
+ balance: string;
960
+ amount: number;
961
+ })[] | null;
962
+ createdAt: number;
963
+ input?: {
964
+ kind: "quiz";
965
+ answers: {
966
+ [k: string]: string;
967
+ };
968
+ release?: string | undefined;
969
+ } | undefined;
970
+ };
971
+ title: string;
972
+ checks: {
973
+ criteria: string;
974
+ result: {
975
+ kind: "pass" | "fail" | "unclear";
976
+ reason: string;
977
+ };
978
+ }[];
979
+ }[];
980
+ nextCursor: string | null;
981
+ }>;
982
+ };
983
+ members: {
984
+ list: (options?: MemberListOptions, requestOptions?: {
985
+ signal?: AbortSignal;
986
+ }) => Promise<{
987
+ items: {
988
+ member: string;
989
+ }[];
990
+ nextCursor: string | null;
991
+ }>;
992
+ };
993
+ evidence: {
994
+ download(id: string, requestOptions?: {
995
+ signal?: AbortSignal;
996
+ }): Promise<Blob>;
997
+ };
998
+ lookupMember: (issuer: string, subject: string) => Promise<{
999
+ member: string;
1000
+ }>;
1001
+ journeyTemplate: () => Promise<{
1002
+ code: string;
1003
+ definition: {
1004
+ quest: string;
1005
+ runtimeVersion: 2 | 1;
1006
+ title: string;
1007
+ presentation: {
1008
+ quiz?: {
1009
+ id: string;
1010
+ prompt: string;
1011
+ choices: {
1012
+ id: string;
1013
+ label: string;
1014
+ }[];
1015
+ }[] | undefined;
1016
+ instructions?: string | undefined;
1017
+ video?: {
1018
+ url: string;
1019
+ poster?: string | undefined;
1020
+ captions?: {
1021
+ url: string;
1022
+ language: string;
1023
+ label: string;
1024
+ } | undefined;
1025
+ } | undefined;
1026
+ };
1027
+ fields: Record<string, {
1028
+ kind: "quiz";
1029
+ default: {
1030
+ id: string;
1031
+ prompt: string;
1032
+ choices: {
1033
+ id: string;
1034
+ label: string;
1035
+ }[];
1036
+ correct: string;
1037
+ }[];
1038
+ label: string;
1039
+ description?: string | undefined;
1040
+ } | {
1041
+ kind: "text";
1042
+ default: string;
1043
+ minLength: number;
1044
+ maxLength: number;
1045
+ multiline: boolean;
1046
+ label: string;
1047
+ description?: string | undefined;
1048
+ } | {
1049
+ kind: "integer";
1050
+ default: number;
1051
+ min: number;
1052
+ max: number;
1053
+ label: string;
1054
+ description?: string | undefined;
1055
+ } | {
1056
+ kind: "boolean";
1057
+ default: boolean;
1058
+ label: string;
1059
+ description?: string | undefined;
1060
+ } | {
1061
+ kind: "choice";
1062
+ default: string;
1063
+ options: string[];
1064
+ label: string;
1065
+ description?: string | undefined;
1066
+ }>;
1067
+ values: Record<string, string | number | boolean | {
1068
+ id: string;
1069
+ prompt: string;
1070
+ choices: {
1071
+ id: string;
1072
+ label: string;
1073
+ }[];
1074
+ correct: string;
1075
+ }[]>;
1076
+ rewards: ({
1077
+ kind: "tier";
1078
+ reward: {
1079
+ id: string;
1080
+ title: string;
1081
+ tiers: {
1082
+ id: string;
1083
+ title: string;
1084
+ }[];
1085
+ inventory: {
1086
+ kind: "untracked";
1087
+ };
1088
+ fulfillment: {
1089
+ kind: "staff-handover";
1090
+ };
1091
+ };
1092
+ tier: string;
1093
+ } | {
1094
+ kind: "points";
1095
+ balance: string;
1096
+ amount: number;
1097
+ })[];
1098
+ humanReview: boolean;
1099
+ trigger: {
1100
+ kind: "manual";
1101
+ input: "quiz" | "photo" | "none";
1102
+ actor?: "member" | "staff" | undefined;
1103
+ } | {
1104
+ kind: "automatic";
1105
+ };
1106
+ requires: {
1107
+ quest: string;
1108
+ scope: "ever";
1109
+ }[];
1110
+ completion: {
1111
+ kind: "once";
1112
+ };
1113
+ };
1114
+ }[]>;
1115
+ template: () => Promise<{
1116
+ code: string;
1117
+ definition: {
1118
+ quest: string;
1119
+ runtimeVersion: 2 | 1;
1120
+ title: string;
1121
+ presentation: {
1122
+ quiz?: {
1123
+ id: string;
1124
+ prompt: string;
1125
+ choices: {
1126
+ id: string;
1127
+ label: string;
1128
+ }[];
1129
+ }[] | undefined;
1130
+ instructions?: string | undefined;
1131
+ video?: {
1132
+ url: string;
1133
+ poster?: string | undefined;
1134
+ captions?: {
1135
+ url: string;
1136
+ language: string;
1137
+ label: string;
1138
+ } | undefined;
1139
+ } | undefined;
1140
+ };
1141
+ fields: Record<string, {
1142
+ kind: "quiz";
1143
+ default: {
1144
+ id: string;
1145
+ prompt: string;
1146
+ choices: {
1147
+ id: string;
1148
+ label: string;
1149
+ }[];
1150
+ correct: string;
1151
+ }[];
1152
+ label: string;
1153
+ description?: string | undefined;
1154
+ } | {
1155
+ kind: "text";
1156
+ default: string;
1157
+ minLength: number;
1158
+ maxLength: number;
1159
+ multiline: boolean;
1160
+ label: string;
1161
+ description?: string | undefined;
1162
+ } | {
1163
+ kind: "integer";
1164
+ default: number;
1165
+ min: number;
1166
+ max: number;
1167
+ label: string;
1168
+ description?: string | undefined;
1169
+ } | {
1170
+ kind: "boolean";
1171
+ default: boolean;
1172
+ label: string;
1173
+ description?: string | undefined;
1174
+ } | {
1175
+ kind: "choice";
1176
+ default: string;
1177
+ options: string[];
1178
+ label: string;
1179
+ description?: string | undefined;
1180
+ }>;
1181
+ values: Record<string, string | number | boolean | {
1182
+ id: string;
1183
+ prompt: string;
1184
+ choices: {
1185
+ id: string;
1186
+ label: string;
1187
+ }[];
1188
+ correct: string;
1189
+ }[]>;
1190
+ rewards: ({
1191
+ kind: "tier";
1192
+ reward: {
1193
+ id: string;
1194
+ title: string;
1195
+ tiers: {
1196
+ id: string;
1197
+ title: string;
1198
+ }[];
1199
+ inventory: {
1200
+ kind: "untracked";
1201
+ };
1202
+ fulfillment: {
1203
+ kind: "staff-handover";
1204
+ };
1205
+ };
1206
+ tier: string;
1207
+ } | {
1208
+ kind: "points";
1209
+ balance: string;
1210
+ amount: number;
1211
+ })[];
1212
+ humanReview: boolean;
1213
+ trigger: {
1214
+ kind: "manual";
1215
+ input: "quiz" | "photo" | "none";
1216
+ actor?: "member" | "staff" | undefined;
1217
+ } | {
1218
+ kind: "automatic";
1219
+ };
1220
+ requires: {
1221
+ quest: string;
1222
+ scope: "ever";
1223
+ }[];
1224
+ completion: {
1225
+ kind: "once";
1226
+ };
1227
+ };
1228
+ }>;
1229
+ snapshot: () => Promise<{
1230
+ releases: {
1231
+ quest: string;
1232
+ runtimeVersion: 2 | 1;
1233
+ title: string;
1234
+ presentation: {
1235
+ quiz?: {
1236
+ id: string;
1237
+ prompt: string;
1238
+ choices: {
1239
+ id: string;
1240
+ label: string;
1241
+ }[];
1242
+ }[] | undefined;
1243
+ instructions?: string | undefined;
1244
+ video?: {
1245
+ url: string;
1246
+ poster?: string | undefined;
1247
+ captions?: {
1248
+ url: string;
1249
+ language: string;
1250
+ label: string;
1251
+ } | undefined;
1252
+ } | undefined;
1253
+ };
1254
+ fields: Record<string, {
1255
+ kind: "quiz";
1256
+ default: {
1257
+ id: string;
1258
+ prompt: string;
1259
+ choices: {
1260
+ id: string;
1261
+ label: string;
1262
+ }[];
1263
+ correct: string;
1264
+ }[];
1265
+ label: string;
1266
+ description?: string | undefined;
1267
+ } | {
1268
+ kind: "text";
1269
+ default: string;
1270
+ minLength: number;
1271
+ maxLength: number;
1272
+ multiline: boolean;
1273
+ label: string;
1274
+ description?: string | undefined;
1275
+ } | {
1276
+ kind: "integer";
1277
+ default: number;
1278
+ min: number;
1279
+ max: number;
1280
+ label: string;
1281
+ description?: string | undefined;
1282
+ } | {
1283
+ kind: "boolean";
1284
+ default: boolean;
1285
+ label: string;
1286
+ description?: string | undefined;
1287
+ } | {
1288
+ kind: "choice";
1289
+ default: string;
1290
+ options: string[];
1291
+ label: string;
1292
+ description?: string | undefined;
1293
+ }>;
1294
+ values: Record<string, string | number | boolean | {
1295
+ id: string;
1296
+ prompt: string;
1297
+ choices: {
1298
+ id: string;
1299
+ label: string;
1300
+ }[];
1301
+ correct: string;
1302
+ }[]>;
1303
+ rewards: ({
1304
+ kind: "tier";
1305
+ reward: {
1306
+ id: string;
1307
+ title: string;
1308
+ tiers: {
1309
+ id: string;
1310
+ title: string;
1311
+ }[];
1312
+ inventory: {
1313
+ kind: "untracked";
1314
+ };
1315
+ fulfillment: {
1316
+ kind: "staff-handover";
1317
+ };
1318
+ };
1319
+ tier: string;
1320
+ } | {
1321
+ kind: "points";
1322
+ balance: string;
1323
+ amount: number;
1324
+ })[];
1325
+ humanReview: boolean;
1326
+ trigger: {
1327
+ kind: "manual";
1328
+ input: "quiz" | "photo" | "none";
1329
+ actor?: "member" | "staff" | undefined;
1330
+ } | {
1331
+ kind: "automatic";
1332
+ };
1333
+ requires: {
1334
+ quest: string;
1335
+ scope: "ever";
1336
+ }[];
1337
+ completion: {
1338
+ kind: "once";
1339
+ };
1340
+ code: string;
1341
+ provider: "fixture-pass" | "fixture-fail" | "fixture-unclear" | "fixture-error" | "workers-ai";
1342
+ id: string;
1343
+ createdAt: number;
1344
+ legacy: boolean;
1345
+ lifecycle: "active" | "paused" | "archived";
1346
+ origin?: {
1347
+ typeVersion: string;
1348
+ } | undefined;
1349
+ configuration?: {
1350
+ defaults: Record<string, string | number | boolean | {
1351
+ id: string;
1352
+ prompt: string;
1353
+ choices: {
1354
+ id: string;
1355
+ label: string;
1356
+ }[];
1357
+ correct: string;
1358
+ }[]>;
1359
+ overrides: Record<string, string | number | boolean | {
1360
+ id: string;
1361
+ prompt: string;
1362
+ choices: {
1363
+ id: string;
1364
+ label: string;
1365
+ }[];
1366
+ correct: string;
1367
+ }[]>;
1368
+ preserved: string[];
1369
+ } | undefined;
1370
+ }[];
1371
+ completions: {
1372
+ id: string;
1373
+ quest: string;
1374
+ member: string;
1375
+ }[];
1376
+ entitlements: ({
1377
+ status: "available";
1378
+ id: string;
1379
+ member: string;
1380
+ reward: {
1381
+ id: string;
1382
+ title: string;
1383
+ tiers: {
1384
+ id: string;
1385
+ title: string;
1386
+ }[];
1387
+ inventory: {
1388
+ kind: "untracked";
1389
+ };
1390
+ fulfillment: {
1391
+ kind: "staff-handover";
1392
+ };
1393
+ };
1394
+ earnedTier: string;
1395
+ tier: string;
1396
+ revision: number;
1397
+ } | {
1398
+ status: "handing-over";
1399
+ handover: string;
1400
+ startedAt: number;
1401
+ id: string;
1402
+ member: string;
1403
+ reward: {
1404
+ id: string;
1405
+ title: string;
1406
+ tiers: {
1407
+ id: string;
1408
+ title: string;
1409
+ }[];
1410
+ inventory: {
1411
+ kind: "untracked";
1412
+ };
1413
+ fulfillment: {
1414
+ kind: "staff-handover";
1415
+ };
1416
+ };
1417
+ earnedTier: string;
1418
+ tier: string;
1419
+ revision: number;
1420
+ allocation?: {
1421
+ item: string;
1422
+ label: string;
1423
+ } | undefined;
1424
+ } | {
1425
+ status: "collected";
1426
+ handover: string;
1427
+ startedAt: number;
1428
+ collectedAt: number;
1429
+ id: string;
1430
+ member: string;
1431
+ reward: {
1432
+ id: string;
1433
+ title: string;
1434
+ tiers: {
1435
+ id: string;
1436
+ title: string;
1437
+ }[];
1438
+ inventory: {
1439
+ kind: "untracked";
1440
+ };
1441
+ fulfillment: {
1442
+ kind: "staff-handover";
1443
+ };
1444
+ };
1445
+ earnedTier: string;
1446
+ tier: string;
1447
+ revision: number;
1448
+ allocation?: {
1449
+ item: string;
1450
+ label: string;
1451
+ } | undefined;
1452
+ })[];
1453
+ attempts: {
1454
+ id: string;
1455
+ release: string;
1456
+ quest: string;
1457
+ member: string;
1458
+ evidence: string | null;
1459
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
1460
+ reason: string | null;
1461
+ retries: number;
1462
+ generation: number;
1463
+ completion: string | null;
1464
+ reviewRewards: ({
1465
+ kind: "tier";
1466
+ reward: {
1467
+ id: string;
1468
+ title: string;
1469
+ tiers: {
1470
+ id: string;
1471
+ title: string;
1472
+ }[];
1473
+ inventory: {
1474
+ kind: "untracked";
1475
+ };
1476
+ fulfillment: {
1477
+ kind: "staff-handover";
1478
+ };
1479
+ };
1480
+ tier: string;
1481
+ } | {
1482
+ kind: "points";
1483
+ balance: string;
1484
+ amount: number;
1485
+ })[] | null;
1486
+ createdAt: number;
1487
+ input?: {
1488
+ kind: "quiz";
1489
+ answers: {
1490
+ [k: string]: string;
1491
+ };
1492
+ release?: string | undefined;
1493
+ } | undefined;
1494
+ }[];
1495
+ balances: {
1496
+ member: string;
1497
+ balance: string;
1498
+ earned: number;
1499
+ held: number;
1500
+ available: number;
1501
+ }[];
1502
+ events: {
1503
+ id: number;
1504
+ attempt: string | null;
1505
+ kind: string;
1506
+ detail: string;
1507
+ actor: string | null;
1508
+ at: number;
1509
+ }[];
1510
+ }>;
1511
+ publish: (release: ReleaseInput) => Promise<{
1512
+ quest: string;
1513
+ runtimeVersion: 2 | 1;
1514
+ title: string;
1515
+ presentation: {
1516
+ quiz?: {
1517
+ id: string;
1518
+ prompt: string;
1519
+ choices: {
1520
+ id: string;
1521
+ label: string;
1522
+ }[];
1523
+ }[] | undefined;
1524
+ instructions?: string | undefined;
1525
+ video?: {
1526
+ url: string;
1527
+ poster?: string | undefined;
1528
+ captions?: {
1529
+ url: string;
1530
+ language: string;
1531
+ label: string;
1532
+ } | undefined;
1533
+ } | undefined;
1534
+ };
1535
+ fields: Record<string, {
1536
+ kind: "quiz";
1537
+ default: {
1538
+ id: string;
1539
+ prompt: string;
1540
+ choices: {
1541
+ id: string;
1542
+ label: string;
1543
+ }[];
1544
+ correct: string;
1545
+ }[];
1546
+ label: string;
1547
+ description?: string | undefined;
1548
+ } | {
1549
+ kind: "text";
1550
+ default: string;
1551
+ minLength: number;
1552
+ maxLength: number;
1553
+ multiline: boolean;
1554
+ label: string;
1555
+ description?: string | undefined;
1556
+ } | {
1557
+ kind: "integer";
1558
+ default: number;
1559
+ min: number;
1560
+ max: number;
1561
+ label: string;
1562
+ description?: string | undefined;
1563
+ } | {
1564
+ kind: "boolean";
1565
+ default: boolean;
1566
+ label: string;
1567
+ description?: string | undefined;
1568
+ } | {
1569
+ kind: "choice";
1570
+ default: string;
1571
+ options: string[];
1572
+ label: string;
1573
+ description?: string | undefined;
1574
+ }>;
1575
+ values: Record<string, string | number | boolean | {
1576
+ id: string;
1577
+ prompt: string;
1578
+ choices: {
1579
+ id: string;
1580
+ label: string;
1581
+ }[];
1582
+ correct: string;
1583
+ }[]>;
1584
+ rewards: ({
1585
+ kind: "tier";
1586
+ reward: {
1587
+ id: string;
1588
+ title: string;
1589
+ tiers: {
1590
+ id: string;
1591
+ title: string;
1592
+ }[];
1593
+ inventory: {
1594
+ kind: "untracked";
1595
+ };
1596
+ fulfillment: {
1597
+ kind: "staff-handover";
1598
+ };
1599
+ };
1600
+ tier: string;
1601
+ } | {
1602
+ kind: "points";
1603
+ balance: string;
1604
+ amount: number;
1605
+ })[];
1606
+ humanReview: boolean;
1607
+ trigger: {
1608
+ kind: "manual";
1609
+ input: "quiz" | "photo" | "none";
1610
+ actor?: "member" | "staff" | undefined;
1611
+ } | {
1612
+ kind: "automatic";
1613
+ };
1614
+ requires: {
1615
+ quest: string;
1616
+ scope: "ever";
1617
+ }[];
1618
+ completion: {
1619
+ kind: "once";
1620
+ };
1621
+ code: string;
1622
+ provider: "fixture-pass" | "fixture-fail" | "fixture-unclear" | "fixture-error" | "workers-ai";
1623
+ id: string;
1624
+ createdAt: number;
1625
+ legacy: boolean;
1626
+ lifecycle: "active" | "paused" | "archived";
1627
+ origin?: {
1628
+ typeVersion: string;
1629
+ } | undefined;
1630
+ configuration?: {
1631
+ defaults: Record<string, string | number | boolean | {
1632
+ id: string;
1633
+ prompt: string;
1634
+ choices: {
1635
+ id: string;
1636
+ label: string;
1637
+ }[];
1638
+ correct: string;
1639
+ }[]>;
1640
+ overrides: Record<string, string | number | boolean | {
1641
+ id: string;
1642
+ prompt: string;
1643
+ choices: {
1644
+ id: string;
1645
+ label: string;
1646
+ }[];
1647
+ correct: string;
1648
+ }[]>;
1649
+ preserved: string[];
1650
+ } | undefined;
1651
+ }>;
1652
+ publishBatch: (releases: ReleaseInput[]) => Promise<{
1653
+ quest: string;
1654
+ runtimeVersion: 2 | 1;
1655
+ title: string;
1656
+ presentation: {
1657
+ quiz?: {
1658
+ id: string;
1659
+ prompt: string;
1660
+ choices: {
1661
+ id: string;
1662
+ label: string;
1663
+ }[];
1664
+ }[] | undefined;
1665
+ instructions?: string | undefined;
1666
+ video?: {
1667
+ url: string;
1668
+ poster?: string | undefined;
1669
+ captions?: {
1670
+ url: string;
1671
+ language: string;
1672
+ label: string;
1673
+ } | undefined;
1674
+ } | undefined;
1675
+ };
1676
+ fields: Record<string, {
1677
+ kind: "quiz";
1678
+ default: {
1679
+ id: string;
1680
+ prompt: string;
1681
+ choices: {
1682
+ id: string;
1683
+ label: string;
1684
+ }[];
1685
+ correct: string;
1686
+ }[];
1687
+ label: string;
1688
+ description?: string | undefined;
1689
+ } | {
1690
+ kind: "text";
1691
+ default: string;
1692
+ minLength: number;
1693
+ maxLength: number;
1694
+ multiline: boolean;
1695
+ label: string;
1696
+ description?: string | undefined;
1697
+ } | {
1698
+ kind: "integer";
1699
+ default: number;
1700
+ min: number;
1701
+ max: number;
1702
+ label: string;
1703
+ description?: string | undefined;
1704
+ } | {
1705
+ kind: "boolean";
1706
+ default: boolean;
1707
+ label: string;
1708
+ description?: string | undefined;
1709
+ } | {
1710
+ kind: "choice";
1711
+ default: string;
1712
+ options: string[];
1713
+ label: string;
1714
+ description?: string | undefined;
1715
+ }>;
1716
+ values: Record<string, string | number | boolean | {
1717
+ id: string;
1718
+ prompt: string;
1719
+ choices: {
1720
+ id: string;
1721
+ label: string;
1722
+ }[];
1723
+ correct: string;
1724
+ }[]>;
1725
+ rewards: ({
1726
+ kind: "tier";
1727
+ reward: {
1728
+ id: string;
1729
+ title: string;
1730
+ tiers: {
1731
+ id: string;
1732
+ title: string;
1733
+ }[];
1734
+ inventory: {
1735
+ kind: "untracked";
1736
+ };
1737
+ fulfillment: {
1738
+ kind: "staff-handover";
1739
+ };
1740
+ };
1741
+ tier: string;
1742
+ } | {
1743
+ kind: "points";
1744
+ balance: string;
1745
+ amount: number;
1746
+ })[];
1747
+ humanReview: boolean;
1748
+ trigger: {
1749
+ kind: "manual";
1750
+ input: "quiz" | "photo" | "none";
1751
+ actor?: "member" | "staff" | undefined;
1752
+ } | {
1753
+ kind: "automatic";
1754
+ };
1755
+ requires: {
1756
+ quest: string;
1757
+ scope: "ever";
1758
+ }[];
1759
+ completion: {
1760
+ kind: "once";
1761
+ };
1762
+ code: string;
1763
+ provider: "fixture-pass" | "fixture-fail" | "fixture-unclear" | "fixture-error" | "workers-ai";
1764
+ id: string;
1765
+ createdAt: number;
1766
+ legacy: boolean;
1767
+ lifecycle: "active" | "paused" | "archived";
1768
+ origin?: {
1769
+ typeVersion: string;
1770
+ } | undefined;
1771
+ configuration?: {
1772
+ defaults: Record<string, string | number | boolean | {
1773
+ id: string;
1774
+ prompt: string;
1775
+ choices: {
1776
+ id: string;
1777
+ label: string;
1778
+ }[];
1779
+ correct: string;
1780
+ }[]>;
1781
+ overrides: Record<string, string | number | boolean | {
1782
+ id: string;
1783
+ prompt: string;
1784
+ choices: {
1785
+ id: string;
1786
+ label: string;
1787
+ }[];
1788
+ correct: string;
1789
+ }[]>;
1790
+ preserved: string[];
1791
+ } | undefined;
1792
+ }[]>;
1793
+ progress: (member: string) => Promise<{
1794
+ member: string;
1795
+ quests: {
1796
+ quest: string;
1797
+ title: string;
1798
+ presentation: {
1799
+ quiz?: {
1800
+ id: string;
1801
+ prompt: string;
1802
+ choices: {
1803
+ id: string;
1804
+ label: string;
1805
+ }[];
1806
+ }[] | undefined;
1807
+ instructions?: string | undefined;
1808
+ video?: {
1809
+ url: string;
1810
+ poster?: string | undefined;
1811
+ captions?: {
1812
+ url: string;
1813
+ language: string;
1814
+ label: string;
1815
+ } | undefined;
1816
+ } | undefined;
1817
+ };
1818
+ trigger: {
1819
+ kind: "manual";
1820
+ input: "quiz" | "photo" | "none";
1821
+ actor?: "member" | "staff" | undefined;
1822
+ } | {
1823
+ kind: "automatic";
1824
+ };
1825
+ availability: {
1826
+ kind: "available";
1827
+ input: "quiz" | "photo" | "none";
1828
+ } | {
1829
+ kind: "completed";
1830
+ } | {
1831
+ kind: "locked";
1832
+ missing: {
1833
+ quest: string;
1834
+ title: string;
1835
+ }[];
1836
+ } | {
1837
+ kind: "staff-required";
1838
+ } | {
1839
+ kind: "automatic";
1840
+ } | {
1841
+ kind: "checking";
1842
+ attempt: string;
1843
+ } | {
1844
+ kind: "needs-review";
1845
+ attempt: string;
1846
+ } | {
1847
+ kind: "retryable";
1848
+ attempt: string;
1849
+ };
1850
+ completed: boolean;
1851
+ missing: {
1852
+ quest: string;
1853
+ title: string;
1854
+ }[];
1855
+ attempt: {
1856
+ id: string;
1857
+ release: string;
1858
+ quest: string;
1859
+ member: string;
1860
+ evidence: string | null;
1861
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
1862
+ reason: string | null;
1863
+ retries: number;
1864
+ generation: number;
1865
+ completion: string | null;
1866
+ reviewRewards: ({
1867
+ kind: "tier";
1868
+ reward: {
1869
+ id: string;
1870
+ title: string;
1871
+ tiers: {
1872
+ id: string;
1873
+ title: string;
1874
+ }[];
1875
+ inventory: {
1876
+ kind: "untracked";
1877
+ };
1878
+ fulfillment: {
1879
+ kind: "staff-handover";
1880
+ };
1881
+ };
1882
+ tier: string;
1883
+ } | {
1884
+ kind: "points";
1885
+ balance: string;
1886
+ amount: number;
1887
+ })[] | null;
1888
+ createdAt: number;
1889
+ input?: {
1890
+ kind: "quiz";
1891
+ answers: {
1892
+ [k: string]: string;
1893
+ };
1894
+ release?: string | undefined;
1895
+ } | undefined;
1896
+ } | null;
1897
+ release?: string | undefined;
1898
+ }[];
1899
+ entitlements: ({
1900
+ status: "available";
1901
+ id: string;
1902
+ member: string;
1903
+ reward: {
1904
+ id: string;
1905
+ title: string;
1906
+ tiers: {
1907
+ id: string;
1908
+ title: string;
1909
+ }[];
1910
+ inventory: {
1911
+ kind: "untracked";
1912
+ };
1913
+ fulfillment: {
1914
+ kind: "staff-handover";
1915
+ };
1916
+ };
1917
+ earnedTier: string;
1918
+ tier: string;
1919
+ revision: number;
1920
+ } | {
1921
+ status: "handing-over";
1922
+ handover: string;
1923
+ startedAt: number;
1924
+ id: string;
1925
+ member: string;
1926
+ reward: {
1927
+ id: string;
1928
+ title: string;
1929
+ tiers: {
1930
+ id: string;
1931
+ title: string;
1932
+ }[];
1933
+ inventory: {
1934
+ kind: "untracked";
1935
+ };
1936
+ fulfillment: {
1937
+ kind: "staff-handover";
1938
+ };
1939
+ };
1940
+ earnedTier: string;
1941
+ tier: string;
1942
+ revision: number;
1943
+ allocation?: {
1944
+ item: string;
1945
+ label: string;
1946
+ } | undefined;
1947
+ } | {
1948
+ status: "collected";
1949
+ handover: string;
1950
+ startedAt: number;
1951
+ collectedAt: number;
1952
+ id: string;
1953
+ member: string;
1954
+ reward: {
1955
+ id: string;
1956
+ title: string;
1957
+ tiers: {
1958
+ id: string;
1959
+ title: string;
1960
+ }[];
1961
+ inventory: {
1962
+ kind: "untracked";
1963
+ };
1964
+ fulfillment: {
1965
+ kind: "staff-handover";
1966
+ };
1967
+ };
1968
+ earnedTier: string;
1969
+ tier: string;
1970
+ revision: number;
1971
+ allocation?: {
1972
+ item: string;
1973
+ label: string;
1974
+ } | undefined;
1975
+ })[];
1976
+ }>;
1977
+ beginHandover: (id: string, input: zod.input<typeof beginHandoverSchema>) => Promise<{
1978
+ status: "available";
1979
+ id: string;
1980
+ member: string;
1981
+ reward: {
1982
+ id: string;
1983
+ title: string;
1984
+ tiers: {
1985
+ id: string;
1986
+ title: string;
1987
+ }[];
1988
+ inventory: {
1989
+ kind: "untracked";
1990
+ };
1991
+ fulfillment: {
1992
+ kind: "staff-handover";
1993
+ };
1994
+ };
1995
+ earnedTier: string;
1996
+ tier: string;
1997
+ revision: number;
1998
+ } | {
1999
+ status: "handing-over";
2000
+ handover: string;
2001
+ startedAt: number;
2002
+ id: string;
2003
+ member: string;
2004
+ reward: {
2005
+ id: string;
2006
+ title: string;
2007
+ tiers: {
2008
+ id: string;
2009
+ title: string;
2010
+ }[];
2011
+ inventory: {
2012
+ kind: "untracked";
2013
+ };
2014
+ fulfillment: {
2015
+ kind: "staff-handover";
2016
+ };
2017
+ };
2018
+ earnedTier: string;
2019
+ tier: string;
2020
+ revision: number;
2021
+ allocation?: {
2022
+ item: string;
2023
+ label: string;
2024
+ } | undefined;
2025
+ } | {
2026
+ status: "collected";
2027
+ handover: string;
2028
+ startedAt: number;
2029
+ collectedAt: number;
2030
+ id: string;
2031
+ member: string;
2032
+ reward: {
2033
+ id: string;
2034
+ title: string;
2035
+ tiers: {
2036
+ id: string;
2037
+ title: string;
2038
+ }[];
2039
+ inventory: {
2040
+ kind: "untracked";
2041
+ };
2042
+ fulfillment: {
2043
+ kind: "staff-handover";
2044
+ };
2045
+ };
2046
+ earnedTier: string;
2047
+ tier: string;
2048
+ revision: number;
2049
+ allocation?: {
2050
+ item: string;
2051
+ label: string;
2052
+ } | undefined;
2053
+ }>;
2054
+ confirmHandover: (id: string, input: {
2055
+ actionId: string;
2056
+ handover: string;
2057
+ }) => Promise<{
2058
+ status: "available";
2059
+ id: string;
2060
+ member: string;
2061
+ reward: {
2062
+ id: string;
2063
+ title: string;
2064
+ tiers: {
2065
+ id: string;
2066
+ title: string;
2067
+ }[];
2068
+ inventory: {
2069
+ kind: "untracked";
2070
+ };
2071
+ fulfillment: {
2072
+ kind: "staff-handover";
2073
+ };
2074
+ };
2075
+ earnedTier: string;
2076
+ tier: string;
2077
+ revision: number;
2078
+ } | {
2079
+ status: "handing-over";
2080
+ handover: string;
2081
+ startedAt: number;
2082
+ id: string;
2083
+ member: string;
2084
+ reward: {
2085
+ id: string;
2086
+ title: string;
2087
+ tiers: {
2088
+ id: string;
2089
+ title: string;
2090
+ }[];
2091
+ inventory: {
2092
+ kind: "untracked";
2093
+ };
2094
+ fulfillment: {
2095
+ kind: "staff-handover";
2096
+ };
2097
+ };
2098
+ earnedTier: string;
2099
+ tier: string;
2100
+ revision: number;
2101
+ allocation?: {
2102
+ item: string;
2103
+ label: string;
2104
+ } | undefined;
2105
+ } | {
2106
+ status: "collected";
2107
+ handover: string;
2108
+ startedAt: number;
2109
+ collectedAt: number;
2110
+ id: string;
2111
+ member: string;
2112
+ reward: {
2113
+ id: string;
2114
+ title: string;
2115
+ tiers: {
2116
+ id: string;
2117
+ title: string;
2118
+ }[];
2119
+ inventory: {
2120
+ kind: "untracked";
2121
+ };
2122
+ fulfillment: {
2123
+ kind: "staff-handover";
2124
+ };
2125
+ };
2126
+ earnedTier: string;
2127
+ tier: string;
2128
+ revision: number;
2129
+ allocation?: {
2130
+ item: string;
2131
+ label: string;
2132
+ } | undefined;
2133
+ }>;
2134
+ upload: (member: string, file: File) => Promise<{
2135
+ id: string;
2136
+ member: string;
2137
+ type: "image/jpeg" | "image/png";
2138
+ size: number;
2139
+ }>;
2140
+ submit: (input: SubmitInput) => Promise<{
2141
+ id: string;
2142
+ release: string;
2143
+ quest: string;
2144
+ member: string;
2145
+ evidence: string | null;
2146
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
2147
+ reason: string | null;
2148
+ retries: number;
2149
+ generation: number;
2150
+ completion: string | null;
2151
+ reviewRewards: ({
2152
+ kind: "tier";
2153
+ reward: {
2154
+ id: string;
2155
+ title: string;
2156
+ tiers: {
2157
+ id: string;
2158
+ title: string;
2159
+ }[];
2160
+ inventory: {
2161
+ kind: "untracked";
2162
+ };
2163
+ fulfillment: {
2164
+ kind: "staff-handover";
2165
+ };
2166
+ };
2167
+ tier: string;
2168
+ } | {
2169
+ kind: "points";
2170
+ balance: string;
2171
+ amount: number;
2172
+ })[] | null;
2173
+ createdAt: number;
2174
+ input?: {
2175
+ kind: "quiz";
2176
+ answers: {
2177
+ [k: string]: string;
2178
+ };
2179
+ release?: string | undefined;
2180
+ } | undefined;
2181
+ }>;
2182
+ retry: (id: string) => Promise<{
2183
+ id: string;
2184
+ release: string;
2185
+ quest: string;
2186
+ member: string;
2187
+ evidence: string | null;
2188
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
2189
+ reason: string | null;
2190
+ retries: number;
2191
+ generation: number;
2192
+ completion: string | null;
2193
+ reviewRewards: ({
2194
+ kind: "tier";
2195
+ reward: {
2196
+ id: string;
2197
+ title: string;
2198
+ tiers: {
2199
+ id: string;
2200
+ title: string;
2201
+ }[];
2202
+ inventory: {
2203
+ kind: "untracked";
2204
+ };
2205
+ fulfillment: {
2206
+ kind: "staff-handover";
2207
+ };
2208
+ };
2209
+ tier: string;
2210
+ } | {
2211
+ kind: "points";
2212
+ balance: string;
2213
+ amount: number;
2214
+ })[] | null;
2215
+ createdAt: number;
2216
+ input?: {
2217
+ kind: "quiz";
2218
+ answers: {
2219
+ [k: string]: string;
2220
+ };
2221
+ release?: string | undefined;
2222
+ } | undefined;
2223
+ }>;
2224
+ decide: (id: string, input: {
2225
+ actionId: string;
2226
+ generation: number;
2227
+ decision: "accept" | "reject";
2228
+ reason: string;
2229
+ }) => Promise<{
2230
+ id: string;
2231
+ release: string;
2232
+ quest: string;
2233
+ member: string;
2234
+ evidence: string | null;
2235
+ status: "queued" | "evaluating" | "accepted" | "rejected" | "needs-review" | "failed";
2236
+ reason: string | null;
2237
+ retries: number;
2238
+ generation: number;
2239
+ completion: string | null;
2240
+ reviewRewards: ({
2241
+ kind: "tier";
2242
+ reward: {
2243
+ id: string;
2244
+ title: string;
2245
+ tiers: {
2246
+ id: string;
2247
+ title: string;
2248
+ }[];
2249
+ inventory: {
2250
+ kind: "untracked";
2251
+ };
2252
+ fulfillment: {
2253
+ kind: "staff-handover";
2254
+ };
2255
+ };
2256
+ tier: string;
2257
+ } | {
2258
+ kind: "points";
2259
+ balance: string;
2260
+ amount: number;
2261
+ })[] | null;
2262
+ createdAt: number;
2263
+ input?: {
2264
+ kind: "quiz";
2265
+ answers: {
2266
+ [k: string]: string;
2267
+ };
2268
+ release?: string | undefined;
2269
+ } | undefined;
2270
+ }>;
2271
+ };
2272
+ declare function browserSubmissionStore(): SubmissionStore;
2273
+
2274
+ export { browserSubmissionStore, createBrowserRelayClient };