@learncard/network-plugin 2.10.15 → 2.11.2

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.
@@ -13500,6 +13500,42 @@ var UnsignedAchievementCredentialValidator = UnsignedVCValidator.extend({
13500
13500
  var AchievementCredentialValidator = UnsignedAchievementCredentialValidator.extend({
13501
13501
  proof: ProofValidator.or(ProofValidator.array())
13502
13502
  });
13503
+ var AssociationTypeValidator = external_exports.enum([
13504
+ "exactMatchOf",
13505
+ "extends",
13506
+ "isChildOf",
13507
+ "isParentOf",
13508
+ "isPartOf",
13509
+ "isPeerOf",
13510
+ "isRelatedTo",
13511
+ "precedes",
13512
+ "replacedBy"
13513
+ ]).or(external_exports.string());
13514
+ var AssociationValidator = external_exports.object({
13515
+ type: external_exports.string().array().nonempty(),
13516
+ associationType: AssociationTypeValidator,
13517
+ sourceId: external_exports.string().optional(),
13518
+ targetId: external_exports.string()
13519
+ }).catchall(external_exports.any());
13520
+ var ClrSubjectValidator = external_exports.object({
13521
+ id: external_exports.string().optional(),
13522
+ type: external_exports.string().array().nonempty(),
13523
+ identifier: external_exports.any().array().optional(),
13524
+ achievement: AchievementValidator.array().optional(),
13525
+ association: AssociationValidator.array().optional(),
13526
+ verifiableCredential: external_exports.any().array().optional()
13527
+ }).catchall(external_exports.any());
13528
+ var UnsignedClrCredentialValidator = UnsignedVCValidator.extend({
13529
+ name: external_exports.string().optional(),
13530
+ description: external_exports.string().optional(),
13531
+ image: ImageValidator.optional(),
13532
+ credentialSubject: ClrSubjectValidator.or(ClrSubjectValidator.array()),
13533
+ endorsement: EndorsementCredentialValidator.array().optional(),
13534
+ partial: external_exports.boolean().optional()
13535
+ });
13536
+ var ClrCredentialValidator = UnsignedClrCredentialValidator.extend({
13537
+ proof: ProofValidator.or(ProofValidator.array())
13538
+ });
13503
13539
  var VerificationCheckValidator = external_exports.object({
13504
13540
  checks: external_exports.string().array(),
13505
13541
  warnings: external_exports.string().array(),
@@ -13851,10 +13887,16 @@ var SendBrandingOptionsValidator = external_exports.object({
13851
13887
  credentialName: external_exports.string().optional().describe("Display name for the credential"),
13852
13888
  recipientName: external_exports.string().optional().describe("Name of the recipient for personalization")
13853
13889
  });
13890
+ var GuardianStatusValidator = external_exports.enum([
13891
+ "AWAITING_GUARDIAN",
13892
+ "GUARDIAN_APPROVED",
13893
+ "GUARDIAN_REJECTED"
13894
+ ]);
13854
13895
  var SendOptionsValidator = external_exports.object({
13855
13896
  webhookUrl: external_exports.string().url().optional().describe("Webhook URL to receive claim notifications"),
13856
13897
  suppressDelivery: external_exports.boolean().optional().describe("If true, returns claimUrl without sending email/SMS"),
13857
- branding: SendBrandingOptionsValidator.optional().describe("Branding for email/SMS delivery")
13898
+ branding: SendBrandingOptionsValidator.optional().describe("Branding for email/SMS delivery"),
13899
+ guardianEmail: external_exports.string().email().optional().describe("Guardian email that must approve before student can claim")
13858
13900
  });
13859
13901
  var SendBoostInputValidator = external_exports.object({
13860
13902
  type: external_exports.literal("boost"),
@@ -13871,11 +13913,25 @@ var SendBoostInputValidator = external_exports.object({
13871
13913
  }).refine((data) => data.templateUri || data.template || data.signedCredential, {
13872
13914
  message: "Either templateUri, template, or signedCredential must be provided.",
13873
13915
  path: ["templateUri"]
13874
- });
13916
+ }).refine(
13917
+ (data) => {
13918
+ if (data.options?.guardianEmail) {
13919
+ return data.options.guardianEmail.toLowerCase() !== data.recipient.toLowerCase();
13920
+ }
13921
+ return true;
13922
+ },
13923
+ {
13924
+ message: "guardianEmail must differ from recipient (self-approval not allowed)",
13925
+ path: ["options", "guardianEmail"]
13926
+ }
13927
+ );
13875
13928
  var SendInboxResponseValidator = external_exports.object({
13876
13929
  issuanceId: external_exports.string(),
13877
13930
  status: external_exports.enum(["PENDING", "ISSUED", "EXPIRED", "DELIVERED", "CLAIMED"]),
13878
- claimUrl: external_exports.string().url().optional().describe("Present when suppressDelivery=true")
13931
+ claimUrl: external_exports.string().url().optional().describe("Present when suppressDelivery=true"),
13932
+ guardianStatus: GuardianStatusValidator.optional().describe(
13933
+ "Present when guardianEmail was specified"
13934
+ )
13879
13935
  });
13880
13936
  var SendBoostResponseValidator = external_exports.object({
13881
13937
  type: external_exports.literal("boost"),
@@ -14112,7 +14168,11 @@ var LCNNotificationTypeEnumValidator = external_exports.enum([
14112
14168
  "APP_LISTING_APPROVED",
14113
14169
  "APP_LISTING_REJECTED",
14114
14170
  "APP_LISTING_WITHDRAWN",
14115
- "DEVICE_LINK_REQUEST"
14171
+ "DEVICE_LINK_REQUEST",
14172
+ "GUARDIAN_APPROVAL_PENDING",
14173
+ "GUARDIAN_APPROVED",
14174
+ "GUARDIAN_REJECTED",
14175
+ "APP_NOTIFICATION"
14116
14176
  ]);
14117
14177
  var LCNNotificationMessageValidator = external_exports.object({
14118
14178
  title: external_exports.string().optional(),
@@ -14150,7 +14210,10 @@ var LCNNotificationDataValidator = external_exports.object({
14150
14210
  var LCNNotificationValidator = external_exports.object({
14151
14211
  type: LCNNotificationTypeEnumValidator,
14152
14212
  to: LCNProfileValidator.partial().and(external_exports.object({ did: external_exports.string() })),
14153
- from: LCNProfileValidator.partial().and(external_exports.object({ did: external_exports.string() })),
14213
+ from: external_exports.union([
14214
+ external_exports.string(),
14215
+ LCNProfileValidator.partial().and(external_exports.object({ did: external_exports.string() }))
14216
+ ]),
14154
14217
  message: LCNNotificationMessageValidator.optional(),
14155
14218
  data: LCNNotificationDataValidator.optional(),
14156
14219
  sent: external_exports.iso.datetime().optional(),
@@ -14255,7 +14318,12 @@ var InboxCredentialValidator = external_exports.object({
14255
14318
  signingAuthority: external_exports.object({
14256
14319
  endpoint: external_exports.string().optional(),
14257
14320
  name: external_exports.string().optional()
14258
- }).optional()
14321
+ }).optional(),
14322
+ // Guardian gate fields (all optional — absent on pre-existing credentials)
14323
+ guardianEmail: external_exports.string().email().optional(),
14324
+ guardianStatus: GuardianStatusValidator.optional(),
14325
+ guardianApprovedAt: external_exports.string().optional(),
14326
+ guardianApprovedByDid: external_exports.string().optional()
14259
14327
  });
14260
14328
  var PaginatedInboxCredentialsValidator = external_exports.object({
14261
14329
  hasMore: external_exports.boolean(),
@@ -14723,11 +14791,84 @@ var GetTemplateRecipientsEventValidator = external_exports.object({
14723
14791
  }).refine((input) => Boolean(input.templateAlias) !== Boolean(input.boostUri), {
14724
14792
  message: "Exactly one of templateAlias or boostUri is required"
14725
14793
  });
14794
+ var RequestLearnerContextEventValidator = external_exports.object({
14795
+ type: external_exports.literal("request-learner-context"),
14796
+ includeCredentials: external_exports.boolean().optional().default(true),
14797
+ includePersonalData: external_exports.boolean().optional().default(false),
14798
+ format: external_exports.enum(["prompt", "structured"]).optional().default("prompt"),
14799
+ instructions: external_exports.string().optional(),
14800
+ detailLevel: external_exports.enum(["compact", "expanded"]).optional().default("compact")
14801
+ });
14802
+ var SummaryCredentialKeywordValidator = external_exports.object({
14803
+ occupations: external_exports.array(external_exports.string()).nullable(),
14804
+ careers: external_exports.array(external_exports.string()).nullable(),
14805
+ jobs: external_exports.array(external_exports.string()).nullable(),
14806
+ skills: external_exports.array(external_exports.string()).nullable(),
14807
+ fieldOfStudy: external_exports.string().nullable()
14808
+ });
14809
+ var SummaryCredentialDataValidator = external_exports.object({
14810
+ title: external_exports.string().describe("Short, concise title for the learning session or credential"),
14811
+ summary: external_exports.string().describe("Comprehensive summary of what happened during the session"),
14812
+ learned: external_exports.array(external_exports.string()).describe("Bullet points of key knowledge gained"),
14813
+ skills: external_exports.array(
14814
+ external_exports.object({
14815
+ title: external_exports.string().describe("Name of the skill category"),
14816
+ description: external_exports.string().describe("Detailed description of what this skill category involves")
14817
+ })
14818
+ ).describe("Categorized skills learned during the session"),
14819
+ nextSteps: external_exports.array(
14820
+ external_exports.object({
14821
+ title: external_exports.string().describe("Title of the suggested next step"),
14822
+ description: external_exports.string().describe("Description explaining why this next step is recommended"),
14823
+ keywords: SummaryCredentialKeywordValidator
14824
+ })
14825
+ ).describe("Recommended follow-up activities or learning modules"),
14826
+ reflections: external_exports.array(
14827
+ external_exports.object({
14828
+ title: external_exports.string().describe("Title of the reflection"),
14829
+ description: external_exports.string().describe("Detailed description of what this reflection involves")
14830
+ })
14831
+ ).describe("Reflections on the learning experience")
14832
+ });
14833
+ var SendAiSessionCredentialEventValidator = external_exports.object({
14834
+ type: external_exports.literal("send-ai-session-credential"),
14835
+ sessionTitle: external_exports.string(),
14836
+ summaryData: SummaryCredentialDataValidator,
14837
+ metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
14838
+ });
14839
+ var SendNotificationEventValidator = external_exports.object({
14840
+ type: external_exports.literal("send-notification"),
14841
+ title: external_exports.string().optional(),
14842
+ body: external_exports.string().optional(),
14843
+ actionPath: external_exports.string().optional(),
14844
+ category: external_exports.string().optional(),
14845
+ priority: external_exports.enum(["normal", "high"]).optional()
14846
+ });
14847
+ var counterKeyValidator = external_exports.string().min(1).max(64).regex(/^[a-zA-Z0-9_-]+$/, "Key must be alphanumeric with _ or -");
14848
+ var IncrementCounterEventValidator = external_exports.object({
14849
+ type: external_exports.literal("increment-counter"),
14850
+ key: counterKeyValidator,
14851
+ amount: external_exports.number().int().finite()
14852
+ });
14853
+ var GetCounterEventValidator = external_exports.object({
14854
+ type: external_exports.literal("get-counter"),
14855
+ key: counterKeyValidator
14856
+ });
14857
+ var GetCountersEventValidator = external_exports.object({
14858
+ type: external_exports.literal("get-counters"),
14859
+ keys: external_exports.array(counterKeyValidator).min(1).max(50).optional()
14860
+ });
14726
14861
  var AppEventValidator = external_exports.discriminatedUnion("type", [
14727
14862
  SendCredentialEventValidator,
14728
14863
  CheckCredentialEventValidator,
14729
14864
  CheckIssuanceStatusEventValidator,
14730
- GetTemplateRecipientsEventValidator
14865
+ GetTemplateRecipientsEventValidator,
14866
+ RequestLearnerContextEventValidator,
14867
+ SendAiSessionCredentialEventValidator,
14868
+ SendNotificationEventValidator,
14869
+ IncrementCounterEventValidator,
14870
+ GetCounterEventValidator,
14871
+ GetCountersEventValidator
14731
14872
  ]);
14732
14873
  var AppEventInputValidator = external_exports.object({
14733
14874
  listingId: external_exports.string(),
@@ -14758,7 +14899,7 @@ var CredentialActivityValidator = external_exports.object({
14758
14899
  activityId: external_exports.string(),
14759
14900
  eventType: CredentialActivityEventTypeValidator,
14760
14901
  timestamp: external_exports.string(),
14761
- actorProfileId: external_exports.string(),
14902
+ actorProfileId: external_exports.string().optional(),
14762
14903
  recipientType: CredentialActivityRecipientTypeValidator,
14763
14904
  recipientIdentifier: external_exports.string(),
14764
14905
  boostUri: external_exports.string().optional(),
@@ -15279,24 +15420,63 @@ var escapeJsonStringValue = /* @__PURE__ */ __name((value) => {
15279
15420
  if (value === null || value === void 0) return "";
15280
15421
  return String(value).replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t").replace(/\f/g, "\\f").replace(/[\b]/g, "\\b");
15281
15422
  }, "escapeJsonStringValue");
15423
+ var prepareTemplateValue = /* @__PURE__ */ __name((value) => {
15424
+ if (value === null || value === void 0) return "";
15425
+ if (Array.isArray(value)) return value.map(prepareTemplateValue);
15426
+ if (typeof value === "object") {
15427
+ return Object.fromEntries(
15428
+ Object.entries(value).map(([key, nestedValue]) => [
15429
+ key,
15430
+ prepareTemplateValue(nestedValue)
15431
+ ])
15432
+ );
15433
+ }
15434
+ if (typeof value === "string") return escapeJsonStringValue(value);
15435
+ return value;
15436
+ }, "prepareTemplateValue");
15282
15437
  var prepareTemplateData = /* @__PURE__ */ __name((templateData) => {
15283
15438
  const prepared = {};
15284
15439
  for (const [key, value] of Object.entries(templateData)) {
15285
- prepared[key] = escapeJsonStringValue(value);
15440
+ prepared[key] = prepareTemplateValue(value);
15286
15441
  }
15287
15442
  return prepared;
15288
15443
  }, "prepareTemplateData");
15289
15444
  var renderTemplateJson = /* @__PURE__ */ __name((jsonString, templateData) => {
15290
15445
  const preparedData = prepareTemplateData(templateData);
15291
- const unescapedTemplate = jsonString.replace(/\{\{([^{}]+)\}\}/g, "{{{$1}}}");
15446
+ const unescapedTemplate = jsonString.replace(/\{\{\s*([^{}]+?)\s*\}\}/g, (match, tag) => {
15447
+ const trimmedTag = tag.trim();
15448
+ return /^[#^/!>&=]/.test(trimmedTag) ? match : `{{{${trimmedTag}}}}`;
15449
+ });
15292
15450
  return mustache_default.render(unescapedTemplate, preparedData);
15293
15451
  }, "renderTemplateJson");
15452
+ var hasDynamicEvidenceTemplate = /* @__PURE__ */ __name((jsonString) => {
15453
+ return /\{\{\s*[#^/]?\s*evidence(?:[.\s}]|$)/.test(jsonString);
15454
+ }, "hasDynamicEvidenceTemplate");
15455
+ var appendTemplateEvidence = /* @__PURE__ */ __name((boost, templateData, allowAutoAppend = true) => {
15456
+ if (!allowAutoAppend) return boost;
15457
+ const templateEvidence = templateData?.evidence;
15458
+ if (!templateEvidence) return boost;
15459
+ const normalizedTemplateEvidence = (Array.isArray(templateEvidence) ? templateEvidence : [templateEvidence]).map((evidenceItem) => {
15460
+ if (evidenceItem && typeof evidenceItem === "object" && "last" in evidenceItem) {
15461
+ const { last, ...rest } = evidenceItem;
15462
+ return rest;
15463
+ }
15464
+ return evidenceItem;
15465
+ });
15466
+ if (normalizedTemplateEvidence.length === 0) return boost;
15467
+ const existingEvidence = boost.evidence ? Array.isArray(boost.evidence) ? boost.evidence : [boost.evidence] : [];
15468
+ return {
15469
+ ...boost,
15470
+ evidence: [...existingEvidence, ...normalizedTemplateEvidence]
15471
+ };
15472
+ }, "appendTemplateEvidence");
15294
15473
  var hasDid = /* @__PURE__ */ __name((profile) => {
15295
15474
  return !!profile && "did" in profile && typeof profile.did === "string" && profile.did.length > 0;
15296
15475
  }, "hasDid");
15297
15476
  async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, options) {
15298
15477
  const apiToken = typeof apiTokenOrOptions === "string" ? apiTokenOrOptions : void 0;
15299
15478
  const guardianApprovalGetter = (typeof apiTokenOrOptions === "object" ? apiTokenOrOptions?.guardianApprovalGetter : void 0) ?? options?.guardianApprovalGetter;
15479
+ const extraHeaders = (typeof apiTokenOrOptions === "object" ? apiTokenOrOptions?.extraHeaders : void 0) ?? options?.extraHeaders;
15300
15480
  let did = "";
15301
15481
  try {
15302
15482
  const idPlane = learnCard?.id;
@@ -15307,7 +15487,7 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
15307
15487
  learnCard?.debug?.("LCN: no local DID available at init; will fetch from profile");
15308
15488
  }
15309
15489
  learnCard?.debug?.("Adding LearnCardNetwork Plugin");
15310
- const client = apiToken ? await (0, import_network_brain_client.getApiTokenClient)(url2, apiToken, guardianApprovalGetter) : await (0, import_network_brain_client.getClient)(
15490
+ const client = apiToken ? await (0, import_network_brain_client.getApiTokenClient)(url2, apiToken, guardianApprovalGetter, extraHeaders) : await (0, import_network_brain_client.getClient)(
15311
15491
  url2,
15312
15492
  async (challenge) => {
15313
15493
  const jwt2 = await learnCard.invoke.getDidAuthVp({
@@ -15317,7 +15497,8 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
15317
15497
  if (typeof jwt2 !== "string") throw new Error("Error getting DID-Auth-JWT!");
15318
15498
  return jwt2;
15319
15499
  },
15320
- guardianApprovalGetter
15500
+ guardianApprovalGetter,
15501
+ extraHeaders
15321
15502
  );
15322
15503
  let userData;
15323
15504
  learnCard?.debug?.("LCN: initial getProfile query starting", { apiToken: !!apiToken });
@@ -15361,6 +15542,43 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
15361
15542
  return _learnCard.invoke.resolveFromLCN(boostUri);
15362
15543
  }
15363
15544
  }, "getBoostTemplateForIssuance");
15545
+ const getInboxEndpointForDid = /* @__PURE__ */ __name(async (_learnCard, recipientDid) => {
15546
+ const serviceUrl = new URL(url2);
15547
+ const serviceDomain = `${serviceUrl.hostname}${serviceUrl.port ? `%3A${serviceUrl.port}` : ""}`;
15548
+ const localServiceDid = `did:web:${serviceDomain}`;
15549
+ const getInferredServiceDid = /* @__PURE__ */ __name((did2) => {
15550
+ if (!did2.startsWith("did:web:")) return null;
15551
+ const parts = did2.split(":");
15552
+ if (parts.length < 3) return null;
15553
+ const pathMarkerIndex = parts.findIndex((part, index) => {
15554
+ if (index < 3) return false;
15555
+ return part === "users" || part === "app" || part === "manager";
15556
+ });
15557
+ if (pathMarkerIndex === -1) {
15558
+ return did2;
15559
+ }
15560
+ return `did:web:${parts.slice(2, pathMarkerIndex).join(":")}`;
15561
+ }, "getInferredServiceDid");
15562
+ const getInboxService = /* @__PURE__ */ __name((didDoc2) => didDoc2.service?.find((service) => {
15563
+ const type = Array.isArray(service.type) ? service.type[0] : service.type;
15564
+ return type === "UniversalInboxService" || type === "LearnCardInboxService";
15565
+ }), "getInboxService");
15566
+ const inferredServiceDid = getInferredServiceDid(recipientDid);
15567
+ if (inferredServiceDid === localServiceDid) {
15568
+ return `${serviceUrl.origin}/api/inbox/receive`;
15569
+ }
15570
+ const didDoc = await _learnCard.invoke.resolveDid(recipientDid);
15571
+ const inboxService = getInboxService(didDoc);
15572
+ if ((inboxService?.serviceDid || inferredServiceDid) === localServiceDid) {
15573
+ return `${serviceUrl.origin}/api/inbox/receive`;
15574
+ }
15575
+ if (!inboxService?.serviceEndpoint) {
15576
+ throw new Error(
15577
+ `Recipient DID ${recipientDid} does not have a UniversalInboxService endpoint in its DID document`
15578
+ );
15579
+ }
15580
+ return inboxService.serviceEndpoint;
15581
+ }, "getInboxEndpointForDid");
15364
15582
  return {
15365
15583
  name: "LearnCard Network",
15366
15584
  displayName: "LearnCard Network",
@@ -15418,7 +15636,11 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
15418
15636
  }
15419
15637
  const jwe = await _learnCard.invoke.createDagJwe(credential, recipientsList);
15420
15638
  return client.storage.store.mutate({ item: jwe });
15421
- }, "uploadEncrypted")
15639
+ }, "uploadEncrypted"),
15640
+ delete: /* @__PURE__ */ __name(async (_learnCard, uri) => {
15641
+ await ensureUser();
15642
+ return client.credential.deleteCredential.mutate({ uri });
15643
+ }, "delete")
15422
15644
  },
15423
15645
  methods: {
15424
15646
  createProfile: /* @__PURE__ */ __name(async (_learnCard, profile) => {
@@ -15471,6 +15693,22 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
15471
15693
  getManagedProfiles: /* @__PURE__ */ __name(async (_learnCard, options2 = {}) => {
15472
15694
  return client.profileManager.getManagedProfiles.query(options2);
15473
15695
  }, "getManagedProfiles"),
15696
+ claimPendingGuardianLinks: /* @__PURE__ */ __name(async () => {
15697
+ await ensureUser();
15698
+ return client.inbox.claimPendingGuardianLinks.mutate({});
15699
+ }, "claimPendingGuardianLinks"),
15700
+ getMyManagedChildren: /* @__PURE__ */ __name(async () => {
15701
+ await ensureUser();
15702
+ return client.profileManager.getMyManagedChildren.query();
15703
+ }, "getMyManagedChildren"),
15704
+ getMyGuardians: /* @__PURE__ */ __name(async () => {
15705
+ await ensureUser();
15706
+ return client.profileManager.getMyGuardians.query();
15707
+ }, "getMyGuardians"),
15708
+ removeManagesRelationship: /* @__PURE__ */ __name(async (_learnCard, profileId) => {
15709
+ await ensureUser();
15710
+ return client.profileManager.removeManagesRelationship.mutate({ profileId });
15711
+ }, "removeManagesRelationship"),
15474
15712
  getManagedServiceProfiles: /* @__PURE__ */ __name(async (_learnCard, options2 = {}) => {
15475
15713
  await ensureUser();
15476
15714
  return client.profile.getManagedServiceProfiles.query(options2);
@@ -15605,6 +15843,49 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
15605
15843
  }, "getBlockedProfiles"),
15606
15844
  sendCredential: /* @__PURE__ */ __name(async (_learnCard, profileId, vc, metadataOrEncrypt, encrypt) => {
15607
15845
  await ensureUser();
15846
+ if (profileId.startsWith("did:web:")) {
15847
+ const inboxEndpoint = await getInboxEndpointForDid(_learnCard, profileId);
15848
+ let metadata2;
15849
+ if (typeof metadataOrEncrypt === "object") {
15850
+ metadata2 = metadataOrEncrypt;
15851
+ }
15852
+ const myProfile = await client.profile.getProfile.query();
15853
+ const issuerDid = myProfile?.did || await client.utilities.getDid.query();
15854
+ const issuerDisplayName = myProfile?.displayName || "Unknown Issuer";
15855
+ const signedCredential = await _learnCard.invoke.issueCredential(vc);
15856
+ const didAuthJwt = await _learnCard.invoke.getDidAuthVp({
15857
+ proofFormat: "jwt",
15858
+ challenge: `inbox-federation-${crypto.randomUUID()}`
15859
+ });
15860
+ let receiveUrl = inboxEndpoint;
15861
+ if (receiveUrl.includes("localhost")) {
15862
+ receiveUrl = receiveUrl.replace("https://", "http://");
15863
+ }
15864
+ const response = await fetch(receiveUrl, {
15865
+ method: "POST",
15866
+ headers: {
15867
+ "Content-Type": "application/json",
15868
+ "Authorization": `Bearer ${didAuthJwt}`
15869
+ },
15870
+ body: JSON.stringify({
15871
+ recipientDid: profileId,
15872
+ credential: signedCredential,
15873
+ issuerDid,
15874
+ issuerDisplayName,
15875
+ configuration: {
15876
+ ...metadata2,
15877
+ federatedFrom: issuerDid
15878
+ }
15879
+ }),
15880
+ signal: AbortSignal.timeout(3e4)
15881
+ });
15882
+ if (!response.ok) {
15883
+ const error46 = await response.text();
15884
+ throw new Error(`Federation failed: ${error46}`);
15885
+ }
15886
+ const result = await response.json();
15887
+ return result.issuanceId;
15888
+ }
15608
15889
  let metadata;
15609
15890
  let shouldEncrypt = true;
15610
15891
  if (typeof metadataOrEncrypt === "boolean") {
@@ -15942,10 +16223,16 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
15942
16223
  }
15943
16224
  if (boost?.type?.includes("BoostCredential")) boost.boostId = boostUri;
15944
16225
  if (typeof options2 === "object" && options2.templateData && Object.keys(options2.templateData).length > 0) {
16226
+ const boostString = JSON.stringify(boost);
16227
+ const allowAutoAppendEvidence = !hasDynamicEvidenceTemplate(boostString);
15945
16228
  try {
15946
- const boostString = JSON.stringify(boost);
15947
16229
  const rendered = renderTemplateJson(boostString, options2.templateData);
15948
16230
  boost = JSON.parse(rendered);
16231
+ boost = appendTemplateEvidence(
16232
+ boost,
16233
+ options2.templateData,
16234
+ allowAutoAppendEvidence
16235
+ );
15949
16236
  } catch (error46) {
15950
16237
  throw new Error(
15951
16238
  `Template substitution failed: ${error46 instanceof Error ? error46.message : "Unknown error"}. Please check your templateData variables and ensure the rendered output is valid JSON.`
@@ -16025,6 +16312,61 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
16025
16312
  const isDid = recipient.startsWith("did:");
16026
16313
  const isEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(recipient);
16027
16314
  const isPhone = /^\+?[\d\s-]{10,}$/.test(recipient.replace(/[\s-]/g, ""));
16315
+ const serviceUrl = new URL(url2);
16316
+ const serviceDomain = `${serviceUrl.hostname}${serviceUrl.port ? `%3A${serviceUrl.port}` : ""}`;
16317
+ const recipientDomain = recipient.startsWith("did:web:") ? recipient.split(":")[2] : void 0;
16318
+ const isRemoteDidWebRecipient = recipient.startsWith("did:web:") && recipientDomain !== serviceDomain;
16319
+ if (isRemoteDidWebRecipient && input.templateUri) {
16320
+ const boostRecord = await _learnCard.invoke.getBoost(input.templateUri);
16321
+ let boost = boostRecord.boost;
16322
+ const boostString = JSON.stringify(boost);
16323
+ const allowAutoAppendEvidence = !hasDynamicEvidenceTemplate(boostString);
16324
+ if (input.templateData && Object.keys(input.templateData).length > 0) {
16325
+ const rendered = renderTemplateJson(boostString, input.templateData);
16326
+ boost = JSON.parse(rendered);
16327
+ boost = appendTemplateEvidence(
16328
+ boost,
16329
+ input.templateData,
16330
+ allowAutoAppendEvidence
16331
+ );
16332
+ }
16333
+ if ((0, import_helpers.isVC2Format)(boost)) {
16334
+ boost.validFrom = (/* @__PURE__ */ new Date()).toISOString();
16335
+ } else {
16336
+ boost.issuanceDate = (/* @__PURE__ */ new Date()).toISOString();
16337
+ }
16338
+ boost.issuer = _learnCard.id.did();
16339
+ if (Array.isArray(boost.credentialSubject)) {
16340
+ boost.credentialSubject = boost.credentialSubject.map((subject) => ({
16341
+ ...subject,
16342
+ id: recipient
16343
+ }));
16344
+ } else {
16345
+ boost.credentialSubject = {
16346
+ ...boost.credentialSubject,
16347
+ id: recipient
16348
+ };
16349
+ }
16350
+ if (boost.type?.includes("BoostCredential")) {
16351
+ boost.boostId = input.templateUri;
16352
+ }
16353
+ const signedCredential = await _learnCard.invoke.issueCredential(boost);
16354
+ const credentialUri = await _learnCard.invoke.sendCredential(
16355
+ recipient,
16356
+ signedCredential,
16357
+ {
16358
+ boostUri: input.templateUri,
16359
+ templateData: input.templateData,
16360
+ integrationId: input.integrationId
16361
+ }
16362
+ );
16363
+ return {
16364
+ type: "boost",
16365
+ credentialUri,
16366
+ uri: input.templateUri,
16367
+ activityId: ""
16368
+ };
16369
+ }
16028
16370
  const canIssueLocally = "issueCredential" in _learnCard.invoke;
16029
16371
  const isDirectRecipient = isDid || !isEmail && !isPhone;
16030
16372
  if (canIssueLocally && isDirectRecipient && input.templateUri) {
@@ -16039,19 +16381,24 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
16039
16381
  targetDid = recipient;
16040
16382
  } else {
16041
16383
  const targetProfile = await _learnCard.invoke.getProfile(recipient);
16042
- if (!hasDid(targetProfile))
16043
- return client.boost.send.mutate(input);
16384
+ if (!hasDid(targetProfile)) return client.boost.send.mutate(input);
16044
16385
  targetDid = targetProfile.did;
16045
16386
  }
16046
16387
  let boost = data.data;
16388
+ const boostString = JSON.stringify(boost);
16389
+ const allowAutoAppendEvidence = !hasDynamicEvidenceTemplate(boostString);
16047
16390
  if (input.templateData && Object.keys(input.templateData).length > 0) {
16048
16391
  try {
16049
- const boostString = JSON.stringify(boost);
16050
16392
  const rendered = renderTemplateJson(
16051
16393
  boostString,
16052
16394
  input.templateData
16053
16395
  );
16054
16396
  boost = JSON.parse(rendered);
16397
+ boost = appendTemplateEvidence(
16398
+ boost,
16399
+ input.templateData,
16400
+ allowAutoAppendEvidence
16401
+ );
16055
16402
  } catch (error46) {
16056
16403
  throw new Error(
16057
16404
  `Failed to apply template data: ${error46 instanceof Error ? error46.message : "Unknown error"}`
@@ -16078,6 +16425,23 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
16078
16425
  if (boost?.type?.includes("BoostCredential"))
16079
16426
  boost.boostId = input.templateUri;
16080
16427
  const signedCredential = await _learnCard.invoke.issueCredential(boost);
16428
+ if (isDid && recipient.startsWith("did:web:")) {
16429
+ const credentialUri = await _learnCard.invoke.sendCredential(
16430
+ recipient,
16431
+ signedCredential,
16432
+ {
16433
+ boostUri: input.templateUri,
16434
+ templateData: input.templateData,
16435
+ integrationId: input.integrationId
16436
+ }
16437
+ );
16438
+ return {
16439
+ type: "boost",
16440
+ credentialUri,
16441
+ uri: input.templateUri,
16442
+ activityId: ""
16443
+ };
16444
+ }
16081
16445
  return client.boost.send.mutate({
16082
16446
  ...input,
16083
16447
  signedCredential
@@ -16353,6 +16717,26 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
16353
16717
  approveGuardianRequestByPath: /* @__PURE__ */ __name(async (_learnCard, token) => {
16354
16718
  return client.inbox.approveGuardianRequestByPath.query({ token });
16355
16719
  }, "approveGuardianRequestByPath"),
16720
+ getGuardianPendingCredential: /* @__PURE__ */ __name(async (_learnCard, token) => {
16721
+ return client.inbox.getGuardianPendingCredential.query({ token });
16722
+ }, "getGuardianPendingCredential"),
16723
+ sendGuardianChallenge: /* @__PURE__ */ __name(async (_learnCard, token) => {
16724
+ return client.inbox.sendGuardianChallenge.mutate({ token });
16725
+ }, "sendGuardianChallenge"),
16726
+ approveGuardianCredential: /* @__PURE__ */ __name(async (_learnCard, token, otpCode) => {
16727
+ return client.inbox.approveGuardianCredential.mutate({ token, otpCode });
16728
+ }, "approveGuardianCredential"),
16729
+ rejectGuardianCredential: /* @__PURE__ */ __name(async (_learnCard, token, otpCode) => {
16730
+ return client.inbox.rejectGuardianCredential.mutate({ token, otpCode });
16731
+ }, "rejectGuardianCredential"),
16732
+ approveGuardianCredentialInApp: /* @__PURE__ */ __name(async (_learnCard, inboxCredentialId) => {
16733
+ await ensureUser();
16734
+ return client.inbox.approveGuardianCredentialInApp.mutate({ inboxCredentialId });
16735
+ }, "approveGuardianCredentialInApp"),
16736
+ rejectGuardianCredentialInApp: /* @__PURE__ */ __name(async (_learnCard, inboxCredentialId) => {
16737
+ await ensureUser();
16738
+ return client.inbox.rejectGuardianCredentialInApp.mutate({ inboxCredentialId });
16739
+ }, "rejectGuardianCredentialInApp"),
16356
16740
  addContactMethod: /* @__PURE__ */ __name(async (_learnCard, contactMethod) => {
16357
16741
  await ensureUser();
16358
16742
  return client.contactMethods.addContactMethod.mutate(contactMethod);
@@ -16563,6 +16947,10 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
16563
16947
  await ensureUser();
16564
16948
  return client.appStore.getListingSigningAuthority.query({ listingId });
16565
16949
  }, "getListingSigningAuthority"),
16950
+ getIntegrationForListing: /* @__PURE__ */ __name(async (_learnCard, listingId) => {
16951
+ await ensureUser();
16952
+ return client.appStore.getIntegrationForListing.query({ listingId });
16953
+ }, "getIntegrationForListing"),
16566
16954
  getAppStoreListing: /* @__PURE__ */ __name(async (_learnCard, listingId) => {
16567
16955
  await ensureUser();
16568
16956
  return client.appStore.getListing.query({ listingId });
@@ -16658,6 +17046,14 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
16658
17046
  templateAlias
16659
17047
  });
16660
17048
  }, "addBoostToApp"),
17049
+ associateBoostWithListing: /* @__PURE__ */ __name(async (_learnCard, listingId, boostUri, templateAlias) => {
17050
+ await ensureUser();
17051
+ return client.appStore.addBoostToListing.mutate({
17052
+ listingId,
17053
+ boostUri,
17054
+ templateAlias
17055
+ });
17056
+ }, "associateBoostWithListing"),
16661
17057
  removeBoostFromApp: /* @__PURE__ */ __name(async (_learnCard, listingId, templateAlias) => {
16662
17058
  await ensureUser();
16663
17059
  return client.appStore.removeBoostFromListing.mutate({ listingId, templateAlias });
@@ -16692,7 +17088,14 @@ async function getLearnCardNetworkPlugin(learnCard, url2, apiTokenOrOptions, opt
16692
17088
  getActivityChain: /* @__PURE__ */ __name(async (_learnCard, options2) => {
16693
17089
  await ensureUser();
16694
17090
  return client.activity.getActivityChain.query(options2);
16695
- }, "getActivityChain")
17091
+ }, "getActivityChain"),
17092
+ isServiceTrusted: /* @__PURE__ */ __name(async (_learnCard, serviceDid) => {
17093
+ const trustedServices = await client.federation.getTrustedServices.query({});
17094
+ return trustedServices.some((s) => s.did === serviceDid);
17095
+ }, "isServiceTrusted"),
17096
+ getTrustedServices: /* @__PURE__ */ __name(async () => {
17097
+ return client.federation.getTrustedServices.query({});
17098
+ }, "getTrustedServices")
16696
17099
  }
16697
17100
  };
16698
17101
  }