effect 4.0.3 → 4.0.5

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 (449) hide show
  1. package/AGENTS.md +24 -0
  2. package/CLAUDE.md +24 -0
  3. package/ai-docs/package.json +2 -2
  4. package/ai-docs/src/52_graphql/10_basics.ts +117 -0
  5. package/ai-docs/src/52_graphql/20_testing.ts +45 -0
  6. package/ai-docs/src/52_graphql/30_batching.ts +118 -0
  7. package/ai-docs/src/52_graphql/40_aliased-batching.ts +124 -0
  8. package/ai-docs/src/52_graphql/50_errors-and-retries.ts +74 -0
  9. package/ai-docs/src/52_graphql/index.md +6 -0
  10. package/dist/Array.d.ts +90 -6
  11. package/dist/Array.d.ts.map +1 -1
  12. package/dist/Array.js +4 -2
  13. package/dist/Array.js.map +1 -1
  14. package/dist/Channel.d.ts +6 -1
  15. package/dist/Channel.d.ts.map +1 -1
  16. package/dist/Channel.js +17 -3
  17. package/dist/Channel.js.map +1 -1
  18. package/dist/ConfigProvider.d.ts.map +1 -1
  19. package/dist/ConfigProvider.js +33 -32
  20. package/dist/ConfigProvider.js.map +1 -1
  21. package/dist/Context.d.ts.map +1 -1
  22. package/dist/Context.js +9 -0
  23. package/dist/Context.js.map +1 -1
  24. package/dist/Duration.d.ts.map +1 -1
  25. package/dist/Duration.js +2 -5
  26. package/dist/Duration.js.map +1 -1
  27. package/dist/Effect.d.ts +61 -19
  28. package/dist/Effect.d.ts.map +1 -1
  29. package/dist/Effect.js +58 -39
  30. package/dist/Effect.js.map +1 -1
  31. package/dist/FileSystem.d.ts +23 -9
  32. package/dist/FileSystem.d.ts.map +1 -1
  33. package/dist/FileSystem.js.map +1 -1
  34. package/dist/Match.d.ts +20 -6
  35. package/dist/Match.d.ts.map +1 -1
  36. package/dist/Match.js +2 -2
  37. package/dist/Match.js.map +1 -1
  38. package/dist/Path.d.ts +37 -5
  39. package/dist/Path.d.ts.map +1 -1
  40. package/dist/Path.js +36 -5
  41. package/dist/Path.js.map +1 -1
  42. package/dist/RequestResolver.d.ts.map +1 -1
  43. package/dist/RequestResolver.js +4 -10
  44. package/dist/RequestResolver.js.map +1 -1
  45. package/dist/Scheduler.d.ts +9 -0
  46. package/dist/Scheduler.d.ts.map +1 -1
  47. package/dist/Scheduler.js +9 -0
  48. package/dist/Scheduler.js.map +1 -1
  49. package/dist/Schema.d.ts +15 -2
  50. package/dist/Schema.d.ts.map +1 -1
  51. package/dist/Schema.js +16 -2
  52. package/dist/Schema.js.map +1 -1
  53. package/dist/SchemaGetter.d.ts +4 -0
  54. package/dist/SchemaGetter.d.ts.map +1 -1
  55. package/dist/SchemaGetter.js +52 -33
  56. package/dist/SchemaGetter.js.map +1 -1
  57. package/dist/Sink.d.ts.map +1 -1
  58. package/dist/Sink.js +38 -17
  59. package/dist/Sink.js.map +1 -1
  60. package/dist/Stream.d.ts +11 -0
  61. package/dist/Stream.d.ts.map +1 -1
  62. package/dist/Stream.js +16 -1
  63. package/dist/Stream.js.map +1 -1
  64. package/dist/String.d.ts +12 -0
  65. package/dist/String.d.ts.map +1 -1
  66. package/dist/String.js +17 -4
  67. package/dist/String.js.map +1 -1
  68. package/dist/TxRef.d.ts.map +1 -1
  69. package/dist/TxRef.js +3 -2
  70. package/dist/TxRef.js.map +1 -1
  71. package/dist/Utils.js +8 -3
  72. package/dist/Utils.js.map +1 -1
  73. package/dist/ai/AiError.d.ts +10 -10
  74. package/dist/ai/AiError.d.ts.map +1 -1
  75. package/dist/ai/AiError.js +1 -1
  76. package/dist/ai/AiError.js.map +1 -1
  77. package/dist/ai/AnthropicStructuredOutput.js +0 -2
  78. package/dist/ai/AnthropicStructuredOutput.js.map +1 -1
  79. package/dist/ai/Chat.d.ts +2 -2
  80. package/dist/ai/Chat.d.ts.map +1 -1
  81. package/dist/ai/Decision.d.ts +70 -19
  82. package/dist/ai/Decision.d.ts.map +1 -1
  83. package/dist/ai/Decision.js +37 -3
  84. package/dist/ai/Decision.js.map +1 -1
  85. package/dist/ai/DecisionModel.js +1 -1
  86. package/dist/ai/DecisionModel.js.map +1 -1
  87. package/dist/ai/LanguageModel.d.ts +38 -7
  88. package/dist/ai/LanguageModel.d.ts.map +1 -1
  89. package/dist/ai/LanguageModel.js +70 -40
  90. package/dist/ai/LanguageModel.js.map +1 -1
  91. package/dist/ai/McpServer.d.ts +61 -52
  92. package/dist/ai/McpServer.d.ts.map +1 -1
  93. package/dist/ai/McpServer.js +134 -50
  94. package/dist/ai/McpServer.js.map +1 -1
  95. package/dist/ai/Prompt.d.ts.map +1 -1
  96. package/dist/ai/Prompt.js +28 -5
  97. package/dist/ai/Prompt.js.map +1 -1
  98. package/dist/ai/Response.d.ts +5 -4
  99. package/dist/ai/Response.d.ts.map +1 -1
  100. package/dist/ai/Response.js.map +1 -1
  101. package/dist/cli/Completions.d.ts +5 -0
  102. package/dist/cli/Completions.d.ts.map +1 -1
  103. package/dist/cli/Completions.js.map +1 -1
  104. package/dist/cli/Flag.d.ts +100 -0
  105. package/dist/cli/Flag.d.ts.map +1 -1
  106. package/dist/cli/Flag.js +33 -0
  107. package/dist/cli/Flag.js.map +1 -1
  108. package/dist/cli/Param.d.ts +87 -0
  109. package/dist/cli/Param.d.ts.map +1 -1
  110. package/dist/cli/Param.js +30 -0
  111. package/dist/cli/Param.js.map +1 -1
  112. package/dist/cli/internal/command.d.ts.map +1 -1
  113. package/dist/cli/internal/command.js +2 -1
  114. package/dist/cli/internal/command.js.map +1 -1
  115. package/dist/cli/internal/completions/bash.js +4 -3
  116. package/dist/cli/internal/completions/bash.js.map +1 -1
  117. package/dist/cli/internal/completions/descriptor.js +8 -1
  118. package/dist/cli/internal/completions/descriptor.js.map +1 -1
  119. package/dist/cli/internal/completions/fish.js +4 -4
  120. package/dist/cli/internal/completions/fish.js.map +1 -1
  121. package/dist/cli/internal/completions/powershell.js +3 -2
  122. package/dist/cli/internal/completions/powershell.js.map +1 -1
  123. package/dist/cli/internal/completions/zsh.js +7 -3
  124. package/dist/cli/internal/completions/zsh.js.map +1 -1
  125. package/dist/cli/internal/parser.js +11 -3
  126. package/dist/cli/internal/parser.js.map +1 -1
  127. package/dist/cli/internal/wizard.d.ts.map +1 -1
  128. package/dist/cli/internal/wizard.js +2 -1
  129. package/dist/cli/internal/wizard.js.map +1 -1
  130. package/dist/cluster/ClusterWorkflowEngine.d.ts +1 -0
  131. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  132. package/dist/cluster/ClusterWorkflowEngine.js +113 -21
  133. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  134. package/dist/cluster/MessageStorage.d.ts.map +1 -1
  135. package/dist/cluster/MessageStorage.js +20 -12
  136. package/dist/cluster/MessageStorage.js.map +1 -1
  137. package/dist/cluster/Runners.d.ts.map +1 -1
  138. package/dist/cluster/Runners.js +54 -34
  139. package/dist/cluster/Runners.js.map +1 -1
  140. package/dist/cluster/Sharding.d.ts.map +1 -1
  141. package/dist/cluster/Sharding.js +6 -4
  142. package/dist/cluster/Sharding.js.map +1 -1
  143. package/dist/cluster/internal/entityManager.js +1 -1
  144. package/dist/cluster/internal/entityManager.js.map +1 -1
  145. package/dist/encoding/Sse.d.ts +6 -0
  146. package/dist/encoding/Sse.d.ts.map +1 -1
  147. package/dist/encoding/Sse.js +63 -71
  148. package/dist/encoding/Sse.js.map +1 -1
  149. package/dist/graphql/GraphQL.d.ts +349 -0
  150. package/dist/graphql/GraphQL.d.ts.map +1 -0
  151. package/dist/graphql/GraphQL.js +207 -0
  152. package/dist/graphql/GraphQL.js.map +1 -0
  153. package/dist/graphql/GraphQLClient.d.ts +562 -0
  154. package/dist/graphql/GraphQLClient.d.ts.map +1 -0
  155. package/dist/graphql/GraphQLClient.js +505 -0
  156. package/dist/graphql/GraphQLClient.js.map +1 -0
  157. package/dist/graphql/GraphQLClientError.d.ts +445 -0
  158. package/dist/graphql/GraphQLClientError.d.ts.map +1 -0
  159. package/dist/graphql/GraphQLClientError.js +479 -0
  160. package/dist/graphql/GraphQLClientError.js.map +1 -0
  161. package/dist/graphql/GraphQLGroup.d.ts +118 -0
  162. package/dist/graphql/GraphQLGroup.d.ts.map +1 -0
  163. package/dist/graphql/GraphQLGroup.js +109 -0
  164. package/dist/graphql/GraphQLGroup.js.map +1 -0
  165. package/dist/graphql/GraphQLMiddleware.d.ts +249 -0
  166. package/dist/graphql/GraphQLMiddleware.d.ts.map +1 -0
  167. package/dist/graphql/GraphQLMiddleware.js +130 -0
  168. package/dist/graphql/GraphQLMiddleware.js.map +1 -0
  169. package/dist/graphql/GraphQLProtocol.d.ts +969 -0
  170. package/dist/graphql/GraphQLProtocol.d.ts.map +1 -0
  171. package/dist/graphql/GraphQLProtocol.js +809 -0
  172. package/dist/graphql/GraphQLProtocol.js.map +1 -0
  173. package/dist/graphql/GraphQLResolver.d.ts +453 -0
  174. package/dist/graphql/GraphQLResolver.d.ts.map +1 -0
  175. package/dist/graphql/GraphQLResolver.js +582 -0
  176. package/dist/graphql/GraphQLResolver.js.map +1 -0
  177. package/dist/graphql/index.d.ts +40 -0
  178. package/dist/graphql/index.d.ts.map +1 -0
  179. package/dist/graphql/index.js +41 -0
  180. package/dist/graphql/index.js.map +1 -0
  181. package/dist/http/FetchHttpClient.d.ts +6 -3
  182. package/dist/http/FetchHttpClient.d.ts.map +1 -1
  183. package/dist/http/FetchHttpClient.js +6 -3
  184. package/dist/http/FetchHttpClient.js.map +1 -1
  185. package/dist/http/FindMyWay/internal/router.js +2 -1
  186. package/dist/http/FindMyWay/internal/router.js.map +1 -1
  187. package/dist/http/Headers.d.ts +3 -3
  188. package/dist/http/Headers.d.ts.map +1 -1
  189. package/dist/http/Headers.js +6 -5
  190. package/dist/http/Headers.js.map +1 -1
  191. package/dist/http/HttpClient.d.ts +27 -0
  192. package/dist/http/HttpClient.d.ts.map +1 -1
  193. package/dist/http/HttpClient.js +38 -11
  194. package/dist/http/HttpClient.js.map +1 -1
  195. package/dist/http/HttpClientError.d.ts.map +1 -1
  196. package/dist/http/HttpClientError.js +8 -6
  197. package/dist/http/HttpClientError.js.map +1 -1
  198. package/dist/http/HttpClientRequest.d.ts +147 -4
  199. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  200. package/dist/http/HttpClientRequest.js +47 -1
  201. package/dist/http/HttpClientRequest.js.map +1 -1
  202. package/dist/http/HttpEffect.d.ts.map +1 -1
  203. package/dist/http/HttpEffect.js +14 -7
  204. package/dist/http/HttpEffect.js.map +1 -1
  205. package/dist/http/HttpMiddleware.d.ts +60 -0
  206. package/dist/http/HttpMiddleware.d.ts.map +1 -1
  207. package/dist/http/HttpMiddleware.js +93 -32
  208. package/dist/http/HttpMiddleware.js.map +1 -1
  209. package/dist/http/HttpRouter.d.ts +35 -0
  210. package/dist/http/HttpRouter.d.ts.map +1 -1
  211. package/dist/http/HttpRouter.js +87 -13
  212. package/dist/http/HttpRouter.js.map +1 -1
  213. package/dist/http/HttpServerError.d.ts.map +1 -1
  214. package/dist/http/HttpServerError.js +6 -4
  215. package/dist/http/HttpServerError.js.map +1 -1
  216. package/dist/http/HttpServerRequest.js +2 -2
  217. package/dist/http/HttpServerRequest.js.map +1 -1
  218. package/dist/http/HttpServerResponse.d.ts +8 -6
  219. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  220. package/dist/http/HttpServerResponse.js +27 -16
  221. package/dist/http/HttpServerResponse.js.map +1 -1
  222. package/dist/http/HttpStaticServer.d.ts.map +1 -1
  223. package/dist/http/HttpStaticServer.js +4 -10
  224. package/dist/http/HttpStaticServer.js.map +1 -1
  225. package/dist/http/HttpTraceContext.js +1 -1
  226. package/dist/http/HttpTraceContext.js.map +1 -1
  227. package/dist/http/Multipart.d.ts.map +1 -1
  228. package/dist/http/Multipart.js +15 -1
  229. package/dist/http/Multipart.js.map +1 -1
  230. package/dist/http/Url.d.ts.map +1 -1
  231. package/dist/http/Url.js +2 -1
  232. package/dist/http/Url.js.map +1 -1
  233. package/dist/http/UrlParams.d.ts +112 -8
  234. package/dist/http/UrlParams.d.ts.map +1 -1
  235. package/dist/http/UrlParams.js +141 -14
  236. package/dist/http/UrlParams.js.map +1 -1
  237. package/dist/http/internal/compression.d.ts +1 -1
  238. package/dist/http/internal/compression.d.ts.map +1 -1
  239. package/dist/http/internal/compression.js +2 -10
  240. package/dist/http/internal/compression.js.map +1 -1
  241. package/dist/http/internal/compressionBody.d.ts +2 -0
  242. package/dist/http/internal/compressionBody.d.ts.map +1 -0
  243. package/dist/http/internal/compressionBody.js +36 -0
  244. package/dist/http/internal/compressionBody.js.map +1 -0
  245. package/dist/http/internal/decompression.d.ts +2 -0
  246. package/dist/http/internal/decompression.d.ts.map +1 -0
  247. package/dist/http/internal/decompression.js +162 -0
  248. package/dist/http/internal/decompression.js.map +1 -0
  249. package/dist/http/internal/tracing.js +14 -4
  250. package/dist/http/internal/tracing.js.map +1 -1
  251. package/dist/http/internal/urlParams.d.ts +2 -0
  252. package/dist/http/internal/urlParams.d.ts.map +1 -0
  253. package/dist/http/internal/urlParams.js +4 -0
  254. package/dist/http/internal/urlParams.js.map +1 -0
  255. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  256. package/dist/http-api/HttpApiClient.js +2 -1
  257. package/dist/http-api/HttpApiClient.js.map +1 -1
  258. package/dist/http-api/HttpApiScalar.d.ts +5 -0
  259. package/dist/http-api/HttpApiScalar.d.ts.map +1 -1
  260. package/dist/http-api/HttpApiScalar.js.map +1 -1
  261. package/dist/internal/core.js +17 -1
  262. package/dist/internal/core.js.map +1 -1
  263. package/dist/internal/dateTime.js +40 -35
  264. package/dist/internal/dateTime.js.map +1 -1
  265. package/dist/internal/effect.js +13 -6
  266. package/dist/internal/effect.js.map +1 -1
  267. package/dist/internal/graphql.d.ts +2 -0
  268. package/dist/internal/graphql.d.ts.map +1 -0
  269. package/dist/internal/graphql.js +205 -0
  270. package/dist/internal/graphql.js.map +1 -0
  271. package/dist/internal/graphqlHeaders.d.ts +4 -0
  272. package/dist/internal/graphqlHeaders.d.ts.map +1 -0
  273. package/dist/internal/graphqlHeaders.js +11 -0
  274. package/dist/internal/graphqlHeaders.js.map +1 -0
  275. package/dist/internal/request.js +20 -1
  276. package/dist/internal/request.js.map +1 -1
  277. package/dist/internal/schema/toCodeDocument.js +4 -1
  278. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  279. package/dist/internal/schema/toJsonSchemaDocument.js +29 -5
  280. package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
  281. package/dist/internal/version.js +1 -1
  282. package/dist/net/Host.d.ts +49 -0
  283. package/dist/net/Host.d.ts.map +1 -1
  284. package/dist/net/Host.js +55 -0
  285. package/dist/net/Host.js.map +1 -1
  286. package/dist/net/NetAddress.d.ts +8 -0
  287. package/dist/net/NetAddress.d.ts.map +1 -1
  288. package/dist/net/NetAddress.js +8 -0
  289. package/dist/net/NetAddress.js.map +1 -1
  290. package/dist/observability/Otlp.d.ts +15 -0
  291. package/dist/observability/Otlp.d.ts.map +1 -1
  292. package/dist/observability/Otlp.js +3 -0
  293. package/dist/observability/Otlp.js.map +1 -1
  294. package/dist/observability/OtlpExporter.d.ts +8 -0
  295. package/dist/observability/OtlpExporter.d.ts.map +1 -1
  296. package/dist/observability/OtlpExporter.js +10 -1
  297. package/dist/observability/OtlpExporter.js.map +1 -1
  298. package/dist/observability/OtlpLogger.d.ts +17 -0
  299. package/dist/observability/OtlpLogger.d.ts.map +1 -1
  300. package/dist/observability/OtlpLogger.js +14 -1
  301. package/dist/observability/OtlpLogger.js.map +1 -1
  302. package/dist/observability/OtlpMetrics.d.ts +17 -0
  303. package/dist/observability/OtlpMetrics.d.ts.map +1 -1
  304. package/dist/observability/OtlpMetrics.js +13 -0
  305. package/dist/observability/OtlpMetrics.js.map +1 -1
  306. package/dist/observability/OtlpTracer.d.ts +17 -0
  307. package/dist/observability/OtlpTracer.d.ts.map +1 -1
  308. package/dist/observability/OtlpTracer.js +15 -2
  309. package/dist/observability/OtlpTracer.js.map +1 -1
  310. package/dist/reactivity/AsyncResult.d.ts +6 -0
  311. package/dist/reactivity/AsyncResult.d.ts.map +1 -1
  312. package/dist/reactivity/AsyncResult.js +27 -0
  313. package/dist/reactivity/AsyncResult.js.map +1 -1
  314. package/dist/reactivity/AtomRegistry.js +3 -1
  315. package/dist/reactivity/AtomRegistry.js.map +1 -1
  316. package/dist/rpc/RpcClient.d.ts.map +1 -1
  317. package/dist/rpc/RpcClient.js +6 -1
  318. package/dist/rpc/RpcClient.js.map +1 -1
  319. package/dist/rpc/RpcServer.d.ts.map +1 -1
  320. package/dist/rpc/RpcServer.js +36 -9
  321. package/dist/rpc/RpcServer.js.map +1 -1
  322. package/dist/socket/Socket.d.ts +6 -0
  323. package/dist/socket/Socket.d.ts.map +1 -1
  324. package/dist/socket/Socket.js.map +1 -1
  325. package/dist/sql/SqlClient.d.ts +8 -7
  326. package/dist/sql/SqlClient.d.ts.map +1 -1
  327. package/dist/sql/SqlClient.js +8 -7
  328. package/dist/sql/SqlClient.js.map +1 -1
  329. package/dist/testing/TestClock.d.ts +16 -3
  330. package/dist/testing/TestClock.d.ts.map +1 -1
  331. package/dist/testing/TestClock.js +112 -22
  332. package/dist/testing/TestClock.js.map +1 -1
  333. package/dist/workflow/Activity.js +1 -0
  334. package/dist/workflow/Activity.js.map +1 -1
  335. package/dist/workflow/DurableDeferred.d.ts.map +1 -1
  336. package/dist/workflow/DurableDeferred.js +32 -3
  337. package/dist/workflow/DurableDeferred.js.map +1 -1
  338. package/dist/workflow/Workflow.d.ts +22 -0
  339. package/dist/workflow/Workflow.d.ts.map +1 -1
  340. package/dist/workflow/Workflow.js +15 -3
  341. package/dist/workflow/Workflow.js.map +1 -1
  342. package/dist/workflow/WorkflowEngine.d.ts +44 -3
  343. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  344. package/dist/workflow/WorkflowEngine.js +45 -22
  345. package/dist/workflow/WorkflowEngine.js.map +1 -1
  346. package/package.json +6 -3
  347. package/src/Array.ts +95 -6
  348. package/src/Channel.ts +24 -3
  349. package/src/ConfigProvider.ts +40 -44
  350. package/src/Context.ts +9 -0
  351. package/src/Duration.ts +4 -5
  352. package/src/Effect.ts +140 -53
  353. package/src/FileSystem.ts +23 -9
  354. package/src/Match.ts +65 -12
  355. package/src/Path.ts +52 -7
  356. package/src/RequestResolver.ts +4 -10
  357. package/src/Scheduler.ts +9 -0
  358. package/src/Schema.ts +25 -4
  359. package/src/SchemaGetter.ts +47 -35
  360. package/src/Sink.ts +45 -18
  361. package/src/Stream.ts +33 -4
  362. package/src/String.ts +17 -4
  363. package/src/TxRef.ts +4 -2
  364. package/src/Utils.ts +8 -5
  365. package/src/ai/AiError.ts +3 -1
  366. package/src/ai/AnthropicStructuredOutput.ts +2 -2
  367. package/src/ai/Chat.ts +2 -2
  368. package/src/ai/Decision.ts +70 -21
  369. package/src/ai/DecisionModel.ts +1 -1
  370. package/src/ai/LanguageModel.ts +141 -63
  371. package/src/ai/McpServer.ts +259 -145
  372. package/src/ai/Prompt.ts +24 -10
  373. package/src/ai/Response.ts +6 -3
  374. package/src/cli/Completions.ts +5 -0
  375. package/src/cli/Flag.ts +101 -0
  376. package/src/cli/Param.ts +96 -0
  377. package/src/cli/internal/command.ts +2 -1
  378. package/src/cli/internal/completions/bash.ts +4 -3
  379. package/src/cli/internal/completions/descriptor.ts +10 -1
  380. package/src/cli/internal/completions/fish.ts +4 -4
  381. package/src/cli/internal/completions/powershell.ts +5 -2
  382. package/src/cli/internal/completions/zsh.ts +7 -3
  383. package/src/cli/internal/parser.ts +12 -3
  384. package/src/cli/internal/wizard.ts +2 -1
  385. package/src/cluster/ClusterWorkflowEngine.ts +143 -36
  386. package/src/cluster/MessageStorage.ts +14 -3
  387. package/src/cluster/Runners.ts +88 -66
  388. package/src/cluster/Sharding.ts +12 -9
  389. package/src/cluster/internal/entityManager.ts +1 -1
  390. package/src/encoding/Sse.ts +70 -80
  391. package/src/graphql/GraphQL.ts +494 -0
  392. package/src/graphql/GraphQLClient.ts +924 -0
  393. package/src/graphql/GraphQLClientError.ts +542 -0
  394. package/src/graphql/GraphQLGroup.ts +167 -0
  395. package/src/graphql/GraphQLMiddleware.ts +253 -0
  396. package/src/graphql/GraphQLProtocol.ts +1540 -0
  397. package/src/graphql/GraphQLResolver.ts +1038 -0
  398. package/src/graphql/index.ts +48 -0
  399. package/src/http/FetchHttpClient.ts +6 -3
  400. package/src/http/FindMyWay/internal/router.ts +2 -1
  401. package/src/http/Headers.ts +6 -9
  402. package/src/http/HttpClient.ts +72 -11
  403. package/src/http/HttpClientError.ts +10 -6
  404. package/src/http/HttpClientRequest.ts +173 -7
  405. package/src/http/HttpEffect.ts +11 -5
  406. package/src/http/HttpMiddleware.ts +113 -34
  407. package/src/http/HttpRouter.ts +95 -13
  408. package/src/http/HttpServerError.ts +8 -4
  409. package/src/http/HttpServerRequest.ts +2 -2
  410. package/src/http/HttpServerResponse.ts +28 -16
  411. package/src/http/HttpStaticServer.ts +4 -10
  412. package/src/http/HttpTraceContext.ts +1 -1
  413. package/src/http/Multipart.ts +17 -1
  414. package/src/http/Url.ts +2 -1
  415. package/src/http/UrlParams.ts +225 -26
  416. package/src/http/internal/compression.ts +3 -17
  417. package/src/http/internal/compressionBody.ts +56 -0
  418. package/src/http/internal/decompression.ts +226 -0
  419. package/src/http/internal/tracing.ts +21 -4
  420. package/src/http/internal/urlParams.ts +5 -0
  421. package/src/http-api/HttpApiClient.ts +2 -1
  422. package/src/http-api/HttpApiScalar.ts +5 -0
  423. package/src/internal/core.ts +21 -1
  424. package/src/internal/dateTime.ts +13 -10
  425. package/src/internal/effect.ts +13 -7
  426. package/src/internal/graphql.ts +286 -0
  427. package/src/internal/graphqlHeaders.ts +11 -0
  428. package/src/internal/request.ts +31 -3
  429. package/src/internal/schema/toCodeDocument.ts +7 -1
  430. package/src/internal/schema/toJsonSchemaDocument.ts +34 -2
  431. package/src/internal/version.ts +1 -1
  432. package/src/net/Host.ts +72 -0
  433. package/src/net/NetAddress.ts +9 -0
  434. package/src/observability/Otlp.ts +18 -0
  435. package/src/observability/OtlpExporter.ts +14 -3
  436. package/src/observability/OtlpLogger.ts +31 -2
  437. package/src/observability/OtlpMetrics.ts +30 -1
  438. package/src/observability/OtlpTracer.ts +32 -3
  439. package/src/reactivity/AsyncResult.ts +31 -0
  440. package/src/reactivity/AtomRegistry.ts +3 -1
  441. package/src/rpc/RpcClient.ts +6 -1
  442. package/src/rpc/RpcServer.ts +55 -15
  443. package/src/socket/Socket.ts +6 -0
  444. package/src/sql/SqlClient.ts +9 -7
  445. package/src/testing/TestClock.ts +144 -29
  446. package/src/workflow/Activity.ts +1 -0
  447. package/src/workflow/DurableDeferred.ts +43 -5
  448. package/src/workflow/Workflow.ts +31 -5
  449. package/src/workflow/WorkflowEngine.ts +107 -25
