@omnitron-dev/omnitron 0.1.3 → 0.3.0

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 (1253) hide show
  1. package/dist/BUILD.json +5 -0
  2. package/dist/cli/omnitron.js +378 -25
  3. package/dist/cli/omnitron.js.map +1 -1
  4. package/dist/cluster/cluster.rpc-service.d.ts +40 -0
  5. package/dist/cluster/cluster.rpc-service.d.ts.map +1 -1
  6. package/dist/cluster/cluster.rpc-service.js +49 -3
  7. package/dist/cluster/cluster.rpc-service.js.map +1 -1
  8. package/dist/cluster/config-sync.d.ts.map +1 -1
  9. package/dist/cluster/config-sync.js.map +1 -1
  10. package/dist/cluster/leader-election.d.ts +90 -2
  11. package/dist/cluster/leader-election.d.ts.map +1 -1
  12. package/dist/cluster/leader-election.js +176 -24
  13. package/dist/cluster/leader-election.js.map +1 -1
  14. package/dist/cluster/mesh-link.d.ts +136 -0
  15. package/dist/cluster/mesh-link.d.ts.map +1 -0
  16. package/dist/cluster/mesh-link.js +212 -0
  17. package/dist/cluster/mesh-link.js.map +1 -0
  18. package/dist/cluster/mesh.d.ts +59 -0
  19. package/dist/cluster/mesh.d.ts.map +1 -0
  20. package/dist/cluster/mesh.js +117 -0
  21. package/dist/cluster/mesh.js.map +1 -0
  22. package/dist/cluster/slave-connector.d.ts +193 -9
  23. package/dist/cluster/slave-connector.d.ts.map +1 -1
  24. package/dist/cluster/slave-connector.js +409 -37
  25. package/dist/cluster/slave-connector.js.map +1 -1
  26. package/dist/commands/audit.d.ts +65 -0
  27. package/dist/commands/audit.d.ts.map +1 -0
  28. package/dist/commands/audit.js +233 -0
  29. package/dist/commands/audit.js.map +1 -0
  30. package/dist/commands/backup.d.ts +4 -0
  31. package/dist/commands/backup.d.ts.map +1 -1
  32. package/dist/commands/backup.js +255 -33
  33. package/dist/commands/backup.js.map +1 -1
  34. package/dist/commands/cluster.d.ts.map +1 -1
  35. package/dist/commands/cluster.js +78 -47
  36. package/dist/commands/cluster.js.map +1 -1
  37. package/dist/commands/daemon-cmd.d.ts +7 -1
  38. package/dist/commands/daemon-cmd.d.ts.map +1 -1
  39. package/dist/commands/daemon-cmd.js +87 -21
  40. package/dist/commands/daemon-cmd.js.map +1 -1
  41. package/dist/commands/daemon-required.d.ts +34 -0
  42. package/dist/commands/daemon-required.d.ts.map +1 -0
  43. package/dist/commands/daemon-required.js +92 -0
  44. package/dist/commands/daemon-required.js.map +1 -0
  45. package/dist/commands/deploy.d.ts +70 -8
  46. package/dist/commands/deploy.d.ts.map +1 -1
  47. package/dist/commands/deploy.js +99 -64
  48. package/dist/commands/deploy.js.map +1 -1
  49. package/dist/commands/discover.d.ts +25 -4
  50. package/dist/commands/discover.d.ts.map +1 -1
  51. package/dist/commands/discover.js +155 -102
  52. package/dist/commands/discover.js.map +1 -1
  53. package/dist/commands/doctor.d.ts +293 -0
  54. package/dist/commands/doctor.d.ts.map +1 -0
  55. package/dist/commands/doctor.js +1706 -0
  56. package/dist/commands/doctor.js.map +1 -0
  57. package/dist/commands/env.d.ts +8 -1
  58. package/dist/commands/env.d.ts.map +1 -1
  59. package/dist/commands/env.js +18 -5
  60. package/dist/commands/env.js.map +1 -1
  61. package/dist/commands/exec.d.ts.map +1 -1
  62. package/dist/commands/exec.js +3 -2
  63. package/dist/commands/exec.js.map +1 -1
  64. package/dist/commands/fleet-asking.d.ts +87 -0
  65. package/dist/commands/fleet-asking.d.ts.map +1 -0
  66. package/dist/commands/fleet-asking.js +176 -0
  67. package/dist/commands/fleet-asking.js.map +1 -0
  68. package/dist/commands/fleet.d.ts +18 -0
  69. package/dist/commands/fleet.d.ts.map +1 -1
  70. package/dist/commands/fleet.js +314 -74
  71. package/dist/commands/fleet.js.map +1 -1
  72. package/dist/commands/health-check.d.ts +8 -6
  73. package/dist/commands/health-check.d.ts.map +1 -1
  74. package/dist/commands/health-check.js +26 -23
  75. package/dist/commands/health-check.js.map +1 -1
  76. package/dist/commands/health.d.ts.map +1 -1
  77. package/dist/commands/health.js +26 -4
  78. package/dist/commands/health.js.map +1 -1
  79. package/dist/commands/infra.d.ts +42 -1
  80. package/dist/commands/infra.d.ts.map +1 -1
  81. package/dist/commands/infra.js +418 -49
  82. package/dist/commands/infra.js.map +1 -1
  83. package/dist/commands/init.d.ts.map +1 -1
  84. package/dist/commands/init.js +21 -36
  85. package/dist/commands/init.js.map +1 -1
  86. package/dist/commands/inspect-graph.d.ts +20 -0
  87. package/dist/commands/inspect-graph.d.ts.map +1 -0
  88. package/dist/commands/inspect-graph.js +74 -0
  89. package/dist/commands/inspect-graph.js.map +1 -0
  90. package/dist/commands/inspect.d.ts.map +1 -1
  91. package/dist/commands/inspect.js +115 -11
  92. package/dist/commands/inspect.js.map +1 -1
  93. package/dist/commands/k8s.d.ts.map +1 -1
  94. package/dist/commands/k8s.js +23 -18
  95. package/dist/commands/k8s.js.map +1 -1
  96. package/dist/commands/kb.d.ts.map +1 -1
  97. package/dist/commands/kb.js +88 -29
  98. package/dist/commands/kb.js.map +1 -1
  99. package/dist/commands/list.d.ts.map +1 -1
  100. package/dist/commands/list.js +25 -3
  101. package/dist/commands/list.js.map +1 -1
  102. package/dist/commands/log-health.d.ts +120 -0
  103. package/dist/commands/log-health.d.ts.map +1 -0
  104. package/dist/commands/log-health.js +212 -0
  105. package/dist/commands/log-health.js.map +1 -0
  106. package/dist/commands/logs.d.ts +96 -2
  107. package/dist/commands/logs.d.ts.map +1 -1
  108. package/dist/commands/logs.js +532 -192
  109. package/dist/commands/logs.js.map +1 -1
  110. package/dist/commands/metrics.d.ts.map +1 -1
  111. package/dist/commands/metrics.js +40 -14
  112. package/dist/commands/metrics.js.map +1 -1
  113. package/dist/commands/monit.d.ts.map +1 -1
  114. package/dist/commands/monit.js +12 -2
  115. package/dist/commands/monit.js.map +1 -1
  116. package/dist/commands/node.d.ts +68 -0
  117. package/dist/commands/node.d.ts.map +1 -1
  118. package/dist/commands/node.js +285 -68
  119. package/dist/commands/node.js.map +1 -1
  120. package/dist/commands/output.d.ts +45 -0
  121. package/dist/commands/output.d.ts.map +1 -0
  122. package/dist/commands/output.js +103 -0
  123. package/dist/commands/output.js.map +1 -0
  124. package/dist/commands/pipeline.d.ts.map +1 -1
  125. package/dist/commands/pipeline.js +26 -19
  126. package/dist/commands/pipeline.js.map +1 -1
  127. package/dist/commands/project.d.ts +19 -0
  128. package/dist/commands/project.d.ts.map +1 -1
  129. package/dist/commands/project.js +125 -27
  130. package/dist/commands/project.js.map +1 -1
  131. package/dist/commands/release-store.d.ts +28 -0
  132. package/dist/commands/release-store.d.ts.map +1 -0
  133. package/dist/commands/release-store.js +158 -0
  134. package/dist/commands/release-store.js.map +1 -0
  135. package/dist/commands/release.d.ts +61 -0
  136. package/dist/commands/release.d.ts.map +1 -0
  137. package/dist/commands/release.js +555 -0
  138. package/dist/commands/release.js.map +1 -0
  139. package/dist/commands/reload.d.ts +16 -0
  140. package/dist/commands/reload.d.ts.map +1 -1
  141. package/dist/commands/reload.js +21 -5
  142. package/dist/commands/reload.js.map +1 -1
  143. package/dist/commands/remote.d.ts +40 -0
  144. package/dist/commands/remote.d.ts.map +1 -1
  145. package/dist/commands/remote.js +146 -35
  146. package/dist/commands/remote.js.map +1 -1
  147. package/dist/commands/restart.d.ts +16 -0
  148. package/dist/commands/restart.d.ts.map +1 -1
  149. package/dist/commands/restart.js +21 -5
  150. package/dist/commands/restart.js.map +1 -1
  151. package/dist/commands/scale.d.ts.map +1 -1
  152. package/dist/commands/scale.js +4 -3
  153. package/dist/commands/scale.js.map +1 -1
  154. package/dist/commands/secret.d.ts +54 -0
  155. package/dist/commands/secret.d.ts.map +1 -1
  156. package/dist/commands/secret.js +236 -34
  157. package/dist/commands/secret.js.map +1 -1
  158. package/dist/commands/service-units.d.ts +181 -0
  159. package/dist/commands/service-units.d.ts.map +1 -0
  160. package/dist/commands/service-units.js +291 -0
  161. package/dist/commands/service-units.js.map +1 -0
  162. package/dist/commands/service.d.ts +39 -0
  163. package/dist/commands/service.d.ts.map +1 -0
  164. package/dist/commands/service.js +370 -0
  165. package/dist/commands/service.js.map +1 -0
  166. package/dist/commands/spinner.d.ts +29 -0
  167. package/dist/commands/spinner.d.ts.map +1 -0
  168. package/dist/commands/spinner.js +44 -0
  169. package/dist/commands/spinner.js.map +1 -0
  170. package/dist/commands/stack.d.ts +49 -1
  171. package/dist/commands/stack.d.ts.map +1 -1
  172. package/dist/commands/stack.js +341 -13
  173. package/dist/commands/stack.js.map +1 -1
  174. package/dist/commands/start.d.ts +16 -0
  175. package/dist/commands/start.d.ts.map +1 -1
  176. package/dist/commands/start.js +20 -3
  177. package/dist/commands/start.js.map +1 -1
  178. package/dist/commands/status.d.ts +9 -0
  179. package/dist/commands/status.d.ts.map +1 -1
  180. package/dist/commands/status.js +62 -29
  181. package/dist/commands/status.js.map +1 -1
  182. package/dist/commands/stop.d.ts +16 -0
  183. package/dist/commands/stop.d.ts.map +1 -1
  184. package/dist/commands/stop.js +34 -6
  185. package/dist/commands/stop.js.map +1 -1
  186. package/dist/commands/tor.d.ts +20 -0
  187. package/dist/commands/tor.d.ts.map +1 -0
  188. package/dist/commands/tor.js +180 -0
  189. package/dist/commands/tor.js.map +1 -0
  190. package/dist/commands/up.d.ts +85 -1
  191. package/dist/commands/up.d.ts.map +1 -1
  192. package/dist/commands/up.js +181 -33
  193. package/dist/commands/up.js.map +1 -1
  194. package/dist/commands/webapp.d.ts.map +1 -1
  195. package/dist/commands/webapp.js +2 -1
  196. package/dist/commands/webapp.js.map +1 -1
  197. package/dist/config/defaults.d.ts +16 -0
  198. package/dist/config/defaults.d.ts.map +1 -1
  199. package/dist/config/defaults.js +26 -3
  200. package/dist/config/defaults.js.map +1 -1
  201. package/dist/config/define-ecosystem.d.ts.map +1 -1
  202. package/dist/config/define-ecosystem.js +2 -0
  203. package/dist/config/define-ecosystem.js.map +1 -1
  204. package/dist/config/index.d.ts +1 -1
  205. package/dist/config/index.d.ts.map +1 -1
  206. package/dist/config/index.js +1 -1
  207. package/dist/config/index.js.map +1 -1
  208. package/dist/config/loader.d.ts +45 -1
  209. package/dist/config/loader.d.ts.map +1 -1
  210. package/dist/config/loader.js +93 -11
  211. package/dist/config/loader.js.map +1 -1
  212. package/dist/config/omnitron-config.schema.d.ts.map +1 -1
  213. package/dist/config/omnitron-config.schema.js +16 -0
  214. package/dist/config/omnitron-config.schema.js.map +1 -1
  215. package/dist/config/types.d.ts +425 -42
  216. package/dist/config/types.d.ts.map +1 -1
  217. package/dist/daemon/config-reload.d.ts +27 -0
  218. package/dist/daemon/config-reload.d.ts.map +1 -0
  219. package/dist/daemon/config-reload.js +42 -0
  220. package/dist/daemon/config-reload.js.map +1 -0
  221. package/dist/daemon/daemon-client.d.ts +150 -2
  222. package/dist/daemon/daemon-client.d.ts.map +1 -1
  223. package/dist/daemon/daemon-client.js +311 -21
  224. package/dist/daemon/daemon-client.js.map +1 -1
  225. package/dist/daemon/daemon-entry.js +92 -38
  226. package/dist/daemon/daemon-entry.js.map +1 -1
  227. package/dist/daemon/daemon-scheduler.d.ts +4 -0
  228. package/dist/daemon/daemon-scheduler.d.ts.map +1 -1
  229. package/dist/daemon/daemon-scheduler.js +137 -7
  230. package/dist/daemon/daemon-scheduler.js.map +1 -1
  231. package/dist/daemon/daemon-state-store.service.d.ts +263 -0
  232. package/dist/daemon/daemon-state-store.service.d.ts.map +1 -0
  233. package/dist/daemon/daemon-state-store.service.js +446 -0
  234. package/dist/daemon/daemon-state-store.service.js.map +1 -0
  235. package/dist/daemon/daemon.d.ts +207 -1
  236. package/dist/daemon/daemon.d.ts.map +1 -1
  237. package/dist/daemon/daemon.js +1254 -143
  238. package/dist/daemon/daemon.js.map +1 -1
  239. package/dist/daemon/daemon.module.d.ts.map +1 -1
  240. package/dist/daemon/daemon.module.js +186 -79
  241. package/dist/daemon/daemon.module.js.map +1 -1
  242. package/dist/daemon/daemon.rpc-service.d.ts +109 -1
  243. package/dist/daemon/daemon.rpc-service.d.ts.map +1 -1
  244. package/dist/daemon/daemon.rpc-service.js +451 -95
  245. package/dist/daemon/daemon.rpc-service.js.map +1 -1
  246. package/dist/daemon/pid-manager.d.ts +69 -5
  247. package/dist/daemon/pid-manager.d.ts.map +1 -1
  248. package/dist/daemon/pid-manager.js +151 -17
  249. package/dist/daemon/pid-manager.js.map +1 -1
  250. package/dist/daemon/spawn-daemon.d.ts +73 -0
  251. package/dist/daemon/spawn-daemon.d.ts.map +1 -0
  252. package/dist/daemon/spawn-daemon.js +101 -0
  253. package/dist/daemon/spawn-daemon.js.map +1 -0
  254. package/dist/daemon/state-store.d.ts +65 -3
  255. package/dist/daemon/state-store.d.ts.map +1 -1
  256. package/dist/daemon/state-store.js +103 -19
  257. package/dist/daemon/state-store.js.map +1 -1
  258. package/dist/database/connection.d.ts +71 -0
  259. package/dist/database/connection.d.ts.map +1 -0
  260. package/dist/database/connection.js +129 -0
  261. package/dist/database/connection.js.map +1 -0
  262. package/dist/database/dialect.d.ts +60 -0
  263. package/dist/database/dialect.d.ts.map +1 -0
  264. package/dist/database/dialect.js +80 -0
  265. package/dist/database/dialect.js.map +1 -0
  266. package/dist/database/migrate.d.ts +5 -2
  267. package/dist/database/migrate.d.ts.map +1 -1
  268. package/dist/database/migrate.js +23 -33
  269. package/dist/database/migrate.js.map +1 -1
  270. package/dist/database/migration-runner.d.ts +50 -0
  271. package/dist/database/migration-runner.d.ts.map +1 -0
  272. package/dist/database/migration-runner.js +143 -0
  273. package/dist/database/migration-runner.js.map +1 -0
  274. package/dist/database/migrations/006_login_throttle.d.ts +17 -0
  275. package/dist/database/migrations/006_login_throttle.d.ts.map +1 -0
  276. package/dist/database/migrations/006_login_throttle.js +33 -0
  277. package/dist/database/migrations/006_login_throttle.js.map +1 -0
  278. package/dist/database/migrations/007_sync_ingested.d.ts +21 -0
  279. package/dist/database/migrations/007_sync_ingested.d.ts.map +1 -0
  280. package/dist/database/migrations/007_sync_ingested.js +39 -0
  281. package/dist/database/migrations/007_sync_ingested.js.map +1 -0
  282. package/dist/database/migrations/008_node_health_version_text.d.ts +24 -0
  283. package/dist/database/migrations/008_node_health_version_text.d.ts.map +1 -0
  284. package/dist/database/migrations/008_node_health_version_text.js +35 -0
  285. package/dist/database/migrations/008_node_health_version_text.js.map +1 -0
  286. package/dist/database/migrations/009_node_health_unmeasured.d.ts +40 -0
  287. package/dist/database/migrations/009_node_health_unmeasured.d.ts.map +1 -0
  288. package/dist/database/migrations/009_node_health_unmeasured.js +63 -0
  289. package/dist/database/migrations/009_node_health_unmeasured.js.map +1 -0
  290. package/dist/database/migrations/010_metrics_raw_had_no_reader.d.ts +22 -0
  291. package/dist/database/migrations/010_metrics_raw_had_no_reader.d.ts.map +1 -0
  292. package/dist/database/migrations/010_metrics_raw_had_no_reader.js +26 -0
  293. package/dist/database/migrations/010_metrics_raw_had_no_reader.js.map +1 -0
  294. package/dist/database/migrations/011_alerts_nobody_had_to_write.d.ts +56 -0
  295. package/dist/database/migrations/011_alerts_nobody_had_to_write.d.ts.map +1 -0
  296. package/dist/database/migrations/011_alerts_nobody_had_to_write.js +79 -0
  297. package/dist/database/migrations/011_alerts_nobody_had_to_write.js.map +1 -0
  298. package/dist/database/migrations/012_a_disk_nobody_watched.d.ts +26 -0
  299. package/dist/database/migrations/012_a_disk_nobody_watched.d.ts.map +1 -0
  300. package/dist/database/migrations/012_a_disk_nobody_watched.js +40 -0
  301. package/dist/database/migrations/012_a_disk_nobody_watched.js.map +1 -0
  302. package/dist/database/migrations/013_an_alarm_delivered.d.ts +14 -0
  303. package/dist/database/migrations/013_an_alarm_delivered.d.ts.map +1 -0
  304. package/dist/database/migrations/013_an_alarm_delivered.js +28 -0
  305. package/dist/database/migrations/013_an_alarm_delivered.js.map +1 -0
  306. package/dist/database/migrations/index.d.ts +21 -0
  307. package/dist/database/migrations/index.d.ts.map +1 -0
  308. package/dist/database/migrations/index.js +47 -0
  309. package/dist/database/migrations/index.js.map +1 -0
  310. package/dist/database/schema.d.ts +27 -11
  311. package/dist/database/schema.d.ts.map +1 -1
  312. package/dist/database/sqlite-date-binding.d.ts +71 -0
  313. package/dist/database/sqlite-date-binding.d.ts.map +1 -0
  314. package/dist/database/sqlite-date-binding.js +174 -0
  315. package/dist/database/sqlite-date-binding.js.map +1 -0
  316. package/dist/execution/data-channel.d.ts +48 -0
  317. package/dist/execution/data-channel.d.ts.map +1 -0
  318. package/dist/execution/data-channel.js +55 -0
  319. package/dist/execution/data-channel.js.map +1 -0
  320. package/dist/execution/execution.service.d.ts +139 -0
  321. package/dist/execution/execution.service.d.ts.map +1 -1
  322. package/dist/execution/execution.service.js +273 -10
  323. package/dist/execution/execution.service.js.map +1 -1
  324. package/dist/index.d.ts +1 -1
  325. package/dist/index.d.ts.map +1 -1
  326. package/dist/infrastructure/bare-metal-plan.d.ts +208 -0
  327. package/dist/infrastructure/bare-metal-plan.d.ts.map +1 -0
  328. package/dist/infrastructure/bare-metal-plan.js +363 -0
  329. package/dist/infrastructure/bare-metal-plan.js.map +1 -0
  330. package/dist/infrastructure/bare-metal-runner.d.ts +65 -0
  331. package/dist/infrastructure/bare-metal-runner.d.ts.map +1 -0
  332. package/dist/infrastructure/bare-metal-runner.js +354 -0
  333. package/dist/infrastructure/bare-metal-runner.js.map +1 -0
  334. package/dist/infrastructure/config-payload.d.ts +149 -0
  335. package/dist/infrastructure/config-payload.d.ts.map +1 -0
  336. package/dist/infrastructure/config-payload.js +235 -0
  337. package/dist/infrastructure/config-payload.js.map +1 -0
  338. package/dist/infrastructure/container-runtime.d.ts +179 -1
  339. package/dist/infrastructure/container-runtime.d.ts.map +1 -1
  340. package/dist/infrastructure/container-runtime.js +612 -45
  341. package/dist/infrastructure/container-runtime.js.map +1 -1
  342. package/dist/infrastructure/gateway-reachability.d.ts +85 -0
  343. package/dist/infrastructure/gateway-reachability.d.ts.map +1 -0
  344. package/dist/infrastructure/gateway-reachability.js +116 -0
  345. package/dist/infrastructure/gateway-reachability.js.map +1 -0
  346. package/dist/infrastructure/gateway-redis-db.d.ts +29 -0
  347. package/dist/infrastructure/gateway-redis-db.d.ts.map +1 -0
  348. package/dist/infrastructure/gateway-redis-db.js +32 -0
  349. package/dist/infrastructure/gateway-redis-db.js.map +1 -0
  350. package/dist/infrastructure/host-inspection.d.ts +223 -0
  351. package/dist/infrastructure/host-inspection.d.ts.map +1 -0
  352. package/dist/infrastructure/host-inspection.js +501 -0
  353. package/dist/infrastructure/host-inspection.js.map +1 -0
  354. package/dist/infrastructure/infrastructure-gate.d.ts.map +1 -1
  355. package/dist/infrastructure/infrastructure.service.d.ts +247 -6
  356. package/dist/infrastructure/infrastructure.service.d.ts.map +1 -1
  357. package/dist/infrastructure/infrastructure.service.js +571 -96
  358. package/dist/infrastructure/infrastructure.service.js.map +1 -1
  359. package/dist/infrastructure/known-machines.d.ts +76 -0
  360. package/dist/infrastructure/known-machines.d.ts.map +1 -0
  361. package/dist/infrastructure/known-machines.js +94 -0
  362. package/dist/infrastructure/known-machines.js.map +1 -0
  363. package/dist/infrastructure/node-credentials.d.ts +45 -0
  364. package/dist/infrastructure/node-credentials.d.ts.map +1 -0
  365. package/dist/infrastructure/node-credentials.js +80 -0
  366. package/dist/infrastructure/node-credentials.js.map +1 -0
  367. package/dist/infrastructure/orphan-containers.d.ts +99 -0
  368. package/dist/infrastructure/orphan-containers.d.ts.map +1 -0
  369. package/dist/infrastructure/orphan-containers.js +106 -0
  370. package/dist/infrastructure/orphan-containers.js.map +1 -0
  371. package/dist/infrastructure/phantom-endpoint-janitor.d.ts +92 -0
  372. package/dist/infrastructure/phantom-endpoint-janitor.d.ts.map +1 -0
  373. package/dist/infrastructure/phantom-endpoint-janitor.js +199 -0
  374. package/dist/infrastructure/phantom-endpoint-janitor.js.map +1 -0
  375. package/dist/infrastructure/presets/gateway-openresty.d.ts.map +1 -1
  376. package/dist/infrastructure/presets/gateway-openresty.js +29 -3
  377. package/dist/infrastructure/presets/gateway-openresty.js.map +1 -1
  378. package/dist/infrastructure/presets/index.d.ts.map +1 -1
  379. package/dist/infrastructure/presets/index.js +2 -0
  380. package/dist/infrastructure/presets/index.js.map +1 -1
  381. package/dist/infrastructure/presets/minio.d.ts.map +1 -1
  382. package/dist/infrastructure/presets/minio.js +36 -3
  383. package/dist/infrastructure/presets/minio.js.map +1 -1
  384. package/dist/infrastructure/presets/postgres.d.ts.map +1 -1
  385. package/dist/infrastructure/presets/postgres.js +78 -5
  386. package/dist/infrastructure/presets/postgres.js.map +1 -1
  387. package/dist/infrastructure/presets/redis.d.ts.map +1 -1
  388. package/dist/infrastructure/presets/redis.js +23 -4
  389. package/dist/infrastructure/presets/redis.js.map +1 -1
  390. package/dist/infrastructure/presets/registry.d.ts.map +1 -1
  391. package/dist/infrastructure/presets/registry.js +85 -4
  392. package/dist/infrastructure/presets/registry.js.map +1 -1
  393. package/dist/infrastructure/presets/tor.d.ts +112 -0
  394. package/dist/infrastructure/presets/tor.d.ts.map +1 -0
  395. package/dist/infrastructure/presets/tor.js +185 -0
  396. package/dist/infrastructure/presets/tor.js.map +1 -0
  397. package/dist/infrastructure/presets/torrc.d.ts +54 -0
  398. package/dist/infrastructure/presets/torrc.d.ts.map +1 -0
  399. package/dist/infrastructure/presets/torrc.js +153 -0
  400. package/dist/infrastructure/presets/torrc.js.map +1 -0
  401. package/dist/infrastructure/presets/types.d.ts +17 -0
  402. package/dist/infrastructure/presets/types.d.ts.map +1 -1
  403. package/dist/infrastructure/provisioning-outcome.d.ts +85 -0
  404. package/dist/infrastructure/provisioning-outcome.d.ts.map +1 -0
  405. package/dist/infrastructure/provisioning-outcome.js +122 -0
  406. package/dist/infrastructure/provisioning-outcome.js.map +1 -0
  407. package/dist/infrastructure/server-registry.d.ts +27 -0
  408. package/dist/infrastructure/server-registry.d.ts.map +1 -1
  409. package/dist/infrastructure/server-registry.js +60 -5
  410. package/dist/infrastructure/server-registry.js.map +1 -1
  411. package/dist/infrastructure/service-binding.d.ts +60 -0
  412. package/dist/infrastructure/service-binding.d.ts.map +1 -0
  413. package/dist/infrastructure/service-binding.js +90 -0
  414. package/dist/infrastructure/service-binding.js.map +1 -0
  415. package/dist/infrastructure/service-credentials.d.ts +105 -0
  416. package/dist/infrastructure/service-credentials.d.ts.map +1 -0
  417. package/dist/infrastructure/service-credentials.js +141 -0
  418. package/dist/infrastructure/service-credentials.js.map +1 -0
  419. package/dist/infrastructure/service-resolver.d.ts +191 -12
  420. package/dist/infrastructure/service-resolver.d.ts.map +1 -1
  421. package/dist/infrastructure/service-resolver.js +521 -60
  422. package/dist/infrastructure/service-resolver.js.map +1 -1
  423. package/dist/infrastructure/shipped-config.d.ts +43 -0
  424. package/dist/infrastructure/shipped-config.d.ts.map +1 -0
  425. package/dist/infrastructure/shipped-config.js +159 -0
  426. package/dist/infrastructure/shipped-config.js.map +1 -0
  427. package/dist/infrastructure/stack-infra-manager.d.ts +7 -1
  428. package/dist/infrastructure/stack-infra-manager.d.ts.map +1 -1
  429. package/dist/infrastructure/stack-infra-manager.js +32 -14
  430. package/dist/infrastructure/stack-infra-manager.js.map +1 -1
  431. package/dist/infrastructure/types.d.ts +278 -6
  432. package/dist/infrastructure/types.d.ts.map +1 -1
  433. package/dist/mcp/mcp-bridge.d.ts.map +1 -1
  434. package/dist/mcp/mcp-bridge.js.map +1 -1
  435. package/dist/mcp/tool-groups/apps.tools.d.ts +2 -1
  436. package/dist/mcp/tool-groups/apps.tools.d.ts.map +1 -1
  437. package/dist/mcp/tool-groups/apps.tools.js +2 -2
  438. package/dist/mcp/tool-groups/apps.tools.js.map +1 -1
  439. package/dist/mcp/tool-groups/infra.tools.d.ts +16 -2
  440. package/dist/mcp/tool-groups/infra.tools.d.ts.map +1 -1
  441. package/dist/mcp/tool-groups/infra.tools.js +51 -41
  442. package/dist/mcp/tool-groups/infra.tools.js.map +1 -1
  443. package/dist/mcp/tool-groups/kb.tools.d.ts.map +1 -1
  444. package/dist/mcp/tool-groups/kb.tools.js +4 -6
  445. package/dist/mcp/tool-groups/kb.tools.js.map +1 -1
  446. package/dist/mcp/tool-groups/management.tools.d.ts +20 -3
  447. package/dist/mcp/tool-groups/management.tools.d.ts.map +1 -1
  448. package/dist/mcp/tool-groups/management.tools.js +158 -125
  449. package/dist/mcp/tool-groups/management.tools.js.map +1 -1
  450. package/dist/mcp/tool-groups/monitoring.tools.d.ts +10 -1
  451. package/dist/mcp/tool-groups/monitoring.tools.d.ts.map +1 -1
  452. package/dist/mcp/tool-groups/monitoring.tools.js +65 -18
  453. package/dist/mcp/tool-groups/monitoring.tools.js.map +1 -1
  454. package/dist/mcp/unavailable-tools.d.ts +35 -0
  455. package/dist/mcp/unavailable-tools.d.ts.map +1 -0
  456. package/dist/mcp/unavailable-tools.js +59 -0
  457. package/dist/mcp/unavailable-tools.js.map +1 -0
  458. package/dist/monitoring/app-health.indicator.d.ts.map +1 -1
  459. package/dist/monitoring/app-health.indicator.js +12 -0
  460. package/dist/monitoring/app-health.indicator.js.map +1 -1
  461. package/dist/monitoring/desktop-notifier.d.ts +26 -0
  462. package/dist/monitoring/desktop-notifier.d.ts.map +1 -0
  463. package/dist/monitoring/desktop-notifier.js +49 -0
  464. package/dist/monitoring/desktop-notifier.js.map +1 -0
  465. package/dist/monitoring/docker-health.indicator.d.ts +17 -1
  466. package/dist/monitoring/docker-health.indicator.d.ts.map +1 -1
  467. package/dist/monitoring/docker-health.indicator.js +38 -8
  468. package/dist/monitoring/docker-health.indicator.js.map +1 -1
  469. package/dist/monitoring/event-loop-stall.indicator.d.ts +26 -0
  470. package/dist/monitoring/event-loop-stall.indicator.d.ts.map +1 -0
  471. package/dist/monitoring/event-loop-stall.indicator.js +47 -0
  472. package/dist/monitoring/event-loop-stall.indicator.js.map +1 -0
  473. package/dist/monitoring/event-loop-watch.d.ts +124 -0
  474. package/dist/monitoring/event-loop-watch.d.ts.map +1 -0
  475. package/dist/monitoring/event-loop-watch.js +179 -0
  476. package/dist/monitoring/event-loop-watch.js.map +1 -0
  477. package/dist/monitoring/host-disk.d.ts +6 -0
  478. package/dist/monitoring/host-disk.d.ts.map +1 -0
  479. package/dist/monitoring/host-disk.js +26 -0
  480. package/dist/monitoring/host-disk.js.map +1 -0
  481. package/dist/monitoring/log-line.d.ts +188 -0
  482. package/dist/monitoring/log-line.d.ts.map +1 -0
  483. package/dist/monitoring/log-line.js +458 -0
  484. package/dist/monitoring/log-line.js.map +1 -0
  485. package/dist/monitoring/log-manager.d.ts +89 -8
  486. package/dist/monitoring/log-manager.d.ts.map +1 -1
  487. package/dist/monitoring/log-manager.js +246 -77
  488. package/dist/monitoring/log-manager.js.map +1 -1
  489. package/dist/observability/index.d.ts +4 -0
  490. package/dist/observability/index.d.ts.map +1 -0
  491. package/dist/observability/index.js +3 -0
  492. package/dist/observability/index.js.map +1 -0
  493. package/dist/observability/metrics-bridge.d.ts +87 -0
  494. package/dist/observability/metrics-bridge.d.ts.map +1 -0
  495. package/dist/observability/metrics-bridge.js +295 -0
  496. package/dist/observability/metrics-bridge.js.map +1 -0
  497. package/dist/observability/metrics-server.d.ts +68 -0
  498. package/dist/observability/metrics-server.d.ts.map +1 -0
  499. package/dist/observability/metrics-server.js +146 -0
  500. package/dist/observability/metrics-server.js.map +1 -0
  501. package/dist/orchestrator/app-handle.d.ts +170 -3
  502. package/dist/orchestrator/app-handle.d.ts.map +1 -1
  503. package/dist/orchestrator/app-handle.js +177 -3
  504. package/dist/orchestrator/app-handle.js.map +1 -1
  505. package/dist/orchestrator/app-health.d.ts +33 -0
  506. package/dist/orchestrator/app-health.d.ts.map +1 -0
  507. package/dist/orchestrator/app-health.js +74 -0
  508. package/dist/orchestrator/app-health.js.map +1 -0
  509. package/dist/orchestrator/app-traffic.d.ts +14 -0
  510. package/dist/orchestrator/app-traffic.d.ts.map +1 -0
  511. package/dist/orchestrator/app-traffic.js +33 -0
  512. package/dist/orchestrator/app-traffic.js.map +1 -0
  513. package/dist/orchestrator/bootstrap-loader-child.d.ts +19 -0
  514. package/dist/orchestrator/bootstrap-loader-child.d.ts.map +1 -0
  515. package/dist/orchestrator/bootstrap-loader-child.js +43 -0
  516. package/dist/orchestrator/bootstrap-loader-child.js.map +1 -0
  517. package/dist/orchestrator/bootstrap-loader.d.ts +72 -0
  518. package/dist/orchestrator/bootstrap-loader.d.ts.map +1 -1
  519. package/dist/orchestrator/bootstrap-loader.js +350 -5
  520. package/dist/orchestrator/bootstrap-loader.js.map +1 -1
  521. package/dist/orchestrator/bootstrap-process.d.ts +148 -4
  522. package/dist/orchestrator/bootstrap-process.d.ts.map +1 -1
  523. package/dist/orchestrator/bootstrap-process.js +496 -18
  524. package/dist/orchestrator/bootstrap-process.js.map +1 -1
  525. package/dist/orchestrator/build-service.d.ts +50 -3
  526. package/dist/orchestrator/build-service.d.ts.map +1 -1
  527. package/dist/orchestrator/build-service.js +357 -85
  528. package/dist/orchestrator/build-service.js.map +1 -1
  529. package/dist/orchestrator/call-exposed-service.d.ts +7 -0
  530. package/dist/orchestrator/call-exposed-service.d.ts.map +1 -0
  531. package/dist/orchestrator/call-exposed-service.js +50 -0
  532. package/dist/orchestrator/call-exposed-service.js.map +1 -0
  533. package/dist/orchestrator/classic-launcher.d.ts +1 -0
  534. package/dist/orchestrator/classic-launcher.d.ts.map +1 -1
  535. package/dist/orchestrator/classic-launcher.js +34 -3
  536. package/dist/orchestrator/classic-launcher.js.map +1 -1
  537. package/dist/orchestrator/file-watcher.d.ts +78 -1
  538. package/dist/orchestrator/file-watcher.d.ts.map +1 -1
  539. package/dist/orchestrator/file-watcher.js +240 -43
  540. package/dist/orchestrator/file-watcher.js.map +1 -1
  541. package/dist/orchestrator/module-worker-process.d.ts.map +1 -1
  542. package/dist/orchestrator/module-worker-process.js +10 -0
  543. package/dist/orchestrator/module-worker-process.js.map +1 -1
  544. package/dist/orchestrator/orchestrator.service.d.ts +540 -7
  545. package/dist/orchestrator/orchestrator.service.d.ts.map +1 -1
  546. package/dist/orchestrator/orchestrator.service.js +2106 -242
  547. package/dist/orchestrator/orchestrator.service.js.map +1 -1
  548. package/dist/orchestrator/owned-pids.d.ts +83 -0
  549. package/dist/orchestrator/owned-pids.d.ts.map +1 -0
  550. package/dist/orchestrator/owned-pids.js +93 -0
  551. package/dist/orchestrator/owned-pids.js.map +1 -0
  552. package/dist/orchestrator/port-conflict.d.ts +102 -0
  553. package/dist/orchestrator/port-conflict.d.ts.map +1 -0
  554. package/dist/orchestrator/port-conflict.js +131 -0
  555. package/dist/orchestrator/port-conflict.js.map +1 -0
  556. package/dist/orchestrator/process-janitor.d.ts +227 -0
  557. package/dist/orchestrator/process-janitor.d.ts.map +1 -0
  558. package/dist/orchestrator/process-janitor.js +495 -0
  559. package/dist/orchestrator/process-janitor.js.map +1 -0
  560. package/dist/orchestrator/ps-metrics.d.ts +37 -0
  561. package/dist/orchestrator/ps-metrics.d.ts.map +1 -0
  562. package/dist/orchestrator/ps-metrics.js +60 -0
  563. package/dist/orchestrator/ps-metrics.js.map +1 -0
  564. package/dist/orchestrator/service-router.d.ts +58 -2
  565. package/dist/orchestrator/service-router.d.ts.map +1 -1
  566. package/dist/orchestrator/service-router.js +157 -25
  567. package/dist/orchestrator/service-router.js.map +1 -1
  568. package/dist/orchestrator/topology-query.d.ts +49 -0
  569. package/dist/orchestrator/topology-query.d.ts.map +1 -0
  570. package/dist/orchestrator/topology-query.js +54 -0
  571. package/dist/orchestrator/topology-query.js.map +1 -0
  572. package/dist/project/artifact-builder.d.ts +174 -3
  573. package/dist/project/artifact-builder.d.ts.map +1 -1
  574. package/dist/project/artifact-builder.js +454 -42
  575. package/dist/project/artifact-builder.js.map +1 -1
  576. package/dist/project/build-decision.d.ts +58 -0
  577. package/dist/project/build-decision.d.ts.map +1 -0
  578. package/dist/project/build-decision.js +59 -0
  579. package/dist/project/build-decision.js.map +1 -0
  580. package/dist/project/config-resolver.d.ts +6 -4
  581. package/dist/project/config-resolver.d.ts.map +1 -1
  582. package/dist/project/config-resolver.js +158 -78
  583. package/dist/project/config-resolver.js.map +1 -1
  584. package/dist/project/declared-config.d.ts +42 -0
  585. package/dist/project/declared-config.d.ts.map +1 -0
  586. package/dist/project/declared-config.js +60 -0
  587. package/dist/project/declared-config.js.map +1 -0
  588. package/dist/project/dependency-analyzer.d.ts.map +1 -1
  589. package/dist/project/dependency-analyzer.js.map +1 -1
  590. package/dist/project/deploy-phases.d.ts +35 -0
  591. package/dist/project/deploy-phases.d.ts.map +1 -0
  592. package/dist/project/deploy-phases.js +75 -0
  593. package/dist/project/deploy-phases.js.map +1 -0
  594. package/dist/project/exec-in-group.d.ts +49 -0
  595. package/dist/project/exec-in-group.d.ts.map +1 -0
  596. package/dist/project/exec-in-group.js +100 -0
  597. package/dist/project/exec-in-group.js.map +1 -0
  598. package/dist/project/node-app-config.d.ts +101 -0
  599. package/dist/project/node-app-config.d.ts.map +1 -0
  600. package/dist/project/node-app-config.js +134 -0
  601. package/dist/project/node-app-config.js.map +1 -0
  602. package/dist/project/node-app-health.d.ts +76 -0
  603. package/dist/project/node-app-health.d.ts.map +1 -0
  604. package/dist/project/node-app-health.js +119 -0
  605. package/dist/project/node-app-health.js.map +1 -0
  606. package/dist/project/operator-account.d.ts +287 -0
  607. package/dist/project/operator-account.d.ts.map +1 -0
  608. package/dist/project/operator-account.js +373 -0
  609. package/dist/project/operator-account.js.map +1 -0
  610. package/dist/project/registry.d.ts +46 -8
  611. package/dist/project/registry.d.ts.map +1 -1
  612. package/dist/project/registry.js +238 -40
  613. package/dist/project/registry.js.map +1 -1
  614. package/dist/project/requirements-scanner.d.ts +1 -0
  615. package/dist/project/requirements-scanner.d.ts.map +1 -1
  616. package/dist/project/requirements-scanner.js +28 -3
  617. package/dist/project/requirements-scanner.js.map +1 -1
  618. package/dist/project/stack-env.d.ts +37 -0
  619. package/dist/project/stack-env.d.ts.map +1 -0
  620. package/dist/project/stack-env.js +85 -0
  621. package/dist/project/stack-env.js.map +1 -0
  622. package/dist/project/stand-containers.d.ts +4 -0
  623. package/dist/project/stand-containers.d.ts.map +1 -0
  624. package/dist/project/stand-containers.js +27 -0
  625. package/dist/project/stand-containers.js.map +1 -0
  626. package/dist/project/working-tree.d.ts +62 -0
  627. package/dist/project/working-tree.d.ts.map +1 -0
  628. package/dist/project/working-tree.js +101 -0
  629. package/dist/project/working-tree.js.map +1 -0
  630. package/dist/release/artifact-store.d.ts +360 -0
  631. package/dist/release/artifact-store.d.ts.map +1 -0
  632. package/dist/release/artifact-store.js +1040 -0
  633. package/dist/release/artifact-store.js.map +1 -0
  634. package/dist/release/attest-on-node.d.ts +92 -0
  635. package/dist/release/attest-on-node.d.ts.map +1 -0
  636. package/dist/release/attest-on-node.js +207 -0
  637. package/dist/release/attest-on-node.js.map +1 -0
  638. package/dist/release/attest.d.ts +135 -0
  639. package/dist/release/attest.d.ts.map +1 -0
  640. package/dist/release/attest.js +199 -0
  641. package/dist/release/attest.js.map +1 -0
  642. package/dist/release/build-run.d.ts +151 -0
  643. package/dist/release/build-run.d.ts.map +1 -0
  644. package/dist/release/build-run.js +609 -0
  645. package/dist/release/build-run.js.map +1 -0
  646. package/dist/release/builder.d.ts +57 -0
  647. package/dist/release/builder.d.ts.map +1 -0
  648. package/dist/release/builder.js +120 -0
  649. package/dist/release/builder.js.map +1 -0
  650. package/dist/release/daemon-omni.d.ts +41 -0
  651. package/dist/release/daemon-omni.d.ts.map +1 -0
  652. package/dist/release/daemon-omni.js +59 -0
  653. package/dist/release/daemon-omni.js.map +1 -0
  654. package/dist/release/definition-inputs.d.ts +34 -0
  655. package/dist/release/definition-inputs.d.ts.map +1 -0
  656. package/dist/release/definition-inputs.js +90 -0
  657. package/dist/release/definition-inputs.js.map +1 -0
  658. package/dist/release/delivered.d.ts +53 -0
  659. package/dist/release/delivered.d.ts.map +1 -0
  660. package/dist/release/delivered.js +81 -0
  661. package/dist/release/delivered.js.map +1 -0
  662. package/dist/release/layout.d.ts +61 -0
  663. package/dist/release/layout.d.ts.map +1 -0
  664. package/dist/release/layout.js +114 -0
  665. package/dist/release/layout.js.map +1 -0
  666. package/dist/release/load.d.ts +44 -0
  667. package/dist/release/load.d.ts.map +1 -0
  668. package/dist/release/load.js +84 -0
  669. package/dist/release/load.js.map +1 -0
  670. package/dist/release/manifest.d.ts +299 -0
  671. package/dist/release/manifest.d.ts.map +1 -0
  672. package/dist/release/manifest.js +176 -0
  673. package/dist/release/manifest.js.map +1 -0
  674. package/dist/release/migrations.d.ts +32 -0
  675. package/dist/release/migrations.d.ts.map +1 -0
  676. package/dist/release/migrations.js +51 -0
  677. package/dist/release/migrations.js.map +1 -0
  678. package/dist/release/publish.d.ts +71 -0
  679. package/dist/release/publish.d.ts.map +1 -0
  680. package/dist/release/publish.js +102 -0
  681. package/dist/release/publish.js.map +1 -0
  682. package/dist/release/store.d.ts +174 -0
  683. package/dist/release/store.d.ts.map +1 -0
  684. package/dist/release/store.js +257 -0
  685. package/dist/release/store.js.map +1 -0
  686. package/dist/services/alert.rpc-service.d.ts +11 -15
  687. package/dist/services/alert.rpc-service.d.ts.map +1 -1
  688. package/dist/services/alert.rpc-service.js +29 -14
  689. package/dist/services/alert.rpc-service.js.map +1 -1
  690. package/dist/services/alert.service.d.ts +96 -59
  691. package/dist/services/alert.service.d.ts.map +1 -1
  692. package/dist/services/alert.service.js +455 -70
  693. package/dist/services/alert.service.js.map +1 -1
  694. package/dist/services/anonymous-input.d.ts +26 -0
  695. package/dist/services/anonymous-input.d.ts.map +1 -0
  696. package/dist/services/anonymous-input.js +44 -0
  697. package/dist/services/anonymous-input.js.map +1 -0
  698. package/dist/services/audit.rpc-service.d.ts +27 -0
  699. package/dist/services/audit.rpc-service.d.ts.map +1 -0
  700. package/dist/services/audit.rpc-service.js +57 -0
  701. package/dist/services/audit.rpc-service.js.map +1 -0
  702. package/dist/services/audit.service.d.ts +165 -0
  703. package/dist/services/audit.service.d.ts.map +1 -0
  704. package/dist/services/audit.service.js +242 -0
  705. package/dist/services/audit.service.js.map +1 -0
  706. package/dist/services/auth-context.d.ts +21 -1
  707. package/dist/services/auth-context.d.ts.map +1 -1
  708. package/dist/services/auth-context.js +51 -5
  709. package/dist/services/auth-context.js.map +1 -1
  710. package/dist/services/auth.rpc-service.d.ts +0 -1
  711. package/dist/services/auth.rpc-service.d.ts.map +1 -1
  712. package/dist/services/auth.rpc-service.js +23 -9
  713. package/dist/services/auth.rpc-service.js.map +1 -1
  714. package/dist/services/auth.service.d.ts +47 -33
  715. package/dist/services/auth.service.d.ts.map +1 -1
  716. package/dist/services/auth.service.js +163 -24
  717. package/dist/services/auth.service.js.map +1 -1
  718. package/dist/services/backup-pipeline.d.ts +97 -0
  719. package/dist/services/backup-pipeline.d.ts.map +1 -0
  720. package/dist/services/backup-pipeline.js +286 -0
  721. package/dist/services/backup-pipeline.js.map +1 -0
  722. package/dist/services/backup-schedule.d.ts +69 -0
  723. package/dist/services/backup-schedule.d.ts.map +1 -0
  724. package/dist/services/backup-schedule.js +132 -0
  725. package/dist/services/backup-schedule.js.map +1 -0
  726. package/dist/services/backup.rpc-service.d.ts +31 -2
  727. package/dist/services/backup.rpc-service.d.ts.map +1 -1
  728. package/dist/services/backup.rpc-service.js +53 -0
  729. package/dist/services/backup.rpc-service.js.map +1 -1
  730. package/dist/services/backup.service.d.ts +458 -14
  731. package/dist/services/backup.service.d.ts.map +1 -1
  732. package/dist/services/backup.service.js +1368 -170
  733. package/dist/services/backup.service.js.map +1 -1
  734. package/dist/services/bundle-build-worker.d.ts +19 -0
  735. package/dist/services/bundle-build-worker.d.ts.map +1 -0
  736. package/dist/services/bundle-build-worker.js +40 -0
  737. package/dist/services/bundle-build-worker.js.map +1 -0
  738. package/dist/services/bundle-builder.d.ts +487 -0
  739. package/dist/services/bundle-builder.d.ts.map +1 -0
  740. package/dist/services/bundle-builder.js +1083 -0
  741. package/dist/services/bundle-builder.js.map +1 -0
  742. package/dist/services/bundle-worker-protocol.d.ts +19 -0
  743. package/dist/services/bundle-worker-protocol.d.ts.map +1 -0
  744. package/dist/services/bundle-worker-protocol.js +32 -0
  745. package/dist/services/bundle-worker-protocol.js.map +1 -0
  746. package/dist/services/deploy.rpc-service.d.ts +4 -1
  747. package/dist/services/deploy.rpc-service.d.ts.map +1 -1
  748. package/dist/services/deploy.rpc-service.js +10 -0
  749. package/dist/services/deploy.rpc-service.js.map +1 -1
  750. package/dist/services/deploy.service.d.ts +14 -24
  751. package/dist/services/deploy.service.d.ts.map +1 -1
  752. package/dist/services/deploy.service.js +46 -5
  753. package/dist/services/deploy.service.js.map +1 -1
  754. package/dist/services/discovery.rpc-service.d.ts +2 -1
  755. package/dist/services/discovery.rpc-service.d.ts.map +1 -1
  756. package/dist/services/discovery.rpc-service.js.map +1 -1
  757. package/dist/services/discovery.service.d.ts +32 -28
  758. package/dist/services/discovery.service.d.ts.map +1 -1
  759. package/dist/services/discovery.service.js +108 -133
  760. package/dist/services/discovery.service.js.map +1 -1
  761. package/dist/services/event-broadcaster.rpc-service.d.ts +36 -23
  762. package/dist/services/event-broadcaster.rpc-service.d.ts.map +1 -1
  763. package/dist/services/event-broadcaster.rpc-service.js +70 -32
  764. package/dist/services/event-broadcaster.rpc-service.js.map +1 -1
  765. package/dist/services/event-broadcaster.service.d.ts.map +1 -1
  766. package/dist/services/event-broadcaster.service.js.map +1 -1
  767. package/dist/services/fleet.rpc-service.d.ts +2 -1
  768. package/dist/services/fleet.rpc-service.d.ts.map +1 -1
  769. package/dist/services/fleet.rpc-service.js +3 -1
  770. package/dist/services/fleet.rpc-service.js.map +1 -1
  771. package/dist/services/fleet.service.d.ts +32 -34
  772. package/dist/services/fleet.service.d.ts.map +1 -1
  773. package/dist/services/fleet.service.js +66 -10
  774. package/dist/services/fleet.service.js.map +1 -1
  775. package/dist/services/health-check.rpc-service.d.ts +2 -1
  776. package/dist/services/health-check.rpc-service.d.ts.map +1 -1
  777. package/dist/services/health-check.rpc-service.js.map +1 -1
  778. package/dist/services/health-check.service.d.ts +50 -36
  779. package/dist/services/health-check.service.d.ts.map +1 -1
  780. package/dist/services/health-check.service.js +179 -182
  781. package/dist/services/health-check.service.js.map +1 -1
  782. package/dist/services/infrastructure.rpc-service.d.ts +297 -2
  783. package/dist/services/infrastructure.rpc-service.d.ts.map +1 -1
  784. package/dist/services/infrastructure.rpc-service.js +523 -11
  785. package/dist/services/infrastructure.rpc-service.js.map +1 -1
  786. package/dist/services/kubernetes.rpc-service.d.ts +2 -1
  787. package/dist/services/kubernetes.rpc-service.d.ts.map +1 -1
  788. package/dist/services/kubernetes.rpc-service.js.map +1 -1
  789. package/dist/services/kubernetes.service.d.ts +5 -39
  790. package/dist/services/kubernetes.service.d.ts.map +1 -1
  791. package/dist/services/kubernetes.service.js +29 -5
  792. package/dist/services/kubernetes.service.js.map +1 -1
  793. package/dist/services/local-bundle.d.ts +151 -0
  794. package/dist/services/local-bundle.d.ts.map +1 -0
  795. package/dist/services/local-bundle.js +233 -0
  796. package/dist/services/local-bundle.js.map +1 -0
  797. package/dist/services/lockout.d.ts +28 -0
  798. package/dist/services/lockout.d.ts.map +1 -0
  799. package/dist/services/lockout.js +41 -0
  800. package/dist/services/lockout.js.map +1 -0
  801. package/dist/services/log-collector.rpc-service.d.ts +16 -0
  802. package/dist/services/log-collector.rpc-service.d.ts.map +1 -1
  803. package/dist/services/log-collector.rpc-service.js +16 -0
  804. package/dist/services/log-collector.rpc-service.js.map +1 -1
  805. package/dist/services/log-collector.service.d.ts +172 -54
  806. package/dist/services/log-collector.service.d.ts.map +1 -1
  807. package/dist/services/log-collector.service.js +492 -102
  808. package/dist/services/log-collector.service.js.map +1 -1
  809. package/dist/services/log-retention.d.ts +50 -0
  810. package/dist/services/log-retention.d.ts.map +1 -0
  811. package/dist/services/log-retention.js +52 -0
  812. package/dist/services/log-retention.js.map +1 -0
  813. package/dist/services/maintenance-lock.d.ts +162 -0
  814. package/dist/services/maintenance-lock.d.ts.map +1 -0
  815. package/dist/services/maintenance-lock.js +316 -0
  816. package/dist/services/maintenance-lock.js.map +1 -0
  817. package/dist/services/master-address.d.ts +107 -0
  818. package/dist/services/master-address.d.ts.map +1 -0
  819. package/dist/services/master-address.js +154 -0
  820. package/dist/services/master-address.js.map +1 -0
  821. package/dist/services/migration-output.d.ts +16 -0
  822. package/dist/services/migration-output.d.ts.map +1 -0
  823. package/dist/services/migration-output.js +22 -0
  824. package/dist/services/migration-output.js.map +1 -0
  825. package/dist/services/netron-telemetry-transport.d.ts.map +1 -1
  826. package/dist/services/netron-telemetry-transport.js +0 -4
  827. package/dist/services/netron-telemetry-transport.js.map +1 -1
  828. package/dist/services/node-deploy-lease.d.ts +154 -0
  829. package/dist/services/node-deploy-lease.d.ts.map +1 -0
  830. package/dist/services/node-deploy-lease.js +386 -0
  831. package/dist/services/node-deploy-lease.js.map +1 -0
  832. package/dist/services/node-health.repository.d.ts +63 -4
  833. package/dist/services/node-health.repository.d.ts.map +1 -1
  834. package/dist/services/node-health.repository.js +108 -67
  835. package/dist/services/node-health.repository.js.map +1 -1
  836. package/dist/services/node-manager.rpc-service.d.ts +355 -10
  837. package/dist/services/node-manager.rpc-service.d.ts.map +1 -1
  838. package/dist/services/node-manager.rpc-service.js +730 -34
  839. package/dist/services/node-manager.rpc-service.js.map +1 -1
  840. package/dist/services/node-manager.service.d.ts +267 -95
  841. package/dist/services/node-manager.service.d.ts.map +1 -1
  842. package/dist/services/node-manager.service.js +806 -104
  843. package/dist/services/node-manager.service.js.map +1 -1
  844. package/dist/services/node-upgrade.d.ts +129 -0
  845. package/dist/services/node-upgrade.d.ts.map +1 -0
  846. package/dist/services/node-upgrade.js +161 -0
  847. package/dist/services/node-upgrade.js.map +1 -0
  848. package/dist/services/node-upgrade.service.d.ts +232 -0
  849. package/dist/services/node-upgrade.service.d.ts.map +1 -0
  850. package/dist/services/node-upgrade.service.js +468 -0
  851. package/dist/services/node-upgrade.service.js.map +1 -0
  852. package/dist/services/pipeline.rpc-service.d.ts +2 -1
  853. package/dist/services/pipeline.rpc-service.d.ts.map +1 -1
  854. package/dist/services/pipeline.rpc-service.js.map +1 -1
  855. package/dist/services/pipeline.service.d.ts +30 -46
  856. package/dist/services/pipeline.service.d.ts.map +1 -1
  857. package/dist/services/pipeline.service.js +125 -11
  858. package/dist/services/pipeline.service.js.map +1 -1
  859. package/dist/services/project.rpc-service.d.ts +137 -5
  860. package/dist/services/project.rpc-service.d.ts.map +1 -1
  861. package/dist/services/project.rpc-service.js +258 -22
  862. package/dist/services/project.rpc-service.js.map +1 -1
  863. package/dist/services/project.service.d.ts +680 -9
  864. package/dist/services/project.service.d.ts.map +1 -1
  865. package/dist/services/project.service.js +2914 -293
  866. package/dist/services/project.service.js.map +1 -1
  867. package/dist/services/redeploy-decision.d.ts +176 -0
  868. package/dist/services/redeploy-decision.d.ts.map +1 -0
  869. package/dist/services/redeploy-decision.js +142 -0
  870. package/dist/services/redeploy-decision.js.map +1 -0
  871. package/dist/services/release.rpc-service.d.ts +159 -0
  872. package/dist/services/release.rpc-service.d.ts.map +1 -0
  873. package/dist/services/release.rpc-service.js +395 -0
  874. package/dist/services/release.rpc-service.js.map +1 -0
  875. package/dist/services/release.service.d.ts +114 -0
  876. package/dist/services/release.service.d.ts.map +1 -0
  877. package/dist/services/release.service.js +208 -0
  878. package/dist/services/release.service.js.map +1 -0
  879. package/dist/services/remote-deployer.service.d.ts +569 -8
  880. package/dist/services/remote-deployer.service.d.ts.map +1 -1
  881. package/dist/services/remote-deployer.service.js +1618 -169
  882. package/dist/services/remote-deployer.service.js.map +1 -1
  883. package/dist/services/remote-ops.service.d.ts +51 -9
  884. package/dist/services/remote-ops.service.d.ts.map +1 -1
  885. package/dist/services/remote-ops.service.js +235 -39
  886. package/dist/services/remote-ops.service.js.map +1 -1
  887. package/dist/services/remote-provisioner.d.ts +122 -0
  888. package/dist/services/remote-provisioner.d.ts.map +1 -0
  889. package/dist/services/remote-provisioner.js +258 -0
  890. package/dist/services/remote-provisioner.js.map +1 -0
  891. package/dist/services/secrets.rpc-service.d.ts +51 -2
  892. package/dist/services/secrets.rpc-service.d.ts.map +1 -1
  893. package/dist/services/secrets.rpc-service.js +81 -2
  894. package/dist/services/secrets.rpc-service.js.map +1 -1
  895. package/dist/services/secrets.service.d.ts +108 -9
  896. package/dist/services/secrets.service.d.ts.map +1 -1
  897. package/dist/services/secrets.service.js +313 -48
  898. package/dist/services/secrets.service.js.map +1 -1
  899. package/dist/services/slave-storage.service.d.ts +107 -0
  900. package/dist/services/slave-storage.service.d.ts.map +1 -1
  901. package/dist/services/slave-storage.service.js +171 -2
  902. package/dist/services/slave-storage.service.js.map +1 -1
  903. package/dist/services/static-carry-forward.d.ts +85 -0
  904. package/dist/services/static-carry-forward.d.ts.map +1 -0
  905. package/dist/services/static-carry-forward.js +159 -0
  906. package/dist/services/static-carry-forward.js.map +1 -0
  907. package/dist/services/sync-policy.d.ts +167 -0
  908. package/dist/services/sync-policy.d.ts.map +1 -0
  909. package/dist/services/sync-policy.js +161 -0
  910. package/dist/services/sync-policy.js.map +1 -0
  911. package/dist/services/sync-summary.d.ts +39 -0
  912. package/dist/services/sync-summary.d.ts.map +1 -0
  913. package/dist/services/sync-summary.js +62 -0
  914. package/dist/services/sync-summary.js.map +1 -0
  915. package/dist/services/sync.rpc-service.d.ts +19 -7
  916. package/dist/services/sync.rpc-service.d.ts.map +1 -1
  917. package/dist/services/sync.rpc-service.js +36 -5
  918. package/dist/services/sync.rpc-service.js.map +1 -1
  919. package/dist/services/sync.service.d.ts +350 -18
  920. package/dist/services/sync.service.d.ts.map +1 -1
  921. package/dist/services/sync.service.js +864 -116
  922. package/dist/services/sync.service.js.map +1 -1
  923. package/dist/services/system-info.rpc-service.d.ts +2 -1
  924. package/dist/services/system-info.rpc-service.d.ts.map +1 -1
  925. package/dist/services/system-info.rpc-service.js.map +1 -1
  926. package/dist/services/system-info.service.d.ts +56 -68
  927. package/dist/services/system-info.service.d.ts.map +1 -1
  928. package/dist/services/system-info.service.js +240 -127
  929. package/dist/services/system-info.service.js.map +1 -1
  930. package/dist/services/telemetry.rpc-service.d.ts.map +1 -1
  931. package/dist/services/telemetry.rpc-service.js +9 -3
  932. package/dist/services/telemetry.rpc-service.js.map +1 -1
  933. package/dist/services/telemetry.service.d.ts +4 -2
  934. package/dist/services/telemetry.service.d.ts.map +1 -1
  935. package/dist/services/telemetry.service.js +4 -2
  936. package/dist/services/telemetry.service.js.map +1 -1
  937. package/dist/services/trace-collector.rpc-service.d.ts +2 -1
  938. package/dist/services/trace-collector.rpc-service.d.ts.map +1 -1
  939. package/dist/services/trace-collector.rpc-service.js.map +1 -1
  940. package/dist/services/trace-collector.service.d.ts +2 -41
  941. package/dist/services/trace-collector.service.d.ts.map +1 -1
  942. package/dist/services/trace-collector.service.js +27 -7
  943. package/dist/services/trace-collector.service.js.map +1 -1
  944. package/dist/services/wait-for-postgres.d.ts +28 -0
  945. package/dist/services/wait-for-postgres.d.ts.map +1 -0
  946. package/dist/services/wait-for-postgres.js +77 -0
  947. package/dist/services/wait-for-postgres.js.map +1 -0
  948. package/dist/shared/alert-expression.d.ts +60 -0
  949. package/dist/shared/alert-expression.d.ts.map +1 -0
  950. package/dist/shared/alert-expression.js +124 -0
  951. package/dist/shared/alert-expression.js.map +1 -0
  952. package/dist/shared/audit-outcome.d.ts +39 -0
  953. package/dist/shared/audit-outcome.d.ts.map +1 -0
  954. package/dist/shared/audit-outcome.js +45 -0
  955. package/dist/shared/audit-outcome.js.map +1 -0
  956. package/dist/shared/build-freshness.d.ts +59 -0
  957. package/dist/shared/build-freshness.d.ts.map +1 -0
  958. package/dist/shared/build-freshness.js +113 -0
  959. package/dist/shared/build-freshness.js.map +1 -0
  960. package/dist/shared/build-stamp.d.ts +26 -0
  961. package/dist/shared/build-stamp.d.ts.map +1 -0
  962. package/dist/shared/build-stamp.js +36 -0
  963. package/dist/shared/build-stamp.js.map +1 -0
  964. package/dist/shared/describe-error.d.ts +22 -0
  965. package/dist/shared/describe-error.d.ts.map +1 -0
  966. package/dist/shared/describe-error.js +39 -0
  967. package/dist/shared/describe-error.js.map +1 -0
  968. package/dist/shared/dto/alerts.d.ts +101 -0
  969. package/dist/shared/dto/alerts.d.ts.map +1 -0
  970. package/dist/shared/dto/alerts.js +9 -0
  971. package/dist/shared/dto/alerts.js.map +1 -0
  972. package/dist/shared/dto/auth.d.ts +49 -0
  973. package/dist/shared/dto/auth.d.ts.map +1 -0
  974. package/dist/shared/dto/auth.js +14 -0
  975. package/dist/shared/dto/auth.js.map +1 -0
  976. package/dist/shared/dto/backups.d.ts +16 -0
  977. package/dist/shared/dto/backups.d.ts.map +1 -0
  978. package/dist/shared/dto/backups.js +9 -0
  979. package/dist/shared/dto/backups.js.map +1 -0
  980. package/dist/shared/dto/deploy.d.ts +28 -0
  981. package/dist/shared/dto/deploy.d.ts.map +1 -0
  982. package/dist/shared/dto/deploy.js +8 -0
  983. package/dist/shared/dto/deploy.js.map +1 -0
  984. package/dist/shared/dto/discovery.d.ts +24 -0
  985. package/dist/shared/dto/discovery.d.ts.map +1 -0
  986. package/dist/shared/dto/discovery.js +9 -0
  987. package/dist/shared/dto/discovery.js.map +1 -0
  988. package/dist/shared/dto/fleet.d.ts +35 -0
  989. package/dist/shared/dto/fleet.d.ts.map +1 -0
  990. package/dist/shared/dto/fleet.js +8 -0
  991. package/dist/shared/dto/fleet.js.map +1 -0
  992. package/dist/shared/dto/health.d.ts +26 -0
  993. package/dist/shared/dto/health.d.ts.map +1 -0
  994. package/dist/shared/dto/health.js +9 -0
  995. package/dist/shared/dto/health.js.map +1 -0
  996. package/dist/shared/dto/kubernetes.d.ts +44 -0
  997. package/dist/shared/dto/kubernetes.d.ts.map +1 -0
  998. package/dist/shared/dto/kubernetes.js +9 -0
  999. package/dist/shared/dto/kubernetes.js.map +1 -0
  1000. package/dist/shared/dto/logs.d.ts +77 -0
  1001. package/dist/shared/dto/logs.d.ts.map +1 -0
  1002. package/dist/shared/dto/logs.js +10 -0
  1003. package/dist/shared/dto/logs.js.map +1 -0
  1004. package/dist/shared/dto/metrics.d.ts +65 -0
  1005. package/dist/shared/dto/metrics.d.ts.map +1 -0
  1006. package/dist/shared/dto/metrics.js +17 -0
  1007. package/dist/shared/dto/metrics.js.map +1 -0
  1008. package/dist/shared/dto/nodes.d.ts +347 -0
  1009. package/dist/shared/dto/nodes.d.ts.map +1 -0
  1010. package/dist/shared/dto/nodes.js +8 -0
  1011. package/dist/shared/dto/nodes.js.map +1 -0
  1012. package/dist/shared/dto/pipelines.d.ts +53 -0
  1013. package/dist/shared/dto/pipelines.d.ts.map +1 -0
  1014. package/dist/shared/dto/pipelines.js +9 -0
  1015. package/dist/shared/dto/pipelines.js.map +1 -0
  1016. package/dist/shared/dto/project.d.ts +143 -9
  1017. package/dist/shared/dto/project.d.ts.map +1 -1
  1018. package/dist/shared/dto/services.d.ts +855 -7
  1019. package/dist/shared/dto/services.d.ts.map +1 -1
  1020. package/dist/shared/dto/system-info.d.ts +93 -0
  1021. package/dist/shared/dto/system-info.d.ts.map +1 -0
  1022. package/dist/shared/dto/system-info.js +9 -0
  1023. package/dist/shared/dto/system-info.js.map +1 -0
  1024. package/dist/shared/dto/traces.d.ts +49 -0
  1025. package/dist/shared/dto/traces.d.ts.map +1 -0
  1026. package/dist/shared/dto/traces.js +9 -0
  1027. package/dist/shared/dto/traces.js.map +1 -0
  1028. package/dist/shared/env-config.d.ts +74 -0
  1029. package/dist/shared/env-config.d.ts.map +1 -0
  1030. package/dist/shared/env-config.js +99 -0
  1031. package/dist/shared/env-config.js.map +1 -0
  1032. package/dist/shared/events.d.ts +45 -39
  1033. package/dist/shared/events.d.ts.map +1 -1
  1034. package/dist/shared/events.js +6 -0
  1035. package/dist/shared/events.js.map +1 -1
  1036. package/dist/shared/format.d.ts +1 -1
  1037. package/dist/shared/format.d.ts.map +1 -1
  1038. package/dist/shared/format.js +4 -0
  1039. package/dist/shared/format.js.map +1 -1
  1040. package/dist/shared/local-infra-host.d.ts +28 -0
  1041. package/dist/shared/local-infra-host.d.ts.map +1 -0
  1042. package/dist/shared/local-infra-host.js +28 -0
  1043. package/dist/shared/local-infra-host.js.map +1 -0
  1044. package/dist/shared/node-check.d.ts +37 -0
  1045. package/dist/shared/node-check.d.ts.map +1 -0
  1046. package/dist/shared/node-check.js +41 -0
  1047. package/dist/shared/node-check.js.map +1 -0
  1048. package/dist/shared/paths.d.ts +29 -0
  1049. package/dist/shared/paths.d.ts.map +1 -0
  1050. package/dist/shared/paths.js +54 -0
  1051. package/dist/shared/paths.js.map +1 -0
  1052. package/dist/shared/pnpm.d.ts +29 -0
  1053. package/dist/shared/pnpm.d.ts.map +1 -0
  1054. package/dist/shared/pnpm.js +57 -0
  1055. package/dist/shared/pnpm.js.map +1 -0
  1056. package/dist/shared/private-files.d.ts +29 -0
  1057. package/dist/shared/private-files.d.ts.map +1 -0
  1058. package/dist/shared/private-files.js +109 -0
  1059. package/dist/shared/private-files.js.map +1 -0
  1060. package/dist/shared/redact-env.d.ts +24 -0
  1061. package/dist/shared/redact-env.d.ts.map +1 -0
  1062. package/dist/shared/redact-env.js +36 -0
  1063. package/dist/shared/redact-env.js.map +1 -0
  1064. package/dist/shared/release-reading.d.ts +85 -0
  1065. package/dist/shared/release-reading.d.ts.map +1 -0
  1066. package/dist/shared/release-reading.js +81 -0
  1067. package/dist/shared/release-reading.js.map +1 -0
  1068. package/dist/shared/roles.d.ts +58 -3
  1069. package/dist/shared/roles.d.ts.map +1 -1
  1070. package/dist/shared/roles.js +55 -0
  1071. package/dist/shared/roles.js.map +1 -1
  1072. package/dist/shared/rpcauth.d.ts +13 -0
  1073. package/dist/shared/rpcauth.d.ts.map +1 -0
  1074. package/dist/shared/rpcauth.js +23 -0
  1075. package/dist/shared/rpcauth.js.map +1 -0
  1076. package/dist/shared/shell-escape.d.ts +9 -0
  1077. package/dist/shared/shell-escape.d.ts.map +1 -0
  1078. package/dist/shared/shell-escape.js +11 -0
  1079. package/dist/shared/shell-escape.js.map +1 -0
  1080. package/dist/shared/sync-reading.d.ts +45 -0
  1081. package/dist/shared/sync-reading.d.ts.map +1 -0
  1082. package/dist/shared/sync-reading.js +42 -0
  1083. package/dist/shared/sync-reading.js.map +1 -0
  1084. package/dist/shared/tokens.d.ts +19 -0
  1085. package/dist/shared/tokens.d.ts.map +1 -1
  1086. package/dist/shared/tokens.js +28 -0
  1087. package/dist/shared/tokens.js.map +1 -1
  1088. package/dist/webapp/webapp.service.d.ts +33 -2
  1089. package/dist/webapp/webapp.service.d.ts.map +1 -1
  1090. package/dist/webapp/webapp.service.js +143 -31
  1091. package/dist/webapp/webapp.service.js.map +1 -1
  1092. package/dist/workers/health-monitor-process.d.ts.map +1 -1
  1093. package/dist/workers/health-monitor-process.js +10 -0
  1094. package/dist/workers/health-monitor-process.js.map +1 -1
  1095. package/dist/workers/health-monitor.service.d.ts +45 -3
  1096. package/dist/workers/health-monitor.service.d.ts.map +1 -1
  1097. package/dist/workers/health-monitor.service.js +156 -26
  1098. package/dist/workers/health-monitor.service.js.map +1 -1
  1099. package/dist/workers/system-worker-manager.d.ts +43 -0
  1100. package/dist/workers/system-worker-manager.d.ts.map +1 -1
  1101. package/dist/workers/system-worker-manager.js +150 -3
  1102. package/dist/workers/system-worker-manager.js.map +1 -1
  1103. package/dist/workers/types.d.ts +11 -2
  1104. package/dist/workers/types.d.ts.map +1 -1
  1105. package/package.json +64 -29
  1106. package/webapp/dist/BUILD.json +5 -0
  1107. package/webapp/dist/assets/FormControlLabel-BrH2diyl.js +1 -0
  1108. package/webapp/dist/assets/Grid-BZ7xhoHQ.js +1 -0
  1109. package/webapp/dist/assets/Switch-DGSAxQPM.js +1 -0
  1110. package/webapp/dist/assets/alerts-sXqHJbsa.js +1 -0
  1111. package/webapp/dist/assets/apps-B_Ah8Flh.js +1 -0
  1112. package/webapp/dist/assets/audit-YXihwyui.js +1 -0
  1113. package/webapp/dist/assets/client-CGbBvy9k.js +1 -0
  1114. package/webapp/dist/assets/constants-veKGFkC6.js +1 -0
  1115. package/webapp/dist/assets/containers-Di4NOTLf.js +2 -0
  1116. package/webapp/dist/assets/daemon-memory-CCPZ4cV_.js +1 -0
  1117. package/webapp/dist/assets/dashboard-Cfuf95N3.js +1 -0
  1118. package/webapp/dist/assets/dashboard-builder-CowaYb-M.js +1 -0
  1119. package/webapp/dist/assets/deploy-release-dialog-D6C-XcKY.js +1 -0
  1120. package/webapp/dist/assets/deployments-ChTq5kCw.js +1 -0
  1121. package/webapp/dist/assets/detail-BsGWv7Dj.js +1 -0
  1122. package/webapp/dist/assets/detail-CyVf_cw5.js +2 -0
  1123. package/webapp/dist/assets/detail-D027j6aO.js +8 -0
  1124. package/webapp/dist/assets/formatters-BqjL73N3.js +1 -0
  1125. package/webapp/dist/assets/index-B8AHIPc-.css +1 -0
  1126. package/webapp/dist/assets/index-DiZbrwxT.js +414 -0
  1127. package/webapp/dist/assets/logs-L2b8Oqmo.js +12 -0
  1128. package/webapp/dist/assets/maplibre-gl-MlmG2kbn.js +801 -0
  1129. package/webapp/dist/assets/metrics-CQgjz2Lz.js +2 -0
  1130. package/webapp/dist/assets/nodes-Nwia2Ty6.js +7 -0
  1131. package/webapp/dist/assets/pipelines-DCu_rXOr.js +4 -0
  1132. package/webapp/dist/assets/projects-Bb4aV76h.js +1 -0
  1133. package/webapp/dist/assets/react-CwJFpaho.js +1 -0
  1134. package/webapp/dist/assets/react-apexcharts.esm-Dy0Fez42.js +1956 -0
  1135. package/webapp/dist/assets/release-bits-Dj4EOhhb.js +1 -0
  1136. package/webapp/dist/assets/release-build-panel-D6OCVlhT.js +1 -0
  1137. package/webapp/dist/assets/releases-CnAt3yO6.js +2 -0
  1138. package/webapp/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
  1139. package/webapp/dist/assets/settings-DU-mjiwb.js +1 -0
  1140. package/webapp/dist/assets/settled-pair-C7SjZuns.js +1 -0
  1141. package/webapp/dist/assets/sign-in-Bcvjrr4C.js +1 -0
  1142. package/webapp/dist/assets/stacks-B-e8p50I.js +1 -0
  1143. package/webapp/dist/assets/sync-reading-C3PnJ7AX.js +1 -0
  1144. package/webapp/dist/assets/system-info-BtE3dgfw.js +1 -0
  1145. package/webapp/dist/assets/topology-Cwch-uF1.js +12 -0
  1146. package/webapp/dist/assets/topology-DLioOiRN.css +1 -0
  1147. package/webapp/dist/assets/traces-BbShR-4P.js +1 -0
  1148. package/webapp/dist/assets/use-stack-context-CZUgPq88.js +1 -0
  1149. package/webapp/dist/index.html +6 -7
  1150. package/dist/commands/dev.d.ts +0 -23
  1151. package/dist/commands/dev.d.ts.map +0 -1
  1152. package/dist/commands/dev.js +0 -76
  1153. package/dist/commands/dev.js.map +0 -1
  1154. package/dist/config/define-app.d.ts +0 -6
  1155. package/dist/config/define-app.d.ts.map +0 -1
  1156. package/dist/config/define-app.js +0 -38
  1157. package/dist/config/define-app.js.map +0 -1
  1158. package/dist/infrastructure/gateway-generator.d.ts +0 -63
  1159. package/dist/infrastructure/gateway-generator.d.ts.map +0 -1
  1160. package/dist/infrastructure/gateway-generator.js +0 -253
  1161. package/dist/infrastructure/gateway-generator.js.map +0 -1
  1162. package/dist/monitoring/health.service.d.ts +0 -14
  1163. package/dist/monitoring/health.service.d.ts.map +0 -1
  1164. package/dist/monitoring/health.service.js +0 -50
  1165. package/dist/monitoring/health.service.js.map +0 -1
  1166. package/dist/monitoring/metrics.service.d.ts +0 -14
  1167. package/dist/monitoring/metrics.service.d.ts.map +0 -1
  1168. package/dist/monitoring/metrics.service.js +0 -40
  1169. package/dist/monitoring/metrics.service.js.map +0 -1
  1170. package/dist/orchestrator/bootstrap-runner.d.ts +0 -15
  1171. package/dist/orchestrator/bootstrap-runner.d.ts.map +0 -1
  1172. package/dist/orchestrator/bootstrap-runner.js +0 -152
  1173. package/dist/orchestrator/bootstrap-runner.js.map +0 -1
  1174. package/dist/orchestrator/topology-proxy.d.ts +0 -65
  1175. package/dist/orchestrator/topology-proxy.d.ts.map +0 -1
  1176. package/dist/orchestrator/topology-proxy.js +0 -209
  1177. package/dist/orchestrator/topology-proxy.js.map +0 -1
  1178. package/dist/orchestrator/topology-relay.d.ts +0 -111
  1179. package/dist/orchestrator/topology-relay.d.ts.map +0 -1
  1180. package/dist/orchestrator/topology-relay.js +0 -255
  1181. package/dist/orchestrator/topology-relay.js.map +0 -1
  1182. package/dist/services/auth-middleware.d.ts +0 -47
  1183. package/dist/services/auth-middleware.d.ts.map +0 -1
  1184. package/dist/services/auth-middleware.js +0 -158
  1185. package/dist/services/auth-middleware.js.map +0 -1
  1186. package/dist/services/environment.rpc-service.d.ts +0 -22
  1187. package/dist/services/environment.rpc-service.d.ts.map +0 -1
  1188. package/dist/services/environment.rpc-service.js +0 -65
  1189. package/dist/services/environment.rpc-service.js.map +0 -1
  1190. package/dist/services/environment.service.d.ts +0 -87
  1191. package/dist/services/environment.service.d.ts.map +0 -1
  1192. package/dist/services/environment.service.js +0 -220
  1193. package/dist/services/environment.service.js.map +0 -1
  1194. package/dist/services/metrics-collector.service.d.ts +0 -103
  1195. package/dist/services/metrics-collector.service.d.ts.map +0 -1
  1196. package/dist/services/metrics-collector.service.js +0 -235
  1197. package/dist/services/metrics-collector.service.js.map +0 -1
  1198. package/dist/services/metrics.rpc-service.d.ts +0 -41
  1199. package/dist/services/metrics.rpc-service.d.ts.map +0 -1
  1200. package/dist/services/metrics.rpc-service.js +0 -90
  1201. package/dist/services/metrics.rpc-service.js.map +0 -1
  1202. package/dist/services/metrics.service.d.ts +0 -72
  1203. package/dist/services/metrics.service.d.ts.map +0 -1
  1204. package/dist/services/metrics.service.js +0 -185
  1205. package/dist/services/metrics.service.js.map +0 -1
  1206. package/dist/supervisor/omnitron-supervisor.d.ts +0 -21
  1207. package/dist/supervisor/omnitron-supervisor.d.ts.map +0 -1
  1208. package/dist/supervisor/omnitron-supervisor.js +0 -43
  1209. package/dist/supervisor/omnitron-supervisor.js.map +0 -1
  1210. package/dist/webapp/static-server.d.ts +0 -24
  1211. package/dist/webapp/static-server.d.ts.map +0 -1
  1212. package/dist/webapp/static-server.js +0 -152
  1213. package/dist/webapp/static-server.js.map +0 -1
  1214. package/webapp/dist/assets/Chip-BySxTjyN.js +0 -1
  1215. package/webapp/dist/assets/DialogContentText-YQWiAVrU.js +0 -1
  1216. package/webapp/dist/assets/DialogTitle-CDkgUIwp.js +0 -1
  1217. package/webapp/dist/assets/FormControlLabel-Bu3CCsBM.js +0 -1
  1218. package/webapp/dist/assets/Grid-BFY8hAzL.js +0 -1
  1219. package/webapp/dist/assets/InputAdornment-_Dayk-3y.js +0 -3
  1220. package/webapp/dist/assets/Skeleton-BGj6Sw8m.js +0 -37
  1221. package/webapp/dist/assets/Switch-CA6682vv.js +0 -1
  1222. package/webapp/dist/assets/TableContainer-4epq10KJ.js +0 -1
  1223. package/webapp/dist/assets/TextField-C73KHMVN.js +0 -1
  1224. package/webapp/dist/assets/alerts-JEQALS7Y.js +0 -1
  1225. package/webapp/dist/assets/apps-DMPysEKB.js +0 -1
  1226. package/webapp/dist/assets/client-DlGPter5.js +0 -110
  1227. package/webapp/dist/assets/constants-DqFQJ27U.js +0 -1
  1228. package/webapp/dist/assets/containers-CvkC7do8.js +0 -1
  1229. package/webapp/dist/assets/dashboard-C0Fre9pC.js +0 -1
  1230. package/webapp/dist/assets/dashboard-builder-DAghqdpE.js +0 -1
  1231. package/webapp/dist/assets/deployments-Cg1lI1uT.js +0 -1
  1232. package/webapp/dist/assets/detail-CyFtEson.js +0 -1
  1233. package/webapp/dist/assets/detail-DqoSGKT1.js +0 -8
  1234. package/webapp/dist/assets/formatters-J3Xqn6BQ.js +0 -1
  1235. package/webapp/dist/assets/icons-ynIWYfBP.js +0 -3
  1236. package/webapp/dist/assets/index-CHVXOsTS.css +0 -1
  1237. package/webapp/dist/assets/index-vKrDmEA_.js +0 -259
  1238. package/webapp/dist/assets/isMuiElement-BRL3YuCT.js +0 -1
  1239. package/webapp/dist/assets/logs-IovIij1C.js +0 -11
  1240. package/webapp/dist/assets/metrics-Dufwtwjq.js +0 -1
  1241. package/webapp/dist/assets/nodes-Brvu8W3j.js +0 -7
  1242. package/webapp/dist/assets/pipelines-t40X4MuC.js +0 -4
  1243. package/webapp/dist/assets/prop-types-CvVtHxp4.js +0 -1
  1244. package/webapp/dist/assets/react-apexcharts.esm-CLO6gala.js +0 -954
  1245. package/webapp/dist/assets/settings-DTAIST3v.js +0 -1
  1246. package/webapp/dist/assets/sign-in-DQEAkJum.js +0 -1
  1247. package/webapp/dist/assets/stacks-BjM1f45N.js +0 -1
  1248. package/webapp/dist/assets/system-info-BQSbSEK-.js +0 -1
  1249. package/webapp/dist/assets/topology-6N8-Az_Z.js +0 -12
  1250. package/webapp/dist/assets/topology-CHpVij2M.css +0 -1
  1251. package/webapp/dist/assets/traces-DVXyb-4m.js +0 -1
  1252. package/webapp/dist/assets/use-stack-context-CbE8fxBA.js +0 -1
  1253. /package/webapp/dist/assets/{fs-uP8eiZAR.js → fs-Ccl3sAcp.js} +0 -0
