effect 4.0.7 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (679) hide show
  1. package/README.md +1 -1
  2. package/dist/BigDecimal.d.ts.map +1 -1
  3. package/dist/BigDecimal.js +3 -0
  4. package/dist/BigDecimal.js.map +1 -1
  5. package/dist/Channel.d.ts +12 -6
  6. package/dist/Channel.d.ts.map +1 -1
  7. package/dist/Channel.js +9 -3
  8. package/dist/Channel.js.map +1 -1
  9. package/dist/Config.d.ts +7 -1
  10. package/dist/Config.d.ts.map +1 -1
  11. package/dist/Config.js.map +1 -1
  12. package/dist/Context.d.ts +18 -1
  13. package/dist/Context.d.ts.map +1 -1
  14. package/dist/Context.js +27 -8
  15. package/dist/Context.js.map +1 -1
  16. package/dist/Cron.d.ts +81 -11
  17. package/dist/Cron.d.ts.map +1 -1
  18. package/dist/Cron.js +101 -26
  19. package/dist/Cron.js.map +1 -1
  20. package/dist/Duration.d.ts +78 -0
  21. package/dist/Duration.d.ts.map +1 -1
  22. package/dist/Duration.js +123 -0
  23. package/dist/Duration.js.map +1 -1
  24. package/dist/Effect.d.ts +164 -7
  25. package/dist/Effect.d.ts.map +1 -1
  26. package/dist/Effect.js +11 -1
  27. package/dist/Effect.js.map +1 -1
  28. package/dist/FileSystem.d.ts +59 -4
  29. package/dist/FileSystem.d.ts.map +1 -1
  30. package/dist/FileSystem.js +9 -2
  31. package/dist/FileSystem.js.map +1 -1
  32. package/dist/Glob.d.ts +165 -0
  33. package/dist/Glob.d.ts.map +1 -0
  34. package/dist/Glob.js +127 -0
  35. package/dist/Glob.js.map +1 -0
  36. package/dist/Match.d.ts +86 -0
  37. package/dist/Match.d.ts.map +1 -1
  38. package/dist/Match.js +72 -0
  39. package/dist/Match.js.map +1 -1
  40. package/dist/Pool.d.ts +51 -0
  41. package/dist/Pool.d.ts.map +1 -1
  42. package/dist/Pool.js +59 -9
  43. package/dist/Pool.js.map +1 -1
  44. package/dist/Random.d.ts.map +1 -1
  45. package/dist/Random.js +3 -3
  46. package/dist/Random.js.map +1 -1
  47. package/dist/RcMap.d.ts.map +1 -1
  48. package/dist/RcMap.js +8 -2
  49. package/dist/RcMap.js.map +1 -1
  50. package/dist/Schedule.d.ts +18 -1
  51. package/dist/Schedule.d.ts.map +1 -1
  52. package/dist/Schedule.js +7 -2
  53. package/dist/Schedule.js.map +1 -1
  54. package/dist/Schema.d.ts +666 -41
  55. package/dist/Schema.d.ts.map +1 -1
  56. package/dist/Schema.js +650 -0
  57. package/dist/Schema.js.map +1 -1
  58. package/dist/SchemaGetter.d.ts +6 -1
  59. package/dist/SchemaGetter.d.ts.map +1 -1
  60. package/dist/SchemaGetter.js +22 -11
  61. package/dist/SchemaGetter.js.map +1 -1
  62. package/dist/SchemaRepresentation.d.ts +14 -0
  63. package/dist/SchemaRepresentation.d.ts.map +1 -1
  64. package/dist/SchemaRepresentation.js +16 -0
  65. package/dist/SchemaRepresentation.js.map +1 -1
  66. package/dist/SchemaTransformation.d.ts +8 -3
  67. package/dist/SchemaTransformation.d.ts.map +1 -1
  68. package/dist/SchemaTransformation.js +6 -3
  69. package/dist/SchemaTransformation.js.map +1 -1
  70. package/dist/ScopedCache.d.ts.map +1 -1
  71. package/dist/ScopedCache.js +5 -7
  72. package/dist/ScopedCache.js.map +1 -1
  73. package/dist/Semaphore.d.ts +130 -0
  74. package/dist/Semaphore.d.ts.map +1 -1
  75. package/dist/Semaphore.js +40 -0
  76. package/dist/Semaphore.js.map +1 -1
  77. package/dist/Stream.d.ts +13 -4
  78. package/dist/Stream.d.ts.map +1 -1
  79. package/dist/Stream.js +9 -0
  80. package/dist/Stream.js.map +1 -1
  81. package/dist/Terminal.d.ts +18 -1
  82. package/dist/Terminal.d.ts.map +1 -1
  83. package/dist/Terminal.js +1 -1
  84. package/dist/Terminal.js.map +1 -1
  85. package/dist/ai/AiError.d.ts +43 -116
  86. package/dist/ai/AiError.d.ts.map +1 -1
  87. package/dist/ai/AiError.js +53 -72
  88. package/dist/ai/AiError.js.map +1 -1
  89. package/dist/ai/Decision.d.ts +196 -15
  90. package/dist/ai/Decision.d.ts.map +1 -1
  91. package/dist/ai/Decision.js +130 -0
  92. package/dist/ai/Decision.js.map +1 -1
  93. package/dist/ai/DecisionModel.d.ts +54 -13
  94. package/dist/ai/DecisionModel.d.ts.map +1 -1
  95. package/dist/ai/DecisionModel.js +123 -12
  96. package/dist/ai/DecisionModel.js.map +1 -1
  97. package/dist/ai/McpServer.d.ts +630 -29
  98. package/dist/ai/McpServer.d.ts.map +1 -1
  99. package/dist/ai/McpServer.js +562 -116
  100. package/dist/ai/McpServer.js.map +1 -1
  101. package/dist/ai/McpTest.d.ts +130 -0
  102. package/dist/ai/McpTest.d.ts.map +1 -0
  103. package/dist/ai/McpTest.js +237 -0
  104. package/dist/ai/McpTest.js.map +1 -0
  105. package/dist/ai/Response.d.ts +1 -25
  106. package/dist/ai/Response.d.ts.map +1 -1
  107. package/dist/ai/Response.js +1 -10
  108. package/dist/ai/Response.js.map +1 -1
  109. package/dist/ai/Tool.d.ts +19 -1
  110. package/dist/ai/Tool.d.ts.map +1 -1
  111. package/dist/ai/Tool.js.map +1 -1
  112. package/dist/ai/index.d.ts +5 -0
  113. package/dist/ai/index.d.ts.map +1 -1
  114. package/dist/ai/index.js +5 -0
  115. package/dist/ai/index.js.map +1 -1
  116. package/dist/ai/internal/mcpCore.js +17 -12
  117. package/dist/ai/internal/mcpCore.js.map +1 -1
  118. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +4 -5
  119. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  120. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +4 -5
  121. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  122. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +4 -5
  123. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  124. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +4 -5
  125. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  126. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +18 -10
  127. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  128. package/dist/ai/internal/mcpProtocol.js +13 -0
  129. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  130. package/dist/ai/internal/mcpRuntime.js +5 -3
  131. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  132. package/dist/ai/internal/mcpStatefulRuntime.js +6 -1
  133. package/dist/ai/internal/mcpStatefulRuntime.js.map +1 -1
  134. package/dist/cli/Argument.d.ts +6 -0
  135. package/dist/cli/Argument.d.ts.map +1 -1
  136. package/dist/cli/Argument.js +2 -0
  137. package/dist/cli/Argument.js.map +1 -1
  138. package/dist/cli/CliOutput.d.ts +65 -1
  139. package/dist/cli/CliOutput.d.ts.map +1 -1
  140. package/dist/cli/CliOutput.js +94 -37
  141. package/dist/cli/CliOutput.js.map +1 -1
  142. package/dist/cli/Command.d.ts +23 -0
  143. package/dist/cli/Command.d.ts.map +1 -1
  144. package/dist/cli/Command.js +8 -0
  145. package/dist/cli/Command.js.map +1 -1
  146. package/dist/cli/Flag.d.ts +107 -0
  147. package/dist/cli/Flag.d.ts.map +1 -1
  148. package/dist/cli/Flag.js +37 -0
  149. package/dist/cli/Flag.js.map +1 -1
  150. package/dist/cli/HelpDoc.d.ts +15 -1
  151. package/dist/cli/HelpDoc.d.ts.map +1 -1
  152. package/dist/cli/Param.d.ts +6 -0
  153. package/dist/cli/Param.d.ts.map +1 -1
  154. package/dist/cli/Param.js +2 -0
  155. package/dist/cli/Param.js.map +1 -1
  156. package/dist/cli/Primitive.d.ts +14 -0
  157. package/dist/cli/Primitive.d.ts.map +1 -1
  158. package/dist/cli/Primitive.js +15 -1
  159. package/dist/cli/Primitive.js.map +1 -1
  160. package/dist/cli/Prompt.d.ts +1 -0
  161. package/dist/cli/Prompt.d.ts.map +1 -1
  162. package/dist/cli/Prompt.js +1 -0
  163. package/dist/cli/Prompt.js.map +1 -1
  164. package/dist/cli/internal/help.d.ts.map +1 -1
  165. package/dist/cli/internal/help.js +17 -10
  166. package/dist/cli/internal/help.js.map +1 -1
  167. package/dist/cluster/Sharding.d.ts.map +1 -1
  168. package/dist/cluster/Sharding.js +90 -28
  169. package/dist/cluster/Sharding.js.map +1 -1
  170. package/dist/cluster/ShardingConfig.d.ts +72 -6
  171. package/dist/cluster/ShardingConfig.d.ts.map +1 -1
  172. package/dist/cluster/ShardingConfig.js +4 -0
  173. package/dist/cluster/ShardingConfig.js.map +1 -1
  174. package/dist/cluster/SingleRunner.d.ts +3 -3
  175. package/dist/cluster/SingleRunner.d.ts.map +1 -1
  176. package/dist/cluster/SingleRunner.js +1 -1
  177. package/dist/cluster/SqlMessageStorage.d.ts +37 -6
  178. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  179. package/dist/cluster/SqlMessageStorage.js +34 -7
  180. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  181. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  182. package/dist/cluster/SqlRunnerStorage.js +23 -8
  183. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  184. package/dist/crypto/Aead.d.ts +322 -0
  185. package/dist/crypto/Aead.d.ts.map +1 -0
  186. package/dist/crypto/Aead.js +331 -0
  187. package/dist/crypto/Aead.js.map +1 -0
  188. package/dist/crypto/Cipher.d.ts +235 -0
  189. package/dist/crypto/Cipher.d.ts.map +1 -0
  190. package/dist/crypto/Cipher.js +233 -0
  191. package/dist/crypto/Cipher.js.map +1 -0
  192. package/dist/crypto/CryptoError.d.ts +212 -0
  193. package/dist/crypto/CryptoError.d.ts.map +1 -0
  194. package/dist/crypto/CryptoError.js +202 -0
  195. package/dist/crypto/CryptoError.js.map +1 -0
  196. package/dist/crypto/Digest.d.ts +143 -0
  197. package/dist/crypto/Digest.d.ts.map +1 -0
  198. package/dist/crypto/Digest.js +146 -0
  199. package/dist/crypto/Digest.js.map +1 -0
  200. package/dist/crypto/Kdf.d.ts +220 -0
  201. package/dist/crypto/Kdf.d.ts.map +1 -0
  202. package/dist/crypto/Kdf.js +212 -0
  203. package/dist/crypto/Kdf.js.map +1 -0
  204. package/dist/crypto/KeyAgreement.d.ts +323 -0
  205. package/dist/crypto/KeyAgreement.d.ts.map +1 -0
  206. package/dist/crypto/KeyAgreement.js +303 -0
  207. package/dist/crypto/KeyAgreement.js.map +1 -0
  208. package/dist/crypto/KeyFormat.d.ts +309 -0
  209. package/dist/crypto/KeyFormat.d.ts.map +1 -0
  210. package/dist/crypto/KeyFormat.js +556 -0
  211. package/dist/crypto/KeyFormat.js.map +1 -0
  212. package/dist/crypto/KeyWrap.d.ts +389 -0
  213. package/dist/crypto/KeyWrap.d.ts.map +1 -0
  214. package/dist/crypto/KeyWrap.js +381 -0
  215. package/dist/crypto/KeyWrap.js.map +1 -0
  216. package/dist/crypto/Mac.d.ts +277 -0
  217. package/dist/crypto/Mac.d.ts.map +1 -0
  218. package/dist/crypto/Mac.js +288 -0
  219. package/dist/crypto/Mac.js.map +1 -0
  220. package/dist/crypto/SecureRandom.d.ts +340 -0
  221. package/dist/crypto/SecureRandom.d.ts.map +1 -0
  222. package/dist/crypto/SecureRandom.js +257 -0
  223. package/dist/crypto/SecureRandom.js.map +1 -0
  224. package/dist/crypto/Signature.d.ts +448 -0
  225. package/dist/crypto/Signature.d.ts.map +1 -0
  226. package/dist/crypto/Signature.js +484 -0
  227. package/dist/crypto/Signature.js.map +1 -0
  228. package/dist/crypto/WebCrypto.d.ts +61 -0
  229. package/dist/crypto/WebCrypto.d.ts.map +1 -0
  230. package/dist/crypto/WebCrypto.js +63 -0
  231. package/dist/crypto/WebCrypto.js.map +1 -0
  232. package/dist/crypto/index.d.ts +65 -0
  233. package/dist/crypto/index.d.ts.map +1 -0
  234. package/dist/crypto/index.js +66 -0
  235. package/dist/crypto/index.js.map +1 -0
  236. package/dist/crypto/internal/asymmetric.d.ts +2 -0
  237. package/dist/crypto/internal/asymmetric.d.ts.map +1 -0
  238. package/dist/crypto/internal/asymmetric.js +210 -0
  239. package/dist/crypto/internal/asymmetric.js.map +1 -0
  240. package/dist/crypto/internal/chacha.d.ts +46 -0
  241. package/dist/crypto/internal/chacha.d.ts.map +1 -0
  242. package/dist/crypto/internal/chacha.js +885 -0
  243. package/dist/crypto/internal/chacha.js.map +1 -0
  244. package/dist/crypto/internal/der.d.ts +6 -0
  245. package/dist/crypto/internal/der.d.ts.map +1 -0
  246. package/dist/crypto/internal/der.js +86 -0
  247. package/dist/crypto/internal/der.js.map +1 -0
  248. package/dist/crypto/internal/digest.d.ts +2 -0
  249. package/dist/crypto/internal/digest.d.ts.map +1 -0
  250. package/dist/crypto/internal/digest.js +15 -0
  251. package/dist/crypto/internal/digest.js.map +1 -0
  252. package/dist/crypto/internal/key.d.ts +2 -0
  253. package/dist/crypto/internal/key.d.ts.map +1 -0
  254. package/dist/crypto/internal/key.js +170 -0
  255. package/dist/crypto/internal/key.js.map +1 -0
  256. package/dist/crypto/internal/md5.d.ts +39 -0
  257. package/dist/crypto/internal/md5.d.ts.map +1 -0
  258. package/dist/crypto/internal/md5.js +179 -0
  259. package/dist/crypto/internal/md5.js.map +1 -0
  260. package/dist/crypto/internal/webCrypto.d.ts +2 -0
  261. package/dist/crypto/internal/webCrypto.d.ts.map +1 -0
  262. package/dist/crypto/internal/webCrypto.js +111 -0
  263. package/dist/crypto/internal/webCrypto.js.map +1 -0
  264. package/dist/encoding/Base64Url.d.ts.map +1 -1
  265. package/dist/encoding/Base64Url.js +3 -2
  266. package/dist/encoding/Base64Url.js.map +1 -1
  267. package/dist/encoding/Csv.d.ts +608 -0
  268. package/dist/encoding/Csv.d.ts.map +1 -0
  269. package/dist/encoding/Csv.js +718 -0
  270. package/dist/encoding/Csv.js.map +1 -0
  271. package/dist/encoding/Hex.d.ts +3 -2
  272. package/dist/encoding/Hex.d.ts.map +1 -1
  273. package/dist/encoding/Hex.js +3 -2
  274. package/dist/encoding/Hex.js.map +1 -1
  275. package/dist/encoding/SchemaBinary.d.ts.map +1 -1
  276. package/dist/encoding/SchemaBinary.js +42 -4
  277. package/dist/encoding/SchemaBinary.js.map +1 -1
  278. package/dist/encoding/Toml.d.ts +17 -3
  279. package/dist/encoding/Toml.d.ts.map +1 -1
  280. package/dist/encoding/Toml.js +104 -16
  281. package/dist/encoding/Toml.js.map +1 -1
  282. package/dist/encoding/Yaml.d.ts +8 -1
  283. package/dist/encoding/Yaml.d.ts.map +1 -1
  284. package/dist/encoding/Yaml.js +54 -18
  285. package/dist/encoding/Yaml.js.map +1 -1
  286. package/dist/encoding/index.d.ts +5 -0
  287. package/dist/encoding/index.d.ts.map +1 -1
  288. package/dist/encoding/index.js +5 -0
  289. package/dist/encoding/index.js.map +1 -1
  290. package/dist/eventlog/EventJournal.d.ts.map +1 -1
  291. package/dist/eventlog/EventJournal.js +6 -3
  292. package/dist/eventlog/EventJournal.js.map +1 -1
  293. package/dist/eventlog/EventLog.d.ts +119 -4
  294. package/dist/eventlog/EventLog.d.ts.map +1 -1
  295. package/dist/eventlog/EventLog.js +200 -12
  296. package/dist/eventlog/EventLog.js.map +1 -1
  297. package/dist/eventlog/EventLogEncryption.d.ts +41 -4
  298. package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
  299. package/dist/eventlog/EventLogEncryption.js +83 -64
  300. package/dist/eventlog/EventLogEncryption.js.map +1 -1
  301. package/dist/eventlog/EventLogMessage.d.ts +279 -0
  302. package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
  303. package/dist/eventlog/EventLogMessage.js +217 -1
  304. package/dist/eventlog/EventLogMessage.js.map +1 -1
  305. package/dist/eventlog/EventLogRemote.d.ts +200 -28
  306. package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
  307. package/dist/eventlog/EventLogRemote.js +186 -16
  308. package/dist/eventlog/EventLogRemote.js.map +1 -1
  309. package/dist/eventlog/EventLogServer.d.ts +3 -0
  310. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  311. package/dist/eventlog/EventLogServer.js +18 -10
  312. package/dist/eventlog/EventLogServer.js.map +1 -1
  313. package/dist/eventlog/EventLogServerEncrypted.d.ts +326 -5
  314. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  315. package/dist/eventlog/EventLogServerEncrypted.js +769 -14
  316. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  317. package/dist/eventlog/EventLogSessionAuth.d.ts +5 -3
  318. package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
  319. package/dist/eventlog/EventLogSessionAuth.js +41 -64
  320. package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
  321. package/dist/eventlog/EventRow.d.ts +4 -0
  322. package/dist/eventlog/EventRow.d.ts.map +1 -1
  323. package/dist/eventlog/EventRow.js +12 -2
  324. package/dist/eventlog/EventRow.js.map +1 -1
  325. package/dist/eventlog/SqlEventJournal.js +2 -2
  326. package/dist/eventlog/SqlEventJournal.js.map +1 -1
  327. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +21 -5
  328. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
  329. package/dist/eventlog/SqlEventLogServerEncrypted.js +1048 -113
  330. package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
  331. package/dist/eventlog/SqlEventLogServerUnencrypted.js +2 -2
  332. package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
  333. package/dist/eventlog/internal/batches.d.ts +12 -0
  334. package/dist/eventlog/internal/batches.d.ts.map +1 -0
  335. package/dist/eventlog/internal/batches.js +26 -0
  336. package/dist/eventlog/internal/batches.js.map +1 -0
  337. package/dist/eventlog/internal/compaction.d.ts +38 -0
  338. package/dist/eventlog/internal/compaction.d.ts.map +1 -0
  339. package/dist/eventlog/internal/compaction.js +33 -0
  340. package/dist/eventlog/internal/compaction.js.map +1 -0
  341. package/dist/eventlog/internal/identityRootSecretDerivation.js +66 -67
  342. package/dist/eventlog/internal/identityRootSecretDerivation.js.map +1 -1
  343. package/dist/eventlog/internal/remoteCompaction.d.ts +31 -0
  344. package/dist/eventlog/internal/remoteCompaction.d.ts.map +1 -0
  345. package/dist/eventlog/internal/remoteCompaction.js +76 -0
  346. package/dist/eventlog/internal/remoteCompaction.js.map +1 -0
  347. package/dist/http/Cookies.d.ts +172 -0
  348. package/dist/http/Cookies.d.ts.map +1 -1
  349. package/dist/http/Cookies.js +143 -1
  350. package/dist/http/Cookies.js.map +1 -1
  351. package/dist/http/FetchHttpClient.d.ts +26 -2
  352. package/dist/http/FetchHttpClient.d.ts.map +1 -1
  353. package/dist/http/FetchHttpClient.js +78 -15
  354. package/dist/http/FetchHttpClient.js.map +1 -1
  355. package/dist/http/HttpClient.d.ts +79 -8
  356. package/dist/http/HttpClient.d.ts.map +1 -1
  357. package/dist/http/HttpClient.js +65 -5
  358. package/dist/http/HttpClient.js.map +1 -1
  359. package/dist/http/HttpClientRequest.d.ts +9 -5
  360. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  361. package/dist/http/HttpClientRequest.js +2 -3
  362. package/dist/http/HttpClientRequest.js.map +1 -1
  363. package/dist/http/HttpClientResponse.d.ts.map +1 -1
  364. package/dist/http/HttpClientResponse.js +3 -2
  365. package/dist/http/HttpClientResponse.js.map +1 -1
  366. package/dist/http/HttpMethod.d.ts +7 -1
  367. package/dist/http/HttpMethod.d.ts.map +1 -1
  368. package/dist/http/HttpMethod.js +3 -8
  369. package/dist/http/HttpMethod.js.map +1 -1
  370. package/dist/http/HttpServerRequest.d.ts +5 -2
  371. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  372. package/dist/http/HttpServerRequest.js +6 -17
  373. package/dist/http/HttpServerRequest.js.map +1 -1
  374. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  375. package/dist/http/HttpServerResponse.js +3 -2
  376. package/dist/http/HttpServerResponse.js.map +1 -1
  377. package/dist/http/HttpTraceContext.d.ts +2 -1
  378. package/dist/http/HttpTraceContext.d.ts.map +1 -1
  379. package/dist/http/HttpTraceContext.js +7 -5
  380. package/dist/http/HttpTraceContext.js.map +1 -1
  381. package/dist/http/ProblemDetails.d.ts +96 -0
  382. package/dist/http/ProblemDetails.d.ts.map +1 -0
  383. package/dist/http/ProblemDetails.js +98 -0
  384. package/dist/http/ProblemDetails.js.map +1 -0
  385. package/dist/http/index.d.ts +5 -0
  386. package/dist/http/index.d.ts.map +1 -1
  387. package/dist/http/index.js +5 -0
  388. package/dist/http/index.js.map +1 -1
  389. package/dist/http/internal/decompression.js +3 -2
  390. package/dist/http/internal/decompression.js.map +1 -1
  391. package/dist/http/internal/urlParams.js +8 -0
  392. package/dist/http/internal/urlParams.js.map +1 -1
  393. package/dist/http-api/HttpApiBuilder.js +19 -5
  394. package/dist/http-api/HttpApiBuilder.js.map +1 -1
  395. package/dist/http-api/HttpApiClient.d.ts +63 -0
  396. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  397. package/dist/http-api/HttpApiClient.js +51 -0
  398. package/dist/http-api/HttpApiClient.js.map +1 -1
  399. package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
  400. package/dist/http-api/HttpApiEndpoint.js +14 -5
  401. package/dist/http-api/HttpApiEndpoint.js.map +1 -1
  402. package/dist/http-api/HttpApiError.d.ts +185 -13
  403. package/dist/http-api/HttpApiError.d.ts.map +1 -1
  404. package/dist/http-api/HttpApiError.js +128 -0
  405. package/dist/http-api/HttpApiError.js.map +1 -1
  406. package/dist/http-api/HttpApiMiddleware.d.ts +64 -17
  407. package/dist/http-api/HttpApiMiddleware.d.ts.map +1 -1
  408. package/dist/http-api/HttpApiMiddleware.js +85 -1
  409. package/dist/http-api/HttpApiMiddleware.js.map +1 -1
  410. package/dist/http-api/HttpApiSchema.d.ts +76 -14
  411. package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
  412. package/dist/http-api/HttpApiSchema.js +53 -0
  413. package/dist/http-api/HttpApiSchema.js.map +1 -1
  414. package/dist/index.d.ts +5 -5
  415. package/dist/index.d.ts.map +1 -1
  416. package/dist/index.js +5 -5
  417. package/dist/index.js.map +1 -1
  418. package/dist/internal/effect.js +25 -14
  419. package/dist/internal/effect.js.map +1 -1
  420. package/dist/internal/glob.d.ts +2 -0
  421. package/dist/internal/glob.d.ts.map +1 -0
  422. package/dist/internal/glob.js +630 -0
  423. package/dist/internal/glob.js.map +1 -0
  424. package/dist/internal/matcher.js +10 -0
  425. package/dist/internal/matcher.js.map +1 -1
  426. package/dist/internal/persistence.js +9 -0
  427. package/dist/internal/persistence.js.map +1 -1
  428. package/dist/internal/rcRef.js +4 -1
  429. package/dist/internal/rcRef.js.map +1 -1
  430. package/dist/internal/schema/toCodeDocument.js +6 -3
  431. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  432. package/dist/internal/trie.js +42 -13
  433. package/dist/internal/trie.js.map +1 -1
  434. package/dist/internal/ulid.js +41 -0
  435. package/dist/internal/ulid.js.map +1 -1
  436. package/dist/internal/uuid.js +52 -8
  437. package/dist/internal/uuid.js.map +1 -1
  438. package/dist/internal/version.js +1 -1
  439. package/dist/observability/Otlp.d.ts +15 -4
  440. package/dist/observability/Otlp.d.ts.map +1 -1
  441. package/dist/observability/Otlp.js +10 -0
  442. package/dist/observability/Otlp.js.map +1 -1
  443. package/dist/observability/OtlpResource.d.ts +7 -0
  444. package/dist/observability/OtlpResource.d.ts.map +1 -1
  445. package/dist/observability/OtlpResource.js +11 -1
  446. package/dist/observability/OtlpResource.js.map +1 -1
  447. package/dist/persistence/KeyValueStore.d.ts +47 -2
  448. package/dist/persistence/KeyValueStore.d.ts.map +1 -1
  449. package/dist/persistence/KeyValueStore.js +129 -18
  450. package/dist/persistence/KeyValueStore.js.map +1 -1
  451. package/dist/persistence/PersistedQueue.d.ts +9 -0
  452. package/dist/persistence/PersistedQueue.d.ts.map +1 -1
  453. package/dist/persistence/PersistedQueue.js +94 -52
  454. package/dist/persistence/PersistedQueue.js.map +1 -1
  455. package/dist/persistence/Persistence.d.ts +10 -4
  456. package/dist/persistence/Persistence.d.ts.map +1 -1
  457. package/dist/persistence/Persistence.js +18 -11
  458. package/dist/persistence/Persistence.js.map +1 -1
  459. package/dist/process/ChildProcess.d.ts +207 -67
  460. package/dist/process/ChildProcess.d.ts.map +1 -1
  461. package/dist/process/ChildProcess.js +56 -158
  462. package/dist/process/ChildProcess.js.map +1 -1
  463. package/dist/process/ChildProcessSpawner.d.ts +5 -0
  464. package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
  465. package/dist/process/ChildProcessSpawner.js.map +1 -1
  466. package/dist/process/CommandLine.d.ts +294 -0
  467. package/dist/process/CommandLine.d.ts.map +1 -0
  468. package/dist/process/CommandLine.js +481 -0
  469. package/dist/process/CommandLine.js.map +1 -0
  470. package/dist/process/index.d.ts +5 -0
  471. package/dist/process/index.d.ts.map +1 -1
  472. package/dist/process/index.js +5 -0
  473. package/dist/process/index.js.map +1 -1
  474. package/dist/reactivity/Atom.d.ts +2 -1
  475. package/dist/reactivity/Atom.d.ts.map +1 -1
  476. package/dist/reactivity/Atom.js +3 -4
  477. package/dist/reactivity/Atom.js.map +1 -1
  478. package/dist/reactivity/AtomRegistry.js.map +1 -1
  479. package/dist/rpc/RpcClient.d.ts +16 -1
  480. package/dist/rpc/RpcClient.d.ts.map +1 -1
  481. package/dist/rpc/RpcClient.js +50 -16
  482. package/dist/rpc/RpcClient.js.map +1 -1
  483. package/dist/rpc/RpcMessage.d.ts +10 -1
  484. package/dist/rpc/RpcMessage.d.ts.map +1 -1
  485. package/dist/rpc/RpcMessage.js +1 -0
  486. package/dist/rpc/RpcMessage.js.map +1 -1
  487. package/dist/rpc/RpcSerialization.d.ts.map +1 -1
  488. package/dist/rpc/RpcSerialization.js +6 -0
  489. package/dist/rpc/RpcSerialization.js.map +1 -1
  490. package/dist/rpc/RpcServer.d.ts +31 -0
  491. package/dist/rpc/RpcServer.d.ts.map +1 -1
  492. package/dist/rpc/RpcServer.js +139 -66
  493. package/dist/rpc/RpcServer.js.map +1 -1
  494. package/dist/schema/Model.d.ts +14 -0
  495. package/dist/schema/Model.d.ts.map +1 -1
  496. package/dist/schema/Model.js +18 -3
  497. package/dist/schema/Model.js.map +1 -1
  498. package/dist/sql/Migrator.d.ts +0 -19
  499. package/dist/sql/Migrator.d.ts.map +1 -1
  500. package/dist/sql/Migrator.js +3 -48
  501. package/dist/sql/Migrator.js.map +1 -1
  502. package/dist/sql/MigratorFileSystem.d.ts +21 -0
  503. package/dist/sql/MigratorFileSystem.d.ts.map +1 -0
  504. package/dist/sql/MigratorFileSystem.js +57 -0
  505. package/dist/sql/MigratorFileSystem.js.map +1 -0
  506. package/dist/sql/SqlClient.d.ts.map +1 -1
  507. package/dist/sql/SqlClient.js +5 -9
  508. package/dist/sql/SqlClient.js.map +1 -1
  509. package/dist/sql/Statement.d.ts +20 -6
  510. package/dist/sql/Statement.d.ts.map +1 -1
  511. package/dist/sql/Statement.js +0 -13
  512. package/dist/sql/Statement.js.map +1 -1
  513. package/dist/sql/index.js +1 -1
  514. package/dist/testing/index.d.ts +0 -5
  515. package/dist/testing/index.d.ts.map +1 -1
  516. package/dist/testing/index.js +0 -5
  517. package/dist/testing/index.js.map +1 -1
  518. package/dist/workflow/internal/crypto.js +9 -8
  519. package/dist/workflow/internal/crypto.js.map +1 -1
  520. package/package.json +3 -1
  521. package/src/BigDecimal.ts +3 -0
  522. package/src/Channel.ts +17 -11
  523. package/src/Config.ts +7 -1
  524. package/src/Context.ts +34 -10
  525. package/src/Cron.ts +178 -29
  526. package/src/Duration.ts +140 -0
  527. package/src/Effect.ts +914 -85
  528. package/src/FileSystem.ts +65 -4
  529. package/src/Glob.ts +205 -0
  530. package/src/Match.ts +127 -0
  531. package/src/Pool.ts +73 -15
  532. package/src/Random.ts +3 -3
  533. package/src/RcMap.ts +5 -1
  534. package/src/Schedule.ts +26 -3
  535. package/src/Schema.ts +1189 -62
  536. package/src/SchemaGetter.ts +27 -11
  537. package/src/SchemaRepresentation.ts +19 -0
  538. package/src/SchemaTransformation.ts +8 -3
  539. package/src/ScopedCache.ts +5 -9
  540. package/src/Semaphore.ts +141 -0
  541. package/src/Stream.ts +15 -6
  542. package/src/Terminal.ts +19 -1
  543. package/src/ai/AiError.ts +56 -80
  544. package/src/ai/Decision.ts +257 -6
  545. package/src/ai/DecisionModel.ts +171 -28
  546. package/src/ai/McpServer.ts +1269 -286
  547. package/src/ai/McpTest.ts +380 -0
  548. package/src/ai/Response.ts +2 -22
  549. package/src/ai/Tool.ts +27 -8
  550. package/src/ai/index.ts +6 -0
  551. package/src/ai/internal/mcpCore.ts +78 -44
  552. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +4 -7
  553. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +4 -7
  554. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +4 -7
  555. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +4 -7
  556. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +15 -10
  557. package/src/ai/internal/mcpProtocol.ts +29 -0
  558. package/src/ai/internal/mcpRuntime.ts +9 -5
  559. package/src/ai/internal/mcpStatefulRuntime.ts +14 -2
  560. package/src/cli/Argument.ts +6 -0
  561. package/src/cli/CliOutput.ts +117 -49
  562. package/src/cli/Command.ts +23 -0
  563. package/src/cli/Flag.ts +107 -0
  564. package/src/cli/HelpDoc.ts +18 -1
  565. package/src/cli/Param.ts +6 -0
  566. package/src/cli/Primitive.ts +16 -1
  567. package/src/cli/Prompt.ts +1 -0
  568. package/src/cli/internal/help.ts +21 -9
  569. package/src/cluster/Sharding.ts +93 -26
  570. package/src/cluster/ShardingConfig.ts +41 -3
  571. package/src/cluster/SingleRunner.ts +3 -3
  572. package/src/cluster/SqlMessageStorage.ts +49 -17
  573. package/src/cluster/SqlRunnerStorage.ts +37 -27
  574. package/src/crypto/Aead.ts +517 -0
  575. package/src/crypto/Cipher.ts +326 -0
  576. package/src/crypto/CryptoError.ts +242 -0
  577. package/src/crypto/Digest.ts +167 -0
  578. package/src/crypto/Kdf.ts +315 -0
  579. package/src/crypto/KeyAgreement.ts +489 -0
  580. package/src/crypto/KeyFormat.ts +712 -0
  581. package/src/crypto/KeyWrap.ts +639 -0
  582. package/src/crypto/Mac.ts +386 -0
  583. package/src/crypto/SecureRandom.ts +459 -0
  584. package/src/crypto/Signature.ts +673 -0
  585. package/src/crypto/WebCrypto.ts +64 -0
  586. package/src/crypto/index.ts +78 -0
  587. package/src/crypto/internal/asymmetric.ts +329 -0
  588. package/src/crypto/internal/chacha.ts +1088 -0
  589. package/src/crypto/internal/der.ts +110 -0
  590. package/src/crypto/internal/digest.ts +16 -0
  591. package/src/crypto/internal/key.ts +235 -0
  592. package/src/crypto/internal/md5.ts +170 -0
  593. package/src/crypto/internal/webCrypto.ts +150 -0
  594. package/src/encoding/Base64Url.ts +5 -2
  595. package/src/encoding/Csv.ts +1298 -0
  596. package/src/encoding/Hex.ts +3 -2
  597. package/src/encoding/SchemaBinary.ts +40 -4
  598. package/src/encoding/Toml.ts +85 -20
  599. package/src/encoding/Yaml.ts +61 -18
  600. package/src/encoding/index.ts +6 -0
  601. package/src/eventlog/EventJournal.ts +4 -3
  602. package/src/eventlog/EventLog.ts +340 -15
  603. package/src/eventlog/EventLogEncryption.ts +118 -110
  604. package/src/eventlog/EventLogMessage.ts +273 -1
  605. package/src/eventlog/EventLogRemote.ts +367 -23
  606. package/src/eventlog/EventLogServer.ts +23 -8
  607. package/src/eventlog/EventLogServerEncrypted.ts +1130 -67
  608. package/src/eventlog/EventLogSessionAuth.ts +56 -70
  609. package/src/eventlog/EventRow.ts +12 -3
  610. package/src/eventlog/SqlEventJournal.ts +2 -2
  611. package/src/eventlog/SqlEventLogServerEncrypted.ts +1244 -136
  612. package/src/eventlog/SqlEventLogServerUnencrypted.ts +2 -2
  613. package/src/eventlog/internal/batches.ts +30 -0
  614. package/src/eventlog/internal/compaction.ts +64 -0
  615. package/src/eventlog/internal/identityRootSecretDerivation.ts +93 -123
  616. package/src/eventlog/internal/remoteCompaction.ts +92 -0
  617. package/src/http/Cookies.ts +281 -1
  618. package/src/http/FetchHttpClient.ts +88 -16
  619. package/src/http/HttpClient.ts +89 -22
  620. package/src/http/HttpClientRequest.ts +12 -9
  621. package/src/http/HttpClientResponse.ts +3 -2
  622. package/src/http/HttpMethod.ts +10 -2
  623. package/src/http/HttpServerRequest.ts +15 -30
  624. package/src/http/HttpServerResponse.ts +3 -2
  625. package/src/http/HttpTraceContext.ts +7 -4
  626. package/src/http/ProblemDetails.ts +149 -0
  627. package/src/http/index.ts +6 -0
  628. package/src/http/internal/decompression.ts +4 -4
  629. package/src/http/internal/urlParams.ts +8 -0
  630. package/src/http-api/HttpApiBuilder.ts +24 -12
  631. package/src/http-api/HttpApiClient.ts +67 -1
  632. package/src/http-api/HttpApiEndpoint.ts +14 -5
  633. package/src/http-api/HttpApiError.ts +250 -0
  634. package/src/http-api/HttpApiMiddleware.ts +95 -1
  635. package/src/http-api/HttpApiSchema.ts +105 -14
  636. package/src/index.ts +6 -6
  637. package/src/internal/effect.ts +34 -18
  638. package/src/internal/glob.ts +736 -0
  639. package/src/internal/matcher.ts +17 -0
  640. package/src/internal/persistence.ts +11 -0
  641. package/src/internal/rcRef.ts +4 -1
  642. package/src/internal/schema/toCodeDocument.ts +7 -3
  643. package/src/internal/trie.ts +43 -14
  644. package/src/internal/ulid.ts +44 -0
  645. package/src/internal/uuid.ts +57 -16
  646. package/src/internal/version.ts +1 -1
  647. package/src/observability/Otlp.ts +21 -4
  648. package/src/observability/OtlpResource.ts +9 -1
  649. package/src/persistence/KeyValueStore.ts +219 -22
  650. package/src/persistence/PersistedQueue.ts +128 -59
  651. package/src/persistence/Persistence.ts +20 -13
  652. package/src/process/ChildProcess.ts +255 -260
  653. package/src/process/ChildProcessSpawner.ts +5 -0
  654. package/src/process/CommandLine.ts +630 -0
  655. package/src/process/index.ts +6 -0
  656. package/src/reactivity/Atom.ts +5 -5
  657. package/src/reactivity/AtomRegistry.ts +1 -1
  658. package/src/rpc/RpcClient.ts +62 -26
  659. package/src/rpc/RpcMessage.ts +10 -1
  660. package/src/rpc/RpcSerialization.ts +3 -0
  661. package/src/rpc/RpcServer.ts +176 -78
  662. package/src/schema/Model.ts +26 -3
  663. package/src/sql/Migrator.ts +4 -63
  664. package/src/sql/MigratorFileSystem.ts +71 -0
  665. package/src/sql/SqlClient.ts +2 -16
  666. package/src/sql/Statement.ts +8 -7
  667. package/src/sql/index.ts +1 -1
  668. package/src/testing/index.ts +0 -6
  669. package/src/workflow/internal/crypto.ts +15 -11
  670. package/dist/Crypto.d.ts +0 -244
  671. package/dist/Crypto.d.ts.map +0 -1
  672. package/dist/Crypto.js +0 -139
  673. package/dist/Crypto.js.map +0 -1
  674. package/dist/testing/TestCrypto.d.ts +0 -73
  675. package/dist/testing/TestCrypto.d.ts.map +0 -1
  676. package/dist/testing/TestCrypto.js +0 -87
  677. package/dist/testing/TestCrypto.js.map +0 -1
  678. package/src/Crypto.ts +0 -347
  679. package/src/testing/TestCrypto.ts +0 -94
