@hellolynk-ai/trae-work-mcp 0.0.0-stage → 0.4.94

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.
Files changed (123) hide show
  1. package/LICENSE +92 -0
  2. package/README.md +86 -2
  3. package/bin/hellolynk-client-setup.mjs +2748 -0
  4. package/bin/hellolynk-mcp-config-shape.mjs +23 -0
  5. package/hellolynk-client-pack-manifest.json +619 -0
  6. package/hellolynk-client-pack-pin.json +4 -0
  7. package/integrations/trae-work/package.json +11 -0
  8. package/integrations/trae-work/runtime/neutral-host-bootstrap.mjs +38 -0
  9. package/integrations/trae-work/runtime/neutral-host-release-entry.mjs +16 -0
  10. package/integrations/trae-work/runtime/trae-work-bootstrap.mjs +30 -0
  11. package/integrations/trae-work/server/dynamic-ui-contract.mjs +376 -0
  12. package/integrations/trae-work/server/host-lifecycle.mjs +128 -0
  13. package/integrations/trae-work/server/mcp-proxy.mjs +181 -0
  14. package/integrations/trae-work/server/mcp-server.mjs +784 -0
  15. package/integrations/trae-work/server/native-task-cdp.mjs +241 -0
  16. package/integrations/trae-work/server/native-task-worker.mjs +199 -0
  17. package/integrations/trae-work/server/neutral-host-adapter.mjs +725 -0
  18. package/integrations/trae-work/server/trae-neutral-production.mjs +97 -0
  19. package/integrations/trae-work/server/trae-ui-launch.mjs +182 -0
  20. package/integrations/trae-work/server/ui-action-gate.mjs +122 -0
  21. package/integrations/trae-work/skills/hellolynk-inbox/SKILL.md +9 -0
  22. package/package.json +61 -4
  23. package/runtime/bootstrap/core/hellolynk-client-account.mjs +180 -0
  24. package/runtime/bootstrap/core/hellolynk-client-core.mjs +770 -0
  25. package/runtime/bootstrap/core/hellolynk-client-profile.mjs +191 -0
  26. package/runtime/bootstrap/core/hellolynk-host-auth.mjs +347 -0
  27. package/runtime/bootstrap/core/hellolynk-host-protected-store.mjs +2721 -0
  28. package/runtime/bootstrap/core/hellolynk-local-process-lock.mjs +157 -0
  29. package/runtime/bootstrap/core/hellolynk-neutral-host-installation-store.mjs +765 -0
  30. package/runtime/bootstrap/core/hellolynk-platform-credential-store.mjs +773 -0
  31. package/runtime/bootstrap/core/hellolynk-runtime-safety.cjs +471 -0
  32. package/runtime/bootstrap/platform/windows/hellolynk-host-protected-store.ps1 +2866 -0
  33. package/runtime/connect-activate.mjs +837 -0
  34. package/runtime/core/hellolynk-agent-configurator.mjs +701 -0
  35. package/runtime/core/hellolynk-client-account.mjs +180 -0
  36. package/runtime/core/hellolynk-client-core.mjs +770 -0
  37. package/runtime/core/hellolynk-client-profile.mjs +191 -0
  38. package/runtime/core/hellolynk-client-update-entry.mjs +31 -0
  39. package/runtime/core/hellolynk-client-update-runtime.mjs +600 -0
  40. package/runtime/core/hellolynk-client-update.mjs +453 -0
  41. package/runtime/core/hellolynk-contact-request-e2ee.mjs +867 -0
  42. package/runtime/core/hellolynk-device-enrollment.mjs +435 -0
  43. package/runtime/core/hellolynk-direct-text-e2ee-client.mjs +1964 -0
  44. package/runtime/core/hellolynk-direct-text-e2ee.mjs +1207 -0
  45. package/runtime/core/hellolynk-host-auth.mjs +347 -0
  46. package/runtime/core/hellolynk-host-protected-store.mjs +2721 -0
  47. package/runtime/core/hellolynk-host-transport-client.mjs +946 -0
  48. package/runtime/core/hellolynk-host.mjs +2374 -0
  49. package/runtime/core/hellolynk-human-confirmation-ledger.mjs +256 -0
  50. package/runtime/core/hellolynk-human-relationship-controller.mjs +1234 -0
  51. package/runtime/core/hellolynk-inbox-read-state.mjs +11 -0
  52. package/runtime/core/hellolynk-indexed-message-store.mjs +1558 -0
  53. package/runtime/core/hellolynk-instance-conversation.mjs +185 -0
  54. package/runtime/core/hellolynk-local-contact-requests.mjs +1733 -0
  55. package/runtime/core/hellolynk-local-contacts.mjs +1228 -0
  56. package/runtime/core/hellolynk-local-data-migration.mjs +766 -0
  57. package/runtime/core/hellolynk-local-data-protection.mjs +747 -0
  58. package/runtime/core/hellolynk-local-identity-trust.mjs +274 -0
  59. package/runtime/core/hellolynk-local-messaging.mjs +3043 -0
  60. package/runtime/core/hellolynk-local-peer-transport.mjs +103 -0
  61. package/runtime/core/hellolynk-local-process-lock.mjs +157 -0
  62. package/runtime/core/hellolynk-model-inbox.mjs +230 -0
  63. package/runtime/core/hellolynk-model-notices.cjs +60 -0
  64. package/runtime/core/hellolynk-native-addressing-tools.cjs +231 -0
  65. package/runtime/core/hellolynk-native-conversations.mjs +280 -0
  66. package/runtime/core/hellolynk-native-human-confirmation-broker.mjs +1036 -0
  67. package/runtime/core/hellolynk-native-inbox-runtime.mjs +553 -0
  68. package/runtime/core/hellolynk-native-notice.mjs +50 -0
  69. package/runtime/core/hellolynk-native-reply-routes.mjs +96 -0
  70. package/runtime/core/hellolynk-native-worker-lease.mjs +84 -0
  71. package/runtime/core/hellolynk-neutral-host-assembly.mjs +955 -0
  72. package/runtime/core/hellolynk-neutral-host-installation-store.mjs +765 -0
  73. package/runtime/core/hellolynk-neutral-host-launcher.mjs +665 -0
  74. package/runtime/core/hellolynk-neutral-host-process.mjs +4374 -0
  75. package/runtime/core/hellolynk-neutral-host-store-adapters.mjs +548 -0
  76. package/runtime/core/hellolynk-neutral-host-workbench-read-model.mjs +1365 -0
  77. package/runtime/core/hellolynk-platform-credential-store.mjs +773 -0
  78. package/runtime/core/hellolynk-relay-client-cli.mjs +232 -0
  79. package/runtime/core/hellolynk-release-retention.mjs +160 -0
  80. package/runtime/core/hellolynk-runtime-safety.cjs +471 -0
  81. package/runtime/core/hellolynk-workbench-action-grants.mjs +457 -0
  82. package/runtime/core/hellolynk-workbench-connection.mjs +234 -0
  83. package/runtime/neutral-host-bootstrap.mjs +38 -0
  84. package/runtime/neutral-host-release-entry.mjs +16 -0
  85. package/runtime/neutral-host-release-loader.mjs +156 -0
  86. package/runtime/neutral-host-release-manifest.json +394 -0
  87. package/runtime/neutral-host-release-pin.json +4 -0
  88. package/runtime/platform/windows/configure-agent.ps1 +281 -0
  89. package/runtime/platform/windows/credential-store.ps1 +844 -0
  90. package/runtime/platform/windows/hellolynk-host-protected-store.ps1 +2866 -0
  91. package/runtime/platform/windows/hellolynk-human-confirmation-ledger.ps1 +155 -0
  92. package/runtime/platform/windows/hellolynk-local-data-key.ps1 +300 -0
  93. package/runtime/platform/windows/hellolynk-native-human-confirmation-broker.ps1 +216 -0
  94. package/runtime/trae-work-bootstrap.mjs +30 -0
  95. package/runtime/workbench/candidate-bootstrap.mjs +54 -0
  96. package/runtime/workbench/contract.mjs +1314 -0
  97. package/runtime/workbench/hellolynk-workbench-build.json +215 -0
  98. package/runtime/workbench/host-capabilities.mjs +80 -0
  99. package/runtime/workbench/i18n.mjs +1127 -0
  100. package/runtime/workbench/loopback-surface.mjs +740 -0
  101. package/runtime/workbench/mcp-app-bundle.mjs +97 -0
  102. package/runtime/workbench/service.mjs +485 -0
  103. package/runtime/workbench/state.mjs +421 -0
  104. package/runtime/workbench/transports.mjs +171 -0
  105. package/runtime/workbench/ui/app.mjs +6120 -0
  106. package/runtime/workbench/ui/connection-form.mjs +155 -0
  107. package/runtime/workbench/ui/hellolynk-mark.png +0 -0
  108. package/runtime/workbench/ui/http-transport.mjs +247 -0
  109. package/runtime/workbench/ui/icons/arrow-left.svg +3 -0
  110. package/runtime/workbench/ui/icons/close.svg +3 -0
  111. package/runtime/workbench/ui/icons/contacts.svg +3 -0
  112. package/runtime/workbench/ui/icons/inbox.svg +3 -0
  113. package/runtime/workbench/ui/icons/refresh.svg +3 -0
  114. package/runtime/workbench/ui/icons/search.svg +3 -0
  115. package/runtime/workbench/ui/icons/security.svg +3 -0
  116. package/runtime/workbench/ui/icons/settings.svg +3 -0
  117. package/runtime/workbench/ui/index.html +139 -0
  118. package/runtime/workbench/ui/loopback-entry.mjs +26 -0
  119. package/runtime/workbench/ui/mcp-app-client.mjs +151 -0
  120. package/runtime/workbench/ui/mcp-app-entry.mjs +452 -0
  121. package/runtime/workbench/ui/styles.css +686 -0
  122. package/tools/hellolynk-activate-neutral-host-clients.mjs +837 -0
  123. package/tools/hellolynk-install-client-skills.mjs +1211 -0
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ import path from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { loadNeutralHostRelease } from "./neutral-host-release-loader.mjs";
5
+
6
+ export async function runNeutralHostBootstrap(argv = process.argv.slice(2)) {
7
+ const options = parse(argv);
8
+ const release = await loadNeutralHostRelease();
9
+ if (typeof release?.run !== "function") throw codeError("neutral_trae_work_runner_integrity_invalid");
10
+ return release.run({ root: options.root });
11
+ }
12
+ function parse(argv) { if (argv.length !== 3 || argv[0] !== "run" || argv[1] !== "--root" || !path.isAbsolute(String(argv[2] || ""))) throw codeError("neutral_trae_work_launch_configuration_required"); return { root: path.resolve(argv[2]) }; }
13
+ function codeError(code) { const error = new Error(code); error.code = code; return error; }
14
+ // Start failures and a failed Host both end here. A failed Host keeps its lock until this
15
+ // process exits on its own: a closed stderr pipe (the detached launcher may be gone) must
16
+ // not crash it before admitted work finishes.
17
+ function exitWithFailure(code) { process.stderr.on("error", () => {}); process.stderr.write(`${JSON.stringify({ ok: false, code })}\n`); process.exitCode = 1; }
18
+
19
+ // A stray rejection must not take the Host down: log a stable code and keep serving. A synchronous
20
+ // uncaught exception leaves state unknown: stop the Host (releases its lock), then exit; 15 s bounds a stuck stop.
21
+ function guardHostProcess(result) {
22
+ process.on("unhandledRejection", (reason) => writeFailure("neutral_trae_work_unhandled_rejection", reason));
23
+ process.on("uncaughtException", (error) => {
24
+ writeFailure("neutral_trae_work_uncaught_exception", error);
25
+ process.exitCode = 1;
26
+ const exit = () => process.exit(1);
27
+ setTimeout(exit, 15_000).unref?.();
28
+ Promise.resolve().then(() => result?.stop?.("uncaught_exception")).then(exit, exit);
29
+ });
30
+ return result;
31
+ }
32
+
33
+ function writeFailure(code, cause) {
34
+ if (!process.stderr.listenerCount("error")) process.stderr.on("error", () => {});
35
+ process.stderr.write(`${JSON.stringify({ ok: false, code, cause: String(cause?.code || cause?.name || "").slice(0, 80) })}\n`);
36
+ }
37
+
38
+ if (import.meta.url === pathToFileURL(process.argv[1] || "").href) runNeutralHostBootstrap().then((result) => guardHostProcess(result)?.waitUntilStopped?.() || new Promise(() => {})).catch((error) => exitWithFailure(String(error?.code || "neutral_trae_work_launch_failed")));
@@ -0,0 +1,16 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { createHostProtectedStore } from "./core/hellolynk-host-protected-store.mjs";
4
+ import { createNeutralHostInstallationStore, defaultNeutralHostStoreRoot } from "./core/hellolynk-neutral-host-installation-store.mjs";
5
+ import { startHelloLynkNeutralHostAssembly } from "./core/hellolynk-neutral-host-assembly.mjs";
6
+
7
+ export async function createNeutralHostReleaseRuntime() { return Object.freeze({ defaultStoreRoot: (env) => defaultNeutralHostStoreRoot("win32", env), createInstallationStore: (options) => createNeutralHostInstallationStore(options), createProtectedStore: (options) => createHostProtectedStore(options), run: async ({ root }) => runProductionHost(root) }); }
8
+ async function runProductionHost(rootInput) {
9
+ const root = path.resolve(String(rootInput || "")); if (!path.isAbsolute(root) || root.length < 4) throw codeError("neutral_trae_work_launch_configuration_required");
10
+ const installationStore = createNeutralHostInstallationStore({ root }); const protectedStore = createHostProtectedStore({ root, installationStore }); const binding = await protectedStore.resolveTraeWorkNeutralBinding();
11
+ const profiles = await readProfileManifest(binding.profileManifestPath); const assembly = await startHelloLynkNeutralHostAssembly({ root, runtimeRoot: binding.runtimeRoot, profiles: profiles.map((profileFile) => ({ profileFile })) }, { installationStore, protectedStore });
12
+ // A failed Host never reaches "stopped"; end the wait so the bootstrap exits with its code.
13
+ return Object.freeze({ stop: assembly.stop, waitUntilStopped: async () => { while (assembly.host.status !== "stopped") { if (assembly.host.status === "failed") throw codeError(assembly.host.failureCode || "neutral_host_stop_failed"); await new Promise((resolve) => setTimeout(resolve, 50)); } } });
14
+ }
15
+ async function readProfileManifest(input) { const manifestPath = path.resolve(String(input || "")); if (!path.isAbsolute(manifestPath)) throw codeError("neutral_trae_work_launch_manifest_invalid"); let manifest; try { manifest = JSON.parse(await fs.readFile(manifestPath, "utf8")); } catch { throw codeError("neutral_trae_work_launch_manifest_invalid"); } if (!manifest || manifest.contract !== "hellolynk-neutral-host-profile-manifest-v1" || !Array.isArray(manifest.profiles) || !manifest.profiles.length || manifest.profiles.length > 16 || Object.keys(manifest).sort().join(",") !== "contract,profiles") throw codeError("neutral_trae_work_launch_manifest_invalid"); const profiles = manifest.profiles.map((value) => path.resolve(String(value || ""))); if (profiles.some((value, index) => !path.isAbsolute(value) || profiles.indexOf(value) !== index)) throw codeError("neutral_trae_work_launch_manifest_invalid"); return Object.freeze(profiles); }
16
+ function codeError(code) { const error = new Error(code); error.code = code; return error; }
@@ -0,0 +1,156 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { fileURLToPath, pathToFileURL } from "node:url";
5
+
6
+ const ROOT = path.dirname(fileURLToPath(import.meta.url));
7
+ const PIN_PATH = path.join(ROOT, "neutral-host-release-pin.json");
8
+ const MANIFEST_PATH = path.join(ROOT, "neutral-host-release-manifest.json");
9
+ const SAFE_RUNTIME_RELATIVE = /^(?:[A-Za-z0-9][A-Za-z0-9._-]*\/)*[A-Za-z0-9][A-Za-z0-9._-]*\.(?:cjs|mjs|ps1)$/;
10
+ const SAFE_RELEASE_RELATIVE = /^release\/(?:[A-Za-z0-9][A-Za-z0-9._-]*\/)*[A-Za-z0-9][A-Za-z0-9._-]*\.(?:mjs|ps1|md|html|js|css|json)$/;
11
+
12
+ export async function inspectNeutralHostRelease() {
13
+ await assertNoReparseAncestors(ROOT);
14
+ const pinArtifact = await readArtifact(PIN_PATH, 16 * 1024);
15
+ const pin = parseJson(pinArtifact.bytes);
16
+ exact(pin, ["contract", "manifestSha256"]);
17
+ if (pin.contract !== "hellolynk-neutral-host-release-pin-v1" || !HASH.test(String(pin.manifestSha256 || ""))) fail();
18
+ const manifestArtifact = await readArtifact(MANIFEST_PATH, 256 * 1024);
19
+ if (sha256(manifestArtifact.bytes) !== pin.manifestSha256) fail();
20
+ let manifest;
21
+ try { manifest = JSON.parse(manifestArtifact.bytes); } catch { fail(); }
22
+ exact(manifest, ["contract", "entry", "files"]);
23
+ if (manifest.contract !== "hellolynk-neutral-host-release-manifest-v1"
24
+ || !Array.isArray(manifest.files) || manifest.files.length < 3 || manifest.files.length > 128) fail();
25
+ const files = [];
26
+ const seen = new Set();
27
+ for (const item of manifest.files) {
28
+ exact(item, ["path", "sha256"]);
29
+ const relative = safeRelative(item.path);
30
+ if (seen.has(relative) || !HASH.test(String(item.sha256 || ""))) fail();
31
+ seen.add(relative);
32
+ const artifact = await readArtifact(inside(relative), 2 * 1024 * 1024);
33
+ if (sha256(artifact.bytes) !== item.sha256) fail();
34
+ files.push(Object.freeze({ relative, sha256: item.sha256, identity: artifact.identity }));
35
+ }
36
+ const entry = safeRelative(manifest.entry);
37
+ if (!seen.has(entry) || !seen.has("neutral-host-bootstrap.mjs")
38
+ || !seen.has("neutral-host-release-loader.mjs")) fail();
39
+ return Object.freeze({
40
+ contract: "hellolynk-neutral-host-release-inspection-v1",
41
+ releaseRoot: path.dirname(ROOT),
42
+ manifestSha256: pin.manifestSha256,
43
+ entry,
44
+ controls: Object.freeze([
45
+ Object.freeze({ relative: "neutral-host-release-pin.json", sha256: sha256(pinArtifact.bytes), identity: pinArtifact.identity }),
46
+ Object.freeze({ relative: "neutral-host-release-manifest.json", sha256: pin.manifestSha256, identity: manifestArtifact.identity }),
47
+ ]),
48
+ files: Object.freeze(files),
49
+ });
50
+ }
51
+
52
+ export async function activateNeutralHostRelease(inspection) {
53
+ if (!inspection || inspection.contract !== "hellolynk-neutral-host-release-inspection-v1"
54
+ || inspection.releaseRoot !== path.dirname(ROOT) || !Array.isArray(inspection.controls)
55
+ || inspection.controls.length !== 2 || !Array.isArray(inspection.files)) fail();
56
+ await assertNoReparseAncestors(ROOT);
57
+ for (const expected of inspection.controls) {
58
+ const control = CONTROL_PATHS.get(expected.relative);
59
+ if (!control) fail();
60
+ const artifact = await readArtifact(control, 256 * 1024);
61
+ if (sha256(artifact.bytes) !== expected.sha256 || !sameIdentity(artifact.identity, expected.identity)) fail();
62
+ }
63
+ for (const expected of inspection.files) {
64
+ const artifact = await readArtifact(inside(safeRelative(expected.relative)), 2 * 1024 * 1024);
65
+ if (sha256(artifact.bytes) !== expected.sha256 || !sameIdentity(artifact.identity, expected.identity)) fail();
66
+ }
67
+ const entryFile = inside(safeRelative(inspection.entry));
68
+ let module;
69
+ try { module = await import(`${pathToFileURL(entryFile).href}?verified=${inspection.manifestSha256}`); }
70
+ catch { throw codeError("neutral_trae_work_runner_integrity_invalid"); }
71
+ if (typeof module.createNeutralHostReleaseRuntime !== "function") fail();
72
+ const runtime = await module.createNeutralHostReleaseRuntime();
73
+ if (!runtime || typeof runtime !== "object" || Array.isArray(runtime)) fail();
74
+ return Object.freeze({ ...runtime, releaseManifestSha256: inspection.manifestSha256 });
75
+ }
76
+
77
+ export async function loadNeutralHostRelease() {
78
+ return activateNeutralHostRelease(await inspectNeutralHostRelease());
79
+ }
80
+
81
+ async function readArtifact(file, maximum) {
82
+ await assertNoReparseAncestors(file);
83
+ let handle;
84
+ try { handle = await fs.open(file, "r"); }
85
+ catch (error) {
86
+ if (error?.code === "ENOENT") throw codeError("neutral_trae_work_runner_unavailable");
87
+ throw codeError("neutral_trae_work_runner_integrity_invalid");
88
+ }
89
+ try {
90
+ const before = await handle.stat({ bigint: true });
91
+ if (!before.isFile() || before.nlink !== 1n || before.size > BigInt(maximum)) fail();
92
+ const bytes = await handle.readFile();
93
+ const after = await handle.stat({ bigint: true });
94
+ if (!sameIdentity(identity(before), identity(after))) fail();
95
+ return Object.freeze({ bytes, identity: identity(after) });
96
+ } catch (error) {
97
+ if (/^neutral_trae_work_/.test(String(error?.code || ""))) throw error;
98
+ throw codeError("neutral_trae_work_runner_integrity_invalid");
99
+ } finally { await handle?.close(); }
100
+ }
101
+
102
+ async function assertNoReparseAncestors(target) {
103
+ const resolved = path.resolve(target);
104
+ const parsed = path.parse(resolved);
105
+ let cursor = parsed.root;
106
+ for (const segment of path.relative(parsed.root, resolved).split(path.sep).filter(Boolean)) {
107
+ cursor = path.join(cursor, segment);
108
+ let stat;
109
+ try { stat = await fs.lstat(cursor); }
110
+ catch (error) {
111
+ if (error?.code === "ENOENT") throw codeError("neutral_trae_work_runner_unavailable");
112
+ throw codeError("neutral_trae_work_runner_integrity_invalid");
113
+ }
114
+ if (stat.isSymbolicLink()) fail();
115
+ }
116
+ }
117
+
118
+ function identity(stat) {
119
+ return Object.freeze({
120
+ dev: String(stat.dev), ino: String(stat.ino), size: String(stat.size),
121
+ mtimeNs: String(stat.mtimeNs), nlink: String(stat.nlink),
122
+ });
123
+ }
124
+ function sameIdentity(left, right) {
125
+ return left.dev === right.dev && left.ino === right.ino && left.size === right.size
126
+ && left.mtimeNs === right.mtimeNs && left.nlink === right.nlink;
127
+ }
128
+ function parseJson(bytes) { try { return JSON.parse(bytes); } catch { fail(); } }
129
+ function safeRelative(value) {
130
+ const text = String(value || "");
131
+ const allowed = text.startsWith("release/") ? SAFE_RELEASE_RELATIVE : SAFE_RUNTIME_RELATIVE;
132
+ if (!allowed.test(text) || text.split("/").includes("..")) fail();
133
+ return text;
134
+ }
135
+ function inside(relative) {
136
+ const releaseRoot = path.dirname(ROOT);
137
+ const result = relative.startsWith("release/")
138
+ ? path.resolve(releaseRoot, relative.slice("release/".length))
139
+ : path.resolve(ROOT, relative);
140
+ const base = relative.startsWith("release/") ? releaseRoot : ROOT;
141
+ if (!result.startsWith(`${base}${path.sep}`)) fail();
142
+ return result;
143
+ }
144
+ function exact(value, expected) {
145
+ if (!value || typeof value !== "object" || Array.isArray(value)) fail();
146
+ const actual = Object.keys(value).sort(); const wanted = [...expected].sort();
147
+ if (actual.length !== wanted.length || actual.some((key, index) => key !== wanted[index])) fail();
148
+ }
149
+ const HASH = /^[a-f0-9]{64}$/;
150
+ const CONTROL_PATHS = new Map([
151
+ ["neutral-host-release-pin.json", PIN_PATH],
152
+ ["neutral-host-release-manifest.json", MANIFEST_PATH],
153
+ ]);
154
+ function sha256(value) { return crypto.createHash("sha256").update(value).digest("hex"); }
155
+ function fail() { throw codeError("neutral_trae_work_runner_integrity_invalid"); }
156
+ function codeError(code) { const error = new Error(code); error.code = code; return error; }
@@ -0,0 +1,394 @@
1
+ {
2
+ "contract": "hellolynk-neutral-host-release-manifest-v1",
3
+ "entry": "neutral-host-release-entry.mjs",
4
+ "files": [
5
+ {
6
+ "path": "release/integrations/trae-work/package.json",
7
+ "sha256": "359d30887c1930cbda3e7cf1aafb4bf56f81782715fffe940b3a8f052ce0d6d3"
8
+ },
9
+ {
10
+ "path": "connect-activate.mjs",
11
+ "sha256": "50ec8b0a58ac5b099a653722b0946acb23d0a29a054bfb3856dc963db6f84bee"
12
+ },
13
+ {
14
+ "path": "neutral-host-bootstrap.mjs",
15
+ "sha256": "8a1676de41060a46f44826b6db84046c9f4a2b42cd5f5c52df8a3b25a6426145"
16
+ },
17
+ {
18
+ "path": "neutral-host-release-loader.mjs",
19
+ "sha256": "70bacded7cd42bef424e927d4002b6171aa613b0609f62ea02ebe8344359bfd6"
20
+ },
21
+ {
22
+ "path": "neutral-host-release-entry.mjs",
23
+ "sha256": "480281983e8d6ec6287def780d7bde50c1034143cf6888e09002180f28263f29"
24
+ },
25
+ {
26
+ "path": "trae-work-bootstrap.mjs",
27
+ "sha256": "00af92054453b3725b8b72b021480c96ed2d07d8a7683048c500678818291299"
28
+ },
29
+ {
30
+ "path": "core/hellolynk-agent-configurator.mjs",
31
+ "sha256": "53d284d18c3f898e9d5932b5cafc4f8caa5323b4701e7e765730537c4977ac99"
32
+ },
33
+ {
34
+ "path": "core/hellolynk-client-account.mjs",
35
+ "sha256": "a22f14f494c1a44a9272ca95e160f8cb1df612a1ceb8b54e32596b13f90c3740"
36
+ },
37
+ {
38
+ "path": "core/hellolynk-client-core.mjs",
39
+ "sha256": "af7c9cb7a996fdb194c51dbcc745c48b616ff1686d79a1451104690d882df1b8"
40
+ },
41
+ {
42
+ "path": "core/hellolynk-client-profile.mjs",
43
+ "sha256": "81d4f64c11c8dbccec04a05435cc42b53823db2649f2c88739647299b3c97fd2"
44
+ },
45
+ {
46
+ "path": "core/hellolynk-client-update-entry.mjs",
47
+ "sha256": "dc62228a7351c721514b5ca7921d485dc6aa05475aaa2e3881b78d7de0e1a134"
48
+ },
49
+ {
50
+ "path": "core/hellolynk-client-update-runtime.mjs",
51
+ "sha256": "0a76f2bdcf338c544e493ca7d0b7168f03ffa32ed223e3537eccafc1cbaafba0"
52
+ },
53
+ {
54
+ "path": "core/hellolynk-client-update.mjs",
55
+ "sha256": "a4104a67dd72cb7a1950585c92aa8424b9387c1eda4f191e0df3f901c4f16a8f"
56
+ },
57
+ {
58
+ "path": "core/hellolynk-release-retention.mjs",
59
+ "sha256": "f5488a756dc9063fe5b44e0ea45dcdcc1903be3909717c7a8674b15e4952bfac"
60
+ },
61
+ {
62
+ "path": "core/hellolynk-contact-request-e2ee.mjs",
63
+ "sha256": "18526628b354d18bcbe5e621360ecfcd5dfa4cb4d91397fb87d0c20e1f332a5d"
64
+ },
65
+ {
66
+ "path": "core/hellolynk-device-enrollment.mjs",
67
+ "sha256": "18f9decb843a5a82ef8dfc3e866904e0b04bbc48d700eac55a8ae54c5729c2aa"
68
+ },
69
+ {
70
+ "path": "core/hellolynk-direct-text-e2ee-client.mjs",
71
+ "sha256": "dd5dfa410a664e21e14b3c253ca496dd303e36aa5a2e1370b78cc51ec1fba973"
72
+ },
73
+ {
74
+ "path": "core/hellolynk-direct-text-e2ee.mjs",
75
+ "sha256": "3fee00210896b81cf40d25c634a6a758adee18704ef4a74fbc00b699a58d53e5"
76
+ },
77
+ {
78
+ "path": "core/hellolynk-host-auth.mjs",
79
+ "sha256": "49baa0b82ab078ad74a892a179189bdbd303a791d580ba4d6eac457564fad535"
80
+ },
81
+ {
82
+ "path": "core/hellolynk-host-protected-store.mjs",
83
+ "sha256": "0cefa22574df9dd99073d73bb688e9cae3faf6da862af013c1dfe9c87efef32e"
84
+ },
85
+ {
86
+ "path": "core/hellolynk-host-transport-client.mjs",
87
+ "sha256": "0c97425346496a5d5e1f2b3d092d5d227179051b63e8097bab225dffe576008a"
88
+ },
89
+ {
90
+ "path": "core/hellolynk-host.mjs",
91
+ "sha256": "ed88f2285b4c5eb8618a2f3f3c2a7a65d798465933b91b109121bb90b45f5880"
92
+ },
93
+ {
94
+ "path": "core/hellolynk-model-notices.cjs",
95
+ "sha256": "1b1c6e190b89f7305d05e1dddddaa6d50b7289b90aeab4599073eaaae27396f1"
96
+ },
97
+ {
98
+ "path": "core/hellolynk-model-inbox.mjs",
99
+ "sha256": "e112cbbb1caff5aa6f4a71bdfcb2d1c38260a96e3e4ab076b5f95c55e1da645e"
100
+ },
101
+ {
102
+ "path": "core/hellolynk-native-inbox-runtime.mjs",
103
+ "sha256": "bee3a5789420cc25cbc153cc8291f144b3a10ae50e96269823b7890cb603789d"
104
+ },
105
+ {
106
+ "path": "core/hellolynk-native-reply-routes.mjs",
107
+ "sha256": "65af258205a7eb9d2c599e0f400dbd9ea198c38a26f491e06f27c5c46101fc9b"
108
+ },
109
+ {
110
+ "path": "core/hellolynk-native-worker-lease.mjs",
111
+ "sha256": "41eb3103c216a09b80159522700b7bb78f3b082a644501fd19fa51ce1bf6bab7"
112
+ },
113
+ {
114
+ "path": "core/hellolynk-human-confirmation-ledger.mjs",
115
+ "sha256": "265ae39e93112416588841a14eb0351905d60b2552cf04c8cf8bd057acd64586"
116
+ },
117
+ {
118
+ "path": "core/hellolynk-human-relationship-controller.mjs",
119
+ "sha256": "01589c3eeb1c35f26cb50a14ce4e603c7bffe71e0b11863aed97c85f356e3c97"
120
+ },
121
+ {
122
+ "path": "core/hellolynk-indexed-message-store.mjs",
123
+ "sha256": "101f928dc5fab8064132e8755f74e157d35f921b5fe7d52fc80c0e46dc131428"
124
+ },
125
+ {
126
+ "path": "core/hellolynk-inbox-read-state.mjs",
127
+ "sha256": "3c354aaa7038446f8f554f9520db287cc06559e6cb22cb69f0121a179ff2cb01"
128
+ },
129
+ {
130
+ "path": "core/hellolynk-instance-conversation.mjs",
131
+ "sha256": "2e4a23917d4a86216b653ed04ec46216b9400fa94c13c0a00f1afc7877e284cb"
132
+ },
133
+ {
134
+ "path": "core/hellolynk-local-contact-requests.mjs",
135
+ "sha256": "3cbf0a0c6adeff17ceb310d202138c2dde7e23d0e8309f2584c161aae4c36acd"
136
+ },
137
+ {
138
+ "path": "core/hellolynk-local-contacts.mjs",
139
+ "sha256": "93d923702bdb5cbcbd47faf01f2c2e30bfe612fc450ef35ee98477412b2bbc6e"
140
+ },
141
+ {
142
+ "path": "core/hellolynk-local-data-migration.mjs",
143
+ "sha256": "72046a992b14f43167d6a671ec1094d34041cf43ba16d9d507583228045c7aa2"
144
+ },
145
+ {
146
+ "path": "core/hellolynk-local-data-protection.mjs",
147
+ "sha256": "798f42e9bd45a00565b628282233a55abfdc4d7102423cb0558a7e01fab76810"
148
+ },
149
+ {
150
+ "path": "core/hellolynk-local-identity-trust.mjs",
151
+ "sha256": "658fb5264d587341497e7d869408e51c1850f750856585ec7368a13c26f76a07"
152
+ },
153
+ {
154
+ "path": "core/hellolynk-local-messaging.mjs",
155
+ "sha256": "76b4348eb6eff34dec41c90666ac8ee14554018c5729c39b5b78bac30f0eaf80"
156
+ },
157
+ {
158
+ "path": "core/hellolynk-local-peer-transport.mjs",
159
+ "sha256": "4b8f01002b03fa19a9eea9dd72c7a41c4c951d6ef201f06dd1a89086a0a872cd"
160
+ },
161
+ {
162
+ "path": "core/hellolynk-local-process-lock.mjs",
163
+ "sha256": "5dd9b21f4e4509b148daaf2b495036e336e56be320d2bf7a3fac08b8a567d3bf"
164
+ },
165
+ {
166
+ "path": "core/hellolynk-native-conversations.mjs",
167
+ "sha256": "38116a956c2c96dbac6b5355e2097385475879ab5e9965ae3552912739379630"
168
+ },
169
+ {
170
+ "path": "core/hellolynk-native-notice.mjs",
171
+ "sha256": "d0c96a6dd9fed10a1e394dd2bf8c9b02af69ec5d97cd416d50f36b461324b0f9"
172
+ },
173
+ {
174
+ "path": "core/hellolynk-native-addressing-tools.cjs",
175
+ "sha256": "e583c769b72d8cf52523c19b3320c982c2550f002041770f5953f16951690162"
176
+ },
177
+ {
178
+ "path": "core/hellolynk-native-human-confirmation-broker.mjs",
179
+ "sha256": "755fd03a4ee3b97cdfdb1efc491fb4cf602e25173819380ea8a715c04c82ea5a"
180
+ },
181
+ {
182
+ "path": "core/hellolynk-neutral-host-assembly.mjs",
183
+ "sha256": "98b2b669183cda15272b182d5c04d3ae77511b8b657cd3179cbf2fa5d5f27920"
184
+ },
185
+ {
186
+ "path": "core/hellolynk-neutral-host-installation-store.mjs",
187
+ "sha256": "9ff399639d320e5527e51cd0ddbf049e7e0e8d3cc225cdc30f0d4637356a1590"
188
+ },
189
+ {
190
+ "path": "core/hellolynk-neutral-host-launcher.mjs",
191
+ "sha256": "490f8010bd84fc7c92a00ec4d4a996c27dd398b2e3584ded8bcebb74c598c18d"
192
+ },
193
+ {
194
+ "path": "core/hellolynk-neutral-host-process.mjs",
195
+ "sha256": "42cc6be6d187755bb80479892b4107901ea712f75bdf01d1a4b9517a2a7b64a2"
196
+ },
197
+ {
198
+ "path": "core/hellolynk-neutral-host-store-adapters.mjs",
199
+ "sha256": "b033d5cdedc54847bf1a9fd4d5b70af6d0e1ed8094e74feebbb592c242a0cde9"
200
+ },
201
+ {
202
+ "path": "core/hellolynk-neutral-host-workbench-read-model.mjs",
203
+ "sha256": "6767b4aaf5c7304587d7126f203535f02d1f1bfd692741105ad644686ecb1612"
204
+ },
205
+ {
206
+ "path": "core/hellolynk-platform-credential-store.mjs",
207
+ "sha256": "0558aca043ff586f10d7b82e1b2fe9b537ff661913dce76fc92feaf9bd7e5546"
208
+ },
209
+ {
210
+ "path": "core/hellolynk-relay-client-cli.mjs",
211
+ "sha256": "e3134f37ff8c327b3148a4c417ee14c6c8bfbc3be9680e25c1ea29d215dff1d7"
212
+ },
213
+ {
214
+ "path": "core/hellolynk-runtime-safety.cjs",
215
+ "sha256": "1518d9904b329f05a92092f0f2d4014675014597573ba85f33e3e06c25ecea16"
216
+ },
217
+ {
218
+ "path": "core/hellolynk-workbench-action-grants.mjs",
219
+ "sha256": "7247f4bce07e6fafce6559604ef9c7a8f7a033b922c212344462411be55ea9ac"
220
+ },
221
+ {
222
+ "path": "core/hellolynk-workbench-connection.mjs",
223
+ "sha256": "198fb21c3db2c91b85ca38d334c0ffe56ef28f2f052b6b62a8d2ed5c166fcd82"
224
+ },
225
+ {
226
+ "path": "workbench/candidate-bootstrap.mjs",
227
+ "sha256": "891b02f750693e5b4836e716922c2d632f6736b2a5b3b7417f161499459f3f56"
228
+ },
229
+ {
230
+ "path": "workbench/contract.mjs",
231
+ "sha256": "20648c3ed8e20b984b698010855414f8d4acaf0e2ade53b997b5582a85d90a08"
232
+ },
233
+ {
234
+ "path": "workbench/host-capabilities.mjs",
235
+ "sha256": "4e1a82e6cb46dd775ba39e2d34ff21eb1c293523883d18e607084ca91cfffb87"
236
+ },
237
+ {
238
+ "path": "workbench/i18n.mjs",
239
+ "sha256": "272917746c06cabc1b87b94341f2deca5591f0bea2d7a0e07b2d959d8e1f8c74"
240
+ },
241
+ {
242
+ "path": "workbench/loopback-surface.mjs",
243
+ "sha256": "6a550034c5dd558dfd22f9cb589fd76df40a99e976538e3b5d01371d212c9aa6"
244
+ },
245
+ {
246
+ "path": "workbench/mcp-app-bundle.mjs",
247
+ "sha256": "48fb8224cbaa7f78a386a79b2dba761f4de6c4b83b16032f7f96bd9783e172e4"
248
+ },
249
+ {
250
+ "path": "workbench/service.mjs",
251
+ "sha256": "3bf82a0076e9fe3b62105c626fe0d622092224f28d3905c62eafd65bf5385dcc"
252
+ },
253
+ {
254
+ "path": "workbench/state.mjs",
255
+ "sha256": "770d10f3bf76236772c87e86f5da346c013da387fb40c08360f895a7052cf7b5"
256
+ },
257
+ {
258
+ "path": "workbench/transports.mjs",
259
+ "sha256": "0c9f42ca9c9a4b4cc29b1bdcc0a0488d16a9ad06c235c642dff9cd4fc6f0d528"
260
+ },
261
+ {
262
+ "path": "workbench/ui/app.mjs",
263
+ "sha256": "643a5ac8d303f936ee87dd7c0c851aa1988e99ea9a9a45c6c89da28bdc76e799"
264
+ },
265
+ {
266
+ "path": "workbench/ui/connection-form.mjs",
267
+ "sha256": "700ca793f5eddca1dfea5f220c73732efc51ea4e1f8b8fc36da2bb67136240f0"
268
+ },
269
+ {
270
+ "path": "workbench/ui/http-transport.mjs",
271
+ "sha256": "b2fedbc2c34bcf065e0fc23c8c5fb37d358c03daa2c82ba46530b8dfb8fdc571"
272
+ },
273
+ {
274
+ "path": "workbench/ui/loopback-entry.mjs",
275
+ "sha256": "0e5e5d259ab6e2d8408c6d2e089551e6f279dcb1267e9db19f9d9dded0956fd4"
276
+ },
277
+ {
278
+ "path": "workbench/ui/mcp-app-client.mjs",
279
+ "sha256": "91b1e6e84a12434c2be7614845febfa44afa341d5d7f580bc1bfc106ed37f8f8"
280
+ },
281
+ {
282
+ "path": "workbench/ui/mcp-app-entry.mjs",
283
+ "sha256": "ba82ac55c4efcf7701bda33b6c6e0df4d59da542b1d6c33c96ba7f2391c4773a"
284
+ },
285
+ {
286
+ "path": "platform/windows/configure-agent.ps1",
287
+ "sha256": "d214863a02551befbca898b978efeb2a093d80933a577fad17795f50fb9f07aa"
288
+ },
289
+ {
290
+ "path": "platform/windows/credential-store.ps1",
291
+ "sha256": "7ec7362eba2c442d9417035ff14c1108c7a58558b6f09ac36a2275828370debb"
292
+ },
293
+ {
294
+ "path": "platform/windows/hellolynk-host-protected-store.ps1",
295
+ "sha256": "84ac61c3762b7f944bf3e2c895f9a6427985ce697052afd9bc610474c921adad"
296
+ },
297
+ {
298
+ "path": "platform/windows/hellolynk-human-confirmation-ledger.ps1",
299
+ "sha256": "317409f270f2cbd8017b61384292cf9caf4bd0fce6ef7a9894c1ec4c173b240c"
300
+ },
301
+ {
302
+ "path": "platform/windows/hellolynk-local-data-key.ps1",
303
+ "sha256": "3143122114c9756370e2ff3f56eba4a03e4a1657888aab1c6d4387427081d937"
304
+ },
305
+ {
306
+ "path": "platform/windows/hellolynk-native-human-confirmation-broker.ps1",
307
+ "sha256": "d63e02b34eb43d1a81d771f0e23f0b8d38e34c8f96663156d0c7b79985802936"
308
+ },
309
+ {
310
+ "path": "bootstrap/core/hellolynk-client-account.mjs",
311
+ "sha256": "a22f14f494c1a44a9272ca95e160f8cb1df612a1ceb8b54e32596b13f90c3740"
312
+ },
313
+ {
314
+ "path": "bootstrap/core/hellolynk-client-core.mjs",
315
+ "sha256": "af7c9cb7a996fdb194c51dbcc745c48b616ff1686d79a1451104690d882df1b8"
316
+ },
317
+ {
318
+ "path": "bootstrap/core/hellolynk-client-profile.mjs",
319
+ "sha256": "81d4f64c11c8dbccec04a05435cc42b53823db2649f2c88739647299b3c97fd2"
320
+ },
321
+ {
322
+ "path": "bootstrap/core/hellolynk-host-auth.mjs",
323
+ "sha256": "49baa0b82ab078ad74a892a179189bdbd303a791d580ba4d6eac457564fad535"
324
+ },
325
+ {
326
+ "path": "bootstrap/core/hellolynk-host-protected-store.mjs",
327
+ "sha256": "0cefa22574df9dd99073d73bb688e9cae3faf6da862af013c1dfe9c87efef32e"
328
+ },
329
+ {
330
+ "path": "bootstrap/core/hellolynk-local-process-lock.mjs",
331
+ "sha256": "5dd9b21f4e4509b148daaf2b495036e336e56be320d2bf7a3fac08b8a567d3bf"
332
+ },
333
+ {
334
+ "path": "bootstrap/core/hellolynk-neutral-host-installation-store.mjs",
335
+ "sha256": "9ff399639d320e5527e51cd0ddbf049e7e0e8d3cc225cdc30f0d4637356a1590"
336
+ },
337
+ {
338
+ "path": "bootstrap/core/hellolynk-platform-credential-store.mjs",
339
+ "sha256": "0558aca043ff586f10d7b82e1b2fe9b537ff661913dce76fc92feaf9bd7e5546"
340
+ },
341
+ {
342
+ "path": "bootstrap/core/hellolynk-runtime-safety.cjs",
343
+ "sha256": "1518d9904b329f05a92092f0f2d4014675014597573ba85f33e3e06c25ecea16"
344
+ },
345
+ {
346
+ "path": "bootstrap/platform/windows/hellolynk-host-protected-store.ps1",
347
+ "sha256": "84ac61c3762b7f944bf3e2c895f9a6427985ce697052afd9bc610474c921adad"
348
+ },
349
+ {
350
+ "path": "release/integrations/trae-work/server/dynamic-ui-contract.mjs",
351
+ "sha256": "574c6049de1965feffb3d5fce31eb5a97f0b82bcae6cfef1064538bafe04572c"
352
+ },
353
+ {
354
+ "path": "release/integrations/trae-work/server/host-lifecycle.mjs",
355
+ "sha256": "8db8af3a61a6095ded68eb9763c4b3e6a74e0ea3291105c83cd84565bc3abff2"
356
+ },
357
+ {
358
+ "path": "release/integrations/trae-work/server/mcp-proxy.mjs",
359
+ "sha256": "e53eb7ab1261d6e2f84f397bcae11486a60e619a2586e8616a69a8647e1661dc"
360
+ },
361
+ {
362
+ "path": "release/integrations/trae-work/server/mcp-server.mjs",
363
+ "sha256": "a2b01d8a1a127a1c8bdcffe96ae53d3e0319727e2fb26f2a1cedc755527e319e"
364
+ },
365
+ {
366
+ "path": "release/integrations/trae-work/server/neutral-host-adapter.mjs",
367
+ "sha256": "81bf4fd9bec2cb051b15cdedf13606d58fc358e098eec24216fce4fcb2758ca7"
368
+ },
369
+ {
370
+ "path": "release/integrations/trae-work/server/native-task-cdp.mjs",
371
+ "sha256": "587703b7d98dad6c320e4c2f98bf50d4f78d29483ccc01ac1ca27af026f3c5a4"
372
+ },
373
+ {
374
+ "path": "release/integrations/trae-work/server/native-task-worker.mjs",
375
+ "sha256": "8c12e71943265dfb971fe64aadb4617522d0cf334ebc7721f34d18f870374a07"
376
+ },
377
+ {
378
+ "path": "release/integrations/trae-work/server/trae-neutral-production.mjs",
379
+ "sha256": "76971d9933bcf1861c16eb62b9d220346b3b9c6aeac35672cc04f5658ec6baee"
380
+ },
381
+ {
382
+ "path": "release/integrations/trae-work/server/trae-ui-launch.mjs",
383
+ "sha256": "653c0d1849f44c556d13a97f1e50419b9c34d5a69f3d9f37bdc3eb39ae7ffb9f"
384
+ },
385
+ {
386
+ "path": "release/integrations/trae-work/server/ui-action-gate.mjs",
387
+ "sha256": "e7f7cf0d0ff20ebe38884f8fbbf04c722e262177dd37818284c6a2b2473be0ad"
388
+ },
389
+ {
390
+ "path": "release/integrations/trae-work/skills/hellolynk-inbox/SKILL.md",
391
+ "sha256": "15e46b225a25ee192ff01f0f674bb8d0792c54eae3c99c5d236a613b2bff29b4"
392
+ }
393
+ ]
394
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "contract": "hellolynk-neutral-host-release-pin-v1",
3
+ "manifestSha256": "8742e8b110db9ecf4ab5e0edb47a70d4a28ddb61d8e548bf9be900b9ba5cd3c7"
4
+ }