@songsid/agend 2.1.12 → 2.2.0-alpha.2
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 +4 -2
- package/README.zh-TW.md +4 -2
- package/dist/agent-cli.js +6 -1
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.js +68 -12
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-token-header.d.ts +13 -0
- package/dist/agent-token-header.js +16 -0
- package/dist/agent-token-header.js.map +1 -0
- package/dist/auth/one-time-code.d.ts +19 -0
- package/dist/auth/one-time-code.js +49 -0
- package/dist/auth/one-time-code.js.map +1 -0
- package/dist/auth-api.d.ts +52 -0
- package/dist/auth-api.js +346 -0
- package/dist/auth-api.js.map +1 -0
- package/dist/backend/antigravity.js +4 -3
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +4 -0
- package/dist/backend/claude-code.js +97 -0
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex.js +59 -30
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok.js +1 -1
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro-agent.d.ts +66 -0
- package/dist/backend/kiro-agent.js +302 -0
- package/dist/backend/kiro-agent.js.map +1 -0
- package/dist/backend/kiro-identity.d.ts +80 -0
- package/dist/backend/kiro-identity.js +537 -0
- package/dist/backend/kiro-identity.js.map +1 -0
- package/dist/backend/kiro-v2-store-worker.d.ts +1 -0
- package/dist/backend/kiro-v2-store-worker.js +87 -0
- package/dist/backend/kiro-v2-store-worker.js.map +1 -0
- package/dist/backend/kiro-v2-store.d.ts +54 -0
- package/dist/backend/kiro-v2-store.js +131 -0
- package/dist/backend/kiro-v2-store.js.map +1 -0
- package/dist/backend/kiro-v3-identity.d.ts +5 -0
- package/dist/backend/kiro-v3-identity.js +22 -0
- package/dist/backend/kiro-v3-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +90 -7
- package/dist/backend/kiro.js +500 -124
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/muse.js +1 -1
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +51 -3
- package/dist/backend/types.js.map +1 -1
- package/dist/cache-analysis.d.ts +92 -0
- package/dist/cache-analysis.js +147 -0
- package/dist/cache-analysis.js.map +1 -0
- package/dist/cache-ledger.d.ts +108 -0
- package/dist/cache-ledger.js +230 -0
- package/dist/cache-ledger.js.map +1 -0
- package/dist/cache-prices.d.ts +32 -0
- package/dist/cache-prices.js +73 -0
- package/dist/cache-prices.js.map +1 -0
- package/dist/cache-scan.d.ts +39 -0
- package/dist/cache-scan.js +115 -0
- package/dist/cache-scan.js.map +1 -0
- package/dist/cache-service.d.ts +115 -0
- package/dist/cache-service.js +417 -0
- package/dist/cache-service.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +1 -0
- package/dist/channel/adapters/discord.js +29 -10
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +1 -0
- package/dist/channel/adapters/telegram.js +13 -1
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/types.d.ts +9 -1
- package/dist/classic-channel-manager.d.ts +18 -10
- package/dist/classic-channel-manager.js +45 -18
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli-entry.d.ts +19 -0
- package/dist/cli-entry.js +36 -0
- package/dist/cli-entry.js.map +1 -0
- package/dist/cli.js +471 -146
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +5 -3
- package/dist/command-table.js +29 -27
- package/dist/command-table.js.map +1 -1
- package/dist/config-validator.js +46 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -1
- package/dist/connection-secrets.d.ts +6 -0
- package/dist/connection-secrets.js +4 -0
- package/dist/connection-secrets.js.map +1 -1
- package/dist/daemon.d.ts +95 -4
- package/dist/daemon.js +748 -111
- package/dist/daemon.js.map +1 -1
- package/dist/darwin-memory.d.ts +6 -1
- package/dist/darwin-memory.js +17 -6
- package/dist/darwin-memory.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +85 -0
- package/dist/delivery-consumed-watch.js +244 -0
- package/dist/delivery-consumed-watch.js.map +1 -0
- package/dist/delivery-outbox.d.ts +61 -0
- package/dist/delivery-outbox.js +120 -2
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +14 -5
- package/dist/delivery-reconciliation.js +27 -4
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/delivery-reconciliation.test.js +35 -1
- package/dist/delivery-reconciliation.test.js.map +1 -1
- package/dist/event-log.d.ts +4 -1
- package/dist/event-log.js +6 -3
- package/dist/event-log.js.map +1 -1
- package/dist/event-loop-watch.d.ts +28 -0
- package/dist/event-loop-watch.js +75 -3
- package/dist/event-loop-watch.js.map +1 -1
- package/dist/fleet-context.d.ts +22 -2
- package/dist/fleet-control-audit.d.ts +5 -0
- package/dist/fleet-control-audit.js +7 -0
- package/dist/fleet-control-audit.js.map +1 -1
- package/dist/fleet-level-config.d.ts +2 -2
- package/dist/fleet-level-config.js +28 -1
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +339 -12
- package/dist/fleet-manager.js +2623 -461
- package/dist/fleet-manager.js.map +1 -1
- package/dist/full-restart.js +2 -3
- package/dist/full-restart.js.map +1 -1
- package/dist/general-knowledge/skills/persona-emoji/SKILL.md +3 -1
- package/dist/host-memory.d.ts +4 -0
- package/dist/host-memory.js.map +1 -1
- package/dist/install-lock.d.ts +49 -0
- package/dist/install-lock.js +200 -0
- package/dist/install-lock.js.map +1 -0
- package/dist/instance-config-impact.js +8 -2
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +10 -5
- package/dist/instance-lifecycle.js +162 -53
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/locale.js +164 -16
- package/dist/locale.js.map +1 -1
- package/dist/login-controller.d.ts +2 -0
- package/dist/login-controller.js +17 -5
- package/dist/login-controller.js.map +1 -1
- package/dist/memory-pressure.d.ts +7 -8
- package/dist/memory-pressure.js +76 -15
- package/dist/memory-pressure.js.map +1 -1
- package/dist/monotonic-budget.d.ts +2 -0
- package/dist/monotonic-budget.js +28 -0
- package/dist/monotonic-budget.js.map +1 -0
- package/dist/needs-you-hub.d.ts +114 -0
- package/dist/needs-you-hub.js +370 -0
- package/dist/needs-you-hub.js.map +1 -0
- package/dist/needs-you-live.d.ts +116 -0
- package/dist/needs-you-live.js +228 -0
- package/dist/needs-you-live.js.map +1 -0
- package/dist/needs-you.d.ts +132 -0
- package/dist/needs-you.js +164 -0
- package/dist/needs-you.js.map +1 -0
- package/dist/node-version-guard.d.ts +30 -0
- package/dist/node-version-guard.js +50 -0
- package/dist/node-version-guard.js.map +1 -0
- package/dist/operator-control-paths.d.ts +4 -0
- package/dist/operator-control-paths.js +24 -0
- package/dist/operator-control-paths.js.map +1 -0
- package/dist/outbound-handlers.d.ts +2 -0
- package/dist/outbound-handlers.js +9 -2
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +5 -5
- package/dist/outbound-schemas.js +1 -1
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/package-preimage.d.ts +26 -0
- package/dist/package-preimage.js +96 -0
- package/dist/package-preimage.js.map +1 -0
- package/dist/profile-control.js +4 -20
- package/dist/profile-control.js.map +1 -1
- package/dist/public-web-gateway.d.ts +18 -0
- package/dist/public-web-gateway.js +141 -0
- package/dist/public-web-gateway.js.map +1 -0
- package/dist/public-web-link.d.ts +53 -0
- package/dist/public-web-link.js +175 -0
- package/dist/public-web-link.js.map +1 -0
- package/dist/quickstart-api.d.ts +8 -1
- package/dist/quickstart-api.js +86 -48
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +1 -0
- package/dist/quickstart.js +16 -6
- package/dist/quickstart.js.map +1 -1
- package/dist/restart-guard.d.ts +52 -0
- package/dist/restart-guard.js +109 -0
- package/dist/restart-guard.js.map +1 -0
- package/dist/scheduler/db.d.ts +7 -1
- package/dist/scheduler/db.js +44 -2
- package/dist/scheduler/db.js.map +1 -1
- package/dist/scheduler/index.d.ts +1 -1
- package/dist/scheduler/retry-label.d.ts +11 -0
- package/dist/scheduler/retry-label.js +24 -0
- package/dist/scheduler/retry-label.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +55 -2
- package/dist/scheduler/scheduler.js +220 -8
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/scheduler/types.d.ts +22 -0
- package/dist/scheduler/types.js.map +1 -1
- package/dist/secret-store.d.ts +5 -0
- package/dist/secret-store.js +20 -0
- package/dist/secret-store.js.map +1 -1
- package/dist/service-activation.d.ts +152 -0
- package/dist/service-activation.js +407 -0
- package/dist/service-activation.js.map +1 -0
- package/dist/service-installer.d.ts +63 -1
- package/dist/service-installer.js +141 -16
- package/dist/service-installer.js.map +1 -1
- package/dist/service-plan.d.ts +65 -0
- package/dist/service-plan.js +108 -0
- package/dist/service-plan.js.map +1 -0
- package/dist/service-restart-selection.d.ts +6 -5
- package/dist/service-restart-selection.js +6 -5
- package/dist/service-restart-selection.js.map +1 -1
- package/dist/settings-api.d.ts +10 -2
- package/dist/settings-api.js +216 -72
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +20 -0
- package/dist/settings-baseline.js +104 -0
- package/dist/settings-baseline.js.map +1 -0
- package/dist/settings-change.d.ts +21 -0
- package/dist/settings-change.js +161 -0
- package/dist/settings-change.js.map +1 -0
- package/dist/settings-confirmation.d.ts +105 -0
- package/dist/settings-confirmation.js +232 -0
- package/dist/settings-confirmation.js.map +1 -0
- package/dist/settings-control.d.ts +41 -0
- package/dist/settings-control.js +294 -0
- package/dist/settings-control.js.map +1 -0
- package/dist/settings-effect.d.ts +24 -0
- package/dist/settings-effect.js +169 -0
- package/dist/settings-effect.js.map +1 -0
- package/dist/settings-http-confirmation.d.ts +29 -0
- package/dist/settings-http-confirmation.js +123 -0
- package/dist/settings-http-confirmation.js.map +1 -0
- package/dist/settings-instance-patch.d.ts +4 -0
- package/dist/settings-instance-patch.js +26 -0
- package/dist/settings-instance-patch.js.map +1 -0
- package/dist/settings-request-capability.d.ts +16 -0
- package/dist/settings-request-capability.js +32 -0
- package/dist/settings-request-capability.js.map +1 -0
- package/dist/settings-transaction.d.ts +65 -0
- package/dist/settings-transaction.js +223 -0
- package/dist/settings-transaction.js.map +1 -0
- package/dist/setup-auth.d.ts +10 -18
- package/dist/setup-auth.js +14 -38
- package/dist/setup-auth.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +75 -18
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-guide.d.ts +13 -0
- package/dist/setup-guide.js +25 -0
- package/dist/setup-guide.js.map +1 -0
- package/dist/setup-host.d.ts +16 -0
- package/dist/setup-host.js +199 -35
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-wizard.js +5 -1
- package/dist/setup-wizard.js.map +1 -1
- package/dist/slash-authz.d.ts +17 -3
- package/dist/slash-authz.js +5 -0
- package/dist/slash-authz.js.map +1 -1
- package/dist/spawn-gate.js +3 -3
- package/dist/spawn-gate.js.map +1 -1
- package/dist/sqlite-open-errors.d.ts +12 -0
- package/dist/sqlite-open-errors.js +13 -0
- package/dist/sqlite-open-errors.js.map +1 -0
- package/dist/statusline-watcher.d.ts +5 -0
- package/dist/statusline-watcher.js +2 -0
- package/dist/statusline-watcher.js.map +1 -1
- package/dist/steer-capability.d.ts +6 -0
- package/dist/steer-capability.js +8 -0
- package/dist/steer-capability.js.map +1 -1
- package/dist/sync-work-attribution.d.ts +14 -0
- package/dist/sync-work-attribution.js +43 -8
- package/dist/sync-work-attribution.js.map +1 -1
- package/dist/tips.js +10 -5
- package/dist/tips.js.map +1 -1
- package/dist/tmux-control.d.ts +57 -5
- package/dist/tmux-control.js +379 -61
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +20 -6
- package/dist/tmux-manager.js +90 -47
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.d.ts +59 -0
- package/dist/tmux-read.js +213 -0
- package/dist/tmux-read.js.map +1 -0
- package/dist/topic-commands.d.ts +21 -10
- package/dist/topic-commands.js +205 -63
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.js +2 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/tunnel/cloudflared-install.d.ts +2 -0
- package/dist/tunnel/cloudflared-install.js +1 -1
- package/dist/tunnel/cloudflared-install.js.map +1 -1
- package/dist/tunnel/purpose-lane.d.ts +14 -0
- package/dist/tunnel/purpose-lane.js +43 -0
- package/dist/tunnel/purpose-lane.js.map +1 -0
- package/dist/turn-reply-guard.d.ts +2 -0
- package/dist/turn-reply-guard.js +10 -1
- package/dist/turn-reply-guard.js.map +1 -1
- package/dist/types.d.ts +33 -0
- package/dist/ui/app.html +18 -0
- package/dist/ui/chat-commands.js +43 -0
- package/dist/ui/chat-render.js +478 -0
- package/dist/ui/chat-store.js +318 -0
- package/dist/ui/chat-strings.js +89 -0
- package/dist/ui/chat-thread.js +246 -0
- package/dist/ui/chat-tour.js +116 -0
- package/dist/ui/fleet-cache.js +168 -0
- package/dist/ui/fleet-org.js +142 -0
- package/dist/ui/panel-chat.js +504 -0
- package/dist/ui/panel-fleet.js +427 -0
- package/dist/ui/panel-needs.js +202 -0
- package/dist/ui/panel-settings.js +754 -0
- package/dist/ui/preview-panel.js +202 -0
- package/dist/ui/preview.js +270 -0
- package/dist/ui/settings-apply.js +239 -0
- package/dist/ui/settings-confirm.js +186 -0
- package/dist/ui/settings-dialogs.js +546 -0
- package/dist/ui/settings-model.js +277 -0
- package/dist/ui/settings-strings.js +654 -0
- package/dist/ui/settings-wizard.js +140 -0
- package/dist/ui/shared/agend-auth.js +93 -0
- package/dist/ui/shared/app-ctx.js +80 -0
- package/dist/ui/shared/app-html.js +9 -0
- package/dist/ui/shared/app-i18n.js +95 -0
- package/dist/ui/shared/app-nav.js +73 -0
- package/dist/ui/shared/app-needs.js +114 -0
- package/dist/ui/shared/app-route.js +73 -0
- package/dist/ui/shared/app-session.js +66 -0
- package/dist/ui/shared/app-shell.js +346 -0
- package/dist/ui/shared/app-store.js +51 -0
- package/dist/ui/shared/app-stream.js +201 -0
- package/dist/ui/shared/app.css +820 -0
- package/dist/ui/shared/app.js +88 -0
- package/dist/ui/shared/fonts/OFL.txt +92 -0
- package/dist/ui/shared/fonts/README.md +21 -0
- package/dist/ui/shared/fonts/inter.woff2 +0 -0
- package/dist/ui/shared/htm.module.js +1 -0
- package/dist/ui/shared/panel-view.js +655 -0
- package/dist/ui/shared/preact-hooks.module.js +2 -0
- package/dist/ui/shared/preact.module.js +2 -0
- package/dist/ui/shared/signin.js +142 -0
- package/dist/ui/shared/theme.js +29 -0
- package/dist/ui/shared/tokens.css +153 -0
- package/dist/ui/shared/ui-confirm.js +43 -0
- package/dist/ui/shared/ui-dialog.js +45 -0
- package/dist/ui/shared/ui-icons.js +63 -0
- package/dist/ui/shared/ui-menu.js +39 -0
- package/dist/ui/shared/ui-states.js +20 -0
- package/dist/ui/shared/ui-toast.js +18 -0
- package/dist/ui/shared/vendor/htm.LICENSE +202 -0
- package/dist/ui/shared/vendor/preact.LICENSE +21 -0
- package/dist/ui/shared/vendor/vendor.json +39 -0
- package/dist/ui/shared/view-strings.js +309 -0
- package/dist/ui/signin.html +52 -0
- package/dist/update-check.d.ts +6 -2
- package/dist/update-check.js +12 -3
- package/dist/update-check.js.map +1 -1
- package/dist/update-dispatch.d.ts +28 -0
- package/dist/update-dispatch.js +73 -0
- package/dist/update-dispatch.js.map +1 -0
- package/dist/update-install.d.ts +129 -0
- package/dist/update-install.js +262 -0
- package/dist/update-install.js.map +1 -0
- package/dist/upgrade-notices.d.ts +17 -0
- package/dist/upgrade-notices.js +93 -0
- package/dist/upgrade-notices.js.map +1 -0
- package/dist/usage/statusline-usage.d.ts +2 -0
- package/dist/usage/statusline-usage.js +14 -10
- package/dist/usage/statusline-usage.js.map +1 -1
- package/dist/view-api.d.ts +6 -1
- package/dist/view-api.js +62 -51
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +85 -14
- package/dist/web-api.js +557 -77
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.d.ts +71 -27
- package/dist/web-auth.js +169 -69
- package/dist/web-auth.js.map +1 -1
- package/dist/web-body.d.ts +3 -0
- package/dist/web-body.js +55 -0
- package/dist/web-body.js.map +1 -0
- package/dist/web-channel-echo.d.ts +9 -0
- package/dist/web-channel-echo.js +55 -0
- package/dist/web-channel-echo.js.map +1 -0
- package/dist/web-chat-history.d.ts +125 -0
- package/dist/web-chat-history.js +184 -0
- package/dist/web-chat-history.js.map +1 -0
- package/dist/web-commands.d.ts +77 -0
- package/dist/web-commands.js +81 -0
- package/dist/web-commands.js.map +1 -0
- package/dist/web-continuation.d.ts +7 -0
- package/dist/web-continuation.js +22 -0
- package/dist/web-continuation.js.map +1 -0
- package/dist/web-host-guard.d.ts +34 -0
- package/dist/web-host-guard.js +57 -1
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-login.d.ts +72 -0
- package/dist/web-login.js +132 -0
- package/dist/web-login.js.map +1 -0
- package/dist/web-org.d.ts +55 -0
- package/dist/web-org.js +67 -0
- package/dist/web-org.js.map +1 -0
- package/dist/web-preview.d.ts +77 -0
- package/dist/web-preview.js +240 -0
- package/dist/web-preview.js.map +1 -0
- package/dist/web-request-context.d.ts +10 -0
- package/dist/web-request-context.js +13 -0
- package/dist/web-request-context.js.map +1 -0
- package/dist/web-session.d.ts +167 -0
- package/dist/web-session.js +389 -0
- package/dist/web-session.js.map +1 -0
- package/dist/web-shell-routes.d.ts +59 -0
- package/dist/web-shell-routes.js +96 -0
- package/dist/web-shell-routes.js.map +1 -0
- package/dist/web-upload.d.ts +183 -0
- package/dist/web-upload.js +468 -0
- package/dist/web-upload.js.map +1 -0
- package/dist/website-tips-renderer.d.ts +2 -2
- package/dist/website-tips-renderer.js +3 -3
- package/dist/website-tips-renderer.js.map +1 -1
- package/launcher/agend +110 -0
- package/launcher/agend-agent +110 -0
- package/launcher/agend-agent.cjs +4 -0
- package/launcher/agend.cjs +4 -0
- package/launcher/install-admission.cjs +105 -0
- package/launcher/launch.cjs +64 -0
- package/launcher/postinstall.cjs +114 -0
- package/launcher/run-in-process.cjs +13 -0
- package/launcher/runtime-platform.cjs +86 -0
- package/launcher/runtime-select.cjs +217 -0
- package/package.json +18 -7
- package/scripts/preinstall-guard.cjs +55 -0
- package/templates/launchd.plist.ejs +2 -2
- package/templates/systemd.service.ejs +1 -1
- package/dist/ui/dashboard.html +0 -774
- package/dist/ui/settings.html +0 -2165
- package/dist/ui/view.html +0 -1139
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Activating a verified install through its service manager (#1449 review r3).
|
|
3
|
+
*
|
|
4
|
+
* The update has proven an exact installed package: its bin target, and the Node that bin's shebang resolves to in the
|
|
5
|
+
* install environment (where the native probe ran). Before anything is stopped, the service manager's EFFECTIVE
|
|
6
|
+
* definition — what systemd has loaded (drop-ins and a failed reload included), what launchd has loaded — must start
|
|
7
|
+
* that exact bin, with `fleet start`, on that exact interpreter, with no environment that changes how Node runs. The
|
|
8
|
+
* disk file alone proves nothing: a drop-in can override `ExecStart`, a reload can fail, launchd keeps its cached job.
|
|
9
|
+
*
|
|
10
|
+
* Every manager command goes through an injected runner, so the sequences are testable without systemd or launchd.
|
|
11
|
+
*/
|
|
12
|
+
import type { CommandResult } from "./update-install.js";
|
|
13
|
+
/** What a manager would execute: the program, its full argv (argv[0] included), and the environment it sets. */
|
|
14
|
+
export interface ActivationTuple {
|
|
15
|
+
program: string;
|
|
16
|
+
argv: string[];
|
|
17
|
+
env: Record<string, string>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The proven install; every path a realpath. `entry` is its canonical inner CLI, `<dir>/dist/cli.js` — what a service
|
|
21
|
+
* starts (#1450 C4). Before the launcher it was also the npm bin; since #1450 the bin is the sh launcher.
|
|
22
|
+
*/
|
|
23
|
+
export interface VerifiedTarget {
|
|
24
|
+
bin: string;
|
|
25
|
+
entry: string;
|
|
26
|
+
node: string;
|
|
27
|
+
dir: string;
|
|
28
|
+
}
|
|
29
|
+
export interface TupleDeps {
|
|
30
|
+
realpath(path: string): string | null;
|
|
31
|
+
/** First line of a file, or null. */
|
|
32
|
+
readFirstLine(path: string): string | null;
|
|
33
|
+
/** Is `path` an executable regular file? */
|
|
34
|
+
isExecutable(path: string): boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Environment that changes which Node runs or what it loads: never accepted in a service definition AgEnD activates,
|
|
38
|
+
* nor in the service manager's own environment (design C6: absent, as `agend install` renders none of them).
|
|
39
|
+
* AGEND_NODE: the launcher's override — with it set, the launcher a definition starts would pick another Node.
|
|
40
|
+
*/
|
|
41
|
+
export declare const INTERPRETER_ENV: string[];
|
|
42
|
+
/**
|
|
43
|
+
* launchd's own environment (`launchctl getenv`), which every job inherits: each interpreter variable must be read to
|
|
44
|
+
* completion and be unset. A failed or timed-out read is uncertainty, never "unset".
|
|
45
|
+
*/
|
|
46
|
+
export declare function launchdManagerEnvViolation(run: (command: string, args: string[]) => CommandResult): string | null;
|
|
47
|
+
/**
|
|
48
|
+
* A PATH whose lookup depends on the working directory: an empty entry (the cwd, for execvp and `command -v`) or a
|
|
49
|
+
* relative one. Which `node` it finds cannot be proven from the definition alone: refused (#1473 review).
|
|
50
|
+
*/
|
|
51
|
+
export declare function cwdDependentPath(path: string): boolean;
|
|
52
|
+
/** systemd's PATH when a unit sets none (systemd.exec, "Environment variables in spawned processes"). */
|
|
53
|
+
export declare const SYSTEMD_DEFAULT_PATH = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
|
|
54
|
+
/** launchd's PATH when a job sets none. */
|
|
55
|
+
export declare const LAUNCHD_DEFAULT_PATH = "/usr/bin:/bin:/usr/sbin:/sbin";
|
|
56
|
+
export interface LoadedUnit {
|
|
57
|
+
/** The one ExecStart, argv exactly as systemd holds it (lossless: D-Bus `as`, not `systemctl show`'s joined text). */
|
|
58
|
+
tuple: ActivationTuple;
|
|
59
|
+
needDaemonReload: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* What systemd will execute for `unit`, read over D-Bus with `busctl --json=short` (#1449 review r4: `systemctl show`
|
|
63
|
+
* joins argv with spaces, so `"fleet start"` and `fleet start` print alike). The effective environment is the
|
|
64
|
+
* manager's environment, then the unit's `Environment=`, then `UnsetEnvironment=`. A unit that also reads
|
|
65
|
+
* `EnvironmentFile=` or uses `PassEnvironment=` cannot be proven from here: refused, never guessed.
|
|
66
|
+
*/
|
|
67
|
+
export declare function readLoadedUnit(run: (command: string, args: string[]) => CommandResult, user: boolean, unit: string): {
|
|
68
|
+
ok: true;
|
|
69
|
+
unit: LoadedUnit;
|
|
70
|
+
} | {
|
|
71
|
+
ok: false;
|
|
72
|
+
reason: string;
|
|
73
|
+
};
|
|
74
|
+
/** A launchd plist on disk → the tuple it would run (ProgramArguments; EnvironmentVariables). */
|
|
75
|
+
export declare function parsePlist(xml: string): ActivationTuple | null;
|
|
76
|
+
/** `launchctl print gui/<uid>/<label>` → the loaded tuple, its pid and state. */
|
|
77
|
+
export declare function parseLaunchctlPrint(text: string): {
|
|
78
|
+
tuple: ActivationTuple | null;
|
|
79
|
+
pid: number | null;
|
|
80
|
+
state: string | null;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Does this effective tuple start exactly the verified install? Two shapes are accepted:
|
|
84
|
+
* - the entry script itself (`<entry> fleet start`, what `agend install` writes today): its realpath is the verified
|
|
85
|
+
* entry, and the interpreter its shebang resolves to on the definition's PATH is the verified Node;
|
|
86
|
+
* - the interpreter explicitly (`<node> <entry> fleet start`, the private runtime's format): both realpaths verified.
|
|
87
|
+
* Anything else — another entry inside the same package, another checkout, extra arguments, NODE_OPTIONS — is not.
|
|
88
|
+
*/
|
|
89
|
+
export declare function tupleStartsVerified(tuple: ActivationTuple, verified: VerifiedTarget, _defaultPath: string, deps: TupleDeps): {
|
|
90
|
+
ok: true;
|
|
91
|
+
} | {
|
|
92
|
+
ok: false;
|
|
93
|
+
reason: string;
|
|
94
|
+
};
|
|
95
|
+
export type ServiceManager = {
|
|
96
|
+
kind: "systemd";
|
|
97
|
+
unit: string;
|
|
98
|
+
user: boolean; /** The unit file: its preimage is put back on a failure (C6). */
|
|
99
|
+
unitPath?: string;
|
|
100
|
+
} | {
|
|
101
|
+
kind: "launchd";
|
|
102
|
+
label: string;
|
|
103
|
+
plistPath: string;
|
|
104
|
+
domain: string;
|
|
105
|
+
} | {
|
|
106
|
+
kind: "detached";
|
|
107
|
+
};
|
|
108
|
+
export interface ActivationDeps extends TupleDeps {
|
|
109
|
+
run(command: string, args: string[]): CommandResult;
|
|
110
|
+
readFile(path: string): string | null;
|
|
111
|
+
writeFile(path: string, content: string): void;
|
|
112
|
+
/** `agend install --no-activate` through the verified binary. */
|
|
113
|
+
refresh(): CommandResult;
|
|
114
|
+
/** `agend restart` through the verified binary (systemd, detached). Returns its exit status. */
|
|
115
|
+
restart(): void;
|
|
116
|
+
log(message: string): void;
|
|
117
|
+
/**
|
|
118
|
+
* launchd planned activation (#1450 C6 path 2): the proven new plist is ALREADY on disk, so the job to roll back to
|
|
119
|
+
* is the recorded preimage plist, not the file. With this set, `refresh` is not called.
|
|
120
|
+
*/
|
|
121
|
+
launchdPreimage?: string;
|
|
122
|
+
/**
|
|
123
|
+
* #1450 C6: put the previous PACKAGE back (its preimage, taken before npm). Called on every failure before the fleet
|
|
124
|
+
* runs the new install — and, on launchd, BEFORE the previous job is bootstrapped again, since that job's plist names
|
|
125
|
+
* files inside the package. Returns one line for the outcome.
|
|
126
|
+
*/
|
|
127
|
+
restorePackage?(): string;
|
|
128
|
+
/** Blocking pause between launchd polls (default: Atomics.wait); tests pass a no-op. */
|
|
129
|
+
sleep?(ms: number): void;
|
|
130
|
+
/** A monotonic clock in ms for poll deadlines (default: performance.now). */
|
|
131
|
+
monotonicNow?(): number;
|
|
132
|
+
}
|
|
133
|
+
/** How long launchd may take to finish unloading a booted-out job, or to spawn a bootstrapped one. */
|
|
134
|
+
export declare const LAUNCHD_SETTLE_MS = 10000;
|
|
135
|
+
/** launchd states of a job that is being spawned (not yet `running`, not failed). */
|
|
136
|
+
export declare const LAUNCHD_SPAWNING: string[];
|
|
137
|
+
export type ActivationOutcome = {
|
|
138
|
+
ok: true;
|
|
139
|
+
via: "restart" | "launchd-activation";
|
|
140
|
+
} | {
|
|
141
|
+
ok: false;
|
|
142
|
+
message: string;
|
|
143
|
+
stopped: boolean;
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Refresh, prove, activate. Nothing is stopped before the effective definition is proven, except where the manager's
|
|
147
|
+
* reload IS the activation (launchd: bootout + bootstrap of a RunAtLoad/KeepAlive job), which is done once, then
|
|
148
|
+
* proven, and rolled back to the preimage job if the proof fails.
|
|
149
|
+
*/
|
|
150
|
+
export declare function activateService(manager: ServiceManager, verified: VerifiedTarget, deps: ActivationDeps): ActivationOutcome;
|
|
151
|
+
/** Two launchd jobs are the same when their program and argv are identical and every variable the plist sets matches. */
|
|
152
|
+
export declare function sameJob(loaded: ActivationTuple, plist: ActivationTuple): boolean;
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
import { systemdWords } from "./service-installer.js";
|
|
2
|
+
/**
|
|
3
|
+
* Environment that changes which Node runs or what it loads: never accepted in a service definition AgEnD activates,
|
|
4
|
+
* nor in the service manager's own environment (design C6: absent, as `agend install` renders none of them).
|
|
5
|
+
* AGEND_NODE: the launcher's override — with it set, the launcher a definition starts would pick another Node.
|
|
6
|
+
*/
|
|
7
|
+
export const INTERPRETER_ENV = ["NODE_OPTIONS", "NODE_PATH", "NODE_EXTRA_CA_CERTS", "AGEND_NODE"];
|
|
8
|
+
/**
|
|
9
|
+
* launchd's own environment (`launchctl getenv`), which every job inherits: each interpreter variable must be read to
|
|
10
|
+
* completion and be unset. A failed or timed-out read is uncertainty, never "unset".
|
|
11
|
+
*/
|
|
12
|
+
export function launchdManagerEnvViolation(run) {
|
|
13
|
+
for (const key of INTERPRETER_ENV) {
|
|
14
|
+
const value = run("launchctl", ["getenv", key]);
|
|
15
|
+
if (value.status === null || value.signal !== null || value.status !== 0) {
|
|
16
|
+
return `launchd's ${key} could not be read (launchctl getenv ${value.signal ? `killed by ${value.signal}` : `exited ${value.status}`})`;
|
|
17
|
+
}
|
|
18
|
+
// Unset prints nothing; a set value prints itself and a newline — even " " (macOS 15). Never trimmed: a blank
|
|
19
|
+
// value is still set, and the launcher refuses it.
|
|
20
|
+
if (value.stdout !== "")
|
|
21
|
+
return `launchd's environment sets ${key} for every job, which changes how Node runs (launchctl unsetenv ${key})`;
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A PATH whose lookup depends on the working directory: an empty entry (the cwd, for execvp and `command -v`) or a
|
|
27
|
+
* relative one. Which `node` it finds cannot be proven from the definition alone: refused (#1473 review).
|
|
28
|
+
*/
|
|
29
|
+
export function cwdDependentPath(path) {
|
|
30
|
+
return path.split(":").some(entry => entry === "" || !entry.startsWith("/"));
|
|
31
|
+
}
|
|
32
|
+
/** systemd's PATH when a unit sets none (systemd.exec, "Environment variables in spawned processes"). */
|
|
33
|
+
export const SYSTEMD_DEFAULT_PATH = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
|
|
34
|
+
/** launchd's PATH when a job sets none. */
|
|
35
|
+
export const LAUNCHD_DEFAULT_PATH = "/usr/bin:/bin:/usr/sbin:/sbin";
|
|
36
|
+
/** A busctl `--json=short` reply's `data`, or null. */
|
|
37
|
+
function busData(result) {
|
|
38
|
+
if (result.status !== 0)
|
|
39
|
+
return null;
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(result.stdout).data ?? null;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** `KEY=VALUE` strings → a map (later entries win, as in systemd). */
|
|
48
|
+
function assignments(list) {
|
|
49
|
+
if (!Array.isArray(list) || !list.every(item => typeof item === "string"))
|
|
50
|
+
return null;
|
|
51
|
+
const env = {};
|
|
52
|
+
for (const item of list) {
|
|
53
|
+
const eq = item.indexOf("=");
|
|
54
|
+
if (eq > 0)
|
|
55
|
+
env[item.slice(0, eq)] = item.slice(eq + 1);
|
|
56
|
+
}
|
|
57
|
+
return env;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* What systemd will execute for `unit`, read over D-Bus with `busctl --json=short` (#1449 review r4: `systemctl show`
|
|
61
|
+
* joins argv with spaces, so `"fleet start"` and `fleet start` print alike). The effective environment is the
|
|
62
|
+
* manager's environment, then the unit's `Environment=`, then `UnsetEnvironment=`. A unit that also reads
|
|
63
|
+
* `EnvironmentFile=` or uses `PassEnvironment=` cannot be proven from here: refused, never guessed.
|
|
64
|
+
*/
|
|
65
|
+
export function readLoadedUnit(run, user, unit) {
|
|
66
|
+
const scope = user ? ["--user"] : [];
|
|
67
|
+
const name = unit.endsWith(".service") ? unit : `${unit}.service`;
|
|
68
|
+
const bus = (args) => busData(run("busctl", [...scope, "--json=short", ...args]));
|
|
69
|
+
const path = bus(["call", "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "LoadUnit", "s", name]);
|
|
70
|
+
const objectPath = Array.isArray(path) && typeof path[0] === "string" ? path[0] : null;
|
|
71
|
+
if (!objectPath)
|
|
72
|
+
return { ok: false, reason: `systemd does not know ${name}` };
|
|
73
|
+
const prop = (iface, property) => bus(["get-property", "org.freedesktop.systemd1", objectPath, `org.freedesktop.systemd1.${iface}`, property]);
|
|
74
|
+
const exec = prop("Service", "ExecStart");
|
|
75
|
+
if (!Array.isArray(exec) || exec.length !== 1 || !Array.isArray(exec[0]) || typeof exec[0][0] !== "string" || !Array.isArray(exec[0][1])) {
|
|
76
|
+
return { ok: false, reason: `its ExecStart is not exactly one command (${Array.isArray(exec) ? exec.length : "unreadable"})` };
|
|
77
|
+
}
|
|
78
|
+
const argv = exec[0][1];
|
|
79
|
+
if (!argv.every(item => typeof item === "string"))
|
|
80
|
+
return { ok: false, reason: "its ExecStart argv is unreadable" };
|
|
81
|
+
const files = prop("Service", "EnvironmentFiles");
|
|
82
|
+
if (!Array.isArray(files))
|
|
83
|
+
return { ok: false, reason: "its EnvironmentFiles cannot be read" };
|
|
84
|
+
if (files.length > 0)
|
|
85
|
+
return { ok: false, reason: "it reads EnvironmentFile=, whose effect cannot be proven here" };
|
|
86
|
+
const pass = prop("Service", "PassEnvironment");
|
|
87
|
+
if (!Array.isArray(pass))
|
|
88
|
+
return { ok: false, reason: "its PassEnvironment cannot be read" };
|
|
89
|
+
if (pass.length > 0)
|
|
90
|
+
return { ok: false, reason: "it uses PassEnvironment=, whose effect cannot be proven here" };
|
|
91
|
+
const manager = assignments(bus(["get-property", "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "Environment"]));
|
|
92
|
+
const own = assignments(prop("Service", "Environment"));
|
|
93
|
+
const unset = prop("Service", "UnsetEnvironment");
|
|
94
|
+
if (!manager || !own || !Array.isArray(unset) || !unset.every(item => typeof item === "string")) {
|
|
95
|
+
return { ok: false, reason: "its environment cannot be read" };
|
|
96
|
+
}
|
|
97
|
+
const env = { ...manager, ...own };
|
|
98
|
+
for (const item of unset) {
|
|
99
|
+
const eq = item.indexOf("=");
|
|
100
|
+
if (eq < 0)
|
|
101
|
+
delete env[item];
|
|
102
|
+
else if (env[item.slice(0, eq)] === item.slice(eq + 1))
|
|
103
|
+
delete env[item.slice(0, eq)];
|
|
104
|
+
}
|
|
105
|
+
const need = prop("Unit", "NeedDaemonReload");
|
|
106
|
+
if (typeof need !== "boolean")
|
|
107
|
+
return { ok: false, reason: "NeedDaemonReload cannot be read" };
|
|
108
|
+
return { ok: true, unit: { tuple: { program: exec[0][0], argv: argv, env }, needDaemonReload: need } };
|
|
109
|
+
}
|
|
110
|
+
/** XML character data → text: the five named entities and numeric references (EJS writes `"` as `"`), in one pass. */
|
|
111
|
+
const xmlUnescape = (text) => text.replace(/&(?:#(\d+)|#x([0-9a-fA-F]+)|(lt|gt|quot|apos|amp));/g, (whole, dec, hex, name) => {
|
|
112
|
+
if (dec !== undefined || hex !== undefined) {
|
|
113
|
+
const code = dec !== undefined ? Number.parseInt(dec, 10) : Number.parseInt(hex, 16);
|
|
114
|
+
return code <= 0x10ffff ? String.fromCodePoint(code) : whole;
|
|
115
|
+
}
|
|
116
|
+
return { lt: "<", gt: ">", quot: "\"", apos: "'", amp: "&" }[name];
|
|
117
|
+
});
|
|
118
|
+
/** A launchd plist on disk → the tuple it would run (ProgramArguments; EnvironmentVariables). */
|
|
119
|
+
export function parsePlist(xml) {
|
|
120
|
+
const args = /<key>ProgramArguments<\/key>\s*<array>([\s\S]*?)<\/array>/.exec(xml);
|
|
121
|
+
if (!args)
|
|
122
|
+
return null;
|
|
123
|
+
const argv = [...args[1].matchAll(/<string>([\s\S]*?)<\/string>/g)].map(m => xmlUnescape(m[1]));
|
|
124
|
+
if (argv.length === 0)
|
|
125
|
+
return null;
|
|
126
|
+
const env = {};
|
|
127
|
+
const dict = /<key>EnvironmentVariables<\/key>\s*<dict>([\s\S]*?)<\/dict>/.exec(xml);
|
|
128
|
+
if (dict)
|
|
129
|
+
for (const m of dict[1].matchAll(/<key>([\s\S]*?)<\/key>\s*<string>([\s\S]*?)<\/string>/g))
|
|
130
|
+
env[xmlUnescape(m[1])] = xmlUnescape(m[2]);
|
|
131
|
+
const program = /<key>Program<\/key>\s*<string>([\s\S]*?)<\/string>/.exec(xml);
|
|
132
|
+
return { program: program ? xmlUnescape(program[1]) : argv[0], argv, env };
|
|
133
|
+
}
|
|
134
|
+
/** `launchctl print gui/<uid>/<label>` → the loaded tuple, its pid and state. */
|
|
135
|
+
export function parseLaunchctlPrint(text) {
|
|
136
|
+
const lines = text.split("\n").map(l => l.trim());
|
|
137
|
+
const value = (key) => lines.find(l => l.startsWith(`${key} = `))?.slice(key.length + 3).trim() ?? null;
|
|
138
|
+
const block = (key) => {
|
|
139
|
+
const start = lines.findIndex(l => l === `${key} = {`);
|
|
140
|
+
if (start < 0)
|
|
141
|
+
return null;
|
|
142
|
+
const end = lines.findIndex((l, i) => i > start && l === "}");
|
|
143
|
+
return end < 0 ? null : lines.slice(start + 1, end);
|
|
144
|
+
};
|
|
145
|
+
const argv = block("arguments");
|
|
146
|
+
const env = {};
|
|
147
|
+
for (const l of block("environment") ?? []) {
|
|
148
|
+
const at = l.indexOf(" => ");
|
|
149
|
+
if (at > 0)
|
|
150
|
+
env[l.slice(0, at)] = l.slice(at + 4);
|
|
151
|
+
}
|
|
152
|
+
const program = value("program");
|
|
153
|
+
const pid = Number(value("pid"));
|
|
154
|
+
return {
|
|
155
|
+
tuple: program && argv && argv.length > 0 ? { program, argv, env } : null,
|
|
156
|
+
pid: Number.isInteger(pid) && pid > 0 ? pid : null,
|
|
157
|
+
state: value("state"),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/** The arguments `fleet start`, as two separate elements (never one "fleet start" argument). */
|
|
161
|
+
const FLEET_START = ["fleet", "start"];
|
|
162
|
+
const sameArgs = (args, want) => args.length === want.length && args.every((arg, i) => arg === want[i]);
|
|
163
|
+
/** The interpreter a script runs on: its shebang, `env node` resolved on the definition's PATH. */
|
|
164
|
+
function scriptInterpreter(script, path, deps) {
|
|
165
|
+
const line = deps.readFirstLine(script);
|
|
166
|
+
if (!line?.startsWith("#!"))
|
|
167
|
+
return null;
|
|
168
|
+
const parts = line.slice(2).trim().split(/\s+/);
|
|
169
|
+
let program = parts[0] ?? "";
|
|
170
|
+
if (/(^|\/)env$/.test(program)) {
|
|
171
|
+
const name = parts.slice(1).find(p => !p.startsWith("-"));
|
|
172
|
+
if (!name)
|
|
173
|
+
return null;
|
|
174
|
+
program = path.split(":").filter(Boolean).map(dir => `${dir}/${name}`).find(candidate => deps.isExecutable(candidate)) ?? "";
|
|
175
|
+
}
|
|
176
|
+
return program ? deps.realpath(program) : null;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Does this effective tuple start exactly the verified install? Two shapes are accepted:
|
|
180
|
+
* - the entry script itself (`<entry> fleet start`, what `agend install` writes today): its realpath is the verified
|
|
181
|
+
* entry, and the interpreter its shebang resolves to on the definition's PATH is the verified Node;
|
|
182
|
+
* - the interpreter explicitly (`<node> <entry> fleet start`, the private runtime's format): both realpaths verified.
|
|
183
|
+
* Anything else — another entry inside the same package, another checkout, extra arguments, NODE_OPTIONS — is not.
|
|
184
|
+
*/
|
|
185
|
+
export function tupleStartsVerified(tuple, verified, _defaultPath, deps) {
|
|
186
|
+
for (const key of INTERPRETER_ENV) {
|
|
187
|
+
if (tuple.env[key] !== undefined)
|
|
188
|
+
return { ok: false, reason: `it sets ${key}` };
|
|
189
|
+
}
|
|
190
|
+
const program = deps.realpath(tuple.program);
|
|
191
|
+
const args = tuple.argv.slice(1);
|
|
192
|
+
// The package's sh launcher (#1450: a system Node is resolved at each start, never named): the Node its PATH finds
|
|
193
|
+
// must be the verified one — for a bundled runtime it never is (the runtime directory is on no PATH), so such a
|
|
194
|
+
// target is always named instead.
|
|
195
|
+
if (program === verified.bin && verified.bin !== verified.entry && /\/launcher\/agend$/.test(verified.bin)) {
|
|
196
|
+
if (!sameArgs(args, FLEET_START))
|
|
197
|
+
return { ok: false, reason: `its arguments are ${JSON.stringify(args)}, not ["fleet","start"]` };
|
|
198
|
+
if (tuple.env.PATH === undefined)
|
|
199
|
+
return { ok: false, reason: "its environment has no PATH, so the Node its launcher would find cannot be proven" };
|
|
200
|
+
if (cwdDependentPath(tuple.env.PATH))
|
|
201
|
+
return { ok: false, reason: "its PATH has an empty or relative entry, so the Node its launcher would find depends on the working directory" };
|
|
202
|
+
const found = tuple.env.PATH.split(":").filter(Boolean).map(dir => `${dir}/node`).find(candidate => deps.isExecutable(candidate));
|
|
203
|
+
const real = found ? deps.realpath(found) : null;
|
|
204
|
+
if (real !== verified.node)
|
|
205
|
+
return { ok: false, reason: `its launcher would find ${real ?? "no node"}, not the verified ${verified.node}` };
|
|
206
|
+
return { ok: true };
|
|
207
|
+
}
|
|
208
|
+
if (program === verified.entry) {
|
|
209
|
+
if (!sameArgs(args, FLEET_START))
|
|
210
|
+
return { ok: false, reason: `its arguments are ${JSON.stringify(args)}, not ["fleet","start"]` };
|
|
211
|
+
// PATH must be in the definition's effective environment: with none (e.g. UnsetEnvironment=PATH), `env node`
|
|
212
|
+
// searches execvp's built-in path (glibc: /bin:/usr/bin), not any manager default — unprovable here (#1449 r5).
|
|
213
|
+
if (tuple.env.PATH === undefined)
|
|
214
|
+
return { ok: false, reason: "its environment has no PATH, so the Node its `env node` would find cannot be proven" };
|
|
215
|
+
if (cwdDependentPath(tuple.env.PATH))
|
|
216
|
+
return { ok: false, reason: "its PATH has an empty or relative entry, so the Node its `env node` would find depends on the working directory" };
|
|
217
|
+
const interpreter = scriptInterpreter(verified.entry, tuple.env.PATH, deps);
|
|
218
|
+
if (interpreter !== verified.node)
|
|
219
|
+
return { ok: false, reason: `its Node is ${interpreter ?? "unresolvable"}, not the verified ${verified.node}` };
|
|
220
|
+
return { ok: true };
|
|
221
|
+
}
|
|
222
|
+
if (program === verified.node) {
|
|
223
|
+
const entry = args[0] ? deps.realpath(args[0]) : null;
|
|
224
|
+
if (entry !== verified.entry)
|
|
225
|
+
return { ok: false, reason: `it starts ${args[0] ?? "nothing"}, not ${verified.entry}` };
|
|
226
|
+
if (!sameArgs(args.slice(1), FLEET_START))
|
|
227
|
+
return { ok: false, reason: `its arguments are ${JSON.stringify(args.slice(1))}, not ["fleet","start"]` };
|
|
228
|
+
return { ok: true };
|
|
229
|
+
}
|
|
230
|
+
return { ok: false, reason: `it starts ${tuple.program} (${program ?? "missing"}), not ${verified.entry}` };
|
|
231
|
+
}
|
|
232
|
+
/** How long launchd may take to finish unloading a booted-out job, or to spawn a bootstrapped one. */
|
|
233
|
+
export const LAUNCHD_SETTLE_MS = 10_000;
|
|
234
|
+
/** launchd states of a job that is being spawned (not yet `running`, not failed). */
|
|
235
|
+
export const LAUNCHD_SPAWNING = ["spawn scheduled", "xpcproxy"];
|
|
236
|
+
/**
|
|
237
|
+
* Refresh, prove, activate. Nothing is stopped before the effective definition is proven, except where the manager's
|
|
238
|
+
* reload IS the activation (launchd: bootout + bootstrap of a RunAtLoad/KeepAlive job), which is done once, then
|
|
239
|
+
* proven, and rolled back to the preimage job if the proof fails.
|
|
240
|
+
*/
|
|
241
|
+
export function activateService(manager, verified, deps) {
|
|
242
|
+
if (manager.kind === "detached") {
|
|
243
|
+
const refreshed = deps.refresh();
|
|
244
|
+
if (refreshed.status !== 0)
|
|
245
|
+
deps.log(" ⚠ Service file refresh reported an error (no service installed; continuing)");
|
|
246
|
+
deps.restart();
|
|
247
|
+
return { ok: true, via: "restart" };
|
|
248
|
+
}
|
|
249
|
+
if (manager.kind === "systemd") {
|
|
250
|
+
const scope = manager.user ? ["--user"] : [];
|
|
251
|
+
const preimage = manager.unitPath ? deps.readFile(manager.unitPath) : null;
|
|
252
|
+
// C6 step 5, a failure before the restart: the unit preimage goes back and is reloaded, and the LOADED ExecStart
|
|
253
|
+
// must be the preimage's again; then the package preimage. The old fleet was never stopped.
|
|
254
|
+
const fail = (why) => {
|
|
255
|
+
const restored = [];
|
|
256
|
+
if (preimage !== null && manager.unitPath) {
|
|
257
|
+
deps.writeFile(manager.unitPath, preimage);
|
|
258
|
+
const reloaded = deps.run("systemctl", [...scope, "daemon-reload"]);
|
|
259
|
+
const back = reloaded.status === 0 ? readLoadedUnit(deps.run, manager.user, manager.unit) : null;
|
|
260
|
+
const want = systemdWords(/^ExecStart=(.*)$/m.exec(preimage)?.[1] ?? "");
|
|
261
|
+
restored.push(back?.ok && sameArgs(back.unit.tuple.argv, want)
|
|
262
|
+
? `the previous ${manager.unit} is back and loaded`
|
|
263
|
+
: `the previous ${manager.unit} is back on disk but systemd does not show it loaded (run systemctl${manager.user ? " --user" : ""} daemon-reload)`);
|
|
264
|
+
}
|
|
265
|
+
if (deps.restorePackage)
|
|
266
|
+
restored.push(deps.restorePackage());
|
|
267
|
+
return { ok: false, stopped: false, message: ` ✗ ${why}. Not restarting the fleet.${restored.length ? ` ${restored.join("; ")}.` : ""}` };
|
|
268
|
+
};
|
|
269
|
+
const refreshed = deps.refresh();
|
|
270
|
+
if (refreshed.status !== 0)
|
|
271
|
+
deps.log(` ⚠ Service file refresh failed: ${(refreshed.stderr || refreshed.stdout).trim()}`);
|
|
272
|
+
const reload = deps.run("systemctl", [...scope, "daemon-reload"]);
|
|
273
|
+
if (reload.status !== 0)
|
|
274
|
+
return fail(`systemctl${manager.user ? " --user" : ""} daemon-reload failed, so systemd still runs the old definition`);
|
|
275
|
+
const read = readLoadedUnit(deps.run, manager.user, manager.unit);
|
|
276
|
+
if (!read.ok)
|
|
277
|
+
return fail(`Cannot prove what systemd will run for ${manager.unit}: ${read.reason}`);
|
|
278
|
+
const loaded = read.unit;
|
|
279
|
+
if (loaded.needDaemonReload)
|
|
280
|
+
return fail(`systemd still needs a daemon-reload for ${manager.unit} (the loaded definition is not the file)`);
|
|
281
|
+
const match = tupleStartsVerified(loaded.tuple, verified, SYSTEMD_DEFAULT_PATH, deps);
|
|
282
|
+
if (!match.ok)
|
|
283
|
+
return fail(`systemd's loaded ${manager.unit} does not start the verified install: ${match.reason}`);
|
|
284
|
+
deps.restart();
|
|
285
|
+
return { ok: true, via: "restart" };
|
|
286
|
+
}
|
|
287
|
+
// launchd: the reload is the activation (#1449 review r4).
|
|
288
|
+
// Before anything is stopped: the job launchd has LOADED must be the one its plist on disk describes, so that this
|
|
289
|
+
// plist is a true preimage to roll back to; launchd's own environment must not inject NODE_OPTIONS/NODE_PATH; and
|
|
290
|
+
// the refreshed plist must start the verified install. Then one bootout + bootstrap, proven by the loaded tuple and
|
|
291
|
+
// a running pid. Recovery bootstraps the preimage and must prove ITS tuple is what runs — not just any pid.
|
|
292
|
+
const target = `${manager.domain}/${manager.label}`;
|
|
293
|
+
// Every read must COMPLETE (#1449 r5): a timed-out or failed query is uncertainty, never "unset" or "not loaded".
|
|
294
|
+
const completed = (r) => r.status !== null && r.signal === null;
|
|
295
|
+
// Every refusal below comes after npm replaced the package: each one puts the previous package back (C6).
|
|
296
|
+
const packageBack = () => (deps.restorePackage ? ` ${deps.restorePackage()}.` : "");
|
|
297
|
+
const managerEnv = launchdManagerEnvViolation(deps.run);
|
|
298
|
+
if (managerEnv)
|
|
299
|
+
return { ok: false, stopped: false, message: ` ✗ ${managerEnv}. Not activating; the service was not changed.${packageBack()}` };
|
|
300
|
+
const preimage = deps.launchdPreimage ?? deps.readFile(manager.plistPath);
|
|
301
|
+
const preimageTuple = preimage !== null ? parsePlist(preimage) : null;
|
|
302
|
+
// The loaded job, or a CONFIRMED absence: launchctl print exits 113 ("Could not find service") for a job that is not
|
|
303
|
+
// loaded. Anything else that is not a complete, readable job is uncertainty: refuse with nothing touched.
|
|
304
|
+
const before = deps.run("launchctl", ["print", target]);
|
|
305
|
+
let loadedBefore = null;
|
|
306
|
+
if (completed(before) && before.status === 0) {
|
|
307
|
+
loadedBefore = parseLaunchctlPrint(before.stdout);
|
|
308
|
+
if (!loadedBefore.tuple) {
|
|
309
|
+
return { ok: false, stopped: false, message: ` ✗ launchctl print of ${manager.label} could not be read. Not activating; the service was not changed.${packageBack()}` };
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
else if (!(completed(before) && before.status === 113)) {
|
|
313
|
+
return { ok: false, stopped: false, message: ` ✗ Could not tell whether ${manager.label} is loaded (launchctl print ${before.signal ? `killed by ${before.signal}` : `exited ${before.status}`}). Not activating; the service was not changed.${packageBack()}` };
|
|
314
|
+
}
|
|
315
|
+
if (loadedBefore && (!loadedBefore.tuple || !preimageTuple || !sameJob(loadedBefore.tuple, preimageTuple))) {
|
|
316
|
+
return { ok: false, stopped: false, message: ` ✗ The job launchd has loaded for ${manager.label} is not the one ${manager.plistPath} describes, so there is no job to roll back to safely. Not activating; reload it (agend install, agend restart) first.${packageBack()}` };
|
|
317
|
+
}
|
|
318
|
+
if (deps.launchdPreimage === undefined) {
|
|
319
|
+
const refreshed = deps.refresh();
|
|
320
|
+
if (refreshed.status !== 0)
|
|
321
|
+
deps.log(` ⚠ Service file refresh failed: ${(refreshed.stderr || refreshed.stdout).trim()}`);
|
|
322
|
+
}
|
|
323
|
+
const onDisk = deps.readFile(manager.plistPath);
|
|
324
|
+
const diskTuple = onDisk ? parsePlist(onDisk) : null;
|
|
325
|
+
const diskMatch = diskTuple ? tupleStartsVerified(diskTuple, verified, LAUNCHD_DEFAULT_PATH, deps) : { ok: false, reason: "the plist cannot be read" };
|
|
326
|
+
if (!diskMatch.ok) {
|
|
327
|
+
if (preimage !== null && onDisk !== preimage)
|
|
328
|
+
deps.writeFile(manager.plistPath, preimage);
|
|
329
|
+
return { ok: false, stopped: false, message: ` ✗ ${manager.plistPath} does not start the verified install: ${diskMatch.reason}. Restored the previous plist; not restarting the fleet.${packageBack()}` };
|
|
330
|
+
}
|
|
331
|
+
// `launchctl bootout` returns before launchd has finished unloading the job (seen on macOS 15: a bootstrap right
|
|
332
|
+
// after it fails with 5, EIO, and a second bootout still finds the job). So: wait — bounded, on a monotonic clock —
|
|
333
|
+
// until launchd reports the job gone (print → 113) before bootstrapping; and after a bootstrap, wait out the brief
|
|
334
|
+
// spawning states (LAUNCHD_SPAWNING) before judging what runs.
|
|
335
|
+
const sleep = deps.sleep ?? ((ms) => { Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms); });
|
|
336
|
+
const clock = deps.monotonicNow ?? (() => performance.now());
|
|
337
|
+
const awaitUnloaded = () => {
|
|
338
|
+
const deadline = clock() + LAUNCHD_SETTLE_MS;
|
|
339
|
+
for (;;) {
|
|
340
|
+
const p = deps.run("launchctl", ["print", target]);
|
|
341
|
+
if (completed(p) && p.status === 113)
|
|
342
|
+
return true;
|
|
343
|
+
if (clock() >= deadline)
|
|
344
|
+
return false;
|
|
345
|
+
sleep(100);
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
const awaitStarted = () => {
|
|
349
|
+
const deadline = clock() + LAUNCHD_SETTLE_MS;
|
|
350
|
+
for (;;) {
|
|
351
|
+
const p = deps.run("launchctl", ["print", target]);
|
|
352
|
+
const state = completed(p) && p.status === 0 ? parseLaunchctlPrint(p.stdout) : null;
|
|
353
|
+
// Transitional states right after a bootstrap (macOS 15 shows `xpcproxy` with the pid for a few ms).
|
|
354
|
+
const settling = state !== null && (LAUNCHD_SPAWNING.includes(state.state ?? "") || (state.state === "running" && !state.pid));
|
|
355
|
+
if (!settling || clock() >= deadline)
|
|
356
|
+
return p;
|
|
357
|
+
sleep(100);
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
let unloaded = true;
|
|
361
|
+
if (loadedBefore) {
|
|
362
|
+
const out = deps.run("launchctl", ["bootout", target]);
|
|
363
|
+
if (!completed(out) || out.status !== 0) {
|
|
364
|
+
// The old job may well still be running: leave it, put its plist back.
|
|
365
|
+
if (preimage !== null)
|
|
366
|
+
deps.writeFile(manager.plistPath, preimage);
|
|
367
|
+
return { ok: false, stopped: false, message: ` ✗ launchctl bootout of ${manager.label} did not complete (${out.signal ? `killed by ${out.signal}` : `exit ${out.status}`}). Restored the previous plist; not activating.${packageBack()}` };
|
|
368
|
+
}
|
|
369
|
+
unloaded = awaitUnloaded();
|
|
370
|
+
}
|
|
371
|
+
const boot = unloaded ? deps.run("launchctl", ["bootstrap", manager.domain, manager.plistPath]) : null;
|
|
372
|
+
const after = boot && completed(boot) && boot.status === 0 ? awaitStarted() : null;
|
|
373
|
+
const printed = after && completed(after) && after.status === 0 ? parseLaunchctlPrint(after.stdout) : null;
|
|
374
|
+
const loadedMatch = printed?.tuple ? tupleStartsVerified(printed.tuple, verified, LAUNCHD_DEFAULT_PATH, deps) : null;
|
|
375
|
+
if (printed?.pid && printed.state === "running" && loadedMatch?.ok)
|
|
376
|
+
return { ok: true, via: "launchd-activation" };
|
|
377
|
+
// Roll back: whatever loaded goes; the preimage plist goes back on disk; the preimage job comes back only if one was
|
|
378
|
+
// running before, and only counts as restored when launchd runs exactly its tuple.
|
|
379
|
+
deps.run("launchctl", ["bootout", target]);
|
|
380
|
+
const goneForRecovery = awaitUnloaded();
|
|
381
|
+
if (preimage !== null)
|
|
382
|
+
deps.writeFile(manager.plistPath, preimage);
|
|
383
|
+
// The previous job's plist names files inside the package: the package goes back BEFORE that job is bootstrapped.
|
|
384
|
+
const pkgLine = packageBack();
|
|
385
|
+
let recovery = "No job was running before; the previous plist is back on disk.";
|
|
386
|
+
if (loadedBefore && preimageTuple) {
|
|
387
|
+
const reboot = goneForRecovery ? deps.run("launchctl", ["bootstrap", manager.domain, manager.plistPath]) : null;
|
|
388
|
+
const check = reboot && completed(reboot) && reboot.status === 0 ? awaitStarted() : null;
|
|
389
|
+
const back = check && completed(check) && check.status === 0 ? parseLaunchctlPrint(check.stdout) : null;
|
|
390
|
+
recovery = back?.tuple && back.pid && back.state === "running" && sameJob(back.tuple, preimageTuple)
|
|
391
|
+
? "Rolled back to the previous job, which is running."
|
|
392
|
+
: "The previous job could NOT be restored: run agend install and agend start.";
|
|
393
|
+
}
|
|
394
|
+
const why = !boot ? `launchd did not finish unloading the previous job within ${LAUNCHD_SETTLE_MS / 1000}s`
|
|
395
|
+
: !completed(boot) || boot.status !== 0 ? "launchctl bootstrap failed"
|
|
396
|
+
: !printed ? "launchctl print of the new job did not complete"
|
|
397
|
+
: !printed.pid || printed.state !== "running" ? "the job did not start"
|
|
398
|
+
: `launchd loaded a job that ${loadedMatch && !loadedMatch.ok ? loadedMatch.reason : "cannot be read"}`;
|
|
399
|
+
return { ok: false, stopped: loadedBefore !== null, message: ` ✗ Activating the new launchd job failed: ${why}. ${recovery}${pkgLine}` };
|
|
400
|
+
}
|
|
401
|
+
/** Two launchd jobs are the same when their program and argv are identical and every variable the plist sets matches. */
|
|
402
|
+
export function sameJob(loaded, plist) {
|
|
403
|
+
return loaded.program === plist.program
|
|
404
|
+
&& sameArgs(loaded.argv, plist.argv)
|
|
405
|
+
&& Object.entries(plist.env).every(([key, value]) => loaded.env[key] === value);
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=service-activation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-activation.js","sourceRoot":"","sources":["../src/service-activation.ts"],"names":[],"mappings":"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"}
|