@learncard/learn-cloud-plugin 2.3.50 → 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.
@@ -27117,12 +27117,46 @@ var StringQuery = external_exports.union([
27117
27117
  $or: BaseStringQuery.array()
27118
27118
  })
27119
27119
  ]);
27120
+ var BITSTRING_STATUS_PURPOSES = ["revocation", "suspension"];
27121
+ var BitstringStatusPurposeValidator = external_exports.enum(BITSTRING_STATUS_PURPOSES);
27122
+ var BitstringStatusListEntryValidator = external_exports.object({
27123
+ id: external_exports.string().optional(),
27124
+ type: external_exports.literal("BitstringStatusListEntry"),
27125
+ statusPurpose: BitstringStatusPurposeValidator,
27126
+ statusListIndex: external_exports.string().or(external_exports.number().int().nonnegative()),
27127
+ statusListCredential: external_exports.string()
27128
+ });
27129
+ var AllocatedBitstringStatusListEntryValidator = BitstringStatusListEntryValidator.extend({
27130
+ id: external_exports.string()
27131
+ });
27132
+ var BitstringStatusListCredentialSubjectValidator = external_exports.object({
27133
+ id: external_exports.string().optional(),
27134
+ type: external_exports.literal("BitstringStatusList"),
27135
+ statusPurpose: BitstringStatusPurposeValidator,
27136
+ encodedList: external_exports.string()
27137
+ });
27138
+ var AllocateCredentialStatusInputValidator = external_exports.object({
27139
+ statusPurposes: external_exports.array(BitstringStatusPurposeValidator).optional(),
27140
+ listSize: external_exports.number().int().positive().optional()
27141
+ }).default({});
27142
+ var AttachCredentialRefreshStatusEntriesInputValidator = external_exports.object({
27143
+ refreshId: external_exports.string().min(1),
27144
+ credentialStatus: CredentialStatusValidator.or(CredentialStatusValidator.array()).nullable()
27145
+ });
27120
27146
  var LearnCardRefreshAuthorizationValidator = external_exports.object({ type: external_exports.literal("LearnCardDIDAuth") }).catchall(external_exports.any());
27121
27147
  var ManagedCredentialRefreshServiceValidator = external_exports.object({
27122
27148
  id: external_exports.string().min(1),
27123
27149
  type: external_exports.literal("LearnCardCredentialRefresh2026"),
27124
27150
  authorization: LearnCardRefreshAuthorizationValidator.optional()
27125
27151
  }).catchall(external_exports.any());
