threadforge 0.1.0 → 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 (359) hide show
  1. package/README.md +52 -20
  2. package/bin/forge.js +2 -1049
  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 +160 -49
  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 +84 -22
  318. package/shared/identity.js +26 -0
  319. package/src/core/DirectMessageBus.js +0 -364
  320. package/src/core/EndpointResolver.js +0 -247
  321. package/src/core/ForgeContext.js +0 -2227
  322. package/src/core/ForgeHost.js +0 -122
  323. package/src/core/ForgePlatform.js +0 -145
  324. package/src/core/Ingress.js +0 -768
  325. package/src/core/Interceptors.js +0 -420
  326. package/src/core/MessageBus.js +0 -310
  327. package/src/core/Prometheus.js +0 -305
  328. package/src/core/RequestContext.js +0 -413
  329. package/src/core/RoutingStrategy.js +0 -316
  330. package/src/core/Supervisor.js +0 -1306
  331. package/src/core/ThreadAllocator.js +0 -196
  332. package/src/core/WorkerChannelManager.js +0 -879
  333. package/src/core/config.js +0 -624
  334. package/src/core/host-config.js +0 -311
  335. package/src/core/network-utils.js +0 -166
  336. package/src/core/platform-config.js +0 -308
  337. package/src/decorators/ServiceProxy.js +0 -899
  338. package/src/decorators/index.js +0 -571
  339. package/src/deploy/NginxGenerator.js +0 -865
  340. package/src/deploy/PlatformManifestGenerator.js +0 -96
  341. package/src/deploy/RouteManifestGenerator.js +0 -112
  342. package/src/deploy/index.js +0 -984
  343. package/src/frontend/FrontendDevLifecycle.js +0 -65
  344. package/src/frontend/FrontendPluginOrchestrator.js +0 -187
  345. package/src/frontend/SiteResolver.js +0 -63
  346. package/src/frontend/StaticMountRegistry.js +0 -90
  347. package/src/frontend/plugins/viteFrontend.js +0 -79
  348. package/src/frontend/types.js +0 -35
  349. package/src/index.js +0 -56
  350. package/src/plugins/PluginManager.js +0 -537
  351. package/src/plugins/ScopedPostgres.js +0 -192
  352. package/src/plugins/ScopedRedis.js +0 -142
  353. package/src/plugins/index.js +0 -1729
  354. package/src/registry/ServiceRegistry.js +0 -796
  355. package/src/scaling/ScaleAdvisor.js +0 -442
  356. package/src/services/Service.js +0 -195
  357. package/src/services/worker-bootstrap.js +0 -676
  358. package/src/templates/auth-service.js +0 -65
  359. 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":"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"}
@@ -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"}