@@ -15,39 +15,178 @@
15
15
  * ResolvedContainer[] → ContainerRuntime → Docker CLI
16
16
  * Health Loop → detect failure → auto-restart (exponential backoff)
17
17
  */
18
- import { resolveInfrastructure, resolveOmnitronPg } from './service-resolver.js';
19
- import { isDockerAvailable, getContainerState, createContainer, startContainer, removeContainer, ensureImage, waitForHealthy, createVolume, } from './container-runtime.js';
18
+ import { computeBackoff } from '@omnitron-dev/titan/utils';
19
+ import { resolveInfrastructure, resolveOmnitronPg, getManagedNetwork } from './service-resolver.js';
20
+ import { PhantomEndpointJanitor } from './phantom-endpoint-janitor.js';
21
+ import { LOCAL_INFRA_HOST } from '../shared/local-infra-host.js';
22
+ import { isDockerAvailable, getContainerState, createContainer, startContainer, removeContainer, ensureImage, waitForHealthy, createVolume, containerSpecHash, } from './container-runtime.js';
23
+ import { summariseProvisioning, describeProvisioning } from './provisioning-outcome.js';
24
+ import { OMNITRON_PG_PORT, OMNITRON_PG_USER, OMNITRON_PG_PASSWORD, OMNITRON_PG_DATABASE, } from '../database/connection.js';
20
25
  const RECONCILE_INTERVAL = 30_000; // 30s health sweep
