effect 4.0.7 → 4.1.1

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 (863) hide show
  1. package/README.md +31 -1
  2. package/THIRD_PARTY_NOTICES.md +62 -0
  3. package/dist/BigDecimal.d.ts +139 -7
  4. package/dist/BigDecimal.d.ts.map +1 -1
  5. package/dist/BigDecimal.js +86 -14
  6. package/dist/BigDecimal.js.map +1 -1
  7. package/dist/Channel.d.ts +12 -6
  8. package/dist/Channel.d.ts.map +1 -1
  9. package/dist/Channel.js +9 -3
  10. package/dist/Channel.js.map +1 -1
  11. package/dist/Config.d.ts +7 -1
  12. package/dist/Config.d.ts.map +1 -1
  13. package/dist/Config.js.map +1 -1
  14. package/dist/Context.d.ts +18 -1
  15. package/dist/Context.d.ts.map +1 -1
  16. package/dist/Context.js +27 -8
  17. package/dist/Context.js.map +1 -1
  18. package/dist/Cron.d.ts +81 -11
  19. package/dist/Cron.d.ts.map +1 -1
  20. package/dist/Cron.js +101 -26
  21. package/dist/Cron.js.map +1 -1
  22. package/dist/Duration.d.ts +78 -0
  23. package/dist/Duration.d.ts.map +1 -1
  24. package/dist/Duration.js +123 -0
  25. package/dist/Duration.js.map +1 -1
  26. package/dist/Effect.d.ts +164 -7
  27. package/dist/Effect.d.ts.map +1 -1
  28. package/dist/Effect.js +11 -1
  29. package/dist/Effect.js.map +1 -1
  30. package/dist/Equal.d.ts +2 -2
  31. package/dist/Equal.d.ts.map +1 -1
  32. package/dist/Equal.js +3 -3
  33. package/dist/Equal.js.map +1 -1
  34. package/dist/FileSystem.d.ts +59 -4
  35. package/dist/FileSystem.d.ts.map +1 -1
  36. package/dist/FileSystem.js +9 -2
  37. package/dist/FileSystem.js.map +1 -1
  38. package/dist/Glob.d.ts +165 -0
  39. package/dist/Glob.d.ts.map +1 -0
  40. package/dist/Glob.js +127 -0
  41. package/dist/Glob.js.map +1 -0
  42. package/dist/Hash.d.ts +3 -2
  43. package/dist/Hash.d.ts.map +1 -1
  44. package/dist/Hash.js +5 -4
  45. package/dist/Hash.js.map +1 -1
  46. package/dist/Iterable.d.ts.map +1 -1
  47. package/dist/Iterable.js +11 -8
  48. package/dist/Iterable.js.map +1 -1
  49. package/dist/Match.d.ts +86 -0
  50. package/dist/Match.d.ts.map +1 -1
  51. package/dist/Match.js +72 -0
  52. package/dist/Match.js.map +1 -1
  53. package/dist/Path.d.ts.map +1 -1
  54. package/dist/Path.js +5 -1
  55. package/dist/Path.js.map +1 -1
  56. package/dist/Pool.d.ts +51 -0
  57. package/dist/Pool.d.ts.map +1 -1
  58. package/dist/Pool.js +61 -10
  59. package/dist/Pool.js.map +1 -1
  60. package/dist/Random.d.ts.map +1 -1
  61. package/dist/Random.js +3 -3
  62. package/dist/Random.js.map +1 -1
  63. package/dist/RcMap.d.ts.map +1 -1
  64. package/dist/RcMap.js +8 -2
  65. package/dist/RcMap.js.map +1 -1
  66. package/dist/Schedule.d.ts +18 -1
  67. package/dist/Schedule.d.ts.map +1 -1
  68. package/dist/Schedule.js +7 -2
  69. package/dist/Schedule.js.map +1 -1
  70. package/dist/Schema.d.ts +668 -42
  71. package/dist/Schema.d.ts.map +1 -1
  72. package/dist/Schema.js +652 -1
  73. package/dist/Schema.js.map +1 -1
  74. package/dist/SchemaGetter.d.ts +6 -1
  75. package/dist/SchemaGetter.d.ts.map +1 -1
  76. package/dist/SchemaGetter.js +22 -11
  77. package/dist/SchemaGetter.js.map +1 -1
  78. package/dist/SchemaRepresentation.d.ts +18 -2
  79. package/dist/SchemaRepresentation.d.ts.map +1 -1
  80. package/dist/SchemaRepresentation.js +20 -2
  81. package/dist/SchemaRepresentation.js.map +1 -1
  82. package/dist/SchemaTransformation.d.ts +10 -5
  83. package/dist/SchemaTransformation.d.ts.map +1 -1
  84. package/dist/SchemaTransformation.js +8 -5
  85. package/dist/SchemaTransformation.js.map +1 -1
  86. package/dist/ScopedCache.d.ts.map +1 -1
  87. package/dist/ScopedCache.js +5 -7
  88. package/dist/ScopedCache.js.map +1 -1
  89. package/dist/Semaphore.d.ts +130 -0
  90. package/dist/Semaphore.d.ts.map +1 -1
  91. package/dist/Semaphore.js +40 -0
  92. package/dist/Semaphore.js.map +1 -1
  93. package/dist/Stream.d.ts +13 -4
  94. package/dist/Stream.d.ts.map +1 -1
  95. package/dist/Stream.js +9 -0
  96. package/dist/Stream.js.map +1 -1
  97. package/dist/Terminal.d.ts +18 -1
  98. package/dist/Terminal.d.ts.map +1 -1
  99. package/dist/Terminal.js +1 -1
  100. package/dist/Terminal.js.map +1 -1
  101. package/dist/ai/AiError.d.ts +43 -116
  102. package/dist/ai/AiError.d.ts.map +1 -1
  103. package/dist/ai/AiError.js +53 -72
  104. package/dist/ai/AiError.js.map +1 -1
  105. package/dist/ai/Decision.d.ts +196 -15
  106. package/dist/ai/Decision.d.ts.map +1 -1
  107. package/dist/ai/Decision.js +130 -0
  108. package/dist/ai/Decision.js.map +1 -1
  109. package/dist/ai/DecisionModel.d.ts +54 -13
  110. package/dist/ai/DecisionModel.d.ts.map +1 -1
  111. package/dist/ai/DecisionModel.js +123 -12
  112. package/dist/ai/DecisionModel.js.map +1 -1
  113. package/dist/ai/McpClient.d.ts +171 -19
  114. package/dist/ai/McpClient.d.ts.map +1 -1
  115. package/dist/ai/McpClient.js +277 -66
  116. package/dist/ai/McpClient.js.map +1 -1
  117. package/dist/ai/McpSchema.d.ts +108 -0
  118. package/dist/ai/McpSchema.d.ts.map +1 -1
  119. package/dist/ai/McpSchema.js +99 -0
  120. package/dist/ai/McpSchema.js.map +1 -1
  121. package/dist/ai/McpServer.d.ts +744 -29
  122. package/dist/ai/McpServer.d.ts.map +1 -1
  123. package/dist/ai/McpServer.js +763 -136
  124. package/dist/ai/McpServer.js.map +1 -1
  125. package/dist/ai/McpTest.d.ts +130 -0
  126. package/dist/ai/McpTest.d.ts.map +1 -0
  127. package/dist/ai/McpTest.js +237 -0
  128. package/dist/ai/McpTest.js.map +1 -0
  129. package/dist/ai/Prompt.d.ts.map +1 -1
  130. package/dist/ai/Prompt.js +20 -11
  131. package/dist/ai/Prompt.js.map +1 -1
  132. package/dist/ai/Response.d.ts +1 -25
  133. package/dist/ai/Response.d.ts.map +1 -1
  134. package/dist/ai/Response.js +1 -10
  135. package/dist/ai/Response.js.map +1 -1
  136. package/dist/ai/Tool.d.ts +19 -1
  137. package/dist/ai/Tool.d.ts.map +1 -1
  138. package/dist/ai/Tool.js +5 -7
  139. package/dist/ai/Tool.js.map +1 -1
  140. package/dist/ai/index.d.ts +5 -0
  141. package/dist/ai/index.d.ts.map +1 -1
  142. package/dist/ai/index.js +5 -0
  143. package/dist/ai/index.js.map +1 -1
  144. package/dist/ai/internal/mcpCore.js +89 -15
  145. package/dist/ai/internal/mcpCore.js.map +1 -1
  146. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +7 -6
  147. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  148. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +7 -6
  149. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  150. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +7 -6
  151. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  152. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +7 -6
  153. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  154. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +60 -17
  155. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  156. package/dist/ai/internal/mcpProtocol.js +25 -0
  157. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  158. package/dist/ai/internal/mcpRuntime.js +8 -6
  159. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  160. package/dist/ai/internal/mcpSkills.d.ts +2 -0
  161. package/dist/ai/internal/mcpSkills.d.ts.map +1 -0
  162. package/dist/ai/internal/mcpSkills.js +428 -0
  163. package/dist/ai/internal/mcpSkills.js.map +1 -0
  164. package/dist/ai/internal/mcpStatefulRuntime.js +6 -1
  165. package/dist/ai/internal/mcpStatefulRuntime.js.map +1 -1
  166. package/dist/cli/Argument.d.ts +6 -0
  167. package/dist/cli/Argument.d.ts.map +1 -1
  168. package/dist/cli/Argument.js +2 -0
  169. package/dist/cli/Argument.js.map +1 -1
  170. package/dist/cli/CliOutput.d.ts +65 -1
  171. package/dist/cli/CliOutput.d.ts.map +1 -1
  172. package/dist/cli/CliOutput.js +94 -37
  173. package/dist/cli/CliOutput.js.map +1 -1
  174. package/dist/cli/Command.d.ts +23 -0
  175. package/dist/cli/Command.d.ts.map +1 -1
  176. package/dist/cli/Command.js +8 -0
  177. package/dist/cli/Command.js.map +1 -1
  178. package/dist/cli/Flag.d.ts +107 -0
  179. package/dist/cli/Flag.d.ts.map +1 -1
  180. package/dist/cli/Flag.js +37 -0
  181. package/dist/cli/Flag.js.map +1 -1
  182. package/dist/cli/HelpDoc.d.ts +15 -1
  183. package/dist/cli/HelpDoc.d.ts.map +1 -1
  184. package/dist/cli/Param.d.ts +6 -0
  185. package/dist/cli/Param.d.ts.map +1 -1
  186. package/dist/cli/Param.js +2 -0
  187. package/dist/cli/Param.js.map +1 -1
  188. package/dist/cli/Primitive.d.ts +14 -0
  189. package/dist/cli/Primitive.d.ts.map +1 -1
  190. package/dist/cli/Primitive.js +15 -1
  191. package/dist/cli/Primitive.js.map +1 -1
  192. package/dist/cli/Prompt.d.ts +1 -0
  193. package/dist/cli/Prompt.d.ts.map +1 -1
  194. package/dist/cli/Prompt.js +1 -0
  195. package/dist/cli/Prompt.js.map +1 -1
  196. package/dist/cli/internal/help.d.ts.map +1 -1
  197. package/dist/cli/internal/help.js +17 -10
  198. package/dist/cli/internal/help.js.map +1 -1
  199. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  200. package/dist/cluster/ClusterWorkflowEngine.js +15 -5
  201. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  202. package/dist/cluster/Reply.d.ts +1 -1
  203. package/dist/cluster/Reply.d.ts.map +1 -1
  204. package/dist/cluster/Reply.js.map +1 -1
  205. package/dist/cluster/Sharding.d.ts.map +1 -1
  206. package/dist/cluster/Sharding.js +93 -28
  207. package/dist/cluster/Sharding.js.map +1 -1
  208. package/dist/cluster/ShardingConfig.d.ts +72 -6
  209. package/dist/cluster/ShardingConfig.d.ts.map +1 -1
  210. package/dist/cluster/ShardingConfig.js +4 -0
  211. package/dist/cluster/ShardingConfig.js.map +1 -1
  212. package/dist/cluster/SingleRunner.d.ts +3 -3
  213. package/dist/cluster/SingleRunner.d.ts.map +1 -1
  214. package/dist/cluster/SingleRunner.js +1 -1
  215. package/dist/cluster/SqlMessageStorage.d.ts +37 -6
  216. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  217. package/dist/cluster/SqlMessageStorage.js +34 -7
  218. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  219. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  220. package/dist/cluster/SqlRunnerStorage.js +23 -8
  221. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  222. package/dist/cluster/internal/entityManager.js +15 -7
  223. package/dist/cluster/internal/entityManager.js.map +1 -1
  224. package/dist/crypto/Aead.d.ts +323 -0
  225. package/dist/crypto/Aead.d.ts.map +1 -0
  226. package/dist/crypto/Aead.js +331 -0
  227. package/dist/crypto/Aead.js.map +1 -0
  228. package/dist/crypto/Cipher.d.ts +236 -0
  229. package/dist/crypto/Cipher.d.ts.map +1 -0
  230. package/dist/crypto/Cipher.js +233 -0
  231. package/dist/crypto/Cipher.js.map +1 -0
  232. package/dist/crypto/CryptoError.d.ts +212 -0
  233. package/dist/crypto/CryptoError.d.ts.map +1 -0
  234. package/dist/crypto/CryptoError.js +202 -0
  235. package/dist/crypto/CryptoError.js.map +1 -0
  236. package/dist/crypto/Digest.d.ts +143 -0
  237. package/dist/crypto/Digest.d.ts.map +1 -0
  238. package/dist/crypto/Digest.js +146 -0
  239. package/dist/crypto/Digest.js.map +1 -0
  240. package/dist/crypto/Kdf.d.ts +220 -0
  241. package/dist/crypto/Kdf.d.ts.map +1 -0
  242. package/dist/crypto/Kdf.js +212 -0
  243. package/dist/crypto/Kdf.js.map +1 -0
  244. package/dist/crypto/KeyAgreement.d.ts +324 -0
  245. package/dist/crypto/KeyAgreement.d.ts.map +1 -0
  246. package/dist/crypto/KeyAgreement.js +303 -0
  247. package/dist/crypto/KeyAgreement.js.map +1 -0
  248. package/dist/crypto/KeyFormat.d.ts +341 -0
  249. package/dist/crypto/KeyFormat.d.ts.map +1 -0
  250. package/dist/crypto/KeyFormat.js +556 -0
  251. package/dist/crypto/KeyFormat.js.map +1 -0
  252. package/dist/crypto/KeyWrap.d.ts +390 -0
  253. package/dist/crypto/KeyWrap.d.ts.map +1 -0
  254. package/dist/crypto/KeyWrap.js +381 -0
  255. package/dist/crypto/KeyWrap.js.map +1 -0
  256. package/dist/crypto/Mac.d.ts +278 -0
  257. package/dist/crypto/Mac.d.ts.map +1 -0
  258. package/dist/crypto/Mac.js +288 -0
  259. package/dist/crypto/Mac.js.map +1 -0
  260. package/dist/crypto/SecureRandom.d.ts +340 -0
  261. package/dist/crypto/SecureRandom.d.ts.map +1 -0
  262. package/dist/crypto/SecureRandom.js +257 -0
  263. package/dist/crypto/SecureRandom.js.map +1 -0
  264. package/dist/crypto/Signature.d.ts +449 -0
  265. package/dist/crypto/Signature.d.ts.map +1 -0
  266. package/dist/crypto/Signature.js +484 -0
  267. package/dist/crypto/Signature.js.map +1 -0
  268. package/dist/crypto/WebCrypto.d.ts +80 -0
  269. package/dist/crypto/WebCrypto.d.ts.map +1 -0
  270. package/dist/crypto/WebCrypto.js +63 -0
  271. package/dist/crypto/WebCrypto.js.map +1 -0
  272. package/dist/crypto/index.d.ts +65 -0
  273. package/dist/crypto/index.d.ts.map +1 -0
  274. package/dist/crypto/index.js +66 -0
  275. package/dist/crypto/index.js.map +1 -0
  276. package/dist/crypto/internal/asymmetric.d.ts +2 -0
  277. package/dist/crypto/internal/asymmetric.d.ts.map +1 -0
  278. package/dist/crypto/internal/asymmetric.js +210 -0
  279. package/dist/crypto/internal/asymmetric.js.map +1 -0
  280. package/dist/crypto/internal/chacha.d.ts +46 -0
  281. package/dist/crypto/internal/chacha.d.ts.map +1 -0
  282. package/dist/crypto/internal/chacha.js +885 -0
  283. package/dist/crypto/internal/chacha.js.map +1 -0
  284. package/dist/crypto/internal/der.d.ts +6 -0
  285. package/dist/crypto/internal/der.d.ts.map +1 -0
  286. package/dist/crypto/internal/der.js +86 -0
  287. package/dist/crypto/internal/der.js.map +1 -0
  288. package/dist/crypto/internal/digest.d.ts +2 -0
  289. package/dist/crypto/internal/digest.d.ts.map +1 -0
  290. package/dist/crypto/internal/digest.js +15 -0
  291. package/dist/crypto/internal/digest.js.map +1 -0
  292. package/dist/crypto/internal/key.d.ts +2 -0
  293. package/dist/crypto/internal/key.d.ts.map +1 -0
  294. package/dist/crypto/internal/key.js +171 -0
  295. package/dist/crypto/internal/key.js.map +1 -0
  296. package/dist/crypto/internal/md5.d.ts +39 -0
  297. package/dist/crypto/internal/md5.d.ts.map +1 -0
  298. package/dist/crypto/internal/md5.js +179 -0
  299. package/dist/crypto/internal/md5.js.map +1 -0
  300. package/dist/crypto/internal/webCrypto.d.ts +2 -0
  301. package/dist/crypto/internal/webCrypto.d.ts.map +1 -0
  302. package/dist/crypto/internal/webCrypto.js +111 -0
  303. package/dist/crypto/internal/webCrypto.js.map +1 -0
  304. package/dist/encoding/Base64Url.d.ts.map +1 -1
  305. package/dist/encoding/Base64Url.js +29 -5
  306. package/dist/encoding/Base64Url.js.map +1 -1
  307. package/dist/encoding/Csv.d.ts +608 -0
  308. package/dist/encoding/Csv.d.ts.map +1 -0
  309. package/dist/encoding/Csv.js +718 -0
  310. package/dist/encoding/Csv.js.map +1 -0
  311. package/dist/encoding/Hex.d.ts +3 -2
  312. package/dist/encoding/Hex.d.ts.map +1 -1
  313. package/dist/encoding/Hex.js +3 -2
  314. package/dist/encoding/Hex.js.map +1 -1
  315. package/dist/encoding/Ndjson.d.ts +5 -4
  316. package/dist/encoding/Ndjson.d.ts.map +1 -1
  317. package/dist/encoding/Ndjson.js +6 -5
  318. package/dist/encoding/Ndjson.js.map +1 -1
  319. package/dist/encoding/SchemaBinary.d.ts.map +1 -1
  320. package/dist/encoding/SchemaBinary.js +42 -4
  321. package/dist/encoding/SchemaBinary.js.map +1 -1
  322. package/dist/encoding/Sse.d.ts +3 -1
  323. package/dist/encoding/Sse.d.ts.map +1 -1
  324. package/dist/encoding/Sse.js +5 -3
  325. package/dist/encoding/Sse.js.map +1 -1
  326. package/dist/encoding/Toml.d.ts +17 -3
  327. package/dist/encoding/Toml.d.ts.map +1 -1
  328. package/dist/encoding/Toml.js +104 -16
  329. package/dist/encoding/Toml.js.map +1 -1
  330. package/dist/encoding/Yaml.d.ts +8 -1
  331. package/dist/encoding/Yaml.d.ts.map +1 -1
  332. package/dist/encoding/Yaml.js +54 -18
  333. package/dist/encoding/Yaml.js.map +1 -1
  334. package/dist/encoding/index.d.ts +5 -0
  335. package/dist/encoding/index.d.ts.map +1 -1
  336. package/dist/encoding/index.js +5 -0
  337. package/dist/encoding/index.js.map +1 -1
  338. package/dist/eventlog/EventJournal.d.ts.map +1 -1
  339. package/dist/eventlog/EventJournal.js +6 -3
  340. package/dist/eventlog/EventJournal.js.map +1 -1
  341. package/dist/eventlog/EventLog.d.ts +126 -4
  342. package/dist/eventlog/EventLog.d.ts.map +1 -1
  343. package/dist/eventlog/EventLog.js +207 -12
  344. package/dist/eventlog/EventLog.js.map +1 -1
  345. package/dist/eventlog/EventLogEncryption.d.ts +41 -4
  346. package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
  347. package/dist/eventlog/EventLogEncryption.js +83 -64
  348. package/dist/eventlog/EventLogEncryption.js.map +1 -1
  349. package/dist/eventlog/EventLogMessage.d.ts +279 -0
  350. package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
  351. package/dist/eventlog/EventLogMessage.js +217 -1
  352. package/dist/eventlog/EventLogMessage.js.map +1 -1
  353. package/dist/eventlog/EventLogRemote.d.ts +200 -28
  354. package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
  355. package/dist/eventlog/EventLogRemote.js +186 -16
  356. package/dist/eventlog/EventLogRemote.js.map +1 -1
  357. package/dist/eventlog/EventLogServer.d.ts +10 -1
  358. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  359. package/dist/eventlog/EventLogServer.js +45 -22
  360. package/dist/eventlog/EventLogServer.js.map +1 -1
  361. package/dist/eventlog/EventLogServerEncrypted.d.ts +336 -5
  362. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  363. package/dist/eventlog/EventLogServerEncrypted.js +769 -14
  364. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  365. package/dist/eventlog/EventLogServerUnencrypted.d.ts +17 -0
  366. package/dist/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
  367. package/dist/eventlog/EventLogServerUnencrypted.js +14 -2
  368. package/dist/eventlog/EventLogServerUnencrypted.js.map +1 -1
  369. package/dist/eventlog/EventLogSessionAuth.d.ts +26 -3
  370. package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
  371. package/dist/eventlog/EventLogSessionAuth.js +63 -64
  372. package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
  373. package/dist/eventlog/EventRow.d.ts +4 -0
  374. package/dist/eventlog/EventRow.d.ts.map +1 -1
  375. package/dist/eventlog/EventRow.js +12 -2
  376. package/dist/eventlog/EventRow.js.map +1 -1
  377. package/dist/eventlog/SqlEventJournal.js +2 -2
  378. package/dist/eventlog/SqlEventJournal.js.map +1 -1
  379. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +21 -5
  380. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
  381. package/dist/eventlog/SqlEventLogServerEncrypted.js +1048 -113
  382. package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
  383. package/dist/eventlog/SqlEventLogServerUnencrypted.js +2 -2
  384. package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
  385. package/dist/eventlog/internal/batches.d.ts +12 -0
  386. package/dist/eventlog/internal/batches.d.ts.map +1 -0
  387. package/dist/eventlog/internal/batches.js +26 -0
  388. package/dist/eventlog/internal/batches.js.map +1 -0
  389. package/dist/eventlog/internal/compaction.d.ts +38 -0
  390. package/dist/eventlog/internal/compaction.d.ts.map +1 -0
  391. package/dist/eventlog/internal/compaction.js +33 -0
  392. package/dist/eventlog/internal/compaction.js.map +1 -0
  393. package/dist/eventlog/internal/identityRootSecretDerivation.js +66 -67
  394. package/dist/eventlog/internal/identityRootSecretDerivation.js.map +1 -1
  395. package/dist/eventlog/internal/remoteCompaction.d.ts +31 -0
  396. package/dist/eventlog/internal/remoteCompaction.d.ts.map +1 -0
  397. package/dist/eventlog/internal/remoteCompaction.js +76 -0
  398. package/dist/eventlog/internal/remoteCompaction.js.map +1 -0
  399. package/dist/graphql/GraphQLClient.d.ts +3 -1
  400. package/dist/graphql/GraphQLClient.d.ts.map +1 -1
  401. package/dist/graphql/GraphQLClient.js.map +1 -1
  402. package/dist/graphql/GraphQLClientError.d.ts +14 -9
  403. package/dist/graphql/GraphQLClientError.d.ts.map +1 -1
  404. package/dist/graphql/GraphQLClientError.js +14 -21
  405. package/dist/graphql/GraphQLClientError.js.map +1 -1
  406. package/dist/graphql/GraphQLProtocol.d.ts +12 -3
  407. package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
  408. package/dist/graphql/GraphQLProtocol.js +4 -1
  409. package/dist/graphql/GraphQLProtocol.js.map +1 -1
  410. package/dist/http/Cookies.d.ts +172 -0
  411. package/dist/http/Cookies.d.ts.map +1 -1
  412. package/dist/http/Cookies.js +143 -1
  413. package/dist/http/Cookies.js.map +1 -1
  414. package/dist/http/FetchHttpClient.d.ts +26 -2
  415. package/dist/http/FetchHttpClient.d.ts.map +1 -1
  416. package/dist/http/FetchHttpClient.js +78 -15
  417. package/dist/http/FetchHttpClient.js.map +1 -1
  418. package/dist/http/HttpClient.d.ts +268 -15
  419. package/dist/http/HttpClient.d.ts.map +1 -1
  420. package/dist/http/HttpClient.js +140 -7
  421. package/dist/http/HttpClient.js.map +1 -1
  422. package/dist/http/HttpClientRequest.d.ts +9 -5
  423. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  424. package/dist/http/HttpClientRequest.js +2 -3
  425. package/dist/http/HttpClientRequest.js.map +1 -1
  426. package/dist/http/HttpClientResponse.d.ts.map +1 -1
  427. package/dist/http/HttpClientResponse.js +3 -2
  428. package/dist/http/HttpClientResponse.js.map +1 -1
  429. package/dist/http/HttpMethod.d.ts +7 -1
  430. package/dist/http/HttpMethod.d.ts.map +1 -1
  431. package/dist/http/HttpMethod.js +3 -8
  432. package/dist/http/HttpMethod.js.map +1 -1
  433. package/dist/http/HttpServerRequest.d.ts +5 -2
  434. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  435. package/dist/http/HttpServerRequest.js +44 -39
  436. package/dist/http/HttpServerRequest.js.map +1 -1
  437. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  438. package/dist/http/HttpServerResponse.js +3 -2
  439. package/dist/http/HttpServerResponse.js.map +1 -1
  440. package/dist/http/HttpTraceContext.d.ts +2 -1
  441. package/dist/http/HttpTraceContext.d.ts.map +1 -1
  442. package/dist/http/HttpTraceContext.js +7 -5
  443. package/dist/http/HttpTraceContext.js.map +1 -1
  444. package/dist/http/ProblemDetails.d.ts +96 -0
  445. package/dist/http/ProblemDetails.d.ts.map +1 -0
  446. package/dist/http/ProblemDetails.js +98 -0
  447. package/dist/http/ProblemDetails.js.map +1 -0
  448. package/dist/http/index.d.ts +5 -0
  449. package/dist/http/index.d.ts.map +1 -1
  450. package/dist/http/index.js +5 -0
  451. package/dist/http/index.js.map +1 -1
  452. package/dist/http/internal/decompression.js +3 -2
  453. package/dist/http/internal/decompression.js.map +1 -1
  454. package/dist/http/internal/mimeTypes.d.ts +4 -1
  455. package/dist/http/internal/mimeTypes.d.ts.map +1 -1
  456. package/dist/http/internal/mimeTypes.js +4 -1
  457. package/dist/http/internal/mimeTypes.js.map +1 -1
  458. package/dist/http/internal/urlParams.js +8 -0
  459. package/dist/http/internal/urlParams.js.map +1 -1
  460. package/dist/http-api/HttpApiBuilder.js +19 -5
  461. package/dist/http-api/HttpApiBuilder.js.map +1 -1
  462. package/dist/http-api/HttpApiClient.d.ts +63 -0
  463. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  464. package/dist/http-api/HttpApiClient.js +51 -0
  465. package/dist/http-api/HttpApiClient.js.map +1 -1
  466. package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
  467. package/dist/http-api/HttpApiEndpoint.js +14 -5
  468. package/dist/http-api/HttpApiEndpoint.js.map +1 -1
  469. package/dist/http-api/HttpApiError.d.ts +185 -13
  470. package/dist/http-api/HttpApiError.d.ts.map +1 -1
  471. package/dist/http-api/HttpApiError.js +128 -0
  472. package/dist/http-api/HttpApiError.js.map +1 -1
  473. package/dist/http-api/HttpApiMiddleware.d.ts +64 -17
  474. package/dist/http-api/HttpApiMiddleware.d.ts.map +1 -1
  475. package/dist/http-api/HttpApiMiddleware.js +85 -1
  476. package/dist/http-api/HttpApiMiddleware.js.map +1 -1
  477. package/dist/http-api/HttpApiSchema.d.ts +76 -14
  478. package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
  479. package/dist/http-api/HttpApiSchema.js +54 -1
  480. package/dist/http-api/HttpApiSchema.js.map +1 -1
  481. package/dist/index.d.ts +5 -5
  482. package/dist/index.d.ts.map +1 -1
  483. package/dist/index.js +5 -5
  484. package/dist/index.js.map +1 -1
  485. package/dist/internal/dateTime.js +49 -24
  486. package/dist/internal/dateTime.js.map +1 -1
  487. package/dist/internal/effect.js +35 -14
  488. package/dist/internal/effect.js.map +1 -1
  489. package/dist/internal/glob.d.ts +2 -0
  490. package/dist/internal/glob.d.ts.map +1 -0
  491. package/dist/internal/glob.js +808 -0
  492. package/dist/internal/glob.js.map +1 -0
  493. package/dist/internal/graphql.js +21 -7
  494. package/dist/internal/graphql.js.map +1 -1
  495. package/dist/internal/graphqlHeaders.d.ts +7 -0
  496. package/dist/internal/graphqlHeaders.d.ts.map +1 -1
  497. package/dist/internal/graphqlHeaders.js +11 -0
  498. package/dist/internal/graphqlHeaders.js.map +1 -1
  499. package/dist/internal/matcher.js +10 -0
  500. package/dist/internal/matcher.js.map +1 -1
  501. package/dist/internal/persistence.js +9 -0
  502. package/dist/internal/persistence.js.map +1 -1
  503. package/dist/internal/rcRef.js +4 -1
  504. package/dist/internal/rcRef.js.map +1 -1
  505. package/dist/internal/request.js +29 -42
  506. package/dist/internal/request.js.map +1 -1
  507. package/dist/internal/schema/fromJsonSchemaDocument.js +7 -8
  508. package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
  509. package/dist/internal/schema/toCodeDocument.js +6 -3
  510. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  511. package/dist/internal/trie.js +42 -13
  512. package/dist/internal/trie.js.map +1 -1
  513. package/dist/internal/ulid.js +41 -0
  514. package/dist/internal/ulid.js.map +1 -1
  515. package/dist/internal/uuid.js +52 -8
  516. package/dist/internal/uuid.js.map +1 -1
  517. package/dist/internal/version.js +1 -1
  518. package/dist/jose/JoseError.d.ts +285 -0
  519. package/dist/jose/JoseError.d.ts.map +1 -0
  520. package/dist/jose/JoseError.js +269 -0
  521. package/dist/jose/JoseError.js.map +1 -0
  522. package/dist/jose/Jwe.d.ts +128 -0
  523. package/dist/jose/Jwe.d.ts.map +1 -0
  524. package/dist/jose/Jwe.js +134 -0
  525. package/dist/jose/Jwe.js.map +1 -0
  526. package/dist/jose/Jwk.d.ts +597 -0
  527. package/dist/jose/Jwk.d.ts.map +1 -0
  528. package/dist/jose/Jwk.js +503 -0
  529. package/dist/jose/Jwk.js.map +1 -0
  530. package/dist/jose/Jwks.d.ts +236 -0
  531. package/dist/jose/Jwks.d.ts.map +1 -0
  532. package/dist/jose/Jwks.js +306 -0
  533. package/dist/jose/Jwks.js.map +1 -0
  534. package/dist/jose/Jws.d.ts +177 -0
  535. package/dist/jose/Jws.d.ts.map +1 -0
  536. package/dist/jose/Jws.js +183 -0
  537. package/dist/jose/Jws.js.map +1 -0
  538. package/dist/jose/Jwt.d.ts +270 -0
  539. package/dist/jose/Jwt.d.ts.map +1 -0
  540. package/dist/jose/Jwt.js +293 -0
  541. package/dist/jose/Jwt.js.map +1 -0
  542. package/dist/jose/index.d.ts +51 -0
  543. package/dist/jose/index.d.ts.map +1 -0
  544. package/dist/jose/index.js +52 -0
  545. package/dist/jose/index.js.map +1 -0
  546. package/dist/jose/internal/compact.d.ts +2 -0
  547. package/dist/jose/internal/compact.d.ts.map +1 -0
  548. package/dist/jose/internal/compact.js +179 -0
  549. package/dist/jose/internal/compact.js.map +1 -0
  550. package/dist/net/Host.d.ts.map +1 -1
  551. package/dist/net/Host.js +5 -10
  552. package/dist/net/Host.js.map +1 -1
  553. package/dist/observability/Otlp.d.ts +15 -4
  554. package/dist/observability/Otlp.d.ts.map +1 -1
  555. package/dist/observability/Otlp.js +10 -0
  556. package/dist/observability/Otlp.js.map +1 -1
  557. package/dist/observability/OtlpResource.d.ts +7 -0
  558. package/dist/observability/OtlpResource.d.ts.map +1 -1
  559. package/dist/observability/OtlpResource.js +11 -1
  560. package/dist/observability/OtlpResource.js.map +1 -1
  561. package/dist/observability/OtlpSerialization.d.ts +1 -1
  562. package/dist/observability/OtlpSerialization.d.ts.map +1 -1
  563. package/dist/observability/OtlpSerialization.js +10 -4
  564. package/dist/observability/OtlpSerialization.js.map +1 -1
  565. package/dist/observability/internal/otlpProtobuf.js +3 -3
  566. package/dist/observability/internal/otlpProtobuf.js.map +1 -1
  567. package/dist/observability/internal/protobuf.js +6 -0
  568. package/dist/observability/internal/protobuf.js.map +1 -1
  569. package/dist/persistence/CircuitBreaker.d.ts +98 -38
  570. package/dist/persistence/CircuitBreaker.d.ts.map +1 -1
  571. package/dist/persistence/CircuitBreaker.js +67 -29
  572. package/dist/persistence/CircuitBreaker.js.map +1 -1
  573. package/dist/persistence/KeyValueStore.d.ts +47 -2
  574. package/dist/persistence/KeyValueStore.d.ts.map +1 -1
  575. package/dist/persistence/KeyValueStore.js +129 -18
  576. package/dist/persistence/KeyValueStore.js.map +1 -1
  577. package/dist/persistence/PersistedQueue.d.ts +9 -0
  578. package/dist/persistence/PersistedQueue.d.ts.map +1 -1
  579. package/dist/persistence/PersistedQueue.js +94 -52
  580. package/dist/persistence/PersistedQueue.js.map +1 -1
  581. package/dist/persistence/Persistence.d.ts +10 -4
  582. package/dist/persistence/Persistence.d.ts.map +1 -1
  583. package/dist/persistence/Persistence.js +18 -11
  584. package/dist/persistence/Persistence.js.map +1 -1
  585. package/dist/persistence/RateLimiter.d.ts +8 -0
  586. package/dist/persistence/RateLimiter.d.ts.map +1 -1
  587. package/dist/persistence/RateLimiter.js +63 -12
  588. package/dist/persistence/RateLimiter.js.map +1 -1
  589. package/dist/persistence/index.d.ts +1 -1
  590. package/dist/persistence/index.js +1 -1
  591. package/dist/process/ChildProcess.d.ts +207 -67
  592. package/dist/process/ChildProcess.d.ts.map +1 -1
  593. package/dist/process/ChildProcess.js +56 -158
  594. package/dist/process/ChildProcess.js.map +1 -1
  595. package/dist/process/ChildProcessSpawner.d.ts +5 -0
  596. package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
  597. package/dist/process/ChildProcessSpawner.js.map +1 -1
  598. package/dist/process/CommandLine.d.ts +294 -0
  599. package/dist/process/CommandLine.d.ts.map +1 -0
  600. package/dist/process/CommandLine.js +481 -0
  601. package/dist/process/CommandLine.js.map +1 -0
  602. package/dist/process/index.d.ts +5 -0
  603. package/dist/process/index.d.ts.map +1 -1
  604. package/dist/process/index.js +5 -0
  605. package/dist/process/index.js.map +1 -1
  606. package/dist/reactivity/Atom.d.ts +2 -1
  607. package/dist/reactivity/Atom.d.ts.map +1 -1
  608. package/dist/reactivity/Atom.js +3 -4
  609. package/dist/reactivity/Atom.js.map +1 -1
  610. package/dist/reactivity/AtomRegistry.js +17 -7
  611. package/dist/reactivity/AtomRegistry.js.map +1 -1
  612. package/dist/rpc/Rpc.d.ts +1 -1
  613. package/dist/rpc/Rpc.d.ts.map +1 -1
  614. package/dist/rpc/Rpc.js.map +1 -1
  615. package/dist/rpc/RpcClient.d.ts +28 -1
  616. package/dist/rpc/RpcClient.d.ts.map +1 -1
  617. package/dist/rpc/RpcClient.js +78 -27
  618. package/dist/rpc/RpcClient.js.map +1 -1
  619. package/dist/rpc/RpcMessage.d.ts +13 -3
  620. package/dist/rpc/RpcMessage.d.ts.map +1 -1
  621. package/dist/rpc/RpcMessage.js +1 -0
  622. package/dist/rpc/RpcMessage.js.map +1 -1
  623. package/dist/rpc/RpcSerialization.d.ts.map +1 -1
  624. package/dist/rpc/RpcSerialization.js +6 -0
  625. package/dist/rpc/RpcSerialization.js.map +1 -1
  626. package/dist/rpc/RpcServer.d.ts +31 -0
  627. package/dist/rpc/RpcServer.d.ts.map +1 -1
  628. package/dist/rpc/RpcServer.js +139 -66
  629. package/dist/rpc/RpcServer.js.map +1 -1
  630. package/dist/schema/Model.d.ts +14 -0
  631. package/dist/schema/Model.d.ts.map +1 -1
  632. package/dist/schema/Model.js +18 -3
  633. package/dist/schema/Model.js.map +1 -1
  634. package/dist/sql/Migrator.d.ts +9 -20
  635. package/dist/sql/Migrator.d.ts.map +1 -1
  636. package/dist/sql/Migrator.js +20 -53
  637. package/dist/sql/Migrator.js.map +1 -1
  638. package/dist/sql/MigratorFileSystem.d.ts +21 -0
  639. package/dist/sql/MigratorFileSystem.d.ts.map +1 -0
  640. package/dist/sql/MigratorFileSystem.js +57 -0
  641. package/dist/sql/MigratorFileSystem.js.map +1 -0
  642. package/dist/sql/SqlClient.d.ts +38 -3
  643. package/dist/sql/SqlClient.d.ts.map +1 -1
  644. package/dist/sql/SqlClient.js +9 -12
  645. package/dist/sql/SqlClient.js.map +1 -1
  646. package/dist/sql/Statement.d.ts +61 -9
  647. package/dist/sql/Statement.d.ts.map +1 -1
  648. package/dist/sql/Statement.js +24 -33
  649. package/dist/sql/Statement.js.map +1 -1
  650. package/dist/sql/index.js +1 -1
  651. package/dist/testing/index.d.ts +0 -5
  652. package/dist/testing/index.d.ts.map +1 -1
  653. package/dist/testing/index.js +0 -5
  654. package/dist/testing/index.js.map +1 -1
  655. package/dist/workflow/Workflow.d.ts +4 -0
  656. package/dist/workflow/Workflow.d.ts.map +1 -1
  657. package/dist/workflow/Workflow.js.map +1 -1
  658. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  659. package/dist/workflow/WorkflowEngine.js +5 -0
  660. package/dist/workflow/WorkflowEngine.js.map +1 -1
  661. package/dist/workflow/internal/crypto.js +9 -8
  662. package/dist/workflow/internal/crypto.js.map +1 -1
  663. package/package.json +7 -1
  664. package/src/BigDecimal.ts +173 -16
  665. package/src/Channel.ts +17 -11
  666. package/src/Config.ts +7 -1
  667. package/src/Context.ts +34 -10
  668. package/src/Cron.ts +178 -29
  669. package/src/Duration.ts +140 -0
  670. package/src/Effect.ts +914 -85
  671. package/src/Equal.ts +3 -3
  672. package/src/FileSystem.ts +65 -4
  673. package/src/Glob.ts +205 -0
  674. package/src/Hash.ts +5 -4
  675. package/src/Iterable.ts +8 -5
  676. package/src/Match.ts +127 -0
  677. package/src/Path.ts +6 -1
  678. package/src/Pool.ts +75 -16
  679. package/src/Random.ts +3 -3
  680. package/src/RcMap.ts +5 -1
  681. package/src/Schedule.ts +26 -3
  682. package/src/Schema.ts +1191 -63
  683. package/src/SchemaGetter.ts +27 -11
  684. package/src/SchemaRepresentation.ts +23 -2
  685. package/src/SchemaTransformation.ts +10 -5
  686. package/src/ScopedCache.ts +5 -9
  687. package/src/Semaphore.ts +141 -0
  688. package/src/Stream.ts +15 -6
  689. package/src/Terminal.ts +19 -1
  690. package/src/ai/AiError.ts +56 -80
  691. package/src/ai/Decision.ts +257 -6
  692. package/src/ai/DecisionModel.ts +171 -28
  693. package/src/ai/McpClient.ts +488 -91
  694. package/src/ai/McpSchema.ts +119 -0
  695. package/src/ai/McpServer.ts +1525 -319
  696. package/src/ai/McpTest.ts +380 -0
  697. package/src/ai/Prompt.ts +16 -11
  698. package/src/ai/Response.ts +2 -22
  699. package/src/ai/Tool.ts +32 -18
  700. package/src/ai/index.ts +6 -0
  701. package/src/ai/internal/mcpCore.ts +243 -56
  702. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +7 -8
  703. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +7 -8
  704. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +7 -8
  705. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +7 -8
  706. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +56 -17
  707. package/src/ai/internal/mcpProtocol.ts +44 -0
  708. package/src/ai/internal/mcpRuntime.ts +15 -8
  709. package/src/ai/internal/mcpSkills.ts +480 -0
  710. package/src/ai/internal/mcpStatefulRuntime.ts +14 -2
  711. package/src/cli/Argument.ts +6 -0
  712. package/src/cli/CliOutput.ts +117 -49
  713. package/src/cli/Command.ts +23 -0
  714. package/src/cli/Flag.ts +107 -0
  715. package/src/cli/HelpDoc.ts +18 -1
  716. package/src/cli/Param.ts +6 -0
  717. package/src/cli/Primitive.ts +16 -1
  718. package/src/cli/Prompt.ts +1 -0
  719. package/src/cli/internal/help.ts +21 -9
  720. package/src/cluster/ClusterWorkflowEngine.ts +22 -8
  721. package/src/cluster/Reply.ts +1 -1
  722. package/src/cluster/Sharding.ts +96 -26
  723. package/src/cluster/ShardingConfig.ts +41 -3
  724. package/src/cluster/SingleRunner.ts +3 -3
  725. package/src/cluster/SqlMessageStorage.ts +49 -17
  726. package/src/cluster/SqlRunnerStorage.ts +37 -27
  727. package/src/cluster/internal/entityManager.ts +24 -10
  728. package/src/crypto/Aead.ts +517 -0
  729. package/src/crypto/Cipher.ts +326 -0
  730. package/src/crypto/CryptoError.ts +242 -0
  731. package/src/crypto/Digest.ts +167 -0
  732. package/src/crypto/Kdf.ts +315 -0
  733. package/src/crypto/KeyAgreement.ts +489 -0
  734. package/src/crypto/KeyFormat.ts +741 -0
  735. package/src/crypto/KeyWrap.ts +639 -0
  736. package/src/crypto/Mac.ts +386 -0
  737. package/src/crypto/SecureRandom.ts +459 -0
  738. package/src/crypto/Signature.ts +673 -0
  739. package/src/crypto/WebCrypto.ts +84 -0
  740. package/src/crypto/index.ts +78 -0
  741. package/src/crypto/internal/asymmetric.ts +330 -0
  742. package/src/crypto/internal/chacha.ts +1088 -0
  743. package/src/crypto/internal/der.ts +110 -0
  744. package/src/crypto/internal/digest.ts +16 -0
  745. package/src/crypto/internal/key.ts +242 -0
  746. package/src/crypto/internal/md5.ts +170 -0
  747. package/src/crypto/internal/webCrypto.ts +150 -0
  748. package/src/encoding/Base64Url.ts +32 -5
  749. package/src/encoding/Csv.ts +1298 -0
  750. package/src/encoding/Hex.ts +3 -2
  751. package/src/encoding/Ndjson.ts +6 -5
  752. package/src/encoding/SchemaBinary.ts +40 -4
  753. package/src/encoding/Sse.ts +5 -3
  754. package/src/encoding/Toml.ts +85 -20
  755. package/src/encoding/Yaml.ts +61 -18
  756. package/src/encoding/index.ts +6 -0
  757. package/src/eventlog/EventJournal.ts +4 -3
  758. package/src/eventlog/EventLog.ts +347 -15
  759. package/src/eventlog/EventLogEncryption.ts +118 -110
  760. package/src/eventlog/EventLogMessage.ts +273 -1
  761. package/src/eventlog/EventLogRemote.ts +367 -23
  762. package/src/eventlog/EventLogServer.ts +54 -20
  763. package/src/eventlog/EventLogServerEncrypted.ts +1135 -67
  764. package/src/eventlog/EventLogServerUnencrypted.ts +19 -2
  765. package/src/eventlog/EventLogSessionAuth.ts +82 -70
  766. package/src/eventlog/EventRow.ts +12 -3
  767. package/src/eventlog/SqlEventJournal.ts +2 -2
  768. package/src/eventlog/SqlEventLogServerEncrypted.ts +1244 -136
  769. package/src/eventlog/SqlEventLogServerUnencrypted.ts +2 -2
  770. package/src/eventlog/internal/batches.ts +30 -0
  771. package/src/eventlog/internal/compaction.ts +64 -0
  772. package/src/eventlog/internal/identityRootSecretDerivation.ts +93 -123
  773. package/src/eventlog/internal/remoteCompaction.ts +92 -0
  774. package/src/graphql/GraphQLClient.ts +3 -1
  775. package/src/graphql/GraphQLClientError.ts +15 -22
  776. package/src/graphql/GraphQLProtocol.ts +12 -3
  777. package/src/http/Cookies.ts +281 -1
  778. package/src/http/FetchHttpClient.ts +88 -16
  779. package/src/http/HttpClient.ts +299 -33
  780. package/src/http/HttpClientRequest.ts +12 -9
  781. package/src/http/HttpClientResponse.ts +3 -2
  782. package/src/http/HttpMethod.ts +10 -2
  783. package/src/http/HttpServerRequest.ts +76 -53
  784. package/src/http/HttpServerResponse.ts +3 -2
  785. package/src/http/HttpTraceContext.ts +7 -4
  786. package/src/http/ProblemDetails.ts +149 -0
  787. package/src/http/index.ts +6 -0
  788. package/src/http/internal/decompression.ts +4 -4
  789. package/src/http/internal/mimeTypes.ts +4 -1
  790. package/src/http/internal/urlParams.ts +8 -0
  791. package/src/http-api/HttpApiBuilder.ts +24 -12
  792. package/src/http-api/HttpApiClient.ts +67 -1
  793. package/src/http-api/HttpApiEndpoint.ts +14 -5
  794. package/src/http-api/HttpApiError.ts +250 -0
  795. package/src/http-api/HttpApiMiddleware.ts +95 -1
  796. package/src/http-api/HttpApiSchema.ts +106 -15
  797. package/src/index.ts +6 -6
  798. package/src/internal/dateTime.ts +54 -24
  799. package/src/internal/effect.ts +40 -18
  800. package/src/internal/glob.ts +952 -0
  801. package/src/internal/graphql.ts +27 -9
  802. package/src/internal/graphqlHeaders.ts +13 -0
  803. package/src/internal/matcher.ts +17 -0
  804. package/src/internal/persistence.ts +11 -0
  805. package/src/internal/rcRef.ts +4 -1
  806. package/src/internal/request.ts +51 -58
  807. package/src/internal/schema/fromJsonSchemaDocument.ts +11 -10
  808. package/src/internal/schema/toCodeDocument.ts +7 -3
  809. package/src/internal/trie.ts +43 -14
  810. package/src/internal/ulid.ts +44 -0
  811. package/src/internal/uuid.ts +57 -16
  812. package/src/internal/version.ts +1 -1
  813. package/src/jose/JoseError.ts +329 -0
  814. package/src/jose/Jwe.ts +196 -0
  815. package/src/jose/Jwk.ts +777 -0
  816. package/src/jose/Jwks.ts +418 -0
  817. package/src/jose/Jws.ts +312 -0
  818. package/src/jose/Jwt.ts +493 -0
  819. package/src/jose/index.ts +58 -0
  820. package/src/jose/internal/compact.ts +195 -0
  821. package/src/net/Host.ts +5 -10
  822. package/src/observability/Otlp.ts +21 -4
  823. package/src/observability/OtlpResource.ts +9 -1
  824. package/src/observability/OtlpSerialization.ts +13 -5
  825. package/src/observability/internal/otlpProtobuf.ts +6 -6
  826. package/src/observability/internal/protobuf.ts +10 -0
  827. package/src/persistence/CircuitBreaker.ts +113 -48
  828. package/src/persistence/KeyValueStore.ts +219 -22
  829. package/src/persistence/PersistedQueue.ts +128 -59
  830. package/src/persistence/Persistence.ts +20 -13
  831. package/src/persistence/RateLimiter.ts +84 -15
  832. package/src/persistence/index.ts +1 -1
  833. package/src/process/ChildProcess.ts +255 -260
  834. package/src/process/ChildProcessSpawner.ts +5 -0
  835. package/src/process/CommandLine.ts +630 -0
  836. package/src/process/index.ts +6 -0
  837. package/src/reactivity/Atom.ts +5 -5
  838. package/src/reactivity/AtomRegistry.ts +20 -9
  839. package/src/rpc/Rpc.ts +3 -1
  840. package/src/rpc/RpcClient.ts +94 -38
  841. package/src/rpc/RpcMessage.ts +13 -3
  842. package/src/rpc/RpcSerialization.ts +3 -0
  843. package/src/rpc/RpcServer.ts +176 -78
  844. package/src/schema/Model.ts +26 -3
  845. package/src/sql/Migrator.ts +38 -80
  846. package/src/sql/MigratorFileSystem.ts +71 -0
  847. package/src/sql/SqlClient.ts +45 -24
  848. package/src/sql/Statement.ts +60 -29
  849. package/src/sql/index.ts +1 -1
  850. package/src/testing/index.ts +0 -6
  851. package/src/workflow/Workflow.ts +4 -0
  852. package/src/workflow/WorkflowEngine.ts +5 -0
  853. package/src/workflow/internal/crypto.ts +15 -11
  854. package/dist/Crypto.d.ts +0 -244
  855. package/dist/Crypto.d.ts.map +0 -1
  856. package/dist/Crypto.js +0 -139
  857. package/dist/Crypto.js.map +0 -1
  858. package/dist/testing/TestCrypto.d.ts +0 -73
  859. package/dist/testing/TestCrypto.d.ts.map +0 -1
  860. package/dist/testing/TestCrypto.js +0 -87
  861. package/dist/testing/TestCrypto.js.map +0 -1
  862. package/src/Crypto.ts +0 -347
  863. package/src/testing/TestCrypto.ts +0 -94
