@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.
@@ -21226,14 +21226,22 @@ var UnsignedVCValidator = external_exports.object({
21226
21226
  }).catchall(external_exports.any());
21227
21227
  var ProofValidator = external_exports.object({
21228
21228
  type: external_exports.string(),
21229
- created: external_exports.string(),
21229
+ created: external_exports.string().optional(),
21230
21230
  challenge: external_exports.string().optional(),
21231
21231
  domain: external_exports.string().optional(),
21232
21232
  nonce: external_exports.string().optional(),
21233
21233
  proofPurpose: external_exports.string(),
21234
21234
  verificationMethod: external_exports.string(),
21235
21235
  jws: external_exports.string().optional()
21236
- }).catchall(external_exports.any());
21236
+ }).catchall(external_exports.any()).superRefine((proof, ctx) => {
21237
+ if (proof.created === void 0 && (proof.type !== "DataIntegrityProof" || proof.cryptosuite !== "ecdsa-rdfc-2019")) {
21238
+ ctx.addIssue({
21239
+ code: "custom",
21240
+ path: ["created"],
21241
+ message: "created is required for this proof suite"
21242
+ });
21243
+ }
21244
+ });
21237
21245
  var VCValidator = UnsignedVCValidator.extend({
21238
21246
  proof: ProofValidator.or(ProofValidator.array())
21239
21247
  });
@@ -21675,6 +21683,204 @@ var StringQuery = external_exports.union([
21675
21683
  $or: BaseStringQuery.array()
21676
21684
  })
21677
21685
  ]);
