@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.
- package/dist/lcn-plugin.cjs.development.js +421 -18
- package/dist/lcn-plugin.cjs.development.js.map +3 -3
- package/dist/lcn-plugin.cjs.production.min.js +16 -16
- package/dist/lcn-plugin.cjs.production.min.js.map +3 -3
- package/dist/lcn-plugin.esm.js +421 -18
- package/dist/lcn-plugin.esm.js.map +3 -3
- package/dist/plugin.d.ts +2 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/types.d.ts +46 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -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:
|
|
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] =
|
|
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(/\{\{([^{}]
|
|
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
|
}
|