@mono-agent/agent-app 0.19.0 → 0.20.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 +304 -32
- package/dist/acp-bridge.d.ts.map +1 -1
- package/dist/acp-bridge.js +113 -54
- package/dist/acp-bridge.js.map +1 -1
- package/dist/acp-session-store.d.ts +12 -0
- package/dist/acp-session-store.d.ts.map +1 -0
- package/dist/acp-session-store.js +74 -0
- package/dist/acp-session-store.js.map +1 -0
- package/dist/agent-artifact-paths.d.ts +8 -0
- package/dist/agent-artifact-paths.d.ts.map +1 -0
- package/dist/agent-artifact-paths.js +11 -0
- package/dist/agent-artifact-paths.js.map +1 -0
- package/dist/agent-root-coordinator.d.ts +101 -0
- package/dist/agent-root-coordinator.d.ts.map +1 -0
- package/dist/agent-root-coordinator.js +470 -0
- package/dist/agent-root-coordinator.js.map +1 -0
- package/dist/app-controller-channels.d.ts +11 -1
- package/dist/app-controller-channels.d.ts.map +1 -1
- package/dist/app-controller-channels.js +145 -20
- package/dist/app-controller-channels.js.map +1 -1
- package/dist/app-controller-continuation.d.ts +2 -0
- package/dist/app-controller-continuation.d.ts.map +1 -1
- package/dist/app-controller-continuation.js.map +1 -1
- package/dist/app-controller-lifecycle.d.ts +5 -0
- package/dist/app-controller-lifecycle.d.ts.map +1 -1
- package/dist/app-controller-lifecycle.js +24 -5
- package/dist/app-controller-lifecycle.js.map +1 -1
- package/dist/app-controller-maintenance.d.ts +2 -0
- package/dist/app-controller-maintenance.d.ts.map +1 -1
- package/dist/app-controller-maintenance.js +32 -2
- package/dist/app-controller-maintenance.js.map +1 -1
- package/dist/app-controller-process-jobs.d.ts +46 -0
- package/dist/app-controller-process-jobs.d.ts.map +1 -0
- package/dist/app-controller-process-jobs.js +281 -0
- package/dist/app-controller-process-jobs.js.map +1 -0
- package/dist/app-controller-responder.d.ts +15 -0
- package/dist/app-controller-responder.d.ts.map +1 -1
- package/dist/app-controller-responder.js +146 -12
- package/dist/app-controller-responder.js.map +1 -1
- package/dist/app-controller-traceability.d.ts +6 -0
- package/dist/app-controller-traceability.d.ts.map +1 -1
- package/dist/app-controller-traceability.js +10 -0
- package/dist/app-controller-traceability.js.map +1 -1
- package/dist/app-controller-utils.d.ts +8 -0
- package/dist/app-controller-utils.d.ts.map +1 -1
- package/dist/app-controller-utils.js +24 -1
- package/dist/app-controller-utils.js.map +1 -1
- package/dist/app-controller.d.ts +40 -1
- package/dist/app-controller.d.ts.map +1 -1
- package/dist/app-controller.js +124 -39
- package/dist/app-controller.js.map +1 -1
- package/dist/background-log-maintenance.d.ts +85 -2
- package/dist/background-log-maintenance.d.ts.map +1 -1
- package/dist/background-log-maintenance.js +407 -136
- package/dist/background-log-maintenance.js.map +1 -1
- package/dist/background-runtime.d.ts.map +1 -1
- package/dist/background-runtime.js +22 -41
- package/dist/background-runtime.js.map +1 -1
- package/dist/background.d.ts +18 -26
- package/dist/background.d.ts.map +1 -1
- package/dist/background.js +83 -138
- package/dist/background.js.map +1 -1
- package/dist/channel-drivers/cron.d.ts +12 -1
- package/dist/channel-drivers/cron.d.ts.map +1 -1
- package/dist/channel-drivers/cron.js +121 -18
- package/dist/channel-drivers/cron.js.map +1 -1
- package/dist/channel-drivers/native-notify.d.ts +3 -0
- package/dist/channel-drivers/native-notify.d.ts.map +1 -1
- package/dist/channel-drivers/native-notify.js +2 -1
- package/dist/channel-drivers/native-notify.js.map +1 -1
- package/dist/channel-drivers/slack.d.ts.map +1 -1
- package/dist/channel-drivers/slack.js +41 -4
- package/dist/channel-drivers/slack.js.map +1 -1
- package/dist/channel-drivers/telegram.d.ts.map +1 -1
- package/dist/channel-drivers/telegram.js +46 -3
- package/dist/channel-drivers/telegram.js.map +1 -1
- package/dist/channel-drivers/tui.d.ts +13 -2
- package/dist/channel-drivers/tui.d.ts.map +1 -1
- package/dist/channel-drivers/tui.js +112 -3
- package/dist/channel-drivers/tui.js.map +1 -1
- package/dist/channels.d.ts +1 -1
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +4 -2
- package/dist/channels.js.map +1 -1
- package/dist/cli-args.d.ts +15 -1
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +82 -12
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-background-command.d.ts +9 -2
- package/dist/cli-background-command.d.ts.map +1 -1
- package/dist/cli-background-command.js +174 -66
- package/dist/cli-background-command.js.map +1 -1
- package/dist/cli-commands.d.ts.map +1 -1
- package/dist/cli-commands.js +50 -12
- package/dist/cli-commands.js.map +1 -1
- package/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +21 -1
- package/dist/cli-help.js.map +1 -1
- package/dist/config-reference.d.ts.map +1 -1
- package/dist/config-reference.js +99 -2
- package/dist/config-reference.js.map +1 -1
- package/dist/configured-agent.d.ts +44 -3
- package/dist/configured-agent.d.ts.map +1 -1
- package/dist/configured-agent.js +805 -156
- package/dist/configured-agent.js.map +1 -1
- package/dist/conversation-state-roots.d.ts +59 -0
- package/dist/conversation-state-roots.d.ts.map +1 -0
- package/dist/conversation-state-roots.js +248 -0
- package/dist/conversation-state-roots.js.map +1 -0
- package/dist/cron-control-store.d.ts +91 -0
- package/dist/cron-control-store.d.ts.map +1 -0
- package/dist/cron-control-store.js +1251 -0
- package/dist/cron-control-store.js.map +1 -0
- package/dist/cron-operator-service.d.ts +54 -0
- package/dist/cron-operator-service.d.ts.map +1 -0
- package/dist/cron-operator-service.js +352 -0
- package/dist/cron-operator-service.js.map +1 -0
- package/dist/doctor-session-history.d.ts +9 -0
- package/dist/doctor-session-history.d.ts.map +1 -0
- package/dist/doctor-session-history.js +313 -0
- package/dist/doctor-session-history.js.map +1 -0
- package/dist/doctor.d.ts +2 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +320 -9
- package/dist/doctor.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/interaction-bridge.d.ts +1 -0
- package/dist/interaction-bridge.d.ts.map +1 -1
- package/dist/interaction-bridge.js +54 -6
- package/dist/interaction-bridge.js.map +1 -1
- package/dist/jobs-command.d.ts +17 -0
- package/dist/jobs-command.d.ts.map +1 -0
- package/dist/jobs-command.js +207 -0
- package/dist/jobs-command.js.map +1 -0
- package/dist/launchd-lifecycle-lock.d.ts +36 -0
- package/dist/launchd-lifecycle-lock.d.ts.map +1 -0
- package/dist/launchd-lifecycle-lock.js +124 -0
- package/dist/launchd-lifecycle-lock.js.map +1 -0
- package/dist/launchd-log-monitor-status.d.ts +7 -0
- package/dist/launchd-log-monitor-status.d.ts.map +1 -0
- package/dist/launchd-log-monitor-status.js +224 -0
- package/dist/launchd-log-monitor-status.js.map +1 -0
- package/dist/launchd-logs.d.ts +9 -1
- package/dist/launchd-logs.d.ts.map +1 -1
- package/dist/launchd-logs.js +69 -16
- package/dist/launchd-logs.js.map +1 -1
- package/dist/launchd-maintenance-command.d.ts +10 -0
- package/dist/launchd-maintenance-command.d.ts.map +1 -0
- package/dist/launchd-maintenance-command.js +2 -0
- package/dist/launchd-maintenance-command.js.map +1 -0
- package/dist/launchd-maintenance-entry.d.ts +30 -0
- package/dist/launchd-maintenance-entry.d.ts.map +1 -0
- package/dist/launchd-maintenance-entry.js +206 -0
- package/dist/launchd-maintenance-entry.js.map +1 -0
- package/dist/launchd-maintenance-gate.d.ts +28 -0
- package/dist/launchd-maintenance-gate.d.ts.map +1 -0
- package/dist/launchd-maintenance-gate.js +80 -0
- package/dist/launchd-maintenance-gate.js.map +1 -0
- package/dist/launchd-private-files.d.ts +3 -0
- package/dist/launchd-private-files.d.ts.map +1 -0
- package/dist/launchd-private-files.js +58 -0
- package/dist/launchd-private-files.js.map +1 -0
- package/dist/launchd.d.ts +56 -2
- package/dist/launchd.d.ts.map +1 -1
- package/dist/launchd.js +210 -5
- package/dist/launchd.js.map +1 -1
- package/dist/local-configuration.d.ts.map +1 -1
- package/dist/local-configuration.js +33 -7
- package/dist/local-configuration.js.map +1 -1
- package/dist/managed-launchd-maintenance-environment.d.ts +3 -0
- package/dist/managed-launchd-maintenance-environment.d.ts.map +1 -0
- package/dist/managed-launchd-maintenance-environment.js +12 -0
- package/dist/managed-launchd-maintenance-environment.js.map +1 -0
- package/dist/managed-runtime-launch-proof.d.ts +11 -0
- package/dist/managed-runtime-launch-proof.d.ts.map +1 -0
- package/dist/managed-runtime-launch-proof.js +59 -0
- package/dist/managed-runtime-launch-proof.js.map +1 -0
- package/dist/managed-runtime-maintenance-entry.d.ts +10 -0
- package/dist/managed-runtime-maintenance-entry.d.ts.map +1 -0
- package/dist/managed-runtime-maintenance-entry.js +244 -0
- package/dist/managed-runtime-maintenance-entry.js.map +1 -0
- package/dist/managed-web-logs.d.ts +29 -11
- package/dist/managed-web-logs.d.ts.map +1 -1
- package/dist/managed-web-logs.js +244 -121
- package/dist/managed-web-logs.js.map +1 -1
- package/dist/managed-web-maintenance-environment.d.ts +6 -0
- package/dist/managed-web-maintenance-environment.d.ts.map +1 -0
- package/dist/managed-web-maintenance-environment.js +19 -0
- package/dist/managed-web-maintenance-environment.js.map +1 -0
- package/dist/mcp-apps.d.ts +37 -0
- package/dist/mcp-apps.d.ts.map +1 -0
- package/dist/mcp-apps.js +1753 -0
- package/dist/mcp-apps.js.map +1 -0
- package/dist/memory-command.d.ts +12 -0
- package/dist/memory-command.d.ts.map +1 -1
- package/dist/memory-command.js +510 -1
- package/dist/memory-command.js.map +1 -1
- package/dist/modules/known-tools.d.ts +1 -1
- package/dist/modules/known-tools.d.ts.map +1 -1
- package/dist/modules/known-tools.js +2 -0
- package/dist/modules/known-tools.js.map +1 -1
- package/dist/posted-reply-history.d.ts.map +1 -1
- package/dist/posted-reply-history.js +12 -0
- package/dist/posted-reply-history.js.map +1 -1
- package/dist/proactive-notify.d.ts +4 -1
- package/dist/proactive-notify.d.ts.map +1 -1
- package/dist/proactive-notify.js +43 -5
- package/dist/proactive-notify.js.map +1 -1
- package/dist/process-jobs-config.d.ts +82 -0
- package/dist/process-jobs-config.d.ts.map +1 -0
- package/dist/process-jobs-config.js +423 -0
- package/dist/process-jobs-config.js.map +1 -0
- package/dist/process-jobs-context.d.ts +24 -0
- package/dist/process-jobs-context.d.ts.map +1 -0
- package/dist/process-jobs-context.js +135 -0
- package/dist/process-jobs-context.js.map +1 -0
- package/dist/process-jobs-root-registry.d.ts +115 -0
- package/dist/process-jobs-root-registry.d.ts.map +1 -0
- package/dist/process-jobs-root-registry.js +978 -0
- package/dist/process-jobs-root-registry.js.map +1 -0
- package/dist/process-jobs-runtime.d.ts +35 -0
- package/dist/process-jobs-runtime.d.ts.map +1 -0
- package/dist/process-jobs-runtime.js +177 -0
- package/dist/process-jobs-runtime.js.map +1 -0
- package/dist/process-jobs-service.d.ts +70 -0
- package/dist/process-jobs-service.d.ts.map +1 -0
- package/dist/process-jobs-service.js +1989 -0
- package/dist/process-jobs-service.js.map +1 -0
- package/dist/process-jobs-store.d.ts +151 -0
- package/dist/process-jobs-store.d.ts.map +1 -0
- package/dist/process-jobs-store.js +1290 -0
- package/dist/process-jobs-store.js.map +1 -0
- package/dist/reply-artifacts.d.ts +65 -0
- package/dist/reply-artifacts.d.ts.map +1 -0
- package/dist/reply-artifacts.js +1147 -0
- package/dist/reply-artifacts.js.map +1 -0
- package/dist/reply-part-budget.d.ts +16 -0
- package/dist/reply-part-budget.d.ts.map +1 -0
- package/dist/reply-part-budget.js +57 -0
- package/dist/reply-part-budget.js.map +1 -0
- package/dist/request-model-override.d.ts +19 -0
- package/dist/request-model-override.d.ts.map +1 -1
- package/dist/request-model-override.js +54 -1
- package/dist/request-model-override.js.map +1 -1
- package/dist/request-scoped-mcp.d.ts +31 -0
- package/dist/request-scoped-mcp.d.ts.map +1 -0
- package/dist/request-scoped-mcp.js +197 -0
- package/dist/request-scoped-mcp.js.map +1 -0
- package/dist/run-history.d.ts.map +1 -1
- package/dist/run-history.js +50 -254
- package/dist/run-history.js.map +1 -1
- package/dist/runtime-option-extensions.d.ts +21 -0
- package/dist/runtime-option-extensions.d.ts.map +1 -1
- package/dist/runtime-option-extensions.js +53 -0
- package/dist/runtime-option-extensions.js.map +1 -1
- package/dist/secure-file-replace.d.ts +3 -0
- package/dist/secure-file-replace.d.ts.map +1 -1
- package/dist/secure-file-replace.js +31 -7
- package/dist/secure-file-replace.js.map +1 -1
- package/dist/session-history.d.ts +146 -0
- package/dist/session-history.d.ts.map +1 -0
- package/dist/session-history.js +347 -0
- package/dist/session-history.js.map +1 -0
- package/dist/sessions.d.ts +45 -2
- package/dist/sessions.d.ts.map +1 -1
- package/dist/sessions.js +849 -30
- package/dist/sessions.js.map +1 -1
- package/dist/web-command.d.ts +12 -11
- package/dist/web-command.d.ts.map +1 -1
- package/dist/web-command.js +554 -80
- package/dist/web-command.js.map +1 -1
- package/dist/web-log-maintenance-command.d.ts +7 -0
- package/dist/web-log-maintenance-command.d.ts.map +1 -0
- package/dist/web-log-maintenance-command.js +21 -0
- package/dist/web-log-maintenance-command.js.map +1 -0
- package/dist/web-log-maintenance-status.d.ts +26 -0
- package/dist/web-log-maintenance-status.d.ts.map +1 -0
- package/dist/web-log-maintenance-status.js +171 -0
- package/dist/web-log-maintenance-status.js.map +1 -0
- package/dist/web-log-maintenance.d.ts +32 -0
- package/dist/web-log-maintenance.d.ts.map +1 -0
- package/dist/web-log-maintenance.js +163 -0
- package/dist/web-log-maintenance.js.map +1 -0
- package/dist/web-maintenance-paths.d.ts +12 -0
- package/dist/web-maintenance-paths.d.ts.map +1 -0
- package/dist/web-maintenance-paths.js +24 -0
- package/dist/web-maintenance-paths.js.map +1 -0
- package/dist/wizard/prompts.d.ts.map +1 -1
- package/dist/wizard/prompts.js +1 -0
- package/dist/wizard/prompts.js.map +1 -1
- package/dist/wizard/run.js +1 -1
- package/dist/wizard/run.js.map +1 -1
- package/package.json +15 -15
- package/schema/mono-agent.config.schema.json +102 -1
- package/skills/mono-agent-composer/references/config-blueprint.md +26 -2
- package/skills/mono-agent-composer/references/discovery-questions.md +2 -2
- package/skills/mono-agent-composer/references/feature-coverage.md +6 -4
- package/skills/mono-agent-composer/references/package-map.md +19 -3
- package/skills/mono-agent-composer/references/playbooks.md +3 -3
- package/skills/mono-agent-composer/references/validation.md +4 -2
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { basename, isAbsolute, resolve } from "node:path";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { deriveLaunchdLabel, INTERNAL_LAUNCHD_LOG_MAINTENANCE_COMMAND, INTERNAL_WEB_LOG_MAINTENANCE_COMMAND, launchdMaintenanceDispersionSeconds, launchdWebMaintenanceInfo, launchdPathsFor, MANAGED_LAUNCHD_LOG_MAINTENANCE_ENV, MANAGED_WEB_LOG_MAINTENANCE_ENV, webMaintenanceDispersionSeconds, } from "./launchd.js";
|
|
6
|
+
import { MANAGED_LAUNCHD_MAINTENANCE_ENTRY_FILE } from "./launchd-maintenance-command.js";
|
|
7
|
+
import { defaultLaunchdMaintenanceGateDependencies, withLaunchdMaintenanceControllerLock, } from "./launchd-maintenance-gate.js";
|
|
8
|
+
import { sanitizeManagedLaunchdLogMaintenanceEnvironment } from "./managed-launchd-maintenance-environment.js";
|
|
9
|
+
import { sanitizeManagedWebLogMaintenanceEnvironment } from "./managed-web-maintenance-environment.js";
|
|
10
|
+
import { verifyManagedRuntimeMaintenanceEntrypoint, } from "./managed-runtime-maintenance-entry.js";
|
|
11
|
+
import { parseWebLogMaintenanceArguments } from "./web-log-maintenance-command.js";
|
|
12
|
+
export function defaultLaunchdMaintenanceEntryDependencies() {
|
|
13
|
+
return {
|
|
14
|
+
gate: defaultLaunchdMaintenanceGateDependencies(),
|
|
15
|
+
pathsForLabel: (label) => launchdPathsFor(label),
|
|
16
|
+
verifyEntrypoint: verifyManagedRuntimeMaintenanceEntrypoint,
|
|
17
|
+
loadHeavy: async () => await import("./cli-background-command.js"),
|
|
18
|
+
loadWebHeavy: async () => await import("./web-log-maintenance.js"),
|
|
19
|
+
inspectWebHelper: launchdWebMaintenanceInfo,
|
|
20
|
+
currentEntrypointPath: fileURLToPath(import.meta.url),
|
|
21
|
+
platform: process.platform,
|
|
22
|
+
sleep: wait,
|
|
23
|
+
stderr: (text) => void process.stderr.write(text),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/** Dedicated entry: deterministic dispersion and the per-agent lease precede heavy imports. */
|
|
27
|
+
export async function runLaunchdMaintenanceEntry(argv, env = process.env, deps = defaultLaunchdMaintenanceEntryDependencies()) {
|
|
28
|
+
const command = argv[0];
|
|
29
|
+
const agentMarked = env[MANAGED_LAUNCHD_LOG_MAINTENANCE_ENV] === "1";
|
|
30
|
+
const webMarked = env[MANAGED_WEB_LOG_MAINTENANCE_ENV] === "1";
|
|
31
|
+
if (command === INTERNAL_WEB_LOG_MAINTENANCE_COMMAND) {
|
|
32
|
+
if (!webMarked || agentMarked) {
|
|
33
|
+
safeStderr(deps, "The web log maintenance command is reserved for its exact managed LaunchAgent marker.");
|
|
34
|
+
return 2;
|
|
35
|
+
}
|
|
36
|
+
let webArgs;
|
|
37
|
+
try {
|
|
38
|
+
webArgs = parseWebLogMaintenanceArguments(argv);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
safeStderr(deps, safeError(error));
|
|
42
|
+
return 2;
|
|
43
|
+
}
|
|
44
|
+
sanitizeManagedWebLogMaintenanceEnvironment(env);
|
|
45
|
+
if (deps.platform !== "darwin") {
|
|
46
|
+
safeStderr(deps, "Scheduled web log maintenance is only available on macOS launchd.");
|
|
47
|
+
return 1;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
// Mirror the agent helper's pre-import, pre-lock RunAtLoad dispersion.
|
|
51
|
+
await deps.sleep(webMaintenanceDispersionSeconds() * 1_000);
|
|
52
|
+
await deps.verifyEntrypoint({
|
|
53
|
+
currentEntrypointPath: deps.currentEntrypointPath,
|
|
54
|
+
launchProof: webArgs.expectedManagedRuntimeLaunch,
|
|
55
|
+
});
|
|
56
|
+
const helperPid = deps.gate.currentPid();
|
|
57
|
+
const helper = await (deps.inspectWebHelper ?? launchdWebMaintenanceInfo)(deps.gate.runner, deps.gate.getuid());
|
|
58
|
+
const definition = helper.definition;
|
|
59
|
+
if (!helper.loaded
|
|
60
|
+
|| helper.pid !== helperPid
|
|
61
|
+
|| !deps.gate.isAlive(helperPid)
|
|
62
|
+
|| definition === undefined
|
|
63
|
+
|| definition.nodePath !== process.execPath
|
|
64
|
+
|| definition.cliPath !== deps.currentEntrypointPath
|
|
65
|
+
|| definition.expectedManagedRuntimeLaunch !== webArgs.expectedManagedRuntimeLaunch
|
|
66
|
+
|| definition.expectedWebPlistIdentity !== webArgs.expectedWebPlistIdentity) {
|
|
67
|
+
throw new Error("launchd does not own this exact web-maintenance helper definition and pid");
|
|
68
|
+
}
|
|
69
|
+
const heavy = await (deps.loadWebHeavy ?? (async () => await import("./web-log-maintenance.js")))();
|
|
70
|
+
return await heavy.runWebLogMaintenanceCommand(webArgs);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
safeStderr(deps, `Scheduled web maintenance could not establish its dispersed attested boundary: ${safeError(error)}`);
|
|
74
|
+
return 1;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (command !== INTERNAL_LAUNCHD_LOG_MAINTENANCE_COMMAND) {
|
|
78
|
+
safeStderr(deps, agentMarked || webMarked
|
|
79
|
+
? "The managed log-maintenance marker cannot authorize another command."
|
|
80
|
+
: "The launchd maintenance entry only accepts its reserved managed command.");
|
|
81
|
+
return 2;
|
|
82
|
+
}
|
|
83
|
+
if (!agentMarked || webMarked) {
|
|
84
|
+
safeStderr(deps, "The launchd log maintenance command is reserved for its managed LaunchAgent.");
|
|
85
|
+
return 2;
|
|
86
|
+
}
|
|
87
|
+
sanitizeManagedLaunchdLogMaintenanceEnvironment(env);
|
|
88
|
+
if (deps.platform !== "darwin") {
|
|
89
|
+
safeStderr(deps, "Scheduled log maintenance is only available on macOS launchd.");
|
|
90
|
+
return 1;
|
|
91
|
+
}
|
|
92
|
+
let args;
|
|
93
|
+
try {
|
|
94
|
+
args = parseManagedArguments(argv);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
safeStderr(deps, safeError(error));
|
|
98
|
+
return 2;
|
|
99
|
+
}
|
|
100
|
+
const configPath = resolve(args.configPath);
|
|
101
|
+
const label = deriveLaunchdLabel(configPath);
|
|
102
|
+
const target = { label, paths: deps.pathsForLabel(label) };
|
|
103
|
+
try {
|
|
104
|
+
// RunAtLoad starts every helper together. Preserve N/N recovery coverage
|
|
105
|
+
// while spreading the heavy boundary deterministically without new lock
|
|
106
|
+
// authority or stale-owner state.
|
|
107
|
+
await deps.sleep(launchdMaintenanceDispersionSeconds(label) * 1_000);
|
|
108
|
+
return await withLaunchdMaintenanceControllerLock(target, deps.gate, async (ownership) => {
|
|
109
|
+
await deps.verifyEntrypoint({
|
|
110
|
+
currentEntrypointPath: deps.currentEntrypointPath,
|
|
111
|
+
launchProof: args.expectedManagedRuntimeLaunch,
|
|
112
|
+
});
|
|
113
|
+
const heavy = await deps.loadHeavy();
|
|
114
|
+
return await heavy.runLaunchdLogMaintenanceCommandWithLifecycleLease(args, ownership);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
safeStderr(deps, `Scheduled recovery could not establish its dispersed attested ownership boundary: ${safeError(error)}`);
|
|
119
|
+
return 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function wait(milliseconds) {
|
|
123
|
+
return new Promise((resolvePromise) => setTimeout(resolvePromise, milliseconds));
|
|
124
|
+
}
|
|
125
|
+
function parseManagedArguments(argv) {
|
|
126
|
+
const required = [
|
|
127
|
+
"--config",
|
|
128
|
+
"--controller-cli",
|
|
129
|
+
"--agent-cwd",
|
|
130
|
+
"--agent-path",
|
|
131
|
+
"--expected-managed-runtime-launch",
|
|
132
|
+
];
|
|
133
|
+
let index = 1;
|
|
134
|
+
const values = [];
|
|
135
|
+
for (const flag of required) {
|
|
136
|
+
if (argv[index++] !== flag)
|
|
137
|
+
throw new Error(`Managed launchd recovery requires ${flag}.`);
|
|
138
|
+
const value = argv[index++];
|
|
139
|
+
if (value === undefined || value.length === 0 || hasControlCharacter(value)) {
|
|
140
|
+
throw new Error(`Managed launchd recovery received an invalid ${flag} value.`);
|
|
141
|
+
}
|
|
142
|
+
values.push(value);
|
|
143
|
+
}
|
|
144
|
+
let envFile;
|
|
145
|
+
if (argv[index] === "--env-file") {
|
|
146
|
+
envFile = argv[index + 1];
|
|
147
|
+
index += 2;
|
|
148
|
+
if (envFile === undefined || !isAbsolute(envFile) || hasControlCharacter(envFile)) {
|
|
149
|
+
throw new Error("Managed launchd recovery received an invalid --env-file value.");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (index !== argv.length)
|
|
153
|
+
throw new Error("Managed launchd recovery received unexpected arguments.");
|
|
154
|
+
const [configPath, controllerCliPath, agentCwd, agentPath, expectedManagedRuntimeLaunch] = values;
|
|
155
|
+
if (![configPath, controllerCliPath, agentCwd].every((path) => isAbsolute(path))) {
|
|
156
|
+
throw new Error("Managed launchd recovery requires absolute config, controller CLI, and agent cwd paths.");
|
|
157
|
+
}
|
|
158
|
+
if (!/^[0-9A-Za-z_-]+$/u.test(expectedManagedRuntimeLaunch)) {
|
|
159
|
+
throw new Error("Managed launchd recovery received a malformed runtime launch proof.");
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
configPath,
|
|
163
|
+
controllerCliPath,
|
|
164
|
+
agentCwd,
|
|
165
|
+
agentPath,
|
|
166
|
+
expectedManagedRuntimeLaunch,
|
|
167
|
+
...(envFile === undefined ? {} : { envFile }),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function safeStderr(deps, message) {
|
|
171
|
+
const line = `[error] ${message}\n`;
|
|
172
|
+
try {
|
|
173
|
+
const reported = deps.stderr(line);
|
|
174
|
+
if (reported !== undefined)
|
|
175
|
+
void Promise.resolve(reported).catch(() => undefined);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Reporter failure never becomes an unhandled rejection or widens authority.
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function safeError(error) {
|
|
182
|
+
return (error instanceof Error ? error.message : String(error))
|
|
183
|
+
.replace(/[\u0000-\u001f\u007f]+/gu, " ")
|
|
184
|
+
.replace(/\b(token|secret|password|api[-_]?key|authorization)\s*[=:]\s*\S+/giu, "$1=<redacted>")
|
|
185
|
+
.replace(/\bBearer\s+\S+/giu, "Bearer <redacted>")
|
|
186
|
+
.replace(/(?:\/[A-Za-z0-9._~!$&'()+,;=:@%-]+){2,}/gu, "<path>")
|
|
187
|
+
.replace(/\s+/gu, " ")
|
|
188
|
+
.trim()
|
|
189
|
+
.slice(0, 512);
|
|
190
|
+
}
|
|
191
|
+
function hasControlCharacter(value) {
|
|
192
|
+
return /[\u0000-\u001f\u007f]/u.test(value);
|
|
193
|
+
}
|
|
194
|
+
const entryName = process.argv[1] === undefined ? undefined : basename(process.argv[1]);
|
|
195
|
+
if (entryName === MANAGED_LAUNCHD_MAINTENANCE_ENTRY_FILE) {
|
|
196
|
+
runLaunchdMaintenanceEntry(process.argv.slice(2))
|
|
197
|
+
.then((code) => {
|
|
198
|
+
if (code !== 0)
|
|
199
|
+
process.exitCode = code;
|
|
200
|
+
})
|
|
201
|
+
.catch((error) => {
|
|
202
|
+
process.stderr.write(`[error] Launchd maintenance failed: ${safeError(error)}\n`);
|
|
203
|
+
process.exitCode = 1;
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=launchd-maintenance-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchd-maintenance-entry.js","sourceRoot":"","sources":["../src/launchd-maintenance-entry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { LaunchctlRunner } from "./launchd.js";
|
|
2
|
+
import type { BackgroundLifecycleTarget, BackgroundLockAcquireOptions } from "./launchd-lifecycle-lock.js";
|
|
3
|
+
declare const OWNED_MAINTENANCE_LIFECYCLE: unique symbol;
|
|
4
|
+
export interface LaunchdMaintenanceLifecycleLease {
|
|
5
|
+
readonly label: string;
|
|
6
|
+
readonly pid: number;
|
|
7
|
+
readonly [OWNED_MAINTENANCE_LIFECYCLE]: true;
|
|
8
|
+
}
|
|
9
|
+
export interface LaunchdMaintenanceGateDependencies {
|
|
10
|
+
readonly runner: LaunchctlRunner;
|
|
11
|
+
readonly getuid: () => number;
|
|
12
|
+
readonly currentPid: () => number;
|
|
13
|
+
readonly isAlive: (pid: number) => boolean;
|
|
14
|
+
readonly acquireLifecycleLock: (target: BackgroundLifecycleTarget, options?: BackgroundLockAcquireOptions) => Promise<(() => Promise<void>) | undefined>;
|
|
15
|
+
readonly stderr: (text: string) => void | Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare function defaultLaunchdMaintenanceGateDependencies(): LaunchdMaintenanceGateDependencies;
|
|
18
|
+
/**
|
|
19
|
+
* Authenticate the exact launchd-owned helper, then own its per-agent lifecycle
|
|
20
|
+
* lock nonblocking before invoking any caller-supplied inspection or import.
|
|
21
|
+
* The account-wide log lock is deliberately acquired later, only around the
|
|
22
|
+
* shared-chain mutation that actually needs it.
|
|
23
|
+
*/
|
|
24
|
+
export declare function withLaunchdMaintenanceControllerLock(target: BackgroundLifecycleTarget, deps: LaunchdMaintenanceGateDependencies, operation: (ownership: LaunchdMaintenanceLifecycleLease) => Promise<number>): Promise<number>;
|
|
25
|
+
/** Reject heavy reconciliation calls that did not cross this authenticated gate. */
|
|
26
|
+
export declare function assertLaunchdMaintenanceLifecycleLease(ownership: LaunchdMaintenanceLifecycleLease, target: BackgroundLifecycleTarget): void;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=launchd-maintenance-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchd-maintenance-gate.d.ts","sourceRoot":"","sources":["../src/launchd-maintenance-gate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,OAAO,KAAK,EACV,yBAAyB,EACzB,4BAA4B,EAC7B,MAAM,6BAA6B,CAAC;AAIrC,QAAA,MAAM,2BAA2B,eAAgD,CAAC;AAElF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,CAAC,2BAA2B,CAAC,EAAE,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,MAAM,EAAE,yBAAyB,EACjC,OAAO,CAAC,EAAE,4BAA4B,KACnC,OAAO,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,wBAAgB,yCAAyC,IAAI,kCAAkC,CAS9F;AAED;;;;;GAKG;AACH,wBAAsB,oCAAoC,CACxD,MAAM,EAAE,yBAAyB,EACjC,IAAI,EAAE,kCAAkC,EACxC,SAAS,EAAE,CAAC,SAAS,EAAE,gCAAgC,KAAK,OAAO,CAAC,MAAM,CAAC,GAC1E,OAAO,CAAC,MAAM,CAAC,CAgCjB;AAED,oFAAoF;AACpF,wBAAgB,sCAAsC,CACpD,SAAS,EAAE,gCAAgC,EAC3C,MAAM,EAAE,yBAAyB,GAChC,IAAI,CAMN"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { deriveLaunchdMaintenanceLabel, launchdServiceInfo, makeLaunchctlRunner, } from "./launchd.js";
|
|
3
|
+
import { acquireFilesystemLifecycleLock, } from "./launchd-lifecycle-lock.js";
|
|
4
|
+
import { maintenanceErrorMessage } from "./background-lifecycle-utils.js";
|
|
5
|
+
import * as ui from "./ui.js";
|
|
6
|
+
const OWNED_MAINTENANCE_LIFECYCLE = Symbol("owned-launchd-maintenance-lifecycle");
|
|
7
|
+
export function defaultLaunchdMaintenanceGateDependencies() {
|
|
8
|
+
return {
|
|
9
|
+
runner: makeLaunchctlRunner(),
|
|
10
|
+
getuid: () => process.getuid?.() ?? 0,
|
|
11
|
+
currentPid: () => process.pid,
|
|
12
|
+
isAlive: processIsAlive,
|
|
13
|
+
acquireLifecycleLock: acquireFilesystemLifecycleLock,
|
|
14
|
+
stderr: (text) => void process.stderr.write(text),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Authenticate the exact launchd-owned helper, then own its per-agent lifecycle
|
|
19
|
+
* lock nonblocking before invoking any caller-supplied inspection or import.
|
|
20
|
+
* The account-wide log lock is deliberately acquired later, only around the
|
|
21
|
+
* shared-chain mutation that actually needs it.
|
|
22
|
+
*/
|
|
23
|
+
export async function withLaunchdMaintenanceControllerLock(target, deps, operation) {
|
|
24
|
+
const helperLabel = deriveLaunchdMaintenanceLabel(target.label);
|
|
25
|
+
const helperPid = deps.currentPid();
|
|
26
|
+
const helperService = await launchdServiceInfo(deps.runner, helperLabel, deps.getuid());
|
|
27
|
+
if (!helperService.loaded || helperService.pid !== helperPid || !deps.isAlive(helperPid)) {
|
|
28
|
+
reportFailure(target, deps, "authenticate the launchd-owned recovery controller", new Error(`launchd does not own this helper pid ${helperPid}`));
|
|
29
|
+
return 1;
|
|
30
|
+
}
|
|
31
|
+
const releasePerAgent = await deps.acquireLifecycleLock(target, {
|
|
32
|
+
purpose: "lifecycle",
|
|
33
|
+
waitTimeoutMs: 0,
|
|
34
|
+
});
|
|
35
|
+
if (releasePerAgent === undefined)
|
|
36
|
+
return 0;
|
|
37
|
+
try {
|
|
38
|
+
return await operation({
|
|
39
|
+
label: target.label,
|
|
40
|
+
pid: helperPid,
|
|
41
|
+
[OWNED_MAINTENANCE_LIFECYCLE]: true,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await releasePerAgent().catch((error) => {
|
|
46
|
+
safeStderr(deps, ui.errorLine(`Could not release lifecycle lock for ${target.label}: ${maintenanceErrorMessage(error)}`));
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Reject heavy reconciliation calls that did not cross this authenticated gate. */
|
|
51
|
+
export function assertLaunchdMaintenanceLifecycleLease(ownership, target) {
|
|
52
|
+
if (ownership?.[OWNED_MAINTENANCE_LIFECYCLE] !== true
|
|
53
|
+
|| ownership.label !== target.label
|
|
54
|
+
|| ownership.pid !== process.pid) {
|
|
55
|
+
throw new Error("Launchd maintenance requires the authenticated per-agent lifecycle capability.");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function reportFailure(target, deps, action, error) {
|
|
59
|
+
safeStderr(deps, ui.errorLine(`Scheduled log maintenance could not ${action} for ${target.label}: ${maintenanceErrorMessage(error)}`));
|
|
60
|
+
}
|
|
61
|
+
function safeStderr(deps, text) {
|
|
62
|
+
try {
|
|
63
|
+
const reported = deps.stderr(text);
|
|
64
|
+
if (reported !== undefined)
|
|
65
|
+
void Promise.resolve(reported).catch(() => undefined);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// A reporter cannot change lock ownership, helper lifecycle, or rejection.
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function processIsAlive(pid) {
|
|
72
|
+
try {
|
|
73
|
+
process.kill(pid, 0);
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
return error?.code === "EPERM";
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=launchd-maintenance-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchd-maintenance-gate.js","sourceRoot":"","sources":["../src/launchd-maintenance-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchd-private-files.d.ts","sourceRoot":"","sources":["../src/launchd-private-files.ts"],"names":[],"mappings":"AAKA,gFAAgF;AAChF,wBAAsB,kCAAkC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCpF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { constants as fsConstants } from "node:fs";
|
|
2
|
+
import { lstat, mkdir, open } from "node:fs/promises";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
import process from "node:process";
|
|
5
|
+
/** Secure one account-owned launchd state directory without following links. */
|
|
6
|
+
export async function ensureOwnerPrivateLaunchdDirectory(path) {
|
|
7
|
+
const parent = dirname(path);
|
|
8
|
+
const parentDetails = await lstat(parent);
|
|
9
|
+
assertOwnerDirectory(parentDetails, parent, "LaunchAgent parent");
|
|
10
|
+
try {
|
|
11
|
+
await mkdir(path, { mode: 0o700 });
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (!isErrno(error, "EEXIST"))
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
const parentAfter = await lstat(parent);
|
|
18
|
+
assertOwnerDirectory(parentAfter, parent, "LaunchAgent parent");
|
|
19
|
+
if (!sameFilesystemIdentity(parentDetails, parentAfter)) {
|
|
20
|
+
throw new Error(`LaunchAgent parent ${parent} changed while ${path} was created.`);
|
|
21
|
+
}
|
|
22
|
+
const handle = await open(path, fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW);
|
|
23
|
+
try {
|
|
24
|
+
const before = await handle.stat();
|
|
25
|
+
assertOwnerDirectory(before, path, "LaunchAgent directory");
|
|
26
|
+
await handle.chmod(0o700);
|
|
27
|
+
const secured = await handle.stat();
|
|
28
|
+
if (!sameFilesystemIdentity(before, secured)) {
|
|
29
|
+
throw new Error(`LaunchAgent directory ${path} changed while it was secured.`);
|
|
30
|
+
}
|
|
31
|
+
assertOwnerDirectory(secured, path, "LaunchAgent directory");
|
|
32
|
+
if ((secured.mode & 0o077) !== 0) {
|
|
33
|
+
throw new Error(`LaunchAgent directory ${path} must be owner-only.`);
|
|
34
|
+
}
|
|
35
|
+
const current = await lstat(path);
|
|
36
|
+
if (!sameFilesystemIdentity(secured, current)) {
|
|
37
|
+
throw new Error(`LaunchAgent directory ${path} changed while it was secured.`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await handle.close();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function assertOwnerDirectory(details, path, description) {
|
|
45
|
+
if (!details.isDirectory() || details.isSymbolicLink()) {
|
|
46
|
+
throw new Error(`${description} ${path} must be a real directory.`);
|
|
47
|
+
}
|
|
48
|
+
if (typeof process.getuid === "function" && details.uid !== process.getuid()) {
|
|
49
|
+
throw new Error(`${description} ${path} is not owned by the current user.`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function sameFilesystemIdentity(left, right) {
|
|
53
|
+
return left.dev === right.dev && left.ino === right.ino;
|
|
54
|
+
}
|
|
55
|
+
function isErrno(error, code) {
|
|
56
|
+
return error?.code === code;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=launchd-private-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchd-private-files.js","sourceRoot":"","sources":["../src/launchd-private-files.ts"],"names":[],"mappings":"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"}
|
package/dist/launchd.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { MANAGED_WEB_LOG_MAINTENANCE_ENV } from "./managed-web-maintenance-environment.js";
|
|
1
2
|
/**
|
|
2
3
|
* Thin, side-effect-light helpers around macOS launchd. The `launchctl` runner
|
|
3
4
|
* is injectable so orchestration can be unit tested without touching the real
|
|
@@ -39,7 +40,7 @@ export interface PlistInput {
|
|
|
39
40
|
export interface MaintenancePlistInput {
|
|
40
41
|
readonly label: string;
|
|
41
42
|
readonly nodePath: string;
|
|
42
|
-
/**
|
|
43
|
+
/** Attested lightweight executable in the immutable managed closure. */
|
|
43
44
|
readonly cliPath: string;
|
|
44
45
|
readonly configPath: string;
|
|
45
46
|
readonly cwd: string;
|
|
@@ -47,10 +48,25 @@ export interface MaintenancePlistInput {
|
|
|
47
48
|
readonly controllerCliPath: string;
|
|
48
49
|
readonly agentCwd: string;
|
|
49
50
|
readonly agentPath: string;
|
|
51
|
+
/** Path-free proof covering the managed marker, main CLI, and helper entry. */
|
|
52
|
+
readonly expectedManagedRuntimeLaunch: string;
|
|
50
53
|
readonly envFile?: string;
|
|
51
54
|
/** Deliberately allowlisted, non-secret maintenance environment. */
|
|
52
55
|
readonly environment: Readonly<Record<string, string>>;
|
|
53
|
-
|
|
56
|
+
/** Minute in each hour derived from the canonical main LaunchAgent label. */
|
|
57
|
+
readonly calendarMinute: number;
|
|
58
|
+
}
|
|
59
|
+
export interface WebMaintenancePlistInput {
|
|
60
|
+
readonly label: typeof WEB_MAINTENANCE_LAUNCHD_LABEL;
|
|
61
|
+
readonly nodePath: string;
|
|
62
|
+
/** The same attested lightweight entry used by agent maintenance. */
|
|
63
|
+
readonly cliPath: string;
|
|
64
|
+
readonly cwd: string;
|
|
65
|
+
readonly expectedManagedRuntimeLaunch: string;
|
|
66
|
+
/** Fresh dev:ino:size:sha256 identity of the paired main web plist. */
|
|
67
|
+
readonly expectedWebPlistIdentity: string;
|
|
68
|
+
readonly environment: Readonly<Record<string, string>>;
|
|
69
|
+
readonly calendarMinute: number;
|
|
54
70
|
}
|
|
55
71
|
export interface WebPlistInput {
|
|
56
72
|
readonly label: string;
|
|
@@ -86,8 +102,23 @@ export interface LaunchdManagedWorkerInfo extends LaunchdServiceInfo {
|
|
|
86
102
|
/** Present only when launchctl exposes the exact current producer shape. */
|
|
87
103
|
readonly definition?: LaunchdManagedWorkerDefinition;
|
|
88
104
|
}
|
|
105
|
+
export interface LaunchdWebMaintenanceDefinition {
|
|
106
|
+
readonly plistPath: string;
|
|
107
|
+
readonly nodePath: string;
|
|
108
|
+
readonly cliPath: string;
|
|
109
|
+
readonly cwd: string;
|
|
110
|
+
readonly expectedManagedRuntimeLaunch: string;
|
|
111
|
+
readonly expectedWebPlistIdentity: string;
|
|
112
|
+
}
|
|
113
|
+
export interface LaunchdWebMaintenanceInfo extends LaunchdServiceInfo {
|
|
114
|
+
/** Present only when launchctl exposes the exact cached helper definition. */
|
|
115
|
+
readonly definition?: LaunchdWebMaintenanceDefinition;
|
|
116
|
+
}
|
|
89
117
|
export declare const INTERNAL_LAUNCHD_LOG_MAINTENANCE_COMMAND = "__launchd-log-maintenance";
|
|
90
118
|
export declare const MANAGED_LAUNCHD_LOG_MAINTENANCE_ENV = "MONO_AGENT_MANAGED_LOG_MAINTENANCE";
|
|
119
|
+
export declare const WEB_LAUNCHD_LABEL = "com.mono-agent-web";
|
|
120
|
+
export declare const WEB_MAINTENANCE_LAUNCHD_LABEL = "com.mono-agent-web-maintenance";
|
|
121
|
+
export declare const INTERNAL_WEB_LOG_MAINTENANCE_COMMAND = "__web-log-maintenance";
|
|
91
122
|
/**
|
|
92
123
|
* A stable, launchd-legal label derived from the resolved config path. The
|
|
93
124
|
* folder name keeps it human-readable; an 8-char hash of the absolute config
|
|
@@ -102,7 +133,18 @@ export declare function launchdPathsFor(label: string, home?: string): LaunchdPa
|
|
|
102
133
|
* not mistake a scheduled one-shot helper for an extra agent.
|
|
103
134
|
*/
|
|
104
135
|
export declare function deriveLaunchdMaintenanceLabel(mainLabel: string): string;
|
|
136
|
+
/** Deterministically stagger recurring helpers by the canonical main label. */
|
|
137
|
+
export declare function launchdMaintenanceCalendarMinute(canonicalMainLabel: string): number;
|
|
138
|
+
export declare const LAUNCHD_MAINTENANCE_DISPERSION_SECONDS = 120;
|
|
139
|
+
/** Spread login helpers before PID authentication, locking, or heavy import. */
|
|
140
|
+
export declare function launchdMaintenanceDispersionSeconds(canonicalMainLabel: string): number;
|
|
141
|
+
/** Web has a fixed label and therefore a distinct exact-label schedule validator. */
|
|
142
|
+
export declare function webMaintenanceCalendarMinute(label?: string): number;
|
|
143
|
+
/** Mirror agent RunAtLoad dispersion without admitting the web label to agent grammar. */
|
|
144
|
+
export declare function webMaintenanceDispersionSeconds(label?: string): number;
|
|
105
145
|
export declare function launchdMaintenancePathsFor(mainLabel: string, home?: string): LaunchdMaintenancePaths;
|
|
146
|
+
/** Canonical lightweight helper next to the attested managed-runtime CLI. */
|
|
147
|
+
export declare function launchdMaintenanceEntrypointPathForCli(cliPath: string): string;
|
|
106
148
|
export declare function escapeXml(value: string): string;
|
|
107
149
|
/**
|
|
108
150
|
* The plist runs the blocking worker through `/usr/bin/env -i`. Clearing the
|
|
@@ -113,14 +155,20 @@ export declare function escapeXml(value: string): string;
|
|
|
113
155
|
export declare function buildPlistXml(input: PlistInput): string;
|
|
114
156
|
/** Scheduled one-shot recovery controller. It owns no logs and never KeepAlives. */
|
|
115
157
|
export declare function buildLaunchdMaintenancePlistXml(input: MaintenancePlistInput): string;
|
|
158
|
+
/** Scheduled one-shot web log controller. It never owns a KeepAlive or log stream. */
|
|
159
|
+
export declare function buildWebMaintenancePlistXml(input: WebMaintenancePlistInput): string;
|
|
116
160
|
/** Always-on web-console LaunchAgent. It runs the public blocking `web run` worker. */
|
|
117
161
|
export declare function buildWebPlistXml(input: WebPlistInput): string;
|
|
118
162
|
/** Exact argv persisted by the managed LaunchAgent producer. */
|
|
119
163
|
export declare function buildLaunchdProgramArguments(input: PlistInput): readonly string[];
|
|
120
164
|
/** Exact argv persisted by the private scheduled maintenance LaunchAgent. */
|
|
121
165
|
export declare function buildLaunchdMaintenanceProgramArguments(input: MaintenancePlistInput): readonly string[];
|
|
166
|
+
/** Exact argv persisted by the private scheduled web-maintenance LaunchAgent. */
|
|
167
|
+
export declare function buildWebMaintenanceProgramArguments(input: WebMaintenancePlistInput): readonly string[];
|
|
122
168
|
/** Exact argv persisted for the always-on web console. */
|
|
123
169
|
export declare function buildWebLaunchdProgramArguments(input: WebPlistInput): readonly string[];
|
|
170
|
+
export declare function buildEnvironmentArguments(environment: Readonly<Record<string, string>>): string[];
|
|
171
|
+
export declare function assertWebPlistIdentity(value: string): void;
|
|
124
172
|
/**
|
|
125
173
|
* PATH for the background worker: the launching shell's PATH (so the user's
|
|
126
174
|
* toolchain is reachable) plus Homebrew/usr-local in case launchd started from
|
|
@@ -141,12 +189,18 @@ export declare function launchdServiceInfo(runner: LaunchctlRunner, label: strin
|
|
|
141
189
|
* distinguish during upgrades.
|
|
142
190
|
*/
|
|
143
191
|
export declare function launchdManagedWorkerInfo(runner: LaunchctlRunner, label: string, uid: number): Promise<LaunchdManagedWorkerInfo>;
|
|
192
|
+
/** Read the cached definition, not merely the mutable helper plist on disk. */
|
|
193
|
+
export declare function launchdWebMaintenanceInfo(runner: LaunchctlRunner, uid: number): Promise<LaunchdWebMaintenanceInfo>;
|
|
194
|
+
/** Parse only the exact cached web-helper definition emitted by this producer. */
|
|
195
|
+
export declare function parseLaunchdWebMaintenanceDefinition(output: string): LaunchdWebMaintenanceDefinition | undefined;
|
|
144
196
|
/** Parse only the exact managed-worker launchctl-print shape emitted here. */
|
|
145
197
|
export declare function parseLaunchdManagedWorkerDefinition(output: string): LaunchdManagedWorkerDefinition | undefined;
|
|
146
198
|
/** Parse only launchd's top-level `pid = N` field; never infer a pid from noise. */
|
|
147
199
|
export declare function parseLaunchdServicePid(output: string): number | undefined;
|
|
148
200
|
/** Bootstrap (load + RunAtLoad-launch) the plist. Caller tolerates "already bootstrapped". */
|
|
149
201
|
export declare function bootstrap(runner: LaunchctlRunner, plistPath: string, uid: number): Promise<LaunchctlResult>;
|
|
202
|
+
/** Ask launchd to start a loaded one-shot service without replacing a running instance. */
|
|
203
|
+
export declare function kickstart(runner: LaunchctlRunner, label: string, uid: number): Promise<LaunchctlResult>;
|
|
150
204
|
/**
|
|
151
205
|
* Remove the service from the domain. Sends SIGTERM and — unlike a plain kill —
|
|
152
206
|
* prevents KeepAlive from relaunching it. Caller tolerates "not loaded".
|
package/dist/launchd.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"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"}
|