@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,35 @@
1
+ import { HttpRouter } from "effect/http";
2
+ import { DefectLog } from "../telemetry/defects.ts";
3
+ import type { OperatorAuth } from "./auth.ts";
4
+ import { OperatorRuntime } from "./repair.ts";
5
+ /** Options for serving the operator routes. */
6
+ export interface OperatorsOptions<R> {
7
+ /** Authenticates every operator request to a grant; an `Actor.auth` provider is not accepted. */
8
+ readonly auth: OperatorAuth<R>;
9
+ /** Prefix for every route. Default `"/operator"`. */
10
+ readonly basePath?: `/${string}`;
11
+ }
12
+ /**
13
+ * Serves the operator routes on the application's `HttpRouter`. Every
14
+ * request is authenticated to an operator grant, checked against the one
15
+ * capability its action and resource need, and recorded in the operator
16
+ * audit log: a repair in its own transaction, a read before it is answered,
17
+ * and a refusal by scope as `"denied"`. A browser page on another origin is
18
+ * refused before its credentials are read.
19
+ *
20
+ * - `GET /actors/:type/:id?tenant&limit`: `inspect`; receipt outcomes only under `receipts.read`.
21
+ * - `GET /actors/:type/:id/export?tenant`: `export`; the actor's seed, read-only. Answers 409 `ExportRefused` when a stored value does not decode or the actor holds too much pending work.
22
+ * - `GET /receipts/:type/:id/:commandId?tenant`: `receipts.read`; never runs the command.
23
+ * - `GET /defects?tenant&actor&sinceMs&limit`: `defects.read`; `tenant` may be `*`.
24
+ * - `POST /dead-letters/:jobId/retry` `{ tenant, actorType, actorId, reason, providerChecked? }`: `dead-letters.retry`.
25
+ * - `POST /dead-letters/:jobId/discard` `{ tenant, actorType, actorId, reason }`: `dead-letters.discard`.
26
+ * - `POST /subscriptions/skip` `{ tenant, sourceType, sourceId, subscriberType, subscription, subscriberId, through, reason }`: `subscriptions.skip`, scoped to the source actor.
27
+ * - `GET /subscriptions/lagging?tenant&minAttempts&limit`: `inspect`, tenant-wide; failing subscription rows with their lag and last error.
28
+ * - `GET /audit?tenant&limit`: `audit.read`; `tenant` may be `*`.
29
+ */
30
+ declare const serve: <R = never>(options: OperatorsOptions<R>) => import("effect/Layer").Layer<never, never, DefectLog | HttpRouter.HttpRouter | OperatorRuntime | Exclude<R, import("effect/Scope").Scope> | Exclude<HttpRouter.Request.From<"Requires", Exclude<Exclude<R, R>, HttpRouter.Provided>>, import("effect/Scope").Scope>>;
31
+ /** Operator route constructors; `serve` mounts the routes. */
32
+ export declare const Operators: {
33
+ serve: typeof serve;
34
+ };
35
+ export {};
@@ -0,0 +1,190 @@
1
+ import { Effect, Match, Option, Schema } from "effect";
2
+ import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/http";
3
+ import { ActorError, Unauthorized } from "../../errors/actor.js";
4
+ import { invalidInput, undecodable } from "../../serve/wire.js";
5
+ import { foundOrNotFound, notFoundResponse, operatorResponse, refuseCrossOrigin, } from "../inspector/http.js";
6
+ import { DefectLog } from "../telemetry/defects.js";
7
+ import { authorizing } from "./grants.js";
8
+ import { OperatorRuntime } from "./repair.js";
9
+ /** The most rows one list returns. */
10
+ const MAX_ROWS = 1000;
11
+ const Tenant = Schema.NonEmptyString;
12
+ const Limit = Schema.FiniteFromString.check(Schema.isInt(), Schema.isBetween({ minimum: 1, maximum: MAX_ROWS }));
13
+ const ActorParams = Schema.Struct({ type: Schema.NonEmptyString, id: Schema.NonEmptyString });
14
+ const ReceiptParams = Schema.Struct({
15
+ type: Schema.NonEmptyString,
16
+ id: Schema.NonEmptyString,
17
+ commandId: Schema.NonEmptyString,
18
+ });
19
+ const JobParams = Schema.Struct({ jobId: Schema.NonEmptyString });
20
+ const PageQuery = Schema.Struct({ tenant: Tenant, limit: Schema.optional(Limit) });
21
+ const TenantQuery = Schema.Struct({ tenant: Tenant });
22
+ const DefectsQuery = Schema.Struct({
23
+ tenant: Tenant,
24
+ actor: Schema.optional(Schema.NonEmptyString),
25
+ sinceMs: Schema.optional(Schema.FiniteFromString.check(Schema.isInt())),
26
+ limit: Schema.optional(Limit),
27
+ });
28
+ /** Rows that failed this many deliveries in a row count as lagging. */
29
+ const LAGGING_ATTEMPTS = 8;
30
+ const LaggingQuery = Schema.Struct({
31
+ tenant: Tenant,
32
+ minAttempts: Schema.optional(Schema.FiniteFromString.check(Schema.isInt(), Schema.isGreaterThanOrEqualTo(1))),
33
+ limit: Schema.optional(Limit),
34
+ });
35
+ const Reason = Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(500));
36
+ const DiscardBody = Schema.Struct({
37
+ tenant: Tenant,
38
+ actorType: Schema.NonEmptyString,
39
+ actorId: Schema.NonEmptyString,
40
+ reason: Reason,
41
+ });
42
+ const SkipBody = Schema.Struct({
43
+ tenant: Tenant,
44
+ sourceType: Schema.NonEmptyString,
45
+ sourceId: Schema.NonEmptyString,
46
+ subscriberType: Schema.NonEmptyString,
47
+ subscription: Schema.NonEmptyString,
48
+ subscriberId: Schema.NonEmptyString,
49
+ through: Schema.String.check(Schema.isPattern(/^[1-9][0-9]{0,17}$/u)),
50
+ reason: Reason,
51
+ });
52
+ const RetryBody = Schema.Struct({
53
+ ...DiscardBody.fields,
54
+ providerChecked: Schema.optional(Schema.Boolean),
55
+ });
56
+ /** Answers a repair's result as JSON and each refusal with its own status. */
57
+ const repairResponse = (repair) => repair.pipe(Effect.map((result) => HttpServerResponse.jsonUnsafe(result)), Effect.catch((error) => Effect.succeed(Match.value(error).pipe(Match.tagsExhaustive({
58
+ OperatorNotFound: notFoundResponse,
59
+ ProviderOutcomeUnknown: (refused) => HttpServerResponse.jsonUnsafe(refused, { status: 409 }),
60
+ JobNotServed: (refused) => HttpServerResponse.jsonUnsafe(refused, { status: 503 }),
61
+ })))));
62
+ /** Decodes a JSON request body; a body that is not JSON is refused as `decode`. */
63
+ const decodeBody = (schema) => HttpServerRequest.schemaBodyJson(schema).pipe(Effect.catchTag("HttpServerError", () => Effect.fail(invalidInput("decode"))));
64
+ /**
65
+ * Serves the operator routes on the application's `HttpRouter`. Every
66
+ * request is authenticated to an operator grant, checked against the one
67
+ * capability its action and resource need, and recorded in the operator
68
+ * audit log: a repair in its own transaction, a read before it is answered,
69
+ * and a refusal by scope as `"denied"`. A browser page on another origin is
70
+ * refused before its credentials are read.
71
+ *
72
+ * - `GET /actors/:type/:id?tenant&limit`: `inspect`; receipt outcomes only under `receipts.read`.
73
+ * - `GET /actors/:type/:id/export?tenant`: `export`; the actor's seed, read-only. Answers 409 `ExportRefused` when a stored value does not decode or the actor holds too much pending work.
74
+ * - `GET /receipts/:type/:id/:commandId?tenant`: `receipts.read`; never runs the command.
75
+ * - `GET /defects?tenant&actor&sinceMs&limit`: `defects.read`; `tenant` may be `*`.
76
+ * - `POST /dead-letters/:jobId/retry` `{ tenant, actorType, actorId, reason, providerChecked? }`: `dead-letters.retry`.
77
+ * - `POST /dead-letters/:jobId/discard` `{ tenant, actorType, actorId, reason }`: `dead-letters.discard`.
78
+ * - `POST /subscriptions/skip` `{ tenant, sourceType, sourceId, subscriberType, subscription, subscriberId, through, reason }`: `subscriptions.skip`, scoped to the source actor.
79
+ * - `GET /subscriptions/lagging?tenant&minAttempts&limit`: `inspect`, tenant-wide; failing subscription rows with their lag and last error.
80
+ * - `GET /audit?tenant&limit`: `audit.read`; `tenant` may be `*`.
81
+ */
82
+ const serve = (options) => HttpRouter.use(Effect.fnUntraced(function* (router) {
83
+ const basePath = (options.basePath ?? "/operator").replace(/\/+$/, "");
84
+ const context = yield* Effect.context();
85
+ const runtime = yield* OperatorRuntime;
86
+ const defects = yield* DefectLog;
87
+ const authenticate = (request) => Effect.gen(function* () {
88
+ yield* refuseCrossOrigin(request);
89
+ return yield* options.auth
90
+ .authenticate({
91
+ headers: request.headers,
92
+ cookies: {},
93
+ })
94
+ .pipe(Effect.provideContext(context), Effect.mapError((reason) => ActorError.make({ reason })), Effect.tapError(() => Effect.logWarning("Operator request not authenticated")));
95
+ });
96
+ const authorize = (grant, action, resource, target) => Effect.gen(function* () {
97
+ const entry = {
98
+ operator: grant.operator,
99
+ action,
100
+ tenant: resource.tenant,
101
+ actorType: resource.actorType,
102
+ actorId: resource.actorId,
103
+ target,
104
+ capability: authorizing({ grant, action, resource }),
105
+ };
106
+ if (Option.isNone(entry.capability)) {
107
+ yield* runtime.record(entry, "denied");
108
+ return yield* ActorError.make({ reason: Unauthorized.make({ code: "access_denied" }) });
109
+ }
110
+ return entry;
111
+ });
112
+ /** Authorizes a read and records it in the audit log before it is answered. */
113
+ const authorizeRead = (grant, action, resource, target) => authorize(grant, action, resource, target).pipe(Effect.flatMap((entry) => runtime.record(entry, "read")));
114
+ const route = (method, path, handle) => router.add(method, `${basePath}${path}`, (request) => authenticate(request).pipe(Effect.flatMap(handle), Effect.catchTag("SchemaError", (error) => Effect.fail(undecodable(error))), operatorResponse("Operator request failed")));
115
+ yield* route("GET", "/actors/:type/:id", (grant) => Effect.gen(function* () {
116
+ const { type, id } = yield* HttpRouter.schemaPathParams(ActorParams);
117
+ const { tenant, limit } = yield* HttpRouter.schemaParams(PageQuery);
118
+ const resource = { tenant, actorType: type, actorId: id };
119
+ const entry = yield* authorize(grant, "inspect", resource);
120
+ const outcomes = Option.isSome(authorizing({ grant, action: "receipts.read", resource }));
121
+ yield* runtime.record(entry, { outcomes });
122
+ return foundOrNotFound(yield* runtime.inspect({ ...resource, limit: limit ?? 20, outcomes }));
123
+ }));
124
+ yield* route("GET", "/actors/:type/:id/export", (grant) => Effect.gen(function* () {
125
+ const { type, id } = yield* HttpRouter.schemaPathParams(ActorParams);
126
+ const { tenant } = yield* HttpRouter.schemaParams(TenantQuery);
127
+ const resource = { tenant, actorType: type, actorId: id };
128
+ yield* authorizeRead(grant, "export", resource);
129
+ return yield* runtime.exportSeed(resource).pipe(Effect.map(foundOrNotFound), Effect.catchTag("ExportRefused", (refused) => Effect.succeed(HttpServerResponse.jsonUnsafe(refused, { status: 409 }))));
130
+ }));
131
+ yield* route("GET", "/receipts/:type/:id/:commandId", (grant) => Effect.gen(function* () {
132
+ const { type, id, commandId } = yield* HttpRouter.schemaPathParams(ReceiptParams);
133
+ const { tenant } = yield* HttpRouter.schemaParams(TenantQuery);
134
+ const resource = { tenant, actorType: type, actorId: id, commandId };
135
+ yield* authorizeRead(grant, "receipts.read", resource, commandId);
136
+ return foundOrNotFound(yield* runtime.receipt(resource));
137
+ }));
138
+ yield* route("GET", "/defects", (grant) => Effect.gen(function* () {
139
+ const { tenant, actor, sinceMs, limit } = yield* HttpRouter.schemaParams(DefectsQuery);
140
+ yield* authorizeRead(grant, "defects.read", { tenant, actorType: actor });
141
+ const listed = yield* defects.list({ actorType: actor, sinceMs });
142
+ const own = tenant === "*" ? listed : listed.filter((defect) => defect.tenant === tenant);
143
+ return HttpServerResponse.jsonUnsafe(own.slice(-(limit ?? MAX_ROWS)));
144
+ }));
145
+ const repair = (path, run) => route("POST", `/dead-letters/:jobId/${path}`, (grant) => Effect.gen(function* () {
146
+ const { jobId } = yield* HttpRouter.schemaPathParams(JobParams);
147
+ const body = yield* decodeBody(RetryBody);
148
+ const entry = yield* authorize(grant, path === "retry" ? "dead-letters.retry" : "dead-letters.discard", target(body), jobId);
149
+ return yield* repairResponse(run(body, jobId, { ...entry, reason: body.reason }));
150
+ }));
151
+ yield* repair("retry", (body, jobId, audit) => runtime.retry({
152
+ target: target(body),
153
+ jobId,
154
+ providerChecked: body.providerChecked === true,
155
+ audit,
156
+ }));
157
+ yield* repair("discard", (body, jobId, audit) => runtime
158
+ .discard({ target: target(body), jobId, audit })
159
+ .pipe(Effect.as({ discarded: jobId })));
160
+ yield* route("POST", "/subscriptions/skip", (grant) => Effect.gen(function* () {
161
+ const body = yield* decodeBody(SkipBody);
162
+ const source = { tenant: body.tenant, actorType: body.sourceType, actorId: body.sourceId };
163
+ const entry = yield* authorize(grant, "subscriptions.skip", source, `${body.subscriberType}.${body.subscription}/${body.subscriberId}`);
164
+ return yield* repairResponse(runtime.skip({
165
+ target: source,
166
+ subscriberType: body.subscriberType,
167
+ subscription: body.subscription,
168
+ subscriberId: body.subscriberId,
169
+ through: body.through,
170
+ audit: { ...entry, reason: body.reason },
171
+ }));
172
+ }));
173
+ yield* route("GET", "/subscriptions/lagging", (grant) => Effect.gen(function* () {
174
+ const { tenant, minAttempts, limit } = yield* HttpRouter.schemaParams(LaggingQuery);
175
+ yield* authorizeRead(grant, "inspect", { tenant });
176
+ return HttpServerResponse.jsonUnsafe(yield* runtime.lagging({
177
+ tenant,
178
+ minAttempts: minAttempts ?? LAGGING_ATTEMPTS,
179
+ limit: limit ?? 100,
180
+ }));
181
+ }));
182
+ yield* route("GET", "/audit", (grant) => Effect.gen(function* () {
183
+ const { tenant, limit } = yield* HttpRouter.schemaParams(PageQuery);
184
+ yield* authorizeRead(grant, "audit.read", { tenant });
185
+ return HttpServerResponse.jsonUnsafe(yield* runtime.audit({ tenant, limit: limit ?? 100 }));
186
+ }));
187
+ }));
188
+ const target = (resource) => ({ tenant: resource.tenant, actorType: resource.actorType, actorId: resource.actorId });
189
+ /** Operator route constructors; `serve` mounts the routes. */
190
+ export const Operators = { serve };
@@ -0,0 +1,123 @@
1
+ import { type Context, type Crypto, Effect, Schema } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import type { RegisteredJob } from "../members.ts";
4
+ import { ActorRef, type Caller } from "../../identity/caller.ts";
5
+ import { TenantScope } from "../database/tenancy.ts";
6
+ import { FrameworkClock } from "../turn/admission.ts";
7
+ import { OutboxRuntime } from "../turn/outbox.ts";
8
+ /** The only seed format this build writes and reads. */
9
+ export declare const SEED_FORMAT = 1;
10
+ /**
11
+ * One actor's exported state and pending obligations, with nothing that
12
+ * identifies its tenant, caller, or credentials: a seed is replayed under the
13
+ * tenant and caller of the test that reads it. `dueInMs` is measured from the
14
+ * moment of export, so a replay follows the test's own clock. `omitted` counts
15
+ * what the seed does not carry: receipts, events, workflow executions, dead
16
+ * letters, rows of the actor's owned tables, and its blob entries, so a reader
17
+ * can see what a replay starts without.
18
+ */
19
+ export declare const Seed: Schema.Struct<{
20
+ readonly format: Schema.Literal<1>;
21
+ readonly actor: Schema.Struct<{
22
+ readonly type: Schema.NonEmptyString;
23
+ readonly id: Schema.NonEmptyString;
24
+ }>;
25
+ readonly created: Schema.Boolean;
26
+ readonly stateVersion: Schema.Int;
27
+ readonly state: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
28
+ readonly intents: Schema.$Array<Schema.Struct<{
29
+ readonly target: Schema.Struct<{
30
+ readonly actor: Schema.NonEmptyString;
31
+ readonly id: Schema.NonEmptyString;
32
+ }>;
33
+ readonly command: Schema.NonEmptyString;
34
+ readonly payload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
35
+ readonly key: Schema.optional<Schema.NonEmptyString>;
36
+ readonly dueInMs: Schema.Int;
37
+ }>>;
38
+ readonly jobs: Schema.$Array<Schema.Struct<{
39
+ readonly job: Schema.NonEmptyString;
40
+ readonly payload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
41
+ readonly payloadVersion: Schema.Int;
42
+ readonly key: Schema.optional<Schema.NonEmptyString>;
43
+ readonly dueInMs: Schema.Int;
44
+ }>>;
45
+ readonly omitted: Schema.Struct<{
46
+ readonly receipts: Schema.Int;
47
+ readonly events: Schema.Int;
48
+ readonly workflows: Schema.Int;
49
+ readonly deadLetters: Schema.Int;
50
+ readonly tableRows: Schema.Int;
51
+ readonly blobs: Schema.Int;
52
+ }>;
53
+ }>;
54
+ /** A decoded `Seed`. */
55
+ export type Seed = typeof Seed.Type;
56
+ /** Codec between a `Seed` and the JSON text a seed file holds. */
57
+ export declare const SeedJson: Schema.fromJsonString<Schema.Struct<{
58
+ readonly format: Schema.Literal<1>;
59
+ readonly actor: Schema.Struct<{
60
+ readonly type: Schema.NonEmptyString;
61
+ readonly id: Schema.NonEmptyString;
62
+ }>;
63
+ readonly created: Schema.Boolean;
64
+ readonly stateVersion: Schema.Int;
65
+ readonly state: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
66
+ readonly intents: Schema.$Array<Schema.Struct<{
67
+ readonly target: Schema.Struct<{
68
+ readonly actor: Schema.NonEmptyString;
69
+ readonly id: Schema.NonEmptyString;
70
+ }>;
71
+ readonly command: Schema.NonEmptyString;
72
+ readonly payload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
73
+ readonly key: Schema.optional<Schema.NonEmptyString>;
74
+ readonly dueInMs: Schema.Int;
75
+ }>>;
76
+ readonly jobs: Schema.$Array<Schema.Struct<{
77
+ readonly job: Schema.NonEmptyString;
78
+ readonly payload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
79
+ readonly payloadVersion: Schema.Int;
80
+ readonly key: Schema.optional<Schema.NonEmptyString>;
81
+ readonly dueInMs: Schema.Int;
82
+ }>>;
83
+ readonly omitted: Schema.Struct<{
84
+ readonly receipts: Schema.Int;
85
+ readonly events: Schema.Int;
86
+ readonly workflows: Schema.Int;
87
+ readonly deadLetters: Schema.Int;
88
+ readonly tableRows: Schema.Int;
89
+ readonly blobs: Schema.Int;
90
+ }>;
91
+ }>>;
92
+ /** What the runtime's clock and outbox references hold on this runner. */
93
+ type ReferenceOf<T> = T extends Context.Reference<infer S> ? S : never;
94
+ /**
95
+ * Builds the operation that starts an actor from a seed, over the runtime's
96
+ * SQL, crypto, clock, and outbox, and its job registrations.
97
+ *
98
+ * The actor's row, state, and obligations are written in one transaction, so
99
+ * a refused seed leaves nothing behind. It never overwrites: an actor that
100
+ * already has a generation row refuses the seed. Obligations are staged
101
+ * through the turn's own outbox statements under the caller the test runs as,
102
+ * never a caller from the file, so a seed cannot carry authority. A job
103
+ * this runner has no executor for is refused, because it could never run.
104
+ * A seed marking created an actor type that declares no `createdBy` is
105
+ * refused: that marker stays false for such a type, or declaring the policy
106
+ * later would treat the seeded actor as already created.
107
+ */
108
+ export declare const seedRuntime: (deps: {
109
+ readonly services: Context.Context<SqlClient.SqlClient | Crypto.Crypto>;
110
+ readonly clock: ReferenceOf<typeof FrameworkClock>;
111
+ readonly outbox: ReferenceOf<typeof OutboxRuntime>;
112
+ readonly jobOf: (actorType: string, job: string) => RegisteredJob | undefined;
113
+ /** Whether the actor type declares `createdBy`. */
114
+ readonly createdBy: (actorType: string) => boolean;
115
+ readonly wake: Effect.Effect<void>;
116
+ /** The tenant and adoption writer roles the operator's turns take, as the runtime's own turns do. */
117
+ readonly tenantScope: ReferenceOf<typeof TenantScope>;
118
+ }) => (args_0: {
119
+ readonly ref: ActorRef;
120
+ readonly caller: Caller;
121
+ readonly seed: Seed;
122
+ }) => Effect.Effect<undefined, never, never>;
123
+ export {};
@@ -0,0 +1,123 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { SqlClient, SqlError } from "effect/sql";
3
+ import { Due, emptyOutbox } from "../../handles/intents.js";
4
+ import { ActorRef } from "../../identity/caller.js";
5
+ import { VERSION_KEY } from "../../state/migration.js";
6
+ import { TenantScope, withTenant } from "../database/tenancy.js";
7
+ import { compress, routingKey } from "../storage/codec.js";
8
+ import { recordedPlacement } from "../storage/placements.js";
9
+ import { databaseTime, FrameworkClock } from "../turn/admission.js";
10
+ import { OutboxRuntime, outboxStatements } from "../turn/outbox.js";
11
+ /** The only seed format this build writes and reads. */
12
+ export const SEED_FORMAT = 1;
13
+ const Count = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
14
+ /**
15
+ * One actor's exported state and pending obligations, with nothing that
16
+ * identifies its tenant, caller, or credentials: a seed is replayed under the
17
+ * tenant and caller of the test that reads it. `dueInMs` is measured from the
18
+ * moment of export, so a replay follows the test's own clock. `omitted` counts
19
+ * what the seed does not carry: receipts, events, workflow executions, dead
20
+ * letters, rows of the actor's owned tables, and its blob entries, so a reader
21
+ * can see what a replay starts without.
22
+ */
23
+ export const Seed = Schema.Struct({
24
+ format: Schema.Literal(SEED_FORMAT),
25
+ actor: Schema.Struct({ type: Schema.NonEmptyString, id: Schema.NonEmptyString }),
26
+ created: Schema.Boolean,
27
+ stateVersion: Count,
28
+ state: Schema.Record(Schema.String, Schema.Json),
29
+ intents: Schema.Array(Schema.Struct({
30
+ target: Schema.Struct({ actor: Schema.NonEmptyString, id: Schema.NonEmptyString }),
31
+ command: Schema.NonEmptyString,
32
+ payload: Schema.Json,
33
+ key: Schema.optional(Schema.NonEmptyString),
34
+ dueInMs: Count,
35
+ })),
36
+ jobs: Schema.Array(Schema.Struct({
37
+ job: Schema.NonEmptyString,
38
+ payload: Schema.Json,
39
+ payloadVersion: Count,
40
+ key: Schema.optional(Schema.NonEmptyString),
41
+ dueInMs: Count,
42
+ })),
43
+ omitted: Schema.Struct({
44
+ receipts: Count,
45
+ events: Count,
46
+ workflows: Count,
47
+ deadLetters: Count,
48
+ tableRows: Count,
49
+ blobs: Count,
50
+ }),
51
+ });
52
+ /** Codec between a `Seed` and the JSON text a seed file holds. */
53
+ export const SeedJson = Schema.fromJsonString(Seed);
54
+ /**
55
+ * Builds the operation that starts an actor from a seed, over the runtime's
56
+ * SQL, crypto, clock, and outbox, and its job registrations.
57
+ *
58
+ * The actor's row, state, and obligations are written in one transaction, so
59
+ * a refused seed leaves nothing behind. It never overwrites: an actor that
60
+ * already has a generation row refuses the seed. Obligations are staged
61
+ * through the turn's own outbox statements under the caller the test runs as,
62
+ * never a caller from the file, so a seed cannot carry authority. A job
63
+ * this runner has no executor for is refused, because it could never run.
64
+ * A seed marking created an actor type that declares no `createdBy` is
65
+ * refused: that marker stays false for such a type, or declaring the policy
66
+ * later would treat the seeded actor as already created.
67
+ */
68
+ export const seedRuntime = (deps) => Effect.fnUntraced(function* ({ ref, caller, seed, }) {
69
+ if (seed.actor.type !== ref.actor)
70
+ return yield* Effect.die(new Error(`The seed is of ${seed.actor.type}, not ${ref.actor}: refusing to seed it`));
71
+ if (seed.created && !deps.createdBy(ref.actor))
72
+ return yield* Effect.die(new Error(`The seed marks ${ref.actor} created, but ${ref.actor} declares no createdBy: refusing to seed it`));
73
+ for (const { job } of seed.jobs)
74
+ if (deps.jobOf(ref.actor, job) === undefined)
75
+ return yield* Effect.die(new Error(`The seed has job ${job}, which ${ref.actor} does not register`));
76
+ const sql = yield* SqlClient.SqlClient;
77
+ const placement = yield* recordedPlacement(ref.actor);
78
+ if (placement === undefined)
79
+ return yield* Effect.die(new Error(`Actor ${ref.actor} is not registered`));
80
+ const key = routingKey({ ref, placement });
81
+ yield* withTenant(ref.tenant)(sql.withTransaction(Effect.gen(function* () {
82
+ const [inserted] = yield* sql `
83
+ INSERT INTO actor_generations (routing_key, tenant_id, actor_type, actor_id, created)
84
+ VALUES (${key}, ${ref.tenant}, ${ref.actor}, ${ref.id}, ${seed.created})
85
+ ON CONFLICT DO NOTHING
86
+ RETURNING created`;
87
+ if (inserted === undefined)
88
+ return yield* Effect.die(new Error(`${ref.actor}/${ref.id} already exists: a seed starts an actor, never overwrites one`));
89
+ const rows = Object.entries(seed.state).map(([name, value]) => [name, JSON.stringify(value)]);
90
+ if (seed.stateVersion > 0)
91
+ rows.push([VERSION_KEY, String(seed.stateVersion)]);
92
+ for (const [name, value] of rows)
93
+ yield* sql `INSERT INTO actor_state (routing_key, tenant_id, actor_type, actor_id, key, value)
94
+ VALUES (${key}, ${ref.tenant}, ${ref.actor}, ${ref.id}, ${name}, ${compress(value)})`;
95
+ const staged = yield* outboxStatements(key, ref, {
96
+ ...emptyOutbox,
97
+ intents: seed.intents.map((intent) => ({
98
+ target: ActorRef.make({
99
+ tenant: ref.tenant,
100
+ actor: intent.target.actor,
101
+ id: intent.target.id,
102
+ }),
103
+ command: intent.command,
104
+ payload: JSON.stringify(intent.payload),
105
+ caller,
106
+ due: Due.cases.After.make({ millis: intent.dueInMs }),
107
+ key: intent.key,
108
+ })),
109
+ jobs: seed.jobs.map((job) => ({
110
+ job: job.job,
111
+ payload: JSON.stringify(job.payload),
112
+ version: job.payloadVersion,
113
+ caller,
114
+ due: Due.cases.After.make({ millis: job.dueInMs }),
115
+ key: job.key,
116
+ capped: deps.jobOf(ref.actor, job.job)?.perActor !== undefined,
117
+ })),
118
+ }, databaseTime);
119
+ for (const statement of staged.statements)
120
+ yield* statement;
121
+ })));
122
+ yield* deps.wake;
123
+ }, (effect) => effect.pipe(Effect.catchIf(SqlError.isSqlError, Effect.die), Effect.provideService(FrameworkClock, deps.clock), Effect.provideService(OutboxRuntime, deps.outbox), Effect.provideService(TenantScope, deps.tenantScope), Effect.provideContext(deps.services)));
@@ -0,0 +1,65 @@
1
+ import { Effect } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { type PayloadDeclaration } from "../../members/payload.ts";
4
+ /** How long a runtime's writer rows stay live without a refresh, by default. */
5
+ export declare const DEFAULT_WRITER_WINDOW_MS = 120000;
6
+ /** A stored version the deployment could not read, or a removal that would strand one. */
7
+ export interface PayloadProblem {
8
+ readonly actorType: string;
9
+ readonly kind: "event" | "job";
10
+ readonly tag: string;
11
+ /** What would be stranded, e.g. `version 2 recorded above this chain's current version 1`. */
12
+ readonly problem: string;
13
+ }
14
+ /** A one-line operator-facing description of a payload problem. */
15
+ export declare const formatPayloadProblem: (problem: PayloadProblem) => string;
16
+ /**
17
+ * Compares declared chains with the versions the database may hold. A
18
+ * version recorded above a chain's current version is a rollback past a
19
+ * schema change. A chain that starts above version `v` can't read values of
20
+ * `v`: an event version counts as stored until `durable payloads clear` marks
21
+ * it cleared. Every stored event has a recorded version, because a runtime
22
+ * records what it writes before it takes a shard and the migration refused
23
+ * databases that held rows before it. Job versions are read from the
24
+ * outbox and dead letters directly. `writers` names the actor types whose
25
+ * turns this deployment runs: an event tag one of them no longer declares is
26
+ * refused while a subscription still has undelivered events of it.
27
+ */
28
+ export declare const findPayloadProblems: (declarations: readonly PayloadDeclaration[], writers?: readonly {
29
+ readonly actorType: string;
30
+ readonly events: ReadonlyArray<string>;
31
+ }[] | undefined) => Effect.Effect<PayloadProblem[], import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
32
+ /**
33
+ * Records the version each written class is written at, and marks every
34
+ * lower recorded version superseded. Writing a version again clears its
35
+ * `superseded` and `cleared` marks, since values of it are being stored anew.
36
+ */
37
+ export declare const recordPayloadVersions: (declarations: readonly PayloadDeclaration[]) => Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
38
+ /** Upserts this runtime's writer row for each class it writes, stamped now, in one statement. */
39
+ export declare const refreshWriters: (runtimeId: string, windowMs: number, declarations: readonly PayloadDeclaration[]) => Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
40
+ /** Drops a stopping runtime's writer rows, so a clear need not wait out its window. */
41
+ export declare const dropWriters: (runtimeId: string) => Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
42
+ /** `durable payloads check`: the startup check for `actors`, read-only. */
43
+ export declare const checkPayloads: (actors: ReadonlyArray<object>) => Effect.Effect<PayloadProblem[], import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
44
+ /** What `durable payloads clear` found for one superseded event version. */
45
+ export interface ClearResult {
46
+ readonly actorType: string;
47
+ readonly tag: string;
48
+ readonly version: number;
49
+ /**
50
+ * `cleared`, or why not: a runtime refreshed a writer row for the version
51
+ * within its window plus the longest command timeout, or an event of the
52
+ * version is still stored.
53
+ */
54
+ readonly outcome: "cleared" | "writer" | "stored";
55
+ }
56
+ /**
57
+ * `durable payloads clear`: marks each superseded event version of `actors`
58
+ * cleared once its retention horizon has passed, no runtime can still write
59
+ * it, and no event of it remains. The version row is locked first, the
60
+ * writer rows are read again after the scan, and each statement of the
61
+ * transaction reads a fresh snapshot, so a writer that registers during the
62
+ * scan fails the clear instead of racing it. A writer counts as live until
63
+ * its window and then the longest command timeout have passed.
64
+ */
65
+ export declare const clearPayloads: (actors: ReadonlyArray<object>) => Effect.Effect<ClearResult[], import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;