@domino-sdk/relay 1.56.0 → 1.59.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 (64) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/dist/{accounts-DRPENuZe.d.ts → accounts-CVonEkdb.d.ts} +18 -7
  3. package/dist/{attempt-captures-CxxO7DeD.d.ts → attempt-captures-DBj-rxak.d.ts} +1 -1
  4. package/dist/authoring.d.ts +180 -28
  5. package/dist/authoring.js +236 -11
  6. package/dist/{automatic-outcomes-DxW_v5Wc.d.ts → automatic-outcomes-FS9okvBP.d.ts} +1 -1
  7. package/dist/avatar.d.ts +1 -2
  8. package/dist/browser.d.ts +8 -9
  9. package/dist/browser.js +10 -10
  10. package/dist/{capability-error-DSd8EMQC.d.ts → capability-error-DDJl0LY-.d.ts} +0 -6
  11. package/dist/{chunk-OTITLABX.js → chunk-2LKGAL63.js} +2 -2
  12. package/dist/{chunk-NK6EER33.js → chunk-577DG2IT.js} +8 -8
  13. package/dist/{chunk-RBPMT53S.js → chunk-6U5WWH3W.js} +19 -4
  14. package/dist/{chunk-BHHUSBSD.js → chunk-AWWCEP7F.js} +1402 -881
  15. package/dist/{chunk-QNQNKIAA.js → chunk-EQF4ID47.js} +1 -1
  16. package/dist/{chunk-CK7HO32Z.js → chunk-IBROKMFV.js} +2 -2
  17. package/dist/{chunk-MNU6UPXY.js → chunk-KBCTII6C.js} +1 -1
  18. package/dist/{chunk-INSWI2VZ.js → chunk-KYUQEZZA.js} +1 -1
  19. package/dist/{chunk-G6XVBYH7.js → chunk-LDLOB2UZ.js} +4 -4
  20. package/dist/{chunk-CXKXPB7K.js → chunk-M2JQPDUX.js} +34 -9
  21. package/dist/{chunk-KBVH4XZC.js → chunk-R4S6BFOH.js} +1 -1
  22. package/dist/{chunk-ABJ4G47X.js → chunk-TZJT5CRF.js} +1 -1
  23. package/dist/{chunk-BJYMTCWG.js → chunk-UEMLYPKJ.js} +7 -4
  24. package/dist/{chunk-ULQU7KC4.js → chunk-W42KMMH5.js} +1 -5
  25. package/dist/{chunk-VSHV7FEA.js → chunk-XGXDINGM.js} +16 -3
  26. package/dist/{chunk-H2MD6E7Z.js → chunk-YMWRLAAP.js} +1 -1
  27. package/dist/{chunk-W5U2WXG3.js → chunk-YRSU2X2P.js} +2 -2
  28. package/dist/{client-bX3oTpRu.d.ts → client-3b9HjSzZ.d.ts} +115 -116
  29. package/dist/{deployments-D3lxfQMB.d.ts → deployments-BydFVj4Q.d.ts} +314 -175
  30. package/dist/{groups-DPE004_V.d.ts → groups-CFuTfFqG.d.ts} +11 -7
  31. package/dist/index.d.ts +9 -10
  32. package/dist/index.js +9 -9
  33. package/dist/{integrations-CcD5NPEA.d.ts → integrations-DrbKQSTD.d.ts} +3 -32
  34. package/dist/internal.d.ts +10 -10
  35. package/dist/internal.js +8 -8
  36. package/dist/{offers-CtzMeB7O.d.ts → offers-DAfe1O3_.d.ts} +6 -2
  37. package/dist/{pages-BlLqB8ZQ.d.ts → pages-ChDVLrgR.d.ts} +39 -10
  38. package/dist/portal-proxy.js +3 -3
  39. package/dist/react/index.d.ts +71 -72
  40. package/dist/react/index.js +10 -10
  41. package/dist/runtime/authoring.js +1 -1
  42. package/dist/runtime/chunks/BG43KQ2T.js +1 -0
  43. package/dist/runtime/chunks/EWU4OKSY.js +62 -0
  44. package/dist/runtime/manifest.json +5 -5
  45. package/dist/runtime/schema.js +1 -1
  46. package/dist/runtime/zod.js +1 -1
  47. package/dist/{schema-C4m9RhCR.d.ts → schema-BA0nRRlt.d.ts} +184 -35
  48. package/dist/schema.d.ts +754 -432
  49. package/dist/schema.js +77 -13
  50. package/dist/server/index.d.ts +10 -10
  51. package/dist/server/index.js +434 -55
  52. package/dist/{submission-input-wTiYGdgA.d.ts → submission-input-DxQ6RnKo.d.ts} +2 -2
  53. package/dist/{telegram-browser-Bh3i0HiH.d.ts → telegram-browser-o3OIxGrJ.d.ts} +3 -3
  54. package/dist/testing.d.ts +89 -9
  55. package/dist/testing.js +215 -10
  56. package/dist/{transport-CnKA-_RL.d.ts → transport-D_Eqf78J.d.ts} +3997 -2030
  57. package/dist/wallet-B06zvDXp.d.ts +972 -0
  58. package/dist/{x-1czZFVUW.d.ts → x-C28SNifw.d.ts} +2 -2
  59. package/package.json +2 -2
  60. package/dist/profiles-BoOK03cR.d.ts +0 -299
  61. package/dist/runtime/chunks/IDOMZWRY.js +0 -40
  62. package/dist/runtime/chunks/NDB42VFF.js +0 -1
  63. package/dist/util.d-w9f9t3ua.d.ts +0 -5
  64. package/dist/wallet-Ac7OFpOr.d.ts +0 -228
@@ -1,21 +1,20 @@
1
- import { B as Badge, b as MemberBadges, O as Offer, e as Redemption } from '../offers-CtzMeB7O.js';
1
+ import { B as Badge, b as MemberBadges, O as Offer, e as Redemption } from '../offers-DAfe1O3_.js';
2
2
  import { b as ParticipantSession, R as RelayEvent, P as ParticipantActivity, M as MemberSummary } from '../participant-activity-iciCEs_8.js';
3
- import { g as RelayError, R as RelayClient, m as SubmissionDraft } from '../client-bX3oTpRu.js';
4
- import { P as Page, G as collectionViewSchema, l as QuestView, a as CreatorAccountProvider, i as QuestOutcomeQuery, g as QuestOutcome } from '../pages-BlLqB8ZQ.js';
5
- export { C as CreatorAccount, b as CreatorAccounts } from '../pages-BlLqB8ZQ.js';
3
+ import { g as RelayError, R as RelayClient, m as SubmissionDraft } from '../client-3b9HjSzZ.js';
4
+ import { P as Page, H as collectionViewSchema, l as QuestView, a as CreatorAccountProvider, i as QuestOutcomeQuery, g as QuestOutcome } from '../pages-ChDVLrgR.js';
5
+ export { C as CreatorAccount, b as CreatorAccounts } from '../pages-ChDVLrgR.js';
6
6
  import * as react from 'react';
7
7
  import { ReactNode } from 'react';
8
- import { J as JSONType } from '../util.d-w9f9t3ua.js';
9
- import { z } from 'zod';
10
- import { E as Entitlement, a as AttemptStatus, f as PointEntry, e as PointBalances, j as PointLedgerReference, T as TieredRewardReference } from '../schema-C4m9RhCR.js';
11
- import { a as AuthProvider, A as AccountConnection } from '../accounts-DRPENuZe.js';
12
- export { T as TelegramAccountConnection, b as TelegramSignInMethods } from '../accounts-DRPENuZe.js';
13
- import { c as SignInMethods, C as CosmosChains, d as SignInOption, f as SignInUnavailable, T as TelegramSignInOption, g as SignInWallet, D as DiscoveredWallet } from '../telegram-browser-Bh3i0HiH.js';
14
- export { a as EmailSignInOption, O as OAuthSignInOption, b as SignInIcon, W as WalletSignInOption, t as telegramMiniAppInitData } from '../telegram-browser-Bh3i0HiH.js';
15
- import { f as WalletSigner, d as WalletSignInNetwork, L as LinkedWallet } from '../wallet-Ac7OFpOr.js';
16
- import { h as LeaderboardPlacement, b0 as referralSummarySchema, g as LeaderboardPage } from '../groups-DPE004_V.js';
17
- import { f as ProfileUpdate, e as ProfileSummary, a as ProfileCompletion, d as ProfileReferral } from '../profiles-BoOK03cR.js';
18
- import '../submission-input-wTiYGdgA.js';
8
+ import * as z from 'zod';
9
+ import { z as z$1 } from 'zod';
10
+ import { E as Entitlement, a as AttemptStatus, f as PointEntry, e as PointBalances, j as PointLedgerReference, T as TieredRewardReference } from '../schema-BA0nRRlt.js';
11
+ import { a as AuthProvider, A as AccountConnection } from '../accounts-CVonEkdb.js';
12
+ export { T as TelegramAccountConnection, b as TelegramSignInMethods } from '../accounts-CVonEkdb.js';
13
+ import { c as SignInMethods, C as CosmosChains, d as SignInOption, f as SignInUnavailable, T as TelegramSignInOption, g as SignInWallet, D as DiscoveredWallet } from '../telegram-browser-o3OIxGrJ.js';
14
+ export { a as EmailSignInOption, O as OAuthSignInOption, b as SignInIcon, W as WalletSignInOption, t as telegramMiniAppInitData } from '../telegram-browser-o3OIxGrJ.js';
15
+ import { m as WalletSigner, k as WalletSignInNetwork, L as LinkedWallet, g as ProfileUpdate, f as ProfileSummary, b as ProfileCompletion, e as ProfileReferral } from '../wallet-B06zvDXp.js';
16
+ import { h as LeaderboardPlacement, b2 as referralSummarySchema, g as LeaderboardPage } from '../groups-CFuTfFqG.js';
17
+ import '../submission-input-DxQ6RnKo.js';
19
18
  import '../action-DBzILFx9.js';
