threadforge 0.1.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/README.md +69 -42
  2. package/bin/forge.js +2 -1058
  3. package/bin/host-commands.d.ts +2 -0
  4. package/bin/host-commands.d.ts.map +1 -0
  5. package/bin/host-commands.js +7 -8
  6. package/bin/platform-commands.d.ts +2 -0
  7. package/bin/platform-commands.d.ts.map +1 -0
  8. package/bin/platform-commands.js +118 -36
  9. package/dist/cli/base-command.d.ts +12 -0
  10. package/dist/cli/base-command.d.ts.map +1 -0
  11. package/dist/cli/base-command.js +25 -0
  12. package/dist/cli/base-command.js.map +1 -0
  13. package/dist/cli/commands/build.d.ts +10 -0
  14. package/dist/cli/commands/build.d.ts.map +1 -0
  15. package/dist/cli/commands/build.js +110 -0
  16. package/dist/cli/commands/build.js.map +1 -0
  17. package/dist/cli/commands/deploy.d.ts +12 -0
  18. package/dist/cli/commands/deploy.d.ts.map +1 -0
  19. package/dist/cli/commands/deploy.js +143 -0
  20. package/dist/cli/commands/deploy.js.map +1 -0
  21. package/dist/cli/commands/dev.d.ts +10 -0
  22. package/dist/cli/commands/dev.d.ts.map +1 -0
  23. package/dist/cli/commands/dev.js +138 -0
  24. package/dist/cli/commands/dev.js.map +1 -0
  25. package/dist/cli/commands/generate.d.ts +10 -0
  26. package/dist/cli/commands/generate.d.ts.map +1 -0
  27. package/dist/cli/commands/generate.js +76 -0
  28. package/dist/cli/commands/generate.js.map +1 -0
  29. package/dist/cli/commands/host.d.ts +8 -0
  30. package/dist/cli/commands/host.d.ts.map +1 -0
  31. package/dist/cli/commands/host.js +20 -0
  32. package/dist/cli/commands/host.js.map +1 -0
  33. package/dist/cli/commands/init.d.ts +16 -0
  34. package/dist/cli/commands/init.d.ts.map +1 -0
  35. package/dist/cli/commands/init.js +246 -0
  36. package/dist/cli/commands/init.js.map +1 -0
  37. package/dist/cli/commands/platform.d.ts +8 -0
  38. package/dist/cli/commands/platform.d.ts.map +1 -0
  39. package/dist/cli/commands/platform.js +20 -0
  40. package/dist/cli/commands/platform.js.map +1 -0
  41. package/dist/cli/commands/restart.d.ts +8 -0
  42. package/dist/cli/commands/restart.d.ts.map +1 -0
  43. package/dist/cli/commands/restart.js +13 -0
  44. package/dist/cli/commands/restart.js.map +1 -0
  45. package/dist/cli/commands/scaffold/frontend.d.ts +10 -0
  46. package/dist/cli/commands/scaffold/frontend.d.ts.map +1 -0
  47. package/dist/cli/commands/scaffold/frontend.js +130 -0
  48. package/dist/cli/commands/scaffold/frontend.js.map +1 -0
  49. package/dist/cli/commands/scaffold/react.d.ts +7 -0
  50. package/dist/cli/commands/scaffold/react.d.ts.map +1 -0
  51. package/dist/cli/commands/scaffold/react.js +12 -0
  52. package/dist/cli/commands/scaffold/react.js.map +1 -0
  53. package/dist/cli/commands/scale.d.ts +8 -0
  54. package/dist/cli/commands/scale.d.ts.map +1 -0
  55. package/dist/cli/commands/scale.js +13 -0
  56. package/dist/cli/commands/scale.js.map +1 -0
  57. package/dist/cli/commands/start.d.ts +10 -0
  58. package/dist/cli/commands/start.d.ts.map +1 -0
  59. package/dist/cli/commands/start.js +71 -0
  60. package/dist/cli/commands/start.js.map +1 -0
  61. package/dist/cli/commands/status.d.ts +11 -0
  62. package/dist/cli/commands/status.d.ts.map +1 -0
  63. package/dist/cli/commands/status.js +60 -0
  64. package/dist/cli/commands/status.js.map +1 -0
  65. package/dist/cli/commands/stop.d.ts +10 -0
  66. package/dist/cli/commands/stop.d.ts.map +1 -0
  67. package/dist/cli/commands/stop.js +89 -0
  68. package/dist/cli/commands/stop.js.map +1 -0
  69. package/dist/cli/util/config-discovery.d.ts +8 -0
  70. package/dist/cli/util/config-discovery.d.ts.map +1 -0
  71. package/dist/cli/util/config-discovery.js +70 -0
  72. package/dist/cli/util/config-discovery.js.map +1 -0
  73. package/dist/cli/util/config-patcher.d.ts +17 -0
  74. package/dist/cli/util/config-patcher.d.ts.map +1 -0
  75. package/dist/cli/util/config-patcher.js +439 -0
  76. package/dist/cli/util/config-patcher.js.map +1 -0
  77. package/dist/cli/util/frontend-dev.d.ts +8 -0
  78. package/dist/cli/util/frontend-dev.d.ts.map +1 -0
  79. package/dist/cli/util/frontend-dev.js +117 -0
  80. package/dist/cli/util/frontend-dev.js.map +1 -0
  81. package/dist/cli/util/process.d.ts +5 -0
  82. package/dist/cli/util/process.d.ts.map +1 -0
  83. package/dist/cli/util/process.js +17 -0
  84. package/dist/cli/util/process.js.map +1 -0
  85. package/dist/cli/util/templates.d.ts +10 -0
  86. package/dist/cli/util/templates.d.ts.map +1 -0
  87. package/dist/cli/util/templates.js +157 -0
  88. package/dist/cli/util/templates.js.map +1 -0
  89. package/dist/core/AlertSink.d.ts +83 -0
  90. package/dist/core/AlertSink.d.ts.map +1 -0
  91. package/dist/core/AlertSink.js +126 -0
  92. package/dist/core/AlertSink.js.map +1 -0
  93. package/dist/core/DirectMessageBus.d.ts +88 -0
  94. package/dist/core/DirectMessageBus.d.ts.map +1 -0
  95. package/dist/core/DirectMessageBus.js +352 -0
  96. package/dist/core/DirectMessageBus.js.map +1 -0
  97. package/dist/core/EndpointResolver.d.ts +111 -0
  98. package/dist/core/EndpointResolver.d.ts.map +1 -0
  99. package/dist/core/EndpointResolver.js +336 -0
  100. package/dist/core/EndpointResolver.js.map +1 -0
  101. package/dist/core/ForgeContext.d.ts +221 -0
  102. package/dist/core/ForgeContext.d.ts.map +1 -0
  103. package/dist/core/ForgeContext.js +1169 -0
  104. package/dist/core/ForgeContext.js.map +1 -0
  105. package/dist/core/ForgeEndpoints.d.ts +71 -0
  106. package/dist/core/ForgeEndpoints.d.ts.map +1 -0
  107. package/dist/core/ForgeEndpoints.js +442 -0
  108. package/dist/core/ForgeEndpoints.js.map +1 -0
  109. package/dist/core/ForgeHost.d.ts +82 -0
  110. package/dist/core/ForgeHost.d.ts.map +1 -0
  111. package/dist/core/ForgeHost.js +107 -0
  112. package/dist/core/ForgeHost.js.map +1 -0
  113. package/dist/core/ForgePlatform.d.ts +96 -0
  114. package/dist/core/ForgePlatform.d.ts.map +1 -0
  115. package/dist/core/ForgePlatform.js +136 -0
  116. package/dist/core/ForgePlatform.js.map +1 -0
  117. package/dist/core/ForgeWebSocket.d.ts +56 -0
  118. package/dist/core/ForgeWebSocket.d.ts.map +1 -0
  119. package/dist/core/ForgeWebSocket.js +415 -0
  120. package/dist/core/ForgeWebSocket.js.map +1 -0
  121. package/dist/core/Ingress.d.ts +329 -0
  122. package/dist/core/Ingress.d.ts.map +1 -0
  123. package/dist/core/Ingress.js +694 -0
  124. package/dist/core/Ingress.js.map +1 -0
  125. package/dist/core/Interceptors.d.ts +134 -0
  126. package/dist/core/Interceptors.d.ts.map +1 -0
  127. package/dist/core/Interceptors.js +416 -0
  128. package/dist/core/Interceptors.js.map +1 -0
  129. package/dist/core/Logger.d.ts +20 -0
  130. package/dist/core/Logger.d.ts.map +1 -0
  131. package/dist/core/Logger.js +77 -0
  132. package/dist/core/Logger.js.map +1 -0
  133. package/dist/core/MessageBus.d.ts +15 -0
  134. package/dist/core/MessageBus.d.ts.map +1 -0
  135. package/dist/core/MessageBus.js +18 -0
  136. package/dist/core/MessageBus.js.map +1 -0
  137. package/dist/core/Prometheus.d.ts +80 -0
  138. package/dist/core/Prometheus.d.ts.map +1 -0
  139. package/dist/core/Prometheus.js +332 -0
  140. package/dist/core/Prometheus.js.map +1 -0
  141. package/dist/core/RequestContext.d.ts +214 -0
  142. package/dist/core/RequestContext.d.ts.map +1 -0
  143. package/dist/core/RequestContext.js +556 -0
  144. package/dist/core/RequestContext.js.map +1 -0
  145. package/dist/core/Router.d.ts +45 -0
  146. package/dist/core/Router.d.ts.map +1 -0
  147. package/dist/core/Router.js +285 -0
  148. package/dist/core/Router.js.map +1 -0
  149. package/dist/core/RoutingStrategy.d.ts +116 -0
  150. package/dist/core/RoutingStrategy.d.ts.map +1 -0
  151. package/dist/core/RoutingStrategy.js +306 -0
  152. package/dist/core/RoutingStrategy.js.map +1 -0
  153. package/dist/core/RpcConfig.d.ts +72 -0
  154. package/dist/core/RpcConfig.d.ts.map +1 -0
  155. package/dist/core/RpcConfig.js +127 -0
  156. package/dist/core/RpcConfig.js.map +1 -0
  157. package/dist/core/SignatureCache.d.ts +81 -0
  158. package/dist/core/SignatureCache.d.ts.map +1 -0
  159. package/dist/core/SignatureCache.js +172 -0
  160. package/dist/core/SignatureCache.js.map +1 -0
  161. package/dist/core/StaticFileServer.d.ts +34 -0
  162. package/dist/core/StaticFileServer.d.ts.map +1 -0
  163. package/dist/core/StaticFileServer.js +497 -0
  164. package/dist/core/StaticFileServer.js.map +1 -0
  165. package/dist/core/Supervisor.d.ts +198 -0
  166. package/dist/core/Supervisor.d.ts.map +1 -0
  167. package/dist/core/Supervisor.js +1418 -0
  168. package/dist/core/Supervisor.js.map +1 -0
  169. package/dist/core/ThreadAllocator.d.ts +52 -0
  170. package/dist/core/ThreadAllocator.d.ts.map +1 -0
  171. package/dist/core/ThreadAllocator.js +174 -0
  172. package/dist/core/ThreadAllocator.js.map +1 -0
  173. package/dist/core/WorkerChannelManager.d.ts +130 -0
  174. package/dist/core/WorkerChannelManager.d.ts.map +1 -0
  175. package/dist/core/WorkerChannelManager.js +956 -0
  176. package/dist/core/WorkerChannelManager.js.map +1 -0
  177. package/dist/core/config-enums.d.ts +41 -0
  178. package/dist/core/config-enums.d.ts.map +1 -0
  179. package/dist/core/config-enums.js +59 -0
  180. package/dist/core/config-enums.js.map +1 -0
  181. package/dist/core/config.d.ts +159 -0
  182. package/dist/core/config.d.ts.map +1 -0
  183. package/dist/core/config.js +694 -0
  184. package/dist/core/config.js.map +1 -0
  185. package/dist/core/host-config.d.ts +146 -0
  186. package/dist/core/host-config.d.ts.map +1 -0
  187. package/dist/core/host-config.js +312 -0
  188. package/dist/core/host-config.js.map +1 -0
  189. package/dist/core/ipc-errors.d.ts +27 -0
  190. package/dist/core/ipc-errors.d.ts.map +1 -0
  191. package/dist/core/ipc-errors.js +36 -0
  192. package/dist/core/ipc-errors.js.map +1 -0
  193. package/dist/core/network-utils.d.ts +35 -0
  194. package/dist/core/network-utils.d.ts.map +1 -0
  195. package/dist/core/network-utils.js +145 -0
  196. package/dist/core/network-utils.js.map +1 -0
  197. package/dist/core/platform-config.d.ts +142 -0
  198. package/dist/core/platform-config.d.ts.map +1 -0
  199. package/dist/core/platform-config.js +299 -0
  200. package/dist/core/platform-config.js.map +1 -0
  201. package/dist/decorators/ServiceProxy.d.ts +175 -0
  202. package/dist/decorators/ServiceProxy.d.ts.map +1 -0
  203. package/dist/decorators/ServiceProxy.js +969 -0
  204. package/dist/decorators/ServiceProxy.js.map +1 -0
  205. package/dist/decorators/index.d.ts +146 -0
  206. package/dist/decorators/index.d.ts.map +1 -0
  207. package/dist/decorators/index.js +545 -0
  208. package/dist/decorators/index.js.map +1 -0
  209. package/dist/deploy/NginxGenerator.d.ts +165 -0
  210. package/dist/deploy/NginxGenerator.d.ts.map +1 -0
  211. package/dist/deploy/NginxGenerator.js +781 -0
  212. package/dist/deploy/NginxGenerator.js.map +1 -0
  213. package/dist/deploy/PlatformManifestGenerator.d.ts +43 -0
  214. package/dist/deploy/PlatformManifestGenerator.d.ts.map +1 -0
  215. package/dist/deploy/PlatformManifestGenerator.js +80 -0
  216. package/dist/deploy/PlatformManifestGenerator.js.map +1 -0
  217. package/dist/deploy/RouteManifestGenerator.d.ts +42 -0
  218. package/dist/deploy/RouteManifestGenerator.d.ts.map +1 -0
  219. package/dist/deploy/RouteManifestGenerator.js +105 -0
  220. package/dist/deploy/RouteManifestGenerator.js.map +1 -0
  221. package/dist/deploy/index.d.ts +210 -0
  222. package/dist/deploy/index.d.ts.map +1 -0
  223. package/dist/deploy/index.js +918 -0
  224. package/dist/deploy/index.js.map +1 -0
  225. package/dist/frontend/FrontendDevLifecycle.d.ts +26 -0
  226. package/dist/frontend/FrontendDevLifecycle.d.ts.map +1 -0
  227. package/dist/frontend/FrontendDevLifecycle.js +60 -0
  228. package/dist/frontend/FrontendDevLifecycle.js.map +1 -0
  229. package/dist/frontend/FrontendPluginOrchestrator.d.ts +64 -0
  230. package/dist/frontend/FrontendPluginOrchestrator.d.ts.map +1 -0
  231. package/dist/frontend/FrontendPluginOrchestrator.js +167 -0
  232. package/dist/frontend/FrontendPluginOrchestrator.js.map +1 -0
  233. package/dist/frontend/SiteResolver.d.ts +33 -0
  234. package/dist/frontend/SiteResolver.d.ts.map +1 -0
  235. package/dist/frontend/SiteResolver.js +53 -0
  236. package/dist/frontend/SiteResolver.js.map +1 -0
  237. package/dist/frontend/StaticMountRegistry.d.ts +36 -0
  238. package/dist/frontend/StaticMountRegistry.d.ts.map +1 -0
  239. package/dist/frontend/StaticMountRegistry.js +94 -0
  240. package/dist/frontend/StaticMountRegistry.js.map +1 -0
  241. package/dist/frontend/index.d.ts +7 -0
  242. package/dist/frontend/index.d.ts.map +1 -0
  243. package/{src → dist}/frontend/index.js +4 -2
  244. package/dist/frontend/index.js.map +1 -0
  245. package/dist/frontend/pathUtils.d.ts +8 -0
  246. package/dist/frontend/pathUtils.d.ts.map +1 -0
  247. package/dist/frontend/pathUtils.js +17 -0
  248. package/dist/frontend/pathUtils.js.map +1 -0
  249. package/dist/frontend/plugins/index.d.ts +2 -0
  250. package/dist/frontend/plugins/index.d.ts.map +1 -0
  251. package/{src → dist}/frontend/plugins/index.js +1 -1
  252. package/dist/frontend/plugins/index.js.map +1 -0
  253. package/dist/frontend/plugins/viteFrontend.d.ts +51 -0
  254. package/dist/frontend/plugins/viteFrontend.d.ts.map +1 -0
  255. package/dist/frontend/plugins/viteFrontend.js +134 -0
  256. package/dist/frontend/plugins/viteFrontend.js.map +1 -0
  257. package/dist/frontend/types.d.ts +25 -0
  258. package/dist/frontend/types.d.ts.map +1 -0
  259. package/dist/frontend/types.js +2 -0
  260. package/dist/frontend/types.js.map +1 -0
  261. package/dist/index.d.ts +17 -0
  262. package/dist/index.d.ts.map +1 -0
  263. package/dist/index.js +32 -0
  264. package/dist/index.js.map +1 -0
  265. package/dist/internals.d.ts +21 -0
  266. package/dist/internals.d.ts.map +1 -0
  267. package/{src → dist}/internals.js +12 -14
  268. package/dist/internals.js.map +1 -0
  269. package/dist/plugins/PluginManager.d.ts +209 -0
  270. package/dist/plugins/PluginManager.d.ts.map +1 -0
  271. package/dist/plugins/PluginManager.js +365 -0
  272. package/dist/plugins/PluginManager.js.map +1 -0
  273. package/dist/plugins/ScopedPostgres.d.ts +78 -0
  274. package/dist/plugins/ScopedPostgres.d.ts.map +1 -0
  275. package/dist/plugins/ScopedPostgres.js +190 -0
  276. package/dist/plugins/ScopedPostgres.js.map +1 -0
  277. package/dist/plugins/ScopedRedis.d.ts +88 -0
  278. package/dist/plugins/ScopedRedis.d.ts.map +1 -0
  279. package/dist/plugins/ScopedRedis.js +169 -0
  280. package/dist/plugins/ScopedRedis.js.map +1 -0
  281. package/dist/plugins/index.d.ts +289 -0
  282. package/dist/plugins/index.d.ts.map +1 -0
  283. package/dist/plugins/index.js +1942 -0
  284. package/dist/plugins/index.js.map +1 -0
  285. package/dist/plugins/types.d.ts +59 -0
  286. package/dist/plugins/types.d.ts.map +1 -0
  287. package/dist/plugins/types.js +2 -0
  288. package/dist/plugins/types.js.map +1 -0
  289. package/dist/registry/ServiceRegistry.d.ts +305 -0
  290. package/dist/registry/ServiceRegistry.d.ts.map +1 -0
  291. package/dist/registry/ServiceRegistry.js +735 -0
  292. package/dist/registry/ServiceRegistry.js.map +1 -0
  293. package/dist/scaling/ScaleAdvisor.d.ts +214 -0
  294. package/dist/scaling/ScaleAdvisor.d.ts.map +1 -0
  295. package/dist/scaling/ScaleAdvisor.js +526 -0
  296. package/dist/scaling/ScaleAdvisor.js.map +1 -0
  297. package/dist/services/Service.d.ts +164 -0
  298. package/dist/services/Service.d.ts.map +1 -0
  299. package/dist/services/Service.js +106 -0
  300. package/dist/services/Service.js.map +1 -0
  301. package/dist/services/worker-bootstrap.d.ts +15 -0
  302. package/dist/services/worker-bootstrap.d.ts.map +1 -0
  303. package/dist/services/worker-bootstrap.js +744 -0
  304. package/dist/services/worker-bootstrap.js.map +1 -0
  305. package/dist/templates/auth-service.d.ts +42 -0
  306. package/dist/templates/auth-service.d.ts.map +1 -0
  307. package/dist/templates/auth-service.js +54 -0
  308. package/dist/templates/auth-service.js.map +1 -0
  309. package/dist/templates/identity-service.d.ts +50 -0
  310. package/dist/templates/identity-service.d.ts.map +1 -0
  311. package/dist/templates/identity-service.js +62 -0
  312. package/dist/templates/identity-service.js.map +1 -0
  313. package/dist/types/contract.d.ts +120 -0
  314. package/dist/types/contract.d.ts.map +1 -0
  315. package/dist/types/contract.js +69 -0
  316. package/dist/types/contract.js.map +1 -0
  317. package/package.json +79 -20
  318. package/src/core/DirectMessageBus.js +0 -364
  319. package/src/core/EndpointResolver.js +0 -259
  320. package/src/core/ForgeContext.js +0 -2236
  321. package/src/core/ForgeHost.js +0 -122
  322. package/src/core/ForgePlatform.js +0 -145
  323. package/src/core/Ingress.js +0 -768
  324. package/src/core/Interceptors.js +0 -420
  325. package/src/core/MessageBus.js +0 -321
  326. package/src/core/Prometheus.js +0 -305
  327. package/src/core/RequestContext.js +0 -413
  328. package/src/core/RoutingStrategy.js +0 -330
  329. package/src/core/Supervisor.js +0 -1349
  330. package/src/core/ThreadAllocator.js +0 -196
  331. package/src/core/WorkerChannelManager.js +0 -879
  332. package/src/core/config.js +0 -637
  333. package/src/core/host-config.js +0 -311
  334. package/src/core/network-utils.js +0 -166
  335. package/src/core/platform-config.js +0 -308
  336. package/src/decorators/ServiceProxy.js +0 -904
  337. package/src/decorators/index.js +0 -571
  338. package/src/deploy/NginxGenerator.js +0 -865
  339. package/src/deploy/PlatformManifestGenerator.js +0 -96
  340. package/src/deploy/RouteManifestGenerator.js +0 -112
  341. package/src/deploy/index.js +0 -984
  342. package/src/frontend/FrontendDevLifecycle.js +0 -65
  343. package/src/frontend/FrontendPluginOrchestrator.js +0 -187
  344. package/src/frontend/SiteResolver.js +0 -63
  345. package/src/frontend/StaticMountRegistry.js +0 -90
  346. package/src/frontend/plugins/viteFrontend.js +0 -79
  347. package/src/frontend/types.js +0 -35
  348. package/src/index.js +0 -58
  349. package/src/plugins/PluginManager.js +0 -537
  350. package/src/plugins/ScopedPostgres.js +0 -192
  351. package/src/plugins/ScopedRedis.js +0 -142
  352. package/src/plugins/index.js +0 -1756
  353. package/src/registry/ServiceRegistry.js +0 -797
  354. package/src/scaling/ScaleAdvisor.js +0 -442
  355. package/src/services/Service.js +0 -195
  356. package/src/services/worker-bootstrap.js +0 -679
  357. package/src/templates/auth-service.js +0 -65
  358. package/src/templates/identity-service.js +0 -75
