@hellolynk-ai/workbuddy-mcp 0.3.100 → 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.
@@ -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
- if (
659
- current && current.expiresAtMs - now() > minimumRemainingMs
660
- && routeMatches(current, input)
661
- && scopesMatch(current, input)
662
- && (input?.expectedAgentId == null || input.expectedAgentId === current.agentId)
663
- && (input?.expectedPrincipalId == null || input.expectedPrincipalId === current.principalId)
664
- ) return current;
665
- const reusableCurrent = reusable(current, input);
666
- if (reusableCurrent) return reusableCurrent;
667
- const previousSession = recoveryProof(current, input);
668
- current = reusable(await issue({ ...input, previousSession }), input);
669
- if (!current) throw new HelloLynkClientError("invalid_runtime_session_handle");
670
- return current;
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 = reusable(await issue({ ...input, previousSession: persisted }), input);
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
- issue: async ({ previousSession } = {}) => {
247
- let deviceCredential = await credentialStore.load(profile.profileId);
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 = 16;
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,12 +2,12 @@
2
2
  "contract": "hellolynk-client-npm-pack-manifest-v1",
3
3
  "client": "workbuddy",
4
4
  "packageName": "@hellolynk-ai/workbuddy-mcp",
5
- "version": "0.3.100",
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",
9
9
  "version": "1.3.43",
10
- "manifestSha256": "43e42633242cb456ecf2a120380230485e4d8533934ad6242089049d9282da11"
10
+ "manifestSha256": "e24d6fe83a562f069012e1a7181835f240cdfd706b406a1c92dae659cc6e22eb"
11
11
  },
