@hellolynk-ai/workbuddy-mcp 0.3.102 → 0.3.103
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-neutral-host-assembly.mjs +3 -0
- package/clients/core/hellolynk-neutral-host-process.mjs +102 -26
- package/hellolynk-client-pack-manifest.json +15 -15
- package/hellolynk-client-pack-pin.json +1 -1
- package/integrations/workbuddy/package.json +1 -1
- package/package.json +1 -1
- package/runtime/core/hellolynk-neutral-host-assembly.mjs +3 -0
- package/runtime/core/hellolynk-neutral-host-process.mjs +102 -26
- package/runtime/neutral-host-release-manifest.json +2 -2
- package/runtime/neutral-host-release-pin.json +1 -1
- package/workbuddy-package-manifest.json +1 -1
- package/workbuddy-package-pin.json +1 -1
|
@@ -334,6 +334,9 @@ export async function startHelloLynkNeutralHostAssembly(options = {}, dependenci
|
|
|
334
334
|
authorizationVersion: profile.authorizationVersion,
|
|
335
335
|
identityKeyId: e2ee.identityKeyId,
|
|
336
336
|
runtimeHeaders: () => runtimeHeaders(sessionProvider),
|
|
337
|
+
// Drops only this instance's cached runtime session, and only for a stale
|
|
338
|
+
// session, so the Host can verify it once more with the device credential.
|
|
339
|
+
clearRuntimeSession: (error) => sessionProvider.clear(error),
|
|
337
340
|
e2ee,
|
|
338
341
|
contactE2ee,
|
|
339
342
|
}));
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { nativeConversationId, nativeConversationQuery, nativeDirectoryResult, queryLocalNativeConversations } from "./hellolynk-native-conversations.mjs";
|
|
2
2
|
import { DIRECT_TEXT_E2EE_MAX_TTL_MS } from "./hellolynk-direct-text-e2ee.mjs";
|
|
3
3
|
import { runModelInbox } from "./hellolynk-model-inbox.mjs";
|
|
4
|
+
import { shouldInvalidateDeviceRuntimeSession } from "./hellolynk-client-core.mjs";
|
|
4
5
|
import crypto from "node:crypto";
|
|
5
6
|
import fs from "node:fs/promises";
|
|
6
7
|
import http from "node:http";
|
|
@@ -34,7 +35,7 @@ export const HELLOLYNK_NEUTRAL_HOST_PROCESS_CONTRACT = "hellolynk-neutral-host-p
|
|
|
34
35
|
export const HELLOLYNK_NEUTRAL_HOST_DISCOVERY_CONTRACT = "hellolynk-neutral-host-discovery-v1";
|
|
35
36
|
// Raised with every release batch, together with the six client versions. A Host reports it
|
|
36
37
|
// in its health; the higher release stays and the lower one makes room.
|
|
37
|
-
export const HELLOLYNK_HOST_RELEASE_ORDINAL =
|
|
38
|
+
export const HELLOLYNK_HOST_RELEASE_ORDINAL = 18;
|
|
38
39
|
|
|
39
40
|
const INSTALLATION_LOCK_CONTRACT = "hellolynk-neutral-host-installation-lock-v2";
|
|
40
41
|
const INSTALLATION_LOCK_MAX_BYTES = 4 * 1024;
|
|
@@ -97,9 +98,16 @@ const PREKEY_REFILL_RETRY_MIN_MS = 1_000;
|
|
|
97
98
|
const PREKEY_REFILL_RETRY_MAX_MS = 60_000;
|
|
98
99
|
const RELAY_RETRY_MIN_MS = 1_000;
|
|
99
100
|
const RELAY_RETRY_MAX_MS = 60_000;
|
|
100
|
-
|
|
101
|
+
// Revocation of this Host or its transport credential fences the whole Host.
|
|
102
|
+
const HOST_AUTHORITY_DENIAL_CODES = new Set([
|
|
101
103
|
"host_transport_host_revoked", "host_transport_credential_revoked", "host_transport_credential_inactive",
|
|
104
|
+
]);
|
|
105
|
+
// A refusal of one instance's own device credential or delegate stops only that
|
|
106
|
+
// instance. The Host and its other instances keep receiving and sending. The
|
|
107
|
+
// server reports these when issuing or using that instance's runtime session.
|
|
108
|
+
const ENDPOINT_AUTHORITY_DENIAL_CODES = new Set([
|
|
102
109
|
"device_credential_invalid", "device_credential_revoked", "delegate_revoked", "delegate_inactive",
|
|
110
|
+
"device_credential_identity_inactive", "device_credential_inactive", "runtime_identity_inactive",
|
|
103
111
|
]);
|
|
104
112
|
const MESSAGE_LOCAL_CAPACITY_CODES = new Set(["local_message_store_too_large"]);
|
|
105
113
|
const CONTACT_REQUEST_LOCAL_CAPACITY_CODES = new Set([
|
|
@@ -247,6 +255,9 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
247
255
|
let receiverState = null;
|
|
248
256
|
const relayAbortController = new AbortController();
|
|
249
257
|
const relayProvisionedEndpoints = new Set();
|
|
258
|
+
// Refused instances and their refusal code. Only a later successful registration
|
|
259
|
+
// (the next relay connection or session rotation) readmits one.
|
|
260
|
+
const rejectedEndpoints = new Map();
|
|
250
261
|
const relayState = { status: "connecting", failureCount: 0, nextAttemptAtMs: 0, errorCode: null };
|
|
251
262
|
const rejectedInboundTimes = new WeakSet();
|
|
252
263
|
let lastRejectedInbound = null;
|
|
@@ -600,6 +611,20 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
600
611
|
lastRejectedInbound = { errorCode: error.code };
|
|
601
612
|
continue;
|
|
602
613
|
}
|
|
614
|
+
// The frame's own instance was refused (for example at ACK). Stop only that
|
|
615
|
+
// instance and skip the frame; the relay expires or redelivers it.
|
|
616
|
+
const refused = ENDPOINT_AUTHORITY_DENIAL_CODES.has(error?.code)
|
|
617
|
+
&& endpoints.get(String(item.data?.recipientDelegateId || ""));
|
|
618
|
+
if (refused) {
|
|
619
|
+
rejectedEndpoints.set(refused.delegateId, error.code);
|
|
620
|
+
relayState.errorCode = error.code;
|
|
621
|
+
lastRejectedInbound = { errorCode: error.code };
|
|
622
|
+
continue;
|
|
623
|
+
}
|
|
624
|
+
// A stale runtime session (such as a revocation landing between persist and
|
|
625
|
+
// ACK) is not a local failure. Reconnect: registration verifies that instance
|
|
626
|
+
// again and isolates it if refused. The durable record stays; the relay redelivers.
|
|
627
|
+
if (shouldInvalidateDeviceRuntimeSession(error)) throw error;
|
|
603
628
|
if (!isInboundLocalCapacityError(error)) {
|
|
604
629
|
inboundFailed = true;
|
|
605
630
|
throw error;
|
|
@@ -612,7 +637,7 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
612
637
|
} catch (error) {
|
|
613
638
|
if (lifecycle !== "running") return;
|
|
614
639
|
// Preserve fail-closed persistence/ACK and other malformed-inbound errors.
|
|
615
|
-
if (inboundFailed ||
|
|
640
|
+
if (inboundFailed || HOST_AUTHORITY_DENIAL_CODES.has(error?.code)) throw error;
|
|
616
641
|
await stream?.close?.().catch(() => {});
|
|
617
642
|
stream = null;
|
|
618
643
|
scheduleRelayRetry(error);
|
|
@@ -638,31 +663,63 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
638
663
|
const task = (async () => {
|
|
639
664
|
let connected = null;
|
|
640
665
|
try {
|
|
641
|
-
const
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
666
|
+
const attempted = [...endpoints.values()];
|
|
667
|
+
const registrations = await Promise.allSettled(attempted.map(async (endpoint) => {
|
|
668
|
+
const register = async () => {
|
|
669
|
+
if (endpoint.e2ee?.preKeyInventoryStatus?.status === "deferred"
|
|
670
|
+
&& !relayProvisionedEndpoints.has(endpoint.delegateId)) {
|
|
671
|
+
try {
|
|
672
|
+
await endpoint.e2ee.ensurePreKeyInventory({ signal });
|
|
673
|
+
} catch (error) {
|
|
674
|
+
if (error?.code !== "e2ee_local_prekey_capacity_exceeded") throw error;
|
|
675
|
+
const state = preKeyRefillState(endpoint.delegateId);
|
|
676
|
+
state.failureCount = 1;
|
|
677
|
+
state.nextAttemptAtMs = Math.max(nowMs(clock) + PREKEY_REFILL_RETRY_MIN_MS, retryAtTimestamp(error.retryAt) || 0);
|
|
678
|
+
state.errorCode = error.code;
|
|
679
|
+
}
|
|
680
|
+
relayProvisionedEndpoints.add(endpoint.delegateId);
|
|
652
681
|
}
|
|
653
|
-
|
|
682
|
+
if (signal.aborted || lifecycle !== "running") return;
|
|
683
|
+
await options.transport.registerEndpoint({
|
|
684
|
+
delegateId: endpoint.delegateId, identityKeyId: endpoint.identityKeyId,
|
|
685
|
+
runtimeHeaders: endpoint.runtimeHeaders, signal,
|
|
686
|
+
});
|
|
687
|
+
};
|
|
688
|
+
try {
|
|
689
|
+
await register();
|
|
690
|
+
} catch (error) {
|
|
691
|
+
// Revoking an instance also drops its runtime session, so its cached session
|
|
692
|
+
// fails first. Clear only that stale cache and verify once more: a device
|
|
693
|
+
// refusal then isolates the instance; any other failure keeps the usual path.
|
|
694
|
+
const cleared = !shouldInvalidateDeviceRuntimeSession(error) || signal.aborted || lifecycle !== "running"
|
|
695
|
+
|| typeof endpoint.clearRuntimeSession !== "function" ? false
|
|
696
|
+
: await Promise.resolve().then(() => endpoint.clearRuntimeSession(error)).catch(() => false);
|
|
697
|
+
if (cleared !== true) throw error;
|
|
698
|
+
await register();
|
|
654
699
|
}
|
|
655
|
-
if (signal.aborted || lifecycle !== "running") return;
|
|
656
|
-
await options.transport.registerEndpoint({
|
|
657
|
-
delegateId: endpoint.delegateId, identityKeyId: endpoint.identityKeyId,
|
|
658
|
-
runtimeHeaders: endpoint.runtimeHeaders, signal,
|
|
659
|
-
});
|
|
660
700
|
}));
|
|
661
701
|
if (signal.aborted || lifecycle !== "running") return;
|
|
662
|
-
const
|
|
663
|
-
&&
|
|
664
|
-
|
|
702
|
+
const hostDenial = registrations.find((result) => result.status === "rejected"
|
|
703
|
+
&& HOST_AUTHORITY_DENIAL_CODES.has(result.reason?.code));
|
|
704
|
+
if (hostDenial) throw hostDenial.reason;
|
|
705
|
+
// A refused instance stays out of the relay while the others connect. Each
|
|
706
|
+
// later connection, including session rotation, registers it again.
|
|
707
|
+
registrations.forEach((result, index) => {
|
|
708
|
+
if (result.status === "fulfilled") rejectedEndpoints.delete(attempted[index].delegateId);
|
|
709
|
+
else if (ENDPOINT_AUTHORITY_DENIAL_CODES.has(result.reason?.code)) {
|
|
710
|
+
rejectedEndpoints.set(attempted[index].delegateId, result.reason.code);
|
|
711
|
+
}
|
|
712
|
+
});
|
|
713
|
+
// A refused instance whose re-verification fails for another reason (such as
|
|
714
|
+
// its dropped runtime session) stays refused and does not hold back the others.
|
|
715
|
+
const failed = registrations.find((result, index) => result.status === "rejected"
|
|
716
|
+
&& !rejectedEndpoints.has(attempted[index].delegateId));
|
|
665
717
|
if (failed) throw failed.reason;
|
|
718
|
+
// With every instance refused there is nothing to receive: keep the Host and
|
|
719
|
+
// retry with the usual backoff. The session manager bounds cloud rechecks.
|
|
720
|
+
if (rejectedEndpoints.size === endpoints.size) {
|
|
721
|
+
throw registrations.find((result) => result.status === "rejected").reason;
|
|
722
|
+
}
|
|
666
723
|
connected = await openRelayStream(signal);
|
|
667
724
|
if (!connected?.events || typeof connected.events[Symbol.asyncIterator] !== "function") {
|
|
668
725
|
throw failure("neutral_host_transport_stream_invalid");
|
|
@@ -672,14 +729,15 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
672
729
|
return;
|
|
673
730
|
}
|
|
674
731
|
stream = connected;
|
|
675
|
-
Object.assign(relayState, { status: "ready", failureCount: 0, nextAttemptAtMs: 0,
|
|
732
|
+
Object.assign(relayState, { status: "ready", failureCount: 0, nextAttemptAtMs: 0,
|
|
733
|
+
errorCode: rejectedEndpoints.values().next().value ?? null });
|
|
676
734
|
startReceiveTask();
|
|
677
735
|
} catch (error) {
|
|
678
736
|
await connected?.close?.().catch(() => {});
|
|
679
737
|
if (signal.aborted || lifecycle !== "running") return;
|
|
680
738
|
// An explicit revocation of this Host still fences local access. A
|
|
681
739
|
// timeout/expired cloud session alone is not a local revocation.
|
|
682
|
-
if (
|
|
740
|
+
if (HOST_AUTHORITY_DENIAL_CODES.has(error?.code)) {
|
|
683
741
|
// Failure is exposed as host.status/failureCode to the release entry.
|
|
684
742
|
void beginDrain(error.code).catch(() => {});
|
|
685
743
|
return;
|
|
@@ -733,6 +791,14 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
733
791
|
}
|
|
734
792
|
const endpoint = endpoints.get(safeId(event.recipientDelegateId, "neutral_host_inbound_delegate_invalid"));
|
|
735
793
|
if (!endpoint) throw failure("neutral_host_inbound_endpoint_unknown");
|
|
794
|
+
if (rejectedEndpoints.has(endpoint.delegateId)) {
|
|
795
|
+
// A refused instance receives nothing, also not from its Host's siblings.
|
|
796
|
+
// Relay frames are skipped unacknowledged; a local sender sees the failure.
|
|
797
|
+
const refused = failure(item.localDelivery === true
|
|
798
|
+
? "neutral_host_same_host_recipient_unavailable" : rejectedEndpoints.get(endpoint.delegateId));
|
|
799
|
+
rejectedInboundTimes.add(refused);
|
|
800
|
+
throw refused;
|
|
801
|
+
}
|
|
736
802
|
const isContactRequest = item.event === "contact_request";
|
|
737
803
|
if (!isContactRequest && item.event !== "message") throw failure("neutral_host_inbound_kind_invalid");
|
|
738
804
|
const decryptor = isContactRequest ? endpoint.contactE2ee : endpoint.e2ee;
|
|
@@ -1015,7 +1081,14 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
1015
1081
|
return inboundResumeTask;
|
|
1016
1082
|
}
|
|
1017
1083
|
|
|
1084
|
+
// A refused instance does not send, including over local routes that skip the relay.
|
|
1085
|
+
function assertEndpointAccepted(delegateId) {
|
|
1086
|
+
const code = rejectedEndpoints.get(delegateId);
|
|
1087
|
+
if (code) throw hostApplicationFailure(code);
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1018
1090
|
async function sendOutboundOnce({ endpoint, delegateId, clientMessageId, input }) {
|
|
1091
|
+
assertEndpointAccepted(endpoint.delegateId);
|
|
1019
1092
|
try {
|
|
1020
1093
|
const result = await endpoint.outbound.send(input);
|
|
1021
1094
|
if (result?.message?.lastErrorCode === "reply_target_deleted" || result?.relay?.status === "reply_target_deleted") {
|
|
@@ -1529,6 +1602,7 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
1529
1602
|
async function queryPeerNativeDirectory(delegateId, authorization, request) {
|
|
1530
1603
|
const sender = endpoints.get(delegateId);
|
|
1531
1604
|
if (!sender?.outbound?.sendDirectory) throw hostApplicationFailure("native_directory_unavailable");
|
|
1605
|
+
assertEndpointAccepted(delegateId);
|
|
1532
1606
|
const friend = request.kind === "friend_target_request";
|
|
1533
1607
|
const unavailable = friend ? null : nativeDirectoryResult({ conversations: [], coverage: "unavailable",
|
|
1534
1608
|
available: false, exactTargetSupported: false, reason: "native_directory_unavailable" });
|
|
@@ -2274,6 +2348,7 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
2274
2348
|
|| current.senderDelegateId !== context.delegateId) {
|
|
2275
2349
|
throw hostApplicationFailure("host_app_record_not_found");
|
|
2276
2350
|
}
|
|
2351
|
+
assertEndpointAccepted(context.delegateId);
|
|
2277
2352
|
if (!MANUAL_RETRYABLE_STATUSES.has(current.status) || current.lastErrorCode === "reply_target_deleted") {
|
|
2278
2353
|
throw hostApplicationFailure("host_app_state_conflict");
|
|
2279
2354
|
}
|
|
@@ -3120,7 +3195,8 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
3120
3195
|
return {
|
|
3121
3196
|
status: inboundPaused
|
|
3122
3197
|
? "paused"
|
|
3123
|
-
: preKeyInventory.status === "ready" && relayState.status === "ready" && !lastRejectedInbound
|
|
3198
|
+
: preKeyInventory.status === "ready" && relayState.status === "ready" && !lastRejectedInbound
|
|
3199
|
+
&& rejectedEndpoints.size === 0 ? "ready" : "degraded",
|
|
3124
3200
|
...(lastRejectedInbound ? { lastRejectedInbound } : {}),
|
|
3125
3201
|
preKeyInventory,
|
|
3126
3202
|
relay: {
|
|
@@ -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.103",
|
|
6
6
|
"workbench": {
|
|
7
7
|
"path": "runtime/workbench/hellolynk-workbench-build.json",
|
|
8
8
|
"contract": "hellolynk-shared-workbench-build-v1",
|
|
@@ -217,8 +217,8 @@
|
|
|
217
217
|
},
|
|
218
218
|
{
|
|
219
219
|
"path": "clients/core/hellolynk-neutral-host-assembly.mjs",
|
|
220
|
-
"bytes":
|
|
221
|
-
"sha256": "
|
|
220
|
+
"bytes": 47470,
|
|
221
|
+
"sha256": "5a09b332a869c3863ac92c798a1a5df5901607987a2427a20b06154e41e17cb8"
|
|
222
222
|
},
|
|
223
223
|
{
|
|
224
224
|
"path": "clients/core/hellolynk-neutral-host-installation-store.mjs",
|
|
@@ -232,8 +232,8 @@
|
|
|
232
232
|
},
|
|
233
233
|
{
|
|
234
234
|
"path": "clients/core/hellolynk-neutral-host-process.mjs",
|
|
235
|
-
"bytes":
|
|
236
|
-
"sha256": "
|
|
235
|
+
"bytes": 234159,
|
|
236
|
+
"sha256": "0a66fca2b862fde9269722f026fc67e9d1c79435f0d410809aee669be9f9f497"
|
|
237
237
|
},
|
|
238
238
|
{
|
|
239
239
|
"path": "clients/core/hellolynk-neutral-host-store-adapters.mjs",
|
|
@@ -313,7 +313,7 @@
|
|
|
313
313
|
{
|
|
314
314
|
"path": "integrations/workbuddy/package.json",
|
|
315
315
|
"bytes": 1156,
|
|
316
|
-
"sha256": "
|
|
316
|
+
"sha256": "ecccf7f9ddc65b046cf1516281b6cf33a1f2c5b53bf32a61a1ca1df3aa8e937a"
|
|
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": "ff4be183cc660df51d5587c1902a9ae41a914ed27283137b3a7246c8a18193e6"
|
|
427
427
|
},
|
|
428
428
|
{
|
|
429
429
|
"path": "README.md",
|
|
@@ -632,8 +632,8 @@
|
|
|
632
632
|
},
|
|
633
633
|
{
|
|
634
634
|
"path": "runtime/core/hellolynk-neutral-host-assembly.mjs",
|
|
635
|
-
"bytes":
|
|
636
|
-
"sha256": "
|
|
635
|
+
"bytes": 46525,
|
|
636
|
+
"sha256": "b63c3371dfc08d8b15a4fd5ce84c61b40d9e7011424ccb3ff11466adb4f862cc"
|
|
637
637
|
},
|
|
638
638
|
{
|
|
639
639
|
"path": "runtime/core/hellolynk-neutral-host-installation-store.mjs",
|
|
@@ -647,8 +647,8 @@
|
|
|
647
647
|
},
|
|
648
648
|
{
|
|
649
649
|
"path": "runtime/core/hellolynk-neutral-host-process.mjs",
|
|
650
|
-
"bytes":
|
|
651
|
-
"sha256": "
|
|
650
|
+
"bytes": 229709,
|
|
651
|
+
"sha256": "34b985f75bc693954eb66bb788fc2814482bb8bf402f14b72ea2faf5f70cf4ea"
|
|
652
652
|
},
|
|
653
653
|
{
|
|
654
654
|
"path": "runtime/core/hellolynk-neutral-host-store-adapters.mjs",
|
|
@@ -708,12 +708,12 @@
|
|
|
708
708
|
{
|
|
709
709
|
"path": "runtime/neutral-host-release-manifest.json",
|
|
710
710
|
"bytes": 11517,
|
|
711
|
-
"sha256": "
|
|
711
|
+
"sha256": "4cefc24593d0de46133fc6d4d302979ecb9c85454af7a7c9d35e197e7b54ff86"
|
|
712
712
|
},
|
|
713
713
|
{
|
|
714
714
|
"path": "runtime/neutral-host-release-pin.json",
|
|
715
715
|
"bytes": 146,
|
|
716
|
-
"sha256": "
|
|
716
|
+
"sha256": "4ee879b7cb941112afbc33f44c75fe309b51b7db257f63bc6a10aa0f759283c0"
|
|
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": "cd6dc4893f52b99bf2012b2f0834ef41fb3f10ec0b483b3fa3deeb4fa1d59437"
|
|
897
897
|
},
|
|
898
898
|
{
|
|
899
899
|
"path": "workbuddy-package-pin.json",
|
|
900
900
|
"bytes": 143,
|
|
901
|
-
"sha256": "
|
|
901
|
+
"sha256": "e562fabd2b124a20eaa83a914c4c7e751793451940ac390eccffb8e5889d2015"
|
|
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.103",
|
|
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": {
|
|
@@ -334,6 +334,9 @@ export async function startHelloLynkNeutralHostAssembly(options = {}, dependenci
|
|
|
334
334
|
authorizationVersion: profile.authorizationVersion,
|
|
335
335
|
identityKeyId: e2ee.identityKeyId,
|
|
336
336
|
runtimeHeaders: () => runtimeHeaders(sessionProvider),
|
|
337
|
+
// Drops only this instance's cached runtime session, and only for a stale
|
|
338
|
+
// session, so the Host can verify it once more with the device credential.
|
|
339
|
+
clearRuntimeSession: (error) => sessionProvider.clear(error),
|
|
337
340
|
e2ee,
|
|
338
341
|
contactE2ee,
|
|
339
342
|
}));
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { nativeConversationId, nativeConversationQuery, nativeDirectoryResult, queryLocalNativeConversations } from "./hellolynk-native-conversations.mjs";
|
|
2
2
|
import { DIRECT_TEXT_E2EE_MAX_TTL_MS } from "./hellolynk-direct-text-e2ee.mjs";
|
|
3
3
|
import { runModelInbox } from "./hellolynk-model-inbox.mjs";
|
|
4
|
+
import { shouldInvalidateDeviceRuntimeSession } from "./hellolynk-client-core.mjs";
|
|
4
5
|
import crypto from "node:crypto";
|
|
5
6
|
import fs from "node:fs/promises";
|
|
6
7
|
import http from "node:http";
|
|
@@ -34,7 +35,7 @@ export const HELLOLYNK_NEUTRAL_HOST_PROCESS_CONTRACT = "hellolynk-neutral-host-p
|
|
|
34
35
|
export const HELLOLYNK_NEUTRAL_HOST_DISCOVERY_CONTRACT = "hellolynk-neutral-host-discovery-v1";
|
|
35
36
|
// Raised with every release batch, together with the six client versions. A Host reports it
|
|
36
37
|
// in its health; the higher release stays and the lower one makes room.
|
|
37
|
-
export const HELLOLYNK_HOST_RELEASE_ORDINAL =
|
|
38
|
+
export const HELLOLYNK_HOST_RELEASE_ORDINAL = 18;
|
|
38
39
|
|
|
39
40
|
const INSTALLATION_LOCK_CONTRACT = "hellolynk-neutral-host-installation-lock-v2";
|
|
40
41
|
const INSTALLATION_LOCK_MAX_BYTES = 4 * 1024;
|
|
@@ -97,9 +98,16 @@ const PREKEY_REFILL_RETRY_MIN_MS = 1_000;
|
|
|
97
98
|
const PREKEY_REFILL_RETRY_MAX_MS = 60_000;
|
|
98
99
|
const RELAY_RETRY_MIN_MS = 1_000;
|
|
99
100
|
const RELAY_RETRY_MAX_MS = 60_000;
|
|
100
|
-
|
|
101
|
+
// Revocation of this Host or its transport credential fences the whole Host.
|
|
102
|
+
const HOST_AUTHORITY_DENIAL_CODES = new Set([
|
|
101
103
|
"host_transport_host_revoked", "host_transport_credential_revoked", "host_transport_credential_inactive",
|
|
104
|
+
]);
|
|
105
|
+
// A refusal of one instance's own device credential or delegate stops only that
|
|
106
|
+
// instance. The Host and its other instances keep receiving and sending. The
|
|
107
|
+
// server reports these when issuing or using that instance's runtime session.
|
|
108
|
+
const ENDPOINT_AUTHORITY_DENIAL_CODES = new Set([
|
|
102
109
|
"device_credential_invalid", "device_credential_revoked", "delegate_revoked", "delegate_inactive",
|
|
110
|
+
"device_credential_identity_inactive", "device_credential_inactive", "runtime_identity_inactive",
|
|
103
111
|
]);
|
|
104
112
|
const MESSAGE_LOCAL_CAPACITY_CODES = new Set(["local_message_store_too_large"]);
|
|
105
113
|
const CONTACT_REQUEST_LOCAL_CAPACITY_CODES = new Set([
|
|
@@ -247,6 +255,9 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
247
255
|
let receiverState = null;
|
|
248
256
|
const relayAbortController = new AbortController();
|
|
249
257
|
const relayProvisionedEndpoints = new Set();
|
|
258
|
+
// Refused instances and their refusal code. Only a later successful registration
|
|
259
|
+
// (the next relay connection or session rotation) readmits one.
|
|
260
|
+
const rejectedEndpoints = new Map();
|
|
250
261
|
const relayState = { status: "connecting", failureCount: 0, nextAttemptAtMs: 0, errorCode: null };
|
|
251
262
|
const rejectedInboundTimes = new WeakSet();
|
|
252
263
|
let lastRejectedInbound = null;
|
|
@@ -600,6 +611,20 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
600
611
|
lastRejectedInbound = { errorCode: error.code };
|
|
601
612
|
continue;
|
|
602
613
|
}
|
|
614
|
+
// The frame's own instance was refused (for example at ACK). Stop only that
|
|
615
|
+
// instance and skip the frame; the relay expires or redelivers it.
|
|
616
|
+
const refused = ENDPOINT_AUTHORITY_DENIAL_CODES.has(error?.code)
|
|
617
|
+
&& endpoints.get(String(item.data?.recipientDelegateId || ""));
|
|
618
|
+
if (refused) {
|
|
619
|
+
rejectedEndpoints.set(refused.delegateId, error.code);
|
|
620
|
+
relayState.errorCode = error.code;
|
|
621
|
+
lastRejectedInbound = { errorCode: error.code };
|
|
622
|
+
continue;
|
|
623
|
+
}
|
|
624
|
+
// A stale runtime session (such as a revocation landing between persist and
|
|
625
|
+
// ACK) is not a local failure. Reconnect: registration verifies that instance
|
|
626
|
+
// again and isolates it if refused. The durable record stays; the relay redelivers.
|
|
627
|
+
if (shouldInvalidateDeviceRuntimeSession(error)) throw error;
|
|
603
628
|
if (!isInboundLocalCapacityError(error)) {
|
|
604
629
|
inboundFailed = true;
|
|
605
630
|
throw error;
|
|
@@ -612,7 +637,7 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
612
637
|
} catch (error) {
|
|
613
638
|
if (lifecycle !== "running") return;
|
|
614
639
|
// Preserve fail-closed persistence/ACK and other malformed-inbound errors.
|
|
615
|
-
if (inboundFailed ||
|
|
640
|
+
if (inboundFailed || HOST_AUTHORITY_DENIAL_CODES.has(error?.code)) throw error;
|
|
616
641
|
await stream?.close?.().catch(() => {});
|
|
617
642
|
stream = null;
|
|
618
643
|
scheduleRelayRetry(error);
|
|
@@ -638,31 +663,63 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
638
663
|
const task = (async () => {
|
|
639
664
|
let connected = null;
|
|
640
665
|
try {
|
|
641
|
-
const
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
666
|
+
const attempted = [...endpoints.values()];
|
|
667
|
+
const registrations = await Promise.allSettled(attempted.map(async (endpoint) => {
|
|
668
|
+
const register = async () => {
|
|
669
|
+
if (endpoint.e2ee?.preKeyInventoryStatus?.status === "deferred"
|
|
670
|
+
&& !relayProvisionedEndpoints.has(endpoint.delegateId)) {
|
|
671
|
+
try {
|
|
672
|
+
await endpoint.e2ee.ensurePreKeyInventory({ signal });
|
|
673
|
+
} catch (error) {
|
|
674
|
+
if (error?.code !== "e2ee_local_prekey_capacity_exceeded") throw error;
|
|
675
|
+
const state = preKeyRefillState(endpoint.delegateId);
|
|
676
|
+
state.failureCount = 1;
|
|
677
|
+
state.nextAttemptAtMs = Math.max(nowMs(clock) + PREKEY_REFILL_RETRY_MIN_MS, retryAtTimestamp(error.retryAt) || 0);
|
|
678
|
+
state.errorCode = error.code;
|
|
679
|
+
}
|
|
680
|
+
relayProvisionedEndpoints.add(endpoint.delegateId);
|
|
652
681
|
}
|
|
653
|
-
|
|
682
|
+
if (signal.aborted || lifecycle !== "running") return;
|
|
683
|
+
await options.transport.registerEndpoint({
|
|
684
|
+
delegateId: endpoint.delegateId, identityKeyId: endpoint.identityKeyId,
|
|
685
|
+
runtimeHeaders: endpoint.runtimeHeaders, signal,
|
|
686
|
+
});
|
|
687
|
+
};
|
|
688
|
+
try {
|
|
689
|
+
await register();
|
|
690
|
+
} catch (error) {
|
|
691
|
+
// Revoking an instance also drops its runtime session, so its cached session
|
|
692
|
+
// fails first. Clear only that stale cache and verify once more: a device
|
|
693
|
+
// refusal then isolates the instance; any other failure keeps the usual path.
|
|
694
|
+
const cleared = !shouldInvalidateDeviceRuntimeSession(error) || signal.aborted || lifecycle !== "running"
|
|
695
|
+
|| typeof endpoint.clearRuntimeSession !== "function" ? false
|
|
696
|
+
: await Promise.resolve().then(() => endpoint.clearRuntimeSession(error)).catch(() => false);
|
|
697
|
+
if (cleared !== true) throw error;
|
|
698
|
+
await register();
|
|
654
699
|
}
|
|
655
|
-
if (signal.aborted || lifecycle !== "running") return;
|
|
656
|
-
await options.transport.registerEndpoint({
|
|
657
|
-
delegateId: endpoint.delegateId, identityKeyId: endpoint.identityKeyId,
|
|
658
|
-
runtimeHeaders: endpoint.runtimeHeaders, signal,
|
|
659
|
-
});
|
|
660
700
|
}));
|
|
661
701
|
if (signal.aborted || lifecycle !== "running") return;
|
|
662
|
-
const
|
|
663
|
-
&&
|
|
664
|
-
|
|
702
|
+
const hostDenial = registrations.find((result) => result.status === "rejected"
|
|
703
|
+
&& HOST_AUTHORITY_DENIAL_CODES.has(result.reason?.code));
|
|
704
|
+
if (hostDenial) throw hostDenial.reason;
|
|
705
|
+
// A refused instance stays out of the relay while the others connect. Each
|
|
706
|
+
// later connection, including session rotation, registers it again.
|
|
707
|
+
registrations.forEach((result, index) => {
|
|
708
|
+
if (result.status === "fulfilled") rejectedEndpoints.delete(attempted[index].delegateId);
|
|
709
|
+
else if (ENDPOINT_AUTHORITY_DENIAL_CODES.has(result.reason?.code)) {
|
|
710
|
+
rejectedEndpoints.set(attempted[index].delegateId, result.reason.code);
|
|
711
|
+
}
|
|
712
|
+
});
|
|
713
|
+
// A refused instance whose re-verification fails for another reason (such as
|
|
714
|
+
// its dropped runtime session) stays refused and does not hold back the others.
|
|
715
|
+
const failed = registrations.find((result, index) => result.status === "rejected"
|
|
716
|
+
&& !rejectedEndpoints.has(attempted[index].delegateId));
|
|
665
717
|
if (failed) throw failed.reason;
|
|
718
|
+
// With every instance refused there is nothing to receive: keep the Host and
|
|
719
|
+
// retry with the usual backoff. The session manager bounds cloud rechecks.
|
|
720
|
+
if (rejectedEndpoints.size === endpoints.size) {
|
|
721
|
+
throw registrations.find((result) => result.status === "rejected").reason;
|
|
722
|
+
}
|
|
666
723
|
connected = await openRelayStream(signal);
|
|
667
724
|
if (!connected?.events || typeof connected.events[Symbol.asyncIterator] !== "function") {
|
|
668
725
|
throw failure("neutral_host_transport_stream_invalid");
|
|
@@ -672,14 +729,15 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
672
729
|
return;
|
|
673
730
|
}
|
|
674
731
|
stream = connected;
|
|
675
|
-
Object.assign(relayState, { status: "ready", failureCount: 0, nextAttemptAtMs: 0,
|
|
732
|
+
Object.assign(relayState, { status: "ready", failureCount: 0, nextAttemptAtMs: 0,
|
|
733
|
+
errorCode: rejectedEndpoints.values().next().value ?? null });
|
|
676
734
|
startReceiveTask();
|
|
677
735
|
} catch (error) {
|
|
678
736
|
await connected?.close?.().catch(() => {});
|
|
679
737
|
if (signal.aborted || lifecycle !== "running") return;
|
|
680
738
|
// An explicit revocation of this Host still fences local access. A
|
|
681
739
|
// timeout/expired cloud session alone is not a local revocation.
|
|
682
|
-
if (
|
|
740
|
+
if (HOST_AUTHORITY_DENIAL_CODES.has(error?.code)) {
|
|
683
741
|
// Failure is exposed as host.status/failureCode to the release entry.
|
|
684
742
|
void beginDrain(error.code).catch(() => {});
|
|
685
743
|
return;
|
|
@@ -733,6 +791,14 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
733
791
|
}
|
|
734
792
|
const endpoint = endpoints.get(safeId(event.recipientDelegateId, "neutral_host_inbound_delegate_invalid"));
|
|
735
793
|
if (!endpoint) throw failure("neutral_host_inbound_endpoint_unknown");
|
|
794
|
+
if (rejectedEndpoints.has(endpoint.delegateId)) {
|
|
795
|
+
// A refused instance receives nothing, also not from its Host's siblings.
|
|
796
|
+
// Relay frames are skipped unacknowledged; a local sender sees the failure.
|
|
797
|
+
const refused = failure(item.localDelivery === true
|
|
798
|
+
? "neutral_host_same_host_recipient_unavailable" : rejectedEndpoints.get(endpoint.delegateId));
|
|
799
|
+
rejectedInboundTimes.add(refused);
|
|
800
|
+
throw refused;
|
|
801
|
+
}
|
|
736
802
|
const isContactRequest = item.event === "contact_request";
|
|
737
803
|
if (!isContactRequest && item.event !== "message") throw failure("neutral_host_inbound_kind_invalid");
|
|
738
804
|
const decryptor = isContactRequest ? endpoint.contactE2ee : endpoint.e2ee;
|
|
@@ -1015,7 +1081,14 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
1015
1081
|
return inboundResumeTask;
|
|
1016
1082
|
}
|
|
1017
1083
|
|
|
1084
|
+
// A refused instance does not send, including over local routes that skip the relay.
|
|
1085
|
+
function assertEndpointAccepted(delegateId) {
|
|
1086
|
+
const code = rejectedEndpoints.get(delegateId);
|
|
1087
|
+
if (code) throw hostApplicationFailure(code);
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1018
1090
|
async function sendOutboundOnce({ endpoint, delegateId, clientMessageId, input }) {
|
|
1091
|
+
assertEndpointAccepted(endpoint.delegateId);
|
|
1019
1092
|
try {
|
|
1020
1093
|
const result = await endpoint.outbound.send(input);
|
|
1021
1094
|
if (result?.message?.lastErrorCode === "reply_target_deleted" || result?.relay?.status === "reply_target_deleted") {
|
|
@@ -1529,6 +1602,7 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
1529
1602
|
async function queryPeerNativeDirectory(delegateId, authorization, request) {
|
|
1530
1603
|
const sender = endpoints.get(delegateId);
|
|
1531
1604
|
if (!sender?.outbound?.sendDirectory) throw hostApplicationFailure("native_directory_unavailable");
|
|
1605
|
+
assertEndpointAccepted(delegateId);
|
|
1532
1606
|
const friend = request.kind === "friend_target_request";
|
|
1533
1607
|
const unavailable = friend ? null : nativeDirectoryResult({ conversations: [], coverage: "unavailable",
|
|
1534
1608
|
available: false, exactTargetSupported: false, reason: "native_directory_unavailable" });
|
|
@@ -2274,6 +2348,7 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
2274
2348
|
|| current.senderDelegateId !== context.delegateId) {
|
|
2275
2349
|
throw hostApplicationFailure("host_app_record_not_found");
|
|
2276
2350
|
}
|
|
2351
|
+
assertEndpointAccepted(context.delegateId);
|
|
2277
2352
|
if (!MANUAL_RETRYABLE_STATUSES.has(current.status) || current.lastErrorCode === "reply_target_deleted") {
|
|
2278
2353
|
throw hostApplicationFailure("host_app_state_conflict");
|
|
2279
2354
|
}
|
|
@@ -3120,7 +3195,8 @@ export async function startHelloLynkNeutralHostProcess(options = {}) {
|
|
|
3120
3195
|
return {
|
|
3121
3196
|
status: inboundPaused
|
|
3122
3197
|
? "paused"
|
|
3123
|
-
: preKeyInventory.status === "ready" && relayState.status === "ready" && !lastRejectedInbound
|
|
3198
|
+
: preKeyInventory.status === "ready" && relayState.status === "ready" && !lastRejectedInbound
|
|
3199
|
+
&& rejectedEndpoints.size === 0 ? "ready" : "degraded",
|
|
3124
3200
|
...(lastRejectedInbound ? { lastRejectedInbound } : {}),
|
|
3125
3201
|
preKeyInventory,
|
|
3126
3202
|
relay: {
|
|
@@ -180,7 +180,7 @@
|
|
|
180
180
|
},
|
|
181
181
|
{
|
|
182
182
|
"path": "core/hellolynk-neutral-host-assembly.mjs",
|
|
183
|
-
"sha256": "
|
|
183
|
+
"sha256": "b63c3371dfc08d8b15a4fd5ce84c61b40d9e7011424ccb3ff11466adb4f862cc"
|
|
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": "34b985f75bc693954eb66bb788fc2814482bb8bf402f14b72ea2faf5f70cf4ea"
|
|
196
196
|
},
|
|
197
197
|
{
|
|
198
198
|
"path": "core/hellolynk-neutral-host-store-adapters.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":"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
|
+
{"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":"5a09b332a869c3863ac92c798a1a5df5901607987a2427a20b06154e41e17cb8"},{"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":"0a66fca2b862fde9269722f026fc67e9d1c79435f0d410809aee669be9f9f497"},{"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":"ecccf7f9ddc65b046cf1516281b6cf33a1f2c5b53bf32a61a1ca1df3aa8e937a"},{"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":"b63c3371dfc08d8b15a4fd5ce84c61b40d9e7011424ccb3ff11466adb4f862cc"},{"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":"34b985f75bc693954eb66bb788fc2814482bb8bf402f14b72ea2faf5f70cf4ea"},{"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":"4cefc24593d0de46133fc6d4d302979ecb9c85454af7a7c9d35e197e7b54ff86"},{"path":"runtime/neutral-host-release-pin.json","sha256":"4ee879b7cb941112afbc33f44c75fe309b51b7db257f63bc6a10aa0f759283c0"},{"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":"cd6dc4893f52b99bf2012b2f0834ef41fb3f10ec0b483b3fa3deeb4fa1d59437"}
|