@rikalabs/akter 0.1.0-alpha.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 (603) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +8 -0
  4. package/README.md +116 -0
  5. package/dist/actor/codecs.d.ts +77 -0
  6. package/dist/actor/codecs.js +87 -0
  7. package/dist/actor/connections.d.ts +34 -0
  8. package/dist/actor/connections.js +145 -0
  9. package/dist/actor/definition.d.ts +893 -0
  10. package/dist/actor/definition.js +147 -0
  11. package/dist/actor/descriptor.d.ts +172 -0
  12. package/dist/actor/descriptor.js +367 -0
  13. package/dist/actor/handles.d.ts +77 -0
  14. package/dist/actor/handles.js +265 -0
  15. package/dist/actor/jobs.d.ts +10 -0
  16. package/dist/actor/jobs.js +137 -0
  17. package/dist/actor/layers.d.ts +41 -0
  18. package/dist/actor/layers.js +177 -0
  19. package/dist/actor/reads.d.ts +47 -0
  20. package/dist/actor/reads.js +224 -0
  21. package/dist/actor/served.d.ts +120 -0
  22. package/dist/actor/served.js +72 -0
  23. package/dist/actor/turns.d.ts +13 -0
  24. package/dist/actor/turns.js +332 -0
  25. package/dist/actor/workflows.d.ts +16 -0
  26. package/dist/actor/workflows.js +37 -0
  27. package/dist/client/calls.d.ts +47 -0
  28. package/dist/client/calls.js +425 -0
  29. package/dist/client/clock.d.ts +56 -0
  30. package/dist/client/clock.js +119 -0
  31. package/dist/client/fleet-page.d.ts +15 -0
  32. package/dist/client/fleet-page.js +13 -0
  33. package/dist/client/fleet.d.ts +29 -0
  34. package/dist/client/fleet.js +51 -0
  35. package/dist/client/index.d.ts +17 -0
  36. package/dist/client/index.js +6 -0
  37. package/dist/client/make.d.ts +157 -0
  38. package/dist/client/make.js +221 -0
  39. package/dist/client/offline/queue.d.ts +118 -0
  40. package/dist/client/offline/queue.js +292 -0
  41. package/dist/client/offline/store.d.ts +74 -0
  42. package/dist/client/offline/store.js +78 -0
  43. package/dist/client/optimistic.d.ts +57 -0
  44. package/dist/client/optimistic.js +136 -0
  45. package/dist/client/report.d.ts +2 -0
  46. package/dist/client/report.js +8 -0
  47. package/dist/client/sessions/connection.d.ts +118 -0
  48. package/dist/client/sessions/connection.js +162 -0
  49. package/dist/client/sessions/feed.d.ts +42 -0
  50. package/dist/client/sessions/feed.js +43 -0
  51. package/dist/client/sessions/sse.d.ts +47 -0
  52. package/dist/client/sessions/sse.js +112 -0
  53. package/dist/client/sessions/stream.d.ts +28 -0
  54. package/dist/client/sessions/stream.js +35 -0
  55. package/dist/client/sessions/watch.d.ts +34 -0
  56. package/dist/client/sessions/watch.js +40 -0
  57. package/dist/client/transport.d.ts +37 -0
  58. package/dist/client/transport.js +66 -0
  59. package/dist/contexts/command.d.ts +132 -0
  60. package/dist/contexts/command.js +20 -0
  61. package/dist/contexts/connection.d.ts +68 -0
  62. package/dist/contexts/connection.js +0 -0
  63. package/dist/contexts/job.d.ts +49 -0
  64. package/dist/contexts/job.js +0 -0
  65. package/dist/contexts/workflow.d.ts +147 -0
  66. package/dist/contexts/workflow.js +22 -0
  67. package/dist/errors/actor.d.ts +200 -0
  68. package/dist/errors/actor.js +271 -0
  69. package/dist/errors/content.d.ts +19 -0
  70. package/dist/errors/content.js +14 -0
  71. package/dist/errors/database.d.ts +22 -0
  72. package/dist/errors/database.js +23 -0
  73. package/dist/errors/events.d.ts +17 -0
  74. package/dist/errors/events.js +14 -0
  75. package/dist/errors/subscription.d.ts +12 -0
  76. package/dist/errors/subscription.js +8 -0
  77. package/dist/errors/workflow.d.ts +28 -0
  78. package/dist/errors/workflow.js +17 -0
  79. package/dist/handles/actors.d.ts +17 -0
  80. package/dist/handles/actors.js +7 -0
  81. package/dist/handles/content.d.ts +59 -0
  82. package/dist/handles/content.js +36 -0
  83. package/dist/handles/intents.d.ts +164 -0
  84. package/dist/handles/intents.js +214 -0
  85. package/dist/handles/run.d.ts +31 -0
  86. package/dist/handles/run.js +21 -0
  87. package/dist/handles/workflow.d.ts +27 -0
  88. package/dist/handles/workflow.js +23 -0
  89. package/dist/identity/caller.d.ts +105 -0
  90. package/dist/identity/caller.js +68 -0
  91. package/dist/identity/child.d.ts +18 -0
  92. package/dist/identity/child.js +39 -0
  93. package/dist/identity/command.d.ts +19 -0
  94. package/dist/identity/command.js +21 -0
  95. package/dist/identity/connection.d.ts +24 -0
  96. package/dist/identity/connection.js +29 -0
  97. package/dist/identity/content.d.ts +18 -0
  98. package/dist/identity/content.js +12 -0
  99. package/dist/identity/digest.d.ts +4 -0
  100. package/dist/identity/digest.js +5 -0
  101. package/dist/identity/execution.d.ts +32 -0
  102. package/dist/identity/execution.js +63 -0
  103. package/dist/identity/mint.d.ts +51 -0
  104. package/dist/identity/mint.js +76 -0
  105. package/dist/identity/version.d.ts +2 -0
  106. package/dist/identity/version.js +3 -0
  107. package/dist/index.d.ts +159 -0
  108. package/dist/index.js +97 -0
  109. package/dist/members/blob.d.ts +43 -0
  110. package/dist/members/blob.js +29 -0
  111. package/dist/members/command.d.ts +109 -0
  112. package/dist/members/command.js +61 -0
  113. package/dist/members/connection.d.ts +55 -0
  114. package/dist/members/connection.js +49 -0
  115. package/dist/members/event.d.ts +36 -0
  116. package/dist/members/event.js +24 -0
  117. package/dist/members/job.d.ts +157 -0
  118. package/dist/members/job.js +67 -0
  119. package/dist/members/payload.d.ts +93 -0
  120. package/dist/members/payload.js +145 -0
  121. package/dist/members/reducer.d.ts +64 -0
  122. package/dist/members/reducer.js +27 -0
  123. package/dist/members/stream.d.ts +36 -0
  124. package/dist/members/stream.js +14 -0
  125. package/dist/members/subscription.d.ts +182 -0
  126. package/dist/members/subscription.js +91 -0
  127. package/dist/members/workflow.d.ts +99 -0
  128. package/dist/members/workflow.js +2 -0
  129. package/dist/policies/access.d.ts +35 -0
  130. package/dist/policies/access.js +6 -0
  131. package/dist/policies/command.d.ts +127 -0
  132. package/dist/policies/command.js +45 -0
  133. package/dist/policies/job.d.ts +28 -0
  134. package/dist/policies/job.js +60 -0
  135. package/dist/policies/schedules.d.ts +33 -0
  136. package/dist/policies/schedules.js +131 -0
  137. package/dist/protocol/frames.d.ts +66 -0
  138. package/dist/protocol/frames.js +55 -0
  139. package/dist/protocol/inspection.d.ts +807 -0
  140. package/dist/protocol/inspection.js +243 -0
  141. package/dist/protocol/wire.d.ts +184 -0
  142. package/dist/protocol/wire.js +150 -0
  143. package/dist/runtime/actors.d.ts +155 -0
  144. package/dist/runtime/actors.js +4 -0
  145. package/dist/runtime/admission.d.ts +34 -0
  146. package/dist/runtime/admission.js +72 -0
  147. package/dist/runtime/adoption/backfill.d.ts +27 -0
  148. package/dist/runtime/adoption/backfill.js +144 -0
  149. package/dist/runtime/adoption/enforce.d.ts +55 -0
  150. package/dist/runtime/adoption/enforce.js +241 -0
  151. package/dist/runtime/adoption/observe.d.ts +43 -0
  152. package/dist/runtime/adoption/observe.js +139 -0
  153. package/dist/runtime/adoption/plan.d.ts +45 -0
  154. package/dist/runtime/adoption/plan.js +192 -0
  155. package/dist/runtime/adoption/startup.d.ts +32 -0
  156. package/dist/runtime/adoption/startup.js +76 -0
  157. package/dist/runtime/adoption/status.d.ts +23 -0
  158. package/dist/runtime/adoption/status.js +47 -0
  159. package/dist/runtime/adoption/target.d.ts +33 -0
  160. package/dist/runtime/adoption/target.js +49 -0
  161. package/dist/runtime/connections/holder.d.ts +221 -0
  162. package/dist/runtime/connections/holder.js +816 -0
  163. package/dist/runtime/connections/owner.d.ts +263 -0
  164. package/dist/runtime/connections/owner.js +896 -0
  165. package/dist/runtime/connections/protocol.d.ts +441 -0
  166. package/dist/runtime/connections/protocol.js +222 -0
  167. package/dist/runtime/connections/reads.d.ts +24 -0
  168. package/dist/runtime/connections/reads.js +19 -0
  169. package/dist/runtime/connections/streams.d.ts +62 -0
  170. package/dist/runtime/connections/streams.js +128 -0
  171. package/dist/runtime/connections/transport.d.ts +40 -0
  172. package/dist/runtime/connections/transport.js +68 -0
  173. package/dist/runtime/connections/watch.d.ts +52 -0
  174. package/dist/runtime/connections/watch.js +159 -0
  175. package/dist/runtime/content/grant.d.ts +34 -0
  176. package/dist/runtime/content/grant.js +58 -0
  177. package/dist/runtime/content/store.d.ts +63 -0
  178. package/dist/runtime/content/store.js +294 -0
  179. package/dist/runtime/cron/key.d.ts +2 -0
  180. package/dist/runtime/cron/key.js +2 -0
  181. package/dist/runtime/cron/schedule.d.ts +69 -0
  182. package/dist/runtime/cron/schedule.js +144 -0
  183. package/dist/runtime/database/bounded.d.ts +43 -0
  184. package/dist/runtime/database/bounded.js +108 -0
  185. package/dist/runtime/database/connection.d.ts +8 -0
  186. package/dist/runtime/database/connection.js +18 -0
  187. package/dist/runtime/database/coordination.d.ts +19 -0
  188. package/dist/runtime/database/coordination.js +72 -0
  189. package/dist/runtime/database/flock.d.ts +10 -0
  190. package/dist/runtime/database/flock.js +60 -0
  191. package/dist/runtime/database/gate.d.ts +26 -0
  192. package/dist/runtime/database/gate.js +54 -0
  193. package/dist/runtime/database/keepalive.d.ts +11 -0
  194. package/dist/runtime/database/keepalive.js +22 -0
  195. package/dist/runtime/database/migrations.d.ts +177 -0
  196. package/dist/runtime/database/migrations.js +1018 -0
  197. package/dist/runtime/database/neki/migrations.d.ts +31 -0
  198. package/dist/runtime/database/neki/migrations.js +276 -0
  199. package/dist/runtime/database/neki/session.d.ts +23 -0
  200. package/dist/runtime/database/neki/session.js +31 -0
  201. package/dist/runtime/database/pglite.d.ts +21 -0
  202. package/dist/runtime/database/pglite.js +74 -0
  203. package/dist/runtime/database/replica.d.ts +41 -0
  204. package/dist/runtime/database/replica.js +51 -0
  205. package/dist/runtime/database/shards.d.ts +21 -0
  206. package/dist/runtime/database/shards.js +37 -0
  207. package/dist/runtime/database/snapshot.d.ts +7 -0
  208. package/dist/runtime/database/snapshot.js +7 -0
  209. package/dist/runtime/database/tenancy.d.ts +69 -0
  210. package/dist/runtime/database/tenancy.js +145 -0
  211. package/dist/runtime/database/transient.d.ts +10 -0
  212. package/dist/runtime/database/transient.js +25 -0
  213. package/dist/runtime/drain.d.ts +132 -0
  214. package/dist/runtime/drain.js +109 -0
  215. package/dist/runtime/entity/mailbox.d.ts +86 -0
  216. package/dist/runtime/entity/mailbox.js +121 -0
  217. package/dist/runtime/entity/register.d.ts +424 -0
  218. package/dist/runtime/entity/register.js +669 -0
  219. package/dist/runtime/events/append.d.ts +192 -0
  220. package/dist/runtime/events/append.js +128 -0
  221. package/dist/runtime/events/cursor.d.ts +2 -0
  222. package/dist/runtime/events/cursor.js +5 -0
  223. package/dist/runtime/events/replay.d.ts +20 -0
  224. package/dist/runtime/events/replay.js +45 -0
  225. package/dist/runtime/feeds.d.ts +26 -0
  226. package/dist/runtime/feeds.js +100 -0
  227. package/dist/runtime/fleet/checks.d.ts +17 -0
  228. package/dist/runtime/fleet/checks.js +106 -0
  229. package/dist/runtime/fleet/maintainer.d.ts +38 -0
  230. package/dist/runtime/fleet/maintainer.js +383 -0
  231. package/dist/runtime/fleet/pgoutput.d.ts +41 -0
  232. package/dist/runtime/fleet/pgoutput.js +102 -0
  233. package/dist/runtime/fleet/setup.d.ts +36 -0
  234. package/dist/runtime/fleet/setup.js +58 -0
  235. package/dist/runtime/fleet/subscribe.d.ts +42 -0
  236. package/dist/runtime/fleet/subscribe.js +147 -0
  237. package/dist/runtime/index.d.ts +66 -0
  238. package/dist/runtime/index.js +37 -0
  239. package/dist/runtime/inspector/http.d.ts +19 -0
  240. package/dist/runtime/inspector/http.js +36 -0
  241. package/dist/runtime/inspector/layer.d.ts +46 -0
  242. package/dist/runtime/inspector/layer.js +180 -0
  243. package/dist/runtime/inspector/queries.d.ts +711 -0
  244. package/dist/runtime/inspector/queries.js +494 -0
  245. package/dist/runtime/jobs/attempt.d.ts +254 -0
  246. package/dist/runtime/jobs/attempt.js +413 -0
  247. package/dist/runtime/jobs/isolation.d.ts +20 -0
  248. package/dist/runtime/jobs/isolation.js +10 -0
  249. package/dist/runtime/jobs/progress.d.ts +95 -0
  250. package/dist/runtime/jobs/progress.js +144 -0
  251. package/dist/runtime/layer.d.ts +260 -0
  252. package/dist/runtime/layer.js +876 -0
  253. package/dist/runtime/members.d.ts +381 -0
  254. package/dist/runtime/members.js +8 -0
  255. package/dist/runtime/operators/audit.d.ts +64 -0
  256. package/dist/runtime/operators/audit.js +56 -0
  257. package/dist/runtime/operators/auth.d.ts +29 -0
  258. package/dist/runtime/operators/auth.js +42 -0
  259. package/dist/runtime/operators/export.d.ts +68 -0
  260. package/dist/runtime/operators/export.js +137 -0
  261. package/dist/runtime/operators/grants.d.ts +45 -0
  262. package/dist/runtime/operators/grants.js +40 -0
  263. package/dist/runtime/operators/repair.d.ts +206 -0
  264. package/dist/runtime/operators/repair.js +226 -0
  265. package/dist/runtime/operators/routes.d.ts +35 -0
  266. package/dist/runtime/operators/routes.js +190 -0
  267. package/dist/runtime/operators/seed.d.ts +123 -0
  268. package/dist/runtime/operators/seed.js +123 -0
  269. package/dist/runtime/payloads/versions.d.ts +65 -0
  270. package/dist/runtime/payloads/versions.js +240 -0
  271. package/dist/runtime/peering/authority.d.ts +42 -0
  272. package/dist/runtime/peering/authority.js +132 -0
  273. package/dist/runtime/peering/credentials.d.ts +21 -0
  274. package/dist/runtime/peering/credentials.js +13 -0
  275. package/dist/runtime/peering/transport.d.ts +51 -0
  276. package/dist/runtime/peering/transport.js +175 -0
  277. package/dist/runtime/queries.d.ts +18 -0
  278. package/dist/runtime/queries.js +169 -0
  279. package/dist/runtime/readiness.d.ts +36 -0
  280. package/dist/runtime/readiness.js +44 -0
  281. package/dist/runtime/registration.d.ts +58 -0
  282. package/dist/runtime/registration.js +186 -0
  283. package/dist/runtime/request.d.ts +158 -0
  284. package/dist/runtime/request.js +102 -0
  285. package/dist/runtime/retry.d.ts +8 -0
  286. package/dist/runtime/retry.js +11 -0
  287. package/dist/runtime/runner.d.ts +93 -0
  288. package/dist/runtime/runner.js +122 -0
  289. package/dist/runtime/storage/codec.d.ts +39 -0
  290. package/dist/runtime/storage/codec.js +41 -0
  291. package/dist/runtime/storage/generation.d.ts +69 -0
  292. package/dist/runtime/storage/generation.js +49 -0
  293. package/dist/runtime/storage/placements.d.ts +15 -0
  294. package/dist/runtime/storage/placements.js +38 -0
  295. package/dist/runtime/storage/platform.d.ts +6 -0
  296. package/dist/runtime/storage/platform.js +9 -0
  297. package/dist/runtime/storage/retention.d.ts +73 -0
  298. package/dist/runtime/storage/retention.js +158 -0
  299. package/dist/runtime/subscriptions/identity.d.ts +31 -0
  300. package/dist/runtime/subscriptions/identity.js +45 -0
  301. package/dist/runtime/subscriptions/relay.d.ts +175 -0
  302. package/dist/runtime/subscriptions/relay.js +763 -0
  303. package/dist/runtime/subscriptions/storage.d.ts +40 -0
  304. package/dist/runtime/subscriptions/storage.js +98 -0
  305. package/dist/runtime/sweeps.d.ts +39 -0
  306. package/dist/runtime/sweeps.js +54 -0
  307. package/dist/runtime/telemetry/defects.d.ts +57 -0
  308. package/dist/runtime/telemetry/defects.js +43 -0
  309. package/dist/runtime/telemetry/metrics.d.ts +52 -0
  310. package/dist/runtime/telemetry/metrics.js +138 -0
  311. package/dist/runtime/telemetry/routes.d.ts +19 -0
  312. package/dist/runtime/telemetry/routes.js +18 -0
  313. package/dist/runtime/telemetry/sampler.d.ts +26 -0
  314. package/dist/runtime/telemetry/sampler.js +101 -0
  315. package/dist/runtime/telemetry/spans.d.ts +38 -0
  316. package/dist/runtime/telemetry/spans.js +44 -0
  317. package/dist/runtime/telemetry/usage.d.ts +52 -0
  318. package/dist/runtime/telemetry/usage.js +30 -0
  319. package/dist/runtime/topology/admission.d.ts +13 -0
  320. package/dist/runtime/topology/admission.js +36 -0
  321. package/dist/runtime/topology/locks.d.ts +56 -0
  322. package/dist/runtime/topology/locks.js +81 -0
  323. package/dist/runtime/topology/messages.d.ts +15 -0
  324. package/dist/runtime/topology/messages.js +32 -0
  325. package/dist/runtime/turn/admission.d.ts +22 -0
  326. package/dist/runtime/turn/admission.js +41 -0
  327. package/dist/runtime/turn/blobs.d.ts +38 -0
  328. package/dist/runtime/turn/blobs.js +215 -0
  329. package/dist/runtime/turn/execute.d.ts +208 -0
  330. package/dist/runtime/turn/execute.js +972 -0
  331. package/dist/runtime/turn/group.d.ts +165 -0
  332. package/dist/runtime/turn/group.js +326 -0
  333. package/dist/runtime/turn/hooks.d.ts +44 -0
  334. package/dist/runtime/turn/hooks.js +28 -0
  335. package/dist/runtime/turn/outbox.d.ts +159 -0
  336. package/dist/runtime/turn/outbox.js +269 -0
  337. package/dist/runtime/turn/pipeline.d.ts +68 -0
  338. package/dist/runtime/turn/pipeline.js +83 -0
  339. package/dist/runtime/turn/receipt.d.ts +81 -0
  340. package/dist/runtime/turn/receipt.js +32 -0
  341. package/dist/runtime/turn/relay.d.ts +179 -0
  342. package/dist/runtime/turn/relay.js +685 -0
  343. package/dist/runtime/turn/rows.d.ts +43 -0
  344. package/dist/runtime/turn/rows.js +592 -0
  345. package/dist/runtime/workflows/compatibility.d.ts +125 -0
  346. package/dist/runtime/workflows/compatibility.js +285 -0
  347. package/dist/runtime/workflows/engine.d.ts +107 -0
  348. package/dist/runtime/workflows/engine.js +826 -0
  349. package/dist/runtime/workflows/manifest.d.ts +34 -0
  350. package/dist/runtime/workflows/manifest.js +39 -0
  351. package/dist/runtime/workflows/steps.d.ts +33 -0
  352. package/dist/runtime/workflows/steps.js +152 -0
  353. package/dist/serve/api.d.ts +99 -0
  354. package/dist/serve/api.js +403 -0
  355. package/dist/serve/assertion/binding.d.ts +41 -0
  356. package/dist/serve/assertion/binding.js +92 -0
  357. package/dist/serve/assertion/verify.d.ts +93 -0
  358. package/dist/serve/assertion/verify.js +189 -0
  359. package/dist/serve/auth.d.ts +200 -0
  360. package/dist/serve/auth.js +92 -0
  361. package/dist/serve/clock.d.ts +10 -0
  362. package/dist/serve/clock.js +25 -0
  363. package/dist/serve/jwt.d.ts +65 -0
  364. package/dist/serve/jwt.js +202 -0
  365. package/dist/serve/layer.d.ts +98 -0
  366. package/dist/serve/layer.js +809 -0
  367. package/dist/serve/mcp/endpoint.d.ts +39 -0
  368. package/dist/serve/mcp/endpoint.js +187 -0
  369. package/dist/serve/mcp/tools.d.ts +37 -0
  370. package/dist/serve/mcp/tools.js +125 -0
  371. package/dist/serve/origin.d.ts +6 -0
  372. package/dist/serve/origin.js +21 -0
  373. package/dist/serve/sessions/feed.d.ts +79 -0
  374. package/dist/serve/sessions/feed.js +115 -0
  375. package/dist/serve/sessions/socket.d.ts +56 -0
  376. package/dist/serve/sessions/socket.js +212 -0
  377. package/dist/serve/sessions/sse.d.ts +27 -0
  378. package/dist/serve/sessions/sse.js +26 -0
  379. package/dist/serve/sessions/stream.d.ts +9 -0
  380. package/dist/serve/sessions/stream.js +9 -0
  381. package/dist/serve/sessions/watch.d.ts +12 -0
  382. package/dist/serve/sessions/watch.js +11 -0
  383. package/dist/serve/wire.d.ts +16 -0
  384. package/dist/serve/wire.js +50 -0
  385. package/dist/state/blob.d.ts +71 -0
  386. package/dist/state/blob.js +0 -0
  387. package/dist/state/migration.d.ts +53 -0
  388. package/dist/state/migration.js +29 -0
  389. package/dist/tables/fleet.d.ts +170 -0
  390. package/dist/tables/fleet.js +214 -0
  391. package/dist/tables/owned.d.ts +250 -0
  392. package/dist/tables/owned.js +233 -0
  393. package/dist/testing/actor-test.d.ts +360 -0
  394. package/dist/testing/actor-test.js +337 -0
  395. package/dist/testing/cluster.d.ts +93 -0
  396. package/dist/testing/cluster.js +296 -0
  397. package/dist/testing/conformance/access.d.ts +5 -0
  398. package/dist/testing/conformance/access.js +531 -0
  399. package/dist/testing/conformance/admission.d.ts +11 -0
  400. package/dist/testing/conformance/admission.js +182 -0
  401. package/dist/testing/conformance/adoption.d.ts +2 -0
  402. package/dist/testing/conformance/adoption.js +1019 -0
  403. package/dist/testing/conformance/assertions.d.ts +202 -0
  404. package/dist/testing/conformance/assertions.js +849 -0
  405. package/dist/testing/conformance/batches.d.ts +41 -0
  406. package/dist/testing/conformance/batches.js +388 -0
  407. package/dist/testing/conformance/blobs.d.ts +14 -0
  408. package/dist/testing/conformance/blobs.js +405 -0
  409. package/dist/testing/conformance/capacity.d.ts +8 -0
  410. package/dist/testing/conformance/capacity.js +433 -0
  411. package/dist/testing/conformance/client.d.ts +5 -0
  412. package/dist/testing/conformance/client.js +719 -0
  413. package/dist/testing/conformance/cold-serve.d.ts +16 -0
  414. package/dist/testing/conformance/cold-serve.js +254 -0
  415. package/dist/testing/conformance/connections/actors.d.ts +1143 -0
  416. package/dist/testing/conformance/connections/actors.js +180 -0
  417. package/dist/testing/conformance/connections/harness.d.ts +1754 -0
  418. package/dist/testing/conformance/connections/harness.js +142 -0
  419. package/dist/testing/conformance/connections/holders.d.ts +4 -0
  420. package/dist/testing/conformance/connections/holders.js +165 -0
  421. package/dist/testing/conformance/connections/lifecycle.d.ts +4 -0
  422. package/dist/testing/conformance/connections/lifecycle.js +113 -0
  423. package/dist/testing/conformance/connections/limits.d.ts +4 -0
  424. package/dist/testing/conformance/connections/limits.js +127 -0
  425. package/dist/testing/conformance/connections/reauthorization.d.ts +4 -0
  426. package/dist/testing/conformance/connections/reauthorization.js +170 -0
  427. package/dist/testing/conformance/connections/resync.d.ts +4 -0
  428. package/dist/testing/conformance/connections/resync.js +360 -0
  429. package/dist/testing/conformance/connections/takeover.d.ts +4 -0
  430. package/dist/testing/conformance/connections/takeover.js +287 -0
  431. package/dist/testing/conformance/connections.d.ts +4 -0
  432. package/dist/testing/conformance/connections.js +15 -0
  433. package/dist/testing/conformance/content-blobs.d.ts +16 -0
  434. package/dist/testing/conformance/content-blobs.js +534 -0
  435. package/dist/testing/conformance/counter.d.ts +16 -0
  436. package/dist/testing/conformance/counter.js +813 -0
  437. package/dist/testing/conformance/cron.d.ts +5 -0
  438. package/dist/testing/conformance/cron.js +665 -0
  439. package/dist/testing/conformance/drain.d.ts +26 -0
  440. package/dist/testing/conformance/drain.js +540 -0
  441. package/dist/testing/conformance/effect-control.d.ts +38 -0
  442. package/dist/testing/conformance/effect-control.js +1059 -0
  443. package/dist/testing/conformance/effects.d.ts +23 -0
  444. package/dist/testing/conformance/effects.js +432 -0
  445. package/dist/testing/conformance/events.d.ts +28 -0
  446. package/dist/testing/conformance/events.js +335 -0
  447. package/dist/testing/conformance/export.d.ts +2 -0
  448. package/dist/testing/conformance/export.js +368 -0
  449. package/dist/testing/conformance/fleet.d.ts +444 -0
  450. package/dist/testing/conformance/fleet.js +1009 -0
  451. package/dist/testing/conformance/groups.d.ts +7 -0
  452. package/dist/testing/conformance/groups.js +353 -0
  453. package/dist/testing/conformance/heap.d.ts +3 -0
  454. package/dist/testing/conformance/heap.js +149 -0
  455. package/dist/testing/conformance/http.d.ts +2809 -0
  456. package/dist/testing/conformance/http.js +1234 -0
  457. package/dist/testing/conformance/inspection-views.d.ts +8 -0
  458. package/dist/testing/conformance/inspection-views.js +272 -0
  459. package/dist/testing/conformance/inspector.d.ts +7 -0
  460. package/dist/testing/conformance/inspector.js +650 -0
  461. package/dist/testing/conformance/mint.d.ts +58 -0
  462. package/dist/testing/conformance/mint.js +692 -0
  463. package/dist/testing/conformance/multi-runner.d.ts +8 -0
  464. package/dist/testing/conformance/multi-runner.js +403 -0
  465. package/dist/testing/conformance/neki/plan.d.ts +19 -0
  466. package/dist/testing/conformance/neki/plan.js +30 -0
  467. package/dist/testing/conformance/observability.d.ts +3 -0
  468. package/dist/testing/conformance/observability.js +343 -0
  469. package/dist/testing/conformance/offline.d.ts +4 -0
  470. package/dist/testing/conformance/offline.js +474 -0
  471. package/dist/testing/conformance/operator-harness.d.ts +57 -0
  472. package/dist/testing/conformance/operator-harness.js +78 -0
  473. package/dist/testing/conformance/operator.d.ts +3 -0
  474. package/dist/testing/conformance/operator.js +379 -0
  475. package/dist/testing/conformance/outbox-cross-shard.d.ts +14 -0
  476. package/dist/testing/conformance/outbox-cross-shard.js +160 -0
  477. package/dist/testing/conformance/outbox.d.ts +36 -0
  478. package/dist/testing/conformance/outbox.js +437 -0
  479. package/dist/testing/conformance/payload-migrations.d.ts +3 -0
  480. package/dist/testing/conformance/payload-migrations.js +612 -0
  481. package/dist/testing/conformance/pipeline.d.ts +3 -0
  482. package/dist/testing/conformance/pipeline.js +1040 -0
  483. package/dist/testing/conformance/placement.d.ts +22 -0
  484. package/dist/testing/conformance/placement.js +539 -0
  485. package/dist/testing/conformance/platform.d.ts +40 -0
  486. package/dist/testing/conformance/platform.js +101 -0
  487. package/dist/testing/conformance/progress.d.ts +39 -0
  488. package/dist/testing/conformance/progress.js +666 -0
  489. package/dist/testing/conformance/properties.d.ts +6 -0
  490. package/dist/testing/conformance/properties.js +295 -0
  491. package/dist/testing/conformance/protocols.d.ts +4 -0
  492. package/dist/testing/conformance/protocols.js +618 -0
  493. package/dist/testing/conformance/provider/advertise.d.ts +21 -0
  494. package/dist/testing/conformance/provider/advertise.js +44 -0
  495. package/dist/testing/conformance/read-your-writes.d.ts +20 -0
  496. package/dist/testing/conformance/read-your-writes.js +192 -0
  497. package/dist/testing/conformance/reducers.d.ts +8 -0
  498. package/dist/testing/conformance/reducers.js +258 -0
  499. package/dist/testing/conformance/relay.d.ts +42 -0
  500. package/dist/testing/conformance/relay.js +1115 -0
  501. package/dist/testing/conformance/restore.d.ts +43 -0
  502. package/dist/testing/conformance/restore.js +341 -0
  503. package/dist/testing/conformance/retention.d.ts +14 -0
  504. package/dist/testing/conformance/retention.js +463 -0
  505. package/dist/testing/conformance/rls.d.ts +24 -0
  506. package/dist/testing/conformance/rls.js +576 -0
  507. package/dist/testing/conformance/simulation.d.ts +31 -0
  508. package/dist/testing/conformance/simulation.js +167 -0
  509. package/dist/testing/conformance/single-shard.d.ts +2 -0
  510. package/dist/testing/conformance/single-shard.js +125 -0
  511. package/dist/testing/conformance/singleton.d.ts +3 -0
  512. package/dist/testing/conformance/singleton.js +293 -0
  513. package/dist/testing/conformance/statements.d.ts +60 -0
  514. package/dist/testing/conformance/statements.js +108 -0
  515. package/dist/testing/conformance/streams.d.ts +7 -0
  516. package/dist/testing/conformance/streams.js +280 -0
  517. package/dist/testing/conformance/subscriptions/access.d.ts +4 -0
  518. package/dist/testing/conformance/subscriptions/access.js +98 -0
  519. package/dist/testing/conformance/subscriptions/actors.d.ts +4910 -0
  520. package/dist/testing/conformance/subscriptions/actors.js +372 -0
  521. package/dist/testing/conformance/subscriptions/cluster.d.ts +4 -0
  522. package/dist/testing/conformance/subscriptions/cluster.js +89 -0
  523. package/dist/testing/conformance/subscriptions/delivery.d.ts +4 -0
  524. package/dist/testing/conformance/subscriptions/delivery.js +253 -0
  525. package/dist/testing/conformance/subscriptions/deploys.d.ts +4 -0
  526. package/dist/testing/conformance/subscriptions/deploys.js +162 -0
  527. package/dist/testing/conformance/subscriptions/epochs.d.ts +4 -0
  528. package/dist/testing/conformance/subscriptions/epochs.js +169 -0
  529. package/dist/testing/conformance/subscriptions/failures.d.ts +4 -0
  530. package/dist/testing/conformance/subscriptions/failures.js +108 -0
  531. package/dist/testing/conformance/subscriptions/feeds.d.ts +4 -0
  532. package/dist/testing/conformance/subscriptions/feeds.js +218 -0
  533. package/dist/testing/conformance/subscriptions/harness.d.ts +124 -0
  534. package/dist/testing/conformance/subscriptions/harness.js +143 -0
  535. package/dist/testing/conformance/subscriptions/operator.d.ts +4 -0
  536. package/dist/testing/conformance/subscriptions/operator.js +128 -0
  537. package/dist/testing/conformance/subscriptions/retention.d.ts +4 -0
  538. package/dist/testing/conformance/subscriptions/retention.js +288 -0
  539. package/dist/testing/conformance/subscriptions/routing.d.ts +4 -0
  540. package/dist/testing/conformance/subscriptions/routing.js +179 -0
  541. package/dist/testing/conformance/subscriptions.d.ts +4 -0
  542. package/dist/testing/conformance/subscriptions.js +19 -0
  543. package/dist/testing/conformance/tables.d.ts +125 -0
  544. package/dist/testing/conformance/tables.js +664 -0
  545. package/dist/testing/conformance/transports/actors.d.ts +1907 -0
  546. package/dist/testing/conformance/transports/actors.js +163 -0
  547. package/dist/testing/conformance/transports/client.d.ts +3 -0
  548. package/dist/testing/conformance/transports/client.js +237 -0
  549. package/dist/testing/conformance/transports/feeds.d.ts +3 -0
  550. package/dist/testing/conformance/transports/feeds.js +232 -0
  551. package/dist/testing/conformance/transports/harness.d.ts +93 -0
  552. package/dist/testing/conformance/transports/harness.js +84 -0
  553. package/dist/testing/conformance/transports/streams.d.ts +3 -0
  554. package/dist/testing/conformance/transports/streams.js +96 -0
  555. package/dist/testing/conformance/transports/websocket.d.ts +3 -0
  556. package/dist/testing/conformance/transports/websocket.js +384 -0
  557. package/dist/testing/conformance/transports/wire.d.ts +141 -0
  558. package/dist/testing/conformance/transports/wire.js +204 -0
  559. package/dist/testing/conformance/transports.d.ts +3 -0
  560. package/dist/testing/conformance/transports.js +11 -0
  561. package/dist/testing/conformance/watch.d.ts +59 -0
  562. package/dist/testing/conformance/watch.js +879 -0
  563. package/dist/testing/conformance/workflow-engine.d.ts +97 -0
  564. package/dist/testing/conformance/workflow-engine.js +253 -0
  565. package/dist/testing/conformance/workflow-versions.d.ts +3 -0
  566. package/dist/testing/conformance/workflow-versions.js +545 -0
  567. package/dist/testing/conformance/workflows/access.d.ts +4 -0
  568. package/dist/testing/conformance/workflows/access.js +147 -0
  569. package/dist/testing/conformance/workflows/actors.d.ts +2317 -0
  570. package/dist/testing/conformance/workflows/actors.js +305 -0
  571. package/dist/testing/conformance/workflows/basics.d.ts +4 -0
  572. package/dist/testing/conformance/workflows/basics.js +144 -0
  573. package/dist/testing/conformance/workflows/engine.d.ts +4 -0
  574. package/dist/testing/conformance/workflows/engine.js +80 -0
  575. package/dist/testing/conformance/workflows/guards.d.ts +4 -0
  576. package/dist/testing/conformance/workflows/guards.js +172 -0
  577. package/dist/testing/conformance/workflows/harness.d.ts +14 -0
  578. package/dist/testing/conformance/workflows/harness.js +44 -0
  579. package/dist/testing/conformance/workflows/recovery.d.ts +4 -0
  580. package/dist/testing/conformance/workflows/recovery.js +181 -0
  581. package/dist/testing/conformance/workflows/starts.d.ts +4 -0
  582. package/dist/testing/conformance/workflows/starts.js +57 -0
  583. package/dist/testing/conformance/workflows/suspension.d.ts +4 -0
  584. package/dist/testing/conformance/workflows/suspension.js +106 -0
  585. package/dist/testing/conformance/workflows/waits.d.ts +4 -0
  586. package/dist/testing/conformance/workflows/waits.js +284 -0
  587. package/dist/testing/conformance/workflows.d.ts +4 -0
  588. package/dist/testing/conformance/workflows.js +19 -0
  589. package/dist/testing/conformance.d.ts +330 -0
  590. package/dist/testing/conformance.js +364 -0
  591. package/dist/testing/database.d.ts +31 -0
  592. package/dist/testing/database.js +70 -0
  593. package/dist/testing/foundation.d.ts +41 -0
  594. package/dist/testing/foundation.js +517 -0
  595. package/dist/testing/index.d.ts +20 -0
  596. package/dist/testing/index.js +12 -0
  597. package/dist/testing/property.d.ts +40 -0
  598. package/dist/testing/property.js +95 -0
  599. package/dist/testing/simulate-cluster.d.ts +112 -0
  600. package/dist/testing/simulate-cluster.js +257 -0
  601. package/dist/testing/simulate.d.ts +90 -0
  602. package/dist/testing/simulate.js +127 -0
  603. package/package.json +1 -0