21
26
  const STARTUP_TIMEOUT = 120_000; // 2min max per service
22
- /** Omnitron internal PG connection defaults */
23
- const OMNITRON_PG_PORT = 5480;
24
- const OMNITRON_PG_USER = 'omnitron';
25
- const OMNITRON_PG_PASSWORD = 'omnitron';
26
- const OMNITRON_PG_DATABASE = 'omnitron';
27
+ /** Consecutive 'unhealthy' ticks before recreate. 2 ticks @ 30s = 60s grace. */
28
+ const UNHEALTHY_RESTART_THRESHOLD = 2;
29
+ /** Restart circuit-breaker: first failed-restart backoff, doubled each failure. */
30
+ const RESTART_BACKOFF_BASE = 30_000; // 30s
31
+ /** Restart circuit-breaker: backoff ceiling (30s → 1m → 2m … capped here). */
32
+ const RESTART_BACKOFF_MAX = 15 * 60_000; // 15min
33
+ /**
34
+ * Restart-circuit-breaker backoff schedule: the delay (ms) to wait before the
35
+ * next restart attempt after `failures` consecutive failed (re)creates.
36
+ * Exponential from RESTART_BACKOFF_BASE, capped at RESTART_BACKOFF_MAX so a
37
+ * permanently-broken service settles into an occasional retry instead of
38
+ * hammering the supervisor every 30s.
39
+ *
40
+ * Delegates to the shared titan `computeBackoff` (the same helper the downstream
41
+ * backends and the titan packages use) so the exponential shape lives in ONE
42
+ * place. Exported for tests.
43
+ */
44
+ export function restartBackoffMs(failures) {
45
+ if (failures < 1)
46
+ return 0;
47
+ return computeBackoff({ attempt: failures - 1, baseMs: RESTART_BACKOFF_BASE, maxMs: RESTART_BACKOFF_MAX });
48
+ }
49
+ // Omnitron internal PG connection defaults live in `database/connection.ts`
50
+ // so the container spec below and every client that connects to it are
51
+ // derived from the same values (see the import above).
52
+ /**
53
+ * What to do about the control plane's own database.
54
+ *
55
+ * Three cases that look alike and are not:
56
+ *
57
+ * - a node's daemon keeps its state in SQLite and needs no database at all;
58
+ * - one is running, so it gets the same reconcile — and so the same
59
+ * `containerSpecHash` drift check — as every app service;
60
+ * - nothing is running, so provision.
61
+ *
62
+ * The middle case is the one that was missing. "Already running" was read as
63
+ * "configured as declared", and the database was adopted exactly as it stood.
64
+ * Measured: `omnitron-pg`, created before published ports were bound to
65
+ * loopback, survived on 0.0.0.0:5480 through the fix that reached all eleven
66
+ * other managed containers, and still answered `nc -vz <lan-address> 5480`
67
+ * from another machine months later, while `daos-dev-postgres` beside it in
68
+ * `docker ps` was correctly on 127.0.0.1.
69
+ *
70
+ * `reconcileName` is the subtlety. The control-plane database is ONE
71
+ * container per host — it owns port 5480 — but each daemon resolves a name
72
+ * carrying its own project prefix, so a daemon on the `daos/dev` stack
73
+ * computes `daos-dev-pg` while the container that exists is `omnitron-pg`.
74
+ * Reconciling the running container against a spec under the OTHER name
75
+ * creates a second one and collides on the port; the first version of this
76
+ * did exactly that and corrected nothing. The name to reconcile is therefore
77
+ * the name of the container that is actually there, and the spec is
78
+ * everything else. `containerSpecHash` does not cover the name, so the drift
79
+ * comparison is unaffected either way.
80
+ *
81
+ * A differing name is not evidence of another owner: only omnitron creates
82
+ * this container, and it carries omnitron's own `omnitron.internal` label.
83
+ */
84
+ export function decideControlPlaneDatabase(input) {
85
+ if (!input.needsControlPlaneDatabase)
86
+ return { action: 'skip' };
87
+ if (input.running?.status !== 'running')
88
+ return { action: 'provision' };
89
+ return { action: 'reconcile', reconcileName: input.running.name ?? input.desiredName };
90
+ }
27
91
  export class InfrastructureService {
28
92
  logger;
29
93
  config;
30
94
  presetRegistry;
95
+ serviceOverrides;
96
+ needsControlPlaneDatabase;
31
97
  desiredContainers = [];
98
+ /** What the most recent reconcile did to each service. */
99
+ lastActions = new Map();
32
100
  omnitronPgContainer;
33
101
  usingGlobalOmnitronPg = false;
34
102
  healthTimer = null;
35
103
  state = { services: {}, ready: false };
36
104
  normalizedServices;
37
- constructor(logger, config, normalizedServices, presetRegistry) {
105
+ /**
106
+ * Per-service consecutive-unhealthy counter. Restart only fires after
107
+ * UNHEALTHY_RESTART_THRESHOLD ticks in a row to avoid flapping during
108
+ * cold-start / transient health-check timeouts. Reset to 0 on a healthy
109
+ * observation. Without this, a service that briefly fails one health
110
+ * probe (network blip, slow query) would be torn down and recreated,
111
+ * making transient pressure look like outages.
112
+ */
113
+ unhealthyTicks = new Map();
114
+ /**
115
+ * Per-service restart circuit-breaker. A container whose (re)create keeps
116
+ * failing — an image that won't pull, or infra stuck on an unrecoverable
117
+ * error — must NOT be retried every 30s forever: that churn (docker calls +
118
+ * error logging) is what wedged the daemon's event loop and let an external
119
+ * "socket unreachable → SIGTERM" kill the whole daemon during the 2026-05
120
+ * outage. After each failed restart we back off exponentially (30s → 1m →
121
+ * 2m … capped at 15m); a successful restart or an externally-recovered
122
+ * 'running' observation resets it.
123
+ */
124
+ restartBackoff = new Map();
125
+ /**
126
+ * T#75: phantom-endpoint janitor instance. Created in `provision()`
127
+ * once we know Docker is reachable; torn down in `teardown()`.
128
+ */
129
+ phantomJanitor = null;
130
+ constructor(logger, config, normalizedServices, presetRegistry,
131
+ /**
132
+ * Stack overrides. A service marked `disabled` here is not provisioned,
133
+ * and one pointed at an `external` address is not provisioned either —
134
+ * there is nothing to create, and the address reaches the application
135
+ * through its environment instead.
136
+ */
137
+ serviceOverrides,
138
+ /**
139
+ * Whether this daemon stores its own state in Postgres.
140
+ *
141
+ * True for a master, which is where projects, nodes, metrics and logs
142
+ * live. False for a node: its daemon keeps that in SQLite and reads a
143
+ * Postgres never.
144
+ */
145
+ needsControlPlaneDatabase = true) {
38
146
  this.logger = logger;
39
147
  this.config = config;
40
148
  this.presetRegistry = presetRegistry;
149
+ this.serviceOverrides = serviceOverrides;
150
+ this.needsControlPlaneDatabase = needsControlPlaneDatabase;
41
151
  this.normalizedServices = normalizedServices ?? {};
42
- this.desiredContainers = resolveInfrastructure(config, normalizedServices);
152
+ this.desiredContainers = resolveInfrastructure(config, normalizedServices, serviceOverrides);
43
153
  this.omnitronPgContainer = resolveOmnitronPg();
44
154
  }
45
155
  /**
46
156
  * Add app-declared infrastructure containers to the provisioning list.
47
157
  * Called by StackInfrastructureManager after resolving app requirements.
158
+ *
159
+ * T#76: dedupe by container name. The `${CONTAINER_PREFIX}-${service}`
160
+ * naming convention means two apps that BOTH declare a `postgres`
161
+ * requirement produce two identical-named entries. Pre-T#76, the
162
+ * provisioning loop tried to create the container twice; Docker's
163
+ * name-uniqueness check failed the second create with "name already
164
+ * in use", leaving the second app's perspective on infrastructure
165
+ * broken (it saw a failure that, from the cluster's view, was a
166
+ * benign collision — the shared service was actually fine).
167
+ *
168
+ * The intended semantics for shared infrastructure is "all apps that
169
+ * declare `postgres` use the same container", so the first
170
+ * declaration wins. When subsequent declarations differ in shape
171
+ * (image / env / ports), log a structured warning so the operator
172
+ * can reconcile intent vs. config.
48
173
  */
49
174
  addAppContainers(containers) {
50
- this.desiredContainers.push(...containers);
175
+ for (const c of containers) {
176
+ const existing = this.desiredContainers.find((d) => d.name === c.name);
177
+ if (!existing) {
178
+ this.desiredContainers.push(c);
179
+ continue;
180
+ }
181
+ if (!shallowContainerEqual(existing, c)) {
182
+ this.logger.warn({
183
+ container: c.name,
184
+ existingImage: existing.image,
185
+ duplicateImage: c.image,
186
+ }, 'Duplicate container declaration with differing shape — keeping first; check for conflicting app infrastructure requirements (T#76)');
187
+ }
188
+ // else: identical declaration, silent dedupe — this is the common case
189
+ }
51
190
  }
52
191
  /**
53
192
  * Provision all infrastructure services.
@@ -65,26 +204,52 @@ export class InfrastructureService {
65
204
  // The stack-prefixed container (e.g. omni-dev-pg) shares the same port,
66
205
  // so we must not create/start it when the global one is active.
67
206
  const globalOmnitronPg = await getContainerState('omnitron-pg');
68
- const stackPgName = this.omnitronPgContainer.name;
69
- const isGlobalPgRunning = globalOmnitronPg?.status === 'running';
70
- const isStackPgSameAsGlobal = stackPgName === 'omnitron-pg';
71
- if (isGlobalPgRunning && !isStackPgSameAsGlobal) {
72
- // Global omnitron-pg already owns port 5480 — reuse it and skip stack-prefixed container.
207
+ const decision = decideControlPlaneDatabase({
208
+ needsControlPlaneDatabase: this.needsControlPlaneDatabase,
209
+ running: globalOmnitronPg,
210
+ desiredName: this.omnitronPgContainer.name,
211
+ });
212
+ if (decision.action === 'skip') {
213
+ // A node's daemon keeps its own state in SQLite — `SlaveStorageService`,
214
+ // `~/.omnitron/data/slave.db` — and reads this database never. Creating
215
+ // it anyway gave every provisioned node a Postgres nobody queries, on
216
+ // default credentials, and until published ports were bound to
217
+ // loopback it was reachable from the internet: measured answering on
218
+ // 0.0.0.0:5480 on a host whose firewall allows only SSH.
219
+ //
220
+ // The control plane's database belongs to the control plane.
221
+ this.logger.debug('This daemon keeps its own state in SQLite — not provisioning a control-plane database');
222
+ }
223
+ else if (decision.action === 'reconcile') {
73
224
  this.usingGlobalOmnitronPg = true;
74
- this.logger.info({ global: 'omnitron-pg', stackPg: stackPgName }, 'Using existing omnitron-pg (already running) — skipping stack-prefixed PG');
75
- // Remove stale stack-prefixed container if it exists (leftover from a previous attempt)
76
- const stalePg = await getContainerState(stackPgName);
77
- if (stalePg) {
78
- try {
79
- await removeContainer(stackPgName);
80
- this.logger.info({ service: stackPgName }, 'Removed stale stack-prefixed PG container');
225
+ // A stack-prefixed leftover cannot run beside the global one — they
226
+ // share port 5480 — so it goes before anything else touches that port.
227
+ if (this.omnitronPgContainer.name !== decision.reconcileName) {
228
+ const stalePg = await getContainerState(this.omnitronPgContainer.name);
229
+ if (stalePg) {
230
+ try {
231
+ await removeContainer(this.omnitronPgContainer.name);
232
+ this.logger.info({ service: this.omnitronPgContainer.name }, 'Removed stale stack-prefixed PG container');
233
+ }
234
+ catch { /* already gone */ }
81
235
  }
