bazis 0.96.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 (513) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -0
  3. package/cli/build.ts +147 -0
  4. package/cli/codegen.ts +40 -0
  5. package/cli/generateModule.ts +187 -0
  6. package/cli/generateProject.ts +183 -0
  7. package/cli/main.ts +125 -0
  8. package/cli/moduleRegistration.ts +127 -0
  9. package/cli/naming.ts +124 -0
  10. package/cli/parseCli.ts +151 -0
  11. package/cli/templates/module.ts +497 -0
  12. package/cli/templates/pack.ts +76 -0
  13. package/cli/templates/passport.ts +178 -0
  14. package/core/agent/AgentContextBuilder.ts +567 -0
  15. package/core/agent/AgentDataDefinition.ts +8 -0
  16. package/core/agent/AgentRegistry.ts +539 -0
  17. package/core/agent/AgentRuntime.ts +47 -0
  18. package/core/agent/AgentToolExecutor.ts +2130 -0
  19. package/core/agent/AgentToolHooks.ts +39 -0
  20. package/core/agent/ModelProvider.ts +21 -0
  21. package/core/agent/README.md +229 -0
  22. package/core/agent/Tool.contract.ts +20 -0
  23. package/core/agent/decorators/Agent.ts +11 -0
  24. package/core/agent/decorators/Prompt.ts +11 -0
  25. package/core/agent/decorators/Task.ts +29 -0
  26. package/core/agent/decorators/Tool.ts +12 -0
  27. package/core/agent/errors.ts +43 -0
  28. package/core/agent/generated/catalog.ts +26 -0
  29. package/core/agent/index.ts +170 -0
  30. package/core/agent/internal/AgentExecutionDriver.ts +1497 -0
  31. package/core/agent/internal/AgentExecutionState.ts +775 -0
  32. package/core/agent/internal/AgentJsonSchema.ts +150 -0
  33. package/core/agent/internal/AgentModelBinding.ts +57 -0
  34. package/core/agent/internal/Schema.contract.ts +36 -0
  35. package/core/agent/internal/ToolAudit.projector.ts +163 -0
  36. package/core/agent/internal/ToolContract.validator.ts +102 -0
  37. package/core/agent/metadata.ts +398 -0
  38. package/core/agent/moduleContributions-v1.ts +113 -0
  39. package/core/agent/semantic.ts +903 -0
  40. package/core/agent/session/codec.ts +33 -0
  41. package/core/agent/session/contracts.ts +96 -0
  42. package/core/agent/session/entities.ts +84 -0
  43. package/core/agent/session/protector.ts +92 -0
  44. package/core/app/index.ts +5 -0
  45. package/core/app/runApp.ts +293 -0
  46. package/core/app/ui/index.ts +29 -0
  47. package/core/app/ui/uiProfileResolver.ts +966 -0
  48. package/core/app/ui/uiSurfaceHosting.ts +38 -0
  49. package/core/app/ui/uiSurfaceHttp.ts +476 -0
  50. package/core/background/BackgroundService.ts +223 -0
  51. package/core/background/backgroundModule.ts +42 -0
  52. package/core/background/decorator.ts +43 -0
  53. package/core/background/delay.ts +27 -0
  54. package/core/background/index.ts +15 -0
  55. package/core/cache/COMPATIBILITY.md +13 -0
  56. package/core/cache/ICache.ts +71 -0
  57. package/core/cache/MemoryCache.ts +394 -0
  58. package/core/cache/README.md +83 -0
  59. package/core/cache/SPEC.md +1355 -0
  60. package/core/cache/cacheModule.ts +21 -0
  61. package/core/cache/decorators/Cacheable.ts +38 -0
  62. package/core/cache/decorators/CacheableRedis.ts +39 -0
  63. package/core/cache/decorators/OutputCache.ts +33 -0
  64. package/core/cache/decorators/OutputRedisCache.ts +33 -0
  65. package/core/cache/decorators/cacheableMetadata.ts +78 -0
  66. package/core/cache/decorators/cacheableRedisMetadata.ts +81 -0
  67. package/core/cache/decorators/outputCacheMetadata.ts +71 -0
  68. package/core/cache/decorators/outputRedisCacheMetadata.ts +77 -0
  69. package/core/cache/di/classProviderHook.ts +26 -0
  70. package/core/cache/distributed/CacheCodec.ts +5 -0
  71. package/core/cache/distributed/DistributedCache.ts +403 -0
  72. package/core/cache/distributed/DistributedCacheDriver.ts +83 -0
  73. package/core/cache/distributed/DistributedCacheStores.ts +28 -0
  74. package/core/cache/distributed/IDistributedCache.ts +40 -0
  75. package/core/cache/distributed/NamedCacheRegistry.ts +23 -0
  76. package/core/cache/distributed/codecs.ts +32 -0
  77. package/core/cache/distributed/index.ts +19 -0
  78. package/core/cache/errors/CacheError.ts +16 -0
  79. package/core/cache/http/CachedHttpPayload.ts +213 -0
  80. package/core/cache/http/applyClientCacheHeaders.ts +61 -0
  81. package/core/cache/http/buildOutputCacheKey.ts +154 -0
  82. package/core/cache/http/buildRedisOutputCacheKey.ts +16 -0
  83. package/core/cache/http/composeOutputCache.ts +130 -0
  84. package/core/cache/http/outputCacheMiddleware.ts +111 -0
  85. package/core/cache/http/outputCacheSecurityWarning.ts +58 -0
  86. package/core/cache/http/outputRedisCacheMiddleware.ts +118 -0
  87. package/core/cache/index.ts +97 -0
  88. package/core/cache/internal/AutomaticCacheKey.ts +106 -0
  89. package/core/cache/internal/CacheKeyGuard.ts +56 -0
  90. package/core/cache/internal/buildCacheProviders.ts +146 -0
  91. package/core/cache/internal/normalizeCacheKey.ts +9 -0
  92. package/core/cache/internal/resolveCachePolicy.ts +32 -0
  93. package/core/cache/internal/resolveCacheableRedisPolicy.ts +17 -0
  94. package/core/cache/internal/resolveOutputRedisCachePolicy.ts +17 -0
  95. package/core/cache/providers/cachedProviders.ts +68 -0
  96. package/core/cache/services/cacheProxy.ts +243 -0
  97. package/core/cache/tokens/CACHE_POLICIES.ts +5 -0
  98. package/core/cache/tokens/DISTRIBUTED_CACHE.ts +30 -0
  99. package/core/cache/types/CacheEntry.ts +7 -0
  100. package/core/cache/types/CacheOptions.ts +60 -0
  101. package/core/cache/types/CachePolicy.ts +74 -0
  102. package/core/cache/types/CacheableRedisOptions.ts +23 -0
  103. package/core/cache/types/OutputRedisCacheOptions.ts +25 -0
  104. package/core/di/README.md +104 -0
  105. package/core/di/ServiceCollection.ts +185 -0
  106. package/core/di/ServiceProvider.ts +689 -0
  107. package/core/di/ServiceScope.ts +61 -0
  108. package/core/di/container.ts +38 -0
  109. package/core/di/errors/AmbiguousNamedDependencyError.ts +10 -0
  110. package/core/di/errors/AsyncResolutionRequiredError.ts +12 -0
  111. package/core/di/errors/CircularDependencyError.ts +10 -0
  112. package/core/di/errors/ClassDependenciesMismatchError.ts +15 -0
  113. package/core/di/errors/DiError.ts +6 -0
  114. package/core/di/errors/InvalidProviderError.ts +9 -0
  115. package/core/di/errors/ModuleEncapsulationError.ts +7 -0
  116. package/core/di/errors/ModuleOwnedProviderConflictError.ts +8 -0
  117. package/core/di/errors/NamedDependencyNotFoundError.ts +7 -0
  118. package/core/di/errors/OptionsValidationError.ts +7 -0
  119. package/core/di/errors/ProviderNotFoundError.ts +10 -0
  120. package/core/di/errors/ScopeDisposedError.ts +7 -0
  121. package/core/di/errors/ScopedServiceFromRootError.ts +9 -0
  122. package/core/di/errors/ServiceValidationError.ts +7 -0
  123. package/core/di/errors/index.ts +14 -0
  124. package/core/di/extensions/activator.ts +39 -0
  125. package/core/di/extensions/application.ts +117 -0
  126. package/core/di/extensions/hosted-service.ts +124 -0
  127. package/core/di/extensions/index.ts +23 -0
  128. package/core/di/extensions/options-reloadable.ts +137 -0
  129. package/core/di/extensions/options.ts +91 -0
  130. package/core/di/extensions/service-provider-token.ts +21 -0
  131. package/core/di/index.ts +97 -0
  132. package/core/di/internal/GraphValidator.ts +119 -0
  133. package/core/di/internal/HostedServicePlan.ts +158 -0
  134. package/core/di/internal/NamedTokenIndex.ts +55 -0
  135. package/core/di/internal/OpenGenericRegistration.ts +14 -0
  136. package/core/di/internal/ResolutionPlan.ts +18 -0
  137. package/core/di/internal/ResolutionScopeState.ts +19 -0
  138. package/core/di/internal/ResolutionTracker.ts +153 -0
  139. package/core/di/internal/ScopeLifecycle.ts +159 -0
  140. package/core/di/internal/ServiceRegistration.ts +14 -0
  141. package/core/di/internal/ServiceRegistry.ts +252 -0
  142. package/core/di/internal/classDeps.ts +38 -0
  143. package/core/di/internal/disposal.ts +58 -0
  144. package/core/di/internal/providerDeps.ts +26 -0
  145. package/core/di/module/DI.ts +146 -0
  146. package/core/di/module/Global.ts +25 -0
  147. package/core/di/module/Module.ts +44 -0
  148. package/core/di/module/ModuleRegistrar.ts +69 -0
  149. package/core/di/module/autoDeps.ts +39 -0
  150. package/core/di/module/classProviderHooks.ts +66 -0
  151. package/core/di/module/collectModuleConfigs.ts +57 -0
  152. package/core/di/module/collectModuleControllers.ts +53 -0
  153. package/core/di/module/collectModuleUiProfiles.ts +53 -0
  154. package/core/di/module/createContainer.ts +261 -0
  155. package/core/di/module/encapsulation.ts +416 -0
  156. package/core/di/module/encapsulationHooks.ts +36 -0
  157. package/core/di/module/generatedProviderAttachments.ts +102 -0
  158. package/core/di/module/index.ts +41 -0
  159. package/core/di/module/moduleExtensions.ts +35 -0
  160. package/core/di/module/moduleNameBinding.ts +136 -0
  161. package/core/di/module/moduleOwnedProviderContributors.ts +409 -0
  162. package/core/di/module/providerSelection.ts +90 -0
  163. package/core/di/module/shortcuts.ts +111 -0
  164. package/core/di/module/types/BazisModule.ts +71 -0
  165. package/core/di/module/types/DiRegistrar.ts +24 -0
  166. package/core/di/module/types/index.ts +2 -0
  167. package/core/di/provider/index.ts +26 -0
  168. package/core/di/provider/providerGuards.ts +17 -0
  169. package/core/di/provider/types/AsyncFactoryProvider.ts +15 -0
  170. package/core/di/provider/types/ClassProvider.ts +18 -0
  171. package/core/di/provider/types/FactoryProvider.ts +20 -0
  172. package/core/di/provider/types/KeyedDependency.ts +20 -0
  173. package/core/di/provider/types/LazyDependency.ts +31 -0
  174. package/core/di/provider/types/NamedDependency.ts +16 -0
  175. package/core/di/provider/types/Provider.ts +10 -0
  176. package/core/di/provider/types/ProviderDefinition.ts +11 -0
  177. package/core/di/provider/types/ProviderDependencyList.ts +11 -0
  178. package/core/di/provider/types/ProviderLifetime.ts +1 -0
  179. package/core/di/provider/types/ProviderOwnership.ts +7 -0
  180. package/core/di/provider/types/ResolvedDeps.ts +18 -0
  181. package/core/di/provider/types/ValueProvider.ts +6 -0
  182. package/core/di/provider/types/index.ts +13 -0
  183. package/core/di/token.ts +84 -0
  184. package/core/di/types/BuildServiceProviderOptions.ts +4 -0
  185. package/core/di/types/ServiceKey.ts +1 -0
  186. package/core/di/types/ServiceResolver.ts +16 -0
  187. package/core/di/types/index.ts +3 -0
  188. package/core/generatedFingerprint.ts +60 -0
  189. package/core/generatedRuntime.ts +187 -0
  190. package/core/grpc/Grpc.module.ts +23 -0
  191. package/core/grpc/GrpcBinding.contract.ts +35 -0
  192. package/core/grpc/GrpcCall.ts +73 -0
  193. package/core/grpc/GrpcClient.ts +172 -0
  194. package/core/grpc/GrpcClientCall.ts +267 -0
  195. package/core/grpc/GrpcError.ts +19 -0
  196. package/core/grpc/GrpcRequest.binding.ts +45 -0
  197. package/core/grpc/GrpcServer.ts +204 -0
  198. package/core/grpc/GrpcStatus.ts +8 -0
  199. package/core/grpc/GrpcTransport.ts +174 -0
  200. package/core/grpc/Metadata.ts +73 -0
  201. package/core/grpc/ProtoCodec.ts +225 -0
  202. package/core/grpc/ProtoParser.ts +192 -0
  203. package/core/grpc/ProtoReader.ts +34 -0
  204. package/core/grpc/ProtoSchema.ts +52 -0
  205. package/core/grpc/ServerCredentials.ts +30 -0
  206. package/core/grpc/clientContracts.ts +39 -0
  207. package/core/grpc/contracts.ts +45 -0
  208. package/core/grpc/decorators.ts +82 -0
  209. package/core/grpc/grpcClientProvider.ts +9 -0
  210. package/core/grpc/index.ts +17 -0
  211. package/core/grpc/moduleControllers.ts +38 -0
  212. package/core/grpc/protobuf.ts +80 -0
  213. package/core/grpc/serviceDefinition.ts +20 -0
  214. package/core/http/Authorization/Authorize.ts +52 -0
  215. package/core/http/Authorization/authorizeComposer.ts +31 -0
  216. package/core/http/Authorization/metadata.ts +158 -0
  217. package/core/http/Binding/ParameterBinder.ts +109 -0
  218. package/core/http/Binding/RequestModel.ts +27 -0
  219. package/core/http/Binding/autoBindings.ts +125 -0
  220. package/core/http/Binding/bindings.ts +19 -0
  221. package/core/http/Binding/convert.ts +48 -0
  222. package/core/http/Binding/generatedSpec.ts +18 -0
  223. package/core/http/Binding/listModelRegistry.ts +47 -0
  224. package/core/http/Binding/modelBinder.ts +345 -0
  225. package/core/http/Binding/modelValidator.ts +30 -0
  226. package/core/http/Binding/requestModelRegistry.ts +117 -0
  227. package/core/http/Decorators/attributes.ts +92 -0
  228. package/core/http/Decorators/controller.ts +24 -0
  229. package/core/http/Decorators/metadata.ts +107 -0
  230. package/core/http/Decorators/routes.ts +131 -0
  231. package/core/http/Errors/HttpError.ts +92 -0
  232. package/core/http/HttpContext/HttpContext.ts +148 -0
  233. package/core/http/HttpContext/ResponseBuilder.ts +37 -0
  234. package/core/http/HttpContext/inspectableRedirects.ts +47 -0
  235. package/core/http/HttpContext/principal.ts +24 -0
  236. package/core/http/HttpContext/responseLifetime.ts +45 -0
  237. package/core/http/HttpServer.ts +627 -0
  238. package/core/http/Middleware/accessLog.ts +90 -0
  239. package/core/http/Middleware/cors.ts +160 -0
  240. package/core/http/Middleware/errorHandler.ts +100 -0
  241. package/core/http/Middleware/pipeline.ts +21 -0
  242. package/core/http/Middleware/rateLimit.ts +104 -0
  243. package/core/http/Middleware/securityHeaders.ts +118 -0
  244. package/core/http/Middleware/types.ts +19 -0
  245. package/core/http/OpenApi/generatedOpenApiRegistry.ts +102 -0
  246. package/core/http/OpenApi/openApiDocs.ts +75 -0
  247. package/core/http/OpenApi/openApiDocument.ts +356 -0
  248. package/core/http/README.md +139 -0
  249. package/core/http/Results/HttpResult.ts +19 -0
  250. package/core/http/Results/normalize.ts +93 -0
  251. package/core/http/Results/results.ts +70 -0
  252. package/core/http/Routing/Router.ts +201 -0
  253. package/core/http/Routing/RouterBuilder.ts +184 -0
  254. package/core/http/Routing/template.ts +112 -0
  255. package/core/http/SPEC.md +981 -0
  256. package/core/http/Versioning/VersionReader.ts +20 -0
  257. package/core/http/WebSocketUpgrade.ts +29 -0
  258. package/core/http/composeRouteMiddlewareComposers.ts +21 -0
  259. package/core/http/correlation/createCorrelationIdMiddleware.ts +79 -0
  260. package/core/http/httpModule.ts +48 -0
  261. package/core/http/index.ts +140 -0
  262. package/core/http/middlewareTokens.ts +48 -0
  263. package/core/http/options.ts +134 -0
  264. package/core/http-client/index.ts +105 -0
  265. package/core/infra/Infra.ts +158 -0
  266. package/core/infra/InfraConnector.ts +86 -0
  267. package/core/infra/InfraLifecycle.ts +86 -0
  268. package/core/infra/cache/RedisDistributedCacheBackend.ts +88 -0
  269. package/core/infra/cache/RedisDistributedCacheDriver.ts +186 -0
  270. package/core/infra/cache/index.ts +7 -0
  271. package/core/infra/connectorConfig.ts +29 -0
  272. package/core/infra/connectorIdentity.ts +39 -0
  273. package/core/infra/connectors/codex/CodexAppServer.ts +146 -0
  274. package/core/infra/connectors/codex/CodexAppServerClient.ts +258 -0
  275. package/core/infra/connectors/codex/CodexPolicy.ts +114 -0
  276. package/core/infra/connectors/codex/CodexTurn.ts +133 -0
  277. package/core/infra/connectors/codex/contracts.ts +82 -0
  278. package/core/infra/connectors/codex.ts +26 -0
  279. package/core/infra/connectors/llm.ts +78 -0
  280. package/core/infra/connectors/llmRouter.ts +443 -0
  281. package/core/infra/connectors/openaiCompatible.ts +590 -0
  282. package/core/infra/connectors/openaiTextStream.ts +134 -0
  283. package/core/infra/connectors/opensearch.ts +307 -0
  284. package/core/infra/connectors/postgres.ts +105 -0
  285. package/core/infra/connectors/redis.ts +132 -0
  286. package/core/infra/index.ts +58 -0
  287. package/core/kernel/ApplicationLifetime.ts +91 -0
  288. package/core/kernel/Bazis.ts +73 -0
  289. package/core/kernel/Environment.ts +53 -0
  290. package/core/kernel/Kernel.ts +391 -0
  291. package/core/kernel/KernelBuilder.ts +172 -0
  292. package/core/kernel/LifecycleCoordinator.ts +204 -0
  293. package/core/kernel/README.md +66 -0
  294. package/core/kernel/SupervisedHostedService.ts +147 -0
  295. package/core/kernel/config/ConfigRegistry.ts +48 -0
  296. package/core/kernel/config/Configuration.ts +110 -0
  297. package/core/kernel/config/README.md +62 -0
  298. package/core/kernel/config/Secret.ts +29 -0
  299. package/core/kernel/config/addConfigOptions.ts +63 -0
  300. package/core/kernel/config/defineConfig.ts +211 -0
  301. package/core/kernel/config/sources.ts +123 -0
  302. package/core/kernel/correlation/requestContext.ts +57 -0
  303. package/core/kernel/errors/ConfigKeyMissingError.ts +7 -0
  304. package/core/kernel/errors/KernelError.ts +7 -0
  305. package/core/kernel/errors/ShutdownTimeoutError.ts +7 -0
  306. package/core/kernel/errors/StartupAbortedError.ts +7 -0
  307. package/core/kernel/errors/StartupTimeoutError.ts +7 -0
  308. package/core/kernel/errors/index.ts +5 -0
  309. package/core/kernel/events/EventBus.ts +140 -0
  310. package/core/kernel/events/EventToken.ts +17 -0
  311. package/core/kernel/events/eventSubscribers.ts +126 -0
  312. package/core/kernel/events/kernelEvents.ts +16 -0
  313. package/core/kernel/events/onEvent.ts +32 -0
  314. package/core/kernel/health/HealthCheckContracts.ts +42 -0
  315. package/core/kernel/health/HealthService.ts +93 -0
  316. package/core/kernel/index.ts +96 -0
  317. package/core/kernel/internal/awaitAbortable.ts +18 -0
  318. package/core/kernel/internal/awaitShutdown.ts +21 -0
  319. package/core/kernel/internal/reportDiagnosticFailure.ts +8 -0
  320. package/core/kernel/internal/validateTimeout.ts +8 -0
  321. package/core/kernel/lifecycleHooks.ts +18 -0
  322. package/core/kernel/logging/ConsoleLogger.ts +68 -0
  323. package/core/kernel/logging/Logger.ts +22 -0
  324. package/core/kernel/types/ConfigSource.ts +9 -0
  325. package/core/kernel/types/EnvironmentName.ts +1 -0
  326. package/core/kernel/types/KernelOptions.ts +23 -0
  327. package/core/kernel/types/LifecycleHook.ts +18 -0
  328. package/core/kernel/types/index.ts +4 -0
  329. package/core/orm/DATABASE_PROVIDER.ts +5 -0
  330. package/core/orm/OrmHostedPlan.validator.ts +55 -0
  331. package/core/orm/OrmLifecycle.ts +146 -0
  332. package/core/orm/OrmOwnedStoreLifecycle.ts +96 -0
  333. package/core/orm/buildOrmProviders.ts +152 -0
  334. package/core/orm/databaseConnector.ts +108 -0
  335. package/core/orm/encapsulationHook.ts +19 -0
  336. package/core/orm/index.ts +95 -0
  337. package/core/orm/listQuery.ts +198 -0
  338. package/core/orm/ormModule.ts +173 -0
  339. package/core/orm/ownedStoreContributions.ts +195 -0
  340. package/core/orm/registerRepositories.ts +27 -0
  341. package/core/orm/repository.ts +45 -0
  342. package/core/orm/strictSchemaHostedIdentity.ts +17 -0
  343. package/core/scripts/agent-codegen.ts +1166 -0
  344. package/core/scripts/di-generate-target.ts +90 -0
  345. package/core/scripts/di-generate.ts +1837 -0
  346. package/core/scripts/orm-predicate-codegen.ts +33 -0
  347. package/core/scripts/request-model-codegen.ts +326 -0
  348. package/core/websocket/DESIGN.md +297 -0
  349. package/core/websocket/WsRateLimiter.ts +101 -0
  350. package/core/websocket/adapter/adapter.interface.ts +45 -0
  351. package/core/websocket/adapter/in-memory.adapter.ts +190 -0
  352. package/core/websocket/adapter/redis-delivery-scripts.ts +135 -0
  353. package/core/websocket/adapter/redis-delivery-store.ts +86 -0
  354. package/core/websocket/adapter/redis-operations.ts +33 -0
  355. package/core/websocket/adapter/redis.adapter.ts +218 -0
  356. package/core/websocket/codec/binary.codec.ts +87 -0
  357. package/core/websocket/codec/json.codec.ts +34 -0
  358. package/core/websocket/codec/packet-codec.interface.ts +17 -0
  359. package/core/websocket/decorators.ts +165 -0
  360. package/core/websocket/explorer.ts +126 -0
  361. package/core/websocket/index.ts +78 -0
  362. package/core/websocket/middleware.ts +146 -0
  363. package/core/websocket/packet-codec.ts +75 -0
  364. package/core/websocket/reliable-delivery.ts +56 -0
  365. package/core/websocket/session-creation.ts +16 -0
  366. package/core/websocket/session-manager.ts +856 -0
  367. package/core/websocket/socket-wrapper.ts +314 -0
  368. package/core/websocket/topic-cache.ts +59 -0
  369. package/core/websocket/types.ts +122 -0
  370. package/core/websocket/websocketModule.ts +96 -0
  371. package/core/websocket/ws-dispatch.ts +123 -0
  372. package/core/websocket/ws-server.ts +1707 -0
  373. package/index.ts +281 -0
  374. package/library/boundary/diagnostics-v1.ts +136 -0
  375. package/library/boundary/index.ts +73 -0
  376. package/library/boundary/json/decodeBoundedJsonV1.ts +518 -0
  377. package/library/boundary/json/limits-v1.ts +46 -0
  378. package/library/boundary/json/normalizeBoundedJsonV1.ts +256 -0
  379. package/library/boundary/json/types-v1.ts +11 -0
  380. package/library/boundary/schema/boundarySchemaHashV1.ts +6 -0
  381. package/library/boundary/schema/collectBoundaryValueDiagnosticsV1.ts +325 -0
  382. package/library/boundary/schema/decodeBoundarySchemaV1.ts +646 -0
  383. package/library/boundary/schema/index.ts +8 -0
  384. package/library/boundary/schema/types-v1.ts +99 -0
  385. package/library/boundary/schema/validateBoundaryValueV1.ts +58 -0
  386. package/library/boundary/serialization/canonicalJsonV1.ts +66 -0
  387. package/library/http-client/HttpClient.ts +969 -0
  388. package/library/http-client/HttpClientFactory.ts +45 -0
  389. package/library/http-client/errors.ts +68 -0
  390. package/library/http-client/index.ts +43 -0
  391. package/library/http-client/interceptors.ts +40 -0
  392. package/library/http-client/progress.ts +62 -0
  393. package/library/http-client/redirectProtocol.ts +6 -0
  394. package/library/http-client/serialize.ts +133 -0
  395. package/library/http-client/types.ts +174 -0
  396. package/library/jsonapi/ListQueryError.ts +25 -0
  397. package/library/jsonapi/ListRequest.ts +37 -0
  398. package/library/jsonapi/decorators.ts +161 -0
  399. package/library/jsonapi/document.ts +124 -0
  400. package/library/jsonapi/index.ts +40 -0
  401. package/library/jsonapi/parseListQuery.ts +291 -0
  402. package/library/jsonapi/types.ts +125 -0
  403. package/library/jwt/JwtEncoder.ts +40 -0
  404. package/library/jwt/JwtKeyRing.ts +164 -0
  405. package/library/jwt/JwtValidator.ts +210 -0
  406. package/library/jwt/TokenIssuer.ts +149 -0
  407. package/library/jwt/TokenService.ts +51 -0
  408. package/library/jwt/base64url.ts +61 -0
  409. package/library/jwt/claims.ts +36 -0
  410. package/library/jwt/errors.ts +44 -0
  411. package/library/jwt/index.ts +59 -0
  412. package/library/jwt/limits.ts +8 -0
  413. package/library/jwt/signing/Hs256Algorithm.ts +62 -0
  414. package/library/jwt/signing/Rs256Algorithm.ts +133 -0
  415. package/library/jwt/signing/SigningAlgorithm.ts +18 -0
  416. package/library/jwt/signing/pem.ts +30 -0
  417. package/library/openapi/codegen.ts +875 -0
  418. package/library/openapi/document.ts +326 -0
  419. package/library/openapi/index.ts +13 -0
  420. package/library/openapi/types.ts +69 -0
  421. package/library/openapi/ui.ts +182 -0
  422. package/library/orm/DatabaseFacade.ts +209 -0
  423. package/library/orm/DbContext.ts +107 -0
  424. package/library/orm/DbContextFactory.ts +25 -0
  425. package/library/orm/DbContextOptions.ts +33 -0
  426. package/library/orm/Metadata/DynamicModelBuilder.ts +497 -0
  427. package/library/orm/Metadata/KeyTuple.ts +36 -0
  428. package/library/orm/Metadata/ModelBuilder.ts +299 -0
  429. package/library/orm/Metadata/OrmModel.ts +80 -0
  430. package/library/orm/Metadata/ValueConverter.ts +57 -0
  431. package/library/orm/Metadata/conventions.ts +54 -0
  432. package/library/orm/Metadata/decorators.ts +396 -0
  433. package/library/orm/Metadata/types.ts +140 -0
  434. package/library/orm/Providers/OwnedStoreCatalog.reader.ts +1802 -0
  435. package/library/orm/Providers/PostgresDialect.ts +234 -0
  436. package/library/orm/Providers/PostgresProvider.ts +1494 -0
  437. package/library/orm/Providers/PostgresSchema.decoder.ts +107 -0
  438. package/library/orm/Providers/limits.ts +29 -0
  439. package/library/orm/Providers/operationDeadline.ts +43 -0
  440. package/library/orm/Providers/ormOwnedStoreRuntime.ts +19 -0
  441. package/library/orm/Providers/ormTransactionRuntime.ts +117 -0
  442. package/library/orm/Providers/propertyConversion.ts +14 -0
  443. package/library/orm/Providers/resolvedForeignKey.ts +16 -0
  444. package/library/orm/Providers/transactionCallbacks.ts +45 -0
  445. package/library/orm/Providers/transactionOutcome.ts +82 -0
  446. package/library/orm/Providers/transactionScopes.ts +78 -0
  447. package/library/orm/Providers/types.ts +207 -0
  448. package/library/orm/Query/DbSet.ts +78 -0
  449. package/library/orm/Query/EntityQuery.ts +247 -0
  450. package/library/orm/Query/ImmediateMutations.ts +226 -0
  451. package/library/orm/Query/IncludeLoader.ts +200 -0
  452. package/library/orm/Query/QueryPlan.ts +55 -0
  453. package/library/orm/Query/SqlTranslator.ts +195 -0
  454. package/library/orm/Query/conditions.ts +127 -0
  455. package/library/orm/Query/materialize.ts +39 -0
  456. package/library/orm/README.md +256 -0
  457. package/library/orm/Repository/README.md +684 -0
  458. package/library/orm/Repository/Repository.ts +68 -0
  459. package/library/orm/Saving/CommandBuilder.ts +139 -0
  460. package/library/orm/Saving/ExecutionStrategy.ts +128 -0
  461. package/library/orm/Saving/SaveExecutor.ts +413 -0
  462. package/library/orm/Saving/applyConventions.ts +64 -0
  463. package/library/orm/Schema/CheckExpression.ts +327 -0
  464. package/library/orm/Schema/ExactSchemaVerifier.ts +168 -0
  465. package/library/orm/Schema/ExpectedSchema.ts +43 -0
  466. package/library/orm/Schema/MigrationRunner.ts +146 -0
  467. package/library/orm/Schema/Migrator.ts +73 -0
  468. package/library/orm/Schema/OrmOwnedStore.ts +123 -0
  469. package/library/orm/Schema/OwnedStoreAdmission.ts +752 -0
  470. package/library/orm/Schema/OwnedStoreCanonical.ts +273 -0
  471. package/library/orm/Schema/OwnedStoreCatalog.ts +1325 -0
  472. package/library/orm/Schema/SafeAdditiveSchema.ts +100 -0
  473. package/library/orm/Schema/SchemaAdmission.ts +62 -0
  474. package/library/orm/Schema/SchemaDiffer.ts +78 -0
  475. package/library/orm/Schema/formatSchemaDifferences.ts +62 -0
  476. package/library/orm/Schema/introspection.ts +52 -0
  477. package/library/orm/Schema/physicalColumnTypes.ts +37 -0
  478. package/library/orm/Schema/tableKey.ts +26 -0
  479. package/library/orm/Tracking/ChangeTracker.ts +448 -0
  480. package/library/orm/Tracking/EntityState.ts +13 -0
  481. package/library/orm/Transactions/OrmTransaction.ts +30 -0
  482. package/library/orm/Transactions/TransactionScopeCoordinator.ts +377 -0
  483. package/library/orm/errors.ts +190 -0
  484. package/library/orm/index.ts +162 -0
  485. package/library/orm/runtime.ts +14 -0
  486. package/library/redaction/index.ts +166 -0
  487. package/library/ui/UiProfile.ts +77 -0
  488. package/library/ui/compiled-v1.ts +131 -0
  489. package/library/ui/compiler/compileUiSurfaceV1.ts +717 -0
  490. package/library/ui/compiler/contracts-v1.ts +25 -0
  491. package/library/ui/compiler/index.ts +12 -0
  492. package/library/ui/compiler/openApiIndex.ts +246 -0
  493. package/library/ui/defineUiProfile.ts +340 -0
  494. package/library/ui/diagnostics-v1.ts +33 -0
  495. package/library/ui/index.ts +129 -0
  496. package/library/ui/profile-v1.ts +191 -0
  497. package/library/ui/serialization.ts +130 -0
  498. package/library/ui/uiProfileAuthoring.ts +289 -0
  499. package/library/ui/uiProfileAuthoringMetadata.ts +78 -0
  500. package/library/validation/MessageRegistry.ts +144 -0
  501. package/library/validation/README.md +62 -0
  502. package/library/validation/RuleCompiler.ts +183 -0
  503. package/library/validation/RuleEngine.ts +401 -0
  504. package/library/validation/SPEC.md +579 -0
  505. package/library/validation/ValidationError.ts +37 -0
  506. package/library/validation/ValidationResult.ts +63 -0
  507. package/library/validation/Validator.ts +101 -0
  508. package/library/validation/index.ts +16 -0
  509. package/library/validation/metadata.ts +69 -0
  510. package/library/validation/modelValidatorAdapter.ts +119 -0
  511. package/library/validation/types/ValidationCode.ts +69 -0
  512. package/library/validation/types/ValidatorOptions.ts +153 -0
  513. package/package.json +80 -0
