effect 4.0.2 → 4.0.4

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 (389) 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 +111 -0
  5. package/ai-docs/src/52_graphql/20_testing.ts +45 -0
  6. package/ai-docs/src/52_graphql/30_batching.ts +116 -0
  7. package/ai-docs/src/52_graphql/40_aliased-batching.ts +122 -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/Context.d.ts.map +1 -1
  11. package/dist/Context.js +12 -3
  12. package/dist/Context.js.map +1 -1
  13. package/dist/Crypto.d.ts +33 -5
  14. package/dist/Crypto.d.ts.map +1 -1
  15. package/dist/Crypto.js +8 -2
  16. package/dist/Crypto.js.map +1 -1
  17. package/dist/DateTime.d.ts +9 -6
  18. package/dist/DateTime.d.ts.map +1 -1
  19. package/dist/DateTime.js +9 -6
  20. package/dist/DateTime.js.map +1 -1
  21. package/dist/Duration.d.ts +6 -6
  22. package/dist/Duration.d.ts.map +1 -1
  23. package/dist/Duration.js +27 -8
  24. package/dist/Duration.js.map +1 -1
  25. package/dist/FileSystem.d.ts +44 -2
  26. package/dist/FileSystem.d.ts.map +1 -1
  27. package/dist/FileSystem.js.map +1 -1
  28. package/dist/RequestResolver.d.ts.map +1 -1
  29. package/dist/RequestResolver.js +4 -10
  30. package/dist/RequestResolver.js.map +1 -1
  31. package/dist/Scheduler.d.ts +9 -0
  32. package/dist/Scheduler.d.ts.map +1 -1
  33. package/dist/Scheduler.js +9 -0
  34. package/dist/Scheduler.js.map +1 -1
  35. package/dist/Schema.d.ts +481 -1
  36. package/dist/Schema.d.ts.map +1 -1
  37. package/dist/Schema.js +362 -4
  38. package/dist/Schema.js.map +1 -1
  39. package/dist/SchemaGetter.d.ts +4 -0
  40. package/dist/SchemaGetter.d.ts.map +1 -1
  41. package/dist/SchemaGetter.js +52 -33
  42. package/dist/SchemaGetter.js.map +1 -1
  43. package/dist/Sink.d.ts.map +1 -1
  44. package/dist/Sink.js +38 -17
  45. package/dist/Sink.js.map +1 -1
  46. package/dist/Stdio.d.ts +7 -1
  47. package/dist/Stdio.d.ts.map +1 -1
  48. package/dist/Stdio.js +1 -0
  49. package/dist/Stdio.js.map +1 -1
  50. package/dist/Stream.d.ts +22 -11
  51. package/dist/Stream.d.ts.map +1 -1
  52. package/dist/Stream.js +21 -6
  53. package/dist/Stream.js.map +1 -1
  54. package/dist/Utils.js +8 -3
  55. package/dist/Utils.js.map +1 -1
  56. package/dist/ai/AnthropicStructuredOutput.js +0 -2
  57. package/dist/ai/AnthropicStructuredOutput.js.map +1 -1
  58. package/dist/ai/Chat.d.ts +2 -2
  59. package/dist/ai/Chat.d.ts.map +1 -1
  60. package/dist/ai/LanguageModel.d.ts +38 -7
  61. package/dist/ai/LanguageModel.d.ts.map +1 -1
  62. package/dist/ai/LanguageModel.js +25 -7
  63. package/dist/ai/LanguageModel.js.map +1 -1
  64. package/dist/ai/McpServer.d.ts +61 -0
  65. package/dist/ai/McpServer.d.ts.map +1 -1
  66. package/dist/ai/McpServer.js +196 -44
  67. package/dist/ai/McpServer.js.map +1 -1
  68. package/dist/ai/Prompt.d.ts.map +1 -1
  69. package/dist/ai/Prompt.js +28 -5
  70. package/dist/ai/Prompt.js.map +1 -1
  71. package/dist/ai/Response.d.ts +4 -3
  72. package/dist/ai/Response.d.ts.map +1 -1
  73. package/dist/ai/Response.js.map +1 -1
  74. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +5 -0
  75. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  76. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  77. package/dist/ai/internal/mcpRuntime.js +1 -0
  78. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  79. package/dist/cli/CliOutput.d.ts +27 -0
  80. package/dist/cli/CliOutput.d.ts.map +1 -1
  81. package/dist/cli/CliOutput.js +33 -10
  82. package/dist/cli/CliOutput.js.map +1 -1
  83. package/dist/cli/Command.d.ts.map +1 -1
  84. package/dist/cli/Command.js +6 -3
  85. package/dist/cli/Command.js.map +1 -1
  86. package/dist/cli/Completions.d.ts +3 -3
  87. package/dist/cli/Completions.d.ts.map +1 -1
  88. package/dist/cli/Completions.js +8 -5
  89. package/dist/cli/Completions.js.map +1 -1
  90. package/dist/cli/GlobalFlag.d.ts +5 -4
  91. package/dist/cli/GlobalFlag.d.ts.map +1 -1
  92. package/dist/cli/GlobalFlag.js +3 -3
  93. package/dist/cli/GlobalFlag.js.map +1 -1
  94. package/dist/cli/Prompt.d.ts +17 -1
  95. package/dist/cli/Prompt.d.ts.map +1 -1
  96. package/dist/cli/Prompt.js +119 -114
  97. package/dist/cli/Prompt.js.map +1 -1
  98. package/dist/cli/internal/ansi.d.ts +0 -1
  99. package/dist/cli/internal/ansi.d.ts.map +1 -1
  100. package/dist/cli/internal/ansi.js +20 -3
  101. package/dist/cli/internal/ansi.js.map +1 -1
  102. package/dist/cli/internal/completions/powershell.d.ts +2 -0
  103. package/dist/cli/internal/completions/powershell.d.ts.map +1 -0
  104. package/dist/cli/internal/completions/powershell.js +273 -0
  105. package/dist/cli/internal/completions/powershell.js.map +1 -0
  106. package/dist/cli/internal/completions/zsh.js +3 -2
  107. package/dist/cli/internal/completions/zsh.js.map +1 -1
  108. package/dist/cli/internal/wizard.d.ts +3 -3
  109. package/dist/cli/internal/wizard.d.ts.map +1 -1
  110. package/dist/cli/internal/wizard.js +21 -18
  111. package/dist/cli/internal/wizard.js.map +1 -1
  112. package/dist/cluster/ClusterSchema.d.ts +28 -0
  113. package/dist/cluster/ClusterSchema.d.ts.map +1 -1
  114. package/dist/cluster/ClusterSchema.js +30 -0
  115. package/dist/cluster/ClusterSchema.js.map +1 -1
  116. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  117. package/dist/cluster/ClusterWorkflowEngine.js +56 -26
  118. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  119. package/dist/cluster/MessageStorage.d.ts +18 -3
  120. package/dist/cluster/MessageStorage.d.ts.map +1 -1
  121. package/dist/cluster/MessageStorage.js +31 -11
  122. package/dist/cluster/MessageStorage.js.map +1 -1
  123. package/dist/cluster/Runners.d.ts.map +1 -1
  124. package/dist/cluster/Runners.js +8 -2
  125. package/dist/cluster/Runners.js.map +1 -1
  126. package/dist/cluster/Sharding.d.ts.map +1 -1
  127. package/dist/cluster/Sharding.js +187 -66
  128. package/dist/cluster/Sharding.js.map +1 -1
  129. package/dist/cluster/SqlMessageStorage.d.ts +59 -19
  130. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  131. package/dist/cluster/SqlMessageStorage.js +84 -55
  132. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  133. package/dist/cluster/SqlRunnerStorage.d.ts +68 -19
  134. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  135. package/dist/cluster/SqlRunnerStorage.js +191 -113
  136. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  137. package/dist/cluster/internal/entityManager.js +104 -37
  138. package/dist/cluster/internal/entityManager.js.map +1 -1
  139. package/dist/encoding/Sse.d.ts +6 -0
  140. package/dist/encoding/Sse.d.ts.map +1 -1
  141. package/dist/encoding/Sse.js +62 -70
  142. package/dist/encoding/Sse.js.map +1 -1
  143. package/dist/graphql/GraphQL.d.ts +349 -0
  144. package/dist/graphql/GraphQL.d.ts.map +1 -0
  145. package/dist/graphql/GraphQL.js +207 -0
  146. package/dist/graphql/GraphQL.js.map +1 -0
  147. package/dist/graphql/GraphQLClient.d.ts +562 -0
  148. package/dist/graphql/GraphQLClient.d.ts.map +1 -0
  149. package/dist/graphql/GraphQLClient.js +498 -0
  150. package/dist/graphql/GraphQLClient.js.map +1 -0
  151. package/dist/graphql/GraphQLClientError.d.ts +445 -0
  152. package/dist/graphql/GraphQLClientError.d.ts.map +1 -0
  153. package/dist/graphql/GraphQLClientError.js +479 -0
  154. package/dist/graphql/GraphQLClientError.js.map +1 -0
  155. package/dist/graphql/GraphQLGroup.d.ts +118 -0
  156. package/dist/graphql/GraphQLGroup.d.ts.map +1 -0
  157. package/dist/graphql/GraphQLGroup.js +109 -0
  158. package/dist/graphql/GraphQLGroup.js.map +1 -0
  159. package/dist/graphql/GraphQLMiddleware.d.ts +249 -0
  160. package/dist/graphql/GraphQLMiddleware.d.ts.map +1 -0
  161. package/dist/graphql/GraphQLMiddleware.js +130 -0
  162. package/dist/graphql/GraphQLMiddleware.js.map +1 -0
  163. package/dist/graphql/GraphQLProtocol.d.ts +731 -0
  164. package/dist/graphql/GraphQLProtocol.d.ts.map +1 -0
  165. package/dist/graphql/GraphQLProtocol.js +719 -0
  166. package/dist/graphql/GraphQLProtocol.js.map +1 -0
  167. package/dist/graphql/GraphQLResolver.d.ts +453 -0
  168. package/dist/graphql/GraphQLResolver.d.ts.map +1 -0
  169. package/dist/graphql/GraphQLResolver.js +552 -0
  170. package/dist/graphql/GraphQLResolver.js.map +1 -0
  171. package/dist/graphql/index.d.ts +40 -0
  172. package/dist/graphql/index.d.ts.map +1 -0
  173. package/dist/graphql/index.js +41 -0
  174. package/dist/graphql/index.js.map +1 -0
  175. package/dist/http/FindMyWay/internal/router.js +3 -6
  176. package/dist/http/FindMyWay/internal/router.js.map +1 -1
  177. package/dist/http/HttpClient.d.ts +21 -0
  178. package/dist/http/HttpClient.d.ts.map +1 -1
  179. package/dist/http/HttpClient.js +63 -12
  180. package/dist/http/HttpClient.js.map +1 -1
  181. package/dist/http/HttpEffect.d.ts.map +1 -1
  182. package/dist/http/HttpEffect.js +14 -7
  183. package/dist/http/HttpEffect.js.map +1 -1
  184. package/dist/http/HttpMiddleware.d.ts.map +1 -1
  185. package/dist/http/HttpMiddleware.js +31 -32
  186. package/dist/http/HttpMiddleware.js.map +1 -1
  187. package/dist/http/HttpRouter.d.ts +35 -0
  188. package/dist/http/HttpRouter.d.ts.map +1 -1
  189. package/dist/http/HttpRouter.js +35 -0
  190. package/dist/http/HttpRouter.js.map +1 -1
  191. package/dist/http/HttpServerResponse.d.ts +8 -6
  192. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  193. package/dist/http/HttpServerResponse.js +27 -16
  194. package/dist/http/HttpServerResponse.js.map +1 -1
  195. package/dist/http/HttpTraceContext.d.ts.map +1 -1
  196. package/dist/http/HttpTraceContext.js +4 -2
  197. package/dist/http/HttpTraceContext.js.map +1 -1
  198. package/dist/http/Multipart.d.ts.map +1 -1
  199. package/dist/http/Multipart.js +15 -1
  200. package/dist/http/Multipart.js.map +1 -1
  201. package/dist/http-api/HttpApiScalar.d.ts +5 -0
  202. package/dist/http-api/HttpApiScalar.d.ts.map +1 -1
  203. package/dist/http-api/HttpApiScalar.js.map +1 -1
  204. package/dist/internal/dateTime.js +40 -35
  205. package/dist/internal/dateTime.js.map +1 -1
  206. package/dist/internal/effect.js +19 -9
  207. package/dist/internal/effect.js.map +1 -1
  208. package/dist/internal/graphql.d.ts +2 -0
  209. package/dist/internal/graphql.d.ts.map +1 -0
  210. package/dist/internal/graphql.js +195 -0
  211. package/dist/internal/graphql.js.map +1 -0
  212. package/dist/internal/graphqlHeaders.d.ts +4 -0
  213. package/dist/internal/graphqlHeaders.d.ts.map +1 -0
  214. package/dist/internal/graphqlHeaders.js +11 -0
  215. package/dist/internal/graphqlHeaders.js.map +1 -0
  216. package/dist/internal/request.js +20 -1
  217. package/dist/internal/request.js.map +1 -1
  218. package/dist/internal/schema/toCodeDocument.js +4 -1
  219. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  220. package/dist/internal/schema/toJsonSchemaDocument.js +29 -5
  221. package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
  222. package/dist/internal/version.js +1 -1
  223. package/dist/net/AddressResolver.d.ts +145 -0
  224. package/dist/net/AddressResolver.d.ts.map +1 -0
  225. package/dist/net/AddressResolver.js +114 -0
  226. package/dist/net/AddressResolver.js.map +1 -0
  227. package/dist/net/Dns.d.ts +596 -0
  228. package/dist/net/Dns.d.ts.map +1 -0
  229. package/dist/net/Dns.js +549 -0
  230. package/dist/net/Dns.js.map +1 -0
  231. package/dist/net/Host.d.ts +369 -0
  232. package/dist/net/Host.d.ts.map +1 -0
  233. package/dist/net/Host.js +397 -0
  234. package/dist/net/Host.js.map +1 -0
  235. package/dist/net/IpInterface.d.ts +76 -3
  236. package/dist/net/IpInterface.d.ts.map +1 -1
  237. package/dist/net/IpInterface.js +53 -4
  238. package/dist/net/IpInterface.js.map +1 -1
  239. package/dist/net/IpNetwork.d.ts +82 -8
  240. package/dist/net/IpNetwork.d.ts.map +1 -1
  241. package/dist/net/IpNetwork.js +60 -4
  242. package/dist/net/IpNetwork.js.map +1 -1
  243. package/dist/net/NetAddress.d.ts +396 -35
  244. package/dist/net/NetAddress.d.ts.map +1 -1
  245. package/dist/net/NetAddress.js +358 -34
  246. package/dist/net/NetAddress.js.map +1 -1
  247. package/dist/net/index.d.ts +15 -0
  248. package/dist/net/index.d.ts.map +1 -1
  249. package/dist/net/index.js +15 -0
  250. package/dist/net/index.js.map +1 -1
  251. package/dist/observability/OtlpMetrics.d.ts.map +1 -1
  252. package/dist/observability/OtlpMetrics.js +15 -21
  253. package/dist/observability/OtlpMetrics.js.map +1 -1
  254. package/dist/observability/PrometheusMetrics.js +1 -0
  255. package/dist/observability/PrometheusMetrics.js.map +1 -1
  256. package/dist/persistence/PersistedQueue.d.ts +32 -3
  257. package/dist/persistence/PersistedQueue.d.ts.map +1 -1
  258. package/dist/persistence/PersistedQueue.js +75 -16
  259. package/dist/persistence/PersistedQueue.js.map +1 -1
  260. package/dist/rpc/RpcClient.d.ts +22 -6
  261. package/dist/rpc/RpcClient.d.ts.map +1 -1
  262. package/dist/rpc/RpcClient.js +12 -5
  263. package/dist/rpc/RpcClient.js.map +1 -1
  264. package/dist/rpc/RpcServer.d.ts +6 -0
  265. package/dist/rpc/RpcServer.d.ts.map +1 -1
  266. package/dist/rpc/RpcServer.js +78 -29
  267. package/dist/rpc/RpcServer.js.map +1 -1
  268. package/dist/socket/DatagramSocket.d.ts +456 -0
  269. package/dist/socket/DatagramSocket.d.ts.map +1 -0
  270. package/dist/socket/DatagramSocket.js +535 -0
  271. package/dist/socket/DatagramSocket.js.map +1 -0
  272. package/dist/socket/Socket.d.ts +20 -1
  273. package/dist/socket/Socket.d.ts.map +1 -1
  274. package/dist/socket/Socket.js +9 -1
  275. package/dist/socket/Socket.js.map +1 -1
  276. package/dist/socket/index.d.ts +5 -0
  277. package/dist/socket/index.d.ts.map +1 -1
  278. package/dist/socket/index.js +5 -0
  279. package/dist/socket/index.js.map +1 -1
  280. package/dist/sql/Migrator.d.ts.map +1 -1
  281. package/dist/sql/Migrator.js +7 -2
  282. package/dist/sql/Migrator.js.map +1 -1
  283. package/dist/sql/SqlClient.d.ts +7 -1
  284. package/dist/sql/SqlClient.d.ts.map +1 -1
  285. package/dist/sql/SqlClient.js +31 -6
  286. package/dist/sql/SqlClient.js.map +1 -1
  287. package/dist/testing/TestCrypto.d.ts +73 -0
  288. package/dist/testing/TestCrypto.d.ts.map +1 -0
  289. package/dist/testing/TestCrypto.js +87 -0
  290. package/dist/testing/TestCrypto.js.map +1 -0
  291. package/dist/testing/index.d.ts +5 -0
  292. package/dist/testing/index.d.ts.map +1 -1
  293. package/dist/testing/index.js +5 -0
  294. package/dist/testing/index.js.map +1 -1
  295. package/dist/workflow/DurableDeferred.d.ts +54 -0
  296. package/dist/workflow/DurableDeferred.d.ts.map +1 -1
  297. package/dist/workflow/DurableDeferred.js +108 -50
  298. package/dist/workflow/DurableDeferred.js.map +1 -1
  299. package/dist/workflow/WorkflowEngine.d.ts +24 -2
  300. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  301. package/dist/workflow/WorkflowEngine.js +13 -3
  302. package/dist/workflow/WorkflowEngine.js.map +1 -1
  303. package/package.json +6 -3
  304. package/src/Context.ts +12 -3
  305. package/src/Crypto.ts +43 -9
  306. package/src/DateTime.ts +9 -6
  307. package/src/Duration.ts +36 -16
  308. package/src/FileSystem.ts +48 -2
  309. package/src/RequestResolver.ts +4 -10
  310. package/src/Scheduler.ts +9 -0
  311. package/src/Schema.ts +677 -5
  312. package/src/SchemaGetter.ts +47 -35
  313. package/src/Sink.ts +45 -18
  314. package/src/Stdio.ts +9 -2
  315. package/src/Stream.ts +44 -15
  316. package/src/Utils.ts +8 -5
  317. package/src/ai/AnthropicStructuredOutput.ts +2 -2
  318. package/src/ai/Chat.ts +2 -2
  319. package/src/ai/LanguageModel.ts +96 -24
  320. package/src/ai/McpServer.ts +288 -94
  321. package/src/ai/Prompt.ts +24 -10
  322. package/src/ai/Response.ts +6 -3
  323. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +5 -0
  324. package/src/ai/internal/mcpProtocol.ts +3 -0
  325. package/src/ai/internal/mcpRuntime.ts +2 -0
  326. package/src/cli/CliOutput.ts +33 -16
  327. package/src/cli/Command.ts +4 -3
  328. package/src/cli/Completions.ts +9 -6
  329. package/src/cli/GlobalFlag.ts +19 -11
  330. package/src/cli/Prompt.ts +159 -149
  331. package/src/cli/internal/ansi.ts +26 -3
  332. package/src/cli/internal/completions/powershell.ts +322 -0
  333. package/src/cli/internal/completions/zsh.ts +4 -2
  334. package/src/cli/internal/wizard.ts +34 -26
  335. package/src/cluster/ClusterSchema.ts +32 -0
  336. package/src/cluster/ClusterWorkflowEngine.ts +64 -36
  337. package/src/cluster/MessageStorage.ts +45 -14
  338. package/src/cluster/Runners.ts +8 -2
  339. package/src/cluster/Sharding.ts +219 -58
  340. package/src/cluster/SqlMessageStorage.ts +118 -84
  341. package/src/cluster/SqlRunnerStorage.ts +224 -128
  342. package/src/cluster/internal/entityManager.ts +151 -55
  343. package/src/encoding/Sse.ts +69 -79
  344. package/src/graphql/GraphQL.ts +494 -0
  345. package/src/graphql/GraphQLClient.ts +912 -0
  346. package/src/graphql/GraphQLClientError.ts +542 -0
  347. package/src/graphql/GraphQLGroup.ts +167 -0
  348. package/src/graphql/GraphQLMiddleware.ts +253 -0
  349. package/src/graphql/GraphQLProtocol.ts +1286 -0
  350. package/src/graphql/GraphQLResolver.ts +1010 -0
  351. package/src/graphql/index.ts +48 -0
  352. package/src/http/FindMyWay/internal/router.ts +4 -7
  353. package/src/http/HttpClient.ts +110 -12
  354. package/src/http/HttpEffect.ts +11 -5
  355. package/src/http/HttpMiddleware.ts +33 -34
  356. package/src/http/HttpRouter.ts +35 -0
  357. package/src/http/HttpServerResponse.ts +28 -16
  358. package/src/http/HttpTraceContext.ts +8 -2
  359. package/src/http/Multipart.ts +17 -1
  360. package/src/http-api/HttpApiScalar.ts +5 -0
  361. package/src/internal/dateTime.ts +13 -10
  362. package/src/internal/effect.ts +22 -15
  363. package/src/internal/graphql.ts +263 -0
  364. package/src/internal/graphqlHeaders.ts +11 -0
  365. package/src/internal/request.ts +31 -3
  366. package/src/internal/schema/toCodeDocument.ts +7 -1
  367. package/src/internal/schema/toJsonSchemaDocument.ts +34 -2
  368. package/src/internal/version.ts +1 -1
  369. package/src/net/AddressResolver.ts +222 -0
  370. package/src/net/Dns.ts +1035 -0
  371. package/src/net/Host.ts +544 -0
  372. package/src/net/IpInterface.ts +117 -7
  373. package/src/net/IpNetwork.ts +116 -17
  374. package/src/net/NetAddress.ts +620 -76
  375. package/src/net/index.ts +18 -0
  376. package/src/observability/OtlpMetrics.ts +12 -23
  377. package/src/observability/PrometheusMetrics.ts +1 -0
  378. package/src/persistence/PersistedQueue.ts +146 -53
  379. package/src/rpc/RpcClient.ts +41 -19
  380. package/src/rpc/RpcServer.ts +115 -40
  381. package/src/socket/DatagramSocket.ts +919 -0
  382. package/src/socket/Socket.ts +28 -2
  383. package/src/socket/index.ts +6 -0
  384. package/src/sql/Migrator.ts +21 -5
  385. package/src/sql/SqlClient.ts +39 -15
  386. package/src/testing/TestCrypto.ts +94 -0
  387. package/src/testing/index.ts +6 -0
  388. package/src/workflow/DurableDeferred.ts +160 -47
  389. package/src/workflow/WorkflowEngine.ts +50 -5
