@omnitron-dev/omnitron 0.3.1 → 0.3.3

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 (1694) hide show
  1. package/README.md +575 -0
  2. package/bin/pnpmfile-sdk.mjs +35 -0
  3. package/bin/sdk.d.mts +8 -0
  4. package/bin/sdk.mjs +576 -0
  5. package/data/operations/managed-kernel.mjs +302 -0
  6. package/data/operations/stage-kernel.mjs +125 -0
  7. package/dist/BUILD.json +4 -3
  8. package/dist/cli/exit-after-output.d.ts +3 -0
  9. package/dist/cli/exit-after-output.d.ts.map +1 -0
  10. package/dist/cli/exit-after-output.js +11 -0
  11. package/dist/cli/exit-after-output.js.map +1 -0
  12. package/dist/cli/installed.d.ts +3 -0
  13. package/dist/cli/installed.d.ts.map +1 -0
  14. package/dist/cli/installed.js +17 -0
  15. package/dist/cli/installed.js.map +1 -0
  16. package/dist/cli/omnitron.js +456 -98
  17. package/dist/cli/omnitron.js.map +1 -1
  18. package/dist/cli/output-command.d.ts +13 -0
  19. package/dist/cli/output-command.d.ts.map +1 -0
  20. package/dist/cli/output-command.js +48 -0
  21. package/dist/cli/output-command.js.map +1 -0
  22. package/dist/cluster/cluster.rpc-service.d.ts +9 -77
  23. package/dist/cluster/cluster.rpc-service.d.ts.map +1 -1
  24. package/dist/cluster/cluster.rpc-service.js +20 -107
  25. package/dist/cluster/cluster.rpc-service.js.map +1 -1
  26. package/dist/cluster/enrollment.d.ts +9 -0
  27. package/dist/cluster/enrollment.d.ts.map +1 -0
  28. package/dist/cluster/enrollment.js +49 -0
  29. package/dist/cluster/enrollment.js.map +1 -0
  30. package/dist/cluster/index.d.ts +1 -1
  31. package/dist/cluster/index.d.ts.map +1 -1
  32. package/dist/cluster/leader-election.d.ts +39 -211
  33. package/dist/cluster/leader-election.d.ts.map +1 -1
  34. package/dist/cluster/leader-election.js +235 -512
  35. package/dist/cluster/leader-election.js.map +1 -1
  36. package/dist/cluster/mesh-link.d.ts +18 -51
  37. package/dist/cluster/mesh-link.d.ts.map +1 -1
  38. package/dist/cluster/mesh-link.js +65 -77
  39. package/dist/cluster/mesh-link.js.map +1 -1
  40. package/dist/cluster/mesh.d.ts +3 -1
  41. package/dist/cluster/mesh.d.ts.map +1 -1
  42. package/dist/cluster/mesh.js +76 -60
  43. package/dist/cluster/mesh.js.map +1 -1
  44. package/dist/cluster/slave-connector.d.ts +40 -4
  45. package/dist/cluster/slave-connector.d.ts.map +1 -1
  46. package/dist/cluster/slave-connector.js +348 -195
  47. package/dist/cluster/slave-connector.js.map +1 -1
  48. package/dist/cluster/standalone-infrastructure.d.ts +3 -0
  49. package/dist/cluster/standalone-infrastructure.d.ts.map +1 -0
  50. package/dist/cluster/standalone-infrastructure.js +25 -0
  51. package/dist/cluster/standalone-infrastructure.js.map +1 -0
  52. package/dist/cluster/stop-authority.d.ts +45 -0
  53. package/dist/cluster/stop-authority.d.ts.map +1 -0
  54. package/dist/cluster/stop-authority.js +112 -0
  55. package/dist/cluster/stop-authority.js.map +1 -0
  56. package/dist/commands/access.d.ts +9 -0
  57. package/dist/commands/access.d.ts.map +1 -0
  58. package/dist/commands/access.js +45 -0
  59. package/dist/commands/access.js.map +1 -0
  60. package/dist/commands/audit.d.ts +2 -0
  61. package/dist/commands/audit.d.ts.map +1 -1
  62. package/dist/commands/audit.js +9 -4
  63. package/dist/commands/audit.js.map +1 -1
  64. package/dist/commands/backend.d.ts +17 -0
  65. package/dist/commands/backend.d.ts.map +1 -0
  66. package/dist/commands/backend.js +264 -0
  67. package/dist/commands/backend.js.map +1 -0
  68. package/dist/commands/backup.d.ts +5 -0
  69. package/dist/commands/backup.d.ts.map +1 -1
  70. package/dist/commands/backup.js +17 -2
  71. package/dist/commands/backup.js.map +1 -1
  72. package/dist/commands/cluster.d.ts.map +1 -1
  73. package/dist/commands/cluster.js +33 -42
  74. package/dist/commands/cluster.js.map +1 -1
  75. package/dist/commands/daemon-cmd.d.ts.map +1 -1
  76. package/dist/commands/daemon-cmd.js +14 -3
  77. package/dist/commands/daemon-cmd.js.map +1 -1
  78. package/dist/commands/doctor.d.ts +11 -29
  79. package/dist/commands/doctor.d.ts.map +1 -1
  80. package/dist/commands/doctor.js +47 -45
  81. package/dist/commands/doctor.js.map +1 -1
  82. package/dist/commands/files.d.ts +19 -0
  83. package/dist/commands/files.d.ts.map +1 -0
  84. package/dist/commands/files.js +226 -0
  85. package/dist/commands/files.js.map +1 -0
  86. package/dist/commands/fleet-rollout.d.ts +25 -0
  87. package/dist/commands/fleet-rollout.d.ts.map +1 -0
  88. package/dist/commands/fleet-rollout.js +155 -0
  89. package/dist/commands/fleet-rollout.js.map +1 -0
  90. package/dist/commands/fleet.d.ts.map +1 -1
  91. package/dist/commands/fleet.js +1 -0
  92. package/dist/commands/fleet.js.map +1 -1
  93. package/dist/commands/health-check.d.ts.map +1 -1
  94. package/dist/commands/health-check.js +13 -6
  95. package/dist/commands/health-check.js.map +1 -1
  96. package/dist/commands/infra.d.ts +5 -2
  97. package/dist/commands/infra.d.ts.map +1 -1
  98. package/dist/commands/infra.js +145 -53
  99. package/dist/commands/infra.js.map +1 -1
  100. package/dist/commands/logs.d.ts +6 -23
  101. package/dist/commands/logs.d.ts.map +1 -1
  102. package/dist/commands/logs.js +114 -38
  103. package/dist/commands/logs.js.map +1 -1
  104. package/dist/commands/metrics.d.ts.map +1 -1
  105. package/dist/commands/metrics.js +7 -1
  106. package/dist/commands/metrics.js.map +1 -1
  107. package/dist/commands/migrate.d.ts +8 -0
  108. package/dist/commands/migrate.d.ts.map +1 -0
  109. package/dist/commands/migrate.js +64 -0
  110. package/dist/commands/migrate.js.map +1 -0
  111. package/dist/commands/node-reconcile.d.ts +8 -0
  112. package/dist/commands/node-reconcile.d.ts.map +1 -0
  113. package/dist/commands/node-reconcile.js +49 -0
  114. package/dist/commands/node-reconcile.js.map +1 -0
  115. package/dist/commands/node.d.ts +0 -8
  116. package/dist/commands/node.d.ts.map +1 -1
  117. package/dist/commands/node.js +32 -35
  118. package/dist/commands/node.js.map +1 -1
  119. package/dist/commands/output.d.ts +3 -9
  120. package/dist/commands/output.d.ts.map +1 -1
  121. package/dist/commands/output.js +34 -25
  122. package/dist/commands/output.js.map +1 -1
  123. package/dist/commands/pipeline.d.ts +11 -2
  124. package/dist/commands/pipeline.d.ts.map +1 -1
  125. package/dist/commands/pipeline.js +75 -15
  126. package/dist/commands/pipeline.js.map +1 -1
  127. package/dist/commands/project.d.ts +8 -0
  128. package/dist/commands/project.d.ts.map +1 -1
  129. package/dist/commands/project.js +67 -1
  130. package/dist/commands/project.js.map +1 -1
  131. package/dist/commands/release-store.js +1 -1
  132. package/dist/commands/release-store.js.map +1 -1
  133. package/dist/commands/release.d.ts +5 -12
  134. package/dist/commands/release.d.ts.map +1 -1
  135. package/dist/commands/release.js +141 -33
  136. package/dist/commands/release.js.map +1 -1
  137. package/dist/commands/scale.d.ts +1 -4
  138. package/dist/commands/scale.d.ts.map +1 -1
  139. package/dist/commands/scale.js +39 -19
  140. package/dist/commands/scale.js.map +1 -1
  141. package/dist/commands/secret-input.d.ts +3 -0
  142. package/dist/commands/secret-input.d.ts.map +1 -0
  143. package/dist/commands/secret-input.js +36 -0
  144. package/dist/commands/secret-input.js.map +1 -0
  145. package/dist/commands/secret.d.ts +4 -2
  146. package/dist/commands/secret.d.ts.map +1 -1
  147. package/dist/commands/secret.js +12 -2
  148. package/dist/commands/secret.js.map +1 -1
  149. package/dist/commands/service-resident.d.ts +25 -0
  150. package/dist/commands/service-resident.d.ts.map +1 -0
  151. package/dist/commands/service-resident.js +236 -0
  152. package/dist/commands/service-resident.js.map +1 -0
  153. package/dist/commands/service-units.d.ts +13 -1
  154. package/dist/commands/service-units.d.ts.map +1 -1
  155. package/dist/commands/service-units.js +38 -16
  156. package/dist/commands/service-units.js.map +1 -1
  157. package/dist/commands/service.d.ts +2 -24
  158. package/dist/commands/service.d.ts.map +1 -1
  159. package/dist/commands/service.js +89 -7
  160. package/dist/commands/service.js.map +1 -1
  161. package/dist/commands/stack.d.ts +11 -6
  162. package/dist/commands/stack.d.ts.map +1 -1
  163. package/dist/commands/stack.js +212 -38
  164. package/dist/commands/stack.js.map +1 -1
  165. package/dist/commands/start.d.ts +0 -21
  166. package/dist/commands/start.d.ts.map +1 -1
  167. package/dist/commands/start.js +33 -43
  168. package/dist/commands/start.js.map +1 -1
  169. package/dist/commands/status.d.ts +1 -5
  170. package/dist/commands/status.d.ts.map +1 -1
  171. package/dist/commands/status.js +5 -1
  172. package/dist/commands/status.js.map +1 -1
  173. package/dist/commands/stop.d.ts +0 -22
  174. package/dist/commands/stop.d.ts.map +1 -1
  175. package/dist/commands/stop.js +26 -86
  176. package/dist/commands/stop.js.map +1 -1
  177. package/dist/commands/system.d.ts +4 -0
  178. package/dist/commands/system.d.ts.map +1 -0
  179. package/dist/commands/system.js +41 -0
  180. package/dist/commands/system.js.map +1 -0
  181. package/dist/commands/terminal.d.ts +7 -0
  182. package/dist/commands/terminal.d.ts.map +1 -0
  183. package/dist/commands/terminal.js +184 -0
  184. package/dist/commands/terminal.js.map +1 -0
  185. package/dist/commands/topology.d.ts +3 -0
  186. package/dist/commands/topology.d.ts.map +1 -0
  187. package/dist/commands/topology.js +107 -0
  188. package/dist/commands/topology.js.map +1 -0
  189. package/dist/commands/up.d.ts +4 -54
  190. package/dist/commands/up.d.ts.map +1 -1
  191. package/dist/commands/up.js +41 -98
  192. package/dist/commands/up.js.map +1 -1
  193. package/dist/commands/webapp.d.ts +0 -9
  194. package/dist/commands/webapp.d.ts.map +1 -1
  195. package/dist/commands/webapp.js +116 -69
  196. package/dist/commands/webapp.js.map +1 -1
  197. package/dist/config/app-path.d.ts +4 -0
  198. package/dist/config/app-path.d.ts.map +1 -0
  199. package/dist/config/app-path.js +6 -0
  200. package/dist/config/app-path.js.map +1 -0
  201. package/dist/config/defaults.d.ts.map +1 -1
  202. package/dist/config/defaults.js +9 -3
  203. package/dist/config/defaults.js.map +1 -1
  204. package/dist/config/define-ecosystem.d.ts.map +1 -1
  205. package/dist/config/define-ecosystem.js +12 -0
  206. package/dist/config/define-ecosystem.js.map +1 -1
  207. package/dist/config/index.d.ts +3 -1
  208. package/dist/config/index.d.ts.map +1 -1
  209. package/dist/config/index.js +1 -1
  210. package/dist/config/index.js.map +1 -1
  211. package/dist/config/loader-child.d.ts +2 -0
  212. package/dist/config/loader-child.d.ts.map +1 -0
  213. package/dist/config/loader-child.js +56 -0
  214. package/dist/config/loader-child.js.map +1 -0
  215. package/dist/config/loader.d.ts +7 -2
  216. package/dist/config/loader.d.ts.map +1 -1
  217. package/dist/config/loader.js +14 -27
  218. package/dist/config/loader.js.map +1 -1
  219. package/dist/config/project-stacks.d.ts +5 -0
  220. package/dist/config/project-stacks.d.ts.map +1 -0
  221. package/dist/config/project-stacks.js +24 -0
  222. package/dist/config/project-stacks.js.map +1 -0
  223. package/dist/config/saved.d.ts +67 -0
  224. package/dist/config/saved.d.ts.map +1 -0
  225. package/dist/config/saved.js +81 -0
  226. package/dist/config/saved.js.map +1 -0
  227. package/dist/config/types.d.ts +96 -52
  228. package/dist/config/types.d.ts.map +1 -1
  229. package/dist/daemon/backend-candidate.d.ts +32 -0
  230. package/dist/daemon/backend-candidate.d.ts.map +1 -0
  231. package/dist/daemon/backend-candidate.js +129 -0
  232. package/dist/daemon/backend-candidate.js.map +1 -0
  233. package/dist/daemon/backend-child.d.ts +5 -0
  234. package/dist/daemon/backend-child.d.ts.map +1 -0
  235. package/dist/daemon/backend-child.js +13 -0
  236. package/dist/daemon/backend-child.js.map +1 -0
  237. package/dist/daemon/backend-control.d.ts +43 -0
  238. package/dist/daemon/backend-control.d.ts.map +1 -0
  239. package/dist/daemon/backend-control.js +155 -0
  240. package/dist/daemon/backend-control.js.map +1 -0
  241. package/dist/daemon/backend-crash-recovery.d.ts +4 -0
  242. package/dist/daemon/backend-crash-recovery.d.ts.map +1 -0
  243. package/dist/daemon/backend-crash-recovery.js +136 -0
  244. package/dist/daemon/backend-crash-recovery.js.map +1 -0
  245. package/dist/daemon/backend-handoff-types.d.ts +27 -0
  246. package/dist/daemon/backend-handoff-types.d.ts.map +1 -0
  247. package/dist/daemon/backend-handoff-types.js +33 -0
  248. package/dist/daemon/backend-handoff-types.js.map +1 -0
  249. package/dist/daemon/backend-recovery-journal.d.ts +30 -0
  250. package/dist/daemon/backend-recovery-journal.d.ts.map +1 -0
  251. package/dist/daemon/backend-recovery-journal.js +67 -0
  252. package/dist/daemon/backend-recovery-journal.js.map +1 -0
  253. package/dist/daemon/backend-recovery-monitor.d.ts +35 -0
  254. package/dist/daemon/backend-recovery-monitor.d.ts.map +1 -0
  255. package/dist/daemon/backend-recovery-monitor.js +113 -0
  256. package/dist/daemon/backend-recovery-monitor.js.map +1 -0
  257. package/dist/daemon/backend-supervisor-entry.d.ts +2 -0
  258. package/dist/daemon/backend-supervisor-entry.d.ts.map +1 -0
  259. package/dist/daemon/backend-supervisor-entry.js +3 -0
  260. package/dist/daemon/backend-supervisor-entry.js.map +1 -0
  261. package/dist/daemon/backend-supervisor-main.d.ts +2 -0
  262. package/dist/daemon/backend-supervisor-main.d.ts.map +1 -0
  263. package/dist/daemon/backend-supervisor-main.js +45 -0
  264. package/dist/daemon/backend-supervisor-main.js.map +1 -0
  265. package/dist/daemon/backend-supervisor.d.ts +61 -0
  266. package/dist/daemon/backend-supervisor.d.ts.map +1 -0
  267. package/dist/daemon/backend-supervisor.js +339 -0
  268. package/dist/daemon/backend-supervisor.js.map +1 -0
  269. package/dist/daemon/backend-upgrade.d.ts +41 -0
  270. package/dist/daemon/backend-upgrade.d.ts.map +1 -0
  271. package/dist/daemon/backend-upgrade.js +444 -0
  272. package/dist/daemon/backend-upgrade.js.map +1 -0
  273. package/dist/daemon/backend.rpc-service.d.ts +11 -0
  274. package/dist/daemon/backend.rpc-service.d.ts.map +1 -0
  275. package/dist/daemon/backend.rpc-service.js +44 -0
  276. package/dist/daemon/backend.rpc-service.js.map +1 -0
  277. package/dist/daemon/daemon-client.d.ts +12 -79
  278. package/dist/daemon/daemon-client.d.ts.map +1 -1
  279. package/dist/daemon/daemon-client.js +28 -270
  280. package/dist/daemon/daemon-client.js.map +1 -1
  281. package/dist/daemon/daemon-entry.d.ts +0 -7
  282. package/dist/daemon/daemon-entry.d.ts.map +1 -1
  283. package/dist/daemon/daemon-entry.js +2 -115
  284. package/dist/daemon/daemon-entry.js.map +1 -1
  285. package/dist/daemon/daemon-main.d.ts +9 -0
  286. package/dist/daemon/daemon-main.d.ts.map +1 -0
  287. package/dist/daemon/daemon-main.js +105 -0
  288. package/dist/daemon/daemon-main.js.map +1 -0
  289. package/dist/daemon/daemon-scheduler.d.ts +8 -5
  290. package/dist/daemon/daemon-scheduler.d.ts.map +1 -1
  291. package/dist/daemon/daemon-scheduler.js +45 -73
  292. package/dist/daemon/daemon-scheduler.js.map +1 -1
  293. package/dist/daemon/daemon-state-store.service.d.ts +5 -39
  294. package/dist/daemon/daemon-state-store.service.d.ts.map +1 -1
  295. package/dist/daemon/daemon-state-store.service.js +30 -17
  296. package/dist/daemon/daemon-state-store.service.js.map +1 -1
  297. package/dist/daemon/daemon.d.ts +45 -60
  298. package/dist/daemon/daemon.d.ts.map +1 -1
  299. package/dist/daemon/daemon.js +720 -396
  300. package/dist/daemon/daemon.js.map +1 -1
  301. package/dist/daemon/daemon.module.d.ts +13 -11
  302. package/dist/daemon/daemon.module.d.ts.map +1 -1
  303. package/dist/daemon/daemon.module.js +136 -101
  304. package/dist/daemon/daemon.module.js.map +1 -1
  305. package/dist/daemon/daemon.rpc-service.d.ts +9 -17
  306. package/dist/daemon/daemon.rpc-service.d.ts.map +1 -1
  307. package/dist/daemon/daemon.rpc-service.js +83 -22
  308. package/dist/daemon/daemon.rpc-service.js.map +1 -1
  309. package/dist/daemon/darwin-owner-evidence.d.ts +57 -0
  310. package/dist/daemon/darwin-owner-evidence.d.ts.map +1 -0
  311. package/dist/daemon/darwin-owner-evidence.js +131 -0
  312. package/dist/daemon/darwin-owner-evidence.js.map +1 -0
  313. package/dist/daemon/database-startup.d.ts +7 -0
  314. package/dist/daemon/database-startup.d.ts.map +1 -0
  315. package/dist/daemon/database-startup.js +40 -0
  316. package/dist/daemon/database-startup.js.map +1 -0
  317. package/dist/daemon/entry-guard.d.ts +2 -0
  318. package/dist/daemon/entry-guard.d.ts.map +1 -0
  319. package/dist/daemon/entry-guard.js +34 -0
  320. package/dist/daemon/entry-guard.js.map +1 -0
  321. package/dist/daemon/execution-capabilities.d.ts +7 -0
  322. package/dist/daemon/execution-capabilities.d.ts.map +1 -0
  323. package/dist/daemon/execution-capabilities.js +23 -0
  324. package/dist/daemon/execution-capabilities.js.map +1 -0
  325. package/dist/daemon/execution-client.d.ts +88 -0
  326. package/dist/daemon/execution-client.d.ts.map +1 -0
  327. package/dist/daemon/execution-client.js +433 -0
  328. package/dist/daemon/execution-client.js.map +1 -0
  329. package/dist/daemon/execution-config.d.ts +7 -0
  330. package/dist/daemon/execution-config.d.ts.map +1 -0
  331. package/dist/daemon/execution-config.js +61 -0
  332. package/dist/daemon/execution-config.js.map +1 -0
  333. package/dist/daemon/execution-entry.d.ts +2 -0
  334. package/dist/daemon/execution-entry.d.ts.map +1 -0
  335. package/dist/daemon/execution-entry.js +3 -0
  336. package/dist/daemon/execution-entry.js.map +1 -0
  337. package/dist/daemon/execution-host.d.ts +133 -0
  338. package/dist/daemon/execution-host.d.ts.map +1 -0
  339. package/dist/daemon/execution-host.js +308 -0
  340. package/dist/daemon/execution-host.js.map +1 -0
  341. package/dist/daemon/execution-journal.d.ts +17 -0
  342. package/dist/daemon/execution-journal.d.ts.map +1 -0
  343. package/dist/daemon/execution-journal.js +75 -0
  344. package/dist/daemon/execution-journal.js.map +1 -0
  345. package/dist/daemon/execution-launcher.d.ts +12 -0
  346. package/dist/daemon/execution-launcher.d.ts.map +1 -0
  347. package/dist/daemon/execution-launcher.js +110 -0
  348. package/dist/daemon/execution-launcher.js.map +1 -0
  349. package/dist/daemon/execution-main.d.ts +2 -0
  350. package/dist/daemon/execution-main.d.ts.map +1 -0
  351. package/dist/daemon/execution-main.js +48 -0
  352. package/dist/daemon/execution-main.js.map +1 -0
  353. package/dist/daemon/execution-owner.d.ts +16 -0
  354. package/dist/daemon/execution-owner.d.ts.map +1 -0
  355. package/dist/daemon/execution-owner.js +97 -0
  356. package/dist/daemon/execution-owner.js.map +1 -0
  357. package/dist/daemon/execution-platform.d.ts +3 -0
  358. package/dist/daemon/execution-platform.d.ts.map +1 -0
  359. package/dist/daemon/execution-platform.js +23 -0
  360. package/dist/daemon/execution-platform.js.map +1 -0
  361. package/dist/daemon/execution-shutdown.d.ts +13 -0
  362. package/dist/daemon/execution-shutdown.d.ts.map +1 -0
  363. package/dist/daemon/execution-shutdown.js +30 -0
  364. package/dist/daemon/execution-shutdown.js.map +1 -0
  365. package/dist/daemon/managed-entry.d.ts +2 -0
  366. package/dist/daemon/managed-entry.d.ts.map +1 -0
  367. package/dist/daemon/managed-entry.js +3 -0
  368. package/dist/daemon/managed-entry.js.map +1 -0
  369. package/dist/daemon/managed-main.d.ts +2 -0
  370. package/dist/daemon/managed-main.d.ts.map +1 -0
  371. package/dist/daemon/managed-main.js +29 -0
  372. package/dist/daemon/managed-main.js.map +1 -0
  373. package/dist/daemon/managed-owner-build.d.ts +17 -0
  374. package/dist/daemon/managed-owner-build.d.ts.map +1 -0
  375. package/dist/daemon/managed-owner-build.js +108 -0
  376. package/dist/daemon/managed-owner-build.js.map +1 -0
  377. package/dist/daemon/managed-owner-entry.d.ts +2 -0
  378. package/dist/daemon/managed-owner-entry.d.ts.map +1 -0
  379. package/dist/daemon/managed-owner-entry.js +3 -0
  380. package/dist/daemon/managed-owner-entry.js.map +1 -0
  381. package/dist/daemon/managed-owner-main.d.ts +2 -0
  382. package/dist/daemon/managed-owner-main.d.ts.map +1 -0
  383. package/dist/daemon/managed-owner-main.js +53 -0
  384. package/dist/daemon/managed-owner-main.js.map +1 -0
  385. package/dist/daemon/managed-runtime.d.ts +39 -0
  386. package/dist/daemon/managed-runtime.d.ts.map +1 -0
  387. package/dist/daemon/managed-runtime.js +137 -0
  388. package/dist/daemon/managed-runtime.js.map +1 -0
  389. package/dist/daemon/network-publication.d.ts +5 -0
  390. package/dist/daemon/network-publication.d.ts.map +1 -0
  391. package/dist/daemon/network-publication.js +25 -0
  392. package/dist/daemon/network-publication.js.map +1 -0
  393. package/dist/daemon/owner-reconciliation.d.ts +58 -0
  394. package/dist/daemon/owner-reconciliation.d.ts.map +1 -0
  395. package/dist/daemon/owner-reconciliation.js +265 -0
  396. package/dist/daemon/owner-reconciliation.js.map +1 -0
  397. package/dist/daemon/pid-manager.d.ts +2 -0
  398. package/dist/daemon/pid-manager.d.ts.map +1 -1
  399. package/dist/daemon/pid-manager.js +5 -0
  400. package/dist/daemon/pid-manager.js.map +1 -1
  401. package/dist/daemon/private-control-client.d.ts +8 -0
  402. package/dist/daemon/private-control-client.d.ts.map +1 -0
  403. package/dist/daemon/private-control-client.js +41 -0
  404. package/dist/daemon/private-control-client.js.map +1 -0
  405. package/dist/daemon/recovery-state.d.ts +20 -0
  406. package/dist/daemon/recovery-state.d.ts.map +1 -0
  407. package/dist/daemon/recovery-state.js +53 -0
  408. package/dist/daemon/recovery-state.js.map +1 -0
  409. package/dist/daemon/rpc-connection.d.ts +29 -0
  410. package/dist/daemon/rpc-connection.d.ts.map +1 -0
  411. package/dist/daemon/rpc-connection.js +137 -0
  412. package/dist/daemon/rpc-connection.js.map +1 -0
  413. package/dist/daemon/runtime-installation.d.ts +58 -0
  414. package/dist/daemon/runtime-installation.d.ts.map +1 -0
  415. package/dist/daemon/runtime-installation.js +346 -0
  416. package/dist/daemon/runtime-installation.js.map +1 -0
  417. package/dist/daemon/runtime-launcher.d.ts +6 -0
  418. package/dist/daemon/runtime-launcher.d.ts.map +1 -0
  419. package/dist/daemon/runtime-launcher.js +45 -0
  420. package/dist/daemon/runtime-launcher.js.map +1 -0
  421. package/dist/daemon/schema-transition.d.ts +43 -0
  422. package/dist/daemon/schema-transition.d.ts.map +1 -0
  423. package/dist/daemon/schema-transition.js +239 -0
  424. package/dist/daemon/schema-transition.js.map +1 -0
  425. package/dist/daemon/spawn-daemon.d.ts +2 -0
  426. package/dist/daemon/spawn-daemon.d.ts.map +1 -1
  427. package/dist/daemon/spawn-daemon.js +4 -0
  428. package/dist/daemon/spawn-daemon.js.map +1 -1
  429. package/dist/daemon/startup-config.d.ts +77 -0
  430. package/dist/daemon/startup-config.d.ts.map +1 -0
  431. package/dist/daemon/startup-config.js +31 -0
  432. package/dist/daemon/startup-config.js.map +1 -0
  433. package/dist/daemon/startup-failure-journal.d.ts +3 -0
  434. package/dist/daemon/startup-failure-journal.d.ts.map +1 -0
  435. package/dist/daemon/startup-failure-journal.js +29 -0
  436. package/dist/daemon/startup-failure-journal.js.map +1 -0
  437. package/dist/daemon/state-store.d.ts +16 -24
  438. package/dist/daemon/state-store.d.ts.map +1 -1
  439. package/dist/daemon/state-store.js +51 -9
  440. package/dist/daemon/state-store.js.map +1 -1
  441. package/dist/daemon/supervisor-transition.d.ts +101 -0
  442. package/dist/daemon/supervisor-transition.d.ts.map +1 -0
  443. package/dist/daemon/supervisor-transition.js +503 -0
  444. package/dist/daemon/supervisor-transition.js.map +1 -0
  445. package/dist/daemon/system-guardian-cgroup.d.ts +16 -0
  446. package/dist/daemon/system-guardian-cgroup.d.ts.map +1 -0
  447. package/dist/daemon/system-guardian-cgroup.js +202 -0
  448. package/dist/daemon/system-guardian-cgroup.js.map +1 -0
  449. package/dist/daemon/system-guardian-unit.d.ts +9 -0
  450. package/dist/daemon/system-guardian-unit.d.ts.map +1 -0
  451. package/dist/daemon/system-guardian-unit.js +41 -0
  452. package/dist/daemon/system-guardian-unit.js.map +1 -0
  453. package/dist/database/connection.d.ts.map +1 -1
  454. package/dist/database/connection.js +2 -6
  455. package/dist/database/connection.js.map +1 -1
  456. package/dist/database/log-durability.d.ts +5 -0
  457. package/dist/database/log-durability.d.ts.map +1 -0
  458. package/dist/database/log-durability.js +28 -0
  459. package/dist/database/log-durability.js.map +1 -0
  460. package/dist/database/migrate.js +2 -15
  461. package/dist/database/migrate.js.map +1 -1
  462. package/dist/database/migration-registry-compatibility.d.ts +13 -0
  463. package/dist/database/migration-registry-compatibility.d.ts.map +1 -0
  464. package/dist/database/migration-registry-compatibility.js +108 -0
  465. package/dist/database/migration-registry-compatibility.js.map +1 -0
  466. package/dist/database/migration-runner.d.ts +8 -42
  467. package/dist/database/migration-runner.d.ts.map +1 -1
  468. package/dist/database/migration-runner.js +114 -123
  469. package/dist/database/migration-runner.js.map +1 -1
  470. package/dist/database/migrations/014_replication_receipts.d.ts +5 -0
  471. package/dist/database/migrations/014_replication_receipts.d.ts.map +1 -0
  472. package/dist/database/migrations/014_replication_receipts.js +6 -0
  473. package/dist/database/migrations/014_replication_receipts.js.map +1 -0
  474. package/dist/database/migrations/015_persistent_metrics.d.ts +5 -0
  475. package/dist/database/migrations/015_persistent_metrics.d.ts.map +1 -0
  476. package/dist/database/migrations/015_persistent_metrics.js +7 -0
  477. package/dist/database/migrations/015_persistent_metrics.js.map +1 -0
  478. package/dist/database/migrations/016_cluster_lease.d.ts +4 -0
  479. package/dist/database/migrations/016_cluster_lease.d.ts.map +1 -0
  480. package/dist/database/migrations/016_cluster_lease.js +6 -0
  481. package/dist/database/migrations/016_cluster_lease.js.map +1 -0
  482. package/dist/database/migrations/index.d.ts +1 -1
  483. package/dist/database/migrations/index.d.ts.map +1 -1
  484. package/dist/database/migrations/index.js +22 -13
  485. package/dist/database/migrations/index.js.map +1 -1
  486. package/dist/database/schema-compatibility.d.ts +34 -0
  487. package/dist/database/schema-compatibility.d.ts.map +1 -0
  488. package/dist/database/schema-compatibility.js +109 -0
  489. package/dist/database/schema-compatibility.js.map +1 -0
  490. package/dist/database/schema-expansion-policy.d.ts +10 -0
  491. package/dist/database/schema-expansion-policy.d.ts.map +1 -0
  492. package/dist/database/schema-expansion-policy.js +21 -0
  493. package/dist/database/schema-expansion-policy.js.map +1 -0
  494. package/dist/database/schema-transition-plan.d.ts +53 -0
  495. package/dist/database/schema-transition-plan.d.ts.map +1 -0
  496. package/dist/database/schema-transition-plan.js +102 -0
  497. package/dist/database/schema-transition-plan.js.map +1 -0
  498. package/dist/database/schema-worker.d.ts +2 -0
  499. package/dist/database/schema-worker.d.ts.map +1 -0
  500. package/dist/database/schema-worker.js +55 -0
  501. package/dist/database/schema-worker.js.map +1 -0
  502. package/dist/database/schema.d.ts +6 -1
  503. package/dist/database/schema.d.ts.map +1 -1
  504. package/dist/database/slave-migrations/001_replication_evidence.d.ts +4 -0
  505. package/dist/database/slave-migrations/001_replication_evidence.d.ts.map +1 -0
  506. package/dist/database/slave-migrations/001_replication_evidence.js +89 -0
  507. package/dist/database/slave-migrations/001_replication_evidence.js.map +1 -0
  508. package/dist/database/slave-migrations/index.d.ts +6 -0
  509. package/dist/database/slave-migrations/index.d.ts.map +1 -0
  510. package/dist/database/slave-migrations/index.js +10 -0
  511. package/dist/database/slave-migrations/index.js.map +1 -0
  512. package/dist/diagnostics/index.d.ts +16 -0
  513. package/dist/diagnostics/index.d.ts.map +1 -0
  514. package/dist/diagnostics/index.js +22 -0
  515. package/dist/diagnostics/index.js.map +1 -0
  516. package/dist/execution/command-failure.d.ts +7 -0
  517. package/dist/execution/command-failure.d.ts.map +1 -0
  518. package/dist/execution/command-failure.js +29 -0
  519. package/dist/execution/command-failure.js.map +1 -0
  520. package/dist/execution/execution.service.d.ts +6 -1
  521. package/dist/execution/execution.service.d.ts.map +1 -1
  522. package/dist/execution/execution.service.js +32 -30
  523. package/dist/execution/execution.service.js.map +1 -1
  524. package/dist/files/archive-codec.d.ts +57 -0
  525. package/dist/files/archive-codec.d.ts.map +1 -0
  526. package/dist/files/archive-codec.js +454 -0
  527. package/dist/files/archive-codec.js.map +1 -0
  528. package/dist/files/archive-node.d.ts +27 -0
  529. package/dist/files/archive-node.d.ts.map +1 -0
  530. package/dist/files/archive-node.js +379 -0
  531. package/dist/files/archive-node.js.map +1 -0
  532. package/dist/files/archive-publication.d.ts +26 -0
  533. package/dist/files/archive-publication.d.ts.map +1 -0
  534. package/dist/files/archive-publication.js +224 -0
  535. package/dist/files/archive-publication.js.map +1 -0
  536. package/dist/files/file-config.d.ts +7 -0
  537. package/dist/files/file-config.d.ts.map +1 -0
  538. package/dist/files/file-config.js +11 -0
  539. package/dist/files/file-config.js.map +1 -0
  540. package/dist/files/file-node.d.ts +65 -0
  541. package/dist/files/file-node.d.ts.map +1 -0
  542. package/dist/files/file-node.js +863 -0
  543. package/dist/files/file-node.js.map +1 -0
  544. package/dist/files/file-node.rpc-service.d.ts +12 -0
  545. package/dist/files/file-node.rpc-service.d.ts.map +1 -0
  546. package/dist/files/file-node.rpc-service.js +42 -0
  547. package/dist/files/file-node.rpc-service.js.map +1 -0
  548. package/dist/files/files.rpc-service.d.ts +107 -0
  549. package/dist/files/files.rpc-service.d.ts.map +1 -0
  550. package/dist/files/files.rpc-service.js +769 -0
  551. package/dist/files/files.rpc-service.js.map +1 -0
  552. package/dist/files/structural-policy.d.ts +3 -0
  553. package/dist/files/structural-policy.d.ts.map +1 -0
  554. package/dist/files/structural-policy.js +27 -0
  555. package/dist/files/structural-policy.js.map +1 -0
  556. package/dist/health/contracts.d.ts +30 -0
  557. package/dist/health/contracts.d.ts.map +1 -0
  558. package/dist/health/contracts.js +58 -0
  559. package/dist/health/contracts.js.map +1 -0
  560. package/dist/health/heartbeat.d.ts +11 -0
  561. package/dist/health/heartbeat.d.ts.map +1 -0
  562. package/dist/health/heartbeat.js +32 -0
  563. package/dist/health/heartbeat.js.map +1 -0
  564. package/dist/health/index.d.ts +4 -0
  565. package/dist/health/index.d.ts.map +1 -0
  566. package/dist/health/index.js +2 -0
  567. package/dist/health/index.js.map +1 -0
  568. package/dist/health/readiness.d.ts +15 -0
  569. package/dist/health/readiness.d.ts.map +1 -0
  570. package/dist/health/readiness.js +170 -0
  571. package/dist/health/readiness.js.map +1 -0
  572. package/dist/index.d.ts +1 -0
  573. package/dist/index.d.ts.map +1 -1
  574. package/dist/infrastructure/apt-packages.d.ts +34 -0
  575. package/dist/infrastructure/apt-packages.d.ts.map +1 -0
  576. package/dist/infrastructure/apt-packages.js +232 -0
  577. package/dist/infrastructure/apt-packages.js.map +1 -0
  578. package/dist/infrastructure/bare-metal-plan.d.ts +10 -1
  579. package/dist/infrastructure/bare-metal-plan.d.ts.map +1 -1
  580. package/dist/infrastructure/bare-metal-plan.js +21 -0
  581. package/dist/infrastructure/bare-metal-plan.js.map +1 -1
  582. package/dist/infrastructure/bare-metal-runner.d.ts.map +1 -1
  583. package/dist/infrastructure/bare-metal-runner.js +13 -2
  584. package/dist/infrastructure/bare-metal-runner.js.map +1 -1
  585. package/dist/infrastructure/config-normalizer.d.ts +4 -3
  586. package/dist/infrastructure/config-normalizer.d.ts.map +1 -1
  587. package/dist/infrastructure/config-normalizer.js +11 -3
  588. package/dist/infrastructure/config-normalizer.js.map +1 -1
  589. package/dist/infrastructure/container-runtime.d.ts +37 -3
  590. package/dist/infrastructure/container-runtime.d.ts.map +1 -1
  591. package/dist/infrastructure/container-runtime.js +235 -64
  592. package/dist/infrastructure/container-runtime.js.map +1 -1
  593. package/dist/infrastructure/health-recovery.d.ts +19 -0
  594. package/dist/infrastructure/health-recovery.d.ts.map +1 -0
  595. package/dist/infrastructure/health-recovery.js +39 -0
  596. package/dist/infrastructure/health-recovery.js.map +1 -0
  597. package/dist/infrastructure/host-ingress-config.d.ts.map +1 -1
  598. package/dist/infrastructure/host-ingress-config.js +11 -8
  599. package/dist/infrastructure/host-ingress-config.js.map +1 -1
  600. package/dist/infrastructure/host-ingress-lock.d.ts +2 -3
  601. package/dist/infrastructure/host-ingress-lock.d.ts.map +1 -1
  602. package/dist/infrastructure/host-ingress-lock.js +1 -35
  603. package/dist/infrastructure/host-ingress-lock.js.map +1 -1
  604. package/dist/infrastructure/host-ingress-takeover.js +3 -3
  605. package/dist/infrastructure/host-ingress-takeover.js.map +1 -1
  606. package/dist/infrastructure/host-ingress-types.d.ts +4 -2
  607. package/dist/infrastructure/host-ingress-types.d.ts.map +1 -1
  608. package/dist/infrastructure/host-ingress.service.d.ts.map +1 -1
  609. package/dist/infrastructure/host-ingress.service.js +6 -6
  610. package/dist/infrastructure/host-ingress.service.js.map +1 -1
  611. package/dist/infrastructure/host-inspection.d.ts +1 -0
  612. package/dist/infrastructure/host-inspection.d.ts.map +1 -1
  613. package/dist/infrastructure/host-inspection.js +3 -2
  614. package/dist/infrastructure/host-inspection.js.map +1 -1
  615. package/dist/infrastructure/infrastructure.service.d.ts +80 -29
  616. package/dist/infrastructure/infrastructure.service.d.ts.map +1 -1
  617. package/dist/infrastructure/infrastructure.service.js +561 -216
  618. package/dist/infrastructure/infrastructure.service.js.map +1 -1
  619. package/dist/infrastructure/merge-config.d.ts +10 -0
  620. package/dist/infrastructure/merge-config.d.ts.map +1 -0
  621. package/dist/infrastructure/merge-config.js +27 -0
  622. package/dist/infrastructure/merge-config.js.map +1 -0
  623. package/dist/infrastructure/orphan-containers.d.ts +1 -0
  624. package/dist/infrastructure/orphan-containers.d.ts.map +1 -1
  625. package/dist/infrastructure/orphan-containers.js +1 -1
  626. package/dist/infrastructure/orphan-containers.js.map +1 -1
  627. package/dist/infrastructure/owned-container.d.ts +4 -0
  628. package/dist/infrastructure/owned-container.d.ts.map +1 -0
  629. package/dist/infrastructure/owned-container.js +13 -0
  630. package/dist/infrastructure/owned-container.js.map +1 -0
  631. package/dist/infrastructure/phantom-endpoint-janitor.d.ts +4 -1
  632. package/dist/infrastructure/phantom-endpoint-janitor.d.ts.map +1 -1
  633. package/dist/infrastructure/phantom-endpoint-janitor.js +11 -2
  634. package/dist/infrastructure/phantom-endpoint-janitor.js.map +1 -1
  635. package/dist/infrastructure/presets/minio.d.ts.map +1 -1
  636. package/dist/infrastructure/presets/minio.js +15 -25
  637. package/dist/infrastructure/presets/minio.js.map +1 -1
  638. package/dist/infrastructure/presets/postgres.d.ts.map +1 -1
  639. package/dist/infrastructure/presets/postgres.js +35 -31
  640. package/dist/infrastructure/presets/postgres.js.map +1 -1
  641. package/dist/infrastructure/presets/tor.d.ts +1 -2
  642. package/dist/infrastructure/presets/tor.d.ts.map +1 -1
  643. package/dist/infrastructure/presets/tor.js +7 -13
  644. package/dist/infrastructure/presets/tor.js.map +1 -1
  645. package/dist/infrastructure/provisioning-outcome.d.ts +7 -0
  646. package/dist/infrastructure/provisioning-outcome.d.ts.map +1 -1
  647. package/dist/infrastructure/provisioning-outcome.js +41 -8
  648. package/dist/infrastructure/provisioning-outcome.js.map +1 -1
  649. package/dist/infrastructure/service-resolver.d.ts +1 -1
  650. package/dist/infrastructure/service-resolver.d.ts.map +1 -1
  651. package/dist/infrastructure/service-resolver.js +22 -10
  652. package/dist/infrastructure/service-resolver.js.map +1 -1
  653. package/dist/infrastructure/stack-infra-manager.d.ts +25 -4
  654. package/dist/infrastructure/stack-infra-manager.d.ts.map +1 -1
  655. package/dist/infrastructure/stack-infra-manager.js +181 -21
  656. package/dist/infrastructure/stack-infra-manager.js.map +1 -1
  657. package/dist/infrastructure/types.d.ts +60 -3
  658. package/dist/infrastructure/types.d.ts.map +1 -1
  659. package/dist/mcp/mcp-bridge.js +1 -1
  660. package/dist/mcp/mcp-bridge.js.map +1 -1
  661. package/dist/mcp/monitoring-reading.d.ts +18 -0
  662. package/dist/mcp/monitoring-reading.d.ts.map +1 -0
  663. package/dist/mcp/monitoring-reading.js +84 -0
  664. package/dist/mcp/monitoring-reading.js.map +1 -0
  665. package/dist/mcp/tool-groups/apps.tools.d.ts.map +1 -1
  666. package/dist/mcp/tool-groups/apps.tools.js +6 -4
  667. package/dist/mcp/tool-groups/apps.tools.js.map +1 -1
  668. package/dist/mcp/tool-groups/management.tools.d.ts +2 -0
  669. package/dist/mcp/tool-groups/management.tools.d.ts.map +1 -1
  670. package/dist/mcp/tool-groups/management.tools.js +17 -38
  671. package/dist/mcp/tool-groups/management.tools.js.map +1 -1
  672. package/dist/mcp/tool-groups/monitoring.tools.d.ts.map +1 -1
  673. package/dist/mcp/tool-groups/monitoring.tools.js +45 -2
  674. package/dist/mcp/tool-groups/monitoring.tools.js.map +1 -1
  675. package/dist/mcp/unavailable-tools.js +2 -2
  676. package/dist/mcp/unavailable-tools.js.map +1 -1
  677. package/dist/migration/configuration.d.ts +8 -0
  678. package/dist/migration/configuration.d.ts.map +1 -0
  679. package/dist/migration/configuration.js +16 -0
  680. package/dist/migration/configuration.js.map +1 -0
  681. package/dist/migration/index.d.ts +25 -0
  682. package/dist/migration/index.d.ts.map +1 -0
  683. package/dist/migration/index.js +27 -0
  684. package/dist/migration/index.js.map +1 -0
  685. package/dist/migration/operation.d.ts +31 -0
  686. package/dist/migration/operation.d.ts.map +1 -0
  687. package/dist/migration/operation.js +67 -0
  688. package/dist/migration/operation.js.map +1 -0
  689. package/dist/migration/workspace.d.ts +28 -0
  690. package/dist/migration/workspace.d.ts.map +1 -0
  691. package/dist/migration/workspace.js +91 -0
  692. package/dist/migration/workspace.js.map +1 -0
  693. package/dist/monitoring/app-health.indicator.d.ts +1 -1
  694. package/dist/monitoring/app-health.indicator.d.ts.map +1 -1
  695. package/dist/monitoring/docker-health.indicator.d.ts +4 -2
  696. package/dist/monitoring/docker-health.indicator.d.ts.map +1 -1
  697. package/dist/monitoring/docker-health.indicator.js +66 -5
  698. package/dist/monitoring/docker-health.indicator.js.map +1 -1
  699. package/dist/monitoring/event-loop-watch.d.ts.map +1 -1
  700. package/dist/monitoring/event-loop-watch.js.map +1 -1
  701. package/dist/monitoring/infrastructure-health.d.ts +15 -0
  702. package/dist/monitoring/infrastructure-health.d.ts.map +1 -0
  703. package/dist/monitoring/infrastructure-health.js +2 -0
  704. package/dist/monitoring/infrastructure-health.js.map +1 -0
  705. package/dist/monitoring/log-entry.d.ts +7 -0
  706. package/dist/monitoring/log-entry.d.ts.map +1 -0
  707. package/dist/monitoring/log-entry.js +16 -0
  708. package/dist/monitoring/log-entry.js.map +1 -0
  709. package/dist/monitoring/log-journal.d.ts +40 -0
  710. package/dist/monitoring/log-journal.d.ts.map +1 -0
  711. package/dist/monitoring/log-journal.js +158 -0
  712. package/dist/monitoring/log-journal.js.map +1 -0
  713. package/dist/monitoring/log-line.d.ts +19 -14
  714. package/dist/monitoring/log-line.d.ts.map +1 -1
  715. package/dist/monitoring/log-line.js +70 -59
  716. package/dist/monitoring/log-line.js.map +1 -1
  717. package/dist/monitoring/log-manager.d.ts +34 -37
  718. package/dist/monitoring/log-manager.d.ts.map +1 -1
  719. package/dist/monitoring/log-manager.js +164 -63
  720. package/dist/monitoring/log-manager.js.map +1 -1
  721. package/dist/monitoring/log-sink-health.indicator.d.ts +10 -0
  722. package/dist/monitoring/log-sink-health.indicator.d.ts.map +1 -0
  723. package/dist/monitoring/log-sink-health.indicator.js +21 -0
  724. package/dist/monitoring/log-sink-health.indicator.js.map +1 -0
  725. package/dist/monitoring/metrics-storage.indicator.d.ts +9 -0
  726. package/dist/monitoring/metrics-storage.indicator.d.ts.map +1 -0
  727. package/dist/monitoring/metrics-storage.indicator.js +18 -0
  728. package/dist/monitoring/metrics-storage.indicator.js.map +1 -0
  729. package/dist/monitoring/process-lifetime.d.ts +11 -0
  730. package/dist/monitoring/process-lifetime.d.ts.map +1 -0
  731. package/dist/monitoring/process-lifetime.js +45 -0
  732. package/dist/monitoring/process-lifetime.js.map +1 -0
  733. package/dist/monitoring/runtime-diagnostics.d.ts +47 -0
  734. package/dist/monitoring/runtime-diagnostics.d.ts.map +1 -0
  735. package/dist/monitoring/runtime-diagnostics.js +88 -0
  736. package/dist/monitoring/runtime-diagnostics.js.map +1 -0
  737. package/dist/observability/metrics-bridge.d.ts +5 -1
  738. package/dist/observability/metrics-bridge.d.ts.map +1 -1
  739. package/dist/observability/metrics-bridge.js +11 -0
  740. package/dist/observability/metrics-bridge.js.map +1 -1
  741. package/dist/operations.d.ts +1 -0
  742. package/dist/operations.d.ts.map +1 -1
  743. package/dist/operations.js.map +1 -1
  744. package/dist/orchestrator/app-handle.d.ts +24 -6
  745. package/dist/orchestrator/app-handle.d.ts.map +1 -1
  746. package/dist/orchestrator/app-handle.js +39 -8
  747. package/dist/orchestrator/app-handle.js.map +1 -1
  748. package/dist/orchestrator/application-runtime-child.d.ts +2 -0
  749. package/dist/orchestrator/application-runtime-child.d.ts.map +1 -0
  750. package/dist/orchestrator/application-runtime-child.js +15 -0
  751. package/dist/orchestrator/application-runtime-child.js.map +1 -0
  752. package/dist/orchestrator/application-runtime-resolution.d.ts +4 -0
  753. package/dist/orchestrator/application-runtime-resolution.d.ts.map +1 -0
  754. package/dist/orchestrator/application-runtime-resolution.js +62 -0
  755. package/dist/orchestrator/application-runtime-resolution.js.map +1 -0
  756. package/dist/orchestrator/application-runtime.d.ts +3 -0
  757. package/dist/orchestrator/application-runtime.d.ts.map +1 -0
  758. package/dist/orchestrator/application-runtime.js +20 -0
  759. package/dist/orchestrator/application-runtime.js.map +1 -0
  760. package/dist/orchestrator/application-topology.d.ts +20 -0
  761. package/dist/orchestrator/application-topology.d.ts.map +1 -0
  762. package/dist/orchestrator/application-topology.js +90 -0
  763. package/dist/orchestrator/application-topology.js.map +1 -0
  764. package/dist/orchestrator/bootstrap-loader-child.d.ts +1 -1
  765. package/dist/orchestrator/bootstrap-loader-child.js +7 -16
  766. package/dist/orchestrator/bootstrap-loader-child.js.map +1 -1
  767. package/dist/orchestrator/bootstrap-loader.d.ts +8 -18
  768. package/dist/orchestrator/bootstrap-loader.d.ts.map +1 -1
  769. package/dist/orchestrator/bootstrap-loader.js +21 -204
  770. package/dist/orchestrator/bootstrap-loader.js.map +1 -1
  771. package/dist/orchestrator/bootstrap-process.d.ts +5 -5
  772. package/dist/orchestrator/bootstrap-process.d.ts.map +1 -1
  773. package/dist/orchestrator/bootstrap-process.js +37 -38
  774. package/dist/orchestrator/bootstrap-process.js.map +1 -1
  775. package/dist/orchestrator/build-service.d.ts +3 -3
  776. package/dist/orchestrator/build-service.d.ts.map +1 -1
  777. package/dist/orchestrator/build-service.js +29 -80
  778. package/dist/orchestrator/build-service.js.map +1 -1
  779. package/dist/orchestrator/call-exposed-service.d.ts +8 -0
  780. package/dist/orchestrator/call-exposed-service.d.ts.map +1 -1
  781. package/dist/orchestrator/classic-launcher.d.ts +3 -2
  782. package/dist/orchestrator/classic-launcher.d.ts.map +1 -1
  783. package/dist/orchestrator/classic-launcher.js +26 -22
  784. package/dist/orchestrator/classic-launcher.js.map +1 -1
  785. package/dist/orchestrator/dependency-resolver.d.ts.map +1 -1
  786. package/dist/orchestrator/dependency-resolver.js +7 -38
  787. package/dist/orchestrator/dependency-resolver.js.map +1 -1
  788. package/dist/orchestrator/execution-contract.d.ts +67 -0
  789. package/dist/orchestrator/execution-contract.d.ts.map +1 -0
  790. package/dist/orchestrator/execution-contract.js +2 -0
  791. package/dist/orchestrator/execution-contract.js.map +1 -0
  792. package/dist/orchestrator/file-watcher.d.ts +1 -1
  793. package/dist/orchestrator/file-watcher.d.ts.map +1 -1
  794. package/dist/orchestrator/file-watcher.js +10 -3
  795. package/dist/orchestrator/file-watcher.js.map +1 -1
  796. package/dist/orchestrator/installed-execution.d.ts +7 -0
  797. package/dist/orchestrator/installed-execution.d.ts.map +1 -0
  798. package/dist/orchestrator/installed-execution.js +25 -0
  799. package/dist/orchestrator/installed-execution.js.map +1 -0
  800. package/dist/orchestrator/module-worker-process.d.ts.map +1 -1
  801. package/dist/orchestrator/module-worker-process.js +2 -1
  802. package/dist/orchestrator/module-worker-process.js.map +1 -1
  803. package/dist/orchestrator/orchestrator.service.d.ts +87 -76
  804. package/dist/orchestrator/orchestrator.service.d.ts.map +1 -1
  805. package/dist/orchestrator/orchestrator.service.js +941 -469
  806. package/dist/orchestrator/orchestrator.service.js.map +1 -1
  807. package/dist/orchestrator/process-janitor.d.ts +3 -0
  808. package/dist/orchestrator/process-janitor.d.ts.map +1 -1
  809. package/dist/orchestrator/process-janitor.js +5 -1
  810. package/dist/orchestrator/process-janitor.js.map +1 -1
  811. package/dist/orchestrator/runtime-package-resolution.d.ts +8 -0
  812. package/dist/orchestrator/runtime-package-resolution.d.ts.map +1 -0
  813. package/dist/orchestrator/runtime-package-resolution.js +56 -0
  814. package/dist/orchestrator/runtime-package-resolution.js.map +1 -0
  815. package/dist/orchestrator/service-router.d.ts +4 -108
  816. package/dist/orchestrator/service-router.d.ts.map +1 -1
  817. package/dist/orchestrator/service-router.js +51 -237
  818. package/dist/orchestrator/service-router.js.map +1 -1
  819. package/dist/orchestrator/ts-compiler.d.ts.map +1 -1
  820. package/dist/orchestrator/ts-compiler.js +9 -17
  821. package/dist/orchestrator/ts-compiler.js.map +1 -1
  822. package/dist/project/artifact-builder.d.ts +17 -7
  823. package/dist/project/artifact-builder.d.ts.map +1 -1
  824. package/dist/project/artifact-builder.js +89 -56
  825. package/dist/project/artifact-builder.js.map +1 -1
  826. package/dist/project/bootstrap-metadata.d.ts +42 -0
  827. package/dist/project/bootstrap-metadata.d.ts.map +1 -0
  828. package/dist/project/bootstrap-metadata.js +76 -0
  829. package/dist/project/bootstrap-metadata.js.map +1 -0
  830. package/dist/project/config-resolver.js +3 -3
  831. package/dist/project/config-resolver.js.map +1 -1
  832. package/dist/project/configuration-catalog.d.ts +8 -0
  833. package/dist/project/configuration-catalog.d.ts.map +1 -0
  834. package/dist/project/configuration-catalog.js +29 -0
  835. package/dist/project/configuration-catalog.js.map +1 -0
  836. package/dist/project/declared-config.d.ts +2 -0
  837. package/dist/project/declared-config.d.ts.map +1 -1
  838. package/dist/project/declared-config.js +8 -5
  839. package/dist/project/declared-config.js.map +1 -1
  840. package/dist/project/dependency-topology.d.ts +10 -0
  841. package/dist/project/dependency-topology.d.ts.map +1 -0
  842. package/dist/project/dependency-topology.js +55 -0
  843. package/dist/project/dependency-topology.js.map +1 -0
  844. package/dist/project/infrastructure-ownership.d.ts +5 -0
  845. package/dist/project/infrastructure-ownership.d.ts.map +1 -0
  846. package/dist/project/infrastructure-ownership.js +26 -0
  847. package/dist/project/infrastructure-ownership.js.map +1 -0
  848. package/dist/project/installed-stack-resume.d.ts +62 -0
  849. package/dist/project/installed-stack-resume.d.ts.map +1 -0
  850. package/dist/project/installed-stack-resume.js +261 -0
  851. package/dist/project/installed-stack-resume.js.map +1 -0
  852. package/dist/project/launch-failure.d.ts +3 -0
  853. package/dist/project/launch-failure.d.ts.map +1 -0
  854. package/dist/project/launch-failure.js +32 -0
  855. package/dist/project/launch-failure.js.map +1 -0
  856. package/dist/project/local-release-selection.d.ts +18 -0
  857. package/dist/project/local-release-selection.d.ts.map +1 -0
  858. package/dist/project/local-release-selection.js +36 -0
  859. package/dist/project/local-release-selection.js.map +1 -0
  860. package/dist/project/node-app-config.d.ts +8 -1
  861. package/dist/project/node-app-config.d.ts.map +1 -1
  862. package/dist/project/node-app-config.js +20 -28
  863. package/dist/project/node-app-config.js.map +1 -1
  864. package/dist/project/node-stack-stop.d.ts +83 -0
  865. package/dist/project/node-stack-stop.d.ts.map +1 -0
  866. package/dist/project/node-stack-stop.js +219 -0
  867. package/dist/project/node-stack-stop.js.map +1 -0
  868. package/dist/project/public-stack.d.ts +4 -0
  869. package/dist/project/public-stack.d.ts.map +1 -0
  870. package/dist/project/public-stack.js +29 -0
  871. package/dist/project/public-stack.js.map +1 -0
  872. package/dist/project/registry.d.ts +18 -27
  873. package/dist/project/registry.d.ts.map +1 -1
  874. package/dist/project/registry.js +244 -55
  875. package/dist/project/registry.js.map +1 -1
  876. package/dist/project/requirements-scanner.d.ts +4 -8
  877. package/dist/project/requirements-scanner.d.ts.map +1 -1
  878. package/dist/project/requirements-scanner.js +39 -146
  879. package/dist/project/requirements-scanner.js.map +1 -1
  880. package/dist/project/stack-diagnosis.d.ts +18 -0
  881. package/dist/project/stack-diagnosis.d.ts.map +1 -0
  882. package/dist/project/stack-diagnosis.js +94 -0
  883. package/dist/project/stack-diagnosis.js.map +1 -0
  884. package/dist/project/stack-health.d.ts +12 -0
  885. package/dist/project/stack-health.d.ts.map +1 -0
  886. package/dist/project/stack-health.js +27 -0
  887. package/dist/project/stack-health.js.map +1 -0
  888. package/dist/project/stack-observation.d.ts +8 -0
  889. package/dist/project/stack-observation.d.ts.map +1 -0
  890. package/dist/project/stack-observation.js +126 -0
  891. package/dist/project/stack-observation.js.map +1 -0
  892. package/dist/project/stack-placement.d.ts +11 -0
  893. package/dist/project/stack-placement.d.ts.map +1 -0
  894. package/dist/project/stack-placement.js +57 -0
  895. package/dist/project/stack-placement.js.map +1 -0
  896. package/dist/project/stack-stop-review.d.ts +14 -0
  897. package/dist/project/stack-stop-review.d.ts.map +1 -0
  898. package/dist/project/stack-stop-review.js +22 -0
  899. package/dist/project/stack-stop-review.js.map +1 -0
  900. package/dist/project/stack-targets.d.ts +24 -0
  901. package/dist/project/stack-targets.d.ts.map +1 -0
  902. package/dist/project/stack-targets.js +67 -0
  903. package/dist/project/stack-targets.js.map +1 -0
  904. package/dist/project/topology-control.d.ts +41 -0
  905. package/dist/project/topology-control.d.ts.map +1 -0
  906. package/dist/project/topology-control.js +133 -0
  907. package/dist/project/topology-control.js.map +1 -0
  908. package/dist/project/topology-plan.d.ts +11 -0
  909. package/dist/project/topology-plan.d.ts.map +1 -0
  910. package/dist/project/topology-plan.js +154 -0
  911. package/dist/project/topology-plan.js.map +1 -0
  912. package/dist/project/topology-services.d.ts +7 -0
  913. package/dist/project/topology-services.d.ts.map +1 -0
  914. package/dist/project/topology-services.js +36 -0
  915. package/dist/project/topology-services.js.map +1 -0
  916. package/dist/project/topology-state.d.ts +27 -0
  917. package/dist/project/topology-state.d.ts.map +1 -0
  918. package/dist/project/topology-state.js +71 -0
  919. package/dist/project/topology-state.js.map +1 -0
  920. package/dist/project/workspace-kind.d.ts +3 -0
  921. package/dist/project/workspace-kind.d.ts.map +1 -0
  922. package/dist/project/workspace-kind.js +13 -0
  923. package/dist/project/workspace-kind.js.map +1 -0
  924. package/dist/readiness.d.ts +4 -0
  925. package/dist/readiness.d.ts.map +1 -0
  926. package/dist/readiness.js +3 -0
  927. package/dist/readiness.js.map +1 -0
  928. package/dist/release/application-closure.d.ts +4 -0
  929. package/dist/release/application-closure.d.ts.map +1 -0
  930. package/dist/release/application-closure.js +61 -0
  931. package/dist/release/application-closure.js.map +1 -0
  932. package/dist/release/archive.d.ts +3 -0
  933. package/dist/release/archive.d.ts.map +1 -0
  934. package/dist/release/archive.js +3 -0
  935. package/dist/release/archive.js.map +1 -0
  936. package/dist/release/artifact-inspection.d.ts +50 -0
  937. package/dist/release/artifact-inspection.d.ts.map +1 -0
  938. package/dist/release/artifact-inspection.js +169 -0
  939. package/dist/release/artifact-inspection.js.map +1 -0
  940. package/dist/release/artifact-volumes.d.ts +10 -0
  941. package/dist/release/artifact-volumes.d.ts.map +1 -0
  942. package/dist/release/artifact-volumes.js +112 -0
  943. package/dist/release/artifact-volumes.js.map +1 -0
  944. package/dist/release/build-run.d.ts +12 -15
  945. package/dist/release/build-run.d.ts.map +1 -1
  946. package/dist/release/build-run.js +265 -81
  947. package/dist/release/build-run.js.map +1 -1
  948. package/dist/release/builder.d.ts +8 -2
  949. package/dist/release/builder.d.ts.map +1 -1
  950. package/dist/release/builder.js +18 -4
  951. package/dist/release/builder.js.map +1 -1
  952. package/dist/release/closure-library-path.d.ts +26 -0
  953. package/dist/release/closure-library-path.d.ts.map +1 -0
  954. package/dist/release/closure-library-path.js +160 -0
  955. package/dist/release/closure-library-path.js.map +1 -0
  956. package/dist/release/definition-inputs.d.ts +6 -3
  957. package/dist/release/definition-inputs.d.ts.map +1 -1
  958. package/dist/release/definition-inputs.js +145 -14
  959. package/dist/release/definition-inputs.js.map +1 -1
  960. package/dist/release/framework-source.d.ts +29 -0
  961. package/dist/release/framework-source.d.ts.map +1 -0
  962. package/dist/release/framework-source.js +63 -0
  963. package/dist/release/framework-source.js.map +1 -0
  964. package/dist/release/frozen-installation.d.ts +23 -0
  965. package/dist/release/frozen-installation.d.ts.map +1 -0
  966. package/dist/release/frozen-installation.js +159 -0
  967. package/dist/release/frozen-installation.js.map +1 -0
  968. package/dist/release/import-artifacts.d.ts +9 -0
  969. package/dist/release/import-artifacts.d.ts.map +1 -0
  970. package/dist/release/import-artifacts.js +60 -0
  971. package/dist/release/import-artifacts.js.map +1 -0
  972. package/dist/release/infrastructure.d.ts +6 -0
  973. package/dist/release/infrastructure.d.ts.map +1 -0
  974. package/dist/release/infrastructure.js +74 -0
  975. package/dist/release/infrastructure.js.map +1 -0
  976. package/dist/release/installed-artifacts.d.ts +12 -0
  977. package/dist/release/installed-artifacts.d.ts.map +1 -0
  978. package/dist/release/installed-artifacts.js +199 -0
  979. package/dist/release/installed-artifacts.js.map +1 -0
  980. package/dist/release/installed-graph.d.ts +28 -0
  981. package/dist/release/installed-graph.d.ts.map +1 -0
  982. package/dist/release/installed-graph.js +138 -0
  983. package/dist/release/installed-graph.js.map +1 -0
  984. package/dist/release/installed-origin.d.ts +42 -0
  985. package/dist/release/installed-origin.d.ts.map +1 -0
  986. package/dist/release/installed-origin.js +130 -0
  987. package/dist/release/installed-origin.js.map +1 -0
  988. package/dist/release/installed-release.d.ts +23 -0
  989. package/dist/release/installed-release.d.ts.map +1 -0
  990. package/dist/release/installed-release.js +141 -0
  991. package/dist/release/installed-release.js.map +1 -0
  992. package/dist/release/layout.d.ts +27 -32
  993. package/dist/release/layout.d.ts.map +1 -1
  994. package/dist/release/layout.js +162 -51
  995. package/dist/release/layout.js.map +1 -1
  996. package/dist/release/load.d.ts +3 -0
  997. package/dist/release/load.d.ts.map +1 -1
  998. package/dist/release/load.js +50 -8
  999. package/dist/release/load.js.map +1 -1
  1000. package/dist/release/local-installation.d.ts +20 -0
  1001. package/dist/release/local-installation.d.ts.map +1 -0
  1002. package/dist/release/local-installation.js +298 -0
  1003. package/dist/release/local-installation.js.map +1 -0
  1004. package/dist/release/manifest.d.ts +87 -12
  1005. package/dist/release/manifest.d.ts.map +1 -1
  1006. package/dist/release/manifest.js +31 -7
  1007. package/dist/release/manifest.js.map +1 -1
  1008. package/dist/release/migration-programs.d.ts +12 -0
  1009. package/dist/release/migration-programs.d.ts.map +1 -0
  1010. package/dist/release/migration-programs.js +45 -0
  1011. package/dist/release/migration-programs.js.map +1 -0
  1012. package/dist/release/migrations.d.ts +12 -1
  1013. package/dist/release/migrations.d.ts.map +1 -1
  1014. package/dist/release/migrations.js +124 -9
  1015. package/dist/release/migrations.js.map +1 -1
  1016. package/dist/release/origin.d.ts +33 -0
  1017. package/dist/release/origin.d.ts.map +1 -0
  1018. package/dist/release/origin.js +253 -0
  1019. package/dist/release/origin.js.map +1 -0
  1020. package/dist/release/owner-admission.d.ts +15 -0
  1021. package/dist/release/owner-admission.d.ts.map +1 -0
  1022. package/dist/release/owner-admission.js +37 -0
  1023. package/dist/release/owner-admission.js.map +1 -0
  1024. package/dist/release/owner-executable.d.ts +3 -0
  1025. package/dist/release/owner-executable.d.ts.map +1 -0
  1026. package/dist/release/owner-executable.js +40 -0
  1027. package/dist/release/owner-executable.js.map +1 -0
  1028. package/dist/release/package-gates.d.ts +9 -0
  1029. package/dist/release/package-gates.d.ts.map +1 -0
  1030. package/dist/release/package-gates.js +42 -0
  1031. package/dist/release/package-gates.js.map +1 -0
  1032. package/dist/release/package-resolution.d.ts +4 -0
  1033. package/dist/release/package-resolution.d.ts.map +1 -0
  1034. package/dist/release/package-resolution.js +28 -0
  1035. package/dist/release/package-resolution.js.map +1 -0
  1036. package/dist/release/portable-archive.d.ts +12 -0
  1037. package/dist/release/portable-archive.d.ts.map +1 -0
  1038. package/dist/release/portable-archive.js +96 -0
  1039. package/dist/release/portable-archive.js.map +1 -0
  1040. package/dist/release/registry-download.d.ts +2 -0
  1041. package/dist/release/registry-download.d.ts.map +1 -0
  1042. package/dist/release/registry-download.js +157 -0
  1043. package/dist/release/registry-download.js.map +1 -0
  1044. package/dist/release/registry-framework.d.ts +39 -0
  1045. package/dist/release/registry-framework.d.ts.map +1 -0
  1046. package/dist/release/registry-framework.js +279 -0
  1047. package/dist/release/registry-framework.js.map +1 -0
  1048. package/dist/release/registry-transport.d.ts +27 -0
  1049. package/dist/release/registry-transport.d.ts.map +1 -0
  1050. package/dist/release/registry-transport.js +96 -0
  1051. package/dist/release/registry-transport.js.map +1 -0
  1052. package/dist/release/repository-identity.d.ts +12 -0
  1053. package/dist/release/repository-identity.d.ts.map +1 -0
  1054. package/dist/release/repository-identity.js +62 -0
  1055. package/dist/release/repository-identity.js.map +1 -0
  1056. package/dist/release/runtime-extractor.d.ts +4 -0
  1057. package/dist/release/runtime-extractor.d.ts.map +1 -0
  1058. package/dist/release/runtime-extractor.js +15 -0
  1059. package/dist/release/runtime-extractor.js.map +1 -0
  1060. package/dist/release/runtime-provenance.d.ts +40 -0
  1061. package/dist/release/runtime-provenance.d.ts.map +1 -0
  1062. package/dist/release/runtime-provenance.js +229 -0
  1063. package/dist/release/runtime-provenance.js.map +1 -0
  1064. package/dist/release/source.d.ts +12 -0
  1065. package/dist/release/source.d.ts.map +1 -0
  1066. package/dist/release/source.js +168 -0
  1067. package/dist/release/source.js.map +1 -0
  1068. package/dist/release/store.d.ts +13 -4
  1069. package/dist/release/store.d.ts.map +1 -1
  1070. package/dist/release/store.js +70 -14
  1071. package/dist/release/store.js.map +1 -1
  1072. package/dist/release/target-runtime.d.ts +19 -0
  1073. package/dist/release/target-runtime.d.ts.map +1 -0
  1074. package/dist/release/target-runtime.js +41 -0
  1075. package/dist/release/target-runtime.js.map +1 -0
  1076. package/dist/release/vendored-framework.d.ts +28 -0
  1077. package/dist/release/vendored-framework.d.ts.map +1 -0
  1078. package/dist/release/vendored-framework.js +98 -0
  1079. package/dist/release/vendored-framework.js.map +1 -0
  1080. package/dist/release/workspace-source.d.ts +3 -0
  1081. package/dist/release/workspace-source.d.ts.map +1 -0
  1082. package/dist/release/workspace-source.js +33 -0
  1083. package/dist/release/workspace-source.js.map +1 -0
  1084. package/dist/runtime/context.d.ts +29 -0
  1085. package/dist/runtime/context.d.ts.map +1 -0
  1086. package/dist/runtime/context.js +111 -0
  1087. package/dist/runtime/context.js.map +1 -0
  1088. package/dist/runtime/identity.d.ts +15 -0
  1089. package/dist/runtime/identity.d.ts.map +1 -0
  1090. package/dist/runtime/identity.js +33 -0
  1091. package/dist/runtime/identity.js.map +1 -0
  1092. package/dist/runtime/index.d.ts +3 -0
  1093. package/dist/runtime/index.d.ts.map +1 -0
  1094. package/dist/runtime/index.js +3 -0
  1095. package/dist/runtime/index.js.map +1 -0
  1096. package/dist/services/access.rpc-service.d.ts +41 -0
  1097. package/dist/services/access.rpc-service.d.ts.map +1 -0
  1098. package/dist/services/access.rpc-service.js +248 -0
  1099. package/dist/services/access.rpc-service.js.map +1 -0
  1100. package/dist/services/alert.service.d.ts +1 -1
  1101. package/dist/services/alert.service.d.ts.map +1 -1
  1102. package/dist/services/alert.service.js +1 -1
  1103. package/dist/services/anonymous-input.d.ts +0 -21
  1104. package/dist/services/anonymous-input.d.ts.map +1 -1
  1105. package/dist/services/anonymous-input.js +1 -27
  1106. package/dist/services/anonymous-input.js.map +1 -1
  1107. package/dist/services/audit.service.d.ts +10 -30
  1108. package/dist/services/audit.service.d.ts.map +1 -1
  1109. package/dist/services/audit.service.js +72 -18
  1110. package/dist/services/audit.service.js.map +1 -1
  1111. package/dist/services/auth-context.d.ts +2 -0
  1112. package/dist/services/auth-context.d.ts.map +1 -1
  1113. package/dist/services/auth-context.js +4 -1
  1114. package/dist/services/auth-context.js.map +1 -1
  1115. package/dist/services/auth.rpc-service.d.ts +3 -1
  1116. package/dist/services/auth.rpc-service.d.ts.map +1 -1
  1117. package/dist/services/auth.rpc-service.js +13 -3
  1118. package/dist/services/auth.rpc-service.js.map +1 -1
  1119. package/dist/services/auth.service.d.ts +11 -21
  1120. package/dist/services/auth.service.d.ts.map +1 -1
  1121. package/dist/services/auth.service.js +125 -139
  1122. package/dist/services/auth.service.js.map +1 -1
  1123. package/dist/services/backup-storage.d.ts +14 -0
  1124. package/dist/services/backup-storage.d.ts.map +1 -0
  1125. package/dist/services/backup-storage.js +195 -0
  1126. package/dist/services/backup-storage.js.map +1 -0
  1127. package/dist/services/backup.rpc-service.d.ts +2 -0
  1128. package/dist/services/backup.rpc-service.d.ts.map +1 -1
  1129. package/dist/services/backup.rpc-service.js +9 -0
  1130. package/dist/services/backup.rpc-service.js.map +1 -1
  1131. package/dist/services/backup.service.d.ts +33 -126
  1132. package/dist/services/backup.service.d.ts.map +1 -1
  1133. package/dist/services/backup.service.js +174 -153
  1134. package/dist/services/backup.service.js.map +1 -1
  1135. package/dist/services/bundle-builder.d.ts +12 -0
  1136. package/dist/services/bundle-builder.d.ts.map +1 -1
  1137. package/dist/services/bundle-builder.js +77 -62
  1138. package/dist/services/bundle-builder.js.map +1 -1
  1139. package/dist/services/bundle-overrides.d.ts +25 -0
  1140. package/dist/services/bundle-overrides.d.ts.map +1 -0
  1141. package/dist/services/bundle-overrides.js +96 -0
  1142. package/dist/services/bundle-overrides.js.map +1 -0
  1143. package/dist/services/daemon-authority.d.ts +16 -0
  1144. package/dist/services/daemon-authority.d.ts.map +1 -0
  1145. package/dist/services/daemon-authority.js +54 -0
  1146. package/dist/services/daemon-authority.js.map +1 -0
  1147. package/dist/services/daemon-principal.d.ts +31 -0
  1148. package/dist/services/daemon-principal.d.ts.map +1 -0
  1149. package/dist/services/daemon-principal.js +37 -0
  1150. package/dist/services/daemon-principal.js.map +1 -0
  1151. package/dist/services/deploy.service.d.ts +13 -57
  1152. package/dist/services/deploy.service.d.ts.map +1 -1
  1153. package/dist/services/deploy.service.js +15 -263
  1154. package/dist/services/deploy.service.js.map +1 -1
  1155. package/dist/services/event-broadcaster.rpc-service.d.ts +7 -1
  1156. package/dist/services/event-broadcaster.rpc-service.d.ts.map +1 -1
  1157. package/dist/services/event-broadcaster.rpc-service.js +89 -11
  1158. package/dist/services/event-broadcaster.rpc-service.js.map +1 -1
  1159. package/dist/services/fleet.rpc-service.d.ts +0 -6
  1160. package/dist/services/fleet.rpc-service.d.ts.map +1 -1
  1161. package/dist/services/fleet.rpc-service.js +0 -13
  1162. package/dist/services/fleet.rpc-service.js.map +1 -1
  1163. package/dist/services/health-check.service.d.ts +1 -1
  1164. package/dist/services/health-check.service.d.ts.map +1 -1
  1165. package/dist/services/health-check.service.js +30 -5
  1166. package/dist/services/health-check.service.js.map +1 -1
  1167. package/dist/services/host-upgrade.d.ts +55 -3
  1168. package/dist/services/host-upgrade.d.ts.map +1 -1
  1169. package/dist/services/host-upgrade.js +167 -16
  1170. package/dist/services/host-upgrade.js.map +1 -1
  1171. package/dist/services/infrastructure.rpc-service.d.ts +9 -2
  1172. package/dist/services/infrastructure.rpc-service.d.ts.map +1 -1
  1173. package/dist/services/infrastructure.rpc-service.js +117 -36
  1174. package/dist/services/infrastructure.rpc-service.js.map +1 -1
  1175. package/dist/services/kernel-catalog.d.ts +14 -0
  1176. package/dist/services/kernel-catalog.d.ts.map +1 -0
  1177. package/dist/services/kernel-catalog.js +172 -0
  1178. package/dist/services/kernel-catalog.js.map +1 -0
  1179. package/dist/services/kernel-distribution.d.ts +5 -0
  1180. package/dist/services/kernel-distribution.d.ts.map +1 -0
  1181. package/dist/services/kernel-distribution.js +49 -0
  1182. package/dist/services/kernel-distribution.js.map +1 -0
  1183. package/dist/services/kernel-rollout.service.d.ts +55 -0
  1184. package/dist/services/kernel-rollout.service.d.ts.map +1 -0
  1185. package/dist/services/kernel-rollout.service.js +394 -0
  1186. package/dist/services/kernel-rollout.service.js.map +1 -0
  1187. package/dist/services/local-bundle.d.ts.map +1 -1
  1188. package/dist/services/local-bundle.js +3 -1
  1189. package/dist/services/local-bundle.js.map +1 -1
  1190. package/dist/services/log-collector.rpc-service.d.ts +5 -11
  1191. package/dist/services/log-collector.rpc-service.d.ts.map +1 -1
  1192. package/dist/services/log-collector.rpc-service.js +6 -6
  1193. package/dist/services/log-collector.rpc-service.js.map +1 -1
  1194. package/dist/services/log-collector.service.d.ts +39 -109
  1195. package/dist/services/log-collector.service.d.ts.map +1 -1
  1196. package/dist/services/log-collector.service.js +286 -261
  1197. package/dist/services/log-collector.service.js.map +1 -1
  1198. package/dist/services/log-query.d.ts +6 -0
  1199. package/dist/services/log-query.d.ts.map +1 -0
  1200. package/dist/services/log-query.js +46 -0
  1201. package/dist/services/log-query.js.map +1 -0
  1202. package/dist/services/managed-rollout.d.ts +54 -0
  1203. package/dist/services/managed-rollout.d.ts.map +1 -0
  1204. package/dist/services/managed-rollout.js +124 -0
  1205. package/dist/services/managed-rollout.js.map +1 -0
  1206. package/dist/services/metrics.rpc-service.d.ts +23 -0
  1207. package/dist/services/metrics.rpc-service.d.ts.map +1 -0
  1208. package/dist/services/metrics.rpc-service.js +73 -0
  1209. package/dist/services/metrics.rpc-service.js.map +1 -0
  1210. package/dist/services/migration-process.d.ts +32 -0
  1211. package/dist/services/migration-process.d.ts.map +1 -0
  1212. package/dist/services/migration-process.js +71 -0
  1213. package/dist/services/migration-process.js.map +1 -0
  1214. package/dist/services/migration-target.d.ts +57 -0
  1215. package/dist/services/migration-target.d.ts.map +1 -0
  1216. package/dist/services/migration-target.js +221 -0
  1217. package/dist/services/migration-target.js.map +1 -0
  1218. package/dist/services/node-health.repository.d.ts +2 -59
  1219. package/dist/services/node-health.repository.d.ts.map +1 -1
  1220. package/dist/services/node-health.repository.js.map +1 -1
  1221. package/dist/services/node-host-key.d.ts +9 -0
  1222. package/dist/services/node-host-key.d.ts.map +1 -0
  1223. package/dist/services/node-host-key.js +17 -0
  1224. package/dist/services/node-host-key.js.map +1 -0
  1225. package/dist/services/node-manager.rpc-service.d.ts +44 -37
  1226. package/dist/services/node-manager.rpc-service.d.ts.map +1 -1
  1227. package/dist/services/node-manager.rpc-service.js +208 -37
  1228. package/dist/services/node-manager.rpc-service.js.map +1 -1
  1229. package/dist/services/node-manager.service.d.ts +3 -0
  1230. package/dist/services/node-manager.service.d.ts.map +1 -1
  1231. package/dist/services/node-manager.service.js +78 -27
  1232. package/dist/services/node-manager.service.js.map +1 -1
  1233. package/dist/services/node-registration.d.ts +17 -0
  1234. package/dist/services/node-registration.d.ts.map +1 -0
  1235. package/dist/services/node-registration.js +73 -0
  1236. package/dist/services/node-registration.js.map +1 -0
  1237. package/dist/services/node-upgrade.service.d.ts +2 -28
  1238. package/dist/services/node-upgrade.service.d.ts.map +1 -1
  1239. package/dist/services/node-upgrade.service.js +2 -3
  1240. package/dist/services/node-upgrade.service.js.map +1 -1
  1241. package/dist/services/pipeline-definition.d.ts +14 -0
  1242. package/dist/services/pipeline-definition.d.ts.map +1 -0
  1243. package/dist/services/pipeline-definition.js +77 -0
  1244. package/dist/services/pipeline-definition.js.map +1 -0
  1245. package/dist/services/pipeline.rpc-service.d.ts +10 -3
  1246. package/dist/services/pipeline.rpc-service.d.ts.map +1 -1
  1247. package/dist/services/pipeline.rpc-service.js +38 -14
  1248. package/dist/services/pipeline.rpc-service.js.map +1 -1
  1249. package/dist/services/pipeline.service.d.ts +30 -46
  1250. package/dist/services/pipeline.service.d.ts.map +1 -1
  1251. package/dist/services/pipeline.service.js +401 -344
  1252. package/dist/services/pipeline.service.js.map +1 -1
  1253. package/dist/services/project.rpc-service.d.ts +212 -14
  1254. package/dist/services/project.rpc-service.d.ts.map +1 -1
  1255. package/dist/services/project.rpc-service.js +303 -31
  1256. package/dist/services/project.rpc-service.js.map +1 -1
  1257. package/dist/services/project.service.d.ts +174 -56
  1258. package/dist/services/project.service.d.ts.map +1 -1
  1259. package/dist/services/project.service.js +1957 -661
  1260. package/dist/services/project.service.js.map +1 -1
  1261. package/dist/services/release.rpc-service.d.ts +5 -18
  1262. package/dist/services/release.rpc-service.d.ts.map +1 -1
  1263. package/dist/services/release.rpc-service.js +34 -11
  1264. package/dist/services/release.rpc-service.js.map +1 -1
  1265. package/dist/services/release.service.d.ts +2 -47
  1266. package/dist/services/release.service.d.ts.map +1 -1
  1267. package/dist/services/release.service.js +26 -2
  1268. package/dist/services/release.service.js.map +1 -1
  1269. package/dist/services/remote-deployer.service.d.ts +41 -113
  1270. package/dist/services/remote-deployer.service.d.ts.map +1 -1
  1271. package/dist/services/remote-deployer.service.js +415 -378
  1272. package/dist/services/remote-deployer.service.js.map +1 -1
  1273. package/dist/services/remote-provisioner.d.ts +1 -1
  1274. package/dist/services/remote-provisioner.js +1 -1
  1275. package/dist/services/replication-evidence.d.ts +24 -0
  1276. package/dist/services/replication-evidence.d.ts.map +1 -0
  1277. package/dist/services/replication-evidence.js +61 -0
  1278. package/dist/services/replication-evidence.js.map +1 -0
  1279. package/dist/services/replication-history.d.ts +80 -0
  1280. package/dist/services/replication-history.d.ts.map +1 -0
  1281. package/dist/services/replication-history.js +279 -0
  1282. package/dist/services/replication-history.js.map +1 -0
  1283. package/dist/services/replication-reconciliation.d.ts +74 -0
  1284. package/dist/services/replication-reconciliation.d.ts.map +1 -0
  1285. package/dist/services/replication-reconciliation.js +351 -0
  1286. package/dist/services/replication-reconciliation.js.map +1 -0
  1287. package/dist/services/slave-storage.service.d.ts +2 -19
  1288. package/dist/services/slave-storage.service.d.ts.map +1 -1
  1289. package/dist/services/slave-storage.service.js +19 -6
  1290. package/dist/services/slave-storage.service.js.map +1 -1
  1291. package/dist/services/static-carry-forward.d.ts +2 -2
  1292. package/dist/services/static-carry-forward.d.ts.map +1 -1
  1293. package/dist/services/static-carry-forward.js +10 -3
  1294. package/dist/services/static-carry-forward.js.map +1 -1
  1295. package/dist/services/sync-summary.d.ts.map +1 -1
  1296. package/dist/services/sync-summary.js +1 -18
  1297. package/dist/services/sync-summary.js.map +1 -1
  1298. package/dist/services/sync.rpc-service.d.ts +17 -20
  1299. package/dist/services/sync.rpc-service.d.ts.map +1 -1
  1300. package/dist/services/sync.rpc-service.js +23 -37
  1301. package/dist/services/sync.rpc-service.js.map +1 -1
  1302. package/dist/services/sync.service.d.ts +53 -157
  1303. package/dist/services/sync.service.d.ts.map +1 -1
  1304. package/dist/services/sync.service.js +239 -337
  1305. package/dist/services/sync.service.js.map +1 -1
  1306. package/dist/services/system-info.rpc-service.d.ts +3 -1
  1307. package/dist/services/system-info.rpc-service.d.ts.map +1 -1
  1308. package/dist/services/system-info.rpc-service.js +5 -5
  1309. package/dist/services/system-info.rpc-service.js.map +1 -1
  1310. package/dist/services/system-info.service.d.ts +3 -1
  1311. package/dist/services/system-info.service.d.ts.map +1 -1
  1312. package/dist/services/system-info.service.js +17 -9
  1313. package/dist/services/system-info.service.js.map +1 -1
  1314. package/dist/services/telemetry.rpc-service.d.ts +4 -23
  1315. package/dist/services/telemetry.rpc-service.d.ts.map +1 -1
  1316. package/dist/services/telemetry.rpc-service.js +4 -32
  1317. package/dist/services/telemetry.rpc-service.js.map +1 -1
  1318. package/dist/services/telemetry.service.d.ts +2 -30
  1319. package/dist/services/telemetry.service.d.ts.map +1 -1
  1320. package/dist/services/telemetry.service.js +25 -131
  1321. package/dist/services/telemetry.service.js.map +1 -1
  1322. package/dist/services/terminal-ssh.d.ts +16 -0
  1323. package/dist/services/terminal-ssh.d.ts.map +1 -0
  1324. package/dist/services/terminal-ssh.js +101 -0
  1325. package/dist/services/terminal-ssh.js.map +1 -0
  1326. package/dist/services/terminal.rpc-service.d.ts +84 -0
  1327. package/dist/services/terminal.rpc-service.d.ts.map +1 -0
  1328. package/dist/services/terminal.rpc-service.js +508 -0
  1329. package/dist/services/terminal.rpc-service.js.map +1 -0
  1330. package/dist/services/trace-collector.rpc-service.js +3 -3
  1331. package/dist/services/trace-collector.rpc-service.js.map +1 -1
  1332. package/dist/services/wait-for-postgres.d.ts +1 -1
  1333. package/dist/services/wait-for-postgres.d.ts.map +1 -1
  1334. package/dist/services/wait-for-postgres.js +13 -28
  1335. package/dist/services/wait-for-postgres.js.map +1 -1
  1336. package/dist/shared/build-stamp.d.ts +4 -1
  1337. package/dist/shared/build-stamp.d.ts.map +1 -1
  1338. package/dist/shared/build-stamp.js +14 -6
  1339. package/dist/shared/build-stamp.js.map +1 -1
  1340. package/dist/shared/describe-error.d.ts +1 -21
  1341. package/dist/shared/describe-error.d.ts.map +1 -1
  1342. package/dist/shared/describe-error.js +1 -38
  1343. package/dist/shared/describe-error.js.map +1 -1
  1344. package/dist/shared/dto/access.d.ts +55 -0
  1345. package/dist/shared/dto/access.d.ts.map +1 -0
  1346. package/dist/shared/dto/access.js +2 -0
  1347. package/dist/shared/dto/access.js.map +1 -0
  1348. package/dist/shared/dto/audit.d.ts +32 -0
  1349. package/dist/shared/dto/audit.d.ts.map +1 -0
  1350. package/dist/shared/dto/audit.js +3 -0
  1351. package/dist/shared/dto/audit.js.map +1 -0
  1352. package/dist/shared/dto/auth.d.ts +2 -0
  1353. package/dist/shared/dto/auth.d.ts.map +1 -1
  1354. package/dist/shared/dto/auth.js +5 -1
  1355. package/dist/shared/dto/auth.js.map +1 -1
  1356. package/dist/shared/dto/backend.d.ts +50 -0
  1357. package/dist/shared/dto/backend.d.ts.map +1 -0
  1358. package/dist/shared/dto/backend.js +3 -0
  1359. package/dist/shared/dto/backend.js.map +1 -0
  1360. package/dist/shared/dto/backups.d.ts +99 -0
  1361. package/dist/shared/dto/backups.d.ts.map +1 -1
  1362. package/dist/shared/dto/cluster.d.ts +44 -0
  1363. package/dist/shared/dto/cluster.d.ts.map +1 -0
  1364. package/dist/shared/dto/cluster.js +3 -0
  1365. package/dist/shared/dto/cluster.js.map +1 -0
  1366. package/dist/shared/dto/files.d.ts +328 -0
  1367. package/dist/shared/dto/files.d.ts.map +1 -0
  1368. package/dist/shared/dto/files.js +2 -0
  1369. package/dist/shared/dto/files.js.map +1 -0
  1370. package/dist/shared/dto/health.d.ts +59 -0
  1371. package/dist/shared/dto/health.d.ts.map +1 -1
  1372. package/dist/shared/dto/installed-release.d.ts +40 -0
  1373. package/dist/shared/dto/installed-release.d.ts.map +1 -0
  1374. package/dist/shared/dto/installed-release.js +2 -0
  1375. package/dist/shared/dto/installed-release.js.map +1 -0
  1376. package/dist/shared/dto/kernel-catalog.d.ts +11 -0
  1377. package/dist/shared/dto/kernel-catalog.d.ts.map +1 -0
  1378. package/dist/shared/dto/kernel-catalog.js +2 -0
  1379. package/dist/shared/dto/kernel-catalog.js.map +1 -0
  1380. package/dist/shared/dto/logs.d.ts +21 -0
  1381. package/dist/shared/dto/logs.d.ts.map +1 -1
  1382. package/dist/shared/dto/metrics.d.ts +4 -64
  1383. package/dist/shared/dto/metrics.d.ts.map +1 -1
  1384. package/dist/shared/dto/metrics.js +0 -15
  1385. package/dist/shared/dto/metrics.js.map +1 -1
  1386. package/dist/shared/dto/nodes.d.ts +96 -22
  1387. package/dist/shared/dto/nodes.d.ts.map +1 -1
  1388. package/dist/shared/dto/pipelines.d.ts +22 -1
  1389. package/dist/shared/dto/pipelines.d.ts.map +1 -1
  1390. package/dist/shared/dto/project.d.ts +289 -30
  1391. package/dist/shared/dto/project.d.ts.map +1 -1
  1392. package/dist/shared/dto/releases.d.ts +59 -0
  1393. package/dist/shared/dto/releases.d.ts.map +1 -0
  1394. package/dist/shared/dto/releases.js +2 -0
  1395. package/dist/shared/dto/releases.js.map +1 -0
  1396. package/dist/shared/dto/services.d.ts +174 -37
  1397. package/dist/shared/dto/services.d.ts.map +1 -1
  1398. package/dist/shared/dto/services.js +15 -6
  1399. package/dist/shared/dto/services.js.map +1 -1
  1400. package/dist/shared/dto/stack-diagnosis.d.ts +20 -0
  1401. package/dist/shared/dto/stack-diagnosis.d.ts.map +1 -0
  1402. package/dist/shared/dto/stack-diagnosis.js +8 -0
  1403. package/dist/shared/dto/stack-diagnosis.js.map +1 -0
  1404. package/dist/shared/dto/stack-execution.d.ts +65 -0
  1405. package/dist/shared/dto/stack-execution.d.ts.map +1 -0
  1406. package/dist/shared/dto/stack-execution.js +33 -0
  1407. package/dist/shared/dto/stack-execution.js.map +1 -0
  1408. package/dist/shared/dto/system-info.d.ts +11 -0
  1409. package/dist/shared/dto/system-info.d.ts.map +1 -1
  1410. package/dist/shared/dto/system-info.js +7 -1
  1411. package/dist/shared/dto/system-info.js.map +1 -1
  1412. package/dist/shared/dto/terminal.d.ts +40 -0
  1413. package/dist/shared/dto/terminal.d.ts.map +1 -0
  1414. package/dist/shared/dto/terminal.js +2 -0
  1415. package/dist/shared/dto/terminal.js.map +1 -0
  1416. package/dist/shared/dto/topology.d.ts +96 -0
  1417. package/dist/shared/dto/topology.d.ts.map +1 -0
  1418. package/dist/shared/dto/topology.js +2 -0
  1419. package/dist/shared/dto/topology.js.map +1 -0
  1420. package/dist/shared/emergency-output.d.ts +3 -0
  1421. package/dist/shared/emergency-output.d.ts.map +1 -0
  1422. package/dist/shared/emergency-output.js +22 -0
  1423. package/dist/shared/emergency-output.js.map +1 -0
  1424. package/dist/shared/env-config.d.ts +2 -0
  1425. package/dist/shared/env-config.d.ts.map +1 -1
  1426. package/dist/shared/env-config.js +1 -0
  1427. package/dist/shared/env-config.js.map +1 -1
  1428. package/dist/shared/events.d.ts +2 -0
  1429. package/dist/shared/events.d.ts.map +1 -1
  1430. package/dist/shared/events.js.map +1 -1
  1431. package/dist/shared/execution-identity.d.ts +39 -0
  1432. package/dist/shared/execution-identity.d.ts.map +1 -0
  1433. package/dist/shared/execution-identity.js +160 -0
  1434. package/dist/shared/execution-identity.js.map +1 -0
  1435. package/dist/shared/file-policy.d.ts +5 -0
  1436. package/dist/shared/file-policy.d.ts.map +1 -0
  1437. package/dist/shared/file-policy.js +18 -0
  1438. package/dist/shared/file-policy.js.map +1 -0
  1439. package/dist/shared/framework-source.d.ts +11 -0
  1440. package/dist/shared/framework-source.d.ts.map +1 -0
  1441. package/dist/shared/framework-source.js +31 -0
  1442. package/dist/shared/framework-source.js.map +1 -0
  1443. package/dist/shared/fresh-module-reader.d.ts +40 -0
  1444. package/dist/shared/fresh-module-reader.d.ts.map +1 -0
  1445. package/dist/shared/fresh-module-reader.js +257 -0
  1446. package/dist/shared/fresh-module-reader.js.map +1 -0
  1447. package/dist/shared/host-boot-identity.d.ts +12 -0
  1448. package/dist/shared/host-boot-identity.d.ts.map +1 -0
  1449. package/dist/shared/host-boot-identity.js +89 -0
  1450. package/dist/shared/host-boot-identity.js.map +1 -0
  1451. package/dist/shared/kernel-file-lock.d.ts +3 -0
  1452. package/dist/shared/kernel-file-lock.d.ts.map +1 -0
  1453. package/dist/shared/kernel-file-lock.js +53 -0
  1454. package/dist/shared/kernel-file-lock.js.map +1 -0
  1455. package/dist/shared/linux-file-lock.d.ts +4 -0
  1456. package/dist/shared/linux-file-lock.d.ts.map +1 -0
  1457. package/dist/shared/linux-file-lock.js +36 -0
  1458. package/dist/shared/linux-file-lock.js.map +1 -0
  1459. package/dist/shared/log-ingestion-reading.d.ts +9 -0
  1460. package/dist/shared/log-ingestion-reading.d.ts.map +1 -0
  1461. package/dist/shared/log-ingestion-reading.js +32 -0
  1462. package/dist/shared/log-ingestion-reading.js.map +1 -0
  1463. package/dist/shared/log-levels.d.ts +19 -0
  1464. package/dist/shared/log-levels.d.ts.map +1 -0
  1465. package/dist/shared/log-levels.js +23 -0
  1466. package/dist/shared/log-levels.js.map +1 -0
  1467. package/dist/shared/metrics-storage-reading.d.ts +8 -0
  1468. package/dist/shared/metrics-storage-reading.d.ts.map +1 -0
  1469. package/dist/shared/metrics-storage-reading.js +27 -0
  1470. package/dist/shared/metrics-storage-reading.js.map +1 -0
  1471. package/dist/shared/pnpm.d.ts.map +1 -1
  1472. package/dist/shared/pnpm.js +7 -0
  1473. package/dist/shared/pnpm.js.map +1 -1
  1474. package/dist/shared/pool-scale.d.ts +10 -0
  1475. package/dist/shared/pool-scale.d.ts.map +1 -0
  1476. package/dist/shared/pool-scale.js +25 -0
  1477. package/dist/shared/pool-scale.js.map +1 -0
  1478. package/dist/shared/private-files.d.ts +10 -22
  1479. package/dist/shared/private-files.d.ts.map +1 -1
  1480. package/dist/shared/private-files.js +95 -82
  1481. package/dist/shared/private-files.js.map +1 -1
  1482. package/dist/shared/relay-reading.d.ts +19 -0
  1483. package/dist/shared/relay-reading.d.ts.map +1 -0
  1484. package/dist/shared/relay-reading.js +22 -0
  1485. package/dist/shared/relay-reading.js.map +1 -0
  1486. package/dist/shared/release-reading.d.ts +124 -32
  1487. package/dist/shared/release-reading.d.ts.map +1 -1
  1488. package/dist/shared/release-reading.js +208 -28
  1489. package/dist/shared/release-reading.js.map +1 -1
  1490. package/dist/shared/roles.d.ts +19 -18
  1491. package/dist/shared/roles.d.ts.map +1 -1
  1492. package/dist/shared/roles.js +21 -26
  1493. package/dist/shared/roles.js.map +1 -1
  1494. package/dist/shared/runtime-artifact.d.ts +20 -0
  1495. package/dist/shared/runtime-artifact.d.ts.map +1 -0
  1496. package/dist/shared/runtime-artifact.js +83 -0
  1497. package/dist/shared/runtime-artifact.js.map +1 -0
  1498. package/dist/shared/stack-reading.d.ts +18 -0
  1499. package/dist/shared/stack-reading.d.ts.map +1 -0
  1500. package/dist/shared/stack-reading.js +15 -0
  1501. package/dist/shared/stack-reading.js.map +1 -0
  1502. package/dist/shared/sync-reading.d.ts +30 -38
  1503. package/dist/shared/sync-reading.d.ts.map +1 -1
  1504. package/dist/shared/sync-reading.js +90 -29
  1505. package/dist/shared/sync-reading.js.map +1 -1
  1506. package/dist/shared/tokens.d.ts +3 -1
  1507. package/dist/shared/tokens.d.ts.map +1 -1
  1508. package/dist/shared/tokens.js +1 -0
  1509. package/dist/shared/tokens.js.map +1 -1
  1510. package/dist/supervisor/restart-policy.d.ts.map +1 -1
  1511. package/dist/supervisor/restart-policy.js +7 -5
  1512. package/dist/supervisor/restart-policy.js.map +1 -1
  1513. package/dist/webapp/console-container.d.ts +7 -0
  1514. package/dist/webapp/console-container.d.ts.map +1 -0
  1515. package/dist/webapp/console-container.js +23 -0
  1516. package/dist/webapp/console-container.js.map +1 -0
  1517. package/dist/webapp/webapp.service.d.ts.map +1 -1
  1518. package/dist/webapp/webapp.service.js +71 -24
  1519. package/dist/webapp/webapp.service.js.map +1 -1
  1520. package/dist/workers/health-monitor.service.d.ts.map +1 -1
  1521. package/dist/workers/health-monitor.service.js +8 -1
  1522. package/dist/workers/health-monitor.service.js.map +1 -1
  1523. package/dist/workers/types.d.ts +2 -0
  1524. package/dist/workers/types.d.ts.map +1 -1
  1525. package/package.json +109 -44
  1526. package/webapp/dist/BUILD.json +4 -3
  1527. package/webapp/dist/assets/access-48hkC2-P.js +1 -0
  1528. package/webapp/dist/assets/access-jWkHxGc7.js +1 -0
  1529. package/webapp/dist/assets/admin-data-table-BKSDI8sU.js +1 -0
  1530. package/webapp/dist/assets/alert-expression-CSblScoa.js +1 -0
  1531. package/webapp/dist/assets/alert-notify-settings-C_CHZrFm.js +1 -0
  1532. package/webapp/dist/assets/alert-uBG6r9NW.js +1 -0
  1533. package/webapp/dist/assets/alerts-CuPQ9YQJ.js +1 -0
  1534. package/webapp/dist/assets/app-address-BCXfN59F.js +1 -0
  1535. package/webapp/dist/assets/apps-Drio028B.js +1 -0
  1536. package/webapp/dist/assets/audit-npSFJECe.js +1 -0
  1537. package/webapp/dist/assets/auth-CcgjP7hR.js +1 -0
  1538. package/webapp/dist/assets/card-DkH32gMY.js +1 -0
  1539. package/webapp/dist/assets/chart-BpGXlCJc.js +2 -0
  1540. package/webapp/dist/assets/charts-BY7qI6s2.js +41 -0
  1541. package/webapp/dist/assets/charts-CpBdHU_A.js +56 -0
  1542. package/webapp/dist/assets/client-DFnuv2z3.js +3 -0
  1543. package/webapp/dist/assets/code-editor-DK6Tmmxv.js +4 -0
  1544. package/webapp/dist/assets/comparison-bars-BtC0dHjF.js +1 -0
  1545. package/webapp/dist/assets/confirm-dialog-BbGsAz7_.js +1 -0
  1546. package/webapp/dist/assets/console-keyboard-D3YCA0yU.js +1 -0
  1547. package/webapp/dist/assets/constants-CyhngVXh.js +1 -0
  1548. package/webapp/dist/assets/containers-Bl8gAyZX.js +3 -0
  1549. package/webapp/dist/assets/context-FIuwpd9_.js +1 -0
  1550. package/webapp/dist/assets/controls-C5W8gHU4.js +1 -0
  1551. package/webapp/dist/assets/daemon-memory-BiEtr9jr.js +1 -0
  1552. package/webapp/dist/assets/dashboard-UHlet3H9.js +1 -0
  1553. package/webapp/dist/assets/dashboard-builder-67PZFqhE.js +1 -0
  1554. package/webapp/dist/assets/dayjs.min-DHwAvH5f.js +1 -0
  1555. package/webapp/dist/assets/deploy-release-dialog-BOXcD5Wo.js +1 -0
  1556. package/webapp/dist/assets/deployments-qV20Ak0P.js +1 -0
  1557. package/webapp/dist/assets/detail-B4TiBfxU.js +8 -0
  1558. package/webapp/dist/assets/detail-B85-Wees.js +2 -0
  1559. package/webapp/dist/assets/detail-CYS81K6Y.js +1 -0
  1560. package/webapp/dist/assets/dist-BUDn8hLh.js +11 -0
  1561. package/webapp/dist/assets/dist-Ci5pYRbx.js +1 -0
  1562. package/webapp/dist/assets/dist-DQmjHv4-.js +1 -0
  1563. package/webapp/dist/assets/dist-De9Fty7a.js +1 -0
  1564. package/webapp/dist/assets/dist-DsGmKwmk.js +23 -0
  1565. package/webapp/dist/assets/empty-content-7jOFhG4C.js +1 -0
  1566. package/webapp/dist/assets/error-boundary-CLLI8PWw.js +3 -0
  1567. package/webapp/dist/assets/event-fields-CiyqrRO8.js +1 -0
  1568. package/webapp/dist/assets/files-DigwXndm.js +2 -0
  1569. package/webapp/dist/assets/formatters-RnRy4bXm.js +1 -0
  1570. package/webapp/dist/assets/icons-OboZgWSt.js +1 -0
  1571. package/webapp/dist/assets/index-uq8Dkk4c.js +1 -0
  1572. package/webapp/dist/assets/label-B1SF0RTL.js +1 -0
  1573. package/webapp/dist/assets/log-level-filter-Bcn31D1F.js +1 -0
  1574. package/webapp/dist/assets/log-location-DuBjh6HQ.js +1 -0
  1575. package/webapp/dist/assets/logs-BqHOufk8.js +4 -0
  1576. package/webapp/dist/assets/metric-chart-M-kI-XOt.js +1 -0
  1577. package/webapp/dist/assets/metric-series-WxePniyw.js +1 -0
  1578. package/webapp/dist/assets/metrics-QIQaF7iS.js +1 -0
  1579. package/webapp/dist/assets/model-ZEXEHm0l.js +2 -0
  1580. package/webapp/dist/assets/mui-6ssfcZcz.js +1 -0
  1581. package/webapp/dist/assets/mui-AnEgAVjz.js +52 -0
  1582. package/webapp/dist/assets/mui-B1jrje6Z.js +1 -0
  1583. package/webapp/dist/assets/mui-BIz4LSVs.js +1 -0
  1584. package/webapp/dist/assets/mui-BTN91yBK.js +28 -0
  1585. package/webapp/dist/assets/mui-BXSXx9c9.js +124 -0
  1586. package/webapp/dist/assets/mui-BwsIrivo.js +37 -0
  1587. package/webapp/dist/assets/mui-C_hromOc.js +1 -0
  1588. package/webapp/dist/assets/mui-Cd711nOk.js +4 -0
  1589. package/webapp/dist/assets/mui-CdB_p2lt.js +10 -0
  1590. package/webapp/dist/assets/mui-DyT2n1lx.js +1 -0
  1591. package/webapp/dist/assets/mui-agG5dued.js +1 -0
  1592. package/webapp/dist/assets/mui-y44PQOfG.js +1 -0
  1593. package/webapp/dist/assets/nodes-BJPk02vv.js +7 -0
  1594. package/webapp/dist/assets/omnitron-logo-koMCbsCv.js +1 -0
  1595. package/webapp/dist/assets/operation-status-Bm1x1wTz.js +1 -0
  1596. package/webapp/dist/assets/page-breadcrumbs-fR7Jmpp4.js +1 -0
  1597. package/webapp/dist/assets/pipelines-T6Ch9LTw.js +3 -0
  1598. package/webapp/dist/assets/popper-m_9b0JRf.js +1 -0
  1599. package/webapp/dist/assets/preload-helper-DzCYNvzR.js +1 -0
  1600. package/webapp/dist/assets/project.store--G5pIF-J.js +1 -0
  1601. package/webapp/dist/assets/projects-YoBzcQ24.js +1 -0
  1602. package/webapp/dist/assets/react-BN8qLIAi.js +9 -0
  1603. package/webapp/dist/assets/react-CEuifcaQ.js +1 -0
  1604. package/webapp/dist/assets/react-apexcharts.esm-DoOt-pu4.js +1 -0
  1605. package/webapp/dist/assets/realtime.store-CBDO4Abj.js +1 -0
  1606. package/webapp/dist/assets/release-bits-B2a_wbft.js +1 -0
  1607. package/webapp/dist/assets/release-build-panel-BQmIdKW9.js +1 -0
  1608. package/webapp/dist/assets/release-deployment-state-DRrEI2pP.js +1 -0
  1609. package/webapp/dist/assets/release-wire-f2VuBoBF.js +1 -0
  1610. package/webapp/dist/assets/releases-Bp3CDgmo.js +2 -0
  1611. package/webapp/dist/assets/rolldown-runtime-CNOWq4Kh.js +1 -0
  1612. package/webapp/dist/assets/search-input-C0MHI8vO.js +1 -0
  1613. package/webapp/dist/assets/services-BddvcFi8.js +1 -0
  1614. package/webapp/dist/assets/settings-B3egRvbI.js +1 -0
  1615. package/webapp/dist/assets/settled-pair-B-wgSZl6.js +1 -0
  1616. package/webapp/dist/assets/shared-styles-C0vN3I7_.js +1 -0
  1617. package/webapp/dist/assets/shell-command-C3pXf1vi.js +1 -0
  1618. package/webapp/dist/assets/sign-in-9q-Nfy83.js +1 -0
  1619. package/webapp/dist/assets/skeleton-BmWDJWF9.js +1 -0
  1620. package/webapp/dist/assets/snackbar-DSPmjMyi.js +1 -0
  1621. package/webapp/dist/assets/stack-health-status-BIv2C10x.js +1 -0
  1622. package/webapp/dist/assets/stack-start-notice-BVnMOwRQ.js +1 -0
  1623. package/webapp/dist/assets/stacks-IZ1mfizi.js +1 -0
  1624. package/webapp/dist/assets/storage-CKXnhqkt.js +1 -0
  1625. package/webapp/dist/assets/store-bqUBn2A4.js +1 -0
  1626. package/webapp/dist/assets/sync-reading-CN0jPKAg.js +1 -0
  1627. package/webapp/dist/assets/system-info-BFKNM-hf.js +1 -0
  1628. package/webapp/dist/assets/table-BOWT6Y9d.js +1 -0
  1629. package/webapp/dist/assets/table-viewport-Bp4pq-c_.js +1 -0
  1630. package/webapp/dist/assets/tabs-k5NPGLnJ.js +1 -0
  1631. package/webapp/dist/assets/terminal-BrP-ENHg.css +1 -0
  1632. package/webapp/dist/assets/terminal-QWBau-Us.js +62 -0
  1633. package/webapp/dist/assets/terminal-input-b7f2VoE_.js +2 -0
  1634. package/webapp/dist/assets/topology-CPey5dP6.js +8 -0
  1635. package/webapp/dist/assets/topology-metadata-dialog-BivuU2y6.js +2 -0
  1636. package/webapp/dist/assets/topology-routes.worker-BoYrIzAH.js +1 -0
  1637. package/webapp/dist/assets/traces-By0rdfDC.js +1 -0
  1638. package/webapp/dist/assets/use-copy-to-clipboard-BWYpToS3.js +1 -0
  1639. package/webapp/dist/assets/use-polled-resource-B22hhr5L.js +1 -0
  1640. package/webapp/dist/assets/use-stack-context-UkBsF-l7.js +1 -0
  1641. package/webapp/dist/assets/webapp-BnxOVfrc.css +1 -0
  1642. package/webapp/dist/assets/webapp-D-UhjFhS.js +35 -0
  1643. package/webapp/dist/console-version.json +1 -0
  1644. package/webapp/dist/index.html +54 -7
  1645. package/dist/release/daemon-omni.d.ts +0 -41
  1646. package/dist/release/daemon-omni.d.ts.map +0 -1
  1647. package/dist/release/daemon-omni.js +0 -59
  1648. package/dist/release/daemon-omni.js.map +0 -1
  1649. package/dist/services/netron-telemetry-transport.d.ts +0 -42
  1650. package/dist/services/netron-telemetry-transport.d.ts.map +0 -1
  1651. package/dist/services/netron-telemetry-transport.js +0 -93
  1652. package/dist/services/netron-telemetry-transport.js.map +0 -1
  1653. package/webapp/dist/assets/FormControlLabel-BbSxpQwN.js +0 -1
  1654. package/webapp/dist/assets/Grid-DizFZYue.js +0 -1
  1655. package/webapp/dist/assets/Switch-Bfiqzx8l.js +0 -1
  1656. package/webapp/dist/assets/alerts-DH_RVRS3.js +0 -1
  1657. package/webapp/dist/assets/apps-B96355sz.js +0 -1
  1658. package/webapp/dist/assets/audit-CYGtbi4k.js +0 -1
  1659. package/webapp/dist/assets/client-BmqFExWT.js +0 -1
  1660. package/webapp/dist/assets/constants-veKGFkC6.js +0 -1
  1661. package/webapp/dist/assets/containers-B_TpThln.js +0 -2
  1662. package/webapp/dist/assets/daemon-memory-CCPZ4cV_.js +0 -1
  1663. package/webapp/dist/assets/dashboard-DHf2_65N.js +0 -1
  1664. package/webapp/dist/assets/dashboard-builder-CWY2pjeG.js +0 -1
  1665. package/webapp/dist/assets/deploy-release-dialog-Dp-zpSAd.js +0 -1
  1666. package/webapp/dist/assets/deployments-tJI6O3fK.js +0 -1
  1667. package/webapp/dist/assets/detail-B2zP1Hto.js +0 -8
  1668. package/webapp/dist/assets/detail-CoIrwmsy.js +0 -1
  1669. package/webapp/dist/assets/detail-DWaGaOtL.js +0 -2
  1670. package/webapp/dist/assets/formatters-BqjL73N3.js +0 -1
  1671. package/webapp/dist/assets/fs-Ccl3sAcp.js +0 -1
  1672. package/webapp/dist/assets/index-Dvo0iprx.css +0 -1
  1673. package/webapp/dist/assets/index-vMnY_4jR.js +0 -412
  1674. package/webapp/dist/assets/logs-DTRjOfX8.js +0 -12
  1675. package/webapp/dist/assets/maplibre-gl-DowHoZAx.js +0 -814
  1676. package/webapp/dist/assets/metrics-UCajtdox.js +0 -2
  1677. package/webapp/dist/assets/nodes-DuTVU0f6.js +0 -7
  1678. package/webapp/dist/assets/pipelines-C8BeDcAl.js +0 -4
  1679. package/webapp/dist/assets/projects-Dp_zFfLY.js +0 -1
  1680. package/webapp/dist/assets/react-DlmbjZJV.js +0 -1
  1681. package/webapp/dist/assets/react-apexcharts.esm-C8pn45ml.js +0 -97
  1682. package/webapp/dist/assets/release-bits-BzTKz5fM.js +0 -1
  1683. package/webapp/dist/assets/release-build-panel-DcW9YcXQ.js +0 -1
  1684. package/webapp/dist/assets/releases-B4hcr1bE.js +0 -2
  1685. package/webapp/dist/assets/rolldown-runtime-XKyaHtl9.js +0 -1
  1686. package/webapp/dist/assets/settings-DIteZTbe.js +0 -1
  1687. package/webapp/dist/assets/settled-pair-C7SjZuns.js +0 -1
  1688. package/webapp/dist/assets/sign-in-D4kMBOHp.js +0 -1
  1689. package/webapp/dist/assets/stacks-Brnf-EB7.js +0 -1
  1690. package/webapp/dist/assets/sync-reading-C3PnJ7AX.js +0 -1
  1691. package/webapp/dist/assets/system-info-CFDNVKkU.js +0 -1
  1692. package/webapp/dist/assets/topology-7WeTUsDN.js +0 -12
  1693. package/webapp/dist/assets/traces-9c3gwCN-.js +0 -1
  1694. package/webapp/dist/assets/use-stack-context-CnA5FTHu.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
  *
