@learncard/learn-cloud-plugin 2.3.51 → 2.3.52

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.
@@ -27108,12 +27108,46 @@ var StringQuery = external_exports.union([
27108
27108
  $or: BaseStringQuery.array()
27109
27109
  })
27110
27110
  ]);
27111
+ var BITSTRING_STATUS_PURPOSES = ["revocation", "suspension"];
27112
+ var BitstringStatusPurposeValidator = external_exports.enum(BITSTRING_STATUS_PURPOSES);
27113
+ var BitstringStatusListEntryValidator = external_exports.object({
27114
+ id: external_exports.string().optional(),
27115
+ type: external_exports.literal("BitstringStatusListEntry"),
27116
+ statusPurpose: BitstringStatusPurposeValidator,
27117
+ statusListIndex: external_exports.string().or(external_exports.number().int().nonnegative()),
27118
+ statusListCredential: external_exports.string()
27119
+ });
27120
+ var AllocatedBitstringStatusListEntryValidator = BitstringStatusListEntryValidator.extend({
27121
+ id: external_exports.string()
27122
+ });
27123
+ var BitstringStatusListCredentialSubjectValidator = external_exports.object({
27124
+ id: external_exports.string().optional(),
27125
+ type: external_exports.literal("BitstringStatusList"),
27126
+ statusPurpose: BitstringStatusPurposeValidator,
27127
+ encodedList: external_exports.string()
27128
+ });
27129
+ var AllocateCredentialStatusInputValidator = external_exports.object({
27130
+ statusPurposes: external_exports.array(BitstringStatusPurposeValidator).optional(),
27131
+ listSize: external_exports.number().int().positive().optional()
27132
+ }).default({});
27133
+ var AttachCredentialRefreshStatusEntriesInputValidator = external_exports.object({
27134
+ refreshId: external_exports.string().min(1),
27135
+ credentialStatus: CredentialStatusValidator.or(CredentialStatusValidator.array()).nullable()
27136
+ });
27111
27137
  var LearnCardRefreshAuthorizationValidator = external_exports.object({ type: external_exports.literal("LearnCardDIDAuth") }).catchall(external_exports.any());
27112
27138
  var ManagedCredentialRefreshServiceValidator = external_exports.object({
27113
27139
  id: external_exports.string().min(1),
27114
27140
  type: external_exports.literal("LearnCardCredentialRefresh2026"),
27115
27141
  authorization: LearnCardRefreshAuthorizationValidator.optional()
27116
27142
  }).catchall(external_exports.any());
