@learncard/sss-key-manager 0.2.6 → 0.3.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 (35) hide show
  1. package/README.md +9 -0
  2. package/dist/escrow-authority.d.ts +4 -3
  3. package/dist/escrow-authority.d.ts.map +1 -1
  4. package/dist/escrow-authority.types.d.ts +15 -0
  5. package/dist/escrow-authority.types.d.ts.map +1 -1
  6. package/dist/escrow-crypto.d.ts +19 -1
  7. package/dist/escrow-crypto.d.ts.map +1 -1
  8. package/dist/escrow-enrollment-intent.d.ts.map +1 -1
  9. package/dist/index.d.ts +3 -3
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/sss-key-manager.cjs.development.js +776 -89
  12. package/dist/sss-key-manager.cjs.development.js.map +3 -3
  13. package/dist/sss-key-manager.cjs.production.min.js +30 -30
  14. package/dist/sss-key-manager.cjs.production.min.js.map +4 -4
  15. package/dist/sss-key-manager.esm.js +778 -89
  16. package/dist/sss-key-manager.esm.js.map +3 -3
  17. package/dist/sss-strategy.d.ts +26 -0
  18. package/dist/sss-strategy.d.ts.map +1 -1
  19. package/dist/types.d.ts +28 -0
  20. package/dist/types.d.ts.map +1 -1
  21. package/package.json +2 -2
  22. package/src/__fixtures__/escrow-authority-brand-names-v1.json +29 -0
  23. package/src/__fixtures__/escrow-carry-contact-contract-v1.json +25 -1
  24. package/src/__fixtures__/escrow-email-brand-contract-v1.json +225 -0
  25. package/src/escrow-authority.test.ts +2 -0
  26. package/src/escrow-authority.ts +24 -7
  27. package/src/escrow-authority.types.ts +27 -0
  28. package/src/escrow-crypto.test.ts +75 -0
  29. package/src/escrow-crypto.ts +43 -1
  30. package/src/escrow-enrollment-intent.ts +2 -1
  31. package/src/index.ts +14 -2
  32. package/src/sss-authority.test.ts +392 -32
  33. package/src/sss-strategy.test.ts +238 -0
  34. package/src/sss-strategy.ts +245 -104
  35. package/src/types.ts +29 -0
