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
@@ -46,8 +46,9 @@ export const encode: (input: Uint8Array | string) => string = (input) =>
46
46
  * coercion rules.
47
47
  *
48
48
  * This function uses `Math.random()` and is not cryptographically secure. For
49
- * security-sensitive values, use the `Crypto.Crypto` service's `randomBytes`
50
- * method and encode the result with {@link encode}.
49
+ * security-sensitive values, draw bytes with the `randomBytes` method of the
50
+ * `SecureRandom` service from `effect/crypto/SecureRandom`, and encode them with
51
+ * {@link encode}.
51
52
  *
52
53
  * @stability stable
53
54
  * @category encoding
@@ -80,6 +80,7 @@ const codecCache = new WeakMap<Schema.Constraint, toCodec<any>>()
80
80
  const fingerprintCodecCache = new WeakMap<Schema.Constraint, toCodec<any>>()
81
81
  const directCodecCache = new WeakMap<Schema.Constraint, toCodec<any>>()
82
82
  const directFingerprintCodecCache = new WeakMap<Schema.Constraint, toCodec<any>>()
83
+ const strictCodecCache = new WeakMap<Schema.Constraint, toCodec<any>>()
83
84
 
84
85
  /**
85
86
  * Derives a compact binary codec from a schema.
@@ -135,6 +136,27 @@ export function toCodec<S extends Schema.Constraint>(schema: S, options?: Option
135
136
  return codec
136
137
  }
137
138
 
139
+ /**
140
+ * Derives the default-mode {@link toCodec} codec, except that decoding rejects
141
+ * struct fields the schema does not know instead of skipping them.
142
+ *
143
+ * @internal
144
+ */
145
+ export function toCodecStrict<S extends Schema.Constraint>(schema: S): toCodec<S> {
146
+ const cached = strictCodecCache.get(schema)
147
+ if (cached !== undefined) return cached
148
+ const { exact, layout, recursive, target } = compileTarget(schema)
149
+ const trusted: Trusted | undefined = exact ? { value: undefined } : undefined
150
+ const codec = assembleCodec<S>(
151
+ trusted === undefined ? target : withTrustedDecode(target, trusted, !recursive),
152
+ layout,
153
+ strictMode,
154
+ trusted
155
+ )
156
+ strictCodecCache.set(schema, codec)
157
+ return codec
158
+ }
159
+
138
160
  /**
139
161
  * Derives the {@link toCodec} codec without the schema pass around the binary
140
162
  * layer.
@@ -571,7 +593,7 @@ function makeParser<T>(
571
593
  issuePathLen = 0
572
594
  const bodyStart = pos + headerLen
573
595
  indexSignatures.beginFrame()
574
- body.reset(buf, bodyStart, bodyStart + frameLen, parseOptions, indexSignatures, mode.positional, dict)
596
+ body.reset(buf, bodyStart, bodyStart + frameLen, parseOptions, indexSignatures, mode, dict)
575
597
  const value = decodeFrameBody(layout, body, mode)
576
598
  out.push((decodeEncoded === undefined ? value : decodeEncoded(value)) as T)
577
599
  } catch (e) {
@@ -1541,6 +1563,7 @@ class Reader {
1541
1563
  options: SchemaAST.ParseOptions = SchemaAST.defaultParseOptions
1542
1564
  indexSignatures: IndexSignatureCache | undefined
1543
1565
  positional = false
1566
+ rejectUnknownFields = false
1544
1567
  // Handed to the row-run field's immediate consumer, then cleared.
1545
1568
  intern: Array<unknown> | undefined
1546
1569
  // String tables shared by every frame on one connection; `undefined` for a
@@ -1552,7 +1575,7 @@ class Reader {
1552
1575
  end: number,
1553
1576
  options: SchemaAST.ParseOptions,
1554
1577
  indexSignatures: IndexSignatureCache | undefined,
1555
- positional: boolean,
1578
+ mode: Mode,
1556
1579
  dict: DictRead | undefined
1557
1580
  ) {
1558
1581
  this.nesting = 0
@@ -1562,7 +1585,8 @@ class Reader {
1562
1585
  this.end = end
1563
1586
  this.options = options
1564
1587
  this.indexSignatures = indexSignatures
1565
- this.positional = positional
1588
+ this.positional = mode.positional
1589
+ this.rejectUnknownFields = mode.rejectUnknownFields
1566
1590
  this.intern = undefined
1567
1591
  this.dict = dict
1568
1592
  }
@@ -1576,6 +1600,7 @@ class Reader {
1576
1600
  this.options = SchemaAST.defaultParseOptions
1577
1601
  this.indexSignatures = undefined
1578
1602
  this.positional = false
1603
+ this.rejectUnknownFields = false
1579
1604
  this.intern = undefined
1580
1605
  this.dict = undefined
1581
1606
  }
@@ -2908,6 +2933,7 @@ function fingerprintBytes(lo: number, hi: number): Uint8Array {
2908
2933
 
2909
2934
  interface Mode {
2910
2935
  readonly positional: boolean
2936
+ readonly rejectUnknownFields: boolean
2911
2937
  readonly envelope: number
2912
2938
  readonly expectedEnvelope: string
2913
2939
  readonly fingerprint: Uint8Array
@@ -2915,15 +2941,19 @@ interface Mode {
2915
2941
 
2916
2942
  const defaultMode: Mode = {
2917
2943
  positional: false,
2944
+ rejectUnknownFields: false,
2918
2945
  envelope: ENVELOPE,
2919
2946
  expectedEnvelope: "version 2 envelope, flags 0",
2920
2947
  fingerprint: new Uint8Array(8)
2921
2948
  }
2922
2949
 
2950
+ const strictMode: Mode = { ...defaultMode, rejectUnknownFields: true }
2951
+
2923
2952
  function fingerprintMode(layout: Layout): Mode {
2924
2953
  const fingerprint = layoutFingerprint(layout)
2925
2954
  return {
2926
2955
  positional: true,
2956
+ rejectUnknownFields: false,
2927
2957
  envelope: ENVELOPE_FINGERPRINT,
2928
2958
  expectedEnvelope: "version 2 envelope, flags 1",
2929
2959
  fingerprint: fingerprintBytes(
@@ -4275,6 +4305,7 @@ function decodeExtraPair(
4275
4305
  const signature = layout.extraAll ??
4276
4306
  (r.indexSignatures ??= new IndexSignatureCache(r.options)).find(layout, key)
4277
4307
  if (signature === undefined) {
4308
+ if (r.rejectUnknownFields) invalid("a key matching an index signature", key, r.options)
4278
4309
  skipFieldPayload(kind, r)
4279
4310
  return
4280
4311
  }
@@ -4371,6 +4402,7 @@ function decodeScalarField(kind: number, r: Reader): unknown {
4371
4402
 
4372
4403
  function decodeFieldPayload(layout: Layout, wireMask: number, kind: number, r: Reader): unknown {
4373
4404
  if ((wireMask & (1 << kind)) === 0) {
4405
+ if (r.rejectUnknownFields) invalid("matching field wire kind", kind, r.options)
4374
4406
  skipFieldPayload(kind, r)
4375
4407
  return ABSENT
4376
4408
  }
@@ -4427,6 +4459,7 @@ function decodeStruct(layout: StructLayout, r: Reader): unknown {
4427
4459
  if (field !== undefined) cursor = field.index + 1
4428
4460
  }
4429
4461
  if (field === undefined) {
4462
+ if (r.rejectUnknownFields) invalid("a known field id", id, r.options)
4430
4463
  if (seenUnknown === undefined) seenUnknown = new Set()
4431
4464
  else if (seenUnknown.has(id)) invalid("unique field ids", undefined, r.options)
4432
4465
  seenUnknown.add(id)
@@ -4646,6 +4679,7 @@ function decodeRunRow(
4646
4679
  } else {
4647
4680
  slot = struct.byId.get(id)
4648
4681
  if (slot === undefined) {
4682
+ if (r.rejectUnknownFields) invalid("a known field id", id, r.options)
4649
4683
  if (seenIds === undefined) seenIds = new Set([id])
4650
4684
  else if (seenIds.has(id)) invalid("unique field ids", undefined, r.options)
4651
4685
  else seenIds.add(id)
@@ -4843,6 +4877,7 @@ function decodeUnion(layout: UnionLayout, r: Reader): unknown {
4843
4877
  const tag = r.u32le()
4844
4878
  const variant = layout.byTag.get(tag)
4845
4879
  if (variant === undefined) {
4880
+ if (r.rejectUnknownFields) invalid("known union member", tag, r.options)
4846
4881
  r.take(r.remaining)
4847
4882
  return ABSENT
4848
4883
  }
@@ -4857,6 +4892,7 @@ function decodeUnion(layout: UnionLayout, r: Reader): unknown {
4857
4892
  }
4858
4893
  const member = layout.byKind.get(kind)
4859
4894
  if (member === undefined) {
4895
+ if (r.rejectUnknownFields) invalid("known union member", kind, r.options)
4860
4896
  r.take(r.remaining)
4861
4897
  return ABSENT
4862
4898
  }
@@ -5090,7 +5126,7 @@ function decodeOneShot(
5090
5126
  const r = pooledReader ?? new Reader()
5091
5127
  const pooled = r === pooledReader
5092
5128
  if (pooled) pooledReader = undefined
5093
- r.reset(bytes, 0, bytes.length, options, undefined, mode.positional, undefined)
5129
+ r.reset(bytes, 0, bytes.length, options, undefined, mode, undefined)
5094
5130
  const savedPathLen = issuePathLen
5095
5131
  issuePathLen = 0
5096
5132
  try {
@@ -32,12 +32,34 @@
32
32
  * SOFTWARE.
33
33
  */
