@learncard/learn-cloud-plugin 2.3.40 → 2.3.42

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.
@@ -21235,14 +21235,22 @@ var UnsignedVCValidator = external_exports.object({
21235
21235
  }).catchall(external_exports.any());
21236
21236
  var ProofValidator = external_exports.object({
21237
21237
  type: external_exports.string(),
21238
- created: external_exports.string(),
21238
+ created: external_exports.string().optional(),
21239
21239
  challenge: external_exports.string().optional(),
21240
21240
  domain: external_exports.string().optional(),
21241
21241
  nonce: external_exports.string().optional(),
21242
21242
  proofPurpose: external_exports.string(),
21243
21243
  verificationMethod: external_exports.string(),
21244
21244
  jws: external_exports.string().optional()
21245
- }).catchall(external_exports.any());
21245
+ }).catchall(external_exports.any()).superRefine((proof, ctx) => {
21246
+ if (proof.created === void 0 && (proof.type !== "DataIntegrityProof" || proof.cryptosuite !== "ecdsa-rdfc-2019")) {
21247
+ ctx.addIssue({
21248
+ code: "custom",
21249
+ path: ["created"],
21250
+ message: "created is required for this proof suite"
21251
+ });
21252
+ }
21253
+ });
21246
21254
  var VCValidator = UnsignedVCValidator.extend({
21247
21255
  proof: ProofValidator.or(ProofValidator.array())
21248
21256
  });
@@ -21684,6 +21692,204 @@ var StringQuery = external_exports.union([
21684
21692
  $or: BaseStringQuery.array()
21685
21693
  })
21686
21694
  ]);
