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,82 @@
1
+ /**
2
+ * ForgeHost — Multi-Project Hosting Platform
3
+ *
4
+ * Wraps Supervisor via composition to manage multiple projects
5
+ * sharing one machine, one Postgres, one Redis, and one auth system.
6
+ *
7
+ * Usage:
8
+ *
9
+ * import { ForgeHost, defineHost } from 'threadforge';
10
+ *
11
+ * const hostConfig = defineHost({ ... });
12
+ * const host = new ForgeHost(hostConfig);
13
+ * await host.start();
14
+ */
15
+ import type { HostMeta } from "./host-config.js";
16
+ import { resolveAndDefine } from "./host-config.js";
17
+ import type { RegistryMode } from "./config-enums.js";
18
+ interface SupervisorOptions {
19
+ cpus?: number;
20
+ reserved?: number;
21
+ registryMode?: RegistryMode;
22
+ host?: string;
23
+ httpBasePort?: number;
24
+ evaluationIntervalMs?: number;
25
+ }
26
+ interface StatusGroup {
27
+ group: string;
28
+ services: Array<{
29
+ name: string;
30
+ }>;
31
+ workers: number;
32
+ [key: string]: unknown;
33
+ }
34
+ interface StatusResult {
35
+ processGroups: StatusGroup[];
36
+ [key: string]: unknown;
37
+ }
38
+ interface HostStatus extends StatusResult {
39
+ hostMode: true;
40
+ domain: string | null;
41
+ projects: Record<string, ProjectStatus>;
42
+ }
43
+ interface ProjectStatus {
44
+ domain: string | null;
45
+ services: number;
46
+ workers: number;
47
+ schema: string;
48
+ keyPrefix: string;
49
+ }
50
+ type HostConfigInput = Parameters<typeof resolveAndDefine>[0];
51
+ export declare class ForgeHost {
52
+ private _hostConfig;
53
+ private _options;
54
+ private _supervisor;
55
+ private _resolvedConfig;
56
+ private _hostMeta;
57
+ constructor(hostConfig: HostConfigInput, options?: SupervisorOptions);
58
+ /**
59
+ * Resolve all project configs, merge into one flat config,
60
+ * and start the Supervisor.
61
+ */
62
+ start(): Promise<void>;
63
+ /**
64
+ * Gracefully shut down the entire host.
65
+ */
66
+ shutdown(): Promise<void>;
67
+ /**
68
+ * Get status with per-project breakdown.
69
+ */
70
+ status(): HostStatus | null;
71
+ /**
72
+ * Get the list of project IDs.
73
+ */
74
+ get projectIds(): string[];
75
+ /**
76
+ * Get metadata for a specific project.
77
+ */
78
+ getProject(projectId: string): HostMeta | null;
79
+ private _printHostInfo;
80
+ }
81
+ export {};
82
+ //# sourceMappingURL=ForgeHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForgeHost.d.ts","sourceRoot":"","sources":["../../src/core/ForgeHost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAA4B,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,YAAY;IACpB,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,UAAW,SAAQ,YAAY;IACvC,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9D,qBAAa,SAAS;IACpB,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,SAAS,CAAkC;gBAEvC,UAAU,EAAE,eAAe,EAAE,OAAO,GAAE,iBAAsB;IAQxE;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B;;OAEG;IACH,MAAM,IAAI,UAAU,GAAG,IAAI;IA4B3B;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,EAAE,CAEzB;IAED;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAI9C,OAAO,CAAC,cAAc;CAiBvB"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * ForgeHost — Multi-Project Hosting Platform
3
+ *
4
+ * Wraps Supervisor via composition to manage multiple projects
5
+ * sharing one machine, one Postgres, one Redis, and one auth system.
6
+ *
7
+ * Usage:
8
+ *
9
+ * import { ForgeHost, defineHost } from 'threadforge';
10
+ *
11
+ * const hostConfig = defineHost({ ... });
12
+ * const host = new ForgeHost(hostConfig);
13
+ * await host.start();
14
+ */
15
+ import { resolveAndDefine } from "./host-config.js";
16
+ import { Supervisor } from "./Supervisor.js";
17
+ export class ForgeHost {
18
+ _hostConfig;
19
+ _options;
20
+ _supervisor;
21
+ _resolvedConfig;
22
+ _hostMeta;
23
+ constructor(hostConfig, options = {}) {
24
+ this._hostConfig = hostConfig;
25
+ this._options = options;
26
+ this._supervisor = null;
27
+ this._resolvedConfig = null;
28
+ this._hostMeta = null;
29
+ }
30
+ /**
31
+ * Resolve all project configs, merge into one flat config,
32
+ * and start the Supervisor.
33
+ */
34
+ async start() {
35
+ // Resolve host config → flat service map → defineServices()
36
+ this._resolvedConfig = await resolveAndDefine(this._hostConfig);
37
+ this._hostMeta = this._resolvedConfig._hostMeta;
38
+ // Store host meta as JSON for workers to read
39
+ this._resolvedConfig._hostMetaJSON = JSON.stringify(this._hostMeta);
40
+ // Create and start the Supervisor with the merged config
41
+ this._supervisor = new Supervisor(this._resolvedConfig, this._options);
42
+ await this._supervisor.start();
43
+ this._printHostInfo();
44
+ }
45
+ /**
46
+ * Gracefully shut down the entire host.
47
+ */
48
+ async shutdown() {
49
+ if (this._supervisor) {
50
+ await this._supervisor.shutdown();
51
+ }
52
+ }
53
+ /**
54
+ * Get status with per-project breakdown.
55
+ */
56
+ status() {
57
+ if (!this._supervisor || !this._hostMeta)
58
+ return null;
59
+ const base = this._supervisor._status();
60
+ const projects = {};
61
+ for (const [projectId, meta] of Object.entries(this._hostMeta)) {
62
+ const projectGroups = base.processGroups.filter((pg) => pg.services.some((s) => meta.services.includes(s.name)));
63
+ projects[projectId] = {
64
+ domain: meta.domain,
65
+ services: meta.services.length,
66
+ workers: projectGroups.reduce((sum, pg) => sum + pg.workers, 0),
67
+ schema: meta.schema,
68
+ keyPrefix: meta.keyPrefix,
69
+ };
70
+ }
71
+ return {
72
+ ...base,
73
+ hostMode: true,
74
+ domain: this._resolvedConfig._hostDomain,
75
+ projects,
76
+ };
77
+ }
78
+ /**
79
+ * Get the list of project IDs.
80
+ */
81
+ get projectIds() {
82
+ return Object.keys(this._hostMeta ?? {});
83
+ }
84
+ /**
85
+ * Get metadata for a specific project.
86
+ */
87
+ getProject(projectId) {
88
+ return this._hostMeta?.[projectId] ?? null;
89
+ }
90
+ _printHostInfo() {
91
+ console.log(`\n ForgeHost — Multi-Project Platform`);
92
+ console.log(` ─────────────────────────────────────`);
93
+ if (this._resolvedConfig._hostDomain) {
94
+ console.log(` Domain: ${this._resolvedConfig._hostDomain}`);
95
+ }
96
+ console.log(` Projects: ${Object.keys(this._hostMeta).length}`);
97
+ console.log("");
98
+ for (const [projectId, meta] of Object.entries(this._hostMeta)) {
99
+ const domain = meta.domain ? ` (${meta.domain})` : "";
100
+ console.log(` ${projectId}${domain}`);
101
+ console.log(` Services: ${meta.services.join(", ")}`);
102
+ console.log(` Schema: ${meta.schema}`);
103
+ }
104
+ console.log("");
105
+ }
106
+ }
107
+ //# sourceMappingURL=ForgeHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForgeHost.js","sourceRoot":"","sources":["../../src/core/ForgeHost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAwC7C,MAAM,OAAO,SAAS;IACZ,WAAW,CAAkB;IAC7B,QAAQ,CAAoB;IAC5B,WAAW,CAAoB;IAC/B,eAAe,CAAkC;IACjD,SAAS,CAAkC;IAEnD,YAAY,UAA2B,EAAE,UAA6B,EAAE;QACtE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK;QACT,4DAA4D;QAC5D,IAAI,CAAC,eAAe,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;QAEhD,8CAA8C;QAC7C,IAAI,CAAC,eAAwE,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAC3G,IAAI,CAAC,SAAS,CACf,CAAC;QAEF,yDAAyD;QACzD,IAAI,CAAC,WAAW,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvE,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAE/B,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAEtD,MAAM,IAAI,GAAI,IAAI,CAAC,WAAsD,CAAC,OAAO,EAAE,CAAC;QACpF,MAAM,QAAQ,GAAkC,EAAE,CAAC;QAEnD,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAe,EAAE,EAAE,CAClE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAC1E,CAAC;YAEF,QAAQ,CAAC,SAAS,CAAC,GAAG;gBACpB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;gBAC9B,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,EAAe,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpF,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC;QACJ,CAAC;QAED,OAAO;YACL,GAAG,IAAI;YACP,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,IAAI,CAAC,eAAgB,CAAC,WAAW;YACzC,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IAC7C,CAAC;IAEO,cAAc;QACpB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,eAAgB,CAAC,WAAW,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,eAAgB,CAAC,WAAW,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAU,CAAC,EAAE,CAAC;YAChE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,OAAO,SAAS,GAAG,MAAM,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * ForgePlatform — Platform Mode Orchestrator
3
+ *
4
+ * Wraps ForgeHost to provide a platform-level lifecycle with
5
+ * domain-based multi-app routing, shared services, and
6
+ * platform-specific banner output.
7
+ *
8
+ * Usage:
9
+ *
10
+ * import { ForgePlatform, definePlatform } from 'threadforge';
11
+ *
12
+ * const config = definePlatform({ ... });
13
+ * const platform = new ForgePlatform(config);
14
+ * await platform.start();
15
+ */
16
+ interface PlatformApp {
17
+ domains?: string[];
18
+ domain?: string;
19
+ static?: string | null;
20
+ [key: string]: unknown;
21
+ }
22
+ interface PlatformBlock {
23
+ globalAuth?: boolean;
24
+ apps: Record<string, PlatformApp>;
25
+ [key: string]: unknown;
26
+ }
27
+ interface RawPlatformConfig {
28
+ platform: PlatformBlock;
29
+ [key: string]: unknown;
30
+ }
31
+ interface PlatformConfigWrapped {
32
+ _isPlatformConfig: true;
33
+ _raw: RawPlatformConfig;
34
+ [key: string]: unknown;
35
+ }
36
+ type PlatformConfigInput = PlatformConfigWrapped | RawPlatformConfig;
37
+ interface HostMeta {
38
+ services: string[];
39
+ schema: string;
40
+ domain?: string;
41
+ [key: string]: unknown;
42
+ }
43
+ interface AppInfo {
44
+ domains: string[];
45
+ services: string[];
46
+ schema: string;
47
+ static: string | null;
48
+ }
49
+ interface PlatformStatus {
50
+ platformMode: true;
51
+ apps: Record<string, AppInfo>;
52
+ [key: string]: unknown;
53
+ }
54
+ interface SupervisorOptions {
55
+ [key: string]: unknown;
56
+ }
57
+ export declare class ForgePlatform {
58
+ private _platformConfig;
59
+ private _options;
60
+ private _host;
61
+ private _resolvedConfig;
62
+ private _hostMeta;
63
+ private _platformApps;
64
+ /**
65
+ * @param platformConfig - Output from definePlatform() or raw platform config
66
+ * @param options - Supervisor options override
67
+ */
68
+ constructor(platformConfig: PlatformConfigInput, options?: SupervisorOptions);
69
+ /**
70
+ * Start the platform: resolve config, create ForgeHost, start.
71
+ */
72
+ start(): Promise<void>;
73
+ /**
74
+ * Gracefully shut down the platform.
75
+ */
76
+ shutdown(): Promise<void>;
77
+ /**
78
+ * Get the apps map: appId -> { domains, services, schema }
79
+ */
80
+ get apps(): Record<string, AppInfo>;
81
+ /**
82
+ * Get the host metadata (from ForgeHost).
83
+ */
84
+ get hostMeta(): Record<string, HostMeta>;
85
+ /**
86
+ * Get platform status with per-app breakdown.
87
+ */
88
+ status(): PlatformStatus | null;
89
+ /**
90
+ * Collect all service names that belong to a project (not shared).
91
+ */
92
+ private _collectProjectServiceNames;
93
+ private _printPlatformBanner;
94
+ }
95
+ export {};
96
+ //# sourceMappingURL=ForgePlatform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForgePlatform.d.ts","sourceRoot":"","sources":["../../src/core/ForgePlatform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,UAAU,WAAW;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,qBAAqB;IAC7B,iBAAiB,EAAE,IAAI,CAAC;IACxB,IAAI,EAAE,iBAAiB,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,KAAK,mBAAmB,GAAG,qBAAqB,GAAG,iBAAiB,CAAC;AAErE,UAAU,QAAQ;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AASD,UAAU,OAAO;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,UAAU,cAAc;IACtB,YAAY,EAAE,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,iBAAiB;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,aAAa,CAAqC;IAE1D;;;OAGG;gBACS,cAAc,EAAE,mBAAmB,EAAE,OAAO,GAAE,iBAAsB;IAShF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAclC;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAEvC;IAED;;OAEG;IACH,MAAM,IAAI,cAAc,GAAG,IAAI;IAW/B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAQnC,OAAO,CAAC,oBAAoB;CA8B7B"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * ForgePlatform — Platform Mode Orchestrator
3
+ *
4
+ * Wraps ForgeHost to provide a platform-level lifecycle with
5
+ * domain-based multi-app routing, shared services, and
6
+ * platform-specific banner output.
7
+ *
8
+ * Usage:
9
+ *
10
+ * import { ForgePlatform, definePlatform } from 'threadforge';
11
+ *
12
+ * const config = definePlatform({ ... });
13
+ * const platform = new ForgePlatform(config);
14
+ * await platform.start();
15
+ */
16
+ import { ForgeHost } from "./ForgeHost.js";
17
+ import { resolveAppDomains, transformToHostConfig } from "./platform-config.js";
18
+ export class ForgePlatform {
19
+ _platformConfig;
20
+ _options;
21
+ _host;
22
+ _resolvedConfig;
23
+ _hostMeta;
24
+ _platformApps;
25
+ /**
26
+ * @param platformConfig - Output from definePlatform() or raw platform config
27
+ * @param options - Supervisor options override
28
+ */
29
+ constructor(platformConfig, options = {}) {
30
+ this._platformConfig = platformConfig;
31
+ this._options = options;
32
+ this._host = null;
33
+ this._resolvedConfig = null;
34
+ this._hostMeta = null;
35
+ this._platformApps = null;
36
+ }
37
+ /**
38
+ * Start the platform: resolve config, create ForgeHost, start.
39
+ */
40
+ async start() {
41
+ const raw = "_isPlatformConfig" in this._platformConfig && this._platformConfig._isPlatformConfig
42
+ ? this._platformConfig._raw
43
+ : this._platformConfig;
44
+ const hostConfig = transformToHostConfig(raw);
45
+ this._platformApps = raw.platform.apps;
46
+ this._host = new ForgeHost(hostConfig, this._options);
47
+ await this._host.start();
48
+ this._resolvedConfig = this._host._resolvedConfig;
49
+ this._hostMeta = this._resolvedConfig._hostMeta ?? null;
50
+ this._resolvedConfig._isPlatformMode = true;
51
+ this._printPlatformBanner();
52
+ }
53
+ /**
54
+ * Gracefully shut down the platform.
55
+ */
56
+ async shutdown() {
57
+ if (this._host) {
58
+ await this._host.shutdown();
59
+ }
60
+ }
61
+ /**
62
+ * Get the apps map: appId -> { domains, services, schema }
63
+ */
64
+ get apps() {
65
+ if (!this._platformApps || !this._hostMeta)
66
+ return {};
67
+ const result = {};
68
+ for (const [appId, app] of Object.entries(this._platformApps)) {
69
+ const meta = this._hostMeta[appId];
70
+ result[appId] = {
71
+ domains: resolveAppDomains(app),
72
+ services: meta?.services ?? [],
73
+ schema: meta?.schema ?? appId,
74
+ static: app.static ?? null,
75
+ };
76
+ }
77
+ return result;
78
+ }
79
+ /**
80
+ * Get the host metadata (from ForgeHost).
81
+ */
82
+ get hostMeta() {
83
+ return this._hostMeta ?? {};
84
+ }
85
+ /**
86
+ * Get platform status with per-app breakdown.
87
+ */
88
+ status() {
89
+ if (!this._host)
90
+ return null;
91
+ const base = this._host.status();
92
+ return {
93
+ ...base,
94
+ platformMode: true,
95
+ apps: this.apps,
96
+ };
97
+ }
98
+ /**
99
+ * Collect all service names that belong to a project (not shared).
100
+ */
101
+ _collectProjectServiceNames() {
102
+ const names = new Set();
103
+ for (const meta of Object.values(this._hostMeta ?? {})) {
104
+ for (const svc of meta.services)
105
+ names.add(svc);
106
+ }
107
+ return names;
108
+ }
109
+ _printPlatformBanner() {
110
+ console.log(`\n ForgePlatform — Multi-App Platform Mode`);
111
+ console.log(` ──────────────────────────────────────────`);
112
+ const apps = this._platformApps;
113
+ if (!apps)
114
+ return;
115
+ console.log(` Apps: ${Object.keys(apps).length}`);
116
+ console.log("");
117
+ for (const [appId, app] of Object.entries(apps)) {
118
+ const domains = resolveAppDomains(app);
119
+ const meta = this._hostMeta?.[appId];
120
+ console.log(` ${appId}`);
121
+ console.log(` Domains: ${domains.join(", ")}`);
122
+ if (meta) {
123
+ console.log(` Services: ${meta.services.join(", ")}`);
124
+ console.log(` Schema: ${meta.schema}`);
125
+ }
126
+ }
127
+ const projectServices = this._collectProjectServiceNames();
128
+ const allServices = Object.keys(this._resolvedConfig?.services ?? {});
129
+ const sharedServices = allServices.filter((s) => !projectServices.has(s));
130
+ if (sharedServices.length > 0) {
131
+ console.log(`\n Shared: ${sharedServices.join(", ")}`);
132
+ }
133
+ console.log("");
134
+ }
135
+ }
136
+ //# sourceMappingURL=ForgePlatform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForgePlatform.js","sourceRoot":"","sources":["../../src/core/ForgePlatform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { EventEmitter } from "node:events";
2
+ import type { Socket } from "node:net";
3
+ import type { RequestContext } from "./RequestContext.js";
4
+ export interface WsOptions {
5
+ auth?: string;
6
+ allowedOrigins?: string[];
7
+ pingInterval?: number;
8
+ [key: string]: unknown;
9
+ }
10
+ /**
11
+ * Minimal WebSocket implementation (RFC 6455 framing).
12
+ * No external dependencies. Handles text frames, ping/pong, close.
13
+ */
14
+ export declare class ForgeWebSocket extends EventEmitter {
15
+ socket: Socket;
16
+ ctx: RequestContext;
17
+ _closed: boolean;
18
+ _closeSent: boolean;
19
+ _closeTimer: ReturnType<typeof setTimeout> | null;
20
+ _bufferChunks: Buffer[];
21
+ _bufferTotalLen: number;
22
+ _fragments: Buffer[];
23
+ _fragmentOpcode: number;
24
+ _fragmentsTotalSize: number;
25
+ _totalBuffered: number;
26
+ _outboundBuffered: number;
27
+ _pingTimer: ReturnType<typeof setInterval> | null;
28
+ _lastPong: number;
29
+ constructor(socket: Socket, rctx: RequestContext, options?: WsOptions);
30
+ send(data: string | Buffer): void;
31
+ sendBinary(data: Buffer | Uint8Array): void;
32
+ /**
33
+ * Write a frame to the socket while tracking outbound backpressure.
34
+ * Increments _outboundBuffered on write; decrements on drain/callback
35
+ * so _totalBuffered reflects actual pending bytes, not lifetime total.
36
+ */
37
+ _trackOutboundWrite(frame: Buffer): void;
38
+ close(code?: number, reason?: string): void;
39
+ /**
40
+ * P7: Consolidate buffer chunks into a single Buffer only when needed.
41
+ */
42
+ _consolidateBuffer(): void;
43
+ /**
44
+ * Get the current buffer as a single Buffer (consolidating if needed).
45
+ */
46
+ get _buffer(): Buffer;
47
+ /**
48
+ * Set the buffer (replaces all chunks).
49
+ */
50
+ set _buffer(buf: Buffer);
51
+ _onData(buf: Buffer): void;
52
+ _encodeFrame(payload: Buffer, opcode: number): Buffer;
53
+ _onClose(): void;
54
+ _startPingInterval(intervalMs: number): void;
55
+ }
56
+ //# sourceMappingURL=ForgeWebSocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForgeWebSocket.d.ts","sourceRoot":"","sources":["../../src/core/ForgeWebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1D,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;IAClD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAC;IAClD,SAAS,EAAE,MAAM,CAAC;gBAEN,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,GAAE,SAAc;IA8BzE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOjC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAO3C;;;;OAIG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAmBxC,KAAK,CAAC,IAAI,GAAE,MAAa,EAAE,MAAM,GAAE,MAAW,GAAG,IAAI;IA0BrD;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAW1B;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAKpB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,GAAG,EAAE,MAAM,EAQtB;IAED,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IA2N1B,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAqBrD,QAAQ,IAAI,IAAI;IAgBhB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAoB7C"}