@hellolynk-ai/workbuddy-mcp 0.3.101 → 0.3.102
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/clients/core/hellolynk-client-core.mjs +64 -14
- package/clients/core/hellolynk-neutral-host-assembly.mjs +5 -18
- package/clients/core/hellolynk-neutral-host-process.mjs +1 -1
- package/clients/core/hellolynk-platform-credential-store.mjs +32 -0
- package/hellolynk-client-pack-manifest.json +21 -21
- package/hellolynk-client-pack-pin.json +1 -1
- package/integrations/workbuddy/package.json +1 -1
- package/package.json +1 -1
- package/runtime/core/hellolynk-client-core.mjs +64 -14
- package/runtime/core/hellolynk-neutral-host-assembly.mjs +5 -18
- package/runtime/core/hellolynk-neutral-host-process.mjs +1 -1
- package/runtime/core/hellolynk-platform-credential-store.mjs +32 -0
- package/runtime/neutral-host-release-manifest.json +4 -4
- package/runtime/neutral-host-release-pin.json +1 -1
- package/workbuddy-package-manifest.json +1 -1
- package/workbuddy-package-pin.json +1 -1
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
1
2
|
import runtimeSafety from "./hellolynk-runtime-safety.cjs";
|
|
2
3
|
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
3
4
|
const MAX_JSON_RESPONSE_BYTES = 256 * 1024;
|
|
4
5
|
const LOOPBACK_HOSTS = new Set(["127.0.0.1", "localhost", "[::1]"]);
|
|
5
6
|
const DEVICE_RUNTIME_TTL_MS = 20 * 60 * 1000;
|
|
6
7
|
const DEVICE_RUNTIME_RECOVERY_WINDOW_MS = 120_000;
|
|
8
|
+
const DEVICE_CREDENTIAL_RECHECK_MS = 60 * 60_000;
|
|
7
9
|
const DEVICE_RUNTIME_SCOPES = Object.freeze([
|
|
8
10
|
"relay.text.receive",
|
|
9
11
|
"relay.text.send",
|
|
@@ -567,6 +569,7 @@ export function createDeviceRuntimeSessionManager(options = {}) {
|
|
|
567
569
|
const issue = options.issue || issueDeviceRuntimeSession;
|
|
568
570
|
const now = options.now || (() => Date.now());
|
|
569
571
|
const sessionStore = options.sessionStore || null;
|
|
572
|
+
const credentialRejections = sessionStore?.credentialRejections;
|
|
570
573
|
const sessionKey = options.sessionKey == null ? null : String(options.sessionKey);
|
|
571
574
|
if (sessionStore && (
|
|
572
575
|
!sessionKey ||
|
|
@@ -580,6 +583,8 @@ export function createDeviceRuntimeSessionManager(options = {}) {
|
|
|
580
583
|
5 * 60 * 1000,
|
|
581
584
|
);
|
|
582
585
|
let current = null;
|
|
586
|
+
let rejectedCredential = null;
|
|
587
|
+
let localIssueTail = Promise.resolve();
|
|
583
588
|
|
|
584
589
|
const routeMatches = (session, input) => {
|
|
585
590
|
const expectedValues = [
|
|
@@ -652,22 +657,67 @@ export function createDeviceRuntimeSessionManager(options = {}) {
|
|
|
652
657
|
return proof;
|
|
653
658
|
};
|
|
654
659
|
|
|
660
|
+
const issueSession = async (input, previousSession) => {
|
|
661
|
+
const request = { ...input, previousSession };
|
|
662
|
+
if (options.loadDeviceCredential) request.deviceCredential = await options.loadDeviceCredential();
|
|
663
|
+
const fingerprint = request.deviceCredential && request.baseUrl
|
|
664
|
+
? createHash("sha256").update(JSON.stringify([
|
|
665
|
+
normalizeHelloLynkBaseUrl(request.baseUrl, { allowLoopbackHttp: request.allowLoopbackHttp === true }),
|
|
666
|
+
request.deviceCredential,
|
|
667
|
+
])).digest("hex")
|
|
668
|
+
: null;
|
|
669
|
+
// The production caller holds the existing session lock, including across
|
|
670
|
+
// Host processes. An authority denial may drain the current Host.
|
|
671
|
+
if (fingerprint) {
|
|
672
|
+
const isCoolingDown = (rejection) => {
|
|
673
|
+
if (rejection?.fingerprint !== fingerprint) return false;
|
|
674
|
+
const age = now() - rejection.rejectedAtMs;
|
|
675
|
+
return age >= 0 && age < DEVICE_CREDENTIAL_RECHECK_MS;
|
|
676
|
+
};
|
|
677
|
+
// A generic denial may clear after a server-side repair, without a new
|
|
678
|
+
// credential. The lock permits one recheck once the cooldown ends.
|
|
679
|
+
if (isCoolingDown(rejectedCredential)
|
|
680
|
+
|| isCoolingDown(await credentialRejections?.load(sessionKey).catch(() => null))) {
|
|
681
|
+
throw new HelloLynkClientError("device_credential_invalid", { httpStatus: 401 });
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
let session;
|
|
685
|
+
try {
|
|
686
|
+
session = reusable(await issue(request), input);
|
|
687
|
+
} catch (error) {
|
|
688
|
+
if (fingerprint && error?.httpStatus === 401 && error.code === "device_credential_invalid") {
|
|
689
|
+
rejectedCredential = { fingerprint, rejectedAtMs: now() };
|
|
690
|
+
// Preserve the authority denial even if local storage is unavailable.
|
|
691
|
+
await credentialRejections?.save(sessionKey, rejectedCredential).catch(() => {});
|
|
692
|
+
}
|
|
693
|
+
throw error;
|
|
694
|
+
}
|
|
695
|
+
if (session && fingerprint) {
|
|
696
|
+
rejectedCredential = null;
|
|
697
|
+
await credentialRejections?.remove(sessionKey).catch(() => {});
|
|
698
|
+
}
|
|
699
|
+
return session;
|
|
700
|
+
};
|
|
701
|
+
|
|
655
702
|
return {
|
|
656
703
|
async get(input) {
|
|
657
704
|
if (!sessionStore) {
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
705
|
+
const result = localIssueTail.then(async () => {
|
|
706
|
+
if (
|
|
707
|
+
current && current.expiresAtMs - now() > minimumRemainingMs
|
|
708
|
+
&& routeMatches(current, input)
|
|
709
|
+
&& scopesMatch(current, input)
|
|
710
|
+
&& (input?.expectedAgentId == null || input.expectedAgentId === current.agentId)
|
|
711
|
+
&& (input?.expectedPrincipalId == null || input.expectedPrincipalId === current.principalId)
|
|
712
|
+
) return current;
|
|
713
|
+
const reusableCurrent = reusable(current, input);
|
|
714
|
+
if (reusableCurrent) return reusableCurrent;
|
|
715
|
+
current = await issueSession(input, recoveryProof(current, input));
|
|
716
|
+
if (!current) throw new HelloLynkClientError("invalid_runtime_session_handle");
|
|
717
|
+
return current;
|
|
718
|
+
});
|
|
719
|
+
localIssueTail = result.catch(() => {});
|
|
720
|
+
return result;
|
|
671
721
|
}
|
|
672
722
|
const inMemory = reusable(current, input);
|
|
673
723
|
if (inMemory) return inMemory;
|
|
@@ -678,7 +728,7 @@ export function createDeviceRuntimeSessionManager(options = {}) {
|
|
|
678
728
|
current = persisted;
|
|
679
729
|
return current;
|
|
680
730
|
}
|
|
681
|
-
const issued =
|
|
731
|
+
const issued = await issueSession(input, persisted);
|
|
682
732
|
if (!issued) throw new HelloLynkClientError("invalid_runtime_session_handle");
|
|
683
733
|
await sessionStore.save(sessionKey, issued);
|
|
684
734
|
current = issued;
|
|
@@ -7,7 +7,6 @@ import path from "node:path";
|
|
|
7
7
|
|
|
8
8
|
import {
|
|
9
9
|
createDeviceRuntimeSessionManager,
|
|
10
|
-
issueDeviceRuntimeSession,
|
|
11
10
|
normalizeHelloLynkBaseUrl,
|
|
12
11
|
} from "./hellolynk-client-core.mjs";
|
|
13
12
|
import { readClientProfile } from "./hellolynk-client-profile.mjs";
|
|
@@ -243,31 +242,19 @@ export async function startHelloLynkNeutralHostAssembly(options = {}, dependenci
|
|
|
243
242
|
const manager = (dependencies.createRuntimeSessionManager || createDeviceRuntimeSessionManager)({
|
|
244
243
|
sessionStore: credentialStore.runtimeSessions,
|
|
245
244
|
sessionKey,
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
try {
|
|
249
|
-
return await (dependencies.issueRuntimeSession || issueDeviceRuntimeSession)({
|
|
250
|
-
baseUrl: profile.baseUrl,
|
|
251
|
-
allowLoopbackHttp: profile.allowLoopbackHttp,
|
|
252
|
-
deviceCredential,
|
|
253
|
-
expectedPrincipalId: profile.principalId,
|
|
254
|
-
expectedAgentId: profile.agentId,
|
|
255
|
-
expectedDelegateId: profile.delegateId,
|
|
256
|
-
expectedHostId: profile.hostId,
|
|
257
|
-
expectedAuthorizationVersion: profile.authorizationVersion,
|
|
258
|
-
previousSession,
|
|
259
|
-
fetchImpl: dependencies.fetchImpl,
|
|
260
|
-
});
|
|
261
|
-
} finally { deviceCredential = null; }
|
|
262
|
-
},
|
|
245
|
+
loadDeviceCredential: () => credentialStore.load(profile.profileId),
|
|
246
|
+
issue: dependencies.issueRuntimeSession,
|
|
263
247
|
});
|
|
264
248
|
const sessionProvider = Object.freeze({
|
|
265
249
|
get: () => manager.get({
|
|
250
|
+
baseUrl: profile.baseUrl,
|
|
251
|
+
allowLoopbackHttp: profile.allowLoopbackHttp,
|
|
266
252
|
expectedPrincipalId: profile.principalId,
|
|
267
253
|
expectedAgentId: profile.agentId,
|
|
268
254
|
expectedDelegateId: profile.delegateId,
|
|
269
255
|
expectedHostId: profile.hostId,
|
|
270
256
|
expectedAuthorizationVersion: profile.authorizationVersion,
|
|
257
|
+
fetchImpl: dependencies.fetchImpl,
|
|
271
258
|
}),
|
|
272
259
|
clear: (error) => manager.clear(error),
|
|
273
260
|
status: () => manager.status(),
|
|
@@ -34,7 +34,7 @@ export const HELLOLYNK_NEUTRAL_HOST_PROCESS_CONTRACT = "hellolynk-neutral-host-p
|
|
|
34
34
|
export const HELLOLYNK_NEUTRAL_HOST_DISCOVERY_CONTRACT = "hellolynk-neutral-host-discovery-v1";
|
|
35
35
|
// Raised with every release batch, together with the six client versions. A Host reports it
|
|
36
36
|
// in its health; the higher release stays and the lower one makes room.
|
|
37
|
-
export const HELLOLYNK_HOST_RELEASE_ORDINAL =
|
|
37
|
+
export const HELLOLYNK_HOST_RELEASE_ORDINAL = 17;
|
|
38
38
|
|
|
39
39
|
const INSTALLATION_LOCK_CONTRACT = "hellolynk-neutral-host-installation-lock-v2";
|
|
40
40
|
const INSTALLATION_LOCK_MAX_BYTES = 4 * 1024;
|
|
@@ -297,6 +297,36 @@ export async function secureWindowsClientReleaseTree(clientRoot, releaseId, opti
|
|
|
297
297
|
});
|
|
298
298
|
}
|
|
299
299
|
|
|
300
|
+
// Accessed under the same cross-process lock as the corresponding session.
|
|
301
|
+
function createCredentialRejectionStore(root) {
|
|
302
|
+
const fileFor = (profile) => join(root, `runtime-session-rejection-${assertCredentialProfileId(profile)}.json`);
|
|
303
|
+
const isRejection = (value) => typeof value?.fingerprint === "string" && /^[a-f0-9]{64}$/.test(value.fingerprint)
|
|
304
|
+
&& Number.isSafeInteger(value.rejectedAtMs) && value.rejectedAtMs >= 0;
|
|
305
|
+
return {
|
|
306
|
+
async load(profile) {
|
|
307
|
+
let value;
|
|
308
|
+
try { value = JSON.parse(await readFile(fileFor(profile), "utf8")); }
|
|
309
|
+
catch (error) { if (error?.code === "ENOENT" || error instanceof SyntaxError) return null; throw error; }
|
|
310
|
+
return isRejection(value) ? value : null;
|
|
311
|
+
},
|
|
312
|
+
async save(profile, rejection) {
|
|
313
|
+
if (!isRejection(rejection)) throw new HelloLynkCredentialStoreError("invalid_credential_rejection");
|
|
314
|
+
const { fingerprint, rejectedAtMs } = rejection;
|
|
315
|
+
const file = fileFor(profile);
|
|
316
|
+
const temporary = `${file}.${randomBytes(12).toString("hex")}.tmp`;
|
|
317
|
+
try {
|
|
318
|
+
await writeFile(temporary, `${JSON.stringify({ fingerprint, rejectedAtMs })}\n`, { encoding: "utf8", flag: "wx", mode: 0o600 });
|
|
319
|
+
await rename(temporary, file);
|
|
320
|
+
} finally {
|
|
321
|
+
await rm(temporary, { force: true }).catch(() => {});
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
async remove(profile) {
|
|
325
|
+
await rm(fileFor(profile), { force: true });
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
|
|
300
330
|
export function createPlatformCredentialStore(options = {}) {
|
|
301
331
|
const platform = options.platform || process.platform;
|
|
302
332
|
const run = options.runHelper || runCredentialHelper;
|
|
@@ -370,6 +400,7 @@ export function createPlatformCredentialStore(options = {}) {
|
|
|
370
400
|
await invoke("Remove", assertCredentialProfileId(profile), "");
|
|
371
401
|
},
|
|
372
402
|
runtimeSessions: {
|
|
403
|
+
credentialRejections: createCredentialRejectionStore(runtimeStoreRoot),
|
|
373
404
|
async save(profile, session) {
|
|
374
405
|
const body = JSON.stringify({ schemaVersion: 1, ...assertRuntimeSession(session) });
|
|
375
406
|
await invoke("StoreRuntimeSession", assertCredentialProfileId(profile), body);
|
|
@@ -504,6 +535,7 @@ export function createPlatformCredentialStore(options = {}) {
|
|
|
504
535
|
},
|
|
505
536
|
async remove(profile) { await entry(root, "device", profile, "remove"); },
|
|
506
537
|
runtimeSessions: {
|
|
538
|
+
credentialRejections: createCredentialRejectionStore(root),
|
|
507
539
|
async save(profile, session) { await entry(root, "session", profile, "save", assertRuntimeSession(session)); },
|
|
508
540
|
async load(profile) {
|
|
509
541
|
const value = await entry(root, "session", profile, "load");
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"contract": "hellolynk-client-npm-pack-manifest-v1",
|
|
3
3
|
"client": "workbuddy",
|
|
4
4
|
"packageName": "@hellolynk-ai/workbuddy-mcp",
|
|
5
|
-
"version": "0.3.
|
|
5
|
+
"version": "0.3.102",
|
|
6
6
|
"workbench": {
|
|
7
7
|
"path": "runtime/workbench/hellolynk-workbench-build.json",
|
|
8
8
|
"contract": "hellolynk-shared-workbench-build-v1",
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"path": "clients/core/hellolynk-client-core.mjs",
|
|
30
|
-
"bytes":
|
|
31
|
-
"sha256": "
|
|
30
|
+
"bytes": 36628,
|
|
31
|
+
"sha256": "5d2190c2354ede169b2053864674c7ae5b80985970dc13609d6818c5a6d16940"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"path": "clients/core/hellolynk-client-profile.mjs",
|
|
@@ -217,8 +217,8 @@
|
|
|
217
217
|
},
|
|
218
218
|
{
|
|
219
219
|
"path": "clients/core/hellolynk-neutral-host-assembly.mjs",
|
|
220
|
-
"bytes":
|
|
221
|
-
"sha256": "
|
|
220
|
+
"bytes": 47236,
|
|
221
|
+
"sha256": "8f8038559ed249d29e53e8ee0ad3db8e6319336bd3aadf49434aa7aa755bb647"
|
|
222
222
|
},
|
|
223
223
|
{
|
|
224
224
|
"path": "clients/core/hellolynk-neutral-host-installation-store.mjs",
|
|
@@ -233,7 +233,7 @@
|
|
|
233
233
|
{
|
|
234
234
|
"path": "clients/core/hellolynk-neutral-host-process.mjs",
|
|
235
235
|
"bytes": 229535,
|
|
236
|
-
"sha256": "
|
|
236
|
+
"sha256": "a2ed64720bd9772e5ac1fd93692820e1c5c58e03be114eb4707c2a7f4bd57f5e"
|
|
237
237
|
},
|
|
238
238
|
{
|
|
239
239
|
"path": "clients/core/hellolynk-neutral-host-store-adapters.mjs",
|
|
@@ -247,8 +247,8 @@
|
|
|
247
247
|
},
|
|
248
248
|
{
|
|
249
249
|
"path": "clients/core/hellolynk-platform-credential-store.mjs",
|
|
250
|
-
"bytes":
|
|
251
|
-
"sha256": "
|
|
250
|
+
"bytes": 40982,
|
|
251
|
+
"sha256": "4a4f073c3a5398d0d51be5a28c1b86b06e6f3b0b613e833928d8437c030cf65f"
|
|
252
252
|
},
|
|
253
253
|
{
|
|
254
254
|
"path": "clients/core/hellolynk-relay-client-cli.mjs",
|
|
@@ -313,7 +313,7 @@
|
|
|
313
313
|
{
|
|
314
314
|
"path": "integrations/workbuddy/package.json",
|
|
315
315
|
"bytes": 1156,
|
|
316
|
-
"sha256": "
|
|
316
|
+
"sha256": "aaa1f5f017dacc56cb6a1fb308408fcf7fd94bc3eab68d95935c0da6fcffff94"
|
|
317
317
|
},
|
|
318
318
|
{
|
|
319
319
|
"path": "integrations/workbuddy/server/host-lifecycle.mjs",
|
|
@@ -423,7 +423,7 @@
|
|
|
423
423
|
{
|
|
424
424
|
"path": "package.json",
|
|
425
425
|
"bytes": 2019,
|
|
426
|
-
"sha256": "
|
|
426
|
+
"sha256": "e0a7c5ac0e569dd366095c4aa47ae98477f0a10b0e0ca74c9c5480d00f7e325f"
|
|
427
427
|
},
|
|
428
428
|
{
|
|
429
429
|
"path": "README.md",
|
|
@@ -447,8 +447,8 @@
|
|
|
447
447
|
},
|
|
448
448
|
{
|
|
449
449
|
"path": "runtime/core/hellolynk-client-core.mjs",
|
|
450
|
-
"bytes":
|
|
451
|
-
"sha256": "
|
|
450
|
+
"bytes": 35808,
|
|
451
|
+
"sha256": "dbab0f067c1a7f02c43b2696e1f5972288acd4f93a18684bf3cc120edff5cf94"
|
|
452
452
|
},
|
|
453
453
|
{
|
|
454
454
|
"path": "runtime/core/hellolynk-client-profile.mjs",
|
|
@@ -632,8 +632,8 @@
|
|
|
632
632
|
},
|
|
633
633
|
{
|
|
634
634
|
"path": "runtime/core/hellolynk-neutral-host-assembly.mjs",
|
|
635
|
-
"bytes":
|
|
636
|
-
"sha256": "
|
|
635
|
+
"bytes": 46294,
|
|
636
|
+
"sha256": "287ad6e077c8da05799b970ffa6607d8c7a0ab54a4837de51516e6af0ef6695b"
|
|
637
637
|
},
|
|
638
638
|
{
|
|
639
639
|
"path": "runtime/core/hellolynk-neutral-host-installation-store.mjs",
|
|
@@ -648,7 +648,7 @@
|
|
|
648
648
|
{
|
|
649
649
|
"path": "runtime/core/hellolynk-neutral-host-process.mjs",
|
|
650
650
|
"bytes": 225161,
|
|
651
|
-
"sha256": "
|
|
651
|
+
"sha256": "ad6809633f49f7316acf6ce5b8f71a13d7ba20d3b62a2700664421ba671b5369"
|
|
652
652
|
},
|
|
653
653
|
{
|
|
654
654
|
"path": "runtime/core/hellolynk-neutral-host-store-adapters.mjs",
|
|
@@ -662,8 +662,8 @@
|
|
|
662
662
|
},
|
|
663
663
|
{
|
|
664
664
|
"path": "runtime/core/hellolynk-platform-credential-store.mjs",
|
|
665
|
-
"bytes":
|
|
666
|
-
"sha256": "
|
|
665
|
+
"bytes": 40123,
|
|
666
|
+
"sha256": "4b4b27cd86f4816e5e6ec4914816a335cdea5c4b4ffb2091775c061a9676a69c"
|
|
667
667
|
},
|
|
668
668
|
{
|
|
669
669
|
"path": "runtime/core/hellolynk-relay-client-cli.mjs",
|
|
@@ -708,12 +708,12 @@
|
|
|
708
708
|
{
|
|
709
709
|
"path": "runtime/neutral-host-release-manifest.json",
|
|
710
710
|
"bytes": 11517,
|
|
711
|
-
"sha256": "
|
|
711
|
+
"sha256": "9d3d6e3880a59444acafe27536817b63ba459c803218e821f5ef2705dffe13c3"
|
|
712
712
|
},
|
|
713
713
|
{
|
|
714
714
|
"path": "runtime/neutral-host-release-pin.json",
|
|
715
715
|
"bytes": 146,
|
|
716
|
-
"sha256": "
|
|
716
|
+
"sha256": "88aca660e81d60992bb7ea9a552dffd78c01a99b4239ea72fe0fe3ae972caff4"
|
|
717
717
|
},
|
|
718
718
|
{
|
|
719
719
|
"path": "runtime/platform/windows/configure-agent.ps1",
|
|
@@ -893,12 +893,12 @@
|
|
|
893
893
|
{
|
|
894
894
|
"path": "workbuddy-package-manifest.json",
|
|
895
895
|
"bytes": 22640,
|
|
896
|
-
"sha256": "
|
|
896
|
+
"sha256": "dc9e4128a28349eeade1aaa3749c9e869ce192ebeb851617abb8701443d34022"
|
|
897
897
|
},
|
|
898
898
|
{
|
|
899
899
|
"path": "workbuddy-package-pin.json",
|
|
900
900
|
"bytes": 143,
|
|
901
|
-
"sha256": "
|
|
901
|
+
"sha256": "946f81e963214554465d792d6d90bc4b2f93fa6c529246904fbad1e6b06a0f29"
|
|
902
902
|
}
|
|
903
903
|
]
|
|
904
904
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hellolynk-ai/workbuddy-mcp",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.102",
|
|
4
4
|
"description": "HelloLynk Messaging for WorkBuddy: open conversations and let your AI message other people's AI assistants.",
|
|
5
5
|
"homepage": "https://hellolynk.com",
|
|
6
6
|
"repository": {
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
1
2
|
import runtimeSafety from "./hellolynk-runtime-safety.cjs";
|
|
2
3
|
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
3
4
|
const MAX_JSON_RESPONSE_BYTES = 256 * 1024;
|
|
4
5
|
const LOOPBACK_HOSTS = new Set(["127.0.0.1", "localhost", "[::1]"]);
|
|
5
6
|
const DEVICE_RUNTIME_TTL_MS = 20 * 60 * 1000;
|
|
6
7
|
const DEVICE_RUNTIME_RECOVERY_WINDOW_MS = 120_000;
|
|
8
|
+
const DEVICE_CREDENTIAL_RECHECK_MS = 60 * 60_000;
|
|
7
9
|
const DEVICE_RUNTIME_SCOPES = Object.freeze([
|
|
8
10
|
"relay.text.receive",
|
|
9
11
|
"relay.text.send",
|
|
@@ -567,6 +569,7 @@ export function createDeviceRuntimeSessionManager(options = {}) {
|
|
|
567
569
|
const issue = options.issue || issueDeviceRuntimeSession;
|
|
568
570
|
const now = options.now || (() => Date.now());
|
|
569
571
|
const sessionStore = options.sessionStore || null;
|
|
572
|
+
const credentialRejections = sessionStore?.credentialRejections;
|
|
570
573
|
const sessionKey = options.sessionKey == null ? null : String(options.sessionKey);
|
|
571
574
|
if (sessionStore && (
|
|
572
575
|
!sessionKey ||
|
|
@@ -580,6 +583,8 @@ export function createDeviceRuntimeSessionManager(options = {}) {
|
|
|
580
583
|
5 * 60 * 1000,
|
|
581
584
|
);
|
|
582
585
|
let current = null;
|
|
586
|
+
let rejectedCredential = null;
|
|
587
|
+
let localIssueTail = Promise.resolve();
|
|
583
588
|
|
|
584
589
|
const routeMatches = (session, input) => {
|
|
585
590
|
const expectedValues = [
|
|
@@ -652,22 +657,67 @@ export function createDeviceRuntimeSessionManager(options = {}) {
|
|
|
652
657
|
return proof;
|
|
653
658
|
};
|
|
654
659
|
|
|
660
|
+
const issueSession = async (input, previousSession) => {
|
|
661
|
+
const request = { ...input, previousSession };
|
|
662
|
+
if (options.loadDeviceCredential) request.deviceCredential = await options.loadDeviceCredential();
|
|
663
|
+
const fingerprint = request.deviceCredential && request.baseUrl
|
|
664
|
+
? createHash("sha256").update(JSON.stringify([
|
|
665
|
+
normalizeHelloLynkBaseUrl(request.baseUrl, { allowLoopbackHttp: request.allowLoopbackHttp === true }),
|
|
666
|
+
request.deviceCredential,
|
|
667
|
+
])).digest("hex")
|
|
668
|
+
: null;
|
|
669
|
+
// The production caller holds the existing session lock, including across
|
|
670
|
+
// Host processes. An authority denial may drain the current Host.
|
|
671
|
+
if (fingerprint) {
|
|
672
|
+
const isCoolingDown = (rejection) => {
|
|
673
|
+
if (rejection?.fingerprint !== fingerprint) return false;
|
|
674
|
+
const age = now() - rejection.rejectedAtMs;
|
|
675
|
+
return age >= 0 && age < DEVICE_CREDENTIAL_RECHECK_MS;
|
|
676
|
+
};
|
|
677
|
+
// A generic denial may clear after a server-side repair, without a new
|
|
678
|
+
// credential. The lock permits one recheck once the cooldown ends.
|
|
679
|
+
if (isCoolingDown(rejectedCredential)
|
|
680
|
+
|| isCoolingDown(await credentialRejections?.load(sessionKey).catch(() => null))) {
|
|
681
|
+
throw new HelloLynkClientError("device_credential_invalid", { httpStatus: 401 });
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
let session;
|
|
685
|
+
try {
|
|
686
|
+
session = reusable(await issue(request), input);
|
|
687
|
+
} catch (error) {
|
|
688
|
+
if (fingerprint && error?.httpStatus === 401 && error.code === "device_credential_invalid") {
|
|
689
|
+
rejectedCredential = { fingerprint, rejectedAtMs: now() };
|
|
690
|
+
// Preserve the authority denial even if local storage is unavailable.
|
|
691
|
+
await credentialRejections?.save(sessionKey, rejectedCredential).catch(() => {});
|
|
692
|
+
}
|
|
693
|
+
throw error;
|
|
694
|
+
}
|
|
695
|
+
if (session && fingerprint) {
|
|
696
|
+
rejectedCredential = null;
|
|
697
|
+
await credentialRejections?.remove(sessionKey).catch(() => {});
|
|
698
|
+
}
|
|
699
|
+
return session;
|
|
700
|
+
};
|
|
701
|
+
|
|
655
702
|
return {
|
|
656
703
|
async get(input) {
|
|
657
704
|
if (!sessionStore) {
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
705
|
+
const result = localIssueTail.then(async () => {
|
|
706
|
+
if (
|
|
707
|
+
current && current.expiresAtMs - now() > minimumRemainingMs
|
|
708
|
+
&& routeMatches(current, input)
|
|
709
|
+
&& scopesMatch(current, input)
|
|
710
|
+
&& (input?.expectedAgentId == null || input.expectedAgentId === current.agentId)
|
|
711
|
+
&& (input?.expectedPrincipalId == null || input.expectedPrincipalId === current.principalId)
|
|
712
|
+
) return current;
|
|
713
|
+
const reusableCurrent = reusable(current, input);
|
|
714
|
+
if (reusableCurrent) return reusableCurrent;
|
|
715
|
+
current = await issueSession(input, recoveryProof(current, input));
|
|
716
|
+
if (!current) throw new HelloLynkClientError("invalid_runtime_session_handle");
|
|
717
|
+
return current;
|
|
718
|
+
});
|
|
719
|
+
localIssueTail = result.catch(() => {});
|
|
720
|
+
return result;
|
|
671
721
|
}
|
|
672
722
|
const inMemory = reusable(current, input);
|
|
673
723
|
if (inMemory) return inMemory;
|
|
@@ -678,7 +728,7 @@ export function createDeviceRuntimeSessionManager(options = {}) {
|
|
|
678
728
|
current = persisted;
|
|
679
729
|
return current;
|
|
680
730
|
}
|
|
681
|
-
const issued =
|
|
731
|
+
const issued = await issueSession(input, persisted);
|
|
682
732
|
if (!issued) throw new HelloLynkClientError("invalid_runtime_session_handle");
|
|
683
733
|
await sessionStore.save(sessionKey, issued);
|
|
684
734
|
current = issued;
|
|
@@ -7,7 +7,6 @@ import path from "node:path";
|
|
|
7
7
|
|
|
8
8
|
import {
|
|
9
9
|
createDeviceRuntimeSessionManager,
|
|
10
|
-
issueDeviceRuntimeSession,
|
|
11
10
|
normalizeHelloLynkBaseUrl,
|
|
12
11
|
} from "./hellolynk-client-core.mjs";
|
|
13
12
|
import { readClientProfile } from "./hellolynk-client-profile.mjs";
|
|
@@ -243,31 +242,19 @@ export async function startHelloLynkNeutralHostAssembly(options = {}, dependenci
|
|
|
243
242
|
const manager = (dependencies.createRuntimeSessionManager || createDeviceRuntimeSessionManager)({
|
|
244
243
|
sessionStore: credentialStore.runtimeSessions,
|
|
245
244
|
sessionKey,
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
try {
|
|
249
|
-
return await (dependencies.issueRuntimeSession || issueDeviceRuntimeSession)({
|
|
250
|
-
baseUrl: profile.baseUrl,
|
|
251
|
-
allowLoopbackHttp: profile.allowLoopbackHttp,
|
|
252
|
-
deviceCredential,
|
|
253
|
-
expectedPrincipalId: profile.principalId,
|
|
254
|
-
expectedAgentId: profile.agentId,
|
|
255
|
-
expectedDelegateId: profile.delegateId,
|
|
256
|
-
expectedHostId: profile.hostId,
|
|
257
|
-
expectedAuthorizationVersion: profile.authorizationVersion,
|
|
258
|
-
previousSession,
|
|
259
|
-
fetchImpl: dependencies.fetchImpl,
|
|
260
|
-
});
|
|
261
|
-
} finally { deviceCredential = null; }
|
|
262
|
-
},
|
|
245
|
+
loadDeviceCredential: () => credentialStore.load(profile.profileId),
|
|
246
|
+
issue: dependencies.issueRuntimeSession,
|
|
263
247
|
});
|
|
264
248
|
const sessionProvider = Object.freeze({
|
|
265
249
|
get: () => manager.get({
|
|
250
|
+
baseUrl: profile.baseUrl,
|
|
251
|
+
allowLoopbackHttp: profile.allowLoopbackHttp,
|
|
266
252
|
expectedPrincipalId: profile.principalId,
|
|
267
253
|
expectedAgentId: profile.agentId,
|
|
268
254
|
expectedDelegateId: profile.delegateId,
|
|
269
255
|
expectedHostId: profile.hostId,
|
|
270
256
|
expectedAuthorizationVersion: profile.authorizationVersion,
|
|
257
|
+
fetchImpl: dependencies.fetchImpl,
|
|
271
258
|
}),
|
|
272
259
|
clear: (error) => manager.clear(error),
|
|
273
260
|
status: () => manager.status(),
|
|
@@ -34,7 +34,7 @@ export const HELLOLYNK_NEUTRAL_HOST_PROCESS_CONTRACT = "hellolynk-neutral-host-p
|
|
|
34
34
|
export const HELLOLYNK_NEUTRAL_HOST_DISCOVERY_CONTRACT = "hellolynk-neutral-host-discovery-v1";
|
|
35
35
|
// Raised with every release batch, together with the six client versions. A Host reports it
|
|
36
36
|
// in its health; the higher release stays and the lower one makes room.
|
|
37
|
-
export const HELLOLYNK_HOST_RELEASE_ORDINAL =
|
|
37
|
+
export const HELLOLYNK_HOST_RELEASE_ORDINAL = 17;
|
|
38
38
|
|
|
39
39
|
const INSTALLATION_LOCK_CONTRACT = "hellolynk-neutral-host-installation-lock-v2";
|
|
40
40
|
const INSTALLATION_LOCK_MAX_BYTES = 4 * 1024;
|
|
@@ -297,6 +297,36 @@ export async function secureWindowsClientReleaseTree(clientRoot, releaseId, opti
|
|
|
297
297
|
});
|
|
298
298
|
}
|
|
299
299
|
|
|
300
|
+
// Accessed under the same cross-process lock as the corresponding session.
|
|
301
|
+
function createCredentialRejectionStore(root) {
|
|
302
|
+
const fileFor = (profile) => join(root, `runtime-session-rejection-${assertCredentialProfileId(profile)}.json`);
|
|
303
|
+
const isRejection = (value) => typeof value?.fingerprint === "string" && /^[a-f0-9]{64}$/.test(value.fingerprint)
|
|
304
|
+
&& Number.isSafeInteger(value.rejectedAtMs) && value.rejectedAtMs >= 0;
|
|
305
|
+
return {
|
|
306
|
+
async load(profile) {
|
|
307
|
+
let value;
|
|
308
|
+
try { value = JSON.parse(await readFile(fileFor(profile), "utf8")); }
|
|
309
|
+
catch (error) { if (error?.code === "ENOENT" || error instanceof SyntaxError) return null; throw error; }
|
|
310
|
+
return isRejection(value) ? value : null;
|
|
311
|
+
},
|
|
312
|
+
async save(profile, rejection) {
|
|
313
|
+
if (!isRejection(rejection)) throw new HelloLynkCredentialStoreError("invalid_credential_rejection");
|
|
314
|
+
const { fingerprint, rejectedAtMs } = rejection;
|
|
315
|
+
const file = fileFor(profile);
|
|
316
|
+
const temporary = `${file}.${randomBytes(12).toString("hex")}.tmp`;
|
|
317
|
+
try {
|
|
318
|
+
await writeFile(temporary, `${JSON.stringify({ fingerprint, rejectedAtMs })}\n`, { encoding: "utf8", flag: "wx", mode: 0o600 });
|
|
319
|
+
await rename(temporary, file);
|
|
320
|
+
} finally {
|
|
321
|
+
await rm(temporary, { force: true }).catch(() => {});
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
async remove(profile) {
|
|
325
|
+
await rm(fileFor(profile), { force: true });
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
|
|
300
330
|
export function createPlatformCredentialStore(options = {}) {
|
|
301
331
|
const platform = options.platform || process.platform;
|
|
302
332
|
const run = options.runHelper || runCredentialHelper;
|
|
@@ -370,6 +400,7 @@ export function createPlatformCredentialStore(options = {}) {
|
|
|
370
400
|
await invoke("Remove", assertCredentialProfileId(profile), "");
|
|
371
401
|
},
|
|
372
402
|
runtimeSessions: {
|
|
403
|
+
credentialRejections: createCredentialRejectionStore(runtimeStoreRoot),
|
|
373
404
|
async save(profile, session) {
|
|
374
405
|
const body = JSON.stringify({ schemaVersion: 1, ...assertRuntimeSession(session) });
|
|
375
406
|
await invoke("StoreRuntimeSession", assertCredentialProfileId(profile), body);
|
|
@@ -504,6 +535,7 @@ export function createPlatformCredentialStore(options = {}) {
|
|
|
504
535
|
},
|
|
505
536
|
async remove(profile) { await entry(root, "device", profile, "remove"); },
|
|
506
537
|
runtimeSessions: {
|
|
538
|
+
credentialRejections: createCredentialRejectionStore(root),
|
|
507
539
|
async save(profile, session) { await entry(root, "session", profile, "save", assertRuntimeSession(session)); },
|
|
508
540
|
async load(profile) {
|
|
509
541
|
const value = await entry(root, "session", profile, "load");
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"path": "core/hellolynk-client-core.mjs",
|
|
31
|
-
"sha256": "
|
|
31
|
+
"sha256": "dbab0f067c1a7f02c43b2696e1f5972288acd4f93a18684bf3cc120edff5cf94"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"path": "core/hellolynk-client-profile.mjs",
|
|
@@ -180,7 +180,7 @@
|
|
|
180
180
|
},
|
|
181
181
|
{
|
|
182
182
|
"path": "core/hellolynk-neutral-host-assembly.mjs",
|
|
183
|
-
"sha256": "
|
|
183
|
+
"sha256": "287ad6e077c8da05799b970ffa6607d8c7a0ab54a4837de51516e6af0ef6695b"
|
|
184
184
|
},
|
|
185
185
|
{
|
|
186
186
|
"path": "core/hellolynk-neutral-host-installation-store.mjs",
|
|
@@ -192,7 +192,7 @@
|
|
|
192
192
|
},
|
|
193
193
|
{
|
|
194
194
|
"path": "core/hellolynk-neutral-host-process.mjs",
|
|
195
|
-
"sha256": "
|
|
195
|
+
"sha256": "ad6809633f49f7316acf6ce5b8f71a13d7ba20d3b62a2700664421ba671b5369"
|
|
196
196
|
},
|
|
197
197
|
{
|
|
198
198
|
"path": "core/hellolynk-neutral-host-store-adapters.mjs",
|
|
@@ -204,7 +204,7 @@
|
|
|
204
204
|
},
|
|
205
205
|
{
|
|
206
206
|
"path": "core/hellolynk-platform-credential-store.mjs",
|
|
207
|
-
"sha256": "
|
|
207
|
+
"sha256": "4b4b27cd86f4816e5e6ec4914816a335cdea5c4b4ffb2091775c061a9676a69c"
|
|
208
208
|
},
|
|
209
209
|
{
|
|
210
210
|
"path": "core/hellolynk-relay-client-cli.mjs",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"contract":"hellolynk-workbuddy-immutable-package-v1","entry":"integrations/workbuddy/server/mcp-proxy.mjs","files":[{"path":"clients/core/hellolynk-client-account.mjs","sha256":"57082d5ea5e068dad81a47dd8abd38e34663e4563d8efa40f5130b817a346670"},{"path":"clients/core/hellolynk-client-core.mjs","sha256":"af7c9cb7a996fdb194c51dbcc745c48b616ff1686d79a1451104690d882df1b8"},{"path":"clients/core/hellolynk-client-profile.mjs","sha256":"4528f2eb90417dbe232c4fef254beeb20c94f9216388ec721f982dd7ee4adde5"},{"path":"clients/core/hellolynk-client-update-entry.mjs","sha256":"8b872933f9883a92889202cf370e1e8d878c2172e4e1c5d8aa8261f314577d90"},{"path":"clients/core/hellolynk-client-update-runtime.mjs","sha256":"6bdcc525579963fa3ffc46f29527817acc0b8090fdc6a9cbdadb0fc262eee12e"},{"path":"clients/core/hellolynk-client-update.mjs","sha256":"374690bb6cc7335b5f1cf030c33989aba9713e0922369edda0348b40ef71b02f"},{"path":"clients/core/hellolynk-contact-request-e2ee.mjs","sha256":"18526628b354d18bcbe5e621360ecfcd5dfa4cb4d91397fb87d0c20e1f332a5d"},{"path":"clients/core/hellolynk-darwin-host.mjs","sha256":"43dba4cd61cff66f2479c39532e504348a46e76faae0f7b1e09a7a7f5362e64a"},{"path":"clients/core/hellolynk-darwin-vault.mjs","sha256":"2972df9fa8a0d7594072a39bc8dfa2a41b8fb33ddf79cc5abe5e66636c1ea3ca"},{"path":"clients/core/hellolynk-device-enrollment.mjs","sha256":"18f9decb843a5a82ef8dfc3e866904e0b04bbc48d700eac55a8ae54c5729c2aa"},{"path":"clients/core/hellolynk-direct-text-e2ee-client.mjs","sha256":"dd5dfa410a664e21e14b3c253ca496dd303e36aa5a2e1370b78cc51ec1fba973"},{"path":"clients/core/hellolynk-direct-text-e2ee.mjs","sha256":"3fee00210896b81cf40d25c634a6a758adee18704ef4a74fbc00b699a58d53e5"},{"path":"clients/core/hellolynk-host-auth.mjs","sha256":"49baa0b82ab078ad74a892a179189bdbd303a791d580ba4d6eac457564fad535"},{"path":"clients/core/hellolynk-host-protected-store.mjs","sha256":"bb0167b7861de2c408b90c16f24765f45dfeca7033f90d31e17dca3fc9e30c41"},{"path":"clients/core/hellolynk-host-transport-client.mjs","sha256":"0c97425346496a5d5e1f2b3d092d5d227179051b63e8097bab225dffe576008a"},{"path":"clients/core/hellolynk-host.mjs","sha256":"ed88f2285b4c5eb8618a2f3f3c2a7a65d798465933b91b109121bb90b45f5880"},{"path":"clients/core/hellolynk-human-confirmation-ledger.mjs","sha256":"746f2d23f19fa110ecd87d0b1dc3d88138776accc3b177afd8f5d266223ccc81"},{"path":"clients/core/hellolynk-human-relationship-controller.mjs","sha256":"01589c3eeb1c35f26cb50a14ce4e603c7bffe71e0b11863aed97c85f356e3c97"},{"path":"clients/core/hellolynk-inbox-read-state.mjs","sha256":"3c354aaa7038446f8f554f9520db287cc06559e6cb22cb69f0121a179ff2cb01"},{"path":"clients/core/hellolynk-indexed-message-store.mjs","sha256":"101f928dc5fab8064132e8755f74e157d35f921b5fe7d52fc80c0e46dc131428"},{"path":"clients/core/hellolynk-instance-conversation.mjs","sha256":"2e4a23917d4a86216b653ed04ec46216b9400fa94c13c0a00f1afc7877e284cb"},{"path":"clients/core/hellolynk-local-contact-requests.mjs","sha256":"3cbf0a0c6adeff17ceb310d202138c2dde7e23d0e8309f2584c161aae4c36acd"},{"path":"clients/core/hellolynk-local-contacts.mjs","sha256":"93d923702bdb5cbcbd47faf01f2c2e30bfe612fc450ef35ee98477412b2bbc6e"},{"path":"clients/core/hellolynk-local-data-migration.mjs","sha256":"72046a992b14f43167d6a671ec1094d34041cf43ba16d9d507583228045c7aa2"},{"path":"clients/core/hellolynk-local-data-protection.mjs","sha256":"e33b0c83fff59ba3ed49ae880d1b95016be4457bc7fd223367683942c78525bc"},{"path":"clients/core/hellolynk-local-identity-trust.mjs","sha256":"658fb5264d587341497e7d869408e51c1850f750856585ec7368a13c26f76a07"},{"path":"clients/core/hellolynk-local-messaging.mjs","sha256":"76b4348eb6eff34dec41c90666ac8ee14554018c5729c39b5b78bac30f0eaf80"},{"path":"clients/core/hellolynk-local-peer-transport.mjs","sha256":"4b8f01002b03fa19a9eea9dd72c7a41c4c951d6ef201f06dd1a89086a0a872cd"},{"path":"clients/core/hellolynk-local-process-lock.mjs","sha256":"5dd9b21f4e4509b148daaf2b495036e336e56be320d2bf7a3fac08b8a567d3bf"},{"path":"clients/core/hellolynk-model-inbox.mjs","sha256":"e112cbbb1caff5aa6f4a71bdfcb2d1c38260a96e3e4ab076b5f95c55e1da645e"},{"path":"clients/core/hellolynk-model-notices.cjs","sha256":"1b1c6e190b89f7305d05e1dddddaa6d50b7289b90aeab4599073eaaae27396f1"},{"path":"clients/core/hellolynk-native-addressing-tools.cjs","sha256":"cce89fa33dbe630a78d77843919a8e4b0c12f3482e754f783e6ff038b81929c4"},{"path":"clients/core/hellolynk-native-conversations.mjs","sha256":"38116a956c2c96dbac6b5355e2097385475879ab5e9965ae3552912739379630"},{"path":"clients/core/hellolynk-native-human-confirmation-broker.mjs","sha256":"98d986f492a9e646f4601f25588cabe065e3c7bb00f0773b5dfd99e72e65c324"},{"path":"clients/core/hellolynk-native-inbox-runtime.mjs","sha256":"bee3a5789420cc25cbc153cc8291f144b3a10ae50e96269823b7890cb603789d"},{"path":"clients/core/hellolynk-native-notice.mjs","sha256":"6cdbae7ad07f104c1d19123299d9b672d9d51265e5e1f512acd12a083617d419"},{"path":"clients/core/hellolynk-native-reply-routes.mjs","sha256":"65af258205a7eb9d2c599e0f400dbd9ea198c38a26f491e06f27c5c46101fc9b"},{"path":"clients/core/hellolynk-native-task-index.cjs","sha256":"aaeb19ee32e4736bd4b8fd23c544305d98c41908ab5ff9b211454b913edd009e"},{"path":"clients/core/hellolynk-native-worker-lease.mjs","sha256":"41eb3103c216a09b80159522700b7bb78f3b082a644501fd19fa51ce1bf6bab7"},{"path":"clients/core/hellolynk-neutral-host-assembly.mjs","sha256":"98b2b669183cda15272b182d5c04d3ae77511b8b657cd3179cbf2fa5d5f27920"},{"path":"clients/core/hellolynk-neutral-host-installation-store.mjs","sha256":"f6e04183e8e0c945006c5348ed251833ec12a6ab9777031609b5a3ccd0d2252d"},{"path":"clients/core/hellolynk-neutral-host-launcher.mjs","sha256":"0afe5310d1d9f7b1448a9f50aeb2c1fc93b42ce7eb48dd8472fbde5d33e898af"},{"path":"clients/core/hellolynk-neutral-host-process.mjs","sha256":"634279c96b8b4e83bcbcc92c5184f4ec7c31713a097f45af3f5650f8151fb78b"},{"path":"clients/core/hellolynk-neutral-host-store-adapters.mjs","sha256":"b033d5cdedc54847bf1a9fd4d5b70af6d0e1ed8094e74feebbb592c242a0cde9"},{"path":"clients/core/hellolynk-neutral-host-workbench-read-model.mjs","sha256":"6767b4aaf5c7304587d7126f203535f02d1f1bfd692741105ad644686ecb1612"},{"path":"clients/core/hellolynk-platform-credential-store.mjs","sha256":"0ab136d36e890309b4cb5ff6f1cef6f3d82caf65f5b1d08c7b3992442ffe38a7"},{"path":"clients/core/hellolynk-relay-client-cli.mjs","sha256":"e3134f37ff8c327b3148a4c417ee14c6c8bfbc3be9680e25c1ea29d215dff1d7"},{"path":"clients/core/hellolynk-release-retention.mjs","sha256":"b894c452019b89486dd3090c9eeee7b7c2bb4e50753565bf88ecd14ce0efeaf1"},{"path":"clients/core/hellolynk-runtime-safety.cjs","sha256":"1518d9904b329f05a92092f0f2d4014675014597573ba85f33e3e06c25ecea16"},{"path":"clients/core/hellolynk-workbench-action-grants.mjs","sha256":"7247f4bce07e6fafce6559604ef9c7a8f7a033b922c212344462411be55ea9ac"},{"path":"clients/core/hellolynk-workbench-connection.mjs","sha256":"0f24d28316253a761dc03d8096dace3da7a3cf8cb8eaf575765b2aa07d30274c"},{"path":"clients/platform/windows/credential-store.ps1","sha256":"4817c3c91d5d180763794a7a528f83664602f34cf1d1a8396e75ad6d56bd874f"},{"path":"clients/platform/windows/hellolynk-host-protected-store.ps1","sha256":"84ac61c3762b7f944bf3e2c895f9a6427985ce697052afd9bc610474c921adad"},{"path":"clients/platform/windows/hellolynk-human-confirmation-ledger.ps1","sha256":"317409f270f2cbd8017b61384292cf9caf4bd0fce6ef7a9894c1ec4c173b240c"},{"path":"clients/platform/windows/hellolynk-local-data-key.ps1","sha256":"3143122114c9756370e2ff3f56eba4a03e4a1657888aab1c6d4387427081d937"},{"path":"clients/platform/windows/hellolynk-native-human-confirmation-broker.ps1","sha256":"d63e02b34eb43d1a81d771f0e23f0b8d38e34c8f96663156d0c7b79985802936"},{"path":"clients/workbench/contract.mjs","sha256":"9994f8c7260495355d9e02ff96b7dd1074e1bf2ee238fbaafa6864bf749c095c"},{"path":"clients/workbench/service.mjs","sha256":"681fe98e286a69a187fb59c8f955c274a51bb38606b9618800ee5995f768e367"},{"path":"integrations/workbuddy/package.json","sha256":"6840c8972c83975bbac2e995b89008f24b47b0557c6cdb394f652844a1ed7111"},{"path":"integrations/workbuddy/server/host-lifecycle.mjs","sha256":"3b8e6d6d537226a6242059830759df1a686a42f50c3103c5e949d79806c1a4f9"},{"path":"integrations/workbuddy/server/mcp-proxy.mjs","sha256":"5b4a4ac035e23bea30e4559451252ce0aa48fc7e2929c910fa9a2e31324bfc70"},{"path":"integrations/workbuddy/server/mcp-server.mjs","sha256":"00ea077f3cbcd5cc75f5d3df8689c6a46381506198149fcad98ef20f85833b18"},{"path":"integrations/workbuddy/server/model-call-origin.mjs","sha256":"4cece99ea644c71388323557dc0d9ba493a96cff75b55421d5e53d35ec97f584"},{"path":"integrations/workbuddy/server/native-task-cdp.mjs","sha256":"4a6894cc97866c8e9d0beae138e2e0a98412191207494e98844b17120ec839f5"},{"path":"integrations/workbuddy/server/native-task-debug-startup.mjs","sha256":"2bb5a92a82213191c120af0c3e6ce62977e3164551bec60d1e0bcbb3635d99e4"},{"path":"integrations/workbuddy/server/native-task-debug-startup.ps1","sha256":"49b2c00c806cce6b6b50abf8e4e6cf699777889fe4b488872e926980b6368615"},{"path":"integrations/workbuddy/server/native-task-mcp-registration.mjs","sha256":"fe19db7cd3d700542c20325589f99a3f607c3d2b893a950afd06c9007fd01d7b"},{"path":"integrations/workbuddy/server/native-task-service-registration.mjs","sha256":"025e9be428c438bb87565536404ded32cb1db56614441911c74169270f6e1422"},{"path":"integrations/workbuddy/server/native-task-worker.mjs","sha256":"8b6d11fca70adde335a6b1c92776c6d76ba69ff669457a7d803a8076457b4c8d"},{"path":"integrations/workbuddy/server/neutral-host-adapter.mjs","sha256":"fa053192e761bbd9eecea95e127b68d3b94d56e91d861230bd9771a1cd754b09"},{"path":"integrations/workbuddy/server/origin-hook.mjs","sha256":"4f2fe78f59771fef1ca1e1cc145a38df566cc70ff318ff6192f2e4003d76bc3d"},{"path":"integrations/workbuddy/server/origin-routes.mjs","sha256":"893bfb495c78579062e1007afab6dee07f0994d48109413355d8951eceb52dd5"},{"path":"integrations/workbuddy/server/package-bootstrap.mjs","sha256":"8794c98a846c6d1c3683fa31b9296267725a5f4f9160b57a6f6039937292cb25"},{"path":"integrations/workbuddy/server/workbench-candidate.mjs","sha256":"caa64a710a71afe67dde53b7a46dd91ea555b5a946a2749909fcf54e5f9265c0"},{"path":"integrations/workbuddy/server/workbench-hidden-launcher.vbs","sha256":"0fc1a0da2efdc49d39784888036b39a72aa6edf1f496a064ad4db105890b1a9e"},{"path":"integrations/workbuddy/server/workbench-process.mjs","sha256":"0b8fe4b9f73d51fac8fe704837afed03f30a2a6858140c4dfc364a4ad6047e57"},{"path":"integrations/workbuddy/server/workbench-task.ps1","sha256":"c2973667a10eefc96c0f999290f8aecc5e3b2062870f7637bf828252dff15fb5"},{"path":"integrations/workbuddy/skills/hellolynk-inbox/SKILL.md","sha256":"27b0f6b8033b702bcb22f0c70e39eac89ea61e0f1f2f6973a79361b0ec854942"},{"path":"integrations/workbuddy/skills/hellolynk-inbox/workbuddy.json","sha256":"163e506e3c87dd3f5128cd449de6affba48591c573e927edc128aeb93cd28735"},{"path":"runtime/connect-activate.mjs","sha256":"93c68c23ed2d18e87766ecd8dae6c3d8e757eca6ad7569477c8ec994402a8b0e"},{"path":"runtime/core/hellolynk-agent-configurator.mjs","sha256":"505b010ffd2c3fb614f2a4c6eae92a9fc5b640b8e48dff39e563dcbaabfd344b"},{"path":"runtime/core/hellolynk-client-account.mjs","sha256":"6e03a05127d4dc86be6391567b51a956d1a987acf4e23f5699ce0e00c3187b7e"},{"path":"runtime/core/hellolynk-client-core.mjs","sha256":"94bbad1d0ccee969bbffed176449e427188f1b892512a64167ab31f63d258e2b"},{"path":"runtime/core/hellolynk-client-profile.mjs","sha256":"8be37831c96610e3d0a64848ada86488970cc6079e49764b47d8a8b2ba852269"},{"path":"runtime/core/hellolynk-client-update-entry.mjs","sha256":"d9548eacda8632976e42aafc65f0cef2ec9c5233d2d53b31b02aec0a1702b5eb"},{"path":"runtime/core/hellolynk-client-update-runtime.mjs","sha256":"aa233e2cdbdfadb7da6aa489591bc12c4121101b94696f93f6e6cb5d3e7c7870"},{"path":"runtime/core/hellolynk-client-update.mjs","sha256":"e57f7cc5e98519a014cef7cef68a97bb7e2beb33eb381c38d1751a3967904aaa"},{"path":"runtime/core/hellolynk-contact-request-e2ee.mjs","sha256":"657664c6250d2738061e1ec2680eda6b36063c357d9e2d9c743e4218ece50895"},{"path":"runtime/core/hellolynk-darwin-host.mjs","sha256":"ded97c3bc3dd65ca75305f5199a1340dffb987a5f283454d60586df8b6b55c09"},{"path":"runtime/core/hellolynk-darwin-vault.mjs","sha256":"b6094d856af016e674e4a0183a4e474397bbe92e66638743fa62fe085b554d30"},{"path":"runtime/core/hellolynk-device-enrollment.mjs","sha256":"f3e99ff2bdfa76e5a830a518792a1b9e5e705d7a8a01eca725dd7c5c8391d4ef"},{"path":"runtime/core/hellolynk-direct-text-e2ee-client.mjs","sha256":"4007bf5e6c91df00adf10384cc1f0d0d28491b8ded518365dddbac717f3ac5be"},{"path":"runtime/core/hellolynk-direct-text-e2ee.mjs","sha256":"f0abc3714cfad007669140ead4bfbb3f5bd56edd24d4389c3addee3f42887a01"},{"path":"runtime/core/hellolynk-host-auth.mjs","sha256":"db1ec56f4e60e6450fba50188eecf89748f39f5d7a75c2456c30a6053233555d"},{"path":"runtime/core/hellolynk-host-protected-store.mjs","sha256":"10f81f4f6a5dd2fe9a742e847b2eb47dbf20f802f4414f46a05ccbc3505148e2"},{"path":"runtime/core/hellolynk-host-transport-client.mjs","sha256":"9f27d3e44ce8333413e712eb38b970a335b64081d7e3be6882ff5ca921668859"},{"path":"runtime/core/hellolynk-host.mjs","sha256":"6cbe0ba6ec7aa81059a4a2d0e247fbedb6731687ec21ded4aaefa0e79be9e493"},{"path":"runtime/core/hellolynk-human-confirmation-ledger.mjs","sha256":"43b6b6baea422eb226c850f15966c907d834bc2f5aadbab6ee0c9e05445f182f"},{"path":"runtime/core/hellolynk-human-relationship-controller.mjs","sha256":"7ef584c30febf0e142f621b719e433c0a9f5d976bbb917ab15f6cc1abb39ad52"},{"path":"runtime/core/hellolynk-inbox-read-state.mjs","sha256":"bf2353075f0a10cc3492c0d7309f8d3fef4a4bda1996b878cfbae8515beaeb34"},{"path":"runtime/core/hellolynk-indexed-message-store.mjs","sha256":"61a9d642fb0453aa949c6e634a30ae3f8562a81d3a666580a2f32d414c9f80ad"},{"path":"runtime/core/hellolynk-instance-conversation.mjs","sha256":"f00161cbdab48b33f0be1a809389145c167d8b8bdfab32d8c929db3bc167b4a1"},{"path":"runtime/core/hellolynk-local-contact-requests.mjs","sha256":"9724729b28c4c979696fcd53531e89eddb18a3045e32f602ecfb002af1c44b4c"},{"path":"runtime/core/hellolynk-local-contacts.mjs","sha256":"b7c722f0c300f951ed390ea82aec04975b226f2ea4d5c873764ab36ef9a8bc2c"},{"path":"runtime/core/hellolynk-local-data-migration.mjs","sha256":"1e791114633770fe3955842725965798dfd749e1dbf513f08efc4e01b9ed1756"},{"path":"runtime/core/hellolynk-local-data-protection.mjs","sha256":"cea4f73ec5a31918c48bd8234e28d38ff1bb8028d2591f542b15ee12b2238e1f"},{"path":"runtime/core/hellolynk-local-identity-trust.mjs","sha256":"b6d22715c627820c0ea92ca543cf52bbfeee5d5f416d242c2e21230640310420"},{"path":"runtime/core/hellolynk-local-messaging.mjs","sha256":"23e701818b18b96ba36ad1dfc3c2489d80fec8dafa2f433cf29947175786ed07"},{"path":"runtime/core/hellolynk-local-peer-transport.mjs","sha256":"9c32b2fa5f716f1ff36e09b3f2cd697479acc2f3c6bcb6e96045f5ca65e3b1c6"},{"path":"runtime/core/hellolynk-local-process-lock.mjs","sha256":"5212990a98b9ad2eb83fa2d5fb8a123d687c5ef6daf6cba49a4b6d04a7fe251e"},{"path":"runtime/core/hellolynk-model-inbox.mjs","sha256":"516c846340ee7a2fd624eaedaa51ded81988ef875b8a7eeb15c2e296774bfa63"},{"path":"runtime/core/hellolynk-model-notices.cjs","sha256":"c1b0d9071d3750c87755bc9fdf969d89c7fa62a0dede4c37b8cb2954b81163b0"},{"path":"runtime/core/hellolynk-native-addressing-tools.cjs","sha256":"f4bd81b3d03277e28955a62409383a0c4072c6212567f71425df4e18ece75d63"},{"path":"runtime/core/hellolynk-native-conversations.mjs","sha256":"671030938a5259f6cce0c1eb4e61997f7f89232c677c9ba26062daea91b6f8c6"},{"path":"runtime/core/hellolynk-native-human-confirmation-broker.mjs","sha256":"f190c28af2703b58a685a57213b2789df7eda35d7699d718f9420cd1dddd1b65"},{"path":"runtime/core/hellolynk-native-inbox-runtime.mjs","sha256":"039ba7fe8273357d178556fc57e751c469e2bf0056bcaee5029e7fe376099c72"},{"path":"runtime/core/hellolynk-native-notice.mjs","sha256":"6a5fe50fbccac465d690612839eaf7c10a5622cd84151277b0bf4507eccbe087"},{"path":"runtime/core/hellolynk-native-reply-routes.mjs","sha256":"8ed07580f2b6fe6bff9953951ea79f6c7c1c806887cd0bf21d4893ba8343ebe2"},{"path":"runtime/core/hellolynk-native-worker-lease.mjs","sha256":"e4e6864ff047b1d3511c363eb2bc7a3a3841a453f5d9d40b94bde55cc38cebc5"},{"path":"runtime/core/hellolynk-neutral-host-assembly.mjs","sha256":"d0ac9c697bf8a85263d99a0739da557c62f52c72f4afb105eb97b3aac2ae1f3b"},{"path":"runtime/core/hellolynk-neutral-host-installation-store.mjs","sha256":"42ae1e7deb876a8308b7bfed6a7b891d1834117b62504fc5befe3f91a0b4c740"},{"path":"runtime/core/hellolynk-neutral-host-launcher.mjs","sha256":"d94b853a7ed1ebc9c7e9bd7c37e2405e39849fb6d4ddf3d697e17ba169eda6d2"},{"path":"runtime/core/hellolynk-neutral-host-process.mjs","sha256":"7b237a1400c604da5decbb29ab3ce556fd1b744d0cfd7d28b5560b217da120b1"},{"path":"runtime/core/hellolynk-neutral-host-store-adapters.mjs","sha256":"3e425ca2cc111e750f55e94be2561cae8a3b308e473fb549e42da3443b67fd34"},{"path":"runtime/core/hellolynk-neutral-host-workbench-read-model.mjs","sha256":"65ca217dbd5be05f4cf38fd977b0d536526f79463a402fae90a7329dac375670"},{"path":"runtime/core/hellolynk-platform-credential-store.mjs","sha256":"3969708bafefc3b267bb34a9dcc115804c874ad14f4a036426d727c02ff70d42"},{"path":"runtime/core/hellolynk-relay-client-cli.mjs","sha256":"29707c4e0d91d5db6f46408b4c1101b9ab30b117500a9e315da8802e71a43010"},{"path":"runtime/core/hellolynk-release-retention.mjs","sha256":"0ee150af5a9bcc1f636e3ff980ee90ce7d073ab5ed4a991920cd3472bc65529c"},{"path":"runtime/core/hellolynk-runtime-safety.cjs","sha256":"43d576d9f774409f4a735793c1503a6f397e787b10c59a4ac9cc9257299f5efe"},{"path":"runtime/core/hellolynk-workbench-action-grants.mjs","sha256":"076d1bb848c85c06695440f33daebd853a9f49147a85cf582cc3e2964d95198a"},{"path":"runtime/core/hellolynk-workbench-connection.mjs","sha256":"6ce8e75025d31ed81c39150df2766231fc871ef18c234de986dc910bab79d639"},{"path":"runtime/neutral-host-bootstrap.mjs","sha256":"db0ffd88a5fbb9091f16ceab4e391ac6919ba2640cdbc358574034779f848d7e"},{"path":"runtime/neutral-host-release-entry.mjs","sha256":"d434d392c85728228772369e9a890cef34598833ab2433dcc7b963c17bf5c146"},{"path":"runtime/neutral-host-release-loader.mjs","sha256":"7cf7fae067fe3830853167394b18eecb945efc55ab8c26c80f14a61e6d33d27f"},{"path":"runtime/neutral-host-release-manifest.json","sha256":"938801bbdc7516676014bf044b7e5e992a446777bbc74016b31d6e7a6560b36d"},{"path":"runtime/neutral-host-release-pin.json","sha256":"85d3f3c173ad0daec8ab8f5b980612ef8db08afa3bff48ec41d5f146e5a3aee5"},{"path":"runtime/platform/windows/configure-agent.ps1","sha256":"7dc7c75bf0f7e45060b041a08d502993afe84581040f165e7f4437bf490708fa"},{"path":"runtime/platform/windows/credential-store.ps1","sha256":"8f288c91a1f6ecaf2651baab9bdfc55014c11ea9e165f203ca7a69f4d47d7917"},{"path":"runtime/platform/windows/hellolynk-host-protected-store.ps1","sha256":"24357e8ce54090b4ec68e457f02c9e834a80f3273ef3c03a8c0fa7258797fb49"},{"path":"runtime/platform/windows/hellolynk-human-confirmation-ledger.ps1","sha256":"4612561e2128dfd96c018f2c2d9ae41016f35bb6df8536314e9f0fb428165a82"},{"path":"runtime/platform/windows/hellolynk-local-data-key.ps1","sha256":"0976a0ecdd724e767b87e65743a230569c3fcb30e2449cf38bb718eb1604c15c"},{"path":"runtime/platform/windows/hellolynk-native-human-confirmation-broker.ps1","sha256":"757a731a3e8761d5d473db19ecfc330783f2826663a0057c4d6896e679d7a388"},{"path":"runtime/workbench/candidate-bootstrap.mjs","sha256":"891b02f750693e5b4836e716922c2d632f6736b2a5b3b7417f161499459f3f56"},{"path":"runtime/workbench/contract.mjs","sha256":"20648c3ed8e20b984b698010855414f8d4acaf0e2ade53b997b5582a85d90a08"},{"path":"runtime/workbench/hellolynk-workbench-build.json","sha256":"e24d6fe83a562f069012e1a7181835f240cdfd706b406a1c92dae659cc6e22eb"},{"path":"runtime/workbench/host-capabilities.mjs","sha256":"4e1a82e6cb46dd775ba39e2d34ff21eb1c293523883d18e607084ca91cfffb87"},{"path":"runtime/workbench/i18n.mjs","sha256":"272917746c06cabc1b87b94341f2deca5591f0bea2d7a0e07b2d959d8e1f8c74"},{"path":"runtime/workbench/loopback-surface.mjs","sha256":"6a550034c5dd558dfd22f9cb589fd76df40a99e976538e3b5d01371d212c9aa6"},{"path":"runtime/workbench/mcp-app-bundle.mjs","sha256":"48fb8224cbaa7f78a386a79b2dba761f4de6c4b83b16032f7f96bd9783e172e4"},{"path":"runtime/workbench/service.mjs","sha256":"3bf82a0076e9fe3b62105c626fe0d622092224f28d3905c62eafd65bf5385dcc"},{"path":"runtime/workbench/state.mjs","sha256":"770d10f3bf76236772c87e86f5da346c013da387fb40c08360f895a7052cf7b5"},{"path":"runtime/workbench/transports.mjs","sha256":"0c9f42ca9c9a4b4cc29b1bdcc0a0488d16a9ad06c235c642dff9cd4fc6f0d528"},{"path":"runtime/workbench/ui/app.mjs","sha256":"643a5ac8d303f936ee87dd7c0c851aa1988e99ea9a9a45c6c89da28bdc76e799"},{"path":"runtime/workbench/ui/connection-form.mjs","sha256":"700ca793f5eddca1dfea5f220c73732efc51ea4e1f8b8fc36da2bb67136240f0"},{"path":"runtime/workbench/ui/hellolynk-mark.png","sha256":"108e5c90e1717a87169d317c15f8de33859ed487b06654888047c729d9ab5982"},{"path":"runtime/workbench/ui/http-transport.mjs","sha256":"b2fedbc2c34bcf065e0fc23c8c5fb37d358c03daa2c82ba46530b8dfb8fdc571"},{"path":"runtime/workbench/ui/icons/arrow-left.svg","sha256":"1c527dd347b5fba0312cdcd66cf7514a261855672f7585d1c8b1882f602442a6"},{"path":"runtime/workbench/ui/icons/close.svg","sha256":"22f5c4fb0660601a817ead151c37e82e93d39b2ef4ce1192d66f9099a3c59b36"},{"path":"runtime/workbench/ui/icons/contacts.svg","sha256":"de0add3c43bca68d8cae7736bc3ea8145ca0abb7f32c25127542c6f5a27b3f45"},{"path":"runtime/workbench/ui/icons/inbox.svg","sha256":"e1938770f085e6794a2e22aa3f8e890e083ac341a3c3faa13098a8243dc8306b"},{"path":"runtime/workbench/ui/icons/refresh.svg","sha256":"a7b91e87c1a25d117b1352d2ec131bf6e3fe67df2020af87e0d3575c06d86f29"},{"path":"runtime/workbench/ui/icons/search.svg","sha256":"135df34e348445114a1b88757fe7ef79a6718ffa4cc761c30f8026044552b699"},{"path":"runtime/workbench/ui/icons/security.svg","sha256":"9b6c502b2ce2795530f2e7018e2c24aaaf1cf49472f040868bad148d3321071e"},{"path":"runtime/workbench/ui/icons/settings.svg","sha256":"17b528a15b8187aecd80c4974c7432ec6e58e6a12e062104fae70bf63c46caa2"},{"path":"runtime/workbench/ui/index.html","sha256":"b24cd1f768d5132539722ac7ade3acfe5aa86a47ee16a2adacf3bbf18b70c989"},{"path":"runtime/workbench/ui/loopback-entry.mjs","sha256":"0e5e5d259ab6e2d8408c6d2e089551e6f279dcb1267e9db19f9d9dded0956fd4"},{"path":"runtime/workbench/ui/mcp-app-client.mjs","sha256":"91b1e6e84a12434c2be7614845febfa44afa341d5d7f580bc1bfc106ed37f8f8"},{"path":"runtime/workbench/ui/mcp-app-entry.mjs","sha256":"ba82ac55c4efcf7701bda33b6c6e0df4d59da542b1d6c33c96ba7f2391c4773a"},{"path":"runtime/workbench/ui/styles.css","sha256":"26525ca14369e5e58e756ad3cb8dd5ca86d5158a838e2aab920506679cd384f0"}]}
|
|
1
|
+
{"contract":"hellolynk-workbuddy-immutable-package-v1","entry":"integrations/workbuddy/server/mcp-proxy.mjs","files":[{"path":"clients/core/hellolynk-client-account.mjs","sha256":"57082d5ea5e068dad81a47dd8abd38e34663e4563d8efa40f5130b817a346670"},{"path":"clients/core/hellolynk-client-core.mjs","sha256":"5d2190c2354ede169b2053864674c7ae5b80985970dc13609d6818c5a6d16940"},{"path":"clients/core/hellolynk-client-profile.mjs","sha256":"4528f2eb90417dbe232c4fef254beeb20c94f9216388ec721f982dd7ee4adde5"},{"path":"clients/core/hellolynk-client-update-entry.mjs","sha256":"8b872933f9883a92889202cf370e1e8d878c2172e4e1c5d8aa8261f314577d90"},{"path":"clients/core/hellolynk-client-update-runtime.mjs","sha256":"6bdcc525579963fa3ffc46f29527817acc0b8090fdc6a9cbdadb0fc262eee12e"},{"path":"clients/core/hellolynk-client-update.mjs","sha256":"374690bb6cc7335b5f1cf030c33989aba9713e0922369edda0348b40ef71b02f"},{"path":"clients/core/hellolynk-contact-request-e2ee.mjs","sha256":"18526628b354d18bcbe5e621360ecfcd5dfa4cb4d91397fb87d0c20e1f332a5d"},{"path":"clients/core/hellolynk-darwin-host.mjs","sha256":"43dba4cd61cff66f2479c39532e504348a46e76faae0f7b1e09a7a7f5362e64a"},{"path":"clients/core/hellolynk-darwin-vault.mjs","sha256":"2972df9fa8a0d7594072a39bc8dfa2a41b8fb33ddf79cc5abe5e66636c1ea3ca"},{"path":"clients/core/hellolynk-device-enrollment.mjs","sha256":"18f9decb843a5a82ef8dfc3e866904e0b04bbc48d700eac55a8ae54c5729c2aa"},{"path":"clients/core/hellolynk-direct-text-e2ee-client.mjs","sha256":"dd5dfa410a664e21e14b3c253ca496dd303e36aa5a2e1370b78cc51ec1fba973"},{"path":"clients/core/hellolynk-direct-text-e2ee.mjs","sha256":"3fee00210896b81cf40d25c634a6a758adee18704ef4a74fbc00b699a58d53e5"},{"path":"clients/core/hellolynk-host-auth.mjs","sha256":"49baa0b82ab078ad74a892a179189bdbd303a791d580ba4d6eac457564fad535"},{"path":"clients/core/hellolynk-host-protected-store.mjs","sha256":"bb0167b7861de2c408b90c16f24765f45dfeca7033f90d31e17dca3fc9e30c41"},{"path":"clients/core/hellolynk-host-transport-client.mjs","sha256":"0c97425346496a5d5e1f2b3d092d5d227179051b63e8097bab225dffe576008a"},{"path":"clients/core/hellolynk-host.mjs","sha256":"ed88f2285b4c5eb8618a2f3f3c2a7a65d798465933b91b109121bb90b45f5880"},{"path":"clients/core/hellolynk-human-confirmation-ledger.mjs","sha256":"746f2d23f19fa110ecd87d0b1dc3d88138776accc3b177afd8f5d266223ccc81"},{"path":"clients/core/hellolynk-human-relationship-controller.mjs","sha256":"01589c3eeb1c35f26cb50a14ce4e603c7bffe71e0b11863aed97c85f356e3c97"},{"path":"clients/core/hellolynk-inbox-read-state.mjs","sha256":"3c354aaa7038446f8f554f9520db287cc06559e6cb22cb69f0121a179ff2cb01"},{"path":"clients/core/hellolynk-indexed-message-store.mjs","sha256":"101f928dc5fab8064132e8755f74e157d35f921b5fe7d52fc80c0e46dc131428"},{"path":"clients/core/hellolynk-instance-conversation.mjs","sha256":"2e4a23917d4a86216b653ed04ec46216b9400fa94c13c0a00f1afc7877e284cb"},{"path":"clients/core/hellolynk-local-contact-requests.mjs","sha256":"3cbf0a0c6adeff17ceb310d202138c2dde7e23d0e8309f2584c161aae4c36acd"},{"path":"clients/core/hellolynk-local-contacts.mjs","sha256":"93d923702bdb5cbcbd47faf01f2c2e30bfe612fc450ef35ee98477412b2bbc6e"},{"path":"clients/core/hellolynk-local-data-migration.mjs","sha256":"72046a992b14f43167d6a671ec1094d34041cf43ba16d9d507583228045c7aa2"},{"path":"clients/core/hellolynk-local-data-protection.mjs","sha256":"e33b0c83fff59ba3ed49ae880d1b95016be4457bc7fd223367683942c78525bc"},{"path":"clients/core/hellolynk-local-identity-trust.mjs","sha256":"658fb5264d587341497e7d869408e51c1850f750856585ec7368a13c26f76a07"},{"path":"clients/core/hellolynk-local-messaging.mjs","sha256":"76b4348eb6eff34dec41c90666ac8ee14554018c5729c39b5b78bac30f0eaf80"},{"path":"clients/core/hellolynk-local-peer-transport.mjs","sha256":"4b8f01002b03fa19a9eea9dd72c7a41c4c951d6ef201f06dd1a89086a0a872cd"},{"path":"clients/core/hellolynk-local-process-lock.mjs","sha256":"5dd9b21f4e4509b148daaf2b495036e336e56be320d2bf7a3fac08b8a567d3bf"},{"path":"clients/core/hellolynk-model-inbox.mjs","sha256":"e112cbbb1caff5aa6f4a71bdfcb2d1c38260a96e3e4ab076b5f95c55e1da645e"},{"path":"clients/core/hellolynk-model-notices.cjs","sha256":"1b1c6e190b89f7305d05e1dddddaa6d50b7289b90aeab4599073eaaae27396f1"},{"path":"clients/core/hellolynk-native-addressing-tools.cjs","sha256":"cce89fa33dbe630a78d77843919a8e4b0c12f3482e754f783e6ff038b81929c4"},{"path":"clients/core/hellolynk-native-conversations.mjs","sha256":"38116a956c2c96dbac6b5355e2097385475879ab5e9965ae3552912739379630"},{"path":"clients/core/hellolynk-native-human-confirmation-broker.mjs","sha256":"98d986f492a9e646f4601f25588cabe065e3c7bb00f0773b5dfd99e72e65c324"},{"path":"clients/core/hellolynk-native-inbox-runtime.mjs","sha256":"bee3a5789420cc25cbc153cc8291f144b3a10ae50e96269823b7890cb603789d"},{"path":"clients/core/hellolynk-native-notice.mjs","sha256":"6cdbae7ad07f104c1d19123299d9b672d9d51265e5e1f512acd12a083617d419"},{"path":"clients/core/hellolynk-native-reply-routes.mjs","sha256":"65af258205a7eb9d2c599e0f400dbd9ea198c38a26f491e06f27c5c46101fc9b"},{"path":"clients/core/hellolynk-native-task-index.cjs","sha256":"aaeb19ee32e4736bd4b8fd23c544305d98c41908ab5ff9b211454b913edd009e"},{"path":"clients/core/hellolynk-native-worker-lease.mjs","sha256":"41eb3103c216a09b80159522700b7bb78f3b082a644501fd19fa51ce1bf6bab7"},{"path":"clients/core/hellolynk-neutral-host-assembly.mjs","sha256":"8f8038559ed249d29e53e8ee0ad3db8e6319336bd3aadf49434aa7aa755bb647"},{"path":"clients/core/hellolynk-neutral-host-installation-store.mjs","sha256":"f6e04183e8e0c945006c5348ed251833ec12a6ab9777031609b5a3ccd0d2252d"},{"path":"clients/core/hellolynk-neutral-host-launcher.mjs","sha256":"0afe5310d1d9f7b1448a9f50aeb2c1fc93b42ce7eb48dd8472fbde5d33e898af"},{"path":"clients/core/hellolynk-neutral-host-process.mjs","sha256":"a2ed64720bd9772e5ac1fd93692820e1c5c58e03be114eb4707c2a7f4bd57f5e"},{"path":"clients/core/hellolynk-neutral-host-store-adapters.mjs","sha256":"b033d5cdedc54847bf1a9fd4d5b70af6d0e1ed8094e74feebbb592c242a0cde9"},{"path":"clients/core/hellolynk-neutral-host-workbench-read-model.mjs","sha256":"6767b4aaf5c7304587d7126f203535f02d1f1bfd692741105ad644686ecb1612"},{"path":"clients/core/hellolynk-platform-credential-store.mjs","sha256":"4a4f073c3a5398d0d51be5a28c1b86b06e6f3b0b613e833928d8437c030cf65f"},{"path":"clients/core/hellolynk-relay-client-cli.mjs","sha256":"e3134f37ff8c327b3148a4c417ee14c6c8bfbc3be9680e25c1ea29d215dff1d7"},{"path":"clients/core/hellolynk-release-retention.mjs","sha256":"b894c452019b89486dd3090c9eeee7b7c2bb4e50753565bf88ecd14ce0efeaf1"},{"path":"clients/core/hellolynk-runtime-safety.cjs","sha256":"1518d9904b329f05a92092f0f2d4014675014597573ba85f33e3e06c25ecea16"},{"path":"clients/core/hellolynk-workbench-action-grants.mjs","sha256":"7247f4bce07e6fafce6559604ef9c7a8f7a033b922c212344462411be55ea9ac"},{"path":"clients/core/hellolynk-workbench-connection.mjs","sha256":"0f24d28316253a761dc03d8096dace3da7a3cf8cb8eaf575765b2aa07d30274c"},{"path":"clients/platform/windows/credential-store.ps1","sha256":"4817c3c91d5d180763794a7a528f83664602f34cf1d1a8396e75ad6d56bd874f"},{"path":"clients/platform/windows/hellolynk-host-protected-store.ps1","sha256":"84ac61c3762b7f944bf3e2c895f9a6427985ce697052afd9bc610474c921adad"},{"path":"clients/platform/windows/hellolynk-human-confirmation-ledger.ps1","sha256":"317409f270f2cbd8017b61384292cf9caf4bd0fce6ef7a9894c1ec4c173b240c"},{"path":"clients/platform/windows/hellolynk-local-data-key.ps1","sha256":"3143122114c9756370e2ff3f56eba4a03e4a1657888aab1c6d4387427081d937"},{"path":"clients/platform/windows/hellolynk-native-human-confirmation-broker.ps1","sha256":"d63e02b34eb43d1a81d771f0e23f0b8d38e34c8f96663156d0c7b79985802936"},{"path":"clients/workbench/contract.mjs","sha256":"9994f8c7260495355d9e02ff96b7dd1074e1bf2ee238fbaafa6864bf749c095c"},{"path":"clients/workbench/service.mjs","sha256":"681fe98e286a69a187fb59c8f955c274a51bb38606b9618800ee5995f768e367"},{"path":"integrations/workbuddy/package.json","sha256":"aaa1f5f017dacc56cb6a1fb308408fcf7fd94bc3eab68d95935c0da6fcffff94"},{"path":"integrations/workbuddy/server/host-lifecycle.mjs","sha256":"3b8e6d6d537226a6242059830759df1a686a42f50c3103c5e949d79806c1a4f9"},{"path":"integrations/workbuddy/server/mcp-proxy.mjs","sha256":"5b4a4ac035e23bea30e4559451252ce0aa48fc7e2929c910fa9a2e31324bfc70"},{"path":"integrations/workbuddy/server/mcp-server.mjs","sha256":"00ea077f3cbcd5cc75f5d3df8689c6a46381506198149fcad98ef20f85833b18"},{"path":"integrations/workbuddy/server/model-call-origin.mjs","sha256":"4cece99ea644c71388323557dc0d9ba493a96cff75b55421d5e53d35ec97f584"},{"path":"integrations/workbuddy/server/native-task-cdp.mjs","sha256":"4a6894cc97866c8e9d0beae138e2e0a98412191207494e98844b17120ec839f5"},{"path":"integrations/workbuddy/server/native-task-debug-startup.mjs","sha256":"2bb5a92a82213191c120af0c3e6ce62977e3164551bec60d1e0bcbb3635d99e4"},{"path":"integrations/workbuddy/server/native-task-debug-startup.ps1","sha256":"49b2c00c806cce6b6b50abf8e4e6cf699777889fe4b488872e926980b6368615"},{"path":"integrations/workbuddy/server/native-task-mcp-registration.mjs","sha256":"fe19db7cd3d700542c20325589f99a3f607c3d2b893a950afd06c9007fd01d7b"},{"path":"integrations/workbuddy/server/native-task-service-registration.mjs","sha256":"025e9be428c438bb87565536404ded32cb1db56614441911c74169270f6e1422"},{"path":"integrations/workbuddy/server/native-task-worker.mjs","sha256":"8b6d11fca70adde335a6b1c92776c6d76ba69ff669457a7d803a8076457b4c8d"},{"path":"integrations/workbuddy/server/neutral-host-adapter.mjs","sha256":"fa053192e761bbd9eecea95e127b68d3b94d56e91d861230bd9771a1cd754b09"},{"path":"integrations/workbuddy/server/origin-hook.mjs","sha256":"4f2fe78f59771fef1ca1e1cc145a38df566cc70ff318ff6192f2e4003d76bc3d"},{"path":"integrations/workbuddy/server/origin-routes.mjs","sha256":"893bfb495c78579062e1007afab6dee07f0994d48109413355d8951eceb52dd5"},{"path":"integrations/workbuddy/server/package-bootstrap.mjs","sha256":"8794c98a846c6d1c3683fa31b9296267725a5f4f9160b57a6f6039937292cb25"},{"path":"integrations/workbuddy/server/workbench-candidate.mjs","sha256":"caa64a710a71afe67dde53b7a46dd91ea555b5a946a2749909fcf54e5f9265c0"},{"path":"integrations/workbuddy/server/workbench-hidden-launcher.vbs","sha256":"0fc1a0da2efdc49d39784888036b39a72aa6edf1f496a064ad4db105890b1a9e"},{"path":"integrations/workbuddy/server/workbench-process.mjs","sha256":"0b8fe4b9f73d51fac8fe704837afed03f30a2a6858140c4dfc364a4ad6047e57"},{"path":"integrations/workbuddy/server/workbench-task.ps1","sha256":"c2973667a10eefc96c0f999290f8aecc5e3b2062870f7637bf828252dff15fb5"},{"path":"integrations/workbuddy/skills/hellolynk-inbox/SKILL.md","sha256":"27b0f6b8033b702bcb22f0c70e39eac89ea61e0f1f2f6973a79361b0ec854942"},{"path":"integrations/workbuddy/skills/hellolynk-inbox/workbuddy.json","sha256":"163e506e3c87dd3f5128cd449de6affba48591c573e927edc128aeb93cd28735"},{"path":"runtime/connect-activate.mjs","sha256":"93c68c23ed2d18e87766ecd8dae6c3d8e757eca6ad7569477c8ec994402a8b0e"},{"path":"runtime/core/hellolynk-agent-configurator.mjs","sha256":"505b010ffd2c3fb614f2a4c6eae92a9fc5b640b8e48dff39e563dcbaabfd344b"},{"path":"runtime/core/hellolynk-client-account.mjs","sha256":"6e03a05127d4dc86be6391567b51a956d1a987acf4e23f5699ce0e00c3187b7e"},{"path":"runtime/core/hellolynk-client-core.mjs","sha256":"dbab0f067c1a7f02c43b2696e1f5972288acd4f93a18684bf3cc120edff5cf94"},{"path":"runtime/core/hellolynk-client-profile.mjs","sha256":"8be37831c96610e3d0a64848ada86488970cc6079e49764b47d8a8b2ba852269"},{"path":"runtime/core/hellolynk-client-update-entry.mjs","sha256":"d9548eacda8632976e42aafc65f0cef2ec9c5233d2d53b31b02aec0a1702b5eb"},{"path":"runtime/core/hellolynk-client-update-runtime.mjs","sha256":"aa233e2cdbdfadb7da6aa489591bc12c4121101b94696f93f6e6cb5d3e7c7870"},{"path":"runtime/core/hellolynk-client-update.mjs","sha256":"e57f7cc5e98519a014cef7cef68a97bb7e2beb33eb381c38d1751a3967904aaa"},{"path":"runtime/core/hellolynk-contact-request-e2ee.mjs","sha256":"657664c6250d2738061e1ec2680eda6b36063c357d9e2d9c743e4218ece50895"},{"path":"runtime/core/hellolynk-darwin-host.mjs","sha256":"ded97c3bc3dd65ca75305f5199a1340dffb987a5f283454d60586df8b6b55c09"},{"path":"runtime/core/hellolynk-darwin-vault.mjs","sha256":"b6094d856af016e674e4a0183a4e474397bbe92e66638743fa62fe085b554d30"},{"path":"runtime/core/hellolynk-device-enrollment.mjs","sha256":"f3e99ff2bdfa76e5a830a518792a1b9e5e705d7a8a01eca725dd7c5c8391d4ef"},{"path":"runtime/core/hellolynk-direct-text-e2ee-client.mjs","sha256":"4007bf5e6c91df00adf10384cc1f0d0d28491b8ded518365dddbac717f3ac5be"},{"path":"runtime/core/hellolynk-direct-text-e2ee.mjs","sha256":"f0abc3714cfad007669140ead4bfbb3f5bd56edd24d4389c3addee3f42887a01"},{"path":"runtime/core/hellolynk-host-auth.mjs","sha256":"db1ec56f4e60e6450fba50188eecf89748f39f5d7a75c2456c30a6053233555d"},{"path":"runtime/core/hellolynk-host-protected-store.mjs","sha256":"10f81f4f6a5dd2fe9a742e847b2eb47dbf20f802f4414f46a05ccbc3505148e2"},{"path":"runtime/core/hellolynk-host-transport-client.mjs","sha256":"9f27d3e44ce8333413e712eb38b970a335b64081d7e3be6882ff5ca921668859"},{"path":"runtime/core/hellolynk-host.mjs","sha256":"6cbe0ba6ec7aa81059a4a2d0e247fbedb6731687ec21ded4aaefa0e79be9e493"},{"path":"runtime/core/hellolynk-human-confirmation-ledger.mjs","sha256":"43b6b6baea422eb226c850f15966c907d834bc2f5aadbab6ee0c9e05445f182f"},{"path":"runtime/core/hellolynk-human-relationship-controller.mjs","sha256":"7ef584c30febf0e142f621b719e433c0a9f5d976bbb917ab15f6cc1abb39ad52"},{"path":"runtime/core/hellolynk-inbox-read-state.mjs","sha256":"bf2353075f0a10cc3492c0d7309f8d3fef4a4bda1996b878cfbae8515beaeb34"},{"path":"runtime/core/hellolynk-indexed-message-store.mjs","sha256":"61a9d642fb0453aa949c6e634a30ae3f8562a81d3a666580a2f32d414c9f80ad"},{"path":"runtime/core/hellolynk-instance-conversation.mjs","sha256":"f00161cbdab48b33f0be1a809389145c167d8b8bdfab32d8c929db3bc167b4a1"},{"path":"runtime/core/hellolynk-local-contact-requests.mjs","sha256":"9724729b28c4c979696fcd53531e89eddb18a3045e32f602ecfb002af1c44b4c"},{"path":"runtime/core/hellolynk-local-contacts.mjs","sha256":"b7c722f0c300f951ed390ea82aec04975b226f2ea4d5c873764ab36ef9a8bc2c"},{"path":"runtime/core/hellolynk-local-data-migration.mjs","sha256":"1e791114633770fe3955842725965798dfd749e1dbf513f08efc4e01b9ed1756"},{"path":"runtime/core/hellolynk-local-data-protection.mjs","sha256":"cea4f73ec5a31918c48bd8234e28d38ff1bb8028d2591f542b15ee12b2238e1f"},{"path":"runtime/core/hellolynk-local-identity-trust.mjs","sha256":"b6d22715c627820c0ea92ca543cf52bbfeee5d5f416d242c2e21230640310420"},{"path":"runtime/core/hellolynk-local-messaging.mjs","sha256":"23e701818b18b96ba36ad1dfc3c2489d80fec8dafa2f433cf29947175786ed07"},{"path":"runtime/core/hellolynk-local-peer-transport.mjs","sha256":"9c32b2fa5f716f1ff36e09b3f2cd697479acc2f3c6bcb6e96045f5ca65e3b1c6"},{"path":"runtime/core/hellolynk-local-process-lock.mjs","sha256":"5212990a98b9ad2eb83fa2d5fb8a123d687c5ef6daf6cba49a4b6d04a7fe251e"},{"path":"runtime/core/hellolynk-model-inbox.mjs","sha256":"516c846340ee7a2fd624eaedaa51ded81988ef875b8a7eeb15c2e296774bfa63"},{"path":"runtime/core/hellolynk-model-notices.cjs","sha256":"c1b0d9071d3750c87755bc9fdf969d89c7fa62a0dede4c37b8cb2954b81163b0"},{"path":"runtime/core/hellolynk-native-addressing-tools.cjs","sha256":"f4bd81b3d03277e28955a62409383a0c4072c6212567f71425df4e18ece75d63"},{"path":"runtime/core/hellolynk-native-conversations.mjs","sha256":"671030938a5259f6cce0c1eb4e61997f7f89232c677c9ba26062daea91b6f8c6"},{"path":"runtime/core/hellolynk-native-human-confirmation-broker.mjs","sha256":"f190c28af2703b58a685a57213b2789df7eda35d7699d718f9420cd1dddd1b65"},{"path":"runtime/core/hellolynk-native-inbox-runtime.mjs","sha256":"039ba7fe8273357d178556fc57e751c469e2bf0056bcaee5029e7fe376099c72"},{"path":"runtime/core/hellolynk-native-notice.mjs","sha256":"6a5fe50fbccac465d690612839eaf7c10a5622cd84151277b0bf4507eccbe087"},{"path":"runtime/core/hellolynk-native-reply-routes.mjs","sha256":"8ed07580f2b6fe6bff9953951ea79f6c7c1c806887cd0bf21d4893ba8343ebe2"},{"path":"runtime/core/hellolynk-native-worker-lease.mjs","sha256":"e4e6864ff047b1d3511c363eb2bc7a3a3841a453f5d9d40b94bde55cc38cebc5"},{"path":"runtime/core/hellolynk-neutral-host-assembly.mjs","sha256":"287ad6e077c8da05799b970ffa6607d8c7a0ab54a4837de51516e6af0ef6695b"},{"path":"runtime/core/hellolynk-neutral-host-installation-store.mjs","sha256":"42ae1e7deb876a8308b7bfed6a7b891d1834117b62504fc5befe3f91a0b4c740"},{"path":"runtime/core/hellolynk-neutral-host-launcher.mjs","sha256":"d94b853a7ed1ebc9c7e9bd7c37e2405e39849fb6d4ddf3d697e17ba169eda6d2"},{"path":"runtime/core/hellolynk-neutral-host-process.mjs","sha256":"ad6809633f49f7316acf6ce5b8f71a13d7ba20d3b62a2700664421ba671b5369"},{"path":"runtime/core/hellolynk-neutral-host-store-adapters.mjs","sha256":"3e425ca2cc111e750f55e94be2561cae8a3b308e473fb549e42da3443b67fd34"},{"path":"runtime/core/hellolynk-neutral-host-workbench-read-model.mjs","sha256":"65ca217dbd5be05f4cf38fd977b0d536526f79463a402fae90a7329dac375670"},{"path":"runtime/core/hellolynk-platform-credential-store.mjs","sha256":"4b4b27cd86f4816e5e6ec4914816a335cdea5c4b4ffb2091775c061a9676a69c"},{"path":"runtime/core/hellolynk-relay-client-cli.mjs","sha256":"29707c4e0d91d5db6f46408b4c1101b9ab30b117500a9e315da8802e71a43010"},{"path":"runtime/core/hellolynk-release-retention.mjs","sha256":"0ee150af5a9bcc1f636e3ff980ee90ce7d073ab5ed4a991920cd3472bc65529c"},{"path":"runtime/core/hellolynk-runtime-safety.cjs","sha256":"43d576d9f774409f4a735793c1503a6f397e787b10c59a4ac9cc9257299f5efe"},{"path":"runtime/core/hellolynk-workbench-action-grants.mjs","sha256":"076d1bb848c85c06695440f33daebd853a9f49147a85cf582cc3e2964d95198a"},{"path":"runtime/core/hellolynk-workbench-connection.mjs","sha256":"6ce8e75025d31ed81c39150df2766231fc871ef18c234de986dc910bab79d639"},{"path":"runtime/neutral-host-bootstrap.mjs","sha256":"db0ffd88a5fbb9091f16ceab4e391ac6919ba2640cdbc358574034779f848d7e"},{"path":"runtime/neutral-host-release-entry.mjs","sha256":"d434d392c85728228772369e9a890cef34598833ab2433dcc7b963c17bf5c146"},{"path":"runtime/neutral-host-release-loader.mjs","sha256":"7cf7fae067fe3830853167394b18eecb945efc55ab8c26c80f14a61e6d33d27f"},{"path":"runtime/neutral-host-release-manifest.json","sha256":"9d3d6e3880a59444acafe27536817b63ba459c803218e821f5ef2705dffe13c3"},{"path":"runtime/neutral-host-release-pin.json","sha256":"88aca660e81d60992bb7ea9a552dffd78c01a99b4239ea72fe0fe3ae972caff4"},{"path":"runtime/platform/windows/configure-agent.ps1","sha256":"7dc7c75bf0f7e45060b041a08d502993afe84581040f165e7f4437bf490708fa"},{"path":"runtime/platform/windows/credential-store.ps1","sha256":"8f288c91a1f6ecaf2651baab9bdfc55014c11ea9e165f203ca7a69f4d47d7917"},{"path":"runtime/platform/windows/hellolynk-host-protected-store.ps1","sha256":"24357e8ce54090b4ec68e457f02c9e834a80f3273ef3c03a8c0fa7258797fb49"},{"path":"runtime/platform/windows/hellolynk-human-confirmation-ledger.ps1","sha256":"4612561e2128dfd96c018f2c2d9ae41016f35bb6df8536314e9f0fb428165a82"},{"path":"runtime/platform/windows/hellolynk-local-data-key.ps1","sha256":"0976a0ecdd724e767b87e65743a230569c3fcb30e2449cf38bb718eb1604c15c"},{"path":"runtime/platform/windows/hellolynk-native-human-confirmation-broker.ps1","sha256":"757a731a3e8761d5d473db19ecfc330783f2826663a0057c4d6896e679d7a388"},{"path":"runtime/workbench/candidate-bootstrap.mjs","sha256":"891b02f750693e5b4836e716922c2d632f6736b2a5b3b7417f161499459f3f56"},{"path":"runtime/workbench/contract.mjs","sha256":"20648c3ed8e20b984b698010855414f8d4acaf0e2ade53b997b5582a85d90a08"},{"path":"runtime/workbench/hellolynk-workbench-build.json","sha256":"e24d6fe83a562f069012e1a7181835f240cdfd706b406a1c92dae659cc6e22eb"},{"path":"runtime/workbench/host-capabilities.mjs","sha256":"4e1a82e6cb46dd775ba39e2d34ff21eb1c293523883d18e607084ca91cfffb87"},{"path":"runtime/workbench/i18n.mjs","sha256":"272917746c06cabc1b87b94341f2deca5591f0bea2d7a0e07b2d959d8e1f8c74"},{"path":"runtime/workbench/loopback-surface.mjs","sha256":"6a550034c5dd558dfd22f9cb589fd76df40a99e976538e3b5d01371d212c9aa6"},{"path":"runtime/workbench/mcp-app-bundle.mjs","sha256":"48fb8224cbaa7f78a386a79b2dba761f4de6c4b83b16032f7f96bd9783e172e4"},{"path":"runtime/workbench/service.mjs","sha256":"3bf82a0076e9fe3b62105c626fe0d622092224f28d3905c62eafd65bf5385dcc"},{"path":"runtime/workbench/state.mjs","sha256":"770d10f3bf76236772c87e86f5da346c013da387fb40c08360f895a7052cf7b5"},{"path":"runtime/workbench/transports.mjs","sha256":"0c9f42ca9c9a4b4cc29b1bdcc0a0488d16a9ad06c235c642dff9cd4fc6f0d528"},{"path":"runtime/workbench/ui/app.mjs","sha256":"643a5ac8d303f936ee87dd7c0c851aa1988e99ea9a9a45c6c89da28bdc76e799"},{"path":"runtime/workbench/ui/connection-form.mjs","sha256":"700ca793f5eddca1dfea5f220c73732efc51ea4e1f8b8fc36da2bb67136240f0"},{"path":"runtime/workbench/ui/hellolynk-mark.png","sha256":"108e5c90e1717a87169d317c15f8de33859ed487b06654888047c729d9ab5982"},{"path":"runtime/workbench/ui/http-transport.mjs","sha256":"b2fedbc2c34bcf065e0fc23c8c5fb37d358c03daa2c82ba46530b8dfb8fdc571"},{"path":"runtime/workbench/ui/icons/arrow-left.svg","sha256":"1c527dd347b5fba0312cdcd66cf7514a261855672f7585d1c8b1882f602442a6"},{"path":"runtime/workbench/ui/icons/close.svg","sha256":"22f5c4fb0660601a817ead151c37e82e93d39b2ef4ce1192d66f9099a3c59b36"},{"path":"runtime/workbench/ui/icons/contacts.svg","sha256":"de0add3c43bca68d8cae7736bc3ea8145ca0abb7f32c25127542c6f5a27b3f45"},{"path":"runtime/workbench/ui/icons/inbox.svg","sha256":"e1938770f085e6794a2e22aa3f8e890e083ac341a3c3faa13098a8243dc8306b"},{"path":"runtime/workbench/ui/icons/refresh.svg","sha256":"a7b91e87c1a25d117b1352d2ec131bf6e3fe67df2020af87e0d3575c06d86f29"},{"path":"runtime/workbench/ui/icons/search.svg","sha256":"135df34e348445114a1b88757fe7ef79a6718ffa4cc761c30f8026044552b699"},{"path":"runtime/workbench/ui/icons/security.svg","sha256":"9b6c502b2ce2795530f2e7018e2c24aaaf1cf49472f040868bad148d3321071e"},{"path":"runtime/workbench/ui/icons/settings.svg","sha256":"17b528a15b8187aecd80c4974c7432ec6e58e6a12e062104fae70bf63c46caa2"},{"path":"runtime/workbench/ui/index.html","sha256":"b24cd1f768d5132539722ac7ade3acfe5aa86a47ee16a2adacf3bbf18b70c989"},{"path":"runtime/workbench/ui/loopback-entry.mjs","sha256":"0e5e5d259ab6e2d8408c6d2e089551e6f279dcb1267e9db19f9d9dded0956fd4"},{"path":"runtime/workbench/ui/mcp-app-client.mjs","sha256":"91b1e6e84a12434c2be7614845febfa44afa341d5d7f580bc1bfc106ed37f8f8"},{"path":"runtime/workbench/ui/mcp-app-entry.mjs","sha256":"ba82ac55c4efcf7701bda33b6c6e0df4d59da542b1d6c33c96ba7f2391c4773a"},{"path":"runtime/workbench/ui/styles.css","sha256":"26525ca14369e5e58e756ad3cb8dd5ca86d5158a838e2aab920506679cd384f0"}]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"contract":"hellolynk-workbuddy-immutable-package-pin-v1","manifestSha256":"
|
|
1
|
+
{"contract":"hellolynk-workbuddy-immutable-package-pin-v1","manifestSha256":"dc9e4128a28349eeade1aaa3749c9e869ce192ebeb851617abb8701443d34022"}
|