34
34
 
35
+ import * as Result from "../Result.ts"
36
+ import { EncodingError } from "./EncodingError.ts"
37
+
35
38
  type Table = Record<string, unknown>
36
39
 
37
40
  const hasOwn = Object.prototype.hasOwnProperty
38
41
  const makeTable = (): Table => Object.create(null)
39
42
  const isTable = (value: unknown): value is Table =>
40
43
  typeof value === "object" && value !== null && !Array.isArray(value) && !(value instanceof Date)
44
+ const localDatePattern = /^(\d{4})-(\d{2})-(\d{2})$/
45
+ const localTimePattern = /^(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?$/
46
+ const numericOffsetPattern = /^[+-](\d{2}):(\d{2})$/
47
+ const dateTimePattern = /^(\d{4}-\d{2}-\d{2})[Tt](\d{2}:\d{2}:\d{2}(?:\.\d+)?)([Zz]|[+-]\d{2}:\d{2})?$/
48
+ const daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
49
+ const isValidDate = (date: string): boolean => {
50
+ const [, year, month, day] = localDatePattern.exec(date)!.map(Number)
51
+ const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)
52
+ const days = month === 2 && leap ? 29 : daysInMonth[month - 1]
53
+ return month >= 1 && month <= 12 && day >= 1 && day <= days
54
+ }
55
+ const isValidTime = (time: string): boolean => {
56
+ const [, hour, minute, second] = localTimePattern.exec(time)!.map(Number)
57
+ return hour <= 23 && minute <= 59 && second <= 60
58
+ }
59
+ const isValidOffset = (offset: string): boolean => {
60
+ const numeric = numericOffsetPattern.exec(offset)
61
+ return numeric === null || (Number(numeric[1]) <= 23 && Number(numeric[2]) <= 59)
62
+ }
41
63
 
