@omnitron-dev/omnitron 0.1.1

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 (834) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -0
  3. package/dist/cli/omnitron.d.ts +9 -0
  4. package/dist/cli/omnitron.d.ts.map +1 -0
  5. package/dist/cli/omnitron.js +768 -0
  6. package/dist/cli/omnitron.js.map +1 -0
  7. package/dist/cluster/cluster.rpc-service.d.ts +48 -0
  8. package/dist/cluster/cluster.rpc-service.d.ts.map +1 -0
  9. package/dist/cluster/cluster.rpc-service.js +105 -0
  10. package/dist/cluster/cluster.rpc-service.js.map +1 -0
  11. package/dist/cluster/config-sync.d.ts +89 -0
  12. package/dist/cluster/config-sync.d.ts.map +1 -0
  13. package/dist/cluster/config-sync.js +162 -0
  14. package/dist/cluster/config-sync.js.map +1 -0
  15. package/dist/cluster/index.d.ts +9 -0
  16. package/dist/cluster/index.d.ts.map +1 -0
  17. package/dist/cluster/index.js +7 -0
  18. package/dist/cluster/index.js.map +1 -0
  19. package/dist/cluster/leader-election.d.ts +145 -0
  20. package/dist/cluster/leader-election.d.ts.map +1 -0
  21. package/dist/cluster/leader-election.js +410 -0
  22. package/dist/cluster/leader-election.js.map +1 -0
  23. package/dist/cluster/slave-connector.d.ts +104 -0
  24. package/dist/cluster/slave-connector.d.ts.map +1 -0
  25. package/dist/cluster/slave-connector.js +316 -0
  26. package/dist/cluster/slave-connector.js.map +1 -0
  27. package/dist/commands/backup.d.ts +9 -0
  28. package/dist/commands/backup.d.ts.map +1 -0
  29. package/dist/commands/backup.js +81 -0
  30. package/dist/commands/backup.js.map +1 -0
  31. package/dist/commands/cluster.d.ts +9 -0
  32. package/dist/commands/cluster.d.ts.map +1 -0
  33. package/dist/commands/cluster.js +148 -0
  34. package/dist/commands/cluster.js.map +1 -0
  35. package/dist/commands/daemon-cmd.d.ts +11 -0
  36. package/dist/commands/daemon-cmd.d.ts.map +1 -0
  37. package/dist/commands/daemon-cmd.js +182 -0
  38. package/dist/commands/daemon-cmd.js.map +1 -0
  39. package/dist/commands/deploy.d.ts +17 -0
  40. package/dist/commands/deploy.d.ts.map +1 -0
  41. package/dist/commands/deploy.js +110 -0
  42. package/dist/commands/deploy.js.map +1 -0
  43. package/dist/commands/dev.d.ts +23 -0
  44. package/dist/commands/dev.d.ts.map +1 -0
  45. package/dist/commands/dev.js +76 -0
  46. package/dist/commands/dev.js.map +1 -0
  47. package/dist/commands/discover.d.ts +9 -0
  48. package/dist/commands/discover.d.ts.map +1 -0
  49. package/dist/commands/discover.js +124 -0
  50. package/dist/commands/discover.js.map +1 -0
  51. package/dist/commands/env.d.ts +5 -0
  52. package/dist/commands/env.d.ts.map +1 -0
  53. package/dist/commands/env.js +30 -0
  54. package/dist/commands/env.js.map +1 -0
  55. package/dist/commands/exec.d.ts +5 -0
  56. package/dist/commands/exec.d.ts.map +1 -0
  57. package/dist/commands/exec.js +36 -0
  58. package/dist/commands/exec.js.map +1 -0
  59. package/dist/commands/fleet.d.ts +9 -0
  60. package/dist/commands/fleet.d.ts.map +1 -0
  61. package/dist/commands/fleet.js +136 -0
  62. package/dist/commands/fleet.js.map +1 -0
  63. package/dist/commands/health-check.d.ts +12 -0
  64. package/dist/commands/health-check.d.ts.map +1 -0
  65. package/dist/commands/health-check.js +91 -0
  66. package/dist/commands/health-check.js.map +1 -0
  67. package/dist/commands/health.d.ts +7 -0
  68. package/dist/commands/health.d.ts.map +1 -0
  69. package/dist/commands/health.js +44 -0
  70. package/dist/commands/health.js.map +1 -0
  71. package/dist/commands/infra.d.ts +32 -0
  72. package/dist/commands/infra.d.ts.map +1 -0
  73. package/dist/commands/infra.js +179 -0
  74. package/dist/commands/infra.js.map +1 -0
  75. package/dist/commands/init.d.ts +5 -0
  76. package/dist/commands/init.d.ts.map +1 -0
  77. package/dist/commands/init.js +78 -0
  78. package/dist/commands/init.js.map +1 -0
  79. package/dist/commands/inspect.d.ts +7 -0
  80. package/dist/commands/inspect.d.ts.map +1 -0
  81. package/dist/commands/inspect.js +95 -0
  82. package/dist/commands/inspect.js.map +1 -0
  83. package/dist/commands/k8s.d.ts +7 -0
  84. package/dist/commands/k8s.d.ts.map +1 -0
  85. package/dist/commands/k8s.js +74 -0
  86. package/dist/commands/k8s.js.map +1 -0
  87. package/dist/commands/kb.d.ts +21 -0
  88. package/dist/commands/kb.d.ts.map +1 -0
  89. package/dist/commands/kb.js +137 -0
  90. package/dist/commands/kb.js.map +1 -0
  91. package/dist/commands/list.d.ts +7 -0
  92. package/dist/commands/list.d.ts.map +1 -0
  93. package/dist/commands/list.js +77 -0
  94. package/dist/commands/list.js.map +1 -0
  95. package/dist/commands/logs.d.ts +17 -0
  96. package/dist/commands/logs.d.ts.map +1 -0
  97. package/dist/commands/logs.js +287 -0
  98. package/dist/commands/logs.js.map +1 -0
  99. package/dist/commands/metrics.d.ts +7 -0
  100. package/dist/commands/metrics.d.ts.map +1 -0
  101. package/dist/commands/metrics.js +64 -0
  102. package/dist/commands/metrics.js.map +1 -0
  103. package/dist/commands/monit.d.ts +7 -0
  104. package/dist/commands/monit.d.ts.map +1 -0
  105. package/dist/commands/monit.js +90 -0
  106. package/dist/commands/monit.js.map +1 -0
  107. package/dist/commands/node.d.ts +33 -0
  108. package/dist/commands/node.d.ts.map +1 -0
  109. package/dist/commands/node.js +169 -0
  110. package/dist/commands/node.js.map +1 -0
  111. package/dist/commands/pipeline.d.ts +9 -0
  112. package/dist/commands/pipeline.d.ts.map +1 -0
  113. package/dist/commands/pipeline.js +89 -0
  114. package/dist/commands/pipeline.js.map +1 -0
  115. package/dist/commands/project.d.ts +11 -0
  116. package/dist/commands/project.d.ts.map +1 -0
  117. package/dist/commands/project.js +54 -0
  118. package/dist/commands/project.js.map +1 -0
  119. package/dist/commands/reload.d.ts +5 -0
  120. package/dist/commands/reload.d.ts.map +1 -0
  121. package/dist/commands/reload.js +31 -0
  122. package/dist/commands/reload.js.map +1 -0
  123. package/dist/commands/remote.d.ts +13 -0
  124. package/dist/commands/remote.d.ts.map +1 -0
  125. package/dist/commands/remote.js +88 -0
  126. package/dist/commands/remote.js.map +1 -0
  127. package/dist/commands/restart.d.ts +5 -0
  128. package/dist/commands/restart.d.ts.map +1 -0
  129. package/dist/commands/restart.js +31 -0
  130. package/dist/commands/restart.js.map +1 -0
  131. package/dist/commands/scale.d.ts +5 -0
  132. package/dist/commands/scale.d.ts.map +1 -0
  133. package/dist/commands/scale.js +29 -0
  134. package/dist/commands/scale.js.map +1 -0
  135. package/dist/commands/secret.d.ts +14 -0
  136. package/dist/commands/secret.d.ts.map +1 -0
  137. package/dist/commands/secret.js +148 -0
  138. package/dist/commands/secret.js.map +1 -0
  139. package/dist/commands/stack.d.ts +18 -0
  140. package/dist/commands/stack.d.ts.map +1 -0
  141. package/dist/commands/stack.js +252 -0
  142. package/dist/commands/stack.js.map +1 -0
  143. package/dist/commands/start.d.ts +7 -0
  144. package/dist/commands/start.d.ts.map +1 -0
  145. package/dist/commands/start.js +43 -0
  146. package/dist/commands/start.js.map +1 -0
  147. package/dist/commands/status.d.ts +9 -0
  148. package/dist/commands/status.d.ts.map +1 -0
  149. package/dist/commands/status.js +70 -0
  150. package/dist/commands/status.js.map +1 -0
  151. package/dist/commands/stop.d.ts +10 -0
  152. package/dist/commands/stop.d.ts.map +1 -0
  153. package/dist/commands/stop.js +69 -0
  154. package/dist/commands/stop.js.map +1 -0
  155. package/dist/commands/up.d.ts +47 -0
  156. package/dist/commands/up.d.ts.map +1 -0
  157. package/dist/commands/up.js +278 -0
  158. package/dist/commands/up.js.map +1 -0
  159. package/dist/commands/webapp.d.ts +17 -0
  160. package/dist/commands/webapp.d.ts.map +1 -0
  161. package/dist/commands/webapp.js +103 -0
  162. package/dist/commands/webapp.js.map +1 -0
  163. package/dist/config/defaults.d.ts +22 -0
  164. package/dist/config/defaults.d.ts.map +1 -0
  165. package/dist/config/defaults.js +76 -0
  166. package/dist/config/defaults.js.map +1 -0
  167. package/dist/config/define-app.d.ts +6 -0
  168. package/dist/config/define-app.d.ts.map +1 -0
  169. package/dist/config/define-app.js +38 -0
  170. package/dist/config/define-app.js.map +1 -0
  171. package/dist/config/define-ecosystem.d.ts +6 -0
  172. package/dist/config/define-ecosystem.d.ts.map +1 -0
  173. package/dist/config/define-ecosystem.js +21 -0
  174. package/dist/config/define-ecosystem.js.map +1 -0
  175. package/dist/config/define-system.d.ts +9 -0
  176. package/dist/config/define-system.d.ts.map +1 -0
  177. package/dist/config/define-system.js +106 -0
  178. package/dist/config/define-system.js.map +1 -0
  179. package/dist/config/index.d.ts +7 -0
  180. package/dist/config/index.d.ts.map +1 -0
  181. package/dist/config/index.js +6 -0
  182. package/dist/config/index.js.map +1 -0
  183. package/dist/config/loader.d.ts +11 -0
  184. package/dist/config/loader.d.ts.map +1 -0
  185. package/dist/config/loader.js +68 -0
  186. package/dist/config/loader.js.map +1 -0
  187. package/dist/config/omnitron-config.schema.d.ts +14 -0
  188. package/dist/config/omnitron-config.schema.d.ts.map +1 -0
  189. package/dist/config/omnitron-config.schema.js +35 -0
  190. package/dist/config/omnitron-config.schema.js.map +1 -0
  191. package/dist/config/types.d.ts +807 -0
  192. package/dist/config/types.d.ts.map +1 -0
  193. package/dist/config/types.js +7 -0
  194. package/dist/config/types.js.map +1 -0
  195. package/dist/daemon/daemon-client.d.ts +147 -0
  196. package/dist/daemon/daemon-client.d.ts.map +1 -0
  197. package/dist/daemon/daemon-client.js +256 -0
  198. package/dist/daemon/daemon-client.js.map +1 -0
  199. package/dist/daemon/daemon-entry.d.ts +9 -0
  200. package/dist/daemon/daemon-entry.d.ts.map +1 -0
  201. package/dist/daemon/daemon-entry.js +62 -0
  202. package/dist/daemon/daemon-entry.js.map +1 -0
  203. package/dist/daemon/daemon-scheduler.d.ts +32 -0
  204. package/dist/daemon/daemon-scheduler.d.ts.map +1 -0
  205. package/dist/daemon/daemon-scheduler.js +93 -0
  206. package/dist/daemon/daemon-scheduler.js.map +1 -0
  207. package/dist/daemon/daemon.d.ts +115 -0
  208. package/dist/daemon/daemon.d.ts.map +1 -0
  209. package/dist/daemon/daemon.js +1202 -0
  210. package/dist/daemon/daemon.js.map +1 -0
  211. package/dist/daemon/daemon.module.d.ts +50 -0
  212. package/dist/daemon/daemon.module.d.ts.map +1 -0
  213. package/dist/daemon/daemon.module.js +506 -0
  214. package/dist/daemon/daemon.module.js.map +1 -0
  215. package/dist/daemon/daemon.rpc-service.d.ts +122 -0
  216. package/dist/daemon/daemon.rpc-service.d.ts.map +1 -0
  217. package/dist/daemon/daemon.rpc-service.js +452 -0
  218. package/dist/daemon/daemon.rpc-service.js.map +1 -0
  219. package/dist/daemon/pid-manager.d.ts +43 -0
  220. package/dist/daemon/pid-manager.d.ts.map +1 -0
  221. package/dist/daemon/pid-manager.js +103 -0
  222. package/dist/daemon/pid-manager.js.map +1 -0
  223. package/dist/daemon/state-store.d.ts +26 -0
  224. package/dist/daemon/state-store.d.ts.map +1 -0
  225. package/dist/daemon/state-store.js +34 -0
  226. package/dist/daemon/state-store.js.map +1 -0
  227. package/dist/database/index.d.ts +10 -0
  228. package/dist/database/index.d.ts.map +1 -0
  229. package/dist/database/index.js +10 -0
  230. package/dist/database/index.js.map +1 -0
  231. package/dist/database/migrate.d.ts +11 -0
  232. package/dist/database/migrate.d.ts.map +1 -0
  233. package/dist/database/migrate.js +62 -0
  234. package/dist/database/migrate.js.map +1 -0
  235. package/dist/database/migrations/001_initial_schema.d.ts +12 -0
  236. package/dist/database/migrations/001_initial_schema.d.ts.map +1 -0
  237. package/dist/database/migrations/001_initial_schema.js +246 -0
  238. package/dist/database/migrations/001_initial_schema.js.map +1 -0
  239. package/dist/database/migrations/002_metrics_raw.d.ts +17 -0
  240. package/dist/database/migrations/002_metrics_raw.d.ts.map +1 -0
  241. package/dist/database/migrations/002_metrics_raw.js +44 -0
  242. package/dist/database/migrations/002_metrics_raw.js.map +1 -0
  243. package/dist/database/migrations/003_pipelines_traces.d.ts +14 -0
  244. package/dist/database/migrations/003_pipelines_traces.d.ts.map +1 -0
  245. package/dist/database/migrations/003_pipelines_traces.js +108 -0
  246. package/dist/database/migrations/003_pipelines_traces.js.map +1 -0
  247. package/dist/database/migrations/004_sync_buffer.d.ts +17 -0
  248. package/dist/database/migrations/004_sync_buffer.d.ts.map +1 -0
  249. package/dist/database/migrations/004_sync_buffer.js +59 -0
  250. package/dist/database/migrations/004_sync_buffer.js.map +1 -0
  251. package/dist/database/migrations/005_node_health_checks.d.ts +11 -0
  252. package/dist/database/migrations/005_node_health_checks.d.ts.map +1 -0
  253. package/dist/database/migrations/005_node_health_checks.js +71 -0
  254. package/dist/database/migrations/005_node_health_checks.js.map +1 -0
  255. package/dist/database/schema.d.ts +217 -0
  256. package/dist/database/schema.d.ts.map +1 -0
  257. package/dist/database/schema.js +9 -0
  258. package/dist/database/schema.js.map +1 -0
  259. package/dist/execution/execution.service.d.ts +72 -0
  260. package/dist/execution/execution.service.d.ts.map +1 -0
  261. package/dist/execution/execution.service.js +191 -0
  262. package/dist/execution/execution.service.js.map +1 -0
  263. package/dist/execution/index.d.ts +3 -0
  264. package/dist/execution/index.d.ts.map +1 -0
  265. package/dist/execution/index.js +2 -0
  266. package/dist/execution/index.js.map +1 -0
  267. package/dist/index.d.ts +12 -0
  268. package/dist/index.d.ts.map +1 -0
  269. package/dist/index.js +9 -0
  270. package/dist/index.js.map +1 -0
  271. package/dist/infrastructure/config-normalizer.d.ts +13 -0
  272. package/dist/infrastructure/config-normalizer.d.ts.map +1 -0
  273. package/dist/infrastructure/config-normalizer.js +84 -0
  274. package/dist/infrastructure/config-normalizer.js.map +1 -0
  275. package/dist/infrastructure/container-runtime.d.ts +63 -0
  276. package/dist/infrastructure/container-runtime.d.ts.map +1 -0
  277. package/dist/infrastructure/container-runtime.js +304 -0
  278. package/dist/infrastructure/container-runtime.js.map +1 -0
  279. package/dist/infrastructure/gateway-generator.d.ts +63 -0
  280. package/dist/infrastructure/gateway-generator.d.ts.map +1 -0
  281. package/dist/infrastructure/gateway-generator.js +253 -0
  282. package/dist/infrastructure/gateway-generator.js.map +1 -0
  283. package/dist/infrastructure/index.d.ts +5 -0
  284. package/dist/infrastructure/index.d.ts.map +1 -0
  285. package/dist/infrastructure/index.js +5 -0
  286. package/dist/infrastructure/index.js.map +1 -0
  287. package/dist/infrastructure/infrastructure-gate.d.ts +48 -0
  288. package/dist/infrastructure/infrastructure-gate.d.ts.map +1 -0
  289. package/dist/infrastructure/infrastructure-gate.js +92 -0
  290. package/dist/infrastructure/infrastructure-gate.js.map +1 -0
  291. package/dist/infrastructure/infrastructure.service.d.ts +84 -0
  292. package/dist/infrastructure/infrastructure.service.d.ts.map +1 -0
  293. package/dist/infrastructure/infrastructure.service.js +502 -0
  294. package/dist/infrastructure/infrastructure.service.js.map +1 -0
  295. package/dist/infrastructure/presets/gateway-openresty.d.ts +10 -0
  296. package/dist/infrastructure/presets/gateway-openresty.d.ts.map +1 -0
  297. package/dist/infrastructure/presets/gateway-openresty.js +30 -0
  298. package/dist/infrastructure/presets/gateway-openresty.js.map +1 -0
  299. package/dist/infrastructure/presets/index.d.ts +14 -0
  300. package/dist/infrastructure/presets/index.d.ts.map +1 -0
  301. package/dist/infrastructure/presets/index.js +24 -0
  302. package/dist/infrastructure/presets/index.js.map +1 -0
  303. package/dist/infrastructure/presets/minio.d.ts +10 -0
  304. package/dist/infrastructure/presets/minio.d.ts.map +1 -0
  305. package/dist/infrastructure/presets/minio.js +60 -0
  306. package/dist/infrastructure/presets/minio.js.map +1 -0
  307. package/dist/infrastructure/presets/postgres.d.ts +9 -0
  308. package/dist/infrastructure/presets/postgres.d.ts.map +1 -0
  309. package/dist/infrastructure/presets/postgres.js +80 -0
  310. package/dist/infrastructure/presets/postgres.js.map +1 -0
  311. package/dist/infrastructure/presets/redis.d.ts +9 -0
  312. package/dist/infrastructure/presets/redis.d.ts.map +1 -0
  313. package/dist/infrastructure/presets/redis.js +32 -0
  314. package/dist/infrastructure/presets/redis.js.map +1 -0
  315. package/dist/infrastructure/presets/registry.d.ts +21 -0
  316. package/dist/infrastructure/presets/registry.d.ts.map +1 -0
  317. package/dist/infrastructure/presets/registry.js +87 -0
  318. package/dist/infrastructure/presets/registry.js.map +1 -0
  319. package/dist/infrastructure/presets/types.d.ts +88 -0
  320. package/dist/infrastructure/presets/types.d.ts.map +1 -0
  321. package/dist/infrastructure/presets/types.js +14 -0
  322. package/dist/infrastructure/presets/types.js.map +1 -0
  323. package/dist/infrastructure/runtime/types.d.ts +35 -0
  324. package/dist/infrastructure/runtime/types.d.ts.map +1 -0
  325. package/dist/infrastructure/runtime/types.js +9 -0
  326. package/dist/infrastructure/runtime/types.js.map +1 -0
  327. package/dist/infrastructure/server-registry.d.ts +16 -0
  328. package/dist/infrastructure/server-registry.d.ts.map +1 -0
  329. package/dist/infrastructure/server-registry.js +45 -0
  330. package/dist/infrastructure/server-registry.js.map +1 -0
  331. package/dist/infrastructure/service-resolver.d.ts +93 -0
  332. package/dist/infrastructure/service-resolver.d.ts.map +1 -0
  333. package/dist/infrastructure/service-resolver.js +419 -0
  334. package/dist/infrastructure/service-resolver.js.map +1 -0
  335. package/dist/infrastructure/stack-infra-manager.d.ts +81 -0
  336. package/dist/infrastructure/stack-infra-manager.d.ts.map +1 -0
  337. package/dist/infrastructure/stack-infra-manager.js +309 -0
  338. package/dist/infrastructure/stack-infra-manager.js.map +1 -0
  339. package/dist/infrastructure/types.d.ts +413 -0
  340. package/dist/infrastructure/types.d.ts.map +1 -0
  341. package/dist/infrastructure/types.js +10 -0
  342. package/dist/infrastructure/types.js.map +1 -0
  343. package/dist/mcp/mcp-bridge.d.ts +21 -0
  344. package/dist/mcp/mcp-bridge.d.ts.map +1 -0
  345. package/dist/mcp/mcp-bridge.js +126 -0
  346. package/dist/mcp/mcp-bridge.js.map +1 -0
  347. package/dist/mcp/tool-groups/apps.tools.d.ts +7 -0
  348. package/dist/mcp/tool-groups/apps.tools.d.ts.map +1 -0
  349. package/dist/mcp/tool-groups/apps.tools.js +104 -0
  350. package/dist/mcp/tool-groups/apps.tools.js.map +1 -0
  351. package/dist/mcp/tool-groups/infra.tools.d.ts +7 -0
  352. package/dist/mcp/tool-groups/infra.tools.d.ts.map +1 -0
  353. package/dist/mcp/tool-groups/infra.tools.js +80 -0
  354. package/dist/mcp/tool-groups/infra.tools.js.map +1 -0
  355. package/dist/mcp/tool-groups/kb.tools.d.ts +7 -0
  356. package/dist/mcp/tool-groups/kb.tools.d.ts.map +1 -0
  357. package/dist/mcp/tool-groups/kb.tools.js +147 -0
  358. package/dist/mcp/tool-groups/kb.tools.js.map +1 -0
  359. package/dist/mcp/tool-groups/management.tools.d.ts +7 -0
  360. package/dist/mcp/tool-groups/management.tools.d.ts.map +1 -0
  361. package/dist/mcp/tool-groups/management.tools.js +263 -0
  362. package/dist/mcp/tool-groups/management.tools.js.map +1 -0
  363. package/dist/mcp/tool-groups/monitoring.tools.d.ts +6 -0
  364. package/dist/mcp/tool-groups/monitoring.tools.d.ts.map +1 -0
  365. package/dist/mcp/tool-groups/monitoring.tools.js +52 -0
  366. package/dist/mcp/tool-groups/monitoring.tools.js.map +1 -0
  367. package/dist/mcp/types.d.ts +23 -0
  368. package/dist/mcp/types.d.ts.map +1 -0
  369. package/dist/mcp/types.js +2 -0
  370. package/dist/mcp/types.js.map +1 -0
  371. package/dist/monitoring/app-health.indicator.d.ts +16 -0
  372. package/dist/monitoring/app-health.indicator.d.ts.map +1 -0
  373. package/dist/monitoring/app-health.indicator.js +45 -0
  374. package/dist/monitoring/app-health.indicator.js.map +1 -0
  375. package/dist/monitoring/docker-health.indicator.d.ts +19 -0
  376. package/dist/monitoring/docker-health.indicator.d.ts.map +1 -0
  377. package/dist/monitoring/docker-health.indicator.js +52 -0
  378. package/dist/monitoring/docker-health.indicator.js.map +1 -0
  379. package/dist/monitoring/health.service.d.ts +14 -0
  380. package/dist/monitoring/health.service.d.ts.map +1 -0
  381. package/dist/monitoring/health.service.js +50 -0
  382. package/dist/monitoring/health.service.js.map +1 -0
  383. package/dist/monitoring/log-manager.d.ts +88 -0
  384. package/dist/monitoring/log-manager.d.ts.map +1 -0
  385. package/dist/monitoring/log-manager.js +353 -0
  386. package/dist/monitoring/log-manager.js.map +1 -0
  387. package/dist/monitoring/metrics.service.d.ts +14 -0
  388. package/dist/monitoring/metrics.service.d.ts.map +1 -0
  389. package/dist/monitoring/metrics.service.js +40 -0
  390. package/dist/monitoring/metrics.service.js.map +1 -0
  391. package/dist/orchestrator/app-handle.d.ts +51 -0
  392. package/dist/orchestrator/app-handle.d.ts.map +1 -0
  393. package/dist/orchestrator/app-handle.js +90 -0
  394. package/dist/orchestrator/app-handle.js.map +1 -0
  395. package/dist/orchestrator/bootstrap-loader.d.ts +36 -0
  396. package/dist/orchestrator/bootstrap-loader.d.ts.map +1 -0
  397. package/dist/orchestrator/bootstrap-loader.js +118 -0
  398. package/dist/orchestrator/bootstrap-loader.js.map +1 -0
  399. package/dist/orchestrator/bootstrap-process.d.ts +73 -0
  400. package/dist/orchestrator/bootstrap-process.d.ts.map +1 -0
  401. package/dist/orchestrator/bootstrap-process.js +342 -0
  402. package/dist/orchestrator/bootstrap-process.js.map +1 -0
  403. package/dist/orchestrator/bootstrap-runner.d.ts +15 -0
  404. package/dist/orchestrator/bootstrap-runner.d.ts.map +1 -0
  405. package/dist/orchestrator/bootstrap-runner.js +152 -0
  406. package/dist/orchestrator/bootstrap-runner.js.map +1 -0
  407. package/dist/orchestrator/build-service.d.ts +70 -0
  408. package/dist/orchestrator/build-service.d.ts.map +1 -0
  409. package/dist/orchestrator/build-service.js +313 -0
  410. package/dist/orchestrator/build-service.js.map +1 -0
  411. package/dist/orchestrator/classic-launcher.d.ts +17 -0
  412. package/dist/orchestrator/classic-launcher.d.ts.map +1 -0
  413. package/dist/orchestrator/classic-launcher.js +111 -0
  414. package/dist/orchestrator/classic-launcher.js.map +1 -0
  415. package/dist/orchestrator/dependency-resolver.d.ts +14 -0
  416. package/dist/orchestrator/dependency-resolver.d.ts.map +1 -0
  417. package/dist/orchestrator/dependency-resolver.js +56 -0
  418. package/dist/orchestrator/dependency-resolver.js.map +1 -0
  419. package/dist/orchestrator/file-watcher.d.ts +53 -0
  420. package/dist/orchestrator/file-watcher.d.ts.map +1 -0
  421. package/dist/orchestrator/file-watcher.js +307 -0
  422. package/dist/orchestrator/file-watcher.js.map +1 -0
  423. package/dist/orchestrator/module-worker-process.d.ts +37 -0
  424. package/dist/orchestrator/module-worker-process.d.ts.map +1 -0
  425. package/dist/orchestrator/module-worker-process.js +187 -0
  426. package/dist/orchestrator/module-worker-process.js.map +1 -0
  427. package/dist/orchestrator/orchestrator.service.d.ts +170 -0
  428. package/dist/orchestrator/orchestrator.service.d.ts.map +1 -0
  429. package/dist/orchestrator/orchestrator.service.js +1146 -0
  430. package/dist/orchestrator/orchestrator.service.js.map +1 -0
  431. package/dist/orchestrator/service-router.d.ts +78 -0
  432. package/dist/orchestrator/service-router.d.ts.map +1 -0
  433. package/dist/orchestrator/service-router.js +148 -0
  434. package/dist/orchestrator/service-router.js.map +1 -0
  435. package/dist/orchestrator/topology-proxy.d.ts +65 -0
  436. package/dist/orchestrator/topology-proxy.d.ts.map +1 -0
  437. package/dist/orchestrator/topology-proxy.js +209 -0
  438. package/dist/orchestrator/topology-proxy.js.map +1 -0
  439. package/dist/orchestrator/topology-relay.d.ts +111 -0
  440. package/dist/orchestrator/topology-relay.d.ts.map +1 -0
  441. package/dist/orchestrator/topology-relay.js +255 -0
  442. package/dist/orchestrator/topology-relay.js.map +1 -0
  443. package/dist/orchestrator/ts-compiler.d.ts +55 -0
  444. package/dist/orchestrator/ts-compiler.d.ts.map +1 -0
  445. package/dist/orchestrator/ts-compiler.js +166 -0
  446. package/dist/orchestrator/ts-compiler.js.map +1 -0
  447. package/dist/project/artifact-builder.d.ts +63 -0
  448. package/dist/project/artifact-builder.d.ts.map +1 -0
  449. package/dist/project/artifact-builder.js +193 -0
  450. package/dist/project/artifact-builder.js.map +1 -0
  451. package/dist/project/config-resolver.d.ts +110 -0
  452. package/dist/project/config-resolver.d.ts.map +1 -0
  453. package/dist/project/config-resolver.js +563 -0
  454. package/dist/project/config-resolver.js.map +1 -0
  455. package/dist/project/dependency-analyzer.d.ts +53 -0
  456. package/dist/project/dependency-analyzer.d.ts.map +1 -0
  457. package/dist/project/dependency-analyzer.js +135 -0
  458. package/dist/project/dependency-analyzer.js.map +1 -0
  459. package/dist/project/index.d.ts +10 -0
  460. package/dist/project/index.d.ts.map +1 -0
  461. package/dist/project/index.js +6 -0
  462. package/dist/project/index.js.map +1 -0
  463. package/dist/project/registry.d.ts +28 -0
  464. package/dist/project/registry.d.ts.map +1 -0
  465. package/dist/project/registry.js +117 -0
  466. package/dist/project/registry.js.map +1 -0
  467. package/dist/project/requirements-scanner.d.ts +65 -0
  468. package/dist/project/requirements-scanner.d.ts.map +1 -0
  469. package/dist/project/requirements-scanner.js +217 -0
  470. package/dist/project/requirements-scanner.js.map +1 -0
  471. package/dist/services/alert.rpc-service.d.ts +41 -0
  472. package/dist/services/alert.rpc-service.d.ts.map +1 -0
  473. package/dist/services/alert.rpc-service.js +102 -0
  474. package/dist/services/alert.rpc-service.js.map +1 -0
  475. package/dist/services/alert.service.d.ts +83 -0
  476. package/dist/services/alert.service.d.ts.map +1 -0
  477. package/dist/services/alert.service.js +277 -0
  478. package/dist/services/alert.service.js.map +1 -0
  479. package/dist/services/auth-context.d.ts +39 -0
  480. package/dist/services/auth-context.d.ts.map +1 -0
  481. package/dist/services/auth-context.js +66 -0
  482. package/dist/services/auth-context.js.map +1 -0
  483. package/dist/services/auth-middleware.d.ts +47 -0
  484. package/dist/services/auth-middleware.d.ts.map +1 -0
  485. package/dist/services/auth-middleware.js +158 -0
  486. package/dist/services/auth-middleware.js.map +1 -0
  487. package/dist/services/auth.rpc-service.d.ts +61 -0
  488. package/dist/services/auth.rpc-service.d.ts.map +1 -0
  489. package/dist/services/auth.rpc-service.js +131 -0
  490. package/dist/services/auth.rpc-service.js.map +1 -0
  491. package/dist/services/auth.service.d.ts +70 -0
  492. package/dist/services/auth.service.d.ts.map +1 -0
  493. package/dist/services/auth.service.js +310 -0
  494. package/dist/services/auth.service.js.map +1 -0
  495. package/dist/services/backup.rpc-service.d.ts +37 -0
  496. package/dist/services/backup.rpc-service.d.ts.map +1 -0
  497. package/dist/services/backup.rpc-service.js +85 -0
  498. package/dist/services/backup.rpc-service.js.map +1 -0
  499. package/dist/services/backup.service.d.ts +45 -0
  500. package/dist/services/backup.service.d.ts.map +1 -0
  501. package/dist/services/backup.service.js +299 -0
  502. package/dist/services/backup.service.js.map +1 -0
  503. package/dist/services/deploy.rpc-service.d.ts +26 -0
  504. package/dist/services/deploy.rpc-service.d.ts.map +1 -0
  505. package/dist/services/deploy.rpc-service.js +61 -0
  506. package/dist/services/deploy.rpc-service.js.map +1 -0
  507. package/dist/services/deploy.service.d.ts +85 -0
  508. package/dist/services/deploy.service.d.ts.map +1 -0
  509. package/dist/services/deploy.service.js +269 -0
  510. package/dist/services/deploy.service.js.map +1 -0
  511. package/dist/services/discovery.rpc-service.d.ts +16 -0
  512. package/dist/services/discovery.rpc-service.d.ts.map +1 -0
  513. package/dist/services/discovery.rpc-service.js +55 -0
  514. package/dist/services/discovery.rpc-service.js.map +1 -0
  515. package/dist/services/discovery.service.d.ts +43 -0
  516. package/dist/services/discovery.service.d.ts.map +1 -0
  517. package/dist/services/discovery.service.js +178 -0
  518. package/dist/services/discovery.service.js.map +1 -0
  519. package/dist/services/environment.rpc-service.d.ts +22 -0
  520. package/dist/services/environment.rpc-service.d.ts.map +1 -0
  521. package/dist/services/environment.rpc-service.js +65 -0
  522. package/dist/services/environment.rpc-service.js.map +1 -0
  523. package/dist/services/environment.service.d.ts +87 -0
  524. package/dist/services/environment.service.d.ts.map +1 -0
  525. package/dist/services/environment.service.js +220 -0
  526. package/dist/services/environment.service.js.map +1 -0
  527. package/dist/services/event-broadcaster.rpc-service.d.ts +44 -0
  528. package/dist/services/event-broadcaster.rpc-service.d.ts.map +1 -0
  529. package/dist/services/event-broadcaster.rpc-service.js +84 -0
  530. package/dist/services/event-broadcaster.rpc-service.js.map +1 -0
  531. package/dist/services/event-broadcaster.service.d.ts +42 -0
  532. package/dist/services/event-broadcaster.service.d.ts.map +1 -0
  533. package/dist/services/event-broadcaster.service.js +87 -0
  534. package/dist/services/event-broadcaster.service.js.map +1 -0
  535. package/dist/services/fleet.rpc-service.d.ts +37 -0
  536. package/dist/services/fleet.rpc-service.d.ts.map +1 -0
  537. package/dist/services/fleet.rpc-service.js +104 -0
  538. package/dist/services/fleet.rpc-service.js.map +1 -0
  539. package/dist/services/fleet.service.d.ts +104 -0
  540. package/dist/services/fleet.service.d.ts.map +1 -0
  541. package/dist/services/fleet.service.js +243 -0
  542. package/dist/services/fleet.service.js.map +1 -0
  543. package/dist/services/health-check.rpc-service.d.ts +18 -0
  544. package/dist/services/health-check.rpc-service.d.ts.map +1 -0
  545. package/dist/services/health-check.rpc-service.js +64 -0
  546. package/dist/services/health-check.rpc-service.js.map +1 -0
  547. package/dist/services/health-check.service.d.ts +53 -0
  548. package/dist/services/health-check.service.d.ts.map +1 -0
  549. package/dist/services/health-check.service.js +232 -0
  550. package/dist/services/health-check.service.js.map +1 -0
  551. package/dist/services/infrastructure.rpc-service.d.ts +18 -0
  552. package/dist/services/infrastructure.rpc-service.d.ts.map +1 -0
  553. package/dist/services/infrastructure.rpc-service.js +64 -0
  554. package/dist/services/infrastructure.rpc-service.js.map +1 -0
  555. package/dist/services/kubernetes.rpc-service.d.ts +54 -0
  556. package/dist/services/kubernetes.rpc-service.d.ts.map +1 -0
  557. package/dist/services/kubernetes.rpc-service.js +112 -0
  558. package/dist/services/kubernetes.rpc-service.js.map +1 -0
  559. package/dist/services/kubernetes.service.d.ts +71 -0
  560. package/dist/services/kubernetes.service.d.ts.map +1 -0
  561. package/dist/services/kubernetes.service.js +244 -0
  562. package/dist/services/kubernetes.service.js.map +1 -0
  563. package/dist/services/log-collector.rpc-service.d.ts +38 -0
  564. package/dist/services/log-collector.rpc-service.d.ts.map +1 -0
  565. package/dist/services/log-collector.rpc-service.js +74 -0
  566. package/dist/services/log-collector.rpc-service.js.map +1 -0
  567. package/dist/services/log-collector.service.d.ts +96 -0
  568. package/dist/services/log-collector.service.d.ts.map +1 -0
  569. package/dist/services/log-collector.service.js +303 -0
  570. package/dist/services/log-collector.service.js.map +1 -0
  571. package/dist/services/metrics-collector.service.d.ts +103 -0
  572. package/dist/services/metrics-collector.service.d.ts.map +1 -0
  573. package/dist/services/metrics-collector.service.js +235 -0
  574. package/dist/services/metrics-collector.service.js.map +1 -0
  575. package/dist/services/metrics.rpc-service.d.ts +41 -0
  576. package/dist/services/metrics.rpc-service.d.ts.map +1 -0
  577. package/dist/services/metrics.rpc-service.js +90 -0
  578. package/dist/services/metrics.rpc-service.js.map +1 -0
  579. package/dist/services/metrics.service.d.ts +72 -0
  580. package/dist/services/metrics.service.d.ts.map +1 -0
  581. package/dist/services/metrics.service.js +185 -0
  582. package/dist/services/metrics.service.js.map +1 -0
  583. package/dist/services/netron-telemetry-transport.d.ts +42 -0
  584. package/dist/services/netron-telemetry-transport.d.ts.map +1 -0
  585. package/dist/services/netron-telemetry-transport.js +97 -0
  586. package/dist/services/netron-telemetry-transport.js.map +1 -0
  587. package/dist/services/node-health.repository.d.ts +65 -0
  588. package/dist/services/node-health.repository.d.ts.map +1 -0
  589. package/dist/services/node-health.repository.js +132 -0
  590. package/dist/services/node-health.repository.js.map +1 -0
  591. package/dist/services/node-manager.rpc-service.d.ts +66 -0
  592. package/dist/services/node-manager.rpc-service.d.ts.map +1 -0
  593. package/dist/services/node-manager.rpc-service.js +229 -0
  594. package/dist/services/node-manager.rpc-service.js.map +1 -0
  595. package/dist/services/node-manager.service.d.ts +149 -0
  596. package/dist/services/node-manager.service.d.ts.map +1 -0
  597. package/dist/services/node-manager.service.js +547 -0
  598. package/dist/services/node-manager.service.js.map +1 -0
  599. package/dist/services/pipeline.rpc-service.d.ts +37 -0
  600. package/dist/services/pipeline.rpc-service.d.ts.map +1 -0
  601. package/dist/services/pipeline.rpc-service.js +102 -0
  602. package/dist/services/pipeline.rpc-service.js.map +1 -0
  603. package/dist/services/pipeline.service.d.ts +77 -0
  604. package/dist/services/pipeline.service.d.ts.map +1 -0
  605. package/dist/services/pipeline.service.js +278 -0
  606. package/dist/services/pipeline.service.js.map +1 -0
  607. package/dist/services/project.rpc-service.d.ts +73 -0
  608. package/dist/services/project.rpc-service.d.ts.map +1 -0
  609. package/dist/services/project.rpc-service.js +184 -0
  610. package/dist/services/project.rpc-service.js.map +1 -0
  611. package/dist/services/project.service.d.ts +123 -0
  612. package/dist/services/project.service.d.ts.map +1 -0
  613. package/dist/services/project.service.js +1112 -0
  614. package/dist/services/project.service.js.map +1 -0
  615. package/dist/services/remote-deployer.service.d.ts +85 -0
  616. package/dist/services/remote-deployer.service.d.ts.map +1 -0
  617. package/dist/services/remote-deployer.service.js +332 -0
  618. package/dist/services/remote-deployer.service.js.map +1 -0
  619. package/dist/services/remote-ops.service.d.ts +72 -0
  620. package/dist/services/remote-ops.service.d.ts.map +1 -0
  621. package/dist/services/remote-ops.service.js +132 -0
  622. package/dist/services/remote-ops.service.js.map +1 -0
  623. package/dist/services/secrets.rpc-service.d.ts +45 -0
  624. package/dist/services/secrets.rpc-service.d.ts.map +1 -0
  625. package/dist/services/secrets.rpc-service.js +81 -0
  626. package/dist/services/secrets.rpc-service.js.map +1 -0
  627. package/dist/services/secrets.service.d.ts +57 -0
  628. package/dist/services/secrets.service.d.ts.map +1 -0
  629. package/dist/services/secrets.service.js +211 -0
  630. package/dist/services/secrets.service.js.map +1 -0
  631. package/dist/services/slave-storage.service.d.ts +69 -0
  632. package/dist/services/slave-storage.service.d.ts.map +1 -0
  633. package/dist/services/slave-storage.service.js +131 -0
  634. package/dist/services/slave-storage.service.js.map +1 -0
  635. package/dist/services/sync.rpc-service.d.ts +37 -0
  636. package/dist/services/sync.rpc-service.d.ts.map +1 -0
  637. package/dist/services/sync.rpc-service.js +72 -0
  638. package/dist/services/sync.rpc-service.js.map +1 -0
  639. package/dist/services/sync.service.d.ts +121 -0
  640. package/dist/services/sync.service.d.ts.map +1 -0
  641. package/dist/services/sync.service.js +440 -0
  642. package/dist/services/sync.service.js.map +1 -0
  643. package/dist/services/system-info.rpc-service.d.ts +12 -0
  644. package/dist/services/system-info.rpc-service.d.ts.map +1 -0
  645. package/dist/services/system-info.rpc-service.js +37 -0
  646. package/dist/services/system-info.rpc-service.js.map +1 -0
  647. package/dist/services/system-info.service.d.ts +89 -0
  648. package/dist/services/system-info.service.d.ts.map +1 -0
  649. package/dist/services/system-info.service.js +151 -0
  650. package/dist/services/system-info.service.js.map +1 -0
  651. package/dist/services/telemetry.rpc-service.d.ts +27 -0
  652. package/dist/services/telemetry.rpc-service.d.ts.map +1 -0
  653. package/dist/services/telemetry.rpc-service.js +56 -0
  654. package/dist/services/telemetry.rpc-service.js.map +1 -0
  655. package/dist/services/telemetry.service.d.ts +31 -0
  656. package/dist/services/telemetry.service.d.ts.map +1 -0
  657. package/dist/services/telemetry.service.js +134 -0
  658. package/dist/services/telemetry.service.js.map +1 -0
  659. package/dist/services/trace-collector.rpc-service.d.ts +24 -0
  660. package/dist/services/trace-collector.rpc-service.d.ts.map +1 -0
  661. package/dist/services/trace-collector.rpc-service.js +75 -0
  662. package/dist/services/trace-collector.rpc-service.js.map +1 -0
  663. package/dist/services/trace-collector.service.d.ts +76 -0
  664. package/dist/services/trace-collector.service.d.ts.map +1 -0
  665. package/dist/services/trace-collector.service.js +201 -0
  666. package/dist/services/trace-collector.service.js.map +1 -0
  667. package/dist/shared/dto/project.d.ts +156 -0
  668. package/dist/shared/dto/project.d.ts.map +1 -0
  669. package/dist/shared/dto/project.js +8 -0
  670. package/dist/shared/dto/project.js.map +1 -0
  671. package/dist/shared/dto/services.d.ts +254 -0
  672. package/dist/shared/dto/services.d.ts.map +1 -0
  673. package/dist/shared/dto/services.js +7 -0
  674. package/dist/shared/dto/services.js.map +1 -0
  675. package/dist/shared/dto/types.d.ts +5 -0
  676. package/dist/shared/dto/types.d.ts.map +1 -0
  677. package/dist/shared/dto/types.js +5 -0
  678. package/dist/shared/dto/types.js.map +1 -0
  679. package/dist/shared/events.d.ts +215 -0
  680. package/dist/shared/events.d.ts.map +1 -0
  681. package/dist/shared/events.js +101 -0
  682. package/dist/shared/events.js.map +1 -0
  683. package/dist/shared/format.d.ts +18 -0
  684. package/dist/shared/format.d.ts.map +1 -0
  685. package/dist/shared/format.js +93 -0
  686. package/dist/shared/format.js.map +1 -0
  687. package/dist/shared/roles.d.ts +31 -0
  688. package/dist/shared/roles.d.ts.map +1 -0
  689. package/dist/shared/roles.js +39 -0
  690. package/dist/shared/roles.js.map +1 -0
  691. package/dist/shared/tokens.d.ts +70 -0
  692. package/dist/shared/tokens.d.ts.map +1 -0
  693. package/dist/shared/tokens.js +46 -0
  694. package/dist/shared/tokens.js.map +1 -0
  695. package/dist/shared/xec-loader.d.ts +17 -0
  696. package/dist/shared/xec-loader.d.ts.map +1 -0
  697. package/dist/shared/xec-loader.js +41 -0
  698. package/dist/shared/xec-loader.js.map +1 -0
  699. package/dist/supervisor/omnitron-supervisor.d.ts +21 -0
  700. package/dist/supervisor/omnitron-supervisor.d.ts.map +1 -0
  701. package/dist/supervisor/omnitron-supervisor.js +43 -0
  702. package/dist/supervisor/omnitron-supervisor.js.map +1 -0
  703. package/dist/supervisor/restart-policy.d.ts +11 -0
  704. package/dist/supervisor/restart-policy.d.ts.map +1 -0
  705. package/dist/supervisor/restart-policy.js +33 -0
  706. package/dist/supervisor/restart-policy.js.map +1 -0
  707. package/dist/webapp/static-server.d.ts +24 -0
  708. package/dist/webapp/static-server.d.ts.map +1 -0
  709. package/dist/webapp/static-server.js +152 -0
  710. package/dist/webapp/static-server.js.map +1 -0
  711. package/dist/webapp/webapp.service.d.ts +55 -0
  712. package/dist/webapp/webapp.service.d.ts.map +1 -0
  713. package/dist/webapp/webapp.service.js +233 -0
  714. package/dist/webapp/webapp.service.js.map +1 -0
  715. package/dist/workers/health-monitor-process.d.ts +41 -0
  716. package/dist/workers/health-monitor-process.d.ts.map +1 -0
  717. package/dist/workers/health-monitor-process.js +128 -0
  718. package/dist/workers/health-monitor-process.js.map +1 -0
  719. package/dist/workers/health-monitor.module.d.ts +11 -0
  720. package/dist/workers/health-monitor.module.d.ts.map +1 -0
  721. package/dist/workers/health-monitor.module.js +29 -0
  722. package/dist/workers/health-monitor.module.js.map +1 -0
  723. package/dist/workers/health-monitor.service.d.ts +55 -0
  724. package/dist/workers/health-monitor.service.d.ts.map +1 -0
  725. package/dist/workers/health-monitor.service.js +402 -0
  726. package/dist/workers/health-monitor.service.js.map +1 -0
  727. package/dist/workers/system-worker-manager.d.ts +47 -0
  728. package/dist/workers/system-worker-manager.d.ts.map +1 -0
  729. package/dist/workers/system-worker-manager.js +98 -0
  730. package/dist/workers/system-worker-manager.js.map +1 -0
  731. package/dist/workers/types.d.ts +80 -0
  732. package/dist/workers/types.d.ts.map +1 -0
  733. package/dist/workers/types.js +8 -0
  734. package/dist/workers/types.js.map +1 -0
  735. package/package.json +85 -0
  736. package/webapp/dist/assets/Chip-BySxTjyN.js +1 -0
  737. package/webapp/dist/assets/DialogContentText-YQWiAVrU.js +1 -0
  738. package/webapp/dist/assets/DialogTitle-CDkgUIwp.js +1 -0
  739. package/webapp/dist/assets/FormControlLabel-Bu3CCsBM.js +1 -0
  740. package/webapp/dist/assets/Grid-BFY8hAzL.js +1 -0
  741. package/webapp/dist/assets/InputAdornment-_Dayk-3y.js +3 -0
  742. package/webapp/dist/assets/Skeleton-BGj6Sw8m.js +37 -0
  743. package/webapp/dist/assets/Switch-CA6682vv.js +1 -0
  744. package/webapp/dist/assets/TableContainer-4epq10KJ.js +1 -0
  745. package/webapp/dist/assets/TextField-C73KHMVN.js +1 -0
  746. package/webapp/dist/assets/alerts-JEQALS7Y.js +1 -0
  747. package/webapp/dist/assets/apps-DMPysEKB.js +1 -0
  748. package/webapp/dist/assets/client-DlGPter5.js +110 -0
  749. package/webapp/dist/assets/constants-DqFQJ27U.js +1 -0
  750. package/webapp/dist/assets/containers-CvkC7do8.js +1 -0
  751. package/webapp/dist/assets/dashboard-C0Fre9pC.js +1 -0
  752. package/webapp/dist/assets/dashboard-builder-DAghqdpE.js +1 -0
  753. package/webapp/dist/assets/deployments-Cg1lI1uT.js +1 -0
  754. package/webapp/dist/assets/detail-CyFtEson.js +1 -0
  755. package/webapp/dist/assets/detail-DqoSGKT1.js +8 -0
  756. package/webapp/dist/assets/formatters-J3Xqn6BQ.js +1 -0
  757. package/webapp/dist/assets/fs-uP8eiZAR.js +1 -0
  758. package/webapp/dist/assets/icons-ynIWYfBP.js +3 -0
  759. package/webapp/dist/assets/index-CHVXOsTS.css +1 -0
  760. package/webapp/dist/assets/index-vKrDmEA_.js +259 -0
  761. package/webapp/dist/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  762. package/webapp/dist/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  763. package/webapp/dist/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  764. package/webapp/dist/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  765. package/webapp/dist/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  766. package/webapp/dist/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  767. package/webapp/dist/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
  768. package/webapp/dist/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
  769. package/webapp/dist/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  770. package/webapp/dist/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  771. package/webapp/dist/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  772. package/webapp/dist/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  773. package/webapp/dist/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  774. package/webapp/dist/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  775. package/webapp/dist/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
  776. package/webapp/dist/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
  777. package/webapp/dist/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  778. package/webapp/dist/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  779. package/webapp/dist/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  780. package/webapp/dist/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  781. package/webapp/dist/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  782. package/webapp/dist/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  783. package/webapp/dist/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
  784. package/webapp/dist/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
  785. package/webapp/dist/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  786. package/webapp/dist/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  787. package/webapp/dist/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  788. package/webapp/dist/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  789. package/webapp/dist/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  790. package/webapp/dist/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  791. package/webapp/dist/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
  792. package/webapp/dist/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
  793. package/webapp/dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  794. package/webapp/dist/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  795. package/webapp/dist/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  796. package/webapp/dist/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  797. package/webapp/dist/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  798. package/webapp/dist/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  799. package/webapp/dist/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  800. package/webapp/dist/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  801. package/webapp/dist/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  802. package/webapp/dist/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  803. package/webapp/dist/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  804. package/webapp/dist/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  805. package/webapp/dist/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  806. package/webapp/dist/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  807. package/webapp/dist/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
  808. package/webapp/dist/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
  809. package/webapp/dist/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  810. package/webapp/dist/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  811. package/webapp/dist/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  812. package/webapp/dist/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  813. package/webapp/dist/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  814. package/webapp/dist/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  815. package/webapp/dist/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
  816. package/webapp/dist/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
  817. package/webapp/dist/assets/isMuiElement-BRL3YuCT.js +1 -0
  818. package/webapp/dist/assets/logs-IovIij1C.js +11 -0
  819. package/webapp/dist/assets/metrics-Dufwtwjq.js +1 -0
  820. package/webapp/dist/assets/nodes-Brvu8W3j.js +7 -0
  821. package/webapp/dist/assets/pipelines-t40X4MuC.js +4 -0
  822. package/webapp/dist/assets/prop-types-CvVtHxp4.js +1 -0
  823. package/webapp/dist/assets/react-apexcharts.esm-CLO6gala.js +954 -0
  824. package/webapp/dist/assets/settings-DTAIST3v.js +1 -0
  825. package/webapp/dist/assets/sign-in-DQEAkJum.js +1 -0
  826. package/webapp/dist/assets/stacks-BjM1f45N.js +1 -0
  827. package/webapp/dist/assets/system-info-BQSbSEK-.js +1 -0
  828. package/webapp/dist/assets/topology-6N8-Az_Z.js +12 -0
  829. package/webapp/dist/assets/topology-CHpVij2M.css +1 -0
  830. package/webapp/dist/assets/traces-DVXyb-4m.js +1 -0
  831. package/webapp/dist/assets/use-stack-context-CbE8fxBA.js +1 -0
  832. package/webapp/dist/favicon.png +0 -0
  833. package/webapp/dist/index.html +19 -0
  834. package/webapp/dist/logo.svg +80 -0