82
- catch { /* already gone */ }
83
236
  }
84
- }
85
- else if (isGlobalPgRunning) {
86
- this.usingGlobalOmnitronPg = true;
87
- this.logger.info('Using existing omnitron-pg (already running)');
237
+ // The same reconcile, and so the same drift check, as every app
238
+ // service — under the name the container actually has. Its data lives
239
+ // in the `omnitron-pg-data` volume and outlives the container it is
240
+ // recreated into.
241
+ // Name AND volume, not one of them. `resolveOmnitronPg` derives both
242
+ // from the container prefix, so overriding only the name produced a
243
+ // container called `omnitron-pg` mounting `daos-dev-pg-data` — the
244
+ // global identity on a stack-scoped volume, and the stack's own
245
+ // `omnitron-pg-data` left dangling where a `docker volume prune` would
246
+ // take it silently. The two names are one decision and must move
247
+ // together.
248
+ const reconciled = { ...this.omnitronPgContainer, name: decision.reconcileName };
249
+ if (decision.reconcileName !== this.omnitronPgContainer.name) {
250
+ reconciled.volumes = this.omnitronPgContainer.volumes.map((v) => v.target === '/var/lib/postgresql/data' ? { ...v, source: `${decision.reconcileName}-data` } : v);
251
+ }
252
+ await this.reconcileService(reconciled);
88
253
  }
