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,903 @@
1
+ import { AgentSemanticError } from "./errors";
2
+ import type { ToolApproval, ToolSideEffect } from "./metadata";
3
+
4
+ const FORBIDDEN_JSON_KEYS = new Set(["__proto__", "prototype", "constructor"]);
5
+
6
+ export type JsonPrimitive = string | number | boolean | null;
7
+ export type JsonValue = JsonPrimitive | readonly JsonValue[] | JsonObject;
8
+ export interface JsonObject {
9
+ readonly [key: string]: JsonValue;
10
+ }
11
+
12
+ export type AgentMessageRole = "system" | "developer" | "user" | "assistant" | "tool";
13
+ export type AgentContentPart =
14
+ | AgentTextPart
15
+ | AgentDataPart
16
+ | AgentImagePart
17
+ | AgentFilePart
18
+ | AgentToolCallPart
19
+ | AgentToolResultPart;
20
+ export type AgentContentInput = string | AgentContentPart | readonly AgentContentPart[];
21
+
22
+ export interface AgentTextPart {
23
+ readonly kind: "text";
24
+ readonly text: string;
25
+ }
26
+
27
+ export interface AgentDataPart {
28
+ readonly kind: "data";
29
+ readonly value: JsonValue;
30
+ readonly name?: string;
31
+ }
32
+
33
+ export interface AgentImagePart {
34
+ readonly kind: "image";
35
+ readonly uri: string;
36
+ readonly mediaType?: string;
37
+ readonly detail: "auto" | "low" | "high";
38
+ }
39
+
40
+ export interface AgentFilePart {
41
+ readonly kind: "file";
42
+ readonly uri: string;
43
+ readonly mediaType?: string;
44
+ readonly name?: string;
45
+ }
46
+
47
+ export interface AgentToolResultPart {
48
+ readonly kind: "tool-result";
49
+ readonly result: AgentToolResult;
50
+ }
51
+
52
+ /** Provider-neutral assistant tool-call transcript part. */
53
+ export interface AgentToolCallPart {
54
+ readonly kind: "tool-call";
55
+ readonly call: AgentToolCall;
56
+ }
57
+
58
+ export interface AgentMessage {
59
+ readonly role: AgentMessageRole;
60
+ readonly content: readonly AgentContentPart[];
61
+ readonly id?: string;
62
+ readonly name?: string;
63
+ readonly toolCallId?: string;
64
+ readonly createdAtUnixMs?: number;
65
+ readonly metadata: JsonObject;
66
+ }
67
+
68
+ export interface AgentMessageOptions {
69
+ readonly id?: string;
70
+ readonly name?: string;
71
+ readonly toolCallId?: string;
72
+ readonly createdAtUnixMs?: number;
73
+ readonly metadata?: unknown;
74
+ }
75
+
76
+ export interface AgentToolCall {
77
+ readonly id: string;
78
+ readonly name: string;
79
+ readonly input: JsonValue;
80
+ readonly metadata: JsonObject;
81
+ }
82
+
83
+ export interface AgentToolCallOptions {
84
+ readonly id: string;
85
+ readonly name: string;
86
+ readonly input?: unknown;
87
+ readonly metadata?: unknown;
88
+ }
89
+
90
+ export type AgentToolResultStatus = "success" | "error" | "denied";
91
+
92
+ export interface AgentToolError {
93
+ readonly code?: string;
94
+ readonly message: string;
95
+ readonly details?: JsonValue;
96
+ }
97
+
98
+ export interface AgentToolResult {
99
+ readonly callId: string;
100
+ readonly name: string;
101
+ readonly status: AgentToolResultStatus;
102
+ readonly output?: JsonValue;
103
+ readonly error?: AgentToolError;
104
+ readonly durationMs?: number;
105
+ readonly metadata: JsonObject;
106
+ }
107
+
108
+ export interface AgentToolResultOptions {
109
+ readonly callId: string;
110
+ readonly name: string;
111
+ readonly status?: AgentToolResultStatus;
112
+ readonly output?: unknown;
113
+ readonly error?: AgentToolErrorInput;
114
+ readonly durationMs?: number;
115
+ readonly metadata?: unknown;
116
+ }
117
+
118
+ export interface AgentToolErrorInput {
119
+ readonly code?: string;
120
+ readonly message: string;
121
+ readonly details?: unknown;
122
+ }
123
+
124
+ export type AgentSchemaContract =
125
+ | AgentJsonSchemaContract
126
+ | AgentClassSchemaContract;
127
+
128
+ export interface AgentJsonSchemaContract {
129
+ readonly kind: "json-schema";
130
+ readonly name: string;
131
+ readonly schema: JsonObject;
132
+ readonly strict: boolean;
133
+ }
134
+
135
+ export interface AgentClassSchemaContract {
136
+ readonly kind: "class";
137
+ readonly name: string;
138
+ readonly strict: boolean;
139
+ }
140
+
141
+ export type AgentOutputMode = "text" | "json" | "artifact";
142
+
143
+ export interface AgentOutputContract {
144
+ readonly mode: AgentOutputMode;
145
+ readonly description?: string;
146
+ readonly schema?: AgentSchemaContract;
147
+ readonly artifactType?: string;
148
+ }
149
+
150
+ export interface AgentOutputContractOptions {
151
+ readonly mode: AgentOutputMode;
152
+ readonly description?: string;
153
+ readonly schema?: AgentSchemaContract;
154
+ readonly artifactType?: string;
155
+ }
156
+
157
+ export interface AgentToolContract {
158
+ readonly name: string;
159
+ readonly description: string;
160
+ readonly input?: AgentSchemaContract;
161
+ readonly output?: AgentSchemaContract;
162
+ readonly sideEffect: ToolSideEffect;
163
+ readonly approval: ToolApproval;
164
+ readonly timeoutMs?: number;
165
+ }
166
+
167
+ export interface AgentToolContractOptions {
168
+ readonly name: string;
169
+ readonly description: string;
170
+ readonly input?: AgentSchemaContract;
171
+ readonly output?: AgentSchemaContract;
172
+ readonly sideEffect?: ToolSideEffect;
173
+ readonly approval?: ToolApproval;
174
+ readonly timeoutMs?: number;
175
+ }
176
+
177
+ export interface AgentModelCapabilities {
178
+ readonly toolCalling: boolean;
179
+ readonly streaming: boolean;
180
+ readonly structuredOutput: boolean;
181
+ readonly jsonMode: boolean;
182
+ readonly multimodalInput: boolean;
183
+ readonly imageOutput: boolean;
184
+ readonly maxContextTokens?: number;
185
+ readonly maxOutputTokens?: number;
186
+ }
187
+
188
+ export interface AgentModelCapabilitiesOptions {
189
+ readonly toolCalling?: boolean;
190
+ readonly streaming?: boolean;
191
+ readonly structuredOutput?: boolean;
192
+ readonly jsonMode?: boolean;
193
+ readonly multimodalInput?: boolean;
194
+ readonly imageOutput?: boolean;
195
+ readonly maxContextTokens?: number;
196
+ readonly maxOutputTokens?: number;
197
+ }
198
+
199
+ export interface AgentInvocation {
200
+ readonly id: string;
201
+ readonly agentName: string;
202
+ readonly input?: JsonValue;
203
+ readonly messages: readonly AgentMessage[];
204
+ readonly output?: AgentOutputContract;
205
+ readonly createdAtUnixMs?: number;
206
+ readonly metadata: JsonObject;
207
+ }
208
+
209
+ export interface AgentInvocationOptions {
210
+ readonly id: string;
211
+ readonly agentName: string;
212
+ readonly input?: unknown;
213
+ readonly messages?: readonly AgentMessage[];
214
+ readonly output?: AgentOutputContract;
215
+ readonly createdAtUnixMs?: number;
216
+ readonly metadata?: unknown;
217
+ }
218
+
219
+ export interface AgentModelRequest {
220
+ readonly invocationId: string;
221
+ readonly messages: readonly AgentMessage[];
222
+ readonly tools: readonly AgentToolContract[];
223
+ readonly output?: AgentOutputContract;
224
+ readonly capabilities?: AgentModelCapabilities;
225
+ readonly modelProfile?: string;
226
+ readonly model?: string;
227
+ readonly maxOutputTokens?: number;
228
+ readonly temperature?: number;
229
+ readonly metadata: JsonObject;
230
+ }
231
+
232
+ export interface AgentModelRequestOptions {
233
+ readonly invocationId: string;
234
+ readonly messages: readonly AgentMessage[];
235
+ readonly tools?: readonly AgentToolContract[];
236
+ readonly output?: AgentOutputContract;
237
+ readonly capabilities?: AgentModelCapabilities;
238
+ readonly modelProfile?: string;
239
+ readonly model?: string;
240
+ readonly maxOutputTokens?: number;
241
+ readonly temperature?: number;
242
+ readonly metadata?: unknown;
243
+ }
244
+
245
+ export type AgentFinishReason = "stop" | "tool-calls" | "length" | "content-filter" | "error";
246
+
247
+ export interface AgentUsage {
248
+ readonly inputTokens?: number;
249
+ readonly outputTokens?: number;
250
+ readonly totalTokens?: number;
251
+ readonly latencyMs?: number;
252
+ readonly cost?: AgentUsageCost;
253
+ readonly cacheHit?: boolean;
254
+ }
255
+
256
+ export interface AgentUsageCost {
257
+ readonly amount: number;
258
+ readonly currency: string;
259
+ }
260
+
261
+ export interface AgentUsageInput {
262
+ readonly inputTokens?: number;
263
+ readonly outputTokens?: number;
264
+ readonly totalTokens?: number;
265
+ readonly latencyMs?: number;
266
+ readonly cost?: {
267
+ readonly amount: number;
268
+ readonly currency: string;
269
+ };
270
+ readonly cacheHit?: boolean;
271
+ }
272
+
273
+ export interface AgentModelResponse {
274
+ readonly invocationId: string;
275
+ readonly finishReason: AgentFinishReason;
276
+ readonly message?: AgentMessage;
277
+ readonly toolCalls: readonly AgentToolCall[];
278
+ readonly usage?: AgentUsage;
279
+ readonly metadata: JsonObject;
280
+ }
281
+
282
+ export interface AgentModelResponseOptions {
283
+ readonly invocationId: string;
284
+ readonly finishReason: AgentFinishReason;
285
+ readonly message?: AgentMessage;
286
+ readonly toolCalls?: readonly AgentToolCall[];
287
+ readonly usage?: AgentUsageInput;
288
+ readonly metadata?: unknown;
289
+ }
290
+
291
+ export type AgentStreamEvent =
292
+ | AgentMessageDeltaEvent
293
+ | AgentToolCallEvent
294
+ | AgentToolResultEvent
295
+ | AgentUsageEvent
296
+ | AgentDoneEvent
297
+ | AgentErrorEvent;
298
+
299
+ export interface AgentMessageDeltaEvent {
300
+ readonly kind: "message-delta";
301
+ readonly invocationId: string;
302
+ readonly text: string;
303
+ }
304
+
305
+ export interface AgentToolCallEvent {
306
+ readonly kind: "tool-call";
307
+ readonly invocationId: string;
308
+ readonly toolCall: AgentToolCall;
309
+ }
310
+
311
+ export interface AgentToolResultEvent {
312
+ readonly kind: "tool-result";
313
+ readonly invocationId: string;
314
+ readonly toolResult: AgentToolResult;
315
+ }
316
+
317
+ export interface AgentUsageEvent {
318
+ readonly kind: "usage";
319
+ readonly invocationId: string;
320
+ readonly usage: AgentUsage;
321
+ }
322
+
323
+ export interface AgentDoneEvent {
324
+ readonly kind: "done";
325
+ readonly response: AgentModelResponse;
326
+ }
327
+
328
+ export interface AgentErrorEvent {
329
+ readonly kind: "error";
330
+ readonly invocationId: string;
331
+ readonly error: AgentToolError;
332
+ }
333
+
334
+ export function normalizeJsonValue(value: unknown, field = "value"): JsonValue {
335
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
336
+ return value;
337
+ }
338
+ if (typeof value === "number") {
339
+ if (!Number.isFinite(value)) {
340
+ throw new AgentSemanticError(`${field} must be a finite JSON number.`);
341
+ }
342
+ return value;
343
+ }
344
+ if (Array.isArray(value)) {
345
+ const normalized: JsonValue[] = [];
346
+ for (let index = 0; index < value.length; index += 1) {
347
+ normalized.push(normalizeJsonValue(value[index], `${field}[${index}]`));
348
+ }
349
+ return Object.freeze(normalized);
350
+ }
351
+ if (typeof value === "object") {
352
+ const prototype = Object.getPrototypeOf(value);
353
+ if (prototype !== Object.prototype && prototype !== null) {
354
+ throw new AgentSemanticError(`${field} must be a plain JSON object.`);
355
+ }
356
+ const normalized: Record<string, JsonValue> = {};
357
+ for (const [key, item] of Object.entries(value as Record<string, unknown>)) {
358
+ if (FORBIDDEN_JSON_KEYS.has(key)) {
359
+ throw new AgentSemanticError(`${field}.${key} is not an allowed JSON key.`);
360
+ }
361
+ if (item === undefined) {
362
+ throw new AgentSemanticError(`${field}.${key} must not be undefined.`);
363
+ }
364
+ normalized[key] = normalizeJsonValue(item, `${field}.${key}`);
365
+ }
366
+ return Object.freeze(normalized) as JsonObject;
367
+ }
368
+ throw new AgentSemanticError(`${field} must be JSON-serializable.`);
369
+ }
370
+
371
+ export function agentOutput<T = never>(): T {
372
+ throw new AgentSemanticError("agentOutput() is an agent task marker and must not be called directly.");
373
+ }
374
+
375
+ export function agentText(text: string): AgentTextPart {
376
+ const value = requiredContentText(text, "text");
377
+ return Object.freeze({ kind: "text", text: value });
378
+ }
379
+
380
+ export function agentData(value: unknown, options: { readonly name?: string } = {}): AgentDataPart {
381
+ const part: AgentDataPart = {
382
+ kind: "data",
383
+ value: normalizeJsonValue(value, "data"),
384
+ name: optionalName(options.name, "data.name"),
385
+ };
386
+ return freezeWithoutUndefined(part);
387
+ }
388
+
389
+ export function agentImage(
390
+ uri: string,
391
+ options: { readonly mediaType?: string; readonly detail?: "auto" | "low" | "high" } = {},
392
+ ): AgentImagePart {
393
+ const detail = options.detail ?? "auto";
394
+ if (detail !== "auto" && detail !== "low" && detail !== "high") {
395
+ throw new AgentSemanticError("image.detail must be auto, low or high.");
396
+ }
397
+ return freezeWithoutUndefined({
398
+ kind: "image",
399
+ uri: requiredName(uri, "image.uri"),
400
+ mediaType: optionalName(options.mediaType, "image.mediaType"),
401
+ detail,
402
+ });
403
+ }
404
+
405
+ export function agentFile(uri: string, options: { readonly mediaType?: string; readonly name?: string } = {}): AgentFilePart {
406
+ return freezeWithoutUndefined({
407
+ kind: "file",
408
+ uri: requiredName(uri, "file.uri"),
409
+ mediaType: optionalName(options.mediaType, "file.mediaType"),
410
+ name: optionalName(options.name, "file.name"),
411
+ });
412
+ }
413
+
414
+ export function agentToolResultPart(result: AgentToolResult): AgentToolResultPart {
415
+ return Object.freeze({ kind: "tool-result", result: normalizeToolResult(result) });
416
+ }
417
+
418
+ export function agentToolCallPart(call: AgentToolCall): AgentToolCallPart {
419
+ return Object.freeze({ kind: "tool-call", call: agentToolCall(call) });
420
+ }
421
+
422
+ export function agentMessage(role: AgentMessageRole, content: AgentContentInput, options: AgentMessageOptions = {}): AgentMessage {
423
+ if (role !== "system" && role !== "developer" && role !== "user" && role !== "assistant" && role !== "tool") {
424
+ throw new AgentSemanticError("message.role is not supported.");
425
+ }
426
+ const parts = normalizeContent(content);
427
+ if (role === "tool" && options.toolCallId === undefined) {
428
+ throw new AgentSemanticError('tool messages require "toolCallId".');
429
+ }
430
+ if (role !== "tool" && options.toolCallId !== undefined) {
431
+ throw new AgentSemanticError('only tool messages may have "toolCallId".');
432
+ }
433
+ if (role !== "assistant" && parts.some((part) => part.kind === "tool-call")) {
434
+ throw new AgentSemanticError("tool-call content parts require an assistant message.");
435
+ }
436
+ const resultParts = parts.filter((part) => part.kind === "tool-result");
437
+ if (role === "tool") {
438
+ if (parts.length !== 1 || resultParts.length !== 1) {
439
+ throw new AgentSemanticError("tool messages require exactly one tool-result content part.");
440
+ }
441
+ if (resultParts[0]?.result.callId !== options.toolCallId) {
442
+ throw new AgentSemanticError("tool message toolCallId must match its tool-result callId.");
443
+ }
444
+ } else if (resultParts.length > 0) {
445
+ throw new AgentSemanticError("tool-result content parts require a tool message.");
446
+ }
447
+
448
+ return freezeWithoutUndefined({
449
+ role,
450
+ content: parts,
451
+ id: optionalName(options.id, "message.id"),
452
+ name: optionalName(options.name, "message.name"),
453
+ toolCallId: optionalName(options.toolCallId, "message.toolCallId"),
454
+ createdAtUnixMs: optionalNonNegativeInteger(options.createdAtUnixMs, "message.createdAtUnixMs"),
455
+ metadata: normalizeJsonObject(options.metadata ?? {}, "message.metadata"),
456
+ });
457
+ }
458
+
459
+ export function agentToolCall(options: AgentToolCallOptions): AgentToolCall {
460
+ return Object.freeze({
461
+ id: requiredName(options.id, "toolCall.id"),
462
+ name: requiredName(options.name, "toolCall.name"),
463
+ input: normalizeJsonValue(options.input ?? {}, "toolCall.input"),
464
+ metadata: normalizeJsonObject(options.metadata ?? {}, "toolCall.metadata"),
465
+ });
466
+ }
467
+
468
+ export function agentToolResult(options: AgentToolResultOptions): AgentToolResult {
469
+ const status = options.status ?? (options.error ? "error" : "success");
470
+ if (status !== "success" && status !== "error" && status !== "denied") {
471
+ throw new AgentSemanticError("toolResult.status must be success, error or denied.");
472
+ }
473
+ if (status === "success" && options.error !== undefined) {
474
+ throw new AgentSemanticError("successful tool results cannot include error.");
475
+ }
476
+ if (status !== "success" && options.error === undefined) {
477
+ throw new AgentSemanticError("failed or denied tool results require error.");
478
+ }
479
+ if (status !== "success" && options.output !== undefined) {
480
+ throw new AgentSemanticError("failed or denied tool results cannot include output.");
481
+ }
482
+
483
+ return freezeWithoutUndefined({
484
+ callId: requiredName(options.callId, "toolResult.callId"),
485
+ name: requiredName(options.name, "toolResult.name"),
486
+ status,
487
+ output: status === "success" ? normalizeJsonValue(options.output ?? null, "toolResult.output") : undefined,
488
+ error: options.error ? normalizeToolError(options.error, "toolResult.error") : undefined,
489
+ durationMs: optionalNonNegativeInteger(options.durationMs, "toolResult.durationMs"),
490
+ metadata: normalizeJsonObject(options.metadata ?? {}, "toolResult.metadata"),
491
+ });
492
+ }
493
+
494
+ export function agentJsonSchema(name: string, schema: unknown, options: { readonly strict?: boolean } = {}): AgentJsonSchemaContract {
495
+ if (options.strict !== undefined && typeof options.strict !== "boolean") throw new AgentSemanticError("schema.strict must be a boolean.");
496
+ return Object.freeze({
497
+ kind: "json-schema",
498
+ name: requiredName(name, "schema.name"),
499
+ schema: normalizeJsonObject(schema, "schema"),
500
+ strict: options.strict ?? true,
501
+ });
502
+ }
503
+
504
+ export function agentClassSchema(name: string, options: { readonly strict?: boolean } = {}): AgentClassSchemaContract {
505
+ if (options.strict !== undefined && typeof options.strict !== "boolean") throw new AgentSemanticError("schema.strict must be a boolean.");
506
+ return Object.freeze({
507
+ kind: "class",
508
+ name: requiredName(name, "schema.name"),
509
+ strict: options.strict ?? true,
510
+ });
511
+ }
512
+
513
+ export function agentOutputContract(options: AgentOutputContractOptions): AgentOutputContract {
514
+ if (options.mode !== "text" && options.mode !== "json" && options.mode !== "artifact") {
515
+ throw new AgentSemanticError("output.mode must be text, json or artifact.");
516
+ }
517
+ if (options.mode === "artifact" && options.artifactType === undefined) {
518
+ throw new AgentSemanticError("artifact output requires artifactType.");
519
+ }
520
+ return freezeWithoutUndefined({
521
+ mode: options.mode,
522
+ description: optionalContentText(options.description, "output.description"),
523
+ schema: options.schema === undefined ? undefined : normalizeSchemaContract(options.schema),
524
+ artifactType: optionalName(options.artifactType, "output.artifactType"),
525
+ });
526
+ }
527
+
528
+ export function agentToolContract(options: AgentToolContractOptions): AgentToolContract {
529
+ const sideEffect = options.sideEffect ?? "none";
530
+ if (sideEffect !== "none" && sideEffect !== "read" && sideEffect !== "write" && sideEffect !== "external") {
531
+ throw new AgentSemanticError("tool.sideEffect must be none, read, write or external.");
532
+ }
533
+ const approval = options.approval ?? (sideEffect === "write" || sideEffect === "external" ? "required" : "policy");
534
+ if (approval !== "never" && approval !== "policy" && approval !== "required") {
535
+ throw new AgentSemanticError("tool.approval must be never, policy or required.");
536
+ }
537
+ if ((sideEffect === "write" || sideEffect === "external") && approval === "never") {
538
+ throw new AgentSemanticError('write/external tools cannot use approval: "never".');
539
+ }
540
+ return freezeWithoutUndefined({
541
+ name: requiredName(options.name, "tool.name"),
542
+ description: requiredContentText(options.description, "tool.description"),
543
+ input: options.input === undefined ? undefined : normalizeSchemaContract(options.input),
544
+ output: options.output === undefined ? undefined : normalizeSchemaContract(options.output),
545
+ sideEffect,
546
+ approval,
547
+ timeoutMs: optionalPositiveInteger(options.timeoutMs, "tool.timeoutMs"),
548
+ });
549
+ }
550
+
551
+ export function agentModelCapabilities(options: AgentModelCapabilitiesOptions = {}): AgentModelCapabilities {
552
+ for (const name of ["toolCalling", "streaming", "structuredOutput", "jsonMode", "multimodalInput", "imageOutput"] as const) {
553
+ const value = options[name];
554
+ if (value !== undefined && typeof value !== "boolean") throw new AgentSemanticError(`capabilities.${name} must be a boolean.`);
555
+ }
556
+ return freezeWithoutUndefined({
557
+ toolCalling: options.toolCalling ?? false,
558
+ streaming: options.streaming ?? false,
559
+ structuredOutput: options.structuredOutput ?? false,
560
+ jsonMode: options.jsonMode ?? false,
561
+ multimodalInput: options.multimodalInput ?? false,
562
+ imageOutput: options.imageOutput ?? false,
563
+ maxContextTokens: optionalPositiveInteger(options.maxContextTokens, "capabilities.maxContextTokens"),
564
+ maxOutputTokens: optionalPositiveInteger(options.maxOutputTokens, "capabilities.maxOutputTokens"),
565
+ });
566
+ }
567
+
568
+ export function agentInvocation(options: AgentInvocationOptions): AgentInvocation {
569
+ return freezeWithoutUndefined({
570
+ id: requiredName(options.id, "invocation.id"),
571
+ agentName: requiredName(options.agentName, "invocation.agentName"),
572
+ input: options.input === undefined ? undefined : normalizeJsonValue(options.input, "invocation.input"),
573
+ messages: freezeMessageList(options.messages ?? [], "invocation.messages"),
574
+ output: options.output === undefined ? undefined : normalizeOutputContract(options.output),
575
+ createdAtUnixMs: optionalNonNegativeInteger(options.createdAtUnixMs, "invocation.createdAtUnixMs"),
576
+ metadata: normalizeJsonObject(options.metadata ?? {}, "invocation.metadata"),
577
+ });
578
+ }
579
+
580
+ export function agentModelRequest(options: AgentModelRequestOptions): AgentModelRequest {
581
+ const messages = freezeMessageList(options.messages, "modelRequest.messages");
582
+ if (messages.length === 0) {
583
+ throw new AgentSemanticError("modelRequest.messages must not be empty.");
584
+ }
585
+ validateCompleteToolTranscript(messages);
586
+ return freezeWithoutUndefined({
587
+ invocationId: requiredName(options.invocationId, "modelRequest.invocationId"),
588
+ messages,
589
+ tools: freezeToolContracts(options.tools ?? []),
590
+ output: options.output === undefined ? undefined : normalizeOutputContract(options.output),
591
+ capabilities: options.capabilities === undefined ? undefined : agentModelCapabilities(options.capabilities),
592
+ modelProfile: optionalName(options.modelProfile, "modelRequest.modelProfile"),
593
+ model: optionalName(options.model, "modelRequest.model"),
594
+ maxOutputTokens: optionalPositiveInteger(options.maxOutputTokens, "modelRequest.maxOutputTokens"),
595
+ temperature: optionalProbability(options.temperature, "modelRequest.temperature"),
596
+ metadata: normalizeJsonObject(options.metadata ?? {}, "modelRequest.metadata"),
597
+ });
598
+ }
599
+
600
+ export function agentModelResponse(options: AgentModelResponseOptions): AgentModelResponse {
601
+ const toolCalls = freezeToolCalls(options.toolCalls ?? []);
602
+ if (options.finishReason === "tool-calls" && toolCalls.length === 0) {
603
+ throw new AgentSemanticError('finishReason "tool-calls" requires at least one tool call.');
604
+ }
605
+ if (options.message === undefined && toolCalls.length === 0) {
606
+ throw new AgentSemanticError("modelResponse requires a message or at least one tool call.");
607
+ }
608
+ const message = options.message === undefined ? undefined : agentMessage(
609
+ options.message.role,
610
+ options.message.content,
611
+ { id: options.message.id, name: options.message.name, toolCallId: options.message.toolCallId, createdAtUnixMs: options.message.createdAtUnixMs, metadata: options.message.metadata },
612
+ );
613
+ if (message !== undefined) {
614
+ if (message.role !== "assistant") {
615
+ throw new AgentSemanticError("modelResponse.message must have assistant role.");
616
+ }
617
+ if (message.content.some((part) => part.kind === "tool-call")) {
618
+ throw new AgentSemanticError("modelResponse tool calls belong in modelResponse.toolCalls, not message content.");
619
+ }
620
+ }
621
+ return freezeWithoutUndefined({
622
+ invocationId: requiredName(options.invocationId, "modelResponse.invocationId"),
623
+ finishReason: normalizeFinishReason(options.finishReason),
624
+ message,
625
+ toolCalls,
626
+ usage: options.usage ? normalizeUsage(options.usage) : undefined,
627
+ metadata: normalizeJsonObject(options.metadata ?? {}, "modelResponse.metadata"),
628
+ });
629
+ }
630
+
631
+ function normalizeContent(content: AgentContentInput): readonly AgentContentPart[] {
632
+ if (typeof content === "string") {
633
+ return Object.freeze([agentText(content)]);
634
+ }
635
+ if (isContentPartArray(content)) {
636
+ if (content.length === 0) {
637
+ throw new AgentSemanticError("message.content must not be empty.");
638
+ }
639
+ return Object.freeze(content.map((part, index) => normalizeContentPart(part, `message.content[${index}]`)));
640
+ }
641
+ return Object.freeze([normalizeContentPart(content, "message.content")]);
642
+ }
643
+
644
+ function isContentPartArray(content: AgentContentInput): content is readonly AgentContentPart[] {
645
+ return Array.isArray(content);
646
+ }
647
+
648
+ function normalizeContentPart(part: AgentContentPart, field: string): AgentContentPart {
649
+ if (!part || typeof part !== "object") {
650
+ throw new AgentSemanticError(`${field} must be a content part.`);
651
+ }
652
+ switch (part.kind) {
653
+ case "text":
654
+ return agentText(part.text);
655
+ case "data":
656
+ return agentData(part.value, { name: part.name });
657
+ case "image":
658
+ return agentImage(part.uri, { mediaType: part.mediaType, detail: part.detail });
659
+ case "file":
660
+ return agentFile(part.uri, { mediaType: part.mediaType, name: part.name });
661
+ case "tool-result":
662
+ return agentToolResultPart(part.result);
663
+ case "tool-call":
664
+ return agentToolCallPart(part.call);
665
+ default:
666
+ throw new AgentSemanticError(`${field} has unsupported content kind.`);
667
+ }
668
+ }
669
+
670
+ function normalizeToolResult(result: AgentToolResult): AgentToolResult {
671
+ return agentToolResult({
672
+ callId: result.callId,
673
+ name: result.name,
674
+ status: result.status,
675
+ output: result.output,
676
+ error: result.error,
677
+ durationMs: result.durationMs,
678
+ metadata: result.metadata,
679
+ });
680
+ }
681
+
682
+ function normalizeToolError(error: AgentToolErrorInput, field: string): AgentToolError {
683
+ return freezeWithoutUndefined({
684
+ code: optionalName(error.code, `${field}.code`),
685
+ message: requiredContentText(error.message, `${field}.message`),
686
+ details: error.details === undefined ? undefined : normalizeJsonValue(error.details, `${field}.details`),
687
+ });
688
+ }
689
+
690
+ function normalizeSchemaContract(schema: AgentSchemaContract): AgentSchemaContract {
691
+ if (!schema || typeof schema !== "object") throw new AgentSemanticError("schema must be a schema contract.");
692
+ if (schema.kind === "json-schema") return agentJsonSchema(schema.name, schema.schema, { strict: schema.strict });
693
+ if (schema.kind === "class") return agentClassSchema(schema.name, { strict: schema.strict });
694
+ throw new AgentSemanticError("schema.kind must be json-schema or class.");
695
+ }
696
+
697
+ function normalizeOutputContract(output: AgentOutputContract): AgentOutputContract {
698
+ return agentOutputContract({ mode: output.mode, description: output.description, schema: output.schema, artifactType: output.artifactType });
699
+ }
700
+
701
+ function normalizeJsonObject(value: unknown, field: string): JsonObject {
702
+ const normalized = normalizeJsonValue(value, field);
703
+ if (normalized === null || typeof normalized !== "object" || Array.isArray(normalized)) {
704
+ throw new AgentSemanticError(`${field} must be a JSON object.`);
705
+ }
706
+ return normalized as JsonObject;
707
+ }
708
+
709
+ function normalizeUsage(usage: AgentUsageInput): AgentUsage {
710
+ if (usage.cacheHit !== undefined && typeof usage.cacheHit !== "boolean") throw new AgentSemanticError("usage.cacheHit must be a boolean.");
711
+ return freezeWithoutUndefined({
712
+ inputTokens: optionalNonNegativeInteger(usage.inputTokens, "usage.inputTokens"),
713
+ outputTokens: optionalNonNegativeInteger(usage.outputTokens, "usage.outputTokens"),
714
+ totalTokens: optionalNonNegativeInteger(usage.totalTokens, "usage.totalTokens"),
715
+ latencyMs: optionalNonNegativeInteger(usage.latencyMs, "usage.latencyMs"),
716
+ cost: usage.cost
717
+ ? Object.freeze({
718
+ amount: optionalNonNegativeNumber(usage.cost.amount, "usage.cost.amount") as number,
719
+ currency: requiredName(usage.cost.currency, "usage.cost.currency"),
720
+ })
721
+ : undefined,
722
+ cacheHit: usage.cacheHit,
723
+ });
724
+ }
725
+
726
+ function normalizeFinishReason(reason: AgentFinishReason): AgentFinishReason {
727
+ if (
728
+ reason !== "stop" &&
729
+ reason !== "tool-calls" &&
730
+ reason !== "length" &&
731
+ reason !== "content-filter" &&
732
+ reason !== "error"
733
+ ) {
734
+ throw new AgentSemanticError("finishReason is not supported.");
735
+ }
736
+ return reason;
737
+ }
738
+
739
+ function freezeMessageList(messages: readonly AgentMessage[], field: string): readonly AgentMessage[] {
740
+ const normalized: AgentMessage[] = [];
741
+ for (let index = 0; index < messages.length; index += 1) {
742
+ const message = messages[index] as AgentMessage;
743
+ if (!message || typeof message !== "object") {
744
+ throw new AgentSemanticError(`${field}[${index}] must be an agent message.`);
745
+ }
746
+ normalized.push(agentMessage(message.role, message.content, {
747
+ id: message.id,
748
+ name: message.name,
749
+ toolCallId: message.toolCallId,
750
+ createdAtUnixMs: message.createdAtUnixMs,
751
+ metadata: message.metadata,
752
+ }));
753
+ }
754
+ return Object.freeze(normalized);
755
+ }
756
+
757
+ function freezeToolCalls(toolCalls: readonly AgentToolCall[]): readonly AgentToolCall[] {
758
+ const normalized: AgentToolCall[] = [];
759
+ const ids = new Set<string>();
760
+ for (let index = 0; index < toolCalls.length; index += 1) {
761
+ const toolCall = toolCalls[index] as AgentToolCall;
762
+ const call = agentToolCall(toolCall);
763
+ if (ids.has(call.id)) {
764
+ throw new AgentSemanticError(`modelResponse.toolCalls contains duplicate id "${call.id}".`);
765
+ }
766
+ ids.add(call.id);
767
+ normalized.push(call);
768
+ }
769
+ return Object.freeze(normalized);
770
+ }
771
+
772
+ function validateCompleteToolTranscript(messages: readonly AgentMessage[]): void {
773
+ const pending = new Map<string, string>();
774
+ const seen = new Set<string>();
775
+ for (const message of messages) {
776
+ if (pending.size > 0 && message.role !== "tool") {
777
+ throw new AgentSemanticError(
778
+ "modelRequest.messages must place every tool result immediately after its assistant tool-call message.",
779
+ );
780
+ }
781
+ if (message.role === "assistant") {
782
+ for (const part of message.content) {
783
+ if (part.kind !== "tool-call") continue;
784
+ if (seen.has(part.call.id)) {
785
+ throw new AgentSemanticError(`modelRequest.messages contains duplicate tool call id "${part.call.id}".`);
786
+ }
787
+ seen.add(part.call.id);
788
+ pending.set(part.call.id, part.call.name);
789
+ }
790
+ continue;
791
+ }
792
+ if (message.role === "tool") {
793
+ const id = message.toolCallId as string;
794
+ const expectedName = pending.get(id);
795
+ if (expectedName === undefined) {
796
+ throw new AgentSemanticError(`modelRequest.messages contains orphan tool result "${id}".`);
797
+ }
798
+ const result = message.content[0]?.kind === "tool-result" ? message.content[0].result : undefined;
799
+ if (result?.name !== expectedName) {
800
+ throw new AgentSemanticError(
801
+ `modelRequest.messages tool result "${id}" names "${result?.name ?? "<missing>"}" instead of "${expectedName}".`,
802
+ );
803
+ }
804
+ pending.delete(id);
805
+ }
806
+ }
807
+ if (pending.size > 0) {
808
+ throw new AgentSemanticError("modelRequest.messages contains tool calls without results.");
809
+ }
810
+ }
811
+
812
+ function freezeToolContracts(tools: readonly AgentToolContract[]): readonly AgentToolContract[] {
813
+ const normalized: AgentToolContract[] = [];
814
+ for (let index = 0; index < tools.length; index += 1) {
815
+ const tool = tools[index] as AgentToolContract;
816
+ normalized.push(agentToolContract(tool));
817
+ }
818
+ return Object.freeze(normalized);
819
+ }
820
+
821
+ function requiredName(value: string, field: string): string {
822
+ if (typeof value !== "string") {
823
+ throw new AgentSemanticError(`${field} must be a string.`);
824
+ }
825
+ const trimmed = value.trim();
826
+ if (trimmed.length === 0) {
827
+ throw new AgentSemanticError(`${field} must be a non-empty string.`);
828
+ }
829
+ return trimmed;
830
+ }
831
+
832
+ function optionalName(value: string | undefined, field: string): string | undefined {
833
+ if (value === undefined) {
834
+ return undefined;
835
+ }
836
+ return requiredName(value, field);
837
+ }
838
+
839
+ function requiredContentText(value: string, field: string): string {
840
+ if (typeof value !== "string") {
841
+ throw new AgentSemanticError(`${field} must be a string.`);
842
+ }
843
+ if (value.trim().length === 0) {
844
+ throw new AgentSemanticError(`${field} must be a non-empty string.`);
845
+ }
846
+ return value;
847
+ }
848
+
849
+ function optionalContentText(value: string | undefined, field: string): string | undefined {
850
+ if (value === undefined) {
851
+ return undefined;
852
+ }
853
+ return requiredContentText(value, field);
854
+ }
855
+
856
+ function optionalPositiveInteger(value: number | undefined, field: string): number | undefined {
857
+ if (value === undefined) {
858
+ return undefined;
859
+ }
860
+ if (!Number.isInteger(value) || value <= 0) {
861
+ throw new AgentSemanticError(`${field} must be a positive integer.`);
862
+ }
863
+ return value;
864
+ }
865
+
866
+ function optionalNonNegativeInteger(value: number | undefined, field: string): number | undefined {
867
+ if (value === undefined) {
868
+ return undefined;
869
+ }
870
+ if (!Number.isInteger(value) || value < 0) {
871
+ throw new AgentSemanticError(`${field} must be a non-negative integer.`);
872
+ }
873
+ return value;
874
+ }
875
+
876
+ function optionalNonNegativeNumber(value: number | undefined, field: string): number | undefined {
877
+ if (value === undefined) {
878
+ return undefined;
879
+ }
880
+ if (!Number.isFinite(value) || value < 0) {
881
+ throw new AgentSemanticError(`${field} must be a non-negative number.`);
882
+ }
883
+ return value;
884
+ }
885
+
886
+ function optionalProbability(value: number | undefined, field: string): number | undefined {
887
+ if (value === undefined) {
888
+ return undefined;
889
+ }
890
+ if (!Number.isFinite(value) || value < 0 || value > 2) {
891
+ throw new AgentSemanticError(`${field} must be a number between 0 and 2.`);
892
+ }
893
+ return value;
894
+ }
895
+
896
+ function freezeWithoutUndefined<T extends object>(value: T): Readonly<T> {
897
+ for (const key of Object.keys(value) as (keyof T)[]) {
898
+ if (value[key] === undefined) {
899
+ delete value[key];
900
+ }
901
+ }
902
+ return Object.freeze(value);
903
+ }