42
64
  class TomlParser {
43
65
  readonly root = makeTable()
@@ -49,6 +71,8 @@ class TomlParser {
49
71
  private readonly explicitTables = new Set<Table>()
50
72
  // Tables defined by dotted keys; a header cannot define them again.
51
73
  private readonly dottedTables = new Set<Table>()
74
+ // Values parsed from `[...]` or `{...}` are complete; headers and dotted keys cannot extend them.
75
+ private readonly inlineValues = new Set<unknown>()
52
76
 
53
77
  constructor(input: string) {
54
78
  this.input = input
@@ -104,6 +128,9 @@ class TomlParser {
104
128
  const key = path[index]
105
129
  const last = index === path.length - 1
106
130
  let value = table[key]
131
+ if (this.inlineValues.has(value)) {
132
+ this.fail(`Cannot redefine existing key '${path.slice(0, index + 1).join(".")}'`)
133
+ }
107
134
 
108
135
  if (last && array) {
109
136
  if (value === undefined) {
@@ -142,7 +169,7 @@ class TomlParser {
142
169
  const child = makeTable()
143
170
  table[key] = child
144
171
  table = child
145
- } else if (isTable(existing) && !this.explicitTables.has(existing)) {
172
+ } else if (isTable(existing) && !this.explicitTables.has(existing) && !this.inlineValues.has(existing)) {
146
173
  table = existing
147
174
  } else {
148
175
  this.fail(`Cannot redefine existing key '${keys.slice(0, index + 1).join(".")}'`)
@@ -198,10 +225,14 @@ class TomlParser {
198
225
  return this.parseLiteralString(this.input.startsWith("'''", this.index))
199
226
  }
200
227
  if (character === "[") {
201
- return this.parseArray()
228
+ const array = this.parseArray()
229
+ this.inlineValues.add(array)
230
+ return array
202
231
  }
203
232
  if (character === "{") {
204
- return this.parseInlineTable()
233
+ const table = this.parseInlineTable()
234
+ this.inlineValues.add(table)
235
+ return table
205
236
  }
206
237
 
207
238
  const spaceSeparatedDateTime = /^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:[Zz]|[+-]\d{2}:\d{2})?)/
@@ -233,21 +264,21 @@ class TomlParser {
233
264
  }
234
265
 
235
266
  private parseDate(token: string): Date | string | undefined {
236
- const date = "\\d{4}-\\d{2}-\\d{2}"
237
- const time = "\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?"
238
- if (new RegExp(`^${date}[Tt]${time}(?:[Zz]|[+-]\\d{2}:\\d{2})$`).test(token)) {
239
- const value = new Date(token.replace("t", "T").replace("z", "Z"))
240
- if (Number.isNaN(value.getTime())) {
267
+ const dateTime = dateTimePattern.exec(token)
268
+ if (dateTime !== null) {
269
+ const [, date, time, offset] = dateTime
270
+ // `Date` cannot represent a leap second, so offset date-times reject `:60`
271
+ const offsetValid = offset === undefined || (isValidOffset(offset) && time.slice(6, 8) !== "60")
272
+ if (!isValidDate(date) || !isValidTime(time) || !offsetValid) {
241
273
  this.fail(`Invalid date-time '${token}'`)
242
274
  }
243
- return value
275
+ return offset === undefined ? `${date}T${time}` : new Date(`${date}T${time}${offset.toUpperCase()}`)
244
276
  }
245
- if (
246
- new RegExp(`^${date}[Tt]${time}$`).test(token) ||
247
- new RegExp(`^${date}$`).test(token) ||
248
- new RegExp(`^${time}$`).test(token)
249
- ) {
250
- return token.replace("t", "T")
277
+ if (localDatePattern.test(token)) {
278
+ return isValidDate(token) ? token : this.fail(`Invalid date-time '${token}'`)
279
+ }
280
+ if (localTimePattern.test(token)) {
281
+ return isValidTime(token) ? token : this.fail(`Invalid date-time '${token}'`)
251
282
  }
252
283
  return undefined
253
284
  }
@@ -292,7 +323,7 @@ class TomlParser {
292
323
  while (!this.done) {
293
324
  if (multiline && this.input.startsWith("\"\"\"", this.index)) {
294
325
  this.advance(3)
295
- return output
326
+ return output + this.closingQuotes("\"")
296
327
  }
297
328
  const character = this.peek()
298
329
  if (!multiline && character === "\"") {
@@ -362,7 +393,7 @@ class TomlParser {
362
393
  if (multiline && this.input.startsWith("'''", this.index)) {
363
394
  const output = this.input.slice(start, this.index)
364
395
  this.advance(3)
365
- return output
396
+ return output + this.closingQuotes("'")
366
397
  }
367
398
  if (!multiline && this.peek() === "'") {
368
399
  const output = this.input.slice(start, this.index)
@@ -377,6 +408,15 @@ class TomlParser {
377
408
  this.fail("Unterminated literal string")
378
409
  }
379
410
 
411
+ private closingQuotes(quote: string): string {
412
+ let quotes = ""
413
+ while (quotes.length < 2 && this.peek() === quote) {
414
+ quotes += quote
415
+ this.advance()
416
+ }
417
+ return quotes
418
+ }
419
+
380
420
  private parseArray(): Array<unknown> {
381
421
  this.expect("[")
382
422
  const output: Array<unknown> = []
@@ -515,11 +555,36 @@ class TomlParser {
515
555
  *
516
556
  * **Details**
517
557
  *
518
- * Offset date-times are represented by `Date`, matching the package this
519
- * parser replaces. Local dates and times remain strings.
558
+ * Returns `Result.succeed` with the parsed record, or `Result.fail` with an
559
+ * `EncodingError` when the input is not valid TOML. Offset date-times are
560
+ * represented by `Date`, matching the package this parser replaces. Local
561
+ * dates and times remain strings.
562
+ *
563
+ * **Example** (Parsing a TOML document)
564
+ *
565
+ * ```ts import.meta.vitest
566
+ * import { Result } from "effect"
567
+ * import { Toml } from "effect/encoding"
568
+ *
569
+ * Toml.parse("port = 8080") // => Result.succeed({ port: 8080 })
570
+ * Result.isFailure(Toml.parse("port = ")) // => true
571
+ * ```
520
572
  *
521
573
  * @stability unstable
522
574
  * @category decoding
523
575
  * @since 4.0.0
524
576
  */
525
- export const parse = (input: string): Record<string, unknown> => new TomlParser(input.replace(/^\uFEFF/, "")).parse()
577
+ export const parse = (input: string): Result.Result<Record<string, unknown>, EncodingError> => {
578
+ try {
579
+ return Result.succeed(new TomlParser(input.replace(/^\uFEFF/, "")).parse());
580
+ } catch (e) {
581
+ return Result.fail(
582
+ new EncodingError({
583
+ module: "Toml",
584
+ kind: "Decode",
585
+ input,
586
+ message: e instanceof Error ? e.message : "Invalid input"
587
+ })
588
+ )
589
+ }
590
+ }
@@ -2,7 +2,8 @@
2
2
  * Parses YAML configuration files.
3
3
  *
4
4
  * Supports YAML 1.2 block and flow collections, indentless sequence values,
5
- * multiline plain and quoted scalars, block scalars, anchors, and aliases.
5
+ * multiline plain and quoted scalars, block scalars, anchors, aliases, and
6
+ * YAML 1.1 merge keys (`<<`).
6
7
  *
7
8
  * Unlike YAML 1.2, the closing bracket of a multiline flow collection may sit
8
9
  * at its parent's indentation.
@@ -55,6 +56,34 @@ const setProperty = (record: YamlRecord, key: string, value: unknown): void => {
55
56
  })
56
57
  }
57
58
 
59
+ const isMapping = (value: unknown): value is YamlRecord =>
60
+ typeof value === "object" && value !== null && !Array.isArray(value)
61
+
62
+ // Explicit keys take precedence over merged keys, and earlier merge sources over later ones.
63
+ class MappingBuilder {
64
+ readonly output: YamlRecord = {}
65
+ // Keys added by the merge key, which an explicit key may still override.
66
+ private merged: Set<string> | undefined
67
+
68
+ set(key: string, value: unknown, fail: (message: string) => never): void {
69
+ if (hasOwn.call(this.output, key) && !this.merged?.delete(key)) fail(`Duplicate key '${key}'`)
70
+ setProperty(this.output, key, value)
71
+ }
72
+
73
+ merge(value: unknown, fail: (message: string) => never): void {
74
+ if (this.merged !== undefined) fail("Duplicate key '<<'")
75
+ this.merged = new Set()
76
+ for (const source of Array.isArray(value) ? value : [value]) {
77
+ if (!isMapping(source)) fail("Merge key values must be mappings")
78
+ for (const key of Object.keys(source)) {
79
+ if (hasOwn.call(this.output, key)) continue
80
+ setProperty(this.output, key, source[key])
81
+ this.merged.add(key)
82
+ }
83
+ }
84
+ }
85
+ }
86
+
58
87
  const closingQuote = (input: string, quote: string, start: number): number => {
59
88
  for (let index = start; index < input.length; index++) {
60
89
  const character = input[index]
@@ -293,28 +322,31 @@ class FlowParser {
293
322
 
294
323
  private parseMapping(): YamlRecord {
295
324
  this.expect("{")
296
- const output: YamlRecord = {}
325
+ const mapping = new MappingBuilder()
326
+ const fail = (message: string) => this.fail(message)
297
327
  this.skipWhitespace()
298
328
  if (this.peek() === "}") {
299
329
  this.index++
300
- return output
330
+ return mapping.output
301
331
  }
302
332
  while (true) {
333
+ this.skipWhitespace()
334
+ const quoted = this.peek() === "\"" || this.peek() === "'"
303
335
  const key = this.parseKey()
304
336
  this.skipWhitespace()
305
337
  this.expect(":")
306
- if (hasOwn.call(output, key)) this.fail(`Duplicate key '${key}'`)
307
- setProperty(output, key, this.parseValue())
338
+ if (!quoted && key === "<<") mapping.merge(this.parseValue(), fail)
339
+ else mapping.set(key, this.parseValue(), fail)
308
340
  this.skipWhitespace()
309
341
  if (this.peek() === "}") {
310
342
  this.index++
311
- return output
343
+ return mapping.output
312
344
  }
313
345
  this.expect(",")
314
346
  this.skipWhitespace()
315
347
  if (this.peek() === "}") {
316
348
  this.index++
317
- return output
349
+ return mapping.output
318
350
  }
319
351
  }
320
352
  }
@@ -398,31 +430,32 @@ class YamlParser {
398
430
  return this.parseNodeValue(line.text, parentIndent)
399
431
  }
400
432
 
401
- private parseMapping(indent: number, output: YamlRecord = {}): YamlRecord {
433
+ private parseMapping(indent: number, mapping = new MappingBuilder()): YamlRecord {
402
434
  while (true) {
403
435
  this.skipIgnored()
404
436
  const line = this.lines[this.index]
405
- if (line === undefined || line.indent < indent) return output
437
+ if (line === undefined || line.indent < indent) return mapping.output
406
438
  if (line.indent > indent) this.fail(line, `Unexpected indentation of ${line.indent} spaces`)
407
439
  const separator = mappingSeparator(line.text)
408
- if (separator === -1) return output
440
+ if (separator === -1) return mapping.output
409
441
  this.index++
410
- this.parseMappingEntry(output, line.text, separator, indent, line)
442
+ this.parseMappingEntry(mapping, line.text, separator, indent, line)
411
443
  }
412
444
  }
413
445
 
414
446
  private parseMappingEntry(
415
- output: YamlRecord,
447
+ mapping: MappingBuilder,
416
448
  text: string,
417
449
  separator: number,
418
450
  indent: number,
419
451
  line: Line
420
452
  ): void {
421
- const key = parseKey(text.slice(0, separator).trim())
453
+ const rawKey = text.slice(0, separator).trim()
422
454
  const rawValue = text.slice(separator + 1).trimStart()
423
455
  const value = this.parseNodeValue(rawValue, indent, true)
424
- if (hasOwn.call(output, key)) this.fail(line, `Duplicate key '${key}'`)
425
- setProperty(output, key, value)
456
+ const fail = (message: string) => this.fail(line, message)
457
+ if (rawKey === "<<") mapping.merge(value, fail)
458
+ else mapping.set(parseKey(rawKey), value, fail)
426
459
  }
427
460
 
428
461
  private parseSequence(indent: number): Array<unknown> {
@@ -440,9 +473,13 @@ class YamlParser {
440
473
  if (separator === -1) {
441
474
  output.push(this.parseNodeValue(item, indent))
442
475
  } else {
443
- const mapping: YamlRecord = {}
444
- this.parseMappingEntry(mapping, item, separator, indent + 2, line)
445
- output.push(this.parseMapping(indent + 2, mapping))
476
+ // The mapping is indented to its first key, which may sit more than one space after the dash.
477
+ const keyOffset = line.text.length - item.length
478
+ if (line.text.slice(1, keyOffset).includes("\t")) this.fail(line, "Tabs cannot be used for YAML indentation")
479
+ const mappingIndent = indent + keyOffset
480
+ const mapping = new MappingBuilder()
481
+ this.parseMappingEntry(mapping, item, separator, mappingIndent, line)
482
+ output.push(this.parseMapping(mappingIndent, mapping))
446
483
  }
447
484
  }
448
485
  }
@@ -668,6 +705,12 @@ class YamlParser {
668
705
  * The core YAML 1.2 scalar schema is used, so booleans, nulls, and numbers are
669
706
  * decoded while date-like values remain strings.
670
707
  *
708
+ * YAML 1.1 merge keys are always enabled. An unquoted `<<` key merges a
709
+ * mapping, or a sequence of mappings, into the enclosing mapping. Explicit
710
+ * keys take precedence over merged keys, earlier merge sources over later
711
+ * ones, and a mapping may contain only one merge key. Quote the key (`"<<"`)
712
+ * to keep it as an ordinary key.
713
+ *
671
714
  * @stability unstable
672
715
  * @category decoding
673
716
  * @since 4.0.0
@@ -17,6 +17,12 @@ export * as Base64 from "./Base64.ts"
17
17
  */
18
18
  export * as Base64Url from "./Base64Url.ts"
19
19
 
20
+ /**
21
+ * @stability unstable
22
+ * @since 4.1.0
23
+ */
24
+ export * as Csv from "./Csv.ts"
25
+
20
26
  /**
21
27
  * @stability stable
22
28
  * @since 4.0.0
@@ -16,6 +16,7 @@ import * as Arr from "../Array.ts"
16
16
  import type { Brand } from "../Brand.ts"
17
17
  import * as Clock from "../Clock.ts"
18
18
  import * as Context from "../Context.ts"
19
+ import * as SecureRandom from "../crypto/SecureRandom.ts"
19
20
  import * as Data from "../Data.ts"
20
21
  import * as DateTime from "../DateTime.ts"
21
22
  import * as Effect from "../Effect.ts"
@@ -250,7 +251,7 @@ export const RemoteId = Schema.Uint8Array.pipe(Schema.brand(RemoteIdTypeId))
250
251
  * @category unsafe
251
252
  * @since 4.0.0
252
253
  */
253
- export const makeRemoteIdUnsafe = (): RemoteId => Uuid.v4Bytes() as RemoteId
254
+ export const makeRemoteIdUnsafe = (): RemoteId => SecureRandom.uuidV4Unsafe({ format: "bytes" }) as RemoteId
254
255
 
255
256
  /**
256
257
  * Runtime brand identifier used for `EntryId` values.
@@ -321,7 +322,7 @@ const nextEntryId = (sequence: EntryIdSequence, now: number): EntryId => {
321
322
  if (sequence.millis > maxEntryIdMillis) {
322
323
  throw new RangeError("The entry id sequence has passed the last UUID v7 millisecond")
323
324
  }
324
- const bytes = Uuid.v7Bytes(sequence.millis)
325
+ const bytes = Uuid.v7Bytes(sequence.millis, SecureRandom.randomBytesUnsafe(16))
325
326
  // The counter replaces the 12 random `rand_a` bits after the version.
326
327
  bytes[6] = 0x70 | (sequence.counter >> 8)
327
328
  bytes[7] = sequence.counter & 0xff
@@ -387,7 +388,7 @@ const maxEntryId = (ids: Iterable<EntryId>): EntryId | undefined => {
387
388
  */
388
389
  export const makeEntryIdUnsafe = (options: { msecs?: number } = {}): EntryId =>
389
390
  options.msecs !== undefined
390
- ? Uuid.v7Bytes(options.msecs) as EntryId
391
+ ? Uuid.v7Bytes(options.msecs, SecureRandom.randomBytesUnsafe(16)) as EntryId
391
392
  : nextEntryId(processEntryIds, Date.now())
392
393
 
393
394
  // Imported ids further ahead of the local clock than this are logged.