@@ -21,13 +34,16 @@ import path from 'node:path';
21
34
  import { Application, ShutdownReason, ShutdownPriority, ApplicationEvent } from '@omnitron-dev/titan';
22
35
  import { UnixSocketTransport } from '@omnitron-dev/titan/netron/transport/unix';
23
36
  import { TcpTransport } from '@omnitron-dev/titan/netron/transport/tcp';
37
+ import { TransportRequestLimiter } from '@omnitron-dev/titan/netron';
24
38
  import { HttpTransport } from '@omnitron-dev/titan/netron/transport/http';
25
39
  import { WebSocketTransport } from '@omnitron-dev/titan/netron/transport/websocket';
26
40
  import { LOGGER_SERVICE_TOKEN } from '@omnitron-dev/titan/module/logger';
27
41
  import { SCHEDULER_SERVICE_TOKEN } from '@omnitron-dev/titan-scheduler';
28
42
  import { HEALTH_SERVICE_TOKEN as TITAN_HEALTH_TOKEN } from '@omnitron-dev/titan-health';
29
43
  import os from 'node:os';
30
- 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';
31
47
  import { createDaemonModule, getDaemonLogStream, getDaemonErrorStream, getDaemonLogCollectorStream } from './daemon.module.js';
32
48
  import { DaemonRpcService } from './daemon.rpc-service.js';