89
254
  else {
90
255
  try {
@@ -101,8 +266,25 @@ export class InfrastructureService {
101
266
  }
102
267
  }
103
268
  this.logger.info({ services: this.desiredContainers.map((c) => c.name) }, 'Provisioning app infrastructure');
104
- // 3. Reconcile each app service
105
- for (const desired of this.desiredContainers) {
269
+ // 3. Reconcile every app service in parallel.
270
+ //
271
+ // Pre-fix this was a serial `for await` loop over up to a dozen
272
+ // containers. For an already-healthy stack (the common cold-boot
273
+ // case where Docker preserved containers across a daemon
274
+ // restart) each reconcileService is a single `docker inspect`
275
+ // round-trip — but doing nine of them serially still costs
276
+ // multiple seconds of latency on the critical path before
277
+ // apps can even start spawning.
278
+ //
279
+ // Safety: `reconcileService` holds a per-name lock
280
+ // (`this.reconciling`), so parallel calls for the SAME
281
+ // container still serialise. Cross-container ordering (e.g.
282
+ // monero-wallet-rpc must talk to monero-daemon) is enforced
283
+ // by each container's own healthcheck loop — the wallet's
284
+ // health probe retries until the daemon's RPC accepts
285
+ // connections, so launching them in parallel just extends the
286
+ // wallet's first-try wait, not its end state.
287
+ await Promise.all(this.desiredContainers.map(async (desired) => {
106
288
  try {
107
289
  await this.reconcileService(desired);
108
290
  }
@@ -115,26 +297,81 @@ export class InfrastructureService {
115
297
  error: err.message,
116
298
  };
117
299
  }
118
- }
300
+ }));
119
301
  // 4. Post-provisioning setup (create databases, buckets, etc.)