20
19
 
21
20
  /**
@@ -298,7 +297,7 @@ type MutationOptions<TData, TVariables> = {
298
297
  */
299
298
  declare function useRelayMutation<TData = unknown, TVariables = void>(mutation: (variables: TVariables, context: MutationContext) => Promise<TData>, options?: MutationOptions<TData, TVariables>): Mutation<TData, TVariables>;
300
299
 
301
- type Collection = z.infer<typeof collectionViewSchema>;
300
+ type Collection = z$1.infer<typeof collectionViewSchema>;
302
301
  /** The participant's quests and collections, as `useExperience().data` holds them. */
303
302
  type ExperienceData = {
304
303
  entitlements: Entitlement[];
@@ -394,8 +393,8 @@ declare const relayKeys: {
394
393
  */
395
394
  declare function useEntitlements(options?: QueryOptions): MemberQuery<{
396
395
  items: ({
397
- [x: string]: unknown;
398
- status: "available";
396
+ status: "unsupported";
397
+ reportedStatus: string;
399
398
  id: string;
400
399
  member: string;
401
400
  reward: {
@@ -421,9 +420,7 @@ declare function useEntitlements(options?: QueryOptions): MemberQuery<{
421
420
  revision: number;
422
421
  } | {
423
422
  [x: string]: unknown;
424
- status: "handing-over";
425
- handover: string;
426
- startedAt: number;
423
+ status: "available";
427
424
  id: string;
428
425
  member: string;
429
426
  reward: {
@@ -447,17 +444,11 @@ declare function useEntitlements(options?: QueryOptions): MemberQuery<{
447
444
  earnedTier: string;
448
445
  tier: string;
449
446
  revision: number;
450
- allocation?: {
451
- [x: string]: unknown;
452
- item: string;
453
- label: string;
454
- } | undefined;
455
447
  } | {
456
448
  [x: string]: unknown;
457
- status: "collected";
449
+ status: "handing-over";
458
450
  handover: string;
459
451
  startedAt: number;
460
- collectedAt: number;
461
452
  id: string;
462
453
  member: string;
463
454
  reward: {
@@ -486,16 +477,12 @@ declare function useEntitlements(options?: QueryOptions): MemberQuery<{
486
477
  item: string;
487
478
  label: string;
488
479
  } | undefined;
489
- recovery?: {
490
- completion: string;
491
- reason: string;
492
- flaggedAt: number;
493
- remainingTier: string | null;
494
- } | undefined;
495
480
  } | {
496
481
  [x: string]: unknown;
497
- status: "void";
498
- voidedAt: number;
482
+ status: "collected";
483
+ handover: string;
484
+ startedAt: number;
485
+ collectedAt: number;
499
486
  id: string;
500
487
  member: string;
501
488
  reward: {
@@ -519,9 +506,21 @@ declare function useEntitlements(options?: QueryOptions): MemberQuery<{
519
506
  earnedTier: string;
520
507
  tier: string;
521
508
  revision: number;
509
+ allocation?: {
510
+ [x: string]: unknown;
511
+ item: string;
512
+ label: string;
513
+ } | undefined;
514
+ recovery?: {
515
+ completion: string;
516
+ reason: string;
517
+ flaggedAt: number;
518
+ remainingTier: string | null;
519
+ } | undefined;
522
520
  } | {
523
- status: "unsupported";
524
- reportedStatus: string;
521
+ [x: string]: unknown;
522
+ status: "void";
523
+ voidedAt: number;
525
524
  id: string;
526
525
  member: string;
527
526
  reward: {
@@ -554,7 +553,15 @@ declare function useEntitlements(options?: QueryOptions): MemberQuery<{
554
553
  */
555
554
  declare function useDeliveries(options?: QueryOptions): MemberQuery<{
556
555
  items: ({
557
- [x: string]: JSONType;
556
+ kind: "unknown";
557
+ reportedKind: string;
558
+ id: string;
559
+ status: string;
560
+ at: number | null;
561
+ quest: string | null;
562
+ completion: string | null;
563
+ } | {
564
+ [x: string]: z.JSONType;
558
565
  kind: "points";
559
566
  ledger: {
560
567
  id: string;
@@ -572,8 +579,8 @@ declare function useDeliveries(options?: QueryOptions): MemberQuery<{
572
579
  [x: string]: unknown;
573
580
  kind: "tier";
574
581
  entitlement: {
575
- [x: string]: unknown;
576
- status: "available";
582
+ status: "unsupported";
583
+ reportedStatus: string;
577
584
  id: string;
578
585
  member: string;
579
586
  reward: {
@@ -599,9 +606,7 @@ declare function useDeliveries(options?: QueryOptions): MemberQuery<{
599
606
  revision: number;
600
607
  } | {
601
608
  [x: string]: unknown;
602
- status: "handing-over";
603
- handover: string;
604
- startedAt: number;
609
+ status: "available";
605
610
  id: string;
606
611
  member: string;
607
612
  reward: {
@@ -625,17 +630,11 @@ declare function useDeliveries(options?: QueryOptions): MemberQuery<{
625
630
  earnedTier: string;
626
631
  tier: string;
627
632
  revision: number;
628
- allocation?: {
629
- [x: string]: unknown;
630
- item: string;
631
- label: string;
632
- } | undefined;
633
633
  } | {
634
634
  [x: string]: unknown;
635
- status: "collected";
635
+ status: "handing-over";
636
636
  handover: string;
637
637
  startedAt: number;
638
- collectedAt: number;
639
638
  id: string;
640
639
  member: string;
641
640
  reward: {
@@ -664,16 +663,12 @@ declare function useDeliveries(options?: QueryOptions): MemberQuery<{
664
663
  item: string;
665
664
  label: string;
666
665
  } | undefined;
667
- recovery?: {
668
- completion: string;
669
- reason: string;
670
- flaggedAt: number;
671
- remainingTier: string | null;
672
- } | undefined;
673
666
  } | {
674
667
  [x: string]: unknown;
675
- status: "void";
676
- voidedAt: number;
668
+ status: "collected";
669
+ handover: string;
670
+ startedAt: number;
671
+ collectedAt: number;
677
672
  id: string;
678
673
  member: string;
679
674
  reward: {
@@ -697,9 +692,21 @@ declare function useDeliveries(options?: QueryOptions): MemberQuery<{
697
692
  earnedTier: string;
698
693
  tier: string;
699
694
  revision: number;
695
+ allocation?: {
696
+ [x: string]: unknown;
697
+ item: string;
698
+ label: string;
699
+ } | undefined;
700
+ recovery?: {
701
+ completion: string;
702
+ reason: string;
703
+ flaggedAt: number;
704
+ remainingTier: string | null;
705
+ } | undefined;
700
706
  } | {
701
- status: "unsupported";
702
- reportedStatus: string;
707
+ [x: string]: unknown;
708
+ status: "void";
709
+ voidedAt: number;
703
710
  id: string;
704
711
  member: string;
705
712
  reward: {
@@ -730,14 +737,14 @@ declare function useDeliveries(options?: QueryOptions): MemberQuery<{
730
737
  quest: string | null;
731
738
  completion: string | null;
732
739
  } | {
733
- [x: string]: JSONType | undefined;
740
+ [x: string]: z.JSONType | undefined;
734
741
  kind: "integration";
735
742
  provider: string;
736
743
  action: string;
737
744
  deliveredAt: number | null;
738
745
  revokedAt: number | null;
739
746
  reconciliation: {
740
- [x: string]: JSONType;
747
+ [x: string]: z.JSONType;
741
748
  status: string;
742
749
  ownership: string;
743
750
  at: number;
@@ -748,14 +755,6 @@ declare function useDeliveries(options?: QueryOptions): MemberQuery<{
748
755
  quest: string | null;
749
756
  completion: string | null;
750
757
  roleId?: string | undefined;
751
- } | {
752
- kind: "unknown";
753
- reportedKind: string;
754
- id: string;
755
- status: string;
756
- at: number | null;
757
- quest: string | null;
758
- completion: string | null;
759
758
  })[];
760
759
  }>;
761
760
 
@@ -2393,7 +2392,7 @@ declare function useProfileCompletions(profile: string, options?: {
2393
2392
  limit?: number;
2394
2393
  }): PagedQuery<ProfileCompletion>;
2395
2394
 
2396
- type ReferralSummary = z.infer<typeof referralSummarySchema>;
2395
+ type ReferralSummary = z$1.infer<typeof referralSummarySchema>;
2397
2396
  /**
2398
2397
  * Keeps an invitation code from the landing URL (`?ref=CODE` by default)
2399
2398
  * through sign-in, including the round trip to an OAuth provider.
@@ -9,20 +9,20 @@ import {
9
9
  readSignInMethods,
10
10
  signInOptionsFrom,
11
11
  telegramMiniAppInitData
12
- } from "../chunk-OTITLABX.js";
13
- import "../chunk-NK6EER33.js";
12
+ } from "../chunk-2LKGAL63.js";
13
+ import "../chunk-577DG2IT.js";
14
14
  import {
15
15
  createRelayAction
16
- } from "../chunk-INSWI2VZ.js";
17
- import "../chunk-RBPMT53S.js";
18
- import "../chunk-BJYMTCWG.js";
19
- import "../chunk-VSHV7FEA.js";
16
+ } from "../chunk-KYUQEZZA.js";
17
+ import "../chunk-6U5WWH3W.js";
18
+ import "../chunk-UEMLYPKJ.js";
19
+ import "../chunk-XGXDINGM.js";
20
20
  import "../chunk-KDR2VAJP.js";
21
- import "../chunk-KBVH4XZC.js";
22
- import "../chunk-ABJ4G47X.js";
21
+ import "../chunk-R4S6BFOH.js";
22
+ import "../chunk-TZJT5CRF.js";
23
23
  import {
24
24
  sessionMember
25
- } from "../chunk-QNQNKIAA.js";
25
+ } from "../chunk-EQF4ID47.js";
26
26
  import {
27
27
  RelayError,
28
28
  RelayErrorCode,
@@ -30,7 +30,7 @@ import {
30
30
  clientError,
31
31
  isRelayError,
32
32
  isRequestError
33
- } from "../chunk-BHHUSBSD.js";
33
+ } from "../chunk-AWWCEP7F.js";
34
34
 
35
35
  // src/react/context.ts
36
36
  import { createContext, useContext } from "react";
@@ -1 +1 @@
1
- import{$ as L,B as z,C as re,Cc as qe,D as te,Dc as Ee,E as ne,Ec as Me,Fc as N,Gc as Ce,Gd as Q,Hb as we,Id as j,Jf as Ge,Ka as I,Kb as ve,Kc as S,Kf as Ve,La as ue,Ld as De,Ma as P,Na as me,Nc as pr,Nh as br,Og as Fe,Qb as ur,Rb as mr,Re as Ie,S as ae,T as oe,Td as U,Uc as y,Ue as Pe,Vc as ze,Vd as Te,Ve as Oe,W as se,Wc as q,We as Be,X as T,Xe as Ke,Yc as hr,Ye as Ne,Ze as Qe,_ as ce,a as R,aa as ie,be as Le,cb as le,da as de,eg as Ze,fb as pe,gc as lr,if as wr,jc as ye,jf as vr,kb as he,kc as be,lf as yr,md as gr,nd as fr,nh as He,ob as ge,od as kr,og as _e,pd as je,pg as We,qd as $e,qf as Ue,qg as G,r as F,s as H,sd as Re,t as J,tc as O,u as X,uc as x,ud as xe,v as Y,vb as fe,w as ee,wd as Ae,xb as ke,xc as B,yc as K,zc as Se}from"./chunks/NDB42VFF.js";import{Vb as D,Wb as W,hc as $,nb as M,pa as A,pc as C,td as dr,vb as _}from"./chunks/IDOMZWRY.js";function Je(e){if(!Number.isInteger(e)||e<0||e>255)throw new Error("Token decimals must be an integer from 0 to 255")}function Sr(e,t){Je(t);let r=/^(\d+)(?:\.(\d+))?$/.exec(e.trim());if(!r)throw new Error(`Use a decimal amount such as "1.5", not "${e}"`);let[,n,s=""]=r,c=s.replace(/0+$/,"");if(c.length>t)throw new Error(`"${e}" has more than ${t} decimal places, which this token cannot hold`);return BigInt(n+c.padEnd(t,"0"))}function qr(e,t){Je(t);let r=typeof e=="bigint"?e:BigInt(e),n=r<0n?"-":"",s=(r<0n?-r:r).toString().padStart(t+1,"0"),c=s.slice(0,s.length-t),i=s.slice(s.length-t).replace(/0+$/,"");return n+c+(i?"."+i:"")}function Ye(e,t={}){let{trigger:r,completion:n,requires:s,performance:c,retryCooldownMs:i,completionCooldownMs:d}=e,a=r.kind==="automatic"?r.tracker:void 0,p=a?.content===!0;if(c&&!p)throw new Error("Performance requires a content quest");if(p){if(n.kind!=="keyed")throw new Error("Content quests complete once per content item");if(a.beneficiary!=="author"||a.on!=="new-record")throw new Error("A content quest pays each content item's author and fires on its first observation")}if(i!==void 0&&(r.kind!=="manual"||r.actor==="staff"))throw new Error("A retry cooldown applies only to quests members submit themselves");if(d!==void 0){if(r.kind!=="manual"||r.actor==="staff")throw new Error("A completion cooldown applies only to quests members submit themselves");if(n.kind==="once")throw new Error("A completion cooldown needs a quest members can complete more than once: this one completes once per member")}if(r.kind==="automatic"&&!a){if(!t.template&&s.length===0)throw new Error("Automatic quests need at least one prerequisite");if(n.kind!=="once")throw new Error("Prerequisite-only automatic quests complete once")}}var Er=["author"],Mr=["author","messageAuthor"];function er(e){if(!de(e))return[];switch(e.kind){case"x-search":return ae;case"discord-messages":return Er;case"discord-reactions":return Mr;case"custom":return["author",...e.accounts??[]]}}var Xe=new Map;function Cr(e){let t=e.kind==="discord-messages"&&e.text?"messages-text":e.kind,r=Xe.get(t);return r||(r=z(t==="messages-text"?X:t==="discord-messages"?J:Y),Xe.set(t,r)),r}function rr(e){switch(e.kind){case"x-search":return;case"discord-messages":case"discord-reactions":return Cr(e);case"custom":return e.data}}function Wr(e){return y("badge",Ze.parse(e))}function Fr(e){return y("ledger",Ue.parse(e))}function Hr(e){let{target:t,ledger:r,...n}=e,s=_e.parse({...n,qualifiedBy:e.qualifiedBy.key,balance:q(r)}),c=$(C(e.metrics),G.shape.target);return{key:s.key,describe:()=>s,score(i){let d=We.parse(i);return G.parse({target:t({metrics:c.parse(d.metrics)}),baseline:t({metrics:c.parse(d.baseline)})})}}}var jr=e=>{if("timeZone"in e)throw new Error("streak() no longer takes a timeZone. Set the project timezone with calendar.timeZone in relay.json or in Console settings.");return le.strict().parse({kind:"streak",...e})},Jr=e=>ue.brand().parse({kind:"count",count:e}),Xr=(e,t={})=>P.brand().parse({kind:"calendar",period:e,...t}),Yr=({days:e})=>P.brand().parse({kind:"rolling",durationMs:e*864e5}),et=e=>({kind:"quest",quest:e});function rt(e){let{qualification:t,inviterGroup:r,milestones:n,bonuses:s,...c}=e,i=He.parse({...c,qualification:t.kind==="quest"?{kind:"quest",quest:t.quest.key}:t,...r?{inviterGroup:R.parse(r.key)}:{},milestones:n?.map(({key:d,...a})=>({...a,id:S({key:d,...a})})),bonuses:s?.map(({key:d,ledger:a,quests:p,...g})=>({...g,id:S({key:d,...g}),balance:q(a),quests:p?.map(o=>o.key)}))});return y("referral",i)}function tt(e={}){return{kind:"earned",...e}}function nt(e){let{ledger:t,group:r,score:n,settle:s,...c}=e,i=s?.pool,d=Fe.parse({...c,...s?{settle:{...s,prizes:s.prizes??[],...i?{pool:{...i,...i.ledger===void 0?{}:{ledger:q(i.ledger)}}}:{}}}:{},balance:q(t),...r?{group:R.parse(r.key)}:{},score:n?.kind==="earned"?{...n,quests:n.quests?.map(a=>a.key)}:n});return y("leaderboard",d)}var at={provider:"x",search:e=>se.parse({kind:"x-search",...e})};function V(e,t){let{data:r,content:n,...s}=t??{};if(n!==void 0){if(r!==void 0)throw new Error(`customSource("${e}") takes data or content, not both: a content source's records carry { body, metrics }`);if(!tr(n.body))throw new Error(`customSource("${e}") needs a content body schema: customSource(namespace, { content: { body: z.object({ ... }), metrics: ["likes"] } })`);let c=[...n.metrics??[]];for(let i of c)oe.parse(i);return T.parse({kind:"custom",namespace:e,...s,data:z(D({body:n.body,metrics:W(Object.fromEntries(c.map(i=>[i,M().int().safe().nonnegative().optional()]))).optional()})),content:{metrics:c}})}if(!tr(r))throw new Error(`customSource("${e}") needs a data schema: customSource(namespace, { data: z.object({ ... }) }) describes each record's data`);return T.parse({kind:"custom",namespace:e,...s,data:z(r)})}function tr(e){return typeof e=="object"&&e!==null&&"_zod"in e}function ot(e){return y("tracker",ie.parse(e))}function $r(e={}){return F.parse({kind:"discord-messages",...e.text?{text:!0}:{}})}function Rr(){return H.parse({kind:"discord-reactions"})}var st={provider:"discord",grantRole:e=>ee.parse({kind:"integration",provider:"discord",action:"grant-role",roleId:e}),messages:$r,reactions:Rr,roles(e={}){return x.parse({provider:"discord",resource:"role",assignable:e.assignable??!1})},channels(e={}){return x.parse({provider:"discord",resource:"channel",types:e.types??["text","announcement"]})}},ct={reactions(){return V(Ge,{identities:["member"],accounts:["messageAuthor"],data:Ve})}},it={shorts(){return V(Pe,{identities:["member"],content:{body:Oe,metrics:Be}})}},dt={videos(){return V(Ke,{identities:["member"],content:{body:Ne,metrics:Qe}})}},ut=()=>({provider:"domino",resource:"point-ledger"});function f(e,t){return t}var mt={pointLedger(e){let t={...e,kind:"point-ledger",default:e.default?R.parse(e.default.key):""};return f("point-ledger",ze.prefault(t.default).meta(t))},datetime(e){let t={...e,kind:"datetime",default:B.parse(e.default)};return f("datetime",B.default(t.default).meta(t))},resource(e){let t={...e,source:x.parse(e.source),kind:"resource",default:K.parse(e.default??"")};return f("resource",K.default(t.default).meta(t))},quiz(e){let t=O.parse(e.default);return f("quiz",O.default(t).meta({...e,default:t,kind:"quiz"}))},text(e){let t={...e,kind:"text",minLength:e.minLength??1,maxLength:e.maxLength??2e3,multiline:e.multiline??!1};return f("text",A().min(t.minLength).max(t.maxLength).default(t.default).meta(t))},telegramChat(e){let t={...e,kind:"text",default:e.default??"",minLength:0,maxLength:64,multiline:!1,picker:"telegram-chat"};return f("text",A().max(t.maxLength).default(t.default).meta(t))},amount(e){if(!qe(e.default))throw new Error(`settings.amount() takes a base-unit integer string as its default, not "${e.default}"`);let t={...e,kind:"text",minLength:1,maxLength:100,multiline:!1,picker:"amount"};return f("text",N(t).default(t.default).meta(t))},chain(e){if(!Ee(e.default))throw new Error(`settings.chain() takes "solana" or an EVM chain ID such as "eip155:8453" as its default, not "${e.default}"`);let t={...e,kind:"text",minLength:1,maxLength:64,multiline:!1,picker:"chain"};return f("text",N(t).transform(r=>r).default(t.default).meta(t))},integer(e){return f("integer",M().int().min(e.min).max(e.max).default(e.default).meta({...e,kind:"integer"}))},boolean(e){return f("boolean",_().default(e.default).meta({...e,kind:"boolean"}))},choice(e){return f("choice",C(e.options).default(e.default).meta({...e,kind:"choice"}))},object(e){return D(e).strict()}},pt=e=>xe(e.key,e.name),ht=e=>Ae(e.key,e.title),gt=(e,t)=>je.parse({kind:"points",balance:q(e),amount:t}),ft={text:(e={})=>({input:"text",constraints:ye.parse(e)}),url:(e={})=>({input:"url",constraints:be.parse(e)}),photo:()=>"photo",quiz:()=>"quiz"};function kt(e){if(e?.actor&&e.input!==void 0)throw new Error('manual() cannot combine actor "staff" with input: staff-captured evidence is not supported. Use manual({ actor: "staff" }) for a staff confirmation, or manual({ input }) for evidence the participant submits.');return typeof e?.input=="object"?{kind:"manual",...e.input}:{kind:"manual",input:e?.input??"none",...e?.actor?{actor:e.actor}:{}}}var ar=new WeakMap,or=new WeakMap;function sr(e,t){let{tracker:r,beneficiary:n="author",on:s,where:c,enrollment:i,since:d,historical:a,content:p}=e;if(!r?.source)throw new Error(t==="automatic"?"automatic() takes no argument, or { tracker } with a tracker handle from defineTracker":"content() takes { tracker } with a tracker handle from defineTracker");let{source:g}=r;if(!ce(g))throw new Error('Tracker triggers need attributable records: declare customSource(namespace, { identities: ["wallet"] }) or other identity kinds');if(p&&!L(g))throw new Error(`content() needs a tracker whose source has content: x.search(), or customSource(namespace, { content: { body, metrics } }). Tracker "${r.key}" has none; use automatic({ tracker }) instead.`);if(d==="enrollment"&&i!=="required")throw new Error(`${t}() counts from enrollment only on a quest that requires it: add enrollment: "required"`);let o=er(g);if(!o.includes(n))throw new Error(g.kind==="custom"?`Tracker "${r.key}" has no "${n}" account: declare it in customSource(namespace, { accounts: ["${n}"] })`:`Tracker "${r.key}" pays ${o.map(l=>`"${l}"`).join(" or ")}, not "${n}"`);let u=ge.parse({tracker:r.key,source:g.kind,on:p?"new-record":s??pe(g.kind),...c?{where:c}:{},beneficiary:n,...i==="required"?{enrollment:i}:{},...d&&d!=="activation"?{since:d}:{},...a&&a!==(p?"claim":"staff")?{historical:a}:{},...p?{content:p}:{}}),m=rr(g),v=m?ne(m,u.where):null;if(v)throw new Error(v);let w={kind:"automatic",tracker:u};m&&ar.set(w,m);let h=L(g);return h&&or.set(w,h.metrics),w}function wt(e){return e?sr(e,"automatic"):{kind:"automatic"}}function vt(e){if(e&&typeof e=="object"&&"source"in e&&"key"in e&&!("tracker"in e))throw new Error("content() takes { tracker }: write content({ tracker: posts }) instead of content(posts)");return sr({...e,content:!0},"content")}var yt=e=>{let{key:t,cost:r,...n}=e;return we.parse({...n,id:S(e),cost:typeof r=="number"?r:{balance:q(r.ledger)}})},xr=e=>({kind:"keyed",key:e}),Ar=e=>{let{distinct:t,...r}=e;return{...me.parse({kind:"progress",window:{kind:"lifetime"},...r}),distinct:t}},bt=()=>({kind:"untracked"}),St=()=>({kind:"staff-handover"}),qt=()=>({kind:"automatic"});function Et(e){let{key:t,tiers:r,...n}=e,s=S(e),c=$e.parse({id:s,...n,tiers:r.map(({key:i,...d})=>({...d,id:S({key:i,...d})}))});return y("tiered-reward",{key:c.id,tier:i=>Re.parse({kind:"tier",reward:c,tier:i})})}var Dr=()=>({kind:"once"});function Tr(e={}){return{kind:"accept",...e}}function Lr(e){return{kind:"review",...e}}var E={accept:Tr,defer:e=>({kind:"defer",...e}),progress:e=>({kind:"progress",...e}),reject:e=>({kind:"reject",...e}),review:Lr};function nr(e){let t=e.kind==="reject"&&e.code!==void 0?ke(e.code):null;if(t)throw new Error(t)}var Mt={quiz(e,t={}){let r=Le.parse(e),n=Object.keys(r),s=M().int().min(1).max(n.length).parse(t.minimumCorrect??n.length);return async({input:c})=>{let i=Object.keys(c.answers).length===n.length&&n.every(a=>Object.hasOwn(c.answers,a)),d=n.filter(a=>c.answers[a]===r[a]).length;return i&&d>=s?E.accept():E.reject({reason:"Review your answers and try again."})}},photo(e){return async t=>{let r=e(t),n=await t.review.photo({image:t.input.photo,criteria:r.criteria});return n.kind==="unclear"?r.unclear==="human-review"?E.review({reason:n.reason}):E.reject({reason:n.reason}):n.kind==="pass"?E.accept():E.reject({reason:n.reason})}}},Ir={once:Dr,keyed:xr,streak:jr,progress:Ar};function cr(e){return function(r){let n=S(r),s=[...new Set((r.integrations??[]).map(o=>ve.parse(o.provider)))],c=r.trigger.kind==="automatic"&&r.trigger.tracker?.content===!0,i=r.trigger.kind==="automatic"&&r.trigger.tracker!==void 0,d=r.completion,a=typeof d=="function"?d(Ir):d;if(c&&a!==void 0)throw new Error("A content quest completes once per content item: remove its completion");if(!c&&a===void 0)throw new Error("A quest needs a completion, such as once(), keyed(...), streak(...) or progress(...)");if(Ye({trigger:r.trigger,completion:a??{kind:"keyed"},requires:r.requires??[],performance:r.performance?I.parse({metrics:r.performance.metrics,maxAgeMs:r.performance.maxAgeMs}):void 0,...r.retryCooldownMs===void 0?{}:{retryCooldownMs:r.retryCooldownMs},...r.completionCooldownMs===void 0?{}:{completionCooldownMs:r.completionCooldownMs}},{template:e}),r.retryCooldownMs!==void 0&&!Q.safeParse(r.retryCooldownMs).success)throw new Error("retryCooldownMs must be whole milliseconds from 1000 (one second) to 604800000 (seven days)");if(r.completionCooldownMs!==void 0&&!Q.safeParse(r.completionCooldownMs).success)throw new Error("completionCooldownMs must be whole milliseconds from 1000 (one second) to 604800000 (seven days)");if(r.performance){let o=or.get(r.trigger)??[],u=r.performance.metrics.filter(m=>!o.includes(m));if(u.length)throw new Error(`The tracker's source does not measure ${u.join(", ")}`)}if(r.trigger.kind==="manual"&&r.trigger.input!=="none"&&!r.evaluate)throw new Error("Evidence quests require an evaluator");let p=Object.fromEntries(Object.entries(r.settings.shape).map(([o,u])=>{let m=Se.safeParse(u.meta());if(!m.success)throw new Error(`Setting "${o}" is not a quest setting: build it with a settings builder, such as settings.integer({ label, default, min, max })`);return[o,m.data]}));for(let o of he(r.trigger.kind==="automatic"?r.trigger.tracker?.where:void 0))if(!Me(p[o]))throw new Error(`The tracker filter compares with setting "${o}", which is not an integer or amount setting`);function g(o){let u=r.settings.parse(o),m=Ce(p,u),v=De.parse(typeof r.rewards=="function"?r.rewards({settings:u}):r.rewards),w=[...v.flatMap(h=>h.kind==="integration"?[h.provider]:[]),...Object.values(p).flatMap(h=>h.kind==="resource"&&h.source.provider!=="domino"?[h.source.provider]:[])];for(let h of w)if(!s.includes(h))throw new Error(`Declare the ${h} integration on this quest`);return Te.parse({quest:n,evaluatorProtocol:U,title:typeof r.title=="function"?r.title({settings:u}):r.title,presentation:r.presentation?.({settings:u})??{},fields:p,values:m,rewards:v,humanReview:r.review?.({settings:u})?.enabled??!0,trigger:r.trigger,...r.performance?{performance:I.parse({metrics:r.performance.metrics,maxAgeMs:r.performance.maxAgeMs})}:{},integrations:s,completion:a?a.kind==="progress"?{kind:a.kind,goal:a.goal,window:a.window,repeat:a.repeat}:a.kind==="streak"?a:{kind:a.kind}:{kind:"keyed"},visibility:r.visibility??"visible",profile:r.profile??{visible:!1},budgets:r.budgets??[],requires:r.requires??[],...r.campaign?{campaign:r.campaign}:{},...r.availability?{availability:r.availability}:{},...r.retryCooldownMs===void 0?{}:{retryCooldownMs:r.retryCooldownMs},...r.completionCooldownMs===void 0?{}:{completionCooldownMs:r.completionCooldownMs}})}return y("quest",{protocol:U,key:n,describe:g,async evaluate(o){let u=r.settings.parse(o.settings),m=i?fe.parse(o.tracker):null,v=ar.get(r.trigger),w=m&&v?re(v,m.record.data):null;if(w)return j.parse({kind:"reject",reason:`The record's data does not match the data schema this quest was built with: ${w.path} ${w.reason}`});let h=m;if(o.performance){if(!r.performance)throw new Error("Quest has no performance evaluator");let b=Ie.parse(o.performance),ir=$(C(r.performance.metrics),M().int().safe().nonnegative()).parse(b.metrics),k=await r.performance.evaluate({settings:u,member:o.member,tracker:h,metrics:ir,observedAt:b.observedAt});if(!k)throw new Error("Performance evaluator returned no decision");if(k.rewards!==void 0)throw new Error("A performance evaluator cannot select rewards. It gates the rewards content evaluation selected: return accept, review or reject with a reason only.");return nr(k),j.parse(k.kind==="accept"?{kind:"accept",rewards:b.rewards}:k.kind==="review"&&o.humanReview?{kind:"review",reason:k.reason,rewards:b.rewards}:{kind:"reject",reason:k.reason,...k.kind==="review"?{requestedReview:!0}:k.code===void 0?{}:{code:k.code}})}let l=r.evaluate?await r.evaluate({settings:u,member:o.member,input:o.input,tracker:h,eligibleAt:o.eligibleAt,calendar:o.calendar,now:o.now,review:o.review,trackers:te(o.trackers),wallet:o.wallet,images:o.images,...o.telegram?{telegram:o.telegram}:{},...Object.fromEntries(s.map(b=>[b,o[b]]))}):E.accept();if(!l)throw new Error("Evaluator returned no decision");if(nr(l),l.kind==="review"&&!o.humanReview)return j.parse({kind:"reject",reason:l.reason,requestedReview:!0});(l.kind==="accept"||l.kind==="review")&&l.completionKey!==void 0&&a?.kind!=="keyed"&&o.diagnose?.({code:"completion-key-ignored",message:Pr(a,l.completionKey)});let Z={...o,settings:u,tracker:m};return j.parse(l.kind==="accept"||l.kind==="review"?{...l,rewards:l.rewards??o.rewards,...a?.kind==="keyed"||a?.kind==="progress"?{completionKey:a.kind==="progress"?a.distinct(Z):l.completionKey??a.key(Z)}:{}}:l)}})}}function Pr(e,t){let r=`ignores completionKey ${JSON.stringify(t)}`;switch(e?.kind){case void 0:return`A content quest completes once per content item, under a key Relay sets, so it ${r}`;case"once":return`once() completes the quest once per member and ${r}: use keyed(...) to complete it once per key`;case"streak":return`streak(...) keys its own completions and ${r}`;case"progress":return`progress(...) keys each contribution with its distinct(...) and ${r}: derive the key in distinct(...)`}}var Ct=cr(!1),zt=cr(!0);export{yr as CapabilityError,wt as automatic,qt as automaticFulfillment,pt as badge,fr as balanceAtLeast,yt as budget,Xr as calendar,vr as capabilityErrorCodes,gr as completed,vt as content,mr as cosmosDenomSchema,ur as cosmosNetworkSchema,Jr as count,V as customSource,E as decision,Wr as defineBadge,pr as defineCampaign,wr as defineDashboard,Hr as defineEngagementReward,hr as defineGroup,nt as defineLeaderboard,Fr as defineLedger,br as defineOffer,Ct as defineQuest,zt as defineQuestType,rt as defineReferral,Et as defineTieredReward,ot as defineTracker,st as discord,tt as earned,Mt as evaluators,ft as evidence,qr as formatUnits,ht as groupMembership,kr as inGroup,lr as isEvmChainId,xr as keyed,kt as manual,Dr as once,Sr as parseUnits,ut as pointLedgers,gt as points,Ar as progress,et as questCompleted,Yr as rolling,mt as settings,St as staffHandover,jr as streak,ct as telegram,dt as tiktok,z as trackerDataSchema,fe as trackerTriggerContextSchema,bt as untracked,at as x,it as youtube,dr as z};
1
+ import{$b as Me,$c as U,$d as We,Ad as At,Af as Ye,B as $,Bf as et,C as re,Cc as Mt,D as ae,Dc as Re,E as ne,Ec as $t,F as oe,Fb as Se,Fc as zt,G as se,Ge as _e,H as ce,Hb as Ee,Hc as Ae,I as ie,Ig as nt,J as de,Kc as jt,Lc as Lt,Mf as It,Nc as Te,Nf as Bt,Oc as De,Pf as Ot,Rb as qe,Rd as Tt,Rh as it,Sd as Dt,Sg as ot,Td as Pt,Tg as st,Ua as B,Ub as Ce,Ud as Ue,Uf as tt,Ug as W,Va as pe,Vd as Ve,Wa as O,X as ue,Xa as ke,Xc as K,Xd as Ze,Y as le,Yb as xe,Yc as T,Zd as Qe,_b as Et,a as R,aa as me,ad as V,ba as A,bc as N,bd as Pe,ea as fe,ed as Ie,fa as I,fd as Be,ga as he,gd as Oe,hd as S,id as Ne,ja as ge,je as Z,le as z,lg as rt,mb as we,md as E,mg as at,oe as Fe,pb as ve,pd as Rt,pi as Nt,qc as $e,qh as ct,r as H,s as J,t as X,tc as ze,u as Y,ub as be,uc as qt,v as ee,vc as je,vf as He,w as te,wd as b,we as Q,xc as Ct,xd as Ke,yb as ye,yc as xt,yd as q,ye as Ge,yf as Je,zc as Le,zf as Xe}from"./chunks/BG43KQ2T.js";import{Cb as x,Ec as M,Kb as G,Pd as St,ic as P,jc as _,va as D,wc as L}from"./chunks/EWU4OKSY.js";function dt(e){if(!Number.isInteger(e)||e<0||e>255)throw new Error("Token decimals must be an integer from 0 to 255")}function Kt(e,r){dt(r);let t=/^(\d+)(?:\.(\d+))?$/.exec(e.trim());if(!t)throw new Error(`Use a decimal amount such as "1.5", not "${e}"`);let[,a,s=""]=t,c=s.replace(/0+$/,"");if(c.length>r)throw new Error(`"${e}" has more than ${r} decimal places, which this token cannot hold`);return BigInt(a+c.padEnd(r,"0"))}function Ut(e,r){dt(r);let t=typeof e=="bigint"?e:BigInt(e),a=t<0n?"-":"",s=(t<0n?-t:t).toString().padStart(r+1,"0"),c=s.slice(0,s.length-r),i=s.slice(s.length-r).replace(/0+$/,"");return a+c+(i?"."+i:"")}function lt(e,r={}){let{trigger:t,completion:a,requires:s,performance:c,retryCooldownMs:i,completionCooldownMs:d}=e,n=t.kind==="automatic"?t.tracker:void 0,f=n?.content===!0;if(c&&!f)throw new Error("Performance requires a content quest");if(f){if(a.kind!=="keyed")throw new Error("Content quests complete once per content item");if(n.beneficiary!=="author"||n.on!=="new-record")throw new Error("A content quest pays each content item's author and fires on its first observation")}if(i!==void 0&&(t.kind!=="manual"||t.actor==="staff"))throw new Error("A retry cooldown applies only to quests members submit themselves");if(d!==void 0){if(t.kind!=="manual"||t.actor==="staff")throw new Error("A completion cooldown applies only to quests members submit themselves");if(a.kind==="once")throw new Error("A completion cooldown needs a quest members can complete more than once: this one completes once per member")}if(t.kind==="automatic"&&!n){if(!r.template&&s.length===0)throw new Error("Automatic quests need at least one prerequisite");if(a.kind!=="once")throw new Error("Prerequisite-only automatic quests complete once")}}var Vt=["author"],Zt=["author","messageAuthor"];function mt(e){if(!ge(e))return[];switch(e.kind){case"x-search":return ue;case"discord-messages":return Vt;case"discord-reactions":return Zt;case"custom":return["author",...e.accounts??[]]}}var ut=new Map;function Qt(e){let r=e.kind==="discord-messages"&&e.text?"messages-text":e.kind,t=ut.get(r);return t||(t=$(r==="messages-text"?Y:r==="discord-messages"?X:ee),ut.set(r,t)),t}function ft(e){switch(e.kind){case"x-search":return;case"discord-messages":case"discord-reactions":return Qt(e);case"custom":return e.data}}function hr(e){return b("badge",nt.parse(e))}function gr(e){return b("ledger",tt.parse(e))}function pr(e){let{target:r,ledger:t,...a}=e,s=ot.parse({...a,qualifiedBy:e.qualifiedBy.key,balance:q(t)}),c=L(M(e.metrics),W.shape.target);return{key:s.key,describe:()=>s,score(i){let d=st.parse(i);return W.parse({target:r({metrics:c.parse(d.metrics)}),baseline:r({metrics:c.parse(d.baseline)})})}}}var Ft=e=>{if("timeZone"in e)throw new Error("streak() no longer takes a timeZone. Set the project timezone with calendar.timeZone in relay.json or in Console settings.");return we.strict().parse({kind:"streak",...e})},kr=e=>pe.brand().parse({kind:"count",count:e}),wr=(e,r={})=>O.brand().parse({kind:"calendar",period:e,...r}),vr=({days:e})=>O.brand().parse({kind:"rolling",durationMs:e*864e5}),br=e=>({kind:"quest",quest:e});function yr(e){let{qualification:r,inviterGroup:t,milestones:a,bonuses:s,...c}=e,i=it.parse({...c,qualification:r.kind==="quest"?{kind:"quest",quest:r.quest.key}:r,...t?{inviterGroup:R.parse(t.key)}:{},milestones:a?.map(({key:d,...n})=>({...n,id:E({key:d,...n})})),bonuses:s?.map(({key:d,ledger:n,quests:f,...p})=>({...p,id:E({key:d,...p}),balance:q(n),quests:f?.map(o=>o.key)}))});return b("referral",i)}function Sr(e={}){return{kind:"earned",...e}}function Er(e){let{ledger:r,group:t,score:a,settle:s,...c}=e,i=s?.pool,d=ct.parse({...c,...s?{settle:{...s,prizes:s.prizes??[],...i?{pool:{...i,...i.ledger===void 0?{}:{ledger:q(i.ledger)}}}:{}}}:{},balance:q(r),...t?{group:R.parse(t.key)}:{},score:a?.kind==="earned"?{...a,quests:a.quests?.map(n=>n.key)}:a});return b("leaderboard",d)}var qr={provider:"x",search:e=>me.parse({kind:"x-search",...e})};function j(e,r){let{data:t,content:a,...s}=r??{};if(a!==void 0){if(t!==void 0)throw new Error(`customSource("${e}") takes data or content, not both: a content source's records carry { body, metrics }`);if(!ht(a.body))throw new Error(`customSource("${e}") needs a content body schema: customSource(namespace, { content: { body: z.object({ ... }), metrics: ["likes"] } })`);let c=[...a.metrics??[]];for(let i of c)le.parse(i);return A.parse({kind:"custom",namespace:e,...s,data:$(P({body:a.body,metrics:_(Object.fromEntries(c.map(i=>[i,x().int().safe().nonnegative().optional()]))).optional()})),content:{metrics:c}})}if(!ht(t))throw new Error(`customSource("${e}") needs a data schema: customSource(namespace, { data: z.object({ ... }) }) describes each record's data`);return A.parse({kind:"custom",namespace:e,...s,data:$(t)})}function ht(e){return typeof e=="object"&&e!==null&&"_zod"in e}function Cr(e){return b("tracker",he.parse(e))}function Gt(e={}){return H.parse({kind:"discord-messages",...e.text?{text:!0}:{}})}function _t(){return J.parse({kind:"discord-reactions"})}var xr={provider:"discord",grantRole:e=>te.parse({kind:"integration",provider:"discord",action:"grant-role",roleId:e}),messages:Gt,reactions:_t,roles(e={}){return T.parse({provider:"discord",resource:"role",assignable:e.assignable??!1})},channels(e={}){return T.parse({provider:"discord",resource:"channel",types:e.types??["text","announcement"]})}},Mr={messages(){return j(se,{identities:["member"],data:at})},reactions(){return j(oe,{identities:["member"],accounts:["messageAuthor"],data:rt})}},$r={shorts(){return j(ce,{identities:["member"],content:{body:Je,metrics:Xe}})}},zr={videos(){return j(ie,{identities:["member"],content:{body:Ye,metrics:et}})}};function Ht(e){let{chain:r,token:t}=e,a=t===void 0?null:t;if(a!==null&&typeof a!="string")throw new Error("wallet.balances() takes the token as a string");if(r==="solana"||r===N){if(a!==null&&!xe.safeParse(a).success)throw new Error("wallet.balances() on Solana takes an SPL or Token-2022 mint address (base58)");return{chain:N,token:a}}if(typeof r=="string"&&$e(r)){if(a!==null&&!/^0x[0-9a-fA-F]{40}$/.test(a))throw new Error("wallet.balances() on an EVM chain takes an ERC-20 contract address: 0x and 40 hex digits");return{chain:r,token:a}}if(typeof r=="string"&&/^cosmos:[-_a-zA-Z0-9]{1,32}$/.test(r)){if(a===null||!Me.safeParse(a).success)throw new Error("wallet.balances() on a Cosmos chain takes a bank denomination such as uatom");return{chain:r,token:a}}throw new Error('wallet.balances() reads "solana", an EVM chain such as "eip155:8453" or a Cosmos network such as "cosmos:cosmoshub-4"')}var jr={balances(e){let r=Ht(e),t=j(de,{identities:["wallet"],data:ze});return A.parse({...t,balance:r})}},Lr=()=>({provider:"domino",resource:"point-ledger"});function g(e,r){return r}var Rr={pointLedger(e){let r={...e,kind:"point-ledger",default:e.default?R.parse(e.default.key):""};return g("point-ledger",Ke.prefault(r.default).meta(r))},datetime(e){let r={...e,kind:"datetime",default:U.parse(e.default)};return g("datetime",U.default(r.default).meta(r))},resource(e){let r={...e,source:T.parse(e.source),kind:"resource",default:V.parse(e.default??"")};return g("resource",V.default(r.default).meta(r))},quiz(e){let r=K.parse(e.default);return g("quiz",K.default(r).meta({...e,default:r,kind:"quiz"}))},text(e){let r={...e,kind:"text",minLength:e.minLength??1,maxLength:e.maxLength??2e3,multiline:e.multiline??!1};return g("text",D().min(r.minLength).max(r.maxLength).default(r.default).meta(r))},telegramChat(e){let r={...e,kind:"text",default:e.default??"",minLength:0,maxLength:64,multiline:!1,picker:"telegram-chat"};return g("text",D().max(r.maxLength).default(r.default).meta(r))},amount(e){if(!Ie(e.default))throw new Error(`settings.amount() takes a base-unit integer string as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:100,multiline:!1,picker:"amount"};return g("text",S(r).default(r.default).meta(r))},chain(e){if(!Be(e.default))throw new Error(`settings.chain() takes "solana" or an EVM chain ID such as "eip155:8453" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:64,multiline:!1,picker:"chain"};return g("text",S(r).transform(t=>t).default(r.default).meta(r))},nft(e){if(!je(e.default))throw new Error(`settings.nft() takes an NFT collection such as "eip155:1/erc721:0x\u2026" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:200,multiline:!1,picker:"nft"};return g("text",S(r).transform(t=>t).default(r.default).meta(r))},contractCall(e){if(!Le(e.default))throw new Error(`settings.contractCall() takes a contract call such as "eip155:8453:0x\u2026 function stakedOf(address) view returns (uint256)" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:400,multiline:!1,picker:"contract-call"};return g("text",S(r).transform(t=>t).default(r.default).meta(r))},contractEvent(e){if(!Re(e.default))throw new Error(`settings.contractEvent() takes a contract event such as "eip155:1:0x\u2026 Transfer(address indexed from, address indexed to, uint256 value)" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:1e3,multiline:!1,picker:"contract-event"};return g("text",S(r).transform(t=>t).default(r.default).meta(r))},solanaProgram(e){if(!Ae(e.default))throw new Error(`settings.solanaProgram() takes a Solana program address such as "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:32,maxLength:44,multiline:!1,picker:"solana-program"};return g("text",S(r).transform(t=>t).default(r.default).meta(r))},integer(e){return g("integer",x().int().min(e.min).max(e.max).default(e.default).meta({...e,kind:"integer"}))},boolean(e){return g("boolean",G().default(e.default).meta({...e,kind:"boolean"}))},choice(e){return g("choice",M(e.options).default(e.default).meta({...e,kind:"choice"}))},object(e){return P(e).strict()}};function pt(e,r){let t=e.balanceChanges.find(a=>a.mint===r);return t?BigInt(t.delta):0n}function Tr(e,r){let t=pt(e,r);return t>0n?t.toString():"0"}function Dr(e,r){let t=pt(e,r);return t<0n?(-t).toString():"0"}function Pr(e,r={}){let t=e.balanceChanges.filter(s=>BigInt(s.delta)>0n),a=e.balanceChanges.filter(s=>BigInt(s.delta)<0n);return t.some(s=>(r.into===void 0||s.mint===r.into)&&a.some(c=>c.mint!==s.mint&&(r.from===void 0||c.mint===r.from)))}function Ir(e,r){return e.programs.includes(r)}function Br(e,r){return e.instructions?.find(t=>t.name===r)?.args??null}var Or=e=>Qe(e.key,e.name),Nr=e=>We(e.key,e.title),Kr=(e,r)=>Ue.parse({kind:"points",balance:q(e),amount:r}),Ur={text:(e={})=>({input:"text",constraints:Te.parse(e)}),url:(e={})=>({input:"url",constraints:De.parse(e)}),photo:()=>"photo",quiz:()=>"quiz"};function Vr(e){if(e?.actor&&e.input!==void 0)throw new Error('manual() cannot combine actor "staff" with input: staff-captured evidence is not supported. Use manual({ actor: "staff" }) for a staff confirmation, or manual({ input }) for evidence the participant submits.');return typeof e?.input=="object"?{kind:"manual",...e.input}:{kind:"manual",input:e?.input??"none",...e?.actor?{actor:e.actor}:{}}}var kt=new WeakMap,wt=new WeakMap;function vt(e,r){let{tracker:t,beneficiary:a="author",on:s,where:c,enrollment:i,since:d,historical:n,content:f}=e;if(!t?.source)throw new Error(r==="automatic"?"automatic() takes no argument, or { tracker } with a tracker handle from defineTracker":"content() takes { tracker } with a tracker handle from defineTracker");let{source:p}=t;if(!fe(p))throw new Error('Tracker triggers need attributable records: declare customSource(namespace, { identities: ["wallet"] }) or other identity kinds');if(f&&!I(p))throw new Error(`content() needs a tracker whose source has content: x.search(), or customSource(namespace, { content: { body, metrics } }). Tracker "${t.key}" has none; use automatic({ tracker }) instead.`);if(d==="enrollment"&&i!=="required")throw new Error(`${r}() counts from enrollment only on a quest that requires it: add enrollment: "required"`);let o=mt(p);if(!o.includes(a))throw new Error(p.kind==="custom"?`Tracker "${t.key}" has no "${a}" account: declare it in customSource(namespace, { accounts: ["${a}"] })`:`Tracker "${t.key}" pays ${o.map(m=>`"${m}"`).join(" or ")}, not "${a}"`);let u=ye.parse({tracker:t.key,source:p.kind,on:f?"new-record":s??ve(p.kind),...c?{where:c}:{},beneficiary:a,...i==="required"?{enrollment:i}:{},...d&&d!=="activation"?{since:d}:{},...n&&n!==(f?"claim":"staff")?{historical:n}:{},...f?{content:f}:{}}),l=ft(p),v=l?ne(l,u.where):null;if(v)throw new Error(v);let w={kind:"automatic",tracker:u};l&&kt.set(w,l);let h=I(p);return h&&wt.set(w,h.metrics),w}function Zr(e){return e?vt(e,"automatic"):{kind:"automatic"}}function Qr(e){if(e&&typeof e=="object"&&"source"in e&&"key"in e&&!("tracker"in e))throw new Error("content() takes { tracker }: write content({ tracker: posts }) instead of content(posts)");return vt({...e,content:!0},"content")}var Wr=e=>{let{key:r,cost:t,...a}=e;return qe.parse({...a,id:E(e),cost:typeof t=="number"?t:{balance:q(t.ledger)}})},Jt=e=>({kind:"keyed",key:e}),Xt=e=>{let{distinct:r,...t}=e;return{...ke.parse({kind:"progress",window:{kind:"lifetime"},...t}),distinct:r}},Fr=()=>({kind:"untracked"}),Gr=()=>({kind:"staff-handover"}),_r=()=>({kind:"automatic"});function Hr(e){let{key:r,tiers:t,...a}=e,s=E(e),c=Ve.parse({id:s,...a,tiers:t.map(({key:i,...d})=>({...d,id:E({key:i,...d})}))});return b("tiered-reward",{key:c.id,tier:i=>Ze.parse({kind:"tier",reward:c,tier:i})})}var Yt=()=>({kind:"once"});function er(e={}){return{kind:"accept",...e}}function tr(e){return{kind:"review",...e}}var C={accept:er,defer:e=>({kind:"defer",...e}),progress:e=>({kind:"progress",...e}),reject:e=>({kind:"reject",...e}),review:tr};function gt(e){let r=e.kind==="reject"&&e.code!==void 0?Ee(e.code):null;if(r)throw new Error(r)}var Jr={quiz(e,r={}){let t=_e.parse(e),a=Object.keys(t),s=x().int().min(1).max(a.length).parse(r.minimumCorrect??a.length);return async({input:c})=>{let i=Object.keys(c.answers).length===a.length&&a.every(n=>Object.hasOwn(c.answers,n)),d=a.filter(n=>c.answers[n]===t[n]).length;return i&&d>=s?C.accept():C.reject({reason:"Review your answers and try again."})}},photo(e){return async r=>{let t=e(r),a=await r.review.photo({image:r.input.photo,criteria:t.criteria});return a.kind==="unclear"?t.unclear==="human-review"?C.review({reason:a.reason}):C.reject({reason:a.reason}):a.kind==="pass"?C.accept():C.reject({reason:a.reason})}}},rr={once:Yt,keyed:Jt,streak:Ft,progress:Xt};function bt(e){return function(t){let a=E(t),s=[...new Set((t.integrations??[]).map(o=>Ce.parse(o.provider)))],c=t.trigger.kind==="automatic"&&t.trigger.tracker?.content===!0,i=t.trigger.kind==="automatic"&&t.trigger.tracker!==void 0,d=t.completion,n=typeof d=="function"?d(rr):d;if(c&&n!==void 0)throw new Error("A content quest completes once per content item: remove its completion");if(!c&&n===void 0)throw new Error("A quest needs a completion, such as once(), keyed(...), streak(...) or progress(...)");if(lt({trigger:t.trigger,completion:n??{kind:"keyed"},requires:t.requires??[],performance:t.performance?B.parse({metrics:t.performance.metrics,maxAgeMs:t.performance.maxAgeMs}):void 0,...t.retryCooldownMs===void 0?{}:{retryCooldownMs:t.retryCooldownMs},...t.completionCooldownMs===void 0?{}:{completionCooldownMs:t.completionCooldownMs}},{template:e}),t.retryCooldownMs!==void 0&&!Z.safeParse(t.retryCooldownMs).success)throw new Error("retryCooldownMs must be whole milliseconds from 1000 (one second) to 604800000 (seven days)");if(t.completionCooldownMs!==void 0&&!Z.safeParse(t.completionCooldownMs).success)throw new Error("completionCooldownMs must be whole milliseconds from 1000 (one second) to 604800000 (seven days)");if(t.performance){let o=wt.get(t.trigger)??[],u=t.performance.metrics.filter(l=>!o.includes(l));if(u.length)throw new Error(`The tracker's source does not measure ${u.join(", ")}`)}if(t.trigger.kind==="manual"&&t.trigger.input!=="none"&&!t.evaluate)throw new Error("Evidence quests require an evaluator");let f=Object.fromEntries(Object.entries(t.settings.shape).map(([o,u])=>{let l=Pe.safeParse(u.meta());if(!l.success)throw new Error(`Setting "${o}" is not a quest setting: build it with a settings builder, such as settings.integer({ label, default, min, max })`);return[o,l.data]}));for(let o of be(t.trigger.kind==="automatic"?t.trigger.tracker?.where:void 0))if(!Oe(f[o]))throw new Error(`The tracker filter compares with setting "${o}", which is not an integer or amount setting`);function p(o){let u=t.settings.parse(o),l=Ne(f,u),v=Fe.parse(typeof t.rewards=="function"?t.rewards({settings:u}):t.rewards),w=[...v.flatMap(h=>h.kind==="integration"?[h.provider]:[]),...Object.values(f).flatMap(h=>h.kind==="resource"&&h.source.provider!=="domino"?[h.source.provider]:[])];for(let h of w)if(!s.includes(h))throw new Error(`Declare the ${h} integration on this quest`);return Ge.parse({quest:a,evaluatorProtocol:Q,title:typeof t.title=="function"?t.title({settings:u}):t.title,presentation:t.presentation?.({settings:u})??{},fields:f,values:l,rewards:v,humanReview:t.review?.({settings:u})?.enabled??!0,trigger:t.trigger,...t.performance?{performance:B.parse({metrics:t.performance.metrics,maxAgeMs:t.performance.maxAgeMs})}:{},integrations:s,completion:n?n.kind==="progress"?{kind:n.kind,goal:n.goal,window:n.window,repeat:n.repeat}:n.kind==="streak"?n:{kind:n.kind}:{kind:"keyed"},visibility:t.visibility??"visible",profile:t.profile??{visible:!1},budgets:t.budgets??[],requires:t.requires??[],...t.campaign?{campaign:t.campaign}:{},...t.availability?{availability:t.availability}:{},...t.retryCooldownMs===void 0?{}:{retryCooldownMs:t.retryCooldownMs},...t.completionCooldownMs===void 0?{}:{completionCooldownMs:t.completionCooldownMs}})}return b("quest",{protocol:Q,key:a,describe:p,async evaluate(o){let u=t.settings.parse(o.settings),l=i?Se.parse(o.tracker):null,v=kt.get(t.trigger),w=l&&v?re(v,l.record.data):null;if(w)return z.parse({kind:"reject",reason:`The record's data does not match the data schema this quest was built with: ${w.path} ${w.reason}`});let h=l;if(o.performance){if(!t.performance)throw new Error("Quest has no performance evaluator");let y=He.parse(o.performance),yt=L(M(t.performance.metrics),x().int().safe().nonnegative()).parse(y.metrics),k=await t.performance.evaluate({settings:u,member:o.member,tracker:h,metrics:yt,observedAt:y.observedAt});if(!k)throw new Error("Performance evaluator returned no decision");if(k.rewards!==void 0)throw new Error("A performance evaluator cannot select rewards. It gates the rewards content evaluation selected: return accept, review or reject with a reason only.");return gt(k),z.parse(k.kind==="accept"?{kind:"accept",rewards:y.rewards}:k.kind==="review"&&o.humanReview?{kind:"review",reason:k.reason,rewards:y.rewards}:{kind:"reject",reason:k.reason,...k.kind==="review"?{requestedReview:!0}:k.code===void 0?{}:{code:k.code}})}let m=t.evaluate?await t.evaluate({settings:u,member:o.member,input:o.input,tracker:h,eligibleAt:o.eligibleAt,calendar:o.calendar,now:o.now,review:o.review,trackers:ae(o.trackers),wallet:o.wallet,images:o.images,...o.telegram?{telegram:o.telegram}:{},...Object.fromEntries(s.map(y=>[y,o[y]]))}):C.accept();if(!m)throw new Error("Evaluator returned no decision");if(gt(m),m.kind==="review"&&!o.humanReview)return z.parse({kind:"reject",reason:m.reason,requestedReview:!0});(m.kind==="accept"||m.kind==="review")&&m.completionKey!==void 0&&n?.kind!=="keyed"&&o.diagnose?.({code:"completion-key-ignored",message:ar(n,m.completionKey)});let F={...o,settings:u,tracker:l};return z.parse(m.kind==="accept"||m.kind==="review"?{...m,rewards:m.rewards??o.rewards,...n?.kind==="keyed"||n?.kind==="progress"?{completionKey:n.kind==="progress"?n.distinct(F):m.completionKey??n.key(F)}:{}}:m)}})}}function ar(e,r){let t=`ignores completionKey ${JSON.stringify(r)}`;switch(e?.kind){case void 0:return`A content quest completes once per content item, under a key Relay sets, so it ${t}`;case"once":return`once() completes the quest once per member and ${t}: use keyed(...) to complete it once per key`;case"streak":return`streak(...) keys its own completions and ${t}`;case"progress":return`progress(...) keys each contribution with its distinct(...) and ${t}: derive the key in distinct(...)`}}var Xr=bt(!1),Yr=bt(!0);export{Ot as CapabilityError,Zr as automatic,_r as automaticFulfillment,Or as badge,Dt as balanceAtLeast,Wr as budget,wr as calendar,Bt as capabilityErrorCodes,Tt as completed,Qr as content,Me as cosmosDenomSchema,Et as cosmosNetworkSchema,kr as count,j as customSource,C as decision,hr as defineBadge,Rt as defineCampaign,It as defineDashboard,pr as defineEngagementReward,At as defineGroup,Er as defineLeaderboard,gr as defineLedger,Nt as defineOffer,Xr as defineQuest,Yr as defineQuestType,yr as defineReferral,Hr as defineTieredReward,Cr as defineTracker,xr as discord,Sr as earned,Jr as evaluators,Ur as evidence,Ut as formatUnits,Nr as groupMembership,Pt as inGroup,Br as instruction,Ir as invoked,Le as isContractCall,Re as isContractEvent,$e as isEvmChainId,je as isNftCollection,Ae as isSolanaProgram,Jt as keyed,Vr as manual,$t as maxWalletEventLogs,zt as maxWalletEventLookback,Lt as maxWalletTransactionLookback,jt as maxWalletTransactions,Yt as once,xt as parseContractCall,Mt as parseContractEvent,Ct as parseContractFunction,qt as parseNftCollection,Kt as parseUnits,Lr as pointLedgers,Kr as points,Xt as progress,br as questCompleted,Tr as received,vr as rolling,Rr as settings,Dr as spent,Gr as staffHandover,Ft as streak,Pr as swapped,Mr as telegram,zr as tiktok,$ as trackerDataSchema,Se as trackerTriggerContextSchema,Fr as untracked,jr as wallet,qr as x,$r as youtube,St as z};