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
@@ -12,6 +12,7 @@
12
12
  */
13
13
  import * as Cause from "../Cause.ts"
14
14
  import * as Context from "../Context.ts"
15
+ import * as Deferred from "../Deferred.ts"
15
16
  import * as Effect from "../Effect.ts"
16
17
  import * as Exit from "../Exit.ts"
17
18
  import * as Fiber from "../Fiber.ts"
@@ -75,6 +76,17 @@ export class WorkflowEngine extends Context.Service<
75
76
 
76
77
  /**
77
78
  * Execute a registered workflow.
79
+ *
80
+ * **Details**
81
+ *
82
+ * Unless `discard` is set, a caller outside any workflow waits for the
83
+ * result. While the execution is suspended, the caller retries on
84
+ * `suspendedRetrySchedule`; engines that observe the final result wake it
85
+ * sooner. `ClusterWorkflowEngine` does so only for callers on the runner
86
+ * that owns the execution.
87
+ *
88
+ * `detached: true` requires `discard: true` and skips parent completion
89
+ * wakes and interruption linkage. Otherwise, it is a defect.
78
90
  */
79
91
  readonly execute: <
80
92
  Name extends string,
@@ -88,6 +100,7 @@ export class WorkflowEngine extends Context.Service<
88
100
  readonly executionId: string
89
101
  readonly payload: Payload["Type"]
90
102
  readonly discard?: Discard | undefined
103
+ readonly detached?: boolean | undefined
91
104
  readonly suspendedRetrySchedule?:
92
105
  | Schedule.Schedule<any, unknown>
93
106
  | undefined
@@ -271,8 +284,17 @@ export class WorkflowInstance extends Context.Service<
271
284
  */
272
285
  cause: Cause.Cause<never> | undefined
273
286
 
274
- /** Deferred names this run parked on; their completions preempt the run. */
275
- readonly awaitedDeferreds: Set<string>
287
+ /**
288
+ * Whether this workflow or an activity hit `SuspendOnFailure`, excluding
289
+ * inherited child failures.
290
+ */
291
+ failed: boolean
292
+
293
+ /**
294
+ * Deferred names this run waits on, counted per live wait; their
295
+ * completions preempt the run.
296
+ */
297
+ readonly awaitedDeferreds: Map<string, number>
276
298
 
277
299
  /** Deferred names this run completed itself; their completions need not wake it. */
278
300
  readonly completedDeferreds: Set<string>
