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,775 @@
1
+ import {
2
+ canonicalBoundaryJsonV1,
3
+ decodeBoundedJsonV1,
4
+ normalizeBoundedJsonV1,
5
+ type BoundaryJsonObject,
6
+ type BoundaryJsonValue,
7
+ } from "../../../library/boundary";
8
+ import {
9
+ agentData,
10
+ agentMessage,
11
+ agentModelResponse,
12
+ agentText,
13
+ agentToolCall,
14
+ agentToolCallPart,
15
+ agentToolResult,
16
+ agentToolResultPart,
17
+ type AgentContentPart,
18
+ type AgentMessage,
19
+ type AgentModelRequest,
20
+ type AgentModelResponse,
21
+ type AgentToolCall,
22
+ type AgentToolError,
23
+ type AgentToolResult,
24
+ type JsonObject,
25
+ type JsonValue,
26
+ } from "../semantic";
27
+
28
+ const VERSION = "bazis.agent-execution-state/v1";
29
+ const PHASES = new Set(["ready-model", "pending-tools", "terminal"]);
30
+ const FINISH_REASONS = new Set(["stop", "tool-calls", "length", "content-filter", "error"]);
31
+ const TOOL_STATUSES = new Set(["success", "error", "denied"]);
32
+ /**
33
+ * A semantic checkpoint is trusted by the driver only when it was produced by
34
+ * this parser or by the transition function below. This is intentionally an
35
+ * identity check: it must not inspect arbitrary objects (including accessors).
36
+ */
37
+ const issuedCheckpoints = new WeakSet<object>();
38
+
39
+ export type AgentExecutionPhase = "ready-model" | "pending-tools" | "terminal";
40
+
41
+ export interface AgentExecutionInvocationState {
42
+ readonly kind: "agent" | "task";
43
+ readonly invocationId: string;
44
+ readonly agentName: string;
45
+ readonly taskName?: string;
46
+ readonly input: JsonValue;
47
+ readonly metadata: JsonObject;
48
+ /** Resolved Session data only; never classes, callbacks, DI or policies. */
49
+ readonly options: JsonObject;
50
+ }
51
+
52
+ export interface AgentExecutionPendingToolBatch {
53
+ readonly step: number;
54
+ readonly responseIndex: number;
55
+ readonly assistantMessageIndex: number;
56
+ readonly nextToolIndex: number;
57
+ }
58
+
59
+ export interface AgentExecutionTerminalState {
60
+ readonly status: "completed" | "failed";
61
+ readonly finalMessage?: AgentMessage;
62
+ readonly output?: JsonValue;
63
+ readonly error?: AgentToolError;
64
+ }
65
+
66
+ /** A rejected provider batch is retained exactly, before semantic admission. */
67
+ interface AgentExecutionResponse {
68
+ readonly invocationId: string;
69
+ readonly finishReason: AgentModelResponse["finishReason"];
70
+ readonly message?: AgentMessage;
71
+ readonly toolCalls: readonly AgentToolCall[];
72
+ readonly usage?: AgentModelResponse["usage"];
73
+ readonly metadata: JsonObject;
74
+ }
75
+
76
+ export interface AgentExecutionCheckpointV1 {
77
+ readonly version: typeof VERSION;
78
+ readonly invocation: AgentExecutionInvocationState;
79
+ readonly phase: AgentExecutionPhase;
80
+ readonly steps: number;
81
+ readonly messages: readonly AgentMessage[];
82
+ readonly responses: readonly AgentExecutionResponse[];
83
+ readonly toolResults: readonly AgentToolResult[];
84
+ readonly seenToolCallIds: readonly string[];
85
+ readonly pendingToolBatch?: AgentExecutionPendingToolBatch;
86
+ readonly terminal?: AgentExecutionTerminalState;
87
+ }
88
+
89
+ export class AgentExecutionStateError extends Error {
90
+ readonly code = "AGENT_EXECUTION_STATE_INVALID" as const;
91
+
92
+ constructor() {
93
+ super("Agent execution checkpoint is invalid.");
94
+ this.name = "AgentExecutionStateError";
95
+ }
96
+ }
97
+
98
+ export type AgentExecutionControlDecision =
99
+ | { readonly kind: "continue" }
100
+ | { readonly kind: "suspend"; readonly reason: string };
101
+
102
+ /**
103
+ * Owner-private durable boundary, passed in the driver request. The driver
104
+ * consults it before each checkpoint transition, model dispatch and settlement.
105
+ */
106
+ export interface AgentExecutionBoundary {
107
+ checkControl(checkpoint: AgentExecutionCheckpointV1, next: AgentExecutionCheckpointV1): Promise<AgentExecutionControlDecision>;
108
+ beforeModelDispatch(checkpoint: AgentExecutionCheckpointV1, step: number, request: AgentModelRequest): Promise<void>;
109
+ afterModelSettlement(
110
+ previous: AgentExecutionCheckpointV1,
111
+ candidate: AgentExecutionCheckpointV1,
112
+ step: number,
113
+ outcome: { readonly response: AgentModelResponse } | { readonly error: AgentToolError },
114
+ ): Promise<void>;
115
+ beforeToolDispatch(
116
+ checkpoint: AgentExecutionCheckpointV1,
117
+ step: number,
118
+ toolIndex: number,
119
+ call: AgentToolCall,
120
+ idempotencyKey: string,
121
+ ): Promise<void>;
122
+ afterToolSettlement(
123
+ previous: AgentExecutionCheckpointV1,
124
+ candidate: AgentExecutionCheckpointV1,
125
+ step: number,
126
+ toolIndex: number,
127
+ call: AgentToolCall,
128
+ idempotencyKey: string,
129
+ result: AgentToolResult,
130
+ ): Promise<void>;
131
+ }
132
+
133
+ /** Decodes strict bounded JSON before validating and rehydrating semantic values. */
134
+ export function parseAgentExecutionCheckpointV1(text: string): AgentExecutionCheckpointV1 {
135
+ const decoded = decodeBoundedJsonV1(text);
136
+ if (!decoded.ok) throw invalid();
137
+ return parseBoundaryCheckpoint(decoded.value);
138
+ }
139
+
140
+ /** Validates an in-memory checkpoint and emits the shared canonical JSON representation. */
141
+ export function canonicalAgentExecutionCheckpointV1(value: unknown): string {
142
+ if (isIssuedCheckpoint(value)) {
143
+ try {
144
+ return canonicalBoundaryJsonV1(checkpointRecord(value));
145
+ } catch {
146
+ throw invalid();
147
+ }
148
+ }
149
+ const normalized = normalizeBoundedJsonV1(value);
150
+ if (!normalized.ok) throw invalid();
151
+ const checkpoint = parseBoundaryCheckpoint(normalized.value);
152
+ try {
153
+ return canonicalBoundaryJsonV1(checkpointRecord(checkpoint));
154
+ } catch {
155
+ throw invalid();
156
+ }
157
+ }
158
+
159
+ /** Validates an in-memory checkpoint and returns a fully immutable semantic state. */
160
+ export function agentExecutionCheckpointV1(value: unknown): AgentExecutionCheckpointV1 {
161
+ const normalized = normalizeBoundedJsonV1(value);
162
+ if (!normalized.ok) throw invalid();
163
+ return parseBoundaryCheckpoint(normalized.value);
164
+ }
165
+
166
+ /** Owner-private admission used by the execution driver before rehydration. */
167
+ export function requireIssuedAgentExecutionCheckpointV1(value: unknown): AgentExecutionCheckpointV1 {
168
+ if (!isIssuedCheckpoint(value)) throw invalid();
169
+ return value;
170
+ }
171
+
172
+ /**
173
+ * Produces a fully validated next state while retaining immutable invocation
174
+ * identity. The complete next progress is required so a caller cannot apply
175
+ * an open-ended patch to a checkpoint.
176
+ */
177
+ export function evolveAgentExecutionCheckpointV1(
178
+ previous: AgentExecutionCheckpointV1,
179
+ progress: Pick<
180
+ AgentExecutionCheckpointV1,
181
+ "phase" | "steps" | "messages" | "responses" | "toolResults" | "seenToolCallIds" | "pendingToolBatch" | "terminal"
182
+ >,
183
+ ): AgentExecutionCheckpointV1 {
184
+ requireIssuedAgentExecutionCheckpointV1(previous);
185
+ return agentExecutionCheckpointV1({
186
+ ...checkpointRecord(previous),
187
+ phase: progress.phase,
188
+ steps: progress.steps,
189
+ messages: progress.messages.map(messageRecord),
190
+ responses: progress.responses.map(responseRecord),
191
+ toolResults: progress.toolResults.map(toolResultRecord),
192
+ seenToolCallIds: progress.seenToolCallIds,
193
+ pendingToolBatch: progress.pendingToolBatch ?? null,
194
+ terminal: progress.terminal === undefined ? null : terminalRecord(progress.terminal),
195
+ });
196
+ }
197
+
198
+ function isIssuedCheckpoint(value: unknown): value is AgentExecutionCheckpointV1 {
199
+ return typeof value === "object" && value !== null && issuedCheckpoints.has(value);
200
+ }
201
+
202
+ function parseBoundaryCheckpoint(value: BoundaryJsonValue): AgentExecutionCheckpointV1 {
203
+ try {
204
+ return checkpointFromBoundary(value);
205
+ } catch (error) {
206
+ if (error instanceof AgentExecutionStateError) throw error;
207
+ throw invalid();
208
+ }
209
+ }
210
+
211
+ function checkpointFromBoundary(value: BoundaryJsonValue): AgentExecutionCheckpointV1 {
212
+ const root = closed(value, ["version", "invocation", "phase", "steps", "messages", "responses", "toolResults", "seenToolCallIds", "pendingToolBatch", "terminal"]);
213
+ if (root.version !== VERSION || !isPhase(root.phase)) throw invalid();
214
+
215
+ const invocation = parseInvocation(root.invocation);
216
+ const messages = parseArray(root.messages, parseMessage);
217
+ const responses = parseArray(root.responses, parseResponse);
218
+ const toolResults = parseArray(root.toolResults, parseToolResult);
219
+ const seenToolCallIds = parseArray(root.seenToolCallIds, requiredString);
220
+ const steps = nonNegativeInteger(root.steps);
221
+ const pendingToolBatch = root.pendingToolBatch === null ? undefined : parsePendingToolBatch(root.pendingToolBatch);
222
+ const terminal = root.terminal === null ? undefined : parseTerminal(root.terminal);
223
+
224
+ const checkpoint: AgentExecutionCheckpointV1 = Object.freeze({
225
+ version: VERSION,
226
+ invocation,
227
+ phase: root.phase,
228
+ steps,
229
+ messages: Object.freeze(messages),
230
+ responses: Object.freeze(responses),
231
+ toolResults: Object.freeze(toolResults),
232
+ seenToolCallIds: Object.freeze(seenToolCallIds),
233
+ pendingToolBatch,
234
+ terminal,
235
+ });
236
+ validateCheckpoint(checkpoint);
237
+ issuedCheckpoints.add(checkpoint);
238
+ return checkpoint;
239
+ }
240
+
241
+ function parseInvocation(value: BoundaryJsonValue): AgentExecutionInvocationState {
242
+ const record = closed(value, ["kind", "invocationId", "agentName", "taskName", "input", "metadata", "options"]);
243
+ if (record.kind !== "agent" && record.kind !== "task") throw invalid();
244
+ if ((record.kind === "agent" && record.taskName !== null) || (record.kind === "task" && typeof record.taskName !== "string")) throw invalid();
245
+ return Object.freeze({
246
+ kind: record.kind,
247
+ invocationId: requiredString(record.invocationId),
248
+ agentName: requiredString(record.agentName),
249
+ taskName: record.taskName === null ? undefined : requiredString(record.taskName),
250
+ input: asJsonValue(record.input),
251
+ metadata: asJsonObject(record.metadata),
252
+ options: parseResolvedOptions(record.options),
253
+ });
254
+ }
255
+
256
+ /**
257
+ * The checkpoint stores resolved data, not an invocation's mutable runtime
258
+ * options. Keeping this record closed prevents a later driver default from
259
+ * silently changing a resumed execution.
260
+ */
261
+ function parseResolvedOptions(value: BoundaryJsonValue): JsonObject {
262
+ const record = closed(value, [
263
+ "maxSteps",
264
+ "maxToolCallsPerStep",
265
+ "runTimeoutMs",
266
+ "modelProfile",
267
+ "provider",
268
+ "context",
269
+ "output",
270
+ "tool",
271
+ ]);
272
+ const provider = closed(record.provider, ["timeoutMs"]);
273
+ const context = closed(record.context, ["maxMessages", "maxChars", "maxTokens"]);
274
+ const output = closed(record.output, ["maxOutputTokens", "temperature"]);
275
+ const tool = closed(record.tool, ["defaultTimeoutMs", "scopeDisposeTimeoutMs", "maxAttempts", "timeouts"]);
276
+ if (record.modelProfile !== null) requiredString(record.modelProfile);
277
+ if (tool.maxAttempts !== 1) throw invalid();
278
+
279
+ const timeouts = parseArray(tool.timeouts, (item) => {
280
+ const timeout = closed(item, ["name", "timeoutMs"]);
281
+ return { name: requiredString(timeout.name), timeoutMs: positiveSafeInteger(timeout.timeoutMs) };
282
+ });
283
+ for (let index = 1; index < timeouts.length; index += 1) {
284
+ if (timeouts[index - 1]!.name >= timeouts[index]!.name) throw invalid();
285
+ }
286
+
287
+ return Object.freeze({
288
+ maxSteps: positiveSafeInteger(record.maxSteps),
289
+ maxToolCallsPerStep: positiveSafeInteger(record.maxToolCallsPerStep),
290
+ runTimeoutMs: positiveSafeInteger(record.runTimeoutMs),
291
+ modelProfile: record.modelProfile === null ? null : requiredString(record.modelProfile),
292
+ provider: Object.freeze({ timeoutMs: positiveSafeInteger(provider.timeoutMs) }),
293
+ context: Object.freeze({
294
+ maxMessages: nullablePositiveSafeInteger(context.maxMessages),
295
+ maxChars: nullablePositiveSafeInteger(context.maxChars),
296
+ maxTokens: nullablePositiveSafeInteger(context.maxTokens),
297
+ }),
298
+ output: Object.freeze({
299
+ maxOutputTokens: nullablePositiveSafeInteger(output.maxOutputTokens),
300
+ temperature: nullableTemperature(output.temperature),
301
+ }),
302
+ tool: Object.freeze({
303
+ defaultTimeoutMs: positiveSafeInteger(tool.defaultTimeoutMs),
304
+ scopeDisposeTimeoutMs: positiveSafeInteger(tool.scopeDisposeTimeoutMs),
305
+ maxAttempts: 1,
306
+ timeouts: Object.freeze(timeouts.map((timeout) => Object.freeze(timeout))),
307
+ }),
308
+ });
309
+ }
310
+
311
+ function parsePendingToolBatch(value: BoundaryJsonValue): AgentExecutionPendingToolBatch {
312
+ const record = closed(value, ["step", "responseIndex", "assistantMessageIndex", "nextToolIndex"]);
313
+ return Object.freeze({
314
+ step: nonNegativeInteger(record.step),
315
+ responseIndex: nonNegativeInteger(record.responseIndex),
316
+ assistantMessageIndex: nonNegativeInteger(record.assistantMessageIndex),
317
+ nextToolIndex: nonNegativeInteger(record.nextToolIndex),
318
+ });
319
+ }
320
+
321
+ function parseTerminal(value: BoundaryJsonValue): AgentExecutionTerminalState {
322
+ const record = closed(value, ["status", "finalMessage", "hasOutput", "output", "error"]);
323
+ if (record.status !== "completed" && record.status !== "failed") throw invalid();
324
+ if (typeof record.hasOutput !== "boolean" || (!record.hasOutput && record.output !== null)) throw invalid();
325
+ if (record.status === "completed" && record.error !== null) throw invalid();
326
+ if (record.status === "failed" && record.error === null) throw invalid();
327
+ return freezeWithoutUndefined({
328
+ status: record.status,
329
+ finalMessage: record.finalMessage === null ? undefined : parseMessage(record.finalMessage),
330
+ output: record.hasOutput ? asJsonValue(record.output) : undefined,
331
+ error: record.error === null ? undefined : parseToolError(record.error),
332
+ });
333
+ }
334
+
335
+ function parseResponse(value: BoundaryJsonValue): AgentExecutionResponse {
336
+ const record = closed(value, ["invocationId", "finishReason", "message", "toolCalls", "usage", "metadata"]);
337
+ if (typeof record.finishReason !== "string" || !FINISH_REASONS.has(record.finishReason)) throw invalid();
338
+ return Object.freeze({
339
+ invocationId: requiredString(record.invocationId),
340
+ finishReason: record.finishReason as AgentModelResponse["finishReason"],
341
+ message: record.message === null ? undefined : parseMessage(record.message),
342
+ toolCalls: Object.freeze(parseArray(record.toolCalls, parseToolCall)),
343
+ usage: record.usage === null ? undefined : parseUsage(record.usage),
344
+ metadata: asJsonObject(record.metadata),
345
+ });
346
+ }
347
+
348
+ function parseUsage(value: BoundaryJsonValue): NonNullable<AgentModelResponse["usage"]> {
349
+ const record = closed(value, ["inputTokens", "outputTokens", "totalTokens", "latencyMs", "cost", "cacheHit"]);
350
+ if (record.cacheHit !== null && typeof record.cacheHit !== "boolean") throw invalid();
351
+ const cost = record.cost === null ? undefined : parseCost(record.cost);
352
+ return freezeWithoutUndefined({
353
+ inputTokens: record.inputTokens === null ? undefined : nonNegativeInteger(record.inputTokens),
354
+ outputTokens: record.outputTokens === null ? undefined : nonNegativeInteger(record.outputTokens),
355
+ totalTokens: record.totalTokens === null ? undefined : nonNegativeInteger(record.totalTokens),
356
+ latencyMs: record.latencyMs === null ? undefined : nonNegativeInteger(record.latencyMs),
357
+ cost,
358
+ cacheHit: record.cacheHit === null ? undefined : record.cacheHit,
359
+ });
360
+ }
361
+
362
+ function parseCost(value: BoundaryJsonValue): NonNullable<NonNullable<AgentModelResponse["usage"]>["cost"]> {
363
+ const record = closed(value, ["amount", "currency"]);
364
+ if (typeof record.amount !== "number" || !Number.isFinite(record.amount) || record.amount < 0) throw invalid();
365
+ return Object.freeze({ amount: record.amount, currency: requiredString(record.currency) });
366
+ }
367
+
368
+ function parseMessage(value: BoundaryJsonValue): AgentMessage {
369
+ const record = closed(value, ["role", "content", "id", "name", "toolCallId", "createdAtUnixMs", "metadata"]);
370
+ if (record.role !== "system" && record.role !== "developer" && record.role !== "user" && record.role !== "assistant" && record.role !== "tool") throw invalid();
371
+ return agentMessage(record.role, parseArray(record.content, parseContentPart), {
372
+ id: record.id === null ? undefined : requiredString(record.id),
373
+ name: record.name === null ? undefined : requiredString(record.name),
374
+ toolCallId: record.toolCallId === null ? undefined : requiredString(record.toolCallId),
375
+ createdAtUnixMs: record.createdAtUnixMs === null ? undefined : nonNegativeInteger(record.createdAtUnixMs),
376
+ metadata: asJsonObject(record.metadata),
377
+ });
378
+ }
379
+
380
+ function parseContentPart(value: BoundaryJsonValue): AgentContentPart {
381
+ const record = object(value);
382
+ if (record.kind === "text") {
383
+ const text = closed(record, ["kind", "text"]);
384
+ return agentText(requiredString(text.text));
385
+ }
386
+ if (record.kind === "data") {
387
+ const data = closed(record, ["kind", "value", "name"]);
388
+ return agentData(asJsonValue(data.value), { name: data.name === null ? undefined : requiredString(data.name) });
389
+ }
390
+ if (record.kind === "tool-call") {
391
+ const call = closed(record, ["kind", "call"]);
392
+ return agentToolCallPart(parseToolCall(call.call));
393
+ }
394
+ if (record.kind === "tool-result") {
395
+ const result = closed(record, ["kind", "result"]);
396
+ return agentToolResultPart(parseToolResult(result.result));
397
+ }
398
+ throw invalid();
399
+ }
400
+
401
+ function parseToolCall(value: BoundaryJsonValue): AgentToolCall {
402
+ const record = closed(value, ["id", "name", "input", "metadata"]);
403
+ return agentToolCall({
404
+ id: requiredString(record.id),
405
+ name: requiredString(record.name),
406
+ input: asJsonValue(record.input),
407
+ metadata: asJsonObject(record.metadata),
408
+ });
409
+ }
410
+
411
+ function parseToolResult(value: BoundaryJsonValue): AgentToolResult {
412
+ const record = closed(value, ["callId", "name", "status", "output", "error", "durationMs", "metadata"]);
413
+ if (typeof record.status !== "string" || !TOOL_STATUSES.has(record.status)) throw invalid();
414
+ if ((record.status === "success" && record.error !== null) || (record.status !== "success" && record.error === null)) throw invalid();
415
+ if (record.status !== "success" && record.output !== null) throw invalid();
416
+ return agentToolResult({
417
+ callId: requiredString(record.callId),
418
+ name: requiredString(record.name),
419
+ status: record.status as AgentToolResult["status"],
420
+ output: record.output === null ? undefined : asJsonValue(record.output),
421
+ error: record.error === null ? undefined : parseToolError(record.error),
422
+ durationMs: record.durationMs === null ? undefined : nonNegativeInteger(record.durationMs),
423
+ metadata: asJsonObject(record.metadata),
424
+ });
425
+ }
426
+
427
+ function parseToolError(value: BoundaryJsonValue): AgentToolError {
428
+ const record = closed(value, ["code", "message", "details"]);
429
+ return freezeWithoutUndefined({
430
+ code: record.code === null ? undefined : requiredString(record.code),
431
+ message: requiredString(record.message),
432
+ details: record.details === null ? undefined : asJsonValue(record.details),
433
+ });
434
+ }
435
+
436
+ function validateCheckpoint(checkpoint: AgentExecutionCheckpointV1): void {
437
+ const seen = new Set<string>();
438
+ const recomputedSeen: string[] = [];
439
+ const transcriptResults: AgentToolResult[] = [];
440
+ for (const message of checkpoint.messages) {
441
+ for (const part of message.content) {
442
+ if (part.kind !== "tool-call") continue;
443
+ if (seen.has(part.call.id)) throw invalid();
444
+ seen.add(part.call.id);
445
+ recomputedSeen.push(part.call.id);
446
+ }
447
+ if (message.role === "tool") {
448
+ const result = message.content[0];
449
+ if (result?.kind !== "tool-result") throw invalid();
450
+ transcriptResults.push(result.result);
451
+ }
452
+ }
453
+ if (!sameStringList(checkpoint.seenToolCallIds, recomputedSeen)) throw invalid();
454
+ if (!sameResults(checkpoint.toolResults, transcriptResults)) throw invalid();
455
+ for (const response of checkpoint.responses) {
456
+ if (response.invocationId !== checkpoint.invocation.invocationId) throw invalid();
457
+ }
458
+
459
+ if (checkpoint.phase === "ready-model") {
460
+ if (checkpoint.pendingToolBatch !== undefined || checkpoint.terminal !== undefined) throw invalid();
461
+ assertAdmittedResponseBatches(checkpoint.responses, checkpoint.messages);
462
+ assertCompleteTranscript(checkpoint.messages);
463
+ return;
464
+ }
465
+ if (checkpoint.phase === "terminal") {
466
+ if (checkpoint.terminal === undefined) throw invalid();
467
+ if (checkpoint.terminal.status === "failed" && checkpoint.pendingToolBatch !== undefined) {
468
+ validateUnknownPrefixTerminal(checkpoint);
469
+ return;
470
+ }
471
+ if (checkpoint.terminal.status === "failed" && isRejectedProviderTerminal(checkpoint)) {
472
+ validateRejectedProviderTerminal(checkpoint);
473
+ return;
474
+ }
475
+ if (checkpoint.pendingToolBatch !== undefined) throw invalid();
476
+ assertAdmittedResponseBatches(checkpoint.responses, checkpoint.messages);
477
+ assertCompleteTranscript(checkpoint.messages);
478
+ return;
479
+ }
480
+ if (checkpoint.pendingToolBatch === undefined || checkpoint.terminal !== undefined) throw invalid();
481
+ assertAdmittedResponseBatches(checkpoint.responses, checkpoint.messages);
482
+ validatePendingBatch(checkpoint);
483
+ }
484
+
485
+ function assertAdmittedResponseBatches(
486
+ responses: readonly AgentExecutionResponse[],
487
+ messages: readonly AgentMessage[],
488
+ ): void {
489
+ const responseBatches = responses.filter((response) => response.toolCalls.length > 0);
490
+ const assistantBatches = messages
491
+ .filter((message) => message.role === "assistant")
492
+ .map((message) => message.content.filter((part): part is Extract<AgentContentPart, { readonly kind: "tool-call" }> => part.kind === "tool-call"))
493
+ .filter((calls) => calls.length > 0);
494
+ if (responseBatches.length !== assistantBatches.length) throw invalid();
495
+ for (let batchIndex = 0; batchIndex < responseBatches.length; batchIndex += 1) {
496
+ const response = responseBatches[batchIndex]!;
497
+ assertSemanticResponse(response);
498
+ const assistantCalls = assistantBatches[batchIndex]!;
499
+ if (response.toolCalls.length !== assistantCalls.length) throw invalid();
500
+ for (let callIndex = 0; callIndex < response.toolCalls.length; callIndex += 1) {
501
+ if (!sameCall(response.toolCalls[callIndex]!, assistantCalls[callIndex]!.call)) throw invalid();
502
+ }
503
+ }
504
+ for (const response of responses) assertSemanticResponse(response);
505
+ }
506
+
507
+ function assertSemanticResponse(response: AgentExecutionResponse): void {
508
+ try {
509
+ agentModelResponse(response);
510
+ } catch {
511
+ throw invalid();
512
+ }
513
+ }
514
+
515
+ function validateUnknownPrefixTerminal(checkpoint: AgentExecutionCheckpointV1): void {
516
+ const terminal = checkpoint.terminal!;
517
+ const pending = checkpoint.pendingToolBatch!;
518
+ if (terminal.error?.code !== "AGENT_TOOL_OUTCOME_UNKNOWN" || terminal.finalMessage !== undefined || terminal.output !== undefined) throw invalid();
519
+ assertAdmittedResponseBatches(checkpoint.responses, checkpoint.messages);
520
+ validatePendingBatch(checkpoint);
521
+ if (pending.nextToolIndex < 1) throw invalid();
522
+ const response = checkpoint.responses[pending.responseIndex]!;
523
+ const result = checkpoint.toolResults[checkpoint.toolResults.length - 1];
524
+ const expectedCall = response.toolCalls[pending.nextToolIndex - 1];
525
+ if (result === undefined || expectedCall === undefined || result.callId !== expectedCall.id || result.name !== expectedCall.name || result.error?.code?.endsWith("_OUTCOME_UNKNOWN") !== true) throw invalid();
526
+ }
527
+
528
+ function isRejectedProviderTerminal(checkpoint: AgentExecutionCheckpointV1): boolean {
529
+ const terminal = checkpoint.terminal!;
530
+ const responseBatches = checkpoint.responses.filter((response) => response.toolCalls.length > 0).length;
531
+ const assistantBatches = checkpoint.messages.filter((message) => message.role === "assistant" && message.content.some((part) => part.kind === "tool-call")).length;
532
+ return checkpoint.pendingToolBatch === undefined
533
+ && terminal.status === "failed"
534
+ && terminal.finalMessage === undefined
535
+ && terminal.output === undefined
536
+ && responseBatches > assistantBatches;
537
+ }
538
+
539
+ function validateRejectedProviderTerminal(checkpoint: AgentExecutionCheckpointV1): void {
540
+ const terminal = checkpoint.terminal!;
541
+ const rejected = checkpoint.responses[checkpoint.responses.length - 1]!;
542
+ if (rejected.toolCalls.length === 0) throw invalid();
543
+ const admitted = checkpoint.responses.slice(0, -1);
544
+ assertAdmittedResponseBatches(admitted, checkpoint.messages);
545
+ assertCompleteTranscript(checkpoint.messages);
546
+ const limit = checkpoint.invocation.options.maxToolCallsPerStep;
547
+ if (typeof limit !== "number" || !Number.isSafeInteger(limit) || limit <= 0) throw invalid();
548
+ const errorCode = terminal.error?.code;
549
+ if (rejected.toolCalls.length > limit) {
550
+ if (errorCode !== "AGENT_TOOL_CALL_LIMIT_EXCEEDED") throw invalid();
551
+ return;
552
+ }
553
+ const ids = new Set<string>();
554
+ const duplicateOrReused = rejected.toolCalls.some((call) => {
555
+ if (ids.has(call.id) || checkpoint.seenToolCallIds.includes(call.id)) return true;
556
+ ids.add(call.id);
557
+ return false;
558
+ });
559
+ if (duplicateOrReused) {
560
+ if (errorCode !== "AGENT_PROVIDER_RESPONSE_INVALID") throw invalid();
561
+ return;
562
+ }
563
+ if (rejected.message !== undefined && rejected.message.role !== "assistant") {
564
+ if (errorCode !== "AGENT_PROVIDER_RESPONSE_INVALID") throw invalid();
565
+ return;
566
+ }
567
+ throw invalid();
568
+ }
569
+
570
+ function validatePendingBatch(checkpoint: AgentExecutionCheckpointV1): void {
571
+ const pending = checkpoint.pendingToolBatch!;
572
+ if (pending.step !== checkpoint.steps || pending.step < 1 || pending.responseIndex !== checkpoint.responses.length - 1) throw invalid();
573
+ const response = checkpoint.responses[pending.responseIndex];
574
+ const assistant = checkpoint.messages[pending.assistantMessageIndex];
575
+ if (response === undefined || assistant === undefined || assistant.role !== "assistant") throw invalid();
576
+ if (response.toolCalls.length === 0 || pending.nextToolIndex >= response.toolCalls.length) throw invalid();
577
+ assertCompleteTranscript(checkpoint.messages.slice(0, pending.assistantMessageIndex));
578
+ const assistantCalls = assistant.content.filter((part): part is Extract<AgentContentPart, { readonly kind: "tool-call" }> => part.kind === "tool-call");
579
+ if (assistantCalls.length !== response.toolCalls.length) throw invalid();
580
+ for (let index = 0; index < response.toolCalls.length; index += 1) {
581
+ if (!sameCall(assistantCalls[index]!.call, response.toolCalls[index]!)) throw invalid();
582
+ }
583
+ if (checkpoint.messages.length !== pending.assistantMessageIndex + 1 + pending.nextToolIndex) throw invalid();
584
+ for (let index = 0; index < pending.nextToolIndex; index += 1) {
585
+ const resultMessage = checkpoint.messages[pending.assistantMessageIndex + 1 + index];
586
+ const call = response.toolCalls[index]!;
587
+ if (resultMessage?.role !== "tool" || resultMessage.toolCallId !== call.id) throw invalid();
588
+ const part = resultMessage.content[0];
589
+ if (part?.kind !== "tool-result" || part.result.callId !== call.id || part.result.name !== call.name) throw invalid();
590
+ }
591
+ }
592
+
593
+ function assertCompleteTranscript(messages: readonly AgentMessage[]): void {
594
+ for (let index = 0; index < messages.length; index += 1) {
595
+ const message = messages[index]!;
596
+ if (message.role === "tool") throw invalid();
597
+ if (message.role !== "assistant") continue;
598
+ const calls = message.content.filter((part): part is Extract<AgentContentPart, { readonly kind: "tool-call" }> => part.kind === "tool-call");
599
+ for (let callIndex = 0; callIndex < calls.length; callIndex += 1) {
600
+ const resultMessage = messages[index + 1 + callIndex];
601
+ const call = calls[callIndex]!.call;
602
+ const part = resultMessage?.content[0];
603
+ if (resultMessage?.role !== "tool" || resultMessage.toolCallId !== call.id || part?.kind !== "tool-result" || part.result.callId !== call.id || part.result.name !== call.name) throw invalid();
604
+ }
605
+ index += calls.length;
606
+ }
607
+ }
608
+
609
+ function checkpointRecord(checkpoint: AgentExecutionCheckpointV1): Record<string, unknown> {
610
+ return {
611
+ version: checkpoint.version,
612
+ invocation: {
613
+ kind: checkpoint.invocation.kind,
614
+ invocationId: checkpoint.invocation.invocationId,
615
+ agentName: checkpoint.invocation.agentName,
616
+ taskName: checkpoint.invocation.taskName ?? null,
617
+ input: checkpoint.invocation.input,
618
+ metadata: checkpoint.invocation.metadata,
619
+ options: checkpoint.invocation.options,
620
+ },
621
+ phase: checkpoint.phase,
622
+ steps: checkpoint.steps,
623
+ messages: checkpoint.messages.map(messageRecord),
624
+ responses: checkpoint.responses.map(responseRecord),
625
+ toolResults: checkpoint.toolResults.map(toolResultRecord),
626
+ seenToolCallIds: checkpoint.seenToolCallIds,
627
+ pendingToolBatch: checkpoint.pendingToolBatch ?? null,
628
+ terminal: checkpoint.terminal === undefined ? null : terminalRecord(checkpoint.terminal),
629
+ };
630
+ }
631
+
632
+ function responseRecord(response: AgentExecutionResponse): Record<string, unknown> {
633
+ return {
634
+ invocationId: response.invocationId,
635
+ finishReason: response.finishReason,
636
+ message: response.message === undefined ? null : messageRecord(response.message),
637
+ toolCalls: response.toolCalls.map(toolCallRecord),
638
+ usage: response.usage === undefined ? null : {
639
+ inputTokens: response.usage.inputTokens ?? null,
640
+ outputTokens: response.usage.outputTokens ?? null,
641
+ totalTokens: response.usage.totalTokens ?? null,
642
+ latencyMs: response.usage.latencyMs ?? null,
643
+ cost: response.usage.cost ?? null,
644
+ cacheHit: response.usage.cacheHit ?? null,
645
+ },
646
+ metadata: response.metadata,
647
+ };
648
+ }
649
+
650
+ function messageRecord(message: AgentMessage): Record<string, unknown> {
651
+ return {
652
+ role: message.role,
653
+ content: message.content.map(contentPartRecord),
654
+ id: message.id ?? null,
655
+ name: message.name ?? null,
656
+ toolCallId: message.toolCallId ?? null,
657
+ createdAtUnixMs: message.createdAtUnixMs ?? null,
658
+ metadata: message.metadata,
659
+ };
660
+ }
661
+
662
+ function contentPartRecord(part: AgentContentPart): Record<string, unknown> {
663
+ if (part.kind === "text") return { kind: "text", text: part.text };
664
+ if (part.kind === "data") return { kind: "data", value: part.value, name: part.name ?? null };
665
+ if (part.kind === "tool-call") return { kind: "tool-call", call: toolCallRecord(part.call) };
666
+ if (part.kind === "tool-result") return { kind: "tool-result", result: toolResultRecord(part.result) };
667
+ throw invalid();
668
+ }
669
+
670
+ function toolCallRecord(call: AgentToolCall): Record<string, unknown> {
671
+ return { id: call.id, name: call.name, input: call.input, metadata: call.metadata };
672
+ }
673
+
674
+ function toolResultRecord(result: AgentToolResult): Record<string, unknown> {
675
+ return {
676
+ callId: result.callId,
677
+ name: result.name,
678
+ status: result.status,
679
+ output: result.output ?? null,
680
+ error: result.error === undefined ? null : { code: result.error.code ?? null, message: result.error.message, details: result.error.details ?? null },
681
+ durationMs: result.durationMs ?? null,
682
+ metadata: result.metadata,
683
+ };
684
+ }
685
+
686
+ function terminalRecord(terminal: AgentExecutionTerminalState): Record<string, unknown> {
687
+ return {
688
+ status: terminal.status,
689
+ finalMessage: terminal.finalMessage === undefined ? null : messageRecord(terminal.finalMessage),
690
+ hasOutput: terminal.output !== undefined,
691
+ output: terminal.output ?? null,
692
+ error: terminal.error === undefined ? null : { code: terminal.error.code ?? null, message: terminal.error.message, details: terminal.error.details ?? null },
693
+ };
694
+ }
695
+
696
+ function closed<const Keys extends readonly string[]>(
697
+ value: BoundaryJsonValue,
698
+ keys: Keys,
699
+ ): { readonly [Key in Keys[number]]: BoundaryJsonValue } {
700
+ const record = object(value);
701
+ const actual = Object.keys(record).sort();
702
+ const expected = [...keys].sort();
703
+ if (actual.length !== expected.length || actual.some((key, index) => key !== expected[index])) throw invalid();
704
+ const output = Object.create(null) as Record<Keys[number], BoundaryJsonValue>;
705
+ for (const key of keys as readonly Keys[number][]) output[key] = record[key]!;
706
+ return Object.freeze(output);
707
+ }
708
+
709
+ function object(value: BoundaryJsonValue): BoundaryJsonObject {
710
+ if (value === null || typeof value !== "object" || Array.isArray(value)) throw invalid();
711
+ return value as BoundaryJsonObject;
712
+ }
713
+
714
+ function parseArray<T>(value: BoundaryJsonValue, parse: (item: BoundaryJsonValue) => T): T[] {
715
+ if (!Array.isArray(value)) throw invalid();
716
+ return value.map(parse);
717
+ }
718
+
719
+ function asJsonValue(value: BoundaryJsonValue): JsonValue {
720
+ return value as JsonValue;
721
+ }
722
+
723
+ function asJsonObject(value: BoundaryJsonValue): JsonObject {
724
+ if (value === null || typeof value !== "object" || Array.isArray(value)) throw invalid();
725
+ return value as JsonObject;
726
+ }
727
+
728
+ function requiredString(value: BoundaryJsonValue): string {
729
+ if (typeof value !== "string" || value.length === 0) throw invalid();
730
+ return value;
731
+ }
732
+
733
+ function nonNegativeInteger(value: BoundaryJsonValue): number {
734
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) throw invalid();
735
+ return value;
736
+ }
737
+
738
+ function positiveSafeInteger(value: BoundaryJsonValue): number {
739
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value <= 0) throw invalid();
740
+ return value;
741
+ }
742
+
743
+ function nullablePositiveSafeInteger(value: BoundaryJsonValue): number | null {
744
+ return value === null ? null : positiveSafeInteger(value);
745
+ }
746
+
747
+ function nullableTemperature(value: BoundaryJsonValue): number | null {
748
+ if (value === null) return null;
749
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0 || value > 2) throw invalid();
750
+ return value;
751
+ }
752
+
753
+ function isPhase(value: BoundaryJsonValue): value is AgentExecutionPhase {
754
+ return typeof value === "string" && PHASES.has(value);
755
+ }
756
+
757
+ function sameStringList(left: readonly string[], right: readonly string[]): boolean {
758
+ return left.length === right.length && left.every((value, index) => value === right[index]);
759
+ }
760
+
761
+ function sameCall(left: AgentToolCall, right: AgentToolCall): boolean {
762
+ return canonicalBoundaryJsonV1(toolCallRecord(left)) === canonicalBoundaryJsonV1(toolCallRecord(right));
763
+ }
764
+
765
+ function sameResults(left: readonly AgentToolResult[], right: readonly AgentToolResult[]): boolean {
766
+ return left.length === right.length && left.every((result, index) => canonicalBoundaryJsonV1(toolResultRecord(result)) === canonicalBoundaryJsonV1(toolResultRecord(right[index]!)));
767
+ }
768
+
769
+ function freezeWithoutUndefined<T extends object>(value: T): T {
770
+ return Object.freeze(Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined)) as T);
771
+ }
772
+
773
+ function invalid(): AgentExecutionStateError {
774
+ return new AgentExecutionStateError();
775
+ }