@@ -0,0 +1,526 @@
1
+ /**
2
+ * ScaleAdvisor
3
+ *
4
+ * Monitors service health across the cluster and produces
5
+ * actionable scaling recommendations.
6
+ *
7
+ * This is the "automatic" part of horizontal scaling. Instead of
8
+ * a human watching dashboards and deciding "billing needs its own
9
+ * machine", the ScaleAdvisor detects pressure and recommends:
10
+ *
11
+ * 1. SCALE UP — add more workers on the same machine
12
+ * 2. SPLIT OUT — move a service to its own dedicated process
13
+ * 3. MIGRATE — move a service to another machine
14
+ * 4. SCALE DOWN — reduce workers or colocate back
15
+ *
16
+ * ═══════════════════════════════════════════════════════════════
17
+ * SCALING SIGNALS
18
+ * ═══════════════════════════════════════════════════════════════
19
+ *
20
+ * The advisor monitors three signals per service:
21
+ *
22
+ * CPU saturation — is the service's process(es) maxing out?
23
+ * Latency drift — is P99 latency increasing over time?
24
+ * Queue pressure — are pending requests growing?
25
+ *
26
+ * Thresholds:
27
+ *
28
+ * ┌──────────────────┬────────────┬─────────────┬──────────────┐
29
+ * │ Signal │ Normal │ Warning │ Critical │
30
+ * ├──────────────────┼────────────┼─────────────┼──────────────┤
31
+ * │ CPU per worker │ < 60% │ 60-85% │ > 85% │
32
+ * │ P99 latency │ < 100ms │ 100-500ms │ > 500ms │
33
+ * │ Pending requests │ < 50 │ 50-200 │ > 200 │
34
+ * │ Memory per proc │ < 512MB │ 512MB-1GB │ > 1GB │
35
+ * └──────────────────┴────────────┴─────────────┴──────────────┘
36
+ *
37
+ * ═══════════════════════════════════════════════════════════════
38
+ * DECISION TREE
39
+ * ═══════════════════════════════════════════════════════════════
40
+ *
41
+ * Service under pressure?
42
+ * │
43
+ * ├─ Is it colocated (sharing a process with others)?
44
+ * │ └─ YES → Recommendation: SPLIT OUT to its own process
45
+ * │ (colocation was causing resource contention)
46
+ * │
47
+ * ├─ Does the machine have idle cores?
48
+ * │ └─ YES → Recommendation: SCALE UP (add more workers)
49
+ * │
50
+ * ├─ Is the MACHINE saturated (all cores busy)?
51
+ * │ └─ YES → Recommendation: MIGRATE to a new machine
52
+ * │ (generate deployment command + config change)
53
+ * │
54
+ * └─ Is this a latency problem, not a CPU problem?
55
+ * └─ YES → Recommendation: check for slow I/O,
56
+ * add connection pooling, or add caching
57
+ *
58
+ * Service underutilized?
59
+ * │
60
+ * ├─ Has it been under 20% CPU for 30+ minutes?
61
+ * │ └─ Recommendation: SCALE DOWN (reduce workers)
62
+ * │
63
+ * └─ Is it running alone and barely used?
64
+ * └─ Recommendation: COLOCATE with other light services
65
+ */
66
+ import { EventEmitter } from "node:events";
67
+ import os from "node:os";
68
+ export class ScaleAdvisor extends EventEmitter {
69
+ registry;
70
+ evaluationIntervalMs;
71
+ thresholds;
72
+ cooldownMs;
73
+ history;
74
+ maxHistory;
75
+ recommendations;
76
+ _autoExecute;
77
+ _lastScaleAction;
78
+ _timer;
79
+ _lastCpuMeasurement;
80
+ _lastCpuUsage;
81
+ _executor;
82
+ _workerCpuReports;
83
+ constructor(registry, options = {}) {
84
+ super();
85
+ this.registry = registry;
86
+ this.evaluationIntervalMs = options.evaluationIntervalMs ?? 30000;
87
+ const ot = options.thresholds ?? {};
88
+ this.thresholds = {
89
+ cpu: { warning: 60, critical: 85, scaleDown: 40, ...ot.cpu },
90
+ latencyP99: { warning: 100, critical: 500, ...ot.latencyP99 },
91
+ pending: { warning: 50, critical: 200, ...ot.pending },
92
+ memory: { warning: 512, critical: 1024, ...ot.memory },
93
+ underutilized: { cpu: 20, duration: 30 * 60 * 1000, ...ot.underutilized },
94
+ };
95
+ // RT-M3: Validate threshold ordering to catch misconfiguration
96
+ const { cpu: cpuT, latencyP99: latT, pending: pendT, memory: memT } = this.thresholds;
97
+ if (cpuT.scaleDown >= cpuT.warning) {
98
+ throw new Error(`ScaleAdvisor: cpu.scaleDown (${cpuT.scaleDown}) must be < cpu.warning (${cpuT.warning})`);
99
+ }
100
+ if (cpuT.warning >= cpuT.critical) {
101
+ throw new Error(`ScaleAdvisor: cpu.warning (${cpuT.warning}) must be < cpu.critical (${cpuT.critical})`);
102
+ }
103
+ if (latT.warning >= latT.critical) {
104
+ throw new Error(`ScaleAdvisor: latencyP99.warning (${latT.warning}) must be < latencyP99.critical (${latT.critical})`);
105
+ }
106
+ if (pendT.warning >= pendT.critical) {
107
+ throw new Error(`ScaleAdvisor: pending.warning (${pendT.warning}) must be < pending.critical (${pendT.critical})`);
108
+ }
109
+ if (memT.warning >= memT.critical) {
110
+ throw new Error(`ScaleAdvisor: memory.warning (${memT.warning}) must be < memory.critical (${memT.critical})`);
111
+ }
112
+ this.cooldownMs = options.cooldownMs ?? 120000;
113
+ // O3: Whether to auto-execute scaling recommendations
114
+ this._autoExecute = options.scaling?.autoExecute === true;
115
+ // Historical snapshots for trend detection.
116
+ // Key: service name, Value: array of health snapshots
117
+ this.history = new Map();
118
+ this.maxHistory = 60; // keep 60 snapshots (30 min at 30s interval)
119
+ this.recommendations = [];
120
+ // Tracks the last scaling recommendation timestamp per service.
121
+ this._lastScaleAction = new Map();
122
+ this._timer = null;
123
+ // Delta-based CPU measurement state
124
+ this._lastCpuMeasurement = null;
125
+ this._lastCpuUsage = 0;
126
+ // O3: Executor function for auto-scaling, set via setExecutor()
127
+ this._executor = null;
128
+ // O11: Worker-reported CPU values, keyed by service name
129
+ this._workerCpuReports = new Map();
130
+ }
131
+ /**
132
+ * O3: Set an executor function that actually performs scaling actions.
133
+ * Called by the Supervisor to provide a callback for auto-scaling.
134
+ */
135
+ setExecutor(fn) {
136
+ if (typeof fn !== "function") {
137
+ throw new Error("ScaleAdvisor.setExecutor() requires a function");
138
+ }
139
+ this._executor = fn;
140
+ }
141
+ /**
142
+ * O11: Receive a CPU measurement reported by a worker via IPC.
143
+ * Workers should report their own CPU usage periodically.
144
+ * RT-H2: Keyed by serviceName:workerId to aggregate per-worker reports.
145
+ */
146
+ reportWorkerCpu(serviceName, cpu, workerId) {
147
+ const key = workerId ? `${serviceName}:${workerId}` : serviceName;
148
+ this._workerCpuReports.set(key, { cpu, timestamp: Date.now() });
149
+ }
150
+ /**
151
+ * RT-H2: Get the average CPU across all fresh worker reports for a service.
152
+ * Returns null if no fresh reports are available.
153
+ */
154
+ _getAggregatedWorkerCpu(serviceName) {
155
+ const cutoff = Date.now() - this.evaluationIntervalMs * 2;
156
+ let sum = 0;
157
+ let count = 0;
158
+ for (const [key, report] of this._workerCpuReports) {
159
+ if ((key === serviceName || key.startsWith(`${serviceName}:`)) && report.timestamp >= cutoff) {
160
+ sum += report.cpu;
161
+ count++;
162
+ }
163
+ }
164
+ return count > 0 ? sum / count : null;
165
+ }
166
+ start() {
167
+ this._timer = setInterval(() => {
168
+ this.evaluate();
169
+ }, this.evaluationIntervalMs);
170
+ this._timer.unref();
171
+ // Run initial evaluation
172
+ this.evaluate();
173
+ return this;
174
+ }
175
+ stop() {
176
+ if (this._timer) {
177
+ clearInterval(this._timer);
178
+ this._timer = null;
179
+ }
180
+ }
181
+ /**
182
+ * Evaluate all services and generate recommendations.
183
+ */
184
+ evaluate() {
185
+ const topology = this.registry.topology();
186
+ const newRecs = [];
187
+ for (const [serviceName, instances] of Object.entries(topology)) {
188
+ this._recordSnapshot(serviceName, instances);
189
+ for (const instance of instances) {
190
+ if (instance.nodeId !== this.registry.nodeId)
191
+ continue;
192
+ const recs = this._evaluateService(serviceName, instance, instances, topology);
193
+ newRecs.push(...recs);
194
+ }
195
+ }
196
+ // Only emit if recommendations changed
197
+ const changed = JSON.stringify(newRecs.map((r) => r.action + r.service)) !==
198
+ JSON.stringify(this.recommendations.map((r) => r.action + r.service));
199
+ this.recommendations = newRecs;
200
+ if (changed && newRecs.length > 0) {
201
+ this.emit("recommendations", newRecs);
202
+ for (const rec of newRecs) {
203
+ this.emit("recommendation", rec);
204
+ // O3: Auto-execute if configured and executor is available
205
+ if (this._executor && this._autoExecute) {
206
+ this._executor(rec).catch((err) => this.emit("error", err));
207
+ }
208
+ }
209
+ }
210
+ }
211
+ /**
212
+ * Evaluate a single service instance.
213
+ */
214
+ _evaluateService(serviceName, instance, _allInstances, topology) {
215
+ const recs = [];
216
+ const health = instance;
217
+ // Check cooldown — suppress recommendations during cooldown period
218
+ const lastAction = this._lastScaleAction.get(serviceName) ?? 0;
219
+ if (Date.now() - lastAction < this.cooldownMs) {
220
+ return recs;
221
+ }
222
+ // O11: Use worker-reported CPU if available (more accurate than supervisor CPU).
223
+ // RT-H2: Aggregate per-worker reports (average) instead of using last-write-wins.
224
+ // Falls back to registry health data, then to topology data.
225
+ const aggregatedCpu = this._getAggregatedWorkerCpu(serviceName);
226
+ const regHealth = this.registry.localRegistrations.get(serviceName)?.health;
227
+ const cpu = aggregatedCpu ?? (regHealth?.cpu ?? health.cpu);
228
+ // CPU check — use critical threshold for scale-up decisions
229
+ // RT-H4: Track if scale-up already emitted to deduplicate
230
+ let cpuScaleEmitted = false;
231
+ if (cpu >= this.thresholds.cpu.critical) {
232
+ const healthWithCpu = { ...health, cpu };
233
+ const rec = this._cpuRecommendation(serviceName, healthWithCpu, topology);
234
+ recs.push(rec);
235
+ this._lastScaleAction.set(serviceName, Date.now());
236
+ cpuScaleEmitted = true;
237
+ }
238
+ // ─── Latency check ───────────────────────────────────────────────
239
+ // Use registry health data for latency (rpcLatencyP99 in ms).
240
+ const latencyP99 = regHealth?.rpcLatencyP99 ?? health.rpcLatencyP99 ?? 0;
241
+ if (latencyP99 > 0 && latencyP99 >= this.thresholds.latencyP99.critical) {
242
+ // High latency with low CPU suggests I/O bottleneck, not compute
243
+ if (cpu < this.thresholds.cpu.warning) {
244
+ recs.push({
245
+ service: serviceName,
246
+ action: "investigate",
247
+ reason: `P99 latency at ${latencyP99}ms (threshold: ${this.thresholds.latencyP99.critical}ms) but CPU only ${cpu}% — likely I/O bound`,
248
+ details: {
249
+ latencyP99,
250
+ currentCpu: cpu,
251
+ suggestion: "Check for slow I/O, add connection pooling, or add caching",
252
+ },
253
+ confidence: 0.7,
254
+ timestamp: Date.now(),
255
+ });
256
+ }
257
+ else if (!cpuScaleEmitted) {
258
+ // RT-H4: Only emit latency-based scale-up if CPU didn't already trigger one
259
+ const healthWithCpu = { ...health, cpu };
260
+ const rec = this._cpuRecommendation(serviceName, healthWithCpu, topology);
261
+ rec.reason = `P99 latency at ${latencyP99}ms with CPU at ${cpu}% — needs more capacity`;
262
+ rec.details.latencyP99 = latencyP99;
263
+ recs.push(rec);
264
+ this._lastScaleAction.set(serviceName, Date.now());
265
+ }
266
+ }
267
+ // ─── Queue / pending requests check ─────────────────────────────
268
+ const pending = regHealth?.pendingRequests ?? health.pendingRequests ?? 0;
269
+ if (pending > 0 && pending >= this.thresholds.pending.critical) {
270
+ recs.push({
271
+ service: serviceName,
272
+ action: "scale_up",
273
+ reason: `Pending requests at ${pending} (threshold: ${this.thresholds.pending.critical}) — queue pressure building`,
274
+ details: {
275
+ pendingRequests: pending,
276
+ currentCpu: cpu,
277
+ currentWorkers: health.workers,
278
+ suggestedWorkers: Math.min(health.workers + Math.ceil(health.workers * 0.5), os.cpus().length),
279
+ command: `forge scale ${serviceName} ${Math.min(health.workers + Math.ceil(health.workers * 0.5), os.cpus().length)}`,
280
+ },
281
+ confidence: 0.75,
282
+ timestamp: Date.now(),
283
+ });
284
+ this._lastScaleAction.set(serviceName, Date.now());
285
+ }
286
+ // ─── Memory check ───────────────────────────────────────────────
287
+ // Memory is in MB. Exceeding the critical threshold warrants investigation
288
+ // since adding workers won't reduce per-process memory usage.
289
+ const memoryMb = regHealth?.memory ?? health.memory ?? 0;
290
+ if (memoryMb > 0 && memoryMb >= this.thresholds.memory.critical) {
291
+ recs.push({
292
+ service: serviceName,
293
+ action: "investigate",
294
+ reason: `Memory at ${memoryMb}MB exceeds ${this.thresholds.memory.critical}MB — possible memory leak or large cache`,
295
+ details: {
296
+ memoryMb,
297
+ threshold: this.thresholds.memory.critical,
298
+ suggestion: "Profile heap usage, check for unbounded caches, or increase process memory limit",
299
+ },
300
+ confidence: 0.8,
301
+ timestamp: Date.now(),
302
+ });
303
+ }
304
+ else if (memoryMb > 0 && memoryMb >= this.thresholds.memory.warning) {
305
+ recs.push({
306
+ service: serviceName,
307
+ action: "investigate",
308
+ reason: `Memory at ${memoryMb}MB approaching critical threshold (${this.thresholds.memory.critical}MB)`,
309
+ details: {
310
+ memoryMb,
311
+ threshold: this.thresholds.memory.warning,
312
+ suggestion: "Monitor memory trend — may need attention soon",
313
+ },
314
+ confidence: 0.5,
315
+ timestamp: Date.now(),
316
+ });
317
+ }
318
+ // Underutilization check — use scaleDown threshold (hysteresis)
319
+ // Only recommend scale_down when CPU is below the lower hysteresis threshold.
320
+ // Latency and pending below warning thresholds increase confidence.
321
+ if (cpu < this.thresholds.underutilized.cpu && cpu < this.thresholds.cpu.scaleDown) {
322
+ const duration = this._lowCpuDuration(serviceName);
323
+ if (duration >= this.thresholds.underutilized.duration) {
324
+ // Keep confidence stable for scale-down recommendations to avoid
325
+ // oscillating recommendation severity between equivalent low-load windows.
326
+ const confidence = 0.7;
327
+ recs.push({
328
+ service: serviceName,
329
+ action: "scale_down",
330
+ reason: `CPU below ${this.thresholds.underutilized.cpu}% for ${Math.round(duration / 60000)} minutes`,
331
+ details: {
332
+ currentCpu: cpu,
333
+ latencyP99,
334
+ pendingRequests: pending,
335
+ currentWorkers: health.workers,
336
+ suggestedWorkers: Math.max(1, Math.ceil(health.workers / 2)),
337
+ },
338
+ confidence,
339
+ timestamp: Date.now(),
340
+ });
341
+ this._lastScaleAction.set(serviceName, Date.now());
342
+ }
343
+ }
344
+ return recs;
345
+ }
346
+ _cpuRecommendation(serviceName, health, _topology) {
347
+ const machineCpu = this._getMachineCpu();
348
+ // Is this service colocated (sharing a process group with other services)?
349
+ const localRegs = [...this.registry.localRegistrations.values()];
350
+ const thisGroup = localRegs.find((lr) => lr.name === serviceName)?.metadata?.group;
351
+ // Isolated services (_isolated:name) are not truly colocated
352
+ const isColocated = thisGroup &&
353
+ !thisGroup.startsWith("_isolated:") &&
354
+ localRegs.some((r) => r.name !== serviceName && r.metadata?.group === thisGroup);
355
+ if (isColocated) {
356
+ return {
357
+ service: serviceName,
358
+ action: "split_out",
359
+ reason: `CPU at ${health.cpu}% while colocated — resource contention likely`,
360
+ details: {
361
+ currentCpu: health.cpu,
362
+ suggestion: `Move ${serviceName} to its own process group`,
363
+ configChange: {
364
+ [serviceName]: { group: undefined },
365
+ },
366
+ },
367
+ confidence: 0.85,
368
+ timestamp: Date.now(),
369
+ };
370
+ }
371
+ // RT-M2: Skip machine-CPU-based decision if no valid measurement yet
372
+ if (machineCpu < 0) {
373
+ return {
374
+ service: serviceName,
375
+ action: "scale_up",
376
+ reason: `CPU at ${health.cpu}% — machine CPU not yet measured, assuming headroom`,
377
+ details: {
378
+ currentCpu: health.cpu,
379
+ machineCpu: "pending",
380
+ currentWorkers: health.workers,
381
+ suggestedWorkers: Math.min(health.workers + Math.ceil(health.workers * 0.5), os.cpus().length),
382
+ command: `forge scale ${serviceName} ${Math.min(health.workers + Math.ceil(health.workers * 0.5), os.cpus().length)}`,
383
+ },
384
+ confidence: 0.5,
385
+ timestamp: Date.now(),
386
+ };
387
+ }
388
+ if (machineCpu < 80) {
389
+ // Machine has headroom — add workers
390
+ return {
391
+ service: serviceName,
392
+ action: "scale_up",
393
+ reason: `CPU at ${health.cpu}% but machine has idle capacity (${machineCpu}% total)`,
394
+ details: {
395
+ currentCpu: health.cpu,
396
+ machineCpu,
397
+ currentWorkers: health.workers,
398
+ suggestedWorkers: Math.min(health.workers + Math.ceil(health.workers * 0.5), os.cpus().length),
399
+ command: `forge scale ${serviceName} ${Math.min(health.workers + Math.ceil(health.workers * 0.5), os.cpus().length)}`,
400
+ },
401
+ confidence: 0.8,
402
+ timestamp: Date.now(),
403
+ };
404
+ }
405
+ // Machine is saturated — migrate
406
+ return {
407
+ service: serviceName,
408
+ action: "migrate",
409
+ reason: `CPU at ${health.cpu}% and machine at ${machineCpu}% — needs dedicated hardware`,
410
+ details: {
411
+ currentCpu: health.cpu,
412
+ machineCpu,
413
+ steps: [
414
+ `1. Provision a new machine`,
415
+ `2. Deploy: forge start --http ${this.registry.httpBasePort}`,
416
+ `3. Update config: ${serviceName}: { type: 'remote', address: 'http://<new-host>:${this.registry.httpBasePort}' }`,
417
+ `4. Restart this node — traffic routes automatically`,
418
+ ],
419
+ generatedConfig: {
420
+ [serviceName]: {
421
+ type: "remote",
422
+ address: `http://<new-host>:${this.registry.httpBasePort}`,
423
+ },
424
+ },
425
+ },
426
+ confidence: 0.9,
427
+ timestamp: Date.now(),
428
+ };
429
+ }
430
+ _recordSnapshot(serviceName, instances) {
431
+ if (!this.history.has(serviceName)) {
432
+ this.history.set(serviceName, []);
433
+ }
434
+ const snapshots = this.history.get(serviceName);
435
+ snapshots.push({
436
+ timestamp: Date.now(),
437
+ health: instances.map((i) => ({
438
+ cpu: i.cpu,
439
+ status: i.status,
440
+ workers: i.workers,
441
+ memory: i.memory,
442
+ rpcLatencyP99: i.rpcLatencyP99,
443
+ pendingRequests: i.pendingRequests,
444
+ })),
445
+ });
446
+ // Trim history
447
+ while (snapshots.length > this.maxHistory) {
448
+ snapshots.shift();
449
+ }
450
+ }
451
+ _lowCpuDuration(serviceName) {
452
+ const snapshots = this.history.get(serviceName) ?? [];
453
+ if (snapshots.length === 0)
454
+ return 0;
455
+ // Walk backwards to find how long CPU has been low
456
+ let duration = 0;
457
+ for (let i = snapshots.length - 1; i >= 0; i--) {
458
+ const allLow = snapshots[i].health.every((h) => h.cpu < this.thresholds.underutilized.cpu);
459
+ if (!allLow)
460
+ break;
461
+ duration = Date.now() - snapshots[i].timestamp;
462
+ }
463
+ return duration;
464
+ }
465
+ _getMachineCpu() {
466
+ const now = Date.now();
467
+ const currentCpus = os.cpus().map((cpu) => ({ ...cpu.times }));
468
+ if (!this._lastCpuMeasurement) {
469
+ this._lastCpuMeasurement = { timestamp: now, cpus: currentCpus };
470
+ // RT-M2: Return -1 on first call to signal no valid measurement yet
471
+ return -1;
472
+ }
473
+ const prev = this._lastCpuMeasurement.cpus;
474
+ let totalDelta = 0;
475
+ let idleDelta = 0;
476
+ for (let i = 0; i < currentCpus.length && i < prev.length; i++) {
477
+ const c = currentCpus[i];
478
+ const p = prev[i];
479
+ const delta = c.user -
480
+ p.user +
481
+ (c.nice - p.nice) +
482
+ (c.sys - p.sys) +
483
+ (c.idle - p.idle) +
484
+ (c.irq - p.irq) +
485
+ ((c.steal ?? 0) - (p.steal ?? 0));
486
+ totalDelta += delta;
487
+ idleDelta += c.idle - p.idle;
488
+ }
489
+ this._lastCpuMeasurement = { timestamp: now, cpus: currentCpus };
490
+ const usage = totalDelta > 0 ? Math.round(100 - (100 * idleDelta) / totalDelta) : 0;
491
+ this._lastCpuUsage = usage;
492
+ return usage;
493
+ }
494
+ /**
495
+ * Get current recommendations as a formatted report.
496
+ */
497
+ report() {
498
+ if (this.recommendations.length === 0) {
499
+ return " All services nominal. No scaling actions needed.";
500
+ }
501
+ let report = "";
502
+ for (const rec of this.recommendations) {
503
+ const icon = {
504
+ scale_up: "\u2191",
505
+ scale_down: "\u2193",
506
+ split_out: "\u229E",
507
+ migrate: "\u2192",
508
+ colocate: "\u229F",
509
+ investigate: "?",
510
+ }[rec.action] ?? "\u2022";
511
+ report += ` ${icon} ${rec.service}: ${rec.action.toUpperCase()}\n`;
512
+ report += ` ${rec.reason}\n`;
513
+ if (rec.details.command) {
514
+ report += ` Run: ${rec.details.command}\n`;
515
+ }
516
+ if (rec.details.steps) {
517
+ for (const step of rec.details.steps) {
518
+ report += ` ${step}\n`;
519
+ }
520
+ }
521
+ report += "\n";
522
+ }
523
+ return report;
524
+ }
525
+ }
526
+ //# sourceMappingURL=ScaleAdvisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScaleAdvisor.js","sourceRoot":"","sources":["../../src/scaling/ScaleAdvisor.ts"],"names":[],"mappings":"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"}