@@ -122,7 +122,7 @@ export interface LanguageModel {
122
122
  <Options extends NoExcessProperties<GenerateTextOptionsWithoutToolkit, Options>>(
123
123
  options: Options & GenerateTextOptionsWithoutToolkit
124
124
  ): Effect.Effect<
125
- GenerateTextResponse<{}>,
125
+ GenerateTextResponse<{}, ExtractToolParametersModeWithoutToolkit<Options>>,
126
126
  ExtractError<Options>,
127
127
  ExtractServices<Options>
128
128
  >
@@ -181,7 +181,7 @@ export interface LanguageModel {
181
181
  <Options extends NoExcessProperties<GenerateTextOptionsWithoutToolkit, Options>>(
182
182
  options: Options & GenerateTextOptionsWithoutToolkit
183
183
  ): Stream.Stream<
184
- Response.StreamPart<{}>,
184
+ Response.StreamPart<{}, ExtractToolParametersModeWithoutToolkit<Options>>,
185
185
  ExtractError<Options>,
186
186
  ExtractServices<Options>
187
187
  >
@@ -312,6 +312,22 @@ export interface GenerateTextOptions<Tools extends Record<string, Tool.Any>> {
312
312
  * resolver execution yourself.
313
313
  */
314
314
  readonly disableToolCallResolution?: boolean | undefined
315
+
316
+ /**
317
+ * Controls tool call validation when `disableToolCallResolution` is `true`.
318
+ * Defaults to `"strict"`, which validates tool names and encoded parameters.
319
+ *
320
+ * **Details**
321
+ *
322
+ * `"deferred"` returns model-generated calls with `unknown` parameters for
323
+ * the caller to validate, including undeclared names and calls without a
324
+ * toolkit. Provider-executed calls and other response parts remain validated.
325
+ * Providers must support this option to return undeclared tool calls.
326
+ *
327
+ * Has no effect when resolution is enabled; `Toolkit` validates parameters
328
+ * according to each tool's `failureMode`.
329
+ */
330
+ readonly toolCallValidation?: "strict" | "deferred" | undefined
315
331
  }
316
332
 
317
333
  type GenerateTextOptionsWithoutToolkit = Omit<GenerateTextOptions<{}>, "toolkit"> & {
@@ -589,18 +605,32 @@ export type ExtractTools<Options> = Options extends {
589
605
  : {}
590
606
 
591
607
  /**
592
- * Resolves to `"encoded"` when tool call resolution is
593
- * disabled, otherwise `"opaque"`.
608
+ * Resolves to `"deferred"` when tool call resolution may be disabled with
609
+ * deferred tool call validation. Otherwise resolves to `"encoded"` when tool
610
+ * call resolution is disabled and `"opaque"` when it may be enabled.
594
611
  *
595
612
  * @stability unstable
596
613
  * @category utility types
597
614
  * @since 4.0.0
598
615
  */
599
- export type ExtractToolParametersMode<Options> = Options extends {
600
- readonly disableToolCallResolution: true
601
- } ? "encoded"
616
+ export type ExtractToolParametersMode<Options> = "deferred" extends Options["toolCallValidation" & keyof Options] ?
617
+ true extends Options["disableToolCallResolution" & keyof Options] ? "deferred" : "opaque"
618
+ : Options extends { readonly disableToolCallResolution: true } ? "encoded"
602
619
  : "opaque"
603
620
 
621
+ /**
622
+ * Resolves the tool parameters mode for requests without a toolkit:
623
+ * `"deferred"` when tool call validation may be deferred, otherwise
624
+ * `"decoded"`.
625
+ *
626
+ * @stability unstable
627
+ * @category utility types
628
+ * @since 4.0.4
629
+ */
630
+ export type ExtractToolParametersModeWithoutToolkit<Options> = "deferred" extends ExtractToolParametersMode<Options>
631
+ ? "deferred"
632
+ : "decoded"
633
+
604
634
  type ExtractErrorFromToolkitOption<ToolkitValue, DisableToolCallResolution extends boolean> = ToolkitValue extends
605
635
  Toolkit.WithHandler<infer Tools> ?
606
636
  | AiError.AiError
@@ -785,6 +815,12 @@ export interface ProviderOptions {
785
815
  * prompt after the provider rejected the incremental request.
786
816
  */
787
817
  readonly incrementalFallback?: boolean | undefined
818
+
819
+ /**
820
+ * Defaults to `"strict"`. With `"deferred"`, return calls to tools absent
821
+ * from `tools` with unchanged parameters instead of `ToolNotFoundError`.
822
+ */
823
+ readonly toolCallValidation?: "strict" | "deferred" | undefined
788
824
  }
789
825
 
790
826
  /**
@@ -857,13 +893,20 @@ export const make: (params: {
857
893
  Effect.map(Option.getOrElse(() => defaultIdGenerator))
858
894
  )
859
895
 
896
+ const contentDecoderFor = makeResponseDecoder((toolkit, deferred) =>
897
+ Schema.decodeEffect(Schema.mutable(Schema.Array(withUndeclaredToolCalls(Response.Part(toolkit), deferred))))
898
+ )
899
+ const streamDecoderFor = makeResponseDecoder((toolkit, deferred) =>
900
+ Schema.decodeEffect(Schema.NonEmptyArray(withUndeclaredToolCalls(Response.StreamPart(toolkit), deferred)))
901
+ )
902
+
860
903
  const generateText = <
861
904
  Options extends NoExcessProperties<GenerateTextOptions<any>, Options>,
862
905
  Tools extends Record<string, Tool.Any> = {}
863
906
  >(
864
907
  options: Options & GenerateTextOptions<Tools>
865
908
  ): Effect.Effect<
866
- GenerateTextResponse<Tools>,
909
+ GenerateTextResponse<Tools, Response.ToolParametersMode>,
867
910
  ExtractError<Options>,
868
911
  ExtractServices<Options>
869
912
  > =>
@@ -1071,6 +1114,10 @@ export const make: (params: {
1071
1114
  const toolChoice = options.toolChoice ?? "auto"
1072
1115
  const concurrency = options.concurrency ?? "unbounded"
1073
1116
  annotateRequestOptions(providerOptions, toolChoice, concurrency)
1117
+ const deferToolCallValidation = isToolCallValidationDeferred(options)
1118
+ if (deferToolCallValidation) {
1119
+ providerOptions.toolCallValidation = "deferred"
1120
+ }
1074
1121
 
1075
1122
  const generateWithNonIncrementalFallback = () => {
1076
1123
  const requestOptions: ProviderOptions = {
@@ -1092,10 +1139,8 @@ export const make: (params: {
1092
1139
  }
1093
1140
 
1094
1141
  // Check for pending approvals that need resolution
1095
- const { approved, denied } = collectToolApprovals(
1096
- providerOptions.prompt.content,
1097
- { excludeResolved: true }
1098
- )
1142
+ const { approved: allResolved, denied: allDenied, pendingApproved: approved, pendingDenied: denied } =
1143
+ collectToolApprovals(providerOptions.prompt.content)
1099
1144
  const hasPendingApprovals = approved.length > 0 || denied.length > 0
1100
1145
 
1101
1146
  // If there is no toolkit, the generated content can be returned immediately
@@ -1120,7 +1165,7 @@ export const make: (params: {
1120
1165
  }
1121
1166
  }
1122
1167
  const ResponseSchema = Schema.mutable(
1123
- Schema.Array(Response.Part(Toolkit.empty))
1168
+ Schema.Array(withUndeclaredToolCalls(Response.Part(Toolkit.empty), deferToolCallValidation))
1124
1169
  )
1125
1170
  const rawContent = yield* generateWithNonIncrementalFallback()
1126
1171
  const content = yield* Schema.decodeEffect(ResponseSchema)(rawContent)
@@ -1158,7 +1203,7 @@ export const make: (params: {
1158
1203
  }
1159
1204
  }
1160
1205
  const ResponseSchema = Schema.mutable(
1161
- Schema.Array(Response.Part(Toolkit.empty))
1206
+ Schema.Array(withUndeclaredToolCalls(Response.Part(Toolkit.empty), deferToolCallValidation))
1162
1207
  )
1163
1208
  const rawContent = yield* generateWithNonIncrementalFallback()
1164
1209
  const content = yield* Schema.decodeEffect(ResponseSchema)(rawContent)
@@ -1205,17 +1250,12 @@ export const make: (params: {
1205
1250
 
1206
1251
  // Strip all resolved approval artifacts (both current and from previous
1207
1252
  // rounds) in a single pass before sending to the provider.
1208
- {
1209
- const { approved: allResolved, denied: allDenied } = collectToolApprovals(
1210
- providerOptions.prompt.content
1253
+ if (allResolved.length > 0 || allDenied.length > 0) {
1254
+ providerOptions.prompt = stripResolvedApprovals(
1255
+ providerOptions.prompt,
1256
+ allResolved,
1257
+ allDenied
1211
1258
  )
1212
- if (allResolved.length > 0 || allDenied.length > 0) {
1213
- providerOptions.prompt = stripResolvedApprovals(
1214
- providerOptions.prompt,
1215
- allResolved,
1216
- allDenied
1217
- )
1218
- }
1219
1259
  }
1220
1260
 
1221
1261
  const tools = typeof toolChoice === "object" && "oneOf" in toolChoice
@@ -1232,17 +1272,20 @@ export const make: (params: {
1232
1272
  }
1233
1273
  }
1234
1274
 
1235
- const ResponseSchema = Schema.mutable(Schema.Array(Response.Part(
1236
- options.disableToolCallResolution === true
1237
- ? makeToolkitWithEncodedParameters(toolkit)
1238
- : makeToolkitWithOpaqueParameters(toolkit)
1239
- )))
1275
+ const decodeContent = contentDecoderFor(
1276
+ toolkit,
1277
+ options.disableToolCallResolution === true && !deferToolCallValidation,
1278
+ deferToolCallValidation
1279
+ )
1240
1280
 
1241
1281
  // If tool call resolution is disabled, return the response without
1242
1282
  // resolving the tool calls that were generated
1243
1283
  if (options.disableToolCallResolution === true) {
1244
1284
  const rawContent = yield* generateWithNonIncrementalFallback()
1245
- const content = yield* Schema.decodeEffect(ResponseSchema)(rawContent)
1285
+ const content = yield* decodeContent(rawContent)
1286
+ if (deferToolCallValidation) {
1287
+ yield* validateProviderExecutedToolCalls(makeToolkitWithEncodedParameters(toolkit), rawContent)
1288
+ }
1246
1289
  if (tracker) {
1247
1290
  const responseMetadata = content.find((part) => part.type === "response-metadata")
1248
1291
  if (Predicate.isNotUndefined(responseMetadata) && Predicate.isNotUndefined(responseMetadata.id)) {
@@ -1255,7 +1298,7 @@ export const make: (params: {
1255
1298
  const rawContent = yield* generateWithNonIncrementalFallback()
1256
1299
 
1257
1300
  // Validate before running tool handlers.
1258
- const content = yield* Schema.decodeEffect(ResponseSchema)(rawContent)
1301
+ const content = yield* decodeContent(rawContent)
1259
1302
  yield* validateProviderExecutedToolCalls(toolkit, rawContent)
1260
1303
 
1261
1304
  // Resolve the generated tool calls. When the finish reason indicates an
@@ -1324,6 +1367,10 @@ export const make: (params: {
1324
1367
  const toolChoice = options.toolChoice ?? "auto"
1325
1368
  const concurrency = options.concurrency ?? "unbounded"
1326
1369
  annotateRequestOptions(providerOptions, toolChoice, concurrency)
1370
+ const deferToolCallValidation = isToolCallValidationDeferred(options)
1371
+ if (deferToolCallValidation) {
1372
+ providerOptions.toolCallValidation = "deferred"
1373
+ }
1327
1374
 
1328
1375
  const streamWithNonIncrementalFallback = () => {
1329
1376
  const requestOptions: ProviderOptions = {
@@ -1357,9 +1404,9 @@ export const make: (params: {
1357
1404
  }
1358
1405
 
1359
1406
  // Check for pending approvals that need resolution
1360
- const { approved: pendingApproved, denied: pendingDenied } = collectToolApprovals(providerOptions.prompt.content, {
1361
- excludeResolved: true
1362
- })
1407
+ const { approved: allResolved, denied: allDenied, pendingApproved, pendingDenied } = collectToolApprovals(
1408
+ providerOptions.prompt.content
1409
+ )
1363
1410
  const hasPendingApprovals = pendingApproved.length > 0 || pendingDenied.length > 0
1364
1411
 
1365
1412
  // If there is no toolkit, return immediately
@@ -1383,7 +1430,9 @@ export const make: (params: {
1383
1430
  providerOptions.incrementalPrompt = prepared.value.prompt
1384
1431
  }
1385
1432
  }
1386
- const schema = Schema.NonEmptyArray(Response.StreamPart(Toolkit.empty))
1433
+ const schema = Schema.NonEmptyArray(
1434
+ withUndeclaredToolCalls(Response.StreamPart(Toolkit.empty), deferToolCallValidation)
1435
+ )
1387
1436
  const decodeParts = Schema.decodeEffect(schema)
1388
1437
  return pipe(
1389
1438
  streamWithNonIncrementalFallback(),
@@ -1432,7 +1481,9 @@ export const make: (params: {
1432
1481
  providerOptions.incrementalPrompt = prepared.value.prompt
1433
1482
  }
1434
1483
  }
1435
- const schema = Schema.NonEmptyArray(Response.StreamPart(Toolkit.empty))
1484
+ const schema = Schema.NonEmptyArray(
1485
+ withUndeclaredToolCalls(Response.StreamPart(Toolkit.empty), deferToolCallValidation)
1486
+ )
1436
1487
  const decodeParts = Schema.decodeEffect(schema)
1437
1488
  return pipe(
1438
1489
  streamWithNonIncrementalFallback(),
@@ -1510,9 +1561,6 @@ export const make: (params: {
1510
1561
 
1511
1562
  // Strip all resolved approval artifacts (both current and from previous
1512
1563
  // rounds) in a single pass before sending to the provider.
1513
- const { approved: allResolved, denied: allDenied } = collectToolApprovals(
1514
- providerOptions.prompt.content
1515
- )
1516
1564
  if (allResolved.length > 0 || allDenied.length > 0) {
1517
1565
  providerOptions.prompt = stripResolvedApprovals(
1518
1566
  providerOptions.prompt,
@@ -1535,19 +1583,22 @@ export const make: (params: {
1535
1583
  }
1536
1584
  }
1537
1585
 
1538
- const ResponseSchema = Schema.NonEmptyArray(Response.StreamPart(
1539
- options.disableToolCallResolution === true
1540
- ? makeToolkitWithEncodedParameters(toolkit)
1541
- : makeToolkitWithOpaqueParameters(toolkit)
1542
- ))
1543
- const decodeParts = Schema.decodeEffect(ResponseSchema)
1586
+ const decodeParts = streamDecoderFor(
1587
+ toolkit,
1588
+ options.disableToolCallResolution === true && !deferToolCallValidation,
1589
+ deferToolCallValidation
1590
+ )
1544
1591
 
1545
1592
  // If tool call resolution is disabled, return the response without
1546
1593
  // resolving the tool calls that were generated
1547
1594
  if (options.disableToolCallResolution === true) {
1595
+ const encodedToolkit = deferToolCallValidation ? makeToolkitWithEncodedParameters(toolkit) : undefined
1548
1596
  return streamWithNonIncrementalFallback().pipe(
1549
1597
  Stream.mapArrayEffect((parts) =>
1550
1598
  decodeParts(parts).pipe(
1599
+ encodedToolkit
1600
+ ? Effect.tap(() => validateProviderExecutedToolCalls(encodedToolkit, parts))
1601
+ : identity,
1551
1602
  tracker ?
1552
1603
  Effect.tap((decodedParts) => {
1553
1604
  for (const part of decodedParts) {
@@ -1577,8 +1628,7 @@ export const make: (params: {
1577
1628
  const deferredFinishParts: Array<Response.StreamPart<Tools>> = []
1578
1629
 
1579
1630
  // Emit pre-resolved tool results so Chat.streamText persists them to
1580
- // history. This ensures collectToolApprovals({ excludeResolved }) can
1581
- // find the corresponding tool-results on future rounds.
1631
+ // history, where collectToolApprovals finds them on future rounds.
1582
1632
  if (preResolvedStreamParts.length > 0) {
1583
1633
  yield* Queue.offerAll(queue, preResolvedStreamParts)
1584
1634
  }
@@ -1812,7 +1862,7 @@ export const generateText: {
1812
1862
  >(
1813
1863
  options: Options & GenerateTextOptionsWithoutToolkit
1814
1864
  ): Effect.Effect<
1815
- GenerateTextResponse<{}>,
1865
+ GenerateTextResponse<{}, ExtractToolParametersModeWithoutToolkit<Options>>,
1816
1866
  ExtractError<Options>,
1817
1867
  LanguageModel | ExtractServices<Options>
1818
1868
  >
@@ -1962,7 +2012,7 @@ export const streamText: {
1962
2012
  >(
1963
2013
  options: Options & GenerateTextOptionsWithoutToolkit
1964
2014
  ): Stream.Stream<
1965
- Response.StreamPart<{}>,
2015
+ Response.StreamPart<{}, ExtractToolParametersModeWithoutToolkit<Options>>,
1966
2016
  ExtractError<Options>,
1967
2017
  ExtractServices<Options> | LanguageModel
1968
2018
  >
@@ -2011,16 +2061,13 @@ interface ApprovalResult {
2011
2061
  readonly toolCall?: Prompt.ToolCallPart | undefined
2012
2062
  }
2013
2063
 
2014
- interface CollectToolApprovalsOptions {
2015
- readonly excludeResolved?: boolean
2016
- }
2017
-
2018
2064
  const collectToolApprovals = (
2019
- messages: ReadonlyArray<Prompt.Message>,
2020
- options?: CollectToolApprovalsOptions
2065
+ messages: ReadonlyArray<Prompt.Message>
2021
2066
  ): {
2022
2067
  readonly approved: Array<ApprovalResult>
2023
2068
  readonly denied: Array<ApprovalResult>
2069
+ readonly pendingApproved: Array<ApprovalResult>
2070
+ readonly pendingDenied: Array<ApprovalResult>
2024
2071
  } => {
2025
2072
  const requests = new Map<
2026
2073
  string,
@@ -2063,15 +2110,12 @@ const collectToolApprovals = (
2063
2110
 
2064
2111
  const approved: Array<ApprovalResult> = []
2065
2112
  const denied: Array<ApprovalResult> = []
2113
+ const pendingApproved: Array<ApprovalResult> = []
2114
+ const pendingDenied: Array<ApprovalResult> = []
2066
2115
 
2067
2116
  for (const response of responses) {
2068
2117
  const request = requests.get(response.approvalId)
2069
2118
  if (Predicate.isNotUndefined(request)) {
2070
- // Skip if already resolved
2071
- if (options?.excludeResolved && toolResultIds.has(request.toolCallId)) {
2072
- continue
2073
- }
2074
-
2075
2119
  const result: ApprovalResult = {
2076
2120
  ...response,
2077
2121
  toolCallId: request.toolCallId,
@@ -2080,13 +2124,15 @@ const collectToolApprovals = (
2080
2124
 
2081
2125
  if (response.approved) {
2082
2126
  approved.push(result)
2127
+ if (!toolResultIds.has(request.toolCallId)) pendingApproved.push(result)
2083
2128
  } else {
2084
2129
  denied.push(result)
2130
+ if (!toolResultIds.has(request.toolCallId)) pendingDenied.push(result)
2085
2131
  }
2086
2132
  }
2087
2133
  }
2088
2134
 
2089
- return { approved, denied }
2135
+ return { approved, denied, pendingApproved, pendingDenied }
2090
2136
  }
2091
2137
 
2092
2138
  /**
@@ -2415,6 +2461,27 @@ const resolveToolCalls = <Tools extends Record<string, Tool.Any>>(
2415
2461
  // Utilities
2416
2462
  // =============================================================================
2417
2463
 
2464
+ // Cache one decoder per model and response kind, keyed by validation mode
2465
+ // and tool names and schema identities in insertion order.
2466
+ const makeResponseDecoder = <Decode>(make: (toolkit: Toolkit.Any, deferred: boolean) => Decode) => {
2467
+ let cached: { readonly key: ReadonlyArray<unknown>; readonly decode: Decode } | undefined
2468
+ return (toolkit: Toolkit.WithHandler<any>, encoded: boolean, deferred: boolean): Decode => {
2469
+ const key: Array<unknown> = [encoded, deferred]
2470
+ for (const tool of Object.values(toolkit.tools as Record<string, Tool.Any>)) {
2471
+ key.push(tool.name, tool.parametersSchema, tool.successSchema, tool.failureSchema)
2472
+ }
2473
+ if (cached !== undefined && cached.key.length === key.length && cached.key.every((part, i) => part === key[i])) {
2474
+ return cached.decode
2475
+ }
2476
+ const decode = make(
2477
+ encoded ? makeToolkitWithEncodedParameters(toolkit) : makeToolkitWithOpaqueParameters(toolkit),
2478
+ deferred
2479
+ )
2480
+ cached = { key, decode }
2481
+ return decode
2482
+ }
2483
+ }
2484
+
2418
2485
  // Stable parameter-mode copies let Response reuse each tool's part schemas.
2419
2486
  const parameterModeTools = new WeakMap<Tool.Any, { encoded?: Tool.Any; opaque?: Tool.Any }>()
2420
2487
 
@@ -2443,9 +2510,20 @@ const makeToolkitWithOpaqueParameters = <Tools extends Record<string, Tool.Any>>
2443
2510
  ...Object.values(toolkit.tools).map((tool) => withParameterMode(tool, "opaque"))
2444
2511
  )
2445
2512
 
2513
+ const isToolCallValidationDeferred = (options: GenerateTextOptions<any>): boolean =>
2514
+ options.disableToolCallResolution === true && options.toolCallValidation === "deferred"
2515
+
2516
+ const UndeclaredToolCallPart = Response.ToolCallPart("", Schema.Unknown).mapFields((fields) => ({
2517
+ ...fields,
2518
+ name: Schema.String
2519
+ }))
2520
+
2521
+ const withUndeclaredToolCalls = <S extends Schema.Top>(partSchema: S, deferToolCallValidation: boolean): S =>
2522
+ deferToolCallValidation ? Schema.Union([partSchema, UndeclaredToolCallPart]) as any : partSchema
2523
+
2446
2524
  // Provider-executed tools bypass Toolkit, so validate their parameters here.
2447
- const validateProviderExecutedToolCalls = <Tools extends Record<string, Tool.Any>>(
2448
- toolkit: Toolkit.WithHandler<Tools>,
2525
+ const validateProviderExecutedToolCalls = (
2526
+ toolkit: { readonly tools: Record<string, Tool.Any> },
2449
2527
  parts: ReadonlyArray<Response.PartEncoded | Response.StreamPartEncoded>
2450
2528
  ): Effect.Effect<void, Schema.SchemaError> =>
2451
2529
  Effect.forEach(