@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.
Files changed (1786) hide show
  1. package/README.md +579 -0
  2. package/data/operations/managed-kernel.mjs +302 -0
  3. package/data/operations/stage-kernel.mjs +125 -0
  4. package/dist/BUILD.json +4 -3
  5. package/dist/cli/exit-after-output.d.ts +3 -0
  6. package/dist/cli/exit-after-output.d.ts.map +1 -0
  7. package/dist/cli/exit-after-output.js +11 -0
  8. package/dist/cli/exit-after-output.js.map +1 -0
  9. package/dist/cli/installed.d.ts +3 -0
  10. package/dist/cli/installed.d.ts.map +1 -0
  11. package/dist/cli/installed.js +17 -0
  12. package/dist/cli/installed.js.map +1 -0
  13. package/dist/cli/omnitron.js +455 -99
  14. package/dist/cli/omnitron.js.map +1 -1
  15. package/dist/cli/output-command.d.ts +13 -0
  16. package/dist/cli/output-command.d.ts.map +1 -0
  17. package/dist/cli/output-command.js +48 -0
  18. package/dist/cli/output-command.js.map +1 -0
  19. package/dist/cluster/cluster.rpc-service.d.ts +9 -77
  20. package/dist/cluster/cluster.rpc-service.d.ts.map +1 -1
  21. package/dist/cluster/cluster.rpc-service.js +20 -107
  22. package/dist/cluster/cluster.rpc-service.js.map +1 -1
  23. package/dist/cluster/enrollment.d.ts +9 -0
  24. package/dist/cluster/enrollment.d.ts.map +1 -0
  25. package/dist/cluster/enrollment.js +49 -0
  26. package/dist/cluster/enrollment.js.map +1 -0
  27. package/dist/cluster/index.d.ts +1 -1
  28. package/dist/cluster/index.d.ts.map +1 -1
  29. package/dist/cluster/leader-election.d.ts +39 -211
  30. package/dist/cluster/leader-election.d.ts.map +1 -1
  31. package/dist/cluster/leader-election.js +235 -512
  32. package/dist/cluster/leader-election.js.map +1 -1
  33. package/dist/cluster/mesh-link.d.ts +18 -51
  34. package/dist/cluster/mesh-link.d.ts.map +1 -1
  35. package/dist/cluster/mesh-link.js +66 -78
  36. package/dist/cluster/mesh-link.js.map +1 -1
  37. package/dist/cluster/mesh.d.ts +3 -1
  38. package/dist/cluster/mesh.d.ts.map +1 -1
  39. package/dist/cluster/mesh.js +76 -60
  40. package/dist/cluster/mesh.js.map +1 -1
  41. package/dist/cluster/slave-connector.d.ts +42 -6
  42. package/dist/cluster/slave-connector.d.ts.map +1 -1
  43. package/dist/cluster/slave-connector.js +349 -196
  44. package/dist/cluster/slave-connector.js.map +1 -1
  45. package/dist/cluster/standalone-infrastructure.d.ts +3 -0
  46. package/dist/cluster/standalone-infrastructure.d.ts.map +1 -0
  47. package/dist/cluster/standalone-infrastructure.js +25 -0
  48. package/dist/cluster/standalone-infrastructure.js.map +1 -0
  49. package/dist/cluster/stop-authority.d.ts +45 -0
  50. package/dist/cluster/stop-authority.d.ts.map +1 -0
  51. package/dist/cluster/stop-authority.js +112 -0
  52. package/dist/cluster/stop-authority.js.map +1 -0
  53. package/dist/commands/access.d.ts +9 -0
  54. package/dist/commands/access.d.ts.map +1 -0
  55. package/dist/commands/access.js +45 -0
  56. package/dist/commands/access.js.map +1 -0
  57. package/dist/commands/audit.d.ts +2 -0
  58. package/dist/commands/audit.d.ts.map +1 -1
  59. package/dist/commands/audit.js +9 -4
  60. package/dist/commands/audit.js.map +1 -1
  61. package/dist/commands/backend.d.ts +17 -0
  62. package/dist/commands/backend.d.ts.map +1 -0
  63. package/dist/commands/backend.js +264 -0
  64. package/dist/commands/backend.js.map +1 -0
  65. package/dist/commands/backup.d.ts +5 -0
  66. package/dist/commands/backup.d.ts.map +1 -1
  67. package/dist/commands/backup.js +17 -2
  68. package/dist/commands/backup.js.map +1 -1
  69. package/dist/commands/cluster.d.ts.map +1 -1
  70. package/dist/commands/cluster.js +33 -42
  71. package/dist/commands/cluster.js.map +1 -1
  72. package/dist/commands/daemon-cmd.d.ts.map +1 -1
  73. package/dist/commands/daemon-cmd.js +14 -3
  74. package/dist/commands/daemon-cmd.js.map +1 -1
  75. package/dist/commands/deploy.d.ts +4 -4
  76. package/dist/commands/deploy.js +4 -4
  77. package/dist/commands/discover.d.ts +2 -2
  78. package/dist/commands/discover.js +2 -2
  79. package/dist/commands/doctor.d.ts +11 -29
  80. package/dist/commands/doctor.d.ts.map +1 -1
  81. package/dist/commands/doctor.js +47 -45
  82. package/dist/commands/doctor.js.map +1 -1
  83. package/dist/commands/files.d.ts +19 -0
  84. package/dist/commands/files.d.ts.map +1 -0
  85. package/dist/commands/files.js +226 -0
  86. package/dist/commands/files.js.map +1 -0
  87. package/dist/commands/fleet-asking.d.ts +2 -2
  88. package/dist/commands/fleet-asking.js +2 -2
  89. package/dist/commands/fleet-recover.d.ts +2 -0
  90. package/dist/commands/fleet-recover.d.ts.map +1 -0
  91. package/dist/commands/fleet-recover.js +30 -0
  92. package/dist/commands/fleet-recover.js.map +1 -0
  93. package/dist/commands/fleet-rollout.d.ts +25 -0
  94. package/dist/commands/fleet-rollout.d.ts.map +1 -0
  95. package/dist/commands/fleet-rollout.js +155 -0
  96. package/dist/commands/fleet-rollout.js.map +1 -0
  97. package/dist/commands/fleet.d.ts.map +1 -1
  98. package/dist/commands/fleet.js +1 -0
  99. package/dist/commands/fleet.js.map +1 -1
  100. package/dist/commands/health-check.d.ts.map +1 -1
  101. package/dist/commands/health-check.js +13 -6
  102. package/dist/commands/health-check.js.map +1 -1
  103. package/dist/commands/host-ingress.d.ts +3 -0
  104. package/dist/commands/host-ingress.d.ts.map +1 -0
  105. package/dist/commands/host-ingress.js +31 -0
  106. package/dist/commands/host-ingress.js.map +1 -0
  107. package/dist/commands/infra.d.ts +7 -4
  108. package/dist/commands/infra.d.ts.map +1 -1
  109. package/dist/commands/infra.js +152 -60
  110. package/dist/commands/infra.js.map +1 -1
  111. package/dist/commands/logs.d.ts +7 -24
  112. package/dist/commands/logs.d.ts.map +1 -1
  113. package/dist/commands/logs.js +117 -41
  114. package/dist/commands/logs.js.map +1 -1
  115. package/dist/commands/metrics.d.ts.map +1 -1
  116. package/dist/commands/metrics.js +7 -1
  117. package/dist/commands/metrics.js.map +1 -1
  118. package/dist/commands/migrate.d.ts +8 -0
  119. package/dist/commands/migrate.d.ts.map +1 -0
  120. package/dist/commands/migrate.js +64 -0
  121. package/dist/commands/migrate.js.map +1 -0
  122. package/dist/commands/node-reconcile.d.ts +8 -0
  123. package/dist/commands/node-reconcile.d.ts.map +1 -0
  124. package/dist/commands/node-reconcile.js +49 -0
  125. package/dist/commands/node-reconcile.js.map +1 -0
  126. package/dist/commands/node.d.ts +1 -21
  127. package/dist/commands/node.d.ts.map +1 -1
  128. package/dist/commands/node.js +35 -27
  129. package/dist/commands/node.js.map +1 -1
  130. package/dist/commands/output.d.ts +3 -9
  131. package/dist/commands/output.d.ts.map +1 -1
  132. package/dist/commands/output.js +34 -25
  133. package/dist/commands/output.js.map +1 -1
  134. package/dist/commands/pipeline.d.ts +11 -2
  135. package/dist/commands/pipeline.d.ts.map +1 -1
  136. package/dist/commands/pipeline.js +82 -15
  137. package/dist/commands/pipeline.js.map +1 -1
  138. package/dist/commands/project.d.ts +10 -2
  139. package/dist/commands/project.d.ts.map +1 -1
  140. package/dist/commands/project.js +69 -3
  141. package/dist/commands/project.js.map +1 -1
  142. package/dist/commands/release-store.js +1 -1
  143. package/dist/commands/release-store.js.map +1 -1
  144. package/dist/commands/release.d.ts +5 -12
  145. package/dist/commands/release.d.ts.map +1 -1
  146. package/dist/commands/release.js +144 -36
  147. package/dist/commands/release.js.map +1 -1
  148. package/dist/commands/remote.d.ts +3 -3
  149. package/dist/commands/remote.js +3 -3
  150. package/dist/commands/scale.d.ts +1 -4
  151. package/dist/commands/scale.d.ts.map +1 -1
  152. package/dist/commands/scale.js +39 -19
  153. package/dist/commands/scale.js.map +1 -1
  154. package/dist/commands/secret-input.d.ts +3 -0
  155. package/dist/commands/secret-input.d.ts.map +1 -0
  156. package/dist/commands/secret-input.js +36 -0
  157. package/dist/commands/secret-input.js.map +1 -0
  158. package/dist/commands/secret.d.ts +4 -2
  159. package/dist/commands/secret.d.ts.map +1 -1
  160. package/dist/commands/secret.js +12 -2
  161. package/dist/commands/secret.js.map +1 -1
  162. package/dist/commands/service-resident.d.ts +25 -0
  163. package/dist/commands/service-resident.d.ts.map +1 -0
  164. package/dist/commands/service-resident.js +236 -0
  165. package/dist/commands/service-resident.js.map +1 -0
  166. package/dist/commands/service-units.d.ts +13 -1
  167. package/dist/commands/service-units.d.ts.map +1 -1
  168. package/dist/commands/service-units.js +38 -16
  169. package/dist/commands/service-units.js.map +1 -1
  170. package/dist/commands/service.d.ts +2 -24
  171. package/dist/commands/service.d.ts.map +1 -1
  172. package/dist/commands/service.js +89 -7
  173. package/dist/commands/service.js.map +1 -1
  174. package/dist/commands/stack.d.ts +11 -6
  175. package/dist/commands/stack.d.ts.map +1 -1
  176. package/dist/commands/stack.js +212 -38
  177. package/dist/commands/stack.js.map +1 -1
  178. package/dist/commands/start.d.ts +0 -21
  179. package/dist/commands/start.d.ts.map +1 -1
  180. package/dist/commands/start.js +33 -43
  181. package/dist/commands/start.js.map +1 -1
  182. package/dist/commands/status.d.ts +1 -5
  183. package/dist/commands/status.d.ts.map +1 -1
  184. package/dist/commands/status.js +5 -1
  185. package/dist/commands/status.js.map +1 -1
  186. package/dist/commands/stop.d.ts +0 -22
  187. package/dist/commands/stop.d.ts.map +1 -1
  188. package/dist/commands/stop.js +26 -86
  189. package/dist/commands/stop.js.map +1 -1
  190. package/dist/commands/system.d.ts +4 -0
  191. package/dist/commands/system.d.ts.map +1 -0
  192. package/dist/commands/system.js +41 -0
  193. package/dist/commands/system.js.map +1 -0
  194. package/dist/commands/terminal.d.ts +7 -0
  195. package/dist/commands/terminal.d.ts.map +1 -0
  196. package/dist/commands/terminal.js +184 -0
  197. package/dist/commands/terminal.js.map +1 -0
  198. package/dist/commands/topology.d.ts +3 -0
  199. package/dist/commands/topology.d.ts.map +1 -0
  200. package/dist/commands/topology.js +107 -0
  201. package/dist/commands/topology.js.map +1 -0
  202. package/dist/commands/tor.d.ts +1 -1
  203. package/dist/commands/tor.js +2 -2
  204. package/dist/commands/up.d.ts +4 -54
  205. package/dist/commands/up.d.ts.map +1 -1
  206. package/dist/commands/up.js +41 -98
  207. package/dist/commands/up.js.map +1 -1
  208. package/dist/commands/webapp.d.ts +0 -9
  209. package/dist/commands/webapp.d.ts.map +1 -1
  210. package/dist/commands/webapp.js +116 -69
  211. package/dist/commands/webapp.js.map +1 -1
  212. package/dist/config/app-path.d.ts +4 -0
  213. package/dist/config/app-path.d.ts.map +1 -0
  214. package/dist/config/app-path.js +6 -0
  215. package/dist/config/app-path.js.map +1 -0
  216. package/dist/config/defaults.d.ts.map +1 -1
  217. package/dist/config/defaults.js +9 -3
  218. package/dist/config/defaults.js.map +1 -1
  219. package/dist/config/define-ecosystem.d.ts.map +1 -1
  220. package/dist/config/define-ecosystem.js +12 -0
  221. package/dist/config/define-ecosystem.js.map +1 -1
  222. package/dist/config/index.d.ts +3 -1
  223. package/dist/config/index.d.ts.map +1 -1
  224. package/dist/config/index.js +1 -1
  225. package/dist/config/index.js.map +1 -1
  226. package/dist/config/loader-child.d.ts +2 -0
  227. package/dist/config/loader-child.d.ts.map +1 -0
  228. package/dist/config/loader-child.js +56 -0
  229. package/dist/config/loader-child.js.map +1 -0
  230. package/dist/config/loader.d.ts +7 -2
  231. package/dist/config/loader.d.ts.map +1 -1
  232. package/dist/config/loader.js +14 -27
  233. package/dist/config/loader.js.map +1 -1
  234. package/dist/config/saved.d.ts +67 -0
  235. package/dist/config/saved.d.ts.map +1 -0
  236. package/dist/config/saved.js +81 -0
  237. package/dist/config/saved.js.map +1 -0
  238. package/dist/config/types.d.ts +105 -58
  239. package/dist/config/types.d.ts.map +1 -1
  240. package/dist/daemon/backend-candidate.d.ts +32 -0
  241. package/dist/daemon/backend-candidate.d.ts.map +1 -0
  242. package/dist/daemon/backend-candidate.js +129 -0
  243. package/dist/daemon/backend-candidate.js.map +1 -0
  244. package/dist/daemon/backend-child.d.ts +5 -0
  245. package/dist/daemon/backend-child.d.ts.map +1 -0
  246. package/dist/daemon/backend-child.js +13 -0
  247. package/dist/daemon/backend-child.js.map +1 -0
  248. package/dist/daemon/backend-control.d.ts +43 -0
  249. package/dist/daemon/backend-control.d.ts.map +1 -0
  250. package/dist/daemon/backend-control.js +155 -0
  251. package/dist/daemon/backend-control.js.map +1 -0
  252. package/dist/daemon/backend-crash-recovery.d.ts +4 -0
  253. package/dist/daemon/backend-crash-recovery.d.ts.map +1 -0
  254. package/dist/daemon/backend-crash-recovery.js +136 -0
  255. package/dist/daemon/backend-crash-recovery.js.map +1 -0
  256. package/dist/daemon/backend-handoff-types.d.ts +27 -0
  257. package/dist/daemon/backend-handoff-types.d.ts.map +1 -0
  258. package/dist/daemon/backend-handoff-types.js +33 -0
  259. package/dist/daemon/backend-handoff-types.js.map +1 -0
  260. package/dist/daemon/backend-recovery-journal.d.ts +30 -0
  261. package/dist/daemon/backend-recovery-journal.d.ts.map +1 -0
  262. package/dist/daemon/backend-recovery-journal.js +67 -0
  263. package/dist/daemon/backend-recovery-journal.js.map +1 -0
  264. package/dist/daemon/backend-recovery-monitor.d.ts +35 -0
  265. package/dist/daemon/backend-recovery-monitor.d.ts.map +1 -0
  266. package/dist/daemon/backend-recovery-monitor.js +113 -0
  267. package/dist/daemon/backend-recovery-monitor.js.map +1 -0
  268. package/dist/daemon/backend-supervisor-entry.d.ts +2 -0
  269. package/dist/daemon/backend-supervisor-entry.d.ts.map +1 -0
  270. package/dist/daemon/backend-supervisor-entry.js +3 -0
  271. package/dist/daemon/backend-supervisor-entry.js.map +1 -0
  272. package/dist/daemon/backend-supervisor-main.d.ts +2 -0
  273. package/dist/daemon/backend-supervisor-main.d.ts.map +1 -0
  274. package/dist/daemon/backend-supervisor-main.js +45 -0
  275. package/dist/daemon/backend-supervisor-main.js.map +1 -0
  276. package/dist/daemon/backend-supervisor.d.ts +61 -0
  277. package/dist/daemon/backend-supervisor.d.ts.map +1 -0
  278. package/dist/daemon/backend-supervisor.js +339 -0
  279. package/dist/daemon/backend-supervisor.js.map +1 -0
  280. package/dist/daemon/backend-upgrade.d.ts +41 -0
  281. package/dist/daemon/backend-upgrade.d.ts.map +1 -0
  282. package/dist/daemon/backend-upgrade.js +444 -0
  283. package/dist/daemon/backend-upgrade.js.map +1 -0
  284. package/dist/daemon/backend.rpc-service.d.ts +11 -0
  285. package/dist/daemon/backend.rpc-service.d.ts.map +1 -0
  286. package/dist/daemon/backend.rpc-service.js +44 -0
  287. package/dist/daemon/backend.rpc-service.js.map +1 -0
  288. package/dist/daemon/daemon-client.d.ts +12 -79
  289. package/dist/daemon/daemon-client.d.ts.map +1 -1
  290. package/dist/daemon/daemon-client.js +28 -270
  291. package/dist/daemon/daemon-client.js.map +1 -1
  292. package/dist/daemon/daemon-entry.d.ts +0 -7
  293. package/dist/daemon/daemon-entry.d.ts.map +1 -1
  294. package/dist/daemon/daemon-entry.js +2 -115
  295. package/dist/daemon/daemon-entry.js.map +1 -1
  296. package/dist/daemon/daemon-main.d.ts +9 -0
  297. package/dist/daemon/daemon-main.d.ts.map +1 -0
  298. package/dist/daemon/daemon-main.js +105 -0
  299. package/dist/daemon/daemon-main.js.map +1 -0
  300. package/dist/daemon/daemon-scheduler.d.ts +8 -5
  301. package/dist/daemon/daemon-scheduler.d.ts.map +1 -1
  302. package/dist/daemon/daemon-scheduler.js +45 -73
  303. package/dist/daemon/daemon-scheduler.js.map +1 -1
  304. package/dist/daemon/daemon-state-store.service.d.ts +5 -39
  305. package/dist/daemon/daemon-state-store.service.d.ts.map +1 -1
  306. package/dist/daemon/daemon-state-store.service.js +30 -17
  307. package/dist/daemon/daemon-state-store.service.js.map +1 -1
  308. package/dist/daemon/daemon.d.ts +50 -79
  309. package/dist/daemon/daemon.d.ts.map +1 -1
  310. package/dist/daemon/daemon.js +769 -442
  311. package/dist/daemon/daemon.js.map +1 -1
  312. package/dist/daemon/daemon.module.d.ts +13 -11
  313. package/dist/daemon/daemon.module.d.ts.map +1 -1
  314. package/dist/daemon/daemon.module.js +139 -106
  315. package/dist/daemon/daemon.module.js.map +1 -1
  316. package/dist/daemon/daemon.rpc-service.d.ts +11 -19
  317. package/dist/daemon/daemon.rpc-service.d.ts.map +1 -1
  318. package/dist/daemon/daemon.rpc-service.js +89 -28
  319. package/dist/daemon/daemon.rpc-service.js.map +1 -1
  320. package/dist/daemon/darwin-owner-evidence.d.ts +57 -0
  321. package/dist/daemon/darwin-owner-evidence.d.ts.map +1 -0
  322. package/dist/daemon/darwin-owner-evidence.js +131 -0
  323. package/dist/daemon/darwin-owner-evidence.js.map +1 -0
  324. package/dist/daemon/database-startup.d.ts +7 -0
  325. package/dist/daemon/database-startup.d.ts.map +1 -0
  326. package/dist/daemon/database-startup.js +40 -0
  327. package/dist/daemon/database-startup.js.map +1 -0
  328. package/dist/daemon/entry-guard.d.ts +2 -0
  329. package/dist/daemon/entry-guard.d.ts.map +1 -0
  330. package/dist/daemon/entry-guard.js +34 -0
  331. package/dist/daemon/entry-guard.js.map +1 -0
  332. package/dist/daemon/execution-capabilities.d.ts +7 -0
  333. package/dist/daemon/execution-capabilities.d.ts.map +1 -0
  334. package/dist/daemon/execution-capabilities.js +23 -0
  335. package/dist/daemon/execution-capabilities.js.map +1 -0
  336. package/dist/daemon/execution-client.d.ts +88 -0
  337. package/dist/daemon/execution-client.d.ts.map +1 -0
  338. package/dist/daemon/execution-client.js +433 -0
  339. package/dist/daemon/execution-client.js.map +1 -0
  340. package/dist/daemon/execution-config.d.ts +7 -0
  341. package/dist/daemon/execution-config.d.ts.map +1 -0
  342. package/dist/daemon/execution-config.js +61 -0
  343. package/dist/daemon/execution-config.js.map +1 -0
  344. package/dist/daemon/execution-entry.d.ts +2 -0
  345. package/dist/daemon/execution-entry.d.ts.map +1 -0
  346. package/dist/daemon/execution-entry.js +3 -0
  347. package/dist/daemon/execution-entry.js.map +1 -0
  348. package/dist/daemon/execution-host.d.ts +133 -0
  349. package/dist/daemon/execution-host.d.ts.map +1 -0
  350. package/dist/daemon/execution-host.js +308 -0
  351. package/dist/daemon/execution-host.js.map +1 -0
  352. package/dist/daemon/execution-journal.d.ts +17 -0
  353. package/dist/daemon/execution-journal.d.ts.map +1 -0
  354. package/dist/daemon/execution-journal.js +75 -0
  355. package/dist/daemon/execution-journal.js.map +1 -0
  356. package/dist/daemon/execution-launcher.d.ts +12 -0
  357. package/dist/daemon/execution-launcher.d.ts.map +1 -0
  358. package/dist/daemon/execution-launcher.js +110 -0
  359. package/dist/daemon/execution-launcher.js.map +1 -0
  360. package/dist/daemon/execution-main.d.ts +2 -0
  361. package/dist/daemon/execution-main.d.ts.map +1 -0
  362. package/dist/daemon/execution-main.js +48 -0
  363. package/dist/daemon/execution-main.js.map +1 -0
  364. package/dist/daemon/execution-owner.d.ts +16 -0
  365. package/dist/daemon/execution-owner.d.ts.map +1 -0
  366. package/dist/daemon/execution-owner.js +97 -0
  367. package/dist/daemon/execution-owner.js.map +1 -0
  368. package/dist/daemon/execution-platform.d.ts +3 -0
  369. package/dist/daemon/execution-platform.d.ts.map +1 -0
  370. package/dist/daemon/execution-platform.js +23 -0
  371. package/dist/daemon/execution-platform.js.map +1 -0
  372. package/dist/daemon/execution-shutdown.d.ts +13 -0
  373. package/dist/daemon/execution-shutdown.d.ts.map +1 -0
  374. package/dist/daemon/execution-shutdown.js +30 -0
  375. package/dist/daemon/execution-shutdown.js.map +1 -0
  376. package/dist/daemon/managed-entry.d.ts +2 -0
  377. package/dist/daemon/managed-entry.d.ts.map +1 -0
  378. package/dist/daemon/managed-entry.js +3 -0
  379. package/dist/daemon/managed-entry.js.map +1 -0
  380. package/dist/daemon/managed-main.d.ts +2 -0
  381. package/dist/daemon/managed-main.d.ts.map +1 -0
  382. package/dist/daemon/managed-main.js +29 -0
  383. package/dist/daemon/managed-main.js.map +1 -0
  384. package/dist/daemon/managed-owner-build.d.ts +17 -0
  385. package/dist/daemon/managed-owner-build.d.ts.map +1 -0
  386. package/dist/daemon/managed-owner-build.js +108 -0
  387. package/dist/daemon/managed-owner-build.js.map +1 -0
  388. package/dist/daemon/managed-owner-entry.d.ts +2 -0
  389. package/dist/daemon/managed-owner-entry.d.ts.map +1 -0
  390. package/dist/daemon/managed-owner-entry.js +3 -0
  391. package/dist/daemon/managed-owner-entry.js.map +1 -0
  392. package/dist/daemon/managed-owner-main.d.ts +2 -0
  393. package/dist/daemon/managed-owner-main.d.ts.map +1 -0
  394. package/dist/daemon/managed-owner-main.js +53 -0
  395. package/dist/daemon/managed-owner-main.js.map +1 -0
  396. package/dist/daemon/managed-runtime.d.ts +39 -0
  397. package/dist/daemon/managed-runtime.d.ts.map +1 -0
  398. package/dist/daemon/managed-runtime.js +137 -0
  399. package/dist/daemon/managed-runtime.js.map +1 -0
  400. package/dist/daemon/network-publication.d.ts +5 -0
  401. package/dist/daemon/network-publication.d.ts.map +1 -0
  402. package/dist/daemon/network-publication.js +25 -0
  403. package/dist/daemon/network-publication.js.map +1 -0
  404. package/dist/daemon/owner-reconciliation.d.ts +58 -0
  405. package/dist/daemon/owner-reconciliation.d.ts.map +1 -0
  406. package/dist/daemon/owner-reconciliation.js +265 -0
  407. package/dist/daemon/owner-reconciliation.js.map +1 -0
  408. package/dist/daemon/pid-manager.d.ts +2 -0
  409. package/dist/daemon/pid-manager.d.ts.map +1 -1
  410. package/dist/daemon/pid-manager.js +5 -0
  411. package/dist/daemon/pid-manager.js.map +1 -1
  412. package/dist/daemon/private-control-client.d.ts +8 -0
  413. package/dist/daemon/private-control-client.d.ts.map +1 -0
  414. package/dist/daemon/private-control-client.js +41 -0
  415. package/dist/daemon/private-control-client.js.map +1 -0
  416. package/dist/daemon/recovery-state.d.ts +20 -0
  417. package/dist/daemon/recovery-state.d.ts.map +1 -0
  418. package/dist/daemon/recovery-state.js +53 -0
  419. package/dist/daemon/recovery-state.js.map +1 -0
  420. package/dist/daemon/rpc-connection.d.ts +29 -0
  421. package/dist/daemon/rpc-connection.d.ts.map +1 -0
  422. package/dist/daemon/rpc-connection.js +137 -0
  423. package/dist/daemon/rpc-connection.js.map +1 -0
  424. package/dist/daemon/runtime-installation.d.ts +58 -0
  425. package/dist/daemon/runtime-installation.d.ts.map +1 -0
  426. package/dist/daemon/runtime-installation.js +346 -0
  427. package/dist/daemon/runtime-installation.js.map +1 -0
  428. package/dist/daemon/runtime-launcher.d.ts +6 -0
  429. package/dist/daemon/runtime-launcher.d.ts.map +1 -0
  430. package/dist/daemon/runtime-launcher.js +45 -0
  431. package/dist/daemon/runtime-launcher.js.map +1 -0
  432. package/dist/daemon/schema-transition.d.ts +43 -0
  433. package/dist/daemon/schema-transition.d.ts.map +1 -0
  434. package/dist/daemon/schema-transition.js +239 -0
  435. package/dist/daemon/schema-transition.js.map +1 -0
  436. package/dist/daemon/spawn-daemon.d.ts +2 -0
  437. package/dist/daemon/spawn-daemon.d.ts.map +1 -1
  438. package/dist/daemon/spawn-daemon.js +4 -0
  439. package/dist/daemon/spawn-daemon.js.map +1 -1
  440. package/dist/daemon/startup-config.d.ts +77 -0
  441. package/dist/daemon/startup-config.d.ts.map +1 -0
  442. package/dist/daemon/startup-config.js +31 -0
  443. package/dist/daemon/startup-config.js.map +1 -0
  444. package/dist/daemon/startup-failure-journal.d.ts +3 -0
  445. package/dist/daemon/startup-failure-journal.d.ts.map +1 -0
  446. package/dist/daemon/startup-failure-journal.js +29 -0
  447. package/dist/daemon/startup-failure-journal.js.map +1 -0
  448. package/dist/daemon/state-store.d.ts +16 -24
  449. package/dist/daemon/state-store.d.ts.map +1 -1
  450. package/dist/daemon/state-store.js +51 -9
  451. package/dist/daemon/state-store.js.map +1 -1
  452. package/dist/daemon/supervisor-transition.d.ts +101 -0
  453. package/dist/daemon/supervisor-transition.d.ts.map +1 -0
  454. package/dist/daemon/supervisor-transition.js +503 -0
  455. package/dist/daemon/supervisor-transition.js.map +1 -0
  456. package/dist/daemon/system-guardian-cgroup.d.ts +16 -0
  457. package/dist/daemon/system-guardian-cgroup.d.ts.map +1 -0
  458. package/dist/daemon/system-guardian-cgroup.js +202 -0
  459. package/dist/daemon/system-guardian-cgroup.js.map +1 -0
  460. package/dist/daemon/system-guardian-unit.d.ts +9 -0
  461. package/dist/daemon/system-guardian-unit.d.ts.map +1 -0
  462. package/dist/daemon/system-guardian-unit.js +41 -0
  463. package/dist/daemon/system-guardian-unit.js.map +1 -0
  464. package/dist/database/connection.d.ts.map +1 -1
  465. package/dist/database/connection.js +2 -6
  466. package/dist/database/connection.js.map +1 -1
  467. package/dist/database/log-durability.d.ts +5 -0
  468. package/dist/database/log-durability.d.ts.map +1 -0
  469. package/dist/database/log-durability.js +28 -0
  470. package/dist/database/log-durability.js.map +1 -0
  471. package/dist/database/migrate.js +2 -15
  472. package/dist/database/migrate.js.map +1 -1
  473. package/dist/database/migration-registry-compatibility.d.ts +13 -0
  474. package/dist/database/migration-registry-compatibility.d.ts.map +1 -0
  475. package/dist/database/migration-registry-compatibility.js +108 -0
  476. package/dist/database/migration-registry-compatibility.js.map +1 -0
  477. package/dist/database/migration-runner.d.ts +8 -42
  478. package/dist/database/migration-runner.d.ts.map +1 -1
  479. package/dist/database/migration-runner.js +114 -123
  480. package/dist/database/migration-runner.js.map +1 -1
  481. package/dist/database/migrations/014_replication_receipts.d.ts +5 -0
  482. package/dist/database/migrations/014_replication_receipts.d.ts.map +1 -0
  483. package/dist/database/migrations/014_replication_receipts.js +6 -0
  484. package/dist/database/migrations/014_replication_receipts.js.map +1 -0
  485. package/dist/database/migrations/015_persistent_metrics.d.ts +5 -0
  486. package/dist/database/migrations/015_persistent_metrics.d.ts.map +1 -0
  487. package/dist/database/migrations/015_persistent_metrics.js +7 -0
  488. package/dist/database/migrations/015_persistent_metrics.js.map +1 -0
  489. package/dist/database/migrations/016_cluster_lease.d.ts +4 -0
  490. package/dist/database/migrations/016_cluster_lease.d.ts.map +1 -0
  491. package/dist/database/migrations/016_cluster_lease.js +6 -0
  492. package/dist/database/migrations/016_cluster_lease.js.map +1 -0
  493. package/dist/database/migrations/index.d.ts +1 -1
  494. package/dist/database/migrations/index.d.ts.map +1 -1
  495. package/dist/database/migrations/index.js +22 -13
  496. package/dist/database/migrations/index.js.map +1 -1
  497. package/dist/database/schema-compatibility.d.ts +34 -0
  498. package/dist/database/schema-compatibility.d.ts.map +1 -0
  499. package/dist/database/schema-compatibility.js +109 -0
  500. package/dist/database/schema-compatibility.js.map +1 -0
  501. package/dist/database/schema-expansion-policy.d.ts +10 -0
  502. package/dist/database/schema-expansion-policy.d.ts.map +1 -0
  503. package/dist/database/schema-expansion-policy.js +21 -0
  504. package/dist/database/schema-expansion-policy.js.map +1 -0
  505. package/dist/database/schema-transition-plan.d.ts +53 -0
  506. package/dist/database/schema-transition-plan.d.ts.map +1 -0
  507. package/dist/database/schema-transition-plan.js +102 -0
  508. package/dist/database/schema-transition-plan.js.map +1 -0
  509. package/dist/database/schema-worker.d.ts +2 -0
  510. package/dist/database/schema-worker.d.ts.map +1 -0
  511. package/dist/database/schema-worker.js +55 -0
  512. package/dist/database/schema-worker.js.map +1 -0
  513. package/dist/database/schema.d.ts +6 -1
  514. package/dist/database/schema.d.ts.map +1 -1
  515. package/dist/database/slave-migrations/001_replication_evidence.d.ts +4 -0
  516. package/dist/database/slave-migrations/001_replication_evidence.d.ts.map +1 -0
  517. package/dist/database/slave-migrations/001_replication_evidence.js +89 -0
  518. package/dist/database/slave-migrations/001_replication_evidence.js.map +1 -0
  519. package/dist/database/slave-migrations/index.d.ts +6 -0
  520. package/dist/database/slave-migrations/index.d.ts.map +1 -0
  521. package/dist/database/slave-migrations/index.js +10 -0
  522. package/dist/database/slave-migrations/index.js.map +1 -0
  523. package/dist/diagnostics/index.d.ts +16 -0
  524. package/dist/diagnostics/index.d.ts.map +1 -0
  525. package/dist/diagnostics/index.js +22 -0
  526. package/dist/diagnostics/index.js.map +1 -0
  527. package/dist/execution/command-failure.d.ts +7 -0
  528. package/dist/execution/command-failure.d.ts.map +1 -0
  529. package/dist/execution/command-failure.js +29 -0
  530. package/dist/execution/command-failure.js.map +1 -0
  531. package/dist/execution/data-channel.d.ts +1 -1
  532. package/dist/execution/data-channel.js +1 -1
  533. package/dist/execution/execution.service.d.ts +16 -4
  534. package/dist/execution/execution.service.d.ts.map +1 -1
  535. package/dist/execution/execution.service.js +133 -74
  536. package/dist/execution/execution.service.js.map +1 -1
  537. package/dist/files/archive-codec.d.ts +57 -0
  538. package/dist/files/archive-codec.d.ts.map +1 -0
  539. package/dist/files/archive-codec.js +454 -0
  540. package/dist/files/archive-codec.js.map +1 -0
  541. package/dist/files/archive-node.d.ts +27 -0
  542. package/dist/files/archive-node.d.ts.map +1 -0
  543. package/dist/files/archive-node.js +379 -0
  544. package/dist/files/archive-node.js.map +1 -0
  545. package/dist/files/archive-publication.d.ts +26 -0
  546. package/dist/files/archive-publication.d.ts.map +1 -0
  547. package/dist/files/archive-publication.js +224 -0
  548. package/dist/files/archive-publication.js.map +1 -0
  549. package/dist/files/file-config.d.ts +7 -0
  550. package/dist/files/file-config.d.ts.map +1 -0
  551. package/dist/files/file-config.js +11 -0
  552. package/dist/files/file-config.js.map +1 -0
  553. package/dist/files/file-node.d.ts +65 -0
  554. package/dist/files/file-node.d.ts.map +1 -0
  555. package/dist/files/file-node.js +863 -0
  556. package/dist/files/file-node.js.map +1 -0
  557. package/dist/files/file-node.rpc-service.d.ts +12 -0
  558. package/dist/files/file-node.rpc-service.d.ts.map +1 -0
  559. package/dist/files/file-node.rpc-service.js +42 -0
  560. package/dist/files/file-node.rpc-service.js.map +1 -0
  561. package/dist/files/files.rpc-service.d.ts +107 -0
  562. package/dist/files/files.rpc-service.d.ts.map +1 -0
  563. package/dist/files/files.rpc-service.js +769 -0
  564. package/dist/files/files.rpc-service.js.map +1 -0
  565. package/dist/files/structural-policy.d.ts +3 -0
  566. package/dist/files/structural-policy.d.ts.map +1 -0
  567. package/dist/files/structural-policy.js +27 -0
  568. package/dist/files/structural-policy.js.map +1 -0
  569. package/dist/health/contracts.d.ts +30 -0
  570. package/dist/health/contracts.d.ts.map +1 -0
  571. package/dist/health/contracts.js +58 -0
  572. package/dist/health/contracts.js.map +1 -0
  573. package/dist/health/heartbeat.d.ts +11 -0
  574. package/dist/health/heartbeat.d.ts.map +1 -0
  575. package/dist/health/heartbeat.js +32 -0
  576. package/dist/health/heartbeat.js.map +1 -0
  577. package/dist/health/index.d.ts +4 -0
  578. package/dist/health/index.d.ts.map +1 -0
  579. package/dist/health/index.js +2 -0
  580. package/dist/health/index.js.map +1 -0
  581. package/dist/health/readiness.d.ts +15 -0
  582. package/dist/health/readiness.d.ts.map +1 -0
  583. package/dist/health/readiness.js +170 -0
  584. package/dist/health/readiness.js.map +1 -0
  585. package/dist/index.d.ts +1 -0
  586. package/dist/index.d.ts.map +1 -1
  587. package/dist/infrastructure/apt-packages.d.ts +34 -0
  588. package/dist/infrastructure/apt-packages.d.ts.map +1 -0
  589. package/dist/infrastructure/apt-packages.js +232 -0
  590. package/dist/infrastructure/apt-packages.js.map +1 -0
  591. package/dist/infrastructure/bare-metal-plan.d.ts +10 -1
  592. package/dist/infrastructure/bare-metal-plan.d.ts.map +1 -1
  593. package/dist/infrastructure/bare-metal-plan.js +22 -1
  594. package/dist/infrastructure/bare-metal-plan.js.map +1 -1
  595. package/dist/infrastructure/bare-metal-runner.d.ts.map +1 -1
  596. package/dist/infrastructure/bare-metal-runner.js +13 -2
  597. package/dist/infrastructure/bare-metal-runner.js.map +1 -1
  598. package/dist/infrastructure/config-normalizer.d.ts +4 -3
  599. package/dist/infrastructure/config-normalizer.d.ts.map +1 -1
  600. package/dist/infrastructure/config-normalizer.js +11 -3
  601. package/dist/infrastructure/config-normalizer.js.map +1 -1
  602. package/dist/infrastructure/config-payload.d.ts +4 -4
  603. package/dist/infrastructure/config-payload.js +4 -4
  604. package/dist/infrastructure/container-runtime.d.ts +39 -13
  605. package/dist/infrastructure/container-runtime.d.ts.map +1 -1
  606. package/dist/infrastructure/container-runtime.js +276 -84
  607. package/dist/infrastructure/container-runtime.js.map +1 -1
  608. package/dist/infrastructure/gateway-redis-db.d.ts +2 -2
  609. package/dist/infrastructure/gateway-redis-db.js +2 -2
  610. package/dist/infrastructure/health-recovery.d.ts +19 -0
  611. package/dist/infrastructure/health-recovery.d.ts.map +1 -0
  612. package/dist/infrastructure/health-recovery.js +39 -0
  613. package/dist/infrastructure/health-recovery.js.map +1 -0
  614. package/dist/infrastructure/host-ingress-config.d.ts +12 -0
  615. package/dist/infrastructure/host-ingress-config.d.ts.map +1 -0
  616. package/dist/infrastructure/host-ingress-config.js +200 -0
  617. package/dist/infrastructure/host-ingress-config.js.map +1 -0
  618. package/dist/infrastructure/host-ingress-lock.d.ts +3 -0
  619. package/dist/infrastructure/host-ingress-lock.d.ts.map +1 -0
  620. package/dist/infrastructure/host-ingress-lock.js +2 -0
  621. package/dist/infrastructure/host-ingress-lock.js.map +1 -0
  622. package/dist/infrastructure/host-ingress-runtime.d.ts +25 -0
  623. package/dist/infrastructure/host-ingress-runtime.d.ts.map +1 -0
  624. package/dist/infrastructure/host-ingress-runtime.js +114 -0
  625. package/dist/infrastructure/host-ingress-runtime.js.map +1 -0
  626. package/dist/infrastructure/host-ingress-takeover.d.ts +18 -0
  627. package/dist/infrastructure/host-ingress-takeover.d.ts.map +1 -0
  628. package/dist/infrastructure/host-ingress-takeover.js +142 -0
  629. package/dist/infrastructure/host-ingress-takeover.js.map +1 -0
  630. package/dist/infrastructure/host-ingress-types.d.ts +175 -0
  631. package/dist/infrastructure/host-ingress-types.d.ts.map +1 -0
  632. package/dist/infrastructure/host-ingress-types.js +2 -0
  633. package/dist/infrastructure/host-ingress-types.js.map +1 -0
  634. package/dist/infrastructure/host-ingress.service.d.ts +47 -0
  635. package/dist/infrastructure/host-ingress.service.d.ts.map +1 -0
  636. package/dist/infrastructure/host-ingress.service.js +514 -0
  637. package/dist/infrastructure/host-ingress.service.js.map +1 -0
  638. package/dist/infrastructure/host-inspection.d.ts +1 -0
  639. package/dist/infrastructure/host-inspection.d.ts.map +1 -1
  640. package/dist/infrastructure/host-inspection.js +3 -2
  641. package/dist/infrastructure/host-inspection.js.map +1 -1
  642. package/dist/infrastructure/infrastructure.service.d.ts +101 -34
  643. package/dist/infrastructure/infrastructure.service.d.ts.map +1 -1
  644. package/dist/infrastructure/infrastructure.service.js +631 -205
  645. package/dist/infrastructure/infrastructure.service.js.map +1 -1
  646. package/dist/infrastructure/merge-config.d.ts +10 -0
  647. package/dist/infrastructure/merge-config.d.ts.map +1 -0
  648. package/dist/infrastructure/merge-config.js +27 -0
  649. package/dist/infrastructure/merge-config.js.map +1 -0
  650. package/dist/infrastructure/orphan-containers.d.ts +8 -7
  651. package/dist/infrastructure/orphan-containers.d.ts.map +1 -1
  652. package/dist/infrastructure/orphan-containers.js +7 -7
  653. package/dist/infrastructure/orphan-containers.js.map +1 -1
  654. package/dist/infrastructure/owned-container.d.ts +4 -0
  655. package/dist/infrastructure/owned-container.d.ts.map +1 -0
  656. package/dist/infrastructure/owned-container.js +13 -0
  657. package/dist/infrastructure/owned-container.js.map +1 -0
  658. package/dist/infrastructure/phantom-endpoint-janitor.d.ts +4 -1
  659. package/dist/infrastructure/phantom-endpoint-janitor.d.ts.map +1 -1
  660. package/dist/infrastructure/phantom-endpoint-janitor.js +11 -2
  661. package/dist/infrastructure/phantom-endpoint-janitor.js.map +1 -1
  662. package/dist/infrastructure/presets/minio.d.ts.map +1 -1
  663. package/dist/infrastructure/presets/minio.js +15 -25
  664. package/dist/infrastructure/presets/minio.js.map +1 -1
  665. package/dist/infrastructure/presets/postgres.d.ts.map +1 -1
  666. package/dist/infrastructure/presets/postgres.js +35 -31
  667. package/dist/infrastructure/presets/postgres.js.map +1 -1
  668. package/dist/infrastructure/presets/tor.d.ts +1 -2
  669. package/dist/infrastructure/presets/tor.d.ts.map +1 -1
  670. package/dist/infrastructure/presets/tor.js +7 -13
  671. package/dist/infrastructure/presets/tor.js.map +1 -1
  672. package/dist/infrastructure/provisioning-outcome.d.ts +8 -1
  673. package/dist/infrastructure/provisioning-outcome.d.ts.map +1 -1
  674. package/dist/infrastructure/provisioning-outcome.js +42 -9
  675. package/dist/infrastructure/provisioning-outcome.js.map +1 -1
  676. package/dist/infrastructure/service-binding.js +1 -1
  677. package/dist/infrastructure/service-resolver.d.ts +11 -5
  678. package/dist/infrastructure/service-resolver.d.ts.map +1 -1
  679. package/dist/infrastructure/service-resolver.js +109 -54
  680. package/dist/infrastructure/service-resolver.js.map +1 -1
  681. package/dist/infrastructure/shipped-config.js +4 -4
  682. package/dist/infrastructure/stack-infra-manager.d.ts +35 -5
  683. package/dist/infrastructure/stack-infra-manager.d.ts.map +1 -1
  684. package/dist/infrastructure/stack-infra-manager.js +227 -57
  685. package/dist/infrastructure/stack-infra-manager.js.map +1 -1
  686. package/dist/infrastructure/types.d.ts +68 -9
  687. package/dist/infrastructure/types.d.ts.map +1 -1
  688. package/dist/mcp/mcp-bridge.js +1 -1
  689. package/dist/mcp/mcp-bridge.js.map +1 -1
  690. package/dist/mcp/monitoring-reading.d.ts +18 -0
  691. package/dist/mcp/monitoring-reading.d.ts.map +1 -0
  692. package/dist/mcp/monitoring-reading.js +84 -0
  693. package/dist/mcp/monitoring-reading.js.map +1 -0
  694. package/dist/mcp/tool-groups/apps.tools.d.ts.map +1 -1
  695. package/dist/mcp/tool-groups/apps.tools.js +6 -4
  696. package/dist/mcp/tool-groups/apps.tools.js.map +1 -1
  697. package/dist/mcp/tool-groups/management.tools.d.ts +2 -0
  698. package/dist/mcp/tool-groups/management.tools.d.ts.map +1 -1
  699. package/dist/mcp/tool-groups/management.tools.js +17 -38
  700. package/dist/mcp/tool-groups/management.tools.js.map +1 -1
  701. package/dist/mcp/tool-groups/monitoring.tools.d.ts.map +1 -1
  702. package/dist/mcp/tool-groups/monitoring.tools.js +45 -2
  703. package/dist/mcp/tool-groups/monitoring.tools.js.map +1 -1
  704. package/dist/mcp/unavailable-tools.js +2 -2
  705. package/dist/mcp/unavailable-tools.js.map +1 -1
  706. package/dist/migration/configuration.d.ts +8 -0
  707. package/dist/migration/configuration.d.ts.map +1 -0
  708. package/dist/migration/configuration.js +16 -0
  709. package/dist/migration/configuration.js.map +1 -0
  710. package/dist/migration/index.d.ts +25 -0
  711. package/dist/migration/index.d.ts.map +1 -0
  712. package/dist/migration/index.js +27 -0
  713. package/dist/migration/index.js.map +1 -0
  714. package/dist/migration/operation.d.ts +31 -0
  715. package/dist/migration/operation.d.ts.map +1 -0
  716. package/dist/migration/operation.js +67 -0
  717. package/dist/migration/operation.js.map +1 -0
  718. package/dist/migration/workspace.d.ts +28 -0
  719. package/dist/migration/workspace.d.ts.map +1 -0
  720. package/dist/migration/workspace.js +91 -0
  721. package/dist/migration/workspace.js.map +1 -0
  722. package/dist/monitoring/app-health.indicator.d.ts +1 -1
  723. package/dist/monitoring/app-health.indicator.d.ts.map +1 -1
  724. package/dist/monitoring/docker-health.indicator.d.ts +4 -2
  725. package/dist/monitoring/docker-health.indicator.d.ts.map +1 -1
  726. package/dist/monitoring/docker-health.indicator.js +66 -5
  727. package/dist/monitoring/docker-health.indicator.js.map +1 -1
  728. package/dist/monitoring/event-loop-watch.d.ts.map +1 -1
  729. package/dist/monitoring/event-loop-watch.js.map +1 -1
  730. package/dist/monitoring/infrastructure-health.d.ts +15 -0
  731. package/dist/monitoring/infrastructure-health.d.ts.map +1 -0
  732. package/dist/monitoring/infrastructure-health.js +2 -0
  733. package/dist/monitoring/infrastructure-health.js.map +1 -0
  734. package/dist/monitoring/log-entry.d.ts +7 -0
  735. package/dist/monitoring/log-entry.d.ts.map +1 -0
  736. package/dist/monitoring/log-entry.js +16 -0
  737. package/dist/monitoring/log-entry.js.map +1 -0
  738. package/dist/monitoring/log-journal.d.ts +40 -0
  739. package/dist/monitoring/log-journal.d.ts.map +1 -0
  740. package/dist/monitoring/log-journal.js +158 -0
  741. package/dist/monitoring/log-journal.js.map +1 -0
  742. package/dist/monitoring/log-line.d.ts +22 -17
  743. package/dist/monitoring/log-line.d.ts.map +1 -1
  744. package/dist/monitoring/log-line.js +73 -62
  745. package/dist/monitoring/log-line.js.map +1 -1
  746. package/dist/monitoring/log-manager.d.ts +37 -40
  747. package/dist/monitoring/log-manager.d.ts.map +1 -1
  748. package/dist/monitoring/log-manager.js +167 -66
  749. package/dist/monitoring/log-manager.js.map +1 -1
  750. package/dist/monitoring/log-sink-health.indicator.d.ts +10 -0
  751. package/dist/monitoring/log-sink-health.indicator.d.ts.map +1 -0
  752. package/dist/monitoring/log-sink-health.indicator.js +21 -0
  753. package/dist/monitoring/log-sink-health.indicator.js.map +1 -0
  754. package/dist/monitoring/metrics-storage.indicator.d.ts +9 -0
  755. package/dist/monitoring/metrics-storage.indicator.d.ts.map +1 -0
  756. package/dist/monitoring/metrics-storage.indicator.js +18 -0
  757. package/dist/monitoring/metrics-storage.indicator.js.map +1 -0
  758. package/dist/monitoring/process-lifetime.d.ts +11 -0
  759. package/dist/monitoring/process-lifetime.d.ts.map +1 -0
  760. package/dist/monitoring/process-lifetime.js +45 -0
  761. package/dist/monitoring/process-lifetime.js.map +1 -0
  762. package/dist/monitoring/runtime-diagnostics.d.ts +47 -0
  763. package/dist/monitoring/runtime-diagnostics.d.ts.map +1 -0
  764. package/dist/monitoring/runtime-diagnostics.js +88 -0
  765. package/dist/monitoring/runtime-diagnostics.js.map +1 -0
  766. package/dist/observability/metrics-bridge.d.ts +5 -1
  767. package/dist/observability/metrics-bridge.d.ts.map +1 -1
  768. package/dist/observability/metrics-bridge.js +11 -0
  769. package/dist/observability/metrics-bridge.js.map +1 -1
  770. package/dist/operations.d.ts +17 -0
  771. package/dist/operations.d.ts.map +1 -0
  772. package/dist/operations.js +13 -0
  773. package/dist/operations.js.map +1 -0
  774. package/dist/orchestrator/app-handle.d.ts +27 -9
  775. package/dist/orchestrator/app-handle.d.ts.map +1 -1
  776. package/dist/orchestrator/app-handle.js +42 -11
  777. package/dist/orchestrator/app-handle.js.map +1 -1
  778. package/dist/orchestrator/application-runtime-child.d.ts +2 -0
  779. package/dist/orchestrator/application-runtime-child.d.ts.map +1 -0
  780. package/dist/orchestrator/application-runtime-child.js +15 -0
  781. package/dist/orchestrator/application-runtime-child.js.map +1 -0
  782. package/dist/orchestrator/application-runtime-resolution.d.ts +4 -0
  783. package/dist/orchestrator/application-runtime-resolution.d.ts.map +1 -0
  784. package/dist/orchestrator/application-runtime-resolution.js +62 -0
  785. package/dist/orchestrator/application-runtime-resolution.js.map +1 -0
  786. package/dist/orchestrator/application-runtime.d.ts +3 -0
  787. package/dist/orchestrator/application-runtime.d.ts.map +1 -0
  788. package/dist/orchestrator/application-runtime.js +20 -0
  789. package/dist/orchestrator/application-runtime.js.map +1 -0
  790. package/dist/orchestrator/application-topology.d.ts +20 -0
  791. package/dist/orchestrator/application-topology.d.ts.map +1 -0
  792. package/dist/orchestrator/application-topology.js +90 -0
  793. package/dist/orchestrator/application-topology.js.map +1 -0
  794. package/dist/orchestrator/bootstrap-loader-child.d.ts +1 -1
  795. package/dist/orchestrator/bootstrap-loader-child.js +7 -16
  796. package/dist/orchestrator/bootstrap-loader-child.js.map +1 -1
  797. package/dist/orchestrator/bootstrap-loader.d.ts +10 -20
  798. package/dist/orchestrator/bootstrap-loader.d.ts.map +1 -1
  799. package/dist/orchestrator/bootstrap-loader.js +24 -207
  800. package/dist/orchestrator/bootstrap-loader.js.map +1 -1
  801. package/dist/orchestrator/bootstrap-process.d.ts +6 -6
  802. package/dist/orchestrator/bootstrap-process.d.ts.map +1 -1
  803. package/dist/orchestrator/bootstrap-process.js +40 -40
  804. package/dist/orchestrator/bootstrap-process.js.map +1 -1
  805. package/dist/orchestrator/build-service.d.ts +8 -14
  806. package/dist/orchestrator/build-service.d.ts.map +1 -1
  807. package/dist/orchestrator/build-service.js +144 -158
  808. package/dist/orchestrator/build-service.js.map +1 -1
  809. package/dist/orchestrator/call-exposed-service.d.ts +8 -0
  810. package/dist/orchestrator/call-exposed-service.d.ts.map +1 -1
  811. package/dist/orchestrator/call-exposed-service.js +1 -1
  812. package/dist/orchestrator/classic-launcher.d.ts +3 -2
  813. package/dist/orchestrator/classic-launcher.d.ts.map +1 -1
  814. package/dist/orchestrator/classic-launcher.js +32 -23
  815. package/dist/orchestrator/classic-launcher.js.map +1 -1
  816. package/dist/orchestrator/dependency-resolver.d.ts.map +1 -1
  817. package/dist/orchestrator/dependency-resolver.js +7 -38
  818. package/dist/orchestrator/dependency-resolver.js.map +1 -1
  819. package/dist/orchestrator/execution-contract.d.ts +67 -0
  820. package/dist/orchestrator/execution-contract.d.ts.map +1 -0
  821. package/dist/orchestrator/execution-contract.js +2 -0
  822. package/dist/orchestrator/execution-contract.js.map +1 -0
  823. package/dist/orchestrator/file-watcher.d.ts +2 -1
  824. package/dist/orchestrator/file-watcher.d.ts.map +1 -1
  825. package/dist/orchestrator/file-watcher.js +23 -5
  826. package/dist/orchestrator/file-watcher.js.map +1 -1
  827. package/dist/orchestrator/http-routes.d.ts +4 -0
  828. package/dist/orchestrator/http-routes.d.ts.map +1 -0
  829. package/dist/orchestrator/http-routes.js +19 -0
  830. package/dist/orchestrator/http-routes.js.map +1 -0
  831. package/dist/orchestrator/installed-execution.d.ts +7 -0
  832. package/dist/orchestrator/installed-execution.d.ts.map +1 -0
  833. package/dist/orchestrator/installed-execution.js +25 -0
  834. package/dist/orchestrator/installed-execution.js.map +1 -0
  835. package/dist/orchestrator/module-worker-process.d.ts.map +1 -1
  836. package/dist/orchestrator/module-worker-process.js +2 -1
  837. package/dist/orchestrator/module-worker-process.js.map +1 -1
  838. package/dist/orchestrator/orchestrator.service.d.ts +105 -80
  839. package/dist/orchestrator/orchestrator.service.d.ts.map +1 -1
  840. package/dist/orchestrator/orchestrator.service.js +1084 -571
  841. package/dist/orchestrator/orchestrator.service.js.map +1 -1
  842. package/dist/orchestrator/process-janitor.d.ts +3 -0
  843. package/dist/orchestrator/process-janitor.d.ts.map +1 -1
  844. package/dist/orchestrator/process-janitor.js +5 -1
  845. package/dist/orchestrator/process-janitor.js.map +1 -1
  846. package/dist/orchestrator/runtime-package-resolution.d.ts +8 -0
  847. package/dist/orchestrator/runtime-package-resolution.d.ts.map +1 -0
  848. package/dist/orchestrator/runtime-package-resolution.js +56 -0
  849. package/dist/orchestrator/runtime-package-resolution.js.map +1 -0
  850. package/dist/orchestrator/service-router.d.ts +4 -108
  851. package/dist/orchestrator/service-router.d.ts.map +1 -1
  852. package/dist/orchestrator/service-router.js +51 -237
  853. package/dist/orchestrator/service-router.js.map +1 -1
  854. package/dist/orchestrator/topology-query.d.ts +1 -1
  855. package/dist/orchestrator/topology-query.js +1 -1
  856. package/dist/orchestrator/ts-compiler.d.ts.map +1 -1
  857. package/dist/orchestrator/ts-compiler.js +9 -17
  858. package/dist/orchestrator/ts-compiler.js.map +1 -1
  859. package/dist/project/artifact-builder.d.ts +17 -7
  860. package/dist/project/artifact-builder.d.ts.map +1 -1
  861. package/dist/project/artifact-builder.js +91 -58
  862. package/dist/project/artifact-builder.js.map +1 -1
  863. package/dist/project/bootstrap-metadata.d.ts +42 -0
  864. package/dist/project/bootstrap-metadata.d.ts.map +1 -0
  865. package/dist/project/bootstrap-metadata.js +76 -0
  866. package/dist/project/bootstrap-metadata.js.map +1 -0
  867. package/dist/project/build-decision.d.ts +1 -1
  868. package/dist/project/build-decision.js +1 -1
  869. package/dist/project/config-resolver.js +4 -4
  870. package/dist/project/config-resolver.js.map +1 -1
  871. package/dist/project/configuration-catalog.d.ts +8 -0
  872. package/dist/project/configuration-catalog.d.ts.map +1 -0
  873. package/dist/project/configuration-catalog.js +29 -0
  874. package/dist/project/configuration-catalog.js.map +1 -0
  875. package/dist/project/declared-config.d.ts +4 -2
  876. package/dist/project/declared-config.d.ts.map +1 -1
  877. package/dist/project/declared-config.js +10 -7
  878. package/dist/project/declared-config.js.map +1 -1
  879. package/dist/project/dependency-topology.d.ts +10 -0
  880. package/dist/project/dependency-topology.d.ts.map +1 -0
  881. package/dist/project/dependency-topology.js +55 -0
  882. package/dist/project/dependency-topology.js.map +1 -0
  883. package/dist/project/deploy-phases.d.ts +1 -1
  884. package/dist/project/deploy-phases.js +1 -1
  885. package/dist/project/exec-in-group.d.ts +1 -1
  886. package/dist/project/exec-in-group.js +1 -1
  887. package/dist/project/infrastructure-ownership.d.ts +5 -0
  888. package/dist/project/infrastructure-ownership.d.ts.map +1 -0
  889. package/dist/project/infrastructure-ownership.js +26 -0
  890. package/dist/project/infrastructure-ownership.js.map +1 -0
  891. package/dist/project/installed-stack-resume.d.ts +62 -0
  892. package/dist/project/installed-stack-resume.d.ts.map +1 -0
  893. package/dist/project/installed-stack-resume.js +261 -0
  894. package/dist/project/installed-stack-resume.js.map +1 -0
  895. package/dist/project/launch-failure.d.ts +3 -0
  896. package/dist/project/launch-failure.d.ts.map +1 -0
  897. package/dist/project/launch-failure.js +32 -0
  898. package/dist/project/launch-failure.js.map +1 -0
  899. package/dist/project/local-release-selection.d.ts +18 -0
  900. package/dist/project/local-release-selection.d.ts.map +1 -0
  901. package/dist/project/local-release-selection.js +36 -0
  902. package/dist/project/local-release-selection.js.map +1 -0
  903. package/dist/project/node-app-config.d.ts +10 -3
  904. package/dist/project/node-app-config.d.ts.map +1 -1
  905. package/dist/project/node-app-config.js +22 -30
  906. package/dist/project/node-app-config.js.map +1 -1
  907. package/dist/project/node-app-health.d.ts +1 -1
  908. package/dist/project/node-app-health.js +1 -1
  909. package/dist/project/node-stack-stop.d.ts +83 -0
  910. package/dist/project/node-stack-stop.d.ts.map +1 -0
  911. package/dist/project/node-stack-stop.js +219 -0
  912. package/dist/project/node-stack-stop.js.map +1 -0
  913. package/dist/project/operator-account.d.ts +9 -3
  914. package/dist/project/operator-account.d.ts.map +1 -1
  915. package/dist/project/operator-account.js +9 -9
  916. package/dist/project/operator-account.js.map +1 -1
  917. package/dist/project/public-stack.d.ts +4 -0
  918. package/dist/project/public-stack.d.ts.map +1 -0
  919. package/dist/project/public-stack.js +29 -0
  920. package/dist/project/public-stack.js.map +1 -0
  921. package/dist/project/registry.d.ts +18 -27
  922. package/dist/project/registry.d.ts.map +1 -1
  923. package/dist/project/registry.js +248 -77
  924. package/dist/project/registry.js.map +1 -1
  925. package/dist/project/requirements-scanner.d.ts +4 -8
  926. package/dist/project/requirements-scanner.d.ts.map +1 -1
  927. package/dist/project/requirements-scanner.js +39 -146
  928. package/dist/project/requirements-scanner.js.map +1 -1
  929. package/dist/project/stack-diagnosis.d.ts +18 -0
  930. package/dist/project/stack-diagnosis.d.ts.map +1 -0
  931. package/dist/project/stack-diagnosis.js +94 -0
  932. package/dist/project/stack-diagnosis.js.map +1 -0
  933. package/dist/project/stack-env.d.ts +1 -1
  934. package/dist/project/stack-env.js +1 -1
  935. package/dist/project/stack-health.d.ts +12 -0
  936. package/dist/project/stack-health.d.ts.map +1 -0
  937. package/dist/project/stack-health.js +27 -0
  938. package/dist/project/stack-health.js.map +1 -0
  939. package/dist/project/stack-observation.d.ts +8 -0
  940. package/dist/project/stack-observation.d.ts.map +1 -0
  941. package/dist/project/stack-observation.js +126 -0
  942. package/dist/project/stack-observation.js.map +1 -0
  943. package/dist/project/stack-placement.d.ts +11 -0
  944. package/dist/project/stack-placement.d.ts.map +1 -0
  945. package/dist/project/stack-placement.js +57 -0
  946. package/dist/project/stack-placement.js.map +1 -0
  947. package/dist/project/stack-stop-review.d.ts +14 -0
  948. package/dist/project/stack-stop-review.d.ts.map +1 -0
  949. package/dist/project/stack-stop-review.js +22 -0
  950. package/dist/project/stack-stop-review.js.map +1 -0
  951. package/dist/project/stack-targets.d.ts +24 -0
  952. package/dist/project/stack-targets.d.ts.map +1 -0
  953. package/dist/project/stack-targets.js +67 -0
  954. package/dist/project/stack-targets.js.map +1 -0
  955. package/dist/project/stand-containers.d.ts +9 -2
  956. package/dist/project/stand-containers.d.ts.map +1 -1
  957. package/dist/project/stand-containers.js +17 -17
  958. package/dist/project/stand-containers.js.map +1 -1
  959. package/dist/project/topology-control.d.ts +41 -0
  960. package/dist/project/topology-control.d.ts.map +1 -0
  961. package/dist/project/topology-control.js +133 -0
  962. package/dist/project/topology-control.js.map +1 -0
  963. package/dist/project/topology-plan.d.ts +11 -0
  964. package/dist/project/topology-plan.d.ts.map +1 -0
  965. package/dist/project/topology-plan.js +154 -0
  966. package/dist/project/topology-plan.js.map +1 -0
  967. package/dist/project/topology-services.d.ts +7 -0
  968. package/dist/project/topology-services.d.ts.map +1 -0
  969. package/dist/project/topology-services.js +36 -0
  970. package/dist/project/topology-services.js.map +1 -0
  971. package/dist/project/topology-state.d.ts +27 -0
  972. package/dist/project/topology-state.d.ts.map +1 -0
  973. package/dist/project/topology-state.js +71 -0
  974. package/dist/project/topology-state.js.map +1 -0
  975. package/dist/project/workspace-kind.d.ts +3 -0
  976. package/dist/project/workspace-kind.d.ts.map +1 -0
  977. package/dist/project/workspace-kind.js +13 -0
  978. package/dist/project/workspace-kind.js.map +1 -0
  979. package/dist/readiness.d.ts +4 -0
  980. package/dist/readiness.d.ts.map +1 -0
  981. package/dist/readiness.js +3 -0
  982. package/dist/readiness.js.map +1 -0
  983. package/dist/release/application-closure.d.ts +4 -0
  984. package/dist/release/application-closure.d.ts.map +1 -0
  985. package/dist/release/application-closure.js +61 -0
  986. package/dist/release/application-closure.js.map +1 -0
  987. package/dist/release/archive.d.ts +3 -0
  988. package/dist/release/archive.d.ts.map +1 -0
  989. package/dist/release/archive.js +3 -0
  990. package/dist/release/archive.js.map +1 -0
  991. package/dist/release/artifact-inspection.d.ts +50 -0
  992. package/dist/release/artifact-inspection.d.ts.map +1 -0
  993. package/dist/release/artifact-inspection.js +169 -0
  994. package/dist/release/artifact-inspection.js.map +1 -0
  995. package/dist/release/artifact-store.d.ts +1 -1
  996. package/dist/release/artifact-store.d.ts.map +1 -1
  997. package/dist/release/artifact-store.js +1 -1
  998. package/dist/release/artifact-store.js.map +1 -1
  999. package/dist/release/artifact-volumes.d.ts +10 -0
  1000. package/dist/release/artifact-volumes.d.ts.map +1 -0
  1001. package/dist/release/artifact-volumes.js +112 -0
  1002. package/dist/release/artifact-volumes.js.map +1 -0
  1003. package/dist/release/attest-on-node.d.ts +3 -2
  1004. package/dist/release/attest-on-node.d.ts.map +1 -1
  1005. package/dist/release/attest-on-node.js +6 -6
  1006. package/dist/release/attest-on-node.js.map +1 -1
  1007. package/dist/release/attest.d.ts +3 -3
  1008. package/dist/release/attest.js +1 -1
  1009. package/dist/release/build-run.d.ts +14 -17
  1010. package/dist/release/build-run.d.ts.map +1 -1
  1011. package/dist/release/build-run.js +264 -77
  1012. package/dist/release/build-run.js.map +1 -1
  1013. package/dist/release/builder.d.ts +9 -3
  1014. package/dist/release/builder.d.ts.map +1 -1
  1015. package/dist/release/builder.js +19 -5
  1016. package/dist/release/builder.js.map +1 -1
  1017. package/dist/release/closure-library-path.d.ts +26 -0
  1018. package/dist/release/closure-library-path.d.ts.map +1 -0
  1019. package/dist/release/closure-library-path.js +160 -0
  1020. package/dist/release/closure-library-path.js.map +1 -0
  1021. package/dist/release/definition-inputs.d.ts +7 -4
  1022. package/dist/release/definition-inputs.d.ts.map +1 -1
  1023. package/dist/release/definition-inputs.js +146 -15
  1024. package/dist/release/definition-inputs.js.map +1 -1
  1025. package/dist/release/framework-source.d.ts +22 -0
  1026. package/dist/release/framework-source.d.ts.map +1 -0
  1027. package/dist/release/framework-source.js +54 -0
  1028. package/dist/release/framework-source.js.map +1 -0
  1029. package/dist/release/frozen-installation.d.ts +23 -0
  1030. package/dist/release/frozen-installation.d.ts.map +1 -0
  1031. package/dist/release/frozen-installation.js +159 -0
  1032. package/dist/release/frozen-installation.js.map +1 -0
  1033. package/dist/release/import-artifacts.d.ts +9 -0
  1034. package/dist/release/import-artifacts.d.ts.map +1 -0
  1035. package/dist/release/import-artifacts.js +60 -0
  1036. package/dist/release/import-artifacts.js.map +1 -0
  1037. package/dist/release/infrastructure.d.ts +6 -0
  1038. package/dist/release/infrastructure.d.ts.map +1 -0
  1039. package/dist/release/infrastructure.js +74 -0
  1040. package/dist/release/infrastructure.js.map +1 -0
  1041. package/dist/release/installed-artifacts.d.ts +12 -0
  1042. package/dist/release/installed-artifacts.d.ts.map +1 -0
  1043. package/dist/release/installed-artifacts.js +199 -0
  1044. package/dist/release/installed-artifacts.js.map +1 -0
  1045. package/dist/release/installed-graph.d.ts +28 -0
  1046. package/dist/release/installed-graph.d.ts.map +1 -0
  1047. package/dist/release/installed-graph.js +138 -0
  1048. package/dist/release/installed-graph.js.map +1 -0
  1049. package/dist/release/installed-origin.d.ts +42 -0
  1050. package/dist/release/installed-origin.d.ts.map +1 -0
  1051. package/dist/release/installed-origin.js +130 -0
  1052. package/dist/release/installed-origin.js.map +1 -0
  1053. package/dist/release/installed-release.d.ts +23 -0
  1054. package/dist/release/installed-release.d.ts.map +1 -0
  1055. package/dist/release/installed-release.js +141 -0
  1056. package/dist/release/installed-release.js.map +1 -0
  1057. package/dist/release/layout.d.ts +29 -34
  1058. package/dist/release/layout.d.ts.map +1 -1
  1059. package/dist/release/layout.js +164 -53
  1060. package/dist/release/layout.js.map +1 -1
  1061. package/dist/release/load.d.ts +3 -0
  1062. package/dist/release/load.d.ts.map +1 -1
  1063. package/dist/release/load.js +50 -8
  1064. package/dist/release/load.js.map +1 -1
  1065. package/dist/release/local-installation.d.ts +20 -0
  1066. package/dist/release/local-installation.d.ts.map +1 -0
  1067. package/dist/release/local-installation.js +298 -0
  1068. package/dist/release/local-installation.js.map +1 -0
  1069. package/dist/release/manifest.d.ts +87 -12
  1070. package/dist/release/manifest.d.ts.map +1 -1
  1071. package/dist/release/manifest.js +31 -7
  1072. package/dist/release/manifest.js.map +1 -1
  1073. package/dist/release/migration-programs.d.ts +12 -0
  1074. package/dist/release/migration-programs.d.ts.map +1 -0
  1075. package/dist/release/migration-programs.js +45 -0
  1076. package/dist/release/migration-programs.js.map +1 -0
  1077. package/dist/release/migrations.d.ts +12 -1
  1078. package/dist/release/migrations.d.ts.map +1 -1
  1079. package/dist/release/migrations.js +124 -9
  1080. package/dist/release/migrations.js.map +1 -1
  1081. package/dist/release/origin.d.ts +33 -0
  1082. package/dist/release/origin.d.ts.map +1 -0
  1083. package/dist/release/origin.js +253 -0
  1084. package/dist/release/origin.js.map +1 -0
  1085. package/dist/release/owner-admission.d.ts +15 -0
  1086. package/dist/release/owner-admission.d.ts.map +1 -0
  1087. package/dist/release/owner-admission.js +37 -0
  1088. package/dist/release/owner-admission.js.map +1 -0
  1089. package/dist/release/owner-executable.d.ts +3 -0
  1090. package/dist/release/owner-executable.d.ts.map +1 -0
  1091. package/dist/release/owner-executable.js +40 -0
  1092. package/dist/release/owner-executable.js.map +1 -0
  1093. package/dist/release/package-gates.d.ts +9 -0
  1094. package/dist/release/package-gates.d.ts.map +1 -0
  1095. package/dist/release/package-gates.js +42 -0
  1096. package/dist/release/package-gates.js.map +1 -0
  1097. package/dist/release/package-resolution.d.ts +4 -0
  1098. package/dist/release/package-resolution.d.ts.map +1 -0
  1099. package/dist/release/package-resolution.js +28 -0
  1100. package/dist/release/package-resolution.js.map +1 -0
  1101. package/dist/release/portable-archive.d.ts +12 -0
  1102. package/dist/release/portable-archive.d.ts.map +1 -0
  1103. package/dist/release/portable-archive.js +96 -0
  1104. package/dist/release/portable-archive.js.map +1 -0
  1105. package/dist/release/publish.d.ts +1 -1
  1106. package/dist/release/publish.js +1 -1
  1107. package/dist/release/registry-download.d.ts +2 -0
  1108. package/dist/release/registry-download.d.ts.map +1 -0
  1109. package/dist/release/registry-download.js +157 -0
  1110. package/dist/release/registry-download.js.map +1 -0
  1111. package/dist/release/registry-framework.d.ts +39 -0
  1112. package/dist/release/registry-framework.d.ts.map +1 -0
  1113. package/dist/release/registry-framework.js +279 -0
  1114. package/dist/release/registry-framework.js.map +1 -0
  1115. package/dist/release/registry-transport.d.ts +27 -0
  1116. package/dist/release/registry-transport.d.ts.map +1 -0
  1117. package/dist/release/registry-transport.js +96 -0
  1118. package/dist/release/registry-transport.js.map +1 -0
  1119. package/dist/release/repository-identity.d.ts +12 -0
  1120. package/dist/release/repository-identity.d.ts.map +1 -0
  1121. package/dist/release/repository-identity.js +62 -0
  1122. package/dist/release/repository-identity.js.map +1 -0
  1123. package/dist/release/runtime-extractor.d.ts +4 -0
  1124. package/dist/release/runtime-extractor.d.ts.map +1 -0
  1125. package/dist/release/runtime-extractor.js +15 -0
  1126. package/dist/release/runtime-extractor.js.map +1 -0
  1127. package/dist/release/runtime-provenance.d.ts +40 -0
  1128. package/dist/release/runtime-provenance.d.ts.map +1 -0
  1129. package/dist/release/runtime-provenance.js +229 -0
  1130. package/dist/release/runtime-provenance.js.map +1 -0
  1131. package/dist/release/source.d.ts +12 -0
  1132. package/dist/release/source.d.ts.map +1 -0
  1133. package/dist/release/source.js +168 -0
  1134. package/dist/release/source.js.map +1 -0
  1135. package/dist/release/store.d.ts +14 -5
  1136. package/dist/release/store.d.ts.map +1 -1
  1137. package/dist/release/store.js +73 -17
  1138. package/dist/release/store.js.map +1 -1
  1139. package/dist/release/target-runtime.d.ts +19 -0
  1140. package/dist/release/target-runtime.d.ts.map +1 -0
  1141. package/dist/release/target-runtime.js +41 -0
  1142. package/dist/release/target-runtime.js.map +1 -0
  1143. package/dist/release/vendored-framework.d.ts +28 -0
  1144. package/dist/release/vendored-framework.d.ts.map +1 -0
  1145. package/dist/release/vendored-framework.js +98 -0
  1146. package/dist/release/vendored-framework.js.map +1 -0
  1147. package/dist/release/workspace-source.d.ts +3 -0
  1148. package/dist/release/workspace-source.d.ts.map +1 -0
  1149. package/dist/release/workspace-source.js +33 -0
  1150. package/dist/release/workspace-source.js.map +1 -0
  1151. package/dist/runtime/context.d.ts +29 -0
  1152. package/dist/runtime/context.d.ts.map +1 -0
  1153. package/dist/runtime/context.js +111 -0
  1154. package/dist/runtime/context.js.map +1 -0
  1155. package/dist/runtime/identity.d.ts +15 -0
  1156. package/dist/runtime/identity.d.ts.map +1 -0
  1157. package/dist/runtime/identity.js +33 -0
  1158. package/dist/runtime/identity.js.map +1 -0
  1159. package/dist/runtime/index.d.ts +3 -0
  1160. package/dist/runtime/index.d.ts.map +1 -0
  1161. package/dist/runtime/index.js +3 -0
  1162. package/dist/runtime/index.js.map +1 -0
  1163. package/dist/services/access.rpc-service.d.ts +41 -0
  1164. package/dist/services/access.rpc-service.d.ts.map +1 -0
  1165. package/dist/services/access.rpc-service.js +248 -0
  1166. package/dist/services/access.rpc-service.js.map +1 -0
  1167. package/dist/services/alert.service.d.ts +3 -3
  1168. package/dist/services/alert.service.d.ts.map +1 -1
  1169. package/dist/services/alert.service.js +3 -3
  1170. package/dist/services/anonymous-input.d.ts +0 -21
  1171. package/dist/services/anonymous-input.d.ts.map +1 -1
  1172. package/dist/services/anonymous-input.js +1 -27
  1173. package/dist/services/anonymous-input.js.map +1 -1
  1174. package/dist/services/audit.service.d.ts +10 -30
  1175. package/dist/services/audit.service.d.ts.map +1 -1
  1176. package/dist/services/audit.service.js +72 -18
  1177. package/dist/services/audit.service.js.map +1 -1
  1178. package/dist/services/auth-context.d.ts +2 -0
  1179. package/dist/services/auth-context.d.ts.map +1 -1
  1180. package/dist/services/auth-context.js +4 -1
  1181. package/dist/services/auth-context.js.map +1 -1
  1182. package/dist/services/auth.rpc-service.d.ts +3 -1
  1183. package/dist/services/auth.rpc-service.d.ts.map +1 -1
  1184. package/dist/services/auth.rpc-service.js +13 -3
  1185. package/dist/services/auth.rpc-service.js.map +1 -1
  1186. package/dist/services/auth.service.d.ts +11 -21
  1187. package/dist/services/auth.service.d.ts.map +1 -1
  1188. package/dist/services/auth.service.js +125 -139
  1189. package/dist/services/auth.service.js.map +1 -1
  1190. package/dist/services/backup-pipeline.d.ts +1 -1
  1191. package/dist/services/backup-pipeline.js +1 -1
  1192. package/dist/services/backup-storage.d.ts +14 -0
  1193. package/dist/services/backup-storage.d.ts.map +1 -0
  1194. package/dist/services/backup-storage.js +195 -0
  1195. package/dist/services/backup-storage.js.map +1 -0
  1196. package/dist/services/backup.rpc-service.d.ts +2 -0
  1197. package/dist/services/backup.rpc-service.d.ts.map +1 -1
  1198. package/dist/services/backup.rpc-service.js +9 -0
  1199. package/dist/services/backup.rpc-service.js.map +1 -1
  1200. package/dist/services/backup.service.d.ts +36 -129
  1201. package/dist/services/backup.service.d.ts.map +1 -1
  1202. package/dist/services/backup.service.js +177 -156
  1203. package/dist/services/backup.service.js.map +1 -1
  1204. package/dist/services/bundle-builder.d.ts +27 -12
  1205. package/dist/services/bundle-builder.d.ts.map +1 -1
  1206. package/dist/services/bundle-builder.js +192 -101
  1207. package/dist/services/bundle-builder.js.map +1 -1
  1208. package/dist/services/bundle-overrides.d.ts +25 -0
  1209. package/dist/services/bundle-overrides.d.ts.map +1 -0
  1210. package/dist/services/bundle-overrides.js +96 -0
  1211. package/dist/services/bundle-overrides.js.map +1 -0
  1212. package/dist/services/daemon-authority.d.ts +16 -0
  1213. package/dist/services/daemon-authority.d.ts.map +1 -0
  1214. package/dist/services/daemon-authority.js +54 -0
  1215. package/dist/services/daemon-authority.js.map +1 -0
  1216. package/dist/services/daemon-principal.d.ts +31 -0
  1217. package/dist/services/daemon-principal.d.ts.map +1 -0
  1218. package/dist/services/daemon-principal.js +37 -0
  1219. package/dist/services/daemon-principal.js.map +1 -0
  1220. package/dist/services/deploy.service.d.ts +13 -57
  1221. package/dist/services/deploy.service.d.ts.map +1 -1
  1222. package/dist/services/deploy.service.js +15 -263
  1223. package/dist/services/deploy.service.js.map +1 -1
  1224. package/dist/services/discovery.service.d.ts +1 -1
  1225. package/dist/services/discovery.service.js +1 -1
  1226. package/dist/services/event-broadcaster.rpc-service.d.ts +7 -1
  1227. package/dist/services/event-broadcaster.rpc-service.d.ts.map +1 -1
  1228. package/dist/services/event-broadcaster.rpc-service.js +89 -11
  1229. package/dist/services/event-broadcaster.rpc-service.js.map +1 -1
  1230. package/dist/services/fleet.rpc-service.d.ts +0 -6
  1231. package/dist/services/fleet.rpc-service.d.ts.map +1 -1
  1232. package/dist/services/fleet.rpc-service.js +0 -13
  1233. package/dist/services/fleet.rpc-service.js.map +1 -1
  1234. package/dist/services/health-check.service.d.ts +1 -1
  1235. package/dist/services/health-check.service.d.ts.map +1 -1
  1236. package/dist/services/health-check.service.js +30 -5
  1237. package/dist/services/health-check.service.js.map +1 -1
  1238. package/dist/services/host-operation-barrier.d.ts +8 -0
  1239. package/dist/services/host-operation-barrier.d.ts.map +1 -0
  1240. package/dist/services/host-operation-barrier.js +44 -0
  1241. package/dist/services/host-operation-barrier.js.map +1 -0
  1242. package/dist/services/host-upgrade.d.ts +181 -0
  1243. package/dist/services/host-upgrade.d.ts.map +1 -0
  1244. package/dist/services/host-upgrade.js +503 -0
  1245. package/dist/services/host-upgrade.js.map +1 -0
  1246. package/dist/services/infrastructure.rpc-service.d.ts +24 -2
  1247. package/dist/services/infrastructure.rpc-service.d.ts.map +1 -1
  1248. package/dist/services/infrastructure.rpc-service.js +178 -36
  1249. package/dist/services/infrastructure.rpc-service.js.map +1 -1
  1250. package/dist/services/kernel-catalog.d.ts +14 -0
  1251. package/dist/services/kernel-catalog.d.ts.map +1 -0
  1252. package/dist/services/kernel-catalog.js +172 -0
  1253. package/dist/services/kernel-catalog.js.map +1 -0
  1254. package/dist/services/kernel-distribution.d.ts +5 -0
  1255. package/dist/services/kernel-distribution.d.ts.map +1 -0
  1256. package/dist/services/kernel-distribution.js +49 -0
  1257. package/dist/services/kernel-distribution.js.map +1 -0
  1258. package/dist/services/kernel-rollout.service.d.ts +55 -0
  1259. package/dist/services/kernel-rollout.service.d.ts.map +1 -0
  1260. package/dist/services/kernel-rollout.service.js +394 -0
  1261. package/dist/services/kernel-rollout.service.js.map +1 -0
  1262. package/dist/services/local-bundle.d.ts +9 -0
  1263. package/dist/services/local-bundle.d.ts.map +1 -1
  1264. package/dist/services/local-bundle.js +14 -3
  1265. package/dist/services/local-bundle.js.map +1 -1
  1266. package/dist/services/log-collector.rpc-service.d.ts +5 -11
  1267. package/dist/services/log-collector.rpc-service.d.ts.map +1 -1
  1268. package/dist/services/log-collector.rpc-service.js +6 -6
  1269. package/dist/services/log-collector.rpc-service.js.map +1 -1
  1270. package/dist/services/log-collector.service.d.ts +39 -109
  1271. package/dist/services/log-collector.service.d.ts.map +1 -1
  1272. package/dist/services/log-collector.service.js +286 -261
  1273. package/dist/services/log-collector.service.js.map +1 -1
  1274. package/dist/services/log-query.d.ts +6 -0
  1275. package/dist/services/log-query.d.ts.map +1 -0
  1276. package/dist/services/log-query.js +46 -0
  1277. package/dist/services/log-query.js.map +1 -0
  1278. package/dist/services/maintenance-lock.d.ts +2 -2
  1279. package/dist/services/maintenance-lock.d.ts.map +1 -1
  1280. package/dist/services/maintenance-lock.js +1 -1
  1281. package/dist/services/managed-rollout.d.ts +54 -0
  1282. package/dist/services/managed-rollout.d.ts.map +1 -0
  1283. package/dist/services/managed-rollout.js +124 -0
  1284. package/dist/services/managed-rollout.js.map +1 -0
  1285. package/dist/services/metrics.rpc-service.d.ts +23 -0
  1286. package/dist/services/metrics.rpc-service.d.ts.map +1 -0
  1287. package/dist/services/metrics.rpc-service.js +73 -0
  1288. package/dist/services/metrics.rpc-service.js.map +1 -0
  1289. package/dist/services/migration-output.d.ts +2 -2
  1290. package/dist/services/migration-output.js +2 -2
  1291. package/dist/services/migration-process.d.ts +32 -0
  1292. package/dist/services/migration-process.d.ts.map +1 -0
  1293. package/dist/services/migration-process.js +71 -0
  1294. package/dist/services/migration-process.js.map +1 -0
  1295. package/dist/services/migration-target.d.ts +57 -0
  1296. package/dist/services/migration-target.d.ts.map +1 -0
  1297. package/dist/services/migration-target.js +221 -0
  1298. package/dist/services/migration-target.js.map +1 -0
  1299. package/dist/services/node-deploy-lease.d.ts +19 -2
  1300. package/dist/services/node-deploy-lease.d.ts.map +1 -1
  1301. package/dist/services/node-deploy-lease.js +84 -10
  1302. package/dist/services/node-deploy-lease.js.map +1 -1
  1303. package/dist/services/node-health.repository.d.ts +2 -59
  1304. package/dist/services/node-health.repository.d.ts.map +1 -1
  1305. package/dist/services/node-health.repository.js.map +1 -1
  1306. package/dist/services/node-host-key.d.ts +9 -0
  1307. package/dist/services/node-host-key.d.ts.map +1 -0
  1308. package/dist/services/node-host-key.js +17 -0
  1309. package/dist/services/node-host-key.js.map +1 -0
  1310. package/dist/services/node-manager.rpc-service.d.ts +50 -38
  1311. package/dist/services/node-manager.rpc-service.d.ts.map +1 -1
  1312. package/dist/services/node-manager.rpc-service.js +233 -38
  1313. package/dist/services/node-manager.rpc-service.js.map +1 -1
  1314. package/dist/services/node-manager.service.d.ts +4 -1
  1315. package/dist/services/node-manager.service.d.ts.map +1 -1
  1316. package/dist/services/node-manager.service.js +79 -28
  1317. package/dist/services/node-manager.service.js.map +1 -1
  1318. package/dist/services/node-registration.d.ts +17 -0
  1319. package/dist/services/node-registration.d.ts.map +1 -0
  1320. package/dist/services/node-registration.js +73 -0
  1321. package/dist/services/node-registration.js.map +1 -0
  1322. package/dist/services/node-upgrade.d.ts +1 -1
  1323. package/dist/services/node-upgrade.service.d.ts +2 -28
  1324. package/dist/services/node-upgrade.service.d.ts.map +1 -1
  1325. package/dist/services/node-upgrade.service.js +2 -3
  1326. package/dist/services/node-upgrade.service.js.map +1 -1
  1327. package/dist/services/pipeline-definition.d.ts +14 -0
  1328. package/dist/services/pipeline-definition.d.ts.map +1 -0
  1329. package/dist/services/pipeline-definition.js +77 -0
  1330. package/dist/services/pipeline-definition.js.map +1 -0
  1331. package/dist/services/pipeline.rpc-service.d.ts +14 -3
  1332. package/dist/services/pipeline.rpc-service.d.ts.map +1 -1
  1333. package/dist/services/pipeline.rpc-service.js +45 -12
  1334. package/dist/services/pipeline.rpc-service.js.map +1 -1
  1335. package/dist/services/pipeline.service.d.ts +30 -44
  1336. package/dist/services/pipeline.service.d.ts.map +1 -1
  1337. package/dist/services/pipeline.service.js +402 -333
  1338. package/dist/services/pipeline.service.js.map +1 -1
  1339. package/dist/services/project.rpc-service.d.ts +219 -14
  1340. package/dist/services/project.rpc-service.d.ts.map +1 -1
  1341. package/dist/services/project.rpc-service.js +314 -31
  1342. package/dist/services/project.rpc-service.js.map +1 -1
  1343. package/dist/services/project.service.d.ts +195 -67
  1344. package/dist/services/project.service.d.ts.map +1 -1
  1345. package/dist/services/project.service.js +2029 -705
  1346. package/dist/services/project.service.js.map +1 -1
  1347. package/dist/services/redeploy-decision.d.ts +2 -2
  1348. package/dist/services/redeploy-decision.js +1 -1
  1349. package/dist/services/release.rpc-service.d.ts +6 -19
  1350. package/dist/services/release.rpc-service.d.ts.map +1 -1
  1351. package/dist/services/release.rpc-service.js +35 -12
  1352. package/dist/services/release.rpc-service.js.map +1 -1
  1353. package/dist/services/release.service.d.ts +2 -47
  1354. package/dist/services/release.service.d.ts.map +1 -1
  1355. package/dist/services/release.service.js +26 -2
  1356. package/dist/services/release.service.js.map +1 -1
  1357. package/dist/services/remote-deployer.service.d.ts +65 -126
  1358. package/dist/services/remote-deployer.service.d.ts.map +1 -1
  1359. package/dist/services/remote-deployer.service.js +671 -466
  1360. package/dist/services/remote-deployer.service.js.map +1 -1
  1361. package/dist/services/remote-provisioner.d.ts +3 -1
  1362. package/dist/services/remote-provisioner.d.ts.map +1 -1
  1363. package/dist/services/remote-provisioner.js +2 -2
  1364. package/dist/services/remote-provisioner.js.map +1 -1
  1365. package/dist/services/replication-evidence.d.ts +24 -0
  1366. package/dist/services/replication-evidence.d.ts.map +1 -0
  1367. package/dist/services/replication-evidence.js +61 -0
  1368. package/dist/services/replication-evidence.js.map +1 -0
  1369. package/dist/services/replication-history.d.ts +80 -0
  1370. package/dist/services/replication-history.d.ts.map +1 -0
  1371. package/dist/services/replication-history.js +279 -0
  1372. package/dist/services/replication-history.js.map +1 -0
  1373. package/dist/services/replication-reconciliation.d.ts +74 -0
  1374. package/dist/services/replication-reconciliation.d.ts.map +1 -0
  1375. package/dist/services/replication-reconciliation.js +351 -0
  1376. package/dist/services/replication-reconciliation.js.map +1 -0
  1377. package/dist/services/slave-storage.service.d.ts +2 -19
  1378. package/dist/services/slave-storage.service.d.ts.map +1 -1
  1379. package/dist/services/slave-storage.service.js +19 -6
  1380. package/dist/services/slave-storage.service.js.map +1 -1
  1381. package/dist/services/static-carry-forward.d.ts +28 -3
  1382. package/dist/services/static-carry-forward.d.ts.map +1 -1
  1383. package/dist/services/static-carry-forward.js +285 -4
  1384. package/dist/services/static-carry-forward.js.map +1 -1
  1385. package/dist/services/sync-summary.d.ts.map +1 -1
  1386. package/dist/services/sync-summary.js +1 -18
  1387. package/dist/services/sync-summary.js.map +1 -1
  1388. package/dist/services/sync.rpc-service.d.ts +17 -20
  1389. package/dist/services/sync.rpc-service.d.ts.map +1 -1
  1390. package/dist/services/sync.rpc-service.js +23 -37
  1391. package/dist/services/sync.rpc-service.js.map +1 -1
  1392. package/dist/services/sync.service.d.ts +53 -157
  1393. package/dist/services/sync.service.d.ts.map +1 -1
  1394. package/dist/services/sync.service.js +239 -337
  1395. package/dist/services/sync.service.js.map +1 -1
  1396. package/dist/services/system-info.rpc-service.d.ts +3 -1
  1397. package/dist/services/system-info.rpc-service.d.ts.map +1 -1
  1398. package/dist/services/system-info.rpc-service.js +5 -5
  1399. package/dist/services/system-info.rpc-service.js.map +1 -1
  1400. package/dist/services/system-info.service.d.ts +3 -1
  1401. package/dist/services/system-info.service.d.ts.map +1 -1
  1402. package/dist/services/system-info.service.js +17 -9
  1403. package/dist/services/system-info.service.js.map +1 -1
  1404. package/dist/services/telemetry.rpc-service.d.ts +4 -23
  1405. package/dist/services/telemetry.rpc-service.d.ts.map +1 -1
  1406. package/dist/services/telemetry.rpc-service.js +4 -32
  1407. package/dist/services/telemetry.rpc-service.js.map +1 -1
  1408. package/dist/services/telemetry.service.d.ts +2 -30
  1409. package/dist/services/telemetry.service.d.ts.map +1 -1
  1410. package/dist/services/telemetry.service.js +25 -131
  1411. package/dist/services/telemetry.service.js.map +1 -1
  1412. package/dist/services/terminal-ssh.d.ts +16 -0
  1413. package/dist/services/terminal-ssh.d.ts.map +1 -0
  1414. package/dist/services/terminal-ssh.js +101 -0
  1415. package/dist/services/terminal-ssh.js.map +1 -0
  1416. package/dist/services/terminal.rpc-service.d.ts +84 -0
  1417. package/dist/services/terminal.rpc-service.d.ts.map +1 -0
  1418. package/dist/services/terminal.rpc-service.js +508 -0
  1419. package/dist/services/terminal.rpc-service.js.map +1 -0
  1420. package/dist/services/trace-collector.rpc-service.js +3 -3
  1421. package/dist/services/trace-collector.rpc-service.js.map +1 -1
  1422. package/dist/services/wait-for-postgres.d.ts +1 -1
  1423. package/dist/services/wait-for-postgres.d.ts.map +1 -1
  1424. package/dist/services/wait-for-postgres.js +13 -28
  1425. package/dist/services/wait-for-postgres.js.map +1 -1
  1426. package/dist/shared/build-stamp.d.ts +4 -1
  1427. package/dist/shared/build-stamp.d.ts.map +1 -1
  1428. package/dist/shared/build-stamp.js +14 -6
  1429. package/dist/shared/build-stamp.js.map +1 -1
  1430. package/dist/shared/describe-error.d.ts +1 -21
  1431. package/dist/shared/describe-error.d.ts.map +1 -1
  1432. package/dist/shared/describe-error.js +1 -38
  1433. package/dist/shared/describe-error.js.map +1 -1
  1434. package/dist/shared/dto/access.d.ts +55 -0
  1435. package/dist/shared/dto/access.d.ts.map +1 -0
  1436. package/dist/shared/dto/access.js +2 -0
  1437. package/dist/shared/dto/access.js.map +1 -0
  1438. package/dist/shared/dto/audit.d.ts +32 -0
  1439. package/dist/shared/dto/audit.d.ts.map +1 -0
  1440. package/dist/shared/dto/audit.js +3 -0
  1441. package/dist/shared/dto/audit.js.map +1 -0
  1442. package/dist/shared/dto/auth.d.ts +2 -0
  1443. package/dist/shared/dto/auth.d.ts.map +1 -1
  1444. package/dist/shared/dto/auth.js +5 -1
  1445. package/dist/shared/dto/auth.js.map +1 -1
  1446. package/dist/shared/dto/backend.d.ts +50 -0
  1447. package/dist/shared/dto/backend.d.ts.map +1 -0
  1448. package/dist/shared/dto/backend.js +3 -0
  1449. package/dist/shared/dto/backend.js.map +1 -0
  1450. package/dist/shared/dto/backups.d.ts +99 -0
  1451. package/dist/shared/dto/backups.d.ts.map +1 -1
  1452. package/dist/shared/dto/cluster.d.ts +44 -0
  1453. package/dist/shared/dto/cluster.d.ts.map +1 -0
  1454. package/dist/shared/dto/cluster.js +3 -0
  1455. package/dist/shared/dto/cluster.js.map +1 -0
  1456. package/dist/shared/dto/files.d.ts +328 -0
  1457. package/dist/shared/dto/files.d.ts.map +1 -0
  1458. package/dist/shared/dto/files.js +2 -0
  1459. package/dist/shared/dto/files.js.map +1 -0
  1460. package/dist/shared/dto/health.d.ts +59 -0
  1461. package/dist/shared/dto/health.d.ts.map +1 -1
  1462. package/dist/shared/dto/installed-release.d.ts +40 -0
  1463. package/dist/shared/dto/installed-release.d.ts.map +1 -0
  1464. package/dist/shared/dto/installed-release.js +2 -0
  1465. package/dist/shared/dto/installed-release.js.map +1 -0
  1466. package/dist/shared/dto/kernel-catalog.d.ts +11 -0
  1467. package/dist/shared/dto/kernel-catalog.d.ts.map +1 -0
  1468. package/dist/shared/dto/kernel-catalog.js +2 -0
  1469. package/dist/shared/dto/kernel-catalog.js.map +1 -0
  1470. package/dist/shared/dto/logs.d.ts +21 -0
  1471. package/dist/shared/dto/logs.d.ts.map +1 -1
  1472. package/dist/shared/dto/metrics.d.ts +4 -64
  1473. package/dist/shared/dto/metrics.d.ts.map +1 -1
  1474. package/dist/shared/dto/metrics.js +0 -15
  1475. package/dist/shared/dto/metrics.js.map +1 -1
  1476. package/dist/shared/dto/nodes.d.ts +98 -24
  1477. package/dist/shared/dto/nodes.d.ts.map +1 -1
  1478. package/dist/shared/dto/pipelines.d.ts +22 -1
  1479. package/dist/shared/dto/pipelines.d.ts.map +1 -1
  1480. package/dist/shared/dto/project.d.ts +289 -30
  1481. package/dist/shared/dto/project.d.ts.map +1 -1
  1482. package/dist/shared/dto/releases.d.ts +59 -0
  1483. package/dist/shared/dto/releases.d.ts.map +1 -0
  1484. package/dist/shared/dto/releases.js +2 -0
  1485. package/dist/shared/dto/releases.js.map +1 -0
  1486. package/dist/shared/dto/services.d.ts +201 -37
  1487. package/dist/shared/dto/services.d.ts.map +1 -1
  1488. package/dist/shared/dto/services.js +15 -6
  1489. package/dist/shared/dto/services.js.map +1 -1
  1490. package/dist/shared/dto/stack-diagnosis.d.ts +20 -0
  1491. package/dist/shared/dto/stack-diagnosis.d.ts.map +1 -0
  1492. package/dist/shared/dto/stack-diagnosis.js +8 -0
  1493. package/dist/shared/dto/stack-diagnosis.js.map +1 -0
  1494. package/dist/shared/dto/stack-execution.d.ts +65 -0
  1495. package/dist/shared/dto/stack-execution.d.ts.map +1 -0
  1496. package/dist/shared/dto/stack-execution.js +33 -0
  1497. package/dist/shared/dto/stack-execution.js.map +1 -0
  1498. package/dist/shared/dto/system-info.d.ts +11 -0
  1499. package/dist/shared/dto/system-info.d.ts.map +1 -1
  1500. package/dist/shared/dto/system-info.js +7 -1
  1501. package/dist/shared/dto/system-info.js.map +1 -1
  1502. package/dist/shared/dto/terminal.d.ts +40 -0
  1503. package/dist/shared/dto/terminal.d.ts.map +1 -0
  1504. package/dist/shared/dto/terminal.js +2 -0
  1505. package/dist/shared/dto/terminal.js.map +1 -0
  1506. package/dist/shared/dto/topology.d.ts +96 -0
  1507. package/dist/shared/dto/topology.d.ts.map +1 -0
  1508. package/dist/shared/dto/topology.js +2 -0
  1509. package/dist/shared/dto/topology.js.map +1 -0
  1510. package/dist/shared/emergency-output.d.ts +3 -0
  1511. package/dist/shared/emergency-output.d.ts.map +1 -0
  1512. package/dist/shared/emergency-output.js +22 -0
  1513. package/dist/shared/emergency-output.js.map +1 -0
  1514. package/dist/shared/env-config.d.ts +2 -0
  1515. package/dist/shared/env-config.d.ts.map +1 -1
  1516. package/dist/shared/env-config.js +1 -0
  1517. package/dist/shared/env-config.js.map +1 -1
  1518. package/dist/shared/events.d.ts +2 -0
  1519. package/dist/shared/events.d.ts.map +1 -1
  1520. package/dist/shared/events.js.map +1 -1
  1521. package/dist/shared/execution-identity.d.ts +39 -0
  1522. package/dist/shared/execution-identity.d.ts.map +1 -0
  1523. package/dist/shared/execution-identity.js +160 -0
  1524. package/dist/shared/execution-identity.js.map +1 -0
  1525. package/dist/shared/file-policy.d.ts +5 -0
  1526. package/dist/shared/file-policy.d.ts.map +1 -0
  1527. package/dist/shared/file-policy.js +18 -0
  1528. package/dist/shared/file-policy.js.map +1 -0
  1529. package/dist/shared/framework-source.d.ts +11 -0
  1530. package/dist/shared/framework-source.d.ts.map +1 -0
  1531. package/dist/shared/framework-source.js +31 -0
  1532. package/dist/shared/framework-source.js.map +1 -0
  1533. package/dist/shared/fresh-module-reader.d.ts +40 -0
  1534. package/dist/shared/fresh-module-reader.d.ts.map +1 -0
  1535. package/dist/shared/fresh-module-reader.js +257 -0
  1536. package/dist/shared/fresh-module-reader.js.map +1 -0
  1537. package/dist/shared/host-boot-identity.d.ts +12 -0
  1538. package/dist/shared/host-boot-identity.d.ts.map +1 -0
  1539. package/dist/shared/host-boot-identity.js +89 -0
  1540. package/dist/shared/host-boot-identity.js.map +1 -0
  1541. package/dist/shared/kernel-file-lock.d.ts +3 -0
  1542. package/dist/shared/kernel-file-lock.d.ts.map +1 -0
  1543. package/dist/shared/kernel-file-lock.js +53 -0
  1544. package/dist/shared/kernel-file-lock.js.map +1 -0
  1545. package/dist/shared/linux-file-lock.d.ts +4 -0
  1546. package/dist/shared/linux-file-lock.d.ts.map +1 -0
  1547. package/dist/shared/linux-file-lock.js +36 -0
  1548. package/dist/shared/linux-file-lock.js.map +1 -0
  1549. package/dist/shared/local-infra-host.d.ts +2 -2
  1550. package/dist/shared/local-infra-host.js +2 -2
  1551. package/dist/shared/log-ingestion-reading.d.ts +9 -0
  1552. package/dist/shared/log-ingestion-reading.d.ts.map +1 -0
  1553. package/dist/shared/log-ingestion-reading.js +32 -0
  1554. package/dist/shared/log-ingestion-reading.js.map +1 -0
  1555. package/dist/shared/log-levels.d.ts +19 -0
  1556. package/dist/shared/log-levels.d.ts.map +1 -0
  1557. package/dist/shared/log-levels.js +23 -0
  1558. package/dist/shared/log-levels.js.map +1 -0
  1559. package/dist/shared/metrics-storage-reading.d.ts +8 -0
  1560. package/dist/shared/metrics-storage-reading.d.ts.map +1 -0
  1561. package/dist/shared/metrics-storage-reading.js +27 -0
  1562. package/dist/shared/metrics-storage-reading.js.map +1 -0
  1563. package/dist/shared/pnpm.d.ts.map +1 -1
  1564. package/dist/shared/pnpm.js +7 -0
  1565. package/dist/shared/pnpm.js.map +1 -1
  1566. package/dist/shared/pool-scale.d.ts +10 -0
  1567. package/dist/shared/pool-scale.d.ts.map +1 -0
  1568. package/dist/shared/pool-scale.js +25 -0
  1569. package/dist/shared/pool-scale.js.map +1 -0
  1570. package/dist/shared/private-files.d.ts +10 -22
  1571. package/dist/shared/private-files.d.ts.map +1 -1
  1572. package/dist/shared/private-files.js +95 -82
  1573. package/dist/shared/private-files.js.map +1 -1
  1574. package/dist/shared/relay-reading.d.ts +19 -0
  1575. package/dist/shared/relay-reading.d.ts.map +1 -0
  1576. package/dist/shared/relay-reading.js +22 -0
  1577. package/dist/shared/relay-reading.js.map +1 -0
  1578. package/dist/shared/release-reading.d.ts +124 -32
  1579. package/dist/shared/release-reading.d.ts.map +1 -1
  1580. package/dist/shared/release-reading.js +208 -28
  1581. package/dist/shared/release-reading.js.map +1 -1
  1582. package/dist/shared/roles.d.ts +19 -18
  1583. package/dist/shared/roles.d.ts.map +1 -1
  1584. package/dist/shared/roles.js +21 -26
  1585. package/dist/shared/roles.js.map +1 -1
  1586. package/dist/shared/runtime-artifact.d.ts +20 -0
  1587. package/dist/shared/runtime-artifact.d.ts.map +1 -0
  1588. package/dist/shared/runtime-artifact.js +83 -0
  1589. package/dist/shared/runtime-artifact.js.map +1 -0
  1590. package/dist/shared/stack-reading.d.ts +18 -0
  1591. package/dist/shared/stack-reading.d.ts.map +1 -0
  1592. package/dist/shared/stack-reading.js +15 -0
  1593. package/dist/shared/stack-reading.js.map +1 -0
  1594. package/dist/shared/sync-reading.d.ts +30 -38
  1595. package/dist/shared/sync-reading.d.ts.map +1 -1
  1596. package/dist/shared/sync-reading.js +90 -29
  1597. package/dist/shared/sync-reading.js.map +1 -1
  1598. package/dist/shared/tokens.d.ts +3 -1
  1599. package/dist/shared/tokens.d.ts.map +1 -1
  1600. package/dist/shared/tokens.js +1 -0
  1601. package/dist/shared/tokens.js.map +1 -1
  1602. package/dist/supervisor/restart-policy.d.ts.map +1 -1
  1603. package/dist/supervisor/restart-policy.js +7 -5
  1604. package/dist/supervisor/restart-policy.js.map +1 -1
  1605. package/dist/webapp/console-container.d.ts +7 -0
  1606. package/dist/webapp/console-container.d.ts.map +1 -0
  1607. package/dist/webapp/console-container.js +23 -0
  1608. package/dist/webapp/console-container.js.map +1 -0
  1609. package/dist/webapp/webapp.service.d.ts.map +1 -1
  1610. package/dist/webapp/webapp.service.js +71 -24
  1611. package/dist/webapp/webapp.service.js.map +1 -1
  1612. package/dist/workers/health-monitor.service.d.ts.map +1 -1
  1613. package/dist/workers/health-monitor.service.js +8 -1
  1614. package/dist/workers/health-monitor.service.js.map +1 -1
  1615. package/dist/workers/types.d.ts +2 -0
  1616. package/dist/workers/types.d.ts.map +1 -1
  1617. package/package.json +109 -43
  1618. package/webapp/dist/BUILD.json +4 -3
  1619. package/webapp/dist/assets/access-48hkC2-P.js +1 -0
  1620. package/webapp/dist/assets/access-jWkHxGc7.js +1 -0
  1621. package/webapp/dist/assets/admin-data-table-BKSDI8sU.js +1 -0
  1622. package/webapp/dist/assets/alert-expression-CSblScoa.js +1 -0
  1623. package/webapp/dist/assets/alert-notify-settings-C_CHZrFm.js +1 -0
  1624. package/webapp/dist/assets/alert-uBG6r9NW.js +1 -0
  1625. package/webapp/dist/assets/alerts-CuPQ9YQJ.js +1 -0
  1626. package/webapp/dist/assets/app-address-BCXfN59F.js +1 -0
  1627. package/webapp/dist/assets/apps-Drio028B.js +1 -0
  1628. package/webapp/dist/assets/audit-npSFJECe.js +1 -0
  1629. package/webapp/dist/assets/auth-CcgjP7hR.js +1 -0
  1630. package/webapp/dist/assets/card-DkH32gMY.js +1 -0
  1631. package/webapp/dist/assets/chart-BpGXlCJc.js +2 -0
  1632. package/webapp/dist/assets/charts-BY7qI6s2.js +41 -0
  1633. package/webapp/dist/assets/charts-CpBdHU_A.js +56 -0
  1634. package/webapp/dist/assets/client-DFnuv2z3.js +3 -0
  1635. package/webapp/dist/assets/code-editor-DK6Tmmxv.js +4 -0
  1636. package/webapp/dist/assets/comparison-bars-BtC0dHjF.js +1 -0
  1637. package/webapp/dist/assets/confirm-dialog-BbGsAz7_.js +1 -0
  1638. package/webapp/dist/assets/console-keyboard-D3YCA0yU.js +1 -0
  1639. package/webapp/dist/assets/constants-CyhngVXh.js +1 -0
  1640. package/webapp/dist/assets/containers-Bl8gAyZX.js +3 -0
  1641. package/webapp/dist/assets/context-FIuwpd9_.js +1 -0
  1642. package/webapp/dist/assets/controls-C5W8gHU4.js +1 -0
  1643. package/webapp/dist/assets/daemon-memory-BiEtr9jr.js +1 -0
  1644. package/webapp/dist/assets/dashboard-UHlet3H9.js +1 -0
  1645. package/webapp/dist/assets/dashboard-builder-67PZFqhE.js +1 -0
  1646. package/webapp/dist/assets/dayjs.min-DHwAvH5f.js +1 -0
  1647. package/webapp/dist/assets/deploy-release-dialog-BOXcD5Wo.js +1 -0
  1648. package/webapp/dist/assets/deployments-qV20Ak0P.js +1 -0
  1649. package/webapp/dist/assets/detail-B4TiBfxU.js +8 -0
  1650. package/webapp/dist/assets/detail-B85-Wees.js +2 -0
  1651. package/webapp/dist/assets/detail-CYS81K6Y.js +1 -0
  1652. package/webapp/dist/assets/dist-BUDn8hLh.js +11 -0
  1653. package/webapp/dist/assets/dist-Ci5pYRbx.js +1 -0
  1654. package/webapp/dist/assets/dist-DQmjHv4-.js +1 -0
  1655. package/webapp/dist/assets/dist-De9Fty7a.js +1 -0
  1656. package/webapp/dist/assets/dist-DsGmKwmk.js +23 -0
  1657. package/webapp/dist/assets/empty-content-7jOFhG4C.js +1 -0
  1658. package/webapp/dist/assets/error-boundary-CLLI8PWw.js +3 -0
  1659. package/webapp/dist/assets/event-fields-CiyqrRO8.js +1 -0
  1660. package/webapp/dist/assets/files-DigwXndm.js +2 -0
  1661. package/webapp/dist/assets/formatters-RnRy4bXm.js +1 -0
  1662. package/webapp/dist/assets/icons-OboZgWSt.js +1 -0
  1663. package/webapp/dist/assets/index-uq8Dkk4c.js +1 -0
  1664. package/webapp/dist/assets/label-B1SF0RTL.js +1 -0
  1665. package/webapp/dist/assets/log-level-filter-Bcn31D1F.js +1 -0
  1666. package/webapp/dist/assets/log-location-DuBjh6HQ.js +1 -0
  1667. package/webapp/dist/assets/logs-BqHOufk8.js +4 -0
  1668. package/webapp/dist/assets/metric-chart-M-kI-XOt.js +1 -0
  1669. package/webapp/dist/assets/metric-series-WxePniyw.js +1 -0
  1670. package/webapp/dist/assets/metrics-QIQaF7iS.js +1 -0
  1671. package/webapp/dist/assets/model-ZEXEHm0l.js +2 -0
  1672. package/webapp/dist/assets/mui-6ssfcZcz.js +1 -0
  1673. package/webapp/dist/assets/mui-AnEgAVjz.js +52 -0
  1674. package/webapp/dist/assets/mui-B1jrje6Z.js +1 -0
  1675. package/webapp/dist/assets/mui-BIz4LSVs.js +1 -0
  1676. package/webapp/dist/assets/mui-BTN91yBK.js +28 -0
  1677. package/webapp/dist/assets/mui-BXSXx9c9.js +124 -0
  1678. package/webapp/dist/assets/mui-BwsIrivo.js +37 -0
  1679. package/webapp/dist/assets/mui-C_hromOc.js +1 -0
  1680. package/webapp/dist/assets/mui-Cd711nOk.js +4 -0
  1681. package/webapp/dist/assets/mui-CdB_p2lt.js +10 -0
  1682. package/webapp/dist/assets/mui-DyT2n1lx.js +1 -0
  1683. package/webapp/dist/assets/mui-agG5dued.js +1 -0
  1684. package/webapp/dist/assets/mui-y44PQOfG.js +1 -0
  1685. package/webapp/dist/assets/nodes-BJPk02vv.js +7 -0
  1686. package/webapp/dist/assets/omnitron-logo-koMCbsCv.js +1 -0
  1687. package/webapp/dist/assets/operation-status-Bm1x1wTz.js +1 -0
  1688. package/webapp/dist/assets/page-breadcrumbs-fR7Jmpp4.js +1 -0
  1689. package/webapp/dist/assets/pipelines-T6Ch9LTw.js +3 -0
  1690. package/webapp/dist/assets/popper-m_9b0JRf.js +1 -0
  1691. package/webapp/dist/assets/preload-helper-DzCYNvzR.js +1 -0
  1692. package/webapp/dist/assets/project.store--G5pIF-J.js +1 -0
  1693. package/webapp/dist/assets/projects-YoBzcQ24.js +1 -0
  1694. package/webapp/dist/assets/react-BN8qLIAi.js +9 -0
  1695. package/webapp/dist/assets/react-CEuifcaQ.js +1 -0
  1696. package/webapp/dist/assets/react-apexcharts.esm-DoOt-pu4.js +1 -0
  1697. package/webapp/dist/assets/realtime.store-CBDO4Abj.js +1 -0
  1698. package/webapp/dist/assets/release-bits-B2a_wbft.js +1 -0
  1699. package/webapp/dist/assets/release-build-panel-BQmIdKW9.js +1 -0
  1700. package/webapp/dist/assets/release-deployment-state-DRrEI2pP.js +1 -0
  1701. package/webapp/dist/assets/release-wire-f2VuBoBF.js +1 -0
  1702. package/webapp/dist/assets/releases-Bp3CDgmo.js +2 -0
  1703. package/webapp/dist/assets/rolldown-runtime-CNOWq4Kh.js +1 -0
  1704. package/webapp/dist/assets/search-input-C0MHI8vO.js +1 -0
  1705. package/webapp/dist/assets/services-BddvcFi8.js +1 -0
  1706. package/webapp/dist/assets/settings-B3egRvbI.js +1 -0
  1707. package/webapp/dist/assets/settled-pair-B-wgSZl6.js +1 -0
  1708. package/webapp/dist/assets/shared-styles-C0vN3I7_.js +1 -0
  1709. package/webapp/dist/assets/shell-command-C3pXf1vi.js +1 -0
  1710. package/webapp/dist/assets/sign-in-9q-Nfy83.js +1 -0
  1711. package/webapp/dist/assets/skeleton-BmWDJWF9.js +1 -0
  1712. package/webapp/dist/assets/snackbar-DSPmjMyi.js +1 -0
  1713. package/webapp/dist/assets/stack-health-status-BIv2C10x.js +1 -0
  1714. package/webapp/dist/assets/stack-start-notice-BVnMOwRQ.js +1 -0
  1715. package/webapp/dist/assets/stacks-IZ1mfizi.js +1 -0
  1716. package/webapp/dist/assets/storage-CKXnhqkt.js +1 -0
  1717. package/webapp/dist/assets/store-bqUBn2A4.js +1 -0
  1718. package/webapp/dist/assets/sync-reading-CN0jPKAg.js +1 -0
  1719. package/webapp/dist/assets/system-info-BFKNM-hf.js +1 -0
  1720. package/webapp/dist/assets/table-BOWT6Y9d.js +1 -0
  1721. package/webapp/dist/assets/table-viewport-Bp4pq-c_.js +1 -0
  1722. package/webapp/dist/assets/tabs-k5NPGLnJ.js +1 -0
  1723. package/webapp/dist/assets/terminal-BrP-ENHg.css +1 -0
  1724. package/webapp/dist/assets/terminal-QWBau-Us.js +62 -0
  1725. package/webapp/dist/assets/terminal-input-b7f2VoE_.js +2 -0
  1726. package/webapp/dist/assets/topology-CPey5dP6.js +8 -0
  1727. package/webapp/dist/assets/topology-metadata-dialog-BivuU2y6.js +2 -0
  1728. package/webapp/dist/assets/topology-routes.worker-BoYrIzAH.js +1 -0
  1729. package/webapp/dist/assets/traces-By0rdfDC.js +1 -0
  1730. package/webapp/dist/assets/use-copy-to-clipboard-BWYpToS3.js +1 -0
  1731. package/webapp/dist/assets/use-polled-resource-B22hhr5L.js +1 -0
  1732. package/webapp/dist/assets/use-stack-context-UkBsF-l7.js +1 -0
  1733. package/webapp/dist/assets/webapp-BnxOVfrc.css +1 -0
  1734. package/webapp/dist/assets/webapp-D-UhjFhS.js +35 -0
  1735. package/webapp/dist/console-version.json +1 -0
  1736. package/webapp/dist/index.html +54 -7
  1737. package/dist/release/daemon-omni.d.ts +0 -41
  1738. package/dist/release/daemon-omni.d.ts.map +0 -1
  1739. package/dist/release/daemon-omni.js +0 -59
  1740. package/dist/release/daemon-omni.js.map +0 -1
  1741. package/dist/services/netron-telemetry-transport.d.ts +0 -42
  1742. package/dist/services/netron-telemetry-transport.d.ts.map +0 -1
  1743. package/dist/services/netron-telemetry-transport.js +0 -93
  1744. package/dist/services/netron-telemetry-transport.js.map +0 -1
  1745. package/webapp/dist/assets/FormControlLabel-BrH2diyl.js +0 -1
  1746. package/webapp/dist/assets/Grid-BZ7xhoHQ.js +0 -1
  1747. package/webapp/dist/assets/Switch-DGSAxQPM.js +0 -1
  1748. package/webapp/dist/assets/alerts-sXqHJbsa.js +0 -1
  1749. package/webapp/dist/assets/apps-B_Ah8Flh.js +0 -1
  1750. package/webapp/dist/assets/audit-YXihwyui.js +0 -1
  1751. package/webapp/dist/assets/client-CGbBvy9k.js +0 -1
  1752. package/webapp/dist/assets/constants-veKGFkC6.js +0 -1
  1753. package/webapp/dist/assets/containers-Di4NOTLf.js +0 -2
  1754. package/webapp/dist/assets/daemon-memory-CCPZ4cV_.js +0 -1
  1755. package/webapp/dist/assets/dashboard-Cfuf95N3.js +0 -1
  1756. package/webapp/dist/assets/dashboard-builder-CowaYb-M.js +0 -1
  1757. package/webapp/dist/assets/deploy-release-dialog-D6C-XcKY.js +0 -1
  1758. package/webapp/dist/assets/deployments-ChTq5kCw.js +0 -1
  1759. package/webapp/dist/assets/detail-BsGWv7Dj.js +0 -1
  1760. package/webapp/dist/assets/detail-CyVf_cw5.js +0 -2
  1761. package/webapp/dist/assets/detail-D027j6aO.js +0 -8
  1762. package/webapp/dist/assets/formatters-BqjL73N3.js +0 -1
  1763. package/webapp/dist/assets/fs-Ccl3sAcp.js +0 -1
  1764. package/webapp/dist/assets/index-B8AHIPc-.css +0 -1
  1765. package/webapp/dist/assets/index-DiZbrwxT.js +0 -414
  1766. package/webapp/dist/assets/logs-L2b8Oqmo.js +0 -12
  1767. package/webapp/dist/assets/maplibre-gl-MlmG2kbn.js +0 -801
  1768. package/webapp/dist/assets/metrics-CQgjz2Lz.js +0 -2
  1769. package/webapp/dist/assets/nodes-Nwia2Ty6.js +0 -7
  1770. package/webapp/dist/assets/pipelines-DCu_rXOr.js +0 -4
  1771. package/webapp/dist/assets/projects-Bb4aV76h.js +0 -1
  1772. package/webapp/dist/assets/react-CwJFpaho.js +0 -1
  1773. package/webapp/dist/assets/react-apexcharts.esm-Dy0Fez42.js +0 -1956
  1774. package/webapp/dist/assets/release-bits-Dj4EOhhb.js +0 -1
  1775. package/webapp/dist/assets/release-build-panel-D6OCVlhT.js +0 -1
  1776. package/webapp/dist/assets/releases-CnAt3yO6.js +0 -2
  1777. package/webapp/dist/assets/rolldown-runtime-hePW80VL.js +0 -1
  1778. package/webapp/dist/assets/settings-DU-mjiwb.js +0 -1
  1779. package/webapp/dist/assets/settled-pair-C7SjZuns.js +0 -1
  1780. package/webapp/dist/assets/sign-in-Bcvjrr4C.js +0 -1
  1781. package/webapp/dist/assets/stacks-B-e8p50I.js +0 -1
  1782. package/webapp/dist/assets/sync-reading-C3PnJ7AX.js +0 -1
  1783. package/webapp/dist/assets/system-info-BtE3dgfw.js +0 -1
  1784. package/webapp/dist/assets/topology-Cwch-uF1.js +0 -12
  1785. package/webapp/dist/assets/traces-BbShR-4P.js +0 -1
  1786. package/webapp/dist/assets/use-stack-context-CZUgPq88.js +0 -1