21695
+ var LearnCardRefreshAuthorizationValidator = external_exports.object({ type: external_exports.literal("LearnCardDIDAuth") }).catchall(external_exports.any());
21696
+ var ManagedCredentialRefreshServiceValidator = external_exports.object({
21697
+ id: external_exports.string().min(1),
21698
+ type: external_exports.literal("LearnCardCredentialRefresh2026"),
21699
+ authorization: LearnCardRefreshAuthorizationValidator.optional()
21700
+ }).catchall(external_exports.any());
21701
+ var StandardCredentialRefreshServiceValidator = external_exports.object({
21702
+ id: external_exports.string().min(1),
21703
+ type: external_exports.literal("1EdTechCredentialRefresh")
21704
+ }).catchall(external_exports.any());
21705
+ var SupportedCredentialRefreshServiceValidator = external_exports.union([
21706
+ ManagedCredentialRefreshServiceValidator,
21707
+ StandardCredentialRefreshServiceValidator
21708
+ ]);
21709
+ var AllocateCredentialRefreshInputValidator = external_exports.object({
21710
+ holder: external_exports.object({
21711
+ profileId: external_exports.string().optional(),
21712
+ did: external_exports.string().min(1)
21713
+ }),
21714
+ credentialId: external_exports.string().min(1)
21715
+ });
21716
+ var AllocateCredentialRefreshResultValidator = external_exports.object({
21717
+ refreshId: external_exports.string().min(1),
21718
+ refreshService: ManagedCredentialRefreshServiceValidator.extend({
21719
+ authorization: LearnCardRefreshAuthorizationValidator
21720
+ })
21721
+ });
21722
+ var ManagedCredentialRefreshReceiptValidator = external_exports.object({
21723
+ refreshId: external_exports.string().min(1),
21724
+ refreshService: ManagedCredentialRefreshServiceValidator,
21725
+ credentialId: external_exports.string().min(1),
21726
+ issuerDid: external_exports.string().min(1),
21727
+ holderDid: external_exports.string().min(1),
21728
+ credentialStatus: CredentialStatusValidator.or(
21729
+ CredentialStatusValidator.array()
21730
+ ).optional()
21731
+ }).strip();
21732
+ var InboxCredentialRefreshReceiptValidator = ManagedCredentialRefreshReceiptValidator.omit(
21733
+ { holderDid: true }
21734
+ ).extend({ holderDid: external_exports.string().min(1).optional() });
21735
+ var CredentialRefreshSigningModeValidator = external_exports.enum(["issuer-signed", "signing-authority"]);
21736
+ var PublishCredentialRefreshBaseFields = {
21737
+ refreshId: external_exports.string().min(1),
21738
+ notifyHolder: external_exports.boolean().optional(),
21739
+ updateSummary: external_exports.string().optional(),
21740
+ idempotencyKey: external_exports.string().optional()
21741
+ };
21742
+ var PublishIssuerSignedRefreshValidator = external_exports.object({
21743
+ ...PublishCredentialRefreshBaseFields,
21744
+ mode: external_exports.literal("issuer-signed"),
21745
+ signedCredential: VCValidator
21746
+ });
21747
+ var PublishSigningAuthorityRefreshValidator = external_exports.object({
21748
+ ...PublishCredentialRefreshBaseFields,
21749
+ mode: external_exports.literal("signing-authority"),
21750
+ credential: UnsignedVCValidator,
21751
+ signingAuthority: external_exports.object({
21752
+ type: external_exports.string().min(1)
21753
+ }).catchall(external_exports.any())
21754
+ });
21755
+ var PublishCredentialRefreshInputValidator = external_exports.object({
21756
+ ...PublishCredentialRefreshBaseFields,
21757
+ mode: CredentialRefreshSigningModeValidator,
21758
+ signedCredential: VCValidator.optional(),
21759
+ credential: UnsignedVCValidator.optional(),
21760
+ signingAuthority: external_exports.object({
21761
+ type: external_exports.string().min(1)
21762
+ }).catchall(external_exports.any()).optional()
21763
+ }).superRefine((input, ctx) => {
21764
+ if (input.mode === "issuer-signed" && !input.signedCredential) {
21765
+ ctx.addIssue({
21766
+ code: "custom",
21767
+ path: ["signedCredential"],
21768
+ message: "signedCredential is required for issuer-signed publication"
21769
+ });
21770
+ }
21771
+ if (input.mode === "issuer-signed" && (input.credential !== void 0 || input.signingAuthority !== void 0)) {
21772
+ ctx.addIssue({
21773
+ code: "custom",
21774
+ path: ["mode"],
21775
+ message: "issuer-signed publication cannot include signing-authority fields"
21776
+ });
21777
+ }
21778
+ if (input.mode === "signing-authority") {
21779
+ if (input.signedCredential !== void 0) {
21780
+ ctx.addIssue({
21781
+ code: "custom",
21782
+ path: ["signedCredential"],
21783
+ message: "signing-authority publication cannot include signedCredential"
21784
+ });
21785
+ }
21786
+ if (!input.credential) {
21787
+ ctx.addIssue({
21788
+ code: "custom",
21789
+ path: ["credential"],
21790
+ message: "credential is required for signing-authority publication"
21791
+ });
21792
+ }
21793
+ if (!input.signingAuthority) {
21794
+ ctx.addIssue({
21795
+ code: "custom",
21796
+ path: ["signingAuthority"],
21797
+ message: "signingAuthority is required for signing-authority publication"
21798
+ });
21799
+ }
21800
+ }
21801
+ });
21802
+ var PublishCredentialRefreshNotificationValidator = external_exports.enum([
21803
+ "queued",
21804
+ "suppressed",
21805
+ "not-applicable",
21806
+ /** Publication succeeded, but the post-commit notification enqueue must be retried. */
21807
+ "delivery-failed"
21808
+ ]);
21809
+ var PublishCredentialRefreshResultValidator = external_exports.object({
21810
+ refreshId: external_exports.string().min(1),
21811
+ version: external_exports.number().int().positive(),
21812
+ publishedAt: external_exports.string().min(1),
21813
+ notification: PublishCredentialRefreshNotificationValidator
21814
+ });
21815
+ var CredentialRefreshVersionMetadataValidator = external_exports.object({
21816
+ version: external_exports.number().int().positive(),
21817
+ publishedAt: external_exports.string().min(1),
21818
+ effectiveAt: external_exports.string().optional(),
21819
+ etag: external_exports.string().optional(),
21820
+ signingMode: CredentialRefreshSigningModeValidator.optional(),
21821
+ updateSummary: external_exports.string().optional()
21822
+ });
21823
+ var GetCredentialRefreshHistoryInputValidator = external_exports.object({
21824
+ refreshId: external_exports.string().min(1),
21825
+ cursor: external_exports.string().optional(),
21826
+ limit: external_exports.number().int().positive().optional()
21827
+ });
21828
+ var GetCredentialRefreshHistoryResultValidator = external_exports.object({
21829
+ records: CredentialRefreshVersionMetadataValidator.array(),
21830
+ hasMore: external_exports.boolean(),
21831
+ cursor: external_exports.string().optional()
21832
+ });
21833
+ var CredentialRefreshChallengeValidator = external_exports.object({
21834
+ challenge: external_exports.string().min(1),
21835
+ expiresAt: external_exports.string().min(1),
21836
+ domain: external_exports.string().optional(),
21837
+ scheme: external_exports.literal("LearnCardDIDAuth").optional()
21838
+ });
21839
+ var PublicCredentialRefreshEnvelopeValidator = external_exports.object({
21840
+ format: external_exports.literal("vc"),
21841
+ credential: VCValidator,
21842
+ etag: external_exports.string().optional()
21843
+ });
21844
+ var JweCredentialRefreshEnvelopeValidator = external_exports.object({
21845
+ format: external_exports.literal("jwe"),
21846
+ jwe: JWEValidator,
21847
+ etag: external_exports.string().optional(),
21848
+ /** Present on LearnCard-managed endpoints; optional for interoperable JWE services. */
21849
+ version: external_exports.number().int().positive().optional()
21850
+ });
21851
+ var CredentialRefreshResponseEnvelopeValidator = external_exports.discriminatedUnion("format", [
21852
+ PublicCredentialRefreshEnvelopeValidator,
21853
+ JweCredentialRefreshEnvelopeValidator
21854
+ ]);
21855
+ var CredentialRefreshFailureCodeValidator = external_exports.enum([
21856
+ "UNAVAILABLE",
21857
+ "TIMEOUT",
21858
+ "UNSUPPORTED_SERVICE",
21859
+ "UNAUTHORIZED",
21860
+ "MALFORMED_RESPONSE",
21861
+ "INVALID_PROOF",
21862
+ "ISSUER_MISMATCH",
21863
+ "ID_MISMATCH",
21864
+ "ROLLBACK",
21865
+ "REVOKED",
21866
+ "UNSAFE_ENDPOINT"
21867
+ ]);
21868
+ var CredentialRefreshUpdatedResultValidator = external_exports.object({
21869
+ status: external_exports.literal("updated"),
21870
+ credential: VCValidator,
21871
+ etag: external_exports.string().optional(),
21872
+ managedVersion: external_exports.number().int().positive().optional()
21873
+ });
21874
+ var CredentialRefreshUnchangedResultValidator = external_exports.object({
21875
+ status: external_exports.literal("unchanged"),
21876
+ checkedAt: external_exports.string().min(1),
21877
+ etag: external_exports.string().optional()
21878
+ });
21879
+ var CredentialRefreshUnsupportedResultValidator = external_exports.object({
21880
+ status: external_exports.literal("unsupported")
21881
+ });
21882
+ var CredentialRefreshFailedResultValidator = external_exports.object({
21883
+ status: external_exports.literal("failed"),
21884
+ code: CredentialRefreshFailureCodeValidator,
21885
+ retryable: external_exports.boolean()
21886
+ });
21887
+ var CredentialRefreshResultValidator = external_exports.discriminatedUnion("status", [
21888
+ CredentialRefreshUpdatedResultValidator,
21889
+ CredentialRefreshUnchangedResultValidator,
21890
+ CredentialRefreshUnsupportedResultValidator,
21891
+ CredentialRefreshFailedResultValidator
21892
+ ]);
21687
21893
  var LCNProfileDisplayValidator = external_exports.object({
21688
21894
  backgroundColor: external_exports.string().optional(),
21689
21895
  backgroundImage: external_exports.string().optional(),
@@ -22019,7 +22225,13 @@ var SendBoostInputValidator = external_exports.object({
22019
22225
  "Options for email/phone recipients (Universal Inbox)"
22020
22226
  ),
22021
22227
  templateData: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
22022
- integrationId: external_exports.string().optional().describe("Integration ID for activity tracking")
22228
+ integrationId: external_exports.string().optional().describe("Integration ID for activity tracking"),
22229
+ refresh: external_exports.boolean().optional().describe(
22230
+ "Request managed credential refresh for this send. Profile/DID recipients use immediate issuance; email/phone recipients use deferred Universal Inbox signing and bind the holder at claim."
22231
+ ),
22232
+ idempotencyKey: external_exports.string().min(1).max(200).optional().describe(
22233
+ "Caller-chosen key that makes a managed refresh send (refresh: true) safe to retry as a whole: retries with the same key reuse the same boost, refresh allocation and result. Reusing a key for a different request is rejected. With signedCredential, requires prior tRPC prepareRefreshableSend; direct REST callers omit the key and retry the exact signed credential and templateUri."
22234
+ )
22023
22235
  }).refine((data) => data.templateUri || data.template || data.signedCredential, {
22024
22236
  message: "Either templateUri, template, or signedCredential must be provided.",
22025
22237
  path: ["templateUri"]
@@ -22034,8 +22246,12 @@ var SendBoostInputValidator = external_exports.object({
22034
22246
  message: "guardianEmail must differ from recipient (self-approval not allowed)",
22035
22247
  path: ["options", "guardianEmail"]
22036
22248
  }
22037
- );
22249
+ ).refine((data) => !data.idempotencyKey || data.refresh === true, {
22250
+ message: "idempotencyKey is only supported with refresh: true.",
22251
+ path: ["idempotencyKey"]
22252
+ });
22038
22253
  var SendInboxResponseValidator = external_exports.object({
22254
+ refresh: InboxCredentialRefreshReceiptValidator.optional(),
22039
22255
  issuanceId: external_exports.string(),
22040
22256
  status: external_exports.enum(["PENDING", "ISSUED", "EXPIRED", "DELIVERED", "CLAIMED"]),
22041
22257
  claimUrl: external_exports.string().url().optional().describe("Present when suppressDelivery=true"),
@@ -22050,8 +22266,34 @@ var SendBoostResponseValidator = external_exports.object({
22050
22266
  activityId: external_exports.string().describe("Links to the activity lifecycle for this issuance"),
22051
22267
  inbox: SendInboxResponseValidator.optional().describe(
22052
22268
  "Present when sent via email/phone (Universal Inbox)"
22269
+ ),
22270
+ refresh: ManagedCredentialRefreshReceiptValidator.optional().describe(
22271
+ "Present when managed refresh was requested: issuance metadata the issuer keeps to publish future updates"
22053
22272
  )
22054
22273
  });
22274
+ var PrepareRefreshableSendInputValidator = external_exports.object({
22275
+ recipient: external_exports.string(),
22276
+ templateUri: external_exports.string().optional(),
22277
+ template: SendBoostTemplateValidator.optional(),
22278
+ contractUri: external_exports.string().optional(),
22279
+ templateData: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
22280
+ integrationId: external_exports.string().optional(),
22281
+ /** Credential ID to allocate for; generated server-side when omitted. */
22282
+ credentialId: external_exports.string().min(1).optional(),
22283
+ idempotencyKey: external_exports.string().min(1).max(200).optional()
22284
+ }).refine((data) => Boolean(data.templateUri) !== Boolean(data.template), {
22285
+ message: "Provide exactly one of templateUri or template."
22286
+ });
22287
+ var PrepareRefreshableSendResultValidator = external_exports.object({
22288
+ boostUri: external_exports.string(),
22289
+ credentialId: external_exports.string(),
22290
+ refreshId: external_exports.string(),
22291
+ refreshService: ManagedCredentialRefreshServiceValidator,
22292
+ /** The DID to use as credentialSubject.id (recipient DID, or the profile's did:web). */
22293
+ holderDid: external_exports.string(),
22294
+ /** Present when this idempotencyKey already completed: return it without signing. */
22295
+ completed: SendBoostResponseValidator.optional()
22296
+ });
22055
22297
  var SendInputValidator = external_exports.discriminatedUnion("type", [SendBoostInputValidator]);
22056
22298
  var SendResponseValidator = external_exports.discriminatedUnion("type", [SendBoostResponseValidator]);
22057
22299
  var ConsentFlowTermsStatusValidator = external_exports.enum(["live", "stale", "withdrawn"]);
@@ -22127,15 +22369,6 @@ var ConsentFlowContractDataValidator = external_exports.object({
22127
22369
  var PaginatedConsentFlowDataValidator = PaginationResponseValidator.extend({
22128
22370
  records: ConsentFlowContractDataValidator.array()
22129
22371
  });
22130
- var ConsentFlowContractDataForDidValidator = external_exports.object({
22131
- credentials: external_exports.object({ category: external_exports.string(), uri: external_exports.string() }).array(),
22132
- personal: external_exports.record(external_exports.string(), external_exports.string()).default({}),
22133
- date: external_exports.string(),
22134
- contractUri: external_exports.string()
22135
- });
22136
- var PaginatedConsentFlowDataForDidValidator = PaginationResponseValidator.extend({
22137
- records: ConsentFlowContractDataForDidValidator.array()
22138
- });
22139
22372
  var ConsentFlowTermValidator = external_exports.object({
22140
22373
  sharing: external_exports.boolean().optional(),
22141
22374
  shared: external_exports.string().array().optional(),
@@ -22169,6 +22402,34 @@ var PaginatedConsentFlowTermsValidator = PaginationResponseValidator.extend({
22169
22402
  status: ConsentFlowTermsStatusValidator
22170
22403
  }).array()
22171
22404
  });
22405
+ var ConsentFlowGuardianApprovalValidator = external_exports.object({
22406
+ guardianProfileId: external_exports.string(),
22407
+ guardianDid: external_exports.string(),
22408
+ approvedAt: external_exports.string().datetime(),
22409
+ contractUpdatedAt: external_exports.string()
22410
+ });
22411
+ var ConsentFlowContractDataForDidValidator = external_exports.object({
22412
+ credentials: external_exports.object({ category: external_exports.string(), uri: external_exports.string() }).array(),
22413
+ personal: external_exports.record(external_exports.string(), external_exports.string()).default({}),
22414
+ date: external_exports.string(),
22415
+ createdAt: external_exports.string().optional(),
22416
+ contractUpdatedAt: external_exports.string(),
22417
+ contractExpiresAt: external_exports.string().optional(),
22418
+ reasonForAccessing: external_exports.string().optional(),
22419
+ guardian: external_exports.object({
22420
+ required: external_exports.boolean(),
22421
+ approved: external_exports.boolean(),
22422
+ approval: ConsentFlowGuardianApprovalValidator.optional()
22423
+ }),
22424
+ contractUri: external_exports.string(),
22425
+ termsUri: external_exports.string(),
22426
+ status: ConsentFlowTermsStatusValidator,
22427
+ expiresAt: external_exports.string().optional(),
22428
+ terms: ConsentFlowTermsValidator
22429
+ });
22430
+ var PaginatedConsentFlowDataForDidValidator = PaginationResponseValidator.extend({
22431
+ records: ConsentFlowContractDataForDidValidator.array()
22432
+ });
22172
22433
  var ConsentFlowContractQueryValidator = external_exports.object({
22173
22434
  read: external_exports.object({
22174
22435
  anonymize: external_exports.boolean().optional(),
@@ -22229,6 +22490,7 @@ var ConsentFlowTransactionValidator = external_exports.object({
22229
22490
  expiresAt: external_exports.string().optional(),
22230
22491
  oneTime: external_exports.boolean().optional(),
22231
22492
  terms: ConsentFlowTermsValidator.optional(),
22493
+ guardianApproval: ConsentFlowGuardianApprovalValidator.optional(),
22232
22494
  id: external_exports.string(),
22233
22495
  action: ConsentFlowTransactionActionValidator,
22234
22496
  date: external_exports.string(),
@@ -22362,6 +22624,7 @@ var AuthGrantValidator = external_exports.object({
22362
22624
  }, "error")
22363
22625
  }),
22364
22626
  scope: external_exports.string(),
22627
+ actAs: external_exports.string().optional(),
22365
22628
  createdAt: external_exports.iso.datetime({ error: "createdAt must be a valid ISO 8601 datetime string" }),
22366
22629
  expiresAt: external_exports.iso.datetime({ error: "expiresAt must be a valid ISO 8601 datetime string" }).nullish().optional()
22367
22630
  });
@@ -22433,6 +22696,8 @@ var CreateContactMethodSessionResponseValidator = external_exports.object({
22433
22696
  sessionJwt: external_exports.string()
22434
22697
  });
22435
22698
  var InboxCredentialValidator = external_exports.object({
22699
+ refresh: InboxCredentialRefreshReceiptValidator.optional(),
22700
+ refreshId: external_exports.string().optional(),
22436
22701
  id: external_exports.string(),
22437
22702
  credential: external_exports.string().optional(),
22438
22703
  isSigned: external_exports.boolean(),
@@ -22487,12 +22752,19 @@ var IssueInboxCredentialValidator = external_exports.object({
22487
22752
  templateUri: external_exports.string().optional().describe(
22488
22753
  "URI of a boost template to use for issuance. The boost credential will be resolved and used. Mutually exclusive with credential field."
22489
22754
  ),
22755
+ refresh: external_exports.boolean().optional().describe(
22756
+ "Allocate managed refresh before signing. Requires unsigned content and a registered signing authority; binds the holder on claim."
22757
+ ),
22758
+ idempotencyKey: external_exports.string().min(1).max(200).optional(),
22490
22759
  // === OPTIONAL FEATURES ===
22491
22760
  // Add major, distinct features at the top level.
22492
22761
  //consentRequest: ConsentRequestValidator.optional(),
22493
22762
  // === PROCESS CONFIGURATION (Optional) ===
22494
22763
  // HOW should this issuance be handled?
22495
22764
  configuration: external_exports.object({
22765
+ guardianEmail: external_exports.string().email().optional().describe(
22766
+ "Require approval from this guardian before the recipient can claim. Must differ from the recipient email."
22767
+ ),
22496
22768
  signingAuthority: IssueInboxSigningAuthorityValidator.optional().describe(
22497
22769
  "The signing authority to use for the credential. If not provided, the users default signing authority will be used if the credential is not signed."
22498
22770
  ),
@@ -22546,17 +22818,130 @@ var IssueInboxCredentialValidator = external_exports.object({
22546
22818
  }).optional().describe(
22547
22819
  "Configuration for the credential issuance. If not provided, the default configuration will be used."
22548
22820
  )
22821
+ }).refine((data) => !data.idempotencyKey || data.refresh === true, {
22822
+ message: "idempotencyKey requires refresh: true."
22549
22823
  }).refine((data) => data.credential || data.templateUri, {
22550
22824
  message: "Either credential or templateUri must be provided.",
22551
22825
  path: ["credential"]
22552
- });
22826
+ }).refine(
22827
+ (data) => !data.configuration?.guardianEmail || data.recipient.type !== "email" || data.configuration.guardianEmail.toLowerCase() !== data.recipient.value.toLowerCase(),
22828
+ {
22829
+ message: "guardianEmail must differ from recipient (self-approval not allowed)",
22830
+ path: ["configuration", "guardianEmail"]
22831
+ }
22832
+ );
22553
22833
  var IssueInboxCredentialResponseValidator = external_exports.object({
22834
+ refresh: InboxCredentialRefreshReceiptValidator.optional(),
22554
22835
  issuanceId: external_exports.string(),
22555
22836
  status: LCNInboxStatusEnumValidator,
22556
22837
  recipient: ContactMethodQueryValidator,
22557
22838
  claimUrl: external_exports.string().url().optional(),
22558
22839
  recipientDid: external_exports.string().optional()
22559
22840
  });
22841
+ var InboxBatchConfigurationValidator = IssueInboxCredentialValidator.shape.configuration.unwrap().extend({
22842
+ refresh: IssueInboxCredentialValidator.shape.refresh.describe(
22843
+ "Enable managed refresh by default. An item configuration.refresh overrides this value, including false."
22844
+ ),
22845
+ delivery: IssueInboxCredentialValidator.shape.configuration.unwrap().shape.delivery.unwrap().extend({ suppress: external_exports.boolean().optional() }).optional()
22846
+ });
22847
+ var InboxBatchItemConfigurationValidator = InboxBatchConfigurationValidator.extend({
22848
+ guardianEmail: InboxBatchConfigurationValidator.shape.guardianEmail.nullable().describe(
22849
+ "Require guardian approval, or set null to clear a batch-level guardianEmail for this item."
22850
+ )
22851
+ });
22852
+ var IssueInboxCredentialBatchItemValidator = external_exports.object({
22853
+ ...IssueInboxCredentialValidator.shape,
22854
+ configuration: InboxBatchItemConfigurationValidator.optional(),
22855
+ idempotencyKey: external_exports.string().max(256).optional()
22856
+ }).refine((data) => data.credential || data.templateUri, {
22857
+ message: "Either credential or templateUri must be provided.",
22858
+ path: ["credential"]
22859
+ }).describe(
22860
+ "One issuance: provide credential or templateUri. Invalid input is rejected at submission with its item index."
22861
+ );
22862
+ var IssueInboxCredentialBatchValidator = external_exports.object({
22863
+ requestId: external_exports.string().min(1).max(256).optional(),
22864
+ items: external_exports.array(IssueInboxCredentialBatchItemValidator).min(1).max(100),
22865
+ configuration: InboxBatchConfigurationValidator.optional()
22866
+ }).superRefine((batch, ctx) => {
22867
+ batch.items.forEach((item, index) => {
22868
+ const itemGuardian = item.configuration?.guardianEmail;
22869
+ const guardian = itemGuardian === null ? void 0 : itemGuardian ?? batch.configuration?.guardianEmail;
22870
+ if (guardian && item.recipient.type === "email" && guardian.toLowerCase() === item.recipient.value.toLowerCase()) {
22871
+ ctx.addIssue({
22872
+ code: "custom",
22873
+ path: ["items", index, "configuration", "guardianEmail"],
22874
+ message: "guardianEmail must differ from recipient (self-approval not allowed)"
22875
+ });
22876
+ }
22877
+ });
22878
+ });
22879
+ var InboxBatchErrorReasonValidator = external_exports.enum([
22880
+ "DUPLICATE_KEY",
22881
+ "IDEMPOTENCY_MISMATCH",
22882
+ "IN_PROGRESS",
22883
+ "UNCONFIRMED"
22884
+ ]);
22885
+ var IssueInboxCredentialBatchItemResultValidator = external_exports.discriminatedUnion("success", [
22886
+ IssueInboxCredentialResponseValidator.extend({
22887
+ success: external_exports.literal(true),
22888
+ index: external_exports.number().int().nonnegative(),
22889
+ deduplicated: external_exports.boolean().optional(),
22890
+ guardianStatus: GuardianStatusValidator.optional(),
22891
+ idempotencyKey: external_exports.string().optional()
22892
+ }),
22893
+ external_exports.object({
22894
+ success: external_exports.literal(false),
22895
+ index: external_exports.number().int().nonnegative(),
22896
+ idempotencyKey: external_exports.string().optional(),
22897
+ recipient: ContactMethodQueryValidator.optional(),
22898
+ error: external_exports.object({
22899
+ code: external_exports.string(),
22900
+ message: external_exports.string(),
22901
+ reason: InboxBatchErrorReasonValidator.optional()
22902
+ }),
22903
+ issuanceId: external_exports.string().optional().describe(
22904
+ "Present when issuance completed but replay storage could not be confirmed. Reconcile this issuance; do not issue again with a new key."
22905
+ ),
22906
+ claimUrl: external_exports.string().url().optional().describe(
22907
+ "Claim URL of the completed issuance, if available, when replay storage could not be confirmed."
22908
+ )
22909
+ })
22910
+ ]);
22911
+ var IssueInboxCredentialBatchResponseValidator = external_exports.object({
22912
+ results: external_exports.array(IssueInboxCredentialBatchItemResultValidator),
22913
+ summary: external_exports.object({
22914
+ total: external_exports.number(),
22915
+ succeeded: external_exports.number(),
22916
+ failed: external_exports.number(),
22917
+ deduplicated: external_exports.number()
22918
+ })
22919
+ });
22920
+ var InboxBatchReceiptValidator = external_exports.object({
22921
+ batchId: external_exports.string(),
22922
+ status: external_exports.enum(["QUEUED", "PROCESSING", "COMPLETED", "NEEDS_RECONCILIATION"]),
22923
+ createdAt: external_exports.string()
22924
+ });
22925
+ var InboxBatchStatusValidator = external_exports.object({
22926
+ batchId: external_exports.string(),
22927
+ createdAt: external_exports.string(),
22928
+ done: external_exports.boolean().describe(
22929
+ "True when no queued or processing items remain, including unconfirmed outcomes."
22930
+ ),
22931
+ status: external_exports.enum(["QUEUED", "PROCESSING", "COMPLETED", "NEEDS_RECONCILIATION"]),
22932
+ items: external_exports.array(
22933
+ external_exports.object({
22934
+ index: external_exports.number().int().nonnegative(),
22935
+ state: external_exports.enum(["QUEUED", "PROCESSING", "COMPLETED", "NEEDS_RECONCILIATION"]),
22936
+ result: IssueInboxCredentialBatchItemResultValidator.optional()
22937
+ })
22938
+ ),
22939
+ summary: IssueInboxCredentialBatchResponseValidator.shape.summary.extend({
22940
+ completed: external_exports.number(),
22941
+ pending: external_exports.number(),
22942
+ unconfirmed: external_exports.number()
22943
+ })
22944
+ });
22560
22945
  var CredentialNameRefValidator = external_exports.object({ name: external_exports.string() }).passthrough();
22561
22946
  var ClaimInboxCredentialValidator = external_exports.object({
22562
22947
  credential: VCValidator.or(VPValidator).or(UnsignedVCValidator).or(CredentialNameRefValidator).describe("The credential to issue, or a { name } reference to resolve a boost template."),
@@ -23042,6 +23427,7 @@ var CredentialActivityValidator = external_exports.object({
23042
23427
  eventType: CredentialActivityEventTypeValidator,
23043
23428
  timestamp: external_exports.string(),
23044
23429
  actorProfileId: external_exports.string().optional(),
23430
+ onBehalfOf: external_exports.string().optional(),
23045
23431
  recipientType: CredentialActivityRecipientTypeValidator,
23046
23432
  recipientIdentifier: external_exports.string(),
23047
23433
  boostUri: external_exports.string().optional(),
@@ -23191,191 +23577,6 @@ var inAppMessagesFlagValidator = external_exports.object({
23191
23577
  version: external_exports.number().default(1),
23192
23578
  messages: external_exports.array(inAppMessageValidator).default([])
23193
23579
  }).passthrough();
23194
- var LearnCardRefreshAuthorizationValidator = external_exports.object({ type: external_exports.literal("LearnCardDIDAuth") }).catchall(external_exports.any());
23195
- var ManagedCredentialRefreshServiceValidator = external_exports.object({
23196
- id: external_exports.string().min(1),
23197
- type: external_exports.literal("LearnCardCredentialRefresh2026"),
23198
- authorization: LearnCardRefreshAuthorizationValidator.optional()
23199
- }).catchall(external_exports.any());
23200
- var StandardCredentialRefreshServiceValidator = external_exports.object({
23201
- id: external_exports.string().min(1),
23202
- type: external_exports.literal("1EdTechCredentialRefresh")
23203
- }).catchall(external_exports.any());
23204
- var SupportedCredentialRefreshServiceValidator = external_exports.union([
23205
- ManagedCredentialRefreshServiceValidator,
23206
- StandardCredentialRefreshServiceValidator
23207
- ]);
23208
- var AllocateCredentialRefreshInputValidator = external_exports.object({
23209
- holder: external_exports.object({
23210
- profileId: external_exports.string().optional(),
23211
- did: external_exports.string().min(1)
23212
- }),
23213
- credentialId: external_exports.string().min(1)
23214
- });
23215
- var AllocateCredentialRefreshResultValidator = external_exports.object({
23216
- refreshId: external_exports.string().min(1),
23217
- refreshService: ManagedCredentialRefreshServiceValidator.extend({
23218
- authorization: LearnCardRefreshAuthorizationValidator
23219
- })
23220
- });
23221
- var CredentialRefreshSigningModeValidator = external_exports.enum(["issuer-signed", "signing-authority"]);
23222
- var PublishCredentialRefreshBaseFields = {
23223
- refreshId: external_exports.string().min(1),
23224
- notifyHolder: external_exports.boolean().optional(),
23225
- updateSummary: external_exports.string().optional(),
23226
- idempotencyKey: external_exports.string().optional()
23227
- };
23228
- var PublishIssuerSignedRefreshValidator = external_exports.object({
23229
- ...PublishCredentialRefreshBaseFields,
23230
- mode: external_exports.literal("issuer-signed"),
23231
- signedCredential: VCValidator
23232
- });
23233
- var PublishSigningAuthorityRefreshValidator = external_exports.object({
23234
- ...PublishCredentialRefreshBaseFields,
23235
- mode: external_exports.literal("signing-authority"),
23236
- credential: UnsignedVCValidator,
23237
- signingAuthority: external_exports.object({
23238
- type: external_exports.string().min(1)
23239
- }).catchall(external_exports.any())
23240
- });
23241
- var PublishCredentialRefreshInputValidator = external_exports.object({
23242
- ...PublishCredentialRefreshBaseFields,
23243
- mode: CredentialRefreshSigningModeValidator,
23244
- signedCredential: VCValidator.optional(),
23245
- credential: UnsignedVCValidator.optional(),
23246
- signingAuthority: external_exports.object({
23247
- type: external_exports.string().min(1)
23248
- }).catchall(external_exports.any()).optional()
23249
- }).superRefine((input, ctx) => {
23250
- if (input.mode === "issuer-signed" && !input.signedCredential) {
23251
- ctx.addIssue({
23252
- code: "custom",
23253
- path: ["signedCredential"],
23254
- message: "signedCredential is required for issuer-signed publication"
23255
- });
23256
- }
23257
- if (input.mode === "issuer-signed" && (input.credential !== void 0 || input.signingAuthority !== void 0)) {
23258
- ctx.addIssue({
23259
- code: "custom",
23260
- path: ["mode"],
23261
- message: "issuer-signed publication cannot include signing-authority fields"
23262
- });
23263
- }
23264
- if (input.mode === "signing-authority") {
23265
- if (input.signedCredential !== void 0) {
23266
- ctx.addIssue({
23267
- code: "custom",
23268
- path: ["signedCredential"],
23269
- message: "signing-authority publication cannot include signedCredential"
23270
- });
23271
- }
23272
- if (!input.credential) {
23273
- ctx.addIssue({
23274
- code: "custom",
23275
- path: ["credential"],
23276
- message: "credential is required for signing-authority publication"
23277
- });
23278
- }
23279
- if (!input.signingAuthority) {
23280
- ctx.addIssue({
23281
- code: "custom",
23282
- path: ["signingAuthority"],
23283
- message: "signingAuthority is required for signing-authority publication"
23284
- });
23285
- }
23286
- }
23287
- });
23288
- var PublishCredentialRefreshNotificationValidator = external_exports.enum([
23289
- "queued",
23290
- "suppressed",
23291
- "not-applicable",
23292
- /** Publication succeeded, but the post-commit notification enqueue must be retried. */
23293
- "delivery-failed"
23294
- ]);
23295
- var PublishCredentialRefreshResultValidator = external_exports.object({
23296
- refreshId: external_exports.string().min(1),
23297
- version: external_exports.number().int().positive(),
23298
- publishedAt: external_exports.string().min(1),
23299
- notification: PublishCredentialRefreshNotificationValidator
23300
- });
23301
- var CredentialRefreshVersionMetadataValidator = external_exports.object({
23302
- version: external_exports.number().int().positive(),
23303
- publishedAt: external_exports.string().min(1),
23304
- effectiveAt: external_exports.string().optional(),
23305
- etag: external_exports.string().optional(),
23306
- signingMode: CredentialRefreshSigningModeValidator.optional(),
23307
- updateSummary: external_exports.string().optional()
23308
- });
23309
- var GetCredentialRefreshHistoryInputValidator = external_exports.object({
23310
- refreshId: external_exports.string().min(1),
23311
- cursor: external_exports.string().optional(),
23312
- limit: external_exports.number().int().positive().optional()
23313
- });
23314
- var GetCredentialRefreshHistoryResultValidator = external_exports.object({
23315
- records: CredentialRefreshVersionMetadataValidator.array(),
23316
- hasMore: external_exports.boolean(),
23317
- cursor: external_exports.string().optional()
23318
- });
23319
- var CredentialRefreshChallengeValidator = external_exports.object({
23320
- challenge: external_exports.string().min(1),
23321
- expiresAt: external_exports.string().min(1),
23322
- domain: external_exports.string().optional(),
23323
- scheme: external_exports.literal("LearnCardDIDAuth").optional()
23324
- });
23325
- var PublicCredentialRefreshEnvelopeValidator = external_exports.object({
23326
- format: external_exports.literal("vc"),
23327
- credential: VCValidator,
23328
- etag: external_exports.string().optional()
23329
- });
23330
- var JweCredentialRefreshEnvelopeValidator = external_exports.object({
23331
- format: external_exports.literal("jwe"),
23332
- jwe: JWEValidator,
23333
- etag: external_exports.string().optional(),
23334
- /** Present on LearnCard-managed endpoints; optional for interoperable JWE services. */
23335
- version: external_exports.number().int().positive().optional()
23336
- });
23337
- var CredentialRefreshResponseEnvelopeValidator = external_exports.discriminatedUnion("format", [
23338
- PublicCredentialRefreshEnvelopeValidator,
23339
- JweCredentialRefreshEnvelopeValidator
23340
- ]);
23341
- var CredentialRefreshFailureCodeValidator = external_exports.enum([
23342
- "UNAVAILABLE",
23343
- "TIMEOUT",
23344
- "UNSUPPORTED_SERVICE",
23345
- "UNAUTHORIZED",
23346
- "MALFORMED_RESPONSE",
23347
- "INVALID_PROOF",
23348
- "ISSUER_MISMATCH",
23349
- "ID_MISMATCH",
23350
- "ROLLBACK",
23351
- "REVOKED",
23352
- "UNSAFE_ENDPOINT"
23353
- ]);
23354
- var CredentialRefreshUpdatedResultValidator = external_exports.object({
23355
- status: external_exports.literal("updated"),
23356
- credential: VCValidator,
23357
- etag: external_exports.string().optional(),
23358
- managedVersion: external_exports.number().int().positive().optional()
23359
- });
23360
- var CredentialRefreshUnchangedResultValidator = external_exports.object({
23361
- status: external_exports.literal("unchanged"),
23362
- checkedAt: external_exports.string().min(1),
23363
- etag: external_exports.string().optional()
23364
- });
23365
- var CredentialRefreshUnsupportedResultValidator = external_exports.object({
23366
- status: external_exports.literal("unsupported")
23367
- });
23368
- var CredentialRefreshFailedResultValidator = external_exports.object({
23369
- status: external_exports.literal("failed"),
23370
- code: CredentialRefreshFailureCodeValidator,
23371
- retryable: external_exports.boolean()
23372
- });
23373
- var CredentialRefreshResultValidator = external_exports.discriminatedUnion("status", [
23374
- CredentialRefreshUpdatedResultValidator,
23375
- CredentialRefreshUnchangedResultValidator,
23376
- CredentialRefreshUnsupportedResultValidator,
23377
- CredentialRefreshFailedResultValidator
23378
- ]);
23379
23580
 
23380
23581
  // src/helpers.ts
23381
23582
  var import_json_stringify_deterministic = __toESM(require_lib(), 1);