@@ -286,17 +308,26 @@ export class WorkflowInstance extends Context.Service<
286
308
  static initial(
287
309
  workflow: Workflow.Any,
288
310
  executionId: string,
289
- scope = Scope.makeUnsafe()
311
+ options?: {
312
+ readonly scope?: Scope.Closeable | undefined
313
+ /**
314
+ * Awaited deferred names shared with the run this instance belongs to.
315
+ * An activity instance registers its durable waits there so the run
316
+ * can be woken once it suspends, without those waits preempting it.
317
+ */
318
+ readonly awaitedDeferreds?: Map<string, number> | undefined
319
+ }
290
320
  ): WorkflowInstance["Service"] {
291
321
  return WorkflowInstance.of({
292
322
  executionId,
293
323
  workflow,
294
- scope,
324
+ scope: options?.scope ?? Scope.makeUnsafe(),
295
325
  suspended: false,
296
326
  interrupted: false,
297
327
  abandoned: false,
298
328
  cause: undefined,
299
- awaitedDeferreds: new Set(),
329
+ failed: false,
330
+ awaitedDeferreds: options?.awaitedDeferreds ?? new Map(),
300
331
  completedDeferreds: new Set(),
301
332
  activityState: {
302
333
  count: 0,
@@ -394,6 +425,8 @@ export interface Encoded {
394
425
  readonly payload: object
395
426
  readonly discard: Discard
396
427
  readonly parent?: WorkflowInstance["Service"] | undefined
428
+ /** Skip parent completion wakes and interruption linkage. */
429
+ readonly detached?: boolean | undefined
397
430
  }
398
431
  ) => Effect.Effect<
399
432
  Discard extends true ? void : Workflow.Result<unknown, unknown>
@@ -414,6 +447,22 @@ export interface Encoded {
414
447
  workflow: Workflow.Any,
415
448
  executionId: string
416
449
  ) => Effect.Effect<void>
450
+
451
+ /**
452
+ * Waits until a suspended execution has a result other than `Suspended`.
453
+ *
454
+ * **Gotchas**
455
+ *
456
+ * External callers race this with their `suspendedRetrySchedule`, so it may
457
+ * never complete when the engine cannot observe the result. Completing while
458
+ * the execution is still suspended skips the sleep and spends a step of that
459
+ * schedule. A hook that keeps completing early makes the caller spin.
460
+ */
461
+ readonly awaitComplete?: (
462
+ workflow: Workflow.Any,
463
+ executionId: string
464
+ ) => Effect.Effect<void>
465
+
417
466
  readonly activityExecute: (
418
467
  activity: Activity.Any,
419
468
  attempt: number
@@ -486,11 +535,15 @@ export const makeUnsafe = (options: Encoded): WorkflowEngine["Service"] =>
486
535
  readonly executionId: string
487
536
  readonly payload: Payload["Type"]
488
537
  readonly discard?: Discard | undefined
538
+ readonly detached?: boolean | undefined
489
539
  readonly suspendedRetrySchedule?:
490
540
  | Schedule.Schedule<any, unknown>
491
541
  | undefined
492
542
  }
493
543
  ) {
544
+ if (opts.detached && !opts.discard) {
545
+ return yield* Effect.die(`${self._tag}.execute: detached requires discard`)
546
+ }
494
547
  const payload = opts.payload
495
548
  const executionId = opts.executionId
496
549
  const suspendedRetrySchedule = opts.suspendedRetrySchedule ?? defaultRetrySchedule
@@ -499,7 +552,7 @@ export const makeUnsafe = (options: Encoded): WorkflowEngine["Service"] =>
499
552
 
500
553
  // link interruption with parent workflow
501
554
  const parentInstance = yield* Effect.serviceOption(WorkflowInstance)
502
- if (Option.isSome(parentInstance)) {
555
+ if (Option.isSome(parentInstance) && !opts.detached) {
503
556
  const instance = parentInstance.value
504
557
  yield* Effect.addFinalizer(() => {
505
558
  if (!instance.interrupted || (Option.isSome(result) && result.value._tag === "Complete")) {
@@ -512,7 +565,8 @@ export const makeUnsafe = (options: Encoded): WorkflowEngine["Service"] =>
512
565
  executionId,
513
566
  payload: payload as object,
514
567
  discard: opts.discard ?? false,
515
- parent: Option.getOrUndefined(parentInstance)
568
+ parent: Option.getOrUndefined(parentInstance),
569
+ detached: opts.detached
516
570
  }) as Effect.Effect<Workflow.Result<Success["Type"], Error["Type"]>>
517
571
 
518
572
  if (opts.discard) {
@@ -548,7 +602,10 @@ export const makeUnsafe = (options: Encoded): WorkflowEngine["Service"] =>
548
602
  )
549
603
  )
550
604
  )
551
- yield* sleep
605
+ // Completion wakes the caller early; the schedule is the fallback.
606
+ yield* options.awaitComplete
607
+ ? Effect.raceFirst(sleep, options.awaitComplete(self, executionId))
608
+ : sleep
552
609
  }
553
610
  }),
554
611
  poll: options.poll,
@@ -644,6 +701,11 @@ const defaultRetrySchedule = Schedule.min([
644
701
  Schedule.spaced(30000)
645
702
  ])
646
703
 
704
+ type WakeMode = "explicit" | "automatic"
705
+
706
+ const isUnwakeable = (result: Workflow.Result<unknown, unknown>, mode: WakeMode) =>
707
+ result._tag === "Complete" || (mode === "automatic" && result.failed === true)
708
+
647
709
  /**
648
710
  * Layer that provides an in-memory `WorkflowEngine`.
649
711
  *
@@ -683,8 +745,11 @@ export const layerMemory: Layer.Layer<WorkflowEngine> = Layer.effect(WorkflowEng
683
745
  readonly parent: string | undefined
684
746
  instance: WorkflowInstance["Service"]
685
747
  interrupted: boolean
686
- resumeRequested: boolean
748
+ // The strongest wake requested while a run was still finishing.
749
+ resumeRequested: WakeMode | undefined
687
750
  fiber: Fiber.Fiber<Workflow.Result<unknown, unknown>> | undefined
751
+ // Completed once a run succeeds with `Complete`, after which it cannot resume.
752
+ readonly done: Deferred.Deferred<void>
688
753
  }
689
754
  const executions = new Map<string, ExecutionState>()
690
755
 
@@ -695,21 +760,22 @@ export const layerMemory: Layer.Layer<WorkflowEngine> = Layer.effect(WorkflowEng
695
760
 
696
761
  const deferredState = makeDeferredState()
697
762
 
698
- const resume = Effect.fnUntraced(function*(executionId: string): Effect.fn.Return<void> {
763
+ const resume = Effect.fnUntraced(function*(executionId: string, mode: WakeMode): Effect.fn.Return<void> {
699
764
  const state = executions.get(executionId)
700
765
  if (!state) return
701
766
  const exit = state.fiber?.pollUnsafe()
702
- if (exit && exit._tag === "Success" && exit.value._tag === "Complete") {
767
+ if (exit && exit._tag === "Success" && isUnwakeable(exit.value, mode)) {
703
768
  return
704
769
  } else if (state.fiber && !exit) {
705
- // A child can finish while the parent is still releasing its activity.
706
- // Preserve the wake until that run has published its suspended result.
707
- if (!state.resumeRequested) {
708
- state.resumeRequested = true
770
+ // Queue wakes until the run finishes cleanup; explicit wakes take priority.
771
+ const requested = state.resumeRequested
772
+ state.resumeRequested = mode === "explicit" ? mode : requested ?? mode
773
+ if (requested === undefined) {
709
774
  yield* Fiber.await(state.fiber).pipe(
710
775
  Effect.flatMap(() => {
711
- state.resumeRequested = false
712
- return resume(executionId)
776
+ const mode = state.resumeRequested!
777
+ state.resumeRequested = undefined
778
+ return resume(executionId, mode)
713
779
  }),
714
780
  Effect.forkIn(scope)
715
781
  )
@@ -721,7 +787,7 @@ export const layerMemory: Layer.Layer<WorkflowEngine> = Layer.effect(WorkflowEng
721
787
  const instance = WorkflowInstance.initial(
722
788
  state.instance.workflow,
723
789
  state.instance.executionId,
724
- state.instance.scope
790
+ { scope: state.instance.scope }
725
791
  )
726
792
  state.instance = instance
727
793
  state.fiber = yield* state.execute(state.payload, state.instance.executionId).pipe(
@@ -740,7 +806,12 @@ export const layerMemory: Layer.Layer<WorkflowEngine> = Layer.effect(WorkflowEng
740
806
  if (!state.parent || result._tag !== "Complete") {
741
807
  return Effect.void
742
808
  }
743
- return Effect.forkIn(resume(state.parent), scope)
809
+ return Effect.forkIn(resume(state.parent, "automatic"), scope)
810
+ }),
811
+ Effect.onExit((exit) => {
812
+ return Exit.isSuccess(exit) && exit.value._tag === "Complete"
813
+ ? Deferred.succeed(state.done, void 0)
814
+ : Effect.void
744
815
  }),
745
816
  Effect.forkIn(entry.scope)
746
817
  )
@@ -771,12 +842,13 @@ export const layerMemory: Layer.Layer<WorkflowEngine> = Layer.effect(WorkflowEng
771
842
  execute: entry.execute,
772
843
  instance: WorkflowInstance.initial(workflow, options.executionId),
773
844
  interrupted: false,
774
- resumeRequested: false,
845
+ resumeRequested: undefined,
775
846
  fiber: undefined,
776
- parent: options.parent?.executionId
847
+ done: Deferred.makeUnsafe(),
848
+ parent: options.detached ? undefined : options.parent?.executionId
777
849
  }
778
850
  executions.set(options.executionId, state)
779
- yield* resume(options.executionId)
851
+ yield* resume(options.executionId, "explicit")
780
852
  }
781
853
  if (options.discard) return
782
854
  // Capture together so a wake that swaps in a replay cannot desync them.
@@ -788,11 +860,16 @@ export const layerMemory: Layer.Layer<WorkflowEngine> = Layer.effect(WorkflowEng
788
860
  }
789
861
  return (yield* exit) as any
790
862
  }),
863
+ awaitComplete: (_workflow, executionId) =>
864
+ Effect.suspend(() => {
865
+ const state = executions.get(executionId)
866
+ return state ? Deferred.await(state.done) : Effect.never
867
+ }),
791
868
  interrupt: Effect.fnUntraced(function*(_workflow, executionId) {
792
869
  const state = executions.get(executionId)
793
870
  if (!state) return
794
871
  state.interrupted = true
795
- yield* resume(executionId)
872
+ yield* resume(executionId, "explicit")
796
873
  }),
797
874
  interruptUnsafe: Effect.fnUntraced(function*(_workflow, executionId) {
798
875
  const state = executions.get(executionId)
@@ -803,7 +880,7 @@ export const layerMemory: Layer.Layer<WorkflowEngine> = Layer.effect(WorkflowEng
803
880
  }
804
881
  }),
805
882
  resume(_workflow, executionId) {
806
- return resume(executionId)
883
+ return resume(executionId, "explicit")
807
884
  },
808
885
  activityExecute: Effect.fnUntraced(function*(activity, attempt) {
809
886
  const instance = yield* WorkflowInstance
@@ -820,6 +897,11 @@ export const layerMemory: Layer.Layer<WorkflowEngine> = Layer.effect(WorkflowEng
820
897
  state = { exit: undefined }
821
898
  activities.set(activityId, state)
822
899
  }
900
+ // A pending interrupt replays only to rebuild compensations, so it must
901
+ // not run new activities. Finalizers run once `interrupted` is set.
902
+ if (executions.get(instance.executionId)?.interrupted && !instance.interrupted) {
903
+ return new Workflow.Suspended({})
904
+ }
823
905
  const activityInstance = WorkflowInstance.initial(instance.workflow, instance.executionId)
824
906
  activityInstance.interrupted = instance.interrupted
825
907
  return yield* activity.executeEncoded.pipe(
@@ -858,7 +940,7 @@ export const layerMemory: Layer.Layer<WorkflowEngine> = Layer.effect(WorkflowEng
858
940
  deferredResults.set(id, options.exit)
859
941
  const wake = Effect.andThen(
860
942
  deferredState.deferredDone(options.executionId, options.deferredName),
861
- resume(options.executionId)
943
+ resume(options.executionId, "automatic")
862
944
  )
863
945
  return Effect.flatMap(Effect.serviceOption(WorkflowInstance), (instance) =>
864
946
  // A workflow finalizer cannot wait for its own run's cleanup.