33
49
  import { AuthRpcService } from '../services/auth.rpc-service.js';
@@ -40,21 +56,30 @@ import { SyncRpcService } from '../services/sync.rpc-service.js';
40
56
  import { SystemInfoService } from '../services/system-info.service.js';
41
57
  import { SystemInfoRpcService } from '../services/system-info.rpc-service.js';
42
58
  import { PidManager } from './pid-manager.js';
59
+ import { prepareDaemonDatabase } from './database-startup.js';
43
60
  import { FileWatcher } from '../orchestrator/file-watcher.js';
44
61
  import { InfrastructureService } from '../infrastructure/infrastructure.service.js';
45
62
  import { DockerHealthIndicator } from '../monitoring/docker-health.indicator.js';
46
63
  import { AppHealthIndicator } from '../monitoring/app-health.indicator.js';
47
64
  import { EventLoopWatch } from '../monitoring/event-loop-watch.js';
48
65
  import { EventLoopStallIndicator } from '../monitoring/event-loop-stall.indicator.js';
66
+ import { runtimeDiagnostics } from '../monitoring/runtime-diagnostics.js';
49
67
  import { registerDaemonJobs } from './daemon-scheduler.js';
50
- import { METRICS_SERVICE_TOKEN as TITAN_METRICS_TOKEN } from '@omnitron-dev/titan-metrics';
51
- 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';
52
70
  import { APP_EVENTS, INFRA_EVENTS, DAEMON_EVENTS, PROJECT_EVENTS, STACK_EVENTS, NODE_EVENTS, } from '../shared/events.js';
