@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.
Files changed (358) hide show
  1. package/README.md +296 -6
  2. package/bin/{pnpmfile-sdk.mjs → pnpmfile-sdk.js} +19 -1
  3. package/bin/sdk.d.ts +19 -0
  4. package/bin/sdk.js +932 -0
  5. package/dist/BUILD.json +2 -2
  6. package/dist/cli/omnitron.js +68 -20
  7. package/dist/cli/omnitron.js.map +1 -1
  8. package/dist/commands/infra.d.ts +8 -2
  9. package/dist/commands/infra.d.ts.map +1 -1
  10. package/dist/commands/infra.js +52 -59
  11. package/dist/commands/infra.js.map +1 -1
  12. package/dist/commands/node.d.ts.map +1 -1
  13. package/dist/commands/node.js +8 -1
  14. package/dist/commands/node.js.map +1 -1
  15. package/dist/commands/release-store.d.ts.map +1 -1
  16. package/dist/commands/release-store.js +6 -9
  17. package/dist/commands/release-store.js.map +1 -1
  18. package/dist/commands/release.d.ts +4 -1
  19. package/dist/commands/release.d.ts.map +1 -1
  20. package/dist/commands/release.js +125 -5
  21. package/dist/commands/release.js.map +1 -1
  22. package/dist/commands/stack.d.ts +3 -6
  23. package/dist/commands/stack.d.ts.map +1 -1
  24. package/dist/commands/stack.js +51 -9
  25. package/dist/commands/stack.js.map +1 -1
  26. package/dist/commands/status.d.ts.map +1 -1
  27. package/dist/commands/status.js +1 -0
  28. package/dist/commands/status.js.map +1 -1
  29. package/dist/config/saved.d.ts +3 -0
  30. package/dist/config/saved.d.ts.map +1 -1
  31. package/dist/config/saved.js +1 -0
  32. package/dist/config/saved.js.map +1 -1
  33. package/dist/config/types.d.ts +4 -0
  34. package/dist/config/types.d.ts.map +1 -1
  35. package/dist/daemon/daemon-client.d.ts +3 -15
  36. package/dist/daemon/daemon-client.d.ts.map +1 -1
  37. package/dist/daemon/daemon-client.js +4 -0
  38. package/dist/daemon/daemon-client.js.map +1 -1
  39. package/dist/daemon/daemon.d.ts +5 -11
  40. package/dist/daemon/daemon.d.ts.map +1 -1
  41. package/dist/daemon/daemon.js +58 -48
  42. package/dist/daemon/daemon.js.map +1 -1
  43. package/dist/daemon/daemon.rpc-service.d.ts +3 -41
  44. package/dist/daemon/daemon.rpc-service.d.ts.map +1 -1
  45. package/dist/daemon/daemon.rpc-service.js +50 -117
  46. package/dist/daemon/daemon.rpc-service.js.map +1 -1
  47. package/dist/daemon/darwin-owner-evidence.js +1 -1
  48. package/dist/daemon/darwin-owner-evidence.js.map +1 -1
  49. package/dist/daemon/execution-capabilities.d.ts +1 -1
  50. package/dist/daemon/execution-capabilities.d.ts.map +1 -1
  51. package/dist/daemon/execution-capabilities.js +3 -3
  52. package/dist/daemon/execution-capabilities.js.map +1 -1
  53. package/dist/daemon/execution-client.d.ts +5 -1
  54. package/dist/daemon/execution-client.d.ts.map +1 -1
  55. package/dist/daemon/execution-client.js +45 -19
  56. package/dist/daemon/execution-client.js.map +1 -1
  57. package/dist/daemon/execution-host.d.ts +4 -11
  58. package/dist/daemon/execution-host.d.ts.map +1 -1
  59. package/dist/daemon/execution-host.js +3 -9
  60. package/dist/daemon/execution-host.js.map +1 -1
  61. package/dist/daemon/execution-owner.d.ts.map +1 -1
  62. package/dist/daemon/execution-owner.js +2 -16
  63. package/dist/daemon/execution-owner.js.map +1 -1
  64. package/dist/daemon/execution-shutdown.d.ts +1 -1
  65. package/dist/daemon/execution-shutdown.d.ts.map +1 -1
  66. package/dist/daemon/managed-owner-build.d.ts +4 -0
  67. package/dist/daemon/managed-owner-build.d.ts.map +1 -1
  68. package/dist/daemon/managed-owner-build.js +14 -2
  69. package/dist/daemon/managed-owner-build.js.map +1 -1
  70. package/dist/daemon/managed-runtime.js +1 -1
  71. package/dist/daemon/managed-runtime.js.map +1 -1
  72. package/dist/daemon/owner-reconciliation.d.ts.map +1 -1
  73. package/dist/daemon/owner-reconciliation.js +1 -2
  74. package/dist/daemon/owner-reconciliation.js.map +1 -1
  75. package/dist/daemon/startup-config.d.ts +1 -0
  76. package/dist/daemon/startup-config.d.ts.map +1 -1
  77. package/dist/daemon/system-guardian-cgroup.js +1 -1
  78. package/dist/daemon/system-guardian-cgroup.js.map +1 -1
  79. package/dist/infrastructure/container-runtime.d.ts +8 -0
  80. package/dist/infrastructure/container-runtime.d.ts.map +1 -1
  81. package/dist/infrastructure/container-runtime.js +5 -0
  82. package/dist/infrastructure/container-runtime.js.map +1 -1
  83. package/dist/infrastructure/existing-containers.d.ts +25 -0
  84. package/dist/infrastructure/existing-containers.d.ts.map +1 -0
  85. package/dist/infrastructure/existing-containers.js +183 -0
  86. package/dist/infrastructure/existing-containers.js.map +1 -0
  87. package/dist/infrastructure/infrastructure.service.d.ts +19 -1
  88. package/dist/infrastructure/infrastructure.service.d.ts.map +1 -1
  89. package/dist/infrastructure/infrastructure.service.js +136 -17
  90. package/dist/infrastructure/infrastructure.service.js.map +1 -1
  91. package/dist/infrastructure/presets/postgres.js +1 -1
  92. package/dist/infrastructure/presets/postgres.js.map +1 -1
  93. package/dist/infrastructure/presets/registry.d.ts.map +1 -1
  94. package/dist/infrastructure/presets/registry.js +11 -19
  95. package/dist/infrastructure/presets/registry.js.map +1 -1
  96. package/dist/infrastructure/stack-infra-manager.d.ts +11 -1
  97. package/dist/infrastructure/stack-infra-manager.d.ts.map +1 -1
  98. package/dist/infrastructure/stack-infra-manager.js +79 -8
  99. package/dist/infrastructure/stack-infra-manager.js.map +1 -1
  100. package/dist/mcp/tool-groups/infra.tools.d.ts.map +1 -1
  101. package/dist/mcp/tool-groups/infra.tools.js +4 -1
  102. package/dist/mcp/tool-groups/infra.tools.js.map +1 -1
  103. package/dist/monitoring/log-journal.d.ts.map +1 -1
  104. package/dist/monitoring/log-journal.js +1 -2
  105. package/dist/monitoring/log-journal.js.map +1 -1
  106. package/dist/operations.d.ts +1 -0
  107. package/dist/operations.d.ts.map +1 -1
  108. package/dist/operations.js +1 -0
  109. package/dist/operations.js.map +1 -1
  110. package/dist/orchestrator/app-name.d.ts +33 -0
  111. package/dist/orchestrator/app-name.d.ts.map +1 -0
  112. package/dist/orchestrator/app-name.js +68 -0
  113. package/dist/orchestrator/app-name.js.map +1 -0
  114. package/dist/orchestrator/bootstrap-loader.d.ts +2 -0
  115. package/dist/orchestrator/bootstrap-loader.d.ts.map +1 -1
  116. package/dist/orchestrator/bootstrap-loader.js +2 -1
  117. package/dist/orchestrator/bootstrap-loader.js.map +1 -1
  118. package/dist/orchestrator/classic-launcher.d.ts.map +1 -1
  119. package/dist/orchestrator/classic-launcher.js +2 -1
  120. package/dist/orchestrator/classic-launcher.js.map +1 -1
  121. package/dist/orchestrator/execution-contract.d.ts +2 -3
  122. package/dist/orchestrator/execution-contract.d.ts.map +1 -1
  123. package/dist/orchestrator/file-watcher.d.ts +11 -23
  124. package/dist/orchestrator/file-watcher.d.ts.map +1 -1
  125. package/dist/orchestrator/file-watcher.js +57 -42
  126. package/dist/orchestrator/file-watcher.js.map +1 -1
  127. package/dist/orchestrator/orchestrator.service.d.ts +11 -31
  128. package/dist/orchestrator/orchestrator.service.d.ts.map +1 -1
  129. package/dist/orchestrator/orchestrator.service.js +127 -109
  130. package/dist/orchestrator/orchestrator.service.js.map +1 -1
  131. package/dist/project/bootstrap-metadata.d.ts +1 -1
  132. package/dist/project/bootstrap-metadata.d.ts.map +1 -1
  133. package/dist/project/bootstrap-metadata.js +3 -2
  134. package/dist/project/bootstrap-metadata.js.map +1 -1
  135. package/dist/project/node-stack-stop.d.ts +2 -1
  136. package/dist/project/node-stack-stop.d.ts.map +1 -1
  137. package/dist/project/node-stack-stop.js +5 -1
  138. package/dist/project/node-stack-stop.js.map +1 -1
  139. package/dist/project/stack-diagnosis.d.ts.map +1 -1
  140. package/dist/project/stack-diagnosis.js +2 -3
  141. package/dist/project/stack-diagnosis.js.map +1 -1
  142. package/dist/release/artifact-store.d.ts +42 -7
  143. package/dist/release/artifact-store.d.ts.map +1 -1
  144. package/dist/release/artifact-store.js +176 -62
  145. package/dist/release/artifact-store.js.map +1 -1
  146. package/dist/release/closure-library-path.d.ts +8 -2
  147. package/dist/release/closure-library-path.d.ts.map +1 -1
  148. package/dist/release/closure-library-path.js +72 -28
  149. package/dist/release/closure-library-path.js.map +1 -1
  150. package/dist/release/configured-store.d.ts +6 -0
  151. package/dist/release/configured-store.d.ts.map +1 -0
  152. package/dist/release/configured-store.js +54 -0
  153. package/dist/release/configured-store.js.map +1 -0
  154. package/dist/release/load.d.ts +3 -0
  155. package/dist/release/load.d.ts.map +1 -1
  156. package/dist/release/load.js +8 -2
  157. package/dist/release/load.js.map +1 -1
  158. package/dist/release/local-installation.d.ts +2 -0
  159. package/dist/release/local-installation.d.ts.map +1 -1
  160. package/dist/release/local-installation.js +1 -1
  161. package/dist/release/local-installation.js.map +1 -1
  162. package/dist/release/portable-archive.d.ts +3 -0
  163. package/dist/release/portable-archive.d.ts.map +1 -1
  164. package/dist/release/portable-archive.js +13 -7
  165. package/dist/release/portable-archive.js.map +1 -1
  166. package/dist/release/registry-framework.d.ts +25 -0
  167. package/dist/release/registry-framework.d.ts.map +1 -1
  168. package/dist/release/registry-framework.js +51 -3
  169. package/dist/release/registry-framework.js.map +1 -1
  170. package/dist/release/target-runtime.d.ts +4 -0
  171. package/dist/release/target-runtime.d.ts.map +1 -1
  172. package/dist/release/target-runtime.js +9 -0
  173. package/dist/release/target-runtime.js.map +1 -1
  174. package/dist/services/host-upgrade.d.ts +2 -0
  175. package/dist/services/host-upgrade.d.ts.map +1 -1
  176. package/dist/services/host-upgrade.js +6 -2
  177. package/dist/services/host-upgrade.js.map +1 -1
  178. package/dist/services/infrastructure.rpc-service.d.ts +14 -2
  179. package/dist/services/infrastructure.rpc-service.d.ts.map +1 -1
  180. package/dist/services/infrastructure.rpc-service.js +128 -17
  181. package/dist/services/infrastructure.rpc-service.js.map +1 -1
  182. package/dist/services/kernel-rollout.service.d.ts.map +1 -1
  183. package/dist/services/kernel-rollout.service.js +1 -2
  184. package/dist/services/kernel-rollout.service.js.map +1 -1
  185. package/dist/services/migration-process.d.ts +1 -0
  186. package/dist/services/migration-process.d.ts.map +1 -1
  187. package/dist/services/migration-process.js +4 -2
  188. package/dist/services/migration-process.js.map +1 -1
  189. package/dist/services/node-deploy-lease.d.ts +4 -1
  190. package/dist/services/node-deploy-lease.d.ts.map +1 -1
  191. package/dist/services/node-deploy-lease.js +29 -4
  192. package/dist/services/node-deploy-lease.js.map +1 -1
  193. package/dist/services/node-manager.service.d.ts +5 -25
  194. package/dist/services/node-manager.service.d.ts.map +1 -1
  195. package/dist/services/node-manager.service.js +150 -139
  196. package/dist/services/node-manager.service.js.map +1 -1
  197. package/dist/services/pipeline-definition.d.ts.map +1 -1
  198. package/dist/services/pipeline-definition.js +32 -6
  199. package/dist/services/pipeline-definition.js.map +1 -1
  200. package/dist/services/pipeline.service.d.ts +7 -1
  201. package/dist/services/pipeline.service.d.ts.map +1 -1
  202. package/dist/services/pipeline.service.js +106 -13
  203. package/dist/services/pipeline.service.js.map +1 -1
  204. package/dist/services/project.rpc-service.d.ts +6 -5
  205. package/dist/services/project.rpc-service.d.ts.map +1 -1
  206. package/dist/services/project.rpc-service.js +13 -0
  207. package/dist/services/project.rpc-service.js.map +1 -1
  208. package/dist/services/project.service.d.ts +30 -6
  209. package/dist/services/project.service.d.ts.map +1 -1
  210. package/dist/services/project.service.js +414 -66
  211. package/dist/services/project.service.js.map +1 -1
  212. package/dist/services/release.rpc-service.d.ts +2 -1
  213. package/dist/services/release.rpc-service.d.ts.map +1 -1
  214. package/dist/services/release.rpc-service.js +19 -3
  215. package/dist/services/release.rpc-service.js.map +1 -1
  216. package/dist/services/release.service.d.ts +24 -11
  217. package/dist/services/release.service.d.ts.map +1 -1
  218. package/dist/services/release.service.js +162 -39
  219. package/dist/services/release.service.js.map +1 -1
  220. package/dist/services/remote-deployer.service.d.ts +1 -1
  221. package/dist/services/remote-deployer.service.d.ts.map +1 -1
  222. package/dist/services/remote-deployer.service.js +3 -0
  223. package/dist/services/remote-deployer.service.js.map +1 -1
  224. package/dist/services/secrets.service.d.ts +6 -0
  225. package/dist/services/secrets.service.d.ts.map +1 -1
  226. package/dist/services/secrets.service.js +95 -51
  227. package/dist/services/secrets.service.js.map +1 -1
  228. package/dist/shared/dto/backend.d.ts +3 -0
  229. package/dist/shared/dto/backend.d.ts.map +1 -1
  230. package/dist/shared/dto/backend.js.map +1 -1
  231. package/dist/shared/dto/nodes.d.ts +2 -0
  232. package/dist/shared/dto/nodes.d.ts.map +1 -1
  233. package/dist/shared/dto/pipelines.d.ts +54 -5
  234. package/dist/shared/dto/pipelines.d.ts.map +1 -1
  235. package/dist/shared/dto/pipelines.js +0 -7
  236. package/dist/shared/dto/pipelines.js.map +1 -1
  237. package/dist/shared/dto/project.d.ts +61 -1
  238. package/dist/shared/dto/project.d.ts.map +1 -1
  239. package/dist/shared/dto/releases.d.ts +8 -1
  240. package/dist/shared/dto/releases.d.ts.map +1 -1
  241. package/dist/shared/dto/services.d.ts +44 -18
  242. package/dist/shared/dto/services.d.ts.map +1 -1
  243. package/dist/shared/dto/services.js.map +1 -1
  244. package/dist/shared/release-reading.d.ts +6 -0
  245. package/dist/shared/release-reading.d.ts.map +1 -1
  246. package/dist/shared/release-reading.js +42 -0
  247. package/dist/shared/release-reading.js.map +1 -1
  248. package/dist/workers/system-worker-manager.d.ts +1 -2
  249. package/dist/workers/system-worker-manager.d.ts.map +1 -1
  250. package/dist/workers/system-worker-manager.js +5 -3
  251. package/dist/workers/system-worker-manager.js.map +1 -1
  252. package/package.json +20 -19
  253. package/webapp/dist/BUILD.json +2 -2
  254. package/webapp/dist/assets/{access-jWkHxGc7.js → access-B2gXuoMG.js} +1 -1
  255. package/webapp/dist/assets/{access-48hkC2-P.js → access-I0f72P9m.js} +1 -1
  256. package/webapp/dist/assets/{admin-data-table-BKSDI8sU.js → admin-data-table-CAEL2f-m.js} +1 -1
  257. package/webapp/dist/assets/{alert-uBG6r9NW.js → alert-BdJ2uaY0.js} +1 -1
  258. package/webapp/dist/assets/{alerts-CuPQ9YQJ.js → alerts-DeVkMXWo.js} +1 -1
  259. package/webapp/dist/assets/{apps-Drio028B.js → apps-9SuDvyGQ.js} +1 -1
  260. package/webapp/dist/assets/{audit-npSFJECe.js → audit-DT8cY7Ys.js} +1 -1
  261. package/webapp/dist/assets/backend-status.store-BbBE9cn8.js +4 -0
  262. package/webapp/dist/assets/{card-DkH32gMY.js → card-DaUEmUI5.js} +1 -1
  263. package/webapp/dist/assets/{chart-BpGXlCJc.js → chart-BKXP2ter.js} +1 -1
  264. package/webapp/dist/assets/{client-DFnuv2z3.js → client-CgyTwq9g.js} +1 -1
  265. package/webapp/dist/assets/{code-editor-DK6Tmmxv.js → code-editor-JVuQ4m-z.js} +1 -1
  266. package/webapp/dist/assets/{comparison-bars-BtC0dHjF.js → comparison-bars-Ds5Dt1oj.js} +1 -1
  267. package/webapp/dist/assets/{confirm-dialog-BbGsAz7_.js → confirm-dialog-BayExVbF.js} +1 -1
  268. package/webapp/dist/assets/{console-keyboard-D3YCA0yU.js → console-keyboard-uSLt92dB.js} +1 -1
  269. package/webapp/dist/assets/{containers-Bl8gAyZX.js → containers-DkXTgcrY.js} +1 -1
  270. package/webapp/dist/assets/{controls-C5W8gHU4.js → controls-CqeGPnaF.js} +1 -1
  271. package/webapp/dist/assets/{dashboard-UHlet3H9.js → dashboard-By5yPuOf.js} +1 -1
  272. package/webapp/dist/assets/{dashboard-builder-67PZFqhE.js → dashboard-builder-C0hvBwkd.js} +1 -1
  273. package/webapp/dist/assets/deploy-progress-B39cvvCE.js +1 -0
  274. package/webapp/dist/assets/deploy-release-dialog-CnzaO_xL.js +1 -0
  275. package/webapp/dist/assets/deployments-BXP943hA.js +1 -0
  276. package/webapp/dist/assets/{detail-B4TiBfxU.js → detail-B84RgiOb.js} +1 -1
  277. package/webapp/dist/assets/{detail-CYS81K6Y.js → detail-CVXDks9-.js} +1 -1
  278. package/webapp/dist/assets/detail-D9DixtaK.js +2 -0
  279. package/webapp/dist/assets/{empty-content-7jOFhG4C.js → empty-content-eyDOuOVp.js} +1 -1
  280. package/webapp/dist/assets/{error-boundary-CLLI8PWw.js → error-boundary-CQmDr_HS.js} +1 -1
  281. package/webapp/dist/assets/{event-fields-CiyqrRO8.js → event-fields-C7p2a2HY.js} +1 -1
  282. package/webapp/dist/assets/{files-DigwXndm.js → files-BsfGT3t6.js} +2 -2
  283. package/webapp/dist/assets/{icons-OboZgWSt.js → icons-B9Ct8PJ9.js} +1 -1
  284. package/webapp/dist/assets/index-BEfv96EF.js +1 -0
  285. package/webapp/dist/assets/{label-B1SF0RTL.js → label-avMhe08g.js} +1 -1
  286. package/webapp/dist/assets/{log-level-filter-Bcn31D1F.js → log-level-filter-oaUGdbpk.js} +1 -1
  287. package/webapp/dist/assets/{logs-BqHOufk8.js → logs-iC1OEDv3.js} +1 -1
  288. package/webapp/dist/assets/{metric-chart-M-kI-XOt.js → metric-chart-CSa_qv4F.js} +1 -1
  289. package/webapp/dist/assets/{metrics-QIQaF7iS.js → metrics-CKCmcGKw.js} +1 -1
  290. package/webapp/dist/assets/{mui-Cd711nOk.js → mui-B3fJdIMc.js} +1 -1
  291. package/webapp/dist/assets/{mui-CdB_p2lt.js → mui-Bdr6Ks5j.js} +1 -1
  292. package/webapp/dist/assets/{mui-BIz4LSVs.js → mui-CADnFGCx.js} +1 -1
  293. package/webapp/dist/assets/{mui-AnEgAVjz.js → mui-CMWGTMXv.js} +1 -1
  294. package/webapp/dist/assets/{mui-DyT2n1lx.js → mui-CN3dT7bb.js} +1 -1
  295. package/webapp/dist/assets/{mui-BwsIrivo.js → mui-CPEkFAPo.js} +1 -1
  296. package/webapp/dist/assets/{mui-B1jrje6Z.js → mui-D3qAWvfZ.js} +1 -1
  297. package/webapp/dist/assets/{mui-C_hromOc.js → mui-D7tBU80e.js} +1 -1
  298. package/webapp/dist/assets/{mui-y44PQOfG.js → mui-DaJavAoc.js} +1 -1
  299. package/webapp/dist/assets/{mui-BXSXx9c9.js → mui-SNRRJ_vi.js} +1 -1
  300. package/webapp/dist/assets/{nodes-BJPk02vv.js → nodes-DtLyXH0V.js} +1 -1
  301. package/webapp/dist/assets/{operation-status-Bm1x1wTz.js → operation-status-DHyYOT7G.js} +1 -1
  302. package/webapp/dist/assets/{page-breadcrumbs-fR7Jmpp4.js → page-breadcrumbs-3R8RZ3nA.js} +1 -1
  303. package/webapp/dist/assets/pipelines-Do2NAAqK.js +3 -0
  304. package/webapp/dist/assets/project.store-D5IR3fo9.js +1 -0
  305. package/webapp/dist/assets/{projects-YoBzcQ24.js → projects-BqlGbzeG.js} +1 -1
  306. package/webapp/dist/assets/{realtime.store-CBDO4Abj.js → realtime.store-C8D235-B.js} +1 -1
  307. package/webapp/dist/assets/release-bits-IehuBssK.js +1 -0
  308. package/webapp/dist/assets/release-build-panel-C48hP_9w.js +1 -0
  309. package/webapp/dist/assets/release-deployment-state-BfmxZP4Y.js +1 -0
  310. package/webapp/dist/assets/releases-Cm0RV5Xu.js +2 -0
  311. package/webapp/dist/assets/{search-input-C0MHI8vO.js → search-input-SWD1dXxD.js} +1 -1
  312. package/webapp/dist/assets/settings-DwuEPQGg.js +1 -0
  313. package/webapp/dist/assets/sign-in-CQ-WeS5A.js +1 -0
  314. package/webapp/dist/assets/{skeleton-BmWDJWF9.js → skeleton-BnVxAoeX.js} +1 -1
  315. package/webapp/dist/assets/{snackbar-DSPmjMyi.js → snackbar-CRX6eqRT.js} +1 -1
  316. package/webapp/dist/assets/{stack-health-status-BIv2C10x.js → stack-health-status-DfErRNb1.js} +1 -1
  317. package/webapp/dist/assets/{stack-start-notice-BVnMOwRQ.js → stack-start-notice-NkYDjR-f.js} +1 -1
  318. package/webapp/dist/assets/{stacks-IZ1mfizi.js → stacks-BOGCfW90.js} +1 -1
  319. package/webapp/dist/assets/{store-bqUBn2A4.js → store-DtTtbc9H.js} +1 -1
  320. package/webapp/dist/assets/{system-info-BFKNM-hf.js → system-info-Cw-xywgI.js} +1 -1
  321. package/webapp/dist/assets/{table-BOWT6Y9d.js → table-D-so_B1p.js} +1 -1
  322. package/webapp/dist/assets/{table-viewport-Bp4pq-c_.js → table-viewport-DdZ1yAKm.js} +1 -1
  323. package/webapp/dist/assets/{tabs-k5NPGLnJ.js → tabs-DGqBkXh_.js} +1 -1
  324. package/webapp/dist/assets/{terminal-QWBau-Us.js → terminal-Bbl0XNeB.js} +1 -1
  325. package/webapp/dist/assets/{topology-CPey5dP6.js → topology-DmrRy7nN.js} +1 -1
  326. package/webapp/dist/assets/{topology-metadata-dialog-BivuU2y6.js → topology-metadata-dialog-Dpfp4YF1.js} +1 -1
  327. package/webapp/dist/assets/{traces-By0rdfDC.js → traces-CKHsOabJ.js} +1 -1
  328. package/webapp/dist/assets/{use-stack-context-UkBsF-l7.js → use-stack-context-BuraYaeY.js} +1 -1
  329. package/webapp/dist/assets/webapp-D8h_eabt.js +35 -0
  330. package/webapp/dist/console-version.json +1 -1
  331. package/webapp/dist/index.html +34 -34
  332. package/webapp/dist/logo.svg +1 -80
  333. package/bin/sdk.d.mts +0 -8
  334. package/bin/sdk.mjs +0 -576
  335. package/dist/monitoring/process-lifetime.d.ts +0 -11
  336. package/dist/monitoring/process-lifetime.d.ts.map +0 -1
  337. package/dist/monitoring/process-lifetime.js +0 -45
  338. package/dist/monitoring/process-lifetime.js.map +0 -1
  339. package/dist/shared/host-boot-identity.d.ts +0 -12
  340. package/dist/shared/host-boot-identity.d.ts.map +0 -1
  341. package/dist/shared/host-boot-identity.js +0 -89
  342. package/dist/shared/host-boot-identity.js.map +0 -1
  343. package/webapp/dist/assets/deploy-release-dialog-BOXcD5Wo.js +0 -1
  344. package/webapp/dist/assets/deployments-qV20Ak0P.js +0 -1
  345. package/webapp/dist/assets/detail-B85-Wees.js +0 -2
  346. package/webapp/dist/assets/index-uq8Dkk4c.js +0 -1
  347. package/webapp/dist/assets/omnitron-logo-koMCbsCv.js +0 -1
  348. package/webapp/dist/assets/pipelines-T6Ch9LTw.js +0 -3
  349. package/webapp/dist/assets/project.store--G5pIF-J.js +0 -1
  350. package/webapp/dist/assets/release-bits-B2a_wbft.js +0 -1
  351. package/webapp/dist/assets/release-build-panel-BQmIdKW9.js +0 -1
  352. package/webapp/dist/assets/release-deployment-state-DRrEI2pP.js +0 -1
  353. package/webapp/dist/assets/release-wire-f2VuBoBF.js +0 -1
  354. package/webapp/dist/assets/releases-Bp3CDgmo.js +0 -2
  355. package/webapp/dist/assets/settings-B3egRvbI.js +0 -1
  356. package/webapp/dist/assets/sign-in-9q-Nfy83.js +0 -1
  357. package/webapp/dist/assets/webapp-D-UhjFhS.js +0 -35
  358. 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
