effect 4.0.6 → 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 (978) hide show
  1. package/README.md +1 -1
  2. package/dist/Arbitrary.d.ts +10 -2
  3. package/dist/Arbitrary.d.ts.map +1 -1
  4. package/dist/Arbitrary.js +2 -1
  5. package/dist/Arbitrary.js.map +1 -1
  6. package/dist/BigDecimal.d.ts.map +1 -1
  7. package/dist/BigDecimal.js +3 -0
  8. package/dist/BigDecimal.js.map +1 -1
  9. package/dist/Channel.d.ts +12 -6
  10. package/dist/Channel.d.ts.map +1 -1
  11. package/dist/Channel.js +30 -9
  12. package/dist/Channel.js.map +1 -1
  13. package/dist/Config.d.ts +7 -1
  14. package/dist/Config.d.ts.map +1 -1
  15. package/dist/Config.js.map +1 -1
  16. package/dist/Context.d.ts +18 -1
  17. package/dist/Context.d.ts.map +1 -1
  18. package/dist/Context.js +27 -8
  19. package/dist/Context.js.map +1 -1
  20. package/dist/Cron.d.ts +81 -11
  21. package/dist/Cron.d.ts.map +1 -1
  22. package/dist/Cron.js +101 -26
  23. package/dist/Cron.js.map +1 -1
  24. package/dist/Data.d.ts +54 -235
  25. package/dist/Data.d.ts.map +1 -1
  26. package/dist/Data.js.map +1 -1
  27. package/dist/Duration.d.ts +78 -0
  28. package/dist/Duration.d.ts.map +1 -1
  29. package/dist/Duration.js +123 -0
  30. package/dist/Duration.js.map +1 -1
  31. package/dist/Effect.d.ts +165 -8
  32. package/dist/Effect.d.ts.map +1 -1
  33. package/dist/Effect.js +12 -2
  34. package/dist/Effect.js.map +1 -1
  35. package/dist/Equal.d.ts.map +1 -1
  36. package/dist/Equal.js +8 -1
  37. package/dist/Equal.js.map +1 -1
  38. package/dist/Exit.d.ts +3 -3
  39. package/dist/Exit.d.ts.map +1 -1
  40. package/dist/Exit.js.map +1 -1
  41. package/dist/FileSystem.d.ts +59 -4
  42. package/dist/FileSystem.d.ts.map +1 -1
  43. package/dist/FileSystem.js +9 -2
  44. package/dist/FileSystem.js.map +1 -1
  45. package/dist/Formatter.d.ts.map +1 -1
  46. package/dist/Formatter.js +27 -13
  47. package/dist/Formatter.js.map +1 -1
  48. package/dist/Glob.d.ts +165 -0
  49. package/dist/Glob.d.ts.map +1 -0
  50. package/dist/Glob.js +127 -0
  51. package/dist/Glob.js.map +1 -0
  52. package/dist/Hash.d.ts.map +1 -1
  53. package/dist/Hash.js +4 -1
  54. package/dist/Hash.js.map +1 -1
  55. package/dist/JsonPatch.js +4 -0
  56. package/dist/JsonPatch.js.map +1 -1
  57. package/dist/JsonSchema.d.ts.map +1 -1
  58. package/dist/JsonSchema.js +13 -40
  59. package/dist/JsonSchema.js.map +1 -1
  60. package/dist/Match.d.ts +86 -0
  61. package/dist/Match.d.ts.map +1 -1
  62. package/dist/Match.js +72 -0
  63. package/dist/Match.js.map +1 -1
  64. package/dist/Metric.d.ts +3 -3
  65. package/dist/MutableList.d.ts +5 -2
  66. package/dist/MutableList.d.ts.map +1 -1
  67. package/dist/MutableList.js +7 -5
  68. package/dist/MutableList.js.map +1 -1
  69. package/dist/MutableRef.d.ts.map +1 -1
  70. package/dist/MutableRef.js +7 -0
  71. package/dist/MutableRef.js.map +1 -1
  72. package/dist/PartitionedSemaphore.d.ts +2 -1
  73. package/dist/PartitionedSemaphore.d.ts.map +1 -1
  74. package/dist/PartitionedSemaphore.js +22 -12
  75. package/dist/PartitionedSemaphore.js.map +1 -1
  76. package/dist/Pool.d.ts +51 -0
  77. package/dist/Pool.d.ts.map +1 -1
  78. package/dist/Pool.js +136 -36
  79. package/dist/Pool.js.map +1 -1
  80. package/dist/PubSub.d.ts.map +1 -1
  81. package/dist/PubSub.js +5 -6
  82. package/dist/PubSub.js.map +1 -1
  83. package/dist/Random.d.ts.map +1 -1
  84. package/dist/Random.js +3 -3
  85. package/dist/Random.js.map +1 -1
  86. package/dist/RcMap.d.ts.map +1 -1
  87. package/dist/RcMap.js +8 -2
  88. package/dist/RcMap.js.map +1 -1
  89. package/dist/Ref.d.ts.map +1 -1
  90. package/dist/Ref.js +8 -0
  91. package/dist/Ref.js.map +1 -1
  92. package/dist/Schedule.d.ts +18 -1
  93. package/dist/Schedule.d.ts.map +1 -1
  94. package/dist/Schedule.js +8 -3
  95. package/dist/Schedule.js.map +1 -1
  96. package/dist/Schema.d.ts +690 -49
  97. package/dist/Schema.d.ts.map +1 -1
  98. package/dist/Schema.js +687 -28
  99. package/dist/Schema.js.map +1 -1
  100. package/dist/SchemaAST.d.ts +4 -2
  101. package/dist/SchemaAST.d.ts.map +1 -1
  102. package/dist/SchemaAST.js +14 -17
  103. package/dist/SchemaAST.js.map +1 -1
  104. package/dist/SchemaGetter.d.ts +6 -1
  105. package/dist/SchemaGetter.d.ts.map +1 -1
  106. package/dist/SchemaGetter.js +22 -11
  107. package/dist/SchemaGetter.js.map +1 -1
  108. package/dist/SchemaParser.d.ts.map +1 -1
  109. package/dist/SchemaParser.js +48 -22
  110. package/dist/SchemaParser.js.map +1 -1
  111. package/dist/SchemaRepresentation.d.ts +33 -10
  112. package/dist/SchemaRepresentation.d.ts.map +1 -1
  113. package/dist/SchemaRepresentation.js +39 -13
  114. package/dist/SchemaRepresentation.js.map +1 -1
  115. package/dist/SchemaTransformation.d.ts +12 -4
  116. package/dist/SchemaTransformation.d.ts.map +1 -1
  117. package/dist/SchemaTransformation.js +15 -5
  118. package/dist/SchemaTransformation.js.map +1 -1
  119. package/dist/ScopedCache.d.ts.map +1 -1
  120. package/dist/ScopedCache.js +5 -7
  121. package/dist/ScopedCache.js.map +1 -1
  122. package/dist/Semaphore.d.ts +130 -0
  123. package/dist/Semaphore.d.ts.map +1 -1
  124. package/dist/Semaphore.js +94 -35
  125. package/dist/Semaphore.js.map +1 -1
  126. package/dist/Sink.d.ts.map +1 -1
  127. package/dist/Sink.js +7 -2
  128. package/dist/Sink.js.map +1 -1
  129. package/dist/Stream.d.ts +13 -4
  130. package/dist/Stream.d.ts.map +1 -1
  131. package/dist/Stream.js +31 -10
  132. package/dist/Stream.js.map +1 -1
  133. package/dist/String.d.ts +3 -0
  134. package/dist/String.d.ts.map +1 -1
  135. package/dist/String.js +3 -0
  136. package/dist/String.js.map +1 -1
  137. package/dist/Terminal.d.ts +18 -1
  138. package/dist/Terminal.d.ts.map +1 -1
  139. package/dist/Terminal.js +1 -1
  140. package/dist/Terminal.js.map +1 -1
  141. package/dist/Tracer.d.ts +11 -1
  142. package/dist/Tracer.d.ts.map +1 -1
  143. package/dist/Tracer.js +6 -1
  144. package/dist/Tracer.js.map +1 -1
  145. package/dist/ai/AiError.d.ts +43 -116
  146. package/dist/ai/AiError.d.ts.map +1 -1
  147. package/dist/ai/AiError.js +53 -72
  148. package/dist/ai/AiError.js.map +1 -1
  149. package/dist/ai/Decision.d.ts +196 -15
  150. package/dist/ai/Decision.d.ts.map +1 -1
  151. package/dist/ai/Decision.js +130 -0
  152. package/dist/ai/Decision.js.map +1 -1
  153. package/dist/ai/DecisionModel.d.ts +54 -13
  154. package/dist/ai/DecisionModel.d.ts.map +1 -1
  155. package/dist/ai/DecisionModel.js +123 -12
  156. package/dist/ai/DecisionModel.js.map +1 -1
  157. package/dist/ai/LanguageModel.d.ts.map +1 -1
  158. package/dist/ai/LanguageModel.js +9 -0
  159. package/dist/ai/LanguageModel.js.map +1 -1
  160. package/dist/ai/McpSchema.d.ts +110 -110
  161. package/dist/ai/McpSchema.d.ts.map +1 -1
  162. package/dist/ai/McpServer.d.ts +630 -29
  163. package/dist/ai/McpServer.d.ts.map +1 -1
  164. package/dist/ai/McpServer.js +583 -131
  165. package/dist/ai/McpServer.js.map +1 -1
  166. package/dist/ai/McpTest.d.ts +130 -0
  167. package/dist/ai/McpTest.d.ts.map +1 -0
  168. package/dist/ai/McpTest.js +237 -0
  169. package/dist/ai/McpTest.js.map +1 -0
  170. package/dist/ai/Prompt.d.ts +52 -0
  171. package/dist/ai/Prompt.d.ts.map +1 -1
  172. package/dist/ai/Prompt.js +38 -0
  173. package/dist/ai/Prompt.js.map +1 -1
  174. package/dist/ai/Response.d.ts +17 -28
  175. package/dist/ai/Response.d.ts.map +1 -1
  176. package/dist/ai/Response.js +5 -10
  177. package/dist/ai/Response.js.map +1 -1
  178. package/dist/ai/Tool.d.ts +43 -1
  179. package/dist/ai/Tool.d.ts.map +1 -1
  180. package/dist/ai/Tool.js +5 -2
  181. package/dist/ai/Tool.js.map +1 -1
  182. package/dist/ai/Toolkit.d.ts.map +1 -1
  183. package/dist/ai/Toolkit.js +8 -1
  184. package/dist/ai/Toolkit.js.map +1 -1
  185. package/dist/ai/index.d.ts +5 -0
  186. package/dist/ai/index.d.ts.map +1 -1
  187. package/dist/ai/index.js +5 -0
  188. package/dist/ai/index.js.map +1 -1
  189. package/dist/ai/internal/mcpCore.js +17 -12
  190. package/dist/ai/internal/mcpCore.js.map +1 -1
  191. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +4 -5
  192. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  193. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +4 -5
  194. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  195. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +4 -5
  196. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  197. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +4 -5
  198. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  199. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +18 -10
  200. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  201. package/dist/ai/internal/mcpProtocol.js +13 -0
  202. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  203. package/dist/ai/internal/mcpRuntime.js +5 -3
  204. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  205. package/dist/ai/internal/mcpStatefulRuntime.js +6 -1
  206. package/dist/ai/internal/mcpStatefulRuntime.js.map +1 -1
  207. package/dist/cli/Argument.d.ts +21 -0
  208. package/dist/cli/Argument.d.ts.map +1 -1
  209. package/dist/cli/Argument.js +7 -0
  210. package/dist/cli/Argument.js.map +1 -1
  211. package/dist/cli/CliError.d.ts +78 -0
  212. package/dist/cli/CliError.d.ts.map +1 -1
  213. package/dist/cli/CliError.js +65 -3
  214. package/dist/cli/CliError.js.map +1 -1
  215. package/dist/cli/CliOutput.d.ts +220 -7
  216. package/dist/cli/CliOutput.d.ts.map +1 -1
  217. package/dist/cli/CliOutput.js +156 -43
  218. package/dist/cli/CliOutput.js.map +1 -1
  219. package/dist/cli/Command.d.ts +47 -16
  220. package/dist/cli/Command.d.ts.map +1 -1
  221. package/dist/cli/Command.js +67 -29
  222. package/dist/cli/Command.js.map +1 -1
  223. package/dist/cli/Completions.d.ts +58 -0
  224. package/dist/cli/Completions.d.ts.map +1 -1
  225. package/dist/cli/Completions.js +49 -9
  226. package/dist/cli/Completions.js.map +1 -1
  227. package/dist/cli/Flag.d.ts +122 -0
  228. package/dist/cli/Flag.d.ts.map +1 -1
  229. package/dist/cli/Flag.js +42 -0
  230. package/dist/cli/Flag.js.map +1 -1
  231. package/dist/cli/GlobalFlag.d.ts.map +1 -1
  232. package/dist/cli/GlobalFlag.js +15 -7
  233. package/dist/cli/GlobalFlag.js.map +1 -1
  234. package/dist/cli/HelpDoc.d.ts +15 -1
  235. package/dist/cli/HelpDoc.d.ts.map +1 -1
  236. package/dist/cli/Param.d.ts +15 -0
  237. package/dist/cli/Param.d.ts.map +1 -1
  238. package/dist/cli/Param.js +23 -2
  239. package/dist/cli/Param.js.map +1 -1
  240. package/dist/cli/Primitive.d.ts +14 -0
  241. package/dist/cli/Primitive.d.ts.map +1 -1
  242. package/dist/cli/Primitive.js +15 -1
  243. package/dist/cli/Primitive.js.map +1 -1
  244. package/dist/cli/Prompt.d.ts +1 -0
  245. package/dist/cli/Prompt.d.ts.map +1 -1
  246. package/dist/cli/Prompt.js +1 -0
  247. package/dist/cli/Prompt.js.map +1 -1
  248. package/dist/cli/TerminalCapabilities.d.ts +3 -2
  249. package/dist/cli/TerminalCapabilities.d.ts.map +1 -1
  250. package/dist/cli/TerminalCapabilities.js +3 -1
  251. package/dist/cli/TerminalCapabilities.js.map +1 -1
  252. package/dist/cli/internal/completions/bash.js +73 -27
  253. package/dist/cli/internal/completions/bash.js.map +1 -1
  254. package/dist/cli/internal/help.d.ts.map +1 -1
  255. package/dist/cli/internal/help.js +17 -10
  256. package/dist/cli/internal/help.js.map +1 -1
  257. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  258. package/dist/cluster/ClusterWorkflowEngine.js +45 -10
  259. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  260. package/dist/cluster/MessageStorage.d.ts +23 -45
  261. package/dist/cluster/MessageStorage.d.ts.map +1 -1
  262. package/dist/cluster/MessageStorage.js +6 -7
  263. package/dist/cluster/MessageStorage.js.map +1 -1
  264. package/dist/cluster/Sharding.d.ts.map +1 -1
  265. package/dist/cluster/Sharding.js +151 -49
  266. package/dist/cluster/Sharding.js.map +1 -1
  267. package/dist/cluster/ShardingConfig.d.ts +76 -0
  268. package/dist/cluster/ShardingConfig.d.ts.map +1 -1
  269. package/dist/cluster/ShardingConfig.js +4 -0
  270. package/dist/cluster/ShardingConfig.js.map +1 -1
  271. package/dist/cluster/SingleRunner.d.ts +3 -3
  272. package/dist/cluster/SingleRunner.d.ts.map +1 -1
  273. package/dist/cluster/SingleRunner.js +1 -1
  274. package/dist/cluster/Snowflake.d.ts.map +1 -1
  275. package/dist/cluster/Snowflake.js +3 -7
  276. package/dist/cluster/Snowflake.js.map +1 -1
  277. package/dist/cluster/SqlMessageStorage.d.ts +37 -6
  278. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  279. package/dist/cluster/SqlMessageStorage.js +34 -7
  280. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  281. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  282. package/dist/cluster/SqlRunnerStorage.js +109 -46
  283. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  284. package/dist/cluster/internal/entityManager.js +54 -20
  285. package/dist/cluster/internal/entityManager.js.map +1 -1
  286. package/dist/crypto/Aead.d.ts +322 -0
  287. package/dist/crypto/Aead.d.ts.map +1 -0
  288. package/dist/crypto/Aead.js +331 -0
  289. package/dist/crypto/Aead.js.map +1 -0
  290. package/dist/crypto/Cipher.d.ts +235 -0
  291. package/dist/crypto/Cipher.d.ts.map +1 -0
  292. package/dist/crypto/Cipher.js +233 -0
  293. package/dist/crypto/Cipher.js.map +1 -0
  294. package/dist/crypto/CryptoError.d.ts +212 -0
  295. package/dist/crypto/CryptoError.d.ts.map +1 -0
  296. package/dist/crypto/CryptoError.js +202 -0
  297. package/dist/crypto/CryptoError.js.map +1 -0
  298. package/dist/crypto/Digest.d.ts +143 -0
  299. package/dist/crypto/Digest.d.ts.map +1 -0
  300. package/dist/crypto/Digest.js +146 -0
  301. package/dist/crypto/Digest.js.map +1 -0
  302. package/dist/crypto/Kdf.d.ts +220 -0
  303. package/dist/crypto/Kdf.d.ts.map +1 -0
  304. package/dist/crypto/Kdf.js +212 -0
  305. package/dist/crypto/Kdf.js.map +1 -0
  306. package/dist/crypto/KeyAgreement.d.ts +323 -0
  307. package/dist/crypto/KeyAgreement.d.ts.map +1 -0
  308. package/dist/crypto/KeyAgreement.js +303 -0
  309. package/dist/crypto/KeyAgreement.js.map +1 -0
  310. package/dist/crypto/KeyFormat.d.ts +309 -0
  311. package/dist/crypto/KeyFormat.d.ts.map +1 -0
  312. package/dist/crypto/KeyFormat.js +556 -0
  313. package/dist/crypto/KeyFormat.js.map +1 -0
  314. package/dist/crypto/KeyWrap.d.ts +389 -0
  315. package/dist/crypto/KeyWrap.d.ts.map +1 -0
  316. package/dist/crypto/KeyWrap.js +381 -0
  317. package/dist/crypto/KeyWrap.js.map +1 -0
  318. package/dist/crypto/Mac.d.ts +277 -0
  319. package/dist/crypto/Mac.d.ts.map +1 -0
  320. package/dist/crypto/Mac.js +288 -0
  321. package/dist/crypto/Mac.js.map +1 -0
  322. package/dist/crypto/SecureRandom.d.ts +340 -0
  323. package/dist/crypto/SecureRandom.d.ts.map +1 -0
  324. package/dist/crypto/SecureRandom.js +257 -0
  325. package/dist/crypto/SecureRandom.js.map +1 -0
  326. package/dist/crypto/Signature.d.ts +448 -0
  327. package/dist/crypto/Signature.d.ts.map +1 -0
  328. package/dist/crypto/Signature.js +484 -0
  329. package/dist/crypto/Signature.js.map +1 -0
  330. package/dist/crypto/WebCrypto.d.ts +61 -0
  331. package/dist/crypto/WebCrypto.d.ts.map +1 -0
  332. package/dist/crypto/WebCrypto.js +63 -0
  333. package/dist/crypto/WebCrypto.js.map +1 -0
  334. package/dist/crypto/index.d.ts +65 -0
  335. package/dist/crypto/index.d.ts.map +1 -0
  336. package/dist/crypto/index.js +66 -0
  337. package/dist/crypto/index.js.map +1 -0
  338. package/dist/crypto/internal/asymmetric.d.ts +2 -0
  339. package/dist/crypto/internal/asymmetric.d.ts.map +1 -0
  340. package/dist/crypto/internal/asymmetric.js +210 -0
  341. package/dist/crypto/internal/asymmetric.js.map +1 -0
  342. package/dist/crypto/internal/chacha.d.ts +46 -0
  343. package/dist/crypto/internal/chacha.d.ts.map +1 -0
  344. package/dist/crypto/internal/chacha.js +885 -0
  345. package/dist/crypto/internal/chacha.js.map +1 -0
  346. package/dist/crypto/internal/der.d.ts +6 -0
  347. package/dist/crypto/internal/der.d.ts.map +1 -0
  348. package/dist/crypto/internal/der.js +86 -0
  349. package/dist/crypto/internal/der.js.map +1 -0
  350. package/dist/crypto/internal/digest.d.ts +2 -0
  351. package/dist/crypto/internal/digest.d.ts.map +1 -0
  352. package/dist/crypto/internal/digest.js +15 -0
  353. package/dist/crypto/internal/digest.js.map +1 -0
  354. package/dist/crypto/internal/key.d.ts +2 -0
  355. package/dist/crypto/internal/key.d.ts.map +1 -0
  356. package/dist/crypto/internal/key.js +170 -0
  357. package/dist/crypto/internal/key.js.map +1 -0
  358. package/dist/crypto/internal/md5.d.ts +39 -0
  359. package/dist/crypto/internal/md5.d.ts.map +1 -0
  360. package/dist/crypto/internal/md5.js +179 -0
  361. package/dist/crypto/internal/md5.js.map +1 -0
  362. package/dist/crypto/internal/webCrypto.d.ts +2 -0
  363. package/dist/crypto/internal/webCrypto.d.ts.map +1 -0
  364. package/dist/crypto/internal/webCrypto.js +111 -0
  365. package/dist/crypto/internal/webCrypto.js.map +1 -0
  366. package/dist/devtools/DevToolsClient.d.ts.map +1 -1
  367. package/dist/devtools/DevToolsClient.js +2 -0
  368. package/dist/devtools/DevToolsClient.js.map +1 -1
  369. package/dist/encoding/Base64.js +36 -0
  370. package/dist/encoding/Base64.js.map +1 -1
  371. package/dist/encoding/Base64Url.d.ts.map +1 -1
  372. package/dist/encoding/Base64Url.js +3 -2
  373. package/dist/encoding/Base64Url.js.map +1 -1
  374. package/dist/encoding/Csv.d.ts +608 -0
  375. package/dist/encoding/Csv.d.ts.map +1 -0
  376. package/dist/encoding/Csv.js +718 -0
  377. package/dist/encoding/Csv.js.map +1 -0
  378. package/dist/encoding/Hex.d.ts +3 -2
  379. package/dist/encoding/Hex.d.ts.map +1 -1
  380. package/dist/encoding/Hex.js +3 -2
  381. package/dist/encoding/Hex.js.map +1 -1
  382. package/dist/encoding/SchemaBinary.d.ts.map +1 -1
  383. package/dist/encoding/SchemaBinary.js +42 -4
  384. package/dist/encoding/SchemaBinary.js.map +1 -1
  385. package/dist/encoding/Sse.d.ts.map +1 -1
  386. package/dist/encoding/Sse.js +3 -3
  387. package/dist/encoding/Sse.js.map +1 -1
  388. package/dist/encoding/Toml.d.ts +17 -3
  389. package/dist/encoding/Toml.d.ts.map +1 -1
  390. package/dist/encoding/Toml.js +124 -31
  391. package/dist/encoding/Toml.js.map +1 -1
  392. package/dist/encoding/Yaml.d.ts +8 -1
  393. package/dist/encoding/Yaml.d.ts.map +1 -1
  394. package/dist/encoding/Yaml.js +54 -18
  395. package/dist/encoding/Yaml.js.map +1 -1
  396. package/dist/encoding/index.d.ts +5 -0
  397. package/dist/encoding/index.d.ts.map +1 -1
  398. package/dist/encoding/index.js +5 -0
  399. package/dist/encoding/index.js.map +1 -1
  400. package/dist/eventlog/EventJournal.d.ts.map +1 -1
  401. package/dist/eventlog/EventJournal.js +6 -3
  402. package/dist/eventlog/EventJournal.js.map +1 -1
  403. package/dist/eventlog/EventLog.d.ts +119 -4
  404. package/dist/eventlog/EventLog.d.ts.map +1 -1
  405. package/dist/eventlog/EventLog.js +200 -12
  406. package/dist/eventlog/EventLog.js.map +1 -1
  407. package/dist/eventlog/EventLogEncryption.d.ts +41 -4
  408. package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
  409. package/dist/eventlog/EventLogEncryption.js +83 -64
  410. package/dist/eventlog/EventLogEncryption.js.map +1 -1
  411. package/dist/eventlog/EventLogMessage.d.ts +279 -0
  412. package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
  413. package/dist/eventlog/EventLogMessage.js +217 -1
  414. package/dist/eventlog/EventLogMessage.js.map +1 -1
  415. package/dist/eventlog/EventLogRemote.d.ts +200 -28
  416. package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
  417. package/dist/eventlog/EventLogRemote.js +186 -16
  418. package/dist/eventlog/EventLogRemote.js.map +1 -1
  419. package/dist/eventlog/EventLogServer.d.ts +3 -0
  420. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  421. package/dist/eventlog/EventLogServer.js +18 -10
  422. package/dist/eventlog/EventLogServer.js.map +1 -1
  423. package/dist/eventlog/EventLogServerEncrypted.d.ts +326 -5
  424. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  425. package/dist/eventlog/EventLogServerEncrypted.js +769 -14
  426. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  427. package/dist/eventlog/EventLogSessionAuth.d.ts +5 -3
  428. package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
  429. package/dist/eventlog/EventLogSessionAuth.js +41 -64
  430. package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
  431. package/dist/eventlog/EventRow.d.ts +4 -0
  432. package/dist/eventlog/EventRow.d.ts.map +1 -1
  433. package/dist/eventlog/EventRow.js +12 -2
  434. package/dist/eventlog/EventRow.js.map +1 -1
  435. package/dist/eventlog/SqlEventJournal.d.ts.map +1 -1
  436. package/dist/eventlog/SqlEventJournal.js +47 -27
  437. package/dist/eventlog/SqlEventJournal.js.map +1 -1
  438. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +21 -5
  439. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
  440. package/dist/eventlog/SqlEventLogServerEncrypted.js +1048 -113
  441. package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
  442. package/dist/eventlog/SqlEventLogServerUnencrypted.js +2 -2
  443. package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
  444. package/dist/eventlog/internal/batches.d.ts +12 -0
  445. package/dist/eventlog/internal/batches.d.ts.map +1 -0
  446. package/dist/eventlog/internal/batches.js +26 -0
  447. package/dist/eventlog/internal/batches.js.map +1 -0
  448. package/dist/eventlog/internal/compaction.d.ts +38 -0
  449. package/dist/eventlog/internal/compaction.d.ts.map +1 -0
  450. package/dist/eventlog/internal/compaction.js +33 -0
  451. package/dist/eventlog/internal/compaction.js.map +1 -0
  452. package/dist/eventlog/internal/conflicts.d.ts +0 -1
  453. package/dist/eventlog/internal/conflicts.d.ts.map +1 -1
  454. package/dist/eventlog/internal/conflicts.js +0 -3
  455. package/dist/eventlog/internal/conflicts.js.map +1 -1
  456. package/dist/eventlog/internal/identityRootSecretDerivation.js +66 -67
  457. package/dist/eventlog/internal/identityRootSecretDerivation.js.map +1 -1
  458. package/dist/eventlog/internal/remoteCompaction.d.ts +31 -0
  459. package/dist/eventlog/internal/remoteCompaction.d.ts.map +1 -0
  460. package/dist/eventlog/internal/remoteCompaction.js +76 -0
  461. package/dist/eventlog/internal/remoteCompaction.js.map +1 -0
  462. package/dist/http/Cookies.d.ts +172 -0
  463. package/dist/http/Cookies.d.ts.map +1 -1
  464. package/dist/http/Cookies.js +153 -10
  465. package/dist/http/Cookies.js.map +1 -1
  466. package/dist/http/FetchHttpClient.d.ts +26 -2
  467. package/dist/http/FetchHttpClient.d.ts.map +1 -1
  468. package/dist/http/FetchHttpClient.js +78 -15
  469. package/dist/http/FetchHttpClient.js.map +1 -1
  470. package/dist/http/HttpClient.d.ts +502 -8
  471. package/dist/http/HttpClient.d.ts.map +1 -1
  472. package/dist/http/HttpClient.js +296 -12
  473. package/dist/http/HttpClient.js.map +1 -1
  474. package/dist/http/HttpClientError.d.ts +8 -1
  475. package/dist/http/HttpClientError.d.ts.map +1 -1
  476. package/dist/http/HttpClientError.js +37 -1
  477. package/dist/http/HttpClientError.js.map +1 -1
  478. package/dist/http/HttpClientRequest.d.ts +9 -5
  479. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  480. package/dist/http/HttpClientRequest.js +3 -4
  481. package/dist/http/HttpClientRequest.js.map +1 -1
  482. package/dist/http/HttpClientResponse.d.ts.map +1 -1
  483. package/dist/http/HttpClientResponse.js +3 -2
  484. package/dist/http/HttpClientResponse.js.map +1 -1
  485. package/dist/http/HttpMethod.d.ts +7 -1
  486. package/dist/http/HttpMethod.d.ts.map +1 -1
  487. package/dist/http/HttpMethod.js +3 -8
  488. package/dist/http/HttpMethod.js.map +1 -1
  489. package/dist/http/HttpMiddleware.d.ts +1 -1
  490. package/dist/http/HttpMiddleware.d.ts.map +1 -1
  491. package/dist/http/HttpMiddleware.js +14 -16
  492. package/dist/http/HttpMiddleware.js.map +1 -1
  493. package/dist/http/HttpRouter.d.ts.map +1 -1
  494. package/dist/http/HttpRouter.js +2 -1
  495. package/dist/http/HttpRouter.js.map +1 -1
  496. package/dist/http/HttpServerError.js +2 -2
  497. package/dist/http/HttpServerError.js.map +1 -1
  498. package/dist/http/HttpServerRequest.d.ts +11 -3
  499. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  500. package/dist/http/HttpServerRequest.js +77 -25
  501. package/dist/http/HttpServerRequest.js.map +1 -1
  502. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  503. package/dist/http/HttpServerResponse.js +3 -2
  504. package/dist/http/HttpServerResponse.js.map +1 -1
  505. package/dist/http/HttpStaticServer.d.ts.map +1 -1
  506. package/dist/http/HttpStaticServer.js +48 -21
  507. package/dist/http/HttpStaticServer.js.map +1 -1
  508. package/dist/http/HttpTraceContext.d.ts +2 -1
  509. package/dist/http/HttpTraceContext.d.ts.map +1 -1
  510. package/dist/http/HttpTraceContext.js +7 -5
  511. package/dist/http/HttpTraceContext.js.map +1 -1
  512. package/dist/http/MultipartParser/internal/contentType.js +3 -3
  513. package/dist/http/ProblemDetails.d.ts +96 -0
  514. package/dist/http/ProblemDetails.d.ts.map +1 -0
  515. package/dist/http/ProblemDetails.js +98 -0
  516. package/dist/http/ProblemDetails.js.map +1 -0
  517. package/dist/http/UrlParams.d.ts +3 -1
  518. package/dist/http/UrlParams.d.ts.map +1 -1
  519. package/dist/http/UrlParams.js +4 -2
  520. package/dist/http/UrlParams.js.map +1 -1
  521. package/dist/http/index.d.ts +5 -0
  522. package/dist/http/index.d.ts.map +1 -1
  523. package/dist/http/index.js +5 -0
  524. package/dist/http/index.js.map +1 -1
  525. package/dist/http/internal/compression.js +4 -5
  526. package/dist/http/internal/compression.js.map +1 -1
  527. package/dist/http/internal/decompression.js +6 -2
  528. package/dist/http/internal/decompression.js.map +1 -1
  529. package/dist/http/internal/httpBody.js +8 -1
  530. package/dist/http/internal/httpBody.js.map +1 -1
  531. package/dist/http/internal/urlParams.js +33 -0
  532. package/dist/http/internal/urlParams.js.map +1 -1
  533. package/dist/http-api/HttpApi.d.ts +3 -6
  534. package/dist/http-api/HttpApi.d.ts.map +1 -1
  535. package/dist/http-api/HttpApi.js +3 -6
  536. package/dist/http-api/HttpApi.js.map +1 -1
  537. package/dist/http-api/HttpApiBuilder.d.ts.map +1 -1
  538. package/dist/http-api/HttpApiBuilder.js +43 -13
  539. package/dist/http-api/HttpApiBuilder.js.map +1 -1
  540. package/dist/http-api/HttpApiClient.d.ts +140 -7
  541. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  542. package/dist/http-api/HttpApiClient.js +193 -44
  543. package/dist/http-api/HttpApiClient.js.map +1 -1
  544. package/dist/http-api/HttpApiEndpoint.d.ts +24 -7
  545. package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
  546. package/dist/http-api/HttpApiEndpoint.js +123 -32
  547. package/dist/http-api/HttpApiEndpoint.js.map +1 -1
  548. package/dist/http-api/HttpApiError.d.ts +185 -13
  549. package/dist/http-api/HttpApiError.d.ts.map +1 -1
  550. package/dist/http-api/HttpApiError.js +128 -0
  551. package/dist/http-api/HttpApiError.js.map +1 -1
  552. package/dist/http-api/HttpApiMiddleware.d.ts +64 -17
  553. package/dist/http-api/HttpApiMiddleware.d.ts.map +1 -1
  554. package/dist/http-api/HttpApiMiddleware.js +85 -1
  555. package/dist/http-api/HttpApiMiddleware.js.map +1 -1
  556. package/dist/http-api/HttpApiSchema.d.ts +142 -33
  557. package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
  558. package/dist/http-api/HttpApiSchema.js +123 -59
  559. package/dist/http-api/HttpApiSchema.js.map +1 -1
  560. package/dist/http-api/HttpApiTest.d.ts.map +1 -1
  561. package/dist/http-api/HttpApiTest.js +3 -2
  562. package/dist/http-api/HttpApiTest.js.map +1 -1
  563. package/dist/http-api/OpenApi.d.ts.map +1 -1
  564. package/dist/http-api/OpenApi.js +25 -16
  565. package/dist/http-api/OpenApi.js.map +1 -1
  566. package/dist/http-api/internal/toCodecHttpProperties.d.ts +2 -0
  567. package/dist/http-api/internal/toCodecHttpProperties.d.ts.map +1 -0
  568. package/dist/http-api/internal/toCodecHttpProperties.js +38 -0
  569. package/dist/http-api/internal/toCodecHttpProperties.js.map +1 -0
  570. package/dist/index.d.ts +5 -5
  571. package/dist/index.d.ts.map +1 -1
  572. package/dist/index.js +5 -5
  573. package/dist/index.js.map +1 -1
  574. package/dist/internal/arbitrary/runner.d.ts.map +1 -1
  575. package/dist/internal/arbitrary/runner.js +120 -44
  576. package/dist/internal/arbitrary/runner.js.map +1 -1
  577. package/dist/internal/core.js +2 -0
  578. package/dist/internal/core.js.map +1 -1
  579. package/dist/internal/effect.js +46 -27
  580. package/dist/internal/effect.js.map +1 -1
  581. package/dist/internal/equal.js +14 -0
  582. package/dist/internal/equal.js.map +1 -1
  583. package/dist/internal/glob.d.ts +2 -0
  584. package/dist/internal/glob.d.ts.map +1 -0
  585. package/dist/internal/glob.js +630 -0
  586. package/dist/internal/glob.js.map +1 -0
  587. package/dist/internal/jsonSchema.d.ts +2 -0
  588. package/dist/internal/jsonSchema.d.ts.map +1 -0
  589. package/dist/internal/jsonSchema.js +28 -0
  590. package/dist/internal/jsonSchema.js.map +1 -0
  591. package/dist/internal/matcher.js +11 -1
  592. package/dist/internal/matcher.js.map +1 -1
  593. package/dist/internal/persistence.js +9 -0
  594. package/dist/internal/persistence.js.map +1 -1
  595. package/dist/internal/rcRef.js +4 -1
  596. package/dist/internal/rcRef.js.map +1 -1
  597. package/dist/internal/schema/compilerRegistry.js +4 -1
  598. package/dist/internal/schema/compilerRegistry.js.map +1 -1
  599. package/dist/internal/schema/content.d.ts +2 -0
  600. package/dist/internal/schema/content.d.ts.map +1 -0
  601. package/dist/internal/schema/content.js +13 -0
  602. package/dist/internal/schema/content.js.map +1 -0
  603. package/dist/internal/schema/fromJsonSchemaDocument.js +173 -185
  604. package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
  605. package/dist/internal/schema/fromRepresentation.js +2 -1
  606. package/dist/internal/schema/fromRepresentation.js.map +1 -1
  607. package/dist/internal/schema/standardSchema.js +8 -2
  608. package/dist/internal/schema/standardSchema.js.map +1 -1
  609. package/dist/internal/schema/toCodeDocument.js +9 -6
  610. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  611. package/dist/internal/schema/toCodec.js +21 -24
  612. package/dist/internal/schema/toCodec.js.map +1 -1
  613. package/dist/internal/schema/toJsonSchemaDocument.js +205 -140
  614. package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
  615. package/dist/internal/schema/toRepresentation.js +107 -129
  616. package/dist/internal/schema/toRepresentation.js.map +1 -1
  617. package/dist/internal/sql.d.ts +2 -0
  618. package/dist/internal/sql.d.ts.map +1 -0
  619. package/dist/internal/sql.js +13 -0
  620. package/dist/internal/sql.js.map +1 -0
  621. package/dist/internal/trie.js +42 -13
  622. package/dist/internal/trie.js.map +1 -1
  623. package/dist/internal/ulid.js +41 -0
  624. package/dist/internal/ulid.js.map +1 -1
  625. package/dist/internal/uuid.js +52 -8
  626. package/dist/internal/uuid.js.map +1 -1
  627. package/dist/internal/version.js +1 -1
  628. package/dist/observability/Otlp.d.ts +15 -4
  629. package/dist/observability/Otlp.d.ts.map +1 -1
  630. package/dist/observability/Otlp.js +10 -0
  631. package/dist/observability/Otlp.js.map +1 -1
  632. package/dist/observability/OtlpProxy.d.ts +154 -0
  633. package/dist/observability/OtlpProxy.d.ts.map +1 -0
  634. package/dist/observability/OtlpProxy.js +235 -0
  635. package/dist/observability/OtlpProxy.js.map +1 -0
  636. package/dist/observability/OtlpResource.d.ts +7 -0
  637. package/dist/observability/OtlpResource.d.ts.map +1 -1
  638. package/dist/observability/OtlpResource.js +11 -1
  639. package/dist/observability/OtlpResource.js.map +1 -1
  640. package/dist/observability/OtlpTracer.d.ts.map +1 -1
  641. package/dist/observability/OtlpTracer.js +4 -0
  642. package/dist/observability/OtlpTracer.js.map +1 -1
  643. package/dist/observability/index.d.ts +5 -0
  644. package/dist/observability/index.d.ts.map +1 -1
  645. package/dist/observability/index.js +5 -0
  646. package/dist/observability/index.js.map +1 -1
  647. package/dist/persistence/CircuitBreaker.d.ts +897 -0
  648. package/dist/persistence/CircuitBreaker.d.ts.map +1 -0
  649. package/dist/persistence/CircuitBreaker.js +1165 -0
  650. package/dist/persistence/CircuitBreaker.js.map +1 -0
  651. package/dist/persistence/KeyValueStore.d.ts +47 -2
  652. package/dist/persistence/KeyValueStore.d.ts.map +1 -1
  653. package/dist/persistence/KeyValueStore.js +129 -18
  654. package/dist/persistence/KeyValueStore.js.map +1 -1
  655. package/dist/persistence/PersistedQueue.d.ts +9 -0
  656. package/dist/persistence/PersistedQueue.d.ts.map +1 -1
  657. package/dist/persistence/PersistedQueue.js +94 -52
  658. package/dist/persistence/PersistedQueue.js.map +1 -1
  659. package/dist/persistence/Persistence.d.ts +10 -4
  660. package/dist/persistence/Persistence.d.ts.map +1 -1
  661. package/dist/persistence/Persistence.js +18 -11
  662. package/dist/persistence/Persistence.js.map +1 -1
  663. package/dist/persistence/Redis.d.ts +78 -2
  664. package/dist/persistence/Redis.d.ts.map +1 -1
  665. package/dist/persistence/Redis.js +62 -7
  666. package/dist/persistence/Redis.js.map +1 -1
  667. package/dist/persistence/index.d.ts +5 -0
  668. package/dist/persistence/index.d.ts.map +1 -1
  669. package/dist/persistence/index.js +5 -0
  670. package/dist/persistence/index.js.map +1 -1
  671. package/dist/process/ChildProcess.d.ts +237 -71
  672. package/dist/process/ChildProcess.d.ts.map +1 -1
  673. package/dist/process/ChildProcess.js +56 -158
  674. package/dist/process/ChildProcess.js.map +1 -1
  675. package/dist/process/ChildProcessSpawner.d.ts +35 -0
  676. package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
  677. package/dist/process/ChildProcessSpawner.js +5 -2
  678. package/dist/process/ChildProcessSpawner.js.map +1 -1
  679. package/dist/process/CommandLine.d.ts +294 -0
  680. package/dist/process/CommandLine.d.ts.map +1 -0
  681. package/dist/process/CommandLine.js +481 -0
  682. package/dist/process/CommandLine.js.map +1 -0
  683. package/dist/process/index.d.ts +5 -0
  684. package/dist/process/index.d.ts.map +1 -1
  685. package/dist/process/index.js +5 -0
  686. package/dist/process/index.js.map +1 -1
  687. package/dist/reactivity/AsyncResult.d.ts +1 -1
  688. package/dist/reactivity/AsyncResult.d.ts.map +1 -1
  689. package/dist/reactivity/Atom.d.ts +2 -1
  690. package/dist/reactivity/Atom.d.ts.map +1 -1
  691. package/dist/reactivity/Atom.js +3 -4
  692. package/dist/reactivity/Atom.js.map +1 -1
  693. package/dist/reactivity/AtomRegistry.js.map +1 -1
  694. package/dist/rpc/RpcClient.d.ts +16 -1
  695. package/dist/rpc/RpcClient.d.ts.map +1 -1
  696. package/dist/rpc/RpcClient.js +59 -24
  697. package/dist/rpc/RpcClient.js.map +1 -1
  698. package/dist/rpc/RpcMessage.d.ts +10 -1
  699. package/dist/rpc/RpcMessage.d.ts.map +1 -1
  700. package/dist/rpc/RpcMessage.js +1 -0
  701. package/dist/rpc/RpcMessage.js.map +1 -1
  702. package/dist/rpc/RpcSerialization.d.ts +14 -0
  703. package/dist/rpc/RpcSerialization.d.ts.map +1 -1
  704. package/dist/rpc/RpcSerialization.js +26 -8
  705. package/dist/rpc/RpcSerialization.js.map +1 -1
  706. package/dist/rpc/RpcServer.d.ts +31 -0
  707. package/dist/rpc/RpcServer.d.ts.map +1 -1
  708. package/dist/rpc/RpcServer.js +139 -56
  709. package/dist/rpc/RpcServer.js.map +1 -1
  710. package/dist/rpc/RpcTest.d.ts +1 -0
  711. package/dist/rpc/RpcTest.d.ts.map +1 -1
  712. package/dist/rpc/RpcTest.js +1 -0
  713. package/dist/rpc/RpcTest.js.map +1 -1
  714. package/dist/schema/Model.d.ts +14 -0
  715. package/dist/schema/Model.d.ts.map +1 -1
  716. package/dist/schema/Model.js +18 -3
  717. package/dist/schema/Model.js.map +1 -1
  718. package/dist/sql/Migrator.d.ts +2 -20
  719. package/dist/sql/Migrator.d.ts.map +1 -1
  720. package/dist/sql/Migrator.js +13 -55
  721. package/dist/sql/Migrator.js.map +1 -1
  722. package/dist/sql/MigratorFileSystem.d.ts +21 -0
  723. package/dist/sql/MigratorFileSystem.d.ts.map +1 -0
  724. package/dist/sql/MigratorFileSystem.js +57 -0
  725. package/dist/sql/MigratorFileSystem.js.map +1 -0
  726. package/dist/sql/SqlClient.d.ts +9 -4
  727. package/dist/sql/SqlClient.d.ts.map +1 -1
  728. package/dist/sql/SqlClient.js +13 -10
  729. package/dist/sql/SqlClient.js.map +1 -1
  730. package/dist/sql/SqlResolver.d.ts +4 -0
  731. package/dist/sql/SqlResolver.d.ts.map +1 -1
  732. package/dist/sql/SqlResolver.js +18 -4
  733. package/dist/sql/SqlResolver.js.map +1 -1
  734. package/dist/sql/Statement.d.ts +27 -6
  735. package/dist/sql/Statement.d.ts.map +1 -1
  736. package/dist/sql/Statement.js +21 -15
  737. package/dist/sql/Statement.js.map +1 -1
  738. package/dist/sql/index.js +1 -1
  739. package/dist/testing/index.d.ts +0 -5
  740. package/dist/testing/index.d.ts.map +1 -1
  741. package/dist/testing/index.js +0 -5
  742. package/dist/testing/index.js.map +1 -1
  743. package/dist/workflow/DurableDeferred.d.ts.map +1 -1
  744. package/dist/workflow/DurableDeferred.js +21 -2
  745. package/dist/workflow/DurableDeferred.js.map +1 -1
  746. package/dist/workflow/internal/crypto.js +9 -8
  747. package/dist/workflow/internal/crypto.js.map +1 -1
  748. package/package.json +3 -1
  749. package/src/Arbitrary.ts +10 -2
  750. package/src/BigDecimal.ts +3 -0
  751. package/src/Channel.ts +64 -29
  752. package/src/Config.ts +7 -1
  753. package/src/Context.ts +34 -10
  754. package/src/Cron.ts +178 -29
  755. package/src/Data.ts +60 -265
  756. package/src/Duration.ts +140 -0
  757. package/src/Effect.ts +915 -86
  758. package/src/Equal.ts +8 -1
  759. package/src/Exit.ts +3 -3
  760. package/src/FileSystem.ts +65 -4
  761. package/src/Formatter.ts +28 -13
  762. package/src/Glob.ts +205 -0
  763. package/src/Hash.ts +4 -1
  764. package/src/JsonPatch.ts +4 -0
  765. package/src/JsonSchema.ts +12 -40
  766. package/src/Match.ts +127 -0
  767. package/src/Metric.ts +3 -3
  768. package/src/MutableList.ts +7 -5
  769. package/src/MutableRef.ts +8 -1
  770. package/src/PartitionedSemaphore.ts +24 -13
  771. package/src/Pool.ts +182 -52
  772. package/src/PubSub.ts +5 -6
  773. package/src/Random.ts +3 -3
  774. package/src/RcMap.ts +5 -1
  775. package/src/Ref.ts +8 -0
  776. package/src/Schedule.ts +27 -4
  777. package/src/Schema.ts +1237 -87
  778. package/src/SchemaAST.ts +20 -20
  779. package/src/SchemaGetter.ts +27 -11
  780. package/src/SchemaParser.ts +51 -18
  781. package/src/SchemaRepresentation.ts +50 -34
  782. package/src/SchemaTransformation.ts +17 -5
  783. package/src/ScopedCache.ts +5 -9
  784. package/src/Semaphore.ts +208 -40
  785. package/src/Sink.ts +15 -2
  786. package/src/Stream.ts +48 -22
  787. package/src/String.ts +3 -0
  788. package/src/Terminal.ts +19 -1
  789. package/src/Tracer.ts +15 -1
  790. package/src/ai/AiError.ts +56 -80
  791. package/src/ai/Decision.ts +257 -6
  792. package/src/ai/DecisionModel.ts +171 -28
  793. package/src/ai/LanguageModel.ts +9 -0
  794. package/src/ai/McpServer.ts +1283 -299
  795. package/src/ai/McpTest.ts +380 -0
  796. package/src/ai/Prompt.ts +65 -0
  797. package/src/ai/Response.ts +36 -31
  798. package/src/ai/Tool.ts +65 -10
  799. package/src/ai/Toolkit.ts +4 -1
  800. package/src/ai/index.ts +6 -0
  801. package/src/ai/internal/mcpCore.ts +78 -44
  802. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +4 -7
  803. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +4 -7
  804. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +4 -7
  805. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +4 -7
  806. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +15 -10
  807. package/src/ai/internal/mcpProtocol.ts +29 -0
  808. package/src/ai/internal/mcpRuntime.ts +9 -5
  809. package/src/ai/internal/mcpStatefulRuntime.ts +14 -2
  810. package/src/cli/Argument.ts +21 -0
  811. package/src/cli/CliError.ts +90 -3
  812. package/src/cli/CliOutput.ts +300 -55
  813. package/src/cli/Command.ts +76 -41
  814. package/src/cli/Completions.ts +51 -0
  815. package/src/cli/Flag.ts +122 -0
  816. package/src/cli/GlobalFlag.ts +6 -7
  817. package/src/cli/HelpDoc.ts +18 -1
  818. package/src/cli/Param.ts +35 -6
  819. package/src/cli/Primitive.ts +16 -1
  820. package/src/cli/Prompt.ts +1 -0
  821. package/src/cli/TerminalCapabilities.ts +6 -3
  822. package/src/cli/internal/completions/bash.ts +79 -29
  823. package/src/cli/internal/help.ts +21 -9
  824. package/src/cluster/ClusterWorkflowEngine.ts +46 -16
  825. package/src/cluster/MessageStorage.ts +19 -14
  826. package/src/cluster/Sharding.ts +176 -47
  827. package/src/cluster/ShardingConfig.ts +43 -0
  828. package/src/cluster/SingleRunner.ts +3 -3
  829. package/src/cluster/Snowflake.ts +3 -7
  830. package/src/cluster/SqlMessageStorage.ts +49 -17
  831. package/src/cluster/SqlRunnerStorage.ts +143 -70
  832. package/src/cluster/internal/entityManager.ts +75 -22
  833. package/src/crypto/Aead.ts +517 -0
  834. package/src/crypto/Cipher.ts +326 -0
  835. package/src/crypto/CryptoError.ts +242 -0
  836. package/src/crypto/Digest.ts +167 -0
  837. package/src/crypto/Kdf.ts +315 -0
  838. package/src/crypto/KeyAgreement.ts +489 -0
  839. package/src/crypto/KeyFormat.ts +712 -0
  840. package/src/crypto/KeyWrap.ts +639 -0
  841. package/src/crypto/Mac.ts +386 -0
  842. package/src/crypto/SecureRandom.ts +459 -0
  843. package/src/crypto/Signature.ts +673 -0
  844. package/src/crypto/WebCrypto.ts +64 -0
  845. package/src/crypto/index.ts +78 -0
  846. package/src/crypto/internal/asymmetric.ts +329 -0
  847. package/src/crypto/internal/chacha.ts +1088 -0
  848. package/src/crypto/internal/der.ts +110 -0
  849. package/src/crypto/internal/digest.ts +16 -0
  850. package/src/crypto/internal/key.ts +235 -0
  851. package/src/crypto/internal/md5.ts +170 -0
  852. package/src/crypto/internal/webCrypto.ts +150 -0
  853. package/src/devtools/DevToolsClient.ts +2 -0
  854. package/src/encoding/Base64.ts +38 -0
  855. package/src/encoding/Base64Url.ts +5 -2
  856. package/src/encoding/Csv.ts +1298 -0
  857. package/src/encoding/Hex.ts +3 -2
  858. package/src/encoding/SchemaBinary.ts +40 -4
  859. package/src/encoding/Sse.ts +4 -3
  860. package/src/encoding/Toml.ts +117 -35
  861. package/src/encoding/Yaml.ts +61 -18
  862. package/src/encoding/index.ts +6 -0
  863. package/src/eventlog/EventJournal.ts +4 -3
  864. package/src/eventlog/EventLog.ts +340 -15
  865. package/src/eventlog/EventLogEncryption.ts +118 -110
  866. package/src/eventlog/EventLogMessage.ts +273 -1
  867. package/src/eventlog/EventLogRemote.ts +367 -23
  868. package/src/eventlog/EventLogServer.ts +23 -8
  869. package/src/eventlog/EventLogServerEncrypted.ts +1130 -67
  870. package/src/eventlog/EventLogSessionAuth.ts +56 -70
  871. package/src/eventlog/EventRow.ts +12 -3
  872. package/src/eventlog/SqlEventJournal.ts +68 -45
  873. package/src/eventlog/SqlEventLogServerEncrypted.ts +1244 -136
  874. package/src/eventlog/SqlEventLogServerUnencrypted.ts +2 -2
  875. package/src/eventlog/internal/batches.ts +30 -0
  876. package/src/eventlog/internal/compaction.ts +64 -0
  877. package/src/eventlog/internal/conflicts.ts +0 -4
  878. package/src/eventlog/internal/identityRootSecretDerivation.ts +93 -123
  879. package/src/eventlog/internal/remoteCompaction.ts +92 -0
  880. package/src/http/Cookies.ts +291 -12
  881. package/src/http/FetchHttpClient.ts +88 -16
  882. package/src/http/HttpClient.ts +636 -29
  883. package/src/http/HttpClientError.ts +35 -1
  884. package/src/http/HttpClientRequest.ts +21 -10
  885. package/src/http/HttpClientResponse.ts +3 -2
  886. package/src/http/HttpMethod.ts +10 -2
  887. package/src/http/HttpMiddleware.ts +15 -18
  888. package/src/http/HttpRouter.ts +2 -1
  889. package/src/http/HttpServerError.ts +2 -2
  890. package/src/http/HttpServerRequest.ts +101 -30
  891. package/src/http/HttpServerResponse.ts +3 -2
  892. package/src/http/HttpStaticServer.ts +51 -22
  893. package/src/http/HttpTraceContext.ts +7 -4
  894. package/src/http/MultipartParser/internal/contentType.ts +3 -3
  895. package/src/http/ProblemDetails.ts +149 -0
  896. package/src/http/UrlParams.ts +6 -1
  897. package/src/http/index.ts +6 -0
  898. package/src/http/internal/compression.ts +4 -5
  899. package/src/http/internal/decompression.ts +10 -4
  900. package/src/http/internal/httpBody.ts +10 -2
  901. package/src/http/internal/urlParams.ts +37 -0
  902. package/src/http-api/HttpApi.ts +3 -6
  903. package/src/http-api/HttpApiBuilder.ts +61 -19
  904. package/src/http-api/HttpApiClient.ts +284 -72
  905. package/src/http-api/HttpApiEndpoint.ts +135 -35
  906. package/src/http-api/HttpApiError.ts +250 -0
  907. package/src/http-api/HttpApiMiddleware.ts +95 -1
  908. package/src/http-api/HttpApiSchema.ts +236 -52
  909. package/src/http-api/HttpApiTest.ts +3 -2
  910. package/src/http-api/OpenApi.ts +20 -17
  911. package/src/http-api/internal/toCodecHttpProperties.ts +56 -0
  912. package/src/index.ts +6 -6
  913. package/src/internal/arbitrary/runner.ts +133 -36
  914. package/src/internal/core.ts +2 -0
  915. package/src/internal/effect.ts +58 -34
  916. package/src/internal/equal.ts +17 -0
  917. package/src/internal/glob.ts +736 -0
  918. package/src/internal/jsonSchema.ts +27 -0
  919. package/src/internal/matcher.ts +18 -1
  920. package/src/internal/persistence.ts +11 -0
  921. package/src/internal/rcRef.ts +4 -1
  922. package/src/internal/schema/compilerRegistry.ts +6 -1
  923. package/src/internal/schema/content.ts +18 -0
  924. package/src/internal/schema/fromJsonSchemaDocument.ts +228 -190
  925. package/src/internal/schema/fromRepresentation.ts +2 -1
  926. package/src/internal/schema/standardSchema.ts +2 -2
  927. package/src/internal/schema/toCodeDocument.ts +11 -7
  928. package/src/internal/schema/toCodec.ts +26 -22
  929. package/src/internal/schema/toJsonSchemaDocument.ts +189 -167
  930. package/src/internal/schema/toRepresentation.ts +122 -140
  931. package/src/internal/sql.ts +14 -0
  932. package/src/internal/trie.ts +43 -14
  933. package/src/internal/ulid.ts +44 -0
  934. package/src/internal/uuid.ts +57 -16
  935. package/src/internal/version.ts +1 -1
  936. package/src/observability/Otlp.ts +21 -4
  937. package/src/observability/OtlpProxy.ts +314 -0
  938. package/src/observability/OtlpResource.ts +9 -1
  939. package/src/observability/OtlpTracer.ts +4 -0
  940. package/src/observability/index.ts +6 -0
  941. package/src/persistence/CircuitBreaker.ts +1678 -0
  942. package/src/persistence/KeyValueStore.ts +219 -22
  943. package/src/persistence/PersistedQueue.ts +128 -59
  944. package/src/persistence/Persistence.ts +20 -13
  945. package/src/persistence/Redis.ts +129 -8
  946. package/src/persistence/index.ts +6 -0
  947. package/src/process/ChildProcess.ts +285 -264
  948. package/src/process/ChildProcessSpawner.ts +46 -2
  949. package/src/process/CommandLine.ts +630 -0
  950. package/src/process/index.ts +6 -0
  951. package/src/reactivity/AsyncResult.ts +1 -1
  952. package/src/reactivity/Atom.ts +5 -5
  953. package/src/reactivity/AtomRegistry.ts +1 -1
  954. package/src/rpc/RpcClient.ts +75 -36
  955. package/src/rpc/RpcMessage.ts +10 -1
  956. package/src/rpc/RpcSerialization.ts +35 -9
  957. package/src/rpc/RpcServer.ts +176 -63
  958. package/src/rpc/RpcTest.ts +3 -0
  959. package/src/schema/Model.ts +26 -3
  960. package/src/sql/Migrator.ts +15 -69
  961. package/src/sql/MigratorFileSystem.ts +71 -0
  962. package/src/sql/SqlClient.ts +13 -20
  963. package/src/sql/SqlResolver.ts +23 -9
  964. package/src/sql/Statement.ts +38 -9
  965. package/src/sql/index.ts +1 -1
  966. package/src/testing/index.ts +0 -6
  967. package/src/workflow/DurableDeferred.ts +23 -6
  968. package/src/workflow/internal/crypto.ts +15 -11
  969. package/dist/Crypto.d.ts +0 -244
  970. package/dist/Crypto.d.ts.map +0 -1
  971. package/dist/Crypto.js +0 -139
  972. package/dist/Crypto.js.map +0 -1
  973. package/dist/testing/TestCrypto.d.ts +0 -73
  974. package/dist/testing/TestCrypto.d.ts.map +0 -1
  975. package/dist/testing/TestCrypto.js +0 -87
  976. package/dist/testing/TestCrypto.js.map +0 -1
  977. package/src/Crypto.ts +0 -347
  978. package/src/testing/TestCrypto.ts +0 -94
