threadforge 0.1.1 → 0.2.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 (358) hide show
  1. package/README.md +52 -20
  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 +78 -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,157 @@
1
+ /**
2
+ * Template builders for init and scaffold commands.
3
+ */
4
+ export function buildDefaultInitConfig(configImportPath, mode = "none") {
5
+ const importClause = mode === "react" ? "defineServices, ServiceType, viteFrontend" : "defineServices, ServiceType";
6
+ const baseConfig = `import { ${importClause} } from '${configImportPath}';
7
+
8
+ export default defineServices({
9
+ api: {
10
+ entry: './services/api.js',
11
+ type: ServiceType.EDGE,
12
+ port: 3000,
13
+ threads: 'auto',
14
+ // connects: ['otherService'], // add services this one calls
15
+ },
16
+ }`;
17
+ if (mode === "none") {
18
+ return `${baseConfig});
19
+ `;
20
+ }
21
+ if (mode === "static") {
22
+ return `${baseConfig}, {
23
+ sites: {
24
+ app: {
25
+ siteId: 'app',
26
+ services: ['api'],
27
+ domains: [],
28
+ frontend: {
29
+ outDir: './public',
30
+ basePath: '/',
31
+ spaFallback: true,
32
+ },
33
+ },
34
+ },
35
+ });
36
+ `;
37
+ }
38
+ return `${baseConfig}, {
39
+ frontendPlugins: [viteFrontend()],
40
+ sites: {
41
+ app: {
42
+ siteId: 'app',
43
+ services: ['api'],
44
+ domains: [],
45
+ frontend: {
46
+ plugin: 'vite',
47
+ root: './web',
48
+ outDir: '.threadforge/build/app',
49
+ basePath: '/',
50
+ spaFallback: true,
51
+ },
52
+ },
53
+ },
54
+ });
55
+ `;
56
+ }
57
+ export function buildDefaultPublicIndexHtml() {
58
+ return `<!DOCTYPE html>
59
+ <html lang="en">
60
+ <head>
61
+ <meta charset="UTF-8">
62
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
63
+ <title>ThreadForge App</title>
64
+ </head>
65
+ <body>
66
+ <h1>ThreadForge is running!</h1>
67
+ <p>Hello from <span id="name">...</span></p>
68
+ <script>
69
+ fetch('/hello/World').then(r => r.json()).then(d => {
70
+ document.getElementById('name').textContent = d.message;
71
+ });
72
+ </script>
73
+ </body>
74
+ </html>
75
+ `;
76
+ }
77
+ export function buildDefaultReactWebPackageJson() {
78
+ return `${JSON.stringify({
79
+ name: "app-web",
80
+ private: true,
81
+ version: "1.0.0",
82
+ type: "module",
83
+ scripts: {
84
+ build: "vite build",
85
+ dev: "vite",
86
+ },
87
+ dependencies: {
88
+ react: "^18.3.1",
89
+ "react-dom": "^18.3.1",
90
+ },
91
+ devDependencies: {
92
+ vite: "^5.4.10",
93
+ },
94
+ }, null, 2)}\n`;
95
+ }
96
+ export function buildDefaultReactWebIndexHtml() {
97
+ return `<!doctype html>
98
+ <html lang="en">
99
+ <head>
100
+ <meta charset="UTF-8" />
101
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
102
+ <title>ThreadForge React App</title>
103
+ </head>
104
+ <body>
105
+ <div id="root"></div>
106
+ <script type="module" src="/src/main.jsx"></script>
107
+ </body>
108
+ </html>
109
+ `;
110
+ }
111
+ export function buildDefaultReactWebMainJsx() {
112
+ return `import React from 'react';
113
+ import { createRoot } from 'react-dom/client';
114
+
115
+ function App() {
116
+ return <h1>Hello World</h1>;
117
+ }
118
+
119
+ createRoot(document.getElementById('root')).render(<App />);
120
+ `;
121
+ }
122
+ export function generateDeployTemplate() {
123
+ return `// forge.deploy.js \u2014 Multi-machine deployment manifest
124
+ // Edit this file with your node addresses, then run: forge deploy
125
+
126
+ export default {
127
+ cluster: 'my-saas',
128
+
129
+ nodes: {
130
+ 'web-1': {
131
+ host: '10.0.1.10',
132
+ services: ['gateway'],
133
+ role: 'edge',
134
+ },
135
+ 'api-1': {
136
+ host: '10.0.1.20',
137
+ services: ['users'],
138
+ role: 'api',
139
+ },
140
+ 'worker-1': {
141
+ host: '10.0.1.30',
142
+ services: ['notifications'],
143
+ role: 'worker',
144
+ },
145
+ },
146
+
147
+ registry: 'multicast',
148
+ httpBasePort: 4000,
149
+ metricsPort: 9090,
150
+ forgeProxy: {
151
+ host: '127.0.0.1',
152
+ port: 8080,
153
+ },
154
+ };
155
+ `;
156
+ }
157
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/cli/util/templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,sBAAsB,CACpC,gBAAwB,EACxB,OAAoC,MAAM;IAE1C,MAAM,YAAY,GAChB,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC,6BAA6B,CAAC;IACjG,MAAM,UAAU,GAAG,YAAY,YAAY,YAAY,gBAAgB;;;;;;;;;;EAUvE,CAAC;IAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,GAAG,UAAU;CACvB,CAAC;IACA,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,GAAG,UAAU;;;;;;;;;;;;;;CAcvB,CAAC;IACA,CAAC;IAED,OAAO,GAAG,UAAU;;;;;;;;;;;;;;;;;CAiBrB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO;;;;;;;;;;;;;;;;;CAiBR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,+BAA+B;IAC7C,OAAO,GAAG,IAAI,CAAC,SAAS,CACtB;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,KAAK,EAAE,YAAY;YACnB,GAAG,EAAE,MAAM;SACZ;QACD,YAAY,EAAE;YACZ,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,SAAS;SACvB;QACD,eAAe,EAAE;YACf,IAAI,EAAE,SAAS;SAChB;KACF,EACD,IAAI,EACJ,CAAC,CACF,IAAI,CAAC;AACR,CAAC;AAED,MAAM,UAAU,6BAA6B;IAC3C,OAAO;;;;;;;;;;;;CAYR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO;;;;;;;;CAQR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCR,CAAC;AACF,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * AlertSink — Pluggable alert delivery for critical runtime events.
3
+ *
4
+ * Emits alerts for crash loops, restart limit exhaustion, heartbeat
5
+ * timeouts, and other critical Supervisor events. Ships with a
6
+ * webhook-based default implementation; custom sinks can be provided
7
+ * via the `alerts.sink` config field.
8
+ *
9
+ * Configuration (forge.config):
10
+ *
11
+ * alerts: {
12
+ * webhook: 'https://hooks.slack.com/...',
13
+ * // Optional overrides:
14
+ * headers: { Authorization: 'Bearer ...' },
15
+ * retries: 3,
16
+ * retryDelayMs: 1000,
17
+ * retryMaxDelayMs: 30000,
18
+ * }
19
+ */
20
+ export type AlertSeverity = "critical" | "warning" | "info";
21
+ export interface Alert {
22
+ /** Machine-readable event type */
23
+ event: string;
24
+ /** Human-readable summary */
25
+ message: string;
26
+ severity: AlertSeverity;
27
+ /** ISO-8601 timestamp */
28
+ timestamp: string;
29
+ /** Additional structured data */
30
+ details: Record<string, unknown>;
31
+ }
32
+ export interface AlertSinkConfig {
33
+ /** Webhook URL for alert delivery */
34
+ webhook?: string;
35
+ /** Additional headers to include in webhook requests */
36
+ headers?: Record<string, string>;
37
+ /** Maximum number of retry attempts for failed deliveries (default: 3) */
38
+ retries?: number;
39
+ /** Base delay in ms for exponential backoff (default: 1000) */
40
+ retryDelayMs?: number;
41
+ /** Maximum delay in ms for exponential backoff (default: 30000) */
42
+ retryMaxDelayMs?: number;
43
+ /** Custom sink function — overrides webhook when provided */
44
+ sink?: (alert: Alert) => Promise<void>;
45
+ }
46
+ /**
47
+ * AlertSink delivers alerts to external systems with retry/backoff.
48
+ *
49
+ * Delivery is fire-and-forget from the caller's perspective — failed
50
+ * alerts are logged but never block the Supervisor's main loop.
51
+ */
52
+ export declare class AlertSink {
53
+ private _config;
54
+ private _retries;
55
+ private _retryDelayMs;
56
+ private _retryMaxDelayMs;
57
+ private _deliveryQueue;
58
+ private _stopped;
59
+ constructor(config?: AlertSinkConfig);
60
+ /** Whether this sink has a delivery target configured */
61
+ get isConfigured(): boolean;
62
+ /**
63
+ * Emit an alert. Delivery is non-blocking — errors are caught and logged.
64
+ * Alerts are serialized (one at a time) to avoid overwhelming the webhook.
65
+ */
66
+ emit(event: string, message: string, severity?: AlertSeverity, details?: Record<string, unknown>): void;
67
+ /**
68
+ * Wait for all pending alert deliveries to complete.
69
+ * Useful for graceful shutdown.
70
+ */
71
+ flush(): Promise<void>;
72
+ /** Stop accepting new alerts and drain pending deliveries */
73
+ stop(): Promise<void>;
74
+ /**
75
+ * Deliver a single alert with retry/backoff.
76
+ */
77
+ private _deliver;
78
+ /**
79
+ * Send an alert via HTTP webhook POST.
80
+ */
81
+ private _deliverWebhook;
82
+ }
83
+ //# sourceMappingURL=AlertSink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlertSink.d.ts","sourceRoot":"","sources":["../../src/core/AlertSink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,KAAK;IACpB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAU;gBAEd,MAAM,GAAE,eAAoB;IASxC,yDAAyD;IACzD,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAyB,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI;IAiBtH;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,6DAA6D;IACvD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;OAEG;YACW,QAAQ;IA2BtB;;OAEG;YACW,eAAe;CAuB9B"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * AlertSink — Pluggable alert delivery for critical runtime events.
3
+ *
4
+ * Emits alerts for crash loops, restart limit exhaustion, heartbeat
5
+ * timeouts, and other critical Supervisor events. Ships with a
6
+ * webhook-based default implementation; custom sinks can be provided
7
+ * via the `alerts.sink` config field.
8
+ *
9
+ * Configuration (forge.config):
10
+ *
11
+ * alerts: {
12
+ * webhook: 'https://hooks.slack.com/...',
13
+ * // Optional overrides:
14
+ * headers: { Authorization: 'Bearer ...' },
15
+ * retries: 3,
16
+ * retryDelayMs: 1000,
17
+ * retryMaxDelayMs: 30000,
18
+ * }
19
+ */
20
+ /**
21
+ * AlertSink delivers alerts to external systems with retry/backoff.
22
+ *
23
+ * Delivery is fire-and-forget from the caller's perspective — failed
24
+ * alerts are logged but never block the Supervisor's main loop.
25
+ */
26
+ export class AlertSink {
27
+ _config;
28
+ _retries;
29
+ _retryDelayMs;
30
+ _retryMaxDelayMs;
31
+ _deliveryQueue;
32
+ _stopped;
33
+ constructor(config = {}) {
34
+ this._config = config;
35
+ this._retries = config.retries ?? 3;
36
+ this._retryDelayMs = config.retryDelayMs ?? 1000;
37
+ this._retryMaxDelayMs = config.retryMaxDelayMs ?? 30000;
38
+ this._deliveryQueue = Promise.resolve();
39
+ this._stopped = false;
40
+ }
41
+ /** Whether this sink has a delivery target configured */
42
+ get isConfigured() {
43
+ return Boolean(this._config.webhook || this._config.sink);
44
+ }
45
+ /**
46
+ * Emit an alert. Delivery is non-blocking — errors are caught and logged.
47
+ * Alerts are serialized (one at a time) to avoid overwhelming the webhook.
48
+ */
49
+ emit(event, message, severity = "warning", details = {}) {
50
+ if (!this.isConfigured || this._stopped)
51
+ return;
52
+ const alert = {
53
+ event,
54
+ message,
55
+ severity,
56
+ timestamp: new Date().toISOString(),
57
+ details,
58
+ };
59
+ // Chain onto the delivery queue so alerts are sent sequentially
60
+ this._deliveryQueue = this._deliveryQueue.then(() => this._deliver(alert)).catch(() => {
61
+ /* swallowed — _deliver already logs failures */
62
+ });
63
+ }
64
+ /**
65
+ * Wait for all pending alert deliveries to complete.
66
+ * Useful for graceful shutdown.
67
+ */
68
+ async flush() {
69
+ await this._deliveryQueue;
70
+ }
71
+ /** Stop accepting new alerts and drain pending deliveries */
72
+ async stop() {
73
+ this._stopped = true;
74
+ await this.flush();
75
+ }
76
+ /**
77
+ * Deliver a single alert with retry/backoff.
78
+ */
79
+ async _deliver(alert) {
80
+ for (let attempt = 0; attempt <= this._retries; attempt++) {
81
+ try {
82
+ if (this._config.sink) {
83
+ await this._config.sink(alert);
84
+ }
85
+ else if (this._config.webhook) {
86
+ await this._deliverWebhook(alert);
87
+ }
88
+ return; // success
89
+ }
90
+ catch (err) {
91
+ const isLastAttempt = attempt >= this._retries;
92
+ if (isLastAttempt) {
93
+ console.error(`[AlertSink] Failed to deliver alert "${alert.event}" after ${this._retries + 1} attempts: ${err.message}`);
94
+ return;
95
+ }
96
+ // Exponential backoff with jitter
97
+ const delay = Math.min(this._retryDelayMs * 2 ** attempt + Math.random() * this._retryDelayMs, this._retryMaxDelayMs);
98
+ await new Promise((resolve) => setTimeout(resolve, delay));
99
+ }
100
+ }
101
+ }
102
+ /**
103
+ * Send an alert via HTTP webhook POST.
104
+ */
105
+ async _deliverWebhook(alert) {
106
+ const url = this._config.webhook;
107
+ const headers = {
108
+ "Content-Type": "application/json",
109
+ ...this._config.headers,
110
+ };
111
+ const resp = await fetch(url, {
112
+ method: "POST",
113
+ headers,
114
+ body: JSON.stringify(alert),
115
+ signal: AbortSignal.timeout(10_000),
116
+ });
117
+ if (!resp.ok) {
118
+ // Consume the body to avoid leaking connections
119
+ await resp.text().catch(() => { });
120
+ throw new Error(`Webhook returned ${resp.status}`);
121
+ }
122
+ // Consume the body to avoid leaking connections
123
+ await resp.text().catch(() => { });
124
+ }
125
+ }
126
+ //# sourceMappingURL=AlertSink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlertSink.js","sourceRoot":"","sources":["../../src/core/AlertSink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AA+BH;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACZ,OAAO,CAAkB;IACzB,QAAQ,CAAS;IACjB,aAAa,CAAS;IACtB,gBAAgB,CAAS;IACzB,cAAc,CAAgB;IAC9B,QAAQ,CAAU;IAE1B,YAAY,SAA0B,EAAE;QACtC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC;QACjD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,eAAe,IAAI,KAAK,CAAC;QACxD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,yDAAyD;IACzD,IAAI,YAAY;QACd,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,KAAa,EAAE,OAAe,EAAE,WAA0B,SAAS,EAAE,UAAmC,EAAE;QAC7G,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEhD,MAAM,KAAK,GAAU;YACnB,KAAK;YACL,OAAO;YACP,QAAQ;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO;SACR,CAAC;QAEF,gEAAgE;QAChE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACpF,gDAAgD;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ,CAAC,KAAY;QACjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;YAC1D,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;oBACtB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjC,CAAC;qBAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;oBAChC,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;gBACpC,CAAC;gBACD,OAAO,CAAC,UAAU;YACpB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,aAAa,GAAG,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC;gBAC/C,IAAI,aAAa,EAAE,CAAC;oBAClB,OAAO,CAAC,KAAK,CACX,wCAAwC,KAAK,CAAC,KAAK,WAAW,IAAI,CAAC,QAAQ,GAAG,CAAC,cAAe,GAAa,CAAC,OAAO,EAAE,CACtH,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,kCAAkC;gBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EACtE,IAAI,CAAC,gBAAgB,CACtB,CAAC;gBACF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,KAAY;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAQ,CAAC;QAClC,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;SACxB,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC5B,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAC3B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,gDAAgD;YAChD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,gDAAgD;QAChD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,88 @@
1
+ import { EventEmitter } from "node:events";
2
+ interface WorkerLike {
3
+ id?: number;
4
+ threadId?: number;
5
+ process?: {
6
+ connected: boolean;
7
+ };
8
+ isDead?: () => boolean;
9
+ isConnected?: () => boolean;
10
+ send: (message: unknown) => void;
11
+ on: (event: string, listener: (...args: unknown[]) => void) => this;
12
+ off: (event: string, listener: (...args: unknown[]) => void) => this;
13
+ }
14
+ interface WorkerEntry {
15
+ id: number;
16
+ worker: WorkerLike;
17
+ mode: string;
18
+ socketPath: string | null;
19
+ _messageHandler?: (msg: unknown) => void;
20
+ _errorHandler?: (err: unknown) => void;
21
+ }
22
+ interface UnregisterOptions {
23
+ suppressBroadcast?: boolean;
24
+ }
25
+ export interface ServiceStats {
26
+ workerCount: number;
27
+ ids: number[];
28
+ directSockets: number;
29
+ }
30
+ /**
31
+ * DirectMessageBus — Unix Domain Socket Mesh (Supervisor Side)
32
+ *
33
+ * The fundamental problem: cluster.Worker.send() can only transfer
34
+ * sockets/servers, not MessagePort objects. So we can't use MessageChannel
35
+ * for direct worker-to-worker communication in cluster mode.
36
+ *
37
+ * Solution: Each worker opens a Unix domain socket server. Workers connect
38
+ * directly to each other via these sockets. The supervisor only tells
39
+ * workers WHERE to connect (socket paths), then gets out of the way.
40
+ *
41
+ * Architecture:
42
+ *
43
+ * SETUP (supervisor involved briefly):
44
+ * 1. Each worker starts a UDS server at /tmp/forge-{pid}/{service}-{worker}.sock
45
+ * 2. Worker reports its socket path to supervisor via IPC
46
+ * 3. Supervisor broadcasts the full socket registry to all workers
47
+ * 4. Workers establish direct connections to each other
48
+ *
49
+ * RUNTIME (supervisor NOT involved in message routing):
50
+ * Worker A ──UDS──► Worker B (direct, length-prefixed JSON)
51
+ * Worker B ──UDS──► Worker A
52
+ *
53
+ * Supervisor only handles:
54
+ * - Socket path registry distribution (one-time + on new workers)
55
+ * - Health checks (periodic pull, not per-message)
56
+ * - Worker lifecycle (restart, scale)
57
+ */
58
+ export declare class DirectMessageBus extends EventEmitter {
59
+ workers: Map<string, WorkerEntry[]>;
60
+ socketRegistry: Map<string, string>;
61
+ _registeredWorkerIds: Set<number>;
62
+ _workerErrorHandlers: WeakMap<WorkerLike, (err: unknown) => void>;
63
+ _connections: Map<string, Set<string>>;
64
+ _socketDir: string;
65
+ _broadcastTimer: ReturnType<typeof setTimeout> | null;
66
+ constructor();
67
+ get socketDir(): string;
68
+ /**
69
+ * Register a worker. Tell it to start a UDS server, then
70
+ * broadcast the updated registry to all workers.
71
+ */
72
+ registerWorker(serviceName: string, worker: WorkerLike, mode?: string): void;
73
+ _scheduleBroadcast(): void;
74
+ _sendInitSocket(worker: WorkerLike, serviceName: string, workerId: number): void;
75
+ _sendRegistryTo(worker: WorkerLike): void;
76
+ _broadcastRegistry(): void;
77
+ unregisterWorker(serviceName: string, workerId: number, options?: UnregisterOptions): void;
78
+ unregisterService(serviceName: string): void;
79
+ requestHealthChecks(): void;
80
+ stats(): Record<string, ServiceStats>;
81
+ /**
82
+ * CR-IPC-9: Get the connection matrix for debugging.
83
+ */
84
+ getConnectionMatrix(): Record<string, string[]>;
85
+ cleanup(): void;
86
+ }
87
+ export {};
88
+ //# sourceMappingURL=DirectMessageBus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DirectMessageBus.d.ts","sourceRoot":"","sources":["../../src/core/DirectMessageBus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,UAAU,UAAU;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;IAC5B,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;IACpE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;CACtE;AAED,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAWD,UAAU,iBAAiB;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB;AA6CD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACpC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,oBAAoB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC;IAClE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;;IAwBtD,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;;OAGG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAE,MAAkB,GAAG,IAAI;IAuGvF,kBAAkB,IAAI,IAAI;IAc1B,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAgBhF,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAoBzC,kBAAkB,IAAI,IAAI;IAQ1B,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,IAAI;IAkC9F,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAO5C,mBAAmB,IAAI,IAAI;IAe3B,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAYrC;;OAEG;IACH,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAQ/C,OAAO,IAAI,IAAI;CAQhB"}