@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
package/dist/background.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../src/background.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../src/background.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AA4BrE,OAAO,KAAK,EAEV,eAAe,EAEf,YAAY,EACb,MAAM,cAAc,CAAC;AAYtB,OAAO,KAAK,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAO3F,OAAO,KAAK,EACV,wBAAwB,EACxB,6BAA6B,EAC7B,+BAA+B,EAC/B,gCAAgC,EAChC,4BAA4B,EAC7B,MAAM,yBAAyB,CAAC;AAOjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAInE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMhE,OAAO,KAAK,EACV,yBAAyB,EACzB,4BAA4B,EAC7B,MAAM,6BAA6B,CAAC;AAKrC,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AAStF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAQnE,YAAY,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EACL,8BAA8B,EAC9B,2BAA2B,EAC3B,0BAA0B,EAC1B,+BAA+B,EAC/B,+BAA+B,GAChC,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,yBAAyB,EACzB,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,oCAAoC,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,kCAAkC,EAAE,MAAM,4BAA4B,CAAC;AAEhF,OAAO,EACL,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAE3B;;;;;;GAMG;AAEH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gFAAgF;IAChF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAChF,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,4EAA4E;IAC5E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IAC/C,iFAAiF;IACjF,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAC5C,gFAAgF;IAChF,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,4EAA4E;AAC5E,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GAChD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAQlC;AAED,mFAAmF;AACnF,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GAChD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAQlC;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,cAAc,CAAC,CA6BtG;AAED;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,MAAM,EACX,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED,MAAM,WAAW,cAAc;IAC7B,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,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IACnD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IACnD,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,QAAQ,CAAC,kBAAkB,EAAE,CAC3B,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC,KAC9D,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnC,QAAQ,CAAC,wBAAwB,EAAE,CACjC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC,KAC9D,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,CAAC,+BAA+B,EAAE,CACxC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC,KAC9D,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC,CAAC;IACtD,QAAQ,CAAC,gCAAgC,EAAE,CACzC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC,EACjE,MAAM,EAAE,2BAA2B,KAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,CAAC,gCAAgC,EAAE,CACzC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC,EACjE,QAAQ,EAAE,2BAA2B,KAClC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C,QAAQ,CAAC,kCAAkC,EAAE,CAC3C,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC,EACjE,QAAQ,EAAE,2BAA2B,KAClC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C,QAAQ,CAAC,iCAAiC,EAAE,CAC1C,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC,EACjE,QAAQ,EAAE,2BAA2B,KAClC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C,QAAQ,CAAC,gCAAgC,EAAE,CACzC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC,EACjE,QAAQ,CAAC,EAAE,2BAA2B,KACnC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F,8EAA8E;IAC9E,QAAQ,CAAC,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,0EAA0E;IAC1E,QAAQ,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC3G,+DAA+D;IAC/D,QAAQ,CAAC,mCAAmC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACzG,iFAAiF;IACjF,QAAQ,CAAC,0BAA0B,EAAE,CACnC,KAAK,EAAE;QAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;KAAE,KACrE,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC/C,+FAA+F;IAC/F,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CACvC,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,SAAS,+BAA+B,EAAE,CAAC,CAAC;IACzD,yEAAyE;IACzE,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,qFAAqF;IACrF,QAAQ,CAAC,gCAAgC,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IACzH,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnF,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAClE;AAED,wBAAgB,qBAAqB,IAAI,cAAc,CA+DtD;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAKD,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,WAAW,CAAC;AAE7D,MAAM,MAAM,sBAAsB,GAC9B;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;CACtC,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,GAAG,mBAAmB,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;CACrI,CAAC;AAEN,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,kFAAkF;AAClF,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,MAAM,WAAW,wBAAwB;IACvC,gFAAgF;IAChF,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC;IACrC,0FAA0F;IAC1F,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACpD;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,wBAAwB,EACjC,cAAc,CAAC,EAAE,gCAAgC,GAChD,OAAO,CAAC,MAAM,CAAC,CAOjB;AA0HD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACjC,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,yBAAyB,EACjC,IAAI,EAAE,cAAc,EACpB,IAAI,GAAE,WAAkC,GACvC,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,sBAAsB,CAAC,CAqBjC;AAwUD,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD5F;AAED,wBAAsB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnF;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAqCnE;AA6OD,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,IAAI,GAAE,WAAkC,GACvC,OAAO,CAAC,MAAM,CAAC,CAgBjB;AA2JD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,CAAC,CAmDjB;AAkGD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CASjH;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAqB1C;AAoCD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,MAAM,GACX,IAAI,CAKN;AAmdD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAmB9E"}
|
package/dist/background.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { createHash, randomUUID } from "node:crypto";
|
|
3
3
|
import { constants as fsConstants } from "node:fs";
|
|
4
|
-
import { lstat,
|
|
4
|
+
import { lstat, open, realpath, rename, rm, writeFile } from "node:fs/promises";
|
|
5
5
|
import { basename, dirname, join, resolve } from "node:path";
|
|
6
6
|
import process from "node:process";
|
|
7
7
|
import { listRecordedRuns, listTraceSources } from "@mono-agent/observability";
|
|
@@ -9,19 +9,24 @@ import { describeSensitiveDataExportWarning, phoenixAppBaseUrl, resolveAppTraceR
|
|
|
9
9
|
import { formatChannelFactValue } from "./channel-fact-format.js";
|
|
10
10
|
import { formatHumanChannelSections } from "./channel-status-display.js";
|
|
11
11
|
import { hasCompletedManagedStartup } from "./managed-startup.js";
|
|
12
|
-
import { bootout, bootstrap, buildLaunchdMaintenancePlistXml, buildPlistXml, defaultPathEnv, deriveLaunchdLabel, deriveLaunchdMaintenanceLabel, isLoaded, launchdManagedWorkerInfo, launchdServiceInfo, launchdPathsFor, MANAGED_LAUNCHD_LOG_MAINTENANCE_ENV, makeLaunchctlRunner, } from "./launchd.js";
|
|
12
|
+
import { bootout, bootstrap, buildLaunchdMaintenancePlistXml, buildPlistXml, defaultPathEnv, deriveLaunchdLabel, deriveLaunchdMaintenanceLabel, isLoaded, launchdManagedWorkerInfo, launchdMaintenanceEntrypointPathForCli, launchdServiceInfo, launchdPathsFor, launchdMaintenanceCalendarMinute, MANAGED_LAUNCHD_LOG_MAINTENANCE_ENV, makeLaunchctlRunner, } from "./launchd.js";
|
|
13
13
|
import { selectBackgroundOperationalEnvironment } from "./background-environment.js";
|
|
14
|
-
import { beginLaunchdLogMaintenanceIntent, clearLaunchdLogMaintenanceIntent, inspectLaunchdLogs,
|
|
14
|
+
import { beginLaunchdLogMaintenanceIntent, clearLaunchdLogMaintenanceIntent, inspectLaunchdLogs, markLaunchdLogMaintenanceRestoring, markLaunchdLogMaintenanceStopped, markLaunchdLogMaintenanceStopping, readLaunchdLogMaintenanceIntent, rotateStoppedLaunchdLogs, } from "./launchd-logs.js";
|
|
15
15
|
import { ensureManagedBackgroundRuntime, inspectManagedRuntimeSourceIdentity, MANAGED_BACKGROUND_WORKER_ENV, verifyManagedRuntimeLaunch, } from "./background-runtime.js";
|
|
16
16
|
import { backgroundSnapshotFromMetadata, captureBackgroundSnapshot, encodeBackgroundSnapshot, sameBackgroundSnapshot, } from "./background-snapshot.js";
|
|
17
17
|
import { resolveConfiguredManagedRuntimePackages } from "./managed-runtime-packages.js";
|
|
18
|
+
import { removeLaunchdLogMonitorStatus } from "./launchd-log-monitor-status.js";
|
|
18
19
|
import { acquireManagedRuntimePublicationBarrier } from "./managed-runtime-publication.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
20
|
+
import { ensureOwnerPrivateLaunchdDirectory } from "./launchd-private-files.js";
|
|
21
|
+
import { acquireFilesystemLifecycleLock, acquireSharedLaunchdLogLock, } from "./launchd-lifecycle-lock.js";
|
|
22
|
+
import { assertLaunchdMaintenanceLifecycleLease, withLaunchdMaintenanceControllerLock, } from "./launchd-maintenance-gate.js";
|
|
21
23
|
import { buildRunsHealthDisplay, RUNS_HEALTH_MAX_RUNS } from "./runs-health.js";
|
|
22
24
|
import { lifecycleFailure, maintenanceErrorMessage, pollUntil, uniquePids, unloadLaunchdService, } from "./background-lifecycle-utils.js";
|
|
23
|
-
import { maintainLaunchdLogsOperation, reportMaintenanceFailure, } from "./background-log-maintenance.js";
|
|
25
|
+
import { maintainLaunchdLogsOperation, maintainLaunchdLogsWithLifecycleLockOperation, reportMaintenanceFailure, } from "./background-log-maintenance.js";
|
|
24
26
|
import * as ui from "./ui.js";
|
|
27
|
+
export { acquireFilesystemLifecycleLock, acquireSharedLaunchdLogLock, sharedLaunchdLogLockTarget, SHARED_LAUNCHD_LOG_LOCK_POLL_MS, SHARED_LAUNCHD_LOG_LOCK_WAIT_MS, } from "./launchd-lifecycle-lock.js";
|
|
28
|
+
export { withLaunchdMaintenanceControllerLock } from "./launchd-maintenance-gate.js";
|
|
29
|
+
export { ensureOwnerPrivateLaunchdDirectory } from "./launchd-private-files.js";
|
|
25
30
|
export { acquireBackgroundWorkerLease, backgroundWorkerLeasePath, } from "./background-worker-lease.js";
|
|
26
31
|
export { LAUNCHD_LOG_MAX_BYTES, LAUNCHD_LOG_ROTATION_COUNT, } from "./launchd-logs.js";
|
|
27
32
|
/** Exact non-secret environment materialised into a managed LaunchAgent. */
|
|
@@ -34,7 +39,7 @@ export function managedBackgroundEnvironment(env) {
|
|
|
34
39
|
[MANAGED_BACKGROUND_WORKER_ENV]: "1",
|
|
35
40
|
};
|
|
36
41
|
}
|
|
37
|
-
/** Exact non-secret environment for the scheduled
|
|
42
|
+
/** Exact non-secret environment for the scheduled recovery/rotation controller. */
|
|
38
43
|
export function managedLaunchdLogMaintenanceEnvironment(env) {
|
|
39
44
|
return {
|
|
40
45
|
...selectBackgroundOperationalEnvironment(env),
|
|
@@ -135,6 +140,7 @@ export function defaultBackgroundDeps() {
|
|
|
135
140
|
clearLaunchdLogMaintenanceIntent: async (paths, expected) => {
|
|
136
141
|
await clearLaunchdLogMaintenanceIntent(paths, expected);
|
|
137
142
|
},
|
|
143
|
+
removeLaunchdLogMonitorStatus,
|
|
138
144
|
verifyLaunchdPlist: inspectOwnerPrivateLaunchdPlist,
|
|
139
145
|
isAlive: (pid) => {
|
|
140
146
|
try {
|
|
@@ -186,21 +192,16 @@ export async function restartBackground(target, deps, poll) {
|
|
|
186
192
|
* drifted. A healthy worker remains serving while a replacement runtime is
|
|
187
193
|
* materialized.
|
|
188
194
|
*/
|
|
189
|
-
export async function maintainLaunchdController(target, deps, options) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
const helperPid = deps.currentPid();
|
|
194
|
-
if (!helperService.loaded || helperService.pid !== helperPid || !deps.isAlive(helperPid)) {
|
|
195
|
-
reportMaintenanceFailure(target, deps, "authenticate the launchd-owned recovery controller", new Error(`launchd does not own this helper pid ${helperPid}`));
|
|
196
|
-
return 1;
|
|
197
|
-
}
|
|
198
|
-
const release = await deps.acquireLifecycleLock(target);
|
|
199
|
-
if (release === undefined) {
|
|
200
|
-
// A manual lifecycle command owns the label. The helper exits cleanly so
|
|
201
|
-
// that command can boot it out; StartInterval supplies the next retry.
|
|
202
|
-
return 0;
|
|
195
|
+
export async function maintainLaunchdController(target, deps, options, lifecycleLease) {
|
|
196
|
+
if (lifecycleLease !== undefined) {
|
|
197
|
+
assertLaunchdMaintenanceLifecycleLease(lifecycleLease, target);
|
|
198
|
+
return await maintainLaunchdControllerWithLifecycleLease(target, deps, options);
|
|
203
199
|
}
|
|
200
|
+
return await withLaunchdMaintenanceControllerLock(target, deps, async (ownership) => await maintainLaunchdController(target, deps, options, ownership));
|
|
201
|
+
}
|
|
202
|
+
/** Reconcile while the authenticated helper owns only this agent's lifecycle. */
|
|
203
|
+
async function maintainLaunchdControllerWithLifecycleLease(target, deps, options) {
|
|
204
|
+
const uid = deps.getuid();
|
|
204
205
|
let maintainLogsOnly = false;
|
|
205
206
|
let resultCode = 1;
|
|
206
207
|
try {
|
|
@@ -246,24 +247,26 @@ export async function maintainLaunchdController(target, deps, options) {
|
|
|
246
247
|
resultCode = 0;
|
|
247
248
|
}
|
|
248
249
|
else {
|
|
250
|
+
const preflightCode = await options.recoveryPreflight?.() ?? 0;
|
|
251
|
+
if (preflightCode !== 0)
|
|
252
|
+
return preflightCode;
|
|
249
253
|
if (!options.sourceAvailable) {
|
|
250
254
|
deps.stderr(ui.style.dim(`The original controller CLI is unavailable; recovering ${target.label} from the helper's private closure without claiming an upgrade.`) + "\n");
|
|
251
255
|
}
|
|
252
|
-
const recovered = await ensureBackgroundReadyUnlocked(target, deps, options.controlPoll ?? DEFAULT_CONTROL_POLL, options.readinessPoll ?? DEFAULT_READINESS_POLL, {
|
|
253
|
-
|
|
256
|
+
const recovered = await ensureBackgroundReadyUnlocked(target, deps, options.controlPoll ?? DEFAULT_CONTROL_POLL, options.readinessPoll ?? DEFAULT_READINESS_POLL, {
|
|
257
|
+
preserveMaintenanceService: true,
|
|
258
|
+
preserveDefinitionsOnFailure: true,
|
|
259
|
+
sharedLockMode: "automatic",
|
|
260
|
+
});
|
|
261
|
+
resultCode = recovered.ok || recovered.reason === "shared-contention" ? 0 : 1;
|
|
254
262
|
}
|
|
255
263
|
}
|
|
256
264
|
catch (error) {
|
|
257
265
|
reportMaintenanceFailure(target, deps, "reconcile the managed worker", error);
|
|
258
266
|
resultCode = 1;
|
|
259
267
|
}
|
|
260
|
-
finally {
|
|
261
|
-
await release().catch((error) => {
|
|
262
|
-
deps.stderr(ui.errorLine(`Could not release lifecycle lock for ${target.label}: ${error instanceof Error ? error.message : String(error)}`));
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
268
|
return maintainLogsOnly
|
|
266
|
-
? await
|
|
269
|
+
? await maintainLaunchdLogsWithLifecycleLockOperation(target, deps, options.controlPoll ?? DEFAULT_CONTROL_POLL, async () => await acquireSharedLaunchdLogLock(target, deps, "automatic"))
|
|
267
270
|
: resultCode;
|
|
268
271
|
}
|
|
269
272
|
function managedWorkerDefinitionMatchesTarget(definition, target) {
|
|
@@ -323,7 +326,7 @@ export async function forceRestartBackground(target, deps, whileStopped, poll) {
|
|
|
323
326
|
* its own durable lifecycle intent after a prior maintainer died post-bootout.
|
|
324
327
|
*/
|
|
325
328
|
export async function maintainLaunchdLogs(target, deps, poll = DEFAULT_CONTROL_POLL) {
|
|
326
|
-
return await maintainLaunchdLogsOperation(target, deps, poll);
|
|
329
|
+
return await maintainLaunchdLogsOperation(target, deps, poll, async () => await acquireSharedLaunchdLogLock(target, deps, "automatic"));
|
|
327
330
|
}
|
|
328
331
|
/**
|
|
329
332
|
* Ensure the canonical per-config LaunchAgent is running and return the fresh
|
|
@@ -437,18 +440,26 @@ async function ensureBackgroundReadyAfterPublicationBarrier(target, deps, contro
|
|
|
437
440
|
reportLifecycleException(launchTarget, deps, "verify the existing background worker ownership", error);
|
|
438
441
|
return { ok: false, action: "start", reason: "ownership" };
|
|
439
442
|
}
|
|
440
|
-
let
|
|
443
|
+
let releaseSharedLogLock;
|
|
441
444
|
try {
|
|
442
|
-
await
|
|
445
|
+
releaseSharedLogLock = await acquireSharedLaunchdLogLock(launchTarget, deps, options.sharedLockMode ?? "interactive");
|
|
443
446
|
}
|
|
444
447
|
catch (error) {
|
|
445
|
-
reportLifecycleException(launchTarget, deps, "
|
|
446
|
-
return { ok: false, action: "start", reason: "
|
|
448
|
+
reportLifecycleException(launchTarget, deps, "acquire the shared launchd-log mutation lock", error);
|
|
449
|
+
return { ok: false, action: "start", reason: "ownership" };
|
|
450
|
+
}
|
|
451
|
+
if (releaseSharedLogLock === undefined) {
|
|
452
|
+
if (options.sharedLockMode !== "automatic") {
|
|
453
|
+
deps.stderr(ui.errorLine("Shared launchd-log maintenance is already active for another agent on this account."));
|
|
454
|
+
}
|
|
455
|
+
return { ok: false, action: "start", reason: "shared-contention" };
|
|
447
456
|
}
|
|
457
|
+
let sinceMs = deps.now();
|
|
448
458
|
let outcome;
|
|
449
459
|
let prepared = false;
|
|
450
460
|
deps.stdout(ui.hint("Replacing the managed worker…"));
|
|
451
461
|
try {
|
|
462
|
+
await prepareLaunchdDirectories(launchTarget, deps);
|
|
452
463
|
let interruptedMaintenance = await deps.readLaunchdLogMaintenanceIntent(launchTarget.paths);
|
|
453
464
|
if (interruptedMaintenance?.phase === "stopping" || interruptedMaintenance?.phase === "restoring") {
|
|
454
465
|
const current = await launchdServiceInfo(deps.runner, launchTarget.label, uid);
|
|
@@ -486,6 +497,11 @@ async function ensureBackgroundReadyAfterPublicationBarrier(target, deps, contro
|
|
|
486
497
|
reportLifecycleException(launchTarget, deps, prepared ? "start the LaunchAgent" : "prepare the stopped LaunchAgent", error);
|
|
487
498
|
return { ok: false, action: "start", reason: prepared ? "launchctl" : "preparation" };
|
|
488
499
|
}
|
|
500
|
+
finally {
|
|
501
|
+
await releaseSharedLogLock?.().catch((error) => {
|
|
502
|
+
deps.stderr(ui.errorLine(`Could not release the shared launchd-log mutation lock for ${launchTarget.label}: ${error instanceof Error ? error.message : String(error)}`));
|
|
503
|
+
});
|
|
504
|
+
}
|
|
489
505
|
const action = outcome.restarted ? "restart" : "start";
|
|
490
506
|
if (!outcome.ok) {
|
|
491
507
|
reportLaunchFailure(launchTarget, deps, action, outcome.failure);
|
|
@@ -574,60 +590,23 @@ async function writePlists(target, deps) {
|
|
|
574
590
|
const maintenanceXml = buildLaunchdMaintenancePlistXml({
|
|
575
591
|
label: maintenance.label,
|
|
576
592
|
nodePath: target.nodePath,
|
|
577
|
-
cliPath: target.cliPath,
|
|
593
|
+
cliPath: launchdMaintenanceEntrypointPathForCli(target.cliPath),
|
|
578
594
|
configPath: target.configPath,
|
|
579
595
|
controllerCliPath: target.controllerCliPath ?? target.cliPath,
|
|
580
596
|
agentCwd: target.cwd,
|
|
581
597
|
agentPath,
|
|
598
|
+
expectedManagedRuntimeLaunch: target.managedRuntimeLaunchProof,
|
|
582
599
|
...(target.envFile === undefined ? {} : { envFile: target.envFile }),
|
|
583
600
|
// The agent folder may be renamed or removed while its already-running
|
|
584
601
|
// worker still owns log descriptors. Keep the scheduler's cwd in the
|
|
585
602
|
// durable account state tree; its config argument is already absolute.
|
|
586
603
|
cwd: dirname(target.paths.logDir),
|
|
587
604
|
environment: managedLaunchdLogMaintenanceEnvironment(target.environment),
|
|
588
|
-
|
|
605
|
+
calendarMinute: launchdMaintenanceCalendarMinute(target.label),
|
|
589
606
|
});
|
|
590
607
|
await deps.writeFile(target.paths.plistPath, mainXml);
|
|
591
608
|
await deps.writeFile(maintenance.plistPath, maintenanceXml);
|
|
592
609
|
}
|
|
593
|
-
export async function ensureOwnerPrivateLaunchdDirectory(path) {
|
|
594
|
-
const parent = dirname(path);
|
|
595
|
-
const parentDetails = await lstat(parent);
|
|
596
|
-
assertOwnerDirectory(parentDetails, parent, "LaunchAgent parent");
|
|
597
|
-
try {
|
|
598
|
-
await mkdir(path, { mode: 0o700 });
|
|
599
|
-
}
|
|
600
|
-
catch (error) {
|
|
601
|
-
if (!isErrno(error, "EEXIST"))
|
|
602
|
-
throw error;
|
|
603
|
-
}
|
|
604
|
-
const parentAfter = await lstat(parent);
|
|
605
|
-
assertOwnerDirectory(parentAfter, parent, "LaunchAgent parent");
|
|
606
|
-
if (!sameFilesystemIdentity(parentDetails, parentAfter)) {
|
|
607
|
-
throw new Error(`LaunchAgent parent ${parent} changed while ${path} was created.`);
|
|
608
|
-
}
|
|
609
|
-
const handle = await open(path, fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW);
|
|
610
|
-
try {
|
|
611
|
-
const before = await handle.stat();
|
|
612
|
-
assertOwnerDirectory(before, path, "LaunchAgent directory");
|
|
613
|
-
await handle.chmod(0o700);
|
|
614
|
-
const secured = await handle.stat();
|
|
615
|
-
if (!sameFilesystemIdentity(before, secured)) {
|
|
616
|
-
throw new Error(`LaunchAgent directory ${path} changed while it was secured.`);
|
|
617
|
-
}
|
|
618
|
-
assertOwnerDirectory(secured, path, "LaunchAgent directory");
|
|
619
|
-
if ((secured.mode & 0o077) !== 0) {
|
|
620
|
-
throw new Error(`LaunchAgent directory ${path} must be owner-only.`);
|
|
621
|
-
}
|
|
622
|
-
const current = await lstat(path);
|
|
623
|
-
if (!sameFilesystemIdentity(secured, current)) {
|
|
624
|
-
throw new Error(`LaunchAgent directory ${path} changed while it was secured.`);
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
finally {
|
|
628
|
-
await handle.close();
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
610
|
export async function writeOwnerPrivateLaunchdFile(path, data) {
|
|
632
611
|
let existing;
|
|
633
612
|
try {
|
|
@@ -675,7 +654,10 @@ export async function writeOwnerPrivateLaunchdFile(path, data) {
|
|
|
675
654
|
await rm(temporaryPath, { force: true }).catch(() => undefined);
|
|
676
655
|
}
|
|
677
656
|
}
|
|
678
|
-
async function inspectOwnerPrivateLaunchdPlist(path) {
|
|
657
|
+
export async function inspectOwnerPrivateLaunchdPlist(path) {
|
|
658
|
+
return (await readOwnerPrivateLaunchdPlist(path)).identity;
|
|
659
|
+
}
|
|
660
|
+
export async function readOwnerPrivateLaunchdPlist(path) {
|
|
679
661
|
const handle = await open(path, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW | fsConstants.O_NONBLOCK);
|
|
680
662
|
try {
|
|
681
663
|
const before = await handle.stat();
|
|
@@ -699,12 +681,13 @@ async function inspectOwnerPrivateLaunchdPlist(path) {
|
|
|
699
681
|
if ((current.mode & 0o777) !== 0o600 || !sameFileSnapshot(after, current)) {
|
|
700
682
|
throw new Error(`LaunchAgent plist ${path} changed while it was inspected.`);
|
|
701
683
|
}
|
|
702
|
-
|
|
684
|
+
const identity = [
|
|
703
685
|
String(after.dev),
|
|
704
686
|
String(after.ino),
|
|
705
687
|
String(after.size),
|
|
706
688
|
createHash("sha256").update(contents).digest("hex"),
|
|
707
689
|
].join(":");
|
|
690
|
+
return { identity, contents: contents.toString("utf8") };
|
|
708
691
|
}
|
|
709
692
|
finally {
|
|
710
693
|
await handle.close();
|
|
@@ -883,6 +866,28 @@ export async function stopBackground(target, deps, poll = DEFAULT_CONTROL_POLL)
|
|
|
883
866
|
}
|
|
884
867
|
}
|
|
885
868
|
async function stopBackgroundUnlocked(target, deps, poll) {
|
|
869
|
+
let releaseSharedLogLock;
|
|
870
|
+
try {
|
|
871
|
+
releaseSharedLogLock = await acquireSharedLaunchdLogLock(target, deps, "interactive");
|
|
872
|
+
}
|
|
873
|
+
catch (error) {
|
|
874
|
+
reportLifecycleException(target, deps, "acquire the shared launchd-log mutation lock", error);
|
|
875
|
+
return 1;
|
|
876
|
+
}
|
|
877
|
+
if (releaseSharedLogLock === undefined) {
|
|
878
|
+
deps.stderr(ui.errorLine("Shared launchd-log maintenance is still active for another agent on this account."));
|
|
879
|
+
return 1;
|
|
880
|
+
}
|
|
881
|
+
try {
|
|
882
|
+
return await stopBackgroundWithSharedLogLock(target, deps, poll);
|
|
883
|
+
}
|
|
884
|
+
finally {
|
|
885
|
+
await releaseSharedLogLock().catch((error) => {
|
|
886
|
+
deps.stderr(ui.errorLine(`Could not release the shared launchd-log mutation lock for ${target.label}: ${error instanceof Error ? error.message : String(error)}`));
|
|
887
|
+
});
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
async function stopBackgroundWithSharedLogLock(target, deps, poll) {
|
|
886
891
|
const uid = deps.getuid();
|
|
887
892
|
const maintenance = maintenancePathsForTarget(target);
|
|
888
893
|
const existing = await findInstances(target, deps);
|
|
@@ -949,9 +954,10 @@ async function stopBackgroundUnlocked(target, deps, poll) {
|
|
|
949
954
|
maintenanceIntent = await deps.markLaunchdLogMaintenanceStopped(target.paths, maintenanceIntent);
|
|
950
955
|
}
|
|
951
956
|
await deps.clearLaunchdLogMaintenanceIntent(target.paths, maintenanceIntent);
|
|
957
|
+
await deps.removeLaunchdLogMonitorStatus?.(target);
|
|
952
958
|
}
|
|
953
959
|
catch (error) {
|
|
954
|
-
deps.stderr(ui.errorLine(`Failed to clear pending launchd-log
|
|
960
|
+
deps.stderr(ui.errorLine(`Failed to clear pending launchd-log state for ${target.label}.`));
|
|
955
961
|
deps.stderr(ui.style.dim(error instanceof Error ? error.message : String(error)) + "\n");
|
|
956
962
|
deps.stderr(ui.hint("Both LaunchAgent plists were preserved; retry stop after the owner-private marker is inspectable."));
|
|
957
963
|
return 1;
|
|
@@ -1516,67 +1522,6 @@ function commandFlags(target) {
|
|
|
1516
1522
|
function shellCommandArgument(value) {
|
|
1517
1523
|
return /^[a-zA-Z0-9_./:@%+=,-]+$/u.test(value) ? value : `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
1518
1524
|
}
|
|
1519
|
-
export async function acquireFilesystemLifecycleLock(target, options = {}) {
|
|
1520
|
-
const pid = options.pid ?? process.pid;
|
|
1521
|
-
const now = options.now ?? (() => Date.now());
|
|
1522
|
-
const isProcessAlive = options.isProcessAlive ?? processIsAlive;
|
|
1523
|
-
const ownerlessGraceMs = options.ownerlessGraceMs ?? 5 * 60_000;
|
|
1524
|
-
const randomToken = options.randomToken ?? randomUUID;
|
|
1525
|
-
validateOwnerPrivateLockInputs("Lifecycle lock", pid, ownerlessGraceMs);
|
|
1526
|
-
const managedRoot = dirname(target.paths.logDir);
|
|
1527
|
-
const locksDir = resolve(managedRoot, "locks");
|
|
1528
|
-
for (const path of [managedRoot, locksDir]) {
|
|
1529
|
-
await ensureOwnerPrivateLaunchdDirectory(path);
|
|
1530
|
-
}
|
|
1531
|
-
const lockDir = resolve(locksDir, `${target.label}.lock`);
|
|
1532
|
-
const held = await acquireOwnerPrivateLock({
|
|
1533
|
-
path: lockDir,
|
|
1534
|
-
label: "Lifecycle lock",
|
|
1535
|
-
schemaTag: "mono-agent.filesystem-lifecycle-lock.v1",
|
|
1536
|
-
ownerlessGraceMs,
|
|
1537
|
-
maxAcquireAttempts: 4,
|
|
1538
|
-
pid,
|
|
1539
|
-
now,
|
|
1540
|
-
randomToken,
|
|
1541
|
-
...(options.processIncarnation === undefined ? {} : { processIncarnation: options.processIncarnation }),
|
|
1542
|
-
...(options.isSameProcessIncarnation === undefined
|
|
1543
|
-
? {}
|
|
1544
|
-
: { isSameProcessIncarnation: options.isSameProcessIncarnation }),
|
|
1545
|
-
parseLegacyOwner: (record) => {
|
|
1546
|
-
if (typeof record.pid !== "number" || !Number.isSafeInteger(record.pid) || record.pid <= 0)
|
|
1547
|
-
return undefined;
|
|
1548
|
-
const incarnation = processIncarnationFromJson(record.incarnation);
|
|
1549
|
-
return {
|
|
1550
|
-
pid: record.pid,
|
|
1551
|
-
...(incarnation === undefined ? {} : { incarnation }),
|
|
1552
|
-
};
|
|
1553
|
-
},
|
|
1554
|
-
// Permanent pre-v0.9.0 compatibility: a skipped-version upgrade can
|
|
1555
|
-
// encounter crash debris without incarnation identity indefinitely.
|
|
1556
|
-
// All owner records written since v0.9.0 use the stronger shared schema.
|
|
1557
|
-
allowCurrentUserLegacyOwnerMode: true,
|
|
1558
|
-
isLegacyProcessAlive: isProcessAlive,
|
|
1559
|
-
invalidOwner: "ownerless",
|
|
1560
|
-
livenessError: () => "assume-live",
|
|
1561
|
-
...(options.beforeStaleLockRename === undefined
|
|
1562
|
-
? {}
|
|
1563
|
-
: { beforeStaleRename: options.beforeStaleLockRename }),
|
|
1564
|
-
staleRace: "return",
|
|
1565
|
-
stalePath: ({ now: staleAt, pid: stalePid, token }) => resolve(locksDir, `${target.label}.stale-${staleAt}-${stalePid}-${token}`),
|
|
1566
|
-
releasedPath: ({ now: releasedAt, pid: ownerPid, token }) => resolve(locksDir, `${target.label}.released-${releasedAt}-${ownerPid}-${token}`),
|
|
1567
|
-
abandonedPath: ({ now: abandonedAt, pid: ownerPid, token }) => resolve(locksDir, `${target.label}.abandoned-${abandonedAt}-${ownerPid}-${token}`),
|
|
1568
|
-
});
|
|
1569
|
-
return held === undefined ? undefined : () => held.release();
|
|
1570
|
-
}
|
|
1571
|
-
function processIsAlive(pid) {
|
|
1572
|
-
try {
|
|
1573
|
-
process.kill(pid, 0);
|
|
1574
|
-
return true;
|
|
1575
|
-
}
|
|
1576
|
-
catch (error) {
|
|
1577
|
-
return isErrno(error, "EPERM");
|
|
1578
|
-
}
|
|
1579
|
-
}
|
|
1580
1525
|
async function probeTuiEndpoint(source) {
|
|
1581
1526
|
const baseUrl = tuiEndpoint(source);
|
|
1582
1527
|
if (baseUrl === undefined)
|