@@ -11,6 +11,7 @@
11
11
  * @stability unstable
12
12
  * @since 4.0.0
13
13
  */
14
+ import * as Arr from "../Array.ts"
14
15
  import * as Cache from "../Cache.ts"
15
16
  import * as Context from "../Context.ts"
16
17
  import * as Data from "../Data.ts"
@@ -19,27 +20,38 @@ import * as Layer from "../Layer.ts"
19
20
  import * as Predicate from "../Predicate.ts"
20
21
  import * as Queue from "../Queue.ts"
21
22
  import * as Redacted from "../Redacted.ts"
23
+ import * as Result from "../Result.ts"
22
24
  import * as RpcClient from "../rpc/RpcClient.ts"
23
25
  import type { RpcClientError } from "../rpc/RpcClientError.ts"
24
26
  import type * as RpcGroup from "../rpc/RpcGroup.ts"
25
27
  import type * as Schema from "../Schema.ts"
26
28
  import type * as Scope from "../Scope.ts"
29
+ import * as Stream from "../Stream.ts"
27
30
  import { type Entry, type EventJournal, type EventJournalError, RemoteEntry, type RemoteId } from "./EventJournal.ts"
28
31
  import { type Identity, Registry } from "./EventLog.ts"
29
- import { EventLogEncryption, layerSubtle } from "./EventLogEncryption.ts"
32
+ import { type EncryptedBatch, EventLogEncryption, layerSubtle } from "./EventLogEncryption.ts"
30
33
  import {
31
34
  Authenticate,
32
35
  ChangesRpc,
33
36
  ChunkedMessage,
37
+ type CompactionBeginResult,
38
+ type CompactionInputHeader,
39
+ CompactionInputRpc,
40
+ CompactionPartRpc,
41
+ type CompactionResult,
42
+ type CompactionStatus,
43
+ EventLogCompactionRpcs,
34
44
  EventLogProtocolError,
35
45
  EventLogRemoteRpcs,
36
46
  type HelloResponse,
47
+ type SingleMessage,
37
48
  type StoreId,
38
49
  type WriteAck,
39
50
  WriteEntries,
40
51
  WriteEntriesUnencrypted
41
52
  } from "./EventLogMessage.ts"
