@omnitron-dev/omnitron 0.3.0 → 0.3.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 +579 -0
- package/data/operations/managed-kernel.mjs +302 -0
- package/data/operations/stage-kernel.mjs +125 -0
- package/dist/BUILD.json +4 -3
- package/dist/cli/exit-after-output.d.ts +3 -0
- package/dist/cli/exit-after-output.d.ts.map +1 -0
- package/dist/cli/exit-after-output.js +11 -0
- package/dist/cli/exit-after-output.js.map +1 -0
- package/dist/cli/installed.d.ts +3 -0
- package/dist/cli/installed.d.ts.map +1 -0
- package/dist/cli/installed.js +17 -0
- package/dist/cli/installed.js.map +1 -0
- package/dist/cli/omnitron.js +455 -99
- package/dist/cli/omnitron.js.map +1 -1
- package/dist/cli/output-command.d.ts +13 -0
- package/dist/cli/output-command.d.ts.map +1 -0
- package/dist/cli/output-command.js +48 -0
- package/dist/cli/output-command.js.map +1 -0
- package/dist/cluster/cluster.rpc-service.d.ts +9 -77
- package/dist/cluster/cluster.rpc-service.d.ts.map +1 -1
- package/dist/cluster/cluster.rpc-service.js +20 -107
- package/dist/cluster/cluster.rpc-service.js.map +1 -1
- package/dist/cluster/enrollment.d.ts +9 -0
- package/dist/cluster/enrollment.d.ts.map +1 -0
- package/dist/cluster/enrollment.js +49 -0
- package/dist/cluster/enrollment.js.map +1 -0
- package/dist/cluster/index.d.ts +1 -1
- package/dist/cluster/index.d.ts.map +1 -1
- package/dist/cluster/leader-election.d.ts +39 -211
- package/dist/cluster/leader-election.d.ts.map +1 -1
- package/dist/cluster/leader-election.js +235 -512
- package/dist/cluster/leader-election.js.map +1 -1
- package/dist/cluster/mesh-link.d.ts +18 -51
- package/dist/cluster/mesh-link.d.ts.map +1 -1
- package/dist/cluster/mesh-link.js +66 -78
- package/dist/cluster/mesh-link.js.map +1 -1
- package/dist/cluster/mesh.d.ts +3 -1
- package/dist/cluster/mesh.d.ts.map +1 -1
- package/dist/cluster/mesh.js +76 -60
- package/dist/cluster/mesh.js.map +1 -1
- package/dist/cluster/slave-connector.d.ts +42 -6
- package/dist/cluster/slave-connector.d.ts.map +1 -1
- package/dist/cluster/slave-connector.js +349 -196
- package/dist/cluster/slave-connector.js.map +1 -1
- package/dist/cluster/standalone-infrastructure.d.ts +3 -0
- package/dist/cluster/standalone-infrastructure.d.ts.map +1 -0
- package/dist/cluster/standalone-infrastructure.js +25 -0
- package/dist/cluster/standalone-infrastructure.js.map +1 -0
- package/dist/cluster/stop-authority.d.ts +45 -0
- package/dist/cluster/stop-authority.d.ts.map +1 -0
- package/dist/cluster/stop-authority.js +112 -0
- package/dist/cluster/stop-authority.js.map +1 -0
- package/dist/commands/access.d.ts +9 -0
- package/dist/commands/access.d.ts.map +1 -0
- package/dist/commands/access.js +45 -0
- package/dist/commands/access.js.map +1 -0
- package/dist/commands/audit.d.ts +2 -0
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +9 -4
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/backend.d.ts +17 -0
- package/dist/commands/backend.d.ts.map +1 -0
- package/dist/commands/backend.js +264 -0
- package/dist/commands/backend.js.map +1 -0
- package/dist/commands/backup.d.ts +5 -0
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +17 -2
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/cluster.d.ts.map +1 -1
- package/dist/commands/cluster.js +33 -42
- package/dist/commands/cluster.js.map +1 -1
- package/dist/commands/daemon-cmd.d.ts.map +1 -1
- package/dist/commands/daemon-cmd.js +14 -3
- package/dist/commands/daemon-cmd.js.map +1 -1
- package/dist/commands/deploy.d.ts +4 -4
- package/dist/commands/deploy.js +4 -4
- package/dist/commands/discover.d.ts +2 -2
- package/dist/commands/discover.js +2 -2
- package/dist/commands/doctor.d.ts +11 -29
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +47 -45
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/files.d.ts +19 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +226 -0
- package/dist/commands/files.js.map +1 -0
- package/dist/commands/fleet-asking.d.ts +2 -2
- package/dist/commands/fleet-asking.js +2 -2
- package/dist/commands/fleet-recover.d.ts +2 -0
- package/dist/commands/fleet-recover.d.ts.map +1 -0
- package/dist/commands/fleet-recover.js +30 -0
- package/dist/commands/fleet-recover.js.map +1 -0
- package/dist/commands/fleet-rollout.d.ts +25 -0
- package/dist/commands/fleet-rollout.d.ts.map +1 -0
- package/dist/commands/fleet-rollout.js +155 -0
- package/dist/commands/fleet-rollout.js.map +1 -0
- package/dist/commands/fleet.d.ts.map +1 -1
- package/dist/commands/fleet.js +1 -0
- package/dist/commands/fleet.js.map +1 -1
- package/dist/commands/health-check.d.ts.map +1 -1
- package/dist/commands/health-check.js +13 -6
- package/dist/commands/health-check.js.map +1 -1
- package/dist/commands/host-ingress.d.ts +3 -0
- package/dist/commands/host-ingress.d.ts.map +1 -0
- package/dist/commands/host-ingress.js +31 -0
- package/dist/commands/host-ingress.js.map +1 -0
- package/dist/commands/infra.d.ts +7 -4
- package/dist/commands/infra.d.ts.map +1 -1
- package/dist/commands/infra.js +152 -60
- package/dist/commands/infra.js.map +1 -1
- package/dist/commands/logs.d.ts +7 -24
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +117 -41
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/metrics.d.ts.map +1 -1
- package/dist/commands/metrics.js +7 -1
- package/dist/commands/metrics.js.map +1 -1
- package/dist/commands/migrate.d.ts +8 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +64 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/node-reconcile.d.ts +8 -0
- package/dist/commands/node-reconcile.d.ts.map +1 -0
- package/dist/commands/node-reconcile.js +49 -0
- package/dist/commands/node-reconcile.js.map +1 -0
- package/dist/commands/node.d.ts +1 -21
- package/dist/commands/node.d.ts.map +1 -1
- package/dist/commands/node.js +35 -27
- package/dist/commands/node.js.map +1 -1
- package/dist/commands/output.d.ts +3 -9
- package/dist/commands/output.d.ts.map +1 -1
- package/dist/commands/output.js +34 -25
- package/dist/commands/output.js.map +1 -1
- package/dist/commands/pipeline.d.ts +11 -2
- package/dist/commands/pipeline.d.ts.map +1 -1
- package/dist/commands/pipeline.js +82 -15
- package/dist/commands/pipeline.js.map +1 -1
- package/dist/commands/project.d.ts +10 -2
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +69 -3
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/release-store.js +1 -1
- package/dist/commands/release-store.js.map +1 -1
- package/dist/commands/release.d.ts +5 -12
- package/dist/commands/release.d.ts.map +1 -1
- package/dist/commands/release.js +144 -36
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/remote.d.ts +3 -3
- package/dist/commands/remote.js +3 -3
- package/dist/commands/scale.d.ts +1 -4
- package/dist/commands/scale.d.ts.map +1 -1
- package/dist/commands/scale.js +39 -19
- package/dist/commands/scale.js.map +1 -1
- package/dist/commands/secret-input.d.ts +3 -0
- package/dist/commands/secret-input.d.ts.map +1 -0
- package/dist/commands/secret-input.js +36 -0
- package/dist/commands/secret-input.js.map +1 -0
- package/dist/commands/secret.d.ts +4 -2
- package/dist/commands/secret.d.ts.map +1 -1
- package/dist/commands/secret.js +12 -2
- package/dist/commands/secret.js.map +1 -1
- package/dist/commands/service-resident.d.ts +25 -0
- package/dist/commands/service-resident.d.ts.map +1 -0
- package/dist/commands/service-resident.js +236 -0
- package/dist/commands/service-resident.js.map +1 -0
- package/dist/commands/service-units.d.ts +13 -1
- package/dist/commands/service-units.d.ts.map +1 -1
- package/dist/commands/service-units.js +38 -16
- package/dist/commands/service-units.js.map +1 -1
- package/dist/commands/service.d.ts +2 -24
- package/dist/commands/service.d.ts.map +1 -1
- package/dist/commands/service.js +89 -7
- package/dist/commands/service.js.map +1 -1
- package/dist/commands/stack.d.ts +11 -6
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +212 -38
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/start.d.ts +0 -21
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +33 -43
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts +1 -5
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +5 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.d.ts +0 -22
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +26 -86
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/system.d.ts +4 -0
- package/dist/commands/system.d.ts.map +1 -0
- package/dist/commands/system.js +41 -0
- package/dist/commands/system.js.map +1 -0
- package/dist/commands/terminal.d.ts +7 -0
- package/dist/commands/terminal.d.ts.map +1 -0
- package/dist/commands/terminal.js +184 -0
- package/dist/commands/terminal.js.map +1 -0
- package/dist/commands/topology.d.ts +3 -0
- package/dist/commands/topology.d.ts.map +1 -0
- package/dist/commands/topology.js +107 -0
- package/dist/commands/topology.js.map +1 -0
- package/dist/commands/tor.d.ts +1 -1
- package/dist/commands/tor.js +2 -2
- package/dist/commands/up.d.ts +4 -54
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +41 -98
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/webapp.d.ts +0 -9
- package/dist/commands/webapp.d.ts.map +1 -1
- package/dist/commands/webapp.js +116 -69
- package/dist/commands/webapp.js.map +1 -1
- package/dist/config/app-path.d.ts +4 -0
- package/dist/config/app-path.d.ts.map +1 -0
- package/dist/config/app-path.js +6 -0
- package/dist/config/app-path.js.map +1 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +9 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/define-ecosystem.d.ts.map +1 -1
- package/dist/config/define-ecosystem.js +12 -0
- package/dist/config/define-ecosystem.js.map +1 -1
- package/dist/config/index.d.ts +3 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/loader-child.d.ts +2 -0
- package/dist/config/loader-child.d.ts.map +1 -0
- package/dist/config/loader-child.js +56 -0
- package/dist/config/loader-child.js.map +1 -0
- package/dist/config/loader.d.ts +7 -2
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +14 -27
- package/dist/config/loader.js.map +1 -1
- package/dist/config/saved.d.ts +67 -0
- package/dist/config/saved.d.ts.map +1 -0
- package/dist/config/saved.js +81 -0
- package/dist/config/saved.js.map +1 -0
- package/dist/config/types.d.ts +105 -58
- package/dist/config/types.d.ts.map +1 -1
- package/dist/daemon/backend-candidate.d.ts +32 -0
- package/dist/daemon/backend-candidate.d.ts.map +1 -0
- package/dist/daemon/backend-candidate.js +129 -0
- package/dist/daemon/backend-candidate.js.map +1 -0
- package/dist/daemon/backend-child.d.ts +5 -0
- package/dist/daemon/backend-child.d.ts.map +1 -0
- package/dist/daemon/backend-child.js +13 -0
- package/dist/daemon/backend-child.js.map +1 -0
- package/dist/daemon/backend-control.d.ts +43 -0
- package/dist/daemon/backend-control.d.ts.map +1 -0
- package/dist/daemon/backend-control.js +155 -0
- package/dist/daemon/backend-control.js.map +1 -0
- package/dist/daemon/backend-crash-recovery.d.ts +4 -0
- package/dist/daemon/backend-crash-recovery.d.ts.map +1 -0
- package/dist/daemon/backend-crash-recovery.js +136 -0
- package/dist/daemon/backend-crash-recovery.js.map +1 -0
- package/dist/daemon/backend-handoff-types.d.ts +27 -0
- package/dist/daemon/backend-handoff-types.d.ts.map +1 -0
- package/dist/daemon/backend-handoff-types.js +33 -0
- package/dist/daemon/backend-handoff-types.js.map +1 -0
- package/dist/daemon/backend-recovery-journal.d.ts +30 -0
- package/dist/daemon/backend-recovery-journal.d.ts.map +1 -0
- package/dist/daemon/backend-recovery-journal.js +67 -0
- package/dist/daemon/backend-recovery-journal.js.map +1 -0
- package/dist/daemon/backend-recovery-monitor.d.ts +35 -0
- package/dist/daemon/backend-recovery-monitor.d.ts.map +1 -0
- package/dist/daemon/backend-recovery-monitor.js +113 -0
- package/dist/daemon/backend-recovery-monitor.js.map +1 -0
- package/dist/daemon/backend-supervisor-entry.d.ts +2 -0
- package/dist/daemon/backend-supervisor-entry.d.ts.map +1 -0
- package/dist/daemon/backend-supervisor-entry.js +3 -0
- package/dist/daemon/backend-supervisor-entry.js.map +1 -0
- package/dist/daemon/backend-supervisor-main.d.ts +2 -0
- package/dist/daemon/backend-supervisor-main.d.ts.map +1 -0
- package/dist/daemon/backend-supervisor-main.js +45 -0
- package/dist/daemon/backend-supervisor-main.js.map +1 -0
- package/dist/daemon/backend-supervisor.d.ts +61 -0
- package/dist/daemon/backend-supervisor.d.ts.map +1 -0
- package/dist/daemon/backend-supervisor.js +339 -0
- package/dist/daemon/backend-supervisor.js.map +1 -0
- package/dist/daemon/backend-upgrade.d.ts +41 -0
- package/dist/daemon/backend-upgrade.d.ts.map +1 -0
- package/dist/daemon/backend-upgrade.js +444 -0
- package/dist/daemon/backend-upgrade.js.map +1 -0
- package/dist/daemon/backend.rpc-service.d.ts +11 -0
- package/dist/daemon/backend.rpc-service.d.ts.map +1 -0
- package/dist/daemon/backend.rpc-service.js +44 -0
- package/dist/daemon/backend.rpc-service.js.map +1 -0
- package/dist/daemon/daemon-client.d.ts +12 -79
- package/dist/daemon/daemon-client.d.ts.map +1 -1
- package/dist/daemon/daemon-client.js +28 -270
- package/dist/daemon/daemon-client.js.map +1 -1
- package/dist/daemon/daemon-entry.d.ts +0 -7
- package/dist/daemon/daemon-entry.d.ts.map +1 -1
- package/dist/daemon/daemon-entry.js +2 -115
- package/dist/daemon/daemon-entry.js.map +1 -1
- package/dist/daemon/daemon-main.d.ts +9 -0
- package/dist/daemon/daemon-main.d.ts.map +1 -0
- package/dist/daemon/daemon-main.js +105 -0
- package/dist/daemon/daemon-main.js.map +1 -0
- package/dist/daemon/daemon-scheduler.d.ts +8 -5
- package/dist/daemon/daemon-scheduler.d.ts.map +1 -1
- package/dist/daemon/daemon-scheduler.js +45 -73
- package/dist/daemon/daemon-scheduler.js.map +1 -1
- package/dist/daemon/daemon-state-store.service.d.ts +5 -39
- package/dist/daemon/daemon-state-store.service.d.ts.map +1 -1
- package/dist/daemon/daemon-state-store.service.js +30 -17
- package/dist/daemon/daemon-state-store.service.js.map +1 -1
- package/dist/daemon/daemon.d.ts +50 -79
- package/dist/daemon/daemon.d.ts.map +1 -1
- package/dist/daemon/daemon.js +769 -442
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/daemon.module.d.ts +13 -11
- package/dist/daemon/daemon.module.d.ts.map +1 -1
- package/dist/daemon/daemon.module.js +139 -106
- package/dist/daemon/daemon.module.js.map +1 -1
- package/dist/daemon/daemon.rpc-service.d.ts +11 -19
- package/dist/daemon/daemon.rpc-service.d.ts.map +1 -1
- package/dist/daemon/daemon.rpc-service.js +89 -28
- package/dist/daemon/daemon.rpc-service.js.map +1 -1
- package/dist/daemon/darwin-owner-evidence.d.ts +57 -0
- package/dist/daemon/darwin-owner-evidence.d.ts.map +1 -0
- package/dist/daemon/darwin-owner-evidence.js +131 -0
- package/dist/daemon/darwin-owner-evidence.js.map +1 -0
- package/dist/daemon/database-startup.d.ts +7 -0
- package/dist/daemon/database-startup.d.ts.map +1 -0
- package/dist/daemon/database-startup.js +40 -0
- package/dist/daemon/database-startup.js.map +1 -0
- package/dist/daemon/entry-guard.d.ts +2 -0
- package/dist/daemon/entry-guard.d.ts.map +1 -0
- package/dist/daemon/entry-guard.js +34 -0
- package/dist/daemon/entry-guard.js.map +1 -0
- package/dist/daemon/execution-capabilities.d.ts +7 -0
- package/dist/daemon/execution-capabilities.d.ts.map +1 -0
- package/dist/daemon/execution-capabilities.js +23 -0
- package/dist/daemon/execution-capabilities.js.map +1 -0
- package/dist/daemon/execution-client.d.ts +88 -0
- package/dist/daemon/execution-client.d.ts.map +1 -0
- package/dist/daemon/execution-client.js +433 -0
- package/dist/daemon/execution-client.js.map +1 -0
- package/dist/daemon/execution-config.d.ts +7 -0
- package/dist/daemon/execution-config.d.ts.map +1 -0
- package/dist/daemon/execution-config.js +61 -0
- package/dist/daemon/execution-config.js.map +1 -0
- package/dist/daemon/execution-entry.d.ts +2 -0
- package/dist/daemon/execution-entry.d.ts.map +1 -0
- package/dist/daemon/execution-entry.js +3 -0
- package/dist/daemon/execution-entry.js.map +1 -0
- package/dist/daemon/execution-host.d.ts +133 -0
- package/dist/daemon/execution-host.d.ts.map +1 -0
- package/dist/daemon/execution-host.js +308 -0
- package/dist/daemon/execution-host.js.map +1 -0
- package/dist/daemon/execution-journal.d.ts +17 -0
- package/dist/daemon/execution-journal.d.ts.map +1 -0
- package/dist/daemon/execution-journal.js +75 -0
- package/dist/daemon/execution-journal.js.map +1 -0
- package/dist/daemon/execution-launcher.d.ts +12 -0
- package/dist/daemon/execution-launcher.d.ts.map +1 -0
- package/dist/daemon/execution-launcher.js +110 -0
- package/dist/daemon/execution-launcher.js.map +1 -0
- package/dist/daemon/execution-main.d.ts +2 -0
- package/dist/daemon/execution-main.d.ts.map +1 -0
- package/dist/daemon/execution-main.js +48 -0
- package/dist/daemon/execution-main.js.map +1 -0
- package/dist/daemon/execution-owner.d.ts +16 -0
- package/dist/daemon/execution-owner.d.ts.map +1 -0
- package/dist/daemon/execution-owner.js +97 -0
- package/dist/daemon/execution-owner.js.map +1 -0
- package/dist/daemon/execution-platform.d.ts +3 -0
- package/dist/daemon/execution-platform.d.ts.map +1 -0
- package/dist/daemon/execution-platform.js +23 -0
- package/dist/daemon/execution-platform.js.map +1 -0
- package/dist/daemon/execution-shutdown.d.ts +13 -0
- package/dist/daemon/execution-shutdown.d.ts.map +1 -0
- package/dist/daemon/execution-shutdown.js +30 -0
- package/dist/daemon/execution-shutdown.js.map +1 -0
- package/dist/daemon/managed-entry.d.ts +2 -0
- package/dist/daemon/managed-entry.d.ts.map +1 -0
- package/dist/daemon/managed-entry.js +3 -0
- package/dist/daemon/managed-entry.js.map +1 -0
- package/dist/daemon/managed-main.d.ts +2 -0
- package/dist/daemon/managed-main.d.ts.map +1 -0
- package/dist/daemon/managed-main.js +29 -0
- package/dist/daemon/managed-main.js.map +1 -0
- package/dist/daemon/managed-owner-build.d.ts +17 -0
- package/dist/daemon/managed-owner-build.d.ts.map +1 -0
- package/dist/daemon/managed-owner-build.js +108 -0
- package/dist/daemon/managed-owner-build.js.map +1 -0
- package/dist/daemon/managed-owner-entry.d.ts +2 -0
- package/dist/daemon/managed-owner-entry.d.ts.map +1 -0
- package/dist/daemon/managed-owner-entry.js +3 -0
- package/dist/daemon/managed-owner-entry.js.map +1 -0
- package/dist/daemon/managed-owner-main.d.ts +2 -0
- package/dist/daemon/managed-owner-main.d.ts.map +1 -0
- package/dist/daemon/managed-owner-main.js +53 -0
- package/dist/daemon/managed-owner-main.js.map +1 -0
- package/dist/daemon/managed-runtime.d.ts +39 -0
- package/dist/daemon/managed-runtime.d.ts.map +1 -0
- package/dist/daemon/managed-runtime.js +137 -0
- package/dist/daemon/managed-runtime.js.map +1 -0
- package/dist/daemon/network-publication.d.ts +5 -0
- package/dist/daemon/network-publication.d.ts.map +1 -0
- package/dist/daemon/network-publication.js +25 -0
- package/dist/daemon/network-publication.js.map +1 -0
- package/dist/daemon/owner-reconciliation.d.ts +58 -0
- package/dist/daemon/owner-reconciliation.d.ts.map +1 -0
- package/dist/daemon/owner-reconciliation.js +265 -0
- package/dist/daemon/owner-reconciliation.js.map +1 -0
- package/dist/daemon/pid-manager.d.ts +2 -0
- package/dist/daemon/pid-manager.d.ts.map +1 -1
- package/dist/daemon/pid-manager.js +5 -0
- package/dist/daemon/pid-manager.js.map +1 -1
- package/dist/daemon/private-control-client.d.ts +8 -0
- package/dist/daemon/private-control-client.d.ts.map +1 -0
- package/dist/daemon/private-control-client.js +41 -0
- package/dist/daemon/private-control-client.js.map +1 -0
- package/dist/daemon/recovery-state.d.ts +20 -0
- package/dist/daemon/recovery-state.d.ts.map +1 -0
- package/dist/daemon/recovery-state.js +53 -0
- package/dist/daemon/recovery-state.js.map +1 -0
- package/dist/daemon/rpc-connection.d.ts +29 -0
- package/dist/daemon/rpc-connection.d.ts.map +1 -0
- package/dist/daemon/rpc-connection.js +137 -0
- package/dist/daemon/rpc-connection.js.map +1 -0
- package/dist/daemon/runtime-installation.d.ts +58 -0
- package/dist/daemon/runtime-installation.d.ts.map +1 -0
- package/dist/daemon/runtime-installation.js +346 -0
- package/dist/daemon/runtime-installation.js.map +1 -0
- package/dist/daemon/runtime-launcher.d.ts +6 -0
- package/dist/daemon/runtime-launcher.d.ts.map +1 -0
- package/dist/daemon/runtime-launcher.js +45 -0
- package/dist/daemon/runtime-launcher.js.map +1 -0
- package/dist/daemon/schema-transition.d.ts +43 -0
- package/dist/daemon/schema-transition.d.ts.map +1 -0
- package/dist/daemon/schema-transition.js +239 -0
- package/dist/daemon/schema-transition.js.map +1 -0
- package/dist/daemon/spawn-daemon.d.ts +2 -0
- package/dist/daemon/spawn-daemon.d.ts.map +1 -1
- package/dist/daemon/spawn-daemon.js +4 -0
- package/dist/daemon/spawn-daemon.js.map +1 -1
- package/dist/daemon/startup-config.d.ts +77 -0
- package/dist/daemon/startup-config.d.ts.map +1 -0
- package/dist/daemon/startup-config.js +31 -0
- package/dist/daemon/startup-config.js.map +1 -0
- package/dist/daemon/startup-failure-journal.d.ts +3 -0
- package/dist/daemon/startup-failure-journal.d.ts.map +1 -0
- package/dist/daemon/startup-failure-journal.js +29 -0
- package/dist/daemon/startup-failure-journal.js.map +1 -0
- package/dist/daemon/state-store.d.ts +16 -24
- package/dist/daemon/state-store.d.ts.map +1 -1
- package/dist/daemon/state-store.js +51 -9
- package/dist/daemon/state-store.js.map +1 -1
- package/dist/daemon/supervisor-transition.d.ts +101 -0
- package/dist/daemon/supervisor-transition.d.ts.map +1 -0
- package/dist/daemon/supervisor-transition.js +503 -0
- package/dist/daemon/supervisor-transition.js.map +1 -0
- package/dist/daemon/system-guardian-cgroup.d.ts +16 -0
- package/dist/daemon/system-guardian-cgroup.d.ts.map +1 -0
- package/dist/daemon/system-guardian-cgroup.js +202 -0
- package/dist/daemon/system-guardian-cgroup.js.map +1 -0
- package/dist/daemon/system-guardian-unit.d.ts +9 -0
- package/dist/daemon/system-guardian-unit.d.ts.map +1 -0
- package/dist/daemon/system-guardian-unit.js +41 -0
- package/dist/daemon/system-guardian-unit.js.map +1 -0
- package/dist/database/connection.d.ts.map +1 -1
- package/dist/database/connection.js +2 -6
- package/dist/database/connection.js.map +1 -1
- package/dist/database/log-durability.d.ts +5 -0
- package/dist/database/log-durability.d.ts.map +1 -0
- package/dist/database/log-durability.js +28 -0
- package/dist/database/log-durability.js.map +1 -0
- package/dist/database/migrate.js +2 -15
- package/dist/database/migrate.js.map +1 -1
- package/dist/database/migration-registry-compatibility.d.ts +13 -0
- package/dist/database/migration-registry-compatibility.d.ts.map +1 -0
- package/dist/database/migration-registry-compatibility.js +108 -0
- package/dist/database/migration-registry-compatibility.js.map +1 -0
- package/dist/database/migration-runner.d.ts +8 -42
- package/dist/database/migration-runner.d.ts.map +1 -1
- package/dist/database/migration-runner.js +114 -123
- package/dist/database/migration-runner.js.map +1 -1
- package/dist/database/migrations/014_replication_receipts.d.ts +5 -0
- package/dist/database/migrations/014_replication_receipts.d.ts.map +1 -0
- package/dist/database/migrations/014_replication_receipts.js +6 -0
- package/dist/database/migrations/014_replication_receipts.js.map +1 -0
- package/dist/database/migrations/015_persistent_metrics.d.ts +5 -0
- package/dist/database/migrations/015_persistent_metrics.d.ts.map +1 -0
- package/dist/database/migrations/015_persistent_metrics.js +7 -0
- package/dist/database/migrations/015_persistent_metrics.js.map +1 -0
- package/dist/database/migrations/016_cluster_lease.d.ts +4 -0
- package/dist/database/migrations/016_cluster_lease.d.ts.map +1 -0
- package/dist/database/migrations/016_cluster_lease.js +6 -0
- package/dist/database/migrations/016_cluster_lease.js.map +1 -0
- package/dist/database/migrations/index.d.ts +1 -1
- package/dist/database/migrations/index.d.ts.map +1 -1
- package/dist/database/migrations/index.js +22 -13
- package/dist/database/migrations/index.js.map +1 -1
- package/dist/database/schema-compatibility.d.ts +34 -0
- package/dist/database/schema-compatibility.d.ts.map +1 -0
- package/dist/database/schema-compatibility.js +109 -0
- package/dist/database/schema-compatibility.js.map +1 -0
- package/dist/database/schema-expansion-policy.d.ts +10 -0
- package/dist/database/schema-expansion-policy.d.ts.map +1 -0
- package/dist/database/schema-expansion-policy.js +21 -0
- package/dist/database/schema-expansion-policy.js.map +1 -0
- package/dist/database/schema-transition-plan.d.ts +53 -0
- package/dist/database/schema-transition-plan.d.ts.map +1 -0
- package/dist/database/schema-transition-plan.js +102 -0
- package/dist/database/schema-transition-plan.js.map +1 -0
- package/dist/database/schema-worker.d.ts +2 -0
- package/dist/database/schema-worker.d.ts.map +1 -0
- package/dist/database/schema-worker.js +55 -0
- package/dist/database/schema-worker.js.map +1 -0
- package/dist/database/schema.d.ts +6 -1
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/slave-migrations/001_replication_evidence.d.ts +4 -0
- package/dist/database/slave-migrations/001_replication_evidence.d.ts.map +1 -0
- package/dist/database/slave-migrations/001_replication_evidence.js +89 -0
- package/dist/database/slave-migrations/001_replication_evidence.js.map +1 -0
- package/dist/database/slave-migrations/index.d.ts +6 -0
- package/dist/database/slave-migrations/index.d.ts.map +1 -0
- package/dist/database/slave-migrations/index.js +10 -0
- package/dist/database/slave-migrations/index.js.map +1 -0
- package/dist/diagnostics/index.d.ts +16 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +22 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/execution/command-failure.d.ts +7 -0
- package/dist/execution/command-failure.d.ts.map +1 -0
- package/dist/execution/command-failure.js +29 -0
- package/dist/execution/command-failure.js.map +1 -0
- package/dist/execution/data-channel.d.ts +1 -1
- package/dist/execution/data-channel.js +1 -1
- package/dist/execution/execution.service.d.ts +16 -4
- package/dist/execution/execution.service.d.ts.map +1 -1
- package/dist/execution/execution.service.js +133 -74
- package/dist/execution/execution.service.js.map +1 -1
- package/dist/files/archive-codec.d.ts +57 -0
- package/dist/files/archive-codec.d.ts.map +1 -0
- package/dist/files/archive-codec.js +454 -0
- package/dist/files/archive-codec.js.map +1 -0
- package/dist/files/archive-node.d.ts +27 -0
- package/dist/files/archive-node.d.ts.map +1 -0
- package/dist/files/archive-node.js +379 -0
- package/dist/files/archive-node.js.map +1 -0
- package/dist/files/archive-publication.d.ts +26 -0
- package/dist/files/archive-publication.d.ts.map +1 -0
- package/dist/files/archive-publication.js +224 -0
- package/dist/files/archive-publication.js.map +1 -0
- package/dist/files/file-config.d.ts +7 -0
- package/dist/files/file-config.d.ts.map +1 -0
- package/dist/files/file-config.js +11 -0
- package/dist/files/file-config.js.map +1 -0
- package/dist/files/file-node.d.ts +65 -0
- package/dist/files/file-node.d.ts.map +1 -0
- package/dist/files/file-node.js +863 -0
- package/dist/files/file-node.js.map +1 -0
- package/dist/files/file-node.rpc-service.d.ts +12 -0
- package/dist/files/file-node.rpc-service.d.ts.map +1 -0
- package/dist/files/file-node.rpc-service.js +42 -0
- package/dist/files/file-node.rpc-service.js.map +1 -0
- package/dist/files/files.rpc-service.d.ts +107 -0
- package/dist/files/files.rpc-service.d.ts.map +1 -0
- package/dist/files/files.rpc-service.js +769 -0
- package/dist/files/files.rpc-service.js.map +1 -0
- package/dist/files/structural-policy.d.ts +3 -0
- package/dist/files/structural-policy.d.ts.map +1 -0
- package/dist/files/structural-policy.js +27 -0
- package/dist/files/structural-policy.js.map +1 -0
- package/dist/health/contracts.d.ts +30 -0
- package/dist/health/contracts.d.ts.map +1 -0
- package/dist/health/contracts.js +58 -0
- package/dist/health/contracts.js.map +1 -0
- package/dist/health/heartbeat.d.ts +11 -0
- package/dist/health/heartbeat.d.ts.map +1 -0
- package/dist/health/heartbeat.js +32 -0
- package/dist/health/heartbeat.js.map +1 -0
- package/dist/health/index.d.ts +4 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +2 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/readiness.d.ts +15 -0
- package/dist/health/readiness.d.ts.map +1 -0
- package/dist/health/readiness.js +170 -0
- package/dist/health/readiness.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/infrastructure/apt-packages.d.ts +34 -0
- package/dist/infrastructure/apt-packages.d.ts.map +1 -0
- package/dist/infrastructure/apt-packages.js +232 -0
- package/dist/infrastructure/apt-packages.js.map +1 -0
- package/dist/infrastructure/bare-metal-plan.d.ts +10 -1
- package/dist/infrastructure/bare-metal-plan.d.ts.map +1 -1
- package/dist/infrastructure/bare-metal-plan.js +22 -1
- package/dist/infrastructure/bare-metal-plan.js.map +1 -1
- package/dist/infrastructure/bare-metal-runner.d.ts.map +1 -1
- package/dist/infrastructure/bare-metal-runner.js +13 -2
- package/dist/infrastructure/bare-metal-runner.js.map +1 -1
- package/dist/infrastructure/config-normalizer.d.ts +4 -3
- package/dist/infrastructure/config-normalizer.d.ts.map +1 -1
- package/dist/infrastructure/config-normalizer.js +11 -3
- package/dist/infrastructure/config-normalizer.js.map +1 -1
- package/dist/infrastructure/config-payload.d.ts +4 -4
- package/dist/infrastructure/config-payload.js +4 -4
- package/dist/infrastructure/container-runtime.d.ts +39 -13
- package/dist/infrastructure/container-runtime.d.ts.map +1 -1
- package/dist/infrastructure/container-runtime.js +276 -84
- package/dist/infrastructure/container-runtime.js.map +1 -1
- package/dist/infrastructure/gateway-redis-db.d.ts +2 -2
- package/dist/infrastructure/gateway-redis-db.js +2 -2
- package/dist/infrastructure/health-recovery.d.ts +19 -0
- package/dist/infrastructure/health-recovery.d.ts.map +1 -0
- package/dist/infrastructure/health-recovery.js +39 -0
- package/dist/infrastructure/health-recovery.js.map +1 -0
- package/dist/infrastructure/host-ingress-config.d.ts +12 -0
- package/dist/infrastructure/host-ingress-config.d.ts.map +1 -0
- package/dist/infrastructure/host-ingress-config.js +200 -0
- package/dist/infrastructure/host-ingress-config.js.map +1 -0
- package/dist/infrastructure/host-ingress-lock.d.ts +3 -0
- package/dist/infrastructure/host-ingress-lock.d.ts.map +1 -0
- package/dist/infrastructure/host-ingress-lock.js +2 -0
- package/dist/infrastructure/host-ingress-lock.js.map +1 -0
- package/dist/infrastructure/host-ingress-runtime.d.ts +25 -0
- package/dist/infrastructure/host-ingress-runtime.d.ts.map +1 -0
- package/dist/infrastructure/host-ingress-runtime.js +114 -0
- package/dist/infrastructure/host-ingress-runtime.js.map +1 -0
- package/dist/infrastructure/host-ingress-takeover.d.ts +18 -0
- package/dist/infrastructure/host-ingress-takeover.d.ts.map +1 -0
- package/dist/infrastructure/host-ingress-takeover.js +142 -0
- package/dist/infrastructure/host-ingress-takeover.js.map +1 -0
- package/dist/infrastructure/host-ingress-types.d.ts +175 -0
- package/dist/infrastructure/host-ingress-types.d.ts.map +1 -0
- package/dist/infrastructure/host-ingress-types.js +2 -0
- package/dist/infrastructure/host-ingress-types.js.map +1 -0
- package/dist/infrastructure/host-ingress.service.d.ts +47 -0
- package/dist/infrastructure/host-ingress.service.d.ts.map +1 -0
- package/dist/infrastructure/host-ingress.service.js +514 -0
- package/dist/infrastructure/host-ingress.service.js.map +1 -0
- package/dist/infrastructure/host-inspection.d.ts +1 -0
- package/dist/infrastructure/host-inspection.d.ts.map +1 -1
- package/dist/infrastructure/host-inspection.js +3 -2
- package/dist/infrastructure/host-inspection.js.map +1 -1
- package/dist/infrastructure/infrastructure.service.d.ts +101 -34
- package/dist/infrastructure/infrastructure.service.d.ts.map +1 -1
- package/dist/infrastructure/infrastructure.service.js +631 -205
- package/dist/infrastructure/infrastructure.service.js.map +1 -1
- package/dist/infrastructure/merge-config.d.ts +10 -0
- package/dist/infrastructure/merge-config.d.ts.map +1 -0
- package/dist/infrastructure/merge-config.js +27 -0
- package/dist/infrastructure/merge-config.js.map +1 -0
- package/dist/infrastructure/orphan-containers.d.ts +8 -7
- package/dist/infrastructure/orphan-containers.d.ts.map +1 -1
- package/dist/infrastructure/orphan-containers.js +7 -7
- package/dist/infrastructure/orphan-containers.js.map +1 -1
- package/dist/infrastructure/owned-container.d.ts +4 -0
- package/dist/infrastructure/owned-container.d.ts.map +1 -0
- package/dist/infrastructure/owned-container.js +13 -0
- package/dist/infrastructure/owned-container.js.map +1 -0
- package/dist/infrastructure/phantom-endpoint-janitor.d.ts +4 -1
- package/dist/infrastructure/phantom-endpoint-janitor.d.ts.map +1 -1
- package/dist/infrastructure/phantom-endpoint-janitor.js +11 -2
- package/dist/infrastructure/phantom-endpoint-janitor.js.map +1 -1
- package/dist/infrastructure/presets/minio.d.ts.map +1 -1
- package/dist/infrastructure/presets/minio.js +15 -25
- package/dist/infrastructure/presets/minio.js.map +1 -1
- package/dist/infrastructure/presets/postgres.d.ts.map +1 -1
- package/dist/infrastructure/presets/postgres.js +35 -31
- package/dist/infrastructure/presets/postgres.js.map +1 -1
- package/dist/infrastructure/presets/tor.d.ts +1 -2
- package/dist/infrastructure/presets/tor.d.ts.map +1 -1
- package/dist/infrastructure/presets/tor.js +7 -13
- package/dist/infrastructure/presets/tor.js.map +1 -1
- package/dist/infrastructure/provisioning-outcome.d.ts +8 -1
- package/dist/infrastructure/provisioning-outcome.d.ts.map +1 -1
- package/dist/infrastructure/provisioning-outcome.js +42 -9
- package/dist/infrastructure/provisioning-outcome.js.map +1 -1
- package/dist/infrastructure/service-binding.js +1 -1
- package/dist/infrastructure/service-resolver.d.ts +11 -5
- package/dist/infrastructure/service-resolver.d.ts.map +1 -1
- package/dist/infrastructure/service-resolver.js +109 -54
- package/dist/infrastructure/service-resolver.js.map +1 -1
- package/dist/infrastructure/shipped-config.js +4 -4
- package/dist/infrastructure/stack-infra-manager.d.ts +35 -5
- package/dist/infrastructure/stack-infra-manager.d.ts.map +1 -1
- package/dist/infrastructure/stack-infra-manager.js +227 -57
- package/dist/infrastructure/stack-infra-manager.js.map +1 -1
- package/dist/infrastructure/types.d.ts +68 -9
- package/dist/infrastructure/types.d.ts.map +1 -1
- package/dist/mcp/mcp-bridge.js +1 -1
- package/dist/mcp/mcp-bridge.js.map +1 -1
- package/dist/mcp/monitoring-reading.d.ts +18 -0
- package/dist/mcp/monitoring-reading.d.ts.map +1 -0
- package/dist/mcp/monitoring-reading.js +84 -0
- package/dist/mcp/monitoring-reading.js.map +1 -0
- package/dist/mcp/tool-groups/apps.tools.d.ts.map +1 -1
- package/dist/mcp/tool-groups/apps.tools.js +6 -4
- package/dist/mcp/tool-groups/apps.tools.js.map +1 -1
- package/dist/mcp/tool-groups/management.tools.d.ts +2 -0
- package/dist/mcp/tool-groups/management.tools.d.ts.map +1 -1
- package/dist/mcp/tool-groups/management.tools.js +17 -38
- package/dist/mcp/tool-groups/management.tools.js.map +1 -1
- package/dist/mcp/tool-groups/monitoring.tools.d.ts.map +1 -1
- package/dist/mcp/tool-groups/monitoring.tools.js +45 -2
- package/dist/mcp/tool-groups/monitoring.tools.js.map +1 -1
- package/dist/mcp/unavailable-tools.js +2 -2
- package/dist/mcp/unavailable-tools.js.map +1 -1
- package/dist/migration/configuration.d.ts +8 -0
- package/dist/migration/configuration.d.ts.map +1 -0
- package/dist/migration/configuration.js +16 -0
- package/dist/migration/configuration.js.map +1 -0
- package/dist/migration/index.d.ts +25 -0
- package/dist/migration/index.d.ts.map +1 -0
- package/dist/migration/index.js +27 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/operation.d.ts +31 -0
- package/dist/migration/operation.d.ts.map +1 -0
- package/dist/migration/operation.js +67 -0
- package/dist/migration/operation.js.map +1 -0
- package/dist/migration/workspace.d.ts +28 -0
- package/dist/migration/workspace.d.ts.map +1 -0
- package/dist/migration/workspace.js +91 -0
- package/dist/migration/workspace.js.map +1 -0
- package/dist/monitoring/app-health.indicator.d.ts +1 -1
- package/dist/monitoring/app-health.indicator.d.ts.map +1 -1
- package/dist/monitoring/docker-health.indicator.d.ts +4 -2
- package/dist/monitoring/docker-health.indicator.d.ts.map +1 -1
- package/dist/monitoring/docker-health.indicator.js +66 -5
- package/dist/monitoring/docker-health.indicator.js.map +1 -1
- package/dist/monitoring/event-loop-watch.d.ts.map +1 -1
- package/dist/monitoring/event-loop-watch.js.map +1 -1
- package/dist/monitoring/infrastructure-health.d.ts +15 -0
- package/dist/monitoring/infrastructure-health.d.ts.map +1 -0
- package/dist/monitoring/infrastructure-health.js +2 -0
- package/dist/monitoring/infrastructure-health.js.map +1 -0
- package/dist/monitoring/log-entry.d.ts +7 -0
- package/dist/monitoring/log-entry.d.ts.map +1 -0
- package/dist/monitoring/log-entry.js +16 -0
- package/dist/monitoring/log-entry.js.map +1 -0
- package/dist/monitoring/log-journal.d.ts +40 -0
- package/dist/monitoring/log-journal.d.ts.map +1 -0
- package/dist/monitoring/log-journal.js +158 -0
- package/dist/monitoring/log-journal.js.map +1 -0
- package/dist/monitoring/log-line.d.ts +22 -17
- package/dist/monitoring/log-line.d.ts.map +1 -1
- package/dist/monitoring/log-line.js +73 -62
- package/dist/monitoring/log-line.js.map +1 -1
- package/dist/monitoring/log-manager.d.ts +37 -40
- package/dist/monitoring/log-manager.d.ts.map +1 -1
- package/dist/monitoring/log-manager.js +167 -66
- package/dist/monitoring/log-manager.js.map +1 -1
- package/dist/monitoring/log-sink-health.indicator.d.ts +10 -0
- package/dist/monitoring/log-sink-health.indicator.d.ts.map +1 -0
- package/dist/monitoring/log-sink-health.indicator.js +21 -0
- package/dist/monitoring/log-sink-health.indicator.js.map +1 -0
- package/dist/monitoring/metrics-storage.indicator.d.ts +9 -0
- package/dist/monitoring/metrics-storage.indicator.d.ts.map +1 -0
- package/dist/monitoring/metrics-storage.indicator.js +18 -0
- package/dist/monitoring/metrics-storage.indicator.js.map +1 -0
- package/dist/monitoring/process-lifetime.d.ts +11 -0
- package/dist/monitoring/process-lifetime.d.ts.map +1 -0
- package/dist/monitoring/process-lifetime.js +45 -0
- package/dist/monitoring/process-lifetime.js.map +1 -0
- package/dist/monitoring/runtime-diagnostics.d.ts +47 -0
- package/dist/monitoring/runtime-diagnostics.d.ts.map +1 -0
- package/dist/monitoring/runtime-diagnostics.js +88 -0
- package/dist/monitoring/runtime-diagnostics.js.map +1 -0
- package/dist/observability/metrics-bridge.d.ts +5 -1
- package/dist/observability/metrics-bridge.d.ts.map +1 -1
- package/dist/observability/metrics-bridge.js +11 -0
- package/dist/observability/metrics-bridge.js.map +1 -1
- package/dist/operations.d.ts +17 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +13 -0
- package/dist/operations.js.map +1 -0
- package/dist/orchestrator/app-handle.d.ts +27 -9
- package/dist/orchestrator/app-handle.d.ts.map +1 -1
- package/dist/orchestrator/app-handle.js +42 -11
- package/dist/orchestrator/app-handle.js.map +1 -1
- package/dist/orchestrator/application-runtime-child.d.ts +2 -0
- package/dist/orchestrator/application-runtime-child.d.ts.map +1 -0
- package/dist/orchestrator/application-runtime-child.js +15 -0
- package/dist/orchestrator/application-runtime-child.js.map +1 -0
- package/dist/orchestrator/application-runtime-resolution.d.ts +4 -0
- package/dist/orchestrator/application-runtime-resolution.d.ts.map +1 -0
- package/dist/orchestrator/application-runtime-resolution.js +62 -0
- package/dist/orchestrator/application-runtime-resolution.js.map +1 -0
- package/dist/orchestrator/application-runtime.d.ts +3 -0
- package/dist/orchestrator/application-runtime.d.ts.map +1 -0
- package/dist/orchestrator/application-runtime.js +20 -0
- package/dist/orchestrator/application-runtime.js.map +1 -0
- package/dist/orchestrator/application-topology.d.ts +20 -0
- package/dist/orchestrator/application-topology.d.ts.map +1 -0
- package/dist/orchestrator/application-topology.js +90 -0
- package/dist/orchestrator/application-topology.js.map +1 -0
- package/dist/orchestrator/bootstrap-loader-child.d.ts +1 -1
- package/dist/orchestrator/bootstrap-loader-child.js +7 -16
- package/dist/orchestrator/bootstrap-loader-child.js.map +1 -1
- package/dist/orchestrator/bootstrap-loader.d.ts +10 -20
- package/dist/orchestrator/bootstrap-loader.d.ts.map +1 -1
- package/dist/orchestrator/bootstrap-loader.js +24 -207
- package/dist/orchestrator/bootstrap-loader.js.map +1 -1
- package/dist/orchestrator/bootstrap-process.d.ts +6 -6
- package/dist/orchestrator/bootstrap-process.d.ts.map +1 -1
- package/dist/orchestrator/bootstrap-process.js +40 -40
- package/dist/orchestrator/bootstrap-process.js.map +1 -1
- package/dist/orchestrator/build-service.d.ts +8 -14
- package/dist/orchestrator/build-service.d.ts.map +1 -1
- package/dist/orchestrator/build-service.js +144 -158
- package/dist/orchestrator/build-service.js.map +1 -1
- package/dist/orchestrator/call-exposed-service.d.ts +8 -0
- package/dist/orchestrator/call-exposed-service.d.ts.map +1 -1
- package/dist/orchestrator/call-exposed-service.js +1 -1
- package/dist/orchestrator/classic-launcher.d.ts +3 -2
- package/dist/orchestrator/classic-launcher.d.ts.map +1 -1
- package/dist/orchestrator/classic-launcher.js +32 -23
- package/dist/orchestrator/classic-launcher.js.map +1 -1
- package/dist/orchestrator/dependency-resolver.d.ts.map +1 -1
- package/dist/orchestrator/dependency-resolver.js +7 -38
- package/dist/orchestrator/dependency-resolver.js.map +1 -1
- package/dist/orchestrator/execution-contract.d.ts +67 -0
- package/dist/orchestrator/execution-contract.d.ts.map +1 -0
- package/dist/orchestrator/execution-contract.js +2 -0
- package/dist/orchestrator/execution-contract.js.map +1 -0
- package/dist/orchestrator/file-watcher.d.ts +2 -1
- package/dist/orchestrator/file-watcher.d.ts.map +1 -1
- package/dist/orchestrator/file-watcher.js +23 -5
- package/dist/orchestrator/file-watcher.js.map +1 -1
- package/dist/orchestrator/http-routes.d.ts +4 -0
- package/dist/orchestrator/http-routes.d.ts.map +1 -0
- package/dist/orchestrator/http-routes.js +19 -0
- package/dist/orchestrator/http-routes.js.map +1 -0
- package/dist/orchestrator/installed-execution.d.ts +7 -0
- package/dist/orchestrator/installed-execution.d.ts.map +1 -0
- package/dist/orchestrator/installed-execution.js +25 -0
- package/dist/orchestrator/installed-execution.js.map +1 -0
- package/dist/orchestrator/module-worker-process.d.ts.map +1 -1
- package/dist/orchestrator/module-worker-process.js +2 -1
- package/dist/orchestrator/module-worker-process.js.map +1 -1
- package/dist/orchestrator/orchestrator.service.d.ts +105 -80
- package/dist/orchestrator/orchestrator.service.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.service.js +1084 -571
- package/dist/orchestrator/orchestrator.service.js.map +1 -1
- package/dist/orchestrator/process-janitor.d.ts +3 -0
- package/dist/orchestrator/process-janitor.d.ts.map +1 -1
- package/dist/orchestrator/process-janitor.js +5 -1
- package/dist/orchestrator/process-janitor.js.map +1 -1
- package/dist/orchestrator/runtime-package-resolution.d.ts +8 -0
- package/dist/orchestrator/runtime-package-resolution.d.ts.map +1 -0
- package/dist/orchestrator/runtime-package-resolution.js +56 -0
- package/dist/orchestrator/runtime-package-resolution.js.map +1 -0
- package/dist/orchestrator/service-router.d.ts +4 -108
- package/dist/orchestrator/service-router.d.ts.map +1 -1
- package/dist/orchestrator/service-router.js +51 -237
- package/dist/orchestrator/service-router.js.map +1 -1
- package/dist/orchestrator/topology-query.d.ts +1 -1
- package/dist/orchestrator/topology-query.js +1 -1
- package/dist/orchestrator/ts-compiler.d.ts.map +1 -1
- package/dist/orchestrator/ts-compiler.js +9 -17
- package/dist/orchestrator/ts-compiler.js.map +1 -1
- package/dist/project/artifact-builder.d.ts +17 -7
- package/dist/project/artifact-builder.d.ts.map +1 -1
- package/dist/project/artifact-builder.js +91 -58
- package/dist/project/artifact-builder.js.map +1 -1
- package/dist/project/bootstrap-metadata.d.ts +42 -0
- package/dist/project/bootstrap-metadata.d.ts.map +1 -0
- package/dist/project/bootstrap-metadata.js +76 -0
- package/dist/project/bootstrap-metadata.js.map +1 -0
- package/dist/project/build-decision.d.ts +1 -1
- package/dist/project/build-decision.js +1 -1
- package/dist/project/config-resolver.js +4 -4
- package/dist/project/config-resolver.js.map +1 -1
- package/dist/project/configuration-catalog.d.ts +8 -0
- package/dist/project/configuration-catalog.d.ts.map +1 -0
- package/dist/project/configuration-catalog.js +29 -0
- package/dist/project/configuration-catalog.js.map +1 -0
- package/dist/project/declared-config.d.ts +4 -2
- package/dist/project/declared-config.d.ts.map +1 -1
- package/dist/project/declared-config.js +10 -7
- package/dist/project/declared-config.js.map +1 -1
- package/dist/project/dependency-topology.d.ts +10 -0
- package/dist/project/dependency-topology.d.ts.map +1 -0
- package/dist/project/dependency-topology.js +55 -0
- package/dist/project/dependency-topology.js.map +1 -0
- package/dist/project/deploy-phases.d.ts +1 -1
- package/dist/project/deploy-phases.js +1 -1
- package/dist/project/exec-in-group.d.ts +1 -1
- package/dist/project/exec-in-group.js +1 -1
- package/dist/project/infrastructure-ownership.d.ts +5 -0
- package/dist/project/infrastructure-ownership.d.ts.map +1 -0
- package/dist/project/infrastructure-ownership.js +26 -0
- package/dist/project/infrastructure-ownership.js.map +1 -0
- package/dist/project/installed-stack-resume.d.ts +62 -0
- package/dist/project/installed-stack-resume.d.ts.map +1 -0
- package/dist/project/installed-stack-resume.js +261 -0
- package/dist/project/installed-stack-resume.js.map +1 -0
- package/dist/project/launch-failure.d.ts +3 -0
- package/dist/project/launch-failure.d.ts.map +1 -0
- package/dist/project/launch-failure.js +32 -0
- package/dist/project/launch-failure.js.map +1 -0
- package/dist/project/local-release-selection.d.ts +18 -0
- package/dist/project/local-release-selection.d.ts.map +1 -0
- package/dist/project/local-release-selection.js +36 -0
- package/dist/project/local-release-selection.js.map +1 -0
- package/dist/project/node-app-config.d.ts +10 -3
- package/dist/project/node-app-config.d.ts.map +1 -1
- package/dist/project/node-app-config.js +22 -30
- package/dist/project/node-app-config.js.map +1 -1
- package/dist/project/node-app-health.d.ts +1 -1
- package/dist/project/node-app-health.js +1 -1
- package/dist/project/node-stack-stop.d.ts +83 -0
- package/dist/project/node-stack-stop.d.ts.map +1 -0
- package/dist/project/node-stack-stop.js +219 -0
- package/dist/project/node-stack-stop.js.map +1 -0
- package/dist/project/operator-account.d.ts +9 -3
- package/dist/project/operator-account.d.ts.map +1 -1
- package/dist/project/operator-account.js +9 -9
- package/dist/project/operator-account.js.map +1 -1
- package/dist/project/public-stack.d.ts +4 -0
- package/dist/project/public-stack.d.ts.map +1 -0
- package/dist/project/public-stack.js +29 -0
- package/dist/project/public-stack.js.map +1 -0
- package/dist/project/registry.d.ts +18 -27
- package/dist/project/registry.d.ts.map +1 -1
- package/dist/project/registry.js +248 -77
- package/dist/project/registry.js.map +1 -1
- package/dist/project/requirements-scanner.d.ts +4 -8
- package/dist/project/requirements-scanner.d.ts.map +1 -1
- package/dist/project/requirements-scanner.js +39 -146
- package/dist/project/requirements-scanner.js.map +1 -1
- package/dist/project/stack-diagnosis.d.ts +18 -0
- package/dist/project/stack-diagnosis.d.ts.map +1 -0
- package/dist/project/stack-diagnosis.js +94 -0
- package/dist/project/stack-diagnosis.js.map +1 -0
- package/dist/project/stack-env.d.ts +1 -1
- package/dist/project/stack-env.js +1 -1
- package/dist/project/stack-health.d.ts +12 -0
- package/dist/project/stack-health.d.ts.map +1 -0
- package/dist/project/stack-health.js +27 -0
- package/dist/project/stack-health.js.map +1 -0
- package/dist/project/stack-observation.d.ts +8 -0
- package/dist/project/stack-observation.d.ts.map +1 -0
- package/dist/project/stack-observation.js +126 -0
- package/dist/project/stack-observation.js.map +1 -0
- package/dist/project/stack-placement.d.ts +11 -0
- package/dist/project/stack-placement.d.ts.map +1 -0
- package/dist/project/stack-placement.js +57 -0
- package/dist/project/stack-placement.js.map +1 -0
- package/dist/project/stack-stop-review.d.ts +14 -0
- package/dist/project/stack-stop-review.d.ts.map +1 -0
- package/dist/project/stack-stop-review.js +22 -0
- package/dist/project/stack-stop-review.js.map +1 -0
- package/dist/project/stack-targets.d.ts +24 -0
- package/dist/project/stack-targets.d.ts.map +1 -0
- package/dist/project/stack-targets.js +67 -0
- package/dist/project/stack-targets.js.map +1 -0
- package/dist/project/stand-containers.d.ts +9 -2
- package/dist/project/stand-containers.d.ts.map +1 -1
- package/dist/project/stand-containers.js +17 -17
- package/dist/project/stand-containers.js.map +1 -1
- package/dist/project/topology-control.d.ts +41 -0
- package/dist/project/topology-control.d.ts.map +1 -0
- package/dist/project/topology-control.js +133 -0
- package/dist/project/topology-control.js.map +1 -0
- package/dist/project/topology-plan.d.ts +11 -0
- package/dist/project/topology-plan.d.ts.map +1 -0
- package/dist/project/topology-plan.js +154 -0
- package/dist/project/topology-plan.js.map +1 -0
- package/dist/project/topology-services.d.ts +7 -0
- package/dist/project/topology-services.d.ts.map +1 -0
- package/dist/project/topology-services.js +36 -0
- package/dist/project/topology-services.js.map +1 -0
- package/dist/project/topology-state.d.ts +27 -0
- package/dist/project/topology-state.d.ts.map +1 -0
- package/dist/project/topology-state.js +71 -0
- package/dist/project/topology-state.js.map +1 -0
- package/dist/project/workspace-kind.d.ts +3 -0
- package/dist/project/workspace-kind.d.ts.map +1 -0
- package/dist/project/workspace-kind.js +13 -0
- package/dist/project/workspace-kind.js.map +1 -0
- package/dist/readiness.d.ts +4 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +3 -0
- package/dist/readiness.js.map +1 -0
- package/dist/release/application-closure.d.ts +4 -0
- package/dist/release/application-closure.d.ts.map +1 -0
- package/dist/release/application-closure.js +61 -0
- package/dist/release/application-closure.js.map +1 -0
- package/dist/release/archive.d.ts +3 -0
- package/dist/release/archive.d.ts.map +1 -0
- package/dist/release/archive.js +3 -0
- package/dist/release/archive.js.map +1 -0
- package/dist/release/artifact-inspection.d.ts +50 -0
- package/dist/release/artifact-inspection.d.ts.map +1 -0
- package/dist/release/artifact-inspection.js +169 -0
- package/dist/release/artifact-inspection.js.map +1 -0
- package/dist/release/artifact-store.d.ts +1 -1
- package/dist/release/artifact-store.d.ts.map +1 -1
- package/dist/release/artifact-store.js +1 -1
- package/dist/release/artifact-store.js.map +1 -1
- package/dist/release/artifact-volumes.d.ts +10 -0
- package/dist/release/artifact-volumes.d.ts.map +1 -0
- package/dist/release/artifact-volumes.js +112 -0
- package/dist/release/artifact-volumes.js.map +1 -0
- package/dist/release/attest-on-node.d.ts +3 -2
- package/dist/release/attest-on-node.d.ts.map +1 -1
- package/dist/release/attest-on-node.js +6 -6
- package/dist/release/attest-on-node.js.map +1 -1
- package/dist/release/attest.d.ts +3 -3
- package/dist/release/attest.js +1 -1
- package/dist/release/build-run.d.ts +14 -17
- package/dist/release/build-run.d.ts.map +1 -1
- package/dist/release/build-run.js +264 -77
- package/dist/release/build-run.js.map +1 -1
- package/dist/release/builder.d.ts +9 -3
- package/dist/release/builder.d.ts.map +1 -1
- package/dist/release/builder.js +19 -5
- package/dist/release/builder.js.map +1 -1
- package/dist/release/closure-library-path.d.ts +26 -0
- package/dist/release/closure-library-path.d.ts.map +1 -0
- package/dist/release/closure-library-path.js +160 -0
- package/dist/release/closure-library-path.js.map +1 -0
- package/dist/release/definition-inputs.d.ts +7 -4
- package/dist/release/definition-inputs.d.ts.map +1 -1
- package/dist/release/definition-inputs.js +146 -15
- package/dist/release/definition-inputs.js.map +1 -1
- package/dist/release/framework-source.d.ts +22 -0
- package/dist/release/framework-source.d.ts.map +1 -0
- package/dist/release/framework-source.js +54 -0
- package/dist/release/framework-source.js.map +1 -0
- package/dist/release/frozen-installation.d.ts +23 -0
- package/dist/release/frozen-installation.d.ts.map +1 -0
- package/dist/release/frozen-installation.js +159 -0
- package/dist/release/frozen-installation.js.map +1 -0
- package/dist/release/import-artifacts.d.ts +9 -0
- package/dist/release/import-artifacts.d.ts.map +1 -0
- package/dist/release/import-artifacts.js +60 -0
- package/dist/release/import-artifacts.js.map +1 -0
- package/dist/release/infrastructure.d.ts +6 -0
- package/dist/release/infrastructure.d.ts.map +1 -0
- package/dist/release/infrastructure.js +74 -0
- package/dist/release/infrastructure.js.map +1 -0
- package/dist/release/installed-artifacts.d.ts +12 -0
- package/dist/release/installed-artifacts.d.ts.map +1 -0
- package/dist/release/installed-artifacts.js +199 -0
- package/dist/release/installed-artifacts.js.map +1 -0
- package/dist/release/installed-graph.d.ts +28 -0
- package/dist/release/installed-graph.d.ts.map +1 -0
- package/dist/release/installed-graph.js +138 -0
- package/dist/release/installed-graph.js.map +1 -0
- package/dist/release/installed-origin.d.ts +42 -0
- package/dist/release/installed-origin.d.ts.map +1 -0
- package/dist/release/installed-origin.js +130 -0
- package/dist/release/installed-origin.js.map +1 -0
- package/dist/release/installed-release.d.ts +23 -0
- package/dist/release/installed-release.d.ts.map +1 -0
- package/dist/release/installed-release.js +141 -0
- package/dist/release/installed-release.js.map +1 -0
- package/dist/release/layout.d.ts +29 -34
- package/dist/release/layout.d.ts.map +1 -1
- package/dist/release/layout.js +164 -53
- package/dist/release/layout.js.map +1 -1
- package/dist/release/load.d.ts +3 -0
- package/dist/release/load.d.ts.map +1 -1
- package/dist/release/load.js +50 -8
- package/dist/release/load.js.map +1 -1
- package/dist/release/local-installation.d.ts +20 -0
- package/dist/release/local-installation.d.ts.map +1 -0
- package/dist/release/local-installation.js +298 -0
- package/dist/release/local-installation.js.map +1 -0
- package/dist/release/manifest.d.ts +87 -12
- package/dist/release/manifest.d.ts.map +1 -1
- package/dist/release/manifest.js +31 -7
- package/dist/release/manifest.js.map +1 -1
- package/dist/release/migration-programs.d.ts +12 -0
- package/dist/release/migration-programs.d.ts.map +1 -0
- package/dist/release/migration-programs.js +45 -0
- package/dist/release/migration-programs.js.map +1 -0
- package/dist/release/migrations.d.ts +12 -1
- package/dist/release/migrations.d.ts.map +1 -1
- package/dist/release/migrations.js +124 -9
- package/dist/release/migrations.js.map +1 -1
- package/dist/release/origin.d.ts +33 -0
- package/dist/release/origin.d.ts.map +1 -0
- package/dist/release/origin.js +253 -0
- package/dist/release/origin.js.map +1 -0
- package/dist/release/owner-admission.d.ts +15 -0
- package/dist/release/owner-admission.d.ts.map +1 -0
- package/dist/release/owner-admission.js +37 -0
- package/dist/release/owner-admission.js.map +1 -0
- package/dist/release/owner-executable.d.ts +3 -0
- package/dist/release/owner-executable.d.ts.map +1 -0
- package/dist/release/owner-executable.js +40 -0
- package/dist/release/owner-executable.js.map +1 -0
- package/dist/release/package-gates.d.ts +9 -0
- package/dist/release/package-gates.d.ts.map +1 -0
- package/dist/release/package-gates.js +42 -0
- package/dist/release/package-gates.js.map +1 -0
- package/dist/release/package-resolution.d.ts +4 -0
- package/dist/release/package-resolution.d.ts.map +1 -0
- package/dist/release/package-resolution.js +28 -0
- package/dist/release/package-resolution.js.map +1 -0
- package/dist/release/portable-archive.d.ts +12 -0
- package/dist/release/portable-archive.d.ts.map +1 -0
- package/dist/release/portable-archive.js +96 -0
- package/dist/release/portable-archive.js.map +1 -0
- package/dist/release/publish.d.ts +1 -1
- package/dist/release/publish.js +1 -1
- package/dist/release/registry-download.d.ts +2 -0
- package/dist/release/registry-download.d.ts.map +1 -0
- package/dist/release/registry-download.js +157 -0
- package/dist/release/registry-download.js.map +1 -0
- package/dist/release/registry-framework.d.ts +39 -0
- package/dist/release/registry-framework.d.ts.map +1 -0
- package/dist/release/registry-framework.js +279 -0
- package/dist/release/registry-framework.js.map +1 -0
- package/dist/release/registry-transport.d.ts +27 -0
- package/dist/release/registry-transport.d.ts.map +1 -0
- package/dist/release/registry-transport.js +96 -0
- package/dist/release/registry-transport.js.map +1 -0
- package/dist/release/repository-identity.d.ts +12 -0
- package/dist/release/repository-identity.d.ts.map +1 -0
- package/dist/release/repository-identity.js +62 -0
- package/dist/release/repository-identity.js.map +1 -0
- package/dist/release/runtime-extractor.d.ts +4 -0
- package/dist/release/runtime-extractor.d.ts.map +1 -0
- package/dist/release/runtime-extractor.js +15 -0
- package/dist/release/runtime-extractor.js.map +1 -0
- package/dist/release/runtime-provenance.d.ts +40 -0
- package/dist/release/runtime-provenance.d.ts.map +1 -0
- package/dist/release/runtime-provenance.js +229 -0
- package/dist/release/runtime-provenance.js.map +1 -0
- package/dist/release/source.d.ts +12 -0
- package/dist/release/source.d.ts.map +1 -0
- package/dist/release/source.js +168 -0
- package/dist/release/source.js.map +1 -0
- package/dist/release/store.d.ts +14 -5
- package/dist/release/store.d.ts.map +1 -1
- package/dist/release/store.js +73 -17
- package/dist/release/store.js.map +1 -1
- package/dist/release/target-runtime.d.ts +19 -0
- package/dist/release/target-runtime.d.ts.map +1 -0
- package/dist/release/target-runtime.js +41 -0
- package/dist/release/target-runtime.js.map +1 -0
- package/dist/release/vendored-framework.d.ts +28 -0
- package/dist/release/vendored-framework.d.ts.map +1 -0
- package/dist/release/vendored-framework.js +98 -0
- package/dist/release/vendored-framework.js.map +1 -0
- package/dist/release/workspace-source.d.ts +3 -0
- package/dist/release/workspace-source.d.ts.map +1 -0
- package/dist/release/workspace-source.js +33 -0
- package/dist/release/workspace-source.js.map +1 -0
- package/dist/runtime/context.d.ts +29 -0
- package/dist/runtime/context.d.ts.map +1 -0
- package/dist/runtime/context.js +111 -0
- package/dist/runtime/context.js.map +1 -0
- package/dist/runtime/identity.d.ts +15 -0
- package/dist/runtime/identity.d.ts.map +1 -0
- package/dist/runtime/identity.js +33 -0
- package/dist/runtime/identity.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/services/access.rpc-service.d.ts +41 -0
- package/dist/services/access.rpc-service.d.ts.map +1 -0
- package/dist/services/access.rpc-service.js +248 -0
- package/dist/services/access.rpc-service.js.map +1 -0
- package/dist/services/alert.service.d.ts +3 -3
- package/dist/services/alert.service.d.ts.map +1 -1
- package/dist/services/alert.service.js +3 -3
- package/dist/services/anonymous-input.d.ts +0 -21
- package/dist/services/anonymous-input.d.ts.map +1 -1
- package/dist/services/anonymous-input.js +1 -27
- package/dist/services/anonymous-input.js.map +1 -1
- package/dist/services/audit.service.d.ts +10 -30
- package/dist/services/audit.service.d.ts.map +1 -1
- package/dist/services/audit.service.js +72 -18
- package/dist/services/audit.service.js.map +1 -1
- package/dist/services/auth-context.d.ts +2 -0
- package/dist/services/auth-context.d.ts.map +1 -1
- package/dist/services/auth-context.js +4 -1
- package/dist/services/auth-context.js.map +1 -1
- package/dist/services/auth.rpc-service.d.ts +3 -1
- package/dist/services/auth.rpc-service.d.ts.map +1 -1
- package/dist/services/auth.rpc-service.js +13 -3
- package/dist/services/auth.rpc-service.js.map +1 -1
- package/dist/services/auth.service.d.ts +11 -21
- package/dist/services/auth.service.d.ts.map +1 -1
- package/dist/services/auth.service.js +125 -139
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/backup-pipeline.d.ts +1 -1
- package/dist/services/backup-pipeline.js +1 -1
- package/dist/services/backup-storage.d.ts +14 -0
- package/dist/services/backup-storage.d.ts.map +1 -0
- package/dist/services/backup-storage.js +195 -0
- package/dist/services/backup-storage.js.map +1 -0
- package/dist/services/backup.rpc-service.d.ts +2 -0
- package/dist/services/backup.rpc-service.d.ts.map +1 -1
- package/dist/services/backup.rpc-service.js +9 -0
- package/dist/services/backup.rpc-service.js.map +1 -1
- package/dist/services/backup.service.d.ts +36 -129
- package/dist/services/backup.service.d.ts.map +1 -1
- package/dist/services/backup.service.js +177 -156
- package/dist/services/backup.service.js.map +1 -1
- package/dist/services/bundle-builder.d.ts +27 -12
- package/dist/services/bundle-builder.d.ts.map +1 -1
- package/dist/services/bundle-builder.js +192 -101
- package/dist/services/bundle-builder.js.map +1 -1
- package/dist/services/bundle-overrides.d.ts +25 -0
- package/dist/services/bundle-overrides.d.ts.map +1 -0
- package/dist/services/bundle-overrides.js +96 -0
- package/dist/services/bundle-overrides.js.map +1 -0
- package/dist/services/daemon-authority.d.ts +16 -0
- package/dist/services/daemon-authority.d.ts.map +1 -0
- package/dist/services/daemon-authority.js +54 -0
- package/dist/services/daemon-authority.js.map +1 -0
- package/dist/services/daemon-principal.d.ts +31 -0
- package/dist/services/daemon-principal.d.ts.map +1 -0
- package/dist/services/daemon-principal.js +37 -0
- package/dist/services/daemon-principal.js.map +1 -0
- package/dist/services/deploy.service.d.ts +13 -57
- package/dist/services/deploy.service.d.ts.map +1 -1
- package/dist/services/deploy.service.js +15 -263
- package/dist/services/deploy.service.js.map +1 -1
- package/dist/services/discovery.service.d.ts +1 -1
- package/dist/services/discovery.service.js +1 -1
- package/dist/services/event-broadcaster.rpc-service.d.ts +7 -1
- package/dist/services/event-broadcaster.rpc-service.d.ts.map +1 -1
- package/dist/services/event-broadcaster.rpc-service.js +89 -11
- package/dist/services/event-broadcaster.rpc-service.js.map +1 -1
- package/dist/services/fleet.rpc-service.d.ts +0 -6
- package/dist/services/fleet.rpc-service.d.ts.map +1 -1
- package/dist/services/fleet.rpc-service.js +0 -13
- package/dist/services/fleet.rpc-service.js.map +1 -1
- package/dist/services/health-check.service.d.ts +1 -1
- package/dist/services/health-check.service.d.ts.map +1 -1
- package/dist/services/health-check.service.js +30 -5
- package/dist/services/health-check.service.js.map +1 -1
- package/dist/services/host-operation-barrier.d.ts +8 -0
- package/dist/services/host-operation-barrier.d.ts.map +1 -0
- package/dist/services/host-operation-barrier.js +44 -0
- package/dist/services/host-operation-barrier.js.map +1 -0
- package/dist/services/host-upgrade.d.ts +181 -0
- package/dist/services/host-upgrade.d.ts.map +1 -0
- package/dist/services/host-upgrade.js +503 -0
- package/dist/services/host-upgrade.js.map +1 -0
- package/dist/services/infrastructure.rpc-service.d.ts +24 -2
- package/dist/services/infrastructure.rpc-service.d.ts.map +1 -1
- package/dist/services/infrastructure.rpc-service.js +178 -36
- package/dist/services/infrastructure.rpc-service.js.map +1 -1
- package/dist/services/kernel-catalog.d.ts +14 -0
- package/dist/services/kernel-catalog.d.ts.map +1 -0
- package/dist/services/kernel-catalog.js +172 -0
- package/dist/services/kernel-catalog.js.map +1 -0
- package/dist/services/kernel-distribution.d.ts +5 -0
- package/dist/services/kernel-distribution.d.ts.map +1 -0
- package/dist/services/kernel-distribution.js +49 -0
- package/dist/services/kernel-distribution.js.map +1 -0
- package/dist/services/kernel-rollout.service.d.ts +55 -0
- package/dist/services/kernel-rollout.service.d.ts.map +1 -0
- package/dist/services/kernel-rollout.service.js +394 -0
- package/dist/services/kernel-rollout.service.js.map +1 -0
- package/dist/services/local-bundle.d.ts +9 -0
- package/dist/services/local-bundle.d.ts.map +1 -1
- package/dist/services/local-bundle.js +14 -3
- package/dist/services/local-bundle.js.map +1 -1
- package/dist/services/log-collector.rpc-service.d.ts +5 -11
- package/dist/services/log-collector.rpc-service.d.ts.map +1 -1
- package/dist/services/log-collector.rpc-service.js +6 -6
- package/dist/services/log-collector.rpc-service.js.map +1 -1
- package/dist/services/log-collector.service.d.ts +39 -109
- package/dist/services/log-collector.service.d.ts.map +1 -1
- package/dist/services/log-collector.service.js +286 -261
- package/dist/services/log-collector.service.js.map +1 -1
- package/dist/services/log-query.d.ts +6 -0
- package/dist/services/log-query.d.ts.map +1 -0
- package/dist/services/log-query.js +46 -0
- package/dist/services/log-query.js.map +1 -0
- package/dist/services/maintenance-lock.d.ts +2 -2
- package/dist/services/maintenance-lock.d.ts.map +1 -1
- package/dist/services/maintenance-lock.js +1 -1
- package/dist/services/managed-rollout.d.ts +54 -0
- package/dist/services/managed-rollout.d.ts.map +1 -0
- package/dist/services/managed-rollout.js +124 -0
- package/dist/services/managed-rollout.js.map +1 -0
- package/dist/services/metrics.rpc-service.d.ts +23 -0
- package/dist/services/metrics.rpc-service.d.ts.map +1 -0
- package/dist/services/metrics.rpc-service.js +73 -0
- package/dist/services/metrics.rpc-service.js.map +1 -0
- package/dist/services/migration-output.d.ts +2 -2
- package/dist/services/migration-output.js +2 -2
- package/dist/services/migration-process.d.ts +32 -0
- package/dist/services/migration-process.d.ts.map +1 -0
- package/dist/services/migration-process.js +71 -0
- package/dist/services/migration-process.js.map +1 -0
- package/dist/services/migration-target.d.ts +57 -0
- package/dist/services/migration-target.d.ts.map +1 -0
- package/dist/services/migration-target.js +221 -0
- package/dist/services/migration-target.js.map +1 -0
- package/dist/services/node-deploy-lease.d.ts +19 -2
- package/dist/services/node-deploy-lease.d.ts.map +1 -1
- package/dist/services/node-deploy-lease.js +84 -10
- package/dist/services/node-deploy-lease.js.map +1 -1
- package/dist/services/node-health.repository.d.ts +2 -59
- package/dist/services/node-health.repository.d.ts.map +1 -1
- package/dist/services/node-health.repository.js.map +1 -1
- package/dist/services/node-host-key.d.ts +9 -0
- package/dist/services/node-host-key.d.ts.map +1 -0
- package/dist/services/node-host-key.js +17 -0
- package/dist/services/node-host-key.js.map +1 -0
- package/dist/services/node-manager.rpc-service.d.ts +50 -38
- package/dist/services/node-manager.rpc-service.d.ts.map +1 -1
- package/dist/services/node-manager.rpc-service.js +233 -38
- package/dist/services/node-manager.rpc-service.js.map +1 -1
- package/dist/services/node-manager.service.d.ts +4 -1
- package/dist/services/node-manager.service.d.ts.map +1 -1
- package/dist/services/node-manager.service.js +79 -28
- package/dist/services/node-manager.service.js.map +1 -1
- package/dist/services/node-registration.d.ts +17 -0
- package/dist/services/node-registration.d.ts.map +1 -0
- package/dist/services/node-registration.js +73 -0
- package/dist/services/node-registration.js.map +1 -0
- package/dist/services/node-upgrade.d.ts +1 -1
- package/dist/services/node-upgrade.service.d.ts +2 -28
- package/dist/services/node-upgrade.service.d.ts.map +1 -1
- package/dist/services/node-upgrade.service.js +2 -3
- package/dist/services/node-upgrade.service.js.map +1 -1
- package/dist/services/pipeline-definition.d.ts +14 -0
- package/dist/services/pipeline-definition.d.ts.map +1 -0
- package/dist/services/pipeline-definition.js +77 -0
- package/dist/services/pipeline-definition.js.map +1 -0
- package/dist/services/pipeline.rpc-service.d.ts +14 -3
- package/dist/services/pipeline.rpc-service.d.ts.map +1 -1
- package/dist/services/pipeline.rpc-service.js +45 -12
- package/dist/services/pipeline.rpc-service.js.map +1 -1
- package/dist/services/pipeline.service.d.ts +30 -44
- package/dist/services/pipeline.service.d.ts.map +1 -1
- package/dist/services/pipeline.service.js +402 -333
- package/dist/services/pipeline.service.js.map +1 -1
- package/dist/services/project.rpc-service.d.ts +219 -14
- package/dist/services/project.rpc-service.d.ts.map +1 -1
- package/dist/services/project.rpc-service.js +314 -31
- package/dist/services/project.rpc-service.js.map +1 -1
- package/dist/services/project.service.d.ts +195 -67
- package/dist/services/project.service.d.ts.map +1 -1
- package/dist/services/project.service.js +2029 -705
- package/dist/services/project.service.js.map +1 -1
- package/dist/services/redeploy-decision.d.ts +2 -2
- package/dist/services/redeploy-decision.js +1 -1
- package/dist/services/release.rpc-service.d.ts +6 -19
- package/dist/services/release.rpc-service.d.ts.map +1 -1
- package/dist/services/release.rpc-service.js +35 -12
- package/dist/services/release.rpc-service.js.map +1 -1
- package/dist/services/release.service.d.ts +2 -47
- package/dist/services/release.service.d.ts.map +1 -1
- package/dist/services/release.service.js +26 -2
- package/dist/services/release.service.js.map +1 -1
- package/dist/services/remote-deployer.service.d.ts +65 -126
- package/dist/services/remote-deployer.service.d.ts.map +1 -1
- package/dist/services/remote-deployer.service.js +671 -466
- package/dist/services/remote-deployer.service.js.map +1 -1
- package/dist/services/remote-provisioner.d.ts +3 -1
- package/dist/services/remote-provisioner.d.ts.map +1 -1
- package/dist/services/remote-provisioner.js +2 -2
- package/dist/services/remote-provisioner.js.map +1 -1
- package/dist/services/replication-evidence.d.ts +24 -0
- package/dist/services/replication-evidence.d.ts.map +1 -0
- package/dist/services/replication-evidence.js +61 -0
- package/dist/services/replication-evidence.js.map +1 -0
- package/dist/services/replication-history.d.ts +80 -0
- package/dist/services/replication-history.d.ts.map +1 -0
- package/dist/services/replication-history.js +279 -0
- package/dist/services/replication-history.js.map +1 -0
- package/dist/services/replication-reconciliation.d.ts +74 -0
- package/dist/services/replication-reconciliation.d.ts.map +1 -0
- package/dist/services/replication-reconciliation.js +351 -0
- package/dist/services/replication-reconciliation.js.map +1 -0
- package/dist/services/slave-storage.service.d.ts +2 -19
- package/dist/services/slave-storage.service.d.ts.map +1 -1
- package/dist/services/slave-storage.service.js +19 -6
- package/dist/services/slave-storage.service.js.map +1 -1
- package/dist/services/static-carry-forward.d.ts +28 -3
- package/dist/services/static-carry-forward.d.ts.map +1 -1
- package/dist/services/static-carry-forward.js +285 -4
- package/dist/services/static-carry-forward.js.map +1 -1
- package/dist/services/sync-summary.d.ts.map +1 -1
- package/dist/services/sync-summary.js +1 -18
- package/dist/services/sync-summary.js.map +1 -1
- package/dist/services/sync.rpc-service.d.ts +17 -20
- package/dist/services/sync.rpc-service.d.ts.map +1 -1
- package/dist/services/sync.rpc-service.js +23 -37
- package/dist/services/sync.rpc-service.js.map +1 -1
- package/dist/services/sync.service.d.ts +53 -157
- package/dist/services/sync.service.d.ts.map +1 -1
- package/dist/services/sync.service.js +239 -337
- package/dist/services/sync.service.js.map +1 -1
- package/dist/services/system-info.rpc-service.d.ts +3 -1
- package/dist/services/system-info.rpc-service.d.ts.map +1 -1
- package/dist/services/system-info.rpc-service.js +5 -5
- package/dist/services/system-info.rpc-service.js.map +1 -1
- package/dist/services/system-info.service.d.ts +3 -1
- package/dist/services/system-info.service.d.ts.map +1 -1
- package/dist/services/system-info.service.js +17 -9
- package/dist/services/system-info.service.js.map +1 -1
- package/dist/services/telemetry.rpc-service.d.ts +4 -23
- package/dist/services/telemetry.rpc-service.d.ts.map +1 -1
- package/dist/services/telemetry.rpc-service.js +4 -32
- package/dist/services/telemetry.rpc-service.js.map +1 -1
- package/dist/services/telemetry.service.d.ts +2 -30
- package/dist/services/telemetry.service.d.ts.map +1 -1
- package/dist/services/telemetry.service.js +25 -131
- package/dist/services/telemetry.service.js.map +1 -1
- package/dist/services/terminal-ssh.d.ts +16 -0
- package/dist/services/terminal-ssh.d.ts.map +1 -0
- package/dist/services/terminal-ssh.js +101 -0
- package/dist/services/terminal-ssh.js.map +1 -0
- package/dist/services/terminal.rpc-service.d.ts +84 -0
- package/dist/services/terminal.rpc-service.d.ts.map +1 -0
- package/dist/services/terminal.rpc-service.js +508 -0
- package/dist/services/terminal.rpc-service.js.map +1 -0
- package/dist/services/trace-collector.rpc-service.js +3 -3
- package/dist/services/trace-collector.rpc-service.js.map +1 -1
- package/dist/services/wait-for-postgres.d.ts +1 -1
- package/dist/services/wait-for-postgres.d.ts.map +1 -1
- package/dist/services/wait-for-postgres.js +13 -28
- package/dist/services/wait-for-postgres.js.map +1 -1
- package/dist/shared/build-stamp.d.ts +4 -1
- package/dist/shared/build-stamp.d.ts.map +1 -1
- package/dist/shared/build-stamp.js +14 -6
- package/dist/shared/build-stamp.js.map +1 -1
- package/dist/shared/describe-error.d.ts +1 -21
- package/dist/shared/describe-error.d.ts.map +1 -1
- package/dist/shared/describe-error.js +1 -38
- package/dist/shared/describe-error.js.map +1 -1
- package/dist/shared/dto/access.d.ts +55 -0
- package/dist/shared/dto/access.d.ts.map +1 -0
- package/dist/shared/dto/access.js +2 -0
- package/dist/shared/dto/access.js.map +1 -0
- package/dist/shared/dto/audit.d.ts +32 -0
- package/dist/shared/dto/audit.d.ts.map +1 -0
- package/dist/shared/dto/audit.js +3 -0
- package/dist/shared/dto/audit.js.map +1 -0
- package/dist/shared/dto/auth.d.ts +2 -0
- package/dist/shared/dto/auth.d.ts.map +1 -1
- package/dist/shared/dto/auth.js +5 -1
- package/dist/shared/dto/auth.js.map +1 -1
- package/dist/shared/dto/backend.d.ts +50 -0
- package/dist/shared/dto/backend.d.ts.map +1 -0
- package/dist/shared/dto/backend.js +3 -0
- package/dist/shared/dto/backend.js.map +1 -0
- package/dist/shared/dto/backups.d.ts +99 -0
- package/dist/shared/dto/backups.d.ts.map +1 -1
- package/dist/shared/dto/cluster.d.ts +44 -0
- package/dist/shared/dto/cluster.d.ts.map +1 -0
- package/dist/shared/dto/cluster.js +3 -0
- package/dist/shared/dto/cluster.js.map +1 -0
- package/dist/shared/dto/files.d.ts +328 -0
- package/dist/shared/dto/files.d.ts.map +1 -0
- package/dist/shared/dto/files.js +2 -0
- package/dist/shared/dto/files.js.map +1 -0
- package/dist/shared/dto/health.d.ts +59 -0
- package/dist/shared/dto/health.d.ts.map +1 -1
- package/dist/shared/dto/installed-release.d.ts +40 -0
- package/dist/shared/dto/installed-release.d.ts.map +1 -0
- package/dist/shared/dto/installed-release.js +2 -0
- package/dist/shared/dto/installed-release.js.map +1 -0
- package/dist/shared/dto/kernel-catalog.d.ts +11 -0
- package/dist/shared/dto/kernel-catalog.d.ts.map +1 -0
- package/dist/shared/dto/kernel-catalog.js +2 -0
- package/dist/shared/dto/kernel-catalog.js.map +1 -0
- package/dist/shared/dto/logs.d.ts +21 -0
- package/dist/shared/dto/logs.d.ts.map +1 -1
- package/dist/shared/dto/metrics.d.ts +4 -64
- package/dist/shared/dto/metrics.d.ts.map +1 -1
- package/dist/shared/dto/metrics.js +0 -15
- package/dist/shared/dto/metrics.js.map +1 -1
- package/dist/shared/dto/nodes.d.ts +98 -24
- package/dist/shared/dto/nodes.d.ts.map +1 -1
- package/dist/shared/dto/pipelines.d.ts +22 -1
- package/dist/shared/dto/pipelines.d.ts.map +1 -1
- package/dist/shared/dto/project.d.ts +289 -30
- package/dist/shared/dto/project.d.ts.map +1 -1
- package/dist/shared/dto/releases.d.ts +59 -0
- package/dist/shared/dto/releases.d.ts.map +1 -0
- package/dist/shared/dto/releases.js +2 -0
- package/dist/shared/dto/releases.js.map +1 -0
- package/dist/shared/dto/services.d.ts +201 -37
- package/dist/shared/dto/services.d.ts.map +1 -1
- package/dist/shared/dto/services.js +15 -6
- package/dist/shared/dto/services.js.map +1 -1
- package/dist/shared/dto/stack-diagnosis.d.ts +20 -0
- package/dist/shared/dto/stack-diagnosis.d.ts.map +1 -0
- package/dist/shared/dto/stack-diagnosis.js +8 -0
- package/dist/shared/dto/stack-diagnosis.js.map +1 -0
- package/dist/shared/dto/stack-execution.d.ts +65 -0
- package/dist/shared/dto/stack-execution.d.ts.map +1 -0
- package/dist/shared/dto/stack-execution.js +33 -0
- package/dist/shared/dto/stack-execution.js.map +1 -0
- package/dist/shared/dto/system-info.d.ts +11 -0
- package/dist/shared/dto/system-info.d.ts.map +1 -1
- package/dist/shared/dto/system-info.js +7 -1
- package/dist/shared/dto/system-info.js.map +1 -1
- package/dist/shared/dto/terminal.d.ts +40 -0
- package/dist/shared/dto/terminal.d.ts.map +1 -0
- package/dist/shared/dto/terminal.js +2 -0
- package/dist/shared/dto/terminal.js.map +1 -0
- package/dist/shared/dto/topology.d.ts +96 -0
- package/dist/shared/dto/topology.d.ts.map +1 -0
- package/dist/shared/dto/topology.js +2 -0
- package/dist/shared/dto/topology.js.map +1 -0
- package/dist/shared/emergency-output.d.ts +3 -0
- package/dist/shared/emergency-output.d.ts.map +1 -0
- package/dist/shared/emergency-output.js +22 -0
- package/dist/shared/emergency-output.js.map +1 -0
- package/dist/shared/env-config.d.ts +2 -0
- package/dist/shared/env-config.d.ts.map +1 -1
- package/dist/shared/env-config.js +1 -0
- package/dist/shared/env-config.js.map +1 -1
- package/dist/shared/events.d.ts +2 -0
- package/dist/shared/events.d.ts.map +1 -1
- package/dist/shared/events.js.map +1 -1
- package/dist/shared/execution-identity.d.ts +39 -0
- package/dist/shared/execution-identity.d.ts.map +1 -0
- package/dist/shared/execution-identity.js +160 -0
- package/dist/shared/execution-identity.js.map +1 -0
- package/dist/shared/file-policy.d.ts +5 -0
- package/dist/shared/file-policy.d.ts.map +1 -0
- package/dist/shared/file-policy.js +18 -0
- package/dist/shared/file-policy.js.map +1 -0
- package/dist/shared/framework-source.d.ts +11 -0
- package/dist/shared/framework-source.d.ts.map +1 -0
- package/dist/shared/framework-source.js +31 -0
- package/dist/shared/framework-source.js.map +1 -0
- package/dist/shared/fresh-module-reader.d.ts +40 -0
- package/dist/shared/fresh-module-reader.d.ts.map +1 -0
- package/dist/shared/fresh-module-reader.js +257 -0
- package/dist/shared/fresh-module-reader.js.map +1 -0
- package/dist/shared/host-boot-identity.d.ts +12 -0
- package/dist/shared/host-boot-identity.d.ts.map +1 -0
- package/dist/shared/host-boot-identity.js +89 -0
- package/dist/shared/host-boot-identity.js.map +1 -0
- package/dist/shared/kernel-file-lock.d.ts +3 -0
- package/dist/shared/kernel-file-lock.d.ts.map +1 -0
- package/dist/shared/kernel-file-lock.js +53 -0
- package/dist/shared/kernel-file-lock.js.map +1 -0
- package/dist/shared/linux-file-lock.d.ts +4 -0
- package/dist/shared/linux-file-lock.d.ts.map +1 -0
- package/dist/shared/linux-file-lock.js +36 -0
- package/dist/shared/linux-file-lock.js.map +1 -0
- package/dist/shared/local-infra-host.d.ts +2 -2
- package/dist/shared/local-infra-host.js +2 -2
- package/dist/shared/log-ingestion-reading.d.ts +9 -0
- package/dist/shared/log-ingestion-reading.d.ts.map +1 -0
- package/dist/shared/log-ingestion-reading.js +32 -0
- package/dist/shared/log-ingestion-reading.js.map +1 -0
- package/dist/shared/log-levels.d.ts +19 -0
- package/dist/shared/log-levels.d.ts.map +1 -0
- package/dist/shared/log-levels.js +23 -0
- package/dist/shared/log-levels.js.map +1 -0
- package/dist/shared/metrics-storage-reading.d.ts +8 -0
- package/dist/shared/metrics-storage-reading.d.ts.map +1 -0
- package/dist/shared/metrics-storage-reading.js +27 -0
- package/dist/shared/metrics-storage-reading.js.map +1 -0
- package/dist/shared/pnpm.d.ts.map +1 -1
- package/dist/shared/pnpm.js +7 -0
- package/dist/shared/pnpm.js.map +1 -1
- package/dist/shared/pool-scale.d.ts +10 -0
- package/dist/shared/pool-scale.d.ts.map +1 -0
- package/dist/shared/pool-scale.js +25 -0
- package/dist/shared/pool-scale.js.map +1 -0
- package/dist/shared/private-files.d.ts +10 -22
- package/dist/shared/private-files.d.ts.map +1 -1
- package/dist/shared/private-files.js +95 -82
- package/dist/shared/private-files.js.map +1 -1
- package/dist/shared/relay-reading.d.ts +19 -0
- package/dist/shared/relay-reading.d.ts.map +1 -0
- package/dist/shared/relay-reading.js +22 -0
- package/dist/shared/relay-reading.js.map +1 -0
- package/dist/shared/release-reading.d.ts +124 -32
- package/dist/shared/release-reading.d.ts.map +1 -1
- package/dist/shared/release-reading.js +208 -28
- package/dist/shared/release-reading.js.map +1 -1
- package/dist/shared/roles.d.ts +19 -18
- package/dist/shared/roles.d.ts.map +1 -1
- package/dist/shared/roles.js +21 -26
- package/dist/shared/roles.js.map +1 -1
- package/dist/shared/runtime-artifact.d.ts +20 -0
- package/dist/shared/runtime-artifact.d.ts.map +1 -0
- package/dist/shared/runtime-artifact.js +83 -0
- package/dist/shared/runtime-artifact.js.map +1 -0
- package/dist/shared/stack-reading.d.ts +18 -0
- package/dist/shared/stack-reading.d.ts.map +1 -0
- package/dist/shared/stack-reading.js +15 -0
- package/dist/shared/stack-reading.js.map +1 -0
- package/dist/shared/sync-reading.d.ts +30 -38
- package/dist/shared/sync-reading.d.ts.map +1 -1
- package/dist/shared/sync-reading.js +90 -29
- package/dist/shared/sync-reading.js.map +1 -1
- package/dist/shared/tokens.d.ts +3 -1
- package/dist/shared/tokens.d.ts.map +1 -1
- package/dist/shared/tokens.js +1 -0
- package/dist/shared/tokens.js.map +1 -1
- package/dist/supervisor/restart-policy.d.ts.map +1 -1
- package/dist/supervisor/restart-policy.js +7 -5
- package/dist/supervisor/restart-policy.js.map +1 -1
- package/dist/webapp/console-container.d.ts +7 -0
- package/dist/webapp/console-container.d.ts.map +1 -0
- package/dist/webapp/console-container.js +23 -0
- package/dist/webapp/console-container.js.map +1 -0
- package/dist/webapp/webapp.service.d.ts.map +1 -1
- package/dist/webapp/webapp.service.js +71 -24
- package/dist/webapp/webapp.service.js.map +1 -1
- package/dist/workers/health-monitor.service.d.ts.map +1 -1
- package/dist/workers/health-monitor.service.js +8 -1
- package/dist/workers/health-monitor.service.js.map +1 -1
- package/dist/workers/types.d.ts +2 -0
- package/dist/workers/types.d.ts.map +1 -1
- package/package.json +109 -43
- package/webapp/dist/BUILD.json +4 -3
- package/webapp/dist/assets/access-48hkC2-P.js +1 -0
- package/webapp/dist/assets/access-jWkHxGc7.js +1 -0
- package/webapp/dist/assets/admin-data-table-BKSDI8sU.js +1 -0
- package/webapp/dist/assets/alert-expression-CSblScoa.js +1 -0
- package/webapp/dist/assets/alert-notify-settings-C_CHZrFm.js +1 -0
- package/webapp/dist/assets/alert-uBG6r9NW.js +1 -0
- package/webapp/dist/assets/alerts-CuPQ9YQJ.js +1 -0
- package/webapp/dist/assets/app-address-BCXfN59F.js +1 -0
- package/webapp/dist/assets/apps-Drio028B.js +1 -0
- package/webapp/dist/assets/audit-npSFJECe.js +1 -0
- package/webapp/dist/assets/auth-CcgjP7hR.js +1 -0
- package/webapp/dist/assets/card-DkH32gMY.js +1 -0
- package/webapp/dist/assets/chart-BpGXlCJc.js +2 -0
- package/webapp/dist/assets/charts-BY7qI6s2.js +41 -0
- package/webapp/dist/assets/charts-CpBdHU_A.js +56 -0
- package/webapp/dist/assets/client-DFnuv2z3.js +3 -0
- package/webapp/dist/assets/code-editor-DK6Tmmxv.js +4 -0
- package/webapp/dist/assets/comparison-bars-BtC0dHjF.js +1 -0
- package/webapp/dist/assets/confirm-dialog-BbGsAz7_.js +1 -0
- package/webapp/dist/assets/console-keyboard-D3YCA0yU.js +1 -0
- package/webapp/dist/assets/constants-CyhngVXh.js +1 -0
- package/webapp/dist/assets/containers-Bl8gAyZX.js +3 -0
- package/webapp/dist/assets/context-FIuwpd9_.js +1 -0
- package/webapp/dist/assets/controls-C5W8gHU4.js +1 -0
- package/webapp/dist/assets/daemon-memory-BiEtr9jr.js +1 -0
- package/webapp/dist/assets/dashboard-UHlet3H9.js +1 -0
- package/webapp/dist/assets/dashboard-builder-67PZFqhE.js +1 -0
- package/webapp/dist/assets/dayjs.min-DHwAvH5f.js +1 -0
- package/webapp/dist/assets/deploy-release-dialog-BOXcD5Wo.js +1 -0
- package/webapp/dist/assets/deployments-qV20Ak0P.js +1 -0
- package/webapp/dist/assets/detail-B4TiBfxU.js +8 -0
- package/webapp/dist/assets/detail-B85-Wees.js +2 -0
- package/webapp/dist/assets/detail-CYS81K6Y.js +1 -0
- package/webapp/dist/assets/dist-BUDn8hLh.js +11 -0
- package/webapp/dist/assets/dist-Ci5pYRbx.js +1 -0
- package/webapp/dist/assets/dist-DQmjHv4-.js +1 -0
- package/webapp/dist/assets/dist-De9Fty7a.js +1 -0
- package/webapp/dist/assets/dist-DsGmKwmk.js +23 -0
- package/webapp/dist/assets/empty-content-7jOFhG4C.js +1 -0
- package/webapp/dist/assets/error-boundary-CLLI8PWw.js +3 -0
- package/webapp/dist/assets/event-fields-CiyqrRO8.js +1 -0
- package/webapp/dist/assets/files-DigwXndm.js +2 -0
- package/webapp/dist/assets/formatters-RnRy4bXm.js +1 -0
- package/webapp/dist/assets/icons-OboZgWSt.js +1 -0
- package/webapp/dist/assets/index-uq8Dkk4c.js +1 -0
- package/webapp/dist/assets/label-B1SF0RTL.js +1 -0
- package/webapp/dist/assets/log-level-filter-Bcn31D1F.js +1 -0
- package/webapp/dist/assets/log-location-DuBjh6HQ.js +1 -0
- package/webapp/dist/assets/logs-BqHOufk8.js +4 -0
- package/webapp/dist/assets/metric-chart-M-kI-XOt.js +1 -0
- package/webapp/dist/assets/metric-series-WxePniyw.js +1 -0
- package/webapp/dist/assets/metrics-QIQaF7iS.js +1 -0
- package/webapp/dist/assets/model-ZEXEHm0l.js +2 -0
- package/webapp/dist/assets/mui-6ssfcZcz.js +1 -0
- package/webapp/dist/assets/mui-AnEgAVjz.js +52 -0
- package/webapp/dist/assets/mui-B1jrje6Z.js +1 -0
- package/webapp/dist/assets/mui-BIz4LSVs.js +1 -0
- package/webapp/dist/assets/mui-BTN91yBK.js +28 -0
- package/webapp/dist/assets/mui-BXSXx9c9.js +124 -0
- package/webapp/dist/assets/mui-BwsIrivo.js +37 -0
- package/webapp/dist/assets/mui-C_hromOc.js +1 -0
- package/webapp/dist/assets/mui-Cd711nOk.js +4 -0
- package/webapp/dist/assets/mui-CdB_p2lt.js +10 -0
- package/webapp/dist/assets/mui-DyT2n1lx.js +1 -0
- package/webapp/dist/assets/mui-agG5dued.js +1 -0
- package/webapp/dist/assets/mui-y44PQOfG.js +1 -0
- package/webapp/dist/assets/nodes-BJPk02vv.js +7 -0
- package/webapp/dist/assets/omnitron-logo-koMCbsCv.js +1 -0
- package/webapp/dist/assets/operation-status-Bm1x1wTz.js +1 -0
- package/webapp/dist/assets/page-breadcrumbs-fR7Jmpp4.js +1 -0
- package/webapp/dist/assets/pipelines-T6Ch9LTw.js +3 -0
- package/webapp/dist/assets/popper-m_9b0JRf.js +1 -0
- package/webapp/dist/assets/preload-helper-DzCYNvzR.js +1 -0
- package/webapp/dist/assets/project.store--G5pIF-J.js +1 -0
- package/webapp/dist/assets/projects-YoBzcQ24.js +1 -0
- package/webapp/dist/assets/react-BN8qLIAi.js +9 -0
- package/webapp/dist/assets/react-CEuifcaQ.js +1 -0
- package/webapp/dist/assets/react-apexcharts.esm-DoOt-pu4.js +1 -0
- package/webapp/dist/assets/realtime.store-CBDO4Abj.js +1 -0
- package/webapp/dist/assets/release-bits-B2a_wbft.js +1 -0
- package/webapp/dist/assets/release-build-panel-BQmIdKW9.js +1 -0
- package/webapp/dist/assets/release-deployment-state-DRrEI2pP.js +1 -0
- package/webapp/dist/assets/release-wire-f2VuBoBF.js +1 -0
- package/webapp/dist/assets/releases-Bp3CDgmo.js +2 -0
- package/webapp/dist/assets/rolldown-runtime-CNOWq4Kh.js +1 -0
- package/webapp/dist/assets/search-input-C0MHI8vO.js +1 -0
- package/webapp/dist/assets/services-BddvcFi8.js +1 -0
- package/webapp/dist/assets/settings-B3egRvbI.js +1 -0
- package/webapp/dist/assets/settled-pair-B-wgSZl6.js +1 -0
- package/webapp/dist/assets/shared-styles-C0vN3I7_.js +1 -0
- package/webapp/dist/assets/shell-command-C3pXf1vi.js +1 -0
- package/webapp/dist/assets/sign-in-9q-Nfy83.js +1 -0
- package/webapp/dist/assets/skeleton-BmWDJWF9.js +1 -0
- package/webapp/dist/assets/snackbar-DSPmjMyi.js +1 -0
- package/webapp/dist/assets/stack-health-status-BIv2C10x.js +1 -0
- package/webapp/dist/assets/stack-start-notice-BVnMOwRQ.js +1 -0
- package/webapp/dist/assets/stacks-IZ1mfizi.js +1 -0
- package/webapp/dist/assets/storage-CKXnhqkt.js +1 -0
- package/webapp/dist/assets/store-bqUBn2A4.js +1 -0
- package/webapp/dist/assets/sync-reading-CN0jPKAg.js +1 -0
- package/webapp/dist/assets/system-info-BFKNM-hf.js +1 -0
- package/webapp/dist/assets/table-BOWT6Y9d.js +1 -0
- package/webapp/dist/assets/table-viewport-Bp4pq-c_.js +1 -0
- package/webapp/dist/assets/tabs-k5NPGLnJ.js +1 -0
- package/webapp/dist/assets/terminal-BrP-ENHg.css +1 -0
- package/webapp/dist/assets/terminal-QWBau-Us.js +62 -0
- package/webapp/dist/assets/terminal-input-b7f2VoE_.js +2 -0
- package/webapp/dist/assets/topology-CPey5dP6.js +8 -0
- package/webapp/dist/assets/topology-metadata-dialog-BivuU2y6.js +2 -0
- package/webapp/dist/assets/topology-routes.worker-BoYrIzAH.js +1 -0
- package/webapp/dist/assets/traces-By0rdfDC.js +1 -0
- package/webapp/dist/assets/use-copy-to-clipboard-BWYpToS3.js +1 -0
- package/webapp/dist/assets/use-polled-resource-B22hhr5L.js +1 -0
- package/webapp/dist/assets/use-stack-context-UkBsF-l7.js +1 -0
- package/webapp/dist/assets/webapp-BnxOVfrc.css +1 -0
- package/webapp/dist/assets/webapp-D-UhjFhS.js +35 -0
- package/webapp/dist/console-version.json +1 -0
- package/webapp/dist/index.html +54 -7
- package/dist/release/daemon-omni.d.ts +0 -41
- package/dist/release/daemon-omni.d.ts.map +0 -1
- package/dist/release/daemon-omni.js +0 -59
- package/dist/release/daemon-omni.js.map +0 -1
- package/dist/services/netron-telemetry-transport.d.ts +0 -42
- package/dist/services/netron-telemetry-transport.d.ts.map +0 -1
- package/dist/services/netron-telemetry-transport.js +0 -93
- package/dist/services/netron-telemetry-transport.js.map +0 -1
- package/webapp/dist/assets/FormControlLabel-BrH2diyl.js +0 -1
- package/webapp/dist/assets/Grid-BZ7xhoHQ.js +0 -1
- package/webapp/dist/assets/Switch-DGSAxQPM.js +0 -1
- package/webapp/dist/assets/alerts-sXqHJbsa.js +0 -1
- package/webapp/dist/assets/apps-B_Ah8Flh.js +0 -1
- package/webapp/dist/assets/audit-YXihwyui.js +0 -1
- package/webapp/dist/assets/client-CGbBvy9k.js +0 -1
- package/webapp/dist/assets/constants-veKGFkC6.js +0 -1
- package/webapp/dist/assets/containers-Di4NOTLf.js +0 -2
- package/webapp/dist/assets/daemon-memory-CCPZ4cV_.js +0 -1
- package/webapp/dist/assets/dashboard-Cfuf95N3.js +0 -1
- package/webapp/dist/assets/dashboard-builder-CowaYb-M.js +0 -1
- package/webapp/dist/assets/deploy-release-dialog-D6C-XcKY.js +0 -1
- package/webapp/dist/assets/deployments-ChTq5kCw.js +0 -1
- package/webapp/dist/assets/detail-BsGWv7Dj.js +0 -1
- package/webapp/dist/assets/detail-CyVf_cw5.js +0 -2
- package/webapp/dist/assets/detail-D027j6aO.js +0 -8
- package/webapp/dist/assets/formatters-BqjL73N3.js +0 -1
- package/webapp/dist/assets/fs-Ccl3sAcp.js +0 -1
- package/webapp/dist/assets/index-B8AHIPc-.css +0 -1
- package/webapp/dist/assets/index-DiZbrwxT.js +0 -414
- package/webapp/dist/assets/logs-L2b8Oqmo.js +0 -12
- package/webapp/dist/assets/maplibre-gl-MlmG2kbn.js +0 -801
- package/webapp/dist/assets/metrics-CQgjz2Lz.js +0 -2
- package/webapp/dist/assets/nodes-Nwia2Ty6.js +0 -7
- package/webapp/dist/assets/pipelines-DCu_rXOr.js +0 -4
- package/webapp/dist/assets/projects-Bb4aV76h.js +0 -1
- package/webapp/dist/assets/react-CwJFpaho.js +0 -1
- package/webapp/dist/assets/react-apexcharts.esm-Dy0Fez42.js +0 -1956
- package/webapp/dist/assets/release-bits-Dj4EOhhb.js +0 -1
- package/webapp/dist/assets/release-build-panel-D6OCVlhT.js +0 -1
- package/webapp/dist/assets/releases-CnAt3yO6.js +0 -2
- package/webapp/dist/assets/rolldown-runtime-hePW80VL.js +0 -1
- package/webapp/dist/assets/settings-DU-mjiwb.js +0 -1
- package/webapp/dist/assets/settled-pair-C7SjZuns.js +0 -1
- package/webapp/dist/assets/sign-in-Bcvjrr4C.js +0 -1
- package/webapp/dist/assets/stacks-B-e8p50I.js +0 -1
- package/webapp/dist/assets/sync-reading-C3PnJ7AX.js +0 -1
- package/webapp/dist/assets/system-info-BtE3dgfw.js +0 -1
- package/webapp/dist/assets/topology-Cwch-uF1.js +0 -12
- package/webapp/dist/assets/traces-BbShR-4P.js +0 -1
- package/webapp/dist/assets/use-stack-context-CZUgPq88.js +0 -1
package/dist/daemon/daemon.js
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { RecoveryMutation, RecoveryBusyError } from './recovery-state.js';
|
|
11
|
+
import { BackendRecoveryMonitor } from './backend-recovery-monitor.js';
|
|
12
|
+
import { checkBackendCandidate } from './backend-candidate.js';
|
|
13
|
+
import { fileURLToPath } from 'node:url';
|
|
1
14
|
/**
|
|
2
15
|
* OmnitronDaemon — The daemon IS a Titan Application
|
|
3
16
|
*
|
|
@@ -17,16 +30,20 @@
|
|
|
17
30
|
* - RBAC: role-based access on all RPC endpoints (admin/operator/viewer)
|
|
18
31
|
* - Config resolution: secrets + env-aware injection into apps
|
|
19
32
|
*/
|
|
33
|
+
import path from 'node:path';
|
|
20
34
|
import { Application, ShutdownReason, ShutdownPriority, ApplicationEvent } from '@omnitron-dev/titan';
|
|
21
35
|
import { UnixSocketTransport } from '@omnitron-dev/titan/netron/transport/unix';
|
|
22
36
|
import { TcpTransport } from '@omnitron-dev/titan/netron/transport/tcp';
|
|
37
|
+
import { TransportRequestLimiter } from '@omnitron-dev/titan/netron';
|
|
23
38
|
import { HttpTransport } from '@omnitron-dev/titan/netron/transport/http';
|
|
24
39
|
import { WebSocketTransport } from '@omnitron-dev/titan/netron/transport/websocket';
|
|
25
40
|
import { LOGGER_SERVICE_TOKEN } from '@omnitron-dev/titan/module/logger';
|
|
26
41
|
import { SCHEDULER_SERVICE_TOKEN } from '@omnitron-dev/titan-scheduler';
|
|
27
42
|
import { HEALTH_SERVICE_TOKEN as TITAN_HEALTH_TOKEN } from '@omnitron-dev/titan-health';
|
|
28
43
|
import os from 'node:os';
|
|
29
|
-
import {
|
|
44
|
+
import { isLoopbackHost, assertSafeNetworkPublication } from './network-publication.js';
|
|
45
|
+
export { isLoopbackHost } from './network-publication.js';
|
|
46
|
+
import { CLI_VERSION, DEFAULT_DAEMON_CONFIG, OMNITRON_HOME } from '../config/defaults.js';
|
|
30
47
|
import { createDaemonModule, getDaemonLogStream, getDaemonErrorStream, getDaemonLogCollectorStream } from './daemon.module.js';
|
|
31
48
|
import { DaemonRpcService } from './daemon.rpc-service.js';
|
|
32
49
|
import { AuthRpcService } from '../services/auth.rpc-service.js';
|
|
@@ -39,21 +56,30 @@ import { SyncRpcService } from '../services/sync.rpc-service.js';
|
|
|
39
56
|
import { SystemInfoService } from '../services/system-info.service.js';
|
|
40
57
|
import { SystemInfoRpcService } from '../services/system-info.rpc-service.js';
|
|
41
58
|
import { PidManager } from './pid-manager.js';
|
|
59
|
+
import { prepareDaemonDatabase } from './database-startup.js';
|
|
42
60
|
import { FileWatcher } from '../orchestrator/file-watcher.js';
|
|
43
61
|
import { InfrastructureService } from '../infrastructure/infrastructure.service.js';
|
|
44
62
|
import { DockerHealthIndicator } from '../monitoring/docker-health.indicator.js';
|
|
45
63
|
import { AppHealthIndicator } from '../monitoring/app-health.indicator.js';
|
|
46
64
|
import { EventLoopWatch } from '../monitoring/event-loop-watch.js';
|
|
47
65
|
import { EventLoopStallIndicator } from '../monitoring/event-loop-stall.indicator.js';
|
|
66
|
+
import { runtimeDiagnostics } from '../monitoring/runtime-diagnostics.js';
|
|
48
67
|
import { registerDaemonJobs } from './daemon-scheduler.js';
|
|
49
|
-
import { METRICS_SERVICE_TOKEN as TITAN_METRICS_TOKEN } from '@omnitron-dev/titan-metrics';
|
|
50
|
-
import { ORCHESTRATOR_TOKEN, LOG_MANAGER_TOKEN, STATE_STORE_TOKEN, OMNITRON_DB_TOKEN, AUTH_SERVICE_TOKEN, LOG_COLLECTOR_TOKEN, FLEET_SERVICE_TOKEN, ALERT_SERVICE_TOKEN, HEALTH_CHECK_SERVICE_TOKEN, DISCOVERY_SERVICE_TOKEN, KUBERNETES_SERVICE_TOKEN, PIPELINE_SERVICE_TOKEN, TRACE_COLLECTOR_TOKEN, BACKUP_SERVICE_TOKEN, SECRETS_SERVICE_TOKEN, AUDIT_SERVICE_TOKEN, DAEMON_STATE_STORE_TOKEN, TELEMETRY_RELAY_TOKEN, DEPLOY_SERVICE_TOKEN, INFRASTRUCTURE_GATE_TOKEN, PROJECT_SERVICE_TOKEN,
|
|
68
|
+
import { METRICS_SERVICE_TOKEN as TITAN_METRICS_TOKEN, METRICS_STORAGE_TOKEN, PostgresMetricsStorage, parseMaxAge } from '@omnitron-dev/titan-metrics';
|
|
69
|
+
import { ORCHESTRATOR_TOKEN, LOG_MANAGER_TOKEN, STATE_STORE_TOKEN, OMNITRON_DB_TOKEN, AUTH_SERVICE_TOKEN, LOG_COLLECTOR_TOKEN, FLEET_SERVICE_TOKEN, ALERT_SERVICE_TOKEN, HEALTH_CHECK_SERVICE_TOKEN, DISCOVERY_SERVICE_TOKEN, KUBERNETES_SERVICE_TOKEN, PIPELINE_SERVICE_TOKEN, TRACE_COLLECTOR_TOKEN, BACKUP_SERVICE_TOKEN, SECRETS_SERVICE_TOKEN, AUDIT_SERVICE_TOKEN, DAEMON_STATE_STORE_TOKEN, TELEMETRY_RELAY_TOKEN, DEPLOY_SERVICE_TOKEN, INFRASTRUCTURE_GATE_TOKEN, PROJECT_SERVICE_TOKEN, SYNC_SERVICE_TOKEN, } from '../shared/tokens.js';
|
|
51
70
|
import { APP_EVENTS, INFRA_EVENTS, DAEMON_EVENTS, PROJECT_EVENTS, STACK_EVENTS, NODE_EVENTS, } from '../shared/events.js';
|
|
52
71
|
import { JWT_SERVICE_TOKEN } from '@omnitron-dev/titan-auth';
|
|
53
72
|
import { AuthenticationManager, AuthorizationManager, } from '@omnitron-dev/titan/netron/auth';
|
|
54
73
|
import { createAuthContextWrapper } from '../services/auth-context.js';
|
|
74
|
+
import { createDaemonTokenValidator, createDaemonPrincipalValidator } from '../services/daemon-authority.js';
|
|
55
75
|
import { ROLES } from '../shared/roles.js';
|
|
56
76
|
import { expandPath } from '../shared/paths.js';
|
|
77
|
+
import { createNullLogger } from '@omnitron-dev/titan/module/logger';
|
|
78
|
+
import { connectExecutionOwner } from './execution-launcher.js';
|
|
79
|
+
import { BackendRpcService } from './backend.rpc-service.js';
|
|
80
|
+
import { startBackendControl } from './backend-control.js';
|
|
81
|
+
import { withControlDeadline } from './private-control-client.js';
|
|
82
|
+
import { Errors } from '@omnitron-dev/titan/errors';
|
|
57
83
|
/**
|
|
58
84
|
* Deadline for a request on the daemon's unix socket.
|
|
59
85
|
*
|
|
@@ -100,34 +126,7 @@ export function fleetBindHostFor(dc) {
|
|
|
100
126
|
return dc.host ?? '0.0.0.0';
|
|
101
127
|
return resolveBindHost(dc.host);
|
|
102
128
|
}
|
|
103
|
-
|
|
104
|
-
* The bind address a daemon should END UP with, from what was actually
|
|
105
|
-
* configured.
|
|
106
|
-
*
|
|
107
|
-
* `fleetBindHostFor` above takes the daemon's RUNNING config, and by the time
|
|
108
|
-
* anything holds one, `host` has been filled in from `DEFAULT_DAEMON_CONFIG`
|
|
109
|
-
* — so `?? '0.0.0.0'` can never fire and every slave binds loopback. The
|
|
110
|
-
* information it needs is whether an operator SET a host, and only the saved
|
|
111
|
-
* file knows that: absent means "no opinion", `127.0.0.1` means "loopback,
|
|
112
|
-
* deliberately".
|
|
113
|
-
*
|
|
114
|
-
* Measured 2026-09-14 on a provisioned slave, after the rule was written and
|
|
115
|
-
* before this existed:
|
|
116
|
-
*
|
|
117
|
-
* LISTEN 127.0.0.1:9700 ← the fleet port no master can dial
|
|
118
|
-
* LISTEN 127.0.0.1:9801
|
|
119
|
-
* LISTEN 127.0.0.1:9802
|
|
120
|
-
*
|
|
121
|
-
* The rule was right, the value it was given was already decided. This is the
|
|
122
|
-
* same rule applied where the answer is still open.
|
|
123
|
-
*/
|
|
124
|
-
export function effectiveBindHost(saved) {
|
|
125
|
-
if (saved?.host)
|
|
126
|
-
return saved.host;
|
|
127
|
-
if (saved?.role === 'slave')
|
|
128
|
-
return '0.0.0.0';
|
|
129
|
-
return DEFAULT_DAEMON_CONFIG.host;
|
|
130
|
-
}
|
|
129
|
+
export { effectiveBindHost } from '../config/saved.js';
|
|
131
130
|
/**
|
|
132
131
|
* Where a daemon binds the surfaces that exist to serve a console: the Netron
|
|
133
132
|
* HTTP RPC and the WebSocket.
|
|
@@ -144,20 +143,9 @@ export function effectiveBindHost(saved) {
|
|
|
144
143
|
export function consoleBindHostFor(dc) {
|
|
145
144
|
return dc.role === 'slave' ? '127.0.0.1' : resolveBindHost(dc.host);
|
|
146
145
|
}
|
|
147
|
-
/** Addresses that reach this host and nowhere else. */
|
|
148
|
-
export function isLoopbackHost(host) {
|
|
149
|
-
if (!host)
|
|
150
|
-
return true; // absent means the loopback default above
|
|
151
|
-
const h = host.trim().toLowerCase();
|
|
152
|
-
return h === '127.0.0.1' || h === 'localhost' || h === '::1' || h === '[::1]' || h.startsWith('127.');
|
|
153
|
-
}
|
|
154
146
|
/**
|
|
155
147
|
* Is the daemon still accepting the password its own migration seeded?
|
|
156
|
-
*
|
|
157
|
-
* Resolves the auth service lazily and answers `false` on any failure — a
|
|
158
|
-
* daemon that cannot reach its database has a louder problem than this, and
|
|
159
|
-
* a warning that fails the boot would be a worse trade than the risk it
|
|
160
|
-
* describes.
|
|
148
|
+
* A failed check cannot authorize external ingress.
|
|
161
149
|
*/
|
|
162
150
|
async function isSeededAdminPasswordInUse(app, logger) {
|
|
163
151
|
try {
|
|
@@ -166,7 +154,7 @@ async function isSeededAdminPasswordInUse(app, logger) {
|
|
|
166
154
|
}
|
|
167
155
|
catch (err) {
|
|
168
156
|
logger.warn({ err: err.message }, 'Could not check whether the seeded admin password is still in use');
|
|
169
|
-
|
|
157
|
+
throw err;
|
|
170
158
|
}
|
|
171
159
|
}
|
|
172
160
|
/**
|
|
@@ -201,6 +189,8 @@ export class OmnitronDaemon {
|
|
|
201
189
|
/** Port this daemon serves `/netron/invoke` on; advertised to fleet peers. */
|
|
202
190
|
rpcHttpPort = null;
|
|
203
191
|
fileWatcher = null;
|
|
192
|
+
/** Last boot/reload configuration, which may come from a registered project outside CWD. */
|
|
193
|
+
watchConfig = null;
|
|
204
194
|
infraService = null;
|
|
205
195
|
eventLoopWatch = null;
|
|
206
196
|
eventBroadcaster = null;
|
|
@@ -208,7 +198,13 @@ export class OmnitronDaemon {
|
|
|
208
198
|
nodeManagerService = null;
|
|
209
199
|
slaveConnector = null;
|
|
210
200
|
meshHandle = null;
|
|
201
|
+
ownerAdmissionProof;
|
|
202
|
+
kernelRollouts;
|
|
211
203
|
nodeManagerRpcService = null;
|
|
204
|
+
terminalRpcService = null;
|
|
205
|
+
fileNode = null;
|
|
206
|
+
filesRpcService = null;
|
|
207
|
+
pipelineService = null;
|
|
212
208
|
/**
|
|
213
209
|
* The live record of release builds this daemon is running.
|
|
214
210
|
*
|
|
@@ -217,6 +213,7 @@ export class OmnitronDaemon {
|
|
|
217
213
|
* directory with no manifest, and that — not this — is the durable trace.
|
|
218
214
|
*/
|
|
219
215
|
releaseService = null;
|
|
216
|
+
backupService = null;
|
|
220
217
|
systemWorkerManager = null;
|
|
221
218
|
/** Everything the health-monitor worker needs to be spawned again. */
|
|
222
219
|
healthWorkerSpawn = null;
|
|
@@ -226,17 +223,196 @@ export class OmnitronDaemon {
|
|
|
226
223
|
healthWorkerStartupTimeout = 0;
|
|
227
224
|
/** In-daemon check timer, armed only while the worker is down. */
|
|
228
225
|
fallbackNodeCheckTimer = null;
|
|
229
|
-
/**
|
|
226
|
+
/** Latched when shutdown begins, before any asynchronous cleanup. */
|
|
230
227
|
isShuttingDown = false;
|
|
228
|
+
/** app.stop() owns its task pass; only app.shutdown() may be joined here. */
|
|
229
|
+
shutdownRequested = false;
|
|
230
|
+
startupAbort = new AbortController();
|
|
231
|
+
startupWork = null;
|
|
232
|
+
healthMonitorStartup = null;
|
|
231
233
|
leaderElection = null;
|
|
234
|
+
clusterDb;
|
|
232
235
|
configSyncService = null;
|
|
233
236
|
metricsServer = null;
|
|
234
237
|
metricsBridge = null;
|
|
238
|
+
metricSampling;
|
|
235
239
|
dc = DEFAULT_DAEMON_CONFIG;
|
|
240
|
+
execution = null;
|
|
241
|
+
handingOffBackend = false;
|
|
242
|
+
preparingBackend = false;
|
|
243
|
+
backendAdmitted = true;
|
|
244
|
+
stopApplicationsOnExit = false;
|
|
245
|
+
backendControl = null;
|
|
246
|
+
recoveryMonitor = null;
|
|
247
|
+
supervision;
|
|
236
248
|
/** Daemon config accessor for external use (e.g., DaemonRpcService) */
|
|
237
249
|
get daemonConfig() { return this.dc; }
|
|
250
|
+
assertBackendReady() {
|
|
251
|
+
if (!this.backendAdmitted)
|
|
252
|
+
throw Errors.unavailable('Omnitron backend', 'The replacement is restoring its checkpoint; retry after readiness');
|
|
253
|
+
}
|
|
254
|
+
backendControlAddress() {
|
|
255
|
+
if (!this.backendControl)
|
|
256
|
+
throw new Error(this.backendRuntimeStatus().reason ?? 'Backend control is not ready');
|
|
257
|
+
return this.backendControl.socket;
|
|
258
|
+
}
|
|
259
|
+
backendRuntimeStatus() {
|
|
260
|
+
const owner = this.execution?.state();
|
|
261
|
+
return {
|
|
262
|
+
mode: this.execution ? 'resident' : 'coupled', handoffSupported: !!this.execution,
|
|
263
|
+
...(!this.execution ? { reason: 'This daemon owns application forks and threads directly. Installing the resident owner requires one controlled application restart; hot adoption is unavailable.' } : {}),
|
|
264
|
+
...(owner ?? {}),
|
|
265
|
+
...(this.recoveryMonitor ? { recovery: this.recoveryMonitor.status() } : {}),
|
|
266
|
+
...(this.supervision ? { supervision: this.supervision } : {}),
|
|
267
|
+
blockers: {
|
|
268
|
+
...(this.kernelRollouts?.activeCount() ? { kernelRollouts: this.kernelRollouts.activeCount() } : {}),
|
|
269
|
+
terminalSessions: this.terminalRpcService?.activeSessionCount() ?? 0,
|
|
270
|
+
fileTransfers: (this.filesRpcService?.activeTransferCount() ?? 0) + (this.fileNode?.activeOperationCount() ?? 0),
|
|
271
|
+
pipelineRuns: this.pipelineService?.activeRunCount() ?? 0,
|
|
272
|
+
releaseBuilds: this.releaseService?.builds().filter(build => build.state === 'running').length ?? 0,
|
|
273
|
+
backupOperations: this.backupService?.activeOperationCount() ?? 0,
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
/** Expensive only for legacy independently supervised owners. Reuse a running
|
|
278
|
+
* verification for concurrent admissions, never a previous admission result. */
|
|
279
|
+
async attestApplicationOwner(expected) {
|
|
280
|
+
const client = this.execution;
|
|
281
|
+
const { owner, epoch } = expected ?? {};
|
|
282
|
+
if (!client || !owner || typeof owner.id !== 'string' || !owner.id || owner.id.length > 128 ||
|
|
283
|
+
!Number.isSafeInteger(owner.pid) || owner.pid < 1 || typeof owner.startedAt !== 'string' ||
|
|
284
|
+
owner.startedAt.length > 64 || !Number.isSafeInteger(epoch) || epoch < 1)
|
|
285
|
+
throw new Error('Invalid resident owner observation for admission');
|
|
286
|
+
const key = JSON.stringify([owner.id, owner.pid, owner.startedAt, epoch]);
|
|
287
|
+
if (this.ownerAdmissionProof) {
|
|
288
|
+
if (this.ownerAdmissionProof.key !== key)
|
|
289
|
+
throw new Error('Another owner is being checked. Refresh the target before admission.');
|
|
290
|
+
return this.ownerAdmissionProof.build;
|
|
291
|
+
}
|
|
292
|
+
const observe = async () => {
|
|
293
|
+
const snapshot = await client.recoverySnapshot();
|
|
294
|
+
const status = snapshot.status, live = client.state();
|
|
295
|
+
if (live?.phase !== 'active' || live.connection.status !== 'connected' || live.epoch !== epoch ||
|
|
296
|
+
live.owner.id !== owner.id || live.owner.pid !== owner.pid || live.owner.startedAt !== owner.startedAt ||
|
|
297
|
+
this.execution !== client || this.isShuttingDown || this.handingOffBackend || this.preparingBackend ||
|
|
298
|
+
status.phase !== 'active' || status.controller.controllerId !== client.controllerId || status.controller.epoch !== epoch ||
|
|
299
|
+
status.owner.id !== owner.id || status.owner.pid !== owner.pid || status.owner.startedAt !== owner.startedAt)
|
|
300
|
+
throw new Error('Application owner or controller changed during admission');
|
|
301
|
+
return snapshot;
|
|
302
|
+
};
|
|
303
|
+
const verify = async () => {
|
|
304
|
+
const before = await observe();
|
|
305
|
+
if (before.ownerBuild !== undefined) {
|
|
306
|
+
if (!before.ownerBuild || before.ownerBuild.dirty !== false)
|
|
307
|
+
throw new Error('Execution owner did not report a clean build');
|
|
308
|
+
return before.ownerBuild;
|
|
309
|
+
}
|
|
310
|
+
if (!this.supervision)
|
|
311
|
+
throw new Error('This legacy owner requires independent OS supervision to attest its framework build');
|
|
312
|
+
const { attestManagedOwnerBuild } = await import('./managed-owner-build.js');
|
|
313
|
+
const build = await attestManagedOwnerBuild(OMNITRON_HOME, owner);
|
|
314
|
+
const after = await observe();
|
|
315
|
+
if (after.ownerBuild !== undefined && (after.ownerBuild?.commit !== build.commit || after.ownerBuild?.dirty !== false))
|
|
316
|
+
throw new Error('Execution owner reported a different build during native verification');
|
|
317
|
+
return build;
|
|
318
|
+
};
|
|
319
|
+
const build = verify();
|
|
320
|
+
this.ownerAdmissionProof = { key, build };
|
|
321
|
+
try {
|
|
322
|
+
return await build;
|
|
323
|
+
}
|
|
324
|
+
finally {
|
|
325
|
+
this.ownerAdmissionProof = undefined;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/** Called after the initiating RPC has returned, so it is not waiting for itself. */
|
|
329
|
+
async prepareBackendHandoff(candidateId) {
|
|
330
|
+
if (!this.execution || !this.app?.netron || !this.watchConfig)
|
|
331
|
+
throw new Error(this.backendRuntimeStatus().reason ?? 'Backend is not ready');
|
|
332
|
+
if (this.handingOffBackend || this.preparingBackend)
|
|
333
|
+
throw new Error('A backend handoff is already in progress');
|
|
334
|
+
const assertIdle = () => {
|
|
335
|
+
const blockers = this.backendRuntimeStatus().blockers;
|
|
336
|
+
const active = Object.entries(blockers).filter(([, count]) => count > 0);
|
|
337
|
+
if (active.length)
|
|
338
|
+
throw new Error(`Finish active work before replacing the backend: ${active.map(([name, count]) => `${name}=${count}`).join(', ')}`);
|
|
339
|
+
};
|
|
340
|
+
assertIdle();
|
|
341
|
+
this.preparingBackend = true;
|
|
342
|
+
await this.recoveryMonitor?.close(true);
|
|
343
|
+
this.recoveryMonitor = null;
|
|
344
|
+
const gate = this.app.netron.inbound;
|
|
345
|
+
let projects;
|
|
346
|
+
try {
|
|
347
|
+
this.backupService?.prepareHandoff();
|
|
348
|
+
projects = await this.app.container.resolveAsync(PROJECT_SERVICE_TOKEN);
|
|
349
|
+
const drained = await gate.drain(30_000);
|
|
350
|
+
if (!drained.drained)
|
|
351
|
+
throw new Error(`${drained.left} inbound request(s) have not drained; backend transfer was refused`);
|
|
352
|
+
assertIdle();
|
|
353
|
+
const projectState = await projects.prepareHandoff();
|
|
354
|
+
const infrastructure = await this.infraService?.prepareHandoff() ?? null;
|
|
355
|
+
if (this.metricSampling)
|
|
356
|
+
await withControlDeadline(this.metricSampling.pauseAndFlush(), 30_000, 'Metric collection has not drained to storage; the current backend will remain active');
|
|
357
|
+
const prepared = await withControlDeadline(this.execution.prepare(candidateId), 30_000, 'Execution mutations have not drained; the current backend will remain active');
|
|
358
|
+
return { protocol: 1, ticket: prepared.ticket, projects: projectState, infrastructure,
|
|
359
|
+
executionInventory: prepared.snapshot.inventoryDigest, watchConfig: this.watchConfig };
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
await this.execution.abortCandidate(candidateId);
|
|
363
|
+
this.metricSampling?.resume();
|
|
364
|
+
projects?.resumeAfterHandoff();
|
|
365
|
+
await this.backupService?.resumeAfterHandoff();
|
|
366
|
+
this.infraService?.resumeAfterHandoff();
|
|
367
|
+
gate.reopen();
|
|
368
|
+
this.preparingBackend = false;
|
|
369
|
+
await (await this.initializeRecoveryMonitor())?.start();
|
|
370
|
+
throw error;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
async abortBackendHandoff(state) {
|
|
374
|
+
if (!this.execution || !this.app || this.handingOffBackend)
|
|
375
|
+
throw new Error('The old backend can no longer resume; restore a controller through the resident owner');
|
|
376
|
+
await this.execution.abort(state.ticket);
|
|
377
|
+
this.metricSampling?.resume();
|
|
378
|
+
await this.backupService?.resumeAfterHandoff();
|
|
379
|
+
const projects = await this.app.container.resolveAsync(PROJECT_SERVICE_TOKEN);
|
|
380
|
+
projects.resumeAfterHandoff();
|
|
381
|
+
this.infraService?.resumeAfterHandoff();
|
|
382
|
+
this.app.netron?.inbound.reopen();
|
|
383
|
+
this.preparingBackend = false;
|
|
384
|
+
await (await this.initializeRecoveryMonitor())?.start();
|
|
385
|
+
}
|
|
386
|
+
async retireBackend() {
|
|
387
|
+
if (!this.execution || !this.app?.netron?.inbound.isDraining)
|
|
388
|
+
throw new Error('Backend must be drained with a resident owner before retirement');
|
|
389
|
+
this.handingOffBackend = true;
|
|
390
|
+
await this.app.stop({ timeout: 60_000 });
|
|
391
|
+
}
|
|
392
|
+
/** False means shutdown interrupted boot; callers must not announce readiness. */
|
|
238
393
|
async start(config, options, daemonConfig) {
|
|
394
|
+
if (this.startupWork)
|
|
395
|
+
throw new Error('Daemon startup was already requested');
|
|
396
|
+
this.startupWork = this.startRuntime(config, options, daemonConfig);
|
|
397
|
+
try {
|
|
398
|
+
await this.startupWork;
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
if (this.shutdownRequested) {
|
|
403
|
+
// Join Titan's existing shutdown after the raw startup work settles.
|
|
404
|
+
// The first shutdown task waits for that work, never this wrapper.
|
|
405
|
+
await this.app?.shutdown(ShutdownReason.Manual);
|
|
406
|
+
}
|
|
407
|
+
if (this.startupAbort.signal.aborted && error === this.startupAbort.signal.reason)
|
|
408
|
+
return false;
|
|
409
|
+
throw error;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
async startRuntime(config, options, daemonConfig) {
|
|
413
|
+
this.backendAdmitted = !options?.backendHandoff;
|
|
239
414
|
this.dc = daemonConfig ?? DEFAULT_DAEMON_CONFIG;
|
|
415
|
+
this.watchConfig = options?.backendHandoff?.watchConfig ?? config;
|
|
240
416
|
const pidFile = expandPath(this.dc.pidFile);
|
|
241
417
|
this.pidManager = new PidManager(pidFile);
|
|
242
418
|
if (this.pidManager.isRunning()) {
|
|
@@ -249,12 +425,30 @@ export class OmnitronDaemon {
|
|
|
249
425
|
// markers; live daemons get the conflict error above.
|
|
250
426
|
this.pidManager.remove();
|
|
251
427
|
this.pidManager.write();
|
|
428
|
+
await prepareDaemonDatabase(this.dc.role, {
|
|
429
|
+
noInfra: Boolean(options?.noInfra),
|
|
430
|
+
handoff: Boolean(options?.backendHandoff),
|
|
431
|
+
});
|
|
252
432
|
// 1. Create Titan Application (the daemon itself)
|
|
253
|
-
|
|
433
|
+
if (this.dc.executionHost?.enabled) {
|
|
434
|
+
const connection = await connectExecutionOwner(config, this.dc, createNullLogger(), options?.backendHandoff?.ticket);
|
|
435
|
+
this.execution = connection.client;
|
|
436
|
+
this.supervision = connection.supervision;
|
|
437
|
+
await this.initializeRecoveryMonitor();
|
|
438
|
+
}
|
|
439
|
+
else if (options?.backendHandoff) {
|
|
440
|
+
throw new Error('Backend handoff requires the resident execution owner');
|
|
441
|
+
}
|
|
442
|
+
const DaemonModule = createDaemonModule(config, this.dc, this.execution?.orchestrator);
|
|
254
443
|
this.app = await Application.create(DaemonModule, {
|
|
255
444
|
name: 'omnitron',
|
|
256
445
|
version: CLI_VERSION,
|
|
257
446
|
});
|
|
447
|
+
const loggerModule = await this.app.container.resolveAsync(LOGGER_SERVICE_TOKEN);
|
|
448
|
+
const logger = loggerModule.logger;
|
|
449
|
+
// Install the complete cleanup contract BEFORE Titan installs signal
|
|
450
|
+
// handlers. A stop during boot must own every resource boot can create.
|
|
451
|
+
this.registerShutdownTasks(this.app, logger);
|
|
258
452
|
// P1-M — install our own SIGHUP handler BEFORE Application's
|
|
259
453
|
// default shutdown handlers attach, so `kill -HUP <daemon>`
|
|
260
454
|
// triggers a config reload (the Unix convention for long-running
|
|
@@ -262,7 +456,9 @@ export class OmnitronDaemon {
|
|
|
262
456
|
// this through the Application's signal manager because that
|
|
263
457
|
// path is wired to `runShutdownTasks()`; we install at the
|
|
264
458
|
// process level and the listener runs first.
|
|
265
|
-
|
|
459
|
+
const reloadOnHup = () => {
|
|
460
|
+
if (this.isShuttingDown)
|
|
461
|
+
return;
|
|
266
462
|
this.reloadConfigOnHup().catch((err) => {
|
|
267
463
|
// The message already carries which steps applied — printing only
|
|
268
464
|
// `.message` was fine for the load failure and misleading for the
|
|
@@ -273,47 +469,67 @@ export class OmnitronDaemon {
|
|
|
273
469
|
console.warn(`[omnitron] caused by: ${cause.stack ?? String(cause)}`);
|
|
274
470
|
}
|
|
275
471
|
});
|
|
276
|
-
}
|
|
472
|
+
};
|
|
473
|
+
process.on('SIGHUP', reloadOnHup);
|
|
474
|
+
this.app.registerCleanup(() => { process.off('SIGHUP', reloadOnHup); });
|
|
277
475
|
// 2. Register transports (Unix, TCP, HTTP, WebSocket)
|
|
278
476
|
await this.registerTransports(this.dc);
|
|
477
|
+
this.startupAbort.signal.throwIfAborted();
|
|
279
478
|
// 3. Resolve and expose RPC services via Netron
|
|
280
479
|
await this.exposeRpcServices(config, this.dc);
|
|
480
|
+
this.startupAbort.signal.throwIfAborted();
|
|
481
|
+
// Reconcile bookkeeping before any new public listener can admit a
|
|
482
|
+
// command. Adoption only reads native container identities; it never
|
|
483
|
+
// deploys an app or applies a new infrastructure declaration.
|
|
484
|
+
if (options?.backendHandoff) {
|
|
485
|
+
const projects = await this.app.container.resolveAsync(PROJECT_SERVICE_TOKEN);
|
|
486
|
+
await projects.adoptHandoff(options.backendHandoff.projects);
|
|
487
|
+
if (options.backendHandoff.infrastructure) {
|
|
488
|
+
const logging = await this.app.container.resolveAsync(LOGGER_SERVICE_TOKEN);
|
|
489
|
+
this.infraService = await InfrastructureService.adoptHandoff(logging.logger, options.backendHandoff.infrastructure);
|
|
490
|
+
}
|
|
491
|
+
this.startupAbort.signal.throwIfAborted();
|
|
492
|
+
}
|
|
281
493
|
// 4. Start the Titan Application (boots DI, starts Netron, opens transports)
|
|
282
494
|
await this.app.start();
|
|
283
|
-
|
|
284
|
-
|
|
495
|
+
this.startupAbort.signal.throwIfAborted();
|
|
496
|
+
this.execution?.setLogger(logger);
|
|
497
|
+
if (this.execution)
|
|
498
|
+
this.backendControl = await startBackendControl(this, this.execution.controllerId, logger);
|
|
499
|
+
this.startupAbort.signal.throwIfAborted();
|
|
500
|
+
runtimeDiagnostics.setLogger(logger);
|
|
285
501
|
// As soon as there is somewhere to say it, so a stall in the boot's own
|
|
286
502
|
// steps — infrastructure, migrations — is seen too. A node whose loop
|
|
287
503
|
// stands still answers nothing, its heartbeat included, and until this
|
|
288
504
|
// nothing on the node could say so. See `monitoring/event-loop-watch.ts`.
|
|
289
505
|
this.eventLoopWatch = new EventLoopWatch(logger);
|
|
290
506
|
this.eventLoopWatch.start();
|
|
291
|
-
logger.info({
|
|
292
|
-
socketPath: this.dc.socketPath,
|
|
293
|
-
port: this.dc.port,
|
|
294
|
-
httpPort: this.dc.httpPort,
|
|
295
|
-
wsPort: (this.dc.httpPort ?? 9800) + 2,
|
|
296
|
-
host: this.dc.host,
|
|
297
|
-
pid: process.pid,
|
|
298
|
-
version: CLI_VERSION,
|
|
299
|
-
}, 'Omnitron daemon started');
|
|
300
507
|
// 5. Wire log persistence
|
|
301
508
|
await this.wireLogPersistence();
|
|
509
|
+
this.startupAbort.signal.throwIfAborted();
|
|
302
510
|
// 5.5. Check for crash recovery
|
|
303
|
-
|
|
511
|
+
if (!this.execution)
|
|
512
|
+
await this.checkCrashRecovery(logger);
|
|
513
|
+
this.startupAbort.signal.throwIfAborted();
|
|
304
514
|
// 6. Provision infrastructure (omnitron-pg + app infra from config.infrastructure)
|
|
305
|
-
|
|
515
|
+
if (options?.backendHandoff) {
|
|
516
|
+
const gate = await this.app.container.resolveAsync(INFRASTRUCTURE_GATE_TOKEN);
|
|
517
|
+
gate.markReady(this.infraService?.getState() ?? { services: {}, ready: true });
|
|
518
|
+
}
|
|
519
|
+
else
|
|
520
|
+
await this.startInfrastructure(config, options, logger);
|
|
521
|
+
this.startupAbort.signal.throwIfAborted();
|
|
306
522
|
// 7. Register custom health indicators (Docker + apps)
|
|
307
523
|
await this.registerHealthIndicators();
|
|
524
|
+
this.startupAbort.signal.throwIfAborted();
|
|
308
525
|
// 8. File watching (dev mode)
|
|
309
|
-
|
|
310
|
-
|
|
526
|
+
if (!options?.backendHandoff)
|
|
527
|
+
await this.startFileWatcher(config, options, logger);
|
|
528
|
+
this.startupAbort.signal.throwIfAborted();
|
|
529
|
+
// 8.5. Configure application-owned topology listeners for in-process ownership.
|
|
311
530
|
{
|
|
312
531
|
const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
|
|
313
|
-
|
|
314
|
-
const socketPath = expandPath(this.dc.socketPath);
|
|
315
|
-
orchestrator.setDaemonNetron(this.app.netron, socketPath);
|
|
316
|
-
}
|
|
532
|
+
orchestrator.setTopologyDirectory(path.join(path.dirname(expandPath(this.dc.socketPath)), 'topology'));
|
|
317
533
|
// 8.6. Wire metrics bridge + start /metrics HTTP endpoint.
|
|
318
534
|
// Bridge subscribes to orchestrator events (restart/crash/escalation),
|
|
319
535
|
// janitor sweeps, and esbuild reset/build hooks. The HTTP server
|
|
@@ -339,11 +555,12 @@ export class OmnitronDaemon {
|
|
|
339
555
|
logger.warn({ error: err.message }, 'metrics endpoint failed to start — /metrics will be unavailable');
|
|
340
556
|
}
|
|
341
557
|
}
|
|
558
|
+
this.startupAbort.signal.throwIfAborted();
|
|
342
559
|
// 8.8. Start webapp (nginx container serving Console UI) if enabled
|
|
343
560
|
{
|
|
344
|
-
const { readSavedDaemonConfig } = await import('../
|
|
561
|
+
const { readSavedDaemonConfig } = await import('../config/saved.js');
|
|
345
562
|
const savedConfig = readSavedDaemonConfig();
|
|
346
|
-
if (savedConfig?.webapp) {
|
|
563
|
+
if (savedConfig?.webapp && !options?.backendHandoff) {
|
|
347
564
|
try {
|
|
348
565
|
const { WebappService } = await import('../webapp/webapp.service.js');
|
|
349
566
|
// Publishing the console while the seeded password is still in
|
|
@@ -371,6 +588,7 @@ export class OmnitronDaemon {
|
|
|
371
588
|
}
|
|
372
589
|
}
|
|
373
590
|
}
|
|
591
|
+
this.startupAbort.signal.throwIfAborted();
|
|
374
592
|
// 8.9. Fleet monitoring. Started BEFORE managed apps and not awaited.
|
|
375
593
|
//
|
|
376
594
|
// It used to be step 11.5, after `startApps`, `startScheduledTasks` and
|
|
@@ -386,36 +604,92 @@ export class OmnitronDaemon {
|
|
|
386
604
|
// worker has a 30-second startup timeout, and the applications should not
|
|
387
605
|
// wait behind it. The function handles and logs its own failures, and arms
|
|
388
606
|
// the in-daemon fallback checks when the worker cannot run.
|
|
389
|
-
|
|
607
|
+
this.healthMonitorStartup = this.startHealthMonitorWorker(logger).catch((err) => {
|
|
390
608
|
// It handles its own failures; this is the last resort, because an
|
|
391
609
|
// unhandled rejection is a crash of the daemon rather than a lost
|
|
392
610
|
// subsystem.
|
|
393
611
|
logger.error({ error: err.message }, 'Health monitor startup threw');
|
|
394
612
|
});
|
|
395
613
|
// 9. Start managed apps (waits for infra gate if apps have `requires`)
|
|
396
|
-
|
|
614
|
+
if (!options?.backendHandoff)
|
|
615
|
+
await this.startApps(config, logger);
|
|
616
|
+
this.startupAbort.signal.throwIfAborted();
|
|
397
617
|
// 10. Start background tasks via titan-scheduler (replaces bare setInterval)
|
|
398
618
|
await this.startScheduledTasks(config, logger);
|
|
619
|
+
this.startupAbort.signal.throwIfAborted();
|
|
399
620
|
// 11. Start remaining background services (telemetry, traces, leader election)
|
|
400
621
|
await this.startBackgroundServices(config, logger);
|
|
622
|
+
this.startupAbort.signal.throwIfAborted();
|
|
401
623
|
// (Fleet monitoring is started at 8.5, above — before managed apps.)
|
|
402
624
|
// 12. Wire event broadcasting (orchestrator events → WebSocket push)
|
|
403
625
|
await this.wireEventBroadcasting(logger);
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
this.
|
|
626
|
+
this.startupAbort.signal.throwIfAborted();
|
|
627
|
+
await this.execution?.activateObservations();
|
|
628
|
+
this.startupAbort.signal.throwIfAborted();
|
|
629
|
+
if (options?.backendHandoff) {
|
|
630
|
+
const projects = await this.app.container.resolveAsync(PROJECT_SERVICE_TOKEN);
|
|
631
|
+
this.startupAbort.signal.throwIfAborted();
|
|
632
|
+
projects.resumeAfterHandoff();
|
|
633
|
+
this.infraService?.resumeAfterHandoff();
|
|
634
|
+
}
|
|
635
|
+
await this.recoveryMonitor?.start();
|
|
636
|
+
this.startupAbort.signal.throwIfAborted();
|
|
637
|
+
this.backendAdmitted = true;
|
|
638
|
+
this.metricSampling?.resume();
|
|
639
|
+
logger.info({ socketPath: this.dc.socketPath, port: this.dc.port,
|
|
640
|
+
httpPort: this.dc.httpPort, wsPort: (this.dc.httpPort ?? 9800) + 2,
|
|
641
|
+
host: this.dc.host, pid: process.pid, version: CLI_VERSION }, 'Omnitron daemon started');
|
|
407
642
|
// 15. Broadcast daemon.started event
|
|
408
643
|
this.eventBroadcaster?.broadcast(DAEMON_EVENTS.STARTED, {
|
|
409
644
|
version: CLI_VERSION,
|
|
410
645
|
pid: process.pid,
|
|
411
646
|
});
|
|
412
647
|
}
|
|
648
|
+
async initializeRecoveryMonitor() {
|
|
649
|
+
if (!this.execution || this.recoveryMonitor)
|
|
650
|
+
return this.recoveryMonitor;
|
|
651
|
+
const directory = path.dirname(path.dirname(fileURLToPath(import.meta.url)));
|
|
652
|
+
// Source checkouts remain usable. Automatic recovery requires a sealed
|
|
653
|
+
// artifact, whose closure can be verified before another process runs it.
|
|
654
|
+
let artifact;
|
|
655
|
+
try {
|
|
656
|
+
artifact = await checkBackendCandidate(directory);
|
|
657
|
+
}
|
|
658
|
+
catch (error) {
|
|
659
|
+
runtimeDiagnostics.record({ id: 'execution.recovery-artifact', severity: 'warning',
|
|
660
|
+
title: 'Automatic backend recovery requires a verified runtime', evidence: [error instanceof Error ? error.message : String(error)],
|
|
661
|
+
remedy: 'Build and install a sealed backend runtime before enabling automatic controller recovery.' });
|
|
662
|
+
return null;
|
|
663
|
+
}
|
|
664
|
+
// A verified installation must invalidate its previous certificate before
|
|
665
|
+
// proceeding. A journal failure cannot silently disable this guard.
|
|
666
|
+
const { executionDirectory } = await import('./execution-launcher.js');
|
|
667
|
+
this.recoveryMonitor = new BackendRecoveryMonitor(executionDirectory(this.dc), artifact, this.dc, this.execution, () => {
|
|
668
|
+
if (!this.app || !this.watchConfig || this.preparingBackend || this.handingOffBackend)
|
|
669
|
+
throw new RecoveryBusyError('Backend ownership is not ready for recovery');
|
|
670
|
+
const blockers = Object.entries(this.backendRuntimeStatus().blockers).filter(([, count]) => count > 0);
|
|
671
|
+
if (blockers.length)
|
|
672
|
+
throw new RecoveryBusyError(`Active work has no automatic recovery checkpoint: ${blockers.map(([name, count]) => `${name}=${count}`).join(', ')}`);
|
|
673
|
+
return { watchConfig: this.watchConfig, projects: this.app.container.resolve(PROJECT_SERVICE_TOKEN), infrastructure: this.infraService };
|
|
674
|
+
});
|
|
675
|
+
runtimeDiagnostics.resolve('execution.recovery-artifact');
|
|
676
|
+
return this.recoveryMonitor;
|
|
677
|
+
}
|
|
413
678
|
// ============================================================================
|
|
414
679
|
// Transport Registration
|
|
415
680
|
// ============================================================================
|
|
416
681
|
async registerTransports(dc) {
|
|
417
682
|
if (!this.app?.netron)
|
|
418
683
|
return;
|
|
684
|
+
const isSlave = dc.role === 'slave';
|
|
685
|
+
const authService = !isSlave
|
|
686
|
+
? await this.app.container.resolveAsync(AUTH_SERVICE_TOKEN)
|
|
687
|
+
: null;
|
|
688
|
+
// Slaves admit machine credentials only; they have no human login/session
|
|
689
|
+
// authority. Masters verify policy before registering any network ingress.
|
|
690
|
+
if (authService) {
|
|
691
|
+
await assertSafeNetworkPublication([fleetBindHostFor(dc), consoleBindHostFor(dc)], () => authService.isUsingSeededAdminPassword());
|
|
692
|
+
}
|
|
419
693
|
// Unix socket — local CLI <-> daemon (primary, high-performance)
|
|
420
694
|
this.app.netron.registerTransport('unix', () => new UnixSocketTransport());
|
|
421
695
|
this.app.netron.registerTransportServer('unix', {
|
|
@@ -443,7 +717,7 @@ export class OmnitronDaemon {
|
|
|
443
717
|
// operator's deployment read exactly like the daemon's own boot
|
|
444
718
|
// autostart. No proxy stands in front of a unix socket, so the
|
|
445
719
|
// wrapper trusts no forwarded address — its default.
|
|
446
|
-
invocationWrapper: createAuthContextWrapper(),
|
|
720
|
+
invocationWrapper: createAuthContextWrapper({ assertReady: () => this.assertBackendReady() }),
|
|
447
721
|
},
|
|
448
722
|
});
|
|
449
723
|
// Local CLI trust. The Unix socket above is created mode 0600, so any
|
|
@@ -481,74 +755,27 @@ export class OmnitronDaemon {
|
|
|
481
755
|
// unauthenticated `stopAll({force:true})` — is answered by the default
|
|
482
756
|
// being loopback and by that manager now being wired.)
|
|
483
757
|
const tcpHost = fleetBindHostFor(dc);
|
|
484
|
-
if (!isLoopbackHost(tcpHost)) {
|
|
485
|
-
// Said, not enforced, and the difference is deliberate: silently
|
|
486
|
-
// rebinding a fleet transport to loopback would take a cluster down,
|
|
487
|
-
// and a node that cannot be reached is an outage rather than a
|
|
488
|
-
// hardening. The console above IS rebound, because its whole purpose
|
|
489
|
-
// is a password prompt and loopback still serves it.
|
|
490
|
-
void (async () => {
|
|
491
|
-
const loggerModule = await this.app.container.resolveAsync(LOGGER_SERVICE_TOKEN);
|
|
492
|
-
const log = loggerModule.logger;
|
|
493
|
-
if (await isSeededAdminPasswordInUse(this.app, log)) {
|
|
494
|
-
log.error({ host: tcpHost, port: dc.port }, 'The daemon fleet transport is published and the seeded admin password is unchanged — ' +
|
|
495
|
-
'anyone who can reach this port can sign in and stop every app. Change it now.');
|
|
496
|
-
}
|
|
497
|
-
})().catch(() => undefined);
|
|
498
|
-
}
|
|
499
758
|
this.app.netron.registerTransport('tcp', () => new TcpTransport());
|
|
500
759
|
this.app.netron.registerTransportServer('tcp', {
|
|
501
760
|
name: 'daemon-fleet',
|
|
502
761
|
options: {
|
|
503
762
|
port: dc.port,
|
|
504
763
|
host: tcpHost,
|
|
764
|
+
// Carry the authenticated mesh identity into service-level guards and audit.
|
|
765
|
+
invocationWrapper: createAuthContextWrapper({ assertReady: () => this.assertBackendReady() }),
|
|
505
766
|
},
|
|
506
767
|
});
|
|
507
768
|
// Auth — JWT validation + session check + role extraction
|
|
508
|
-
const isSlave = dc.role === 'slave';
|
|
509
769
|
const jwtService = await this.app.container.resolveAsync(JWT_SERVICE_TOKEN);
|
|
510
770
|
const logModule = await this.app.container.resolveAsync(LOGGER_SERVICE_TOKEN);
|
|
511
771
|
const authLogger = logModule.logger.child({ component: 'auth' });
|
|
512
|
-
// On master: full JWT + session validation via AuthService (PG-backed)
|
|
513
|
-
// On slave: JWT-only validation (no session DB — no PG)
|
|
514
|
-
const authService = !isSlave
|
|
515
|
-
? await this.app.container.resolveAsync(AUTH_SERVICE_TOKEN)
|
|
516
|
-
: null;
|
|
517
772
|
const authManager = new AuthenticationManager(authLogger, {
|
|
518
773
|
authenticate: async () => {
|
|
519
774
|
throw new Error('Credential authentication not supported. Use JWT Bearer token.');
|
|
520
775
|
},
|
|
521
|
-
validateToken:
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
// Session validation — master only (requires PG for omnitron_sessions)
|
|
525
|
-
if (authService) {
|
|
526
|
-
const sessionId = payload['sid'];
|
|
527
|
-
if (sessionId) {
|
|
528
|
-
const session = await authService.validateToken(token);
|
|
529
|
-
if (!session) {
|
|
530
|
-
const err = new Error('Session has been revoked or expired');
|
|
531
|
-
err.code = 'SESSION_REVOKED';
|
|
532
|
-
err.statusCode = 401;
|
|
533
|
-
throw err;
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
// Role is now in JWT claims (set by AuthService.issueToken)
|
|
538
|
-
const role = payload['role'] ?? 'viewer';
|
|
539
|
-
const sessionId = payload['sid'];
|
|
540
|
-
return {
|
|
541
|
-
userId: payload.sub,
|
|
542
|
-
roles: [role],
|
|
543
|
-
permissions: [],
|
|
544
|
-
token: { type: 'bearer' },
|
|
545
|
-
metadata: {
|
|
546
|
-
sessionId,
|
|
547
|
-
isServiceRole: role === 'service_role',
|
|
548
|
-
},
|
|
549
|
-
};
|
|
550
|
-
},
|
|
551
|
-
tokenCache: { enabled: true, ttl: 10_000 },
|
|
776
|
+
validateToken: createDaemonTokenValidator(token => jwtService.verify(token), authService),
|
|
777
|
+
// Signature verification may be cached; live account/session authority may not.
|
|
778
|
+
tokenCache: { enabled: false },
|
|
552
779
|
});
|
|
553
780
|
// Wire the AuthorizationManager so the `@Public({ auth: { roles } })`
|
|
554
781
|
// decorators on DaemonRpcService are actually enforced on the wire.
|
|
@@ -564,8 +791,10 @@ export class OmnitronDaemon {
|
|
|
564
791
|
// `trustProxy` is shared with the rate limiter deliberately: both answer
|
|
565
792
|
// the same question — is there a proxy in front whose forwarded headers
|
|
566
793
|
// we may believe? Two separate switches would eventually disagree.
|
|
794
|
+
const policy = dc.requestRateLimit ?? dc.httpRateLimit ?? {};
|
|
567
795
|
const authContextWrapper = createAuthContextWrapper({
|
|
568
|
-
trustProxy:
|
|
796
|
+
trustProxy: policy.trustProxy === true,
|
|
797
|
+
assertReady: () => this.assertBackendReady(),
|
|
569
798
|
});
|
|
570
799
|
// HTTP / WS bind also defaults to 127.0.0.1. The webapp talks to
|
|
571
800
|
// these over the same loopback; nginx fronts the public surface.
|
|
@@ -579,8 +808,7 @@ export class OmnitronDaemon {
|
|
|
579
808
|
// same value then published the Netron HTTP RPC and the WebSocket
|
|
580
809
|
// alongside it. A slave serves no console: the operator uses the
|
|
581
810
|
// master's. So the two surfaces it gained are an authentication endpoint
|
|
582
|
-
//
|
|
583
|
-
// has no rate limit available to it.
|
|
811
|
+
// and a WebSocket endpoint it does not need.
|
|
584
812
|
//
|
|
585
813
|
// Rebound rather than warned about, which is the opposite of the choice
|
|
586
814
|
// made for the TCP transport twenty lines up — and for the opposite
|
|
@@ -597,7 +825,12 @@ export class OmnitronDaemon {
|
|
|
597
825
|
const internalHttpPort = (dc.httpPort ?? 9800) + 1;
|
|
598
826
|
this.rpcHttpPort = internalHttpPort;
|
|
599
827
|
this.app.netron.registerTransport('http', () => new HttpTransport());
|
|
600
|
-
const
|
|
828
|
+
const requestLimiter = new TransportRequestLimiter({
|
|
829
|
+
...policy,
|
|
830
|
+
enabled: policy.enabled ?? true,
|
|
831
|
+
maxRequests: policy.maxRequests ?? 3_000,
|
|
832
|
+
globalMaxRequests: policy.globalMaxRequests ?? 6_000,
|
|
833
|
+
});
|
|
601
834
|
this.app.netron.registerTransportServer('http', {
|
|
602
835
|
name: 'daemon-http',
|
|
603
836
|
options: {
|
|
@@ -605,24 +838,7 @@ export class OmnitronDaemon {
|
|
|
605
838
|
host: localHost,
|
|
606
839
|
cors: true,
|
|
607
840
|
invocationWrapper: authContextWrapper,
|
|
608
|
-
|
|
609
|
-
// guessing is bounded by the per-account lockout in AuthService.
|
|
610
|
-
//
|
|
611
|
-
// The WebSocket surface below is NOT covered: netron's WebSocket
|
|
612
|
-
// transport has no rate-limit option — `maxPayload` is the only
|
|
613
|
-
// bound it accepts — and the console talks over WebSocket. This
|
|
614
|
-
// comment used to say the limit bounded "everything else, including
|
|
615
|
-
// attempts to flood the daemon into unresponsiveness", which
|
|
616
|
-
// describes a protection that covers one of the two transports an
|
|
617
|
-
// attacker can reach.
|
|
618
|
-
rateLimit: {
|
|
619
|
-
enabled: rl.enabled ?? true,
|
|
620
|
-
windowMs: rl.windowMs ?? 60_000,
|
|
621
|
-
maxRequests: rl.maxRequests ?? 3_000,
|
|
622
|
-
globalMaxRequests: rl.globalMaxRequests ?? 6_000,
|
|
623
|
-
trustProxy: rl.trustProxy ?? false,
|
|
624
|
-
...(rl.whitelist ? { whitelist: rl.whitelist } : {}),
|
|
625
|
-
},
|
|
841
|
+
requestLimiter,
|
|
626
842
|
},
|
|
627
843
|
});
|
|
628
844
|
// WebSocket — real-time event push to webapp clients
|
|
@@ -638,11 +854,7 @@ export class OmnitronDaemon {
|
|
|
638
854
|
// HTTP calls do. Until recently only the HTTP server read this
|
|
639
855
|
// option and this line did nothing.
|
|
640
856
|
invocationWrapper: authContextWrapper,
|
|
641
|
-
|
|
642
|
-
// `ws`'s 100 MB default, which is a lot of memory to hand a single
|
|
643
|
-
// frame on a control-plane socket that carries RPC arguments and
|
|
644
|
-
// event pushes. 8 MB is well above anything the console sends and
|
|
645
|
-
// well below anything worth allocating for a stranger.
|
|
857
|
+
requestLimiter,
|
|
646
858
|
maxPayload: dc.wsMaxPayload ?? 8 * 1024 * 1024,
|
|
647
859
|
},
|
|
648
860
|
});
|
|
@@ -667,8 +879,10 @@ export class OmnitronDaemon {
|
|
|
667
879
|
// and the number comes from the config rather than a default chosen
|
|
668
880
|
// inside the collector, because a wrong default there deletes history.
|
|
669
881
|
logCollector.setRetentionDays(config.logging?.databaseRetentionDays ?? 0, loggerModule.logger.child({ component: 'log-retention' }));
|
|
670
|
-
const
|
|
882
|
+
const projectService = await container.resolveAsync(PROJECT_SERVICE_TOKEN);
|
|
883
|
+
const rpcService = new DaemonRpcService(orchestrator, titanHealth, logManager, config, this, () => projectService.assertInfrastructureMutable());
|
|
671
884
|
await this.app.netron.peer.exposeService(rpcService);
|
|
885
|
+
await this.app.netron.peer.exposeService(new BackendRpcService(this));
|
|
672
886
|
// Logs RPC service (works on both master and slave — uses PG or SQLite)
|
|
673
887
|
const logsRpcService = new LogsRpcService(logCollector);
|
|
674
888
|
await this.app.netron.peer.exposeService(logsRpcService);
|
|
@@ -677,7 +891,7 @@ export class OmnitronDaemon {
|
|
|
677
891
|
rpcService.setLogStore(logCollector);
|
|
678
892
|
// Metrics RPC service — provided by TitanMetricsModule
|
|
679
893
|
const metricsService = await container.resolveAsync(TITAN_METRICS_TOKEN);
|
|
680
|
-
const {
|
|
894
|
+
const { OmnitronMetricsRpcService: MetricsRpc } = await import('../services/metrics.rpc-service.js');
|
|
681
895
|
const metricsRpcService = new MetricsRpc(metricsService);
|
|
682
896
|
await this.app.netron.peer.exposeService(metricsRpcService);
|
|
683
897
|
// HealthCheck RPC service (no DB dependency)
|
|
@@ -717,6 +931,7 @@ export class OmnitronDaemon {
|
|
|
717
931
|
// Backup RPC service (no DB dependency)
|
|
718
932
|
const { BackupRpcService: BackupRpc } = await import('../services/backup.rpc-service.js');
|
|
719
933
|
const backupService = await container.resolveAsync(BACKUP_SERVICE_TOKEN);
|
|
934
|
+
this.backupService = backupService;
|
|
720
935
|
const backupRpcService = new BackupRpc(backupService);
|
|
721
936
|
await this.app.netron.peer.exposeService(backupRpcService);
|
|
722
937
|
// Re-arm any persisted backup schedules so they survive daemon restarts.
|
|
@@ -759,11 +974,34 @@ export class OmnitronDaemon {
|
|
|
759
974
|
// The logger, because the one thing this service says on its own — that
|
|
760
975
|
// a deployment is running on a default credential — is said at error
|
|
761
976
|
// level and reaches nobody without it.
|
|
762
|
-
loggerModule.logger.child({ component: 'infra' }));
|
|
763
|
-
await this.app.netron.peer.exposeService(infraRpcService);
|
|
977
|
+
loggerModule.logger.child({ component: 'infra' }), undefined, () => projectService.getInfraManager().listInstances().flatMap(({ infra }) => Object.values(infra.getState().services)));
|
|
764
978
|
// Project + Stack management RPC service
|
|
765
|
-
const
|
|
979
|
+
const stateStore = await container.resolveAsync(DAEMON_STATE_STORE_TOKEN);
|
|
980
|
+
const { clusterDatabaseUrl, clusterEnrollment } = await import('../cluster/enrollment.js');
|
|
981
|
+
const connectionString = dc.cluster?.enabled
|
|
982
|
+
? clusterDatabaseUrl((await import('../shared/env-config.js')).getEnv().OMNITRON_CLUSTER_DATABASE_URL) : undefined;
|
|
983
|
+
const audience = clusterEnrollment(dc.cluster, stateStore);
|
|
984
|
+
if (audience && connectionString) {
|
|
985
|
+
const { createOmnitronDb } = await import('../database/connection.js');
|
|
986
|
+
const { PostgresLeaseStore } = await import('@omnitron-dev/titan-database/coordination');
|
|
987
|
+
const { StopRecipient } = await import('../cluster/stop-authority.js');
|
|
988
|
+
this.clusterDb = await createOmnitronDb({ connectionString, max: 2, connectionTimeoutMillis: 2500, statement_timeout: 5000 });
|
|
989
|
+
const leases = new PostgresLeaseStore(this.clusterDb);
|
|
990
|
+
if (!isSlave) {
|
|
991
|
+
const { LeaderElection } = await import('../cluster/leader-election.js');
|
|
992
|
+
const fleet = await container.resolveAsync(FLEET_SERVICE_TOKEN);
|
|
993
|
+
this.leaderElection = new LeaderElection(audience.nodeId, fleet, loggerModule.logger, leases, {
|
|
994
|
+
clusterId: audience.clusterId,
|
|
995
|
+
...(dc.cluster?.leaseTtlMs != null && { leaseTtlMs: dc.cluster.leaseTtlMs }),
|
|
996
|
+
...(dc.cluster?.heartbeatInterval != null && { heartbeatInterval: dc.cluster.heartbeatInterval }),
|
|
997
|
+
});
|
|
998
|
+
}
|
|
999
|
+
projectService.setClusterStop(new StopRecipient(audience, leases, stateStore), this.leaderElection ?? undefined);
|
|
1000
|
+
}
|
|
766
1001
|
const projectRpcService = new ProjectRpcService(projectService, audit);
|
|
1002
|
+
projectService.setHostedInfrastructure(() => this.infraService ?? undefined, scope => infraRpcService.drainStackProvisioning(scope));
|
|
1003
|
+
infraRpcService.setStackOperationGate(scope => projectService.assertInfrastructureMutable(scope));
|
|
1004
|
+
await this.app.netron.peer.exposeService(infraRpcService);
|
|
767
1005
|
await this.app.netron.peer.exposeService(projectRpcService);
|
|
768
1006
|
// Releases. Master-only, like the builds themselves: a release is built
|
|
769
1007
|
// from clean clones of BOTH repositories, and only a master has both.
|
|
@@ -771,42 +1009,19 @@ export class OmnitronDaemon {
|
|
|
771
1009
|
const { ReleaseService } = await import('../services/release.service.js');
|
|
772
1010
|
const { ReleaseRpcService } = await import('../services/release.rpc-service.js');
|
|
773
1011
|
this.releaseService = new ReleaseService(loggerModule.logger.child({ component: 'release' }));
|
|
774
|
-
await
|
|
1012
|
+
const releaseAuth = await container.resolveAsync(AUTH_SERVICE_TOKEN);
|
|
1013
|
+
await this.app.netron.peer.exposeService(new ReleaseRpcService(this.releaseService, audit, projectService, releaseAuth));
|
|
775
1014
|
}
|
|
776
|
-
//
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
if (isSlave) {
|
|
780
|
-
const slaveStorage = await container.resolveAsync(SLAVE_STORAGE_TOKEN);
|
|
781
|
-
syncDb = await slaveStorage.getDb();
|
|
782
|
-
}
|
|
783
|
-
else {
|
|
784
|
-
syncDb = await container.resolveAsync(OMNITRON_DB_TOKEN);
|
|
785
|
-
}
|
|
786
|
-
this.syncService = new SyncService(syncDb, loggerModule.logger.child({ component: 'sync' }), syncNodeId, dc.role, dc.sync);
|
|
787
|
-
// Remote metrics into the store the console actually reads.
|
|
788
|
-
//
|
|
789
|
-
// `ingestMetric` wrote them to `metrics_raw`, and nothing in this
|
|
790
|
-
// repository reads that table — the metrics page queries titan-metrics'
|
|
791
|
-
// own storage. So once the pipeline carried anything, it would have
|
|
792
|
-
// carried it somewhere invisible. Recording through the same service the
|
|
793
|
-
// master uses for its own readings makes a remote node a LABEL on the
|
|
794
|
-
// existing series instead of a second store of the same concept.
|
|
795
|
-
//
|
|
796
|
-
// `node` is a distinct argument in the sink's signature rather than a
|
|
797
|
-
// key a caller may forget to put in `labels`: a sample recorded without
|
|
798
|
-
// it merges with the master's own, and the chart then shows two machines
|
|
799
|
-
// summed under one name.
|
|
1015
|
+
// One service owns both the SQLite outbox writer and the replication transport.
|
|
1016
|
+
this.syncService = await container.resolveAsync(SYNC_SERVICE_TOKEN);
|
|
1017
|
+
// The database is the history read by Console. Exposition is updated only after commit.
|
|
800
1018
|
if (!isSlave) {
|
|
801
1019
|
const syncMetrics = await container.resolveAsync(TITAN_METRICS_TOKEN);
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
loggerModule.logger.warn({ node: sample.node, name: sample.name, error: err.message }, 'Failed to record a replicated metric');
|
|
808
|
-
}
|
|
809
|
-
});
|
|
1020
|
+
const storage = await container.resolveAsync(METRICS_STORAGE_TOKEN);
|
|
1021
|
+
if (!(storage instanceof PostgresMetricsStorage))
|
|
1022
|
+
throw new Error('Master replication requires PostgreSQL metrics storage');
|
|
1023
|
+
this.syncService.setMetricsStorage(storage, parseMaxAge(config.monitoring.metrics.historyMaxAge ?? '7d'));
|
|
1024
|
+
this.syncService.setMetricsRegistry(syncMetrics.getRegistry());
|
|
810
1025
|
}
|
|
811
1026
|
// The producer the replication pipeline never had.
|
|
812
1027
|
//
|
|
@@ -821,15 +1036,7 @@ export class OmnitronDaemon {
|
|
|
821
1036
|
// has no master to ship to, and doing the work would be pure cost.
|
|
822
1037
|
if (isSlave) {
|
|
823
1038
|
const syncService = this.syncService;
|
|
824
|
-
logCollector.setSyncSink((entries) => {
|
|
825
|
-
void syncService
|
|
826
|
-
.bufferBatch(entries.map((e) => ({ category: 'logs', payload: e })))
|
|
827
|
-
.catch(() => {
|
|
828
|
-
// `bufferBatch` logs its own failure. Swallowed here because the
|
|
829
|
-
// lines are already in the local table: losing the replica copy
|
|
830
|
-
// must not cost the flush that succeeded.
|
|
831
|
-
});
|
|
832
|
-
});
|
|
1039
|
+
logCollector.setSyncSink((entries, transaction) => syncService.bufferBatch(entries.map(entry => ({ category: 'logs', payload: entry })), transaction));
|
|
833
1040
|
}
|
|
834
1041
|
const syncRpcService = new SyncRpcService(this.syncService);
|
|
835
1042
|
await this.app.netron.peer.exposeService(syncRpcService);
|
|
@@ -839,18 +1046,24 @@ export class OmnitronDaemon {
|
|
|
839
1046
|
await this.app.netron.peer.exposeService(systemInfoRpcService);
|
|
840
1047
|
// Event Broadcaster RPC service (WebSocket subscriptions)
|
|
841
1048
|
this.eventBroadcaster = new EventBroadcasterService(loggerModule.logger);
|
|
842
|
-
const eventBroadcasterRpcService = new EventBroadcasterRpcService(this.eventBroadcaster, this.app.netron);
|
|
1049
|
+
const eventBroadcasterRpcService = new EventBroadcasterRpcService(this.eventBroadcaster, this.app.netron, createDaemonPrincipalValidator(isSlave ? null : await container.resolveAsync(AUTH_SERVICE_TOKEN)));
|
|
843
1050
|
await this.app.netron.peer.exposeService(eventBroadcasterRpcService);
|
|
844
1051
|
// Node manager — file-based, no PG (master only — manages infrastructure nodes)
|
|
845
1052
|
// Health checks delegated to dedicated system worker (started later after infra is ready)
|
|
846
1053
|
if (!isSlave) {
|
|
847
1054
|
const { NodeManagerService } = await import('../services/node-manager.service.js');
|
|
848
1055
|
const { NodeManagerRpcService } = await import('../services/node-manager.rpc-service.js');
|
|
849
|
-
const { DaemonStateStore: DaemonStateStoreCls } = await import('./daemon-state-store.service.js');
|
|
850
1056
|
const daemonStateStore = await container.resolveAsync(DAEMON_STATE_STORE_TOKEN);
|
|
851
1057
|
const nodeManager = new NodeManagerService(loggerModule.logger.child({ component: 'nodes' }), daemonStateStore, secretsService);
|
|
852
1058
|
this.nodeManagerService = nodeManager;
|
|
853
|
-
const
|
|
1059
|
+
const nodeAuth = await container.resolveAsync(AUTH_SERVICE_TOKEN);
|
|
1060
|
+
if (audit) {
|
|
1061
|
+
const { TerminalRpcService } = await import('../services/terminal.rpc-service.js');
|
|
1062
|
+
this.terminalRpcService = new TerminalRpcService(nodeManager, nodeAuth, daemonStateStore, audit, dc.terminal);
|
|
1063
|
+
await this.app.netron.peer.exposeService(this.terminalRpcService);
|
|
1064
|
+
}
|
|
1065
|
+
const nodeManagerRpcService = new NodeManagerRpcService(nodeManager, audit, () => systemInfoService.getSnapshot({ fresh: true }), nodeAuth);
|
|
1066
|
+
nodeManagerRpcService.setLocalDaemon(rpcService);
|
|
854
1067
|
// The deployer reaches nodes through the same SSH implementation as the
|
|
855
1068
|
// health checks — the only one that can present a stored password or a
|
|
856
1069
|
// key passphrase.
|
|
@@ -860,6 +1073,21 @@ export class OmnitronDaemon {
|
|
|
860
1073
|
const deployLogger = loggerModule.logger.child({ component: 'deploy' });
|
|
861
1074
|
const remoteDeployer = new RemoteDeployer(deployLogger, new ExecutionService(deployLogger));
|
|
862
1075
|
nodeManagerRpcService.setRemoteDeployer(remoteDeployer);
|
|
1076
|
+
const { KernelRolloutService } = await import('../services/kernel-rollout.service.js');
|
|
1077
|
+
this.kernelRollouts = new KernelRolloutService(daemonStateStore, nodeManager, remoteDeployer, error => deployLogger.error({ error }, 'Kernel rollout journal needs reconciliation'), () => {
|
|
1078
|
+
if (this.dc.cluster?.enabled)
|
|
1079
|
+
throw new Error('Managed kernel rollout requires a standalone controller. Elected controllers lack a shared cross-node dispatch fence.');
|
|
1080
|
+
if (this.isShuttingDown || this.preparingBackend || this.handingOffBackend)
|
|
1081
|
+
throw new Error('Controller handoff or shutdown is in progress');
|
|
1082
|
+
}, () => {
|
|
1083
|
+
if (!this.execution)
|
|
1084
|
+
return null; // A coupled controller cannot be an independently owned target.
|
|
1085
|
+
const local = this.execution.state();
|
|
1086
|
+
if (!local?.owner?.id || local.connection.status !== 'connected' || local.phase !== 'active')
|
|
1087
|
+
throw new Error('Cannot exclude the initiating controller: its resident owner is unconfirmed');
|
|
1088
|
+
return local.owner.id;
|
|
1089
|
+
});
|
|
1090
|
+
nodeManagerRpcService.setKernelRolloutService(this.kernelRollouts);
|
|
863
1091
|
// Upgrading a node from the console: the same build the CLI makes,
|
|
864
1092
|
// made here, then the same two calls. Without this the console could
|
|
865
1093
|
// see every node and update none of them.
|
|
@@ -917,19 +1145,20 @@ export class OmnitronDaemon {
|
|
|
917
1145
|
// master, or two connectors pull the same buffer and race to ack it.
|
|
918
1146
|
try {
|
|
919
1147
|
const { SlaveConnector } = await import('../cluster/slave-connector.js');
|
|
920
|
-
const { createMeshDialer } = await import('../cluster/mesh-link.js');
|
|
1148
|
+
const { createMeshDialer, meshRegistration } = await import('../cluster/mesh-link.js');
|
|
921
1149
|
const { startMesh } = await import('../cluster/mesh.js');
|
|
922
1150
|
const { ExecutionService: Exec } = await import('../execution/execution.service.js');
|
|
923
1151
|
const meshLogger = loggerModule.logger.child({ component: 'mesh' });
|
|
1152
|
+
const registeredSshTarget = async (host, port, nodeId) => {
|
|
1153
|
+
const node = meshRegistration(nodeManager.listNodes(), { host, port, ...(nodeId !== undefined && { nodeId }) });
|
|
1154
|
+
return node ? nodeManager.nodeToSshTarget(node) : null;
|
|
1155
|
+
};
|
|
924
1156
|
const connector = new SlaveConnector(meshLogger, this.syncService ?? null, {
|
|
925
1157
|
dial: createMeshDialer({
|
|
926
1158
|
logger: meshLogger,
|
|
927
1159
|
execution: new Exec(meshLogger),
|
|
928
1160
|
subject: `mesh:${os.hostname()}`,
|
|
929
|
-
sshTargetFor:
|
|
930
|
-
const node = nodeManager.listNodes().find((n) => n.host === host && !n.isLocal);
|
|
931
|
-
return node ? nodeManager.nodeToSshTarget(node) : null;
|
|
932
|
-
},
|
|
1161
|
+
sshTargetFor: ({ host, port, nodeId }) => registeredSshTarget(host, port, nodeId),
|
|
933
1162
|
}),
|
|
934
1163
|
});
|
|
935
1164
|
this.slaveConnector = connector;
|
|
@@ -941,10 +1170,7 @@ export class OmnitronDaemon {
|
|
|
941
1170
|
// Wired here because this is the side that has both — ProjectService
|
|
942
1171
|
// reads config files, the node registry keeps its secrets in the
|
|
943
1172
|
// daemon's vault.
|
|
944
|
-
projectService.setNodeCredentialResolver(
|
|
945
|
-
const node = nodeManager.listNodes().find((n) => n.host === host && !n.isLocal);
|
|
946
|
-
return node ? nodeManager.nodeToSshTarget(node) : null;
|
|
947
|
-
});
|
|
1173
|
+
projectService.setNodeCredentialResolver(registeredSshTarget);
|
|
948
1174
|
this.meshHandle = startMesh({ registry: nodeManager, connector, logger: meshLogger });
|
|
949
1175
|
}
|
|
950
1176
|
catch (err) {
|
|
@@ -954,27 +1180,50 @@ export class OmnitronDaemon {
|
|
|
954
1180
|
loggerModule.logger.error({ error: err.message }, 'Mesh not started — registered nodes will buffer their data locally and replicate nothing');
|
|
955
1181
|
}
|
|
956
1182
|
}
|
|
1183
|
+
// File protocol uses the existing authenticated Netron mesh on every node.
|
|
1184
|
+
const { FileNode } = await import('../files/file-node.js');
|
|
1185
|
+
const { configuredFileRoots } = await import('../files/file-config.js');
|
|
1186
|
+
const { FileNodeRpcService } = await import('../files/file-node.rpc-service.js');
|
|
1187
|
+
const fileState = await container.resolveAsync(DAEMON_STATE_STORE_TOKEN);
|
|
1188
|
+
const fileNode = this.fileNode = new FileNode(configuredFileRoots(dc.files), fileState);
|
|
1189
|
+
await this.app.netron.peer.exposeService(new FileNodeRpcService(fileNode));
|
|
1190
|
+
// Every node answers the same diagnostic contract. Workers use the durable
|
|
1191
|
+
// Sync outbox; absence of the controller's local relay is not a broken RPC.
|
|
1192
|
+
const { TelemetryRpcService: TelemetryRpc } = await import('../services/telemetry.rpc-service.js');
|
|
1193
|
+
const telemetryRpcService = new TelemetryRpc(isSlave ? null
|
|
1194
|
+
: await container.resolveAsync(TELEMETRY_RELAY_TOKEN));
|
|
1195
|
+
this.nodeManagerRpcService?.setTelemetryRelay(telemetryRpcService);
|
|
1196
|
+
await this.app.netron.peer.exposeService(telemetryRpcService);
|
|
957
1197
|
// =====================================================================
|
|
958
1198
|
// Master-only RPC services (require PostgreSQL)
|
|
959
1199
|
// =====================================================================
|
|
960
1200
|
if (!isSlave) {
|
|
961
1201
|
// Auth RPC service
|
|
962
1202
|
const authService = await container.resolveAsync(AUTH_SERVICE_TOKEN);
|
|
963
|
-
const authRpcService = new AuthRpcService(authService);
|
|
1203
|
+
const authRpcService = new AuthRpcService(authService, this.app.netron);
|
|
964
1204
|
await this.app.netron.peer.exposeService(authRpcService);
|
|
1205
|
+
if (audit) {
|
|
1206
|
+
const { AccessRpcService } = await import('../services/access.rpc-service.js');
|
|
1207
|
+
const accessDb = await container.resolveAsync(OMNITRON_DB_TOKEN);
|
|
1208
|
+
await this.app.netron.peer.exposeService(new AccessRpcService(accessDb, authService, audit, this.app.netron));
|
|
1209
|
+
const { FilesRpcService } = await import('../files/files.rpc-service.js');
|
|
1210
|
+
this.filesRpcService = new FilesRpcService(fileNode, async (nodeId, actor, request) => {
|
|
1211
|
+
const node = this.nodeManagerService?.getNode(nodeId);
|
|
1212
|
+
if (!node)
|
|
1213
|
+
throw new Error('Unknown file node');
|
|
1214
|
+
if (node.isLocal)
|
|
1215
|
+
return fileNode.invoke(actor, request);
|
|
1216
|
+
if (!this.slaveConnector)
|
|
1217
|
+
throw new Error('File node is not connected to the mesh');
|
|
1218
|
+
return this.slaveConnector.invokeOnSlave(node.host, node.daemonPort, 'OmnitronFileNode', 'invoke', [{ actor, request }]);
|
|
1219
|
+
}, authService, audit, fileState);
|
|
1220
|
+
await this.app.netron.peer.exposeService(this.filesRpcService);
|
|
1221
|
+
}
|
|
965
1222
|
// Alert RPC service
|
|
966
1223
|
const { AlertRpcService: AlertRpc } = await import('../services/alert.rpc-service.js');
|
|
967
1224
|
const alertService = await container.resolveAsync(ALERT_SERVICE_TOKEN);
|
|
968
1225
|
const alertRpcService = new AlertRpc(alertService);
|
|
969
1226
|
await this.app.netron.peer.exposeService(alertRpcService);
|
|
970
|
-
// Telemetry relay RPC service
|
|
971
|
-
const { TelemetryRpcService: TelemetryRpc } = await import('../services/telemetry.rpc-service.js');
|
|
972
|
-
const telemetryRelay = await container.resolveAsync(TELEMETRY_RELAY_TOKEN);
|
|
973
|
-
const telemetryRpcService = new TelemetryRpc(telemetryRelay);
|
|
974
|
-
// The console asks every node for its relay, and a daemon has no mesh
|
|
975
|
-
// connection to itself, so the local node's answer comes from here.
|
|
976
|
-
this.nodeManagerRpcService?.setTelemetryRelay(telemetryRelay);
|
|
977
|
-
await this.app.netron.peer.exposeService(telemetryRpcService);
|
|
978
1227
|
// Fleet management RPC service
|
|
979
1228
|
const { FleetRpcService: FleetRpc } = await import('../services/fleet.rpc-service.js');
|
|
980
1229
|
const fleetService = await container.resolveAsync(FLEET_SERVICE_TOKEN);
|
|
@@ -988,7 +1237,12 @@ export class OmnitronDaemon {
|
|
|
988
1237
|
// Pipeline RPC service
|
|
989
1238
|
const { PipelineRpcService: PipelineRpc } = await import('../services/pipeline.rpc-service.js');
|
|
990
1239
|
const pipelineService = await container.resolveAsync(PIPELINE_SERVICE_TOKEN);
|
|
991
|
-
|
|
1240
|
+
if (!audit || !this.nodeManagerService)
|
|
1241
|
+
throw new Error('Pipeline execution requires audit and node services');
|
|
1242
|
+
pipelineService.configure(this.nodeManagerService, (status, duration) => this.metricsBridge?.recordPipelineRun(status, duration));
|
|
1243
|
+
await pipelineService.initialize();
|
|
1244
|
+
this.pipelineService = pipelineService;
|
|
1245
|
+
const pipelineRpcService = new PipelineRpc(pipelineService, authService, audit);
|
|
992
1246
|
await this.app.netron.peer.exposeService(pipelineRpcService);
|
|
993
1247
|
// Trace collector RPC service
|
|
994
1248
|
const { TraceRpcService: TraceRpc } = await import('../services/trace-collector.rpc-service.js');
|
|
@@ -1001,22 +1255,10 @@ export class OmnitronDaemon {
|
|
|
1001
1255
|
const deployRpcService = new DeployRpc(deployService);
|
|
1002
1256
|
await this.app.netron.peer.exposeService(deployRpcService);
|
|
1003
1257
|
}
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
const { ClusterRpcService: ClusterRpc } = await import('../cluster/cluster.rpc-service.js');
|
|
1009
|
-
const nodeId = `${os.hostname()}-${dc.port}`;
|
|
1010
|
-
const clusterFleetService = await container.resolveAsync(FLEET_SERVICE_TOKEN);
|
|
1011
|
-
this.leaderElection = new LeaderElection(nodeId, clusterFleetService, loggerModule.logger, {
|
|
1012
|
-
...(dc.cluster.electionTimeout && { electionTimeout: dc.cluster.electionTimeout }),
|
|
1013
|
-
...(dc.cluster.heartbeatInterval != null && { heartbeatInterval: dc.cluster.heartbeatInterval }),
|
|
1014
|
-
});
|
|
1015
|
-
const clusterRpcService = new ClusterRpc(this.leaderElection);
|
|
1016
|
-
// The local node's own election state, for the cross-node reader.
|
|
1017
|
-
this.nodeManagerRpcService?.setLeaderElection(this.leaderElection);
|
|
1018
|
-
await this.app.netron.peer.exposeService(clusterRpcService);
|
|
1019
|
-
}
|
|
1258
|
+
const { ClusterRpcService } = await import('../cluster/cluster.rpc-service.js');
|
|
1259
|
+
const clusterReader = new ClusterRpcService(this.leaderElection, audience);
|
|
1260
|
+
this.nodeManagerRpcService?.setClusterReader(clusterReader);
|
|
1261
|
+
await this.app.netron.peer.exposeService(clusterReader);
|
|
1020
1262
|
}
|
|
1021
1263
|
// ============================================================================
|
|
1022
1264
|
// Log Persistence Wiring
|
|
@@ -1027,10 +1269,20 @@ export class OmnitronDaemon {
|
|
|
1027
1269
|
const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
|
|
1028
1270
|
const logManager = await this.app.container.resolveAsync(LOG_MANAGER_TOKEN);
|
|
1029
1271
|
const logCollector = await this.app.container.resolveAsync(LOG_COLLECTOR_TOKEN);
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
logCollector.ingestPinoLine(appName, line);
|
|
1033
|
-
}
|
|
1272
|
+
if (this.execution) {
|
|
1273
|
+
this.execution.setLogCollector(logCollector);
|
|
1274
|
+
orchestrator.onAppLog((appName, line, context) => logCollector.ingestPinoLine(appName, line, context));
|
|
1275
|
+
}
|
|
1276
|
+
else {
|
|
1277
|
+
logCollector.setCaptureStatus('local');
|
|
1278
|
+
if (logManager.journal) {
|
|
1279
|
+
logCollector.setSourceJournal(logManager.journal);
|
|
1280
|
+
logCollector.setSourceStats(() => logManager.journalStats());
|
|
1281
|
+
}
|
|
1282
|
+
else
|
|
1283
|
+
logManager.onRecord((appName, record) => logCollector.ingestRecord(appName, record));
|
|
1284
|
+
orchestrator.onAppLog((appName, line, context) => logManager.appendToFile(appName, line, context));
|
|
1285
|
+
}
|
|
1034
1286
|
// Wire daemon's own logs into LogCollector (buffered since pino starts before DI)
|
|
1035
1287
|
const collectorStream = getDaemonLogCollectorStream();
|
|
1036
1288
|
if (collectorStream) {
|
|
@@ -1079,40 +1331,6 @@ export class OmnitronDaemon {
|
|
|
1079
1331
|
}
|
|
1080
1332
|
const isSlave = this.dc.role === 'slave';
|
|
1081
1333
|
const startTime = Date.now();
|
|
1082
|
-
// Step 1: Provision omnitron's own database (omnitron-pg)
|
|
1083
|
-
// Slave daemons use SQLite — no Docker, no PostgreSQL
|
|
1084
|
-
if (isSlave) {
|
|
1085
|
-
logger.info({ role: 'slave' }, 'Slave mode — skipping omnitron-pg provisioning (using SQLite)');
|
|
1086
|
-
}
|
|
1087
|
-
else {
|
|
1088
|
-
try {
|
|
1089
|
-
const { resolveOmnitronPg } = await import('../infrastructure/service-resolver.js');
|
|
1090
|
-
const { createContainer, getContainerState, waitForHealthy, ensureImage, removeContainer, createVolume } = await import('../infrastructure/container-runtime.js');
|
|
1091
|
-
const pgSpec = resolveOmnitronPg();
|
|
1092
|
-
const existing = await getContainerState(pgSpec.name);
|
|
1093
|
-
if (!existing || existing.status !== 'running') {
|
|
1094
|
-
logger.info('Provisioning omnitron-pg...');
|
|
1095
|
-
if (existing)
|
|
1096
|
-
await removeContainer(pgSpec.name);
|
|
1097
|
-
await ensureImage(pgSpec.image);
|
|
1098
|
-
for (const vol of pgSpec.volumes) {
|
|
1099
|
-
if (!vol.source.startsWith('/'))
|
|
1100
|
-
await createVolume(vol.source);
|
|
1101
|
-
}
|
|
1102
|
-
await createContainer(pgSpec);
|
|
1103
|
-
await waitForHealthy(pgSpec.name, 60_000);
|
|
1104
|
-
logger.info('omnitron-pg ready');
|
|
1105
|
-
}
|
|
1106
|
-
else {
|
|
1107
|
-
logger.debug('omnitron-pg already running');
|
|
1108
|
-
}
|
|
1109
|
-
await this.runOmnitronMigrations(logger);
|
|
1110
|
-
}
|
|
1111
|
-
catch (err) {
|
|
1112
|
-
logger.error({ error: err.message }, 'Failed to provision omnitron-pg');
|
|
1113
|
-
logger.warn('Continuing without internal database — some features will be unavailable');
|
|
1114
|
-
}
|
|
1115
|
-
}
|
|
1116
1334
|
// Step 2: Provision app infrastructure (postgres, redis, minio) if declared.
|
|
1117
1335
|
//
|
|
1118
1336
|
// Two ownership models share this slot historically:
|
|
@@ -1136,8 +1354,13 @@ export class OmnitronDaemon {
|
|
|
1136
1354
|
// `infrastructure.services` is informational in this mode (used by
|
|
1137
1355
|
// stack auto-detection upstream); the daemon does not provision it
|
|
1138
1356
|
// again here.
|
|
1357
|
+
if (this.dc.cluster?.enabled) {
|
|
1358
|
+
logger.info('Cluster enrollment defers application infrastructure provisioning to the elected controller');
|
|
1359
|
+
gate.markReady({ services: {}, ready: true });
|
|
1360
|
+
return;
|
|
1361
|
+
}
|
|
1139
1362
|
const { ProjectRegistry } = await import('../project/registry.js');
|
|
1140
|
-
const projects = ProjectRegistry.open().
|
|
1363
|
+
const projects = ProjectRegistry.open().listRegistrations();
|
|
1141
1364
|
const projectModeActive = projects.some((p) => Array.isArray(p.enabledStacks) && p.enabledStacks.length > 0);
|
|
1142
1365
|
if (projectModeActive) {
|
|
1143
1366
|
logger.info({ projects: projects.length }, 'project mode active — daemon-level infrastructure deferred to stack provision');
|
|
@@ -1146,7 +1369,9 @@ export class OmnitronDaemon {
|
|
|
1146
1369
|
}
|
|
1147
1370
|
if (config.infrastructure && !isSlave) {
|
|
1148
1371
|
try {
|
|
1149
|
-
|
|
1372
|
+
// The control-plane database was prepared before DI. This allocator
|
|
1373
|
+
// owns application services only, including when PostgreSQL is external.
|
|
1374
|
+
this.infraService = new InfrastructureService(logger, config.infrastructure, undefined, undefined, undefined, false);
|
|
1150
1375
|
const infraState = await this.infraService.provision();
|
|
1151
1376
|
const provisionTimeMs = Date.now() - startTime;
|
|
1152
1377
|
gate.markReady(infraState);
|
|
@@ -1197,7 +1422,7 @@ export class OmnitronDaemon {
|
|
|
1197
1422
|
async reconcileOrphanContainers(logger, projects, projectService) {
|
|
1198
1423
|
const { listManagedContainers, stopContainer, removeContainer } = await import('../infrastructure/container-runtime.js');
|
|
1199
1424
|
const { decideOrphans } = await import('../infrastructure/orphan-containers.js');
|
|
1200
|
-
const managed = await listManagedContainers();
|
|
1425
|
+
const managed = await listManagedContainers({ orThrow: true });
|
|
1201
1426
|
if (managed.length === 0)
|
|
1202
1427
|
return;
|
|
1203
1428
|
// Build set of expected container name prefixes from registered projects/stacks
|
|
@@ -1247,6 +1472,7 @@ export class OmnitronDaemon {
|
|
|
1247
1472
|
status: c.status,
|
|
1248
1473
|
project: c.project,
|
|
1249
1474
|
stack: c.stack,
|
|
1475
|
+
internal: c.labels?.['omnitron.internal'] === 'true',
|
|
1250
1476
|
})),
|
|
1251
1477
|
projects: projects.map((p) => p.name),
|
|
1252
1478
|
expectedPrefixes: [...expectedPrefixes],
|
|
@@ -1262,9 +1488,11 @@ export class OmnitronDaemon {
|
|
|
1262
1488
|
const container = managed.find((c) => c.name === name);
|
|
1263
1489
|
logger.info({ container: container.name, status: container.status }, 'Removing orphan container (not part of any registered stack)');
|
|
1264
1490
|
try {
|
|
1491
|
+
if (!container.containerId || !/^[a-f0-9]{64}$/.test(container.containerId))
|
|
1492
|
+
throw new Error('Orphan has no immutable identity');
|
|
1265
1493
|
if (container.status === 'running')
|
|
1266
|
-
await stopContainer(container.
|
|
1267
|
-
await removeContainer(container.
|
|
1494
|
+
await stopContainer(container.containerId);
|
|
1495
|
+
await removeContainer(container.containerId, { graceful: true });
|
|
1268
1496
|
orphanCount++;
|
|
1269
1497
|
}
|
|
1270
1498
|
catch (err) {
|
|
@@ -1275,25 +1503,6 @@ export class OmnitronDaemon {
|
|
|
1275
1503
|
logger.info({ removed: orphanCount }, 'Orphan container cleanup complete');
|
|
1276
1504
|
}
|
|
1277
1505
|
}
|
|
1278
|
-
/**
|
|
1279
|
-
* Apply the internal-database schema.
|
|
1280
|
-
*
|
|
1281
|
-
* Delegates to the shared runner (`database/migration-runner.ts`) so this
|
|
1282
|
-
* path, the infrastructure service and the `migrate` CLI all execute the
|
|
1283
|
-
* same registry through the same engine. A failure here is logged as an
|
|
1284
|
-
* ERROR — the daemon keeps running, but every feature backed by
|
|
1285
|
-
* omnitron-pg (alerts, sessions, logs, metrics, deployments) is degraded
|
|
1286
|
-
* and the operator has to see it.
|
|
1287
|
-
*/
|
|
1288
|
-
async runOmnitronMigrations(logger) {
|
|
1289
|
-
const { runOmnitronMigrations } = await import('../database/migration-runner.js');
|
|
1290
|
-
try {
|
|
1291
|
-
await runOmnitronMigrations(logger);
|
|
1292
|
-
}
|
|
1293
|
-
catch (err) {
|
|
1294
|
-
logger.error({ error: err.message }, 'Omnitron database migrations FAILED — alerts, sessions, logs and metrics will not work until this is resolved');
|
|
1295
|
-
}
|
|
1296
|
-
}
|
|
1297
1506
|
// ============================================================================
|
|
1298
1507
|
// Health Indicators (Phase 2: titan-health custom indicators)
|
|
1299
1508
|
// ============================================================================
|
|
@@ -1304,9 +1513,16 @@ export class OmnitronDaemon {
|
|
|
1304
1513
|
const titanHealth = await this.app.container.resolveAsync(TITAN_HEALTH_TOKEN);
|
|
1305
1514
|
const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
|
|
1306
1515
|
// Docker containers health indicator
|
|
1307
|
-
titanHealth.registerIndicator(
|
|
1516
|
+
titanHealth.registerIndicator(runtimeDiagnostics);
|
|
1517
|
+
const { LogSinkHealthIndicator } = await import('../monitoring/log-sink-health.indicator.js');
|
|
1518
|
+
titanHealth.registerIndicator(new LogSinkHealthIndicator(await this.app.container.resolveAsync(LOGGER_SERVICE_TOKEN)));
|
|
1519
|
+
await orchestrator.configureReadiness(this.dc.applicationReadiness ?? {});
|
|
1520
|
+
const projects = await this.app.container.resolveAsync(PROJECT_SERVICE_TOKEN);
|
|
1521
|
+
titanHealth.registerIndicator(new DockerHealthIndicator(() => this.infraService, undefined, () => projects.getInfrastructureHealthContext()));
|
|
1308
1522
|
// Managed apps health indicator
|
|
1309
1523
|
titanHealth.registerIndicator(new AppHealthIndicator(orchestrator));
|
|
1524
|
+
const { MetricsStorageIndicator } = await import('../monitoring/metrics-storage.indicator.js');
|
|
1525
|
+
titanHealth.registerIndicator(new MetricsStorageIndicator(await this.app.container.resolveAsync(TITAN_METRICS_TOKEN)));
|
|
1310
1526
|
// How long the loop has stood still, and when — the number the console
|
|
1311
1527
|
// reads for a node that went quiet.
|
|
1312
1528
|
if (this.eventLoopWatch)
|
|
@@ -1317,25 +1533,28 @@ export class OmnitronDaemon {
|
|
|
1317
1533
|
// above, because this is the object that has just been given them.
|
|
1318
1534
|
this.nodeManagerRpcService?.setTitanHealth(titanHealth);
|
|
1319
1535
|
}
|
|
1320
|
-
catch {
|
|
1321
|
-
|
|
1536
|
+
catch (error) {
|
|
1537
|
+
runtimeDiagnostics.failure('runtime.health-registration', 'Health indicators could not be registered', error);
|
|
1322
1538
|
}
|
|
1323
1539
|
}
|
|
1324
1540
|
// ============================================================================
|
|
1325
1541
|
// File Watching (dev mode)
|
|
1326
1542
|
// ============================================================================
|
|
1327
|
-
startFileWatcher(config, options, logger) {
|
|
1328
|
-
if (!
|
|
1543
|
+
async startFileWatcher(config, options, logger) {
|
|
1544
|
+
if (!this.app)
|
|
1329
1545
|
return;
|
|
1330
|
-
this.app.container.resolveAsync(ORCHESTRATOR_TOKEN)
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1546
|
+
const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
|
|
1547
|
+
const enabled = !!options?.watch && !options?.noWatch && !this.dc?.cluster?.enabled;
|
|
1548
|
+
if (options?.watch && !options.noWatch && this.dc?.cluster?.enabled)
|
|
1549
|
+
logger.warn('File-triggered restarts require standalone lifecycle authority');
|
|
1550
|
+
orchestrator.devMode = enabled;
|
|
1551
|
+
await orchestrator.setWatchMode(enabled, options?.watchApps);
|
|
1552
|
+
if (this.execution)
|
|
1553
|
+
return;
|
|
1554
|
+
if (!enabled)
|
|
1555
|
+
return;
|
|
1556
|
+
this.fileWatcher = new FileWatcher(logger, orchestrator, config, process.cwd());
|
|
1557
|
+
this.fileWatcher.start(options?.watchApps);
|
|
1339
1558
|
}
|
|
1340
1559
|
// ============================================================================
|
|
1341
1560
|
// Start Managed Apps
|
|
@@ -1354,13 +1573,14 @@ export class OmnitronDaemon {
|
|
|
1354
1573
|
if (!this.app)
|
|
1355
1574
|
return;
|
|
1356
1575
|
const projectService = await this.app.container.resolveAsync(PROJECT_SERVICE_TOKEN);
|
|
1357
|
-
|
|
1576
|
+
this.startupAbort.signal.throwIfAborted();
|
|
1577
|
+
let allProjects = projectService.listProjectRegistrations();
|
|
1358
1578
|
// Auto-register project from CWD if no projects registered
|
|
1359
1579
|
if (allProjects.length === 0) {
|
|
1360
1580
|
try {
|
|
1361
1581
|
// Use ProjectService's own registry to auto-detect — keeps in-memory state consistent
|
|
1362
1582
|
projectService.autoDetectProject();
|
|
1363
|
-
allProjects = projectService.
|
|
1583
|
+
allProjects = projectService.listProjectRegistrations();
|
|
1364
1584
|
if (allProjects.length > 0) {
|
|
1365
1585
|
const p = allProjects[0];
|
|
1366
1586
|
await projectService.loadProjectConfig(p.name);
|
|
@@ -1375,36 +1595,16 @@ export class OmnitronDaemon {
|
|
|
1375
1595
|
logger.info('No projects registered. Use `omnitron project add <name> <path>` or run from a directory with omnitron.config.ts');
|
|
1376
1596
|
return;
|
|
1377
1597
|
}
|
|
1378
|
-
//
|
|
1379
|
-
//
|
|
1380
|
-
//
|
|
1381
|
-
//
|
|
1382
|
-
// for days. Bounded wait; on timeout we proceed and the enabled-stacks
|
|
1383
|
-
// reconciler keeps retrying with backoff.
|
|
1384
|
-
const hasEnabledStacks = allProjects.some((p) => (p.enabledStacks?.length ?? 0) > 0);
|
|
1385
|
-
if (hasEnabledStacks) {
|
|
1386
|
-
const { isDockerAvailable } = await import('../infrastructure/container-runtime.js');
|
|
1387
|
-
const deadline = Date.now() + 120_000;
|
|
1388
|
-
let waited = false;
|
|
1389
|
-
while (!(await isDockerAvailable())) {
|
|
1390
|
-
if (Date.now() > deadline) {
|
|
1391
|
-
logger.warn('Docker still unavailable after 120s — proceeding; reconciler will retry enabled stacks');
|
|
1392
|
-
break;
|
|
1393
|
-
}
|
|
1394
|
-
if (!waited) {
|
|
1395
|
-
logger.info('Docker not available yet (host still booting?) — waiting before stack resume');
|
|
1396
|
-
waited = true;
|
|
1397
|
-
}
|
|
1398
|
-
await new Promise((r) => setTimeout(r, 3_000));
|
|
1399
|
-
}
|
|
1400
|
-
if (waited)
|
|
1401
|
-
logger.info('Docker is available — continuing stack resume');
|
|
1402
|
-
}
|
|
1598
|
+
// Each stack checks its own declared infrastructure through startStack.
|
|
1599
|
+
// A missing local Docker daemon must not delay remote attachment or
|
|
1600
|
+
// application-only stacks. Failed local provisioning remains visible and
|
|
1601
|
+
// the enabled-stacks reconciler retries that stack independently.
|
|
1403
1602
|
// Reconcile orphan containers: stop/remove any omnitron.managed containers
|
|
1404
1603
|
// that don't belong to current registered projects/stacks (e.g. leftovers from
|
|
1405
1604
|
// a previous session or auto-restarted by Docker after a system reboot).
|
|
1406
1605
|
try {
|
|
1407
|
-
|
|
1606
|
+
if (!this.dc?.cluster?.enabled)
|
|
1607
|
+
await this.reconcileOrphanContainers(logger, allProjects, projectService);
|
|
1408
1608
|
}
|
|
1409
1609
|
catch (err) {
|
|
1410
1610
|
logger.warn({ error: err.message }, 'Orphan container reconciliation failed — continuing');
|
|
@@ -1412,6 +1612,7 @@ export class OmnitronDaemon {
|
|
|
1412
1612
|
// Iterate ALL registered projects and start their enabled stacks
|
|
1413
1613
|
let totalStacks = 0;
|
|
1414
1614
|
for (const project of allProjects) {
|
|
1615
|
+
this.startupAbort.signal.throwIfAborted();
|
|
1415
1616
|
// Load project config (populates internal cache used by listStacks)
|
|
1416
1617
|
try {
|
|
1417
1618
|
await projectService.loadProjectConfig(project.name);
|
|
@@ -1433,10 +1634,15 @@ export class OmnitronDaemon {
|
|
|
1433
1634
|
logger.info({ project: project.name, stacks: enabledStacks }, 'Starting project stacks');
|
|
1434
1635
|
// Start each enabled stack
|
|
1435
1636
|
for (const stackName of enabledStacks) {
|
|
1637
|
+
this.startupAbort.signal.throwIfAborted();
|
|
1436
1638
|
try {
|
|
1437
|
-
await projectService.startStack(project.name, stackName, { source: 'boot' });
|
|
1438
|
-
|
|
1439
|
-
|
|
1639
|
+
const result = await projectService.startStack(project.name, stackName, { source: 'boot' });
|
|
1640
|
+
if (result.type === 'local' && result.status !== 'running') {
|
|
1641
|
+
logger.warn({ project: project.name, stack: stackName, status: result.status, notUp: result.notUp }, 'Stack start incomplete during boot');
|
|
1642
|
+
}
|
|
1643
|
+
else {
|
|
1644
|
+
totalStacks++;
|
|
1645
|
+
}
|
|
1440
1646
|
}
|
|
1441
1647
|
catch (err) {
|
|
1442
1648
|
logger.error({ project: project.name, stack: stackName, error: err.message }, 'Failed to start stack — continuing with remaining');
|
|
@@ -1447,6 +1653,7 @@ export class OmnitronDaemon {
|
|
|
1447
1653
|
// Keep converging after boot: retry failed resumes (with backoff) and
|
|
1448
1654
|
// re-start enabled stacks that later fall over. One-shot boot resume is
|
|
1449
1655
|
// not enough — see the 2026-07-11 Docker-race incident.
|
|
1656
|
+
this.startupAbort.signal.throwIfAborted();
|
|
1450
1657
|
projectService.startEnabledStacksReconciler();
|
|
1451
1658
|
}
|
|
1452
1659
|
// ============================================================================
|
|
@@ -1467,19 +1674,17 @@ export class OmnitronDaemon {
|
|
|
1467
1674
|
// Both roles: a node evaluates its own alarms on its SQLite (daemon.module.ts).
|
|
1468
1675
|
const alertService = await container.resolveAsync(ALERT_SERVICE_TOKEN);
|
|
1469
1676
|
const fleetService = !isSlave ? await container.resolveAsync(FLEET_SERVICE_TOKEN) : null;
|
|
1470
|
-
registerDaemonJobs(scheduler, {
|
|
1677
|
+
this.metricSampling = registerDaemonJobs(scheduler, {
|
|
1471
1678
|
logger,
|
|
1679
|
+
diagnostics: runtimeDiagnostics,
|
|
1472
1680
|
orchestrator,
|
|
1473
1681
|
authService,
|
|
1474
1682
|
metricsService: titanMetrics,
|
|
1683
|
+
metricsInitiallyPaused: !this.backendAdmitted,
|
|
1475
1684
|
alertService,
|
|
1476
1685
|
fleetService,
|
|
1477
1686
|
logManager,
|
|
1478
1687
|
infraService: this.infraService,
|
|
1479
|
-
// Only a slave replicates. `bufferBatch` is itself a no-op for any
|
|
1480
|
-
// other role, but passing null keeps the job from registering at all
|
|
1481
|
-
// and makes the scheduler's own "skipped, because" line say so.
|
|
1482
|
-
syncService: isSlave ? this.syncService : null,
|
|
1483
1688
|
metricsInterval: config.monitoring.metrics.interval,
|
|
1484
1689
|
healthCheckInterval: config.monitoring.healthCheck.interval,
|
|
1485
1690
|
});
|
|
@@ -1488,7 +1693,7 @@ export class OmnitronDaemon {
|
|
|
1488
1693
|
logger.info('Daemon scheduler started with all periodic jobs');
|
|
1489
1694
|
}
|
|
1490
1695
|
catch (err) {
|
|
1491
|
-
|
|
1696
|
+
runtimeDiagnostics.failure('runtime.scheduler-startup', 'Periodic daemon jobs could not be registered', err, 'Repair the scheduler or its dependencies and restart safely; there is no manual timer fallback.');
|
|
1492
1697
|
}
|
|
1493
1698
|
}
|
|
1494
1699
|
// ============================================================================
|
|
@@ -1499,7 +1704,7 @@ export class OmnitronDaemon {
|
|
|
1499
1704
|
return;
|
|
1500
1705
|
const container = this.app.container;
|
|
1501
1706
|
const isSlave = this.dc.role === 'slave';
|
|
1502
|
-
//
|
|
1707
|
+
// Local application telemetry uses the controller's persistent log sink.
|
|
1503
1708
|
if (!isSlave) {
|
|
1504
1709
|
try {
|
|
1505
1710
|
const telemetryRelay = await container.resolveAsync(TELEMETRY_RELAY_TOKEN);
|
|
@@ -1507,7 +1712,7 @@ export class OmnitronDaemon {
|
|
|
1507
1712
|
logger.info({ nodeId: telemetryRelay.nodeId, role: telemetryRelay.role }, 'Telemetry relay started');
|
|
1508
1713
|
}
|
|
1509
1714
|
catch (err) {
|
|
1510
|
-
|
|
1715
|
+
runtimeDiagnostics.failure('runtime.telemetry-startup', 'Telemetry relay failed to start', err);
|
|
1511
1716
|
}
|
|
1512
1717
|
}
|
|
1513
1718
|
// Register self in fleet (master only — requires PG). `registerSelf`, so
|
|
@@ -1524,8 +1729,8 @@ export class OmnitronDaemon {
|
|
|
1524
1729
|
metadata: { pid: process.pid, version: CLI_VERSION, httpPort: this.dc.httpPort, rpcPort: this.rpcHttpPort },
|
|
1525
1730
|
});
|
|
1526
1731
|
}
|
|
1527
|
-
catch {
|
|
1528
|
-
|
|
1732
|
+
catch (error) {
|
|
1733
|
+
runtimeDiagnostics.failure('runtime.fleet-registration', 'The daemon could not register its fleet identity', error);
|
|
1529
1734
|
}
|
|
1530
1735
|
}
|
|
1531
1736
|
// Start sync service (slave→master data replication)
|
|
@@ -1545,7 +1750,7 @@ export class OmnitronDaemon {
|
|
|
1545
1750
|
logger.info('Trace collector started');
|
|
1546
1751
|
}
|
|
1547
1752
|
catch (err) {
|
|
1548
|
-
|
|
1753
|
+
runtimeDiagnostics.failure('runtime.trace-startup', 'Trace collector failed to start', err);
|
|
1549
1754
|
}
|
|
1550
1755
|
}
|
|
1551
1756
|
// Start leader election (cluster mode, master only)
|
|
@@ -1559,7 +1764,7 @@ export class OmnitronDaemon {
|
|
|
1559
1764
|
this.configSyncService = new ConfigSyncService(config, loggerModule.logger);
|
|
1560
1765
|
}
|
|
1561
1766
|
catch (err) {
|
|
1562
|
-
|
|
1767
|
+
runtimeDiagnostics.failure('runtime.leader-startup', 'Leader election failed to start', err);
|
|
1563
1768
|
}
|
|
1564
1769
|
}
|
|
1565
1770
|
}
|
|
@@ -1588,8 +1793,8 @@ export class OmnitronDaemon {
|
|
|
1588
1793
|
* its process ends, and the daemon runs the checks itself in the meantime.
|
|
1589
1794
|
*/
|
|
1590
1795
|
async startHealthMonitorWorker(logger) {
|
|
1591
|
-
if (this.dc.role === 'slave')
|
|
1592
|
-
return; //
|
|
1796
|
+
if (this.isShuttingDown || this.dc.role === 'slave')
|
|
1797
|
+
return; // Slaves do not manage a fleet.
|
|
1593
1798
|
if (!this.app) {
|
|
1594
1799
|
logger.warn({}, 'Health monitor not started — application is not available');
|
|
1595
1800
|
return;
|
|
@@ -1602,12 +1807,13 @@ export class OmnitronDaemon {
|
|
|
1602
1807
|
try {
|
|
1603
1808
|
const titanPm = await import('@omnitron-dev/titan-pm');
|
|
1604
1809
|
const { SystemWorkerManager } = await import('../workers/system-worker-manager.js');
|
|
1605
|
-
const { fileURLToPath } = await import('node:url');
|
|
1606
1810
|
const nodePath = await import('node:path');
|
|
1607
1811
|
const { omnitronPgConnectionString } = await import('../database/connection.js');
|
|
1608
1812
|
// Resolve PM from DI
|
|
1609
1813
|
const pm = await this.app.container.resolveAsync(titanPm.PM_MANAGER_TOKEN);
|
|
1610
1814
|
const loggerModule = await this.app.container.resolveAsync(LOGGER_SERVICE_TOKEN);
|
|
1815
|
+
if (this.isShuttingDown)
|
|
1816
|
+
return;
|
|
1611
1817
|
const workerManager = new SystemWorkerManager(pm, loggerModule.logger.child({ component: 'system-workers' }));
|
|
1612
1818
|
this.systemWorkerManager = workerManager;
|
|
1613
1819
|
// Get worker process path. The naive heuristic of "tsx in execArgv → .ts"
|
|
@@ -1674,6 +1880,8 @@ export class OmnitronDaemon {
|
|
|
1674
1880
|
this.healthWorkerSpawn = async () => {
|
|
1675
1881
|
const healthConfig = buildConfig();
|
|
1676
1882
|
const nodesJson = JSON.stringify(await nodeManager.getNodeCheckTargets());
|
|
1883
|
+
if (this.isShuttingDown)
|
|
1884
|
+
return;
|
|
1677
1885
|
const proxy = await workerManager.spawn('health-monitor', workerPath, { configJson: JSON.stringify(healthConfig), nodesJson }, spawnOpts);
|
|
1678
1886
|
// Wire IPC: worker → master status cache updates via PM's public API
|
|
1679
1887
|
workerManager.onMessage('health-monitor', (msg) => {
|
|
@@ -1709,16 +1917,21 @@ export class OmnitronDaemon {
|
|
|
1709
1917
|
});
|
|
1710
1918
|
});
|
|
1711
1919
|
// Wire node CRUD events → sync to worker
|
|
1920
|
+
let nodeSyncRevision = 0;
|
|
1712
1921
|
const syncNodesToWorker = async () => {
|
|
1713
1922
|
if (!workerManager.get('health-monitor'))
|
|
1714
1923
|
return;
|
|
1924
|
+
const revision = ++nodeSyncRevision;
|
|
1715
1925
|
const targets = await nodeManager.getNodeCheckTargets();
|
|
1926
|
+
if (revision !== nodeSyncRevision)
|
|
1927
|
+
return;
|
|
1716
1928
|
await callWorkerMethod(workerManager, 'updateNodes', JSON.stringify(targets)).catch((err) => {
|
|
1717
1929
|
logger.warn({ error: err.message }, 'Failed to sync node list to health monitor');
|
|
1718
1930
|
});
|
|
1719
1931
|
};
|
|
1720
1932
|
nodeManager.on('node:added', syncNodesToWorker);
|
|
1721
1933
|
nodeManager.on('node:updated', syncNodesToWorker);
|
|
1934
|
+
nodeManager.on('node:ssh-trust-changed', syncNodesToWorker);
|
|
1722
1935
|
nodeManager.on('node:removed', syncNodesToWorker);
|
|
1723
1936
|
// A node changing state is the event the console subscribes to. Four of
|
|
1724
1937
|
// the five NODE_EVENTS channels were declared and never emitted.
|
|
@@ -1748,6 +1961,8 @@ export class OmnitronDaemon {
|
|
|
1748
1961
|
await this.healthWorkerSpawn();
|
|
1749
1962
|
}
|
|
1750
1963
|
catch (err) {
|
|
1964
|
+
if (this.isShuttingDown)
|
|
1965
|
+
return;
|
|
1751
1966
|
logger.warn({ error: err.message }, 'Health monitor worker failed to start — falling back to direct checks');
|
|
1752
1967
|
this.startFallbackNodeChecks(logger);
|
|
1753
1968
|
if (this.healthWorkerSpawn)
|
|
@@ -1771,7 +1986,9 @@ export class OmnitronDaemon {
|
|
|
1771
1986
|
this.healthWorkerRestartTimer = null;
|
|
1772
1987
|
if (this.isShuttingDown || !this.healthWorkerSpawn)
|
|
1773
1988
|
return;
|
|
1774
|
-
this.healthWorkerSpawn().catch((err) => {
|
|
1989
|
+
this.healthMonitorStartup = this.healthWorkerSpawn().catch((err) => {
|
|
1990
|
+
if (this.isShuttingDown)
|
|
1991
|
+
return;
|
|
1775
1992
|
logger.warn({ attempt, startupTimeoutMs: this.healthWorkerStartupTimeout, error: err.message }, 'Health monitor worker restart failed');
|
|
1776
1993
|
this.scheduleHealthMonitorRestart(logger);
|
|
1777
1994
|
});
|
|
@@ -1879,13 +2096,13 @@ export class OmnitronDaemon {
|
|
|
1879
2096
|
projectService.on('project:config_reloaded', (name) => {
|
|
1880
2097
|
broadcaster.broadcast(PROJECT_EVENTS.CONFIG_RELOADED, { name });
|
|
1881
2098
|
});
|
|
1882
|
-
projectService.on('stack:started', (project, stack, type) => {
|
|
2099
|
+
projectService.on('stack:started', (project, stack, type, appCount, nodeCount) => {
|
|
1883
2100
|
broadcaster.broadcast(STACK_EVENTS.STARTED, {
|
|
1884
2101
|
project,
|
|
1885
2102
|
stack,
|
|
1886
2103
|
type: type,
|
|
1887
|
-
appCount
|
|
1888
|
-
nodeCount
|
|
2104
|
+
appCount,
|
|
2105
|
+
nodeCount,
|
|
1889
2106
|
});
|
|
1890
2107
|
});
|
|
1891
2108
|
projectService.on('stack:stopped', (project, stack, reason) => {
|
|
@@ -1917,15 +2134,24 @@ export class OmnitronDaemon {
|
|
|
1917
2134
|
async enableWatch(apps) {
|
|
1918
2135
|
if (!this.app)
|
|
1919
2136
|
throw new Error('Daemon not started');
|
|
2137
|
+
const config = this.watchConfig;
|
|
2138
|
+
if (!config)
|
|
2139
|
+
throw new Error('Daemon watch configuration is unavailable');
|
|
1920
2140
|
const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
|
|
1921
2141
|
const loggerModule = await this.app.container.resolveAsync(LOGGER_SERVICE_TOKEN);
|
|
2142
|
+
if (this.execution) {
|
|
2143
|
+
orchestrator.devMode = true;
|
|
2144
|
+
await orchestrator.setWatchMode(true, apps);
|
|
2145
|
+
return orchestrator.getBuildWatchedApps();
|
|
2146
|
+
}
|
|
1922
2147
|
if (this.fileWatcher) {
|
|
1923
2148
|
this.fileWatcher.stop();
|
|
1924
2149
|
}
|
|
1925
|
-
const config = await this.getConfig();
|
|
1926
2150
|
this.fileWatcher = new FileWatcher(loggerModule.logger, orchestrator, config, process.cwd());
|
|
2151
|
+
orchestrator.devMode = true;
|
|
2152
|
+
await orchestrator.setWatchMode(true, apps);
|
|
1927
2153
|
this.fileWatcher.start(apps);
|
|
1928
|
-
return this.fileWatcher.getWatchedApps();
|
|
2154
|
+
return [...this.fileWatcher.getWatchedApps(), ...orchestrator.getBuildWatchedApps()];
|
|
1929
2155
|
}
|
|
1930
2156
|
/**
|
|
1931
2157
|
* Point the file watcher at a reloaded config, if one is running.
|
|
@@ -1935,49 +2161,48 @@ export class OmnitronDaemon {
|
|
|
1935
2161
|
* reload updates, which is exactly how the watcher came to be left out of
|
|
1936
2162
|
* both.
|
|
1937
2163
|
*/
|
|
1938
|
-
applyWatchConfig(config) {
|
|
2164
|
+
async applyWatchConfig(config) {
|
|
2165
|
+
this.watchConfig = config;
|
|
1939
2166
|
this.fileWatcher?.applyConfig(config);
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
2167
|
+
if (!this.app)
|
|
2168
|
+
return;
|
|
2169
|
+
const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
|
|
2170
|
+
for (const entry of config.apps) {
|
|
2171
|
+
const handle = orchestrator.getHandle(entry.name);
|
|
2172
|
+
// A bare name may resolve to a different registered project's app.
|
|
2173
|
+
// Only the same entry point may update that handle's watch policy.
|
|
2174
|
+
const source = entry.bootstrap ?? entry.script;
|
|
2175
|
+
const running = handle?.entry.bootstrap ?? handle?.entry.script;
|
|
2176
|
+
if (!handle || !source || !running ||
|
|
2177
|
+
path.resolve(entry.cwd ?? process.cwd(), source) !== path.resolve(handle.entry.cwd ?? process.cwd(), running))
|
|
2178
|
+
continue;
|
|
2179
|
+
const next = { ...handle.entry };
|
|
2180
|
+
if (entry.watch === undefined)
|
|
2181
|
+
delete next.watch;
|
|
2182
|
+
else
|
|
2183
|
+
next.watch = entry.watch;
|
|
2184
|
+
await orchestrator.redefineApp(handle.name, next);
|
|
1945
2185
|
}
|
|
1946
2186
|
}
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
* boolean and concluded their edits were being picked up.
|
|
1954
|
-
*
|
|
1955
|
-
* The watch set is built from `config.apps` — the daemon's OWN ecosystem
|
|
1956
|
-
* config. Apps that arrive through the project registry are not in it, so a
|
|
1957
|
-
* daemon serving projects watches none of them however the flag reads.
|
|
1958
|
-
* `watching` is the fact an operator actually wants; `enabled` keeps its
|
|
1959
|
-
* old meaning so existing callers do not silently change behaviour, and
|
|
1960
|
-
* `reason` says why the two can disagree.
|
|
1961
|
-
*/
|
|
1962
|
-
getWatchStatus() {
|
|
1963
|
-
if (!this.fileWatcher) {
|
|
1964
|
-
return { enabled: false, watching: false, reason: 'the file watcher is not running', apps: [] };
|
|
1965
|
-
}
|
|
1966
|
-
const apps = this.fileWatcher.getWatchedApps();
|
|
1967
|
-
if (apps.length === 0) {
|
|
1968
|
-
return {
|
|
1969
|
-
enabled: true,
|
|
1970
|
-
watching: false,
|
|
1971
|
-
reason: 'the watcher is running but no app matched: the watch set comes from this daemon\'s own ' +
|
|
1972
|
-
'ecosystem config, and apps registered through a project are not in it',
|
|
1973
|
-
apps,
|
|
1974
|
-
};
|
|
2187
|
+
async disableWatch() {
|
|
2188
|
+
this.fileWatcher?.stop();
|
|
2189
|
+
this.fileWatcher = null;
|
|
2190
|
+
if (this.app) {
|
|
2191
|
+
const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
|
|
2192
|
+
await orchestrator.setWatchMode(false);
|
|
1975
2193
|
}
|
|
1976
|
-
return { enabled: true, watching: true, apps };
|
|
1977
2194
|
}
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
2195
|
+
/** Reports both watcher engines, including registered bootstrap projects. */
|
|
2196
|
+
async getWatchStatus() {
|
|
2197
|
+
const orchestrator = this.app
|
|
2198
|
+
? await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN) : null;
|
|
2199
|
+
const apps = [...(this.fileWatcher?.getWatchedApps() ?? []), ...(orchestrator?.getBuildWatchedApps() ?? [])];
|
|
2200
|
+
return {
|
|
2201
|
+
enabled: this.execution ? !!orchestrator?.devMode : !!this.fileWatcher,
|
|
2202
|
+
watching: apps.length > 0,
|
|
2203
|
+
...(apps.length ? {} : { reason: (this.execution ? orchestrator?.devMode : this.fileWatcher) ? 'no enabled app matches the watch policy' : 'watching is disabled' }),
|
|
2204
|
+
apps,
|
|
2205
|
+
};
|
|
1981
2206
|
}
|
|
1982
2207
|
// ============================================================================
|
|
1983
2208
|
// Lifecycle
|
|
@@ -1989,6 +2214,7 @@ export class OmnitronDaemon {
|
|
|
1989
2214
|
async stop() {
|
|
1990
2215
|
if (!this.app)
|
|
1991
2216
|
return;
|
|
2217
|
+
this.stopApplicationsOnExit = true;
|
|
1992
2218
|
await this.app.shutdown(ShutdownReason.Manual);
|
|
1993
2219
|
// Application doesn't process.exit() for Manual reason — do it explicitly
|
|
1994
2220
|
process.exit(0);
|
|
@@ -2003,6 +2229,8 @@ export class OmnitronDaemon {
|
|
|
2003
2229
|
async reloadConfigOnHup() {
|
|
2004
2230
|
if (!this.app)
|
|
2005
2231
|
return;
|
|
2232
|
+
if (this.dc?.cluster?.enabled)
|
|
2233
|
+
throw new Error('Cluster application configuration changes require the elected controller');
|
|
2006
2234
|
// Loading first, on its own: a malformed file must be rejected before
|
|
2007
2235
|
// anything is touched, and that failure genuinely means "the daemon is as
|
|
2008
2236
|
// it was".
|
|
@@ -2023,7 +2251,7 @@ export class OmnitronDaemon {
|
|
|
2023
2251
|
name: 'orchestrator',
|
|
2024
2252
|
apply: async (cfg) => {
|
|
2025
2253
|
const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
|
|
2026
|
-
orchestrator.setConfig(cfg);
|
|
2254
|
+
await orchestrator.setConfig(cfg);
|
|
2027
2255
|
},
|
|
2028
2256
|
},
|
|
2029
2257
|
{
|
|
@@ -2032,9 +2260,7 @@ export class OmnitronDaemon {
|
|
|
2032
2260
|
// updated who gets restarted but not who is watched: an app added to
|
|
2033
2261
|
// the config was never watched, and one removed from it kept its
|
|
2034
2262
|
// watchers and went on triggering restarts.
|
|
2035
|
-
apply: (cfg) =>
|
|
2036
|
-
this.applyWatchConfig(cfg);
|
|
2037
|
-
},
|
|
2263
|
+
apply: (cfg) => this.applyWatchConfig(cfg),
|
|
2038
2264
|
},
|
|
2039
2265
|
{
|
|
2040
2266
|
name: 'RPC snapshot',
|
|
@@ -2069,10 +2295,30 @@ export class OmnitronDaemon {
|
|
|
2069
2295
|
* VeryLow (90) — Dispose project service, teardown infrastructure
|
|
2070
2296
|
* Last (100) — Remove PID file
|
|
2071
2297
|
*/
|
|
2072
|
-
registerShutdownTasks(app) {
|
|
2298
|
+
registerShutdownTasks(app, logger) {
|
|
2073
2299
|
const container = app.container;
|
|
2300
|
+
const cancelStartup = () => {
|
|
2301
|
+
this.isShuttingDown = true;
|
|
2302
|
+
this.backendAdmitted = false;
|
|
2303
|
+
this.startupAbort.abort();
|
|
2304
|
+
};
|
|
2305
|
+
// Titan remains the only shutdown coordinator. Its first task joins the
|
|
2306
|
+
// in-flight startup step before cleanup can dispose resources that step
|
|
2307
|
+
// is still creating. The concurrent health worker is owned by the same
|
|
2308
|
+
// barrier, even though normal boot does not wait for fleet monitoring.
|
|
2309
|
+
app.registerShutdownTask('settle-daemon-startup', async () => {
|
|
2310
|
+
cancelStartup();
|
|
2311
|
+
await this.startupWork?.catch(() => undefined);
|
|
2312
|
+
await this.healthMonitorStartup;
|
|
2313
|
+
}, ShutdownPriority.First - 1, true);
|
|
2314
|
+
app.registerShutdownTask('close-recovery-journal', async () => {
|
|
2315
|
+
await this.recoveryMonitor?.close(this.stopApplicationsOnExit || this.handingOffBackend);
|
|
2316
|
+
this.recoveryMonitor = null;
|
|
2317
|
+
}, ShutdownPriority.First);
|
|
2074
2318
|
// Broadcast DAEMON_EVENTS.STOPPING on shutdown start
|
|
2075
2319
|
app.on(ApplicationEvent.ShutdownStart, ({ reason, details }) => {
|
|
2320
|
+
this.shutdownRequested = true;
|
|
2321
|
+
cancelStartup();
|
|
2076
2322
|
this.eventBroadcaster?.broadcast(DAEMON_EVENTS.STOPPING, {
|
|
2077
2323
|
reason,
|
|
2078
2324
|
signal: details?.signal,
|
|
@@ -2105,7 +2351,25 @@ export class OmnitronDaemon {
|
|
|
2105
2351
|
}
|
|
2106
2352
|
});
|
|
2107
2353
|
// --- Priority: First (0) — Immediate cleanup ---
|
|
2354
|
+
app.registerShutdownTask('quiesce-metric-sampling', async () => {
|
|
2355
|
+
try {
|
|
2356
|
+
await this.metricSampling?.pauseAndFlush();
|
|
2357
|
+
}
|
|
2358
|
+
catch (error) {
|
|
2359
|
+
runtimeDiagnostics.failure('metrics.shutdown', 'Metric flush before shutdown failed; buffered samples require a final flush', error);
|
|
2360
|
+
}
|
|
2361
|
+
}, ShutdownPriority.First);
|
|
2108
2362
|
app.registerShutdownTask('stop-file-watcher-and-webapp', async () => {
|
|
2363
|
+
this.eventLoopWatch?.stop();
|
|
2364
|
+
this.eventLoopWatch = null;
|
|
2365
|
+
await this.filesRpcService?.dispose();
|
|
2366
|
+
this.filesRpcService = null;
|
|
2367
|
+
await this.fileNode?.dispose();
|
|
2368
|
+
this.fileNode = null;
|
|
2369
|
+
await this.pipelineService?.dispose();
|
|
2370
|
+
this.pipelineService = null;
|
|
2371
|
+
this.terminalRpcService?.dispose();
|
|
2372
|
+
this.terminalRpcService = null;
|
|
2109
2373
|
if (this.fileWatcher) {
|
|
2110
2374
|
this.fileWatcher.stop();
|
|
2111
2375
|
this.fileWatcher = null;
|
|
@@ -2121,12 +2385,20 @@ export class OmnitronDaemon {
|
|
|
2121
2385
|
catch { /* non-critical */ }
|
|
2122
2386
|
this.metricsServer = null;
|
|
2123
2387
|
}
|
|
2124
|
-
//
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2388
|
+
// Only an explicit instance shutdown owns its configured Console.
|
|
2389
|
+
// Backend replacement and instances without a Console must leave it up.
|
|
2390
|
+
if (!this.handingOffBackend && (!this.execution || this.stopApplicationsOnExit)) {
|
|
2391
|
+
try {
|
|
2392
|
+
const { readSavedDaemonConfig } = await import('../config/saved.js');
|
|
2393
|
+
if (readSavedDaemonConfig()?.webapp) {
|
|
2394
|
+
const { WebappService } = await import('../webapp/webapp.service.js');
|
|
2395
|
+
await new WebappService(logger).stop();
|
|
2396
|
+
}
|
|
2397
|
+
}
|
|
2398
|
+
catch (error) {
|
|
2399
|
+
logger.warn({ error }, 'Could not stop this instance’s Console');
|
|
2400
|
+
}
|
|
2128
2401
|
}
|
|
2129
|
-
catch { /* non-critical */ }
|
|
2130
2402
|
}, ShutdownPriority.First);
|
|
2131
2403
|
// A release build outlives its daemon otherwise.
|
|
2132
2404
|
//
|
|
@@ -2144,31 +2416,39 @@ export class OmnitronDaemon {
|
|
|
2144
2416
|
}, ShutdownPriority.First);
|
|
2145
2417
|
// --- Priority: VeryHigh (10) — Stop managed apps (fast — 5s per app max) ---
|
|
2146
2418
|
app.registerShutdownTask('stop-managed-apps', async () => {
|
|
2419
|
+
if (this.handingOffBackend || (this.execution && !this.stopApplicationsOnExit))
|
|
2420
|
+
return;
|
|
2147
2421
|
const orchestrator = await container.resolveAsync(ORCHESTRATOR_TOKEN);
|
|
2148
2422
|
await orchestrator.stopAll(true); // force=true for fast shutdown (SIGTERM + 5s → SIGKILL)
|
|
2149
2423
|
}, ShutdownPriority.VeryHigh);
|
|
2150
2424
|
// --- Priority: High (20) — Stop background services ---
|
|
2151
2425
|
app.registerShutdownTask('stop-background-services', async () => {
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2426
|
+
if (this.dc.role !== 'slave') {
|
|
2427
|
+
try {
|
|
2428
|
+
const relay = await container.resolveAsync(TELEMETRY_RELAY_TOKEN);
|
|
2429
|
+
await relay.stop();
|
|
2430
|
+
}
|
|
2431
|
+
catch (error) {
|
|
2432
|
+
runtimeDiagnostics.failure('runtime.telemetry-shutdown', 'Final local telemetry delivery was not confirmed', error);
|
|
2433
|
+
}
|
|
2434
|
+
try {
|
|
2435
|
+
const fleet = await container.resolveAsync(FLEET_SERVICE_TOKEN);
|
|
2436
|
+
fleet.stopHeartbeatSweep();
|
|
2437
|
+
}
|
|
2438
|
+
catch { /* non-critical */ }
|
|
2439
|
+
try {
|
|
2440
|
+
const tc = await container.resolveAsync(TRACE_COLLECTOR_TOKEN);
|
|
2441
|
+
await tc.stop();
|
|
2442
|
+
}
|
|
2443
|
+
catch { /* non-critical */ }
|
|
2155
2444
|
}
|
|
2156
|
-
catch { /* non-critical */ }
|
|
2157
2445
|
try {
|
|
2158
2446
|
const mc = await container.resolveAsync(TITAN_METRICS_TOKEN);
|
|
2159
2447
|
await mc.stop();
|
|
2160
2448
|
}
|
|
2161
|
-
catch {
|
|
2162
|
-
|
|
2163
|
-
const fleet = await container.resolveAsync(FLEET_SERVICE_TOKEN);
|
|
2164
|
-
fleet.stopHeartbeatSweep();
|
|
2165
|
-
}
|
|
2166
|
-
catch { /* non-critical */ }
|
|
2167
|
-
try {
|
|
2168
|
-
const tc = await container.resolveAsync(TRACE_COLLECTOR_TOKEN);
|
|
2169
|
-
await tc.stop();
|
|
2449
|
+
catch (error) {
|
|
2450
|
+
runtimeDiagnostics.failure('metrics.shutdown', 'Final metric flush failed; buffered samples were not confirmed', error);
|
|
2170
2451
|
}
|
|
2171
|
-
catch { /* non-critical */ }
|
|
2172
2452
|
}, ShutdownPriority.High);
|
|
2173
2453
|
// --- Priority: Normal (50) — System workers, node manager, sync, cluster ---
|
|
2174
2454
|
app.registerShutdownTask('stop-system-services', async () => {
|
|
@@ -2196,10 +2476,12 @@ export class OmnitronDaemon {
|
|
|
2196
2476
|
this.syncService = null;
|
|
2197
2477
|
}
|
|
2198
2478
|
try {
|
|
2199
|
-
if (this.leaderElection
|
|
2200
|
-
this.leaderElection.stop();
|
|
2479
|
+
if (this.leaderElection)
|
|
2480
|
+
await this.leaderElection.stop();
|
|
2201
2481
|
}
|
|
2202
2482
|
catch { /* non-critical */ }
|
|
2483
|
+
if (this.clusterDb)
|
|
2484
|
+
await this.clusterDb.destroy();
|
|
2203
2485
|
try {
|
|
2204
2486
|
if (this.configSyncService?.stopPeriodicSync)
|
|
2205
2487
|
this.configSyncService.stopPeriodicSync();
|
|
@@ -2207,7 +2489,6 @@ export class OmnitronDaemon {
|
|
|
2207
2489
|
catch { /* non-critical */ }
|
|
2208
2490
|
// Before stopping the workers: a worker exiting on the way out must not
|
|
2209
2491
|
// be read as a crash and rescheduled.
|
|
2210
|
-
this.isShuttingDown = true;
|
|
2211
2492
|
this.healthWorkerSpawn = null;
|
|
2212
2493
|
if (this.healthWorkerRestartTimer) {
|
|
2213
2494
|
clearTimeout(this.healthWorkerRestartTimer);
|
|
@@ -2239,16 +2520,12 @@ export class OmnitronDaemon {
|
|
|
2239
2520
|
}
|
|
2240
2521
|
catch { /* non-critical */ }
|
|
2241
2522
|
}, ShutdownPriority.Normal);
|
|
2242
|
-
// --- Priority: Low (80) —
|
|
2243
|
-
app.registerShutdownTask('
|
|
2244
|
-
try {
|
|
2245
|
-
const logCollector = await container.resolveAsync(LOG_COLLECTOR_TOKEN);
|
|
2246
|
-
await logCollector.dispose();
|
|
2247
|
-
}
|
|
2248
|
-
catch { /* non-critical */ }
|
|
2523
|
+
// --- Priority: Low (80) — Clear state ---
|
|
2524
|
+
app.registerShutdownTask('clear-state', async () => {
|
|
2249
2525
|
try {
|
|
2250
2526
|
const stateStore = await container.resolveAsync(STATE_STORE_TOKEN);
|
|
2251
|
-
|
|
2527
|
+
if (!this.execution)
|
|
2528
|
+
stateStore.clear();
|
|
2252
2529
|
}
|
|
2253
2530
|
catch { /* non-critical */ }
|
|
2254
2531
|
}, ShutdownPriority.Low);
|
|
@@ -2272,9 +2549,10 @@ export class OmnitronDaemon {
|
|
|
2272
2549
|
// lifetime. Locally it still tears down — `omnitron down` there means
|
|
2273
2550
|
// "I am done for the day" — and on either, `omnitron infra down` is
|
|
2274
2551
|
// the command that removes containers on purpose.
|
|
2275
|
-
if (this.dc.role === 'slave') {
|
|
2552
|
+
if (this.dc.cluster?.enabled || this.dc.role === 'slave' || this.handingOffBackend || (this.execution && !this.stopApplicationsOnExit)) {
|
|
2276
2553
|
// Said on the way out, because the absence of a teardown is
|
|
2277
2554
|
// otherwise indistinguishable from a teardown that failed.
|
|
2555
|
+
this.infraService.dispose();
|
|
2278
2556
|
console.info('[omnitron] leaving this node\'s infrastructure running — the daemon does not own its lifetime');
|
|
2279
2557
|
}
|
|
2280
2558
|
else {
|
|
@@ -2286,12 +2564,61 @@ export class OmnitronDaemon {
|
|
|
2286
2564
|
this.infraService = null;
|
|
2287
2565
|
}
|
|
2288
2566
|
}, ShutdownPriority.VeryLow);
|
|
2567
|
+
app.registerShutdownTask('flush-logs', async () => {
|
|
2568
|
+
const logManager = await container.resolveAsync(LOG_MANAGER_TOKEN);
|
|
2569
|
+
const logCollector = await container.resolveAsync(LOG_COLLECTOR_TOKEN);
|
|
2570
|
+
try {
|
|
2571
|
+
await logManager.flush();
|
|
2572
|
+
const module = await container.resolveAsync(LOGGER_SERVICE_TOKEN);
|
|
2573
|
+
await module.flush();
|
|
2574
|
+
getDaemonLogCollectorStream()?.seal();
|
|
2575
|
+
await logCollector.dispose();
|
|
2576
|
+
}
|
|
2577
|
+
catch (error) {
|
|
2578
|
+
runtimeDiagnostics.failure('logs.shutdown', 'Final log delivery remains pending in the local journal', error, 'The next backend retries the same records; inspect log persistence diagnostics.');
|
|
2579
|
+
}
|
|
2580
|
+
// The backend stream stays open for later Titan shutdown messages. Its
|
|
2581
|
+
// synchronous journal captures those for replay by the next backend.
|
|
2582
|
+
}, ShutdownPriority.Last);
|
|
2289
2583
|
// --- Priority: Last (100) — PID file removal ---
|
|
2290
2584
|
app.registerShutdownTask('remove-pid', () => {
|
|
2291
|
-
this.pidManager?.
|
|
2585
|
+
this.pidManager?.removeOwned();
|
|
2586
|
+
}, ShutdownPriority.Last);
|
|
2587
|
+
app.registerShutdownTask('release-execution-controller', async () => {
|
|
2588
|
+
if (!this.execution)
|
|
2589
|
+
return;
|
|
2590
|
+
if (!this.handingOffBackend && this.stopApplicationsOnExit)
|
|
2591
|
+
await this.execution.shutdownOwner();
|
|
2592
|
+
await this.execution.close();
|
|
2593
|
+
if (!this.handingOffBackend)
|
|
2594
|
+
await this.backendControl?.stop();
|
|
2292
2595
|
}, ShutdownPriority.Last);
|
|
2293
2596
|
}
|
|
2294
2597
|
}
|
|
2598
|
+
__decorate([
|
|
2599
|
+
RecoveryMutation(),
|
|
2600
|
+
__metadata("design:type", Function),
|
|
2601
|
+
__metadata("design:paramtypes", [Array]),
|
|
2602
|
+
__metadata("design:returntype", Promise)
|
|
2603
|
+
], OmnitronDaemon.prototype, "enableWatch", null);
|
|
2604
|
+
__decorate([
|
|
2605
|
+
RecoveryMutation(),
|
|
2606
|
+
__metadata("design:type", Function),
|
|
2607
|
+
__metadata("design:paramtypes", [Object]),
|
|
2608
|
+
__metadata("design:returntype", Promise)
|
|
2609
|
+
], OmnitronDaemon.prototype, "applyWatchConfig", null);
|
|
2610
|
+
__decorate([
|
|
2611
|
+
RecoveryMutation(),
|
|
2612
|
+
__metadata("design:type", Function),
|
|
2613
|
+
__metadata("design:paramtypes", []),
|
|
2614
|
+
__metadata("design:returntype", Promise)
|
|
2615
|
+
], OmnitronDaemon.prototype, "disableWatch", null);
|
|
2616
|
+
__decorate([
|
|
2617
|
+
RecoveryMutation(),
|
|
2618
|
+
__metadata("design:type", Function),
|
|
2619
|
+
__metadata("design:paramtypes", []),
|
|
2620
|
+
__metadata("design:returntype", Promise)
|
|
2621
|
+
], OmnitronDaemon.prototype, "reloadConfigOnHup", null);
|
|
2295
2622
|
/**
|
|
2296
2623
|
* Call a method on a system worker's proxy.
|
|
2297
2624
|
*
|