effect 4.0.7 → 4.1.0

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 (679) hide show
  1. package/README.md +1 -1
  2. package/dist/BigDecimal.d.ts.map +1 -1
  3. package/dist/BigDecimal.js +3 -0
  4. package/dist/BigDecimal.js.map +1 -1
  5. package/dist/Channel.d.ts +12 -6
  6. package/dist/Channel.d.ts.map +1 -1
  7. package/dist/Channel.js +9 -3
  8. package/dist/Channel.js.map +1 -1
  9. package/dist/Config.d.ts +7 -1
  10. package/dist/Config.d.ts.map +1 -1
  11. package/dist/Config.js.map +1 -1
  12. package/dist/Context.d.ts +18 -1
  13. package/dist/Context.d.ts.map +1 -1
  14. package/dist/Context.js +27 -8
  15. package/dist/Context.js.map +1 -1
  16. package/dist/Cron.d.ts +81 -11
  17. package/dist/Cron.d.ts.map +1 -1
  18. package/dist/Cron.js +101 -26
  19. package/dist/Cron.js.map +1 -1
  20. package/dist/Duration.d.ts +78 -0
  21. package/dist/Duration.d.ts.map +1 -1
  22. package/dist/Duration.js +123 -0
  23. package/dist/Duration.js.map +1 -1
  24. package/dist/Effect.d.ts +164 -7
  25. package/dist/Effect.d.ts.map +1 -1
  26. package/dist/Effect.js +11 -1
  27. package/dist/Effect.js.map +1 -1
  28. package/dist/FileSystem.d.ts +59 -4
  29. package/dist/FileSystem.d.ts.map +1 -1
  30. package/dist/FileSystem.js +9 -2
  31. package/dist/FileSystem.js.map +1 -1
  32. package/dist/Glob.d.ts +165 -0
  33. package/dist/Glob.d.ts.map +1 -0
  34. package/dist/Glob.js +127 -0
  35. package/dist/Glob.js.map +1 -0
  36. package/dist/Match.d.ts +86 -0
  37. package/dist/Match.d.ts.map +1 -1
  38. package/dist/Match.js +72 -0
  39. package/dist/Match.js.map +1 -1
  40. package/dist/Pool.d.ts +51 -0
  41. package/dist/Pool.d.ts.map +1 -1
  42. package/dist/Pool.js +59 -9
  43. package/dist/Pool.js.map +1 -1
  44. package/dist/Random.d.ts.map +1 -1
  45. package/dist/Random.js +3 -3
  46. package/dist/Random.js.map +1 -1
  47. package/dist/RcMap.d.ts.map +1 -1
  48. package/dist/RcMap.js +8 -2
  49. package/dist/RcMap.js.map +1 -1
  50. package/dist/Schedule.d.ts +18 -1
  51. package/dist/Schedule.d.ts.map +1 -1
  52. package/dist/Schedule.js +7 -2
  53. package/dist/Schedule.js.map +1 -1
  54. package/dist/Schema.d.ts +666 -41
  55. package/dist/Schema.d.ts.map +1 -1
  56. package/dist/Schema.js +650 -0
  57. package/dist/Schema.js.map +1 -1
  58. package/dist/SchemaGetter.d.ts +6 -1
  59. package/dist/SchemaGetter.d.ts.map +1 -1
  60. package/dist/SchemaGetter.js +22 -11
  61. package/dist/SchemaGetter.js.map +1 -1
  62. package/dist/SchemaRepresentation.d.ts +14 -0
  63. package/dist/SchemaRepresentation.d.ts.map +1 -1
  64. package/dist/SchemaRepresentation.js +16 -0
  65. package/dist/SchemaRepresentation.js.map +1 -1
  66. package/dist/SchemaTransformation.d.ts +8 -3
  67. package/dist/SchemaTransformation.d.ts.map +1 -1
  68. package/dist/SchemaTransformation.js +6 -3
  69. package/dist/SchemaTransformation.js.map +1 -1
  70. package/dist/ScopedCache.d.ts.map +1 -1
  71. package/dist/ScopedCache.js +5 -7
  72. package/dist/ScopedCache.js.map +1 -1
  73. package/dist/Semaphore.d.ts +130 -0
  74. package/dist/Semaphore.d.ts.map +1 -1
  75. package/dist/Semaphore.js +40 -0
  76. package/dist/Semaphore.js.map +1 -1
  77. package/dist/Stream.d.ts +13 -4
  78. package/dist/Stream.d.ts.map +1 -1
  79. package/dist/Stream.js +9 -0
  80. package/dist/Stream.js.map +1 -1
  81. package/dist/Terminal.d.ts +18 -1
  82. package/dist/Terminal.d.ts.map +1 -1
  83. package/dist/Terminal.js +1 -1
  84. package/dist/Terminal.js.map +1 -1
  85. package/dist/ai/AiError.d.ts +43 -116
  86. package/dist/ai/AiError.d.ts.map +1 -1
  87. package/dist/ai/AiError.js +53 -72
  88. package/dist/ai/AiError.js.map +1 -1
  89. package/dist/ai/Decision.d.ts +196 -15
  90. package/dist/ai/Decision.d.ts.map +1 -1
  91. package/dist/ai/Decision.js +130 -0
  92. package/dist/ai/Decision.js.map +1 -1
  93. package/dist/ai/DecisionModel.d.ts +54 -13
  94. package/dist/ai/DecisionModel.d.ts.map +1 -1
  95. package/dist/ai/DecisionModel.js +123 -12
  96. package/dist/ai/DecisionModel.js.map +1 -1
  97. package/dist/ai/McpServer.d.ts +630 -29
  98. package/dist/ai/McpServer.d.ts.map +1 -1
  99. package/dist/ai/McpServer.js +562 -116
  100. package/dist/ai/McpServer.js.map +1 -1
  101. package/dist/ai/McpTest.d.ts +130 -0
  102. package/dist/ai/McpTest.d.ts.map +1 -0
  103. package/dist/ai/McpTest.js +237 -0
  104. package/dist/ai/McpTest.js.map +1 -0
  105. package/dist/ai/Response.d.ts +1 -25
  106. package/dist/ai/Response.d.ts.map +1 -1
  107. package/dist/ai/Response.js +1 -10
  108. package/dist/ai/Response.js.map +1 -1
  109. package/dist/ai/Tool.d.ts +19 -1
  110. package/dist/ai/Tool.d.ts.map +1 -1
  111. package/dist/ai/Tool.js.map +1 -1
  112. package/dist/ai/index.d.ts +5 -0
  113. package/dist/ai/index.d.ts.map +1 -1
  114. package/dist/ai/index.js +5 -0
  115. package/dist/ai/index.js.map +1 -1
  116. package/dist/ai/internal/mcpCore.js +17 -12
  117. package/dist/ai/internal/mcpCore.js.map +1 -1
  118. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +4 -5
  119. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  120. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +4 -5
  121. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  122. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +4 -5
  123. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  124. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +4 -5
  125. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  126. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +18 -10
  127. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  128. package/dist/ai/internal/mcpProtocol.js +13 -0
  129. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  130. package/dist/ai/internal/mcpRuntime.js +5 -3
  131. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  132. package/dist/ai/internal/mcpStatefulRuntime.js +6 -1
  133. package/dist/ai/internal/mcpStatefulRuntime.js.map +1 -1
  134. package/dist/cli/Argument.d.ts +6 -0
  135. package/dist/cli/Argument.d.ts.map +1 -1
  136. package/dist/cli/Argument.js +2 -0
  137. package/dist/cli/Argument.js.map +1 -1
  138. package/dist/cli/CliOutput.d.ts +65 -1
  139. package/dist/cli/CliOutput.d.ts.map +1 -1
  140. package/dist/cli/CliOutput.js +94 -37
  141. package/dist/cli/CliOutput.js.map +1 -1
  142. package/dist/cli/Command.d.ts +23 -0
  143. package/dist/cli/Command.d.ts.map +1 -1
  144. package/dist/cli/Command.js +8 -0
  145. package/dist/cli/Command.js.map +1 -1
  146. package/dist/cli/Flag.d.ts +107 -0
  147. package/dist/cli/Flag.d.ts.map +1 -1
  148. package/dist/cli/Flag.js +37 -0
  149. package/dist/cli/Flag.js.map +1 -1
  150. package/dist/cli/HelpDoc.d.ts +15 -1
  151. package/dist/cli/HelpDoc.d.ts.map +1 -1
  152. package/dist/cli/Param.d.ts +6 -0
  153. package/dist/cli/Param.d.ts.map +1 -1
  154. package/dist/cli/Param.js +2 -0
  155. package/dist/cli/Param.js.map +1 -1
  156. package/dist/cli/Primitive.d.ts +14 -0
  157. package/dist/cli/Primitive.d.ts.map +1 -1
  158. package/dist/cli/Primitive.js +15 -1
  159. package/dist/cli/Primitive.js.map +1 -1
  160. package/dist/cli/Prompt.d.ts +1 -0
  161. package/dist/cli/Prompt.d.ts.map +1 -1
  162. package/dist/cli/Prompt.js +1 -0
  163. package/dist/cli/Prompt.js.map +1 -1
  164. package/dist/cli/internal/help.d.ts.map +1 -1
  165. package/dist/cli/internal/help.js +17 -10
  166. package/dist/cli/internal/help.js.map +1 -1
  167. package/dist/cluster/Sharding.d.ts.map +1 -1
  168. package/dist/cluster/Sharding.js +90 -28
  169. package/dist/cluster/Sharding.js.map +1 -1
  170. package/dist/cluster/ShardingConfig.d.ts +72 -6
  171. package/dist/cluster/ShardingConfig.d.ts.map +1 -1
  172. package/dist/cluster/ShardingConfig.js +4 -0
  173. package/dist/cluster/ShardingConfig.js.map +1 -1
  174. package/dist/cluster/SingleRunner.d.ts +3 -3
  175. package/dist/cluster/SingleRunner.d.ts.map +1 -1
  176. package/dist/cluster/SingleRunner.js +1 -1
  177. package/dist/cluster/SqlMessageStorage.d.ts +37 -6
  178. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  179. package/dist/cluster/SqlMessageStorage.js +34 -7
  180. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  181. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  182. package/dist/cluster/SqlRunnerStorage.js +23 -8
  183. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  184. package/dist/crypto/Aead.d.ts +322 -0
  185. package/dist/crypto/Aead.d.ts.map +1 -0
  186. package/dist/crypto/Aead.js +331 -0
  187. package/dist/crypto/Aead.js.map +1 -0
  188. package/dist/crypto/Cipher.d.ts +235 -0
  189. package/dist/crypto/Cipher.d.ts.map +1 -0
  190. package/dist/crypto/Cipher.js +233 -0
  191. package/dist/crypto/Cipher.js.map +1 -0
  192. package/dist/crypto/CryptoError.d.ts +212 -0
  193. package/dist/crypto/CryptoError.d.ts.map +1 -0
  194. package/dist/crypto/CryptoError.js +202 -0
  195. package/dist/crypto/CryptoError.js.map +1 -0
  196. package/dist/crypto/Digest.d.ts +143 -0
  197. package/dist/crypto/Digest.d.ts.map +1 -0
  198. package/dist/crypto/Digest.js +146 -0
  199. package/dist/crypto/Digest.js.map +1 -0
  200. package/dist/crypto/Kdf.d.ts +220 -0
  201. package/dist/crypto/Kdf.d.ts.map +1 -0
  202. package/dist/crypto/Kdf.js +212 -0
  203. package/dist/crypto/Kdf.js.map +1 -0
  204. package/dist/crypto/KeyAgreement.d.ts +323 -0
  205. package/dist/crypto/KeyAgreement.d.ts.map +1 -0
  206. package/dist/crypto/KeyAgreement.js +303 -0
  207. package/dist/crypto/KeyAgreement.js.map +1 -0
  208. package/dist/crypto/KeyFormat.d.ts +309 -0
  209. package/dist/crypto/KeyFormat.d.ts.map +1 -0
  210. package/dist/crypto/KeyFormat.js +556 -0
  211. package/dist/crypto/KeyFormat.js.map +1 -0
  212. package/dist/crypto/KeyWrap.d.ts +389 -0
  213. package/dist/crypto/KeyWrap.d.ts.map +1 -0
  214. package/dist/crypto/KeyWrap.js +381 -0
  215. package/dist/crypto/KeyWrap.js.map +1 -0
  216. package/dist/crypto/Mac.d.ts +277 -0
  217. package/dist/crypto/Mac.d.ts.map +1 -0
  218. package/dist/crypto/Mac.js +288 -0
  219. package/dist/crypto/Mac.js.map +1 -0
  220. package/dist/crypto/SecureRandom.d.ts +340 -0
  221. package/dist/crypto/SecureRandom.d.ts.map +1 -0
  222. package/dist/crypto/SecureRandom.js +257 -0
  223. package/dist/crypto/SecureRandom.js.map +1 -0
  224. package/dist/crypto/Signature.d.ts +448 -0
  225. package/dist/crypto/Signature.d.ts.map +1 -0
  226. package/dist/crypto/Signature.js +484 -0
  227. package/dist/crypto/Signature.js.map +1 -0
  228. package/dist/crypto/WebCrypto.d.ts +61 -0
  229. package/dist/crypto/WebCrypto.d.ts.map +1 -0
  230. package/dist/crypto/WebCrypto.js +63 -0
  231. package/dist/crypto/WebCrypto.js.map +1 -0
  232. package/dist/crypto/index.d.ts +65 -0
  233. package/dist/crypto/index.d.ts.map +1 -0
  234. package/dist/crypto/index.js +66 -0
  235. package/dist/crypto/index.js.map +1 -0
  236. package/dist/crypto/internal/asymmetric.d.ts +2 -0
  237. package/dist/crypto/internal/asymmetric.d.ts.map +1 -0
  238. package/dist/crypto/internal/asymmetric.js +210 -0
  239. package/dist/crypto/internal/asymmetric.js.map +1 -0
  240. package/dist/crypto/internal/chacha.d.ts +46 -0
  241. package/dist/crypto/internal/chacha.d.ts.map +1 -0
  242. package/dist/crypto/internal/chacha.js +885 -0
  243. package/dist/crypto/internal/chacha.js.map +1 -0
  244. package/dist/crypto/internal/der.d.ts +6 -0
  245. package/dist/crypto/internal/der.d.ts.map +1 -0
  246. package/dist/crypto/internal/der.js +86 -0
  247. package/dist/crypto/internal/der.js.map +1 -0
  248. package/dist/crypto/internal/digest.d.ts +2 -0
  249. package/dist/crypto/internal/digest.d.ts.map +1 -0
  250. package/dist/crypto/internal/digest.js +15 -0
  251. package/dist/crypto/internal/digest.js.map +1 -0
  252. package/dist/crypto/internal/key.d.ts +2 -0
  253. package/dist/crypto/internal/key.d.ts.map +1 -0
  254. package/dist/crypto/internal/key.js +170 -0
  255. package/dist/crypto/internal/key.js.map +1 -0
  256. package/dist/crypto/internal/md5.d.ts +39 -0
  257. package/dist/crypto/internal/md5.d.ts.map +1 -0
  258. package/dist/crypto/internal/md5.js +179 -0
  259. package/dist/crypto/internal/md5.js.map +1 -0
  260. package/dist/crypto/internal/webCrypto.d.ts +2 -0
  261. package/dist/crypto/internal/webCrypto.d.ts.map +1 -0
  262. package/dist/crypto/internal/webCrypto.js +111 -0
  263. package/dist/crypto/internal/webCrypto.js.map +1 -0
  264. package/dist/encoding/Base64Url.d.ts.map +1 -1
  265. package/dist/encoding/Base64Url.js +3 -2
  266. package/dist/encoding/Base64Url.js.map +1 -1
  267. package/dist/encoding/Csv.d.ts +608 -0
  268. package/dist/encoding/Csv.d.ts.map +1 -0
  269. package/dist/encoding/Csv.js +718 -0
  270. package/dist/encoding/Csv.js.map +1 -0
  271. package/dist/encoding/Hex.d.ts +3 -2
  272. package/dist/encoding/Hex.d.ts.map +1 -1
  273. package/dist/encoding/Hex.js +3 -2
  274. package/dist/encoding/Hex.js.map +1 -1
  275. package/dist/encoding/SchemaBinary.d.ts.map +1 -1
  276. package/dist/encoding/SchemaBinary.js +42 -4
  277. package/dist/encoding/SchemaBinary.js.map +1 -1
  278. package/dist/encoding/Toml.d.ts +17 -3
  279. package/dist/encoding/Toml.d.ts.map +1 -1
  280. package/dist/encoding/Toml.js +104 -16
  281. package/dist/encoding/Toml.js.map +1 -1
  282. package/dist/encoding/Yaml.d.ts +8 -1
  283. package/dist/encoding/Yaml.d.ts.map +1 -1
  284. package/dist/encoding/Yaml.js +54 -18
  285. package/dist/encoding/Yaml.js.map +1 -1
  286. package/dist/encoding/index.d.ts +5 -0
  287. package/dist/encoding/index.d.ts.map +1 -1
  288. package/dist/encoding/index.js +5 -0
  289. package/dist/encoding/index.js.map +1 -1
  290. package/dist/eventlog/EventJournal.d.ts.map +1 -1
  291. package/dist/eventlog/EventJournal.js +6 -3
  292. package/dist/eventlog/EventJournal.js.map +1 -1
  293. package/dist/eventlog/EventLog.d.ts +119 -4
  294. package/dist/eventlog/EventLog.d.ts.map +1 -1
  295. package/dist/eventlog/EventLog.js +200 -12
  296. package/dist/eventlog/EventLog.js.map +1 -1
  297. package/dist/eventlog/EventLogEncryption.d.ts +41 -4
  298. package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
  299. package/dist/eventlog/EventLogEncryption.js +83 -64
  300. package/dist/eventlog/EventLogEncryption.js.map +1 -1
  301. package/dist/eventlog/EventLogMessage.d.ts +279 -0
  302. package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
  303. package/dist/eventlog/EventLogMessage.js +217 -1
  304. package/dist/eventlog/EventLogMessage.js.map +1 -1
  305. package/dist/eventlog/EventLogRemote.d.ts +200 -28
  306. package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
  307. package/dist/eventlog/EventLogRemote.js +186 -16
  308. package/dist/eventlog/EventLogRemote.js.map +1 -1
  309. package/dist/eventlog/EventLogServer.d.ts +3 -0
  310. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  311. package/dist/eventlog/EventLogServer.js +18 -10
  312. package/dist/eventlog/EventLogServer.js.map +1 -1
  313. package/dist/eventlog/EventLogServerEncrypted.d.ts +326 -5
  314. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  315. package/dist/eventlog/EventLogServerEncrypted.js +769 -14
  316. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  317. package/dist/eventlog/EventLogSessionAuth.d.ts +5 -3
  318. package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
  319. package/dist/eventlog/EventLogSessionAuth.js +41 -64
  320. package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
  321. package/dist/eventlog/EventRow.d.ts +4 -0
  322. package/dist/eventlog/EventRow.d.ts.map +1 -1
  323. package/dist/eventlog/EventRow.js +12 -2
  324. package/dist/eventlog/EventRow.js.map +1 -1
  325. package/dist/eventlog/SqlEventJournal.js +2 -2
  326. package/dist/eventlog/SqlEventJournal.js.map +1 -1
  327. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +21 -5
  328. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
  329. package/dist/eventlog/SqlEventLogServerEncrypted.js +1048 -113
  330. package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
  331. package/dist/eventlog/SqlEventLogServerUnencrypted.js +2 -2
  332. package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
  333. package/dist/eventlog/internal/batches.d.ts +12 -0
  334. package/dist/eventlog/internal/batches.d.ts.map +1 -0
  335. package/dist/eventlog/internal/batches.js +26 -0
  336. package/dist/eventlog/internal/batches.js.map +1 -0
  337. package/dist/eventlog/internal/compaction.d.ts +38 -0
  338. package/dist/eventlog/internal/compaction.d.ts.map +1 -0
  339. package/dist/eventlog/internal/compaction.js +33 -0
  340. package/dist/eventlog/internal/compaction.js.map +1 -0
  341. package/dist/eventlog/internal/identityRootSecretDerivation.js +66 -67
  342. package/dist/eventlog/internal/identityRootSecretDerivation.js.map +1 -1
  343. package/dist/eventlog/internal/remoteCompaction.d.ts +31 -0
  344. package/dist/eventlog/internal/remoteCompaction.d.ts.map +1 -0
  345. package/dist/eventlog/internal/remoteCompaction.js +76 -0
  346. package/dist/eventlog/internal/remoteCompaction.js.map +1 -0
  347. package/dist/http/Cookies.d.ts +172 -0
  348. package/dist/http/Cookies.d.ts.map +1 -1
  349. package/dist/http/Cookies.js +143 -1
  350. package/dist/http/Cookies.js.map +1 -1
  351. package/dist/http/FetchHttpClient.d.ts +26 -2
  352. package/dist/http/FetchHttpClient.d.ts.map +1 -1
  353. package/dist/http/FetchHttpClient.js +78 -15
  354. package/dist/http/FetchHttpClient.js.map +1 -1
  355. package/dist/http/HttpClient.d.ts +79 -8
  356. package/dist/http/HttpClient.d.ts.map +1 -1
  357. package/dist/http/HttpClient.js +65 -5
  358. package/dist/http/HttpClient.js.map +1 -1
  359. package/dist/http/HttpClientRequest.d.ts +9 -5
  360. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  361. package/dist/http/HttpClientRequest.js +2 -3
  362. package/dist/http/HttpClientRequest.js.map +1 -1
  363. package/dist/http/HttpClientResponse.d.ts.map +1 -1
  364. package/dist/http/HttpClientResponse.js +3 -2
  365. package/dist/http/HttpClientResponse.js.map +1 -1
  366. package/dist/http/HttpMethod.d.ts +7 -1
  367. package/dist/http/HttpMethod.d.ts.map +1 -1
  368. package/dist/http/HttpMethod.js +3 -8
  369. package/dist/http/HttpMethod.js.map +1 -1
  370. package/dist/http/HttpServerRequest.d.ts +5 -2
  371. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  372. package/dist/http/HttpServerRequest.js +6 -17
  373. package/dist/http/HttpServerRequest.js.map +1 -1
  374. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  375. package/dist/http/HttpServerResponse.js +3 -2
  376. package/dist/http/HttpServerResponse.js.map +1 -1
  377. package/dist/http/HttpTraceContext.d.ts +2 -1
  378. package/dist/http/HttpTraceContext.d.ts.map +1 -1
  379. package/dist/http/HttpTraceContext.js +7 -5
  380. package/dist/http/HttpTraceContext.js.map +1 -1
  381. package/dist/http/ProblemDetails.d.ts +96 -0
  382. package/dist/http/ProblemDetails.d.ts.map +1 -0
  383. package/dist/http/ProblemDetails.js +98 -0
  384. package/dist/http/ProblemDetails.js.map +1 -0
  385. package/dist/http/index.d.ts +5 -0
  386. package/dist/http/index.d.ts.map +1 -1
  387. package/dist/http/index.js +5 -0
  388. package/dist/http/index.js.map +1 -1
  389. package/dist/http/internal/decompression.js +3 -2
  390. package/dist/http/internal/decompression.js.map +1 -1
  391. package/dist/http/internal/urlParams.js +8 -0
  392. package/dist/http/internal/urlParams.js.map +1 -1
  393. package/dist/http-api/HttpApiBuilder.js +19 -5
  394. package/dist/http-api/HttpApiBuilder.js.map +1 -1
  395. package/dist/http-api/HttpApiClient.d.ts +63 -0
  396. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  397. package/dist/http-api/HttpApiClient.js +51 -0
  398. package/dist/http-api/HttpApiClient.js.map +1 -1
  399. package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
  400. package/dist/http-api/HttpApiEndpoint.js +14 -5
  401. package/dist/http-api/HttpApiEndpoint.js.map +1 -1
  402. package/dist/http-api/HttpApiError.d.ts +185 -13
  403. package/dist/http-api/HttpApiError.d.ts.map +1 -1
  404. package/dist/http-api/HttpApiError.js +128 -0
  405. package/dist/http-api/HttpApiError.js.map +1 -1
  406. package/dist/http-api/HttpApiMiddleware.d.ts +64 -17
  407. package/dist/http-api/HttpApiMiddleware.d.ts.map +1 -1
  408. package/dist/http-api/HttpApiMiddleware.js +85 -1
  409. package/dist/http-api/HttpApiMiddleware.js.map +1 -1
  410. package/dist/http-api/HttpApiSchema.d.ts +76 -14
  411. package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
  412. package/dist/http-api/HttpApiSchema.js +53 -0
  413. package/dist/http-api/HttpApiSchema.js.map +1 -1
  414. package/dist/index.d.ts +5 -5
  415. package/dist/index.d.ts.map +1 -1
  416. package/dist/index.js +5 -5
  417. package/dist/index.js.map +1 -1
  418. package/dist/internal/effect.js +25 -14
  419. package/dist/internal/effect.js.map +1 -1
  420. package/dist/internal/glob.d.ts +2 -0
  421. package/dist/internal/glob.d.ts.map +1 -0
  422. package/dist/internal/glob.js +630 -0
  423. package/dist/internal/glob.js.map +1 -0
  424. package/dist/internal/matcher.js +10 -0
  425. package/dist/internal/matcher.js.map +1 -1
  426. package/dist/internal/persistence.js +9 -0
  427. package/dist/internal/persistence.js.map +1 -1
  428. package/dist/internal/rcRef.js +4 -1
  429. package/dist/internal/rcRef.js.map +1 -1
  430. package/dist/internal/schema/toCodeDocument.js +6 -3
  431. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  432. package/dist/internal/trie.js +42 -13
  433. package/dist/internal/trie.js.map +1 -1
  434. package/dist/internal/ulid.js +41 -0
  435. package/dist/internal/ulid.js.map +1 -1
  436. package/dist/internal/uuid.js +52 -8
  437. package/dist/internal/uuid.js.map +1 -1
  438. package/dist/internal/version.js +1 -1
  439. package/dist/observability/Otlp.d.ts +15 -4
  440. package/dist/observability/Otlp.d.ts.map +1 -1
  441. package/dist/observability/Otlp.js +10 -0
  442. package/dist/observability/Otlp.js.map +1 -1
  443. package/dist/observability/OtlpResource.d.ts +7 -0
  444. package/dist/observability/OtlpResource.d.ts.map +1 -1
  445. package/dist/observability/OtlpResource.js +11 -1
  446. package/dist/observability/OtlpResource.js.map +1 -1
  447. package/dist/persistence/KeyValueStore.d.ts +47 -2
  448. package/dist/persistence/KeyValueStore.d.ts.map +1 -1
  449. package/dist/persistence/KeyValueStore.js +129 -18
  450. package/dist/persistence/KeyValueStore.js.map +1 -1
  451. package/dist/persistence/PersistedQueue.d.ts +9 -0
  452. package/dist/persistence/PersistedQueue.d.ts.map +1 -1
  453. package/dist/persistence/PersistedQueue.js +94 -52
  454. package/dist/persistence/PersistedQueue.js.map +1 -1
  455. package/dist/persistence/Persistence.d.ts +10 -4
  456. package/dist/persistence/Persistence.d.ts.map +1 -1
  457. package/dist/persistence/Persistence.js +18 -11
  458. package/dist/persistence/Persistence.js.map +1 -1
  459. package/dist/process/ChildProcess.d.ts +207 -67
  460. package/dist/process/ChildProcess.d.ts.map +1 -1
  461. package/dist/process/ChildProcess.js +56 -158
  462. package/dist/process/ChildProcess.js.map +1 -1
  463. package/dist/process/ChildProcessSpawner.d.ts +5 -0
  464. package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
  465. package/dist/process/ChildProcessSpawner.js.map +1 -1
  466. package/dist/process/CommandLine.d.ts +294 -0
  467. package/dist/process/CommandLine.d.ts.map +1 -0
  468. package/dist/process/CommandLine.js +481 -0
  469. package/dist/process/CommandLine.js.map +1 -0
  470. package/dist/process/index.d.ts +5 -0
  471. package/dist/process/index.d.ts.map +1 -1
  472. package/dist/process/index.js +5 -0
  473. package/dist/process/index.js.map +1 -1
  474. package/dist/reactivity/Atom.d.ts +2 -1
  475. package/dist/reactivity/Atom.d.ts.map +1 -1
  476. package/dist/reactivity/Atom.js +3 -4
  477. package/dist/reactivity/Atom.js.map +1 -1
  478. package/dist/reactivity/AtomRegistry.js.map +1 -1
  479. package/dist/rpc/RpcClient.d.ts +16 -1
  480. package/dist/rpc/RpcClient.d.ts.map +1 -1
  481. package/dist/rpc/RpcClient.js +50 -16
  482. package/dist/rpc/RpcClient.js.map +1 -1
  483. package/dist/rpc/RpcMessage.d.ts +10 -1
  484. package/dist/rpc/RpcMessage.d.ts.map +1 -1
  485. package/dist/rpc/RpcMessage.js +1 -0
  486. package/dist/rpc/RpcMessage.js.map +1 -1
  487. package/dist/rpc/RpcSerialization.d.ts.map +1 -1
  488. package/dist/rpc/RpcSerialization.js +6 -0
  489. package/dist/rpc/RpcSerialization.js.map +1 -1
  490. package/dist/rpc/RpcServer.d.ts +31 -0
  491. package/dist/rpc/RpcServer.d.ts.map +1 -1
  492. package/dist/rpc/RpcServer.js +139 -66
  493. package/dist/rpc/RpcServer.js.map +1 -1
  494. package/dist/schema/Model.d.ts +14 -0
  495. package/dist/schema/Model.d.ts.map +1 -1
  496. package/dist/schema/Model.js +18 -3
  497. package/dist/schema/Model.js.map +1 -1
  498. package/dist/sql/Migrator.d.ts +0 -19
  499. package/dist/sql/Migrator.d.ts.map +1 -1
  500. package/dist/sql/Migrator.js +3 -48
  501. package/dist/sql/Migrator.js.map +1 -1
  502. package/dist/sql/MigratorFileSystem.d.ts +21 -0
  503. package/dist/sql/MigratorFileSystem.d.ts.map +1 -0
  504. package/dist/sql/MigratorFileSystem.js +57 -0
  505. package/dist/sql/MigratorFileSystem.js.map +1 -0
  506. package/dist/sql/SqlClient.d.ts.map +1 -1
  507. package/dist/sql/SqlClient.js +5 -9
  508. package/dist/sql/SqlClient.js.map +1 -1
  509. package/dist/sql/Statement.d.ts +20 -6
  510. package/dist/sql/Statement.d.ts.map +1 -1
  511. package/dist/sql/Statement.js +0 -13
  512. package/dist/sql/Statement.js.map +1 -1
  513. package/dist/sql/index.js +1 -1
  514. package/dist/testing/index.d.ts +0 -5
  515. package/dist/testing/index.d.ts.map +1 -1
  516. package/dist/testing/index.js +0 -5
  517. package/dist/testing/index.js.map +1 -1
  518. package/dist/workflow/internal/crypto.js +9 -8
  519. package/dist/workflow/internal/crypto.js.map +1 -1
  520. package/package.json +3 -1
  521. package/src/BigDecimal.ts +3 -0
  522. package/src/Channel.ts +17 -11
  523. package/src/Config.ts +7 -1
  524. package/src/Context.ts +34 -10
  525. package/src/Cron.ts +178 -29
  526. package/src/Duration.ts +140 -0
  527. package/src/Effect.ts +914 -85
  528. package/src/FileSystem.ts +65 -4
  529. package/src/Glob.ts +205 -0
  530. package/src/Match.ts +127 -0
  531. package/src/Pool.ts +73 -15
  532. package/src/Random.ts +3 -3
  533. package/src/RcMap.ts +5 -1
  534. package/src/Schedule.ts +26 -3
  535. package/src/Schema.ts +1189 -62
  536. package/src/SchemaGetter.ts +27 -11
  537. package/src/SchemaRepresentation.ts +19 -0
  538. package/src/SchemaTransformation.ts +8 -3
  539. package/src/ScopedCache.ts +5 -9
  540. package/src/Semaphore.ts +141 -0
  541. package/src/Stream.ts +15 -6
  542. package/src/Terminal.ts +19 -1
  543. package/src/ai/AiError.ts +56 -80
  544. package/src/ai/Decision.ts +257 -6
  545. package/src/ai/DecisionModel.ts +171 -28
  546. package/src/ai/McpServer.ts +1269 -286
  547. package/src/ai/McpTest.ts +380 -0
  548. package/src/ai/Response.ts +2 -22
  549. package/src/ai/Tool.ts +27 -8
  550. package/src/ai/index.ts +6 -0
  551. package/src/ai/internal/mcpCore.ts +78 -44
  552. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +4 -7
  553. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +4 -7
  554. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +4 -7
  555. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +4 -7
  556. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +15 -10
  557. package/src/ai/internal/mcpProtocol.ts +29 -0
  558. package/src/ai/internal/mcpRuntime.ts +9 -5
  559. package/src/ai/internal/mcpStatefulRuntime.ts +14 -2
  560. package/src/cli/Argument.ts +6 -0
  561. package/src/cli/CliOutput.ts +117 -49
  562. package/src/cli/Command.ts +23 -0
  563. package/src/cli/Flag.ts +107 -0
  564. package/src/cli/HelpDoc.ts +18 -1
  565. package/src/cli/Param.ts +6 -0
  566. package/src/cli/Primitive.ts +16 -1
  567. package/src/cli/Prompt.ts +1 -0
  568. package/src/cli/internal/help.ts +21 -9
  569. package/src/cluster/Sharding.ts +93 -26
  570. package/src/cluster/ShardingConfig.ts +41 -3
  571. package/src/cluster/SingleRunner.ts +3 -3
  572. package/src/cluster/SqlMessageStorage.ts +49 -17
  573. package/src/cluster/SqlRunnerStorage.ts +37 -27
  574. package/src/crypto/Aead.ts +517 -0
  575. package/src/crypto/Cipher.ts +326 -0
  576. package/src/crypto/CryptoError.ts +242 -0
  577. package/src/crypto/Digest.ts +167 -0
  578. package/src/crypto/Kdf.ts +315 -0
  579. package/src/crypto/KeyAgreement.ts +489 -0
  580. package/src/crypto/KeyFormat.ts +712 -0
  581. package/src/crypto/KeyWrap.ts +639 -0
  582. package/src/crypto/Mac.ts +386 -0
  583. package/src/crypto/SecureRandom.ts +459 -0
  584. package/src/crypto/Signature.ts +673 -0
  585. package/src/crypto/WebCrypto.ts +64 -0
  586. package/src/crypto/index.ts +78 -0
  587. package/src/crypto/internal/asymmetric.ts +329 -0
  588. package/src/crypto/internal/chacha.ts +1088 -0
  589. package/src/crypto/internal/der.ts +110 -0
  590. package/src/crypto/internal/digest.ts +16 -0
  591. package/src/crypto/internal/key.ts +235 -0
  592. package/src/crypto/internal/md5.ts +170 -0
  593. package/src/crypto/internal/webCrypto.ts +150 -0
  594. package/src/encoding/Base64Url.ts +5 -2
  595. package/src/encoding/Csv.ts +1298 -0
  596. package/src/encoding/Hex.ts +3 -2
  597. package/src/encoding/SchemaBinary.ts +40 -4
  598. package/src/encoding/Toml.ts +85 -20
  599. package/src/encoding/Yaml.ts +61 -18
  600. package/src/encoding/index.ts +6 -0
  601. package/src/eventlog/EventJournal.ts +4 -3
  602. package/src/eventlog/EventLog.ts +340 -15
  603. package/src/eventlog/EventLogEncryption.ts +118 -110
  604. package/src/eventlog/EventLogMessage.ts +273 -1
  605. package/src/eventlog/EventLogRemote.ts +367 -23
  606. package/src/eventlog/EventLogServer.ts +23 -8
  607. package/src/eventlog/EventLogServerEncrypted.ts +1130 -67
  608. package/src/eventlog/EventLogSessionAuth.ts +56 -70
  609. package/src/eventlog/EventRow.ts +12 -3
  610. package/src/eventlog/SqlEventJournal.ts +2 -2
  611. package/src/eventlog/SqlEventLogServerEncrypted.ts +1244 -136
  612. package/src/eventlog/SqlEventLogServerUnencrypted.ts +2 -2
  613. package/src/eventlog/internal/batches.ts +30 -0
  614. package/src/eventlog/internal/compaction.ts +64 -0
  615. package/src/eventlog/internal/identityRootSecretDerivation.ts +93 -123
  616. package/src/eventlog/internal/remoteCompaction.ts +92 -0
  617. package/src/http/Cookies.ts +281 -1
  618. package/src/http/FetchHttpClient.ts +88 -16
  619. package/src/http/HttpClient.ts +89 -22
  620. package/src/http/HttpClientRequest.ts +12 -9
  621. package/src/http/HttpClientResponse.ts +3 -2
  622. package/src/http/HttpMethod.ts +10 -2
  623. package/src/http/HttpServerRequest.ts +15 -30
  624. package/src/http/HttpServerResponse.ts +3 -2
  625. package/src/http/HttpTraceContext.ts +7 -4
  626. package/src/http/ProblemDetails.ts +149 -0
  627. package/src/http/index.ts +6 -0
  628. package/src/http/internal/decompression.ts +4 -4
  629. package/src/http/internal/urlParams.ts +8 -0
  630. package/src/http-api/HttpApiBuilder.ts +24 -12
  631. package/src/http-api/HttpApiClient.ts +67 -1
  632. package/src/http-api/HttpApiEndpoint.ts +14 -5
  633. package/src/http-api/HttpApiError.ts +250 -0
  634. package/src/http-api/HttpApiMiddleware.ts +95 -1
  635. package/src/http-api/HttpApiSchema.ts +105 -14
  636. package/src/index.ts +6 -6
  637. package/src/internal/effect.ts +34 -18
  638. package/src/internal/glob.ts +736 -0
  639. package/src/internal/matcher.ts +17 -0
  640. package/src/internal/persistence.ts +11 -0
  641. package/src/internal/rcRef.ts +4 -1
  642. package/src/internal/schema/toCodeDocument.ts +7 -3
  643. package/src/internal/trie.ts +43 -14
  644. package/src/internal/ulid.ts +44 -0
  645. package/src/internal/uuid.ts +57 -16
  646. package/src/internal/version.ts +1 -1
  647. package/src/observability/Otlp.ts +21 -4
  648. package/src/observability/OtlpResource.ts +9 -1
  649. package/src/persistence/KeyValueStore.ts +219 -22
  650. package/src/persistence/PersistedQueue.ts +128 -59
  651. package/src/persistence/Persistence.ts +20 -13
  652. package/src/process/ChildProcess.ts +255 -260
  653. package/src/process/ChildProcessSpawner.ts +5 -0
  654. package/src/process/CommandLine.ts +630 -0
  655. package/src/process/index.ts +6 -0
  656. package/src/reactivity/Atom.ts +5 -5
  657. package/src/reactivity/AtomRegistry.ts +1 -1
  658. package/src/rpc/RpcClient.ts +62 -26
  659. package/src/rpc/RpcMessage.ts +10 -1
  660. package/src/rpc/RpcSerialization.ts +3 -0
  661. package/src/rpc/RpcServer.ts +176 -78
  662. package/src/schema/Model.ts +26 -3
  663. package/src/sql/Migrator.ts +4 -63
  664. package/src/sql/MigratorFileSystem.ts +71 -0
  665. package/src/sql/SqlClient.ts +2 -16
  666. package/src/sql/Statement.ts +8 -7
  667. package/src/sql/index.ts +1 -1
  668. package/src/testing/index.ts +0 -6
  669. package/src/workflow/internal/crypto.ts +15 -11
  670. package/dist/Crypto.d.ts +0 -244
  671. package/dist/Crypto.d.ts.map +0 -1
  672. package/dist/Crypto.js +0 -139
  673. package/dist/Crypto.js.map +0 -1
  674. package/dist/testing/TestCrypto.d.ts +0 -73
  675. package/dist/testing/TestCrypto.d.ts.map +0 -1
  676. package/dist/testing/TestCrypto.js +0 -87
  677. package/dist/testing/TestCrypto.js.map +0 -1
  678. package/src/Crypto.ts +0 -347
  679. package/src/testing/TestCrypto.ts +0 -94