@@ -0,0 +1,1146 @@
1
+ /**
2
+ * OrchestratorService — Core orchestration logic
3
+ *
4
+ * Thin orchestration layer over Titan PM module's ProcessSupervisor:
5
+ *
6
+ * Bootstrap mode:
7
+ * - Each app gets a ProcessSupervisor via pm.supervisor(config)
8
+ * - Supervisor manages all child lifecycle: spawn, health, metrics, crash recovery, restart
9
+ * - Single or multi-instance (pool) — configured via ISupervisorChildConfig
10
+ * - Scaling delegates to supervisor.scaleChild()
11
+ *
12
+ * Classic mode:
13
+ * - child_process.fork() with manual exit handling (legacy compat)
14
+ * - Real CPU/memory metrics via pidusage
15
+ *
16
+ * Architecture:
17
+ * pm.supervisor({ children: [{ process: bootstrap-process.js, ... }] })
18
+ * → ProcessSupervisor.fromConfig() → pm.spawn() or pm.pool() per child
19
+ * → fork-worker.js → worker-runtime.js → BootstrapProcess.init(...)
20
+ * → Full Titan Application inside each worker
21
+ * → Two Netron instances: PM management plane + app HTTP data plane
22
+ */
23
+ import fs from 'node:fs';
24
+ import path from 'node:path';
25
+ import { fileURLToPath } from 'node:url';
26
+ import { PoolStrategy, SupervisionStrategy, RestartDecision, } from '@omnitron-dev/titan-pm';
27
+ import { EventEmitter } from '@omnitron-dev/eventemitter';
28
+ import { AppHandle } from './app-handle.js';
29
+ import { launchClassic } from './classic-launcher.js';
30
+ import { resolveStartupOrder, resolveShutdownOrder } from './dependency-resolver.js';
31
+ import { buildRestartPolicy } from '../supervisor/restart-policy.js';
32
+ import { ServiceRouter } from './service-router.js';
33
+ import { loadBootstrapConfig, clearCacheFor } from './bootstrap-loader.js';
34
+ import { BuildService } from './build-service.js';
35
+ import { CLI_VERSION } from '../config/defaults.js';
36
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
37
+ // Resolve bootstrap-process path — .ts in dev (tsx), .js when compiled
38
+ function resolveBootstrapProcessPath() {
39
+ const jsPath = path.join(__dirname, 'bootstrap-process.js');
40
+ if (fs.existsSync(jsPath))
41
+ return jsPath;
42
+ const tsPath = path.join(__dirname, 'bootstrap-process.ts');
43
+ if (fs.existsSync(tsPath))
44
+ return tsPath;
45
+ return jsPath;
46
+ }
47
+ const BOOTSTRAP_PROCESS_PATH = resolveBootstrapProcessPath();
48
+ function mapStrategy(strategy) {
49
+ switch (strategy) {
50
+ case 'one_for_all':
51
+ return SupervisionStrategy.ONE_FOR_ALL;
52
+ case 'rest_for_one':
53
+ return SupervisionStrategy.REST_FOR_ONE;
54
+ default:
55
+ return SupervisionStrategy.ONE_FOR_ONE;
56
+ }
57
+ }
58
+ export class OrchestratorService extends EventEmitter {
59
+ logger;
60
+ pm;
61
+ stateStore;
62
+ handles = new Map();
63
+ config = null;
64
+ cwd;
65
+ metricsTimer = null;
66
+ appLogHandlers = [];
67
+ /** Dev mode — when true, child processes are bundled from source .ts via esbuild */
68
+ devMode = false;
69
+ /** esbuild bundling pipeline — pre-bundles TS entry points for child processes */
70
+ buildService = null;
71
+ /** Cached build results per app name */
72
+ buildResults = new Map();
73
+ /** Daemon's Netron instance for native service routing */
74
+ daemonNetron = null;
75
+ /** Daemon Unix socket path for child-to-daemon Netron connections */
76
+ daemonSocketPath = null;
77
+ constructor(logger, pm, stateStore, cwd) {
78
+ super();
79
+ this.logger = logger;
80
+ this.pm = pm;
81
+ this.stateStore = stateStore;
82
+ this.cwd = cwd ?? process.cwd();
83
+ }
84
+ /**
85
+ * Set the daemon Netron instance and socket path for native topology routing.
86
+ * Called by the daemon after start when Netron is available.
87
+ */
88
+ setDaemonNetron(netron, socketPath) {
89
+ this.daemonNetron = netron;
90
+ this.daemonSocketPath = socketPath;
91
+ this.logger.info({ socketPath }, 'Daemon Netron set for native topology routing');
92
+ }
93
+ // ============================================================================
94
+ // Lifecycle
95
+ // ============================================================================
96
+ async startAll(config) {
97
+ this.config = config;
98
+ for (const batch of resolveStartupOrder(config.apps)) {
99
+ const enabled = batch.filter((e) => e.enabled !== false);
100
+ await Promise.all(enabled.map(async (e) => {
101
+ try {
102
+ await this.startApp(e, config);
103
+ }
104
+ catch (err) {
105
+ this.logger.error({ app: e.name, error: err.message }, 'Failed to start app — continuing with remaining apps');
106
+ }
107
+ }));
108
+ }
109
+ this.startMetricsPolling(config.monitoring.metrics.interval);
110
+ this.persistState();
111
+ }
112
+ async startApp(entry, config) {
113
+ // Persist ecosystem config for restartApp — stack mode passes config per-app,
114
+ // but restartApp calls startApp without it.
115
+ if (config && !this.config) {
116
+ this.config = config;
117
+ }
118
+ const cfg = config ?? this.config;
119
+ if (!cfg)
120
+ throw new Error('Ecosystem config not loaded');
121
+ const existing = this.handles.get(entry.name);
122
+ if (existing && existing.status === 'online') {
123
+ this.logger.warn({ app: entry.name }, 'App already running');
124
+ return existing;
125
+ }
126
+ const mode = entry.bootstrap ? 'bootstrap' : 'classic';
127
+ const handle = new AppHandle(entry, mode);
128
+ this.handles.set(entry.name, handle);
129
+ this.logger.info({ app: entry.name, mode }, 'Starting app');
130
+ try {
131
+ if (mode === 'classic') {
132
+ await this.launchClassicMode(entry, handle, cfg);
133
+ }
134
+ else {
135
+ await this.launchBootstrapMode(entry, handle, cfg);
136
+ }
137
+ this.logger.info({ app: entry.name, pid: handle.pid, mode }, 'App started');
138
+ this.persistState();
139
+ return handle;
140
+ }
141
+ catch (err) {
142
+ handle.markErrored();
143
+ this.persistState();
144
+ throw err;
145
+ }
146
+ }
147
+ async stopApp(name, force = false, timeout = 10_000) {
148
+ const handle = this.handles.get(name);
149
+ if (!handle || handle.status === 'stopped')
150
+ return;
151
+ handle.markStopping();
152
+ // Unexpose topology services from daemon Netron before stopping processes
153
+ if (handle.serviceRouter) {
154
+ try {
155
+ for (const svcName of handle.serviceRouter.getServiceNames()) {
156
+ await handle.serviceRouter.unexposeService(svcName);
157
+ }
158
+ }
159
+ catch {
160
+ // Best-effort cleanup
161
+ }
162
+ handle.serviceRouter = null;
163
+ }
164
+ if (handle.mode === 'bootstrap' && handle.supervisor) {
165
+ await handle.supervisor.stop();
166
+ }
167
+ else if (handle.childProcess) {
168
+ await this.stopChildProcess(handle, force, timeout);
169
+ }
170
+ handle.markStopped();
171
+ this.persistState();
172
+ this.logger.info({ app: name }, 'App stopped');
173
+ }
174
+ async stopAll(force = false) {
175
+ if (!this.config)
176
+ return 0;
177
+ if (this.metricsTimer) {
178
+ clearInterval(this.metricsTimer);
179
+ this.metricsTimer = null;
180
+ }
181
+ let count = 0;
182
+ // When force=true (daemon shutdown), use short timeout per app (3s SIGTERM, then SIGKILL)
183
+ const perAppTimeout = force ? 3_000 : 10_000;
184
+ for (const batch of resolveShutdownOrder(this.config.apps)) {
185
+ await Promise.all(batch.map(async (entry) => {
186
+ try {
187
+ await this.stopApp(entry.name, force, perAppTimeout);
188
+ count++;
189
+ }
190
+ catch (err) {
191
+ this.logger.error({ app: entry.name, error: err.message }, 'Failed to stop');
192
+ }
193
+ }));
194
+ }
195
+ try {
196
+ await this.pm.shutdown({ force, timeout: force ? 5_000 : 30_000 });
197
+ }
198
+ catch {
199
+ /* PM may have nothing left to clean up */
200
+ }
201
+ // Dispose esbuild watch contexts
202
+ if (this.buildService) {
203
+ try {
204
+ await this.buildService.dispose();
205
+ }
206
+ catch { /* best-effort */ }
207
+ this.buildService = null;
208
+ }
209
+ this.buildResults.clear();
210
+ return count;
211
+ }
212
+ async restartApp(name) {
213
+ const handle = this.handles.get(name);
214
+ if (!handle)
215
+ throw new Error(`Unknown app: ${name}`);
216
+ const entry = handle.entry;
217
+ // In dev mode, clear bootstrap config cache so topology changes are picked up
218
+ if (this.devMode && entry.bootstrap) {
219
+ clearCacheFor(path.resolve(this.cwd, entry.bootstrap));
220
+ // Stop esbuild watch and clear stale build result — launchBootstrapMode will rebuild + re-watch
221
+ if (this.buildService) {
222
+ await this.buildService.unwatchApp(name);
223
+ }
224
+ this.buildResults.delete(name);
225
+ }
226
+ await this.stopApp(name);
227
+ return this.startApp(entry);
228
+ }
229
+ /**
230
+ * Resolve raw app name to its handle key.
231
+ * In stack mode, handles are namespaced (e.g., 'omni/dev/main' for app 'main').
232
+ * This finds the handle whose key ends with the raw app name.
233
+ */
234
+ resolveAppName(rawName) {
235
+ if (this.handles.has(rawName))
236
+ return rawName;
237
+ for (const key of this.handles.keys()) {
238
+ if (key.endsWith(`/${rawName}`))
239
+ return key;
240
+ }
241
+ return undefined;
242
+ }
243
+ /**
244
+ * Reload app with zero-downtime strategy:
245
+ * 1. Fork new process(es) with same config
246
+ * 2. Wait for new process to report 'ready'
247
+ * 3. Stop old process (drain in-flight requests)
248
+ * 4. If new process fails, keep old one and report error
249
+ *
250
+ * Falls back to regular restart for classic mode apps or when
251
+ * zero-downtime is not possible (single-process, no supervisor).
252
+ */
253
+ async reloadApp(name) {
254
+ const handle = this.handles.get(name);
255
+ if (!handle)
256
+ throw new Error(`Unknown app: ${name}`);
257
+ // Classic mode or no supervisor — cannot do zero-downtime, fall back to restart
258
+ if (handle.mode !== 'bootstrap' || !handle.supervisor) {
259
+ return this.restartApp(name);
260
+ }
261
+ const childNames = handle.supervisor.getChildNames();
262
+ if (childNames.length === 0) {
263
+ return this.restartApp(name);
264
+ }
265
+ this.logger.info({ app: name, children: childNames.length }, 'Zero-downtime reload starting');
266
+ // For each child process, do a rolling restart via the supervisor.
267
+ // The supervisor's restartChild stops the old child and starts a new one.
268
+ // For pool children, the pool handles draining automatically.
269
+ // We restart one child at a time to maintain availability.
270
+ for (const childName of childNames) {
271
+ this.logger.info({ app: name, child: childName }, 'Reloading child process');
272
+ try {
273
+ await handle.supervisor.restartChild(childName);
274
+ // Wait for the new child to become healthy
275
+ const health = await this.waitForChildHealth(handle, childName, 30_000);
276
+ if (!health) {
277
+ this.logger.warn({ app: name, child: childName }, 'Child did not become healthy after reload — continuing with remaining children');
278
+ }
279
+ this.logger.info({ app: name, child: childName }, 'Child reloaded successfully');
280
+ }
281
+ catch (err) {
282
+ this.logger.error({ app: name, child: childName, error: err.message }, 'Failed to reload child — aborting zero-downtime reload');
283
+ throw new Error(`Zero-downtime reload failed for '${name}' at child '${childName}': ${err.message}`);
284
+ }
285
+ }
286
+ this.logger.info({ app: name }, 'Zero-downtime reload complete');
287
+ this.persistState();
288
+ return handle;
289
+ }
290
+ /**
291
+ * Wait for a child process to report healthy status within a timeout.
292
+ * Returns true if healthy, false if timeout exceeded.
293
+ */
294
+ async waitForChildHealth(handle, childName, timeoutMs) {
295
+ if (!handle.supervisor)
296
+ return false;
297
+ const deadline = Date.now() + timeoutMs;
298
+ const pollInterval = 1_000;
299
+ while (Date.now() < deadline) {
300
+ try {
301
+ const health = await handle.supervisor.getChildHealth(childName);
302
+ if (health?.status === 'healthy')
303
+ return true;
304
+ }
305
+ catch {
306
+ // Child may not be ready yet
307
+ }
308
+ await new Promise((r) => setTimeout(r, pollInterval));
309
+ }
310
+ return false;
311
+ }
312
+ // ============================================================================
313
+ // Scaling — delegates to PM supervisor
314
+ // ============================================================================
315
+ async scaleApp(name, instances) {
316
+ const handle = this.handles.get(name);
317
+ if (!handle)
318
+ throw new Error(`Unknown app: ${name}`);
319
+ if (!this.config)
320
+ throw new Error('Ecosystem config not loaded');
321
+ if (handle.mode !== 'bootstrap') {
322
+ this.logger.warn({ app: name }, 'Classic mode apps do not support scaling');
323
+ return handle;
324
+ }
325
+ if (instances < 1)
326
+ throw new Error('Instance count must be at least 1');
327
+ if (instances === handle.instanceCount)
328
+ return handle;
329
+ if (!handle.supervisor)
330
+ throw new Error(`No supervisor for app: ${name}`);
331
+ this.logger.info({ app: name, from: handle.instanceCount, to: instances }, 'Scaling app');
332
+ await handle.supervisor.scaleChild(name, instances);
333
+ handle.instanceCount = instances;
334
+ this.persistState();
335
+ return handle;
336
+ }
337
+ // ============================================================================
338
+ // Information
339
+ // ============================================================================
340
+ list(filter) {
341
+ let handles = Array.from(this.handles.values());
342
+ if (filter?.prefix) {
343
+ handles = handles.filter((h) => h.name.startsWith(filter.prefix));
344
+ }
345
+ return handles.map((h) => this.toProcessInfo(h));
346
+ }
347
+ getApp(name) {
348
+ const h = this.handles.get(name);
349
+ return h ? this.toProcessInfo(h) : null;
350
+ }
351
+ getHandle(name) {
352
+ return this.handles.get(name);
353
+ }
354
+ /**
355
+ * List all handle names matching a prefix.
356
+ * Used by ProjectService to find apps belonging to a specific stack.
357
+ */
358
+ listHandleNames(prefix) {
359
+ const names = Array.from(this.handles.keys());
360
+ if (!prefix)
361
+ return names;
362
+ return names.filter((n) => n.startsWith(prefix));
363
+ }
364
+ getWorkerHandle(processId) {
365
+ return this.pm.getWorkerHandle(processId);
366
+ }
367
+ // ============================================================================
368
+ // Monitoring — async, delegates to PM supervisor for bootstrap mode
369
+ // ============================================================================
370
+ async getMetrics(name) {
371
+ const result = {};
372
+ for (const [appName, handle] of this.handles) {
373
+ if (name && appName !== name)
374
+ continue;
375
+ if (handle.mode === 'bootstrap' && handle.supervisor) {
376
+ const childNames = handle.supervisor.getChildNames();
377
+ let cpu = 0, memory = 0, requests = 0, errors = 0;
378
+ for (const childName of childNames) {
379
+ // Try PM-level RPC metrics first
380
+ const m = await handle.supervisor.getChildMetrics(childName);
381
+ if (m && (m.cpu > 0 || m.memory > 0)) {
382
+ cpu += m.cpu;
383
+ memory += m.memory;
384
+ requests += m.requests ?? 0;
385
+ errors += m.errors ?? 0;
386
+ }
387
+ else {
388
+ // Fallback: OS-level metrics via ps for the child PID
389
+ const processId = handle.supervisor.getChildProcessId(childName);
390
+ if (processId) {
391
+ const workerHandle = this.pm.getWorkerHandle(processId);
392
+ const childPid = workerHandle?.pid;
393
+ if (childPid) {
394
+ const osMetrics = await this.sampleProcessMetrics(childPid);
395
+ cpu += osMetrics.cpu;
396
+ memory += osMetrics.memory;
397
+ }
398
+ }
399
+ }
400
+ }
401
+ const aggregated = { cpu, memory, requests, errors };
402
+ handle.lastMetrics = aggregated;
403
+ result[appName] = aggregated;
404
+ }
405
+ else {
406
+ // Classic mode: use cached metrics from polling
407
+ result[appName] = handle.lastMetrics;
408
+ }
409
+ }
410
+ return result;
411
+ }
412
+ async getHealth(name) {
413
+ const result = {};
414
+ for (const [appName, handle] of this.handles) {
415
+ if (name && appName !== name)
416
+ continue;
417
+ if (handle.mode === 'bootstrap' && handle.supervisor) {
418
+ const childNames = handle.supervisor.getChildNames();
419
+ if (childNames.length > 0) {
420
+ const health = await handle.supervisor.getChildHealth(childNames[0]);
421
+ handle.lastHealth = health;
422
+ result[appName] = health;
423
+ }
424
+ else {
425
+ result[appName] = handle.lastHealth;
426
+ }
427
+ }
428
+ else {
429
+ result[appName] = handle.lastHealth;
430
+ }
431
+ }
432
+ return result;
433
+ }
434
+ /**
435
+ * Drain pre-built MetricSample[] from all children.
436
+ * Each child runs its own MetricsCollector and buffers MetricSample[];
437
+ * this method pulls and clears those buffers via Netron RPC.
438
+ */
439
+ async drainChildSamples() {
440
+ const results = [];
441
+ for (const [appName, handle] of this.handles) {
442
+ if (handle.mode !== 'bootstrap' || !handle.supervisor)
443
+ continue;
444
+ const childNames = handle.supervisor.getChildNames();
445
+ for (const childName of childNames) {
446
+ const processId = handle.supervisor.getChildProcessId(childName);
447
+ if (!processId)
448
+ continue;
449
+ try {
450
+ const workerHandle = this.pm.getWorkerHandle(processId);
451
+ if (!workerHandle?.proxy)
452
+ continue;
453
+ const samples = await workerHandle.proxy.__drainMetrics?.();
454
+ if (samples?.length) {
455
+ results.push({ app: `${appName}/${childName}`, samples });
456
+ }
457
+ }
458
+ catch {
459
+ // Child may not support __drainMetrics yet — silently skip
460
+ }
461
+ }
462
+ }
463
+ return results;
464
+ }
465
+ /**
466
+ * Toggle RPC metrics collection on child processes at runtime.
467
+ * When disabled, the instrumented wrapper becomes a zero-overhead passthrough.
468
+ */
469
+ async setMetricsEnabled(name, enabled) {
470
+ for (const [appName, handle] of this.handles) {
471
+ if (name && appName !== name)
472
+ continue;
473
+ if (handle.mode !== 'bootstrap' || !handle.supervisor)
474
+ continue;
475
+ for (const childName of handle.supervisor.getChildNames()) {
476
+ const processId = handle.supervisor.getChildProcessId(childName);
477
+ if (!processId)
478
+ continue;
479
+ try {
480
+ const wh = this.pm.getWorkerHandle(processId);
481
+ await wh?.proxy?.__setMetricsEnabled?.({ enabled });
482
+ }
483
+ catch {
484
+ // Child may not support __setMetricsEnabled — silently skip
485
+ }
486
+ }
487
+ }
488
+ }
489
+ getLogs(name, lines = 100) {
490
+ const result = [];
491
+ for (const [appName, handle] of this.handles) {
492
+ if (name && appName !== name)
493
+ continue;
494
+ result.push({ app: appName, lines: handle.getLogs(lines) });
495
+ }
496
+ return result;
497
+ }
498
+ /**
499
+ * Get app status (or undefined if not tracked).
500
+ */
501
+ getAppStatus(name) {
502
+ const resolved = this.resolveAppName(name) ?? name;
503
+ return this.handles.get(resolved)?.status;
504
+ }
505
+ /**
506
+ * Register a handler that receives every log line from managed apps.
507
+ * Used by LogManager to persist logs to disk with rotation.
508
+ */
509
+ onAppLog(handler) {
510
+ this.appLogHandlers.push(handler);
511
+ }
512
+ // ============================================================================
513
+ // Private — Launch
514
+ // ============================================================================
515
+ async launchClassicMode(entry, handle, config) {
516
+ const child = await launchClassic(entry, handle, this.cwd, this.logger, this.appLogHandlers);
517
+ child.on('exit', (code, signal) => {
518
+ if (handle.status === 'stopping') {
519
+ handle.markStopped();
520
+ }
521
+ else {
522
+ this.logger.error({ app: entry.name, code, signal }, 'App exited unexpectedly');
523
+ handle.markCrashed();
524
+ this.handleClassicCrash(entry, handle, config);
525
+ }
526
+ this.persistState();
527
+ });
528
+ }
529
+ /**
530
+ * Launch bootstrap app via PM ProcessSupervisor.
531
+ *
532
+ * If the app's defineSystem() declares a `processes` topology, Omnitron creates
533
+ * all topology children (server + worker pools) and wires IPC relay between them.
534
+ * Otherwise, creates a single bootstrap-process as before.
535
+ */
536
+ async launchBootstrapMode(entry, handle, config) {
537
+ handle.markStarting();
538
+ const bootstrapAbsPath = path.resolve(this.cwd, entry.bootstrap);
539
+ // Load bootstrap definition to check for process topology and requirements
540
+ let topology;
541
+ let definition;
542
+ try {
543
+ definition = await loadBootstrapConfig(bootstrapAbsPath, { devMode: this.devMode });
544
+ topology = definition.processes;
545
+ }
546
+ catch (err) {
547
+ this.logger.warn({ app: entry.name, error: err.message }, 'Could not load bootstrap config for topology — using single-process mode');
548
+ }
549
+ // Populate omnitronConfig from app's config/default.json if not set by bootstrap
550
+ if (definition && !definition.omnitronConfig) {
551
+ try {
552
+ const srcDir = path.dirname(bootstrapAbsPath);
553
+ const appRoot = path.resolve(srcDir, '..');
554
+ const configPath = path.join(appRoot, 'config', 'default.json');
555
+ const content = fs.readFileSync(configPath, 'utf-8');
556
+ const json = JSON.parse(content);
557
+ if (json.omnitron) {
558
+ definition.omnitronConfig = json.omnitron;
559
+ }
560
+ }
561
+ catch { /* config file missing — skip */ }
562
+ }
563
+ // Resolve infrastructure config and inject as env vars.
564
+ // Skip if already injected by project.service.ts (stack flow sets OMNITRON_STACK).
565
+ const alreadyResolved = !!(entry.env?.['OMNITRON_STACK'] && entry.env?.['DATABASE_URL']);
566
+ if (!alreadyResolved && (definition?.requires || definition?.omnitronConfig)) {
567
+ try {
568
+ const { resolveStack, resolvedConfigToEnv } = await import('../project/config-resolver.js');
569
+ const stackName = 'dev';
570
+ // Build a single-app definitions map for resolveStack
571
+ const definitions = new Map();
572
+ definitions.set(entry.name, definition);
573
+ // Use the default stack config (local type) for legacy direct startAll
574
+ const stackConfig = config.stacks?.[stackName] ?? { type: 'local' };
575
+ const projectName = config.project ?? 'default';
576
+ const resolved = resolveStack(config, projectName, stackName, stackConfig, definitions, undefined);
577
+ const appConfig = resolved.appConfigs.get(entry.name);
578
+ if (appConfig) {
579
+ const envVars = resolvedConfigToEnv(appConfig, entry.name, stackName);
580
+ if (Object.keys(envVars).length > 0) {
581
+ entry.env = { ...entry.env, ...envVars };
582
+ this.logger.debug({ app: entry.name, envCount: Object.keys(envVars).length }, 'Injected resolved infrastructure config as env vars');
583
+ }
584
+ }
585
+ }
586
+ catch (err) {
587
+ this.logger.warn({ app: entry.name, error: err.message }, 'Failed to resolve infrastructure config — app will use its own config sources');
588
+ }
589
+ }
590
+ // Build all entry points via esbuild (dev mode bundles from source .ts)
591
+ if (definition && this.devMode) {
592
+ try {
593
+ if (!this.buildService) {
594
+ this.buildService = new BuildService(/* isDev */ true);
595
+ }
596
+ const buildResult = await this.buildService.buildApp(entry.name, bootstrapAbsPath, definition);
597
+ this.buildResults.set(entry.name, buildResult);
598
+ this.logger.info({ app: entry.name, modules: buildResult.modulePaths.size }, 'Built entry points via esbuild');
599
+ // Start esbuild watch for incremental rebuilds on source changes.
600
+ // On rebuild → restart the app (stop + re-build + re-launch).
601
+ await this.buildService.watchApp(entry.name, bootstrapAbsPath, definition, () => {
602
+ this.logger.info({ app: entry.name }, 'esbuild rebuild detected — restarting');
603
+ this.restartApp(entry.name).catch((err) => {
604
+ this.logger.error({ app: entry.name, error: err.message }, 'Restart after esbuild rebuild failed');
605
+ });
606
+ });
607
+ }
608
+ catch (err) {
609
+ this.logger.error({ app: entry.name, error: err.message }, 'esbuild failed — child processes will fall back to tsx');
610
+ }
611
+ }
612
+ const buildResult = this.buildResults.get(entry.name);
613
+ // Use bundled bootstrap path for topology import when available
614
+ const effectiveBootstrapPath = buildResult?.bootstrapPath ?? bootstrapAbsPath;
615
+ if (topology && topology.length > 0) {
616
+ await this.launchTopology(entry, handle, config, effectiveBootstrapPath, topology, buildResult);
617
+ }
618
+ else {
619
+ await this.launchSingleProcess(entry, handle, config, effectiveBootstrapPath, buildResult);
620
+ }
621
+ }
622
+ /**
623
+ * Launch app with process topology — multiple children managed by Omnitron.
624
+ *
625
+ * All processes use BOOTSTRAP_PROCESS_PATH with { bootstrapPath, processName } dependencies.
626
+ * The BootstrapProcess finds its own entry, imports the module, and wires transports.
627
+ *
628
+ * Processes with `instances > 1` are launched as PM pools with load balancing.
629
+ * Processes with `topology.access` get Netron-native proxies via daemon socket.
630
+ * Processes with `topology.expose` auto-expose their @Service on daemon Netron.
631
+ *
632
+ * Service metadata is auto-discovered from pool workers — no manual `exports`
633
+ * config needed. The @Service decorator on the worker IS the source of truth.
634
+ */
635
+ async launchTopology(entry, handle, config, bootstrapAbsPath, topology, buildResult) {
636
+ const policy = buildRestartPolicy(entry, config);
637
+ if (!this.daemonNetron || !this.daemonSocketPath) {
638
+ throw new Error(`Cannot launch topology for '${entry.name}': daemon Netron not available. ` +
639
+ 'Ensure setDaemonNetron() is called before starting apps.');
640
+ }
641
+ const serviceRouter = new ServiceRouter(this.daemonNetron, this.logger);
642
+ const daemonSocketUrl = `unix://${this.daemonSocketPath}`;
643
+ // Topology startup order: providers (topology.expose) before consumers (topology.access).
644
+ // Providers register their @Service on daemon Netron via ServiceRouter.
645
+ // Consumers connect to daemon and queryInterface() for those services.
646
+ // Currently only pool processes support topology.expose (ServiceRouter wraps pool.execute).
647
+ const poolEntries = topology.filter((p) => (p.instances ?? 1) > 1);
648
+ const singleEntries = topology.filter((p) => (p.instances ?? 1) <= 1);
649
+ // Step 1: Create PM pools — must complete before Step 2 so services are available
650
+ // Pools with topology.expose auto-discover @Service metadata from the first
651
+ // worker via getExposedServices() and register on daemon Netron via ServiceRouter.
652
+ const poolNames = [];
653
+ for (const procEntry of poolEntries) {
654
+ const instances = procEntry.instances;
655
+ const topologyAccess = procEntry.topology?.access ?? [];
656
+ const bundledModulePath = buildResult?.modulePaths.get(procEntry.name);
657
+ const poolOptions = {
658
+ size: instances,
659
+ strategy: PoolStrategy.POWER_OF_TWO,
660
+ metrics: true,
661
+ replaceUnhealthy: true,
662
+ requestTimeout: 120_000,
663
+ maxQueueSize: 200,
664
+ spawnOptions: {
665
+ name: `${entry.name}/${procEntry.name}`,
666
+ version: '1.0.0',
667
+ allMethodsPublic: true,
668
+ startupTimeout: procEntry.startupTimeout ?? 60_000,
669
+ ...(entry.env && { env: entry.env }),
670
+ ...(entry.cwd && { cwd: entry.cwd }),
671
+ dependencies: {
672
+ bootstrapPath: bootstrapAbsPath,
673
+ processName: procEntry.name,
674
+ ...(bundledModulePath && { bundledModulePath }),
675
+ ...(topologyAccess.length > 0 && {
676
+ __daemonSocketUrl: daemonSocketUrl,
677
+ __topologyConnects: topologyAccess,
678
+ }),
679
+ },
680
+ health: {
681
+ enabled: procEntry.health?.enabled !== false,
682
+ interval: procEntry.health?.interval ?? config.monitoring.healthCheck.interval,
683
+ timeout: procEntry.health?.timeout ?? config.monitoring.healthCheck.timeout,
684
+ },
685
+ observability: { metrics: true },
686
+ },
687
+ healthCheck: {
688
+ enabled: procEntry.health?.enabled !== false,
689
+ interval: procEntry.health?.interval ?? config.monitoring.healthCheck.interval,
690
+ },
691
+ autoScale: procEntry.scaling?.strategy === 'auto'
692
+ ? {
693
+ enabled: true,
694
+ min: 1,
695
+ max: procEntry.scaling?.maxInstances ?? instances * 4,
696
+ targetCPU: procEntry.scaling?.targetCPU ?? 70,
697
+ targetMemory: procEntry.scaling?.targetMemory ?? 80,
698
+ queueThreshold: procEntry.scaling?.queueThreshold ?? 10,
699
+ cooldownPeriod: procEntry.scaling?.cooldownPeriod ?? 30_000,
700
+ }
701
+ : {
702
+ enabled: true,
703
+ min: 1,
704
+ max: instances * 4,
705
+ targetCPU: 70,
706
+ targetMemory: 80,
707
+ queueThreshold: 10,
708
+ cooldownPeriod: 30_000,
709
+ },
710
+ };
711
+ this.logger.info({ app: entry.name, process: procEntry.name, instances }, 'Creating topology process pool');
712
+ // pm.pool() returns a Proxy wrapping ProcessPool — execute() dispatches to pool workers
713
+ const pool = await this.pm.pool(BOOTSTRAP_PROCESS_PATH, poolOptions);
714
+ poolNames.push(procEntry.name);
715
+ // Auto-discover @Service metadata from pool workers and expose via ServiceRouter.
716
+ // No manual `exports` needed — @Service decorator IS the source of truth.
717
+ // Requires explicit `topology: { expose: true }` — opt-in for security.
718
+ if (procEntry.topology?.expose === true) {
719
+ try {
720
+ let services = await pool.execute('getExposedServices');
721
+ // Defensive: if services list is empty, the worker's Application may still
722
+ // be registering services. Retry once after a short delay.
723
+ if (!services || services.length === 0) {
724
+ await new Promise((r) => setTimeout(r, 500));
725
+ services = await pool.execute('getExposedServices');
726
+ }
727
+ if (!services || services.length === 0) {
728
+ this.logger.warn({ app: entry.name, process: procEntry.name }, 'No @Service found on pool worker — topology.expose has no effect');
729
+ }
730
+ for (const svc of services) {
731
+ if (svc.methods.length === 0)
732
+ continue;
733
+ await serviceRouter.exposePoolService(procEntry.name, svc.name, svc.version ?? '1.0.0', pool, svc.methods);
734
+ this.logger.info({ app: entry.name, process: procEntry.name, service: svc.name, methods: svc.methods.length }, 'Auto-discovered and exposed pool service on daemon Netron');
735
+ }
736
+ }
737
+ catch (err) {
738
+ this.logger.error({ app: entry.name, process: procEntry.name, error: err.message }, 'Failed to auto-discover/expose pool services');
739
+ }
740
+ }
741
+ }
742
+ // Step 2: Build supervisor children for single-instance processes
743
+ const children = [];
744
+ for (const procEntry of singleEntries) {
745
+ const topologyAccess = procEntry.topology?.access ?? [];
746
+ const bundledModulePath = buildResult?.modulePaths.get(procEntry.name);
747
+ const spawnOpts = {
748
+ name: `${entry.name}/${procEntry.name}`,
749
+ version: '1.0.0',
750
+ allMethodsPublic: true,
751
+ startupTimeout: procEntry.startupTimeout ?? entry.startupTimeout ?? 30_000,
752
+ ...(entry.env && { env: entry.env }),
753
+ ...(entry.cwd && { cwd: entry.cwd }),
754
+ dependencies: {
755
+ bootstrapPath: bootstrapAbsPath,
756
+ processName: procEntry.name,
757
+ ...(bundledModulePath && { bundledModulePath }),
758
+ ...(topologyAccess.length > 0 && {
759
+ __daemonSocketUrl: daemonSocketUrl,
760
+ __topologyConnects: topologyAccess,
761
+ }),
762
+ },
763
+ health: {
764
+ enabled: procEntry.health?.enabled !== false,
765
+ interval: procEntry.health?.interval ?? config.monitoring.healthCheck.interval,
766
+ timeout: procEntry.health?.timeout ?? config.monitoring.healthCheck.timeout,
767
+ },
768
+ observability: { metrics: true },
769
+ };
770
+ children.push({
771
+ name: `${entry.name}/${procEntry.name}`,
772
+ process: BOOTSTRAP_PROCESS_PATH,
773
+ spawnOptions: spawnOpts,
774
+ critical: procEntry.critical ?? entry.critical ?? false,
775
+ });
776
+ }
777
+ // Step 3: Create supervisor for single-instance children
778
+ const supervisorConfig = {
779
+ strategy: mapStrategy(config.supervision.strategy),
780
+ maxRestarts: policy.maxRestarts ?? config.supervision.maxRestarts,
781
+ window: policy.window ?? config.supervision.window,
782
+ backoff: policy.backoff ?? config.supervision.backoff,
783
+ children,
784
+ onChildCrash: async (_child, _error) => {
785
+ // Always restart — supervisor's maxRestarts/window handles escalation.
786
+ // Critical flag determines whether exceeding max restarts kills the app.
787
+ return RestartDecision.RESTART;
788
+ },
789
+ };
790
+ // Create supervisor WITHOUT starting — wire events first to avoid race condition
791
+ const supervisor = this.pm.createSupervisor(supervisorConfig);
792
+ supervisor.on('child:started', (childName) => {
793
+ const processId = supervisor.getChildProcessId(childName);
794
+ if (processId) {
795
+ const workerHandle = this.pm.getWorkerHandle(processId);
796
+ const info = this.pm.getProcess(processId);
797
+ const childPid = workerHandle?.pid ?? info?.pid;
798
+ handle.markOnline(childPid ?? process.pid);
799
+ }
800
+ this.persistState();
801
+ this.emit('app:online', entry.name);
802
+ });
803
+ // Set supervisor on handle BEFORE start so attachLogCapture can access it
804
+ handle.supervisor = supervisor;
805
+ handle.serviceRouter = serviceRouter;
806
+ handle.instanceCount = entry.instances ?? 1;
807
+ handle.topologyProcesses = topology;
808
+ this.wireSupervisorEvents(entry, handle, supervisor);
809
+ // Now start — events will be captured correctly
810
+ await supervisor.start();
811
+ }
812
+ /**
813
+ * Launch single-process bootstrap app (no topology — original behavior).
814
+ */
815
+ async launchSingleProcess(entry, handle, config, bootstrapAbsPath, buildResult) {
816
+ const instances = entry.instances ?? 1;
817
+ const policy = buildRestartPolicy(entry, config);
818
+ // For single-process apps, use the first (only) process entry's bundled module
819
+ const firstProcessName = buildResult?.modulePaths.keys().next().value;
820
+ const bundledModulePath = firstProcessName
821
+ ? buildResult?.modulePaths.get(firstProcessName)
822
+ : undefined;
823
+ const spawnOpts = {
824
+ name: entry.name,
825
+ version: '1.0.0',
826
+ ...(entry.env && { env: entry.env }),
827
+ dependencies: {
828
+ bootstrapPath: bootstrapAbsPath,
829
+ ...(bundledModulePath && { bundledModulePath }),
830
+ },
831
+ ...(entry.startupTimeout != null && { startupTimeout: entry.startupTimeout }),
832
+ health: {
833
+ enabled: true,
834
+ interval: config.monitoring.healthCheck.interval,
835
+ timeout: config.monitoring.healthCheck.timeout,
836
+ },
837
+ observability: { metrics: true },
838
+ };
839
+ const childConfig = {
840
+ name: entry.name,
841
+ process: BOOTSTRAP_PROCESS_PATH,
842
+ spawnOptions: spawnOpts,
843
+ critical: entry.critical ?? false,
844
+ };
845
+ if (instances > 1) {
846
+ childConfig.poolOptions = {
847
+ size: instances,
848
+ strategy: PoolStrategy.ROUND_ROBIN,
849
+ metrics: true,
850
+ replaceUnhealthy: true,
851
+ healthCheck: {
852
+ enabled: true,
853
+ interval: config.monitoring.healthCheck.interval,
854
+ },
855
+ spawnOptionsFactory: (index) => ({
856
+ name: `${entry.name}-${index}`,
857
+ ...(entry.env && { env: entry.env }),
858
+ ...(entry.startupTimeout != null && { startupTimeout: entry.startupTimeout }),
859
+ dependencies: {
860
+ bootstrapPath: bootstrapAbsPath,
861
+ ...(bundledModulePath && { bundledModulePath }),
862
+ portOffset: index,
863
+ },
864
+ health: {
865
+ enabled: true,
866
+ interval: config.monitoring.healthCheck.interval,
867
+ timeout: config.monitoring.healthCheck.timeout,
868
+ },
869
+ observability: { metrics: true },
870
+ }),
871
+ };
872
+ }
873
+ const supervisorConfig = {
874
+ strategy: mapStrategy(config.supervision.strategy),
875
+ maxRestarts: policy.maxRestarts ?? config.supervision.maxRestarts,
876
+ window: policy.window ?? config.supervision.window,
877
+ backoff: policy.backoff ?? config.supervision.backoff,
878
+ children: [childConfig],
879
+ onChildCrash: async (_child, _error) => {
880
+ // Always restart — supervisor's maxRestarts/window handles escalation.
881
+ // Critical flag determines whether exceeding max restarts kills the app.
882
+ return RestartDecision.RESTART;
883
+ },
884
+ };
885
+ // Create supervisor WITHOUT starting — wire events first to avoid race condition
886
+ const supervisor = this.pm.createSupervisor(supervisorConfig);
887
+ // Wire supervisor events BEFORE start so we catch the initial child:started
888
+ supervisor.on('child:started', (childName) => {
889
+ const processId = supervisor.getChildProcessId(childName);
890
+ if (processId) {
891
+ // Prefer WorkerHandle.pid (actual child OS PID), fallback to IProcessInfo.pid
892
+ const workerHandle = this.pm.getWorkerHandle(processId);
893
+ const info = this.pm.getProcess(processId);
894
+ const childPid = workerHandle?.pid ?? info?.pid;
895
+ handle.markOnline(childPid ?? process.pid);
896
+ }
897
+ this.persistState();
898
+ this.emit('app:online', entry.name);
899
+ });
900
+ // Set supervisor on handle BEFORE start so attachLogCapture can access it
901
+ handle.supervisor = supervisor;
902
+ handle.instanceCount = instances;
903
+ this.wireSupervisorEvents(entry, handle, supervisor);
904
+ // Now start — events will be captured correctly
905
+ await supervisor.start();
906
+ }
907
+ /**
908
+ * Wire common supervisor events (crash, restart, escalate) and log capture.
909
+ */
910
+ wireSupervisorEvents(entry, handle, supervisor) {
911
+ supervisor.on('child:started', (childName) => {
912
+ this.attachLogCapture(entry.name, childName, handle);
913
+ });
914
+ supervisor.on('child:crash', (childName, error) => {
915
+ // If app never reached 'online', mark as errored (not crashed — it never ran)
916
+ if (handle.status === 'starting') {
917
+ handle.markErrored();
918
+ }
919
+ else {
920
+ handle.markCrashed();
921
+ }
922
+ this.logger.error({ app: entry.name, child: childName, error: error.message }, 'Process crashed');
923
+ this.persistState();
924
+ this.emit('app:crash', entry.name, error);
925
+ });
926
+ supervisor.on('child:restart', (childName, attempt) => {
927
+ handle.restarts = attempt;
928
+ this.logger.info({ app: entry.name, child: childName, attempt }, 'Process restarting');
929
+ this.emit('app:restart', entry.name, attempt);
930
+ });
931
+ supervisor.on('escalate', (childName, _error) => {
932
+ handle.status = 'crashed';
933
+ this.logger.error({ app: entry.name, child: childName }, 'App exceeded max restarts — escalated');
934
+ this.persistState();
935
+ this.emit('app:escalated', entry.name, childName);
936
+ });
937
+ }
938
+ /**
939
+ * Attach log capture to a child process's WorkerHandle.
940
+ * Routes child stdout/stderr lines to AppHandle ring buffer for `getLogs()`.
941
+ */
942
+ attachLogCapture(appName, childName, handle) {
943
+ const supervisor = handle.supervisor;
944
+ if (!supervisor)
945
+ return;
946
+ const processId = supervisor.getChildProcessId(childName);
947
+ if (!processId)
948
+ return;
949
+ const workerHandle = this.pm.getWorkerHandle(processId);
950
+ if (!workerHandle?.onLog)
951
+ return;
952
+ workerHandle.onLog((line, _stream) => {
953
+ // In-memory ring buffer (for live CLI tailing)
954
+ handle.appendLog(line);
955
+ // Persist to disk via registered log handlers (LogManager)
956
+ for (const handler of this.appLogHandlers) {
957
+ try {
958
+ handler(appName, line);
959
+ }
960
+ catch {
961
+ // Log handler failure must not break the app
962
+ }
963
+ }
964
+ });
965
+ }
966
+ // ============================================================================
967
+ // Private — Classic mode
968
+ // ============================================================================
969
+ async stopChildProcess(handle, force, timeout) {
970
+ const child = handle.childProcess;
971
+ if (!child || !child.pid)
972
+ return;
973
+ await new Promise((resolve) => {
974
+ const timer = setTimeout(() => {
975
+ try {
976
+ child.kill('SIGKILL');
977
+ }
978
+ catch {
979
+ // SIGKILL send is best-effort
980
+ }
981
+ resolve();
982
+ }, timeout);
983
+ child.once('exit', () => {
984
+ clearTimeout(timer);
985
+ resolve();
986
+ });
987
+ try {
988
+ child.kill(force ? 'SIGKILL' : 'SIGTERM');
989
+ }
990
+ catch {
991
+ clearTimeout(timer);
992
+ resolve();
993
+ }
994
+ });
995
+ }
996
+ async handleClassicCrash(entry, handle, config) {
997
+ const policy = buildRestartPolicy(entry, config);
998
+ if (!policy.enabled)
999
+ return;
1000
+ if (handle.restarts >= (policy.maxRestarts ?? 5)) {
1001
+ handle.status = 'crashed';
1002
+ this.logger.error({ app: entry.name }, 'Max restarts exceeded');
1003
+ this.emit('app:escalated', entry.name);
1004
+ return;
1005
+ }
1006
+ const backoff = policy.backoff ?? config.supervision.backoff;
1007
+ const delay = this.calculateBackoff(handle.restarts, backoff);
1008
+ this.logger.info({ app: entry.name, delay, attempt: handle.restarts + 1 }, 'Scheduling restart');
1009
+ const timer = setTimeout(async () => {
1010
+ // Guard: don't restart if orchestrator was stopped during backoff
1011
+ if (handle.status === 'stopping' || handle.status === 'stopped')
1012
+ return;
1013
+ try {
1014
+ handle.status = 'stopped';
1015
+ await this.startApp(entry, config);
1016
+ }
1017
+ catch (err) {
1018
+ this.logger.error({ app: entry.name, error: err.message }, 'Restart failed');
1019
+ }
1020
+ }, delay);
1021
+ // Allow cleanup on explicit stop
1022
+ handle.crashRestartTimer = timer;
1023
+ }
1024
+ calculateBackoff(attempt, backoff) {
1025
+ const initial = backoff.initial ?? 1000;
1026
+ const max = backoff.max ?? 30_000;
1027
+ const factor = backoff.factor ?? 2;
1028
+ if (backoff.type === 'exponential')
1029
+ return Math.min(initial * Math.pow(factor, attempt), max);
1030
+ if (backoff.type === 'linear')
1031
+ return Math.min(initial * (attempt + 1), max);
1032
+ return initial;
1033
+ }
1034
+ /** Sample CPU/memory for a single OS process via `ps` (async — does not block event loop) */
1035
+ async sampleProcessMetrics(pid) {
1036
+ try {
1037
+ const { execFile } = await import('node:child_process');
1038
+ const psOutput = await new Promise((resolve, reject) => {
1039
+ execFile('ps', ['-p', String(pid), '-o', 'rss=,%cpu='], { timeout: 5000 }, (err, stdout) => {
1040
+ if (err)
1041
+ reject(err);
1042
+ else
1043
+ resolve(stdout.trim());
1044
+ });
1045
+ });
1046
+ const [rssKb, cpuPercent] = psOutput.split(/\s+/);
1047
+ return {
1048
+ cpu: parseFloat(cpuPercent ?? '0'),
1049
+ memory: parseInt(rssKb ?? '0', 10) * 1024,
1050
+ };
1051
+ }
1052
+ catch {
1053
+ return { cpu: 0, memory: 0 };
1054
+ }
1055
+ }
1056
+ /** Periodic metrics polling for classic mode processes */
1057
+ startMetricsPolling(interval) {
1058
+ this.metricsTimer = setInterval(async () => {
1059
+ for (const handle of this.handles.values()) {
1060
+ if (handle.status !== 'online')
1061
+ continue;
1062
+ if (handle.mode === 'classic' && handle.childProcess?.pid) {
1063
+ const m = await this.sampleProcessMetrics(handle.childProcess.pid);
1064
+ handle.lastMetrics = { ...m, requests: 0, errors: 0 };
1065
+ }
1066
+ else if (handle.mode === 'bootstrap' && handle.pid) {
1067
+ const m = await this.sampleProcessMetrics(handle.pid);
1068
+ handle.lastMetrics = {
1069
+ ...m,
1070
+ requests: handle.lastMetrics?.requests ?? 0,
1071
+ errors: handle.lastMetrics?.errors ?? 0,
1072
+ };
1073
+ }
1074
+ }
1075
+ }, interval);
1076
+ }
1077
+ // ============================================================================
1078
+ // Private — Utilities
1079
+ // ============================================================================
1080
+ toProcessInfo(handle) {
1081
+ const info = {
1082
+ name: handle.name,
1083
+ pid: handle.pid,
1084
+ status: handle.status,
1085
+ cpu: handle.cpu,
1086
+ memory: handle.memory,
1087
+ uptime: handle.uptime,
1088
+ restarts: handle.restarts,
1089
+ instances: handle.instanceCount,
1090
+ port: handle.port,
1091
+ mode: handle.mode,
1092
+ critical: handle.entry.critical ?? false,
1093
+ };
1094
+ // Include sub-process topology if present
1095
+ if (handle.topologyProcesses && handle.topologyProcesses.length > 0 && handle.supervisor) {
1096
+ info.processes = [];
1097
+ for (const topo of handle.topologyProcesses) {
1098
+ const childNames = handle.supervisor.getChildNames();
1099
+ // Match topology entry to supervisor child by name
1100
+ const childName = childNames.find((cn) => cn.includes(topo.name)) ?? topo.name;
1101
+ const processId = handle.supervisor.getChildProcessId(childName);
1102
+ let childPid = null;
1103
+ let childStatus = 'stopped';
1104
+ if (processId) {
1105
+ const wh = this.pm.getWorkerHandle(processId);
1106
+ childPid = wh?.pid ?? null;
1107
+ childStatus = childPid ? 'online' : 'stopped';
1108
+ }
1109
+ // Derive process type from declarations for backward-compatible DTO
1110
+ const derivedType = topo.transports ? 'server' : (topo.instances ?? 1) > 1 ? 'worker' : 'custom';
1111
+ info.processes.push({
1112
+ name: topo.name,
1113
+ type: derivedType,
1114
+ pid: childPid,
1115
+ status: childStatus,
1116
+ cpu: 0,
1117
+ memory: 0,
1118
+ uptime: handle.uptime,
1119
+ restarts: 0,
1120
+ });
1121
+ }
1122
+ }
1123
+ return info;
1124
+ }
1125
+ persistState() {
1126
+ try {
1127
+ this.stateStore.save({
1128
+ version: CLI_VERSION,
1129
+ updatedAt: Date.now(),
1130
+ apps: Array.from(this.handles.values()).map((h) => ({
1131
+ name: h.name,
1132
+ pid: h.pid,
1133
+ status: h.status,
1134
+ mode: h.mode,
1135
+ startedAt: h.startedAt,
1136
+ restarts: h.restarts,
1137
+ port: h.port,
1138
+ })),
1139
+ });
1140
+ }
1141
+ catch (err) {
1142
+ this.logger.warn({ error: err.message }, 'Failed to persist state');
1143
+ }
1144
+ }
1145
+ }
1146
+ //# sourceMappingURL=orchestrator.service.js.map