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
@@ -0,0 +1,639 @@
1
+ /**
2
+ * Key wrapping: AES-KW (RFC 3394) and RSA-OAEP (RFC 8017).
3
+ *
4
+ * The {@link KeyWrap} service generates AES-KW keys and RSA-OAEP key pairs,
5
+ * wraps keys, and unwraps them. The top-level {@link key},
6
+ * {@link fromCryptoKey}, {@link privateKeyFromCryptoKey},
7
+ * {@link publicKeyFromCryptoKey}, and {@link toBytes} functions build and
8
+ * export keys without a service.
9
+ *
10
+ * `wrap` takes an `Aead`, `Cipher`, `Mac`, or `KeyWrap` key, never raw bytes,
11
+ * which keeps RSA-OAEP limited to key transport. `unwrap` returns a typed key
12
+ * of the algorithm it is given.
13
+ *
14
+ * A key-encryption key is the key most worth keeping non-extractable, so in
15
+ * browsers {@link fromCryptoKey} is the main way to build one.
16
+ *
17
+ * Keys are opaque. They hold either bytes or a `CryptoKey`, display only their
18
+ * algorithm, and compare by reference. The bytes are the AES-KW key, and
19
+ * PKCS#8 or SPKI DER for RSA-OAEP.
20
+ *
21
+ * **Gotchas**
22
+ *
23
+ * - AES-KW wraps keys whose length is a multiple of 8 bytes and at least 16
24
+ * bytes. Other lengths fail with an `InvalidArgument` reason.
25
+ * - RSA-OAEP key generation and encryption use WebCrypto's own randomness and
26
+ * cannot be seeded through `SecureRandom`.
27
+ * - Safari rejects RSA-OAEP keys over 4096 bits.
28
+ *
29
+ * @stability unstable
30
+ * @since 4.0.0
31
+ */
32
+ import * as Context from "../Context.ts"
33
+ import * as Effect from "../Effect.ts"
34
+ import type { Inspectable } from "../Inspectable.ts"
35
+ import * as Layer from "../Layer.ts"
36
+ import * as Predicate from "../Predicate.ts"
37
+ import * as Aead from "./Aead.ts"
38
+ import * as Cipher from "./Cipher.ts"
39
+ import * as CryptoError from "./CryptoError.ts"
40
+ import * as Digest from "./Digest.ts"
41
+ import * as Asymmetric from "./internal/asymmetric.ts"
42
+ import * as KeyModel from "./internal/key.ts"
43
+ import * as internal from "./internal/webCrypto.ts"
44
+ import type * as KeyFormat from "./KeyFormat.ts"
45
+ import * as Mac from "./Mac.ts"
46
+ import * as SecureRandom from "./SecureRandom.ts"
47
+ import { WebCrypto } from "./WebCrypto.ts"
48
+
49
+ const KeyTypeId = "~effect/crypto/KeyWrap/Key" as const
50
+ const PrivateKeyTypeId = "~effect/crypto/KeyWrap/PrivateKey" as const
51
+ const PublicKeyTypeId = "~effect/crypto/KeyWrap/PublicKey" as const
52
+
53
+ /**
54
+ * AES-KW (RFC 3394), from {@link aes128Kw} or {@link aes256Kw}.
55
+ *
56
+ * **Details**
57
+ *
58
+ * `keyLength` is in bytes.
59
+ *
60
+ * @stability unstable
61
+ * @category models
62
+ * @since 4.0.0
63
+ */
64
+ export interface AesKw {
65
+ readonly _tag: "AesKw"
66
+ readonly name: "aes128Kw" | "aes256Kw"
67
+ readonly keyLength: 16 | 32
68
+ }
69
+
70
+ /**
71
+ * RSA-OAEP (RFC 8017), from {@link rsaOaep}.
72
+ *
73
+ * **Details**
74
+ *
75
+ * MGF1 uses the same hash, and there is no label. `modulusLength` is in bits
76
+ * and is only read by key generation: an imported key's
77
+ * `algorithm.modulusLength` is its real size.
78
+ *
79
+ * @stability unstable
80
+ * @category models
81
+ * @since 4.0.0
82
+ */
83
+ export interface RsaOaep {
84
+ readonly _tag: "RsaOaep"
85
+ readonly name: string
86
+ readonly hash: Digest.Algorithm
87
+ readonly modulusLength: number
88
+ }
89
+
90
+ /**
91
+ * A key wrapping algorithm, such as {@link aes256Kw} or {@link rsaOaepSha256}.
92
+ *
93
+ * @stability unstable
94
+ * @category models
95
+ * @since 4.0.0
96
+ */
97
+ export type Algorithm = AesKw | RsaOaep
98
+
99
+ /**
100
+ * AES-128-KW (JOSE A128KW), with a 16-byte key.
101
+ *
102
+ * @stability unstable
103
+ * @category algorithms
104
+ * @since 4.0.0
105
+ */
106
+ export const aes128Kw: AesKw = { _tag: "AesKw", name: "aes128Kw", keyLength: 16 }
107
+
108
+ /**
109
+ * AES-256-KW (JOSE A256KW), with a 32-byte key.
110
+ *
111
+ * @stability unstable
112
+ * @category algorithms
113
+ * @since 4.0.0
114
+ */
115
+ export const aes256Kw: AesKw = { _tag: "AesKw", name: "aes256Kw", keyLength: 32 }
116
+
117
+ /**
118
+ * Builds an RSA-OAEP algorithm for a hash and a modulus length in bits.
119
+ *
120
+ * **Details**
121
+ *
122
+ * MGF1 uses the same hash. There is no OAEP label.
123
+ *
124
+ * @stability unstable
125
+ * @category algorithms
126
+ * @since 4.0.0
127
+ */
128
+ export const rsaOaep = (options: {
129
+ readonly hash: Digest.Algorithm
130
+ readonly modulusLength: number
131
+ }): RsaOaep => ({
132
+ _tag: "RsaOaep",
133
+ name: `rsaOaep${Digest.nameSuffix(options.hash)}`,
134
+ hash: options.hash,
135
+ modulusLength: options.modulusLength
136
+ })
137
+
138
+ /**
139
+ * RSA-OAEP with SHA-256 (JOSE RSA-OAEP-256), generating 3072-bit keys. This is
140
+ * the default RSA-OAEP algorithm.
141
+ *
142
+ * @stability unstable
143
+ * @category algorithms
144
+ * @since 4.0.0
145
+ */
146
+ export const rsaOaepSha256: RsaOaep = rsaOaep({ hash: Digest.sha256, modulusLength: 3072 })
147
+
148
+ /**
149
+ * RSA-OAEP with SHA-1 (JOSE RSA-OAEP), generating 3072-bit keys.
150
+ *
151
+ * **When to use**
152
+ *
153
+ * Use to interoperate with JOSE `RSA-OAEP`. Otherwise prefer
154
+ * {@link rsaOaepSha256}.
155
+ *
156
+ * @stability unstable
157
+ * @category algorithms
158
+ * @since 4.0.0
159
+ */
160
+ export const rsaOaepSha1: RsaOaep = rsaOaep({ hash: Digest.sha1, modulusLength: 3072 })
161
+
162
+ /**
163
+ * An opaque AES-KW key-encryption key for the algorithm `A`, which both wraps
164
+ * and unwraps.
165
+ *
166
+ * **Details**
167
+ *
168
+ * The key holds either key bytes or a `CryptoKey` from {@link fromCryptoKey}.
169
+ * `toString`, `toJSON`, and `inspect` show only the algorithm. Keys compare by
170
+ * reference and do not implement `Equal`.
171
+ *
172
+ * @stability unstable
173
+ * @category models
174
+ * @since 4.0.0
175
+ */
176
+ export interface Key<out A extends AesKw = AesKw> extends Inspectable {
177
+ readonly [KeyTypeId]: typeof KeyTypeId
178
+ readonly algorithm: A
179
+ }
180
+
181
+ /**
182
+ * An opaque RSA-OAEP private key for the algorithm `A`, which unwraps.
183
+ *
184
+ * **Details**
185
+ *
186
+ * The key holds either PKCS#8 bytes or a `CryptoKey` from
187
+ * {@link privateKeyFromCryptoKey}. `toString`, `toJSON`, and `inspect` show
188
+ * only the algorithm. Keys compare by reference and do not implement `Equal`.
189
+ *
190
+ * @stability unstable
191
+ * @category models
192
+ * @since 4.0.0
193
+ */
194
+ export interface PrivateKey<out A extends RsaOaep = RsaOaep> extends Inspectable {
195
+ readonly [PrivateKeyTypeId]: typeof PrivateKeyTypeId
196
+ readonly algorithm: A
197
+ }
198
+
199
+ /**
200
+ * An opaque RSA-OAEP public key for the algorithm `A`, which wraps.
201
+ *
202
+ * **Details**
203
+ *
204
+ * The key holds either SPKI bytes or a `CryptoKey` from
205
+ * {@link publicKeyFromCryptoKey}. Keys compare by reference and do not
206
+ * implement `Equal`.
207
+ *
208
+ * @stability unstable
209
+ * @category models
210
+ * @since 4.0.0
211
+ */
212
+ export interface PublicKey<out A extends RsaOaep = RsaOaep> extends Inspectable {
213
+ readonly [PublicKeyTypeId]: typeof PublicKeyTypeId
214
+ readonly algorithm: A
215
+ }
216
+
217
+ /**
218
+ * An RSA-OAEP private key and its public key.
219
+ *
220
+ * @stability unstable
221
+ * @category models
222
+ * @since 4.0.0
223
+ */
224
+ export interface KeyPair<out A extends RsaOaep = RsaOaep> {
225
+ readonly privateKey: PrivateKey<A>
226
+ readonly publicKey: PublicKey<A>
227
+ }
228
+
229
+ /**
230
+ * A key that wraps: an AES-KW key or an RSA-OAEP public key.
231
+ *
232
+ * @stability unstable
233
+ * @category models
234
+ * @since 4.0.0
235
+ */
236
+ export type WrapKey<A extends Algorithm = Algorithm> =
237
+ | (A extends AesKw ? Key<A> : never)
238
+ | (A extends RsaOaep ? PublicKey<A> : never)
239
+
240
+ /**
241
+ * A key that unwraps: an AES-KW key or an RSA-OAEP private key.
242
+ *
243
+ * @stability unstable
244
+ * @category models
245
+ * @since 4.0.0
246
+ */
247
+ export type UnwrapKey<A extends Algorithm = Algorithm> =
248
+ | (A extends AesKw ? Key<A> : never)
249
+ | (A extends RsaOaep ? PrivateKey<A> : never)
250
+
251
+ const KeyProto = KeyModel.redactedProto(KeyTypeId, "KeyWrap.Key")
252
+ const PrivateKeyProto = KeyModel.redactedProto(PrivateKeyTypeId, "KeyWrap.PrivateKey")
253
+ const PublicKeyProto = KeyModel.redactedProto(PublicKeyTypeId, "KeyWrap.PublicKey")
254
+
255
+ /**
256
+ * Checks whether a value is an AES-KW {@link Key}.
257
+ *
258
+ * @stability unstable
259
+ * @category guards
260
+ * @since 4.0.0
261
+ */
262
+ export const isKey = (u: unknown): u is Key => Predicate.hasProperty(u, KeyTypeId)
263
+
264
+ /**
265
+ * Checks whether a value is an RSA-OAEP {@link PrivateKey}.
266
+ *
267
+ * @stability unstable
268
+ * @category guards
269
+ * @since 4.0.0
270
+ */
271
+ export const isPrivateKey = (u: unknown): u is PrivateKey => Predicate.hasProperty(u, PrivateKeyTypeId)
272
+
273
+ /**
274
+ * Checks whether a value is an RSA-OAEP {@link PublicKey}.
275
+ *
276
+ * @stability unstable
277
+ * @category guards
278
+ * @since 4.0.0
279
+ */
280
+ export const isPublicKey = (u: unknown): u is PublicKey => Predicate.hasProperty(u, PublicKeyTypeId)
281
+
282
+ const specOf = (algorithm: RsaOaep): Asymmetric.Spec => ({
283
+ name: "RSA-OAEP",
284
+ importParams: { name: "RSA-OAEP", hash: algorithm.hash.name },
285
+ privateUsages: ["decrypt"],
286
+ publicUsages: ["encrypt"],
287
+ seedPrefix: undefined,
288
+ publicFormat: "spki",
289
+ check: Asymmetric.checkHash(algorithm.hash.name)
290
+ })
291
+
292
+ /** @internal */
293
+ export const family: Asymmetric.Family = {
294
+ module: "KeyWrap",
295
+ specOf,
296
+ privateKeyProto: PrivateKeyProto,
297
+ publicKeyProto: PublicKeyProto,
298
+ isPrivateKey
299
+ }
300
+
301
+ /**
302
+ * The family of a target key's algorithm, for reading and building target
303
+ * keys.
304
+ *
305
+ * @internal
306
+ */
307
+ export interface SecretFamily {
308
+ readonly key: (algorithm: any, bytes: Uint8Array) => Effect.Effect<object, CryptoError.CryptoError>
309
+ readonly toBytes: (key: any) => Effect.Effect<Uint8Array, CryptoError.CryptoError>
310
+ }
311
+
312
+ /** @internal */
313
+ export const secretFamily = (algorithm: KeyFormat.SecretAlgorithm): SecretFamily =>
314
+ "nonceLength" in algorithm ? Aead : "mode" in algorithm ? Cipher : "_tag" in algorithm ? { key, toBytes } : Mac
315
+
316
+ // AES-KW in WebCrypto only wraps `CryptoKey`s, so the key bytes go through a
317
+ // temporary extractable HMAC key, which imports any non-empty length.
318
+ const hmacParams: HmacImportParams = { name: "HMAC", hash: "SHA-256" }
319
+
320
+ const rsaOaepParams: RsaOaepParams = { name: "RSA-OAEP" }
321
+
322
+ const invalidArgument = (description: string) => new internal.Failure(new CryptoError.InvalidArgument({ description }))
323
+
324
+ // RFC 8017, section 7.1.1: the message fits the modulus minus two hashes and
325
+ // two bytes.
326
+ const checkOaepLength = (algorithm: RsaOaep, cryptoKey: CryptoKey, length: number) => {
327
+ const modulusLength = (cryptoKey.algorithm as RsaHashedKeyAlgorithm).modulusLength
328
+ const max = Math.ceil(modulusLength / 8) - 2 * algorithm.hash.outputLength - 2
329
+ if (length > max) {
330
+ throw invalidArgument(
331
+ `A ${modulusLength}-bit RSA-OAEP key with ${algorithm.hash.name} wraps at most ${max} bytes, not ${length}`
332
+ )
333
+ }
334
+ }
335
+
336
+ // RFC 3394, section 2: keys are at least two 64-bit blocks, and the wrapped
337
+ // form adds one block.
338
+ const checkKwLength = (length: number, overhead: number) => {
339
+ if (length % 8 !== 0 || length < 16 + overhead) {
340
+ throw invalidArgument(`AES-KW needs a multiple of 8 bytes and at least ${16 + overhead} bytes, not ${length}`)
341
+ }
342
+ }
343
+
344
+ /**
345
+ * Service that generates keys, wraps keys, and unwraps them.
346
+ *
347
+ * **Example** (Wrapping an AES-GCM key with AES-KW)
348
+ *
349
+ * ```ts import.meta.vitest
350
+ * import { Effect, Layer } from "effect"
351
+ * import { Aead, KeyWrap, SecureRandom } from "effect/crypto"
352
+ *
353
+ * const program = Effect.gen(function*() {
354
+ * const keyWrap = yield* KeyWrap.KeyWrap
355
+ * const kek = yield* keyWrap.generateKey(KeyWrap.aes256Kw)
356
+ * const key = yield* Aead.key(Aead.aes256Gcm, new Uint8Array(32))
357
+ * const wrapped = yield* keyWrap.wrap(kek, key)
358
+ * const unwrapped = yield* keyWrap.unwrap(kek, Aead.aes256Gcm, wrapped)
359
+ * return [wrapped.length, unwrapped.algorithm.name]
360
+ * })
361
+ *
362
+ * const layer = KeyWrap.layerWebCrypto.pipe(Layer.provide(SecureRandom.layerWebCrypto))
363
+ * await Effect.runPromise(program.pipe(Effect.provide(layer))) // => [40, "aes256Gcm"]
364
+ * ```
365
+ *
366
+ * @stability unstable
367
+ * @category services
368
+ * @since 4.0.0
369
+ */
370
+ export class KeyWrap extends Context.Service<KeyWrap, {
371
+ /**
372
+ * Generates an AES-KW key from `SecureRandom` bytes.
373
+ */
374
+ readonly generateKey: <A extends AesKw>(algorithm: A) => Effect.Effect<Key<A>, CryptoError.CryptoError>
375
+ /**
376
+ * Generates an RSA-OAEP key pair with WebCrypto's own randomness, exported
377
+ * to PKCS#8 and SPKI.
378
+ */
379
+ readonly generateKeyPair: <A extends RsaOaep>(algorithm: A) => Effect.Effect<KeyPair<A>, CryptoError.CryptoError>
380
+ /**
381
+ * Wraps an `Aead`, `Cipher`, `Mac`, or `KeyWrap` key. A non-extractable
382
+ * `CryptoKey`-backed key fails with a `NotExtractable` reason. A key that
383
+ * AES-KW or the RSA-OAEP modulus cannot take fails with an
384
+ * `InvalidArgument` reason.
385
+ */
386
+ readonly wrap: (wrapKey: WrapKey, key: KeyFormat.SecretKey) => Effect.Effect<Uint8Array, CryptoError.CryptoError>
387
+ /**
388
+ * Unwraps a key and builds it as a key of `algorithm`. Wrapped bytes that
389
+ * fail the integrity check fail with a `DecryptionFailed` reason.
390
+ */
391
+ readonly unwrap: <A extends KeyFormat.SecretAlgorithm>(
392
+ unwrapKey: UnwrapKey,
393
+ algorithm: A,
394
+ wrapped: Uint8Array
395
+ ) => Effect.Effect<KeyFormat.SecretKey<A>, CryptoError.CryptoError>
396
+ }>()("effect/crypto/KeyWrap") {}
397
+
398
+ /**
399
+ * Layer that provides `KeyWrap` on the `WebCrypto` reference.
400
+ *
401
+ * **Details**
402
+ *
403
+ * The layer imports a byte-backed key on first use and caches the
404
+ * `CryptoKey`. AES-KW keys come from `SecureRandom`, so a seeded
405
+ * `SecureRandom` reproduces them.
406
+ *
407
+ * WebCrypto's AES-KW only wraps `CryptoKey`s, so the layer imports the target
408
+ * bytes as a temporary extractable HMAC key and wraps that. RSA-OAEP uses
409
+ * `encrypt` and `decrypt` when the key allows them, and otherwise the same
410
+ * route through `wrapKey` and `unwrapKey`. Both give the same ciphertext.
411
+ *
412
+ * @stability unstable
413
+ * @category layers
414
+ * @since 4.0.0
415
+ */
416
+ export const layerWebCrypto: Layer.Layer<KeyWrap, never, SecureRandom.SecureRandom> = Layer.effect(
417
+ KeyWrap,
418
+ Effect.gen(function*() {
419
+ const random = yield* SecureRandom.SecureRandom
420
+ const crypto = yield* WebCrypto
421
+ const kwCryptoKey = KeyModel.makeCache((subtle, bytes) =>
422
+ subtle.importKey("raw", bytes as BufferSource, "AES-KW", false, ["wrapKey", "unwrapKey"])
423
+ )
424
+ const caches = Asymmetric.makeCaches(family)
425
+
426
+ const wrapBytes = (wrapKey: WrapKey, bytes: Uint8Array) =>
427
+ internal.run("KeyWrap", "wrap", wrapKey.algorithm.name, crypto, async (subtle) => {
428
+ if (isKey(wrapKey)) {
429
+ checkKwLength(bytes.length, 0)
430
+ const kek = await kwCryptoKey(subtle, wrapKey)
431
+ const target = await subtle.importKey("raw", bytes as BufferSource, hmacParams, true, ["sign"])
432
+ return new Uint8Array(await subtle.wrapKey("raw", target, kek, "AES-KW"))
433
+ }
434
+ const publicKey = await caches.publicKey(subtle, wrapKey)
435
+ checkOaepLength(wrapKey.algorithm, publicKey, bytes.length)
436
+ if (publicKey.usages.includes("encrypt")) {
437
+ return new Uint8Array(await subtle.encrypt(rsaOaepParams, publicKey, bytes as BufferSource))
438
+ }
439
+ const target = await subtle.importKey("raw", bytes as BufferSource, hmacParams, true, ["sign"])
440
+ return new Uint8Array(await subtle.wrapKey("raw", target, publicKey, rsaOaepParams))
441
+ })
442
+
443
+ const unwrapBytes = (unwrapKey: UnwrapKey, wrapped: Uint8Array) =>
444
+ internal.run(
445
+ "KeyWrap",
446
+ "unwrap",
447
+ unwrapKey.algorithm.name,
448
+ crypto,
449
+ async (subtle) => {
450
+ if (isKey(unwrapKey)) {
451
+ checkKwLength(wrapped.length, 8)
452
+ const kek = await kwCryptoKey(subtle, unwrapKey)
453
+ const target = await subtle.unwrapKey("raw", wrapped as BufferSource, kek, "AES-KW", hmacParams, true, [
454
+ "sign"
455
+ ])
456
+ return KeyModel.exportRaw(subtle, target)
457
+ }
458
+ const privateKey = await caches.privateKey(subtle, unwrapKey)
459
+ if (privateKey.usages.includes("decrypt")) {
460
+ return new Uint8Array(await subtle.decrypt(rsaOaepParams, privateKey, wrapped as BufferSource))
461
+ }
462
+ const target = await subtle.unwrapKey(
463
+ "raw",
464
+ wrapped as BufferSource,
465
+ privateKey,
466
+ rsaOaepParams,
467
+ hmacParams,
468
+ true,
469
+ ["sign"]
470
+ )
471
+ return KeyModel.exportRaw(subtle, target)
472
+ },
473
+ (cause) =>
474
+ internal.webCryptoError(
475
+ "KeyWrap",
476
+ "unwrap",
477
+ unwrapKey.algorithm.name,
478
+ cause,
479
+ () => new CryptoError.DecryptionFailed()
480
+ )
481
+ )
482
+
483
+ return KeyWrap.of({
484
+ generateKey: <A extends AesKw>(algorithm: A) =>
485
+ Effect.map(
486
+ random.randomBytes(algorithm.keyLength),
487
+ (bytes) => KeyModel.makeBytes<Key<A>>(KeyProto, algorithm, bytes)
488
+ ),
489
+ generateKeyPair: <A extends RsaOaep>(algorithm: A) =>
490
+ Asymmetric.generateKeyPair<KeyPair<A>>(
491
+ family,
492
+ crypto,
493
+ random,
494
+ algorithm,
495
+ Asymmetric.rsaGenerateParams(specOf(algorithm), algorithm.modulusLength)
496
+ ),
497
+ wrap: (wrapKey, key) =>
498
+ Effect.suspend(() => {
499
+ const stored = KeyModel.material(key)
500
+ if (stored._tag === "CryptoKey" && !stored.cryptoKey.extractable) {
501
+ return internal.notExtractable("KeyWrap", "wrap")
502
+ }
503
+ return secretFamily(key.algorithm).toBytes(key).pipe(
504
+ Effect.catch(internal.rehome("KeyWrap", "wrap")),
505
+ Effect.flatMap((bytes) => wrapBytes(wrapKey, bytes))
506
+ )
507
+ }),
508
+ unwrap: <A extends KeyFormat.SecretAlgorithm>(unwrapKey: UnwrapKey, algorithm: A, wrapped: Uint8Array) =>
509
+ Effect.flatMap(
510
+ unwrapBytes(unwrapKey, wrapped),
511
+ (bytes) =>
512
+ secretFamily(algorithm).key(algorithm, bytes).pipe(
513
+ Effect.catch(internal.rehome("KeyWrap", "unwrap"))
514
+ ) as Effect.Effect<KeyFormat.SecretKey<A>, CryptoError.CryptoError>
515
+ )
516
+ })
517
+ })
518
+ )
519
+
520
+ /**
521
+ * Builds an AES-KW key from its bytes.
522
+ *
523
+ * **Details**
524
+ *
525
+ * The bytes are copied. A length other than the algorithm's key length fails
526
+ * with an `InvalidKey` reason. RSA-OAEP keys have no raw form, so passing
527
+ * them is a type error.
528
+ *
529
+ * @stability unstable
530
+ * @category constructors
531
+ * @since 4.0.0
532
+ */
533
+ export const key = <A extends AesKw>(
534
+ algorithm: A,
535
+ bytes: Uint8Array
536
+ ): Effect.Effect<Key<A>, CryptoError.CryptoError> =>
537
+ KeyModel.fromBytes("KeyWrap", "key", KeyProto, algorithm, bytes, KeyModel.checkKeyLength(algorithm))
538
+
539
+ /**
540
+ * Builds an AES-KW key from an existing `CryptoKey`, such as a
541
+ * non-extractable one.
542
+ *
543
+ * **Details**
544
+ *
545
+ * The `CryptoKey` must be a secret AES-KW key of the algorithm's length with
546
+ * both the `wrapKey` and `unwrapKey` usages, since a key reaches both
547
+ * operations. Otherwise the constructor fails with an `InvalidKey` reason. It
548
+ * must come from the `Crypto` object of the `WebCrypto` reference.
549
+ *
550
+ * @stability unstable
551
+ * @category constructors
552
+ * @since 4.0.0
553
+ */
554
+ export const fromCryptoKey = <A extends AesKw>(
555
+ algorithm: A,
556
+ cryptoKey: CryptoKey
557
+ ): Effect.Effect<Key<A>, CryptoError.CryptoError> =>
558
+ KeyModel.fromCryptoKey("KeyWrap", "fromCryptoKey", KeyProto, algorithm, cryptoKey, {
559
+ type: "secret",
560
+ name: "AES-KW",
561
+ usages: ["wrapKey", "unwrapKey"],
562
+ usagePolicy: "all",
563
+ check: KeyModel.checkAesLength("AES-KW", algorithm.keyLength)
564
+ })
565
+
566
+ // RSA-OAEP keys need one usage the layer can use for the key's role, since
567
+ // `wrapKey` and `encrypt` produce the same ciphertext.
568
+ const rsaFromCryptoKey = <K>(
569
+ method: string,
570
+ proto: object,
571
+ algorithm: RsaOaep,
572
+ role: Asymmetric.Role,
573
+ cryptoKey: CryptoKey
574
+ ): Effect.Effect<K, CryptoError.CryptoError> =>
575
+ KeyModel.fromCryptoKey("KeyWrap", method, proto, algorithm, cryptoKey, {
576
+ type: role,
577
+ name: "RSA-OAEP",
578
+ usages: role === "private" ? ["decrypt", "unwrapKey"] : ["encrypt", "wrapKey"],
579
+ usagePolicy: "any",
580
+ check: Asymmetric.checkHash(algorithm.hash.name)
581
+ })
582
+
583
+ /**
584
+ * Builds an RSA-OAEP private key from an existing `CryptoKey`, such as a
585
+ * non-extractable one.
586
+ *
587
+ * **Details**
588
+ *
589
+ * The `CryptoKey` must be an RSA-OAEP private key with the algorithm's hash
590
+ * and the `decrypt` or `unwrapKey` usage. Otherwise the constructor fails
591
+ * with an `InvalidKey` reason. The modulus length is not checked. The key must
592
+ * come from the `Crypto` object of the `WebCrypto` reference.
593
+ *
594
+ * @stability unstable
595
+ * @category constructors
596
+ * @since 4.0.0
597
+ */
598
+ export const privateKeyFromCryptoKey = <A extends RsaOaep>(
599
+ algorithm: A,
600
+ cryptoKey: CryptoKey
601
+ ): Effect.Effect<PrivateKey<A>, CryptoError.CryptoError> =>
602
+ rsaFromCryptoKey("privateKeyFromCryptoKey", PrivateKeyProto, algorithm, "private", cryptoKey)
603
+
604
+ /**
605
+ * Builds an RSA-OAEP public key from an existing `CryptoKey`.
606
+ *
607
+ * **Details**
608
+ *
609
+ * The `CryptoKey` must be an RSA-OAEP public key with the algorithm's hash and
610
+ * the `encrypt` or `wrapKey` usage. Otherwise the constructor fails with an
611
+ * `InvalidKey` reason. The key must come from the `Crypto` object of the
612
+ * `WebCrypto` reference.
613
+ *
614
+ * @stability unstable
615
+ * @category constructors
616
+ * @since 4.0.0
617
+ */
618
+ export const publicKeyFromCryptoKey = <A extends RsaOaep>(
619
+ algorithm: A,
620
+ cryptoKey: CryptoKey
621
+ ): Effect.Effect<PublicKey<A>, CryptoError.CryptoError> =>
622
+ rsaFromCryptoKey("publicKeyFromCryptoKey", PublicKeyProto, algorithm, "public", cryptoKey)
623
+
624
+ /**
625
+ * Exports a key's stored bytes.
626
+ *
627
+ * **Details**
628
+ *
629
+ * Returns a fresh `Uint8Array`: the AES-KW key, or PKCS#8 or SPKI DER for
630
+ * RSA-OAEP. A `CryptoKey`-backed key is exported on the `WebCrypto`
631
+ * reference, and fails with a `NotExtractable` reason when the `CryptoKey` is
632
+ * not extractable.
633
+ *
634
+ * @stability unstable
635
+ * @category converting
636
+ * @since 4.0.0
637
+ */
638
+ export const toBytes = (key: Key | PrivateKey | PublicKey): Effect.Effect<Uint8Array, CryptoError.CryptoError> =>
639
+ isKey(key) ? KeyModel.toBytes("KeyWrap", key, KeyModel.exportRaw) : Asymmetric.toBytes(family, key)