@@ -60,6 +60,7 @@ var require_types_cjs_development = __commonJS({
60
60
  var index_exports2 = {};
61
61
  __export2(index_exports2, {
62
62
  ACT_AS_HEADER: /* @__PURE__ */ __name(() => ACT_AS_HEADER, "ACT_AS_HEADER"),
63
+ AIPassportCredentialRecordValidator: /* @__PURE__ */ __name(() => AIPassportCredentialRecordValidator, "AIPassportCredentialRecordValidator"),
63
64
  AUTH_GRANT_AUDIENCE_DOMAIN_PREFIX: /* @__PURE__ */ __name(() => AUTH_GRANT_AUDIENCE_DOMAIN_PREFIX, "AUTH_GRANT_AUDIENCE_DOMAIN_PREFIX"),
64
65
  AchievementCredentialValidator: /* @__PURE__ */ __name(() => AchievementCredentialValidator, "AchievementCredentialValidator"),
65
66
  AchievementCriteriaValidator: /* @__PURE__ */ __name(() => AchievementCriteriaValidator, "AchievementCriteriaValidator"),
@@ -71,6 +72,8 @@ var require_types_cjs_development = __commonJS({
71
72
  AddTagInputValidator: /* @__PURE__ */ __name(() => AddTagInputValidator, "AddTagInputValidator"),
72
73
  AddressValidator: /* @__PURE__ */ __name(() => AddressValidator, "AddressValidator"),
73
74
  AgeRatingValidator: /* @__PURE__ */ __name(() => AgeRatingValidator, "AgeRatingValidator"),
75
+ AiSessionMode: /* @__PURE__ */ __name(() => AiSessionMode, "AiSessionMode"),
76
+ AiSessionModeValidator: /* @__PURE__ */ __name(() => AiSessionModeValidator, "AiSessionModeValidator"),
74
77
  AlignmentTargetTypeValidator: /* @__PURE__ */ __name(() => AlignmentTargetTypeValidator, "AlignmentTargetTypeValidator"),
75
78
  AlignmentValidator: /* @__PURE__ */ __name(() => AlignmentValidator, "AlignmentValidator"),
76
79
  AllocateCredentialRefreshInputValidator: /* @__PURE__ */ __name(() => AllocateCredentialRefreshInputValidator, "AllocateCredentialRefreshInputValidator"),
@@ -78,6 +81,7 @@ var require_types_cjs_development = __commonJS({
78
81
  AllocateCredentialStatusInputValidator: /* @__PURE__ */ __name(() => AllocateCredentialStatusInputValidator, "AllocateCredentialStatusInputValidator"),
79
82
  AllocatedBitstringStatusListEntryValidator: /* @__PURE__ */ __name(() => AllocatedBitstringStatusListEntryValidator, "AllocatedBitstringStatusListEntryValidator"),
80
83
  AllowConnectionRequestsEnum: /* @__PURE__ */ __name(() => AllowConnectionRequestsEnum, "AllowConnectionRequestsEnum"),
84
+ AnnouncementPreferencesValidator: /* @__PURE__ */ __name(() => AnnouncementPreferencesValidator, "AnnouncementPreferencesValidator"),
81
85
  AppBoostValidator: /* @__PURE__ */ __name(() => AppBoostValidator, "AppBoostValidator"),
82
86
  AppEventInputValidator: /* @__PURE__ */ __name(() => AppEventInputValidator, "AppEventInputValidator"),
83
87
  AppEventResponseValidator: /* @__PURE__ */ __name(() => AppEventResponseValidator, "AppEventResponseValidator"),
@@ -93,12 +97,15 @@ var require_types_cjs_development = __commonJS({
93
97
  AppStoreListingSubmitterValidator: /* @__PURE__ */ __name(() => AppStoreListingSubmitterValidator, "AppStoreListingSubmitterValidator"),
94
98
  AppStoreListingUpdateValidator: /* @__PURE__ */ __name(() => AppStoreListingUpdateValidator, "AppStoreListingUpdateValidator"),
95
99
  AppStoreListingValidator: /* @__PURE__ */ __name(() => AppStoreListingValidator, "AppStoreListingValidator"),
100
+ ArtifactSuggestionValidator: /* @__PURE__ */ __name(() => ArtifactSuggestionValidator, "ArtifactSuggestionValidator"),
96
101
  AssociationTypeValidator: /* @__PURE__ */ __name(() => AssociationTypeValidator, "AssociationTypeValidator"),
97
102
  AssociationValidator: /* @__PURE__ */ __name(() => AssociationValidator, "AssociationValidator"),
103
+ AttachCredentialRefreshStatusEntriesInputValidator: /* @__PURE__ */ __name(() => AttachCredentialRefreshStatusEntriesInputValidator, "AttachCredentialRefreshStatusEntriesInputValidator"),
98
104
  AuthGrantQueryValidator: /* @__PURE__ */ __name(() => AuthGrantQueryValidator, "AuthGrantQueryValidator"),
99
105
  AuthGrantStatusValidator: /* @__PURE__ */ __name(() => AuthGrantStatusValidator, "AuthGrantStatusValidator"),
100
106
  AuthGrantValidator: /* @__PURE__ */ __name(() => AuthGrantValidator, "AuthGrantValidator"),
101
107
  AuthSessionError: /* @__PURE__ */ __name(() => AuthSessionError2, "AuthSessionError"),
108
+ AuthenticatedMessageValidator: /* @__PURE__ */ __name(() => AuthenticatedMessageValidator, "AuthenticatedMessageValidator"),
102
109
  AutoBoostConfigValidator: /* @__PURE__ */ __name(() => AutoBoostConfigValidator, "AutoBoostConfigValidator"),
103
110
  BITSTRING_STATUS_PURPOSES: /* @__PURE__ */ __name(() => BITSTRING_STATUS_PURPOSES, "BITSTRING_STATUS_PURPOSES"),
104
111
  BitstringStatusListCredentialSubjectValidator: /* @__PURE__ */ __name(() => BitstringStatusListCredentialSubjectValidator, "BitstringStatusListCredentialSubjectValidator"),
@@ -110,19 +117,26 @@ var require_types_cjs_development = __commonJS({
110
117
  BoostRecipientValidator: /* @__PURE__ */ __name(() => BoostRecipientValidator, "BoostRecipientValidator"),
111
118
  BoostRecipientWithChildrenValidator: /* @__PURE__ */ __name(() => BoostRecipientWithChildrenValidator, "BoostRecipientWithChildrenValidator"),
112
119
  BoostValidator: /* @__PURE__ */ __name(() => BoostValidator, "BoostValidator"),
120
+ CONTRACT_APPROVAL_REQUIRED: /* @__PURE__ */ __name(() => CONTRACT_APPROVAL_REQUIRED, "CONTRACT_APPROVAL_REQUIRED"),
113
121
  CampaignAudienceInputValidator: /* @__PURE__ */ __name(() => CampaignAudienceInputValidator, "CampaignAudienceInputValidator"),
122
+ CampaignAudienceResultValidator: /* @__PURE__ */ __name(() => CampaignAudienceResultValidator, "CampaignAudienceResultValidator"),
114
123
  CampaignAudienceSourceValidator: /* @__PURE__ */ __name(() => CampaignAudienceSourceValidator, "CampaignAudienceSourceValidator"),
115
124
  CampaignChannelValidator: /* @__PURE__ */ __name(() => CampaignChannelValidator, "CampaignChannelValidator"),
125
+ CampaignDispatchOptionsValidator: /* @__PURE__ */ __name(() => CampaignDispatchOptionsValidator, "CampaignDispatchOptionsValidator"),
126
+ CampaignDispatchPreviewValidator: /* @__PURE__ */ __name(() => CampaignDispatchPreviewValidator, "CampaignDispatchPreviewValidator"),
127
+ CampaignEmailValidator: /* @__PURE__ */ __name(() => CampaignEmailValidator, "CampaignEmailValidator"),
116
128
  CampaignEventValidator: /* @__PURE__ */ __name(() => CampaignEventValidator, "CampaignEventValidator"),
117
129
  CampaignIdValidator: /* @__PURE__ */ __name(() => CampaignIdValidator, "CampaignIdValidator"),
118
130
  CampaignPaginationValidator: /* @__PURE__ */ __name(() => CampaignPaginationValidator, "CampaignPaginationValidator"),
119
131
  CampaignStatsValidator: /* @__PURE__ */ __name(() => CampaignStatsValidator, "CampaignStatsValidator"),
120
132
  CampaignStatusValidator: /* @__PURE__ */ __name(() => CampaignStatusValidator, "CampaignStatusValidator"),
133
+ CampaignTestValidator: /* @__PURE__ */ __name(() => CampaignTestValidator, "CampaignTestValidator"),
121
134
  CampaignUpdatesValidator: /* @__PURE__ */ __name(() => CampaignUpdatesValidator, "CampaignUpdatesValidator"),
122
135
  CampaignUserStateValidator: /* @__PURE__ */ __name(() => CampaignUserStateValidator, "CampaignUserStateValidator"),
123
136
  CampaignValidator: /* @__PURE__ */ __name(() => CampaignValidator, "CampaignValidator"),
124
137
  CapturedConsentRecordValidator: /* @__PURE__ */ __name(() => CapturedConsentRecordValidator, "CapturedConsentRecordValidator"),
125
138
  CapturedTemplateRecordValidator: /* @__PURE__ */ __name(() => CapturedTemplateRecordValidator, "CapturedTemplateRecordValidator"),
139
+ ChatMessageValidator: /* @__PURE__ */ __name(() => ChatMessageValidator, "ChatMessageValidator"),
126
140
  CheckCredentialEventValidator: /* @__PURE__ */ __name(() => CheckCredentialEventValidator, "CheckCredentialEventValidator"),
127
141
  CheckIssuanceStatusEventValidator: /* @__PURE__ */ __name(() => CheckIssuanceStatusEventValidator, "CheckIssuanceStatusEventValidator"),
128
142
  ClaimHookQueryValidator: /* @__PURE__ */ __name(() => ClaimHookQueryValidator, "ClaimHookQueryValidator"),
@@ -132,15 +146,26 @@ var require_types_cjs_development = __commonJS({
132
146
  ClaimTokenValidator: /* @__PURE__ */ __name(() => ClaimTokenValidator, "ClaimTokenValidator"),
133
147
  ClrCredentialValidator: /* @__PURE__ */ __name(() => ClrCredentialValidator, "ClrCredentialValidator"),
134
148
  ClrSubjectValidator: /* @__PURE__ */ __name(() => ClrSubjectValidator, "ClrSubjectValidator"),
149
+ ConsentFlowConsentStatusValidator: /* @__PURE__ */ __name(() => ConsentFlowConsentStatusValidator, "ConsentFlowConsentStatusValidator"),
150
+ ConsentFlowContractChangeKindValidator: /* @__PURE__ */ __name(() => ConsentFlowContractChangeKindValidator, "ConsentFlowContractChangeKindValidator"),
151
+ ConsentFlowContractChangesValidator: /* @__PURE__ */ __name(() => ConsentFlowContractChangesValidator, "ConsentFlowContractChangesValidator"),
135
152
  ConsentFlowContractDataForDidValidator: /* @__PURE__ */ __name(() => ConsentFlowContractDataForDidValidator, "ConsentFlowContractDataForDidValidator"),
136
153
  ConsentFlowContractDataValidator: /* @__PURE__ */ __name(() => ConsentFlowContractDataValidator, "ConsentFlowContractDataValidator"),
154
+ ConsentFlowContractDetailChangeValidator: /* @__PURE__ */ __name(() => ConsentFlowContractDetailChangeValidator, "ConsentFlowContractDetailChangeValidator"),
137
155
  ConsentFlowContractDetailsValidator: /* @__PURE__ */ __name(() => ConsentFlowContractDetailsValidator, "ConsentFlowContractDetailsValidator"),
156
+ ConsentFlowContractDiffValidator: /* @__PURE__ */ __name(() => ConsentFlowContractDiffValidator, "ConsentFlowContractDiffValidator"),
157
+ ConsentFlowContractNotificationDataValidator: /* @__PURE__ */ __name(() => ConsentFlowContractNotificationDataValidator, "ConsentFlowContractNotificationDataValidator"),
138
158
  ConsentFlowContractQueryValidator: /* @__PURE__ */ __name(() => ConsentFlowContractQueryValidator, "ConsentFlowContractQueryValidator"),
139
159
  ConsentFlowContractRequestForProfileListValidator: /* @__PURE__ */ __name(() => ConsentFlowContractRequestForProfileListValidator, "ConsentFlowContractRequestForProfileListValidator"),
140
160
  ConsentFlowContractRequestForProfileValidator: /* @__PURE__ */ __name(() => ConsentFlowContractRequestForProfileValidator, "ConsentFlowContractRequestForProfileValidator"),
141
161
  ConsentFlowContractRequestReadStatusValidator: /* @__PURE__ */ __name(() => ConsentFlowContractRequestReadStatusValidator, "ConsentFlowContractRequestReadStatusValidator"),
142
162
  ConsentFlowContractRequestStatusValidator: /* @__PURE__ */ __name(() => ConsentFlowContractRequestStatusValidator, "ConsentFlowContractRequestStatusValidator"),
163
+ ConsentFlowContractScopeValidator: /* @__PURE__ */ __name(() => ConsentFlowContractScopeValidator, "ConsentFlowContractScopeValidator"),
164
+ ConsentFlowContractStatusValidator: /* @__PURE__ */ __name(() => ConsentFlowContractStatusValidator, "ConsentFlowContractStatusValidator"),
165
+ ConsentFlowContractUpdatePreviewValidator: /* @__PURE__ */ __name(() => ConsentFlowContractUpdatePreviewValidator, "ConsentFlowContractUpdatePreviewValidator"),
166
+ ConsentFlowContractUpdateResultValidator: /* @__PURE__ */ __name(() => ConsentFlowContractUpdateResultValidator, "ConsentFlowContractUpdateResultValidator"),
143
167
  ConsentFlowContractValidator: /* @__PURE__ */ __name(() => ConsentFlowContractValidator, "ConsentFlowContractValidator"),
168
+ ConsentFlowContractVersionValidator: /* @__PURE__ */ __name(() => ConsentFlowContractVersionValidator, "ConsentFlowContractVersionValidator"),
144
169
  ConsentFlowDataForDidQueryValidator: /* @__PURE__ */ __name(() => ConsentFlowDataForDidQueryValidator, "ConsentFlowDataForDidQueryValidator"),
145
170
  ConsentFlowDataQueryValidator: /* @__PURE__ */ __name(() => ConsentFlowDataQueryValidator, "ConsentFlowDataQueryValidator"),
146
171
  ConsentFlowGuardianApprovalValidator: /* @__PURE__ */ __name(() => ConsentFlowGuardianApprovalValidator, "ConsentFlowGuardianApprovalValidator"),
@@ -180,6 +205,7 @@ var require_types_cjs_development = __commonJS({
180
205
  CredentialActivityStatsValidator: /* @__PURE__ */ __name(() => CredentialActivityStatsValidator, "CredentialActivityStatsValidator"),
181
206
  CredentialActivityValidator: /* @__PURE__ */ __name(() => CredentialActivityValidator, "CredentialActivityValidator"),
182
207
  CredentialActivityWithDetailsValidator: /* @__PURE__ */ __name(() => CredentialActivityWithDetailsValidator, "CredentialActivityWithDetailsValidator"),
208
+ CredentialDisplayValidator: /* @__PURE__ */ __name(() => CredentialDisplayValidator, "CredentialDisplayValidator"),
183
209
  CredentialFormatValidator: /* @__PURE__ */ __name(() => CredentialFormatValidator, "CredentialFormatValidator"),
184
210
  CredentialInfoValidator: /* @__PURE__ */ __name(() => CredentialInfoValidator, "CredentialInfoValidator"),
185
211
  CredentialNameRefValidator: /* @__PURE__ */ __name(() => CredentialNameRefValidator, "CredentialNameRefValidator"),
@@ -187,11 +213,13 @@ var require_types_cjs_development = __commonJS({
187
213
  CredentialRefreshChallengeValidator: /* @__PURE__ */ __name(() => CredentialRefreshChallengeValidator, "CredentialRefreshChallengeValidator"),
188
214
  CredentialRefreshFailedResultValidator: /* @__PURE__ */ __name(() => CredentialRefreshFailedResultValidator, "CredentialRefreshFailedResultValidator"),
189
215
  CredentialRefreshFailureCodeValidator: /* @__PURE__ */ __name(() => CredentialRefreshFailureCodeValidator, "CredentialRefreshFailureCodeValidator"),
216
+ CredentialRefreshReceiptValidator: /* @__PURE__ */ __name(() => CredentialRefreshReceiptValidator, "CredentialRefreshReceiptValidator"),
190
217
  CredentialRefreshResponseEnvelopeValidator: /* @__PURE__ */ __name(() => CredentialRefreshResponseEnvelopeValidator, "CredentialRefreshResponseEnvelopeValidator"),
191
218
  CredentialRefreshResultValidator: /* @__PURE__ */ __name(() => CredentialRefreshResultValidator, "CredentialRefreshResultValidator"),
192
219
  CredentialRefreshSigningModeValidator: /* @__PURE__ */ __name(() => CredentialRefreshSigningModeValidator, "CredentialRefreshSigningModeValidator"),
193
220
  CredentialRefreshUnchangedResultValidator: /* @__PURE__ */ __name(() => CredentialRefreshUnchangedResultValidator, "CredentialRefreshUnchangedResultValidator"),
194
221
  CredentialRefreshUnsupportedResultValidator: /* @__PURE__ */ __name(() => CredentialRefreshUnsupportedResultValidator, "CredentialRefreshUnsupportedResultValidator"),
222
+ CredentialRefreshUpdateReasonValidator: /* @__PURE__ */ __name(() => CredentialRefreshUpdateReasonValidator, "CredentialRefreshUpdateReasonValidator"),
195
223
  CredentialRefreshUpdatedResultValidator: /* @__PURE__ */ __name(() => CredentialRefreshUpdatedResultValidator, "CredentialRefreshUpdatedResultValidator"),
196
224
  CredentialRefreshVersionMetadataValidator: /* @__PURE__ */ __name(() => CredentialRefreshVersionMetadataValidator, "CredentialRefreshVersionMetadataValidator"),
197
225
  CredentialSchemaValidator: /* @__PURE__ */ __name(() => CredentialSchemaValidator, "CredentialSchemaValidator"),
@@ -199,8 +227,10 @@ var require_types_cjs_development = __commonJS({
199
227
  CredentialSharePreviewValidator: /* @__PURE__ */ __name(() => CredentialSharePreviewValidator, "CredentialSharePreviewValidator"),
200
228
  CredentialStatusValidator: /* @__PURE__ */ __name(() => CredentialStatusValidator, "CredentialStatusValidator"),
201
229
  CredentialSubjectValidator: /* @__PURE__ */ __name(() => CredentialSubjectValidator, "CredentialSubjectValidator"),
230
+ CredentialVerificationMetadataValidator: /* @__PURE__ */ __name(() => CredentialVerificationMetadataValidator, "CredentialVerificationMetadataValidator"),
202
231
  CriteriaValidator: /* @__PURE__ */ __name(() => CriteriaValidator, "CriteriaValidator"),
203
232
  DEFAULT_BITSTRING_STATUS_LIST_SIZE: /* @__PURE__ */ __name(() => DEFAULT_BITSTRING_STATUS_LIST_SIZE, "DEFAULT_BITSTRING_STATUS_LIST_SIZE"),
233
+ DebugInfoValidator: /* @__PURE__ */ __name(() => DebugInfoValidator, "DebugInfoValidator"),
204
234
  DeleteFrameworkInputValidator: /* @__PURE__ */ __name(() => DeleteFrameworkInputValidator, "DeleteFrameworkInputValidator"),
205
235
  DeleteShareLinkAttachmentChunksInputValidator: /* @__PURE__ */ __name(() => DeleteShareLinkAttachmentChunksInputValidator, "DeleteShareLinkAttachmentChunksInputValidator"),
206
236
  DeleteShareLinkAttachmentChunksOutputValidator: /* @__PURE__ */ __name(() => DeleteShareLinkAttachmentChunksOutputValidator, "DeleteShareLinkAttachmentChunksOutputValidator"),
@@ -212,6 +242,7 @@ var require_types_cjs_development = __commonJS({
212
242
  ESCROW_PIN_UNAVAILABLE_MESSAGE: /* @__PURE__ */ __name(() => ESCROW_PIN_UNAVAILABLE_MESSAGE2, "ESCROW_PIN_UNAVAILABLE_MESSAGE"),
213
243
  EncryptedCredentialRecordValidator: /* @__PURE__ */ __name(() => EncryptedCredentialRecordValidator, "EncryptedCredentialRecordValidator"),
214
244
  EncryptedRecordValidator: /* @__PURE__ */ __name(() => EncryptedRecordValidator, "EncryptedRecordValidator"),
245
+ EncryptionRecipientsResultValidator: /* @__PURE__ */ __name(() => EncryptionRecipientsResultValidator, "EncryptionRecipientsResultValidator"),
215
246
  EndorsementCredentialValidator: /* @__PURE__ */ __name(() => EndorsementCredentialValidator, "EndorsementCredentialValidator"),
216
247
  EndorsementSubjectValidator: /* @__PURE__ */ __name(() => EndorsementSubjectValidator, "EndorsementSubjectValidator"),
217
248
  EscrowPinStatusValidator: /* @__PURE__ */ __name(() => EscrowPinStatusValidator, "EscrowPinStatusValidator"),
@@ -225,6 +256,8 @@ var require_types_cjs_development = __commonJS({
225
256
  GetCountersEventValidator: /* @__PURE__ */ __name(() => GetCountersEventValidator, "GetCountersEventValidator"),
226
257
  GetCredentialRefreshHistoryInputValidator: /* @__PURE__ */ __name(() => GetCredentialRefreshHistoryInputValidator, "GetCredentialRefreshHistoryInputValidator"),
227
258
  GetCredentialRefreshHistoryResultValidator: /* @__PURE__ */ __name(() => GetCredentialRefreshHistoryResultValidator, "GetCredentialRefreshHistoryResultValidator"),
259
+ GetCredentialRefreshReceiptInputValidator: /* @__PURE__ */ __name(() => GetCredentialRefreshReceiptInputValidator, "GetCredentialRefreshReceiptInputValidator"),
260
+ GetEncryptionRecipientsInputValidator: /* @__PURE__ */ __name(() => GetEncryptionRecipientsInputValidator, "GetEncryptionRecipientsInputValidator"),
228
261
  GetFullSkillTreeInputValidator: /* @__PURE__ */ __name(() => GetFullSkillTreeInputValidator, "GetFullSkillTreeInputValidator"),
229
262
  GetFullSkillTreeResultValidator: /* @__PURE__ */ __name(() => GetFullSkillTreeResultValidator, "GetFullSkillTreeResultValidator"),
230
263
  GetShareLinkAttachmentChunkInputValidator: /* @__PURE__ */ __name(() => GetShareLinkAttachmentChunkInputValidator, "GetShareLinkAttachmentChunkInputValidator"),
@@ -232,6 +265,7 @@ var require_types_cjs_development = __commonJS({
232
265
  GetSkillPathResultValidator: /* @__PURE__ */ __name(() => GetSkillPathResultValidator, "GetSkillPathResultValidator"),
233
266
  GetTemplateRecipientsEventValidator: /* @__PURE__ */ __name(() => GetTemplateRecipientsEventValidator, "GetTemplateRecipientsEventValidator"),
234
267
  GuardianStatusValidator: /* @__PURE__ */ __name(() => GuardianStatusValidator, "GuardianStatusValidator"),
268
+ HolderEncryptedHandoffValidator: /* @__PURE__ */ __name(() => HolderEncryptedHandoffValidator, "HolderEncryptedHandoffValidator"),
235
269
  HolderExportConsentRecordValidator: /* @__PURE__ */ __name(() => HolderExportConsentRecordValidator, "HolderExportConsentRecordValidator"),
236
270
  HolderExportMetadataValidator: /* @__PURE__ */ __name(() => HolderExportMetadataValidator, "HolderExportMetadataValidator"),
237
271
  IdentifierEntryValidator: /* @__PURE__ */ __name(() => IdentifierEntryValidator, "IdentifierEntryValidator"),
@@ -251,7 +285,9 @@ var require_types_cjs_development = __commonJS({
251
285
  InlineSendCredentialEventValidator: /* @__PURE__ */ __name(() => InlineSendCredentialEventValidator, "InlineSendCredentialEventValidator"),
252
286
  InlineWalletCategoryValidator: /* @__PURE__ */ __name(() => InlineWalletCategoryValidator, "InlineWalletCategoryValidator"),
253
287
  InlineWalletSkillTagValidator: /* @__PURE__ */ __name(() => InlineWalletSkillTagValidator, "InlineWalletSkillTagValidator"),
288
+ InsightArtifactValidator: /* @__PURE__ */ __name(() => InsightArtifactValidator, "InsightArtifactValidator"),
254
289
  InstalledAppValidator: /* @__PURE__ */ __name(() => InstalledAppValidator, "InstalledAppValidator"),
290
+ IntroStreamModeValidator: /* @__PURE__ */ __name(() => IntroStreamModeValidator, "IntroStreamModeValidator"),
255
291
  IssueInboxCredentialBatchItemResultValidator: /* @__PURE__ */ __name(() => IssueInboxCredentialBatchItemResultValidator, "IssueInboxCredentialBatchItemResultValidator"),
256
292
  IssueInboxCredentialBatchItemValidator: /* @__PURE__ */ __name(() => IssueInboxCredentialBatchItemValidator, "IssueInboxCredentialBatchItemValidator"),
257
293
  IssueInboxCredentialBatchResponseValidator: /* @__PURE__ */ __name(() => IssueInboxCredentialBatchResponseValidator, "IssueInboxCredentialBatchResponseValidator"),
@@ -303,6 +339,7 @@ var require_types_cjs_development = __commonJS({
303
339
  LCNVisibleProfileValidator: /* @__PURE__ */ __name(() => LCNVisibleProfileValidator, "LCNVisibleProfileValidator"),
304
340
  LaunchTypeValidator: /* @__PURE__ */ __name(() => LaunchTypeValidator, "LaunchTypeValidator"),
305
341
  LearnCardRefreshAuthorizationValidator: /* @__PURE__ */ __name(() => LearnCardRefreshAuthorizationValidator, "LearnCardRefreshAuthorizationValidator"),
342
+ LearningPathwayValidator: /* @__PURE__ */ __name(() => LearningPathwayValidator, "LearningPathwayValidator"),
306
343
  LegacySendCredentialEventValidator: /* @__PURE__ */ __name(() => LegacySendCredentialEventValidator, "LegacySendCredentialEventValidator"),
307
344
  LinkProviderFrameworkInputValidator: /* @__PURE__ */ __name(() => LinkProviderFrameworkInputValidator, "LinkProviderFrameworkInputValidator"),
308
345
  ListCampaignsInputValidator: /* @__PURE__ */ __name(() => ListCampaignsInputValidator, "ListCampaignsInputValidator"),
@@ -314,8 +351,11 @@ var require_types_cjs_development = __commonJS({
314
351
  MAX_SHARE_RECOVERY_JWE_BYTES: /* @__PURE__ */ __name(() => MAX_SHARE_RECOVERY_JWE_BYTES, "MAX_SHARE_RECOVERY_JWE_BYTES"),
315
352
  MAX_SHARE_SOURCE_URI_CHARS: /* @__PURE__ */ __name(() => MAX_SHARE_SOURCE_URI_CHARS, "MAX_SHARE_SOURCE_URI_CHARS"),
316
353
  MAX_VP_MEMBERS: /* @__PURE__ */ __name(() => MAX_VP_MEMBERS, "MAX_VP_MEMBERS"),
354
+ ManagedCredentialRefreshBindingValidator: /* @__PURE__ */ __name(() => ManagedCredentialRefreshBindingValidator, "ManagedCredentialRefreshBindingValidator"),
317
355
  ManagedCredentialRefreshReceiptValidator: /* @__PURE__ */ __name(() => ManagedCredentialRefreshReceiptValidator, "ManagedCredentialRefreshReceiptValidator"),
318
356
  ManagedCredentialRefreshServiceValidator: /* @__PURE__ */ __name(() => ManagedCredentialRefreshServiceValidator, "ManagedCredentialRefreshServiceValidator"),
357
+ ModelSafeCredentialFactValidator: /* @__PURE__ */ __name(() => ModelSafeCredentialFactValidator, "ModelSafeCredentialFactValidator"),
358
+ ModelSafeCredentialProjectionValidator: /* @__PURE__ */ __name(() => ModelSafeCredentialProjectionValidator, "ModelSafeCredentialProjectionValidator"),
319
359
  MyCampaignValidator: /* @__PURE__ */ __name(() => MyCampaignValidator, "MyCampaignValidator"),
320
360
  NormalizedConsentScopesValidator: /* @__PURE__ */ __name(() => NormalizedConsentScopesValidator, "NormalizedConsentScopesValidator"),
321
361
  PageCampaignAudienceInputValidator: /* @__PURE__ */ __name(() => PageCampaignAudienceInputValidator, "PageCampaignAudienceInputValidator"),
@@ -360,6 +400,7 @@ var require_types_cjs_development = __commonJS({
360
400
  PublishCredentialRefreshNotificationValidator: /* @__PURE__ */ __name(() => PublishCredentialRefreshNotificationValidator, "PublishCredentialRefreshNotificationValidator"),
361
401
  PublishCredentialRefreshResultValidator: /* @__PURE__ */ __name(() => PublishCredentialRefreshResultValidator, "PublishCredentialRefreshResultValidator"),
362
402
  PublishCredentialSharePreviewValidator: /* @__PURE__ */ __name(() => PublishCredentialSharePreviewValidator, "PublishCredentialSharePreviewValidator"),
403
+ PublishHolderEncryptedRefreshInputValidator: /* @__PURE__ */ __name(() => PublishHolderEncryptedRefreshInputValidator, "PublishHolderEncryptedRefreshInputValidator"),
363
404
  PublishIssuerSignedRefreshValidator: /* @__PURE__ */ __name(() => PublishIssuerSignedRefreshValidator, "PublishIssuerSignedRefreshValidator"),
364
405
  PublishSigningAuthorityRefreshValidator: /* @__PURE__ */ __name(() => PublishSigningAuthorityRefreshValidator, "PublishSigningAuthorityRefreshValidator"),
365
406
  PutShareLinkAttachmentChunkInputValidator: /* @__PURE__ */ __name(() => PutShareLinkAttachmentChunkInputValidator, "PutShareLinkAttachmentChunkInputValidator"),
@@ -377,6 +418,7 @@ var require_types_cjs_development = __commonJS({
377
418
  ResultStatusTypeValidator: /* @__PURE__ */ __name(() => ResultStatusTypeValidator, "ResultStatusTypeValidator"),
378
419
  ResultTypeValidator: /* @__PURE__ */ __name(() => ResultTypeValidator, "ResultTypeValidator"),
379
420
  ResultValidator: /* @__PURE__ */ __name(() => ResultValidator, "ResultValidator"),
421
+ RoleValidator: /* @__PURE__ */ __name(() => RoleValidator, "RoleValidator"),
380
422
  RubricCriterionValidator: /* @__PURE__ */ __name(() => RubricCriterionValidator, "RubricCriterionValidator"),
381
423
  SHARE_AAD_PREFIX: /* @__PURE__ */ __name(() => SHARE_AAD_PREFIX, "SHARE_AAD_PREFIX"),
382
424
  SHARE_CONTENT_KEY_BYTES: /* @__PURE__ */ __name(() => SHARE_CONTENT_KEY_BYTES, "SHARE_CONTENT_KEY_BYTES"),
@@ -395,6 +437,7 @@ var require_types_cjs_development = __commonJS({
395
437
  SendBrandingOptionsValidator: /* @__PURE__ */ __name(() => SendBrandingOptionsValidator, "SendBrandingOptionsValidator"),
396
438
  SendContractRequestValidator: /* @__PURE__ */ __name(() => SendContractRequestValidator, "SendContractRequestValidator"),
397
439
  SendCredentialEventValidator: /* @__PURE__ */ __name(() => SendCredentialEventValidator, "SendCredentialEventValidator"),
440
+ SendHolderEncryptedRefreshableInputValidator: /* @__PURE__ */ __name(() => SendHolderEncryptedRefreshableInputValidator, "SendHolderEncryptedRefreshableInputValidator"),
398
441
  SendInboxResponseValidator: /* @__PURE__ */ __name(() => SendInboxResponseValidator, "SendInboxResponseValidator"),
399
442
  SendInputValidator: /* @__PURE__ */ __name(() => SendInputValidator, "SendInputValidator"),
400
443
  SendNotificationEventValidator: /* @__PURE__ */ __name(() => SendNotificationEventValidator, "SendNotificationEventValidator"),
@@ -451,8 +494,10 @@ var require_types_cjs_development = __commonJS({
451
494
  SkillValidator: /* @__PURE__ */ __name(() => SkillValidator, "SkillValidator"),
452
495
  StandardCredentialRefreshServiceValidator: /* @__PURE__ */ __name(() => StandardCredentialRefreshServiceValidator, "StandardCredentialRefreshServiceValidator"),
453
496
  StatusCheckEntryValidator: /* @__PURE__ */ __name(() => StatusCheckEntryValidator, "StatusCheckEntryValidator"),
497
+ StatusManagementValidator: /* @__PURE__ */ __name(() => StatusManagementValidator, "StatusManagementValidator"),
454
498
  StoredCredentialEnvelopeValidator: /* @__PURE__ */ __name(() => StoredCredentialEnvelopeValidator, "StoredCredentialEnvelopeValidator"),
455
499
  StringQuery: /* @__PURE__ */ __name(() => StringQuery, "StringQuery"),
500
+ StructuredResponseValidator: /* @__PURE__ */ __name(() => StructuredResponseValidator, "StructuredResponseValidator"),
456
501
  SummaryCredentialDataValidator: /* @__PURE__ */ __name(() => SummaryCredentialDataValidator, "SummaryCredentialDataValidator"),
457
502
  SummaryCredentialKeywordValidator: /* @__PURE__ */ __name(() => SummaryCredentialKeywordValidator, "SummaryCredentialKeywordValidator"),
458
503
  SupportedCredentialRefreshServiceValidator: /* @__PURE__ */ __name(() => SupportedCredentialRefreshServiceValidator, "SupportedCredentialRefreshServiceValidator"),
@@ -460,6 +505,9 @@ var require_types_cjs_development = __commonJS({
460
505
  TagValidator: /* @__PURE__ */ __name(() => TagValidator, "TagValidator"),
461
506
  TemplateRenderMethodValidator: /* @__PURE__ */ __name(() => TemplateRenderMethodValidator, "TemplateRenderMethodValidator"),
462
507
  TermsOfUseValidator: /* @__PURE__ */ __name(() => TermsOfUseValidator, "TermsOfUseValidator"),
508
+ ThreadCredentialContextValidator: /* @__PURE__ */ __name(() => ThreadCredentialContextValidator, "ThreadCredentialContextValidator"),
509
+ ThreadValidator: /* @__PURE__ */ __name(() => ThreadValidator, "ThreadValidator"),
510
+ TimingEventValidator: /* @__PURE__ */ __name(() => TimingEventValidator, "TimingEventValidator"),
463
511
  UnsignedAchievementCredentialValidator: /* @__PURE__ */ __name(() => UnsignedAchievementCredentialValidator, "UnsignedAchievementCredentialValidator"),
464
512
  UnsignedClrCredentialValidator: /* @__PURE__ */ __name(() => UnsignedClrCredentialValidator, "UnsignedClrCredentialValidator"),
465
513
  UnsignedVCValidator: /* @__PURE__ */ __name(() => UnsignedVCValidator, "UnsignedVCValidator"),
@@ -21978,12 +22026,47 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
21978
22026
  $or: BaseStringQuery.array()
21979
22027
  })
21980
22028
  ]);
22029
+ var BITSTRING_STATUS_PURPOSES = ["revocation", "suspension"];
22030
+ var DEFAULT_BITSTRING_STATUS_LIST_SIZE = 131072;
22031
+ var BitstringStatusPurposeValidator = external_exports.enum(BITSTRING_STATUS_PURPOSES);
22032
+ var BitstringStatusListEntryValidator = external_exports.object({
22033
+ id: external_exports.string().optional(),
22034
+ type: external_exports.literal("BitstringStatusListEntry"),
22035
+ statusPurpose: BitstringStatusPurposeValidator,
22036
+ statusListIndex: external_exports.string().or(external_exports.number().int().nonnegative()),
22037
+ statusListCredential: external_exports.string()
22038
+ });
22039
+ var AllocatedBitstringStatusListEntryValidator = BitstringStatusListEntryValidator.extend({
22040
+ id: external_exports.string()
22041
+ });
22042
+ var BitstringStatusListCredentialSubjectValidator = external_exports.object({
22043
+ id: external_exports.string().optional(),
22044
+ type: external_exports.literal("BitstringStatusList"),
22045
+ statusPurpose: BitstringStatusPurposeValidator,
22046
+ encodedList: external_exports.string()
22047
+ });
22048
+ var AllocateCredentialStatusInputValidator = external_exports.object({
22049
+ statusPurposes: external_exports.array(BitstringStatusPurposeValidator).optional(),
22050
+ listSize: external_exports.number().int().positive().optional()
22051
+ }).default({});
22052
+ var AttachCredentialRefreshStatusEntriesInputValidator = external_exports.object({
22053
+ refreshId: external_exports.string().min(1),
22054
+ credentialStatus: CredentialStatusValidator.or(CredentialStatusValidator.array()).nullable()
22055
+ });
21981
22056
  var LearnCardRefreshAuthorizationValidator = external_exports.object({ type: external_exports.literal("LearnCardDIDAuth") }).catchall(external_exports.any());
21982
22057
  var ManagedCredentialRefreshServiceValidator = external_exports.object({
21983
22058
  id: external_exports.string().min(1),
21984
22059
  type: external_exports.literal("LearnCardCredentialRefresh2026"),
21985
22060
  authorization: LearnCardRefreshAuthorizationValidator.optional()
21986
22061
  }).catchall(external_exports.any());
22062
+ var ManagedCredentialRefreshBindingValidator = ManagedCredentialRefreshServiceValidator.or(
22063
+ RefreshServiceValidator.array().refine(
22064
+ (services) => services.some(
22065
+ (service) => ManagedCredentialRefreshServiceValidator.safeParse(service).success
22066
+ ),
22067
+ "A managed refresh service is required"
22068
+ )
22069
+ );
21987
22070
  var StandardCredentialRefreshServiceValidator = external_exports.object({
21988
22071
  id: external_exports.string().min(1),
21989
22072
  type: external_exports.literal("1EdTechCredentialRefresh")
@@ -22007,7 +22090,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22007
22090
  });
22008
22091
  var ManagedCredentialRefreshReceiptValidator = external_exports.object({
22009
22092
  refreshId: external_exports.string().min(1),
22010
- refreshService: ManagedCredentialRefreshServiceValidator,
22093
+ refreshService: ManagedCredentialRefreshBindingValidator,
22094
+ /** Legacy receipts authenticate only the allocated managed entry, not other services. */
22095
+ refreshServiceBinding: external_exports.literal("managed-entry").optional(),
22011
22096
  credentialId: external_exports.string().min(1),
22012
22097
  issuerDid: external_exports.string().min(1),
22013
22098
  holderDid: external_exports.string().min(1),
@@ -22015,14 +22100,43 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22015
22100
  CredentialStatusValidator.array()
22016
22101
  ).optional()
22017
22102
  }).strip();
22103
+ var GetCredentialRefreshReceiptInputValidator = external_exports.object({ uri: external_exports.string().min(1) });
22104
+ var CredentialRefreshReceiptValidator = ManagedCredentialRefreshReceiptValidator.extend({
22105
+ encryptionMode: external_exports.enum(["network", "holder"])
22106
+ });
22107
+ var HolderEncryptedHandoffValidator = external_exports.object({
22108
+ refreshId: external_exports.string().min(1),
22109
+ credentialId: external_exports.string().min(1),
22110
+ holderDid: external_exports.string().min(1),
22111
+ issuerDid: external_exports.string().min(1),
22112
+ credentialStatus: CredentialStatusValidator.or(CredentialStatusValidator.array()),
22113
+ refreshService: ManagedCredentialRefreshBindingValidator.optional(),
22114
+ jwe: JWEValidator
22115
+ }).strict();
22116
+ var SendHolderEncryptedRefreshableInputValidator = external_exports.object({
22117
+ handoff: HolderEncryptedHandoffValidator,
22118
+ idempotencyKey: external_exports.string().min(1).optional(),
22119
+ boostUri: external_exports.string().optional(),
22120
+ skipNotification: external_exports.boolean().optional()
22121
+ });
22122
+ var GetEncryptionRecipientsInputValidator = external_exports.object({ refreshId: external_exports.string().min(1) });
22123
+ var EncryptionRecipientsResultValidator = external_exports.object({
22124
+ recipientKeyIds: external_exports.array(external_exports.string())
22125
+ });
22018
22126
  var InboxCredentialRefreshReceiptValidator = ManagedCredentialRefreshReceiptValidator.omit(
22019
22127
  { holderDid: true }
22020
22128
  ).extend({ holderDid: external_exports.string().min(1).optional() });
22021
22129
  var CredentialRefreshSigningModeValidator = external_exports.enum(["issuer-signed", "signing-authority"]);
22130
+ var CredentialRefreshUpdateReasonValidator = external_exports.enum(["corrected", "updated", "reissued"]);
22022
22131
  var PublishCredentialRefreshBaseFields = {
22023
22132
  refreshId: external_exports.string().min(1),
22024
22133
  notifyHolder: external_exports.boolean().optional(),
22025
- updateSummary: external_exports.string().optional(),
22134
+ updateSummary: external_exports.string().max(280).optional().describe(
22135
+ "Public legacy update summary. Do not include private claims; prefer updateReason."
22136
+ ),
22137
+ updateReason: CredentialRefreshUpdateReasonValidator.optional().describe(
22138
+ "Public reason for this update"
22139
+ ),
22026
22140
  idempotencyKey: external_exports.string().optional()
22027
22141
  };
22028
22142
  var PublishIssuerSignedRefreshValidator = external_exports.object({
@@ -22098,13 +22212,25 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22098
22212
  publishedAt: external_exports.string().min(1),
22099
22213
  notification: PublishCredentialRefreshNotificationValidator
22100
22214
  });
22215
+ var PublishHolderEncryptedRefreshInputValidator = external_exports.object({
22216
+ handoff: HolderEncryptedHandoffValidator,
22217
+ notify: external_exports.boolean(),
22218
+ updateSummary: external_exports.string().max(280).optional().describe(
22219
+ "Public legacy update summary. Do not include private claims; prefer updateReason."
22220
+ ),
22221
+ updateReason: CredentialRefreshUpdateReasonValidator.optional().describe(
22222
+ "Public reason for this update"
22223
+ ),
22224
+ idempotencyKey: external_exports.string().optional()
22225
+ });
22101
22226
  var CredentialRefreshVersionMetadataValidator = external_exports.object({
22102
22227
  version: external_exports.number().int().positive(),
22103
22228
  publishedAt: external_exports.string().min(1),
22104
22229
  effectiveAt: external_exports.string().optional(),
22105
22230
  etag: external_exports.string().optional(),
22106
22231
  signingMode: CredentialRefreshSigningModeValidator.optional(),
22107
- updateSummary: external_exports.string().optional()
22232
+ updateSummary: external_exports.string().optional(),
22233
+ updateReason: CredentialRefreshUpdateReasonValidator.optional()
22108
22234
  });
22109
22235
  var GetCredentialRefreshHistoryInputValidator = external_exports.object({
22110
22236
  refreshId: external_exports.string().min(1),
@@ -22147,6 +22273,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22147
22273
  "INVALID_PROOF",
22148
22274
  "ISSUER_MISMATCH",
22149
22275
  "ID_MISMATCH",
22276
+ "BINDING_MISMATCH",
22150
22277
  "ROLLBACK",
22151
22278
  "REVOKED",
22152
22279
  "UNSAFE_ENDPOINT"
@@ -22471,6 +22598,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22471
22598
  name: external_exports.string()
22472
22599
  })
22473
22600
  });
22601
+ var CredentialDisplayValidator = external_exports.object({
22602
+ name: external_exports.string().trim().min(1).max(280).optional(),
22603
+ category: external_exports.string().max(280).optional(),
22604
+ image: external_exports.string().max(2048).url().refine((url2) => url2.startsWith("https://"), { message: "Image URL must use https" }).optional()
22605
+ });
22474
22606
  var SendBoostTemplateValidator = BoostValidator.partial().omit({ uri: true, claimPermissions: true }).extend({
22475
22607
  credential: VCValidator.or(UnsignedVCValidator),
22476
22608
  claimPermissions: BoostPermissionsValidator.partial().optional(),
@@ -22509,6 +22641,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22509
22641
  templateUri: external_exports.string().optional(),
22510
22642
  template: SendBoostTemplateValidator.optional(),
22511
22643
  signedCredential: VCValidator.optional(),
22644
+ display: CredentialDisplayValidator.optional().describe(
22645
+ "Public display metadata for managed and signed-only sends. Nothing is inferred from credential content; omitted names use generic copy. The exception is category: when display.category is omitted for an inline template, the template's category is copied, since consent-flow write authorization is keyed on it."
22646
+ ),
22647
+ statusPurposes: external_exports.array(BitstringStatusPurposeValidator).optional(),
22512
22648
  options: SendOptionsValidator.optional().describe(
22513
22649
  "Options for email/phone recipients (Universal Inbox)"
22514
22650
  ),
@@ -22547,7 +22683,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22547
22683
  "Present when guardianEmail was specified"
22548
22684
  )
22549
22685
  });
22686
+ var StatusManagementValidator = external_exports.enum(["network", "external", "mixed", "none"]);
22550
22687
  var SendBoostResponseValidator = external_exports.object({
22688
+ /** Public status providers for a managed send; external entries require provider-side updates. */
22689
+ statusManagement: StatusManagementValidator.optional(),
22551
22690
  type: external_exports.literal("boost"),
22552
22691
  credentialUri: external_exports.string(),
22553
22692
  uri: external_exports.string(),
@@ -22560,19 +22699,33 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22560
22699
  )
22561
22700
  });
22562
22701
  var PrepareRefreshableSendInputValidator = external_exports.object({
22702
+ /** Opt in to signing the server-bound statusEntries; omission preserves client allocation. */
22703
+ statusBinding: external_exports.literal("server").optional(),
22704
+ statusPurposes: external_exports.array(BitstringStatusPurposeValidator).optional(),
22563
22705
  recipient: external_exports.string(),
22564
22706
  templateUri: external_exports.string().optional(),
22565
22707
  template: SendBoostTemplateValidator.optional(),
22708
+ display: CredentialDisplayValidator.optional().describe("Public display metadata only"),
22566
22709
  contractUri: external_exports.string().optional(),
22567
22710
  templateData: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
22568
22711
  integrationId: external_exports.string().optional(),
22569
22712
  /** Credential ID to allocate for; generated server-side when omitted. */
22570
22713
  credentialId: external_exports.string().min(1).optional(),
22571
- idempotencyKey: external_exports.string().min(1).max(200).optional()
22572
- }).refine((data) => Boolean(data.templateUri) !== Boolean(data.template), {
22573
- message: "Provide exactly one of templateUri or template."
22714
+ idempotencyKey: external_exports.string().min(1).max(200).optional(),
22715
+ /**
22716
+ * `'holder'` requests student-only encryption (LC-2345): the SDK signs and
22717
+ * encrypts locally and the server never receives plaintext. Requires a
22718
+ * profile or DID recipient; rejected for signedCredential-only sends and for
22719
+ * inbox (email/phone) recipients. Defaults to `'network'`.
22720
+ */
22721
+ encryption: external_exports.enum(["network", "holder"]).optional()
22722
+ }).refine((data) => !(data.templateUri && data.template), {
22723
+ message: "Provide at most one of templateUri or template."
22574
22724
  });
22575
22725
  var PrepareRefreshableSendResultValidator = external_exports.object({
22726
+ /** Public status providers known at preparation; final send reports the signed entries. */
22727
+ statusManagement: StatusManagementValidator.optional(),
22728
+ statusEntries: external_exports.array(BitstringStatusListEntryValidator).optional(),
22576
22729
  boostUri: external_exports.string(),
22577
22730
  credentialId: external_exports.string(),
22578
22731
  refreshId: external_exports.string(),
@@ -22580,11 +22733,111 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22580
22733
  /** The DID to use as credentialSubject.id (recipient DID, or the profile's did:web). */
22581
22734
  holderDid: external_exports.string(),
22582
22735
  /** Present when this idempotencyKey already completed: return it without signing. */
22583
- completed: SendBoostResponseValidator.optional()
22736
+ completed: SendBoostResponseValidator.optional(),
22737
+ /**
22738
+ * Present only when `encryption: 'holder'` was requested: the exact
22739
+ * key-agreement verification-method ids (holder + current managers) the SDK
22740
+ * must encrypt to. Recomputed on every call, so a later manager change can
22741
+ * make a previously-prepared set stale (see `credentialRefresh.sendHolderEncryptedRefreshable`
22742
+ * and `credentialRefresh.getEncryptionRecipients`).
22743
+ */
22744
+ recipientKeyIds: external_exports.array(external_exports.string()).optional()
22584
22745
  });
22585
22746
  var SendInputValidator = external_exports.discriminatedUnion("type", [SendBoostInputValidator]);
22586
22747
  var SendResponseValidator = external_exports.discriminatedUnion("type", [SendBoostResponseValidator]);
22587
- var ConsentFlowTermsStatusValidator = external_exports.enum(["live", "stale", "withdrawn"]);
22748
+ var ConsentFlowTermsStatusValidator = external_exports.enum([
22749
+ "live",
22750
+ "consumed",
22751
+ "withdrawn",
22752
+ "needs_reconsent",
22753
+ "suspended"
22754
+ ]);
22755
+ var CONTRACT_APPROVAL_REQUIRED = "CONTRACT_APPROVAL_REQUIRED";
22756
+ var ConsentFlowContractChangeKindValidator = external_exports.enum([
22757
+ "relaxed",
22758
+ "expanded_optional",
22759
+ "requires_consent"
22760
+ ]);
22761
+ var ConsentFlowContractScopeValidator = external_exports.object({
22762
+ area: external_exports.enum(["read", "write"]),
22763
+ type: external_exports.enum(["credential", "personal"]),
22764
+ key: external_exports.string(),
22765
+ required: external_exports.boolean(),
22766
+ reason: external_exports.string().optional()
22767
+ });
22768
+ var ConsentFlowContractDetailValueValidator = external_exports.union([
22769
+ external_exports.string(),
22770
+ external_exports.boolean(),
22771
+ external_exports.string().array()
22772
+ ]);
22773
+ var ConsentFlowContractDetailChangeValidator = external_exports.object({
22774
+ field: external_exports.enum([
22775
+ "name",
22776
+ "subtitle",
22777
+ "description",
22778
+ "reasonForAccessing",
22779
+ "image",
22780
+ "needsGuardianConsent",
22781
+ "redirectUrl",
22782
+ "frontDoorBoostUri",
22783
+ "expiresAt",
22784
+ "writers",
22785
+ "autoboosts"
22786
+ ]),
22787
+ before: ConsentFlowContractDetailValueValidator.optional(),
22788
+ after: ConsentFlowContractDetailValueValidator.optional()
22789
+ });
22790
+ var ConsentFlowContractDiffValidator = external_exports.object({
22791
+ added: ConsentFlowContractScopeValidator.array(),
22792
+ removed: ConsentFlowContractScopeValidator.array(),
22793
+ changed: ConsentFlowContractScopeValidator.array(),
22794
+ details: ConsentFlowContractDetailChangeValidator.array().optional()
22795
+ });
22796
+ var ConsentFlowContractUpdatePreviewValidator = external_exports.object({
22797
+ headline: external_exports.string(),
22798
+ subhead: external_exports.string(),
22799
+ rows: external_exports.array(
22800
+ external_exports.object({
22801
+ scope: ConsentFlowContractScopeValidator,
22802
+ change: external_exports.enum(["added", "removed", "changed"]),
22803
+ label: external_exports.string(),
22804
+ subtitle: external_exports.string()
22805
+ })
22806
+ ),
22807
+ primaryLabel: external_exports.string()
22808
+ });
22809
+ var ConsentFlowContractStatusValidator = external_exports.enum(["active", "retired"]);
22810
+ var ConsentFlowContractVersionValidator = external_exports.object({
22811
+ version: external_exports.number().int().positive(),
22812
+ createdAt: external_exports.string(),
22813
+ reason: external_exports.string().optional(),
22814
+ kind: ConsentFlowContractChangeKindValidator.optional()
22815
+ });
22816
+ var ConsentFlowContractUpdateResultValidator = external_exports.object({
22817
+ version: external_exports.number().int().positive(),
22818
+ kind: ConsentFlowContractChangeKindValidator,
22819
+ affectedUsers: external_exports.number().int().nonnegative(),
22820
+ preview: ConsentFlowContractUpdatePreviewValidator
22821
+ });
22822
+ var ConsentFlowConsentStatusValidator = external_exports.object({
22823
+ status: ConsentFlowTermsStatusValidator.or(external_exports.literal("not_consented")),
22824
+ consentedVersion: external_exports.number().int().positive().optional(),
22825
+ currentVersion: external_exports.number().int().positive(),
22826
+ needsReconsent: external_exports.boolean(),
22827
+ reviewUrl: external_exports.string().optional()
22828
+ });
22829
+ var ConsentFlowContractNotificationDataValidator = external_exports.object({
22830
+ contractUri: external_exports.string(),
22831
+ contractName: external_exports.string().optional(),
22832
+ fromVersion: external_exports.number().int().positive(),
22833
+ toVersion: external_exports.number().int().positive(),
22834
+ kind: ConsentFlowContractChangeKindValidator,
22835
+ reason: external_exports.string().optional(),
22836
+ diff: ConsentFlowContractDiffValidator,
22837
+ reconsentDeadline: external_exports.string().optional(),
22838
+ reviewUrl: external_exports.string(),
22839
+ preview: ConsentFlowContractUpdatePreviewValidator.optional()
22840
+ });
22588
22841
  var ConsentFlowContractValidator = external_exports.object({
22589
22842
  read: external_exports.object({
22590
22843
  anonymize: external_exports.boolean().optional(),
@@ -22593,13 +22846,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22593
22846
  external_exports.string(),
22594
22847
  external_exports.object({
22595
22848
  required: external_exports.boolean(),
22596
- defaultEnabled: external_exports.boolean().optional()
22849
+ defaultEnabled: external_exports.boolean().optional(),
22850
+ reason: external_exports.string().optional()
22597
22851
  })
22598
22852
  ).default({})
22599
22853
  }).prefault({ categories: {} }),
22600
22854
  personal: external_exports.record(
22601
22855
  external_exports.string(),
22602
- external_exports.object({ required: external_exports.boolean(), defaultEnabled: external_exports.boolean().optional() })
22856
+ external_exports.object({
22857
+ required: external_exports.boolean(),
22858
+ defaultEnabled: external_exports.boolean().optional(),
22859
+ reason: external_exports.string().optional()
22860
+ })
22603
22861
  ).default({})
22604
22862
  }).prefault({ credentials: { categories: {} }, personal: {} }),
22605
22863
  write: external_exports.object({
@@ -22608,16 +22866,55 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22608
22866
  external_exports.string(),
22609
22867
  external_exports.object({
22610
22868
  required: external_exports.boolean(),
22611
- defaultEnabled: external_exports.boolean().optional()
22869
+ defaultEnabled: external_exports.boolean().optional(),
22870
+ reason: external_exports.string().optional()
22612
22871
  })
22613
22872
  ).default({})
22614
22873
  }).prefault({ categories: {} }),
22615
22874
  personal: external_exports.record(
22616
22875
  external_exports.string(),
22617
- external_exports.object({ required: external_exports.boolean(), defaultEnabled: external_exports.boolean().optional() })
22876
+ external_exports.object({
22877
+ required: external_exports.boolean(),
22878
+ defaultEnabled: external_exports.boolean().optional(),
22879
+ reason: external_exports.string().optional()
22880
+ })
22618
22881
  ).default({})
22619
22882
  }).prefault({ credentials: { categories: {} }, personal: {} })
22620
22883
  });
22884
+ var ConsentFlowContractScopePatchValidator = external_exports.object({
22885
+ required: external_exports.boolean(),
22886
+ defaultEnabled: external_exports.boolean().optional(),
22887
+ reason: external_exports.string().optional()
22888
+ }).nullable();
22889
+ var ConsentFlowContractChangesValidator = external_exports.object({
22890
+ contract: external_exports.object({
22891
+ read: external_exports.object({
22892
+ anonymize: external_exports.boolean().optional(),
22893
+ credentials: external_exports.object({
22894
+ categories: external_exports.record(external_exports.string(), ConsentFlowContractScopePatchValidator).optional()
22895
+ }).optional(),
22896
+ personal: external_exports.record(external_exports.string(), ConsentFlowContractScopePatchValidator).optional()
22897
+ }).optional(),
22898
+ write: external_exports.object({
22899
+ credentials: external_exports.object({
22900
+ categories: external_exports.record(external_exports.string(), ConsentFlowContractScopePatchValidator).optional()
22901
+ }).optional(),
22902
+ personal: external_exports.record(external_exports.string(), ConsentFlowContractScopePatchValidator).optional()
22903
+ }).optional()
22904
+ }).optional(),
22905
+ name: external_exports.string().optional(),
22906
+ subtitle: external_exports.string().optional(),
22907
+ description: external_exports.string().optional(),
22908
+ reasonForAccessing: external_exports.string().optional(),
22909
+ image: external_exports.string().optional(),
22910
+ needsGuardianConsent: external_exports.boolean().optional(),
22911
+ redirectUrl: external_exports.string().optional(),
22912
+ frontDoorBoostUri: external_exports.string().optional(),
22913
+ expiresAt: external_exports.string().nullable().optional(),
22914
+ autoboosts: AutoBoostConfigValidator.array().optional(),
22915
+ writers: external_exports.string().array().optional(),
22916
+ recipients: external_exports.string().array().optional()
22917
+ });
22621
22918
  var ConsentFlowContractDetailsValidator = external_exports.object({
22622
22919
  contract: ConsentFlowContractValidator,
22623
22920
  owner: LCNProfileValidator,
@@ -22636,7 +22933,19 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22636
22933
  autoBoosts: external_exports.string().array().optional(),
22637
22934
  writers: external_exports.array(LCNProfileValidator).optional(),
22638
22935
  recipients: external_exports.array(LCNPublicProfileValidator.extend({ did: external_exports.string() })).optional(),
22639
- audienceVersion: external_exports.number().int().nonnegative().optional()
22936
+ audienceVersion: external_exports.number().int().nonnegative().optional(),
22937
+ version: external_exports.number().int().positive(),
22938
+ status: ConsentFlowContractStatusValidator.optional(),
22939
+ latestUpdate: external_exports.object({
22940
+ fromVersion: external_exports.number().int().positive(),
22941
+ toVersion: external_exports.number().int().positive(),
22942
+ kind: ConsentFlowContractChangeKindValidator,
22943
+ reason: external_exports.string().optional(),
22944
+ diff: ConsentFlowContractDiffValidator,
22945
+ reconsentDeadline: external_exports.string().optional(),
22946
+ createdAt: external_exports.string(),
22947
+ preview: ConsentFlowContractUpdatePreviewValidator
22948
+ }).optional()
22640
22949
  });
22641
22950
  var ConsentFlowContractRequestStatusValidator = external_exports.enum(["pending", "accepted", "denied", "cancelled"]).nullable();
22642
22951
  var ConsentFlowContractRequestReadStatusValidator = external_exports.enum(["unseen", "seen"]).nullable();
@@ -22725,7 +23034,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22725
23034
  contract: ConsentFlowContractDetailsValidator,
22726
23035
  uri: external_exports.string(),
22727
23036
  consenter: LCNProfileValidator,
22728
- status: ConsentFlowTermsStatusValidator
23037
+ status: ConsentFlowTermsStatusValidator,
23038
+ consentedVersion: external_exports.number().int().positive(),
23039
+ lastReviewedVersion: external_exports.number().int().positive().optional(),
23040
+ reconsentDeadline: external_exports.string().optional(),
23041
+ newOptionsUntil: external_exports.string().optional(),
23042
+ cumulativeUpdate: ConsentFlowContractDetailsValidator.shape.latestUpdate
22729
23043
  }).array()
22730
23044
  });
22731
23045
  var ConsentFlowGuardianApprovalValidator = external_exports.object({
@@ -22801,7 +23115,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22801
23115
  "update",
22802
23116
  "sync",
22803
23117
  "withdraw",
22804
- "write"
23118
+ "write",
23119
+ "reconsent"
22805
23120
  ]);
22806
23121
  var ConsentFlowTransactionsQueryValidator = external_exports.object({
22807
23122
  terms: ConsentFlowTermsQueryValidator.optional(),
@@ -22820,8 +23135,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22820
23135
  referral: ConsentFlowReferralValidator.optional(),
22821
23136
  id: external_exports.string(),
22822
23137
  action: ConsentFlowTransactionActionValidator,
23138
+ kind: ConsentFlowContractChangeKindValidator.optional(),
22823
23139
  date: external_exports.string(),
22824
- uris: external_exports.string().array().optional()
23140
+ uris: external_exports.string().array().optional(),
23141
+ consentedVersion: external_exports.number().int().positive().optional(),
23142
+ reconsentDeadline: external_exports.string().optional(),
23143
+ newOptionsUntil: external_exports.string().optional()
22825
23144
  });
22826
23145
  var HolderExportConsentRecordValidator = external_exports.object({
22827
23146
  termsUri: external_exports.string(),
@@ -22829,6 +23148,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22829
23148
  contract: ConsentFlowContractDetailsValidator,
22830
23149
  terms: ConsentFlowTermsValidator,
22831
23150
  referral: ConsentFlowReferralValidator.optional(),
23151
+ consentedVersion: external_exports.number().int().positive(),
23152
+ reconsentDeadline: external_exports.string().optional(),
23153
+ newOptionsUntil: external_exports.string().optional(),
23154
+ cumulativeUpdate: ConsentFlowContractDetailsValidator.shape.latestUpdate,
22832
23155
  transactions: ConsentFlowTransactionValidator.array()
22833
23156
  });
22834
23157
  var HolderExportMetadataValidator = external_exports.object({
@@ -22889,10 +23212,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22889
23212
  "GUARDIAN_APPROVED",
22890
23213
  "GUARDIAN_REJECTED",
22891
23214
  "APP_NOTIFICATION",
23215
+ "ANNOUNCEMENT",
22892
23216
  "CREDENTIAL_REVOKED",
22893
23217
  "CREDENTIAL_SUSPENDED",
22894
23218
  "CREDENTIAL_UNSUSPENDED",
22895
- "CREDENTIAL_REFRESHED"
23219
+ "CREDENTIAL_REFRESHED",
23220
+ "CONSENT_FLOW_CONTRACT_UPDATED"
22896
23221
  ]);
22897
23222
  var LCNNotificationMessageValidator = external_exports.object({
22898
23223
  title: external_exports.string().optional(),
@@ -22921,12 +23246,26 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22921
23246
  timestamp: external_exports.iso.datetime().optional()
22922
23247
  });
22923
23248
  var LCNNotificationMetadataValidator = external_exports.object({
22924
- connectionPrompt: LCNConnectionPromptMetadataValidator.optional()
23249
+ connectionPrompt: LCNConnectionPromptMetadataValidator.optional(),
23250
+ campaignId: external_exports.string().regex(/^[a-z0-9-]{3,64}$/).optional(),
23251
+ campaignCreatedAt: external_exports.iso.datetime().optional(),
23252
+ campaignHasInApp: external_exports.boolean().optional(),
23253
+ campaignTestId: external_exports.uuid().optional()
22925
23254
  }).catchall(external_exports.unknown());
22926
23255
  var LCNNotificationDataValidator = external_exports.object({
22927
23256
  vcUris: external_exports.array(external_exports.string()).optional(),
22928
23257
  vpUris: external_exports.array(external_exports.string()).optional(),
22929
23258
  transaction: ConsentFlowTransactionValidator.optional(),
23259
+ contractUri: external_exports.string().optional(),
23260
+ contractName: external_exports.string().optional(),
23261
+ fromVersion: external_exports.number().int().positive().optional(),
23262
+ toVersion: external_exports.number().int().positive().optional(),
23263
+ kind: ConsentFlowContractChangeKindValidator.optional(),
23264
+ reason: external_exports.string().optional(),
23265
+ diff: ConsentFlowContractDiffValidator.optional(),
23266
+ reconsentDeadline: external_exports.string().optional(),
23267
+ reviewUrl: external_exports.string().optional(),
23268
+ preview: ConsentFlowContractUpdatePreviewValidator.optional(),
22930
23269
  inbox: LCNNotificationInboxValidator.optional(),
22931
23270
  metadata: LCNNotificationMetadataValidator.optional()
22932
23271
  }).loose();
@@ -24039,29 +24378,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
24039
24378
  */
24040
24379
  wrongAttempts: external_exports.number().int().nonnegative().optional()
24041
24380
  });
24042
- var BITSTRING_STATUS_PURPOSES = ["revocation", "suspension"];
24043
- var DEFAULT_BITSTRING_STATUS_LIST_SIZE = 131072;
24044
- var BitstringStatusPurposeValidator = external_exports.enum(BITSTRING_STATUS_PURPOSES);
24045
- var BitstringStatusListEntryValidator = external_exports.object({
24046
- id: external_exports.string().optional(),
24047
- type: external_exports.literal("BitstringStatusListEntry"),
24048
- statusPurpose: BitstringStatusPurposeValidator,
24049
- statusListIndex: external_exports.string().or(external_exports.number().int().nonnegative()),
24050
- statusListCredential: external_exports.string()
24051
- });
24052
- var AllocatedBitstringStatusListEntryValidator = BitstringStatusListEntryValidator.extend({
24053
- id: external_exports.string()
24054
- });
24055
- var BitstringStatusListCredentialSubjectValidator = external_exports.object({
24056
- id: external_exports.string().optional(),
24057
- type: external_exports.literal("BitstringStatusList"),
24058
- statusPurpose: BitstringStatusPurposeValidator,
24059
- encodedList: external_exports.string()
24060
- });
24061
- var AllocateCredentialStatusInputValidator = external_exports.object({
24062
- statusPurposes: external_exports.array(BitstringStatusPurposeValidator).optional(),
24063
- listSize: external_exports.number().int().positive().optional()
24064
- }).default({});
24065
24381
  var isSafeInAppMessagePath = /* @__PURE__ */ __name2((path) => {
24066
24382
  let decoded = path;
24067
24383
  for (let depth = 0; depth < 5; depth += 1) {
@@ -24389,24 +24705,46 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
24389
24705
  }, "parseInAppMessagesFlag");
24390
24706
  var CampaignIdValidator = external_exports.string().regex(/^[a-z0-9-]{3,64}$/);
24391
24707
  var CampaignStatusValidator = external_exports.enum(["draft", "live", "paused", "archived"]);
24392
- var CampaignChannelValidator = external_exports.enum(["inApp", "notify"]);
24708
+ var CampaignChannelValidator = external_exports.enum(["inApp", "notify", "email"]);
24393
24709
  var CampaignEventValidator = external_exports.enum(["shown", "clicked", "dismissed", "converted"]);
24394
- var timestamp = external_exports.iso.datetime({ offset: true }).overwrite((value) => new Date(value).toISOString());
24710
+ var timestamp = external_exports.iso.datetime({ offset: true }).overwrite((value) => {
24711
+ const date5 = new Date(value);
24712
+ return Number.isFinite(date5.getTime()) ? date5.toISOString() : value;
24713
+ });
24395
24714
  var notification = external_exports.object({ title: external_exports.string().min(1), body: external_exports.string().min(1) }).strict();
24396
- var channels = external_exports.array(CampaignChannelValidator).min(1).max(2).refine((values) => new Set(values).size === values.length, "Channels must be unique");
24715
+ var CampaignEmailValidator = external_exports.object({
24716
+ subject: external_exports.string().trim().min(1).max(200).regex(/^[^\r\n]+$/),
24717
+ title: external_exports.string().trim().min(1).max(200),
24718
+ body: external_exports.string().trim().min(1).max(2e4),
24719
+ heroImageUrl: external_exports.url().startsWith("https://").max(2048).optional(),
24720
+ ctaLabel: external_exports.string().trim().min(1).max(100)
24721
+ }).strict();
24722
+ var AnnouncementPreferencesValidator = external_exports.object({
24723
+ announcementEmailOptOut: external_exports.boolean(),
24724
+ announcementPushOptOut: external_exports.boolean()
24725
+ }).strict();
24726
+ var channels = external_exports.array(CampaignChannelValidator).min(1).max(3).refine((values) => new Set(values).size === values.length, "Channels must be unique");
24397
24727
  var campaignDefinition = external_exports.object({
24398
24728
  id: CampaignIdValidator,
24399
24729
  name: external_exports.string().trim().min(1).max(200),
24400
24730
  status: CampaignStatusValidator.default("draft"),
24401
24731
  channels,
24402
- message: inAppMessageValidator,
24732
+ message: inAppMessageValidator.optional(),
24403
24733
  notification: notification.optional(),
24734
+ email: CampaignEmailValidator.optional(),
24404
24735
  startsAt: timestamp.optional(),
24405
24736
  endsAt: timestamp.optional(),
24406
24737
  excludeMinors: external_exports.boolean().default(true),
24407
24738
  selfEnroll: external_exports.boolean().default(false)
24408
24739
  }).strict();
24409
24740
  var validDefinition = /* @__PURE__ */ __name2((value, ctx) => {
24741
+ if (value.channels.includes("inApp") && !value.message) {
24742
+ ctx.addIssue({
24743
+ code: "custom",
24744
+ path: ["message"],
24745
+ message: "In-app requires a message"
24746
+ });
24747
+ }
24410
24748
  if (value.channels.includes("notify") && !value.notification) {
24411
24749
  ctx.addIssue({
24412
24750
  code: "custom",
@@ -24414,15 +24752,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
24414
24752
  message: "Notify requires a title and body"
24415
24753
  });
24416
24754
  }
24755
+ if (value.channels.includes("email") && !value.email) {
24756
+ ctx.addIssue({
24757
+ code: "custom",
24758
+ path: ["email"],
24759
+ message: "Email requires announcement content"
24760
+ });
24761
+ }
24417
24762
  if (value.startsAt && value.endsAt && value.startsAt >= value.endsAt) {
24418
24763
  ctx.addIssue({ code: "custom", path: ["endsAt"], message: "End must be after start" });
24419
24764
  }
24420
24765
  }, "validDefinition");
24421
24766
  var CampaignValidator = campaignDefinition.extend({
24767
+ tenantId: external_exports.string().optional(),
24422
24768
  createdAt: timestamp,
24423
24769
  updatedAt: timestamp
24424
24770
  }).superRefine(validDefinition).superRefine((value, ctx) => {
24425
- if (value.message.id !== value.id) {
24771
+ if (value.message && value.message.id !== value.id) {
24426
24772
  ctx.addIssue({
24427
24773
  code: "custom",
24428
24774
  path: ["message", "id"],
@@ -24431,21 +24777,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
24431
24777
  }
24432
24778
  });
24433
24779
  var CreateCampaignInputValidator = campaignDefinition.extend({
24434
- message: inAppMessageAuthoringValidator
24780
+ message: inAppMessageAuthoringValidator.optional()
24435
24781
  }).superRefine(validDefinition);
24436
24782
  var CampaignUpdatesValidator = campaignDefinition.omit({ id: true }).partial().extend({
24437
24783
  // A PATCH must not apply creation defaults to fields the caller omitted.
24438
24784
  status: CampaignStatusValidator.optional(),
24439
24785
  excludeMinors: external_exports.boolean().optional(),
24440
24786
  selfEnroll: external_exports.boolean().optional(),
24441
- message: inAppMessageAuthoringValidator.optional(),
24787
+ message: inAppMessageAuthoringValidator.nullable().optional(),
24442
24788
  notification: notification.nullable().optional(),
24789
+ email: CampaignEmailValidator.nullable().optional(),
24443
24790
  startsAt: timestamp.nullable().optional(),
24444
24791
  endsAt: timestamp.nullable().optional()
24445
24792
  }).strict();
24446
24793
  var UpdateCampaignInputValidator = external_exports.object({
24447
24794
  campaignId: CampaignIdValidator,
24448
- updates: CampaignUpdatesValidator
24795
+ updates: CampaignUpdatesValidator,
24796
+ expectedUpdatedAt: timestamp.optional()
24449
24797
  }).strict();
24450
24798
  var identifier = external_exports.string().trim().min(1).max(2048);
24451
24799
  var metadataKey = external_exports.string().regex(/^[a-zA-Z_][a-zA-Z0-9_.-]{0,63}$/).refine(
@@ -24497,7 +24845,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
24497
24845
  clickedAt: timestamp.optional(),
24498
24846
  dismissedAt: timestamp.optional(),
24499
24847
  convertedAt: timestamp.optional(),
24500
- notifiedAt: timestamp.optional()
24848
+ notifiedAt: timestamp.optional(),
24849
+ emailedAt: timestamp.optional()
24501
24850
  });
24502
24851
  var MyCampaignValidator = external_exports.object({
24503
24852
  campaign: campaignDefinition.pick({
@@ -24506,12 +24855,19 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
24506
24855
  startsAt: true,
24507
24856
  endsAt: true,
24508
24857
  selfEnroll: true
24509
- }),
24510
- state: CampaignUserStateValidator
24858
+ }).extend({ message: inAppMessageValidator }),
24859
+ state: CampaignUserStateValidator,
24860
+ testId: external_exports.uuid().optional()
24861
+ });
24862
+ var CampaignTestValidator = external_exports.object({
24863
+ id: external_exports.uuid(),
24864
+ campaignId: CampaignIdValidator,
24865
+ message: inAppMessageValidator
24511
24866
  });
24512
24867
  var CampaignStatsValidator = external_exports.object({
24513
24868
  audience: external_exports.number().int().nonnegative(),
24514
24869
  notified: external_exports.number().int().nonnegative(),
24870
+ emailed: external_exports.number().int().nonnegative(),
24515
24871
  shown: external_exports.number().int().nonnegative(),
24516
24872
  clicked: external_exports.number().int().nonnegative(),
24517
24873
  dismissed: external_exports.number().int().nonnegative(),
@@ -24538,6 +24894,31 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
24538
24894
  hasMore: external_exports.boolean(),
24539
24895
  cursor: external_exports.string().optional()
24540
24896
  });
24897
+ var CampaignDispatchPreviewValidator = external_exports.object({
24898
+ campaignId: CampaignIdValidator,
24899
+ audienceCount: external_exports.number().int().nonnegative(),
24900
+ alreadyNotifiedCount: external_exports.number().int().nonnegative(),
24901
+ recipientCount: external_exports.number().int().nonnegative(),
24902
+ notificationRecipientCount: external_exports.number().int().nonnegative().optional(),
24903
+ emailRecipientCount: external_exports.number().int().nonnegative().optional(),
24904
+ previewToken: external_exports.string().regex(/^[a-f0-9]{64}$/),
24905
+ blockedReason: external_exports.enum([
24906
+ "not_live",
24907
+ "notify_disabled",
24908
+ "email_confirmation_required",
24909
+ "not_started",
24910
+ "ended",
24911
+ "no_recipients"
24912
+ ]).optional()
24913
+ });
24914
+ var CampaignDispatchOptionsValidator = external_exports.object({
24915
+ expectedPreviewToken: CampaignDispatchPreviewValidator.shape.previewToken.optional()
24916
+ }).strict();
24917
+ var CampaignAudienceResultValidator = external_exports.object({
24918
+ count: external_exports.number().int().nonnegative(),
24919
+ added: external_exports.number().int().nonnegative(),
24920
+ notFound: external_exports.array(external_exports.string())
24921
+ });
24541
24922
  var SHARE_LINK_ID_BYTES = 16;
24542
24923
  var SHARE_CONTENT_KEY_BYTES = 32;
24543
24924
  var SHARE_IV_BYTES = 12;
@@ -25062,6 +25443,217 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
25062
25443
  }
25063
25444
  );
25064
25445
  var GenerateSkillIconsInputValidator = external_exports.object({ names: SkillIconNamesValidator });
25446
+ var RoleValidator = external_exports.enum(["user", "assistant", "tool", "system"]);
25447
+ var AiSessionMode = {
25448
+ tutor: "ai-tutor",
25449
+ insights: "ai-insights"
25450
+ };
25451
+ var AiSessionModeValidator = external_exports.enum([AiSessionMode.tutor, AiSessionMode.insights]);
25452
+ var StructuredResponseValidator = external_exports.object({
25453
+ notes: external_exports.string().optional(),
25454
+ questions: external_exports.array(external_exports.string())
25455
+ });
25456
+ var IntroStreamModeValidator = external_exports.enum(["formatted", "structured"]);
25457
+ var ChatMessageValidator = external_exports.object({
25458
+ role: RoleValidator,
25459
+ content: external_exports.string().nullable(),
25460
+ tool_call_id: external_exports.string().optional(),
25461
+ tool_calls: external_exports.array(
25462
+ external_exports.object({
25463
+ id: external_exports.string(),
25464
+ type: external_exports.literal("function"),
25465
+ function: external_exports.object({
25466
+ name: external_exports.string(),
25467
+ arguments: external_exports.string()
25468
+ })
25469
+ })
25470
+ ).optional()
25471
+ });
25472
+ var InsightArtifactValidator = external_exports.object({
25473
+ title: external_exports.string(),
25474
+ summary: external_exports.string(),
25475
+ category: external_exports.string(),
25476
+ question: external_exports.string(),
25477
+ narrative: external_exports.string()
25478
+ });
25479
+ var ArtifactSuggestionValidator = external_exports.object({
25480
+ artifact: InsightArtifactValidator,
25481
+ source_text: external_exports.string().optional(),
25482
+ created_at: external_exports.string()
25483
+ });
25484
+ var ThreadCredentialContextValidator = external_exports.object({
25485
+ uri: external_exports.string(),
25486
+ type: external_exports.string(),
25487
+ context: external_exports.string(),
25488
+ score: external_exports.number(),
25489
+ strongestScore: external_exports.number().optional(),
25490
+ averageScore: external_exports.number().optional(),
25491
+ matchCount: external_exports.number().optional(),
25492
+ title: external_exports.string().optional()
25493
+ });
25494
+ var ThreadValidator = external_exports.object({
25495
+ id: external_exports.string(),
25496
+ did: external_exports.string(),
25497
+ topicCredentialUri: external_exports.string().nullable().optional(),
25498
+ title: external_exports.string(),
25499
+ created_at: external_exports.string(),
25500
+ last_message_at: external_exports.string(),
25501
+ active: external_exports.boolean().optional(),
25502
+ ended_at: external_exports.string().optional(),
25503
+ plan_started_at: external_exports.string().optional(),
25504
+ summaries: external_exports.array(
25505
+ external_exports.object({
25506
+ summary_data: external_exports.string(),
25507
+ credential_uri: external_exports.string(),
25508
+ created_at: external_exports.string()
25509
+ })
25510
+ ).optional(),
25511
+ plans: external_exports.array(
25512
+ external_exports.object({
25513
+ plan_data: external_exports.string(),
25514
+ created_at: external_exports.string(),
25515
+ consentRevision: external_exports.string().optional()
25516
+ })
25517
+ ).optional(),
25518
+ credentials: external_exports.array(ThreadCredentialContextValidator).optional(),
25519
+ credentialSearchTopic: external_exports.string().optional(),
25520
+ credentialContextStatus: external_exports.enum(["pending", "ready", "empty", "error"]).optional(),
25521
+ mode: AiSessionModeValidator.optional(),
25522
+ artifactSuggestions: external_exports.array(ArtifactSuggestionValidator).optional()
25523
+ });
25524
+ var CredentialVerificationMetadataValidator = external_exports.object({
25525
+ credentialUri: external_exports.string(),
25526
+ contentHash: external_exports.string().regex(/^[a-f0-9]{64}$/),
25527
+ status: external_exports.enum(["valid", "invalid"]),
25528
+ checkedAt: external_exports.string().datetime(),
25529
+ verifier: external_exports.object({
25530
+ name: external_exports.string(),
25531
+ version: external_exports.string()
25532
+ }),
25533
+ verifiedPayload: external_exports.enum(["credential", "boostCredential"]),
25534
+ checks: external_exports.array(external_exports.string()),
25535
+ errors: external_exports.array(external_exports.string()),
25536
+ warnings: external_exports.array(external_exports.string()),
25537
+ provenance: external_exports.object({
25538
+ source: external_exports.enum(["wallet", "generated"]),
25539
+ retrievedAt: external_exports.string().datetime()
25540
+ }),
25541
+ consent: external_exports.object({
25542
+ contractUri: external_exports.string(),
25543
+ receiptId: external_exports.string().min(1),
25544
+ grantedAt: external_exports.string().datetime().optional(),
25545
+ updatedAt: external_exports.string().datetime(),
25546
+ contractUpdatedAt: external_exports.string().min(1),
25547
+ status: external_exports.literal("live"),
25548
+ expiresAt: external_exports.string().datetime().optional(),
25549
+ contractExpiresAt: external_exports.string().datetime().optional(),
25550
+ categories: external_exports.array(external_exports.string()),
25551
+ credentialUris: external_exports.array(external_exports.string()),
25552
+ personalFields: external_exports.array(external_exports.string()),
25553
+ purpose: external_exports.enum(["credential-ingestion", "model-inference", "embedding"]),
25554
+ revision: external_exports.string().min(1),
25555
+ guardian: external_exports.object({ required: external_exports.boolean(), approved: external_exports.boolean() })
25556
+ })
25557
+ });
25558
+ var ModelSafeCredentialFactValidator = external_exports.object({
25559
+ kind: external_exports.enum([
25560
+ "skill",
25561
+ "goal",
25562
+ "achievement",
25563
+ "course",
25564
+ "experience",
25565
+ "competency",
25566
+ "title",
25567
+ "summary",
25568
+ "assessment",
25569
+ "grade",
25570
+ "date",
25571
+ "alignment",
25572
+ "criteria",
25573
+ "pathway",
25574
+ "topic"
25575
+ ]),
25576
+ value: external_exports.string().min(1).max(240),
25577
+ label: external_exports.string().min(1).max(120).optional()
25578
+ });
25579
+ var ModelSafeCredentialProjectionValidator = external_exports.object({
25580
+ schemaVersion: external_exports.literal("1"),
25581
+ category: external_exports.string().min(1).max(120),
25582
+ credentialTypes: external_exports.array(external_exports.string().min(1).max(120)).max(20),
25583
+ facts: external_exports.array(ModelSafeCredentialFactValidator).max(100),
25584
+ // Present only on credentials that are past their expiry, so the model can
25585
+ // tell a lapsed credential from a current one.
25586
+ expired: external_exports.literal(true).optional(),
25587
+ expirationDate: external_exports.string().datetime().optional()
25588
+ });
25589
+ var AIPassportCredentialRecordValidator = external_exports.object({
25590
+ id: external_exports.string(),
25591
+ uri: external_exports.string(),
25592
+ category: external_exports.string(),
25593
+ credential: VCValidator,
25594
+ aiContext: external_exports.string(),
25595
+ generalSummary: external_exports.string().optional(),
25596
+ createdAt: external_exports.string(),
25597
+ verification: CredentialVerificationMetadataValidator.optional(),
25598
+ projection: ModelSafeCredentialProjectionValidator.optional()
25599
+ });
25600
+ var AuthenticatedMessageValidator = external_exports.object({
25601
+ message: ChatMessageValidator.optional(),
25602
+ threadId: external_exports.string().optional(),
25603
+ selectedQuestion: external_exports.string().optional(),
25604
+ action: external_exports.enum([
25605
+ "start_topic",
25606
+ "continue_plan",
25607
+ "start_topic_uri",
25608
+ "start_learning_pathway",
25609
+ "start_insights_session",
25610
+ "close_insights_session",
25611
+ "artifact_suggestion"
25612
+ ]).optional(),
25613
+ topic: external_exports.string().optional(),
25614
+ topicUri: external_exports.string().optional(),
25615
+ pathwayUri: external_exports.string().optional(),
25616
+ mode: AiSessionModeValidator.optional(),
25617
+ introStreamMode: IntroStreamModeValidator.optional(),
25618
+ // BCP-47 language for AI responses (LC-1901). This has to live on the
25619
+ // validator, not just the inferred type — z.object strips unknown keys, so an
25620
+ // undeclared `locale` would be dropped before the WS handler ever saw it.
25621
+ locale: external_exports.string().nullish()
25622
+ });
25623
+ var DebugInfoValidator = external_exports.object({
25624
+ operation: external_exports.string(),
25625
+ collection: external_exports.string(),
25626
+ input: external_exports.unknown().optional(),
25627
+ output: external_exports.unknown().optional(),
25628
+ timestamp: external_exports.string(),
25629
+ duration: external_exports.number().optional()
25630
+ });
25631
+ var TimingEventValidator = external_exports.object({
25632
+ event: external_exports.literal("timing"),
25633
+ operation: external_exports.string(),
25634
+ phase: external_exports.enum(["start", "end", "complete"]),
25635
+ duration: external_exports.number().optional(),
25636
+ metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
25637
+ timestamp: external_exports.string()
25638
+ });
25639
+ var LearningPathwayValidator = external_exports.object({
25640
+ id: external_exports.string(),
25641
+ learningPathway: external_exports.object({
25642
+ stepIndex: external_exports.number(),
25643
+ step: external_exports.object({
25644
+ title: external_exports.string(),
25645
+ description: external_exports.string(),
25646
+ summary: external_exports.string(),
25647
+ learned: external_exports.array(external_exports.string()),
25648
+ skills: external_exports.array(
25649
+ external_exports.object({
25650
+ title: external_exports.string(),
25651
+ description: external_exports.string()
25652
+ })
25653
+ )
25654
+ })
25655
+ })
25656
+ });
25065
25657
  }
25066
25658
  });
25067
25659
 
@@ -25087,12 +25679,14 @@ __export(index_exports, {
25087
25679
  EMAIL_RELAY_ALGORITHM: () => EMAIL_RELAY_ALGORITHM,
25088
25680
  EMAIL_RELAY_ENVELOPE_VERSION: () => EMAIL_RELAY_ENVELOPE_VERSION,
25089
25681
  ESCROW_ALGORITHM: () => ESCROW_ALGORITHM,
25682
+ ESCROW_AUTHORITY_TENANT_PATTERN: () => ESCROW_AUTHORITY_TENANT_PATTERN,
25090
25683
  ESCROW_BLOB_INFO: () => ESCROW_BLOB_INFO,
25091
25684
  ESCROW_CLIENT_KEY_ID: () => ESCROW_CLIENT_KEY_ID,
25092
25685
  ESCROW_ENROLLMENT_INTENT_DOMAIN: () => ESCROW_ENROLLMENT_INTENT_DOMAIN,
25093
25686
  ESCROW_ENVELOPE_VERSION: () => ESCROW_ENVELOPE_VERSION,
25094
25687
  ESCROW_PIN_MAX_ATTEMPTS: () => ESCROW_PIN_MAX_ATTEMPTS,
25095
25688
  ESCROW_RELEASE_INFO: () => ESCROW_RELEASE_INFO,
25689
+ EscrowAuthorityTenantMismatchError: () => EscrowAuthorityTenantMismatchError,
25096
25690
  EscrowEvidenceError: () => EscrowEvidenceError,
25097
25691
  EscrowHoldRestartThrottledError: () => EscrowHoldRestartThrottledError,
25098
25692
  EscrowPinLockedError: () => EscrowPinLockedError,
@@ -25101,6 +25695,8 @@ __export(index_exports, {
25101
25695
  EscrowPinUnavailableError: () => EscrowPinUnavailableError,
25102
25696
  EscrowRequestError: () => EscrowRequestError,
25103
25697
  IdentityRecoverySessionConsumedError: () => IdentityRecoverySessionConsumedError,
25698
+ MAX_ESCROW_EMAIL_BRAND_DIGITS: () => MAX_ESCROW_EMAIL_BRAND_DIGITS,
25699
+ MAX_ESCROW_EMAIL_BRAND_LENGTH: () => MAX_ESCROW_EMAIL_BRAND_LENGTH,
25104
25700
  NitroAttestationError: () => NitroAttestationError,
25105
25701
  PIN_MAX_LENGTH: () => PIN_MAX_LENGTH,
25106
25702
  PIN_MIN_LENGTH: () => PIN_MIN_LENGTH,
@@ -25118,6 +25714,7 @@ __export(index_exports, {
25118
25714
  bufferToBase64: () => bufferToBase64,
25119
25715
  buildRecoveryPhraseChallengeOptions: () => buildRecoveryPhraseChallengeOptions,
25120
25716
  bytesToHex: () => bytesToHex,
25717
+ canonicalEscrowEmailBrand: () => canonicalEscrowEmailBrand,
25121
25718
  clearAllShares: () => clearAllShares,
25122
25719
  constantTimeEqualHex: () => constantTimeEqualHex,
25123
25720
  countWords: () => countWords,
@@ -26508,6 +27105,16 @@ var ESCROW_BLOB_INFO = "learncard-escrow-blob-v1";
26508
27105
  var ESCROW_RELEASE_INFO = "learncard-escrow-release-v1";
26509
27106
  var ESCROW_CLIENT_KEY_ID = "client";
26510
27107
  var RECOVERY_LANGUAGES = ["en", "es", "fr", "ar"];
27108
+ var MAX_ESCROW_EMAIL_BRAND_LENGTH = 32;
27109
+ var MAX_ESCROW_EMAIL_BRAND_DIGITS = 3;
27110
+ var canonicalEscrowEmailBrand = /* @__PURE__ */ __name((raw) => {
27111
+ if (typeof raw !== "string") return void 0;
27112
+ const brand = raw.split(" ").filter((word) => word.length > 0).join(" ");
27113
+ if (brand.length === 0 || brand.length > MAX_ESCROW_EMAIL_BRAND_LENGTH || !/^[A-Za-z][A-Za-z0-9 '&-]*$/.test(brand) || (brand.match(/[0-9]/g)?.length ?? 0) > MAX_ESCROW_EMAIL_BRAND_DIGITS || /http|www/i.test(brand)) {
27114
+ return void 0;
27115
+ }
27116
+ return brand;
27117
+ }, "canonicalEscrowEmailBrand");
26511
27118
  var encodeUtf82 = /* @__PURE__ */ __name((value) => {
26512
27119
  const bytes3 = new TextEncoder().encode(value);
26513
27120
  const copy = new Uint8Array(new ArrayBuffer(bytes3.byteLength));
@@ -26563,6 +27170,7 @@ var parseEscrowBlobPlaintext = /* @__PURE__ */ __name((value) => {
26563
27170
  }
26564
27171
  recoveryContact = { recoveryEmail: email, recoveryLanguage: language };
26565
27172
  }
27173
+ const recoveryBrand = canonicalEscrowEmailBrand(value.recoveryBrand);
26566
27174
  return {
26567
27175
  version: ESCROW_ENVELOPE_VERSION,
26568
27176
  recoveryShare: requireString2(value, "recoveryShare", {
@@ -26579,7 +27187,8 @@ var parseEscrowBlobPlaintext = /* @__PURE__ */ __name((value) => {
26579
27187
  pattern: /^[0-9a-f]{64}$/i
26580
27188
  }).toLowerCase()
26581
27189
  } : {},
26582
- ...recoveryContact
27190
+ ...recoveryContact,
27191
+ ...recoveryBrand !== void 0 ? { recoveryBrand } : {}
26583
27192
  };
26584
27193
  }, "parseEscrowBlobPlaintext");
26585
27194
  var parseEscrowReleasePlaintext = /* @__PURE__ */ __name((value) => {
@@ -27148,6 +27757,30 @@ var wNAF = /* @__PURE__ */ __name((n) => {
27148
27757
  return { p, f };
27149
27758
  }, "wNAF");
27150
27759
 
27760
+ // src/escrow-authority.types.ts
27761
+ var EscrowEvidenceError = class extends Error {
27762
+ static {
27763
+ __name(this, "EscrowEvidenceError");
27764
+ }
27765
+ constructor() {
27766
+ super("Automatic recovery evidence could not be verified.");
27767
+ this.name = "EscrowEvidenceError";
27768
+ }
27769
+ };
27770
+ var ESCROW_AUTHORITY_TENANT_PATTERN = /^[A-Za-z0-9_-]{1,128}$/;
27771
+ var EscrowAuthorityTenantMismatchError = class extends EscrowEvidenceError {
27772
+ static {
27773
+ __name(this, "EscrowAuthorityTenantMismatchError");
27774
+ }
27775
+ constructor(expectedTenant, signedTenant) {
27776
+ super();
27777
+ this.name = "EscrowAuthorityTenantMismatchError";
27778
+ this.expectedTenant = expectedTenant;
27779
+ this.signedTenant = signedTenant;
27780
+ this.message = `Escrow authority tenant mismatch: the enclave signed for "${signedTenant}" but this app expects "${expectedTenant}". Set auth.sss.escrowAuthorityTenant to the enclave's ESCROW_AUTHORITY_TENANT.`;
27781
+ }
27782
+ };
27783
+
27151
27784
  // src/escrow-enrollment-intent.ts
27152
27785
  var ESCROW_ENROLLMENT_INTENT_DOMAIN = "learncard-escrow-enrollment-intent-v2\0";
27153
27786
  var BASE58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
@@ -27228,7 +27861,7 @@ var encodeEscrowEnrollmentIntent = /* @__PURE__ */ __name((intent) => {
27228
27861
  Object.keys(intent).length === FIELDS.length && FIELDS.every((field) => Object.prototype.hasOwnProperty.call(intent, field))
27229
27862
  );
27230
27863
  requireIntent(intent.version === 2 && typeof intent.allowRewrap === "boolean");
27231
- requireIntent(matches(intent.tenant, /^[A-Za-z0-9_-]{1,128}$/));
27864
+ requireIntent(matches(intent.tenant, ESCROW_AUTHORITY_TENANT_PATTERN));
27232
27865
  requireIntent(matches(intent.authorityGeneration, /^[A-Za-z0-9_-]{1,128}$/));
27233
27866
  requireIntent(matches(intent.requestId, /^[A-Za-z0-9._-]{1,112}$/));
27234
27867
  didPublicKey(intent.did);
@@ -29694,17 +30327,6 @@ var verifyEnclaveAttestation = /* @__PURE__ */ __name(async (attestation, policy
29694
30327
  };
29695
30328
  }, "verifyEnclaveAttestation");
29696
30329
 
29697
- // src/escrow-authority.types.ts
29698
- var EscrowEvidenceError = class extends Error {
29699
- static {
29700
- __name(this, "EscrowEvidenceError");
29701
- }
29702
- constructor() {
29703
- super("Automatic recovery evidence could not be verified.");
29704
- this.name = "EscrowEvidenceError";
29705
- }
29706
- };
29707
-
29708
30330
  // src/escrow-authority.ts
29709
30331
  var fail2 = /* @__PURE__ */ __name(() => {
29710
30332
  throw new EscrowEvidenceError();
@@ -29743,6 +30365,12 @@ var verifyEscrowCodeDelivery = /* @__PURE__ */ __name(async (delivery, expected,
29743
30365
  var requireEvidence = /* @__PURE__ */ __name((condition) => {
29744
30366
  if (!condition) fail2();
29745
30367
  }, "requireEvidence");
30368
+ var requireAuthorityTenant = /* @__PURE__ */ __name((signedTenant, expectedTenant) => {
30369
+ if (signedTenant === expectedTenant) return;
30370
+ if (typeof signedTenant === "string" && ESCROW_AUTHORITY_TENANT_PATTERN.test(signedTenant))
30371
+ throw new EscrowAuthorityTenantMismatchError(expectedTenant, signedTenant);
30372
+ fail2();
30373
+ }, "requireAuthorityTenant");
29746
30374
  var object = /* @__PURE__ */ __name((value) => {
29747
30375
  if (!value || typeof value !== "object" || Array.isArray(value)) return fail2();
29748
30376
  return value;
@@ -29935,7 +30563,8 @@ var verifyEscrowAuthorityState = /* @__PURE__ */ __name(async (response, nonce,
29935
30563
  const { payload } = await verifyRecord(raw.proof, "snapshot", identity);
29936
30564
  if (!Array.isArray(payload) || payload.length !== 2 || payload[0] !== nonce) return fail2();
29937
30565
  const signed = state(payload[1]);
29938
- requireEvidence(signed.tenant === tenant && signed.did === did);
30566
+ requireEvidence(signed.did === did);
30567
+ requireAuthorityTenant(signed.tenant, tenant);
29939
30568
  requireEvidence(JSON.stringify(signed) === JSON.stringify(state(raw.state)));
29940
30569
  if (signed.envelope) {
29941
30570
  requireEvidence(
@@ -30025,7 +30654,8 @@ var verifyEscrowHoldRecord = /* @__PURE__ */ __name(async (record, expected, ide
30025
30654
  keys(commit, ["schemaVersion", "binding", "executionId", "revisions", "transactionDigest"]);
30026
30655
  const binding = object(commit.binding);
30027
30656
  keys(binding, ["tenant", "generation", "didHash"]);
30028
- requireEvidence(commit.schemaVersion === 1 && binding.tenant === expected.tenant);
30657
+ requireEvidence(commit.schemaVersion === 1);
30658
+ requireAuthorityTenant(binding.tenant, expected.tenant);
30029
30659
  const authorityGeneration = text(binding.generation, 128);
30030
30660
  if (historical) requireEvidence(authorityGeneration === historical.authorityGeneration);
30031
30661
  requireEvidence(bytesToHex(bytes2(binding.didHash, 32)) === await hash(utf82(expected.did)));
@@ -30074,7 +30704,7 @@ var resolveEscrowEnrollmentAction = /* @__PURE__ */ __name((current, input) => {
30074
30704
  const action = disabling ? "disable" : current.status !== "active" ? "enroll" : current.hasPin && pinAction === "keep" ? "carry" : "replace";
30075
30705
  return { action, pinAction, bindsRecoveryContact: action === "enroll" || action === "replace" };
30076
30706
  }, "resolveEscrowEnrollmentAction");
30077
- var violatesCarryContactRule = /* @__PURE__ */ __name((action, target) => action === "carry" && !!target && (!!target.recoveryEmail || !!target.recoveryLanguage), "violatesCarryContactRule");
30707
+ var violatesCarryContactRule = /* @__PURE__ */ __name((action, target) => action === "carry" && !!target && (!!target.recoveryEmail || !!target.recoveryLanguage || !!target.recoveryBrand), "violatesCarryContactRule");
30078
30708
  var createEscrowEnrollmentIntent = /* @__PURE__ */ __name(async (input) => {
30079
30709
  const current = state(input.state);
30080
30710
  const target = input.target === null ? null : envelope(input.target);
@@ -30428,6 +31058,7 @@ var EscrowRequestError = class extends Error {
30428
31058
  __name(this, "EscrowRequestError");
30429
31059
  }
30430
31060
  };
31061
+ var isConflictRefusal = /* @__PURE__ */ __name((error) => error instanceof EscrowRequestError && error.status === 409, "isConflictRefusal");
30431
31062
  var DuplicateShareCoordinateError = class extends Error {
30432
31063
  static {
30433
31064
  __name(this, "DuplicateShareCoordinateError");
@@ -30871,6 +31502,16 @@ function createSSSStrategy(config) {
30871
31502
  emailBranding,
30872
31503
  tenantId
30873
31504
  } = config;
31505
+ const authorityTenant = config.escrow?.authorityTenant ?? tenantId ?? "learncard";
31506
+ if (config.escrow && !ESCROW_AUTHORITY_TENANT_PATTERN.test(authorityTenant))
31507
+ throw new Error(
31508
+ 'Invalid escrow authority tenant: expected 1-128 letters, digits, "_" or "-".'
31509
+ );
31510
+ const emailBrand = config.escrow?.emailBrand === void 0 ? void 0 : canonicalEscrowEmailBrand(config.escrow.emailBrand);
31511
+ if (config.escrow?.emailBrand !== void 0 && emailBrand === void 0)
31512
+ throw new Error(
31513
+ `Invalid escrow email brand: expected 1-32 ASCII letters, digits, spaces, "-", "'" or "&", starting with a letter.`
31514
+ );
30874
31515
  const storage = config.storage || defaultStorage;
30875
31516
  let storageGeneration = 0;
30876
31517
  const localWrites = /* @__PURE__ */ new Set();
@@ -30990,7 +31631,7 @@ function createSSSStrategy(config) {
30990
31631
  return result.hold;
30991
31632
  }, "fetchEscrowHoldStatus");
30992
31633
  const recoveryExpectations = /* @__PURE__ */ __name((holdId, expected) => {
30993
- if (!expected || expected.holdId !== holdId || expected.tenant !== (tenantId ?? "learncard") || !expected.did || !expected.clientEphemeralPublicKey || !expected.blobHash || !expected.authorityGeneration || !expected.holdDigest || !expected.ledgerPublicKey || !expected.keyId)
31634
+ if (!expected || expected.holdId !== holdId || expected.tenant !== authorityTenant || !expected.did || !expected.clientEphemeralPublicKey || !expected.blobHash || !expected.authorityGeneration || !expected.holdDigest || !expected.ledgerPublicKey || !expected.keyId)
30994
31635
  throw new EscrowEvidenceError();
30995
31636
  return { ...expected };
30996
31637
  }, "recoveryExpectations");
@@ -31025,7 +31666,7 @@ function createSSSStrategy(config) {
31025
31666
  const result = await verifyEscrowAuthorityState(
31026
31667
  response,
31027
31668
  nonce,
31028
- tenantId ?? "learncard",
31669
+ authorityTenant,
31029
31670
  did,
31030
31671
  identity
31031
31672
  );
@@ -31057,7 +31698,14 @@ function createSSSStrategy(config) {
31057
31698
  did: primaryDid,
31058
31699
  shareVersion,
31059
31700
  ...pinMaterial ? { pinVerifier: pinMaterial.pinVerifier } : {},
31060
- ...authority && recoveryEmail && bindsRecoveryContact ? { recoveryEmail, recoveryLanguage } : {}
31701
+ // D21: the brand is sealed exactly when the contact is, so a
31702
+ // carry (whose target the enclave refuses if it claims one)
31703
+ // never sends it; the enclave inherits the source's brand.
31704
+ ...authority && recoveryEmail && bindsRecoveryContact ? {
31705
+ recoveryEmail,
31706
+ recoveryLanguage,
31707
+ ...emailBrand ? { recoveryBrand: emailBrand } : {}
31708
+ } : {}
31061
31709
  },
31062
31710
  publicKey,
31063
31711
  keyId
@@ -31324,21 +31972,34 @@ function createSSSStrategy(config) {
31324
31972
  }
31325
31973
  };
31326
31974
  }, "captureActiveUserGuard");
31327
- const pinHasRecordedWrongAttempts = /* @__PURE__ */ __name((escrowPin) => {
31975
+ const recordedWrongPinAttempts = /* @__PURE__ */ __name((escrowPin) => {
31328
31976
  const status = escrowPin;
31329
- if (status?.state === "none") return false;
31330
- return typeof status?.wrongAttempts !== "number" || status.wrongAttempts > 0;
31331
- }, "pinHasRecordedWrongAttempts");
31332
- const refreshablePinCharges = /* @__PURE__ */ __name((before, after) => {
31977
+ if (status?.state === "none") return 0;
31978
+ const count = status?.wrongAttempts;
31979
+ return typeof count === "number" && Number.isSafeInteger(count) && count >= 0 ? count : void 0;
31980
+ }, "recordedWrongPinAttempts");
31981
+ const attemptCount = /* @__PURE__ */ __name((value) => typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : void 0, "attemptCount");
31982
+ const pinSignInClean = /* @__PURE__ */ __name((observed, flowAttempts) => {
31983
+ const flowSalt = flowAttempts?.pinSalt;
31984
+ const sameGeneration = typeof flowSalt !== "string" || observed.every((status) => {
31985
+ const salt = status?.salt;
31986
+ return typeof salt !== "string" || salt === flowSalt;
31987
+ });
31988
+ const attempts = sameGeneration ? flowAttempts : void 0;
31989
+ const own = attempts ? attemptCount(attempts.ownWrongAttempts) : 0;
31990
+ if (own === void 0) return { clean: false, ownWrongAttempts: 0 };
31991
+ const prior = attempts ? attemptCount(attempts.priorWrongAttempts) : recordedWrongPinAttempts(observed[0]);
31992
+ const clean = prior === 0 && observed.length > 0 && observed.every((status) => recordedWrongPinAttempts(status) === own);
31993
+ return { clean, ownWrongAttempts: own };
31994
+ }, "pinSignInClean");
31995
+ const refreshablePinCharges = /* @__PURE__ */ __name((before, after, ownWrongAttempts) => {
31333
31996
  const pre = before;
31334
31997
  const post = after;
31335
- if (pinHasRecordedWrongAttempts(before) || pinHasRecordedWrongAttempts(after))
31336
- return void 0;
31337
31998
  if (pre?.state !== "enabled" || post?.state !== "enabled") return void 0;
31338
31999
  if (typeof pre.attemptsRemaining !== "number" || typeof post.attemptsRemaining !== "number")
31339
32000
  return void 0;
31340
32001
  if (post.attemptsRemaining !== pre.attemptsRemaining - 1) return void 0;
31341
- return { attemptsRemaining: post.attemptsRemaining, wrongAttempts: 0 };
32002
+ return { attemptsRemaining: post.attemptsRemaining, wrongAttempts: ownWrongAttempts };
31342
32003
  }, "refreshablePinCharges");
31343
32004
  const freshPinMaterial = /* @__PURE__ */ __name(async (pin) => {
31344
32005
  if (!validatePin(pin).ok) return void 0;
@@ -31361,7 +32022,7 @@ function createSSSStrategy(config) {
31361
32022
  primaryDid: released.primaryDid
31362
32023
  };
31363
32024
  }, "adoptReleasedShare");
31364
- const completePinSignInKeep = /* @__PURE__ */ __name(async (params, released, pin, pinBefore) => {
32025
+ const completePinSignInKeep = /* @__PURE__ */ __name(async (params, released, pin, pinBefore, pinAttempts) => {
31365
32026
  const storage2 = guardedStorage();
31366
32027
  const generation = storageGeneration;
31367
32028
  const storageId = activeStorageId;
@@ -31370,7 +32031,11 @@ function createSSSStrategy(config) {
31370
32031
  throw new Error("This recovery request was cancelled.");
31371
32032
  }
31372
32033
  }, "assertActive");
31373
- const { mode, newPinRequired, refreshCharges } = await withShareUpdateLock(
32034
+ const {
32035
+ mode,
32036
+ newPinRequired: newPinRequiredAtRelease,
32037
+ refreshCharges
32038
+ } = await withShareUpdateLock(
31374
32039
  storage2,
31375
32040
  storageId,
31376
32041
  () => withRotationLock(async () => {
@@ -31414,18 +32079,23 @@ function createSSSStrategy(config) {
31414
32079
  current.shareVersion
31415
32080
  );
31416
32081
  pendingIdentityRecovery = void 0;
32082
+ const { clean, ownWrongAttempts } = pinSignInClean(
32083
+ [pinBefore, current.escrowPin],
32084
+ pinAttempts
32085
+ );
31417
32086
  return {
31418
32087
  mode: mode2,
31419
- newPinRequired: pinHasRecordedWrongAttempts(pinBefore) || pinHasRecordedWrongAttempts(current.escrowPin),
31420
- refreshCharges: refreshablePinCharges(pinBefore, current.escrowPin)
32088
+ newPinRequired: !clean,
32089
+ refreshCharges: clean ? refreshablePinCharges(pinBefore, current.escrowPin, ownWrongAttempts) : void 0
31421
32090
  };
31422
32091
  })
31423
32092
  );
31424
32093
  let pinRefreshed = false;
31425
32094
  let pinRefreshFailed = false;
32095
+ let newPinRequired = newPinRequiredAtRelease;
31426
32096
  if (mode === "kept" && !newPinRequired && refreshCharges && params.signDidAuthVp) {
31427
32097
  const pinMaterial = await freshPinMaterial(pin);
31428
- pinRefreshed = pinMaterial !== void 0 && await tryEnrollEscrow(
32098
+ const refresh = pinMaterial === void 0 ? void 0 : await attemptEnrollEscrow(
31429
32099
  params.token,
31430
32100
  params.providerType,
31431
32101
  released.privateKey,
@@ -31441,7 +32111,18 @@ function createSSSStrategy(config) {
31441
32111
  params.options?.recoveryLanguage,
31442
32112
  refreshCharges
31443
32113
  );
32114
+ pinRefreshed = refresh?.enrolled === true;
31444
32115
  pinRefreshFailed = pinMaterial !== void 0 && !pinRefreshed;
32116
+ if (pinRefreshFailed) {
32117
+ const latest = await fetchAuthShareRaw(
32118
+ serverUrl,
32119
+ params.token,
32120
+ params.providerType,
32121
+ void 0,
32122
+ tenantId
32123
+ ).catch(() => void 0);
32124
+ newPinRequired = latest ? !pinSignInClean([pinBefore, latest.escrowPin], pinAttempts).clean : isConflictRefusal(refresh && !refresh.enrolled ? refresh.error : void 0);
32125
+ }
31445
32126
  }
31446
32127
  assertActive();
31447
32128
  return {
@@ -31529,7 +32210,7 @@ function createSSSStrategy(config) {
31529
32210
  pinSignIn: {
31530
32211
  mode: "relinked",
31531
32212
  pinRefreshed: false,
31532
- newPinRequired: pinHasRecordedWrongAttempts(status?.escrowPin)
32213
+ newPinRequired: !pinSignInClean([status?.escrowPin], pending.pinKeep?.pinAttempts).clean
31533
32214
  }
31534
32215
  };
31535
32216
  }, "completePinSignInRelink");
@@ -32257,7 +32938,7 @@ function createSSSStrategy(config) {
32257
32938
  const verified = await verifyEscrowHoldRecord(
32258
32939
  result.holdRecord,
32259
32940
  {
32260
- tenant: tenantId ?? "learncard",
32941
+ tenant: authorityTenant,
32261
32942
  did: expectedDid,
32262
32943
  holdId: result.holdId,
32263
32944
  clientEphemeralPublicKey: pair.publicKey,
@@ -32266,7 +32947,7 @@ function createSSSStrategy(config) {
32266
32947
  identity
32267
32948
  );
32268
32949
  expectations = {
32269
- tenant: tenantId ?? "learncard",
32950
+ tenant: authorityTenant,
32270
32951
  did: expectedDid,
32271
32952
  holdId: result.holdId,
32272
32953
  clientEphemeralPublicKey: pair.publicKey,
@@ -32449,7 +33130,8 @@ function createSSSStrategy(config) {
32449
33130
  shareVersion: material.shareVersion
32450
33131
  },
32451
33132
  input.pin,
32452
- pinBefore
33133
+ pinBefore,
33134
+ input.pinAttempts
32453
33135
  );
32454
33136
  }
32455
33137
  pendingIdentityRecovery = {
@@ -32460,7 +33142,12 @@ function createSSSStrategy(config) {
32460
33142
  rebindSessionToken: material.rebindSessionToken,
32461
33143
  fromEscrow: true,
32462
33144
  // The PIN itself is not kept across the new-login step.
32463
- ...input.method === "escrow-pin" ? { pinKeep: { shareVersion: material.shareVersion } } : {}
33145
+ ...input.method === "escrow-pin" ? {
33146
+ pinKeep: {
33147
+ shareVersion: material.shareVersion,
33148
+ ...input.pinAttempts ? { pinAttempts: { ...input.pinAttempts } } : {}
33149
+ }
33150
+ } : {}
32464
33151
  };
32465
33152
  if (!token) return { privateKey: privateKey2, did: material.primaryDid };
32466
33153
  return completeIdentityRecoveryWith({