@omnitron-dev/omnitron 0.3.3 → 0.4.6
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 +296 -6
- package/bin/{pnpmfile-sdk.mjs → pnpmfile-sdk.js} +19 -1
- package/bin/sdk.d.ts +19 -0
- package/bin/sdk.js +932 -0
- package/dist/BUILD.json +2 -2
- package/dist/cli/omnitron.js +68 -20
- package/dist/cli/omnitron.js.map +1 -1
- package/dist/commands/infra.d.ts +8 -2
- package/dist/commands/infra.d.ts.map +1 -1
- package/dist/commands/infra.js +52 -59
- package/dist/commands/infra.js.map +1 -1
- package/dist/commands/node.d.ts.map +1 -1
- package/dist/commands/node.js +8 -1
- package/dist/commands/node.js.map +1 -1
- package/dist/commands/release-store.d.ts.map +1 -1
- package/dist/commands/release-store.js +6 -9
- package/dist/commands/release-store.js.map +1 -1
- package/dist/commands/release.d.ts +4 -1
- package/dist/commands/release.d.ts.map +1 -1
- package/dist/commands/release.js +125 -5
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/stack.d.ts +3 -6
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +51 -9
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +1 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/config/saved.d.ts +3 -0
- package/dist/config/saved.d.ts.map +1 -1
- package/dist/config/saved.js +1 -0
- package/dist/config/saved.js.map +1 -1
- package/dist/config/types.d.ts +4 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/daemon/daemon-client.d.ts +3 -15
- package/dist/daemon/daemon-client.d.ts.map +1 -1
- package/dist/daemon/daemon-client.js +4 -0
- package/dist/daemon/daemon-client.js.map +1 -1
- package/dist/daemon/daemon.d.ts +5 -11
- package/dist/daemon/daemon.d.ts.map +1 -1
- package/dist/daemon/daemon.js +58 -48
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/daemon.rpc-service.d.ts +3 -41
- package/dist/daemon/daemon.rpc-service.d.ts.map +1 -1
- package/dist/daemon/daemon.rpc-service.js +50 -117
- package/dist/daemon/daemon.rpc-service.js.map +1 -1
- package/dist/daemon/darwin-owner-evidence.js +1 -1
- package/dist/daemon/darwin-owner-evidence.js.map +1 -1
- package/dist/daemon/execution-capabilities.d.ts +1 -1
- package/dist/daemon/execution-capabilities.d.ts.map +1 -1
- package/dist/daemon/execution-capabilities.js +3 -3
- package/dist/daemon/execution-capabilities.js.map +1 -1
- package/dist/daemon/execution-client.d.ts +5 -1
- package/dist/daemon/execution-client.d.ts.map +1 -1
- package/dist/daemon/execution-client.js +45 -19
- package/dist/daemon/execution-client.js.map +1 -1
- package/dist/daemon/execution-host.d.ts +4 -11
- package/dist/daemon/execution-host.d.ts.map +1 -1
- package/dist/daemon/execution-host.js +3 -9
- package/dist/daemon/execution-host.js.map +1 -1
- package/dist/daemon/execution-owner.d.ts.map +1 -1
- package/dist/daemon/execution-owner.js +2 -16
- package/dist/daemon/execution-owner.js.map +1 -1
- package/dist/daemon/execution-shutdown.d.ts +1 -1
- package/dist/daemon/execution-shutdown.d.ts.map +1 -1
- package/dist/daemon/managed-owner-build.d.ts +4 -0
- package/dist/daemon/managed-owner-build.d.ts.map +1 -1
- package/dist/daemon/managed-owner-build.js +14 -2
- package/dist/daemon/managed-owner-build.js.map +1 -1
- package/dist/daemon/managed-runtime.js +1 -1
- package/dist/daemon/managed-runtime.js.map +1 -1
- package/dist/daemon/owner-reconciliation.d.ts.map +1 -1
- package/dist/daemon/owner-reconciliation.js +1 -2
- package/dist/daemon/owner-reconciliation.js.map +1 -1
- package/dist/daemon/startup-config.d.ts +1 -0
- package/dist/daemon/startup-config.d.ts.map +1 -1
- package/dist/daemon/system-guardian-cgroup.js +1 -1
- package/dist/daemon/system-guardian-cgroup.js.map +1 -1
- package/dist/infrastructure/container-runtime.d.ts +8 -0
- package/dist/infrastructure/container-runtime.d.ts.map +1 -1
- package/dist/infrastructure/container-runtime.js +5 -0
- package/dist/infrastructure/container-runtime.js.map +1 -1
- package/dist/infrastructure/existing-containers.d.ts +25 -0
- package/dist/infrastructure/existing-containers.d.ts.map +1 -0
- package/dist/infrastructure/existing-containers.js +183 -0
- package/dist/infrastructure/existing-containers.js.map +1 -0
- package/dist/infrastructure/infrastructure.service.d.ts +19 -1
- package/dist/infrastructure/infrastructure.service.d.ts.map +1 -1
- package/dist/infrastructure/infrastructure.service.js +136 -17
- package/dist/infrastructure/infrastructure.service.js.map +1 -1
- package/dist/infrastructure/presets/postgres.js +1 -1
- package/dist/infrastructure/presets/postgres.js.map +1 -1
- package/dist/infrastructure/presets/registry.d.ts.map +1 -1
- package/dist/infrastructure/presets/registry.js +11 -19
- package/dist/infrastructure/presets/registry.js.map +1 -1
- package/dist/infrastructure/stack-infra-manager.d.ts +11 -1
- package/dist/infrastructure/stack-infra-manager.d.ts.map +1 -1
- package/dist/infrastructure/stack-infra-manager.js +79 -8
- package/dist/infrastructure/stack-infra-manager.js.map +1 -1
- package/dist/mcp/tool-groups/infra.tools.d.ts.map +1 -1
- package/dist/mcp/tool-groups/infra.tools.js +4 -1
- package/dist/mcp/tool-groups/infra.tools.js.map +1 -1
- package/dist/monitoring/log-journal.d.ts.map +1 -1
- package/dist/monitoring/log-journal.js +1 -2
- package/dist/monitoring/log-journal.js.map +1 -1
- package/dist/operations.d.ts +1 -0
- package/dist/operations.d.ts.map +1 -1
- package/dist/operations.js +1 -0
- package/dist/operations.js.map +1 -1
- package/dist/orchestrator/app-name.d.ts +33 -0
- package/dist/orchestrator/app-name.d.ts.map +1 -0
- package/dist/orchestrator/app-name.js +68 -0
- package/dist/orchestrator/app-name.js.map +1 -0
- package/dist/orchestrator/bootstrap-loader.d.ts +2 -0
- package/dist/orchestrator/bootstrap-loader.d.ts.map +1 -1
- package/dist/orchestrator/bootstrap-loader.js +2 -1
- package/dist/orchestrator/bootstrap-loader.js.map +1 -1
- package/dist/orchestrator/classic-launcher.d.ts.map +1 -1
- package/dist/orchestrator/classic-launcher.js +2 -1
- package/dist/orchestrator/classic-launcher.js.map +1 -1
- package/dist/orchestrator/execution-contract.d.ts +2 -3
- package/dist/orchestrator/execution-contract.d.ts.map +1 -1
- package/dist/orchestrator/file-watcher.d.ts +11 -23
- package/dist/orchestrator/file-watcher.d.ts.map +1 -1
- package/dist/orchestrator/file-watcher.js +57 -42
- package/dist/orchestrator/file-watcher.js.map +1 -1
- package/dist/orchestrator/orchestrator.service.d.ts +11 -31
- package/dist/orchestrator/orchestrator.service.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.service.js +127 -109
- package/dist/orchestrator/orchestrator.service.js.map +1 -1
- package/dist/project/bootstrap-metadata.d.ts +1 -1
- package/dist/project/bootstrap-metadata.d.ts.map +1 -1
- package/dist/project/bootstrap-metadata.js +3 -2
- package/dist/project/bootstrap-metadata.js.map +1 -1
- package/dist/project/node-stack-stop.d.ts +2 -1
- package/dist/project/node-stack-stop.d.ts.map +1 -1
- package/dist/project/node-stack-stop.js +5 -1
- package/dist/project/node-stack-stop.js.map +1 -1
- package/dist/project/stack-diagnosis.d.ts.map +1 -1
- package/dist/project/stack-diagnosis.js +2 -3
- package/dist/project/stack-diagnosis.js.map +1 -1
- package/dist/release/artifact-store.d.ts +42 -7
- package/dist/release/artifact-store.d.ts.map +1 -1
- package/dist/release/artifact-store.js +176 -62
- package/dist/release/artifact-store.js.map +1 -1
- package/dist/release/closure-library-path.d.ts +8 -2
- package/dist/release/closure-library-path.d.ts.map +1 -1
- package/dist/release/closure-library-path.js +72 -28
- package/dist/release/closure-library-path.js.map +1 -1
- package/dist/release/configured-store.d.ts +6 -0
- package/dist/release/configured-store.d.ts.map +1 -0
- package/dist/release/configured-store.js +54 -0
- package/dist/release/configured-store.js.map +1 -0
- package/dist/release/load.d.ts +3 -0
- package/dist/release/load.d.ts.map +1 -1
- package/dist/release/load.js +8 -2
- package/dist/release/load.js.map +1 -1
- package/dist/release/local-installation.d.ts +2 -0
- package/dist/release/local-installation.d.ts.map +1 -1
- package/dist/release/local-installation.js +1 -1
- package/dist/release/local-installation.js.map +1 -1
- package/dist/release/portable-archive.d.ts +3 -0
- package/dist/release/portable-archive.d.ts.map +1 -1
- package/dist/release/portable-archive.js +13 -7
- package/dist/release/portable-archive.js.map +1 -1
- package/dist/release/registry-framework.d.ts +25 -0
- package/dist/release/registry-framework.d.ts.map +1 -1
- package/dist/release/registry-framework.js +51 -3
- package/dist/release/registry-framework.js.map +1 -1
- package/dist/release/target-runtime.d.ts +4 -0
- package/dist/release/target-runtime.d.ts.map +1 -1
- package/dist/release/target-runtime.js +9 -0
- package/dist/release/target-runtime.js.map +1 -1
- package/dist/services/host-upgrade.d.ts +2 -0
- package/dist/services/host-upgrade.d.ts.map +1 -1
- package/dist/services/host-upgrade.js +6 -2
- package/dist/services/host-upgrade.js.map +1 -1
- package/dist/services/infrastructure.rpc-service.d.ts +14 -2
- package/dist/services/infrastructure.rpc-service.d.ts.map +1 -1
- package/dist/services/infrastructure.rpc-service.js +128 -17
- package/dist/services/infrastructure.rpc-service.js.map +1 -1
- package/dist/services/kernel-rollout.service.d.ts.map +1 -1
- package/dist/services/kernel-rollout.service.js +1 -2
- package/dist/services/kernel-rollout.service.js.map +1 -1
- package/dist/services/migration-process.d.ts +1 -0
- package/dist/services/migration-process.d.ts.map +1 -1
- package/dist/services/migration-process.js +4 -2
- package/dist/services/migration-process.js.map +1 -1
- package/dist/services/node-deploy-lease.d.ts +4 -1
- package/dist/services/node-deploy-lease.d.ts.map +1 -1
- package/dist/services/node-deploy-lease.js +29 -4
- package/dist/services/node-deploy-lease.js.map +1 -1
- package/dist/services/node-manager.service.d.ts +5 -25
- package/dist/services/node-manager.service.d.ts.map +1 -1
- package/dist/services/node-manager.service.js +150 -139
- package/dist/services/node-manager.service.js.map +1 -1
- package/dist/services/pipeline-definition.d.ts.map +1 -1
- package/dist/services/pipeline-definition.js +32 -6
- package/dist/services/pipeline-definition.js.map +1 -1
- package/dist/services/pipeline.service.d.ts +7 -1
- package/dist/services/pipeline.service.d.ts.map +1 -1
- package/dist/services/pipeline.service.js +106 -13
- package/dist/services/pipeline.service.js.map +1 -1
- package/dist/services/project.rpc-service.d.ts +6 -5
- package/dist/services/project.rpc-service.d.ts.map +1 -1
- package/dist/services/project.rpc-service.js +13 -0
- package/dist/services/project.rpc-service.js.map +1 -1
- package/dist/services/project.service.d.ts +30 -6
- package/dist/services/project.service.d.ts.map +1 -1
- package/dist/services/project.service.js +414 -66
- package/dist/services/project.service.js.map +1 -1
- package/dist/services/release.rpc-service.d.ts +2 -1
- package/dist/services/release.rpc-service.d.ts.map +1 -1
- package/dist/services/release.rpc-service.js +19 -3
- package/dist/services/release.rpc-service.js.map +1 -1
- package/dist/services/release.service.d.ts +24 -11
- package/dist/services/release.service.d.ts.map +1 -1
- package/dist/services/release.service.js +162 -39
- package/dist/services/release.service.js.map +1 -1
- package/dist/services/remote-deployer.service.d.ts +1 -1
- package/dist/services/remote-deployer.service.d.ts.map +1 -1
- package/dist/services/remote-deployer.service.js +3 -0
- package/dist/services/remote-deployer.service.js.map +1 -1
- package/dist/services/secrets.service.d.ts +6 -0
- package/dist/services/secrets.service.d.ts.map +1 -1
- package/dist/services/secrets.service.js +95 -51
- package/dist/services/secrets.service.js.map +1 -1
- package/dist/shared/dto/backend.d.ts +3 -0
- package/dist/shared/dto/backend.d.ts.map +1 -1
- package/dist/shared/dto/backend.js.map +1 -1
- package/dist/shared/dto/nodes.d.ts +2 -0
- package/dist/shared/dto/nodes.d.ts.map +1 -1
- package/dist/shared/dto/pipelines.d.ts +54 -5
- package/dist/shared/dto/pipelines.d.ts.map +1 -1
- package/dist/shared/dto/pipelines.js +0 -7
- package/dist/shared/dto/pipelines.js.map +1 -1
- package/dist/shared/dto/project.d.ts +61 -1
- package/dist/shared/dto/project.d.ts.map +1 -1
- package/dist/shared/dto/releases.d.ts +8 -1
- package/dist/shared/dto/releases.d.ts.map +1 -1
- package/dist/shared/dto/services.d.ts +44 -18
- package/dist/shared/dto/services.d.ts.map +1 -1
- package/dist/shared/dto/services.js.map +1 -1
- package/dist/shared/release-reading.d.ts +6 -0
- package/dist/shared/release-reading.d.ts.map +1 -1
- package/dist/shared/release-reading.js +42 -0
- package/dist/shared/release-reading.js.map +1 -1
- package/dist/workers/system-worker-manager.d.ts +1 -2
- package/dist/workers/system-worker-manager.d.ts.map +1 -1
- package/dist/workers/system-worker-manager.js +5 -3
- package/dist/workers/system-worker-manager.js.map +1 -1
- package/package.json +20 -19
- package/webapp/dist/BUILD.json +2 -2
- package/webapp/dist/assets/{access-jWkHxGc7.js → access-B2gXuoMG.js} +1 -1
- package/webapp/dist/assets/{access-48hkC2-P.js → access-I0f72P9m.js} +1 -1
- package/webapp/dist/assets/{admin-data-table-BKSDI8sU.js → admin-data-table-CAEL2f-m.js} +1 -1
- package/webapp/dist/assets/{alert-uBG6r9NW.js → alert-BdJ2uaY0.js} +1 -1
- package/webapp/dist/assets/{alerts-CuPQ9YQJ.js → alerts-DeVkMXWo.js} +1 -1
- package/webapp/dist/assets/{apps-Drio028B.js → apps-9SuDvyGQ.js} +1 -1
- package/webapp/dist/assets/{audit-npSFJECe.js → audit-DT8cY7Ys.js} +1 -1
- package/webapp/dist/assets/backend-status.store-BbBE9cn8.js +4 -0
- package/webapp/dist/assets/{card-DkH32gMY.js → card-DaUEmUI5.js} +1 -1
- package/webapp/dist/assets/{chart-BpGXlCJc.js → chart-BKXP2ter.js} +1 -1
- package/webapp/dist/assets/{client-DFnuv2z3.js → client-CgyTwq9g.js} +1 -1
- package/webapp/dist/assets/{code-editor-DK6Tmmxv.js → code-editor-JVuQ4m-z.js} +1 -1
- package/webapp/dist/assets/{comparison-bars-BtC0dHjF.js → comparison-bars-Ds5Dt1oj.js} +1 -1
- package/webapp/dist/assets/{confirm-dialog-BbGsAz7_.js → confirm-dialog-BayExVbF.js} +1 -1
- package/webapp/dist/assets/{console-keyboard-D3YCA0yU.js → console-keyboard-uSLt92dB.js} +1 -1
- package/webapp/dist/assets/{containers-Bl8gAyZX.js → containers-DkXTgcrY.js} +1 -1
- package/webapp/dist/assets/{controls-C5W8gHU4.js → controls-CqeGPnaF.js} +1 -1
- package/webapp/dist/assets/{dashboard-UHlet3H9.js → dashboard-By5yPuOf.js} +1 -1
- package/webapp/dist/assets/{dashboard-builder-67PZFqhE.js → dashboard-builder-C0hvBwkd.js} +1 -1
- package/webapp/dist/assets/deploy-progress-B39cvvCE.js +1 -0
- package/webapp/dist/assets/deploy-release-dialog-CnzaO_xL.js +1 -0
- package/webapp/dist/assets/deployments-BXP943hA.js +1 -0
- package/webapp/dist/assets/{detail-B4TiBfxU.js → detail-B84RgiOb.js} +1 -1
- package/webapp/dist/assets/{detail-CYS81K6Y.js → detail-CVXDks9-.js} +1 -1
- package/webapp/dist/assets/detail-D9DixtaK.js +2 -0
- package/webapp/dist/assets/{empty-content-7jOFhG4C.js → empty-content-eyDOuOVp.js} +1 -1
- package/webapp/dist/assets/{error-boundary-CLLI8PWw.js → error-boundary-CQmDr_HS.js} +1 -1
- package/webapp/dist/assets/{event-fields-CiyqrRO8.js → event-fields-C7p2a2HY.js} +1 -1
- package/webapp/dist/assets/{files-DigwXndm.js → files-BsfGT3t6.js} +2 -2
- package/webapp/dist/assets/{icons-OboZgWSt.js → icons-B9Ct8PJ9.js} +1 -1
- package/webapp/dist/assets/index-BEfv96EF.js +1 -0
- package/webapp/dist/assets/{label-B1SF0RTL.js → label-avMhe08g.js} +1 -1
- package/webapp/dist/assets/{log-level-filter-Bcn31D1F.js → log-level-filter-oaUGdbpk.js} +1 -1
- package/webapp/dist/assets/{logs-BqHOufk8.js → logs-iC1OEDv3.js} +1 -1
- package/webapp/dist/assets/{metric-chart-M-kI-XOt.js → metric-chart-CSa_qv4F.js} +1 -1
- package/webapp/dist/assets/{metrics-QIQaF7iS.js → metrics-CKCmcGKw.js} +1 -1
- package/webapp/dist/assets/{mui-Cd711nOk.js → mui-B3fJdIMc.js} +1 -1
- package/webapp/dist/assets/{mui-CdB_p2lt.js → mui-Bdr6Ks5j.js} +1 -1
- package/webapp/dist/assets/{mui-BIz4LSVs.js → mui-CADnFGCx.js} +1 -1
- package/webapp/dist/assets/{mui-AnEgAVjz.js → mui-CMWGTMXv.js} +1 -1
- package/webapp/dist/assets/{mui-DyT2n1lx.js → mui-CN3dT7bb.js} +1 -1
- package/webapp/dist/assets/{mui-BwsIrivo.js → mui-CPEkFAPo.js} +1 -1
- package/webapp/dist/assets/{mui-B1jrje6Z.js → mui-D3qAWvfZ.js} +1 -1
- package/webapp/dist/assets/{mui-C_hromOc.js → mui-D7tBU80e.js} +1 -1
- package/webapp/dist/assets/{mui-y44PQOfG.js → mui-DaJavAoc.js} +1 -1
- package/webapp/dist/assets/{mui-BXSXx9c9.js → mui-SNRRJ_vi.js} +1 -1
- package/webapp/dist/assets/{nodes-BJPk02vv.js → nodes-DtLyXH0V.js} +1 -1
- package/webapp/dist/assets/{operation-status-Bm1x1wTz.js → operation-status-DHyYOT7G.js} +1 -1
- package/webapp/dist/assets/{page-breadcrumbs-fR7Jmpp4.js → page-breadcrumbs-3R8RZ3nA.js} +1 -1
- package/webapp/dist/assets/pipelines-Do2NAAqK.js +3 -0
- package/webapp/dist/assets/project.store-D5IR3fo9.js +1 -0
- package/webapp/dist/assets/{projects-YoBzcQ24.js → projects-BqlGbzeG.js} +1 -1
- package/webapp/dist/assets/{realtime.store-CBDO4Abj.js → realtime.store-C8D235-B.js} +1 -1
- package/webapp/dist/assets/release-bits-IehuBssK.js +1 -0
- package/webapp/dist/assets/release-build-panel-C48hP_9w.js +1 -0
- package/webapp/dist/assets/release-deployment-state-BfmxZP4Y.js +1 -0
- package/webapp/dist/assets/releases-Cm0RV5Xu.js +2 -0
- package/webapp/dist/assets/{search-input-C0MHI8vO.js → search-input-SWD1dXxD.js} +1 -1
- package/webapp/dist/assets/settings-DwuEPQGg.js +1 -0
- package/webapp/dist/assets/sign-in-CQ-WeS5A.js +1 -0
- package/webapp/dist/assets/{skeleton-BmWDJWF9.js → skeleton-BnVxAoeX.js} +1 -1
- package/webapp/dist/assets/{snackbar-DSPmjMyi.js → snackbar-CRX6eqRT.js} +1 -1
- package/webapp/dist/assets/{stack-health-status-BIv2C10x.js → stack-health-status-DfErRNb1.js} +1 -1
- package/webapp/dist/assets/{stack-start-notice-BVnMOwRQ.js → stack-start-notice-NkYDjR-f.js} +1 -1
- package/webapp/dist/assets/{stacks-IZ1mfizi.js → stacks-BOGCfW90.js} +1 -1
- package/webapp/dist/assets/{store-bqUBn2A4.js → store-DtTtbc9H.js} +1 -1
- package/webapp/dist/assets/{system-info-BFKNM-hf.js → system-info-Cw-xywgI.js} +1 -1
- package/webapp/dist/assets/{table-BOWT6Y9d.js → table-D-so_B1p.js} +1 -1
- package/webapp/dist/assets/{table-viewport-Bp4pq-c_.js → table-viewport-DdZ1yAKm.js} +1 -1
- package/webapp/dist/assets/{tabs-k5NPGLnJ.js → tabs-DGqBkXh_.js} +1 -1
- package/webapp/dist/assets/{terminal-QWBau-Us.js → terminal-Bbl0XNeB.js} +1 -1
- package/webapp/dist/assets/{topology-CPey5dP6.js → topology-DmrRy7nN.js} +1 -1
- package/webapp/dist/assets/{topology-metadata-dialog-BivuU2y6.js → topology-metadata-dialog-Dpfp4YF1.js} +1 -1
- package/webapp/dist/assets/{traces-By0rdfDC.js → traces-CKHsOabJ.js} +1 -1
- package/webapp/dist/assets/{use-stack-context-UkBsF-l7.js → use-stack-context-BuraYaeY.js} +1 -1
- package/webapp/dist/assets/webapp-D8h_eabt.js +35 -0
- package/webapp/dist/console-version.json +1 -1
- package/webapp/dist/index.html +34 -34
- package/webapp/dist/logo.svg +1 -80
- package/bin/sdk.d.mts +0 -8
- package/bin/sdk.mjs +0 -576
- package/dist/monitoring/process-lifetime.d.ts +0 -11
- package/dist/monitoring/process-lifetime.d.ts.map +0 -1
- package/dist/monitoring/process-lifetime.js +0 -45
- package/dist/monitoring/process-lifetime.js.map +0 -1
- package/dist/shared/host-boot-identity.d.ts +0 -12
- package/dist/shared/host-boot-identity.d.ts.map +0 -1
- package/dist/shared/host-boot-identity.js +0 -89
- package/dist/shared/host-boot-identity.js.map +0 -1
- package/webapp/dist/assets/deploy-release-dialog-BOXcD5Wo.js +0 -1
- package/webapp/dist/assets/deployments-qV20Ak0P.js +0 -1
- package/webapp/dist/assets/detail-B85-Wees.js +0 -2
- package/webapp/dist/assets/index-uq8Dkk4c.js +0 -1
- package/webapp/dist/assets/omnitron-logo-koMCbsCv.js +0 -1
- package/webapp/dist/assets/pipelines-T6Ch9LTw.js +0 -3
- package/webapp/dist/assets/project.store--G5pIF-J.js +0 -1
- package/webapp/dist/assets/release-bits-B2a_wbft.js +0 -1
- package/webapp/dist/assets/release-build-panel-BQmIdKW9.js +0 -1
- package/webapp/dist/assets/release-deployment-state-DRrEI2pP.js +0 -1
- package/webapp/dist/assets/release-wire-f2VuBoBF.js +0 -1
- package/webapp/dist/assets/releases-Bp3CDgmo.js +0 -2
- package/webapp/dist/assets/settings-B3egRvbI.js +0 -1
- package/webapp/dist/assets/sign-in-9q-Nfy83.js +0 -1
- package/webapp/dist/assets/webapp-D-UhjFhS.js +0 -35
- package/webapp/dist/favicon.png +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { configuredStartEntry, effectiveAppName, ensureNamespacedEntry, registeredAppName } from './app-name.js';
|
|
1
2
|
import { Errors } from '@omnitron-dev/titan/errors';
|
|
2
3
|
import { OWNER_CAPABILITIES } from '../daemon/execution-capabilities.js';
|
|
3
4
|
import { parsePoolScaleRequest, assertPoolScaleTarget } from '../shared/pool-scale.js';
|
|
@@ -34,6 +35,7 @@ import { stackExecutionKey, executionScopeKey, executionScopeOwns } from '../sha
|
|
|
34
35
|
* → Two Netron instances: PM management plane + app HTTP data plane
|
|
35
36
|
*/
|
|
36
37
|
import { ReadinessMonitor } from '../health/readiness.js';
|
|
38
|
+
import { FileWatcher } from './file-watcher.js';
|
|
37
39
|
import fs from 'node:fs';
|
|
38
40
|
import { readDeclaredConfig, withDeclaredConfig } from '../project/declared-config.js';
|
|
39
41
|
import path from 'node:path';
|
|
@@ -116,46 +118,7 @@ function mapStrategy(strategy) {
|
|
|
116
118
|
return SupervisionStrategy.ONE_FOR_ONE;
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
|
-
|
|
120
|
-
* Strip the `${project}/${stack}/` prefix from a handle key (or
|
|
121
|
-
* leave a bare name untouched). Used to identify "the same physical
|
|
122
|
-
* app under any registration form" so duplicate registrations from
|
|
123
|
-
* stack mode + bare-name RPC paths can be deduplicated.
|
|
124
|
-
*
|
|
125
|
-
* Examples:
|
|
126
|
-
* effectiveAppName('omni/dev/payments') === 'payments'
|
|
127
|
-
* effectiveAppName('payments') === 'payments'
|
|
128
|
-
* effectiveAppName('a/b/c/payments') === 'payments' (last segment)
|
|
129
|
-
*/
|
|
130
|
-
export function effectiveAppName(key) {
|
|
131
|
-
const idx = key.lastIndexOf('/');
|
|
132
|
-
return idx >= 0 ? key.slice(idx + 1) : key;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Auto-promote a bare `entry.name` to canonical `${project}/${stack}/${name}`
|
|
136
|
-
* form when the env carries OMNITRON_PROJECT + OMNITRON_STACK. The stack-mode
|
|
137
|
-
* boot path (ProjectService.startStack) already prefixes the name explicitly;
|
|
138
|
-
* this helper closes every other entry point that could otherwise register a
|
|
139
|
-
* bare-name handle which then becomes invisible to the stack-prefix-based
|
|
140
|
-
* UI lookup (ProjectService.toStackInfo filters on `${project}/${stack}/`).
|
|
141
|
-
*
|
|
142
|
-
* Idempotent: if the entry already looks namespaced (or env lacks the keys),
|
|
143
|
-
* the input is returned unchanged. An entry qualified under a DIFFERENT
|
|
144
|
-
* project/stack is preserved too — that's operator intent (cross-project
|
|
145
|
-
* administrative run), not a bug.
|
|
146
|
-
*/
|
|
147
|
-
export function ensureNamespacedEntry(entry) {
|
|
148
|
-
const project = entry.env?.['OMNITRON_PROJECT'];
|
|
149
|
-
const stack = entry.env?.['OMNITRON_STACK'];
|
|
150
|
-
if (!project || !stack)
|
|
151
|
-
return entry;
|
|
152
|
-
const canonicalPrefix = `${project}/${stack}/`;
|
|
153
|
-
if (entry.name.startsWith(canonicalPrefix))
|
|
154
|
-
return entry;
|
|
155
|
-
if (entry.name.includes('/'))
|
|
156
|
-
return entry;
|
|
157
|
-
return { ...entry, name: `${canonicalPrefix}${entry.name}` };
|
|
158
|
-
}
|
|
121
|
+
export { effectiveAppName, ensureNamespacedEntry } from './app-name.js';
|
|
159
122
|
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
160
123
|
/**
|
|
161
124
|
* Startup budget for a child process that declares none of its own.
|
|
@@ -248,6 +211,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
248
211
|
devMode = false;
|
|
249
212
|
/** esbuild bundling pipeline — pre-bundles TS entry points for child processes */
|
|
250
213
|
buildService = null;
|
|
214
|
+
fileWatcher = null;
|
|
251
215
|
watchDisabled = false;
|
|
252
216
|
watchSelection = null;
|
|
253
217
|
bootstrapSources = new Map();
|
|
@@ -264,11 +228,42 @@ export class OrchestratorService extends EventEmitter {
|
|
|
264
228
|
if (!enabled || !this.handles.get(name) || !this.allowsWatch(this.handles.get(name).entry))
|
|
265
229
|
state.watchSerial = 0;
|
|
266
230
|
}
|
|
231
|
+
this.syncClassicWatches();
|
|
267
232
|
await Promise.all([...this.bootstrapSources.keys()].map((name) => this.syncBootstrapWatch(name)));
|
|
268
233
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
.
|
|
234
|
+
getWatchedApps() {
|
|
235
|
+
const registrations = [...(this.fileWatcher?.getWatchedApps() ?? []),
|
|
236
|
+
...[...this.bootstrapSources].filter(([name]) => this.buildService?.isWatching(name))
|
|
237
|
+
.map(([name, source]) => ({ name, directory: path.dirname(source.path) }))];
|
|
238
|
+
return registrations.flatMap(watch => {
|
|
239
|
+
const handle = this.handles.get(watch.name);
|
|
240
|
+
return handle ? [{ ...watch, generation: handle.generation, definitionRevision: handle.definitionRevision }] : [];
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
/** Native subscriptions follow the same owned handles and policy as esbuild. */
|
|
244
|
+
syncClassicWatches() {
|
|
245
|
+
if (!this.devMode || this.watchDisabled || this.stoppingApps || !this.config) {
|
|
246
|
+
this.fileWatcher?.stop();
|
|
247
|
+
this.fileWatcher = null;
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const apps = [...this.handles.values()].filter(handle => {
|
|
251
|
+
if (handle.entry.bootstrap || !this.allowsWatch(handle.entry) || this.executionBusy(handle.name))
|
|
252
|
+
return false;
|
|
253
|
+
if (handle.status === 'online' && !this.appStopIntents.get(handle.name)?.stopped)
|
|
254
|
+
return true;
|
|
255
|
+
// An internal restart keeps its existing source subscription and pending
|
|
256
|
+
// edits. Re-arming fs.watch on every child generation loses macOS events.
|
|
257
|
+
return !['crashed', 'errored'].includes(handle.status) &&
|
|
258
|
+
Boolean(this.restartCoalescer.get(handle.name)?.inFlight) && this.fileWatcher?.isWatching(handle.entry);
|
|
259
|
+
}).map(handle => handle.entry);
|
|
260
|
+
const config = { ...this.config, apps };
|
|
261
|
+
if (this.fileWatcher)
|
|
262
|
+
this.fileWatcher.applyConfig(config);
|
|
263
|
+
else {
|
|
264
|
+
this.fileWatcher = new FileWatcher(this.logger, this, config, this.cwd);
|
|
265
|
+
this.fileWatcher.start();
|
|
266
|
+
}
|
|
272
267
|
}
|
|
273
268
|
async syncBootstrapWatch(name) {
|
|
274
269
|
const source = this.bootstrapSources.get(name);
|
|
@@ -292,12 +287,42 @@ export class OrchestratorService extends EventEmitter {
|
|
|
292
287
|
}, this.devMode);
|
|
293
288
|
}
|
|
294
289
|
/** Automatic triggers remain revocable while queued; manual restart is independent. */
|
|
295
|
-
async restartAfterChange(name) {
|
|
290
|
+
async restartAfterChange(name, expected) {
|
|
296
291
|
const canonical = this.resolveAppName(name) ?? name;
|
|
292
|
+
if (expected && canonical !== name)
|
|
293
|
+
throw Errors.badRequest(`Source refresh requires the observed canonical application name '${canonical}'`);
|
|
297
294
|
const handle = this.handles.get(canonical);
|
|
298
|
-
if (!handle ||
|
|
299
|
-
|
|
300
|
-
|
|
295
|
+
if (expected && (!handle || handle.generation !== expected.generation || handle.definitionRevision !== expected.definitionRevision))
|
|
296
|
+
throw Errors.conflict(`Application '${canonical}' source binding changed; observe its watch status before retrying`);
|
|
297
|
+
if (!handle || !this.allowsWatch(handle.entry)) {
|
|
298
|
+
if (expected)
|
|
299
|
+
throw Errors.conflict(`Source refresh of '${canonical}' is excluded by the current watch policy`);
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
if (expected && !this.getWatchedApps().some(app => app.name === canonical &&
|
|
303
|
+
app.generation === expected.generation && app.definitionRevision === expected.definitionRevision))
|
|
304
|
+
throw Errors.conflict(`Source watcher for '${canonical}' is unavailable; SDK refresh was not started`);
|
|
305
|
+
const entry = handle.entry;
|
|
306
|
+
const definitionRevision = handle.definitionRevision;
|
|
307
|
+
const generation = handle.generation;
|
|
308
|
+
const result = await this.restartAppCoalesced(canonical, true, 'watch');
|
|
309
|
+
if (handle.definitionRevision !== definitionRevision || result.entry !== entry ||
|
|
310
|
+
result.generation === generation || result.status !== 'online') {
|
|
311
|
+
if (expected)
|
|
312
|
+
throw Errors.conflict(`Source refresh of '${canonical}' was cancelled or its source binding changed`);
|
|
313
|
+
return undefined;
|
|
314
|
+
}
|
|
315
|
+
const source = this.getWatchedApps().find(app => app.name === canonical &&
|
|
316
|
+
app.generation === result.generation && app.definitionRevision === result.definitionRevision);
|
|
317
|
+
if (expected && !source)
|
|
318
|
+
throw Errors.conflict(`Source watcher for '${canonical}' is unavailable after restart; SDK readiness is not confirmed`);
|
|
319
|
+
const process = this.getApp(canonical);
|
|
320
|
+
if (!source || !process || process.status !== 'online' || process.generation !== source.generation) {
|
|
321
|
+
if (expected)
|
|
322
|
+
throw Errors.conflict(`Source refresh of '${canonical}' has no matching online observation`);
|
|
323
|
+
return undefined;
|
|
324
|
+
}
|
|
325
|
+
return { process, source };
|
|
301
326
|
}
|
|
302
327
|
/** Cached build results per app name */
|
|
303
328
|
buildResults = new Map();
|
|
@@ -449,6 +474,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
449
474
|
*/
|
|
450
475
|
setConfig(config) {
|
|
451
476
|
this.config = config;
|
|
477
|
+
this.syncClassicWatches();
|
|
452
478
|
// Metrics polling is armed here rather than in `startAll` alone.
|
|
453
479
|
//
|
|
454
480
|
// It used to run only from `startAll`, which is the `omnitron start`
|
|
@@ -815,6 +841,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
815
841
|
throw new Error(`Cannot replace '${key}' with '${entry.name}': the previous application did not stop`, { cause: err });
|
|
816
842
|
}
|
|
817
843
|
this.handles.delete(key);
|
|
844
|
+
this.syncClassicWatches();
|
|
818
845
|
if (key !== entry.name)
|
|
819
846
|
this.metricsBridge?.evictApp(key);
|
|
820
847
|
continue;
|
|
@@ -832,6 +859,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
832
859
|
// processes still run: an errored app's other children and its pools.
|
|
833
860
|
await this.tearDownApp(h);
|
|
834
861
|
this.handles.delete(key);
|
|
862
|
+
this.syncClassicWatches();
|
|
835
863
|
// Drop any metrics that were collected under the stale alias so it
|
|
836
864
|
// doesn't haunt future snapshots as a ghost offline app.
|
|
837
865
|
if (key !== entry.name)
|
|
@@ -868,6 +896,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
868
896
|
handle.restartWindow = existing.restartWindow;
|
|
869
897
|
}
|
|
870
898
|
this.handles.set(entry.name, handle);
|
|
899
|
+
this.syncClassicWatches();
|
|
871
900
|
// Arm metrics sampling here — the one place an app enters the registry.
|
|
872
901
|
//
|
|
873
902
|
// It used to be armed only from `startAll` (the `omnitron start` path).
|
|
@@ -940,6 +969,9 @@ export class OrchestratorService extends EventEmitter {
|
|
|
940
969
|
this.scheduleRecovery(entry, handle, cfg);
|
|
941
970
|
throw failure;
|
|
942
971
|
}
|
|
972
|
+
finally {
|
|
973
|
+
this.syncClassicWatches();
|
|
974
|
+
}
|
|
943
975
|
}
|
|
944
976
|
/**
|
|
945
977
|
* Everything a handle still runs, stopped: its supervisor's children (or its
|
|
@@ -1030,8 +1062,12 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1030
1062
|
return active.promise;
|
|
1031
1063
|
this.assertExecutionIdle(scope);
|
|
1032
1064
|
// Reserve before invoking work, including its synchronous checks and first write.
|
|
1033
|
-
const promise = Promise.resolve().then(work).finally(() =>
|
|
1065
|
+
const promise = Promise.resolve().then(work).finally(() => {
|
|
1066
|
+
this.executionOperations.delete(key);
|
|
1067
|
+
this.syncClassicWatches();
|
|
1068
|
+
});
|
|
1034
1069
|
this.executionOperations.set(key, { id: operationId, fingerprint, promise });
|
|
1070
|
+
this.syncClassicWatches();
|
|
1035
1071
|
return promise;
|
|
1036
1072
|
}
|
|
1037
1073
|
/**
|
|
@@ -1106,6 +1142,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1106
1142
|
}
|
|
1107
1143
|
}
|
|
1108
1144
|
this.persistState();
|
|
1145
|
+
this.syncClassicWatches();
|
|
1109
1146
|
for (const name of retired) {
|
|
1110
1147
|
this.emit('app:retired', name);
|
|
1111
1148
|
this.metricsBridge?.evictApp(name);
|
|
@@ -1389,7 +1426,12 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1389
1426
|
}
|
|
1390
1427
|
}
|
|
1391
1428
|
async stopApp(name, force = false, timeout = 10_000) {
|
|
1429
|
+
return this.stopAppQueued(name, force, timeout);
|
|
1430
|
+
}
|
|
1431
|
+
async stopAppQueued(name, force = false, timeout = 10_000, preserveWatch = false) {
|
|
1392
1432
|
const canonical = this.resolveAppName(name) ?? name;
|
|
1433
|
+
if (!preserveWatch)
|
|
1434
|
+
this.fileWatcher?.removeApp(canonical);
|
|
1393
1435
|
// Outside the queue on purpose: the operator's intent lands the
|
|
1394
1436
|
// moment the command arrives, not whenever the queue drains.
|
|
1395
1437
|
// Unknown names need no retained intent. Start admission registers its
|
|
@@ -1426,6 +1468,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1426
1468
|
this.clearCoolDown(name);
|
|
1427
1469
|
const operation = Promise.resolve().then(() => this.stopAllOnce(force));
|
|
1428
1470
|
this.stoppingApps = operation;
|
|
1471
|
+
this.syncClassicWatches();
|
|
1429
1472
|
const settled = () => { if (this.stoppingApps === operation)
|
|
1430
1473
|
this.stoppingApps = null; };
|
|
1431
1474
|
void operation.then(settled, settled);
|
|
@@ -1520,11 +1563,13 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1520
1563
|
throw new Error('An installed stack start is active; its application entry cannot be changed');
|
|
1521
1564
|
}
|
|
1522
1565
|
handle.redefine(entry);
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1566
|
+
this.fileWatcher?.revokePending(handle.name);
|
|
1567
|
+
// A pending source event belongs to the previous definition, even when
|
|
1568
|
+
// the replacement also enables watching or restores the original path.
|
|
1569
|
+
const state = this.restartCoalescer.get(handle.name);
|
|
1570
|
+
if (state)
|
|
1571
|
+
state.watchSerial = 0;
|
|
1572
|
+
this.syncClassicWatches();
|
|
1528
1573
|
await this.syncBootstrapWatch(handle.name);
|
|
1529
1574
|
return true;
|
|
1530
1575
|
}
|
|
@@ -1565,6 +1610,10 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1565
1610
|
const canonical = this.resolveAppName(name) ?? name;
|
|
1566
1611
|
const handle = this.handles.get(canonical);
|
|
1567
1612
|
if (!handle) {
|
|
1613
|
+
// A queued source event cannot resurrect a registration removed while
|
|
1614
|
+
// awaiting a cooldown or another lifecycle operation.
|
|
1615
|
+
if (!fromExternal || cause === 'watch')
|
|
1616
|
+
throw new Error(`Application '${canonical}' was removed before restart`);
|
|
1568
1617
|
// A PROJECT-QUALIFIED name with no live handle is not this daemon's to
|
|
1569
1618
|
// start, and matching it against the daemon's own config starts the
|
|
1570
1619
|
// WRONG APP.
|
|
@@ -1584,35 +1633,14 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1584
1633
|
// this exact shape and names the command that works; this is the same
|
|
1585
1634
|
// refusal on the same reasoning, at the point where "no live handle" is
|
|
1586
1635
|
// already known.
|
|
1587
|
-
const
|
|
1588
|
-
const ownProject = this.config?.project;
|
|
1589
|
-
if (qualified && !ownProject) {
|
|
1590
|
-
const [project, stack] = name.split('/');
|
|
1591
|
-
throw new Error(`'${name}' belongs to a registered project, which this daemon restarts through its ` +
|
|
1592
|
-
`stack. Use \`omnitron stack start ${project} ${stack}\`, or restart the app by its ` +
|
|
1593
|
-
`bare name if you mean the daemon's own config.`);
|
|
1594
|
-
}
|
|
1595
|
-
// P1-F — fall through to startApp when there's no live handle but
|
|
1596
|
-
// the ecosystem config declares the app. Operators expect
|
|
1597
|
-
// `omnitron restart foo` to work even when `foo` was never started
|
|
1598
|
-
// (or was stopped, or crashed and was reaped). Previously this
|
|
1599
|
-
// threw "Unknown app", forcing the operator to first run start
|
|
1600
|
-
// explicitly.
|
|
1601
|
-
const effective = effectiveAppName(name);
|
|
1602
|
-
const entry = this.config?.apps.find((a) => a.name === name || a.name === effective || effectiveAppName(a.name) === effective);
|
|
1636
|
+
const entry = this.config && configuredStartEntry(name, this.config);
|
|
1603
1637
|
if (entry) {
|
|
1604
|
-
this.logger.info({ app: name }, '
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
// stack, because `ProjectService.toStackInfo` filters handles on the
|
|
1611
|
-
// `${project}/${stack}/` prefix.
|
|
1612
|
-
const requested = name.includes('/') && !entry.name.includes('/')
|
|
1613
|
-
? { ...entry, name }
|
|
1614
|
-
: entry;
|
|
1615
|
-
return this.startApp(requested);
|
|
1638
|
+
this.logger.info({ app: entry.name }, 'Restarting declared application with no live handle');
|
|
1639
|
+
return this.startApp(entry);
|
|
1640
|
+
}
|
|
1641
|
+
if (name.includes('/')) {
|
|
1642
|
+
const [project, stack] = name.split('/');
|
|
1643
|
+
throw new Error("Unknown app '" + name + "'. To start the registered stack use: omnitron stack start " + project + ' ' + stack);
|
|
1616
1644
|
}
|
|
1617
1645
|
throw new Error(`Unknown app: ${name}`);
|
|
1618
1646
|
}
|
|
@@ -1621,12 +1649,17 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1621
1649
|
const state = this.getCoalescerState(name);
|
|
1622
1650
|
if (fromExternal) {
|
|
1623
1651
|
state.triggerSerial += 1;
|
|
1624
|
-
if (cause === 'watch')
|
|
1652
|
+
if (cause === 'watch') {
|
|
1625
1653
|
state.watchSerial = state.triggerSerial;
|
|
1654
|
+
state.watchBinding = { handle, entry: handle.entry, definitionRevision: handle.definitionRevision };
|
|
1655
|
+
}
|
|
1626
1656
|
else
|
|
1627
1657
|
state.manualSerial = state.triggerSerial;
|
|
1628
1658
|
}
|
|
1629
|
-
if (!this.allowsWatch(handle.entry) || ['errored', 'crashed'
|
|
1659
|
+
if (!this.allowsWatch(handle.entry) || ['errored', 'crashed'].includes(handle.status) ||
|
|
1660
|
+
(!state.inFlight && ['stopped', 'stopping'].includes(handle.status)) ||
|
|
1661
|
+
!state.watchBinding || state.watchBinding.entry !== handle.entry ||
|
|
1662
|
+
state.watchBinding.handle.definitionRevision !== state.watchBinding.definitionRevision) {
|
|
1630
1663
|
state.watchSerial = 0;
|
|
1631
1664
|
}
|
|
1632
1665
|
const observedSerial = Math.max(state.manualSerial, state.watchSerial);
|
|
@@ -1728,7 +1761,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1728
1761
|
if (this.devMode && entry.bootstrap) {
|
|
1729
1762
|
clearCacheFor(path.resolve(entry.cwd ?? this.cwd, entry.bootstrap));
|
|
1730
1763
|
}
|
|
1731
|
-
const stopped = this.
|
|
1764
|
+
const stopped = this.stopAppQueued(name, false, 10_000, true);
|
|
1732
1765
|
const intent = this.appStopIntents.get(name);
|
|
1733
1766
|
const generation = this.stopGeneration;
|
|
1734
1767
|
await stopped;
|
|
@@ -1743,7 +1776,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1743
1776
|
getCoalescerState(name) {
|
|
1744
1777
|
let state = this.restartCoalescer.get(name);
|
|
1745
1778
|
if (!state) {
|
|
1746
|
-
state = { inFlight: null, triggerSerial: 0, firedSerial: 0, manualSerial: 0, watchSerial: 0, cooldownUntil: 0 };
|
|
1779
|
+
state = { inFlight: null, triggerSerial: 0, firedSerial: 0, manualSerial: 0, watchSerial: 0, watchBinding: null, cooldownUntil: 0 };
|
|
1747
1780
|
this.restartCoalescer.set(name, state);
|
|
1748
1781
|
}
|
|
1749
1782
|
return state;
|
|
@@ -1778,29 +1811,9 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1778
1811
|
resolveAppName(rawName) {
|
|
1779
1812
|
if (this.handles.has(rawName))
|
|
1780
1813
|
return rawName;
|
|
1781
|
-
// A qualified name is an ADDRESS, and the only handle that satisfies it
|
|
1782
|
-
// is the one with that address. Falling through to the short-name match
|
|
1783
|
-
// answered a question about one deployment with another's data:
|
|
1784
|
-
//
|
|
1785
|
-
// omnitron logs sample/deployed/main → sample/dev/main
|
|
1786
|
-
//
|
|
1787
|
-
// — the node's app asked for, this laptop's app printed, with nothing
|
|
1788
|
-
// said. `startApp` already refuses this for the same reason ("a
|
|
1789
|
-
// PROJECT-QUALIFIED name with no live handle is not this daemon's to
|
|
1790
|
-
// start"); the resolver every other caller goes through did not.
|
|
1791
1814
|
if (rawName.includes('/'))
|
|
1792
1815
|
return undefined;
|
|
1793
|
-
|
|
1794
|
-
const matches = [];
|
|
1795
|
-
for (const key of this.handles.keys()) {
|
|
1796
|
-
if (effectiveAppName(key) === effective)
|
|
1797
|
-
matches.push(key);
|
|
1798
|
-
}
|
|
1799
|
-
if (matches.length === 0)
|
|
1800
|
-
return undefined;
|
|
1801
|
-
if (matches.length === 1)
|
|
1802
|
-
return matches[0];
|
|
1803
|
-
throw new Error(`App name '${rawName}' is ambiguous — multiple matches: ${matches.join(', ')}. Use the full canonical name.`);
|
|
1816
|
+
return registeredAppName(rawName, this.handles.keys());
|
|
1804
1817
|
}
|
|
1805
1818
|
/**
|
|
1806
1819
|
* Reload app with zero-downtime strategy:
|
|
@@ -2213,6 +2226,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
2213
2226
|
this.scheduleRecovery(entry, handle, config);
|
|
2214
2227
|
}
|
|
2215
2228
|
this.persistState();
|
|
2229
|
+
this.syncClassicWatches();
|
|
2216
2230
|
});
|
|
2217
2231
|
return launch;
|
|
2218
2232
|
}
|
|
@@ -2237,7 +2251,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
2237
2251
|
let topology;
|
|
2238
2252
|
let definition;
|
|
2239
2253
|
try {
|
|
2240
|
-
const captured = await readBootstrapMetadata(bootstrapAbsPath, this.devMode && !entry.releaseRoot, 60_000);
|
|
2254
|
+
const captured = await readBootstrapMetadata(bootstrapAbsPath, this.devMode && !entry.releaseRoot, 60_000, entry.releaseRoot);
|
|
2241
2255
|
definition = captured.definition;
|
|
2242
2256
|
handle.bootstrapMetadata = captured.metadata;
|
|
2243
2257
|
topology = definition.processes;
|
|
@@ -2330,6 +2344,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
2330
2344
|
return launch;
|
|
2331
2345
|
}
|
|
2332
2346
|
async discardSourceBuild(name) {
|
|
2347
|
+
this.fileWatcher?.removeApp(name);
|
|
2333
2348
|
const state = this.restartCoalescer.get(name);
|
|
2334
2349
|
if (state)
|
|
2335
2350
|
state.watchSerial = 0;
|
|
@@ -2389,7 +2404,8 @@ export class OrchestratorService extends EventEmitter {
|
|
|
2389
2404
|
// application generation. Resolve before allocating topology resources.
|
|
2390
2405
|
const runtime = await this.bootstrapRuntime(bootstrapAbsPath);
|
|
2391
2406
|
const policy = buildRestartPolicy(entry, config);
|
|
2392
|
-
const spawnEnv = withClosureLibraryPath(entry.env,
|
|
2407
|
+
const spawnEnv = withClosureLibraryPath(entry.env, entry.releaseRoot
|
|
2408
|
+
? { verifiedRoot: entry.releaseRoot } : [entry.cwd, bootstrapAbsPath]);
|
|
2393
2409
|
const needsRouting = topology.some(proc => proc.topology?.expose === true || proc.topology?.access?.length);
|
|
2394
2410
|
handle.deferStartup();
|
|
2395
2411
|
if (needsRouting) {
|
|
@@ -2631,7 +2647,8 @@ export class OrchestratorService extends EventEmitter {
|
|
|
2631
2647
|
async launchSingleProcess(entry, handle, config, bootstrapAbsPath, buildResult) {
|
|
2632
2648
|
const instances = entry.instances ?? 1;
|
|
2633
2649
|
const policy = buildRestartPolicy(entry, config);
|
|
2634
|
-
const spawnEnv = withClosureLibraryPath(entry.env,
|
|
2650
|
+
const spawnEnv = withClosureLibraryPath(entry.env, entry.releaseRoot
|
|
2651
|
+
? { verifiedRoot: entry.releaseRoot } : [entry.cwd, bootstrapAbsPath]);
|
|
2635
2652
|
// For single-process apps, use the first (only) process entry's bundled module
|
|
2636
2653
|
const firstProcessName = buildResult?.modulePaths.keys().next().value;
|
|
2637
2654
|
const bundledModulePath = firstProcessName
|
|
@@ -2751,6 +2768,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
2751
2768
|
handle.clearLastExit();
|
|
2752
2769
|
this.startPostOnlineCooldown(name);
|
|
2753
2770
|
this.persistState();
|
|
2771
|
+
this.syncClassicWatches();
|
|
2754
2772
|
this.emit('app:online', name);
|
|
2755
2773
|
}
|
|
2756
2774
|
/**
|