@@ -149,6 +149,20 @@ export class UnsupportedByProtocol extends Data.TaggedError("UnsupportedByProtoc
149
149
  readonly feature: string
150
150
  }> {}
151
151
 
152
+ /**
153
+ * A request rejected outside the handler, for example by MCP middleware.
154
+ * Adapters send it as a JSON-RPC error with its code, message and data, never
155
+ * as a tool result. `error` keeps the original failure for in-process callers.
156
+ *
157
+ * @internal
158
+ */
159
+ export class RequestRejected extends Data.TaggedError("RequestRejected")<{
160
+ readonly code: number
161
+ readonly message: string
162
+ readonly data?: unknown
163
+ readonly error: McpSchema.McpErrorBase
164
+ }> {}
165
+
152
166
  /**
153
167
  * @internal
154
168
  */
@@ -157,6 +171,7 @@ export type ToolError =
157
171
  | InvalidToolInput
158
172
  | InvalidToolContinuation
159
173
  | ToolExecutionError
174
+ | RequestRejected
160
175
 
161
176
  /**
162
177
  * @internal
@@ -166,12 +181,13 @@ export interface ToolRegistration {
166
181
  // `tool.title ?? tool.annotations?.title` at the public boundary.
167
182
  readonly descriptor: McpSchema.Tool
168
183
  readonly isVisible: (profile: NegotiatedProtocolProfile<string>) => boolean
184
+ readonly visible?: Visible | undefined
169
185
  readonly handle: (
170
186
  call: typeof McpSchema.CallTool.payloadSchema.Type,
171
187
  invocation: McpInvocation
172
188
  ) => Effect.Effect<
173
189
  OperationOutcome<McpSchema.CallToolResult>,
174
- InvalidToolInput | InvalidToolContinuation | ToolExecutionError,
190
+ ToolNotFound | InvalidToolInput | InvalidToolContinuation | ToolExecutionError | RequestRejected,
175
191
  never
176
192
  >
177
193
  }
@@ -184,8 +200,13 @@ export interface Tools {
184
200
  registration: ToolRegistration
185
201
  ) => Effect.Effect<void>
186
202
  readonly list: (
203
+ invocation: McpInvocation
204
+ ) => Effect.Effect<ReadonlyArray<McpSchema.Tool>, RequestRejected>
205
+ // Skips request-level visibility checks.
206
+ readonly find: (
207
+ name: string,
187
208
  profile: NegotiatedProtocolProfile<string>
188
- ) => Effect.Effect<ReadonlyArray<McpSchema.Tool>>
209
+ ) => McpSchema.Tool | undefined
189
210
  readonly call: (
190
211
  call: typeof McpSchema.CallTool.payloadSchema.Type,
191
212
  invocation: McpInvocation
@@ -198,9 +219,10 @@ export interface Tools {
198
219
  export interface ResourceRegistration {
199
220
  readonly descriptor: McpSchema.Resource
200
221
  readonly isVisible: (profile: NegotiatedProtocolProfile<string>) => boolean
222
+ readonly visible?: Visible | undefined
201
223
  readonly read: (
202
224
  invocation: McpInvocation
203
- ) => Effect.Effect<McpSchema.ReadResourceResult, McpSchema.InternalError>
225
+ ) => Effect.Effect<McpSchema.ReadResourceResult, ResourceNotFound | McpSchema.InternalError | RequestRejected>
204
226
  }
205
227
 
206
228
  /**
@@ -209,12 +231,16 @@ export interface ResourceRegistration {
209
231
  export interface ResourceTemplateRegistration {
210
232
  readonly descriptor: McpSchema.ResourceTemplate
211
233
  readonly isVisible: (profile: NegotiatedProtocolProfile<string>) => boolean
234
+ readonly visible?: Visible | undefined
212
235
  readonly match: (uri: string) => ReadonlyArray<string> | undefined
213
236
  readonly read: (
214
237
  uri: string,
215
238
  params: ReadonlyArray<string>,
216
239
  invocation: McpInvocation
217
- ) => Effect.Effect<McpSchema.ReadResourceResult, McpSchema.InvalidParams | McpSchema.InternalError>
240
+ ) => Effect.Effect<
241
+ McpSchema.ReadResourceResult,
242
+ ResourceNotFound | McpSchema.InvalidParams | McpSchema.InternalError | RequestRejected
243
+ >
218
244
  }
219
245
 
220
246
  /**
@@ -224,17 +250,17 @@ export interface Resources {
224
250
  readonly register: (registration: ResourceRegistration) => Effect.Effect<void>
225
251
  readonly registerTemplate: (registration: ResourceTemplateRegistration) => Effect.Effect<void>
226
252
  readonly list: (
227
- profile: NegotiatedProtocolProfile<string>
228
- ) => Effect.Effect<ReadonlyArray<McpSchema.Resource>>
253
+ invocation: McpInvocation
254
+ ) => Effect.Effect<ReadonlyArray<McpSchema.Resource>, RequestRejected>
229
255
  readonly listTemplates: (
230
- profile: NegotiatedProtocolProfile<string>
231
- ) => Effect.Effect<ReadonlyArray<McpSchema.ResourceTemplate>>
256
+ invocation: McpInvocation
257
+ ) => Effect.Effect<ReadonlyArray<McpSchema.ResourceTemplate>, RequestRejected>
232
258
  readonly read: (
233
259
  uri: string,
234
260
  invocation: McpInvocation
235
261
  ) => Effect.Effect<
236
262
  McpSchema.ReadResourceResult,
237
- ResourceNotFound | McpSchema.InvalidParams | McpSchema.InternalError
263
+ ResourceNotFound | McpSchema.InvalidParams | McpSchema.InternalError | RequestRejected
238
264
  >
239
265
  }
240
266
 
@@ -251,10 +277,14 @@ export class PromptNotFound extends Data.TaggedError("PromptNotFound")<{
251
277
  export interface PromptRegistration {
252
278
  readonly descriptor: McpSchema.Prompt
253
279
  readonly isVisible: (profile: NegotiatedProtocolProfile<string>) => boolean
280
+ readonly visible?: Visible | undefined
254
281
  readonly get: (
255
282
  args: Readonly<Record<string, string>>,
256
283
  invocation: McpInvocation
257
- ) => Effect.Effect<OperationOutcome<McpSchema.GetPromptResult>, McpSchema.InvalidParams | McpSchema.InternalError>
284
+ ) => Effect.Effect<
285
+ OperationOutcome<McpSchema.GetPromptResult>,
286
+ PromptNotFound | McpSchema.InvalidParams | McpSchema.InternalError | RequestRejected
287
+ >
258
288
  }
259
289
 
260
290
  /**
@@ -263,15 +293,15 @@ export interface PromptRegistration {
263
293
  export interface Prompts {
264
294
  readonly register: (registration: PromptRegistration) => Effect.Effect<void>
265
295
  readonly list: (
266
- profile: NegotiatedProtocolProfile<string>
267
- ) => Effect.Effect<ReadonlyArray<McpSchema.Prompt>>
296
+ invocation: McpInvocation
297
+ ) => Effect.Effect<ReadonlyArray<McpSchema.Prompt>, RequestRejected>
268
298
  readonly get: (
269
299
  name: string,
270
300
  args: Readonly<Record<string, string>>,
271
301
  invocation: McpInvocation
272
302
  ) => Effect.Effect<
273
303
  OperationOutcome<McpSchema.GetPromptResult>,
274
- PromptNotFound | McpSchema.InvalidParams | McpSchema.InternalError
304
+ PromptNotFound | McpSchema.InvalidParams | McpSchema.InternalError | RequestRejected
275
305
  >
276
306
  }
277
307
 
@@ -314,12 +344,12 @@ export interface Completions {
314
344
  complete: (
315
345
  request: CompletionRequest,
316
346
  invocation: McpInvocation
317
- ) => Effect.Effect<CompletionResult, McpSchema.InvalidParams | McpSchema.InternalError>
347
+ ) => Effect.Effect<CompletionResult, McpSchema.InvalidParams | McpSchema.InternalError | RequestRejected>
318
348
  ) => Effect.Effect<void>
319
349
  readonly complete: (
320
350
  request: CompletionRequest,
321
351
  invocation: McpInvocation
322
- ) => Effect.Effect<CompletionResult, McpSchema.InvalidParams | McpSchema.InternalError>
352
+ ) => Effect.Effect<CompletionResult, McpSchema.InvalidParams | McpSchema.InternalError | RequestRejected>
323
353
  }
324
354
 
325
355
  /**
@@ -400,6 +430,14 @@ export interface McpCore {
400
430
  }>
401
431
  }
402
432
 
433
+ /**
434
+ * Runs the request-level visibility checks of a registration on a list
435
+ * request, after `isVisible` passed.
436
+ *
437
+ * @internal
438
+ */
439
+ export type Visible = (invocation: McpInvocation) => Effect.Effect<boolean, RequestRejected>
440
+
403
441
  /**
404
442
  * @internal
405
443
  */
