@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,125 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { type AnyWorkflow, type VersionRange } from "../../members/workflow.ts";
4
+ import { type Declared } from "./manifest.ts";
5
+ /** One reason a deployment cannot run the open executions it would inherit. */
6
+ export interface Incompatibility {
7
+ readonly actorType: string;
8
+ readonly workflow: string;
9
+ /** What changed, e.g. `step "label" removed` or `marker "fraud" 1 outside 2..3`. */
10
+ readonly problem: string;
11
+ /** Open executions the change strands. */
12
+ readonly open: number;
13
+ /** When the oldest of them started, in epoch milliseconds. */
14
+ readonly oldestStartedAtMs: number;
15
+ }
16
+ /** An actor type as a deployment declares it: its name and its workflow members. */
17
+ interface DeclaredActor {
18
+ readonly name: string;
19
+ readonly workflows: ReadonlyArray<AnyWorkflow>;
20
+ }
21
+ /** The workflow members of an `Actor.make` definition. */
22
+ export declare const declaredOf: (actor: {
23
+ readonly name: string;
24
+ readonly api: object;
25
+ }) => DeclaredActor;
26
+ declare const StoredManifest: Schema.Struct<{
27
+ readonly payload: Schema.String;
28
+ readonly steps: Schema.$Array<Schema.Struct<{
29
+ readonly name: Schema.String;
30
+ readonly kind: Schema.String;
31
+ readonly result: Schema.String;
32
+ }>>;
33
+ }>;
34
+ type StoredManifest = typeof StoredManifest.Type;
35
+ /** Decodes the steps of a stored manifest. */
36
+ export declare const decodeStoredManifest: (manifest: string) => Effect.Effect<{
37
+ readonly payload: string;
38
+ readonly steps: readonly {
39
+ readonly name: string;
40
+ readonly kind: string;
41
+ readonly result: string;
42
+ }[];
43
+ }, Schema.SchemaError, never>;
44
+ /** Why `declared` cannot continue the executions a start manifest covers, and which of its steps it would decode under another result schema. */
45
+ export interface StartVerdict {
46
+ readonly problems: ReadonlyArray<string>;
47
+ readonly changed: ReadonlyArray<string>;
48
+ }
49
+ /**
50
+ * The verdict on executions that started under `hash`, whose stored manifest is
51
+ * `start` (undefined when its row is missing). A start manifest has to list
52
+ * only steps `declared` registers as the same kind and share its payload schema.
53
+ * `newer` means it was accepted after `declared`: a runner then also refuses it
54
+ * when a shared step's result schema differs, because the newer deployment may
55
+ * record such results at any time.
56
+ */
57
+ export declare const startVerdict: ({ declared, hash, start, newer, }: {
58
+ readonly declared: Declared;
59
+ readonly hash: string;
60
+ readonly start: StoredManifest | undefined;
61
+ readonly newer: boolean;
62
+ }) => StartVerdict;
63
+ /**
64
+ * Why an execution's value for marker `name` is unsupported: `recorded` is
65
+ * undefined when the execution predates the marker, and reads as 0.
66
+ */
67
+ export declare const markerProblem: ({ versions, name, recorded, }: {
68
+ readonly versions: Readonly<Record<string, VersionRange>>;
69
+ readonly name: string;
70
+ readonly recorded: number | undefined;
71
+ }) => string[];
72
+ /**
73
+ * Why `declared` cannot replay a recorded step: it no longer registers the
74
+ * step as that kind, or the step settled under a result schema in `changed`.
75
+ */
76
+ export declare const recordedStepProblem: ({ declared, step, kind, settled, changed, }: {
77
+ readonly declared: Declared;
78
+ readonly step: string;
79
+ readonly kind: string;
80
+ readonly settled: boolean;
81
+ readonly changed: ReadonlyArray<string>;
82
+ }) => string[];
83
+ /**
84
+ * Compares `declared` with every open execution of its actor types (of every
85
+ * actor type with `everyActorType`) and the manifests they started under.
86
+ * An open execution blocks a deployment when its actor type or workflow is
87
+ * gone, its start manifest has a step the deployment doesn't register as the
88
+ * same kind, a step it recorded changed its result schema, a marker it
89
+ * recorded is undeclared or outside `min..current`, or it predates a marker
90
+ * whose `min` is above 0. Grouped by actor type, workflow and problem.
91
+ *
92
+ * An execution that started after the groups were read brings its manifest into
93
+ * the comparison. A start manifest already reports a missing step for every
94
+ * execution under it, so those executions are not reported again.
95
+ */
96
+ export declare const findIncompatibilities: (declared: readonly DeclaredActor[], options: {
97
+ readonly everyActorType: boolean;
98
+ }) => Effect.Effect<Incompatibility[], import("effect/sql/SqlError").SqlError, import("effect/Crypto").Crypto | SqlClient.SqlClient>;
99
+ /** `Order/Ship step "label" removed 412 open executions (oldest 2026-09-20T08:14:00.000Z)` */
100
+ export declare const formatIncompatibility: (incompatibility: Incompatibility) => string;
101
+ /**
102
+ * The startup check for one actor type. It skips the comparison when each
103
+ * workflow's manifest is already the most recently accepted one, no accepted
104
+ * workflow is gone and no open execution started under another manifest; otherwise it compares, and a passing deployment
105
+ * becomes the most recently accepted one, so a rollback is compared again.
106
+ * `retained`: the actor type has workflows or workflow rows retention sweeps.
107
+ *
108
+ * A runner of an older deployment may have started executions since the last
109
+ * comparison, and a comparison that finds no open execution of a dropped workflow
110
+ * lets the deployment pass.
111
+ */
112
+ export declare const acceptWorkflows: (actor: DeclaredActor) => Effect.Effect<{
113
+ checked: boolean;
114
+ incompatibilities: Incompatibility[];
115
+ retained: boolean;
116
+ }, import("effect/sql/SqlError").SqlError, import("effect/Crypto").Crypto | SqlClient.SqlClient>;
117
+ /**
118
+ * The deploy check `durable workflows check` runs: every actor type in the
119
+ * database against `actors`, in one read-only snapshot.
120
+ */
121
+ export declare const checkWorkflows: (actors: ReadonlyArray<{
122
+ readonly name: string;
123
+ readonly api: object;
124
+ }>) => Effect.Effect<Incompatibility[], import("effect/sql/SqlError").SqlError, import("effect/Crypto").Crypto | SqlClient.SqlClient>;
125
+ export {};
@@ -0,0 +1,285 @@
1
+ import { DateTime, Effect, Schema } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { coordinated } from "../database/coordination.js";
4
+ import { isWorkflow } from "../../members/workflow.js";
5
+ import { inReadOnlySnapshot } from "../database/snapshot.js";
6
+ import { manifestOf, toJson } from "./manifest.js";
7
+ /** The workflow members of an `Actor.make` definition. */
8
+ export const declaredOf = (actor) => ({
9
+ name: actor.name,
10
+ workflows: Object.values(actor.api).filter(isWorkflow),
11
+ });
12
+ const StoredManifest = Schema.Struct({
13
+ payload: Schema.String,
14
+ steps: Schema.Array(Schema.Struct({
15
+ name: Schema.String,
16
+ kind: Schema.String,
17
+ result: Schema.String,
18
+ })),
19
+ });
20
+ const decodeManifest = Schema.decodeUnknownEffect(Schema.fromJsonString(StoredManifest));
21
+ /** Decodes the steps of a stored manifest. */
22
+ export const decodeStoredManifest = (manifest) => decodeManifest(manifest);
23
+ const sameManifest = { problems: [], changed: [] };
24
+ /**
25
+ * The verdict on executions that started under `hash`, whose stored manifest is
26
+ * `start` (undefined when its row is missing). A start manifest has to list
27
+ * only steps `declared` registers as the same kind and share its payload schema.
28
+ * `newer` means it was accepted after `declared`: a runner then also refuses it
29
+ * when a shared step's result schema differs, because the newer deployment may
30
+ * record such results at any time.
31
+ */
32
+ export const startVerdict = ({ declared, hash, start, newer, }) => {
33
+ if (hash === declared.hash)
34
+ return sameManifest;
35
+ if (start === undefined)
36
+ return { problems: ["start manifest missing"], changed: [] };
37
+ const changed = start.steps.flatMap((entry) => {
38
+ const step = declared.steps.get(entry.name);
39
+ return step !== undefined && entry.result !== step.result ? [entry.name] : [];
40
+ });
41
+ const problems = start.steps.flatMap((entry) => {
42
+ const kind = declared.steps.get(entry.name)?.kind;
43
+ if (kind === undefined)
44
+ return [`step "${entry.name}" removed`];
45
+ return kind === entry.kind ? [] : [`step "${entry.name}" changed from ${entry.kind} to ${kind}`];
46
+ });
47
+ if (start.payload !== declared.manifest.payload)
48
+ problems.push("payload schema changed");
49
+ if (newer)
50
+ for (const name of changed)
51
+ problems.push(`step "${name}" result schema changed by a newer deployment`);
52
+ return { problems, changed };
53
+ };
54
+ /**
55
+ * Why an execution's value for marker `name` is unsupported: `recorded` is
56
+ * undefined when the execution predates the marker, and reads as 0.
57
+ */
58
+ export const markerProblem = ({ versions, name, recorded, }) => {
59
+ const range = versions[name];
60
+ if (range === undefined)
61
+ return recorded === undefined ? [] : [`marker "${name}" removed`];
62
+ if (recorded === undefined)
63
+ return range.min > 0
64
+ ? [`marker "${name}" min ${range.min} > 0 for executions that predate it`]
65
+ : [];
66
+ return recorded < range.min || recorded > range.current
67
+ ? [`marker "${name}" ${recorded} outside ${range.min}..${range.current}`]
68
+ : [];
69
+ };
70
+ /**
71
+ * Why `declared` cannot replay a recorded step: it no longer registers the
72
+ * step as that kind, or the step settled under a result schema in `changed`.
73
+ */
74
+ export const recordedStepProblem = ({ declared, step, kind, settled, changed, }) => {
75
+ const registered = declared.steps.get(step)?.kind;
76
+ if (registered === undefined)
77
+ return [`step "${step}" removed`];
78
+ if (registered !== kind)
79
+ return [`step "${step}" changed from ${kind} to ${registered}`];
80
+ return settled && changed.includes(step) ? [`step "${step}" result schema changed`] : [];
81
+ };
82
+ /**
83
+ * Compares `declared` with every open execution of its actor types (of every
84
+ * actor type with `everyActorType`) and the manifests they started under.
85
+ * An open execution blocks a deployment when its actor type or workflow is
86
+ * gone, its start manifest has a step the deployment doesn't register as the
87
+ * same kind, a step it recorded changed its result schema, a marker it
88
+ * recorded is undeclared or outside `min..current`, or it predates a marker
89
+ * whose `min` is above 0. Grouped by actor type, workflow and problem.
90
+ *
91
+ * An execution that started after the groups were read brings its manifest into
92
+ * the comparison. A start manifest already reports a missing step for every
93
+ * execution under it, so those executions are not reported again.
94
+ */
95
+ export const findIncompatibilities = Effect.fnUntraced(function* (declared, options) {
96
+ const sql = yield* SqlClient.SqlClient;
97
+ const current = new Map();
98
+ for (const actor of declared) {
99
+ const workflows = new Map();
100
+ for (const member of actor.workflows)
101
+ workflows.set(member.tag, { member, declared: yield* manifestOf(actor.name, member) });
102
+ current.set(actor.name, workflows);
103
+ }
104
+ const types = toJson([...current.keys()]);
105
+ const scope = options.everyActorType
106
+ ? sql `TRUE`
107
+ : sql `x.actor_type IN (SELECT jsonb_array_elements_text(${types}::jsonb))`;
108
+ const found = new Map();
109
+ const add = (actorType, workflow, problem, open, oldest) => {
110
+ const key = toJson([actorType, workflow, problem]);
111
+ const seen = found.get(key);
112
+ found.set(key, {
113
+ actorType,
114
+ workflow,
115
+ problem,
116
+ open: (seen?.open ?? 0) + open,
117
+ oldestStartedAtMs: Math.min(seen?.oldestStartedAtMs ?? oldest, oldest),
118
+ });
119
+ };
120
+ const verdicts = new Map();
121
+ const verdictOf = Effect.fnUntraced(function* (actorType, workflow, hash, manifest) {
122
+ const key = toJson([actorType, workflow.member.tag, hash]);
123
+ const known = verdicts.get(key);
124
+ if (known !== undefined)
125
+ return known;
126
+ const verdict = startVerdict({
127
+ declared: workflow.declared,
128
+ hash,
129
+ start: manifest === null ? undefined : yield* decodeStoredManifest(manifest).pipe(Effect.orDie),
130
+ newer: false,
131
+ });
132
+ verdicts.set(key, verdict);
133
+ return verdict;
134
+ });
135
+ const groups = yield* sql `SELECT x.actor_type, x.workflow, x.manifest_hash, m.manifest::text AS manifest,
136
+ count(*)::integer AS open, min(x.started_at_ms)::text AS oldest
137
+ FROM actor_workflow_executions x
138
+ LEFT JOIN actor_workflow_manifests m ON m.actor_type = x.actor_type AND m.workflow = x.workflow
139
+ AND m.manifest_hash = x.manifest_hash
140
+ WHERE x.status <> 'finished' AND ${scope}
141
+ GROUP BY x.actor_type, x.workflow, x.manifest_hash, m.manifest::text`;
142
+ for (const group of groups) {
143
+ const oldest = Number(group.oldest);
144
+ const workflows = current.get(group.actor_type);
145
+ if (workflows === undefined) {
146
+ add(group.actor_type, group.workflow, "actor type removed", group.open, oldest);
147
+ continue;
148
+ }
149
+ const workflow = workflows.get(group.workflow);
150
+ if (workflow === undefined) {
151
+ add(group.actor_type, group.workflow, "workflow removed", group.open, oldest);
152
+ continue;
153
+ }
154
+ const verdict = yield* verdictOf(group.actor_type, workflow, group.manifest_hash, group.manifest);
155
+ for (const problem of verdict.problems)
156
+ add(group.actor_type, group.workflow, problem, group.open, oldest);
157
+ }
158
+ const recorded = yield* sql `SELECT x.actor_type, x.workflow, x.manifest_hash, m.manifest::text AS manifest, s.step, s.kind,
159
+ CASE WHEN s.kind = 'version' THEN s.version END AS version,
160
+ count(DISTINCT x.execution_id)::integer AS open, min(x.started_at_ms)::text AS oldest
161
+ FROM actor_workflow_executions x
162
+ JOIN actor_workflow_step s ON s.routing_key = x.routing_key AND s.execution_id = x.execution_id
163
+ LEFT JOIN actor_workflow_manifests m ON m.actor_type = x.actor_type AND m.workflow = x.workflow
164
+ AND m.manifest_hash = x.manifest_hash
165
+ WHERE x.status <> 'finished' AND ${scope} AND (s.kind = 'version' OR s.exit IS NOT NULL)
166
+ GROUP BY x.actor_type, x.workflow, x.manifest_hash, m.manifest::text, s.step, s.kind,
167
+ CASE WHEN s.kind = 'version' THEN s.version END`;
168
+ for (const row of recorded) {
169
+ const workflow = current.get(row.actor_type)?.get(row.workflow);
170
+ if (workflow === undefined)
171
+ continue;
172
+ const oldest = Number(row.oldest);
173
+ const problems = row.kind === "version"
174
+ ? markerProblem({
175
+ versions: workflow.member.versions,
176
+ name: row.step,
177
+ recorded: row.version,
178
+ })
179
+ : workflow.declared.steps.get(row.step)?.kind !== row.kind && row.manifest !== null
180
+ ? []
181
+ : recordedStepProblem({
182
+ declared: workflow.declared,
183
+ step: row.step,
184
+ kind: row.kind,
185
+ settled: true,
186
+ changed: (yield* verdictOf(row.actor_type, workflow, row.manifest_hash, row.manifest))
187
+ .changed,
188
+ });
189
+ for (const problem of problems)
190
+ add(row.actor_type, row.workflow, problem, row.open, oldest);
191
+ }
192
+ for (const [actorType, workflows] of current)
193
+ for (const [tag, { member }] of workflows)
194
+ for (const name of Object.keys(member.versions)) {
195
+ const problems = markerProblem({ versions: member.versions, name, recorded: undefined });
196
+ if (problems.length === 0)
197
+ continue;
198
+ const [predating] = yield* sql `
199
+ SELECT count(*)::integer AS open, min(x.started_at_ms)::text AS oldest
200
+ FROM actor_workflow_executions x
201
+ WHERE x.actor_type = ${actorType} AND x.workflow = ${tag} AND x.status <> 'finished'
202
+ AND NOT EXISTS (SELECT 1 FROM actor_workflow_step s WHERE s.routing_key = x.routing_key
203
+ AND s.execution_id = x.execution_id AND s.kind = 'version' AND s.step = ${name})`;
204
+ if (predating !== undefined && predating.open > 0)
205
+ for (const problem of problems)
206
+ add(actorType, tag, problem, predating.open, Number(predating.oldest));
207
+ }
208
+ return [...found.values()].sort((left, right) => left.actorType.localeCompare(right.actorType) ||
209
+ left.workflow.localeCompare(right.workflow) ||
210
+ left.problem.localeCompare(right.problem));
211
+ });
212
+ /** `Order/Ship step "label" removed 412 open executions (oldest 2026-09-20T08:14:00.000Z)` */
213
+ export const formatIncompatibility = (incompatibility) => `${incompatibility.actorType}/${incompatibility.workflow} ${incompatibility.problem} ${incompatibility.open} open execution${incompatibility.open === 1 ? "" : "s"} (oldest ${DateTime.formatIso(DateTime.makeUnsafe(incompatibility.oldestStartedAtMs))})`;
214
+ /**
215
+ * The startup check for one actor type. It skips the comparison when each
216
+ * workflow's manifest is already the most recently accepted one, no accepted
217
+ * workflow is gone and no open execution started under another manifest; otherwise it compares, and a passing deployment
218
+ * becomes the most recently accepted one, so a rollback is compared again.
219
+ * `retained`: the actor type has workflows or workflow rows retention sweeps.
220
+ *
221
+ * A runner of an older deployment may have started executions since the last
222
+ * comparison, and a comparison that finds no open execution of a dropped workflow
223
+ * lets the deployment pass.
224
+ */
225
+ export const acceptWorkflows = Effect.fnUntraced(function* (actor) {
226
+ const sql = yield* SqlClient.SqlClient;
227
+ if (actor.workflows.length === 0) {
228
+ const [history] = yield* sql `SELECT
229
+ EXISTS (SELECT 1 FROM actor_workflow_manifests WHERE actor_type = ${actor.name}) AS accepted,
230
+ EXISTS (SELECT 1 FROM actor_workflow_executions WHERE actor_type = ${actor.name}) AS executions`;
231
+ if (!history.accepted)
232
+ return { checked: false, incompatibilities: [], retained: history.executions };
233
+ }
234
+ return yield* coordinated({
235
+ resource: `akter/workflows/${actor.name}`,
236
+ work: Effect.gen(function* () {
237
+ const latest = yield* sql `
238
+ SELECT DISTINCT ON (workflow) workflow, manifest_hash FROM actor_workflow_manifests
239
+ WHERE actor_type = ${actor.name}
240
+ ORDER BY workflow, accepted_at_ms DESC, manifest_hash`;
241
+ const rows = [];
242
+ for (const member of actor.workflows) {
243
+ const { manifest, hash } = yield* manifestOf(actor.name, member);
244
+ rows.push({
245
+ actor_type: actor.name,
246
+ workflow: member.tag,
247
+ manifest_hash: hash,
248
+ manifest: toJson(manifest),
249
+ });
250
+ }
251
+ const unchanged = latest.length === rows.length &&
252
+ latest.every((row) => rows.some((current) => current.workflow === row.workflow && current.manifest_hash === row.manifest_hash));
253
+ const foreign = unchanged &&
254
+ (yield* sql `SELECT 1 FROM actor_workflow_executions x
255
+ WHERE x.actor_type = ${actor.name} AND x.status <> 'finished'
256
+ AND NOT EXISTS (SELECT 1 FROM jsonb_to_recordset(${toJson(rows)}::jsonb)
257
+ AS d (workflow text, manifest_hash text)
258
+ WHERE d.workflow = x.workflow AND d.manifest_hash = x.manifest_hash)
259
+ LIMIT 1`).length > 0;
260
+ if (unchanged && !foreign)
261
+ return { checked: false, incompatibilities: [], retained: true };
262
+ const incompatibilities = yield* findIncompatibilities([actor], { everyActorType: false });
263
+ if (incompatibilities.length > 0)
264
+ return { checked: true, incompatibilities, retained: true };
265
+ if (rows.length > 0)
266
+ yield* sql `INSERT INTO actor_workflow_manifests AS a (actor_type, workflow, manifest_hash, manifest, accepted_at_ms)
267
+ SELECT m.actor_type, m.workflow, m.manifest_hash, m.manifest::jsonb,
268
+ GREATEST(floor(extract(epoch FROM clock_timestamp()) * 1000)::bigint,
269
+ (SELECT max(l.accepted_at_ms) + 1 FROM actor_workflow_manifests l
270
+ WHERE l.actor_type = m.actor_type AND l.workflow = m.workflow))
271
+ FROM jsonb_to_recordset(${toJson(rows)}::jsonb)
272
+ AS m (actor_type text, workflow text, manifest_hash text, manifest text)
273
+ ON CONFLICT (actor_type, workflow, manifest_hash)
274
+ DO UPDATE SET accepted_at_ms = EXCLUDED.accepted_at_ms`;
275
+ yield* sql `DELETE FROM actor_workflow_manifests WHERE actor_type = ${actor.name}
276
+ AND workflow NOT IN (SELECT jsonb_array_elements_text(${toJson(rows.map((row) => row.workflow))}::jsonb))`;
277
+ return { checked: true, incompatibilities: [], retained: true };
278
+ }),
279
+ });
280
+ });
281
+ /**
282
+ * The deploy check `durable workflows check` runs: every actor type in the
283
+ * database against `actors`, in one read-only snapshot.
284
+ */
285
+ export const checkWorkflows = (actors) => Effect.suspend(() => inReadOnlySnapshot(findIncompatibilities(actors.map(declaredOf), { everyActorType: true })));
@@ -0,0 +1,107 @@
1
+ import { Context, Crypto, Effect, Schema, Scope } from "effect";
2
+ import { SqlClient, SqlError } from "effect/sql";
3
+ import { type RegisteredCommand, type Registration } from "../members.ts";
4
+ import { Outcome, Request } from "../request.ts";
5
+ import { type ActorRef } from "../../identity/caller.ts";
6
+ import { type ActivationCache } from "../storage/generation.ts";
7
+ /** A running activity re-arms its execution's timer this far ahead, so a lost runner's work resumes. */
8
+ export declare const RECOVERY_MS = 30000;
9
+ /** The outbox timer key of an execution's recovery timer. */
10
+ export declare const timerKey: (executionId: string) => string;
11
+ /**
12
+ * The reserved commands a workflow member adds to its owner: the member's own
13
+ * start, a start staged as an intent, the relay's resume, and interrupt.
14
+ *
15
+ * Interrupting a finished or unknown execution changes nothing.
16
+ */
17
+ export declare const workflowCommands: ({ registration, routingKeyOf, services, }: {
18
+ readonly registration: Pick<Registration, "workflows" | "placement">;
19
+ readonly routingKeyOf: (ref: ActorRef) => bigint;
20
+ readonly services: Context.Context<SqlClient.SqlClient | Crypto.Crypto>;
21
+ }) => ReadonlyMap<string, RegisteredCommand>;
22
+ /** The execution a successful workflow command names, if it names one. */
23
+ export declare const kickedExecution: ({ request, outcome, }: {
24
+ readonly request: Request;
25
+ readonly outcome: Outcome;
26
+ }) => Effect.Effect<{
27
+ executionId: string;
28
+ interrupt: boolean;
29
+ } | undefined, never, never>;
30
+ /** Decodes a finished execution's stored result. */
31
+ export declare const decodeResult: (bytes: Uint8Array) => Effect.Effect<{
32
+ readonly _tag: "Die";
33
+ readonly message: string;
34
+ } | {
35
+ readonly _tag: "Failure";
36
+ readonly error: Schema.Json;
37
+ } | {
38
+ readonly _tag: "Interrupt";
39
+ } | {
40
+ readonly _tag: "Success";
41
+ readonly value: Schema.Json;
42
+ }, never, never>;
43
+ /**
44
+ * Runs one activation's workflow executions. Postgres holds every step; the
45
+ * live fibers here only save a replay. Each write is a short transaction that
46
+ * first checks the activation still holds the owner's generation.
47
+ *
48
+ * Compatibility: a runner leaves an execution for a compatible one when it lacks
49
+ * the workflow, its markers exclude the execution's, it lacks a recorded step or a
50
+ * step of the start manifest, or it would decode a recorded result or the payload
51
+ * differently. Once this runner's result schemas apply to the steps still to
52
+ * settle, its manifest becomes the execution's start manifest; a `newer` manifest
53
+ * is one accepted after this runner's own, as when a newer deployment starts
54
+ * executions while this runner still serves.
55
+ *
56
+ * Replay: an interrupted execution replays to its first unsettled step and stops
57
+ * there, so the compensation finalizers of completed steps run before the
58
+ * interrupt is recorded. A replay of a parked execution counts as running until it parks or
59
+ * finishes, so inspection never reports a working run as suspended. A wake that
60
+ * arrived during a pass replays the run once more unless the pass left the
61
+ * execution for another runner or lost its generation, and a pass the engine
62
+ * stopped to replay always replays. A parking step waits, on the pass's idle
63
+ * signal, until every other step of the pass has parked or finished: a parked branch would
64
+ * otherwise interrupt concurrent branches mid-step, losing a sibling's clock, wait
65
+ * or activity work and possibly replaying forever. A race branch parked on a clock
66
+ * or wait that can now settle stops the run so its replay settles it, and a
67
+ * running sibling activity reruns under the same attempt. The relay consumed the
68
+ * recovery timer, so a still-running activity needs another.
69
+ *
70
+ * Steps: only the caller and tenant are inherited from the activation, because
71
+ * steps run inside the body's fiber whose caller and tenant are the execution's
72
+ * recorded ones. Effect's workflow instance names a workflow, and compensation
73
+ * never reads more of it. Rows are keyed by step and attempt, so each
74
+ * `Activity.retry` attempt is its own row with its own exit. The pending row is
75
+ * committed before an activity runs, so a rerun after a crash reuses its attempt
76
+ * and derived ids. A clock's due time is recorded once, so a replay never moves it.
77
+ * Step writes run inside the body's fiber, where a failed statement is a defect
78
+ * and the timer resumes. A wait's `where` runs outside any lock, and the fenced
79
+ * conditional settle makes a racing timeout or second run settle once. Holding the
80
+ * generation lock, a suspend finds any event committed after a wait's scan, so its
81
+ * wake survives.
82
+ *
83
+ * Compensation: `Workflow.withCompensation` and `Workflow.addFinalizer` register
84
+ * on the run's instance scope. Only a run that records a result closes it, and a
85
+ * replay registers them again, so they run once per execution.
86
+ */
87
+ export declare const activationEngine: (options: {
88
+ readonly registration: Registration;
89
+ readonly ref: ActorRef;
90
+ readonly routingKey: bigint;
91
+ readonly cache: ActivationCache;
92
+ readonly scope: Scope.Scope;
93
+ readonly deliveryMs: number;
94
+ }) => Effect.Effect<{
95
+ kick: (executionId: string, interrupt: boolean) => Effect.Effect<void, never, never>;
96
+ live: () => number;
97
+ }, never, Crypto.Crypto | SqlClient.SqlClient>;
98
+ /**
99
+ * Re-arms the resume timer of every execution with a pending wait for one of
100
+ * `tags`, inside the emitting turn. The turn holds the owner's generation
101
+ * lock, which a wait's registration also takes, so no event is missed.
102
+ */
103
+ export declare const notifyWaits: (routingKey: bigint, ref: {
104
+ readonly tenant: string;
105
+ readonly actor: string;
106
+ readonly id: string;
107
+ }, tags: readonly string[]) => Effect.Effect<boolean, SqlError.SqlError, Crypto.Crypto | SqlClient.SqlClient>;