42
53
  import { encodeSessionAuthPayload, signSessionAuthPayloadBytes } from "./EventLogSessionAuth.ts"
54
+ import { toBatches } from "./internal/batches.ts"
43
55
  import { makeGetIdentityRootSecretMaterial } from "./internal/identityRootSecretDerivation.ts"
44
56
 
45
57
  /**
@@ -87,8 +99,82 @@ export class EventLogRemote extends Context.Service<EventLogRemote, {
87
99
  readonly whenAuthenticated: <A, E, R>(
88
100
  effect: Effect.Effect<A, E, R>
89
101
  ) => Effect.Effect<A, E | EventLogRemoteError, R | Identity>
102
+ /**
103
+ * Encrypted remote compaction. Present when the remote advertises
104
+ * `HelloResponse.compaction` and the RPC client includes
105
+ * `EventLogCompactionRpcs`.
106
+ */
107
+ readonly compaction?: EventLogRemoteCompaction | undefined
90
108
  }>()("effect/eventlog/EventLogRemote") {}
91
109
 
110
+ /**
111
+ * A stage opened by `EventLogRemoteCompaction.begin`, with the identity and
112
+ * store it belongs to.
113
+ *
114
+ * @stability unstable
115
+ * @category models
116
+ * @since 4.0.0
117
+ */
118
+ export interface CompactionStage {
119
+ readonly identity: Identity["Service"]
120
+ readonly storeId: StoreId
121
+ readonly stageId: string
122
+ }
123
+
124
+ /**
125
+ * Client side of encrypted remote compaction.
126
+ *
127
+ * **Details**
128
+ *
129
+ * A run opens a stage with `begin`, reads its input headers with `input`,
130
+ * fetches the batches it needs with `fetch`, uploads the kept entries with
131
+ * `upload` and calls `commit`. `abort` releases a stage that won't be
132
+ * committed.
133
+ *
134
+ * @stability unstable
135
+ * @category models
136
+ * @since 4.0.0
137
+ */
138
+ export interface EventLogRemoteCompaction {
139
+ readonly status: (options: {
140
+ readonly identity: Identity["Service"]
141
+ readonly storeId: StoreId
142
+ }) => Effect.Effect<CompactionStatus, EventLogRemoteError>
143
+ readonly begin: (options: {
144
+ readonly identity: Identity["Service"]
145
+ readonly storeId: StoreId
146
+ }) => Effect.Effect<CompactionBeginResult, EventLogRemoteError>
147
+ /**
148
+ * Streams the stage's input batch headers in input order.
149
+ */
150
+ readonly input: (stage: CompactionStage) => Stream.Stream<CompactionInputHeader, EventLogRemoteError>
151
+ /**
152
+ * Fetches and decrypts the input batches at the given input sequences.
153
+ */
154
+ readonly fetch: (
155
+ stage: CompactionStage,
156
+ sequences: ReadonlyArray<number>
157
+ ) => Stream.Stream<RemoteEntry, EventLogRemoteError>
158
+ /**
159
+ * Encrypts the kept entries, in input-sequence order, and uploads them in
160
+ * segments of about `ChunkedMessage.chunkSize`. An oversized segment is
161
+ * split into pieces, and a segment is resent in full after a dropped
162
+ * connection.
163
+ */
164
+ readonly upload: (
165
+ stage: CompactionStage,
166
+ entries: ReadonlyArray<Entry>
167
+ ) => Effect.Effect<{ readonly segmentCount: number }, EventLogRemoteError>
168
+ readonly commit: (
169
+ stage: CompactionStage,
170
+ result: CompactionResult
171
+ ) => Effect.Effect<"Committed" | "Superseded", EventLogRemoteError>
172
+ /**
173
+ * Releases the stage. Failures are ignored.
174
+ */
175
+ readonly abort: (stage: CompactionStage) => Effect.Effect<void>
176
+ }
177
+
92
178
  /**
93
179
  * Error raised by `EventLogRemote` operations, recording the failed method and
94
180
  * underlying cause.
@@ -112,7 +198,7 @@ export class EventLogRemoteError extends Data.TaggedError("EventLogRemoteError")
112
198
  }
113
199
  }
114
200
 
115
- const getIdentityRootSecretMaterial = makeGetIdentityRootSecretMaterial(globalThis.crypto)
201
+ const getIdentityRootSecretMaterial = makeGetIdentityRootSecretMaterial()
116
202
 
117
203
  const makeAuthenticate = Effect.fnUntraced(function*(options: {
118
204
  readonly identity: Identity["Service"]
@@ -146,24 +232,36 @@ const makeAuthenticate = Effect.fnUntraced(function*(options: {
146
232
  * Use to provide the RPC client used by remote event-log replicas to
147
233
  * authenticate, write entries, and subscribe to changes.
148
234
  *
235
+ * **Details**
236
+ *
237
+ * The `EventLogCompactionRpcs` methods are optional. The encrypted remote
238
+ * offers compaction only when the client has them. `layer` builds the client
239
+ * from both groups.
240
+ *
149
241
  * @stability unstable
150
242
  * @category services
151
243
  * @since 4.0.0
152
244
  */