package/src/Cron.ts CHANGED
@@ -28,6 +28,60 @@ import type { Mutable } from "./Types.ts"
28
28
 
29
29
  const TypeId = "~effect/Cron"
30
30
 
31
+ /**
32
+ * Chooses which occurrences of a repeated wall-clock time a `Cron` schedule
33
+ * includes.
34
+ *
35
+ * **When to use**
36
+ *
37
+ * Use to control how a schedule behaves when clocks fall back, for example at
38
+ * the end of daylight saving time, and a range of local times occurs twice.
39
+ *
40
+ * **Details**
41
+ *
42
+ * Despite the name, the policy applies to every repeated local time, not only
43
+ * those caused by daylight saving time. For example, Antarctica/Casey repeated
44
+ * 00:00-02:59 on 2023-03-09 when its standard offset changed from +11:00 to
45
+ * +08:00.
46
+ *
47
+ * - `"earlier"` (default) includes only the first occurrence, before the
48
+ * offset change.
49
+ * - `"later"` includes only the second occurrence, after the offset change.
50
+ * - `"both"` includes both occurrences, in chronological order.
51
+ *
52
+ * Time zones without repeated times, such as UTC or fixed offsets, behave the
53
+ * same under every policy.
54
+ *
55
+ * **Gotchas**
56
+ *
57
+ * The policy does not apply to local times skipped when clocks move forward. A
58
+ * matching time inside such a gap resolves to the instant after the gap, the
59
+ * same under every policy, and near a gap `next` and `prev` are not guaranteed
60
+ * to return the nearest matching instant.
61
+ *
62
+ * **Example** (Running every occurrence of a repeated hour)
63
+ *
64
+ * ```ts import.meta.vitest
65
+ * import { Cron } from "effect"
66
+ *
67
+ * // Europe/Berlin repeats 02:00-02:59 on 2026-10-25, first at +02:00
68
+ * // (00:30Z) and again at +01:00 (01:30Z)
69
+ * const earlier = Cron.parseUnsafe("30 2 * * *", "Europe/Berlin")
70
+ * const both = Cron.parseUnsafe("30 2 * * *", "Europe/Berlin", { onDstOverlap: "both" })
71
+ *
72
+ * Cron.next(earlier, "2026-10-25T00:30:00Z").toISOString() // => "2026-10-26T01:30:00.000Z"
73
+ * Cron.next(both, "2026-10-25T00:30:00Z").toISOString() // => "2026-10-25T01:30:00.000Z"
74
+ * ```
75
+ *
76
+ * @see {@link make} for setting the policy from explicit field constraints
77
+ * @see {@link parse} for setting the policy when parsing an expression
78
+ *
79
+ * @stability stable
80
+ * @category models
81
+ * @since 4.1.0
82
+ */
83
+ export type DstOverlapPolicy = "earlier" | "later" | "both"
84
+
31
85
  /**
32
86
  * Represents a cron schedule with time constraints and timezone information.
33
87
  *
@@ -79,6 +133,7 @@ export interface Cron extends Pipeable, Equal.Equal, Inspectable {
79
133
  readonly days: ReadonlySet<number>
80
134
  readonly months: ReadonlySet<number>
81
135
  readonly weekdays: ReadonlySet<number>
136
+ readonly onDstOverlap: DstOverlapPolicy
82
137
  /** @internal */
