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,489 @@
1
+ /**
2
+ * Key agreement: X25519, and ECDH on P-256, P-384 and P-521.
3
+ *
4
+ * The {@link KeyAgreement} service generates key pairs, derives a shared
5
+ * secret from a private key and a peer's public key, and computes a private
6
+ * key's public key. The top-level {@link privateKey}, {@link publicKey},
7
+ * {@link privateKeyFromCryptoKey}, {@link publicKeyFromCryptoKey}, and
8
+ * {@link toBytes} functions build and export keys without a service.
9
+ *
10
+ * Keys carry their algorithm in their type, so deriving a secret from keys on
11
+ * different curves is a type error. The shared secret is plain bytes: pass it
12
+ * through `Kdf` before using it as a key.
13
+ *
14
+ * Keys are opaque. They hold either bytes or a `CryptoKey`, display only their
15
+ * algorithm, and compare by reference. The bytes are:
16
+ *
17
+ * - X25519: the 32-byte private key and the 32-byte public key;
18
+ * - ECDH: PKCS#8 for private keys, and the uncompressed SEC1 point for public
19
+ * keys.
20
+ *
21
+ * Only X25519 private keys and X25519 and ECDH public keys have a raw
22
+ * constructor. ECDH private keys come from
23
+ * `KeyAgreement.generateKeyPair`, `CryptoKey`s, or key formats.
24
+ *
25
+ * **Gotchas**
26
+ *
27
+ * - X25519 needs Chrome 133, Firefox 130, or Safari 17. There is no fallback
28
+ * for older browsers.
29
+ * - X25519 private keys are generated from `SecureRandom` bytes, so a seeded
30
+ * `SecureRandom` reproduces them. ECDH key generation uses WebCrypto's own
31
+ * randomness and cannot be seeded.
32
+ *
33
+ * @stability unstable
34
+ * @since 4.0.0
35
+ */
36
+ import * as Context from "../Context.ts"
37
+ import * as Effect from "../Effect.ts"
38
+ import type { Inspectable } from "../Inspectable.ts"
39
+ import * as Layer from "../Layer.ts"
40
+ import * as Predicate from "../Predicate.ts"
41
+ import * as CryptoError from "./CryptoError.ts"
42
+ import * as Asymmetric from "./internal/asymmetric.ts"
43
+ import * as KeyModel from "./internal/key.ts"
44
+ import * as internal from "./internal/webCrypto.ts"
45
+ import * as SecureRandom from "./SecureRandom.ts"
46
+ import { WebCrypto } from "./WebCrypto.ts"
47
+
48
+ const PrivateKeyTypeId = "~effect/crypto/KeyAgreement/PrivateKey" as const
49
+ const PublicKeyTypeId = "~effect/crypto/KeyAgreement/PublicKey" as const
50
+
51
+ /**
52
+ * An elliptic curve for ECDH.
53
+ *
54
+ * @stability unstable
55
+ * @category models
56
+ * @since 4.0.0
57
+ */
58
+ export type Curve = "P-256" | "P-384" | "P-521"
59
+
60
+ /**
61
+ * X25519 (RFC 7748), with 32-byte shared secrets.
62
+ *
63
+ * @stability unstable
64
+ * @category models
65
+ * @since 4.0.0
66
+ */
67
+ export interface X25519 {
68
+ readonly _tag: "X25519"
69
+ readonly name: "x25519"
70
+ }
71
+
72
+ /**
73
+ * ECDH on a NIST curve, with shared secrets of the curve's coordinate size.
74
+ *
75
+ * @stability unstable
76
+ * @category models
77
+ * @since 4.0.0
78
+ */
79
+ export interface Ecdh<C extends Curve = Curve> {
80
+ readonly _tag: "Ecdh"
81
+ readonly name: { readonly "P-256": "ecdhP256"; readonly "P-384": "ecdhP384"; readonly "P-521": "ecdhP521" }[C]
82
+ readonly namedCurve: C
83
+ }
84
+
85
+ /**
86
+ * A key agreement algorithm, such as {@link x25519} or {@link ecdhP256}.
87
+ *
88
+ * @stability unstable
89
+ * @category models
90
+ * @since 4.0.0
91
+ */
92
+ export type Algorithm = X25519 | Ecdh
93
+
94
+ /**
95
+ * X25519 (RFC 7748).
96
+ *
97
+ * @stability unstable
98
+ * @category algorithms
99
+ * @since 4.0.0
100
+ */
101
+ export const x25519: X25519 = { _tag: "X25519", name: "x25519" }
102
+
103
+ /**
104
+ * ECDH on P-256, with 32-byte shared secrets.
105
+ *
106
+ * @stability unstable
107
+ * @category algorithms
108
+ * @since 4.0.0
109
+ */
110
+ export const ecdhP256: Ecdh<"P-256"> = { _tag: "Ecdh", name: "ecdhP256", namedCurve: "P-256" }
111
+
112
+ /**
113
+ * ECDH on P-384, with 48-byte shared secrets.
114
+ *
115
+ * @stability unstable
116
+ * @category algorithms
117
+ * @since 4.0.0
118
+ */
119
+ export const ecdhP384: Ecdh<"P-384"> = { _tag: "Ecdh", name: "ecdhP384", namedCurve: "P-384" }
120
+
121
+ /**
122
+ * ECDH on P-521, with 66-byte shared secrets.
123
+ *
124
+ * @stability unstable
125
+ * @category algorithms
126
+ * @since 4.0.0
127
+ */
128
+ export const ecdhP521: Ecdh<"P-521"> = { _tag: "Ecdh", name: "ecdhP521", namedCurve: "P-521" }
129
+
130
+ /**
131
+ * An opaque key agreement private key for the algorithm `A`.
132
+ *
133
+ * **Details**
134
+ *
135
+ * The key holds either bytes or a `CryptoKey` from
136
+ * {@link privateKeyFromCryptoKey}. `toString`, `toJSON`, and `inspect` show
137
+ * only the algorithm. Keys compare by reference and do not implement `Equal`.
138
+ *
139
+ * @stability unstable
140
+ * @category models
141
+ * @since 4.0.0
142
+ */
143
+ export interface PrivateKey<out A extends Algorithm = Algorithm> extends Inspectable {
144
+ readonly [PrivateKeyTypeId]: typeof PrivateKeyTypeId
145
+ readonly algorithm: A
146
+ }
147
+
148
+ /**
149
+ * An opaque key agreement public key for the algorithm `A`.
150
+ *
151
+ * **Details**
152
+ *
153
+ * The key holds either bytes or a `CryptoKey` from
154
+ * {@link publicKeyFromCryptoKey}. Keys compare by reference and do not
155
+ * implement `Equal`.
156
+ *
157
+ * @stability unstable
158
+ * @category models
159
+ * @since 4.0.0
160
+ */
161
+ export interface PublicKey<out A extends Algorithm = Algorithm> extends Inspectable {
162
+ readonly [PublicKeyTypeId]: typeof PublicKeyTypeId
163
+ readonly algorithm: A
164
+ }
165
+
166
+ /**
167
+ * A private key and its public key.
168
+ *
169
+ * @stability unstable
170
+ * @category models
171
+ * @since 4.0.0
172
+ */
173
+ export interface KeyPair<out A extends Algorithm = Algorithm> {
174
+ readonly privateKey: PrivateKey<A>
175
+ readonly publicKey: PublicKey<A>
176
+ }
177
+
178
+ const PrivateKeyProto = KeyModel.redactedProto(PrivateKeyTypeId, "KeyAgreement.PrivateKey")
179
+ const PublicKeyProto = KeyModel.redactedProto(PublicKeyTypeId, "KeyAgreement.PublicKey")
180
+
181
+ /**
182
+ * Checks whether a value is a {@link PrivateKey}.
183
+ *
184
+ * @stability unstable
185
+ * @category guards
186
+ * @since 4.0.0
187
+ */
188
+ export const isPrivateKey = (u: unknown): u is PrivateKey => Predicate.hasProperty(u, PrivateKeyTypeId)
189
+
190
+ /**
191
+ * Checks whether a value is a {@link PublicKey}.
192
+ *
193
+ * @stability unstable
194
+ * @category guards
195
+ * @since 4.0.0
196
+ */
197
+ export const isPublicKey = (u: unknown): u is PublicKey => Predicate.hasProperty(u, PublicKeyTypeId)
198
+
199
+ const specOf = (algorithm: Algorithm): Asymmetric.Spec =>
200
+ algorithm._tag === "X25519"
201
+ ? {
202
+ name: "X25519",
203
+ importParams: { name: "X25519" },
204
+ privateUsages: ["deriveBits"],
205
+ publicUsages: [],
206
+ seedPrefix: Asymmetric.x25519Prefix,
207
+ publicFormat: "raw"
208
+ }
209
+ : {
210
+ name: "ECDH",
211
+ importParams: { name: "ECDH", namedCurve: algorithm.namedCurve },
212
+ privateUsages: ["deriveBits"],
213
+ publicUsages: [],
214
+ seedPrefix: undefined,
215
+ publicFormat: "raw",
216
+ check: Asymmetric.checkNamedCurve(algorithm.namedCurve)
217
+ }
218
+
219
+ /** @internal */
220
+ export const family: Asymmetric.Family = {
221
+ module: "KeyAgreement",
222
+ specOf,
223
+ privateKeyProto: PrivateKeyProto,
224
+ publicKeyProto: PublicKeyProto,
225
+ isPrivateKey
226
+ }
227
+
228
+ // P-521 coordinates are 521 bits, padded to 66 bytes.
229
+ const sharedSecretBits = (algorithm: Algorithm): number =>
230
+ algorithm._tag === "X25519" ? 256 : 8 * Asymmetric.coordinateSizes[algorithm.namedCurve]
231
+
232
+ const invalidPeer = (description: string, cause?: unknown) =>
233
+ new CryptoError.CryptoError({
234
+ module: "KeyAgreement",
235
+ method: "deriveSharedSecret",
236
+ reason: new CryptoError.InvalidKey(cause === undefined ? { description } : { description, cause })
237
+ })
238
+
239
+ /**
240
+ * Service that generates key pairs, derives shared secrets, and computes
241
+ * public keys.
242
+ *
243
+ * **Example** (Agreeing on a secret with X25519)
244
+ *
245
+ * ```ts import.meta.vitest
246
+ * import { Effect, Layer } from "effect"
247
+ * import { KeyAgreement, SecureRandom } from "effect/crypto"
248
+ *
249
+ * const program = Effect.gen(function*() {
250
+ * const keyAgreement = yield* KeyAgreement.KeyAgreement
251
+ * const alice = yield* keyAgreement.generateKeyPair(KeyAgreement.x25519)
252
+ * const bob = yield* keyAgreement.generateKeyPair(KeyAgreement.x25519)
253
+ * const aliceSecret = yield* keyAgreement.deriveSharedSecret(alice.privateKey, bob.publicKey)
254
+ * const bobSecret = yield* keyAgreement.deriveSharedSecret(bob.privateKey, alice.publicKey)
255
+ * return aliceSecret.every((byte, i) => byte === bobSecret[i])
256
+ * })
257
+ *
258
+ * const layer = KeyAgreement.layerWebCrypto.pipe(Layer.provide(SecureRandom.layerWebCrypto))
259
+ * await Effect.runPromise(program.pipe(Effect.provide(layer))) // => true
260
+ * ```
261
+ *
262
+ * @stability unstable
263
+ * @category services
264
+ * @since 4.0.0
265
+ */
266
+ export class KeyAgreement extends Context.Service<KeyAgreement, {
267
+ /**
268
+ * Generates a key pair. X25519 private keys are 32 bytes from
269
+ * `SecureRandom`. ECDH keys are generated by WebCrypto and exported to
270
+ * PKCS#8 and an uncompressed point.
271
+ */
272
+ readonly generateKeyPair: <A extends Algorithm>(algorithm: A) => Effect.Effect<KeyPair<A>, CryptoError.CryptoError>
273
+ /**
274
+ * Computes the secret shared by a private key and a peer's public key on
275
+ * the same curve. A peer key that is not on the curve, or a low-order
276
+ * X25519 key that gives an all-zero secret, fails with an `InvalidKey`
277
+ * reason.
278
+ */
279
+ readonly deriveSharedSecret: <A extends Algorithm>(
280
+ privateKey: PrivateKey<A>,
281
+ publicKey: PublicKey<A>
282
+ ) => Effect.Effect<Uint8Array, CryptoError.CryptoError>
283
+ /**
284
+ * Computes the public key of a private key. A non-extractable `CryptoKey`
285
+ * fails with a `NotExtractable` reason, since its public members cannot be
286
+ * read.
287
+ */
288
+ readonly publicKeyOf: <A extends Algorithm>(
289
+ privateKey: PrivateKey<A>
290
+ ) => Effect.Effect<PublicKey<A>, CryptoError.CryptoError>
291
+ }>()("effect/crypto/KeyAgreement") {}
292
+
293
+ /**
294
+ * Layer that provides `KeyAgreement` on the `WebCrypto` reference.
295
+ *
296
+ * **Details**
297
+ *
298
+ * Every algorithm runs on `crypto.subtle`. The layer imports a byte-backed
299
+ * key on first use and caches the `CryptoKey`. X25519 private keys come from
300
+ * `SecureRandom`, so a seeded `SecureRandom` reproduces them.
301
+ *
302
+ * @stability unstable
303
+ * @category layers
304
+ * @since 4.0.0
305
+ */
306
+ export const layerWebCrypto: Layer.Layer<KeyAgreement, never, SecureRandom.SecureRandom> = Layer.effect(
307
+ KeyAgreement,
308
+ Effect.gen(function*() {
309
+ const random = yield* SecureRandom.SecureRandom
310
+ const crypto = yield* WebCrypto
311
+ const caches = Asymmetric.makeCaches(family)
312
+ return KeyAgreement.of({
313
+ generateKeyPair: <A extends Algorithm>(algorithm: A) =>
314
+ Asymmetric.generateKeyPair<KeyPair<A>>(family, crypto, random, algorithm, specOf(algorithm).importParams),
315
+ deriveSharedSecret: (privateKey, publicKey) =>
316
+ Effect.suspend(() => {
317
+ const algorithm: Algorithm = privateKey.algorithm
318
+ // The types keep curves apart, but keys typed with the default
319
+ // `Algorithm` can still differ at run time.
320
+ if (algorithm.name !== publicKey.algorithm.name) {
321
+ return Effect.fail(
322
+ invalidPeer(`Expected a ${algorithm.name} public key, not ${publicKey.algorithm.name}`)
323
+ )
324
+ }
325
+ const onError = (cause: unknown) =>
326
+ Asymmetric.publicKeyError("KeyAgreement", "deriveSharedSecret", publicKey, cause)
327
+ // The keys are imported before deriving, so an `OperationError` from
328
+ // `deriveBits` can only come from the peer key.
329
+ return internal.run(
330
+ "KeyAgreement",
331
+ "deriveSharedSecret",
332
+ algorithm.name,
333
+ crypto,
334
+ async (subtle) => ({
335
+ privateKey: await caches.privateKey(subtle, privateKey),
336
+ publicKey: await caches.publicKey(subtle, publicKey)
337
+ }),
338
+ onError
339
+ ).pipe(
340
+ Effect.flatMap((keys) =>
341
+ internal.run(
342
+ "KeyAgreement",
343
+ "deriveSharedSecret",
344
+ algorithm.name,
345
+ crypto,
346
+ async (subtle) =>
347
+ new Uint8Array(
348
+ await subtle.deriveBits(
349
+ { name: specOf(algorithm).name, public: keys.publicKey },
350
+ keys.privateKey,
351
+ sharedSecretBits(algorithm)
352
+ )
353
+ ),
354
+ (cause) =>
355
+ internal.isOperationError(cause) ? invalidPeer("Invalid peer public key", cause) : onError(cause)
356
+ )
357
+ ),
358
+ Effect.flatMap((secret) =>
359
+ // RFC 7748, section 6.1: an all-zero X25519 output means the peer
360
+ // sent a low-order point, and protocols such as SSH must abort.
361
+ algorithm._tag === "X25519" && secret.every((byte) => byte === 0)
362
+ ? Effect.fail(invalidPeer("X25519 shared secret must not be all zeros"))
363
+ : Effect.succeed(secret)
364
+ )
365
+ )
366
+ }),
367
+ publicKeyOf: <A extends Algorithm>(privateKey: PrivateKey<A>) =>
368
+ Asymmetric.publicKeyOf<PublicKey<A>>(family, crypto, privateKey)
369
+ })
370
+ })
371
+ )
372
+
373
+ /**
374
+ * Builds an X25519 private key from its 32 bytes.
375
+ *
376
+ * **Details**
377
+ *
378
+ * The bytes are copied. Another length fails with an `InvalidKey` reason,
379
+ * including the 64-byte `private key‖public key` form libsodium uses: pass
380
+ * its first 32 bytes. ECDH private keys have no raw form, so passing them is
381
+ * a type error.
382
+ *
383
+ * @stability unstable
384
+ * @category constructors
385
+ * @since 4.0.0
386
+ */
387
+ export const privateKey = <
388
+ A extends X25519
389
+ >(
390
+ algorithm: A,
391
+ bytes: Uint8Array
392
+ ): Effect.Effect<PrivateKey<A>, CryptoError.CryptoError> =>
393
+ KeyModel.fromBytes(
394
+ "KeyAgreement",
395
+ "privateKey",
396
+ PrivateKeyProto,
397
+ algorithm,
398
+ bytes,
399
+ Asymmetric.checkSeedLength("X25519", "private")
400
+ )
401
+
402
+ /**
403
+ * Builds a public key from its raw form: 32 bytes for X25519, or an
404
+ * uncompressed SEC1 point for ECDH.
405
+ *
406
+ * **Details**
407
+ *
408
+ * The bytes are copied. A wrong length, or a compressed point, fails with an
409
+ * `InvalidKey` reason. Only uncompressed points are taken because Safari and
410
+ * Firefox before 146 reject compressed ones in raw import, though they accept
411
+ * them inside SPKI: decode a compressed point with `KeyFormat.spki`. Whether a
412
+ * point is on the curve is checked when the key is first used.
413
+ *
414
+ * @stability unstable
415
+ * @category constructors
416
+ * @since 4.0.0
417
+ */
418
+ export const publicKey = <A extends Algorithm>(
419
+ algorithm: A,
420
+ bytes: Uint8Array
421
+ ): Effect.Effect<PublicKey<A>, CryptoError.CryptoError> =>
422
+ KeyModel.fromBytes(
423
+ "KeyAgreement",
424
+ "publicKey",
425
+ PublicKeyProto,
426
+ algorithm,
427
+ bytes,
428
+ algorithm._tag === "Ecdh"
429
+ ? Asymmetric.checkPoint(algorithm.namedCurve)
430
+ : Asymmetric.checkSeedLength("X25519", "public")
431
+ )
432
+
433
+ /**
434
+ * Builds a private key from an existing `CryptoKey`, such as a
435
+ * non-extractable one.
436
+ *
437
+ * **Details**
438
+ *
439
+ * The `CryptoKey` must be a private key of the algorithm's WebCrypto name and
440
+ * curve, with the `deriveBits` usage. Otherwise the constructor fails with an
441
+ * `InvalidKey` reason. The key must come from the `Crypto` object of the
442
+ * `WebCrypto` reference.
443
+ *
444
+ * @stability unstable
445
+ * @category constructors
446
+ * @since 4.0.0
447
+ */
448
+ export const privateKeyFromCryptoKey = <A extends Algorithm>(
449
+ algorithm: A,
450
+ cryptoKey: CryptoKey
451
+ ): Effect.Effect<PrivateKey<A>, CryptoError.CryptoError> =>
452
+ Asymmetric.fromCryptoKey(family, "privateKeyFromCryptoKey", algorithm, "private", cryptoKey)
453
+
454
+ /**
455
+ * Builds a public key from an existing `CryptoKey`.
456
+ *
457
+ * **Details**
458
+ *
459
+ * The `CryptoKey` must be a public key of the algorithm's WebCrypto name and
460
+ * curve. Public keys need no usages. Otherwise the constructor fails with an
461
+ * `InvalidKey` reason. The key must come from the `Crypto` object of the
462
+ * `WebCrypto` reference.
463
+ *
464
+ * @stability unstable
465
+ * @category constructors
466
+ * @since 4.0.0
467
+ */
468
+ export const publicKeyFromCryptoKey = <A extends Algorithm>(
469
+ algorithm: A,
470
+ cryptoKey: CryptoKey
471
+ ): Effect.Effect<PublicKey<A>, CryptoError.CryptoError> =>
472
+ Asymmetric.fromCryptoKey(family, "publicKeyFromCryptoKey", algorithm, "public", cryptoKey)
473
+
474
+ /**
475
+ * Exports a key's stored bytes.
476
+ *
477
+ * **Details**
478
+ *
479
+ * Returns a fresh `Uint8Array`: the raw key for X25519, and PKCS#8 or the
480
+ * uncompressed point for ECDH. A `CryptoKey`-backed key is exported on the
481
+ * `WebCrypto` reference, and fails with a `NotExtractable` reason when the
482
+ * `CryptoKey` is not extractable.
483
+ *
484
+ * @stability unstable
485
+ * @category converting
486
+ * @since 4.0.0
487
+ */
488
+ export const toBytes = (key: PrivateKey | PublicKey): Effect.Effect<Uint8Array, CryptoError.CryptoError> =>
489
+ Asymmetric.toBytes(family, key)