153
245
  export class EventLogRemoteClient extends Context.Service<
154
246
  EventLogRemoteClient,
155
- RpcClient.RpcClient<RpcGroup.Rpcs<typeof EventLogRemoteRpcs>, RpcClientError>
247
+ & RpcClient.RpcClient<RpcGroup.Rpcs<typeof EventLogRemoteRpcs>, RpcClientError>
248
+ & Partial<CompactionClient>
156
249
  >()(
157
250
  "effect/eventlog/EventLogRemote/EventLogRemoteClient"
158
251
  ) {
159
252
  static readonly layer = Layer.effect(
160
253
  EventLogRemoteClient,
161
- RpcClient.make(EventLogRemoteRpcs, {
254
+ RpcClient.make(EventLogRemoteRpcs.merge(EventLogCompactionRpcs), {
162
255
  disableTracing: true
163
256
  })
164
257
  )
165
258
  }
166
259
 
260
+ type CompactionClient = RpcClient.RpcClient<RpcGroup.Rpcs<typeof EventLogCompactionRpcs>, RpcClientError>
261
+
262
+ const getCompactionClient = (client: EventLogRemoteClient["Service"]): CompactionClient | undefined =>
263
+ client["EventLog.CompactionStatus"] === undefined ? undefined : client as CompactionClient
264
+
167
265
  /**
168
266
  * Creates an `EventLogRemote` from custom write encoding and change decoding
169
267
  * functions.
@@ -178,7 +276,7 @@ export class EventLogRemoteClient extends Context.Service<
178
276
  * @category constructors
179
277
  * @since 4.0.0
180
278
  */
181
- export const makeWith = Effect.fnUntraced(function*({ encodeWrite, decodeChanges }: {
279
+ export const makeWith = (options: {
182
280
  readonly encodeWrite: (options: {
183
281
  readonly identity: Identity["Service"]
184
282
  readonly entries: ReadonlyArray<Entry>
@@ -190,6 +288,39 @@ export const makeWith = Effect.fnUntraced(function*({ encodeWrite, decodeChanges
190
288
  data: Uint8Array<ArrayBuffer>,
191
289
  knownEntries?: EventJournal["Service"]["entriesById"]
192
290
  ) => Effect.Effect<ReadonlyArray<RemoteEntry>, Schema.SchemaError | EventJournalError>
291
+ }): Effect.Effect<EventLogRemote["Service"], EventLogRemoteError, Scope.Scope | EventLogRemoteClient | Registry> =>
292
+ makeRemote(options)
293
+
294
+ interface RemoteSession {
295
+ readonly client: EventLogRemoteClient["Service"]
296
+ /** Authenticates, runs the request, and authenticates again after a refusal. */
297
+ readonly request: <A, E>(
298
+ method: string,
299
+ identity: Identity["Service"],
300
+ effect: Effect.Effect<A, E>
301
+ ) => Effect.Effect<A, EventLogRemoteError>
302
+ /** Authenticates, then joins and decodes a framed response stream. */
303
+ readonly framed: <A, E, E2>(
304
+ method: string,
305
+ identity: Identity["Service"],
306
+ frames: () => Stream.Stream<SingleMessage | ChunkedMessage, E>,
307
+ decode: (data: Uint8Array<ArrayBuffer>) => Effect.Effect<Iterable<A>, E2>
308
+ ) => Stream.Stream<A, EventLogRemoteError>
309
+ }
310
+
311
+ const makeRemote = Effect.fnUntraced(function*({ encodeWrite, decodeChanges, makeCompaction }: {
312
+ readonly encodeWrite: (options: {
313
+ readonly identity: Identity["Service"]
314
+ readonly entries: ReadonlyArray<Entry>
315
+ readonly storeId: StoreId
316
+ }) => Effect.Effect<Uint8Array<ArrayBuffer>, Schema.SchemaError>
317
+ readonly decodeChanges: (
318
+ identity: Identity["Service"],
319
+ storeId: StoreId,
320
+ data: Uint8Array<ArrayBuffer>,
321
+ knownEntries?: EventJournal["Service"]["entriesById"]
322
+ ) => Effect.Effect<ReadonlyArray<RemoteEntry>, Schema.SchemaError | EventJournalError>
323
+ readonly makeCompaction?: ((session: RemoteSession) => EventLogRemoteCompaction | undefined) | undefined
193
324
  }): Effect.fn.Return<EventLogRemote["Service"], EventLogRemoteError, Scope.Scope | EventLogRemoteClient | Registry> {
194
325
  const client = yield* EventLogRemoteClient
195
326
  const registry = yield* Registry
@@ -228,6 +359,12 @@ export const makeWith = Effect.fnUntraced(function*({ encodeWrite, decodeChanges
228
359
  return Cache.get(authCache, identity.publicKey)
229
360
  }
230
361
 
362
+ // The next request says hello and authenticates again.
363
+ const resetAuthentication = (identity: Identity["Service"]) => {
364
+ hello = null
365
+ return Cache.invalidate(authCache, identity.publicKey)
366
+ }
367
+
231
368
  const retryForbidden = <A, E, R>(
232
369
  effect: Effect.Effect<A, E, R>,
233
370
  options: {
@@ -235,19 +372,47 @@ export const makeWith = Effect.fnUntraced(function*({ encodeWrite, decodeChanges
235
372
  }
236
373
  ) =>
237
374
  Effect.retry(effect, {
238
- while(e) {
239
- hello = null
240
- const error = EventLogRemoteError.is(e) && e.method === "authenticate"
241
- ? e.cause
242
- : e
243
- const isForbidden = EventLogProtocolError.is(error) && error.code === "Forbidden"
244
- return Cache.invalidate(authCache, options.identity.publicKey).pipe(
245
- Effect.as(isForbidden)
246
- )
247
- },
375
+ while: (e) => Effect.as(resetAuthentication(options.identity), isForbidden(e)),
248
376
  times: 5
249
377
  })
250
378
 
379
+ const toRemoteError = (method: string) => (cause: unknown) =>
380
+ EventLogRemoteError.is(cause) ? cause : new EventLogRemoteError({ method, cause })
381
+
382
+ const request = <A, E>(
383
+ method: string,
384
+ identity: Identity["Service"],
385
+ effect: Effect.Effect<A, E>
386
+ ): Effect.Effect<A, EventLogRemoteError> =>
387
+ ensureAuthenticated(identity).pipe(
388
+ Effect.andThen(effect),
389
+ (effect) => retryForbidden(effect, { identity }),
390
+ Effect.mapError(toRemoteError(method))
391
+ )
392
+
393
+ // Not retried like `request`; a refused identity authenticates again on the
394
+ // next request.
395
+ const framed = <A, E, E2>(
396
+ method: string,
397
+ identity: Identity["Service"],
398
+ frames: () => Stream.Stream<SingleMessage | ChunkedMessage, E>,
399
+ decode: (data: Uint8Array<ArrayBuffer>) => Effect.Effect<Iterable<A>, E2>
400
+ ): Stream.Stream<A, EventLogRemoteError> =>
401
+ Stream.unwrap(Effect.map(ensureAuthenticated(identity), () => {
402
+ const state = ChunkedMessage.initialJoinState()
403
+ return frames().pipe(
404
+ Stream.filterMap((frame) => {
405
+ const data = frame._tag === "Single" ? frame.data : ChunkedMessage.join(state, frame)
406
+ return data === undefined ? Result.failVoid : Result.succeed(data)
407
+ }),
408
+ Stream.mapEffect(decode),
409
+ Stream.flattenIterable
410
+ )
411
+ })).pipe(
412
+ Stream.tapError((error) => isForbidden(error) ? resetAuthentication(identity) : Effect.void),
413
+ Stream.mapError(toRemoteError(method))
414
+ )
415
+
251
416
  let chunkedIdCounter = 0
252
417
 
253
418
  const remote = EventLogRemote.of({
@@ -325,7 +490,8 @@ export const makeWith = Effect.fnUntraced(function*({ encodeWrite, decodeChanges
325
490
  return outgoing
326
491
  }),
327
492
  whenAuthenticated: (effect) =>
328
- IdentityService.use((identity) => Effect.flatMap(ensureAuthenticated(identity), () => effect))
493
+ IdentityService.use((identity) => Effect.flatMap(ensureAuthenticated(identity), () => effect)),
494
+ compaction: hello.compaction === true ? makeCompaction?.({ client, request, framed }) : undefined
329
495
  })
330
496
 
331
497
  yield* registry.registerRemote(remote)
@@ -333,6 +499,11 @@ export const makeWith = Effect.fnUntraced(function*({ encodeWrite, decodeChanges
333
499
  return remote
334
500
  })
335
501
 
502
+ const isForbidden = (e: unknown): boolean => {
503
+ const error = EventLogRemoteError.is(e) && e.method === "authenticate" ? e.cause : e
504
+ return EventLogProtocolError.is(error) && error.code === "Forbidden"
505
+ }
506
+
336
507
  /** @effect-diagnostics-next-line classSelfMismatch:off */
337
508
  class IdentityService extends Context.Service<Identity, Identity["Service"]>()(
338
509
  "effect/eventlog/EventLog/Identity" satisfies Identity["key"]
@@ -342,11 +513,19 @@ class IdentityService extends Context.Service<Identity, Identity["Service"]>()(
342
513
  * Creates an `EventLogRemote` that encrypts outgoing entries and decrypts
343
514
  * incoming changes with `EventLogEncryption`.
344
515
  *
516
+ * **Details**
517
+ *
518
+ * The remote has a `compaction` member when the server advertises compaction
519
+ * and the RPC client includes `EventLogCompactionRpcs`, unless built with
520
+ * `compaction: false`. Without it the client never calls the compaction RPCs.
521
+ *
345
522
  * @stability unstable
346
523
  * @category constructors
347
524
  * @since 4.0.0
348
525
  */
349
- export const makeEncrypted = Effect.gen(function*(): Effect.fn.Return<
526
+ export const makeEncryptedWith = Effect.fnUntraced(function*(options: {
527
+ readonly compaction?: boolean | undefined
528
+ }): Effect.fn.Return<
350
529
  EventLogRemote["Service"],
351
530
  EventLogRemoteError,
352
531
  Scope.Scope | EventLogRemoteClient | EventLogEncryption | Registry
@@ -385,7 +564,7 @@ export const makeEncrypted = Effect.gen(function*(): Effect.fn.Return<
385
564
  })
386
565
  })
387
566
 
388
- return yield* makeWith({
567
+ return yield* makeRemote({
389
568
  encodeWrite: (options) =>
390
569
  encryption.encrypt(options.identity, options.storeId, options.entries).pipe(
391
570
  Effect.flatMap((batches) =>
@@ -396,10 +575,151 @@ export const makeEncrypted = Effect.gen(function*(): Effect.fn.Return<
396
575
  }).encoded
397
576
  )
398
577
  ),
399
- decodeChanges
578
+ decodeChanges,
579
+ makeCompaction: options.compaction === false ? undefined : (session) => {
580
+ const client = getCompactionClient(session.client)
581
+ return client === undefined ? undefined : makeEncryptedCompaction({ session, client, encryption })
582
+ }
400
583
  })
401
584
  })
402
585
 
586
+ /**
587
+ * Creates an `EventLogRemote` that encrypts outgoing entries and decrypts
588
+ * incoming changes with `EventLogEncryption`.
589
+ *
590
+ * @see {@link makeEncryptedWith} for opting out of running compaction
591
+ *
592
+ * @stability unstable
593
+ * @category constructors
594
+ * @since 4.0.0
595
+ */
596
+ export const makeEncrypted: Effect.Effect<
597
+ EventLogRemote["Service"],
598
+ EventLogRemoteError,
599
+ Scope.Scope | EventLogRemoteClient | EventLogEncryption | Registry
600
+ > = makeEncryptedWith({})
601
+
602
+ // How many times a segment is sent before a dropped connection, an
603
+ // `RpcClientError`, fails the upload.
604
+ const segmentAttempts = 3
605
+
606
+ const makeEncryptedCompaction = ({ client, encryption, session: { framed, request } }: {
607
+ readonly session: RemoteSession
608
+ readonly client: CompactionClient
609
+ readonly encryption: EventLogEncryption["Service"]
610
+ }): EventLogRemoteCompaction => {
611
+ const stageRequest = (stage: CompactionStage) => ({
612
+ publicKey: stage.identity.publicKey,
613
+ storeId: stage.storeId,
614
+ stageId: stage.stageId
615
+ })
616
+
617
+ return {
618
+ status: ({ identity, storeId }) =>
619
+ request(
620
+ "compactionStatus",
621
+ identity,
622
+ client["EventLog.CompactionStatus"]({ publicKey: identity.publicKey, storeId })
623
+ ),
624
+ begin: ({ identity, storeId }) =>
625
+ request(
626
+ "compactionBegin",
627
+ identity,
628
+ client["EventLog.CompactionBegin"]({ publicKey: identity.publicKey, storeId })
629
+ ),
630
+ input: (stage) =>
631
+ framed(
632
+ "compactionInput",
633
+ stage.identity,
634
+ () => client["EventLog.CompactionInput"](stageRequest(stage)),
635
+ CompactionInputRpc.decodeHeaders
636
+ ),
637
+ fetch: (stage, sequences) =>
638
+ framed(
639
+ "compactionFetch",
640
+ stage.identity,
641
+ () => client["EventLog.CompactionFetch"]({ ...stageRequest(stage), batches: sequences }),
642
+ (data) =>
643
+ Effect.flatMap(
644
+ ChangesRpc.decodeEncrypted(data),
645
+ (batches) => encryption.decrypt(stage.identity, stage.storeId, batches)
646
+ )
647
+ ),
648
+ upload: (stage, entries) =>
649
+ Effect.suspend(() => {
650
+ let segment: Array<EncryptedBatch> = []
651
+ let segmentBytes = 0
652
+ let segmentCount = 0
653
+
654
+ // The server forgets a segment's pieces when the connection drops, so a
655
+ // retry resends all of them.
656
+ const sendSegment = Effect.suspend(() => {
657
+ if (!Arr.isArrayNonEmpty(segment)) return Effect.void
658
+ const batches = segment
659
+ const id = segmentCount++
660
+ segment = []
661
+ segmentBytes = 0
662
+ return Effect.flatMap(CompactionPartRpc.encodeSegment(batches), (data) => {
663
+ const pieces = ChunkedMessage.split(id, data)
664
+ return request(
665
+ "compactionUpload",
666
+ stage.identity,
667
+ Effect.forEach(
668
+ pieces,
669
+ (chunk) => client["EventLog.CompactionPart"]({ ...stageRequest(stage), chunk }),
670
+ { discard: true }
671
+ ).pipe(
672
+ Effect.retry({ while: (error) => error._tag === "RpcClientError", times: segmentAttempts - 1 })
673
+ )
674
+ )
675
+ })
676
+ })
677
+
678
+ // Whole batches go into a segment until the next one would take it
679
+ // past `ChunkedMessage.chunkSize`.
680
+ const addBatch = (batch: Arr.NonEmptyArray<Entry>) =>
681
+ Effect.flatMap(encryption.encrypt(stage.identity, stage.storeId, batch), (encrypted) =>
682
+ Effect.forEach(encrypted, (batch) => {
683
+ const size = encodedBatchSize(batch)
684
+ const send = segment.length > 0 && segmentBytes + size > ChunkedMessage.chunkSize
685
+ ? sendSegment
686
+ : Effect.void
687
+ return Effect.andThen(
688
+ send,
689
+ Effect.sync(() => {
690
+ segment.push(batch)
691
+ segmentBytes += size
692
+ })
693
+ )
694
+ }, { discard: true }))
695
+
696
+ return Effect.forEach(toBatches(entries), addBatch, { discard: true }).pipe(
697
+ Effect.andThen(sendSegment),
698
+ Effect.map(() => ({ segmentCount })),
699
+ Effect.mapError((cause) =>
700
+ EventLogRemoteError.is(cause) ? cause : new EventLogRemoteError({ method: "compactionUpload", cause })
701
+ )
702
+ )
703
+ }),
704
+ commit: (stage, result) =>
705
+ request(
706
+ "compactionCommit",
707
+ stage.identity,
708
+ client["EventLog.CompactionCommit"]({ ...stageRequest(stage), result })
709
+ ),
710
+ abort: (stage) =>
711
+ request(
712
+ "compactionAbort",
713
+ stage.identity,
714
+ client["EventLog.CompactionAbort"](stageRequest(stage))
715
+ ).pipe(Effect.ignore)
716
+ }
717
+ }
718
+
719
+ // Ignores the segment framing.
720
+ const encodedBatchSize = (batch: EncryptedBatch): number =>
721
+ batch.encryptedBatch.byteLength + batch.iv.byteLength + batch.entryIds.length * 16
722
+
403
723
  /**
404
724
  * Creates an `EventLogRemote` that sends and receives plaintext entry payloads.
405
725
  *
@@ -425,6 +745,33 @@ export const makeUnencrypted: Effect.Effect<
425
745
  * Provides an encrypted `EventLogRemote` using the remote RPC client and the
426
746
  * default Web Crypto encryption layer.
427
747
  *
748
+ * **Details**
749
+ *
750
+ * `compaction: false` leaves the remote without its `compaction` member, so
751
+ * this client never calls the compaction RPCs.
752
+ *
753
+ * @stability unstable
754
+ * @category layers
755
+ * @since 4.0.0
756
+ */
757
+ export const layerEncryptedWith = (options: {
758
+ readonly compaction?: boolean | undefined
759
+ }): Layer.Layer<
760
+ EventLogRemote,
761
+ EventLogRemoteError,
762
+ RpcClient.Protocol | Registry
763
+ > =>
764
+ Layer.effect(EventLogRemote, makeEncryptedWith(options)).pipe(
765
+ Layer.provide(EventLogRemoteClient.layer),
766
+ Layer.provide(layerSubtle)
767
+ )
768
+
769
+ /**
770
+ * Provides an encrypted `EventLogRemote` using the remote RPC client and the
771
+ * default Web Crypto encryption layer.
772
+ *
773
+ * @see {@link layerEncryptedWith} for opting out of running compaction
774
+ *
428
775
  * @stability unstable
429
776
  * @category layers
430
777
  * @since 4.0.0
@@ -433,10 +780,7 @@ export const layerEncrypted: Layer.Layer<
433
780
  EventLogRemote,
434
781
  EventLogRemoteError,
435
782
  RpcClient.Protocol | Registry
436
- > = Layer.effect(EventLogRemote, makeEncrypted).pipe(
437
- Layer.provide(EventLogRemoteClient.layer),
438
- Layer.provide(layerSubtle)
439
- )
783
+ > = layerEncryptedWith({})
440
784
 
441
785
  /**
442
786
  * Provides an unencrypted `EventLogRemote` using the remote RPC client.
@@ -13,6 +13,7 @@ import type { NonEmptyReadonlyArray } from "../Array.ts"
13
13
  import * as Arr from "../Array.ts"
14
14
  import * as Cache from "../Cache.ts"
15
15
  import * as Context from "../Context.ts"
16
+ import * as Mac from "../crypto/Mac.ts"
16
17
  import * as Data from "../Data.ts"
17
18
  import * as Duration from "../Duration.ts"
18
19
  import * as Effect from "../Effect.ts"
@@ -76,8 +77,16 @@ export const layerAuthMiddleware: Layer.Layer<
76
77
  * chunked writes, delegates write and change handling to the supplied callbacks,
77
78
  * and frames large change payloads into chunks.
78
79
  *
80
+ * `Authenticate` calls `authorizeIdentity` with the claimed public key and the
81
+ * presented signing public key, then verifies the signature against the
82
+ * presented key. Only a verified key is passed to
83
+ * `getOrCreateSessionAuthBinding`, and a key that differs from the identity's
84
+ * existing binding is rejected.
85
+ *
79
86
  * Use the connection's `ConnectionWrites.track` in `onWrite` and
80
87
  * `ConnectionWrites.filter` in `changes` to suppress its own write echoes.
88
+ * `compaction` sets `HelloResponse.compaction`, advertising that the server
89
+ * also serves `EventLogCompactionRpcs`.
81
90
  *
82
91
  * @stability unstable
83
92
  * @category layers
@@ -86,7 +95,11 @@ export const layerAuthMiddleware: Layer.Layer<
86
95
  export const layerRpcHandlers = (options: {
87
96
  readonly remoteId: RemoteId
88
97
  readonly firstSequence?: number | undefined
89
- readonly authorizeIdentity?: (publicKey: string) => Effect.Effect<void, EventLogProtocolError>
98
+ readonly compaction?: boolean | undefined
99
+ readonly authorizeIdentity?: (
100
+ publicKey: string,
101
+ signingPublicKey: Uint8Array<ArrayBuffer>
102
+ ) => Effect.Effect<void, EventLogProtocolError>
90
103
  readonly getOrCreateSessionAuthBinding: (
91
104
  publicKey: string,
92
105
  signingPublicKey: Uint8Array<ArrayBuffer>
@@ -111,7 +124,7 @@ export const layerRpcHandlers = (options: {
111
124
  capacity: Number.MAX_SAFE_INTEGER,
112
125
  timeToLive: EventLogSessionAuth.SessionAuthChallengeTimeToLiveMillis
113
126
  })
114
- let chunkedIdCounter = 0
127
+ const toFrames = makeFramer()
115
128
 
116
129
  const persistedSigningPublicKeys = yield* Cache.makeWith(
117
130
  (key: SessionAuthCacheKey) =>
@@ -139,7 +152,8 @@ export const layerRpcHandlers = (options: {
139
152
  return new HelloResponse({
140
153
  remoteId: options.remoteId,
141
154
  challenge,
142
- firstSequence: options.firstSequence
155
+ firstSequence: options.firstSequence,
156
+ compaction: options.compaction === true ? true : undefined
143
157
  })
144
158
  }),
145
159
  "EventLog.Authenticate": Effect.fnUntraced(function*(request, { client }) {
@@ -154,33 +168,40 @@ export const layerRpcHandlers = (options: {
154
168
  }
155
169
  yield* Cache.invalidate(clientChallenges, client.id)
156
170
  if (options.authorizeIdentity) {
157
- yield* options.authorizeIdentity(request.publicKey)
171
+ yield* options.authorizeIdentity(request.publicKey, request.signingPublicKey)
158
172
  }
159
- const signingPublicKey = yield* Cache.get(
160
- persistedSigningPublicKeys,
161
- new SessionAuthCacheKey({
162
- publicKey: request.publicKey,
163
- signingPublicKey: request.signingPublicKey
164
- })
165
- )
166
173
  const verified = yield* EventLogSessionAuth.verifySessionAuthenticateRequest({
167
174
  remoteId: options.remoteId,
168
175
  challenge,
169
176
  publicKey: request.publicKey,
170
- signingPublicKey,
177
+ signingPublicKey: request.signingPublicKey,
171
178
  signature: request.signature,
172
179
  algorithm: request.algorithm
173
180
  }).pipe(
174
181
  Effect.catch(() => Effect.succeed(false))
175
182
  )
176
183
 
177
- if (!verified) {
178
- return yield* new EventLogProtocolError({
184
+ const verificationFailed = () =>
185
+ new EventLogProtocolError({
179
186
  requestTag: "Authenticate",
180
187
  publicKey: request.publicKey,
181
188
  code: "Forbidden",
182
189
  message: "Session auth signature verification failed"
183
190
  })
191
+ if (!verified) {
192
+ return yield* verificationFailed()
193
+ }
194
+ // Only a verified key reaches the binding. A key other than the
195
+ // identity's bound key is rejected like a bad signature.
196
+ const boundSigningPublicKey = yield* Cache.get(
197
+ persistedSigningPublicKeys,
198
+ new SessionAuthCacheKey({
199
+ publicKey: request.publicKey,
200
+ signingPublicKey: request.signingPublicKey
201
+ })
202
+ )
203
+ if (!Mac.timingSafeEqual(boundSigningPublicKey, request.signingPublicKey)) {
204
+ return yield* verificationFailed()
184
205
  }
185
206
 
186
207
  const authenticatedIdentities = new Set(
@@ -229,12 +250,7 @@ export const layerRpcHandlers = (options: {
229
250
  startSequence: request.startSequence,
230
251
  writes: getConnectionWrites(client)
231
252
  }).pipe(
232
- Stream.mapArray(Arr.flatMap((data): NonEmptyReadonlyArray<SingleMessage | ChunkedMessage> => {
233
- if (data.byteLength <= ChunkedMessage.chunkSize) {
234
- return [new SingleMessage({ data })]
235
- }
236
- return ChunkedMessage.split(chunkedIdCounter++, data)
237
- })),
253
+ Stream.mapArray(Arr.flatMap(toFrames)),
238
254
  Stream.catchCause((_) =>
239
255
  Stream.fail(
240
256
  new EventLogProtocolError({
@@ -412,6 +428,8 @@ export class AuthenticatedIdentities extends Context.Service<AuthenticatedIdenti
412
428
  "effect/eventlog/EventLogServer/AuthenticatedIdentities"
413
429
  ) {}
414
430
 
431
+ // Keyed by `publicKey` alone: the cache holds each identity's bound signing
432
+ // key, and `Authenticate` rejects any presented key that differs from it.
415
433
  class SessionAuthCacheKey extends Data.Class<{
416
434
  readonly publicKey: string
417
435
  readonly signingPublicKey: Uint8Array<ArrayBuffer>
@@ -424,4 +442,20 @@ class SessionAuthCacheKey extends Data.Class<{
424
442
  }
425
443
  }
426
444
 
445
+ /**
446
+ * Frames one encoded message for a response stream: a `SingleMessage` when it
447
+ * fits, or the pieces of a `ChunkedMessage` with the next id otherwise.
448
+ *
449
+ * @internal
450
+ */
451
+ export const makeFramer = (): (
452
+ data: Uint8Array<ArrayBuffer>
453
+ ) => NonEmptyReadonlyArray<SingleMessage | ChunkedMessage> => {
454
+ let chunkedIdCounter = 0
455
+ return (data) =>
456
+ data.byteLength <= ChunkedMessage.chunkSize
457
+ ? [new SingleMessage({ data })]
458
+ : ChunkedMessage.split(chunkedIdCounter++, data)
459
+ }
460
+
427
461
  const constEmptyPrivateKey = Redacted.make(new Uint8Array(32))