@@ -11,10 +11,10 @@
11
11
  * `layer`, `layerWith`, `make`, and `makeEncoded` run the migrations before
12
12
  * building the storage. To run migrations with a different connection, such as
13
13
  * a schema owner in a deploy step, use `layerMigrations` there and
14
- * `layerStorage` in the runtime.
14
+ * `layerStorage` or `makeEncodedStorage` in the runtime.
15
15
  *
16
16
  * Request deduplication keys that exceed the 255-character `message_id`
17
- * column are hashed with the `Crypto` service before they are written, so
17
+ * column are hashed with the `Digest.Digest` service before they are written, so
18
18
  * composed keys of any length are supported; shorter keys are stored as
19
19
  * plaintext, byte-compatible with rows written by previous versions.
20
20
  *
@@ -23,12 +23,10 @@
23
23
  */
24
24
  // eslint-disable effect/no-bigint-literals
25
25
  import * as Arr from "../Array.ts"
26
- import * as Crypto from "../Crypto.ts"
26
+ import * as Digest from "../crypto/Digest.ts"
27
27
  import * as Effect from "../Effect.ts"
28
- import * as Hex from "../encoding/Hex.ts"
29
28
  import * as Layer from "../Layer.ts"
30
29
  import * as Option from "../Option.ts"