21686
+ var LearnCardRefreshAuthorizationValidator = external_exports.object({ type: external_exports.literal("LearnCardDIDAuth") }).catchall(external_exports.any());
21687
+ var ManagedCredentialRefreshServiceValidator = external_exports.object({
21688
+ id: external_exports.string().min(1),
21689
+ type: external_exports.literal("LearnCardCredentialRefresh2026"),
21690
+ authorization: LearnCardRefreshAuthorizationValidator.optional()
21691
+ }).catchall(external_exports.any());
21692
+ var StandardCredentialRefreshServiceValidator = external_exports.object({
21693
+ id: external_exports.string().min(1),
21694
+ type: external_exports.literal("1EdTechCredentialRefresh")
21695
+ }).catchall(external_exports.any());
21696
+ var SupportedCredentialRefreshServiceValidator = external_exports.union([
21697
+ ManagedCredentialRefreshServiceValidator,
21698
+ StandardCredentialRefreshServiceValidator
21699
+ ]);
21700
+ var AllocateCredentialRefreshInputValidator = external_exports.object({
21701
+ holder: external_exports.object({
21702
+ profileId: external_exports.string().optional(),
21703
+ did: external_exports.string().min(1)
21704
+ }),
21705
+ credentialId: external_exports.string().min(1)
21706
+ });
21707
+ var AllocateCredentialRefreshResultValidator = external_exports.object({
21708
+ refreshId: external_exports.string().min(1),
21709
+ refreshService: ManagedCredentialRefreshServiceValidator.extend({
21710
+ authorization: LearnCardRefreshAuthorizationValidator
21711
+ })
21712
+ });
21713
+ var ManagedCredentialRefreshReceiptValidator = external_exports.object({
21714
+ refreshId: external_exports.string().min(1),
21715
+ refreshService: ManagedCredentialRefreshServiceValidator,
21716
+ credentialId: external_exports.string().min(1),
21717
+ issuerDid: external_exports.string().min(1),
21718
+ holderDid: external_exports.string().min(1),
21719
+ credentialStatus: CredentialStatusValidator.or(
21720
+ CredentialStatusValidator.array()
21721
+ ).optional()
21722
+ }).strip();
21723
+ var InboxCredentialRefreshReceiptValidator = ManagedCredentialRefreshReceiptValidator.omit(
21724
+ { holderDid: true }
21725
+ ).extend({ holderDid: external_exports.string().min(1).optional() });
21726
+ var CredentialRefreshSigningModeValidator = external_exports.enum(["issuer-signed", "signing-authority"]);
21727
+ var PublishCredentialRefreshBaseFields = {
21728
+ refreshId: external_exports.string().min(1),
21729
+ notifyHolder: external_exports.boolean().optional(),
21730
+ updateSummary: external_exports.string().optional(),
21731
+ idempotencyKey: external_exports.string().optional()
21732
+ };
21733
+ var PublishIssuerSignedRefreshValidator = external_exports.object({
21734
+ ...PublishCredentialRefreshBaseFields,
21735
+ mode: external_exports.literal("issuer-signed"),
21736
+ signedCredential: VCValidator
21737
+ });
21738
+ var PublishSigningAuthorityRefreshValidator = external_exports.object({
21739
+ ...PublishCredentialRefreshBaseFields,
21740
+ mode: external_exports.literal("signing-authority"),
21741
+ credential: UnsignedVCValidator,
21742
+ signingAuthority: external_exports.object({
21743
+ type: external_exports.string().min(1)
21744
+ }).catchall(external_exports.any())
21745
+ });
21746
+ var PublishCredentialRefreshInputValidator = external_exports.object({
21747
+ ...PublishCredentialRefreshBaseFields,
21748
+ mode: CredentialRefreshSigningModeValidator,
21749
+ signedCredential: VCValidator.optional(),
21750
+ credential: UnsignedVCValidator.optional(),
21751
+ signingAuthority: external_exports.object({
21752
+ type: external_exports.string().min(1)
21753
+ }).catchall(external_exports.any()).optional()
21754
+ }).superRefine((input, ctx) => {
21755
+ if (input.mode === "issuer-signed" && !input.signedCredential) {
21756
+ ctx.addIssue({
21757
+ code: "custom",
21758
+ path: ["signedCredential"],
21759
+ message: "signedCredential is required for issuer-signed publication"
21760
+ });
21761
+ }
21762
+ if (input.mode === "issuer-signed" && (input.credential !== void 0 || input.signingAuthority !== void 0)) {
21763
+ ctx.addIssue({
21764
+ code: "custom",
21765
+ path: ["mode"],
21766
+ message: "issuer-signed publication cannot include signing-authority fields"
21767
+ });
21768
+ }
21769
+ if (input.mode === "signing-authority") {
21770
+ if (input.signedCredential !== void 0) {
21771
+ ctx.addIssue({
21772
+ code: "custom",
21773
+ path: ["signedCredential"],
21774
+ message: "signing-authority publication cannot include signedCredential"
21775
+ });
21776
+ }
21777
+ if (!input.credential) {
21778
+ ctx.addIssue({
21779
+ code: "custom",
21780
+ path: ["credential"],
21781
+ message: "credential is required for signing-authority publication"
21782
+ });
21783
+ }
21784
+ if (!input.signingAuthority) {
21785
+ ctx.addIssue({
21786
+ code: "custom",
21787
+ path: ["signingAuthority"],
21788
+ message: "signingAuthority is required for signing-authority publication"
21789
+ });
21790
+ }
21791
+ }
21792
+ });
21793
+ var PublishCredentialRefreshNotificationValidator = external_exports.enum([
21794
+ "queued",
21795
+ "suppressed",
21796
+ "not-applicable",
21797
+ /** Publication succeeded, but the post-commit notification enqueue must be retried. */
21798
+ "delivery-failed"
21799
+ ]);
21800
+ var PublishCredentialRefreshResultValidator = external_exports.object({
21801
+ refreshId: external_exports.string().min(1),
21802
+ version: external_exports.number().int().positive(),
21803
+ publishedAt: external_exports.string().min(1),
21804
+ notification: PublishCredentialRefreshNotificationValidator
21805
+ });
21806
+ var CredentialRefreshVersionMetadataValidator = external_exports.object({
21807
+ version: external_exports.number().int().positive(),
21808
+ publishedAt: external_exports.string().min(1),
21809
+ effectiveAt: external_exports.string().optional(),
21810
+ etag: external_exports.string().optional(),
21811
+ signingMode: CredentialRefreshSigningModeValidator.optional(),
21812
+ updateSummary: external_exports.string().optional()
21813
+ });
21814
+ var GetCredentialRefreshHistoryInputValidator = external_exports.object({
21815
+ refreshId: external_exports.string().min(1),
21816
+ cursor: external_exports.string().optional(),
21817
+ limit: external_exports.number().int().positive().optional()
21818
+ });
21819
+ var GetCredentialRefreshHistoryResultValidator = external_exports.object({
21820
+ records: CredentialRefreshVersionMetadataValidator.array(),
21821
+ hasMore: external_exports.boolean(),
21822
+ cursor: external_exports.string().optional()
21823
+ });
21824
+ var CredentialRefreshChallengeValidator = external_exports.object({
21825
+ challenge: external_exports.string().min(1),
21826
+ expiresAt: external_exports.string().min(1),
21827
+ domain: external_exports.string().optional(),
21828
+ scheme: external_exports.literal("LearnCardDIDAuth").optional()
21829
+ });
21830
+ var PublicCredentialRefreshEnvelopeValidator = external_exports.object({
21831
+ format: external_exports.literal("vc"),
21832
+ credential: VCValidator,
21833
+ etag: external_exports.string().optional()
21834
+ });
21835
+ var JweCredentialRefreshEnvelopeValidator = external_exports.object({
21836
+ format: external_exports.literal("jwe"),
21837
+ jwe: JWEValidator,
21838
+ etag: external_exports.string().optional(),
21839
+ /** Present on LearnCard-managed endpoints; optional for interoperable JWE services. */
21840
+ version: external_exports.number().int().positive().optional()
21841
+ });
21842
+ var CredentialRefreshResponseEnvelopeValidator = external_exports.discriminatedUnion("format", [
21843
+ PublicCredentialRefreshEnvelopeValidator,
21844
+ JweCredentialRefreshEnvelopeValidator
21845
+ ]);
21846
+ var CredentialRefreshFailureCodeValidator = external_exports.enum([
21847
+ "UNAVAILABLE",
21848
+ "TIMEOUT",
21849
+ "UNSUPPORTED_SERVICE",
21850
+ "UNAUTHORIZED",
21851
+ "MALFORMED_RESPONSE",
21852
+ "INVALID_PROOF",
21853
+ "ISSUER_MISMATCH",
21854
+ "ID_MISMATCH",
21855
+ "ROLLBACK",
21856
+ "REVOKED",
21857
+ "UNSAFE_ENDPOINT"
21858
+ ]);
21859
+ var CredentialRefreshUpdatedResultValidator = external_exports.object({
21860
+ status: external_exports.literal("updated"),
21861
+ credential: VCValidator,
21862
+ etag: external_exports.string().optional(),
21863
+ managedVersion: external_exports.number().int().positive().optional()
21864
+ });
21865
+ var CredentialRefreshUnchangedResultValidator = external_exports.object({
21866
+ status: external_exports.literal("unchanged"),
21867
+ checkedAt: external_exports.string().min(1),
21868
+ etag: external_exports.string().optional()
21869
+ });
21870
+ var CredentialRefreshUnsupportedResultValidator = external_exports.object({
21871
+ status: external_exports.literal("unsupported")
21872
+ });
21873
+ var CredentialRefreshFailedResultValidator = external_exports.object({
21874
+ status: external_exports.literal("failed"),
21875
+ code: CredentialRefreshFailureCodeValidator,
21876
+ retryable: external_exports.boolean()
21877
+ });
21878
+ var CredentialRefreshResultValidator = external_exports.discriminatedUnion("status", [
21879
+ CredentialRefreshUpdatedResultValidator,
21880
+ CredentialRefreshUnchangedResultValidator,
21881
+ CredentialRefreshUnsupportedResultValidator,
21882
+ CredentialRefreshFailedResultValidator
21883
+ ]);
21678
21884
  var LCNProfileDisplayValidator = external_exports.object({
21679
21885
  backgroundColor: external_exports.string().optional(),
21680
21886
  backgroundImage: external_exports.string().optional(),
@@ -22010,7 +22216,13 @@ var SendBoostInputValidator = external_exports.object({
22010
22216
  "Options for email/phone recipients (Universal Inbox)"
22011
22217
  ),
22012
22218
  templateData: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
22013
- integrationId: external_exports.string().optional().describe("Integration ID for activity tracking")
22219
+ integrationId: external_exports.string().optional().describe("Integration ID for activity tracking"),
22220
+ refresh: external_exports.boolean().optional().describe(
22221
+ "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."
22222
+ ),
22223
+ idempotencyKey: external_exports.string().min(1).max(200).optional().describe(
22224
+ "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."
22225
+ )
22014
22226
  }).refine((data) => data.templateUri || data.template || data.signedCredential, {
22015
22227
  message: "Either templateUri, template, or signedCredential must be provided.",
22016
22228
  path: ["templateUri"]
@@ -22025,8 +22237,12 @@ var SendBoostInputValidator = external_exports.object({
22025
22237
  message: "guardianEmail must differ from recipient (self-approval not allowed)",
22026
22238
  path: ["options", "guardianEmail"]
22027
22239
  }
22028
- );
22240
+ ).refine((data) => !data.idempotencyKey || data.refresh === true, {
22241
+ message: "idempotencyKey is only supported with refresh: true.",
22242
+ path: ["idempotencyKey"]
22243
+ });
22029
22244
  var SendInboxResponseValidator = external_exports.object({
22245
+ refresh: InboxCredentialRefreshReceiptValidator.optional(),
22030
22246
  issuanceId: external_exports.string(),
22031
22247
  status: external_exports.enum(["PENDING", "ISSUED", "EXPIRED", "DELIVERED", "CLAIMED"]),
22032
22248
  claimUrl: external_exports.string().url().optional().describe("Present when suppressDelivery=true"),
@@ -22041,8 +22257,34 @@ var SendBoostResponseValidator = external_exports.object({
22041
22257
  activityId: external_exports.string().describe("Links to the activity lifecycle for this issuance"),
22042
22258
  inbox: SendInboxResponseValidator.optional().describe(
22043
22259
  "Present when sent via email/phone (Universal Inbox)"
22260
+ ),
22261
+ refresh: ManagedCredentialRefreshReceiptValidator.optional().describe(
22262
+ "Present when managed refresh was requested: issuance metadata the issuer keeps to publish future updates"
22044
22263
  )
22045
22264
  });
22265
+ var PrepareRefreshableSendInputValidator = external_exports.object({
22266
+ recipient: external_exports.string(),
22267
+ templateUri: external_exports.string().optional(),
22268
+ template: SendBoostTemplateValidator.optional(),
22269
+ contractUri: external_exports.string().optional(),
22270
+ templateData: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
22271
+ integrationId: external_exports.string().optional(),
22272
+ /** Credential ID to allocate for; generated server-side when omitted. */
22273
+ credentialId: external_exports.string().min(1).optional(),
22274
+ idempotencyKey: external_exports.string().min(1).max(200).optional()
22275
+ }).refine((data) => Boolean(data.templateUri) !== Boolean(data.template), {
22276
+ message: "Provide exactly one of templateUri or template."
22277
+ });
22278
+ var PrepareRefreshableSendResultValidator = external_exports.object({
22279
+ boostUri: external_exports.string(),
22280
+ credentialId: external_exports.string(),
22281
+ refreshId: external_exports.string(),
22282
+ refreshService: ManagedCredentialRefreshServiceValidator,
22283
+ /** The DID to use as credentialSubject.id (recipient DID, or the profile's did:web). */
22284
+ holderDid: external_exports.string(),
22285
+ /** Present when this idempotencyKey already completed: return it without signing. */
22286
+ completed: SendBoostResponseValidator.optional()
22287
+ });
22046
22288
  var SendInputValidator = external_exports.discriminatedUnion("type", [SendBoostInputValidator]);
22047
22289
  var SendResponseValidator = external_exports.discriminatedUnion("type", [SendBoostResponseValidator]);
22048
22290
  var ConsentFlowTermsStatusValidator = external_exports.enum(["live", "stale", "withdrawn"]);
@@ -22118,15 +22360,6 @@ var ConsentFlowContractDataValidator = external_exports.object({
22118
22360
  var PaginatedConsentFlowDataValidator = PaginationResponseValidator.extend({
22119
22361
  records: ConsentFlowContractDataValidator.array()
22120
22362
  });
22121
- var ConsentFlowContractDataForDidValidator = external_exports.object({
22122
- credentials: external_exports.object({ category: external_exports.string(), uri: external_exports.string() }).array(),
22123
- personal: external_exports.record(external_exports.string(), external_exports.string()).default({}),
22124
- date: external_exports.string(),
22125
- contractUri: external_exports.string()
22126
- });
22127
- var PaginatedConsentFlowDataForDidValidator = PaginationResponseValidator.extend({
22128
- records: ConsentFlowContractDataForDidValidator.array()
22129
- });
22130
22363
  var ConsentFlowTermValidator = external_exports.object({
22131
22364
  sharing: external_exports.boolean().optional(),
22132
22365
  shared: external_exports.string().array().optional(),
@@ -22160,6 +22393,34 @@ var PaginatedConsentFlowTermsValidator = PaginationResponseValidator.extend({
22160
22393
  status: ConsentFlowTermsStatusValidator
22161
22394
  }).array()
22162
22395
  });
22396
+ var ConsentFlowGuardianApprovalValidator = external_exports.object({
22397
+ guardianProfileId: external_exports.string(),
22398
+ guardianDid: external_exports.string(),
22399
+ approvedAt: external_exports.string().datetime(),
22400
+ contractUpdatedAt: external_exports.string()
22401
+ });
22402
+ var ConsentFlowContractDataForDidValidator = external_exports.object({
22403
+ credentials: external_exports.object({ category: external_exports.string(), uri: external_exports.string() }).array(),
22404
+ personal: external_exports.record(external_exports.string(), external_exports.string()).default({}),
22405
+ date: external_exports.string(),
22406
+ createdAt: external_exports.string().optional(),
22407
+ contractUpdatedAt: external_exports.string(),
22408
+ contractExpiresAt: external_exports.string().optional(),
22409
+ reasonForAccessing: external_exports.string().optional(),
22410
+ guardian: external_exports.object({
22411
+ required: external_exports.boolean(),
22412
+ approved: external_exports.boolean(),
22413
+ approval: ConsentFlowGuardianApprovalValidator.optional()
22414
+ }),
22415
+ contractUri: external_exports.string(),
22416
+ termsUri: external_exports.string(),
22417
+ status: ConsentFlowTermsStatusValidator,
22418
+ expiresAt: external_exports.string().optional(),
22419
+ terms: ConsentFlowTermsValidator
22420
+ });
22421
+ var PaginatedConsentFlowDataForDidValidator = PaginationResponseValidator.extend({
22422
+ records: ConsentFlowContractDataForDidValidator.array()
22423
+ });
22163
22424
  var ConsentFlowContractQueryValidator = external_exports.object({
22164
22425
  read: external_exports.object({
22165
22426
  anonymize: external_exports.boolean().optional(),
@@ -22220,6 +22481,7 @@ var ConsentFlowTransactionValidator = external_exports.object({
22220
22481
  expiresAt: external_exports.string().optional(),
22221
22482
  oneTime: external_exports.boolean().optional(),
22222
22483
  terms: ConsentFlowTermsValidator.optional(),
22484
+ guardianApproval: ConsentFlowGuardianApprovalValidator.optional(),
22223
22485
  id: external_exports.string(),
22224
22486
  action: ConsentFlowTransactionActionValidator,
22225
22487
  date: external_exports.string(),
@@ -22353,6 +22615,7 @@ var AuthGrantValidator = external_exports.object({
22353
22615
  }, "error")
22354
22616
  }),
22355
22617
  scope: external_exports.string(),
22618
+ actAs: external_exports.string().optional(),
22356
22619
  createdAt: external_exports.iso.datetime({ error: "createdAt must be a valid ISO 8601 datetime string" }),
22357
22620
  expiresAt: external_exports.iso.datetime({ error: "expiresAt must be a valid ISO 8601 datetime string" }).nullish().optional()
22358
22621
  });
@@ -22424,6 +22687,8 @@ var CreateContactMethodSessionResponseValidator = external_exports.object({
22424
22687
  sessionJwt: external_exports.string()
22425
22688
  });
22426
22689
  var InboxCredentialValidator = external_exports.object({
22690
+ refresh: InboxCredentialRefreshReceiptValidator.optional(),
22691
+ refreshId: external_exports.string().optional(),
22427
22692
  id: external_exports.string(),
22428
22693
  credential: external_exports.string().optional(),
22429
22694
  isSigned: external_exports.boolean(),
@@ -22478,12 +22743,19 @@ var IssueInboxCredentialValidator = external_exports.object({
22478
22743
  templateUri: external_exports.string().optional().describe(
22479
22744
  "URI of a boost template to use for issuance. The boost credential will be resolved and used. Mutually exclusive with credential field."
22480
22745
  ),
22746
+ refresh: external_exports.boolean().optional().describe(
22747
+ "Allocate managed refresh before signing. Requires unsigned content and a registered signing authority; binds the holder on claim."
22748
+ ),
22749
+ idempotencyKey: external_exports.string().min(1).max(200).optional(),
22481
22750
  // === OPTIONAL FEATURES ===
22482
22751
  // Add major, distinct features at the top level.
22483
22752
  //consentRequest: ConsentRequestValidator.optional(),
22484
22753
  // === PROCESS CONFIGURATION (Optional) ===
22485
22754
  // HOW should this issuance be handled?
22486
22755
  configuration: external_exports.object({
22756
+ guardianEmail: external_exports.string().email().optional().describe(
22757
+ "Require approval from this guardian before the recipient can claim. Must differ from the recipient email."
22758
+ ),
22487
22759
  signingAuthority: IssueInboxSigningAuthorityValidator.optional().describe(
22488
22760
  "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."
22489
22761
  ),
@@ -22537,17 +22809,130 @@ var IssueInboxCredentialValidator = external_exports.object({
22537
22809
  }).optional().describe(
22538
22810
  "Configuration for the credential issuance. If not provided, the default configuration will be used."
22539
22811
  )
22812
+ }).refine((data) => !data.idempotencyKey || data.refresh === true, {
22813
+ message: "idempotencyKey requires refresh: true."
22540
22814
  }).refine((data) => data.credential || data.templateUri, {
22541
22815
  message: "Either credential or templateUri must be provided.",
22542
22816
  path: ["credential"]
22543
- });
22817
+ }).refine(
22818
+ (data) => !data.configuration?.guardianEmail || data.recipient.type !== "email" || data.configuration.guardianEmail.toLowerCase() !== data.recipient.value.toLowerCase(),
22819
+ {
22820
+ message: "guardianEmail must differ from recipient (self-approval not allowed)",
22821
+ path: ["configuration", "guardianEmail"]
22822
+ }
22823
+ );
22544
22824
  var IssueInboxCredentialResponseValidator = external_exports.object({
22825
+ refresh: InboxCredentialRefreshReceiptValidator.optional(),
22545
22826
  issuanceId: external_exports.string(),
22546
22827
  status: LCNInboxStatusEnumValidator,
22547
22828
  recipient: ContactMethodQueryValidator,
22548
22829
  claimUrl: external_exports.string().url().optional(),
22549
22830
  recipientDid: external_exports.string().optional()
22550
22831
  });
22832
+ var InboxBatchConfigurationValidator = IssueInboxCredentialValidator.shape.configuration.unwrap().extend({
22833
+ refresh: IssueInboxCredentialValidator.shape.refresh.describe(
22834
+ "Enable managed refresh by default. An item configuration.refresh overrides this value, including false."
22835
+ ),
22836
+ delivery: IssueInboxCredentialValidator.shape.configuration.unwrap().shape.delivery.unwrap().extend({ suppress: external_exports.boolean().optional() }).optional()
22837
+ });
22838
+ var InboxBatchItemConfigurationValidator = InboxBatchConfigurationValidator.extend({
22839
+ guardianEmail: InboxBatchConfigurationValidator.shape.guardianEmail.nullable().describe(
22840
+ "Require guardian approval, or set null to clear a batch-level guardianEmail for this item."
22841
+ )
22842
+ });
22843
+ var IssueInboxCredentialBatchItemValidator = external_exports.object({
22844
+ ...IssueInboxCredentialValidator.shape,
22845
+ configuration: InboxBatchItemConfigurationValidator.optional(),
22846
+ idempotencyKey: external_exports.string().max(256).optional()
22847
+ }).refine((data) => data.credential || data.templateUri, {
22848
+ message: "Either credential or templateUri must be provided.",
22849
+ path: ["credential"]
22850
+ }).describe(
22851
+ "One issuance: provide credential or templateUri. Invalid input is rejected at submission with its item index."
22852
+ );
22853
+ var IssueInboxCredentialBatchValidator = external_exports.object({
22854
+ requestId: external_exports.string().min(1).max(256).optional(),
22855
+ items: external_exports.array(IssueInboxCredentialBatchItemValidator).min(1).max(100),
22856
+ configuration: InboxBatchConfigurationValidator.optional()
22857
+ }).superRefine((batch, ctx) => {
22858
+ batch.items.forEach((item, index) => {
22859
+ const itemGuardian = item.configuration?.guardianEmail;
22860
+ const guardian = itemGuardian === null ? void 0 : itemGuardian ?? batch.configuration?.guardianEmail;
22861
+ if (guardian && item.recipient.type === "email" && guardian.toLowerCase() === item.recipient.value.toLowerCase()) {
22862
+ ctx.addIssue({
22863
+ code: "custom",
22864
+ path: ["items", index, "configuration", "guardianEmail"],
22865
+ message: "guardianEmail must differ from recipient (self-approval not allowed)"
22866
+ });
22867
+ }
22868
+ });
22869
+ });
22870
+ var InboxBatchErrorReasonValidator = external_exports.enum([
22871
+ "DUPLICATE_KEY",
22872
+ "IDEMPOTENCY_MISMATCH",
22873
+ "IN_PROGRESS",
22874
+ "UNCONFIRMED"
22875
+ ]);
22876
+ var IssueInboxCredentialBatchItemResultValidator = external_exports.discriminatedUnion("success", [
22877
+ IssueInboxCredentialResponseValidator.extend({
22878
+ success: external_exports.literal(true),
22879
+ index: external_exports.number().int().nonnegative(),
22880
+ deduplicated: external_exports.boolean().optional(),
22881
+ guardianStatus: GuardianStatusValidator.optional(),
22882
+ idempotencyKey: external_exports.string().optional()
22883
+ }),
22884
+ external_exports.object({
22885
+ success: external_exports.literal(false),
22886
+ index: external_exports.number().int().nonnegative(),
22887
+ idempotencyKey: external_exports.string().optional(),
22888
+ recipient: ContactMethodQueryValidator.optional(),
22889
+ error: external_exports.object({
22890
+ code: external_exports.string(),
22891
+ message: external_exports.string(),
22892
+ reason: InboxBatchErrorReasonValidator.optional()
22893
+ }),
22894
+ issuanceId: external_exports.string().optional().describe(
22895
+ "Present when issuance completed but replay storage could not be confirmed. Reconcile this issuance; do not issue again with a new key."
22896
+ ),
22897
+ claimUrl: external_exports.string().url().optional().describe(
22898
+ "Claim URL of the completed issuance, if available, when replay storage could not be confirmed."
22899
+ )
22900
+ })
22901
+ ]);
22902
+ var IssueInboxCredentialBatchResponseValidator = external_exports.object({
22903
+ results: external_exports.array(IssueInboxCredentialBatchItemResultValidator),
22904
+ summary: external_exports.object({
22905
+ total: external_exports.number(),
22906
+ succeeded: external_exports.number(),
22907
+ failed: external_exports.number(),
22908
+ deduplicated: external_exports.number()
22909
+ })
22910
+ });
22911
+ var InboxBatchReceiptValidator = external_exports.object({
22912
+ batchId: external_exports.string(),
22913
+ status: external_exports.enum(["QUEUED", "PROCESSING", "COMPLETED", "NEEDS_RECONCILIATION"]),
22914
+ createdAt: external_exports.string()
22915
+ });
22916
+ var InboxBatchStatusValidator = external_exports.object({
22917
+ batchId: external_exports.string(),
22918
+ createdAt: external_exports.string(),
22919
+ done: external_exports.boolean().describe(
22920
+ "True when no queued or processing items remain, including unconfirmed outcomes."
22921
+ ),
22922
+ status: external_exports.enum(["QUEUED", "PROCESSING", "COMPLETED", "NEEDS_RECONCILIATION"]),
22923
+ items: external_exports.array(
22924
+ external_exports.object({
22925
+ index: external_exports.number().int().nonnegative(),
22926
+ state: external_exports.enum(["QUEUED", "PROCESSING", "COMPLETED", "NEEDS_RECONCILIATION"]),
22927
+ result: IssueInboxCredentialBatchItemResultValidator.optional()
22928
+ })
22929
+ ),
22930
+ summary: IssueInboxCredentialBatchResponseValidator.shape.summary.extend({
22931
+ completed: external_exports.number(),
22932
+ pending: external_exports.number(),
22933
+ unconfirmed: external_exports.number()
22934
+ })
22935
+ });
22551
22936
  var CredentialNameRefValidator = external_exports.object({ name: external_exports.string() }).passthrough();
22552
22937
  var ClaimInboxCredentialValidator = external_exports.object({
22553
22938
  credential: VCValidator.or(VPValidator).or(UnsignedVCValidator).or(CredentialNameRefValidator).describe("The credential to issue, or a { name } reference to resolve a boost template."),
@@ -23033,6 +23418,7 @@ var CredentialActivityValidator = external_exports.object({
23033
23418
  eventType: CredentialActivityEventTypeValidator,
23034
23419
  timestamp: external_exports.string(),
23035
23420
  actorProfileId: external_exports.string().optional(),
23421
+ onBehalfOf: external_exports.string().optional(),
23036
23422
  recipientType: CredentialActivityRecipientTypeValidator,
23037
23423
  recipientIdentifier: external_exports.string(),
23038
23424
  boostUri: external_exports.string().optional(),
@@ -23182,191 +23568,6 @@ var inAppMessagesFlagValidator = external_exports.object({
23182
23568
  version: external_exports.number().default(1),
23183
23569
  messages: external_exports.array(inAppMessageValidator).default([])
23184
23570
  }).passthrough();
23185
- var LearnCardRefreshAuthorizationValidator = external_exports.object({ type: external_exports.literal("LearnCardDIDAuth") }).catchall(external_exports.any());
23186
- var ManagedCredentialRefreshServiceValidator = external_exports.object({
23187
- id: external_exports.string().min(1),
23188
- type: external_exports.literal("LearnCardCredentialRefresh2026"),
23189
- authorization: LearnCardRefreshAuthorizationValidator.optional()
23190
- }).catchall(external_exports.any());
23191
- var StandardCredentialRefreshServiceValidator = external_exports.object({
23192
- id: external_exports.string().min(1),
23193
- type: external_exports.literal("1EdTechCredentialRefresh")
23194
- }).catchall(external_exports.any());
23195
- var SupportedCredentialRefreshServiceValidator = external_exports.union([
23196
- ManagedCredentialRefreshServiceValidator,
23197
- StandardCredentialRefreshServiceValidator
23198
- ]);
23199
- var AllocateCredentialRefreshInputValidator = external_exports.object({
23200
- holder: external_exports.object({
23201
- profileId: external_exports.string().optional(),
23202
- did: external_exports.string().min(1)
23203
- }),
23204
- credentialId: external_exports.string().min(1)
23205
- });
23206
- var AllocateCredentialRefreshResultValidator = external_exports.object({
23207
- refreshId: external_exports.string().min(1),
23208
- refreshService: ManagedCredentialRefreshServiceValidator.extend({
23209
- authorization: LearnCardRefreshAuthorizationValidator
23210
- })
23211
- });
23212
- var CredentialRefreshSigningModeValidator = external_exports.enum(["issuer-signed", "signing-authority"]);
23213
- var PublishCredentialRefreshBaseFields = {
23214
- refreshId: external_exports.string().min(1),
23215
- notifyHolder: external_exports.boolean().optional(),
23216
- updateSummary: external_exports.string().optional(),
23217
- idempotencyKey: external_exports.string().optional()
23218
- };
23219
- var PublishIssuerSignedRefreshValidator = external_exports.object({
23220
- ...PublishCredentialRefreshBaseFields,
23221
- mode: external_exports.literal("issuer-signed"),
23222
- signedCredential: VCValidator
23223
- });
23224
- var PublishSigningAuthorityRefreshValidator = external_exports.object({
23225
- ...PublishCredentialRefreshBaseFields,
23226
- mode: external_exports.literal("signing-authority"),
23227
- credential: UnsignedVCValidator,
23228
- signingAuthority: external_exports.object({
23229
- type: external_exports.string().min(1)
23230
- }).catchall(external_exports.any())
23231
- });
23232
- var PublishCredentialRefreshInputValidator = external_exports.object({
23233
- ...PublishCredentialRefreshBaseFields,
23234
- mode: CredentialRefreshSigningModeValidator,
23235
- signedCredential: VCValidator.optional(),
23236
- credential: UnsignedVCValidator.optional(),
23237
- signingAuthority: external_exports.object({
23238
- type: external_exports.string().min(1)
23239
- }).catchall(external_exports.any()).optional()
23240
- }).superRefine((input, ctx) => {
23241
- if (input.mode === "issuer-signed" && !input.signedCredential) {
23242
- ctx.addIssue({
23243
- code: "custom",
23244
- path: ["signedCredential"],
23245
- message: "signedCredential is required for issuer-signed publication"
23246
- });
23247
- }
23248
- if (input.mode === "issuer-signed" && (input.credential !== void 0 || input.signingAuthority !== void 0)) {
23249
- ctx.addIssue({
23250
- code: "custom",
23251
- path: ["mode"],
23252
- message: "issuer-signed publication cannot include signing-authority fields"
23253
- });
23254
- }
23255
- if (input.mode === "signing-authority") {
23256
- if (input.signedCredential !== void 0) {
23257
- ctx.addIssue({
23258
- code: "custom",
23259
- path: ["signedCredential"],
23260
- message: "signing-authority publication cannot include signedCredential"
23261
- });
23262
- }
23263
- if (!input.credential) {
23264
- ctx.addIssue({
23265
- code: "custom",
23266
- path: ["credential"],
23267
- message: "credential is required for signing-authority publication"
23268
- });
23269
- }
23270
- if (!input.signingAuthority) {
23271
- ctx.addIssue({
23272
- code: "custom",
23273
- path: ["signingAuthority"],
23274
- message: "signingAuthority is required for signing-authority publication"
23275
- });
23276
- }
23277
- }
23278
- });
23279
- var PublishCredentialRefreshNotificationValidator = external_exports.enum([
23280
- "queued",
23281
- "suppressed",
23282
- "not-applicable",
23283
- /** Publication succeeded, but the post-commit notification enqueue must be retried. */
23284
- "delivery-failed"
23285
- ]);
23286
- var PublishCredentialRefreshResultValidator = external_exports.object({
23287
- refreshId: external_exports.string().min(1),
23288
- version: external_exports.number().int().positive(),
23289
- publishedAt: external_exports.string().min(1),
23290
- notification: PublishCredentialRefreshNotificationValidator
23291
- });
23292
- var CredentialRefreshVersionMetadataValidator = external_exports.object({
23293
- version: external_exports.number().int().positive(),
23294
- publishedAt: external_exports.string().min(1),
23295
- effectiveAt: external_exports.string().optional(),
23296
- etag: external_exports.string().optional(),
23297
- signingMode: CredentialRefreshSigningModeValidator.optional(),
23298
- updateSummary: external_exports.string().optional()
23299
- });
23300
- var GetCredentialRefreshHistoryInputValidator = external_exports.object({
23301
- refreshId: external_exports.string().min(1),
23302
- cursor: external_exports.string().optional(),
23303
- limit: external_exports.number().int().positive().optional()
23304
- });
23305
- var GetCredentialRefreshHistoryResultValidator = external_exports.object({
23306
- records: CredentialRefreshVersionMetadataValidator.array(),
23307
- hasMore: external_exports.boolean(),
23308
- cursor: external_exports.string().optional()
23309
- });
23310
- var CredentialRefreshChallengeValidator = external_exports.object({
23311
- challenge: external_exports.string().min(1),
23312
- expiresAt: external_exports.string().min(1),
23313
- domain: external_exports.string().optional(),
23314
- scheme: external_exports.literal("LearnCardDIDAuth").optional()
23315
- });
23316
- var PublicCredentialRefreshEnvelopeValidator = external_exports.object({
23317
- format: external_exports.literal("vc"),
23318
- credential: VCValidator,
23319
- etag: external_exports.string().optional()
23320
- });
23321
- var JweCredentialRefreshEnvelopeValidator = external_exports.object({
23322
- format: external_exports.literal("jwe"),
23323
- jwe: JWEValidator,
23324
- etag: external_exports.string().optional(),
23325
- /** Present on LearnCard-managed endpoints; optional for interoperable JWE services. */
23326
- version: external_exports.number().int().positive().optional()
23327
- });
23328
- var CredentialRefreshResponseEnvelopeValidator = external_exports.discriminatedUnion("format", [
23329
- PublicCredentialRefreshEnvelopeValidator,
23330
- JweCredentialRefreshEnvelopeValidator
23331
- ]);
23332
- var CredentialRefreshFailureCodeValidator = external_exports.enum([
23333
- "UNAVAILABLE",
23334
- "TIMEOUT",
23335
- "UNSUPPORTED_SERVICE",
23336
- "UNAUTHORIZED",
23337
- "MALFORMED_RESPONSE",
23338
- "INVALID_PROOF",
23339
- "ISSUER_MISMATCH",
23340
- "ID_MISMATCH",
23341
- "ROLLBACK",
23342
- "REVOKED",
23343
- "UNSAFE_ENDPOINT"
23344
- ]);
23345
- var CredentialRefreshUpdatedResultValidator = external_exports.object({
23346
- status: external_exports.literal("updated"),
23347
- credential: VCValidator,
23348
- etag: external_exports.string().optional(),
23349
- managedVersion: external_exports.number().int().positive().optional()
23350
- });
23351
- var CredentialRefreshUnchangedResultValidator = external_exports.object({
23352
- status: external_exports.literal("unchanged"),
23353
- checkedAt: external_exports.string().min(1),
23354
- etag: external_exports.string().optional()
23355
- });
23356
- var CredentialRefreshUnsupportedResultValidator = external_exports.object({
23357
- status: external_exports.literal("unsupported")
23358
- });
23359
- var CredentialRefreshFailedResultValidator = external_exports.object({
23360
- status: external_exports.literal("failed"),
23361
- code: CredentialRefreshFailureCodeValidator,
23362
- retryable: external_exports.boolean()
23363
- });
23364
- var CredentialRefreshResultValidator = external_exports.discriminatedUnion("status", [
23365
- CredentialRefreshUpdatedResultValidator,
23366
- CredentialRefreshUnchangedResultValidator,
23367
- CredentialRefreshUnsupportedResultValidator,
23368
- CredentialRefreshFailedResultValidator
23369
- ]);
23370
23571
 
23371
23572
  // src/helpers.ts
23372
23573
  var import_json_stringify_deterministic = __toESM(require_lib(), 1);