12
12
  "files": [
13
13
  {
@@ -27,8 +27,8 @@
27
27
  },
28
28
  {
29
29
  "path": "clients/core/hellolynk-client-core.mjs",
30
- "bytes": 34320,
31
- "sha256": "af7c9cb7a996fdb194c51dbcc745c48b616ff1686d79a1451104690d882df1b8"
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": 47797,
221
- "sha256": "98b2b669183cda15272b182d5c04d3ae77511b8b657cd3179cbf2fa5d5f27920"
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": "634279c96b8b4e83bcbcc92c5184f4ec7c31713a097f45af3f5650f8151fb78b"
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": 39386,
251
- "sha256": "0ab136d36e890309b4cb5ff6f1cef6f3d82caf65f5b1d08c7b3992442ffe38a7"
250
+ "bytes": 40982,
251
+ "sha256": "4a4f073c3a5398d0d51be5a28c1b86b06e6f3b0b613e833928d8437c030cf65f"
252
252
  },
253
253
  {
254
254
  "path": "clients/core/hellolynk-relay-client-cli.mjs",
@@ -312,8 +312,8 @@
312
312
  },
313
313
  {
314
314
  "path": "integrations/workbuddy/package.json",
315
- "bytes": 1125,
316
- "sha256": "faf3d8dcf992b437caae85981844a3f58aaab739a6ec5e05fdd11811efa769ef"
315
+ "bytes": 1156,
316
+ "sha256": "aaa1f5f017dacc56cb6a1fb308408fcf7fd94bc3eab68d95935c0da6fcffff94"
317
317
  },
318
318
  {
319
319
  "path": "integrations/workbuddy/server/host-lifecycle.mjs",
@@ -397,8 +397,8 @@
397
397
  },
398
398
  {
399
399
  "path": "integrations/workbuddy/server/workbench-process.mjs",
400
- "bytes": 19769,
401
- "sha256": "dbbb372e522b17894b6e50c12a13fc172ff752d1487354c772fcc670add212c0"
400
+ "bytes": 22652,
401
+ "sha256": "0b8fe4b9f73d51fac8fe704837afed03f30a2a6858140c4dfc364a4ad6047e57"
402
402
  },
403
403
  {
404
404
  "path": "integrations/workbuddy/server/workbench-task.ps1",
@@ -423,7 +423,7 @@
423
423
  {
424
424
  "path": "package.json",
425
425
  "bytes": 2019,
426
- "sha256": "3da057c2af9d3a0be2c1b016b543bfe47dfb3c8551769a5aabe472a12970bb23"
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": 33550,
451
- "sha256": "94bbad1d0ccee969bbffed176449e427188f1b892512a64167ab31f63d258e2b"
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": 46842,
636
- "sha256": "d0ac9c697bf8a85263d99a0739da557c62f52c72f4afb105eb97b3aac2ae1f3b"
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": "7b237a1400c604da5decbb29ab3ce556fd1b744d0cfd7d28b5560b217da120b1"
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": 38559,
666
- "sha256": "3969708bafefc3b267bb34a9dcc115804c874ad14f4a036426d727c02ff70d42"
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": "938801bbdc7516676014bf044b7e5e992a446777bbc74016b31d6e7a6560b36d"
711
+ "sha256": "9d3d6e3880a59444acafe27536817b63ba459c803218e821f5ef2705dffe13c3"
712
712
  },
713
713
  {
714
714
  "path": "runtime/neutral-host-release-pin.json",
715
715
  "bytes": 146,
716
- "sha256": "85d3f3c173ad0daec8ab8f5b980612ef8db08afa3bff48ec41d5f146e5a3aee5"
716
+ "sha256": "88aca660e81d60992bb7ea9a552dffd78c01a99b4239ea72fe0fe3ae972caff4"
717
717
  },
718
718
  {
719
719
  "path": "runtime/platform/windows/configure-agent.ps1",
@@ -758,7 +758,7 @@
758
758
  {
759
759
  "path": "runtime/workbench/hellolynk-workbench-build.json",
760
760
  "bytes": 7191,
761
- "sha256": "43e42633242cb456ecf2a120380230485e4d8533934ad6242089049d9282da11"
761
+ "sha256": "e24d6fe83a562f069012e1a7181835f240cdfd706b406a1c92dae659cc6e22eb"
762
762
  },
763
763
  {
764
764
  "path": "runtime/workbench/host-capabilities.mjs",
@@ -877,8 +877,8 @@
877
877
  },
878
878
  {
879
879
  "path": "runtime/workbench/ui/styles.css",
880
- "bytes": 53189,
881
- "sha256": "34d24d3d35800a796905049eb5f785f402cf1e82118c66efd4893bd003adbe31"
880
+ "bytes": 53238,
881
+ "sha256": "26525ca14369e5e58e756ad3cb8dd5ca86d5158a838e2aab920506679cd384f0"
882
882
  },
883
883
  {
884
884
  "path": "tools/hellolynk-activate-neutral-host-clients.mjs",
@@ -893,12 +893,12 @@
893
893
  {
894
894
  "path": "workbuddy-package-manifest.json",
895
895
  "bytes": 22640,
896
- "sha256": "4690314c830a333e5372fe4ca311f0dd80af4d2755dbbb5f13b788cdb528e560"
896
+ "sha256": "dc9e4128a28349eeade1aaa3749c9e869ce192ebeb851617abb8701443d34022"
897
897
  },
898
898
  {
899
899
  "path": "workbuddy-package-pin.json",
900
900
  "bytes": 143,
901
- "sha256": "92ad353597ab160d206156c7455b775f1910878d2610e3cd6e5d31078687c8a3"
901
+ "sha256": "946f81e963214554465d792d6d90bc4b2f93fa6c529246904fbad1e6b06a0f29"
902
902
  }
903
903
  ]
904
904
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "contract": "hellolynk-client-npm-pack-pin-v1",
3
- "manifestSha256": "a79088e7f5d1561a49db9422b9531b5e827397b43070277df52b38e478d271b8"
3
+ "manifestSha256": "602fffc7ae673f554a4cc8ee7a52e7e1337f3bf9e8ea3da7642f5f84dff9a0a6"
4
4
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@hellolynk-ai/workbuddy-mcp",
3
- "version": "0.3.100",
3
+ "version": "0.3.102",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "WorkBuddy one-click bridge for local HelloLynk Messaging.",
7
7
  "scripts": {
8
8
  "smoke": "node test/workbuddy-stdio-smoke.mjs",
9
- "test": "node test/workbuddy-stdio-smoke.mjs && node test/local-web-smoke.mjs && node test/local-web-package-smoke.mjs && node test/workbench-process-smoke.mjs && node test/pending-consumption-smoke.mjs && node test/pending-loopback-smoke.mjs && node --test test/model-inbox-caller.test.mjs test/proxy-reply.test.mjs test/native-task-store.test.mjs test/native-task-worker.test.mjs test/origin-routes.test.mjs test/native-task-scheduled.test.mjs test/native-task-debug-startup.test.mjs test/native-task-service-registration.test.mjs test/native-task-upgrade.test.mjs",
9
+ "test": "node test/workbuddy-stdio-smoke.mjs && node test/local-web-smoke.mjs && node test/local-web-package-smoke.mjs && node test/workbench-process-smoke.mjs && node test/pending-consumption-smoke.mjs && node test/pending-loopback-smoke.mjs && node --test test/model-inbox-caller.test.mjs test/proxy-reply.test.mjs test/native-task-store.test.mjs test/native-task-worker.test.mjs test/origin-routes.test.mjs test/native-task-scheduled.test.mjs test/native-task-debug-startup.test.mjs test/native-task-service-registration.test.mjs test/native-task-upgrade.test.mjs test/page-service-key.test.mjs",
10
10
  "smoke:web": "node test/local-web-smoke.mjs",
11
11
  "build:immutable-package": "node scripts/build-local-web-package.mjs --output workbuddy-immutable-package",
12
12
  "smoke:pending": "node test/pending-consumption-smoke.mjs",
@@ -1,4 +1,5 @@
1
1
  import { execFile, spawn } from "node:child_process";
2
+ import fs from "node:fs/promises";
2
3
  import path from "node:path";
3
4
  import crypto from "node:crypto";
4
5
  import net from "node:net";
@@ -6,7 +7,7 @@ import { setTimeout as delay } from "node:timers/promises";
6
7
  import { promisify } from "node:util";
7
8
  import { fileURLToPath } from "node:url";
8
9
  import runtimeSafety from "../../../clients/core/hellolynk-runtime-safety.cjs";
9
- import { defaultNeutralHostStoreRoot } from "../../../clients/core/hellolynk-neutral-host-installation-store.mjs";
10
+ import { applyCurrentUserAcl, defaultNeutralHostStoreRoot } from "../../../clients/core/hellolynk-neutral-host-installation-store.mjs";
10
11
  import { bootstrapWorkBuddyWorkbenchCandidate } from "./workbench-candidate.mjs";
11
12
  import { registerWorkBuddyNativeMcp } from "./native-task-mcp-registration.mjs";
12
13
  import { configureWorkBuddyDebugStartup, transferWorkBuddyDebugStartupOwner } from "./native-task-debug-startup.mjs";
@@ -216,13 +217,54 @@ function controlPipe(options) {
216
217
  return `\\\\.\\pipe\\hellolynk-workbuddy-${key}`;
217
218
  }
218
219
 
220
+ // The service creates the key before listening, so a missing key means no
221
+ // service yet: ENOENT keeps the existing start-and-poll path.
222
+ async function readPageKey(options) {
223
+ const filename = pageKeyFile(options);
224
+ let value;
225
+ try {
226
+ const metadata = await fs.lstat(filename);
227
+ if (!metadata.isFile() || metadata.size > 256) throw failure("workbuddy_page_service_key_invalid");
228
+ value = JSON.parse(await fs.readFile(filename, "utf8"));
229
+ } catch (error) { throw error?.code === "ENOENT" ? error : failure("workbuddy_page_service_key_invalid"); }
230
+ if (!/^[A-Za-z0-9_-]{43}$/.test(value?.key || "")) throw failure("workbuddy_page_service_key_invalid");
231
+ return value.key;
232
+ }
233
+
234
+ // The pipe admits every local caller, so this file's ACL is the boundary: one
235
+ // key per user store, readable only by this user, shared by every release and
236
+ // never replaced. The empty file is limited to this user before the key is
237
+ // written; the link fails if another service created the key first, and both
238
+ // then use that one. The installed store root must already exist.
239
+ async function ensurePageKey(options) {
240
+ const filename = pageKeyFile(options);
241
+ for (let attempt = 0; ; attempt += 1) {
242
+ try { return await readPageKey(options); }
243
+ catch (error) { if (error?.code !== "ENOENT" || attempt) throw error; }
244
+ const temporary = `${filename}.${crypto.randomUUID()}.tmp`;
245
+ try {
246
+ await (await fs.open(temporary, "wx", 0o600)).close();
247
+ await applyCurrentUserAcl(temporary, false);
248
+ await fs.writeFile(temporary, JSON.stringify({ key: crypto.randomBytes(32).toString("base64url") }), { flag: "r+" });
249
+ await fs.link(temporary, filename).catch((error) => { if (error?.code !== "EEXIST") throw error; });
250
+ } finally { await fs.rm(temporary, { force: true }); }
251
+ }
252
+ }
253
+
254
+ function pageKeyFile(options) {
255
+ return path.join(options.storeRoot || defaultNeutralHostStoreRoot(), "workbuddy-page-key.json");
256
+ }
257
+
219
258
  async function requestExistingWorkbench(options) {
259
+ const key = await readPageKey(options);
220
260
  return new Promise((resolve, reject) => {
221
261
  const socket = net.connect(controlPipe(options));
222
262
  let text = "";
223
263
  socket.setTimeout(3000, () => socket.destroy(failure("workbuddy_page_service_timeout")));
224
- socket.on("error", reject);
225
- socket.on("connect", () => socket.write("open\n"));
264
+ // Only "no service yet" may start the task; any other refusal is reported.
265
+ socket.on("error", (error) => reject(["ENOENT", "ECONNREFUSED"].includes(error?.code) || /^workbuddy_/.test(error?.code || "")
266
+ ? error : failure("workbuddy_page_service_unreachable")));
267
+ socket.on("connect", () => socket.write(`open ${key}\n`));
226
268
  socket.on("data", (chunk) => {
227
269
  text += chunk.toString("utf8");
228
270
  if (text.length > 4096) socket.destroy(failure("workbuddy_local_web_launch_invalid"));
@@ -251,22 +293,30 @@ export async function serveWorkBuddyWorkbenchService(options) {
251
293
  let server;
252
294
  const sockets = new Set();
253
295
  try {
296
+ const request = Buffer.from(`open ${await ensurePageKey(options)}\n`);
254
297
  await serveWorkBuddyWorkbench({ ...options, async publishReady(value, surface) {
255
298
  server = net.createServer((socket) => {
256
299
  sockets.add(socket);
257
300
  socket.on("close", () => sockets.delete(socket));
258
301
  socket.on("error", () => {});
259
302
  socket.setTimeout(3000, () => socket.destroy());
260
- let text = "";
303
+ let received = Buffer.alloc(0);
261
304
  socket.on("data", (chunk) => {
262
- text += chunk.toString("utf8");
263
- if (text === "open\n") { surface.armNavigation(); socket.end(`${JSON.stringify(validateReady(value))}\n`); }
264
- else if (text.length >= 5) socket.destroy();
305
+ received = Buffer.concat([received, chunk]);
306
+ if (received.length < request.length && !received.includes(0x0a)) return;
307
+ if (received.length === request.length && crypto.timingSafeEqual(received, request)) {
308
+ surface.armNavigation(); socket.end(`${JSON.stringify(validateReady(value))}\n`);
309
+ } else socket.destroy();
265
310
  });
266
311
  });
267
312
  await new Promise((resolve, reject) => {
268
313
  server.once("error", reject);
269
- server.listen(controlPipe(options), () => { server.off("error", reject); resolve(); });
314
+ // Task Scheduler can run this service with the full token of a built-in
315
+ // Administrator while WorkBuddy runs unelevated; the default pipe ACL
316
+ // would then refuse WorkBuddy. Any local caller may connect, and only
317
+ // one that can read this user's page key gets the page.
318
+ server.listen({ path: controlPipe(options), readableAll: true, writableAll: true },
319
+ () => { server.off("error", reject); resolve(); });
270
320
  });
271
321
  } });
272
322
  } finally {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hellolynk-ai/workbuddy-mcp",
3
- "version": "0.3.100",
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
- if (
659
- current && current.expiresAtMs - now() > minimumRemainingMs
660
- && routeMatches(current, input)
661
- && scopesMatch(current, input)
662
- && (input?.expectedAgentId == null || input.expectedAgentId === current.agentId)
663
- && (input?.expectedPrincipalId == null || input.expectedPrincipalId === current.principalId)
664
- ) return current;
665
- const reusableCurrent = reusable(current, input);
666
- if (reusableCurrent) return reusableCurrent;
667
- const previousSession = recoveryProof(current, input);
668
- current = reusable(await issue({ ...input, previousSession }), input);
669
- if (!current) throw new HelloLynkClientError("invalid_runtime_session_handle");
670
- return current;
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 = reusable(await issue({ ...input, previousSession: persisted }), input);
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
- issue: async ({ previousSession } = {}) => {
247
- let deviceCredential = await credentialStore.load(profile.profileId);
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 = 16;
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": "94bbad1d0ccee969bbffed176449e427188f1b892512a64167ab31f63d258e2b"
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": "d0ac9c697bf8a85263d99a0739da557c62f52c72f4afb105eb97b3aac2ae1f3b"
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": "7b237a1400c604da5decbb29ab3ce556fd1b744d0cfd7d28b5560b217da120b1"
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": "3969708bafefc3b267bb34a9dcc115804c874ad14f4a036426d727c02ff70d42"
207
+ "sha256": "4b4b27cd86f4816e5e6ec4914816a335cdea5c4b4ffb2091775c061a9676a69c"
208
208
  },
209
209
  {
210
210
  "path": "core/hellolynk-relay-client-cli.mjs",
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "contract": "hellolynk-neutral-host-release-pin-v1",
3
- "manifestSha256": "938801bbdc7516676014bf044b7e5e992a446777bbc74016b31d6e7a6560b36d"
3
+ "manifestSha256": "9d3d6e3880a59444acafe27536817b63ba459c803218e821f5ef2705dffe13c3"
4
4
  }
@@ -208,8 +208,8 @@
208
208
  {
209
209
  "path": "ui/styles.css",
210
210
  "sourcePath": "clients/workbench/ui/styles.css",
211
- "bytes": 53189,
212
- "sha256": "34d24d3d35800a796905049eb5f785f402cf1e82118c66efd4893bd003adbe31"
211
+ "bytes": 53238,
212
+ "sha256": "26525ca14369e5e58e756ad3cb8dd5ca86d5158a838e2aab920506679cd384f0"
213
213
  }
214
214
  ]
215
215
  }
@@ -227,9 +227,9 @@ button:focus-visible, a:focus-visible, summary:focus-visible, input:focus-visibl
227
227
  .conversation-header > .thread-avatar { flex-shrink: 0; }
228
228
  .conversation-read-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 10px; max-width: 100%; }
229
229
  .conversation-auto-read { flex: none; }
230
- .auto-read-toggle { background: var(--panel); white-space: nowrap; }
230
+ .auto-read-toggle { background: var(--panel); color: var(--ink-950); white-space: nowrap; }
231
231
  .auto-read-toggle::before { content: ""; display: inline-block; width: 7px; height: 7px; margin-right: 6px; border-radius: 50%; background: var(--ink-450); }
232
- .auto-read-toggle[aria-checked="true"] { background: var(--sky); }
232
+ .auto-read-toggle[aria-checked="true"] { background: var(--sky); color: var(--accent-ink); }
233
233
  .auto-read-toggle[aria-checked="true"]::before { background: var(--blue-700); }
234
234
  .conversation-auto-read .action-status { margin: 4px 0 0; max-width: 180px; }
235
235
  .conversation-heading { min-width: 0; flex: 1 1 96px; }
@@ -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":"faf3d8dcf992b437caae85981844a3f58aaab739a6ec5e05fdd11811efa769ef"},{"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":"dbbb372e522b17894b6e50c12a13fc172ff752d1487354c772fcc670add212c0"},{"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":"43e42633242cb456ecf2a120380230485e4d8533934ad6242089049d9282da11"},{"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":"34d24d3d35800a796905049eb5f785f402cf1e82118c66efd4893bd003adbe31"}]}
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":"4690314c830a333e5372fe4ca311f0dd80af4d2755dbbb5f13b788cdb528e560"}
1
+ {"contract":"hellolynk-workbuddy-immutable-package-pin-v1","manifestSha256":"dc9e4128a28349eeade1aaa3749c9e869ce192ebeb851617abb8701443d34022"}