27152
+ var ManagedCredentialRefreshBindingValidator = ManagedCredentialRefreshServiceValidator.or(
27153
+ RefreshServiceValidator.array().refine(
27154
+ (services) => services.some(
27155
+ (service) => ManagedCredentialRefreshServiceValidator.safeParse(service).success
27156
+ ),
27157
+ "A managed refresh service is required"
27158
+ )
27159
+ );
27126
27160
  var StandardCredentialRefreshServiceValidator = external_exports.object({
27127
27161
  id: external_exports.string().min(1),
27128
27162
  type: external_exports.literal("1EdTechCredentialRefresh")
@@ -27146,7 +27180,9 @@ var AllocateCredentialRefreshResultValidator = external_exports.object({
27146
27180
  });
27147
27181
  var ManagedCredentialRefreshReceiptValidator = external_exports.object({
27148
27182
  refreshId: external_exports.string().min(1),
27149
- refreshService: ManagedCredentialRefreshServiceValidator,
27183
+ refreshService: ManagedCredentialRefreshBindingValidator,
27184
+ /** Legacy receipts authenticate only the allocated managed entry, not other services. */
27185
+ refreshServiceBinding: external_exports.literal("managed-entry").optional(),
27150
27186
  credentialId: external_exports.string().min(1),
27151
27187
  issuerDid: external_exports.string().min(1),
27152
27188
  holderDid: external_exports.string().min(1),
@@ -27154,14 +27190,43 @@ var ManagedCredentialRefreshReceiptValidator = external_exports.object({
27154
27190
  CredentialStatusValidator.array()
27155
27191
  ).optional()
27156
27192
  }).strip();
27193
+ var GetCredentialRefreshReceiptInputValidator = external_exports.object({ uri: external_exports.string().min(1) });
27194
+ var CredentialRefreshReceiptValidator = ManagedCredentialRefreshReceiptValidator.extend({
27195
+ encryptionMode: external_exports.enum(["network", "holder"])
27196
+ });
27197
+ var HolderEncryptedHandoffValidator = external_exports.object({
27198
+ refreshId: external_exports.string().min(1),
27199
+ credentialId: external_exports.string().min(1),
27200
+ holderDid: external_exports.string().min(1),
27201
+ issuerDid: external_exports.string().min(1),
27202
+ credentialStatus: CredentialStatusValidator.or(CredentialStatusValidator.array()),
27203
+ refreshService: ManagedCredentialRefreshBindingValidator.optional(),
27204
+ jwe: JWEValidator
27205
+ }).strict();
27206
+ var SendHolderEncryptedRefreshableInputValidator = external_exports.object({
27207
+ handoff: HolderEncryptedHandoffValidator,
27208
+ idempotencyKey: external_exports.string().min(1).optional(),
27209
+ boostUri: external_exports.string().optional(),
27210
+ skipNotification: external_exports.boolean().optional()
27211
+ });
27212
+ var GetEncryptionRecipientsInputValidator = external_exports.object({ refreshId: external_exports.string().min(1) });
27213
+ var EncryptionRecipientsResultValidator = external_exports.object({
27214
+ recipientKeyIds: external_exports.array(external_exports.string())
27215
+ });
27157
27216
  var InboxCredentialRefreshReceiptValidator = ManagedCredentialRefreshReceiptValidator.omit(
27158
27217
  { holderDid: true }
27159
27218
  ).extend({ holderDid: external_exports.string().min(1).optional() });
27160
27219
  var CredentialRefreshSigningModeValidator = external_exports.enum(["issuer-signed", "signing-authority"]);
27220
+ var CredentialRefreshUpdateReasonValidator = external_exports.enum(["corrected", "updated", "reissued"]);
27161
27221
  var PublishCredentialRefreshBaseFields = {
27162
27222
  refreshId: external_exports.string().min(1),
27163
27223
  notifyHolder: external_exports.boolean().optional(),
27164
- updateSummary: external_exports.string().optional(),
27224
+ updateSummary: external_exports.string().max(280).optional().describe(
27225
+ "Public legacy update summary. Do not include private claims; prefer updateReason."
27226
+ ),
27227
+ updateReason: CredentialRefreshUpdateReasonValidator.optional().describe(
27228
+ "Public reason for this update"
27229
+ ),
27165
27230
  idempotencyKey: external_exports.string().optional()
27166
27231
  };
27167
27232
  var PublishIssuerSignedRefreshValidator = external_exports.object({
@@ -27237,13 +27302,25 @@ var PublishCredentialRefreshResultValidator = external_exports.object({
27237
27302
  publishedAt: external_exports.string().min(1),
27238
27303
  notification: PublishCredentialRefreshNotificationValidator
27239
27304
  });
27305
+ var PublishHolderEncryptedRefreshInputValidator = external_exports.object({
27306
+ handoff: HolderEncryptedHandoffValidator,
27307
+ notify: external_exports.boolean(),
27308
+ updateSummary: external_exports.string().max(280).optional().describe(
27309
+ "Public legacy update summary. Do not include private claims; prefer updateReason."
27310
+ ),
27311
+ updateReason: CredentialRefreshUpdateReasonValidator.optional().describe(
27312
+ "Public reason for this update"
27313
+ ),
27314
+ idempotencyKey: external_exports.string().optional()
27315
+ });
27240
27316
  var CredentialRefreshVersionMetadataValidator = external_exports.object({
27241
27317
  version: external_exports.number().int().positive(),
27242
27318
  publishedAt: external_exports.string().min(1),
27243
27319
  effectiveAt: external_exports.string().optional(),
27244
27320
  etag: external_exports.string().optional(),
27245
27321
  signingMode: CredentialRefreshSigningModeValidator.optional(),
27246
- updateSummary: external_exports.string().optional()
27322
+ updateSummary: external_exports.string().optional(),
27323
+ updateReason: CredentialRefreshUpdateReasonValidator.optional()
27247
27324
  });
27248
27325
  var GetCredentialRefreshHistoryInputValidator = external_exports.object({
27249
27326
  refreshId: external_exports.string().min(1),
@@ -27286,6 +27363,7 @@ var CredentialRefreshFailureCodeValidator = external_exports.enum([
27286
27363
  "INVALID_PROOF",
27287
27364
  "ISSUER_MISMATCH",
27288
27365
  "ID_MISMATCH",
27366
+ "BINDING_MISMATCH",
27289
27367
  "ROLLBACK",
27290
27368
  "REVOKED",
27291
27369
  "UNSAFE_ENDPOINT"
@@ -27610,6 +27688,11 @@ var AutoBoostConfigValidator = external_exports.object({
27610
27688
  name: external_exports.string()
27611
27689
  })
27612
27690
  });
27691
+ var CredentialDisplayValidator = external_exports.object({
27692
+ name: external_exports.string().trim().min(1).max(280).optional(),
27693
+ category: external_exports.string().max(280).optional(),
27694
+ image: external_exports.string().max(2048).url().refine((url2) => url2.startsWith("https://"), { message: "Image URL must use https" }).optional()
27695
+ });
27613
27696
  var SendBoostTemplateValidator = BoostValidator.partial().omit({ uri: true, claimPermissions: true }).extend({
27614
27697
  credential: VCValidator.or(UnsignedVCValidator),
27615
27698
  claimPermissions: BoostPermissionsValidator.partial().optional(),
@@ -27648,6 +27731,10 @@ var SendBoostInputValidator = external_exports.object({
27648
27731
  templateUri: external_exports.string().optional(),
27649
27732
  template: SendBoostTemplateValidator.optional(),
27650
27733
  signedCredential: VCValidator.optional(),
27734
+ display: CredentialDisplayValidator.optional().describe(
27735
+ "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."
27736
+ ),
27737
+ statusPurposes: external_exports.array(BitstringStatusPurposeValidator).optional(),
27651
27738
  options: SendOptionsValidator.optional().describe(
27652
27739
  "Options for email/phone recipients (Universal Inbox)"
27653
27740
  ),
@@ -27686,7 +27773,10 @@ var SendInboxResponseValidator = external_exports.object({
27686
27773
  "Present when guardianEmail was specified"
27687
27774
  )
27688
27775
  });
27776
+ var StatusManagementValidator = external_exports.enum(["network", "external", "mixed", "none"]);
27689
27777
  var SendBoostResponseValidator = external_exports.object({
27778
+ /** Public status providers for a managed send; external entries require provider-side updates. */
27779
+ statusManagement: StatusManagementValidator.optional(),
27690
27780
  type: external_exports.literal("boost"),
27691
27781
  credentialUri: external_exports.string(),
27692
27782
  uri: external_exports.string(),
@@ -27699,19 +27789,33 @@ var SendBoostResponseValidator = external_exports.object({
27699
27789
  )
27700
27790
  });
27701
27791
  var PrepareRefreshableSendInputValidator = external_exports.object({
27792
+ /** Opt in to signing the server-bound statusEntries; omission preserves client allocation. */
27793
+ statusBinding: external_exports.literal("server").optional(),
27794
+ statusPurposes: external_exports.array(BitstringStatusPurposeValidator).optional(),
27702
27795
  recipient: external_exports.string(),
27703
27796
  templateUri: external_exports.string().optional(),
27704
27797
  template: SendBoostTemplateValidator.optional(),
27798
+ display: CredentialDisplayValidator.optional().describe("Public display metadata only"),
27705
27799
  contractUri: external_exports.string().optional(),
27706
27800
  templateData: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
27707
27801
  integrationId: external_exports.string().optional(),
27708
27802
  /** Credential ID to allocate for; generated server-side when omitted. */
27709
27803
  credentialId: external_exports.string().min(1).optional(),
27710
- idempotencyKey: external_exports.string().min(1).max(200).optional()
27711
- }).refine((data) => Boolean(data.templateUri) !== Boolean(data.template), {
27712
- message: "Provide exactly one of templateUri or template."
27804
+ idempotencyKey: external_exports.string().min(1).max(200).optional(),
27805
+ /**
27806
+ * `'holder'` requests student-only encryption (LC-2345): the SDK signs and
27807
+ * encrypts locally and the server never receives plaintext. Requires a
27808
+ * profile or DID recipient; rejected for signedCredential-only sends and for
27809
+ * inbox (email/phone) recipients. Defaults to `'network'`.
27810
+ */
27811
+ encryption: external_exports.enum(["network", "holder"]).optional()
27812
+ }).refine((data) => !(data.templateUri && data.template), {
27813
+ message: "Provide at most one of templateUri or template."
27713
27814
  });
27714
27815
  var PrepareRefreshableSendResultValidator = external_exports.object({
27816
+ /** Public status providers known at preparation; final send reports the signed entries. */
27817
+ statusManagement: StatusManagementValidator.optional(),
27818
+ statusEntries: external_exports.array(BitstringStatusListEntryValidator).optional(),
27715
27819
  boostUri: external_exports.string(),
27716
27820
  credentialId: external_exports.string(),
27717
27821
  refreshId: external_exports.string(),
@@ -27719,11 +27823,110 @@ var PrepareRefreshableSendResultValidator = external_exports.object({
27719
27823
  /** The DID to use as credentialSubject.id (recipient DID, or the profile's did:web). */
27720
27824
  holderDid: external_exports.string(),
27721
27825
  /** Present when this idempotencyKey already completed: return it without signing. */
27722
- completed: SendBoostResponseValidator.optional()
27826
+ completed: SendBoostResponseValidator.optional(),
27827
+ /**
27828
+ * Present only when `encryption: 'holder'` was requested: the exact
27829
+ * key-agreement verification-method ids (holder + current managers) the SDK
27830
+ * must encrypt to. Recomputed on every call, so a later manager change can
27831
+ * make a previously-prepared set stale (see `credentialRefresh.sendHolderEncryptedRefreshable`
27832
+ * and `credentialRefresh.getEncryptionRecipients`).
27833
+ */
27834
+ recipientKeyIds: external_exports.array(external_exports.string()).optional()
27723
27835
  });
27724
27836
  var SendInputValidator = external_exports.discriminatedUnion("type", [SendBoostInputValidator]);
27725
27837
  var SendResponseValidator = external_exports.discriminatedUnion("type", [SendBoostResponseValidator]);
27726
- var ConsentFlowTermsStatusValidator = external_exports.enum(["live", "stale", "withdrawn"]);
27838
+ var ConsentFlowTermsStatusValidator = external_exports.enum([
27839
+ "live",
27840
+ "consumed",
27841
+ "withdrawn",
27842
+ "needs_reconsent",
27843
+ "suspended"
27844
+ ]);
27845
+ var ConsentFlowContractChangeKindValidator = external_exports.enum([
27846
+ "relaxed",
27847
+ "expanded_optional",
27848
+ "requires_consent"
27849
+ ]);
27850
+ var ConsentFlowContractScopeValidator = external_exports.object({
27851
+ area: external_exports.enum(["read", "write"]),
27852
+ type: external_exports.enum(["credential", "personal"]),
27853
+ key: external_exports.string(),
27854
+ required: external_exports.boolean(),
27855
+ reason: external_exports.string().optional()
27856
+ });
27857
+ var ConsentFlowContractDetailValueValidator = external_exports.union([
27858
+ external_exports.string(),
27859
+ external_exports.boolean(),
27860
+ external_exports.string().array()
27861
+ ]);
27862
+ var ConsentFlowContractDetailChangeValidator = external_exports.object({
27863
+ field: external_exports.enum([
27864
+ "name",
27865
+ "subtitle",
27866
+ "description",
27867
+ "reasonForAccessing",
27868
+ "image",
27869
+ "needsGuardianConsent",
27870
+ "redirectUrl",
27871
+ "frontDoorBoostUri",
27872
+ "expiresAt",
27873
+ "writers",
27874
+ "autoboosts"
27875
+ ]),
27876
+ before: ConsentFlowContractDetailValueValidator.optional(),
27877
+ after: ConsentFlowContractDetailValueValidator.optional()
27878
+ });
27879
+ var ConsentFlowContractDiffValidator = external_exports.object({
27880
+ added: ConsentFlowContractScopeValidator.array(),
27881
+ removed: ConsentFlowContractScopeValidator.array(),
27882
+ changed: ConsentFlowContractScopeValidator.array(),
27883
+ details: ConsentFlowContractDetailChangeValidator.array().optional()
27884
+ });
27885
+ var ConsentFlowContractUpdatePreviewValidator = external_exports.object({
27886
+ headline: external_exports.string(),
27887
+ subhead: external_exports.string(),
27888
+ rows: external_exports.array(
27889
+ external_exports.object({
27890
+ scope: ConsentFlowContractScopeValidator,
27891
+ change: external_exports.enum(["added", "removed", "changed"]),
27892
+ label: external_exports.string(),
27893
+ subtitle: external_exports.string()
27894
+ })
27895
+ ),
27896
+ primaryLabel: external_exports.string()
27897
+ });
27898
+ var ConsentFlowContractStatusValidator = external_exports.enum(["active", "retired"]);
27899
+ var ConsentFlowContractVersionValidator = external_exports.object({
27900
+ version: external_exports.number().int().positive(),
27901
+ createdAt: external_exports.string(),
27902
+ reason: external_exports.string().optional(),
27903
+ kind: ConsentFlowContractChangeKindValidator.optional()
27904
+ });
27905
+ var ConsentFlowContractUpdateResultValidator = external_exports.object({
27906
+ version: external_exports.number().int().positive(),
27907
+ kind: ConsentFlowContractChangeKindValidator,
27908
+ affectedUsers: external_exports.number().int().nonnegative(),
27909
+ preview: ConsentFlowContractUpdatePreviewValidator
27910
+ });
27911
+ var ConsentFlowConsentStatusValidator = external_exports.object({
27912
+ status: ConsentFlowTermsStatusValidator.or(external_exports.literal("not_consented")),
27913
+ consentedVersion: external_exports.number().int().positive().optional(),
27914
+ currentVersion: external_exports.number().int().positive(),
27915
+ needsReconsent: external_exports.boolean(),
27916
+ reviewUrl: external_exports.string().optional()
27917
+ });
27918
+ var ConsentFlowContractNotificationDataValidator = external_exports.object({
27919
+ contractUri: external_exports.string(),
27920
+ contractName: external_exports.string().optional(),
27921
+ fromVersion: external_exports.number().int().positive(),
27922
+ toVersion: external_exports.number().int().positive(),
27923
+ kind: ConsentFlowContractChangeKindValidator,
27924
+ reason: external_exports.string().optional(),
27925
+ diff: ConsentFlowContractDiffValidator,
27926
+ reconsentDeadline: external_exports.string().optional(),
27927
+ reviewUrl: external_exports.string(),
27928
+ preview: ConsentFlowContractUpdatePreviewValidator.optional()
27929
+ });
27727
27930
  var ConsentFlowContractValidator = external_exports.object({
27728
27931
  read: external_exports.object({
27729
27932
  anonymize: external_exports.boolean().optional(),
@@ -27732,13 +27935,18 @@ var ConsentFlowContractValidator = external_exports.object({
27732
27935
  external_exports.string(),
27733
27936
  external_exports.object({
27734
27937
  required: external_exports.boolean(),
27735
- defaultEnabled: external_exports.boolean().optional()
27938
+ defaultEnabled: external_exports.boolean().optional(),
27939
+ reason: external_exports.string().optional()
27736
27940
  })
27737
27941
  ).default({})
27738
27942
  }).prefault({ categories: {} }),
27739
27943
  personal: external_exports.record(
27740
27944
  external_exports.string(),
27741
- external_exports.object({ required: external_exports.boolean(), defaultEnabled: external_exports.boolean().optional() })
27945
+ external_exports.object({
27946
+ required: external_exports.boolean(),
27947
+ defaultEnabled: external_exports.boolean().optional(),
27948
+ reason: external_exports.string().optional()
27949
+ })
27742
27950
  ).default({})
27743
27951
  }).prefault({ credentials: { categories: {} }, personal: {} }),
27744
27952
  write: external_exports.object({
@@ -27747,16 +27955,55 @@ var ConsentFlowContractValidator = external_exports.object({
27747
27955
  external_exports.string(),
27748
27956
  external_exports.object({
27749
27957
  required: external_exports.boolean(),
27750
- defaultEnabled: external_exports.boolean().optional()
27958
+ defaultEnabled: external_exports.boolean().optional(),
27959
+ reason: external_exports.string().optional()
27751
27960
  })
27752
27961
  ).default({})
27753
27962
  }).prefault({ categories: {} }),
27754
27963
  personal: external_exports.record(
27755
27964
  external_exports.string(),
27756
- external_exports.object({ required: external_exports.boolean(), defaultEnabled: external_exports.boolean().optional() })
27965
+ external_exports.object({
27966
+ required: external_exports.boolean(),
27967
+ defaultEnabled: external_exports.boolean().optional(),
27968
+ reason: external_exports.string().optional()
27969
+ })
27757
27970
  ).default({})
27758
27971
  }).prefault({ credentials: { categories: {} }, personal: {} })
27759
27972
  });
27973
+ var ConsentFlowContractScopePatchValidator = external_exports.object({
27974
+ required: external_exports.boolean(),
27975
+ defaultEnabled: external_exports.boolean().optional(),
27976
+ reason: external_exports.string().optional()
27977
+ }).nullable();
27978
+ var ConsentFlowContractChangesValidator = external_exports.object({
27979
+ contract: external_exports.object({
27980
+ read: external_exports.object({
27981
+ anonymize: external_exports.boolean().optional(),
27982
+ credentials: external_exports.object({
27983
+ categories: external_exports.record(external_exports.string(), ConsentFlowContractScopePatchValidator).optional()
27984
+ }).optional(),
27985
+ personal: external_exports.record(external_exports.string(), ConsentFlowContractScopePatchValidator).optional()
27986
+ }).optional(),
27987
+ write: external_exports.object({
27988
+ credentials: external_exports.object({
27989
+ categories: external_exports.record(external_exports.string(), ConsentFlowContractScopePatchValidator).optional()
27990
+ }).optional(),
27991
+ personal: external_exports.record(external_exports.string(), ConsentFlowContractScopePatchValidator).optional()
27992
+ }).optional()
27993
+ }).optional(),
27994
+ name: external_exports.string().optional(),
27995
+ subtitle: external_exports.string().optional(),
27996
+ description: external_exports.string().optional(),
27997
+ reasonForAccessing: external_exports.string().optional(),
27998
+ image: external_exports.string().optional(),
27999
+ needsGuardianConsent: external_exports.boolean().optional(),
28000
+ redirectUrl: external_exports.string().optional(),
28001
+ frontDoorBoostUri: external_exports.string().optional(),
28002
+ expiresAt: external_exports.string().nullable().optional(),
28003
+ autoboosts: AutoBoostConfigValidator.array().optional(),
28004
+ writers: external_exports.string().array().optional(),
28005
+ recipients: external_exports.string().array().optional()
28006
+ });
27760
28007
  var ConsentFlowContractDetailsValidator = external_exports.object({
27761
28008
  contract: ConsentFlowContractValidator,
27762
28009
  owner: LCNProfileValidator,
@@ -27775,7 +28022,19 @@ var ConsentFlowContractDetailsValidator = external_exports.object({
27775
28022
  autoBoosts: external_exports.string().array().optional(),
27776
28023
  writers: external_exports.array(LCNProfileValidator).optional(),
27777
28024
  recipients: external_exports.array(LCNPublicProfileValidator.extend({ did: external_exports.string() })).optional(),
27778
- audienceVersion: external_exports.number().int().nonnegative().optional()
28025
+ audienceVersion: external_exports.number().int().nonnegative().optional(),
28026
+ version: external_exports.number().int().positive(),
28027
+ status: ConsentFlowContractStatusValidator.optional(),
28028
+ latestUpdate: external_exports.object({
28029
+ fromVersion: external_exports.number().int().positive(),
28030
+ toVersion: external_exports.number().int().positive(),
28031
+ kind: ConsentFlowContractChangeKindValidator,
28032
+ reason: external_exports.string().optional(),
28033
+ diff: ConsentFlowContractDiffValidator,
28034
+ reconsentDeadline: external_exports.string().optional(),
28035
+ createdAt: external_exports.string(),
28036
+ preview: ConsentFlowContractUpdatePreviewValidator
28037
+ }).optional()
27779
28038
  });
27780
28039
  var ConsentFlowContractRequestStatusValidator = external_exports.enum(["pending", "accepted", "denied", "cancelled"]).nullable();
27781
28040
  var ConsentFlowContractRequestReadStatusValidator = external_exports.enum(["unseen", "seen"]).nullable();
@@ -27864,7 +28123,12 @@ var PaginatedConsentFlowTermsValidator = PaginationResponseValidator.extend({
27864
28123
  contract: ConsentFlowContractDetailsValidator,
27865
28124
  uri: external_exports.string(),
27866
28125
  consenter: LCNProfileValidator,
27867
- status: ConsentFlowTermsStatusValidator
28126
+ status: ConsentFlowTermsStatusValidator,
28127
+ consentedVersion: external_exports.number().int().positive(),
28128
+ lastReviewedVersion: external_exports.number().int().positive().optional(),
28129
+ reconsentDeadline: external_exports.string().optional(),
28130
+ newOptionsUntil: external_exports.string().optional(),
28131
+ cumulativeUpdate: ConsentFlowContractDetailsValidator.shape.latestUpdate
27868
28132
  }).array()
27869
28133
  });
27870
28134
  var ConsentFlowGuardianApprovalValidator = external_exports.object({
@@ -27940,7 +28204,8 @@ var ConsentFlowTransactionActionValidator = external_exports.enum([
27940
28204
  "update",
27941
28205
  "sync",
27942
28206
  "withdraw",
27943
- "write"
28207
+ "write",
28208
+ "reconsent"
27944
28209
  ]);
27945
28210
  var ConsentFlowTransactionsQueryValidator = external_exports.object({
27946
28211
  terms: ConsentFlowTermsQueryValidator.optional(),
@@ -27959,8 +28224,12 @@ var ConsentFlowTransactionValidator = external_exports.object({
27959
28224
  referral: ConsentFlowReferralValidator.optional(),
27960
28225
  id: external_exports.string(),
27961
28226
  action: ConsentFlowTransactionActionValidator,
28227
+ kind: ConsentFlowContractChangeKindValidator.optional(),
27962
28228
  date: external_exports.string(),
27963
- uris: external_exports.string().array().optional()
28229
+ uris: external_exports.string().array().optional(),
28230
+ consentedVersion: external_exports.number().int().positive().optional(),
28231
+ reconsentDeadline: external_exports.string().optional(),
28232
+ newOptionsUntil: external_exports.string().optional()
27964
28233
  });
27965
28234
  var HolderExportConsentRecordValidator = external_exports.object({
27966
28235
  termsUri: external_exports.string(),
@@ -27968,6 +28237,10 @@ var HolderExportConsentRecordValidator = external_exports.object({
27968
28237
  contract: ConsentFlowContractDetailsValidator,
27969
28238
  terms: ConsentFlowTermsValidator,
27970
28239
  referral: ConsentFlowReferralValidator.optional(),
28240
+ consentedVersion: external_exports.number().int().positive(),
28241
+ reconsentDeadline: external_exports.string().optional(),
28242
+ newOptionsUntil: external_exports.string().optional(),
28243
+ cumulativeUpdate: ConsentFlowContractDetailsValidator.shape.latestUpdate,
27971
28244
  transactions: ConsentFlowTransactionValidator.array()
27972
28245
  });
27973
28246
  var HolderExportMetadataValidator = external_exports.object({
@@ -28028,10 +28301,12 @@ var LCNNotificationTypeEnumValidator = external_exports.enum([
28028
28301
  "GUARDIAN_APPROVED",
28029
28302
  "GUARDIAN_REJECTED",
28030
28303
  "APP_NOTIFICATION",
28304
+ "ANNOUNCEMENT",
28031
28305
  "CREDENTIAL_REVOKED",
28032
28306
  "CREDENTIAL_SUSPENDED",
28033
28307
  "CREDENTIAL_UNSUSPENDED",
28034
- "CREDENTIAL_REFRESHED"
28308
+ "CREDENTIAL_REFRESHED",
28309
+ "CONSENT_FLOW_CONTRACT_UPDATED"
28035
28310
  ]);
28036
28311
  var LCNNotificationMessageValidator = external_exports.object({
28037
28312
  title: external_exports.string().optional(),
@@ -28060,12 +28335,26 @@ var LCNNotificationInboxValidator = external_exports.object({
28060
28335
  timestamp: external_exports.iso.datetime().optional()
28061
28336
  });
28062
28337
  var LCNNotificationMetadataValidator = external_exports.object({
28063
- connectionPrompt: LCNConnectionPromptMetadataValidator.optional()
28338
+ connectionPrompt: LCNConnectionPromptMetadataValidator.optional(),
28339
+ campaignId: external_exports.string().regex(/^[a-z0-9-]{3,64}$/).optional(),
28340
+ campaignCreatedAt: external_exports.iso.datetime().optional(),
28341
+ campaignHasInApp: external_exports.boolean().optional(),
28342
+ campaignTestId: external_exports.uuid().optional()
28064
28343
  }).catchall(external_exports.unknown());
28065
28344
  var LCNNotificationDataValidator = external_exports.object({
28066
28345
  vcUris: external_exports.array(external_exports.string()).optional(),
28067
28346
  vpUris: external_exports.array(external_exports.string()).optional(),
28068
28347
  transaction: ConsentFlowTransactionValidator.optional(),
28348
+ contractUri: external_exports.string().optional(),
28349
+ contractName: external_exports.string().optional(),
28350
+ fromVersion: external_exports.number().int().positive().optional(),
28351
+ toVersion: external_exports.number().int().positive().optional(),
28352
+ kind: ConsentFlowContractChangeKindValidator.optional(),
28353
+ reason: external_exports.string().optional(),
28354
+ diff: ConsentFlowContractDiffValidator.optional(),
28355
+ reconsentDeadline: external_exports.string().optional(),
28356
+ reviewUrl: external_exports.string().optional(),
28357
+ preview: ConsentFlowContractUpdatePreviewValidator.optional(),
28069
28358
  inbox: LCNNotificationInboxValidator.optional(),
28070
28359
  metadata: LCNNotificationMetadataValidator.optional()
28071
28360
  }).loose();
@@ -29163,28 +29452,6 @@ var EscrowPinStatusValidator = external_exports.object({
29163
29452
  */
29164
29453
  wrongAttempts: external_exports.number().int().nonnegative().optional()
29165
29454
  });
29166
- var BITSTRING_STATUS_PURPOSES = ["revocation", "suspension"];
29167
- var BitstringStatusPurposeValidator = external_exports.enum(BITSTRING_STATUS_PURPOSES);
29168
- var BitstringStatusListEntryValidator = external_exports.object({
29169
- id: external_exports.string().optional(),
29170
- type: external_exports.literal("BitstringStatusListEntry"),
29171
- statusPurpose: BitstringStatusPurposeValidator,
29172
- statusListIndex: external_exports.string().or(external_exports.number().int().nonnegative()),
29173
- statusListCredential: external_exports.string()
29174
- });
29175
- var AllocatedBitstringStatusListEntryValidator = BitstringStatusListEntryValidator.extend({
29176
- id: external_exports.string()
29177
- });
29178
- var BitstringStatusListCredentialSubjectValidator = external_exports.object({
29179
- id: external_exports.string().optional(),
29180
- type: external_exports.literal("BitstringStatusList"),
29181
- statusPurpose: BitstringStatusPurposeValidator,
29182
- encodedList: external_exports.string()
29183
- });
29184
- var AllocateCredentialStatusInputValidator = external_exports.object({
29185
- statusPurposes: external_exports.array(BitstringStatusPurposeValidator).optional(),
29186
- listSize: external_exports.number().int().positive().optional()
29187
- }).default({});
29188
29455
  var isSafeInAppMessagePath = /* @__PURE__ */ __name2((path) => {
29189
29456
  let decoded = path;
29190
29457
  for (let depth = 0; depth < 5; depth += 1) {
@@ -29465,24 +29732,46 @@ var inAppMessagesFlagEnvelopeValidator = external_exports.object({
29465
29732
  }).passthrough();
29466
29733
  var CampaignIdValidator = external_exports.string().regex(/^[a-z0-9-]{3,64}$/);
29467
29734
  var CampaignStatusValidator = external_exports.enum(["draft", "live", "paused", "archived"]);
29468
- var CampaignChannelValidator = external_exports.enum(["inApp", "notify"]);
29735
+ var CampaignChannelValidator = external_exports.enum(["inApp", "notify", "email"]);
29469
29736
  var CampaignEventValidator = external_exports.enum(["shown", "clicked", "dismissed", "converted"]);
29470
- var timestamp = external_exports.iso.datetime({ offset: true }).overwrite((value) => new Date(value).toISOString());
29737
+ var timestamp = external_exports.iso.datetime({ offset: true }).overwrite((value) => {
29738
+ const date5 = new Date(value);
29739
+ return Number.isFinite(date5.getTime()) ? date5.toISOString() : value;
29740
+ });
29471
29741
  var notification = external_exports.object({ title: external_exports.string().min(1), body: external_exports.string().min(1) }).strict();
29472
- var channels = external_exports.array(CampaignChannelValidator).min(1).max(2).refine((values) => new Set(values).size === values.length, "Channels must be unique");
29742
+ var CampaignEmailValidator = external_exports.object({
29743
+ subject: external_exports.string().trim().min(1).max(200).regex(/^[^\r\n]+$/),
29744
+ title: external_exports.string().trim().min(1).max(200),
29745
+ body: external_exports.string().trim().min(1).max(2e4),
29746
+ heroImageUrl: external_exports.url().startsWith("https://").max(2048).optional(),
29747
+ ctaLabel: external_exports.string().trim().min(1).max(100)
29748
+ }).strict();
29749
+ var AnnouncementPreferencesValidator = external_exports.object({
29750
+ announcementEmailOptOut: external_exports.boolean(),
29751
+ announcementPushOptOut: external_exports.boolean()
29752
+ }).strict();
29753
+ var channels = external_exports.array(CampaignChannelValidator).min(1).max(3).refine((values) => new Set(values).size === values.length, "Channels must be unique");
29473
29754
  var campaignDefinition = external_exports.object({
29474
29755
  id: CampaignIdValidator,
29475
29756
  name: external_exports.string().trim().min(1).max(200),
29476
29757
  status: CampaignStatusValidator.default("draft"),
29477
29758
  channels,
29478
- message: inAppMessageValidator,
29759
+ message: inAppMessageValidator.optional(),
29479
29760
  notification: notification.optional(),
29761
+ email: CampaignEmailValidator.optional(),
29480
29762
  startsAt: timestamp.optional(),
29481
29763
  endsAt: timestamp.optional(),
29482
29764
  excludeMinors: external_exports.boolean().default(true),
29483
29765
  selfEnroll: external_exports.boolean().default(false)
29484
29766
  }).strict();
29485
29767
  var validDefinition = /* @__PURE__ */ __name2((value, ctx) => {
29768
+ if (value.channels.includes("inApp") && !value.message) {
29769
+ ctx.addIssue({
29770
+ code: "custom",
29771
+ path: ["message"],
29772
+ message: "In-app requires a message"
29773
+ });
29774
+ }
29486
29775
  if (value.channels.includes("notify") && !value.notification) {
29487
29776
  ctx.addIssue({
29488
29777
  code: "custom",
@@ -29490,15 +29779,23 @@ var validDefinition = /* @__PURE__ */ __name2((value, ctx) => {
29490
29779
  message: "Notify requires a title and body"
29491
29780
  });
29492
29781
  }
29782
+ if (value.channels.includes("email") && !value.email) {
29783
+ ctx.addIssue({
29784
+ code: "custom",
29785
+ path: ["email"],
29786
+ message: "Email requires announcement content"
29787
+ });
29788
+ }
29493
29789
  if (value.startsAt && value.endsAt && value.startsAt >= value.endsAt) {
29494
29790
  ctx.addIssue({ code: "custom", path: ["endsAt"], message: "End must be after start" });
29495
29791
  }
29496
29792
  }, "validDefinition");
29497
29793
  var CampaignValidator = campaignDefinition.extend({
29794
+ tenantId: external_exports.string().optional(),
29498
29795
  createdAt: timestamp,
29499
29796
  updatedAt: timestamp
29500
29797
  }).superRefine(validDefinition).superRefine((value, ctx) => {
29501
- if (value.message.id !== value.id) {
29798
+ if (value.message && value.message.id !== value.id) {
29502
29799
  ctx.addIssue({
29503
29800
  code: "custom",
29504
29801
  path: ["message", "id"],
@@ -29507,21 +29804,23 @@ var CampaignValidator = campaignDefinition.extend({
29507
29804
  }
29508
29805
  });
29509
29806
  var CreateCampaignInputValidator = campaignDefinition.extend({
29510
- message: inAppMessageAuthoringValidator
29807
+ message: inAppMessageAuthoringValidator.optional()
29511
29808
  }).superRefine(validDefinition);
29512
29809
  var CampaignUpdatesValidator = campaignDefinition.omit({ id: true }).partial().extend({
29513
29810
  // A PATCH must not apply creation defaults to fields the caller omitted.
29514
29811
  status: CampaignStatusValidator.optional(),
29515
29812
  excludeMinors: external_exports.boolean().optional(),
29516
29813
  selfEnroll: external_exports.boolean().optional(),
29517
- message: inAppMessageAuthoringValidator.optional(),
29814
+ message: inAppMessageAuthoringValidator.nullable().optional(),
29518
29815
  notification: notification.nullable().optional(),
29816
+ email: CampaignEmailValidator.nullable().optional(),
29519
29817
  startsAt: timestamp.nullable().optional(),
29520
29818
  endsAt: timestamp.nullable().optional()
29521
29819
  }).strict();
29522
29820
  var UpdateCampaignInputValidator = external_exports.object({
29523
29821
  campaignId: CampaignIdValidator,
29524
- updates: CampaignUpdatesValidator
29822
+ updates: CampaignUpdatesValidator,
29823
+ expectedUpdatedAt: timestamp.optional()
29525
29824
  }).strict();
29526
29825
  var identifier = external_exports.string().trim().min(1).max(2048);
29527
29826
  var metadataKey = external_exports.string().regex(/^[a-zA-Z_][a-zA-Z0-9_.-]{0,63}$/).refine(
@@ -29573,7 +29872,8 @@ var CampaignUserStateValidator = external_exports.object({
29573
29872
  clickedAt: timestamp.optional(),
29574
29873
  dismissedAt: timestamp.optional(),
29575
29874
  convertedAt: timestamp.optional(),
29576
- notifiedAt: timestamp.optional()
29875
+ notifiedAt: timestamp.optional(),
29876
+ emailedAt: timestamp.optional()
29577
29877
  });
29578
29878
  var MyCampaignValidator = external_exports.object({
29579
29879
  campaign: campaignDefinition.pick({
@@ -29582,12 +29882,19 @@ var MyCampaignValidator = external_exports.object({
29582
29882
  startsAt: true,
29583
29883
  endsAt: true,
29584
29884
  selfEnroll: true
29585
- }),
29586
- state: CampaignUserStateValidator
29885
+ }).extend({ message: inAppMessageValidator }),
29886
+ state: CampaignUserStateValidator,
29887
+ testId: external_exports.uuid().optional()
29888
+ });
29889
+ var CampaignTestValidator = external_exports.object({
29890
+ id: external_exports.uuid(),
29891
+ campaignId: CampaignIdValidator,
29892
+ message: inAppMessageValidator
29587
29893
  });
29588
29894
  var CampaignStatsValidator = external_exports.object({
29589
29895
  audience: external_exports.number().int().nonnegative(),
29590
29896
  notified: external_exports.number().int().nonnegative(),
29897
+ emailed: external_exports.number().int().nonnegative(),
29591
29898
  shown: external_exports.number().int().nonnegative(),
29592
29899
  clicked: external_exports.number().int().nonnegative(),
29593
29900
  dismissed: external_exports.number().int().nonnegative(),
@@ -29614,6 +29921,31 @@ var PaginatedCampaignAudienceValidator = external_exports.object({
29614
29921
  hasMore: external_exports.boolean(),
29615
29922
  cursor: external_exports.string().optional()
29616
29923
  });
29924
+ var CampaignDispatchPreviewValidator = external_exports.object({
29925
+ campaignId: CampaignIdValidator,
29926
+ audienceCount: external_exports.number().int().nonnegative(),
29927
+ alreadyNotifiedCount: external_exports.number().int().nonnegative(),
29928
+ recipientCount: external_exports.number().int().nonnegative(),
29929
+ notificationRecipientCount: external_exports.number().int().nonnegative().optional(),
29930
+ emailRecipientCount: external_exports.number().int().nonnegative().optional(),
29931
+ previewToken: external_exports.string().regex(/^[a-f0-9]{64}$/),
29932
+ blockedReason: external_exports.enum([
29933
+ "not_live",
29934
+ "notify_disabled",
29935
+ "email_confirmation_required",
29936
+ "not_started",
29937
+ "ended",
29938
+ "no_recipients"
29939
+ ]).optional()
29940
+ });
29941
+ var CampaignDispatchOptionsValidator = external_exports.object({
29942
+ expectedPreviewToken: CampaignDispatchPreviewValidator.shape.previewToken.optional()
29943
+ }).strict();
29944
+ var CampaignAudienceResultValidator = external_exports.object({
29945
+ count: external_exports.number().int().nonnegative(),
29946
+ added: external_exports.number().int().nonnegative(),
29947
+ notFound: external_exports.array(external_exports.string())
29948
+ });
29617
29949
  var SHARE_LINK_ID_BYTES = 16;
29618
29950
  var SHARE_CONTENT_KEY_BYTES = 32;
29619
29951
  var SHARE_IV_BYTES = 12;
@@ -30137,6 +30469,217 @@ var SkillIconNamesValidator = external_exports.array(external_exports.string().n
30137
30469
  }
30138
30470
  );
30139
30471
  var GenerateSkillIconsInputValidator = external_exports.object({ names: SkillIconNamesValidator });
30472
+ var RoleValidator = external_exports.enum(["user", "assistant", "tool", "system"]);
30473
+ var AiSessionMode = {
30474
+ tutor: "ai-tutor",
30475
+ insights: "ai-insights"
30476
+ };
30477
+ var AiSessionModeValidator = external_exports.enum([AiSessionMode.tutor, AiSessionMode.insights]);
30478
+ var StructuredResponseValidator = external_exports.object({
30479
+ notes: external_exports.string().optional(),
30480
+ questions: external_exports.array(external_exports.string())
30481
+ });
30482
+ var IntroStreamModeValidator = external_exports.enum(["formatted", "structured"]);
30483
+ var ChatMessageValidator = external_exports.object({
30484
+ role: RoleValidator,
30485
+ content: external_exports.string().nullable(),
30486
+ tool_call_id: external_exports.string().optional(),
30487
+ tool_calls: external_exports.array(
30488
+ external_exports.object({
30489
+ id: external_exports.string(),
30490
+ type: external_exports.literal("function"),
30491
+ function: external_exports.object({
30492
+ name: external_exports.string(),
30493
+ arguments: external_exports.string()
30494
+ })
30495
+ })
30496
+ ).optional()
30497
+ });
30498
+ var InsightArtifactValidator = external_exports.object({
30499
+ title: external_exports.string(),
30500
+ summary: external_exports.string(),
30501
+ category: external_exports.string(),
30502
+ question: external_exports.string(),
30503
+ narrative: external_exports.string()
30504
+ });
30505
+ var ArtifactSuggestionValidator = external_exports.object({
30506
+ artifact: InsightArtifactValidator,
30507
+ source_text: external_exports.string().optional(),
30508
+ created_at: external_exports.string()
30509
+ });
30510
+ var ThreadCredentialContextValidator = external_exports.object({
30511
+ uri: external_exports.string(),
30512
+ type: external_exports.string(),
30513
+ context: external_exports.string(),
30514
+ score: external_exports.number(),
30515
+ strongestScore: external_exports.number().optional(),
30516
+ averageScore: external_exports.number().optional(),
30517
+ matchCount: external_exports.number().optional(),
30518
+ title: external_exports.string().optional()
30519
+ });
30520
+ var ThreadValidator = external_exports.object({
30521
+ id: external_exports.string(),
30522
+ did: external_exports.string(),
30523
+ topicCredentialUri: external_exports.string().nullable().optional(),
30524
+ title: external_exports.string(),
30525
+ created_at: external_exports.string(),
30526
+ last_message_at: external_exports.string(),
30527
+ active: external_exports.boolean().optional(),
30528
+ ended_at: external_exports.string().optional(),
30529
+ plan_started_at: external_exports.string().optional(),
30530
+ summaries: external_exports.array(
30531
+ external_exports.object({
30532
+ summary_data: external_exports.string(),
30533
+ credential_uri: external_exports.string(),
30534
+ created_at: external_exports.string()
30535
+ })
30536
+ ).optional(),
30537
+ plans: external_exports.array(
30538
+ external_exports.object({
30539
+ plan_data: external_exports.string(),
30540
+ created_at: external_exports.string(),
30541
+ consentRevision: external_exports.string().optional()
30542
+ })
30543
+ ).optional(),
30544
+ credentials: external_exports.array(ThreadCredentialContextValidator).optional(),
30545
+ credentialSearchTopic: external_exports.string().optional(),
30546
+ credentialContextStatus: external_exports.enum(["pending", "ready", "empty", "error"]).optional(),
30547
+ mode: AiSessionModeValidator.optional(),
30548
+ artifactSuggestions: external_exports.array(ArtifactSuggestionValidator).optional()
30549
+ });
30550
+ var CredentialVerificationMetadataValidator = external_exports.object({
30551
+ credentialUri: external_exports.string(),
30552
+ contentHash: external_exports.string().regex(/^[a-f0-9]{64}$/),
30553
+ status: external_exports.enum(["valid", "invalid"]),
30554
+ checkedAt: external_exports.string().datetime(),
30555
+ verifier: external_exports.object({
30556
+ name: external_exports.string(),
30557
+ version: external_exports.string()
30558
+ }),
30559
+ verifiedPayload: external_exports.enum(["credential", "boostCredential"]),
30560
+ checks: external_exports.array(external_exports.string()),
30561
+ errors: external_exports.array(external_exports.string()),
30562
+ warnings: external_exports.array(external_exports.string()),
30563
+ provenance: external_exports.object({
30564
+ source: external_exports.enum(["wallet", "generated"]),
30565
+ retrievedAt: external_exports.string().datetime()
30566
+ }),
30567
+ consent: external_exports.object({
30568
+ contractUri: external_exports.string(),
30569
+ receiptId: external_exports.string().min(1),
30570
+ grantedAt: external_exports.string().datetime().optional(),
30571
+ updatedAt: external_exports.string().datetime(),
30572
+ contractUpdatedAt: external_exports.string().min(1),
30573
+ status: external_exports.literal("live"),
30574
+ expiresAt: external_exports.string().datetime().optional(),
30575
+ contractExpiresAt: external_exports.string().datetime().optional(),
30576
+ categories: external_exports.array(external_exports.string()),
30577
+ credentialUris: external_exports.array(external_exports.string()),
30578
+ personalFields: external_exports.array(external_exports.string()),
30579
+ purpose: external_exports.enum(["credential-ingestion", "model-inference", "embedding"]),
30580
+ revision: external_exports.string().min(1),
30581
+ guardian: external_exports.object({ required: external_exports.boolean(), approved: external_exports.boolean() })
30582
+ })
30583
+ });
30584
+ var ModelSafeCredentialFactValidator = external_exports.object({
30585
+ kind: external_exports.enum([
30586
+ "skill",
30587
+ "goal",
30588
+ "achievement",
30589
+ "course",
30590
+ "experience",
30591
+ "competency",
30592
+ "title",
30593
+ "summary",
30594
+ "assessment",
30595
+ "grade",
30596
+ "date",
30597
+ "alignment",
30598
+ "criteria",
30599
+ "pathway",
30600
+ "topic"
30601
+ ]),
30602
+ value: external_exports.string().min(1).max(240),
30603
+ label: external_exports.string().min(1).max(120).optional()
30604
+ });
30605
+ var ModelSafeCredentialProjectionValidator = external_exports.object({
30606
+ schemaVersion: external_exports.literal("1"),
30607
+ category: external_exports.string().min(1).max(120),
30608
+ credentialTypes: external_exports.array(external_exports.string().min(1).max(120)).max(20),
30609
+ facts: external_exports.array(ModelSafeCredentialFactValidator).max(100),
30610
+ // Present only on credentials that are past their expiry, so the model can
30611
+ // tell a lapsed credential from a current one.
30612
+ expired: external_exports.literal(true).optional(),
30613
+ expirationDate: external_exports.string().datetime().optional()
30614
+ });
30615
+ var AIPassportCredentialRecordValidator = external_exports.object({
30616
+ id: external_exports.string(),
30617
+ uri: external_exports.string(),
30618
+ category: external_exports.string(),
30619
+ credential: VCValidator,
30620
+ aiContext: external_exports.string(),
30621
+ generalSummary: external_exports.string().optional(),
30622
+ createdAt: external_exports.string(),
30623
+ verification: CredentialVerificationMetadataValidator.optional(),
30624
+ projection: ModelSafeCredentialProjectionValidator.optional()
30625
+ });
30626
+ var AuthenticatedMessageValidator = external_exports.object({
30627
+ message: ChatMessageValidator.optional(),
30628
+ threadId: external_exports.string().optional(),
30629
+ selectedQuestion: external_exports.string().optional(),
30630
+ action: external_exports.enum([
30631
+ "start_topic",
30632
+ "continue_plan",
30633
+ "start_topic_uri",
30634
+ "start_learning_pathway",
30635
+ "start_insights_session",
30636
+ "close_insights_session",
30637
+ "artifact_suggestion"
30638
+ ]).optional(),
30639
+ topic: external_exports.string().optional(),
30640
+ topicUri: external_exports.string().optional(),
30641
+ pathwayUri: external_exports.string().optional(),
30642
+ mode: AiSessionModeValidator.optional(),
30643
+ introStreamMode: IntroStreamModeValidator.optional(),
30644
+ // BCP-47 language for AI responses (LC-1901). This has to live on the
30645
+ // validator, not just the inferred type — z.object strips unknown keys, so an
30646
+ // undeclared `locale` would be dropped before the WS handler ever saw it.
30647
+ locale: external_exports.string().nullish()
30648
+ });
30649
+ var DebugInfoValidator = external_exports.object({
30650
+ operation: external_exports.string(),
30651
+ collection: external_exports.string(),
30652
+ input: external_exports.unknown().optional(),
30653
+ output: external_exports.unknown().optional(),
30654
+ timestamp: external_exports.string(),
30655
+ duration: external_exports.number().optional()
30656
+ });
30657
+ var TimingEventValidator = external_exports.object({
30658
+ event: external_exports.literal("timing"),
30659
+ operation: external_exports.string(),
30660
+ phase: external_exports.enum(["start", "end", "complete"]),
30661
+ duration: external_exports.number().optional(),
30662
+ metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
30663
+ timestamp: external_exports.string()
30664
+ });
30665
+ var LearningPathwayValidator = external_exports.object({
30666
+ id: external_exports.string(),
30667
+ learningPathway: external_exports.object({
30668
+ stepIndex: external_exports.number(),
30669
+ step: external_exports.object({
30670
+ title: external_exports.string(),
30671
+ description: external_exports.string(),
30672
+ summary: external_exports.string(),
30673
+ learned: external_exports.array(external_exports.string()),
30674
+ skills: external_exports.array(
30675
+ external_exports.object({
30676
+ title: external_exports.string(),
30677
+ description: external_exports.string()
30678
+ })
30679
+ )
30680
+ })
30681
+ })
30682
+ });
30140
30683
 
30141
30684
  // src/helpers.ts
30142
30685
  var import_json_stringify_deterministic = __toESM(require_lib(), 1);
@@ -30273,13 +30816,20 @@ var getLearnCloudPlugin = /* @__PURE__ */ __name(async (initialLearnCard, url2,
30273
30816
  }, "loadDids");
30274
30817
  const otherClients = /* @__PURE__ */ new Map();
30275
30818
  const learnCloudDids = /* @__PURE__ */ new WeakMap();
30276
- const getLearnCloudDid = /* @__PURE__ */ __name((currentClient) => {
30819
+ const getLearnCloudDid = /* @__PURE__ */ __name(async (currentClient) => {
30277
30820
  let learnCloudDid = learnCloudDids.get(currentClient);
30278
30821
  if (!learnCloudDid) {
30279
30822
  learnCloudDid = currentClient.utilities.getDid.query();
30280
30823
  learnCloudDids.set(currentClient, learnCloudDid);
30281
30824
  }
30282
- return learnCloudDid;
30825
+ try {
30826
+ return await learnCloudDid;
30827
+ } catch (error62) {
30828
+ if (learnCloudDids.get(currentClient) === learnCloudDid) {
30829
+ learnCloudDids.delete(currentClient);
30830
+ }
30831
+ throw error62;
30832
+ }
30283
30833
  }, "getLearnCloudDid");
30284
30834
  const getOtherClient = /* @__PURE__ */ __name(async (otherUrl, _learnCard) => {
30285
30835
  const key = `${_learnCard.id.did()}\0${otherUrl}`;
@@ -30626,6 +31176,8 @@ var getLearnCloudPlugin = /* @__PURE__ */ __name(async (initialLearnCard, url2,
30626
31176
  _learnCard.debug?.("LearnCloud index.getPaginated", query, paginationOptions);
30627
31177
  const options = {
30628
31178
  ...paginationOptions,
31179
+ // JSON-persisted infinite-query page parameters may restore as null.
31180
+ cursor: paginationOptions?.cursor ?? void 0,
30629
31181
  sort: ["newestFirst", "oldestFirst"].includes(paginationOptions?.sort ?? "") ? paginationOptions?.sort : void 0
30630
31182
  };
30631
31183
  if (!query) {