53
71
  import { JWT_SERVICE_TOKEN } from '@omnitron-dev/titan-auth';
54
72
  import { AuthenticationManager, AuthorizationManager, } from '@omnitron-dev/titan/netron/auth';
55
73
  import { createAuthContextWrapper } from '../services/auth-context.js';
74
+ import { createDaemonTokenValidator, createDaemonPrincipalValidator } from '../services/daemon-authority.js';
56
75
  import { ROLES } from '../shared/roles.js';
57
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';
58
83
  /**
59
84
  * Deadline for a request on the daemon's unix socket.
60
85
  *
@@ -101,34 +126,7 @@ export function fleetBindHostFor(dc) {
101
126
  return dc.host ?? '0.0.0.0';
102
127
  return resolveBindHost(dc.host);
103
128
  }
104
- /**
105
- * The bind address a daemon should END UP with, from what was actually
106
- * configured.
107
- *
108
- * `fleetBindHostFor` above takes the daemon's RUNNING config, and by the time
109
- * anything holds one, `host` has been filled in from `DEFAULT_DAEMON_CONFIG`
110
- * — so `?? '0.0.0.0'` can never fire and every slave binds loopback. The
111
- * information it needs is whether an operator SET a host, and only the saved
112
- * file knows that: absent means "no opinion", `127.0.0.1` means "loopback,
113
- * deliberately".
114
- *
115
- * Measured 2026-09-14 on a provisioned slave, after the rule was written and
116
- * before this existed:
117
- *
118
- * LISTEN 127.0.0.1:9700 ← the fleet port no master can dial
119
- * LISTEN 127.0.0.1:9801
120
- * LISTEN 127.0.0.1:9802
121
- *
122
- * The rule was right, the value it was given was already decided. This is the
123
- * same rule applied where the answer is still open.
124
- */
125
- export function effectiveBindHost(saved) {
126
- if (saved?.host)
127
- return saved.host;
128
- if (saved?.role === 'slave')
129
- return '0.0.0.0';
130
- return DEFAULT_DAEMON_CONFIG.host;
131
- }
129
+ export { effectiveBindHost } from '../config/saved.js';
132
130
  /**
133
131
  * Where a daemon binds the surfaces that exist to serve a console: the Netron
134
132
  * HTTP RPC and the WebSocket.
@@ -145,20 +143,9 @@ export function effectiveBindHost(saved) {
145
143
  export function consoleBindHostFor(dc) {
146
144
  return dc.role === 'slave' ? '127.0.0.1' : resolveBindHost(dc.host);
147
145
  }
148
- /** Addresses that reach this host and nowhere else. */
149
- export function isLoopbackHost(host) {
150
- if (!host)
151
- return true; // absent means the loopback default above
152
- const h = host.trim().toLowerCase();
153
- return h === '127.0.0.1' || h === 'localhost' || h === '::1' || h === '[::1]' || h.startsWith('127.');
154
- }
155
146
  /**
156
147
  * Is the daemon still accepting the password its own migration seeded?
157
- *
158
- * Resolves the auth service lazily and answers `false` on any failure — a
159
- * daemon that cannot reach its database has a louder problem than this, and
160
- * a warning that fails the boot would be a worse trade than the risk it
161
- * describes.
148
+ * A failed check cannot authorize external ingress.
162
149
  */