120
302
  await this.postProvision();
121
303
  // 4. Start health monitor
122
304
  this.startHealthMonitor();
123
- this.state.ready = true;
305
+ // T#75: start the phantom-endpoint janitor. It periodically
306
+ // cleans up stale endpoint records on the managed network so
307
+ // a Docker daemon restart / host suspend doesn't leave us
308
+ // unable to recreate containers ("endpoint with name X
309
+ // already exists in network ...").
310
+ this.phantomJanitor = new PhantomEndpointJanitor({
311
+ networks: [getManagedNetwork()],
312
+ intervalMs: 60_000,
313
+ logger: this.logger,
314
+ });
315
+ this.phantomJanitor.start();
316
+ // Readiness is measured, not announced.
317
+ //
318
+ // These two lines were `ready = true` and "Infrastructure provisioned
319
+ // and healthy", unconditionally — and every service reconciles inside a
320
+ // `Promise.all` whose per-service catch records `exited` and continues.
321
+ // So a run where every container failed ended exactly like a run where
322
+ // all of them came up, and the gate below this waits on a flag that
323
+ // could not say no. See `summariseProvisioning`.
324
+ const outcome = summariseProvisioning(this.desiredContainers, this.state.services);
325
+ this.state.ready = outcome.ready;
124
326
  this.state.lastReconciled = new Date().toISOString();