@@ -413,24 +451,35 @@ export const make: Effect.Effect<McpCore> = Effect.sync(() => {
413
451
  (
414
452
  request: CompletionRequest,
415
453
  invocation: McpInvocation
416
- ) => Effect.Effect<CompletionResult, McpSchema.InvalidParams | McpSchema.InternalError>
454
+ ) => Effect.Effect<CompletionResult, McpSchema.InvalidParams | McpSchema.InternalError | RequestRejected>
417
455
  >()
418
456
 
457
+ const filterList = <D>(
458
+ registrations: Iterable<{
459
+ readonly descriptor: D
460
+ readonly isVisible: ToolRegistration["isVisible"]
461
+ readonly visible?: Visible | undefined
462
+ }>,
463
+ invocation: McpInvocation
464
+ ): Effect.Effect<ReadonlyArray<D>, RequestRejected> =>
465
+ Effect.map(
466
+ Effect.filter(
467
+ Arr.filter(registrations, (entry) => entry.isVisible(invocation.protocol)),
468
+ (entry) => entry.visible === undefined ? Effect.succeed(true) : entry.visible(invocation)
469
+ ),
470
+ (entries) => entries.map((entry) => entry.descriptor)
471
+ )
472
+
419
473
  const tools: Tools = {
420
474
  register: (registration) =>
421
475
  Effect.sync(() => {
422
476
  registrations.set(registration.descriptor.name, registration)
423
477
  }),
424
- list: (profile) =>
425
- Effect.sync(() => {
426
- const descriptors: Array<McpSchema.Tool> = []
427
- for (const registration of registrations.values()) {
428
- if (registration.isVisible(profile)) {
429
- descriptors.push(registration.descriptor)
430
- }
431
- }
432
- return descriptors
433
- }),
478
+ list: (invocation) => filterList(registrations.values(), invocation),
479
+ find: (name, profile) => {
480
+ const registration = registrations.get(name)
481
+ return registration !== undefined && registration.isVisible(profile) ? registration.descriptor : undefined
482
+ },
434
483
  call: (call, invocation) =>
435
484
  Effect.suspend((): Effect.Effect<OperationOutcome<McpSchema.CallToolResult>, ToolError> => {
436
485
  const registration = registrations.get(call.name)
@@ -465,18 +514,8 @@ export const make: Effect.Effect<McpCore> = Effect.sync(() => {
465
514
  resourceTemplateRegistrations[index] = registration
466
515
  }
467
516
  }),
468
- list: (profile) =>
469
- Effect.sync(() =>
470
- resourceRegistrations
471
- .filter((entry) => entry.isVisible(profile))
472
- .map((entry) => entry.descriptor)
473
- ),
474
- listTemplates: (profile) =>
475
- Effect.sync(() =>
476
- resourceTemplateRegistrations
477
- .filter((entry) => entry.isVisible(profile))
478
- .map((entry) => entry.descriptor)
479
- ),
517
+ list: (invocation) => filterList(resourceRegistrations, invocation),
518
+ listTemplates: (invocation) => filterList(resourceTemplateRegistrations, invocation),
480
519
  read: Effect.fnUntraced(function*(uri, invocation) {
481
520
  const resource = resourceRegistrations.find((entry) => entry.descriptor.uri === uri)
482
521
  if (resource !== undefined && resource.isVisible(invocation.protocol)) {
@@ -497,12 +536,7 @@ export const make: Effect.Effect<McpCore> = Effect.sync(() => {
497
536
  Effect.sync(() => {
498
537
  promptRegistrations.set(registration.descriptor.name, registration)
499
538
  }),
500
- list: (profile) =>
501
- Effect.sync(() =>
502
- Array.from(promptRegistrations.values())
503
- .filter((entry) => entry.isVisible(profile))
504
- .map((entry) => entry.descriptor)
505
- ),
539
+ list: (invocation) => filterList(promptRegistrations.values(), invocation),
506
540
  get: Effect.fnUntraced(function*(name, args, invocation) {
507
541
  const registration = promptRegistrations.get(name)
508
542
  if (registration === undefined || !registration.isVisible(invocation.protocol)) {
@@ -154,12 +154,10 @@ export const protocol = McpProtocol.make({
154
154
  "notifications/roots/list_changed": (_, { client, headers }) =>
155
155
  lifecycle.clientNotification(McpCore.ClientNotification.RootsChanged(), client.id, headers),
156
156
  "resources/list": (_pageRequest) =>
157
- PublicMcpSchema.McpServerClient.use((request) => core.resources.list(McpProtocol.profileFromClient(request)))
157
+ McpProtocol.listForClient(core.resources.list)
158
158
  .pipe(Effect.map((resources) => McpSchema.ListResourcesResult.make({ resources }))),
159
159
  "resources/templates/list": (_pageRequest) =>
160
- PublicMcpSchema.McpServerClient.use((request) =>
161
- core.resources.listTemplates(McpProtocol.profileFromClient(request))
162
- ).pipe(
160
+ McpProtocol.listForClient(core.resources.listTemplates).pipe(
163
161
  Effect.map((resourceTemplates) => McpSchema.ListResourceTemplatesResult.make({ resourceTemplates }))
164
162
  ),
165
163
  "resources/read": Effect.fnUntraced(function*({ uri }) {
@@ -189,7 +187,7 @@ export const protocol = McpProtocol.make({
189
187
  "resources/unsubscribe": ({ uri }, { client, headers }) =>
190
188
  lifecycle.unsubscribe(uri, client.id, headers).pipe(Effect.as({})),
191
189
  "prompts/list": () =>
192
- PublicMcpSchema.McpServerClient.use((request) => core.prompts.list(McpProtocol.profileFromClient(request)))
190
+ McpProtocol.listForClient(core.prompts.list)
193
191
  .pipe(
194
192
  Effect.map((prompts) =>
195
193
  McpSchema.ListPromptsResult.make({
@@ -249,8 +247,7 @@ export const protocol = McpProtocol.make({
249
247
  })
250
248
  }),
251
249
  "tools/list": Effect.fnUntraced(function*() {
252
- const request = yield* PublicMcpSchema.McpServerClient
253
- return yield* core.tools.list(McpProtocol.profileFromClient(request)).pipe(
250
+ return yield* McpProtocol.listForClient(core.tools.list).pipe(
254
251
  Effect.map((tools) =>
255
252
  McpSchema.ListToolsResult.make({
256
253
  tools: tools.map((tool) =>
@@ -166,7 +166,7 @@ export const protocol = McpProtocol.make({
166
166
  "notifications/roots/list_changed": (_, { client, headers }) =>
167
167
  lifecycle.clientNotification(McpCore.ClientNotification.RootsChanged(), client.id, headers),
168
168
  "resources/list": (_pageRequest) =>
169
- PublicMcpSchema.McpServerClient.use((request) => core.resources.list(McpProtocol.profileFromClient(request)))
169
+ McpProtocol.listForClient(core.resources.list)
170
170
  .pipe(
171
171
  Effect.map((resources) =>
172
172
  McpSchema.ListResourcesResult.make({
@@ -182,9 +182,7 @@ export const protocol = McpProtocol.make({
182
182
  )
183
183
  ),
184
184
  "resources/templates/list": (_pageRequest) =>
185
- PublicMcpSchema.McpServerClient.use((request) =>
186
- core.resources.listTemplates(McpProtocol.profileFromClient(request))
187
- ).pipe(
185
+ McpProtocol.listForClient(core.resources.listTemplates).pipe(
188
186
  Effect.map((resourceTemplates) =>
189
187
  McpSchema.ListResourceTemplatesResult.make({
190
188
  resourceTemplates: resourceTemplates.map((template) => ({
@@ -212,7 +210,7 @@ export const protocol = McpProtocol.make({
212
210
  "resources/unsubscribe": ({ uri }, { client, headers }) =>
213
211
  lifecycle.unsubscribe(uri, client.id, headers).pipe(Effect.as({})),
214
212
  "prompts/list": (_pageRequest) =>
215
- PublicMcpSchema.McpServerClient.use((request) => core.prompts.list(McpProtocol.profileFromClient(request)))
213
+ McpProtocol.listForClient(core.prompts.list)
216
214
  .pipe(
217
215
  Effect.map((prompts) =>
218
216
  McpSchema.ListPromptsResult.make({
@@ -272,8 +270,7 @@ export const protocol = McpProtocol.make({
272
270
  })
273
271
  }),
274
272
  "tools/list": Effect.fnUntraced(function*() {
275
- const request = yield* PublicMcpSchema.McpServerClient
276
- const tools = yield* core.tools.list(McpProtocol.profileFromClient(request))
273
+ const tools = yield* McpProtocol.listForClient(core.tools.list)
277
274
  return McpSchema.ListToolsResult.make({
278
275
  tools: tools.map((tool) =>
279
276
  McpSchema.Tool.make({
@@ -182,14 +182,12 @@ export const protocol = McpProtocol.make({
182
182
  "notifications/roots/list_changed": (_, { client, headers }) =>
183
183
  lifecycle.clientNotification(McpCore.ClientNotification.RootsChanged(), client.id, headers),
184
184
  "resources/list": (_pageRequest) =>
185
- PublicMcpSchema.McpServerClient.use((request) => core.resources.list(McpProtocol.profileFromClient(request)))
185
+ McpProtocol.listForClient(core.resources.list)
186
186
  .pipe(
187
187
  Effect.map((resources) => McpSchema.ListResourcesResult.make({ resources }))
188
188
  ),
189
189
  "resources/templates/list": (_pageRequest) =>
190
- PublicMcpSchema.McpServerClient.use((request) =>
191
- core.resources.listTemplates(McpProtocol.profileFromClient(request))
192
- ).pipe(
190
+ McpProtocol.listForClient(core.resources.listTemplates).pipe(
193
191
  Effect.map((resourceTemplates) => McpSchema.ListResourceTemplatesResult.make({ resourceTemplates }))
194
192
  ),
195
193
  "resources/read": Effect.fnUntraced(function*({ uri }) {
@@ -207,7 +205,7 @@ export const protocol = McpProtocol.make({
207
205
  "resources/unsubscribe": ({ uri }, { client, headers }) =>
208
206
  lifecycle.unsubscribe(uri, client.id, headers).pipe(Effect.as({})),
209
207
  "prompts/list": (_pageRequest) =>
210
- PublicMcpSchema.McpServerClient.use((request) => core.prompts.list(McpProtocol.profileFromClient(request)))
208
+ McpProtocol.listForClient(core.prompts.list)
211
209
  .pipe(
212
210
  Effect.map((prompts) => McpSchema.ListPromptsResult.make({ prompts }))
213
211
  ),
@@ -262,8 +260,7 @@ export const protocol = McpProtocol.make({
262
260
  })
263
261
  }),
264
262
  "tools/list": Effect.fnUntraced(function*() {
265
- const request = yield* PublicMcpSchema.McpServerClient
266
- const tools = yield* core.tools.list(McpProtocol.profileFromClient(request))
263
+ const tools = yield* McpProtocol.listForClient(core.tools.list)
267
264
  return McpSchema.ListToolsResult.make({
268
265
  tools: tools.map((tool) =>
269
266
  McpSchema.Tool.make({
@@ -177,7 +177,7 @@ export const protocol = McpProtocol.make({
177
177
  "notifications/roots/list_changed": (_, { client, headers }) =>
178
178
  lifecycle.clientNotification(McpCore.ClientNotification.RootsChanged(), client.id, headers),
179
179
  "resources/list": () =>
180
- PublicMcpSchema.McpServerClient.use((request) => core.resources.list(McpProtocol.profileFromClient(request)))
180
+ McpProtocol.listForClient(core.resources.list)
181
181
  .pipe(
182
182
  Effect.map((resources) =>
183
183
  McpSchema.ListResourcesResult.make({
@@ -186,9 +186,7 @@ export const protocol = McpProtocol.make({
186
186
  )
187
187
  ),
188
188
  "resources/templates/list": () =>
189
- PublicMcpSchema.McpServerClient.use((request) =>
190
- core.resources.listTemplates(McpProtocol.profileFromClient(request))
191
- ).pipe(
189
+ McpProtocol.listForClient(core.resources.listTemplates).pipe(
192
190
  Effect.map((resourceTemplates) =>
193
191
  McpSchema.ListResourceTemplatesResult.make({
194
192
  resourceTemplates: resourceTemplates.map((resourceTemplate) =>
@@ -226,7 +224,7 @@ export const protocol = McpProtocol.make({
226
224
  "resources/unsubscribe": ({ uri }, { client, headers }) =>
227
225
  lifecycle.unsubscribe(uri, client.id, headers).pipe(Effect.as({})),
228
226
  "prompts/list": () =>
229
- PublicMcpSchema.McpServerClient.use((request) => core.prompts.list(McpProtocol.profileFromClient(request)))
227
+ McpProtocol.listForClient(core.prompts.list)
230
228
  .pipe(
231
229
  Effect.map((prompts) =>
232
230
  McpSchema.ListPromptsResult.make({
@@ -285,8 +283,7 @@ export const protocol = McpProtocol.make({
285
283
  })
286
284
  }),
287
285
  "tools/list": Effect.fnUntraced(function*() {
288
- const request = yield* PublicMcpSchema.McpServerClient
289
- const tools = yield* core.tools.list(McpProtocol.profileFromClient(request))
286
+ const tools = yield* McpProtocol.listForClient(core.tools.list)
290
287
  return McpSchema.ListToolsResult.make({
291
288
  tools: tools.map((tool) =>
292
289
  McpSchema.Tool.make({
@@ -327,6 +327,11 @@ export const makeHandlers = (
327
327
  context.serverInfo.extensions,
328
328
  (value): value is Readonly<Record<string, unknown>> => Predicate.isReadonlyObject(value)
329
329
  )
330
+ // Project only the wire fields; structurally compatible hints can carry extra properties.
331
+ const cacheHint = (family: keyof McpProtocol.CacheHints) => {
332
+ const hint = context.serverInfo.cacheHints?.[family]
333
+ return hint === undefined ? privateStaleCache : { ttlMs: hint.ttlMs, cacheScope: hint.cacheScope }
334
+ }
330
335
  const getDiscovery = Effect.map(context.registrationPresence, (presence) => {
331
336
  const capabilities: Types.Mutable<typeof McpSchema.ServerCapabilities.Type> = { completions: {}, logging: {} }
332
337
  if (extensions !== undefined) capabilities.extensions = extensions
@@ -483,7 +488,7 @@ export const makeHandlers = (
483
488
  ) {
484
489
  const discovery = yield* getDiscovery
485
490
  const result = yield* projectCompleteResult({
486
- ...privateStaleCache,
491
+ ...cacheHint("discover"),
487
492
  supportedVersions: Array.from(discovery.supportedVersions),
488
493
  capabilities: discovery.capabilities,
489
494
  instructions: context.serverInfo.instructions
@@ -494,9 +499,9 @@ export const makeHandlers = (
494
499
  _request: typeof McpSchema.ListResources.payloadSchema.Type
495
500
  ) {
496
501
  const invocation = yield* getInvocation
497
- const resources = yield* core.resources.list(invocation.protocol)
502
+ const resources = yield* core.resources.list(invocation)
498
503
  const result = yield* projectCompleteResult({
499
- ...privateStaleCache,
504
+ ...cacheHint("resources"),
500
505
  resources: resources.map(projectResource)
501
506
  }, context.serverInfo)
502
507
  return yield* decodeListResourcesResult(result)
@@ -505,9 +510,9 @@ export const makeHandlers = (
505
510
  _request: typeof McpSchema.ListResourceTemplates.payloadSchema.Type
506
511
  ) {
507
512
  const invocation = yield* getInvocation
508
- const resourceTemplates = yield* core.resources.listTemplates(invocation.protocol)
513
+ const resourceTemplates = yield* core.resources.listTemplates(invocation)
509
514
  const result = yield* projectCompleteResult({
510
- ...privateStaleCache,
515
+ ...cacheHint("resourceTemplates"),
511
516
  resourceTemplates: resourceTemplates.map(projectResourceTemplate)
512
517
  }, context.serverInfo)
513
518
  return yield* decodeListResourceTemplatesResult(result)
@@ -537,10 +542,10 @@ export const makeHandlers = (
537
542
  )
538
543
  }
539
544
  const invocation = yield* getInvocation
540
- const prompts = yield* core.prompts.list(invocation.protocol)
545
+ const prompts = yield* core.prompts.list(invocation)
541
546
  const projectedPrompts = yield* Effect.forEach(prompts, projectPrompt)
542
547
  const result = yield* projectCompleteResult({
543
- ...privateStaleCache,
548
+ ...cacheHint("prompts"),
544
549
  prompts: projectedPrompts
545
550
  }, context.serverInfo)
546
551
  return yield* decodeListPromptsResult(result)
@@ -593,17 +598,17 @@ export const makeHandlers = (
593
598
  _request: typeof McpSchema.ListTools.payloadSchema.Type
594
599
  ) {
595
600
  const invocation = yield* getInvocation
596
- const tools = yield* core.tools.list(invocation.protocol)
601
+ const tools = yield* core.tools.list(invocation)
597
602
  const projectedTools = yield* Effect.forEach(tools, projectTool)
598
603
  const result = yield* projectCompleteResult({
599
- ...privateStaleCache,
604
+ ...cacheHint("tools"),
600
605
  tools: projectedTools
601
606
  }, context.serverInfo)
602
607
  return yield* decodeListToolsResult(result)
603
608
  }, Effect.mapError(projectError)),
604
609
  "tools/call": Effect.fnUntraced(function*(request: typeof McpSchema.CallTool.payloadSchema.Type) {
605
610
  const invocation = yield* getInputInvocation(request)
606
- const tool = (yield* core.tools.list(invocation.protocol)).find((tool) => tool.name === request.name)
611
+ const tool = core.tools.find(request.name, invocation.protocol)
607
612
  const httpRequest = yield* Effect.serviceOption(HttpServerRequest.HttpServerRequest)
608
613
 
609
614
  if (tool !== undefined && Option.isSome(httpRequest)) {
@@ -16,6 +16,7 @@ import * as Schema from "../../Schema.ts"
16
16
  import type * as Scope from "../../Scope.ts"
17
17
  import type * as PublicMcpProtocol from "../McpProtocol.ts"
18
18
  import * as PublicMcpSchema from "../McpSchema.ts"
19
+ import type * as PublicMcpServer from "../McpServer.ts"
19
20
  import * as McpCore from "./mcpCore.ts"
20
21
 
21
22
  const LEGACY_RESOURCE_NOT_FOUND_ERROR_CODE = -32002
@@ -95,6 +96,18 @@ export const invocationFromClient = (
95
96
  serverClient: request
96
97
  })
97
98
 
99
+ /**
100
+ * Runs a core list operation for the legacy client of the current request.
101
+ *
102
+ * @internal
103
+ */
104
+ export const listForClient = <A>(
105
+ list: (invocation: McpCore.McpInvocation) => Effect.Effect<A, McpCore.RequestRejected>
106
+ ): Effect.Effect<A, ProtocolError, PublicMcpSchema.McpServerClient> =>
107
+ PublicMcpSchema.McpServerClient.use((request) =>
108
+ list(invocationFromClient(request)).pipe(Effect.mapError(ProtocolError.fromFeature))
109
+ )
110
+
98
111
  /**
99
112
  * @internal
100
113
  */
@@ -212,6 +225,9 @@ export class ProtocolError extends Data.TaggedError("ProtocolError")<{
212
225
  static fromTool(
213
226
  error: McpCore.ToolError | McpCore.UnsupportedByProtocol
214
227
  ): ProtocolError {
228
+ if (error._tag === "RequestRejected") {
229
+ return new ProtocolError({ code: error.code, message: error.message, data: error.data })
230
+ }
215
231
  const message = Match.value(error).pipe(
216
232
  Match.tag("ToolNotFound", (error) => `Tool '${error.name}' not found`),
217
233
  Match.tag(
@@ -428,6 +444,7 @@ export interface HandlerInstallationContext {
428
444
  readonly websiteUrl?: string | undefined
429
445
  readonly icons?: ReadonlyArray<PublicMcpSchema.Icon> | undefined
430
446
  readonly extensions?: PublicMcpSchema.ServerCapabilities["extensions"] | undefined
447
+ readonly cacheHints?: CacheHints | undefined
431
448
  }
432
449
  readonly registrationPresence: Effect.Effect<{
433
450
  readonly tools: boolean
@@ -436,6 +453,18 @@ export interface HandlerInstallationContext {
436
453
  }>
437
454
  }
438
455
 
456
+ /**
457
+ * Cache hints normalized to wire values when the server is constructed.
458
+ *
459
+ * @internal
460
+ */
461
+ export type CacheHints = {
462
+ readonly [Family in keyof PublicMcpServer.CacheHints]?: {
463
+ readonly ttlMs: number
464
+ readonly cacheScope: "private"
465
+ }
466
+ }
467
+
439
468
  /**
440
469
  * @internal
441
470
  */
@@ -6,6 +6,7 @@
6
6
  import type { NonEmptyReadonlyArray } from "../../Array.ts"
7
7
  import * as Cause from "../../Cause.ts"
8
8
  import * as Context from "../../Context.ts"
9
+ import * as SecureRandom from "../../crypto/SecureRandom.ts"
9
10
  import * as Effect from "../../Effect.ts"
10
11
  import type * as Headers from "../../http/Headers.ts"
11
12
  import { appendPreResponseHandlerUnsafe } from "../../http/HttpEffect.ts"
@@ -138,6 +139,7 @@ export interface HandlerInstallationOptions {
138
139
  readonly websiteUrl?: string | undefined
139
140
  readonly icons?: ReadonlyArray<PublicMcpSchema.Icon> | undefined
140
141
  readonly extensions?: NonNullable<PublicMcpSchema.ServerCapabilities["extensions"]> | undefined
142
+ readonly cacheHints?: McpProtocol.CacheHints | undefined
141
143
  }
142
144
  }
143
145
 
@@ -185,7 +187,8 @@ export interface ServerRuntimeShape {
185
187
  clientId: number,
186
188
  headers: Headers.Headers,
187
189
  notification: McpCore.ServerNotification,
188
- fallbackLogLevel: LogLevel.LogLevel
190
+ fallbackLogLevel: LogLevel.LogLevel,
191
+ listChangeRevision: number | undefined
189
192
  ) => boolean
190
193
  readonly installHandlers: (
191
194
  options: HandlerInstallationOptions
@@ -506,8 +509,8 @@ export const make = Effect.fnUntraced(function*(
506
509
  })
507
510
  ),
508
511
  deliveryClientIds: () => stateful?.initializedClientIds() ?? [],
509
- canDeliver: (clientId, headers, notification, fallback) =>
510
- stateful?.canDeliver(clientId, headers, notification, fallback) ?? true,
512
+ canDeliver: (clientId, headers, notification, fallback, listChangeRevision) =>
513
+ stateful?.canDeliver(clientId, headers, notification, fallback, listChangeRevision) ?? true,
511
514
  installHandlers: Effect.fnUntraced(function*(options) {
512
515
  const contextMap = new Map<string, unknown>()
513
516
  const installationContext: McpProtocol.HandlerInstallationContext = {
@@ -561,10 +564,11 @@ export const make = Effect.fnUntraced(function*(
561
564
  protocol: protocol as PublicMcpProtocol.ProtocolAdapter,
562
565
  supportsResourceSubscriptions: httpRequest === undefined &&
563
566
  capabilities.resources?.subscribe === true,
564
- logLevel: options.defaultLogLevel
567
+ logLevel: options.defaultLogLevel,
568
+ listChangeRevision: options.getListChangeRevision?.() ?? 0
565
569
  }
566
570
  if (httpRequest !== undefined) {
567
- const sessionId = crypto.randomUUID()
571
+ const sessionId = SecureRandom.uuidV4Unsafe()
568
572
  stateful.registerHttp(sessionId, registration)
569
573
  appendPreResponseHandlerUnsafe(
570
574
  fiber.context,
@@ -28,6 +28,7 @@ export interface Binding {
28
28
 
29
29
  interface Session extends Binding {
30
30
  readonly resourceSubscriptions: Set<string> | undefined
31
+ readonly listChangeRevision: number
31
32
  logLevel: SessionLogLevel
32
33
  }
33
34
 
@@ -37,6 +38,11 @@ interface Session extends Binding {
37
38
  export interface Registration extends Binding {
38
39
  readonly supportsResourceSubscriptions: boolean
39
40
  readonly logLevel: LogLevel.LogLevel
41
+ /**
42
+ * The server's list-change revision when the session initialized. Changes
43
+ * up to this revision are already reflected in what the client lists next.
44
+ */
45
+ readonly listChangeRevision: number
40
46
  }
41
47
 
42
48
  /**
@@ -67,7 +73,8 @@ export interface StatefulRuntime {
67
73
  clientId: number,
68
74
  headers: Headers.Headers,
69
75
  notification: McpCore.ServerNotification,
70
- fallbackLogLevel: LogLevel.LogLevel
76
+ fallbackLogLevel: LogLevel.LogLevel,
77
+ listChangeRevision: number | undefined
71
78
  ) => boolean
72
79
  readonly effectLogLevel: (
73
80
  clientId: number,
@@ -84,6 +91,7 @@ const makeSession = (registration: Registration): Session => ({
84
91
  negotiatedProfile: registration.negotiatedProfile,
85
92
  protocol: registration.protocol,
86
93
  resourceSubscriptions: registration.supportsResourceSubscriptions ? new Set() : undefined,
94
+ listChangeRevision: registration.listChangeRevision,
87
95
  logLevel: { _tag: "Effect", level: registration.logLevel }
88
96
  })
89
97
 
@@ -157,8 +165,12 @@ export const make = (): StatefulRuntime => {
157
165
  return Effect.sync(() => subscriptions.delete(uri)).pipe(Effect.asVoid)
158
166
  },
159
167
  effectLogLevel,
160
- canDeliver: (clientId, headers, notification, fallbackLogLevel) => {
168
+ canDeliver: (clientId, headers, notification, fallbackLogLevel, listChangeRevision) => {
161
169
  const session = resolveSession(clientId, headers)
170
+ if (listChangeRevision !== undefined) {
171
+ // A client without a session on this channel has not initialized.
172
+ return session !== undefined && listChangeRevision > session.listChangeRevision
173
+ }
162
174
  if (notification._tag === "LoggingMessage") {
163
175
  const minimum = session?.logLevel
164
176
  return minimum?._tag === "Mcp"