@@ -441,16 +441,19 @@ export const StreamPart = <T extends Toolkit.Any | Toolkit.WithHandler<any>>(
441
441
  export type ToolCallParts<
442
442
  Tools extends Record<string, Tool.Any>,
443
443
  ParametersMode extends ToolParametersMode = "decoded"
444
- > = ToolCallPartForName<Tools, ParametersMode, keyof Tools>
444
+ > = ParametersMode extends "deferred" ?
445
+ ToolCallPartForName<Tools, "opaque", keyof Tools> | ToolCallPart<string, unknown>
446
+ : ToolCallPartForName<Tools, ParametersMode, keyof Tools>
445
447
 
446
448
  /**
447
- * Controls whether tool parameters are decoded, encoded, or opaque.
449
+ * Controls tool parameter decoding. `"deferred"` allows undeclared tool names
450
+ * with opaque parameters, leaving validation to the caller.
448
451
  *
449
452
  * @stability unstable
450
453
  * @category utility types
451
454
  * @since 4.0.0
452
455
  */
453
- export type ToolParametersMode = "decoded" | "encoded" | "opaque"
456
+ export type ToolParametersMode = "decoded" | "encoded" | "opaque" | "deferred"
454
457
 
455
458
  type ToolCallPartForName<
456
459
  Tools extends Record<string, Tool.Any>,
@@ -386,6 +386,8 @@ export const makeHandlers = (
386
386
  }
387
387
  const presence = yield* context.registrationPresence
388
388
  const eventsScope = yield* Scope.fork(yield* Effect.scope)
389
+ // Ignore changes emitted before this subscription, even if delivery was deferred.
390
+ const listChangeRevision = context.getListChangeRevision?.() ?? 0
389
391
  const events = yield* Scope.provide(context.subscribeServerNotifications, eventsScope)
390
392
  const honored = {
391
393
  ...(presence.tools && request.notifications.toolsListChanged === true
@@ -410,6 +412,9 @@ export const makeHandlers = (
410
412
  yield* Effect.gen(function*() {
411
413
  while (true) {
412
414
  const event = yield* PubSub.take(events)
415
+ if (event.listChangeRevision !== undefined && event.listChangeRevision <= listChangeRevision) {
416
+ continue
417
+ }
413
418
  if (event.targetClientId !== undefined && event.targetClientId !== client.id) {
414
419
  continue
415
420
  }
@@ -382,6 +382,8 @@ export interface HandlerInstallationContext {
382
382
  never,
383
383
  Scope.Scope
384
384
  >
385
+ /** Current list-change revision; subscriptions ignore changes emitted at or before it. */
386
+ readonly getListChangeRevision?: (() => number) | undefined
385
387
  readonly sendNotification?: (
386
388
  protocolVersion: string,
387
389
  clientId: number,
@@ -419,6 +421,7 @@ export interface HandlerInstallationContext {
419
421
  */
420
422
  export interface CanonicalServerNotification {
421
423
  readonly notification: SubscriptionServerNotification
424
+ readonly listChangeRevision?: number | undefined
422
425
  readonly targetClientId?: number | undefined
423
426
  }
424
427
 
@@ -123,6 +123,7 @@ export type HttpAdmission =
123
123
  */
124
124
  export interface HandlerInstallationOptions {
125
125
  readonly core: McpCore.McpCore
126
+ readonly getListChangeRevision?: () => number
126
127
  readonly subscribeServerNotifications: McpProtocol.HandlerInstallationContext["subscribeServerNotifications"]
127
128
  readonly sendNotification?: NonNullable<McpProtocol.HandlerInstallationContext["sendNotification"]>
128
129
  readonly markSubscriptionCancelled?: NonNullable<
@@ -512,6 +513,7 @@ export const make = Effect.fnUntraced(function*(
512
513
  const contextMap = new Map<string, unknown>()
513
514
  const installationContext: McpProtocol.HandlerInstallationContext = {
514
515
  subscribeServerNotifications: options.subscribeServerNotifications,
516
+ getListChangeRevision: options.getListChangeRevision,
515
517
  ...(options.sendNotification === undefined ? {} : { sendNotification: options.sendNotification }),
516
518
  ...(options.markSubscriptionCancelled === undefined
517
519
  ? {}
@@ -16,6 +16,7 @@ import * as Layer from "../Layer.ts"
16
16
  import * as Option from "../Option.ts"
17
17
  import type * as CliError from "./CliError.ts"
18
18
  import type { HelpDoc } from "./HelpDoc.ts"
19
+ import * as Ansi from "./internal/ansi.ts"
19
20
 
20
21
  /**
21
22
  * Defines the service interface for formatting CLI output including help, errors, and version info.
@@ -306,17 +307,7 @@ const escapeControlCharacters = (text: string): string =>
306
307
  * @since 4.0.0
307
308
  */
308
309
  export const defaultFormatter = (options?: { colors?: boolean }): Formatter => {
309
- const globalProcess = (globalThis as any).process
310
- const hasProcess = typeof globalProcess === "object" && globalProcess !== null
311
-
312
- const useColor = options?.colors !== undefined
313
- ? options.colors
314
- // Auto-detect based on environment
315
- : (hasProcess &&
316
- typeof globalProcess.stdout === "object" &&
317
- globalProcess.stdout !== null &&
318
- globalProcess.stdout.isTTY === true &&
319
- !globalProcess.env?.NO_COLOR)
310
+ const useColor = options?.colors ?? Ansi.detectColors()
320
311
 
321
312
  // Color palette using ANSI escape codes
322
313
  const colors = useColor
@@ -390,7 +381,7 @@ const stripAnsi = (text: string): string => {
390
381
  }
391
382
 
392
383
  /**
393
- * Gets the terminal display width of a string (excluding ANSI codes).
384
+ * Segments text into grapheme clusters.
394
385
  * @internal
395
386
  */
396
387
  const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" })
@@ -424,7 +415,33 @@ const graphemeWidth = (grapheme: string): number => {
424
415
  return isFullWidthCodePoint(visible.codePointAt(0)!) ? 2 : 1
425
416
  }
426
417
 
427
- const visualLength = (text: string): number => {
418
+ /**
419
+ * Measures the number of terminal cells a string occupies.
420
+ *
421
+ * **Details**
422
+ *
423
+ * Uses the same measurement as built-in help and table rendering. ANSI styling
424
+ * is stripped before measuring graphemes: zero-width graphemes count as `0`,
425
+ * emoji presentation sequences and fullwidth characters as `2`, and other
426
+ * graphemes as `1`.
427
+ *
428
+ * **Example** (Measuring terminal-cell widths)
429
+ *
430
+ * ```ts import.meta.vitest
431
+ * import { CliOutput } from "effect/cli"
432
+ *
433
+ * CliOutput.displayWidth("file") // => 4
434
+ * CliOutput.displayWidth("ファイル") // => 8
435
+ * CliOutput.displayWidth("é") // => 1
436
+ * CliOutput.displayWidth("1️⃣") // => 2
437
+ * CliOutput.displayWidth("\u001B[1mbold\u001B[0m") // => 4
438
+ * ```
439
+ *
440
+ * @stability unstable
441
+ * @category measuring
442
+ * @since 4.0.3
443
+ */
444
+ export const displayWidth = (text: string): number => {
428
445
  let length = 0
429
446
  for (const { segment } of graphemeSegmenter.segment(stripAnsi(text))) {
430
447
  length += graphemeWidth(segment)
@@ -437,7 +454,7 @@ const visualLength = (text: string): number => {
437
454
  * @internal
438
455
  */
439
456
  const pad = (s: string, width: number) => {
440
- const actualLength = visualLength(s)
457
+ const actualLength = displayWidth(s)
441
458
  const padding = Math.max(0, width - actualLength)
442
459
  return s + " ".repeat(padding)
443
460
  }
@@ -456,9 +473,9 @@ interface Row {
456
473
  * @internal
457
474
  */
458
475
  const renderTable = (rows: ReadonlyArray<Row>, widthCap?: number) => {
459
- const maxColumn = Math.max(...rows.map((r) => visualLength(r.left))) + 4
476
+ const maxColumn = Math.max(...rows.map((r) => displayWidth(r.left))) + 4
460
477
  const col = widthCap === undefined ? maxColumn : Math.min(maxColumn, widthCap)
461
- return rows.map(({ left, right }) => ` ${pad(left, Math.max(col, visualLength(left) + 1))}${right}`).join("\n")
478
+ return rows.map(({ left, right }) => ` ${pad(left, Math.max(col, displayWidth(left) + 1))}${right}`).join("\n")
462
479
  }
463
480
 
464
481
  const formatSubcommandName = (name: string, alias: string | undefined): string => alias ? `${name}, ${alias}` : name
@@ -3104,14 +3104,15 @@ export const runWith = <const Name extends string, Input, E, R, ContextInput>(
3104
3104
  if (!hasEntry) continue
3105
3105
  const [, value] = yield* flag.flag.parse(emptyArgs)
3106
3106
  if (flag === GlobalFlag.Wizard) {
3107
+ const { colors } = yield* Prompt.Theme
3107
3108
  return yield* Effect.gen(function*() {
3108
- yield* Console.log(Wizard.renderIntroduction(command.name, config.version, command.description))
3109
+ yield* Console.log(Wizard.renderIntroduction(command.name, config.version, command.description, colors))
3109
3110
  const prefix = [
3110
3111
  command.name,
3111
3112
  ...args.filter((arg) => arg !== "--wizard" && !arg.startsWith("--wizard="))
3112
3113
  ]
3113
3114
  const wizardResult = yield* Wizard.run(command, { commandPath, prefix })
3114
- yield* Console.log(Wizard.renderCompletion(wizardResult.displayArgs))
3115
+ yield* Console.log(Wizard.renderCompletion(wizardResult.displayArgs, colors))
3115
3116
  const shouldRun = yield* Prompt.run(Prompt.Toggle({
3116
3117
  message: "Run this command?",
3117
3118
  initial: true,
@@ -3123,7 +3124,7 @@ export const runWith = <const Name extends string, Input, E, R, ContextInput>(
3123
3124
  yield* runWith(command, { ...config, renderErrors: false })(wizardResult.args.slice(1))
3124
3125
  }
3125
3126
  }).pipe(
3126
- Effect.catchTag("QuitError", () => Console.log(Wizard.renderQuit()))
3127
+ Effect.catchTag("QuitError", () => Console.log(Wizard.renderQuit(colors)))
3127
3128
  )
3128
3129
  }
3129
3130
  yield* flag.run(value, handlerCtx)
@@ -1,14 +1,15 @@
1
1
  /**
2
2
  * The `Completions` module turns a plain description of an Effect CLI command
3
- * tree into shell completion scripts for Bash, Zsh, and Fish. It is the
4
- * low-level script generation surface used by the unstable CLI package and by
5
- * the built-in completions global flag.
3
+ * tree into shell completion scripts for Bash, Zsh, Fish, and PowerShell. It
4
+ * is the low-level script generation surface used by the unstable CLI package
5
+ * and by the built-in completions global flag.
6
6
  *
7
7
  * @stability unstable
8
8
  * @since 4.0.0
9
9
  */
10
10
  import * as Bash from "./internal/completions/bash.ts"
11
11
  import * as Fish from "./internal/completions/fish.ts"
12
+ import * as PowerShell from "./internal/completions/powershell.ts"
12
13
  import * as Zsh from "./internal/completions/zsh.ts"
13
14
 
14
15
  /**
@@ -18,7 +19,7 @@ import * as Zsh from "./internal/completions/zsh.ts"
18
19
  * @category models
19
20
  * @since 4.0.0
20
21
  */
21
- export type Shell = "bash" | "zsh" | "fish"
22
+ export type Shell = "bash" | "zsh" | "fish" | "powershell"
22
23
 
23
24
  /**
24
25
  * Describes a command for completion script generation.
@@ -105,8 +106,8 @@ export type ArgumentType =
105
106
  *
106
107
  * **Details**
107
108
  *
108
- * Dispatches by `shell` to Bash, Zsh, or Fish generation and returns a static
109
- * script string for `executableName`.
109
+ * Dispatches by `shell` to Bash, Zsh, Fish, or PowerShell generation and
110
+ * returns a static script string for `executableName`.
110
111
  *
111
112
  * @see {@link Shell} for supported shell names
112
113
  * @see {@link CommandDescriptor} for the command shape used by completion generation
@@ -127,5 +128,7 @@ export const generate = (
127
128
  return Zsh.generate(executableName, descriptor)
128
129
  case "fish":
129
130
  return Fish.generate(executableName, descriptor)
131
+ case "powershell":
132
+ return PowerShell.generate(executableName, descriptor)
130
133
  }
131
134
  }
@@ -224,21 +224,29 @@ export const Wizard: Action<boolean> = Action({
224
224
  *
225
225
  * **Details**
226
226
  *
227
- * Accepted values are `bash`, `zsh`, `fish`, and `sh`; `sh` is normalized to
228
- * `bash`.
227
+ * Accepted values are `bash`, `zsh`, `fish`, `powershell`, `sh`, and `pwsh`;
228
+ * `sh` is normalized to `bash` and `pwsh` to `powershell`.
229
229
  *
230
230
  * @stability unstable
231
231
  * @category references
232
232
  * @since 4.0.0
233
233
  */
234
- export const Completions: Action<Option.Option<"bash" | "zsh" | "fish">> = Action({
235
- flag: Flag.Literals("completions", ["bash", "zsh", "fish", "sh"] as const)
236
- .pipe(
237
- Flag.optional,
238
- Flag.map((v) => Option.map(v, (s) => s === "sh" ? "bash" : s)),
239
- Flag.withMetavar("<bash|zsh|fish|sh>"),
240
- Flag.withDescription("Print shell completion script")
241
- ),
234
+ export const Completions: Action<Option.Option<Completions_.Shell>> = Action({
235
+ flag: Flag.ChoiceWithValue(
236
+ "completions",
237
+ [
238
+ ["bash", "bash"],
239
+ ["zsh", "zsh"],
240
+ ["fish", "fish"],
241
+ ["powershell", "powershell"],
242
+ ["sh", "bash"],
243
+ ["pwsh", "powershell"]
244
+ ] as const
245
+ ).pipe(
246
+ Flag.optional,
247
+ Flag.withMetavar("<bash|zsh|fish|powershell|sh|pwsh>"),
248
+ Flag.withDescription("Print shell completion script")
249
+ ),
242
250
  run: Effect.fnUntraced(function*(shell, { command }) {
243
251
  if (Option.isNone(shell)) return
244
252
  const descriptor = CommandDescriptor.fromCommand(command)
@@ -317,7 +325,7 @@ export const BuiltIns: readonly [
317
325
  Action<boolean>,
318
326
  Action<boolean>,
319
327
  Action<boolean>,
320
- Action<Option.Option<"bash" | "zsh" | "fish">>,
328
+ Action<Option.Option<Completions_.Shell>>,
321
329
  Setting<"log-level", Option.Option<LogLevelType>>
322
330
  ] = [Help, Version, Wizard, Completions, LogLevel]
323
331