125
- this.logger.info('Infrastructure provisioned and healthy');
327
+ if (outcome.ready) {
328
+ this.logger.info(describeProvisioning(outcome));
329
+ }
330
+ else {
331
+ this.logger.error({
332
+ missing: outcome.missing.map((s) => s.name),
333
+ failed: outcome.failed.map((s) => ({ name: s.name, status: s.status, error: s.error })),
334
+ running: outcome.running.length,
335
+ }, describeProvisioning(outcome));
336
+ }
126
337
  return this.state;
127
338
  }
339
+ /**
340
+ * What this service was asked to provide.
341
+ *
342
+ * Exposed because a caller cannot tell "present and fine" from "never
343
+ * attempted" by reading `state.services` alone: the second leaves no entry,
344
+ * and an absent entry is indistinguishable from an absent problem.
345
+ */
346
+ getDesiredServices() {
347
+ return this.desiredContainers.map((c) => ({ name: c.name, image: c.image }));
348
+ }
349
+ /**
350
+ * Services whose socket is new since this reconcile began.
351
+ *
352
+ * `noop` is the only action that leaves an existing connection usable.
353
+ * Everything else means anything already connected is holding a dead pool.
354
+ */
355
+ getRestartedServices() {
356
+ return [...this.lastActions.entries()]
357
+ .filter(([, action]) => action === 'create' || action === 'start' || action === 'recreate')
358
+ .map(([name]) => name);
359
+ }
128
360
  /**
129
361
  * Stop all managed infrastructure containers.
130
362
  */