- getBuildWatchedApps() {
270
- return [...this.bootstrapSources].filter(([name]) => this.buildService?.isWatching(name))
271
- .map(([name, source]) => ({ name, directory: path.dirname(source.path) }));
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 || !this.allowsWatch(handle.entry))
299
- return handle;
300
- return this.restartAppCoalesced(canonical, true, 'watch');
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(() => this.executionOperations.delete(key));
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
- if (!this.allowsWatch(entry)) {
1524
- const state = this.restartCoalescer.get(handle.name);
1525
- if (state)
1526
- state.watchSerial = 0;
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 qualified = name.includes('/');
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 }, 'restartApp: no live handle — falling through to startApp');
1605
- // Restart under the name the OPERATOR asked for. The match above
1606
- // accepts a bare entry for a qualified request, and handing it to
1607
- // `startApp` unchanged re-registers the app bare —
1608
- // `ensureNamespacedEntry` leaves an entry with no OMNITRON_PROJECT /
1609
- // OMNITRON_STACK env alone by design. The app then silently leaves its
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', 'stopped', 'stopping'].includes(handle.status)) {
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.stopApp(name);
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
- const effective = effectiveAppName(rawName);
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, [entry.releaseRoot, entry.cwd, bootstrapAbsPath]);
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, [entry.releaseRoot, entry.cwd, bootstrapAbsPath]);
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
  /**