@@ -0,0 +1,39 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { Headers, HttpServerResponse } from "effect/http";
3
+ import type { McpTool } from "./tools.ts";
4
+ /** The MCP revision this endpoint speaks. */
5
+ export declare const MCP_VERSION = "2026-07-28";
6
+ /** What a tool call runs with, after its arguments passed the tool's own parameters. */
7
+ export interface ToolCall {
8
+ readonly tool: McpTool;
9
+ readonly id: string | undefined;
10
+ readonly commandId: string | undefined;
11
+ readonly input: Schema.Json | undefined;
12
+ }
13
+ /** A tool call's outcome as the same JSON its HTTP route answers: the value on success, an error body otherwise. */
14
+ export type ToolResult = {
15
+ readonly ok: true;
16
+ readonly value: Schema.Json | undefined;
17
+ } | {
18
+ readonly ok: false;
19
+ readonly body: Schema.Json;
20
+ };
21
+ interface McpEndpoint {
22
+ readonly tools: ReadonlyArray<McpTool>;
23
+ readonly info: {
24
+ readonly name: string;
25
+ readonly version: string;
26
+ };
27
+ readonly call: (call: ToolCall) => Effect.Effect<ToolResult>;
28
+ }
29
+ /**
30
+ * Answers one MCP request over Streamable HTTP for the caller the endpoint's
31
+ * route already authenticated. The revision is stateless: every request names
32
+ * its protocol version, so there is no handshake, session, or stream, and a
33
+ * tool call is one HTTP response. A notification is accepted and ignored.
34
+ */
35
+ export declare const handleMcp: (endpoint: McpEndpoint, request: {
36
+ readonly headers: Headers.Headers;
37
+ readonly body: Uint8Array;
38
+ }) => Effect.Effect<HttpServerResponse.HttpServerResponse, never, never>;
39
+ export {};
@@ -0,0 +1,187 @@
1
+ import { Effect, Option, Result, Schema } from "effect";
2
+ import { Base64 } from "effect/encoding";
3
+ import { Headers, HttpServerResponse } from "effect/http";
4
+ import { ActorError, InvalidInput } from "../../errors/actor.js";
5
+ import { actorErrorBody } from "../../protocol/wire.js";
6
+ import { invalidInput, undecodable } from "../wire.js";
7
+ /** The MCP revision this endpoint speaks. */
8
+ export const MCP_VERSION = "2026-07-28";
9
+ const PARSE_ERROR = -32700;
10
+ const INVALID_REQUEST = -32600;
11
+ const METHOD_NOT_FOUND = -32601;
12
+ const INVALID_PARAMS = -32602;
13
+ const HEADER_MISMATCH = -32020;
14
+ const UNSUPPORTED_VERSION = -32022;
15
+ const VERSION_META = "io.modelcontextprotocol/protocolVersion";
16
+ const CAPABILITIES_META = "io.modelcontextprotocol/clientCapabilities";
17
+ const SERVER_INFO_META = "io.modelcontextprotocol/serverInfo";
18
+ const BASE64_SENTINEL = /^=\?base64\?(.*)\?=$/;
19
+ const strictUtf8 = new TextDecoder("utf-8", { fatal: true });
20
+ const Message = Schema.Struct({
21
+ jsonrpc: Schema.Literal("2.0"),
22
+ id: Schema.optionalKey(Schema.Union([Schema.String, Schema.Finite])),
23
+ method: Schema.String,
24
+ params: Schema.optionalKey(Schema.Record(Schema.String, Schema.Json)),
25
+ });
26
+ const Params = Schema.Struct({
27
+ _meta: Schema.Struct({
28
+ [VERSION_META]: Schema.String,
29
+ [CAPABILITIES_META]: Schema.Record(Schema.String, Schema.Json),
30
+ }),
31
+ });
32
+ const ListParams = Schema.Struct({ cursor: Schema.optionalKey(Schema.String) });
33
+ const CallParams = Schema.Struct({
34
+ name: Schema.String,
35
+ arguments: Schema.optionalKey(Schema.Record(Schema.String, Schema.Json)),
36
+ });
37
+ const Arguments = Schema.Struct({
38
+ id: Schema.optionalKey(Schema.String),
39
+ commandId: Schema.optionalKey(Schema.String),
40
+ input: Schema.optionalKey(Schema.Json),
41
+ });
42
+ const decodeText = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Json));
43
+ const decodeMessage = Schema.decodeUnknownEffect(Message);
44
+ const decodeParams = Schema.decodeUnknownEffect(Params);
45
+ const decodeListParams = Schema.decodeUnknownEffect(ListParams);
46
+ const decodeCallParams = Schema.decodeUnknownEffect(CallParams);
47
+ const decodeArguments = Schema.decodeUnknownEffect(Arguments);
48
+ const rpcFailure = (failure) => HttpServerResponse.jsonUnsafe({
49
+ jsonrpc: "2.0",
50
+ id: failure.id ?? null,
51
+ error: { code: failure.code, message: failure.message, data: failure.data },
52
+ }, { status: failure.status });
53
+ const rpcResult = (id, result) => HttpServerResponse.jsonUnsafe({ jsonrpc: "2.0", id, result });
54
+ const mismatch = (id, message) => rpcFailure({ id, status: 400, code: HEADER_MISMATCH, message: `Header mismatch: ${message}` });
55
+ const invalidParams = (id, message) => rpcFailure({ id, status: 400, code: INVALID_PARAMS, message });
56
+ const argumentError = (path, message) => ActorError.make({ reason: InvalidInput.make({ code: "decode", issues: [{ path, message }] }) });
57
+ /** The value a header carries, decoded when a client sent it in the Base64 sentinel form. */
58
+ const headerValue = (value) => {
59
+ const encoded = BASE64_SENTINEL.exec(value)?.[1];
60
+ if (encoded === undefined)
61
+ return Option.some(value);
62
+ return Result.match(Base64.decodeString(encoded), {
63
+ onFailure: () => Option.none(),
64
+ onSuccess: Option.some,
65
+ });
66
+ };
67
+ /**
68
+ * Checks a call's arguments against the parameters its tool advertises, in
69
+ * the order the HTTP route checks its own: a command without a command id is
70
+ * `missing_command_id`, and every other fault names the argument.
71
+ */
72
+ const toolCall = Effect.fnUntraced(function* (tool, args) {
73
+ const allowed = new Set();
74
+ if (tool.takesId)
75
+ allowed.add("id");
76
+ if (tool.takesCommandId)
77
+ allowed.add("commandId");
78
+ if (tool.input !== "none")
79
+ allowed.add("input");
80
+ const unexpected = Object.keys(args).find((key) => !allowed.has(key));
81
+ if (unexpected !== undefined)
82
+ return yield* argumentError(unexpected, "Unexpected key");
83
+ const { id, commandId, input } = yield* decodeArguments(args).pipe(Effect.mapError((error) => undecodable(error)));
84
+ if (tool.takesId && id === undefined)
85
+ return yield* argumentError("id", "Missing key");
86
+ if (tool.takesCommandId && commandId === undefined)
87
+ return yield* invalidInput("missing_command_id");
88
+ if (tool.input === "required" && input === undefined)
89
+ return yield* argumentError("input", "Missing key");
90
+ return { tool, id, commandId, input };
91
+ });
92
+ const toolResult = (tool, result, _meta) => {
93
+ if (!result.ok)
94
+ return {
95
+ resultType: "complete",
96
+ content: [{ type: "text", text: JSON.stringify(result.body) }],
97
+ isError: true,
98
+ _meta,
99
+ };
100
+ if (result.value === undefined)
101
+ return { resultType: "complete", content: [], _meta };
102
+ const content = [{ type: "text", text: JSON.stringify(result.value) }];
103
+ return tool.structured
104
+ ? { resultType: "complete", content, structuredContent: result.value, _meta }
105
+ : { resultType: "complete", content, _meta };
106
+ };
107
+ /**
108
+ * Answers one MCP request over Streamable HTTP for the caller the endpoint's
109
+ * route already authenticated. The revision is stateless: every request names
110
+ * its protocol version, so there is no handshake, session, or stream, and a
111
+ * tool call is one HTTP response. A notification is accepted and ignored.
112
+ */
113
+ export const handleMcp = Effect.fnUntraced(function* (endpoint, request) {
114
+ const json = yield* Effect.try(() => strictUtf8.decode(request.body)).pipe(Effect.flatMap(decodeText), Effect.option);
115
+ if (Option.isNone(json))
116
+ return rpcFailure({ id: undefined, status: 400, code: PARSE_ERROR, message: "Parse error" });
117
+ const parsed = yield* decodeMessage(json.value).pipe(Effect.option);
118
+ if (Option.isNone(parsed))
119
+ return rpcFailure({
120
+ id: undefined,
121
+ status: 400,
122
+ code: INVALID_REQUEST,
123
+ message: "Invalid request",
124
+ });
125
+ const message = parsed.value;
126
+ const id = message.id;
127
+ if (id === undefined)
128
+ return HttpServerResponse.empty({ status: 202 });
129
+ const meta = yield* decodeParams(message.params ?? {}).pipe(Effect.option);
130
+ if (Option.isNone(meta))
131
+ return invalidParams(id, `Missing ${VERSION_META} or ${CAPABILITIES_META} in _meta`);
132
+ const requested = meta.value._meta[VERSION_META];
133
+ const versionHeader = Headers.get(request.headers, "mcp-protocol-version");
134
+ if (Option.isNone(versionHeader))
135
+ return mismatch(id, "MCP-Protocol-Version is required");
136
+ if (versionHeader.value.trim() !== requested)
137
+ return mismatch(id, "MCP-Protocol-Version does not match the request's protocol version");
138
+ if (requested !== MCP_VERSION)
139
+ return rpcFailure({
140
+ id,
141
+ status: 400,
142
+ code: UNSUPPORTED_VERSION,
143
+ message: "Unsupported protocol version",
144
+ data: { supported: [MCP_VERSION], requested },
145
+ });
146
+ const methodHeader = Headers.get(request.headers, "mcp-method");
147
+ if (Option.isNone(methodHeader) || methodHeader.value !== message.method)
148
+ return mismatch(id, "Mcp-Method does not match the request's method");
149
+ const serverInfo = { [SERVER_INFO_META]: endpoint.info };
150
+ if (message.method === "server/discover")
151
+ return rpcResult(id, {
152
+ resultType: "complete",
153
+ supportedVersions: [MCP_VERSION],
154
+ capabilities: { tools: {} },
155
+ ttlMs: 0,
156
+ cacheScope: "public",
157
+ _meta: serverInfo,
158
+ });
159
+ if (message.method === "tools/list") {
160
+ const list = yield* decodeListParams(message.params ?? {}).pipe(Effect.option);
161
+ if (Option.isNone(list) || list.value.cursor !== undefined)
162
+ return invalidParams(id, "Invalid params");
163
+ return rpcResult(id, {
164
+ resultType: "complete",
165
+ tools: endpoint.tools.map((tool) => tool.descriptor),
166
+ ttlMs: 0,
167
+ cacheScope: "public",
168
+ _meta: serverInfo,
169
+ });
170
+ }
171
+ if (message.method !== "tools/call")
172
+ return rpcFailure({ id, status: 404, code: METHOD_NOT_FOUND, message: "Method not found" });
173
+ const params = yield* decodeCallParams(message.params ?? {}).pipe(Effect.option);
174
+ if (Option.isNone(params))
175
+ return invalidParams(id, "Invalid params");
176
+ const nameHeader = Option.flatMap(Headers.get(request.headers, "mcp-name"), headerValue);
177
+ if (Option.isNone(nameHeader) || nameHeader.value !== params.value.name)
178
+ return mismatch(id, "Mcp-Name does not match the request's tool name");
179
+ const tool = endpoint.tools.find((candidate) => candidate.name === params.value.name);
180
+ if (tool === undefined)
181
+ return invalidParams(id, `Unknown tool: ${params.value.name}`);
182
+ const call = yield* toolCall(tool, params.value.arguments ?? {}).pipe(Effect.result);
183
+ const result = Result.isFailure(call)
184
+ ? { ok: false, body: yield* actorErrorBody(call.failure) }
185
+ : yield* endpoint.call(call.success);
186
+ return rpcResult(id, toolResult(tool, result, serverInfo));
187
+ });
@@ -0,0 +1,37 @@
1
+ import { Effect, Schema } from "effect";
2
+ import type { ServedDefinition, ServedMember } from "../../actor/served.ts";
3
+ /** What a tool call's `input` argument carries. */
4
+ type ToolInput = "none" | "optional" | "required";
5
+ /** The served member a tool runs. */
6
+ interface ToolRoute {
7
+ readonly definition: ServedDefinition;
8
+ readonly member: ServedMember;
9
+ }
10
+ /** One MCP tool with the arguments its OpenAPI operation takes. */
11
+ export interface McpTool {
12
+ readonly name: string;
13
+ /** The tool as `tools/list` describes it. */
14
+ readonly descriptor: Schema.JsonObject;
15
+ /** Whether the tool declares an output schema, so its result carries structured content. */
16
+ readonly structured: boolean;
17
+ /** The member the tool runs; absent for the tool that mints command ids. */
18
+ readonly route: ToolRoute | undefined;
19
+ /** Whether the call names the actor, which every operation with an `{id}` path parameter needs. */
20
+ readonly takesId: boolean;
21
+ /** Whether the call carries a command id, which every operation with an `Idempotency-Key` header needs. */
22
+ readonly takesCommandId: boolean;
23
+ readonly input: ToolInput;
24
+ }
25
+ /**
26
+ * The MCP tools of a served OpenAPI document: one per public command,
27
+ * reducer, and query, and one that mints command ids. Each tool takes exactly
28
+ * the parameters and body its operation takes, and its schemas are that
29
+ * operation's, so the two protocols cannot describe a member differently.
30
+ * Internal members have no operation and so no tool.
31
+ */
32
+ export declare const mcpTools: (options: {
33
+ readonly document: unknown;
34
+ readonly basePath: string;
35
+ readonly definitions: ReadonlyArray<ServedDefinition>;
36
+ }) => Effect.Effect<McpTool[], never, never>;
37
+ export {};
@@ -0,0 +1,125 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { memberPath, MINT_OPERATION } from "../api.js";
3
+ const JsonObject = Schema.Record(Schema.String, Schema.Json);
4
+ const Content = Schema.Struct({
5
+ "application/json": Schema.optionalKey(Schema.Struct({ schema: JsonObject })),
6
+ });
7
+ const Operation = Schema.Struct({
8
+ parameters: Schema.optionalKey(Schema.Array(Schema.Struct({
9
+ name: Schema.String,
10
+ in: Schema.String,
11
+ schema: Schema.optionalKey(Schema.Struct({ description: Schema.optionalKey(Schema.String) })),
12
+ }))),
13
+ requestBody: Schema.optionalKey(Schema.Struct({ required: Schema.optionalKey(Schema.Boolean), content: Content })),
14
+ responses: Schema.Struct({
15
+ "200": Schema.optionalKey(Schema.Struct({ content: Schema.optionalKey(Content) })),
16
+ }),
17
+ });
18
+ /** The parts of a served OpenAPI document that tools are derived from. */
19
+ const Document = Schema.Struct({
20
+ paths: Schema.Record(Schema.String, Schema.Struct({ post: Schema.optionalKey(Operation) })),
21
+ components: Schema.Struct({ schemas: Schema.Record(Schema.String, JsonObject) }),
22
+ });
23
+ const decodeDocument = Schema.decodeUnknownEffect(Document);
24
+ const decodeObject = Schema.decodeUnknownEffect(Schema.fromJsonString(JsonObject));
25
+ const encodeText = Schema.encodeEffect(Schema.fromJsonString(Schema.Json));
26
+ const COMMAND_ID_PARAMETER = "idempotency-key";
27
+ const REFERENCE = /"\$ref":"#\/components\/schemas\/([^"]+)"/g;
28
+ const REFERENCE_TARGET = '"$ref":"#/$defs/$1"';
29
+ /**
30
+ * A schema a tool can carry alone. A tool list has no document for a `$ref`
31
+ * to resolve against, so the components a schema references, and the ones
32
+ * those reference, move into its `$defs`. A reference is a `$ref` property
33
+ * whose value is a whole string, so scanning the serialized schema finds them
34
+ * all.
35
+ */
36
+ const standalone = Effect.fnUntraced(function* (schema, components) {
37
+ const names = [];
38
+ const pending = [yield* encodeText(schema)];
39
+ for (let index = 0; index < pending.length; index += 1)
40
+ for (const [, name = ""] of pending[index].matchAll(REFERENCE)) {
41
+ if (names.includes(name))
42
+ continue;
43
+ names.push(name);
44
+ pending.push(yield* encodeText(components[name]));
45
+ }
46
+ const defs = Object.fromEntries(names.map((name) => [name, components[name]]));
47
+ const carried = names.length === 0 ? schema : Object.assign({}, schema, { $defs: defs });
48
+ const text = yield* encodeText(carried);
49
+ return yield* decodeObject(text.replaceAll(REFERENCE, REFERENCE_TARGET));
50
+ }, Effect.orDie);
51
+ const toolDescription = (name, kind) => kind === "query"
52
+ ? `Reads ${name}. It takes no command id and is safe to retry.`
53
+ : `Runs ${name} once per commandId. Retrying with the same commandId and input returns the stored result without running it again; the same commandId with different input is refused, and an expired commandId is never replaced.`;
54
+ const MINT_DESCRIPTION = "Mints a command id. Send it with a command call and reuse it, with the same input, on every retry of that call; a new id is a new operation.";
55
+ const ID_DESCRIPTION = "The actor's id: the key the served route takes as its `{id}` path segment.";
56
+ /**
57
+ * The MCP tools of a served OpenAPI document: one per public command,
58
+ * reducer, and query, and one that mints command ids. Each tool takes exactly
59
+ * the parameters and body its operation takes, and its schemas are that
60
+ * operation's, so the two protocols cannot describe a member differently.
61
+ * Internal members have no operation and so no tool.
62
+ */
63
+ export const mcpTools = Effect.fnUntraced(function* (options) {
64
+ const { paths, components } = yield* decodeDocument(options.document).pipe(Effect.orDie);
65
+ const derive = Effect.fnUntraced(function* (path, route) {
66
+ const operation = paths[path]?.post;
67
+ if (operation === undefined)
68
+ return yield* Effect.die(new Error(`Actor.serve: the OpenAPI document has no POST operation at ${path}`));
69
+ const parameters = operation.parameters ?? [];
70
+ const takesId = parameters.some((parameter) => parameter.in === "path" && parameter.name === "id");
71
+ const commandId = parameters.find((parameter) => parameter.in === "header" && parameter.name === COMMAND_ID_PARAMETER);
72
+ const body = operation.requestBody?.content["application/json"]?.schema;
73
+ const output = operation.responses["200"]?.content?.["application/json"]?.schema;
74
+ const input = body === undefined
75
+ ? "none"
76
+ : operation.requestBody?.required === true
77
+ ? "required"
78
+ : "optional";
79
+ const properties = {};
80
+ const required = [];
81
+ if (takesId) {
82
+ properties["id"] = { type: "string", description: ID_DESCRIPTION };
83
+ required.push("id");
84
+ }
85
+ if (commandId !== undefined) {
86
+ properties["commandId"] = {
87
+ type: "string",
88
+ description: commandId.schema?.description ?? "The command id.",
89
+ };
90
+ required.push("commandId");
91
+ }
92
+ if (body !== undefined)
93
+ properties["input"] = body;
94
+ if (input === "required")
95
+ required.push("input");
96
+ const name = route === undefined ? MINT_OPERATION : `${route.definition.name}.${route.member.tag}`;
97
+ const isQuery = route?.member.kind === "query";
98
+ const base = {
99
+ name,
100
+ description: route === undefined ? MINT_DESCRIPTION : toolDescription(name, route.member.kind),
101
+ inputSchema: yield* standalone({ type: "object", properties, required, additionalProperties: false }, components.schemas),
102
+ annotations: { readOnlyHint: isQuery, idempotentHint: route !== undefined },
103
+ };
104
+ const descriptor = output === undefined
105
+ ? base
106
+ : Object.assign({}, base, { outputSchema: yield* standalone(output, components.schemas) });
107
+ const tool = {
108
+ name,
109
+ descriptor,
110
+ structured: output !== undefined,
111
+ route,
112
+ takesId,
113
+ takesCommandId: commandId !== undefined,
114
+ input,
115
+ };
116
+ return tool;
117
+ });
118
+ const tools = [yield* derive(`${options.basePath}/command-ids`, undefined)];
119
+ for (const definition of options.definitions)
120
+ for (const member of definition.members) {
121
+ const path = `${options.basePath}${memberPath({ definition, member })}`;
122
+ tools.push(yield* derive(path.replace(":id", "{id}"), { definition, member }));
123
+ }
124
+ return tools;
125
+ });
@@ -0,0 +1,6 @@
1
+ import { type HttpServerRequest } from "effect/http";
2
+ /** Same origin means the transport's scheme and the Host header, not forwarded headers. */
3
+ export declare const isSameOrigin: ({ request, origin, }: {
4
+ readonly request: HttpServerRequest.HttpServerRequest;
5
+ readonly origin: string;
6
+ }) => boolean;
@@ -0,0 +1,21 @@
1
+ import { Option, Schema } from "effect";
2
+ import { Headers } from "effect/http";
3
+ const NodeSource = Schema.is(Schema.Struct({
4
+ socket: Schema.Struct({ encrypted: Schema.optionalKey(Schema.Boolean) }),
5
+ }));
6
+ /** The transport's scheme, never a client's forwarded-protocol assertion. */
7
+ const scheme = (request) => {
8
+ if (NodeSource(request.source))
9
+ return request.source.socket.encrypted === true ? "https:" : "http:";
10
+ if (URL.canParse(request.originalUrl))
11
+ return new URL(request.originalUrl).protocol;
12
+ return undefined;
13
+ };
14
+ /** Same origin means the transport's scheme and the Host header, not forwarded headers. */
15
+ export const isSameOrigin = ({ request, origin, }) => {
16
+ const host = Headers.get(request.headers, "host");
17
+ if (Option.isNone(host) || !URL.canParse(origin))
18
+ return false;
19
+ const parsed = new URL(origin);
20
+ return parsed.host === host.value && parsed.protocol === scheme(request);
21
+ };
@@ -0,0 +1,79 @@
1
+ import { Effect, Stream } from "effect";
2
+ import type { ActorError } from "../../errors/actor.ts";
3
+ import { RetentionGap, UnknownCursor } from "../../errors/events.ts";
4
+ import type { InternalActors } from "../../runtime/actors.ts";
5
+ import type { ActorRef, Caller } from "../../identity/caller.ts";
6
+ import type { HeldConnection } from "../../runtime/connections/holder.ts";
7
+ /** At most this many `event` filters per feed. */
8
+ export declare const MAX_FEED_FILTERS = 16;
9
+ /** The JSON body a cursor error is served as, before a stream starts or as a feed's last message. */
10
+ export declare const cursorErrorBody: (error: UnknownCursor | RetentionGap) => Effect.Effect<{
11
+ readonly _tag: "UnknownCursor";
12
+ readonly cursor: string;
13
+ } | {
14
+ readonly _tag: "RetentionGap";
15
+ readonly cursor: string;
16
+ }, never, never>;
17
+ /** What a feed reads and who reads it. */
18
+ interface FeedOptions {
19
+ readonly actors: InternalActors["Service"];
20
+ /** The actor whose committed events the feed serves. */
21
+ readonly ref: ActorRef;
22
+ /** The event tags the feed serves; the holder authorizes each one. */
23
+ readonly tags: ReadonlyArray<string>;
24
+ readonly caller: Caller;
25
+ /** The credential's expiry in epoch milliseconds, which ends the feed. */
26
+ readonly expiresAt: number | undefined;
27
+ }
28
+ /**
29
+ * Opens a feed at this runner's holder: the framework feed member, authorized
30
+ * per event tag, whose row makes the owner broadcast every committed feed
31
+ * event. The actor must already exist; a feed never creates one.
32
+ */
33
+ export declare const openFeed: (options: FeedOptions) => Effect.Effect<{
34
+ connectionId: string;
35
+ cursor: string;
36
+ messages: Stream.Stream<{
37
+ readonly _tag: "Frame";
38
+ readonly frame: string;
39
+ readonly cursor?: string | undefined;
40
+ readonly event?: string | undefined;
41
+ } | {
42
+ readonly _tag: "Progress";
43
+ readonly job: string;
44
+ readonly jobId: string;
45
+ readonly attempt: number;
46
+ readonly seq: number;
47
+ readonly frame: string;
48
+ } | {
49
+ readonly _tag: "Resync";
50
+ readonly after: string | undefined;
51
+ readonly reason: "OwnerLost";
52
+ readonly deadlineMs: number;
53
+ } | {
54
+ readonly _tag: "ResyncReplayed";
55
+ }, ActorError, never>;
56
+ send: (frame: string) => Effect.Effect<void, ActorError, never>;
57
+ resyncDone: Effect.Effect<void, never, never>;
58
+ authorized: Effect.Effect<boolean, never, never>;
59
+ writable: Effect.Effect<void, never, never>;
60
+ reauthenticate: (expiresAt: number | undefined) => Effect.Effect<undefined, ActorError, never>;
61
+ close: Effect.Effect<void, never, never>;
62
+ }, ActorError, never>;
63
+ /**
64
+ * The events of a feed after `after`, as SSE text: first the committed events
65
+ * read from `actor_events`, then live ones from the holder, deduplicated by
66
+ * cursor so the race between the two neither loses nor repeats one. After an
67
+ * owner loss, a gap, or a full buffer, the feed rereads from the last cursor
68
+ * it sent instead of ending, so a client sees one gap-free stream; any other
69
+ * end is its last message. The `actor_events` table is the source of truth: the
70
+ * holder resyncs a feed itself, and once the new owner answers the feed rereads
71
+ * and goes on. A feed lists no job, so the owner never sends it progress.
72
+ */
73
+ export declare const feedStream: ({ options, first, after, }: {
74
+ readonly options: FeedOptions;
75
+ /** The feed the caller opened before its first read, so no commit falls between them. */
76
+ readonly first: HeldConnection;
77
+ readonly after: string | undefined;
78
+ }) => Stream.Stream<Uint8Array<ArrayBufferLike>, never, never>;
79
+ export {};
@@ -0,0 +1,115 @@
1
+ import { Effect, Match, Option, Predicate, Queue, Schema, Stream } from "effect";
2
+ import { RetentionGap, UnknownCursor } from "../../errors/events.js";
3
+ import { FEED_MEMBER, FeedFrame } from "../../runtime/connections/protocol.js";
4
+ import { actorErrorBody } from "../../protocol/wire.js";
5
+ import { message, withKeepalive } from "./sse.js";
6
+ /** Events a feed reads from `actor_events` per statement. */
7
+ const FEED_PAGE = 256;
8
+ /** At most this many `event` filters per feed. */
9
+ export const MAX_FEED_FILTERS = 16;
10
+ const decodeFeedFrame = Schema.decodeEffect(Schema.fromJsonString(FeedFrame));
11
+ const decodeStored = Schema.decodeEffect(Schema.fromJsonString(Schema.Json));
12
+ const encodeCursorError = Schema.encodeEffect(Schema.Union([UnknownCursor, RetentionGap]));
13
+ /** The JSON body a cursor error is served as, before a stream starts or as a feed's last message. */
14
+ export const cursorErrorBody = (error) => encodeCursorError(error).pipe(Effect.orDie);
15
+ /** One feed event as its SSE message's `data` carries it. */
16
+ const FeedData = Schema.Struct({
17
+ event: Schema.Json,
18
+ commandId: Schema.String,
19
+ timestamp: Schema.Finite,
20
+ });
21
+ const encodeData = Schema.encodeEffect(FeedData);
22
+ /**
23
+ * An SSE message: one event named by its tag and identified by its cursor, so
24
+ * `Last-Event-ID` resumes after it.
25
+ */
26
+ const eventMessage = (event) => Effect.gen(function* () {
27
+ const data = yield* encodeData({
28
+ event: yield* decodeStored(event.value),
29
+ commandId: event.commandId,
30
+ timestamp: event.timestampMs,
31
+ });
32
+ return yield* message({ event: event.tag, data, id: event.cursor });
33
+ }).pipe(Effect.orDie);
34
+ /**
35
+ * The feed's last message: the error that ended it, as a served response body
36
+ * would carry it. It has no `id` line, so it introduces no cursor: a reader
37
+ * tells it from an event named `end`, which always carries a new one.
38
+ */
39
+ const endMessage = (error) => Effect.gen(function* () {
40
+ const body = Predicate.isTagged(error, "ActorError")
41
+ ? yield* actorErrorBody(error)
42
+ : yield* cursorErrorBody(error);
43
+ return yield* message({ event: "end", data: body });
44
+ });
45
+ /** Ends that a feed survives by reopening at its holder and rereading from its cursor. */
46
+ const recoverable = (error) => Predicate.isTagged(error.reason, "SessionEnded") &&
47
+ ["SlowConsumer", "OwnerLost", "ActorUnavailable"].includes(error.reason.cause);
48
+ /**
49
+ * Opens a feed at this runner's holder: the framework feed member, authorized
50
+ * per event tag, whose row makes the owner broadcast every committed feed
51
+ * event. The actor must already exist; a feed never creates one.
52
+ */
53
+ export const openFeed = (options) => options.actors.holder
54
+ .open({
55
+ ref: options.ref,
56
+ member: FEED_MEMBER,
57
+ caller: options.caller,
58
+ params: "",
59
+ expiresAt: options.expiresAt,
60
+ feed: options.tags,
61
+ })
62
+ .pipe(Effect.catchTag("OpenRejected", () => Effect.die(new Error("A feed has no open handler"))));
63
+ /**
64
+ * The events of a feed after `after`, as SSE text: first the committed events
65
+ * read from `actor_events`, then live ones from the holder, deduplicated by
66
+ * cursor so the race between the two neither loses nor repeats one. After an
67
+ * owner loss, a gap, or a full buffer, the feed rereads from the last cursor
68
+ * it sent instead of ending, so a client sees one gap-free stream; any other
69
+ * end is its last message. The `actor_events` table is the source of truth: the
70
+ * holder resyncs a feed itself, and once the new owner answers the feed rereads
71
+ * and goes on. A feed lists no job, so the owner never sends it progress.
72
+ */
73
+ export const feedStream = ({ options, first, after, }) => Stream.callback((out) => Effect.gen(function* () {
74
+ const wanted = new Set(options.tags);
75
+ let last = BigInt(after ?? "0");
76
+ let held = first;
77
+ yield* Effect.addFinalizer(() => held.close);
78
+ const emit = (event) => Effect.gen(function* () {
79
+ if (BigInt(event.cursor) <= last)
80
+ return;
81
+ last = BigInt(event.cursor);
82
+ yield* Queue.offer(out, yield* eventMessage(event));
83
+ });
84
+ const catchUp = Effect.gen(function* () {
85
+ while (true) {
86
+ const page = yield* options.actors.readFeed(options.ref, options.tags, String(last), FEED_PAGE);
87
+ for (const event of page)
88
+ yield* emit(event);
89
+ if (page.length < FEED_PAGE)
90
+ return;
91
+ }
92
+ });
93
+ const live = (connection) => connection.messages.pipe(Stream.runForEach((item) => Match.value(item).pipe(Match.tagsExhaustive({
94
+ Frame: (frame) => frame.event === undefined
95
+ ? Effect.void
96
+ : decodeFeedFrame(frame.frame).pipe(Effect.orDie, Effect.flatMap((decoded) => wanted.has(decoded.tag)
97
+ ? emit({ ...decoded, cursor: frame.event })
98
+ : Effect.void)),
99
+ Resync: () => Effect.void,
100
+ ResyncReplayed: () => catchUp.pipe(Effect.andThen(connection.resyncDone)),
101
+ Progress: () => Effect.void,
102
+ }))));
103
+ const run = Effect.gen(function* () {
104
+ while (true) {
105
+ yield* catchUp;
106
+ const ended = yield* live(held).pipe(Effect.flip, Effect.option);
107
+ if (Option.isNone(ended))
108
+ return;
109
+ if (!Predicate.isTagged(ended.value, "ActorError") || !recoverable(ended.value))
110
+ return yield* ended.value;
111
+ held = yield* openFeed(options);
112
+ }
113
+ });
114
+ yield* run.pipe(Effect.catch((error) => endMessage(error).pipe(Effect.flatMap((text) => Queue.offer(out, text)))), Effect.andThen(Queue.end(out)), Effect.forkScoped);
115
+ })).pipe(withKeepalive);