27143
+ var ManagedCredentialRefreshBindingValidator = ManagedCredentialRefreshServiceValidator.or(
27144
+ RefreshServiceValidator.array().refine(
27145
+ (services) => services.some(
27146
+ (service) => ManagedCredentialRefreshServiceValidator.safeParse(service).success
27147
+ ),
27148
+ "A managed refresh service is required"
27149
+ )
27150
+ );
27117
27151
  var StandardCredentialRefreshServiceValidator = external_exports.object({
27118
27152
  id: external_exports.string().min(1),
27119
27153
  type: external_exports.literal("1EdTechCredentialRefresh")
@@ -27137,7 +27171,9 @@ var AllocateCredentialRefreshResultValidator = external_exports.object({
27137
27171
  });
27138
27172
  var ManagedCredentialRefreshReceiptValidator = external_exports.object({
27139
27173
  refreshId: external_exports.string().min(1),
27140
- refreshService: ManagedCredentialRefreshServiceValidator,
27174
+ refreshService: ManagedCredentialRefreshBindingValidator,
27175
+ /** Legacy receipts authenticate only the allocated managed entry, not other services. */
27176
+ refreshServiceBinding: external_exports.literal("managed-entry").optional(),
27141
27177
  credentialId: external_exports.string().min(1),
27142
27178
  issuerDid: external_exports.string().min(1),
27143
27179
  holderDid: external_exports.string().min(1),
@@ -27145,14 +27181,43 @@ var ManagedCredentialRefreshReceiptValidator = external_exports.object({
27145
27181
  CredentialStatusValidator.array()
27146
27182
  ).optional()
27147
27183
  }).strip();
27184
+ var GetCredentialRefreshReceiptInputValidator = external_exports.object({ uri: external_exports.string().min(1) });
27185
+ var CredentialRefreshReceiptValidator = ManagedCredentialRefreshReceiptValidator.extend({
27186
+ encryptionMode: external_exports.enum(["network", "holder"])
27187
+ });
27188
+ var HolderEncryptedHandoffValidator = external_exports.object({
27189
+ refreshId: external_exports.string().min(1),
27190
+ credentialId: external_exports.string().min(1),
27191
+ holderDid: external_exports.string().min(1),
27192
+ issuerDid: external_exports.string().min(1),
27193
+ credentialStatus: CredentialStatusValidator.or(CredentialStatusValidator.array()),
27194
+ refreshService: ManagedCredentialRefreshBindingValidator.optional(),
27195
+ jwe: JWEValidator
27196
+ }).strict();
27197
+ var SendHolderEncryptedRefreshableInputValidator = external_exports.object({
27198
+ handoff: HolderEncryptedHandoffValidator,
27199
+ idempotencyKey: external_exports.string().min(1).optional(),
27200
+ boostUri: external_exports.string().optional(),
27201
+ skipNotification: external_exports.boolean().optional()
27202
+ });
27203
+ var GetEncryptionRecipientsInputValidator = external_exports.object({ refreshId: external_exports.string().min(1) });
27204
+ var EncryptionRecipientsResultValidator = external_exports.object({
27205
+ recipientKeyIds: external_exports.array(external_exports.string())
27206
+ });
27148
27207
  var InboxCredentialRefreshReceiptValidator = ManagedCredentialRefreshReceiptValidator.omit(
27149
27208
  { holderDid: true }
27150
27209
  ).extend({ holderDid: external_exports.string().min(1).optional() });
27151
27210
  var CredentialRefreshSigningModeValidator = external_exports.enum(["issuer-signed", "signing-authority"]);
27211
+ var CredentialRefreshUpdateReasonValidator = external_exports.enum(["corrected", "updated", "reissued"]);
27152
27212
  var PublishCredentialRefreshBaseFields = {
27153
27213
  refreshId: external_exports.string().min(1),
27154
27214
  notifyHolder: external_exports.boolean().optional(),
27155
- updateSummary: external_exports.string().optional(),
27215
+ updateSummary: external_exports.string().max(280).optional().describe(
27216
+ "Public legacy update summary. Do not include private claims; prefer updateReason."
27217
+ ),
27218
+ updateReason: CredentialRefreshUpdateReasonValidator.optional().describe(
27219
+ "Public reason for this update"
27220
+ ),
27156
27221
  idempotencyKey: external_exports.string().optional()
27157
27222
  };
27158
27223
  var PublishIssuerSignedRefreshValidator = external_exports.object({
@@ -27228,13 +27293,25 @@ var PublishCredentialRefreshResultValidator = external_exports.object({
27228
27293
  publishedAt: external_exports.string().min(1),
27229
27294
  notification: PublishCredentialRefreshNotificationValidator
27230
27295
  });
27296
+ var PublishHolderEncryptedRefreshInputValidator = external_exports.object({
27297
+ handoff: HolderEncryptedHandoffValidator,
27298
+ notify: external_exports.boolean(),
27299
+ updateSummary: external_exports.string().max(280).optional().describe(
27300
+ "Public legacy update summary. Do not include private claims; prefer updateReason."
27301
+ ),
27302
+ updateReason: CredentialRefreshUpdateReasonValidator.optional().describe(
27303
+ "Public reason for this update"
27304
+ ),
27305
+ idempotencyKey: external_exports.string().optional()
27306
+ });
27231
27307
  var CredentialRefreshVersionMetadataValidator = external_exports.object({
27232
27308
  version: external_exports.number().int().positive(),
27233
27309
  publishedAt: external_exports.string().min(1),
27234
27310
  effectiveAt: external_exports.string().optional(),
27235
27311
  etag: external_exports.string().optional(),
27236
27312
  signingMode: CredentialRefreshSigningModeValidator.optional(),
27237
- updateSummary: external_exports.string().optional()
27313
+ updateSummary: external_exports.string().optional(),
27314
+ updateReason: CredentialRefreshUpdateReasonValidator.optional()
27238
27315
  });
27239
27316
  var GetCredentialRefreshHistoryInputValidator = external_exports.object({
27240
27317
  refreshId: external_exports.string().min(1),
@@ -27277,6 +27354,7 @@ var CredentialRefreshFailureCodeValidator = external_exports.enum([
27277
27354
  "INVALID_PROOF",
27278
27355
  "ISSUER_MISMATCH",
27279
27356
  "ID_MISMATCH",
27357
+ "BINDING_MISMATCH",
27280
27358
  "ROLLBACK",
27281
27359
  "REVOKED",
27282
27360
  "UNSAFE_ENDPOINT"
@@ -27601,6 +27679,11 @@ var AutoBoostConfigValidator = external_exports.object({
27601
27679
  name: external_exports.string()
27602
27680
  })
27603
27681
  });
27682
+ var CredentialDisplayValidator = external_exports.object({
27683
+ name: external_exports.string().trim().min(1).max(280).optional(),
27684
+ category: external_exports.string().max(280).optional(),
27685
+ image: external_exports.string().max(2048).url().refine((url2) => url2.startsWith("https://"), { message: "Image URL must use https" }).optional()
27686
+ });
27604
27687
  var SendBoostTemplateValidator = BoostValidator.partial().omit({ uri: true, claimPermissions: true }).extend({
27605
27688
  credential: VCValidator.or(UnsignedVCValidator),
27606
27689
  claimPermissions: BoostPermissionsValidator.partial().optional(),
@@ -27639,6 +27722,10 @@ var SendBoostInputValidator = external_exports.object({
27639
27722
  templateUri: external_exports.string().optional(),
27640
27723
  template: SendBoostTemplateValidator.optional(),
27641
27724
  signedCredential: VCValidator.optional(),
27725
+ display: CredentialDisplayValidator.optional().describe(
27726
+ "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."
27727
+ ),
27728
+ statusPurposes: external_exports.array(BitstringStatusPurposeValidator).optional(),
27642
27729
  options: SendOptionsValidator.optional().describe(
27643
27730
  "Options for email/phone recipients (Universal Inbox)"
27644
27731
  ),
@@ -27677,7 +27764,10 @@ var SendInboxResponseValidator = external_exports.object({
27677
27764
  "Present when guardianEmail was specified"
27678
27765
  )
27679
27766
  });
27767
+ var StatusManagementValidator = external_exports.enum(["network", "external", "mixed", "none"]);
27680
27768
  var SendBoostResponseValidator = external_exports.object({
27769
+ /** Public status providers for a managed send; external entries require provider-side updates. */
27770
+ statusManagement: StatusManagementValidator.optional(),
27681
27771
  type: external_exports.literal("boost"),
27682
27772
  credentialUri: external_exports.string(),
27683
27773
  uri: external_exports.string(),
@@ -27690,19 +27780,33 @@ var SendBoostResponseValidator = external_exports.object({
27690
27780
  )
27691
27781
  });
27692
27782
  var PrepareRefreshableSendInputValidator = external_exports.object({
27783
+ /** Opt in to signing the server-bound statusEntries; omission preserves client allocation. */
27784
+ statusBinding: external_exports.literal("server").optional(),
27785
+ statusPurposes: external_exports.array(BitstringStatusPurposeValidator).optional(),
27693
27786
  recipient: external_exports.string(),
27694
27787
  templateUri: external_exports.string().optional(),
27695
27788
  template: SendBoostTemplateValidator.optional(),
27789
+ display: CredentialDisplayValidator.optional().describe("Public display metadata only"),
27696
27790
  contractUri: external_exports.string().optional(),
27697
27791
  templateData: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
27698
27792
  integrationId: external_exports.string().optional(),
27699
27793
  /** Credential ID to allocate for; generated server-side when omitted. */
27700
27794
  credentialId: external_exports.string().min(1).optional(),
27701
- idempotencyKey: external_exports.string().min(1).max(200).optional()
27702
- }).refine((data) => Boolean(data.templateUri) !== Boolean(data.template), {
27703
- message: "Provide exactly one of templateUri or template."
27795
+ idempotencyKey: external_exports.string().min(1).max(200).optional(),
27796
+ /**
27797
+ * `'holder'` requests student-only encryption (LC-2345): the SDK signs and
27798
+ * encrypts locally and the server never receives plaintext. Requires a
27799
+ * profile or DID recipient; rejected for signedCredential-only sends and for
27800
+ * inbox (email/phone) recipients. Defaults to `'network'`.
27801
+ */
27802
+ encryption: external_exports.enum(["network", "holder"]).optional()
27803
+ }).refine((data) => !(data.templateUri && data.template), {
27804
+ message: "Provide at most one of templateUri or template."
27704
27805
  });
27705
27806
  var PrepareRefreshableSendResultValidator = external_exports.object({
27807
+ /** Public status providers known at preparation; final send reports the signed entries. */
27808
+ statusManagement: StatusManagementValidator.optional(),
27809
+ statusEntries: external_exports.array(BitstringStatusListEntryValidator).optional(),
27706
27810
  boostUri: external_exports.string(),
27707
27811
  credentialId: external_exports.string(),
27708
27812
  refreshId: external_exports.string(),
@@ -27710,11 +27814,110 @@ var PrepareRefreshableSendResultValidator = external_exports.object({
27710
27814
  /** The DID to use as credentialSubject.id (recipient DID, or the profile's did:web). */
27711
27815
  holderDid: external_exports.string(),
27712
27816
  /** Present when this idempotencyKey already completed: return it without signing. */
27713
- completed: SendBoostResponseValidator.optional()
27817
+ completed: SendBoostResponseValidator.optional(),
27818
+ /**
27819
+ * Present only when `encryption: 'holder'` was requested: the exact
27820
+ * key-agreement verification-method ids (holder + current managers) the SDK
27821
+ * must encrypt to. Recomputed on every call, so a later manager change can
27822
+ * make a previously-prepared set stale (see `credentialRefresh.sendHolderEncryptedRefreshable`
27823
+ * and `credentialRefresh.getEncryptionRecipients`).
27824
+ */
27825
+ recipientKeyIds: external_exports.array(external_exports.string()).optional()
27714
27826
  });
27715
27827
  var SendInputValidator = external_exports.discriminatedUnion("type", [SendBoostInputValidator]);
27716
27828
  var SendResponseValidator = external_exports.discriminatedUnion("type", [SendBoostResponseValidator]);
27717
- var ConsentFlowTermsStatusValidator = external_exports.enum(["live", "stale", "withdrawn"]);
27829
+ var ConsentFlowTermsStatusValidator = external_exports.enum([
27830
+ "live",
27831
+ "consumed",
27832
+ "withdrawn",
27833
+ "needs_reconsent",
27834
+ "suspended"
27835
+ ]);
27836
+ var ConsentFlowContractChangeKindValidator = external_exports.enum([
27837
+ "relaxed",
27838
+ "expanded_optional",
27839
+ "requires_consent"
27840
+ ]);
27841
+ var ConsentFlowContractScopeValidator = external_exports.object({
27842
+ area: external_exports.enum(["read", "write"]),
27843
+ type: external_exports.enum(["credential", "personal"]),
27844
+ key: external_exports.string(),
27845
+ required: external_exports.boolean(),
27846
+ reason: external_exports.string().optional()
27847
+ });
27848
+ var ConsentFlowContractDetailValueValidator = external_exports.union([
27849
+ external_exports.string(),
27850
+ external_exports.boolean(),
27851
+ external_exports.string().array()
27852
+ ]);
27853
+ var ConsentFlowContractDetailChangeValidator = external_exports.object({
27854
+ field: external_exports.enum([
27855
+ "name",
27856
+ "subtitle",
27857
+ "description",
27858
+ "reasonForAccessing",
27859
+ "image",
27860
+ "needsGuardianConsent",
27861
+ "redirectUrl",
27862
+ "frontDoorBoostUri",
27863
+ "expiresAt",
27864
+ "writers",
27865
+ "autoboosts"
27866
+ ]),
27867
+ before: ConsentFlowContractDetailValueValidator.optional(),
27868
+ after: ConsentFlowContractDetailValueValidator.optional()
27869
+ });
27870
+ var ConsentFlowContractDiffValidator = external_exports.object({
27871
+ added: ConsentFlowContractScopeValidator.array(),
27872
+ removed: ConsentFlowContractScopeValidator.array(),
27873
+ changed: ConsentFlowContractScopeValidator.array(),
27874
+ details: ConsentFlowContractDetailChangeValidator.array().optional()
27875
+ });
27876
+ var ConsentFlowContractUpdatePreviewValidator = external_exports.object({
27877
+ headline: external_exports.string(),
27878
+ subhead: external_exports.string(),
27879
+ rows: external_exports.array(
27880
+ external_exports.object({
27881
+ scope: ConsentFlowContractScopeValidator,
27882
+ change: external_exports.enum(["added", "removed", "changed"]),
27883
+ label: external_exports.string(),
27884
+ subtitle: external_exports.string()
27885
+ })
27886
+ ),
27887
+ primaryLabel: external_exports.string()
27888
+ });
27889
+ var ConsentFlowContractStatusValidator = external_exports.enum(["active", "retired"]);
27890
+ var ConsentFlowContractVersionValidator = external_exports.object({
27891
+ version: external_exports.number().int().positive(),
27892
+ createdAt: external_exports.string(),
27893
+ reason: external_exports.string().optional(),
27894
+ kind: ConsentFlowContractChangeKindValidator.optional()
27895
+ });
27896
+ var ConsentFlowContractUpdateResultValidator = external_exports.object({
27897
+ version: external_exports.number().int().positive(),
27898
+ kind: ConsentFlowContractChangeKindValidator,
27899
+ affectedUsers: external_exports.number().int().nonnegative(),
27900
+ preview: ConsentFlowContractUpdatePreviewValidator
27901
+ });
27902
+ var ConsentFlowConsentStatusValidator = external_exports.object({
27903
+ status: ConsentFlowTermsStatusValidator.or(external_exports.literal("not_consented")),
27904
+ consentedVersion: external_exports.number().int().positive().optional(),
27905
+ currentVersion: external_exports.number().int().positive(),
27906
+ needsReconsent: external_exports.boolean(),
27907
+ reviewUrl: external_exports.string().optional()
27908
+ });
27909
+ var ConsentFlowContractNotificationDataValidator = external_exports.object({
27910
+ contractUri: external_exports.string(),
27911
+ contractName: external_exports.string().optional(),
27912
+ fromVersion: external_exports.number().int().positive(),
27913
+ toVersion: external_exports.number().int().positive(),
27914
+ kind: ConsentFlowContractChangeKindValidator,
27915
+ reason: external_exports.string().optional(),
27916
+ diff: ConsentFlowContractDiffValidator,
27917
+ reconsentDeadline: external_exports.string().optional(),
27918
+ reviewUrl: external_exports.string(),
27919
+ preview: ConsentFlowContractUpdatePreviewValidator.optional()
27920
+ });
27718
27921
  var ConsentFlowContractValidator = external_exports.object({
27719
27922
  read: external_exports.object({
27720
27923
  anonymize: external_exports.boolean().optional(),
@@ -27723,13 +27926,18 @@ var ConsentFlowContractValidator = external_exports.object({
27723
27926
  external_exports.string(),
27724
27927
  external_exports.object({
27725
27928
  required: external_exports.boolean(),
27726
- defaultEnabled: external_exports.boolean().optional()
27929
+ defaultEnabled: external_exports.boolean().optional(),
27930
+ reason: external_exports.string().optional()
27727
27931
  })
27728
27932
  ).default({})
27729
27933
  }).prefault({ categories: {} }),
27730
27934
  personal: external_exports.record(
27731
27935
  external_exports.string(),
27732
- external_exports.object({ required: external_exports.boolean(), defaultEnabled: external_exports.boolean().optional() })
27936
+ external_exports.object({
27937
+ required: external_exports.boolean(),
27938
+ defaultEnabled: external_exports.boolean().optional(),
27939
+ reason: external_exports.string().optional()
27940
+ })
27733
27941
  ).default({})
27734
27942
  }).prefault({ credentials: { categories: {} }, personal: {} }),
27735
27943
  write: external_exports.object({
@@ -27738,16 +27946,55 @@ var ConsentFlowContractValidator = external_exports.object({
27738
27946
  external_exports.string(),
27739
27947
  external_exports.object({
27740
27948
  required: external_exports.boolean(),
27741
- defaultEnabled: external_exports.boolean().optional()
27949
+ defaultEnabled: external_exports.boolean().optional(),
27950
+ reason: external_exports.string().optional()
27742
27951
  })
27743
27952
  ).default({})
27744
27953
  }).prefault({ categories: {} }),
27745
27954
  personal: external_exports.record(
27746
27955
  external_exports.string(),
27747
- external_exports.object({ required: external_exports.boolean(), defaultEnabled: external_exports.boolean().optional() })
27956
+ external_exports.object({
27957
+ required: external_exports.boolean(),
27958
+ defaultEnabled: external_exports.boolean().optional(),
27959
+ reason: external_exports.string().optional()
27960
+ })
27748
27961
  ).default({})
27749
27962
  }).prefault({ credentials: { categories: {} }, personal: {} })
27750
27963
  });
27964
+ var ConsentFlowContractScopePatchValidator = external_exports.object({
27965
+ required: external_exports.boolean(),
27966
+ defaultEnabled: external_exports.boolean().optional(),
27967
+ reason: external_exports.string().optional()
27968
+ }).nullable();
27969
+ var ConsentFlowContractChangesValidator = external_exports.object({
27970
+ contract: external_exports.object({
27971
+ read: external_exports.object({
27972
+ anonymize: external_exports.boolean().optional(),
27973
+ credentials: external_exports.object({
27974
+ categories: external_exports.record(external_exports.string(), ConsentFlowContractScopePatchValidator).optional()
27975
+ }).optional(),
27976
+ personal: external_exports.record(external_exports.string(), ConsentFlowContractScopePatchValidator).optional()
27977
+ }).optional(),
27978
+ write: external_exports.object({
27979
+ credentials: external_exports.object({
27980
+ categories: external_exports.record(external_exports.string(), ConsentFlowContractScopePatchValidator).optional()
27981
+ }).optional(),
27982
+ personal: external_exports.record(external_exports.string(), ConsentFlowContractScopePatchValidator).optional()
27983
+ }).optional()
27984
+ }).optional(),
27985
+ name: external_exports.string().optional(),
27986
+ subtitle: external_exports.string().optional(),
27987
+ description: external_exports.string().optional(),
27988
+ reasonForAccessing: external_exports.string().optional(),
27989
+ image: external_exports.string().optional(),
27990
+ needsGuardianConsent: external_exports.boolean().optional(),
27991
+ redirectUrl: external_exports.string().optional(),
27992
+ frontDoorBoostUri: external_exports.string().optional(),
27993
+ expiresAt: external_exports.string().nullable().optional(),
27994
+ autoboosts: AutoBoostConfigValidator.array().optional(),
27995
+ writers: external_exports.string().array().optional(),
27996
+ recipients: external_exports.string().array().optional()
27997
+ });
27751
27998
  var ConsentFlowContractDetailsValidator = external_exports.object({
27752
27999
  contract: ConsentFlowContractValidator,
27753
28000
  owner: LCNProfileValidator,
@@ -27766,7 +28013,19 @@ var ConsentFlowContractDetailsValidator = external_exports.object({
27766
28013
  autoBoosts: external_exports.string().array().optional(),
27767
28014
  writers: external_exports.array(LCNProfileValidator).optional(),
27768
28015
  recipients: external_exports.array(LCNPublicProfileValidator.extend({ did: external_exports.string() })).optional(),
27769
- audienceVersion: external_exports.number().int().nonnegative().optional()
28016
+ audienceVersion: external_exports.number().int().nonnegative().optional(),
28017
+ version: external_exports.number().int().positive(),
28018
+ status: ConsentFlowContractStatusValidator.optional(),
28019
+ latestUpdate: external_exports.object({
28020
+ fromVersion: external_exports.number().int().positive(),
28021
+ toVersion: external_exports.number().int().positive(),
28022
+ kind: ConsentFlowContractChangeKindValidator,
28023
+ reason: external_exports.string().optional(),
28024
+ diff: ConsentFlowContractDiffValidator,
28025
+ reconsentDeadline: external_exports.string().optional(),
28026
+ createdAt: external_exports.string(),
28027
+ preview: ConsentFlowContractUpdatePreviewValidator
28028
+ }).optional()
27770
28029
  });
27771
28030
  var ConsentFlowContractRequestStatusValidator = external_exports.enum(["pending", "accepted", "denied", "cancelled"]).nullable();
27772
28031
  var ConsentFlowContractRequestReadStatusValidator = external_exports.enum(["unseen", "seen"]).nullable();
@@ -27855,7 +28114,12 @@ var PaginatedConsentFlowTermsValidator = PaginationResponseValidator.extend({
27855
28114
  contract: ConsentFlowContractDetailsValidator,
27856
28115
  uri: external_exports.string(),
27857
28116
  consenter: LCNProfileValidator,
27858
- status: ConsentFlowTermsStatusValidator
28117
+ status: ConsentFlowTermsStatusValidator,
28118
+ consentedVersion: external_exports.number().int().positive(),
28119
+ lastReviewedVersion: external_exports.number().int().positive().optional(),
28120
+ reconsentDeadline: external_exports.string().optional(),
28121
+ newOptionsUntil: external_exports.string().optional(),
28122
+ cumulativeUpdate: ConsentFlowContractDetailsValidator.shape.latestUpdate
27859
28123
  }).array()
27860
28124
  });
27861
28125
  var ConsentFlowGuardianApprovalValidator = external_exports.object({
@@ -27931,7 +28195,8 @@ var ConsentFlowTransactionActionValidator = external_exports.enum([
27931
28195
  "update",
27932
28196
  "sync",
27933
28197
  "withdraw",
27934
- "write"
28198
+ "write",
28199
+ "reconsent"
27935
28200
  ]);
27936
28201
  var ConsentFlowTransactionsQueryValidator = external_exports.object({
27937
28202
  terms: ConsentFlowTermsQueryValidator.optional(),
@@ -27950,8 +28215,12 @@ var ConsentFlowTransactionValidator = external_exports.object({
27950
28215
  referral: ConsentFlowReferralValidator.optional(),
27951
28216
  id: external_exports.string(),
27952
28217
  action: ConsentFlowTransactionActionValidator,
28218
+ kind: ConsentFlowContractChangeKindValidator.optional(),
27953
28219
  date: external_exports.string(),
27954
- uris: external_exports.string().array().optional()
28220
+ uris: external_exports.string().array().optional(),
28221
+ consentedVersion: external_exports.number().int().positive().optional(),
28222
+ reconsentDeadline: external_exports.string().optional(),
28223
+ newOptionsUntil: external_exports.string().optional()
27955
28224
  });
27956
28225
  var HolderExportConsentRecordValidator = external_exports.object({
27957
28226
  termsUri: external_exports.string(),
@@ -27959,6 +28228,10 @@ var HolderExportConsentRecordValidator = external_exports.object({
27959
28228
  contract: ConsentFlowContractDetailsValidator,
27960
28229
  terms: ConsentFlowTermsValidator,
27961
28230
  referral: ConsentFlowReferralValidator.optional(),
28231
+ consentedVersion: external_exports.number().int().positive(),
28232
+ reconsentDeadline: external_exports.string().optional(),
28233
+ newOptionsUntil: external_exports.string().optional(),
28234
+ cumulativeUpdate: ConsentFlowContractDetailsValidator.shape.latestUpdate,
27962
28235
  transactions: ConsentFlowTransactionValidator.array()
27963
28236
  });
27964
28237
  var HolderExportMetadataValidator = external_exports.object({
@@ -28019,10 +28292,12 @@ var LCNNotificationTypeEnumValidator = external_exports.enum([
28019
28292
  "GUARDIAN_APPROVED",
28020
28293
  "GUARDIAN_REJECTED",
28021
28294
  "APP_NOTIFICATION",
28295
+ "ANNOUNCEMENT",
28022
28296
  "CREDENTIAL_REVOKED",
28023
28297
  "CREDENTIAL_SUSPENDED",
28024
28298
  "CREDENTIAL_UNSUSPENDED",
28025
- "CREDENTIAL_REFRESHED"
28299
+ "CREDENTIAL_REFRESHED",
28300
+ "CONSENT_FLOW_CONTRACT_UPDATED"
28026
28301
  ]);
28027
28302
  var LCNNotificationMessageValidator = external_exports.object({
28028
28303
  title: external_exports.string().optional(),
@@ -28051,12 +28326,26 @@ var LCNNotificationInboxValidator = external_exports.object({
28051
28326
  timestamp: external_exports.iso.datetime().optional()
28052
28327
  });
28053
28328
  var LCNNotificationMetadataValidator = external_exports.object({
28054
- connectionPrompt: LCNConnectionPromptMetadataValidator.optional()
28329
+ connectionPrompt: LCNConnectionPromptMetadataValidator.optional(),
28330
+ campaignId: external_exports.string().regex(/^[a-z0-9-]{3,64}$/).optional(),
28331
+ campaignCreatedAt: external_exports.iso.datetime().optional(),
28332
+ campaignHasInApp: external_exports.boolean().optional(),
28333
+ campaignTestId: external_exports.uuid().optional()
28055
28334
  }).catchall(external_exports.unknown());
28056
28335
  var LCNNotificationDataValidator = external_exports.object({
28057
28336
  vcUris: external_exports.array(external_exports.string()).optional(),
28058
28337
  vpUris: external_exports.array(external_exports.string()).optional(),
28059
28338
  transaction: ConsentFlowTransactionValidator.optional(),
28339
+ contractUri: external_exports.string().optional(),
28340
+ contractName: external_exports.string().optional(),
28341
+ fromVersion: external_exports.number().int().positive().optional(),
28342
+ toVersion: external_exports.number().int().positive().optional(),
28343
+ kind: ConsentFlowContractChangeKindValidator.optional(),
28344
+ reason: external_exports.string().optional(),
28345
+ diff: ConsentFlowContractDiffValidator.optional(),
28346
+ reconsentDeadline: external_exports.string().optional(),
28347
+ reviewUrl: external_exports.string().optional(),
28348
+ preview: ConsentFlowContractUpdatePreviewValidator.optional(),
28060
28349
  inbox: LCNNotificationInboxValidator.optional(),
28061
28350
  metadata: LCNNotificationMetadataValidator.optional()
28062
28351
  }).loose();
@@ -29154,28 +29443,6 @@ var EscrowPinStatusValidator = external_exports.object({
29154
29443
  */
29155
29444
  wrongAttempts: external_exports.number().int().nonnegative().optional()
29156
29445
  });
29157
- var BITSTRING_STATUS_PURPOSES = ["revocation", "suspension"];
29158
- var BitstringStatusPurposeValidator = external_exports.enum(BITSTRING_STATUS_PURPOSES);
29159
- var BitstringStatusListEntryValidator = external_exports.object({
29160
- id: external_exports.string().optional(),
29161
- type: external_exports.literal("BitstringStatusListEntry"),
29162
- statusPurpose: BitstringStatusPurposeValidator,
29163
- statusListIndex: external_exports.string().or(external_exports.number().int().nonnegative()),
29164
- statusListCredential: external_exports.string()
29165
- });
29166
- var AllocatedBitstringStatusListEntryValidator = BitstringStatusListEntryValidator.extend({
29167
- id: external_exports.string()
29168
- });
29169
- var BitstringStatusListCredentialSubjectValidator = external_exports.object({
29170
- id: external_exports.string().optional(),
29171
- type: external_exports.literal("BitstringStatusList"),
29172
- statusPurpose: BitstringStatusPurposeValidator,
29173
- encodedList: external_exports.string()
29174
- });
29175
- var AllocateCredentialStatusInputValidator = external_exports.object({
29176
- statusPurposes: external_exports.array(BitstringStatusPurposeValidator).optional(),
29177
- listSize: external_exports.number().int().positive().optional()
29178
- }).default({});
29179
29446
  var isSafeInAppMessagePath = /* @__PURE__ */ __name2((path) => {
29180
29447
  let decoded = path;
29181
29448
  for (let depth = 0; depth < 5; depth += 1) {
@@ -29456,24 +29723,46 @@ var inAppMessagesFlagEnvelopeValidator = external_exports.object({
29456
29723
  }).passthrough();
29457
29724
  var CampaignIdValidator = external_exports.string().regex(/^[a-z0-9-]{3,64}$/);
29458
29725
  var CampaignStatusValidator = external_exports.enum(["draft", "live", "paused", "archived"]);
29459
- var CampaignChannelValidator = external_exports.enum(["inApp", "notify"]);
29726
+ var CampaignChannelValidator = external_exports.enum(["inApp", "notify", "email"]);
29460
29727
  var CampaignEventValidator = external_exports.enum(["shown", "clicked", "dismissed", "converted"]);
29461
- var timestamp = external_exports.iso.datetime({ offset: true }).overwrite((value) => new Date(value).toISOString());
29728
+ var timestamp = external_exports.iso.datetime({ offset: true }).overwrite((value) => {
29729
+ const date5 = new Date(value);
29730
+ return Number.isFinite(date5.getTime()) ? date5.toISOString() : value;
29731
+ });
29462
29732
  var notification = external_exports.object({ title: external_exports.string().min(1), body: external_exports.string().min(1) }).strict();
29463
- var channels = external_exports.array(CampaignChannelValidator).min(1).max(2).refine((values) => new Set(values).size === values.length, "Channels must be unique");
29733
+ var CampaignEmailValidator = external_exports.object({
29734
+ subject: external_exports.string().trim().min(1).max(200).regex(/^[^\r\n]+$/),
29735
+ title: external_exports.string().trim().min(1).max(200),
29736
+ body: external_exports.string().trim().min(1).max(2e4),
29737
+ heroImageUrl: external_exports.url().startsWith("https://").max(2048).optional(),
29738
+ ctaLabel: external_exports.string().trim().min(1).max(100)
29739
+ }).strict();
29740
+ var AnnouncementPreferencesValidator = external_exports.object({
29741
+ announcementEmailOptOut: external_exports.boolean(),
29742
+ announcementPushOptOut: external_exports.boolean()
29743
+ }).strict();
29744
+ var channels = external_exports.array(CampaignChannelValidator).min(1).max(3).refine((values) => new Set(values).size === values.length, "Channels must be unique");
29464
29745
  var campaignDefinition = external_exports.object({
29465
29746
  id: CampaignIdValidator,
29466
29747
  name: external_exports.string().trim().min(1).max(200),
29467
29748
  status: CampaignStatusValidator.default("draft"),
29468
29749
  channels,
29469
- message: inAppMessageValidator,
29750
+ message: inAppMessageValidator.optional(),
29470
29751
  notification: notification.optional(),
29752
+ email: CampaignEmailValidator.optional(),
29471
29753
  startsAt: timestamp.optional(),
29472
29754
  endsAt: timestamp.optional(),
29473
29755
  excludeMinors: external_exports.boolean().default(true),
29474
29756
  selfEnroll: external_exports.boolean().default(false)
29475
29757
  }).strict();
29476
29758
  var validDefinition = /* @__PURE__ */ __name2((value, ctx) => {
29759
+ if (value.channels.includes("inApp") && !value.message) {
29760
+ ctx.addIssue({
29761
+ code: "custom",
29762
+ path: ["message"],
29763
+ message: "In-app requires a message"
29764
+ });
29765
+ }
29477
29766
  if (value.channels.includes("notify") && !value.notification) {
29478
29767
  ctx.addIssue({
29479
29768
  code: "custom",
@@ -29481,15 +29770,23 @@ var validDefinition = /* @__PURE__ */ __name2((value, ctx) => {
29481
29770
  message: "Notify requires a title and body"
29482
29771
  });
29483
29772
  }
29773
+ if (value.channels.includes("email") && !value.email) {
29774
+ ctx.addIssue({
29775
+ code: "custom",
29776
+ path: ["email"],
29777
+ message: "Email requires announcement content"
29778
+ });
29779
+ }
29484
29780
  if (value.startsAt && value.endsAt && value.startsAt >= value.endsAt) {
29485
29781
  ctx.addIssue({ code: "custom", path: ["endsAt"], message: "End must be after start" });
29486
29782
  }
29487
29783
  }, "validDefinition");
29488
29784
  var CampaignValidator = campaignDefinition.extend({
29785
+ tenantId: external_exports.string().optional(),
29489
29786
  createdAt: timestamp,
29490
29787
  updatedAt: timestamp
29491
29788
  }).superRefine(validDefinition).superRefine((value, ctx) => {
29492
- if (value.message.id !== value.id) {
29789
+ if (value.message && value.message.id !== value.id) {
29493
29790
  ctx.addIssue({
29494
29791
  code: "custom",
29495
29792
  path: ["message", "id"],
@@ -29498,21 +29795,23 @@ var CampaignValidator = campaignDefinition.extend({
29498
29795
  }
29499
29796
  });
29500
29797
  var CreateCampaignInputValidator = campaignDefinition.extend({
29501
- message: inAppMessageAuthoringValidator
29798
+ message: inAppMessageAuthoringValidator.optional()
29502
29799
  }).superRefine(validDefinition);
29503
29800
  var CampaignUpdatesValidator = campaignDefinition.omit({ id: true }).partial().extend({
29504
29801
  // A PATCH must not apply creation defaults to fields the caller omitted.
29505
29802
  status: CampaignStatusValidator.optional(),
29506
29803
  excludeMinors: external_exports.boolean().optional(),
29507
29804
  selfEnroll: external_exports.boolean().optional(),
29508
- message: inAppMessageAuthoringValidator.optional(),
29805
+ message: inAppMessageAuthoringValidator.nullable().optional(),
29509
29806
  notification: notification.nullable().optional(),
29807
+ email: CampaignEmailValidator.nullable().optional(),
29510
29808
  startsAt: timestamp.nullable().optional(),
29511
29809
  endsAt: timestamp.nullable().optional()
29512
29810
  }).strict();
29513
29811
  var UpdateCampaignInputValidator = external_exports.object({
29514
29812
  campaignId: CampaignIdValidator,
29515
- updates: CampaignUpdatesValidator
29813
+ updates: CampaignUpdatesValidator,
29814
+ expectedUpdatedAt: timestamp.optional()
29516
29815
  }).strict();
29517
29816
  var identifier = external_exports.string().trim().min(1).max(2048);
29518
29817
  var metadataKey = external_exports.string().regex(/^[a-zA-Z_][a-zA-Z0-9_.-]{0,63}$/).refine(
@@ -29564,7 +29863,8 @@ var CampaignUserStateValidator = external_exports.object({
29564
29863
  clickedAt: timestamp.optional(),
29565
29864
  dismissedAt: timestamp.optional(),
29566
29865
  convertedAt: timestamp.optional(),
29567
- notifiedAt: timestamp.optional()
29866
+ notifiedAt: timestamp.optional(),
29867
+ emailedAt: timestamp.optional()
29568
29868
  });
29569
29869
  var MyCampaignValidator = external_exports.object({
29570
29870
  campaign: campaignDefinition.pick({
@@ -29573,12 +29873,19 @@ var MyCampaignValidator = external_exports.object({
29573
29873
  startsAt: true,
29574
29874
  endsAt: true,
29575
29875
  selfEnroll: true
29576
- }),
29577
- state: CampaignUserStateValidator
29876
+ }).extend({ message: inAppMessageValidator }),
29877
+ state: CampaignUserStateValidator,
29878
+ testId: external_exports.uuid().optional()
29879
+ });
29880
+ var CampaignTestValidator = external_exports.object({
29881
+ id: external_exports.uuid(),
29882
+ campaignId: CampaignIdValidator,
29883
+ message: inAppMessageValidator
29578
29884
  });
29579
29885
  var CampaignStatsValidator = external_exports.object({
29580
29886
  audience: external_exports.number().int().nonnegative(),
29581
29887
  notified: external_exports.number().int().nonnegative(),
29888
+ emailed: external_exports.number().int().nonnegative(),
29582
29889
  shown: external_exports.number().int().nonnegative(),
29583
29890
  clicked: external_exports.number().int().nonnegative(),
29584
29891
  dismissed: external_exports.number().int().nonnegative(),
@@ -29605,6 +29912,31 @@ var PaginatedCampaignAudienceValidator = external_exports.object({
29605
29912
  hasMore: external_exports.boolean(),
29606
29913
  cursor: external_exports.string().optional()
29607
29914
  });
29915
+ var CampaignDispatchPreviewValidator = external_exports.object({
29916
+ campaignId: CampaignIdValidator,
29917
+ audienceCount: external_exports.number().int().nonnegative(),
29918
+ alreadyNotifiedCount: external_exports.number().int().nonnegative(),
29919
+ recipientCount: external_exports.number().int().nonnegative(),
29920
+ notificationRecipientCount: external_exports.number().int().nonnegative().optional(),
29921
+ emailRecipientCount: external_exports.number().int().nonnegative().optional(),
29922
+ previewToken: external_exports.string().regex(/^[a-f0-9]{64}$/),
29923
+ blockedReason: external_exports.enum([
29924
+ "not_live",
29925
+ "notify_disabled",
29926
+ "email_confirmation_required",
29927
+ "not_started",
29928
+ "ended",
29929
+ "no_recipients"
29930
+ ]).optional()
29931
+ });
29932
+ var CampaignDispatchOptionsValidator = external_exports.object({
29933
+ expectedPreviewToken: CampaignDispatchPreviewValidator.shape.previewToken.optional()
29934
+ }).strict();
29935
+ var CampaignAudienceResultValidator = external_exports.object({
29936
+ count: external_exports.number().int().nonnegative(),
29937
+ added: external_exports.number().int().nonnegative(),
29938
+ notFound: external_exports.array(external_exports.string())
29939
+ });
29608
29940
  var SHARE_LINK_ID_BYTES = 16;
29609
29941
  var SHARE_CONTENT_KEY_BYTES = 32;
29610
29942
  var SHARE_IV_BYTES = 12;
@@ -30128,6 +30460,217 @@ var SkillIconNamesValidator = external_exports.array(external_exports.string().n
30128
30460
  }
30129
30461
  );
30130
30462
  var GenerateSkillIconsInputValidator = external_exports.object({ names: SkillIconNamesValidator });
30463
+ var RoleValidator = external_exports.enum(["user", "assistant", "tool", "system"]);
30464
+ var AiSessionMode = {
30465
+ tutor: "ai-tutor",
30466
+ insights: "ai-insights"
30467
+ };
30468
+ var AiSessionModeValidator = external_exports.enum([AiSessionMode.tutor, AiSessionMode.insights]);
30469
+ var StructuredResponseValidator = external_exports.object({
30470
+ notes: external_exports.string().optional(),
30471
+ questions: external_exports.array(external_exports.string())
30472
+ });
30473
+ var IntroStreamModeValidator = external_exports.enum(["formatted", "structured"]);
30474
+ var ChatMessageValidator = external_exports.object({
30475
+ role: RoleValidator,
30476
+ content: external_exports.string().nullable(),
30477
+ tool_call_id: external_exports.string().optional(),
30478
+ tool_calls: external_exports.array(
30479
+ external_exports.object({
30480
+ id: external_exports.string(),
30481
+ type: external_exports.literal("function"),
30482
+ function: external_exports.object({
30483
+ name: external_exports.string(),
30484
+ arguments: external_exports.string()
30485
+ })
30486
+ })
30487
+ ).optional()
30488
+ });
30489
+ var InsightArtifactValidator = external_exports.object({
30490
+ title: external_exports.string(),
30491
+ summary: external_exports.string(),
30492
+ category: external_exports.string(),
30493
+ question: external_exports.string(),
30494
+ narrative: external_exports.string()
30495
+ });
30496
+ var ArtifactSuggestionValidator = external_exports.object({
30497
+ artifact: InsightArtifactValidator,
30498
+ source_text: external_exports.string().optional(),
30499
+ created_at: external_exports.string()
30500
+ });
30501
+ var ThreadCredentialContextValidator = external_exports.object({
30502
+ uri: external_exports.string(),
30503
+ type: external_exports.string(),
30504
+ context: external_exports.string(),
30505
+ score: external_exports.number(),
30506
+ strongestScore: external_exports.number().optional(),
30507
+ averageScore: external_exports.number().optional(),
30508
+ matchCount: external_exports.number().optional(),
30509
+ title: external_exports.string().optional()
30510
+ });
30511
+ var ThreadValidator = external_exports.object({
30512
+ id: external_exports.string(),
30513
+ did: external_exports.string(),
30514
+ topicCredentialUri: external_exports.string().nullable().optional(),
30515
+ title: external_exports.string(),
30516
+ created_at: external_exports.string(),
30517
+ last_message_at: external_exports.string(),
30518
+ active: external_exports.boolean().optional(),
30519
+ ended_at: external_exports.string().optional(),
30520
+ plan_started_at: external_exports.string().optional(),
30521
+ summaries: external_exports.array(
30522
+ external_exports.object({
30523
+ summary_data: external_exports.string(),
30524
+ credential_uri: external_exports.string(),
30525
+ created_at: external_exports.string()
30526
+ })
30527
+ ).optional(),
30528
+ plans: external_exports.array(
30529
+ external_exports.object({
30530
+ plan_data: external_exports.string(),
30531
+ created_at: external_exports.string(),
30532
+ consentRevision: external_exports.string().optional()
30533
+ })
30534
+ ).optional(),
30535
+ credentials: external_exports.array(ThreadCredentialContextValidator).optional(),
30536
+ credentialSearchTopic: external_exports.string().optional(),
30537
+ credentialContextStatus: external_exports.enum(["pending", "ready", "empty", "error"]).optional(),
30538
+ mode: AiSessionModeValidator.optional(),
30539
+ artifactSuggestions: external_exports.array(ArtifactSuggestionValidator).optional()
30540
+ });
30541
+ var CredentialVerificationMetadataValidator = external_exports.object({
30542
+ credentialUri: external_exports.string(),
30543
+ contentHash: external_exports.string().regex(/^[a-f0-9]{64}$/),
30544
+ status: external_exports.enum(["valid", "invalid"]),
30545
+ checkedAt: external_exports.string().datetime(),
30546
+ verifier: external_exports.object({
30547
+ name: external_exports.string(),
30548
+ version: external_exports.string()
30549
+ }),
30550
+ verifiedPayload: external_exports.enum(["credential", "boostCredential"]),
30551
+ checks: external_exports.array(external_exports.string()),
30552
+ errors: external_exports.array(external_exports.string()),
30553
+ warnings: external_exports.array(external_exports.string()),
30554
+ provenance: external_exports.object({
30555
+ source: external_exports.enum(["wallet", "generated"]),
30556
+ retrievedAt: external_exports.string().datetime()
30557
+ }),
30558
+ consent: external_exports.object({
30559
+ contractUri: external_exports.string(),
30560
+ receiptId: external_exports.string().min(1),
30561
+ grantedAt: external_exports.string().datetime().optional(),
30562
+ updatedAt: external_exports.string().datetime(),
30563
+ contractUpdatedAt: external_exports.string().min(1),
30564
+ status: external_exports.literal("live"),
30565
+ expiresAt: external_exports.string().datetime().optional(),
30566
+ contractExpiresAt: external_exports.string().datetime().optional(),
30567
+ categories: external_exports.array(external_exports.string()),
30568
+ credentialUris: external_exports.array(external_exports.string()),
30569
+ personalFields: external_exports.array(external_exports.string()),
30570
+ purpose: external_exports.enum(["credential-ingestion", "model-inference", "embedding"]),
30571
+ revision: external_exports.string().min(1),
30572
+ guardian: external_exports.object({ required: external_exports.boolean(), approved: external_exports.boolean() })
30573
+ })
30574
+ });
30575
+ var ModelSafeCredentialFactValidator = external_exports.object({
30576
+ kind: external_exports.enum([
30577
+ "skill",
30578
+ "goal",
30579
+ "achievement",
30580
+ "course",
30581
+ "experience",
30582
+ "competency",
30583
+ "title",
30584
+ "summary",
30585
+ "assessment",
30586
+ "grade",
30587
+ "date",
30588
+ "alignment",
30589
+ "criteria",
30590
+ "pathway",
30591
+ "topic"
30592
+ ]),
30593
+ value: external_exports.string().min(1).max(240),
30594
+ label: external_exports.string().min(1).max(120).optional()
30595
+ });
30596
+ var ModelSafeCredentialProjectionValidator = external_exports.object({
30597
+ schemaVersion: external_exports.literal("1"),
30598
+ category: external_exports.string().min(1).max(120),
30599
+ credentialTypes: external_exports.array(external_exports.string().min(1).max(120)).max(20),
30600
+ facts: external_exports.array(ModelSafeCredentialFactValidator).max(100),
30601
+ // Present only on credentials that are past their expiry, so the model can
30602
+ // tell a lapsed credential from a current one.
30603
+ expired: external_exports.literal(true).optional(),
30604
+ expirationDate: external_exports.string().datetime().optional()
30605
+ });
30606
+ var AIPassportCredentialRecordValidator = external_exports.object({
30607
+ id: external_exports.string(),
30608
+ uri: external_exports.string(),
30609
+ category: external_exports.string(),
30610
+ credential: VCValidator,
30611
+ aiContext: external_exports.string(),
30612
+ generalSummary: external_exports.string().optional(),
30613
+ createdAt: external_exports.string(),
30614
+ verification: CredentialVerificationMetadataValidator.optional(),
30615
+ projection: ModelSafeCredentialProjectionValidator.optional()
30616
+ });
30617
+ var AuthenticatedMessageValidator = external_exports.object({
30618
+ message: ChatMessageValidator.optional(),
30619
+ threadId: external_exports.string().optional(),
30620
+ selectedQuestion: external_exports.string().optional(),
30621
+ action: external_exports.enum([
30622
+ "start_topic",
30623
+ "continue_plan",
30624
+ "start_topic_uri",
30625
+ "start_learning_pathway",
30626
+ "start_insights_session",
30627
+ "close_insights_session",
30628
+ "artifact_suggestion"
30629
+ ]).optional(),
30630
+ topic: external_exports.string().optional(),
30631
+ topicUri: external_exports.string().optional(),
30632
+ pathwayUri: external_exports.string().optional(),
30633
+ mode: AiSessionModeValidator.optional(),
30634
+ introStreamMode: IntroStreamModeValidator.optional(),
30635
+ // BCP-47 language for AI responses (LC-1901). This has to live on the
30636
+ // validator, not just the inferred type — z.object strips unknown keys, so an
30637
+ // undeclared `locale` would be dropped before the WS handler ever saw it.
30638
+ locale: external_exports.string().nullish()
30639
+ });
30640
+ var DebugInfoValidator = external_exports.object({
30641
+ operation: external_exports.string(),
30642
+ collection: external_exports.string(),
30643
+ input: external_exports.unknown().optional(),
30644
+ output: external_exports.unknown().optional(),
30645
+ timestamp: external_exports.string(),
30646
+ duration: external_exports.number().optional()
30647
+ });
30648
+ var TimingEventValidator = external_exports.object({
30649
+ event: external_exports.literal("timing"),
30650
+ operation: external_exports.string(),
30651
+ phase: external_exports.enum(["start", "end", "complete"]),
30652
+ duration: external_exports.number().optional(),
30653
+ metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
30654
+ timestamp: external_exports.string()
30655
+ });
30656
+ var LearningPathwayValidator = external_exports.object({
30657
+ id: external_exports.string(),
30658
+ learningPathway: external_exports.object({
30659
+ stepIndex: external_exports.number(),
30660
+ step: external_exports.object({
30661
+ title: external_exports.string(),
30662
+ description: external_exports.string(),
30663
+ summary: external_exports.string(),
30664
+ learned: external_exports.array(external_exports.string()),
30665
+ skills: external_exports.array(
30666
+ external_exports.object({
30667
+ title: external_exports.string(),
30668
+ description: external_exports.string()
30669
+ })
30670
+ )
30671
+ })
30672
+ })
30673
+ });
30131
30674
 
30132
30675
  // src/helpers.ts
30133
30676
  var import_json_stringify_deterministic = __toESM(require_lib(), 1);
@@ -30264,13 +30807,20 @@ var getLearnCloudPlugin = /* @__PURE__ */ __name(async (initialLearnCard, url2,
30264
30807
  }, "loadDids");
30265
30808
  const otherClients = /* @__PURE__ */ new Map();
30266
30809
  const learnCloudDids = /* @__PURE__ */ new WeakMap();
30267
- const getLearnCloudDid = /* @__PURE__ */ __name((currentClient) => {
30810
+ const getLearnCloudDid = /* @__PURE__ */ __name(async (currentClient) => {
30268
30811
  let learnCloudDid = learnCloudDids.get(currentClient);
30269
30812
  if (!learnCloudDid) {
30270
30813
  learnCloudDid = currentClient.utilities.getDid.query();
30271
30814
  learnCloudDids.set(currentClient, learnCloudDid);
30272
30815
  }
30273
- return learnCloudDid;
30816
+ try {
30817
+ return await learnCloudDid;
30818
+ } catch (error62) {
30819
+ if (learnCloudDids.get(currentClient) === learnCloudDid) {
30820
+ learnCloudDids.delete(currentClient);
30821
+ }
30822
+ throw error62;
30823
+ }
30274
30824
  }, "getLearnCloudDid");
30275
30825
  const getOtherClient = /* @__PURE__ */ __name(async (otherUrl, _learnCard) => {
30276
30826
  const key = `${_learnCard.id.did()}\0${otherUrl}`;
@@ -30617,6 +31167,8 @@ var getLearnCloudPlugin = /* @__PURE__ */ __name(async (initialLearnCard, url2,
30617
31167
  _learnCard.debug?.("LearnCloud index.getPaginated", query, paginationOptions);
30618
31168
  const options = {
30619
31169
  ...paginationOptions,
31170
+ // JSON-persisted infinite-query page parameters may restore as null.
31171
+ cursor: paginationOptions?.cursor ?? void 0,
30620
31172
  sort: ["newestFirst", "oldestFirst"].includes(paginationOptions?.sort ?? "") ? paginationOptions?.sort : void 0
30621
31173
  };
30622
31174
  if (!query) {