@learncard/learn-cloud-plugin 2.3.17 → 2.3.20

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.
@@ -19582,6 +19582,42 @@ var UnsignedAchievementCredentialValidator = UnsignedVCValidator.extend({
19582
19582
  var AchievementCredentialValidator = UnsignedAchievementCredentialValidator.extend({
19583
19583
  proof: ProofValidator.or(ProofValidator.array())
19584
19584
  });
19585
+ var AssociationTypeValidator = external_exports.enum([
19586
+ "exactMatchOf",
19587
+ "extends",
19588
+ "isChildOf",
19589
+ "isParentOf",
19590
+ "isPartOf",
19591
+ "isPeerOf",
19592
+ "isRelatedTo",
19593
+ "precedes",
19594
+ "replacedBy"
19595
+ ]).or(external_exports.string());
19596
+ var AssociationValidator = external_exports.object({
19597
+ type: external_exports.string().array().nonempty(),
19598
+ associationType: AssociationTypeValidator,
19599
+ sourceId: external_exports.string().optional(),
19600
+ targetId: external_exports.string()
19601
+ }).catchall(external_exports.any());
19602
+ var ClrSubjectValidator = external_exports.object({
19603
+ id: external_exports.string().optional(),
19604
+ type: external_exports.string().array().nonempty(),
19605
+ identifier: external_exports.any().array().optional(),
19606
+ achievement: AchievementValidator.array().optional(),
19607
+ association: AssociationValidator.array().optional(),
19608
+ verifiableCredential: external_exports.any().array().optional()
19609
+ }).catchall(external_exports.any());
19610
+ var UnsignedClrCredentialValidator = UnsignedVCValidator.extend({
19611
+ name: external_exports.string().optional(),
19612
+ description: external_exports.string().optional(),
19613
+ image: ImageValidator.optional(),
19614
+ credentialSubject: ClrSubjectValidator.or(ClrSubjectValidator.array()),
19615
+ endorsement: EndorsementCredentialValidator.array().optional(),
19616
+ partial: external_exports.boolean().optional()
19617
+ });
19618
+ var ClrCredentialValidator = UnsignedClrCredentialValidator.extend({
19619
+ proof: ProofValidator.or(ProofValidator.array())
19620
+ });
19585
19621
  var VerificationCheckValidator = external_exports.object({
19586
19622
  checks: external_exports.string().array(),
19587
19623
  warnings: external_exports.string().array(),
@@ -19933,10 +19969,16 @@ var SendBrandingOptionsValidator = external_exports.object({
19933
19969
  credentialName: external_exports.string().optional().describe("Display name for the credential"),
19934
19970
  recipientName: external_exports.string().optional().describe("Name of the recipient for personalization")
19935
19971
  });
19972
+ var GuardianStatusValidator = external_exports.enum([
19973
+ "AWAITING_GUARDIAN",
19974
+ "GUARDIAN_APPROVED",
19975
+ "GUARDIAN_REJECTED"
19976
+ ]);
19936
19977
  var SendOptionsValidator = external_exports.object({
19937
19978
  webhookUrl: external_exports.string().url().optional().describe("Webhook URL to receive claim notifications"),
19938
19979
  suppressDelivery: external_exports.boolean().optional().describe("If true, returns claimUrl without sending email/SMS"),
19939
- branding: SendBrandingOptionsValidator.optional().describe("Branding for email/SMS delivery")
19980
+ branding: SendBrandingOptionsValidator.optional().describe("Branding for email/SMS delivery"),
19981
+ guardianEmail: external_exports.string().email().optional().describe("Guardian email that must approve before student can claim")
19940
19982
  });
19941
19983
  var SendBoostInputValidator = external_exports.object({
19942
19984
  type: external_exports.literal("boost"),
@@ -19950,14 +19992,28 @@ var SendBoostInputValidator = external_exports.object({
19950
19992
  ),
19951
19993
  templateData: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
19952
19994
  integrationId: external_exports.string().optional().describe("Integration ID for activity tracking")
19953
- }).refine((data) => data.templateUri || data.template, {
19954
- message: "Either templateUri or template creation data must be provided.",
19995
+ }).refine((data) => data.templateUri || data.template || data.signedCredential, {
19996
+ message: "Either templateUri, template, or signedCredential must be provided.",
19955
19997
  path: ["templateUri"]
19956
- });
19998
+ }).refine(
19999
+ (data) => {
20000
+ if (data.options?.guardianEmail) {
20001
+ return data.options.guardianEmail.toLowerCase() !== data.recipient.toLowerCase();
20002
+ }
20003
+ return true;
20004
+ },
20005
+ {
20006
+ message: "guardianEmail must differ from recipient (self-approval not allowed)",
20007
+ path: ["options", "guardianEmail"]
20008
+ }
20009
+ );
19957
20010
  var SendInboxResponseValidator = external_exports.object({
19958
20011
  issuanceId: external_exports.string(),
19959
20012
  status: external_exports.enum(["PENDING", "ISSUED", "EXPIRED", "DELIVERED", "CLAIMED"]),
19960
- claimUrl: external_exports.string().url().optional().describe("Present when suppressDelivery=true")
20013
+ claimUrl: external_exports.string().url().optional().describe("Present when suppressDelivery=true"),
20014
+ guardianStatus: GuardianStatusValidator.optional().describe(
20015
+ "Present when guardianEmail was specified"
20016
+ )
19961
20017
  });
19962
20018
  var SendBoostResponseValidator = external_exports.object({
19963
20019
  type: external_exports.literal("boost"),
@@ -20194,7 +20250,11 @@ var LCNNotificationTypeEnumValidator = external_exports.enum([
20194
20250
  "APP_LISTING_APPROVED",
20195
20251
  "APP_LISTING_REJECTED",
20196
20252
  "APP_LISTING_WITHDRAWN",
20197
- "DEVICE_LINK_REQUEST"
20253
+ "DEVICE_LINK_REQUEST",
20254
+ "GUARDIAN_APPROVAL_PENDING",
20255
+ "GUARDIAN_APPROVED",
20256
+ "GUARDIAN_REJECTED",
20257
+ "APP_NOTIFICATION"
20198
20258
  ]);
20199
20259
  var LCNNotificationMessageValidator = external_exports.object({
20200
20260
  title: external_exports.string().optional(),
@@ -20232,7 +20292,10 @@ var LCNNotificationDataValidator = external_exports.object({
20232
20292
  var LCNNotificationValidator = external_exports.object({
20233
20293
  type: LCNNotificationTypeEnumValidator,
20234
20294
  to: LCNProfileValidator.partial().and(external_exports.object({ did: external_exports.string() })),
20235
- from: LCNProfileValidator.partial().and(external_exports.object({ did: external_exports.string() })),
20295
+ from: external_exports.union([
20296
+ external_exports.string(),
20297
+ LCNProfileValidator.partial().and(external_exports.object({ did: external_exports.string() }))
20298
+ ]),
20236
20299
  message: LCNNotificationMessageValidator.optional(),
20237
20300
  data: LCNNotificationDataValidator.optional(),
20238
20301
  sent: external_exports.iso.datetime().optional(),
@@ -20337,7 +20400,12 @@ var InboxCredentialValidator = external_exports.object({
20337
20400
  signingAuthority: external_exports.object({
20338
20401
  endpoint: external_exports.string().optional(),
20339
20402
  name: external_exports.string().optional()
20340
- }).optional()
20403
+ }).optional(),
20404
+ // Guardian gate fields (all optional — absent on pre-existing credentials)
20405
+ guardianEmail: external_exports.string().email().optional(),
20406
+ guardianStatus: GuardianStatusValidator.optional(),
20407
+ guardianApprovedAt: external_exports.string().optional(),
20408
+ guardianApprovedByDid: external_exports.string().optional()
20341
20409
  });
20342
20410
  var PaginatedInboxCredentialsValidator = external_exports.object({
20343
20411
  hasMore: external_exports.boolean(),
@@ -20805,11 +20873,84 @@ var GetTemplateRecipientsEventValidator = external_exports.object({
20805
20873
  }).refine((input) => Boolean(input.templateAlias) !== Boolean(input.boostUri), {
20806
20874
  message: "Exactly one of templateAlias or boostUri is required"
20807
20875
  });
20876
+ var RequestLearnerContextEventValidator = external_exports.object({
20877
+ type: external_exports.literal("request-learner-context"),
20878
+ includeCredentials: external_exports.boolean().optional().default(true),
20879
+ includePersonalData: external_exports.boolean().optional().default(false),
20880
+ format: external_exports.enum(["prompt", "structured"]).optional().default("prompt"),
20881
+ instructions: external_exports.string().optional(),
20882
+ detailLevel: external_exports.enum(["compact", "expanded"]).optional().default("compact")
20883
+ });
20884
+ var SummaryCredentialKeywordValidator = external_exports.object({
20885
+ occupations: external_exports.array(external_exports.string()).nullable(),
20886
+ careers: external_exports.array(external_exports.string()).nullable(),
20887
+ jobs: external_exports.array(external_exports.string()).nullable(),
20888
+ skills: external_exports.array(external_exports.string()).nullable(),
20889
+ fieldOfStudy: external_exports.string().nullable()
20890
+ });
20891
+ var SummaryCredentialDataValidator = external_exports.object({
20892
+ title: external_exports.string().describe("Short, concise title for the learning session or credential"),
20893
+ summary: external_exports.string().describe("Comprehensive summary of what happened during the session"),
20894
+ learned: external_exports.array(external_exports.string()).describe("Bullet points of key knowledge gained"),
20895
+ skills: external_exports.array(
20896
+ external_exports.object({
20897
+ title: external_exports.string().describe("Name of the skill category"),
20898
+ description: external_exports.string().describe("Detailed description of what this skill category involves")
20899
+ })
20900
+ ).describe("Categorized skills learned during the session"),
20901
+ nextSteps: external_exports.array(
20902
+ external_exports.object({
20903
+ title: external_exports.string().describe("Title of the suggested next step"),
20904
+ description: external_exports.string().describe("Description explaining why this next step is recommended"),
20905
+ keywords: SummaryCredentialKeywordValidator
20906
+ })
20907
+ ).describe("Recommended follow-up activities or learning modules"),
20908
+ reflections: external_exports.array(
20909
+ external_exports.object({
20910
+ title: external_exports.string().describe("Title of the reflection"),
20911
+ description: external_exports.string().describe("Detailed description of what this reflection involves")
20912
+ })
20913
+ ).describe("Reflections on the learning experience")
20914
+ });
20915
+ var SendAiSessionCredentialEventValidator = external_exports.object({
20916
+ type: external_exports.literal("send-ai-session-credential"),
20917
+ sessionTitle: external_exports.string(),
20918
+ summaryData: SummaryCredentialDataValidator,
20919
+ metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
20920
+ });
20921
+ var SendNotificationEventValidator = external_exports.object({
20922
+ type: external_exports.literal("send-notification"),
20923
+ title: external_exports.string().optional(),
20924
+ body: external_exports.string().optional(),
20925
+ actionPath: external_exports.string().optional(),
20926
+ category: external_exports.string().optional(),
20927
+ priority: external_exports.enum(["normal", "high"]).optional()
20928
+ });
20929
+ var counterKeyValidator = external_exports.string().min(1).max(64).regex(/^[a-zA-Z0-9_-]+$/, "Key must be alphanumeric with _ or -");
20930
+ var IncrementCounterEventValidator = external_exports.object({
20931
+ type: external_exports.literal("increment-counter"),
20932
+ key: counterKeyValidator,
20933
+ amount: external_exports.number().int().finite()
20934
+ });
20935
+ var GetCounterEventValidator = external_exports.object({
20936
+ type: external_exports.literal("get-counter"),
20937
+ key: counterKeyValidator
20938
+ });
20939
+ var GetCountersEventValidator = external_exports.object({
20940
+ type: external_exports.literal("get-counters"),
20941
+ keys: external_exports.array(counterKeyValidator).min(1).max(50).optional()
20942
+ });
20808
20943
  var AppEventValidator = external_exports.discriminatedUnion("type", [
20809
20944
  SendCredentialEventValidator,
20810
20945
  CheckCredentialEventValidator,
20811
20946
  CheckIssuanceStatusEventValidator,
20812
- GetTemplateRecipientsEventValidator
20947
+ GetTemplateRecipientsEventValidator,
20948
+ RequestLearnerContextEventValidator,
20949
+ SendAiSessionCredentialEventValidator,
20950
+ SendNotificationEventValidator,
20951
+ IncrementCounterEventValidator,
20952
+ GetCounterEventValidator,
20953
+ GetCountersEventValidator
20813
20954
  ]);
20814
20955
  var AppEventInputValidator = external_exports.object({
20815
20956
  listingId: external_exports.string(),
@@ -20840,7 +20981,7 @@ var CredentialActivityValidator = external_exports.object({
20840
20981
  activityId: external_exports.string(),
20841
20982
  eventType: CredentialActivityEventTypeValidator,
20842
20983
  timestamp: external_exports.string(),
20843
- actorProfileId: external_exports.string(),
20984
+ actorProfileId: external_exports.string().optional(),
20844
20985
  recipientType: CredentialActivityRecipientTypeValidator,
20845
20986
  recipientIdentifier: external_exports.string(),
20846
20987
  boostUri: external_exports.string().optional(),
@@ -21255,7 +21396,28 @@ var getLearnCloudPlugin = /* @__PURE__ */ __name(async (initialLearnCard, url2,
21255
21396
  ...recipients
21256
21397
  ]);
21257
21398
  return client.storage.store.mutate({ item: jwe });
21258
- }, "uploadEncrypted")
21399
+ }, "uploadEncrypted"),
21400
+ delete: /* @__PURE__ */ __name(async (_learnCard, uri) => {
21401
+ _learnCard.debug?.("learnCard.store['LearnCloud'].delete", { uri });
21402
+ let deleted = false;
21403
+ try {
21404
+ deleted = Boolean(await client.storage.delete.mutate({ uri }));
21405
+ } catch (error46) {
21406
+ _learnCard.debug?.("LearnCloud store.delete storage.delete failed", error46);
21407
+ }
21408
+ if (!deleted) return false;
21409
+ try {
21410
+ const records = await _learnCard.index.LearnCloud.get({ uri });
21411
+ for (const record2 of records) {
21412
+ await _learnCard.index.LearnCloud.remove(record2.id, {
21413
+ cache: "skip-cache"
21414
+ });
21415
+ }
21416
+ } catch (error46) {
21417
+ _learnCard.debug?.("LearnCloud store.delete index cleanup failed", error46);
21418
+ }
21419
+ return true;
21420
+ }, "delete")
21259
21421
  },
21260
21422
  index: {
21261
21423
  get: /* @__PURE__ */ __name(async (_learnCard, query) => {