@@ -0,0 +1,58 @@
1
+ // Infrastructure layer: declarative connection of external systems (database, cache,
2
+ // search engine, ...) through one `InfraConnector` contract and the `@Infra`
3
+ // decorator. Connectors build on clients built into Bun
4
+ // (`SQL`, `RedisClient`) and `fetch`, with zero external dependencies.
5
+
6
+ export { Infra, infraModule, type InfraManifest } from "./Infra";
7
+ export { InfraError, errorMessage, type InfraConnector } from "./InfraConnector";
8
+ export { InfraLifecycle } from "./InfraLifecycle";
9
+ export { reader, requireValue, type ConfigReader } from "./connectorConfig";
10
+ export { codexAppServerConnect, CODEX_APP_SERVER } from "./connectors/codex";
11
+ export { CodexError, RU_CODEX_MESSAGES, type CodexErrorCode, CODEX_MODEL_ID, CODEX_REASONING_EFFORT, type CodexClient, type CodexConfigShape, type CodexLogin, type CodexLoginMethod, type CodexModel, type CodexStatus, type CodexRunInput, type CodexChatMessage, type CodexTool, type CodexToolCall, type CodexToolResult } from "./connectors/codex/contracts";
12
+
13
+ export { postgres, POSTGRES, postgresConnectionOptions, type PostgresConfigShape, type PostgresSslMode, type PostgresConnectorOptions } from "./connectors/postgres";
14
+ export {
15
+ redisConnect,
16
+ REDIS,
17
+ type RedisConfigShape,
18
+ type RedisConnectorCacheMode,
19
+ type RedisConnectorOptions,
20
+ } from "./connectors/redis";
21
+ export {
22
+ RedisDistributedCacheBackend,
23
+ RedisDistributedCacheDriver,
24
+ type RedisCommandClient,
25
+ type RedisDistributedCacheTuning,
26
+ } from "./cache";
27
+ export {
28
+ openSearchConnect,
29
+ OPENSEARCH,
30
+ OpenSearchClient,
31
+ type OpenSearchClientOptions,
32
+ type OpenSearchConfigShape,
33
+ type OpenSearchConnectorOptions,
34
+ } from "./connectors/opensearch";
35
+ export {
36
+ DEFAULT_LLM_REQUEST_TIMEOUT_MS,
37
+ llmConnect,
38
+ type LlmConfigShape,
39
+ type LlmConnectionOptions,
40
+ type LlmConnectorOptions,
41
+ type LlmProviderAdapter,
42
+ } from "./connectors/llm";
43
+ export {
44
+ llmProfile,
45
+ llmRouter,
46
+ LlmModelRouter,
47
+ LlmModelRouterError,
48
+ type LlmModelProfile,
49
+ type LlmModelProfileOptions,
50
+ type LlmRouterOptions,
51
+ } from "./connectors/llmRouter";
52
+ export {
53
+ openAiCompatibleAdapter,
54
+ OpenAiCompatibleModelProvider,
55
+ OpenAiCompatibleProviderError,
56
+ type OpenAiCompatibleAdapterOptions,
57
+ type OpenAiCompatibleFetch,
58
+ } from "./connectors/openaiCompatible";
@@ -0,0 +1,91 @@
1
+ import { awaitAbortable } from "./internal/awaitAbortable";
2
+
3
+ type LifetimeCallback = () => void | Promise<void>;
4
+
5
+ /**
6
+ * Injectable application lifetime (.NET IHostApplicationLifetime):
7
+ * subscriptions to lifecycle moments plus programmatic shutdown from any
8
+ * service via `stop(exitCode)`.
9
+ */
10
+ export class ApplicationLifetime {
11
+ private readonly startedCallbacks: LifetimeCallback[] = [];
12
+ private readonly stoppingCallbacks: LifetimeCallback[] = [];
13
+ private readonly stoppedCallbacks: LifetimeCallback[] = [];
14
+ private readonly stopRequestListeners: ((exitCode: number) => void)[] = [];
15
+ private startedFlag = false;
16
+ private stoppingFlag = false;
17
+
18
+ public get isStarted(): boolean {
19
+ return this.startedFlag;
20
+ }
21
+
22
+ public get isStopping(): boolean {
23
+ return this.stoppingFlag;
24
+ }
25
+
26
+ public onStarted(callback: LifetimeCallback): void {
27
+ this.startedCallbacks.push(callback);
28
+ }
29
+
30
+ public onStopping(callback: LifetimeCallback): void {
31
+ this.stoppingCallbacks.push(callback);
32
+ }
33
+
34
+ public onStopped(callback: LifetimeCallback): void {
35
+ this.stoppedCallbacks.push(callback);
36
+ }
37
+
38
+ /** Requests graceful shutdown of the application. */
39
+ public stop(exitCode = 0): void {
40
+ for (let index = 0; index < this.stopRequestListeners.length; index += 1) {
41
+ (this.stopRequestListeners[index] as (exitCode: number) => void)(exitCode);
42
+ }
43
+ }
44
+
45
+ /** @internal Kernel subscribes to programmatic stop requests. */
46
+ public onStopRequested(listener: (exitCode: number) => void): void {
47
+ this.stopRequestListeners.push(listener);
48
+ }
49
+
50
+ /** @internal */
51
+ public async notifyStarted(signal?: AbortSignal): Promise<void> {
52
+ this.startedFlag = true;
53
+ await runCallbacks(this.startedCallbacks, signal);
54
+ }
55
+
56
+ /** @internal */
57
+ public async notifyStopping(): Promise<void> {
58
+ this.stoppingFlag = true;
59
+ await runCallbacks(this.stoppingCallbacks);
60
+ }
61
+
62
+ /** @internal */
63
+ public async notifyStopped(): Promise<void> {
64
+ await runCallbacks(this.stoppedCallbacks);
65
+ }
66
+ }
67
+
68
+ // A failing subscriber must not break the rest of the lifecycle chain:
69
+ // run everything, then report all failures at once.
70
+ async function runCallbacks(callbacks: readonly LifetimeCallback[], signal?: AbortSignal): Promise<void> {
71
+ const errors: unknown[] = [];
72
+ for (let index = 0; index < callbacks.length; index += 1) {
73
+ signal?.throwIfAborted();
74
+ try {
75
+ await awaitAbortable(Promise.resolve().then(() => {
76
+ signal?.throwIfAborted();
77
+ return (callbacks[index] as LifetimeCallback)();
78
+ }), signal);
79
+ } catch (error) {
80
+ signal?.throwIfAborted();
81
+ errors.push(error);
82
+ }
83
+ }
84
+ signal?.throwIfAborted();
85
+ if (errors.length === 1) {
86
+ throw errors[0];
87
+ }
88
+ if (errors.length > 1) {
89
+ throw new AggregateError(errors, "Lifetime callbacks failed.");
90
+ }
91
+ }
@@ -0,0 +1,73 @@
1
+ import { inspect } from "node:util";
2
+ import { DiError } from "../di";
3
+ import { Kernel } from "./Kernel";
4
+ import { KernelBuilder, type RootModuleInput } from "./KernelBuilder";
5
+ import { KernelError, ShutdownTimeoutError } from "./errors";
6
+ import type { KernelOptions } from "./types";
7
+ import { redactSensitive, redactSensitiveText } from "../../library/redaction";
8
+
9
+ /**
10
+ * Entry-point facade.
11
+ *
12
+ * One-liner: `await Bazis.run(AppModule)`.
13
+ * Fine-grained control: `Bazis.createBuilder(AppModule)` -> configure -> `build()` -> `run()`.
14
+ */
15
+ export class Bazis {
16
+ public static createBuilder(rootModule: RootModuleInput): KernelBuilder {
17
+ return new KernelBuilder(rootModule);
18
+ }
19
+
20
+ /**
21
+ * Builds and runs the application until a shutdown trigger. Configuration
22
+ * errors (DI graph, options, environment) are reported to stderr and turn
23
+ * into exit code 1 instead of an unhandled stack trace.
24
+ */
25
+ public static async run(
26
+ rootModule: RootModuleInput,
27
+ options?: KernelOptions,
28
+ configure?: (builder: KernelBuilder) => void,
29
+ ): Promise<number> {
30
+ const builder = new KernelBuilder(rootModule);
31
+ if (options) {
32
+ builder.useOptions(options);
33
+ }
34
+ configure?.(builder);
35
+
36
+ let kernel: Kernel;
37
+ try {
38
+ kernel = await builder.build();
39
+ } catch (error) {
40
+ if (error instanceof DiError || error instanceof KernelError) {
41
+ console.error(`[bazis] configuration error: ${redactSensitiveText(error.message)}`);
42
+ process.exitCode = 1;
43
+ return 1;
44
+ }
45
+ throw error;
46
+ }
47
+
48
+ try {
49
+ const exitCode = await kernel.run();
50
+ process.exitCode = exitCode;
51
+ return exitCode;
52
+ } catch (error) {
53
+ if (error instanceof ShutdownTimeoutError) {
54
+ // Graceful shutdown is stuck: hanging handles would keep the process
55
+ // alive forever, so this is the one place a hard exit is correct.
56
+ console.error(`[bazis] ${redactSensitiveText(error.message)} Forcing exit.`);
57
+ process.exit(1);
58
+ }
59
+ // Configuration problems surfacing at start (e.g. options fail-fast)
60
+ // deserve the same friendly output as build-time ones.
61
+ if (error instanceof DiError || error instanceof KernelError) {
62
+ console.error(`[bazis] configuration error: ${redactSensitiveText(error.message)}`);
63
+ } else {
64
+ console.error("[bazis] application failed:", inspect(redactSensitive(error), {
65
+ depth: null, colors: false, customInspect: false, getters: false,
66
+ maxArrayLength: null, maxStringLength: null,
67
+ }));
68
+ }
69
+ process.exitCode = 1;
70
+ return 1;
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,53 @@
1
+ import { KernelError } from "./errors";
2
+ import type { EnvironmentName } from "./types";
3
+
4
+ /**
5
+ * Explicit application environment (Symfony Kernel style). Registered in the
6
+ * container as a value, so any service can depend on it.
7
+ */
8
+ export class Environment {
9
+ public constructor(
10
+ public readonly name: EnvironmentName,
11
+ /** Debug mode: extra diagnostics. Default: everywhere except production. */
12
+ public readonly debug: boolean = name !== "production",
13
+ ) {}
14
+
15
+ public get isDevelopment(): boolean {
16
+ return this.name === "development";
17
+ }
18
+
19
+ public get isProduction(): boolean {
20
+ return this.name === "production";
21
+ }
22
+
23
+ public get isTest(): boolean {
24
+ return this.name === "test";
25
+ }
26
+
27
+ /** Reads BAZIS_ENV (fallback NODE_ENV, then production). Unknown value fails fast. */
28
+ public static fromProcess(debugOverride?: boolean): Environment {
29
+ // A missing deployment setting must fail closed. Development is always an
30
+ // explicit choice made by the dev scripts, never an accidental production
31
+ // fallback.
32
+ const raw = process.env.BAZIS_ENV ?? process.env.NODE_ENV ?? "production";
33
+ const name = parseEnvironmentName(raw);
34
+ return new Environment(name, debugOverride ?? name !== "production");
35
+ }
36
+ }
37
+
38
+ function parseEnvironmentName(raw: string): EnvironmentName {
39
+ switch (raw.toLowerCase()) {
40
+ case "development":
41
+ case "dev":
42
+ return "development";
43
+ case "production":
44
+ case "prod":
45
+ return "production";
46
+ case "test":
47
+ return "test";
48
+ default:
49
+ throw new KernelError(
50
+ `Unknown environment "${raw}" (BAZIS_ENV/NODE_ENV). Expected: development | production | test.`,
51
+ );
52
+ }
53
+ }
@@ -0,0 +1,391 @@
1
+ import type { DiContainer } from "../di";
2
+ import { ApplicationLifetime } from "./ApplicationLifetime";
3
+ import type { Configuration } from "./config/Configuration";
4
+ import { Environment } from "./Environment";
5
+ import { EventBus } from "./events/EventBus";
6
+ import { APPLICATION_STARTED, APPLICATION_STOPPING } from "./events/kernelEvents";
7
+ import { HealthService } from "./health/HealthService";
8
+ import type { HealthReport } from "./health/HealthCheckContracts";
9
+ import { LifecycleCoordinator } from "./LifecycleCoordinator";
10
+ import { LOGGER } from "./logging/Logger";
11
+ import { ShutdownTimeoutError, StartupAbortedError, StartupTimeoutError } from "./errors";
12
+ import type { UnhandledErrorPolicy } from "./types";
13
+ import { redactSensitive } from "../../library/redaction";
14
+ import { validateTimeout } from "./internal/validateTimeout";
15
+ import { awaitShutdown } from "./internal/awaitShutdown";
16
+ import { reportDiagnosticFailure } from "./internal/reportDiagnosticFailure";
17
+
18
+ export interface KernelTimings {
19
+ readonly configMs: number;
20
+ readonly containerMs: number;
21
+ readonly buildStartedAt: number;
22
+ }
23
+
24
+ export interface KernelRuntimeOptions {
25
+ readonly startupTimeoutMs: number;
26
+ readonly shutdownTimeoutMs: number;
27
+ readonly signals: readonly NodeJS.Signals[];
28
+ readonly unhandledErrorPolicy: UnhandledErrorPolicy;
29
+ readonly startupReport: boolean;
30
+ }
31
+
32
+ interface StopRequest {
33
+ readonly exitCode: number;
34
+ readonly signal?: string;
35
+ }
36
+
37
+ type KernelState = "created" | "starting" | "started" | "stopping" | "stopped";
38
+
39
+ /**
40
+ * Immutable application kernel: boots the lifecycle, waits for a shutdown
41
+ * trigger (signal, lifetime.stop(), unhandled error) and shuts everything
42
+ * down gracefully within the configured timeout.
43
+ */
44
+ export class Kernel {
45
+ private state: KernelState = "created";
46
+ private readonly coordinator: LifecycleCoordinator;
47
+ private stopRequested?: StopRequest;
48
+ private notifyStopRequested?: (request: StopRequest) => void;
49
+ private startupMs = 0;
50
+ private startPromise?: Promise<void>;
51
+ private runPromise?: Promise<number>;
52
+ private stopPromise?: Promise<void>;
53
+ private shutdownPromise?: Promise<void>;
54
+ private startupCleanupFailure?: unknown;
55
+ private startupAbort?: AbortController;
56
+
57
+ public constructor(
58
+ public readonly container: DiContainer,
59
+ public readonly environment: Environment,
60
+ public readonly configuration: Configuration,
61
+ public readonly lifetime: ApplicationLifetime,
62
+ private readonly timings: KernelTimings,
63
+ private readonly options: KernelRuntimeOptions,
64
+ ) {
65
+ validateTimeout("startupTimeoutMs", options.startupTimeoutMs);
66
+ validateTimeout("shutdownTimeoutMs", options.shutdownTimeoutMs);
67
+ this.options = Object.freeze({ ...options, signals: Object.freeze([...new Set(options.signals)]) });
68
+ this.coordinator = new LifecycleCoordinator(container);
69
+ lifetime.onStopRequested((exitCode) => this.requestStop({ exitCode }));
70
+ }
71
+
72
+ public get isStarted(): boolean {
73
+ return this.state === "started";
74
+ }
75
+
76
+ public start(): Promise<void> {
77
+ if (this.startPromise !== undefined) {
78
+ return this.startPromise;
79
+ }
80
+ if (this.state !== "created") {
81
+ return Promise.resolve();
82
+ }
83
+ this.state = "starting";
84
+ this.startupAbort = new AbortController();
85
+ this.startPromise = this.startCore(this.startupAbort);
86
+ return this.startPromise;
87
+ }
88
+
89
+ private async startCore(abortController: AbortController): Promise<void> {
90
+ let startupTimer: ReturnType<typeof setTimeout> | undefined;
91
+ let coordinatorStarted = false;
92
+ let startupDisposal: Promise<void> | undefined;
93
+ if (this.options.startupTimeoutMs > 0) {
94
+ startupTimer = setTimeout(
95
+ () => abortController.abort(new StartupTimeoutError(this.options.startupTimeoutMs)),
96
+ this.options.startupTimeoutMs,
97
+ );
98
+ }
99
+ try {
100
+ await this.coordinator.start(abortController.signal, this.options.shutdownTimeoutMs);
101
+ coordinatorStarted = true;
102
+ this.startupMs = performance.now() - this.timings.buildStartedAt;
103
+ await this.lifetime.notifyStarted(abortController.signal);
104
+ await this.container.resolve(EventBus).publish(
105
+ APPLICATION_STARTED,
106
+ { environment: this.environment.name, startupMs: this.startupMs },
107
+ { signal: abortController.signal },
108
+ );
109
+ abortController.signal.throwIfAborted();
110
+ if (this.options.startupReport) this.printStartupReport();
111
+ abortController.signal.throwIfAborted();
112
+ this.state = "started";
113
+ } catch (error) {
114
+ if (startupTimer !== undefined) clearTimeout(startupTimer);
115
+ if (error instanceof ShutdownTimeoutError || this.coordinator.rollbackFailure !== undefined) {
116
+ this.startupCleanupFailure = error;
117
+ }
118
+ try {
119
+ if (coordinatorStarted) {
120
+ await this.beginShutdown(this.stopRequested ?? { exitCode: 1 });
121
+ } else {
122
+ const disposal = startupDisposal = this.disposeAfterRollback();
123
+ if (error instanceof ShutdownTimeoutError) {
124
+ // Actual hook cleanup still owns its dependencies. Keep disposal
125
+ // sequenced after it, but do not grant a second shutdown budget.
126
+ void disposal.catch(() => reportDiagnosticFailure("startup.cleanup"));
127
+ } else {
128
+ await awaitShutdown(disposal, this.options.shutdownTimeoutMs, this.coordinator.rollbackElapsedMs);
129
+ }
130
+ }
131
+ } catch (cleanupError) {
132
+ if (cleanupError instanceof ShutdownTimeoutError) {
133
+ // The facade must still force exit when cleanup left live handles.
134
+ cleanupError.cause = error;
135
+ this.startupCleanupFailure = cleanupError;
136
+ void startupDisposal?.catch(() => reportDiagnosticFailure("startup.cleanup"));
137
+ throw cleanupError;
138
+ }
139
+ if (this.coordinator.rollbackFailure !== undefined && cleanupError === this.coordinator.rollbackFailure) {
140
+ // The coordinator's AggregateError already includes startup and rollback.
141
+ this.startupCleanupFailure = error;
142
+ throw error;
143
+ }
144
+ const failure = new AggregateError([error, cleanupError], "Startup failed and disposal also failed.", { cause: error });
145
+ this.startupCleanupFailure = failure;
146
+ throw failure;
147
+ } finally {
148
+ this.state = "stopped";
149
+ }
150
+ throw error;
151
+ } finally {
152
+ if (startupTimer !== undefined) clearTimeout(startupTimer);
153
+ if (this.startupAbort === abortController) this.startupAbort = undefined;
154
+ }
155
+ }
156
+
157
+ private async disposeAfterRollback(): Promise<void> {
158
+ const errors: unknown[] = [];
159
+ try { await this.coordinator.waitForRollback(); }
160
+ catch (error) { errors.push(error); }
161
+ try { await this.container.dispose(); }
162
+ catch (error) { errors.push(error); }
163
+ if (errors.length === 1) throw errors[0];
164
+ if (errors.length > 1) throw new AggregateError(errors, "Startup cleanup failed.");
165
+ }
166
+
167
+ public stop(request: StopRequest = { exitCode: 0 }): Promise<void> {
168
+ // `stop()` is also a public shutdown trigger. If `run()` is currently
169
+ // waiting, wake it with the same request so it can remove its process
170
+ // handlers and return the requested exit code after joining this shutdown.
171
+ this.requestStop(request);
172
+ if (this.stopPromise !== undefined) {
173
+ return this.stopPromise;
174
+ }
175
+ if (this.state === "starting" && this.startPromise !== undefined) {
176
+ this.stopPromise = this.stopAfterStart(request);
177
+ return this.stopPromise;
178
+ }
179
+ this.stopPromise = this.beginShutdown(request);
180
+ return this.stopPromise;
181
+ }
182
+
183
+ private async stopAfterStart(request: StopRequest): Promise<void> {
184
+ try {
185
+ await this.startPromise!;
186
+ } catch {
187
+ // Failed startup already disposes the container (and, after services came
188
+ // up, runs the shutdown sequence). Join that cleanup instead of masking
189
+ // the original start failure with another stop attempt.
190
+ }
191
+ await this.beginShutdown(request);
192
+ }
193
+
194
+ private beginShutdown(request: StopRequest): Promise<void> {
195
+ if (this.shutdownPromise !== undefined) {
196
+ return this.shutdownPromise;
197
+ }
198
+ if (this.state === "stopped") {
199
+ if (this.startupCleanupFailure !== undefined) return Promise.reject(this.startupCleanupFailure);
200
+ return Promise.resolve();
201
+ }
202
+ this.state = "stopping";
203
+ this.shutdownPromise = this.stopCore(request);
204
+ return this.shutdownPromise;
205
+ }
206
+
207
+ private async stopCore(request: StopRequest): Promise<void> {
208
+ // The whole graceful-stop sequence — lifetime notifications, the STOPPING
209
+ // event, hosted services/hooks and disposal — is bounded by one budget. A
210
+ // single hanging callback or handler must not wedge shutdown forever.
211
+ const work = this.runShutdownSequence(request);
212
+ try {
213
+ await awaitShutdown(work, this.options.shutdownTimeoutMs);
214
+ } finally {
215
+ this.state = "stopped";
216
+ }
217
+ }
218
+
219
+ private async runShutdownSequence(request: StopRequest): Promise<void> {
220
+ const errors: unknown[] = [];
221
+ try {
222
+ await this.lifetime.notifyStopping();
223
+ } catch (error) {
224
+ errors.push(error);
225
+ }
226
+ try {
227
+ await this.container.resolve(EventBus).publish(APPLICATION_STOPPING, {
228
+ ...(request.signal === undefined ? {} : { signal: request.signal }),
229
+ exitCode: request.exitCode,
230
+ });
231
+ } catch (error) {
232
+ errors.push(error);
233
+ }
234
+
235
+ try {
236
+ await this.coordinator.stopServices(request.signal);
237
+ } catch (error) {
238
+ errors.push(error);
239
+ } finally {
240
+ try {
241
+ await this.container.dispose();
242
+ } catch (error) {
243
+ errors.push(error);
244
+ }
245
+ }
246
+
247
+ try {
248
+ await this.lifetime.notifyStopped();
249
+ } catch (error) {
250
+ errors.push(error);
251
+ }
252
+
253
+ if (errors.length === 1) {
254
+ throw errors[0];
255
+ }
256
+ if (errors.length > 1) {
257
+ throw new AggregateError(errors, "Kernel shutdown finished with errors.");
258
+ }
259
+ }
260
+
261
+ /** Starts, blocks until a shutdown trigger, stops gracefully. Returns the exit code. */
262
+ public run(): Promise<number> {
263
+ if (this.runPromise !== undefined) return this.runPromise;
264
+ const completion = Promise.withResolvers<number>();
265
+ this.runPromise = completion.promise;
266
+ void this.runCore().then(completion.resolve, completion.reject);
267
+ return this.runPromise;
268
+ }
269
+
270
+ private async runCore(): Promise<number> {
271
+ const cleanups: (() => void)[] = [];
272
+ try {
273
+ this.installSignalHandlers(cleanups);
274
+ this.installUnhandledErrorHandlers(cleanups);
275
+ try {
276
+ await this.start();
277
+ } catch (error) {
278
+ const request = this.stopRequested;
279
+ if (request === undefined || !(error instanceof StartupAbortedError)) {
280
+ throw error;
281
+ }
282
+ await this.stop(request);
283
+ return request.exitCode;
284
+ }
285
+
286
+ const request = await new Promise<StopRequest>((resolve) => {
287
+ // lifetime.stop() or a process signal may have fired during start().
288
+ if (this.stopRequested) {
289
+ resolve(this.stopRequested);
290
+ return;
291
+ }
292
+ this.notifyStopRequested = resolve;
293
+ });
294
+ await this.stop(request);
295
+ return request.exitCode;
296
+ } finally {
297
+ for (let index = 0; index < cleanups.length; index += 1) {
298
+ (cleanups[index] as () => void)();
299
+ }
300
+ this.notifyStopRequested = undefined;
301
+ }
302
+ }
303
+
304
+ public health(options?: import("./health/HealthCheckContracts").HealthCheckOptions): Promise<HealthReport> {
305
+ return this.container.resolve(HealthService).check(options);
306
+ }
307
+
308
+ private requestStop(request: StopRequest): void {
309
+ if (this.stopRequested) {
310
+ return;
311
+ }
312
+ this.stopRequested = request;
313
+ if (this.state === "starting") {
314
+ this.startupAbort?.abort(new StartupAbortedError());
315
+ }
316
+ this.notifyStopRequested?.(request);
317
+ }
318
+
319
+ private installSignalHandlers(cleanups: (() => void)[]): void {
320
+ for (let index = 0; index < this.options.signals.length; index += 1) {
321
+ const signal = this.options.signals[index] as NodeJS.Signals;
322
+ const handler = (): void => {
323
+ // Second signal: the operator insists — exit immediately.
324
+ if (this.stopRequested) {
325
+ process.exit(130);
326
+ }
327
+ this.requestStop({ exitCode: 0, signal });
328
+ };
329
+ process.on(signal, handler);
330
+ cleanups.push(() => process.off(signal, handler));
331
+ }
332
+ }
333
+
334
+ private installUnhandledErrorHandlers(cleanups: (() => void)[]): void {
335
+ if (this.options.unhandledErrorPolicy !== "shutdown") {
336
+ return;
337
+ }
338
+ const onUnhandled = (error: unknown): void => {
339
+ this.logUnhandledError(error);
340
+ if (this.stopRequested) {
341
+ // Already shutting down and still failing: stop pretending.
342
+ process.exit(1);
343
+ }
344
+ this.requestStop({ exitCode: 1 });
345
+ };
346
+ process.on("unhandledRejection", onUnhandled);
347
+ process.on("uncaughtException", onUnhandled);
348
+ cleanups.push(() => {
349
+ process.off("unhandledRejection", onUnhandled);
350
+ process.off("uncaughtException", onUnhandled);
351
+ });
352
+ }
353
+
354
+ private logUnhandledError(error: unknown): void {
355
+ const redacted = redactSensitive(error);
356
+ let logger;
357
+ try {
358
+ logger = this.container.tryResolve(LOGGER);
359
+ } catch {
360
+ logger = undefined;
361
+ }
362
+ if (logger !== undefined) {
363
+ try {
364
+ logger.error("Unhandled error, shutting down", { error: redacted });
365
+ return;
366
+ } catch {
367
+ // A broken logger must not prevent the shutdown request.
368
+ }
369
+ }
370
+ console.error("[bazis] Unhandled error, shutting down:", redacted);
371
+ }
372
+
373
+ private printStartupReport(): void {
374
+ const logger = this.container.tryResolve(LOGGER);
375
+ const fields = {
376
+ environment: this.environment.name,
377
+ debug: this.environment.debug,
378
+ configKeys: this.configuration.keys().length,
379
+ configMs: Number(this.timings.configMs.toFixed(1)),
380
+ containerMs: Number(this.timings.containerMs.toFixed(1)),
381
+ hostedServices: this.coordinator.startedHostedCount,
382
+ hooks: this.coordinator.hookCount,
383
+ startupMs: Number(this.startupMs.toFixed(1)),
384
+ };
385
+ if (logger) {
386
+ logger.info("bazis started", fields);
387
+ return;
388
+ }
389
+ console.log(`[bazis] started ${JSON.stringify(fields)}`);
390
+ }
391
+ }