163
150
  async function isSeededAdminPasswordInUse(app, logger) {
164
151
  try {
@@ -167,7 +154,7 @@ async function isSeededAdminPasswordInUse(app, logger) {
167
154
  }
168
155
  catch (err) {
169
156
  logger.warn({ err: err.message }, 'Could not check whether the seeded admin password is still in use');
170
- return false;
157
+ throw err;
171
158
  }
172
159
  }
173
160
  /**
@@ -202,6 +189,8 @@ export class OmnitronDaemon {
202
189
  /** Port this daemon serves `/netron/invoke` on; advertised to fleet peers. */
203
190
  rpcHttpPort = null;
204
191
  fileWatcher = null;
192
+ /** Last boot/reload configuration, which may come from a registered project outside CWD. */
193
+ watchConfig = null;
205
194
  infraService = null;
206
195
  eventLoopWatch = null;
207
196
  eventBroadcaster = null;
@@ -209,7 +198,13 @@ export class OmnitronDaemon {
209
198
  nodeManagerService = null;
210
199
  slaveConnector = null;
211
200
  meshHandle = null;
201
+ ownerAdmissionProof;
202
+ kernelRollouts;
212
203
  nodeManagerRpcService = null;
204
+ terminalRpcService = null;
205
+ fileNode = null;
206
+ filesRpcService = null;
207
+ pipelineService = null;
213
208
  /**
214
209
  * The live record of release builds this daemon is running.
215
210
  *
@@ -218,6 +213,7 @@ export class OmnitronDaemon {
218
213
  * directory with no manifest, and that — not this — is the durable trace.
219
214
  */
220
215
  releaseService = null;
216
+ backupService = null;
221
217
  systemWorkerManager = null;
222
218
  /** Everything the health-monitor worker needs to be spawned again. */
223
219
  healthWorkerSpawn = null;
@@ -227,17 +223,196 @@ export class OmnitronDaemon {
227
223
  healthWorkerStartupTimeout = 0;
228
224
  /** In-daemon check timer, armed only while the worker is down. */
229
225
  fallbackNodeCheckTimer = null;
230
- /** Set by the shutdown task so nothing schedules work on the way out. */
226
+ /** Latched when shutdown begins, before any asynchronous cleanup. */
231
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;
232
233
  leaderElection = null;
234
+ clusterDb;
233
235
  configSyncService = null;
234
236
  metricsServer = null;
235
237
  metricsBridge = null;
238
+ metricSampling;
236
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;
237
248
  /** Daemon config accessor for external use (e.g., DaemonRpcService) */
238
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. */
239
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;
240
414
  this.dc = daemonConfig ?? DEFAULT_DAEMON_CONFIG;
415
+ this.watchConfig = options?.backendHandoff?.watchConfig ?? config;
241
416
  const pidFile = expandPath(this.dc.pidFile);
242
417
  this.pidManager = new PidManager(pidFile);
243
418
  if (this.pidManager.isRunning()) {
@@ -250,12 +425,30 @@ export class OmnitronDaemon {
250
425
  // markers; live daemons get the conflict error above.
251
426
  this.pidManager.remove();
252
427
  this.pidManager.write();
428
+ await prepareDaemonDatabase(this.dc.role, {
429
+ noInfra: Boolean(options?.noInfra),
430
+ handoff: Boolean(options?.backendHandoff),
431
+ });
253
432
  // 1. Create Titan Application (the daemon itself)
254
- 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);
255
443
  this.app = await Application.create(DaemonModule, {
256
444
  name: 'omnitron',
257
445
  version: CLI_VERSION,
258
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);
259
452
  // P1-M — install our own SIGHUP handler BEFORE Application's
260
453
  // default shutdown handlers attach, so `kill -HUP <daemon>`
261
454
  // triggers a config reload (the Unix convention for long-running
@@ -263,7 +456,9 @@ export class OmnitronDaemon {
263
456
  // this through the Application's signal manager because that
264
457
  // path is wired to `runShutdownTasks()`; we install at the
265
458
  // process level and the listener runs first.
266
- process.on('SIGHUP', () => {
459
+ const reloadOnHup = () => {
460
+ if (this.isShuttingDown)
461
+ return;
267
462
  this.reloadConfigOnHup().catch((err) => {
268
463
  // The message already carries which steps applied — printing only
269
464
  // `.message` was fine for the load failure and misleading for the
@@ -274,47 +469,67 @@ export class OmnitronDaemon {
274
469
  console.warn(`[omnitron] caused by: ${cause.stack ?? String(cause)}`);
275
470
  }
276
471
  });
277
- });
472
+ };
473
+ process.on('SIGHUP', reloadOnHup);
474
+ this.app.registerCleanup(() => { process.off('SIGHUP', reloadOnHup); });
278
475
  // 2. Register transports (Unix, TCP, HTTP, WebSocket)
279
476
  await this.registerTransports(this.dc);
477
+ this.startupAbort.signal.throwIfAborted();
280
478
  // 3. Resolve and expose RPC services via Netron
281
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
+ }
282
493
  // 4. Start the Titan Application (boots DI, starts Netron, opens transports)
283
494
  await this.app.start();
284
- const loggerModule = await this.app.container.resolveAsync(LOGGER_SERVICE_TOKEN);
285
- 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);
286
501
  // As soon as there is somewhere to say it, so a stall in the boot's own
287
502
  // steps — infrastructure, migrations — is seen too. A node whose loop
288
503
  // stands still answers nothing, its heartbeat included, and until this
289
504
  // nothing on the node could say so. See `monitoring/event-loop-watch.ts`.
290
505
  this.eventLoopWatch = new EventLoopWatch(logger);
291
506
  this.eventLoopWatch.start();
292
- logger.info({
293
- socketPath: this.dc.socketPath,
294
- port: this.dc.port,
295
- httpPort: this.dc.httpPort,
296
- wsPort: (this.dc.httpPort ?? 9800) + 2,
297
- host: this.dc.host,
298
- pid: process.pid,
299
- version: CLI_VERSION,
300
- }, 'Omnitron daemon started');
301
507
  // 5. Wire log persistence
302
508
  await this.wireLogPersistence();
509
+ this.startupAbort.signal.throwIfAborted();
303
510
  // 5.5. Check for crash recovery
304
- await this.checkCrashRecovery(logger);
511
+ if (!this.execution)
512
+ await this.checkCrashRecovery(logger);
513
+ this.startupAbort.signal.throwIfAborted();
305
514
  // 6. Provision infrastructure (omnitron-pg + app infra from config.infrastructure)
306
- 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();
307
522
  // 7. Register custom health indicators (Docker + apps)
308
523
  await this.registerHealthIndicators();
524
+ this.startupAbort.signal.throwIfAborted();
309
525
  // 8. File watching (dev mode)
310
- await this.startFileWatcher(config, options, logger);
311
- // 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.
312
530
  {
313
531
  const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
314
- if (this.app.netron) {
315
- const socketPath = expandPath(this.dc.socketPath);
316
- orchestrator.setDaemonNetron(this.app.netron, socketPath);
317
- }
532
+ orchestrator.setTopologyDirectory(path.join(path.dirname(expandPath(this.dc.socketPath)), 'topology'));
318
533
  // 8.6. Wire metrics bridge + start /metrics HTTP endpoint.
319
534
  // Bridge subscribes to orchestrator events (restart/crash/escalation),
320
535
  // janitor sweeps, and esbuild reset/build hooks. The HTTP server
@@ -340,11 +555,12 @@ export class OmnitronDaemon {
340
555
  logger.warn({ error: err.message }, 'metrics endpoint failed to start — /metrics will be unavailable');
341
556
  }
342
557
  }
558
+ this.startupAbort.signal.throwIfAborted();
343
559
  // 8.8. Start webapp (nginx container serving Console UI) if enabled
344
560
  {
345
- const { readSavedDaemonConfig } = await import('../commands/up.js');
561
+ const { readSavedDaemonConfig } = await import('../config/saved.js');
346
562
  const savedConfig = readSavedDaemonConfig();
347
- if (savedConfig?.webapp) {
563
+ if (savedConfig?.webapp && !options?.backendHandoff) {
348
564
  try {
349
565
  const { WebappService } = await import('../webapp/webapp.service.js');
350
566
  // Publishing the console while the seeded password is still in
@@ -372,6 +588,7 @@ export class OmnitronDaemon {
372
588
  }
373
589
  }
374
590
  }
591
+ this.startupAbort.signal.throwIfAborted();
375
592
  // 8.9. Fleet monitoring. Started BEFORE managed apps and not awaited.
376
593
  //
377
594
  // It used to be step 11.5, after `startApps`, `startScheduledTasks` and
@@ -387,36 +604,92 @@ export class OmnitronDaemon {
387
604
  // worker has a 30-second startup timeout, and the applications should not
388
605
  // wait behind it. The function handles and logs its own failures, and arms
389
606
  // the in-daemon fallback checks when the worker cannot run.
390
- void this.startHealthMonitorWorker(logger).catch((err) => {
607
+ this.healthMonitorStartup = this.startHealthMonitorWorker(logger).catch((err) => {
391
608
  // It handles its own failures; this is the last resort, because an
392
609
  // unhandled rejection is a crash of the daemon rather than a lost
393
610
  // subsystem.
394
611
  logger.error({ error: err.message }, 'Health monitor startup threw');
395
612
  });
396
613
  // 9. Start managed apps (waits for infra gate if apps have `requires`)
397
- await this.startApps(config, logger);
614
+ if (!options?.backendHandoff)
615
+ await this.startApps(config, logger);
616
+ this.startupAbort.signal.throwIfAborted();
398
617
  // 10. Start background tasks via titan-scheduler (replaces bare setInterval)
399
618
  await this.startScheduledTasks(config, logger);
619
+ this.startupAbort.signal.throwIfAborted();
400
620
  // 11. Start remaining background services (telemetry, traces, leader election)
401
621
  await this.startBackgroundServices(config, logger);
622
+ this.startupAbort.signal.throwIfAborted();
402
623
  // (Fleet monitoring is started at 8.5, above — before managed apps.)
403
624
  // 12. Wire event broadcasting (orchestrator events → WebSocket push)
404
625
  await this.wireEventBroadcasting(logger);
405
- // 13. Register shutdown tasks — Application handles SIGTERM/SIGINT
406
- // and calls shutdown tasks in priority order before process.exit()
407
- 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');
408
642
  // 15. Broadcast daemon.started event
409
643
  this.eventBroadcaster?.broadcast(DAEMON_EVENTS.STARTED, {
410
644
  version: CLI_VERSION,
411
645
  pid: process.pid,
412
646
  });
413
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
+ }
414
678
  // ============================================================================
415
679
  // Transport Registration
416
680
  // ============================================================================
417
681
  async registerTransports(dc) {
418
682
  if (!this.app?.netron)
419
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
+ }
420
693
  // Unix socket — local CLI <-> daemon (primary, high-performance)
421
694
  this.app.netron.registerTransport('unix', () => new UnixSocketTransport());
422
695
  this.app.netron.registerTransportServer('unix', {
@@ -444,7 +717,7 @@ export class OmnitronDaemon {
444
717
  // operator's deployment read exactly like the daemon's own boot
445
718
  // autostart. No proxy stands in front of a unix socket, so the
446
719
  // wrapper trusts no forwarded address — its default.
447
- invocationWrapper: createAuthContextWrapper(),
720
+ invocationWrapper: createAuthContextWrapper({ assertReady: () => this.assertBackendReady() }),
448
721
  },
449
722
  });
450
723
  // Local CLI trust. The Unix socket above is created mode 0600, so any
@@ -482,74 +755,27 @@ export class OmnitronDaemon {
482
755
  // unauthenticated `stopAll({force:true})` — is answered by the default
483
756
  // being loopback and by that manager now being wired.)
484
757
  const tcpHost = fleetBindHostFor(dc);
485
- if (!isLoopbackHost(tcpHost)) {
486
- // Said, not enforced, and the difference is deliberate: silently
487
- // rebinding a fleet transport to loopback would take a cluster down,
488
- // and a node that cannot be reached is an outage rather than a
489
- // hardening. The console above IS rebound, because its whole purpose
490
- // is a password prompt and loopback still serves it.
491
- void (async () => {
492
- const loggerModule = await this.app.container.resolveAsync(LOGGER_SERVICE_TOKEN);
493
- const log = loggerModule.logger;
494
- if (await isSeededAdminPasswordInUse(this.app, log)) {
495
- log.error({ host: tcpHost, port: dc.port }, 'The daemon fleet transport is published and the seeded admin password is unchanged — ' +
496
- 'anyone who can reach this port can sign in and stop every app. Change it now.');
497
- }
498
- })().catch(() => undefined);
499
- }
500
758
  this.app.netron.registerTransport('tcp', () => new TcpTransport());
501
759
  this.app.netron.registerTransportServer('tcp', {
502
760
  name: 'daemon-fleet',
503
761
  options: {
504
762
  port: dc.port,
505
763
  host: tcpHost,
764
+ // Carry the authenticated mesh identity into service-level guards and audit.
765
+ invocationWrapper: createAuthContextWrapper({ assertReady: () => this.assertBackendReady() }),
506
766
  },
507
767
  });
508
768
  // Auth — JWT validation + session check + role extraction
509
- const isSlave = dc.role === 'slave';
510
769
  const jwtService = await this.app.container.resolveAsync(JWT_SERVICE_TOKEN);
511
770
  const logModule = await this.app.container.resolveAsync(LOGGER_SERVICE_TOKEN);
512
771
  const authLogger = logModule.logger.child({ component: 'auth' });
513
- // On master: full JWT + session validation via AuthService (PG-backed)
514
- // On slave: JWT-only validation (no session DB — no PG)
515
- const authService = !isSlave
516
- ? await this.app.container.resolveAsync(AUTH_SERVICE_TOKEN)
517
- : null;
518
772
  const authManager = new AuthenticationManager(authLogger, {
519
773
  authenticate: async () => {
520
774
  throw new Error('Credential authentication not supported. Use JWT Bearer token.');
521
775
  },
522
- validateToken: async (token) => {
523
- // JWT verification with caching via titan-auth JWTService
524
- const payload = await jwtService.verify(token);
525
- // Session validation — master only (requires PG for omnitron_sessions)
526
- if (authService) {
527
- const sessionId = payload['sid'];
528
- if (sessionId) {
529
- const session = await authService.validateToken(token);
530
- if (!session) {
531
- const err = new Error('Session has been revoked or expired');
532
- err.code = 'SESSION_REVOKED';
533
- err.statusCode = 401;
534
- throw err;
535
- }
536
- }
537
- }
538
- // Role is now in JWT claims (set by AuthService.issueToken)
539
- const role = payload['role'] ?? 'viewer';
540
- const sessionId = payload['sid'];
541
- return {
542
- userId: payload.sub,
543
- roles: [role],
544
- permissions: [],
545
- token: { type: 'bearer' },
546
- metadata: {
547
- sessionId,
548
- isServiceRole: role === 'service_role',
549
- },
550
- };
551
- },
552
- 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 },
553
779
  });
554
780
  // Wire the AuthorizationManager so the `@Public({ auth: { roles } })`
555
781
  // decorators on DaemonRpcService are actually enforced on the wire.
@@ -565,8 +791,10 @@ export class OmnitronDaemon {
565
791
  // `trustProxy` is shared with the rate limiter deliberately: both answer
566
792
  // the same question — is there a proxy in front whose forwarded headers
567
793
  // we may believe? Two separate switches would eventually disagree.
794
+ const policy = dc.requestRateLimit ?? dc.httpRateLimit ?? {};
568
795
  const authContextWrapper = createAuthContextWrapper({
569
- trustProxy: dc.httpRateLimit?.trustProxy === true,
796
+ trustProxy: policy.trustProxy === true,
797
+ assertReady: () => this.assertBackendReady(),
570
798
  });
571
799
  // HTTP / WS bind also defaults to 127.0.0.1. The webapp talks to
572
800
  // these over the same loopback; nginx fronts the public surface.
@@ -580,8 +808,7 @@ export class OmnitronDaemon {
580
808
  // same value then published the Netron HTTP RPC and the WebSocket
581
809
  // alongside it. A slave serves no console: the operator uses the
582
810
  // master's. So the two surfaces it gained are an authentication endpoint
583
- // it does not need and a WebSocket one that, as the note below records,
584
- // has no rate limit available to it.
811
+ // and a WebSocket endpoint it does not need.
585
812
  //
586
813
  // Rebound rather than warned about, which is the opposite of the choice
587
814
  // made for the TCP transport twenty lines up — and for the opposite
@@ -598,7 +825,12 @@ export class OmnitronDaemon {
598
825
  const internalHttpPort = (dc.httpPort ?? 9800) + 1;
599
826
  this.rpcHttpPort = internalHttpPort;
600
827
  this.app.netron.registerTransport('http', () => new HttpTransport());
601
- 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
+ });
602
834
  this.app.netron.registerTransportServer('http', {
603
835
  name: 'daemon-http',
604
836
  options: {
@@ -606,24 +838,7 @@ export class OmnitronDaemon {
606
838
  host: localHost,
607
839
  cors: true,
608
840
  invocationWrapper: authContextWrapper,
609
- // Volume cap on the HTTP RPC surface, and only that one. Password
610
- // guessing is bounded by the per-account lockout in AuthService.
611
- //
612
- // The WebSocket surface below is NOT covered: netron's WebSocket
613
- // transport has no rate-limit option — `maxPayload` is the only
614
- // bound it accepts — and the console talks over WebSocket. This
615
- // comment used to say the limit bounded "everything else, including
616
- // attempts to flood the daemon into unresponsiveness", which
617
- // describes a protection that covers one of the two transports an
618
- // attacker can reach.
619
- rateLimit: {
620
- enabled: rl.enabled ?? true,
621
- windowMs: rl.windowMs ?? 60_000,
622
- maxRequests: rl.maxRequests ?? 3_000,
623
- globalMaxRequests: rl.globalMaxRequests ?? 6_000,
624
- trustProxy: rl.trustProxy ?? false,
625
- ...(rl.whitelist ? { whitelist: rl.whitelist } : {}),
626
- },
841
+ requestLimiter,
627
842
  },
628
843
  });
629
844
  // WebSocket — real-time event push to webapp clients
@@ -639,11 +854,7 @@ export class OmnitronDaemon {
639
854
  // HTTP calls do. Until recently only the HTTP server read this
640
855
  // option and this line did nothing.
641
856
  invocationWrapper: authContextWrapper,
642
- // The only bound this transport accepts. Left unset it inherits
643
- // `ws`'s 100 MB default, which is a lot of memory to hand a single
644
- // frame on a control-plane socket that carries RPC arguments and
645
- // event pushes. 8 MB is well above anything the console sends and
646
- // well below anything worth allocating for a stranger.
857
+ requestLimiter,
647
858
  maxPayload: dc.wsMaxPayload ?? 8 * 1024 * 1024,
648
859
  },
649
860
  });
@@ -668,8 +879,10 @@ export class OmnitronDaemon {
668
879
  // and the number comes from the config rather than a default chosen
669
880
  // inside the collector, because a wrong default there deletes history.
670
881
  logCollector.setRetentionDays(config.logging?.databaseRetentionDays ?? 0, loggerModule.logger.child({ component: 'log-retention' }));
671
- 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());
672
884
  await this.app.netron.peer.exposeService(rpcService);
885
+ await this.app.netron.peer.exposeService(new BackendRpcService(this));
673
886
  // Logs RPC service (works on both master and slave — uses PG or SQLite)
674
887
  const logsRpcService = new LogsRpcService(logCollector);
675
888
  await this.app.netron.peer.exposeService(logsRpcService);
@@ -678,7 +891,7 @@ export class OmnitronDaemon {
678
891
  rpcService.setLogStore(logCollector);
679
892
  // Metrics RPC service — provided by TitanMetricsModule
680
893
  const metricsService = await container.resolveAsync(TITAN_METRICS_TOKEN);
681
- const { MetricsRpcService: MetricsRpc } = await import('@omnitron-dev/titan-metrics');
894
+ const { OmnitronMetricsRpcService: MetricsRpc } = await import('../services/metrics.rpc-service.js');
682
895
  const metricsRpcService = new MetricsRpc(metricsService);
683
896
  await this.app.netron.peer.exposeService(metricsRpcService);
684
897
  // HealthCheck RPC service (no DB dependency)
@@ -718,6 +931,7 @@ export class OmnitronDaemon {
718
931
  // Backup RPC service (no DB dependency)
719
932
  const { BackupRpcService: BackupRpc } = await import('../services/backup.rpc-service.js');
720
933
  const backupService = await container.resolveAsync(BACKUP_SERVICE_TOKEN);
934
+ this.backupService = backupService;
721
935
  const backupRpcService = new BackupRpc(backupService);
722
936
  await this.app.netron.peer.exposeService(backupRpcService);
723
937
  // Re-arm any persisted backup schedules so they survive daemon restarts.
@@ -760,11 +974,34 @@ export class OmnitronDaemon {
760
974
  // The logger, because the one thing this service says on its own — that
761
975
  // a deployment is running on a default credential — is said at error
762
976
  // level and reaches nobody without it.
763
- loggerModule.logger.child({ component: 'infra' }));
764
- await this.app.netron.peer.exposeService(infraRpcService);
977
+ loggerModule.logger.child({ component: 'infra' }), undefined, () => projectService.getInfraManager().listInstances().flatMap(({ infra }) => Object.values(infra.getState().services)));
765
978
  // Project + Stack management RPC service
766
- 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
+ }
767
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);
768
1005
  await this.app.netron.peer.exposeService(projectRpcService);
769
1006
  // Releases. Master-only, like the builds themselves: a release is built
770
1007
  // from clean clones of BOTH repositories, and only a master has both.
@@ -772,42 +1009,19 @@ export class OmnitronDaemon {
772
1009
  const { ReleaseService } = await import('../services/release.service.js');
773
1010
  const { ReleaseRpcService } = await import('../services/release.rpc-service.js');
774
1011
  this.releaseService = new ReleaseService(loggerModule.logger.child({ component: 'release' }));
775
- await this.app.netron.peer.exposeService(new ReleaseRpcService(this.releaseService, audit, projectService));
776
- }
777
- // Sync service (slave→master data replication)
778
- const syncNodeId = `${os.hostname()}-${dc.port}`;
779
- let syncDb;
780
- if (isSlave) {
781
- const slaveStorage = await container.resolveAsync(SLAVE_STORAGE_TOKEN);
782
- syncDb = await slaveStorage.getDb();
783
- }
784
- else {
785
- syncDb = await container.resolveAsync(OMNITRON_DB_TOKEN);
1012
+ const releaseAuth = await container.resolveAsync(AUTH_SERVICE_TOKEN);
1013
+ await this.app.netron.peer.exposeService(new ReleaseRpcService(this.releaseService, audit, projectService, releaseAuth));
786
1014
  }
787
- this.syncService = new SyncService(syncDb, loggerModule.logger.child({ component: 'sync' }), syncNodeId, dc.role, dc.sync);
788
- // Remote metrics into the store the console actually reads.
789
- //
790
- // `ingestMetric` wrote them to `metrics_raw`, and nothing in this
791
- // repository reads that table — the metrics page queries titan-metrics'
792
- // own storage. So once the pipeline carried anything, it would have
793
- // carried it somewhere invisible. Recording through the same service the
794
- // master uses for its own readings makes a remote node a LABEL on the
795
- // existing series instead of a second store of the same concept.
796
- //
797
- // `node` is a distinct argument in the sink's signature rather than a
798
- // key a caller may forget to put in `labels`: a sample recorded without
799
- // it merges with the master's own, and the chart then shows two machines
800
- // 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.
801
1018
  if (!isSlave) {
802
1019
  const syncMetrics = await container.resolveAsync(TITAN_METRICS_TOKEN);
803
- this.syncService.setMetricsSink((sample) => {
804
- try {
805
- syncMetrics.recordTyped('gauge', sample.name, { ...sample.labels, app: sample.app, node: sample.node }, sample.value);
806
- }
807
- catch (err) {
808
- loggerModule.logger.warn({ node: sample.node, name: sample.name, error: err.message }, 'Failed to record a replicated metric');
809
- }
810
- });
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());
811
1025
  }
812
1026
  // The producer the replication pipeline never had.
813
1027
  //
@@ -822,15 +1036,7 @@ export class OmnitronDaemon {
822
1036
  // has no master to ship to, and doing the work would be pure cost.
823
1037
  if (isSlave) {
824
1038
  const syncService = this.syncService;
825
- logCollector.setSyncSink((entries) => {
826
- void syncService
827
- .bufferBatch(entries.map((e) => ({ category: 'logs', payload: e })))
828
- .catch(() => {
829
- // `bufferBatch` logs its own failure. Swallowed here because the
830
- // lines are already in the local table: losing the replica copy
831
- // must not cost the flush that succeeded.
832
- });
833
- });
1039
+ logCollector.setSyncSink((entries, transaction) => syncService.bufferBatch(entries.map(entry => ({ category: 'logs', payload: entry })), transaction));
834
1040
  }
835
1041
  const syncRpcService = new SyncRpcService(this.syncService);
836
1042
  await this.app.netron.peer.exposeService(syncRpcService);
@@ -840,18 +1046,24 @@ export class OmnitronDaemon {
840
1046
  await this.app.netron.peer.exposeService(systemInfoRpcService);
841
1047
  // Event Broadcaster RPC service (WebSocket subscriptions)
842
1048
  this.eventBroadcaster = new EventBroadcasterService(loggerModule.logger);
843
- 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)));
844
1050
  await this.app.netron.peer.exposeService(eventBroadcasterRpcService);
845
1051
  // Node manager — file-based, no PG (master only — manages infrastructure nodes)
846
1052
  // Health checks delegated to dedicated system worker (started later after infra is ready)
847
1053
  if (!isSlave) {
848
1054
  const { NodeManagerService } = await import('../services/node-manager.service.js');
849
1055
  const { NodeManagerRpcService } = await import('../services/node-manager.rpc-service.js');
850
- const { DaemonStateStore: DaemonStateStoreCls } = await import('./daemon-state-store.service.js');
851
1056
  const daemonStateStore = await container.resolveAsync(DAEMON_STATE_STORE_TOKEN);
852
1057
  const nodeManager = new NodeManagerService(loggerModule.logger.child({ component: 'nodes' }), daemonStateStore, secretsService);
853
1058
  this.nodeManagerService = nodeManager;
854
- 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);
855
1067
  // The deployer reaches nodes through the same SSH implementation as the
856
1068
  // health checks — the only one that can present a stored password or a
857
1069
  // key passphrase.
@@ -861,6 +1073,21 @@ export class OmnitronDaemon {
861
1073
  const deployLogger = loggerModule.logger.child({ component: 'deploy' });
862
1074
  const remoteDeployer = new RemoteDeployer(deployLogger, new ExecutionService(deployLogger));
863
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);
864
1091
  // Upgrading a node from the console: the same build the CLI makes,
865
1092
  // made here, then the same two calls. Without this the console could
866
1093
  // see every node and update none of them.
@@ -918,19 +1145,20 @@ export class OmnitronDaemon {
918
1145
  // master, or two connectors pull the same buffer and race to ack it.
919
1146
  try {
920
1147
  const { SlaveConnector } = await import('../cluster/slave-connector.js');
921
- const { createMeshDialer } = await import('../cluster/mesh-link.js');
1148
+ const { createMeshDialer, meshRegistration } = await import('../cluster/mesh-link.js');
922
1149
  const { startMesh } = await import('../cluster/mesh.js');
923
1150
  const { ExecutionService: Exec } = await import('../execution/execution.service.js');
924
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
+ };
925
1156
  const connector = new SlaveConnector(meshLogger, this.syncService ?? null, {
926
1157
  dial: createMeshDialer({
927
1158
  logger: meshLogger,
928
1159
  execution: new Exec(meshLogger),
929
1160
  subject: `mesh:${os.hostname()}`,
930
- sshTargetFor: async ({ host }) => {
931
- const node = nodeManager.listNodes().find((n) => n.host === host && !n.isLocal);
932
- return node ? nodeManager.nodeToSshTarget(node) : null;
933
- },
1161
+ sshTargetFor: ({ host, port, nodeId }) => registeredSshTarget(host, port, nodeId),
934
1162
  }),
935
1163
  });
936
1164
  this.slaveConnector = connector;
@@ -942,10 +1170,7 @@ export class OmnitronDaemon {
942
1170
  // Wired here because this is the side that has both — ProjectService
943
1171
  // reads config files, the node registry keeps its secrets in the
944
1172
  // daemon's vault.
945
- projectService.setNodeCredentialResolver(async (host) => {
946
- const node = nodeManager.listNodes().find((n) => n.host === host && !n.isLocal);
947
- return node ? nodeManager.nodeToSshTarget(node) : null;
948
- });
1173
+ projectService.setNodeCredentialResolver(registeredSshTarget);
949
1174
  this.meshHandle = startMesh({ registry: nodeManager, connector, logger: meshLogger });
950
1175
  }
951
1176
  catch (err) {
@@ -955,27 +1180,50 @@ export class OmnitronDaemon {
955
1180
  loggerModule.logger.error({ error: err.message }, 'Mesh not started — registered nodes will buffer their data locally and replicate nothing');
956
1181
  }
957
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);
958
1197
  // =====================================================================
959
1198
  // Master-only RPC services (require PostgreSQL)
960
1199
  // =====================================================================
961
1200
  if (!isSlave) {
962
1201
  // Auth RPC service
963
1202
  const authService = await container.resolveAsync(AUTH_SERVICE_TOKEN);
964
- const authRpcService = new AuthRpcService(authService);
1203
+ const authRpcService = new AuthRpcService(authService, this.app.netron);
965
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
+ }
966
1222
  // Alert RPC service
967
1223
  const { AlertRpcService: AlertRpc } = await import('../services/alert.rpc-service.js');
968
1224
  const alertService = await container.resolveAsync(ALERT_SERVICE_TOKEN);
969
1225
  const alertRpcService = new AlertRpc(alertService);
970
1226
  await this.app.netron.peer.exposeService(alertRpcService);
971
- // Telemetry relay RPC service
972
- const { TelemetryRpcService: TelemetryRpc } = await import('../services/telemetry.rpc-service.js');
973
- const telemetryRelay = await container.resolveAsync(TELEMETRY_RELAY_TOKEN);
974
- const telemetryRpcService = new TelemetryRpc(telemetryRelay);
975
- // The console asks every node for its relay, and a daemon has no mesh
976
- // connection to itself, so the local node's answer comes from here.
977
- this.nodeManagerRpcService?.setTelemetryRelay(telemetryRelay);
978
- await this.app.netron.peer.exposeService(telemetryRpcService);
979
1227
  // Fleet management RPC service
980
1228
  const { FleetRpcService: FleetRpc } = await import('../services/fleet.rpc-service.js');
981
1229
  const fleetService = await container.resolveAsync(FLEET_SERVICE_TOKEN);
@@ -989,7 +1237,12 @@ export class OmnitronDaemon {
989
1237
  // Pipeline RPC service
990
1238
  const { PipelineRpcService: PipelineRpc } = await import('../services/pipeline.rpc-service.js');
991
1239
  const pipelineService = await container.resolveAsync(PIPELINE_SERVICE_TOKEN);
992
- 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);
993
1246
  await this.app.netron.peer.exposeService(pipelineRpcService);
994
1247
  // Trace collector RPC service
995
1248
  const { TraceRpcService: TraceRpc } = await import('../services/trace-collector.rpc-service.js');
@@ -1002,22 +1255,10 @@ export class OmnitronDaemon {
1002
1255
  const deployRpcService = new DeployRpc(deployService);
1003
1256
  await this.app.netron.peer.exposeService(deployRpcService);
1004
1257
  }
1005
- // Cluster — leader election + config sync (optional, enabled via config, master only)
1006
- // LeaderElection is created here once and stored; startBackgroundServices() starts it.
1007
- if (dc.cluster?.enabled && !isSlave) {
1008
- const { LeaderElection } = await import('../cluster/leader-election.js');
1009
- const { ClusterRpcService: ClusterRpc } = await import('../cluster/cluster.rpc-service.js');
1010
- const nodeId = `${os.hostname()}-${dc.port}`;
1011
- const clusterFleetService = await container.resolveAsync(FLEET_SERVICE_TOKEN);
1012
- this.leaderElection = new LeaderElection(nodeId, clusterFleetService, loggerModule.logger, {
1013
- ...(dc.cluster.electionTimeout && { electionTimeout: dc.cluster.electionTimeout }),
1014
- ...(dc.cluster.heartbeatInterval != null && { heartbeatInterval: dc.cluster.heartbeatInterval }),
1015
- });
1016
- const clusterRpcService = new ClusterRpc(this.leaderElection);
1017
- // The local node's own election state, for the cross-node reader.
1018
- this.nodeManagerRpcService?.setLeaderElection(this.leaderElection);
1019
- await this.app.netron.peer.exposeService(clusterRpcService);
1020
- }
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);
1021
1262
  }
1022
1263
  // ============================================================================
1023
1264
  // Log Persistence Wiring
@@ -1028,10 +1269,20 @@ export class OmnitronDaemon {
1028
1269
  const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
1029
1270
  const logManager = await this.app.container.resolveAsync(LOG_MANAGER_TOKEN);
1030
1271
  const logCollector = await this.app.container.resolveAsync(LOG_COLLECTOR_TOKEN);
1031
- orchestrator.onAppLog((appName, line) => {
1032
- logManager.appendToFile(appName, line);
1033
- logCollector.ingestPinoLine(appName, line);
1034
- });
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
+ }
1035
1286
  // Wire daemon's own logs into LogCollector (buffered since pino starts before DI)
1036
1287
  const collectorStream = getDaemonLogCollectorStream();
1037
1288
  if (collectorStream) {
@@ -1080,40 +1331,6 @@ export class OmnitronDaemon {
1080
1331
  }
1081
1332
  const isSlave = this.dc.role === 'slave';
1082
1333
  const startTime = Date.now();
1083
- // Step 1: Provision omnitron's own database (omnitron-pg)
1084
- // Slave daemons use SQLite — no Docker, no PostgreSQL
1085
- if (isSlave) {
1086
- logger.info({ role: 'slave' }, 'Slave mode — skipping omnitron-pg provisioning (using SQLite)');
1087
- }
1088
- else {
1089
- try {
1090
- const { resolveOmnitronPg } = await import('../infrastructure/service-resolver.js');
1091
- const { createContainer, getContainerState, waitForHealthy, ensureImage, removeContainer, createVolume } = await import('../infrastructure/container-runtime.js');
1092
- const pgSpec = resolveOmnitronPg();
1093
- const existing = await getContainerState(pgSpec.name);
1094
- if (!existing || existing.status !== 'running') {
1095
- logger.info('Provisioning omnitron-pg...');
1096
- if (existing)
1097
- await removeContainer(pgSpec.name);
1098
- await ensureImage(pgSpec.image);
1099
- for (const vol of pgSpec.volumes) {
1100
- if (!vol.source.startsWith('/'))
1101
- await createVolume(vol.source);
1102
- }
1103
- await createContainer(pgSpec);
1104
- await waitForHealthy(pgSpec.name, 60_000);
1105
- logger.info('omnitron-pg ready');
1106
- }
1107
- else {
1108
- logger.debug('omnitron-pg already running');
1109
- }
1110
- await this.runOmnitronMigrations(logger);
1111
- }
1112
- catch (err) {
1113
- logger.error({ error: err.message }, 'Failed to provision omnitron-pg');
1114
- logger.warn('Continuing without internal database — some features will be unavailable');
1115
- }
1116
- }
1117
1334
  // Step 2: Provision app infrastructure (postgres, redis, minio) if declared.
1118
1335
  //
1119
1336
  // Two ownership models share this slot historically:
@@ -1137,8 +1354,13 @@ export class OmnitronDaemon {
1137
1354
  // `infrastructure.services` is informational in this mode (used by
1138
1355
  // stack auto-detection upstream); the daemon does not provision it
1139
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
+ }
1140
1362
  const { ProjectRegistry } = await import('../project/registry.js');
1141
- const projects = ProjectRegistry.open().list();
1363
+ const projects = ProjectRegistry.open().listRegistrations();
1142
1364
  const projectModeActive = projects.some((p) => Array.isArray(p.enabledStacks) && p.enabledStacks.length > 0);
1143
1365
  if (projectModeActive) {
1144
1366
  logger.info({ projects: projects.length }, 'project mode active — daemon-level infrastructure deferred to stack provision');
@@ -1147,7 +1369,9 @@ export class OmnitronDaemon {
1147
1369
  }
1148
1370
  if (config.infrastructure && !isSlave) {
1149
1371
  try {
1150
- 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);
1151
1375
  const infraState = await this.infraService.provision();
1152
1376
  const provisionTimeMs = Date.now() - startTime;
1153
1377
  gate.markReady(infraState);
@@ -1198,7 +1422,7 @@ export class OmnitronDaemon {
1198
1422
  async reconcileOrphanContainers(logger, projects, projectService) {
1199
1423
  const { listManagedContainers, stopContainer, removeContainer } = await import('../infrastructure/container-runtime.js');
1200
1424
  const { decideOrphans } = await import('../infrastructure/orphan-containers.js');
1201
- const managed = await listManagedContainers();
1425
+ const managed = await listManagedContainers({ orThrow: true });
1202
1426
  if (managed.length === 0)
1203
1427
  return;
1204
1428
  // Build set of expected container name prefixes from registered projects/stacks
@@ -1248,6 +1472,7 @@ export class OmnitronDaemon {
1248
1472
  status: c.status,
1249
1473
  project: c.project,
1250
1474
  stack: c.stack,
1475
+ internal: c.labels?.['omnitron.internal'] === 'true',
1251
1476
  })),
1252
1477
  projects: projects.map((p) => p.name),
1253
1478
  expectedPrefixes: [...expectedPrefixes],
@@ -1263,9 +1488,11 @@ export class OmnitronDaemon {
1263
1488
  const container = managed.find((c) => c.name === name);
1264
1489
  logger.info({ container: container.name, status: container.status }, 'Removing orphan container (not part of any registered stack)');
1265
1490
  try {
1491
+ if (!container.containerId || !/^[a-f0-9]{64}$/.test(container.containerId))
1492
+ throw new Error('Orphan has no immutable identity');
1266
1493
  if (container.status === 'running')
1267
- await stopContainer(container.name);
1268
- await removeContainer(container.name);
1494
+ await stopContainer(container.containerId);
1495
+ await removeContainer(container.containerId, { graceful: true });
1269
1496
  orphanCount++;
1270
1497
  }
1271
1498
  catch (err) {
@@ -1276,25 +1503,6 @@ export class OmnitronDaemon {
1276
1503
  logger.info({ removed: orphanCount }, 'Orphan container cleanup complete');
1277
1504
  }
1278
1505
  }
1279
- /**
1280
- * Apply the internal-database schema.
1281
- *
1282
- * Delegates to the shared runner (`database/migration-runner.ts`) so this
1283
- * path, the infrastructure service and the `migrate` CLI all execute the
1284
- * same registry through the same engine. A failure here is logged as an
1285
- * ERROR — the daemon keeps running, but every feature backed by
1286
- * omnitron-pg (alerts, sessions, logs, metrics, deployments) is degraded
1287
- * and the operator has to see it.
1288
- */
1289
- async runOmnitronMigrations(logger) {
1290
- const { runOmnitronMigrations } = await import('../database/migration-runner.js');
1291
- try {
1292
- await runOmnitronMigrations(logger);
1293
- }
1294
- catch (err) {
1295
- logger.error({ error: err.message }, 'Omnitron database migrations FAILED — alerts, sessions, logs and metrics will not work until this is resolved');
1296
- }
1297
- }
1298
1506
  // ============================================================================
1299
1507
  // Health Indicators (Phase 2: titan-health custom indicators)
1300
1508
  // ============================================================================
@@ -1305,9 +1513,16 @@ export class OmnitronDaemon {
1305
1513
  const titanHealth = await this.app.container.resolveAsync(TITAN_HEALTH_TOKEN);
1306
1514
  const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
1307
1515
  // Docker containers health indicator
1308
- 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()));
1309
1522
  // Managed apps health indicator
1310
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)));
1311
1526
  // How long the loop has stood still, and when — the number the console
1312
1527
  // reads for a node that went quiet.
1313
1528
  if (this.eventLoopWatch)
@@ -1318,8 +1533,8 @@ export class OmnitronDaemon {
1318
1533
  // above, because this is the object that has just been given them.
1319
1534
  this.nodeManagerRpcService?.setTitanHealth(titanHealth);
1320
1535
  }
1321
- catch {
1322
- // Health module may not be available — non-critical
1536
+ catch (error) {
1537
+ runtimeDiagnostics.failure('runtime.health-registration', 'Health indicators could not be registered', error);
1323
1538
  }
1324
1539
  }
1325
1540
  // ============================================================================
@@ -1329,9 +1544,13 @@ export class OmnitronDaemon {
1329
1544
  if (!this.app)
1330
1545
  return;
1331
1546
  const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
1332
- const enabled = !!options?.watch && !options?.noWatch;
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');
1333
1550
  orchestrator.devMode = enabled;
1334
1551
  await orchestrator.setWatchMode(enabled, options?.watchApps);
1552
+ if (this.execution)
1553
+ return;
1335
1554
  if (!enabled)
1336
1555
  return;
1337
1556
  this.fileWatcher = new FileWatcher(logger, orchestrator, config, process.cwd());
@@ -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,12 +2134,19 @@ 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());
1927
2151
  orchestrator.devMode = true;
1928
2152
  await orchestrator.setWatchMode(true, apps);
@@ -1938,6 +2162,7 @@ export class OmnitronDaemon {
1938
2162
  * both.
1939
2163
  */
1940
2164
  async applyWatchConfig(config) {
2165
+ this.watchConfig = config;
1941
2166
  this.fileWatcher?.applyConfig(config);
1942
2167
  if (!this.app)
1943
2168
  return;
@@ -1973,16 +2198,12 @@ export class OmnitronDaemon {
1973
2198
  ? await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN) : null;
1974
2199
  const apps = [...(this.fileWatcher?.getWatchedApps() ?? []), ...(orchestrator?.getBuildWatchedApps() ?? [])];
1975
2200
  return {
1976
- enabled: !!this.fileWatcher,
2201
+ enabled: this.execution ? !!orchestrator?.devMode : !!this.fileWatcher,
1977
2202
  watching: apps.length > 0,
1978
- ...(apps.length ? {} : { reason: this.fileWatcher ? 'no enabled app matches the watch policy' : 'watching is disabled' }),
2203
+ ...(apps.length ? {} : { reason: (this.execution ? orchestrator?.devMode : this.fileWatcher) ? 'no enabled app matches the watch policy' : 'watching is disabled' }),
1979
2204
  apps,
1980
2205
  };
1981
2206
  }
1982
- async getConfig() {
1983
- const { loadEcosystemConfig } = await import('../config/loader.js');
1984
- return loadEcosystemConfig();
1985
- }
1986
2207
  // ============================================================================
1987
2208
  // Lifecycle
1988
2209
  // ============================================================================
@@ -1993,6 +2214,7 @@ export class OmnitronDaemon {
1993
2214
  async stop() {
1994
2215
  if (!this.app)
1995
2216
  return;
2217
+ this.stopApplicationsOnExit = true;
1996
2218
  await this.app.shutdown(ShutdownReason.Manual);
1997
2219
  // Application doesn't process.exit() for Manual reason — do it explicitly
1998
2220
  process.exit(0);
@@ -2007,6 +2229,8 @@ export class OmnitronDaemon {
2007
2229
  async reloadConfigOnHup() {
2008
2230
  if (!this.app)
2009
2231
  return;
2232
+ if (this.dc?.cluster?.enabled)
2233
+ throw new Error('Cluster application configuration changes require the elected controller');
2010
2234
  // Loading first, on its own: a malformed file must be rejected before
2011
2235
  // anything is touched, and that failure genuinely means "the daemon is as
2012
2236
  // it was".
@@ -2027,7 +2251,7 @@ export class OmnitronDaemon {
2027
2251
  name: 'orchestrator',
2028
2252
  apply: async (cfg) => {
2029
2253
  const orchestrator = await this.app.container.resolveAsync(ORCHESTRATOR_TOKEN);
2030
- orchestrator.setConfig(cfg);
2254
+ await orchestrator.setConfig(cfg);
2031
2255
  },
2032
2256
  },
2033
2257
  {
@@ -2071,10 +2295,30 @@ export class OmnitronDaemon {
2071
2295
  * VeryLow (90) — Dispose project service, teardown infrastructure
2072
2296
  * Last (100) — Remove PID file
2073
2297
  */
2074
- registerShutdownTasks(app) {
2298
+ registerShutdownTasks(app, logger) {
2075
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);
2076
2318
  // Broadcast DAEMON_EVENTS.STOPPING on shutdown start
2077
2319
  app.on(ApplicationEvent.ShutdownStart, ({ reason, details }) => {
2320
+ this.shutdownRequested = true;
2321
+ cancelStartup();
2078
2322
  this.eventBroadcaster?.broadcast(DAEMON_EVENTS.STOPPING, {
2079
2323
  reason,
2080
2324
  signal: details?.signal,
@@ -2107,7 +2351,25 @@ export class OmnitronDaemon {
2107
2351
  }
2108
2352
  });
2109
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);
2110
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;
2111
2373
  if (this.fileWatcher) {
2112
2374
  this.fileWatcher.stop();
2113
2375
  this.fileWatcher = null;
@@ -2123,12 +2385,20 @@ export class OmnitronDaemon {
2123
2385
  catch { /* non-critical */ }
2124
2386
  this.metricsServer = null;
2125
2387
  }
2126
- // Stop webapp nginx container (non-blocking — don't wait if slow)
2127
- try {
2128
- const { removeContainer } = await import('../infrastructure/container-runtime.js');
2129
- 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
+ }
2130
2401
  }
2131
- catch { /* non-critical */ }
2132
2402
  }, ShutdownPriority.First);
2133
2403
  // A release build outlives its daemon otherwise.
2134
2404
  //
@@ -2146,31 +2416,39 @@ export class OmnitronDaemon {
2146
2416
  }, ShutdownPriority.First);
2147
2417
  // --- Priority: VeryHigh (10) — Stop managed apps (fast — 5s per app max) ---
2148
2418
  app.registerShutdownTask('stop-managed-apps', async () => {
2419
+ if (this.handingOffBackend || (this.execution && !this.stopApplicationsOnExit))
2420
+ return;
2149
2421
  const orchestrator = await container.resolveAsync(ORCHESTRATOR_TOKEN);
2150
2422
  await orchestrator.stopAll(true); // force=true for fast shutdown (SIGTERM + 5s → SIGKILL)
2151
2423
  }, ShutdownPriority.VeryHigh);
2152
2424
  // --- Priority: High (20) — Stop background services ---
2153
2425
  app.registerShutdownTask('stop-background-services', async () => {
2154
- try {
2155
- const relay = await container.resolveAsync(TELEMETRY_RELAY_TOKEN);
2156
- 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 */ }
2157
2444
  }
2158
- catch { /* non-critical */ }
2159
2445
  try {
2160
2446
  const mc = await container.resolveAsync(TITAN_METRICS_TOKEN);
2161
2447
  await mc.stop();
2162
2448
  }
2163
- catch { /* non-critical */ }
2164
- try {
2165
- const fleet = await container.resolveAsync(FLEET_SERVICE_TOKEN);
2166
- fleet.stopHeartbeatSweep();
2167
- }
2168
- catch { /* non-critical */ }
2169
- try {
2170
- const tc = await container.resolveAsync(TRACE_COLLECTOR_TOKEN);
2171
- await tc.stop();
2449
+ catch (error) {
2450
+ runtimeDiagnostics.failure('metrics.shutdown', 'Final metric flush failed; buffered samples were not confirmed', error);
2172
2451
  }
2173
- catch { /* non-critical */ }
2174
2452
  }, ShutdownPriority.High);
2175
2453
  // --- Priority: Normal (50) — System workers, node manager, sync, cluster ---
2176
2454
  app.registerShutdownTask('stop-system-services', async () => {
@@ -2198,10 +2476,12 @@ export class OmnitronDaemon {
2198
2476
  this.syncService = null;
2199
2477
  }
2200
2478
  try {
2201
- if (this.leaderElection?.stop)
2202
- this.leaderElection.stop();
2479
+ if (this.leaderElection)
2480
+ await this.leaderElection.stop();
2203
2481
  }
2204
2482
  catch { /* non-critical */ }
2483
+ if (this.clusterDb)
2484
+ await this.clusterDb.destroy();
2205
2485
  try {
2206
2486
  if (this.configSyncService?.stopPeriodicSync)
2207
2487
  this.configSyncService.stopPeriodicSync();
@@ -2209,7 +2489,6 @@ export class OmnitronDaemon {
2209
2489
  catch { /* non-critical */ }
2210
2490
  // Before stopping the workers: a worker exiting on the way out must not
2211
2491
  // be read as a crash and rescheduled.
2212
- this.isShuttingDown = true;
2213
2492
  this.healthWorkerSpawn = null;
2214
2493
  if (this.healthWorkerRestartTimer) {
2215
2494
  clearTimeout(this.healthWorkerRestartTimer);
@@ -2241,16 +2520,12 @@ export class OmnitronDaemon {
2241
2520
  }
2242
2521
  catch { /* non-critical */ }
2243
2522
  }, ShutdownPriority.Normal);
2244
- // --- Priority: Low (80) — Flush logs, clear state ---
2245
- app.registerShutdownTask('flush-and-clear', async () => {
2246
- try {
2247
- const logCollector = await container.resolveAsync(LOG_COLLECTOR_TOKEN);
2248
- await logCollector.dispose();
2249
- }
2250
- catch { /* non-critical */ }
2523
+ // --- Priority: Low (80) — Clear state ---
2524
+ app.registerShutdownTask('clear-state', async () => {
2251
2525
  try {
2252
2526
  const stateStore = await container.resolveAsync(STATE_STORE_TOKEN);
2253
- stateStore.clear();
2527
+ if (!this.execution)
2528
+ stateStore.clear();
2254
2529
  }
2255
2530
  catch { /* non-critical */ }
2256
2531
  }, ShutdownPriority.Low);
@@ -2274,7 +2549,7 @@ export class OmnitronDaemon {
2274
2549
  // lifetime. Locally it still tears down — `omnitron down` there means
2275
2550
  // "I am done for the day" — and on either, `omnitron infra down` is
2276
2551
  // the command that removes containers on purpose.
2277
- if (this.dc.role === 'slave') {
2552
+ if (this.dc.cluster?.enabled || this.dc.role === 'slave' || this.handingOffBackend || (this.execution && !this.stopApplicationsOnExit)) {
2278
2553
  // Said on the way out, because the absence of a teardown is
2279
2554
  // otherwise indistinguishable from a teardown that failed.
2280
2555
  this.infraService.dispose();
@@ -2289,12 +2564,61 @@ export class OmnitronDaemon {
2289
2564
  this.infraService = null;
2290
2565
  }
2291
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);
2292
2583
  // --- Priority: Last (100) — PID file removal ---
2293
2584
  app.registerShutdownTask('remove-pid', () => {
2294
- 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();
2295
2595
  }, ShutdownPriority.Last);
2296
2596
  }
2297
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);
2298
2622
  /**
2299
2623
  * Call a method on a system worker's proxy.
2300
2624
  *