83
138
  readonly and: boolean
84
139
  /** @internal */
@@ -128,7 +183,8 @@ function toPojo(cron: Cron): Record<string, unknown> {
128
183
  hours: Arr.fromIterable(cron.hours),
129
184
  days: Arr.fromIterable(cron.days),
130
185
  months: Arr.fromIterable(cron.months),
131
- weekdays: Arr.fromIterable(cron.weekdays)
186
+ weekdays: Arr.fromIterable(cron.weekdays),
187
+ onDstOverlap: cron.onDstOverlap
132
188
  }
133
189
  return out
134
190
  }
@@ -147,7 +203,8 @@ const CronProto = {
147
203
  Hash.combine(Hash.array(Arr.fromIterable(this.hours))),
148
204
  Hash.combine(Hash.array(Arr.fromIterable(this.days))),
149
205
  Hash.combine(Hash.array(Arr.fromIterable(this.months))),
150
- Hash.combine(Hash.array(Arr.fromIterable(this.weekdays)))
206
+ Hash.combine(Hash.array(Arr.fromIterable(this.weekdays))),
207
+ Hash.combine(Hash.hash(this.onDstOverlap))
151
208
  )
152
209
  },
153
210
  toObject(this: Cron) {
@@ -223,8 +280,9 @@ export const isCron = (u: unknown): u is Cron => hasProperty(u, TypeId)
223
280
  * time unit unrestricted. If only days or weekdays are restricted, that field
224
281
  * must match. When both are restricted, the default matches either field; set
225
282
  * `and: true` to require both fields to match. Weekdays range from `0` (Sunday)
226
- * to `7` (also Sunday). The constructor throws a `RangeError` when a field
227
- * contains a non-integer or out-of-range value.
283
+ * to `7` (also Sunday). `onDstOverlap` chooses which occurrences of repeated
284
+ * local times are included and defaults to `"earlier"`. The constructor throws a
285
+ * `RangeError` when a field contains a non-integer or out-of-range value.
228
286
  *
229
287
  * **Example** (Creating schedules from constraints)
230
288
  *
@@ -304,6 +362,7 @@ export const make = (values: {
304
362
  readonly weekdays: Iterable<number>
305
363
  readonly and?: boolean | undefined
306
364
  readonly tz?: DateTime.TimeZone | undefined
365
+ readonly onDstOverlap?: DstOverlapPolicy | undefined
307
366
  }): Cron => {
308
367
  const o: Mutable<Cron> = Object.create(CronProto)
309
368
  o.seconds = restrictions.seconds(values.seconds ?? [0])
@@ -314,6 +373,7 @@ export const make = (values: {
314
373
  o.weekdays = restrictions.weekdays(values.weekdays)
315
374
  o.and = values.and === true
316
375
  o.tz = Option.fromUndefinedOr(values.tz)
376
+ o.onDstOverlap = values.onDstOverlap ?? "earlier"
317
377
 
318
378
  const seconds = Array.from(o.seconds)
319
379
  const minutes = Array.from(o.minutes)
@@ -529,6 +589,8 @@ export const isCronParseError = (u: unknown): u is CronParseError => hasProperty
529
589
  * `CronParseError`. When both the day-of-month and weekday fields are
530
590
  * restricted, a date matches if either field matches. When either field starts
531
591
  * with `*`, both fields must match; an unrestricted field always matches.
592
+ * `options.onDstOverlap` chooses which occurrences of repeated local times are
593
+ * included and defaults to `"earlier"`.
532
594
  *
533
595
  * **Example** (Parsing cron expressions)
534
596
  *
@@ -549,7 +611,9 @@ export const isCronParseError = (u: unknown): u is CronParseError => hasProperty
549
611
  * @category constructors
550
612
  * @since 2.0.0
551
613
  */
552
- export const parse = (cron: string, tz?: DateTime.TimeZone | string): Result.Result<Cron, CronParseError> => {
614
+ export const parse = (cron: string, tz?: DateTime.TimeZone | string, options?: {
615
+ readonly onDstOverlap?: DstOverlapPolicy | undefined
616
+ }): Result.Result<Cron, CronParseError> => {
553
617
  const segments = cron.trim().split(/\s+/).filter(String.isNonEmpty)
554
618
  if (segments.length !== 5 && segments.length !== 6) {
555
619
  return Result.fail(new CronParseError({ message: `Invalid number of segments in cron expression`, input: cron }))
@@ -584,7 +648,8 @@ export const parse = (cron: string, tz?: DateTime.TimeZone | string): Result.Res
584
648
  days: days.values,
585
649
  months: months.values,
586
650
  weekdays: weekdays.values,
587
- and: (days.wildcard || weekdays.wildcard) && days.values.size !== 0 && weekdays.values.size !== 0
651
+ and: (days.wildcard || weekdays.wildcard) && days.values.size !== 0 && weekdays.values.size !== 0,
652
+ onDstOverlap: options?.onDstOverlap
588
653
  })
589
654
  ))
590
655
  }
@@ -618,7 +683,9 @@ export const parse = (cron: string, tz?: DateTime.TimeZone | string): Result.Res
618
683
  * @category constructors
619
684
  * @since 4.0.0
620
685
  */
621
- export const parseUnsafe = (cron: string, tz?: DateTime.TimeZone | string): Cron => Result.getOrThrow(parse(cron, tz))
686
+ export const parseUnsafe = (cron: string, tz?: DateTime.TimeZone | string, options?: {
687
+ readonly onDstOverlap?: DstOverlapPolicy | undefined
688
+ }): Cron => Result.getOrThrow(parse(cron, tz, options))
622
689
 
623
690
  /**
624
691
  * Formats a `Cron` instance as a cron expression.
@@ -630,8 +697,8 @@ export const parseUnsafe = (cron: string, tz?: DateTime.TimeZone | string): Cron
630
697
  *
631
698
  * **Gotchas**
632
699
  *
633
- * Formatting drops the timezone information and the `and` restriction between
634
- * days and weekdays. Parsing the result is therefore not guaranteed to produce
700
+ * Formatting drops the timezone information, the `onDstOverlap` policy, and
701
+ * the `and` restriction between days and weekdays. Parsing the result is therefore not guaranteed to produce
635
702
  * an equivalent schedule.
636
703
  *
637
704
  * **Example** (Formatting a cron expression)
@@ -777,7 +844,9 @@ const daysInMonth = (date: Date): number =>
777
844
  *
778
845
  * Searches for the next date and time when the cron schedule should trigger,
779
846
  * starting after the specified date/time or after the current time when no
780
- * date is provided.
847
+ * date is provided. The result is always strictly after the starting point.
848
+ * Repeated local times are included according to the schedule's
849
+ * `onDstOverlap` policy.
781
850
  *
782
851
  * **Example** (Finding the next occurrence)
783
852
  *
@@ -812,6 +881,8 @@ export const next = (cron: Cron, now?: DateTime.DateTime.Input): Date => {
812
881
  * **Details**
813
882
  *
814
883
  * When no date/time is provided, the search starts from the current time.
884
+ * Repeated local times are included according to the schedule's
885
+ * `onDstOverlap` policy.
815
886
  *
816
887
  * **Gotchas**
817
888
  *
@@ -829,8 +900,28 @@ export const prev = (cron: Cron, now?: DateTime.DateTime.Input): Date => {
829
900
  }
830
901
 
831
902
  const stepCron = (cron: Cron, now: DateTime.DateTime.Input | undefined, direction: "next" | "prev"): Date => {
903
+ const start = now ?? new Date()
904
+ if (cron.onDstOverlap !== "both") {
905
+ return searchCron(cron, start, direction, cron.onDstOverlap)
906
+ }
907
+ // Both occurrences are eligible, so the result is the nearest of the two
908
+ // single-occurrence searches in the search direction.
909
+ const earlier = searchCron(cron, start, direction, "earlier")
910
+ const later = searchCron(cron, start, direction, "later")
911
+ if (direction === "next") {
912
+ return earlier <= later ? earlier : later
913
+ }
914
+ return earlier >= later ? earlier : later
915
+ }
916
+
917
+ const searchCron = (
918
+ cron: Cron,
919
+ now: DateTime.DateTime.Input,
920
+ direction: "next" | "prev",
921
+ onDstOverlap: "earlier" | "later"
922
+ ): Date => {
832
923
  const tz = Option.getOrUndefined(cron.tz)
833
- const zoned = dateTime.makeZonedUnsafe(now ?? new Date(), {
924
+ const zoned = dateTime.makeZonedUnsafe(now, {
834
925
  timeZone: tz
835
926
  })
836
927
 
@@ -844,28 +935,81 @@ const stepCron = (cron: Cron, now: DateTime.DateTime.Input | undefined, directio
844
935
  (next: number, current: number) => next > current
845
936
 
846
937
  const utc = tz !== undefined && dateTime.isTimeZoneNamed(tz) && tz.id === "UTC"
847
- const adjustDst = utc ? constVoid : (current: Date) => {
938
+ // Going backward, a candidate inside a gap is left in place: it resolves to
939
+ // the instant after the gap, and the range check below rejects it when that
940
+ // instant is not before the input.
941
+ const adjustDst = utc || reverse ? constVoid : (current: Date) => {
848
942
  const adjusted = dateTime.makeZonedUnsafe(current, {
849
943
  timeZone: zoned.zone,
850
- adjustForTimeZone: true,
851
- disambiguation: reverse ? "later" : undefined
944
+ adjustForTimeZone: true
852
945
  }).pipe(dateTime.toDate)
853
946
 
854
947
  const drift = current.getTime() - adjusted.getTime()
855
- if (reverse ? drift !== 0 : drift > 0) {
856
- current.setTime(reverse ? adjusted.getTime() : current.getTime() + drift)
948
+ if (drift > 0) {
949
+ current.setTime(current.getTime() + drift)
857
950
  }
858
951
  }
859
952
 
860
- // Repeated wall times resolve to their first occurrence, so when the search
861
- // starts in the second occurrence, matches inside that fold are in the past.
862
- const isBeforeStart = reverse || utc ? constFalse : (current: Date) =>
863
- dateTime.makeZonedUnsafe(current, {
953
+ // Repeated wall times resolve to the occurrence chosen by the policy. Gaps
954
+ // resolve to the instant after the gap under either disambiguation.
955
+ const disambiguation = onDstOverlap === "later" ? "later" : "compatible"
956
+ const resolve = (wallMillis: number) =>
957
+ dateTime.makeZonedUnsafe(wallMillis, {
864
958
  timeZone: zoned.zone,
865
- adjustForTimeZone: true
866
- }).epochMilliseconds <= zoned.epochMilliseconds
959
+ adjustForTimeZone: true,
960
+ disambiguation
961
+ }).epochMilliseconds
962
+
963
+ // Inside a fold, wall-clock order differs from instant order, so a candidate
964
+ // can resolve to an instant on the wrong side of the input.
965
+ const isOutOfRange = utc ? constFalse : reverse ?
966
+ (wallMillis: number) => resolve(wallMillis) >= zoned.epochMilliseconds :
967
+ (wallMillis: number) => resolve(wallMillis) <= zoned.epochMilliseconds
968
+
969
+ // A fold near the input shows as a larger offset a day before it than a day
970
+ // after it (DateTime disambiguation assumes the same single transition).
971
+ // Inside a fold the resolved instant moves in the same direction as the wall
972
+ // time, so the rejected candidates form one interval no longer than the
973
+ // fold: when the wall time one fold length ahead is in range, binary search
974
+ // for the first second in range instead of stepping through the interval.
975
+ // Gaps break that ordering, so they keep stepping one second at a time.
976
+ let foldSeconds: number | undefined
977
+ const skipOutOfRange = (current: Date) => {
978
+ if (foldSeconds === undefined) {
979
+ const offsetAt = (millis: number) =>
980
+ dateTime.zonedOffset(dateTime.makeZonedUnsafe(millis, { timeZone: zoned.zone }))
981
+ foldSeconds = Math.floor(
982
+ (offsetAt(zoned.epochMilliseconds - 86_400_000) - offsetAt(zoned.epochMilliseconds + 86_400_000)) / 1000
983
+ )
984
+ }
985
+ const after = (seconds: number) => current.getTime() + tick * seconds * 1000
986
+ let outOfRange = 0
987
+ let inRange = 1
988
+ if (foldSeconds > 0 && !isOutOfRange(after(foldSeconds))) {
989
+ inRange = foldSeconds
990
+ while (inRange - outOfRange > 1) {
991
+ const mid = outOfRange + Math.floor((inRange - outOfRange) / 2)
992
+ if (isOutOfRange(after(mid))) {
993
+ outOfRange = mid
994
+ } else {
995
+ inRange = mid
996
+ }
997
+ }
998
+ }
999
+ current.setTime(after(inRange))
1000
+ }
867
1001
 
868
1002
  const result = dateTime.mutate(zoned, (current) => {
1003
+ // When the input is in the occurrence the policy excludes, eligible
1004
+ // instants of the same fold can lie behind its wall time in the search
1005
+ // direction. Start from the wall time of the input under the policy's
1006
+ // offset so they are visited; candidates that resolve on the wrong side
1007
+ // of the input are skipped below.
1008
+ const shift = utc ? 0 : zoned.epochMilliseconds - resolve(current.getTime())
1009
+ if (reverse ? shift > 0 : shift < 0) {
1010
+ current.setTime(current.getTime() + shift)
1011
+ }
1012
+
869
1013
  // Start from the nearest whole second strictly past the input in the search
870
1014
  // direction. Going backward, a fractional input already has one.
871
1015
  const offset = reverse && current.getUTCMilliseconds() > 0 ? 0 : tick
@@ -1011,8 +1155,8 @@ const stepCron = (cron: Cron, now: DateTime.DateTime.Input | undefined, directio
1011
1155
  }
1012
1156
  }
1013
1157
 
1014
- if (isBeforeStart(current)) {
1015
- current.setUTCSeconds(current.getUTCSeconds() + 1)
1158
+ if (isOutOfRange(current.getTime())) {
1159
+ skipOutOfRange(current)
1016
1160
  i = -1 // skipped fold candidates do not count against the search budget
1017
1161
  continue
1018
1162
  }
@@ -1021,7 +1165,7 @@ const stepCron = (cron: Cron, now: DateTime.DateTime.Input | undefined, directio
1021
1165
  }
1022
1166
 
1023
1167
  throw new Error("Unable to find cron date")
1024
- })
1168
+ }, { disambiguation })
1025
1169
 
1026
1170
  return dateTime.toDateUtc(result)
1027
1171
  }
@@ -1084,7 +1228,8 @@ export const sequence = function*(cron: Cron, now?: DateTime.DateTime.Input): It
1084
1228
  * **Details**
1085
1229
  *
1086
1230
  * This comparison checks the optional timezone, the `and` day-matching mode,
1087
- * seconds, minutes, hours, days, months, and weekdays.
1231
+ * the `onDstOverlap` policy, seconds, minutes, hours, days, months, and
1232
+ * weekdays.
1088
1233
  *
1089
1234
  * **Example** (Comparing schedules with equivalence)
1090
1235
  *
@@ -1119,6 +1264,7 @@ export const sequence = function*(cron: Cron, now?: DateTime.DateTime.Input): It
1119
1264
  export const Equivalence: Equ.Equivalence<Cron> = Equ.make((self, that) =>
1120
1265
  Equal.equals(self.tz, that.tz) &&
1121
1266
  self.and === that.and &&
1267
+ self.onDstOverlap === that.onDstOverlap &&
1122
1268
  restrictionsEquals(self.seconds, that.seconds) &&
1123
1269
  restrictionsEquals(self.minutes, that.minutes) &&
1124
1270
  restrictionsEquals(self.hours, that.hours) &&
@@ -1143,7 +1289,8 @@ const restrictionsEquals = (self: ReadonlySet<number>, that: ReadonlySet<number>
1143
1289
  * **Details**
1144
1290
  *
1145
1291
  * The comparison checks the optional timezone, the `and` day-matching mode,
1146
- * seconds, minutes, hours, days, months, and weekdays.
1292
+ * the `onDstOverlap` policy, seconds, minutes, hours, days, months, and
1293
+ * weekdays.
1147
1294
  *
1148
1295
  * **Example** (Checking schedule equality)
1149
1296
  *
@@ -1189,7 +1336,8 @@ export const equals: {
1189
1336
  * **Details**
1190
1337
  *
1191
1338
  * The comparison checks the optional timezone, the `and` day-matching mode,
1192
- * seconds, minutes, hours, days, months, and weekdays.
1339
+ * the `onDstOverlap` policy, seconds, minutes, hours, days, months, and
1340
+ * weekdays.
1193
1341
  *
1194
1342
  * **Example** (Checking schedule equality)
1195
1343
  *
@@ -1235,7 +1383,8 @@ export const equals: {
1235
1383
  * **Details**
1236
1384
  *
1237
1385
  * The comparison checks the optional timezone, the `and` day-matching mode,
1238
- * seconds, minutes, hours, days, months, and weekdays.
1386
+ * the `onDstOverlap` policy, seconds, minutes, hours, days, months, and
1387
+ * weekdays.
1239
1388
  *
1240
1389
  * **Example** (Checking schedule equality)
1241
1390
  *
package/src/Duration.ts CHANGED
@@ -848,6 +848,30 @@ export const days = (days: number): Duration => make(days * 86_400_000)
848
848
  */
849
849
  export const weeks = (weeks: number): Duration => make(weeks * 604_800_000)
850
850
 
851
+ /**
852
+ * Converts a Duration to microseconds.
853
+ *
854
+ * **Example** (Converting durations to microseconds)
855
+ *
856
+ * ```ts import.meta.vitest
857
+ * import { Duration } from "effect"
858
+ *
859
+ * Duration.toMicros(Duration.millis(5)) // => 5000
860
+ * Duration.toMicros(Duration.nanos(123n)) // => 0.123
861
+ * ```
862
+ *
863
+ * @stability stable
864
+ * @category getters
865
+ * @since 4.1.0
866
+ */
867
+ export const toMicros = (self: Input): number =>
868
+ match(fromInputUnsafe(self), {
869
+ onMillis: (millis) => millis * 1_000,
870
+ onNanos: (nanos) => nanosToUnit(nanos, 1_000),
871
+ onInfinity: () => Infinity,
872
+ onNegativeInfinity: () => -Infinity
873
+ })
874
+
851
875
  /**
852
876
  * Converts a Duration to milliseconds.
853
877
  *
@@ -2534,6 +2558,122 @@ export const format = (self: Duration): string => {
2534
2558
  return pieces.join(" ")
2535
2559
  }
2536
2560
 
2561
+ /**
2562
+ * Formats a `Duration` as an ISO 8601 duration string.
2563
+ *
2564
+ * **Details**
2565
+ *
2566
+ * The duration is balanced into days (24 hours), hours, minutes and seconds,
2567
+ * with up to nine fractional second digits. Weeks, months and years are never
2568
+ * produced. Negative durations get a leading `-`, zero is `"PT0S"` and
2569
+ * infinite durations return `Option.none()`.
2570
+ *
2571
+ * **Example** (Formatting durations as ISO 8601)
2572
+ *
2573
+ * ```ts import.meta.vitest
2574
+ * import { Duration, Option } from "effect"
2575
+ *
2576
+ * Duration.formatIso(Duration.minutes(90)) // => Option.some("PT1H30M")
2577
+ * Duration.formatIso(Duration.millis(-1500)) // => Option.some("-PT1.5S")
2578
+ * Duration.formatIso(Duration.hours(26)) // => Option.some("P1DT2H")
2579
+ * Duration.formatIso(Duration.infinity) // => Option.none()
2580
+ * ```
2581
+ *
2582
+ * @see {@link fromIso} for parsing ISO 8601 duration strings
2583
+ *
2584
+ * @stability stable
2585
+ * @category converting
2586
+ * @since 4.1.0
2587
+ */
2588
+ export const formatIso = (self: Duration): Option.Option<string> => {
2589
+ if (!isFinite(self)) {
2590
+ return Option.none()
2591
+ }
2592
+ const n = toNanosUnsafe(self)
2593
+ const a = n < bigint0 ? -n : n
2594
+ const days = a / bigintNanosPerDay
2595
+ const hours = a % bigintNanosPerDay / bigintNanosPerHour
2596
+ const minutes = a % bigintNanosPerHour / bigintNanosPerMinute
2597
+ const seconds = a % bigintNanosPerMinute / bigint1e9
2598
+ const fraction = a % bigint1e9
2599
+
2600
+ let time = ""
2601
+ if (hours !== bigint0) time += `${hours}H`
2602
+ if (minutes !== bigint0) time += `${minutes}M`
2603
+ if (fraction !== bigint0) {
2604
+ time += `${seconds}.${fraction.toString().padStart(9, "0").replace(/0+$/, "")}S`
2605
+ } else if (seconds !== bigint0) {
2606
+ time += `${seconds}S`
2607
+ }
2608
+
2609
+ let out = n < bigint0 ? "-P" : "P"
2610
+ if (days !== bigint0) out += `${days}D`
2611
+ if (time !== "") out += `T${time}`
2612
+ return Option.some(out === "P" ? "PT0S" : out)
2613
+ }
2614
+
2615
+ const DURATION_ISO_REGEXP =
2616
+ /^([+-])?P(?!$)(?:(\d+)W)?(?:(\d+)D)?(?:T(?!$)(?:(\d+)(?:[.,](\d{1,9}))?H)?(?:(\d+)(?:[.,](\d{1,9}))?M)?(?:(\d+)(?:[.,](\d{1,9}))?S)?)?$/
2617
+
2618
+ // `scale` is the number of nanoseconds in one unit
2619
+ const parseIsoComponent = (whole: string | undefined, fraction: string | undefined, scale: bigint): bigint =>
2620
+ (whole === undefined ? bigint0 : BigInt(whole) * scale) +
2621
+ (fraction === undefined ? bigint0 : BigInt(fraction.padEnd(9, "0")) * (scale / bigint1e9))
2622
+
2623
+ /**
2624
+ * Parses an ISO 8601 duration string into a `Duration`.
2625
+ *
2626
+ * **Details**
2627
+ *
2628
+ * Accepts an optional `+` or `-` sign followed by weeks (`W`), days (`D`),
2629
+ * hours (`H`), minutes (`M`) and seconds (`S`). A day is 24 hours and a week
2630
+ * is 7 days. Only the last time component may have a fraction, of up to nine
2631
+ * digits, separated by `.` or `,`.
2632
+ *
2633
+ * **Gotchas**
2634
+ *
2635
+ * Years (`Y`) and months (`M` before `T`) are rejected because they have no
2636
+ * fixed length. Fractional weeks and days are rejected.
2637
+ *
2638
+ * **Example** (Parsing ISO 8601 durations)
2639
+ *
2640
+ * ```ts import.meta.vitest
2641
+ * import { Duration, Option } from "effect"
2642
+ *
2643
+ * Duration.fromIso("PT1H30M") // => Option.some(Duration.minutes(90))
2644
+ * Duration.fromIso("-PT1.5S") // => Option.some(Duration.millis(-1500))
2645
+ * Duration.fromIso("P1W2D") // => Option.some(Duration.days(9))
2646
+ * Duration.fromIso("P1M") // => Option.none()
2647
+ * ```
2648
+ *
2649
+ * @see {@link formatIso} for formatting a `Duration` as an ISO 8601 string
2650
+ *
2651
+ * @stability stable
2652
+ * @category constructors
2653
+ * @since 4.1.0
2654
+ */
2655
+ export const fromIso = (input: string): Option.Option<Duration> => {
2656
+ const match = DURATION_ISO_REGEXP.exec(input)
2657
+ if (match === null) {
2658
+ return Option.none()
2659
+ }
2660
+ const [, sign, w, d, h, hf, m, mf, s, sf] = match
2661
+ // a fraction is only allowed on the last time component
2662
+ if ((hf !== undefined && (m !== undefined || s !== undefined)) || (mf !== undefined && s !== undefined)) {
2663
+ return Option.none()
2664
+ }
2665
+ const total = parseIsoComponent(w, undefined, bigintNanosPerWeek) +
2666
+ parseIsoComponent(d, undefined, bigintNanosPerDay) +
2667
+ parseIsoComponent(h, hf, bigintNanosPerHour) +
2668
+ parseIsoComponent(m, mf, bigintNanosPerMinute) +
2669
+ parseIsoComponent(s, sf, bigint1e9)
2670
+ const signed = sign === "-" ? -total : total
2671
+ const ms = Number(signed / bigint1e6)
2672
+ return Option.some(
2673
+ signed % bigint1e6 === bigint0 && Number.isSafeInteger(ms) ? millis(ms) : nanos(signed)
2674
+ )
2675
+ }
2676
+
2537
2677
  /**
2538
2678
  * Reducer for summing `Duration`s.
2539
2679
  *