@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
|
@@ -1,183 +1,454 @@
|
|
|
1
|
-
import { bootstrap, launchdServiceInfo } from "./launchd.js";
|
|
1
|
+
import { bootstrap, deriveLaunchdMaintenanceLabel, kickstart, launchdServiceInfo, } from "./launchd.js";
|
|
2
|
+
import { LAUNCHD_LOG_MONITOR_INTERVAL_SECONDS } from "./launchd-logs.js";
|
|
2
3
|
import { lifecycleFailure, maintenanceErrorMessage, pollUntil, uniquePids, unloadLaunchdService, } from "./background-lifecycle-utils.js";
|
|
3
4
|
import * as ui from "./ui.js";
|
|
5
|
+
const WAKE_COOLDOWN_MS = [5, 10, 20, 40, 60].map((minutes) => minutes * 60_000);
|
|
6
|
+
export function createManagedLaunchdLogWakeState(monotonicNow = defaultMonotonicNow) {
|
|
7
|
+
return {
|
|
8
|
+
cooldownIndex: 0,
|
|
9
|
+
cooldownDeadlineMonotonicMs: monotonicNow() + WAKE_COOLDOWN_MS[0],
|
|
10
|
+
wakeCount: 0,
|
|
11
|
+
lastOutcome: "idle",
|
|
12
|
+
lastReportedOutcome: undefined,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Run the managed worker's bounded metadata fast path. The dependency surface
|
|
17
|
+
* intentionally excludes config validation, snapshots, and runtime recovery:
|
|
18
|
+
* only a concrete safe maintenance inventory may wake the authenticated helper.
|
|
19
|
+
*/
|
|
20
|
+
export async function requestLaunchdLogMaintenanceIfNeeded(target, deps, state = createManagedLaunchdLogWakeState(deps.monotonicNow)) {
|
|
21
|
+
const monotonicNow = deps.monotonicNow ?? defaultMonotonicNow;
|
|
22
|
+
const stopped = deps.isStopped ?? (() => false);
|
|
23
|
+
// Classify each pass independently. A prior kickstart failure must not make
|
|
24
|
+
// a later unsafe inventory look like the same deduplicated request failure.
|
|
25
|
+
setOutcome(state, "inspection-failed");
|
|
26
|
+
const inspection = await deps.inspectLaunchdLogs(target.paths);
|
|
27
|
+
if (stopped())
|
|
28
|
+
return setOutcome(state, "stopped");
|
|
29
|
+
if (!inspection.canMaintain) {
|
|
30
|
+
const detail = inspection.issues.length === 0
|
|
31
|
+
? "the bounded inventory is unsafe"
|
|
32
|
+
: inspection.issues.join("; ");
|
|
33
|
+
throw new Error(`LaunchAgent log maintenance refused unsafe inventory: ${detail}`);
|
|
34
|
+
}
|
|
35
|
+
const pendingArtifact = inspection.pendingMaintenance
|
|
36
|
+
|| inspection.pendingTransaction
|
|
37
|
+
|| inspection.pendingPreparation;
|
|
38
|
+
if (pendingArtifact) {
|
|
39
|
+
// A replacement worker can inherit stale intent or transaction artifacts.
|
|
40
|
+
// Preserve the current backoff and leave recovery to the scheduled helper.
|
|
41
|
+
return setOutcome(state, "pending-artifact");
|
|
42
|
+
}
|
|
43
|
+
if (inspection.perAgentFileReasons.length === 0) {
|
|
44
|
+
resetWakeCooldown(state, monotonicNow());
|
|
45
|
+
return setOutcome(state, inspection.sharedDirectoryNeedsMaintenance ? "shared-only" : "idle");
|
|
46
|
+
}
|
|
47
|
+
if (monotonicNow() < state.cooldownDeadlineMonotonicMs) {
|
|
48
|
+
return setOutcome(state, "cooldown");
|
|
49
|
+
}
|
|
50
|
+
const helperLabel = deriveLaunchdMaintenanceLabel(target.label);
|
|
51
|
+
const helper = await launchdServiceInfo(deps.runner, helperLabel, deps.getuid());
|
|
52
|
+
if (stopped())
|
|
53
|
+
return setOutcome(state, "stopped");
|
|
54
|
+
if (!helper.loaded) {
|
|
55
|
+
advanceWakeCooldown(state, monotonicNow());
|
|
56
|
+
return setOutcome(state, "helper-unloaded");
|
|
57
|
+
}
|
|
58
|
+
if (helper.pid !== undefined) {
|
|
59
|
+
advanceWakeCooldown(state, monotonicNow());
|
|
60
|
+
return setOutcome(state, "helper-running");
|
|
61
|
+
}
|
|
62
|
+
// Final latch closes the stop/inspect/print/kickstart resurrection window.
|
|
63
|
+
if (stopped())
|
|
64
|
+
return setOutcome(state, "stopped");
|
|
65
|
+
setOutcome(state, "request-failed");
|
|
66
|
+
const requested = await kickstart(deps.runner, helperLabel, deps.getuid());
|
|
67
|
+
advanceWakeCooldown(state, monotonicNow());
|
|
68
|
+
if (requested.code !== 0) {
|
|
69
|
+
const detail = (requested.stderr || requested.stdout).trim();
|
|
70
|
+
setOutcome(state, "request-failed");
|
|
71
|
+
throw new Error(`launchctl kickstart exited ${requested.code}${detail.length === 0 ? "" : `: ${detail}`}`);
|
|
72
|
+
}
|
|
73
|
+
state.wakeCount += 1;
|
|
74
|
+
return setOutcome(state, "requested");
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Inspect active logs in the already-running worker every five minutes. One
|
|
78
|
+
* inspection may be in flight at a time, so a slow filesystem cannot build an
|
|
79
|
+
* overlapping timer queue. Consecutive failures are reported only once.
|
|
80
|
+
*/
|
|
81
|
+
export function startManagedLaunchdLogMonitor(target, deps) {
|
|
82
|
+
let stopped = false;
|
|
83
|
+
let checking = false;
|
|
84
|
+
const monotonicNow = deps.monotonicNow ?? defaultMonotonicNow;
|
|
85
|
+
const wallClockNow = deps.wallClockNow ?? Date.now;
|
|
86
|
+
const state = createManagedLaunchdLogWakeState(monotonicNow);
|
|
87
|
+
const monitoredDeps = {
|
|
88
|
+
...deps,
|
|
89
|
+
monotonicNow,
|
|
90
|
+
wallClockNow,
|
|
91
|
+
isStopped: () => stopped || deps.isStopped?.() === true,
|
|
92
|
+
};
|
|
93
|
+
const inspect = async () => {
|
|
94
|
+
if (stopped || checking)
|
|
95
|
+
return;
|
|
96
|
+
checking = true;
|
|
97
|
+
try {
|
|
98
|
+
const outcome = await requestLaunchdLogMaintenanceIfNeeded(target, monitoredDeps, state);
|
|
99
|
+
if (!stopped && shouldReportOutcome(state, outcome)) {
|
|
100
|
+
safeReport(deps, `Managed log monitor for ${target.label}: ${outcome}.`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
const failureOutcome = state.lastOutcome === "request-failed"
|
|
105
|
+
? "request-failed"
|
|
106
|
+
: "inspection-failed";
|
|
107
|
+
setOutcome(state, failureOutcome);
|
|
108
|
+
if (!stopped && shouldReportOutcome(state, failureOutcome)) {
|
|
109
|
+
safeReport(deps, `Managed log inspection could not request maintenance for ${target.label}: ${safeReporterDetail(error)}`, true);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
if (!stopped)
|
|
114
|
+
safeRecordStatus(deps, monitorStatus(state, monotonicNow(), wallClockNow()));
|
|
115
|
+
checking = false;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const guardInspect = () => {
|
|
119
|
+
void inspect().catch((error) => {
|
|
120
|
+
if (!stopped)
|
|
121
|
+
safeReport(deps, `Managed log monitor failed: ${safeReporterDetail(error)}`, true);
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
const interval = setInterval(guardInspect, LAUNCHD_LOG_MONITOR_INTERVAL_SECONDS * 1_000);
|
|
125
|
+
interval.unref();
|
|
126
|
+
guardInspect();
|
|
127
|
+
return {
|
|
128
|
+
stop: () => {
|
|
129
|
+
if (stopped)
|
|
130
|
+
return;
|
|
131
|
+
stopped = true;
|
|
132
|
+
clearInterval(interval);
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function defaultMonotonicNow() {
|
|
137
|
+
return performance.now();
|
|
138
|
+
}
|
|
139
|
+
function resetWakeCooldown(state, now) {
|
|
140
|
+
state.cooldownIndex = 0;
|
|
141
|
+
state.cooldownDeadlineMonotonicMs = now + WAKE_COOLDOWN_MS[0];
|
|
142
|
+
}
|
|
143
|
+
function advanceWakeCooldown(state, now) {
|
|
144
|
+
state.cooldownIndex = Math.min(state.cooldownIndex + 1, WAKE_COOLDOWN_MS.length - 1);
|
|
145
|
+
state.cooldownDeadlineMonotonicMs = now + WAKE_COOLDOWN_MS[state.cooldownIndex];
|
|
146
|
+
}
|
|
147
|
+
function setOutcome(state, outcome) {
|
|
148
|
+
state.lastOutcome = outcome;
|
|
149
|
+
return outcome;
|
|
150
|
+
}
|
|
151
|
+
function shouldReportOutcome(state, outcome) {
|
|
152
|
+
if (outcome === "idle" || outcome === "shared-only" || outcome === "cooldown" || outcome === "stopped") {
|
|
153
|
+
state.lastReportedOutcome = undefined;
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
if (state.lastReportedOutcome === outcome)
|
|
157
|
+
return false;
|
|
158
|
+
state.lastReportedOutcome = outcome;
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
function monitorStatus(state, monotonicNow, wallClockNow) {
|
|
162
|
+
const remaining = Math.max(0, state.cooldownDeadlineMonotonicMs - monotonicNow);
|
|
163
|
+
return {
|
|
164
|
+
version: 1,
|
|
165
|
+
lastInspectionAt: new Date(wallClockNow).toISOString(),
|
|
166
|
+
wakeCount: state.wakeCount,
|
|
167
|
+
lastOutcome: state.lastOutcome,
|
|
168
|
+
cooldownDeadline: new Date(wallClockNow + remaining).toISOString(),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function safeRecordStatus(deps, status) {
|
|
172
|
+
try {
|
|
173
|
+
const recorded = deps.recordStatus?.(status);
|
|
174
|
+
if (recorded !== undefined)
|
|
175
|
+
void Promise.resolve(recorded).catch(() => undefined);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Observability must never alter worker lifecycle or become unhandled.
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function safeReport(deps, message, error = false) {
|
|
182
|
+
const safeMessage = safeReporterText(message);
|
|
183
|
+
const rendered = error ? ui.errorLine(safeMessage) : ui.style.dim(`${safeMessage}\n`);
|
|
184
|
+
try {
|
|
185
|
+
const reported = deps.stderr(rendered);
|
|
186
|
+
if (reported !== undefined)
|
|
187
|
+
void Promise.resolve(reported).catch(() => undefined);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Reporter failures are explicitly non-fatal and never escape.
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function safeReporterDetail(error) {
|
|
194
|
+
const raw = error instanceof Error ? error.message : String(error);
|
|
195
|
+
return safeReporterText(raw);
|
|
196
|
+
}
|
|
197
|
+
function safeReporterText(raw) {
|
|
198
|
+
return raw
|
|
199
|
+
.replace(/[\u0000-\u001f\u007f]+/gu, " ")
|
|
200
|
+
.replace(/\b(token|secret|password|api[-_]?key|authorization)\s*[=:]\s*\S+/giu, "$1=<redacted>")
|
|
201
|
+
.replace(/\bBearer\s+\S+/giu, "Bearer <redacted>")
|
|
202
|
+
.replace(/(?:\/[A-Za-z0-9._~!$&'()+,;=:@%-]+){2,}/gu, "<path>")
|
|
203
|
+
.replace(/\s+/gu, " ")
|
|
204
|
+
.trim()
|
|
205
|
+
.slice(0, 512);
|
|
206
|
+
}
|
|
4
207
|
/** Run one authenticated, crash-recoverable stopped-writer log rotation pass. */
|
|
5
|
-
export async function maintainLaunchdLogsOperation(target, deps, poll) {
|
|
208
|
+
export async function maintainLaunchdLogsOperation(target, deps, poll, acquireSharedLogLock) {
|
|
6
209
|
const release = await deps.acquireLifecycleLock(target);
|
|
7
210
|
if (release === undefined)
|
|
8
211
|
return 0;
|
|
9
212
|
try {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
213
|
+
return await maintainLaunchdLogsWithLifecycleLockOperation(target, deps, poll, acquireSharedLogLock);
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
await release().catch((error) => {
|
|
217
|
+
deps.stderr(ui.errorLine(`Could not release lifecycle lock for ${target.label}: ${error instanceof Error ? error.message : String(error)}`));
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/** Acquire the shared lease after the caller already owns this agent's lifecycle. */
|
|
222
|
+
export async function maintainLaunchdLogsWithLifecycleLockOperation(target, deps, poll, acquireSharedLogLock) {
|
|
223
|
+
let releaseSharedLogLock;
|
|
224
|
+
try {
|
|
13
225
|
try {
|
|
14
|
-
|
|
226
|
+
releaseSharedLogLock = await acquireSharedLogLock();
|
|
15
227
|
}
|
|
16
228
|
catch (error) {
|
|
17
|
-
reportMaintenanceFailure(target, deps, "
|
|
229
|
+
reportMaintenanceFailure(target, deps, "acquire the shared launchd-log mutation lock", error);
|
|
18
230
|
return 1;
|
|
19
231
|
}
|
|
20
|
-
|
|
232
|
+
// Scheduled work defers cleanly. Staggering controls recurring cadence;
|
|
233
|
+
// this lease protects only the mutation, never expensive helper work.
|
|
234
|
+
if (releaseSharedLogLock === undefined)
|
|
235
|
+
return 0;
|
|
236
|
+
return await maintainLaunchdLogsWithSharedLockOperation(target, deps, poll);
|
|
237
|
+
}
|
|
238
|
+
finally {
|
|
239
|
+
await releaseSharedLogLock?.().catch((error) => {
|
|
240
|
+
deps.stderr(ui.errorLine(`Could not release the shared launchd-log mutation lock for ${target.label}: ${error instanceof Error ? error.message : String(error)}`));
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/** Execute log maintenance only while the caller owns per-agent then shared leases. */
|
|
245
|
+
export async function maintainLaunchdLogsWithSharedLockOperation(target, deps, poll) {
|
|
246
|
+
await deps.recordMaintenancePhase?.("inspecting");
|
|
247
|
+
const uid = deps.getuid();
|
|
248
|
+
const service = await launchdServiceInfo(deps.runner, target.label, uid);
|
|
249
|
+
let inspection;
|
|
250
|
+
try {
|
|
251
|
+
inspection = await deps.inspectLaunchdLogs(target.paths);
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
reportMaintenanceFailure(target, deps, "inspect launchd logs", error);
|
|
255
|
+
return 1;
|
|
256
|
+
}
|
|
257
|
+
let additionalInspection = {
|
|
258
|
+
needsMaintenance: false,
|
|
259
|
+
canMaintain: true,
|
|
260
|
+
issues: [],
|
|
261
|
+
};
|
|
262
|
+
try {
|
|
263
|
+
additionalInspection = await deps.inspectAdditionalLaunchdLogArtifacts?.(target.paths)
|
|
264
|
+
?? additionalInspection;
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
reportMaintenanceFailure(target, deps, "inspect bounded legacy log artifacts", error);
|
|
268
|
+
return 1;
|
|
269
|
+
}
|
|
270
|
+
let additionalRefused = !additionalInspection.canMaintain;
|
|
271
|
+
if (additionalRefused) {
|
|
21
272
|
try {
|
|
22
|
-
|
|
273
|
+
await deps.recordAdditionalLaunchdLogRefusals?.(additionalInspection.issues);
|
|
23
274
|
}
|
|
24
275
|
catch (error) {
|
|
25
|
-
reportMaintenanceFailure(target, deps, "
|
|
276
|
+
reportMaintenanceFailure(target, deps, "record bounded legacy log refusals", error);
|
|
26
277
|
return 1;
|
|
27
278
|
}
|
|
28
|
-
|
|
29
|
-
|
|
279
|
+
}
|
|
280
|
+
let maintenanceIntent;
|
|
281
|
+
try {
|
|
282
|
+
maintenanceIntent = await deps.readLaunchdLogMaintenanceIntent(target.paths);
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
reportMaintenanceFailure(target, deps, "read durable launchd-log maintenance intent", error);
|
|
286
|
+
return 1;
|
|
287
|
+
}
|
|
288
|
+
if (inspection.pendingMaintenance && maintenanceIntent === undefined) {
|
|
289
|
+
reportMaintenanceFailure(target, deps, "read durable launchd-log maintenance intent", new Error("The maintenance marker disappeared after inventory."));
|
|
290
|
+
return 1;
|
|
291
|
+
}
|
|
292
|
+
if (!service.loaded && maintenanceIntent === undefined)
|
|
293
|
+
return additionalRefused ? 1 : 0;
|
|
294
|
+
let originalPlistIdentity;
|
|
295
|
+
try {
|
|
296
|
+
originalPlistIdentity = await deps.verifyLaunchdPlist(target.paths.plistPath);
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
reportMaintenanceFailure(target, deps, "verify the existing main LaunchAgent", error);
|
|
300
|
+
return 1;
|
|
301
|
+
}
|
|
302
|
+
if (maintenanceIntent !== undefined
|
|
303
|
+
&& (maintenanceIntent.label !== target.label
|
|
304
|
+
|| maintenanceIntent.plistFingerprint !== originalPlistIdentity)) {
|
|
305
|
+
reportMaintenanceFailure(target, deps, "authenticate durable launchd-log maintenance intent", new Error("The pending intent does not match the exact main LaunchAgent definition."));
|
|
306
|
+
return 1;
|
|
307
|
+
}
|
|
308
|
+
if (maintenanceIntent?.phase === "stopping" && !service.loaded) {
|
|
309
|
+
reportMaintenanceFailure(target, deps, "recover interrupted launchd-log maintenance", new Error("The prior maintainer did not durably prove every old writer PID dead; refusing rotation."));
|
|
310
|
+
return 1;
|
|
311
|
+
}
|
|
312
|
+
if (maintenanceIntent?.phase === "restoring") {
|
|
313
|
+
const replacement = await launchdServiceInfo(deps.runner, target.label, uid);
|
|
314
|
+
if (!replacement.loaded || replacement.pid === undefined || !deps.isAlive(replacement.pid)) {
|
|
315
|
+
reportMaintenanceFailure(target, deps, "recover interrupted launchd-log restoration", new Error("The replacement writer identity was lost before live-worker proof; refusing stale rotation authority."));
|
|
30
316
|
return 1;
|
|
31
317
|
}
|
|
32
|
-
if (!service.loaded && maintenanceIntent === undefined)
|
|
33
|
-
return 0;
|
|
34
|
-
let originalPlistIdentity;
|
|
35
318
|
try {
|
|
36
|
-
|
|
319
|
+
await deps.clearLaunchdLogMaintenanceIntent(target.paths, maintenanceIntent);
|
|
37
320
|
}
|
|
38
321
|
catch (error) {
|
|
39
|
-
reportMaintenanceFailure(target, deps, "
|
|
40
|
-
return 1;
|
|
41
|
-
}
|
|
42
|
-
if (maintenanceIntent !== undefined
|
|
43
|
-
&& (maintenanceIntent.label !== target.label
|
|
44
|
-
|| maintenanceIntent.plistFingerprint !== originalPlistIdentity)) {
|
|
45
|
-
reportMaintenanceFailure(target, deps, "authenticate durable launchd-log maintenance intent", new Error("The pending intent does not match the exact main LaunchAgent definition."));
|
|
46
|
-
return 1;
|
|
47
|
-
}
|
|
48
|
-
if (maintenanceIntent?.phase === "stopping" && !service.loaded) {
|
|
49
|
-
reportMaintenanceFailure(target, deps, "recover interrupted launchd-log maintenance", new Error("The prior maintainer did not durably prove every old writer PID dead; refusing rotation."));
|
|
322
|
+
reportMaintenanceFailure(target, deps, "clear recovered launchd-log restoration intent", error);
|
|
50
323
|
return 1;
|
|
51
324
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
325
|
+
return 0;
|
|
326
|
+
}
|
|
327
|
+
if (maintenanceIntent?.phase === "stopped" && service.loaded) {
|
|
328
|
+
reportMaintenanceFailure(target, deps, "recover interrupted launchd-log maintenance", new Error("launchd reports a writer loaded after durable stopped-writer proof; refusing rotation."));
|
|
329
|
+
return 1;
|
|
330
|
+
}
|
|
331
|
+
if (!inspection.canMaintain) {
|
|
332
|
+
deps.stderr(ui.errorLine(`Scheduled log maintenance refused unsafe paths for ${target.label}.`));
|
|
333
|
+
for (const issue of inspection.issues)
|
|
334
|
+
deps.stderr(ui.style.dim(issue) + "\n");
|
|
335
|
+
return 1;
|
|
336
|
+
}
|
|
337
|
+
if (!inspection.needsMaintenance
|
|
338
|
+
&& !additionalInspection.needsMaintenance
|
|
339
|
+
&& maintenanceIntent === undefined)
|
|
340
|
+
return additionalRefused ? 1 : 0;
|
|
341
|
+
if (maintenanceIntent === undefined) {
|
|
342
|
+
maintenanceIntent = {
|
|
343
|
+
version: 1,
|
|
344
|
+
phase: "stopping",
|
|
345
|
+
label: target.label,
|
|
346
|
+
plistFingerprint: originalPlistIdentity,
|
|
347
|
+
};
|
|
348
|
+
try {
|
|
349
|
+
await deps.recordMaintenancePhase?.("stopping");
|
|
350
|
+
await deps.beginLaunchdLogMaintenanceIntent(target.paths, maintenanceIntent);
|
|
66
351
|
}
|
|
67
|
-
|
|
68
|
-
reportMaintenanceFailure(target, deps, "
|
|
352
|
+
catch (error) {
|
|
353
|
+
reportMaintenanceFailure(target, deps, "publish durable launchd-log maintenance intent", error);
|
|
69
354
|
return 1;
|
|
70
355
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
356
|
+
}
|
|
357
|
+
if (maintenanceIntent.phase === "stopping") {
|
|
358
|
+
const stopped = await unloadLaunchdService(target.label, service, uniquePids([service.pid]), deps, uid, poll);
|
|
359
|
+
if (!stopped.ok) {
|
|
360
|
+
reportMaintenanceFailure(target, deps, "prove the launchd log writer stopped", stopped.failure);
|
|
75
361
|
return 1;
|
|
76
362
|
}
|
|
77
|
-
if (!inspection.needsMaintenance && maintenanceIntent === undefined)
|
|
78
|
-
return 0;
|
|
79
|
-
if (maintenanceIntent === undefined) {
|
|
80
|
-
maintenanceIntent = {
|
|
81
|
-
version: 1,
|
|
82
|
-
phase: "stopping",
|
|
83
|
-
label: target.label,
|
|
84
|
-
plistFingerprint: originalPlistIdentity,
|
|
85
|
-
};
|
|
86
|
-
try {
|
|
87
|
-
await deps.beginLaunchdLogMaintenanceIntent(target.paths, maintenanceIntent);
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
reportMaintenanceFailure(target, deps, "publish durable launchd-log maintenance intent", error);
|
|
91
|
-
return 1;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
if (maintenanceIntent.phase === "stopping") {
|
|
95
|
-
const stopped = await unloadLaunchdService(target.label, service, uniquePids([service.pid]), deps, uid, poll);
|
|
96
|
-
if (!stopped.ok) {
|
|
97
|
-
reportMaintenanceFailure(target, deps, "prove the launchd log writer stopped", stopped.failure);
|
|
98
|
-
return 1;
|
|
99
|
-
}
|
|
100
|
-
try {
|
|
101
|
-
maintenanceIntent = await deps.markLaunchdLogMaintenanceStopped(target.paths, maintenanceIntent);
|
|
102
|
-
}
|
|
103
|
-
catch (error) {
|
|
104
|
-
reportMaintenanceFailure(target, deps, "record durable stopped-writer proof", error);
|
|
105
|
-
return 1;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
const current = await launchdServiceInfo(deps.runner, target.label, uid);
|
|
110
|
-
if (current.loaded || (current.pid !== undefined && deps.isAlive(current.pid))) {
|
|
111
|
-
reportMaintenanceFailure(target, deps, "recheck durable stopped-writer proof", new Error("launchd exposed a live writer before recovered rotation."));
|
|
112
|
-
return 1;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
363
|
try {
|
|
116
|
-
await deps.
|
|
117
|
-
|
|
118
|
-
if (currentPlistIdentity !== originalPlistIdentity) {
|
|
119
|
-
throw new Error("The main LaunchAgent plist changed during stopped-writer maintenance.");
|
|
120
|
-
}
|
|
364
|
+
maintenanceIntent = await deps.markLaunchdLogMaintenanceStopped(target.paths, maintenanceIntent);
|
|
365
|
+
await deps.recordMaintenancePhase?.("stopped");
|
|
121
366
|
}
|
|
122
367
|
catch (error) {
|
|
123
|
-
reportMaintenanceFailure(target, deps, "
|
|
368
|
+
reportMaintenanceFailure(target, deps, "record durable stopped-writer proof", error);
|
|
124
369
|
return 1;
|
|
125
370
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
reportMaintenanceFailure(target, deps, "
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
const current = await launchdServiceInfo(deps.runner, target.label, uid);
|
|
374
|
+
if (current.loaded || (current.pid !== undefined && deps.isAlive(current.pid))) {
|
|
375
|
+
reportMaintenanceFailure(target, deps, "recheck durable stopped-writer proof", new Error("launchd exposed a live writer before recovered rotation."));
|
|
131
376
|
return 1;
|
|
132
377
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
});
|
|
141
|
-
if (!running) {
|
|
142
|
-
const current = await launchdServiceInfo(deps.runner, target.label, uid);
|
|
143
|
-
if (current.pid !== undefined)
|
|
144
|
-
observedRestorePids.add(current.pid);
|
|
145
|
-
const cleanedUp = await unloadLaunchdService(target.label, current, [...observedRestorePids], deps, uid, poll);
|
|
146
|
-
reportMaintenanceFailure(target, deps, "restore the exact main LaunchAgent after rotation", lifecycleFailure(booted, "launchd did not expose a live replacement worker"));
|
|
147
|
-
if (!cleanedUp.ok) {
|
|
148
|
-
reportMaintenanceFailure(target, deps, "remove the failed replacement worker", cleanedUp.failure);
|
|
378
|
+
}
|
|
379
|
+
try {
|
|
380
|
+
await deps.recordMaintenancePhase?.("rotating");
|
|
381
|
+
if (additionalInspection.canMaintain && additionalInspection.needsMaintenance) {
|
|
382
|
+
const result = await deps.maintainAdditionalLaunchdLogArtifacts?.(target.paths);
|
|
383
|
+
if (result === undefined) {
|
|
384
|
+
throw new Error("The bounded legacy inspection had no matching stopped-writer maintainer.");
|
|
149
385
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
const restoredPlistIdentity = await deps.verifyLaunchdPlist(target.paths.plistPath);
|
|
154
|
-
if (restoredPlistIdentity !== originalPlistIdentity) {
|
|
155
|
-
throw new Error("The main LaunchAgent plist changed while launchd restored the worker.");
|
|
386
|
+
if (result.refusals.length > 0) {
|
|
387
|
+
additionalRefused = true;
|
|
388
|
+
await deps.recordAdditionalLaunchdLogRefusals?.(result.refusals);
|
|
156
389
|
}
|
|
157
390
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
if (!stoppedAgain.ok) {
|
|
163
|
-
reportMaintenanceFailure(target, deps, "stop the worker after its definition changed", stoppedAgain.failure);
|
|
164
|
-
}
|
|
165
|
-
return 1;
|
|
391
|
+
await deps.rotateStoppedLaunchdLogs(target.paths);
|
|
392
|
+
const currentPlistIdentity = await deps.verifyLaunchdPlist(target.paths.plistPath);
|
|
393
|
+
if (currentPlistIdentity !== originalPlistIdentity) {
|
|
394
|
+
throw new Error("The main LaunchAgent plist changed during stopped-writer maintenance.");
|
|
166
395
|
}
|
|
167
|
-
|
|
168
|
-
|
|
396
|
+
}
|
|
397
|
+
catch (error) {
|
|
398
|
+
reportMaintenanceFailure(target, deps, "commit bounded stopped-writer logs", error);
|
|
399
|
+
return 1;
|
|
400
|
+
}
|
|
401
|
+
try {
|
|
402
|
+
maintenanceIntent = await deps.markLaunchdLogMaintenanceRestoring(target.paths, maintenanceIntent);
|
|
403
|
+
await deps.recordMaintenancePhase?.("restoring");
|
|
404
|
+
}
|
|
405
|
+
catch (error) {
|
|
406
|
+
reportMaintenanceFailure(target, deps, "invalidate stopped-writer proof before restoration", error);
|
|
407
|
+
return 1;
|
|
408
|
+
}
|
|
409
|
+
const booted = await bootstrap(deps.runner, target.paths.plistPath, uid);
|
|
410
|
+
const observedRestorePids = new Set();
|
|
411
|
+
const running = await pollUntil(deps, poll, async () => {
|
|
412
|
+
const current = await launchdServiceInfo(deps.runner, target.label, uid);
|
|
413
|
+
if (current.pid !== undefined)
|
|
414
|
+
observedRestorePids.add(current.pid);
|
|
415
|
+
return current.loaded && current.pid !== undefined && deps.isAlive(current.pid);
|
|
416
|
+
});
|
|
417
|
+
if (!running) {
|
|
418
|
+
const current = await launchdServiceInfo(deps.runner, target.label, uid);
|
|
419
|
+
if (current.pid !== undefined)
|
|
420
|
+
observedRestorePids.add(current.pid);
|
|
421
|
+
const cleanedUp = await unloadLaunchdService(target.label, current, [...observedRestorePids], deps, uid, poll);
|
|
422
|
+
reportMaintenanceFailure(target, deps, "restore the exact main LaunchAgent after rotation", lifecycleFailure(booted, "launchd did not expose a live replacement worker"));
|
|
423
|
+
if (!cleanedUp.ok) {
|
|
424
|
+
reportMaintenanceFailure(target, deps, "remove the failed replacement worker", cleanedUp.failure);
|
|
169
425
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
426
|
+
return 1;
|
|
427
|
+
}
|
|
428
|
+
try {
|
|
429
|
+
const restoredPlistIdentity = await deps.verifyLaunchdPlist(target.paths.plistPath);
|
|
430
|
+
if (restoredPlistIdentity !== originalPlistIdentity) {
|
|
431
|
+
throw new Error("The main LaunchAgent plist changed while launchd restored the worker.");
|
|
173
432
|
}
|
|
174
|
-
return 0;
|
|
175
433
|
}
|
|
176
|
-
|
|
177
|
-
await
|
|
178
|
-
|
|
179
|
-
|
|
434
|
+
catch (error) {
|
|
435
|
+
const restoredService = await launchdServiceInfo(deps.runner, target.label, uid);
|
|
436
|
+
const stoppedAgain = await unloadLaunchdService(target.label, restoredService, uniquePids([restoredService.pid, ...observedRestorePids]), deps, uid, poll);
|
|
437
|
+
reportMaintenanceFailure(target, deps, "prove the restored main LaunchAgent definition", error);
|
|
438
|
+
if (!stoppedAgain.ok) {
|
|
439
|
+
reportMaintenanceFailure(target, deps, "stop the worker after its definition changed", stoppedAgain.failure);
|
|
440
|
+
}
|
|
441
|
+
return 1;
|
|
442
|
+
}
|
|
443
|
+
try {
|
|
444
|
+
await deps.clearLaunchdLogMaintenanceIntent(target.paths, maintenanceIntent);
|
|
445
|
+
await deps.recordMaintenancePhase?.("complete");
|
|
446
|
+
}
|
|
447
|
+
catch (error) {
|
|
448
|
+
reportMaintenanceFailure(target, deps, "clear durable launchd-log maintenance intent", error);
|
|
449
|
+
return 1;
|
|
180
450
|
}
|
|
451
|
+
return additionalRefused ? 1 : 0;
|
|
181
452
|
}
|
|
182
453
|
export function reportMaintenanceFailure(target, deps, action, error) {
|
|
183
454
|
deps.stderr(ui.errorLine(`Scheduled log maintenance could not ${action} for ${target.label}: ${maintenanceErrorMessage(error)}`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background-log-maintenance.js","sourceRoot":"","sources":["../src/background-log-maintenance.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"background-log-maintenance.js","sourceRoot":"","sources":["../src/background-log-maintenance.ts"],"names":[],"mappings":"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"}
|