31
- import type * as PlatformError from "../PlatformError.ts"
32
30
  import * as Migrator from "../sql/Migrator.ts"
33
31
  import * as SqlClient from "../sql/SqlClient.ts"
34
32
  import type { Row } from "../sql/SqlConnection.ts"
@@ -66,6 +64,7 @@ const withTracerDisabled = Effect.withTracerEnabled(false)
66
64
  * tables, including the migration history table.
67
65
  *
68
66
  * @see {@link make} for the decoded `MessageStorage` constructor
67
+ * @see {@link makeEncodedStorage} for construction without migrations
69
68
  *
70
69
  * @stability unstable
71
70
  * @category constructors
@@ -76,16 +75,49 @@ export const makeEncoded: (options?: {
76
75
  }) => Effect.Effect<
77
76
  MessageStorage.Encoded,
78
77
  never,
79
- SqlClient.SqlClient | Crypto.Crypto
78
+ SqlClient.SqlClient | Digest.Digest
80
79
  > = (options) => Effect.andThen(runMessageMigrations(options), makeEncodedStorage(options))
81
80
 
82
- const makeEncodedStorage = Effect.fnUntraced(function*(
83
- options: {
81
+ /**
82
+ * Creates a SQL-backed encoded message storage driver without running migrations
83
+ * or executing startup SQL.
84
+ *
85
+ * **When to use**
86
+ *
87
+ * Use when composing a custom encoded adapter with a runtime SQL connection
88
+ * that does not have schema-management privileges.
89
+ *
90
+ * **Details**
91
+ *
92
+ * The optional `prefix` controls the message and reply table names; when omitted,
93
+ * `cluster` is used.
94
+ *
95
+ * **Gotchas**
96
+ *
97
+ * Run `layerMigrations` separately with the same prefix before using the driver.
98
+ * This constructor does not create tables or check that the schema is up to date.
99
+ *
100
+ * @see {@link makeEncoded} for construction that runs migrations
101
+ * @see {@link layerMigrations} for running migrations separately
102
+ * @see {@link layerStorage} for providing decoded storage without migrations
103
+ *
104
+ * @stability unstable
105
+ * @category constructors
106
+ * @since 4.1.0
107
+ */
108
+ export const makeEncodedStorage: (options?: {
109
+ readonly prefix?: string | undefined
110
+ }) => Effect.Effect<
111
+ MessageStorage.Encoded,
112
+ never,
113
+ SqlClient.SqlClient | Digest.Digest
114
+ > = Effect.fnUntraced(function*(
115
+ options?: {
84
116
  readonly prefix?: string | undefined
85
- } | undefined
117
+ }
86
118
  ) {
87
119
  const sql = (yield* SqlClient.SqlClient).withoutTransforms()
88
- const crypto = yield* Crypto.Crypto
120
+ const digest = yield* Digest.Digest
89
121
  const prefix = options?.prefix ?? "cluster"
90
122
  const table = (name: string) => `${prefix}_${name}`
91
123
 
@@ -108,10 +140,10 @@ const makeEncodedStorage = Effect.fnUntraced(function*(
108
140
  // birthday bound). Digests never contain "/" while composed keys always do,
109
141
  // so the two encodings cannot collide.
110
142
  const encoder = new TextEncoder()
111
- const messageIdForPrimaryKey = (primaryKey: string): Effect.Effect<string, PlatformError.PlatformError> =>
143
+ const messageIdForPrimaryKey = (primaryKey: string): Effect.Effect<string> =>
112
144
  primaryKey.length <= 255
113
145
  ? Effect.succeed(primaryKey)
114
- : Effect.map(crypto.digest("SHA-256", encoder.encode(primaryKey)), Hex.encode)
146
+ : digest.digestHex(Digest.sha256, encoder.encode(primaryKey))
115
147
 
116
148
  const messageIdEnforcesWidth = sql.onDialectOrElse({
117
149
  mssql: () => true,
@@ -525,7 +557,7 @@ const makeEncodedStorage = Effect.fnUntraced(function*(
525
557
  const encoded: MessageStorage.Encoded = {
526
558
  saveEnvelope: ({ deliverAt, envelope, primaryKey }) =>
527
559
  Effect.suspend(() => {
528
- let insert: Effect.Effect<ReadonlyArray<Row>, SqlError | PlatformError.PlatformError>
560
+ let insert: Effect.Effect<ReadonlyArray<Row>, SqlError>
529
561
  if (primaryKey !== null) {
530
562
  insert = Effect.flatMap(messageIdForPrimaryKey(primaryKey), (messageId) => {
531
563
  const row = envelopeToRow(envelope, messageId, deliverAt)
@@ -811,7 +843,7 @@ export const make: (options?: {
811
843
  }) => Effect.Effect<
812
844
  MessageStorage.MessageStorage["Service"],
813
845
  never,
814
- SqlClient.SqlClient | Snowflake.Generator | Crypto.Crypto
846
+ SqlClient.SqlClient | Snowflake.Generator | Digest.Digest
815
847
  > = (options) => Effect.flatMap(makeEncoded(options), MessageStorage.makeEncoded)
816
848
 
817
849
  /**
@@ -1165,7 +1197,7 @@ export const layerMigrations = (options: {
1165
1197
  */
1166
1198
  export const layerStorage = (options: {
1167
1199
  readonly prefix?: string | undefined
1168
- }): Layer.Layer<MessageStorage.MessageStorage, never, SqlClient.SqlClient | ShardingConfig | Crypto.Crypto> =>
1200
+ }): Layer.Layer<MessageStorage.MessageStorage, never, SqlClient.SqlClient | ShardingConfig | Digest.Digest> =>
1169
1201
  Layer.effect(
1170
1202
  MessageStorage.MessageStorage,
1171
1203
  Effect.flatMap(makeEncodedStorage(options), MessageStorage.makeEncoded)
@@ -1188,7 +1220,7 @@ export const layerStorage = (options: {
1188
1220
  */
1189
1221
  export const layerWith = (options: {
1190
1222
  readonly prefix?: string | undefined
1191
- }): Layer.Layer<MessageStorage.MessageStorage, never, SqlClient.SqlClient | ShardingConfig | Crypto.Crypto> =>
1223
+ }): Layer.Layer<MessageStorage.MessageStorage, never, SqlClient.SqlClient | ShardingConfig | Digest.Digest> =>
1192
1224
  layerStorage(options).pipe(
1193
1225
  Layer.provide(layerMigrations(options))
1194
1226
  )
@@ -1210,7 +1242,7 @@ export const layerWith = (options: {
1210
1242
  export const layer: Layer.Layer<
1211
1243
  MessageStorage.MessageStorage,
1212
1244
  never,
1213
- SqlClient.SqlClient | ShardingConfig | Crypto.Crypto
1245
+ SqlClient.SqlClient | ShardingConfig | Digest.Digest
1214
1246
  > = layerWith({})
1215
1247
 
1216
1248
  // -------------------------------------------------------------------------------------------------
@@ -38,6 +38,14 @@ import * as ShardingConfig from "./ShardingConfig.ts"
38
38
 
39
39
  const withTracerDisabled = Effect.withTracerEnabled(false)
40
40
 
41
+ // The session holding a storage's advisory locks, as reported to other
42
+ // sessions.
43
+ interface LockSession {
44
+ pid: number
45
+ // MySQL only: the lock that pins the session's lock connection
46
+ readonly pinLock: string | undefined
47
+ }
48
+
41
49
  // This exact FNV-1a hash, including its tag and UTF-8 encoding, is a persistent
42
50
  // advisory-lock wire format and must never change.
43
51
  const postgresLockNamespace = (prefix: string): number => {
@@ -69,6 +77,31 @@ const makeStorage = Effect.fnUntraced(function*(options: {
69
77
  // PostgreSQL exposes the signed int4 lock key through pg_locks as an unsigned oid.
70
78
  const pgLockNamespaceOid = pgLockNamespace >>> 0
71
79
 
80
+ // MySQL identifies a lock holder by connection id. Behind Vitess that is the
81
+ // id of vtgate's lock connection for the session, which vtgate replaces
82
+ // once the session releases all of its locks. A lock of the session's own
83
+ // pins that connection and reads its id.
84
+ const pinLockSession = Effect.fnUntraced(function*(conn: Connection, pinLock?: string) {
85
+ while (true) {
86
+ const name = pinLock ?? `cluster:pid:${(Math.random() * Number.MAX_SAFE_INTEGER) | 0}`
87
+ const taken = (yield* conn.executeValues(
88
+ `SELECT GET_LOCK('${name}', 10), IS_USED_LOCK('${name}')`,
89
+ []
90
+ ))[0] as [1 | null, number]
91
+ if (taken[0] === null) continue
92
+ return { pid: Number(taken[1]), pinLock: name }
93
+ }
94
+ })
95
+
96
+ // In milliseconds, capped to the largest value PostgreSQL accepts.
97
+ const idleSessionTimeout = Math.min(
98
+ Math.ceil(Duration.toMillis(Duration.fromInputUnsafe(config.shardLockExpiration))),
99
+ 2147483647
100
+ )
101
+ const shardLockExpirationSeconds = Math.ceil(Duration.toSeconds(config.shardLockExpiration))
102
+ // Between the smallest and largest values MySQL accepts.
103
+ const waitTimeout = Math.min(Math.max(1, shardLockExpirationSeconds), 31536000)
104
+
72
105
  // Keep all PostgreSQL and MySQL shard-lock operations on a rebuildable
73
106
  // reserved connection, including when advisory locks are disabled.
74
107
  const acquireLockConn = singleSession ? undefined : sql.onDialectOrElse({
@@ -77,46 +110,57 @@ const makeStorage = Effect.fnUntraced(function*(options: {
77
110
  const conn = yield* Effect.orDie(sql.reserve).pipe(
78
111
  Scope.provide(scope)
79
112
  )
80
- const pid = disableAdvisoryLocks
81
- ? 0
82
- : (yield* conn.executeValues("SELECT pg_backend_pid()", []))[0][0] as number
83
- if (!disableAdvisoryLocks) {
84
- yield* Scope.addFinalizerExit(scope, () =>
85
- conn.executeRaw("SELECT pg_advisory_unlock_all()", []).pipe(
86
- Effect.timeout(lockOperationInterval),
87
- Effect.interruptible,
88
- Effect.ignoreCause
89
- ))
90
- }
91
- return [conn, pid] as const
113
+ if (disableAdvisoryLocks) return [conn, { pid: 0, pinLock: undefined }] as const
114
+ // The connection returns to the shared pool, so restore the session's
115
+ // idle_session_timeout along with releasing its locks. Registered
116
+ // before the timeout is set, so a failed setup restores it too.
117
+ yield* Scope.addFinalizerExit(scope, () =>
118
+ conn.executeRaw(
119
+ "SELECT pg_advisory_unlock_all(), (SELECT set_config(name, reset_val, false) FROM pg_settings WHERE name = 'idle_session_timeout')",
120
+ []
121
+ ).pipe(
122
+ Effect.timeout(lockOperationInterval),
123
+ Effect.interruptible,
124
+ Effect.ignoreCause
125
+ ))
126
+ // Advisory locks belong to the session, so a frozen runner whose
127
+ // connection stays open would hold them indefinitely. End the session
128
+ // once it has been idle for shardLockExpiration, which releases them.
129
+ // Runners holding shards use it at least every shardLockExpiration / 3.
130
+ // Servers without idle_session_timeout (before PostgreSQL 14) keep the
131
+ // session open.
132
+ const pid = (yield* conn.executeValues(
133
+ `SELECT pg_backend_pid(), (SELECT set_config(name, '${idleSessionTimeout}', false) FROM pg_settings WHERE name = 'idle_session_timeout')`,
134
+ []
135
+ ))[0][0] as number
136
+ return [conn, { pid, pinLock: undefined }] as const
92
137
  }, Effect.orDie),
93
138
  mysql: () =>
94
139
  Effect.fnUntraced(function*(scope: Scope.Scope) {
95
140
  const conn = yield* Effect.orDie(sql.reserve).pipe(
96
141
  Scope.provide(scope)
97
142
  )
98
- if (disableAdvisoryLocks) return [conn, 0] as const
143
+ if (disableAdvisoryLocks) return [conn, { pid: 0, pinLock: undefined }] as const
144
+ // The connection goes back to the shared pool, so leave it as it was
145
+ // borrowed, even if setup fails below.
146
+ const borrowedWaitTimeout = Number((yield* conn.executeValues("SELECT @@SESSION.wait_timeout", []))[0][0])
147
+ yield* Scope.addFinalizerExit(scope, () =>
148
+ conn.executeRaw("SELECT RELEASE_ALL_LOCKS()", []).pipe(
149
+ Effect.andThen(conn.executeRaw(`SET SESSION wait_timeout = ${borrowedWaitTimeout}`, [])),
150
+ Effect.timeout(lockOperationInterval),
151
+ Effect.interruptible,
152
+ Effect.ignoreCause
153
+ ))
154
+ // Named locks belong to the connection, so a frozen runner whose
155
+ // connection stays open would hold them indefinitely. Have the server
156
+ // close the connection once it has been idle for shardLockExpiration,
157
+ // which releases them. vtgate accepts but ignores wait_timeout, so
158
+ // behind Vitess the locks stay held until the connection closes.
159
+ yield* conn.executeRaw(`SET SESSION wait_timeout = ${waitTimeout}`, [])
99
160
  // we need to get the connection id using IS_USED_LOCK to properly
100
161
  // support vitess
101
- let pid: number | undefined = undefined
102
- while (pid === undefined) {
103
- const address = `cluster:pid:${(Math.random() * Number.MAX_SAFE_INTEGER) | 0}`
104
- const taken = (yield* conn.executeValues(
105
- `SELECT GET_LOCK('${address}', 10), IS_USED_LOCK('${address}')`,
106
- []
107
- ))[0] as [1 | null, number]
108
- if (taken[0] === null) continue
109
- pid = taken[1]
110
- }
111
- if (!disableAdvisoryLocks) {
112
- yield* Scope.addFinalizerExit(scope, () =>
113
- conn.executeRaw("SELECT RELEASE_ALL_LOCKS()", []).pipe(
114
- Effect.timeout(lockOperationInterval),
115
- Effect.interruptible,
116
- Effect.ignoreCause
117
- ))
118
- }
119
- return [conn, pid] as const
162
+ const session: LockSession = yield* pinLockSession(conn)
163
+ return [conn, session] as const
120
164
  }, Effect.orDie),
121
165
  orElse: () => undefined
122
166
  })
@@ -140,7 +184,7 @@ const makeStorage = Effect.fnUntraced(function*(options: {
140
184
  )
141
185
  })
142
186
 
143
- const rebuildLockConn = (from?: readonly [Connection, number]) => {
187
+ const rebuildLockConn = (from?: readonly [Connection, LockSession]) => {
144
188
  const rebuild = lockConn?.rebuildUnsafe({ from })
145
189
  if (!rebuild) return Effect.void
146
190
  // Bound release so a stalled connection cannot block subsequent rebuilds.
@@ -152,13 +196,13 @@ const makeStorage = Effect.fnUntraced(function*(options: {
152
196
  }
153
197
  // SQL failures replace the held connection; deadlines are handled by withLockOperationDeadline.
154
198
  const useLockConn = <A, E, R>(
155
- f: (conn: Connection, pid: number) => Effect.Effect<A, E, R>
199
+ f: (conn: Connection, pid: number, session: LockSession) => Effect.Effect<A, E, R>
156
200
  ): Effect.Effect<A, E, R> =>
157
201
  Effect.flatMap(
158
202
  lockConn!.await,
159
203
  (held) =>
160
204
  Effect.onError(
161
- f(held[0], held[1]),
205
+ f(held[0], held[1].pid, held[1]),
162
206
  (cause) => Cause.hasInterruptsOnly(cause) ? Effect.void : rebuildLockConn(held)
163
207
  )
164
208
  )
@@ -181,11 +225,7 @@ const makeStorage = Effect.fnUntraced(function*(options: {
181
225
  // avoid deadlocks between acquisition, refresh and bulk release.
182
226
  const pgLockOrder = sql.literal(`ORDER BY shard_id COLLATE "C"`)
183
227
 
184
- const expiresSeconds = sql.literal(
185
- Math.ceil(Duration.toSeconds(
186
- Duration.fromInputUnsafe(config.shardLockExpiration)
187
- )).toString()
188
- )
228
+ const expiresSeconds = sql.literal(shardLockExpirationSeconds.toString())
189
229
  const lockExpiresAt = sql.onDialectOrElse({
190
230
  pg: () => sql`${sqlNow} - INTERVAL '${expiresSeconds} seconds'`,
191
231
  mysql: () => sql`DATE_SUB(${sqlNow}, INTERVAL ${expiresSeconds} SECOND)`,
@@ -270,6 +310,40 @@ const makeStorage = Effect.fnUntraced(function*(options: {
270
310
  return useLockConn((conn) => conn.executeValues(query, params))
271
311
  }
272
312
 
313
+ // Splits shardIds into the advisory locks held by the lock session and the rest.
314
+ const pgHeldLocks = Effect.fnUntraced(function*(conn: Connection, pid: number, shardIds: ReadonlyArray<string>) {
315
+ const held: Array<string> = []
316
+ const notHeld = new Map(shardIds.map((shardId) => [lockNumbers.get(shardId)!, shardId]))
317
+ const takenLocks = yield* conn.executeValues(
318
+ `SELECT objid FROM pg_locks WHERE locktype = 'advisory' AND granted = true AND classid = ${pgLockNamespaceOid} AND objsubid = 2 AND pid = ${pid} ORDER BY objid`,
319
+ []
320
+ )
321
+ for (let i = 0; i < takenLocks.length; i++) {
322
+ const lockNum = takenLocks[i][0] as number
323
+ const shardId = notHeld.get(lockNum)
324
+ if (shardId === undefined) continue
325
+ held.push(shardId)
326
+ notHeld.delete(lockNum)
327
+ }
328
+ return [held, notHeld] as const
329
+ })
330
+
331
+ const mysqlHeldLocks = Effect.fnUntraced(function*(conn: Connection, pid: number, shardIds: ReadonlyArray<string>) {
332
+ const takenLocks = (yield* conn.executeValues(`SELECT ${allMySqlTakenLocks}`, []))[0] as Array<number | null>
333
+ const held: Array<string> = []
334
+ const notHeld: Array<string> = []
335
+ for (let i = 0; i < shardIds.length; i++) {
336
+ const shardId = shardIds[i]
337
+ const lockTakenBy = takenLocks[shardIdsIndex.get(shardId)!]
338
+ if (lockTakenBy !== null && Number(lockTakenBy) === pid) {
339
+ held.push(shardId)
340
+ } else {
341
+ notHeld.push(shardId)
342
+ }
343
+ }
344
+ return [held, notHeld] as const
345
+ })
346
+
273
347
  const acquireLock = sql.onDialectOrElse({
274
348
  pg: () => {
275
349
  if (disableAdvisoryLocks) {
@@ -293,19 +367,7 @@ const makeStorage = Effect.fnUntraced(function*(options: {
293
367
  }
294
368
  return (_address: string, shardIds: ReadonlyArray<string>) =>
295
369
  useLockConn(Effect.fnUntraced(function*(conn, pid) {
296
- const acquiredShardIds: Array<string> = []
297
- const toAcquire = new Map(shardIds.map((shardId) => [lockNumbers.get(shardId)!, shardId]))
298
- const takenLocks = yield* conn.executeValues(
299
- `SELECT objid FROM pg_locks WHERE locktype = 'advisory' AND granted = true AND classid = ${pgLockNamespaceOid} AND objsubid = 2 AND pid = ${pid} ORDER BY objid`,
300
- []
301
- )
302
- for (let i = 0; i < takenLocks.length; i++) {
303
- const lockNum = takenLocks[i][0] as number
304
- const shardId = toAcquire.get(lockNum)
305
- if (shardId === undefined) continue
306
- acquiredShardIds.push(shardId)
307
- toAcquire.delete(lockNum)
308
- }
370
+ const [acquiredShardIds, toAcquire] = yield* pgHeldLocks(conn, pid, shardIds)
309
371
  if (toAcquire.size === 0) {
310
372
  return acquiredShardIds
311
373
  }
@@ -339,18 +401,7 @@ const makeStorage = Effect.fnUntraced(function*(options: {
339
401
  }
340
402
  return (_address: string, shardIds: ReadonlyArray<string>) =>
341
403
  useLockConn(Effect.fnUntraced(function*(conn, pid) {
342
- const takenLocks = (yield* conn.executeValues(`SELECT ${allMySqlTakenLocks}`, []))[0] as Array<number | null>
343
- const acquiredShardIds: Array<string> = []
344
- const toAcquire: Array<string> = []
345
- for (let i = 0; i < shardIds.length; i++) {
346
- const shardId = shardIds[i]
347
- const lockTakenBy = takenLocks[shardIdsIndex.get(shardId)!]
348
- if (lockTakenBy === pid) {
349
- acquiredShardIds.push(shardId)
350
- } else if (shardIds.includes(shardId)) {
351
- toAcquire.push(shardId)
352
- }
353
- }
404
+ const [acquiredShardIds, toAcquire] = yield* mysqlHeldLocks(conn, pid, shardIds)
354
405
  if (toAcquire.length === 0) {
355
406
  return acquiredShardIds
356
407
  }
@@ -463,9 +514,15 @@ const makeStorage = Effect.fnUntraced(function*(options: {
463
514
  const stringLiteral = (s: string) => sql.literal(wrapString(s))
464
515
  const stringLiteralArr = (arr: ReadonlyArray<string>) => sql.literal(`(${arr.map(wrapString).join(",")})`)
465
516
 
517
+ // An advisory lock refresh only confirms the locks the current lock session
518
+ // holds. A replaced session has lost its predecessor's locks, possibly to
519
+ // another runner in between, so reacquiring them here would hide the loss.
466
520
  const refreshShards = sql.onDialectOrElse({
467
521
  pg: () => {
468
- if (!disableAdvisoryLocks) return acquireLock
522
+ if (!disableAdvisoryLocks) {
523
+ return (_address: string, shardIds: ReadonlyArray<string>) =>
524
+ useLockConn((conn, pid) => Effect.map(pgHeldLocks(conn, pid, shardIds), ([held]) => held))
525
+ }
469
526
  return (address: string, shardIds: ReadonlyArray<string>) =>
470
527
  sql`
471
528
  WITH locked AS (
@@ -483,7 +540,10 @@ const makeStorage = Effect.fnUntraced(function*(options: {
483
540
  )
484
541
  },
485
542
  mysql: () => {
486
- if (!disableAdvisoryLocks) return acquireLock
543
+ if (!disableAdvisoryLocks) {
544
+ return (_address: string, shardIds: ReadonlyArray<string>) =>
545
+ useLockConn((conn, pid) => Effect.map(mysqlHeldLocks(conn, pid, shardIds), ([held]) => held))
546
+ }
487
547
  return (address: string, shardIds: ReadonlyArray<string>) => {
488
548
  const shardIdsStr = stringLiteralArr(shardIds)
489
549
  return sql<Array<{ shard_id: string }>>`
@@ -558,7 +618,7 @@ const makeStorage = Effect.fnUntraced(function*(options: {
558
618
  `SELECT IS_USED_LOCK('${lockName}')`,
559
619
  []
560
620
  )
561
- if (takenLocks.length === 0 || takenLocks[0][0] !== pid) return
621
+ if (takenLocks.length === 0 || Number(takenLocks[0][0]) !== pid) return
562
622
  }
563
623
  }))
564
624
  },
@@ -579,7 +639,12 @@ const makeStorage = Effect.fnUntraced(function*(options: {
579
639
  mysql: () => (address: string) =>
580
640
  disableAdvisoryLocks
581
641
  ? sql`DELETE FROM ${locksTableSql} WHERE address = ${address}`.pipe(execWithLockConn)
582
- : sql`SELECT RELEASE_ALL_LOCKS()`.pipe(execWithLockConn, Effect.asVoid),
642
+ : useLockConn(Effect.fnUntraced(function*(conn, _pid, session) {
643
+ yield* conn.executeRaw("SELECT RELEASE_ALL_LOCKS()", [])
644
+ // Releasing every lock also releases the pin, so take it again.
645
+ const pinned = yield* pinLockSession(conn, session.pinLock)
646
+ session.pid = pinned.pid
647
+ })),
583
648
  orElse: () => (address: string) => sql`DELETE FROM ${locksTableSql} WHERE address = ${address}`
584
649
  })
585
650
 
@@ -612,8 +677,16 @@ const makeStorage = Effect.fnUntraced(function*(options: {
612
677
  withTracerDisabled
613
678
  ),
614
679
 
680
+ // A runner without shards leaves its lock connection idle, so the server
681
+ // may have ended the session, and the first operation on it fails and
682
+ // replaces it. Acquiring does not depend on the previous session, so retry
683
+ // once on the replacement.
615
684
  acquire: (address, shardIds) =>
616
- withLockOperationDeadline(acquireLock(address, shardIds)).pipe(
685
+ withLockOperationDeadline(
686
+ lockConn
687
+ ? Effect.catch(acquireLock(address, shardIds), () => acquireLock(address, shardIds))
688
+ : acquireLock(address, shardIds)
689
+ ).pipe(
617
690
  PersistenceError.refail,
618
691
  withTracerDisabled
619
692
  ),
@@ -20,6 +20,7 @@ import * as Schedule from "../../Schedule.ts"
20
20
  import * as Schema from "../../Schema.ts"
21
21
  import * as SchemaIssue from "../../SchemaIssue.ts"
22
22
  import * as Scope from "../../Scope.ts"
23
+ import type { PersistenceError } from "../ClusterError.ts"
23
24
  import { AlreadyProcessingMessage, EntityNotAssignedToRunner, MailboxFull, MalformedMessage } from "../ClusterError.ts"
24
25
  import * as ClusterMetrics from "../ClusterMetrics.ts"
25
26
  import { isUninterruptibleForServer, Persisted, WithTransaction } from "../ClusterSchema.ts"
@@ -37,6 +38,7 @@ import type { ShardId } from "../ShardId.ts"
37
38
  import type { Sharding } from "../Sharding.ts"
38
39
  import { ShardingConfig } from "../ShardingConfig.ts"
39
40
  import * as Snowflake from "../Snowflake.ts"
41
+ import * as ClusterAbandon from "./clusterAbandon.ts"
40
42
  import { CurrentActivationScope } from "./entityActivation.ts"
41
43
  import { EntityReaper } from "./entityReaper.ts"
42
44
  import { acquireEntity, releaseEntity } from "./interruptors.ts"
@@ -144,6 +146,19 @@ export const make = Effect.fnUntraced(function*<
144
146
  readonly disableFatalDefects?: boolean | undefined
145
147
  readonly defectRetryPolicy?: Schedule.Schedule<any, unknown, never, never> | undefined
146
148
  readonly spanAttributes?: Record<string, string> | undefined
149
+ /**
150
+ * Called once a retiring entity stops accepting requests, so callers
151
+ * waiting on requests it has not started can be released.
152
+ */
153
+ readonly abandonUndelivered: (
154
+ address: EntityAddress,
155
+ isDelivered: (requestId: Snowflake.Snowflake) => boolean
156
+ ) => Effect.Effect<void>
157
+ /**
158
+ * Whether this runner still owns the shard, checked before storing the
159
+ * final reply of a persisted request.
160
+ */
161
+ readonly isShardOwned: (shardId: ShardId) => Effect.Effect<boolean>
147
162
  }
148
163
  ) {
149
164
  const config = yield* ShardingConfig
@@ -248,6 +263,14 @@ export const make = Effect.fnUntraced(function*<
248
263
  // Finalizers run in reverse, so the mailbox series and the resident
249
264
  // mailbox are removed only after the drain finalizer below has finished.
250
265
  const activeRequests: EntityState["activeRequests"] = new Map()
266
+ // Drops a request that has left this entity, starting the idle timer when
267
+ // it was the last one.
268
+ const removeActiveRequest = (requestId: Snowflake.Snowflake) => {
269
+ activeRequests.delete(requestId)
270
+ if (activeRequests.size === 0) {
271
+ state.lastActiveCheck = clock.currentTimeMillisUnsafe()
272
+ }
273
+ }
251
274
  let mailboxSeries: Metric.Registration | undefined
252
275
  yield* Scope.addFinalizer(
253
276
  scope,
@@ -326,27 +349,27 @@ export const make = Effect.fnUntraced(function*<
326
349
  return Effect.void
327
350
  }
328
351
 
329
- // For durable messages, ignore interrupts during shutdown.
330
- // They will be retried when the entity is restarted.
331
- // Also, if the request is uninterruptible, we ignore the
332
- // interrupt.
333
352
  const persisted = storageEnabled && Context.get(request.message.annotations, Persisted)
334
- if (
335
- persisted &&
336
- Exit.hasInterrupts(response.exit) &&
337
- (isShuttingDown || request.terminating || isUninterruptibleForServer(request.message.annotations))
338
- ) {
339
- if (!isShuttingDown && !request.terminating) {
353
+ if (persisted && Exit.isFailure(response.exit) && Cause.hasInterrupts(response.exit.cause)) {
354
+ // A durable request interrupted by shutdown, or abandoned
355
+ // because this owner can no longer serve it, is left for
356
+ // replay instead of being answered.
357
+ const abandoned = ClusterAbandon.isCause(response.exit.cause) &&
358
+ (!isActive() || !options.sharding.hasShardId(address.shardId))
359
+ if (isShuttingDown || request.terminating || abandoned) {
360
+ removeActiveRequest(Snowflake.Snowflake(response.requestId))
361
+ return options.storage.unregisterReplyHandler(request.message.envelope.requestId)
362
+ }
363
+ // An uninterruptible request ignores the interrupt and runs again.
364
+ if (isUninterruptibleForServer(request.message.annotations)) {
340
365
  request.sentExit = false
341
366
  return server.write(0, requestEnvelope(request), requestWriteOptions(request)).pipe(
342
367
  Effect.setContext(handlerContext),
343
368
  Effect.forkIn(handlerScope)
344
369
  )
345
370
  }
346
- activeRequests.delete(Snowflake.Snowflake(response.requestId))
347
- return options.storage.unregisterReplyHandler(request.message.envelope.requestId)
348
371
  }
349
- const save = retryRespond(
372
+ const write = retryRespond(
350
373
  4,
351
374
  Effect.suspend(() =>
352
375
  request.message.respond(
@@ -358,18 +381,36 @@ export const make = Effect.fnUntraced(function*<
358
381
  )
359
382
  )
360
383
  )
384
+ // A runner that lost the shard must not decide the stored
385
+ // result. A rejection is not retried.
386
+ let fenced = false
387
+ const save = !persisted ? write : Effect.flatMap(
388
+ options.isShardOwned(address.shardId),
389
+ (owned): Effect.Effect<void, MalformedMessage | PersistenceError | EntityNotAssignedToRunner> => {
390
+ if (owned) return write
391
+ fenced = true
392
+ return Effect.fail(new EntityNotAssignedToRunner({ address }))
393
+ }
394
+ )
395
+ // Leave the request for the shard's owner: release the claim
396
+ // so its next poll sees it, and let local callers re-route.
397
+ const abandonFenced = Effect.suspend(() => {
398
+ removeActiveRequest(Snowflake.Snowflake(response.requestId))
399
+ return Effect.logDebug("Abandoning a request whose shard this runner no longer owns").pipe(
400
+ Effect.andThen(options.storage.unregisterReplyHandler(request.message.envelope.requestId)),
401
+ Effect.andThen(Effect.ignore(options.storage.resetRequests([request.message.envelope.requestId])))
402
+ )
403
+ })
361
404
  const complete = Effect.sync(() => {
362
405
  if (storageEnabled) {
363
406
  processedRequestIds.add(request.message.envelope.requestId)
364
407
  }
365
- activeRequests.delete(Snowflake.Snowflake(response.requestId))
366
-
367
- // Start the idle timer when the last request completes.
368
- if (activeRequests.size === 0) {
369
- state.lastActiveCheck = clock.currentTimeMillisUnsafe()
370
- }
408
+ removeActiveRequest(Snowflake.Snowflake(response.requestId))
371
409
  })
372
- const respond = Effect.orDie(Effect.andThen(save, complete))
410
+ const respond = Effect.andThen(save, complete).pipe(
411
+ Effect.catchTag("EntityNotAssignedToRunner", () => abandonFenced),
412
+ Effect.orDie
413
+ )
373
414
  const transaction = request.transaction
374
415
  if (!transaction) return respond
375
416
  const exit = response.exit
@@ -381,8 +422,12 @@ export const make = Effect.fnUntraced(function*<
381
422
  }
382
423
 
383
424
  if (Exit.isSuccess(exit)) {
384
- transaction.settle = (outcome) =>
385
- Exit.isSuccess(outcome) ? complete : Effect.flatMap(
425
+ transaction.settle = (outcome) => {
426
+ if (Exit.isSuccess(outcome)) return complete
427
+ // A rejected save failed the transaction, rolling back the
428
+ // handler's writes; the request is left for the owner.
429
+ if (fenced) return abandonFenced
430
+ return Effect.flatMap(
386
431
  hasStoredExit(request.message.envelope.requestId),
387
432
  (committed) => {
388
433
  if (!committed) return restartFrom(outcome.cause)
@@ -393,6 +438,7 @@ export const make = Effect.fnUntraced(function*<
393
438
  )
394
439
  }
395
440
  )
441
+ }
396
442
  return Effect.orDie(save)
397
443
  }
398
444
  transaction.settle = (outcome) =>
@@ -539,6 +585,13 @@ export const make = Effect.fnUntraced(function*<
539
585
  request.terminating = true
540
586
  yield* state.write(0, { _tag: "Interrupt", requestId: requestId as any, interruptors: [] })
541
587
  }
588
+ // A handler this drain waits for may be parked on a request the
589
+ // retired entity will never start, such as its own queued request.
590
+ // Release callers before `Eof`, which waits for handler acquisition.
591
+ yield* options.abandonUndelivered(
592
+ address,
593
+ (requestId) => activeRequests.get(requestId)?.delivered === true
594
+ )
542
595
  yield* state.write(0, { _tag: "Eof" })
543
596
  }).pipe(
544
597
  Effect.andThen(endLatch.await),