@mono-agent/agent-app 0.6.2 → 0.9.0
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/README.md +259 -19
- package/dist/account-home.d.ts +6 -0
- package/dist/account-home.d.ts.map +1 -0
- package/dist/account-home.js +9 -0
- package/dist/account-home.js.map +1 -0
- package/dist/adapter-send-proxy.d.ts +18 -0
- package/dist/adapter-send-proxy.d.ts.map +1 -0
- package/dist/adapter-send-proxy.js +229 -0
- package/dist/adapter-send-proxy.js.map +1 -0
- package/dist/adapter-send-tools-main.js +62 -4
- package/dist/adapter-send-tools-main.js.map +1 -1
- package/dist/adapter-send-tools.d.ts +33 -6
- package/dist/adapter-send-tools.d.ts.map +1 -1
- package/dist/adapter-send-tools.js +485 -87
- package/dist/adapter-send-tools.js.map +1 -1
- package/dist/app-config.d.ts +3 -1
- package/dist/app-config.d.ts.map +1 -1
- package/dist/app-config.js +16 -5
- package/dist/app-config.js.map +1 -1
- package/dist/app.d.ts +27 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +761 -147
- package/dist/app.js.map +1 -1
- package/dist/background-environment.d.ts +16 -0
- package/dist/background-environment.d.ts.map +1 -0
- package/dist/background-environment.js +68 -0
- package/dist/background-environment.js.map +1 -0
- package/dist/background-runtime.d.ts +62 -0
- package/dist/background-runtime.d.ts.map +1 -0
- package/dist/background-runtime.js +1115 -0
- package/dist/background-runtime.js.map +1 -0
- package/dist/background-snapshot-key.d.ts +13 -0
- package/dist/background-snapshot-key.d.ts.map +1 -0
- package/dist/background-snapshot-key.js +194 -0
- package/dist/background-snapshot-key.js.map +1 -0
- package/dist/background-snapshot.d.ts +96 -0
- package/dist/background-snapshot.d.ts.map +1 -0
- package/dist/background-snapshot.js +450 -0
- package/dist/background-snapshot.js.map +1 -0
- package/dist/background-worker-lease.d.ts +39 -0
- package/dist/background-worker-lease.d.ts.map +1 -0
- package/dist/background-worker-lease.js +356 -0
- package/dist/background-worker-lease.js.map +1 -0
- package/dist/background.d.ts +74 -2
- package/dist/background.d.ts.map +1 -1
- package/dist/background.js +815 -73
- package/dist/background.js.map +1 -1
- package/dist/broadcast-recorder.d.ts.map +1 -1
- package/dist/broadcast-recorder.js +24 -2
- package/dist/broadcast-recorder.js.map +1 -1
- package/dist/channel-plugins.d.ts +2 -0
- package/dist/channel-plugins.d.ts.map +1 -1
- package/dist/channel-plugins.js +8 -0
- package/dist/channel-plugins.js.map +1 -1
- package/dist/channels.d.ts +10 -0
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +87 -9
- package/dist/channels.js.map +1 -1
- package/dist/cli.d.ts +86 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2421 -143
- package/dist/cli.js.map +1 -1
- package/dist/config-reference.d.ts.map +1 -1
- package/dist/config-reference.js +448 -6
- package/dist/config-reference.js.map +1 -1
- package/dist/configuration-proposal-main.d.ts +3 -0
- package/dist/configuration-proposal-main.d.ts.map +1 -0
- package/dist/configuration-proposal-main.js +13 -0
- package/dist/configuration-proposal-main.js.map +1 -0
- package/dist/configuration-proposal-tool.d.ts +33 -0
- package/dist/configuration-proposal-tool.d.ts.map +1 -0
- package/dist/configuration-proposal-tool.js +188 -0
- package/dist/configuration-proposal-tool.js.map +1 -0
- package/dist/configured-agent.d.ts +16 -0
- package/dist/configured-agent.d.ts.map +1 -1
- package/dist/configured-agent.js +165 -18
- package/dist/configured-agent.js.map +1 -1
- package/dist/consumer-contract.d.ts +3 -0
- package/dist/consumer-contract.d.ts.map +1 -1
- package/dist/consumer-contract.js +44 -1
- package/dist/consumer-contract.js.map +1 -1
- package/dist/continuation-command.d.ts +15 -0
- package/dist/continuation-command.d.ts.map +1 -0
- package/dist/continuation-command.js +170 -0
- package/dist/continuation-command.js.map +1 -0
- package/dist/continuation-config.d.ts +25 -0
- package/dist/continuation-config.d.ts.map +1 -0
- package/dist/continuation-config.js +236 -0
- package/dist/continuation-config.js.map +1 -0
- package/dist/continuation-service.d.ts +99 -0
- package/dist/continuation-service.d.ts.map +1 -0
- package/dist/continuation-service.js +1313 -0
- package/dist/continuation-service.js.map +1 -0
- package/dist/continuation-store.d.ts +104 -0
- package/dist/continuation-store.d.ts.map +1 -0
- package/dist/continuation-store.js +688 -0
- package/dist/continuation-store.js.map +1 -0
- package/dist/continuations.d.ts +167 -0
- package/dist/continuations.d.ts.map +1 -0
- package/dist/continuations.js +71 -0
- package/dist/continuations.js.map +1 -0
- package/dist/doctor.d.ts +29 -5
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +1611 -116
- package/dist/doctor.js.map +1 -1
- package/dist/first-run-managed-memory.d.ts +39 -0
- package/dist/first-run-managed-memory.d.ts.map +1 -0
- package/dist/first-run-managed-memory.js +584 -0
- package/dist/first-run-managed-memory.js.map +1 -0
- package/dist/first-run-readiness.d.ts +111 -0
- package/dist/first-run-readiness.d.ts.map +1 -0
- package/dist/first-run-readiness.js +728 -0
- package/dist/first-run-readiness.js.map +1 -0
- package/dist/index.d.ts +17 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +95 -3
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +1218 -24
- package/dist/init.js.map +1 -1
- package/dist/interaction-bridge.d.ts +25 -1
- package/dist/interaction-bridge.d.ts.map +1 -1
- package/dist/interaction-bridge.js +281 -19
- package/dist/interaction-bridge.js.map +1 -1
- package/dist/launchd.d.ts +16 -6
- package/dist/launchd.d.ts.map +1 -1
- package/dist/launchd.js +30 -15
- package/dist/launchd.js.map +1 -1
- package/dist/local-configuration.d.ts +99 -0
- package/dist/local-configuration.d.ts.map +1 -0
- package/dist/local-configuration.js +1299 -0
- package/dist/local-configuration.js.map +1 -0
- package/dist/managed-runtime-packages.d.ts +9 -0
- package/dist/managed-runtime-packages.d.ts.map +1 -0
- package/dist/managed-runtime-packages.js +56 -0
- package/dist/managed-runtime-packages.js.map +1 -0
- package/dist/memory-command.d.ts +4 -0
- package/dist/memory-command.d.ts.map +1 -1
- package/dist/memory-command.js +751 -27
- package/dist/memory-command.js.map +1 -1
- package/dist/memory-embedding-service.d.ts +33 -0
- package/dist/memory-embedding-service.d.ts.map +1 -0
- package/dist/memory-embedding-service.js +207 -0
- package/dist/memory-embedding-service.js.map +1 -0
- package/dist/memory-recall.d.ts +43 -14
- package/dist/memory-recall.d.ts.map +1 -1
- package/dist/memory-recall.js +103 -33
- package/dist/memory-recall.js.map +1 -1
- package/dist/memory-retrieval.d.ts +66 -0
- package/dist/memory-retrieval.d.ts.map +1 -0
- package/dist/memory-retrieval.js +332 -0
- package/dist/memory-retrieval.js.map +1 -0
- package/dist/modules/base.d.ts +6 -5
- package/dist/modules/base.d.ts.map +1 -1
- package/dist/modules/base.js +11 -7
- package/dist/modules/base.js.map +1 -1
- package/dist/modules/catalog.d.ts.map +1 -1
- package/dist/modules/catalog.js +141 -25
- package/dist/modules/catalog.js.map +1 -1
- package/dist/modules/index.d.ts +2 -2
- package/dist/modules/index.d.ts.map +1 -1
- package/dist/modules/index.js +1 -1
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/known-tools.d.ts +3 -0
- package/dist/modules/known-tools.d.ts.map +1 -1
- package/dist/modules/known-tools.js +11 -1
- package/dist/modules/known-tools.js.map +1 -1
- package/dist/modules/types.d.ts +20 -6
- package/dist/modules/types.d.ts.map +1 -1
- package/dist/modules/types.js.map +1 -1
- package/dist/notify-runtime.d.ts +26 -0
- package/dist/notify-runtime.d.ts.map +1 -0
- package/dist/notify-runtime.js +27 -0
- package/dist/notify-runtime.js.map +1 -0
- package/dist/notify-tool.d.ts +51 -0
- package/dist/notify-tool.d.ts.map +1 -0
- package/dist/notify-tool.js +182 -0
- package/dist/notify-tool.js.map +1 -0
- package/dist/package-version.d.ts +3 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +14 -0
- package/dist/package-version.js.map +1 -0
- package/dist/pi-auth-store-inspection.d.ts +21 -0
- package/dist/pi-auth-store-inspection.d.ts.map +1 -0
- package/dist/pi-auth-store-inspection.js +120 -0
- package/dist/pi-auth-store-inspection.js.map +1 -0
- package/dist/pi-oauth-login-main.d.ts +3 -0
- package/dist/pi-oauth-login-main.d.ts.map +1 -0
- package/dist/pi-oauth-login-main.js +14 -0
- package/dist/pi-oauth-login-main.js.map +1 -0
- package/dist/pi-oauth-login.d.ts +22 -0
- package/dist/pi-oauth-login.d.ts.map +1 -0
- package/dist/pi-oauth-login.js +79 -0
- package/dist/pi-oauth-login.js.map +1 -0
- package/dist/proactive-notify.d.ts +2 -0
- package/dist/proactive-notify.d.ts.map +1 -1
- package/dist/proactive-notify.js +1 -0
- package/dist/proactive-notify.js.map +1 -1
- package/dist/process-incarnation.d.ts +23 -0
- package/dist/process-incarnation.d.ts.map +1 -0
- package/dist/process-incarnation.js +208 -0
- package/dist/process-incarnation.js.map +1 -0
- package/dist/project-skills.d.ts +40 -0
- package/dist/project-skills.d.ts.map +1 -0
- package/dist/project-skills.js +573 -0
- package/dist/project-skills.js.map +1 -0
- package/dist/provider-setup.d.ts +117 -2
- package/dist/provider-setup.d.ts.map +1 -1
- package/dist/provider-setup.js +1505 -49
- package/dist/provider-setup.js.map +1 -1
- package/dist/readiness-probe-worker.d.ts +12 -0
- package/dist/readiness-probe-worker.d.ts.map +1 -0
- package/dist/readiness-probe-worker.js +276 -0
- package/dist/readiness-probe-worker.js.map +1 -0
- package/dist/readiness-probe.d.ts +100 -0
- package/dist/readiness-probe.d.ts.map +1 -0
- package/dist/readiness-probe.js +780 -0
- package/dist/readiness-probe.js.map +1 -0
- package/dist/recipes/base.d.ts +15 -0
- package/dist/recipes/base.d.ts.map +1 -0
- package/dist/recipes/base.js +51 -0
- package/dist/recipes/base.js.map +1 -0
- package/dist/recipes/catalog.d.ts +4 -0
- package/dist/recipes/catalog.d.ts.map +1 -0
- package/dist/recipes/catalog.js +525 -0
- package/dist/recipes/catalog.js.map +1 -0
- package/dist/recipes/index.d.ts +11 -0
- package/dist/recipes/index.d.ts.map +1 -0
- package/dist/recipes/index.js +14 -0
- package/dist/recipes/index.js.map +1 -0
- package/dist/recipes/types.d.ts +70 -0
- package/dist/recipes/types.d.ts.map +1 -0
- package/dist/recipes/types.js +15 -0
- package/dist/recipes/types.js.map +1 -0
- package/dist/request-model-override.d.ts +43 -1
- package/dist/request-model-override.d.ts.map +1 -1
- package/dist/request-model-override.js +178 -19
- package/dist/request-model-override.js.map +1 -1
- package/dist/run-history.d.ts +32 -0
- package/dist/run-history.d.ts.map +1 -0
- package/dist/run-history.js +859 -0
- package/dist/run-history.js.map +1 -0
- package/dist/runs-health.d.ts.map +1 -1
- package/dist/runs-health.js +12 -4
- package/dist/runs-health.js.map +1 -1
- package/dist/runtime-option-extensions.d.ts +14 -0
- package/dist/runtime-option-extensions.d.ts.map +1 -0
- package/dist/runtime-option-extensions.js +98 -0
- package/dist/runtime-option-extensions.js.map +1 -0
- package/dist/runtime-routes.d.ts +9 -0
- package/dist/runtime-routes.d.ts.map +1 -0
- package/dist/runtime-routes.js +13 -0
- package/dist/runtime-routes.js.map +1 -0
- package/dist/sandbox-manager.d.ts +86 -0
- package/dist/sandbox-manager.d.ts.map +1 -0
- package/dist/sandbox-manager.js +1402 -0
- package/dist/sandbox-manager.js.map +1 -0
- package/dist/setup.d.ts +29 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +97 -0
- package/dist/setup.js.map +1 -0
- package/dist/supermemory-plugin.d.ts +56 -0
- package/dist/supermemory-plugin.d.ts.map +1 -0
- package/dist/supermemory-plugin.js +142 -0
- package/dist/supermemory-plugin.js.map +1 -0
- package/dist/tui-command.d.ts +56 -0
- package/dist/tui-command.d.ts.map +1 -1
- package/dist/tui-command.js +305 -31
- package/dist/tui-command.js.map +1 -1
- package/dist/web-command.d.ts +8 -0
- package/dist/web-command.d.ts.map +1 -1
- package/dist/web-command.js +174 -17
- package/dist/web-command.js.map +1 -1
- package/dist/wizard/answers.d.ts +31 -4
- package/dist/wizard/answers.d.ts.map +1 -1
- package/dist/wizard/answers.js +141 -29
- package/dist/wizard/answers.js.map +1 -1
- package/dist/wizard/from-flags.d.ts +7 -0
- package/dist/wizard/from-flags.d.ts.map +1 -1
- package/dist/wizard/from-flags.js +36 -2
- package/dist/wizard/from-flags.js.map +1 -1
- package/dist/wizard/index.d.ts +4 -4
- package/dist/wizard/index.d.ts.map +1 -1
- package/dist/wizard/index.js +2 -2
- package/dist/wizard/index.js.map +1 -1
- package/dist/wizard/model-discovery.d.ts +33 -2
- package/dist/wizard/model-discovery.d.ts.map +1 -1
- package/dist/wizard/model-discovery.js +826 -108
- package/dist/wizard/model-discovery.js.map +1 -1
- package/dist/wizard/presets.d.ts +1 -1
- package/dist/wizard/presets.d.ts.map +1 -1
- package/dist/wizard/presets.js +7 -12
- package/dist/wizard/presets.js.map +1 -1
- package/dist/wizard/prompts.d.ts +56 -9
- package/dist/wizard/prompts.d.ts.map +1 -1
- package/dist/wizard/prompts.js +172 -20
- package/dist/wizard/prompts.js.map +1 -1
- package/dist/wizard/run.d.ts +59 -3
- package/dist/wizard/run.d.ts.map +1 -1
- package/dist/wizard/run.js +1290 -191
- package/dist/wizard/run.js.map +1 -1
- package/package.json +21 -16
- package/resources/srt/package-lock.json +66 -0
- package/resources/srt/package.json +9 -0
- package/schema/mono-agent.config.schema.json +587 -20
- package/skills/mono-agent-composer/SKILL.md +6 -6
- package/skills/mono-agent-composer/references/config-blueprint.md +11 -10
- package/skills/mono-agent-composer/references/discovery-questions.md +33 -18
- package/skills/mono-agent-composer/references/feature-coverage.md +14 -12
- package/skills/mono-agent-composer/references/package-map.md +2 -2
- package/skills/mono-agent-composer/references/playbooks.md +8 -7
- package/skills/mono-agent-composer/references/validation.md +3 -3
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
import { createHmac } from "node:crypto";
|
|
2
|
+
import { constants as fsConstants } from "node:fs";
|
|
3
|
+
import { chmod, lstat, mkdir, mkdtemp, open, readFile, realpath, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { join, resolve } from "node:path";
|
|
5
|
+
import { accountHomeDirectory } from "./account-home.js";
|
|
6
|
+
import { loadAppCoreConfig } from "./app-config.js";
|
|
7
|
+
import { loadBackgroundSnapshotKey, loadOrCreateBackgroundSnapshotKey, } from "./background-snapshot-key.js";
|
|
8
|
+
import { fingerprintBackgroundOperationalEnvironment, isBackgroundOperationalEnvName, selectBackgroundOperationalEnvironment, } from "./background-environment.js";
|
|
9
|
+
import { readCliConfigSnapshot, readCliDotenvSnapshot } from "./first-run-readiness.js";
|
|
10
|
+
export const BACKGROUND_SNAPSHOT_SCHEMA = "mono-agent.background-snapshot.v1";
|
|
11
|
+
const MAX_ENCODED_BACKGROUND_SNAPSHOT_LENGTH = 32_768;
|
|
12
|
+
/**
|
|
13
|
+
* Encode the secret-free approved snapshot for the owner-private LaunchAgent
|
|
14
|
+
* ProgramArguments. base64url keeps the value XML/shell inert while remaining
|
|
15
|
+
* visible and deterministic for diagnostics.
|
|
16
|
+
*/
|
|
17
|
+
export function encodeBackgroundSnapshot(snapshot) {
|
|
18
|
+
return Buffer.from(JSON.stringify(snapshot), "utf8").toString("base64url");
|
|
19
|
+
}
|
|
20
|
+
/** Fail closed when an internal managed-worker snapshot argument is malformed. */
|
|
21
|
+
export function decodeBackgroundSnapshot(encoded) {
|
|
22
|
+
if (encoded.length === 0
|
|
23
|
+
|| encoded.length > MAX_ENCODED_BACKGROUND_SNAPSHOT_LENGTH
|
|
24
|
+
|| !/^[A-Za-z0-9_-]+$/u.test(encoded)) {
|
|
25
|
+
throw new Error("The managed background snapshot argument is malformed.");
|
|
26
|
+
}
|
|
27
|
+
let bytes;
|
|
28
|
+
let parsed;
|
|
29
|
+
try {
|
|
30
|
+
bytes = Buffer.from(encoded, "base64url");
|
|
31
|
+
if (bytes.toString("base64url") !== encoded) {
|
|
32
|
+
throw new Error("non-canonical base64url");
|
|
33
|
+
}
|
|
34
|
+
parsed = JSON.parse(bytes.toString("utf8"));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
throw new Error("The managed background snapshot argument is malformed.");
|
|
38
|
+
}
|
|
39
|
+
const snapshot = backgroundSnapshotFromMetadata({ backgroundSnapshot: parsed });
|
|
40
|
+
if (snapshot === undefined) {
|
|
41
|
+
throw new Error("The managed background snapshot argument has an invalid schema.");
|
|
42
|
+
}
|
|
43
|
+
return snapshot;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Reconstruct the worker environment without inheriting shell credentials or
|
|
47
|
+
* config overrides, then attest it. This mirrors managed-worker startup:
|
|
48
|
+
* operational plist values exist first and dotenv fills every other key.
|
|
49
|
+
*/
|
|
50
|
+
export async function captureDurableBackgroundSnapshot(input) {
|
|
51
|
+
return (await captureDurableBackgroundInputs(input)).snapshot;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Reconstruct and attest one indivisible durable worker input. Returning the
|
|
55
|
+
* environment with its snapshot prevents callers from accidentally validating
|
|
56
|
+
* one environment and launching with a shell-enriched variant.
|
|
57
|
+
*/
|
|
58
|
+
export async function captureDurableBackgroundInputs(input) {
|
|
59
|
+
const cwd = resolve(input.cwd);
|
|
60
|
+
const environment = await loadDurableBackgroundEnvironment(input);
|
|
61
|
+
const configPath = resolve(cwd, input.configPath);
|
|
62
|
+
const configBefore = await readCliConfigSnapshot(configPath);
|
|
63
|
+
const snapshot = await captureBackgroundSnapshot({
|
|
64
|
+
cwd,
|
|
65
|
+
configPath: input.configPath,
|
|
66
|
+
...(input.envFile === undefined ? {} : { envFile: input.envFile }),
|
|
67
|
+
env: environment,
|
|
68
|
+
...(input.proofKey === undefined ? {} : { proofKey: input.proofKey }),
|
|
69
|
+
});
|
|
70
|
+
const configAfter = await readCliConfigSnapshot(configPath);
|
|
71
|
+
if (configBefore.fingerprint !== configAfter.fingerprint) {
|
|
72
|
+
throw new Error("Refusing to prove background readiness because the config changed during durable capture.");
|
|
73
|
+
}
|
|
74
|
+
return { environment, snapshot, configSourceFingerprint: configAfter.fingerprint };
|
|
75
|
+
}
|
|
76
|
+
export async function loadDurableBackgroundEnvironment(input) {
|
|
77
|
+
const cwd = resolve(input.cwd);
|
|
78
|
+
const dotenvPath = resolve(cwd, input.envFile ?? ".env");
|
|
79
|
+
const dotenv = await readCliDotenvSnapshot(dotenvPath);
|
|
80
|
+
const operational = selectBackgroundOperationalEnvironment(input.operationalEnvironment);
|
|
81
|
+
return { ...dotenv.env, ...operational };
|
|
82
|
+
}
|
|
83
|
+
export async function captureBackgroundSnapshot(input) {
|
|
84
|
+
const cwd = resolve(input.cwd);
|
|
85
|
+
const configPath = resolve(cwd, input.configPath);
|
|
86
|
+
const dotenvPath = resolve(cwd, input.envFile ?? ".env");
|
|
87
|
+
const proofKey = normalizeProofKey(input.proofKey ?? await loadOrCreateBackgroundSnapshotKey(configPath));
|
|
88
|
+
const [config, dotenv, dotenvFingerprint] = await Promise.all([
|
|
89
|
+
readRegularFileProof(configPath, "config", proofKey),
|
|
90
|
+
readCliDotenvSnapshot(dotenvPath),
|
|
91
|
+
fingerprintOptionalRegularFile(dotenvPath, "dotenv", proofKey),
|
|
92
|
+
]);
|
|
93
|
+
assertDotenvMatchesEffectiveEnvironment(dotenv.env, input.env, dotenvPath);
|
|
94
|
+
const core = await loadAppCoreConfig({ cwd, configPath, env: input.env });
|
|
95
|
+
const identityPath = resolve(core.context.identityPath);
|
|
96
|
+
const identityFingerprint = await fingerprintRegularFile(identityPath, "identity", proofKey);
|
|
97
|
+
const soulPath = core.context.soulPath === undefined ? undefined : resolve(core.context.soulPath);
|
|
98
|
+
const soulFingerprint = soulPath === undefined
|
|
99
|
+
? undefined
|
|
100
|
+
: await fingerprintRegularFile(soulPath, "soul", proofKey);
|
|
101
|
+
const mcpConfigPath = core.tools.mcpConfigPath === undefined ? undefined : resolve(core.tools.mcpConfigPath);
|
|
102
|
+
const mcpConfigFingerprint = mcpConfigPath === undefined
|
|
103
|
+
? undefined
|
|
104
|
+
: await fingerprintRegularFile(mcpConfigPath, "MCP config", proofKey);
|
|
105
|
+
// The config determines Identity/Soul/MCP paths and the effective env
|
|
106
|
+
// determines the loaded config. Re-read every durable input after resolution so a
|
|
107
|
+
// rename/write racing this capture cannot produce a self-inconsistent proof.
|
|
108
|
+
const [configAfter, dotenvAfter, dotenvFingerprintAfter, identityAfter, soulAfter, mcpConfigAfter,] = await Promise.all([
|
|
109
|
+
readRegularFileProof(configPath, "config", proofKey),
|
|
110
|
+
readCliDotenvSnapshot(dotenvPath),
|
|
111
|
+
fingerprintOptionalRegularFile(dotenvPath, "dotenv", proofKey),
|
|
112
|
+
fingerprintRegularFile(identityPath, "identity", proofKey),
|
|
113
|
+
soulPath === undefined ? Promise.resolve(undefined) : fingerprintRegularFile(soulPath, "soul", proofKey),
|
|
114
|
+
mcpConfigPath === undefined
|
|
115
|
+
? Promise.resolve(undefined)
|
|
116
|
+
: fingerprintRegularFile(mcpConfigPath, "MCP config", proofKey),
|
|
117
|
+
]);
|
|
118
|
+
if (config.fingerprint !== configAfter.fingerprint
|
|
119
|
+
|| dotenv.fingerprint !== dotenvAfter.fingerprint
|
|
120
|
+
|| dotenvFingerprint !== dotenvFingerprintAfter
|
|
121
|
+
|| identityFingerprint !== identityAfter
|
|
122
|
+
|| soulFingerprint !== soulAfter
|
|
123
|
+
|| mcpConfigFingerprint !== mcpConfigAfter) {
|
|
124
|
+
throw new Error("Refusing to prove background readiness because a durable input changed during startup capture.");
|
|
125
|
+
}
|
|
126
|
+
assertDotenvMatchesEffectiveEnvironment(dotenvAfter.env, input.env, dotenvPath);
|
|
127
|
+
return {
|
|
128
|
+
schema: BACKGROUND_SNAPSHOT_SCHEMA,
|
|
129
|
+
configPath,
|
|
130
|
+
configFingerprint: config.fingerprint,
|
|
131
|
+
dotenvPath,
|
|
132
|
+
dotenvFingerprint,
|
|
133
|
+
identityPath,
|
|
134
|
+
identityFingerprint,
|
|
135
|
+
...(soulPath === undefined || soulFingerprint === undefined ? {} : { soulPath, soulFingerprint }),
|
|
136
|
+
...(mcpConfigPath === undefined || mcpConfigFingerprint === undefined
|
|
137
|
+
? {}
|
|
138
|
+
: { mcpConfigPath, mcpConfigFingerprint }),
|
|
139
|
+
operationalEnvironmentFingerprint: fingerprintBackgroundOperationalEnvironment(input.env),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Freeze the exact config and context bytes attested by `snapshot` before any
|
|
144
|
+
* app/channel loader runs. The app advertises the canonical config path, but
|
|
145
|
+
* reads this private copy so an edit/revert during startup cannot produce a
|
|
146
|
+
* mixed worker while retaining the old trace proof.
|
|
147
|
+
*/
|
|
148
|
+
export async function materializeBackgroundRuntimeInputs(input) {
|
|
149
|
+
const snapshot = input.snapshot;
|
|
150
|
+
const cwd = resolve(input.cwd);
|
|
151
|
+
const proofKey = normalizeProofKey(input.proofKey ?? await loadBackgroundSnapshotKey(snapshot.configPath));
|
|
152
|
+
const root = await ensureRuntimeInputsRoot(input.runtimeRoot, input.homeDir);
|
|
153
|
+
const directory = await mkdtemp(join(root, "worker-"));
|
|
154
|
+
await chmod(directory, 0o700);
|
|
155
|
+
let disposed = false;
|
|
156
|
+
try {
|
|
157
|
+
const [config, dotenvFingerprint, identity, soul, mcpConfig] = await Promise.all([
|
|
158
|
+
readRegularFileProof(snapshot.configPath, "config", proofKey),
|
|
159
|
+
fingerprintOptionalRegularFile(snapshot.dotenvPath, "dotenv", proofKey),
|
|
160
|
+
readRegularFileProof(snapshot.identityPath, "identity", proofKey),
|
|
161
|
+
snapshot.soulPath === undefined
|
|
162
|
+
? Promise.resolve(undefined)
|
|
163
|
+
: readRegularFileProof(snapshot.soulPath, "soul", proofKey),
|
|
164
|
+
snapshot.mcpConfigPath === undefined
|
|
165
|
+
? Promise.resolve(undefined)
|
|
166
|
+
: readRegularFileProof(snapshot.mcpConfigPath, "MCP config", proofKey),
|
|
167
|
+
]);
|
|
168
|
+
if (config.fingerprint !== snapshot.configFingerprint
|
|
169
|
+
|| dotenvFingerprint !== snapshot.dotenvFingerprint
|
|
170
|
+
|| identity.fingerprint !== snapshot.identityFingerprint
|
|
171
|
+
|| (snapshot.soulPath === undefined) !== (snapshot.soulFingerprint === undefined)
|
|
172
|
+
|| (snapshot.soulPath !== undefined
|
|
173
|
+
&& (soul === undefined || soul.fingerprint !== snapshot.soulFingerprint))
|
|
174
|
+
|| (snapshot.mcpConfigPath === undefined) !== (snapshot.mcpConfigFingerprint === undefined)
|
|
175
|
+
|| (snapshot.mcpConfigPath !== undefined
|
|
176
|
+
&& (mcpConfig === undefined || mcpConfig.fingerprint !== snapshot.mcpConfigFingerprint))) {
|
|
177
|
+
throw new Error("Refusing to materialize background runtime inputs because the approved snapshot changed.");
|
|
178
|
+
}
|
|
179
|
+
const configPath = join(directory, "mono-agent.config.json");
|
|
180
|
+
const identityPath = join(directory, "IDENTITY.md");
|
|
181
|
+
const soulPath = soul === undefined ? undefined : join(directory, "SOUL.md");
|
|
182
|
+
const mcpConfigPath = mcpConfig === undefined ? undefined : join(directory, "mcp-config.json");
|
|
183
|
+
await writeFile(configPath, config.bytes, { flag: "wx", mode: 0o400 });
|
|
184
|
+
await writeFile(identityPath, identity.bytes, { flag: "wx", mode: 0o400 });
|
|
185
|
+
if (soulPath !== undefined && soul !== undefined) {
|
|
186
|
+
await writeFile(soulPath, soul.bytes, { flag: "wx", mode: 0o400 });
|
|
187
|
+
}
|
|
188
|
+
if (mcpConfigPath !== undefined && mcpConfig !== undefined) {
|
|
189
|
+
await writeFile(mcpConfigPath, mcpConfig.bytes, { flag: "wx", mode: 0o400 });
|
|
190
|
+
}
|
|
191
|
+
await Promise.all([
|
|
192
|
+
chmod(configPath, 0o400),
|
|
193
|
+
chmod(identityPath, 0o400),
|
|
194
|
+
...(soulPath === undefined ? [] : [chmod(soulPath, 0o400)]),
|
|
195
|
+
...(mcpConfigPath === undefined ? [] : [chmod(mcpConfigPath, 0o400)]),
|
|
196
|
+
]);
|
|
197
|
+
const [copiedConfig, copiedIdentity, copiedSoul, copiedMcpConfig] = await Promise.all([
|
|
198
|
+
readFile(configPath),
|
|
199
|
+
readFile(identityPath),
|
|
200
|
+
soulPath === undefined ? Promise.resolve(undefined) : readFile(soulPath),
|
|
201
|
+
mcpConfigPath === undefined ? Promise.resolve(undefined) : readFile(mcpConfigPath),
|
|
202
|
+
]);
|
|
203
|
+
if (!copiedConfig.equals(config.bytes)
|
|
204
|
+
|| !copiedIdentity.equals(identity.bytes)
|
|
205
|
+
|| (soul !== undefined && (copiedSoul === undefined || !copiedSoul.equals(soul.bytes)))
|
|
206
|
+
|| (mcpConfig !== undefined
|
|
207
|
+
&& (copiedMcpConfig === undefined || !copiedMcpConfig.equals(mcpConfig.bytes)))) {
|
|
208
|
+
throw new Error("The private background runtime input copy failed exact verification.");
|
|
209
|
+
}
|
|
210
|
+
// Re-attest every canonical input after materialisation. File fingerprints
|
|
211
|
+
// include ctime, so even an edit followed by byte-for-byte restoration is
|
|
212
|
+
// detected rather than accepted as the approved snapshot.
|
|
213
|
+
const after = await captureBackgroundSnapshot({
|
|
214
|
+
cwd,
|
|
215
|
+
configPath: snapshot.configPath,
|
|
216
|
+
envFile: snapshot.dotenvPath,
|
|
217
|
+
env: input.env,
|
|
218
|
+
proofKey,
|
|
219
|
+
});
|
|
220
|
+
if (!sameBackgroundSnapshot(after, snapshot)) {
|
|
221
|
+
throw new Error("Refusing to start because durable inputs changed while the private runtime snapshot was created.");
|
|
222
|
+
}
|
|
223
|
+
await chmod(directory, 0o500);
|
|
224
|
+
return {
|
|
225
|
+
configPath,
|
|
226
|
+
environment: {
|
|
227
|
+
...input.env,
|
|
228
|
+
MONO_AGENT_IDENTITY_PATH: identityPath,
|
|
229
|
+
...(soulPath === undefined ? {} : { MONO_AGENT_SOUL_PATH: soulPath }),
|
|
230
|
+
...(mcpConfigPath === undefined ? {} : { MONO_AGENT_MCP_CONFIG_PATH: mcpConfigPath }),
|
|
231
|
+
},
|
|
232
|
+
async dispose() {
|
|
233
|
+
if (disposed)
|
|
234
|
+
return;
|
|
235
|
+
disposed = true;
|
|
236
|
+
await chmod(directory, 0o700).catch(() => undefined);
|
|
237
|
+
await rm(directory, { recursive: true, force: true });
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
await chmod(directory, 0o700).catch(() => undefined);
|
|
243
|
+
await rm(directory, { recursive: true, force: true }).catch(() => undefined);
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function assertDotenvMatchesEffectiveEnvironment(dotenv, env, dotenvPath) {
|
|
248
|
+
const dotenvNames = new Set(Object.keys(dotenv));
|
|
249
|
+
for (const [name, value] of Object.entries(dotenv)) {
|
|
250
|
+
// launchd explicitly materialises operational values and Node's dotenv
|
|
251
|
+
// semantics leave them in precedence. Every other dotenv entry must be the
|
|
252
|
+
// value the worker is actually about to use.
|
|
253
|
+
if (!isBackgroundOperationalEnvName(name) && env[name] !== value) {
|
|
254
|
+
throw new Error(`Refusing to prove background readiness because the effective ${name} value does not match ${dotenvPath}.`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
for (const [name, value] of Object.entries(env)) {
|
|
258
|
+
if (value !== undefined
|
|
259
|
+
&& !isBackgroundOperationalEnvName(name)
|
|
260
|
+
&& !dotenvNames.has(name)) {
|
|
261
|
+
throw new Error(`Refusing to prove background readiness because the effective ${name} value is not present in ${dotenvPath}.`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
export function sameBackgroundSnapshot(left, right) {
|
|
266
|
+
return left.schema === right.schema
|
|
267
|
+
&& left.configPath === right.configPath
|
|
268
|
+
&& left.configFingerprint === right.configFingerprint
|
|
269
|
+
&& left.dotenvPath === right.dotenvPath
|
|
270
|
+
&& left.dotenvFingerprint === right.dotenvFingerprint
|
|
271
|
+
&& left.identityPath === right.identityPath
|
|
272
|
+
&& left.identityFingerprint === right.identityFingerprint
|
|
273
|
+
&& left.soulPath === right.soulPath
|
|
274
|
+
&& left.soulFingerprint === right.soulFingerprint
|
|
275
|
+
&& left.mcpConfigPath === right.mcpConfigPath
|
|
276
|
+
&& left.mcpConfigFingerprint === right.mcpConfigFingerprint
|
|
277
|
+
&& left.operationalEnvironmentFingerprint === right.operationalEnvironmentFingerprint;
|
|
278
|
+
}
|
|
279
|
+
/** Fail-closed parser for untrusted trace-source metadata. */
|
|
280
|
+
export function backgroundSnapshotFromMetadata(metadata) {
|
|
281
|
+
const value = metadata?.backgroundSnapshot;
|
|
282
|
+
if (!isRecord(value) || value.schema !== BACKGROUND_SNAPSHOT_SCHEMA)
|
|
283
|
+
return undefined;
|
|
284
|
+
const allowedFields = new Set([
|
|
285
|
+
"schema",
|
|
286
|
+
"configPath",
|
|
287
|
+
"configFingerprint",
|
|
288
|
+
"dotenvPath",
|
|
289
|
+
"dotenvFingerprint",
|
|
290
|
+
"identityPath",
|
|
291
|
+
"identityFingerprint",
|
|
292
|
+
"soulPath",
|
|
293
|
+
"soulFingerprint",
|
|
294
|
+
"mcpConfigPath",
|
|
295
|
+
"mcpConfigFingerprint",
|
|
296
|
+
"operationalEnvironmentFingerprint",
|
|
297
|
+
]);
|
|
298
|
+
if (Object.keys(value).some((field) => !allowedFields.has(field)))
|
|
299
|
+
return undefined;
|
|
300
|
+
const fields = [
|
|
301
|
+
"configPath",
|
|
302
|
+
"configFingerprint",
|
|
303
|
+
"dotenvPath",
|
|
304
|
+
"dotenvFingerprint",
|
|
305
|
+
"identityPath",
|
|
306
|
+
"identityFingerprint",
|
|
307
|
+
"operationalEnvironmentFingerprint",
|
|
308
|
+
];
|
|
309
|
+
if (fields.some((field) => typeof value[field] !== "string" || value[field].length === 0))
|
|
310
|
+
return undefined;
|
|
311
|
+
if ((value.soulPath === undefined) !== (value.soulFingerprint === undefined)
|
|
312
|
+
|| (value.soulPath !== undefined && (typeof value.soulPath !== "string" || value.soulPath.length === 0))
|
|
313
|
+
|| (value.soulFingerprint !== undefined
|
|
314
|
+
&& (typeof value.soulFingerprint !== "string" || value.soulFingerprint.length === 0)))
|
|
315
|
+
return undefined;
|
|
316
|
+
if ((value.mcpConfigPath === undefined) !== (value.mcpConfigFingerprint === undefined)
|
|
317
|
+
|| (value.mcpConfigPath !== undefined
|
|
318
|
+
&& (typeof value.mcpConfigPath !== "string" || value.mcpConfigPath.length === 0))
|
|
319
|
+
|| (value.mcpConfigFingerprint !== undefined
|
|
320
|
+
&& (typeof value.mcpConfigFingerprint !== "string" || value.mcpConfigFingerprint.length === 0)))
|
|
321
|
+
return undefined;
|
|
322
|
+
return {
|
|
323
|
+
schema: BACKGROUND_SNAPSHOT_SCHEMA,
|
|
324
|
+
configPath: value.configPath,
|
|
325
|
+
configFingerprint: value.configFingerprint,
|
|
326
|
+
dotenvPath: value.dotenvPath,
|
|
327
|
+
dotenvFingerprint: value.dotenvFingerprint,
|
|
328
|
+
identityPath: value.identityPath,
|
|
329
|
+
identityFingerprint: value.identityFingerprint,
|
|
330
|
+
...(value.soulPath === undefined
|
|
331
|
+
? {}
|
|
332
|
+
: { soulPath: value.soulPath, soulFingerprint: value.soulFingerprint }),
|
|
333
|
+
...(value.mcpConfigPath === undefined
|
|
334
|
+
? {}
|
|
335
|
+
: {
|
|
336
|
+
mcpConfigPath: value.mcpConfigPath,
|
|
337
|
+
mcpConfigFingerprint: value.mcpConfigFingerprint,
|
|
338
|
+
}),
|
|
339
|
+
operationalEnvironmentFingerprint: value.operationalEnvironmentFingerprint,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
async function fingerprintRegularFile(path, label, proofKey) {
|
|
343
|
+
return (await readRegularFileProof(path, label, proofKey)).fingerprint;
|
|
344
|
+
}
|
|
345
|
+
async function fingerprintOptionalRegularFile(path, label, proofKey) {
|
|
346
|
+
try {
|
|
347
|
+
return await fingerprintRegularFile(path, label, proofKey);
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
if (error.code === "ENOENT")
|
|
351
|
+
return "missing";
|
|
352
|
+
throw error;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
async function readRegularFileProof(path, label, proofKey) {
|
|
356
|
+
let handle;
|
|
357
|
+
try {
|
|
358
|
+
handle = await open(path, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW | fsConstants.O_NONBLOCK);
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
if (["ELOOP", "EMLINK"].includes(error.code ?? "")) {
|
|
362
|
+
throw new Error(`Refusing to read ${label} path ${path} because it is a symbolic link.`);
|
|
363
|
+
}
|
|
364
|
+
throw error;
|
|
365
|
+
}
|
|
366
|
+
try {
|
|
367
|
+
const before = await handle.stat({ bigint: true });
|
|
368
|
+
if (!before.isFile()) {
|
|
369
|
+
throw new Error(`Refusing to read ${label} path ${path} because it is not a regular file.`);
|
|
370
|
+
}
|
|
371
|
+
const bytes = await handle.readFile();
|
|
372
|
+
const [afterHandle, afterPath] = await Promise.all([
|
|
373
|
+
handle.stat({ bigint: true }),
|
|
374
|
+
lstat(path, { bigint: true }),
|
|
375
|
+
]);
|
|
376
|
+
if (afterPath.isSymbolicLink()
|
|
377
|
+
|| !afterPath.isFile()
|
|
378
|
+
|| !sameRegularFileVersion(before, afterHandle)
|
|
379
|
+
|| !sameRegularFileVersion(before, afterPath)) {
|
|
380
|
+
throw new Error(`Refusing to read ${label} path ${path} because it changed during startup.`);
|
|
381
|
+
}
|
|
382
|
+
return { bytes, fingerprint: [
|
|
383
|
+
"file",
|
|
384
|
+
before.dev.toString(),
|
|
385
|
+
before.ino.toString(),
|
|
386
|
+
before.size.toString(),
|
|
387
|
+
before.mtimeNs.toString(),
|
|
388
|
+
before.ctimeNs.toString(),
|
|
389
|
+
before.mode.toString(8),
|
|
390
|
+
createHmac("sha256", proofKey)
|
|
391
|
+
.update("mono-agent.background-file.v1\0", "utf8")
|
|
392
|
+
.update(label, "utf8")
|
|
393
|
+
.update("\0", "utf8")
|
|
394
|
+
.update(path, "utf8")
|
|
395
|
+
.update("\0", "utf8")
|
|
396
|
+
.update(bytes)
|
|
397
|
+
.digest("hex"),
|
|
398
|
+
].join(":") };
|
|
399
|
+
}
|
|
400
|
+
finally {
|
|
401
|
+
await handle.close();
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
function sameRegularFileVersion(left, right) {
|
|
405
|
+
return left.dev === right.dev
|
|
406
|
+
&& left.ino === right.ino
|
|
407
|
+
&& left.size === right.size
|
|
408
|
+
&& left.mtimeNs === right.mtimeNs
|
|
409
|
+
&& left.ctimeNs === right.ctimeNs
|
|
410
|
+
&& left.mode === right.mode;
|
|
411
|
+
}
|
|
412
|
+
function normalizeProofKey(value) {
|
|
413
|
+
if (value.byteLength !== 32) {
|
|
414
|
+
throw new Error("The background snapshot proof key must contain exactly 32 bytes.");
|
|
415
|
+
}
|
|
416
|
+
return Buffer.from(value);
|
|
417
|
+
}
|
|
418
|
+
async function ensureRuntimeInputsRoot(runtimeRoot, homeDir) {
|
|
419
|
+
if (runtimeRoot !== undefined) {
|
|
420
|
+
await mkdir(resolve(runtimeRoot), { recursive: true, mode: 0o700 });
|
|
421
|
+
const canonical = await realpath(resolve(runtimeRoot));
|
|
422
|
+
await assertPrivateDirectory(canonical, "background runtime input root");
|
|
423
|
+
return canonical;
|
|
424
|
+
}
|
|
425
|
+
const home = await realpath(resolve(homeDir ?? accountHomeDirectory()));
|
|
426
|
+
let current = home;
|
|
427
|
+
for (const segment of [".mono-agent", "runtime-inputs"]) {
|
|
428
|
+
current = join(current, segment);
|
|
429
|
+
await mkdir(current, { mode: 0o700 }).catch((error) => {
|
|
430
|
+
if (error.code !== "EEXIST")
|
|
431
|
+
throw error;
|
|
432
|
+
});
|
|
433
|
+
await assertPrivateDirectory(current, "background runtime input root");
|
|
434
|
+
}
|
|
435
|
+
return current;
|
|
436
|
+
}
|
|
437
|
+
async function assertPrivateDirectory(path, label) {
|
|
438
|
+
const details = await lstat(path);
|
|
439
|
+
if (!details.isDirectory() || details.isSymbolicLink()) {
|
|
440
|
+
throw new Error(`${label} ${path} must be a real directory.`);
|
|
441
|
+
}
|
|
442
|
+
if (typeof process.getuid === "function" && details.uid !== process.getuid()) {
|
|
443
|
+
throw new Error(`${label} ${path} must be owned by the current user.`);
|
|
444
|
+
}
|
|
445
|
+
await chmod(path, 0o700);
|
|
446
|
+
}
|
|
447
|
+
function isRecord(value) {
|
|
448
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=background-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-snapshot.js","sourceRoot":"","sources":["../src/background-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ProcessIncarnation, SameProcessIncarnation } from "./process-incarnation.js";
|
|
2
|
+
export interface BackgroundWorkerLease {
|
|
3
|
+
readonly configPath: string;
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly ownerPid: number;
|
|
6
|
+
/** Idempotently release only this process's exact lease token. */
|
|
7
|
+
release(): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export interface BackgroundWorkerLeaseOptions {
|
|
10
|
+
readonly homeDir?: string;
|
|
11
|
+
readonly pid?: number;
|
|
12
|
+
readonly now?: () => number;
|
|
13
|
+
/** Test/embed seam for the owner record written by this acquisition. */
|
|
14
|
+
readonly processIncarnation?: ProcessIncarnation;
|
|
15
|
+
/** Test/embed seam; production checks boot session plus process birth. */
|
|
16
|
+
readonly isSameProcessIncarnation?: SameProcessIncarnation;
|
|
17
|
+
readonly randomToken?: () => string;
|
|
18
|
+
readonly ownerlessGraceMs?: number;
|
|
19
|
+
/** Narrow deterministic seams for filesystem-race tests. */
|
|
20
|
+
readonly hooks?: {
|
|
21
|
+
readonly afterLeaseDirectoryCreated?: () => Promise<void>;
|
|
22
|
+
readonly beforeStaleLeaseRename?: () => Promise<void>;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Stable owner-private lifetime-lease path for one exact resolved config.
|
|
27
|
+
* The full path digest avoids relying on the shorter human-facing launchd hash.
|
|
28
|
+
*/
|
|
29
|
+
export declare function backgroundWorkerLeasePath(configPath: string, homeDir?: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Acquire the process-lifetime singleton for a config.
|
|
32
|
+
*
|
|
33
|
+
* `undefined` means either a live owner or a fresh ownerless directory (the
|
|
34
|
+
* atomic mkdir -> owner.json initialization window) already holds the lease.
|
|
35
|
+
* Dead owners and old ownerless crash debris are atomically quarantined before
|
|
36
|
+
* one bounded retry. The returned lease must be held until worker shutdown.
|
|
37
|
+
*/
|
|
38
|
+
export declare function acquireBackgroundWorkerLease(configPath: string, options?: BackgroundWorkerLeaseOptions): Promise<BackgroundWorkerLease | undefined>;
|
|
39
|
+
//# sourceMappingURL=background-worker-lease.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-worker-lease.d.ts","sourceRoot":"","sources":["../src/background-worker-lease.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAe3F,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACjD,0EAA0E;IAC1E,QAAQ,CAAC,wBAAwB,CAAC,EAAE,sBAAsB,CAAC;IAC3D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;IACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1D,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KACvD,CAAC;CACH;AAWD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAA4B,GACpC,MAAM,CAIR;AAED;;;;;;;GAOG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAkG5C"}
|