@@ -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 { CLI_VERSION, DEFAULT_DAEMON_CONFIG } from '../config/defaults.js';
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, SLAVE_STORAGE_TOKEN, } from '../shared/tokens.js';
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
- return false;
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
- /** Set by the shutdown task so nothing schedules work on the way out. */
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
- const DaemonModule = createDaemonModule(config, this.dc);
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
- process.on('SIGHUP', () => {
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
- const loggerModule = await this.app.container.resolveAsync(LOGGER_SERVICE_TOKEN);
284
- const logger = loggerModule.logger;
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
- await this.checkCrashRecovery(logger);
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
- await this.startInfrastructure(config, options, logger);
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
- this.startFileWatcher(config, options, logger);
310
- // 8.5. Wire daemon Netron to orchestrator for native topology routing
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
- if (this.app.netron) {
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('../commands/up.js');
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
- void this.startHealthMonitorWorker(logger).catch((err) => {
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
- await this.startApps(config, logger);
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
- // 13. Register shutdown tasks — Application handles SIGTERM/SIGINT
405
- // and calls shutdown tasks in priority order before process.exit()
406
- this.registerShutdownTasks(this.app);
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: async (token) => {
522
- // JWT verification with caching via titan-auth JWTService
523
- const payload = await jwtService.verify(token);
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: dc.httpRateLimit?.trustProxy === true,
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
- // it does not need and a WebSocket one that, as the note below records,
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 rl = dc.httpRateLimit ?? {};
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
- // Volume cap on the HTTP RPC surface, and only that one. Password
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
- // The only bound this transport accepts. Left unset it inherits
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 rpcService = new DaemonRpcService(orchestrator, titanHealth, logManager, config, this);
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 { MetricsRpcService: MetricsRpc } = await import('@omnitron-dev/titan-metrics');
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 projectService = await container.resolveAsync(PROJECT_SERVICE_TOKEN);
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 this.app.netron.peer.exposeService(new ReleaseRpcService(this.releaseService, audit, projectService));
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
- // Sync service (slave→master data replication)
777
- const syncNodeId = `${os.hostname()}-${dc.port}`;
778
- let syncDb;
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
- this.syncService.setMetricsSink((sample) => {
803
- try {
804
- syncMetrics.recordTyped('gauge', sample.name, { ...sample.labels, app: sample.app, node: sample.node }, sample.value);
805
- }
806
- catch (err) {
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 nodeManagerRpcService = new NodeManagerRpcService(nodeManager, audit);
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: async ({ host }) => {
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(async (host) => {
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
- const pipelineRpcService = new PipelineRpc(pipelineService);
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
- // Cluster — leader election + config sync (optional, enabled via config, master only)
1005
- // LeaderElection is created here once and stored; startBackgroundServices() starts it.
1006
- if (dc.cluster?.enabled && !isSlave) {
1007
- const { LeaderElection } = await import('../cluster/leader-election.js');
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
- orchestrator.onAppLog((appName, line) => {
1031
- logManager.appendToFile(appName, line);
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().list();
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
- this.infraService = new InfrastructureService(logger, config.infrastructure);
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.name);
1267
- await removeContainer(container.name);
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(new DockerHealthIndicator(() => this.infraService));
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
- // Health module may not be available — non-critical
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 (!options?.watch || options?.noWatch || !this.app)
1543
+ async startFileWatcher(config, options, logger) {
1544
+ if (!this.app)
1329
1545
  return;
1330
- this.app.container.resolveAsync(ORCHESTRATOR_TOKEN).then((orchestrator) => {
1331
- orchestrator.devMode = true;
1332
- this.fileWatcher = new FileWatcher(logger, orchestrator, config, process.cwd());
1333
- this.fileWatcher.start(options.watchApps);
1334
- const watched = this.fileWatcher.getWatchedApps();
1335
- for (const w of watched) {
1336
- logger.info({ app: w.name, directory: w.directory }, 'Watching for changes');
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
- let allProjects = projectService.listProjects();
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.listProjects();
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
- // When there are enabled stacks to resume, wait for Docker first. Under
1379
- // OS-service supervision the daemon boots at login, seconds before
1380
- // OrbStack/dockerd finishes starting — on 2026-07-11 the one-shot resume
1381
- // fired into "Docker is not available" and the platform stayed appless
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
- await this.reconcileOrphanContainers(logger, allProjects, projectService);
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
- totalStacks++;
1439
- logger.info({ project: project.name, stack: stackName }, 'Stack started');
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
- logger.warn({ error: err.message }, 'Failed to start scheduler — falling back to manual timers');
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
- // Start telemetry relay (master only — requires PG)
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
- logger.warn({ error: err.message }, 'Telemetry relay failed to start');
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
- // Non-critical — DB may not be ready
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
- logger.warn({ error: err.message }, 'Trace collector failed to start');
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
- logger.warn({ error: err.message }, 'Leader election failed to start');
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; // By design: slaves do not manage a fleet.
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: 0,
1888
- nodeCount: 0,
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
- disableWatch() {
1942
- if (this.fileWatcher) {
1943
- this.fileWatcher.stop();
1944
- this.fileWatcher = null;
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
- * Whether file watching is running, and over what.
1949
- *
1950
- * `enabled` said only that a `FileWatcher` OBJECT existed. Observed on this
1951
- * host: `{ enabled: true, apps: [] }` — a watcher running over nothing,
1952
- * reported to an operator as "watching". Everyone downstream read the
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
- async getConfig() {
1979
- const { loadEcosystemConfig } = await import('../config/loader.js');
1980
- return loadEcosystemConfig();
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
- // Stop webapp nginx container (non-blocking — don't wait if slow)
2125
- try {
2126
- const { removeContainer } = await import('../infrastructure/container-runtime.js');
2127
- void removeContainer('omnitron-nginx');
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
- try {
2153
- const relay = await container.resolveAsync(TELEMETRY_RELAY_TOKEN);
2154
- await relay.stop();
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 { /* non-critical */ }
2162
- try {
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?.stop)
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) — Flush logs, clear state ---
2243
- app.registerShutdownTask('flush-and-clear', async () => {
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
- stateStore.clear();
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?.remove();
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
  *