131
363
  async teardown() {
132
364
  this.stopHealthMonitor();
133
- // Remove all containers in parallel for fast shutdown.
134
- // Skip the stack-prefixed PG when using the global omnitron-pg (it's shared).
135
- const allContainers = this.usingGlobalOmnitronPg
136
- ? [...this.desiredContainers].reverse()
137
- : [...[...this.desiredContainers].reverse(), this.omnitronPgContainer];
365
+ // T#75: stop the janitor BEFORE removing containers so a final
366
+ // tick can't race the teardown's `docker rm` and produce noisy
367
+ // disconnect-of-already-disconnected errors.
368
+ if (this.phantomJanitor) {
369
+ this.phantomJanitor.stop();
370
+ this.phantomJanitor = null;
371
+ }
372
+ // Remove all containers in parallel for fast shutdown — the control-plane
373
+ // database only where this service keeps one (`controlPlaneContainers`).
374
+ const allContainers = [...[...this.desiredContainers].reverse(), ...this.controlPlaneContainers()];
138
375
  await Promise.allSettled(allContainers.map(async (c) => {
139
376
  try {
140
377
  await removeContainer(c.name);
@@ -152,6 +389,25 @@ export class InfrastructureService {
152
389
  getState() {
153
390
  return this.state;
154
391
  }
392
+ /**
393
+ * Serve the stack's definition as it is now.
394
+ *
395
+ * A node's daemon builds this service on its first `provisionStack` and
396
+ * reuses it for every later one — rightly: a second service would be a
397
+ * second janitor and a second health monitor over one set of containers.
398
+ * But the definition it was built with stayed its definition. A later
399
+ * deployment that enabled a service, changed an image or dropped a
400
+ * `disabled` reached the node's host services — `reconcileHostServices`
401
+ * reads each call's own — and not its containers, until something restarted
402
+ * the daemon. Replaced whole, as the constructor sets it; `setConfigRoots`
403
+ * and `addAppContainers` then work on this set, as on a first call.
404
+ */
405
+ redefine(config, normalizedServices, serviceOverrides) {
406
+ this.config = config;
407
+ this.normalizedServices = normalizedServices;
408
+ this.serviceOverrides = serviceOverrides;
409
+ this.desiredContainers = resolveInfrastructure(config, normalizedServices, serviceOverrides);
410
+ }
155
411
  /**
156
412
  * Get normalized services (from preset system).
157
413
  * Used by config-resolver for generic address resolution.
@@ -159,6 +415,28 @@ export class InfrastructureService {
159
415
  getNormalizedServices() {
160
416
  return this.normalizedServices;
161
417
  }
418
+ /**
419
+ * Databases declared for this stack's postgres (e.g. main, storage, geo).
420
+ * Source of truth for "which DBs must be backed up" — read straight from
421
+ * the same `infrastructure.postgres.databases` block omnitron provisions
422
+ * from, so the backup set can never drift from the provisioned set.
423
+ */
424
+ getPostgresDatabases() {
425
+ const pg = this.config.postgres;
426
+ if (!pg || !pg.databases)
427
+ return [];
428
+ return Object.keys(pg.databases);
429
+ }
430
+ /**
431
+ * Resolved container name for an infra service (e.g. 'postgres' →
432
+ * 'acme-dev-postgres'). Taken from the already-resolved desired containers
433
+ * so it reflects the real container prefix rather than re-deriving it from
434
+ * the mutable module-global. Returns null if the stack has no such service.
435
+ */
436
+ getResolvedContainerName(service) {
437
+ const match = this.desiredContainers.find((d) => d.name.endsWith(`-${service}`));
438
+ return match?.name ?? null;
439
+ }
162
440
  /**
163
441
  * Get connection info for an infrastructure service.
164
442
  * Used by config generator to resolve { infra: 'postgres', database: 'main' }.
@@ -170,7 +448,7 @@ export class InfrastructureService {
170
448
  if (!pg)
171
449
  return null;
172
450
  return {
173
- host: 'localhost',
451
+ host: LOCAL_INFRA_HOST,
174
452
  port: pg.port ?? 5432,
175
453
  user: pg.user ?? 'postgres',
176
454
  password: typeof pg.password === 'string' ? pg.password : 'postgres',
@@ -181,7 +459,7 @@ export class InfrastructureService {
181
459
  if (!redis)
182
460
  return null;
183
461
  return {
184
- host: 'localhost',
462
+ host: LOCAL_INFRA_HOST,
185
463
  port: redis.port ?? 6379,
186
464
  password: typeof redis.password === 'string' ? redis.password : undefined,
187
465
  databases: redis.databases ?? {},
@@ -192,7 +470,7 @@ export class InfrastructureService {
192
470
  if (!minio)
193
471
  return null;
194
472
  return {
195
- endpoint: `http://localhost:${minio.ports?.api ?? 9000}`,
473
+ endpoint: `http://${LOCAL_INFRA_HOST}:${minio.ports?.api ?? 9000}`,
196
474
  accessKey: minio.accessKey ?? 'minioadmin',
197
475
  secretKey: typeof minio.secretKey === 'string' ? minio.secretKey : 'minioadmin',
198
476
  forcePathStyle: true,
@@ -200,7 +478,7 @@ export class InfrastructureService {
200
478
  }
201
479
  case 'omnitron-pg':
202
480
  return {
203
- host: 'localhost',
481
+ host: LOCAL_INFRA_HOST,
204
482
  port: OMNITRON_PG_PORT,
205
483
  user: OMNITRON_PG_USER,
206
484
  password: OMNITRON_PG_PASSWORD,
@@ -213,9 +491,73 @@ export class InfrastructureService {
213
491
  // ===========================================================================
214
492
  // Private — Reconciliation
215
493
  // ===========================================================================
494
+ /**
495
+ * Per-name in-flight reconcile lock (T#58). A health sweep that
496
+ * overlaps a previous slow sweep — or a reconcile triggered by
497
+ * `ensureXxx` calls happening concurrently — used to enter
498
+ * `reconcileService` twice for the same container. The first did
499
+ * `removeContainer` then `createAndStart`; the second saw the
500
+ * container missing mid-recreate and tried to recreate it too,
501
+ * producing name conflicts, partial state, and (with Docker's
502
+ * own restart-policy in the mix) occasional duplicate containers.
503
+ */
504
+ reconciling = new Set();
505
+ /**
506
+ * Where this node keeps each service's config files, once a master sent them.
507
+ *
508
+ * The gateway is not an ordinary preset container — it needs four bind
509
+ * mounts, an entrypoint and fifteen upstream variables, and `resolveGateway`
510
+ * is the only thing that produces them. The constructor resolved everything
511
+ * through the generic preset path, because at construction time this node
512
+ * had no files and no local path to mount from.
513
+ *
514
+ * So this RE-RESOLVES rather than patching the volumes of a container built
515
+ * without them. A spec assembled by the wrong resolver is missing more than
516
+ * paths, and rewriting one field of it would produce a container that looks
517
+ * configured and is not — which is the failure that was already shipping,
518
+ * one level down.
519
+ *
520
+ * Called before `provision()`, so the recreation the changed spec hash
521
+ * implies happens on the first pass rather than the second.
522
+ */
523
+ setConfigRoots(roots, staticRoots, redis,
524
+ /**
525
+ * The static ROOT per service, when the delivery made a
526
+ * `current-<project>-<stack>` link inside it. Given, the gateway mounts
527
+ * the root and serves through the link — a path that does not change from
528
+ * one release to the next, so the container is not recreated and the
529
+ * second of 000 a deployment cost goes with it. Empty, everything below
530
+ * resolves exactly as before.
531
+ */
532
+ staticLinkRoots) {
533
+ if (roots.size === 0)
534
+ return;
535
+ this.desiredContainers = resolveInfrastructure(this.config, this.normalizedServices, this.serviceOverrides, roots, { redis, staticRoots, ...(staticLinkRoots && { staticLinkRoots }) });
536
+ }
216
537
  async reconcileService(desired) {
538
+ // T#58: per-name lock around the whole inspect→decide→act loop.
539
+ if (this.reconciling.has(desired.name)) {
540
+ this.logger.debug({ service: desired.name }, 'Reconcile already in flight — skipping');
541
+ return;
542
+ }
543
+ this.reconciling.add(desired.name);
544
+ try {
545
+ await this.reconcileServiceLocked(desired);
546
+ }
547
+ finally {
548
+ this.reconciling.delete(desired.name);
549
+ }
550
+ }
551
+ async reconcileServiceLocked(desired) {
217
552
  const actual = await getContainerState(desired.name);
218
553
  const action = this.computeAction(desired, actual);
554
+ // A container that was created, started or recreated is listening on a
555
+ // NEW socket. Applications already running hold pools pointing at the
556
+ // old one, and a titan liveness probe does not notice — the app answers
557
+ // `/health` 200 while every request it serves fails with "Connection
558
+ // terminated unexpectedly". Whoever asked for this reconcile is the only
559
+ // one in a position to restart them, so it has to be told.
560
+ this.lastActions.set(desired.name, action.type);
219
561
  switch (action.type) {
220
562
  case 'noop':
221
563
  this.logger.debug({ service: desired.name }, 'Service already running');
@@ -251,6 +593,17 @@ export class InfrastructureService {
251
593
  return { type: 'create', service: desired.name, config: desired };
252
594
  }
253
595
  if (actual.status === 'running') {
596
+ // Running but detached from all networks (OrbStack/dockerd-restart
597
+ // artifact): the container is unreachable and its published ports are
598
+ // gone. 'running' is a lie here — recreate to re-attach + re-publish.
599
+ if (actual.networkAttached === false) {
600
+ return {
601
+ type: 'recreate',
602
+ service: desired.name,
603
+ config: desired,
604
+ reason: 'network-detached (running but on no network)',
605
+ };
606
+ }
254
607
  // Check if image changed
255
608
  if (actual.image !== desired.image && !actual.image.startsWith(desired.image)) {
256
609
  return {
@@ -260,9 +613,55 @@ export class InfrastructureService {
260
613
  reason: `image changed: ${actual.image} → ${desired.image}`,
261
614
  };
262
615
  }
616
+ // Config drift: image unchanged but the desired spec (env, ports,
617
+ // volumes, command, extraHosts) differs from what the running container
618
+ // was created with. Without this, an omnitron.config.ts edit that only
619
+ // touches env — e.g. the Tor hidden-service target — is silently ignored
620
+ // because the container is "running and healthy". Only fires when the
621
+ // running container carries a spec-hash label; pre-upgrade containers
622
+ // (no label) are left alone until they recreate for another reason, so
623
+ // upgrading omnitron never churns an otherwise-healthy stack.
624
+ if (actual.specHash) {
625
+ const desiredHash = containerSpecHash(desired);
626
+ if (actual.specHash !== desiredHash) {
627
+ return {
628
+ type: 'recreate',
629
+ service: desired.name,
630
+ config: desired,
631
+ reason: `config drift (spec ${actual.specHash} → ${desiredHash})`,
632
+ };
633
+ }
634
+ }
263
635
  return { type: 'noop', service: desired.name };
264
636
  }
265
637
  if (actual.status === 'exited' || actual.status === 'created') {
638
+ // A container that is not running still carries the spec it was created
639
+ // with, and `start` runs THAT spec. The drift checks above were only
640
+ // asked of a running container, so one created wrong was started wrong
641
+ // for as long as it existed: Nominatim on daos/test, created at 05:37
642
+ // with a mount the master had not rewritten, was «started» by every
643
+ // reconcile after the fix that corrected its desired spec — «exec:
644
+ // /opt/nominatim-tools/cis-entrypoint.sh: no such file» each time
645
+ // (2026-09-25). Same questions, same answers, before it is started.
646
+ if (actual.image !== desired.image && !actual.image.startsWith(desired.image)) {
647
+ return {
648
+ type: 'recreate',
649
+ service: desired.name,
650
+ config: desired,
651
+ reason: `image changed while stopped: ${actual.image} → ${desired.image}`,
652
+ };
653
+ }
654
+ if (actual.specHash) {
655
+ const desiredHash = containerSpecHash(desired);
656
+ if (actual.specHash !== desiredHash) {
657
+ return {
658
+ type: 'recreate',
659
+ service: desired.name,
660
+ config: desired,
661
+ reason: `config drift while ${actual.status} (spec ${actual.specHash} → ${desiredHash})`,
662
+ };
663
+ }
664
+ }
266
665
  return { type: 'start', service: desired.name, containerId: actual.containerId ?? desired.name };
267
666
  }
268
667
  // Dead or other — recreate
@@ -343,6 +742,26 @@ export class InfrastructureService {
343
742
  const { execFile } = await import('node:child_process');
344
743
  const { promisify } = await import('node:util');
345
744
  const execFileAsync = promisify(execFile);
745
+ // A preset hook is what creates the databases inside Postgres and the
746
+ // buckets inside MinIO — the containers are running either way, so a
747
+ // failure here is invisible until an application cannot find its
748
+ // database.
749
+ //
750
+ // `this.presetRegistry!` asserted a dependency the constructor declares
751
+ // OPTIONAL, so a caller that did not pass one — which the type permits —
752
+ // got `Cannot read properties of undefined (reading 'get')` from a line
753
+ // that reads as internal, after every container was already up.
754
+ // Measured on a node provisioning a stack, where the containers stayed
755
+ // and the databases were never made.
756
+ if (!this.presetRegistry) {
757
+ const withPresets = Object.entries(this.normalizedServices)
758
+ .filter(([, r]) => r._preset)
759
+ .map(([name]) => name);
760
+ if (withPresets.length > 0) {
761
+ this.logger.error({ services: withPresets }, 'No preset registry, so post-provision steps were skipped — these services are running but their databases and buckets were not created');
762
+ }
763
+ return;
764
+ }
346
765
  for (const [serviceName, requirement] of Object.entries(this.normalizedServices)) {
347
766
  if (!requirement._preset)
348
767
  continue;
@@ -400,51 +819,20 @@ export class InfrastructureService {
400
819
  this.logger.info('Omnitron internal database provisioned and migrated');
401
820
  }
402
821
  /**
403
- * Connect to Omnitron's PG and run migrations via Kysely's built-in Migrator.
404
- * Uses dynamic import to keep pg/kysely optional until actually needed.
822
+ * Apply the internal-database schema through the shared runner.
823
+ *
824
+ * This used to be a second, independently-maintained copy of the daemon's
825
+ * migration code that only knew migrations 001–002 — and, like the
826
+ * daemon's copy, it constructed `Migrator` from the `kysely` package root
827
+ * where that export does not exist, so it threw on every run. Both are now
828
+ * one call into `database/migration-runner.ts`.
829
+ *
830
+ * Errors propagate to `provisionOmnitronDatabase`'s caller: provisioning
831
+ * that ends with an unmigrated database has not succeeded.
405
832
  */
406
833
  async runOmnitronMigrations() {
407
- const { Kysely, PostgresDialect, Migrator } = await import('kysely');
408
- const pg = await import('pg');
409
- const m001 = await import('../database/migrations/001_initial_schema.js');
410
- const m002 = await import('../database/migrations/002_metrics_raw.js');
411
- const pool = new pg.default.Pool({
412
- host: 'localhost',
413
- port: OMNITRON_PG_PORT,
414
- database: OMNITRON_PG_DATABASE,
415
- user: OMNITRON_PG_USER,
416
- password: OMNITRON_PG_PASSWORD,
417
- });
418
- const db = new Kysely({
419
- dialect: new PostgresDialect({ pool }),
420
- });
421
- try {
422
- const migrator = new Migrator({
423
- db,
424
- provider: {
425
- async getMigrations() {
426
- return {
427
- '001_initial_schema': { up: m001.up, down: m001.down },
428
- '002_metrics_raw': { up: m002.up, down: m002.down },
429
- };
430
- },
431
- },
432
- });
433
- const { results, error } = await migrator.migrateToLatest();
434
- const applied = results?.filter((r) => r.status === 'Success') ?? [];
435
- if (applied.length > 0) {
436
- this.logger.info({ migrations: applied.map((r) => r.migrationName) }, `Applied ${applied.length} Omnitron migration(s)`);
437
- }
438
- else {
439
- this.logger.debug('Omnitron database schema is up to date');
440
- }
441
- if (error) {
442
- this.logger.error({ error: String(error) }, 'Migration error');
443
- }
444
- }
445
- finally {
446
- await db.destroy();
447
- }
834
+ const { runOmnitronMigrations } = await import('../database/migration-runner.js');
835
+ await runOmnitronMigrations(this.logger);
448
836
  }
449
837
  // ===========================================================================
450
838
  // Private — Health Monitor (Self-Healing)
@@ -463,33 +851,84 @@ export class InfrastructureService {
463
851
  this.healthTimer = null;
464
852
  }
465
853
  }
854
+ /**
855
+ * The control-plane database container this service keeps, if any: none on
856
+ * a node — it keeps its own state in SQLite (`decideControlPlaneDatabase`) —
857
+ * and none where the global `omnitron-pg` serves.
858
+ *
859
+ * `provision()` asked `needsControlPlaneDatabase`; the health sweep and the
860
+ * teardown asked only `usingGlobalOmnitronPg`. So on a node the sweep found
861
+ * `<prefix>-pg` «not running» every 30 s and created it: daos/test got one on
862
+ * 2026-09-20, and again on 2026-09-25 forty seconds after it was removed —
863
+ * on the default credentials, for a database nothing reads.
864
+ */
865
+ controlPlaneContainers() {
866
+ return this.needsControlPlaneDatabase && !this.usingGlobalOmnitronPg ? [this.omnitronPgContainer] : [];
867
+ }
466
868
  async healthSweep() {
467
- // Include omnitron-pg in health sweep alongside app containers,
468
- // but skip the stack-prefixed PG when using the global omnitron-pg
469
- const allContainers = this.usingGlobalOmnitronPg
470
- ? [...this.desiredContainers]
471
- : [this.omnitronPgContainer, ...this.desiredContainers];
869
+ // The control-plane database alongside the app containers, where this
870
+ // service keeps one.
871
+ const allContainers = [...this.controlPlaneContainers(), ...this.desiredContainers];
472
872
  for (const desired of allContainers) {
473
873
  const actual = await getContainerState(desired.name);
874
+ // T#58: Docker's own `--restart=always` / `--restart=on-failure`
875
+ // policy puts the container into the 'restarting' state for the
876
+ // brief window between exit and re-entry. If we recreate during
877
+ // that window we race Docker's restart — `removeContainer` mid-
878
+ // restart leaves the daemon confused, and the recreated container
879
+ // may end up duplicated under a renamed transient. Let Docker
880
+ // finish; the next 30s tick will see 'running' and skip.
881
+ if (actual?.status === 'restarting') {
882
+ this.logger.debug({ service: desired.name }, "Service is restarting via Docker's own policy — yielding to it (T#58)");
883
+ continue;
884
+ }
474
885
  if (!actual || actual.status !== 'running') {
886
+ this.unhealthyTicks.delete(desired.name);
887
+ // Circuit-breaker: while a service is inside its backoff window, skip
888
+ // the restart so a permanently-failing container can't hammer the
889
+ // supervisor every tick and starve the daemon's event loop.
890
+ const backoff = this.restartBackoff.get(desired.name);
891
+ if (backoff && Date.now() < backoff.nextAttemptAt) {
892
+ this.logger.debug({ service: desired.name, failures: backoff.failures, retryInMs: backoff.nextAttemptAt - Date.now() }, 'Service not running — in restart backoff, skipping tick');
893
+ continue;
894
+ }
475
895
  this.logger.warn({ service: desired.name, status: actual?.status ?? 'not_found' }, 'Service not running — auto-restarting');
476
896
  try {
477
897
  await this.reconcileService(desired);
898
+ this.restartBackoff.delete(desired.name);
478
899
  }
479
900
  catch (err) {
480
- this.logger.error({ service: desired.name, error: err.message }, 'Auto-restart failed');
901
+ const failures = (this.restartBackoff.get(desired.name)?.failures ?? 0) + 1;
902
+ const backoffMs = restartBackoffMs(failures);
903
+ this.restartBackoff.set(desired.name, { failures, nextAttemptAt: Date.now() + backoffMs });
904
+ this.logger.error({ service: desired.name, error: err.message, failures, backoffMs }, 'Auto-restart failed');
481
905
  }
482
906
  }
483
907
  else if (actual.health === 'unhealthy') {
484
- this.logger.warn({ service: desired.name }, 'Service unhealthy — restarting container');
485
- try {
486
- await removeContainer(desired.name);
487
- await this.createAndStart(desired);
908
+ const ticks = (this.unhealthyTicks.get(desired.name) ?? 0) + 1;
909
+ this.unhealthyTicks.set(desired.name, ticks);
910
+ if (ticks < UNHEALTHY_RESTART_THRESHOLD) {
911
+ this.logger.warn({ service: desired.name, consecutiveUnhealthy: ticks, threshold: UNHEALTHY_RESTART_THRESHOLD }, 'Service unhealthy — waiting for confirmation before restart');
488
912
  }
489
- catch (err) {
490
- this.logger.error({ service: desired.name, error: err.message }, 'Health restart failed');
913
+ else {
914
+ this.unhealthyTicks.delete(desired.name);
915
+ this.logger.warn({ service: desired.name, consecutiveUnhealthy: ticks }, 'Service unhealthy past threshold — restarting container');
916
+ try {
917
+ await removeContainer(desired.name);
918
+ await this.createAndStart(desired);
919
+ }
920
+ catch (err) {
921
+ this.logger.error({ service: desired.name, error: err.message }, 'Health restart failed');
922
+ }
491
923
  }
492
924
  }
925
+ else {
926
+ // Healthy or starting — clear any accumulated unhealthy ticks and
927
+ // reset the restart circuit-breaker (it may have recovered on its own
928
+ // via Docker's restart policy).
929
+ this.unhealthyTicks.delete(desired.name);
930
+ this.restartBackoff.delete(desired.name);
931
+ }
493
932
  // Update state
494
933
  const newState = await getContainerState(desired.name);
495
934
  if (newState) {
@@ -499,4 +938,40 @@ export class InfrastructureService {
499
938
  this.state.lastReconciled = new Date().toISOString();
500
939
  }
501
940
  }
941
+ /**
942
+ * T#76: shallow equality on the fields that drive container
943
+ * identity. Two declarations that differ only in incidental fields
944
+ * (label maps, restart policy adornments) should still be treated
945
+ * as the same shared container; differences in image / env / port
946
+ * mapping legitimately deserve an operator-facing warning.
947
+ */
948
+ function shallowContainerEqual(a, b) {
949
+ if (a.image !== b.image)
950
+ return false;
951
+ if (!sameRecord(a.environment, b.environment))
952
+ return false;
953
+ if (a.ports.length !== b.ports.length)
954
+ return false;
955
+ for (let i = 0; i < a.ports.length; i++) {
956
+ if (a.ports[i].host !== b.ports[i].host || a.ports[i].container !== b.ports[i].container)
957
+ return false;
958
+ }
959
+ if (a.volumes.length !== b.volumes.length)
960
+ return false;
961
+ for (let i = 0; i < a.volumes.length; i++) {
962
+ if (a.volumes[i].source !== b.volumes[i].source || a.volumes[i].target !== b.volumes[i].target)
963
+ return false;
964
+ }
965
+ return true;
966
+ }
967
+ function sameRecord(a, b) {
968
+ const ka = Object.keys(a ?? {});
969
+ const kb = Object.keys(b ?? {});
970
+ if (ka.length !== kb.length)
971
+ return false;
972
+ for (const k of ka)
973
+ if (a?.[k] !== b?.[k])
974
+ return false;
975
+ return true;
976
+ }
502
977
  //# sourceMappingURL=infrastructure.service.js.map