@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,40 @@
1
+ import { Effect } from "effect";
2
+ import { SqlClient, type Statement } from "effect/sql";
3
+ /** The row columns of the subscription row aliased `alias`, for a select list or `RETURNING`. */
4
+ export declare const rowColumns: ({ sql, alias, }: {
5
+ readonly sql: SqlClient.SqlClient;
6
+ readonly alias: string;
7
+ }) => Statement.Fragment;
8
+ /**
9
+ * CTEs that move the tag summary by the rows of the CTE named `changed`, whose
10
+ * columns name a source and the event tags one row followed before (`was`)
11
+ * and after (`now`) the change, each empty for an inactive or absent row. A
12
+ * summary row counts the active rows of its source that follow its tag, so
13
+ * each count moves by the rows that gained the tag less the rows that lost
14
+ * it. Every count moves in one upsert that takes its rows in key order, so
15
+ * concurrent writers of one source's counts lock them in the same order and
16
+ * never deadlock; an update whose lock order followed the plan would, and its
17
+ * victim's change would wait out a retry. The proposed row holds no negative
18
+ * count, which the summary's check refuses before the conflict is found, so
19
+ * the update reads the signed delta itself. A decrement upserts against the
20
+ * latest version of its row, and `tags_moved` returns every count it set,
21
+ * since one that reached 0 must be deleted before the transaction commits.
22
+ */
23
+ export declare const summarize: ({ sql, changed, }: {
24
+ readonly sql: SqlClient.SqlClient;
25
+ readonly changed: string;
26
+ }) => Statement.Statement<import("effect/sql/SqlConnection").Row>;
27
+ /**
28
+ * Changes subscription rows and the tag summary in one transaction, so no
29
+ * caller maintains the summary. `old` locks the rows about to change and
30
+ * returns their row columns; `change` writes them, reading those rows as
31
+ * `old_rows`, and returns their row columns as they are now, with `active`
32
+ * false for a deleted row. The lock is its own statement: a lock in the
33
+ * changing statement would skip a row that statement already changed, and
34
+ * its rows would then count as new. Locking reads the latest committed
35
+ * version of each row, so a concurrent change that committed first is never
36
+ * counted twice. A summary count the change lowered to 0 is deleted in the
37
+ * same transaction, so no committed summary row counts 0. Returns how many
38
+ * rows `change` wrote.
39
+ */
40
+ export declare const changeRows: (old: Statement.Fragment, change: Statement.Fragment) => Effect.Effect<number, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
@@ -0,0 +1,98 @@
1
+ import { Effect } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ /** A subscription row's key, then what it follows: the columns every row change reads and returns. */
4
+ const ROW = [
5
+ "routing_key",
6
+ "tenant_id",
7
+ "source_type",
8
+ "source_id",
9
+ "subscriber_type",
10
+ "subscription",
11
+ "subscriber_id",
12
+ "active",
13
+ "events",
14
+ ];
15
+ /** The row columns of the subscription row aliased `alias`, for a select list or `RETURNING`. */
16
+ export const rowColumns = ({ sql, alias, }) => sql.literal(ROW.map((column) => `${alias}.${column}`).join(", "));
17
+ /**
18
+ * CTEs that move the tag summary by the rows of the CTE named `changed`, whose
19
+ * columns name a source and the event tags one row followed before (`was`)
20
+ * and after (`now`) the change, each empty for an inactive or absent row. A
21
+ * summary row counts the active rows of its source that follow its tag, so
22
+ * each count moves by the rows that gained the tag less the rows that lost
23
+ * it. Every count moves in one upsert that takes its rows in key order, so
24
+ * concurrent writers of one source's counts lock them in the same order and
25
+ * never deadlock; an update whose lock order followed the plan would, and its
26
+ * victim's change would wait out a retry. The proposed row holds no negative
27
+ * count, which the summary's check refuses before the conflict is found, so
28
+ * the update reads the signed delta itself. A decrement upserts against the
29
+ * latest version of its row, and `tags_moved` returns every count it set,
30
+ * since one that reached 0 must be deleted before the transaction commits.
31
+ */
32
+ export const summarize = ({ sql, changed, }) => {
33
+ const rows = sql.literal(changed);
34
+ return sql `tag_delta AS (
35
+ SELECT routing_key, tenant_id, source_type, source_id, tag, sum(d)::int AS d FROM (
36
+ SELECT c.routing_key, c.tenant_id, c.source_type, c.source_id, x.tag, 1 AS d
37
+ FROM ${rows} c CROSS JOIN LATERAL unnest(c.now) AS x(tag)
38
+ WHERE NOT x.tag = ANY(c.was)
39
+ UNION ALL
40
+ SELECT c.routing_key, c.tenant_id, c.source_type, c.source_id, x.tag, -1 AS d
41
+ FROM ${rows} c CROSS JOIN LATERAL unnest(c.was) AS x(tag)
42
+ WHERE NOT x.tag = ANY(c.now)) moved
43
+ GROUP BY routing_key, tenant_id, source_type, source_id, tag
44
+ HAVING sum(d) <> 0),
45
+ tags_moved AS (
46
+ INSERT INTO actor_subscription_tags AS t (routing_key, tenant_id, source_type, source_id, event, rows)
47
+ SELECT routing_key, tenant_id, source_type, source_id, tag, greatest(d, 0) FROM tag_delta
48
+ ORDER BY routing_key, tenant_id, source_type, source_id, tag
49
+ ON CONFLICT (routing_key, tenant_id, source_type, source_id, event)
50
+ DO UPDATE SET rows = t.rows + (SELECT d.d FROM tag_delta d
51
+ WHERE d.routing_key = EXCLUDED.routing_key AND d.tenant_id = EXCLUDED.tenant_id
52
+ AND d.source_type = EXCLUDED.source_type AND d.source_id = EXCLUDED.source_id
53
+ AND d.tag = EXCLUDED.event)
54
+ RETURNING t.routing_key, t.tenant_id, t.source_type, t.source_id, t.event, t.rows)`;
55
+ };
56
+ /**
57
+ * Changes subscription rows and the tag summary in one transaction, so no
58
+ * caller maintains the summary. `old` locks the rows about to change and
59
+ * returns their row columns; `change` writes them, reading those rows as
60
+ * `old_rows`, and returns their row columns as they are now, with `active`
61
+ * false for a deleted row. The lock is its own statement: a lock in the
62
+ * changing statement would skip a row that statement already changed, and
63
+ * its rows would then count as new. Locking reads the latest committed
64
+ * version of each row, so a concurrent change that committed first is never
65
+ * counted twice. A summary count the change lowered to 0 is deleted in the
66
+ * same transaction, so no committed summary row counts 0. Returns how many
67
+ * rows `change` wrote.
68
+ */
69
+ export const changeRows = Effect.fnUntraced(function* (old, change) {
70
+ const sql = yield* SqlClient.SqlClient;
71
+ return yield* sql.withTransaction(Effect.gen(function* () {
72
+ const [locked] = yield* sql `
73
+ SELECT coalesce(json_agg(o), '[]')::text AS rows FROM (${old}) o`;
74
+ const [result] = yield* sql `
75
+ WITH old_rows AS (
76
+ SELECT * FROM json_to_recordset(${locked.rows}::json) AS o(routing_key bigint,
77
+ tenant_id text, source_type text, source_id text, subscriber_type text,
78
+ subscription text, subscriber_id text, active boolean, events text[])),
79
+ new_rows AS (${change}),
80
+ changed AS (
81
+ SELECT routing_key, tenant_id, source_type, source_id,
82
+ CASE WHEN o.active THEN o.events ELSE '{}'::text[] END AS was,
83
+ CASE WHEN n.active THEN n.events ELSE '{}'::text[] END AS now
84
+ FROM old_rows o FULL JOIN new_rows n USING (routing_key, tenant_id, source_type,
85
+ source_id, subscriber_type, subscription, subscriber_id)),
86
+ ${summarize({ sql, changed: "changed" })}
87
+ SELECT (SELECT count(*) FROM new_rows)::int AS rows,
88
+ (SELECT json_agg(json_build_array(routing_key::text, tenant_id, source_type, source_id,
89
+ event)) FROM tags_moved WHERE rows = 0)::text AS emptied`;
90
+ if (result.emptied !== null)
91
+ yield* sql `DELETE FROM actor_subscription_tags t
92
+ USING json_array_elements(${result.emptied}::json) AS e
93
+ WHERE t.routing_key = (e->>0)::bigint AND t.tenant_id = e->>1
94
+ AND t.source_type = e->>2 AND t.source_id = e->>3 AND t.event = e->>4
95
+ AND t.rows = 0`;
96
+ return result.rows;
97
+ }));
98
+ });
@@ -0,0 +1,39 @@
1
+ import { Context, Crypto, Effect, Scope } from "effect";
2
+ import { Sharding } from "effect/cluster";
3
+ import { SqlClient, SqlError } from "effect/sql";
4
+ import type { Registration } from "./members.ts";
5
+ import type { tenantContent } from "./content/store.ts";
6
+ import type { SubscriptionRelay } from "./subscriptions/relay.ts";
7
+ import { FrameworkClock } from "./turn/admission.ts";
8
+ /**
9
+ * Starts the runtime's periodic background work in its scope: the payload
10
+ * writer heartbeat every half window, retention and content cleanup every
11
+ * minute when the cleanup hooks allow it, and the telemetry sampler as one
12
+ * singleton per Sharding. The writer rows are dropped when the scope closes.
13
+ * Returns the cleanup pass for callers that sweep on demand, the sweeping
14
+ * fiber a drain interrupts, and one sampling pass.
15
+ */
16
+ export declare const startSweeps: (args_0: {
17
+ readonly registrations: ReadonlyMap<string, Registration>;
18
+ readonly sweepsWorkflows: ReadonlySet<string>;
19
+ readonly retryWindowMs: number;
20
+ readonly subscriptions: SubscriptionRelay;
21
+ readonly content: ReturnType<typeof tenantContent> | undefined;
22
+ readonly services: Context.Context<SqlClient.SqlClient | Crypto.Crypto | Sharding.Sharding>;
23
+ readonly frameworkClock: (typeof FrameworkClock)["Service"];
24
+ readonly refreshPayloadWriters: Effect.Effect<void, SqlError.SqlError>;
25
+ readonly writerWindowMs: number;
26
+ readonly runtimeId: string;
27
+ readonly sampleEveryMs: number;
28
+ readonly sharding: Sharding.Sharding["Service"];
29
+ readonly scope: Scope.Scope;
30
+ }) => Effect.Effect<{
31
+ cleanup: Effect.Effect<{
32
+ receipts: number;
33
+ events: number;
34
+ workflows: number;
35
+ contents: number;
36
+ }, import("./subscriptions/relay.ts").SubscriptionError, never>;
37
+ sweeping: import("effect/Fiber").Fiber<never, never> | undefined;
38
+ sample: Effect.Effect<void, never, never>;
39
+ }, never, Scope.Scope>;
@@ -0,0 +1,54 @@
1
+ import { Cause, Context, Crypto, Effect, Scope } from "effect";
2
+ import { Sharding } from "effect/cluster";
3
+ import { SqlClient, SqlError } from "effect/sql";
4
+ import { dropWriters } from "./payloads/versions.js";
5
+ import { sweep } from "./storage/retention.js";
6
+ import { databaseSampler } from "./telemetry/sampler.js";
7
+ import { FrameworkClock } from "./turn/admission.js";
8
+ import { CleanupHooks } from "./turn/hooks.js";
9
+ /** Shardings whose telemetry sampler is registered; Cluster allows one per name. */
10
+ const sampled = new WeakSet();
11
+ /** Pause between retention sweeps. */
12
+ const CLEANUP_INTERVAL = "1 minute";
13
+ /**
14
+ * Starts the runtime's periodic background work in its scope: the payload
15
+ * writer heartbeat every half window, retention and content cleanup every
16
+ * minute when the cleanup hooks allow it, and the telemetry sampler as one
17
+ * singleton per Sharding. The writer rows are dropped when the scope closes.
18
+ * Returns the cleanup pass for callers that sweep on demand, the sweeping
19
+ * fiber a drain interrupts, and one sampling pass.
20
+ */
21
+ export const startSweeps = Effect.fnUntraced(function* ({ registrations, sweepsWorkflows, retryWindowMs, subscriptions, content, services, frameworkClock, refreshPayloadWriters, writerWindowMs, runtimeId, sampleEveryMs, sharding, scope, }) {
22
+ const cleanupHooks = yield* CleanupHooks;
23
+ const cleanup = Effect.suspend(() => refreshPayloadWriters.pipe(Effect.orDie, Effect.andThen(sweep(Array.from(registrations.values(), ({ name, policy }) => ({
24
+ actorType: name,
25
+ keepReceiptsMs: policy.keepReceiptsMs,
26
+ keepEventsMs: policy.keepEventsMs,
27
+ holdEventsMs: policy.holdEventsMs,
28
+ deliveryMs: policy.deliveryMs,
29
+ keepWorkflowsMs: policy.keepWorkflowsMs,
30
+ workflows: sweepsWorkflows.has(name),
31
+ })), retryWindowMs).pipe(Effect.tap(() => Effect.forEach([...registrations.values()], (registration) => subscriptions.cleanupRemoved(registration.name, registration.subscriptions.map((declared) => declared.tag)), { discard: true })))), Effect.flatMap((swept) => Effect.map(content === undefined ? Effect.succeed(0) : content.sweep(false), (contents) => ({ ...swept, contents }))))).pipe(Effect.provideContext(services), Effect.provideService(FrameworkClock, frameworkClock), Effect.provideService(CleanupHooks, cleanupHooks));
32
+ yield* Effect.sleep(writerWindowMs / 2).pipe(Effect.andThen(refreshPayloadWriters.pipe(Effect.catchCause((cause) => Cause.hasInterruptsOnly(cause)
33
+ ? Effect.interrupt
34
+ : Effect.logWarning("Payload writer refresh failed", cause)))), Effect.forever, Effect.forkIn(scope));
35
+ yield* Effect.addFinalizer(() => dropWriters(runtimeId).pipe(Effect.provideContext(services), Effect.catchCause((cause) => Effect.logWarning("Payload writer rows not dropped", cause))));
36
+ const sweeping = cleanupHooks.periodic
37
+ ? yield* Effect.sleep(CLEANUP_INTERVAL).pipe(Effect.andThen(cleanup.pipe(Effect.catchCause((cause) => Cause.hasInterruptsOnly(cause)
38
+ ? Effect.interrupt
39
+ : Effect.logWarning("Retention cleanup failed", cause)))), Effect.forever, Effect.forkIn(scope))
40
+ : undefined;
41
+ const sampler = databaseSampler();
42
+ const sample = Effect.suspend(() => sampler(Array.from(registrations.values(), ({ name, policy }) => ({
43
+ actorType: name,
44
+ keepEventsMs: policy.keepEventsMs,
45
+ holdEventsMs: policy.holdEventsMs,
46
+ })))).pipe(Effect.provideContext(services), Effect.provideService(FrameworkClock, frameworkClock), Effect.catchCause((cause) => Cause.hasInterruptsOnly(cause)
47
+ ? Effect.interrupt
48
+ : Effect.logWarning("Telemetry sampling failed", cause)));
49
+ if (!sampled.has(sharding)) {
50
+ sampled.add(sharding);
51
+ yield* sharding.registerSingleton("akter/telemetry", Effect.sleep(sampleEveryMs).pipe(Effect.andThen(sample), Effect.forever));
52
+ }
53
+ return { cleanup, sweeping, sample };
54
+ });
@@ -0,0 +1,57 @@
1
+ import { Context, Effect, Schema } from "effect";
2
+ /**
3
+ * One deterministic defect, as its failed turn span recorded it: the span's
4
+ * name, trace, and attributes, and the cause the span carries.
5
+ */
6
+ export declare const DefectRecord: Schema.Struct<{
7
+ readonly span: Schema.String;
8
+ readonly traceId: Schema.String;
9
+ readonly spanId: Schema.String;
10
+ readonly atMs: Schema.Finite;
11
+ readonly tenant: Schema.String;
12
+ readonly actorType: Schema.String;
13
+ readonly actorId: Schema.String;
14
+ readonly command: Schema.String;
15
+ readonly commandId: Schema.String;
16
+ readonly trigger: Schema.String;
17
+ readonly cause: Schema.String;
18
+ }>;
19
+ /** The decoded shape of a `DefectRecord`. */
20
+ export type DefectRecord = typeof DefectRecord.Type;
21
+ /** An array of defect records, as the operator read returns them. */
22
+ export declare const DefectRecords: Schema.$Array<Schema.Struct<{
23
+ readonly span: Schema.String;
24
+ readonly traceId: Schema.String;
25
+ readonly spanId: Schema.String;
26
+ readonly atMs: Schema.Finite;
27
+ readonly tenant: Schema.String;
28
+ readonly actorType: Schema.String;
29
+ readonly actorId: Schema.String;
30
+ readonly command: Schema.String;
31
+ readonly commandId: Schema.String;
32
+ readonly trigger: Schema.String;
33
+ readonly cause: Schema.String;
34
+ }>>;
35
+ /** Narrows a defect listing; `limit` keeps the newest matches. */
36
+ interface DefectFilter {
37
+ readonly actorType?: string | undefined;
38
+ readonly sinceMs?: number | undefined;
39
+ readonly limit?: number | undefined;
40
+ }
41
+ declare const DefectLog_base: Context.ServiceClass<DefectLog, "@rikalabs/akter/runtime/telemetry/defects/DefectLog", {
42
+ readonly record: (defect: DefectRecord) => Effect.Effect<void>;
43
+ readonly list: (filter: DefectFilter) => Effect.Effect<ReadonlyArray<DefectRecord>>;
44
+ }>;
45
+ /**
46
+ * The defect spans this runner's exporter saw most recently, newest last.
47
+ * The log is bounded and in memory: the telemetry backend keeps the history,
48
+ * and a restarted runner starts empty.
49
+ */
50
+ export declare class DefectLog extends DefectLog_base {
51
+ }
52
+ /** An in-memory `DefectLog` that keeps the newest `capacity` records. */
53
+ export declare const boundedDefectLog: (capacity: number) => {
54
+ readonly record: (defect: DefectRecord) => Effect.Effect<void>;
55
+ readonly list: (filter: DefectFilter) => Effect.Effect<ReadonlyArray<DefectRecord>>;
56
+ };
57
+ export {};
@@ -0,0 +1,43 @@
1
+ import { Context, Effect, Schema } from "effect";
2
+ /**
3
+ * One deterministic defect, as its failed turn span recorded it: the span's
4
+ * name, trace, and attributes, and the cause the span carries.
5
+ */
6
+ export const DefectRecord = Schema.Struct({
7
+ span: Schema.String,
8
+ traceId: Schema.String,
9
+ spanId: Schema.String,
10
+ atMs: Schema.Finite,
11
+ tenant: Schema.String,
12
+ actorType: Schema.String,
13
+ actorId: Schema.String,
14
+ command: Schema.String,
15
+ commandId: Schema.String,
16
+ trigger: Schema.String,
17
+ cause: Schema.String,
18
+ });
19
+ /** An array of defect records, as the operator read returns them. */
20
+ export const DefectRecords = Schema.Array(DefectRecord);
21
+ /**
22
+ * The defect spans this runner's exporter saw most recently, newest last.
23
+ * The log is bounded and in memory: the telemetry backend keeps the history,
24
+ * and a restarted runner starts empty.
25
+ */
26
+ export class DefectLog extends Context.Service()("@rikalabs/akter/runtime/telemetry/defects/DefectLog") {
27
+ }
28
+ /** An in-memory `DefectLog` that keeps the newest `capacity` records. */
29
+ export const boundedDefectLog = (capacity) => {
30
+ const records = [];
31
+ return DefectLog.of({
32
+ record: (defect) => Effect.sync(() => {
33
+ records.push(defect);
34
+ if (records.length > capacity)
35
+ records.splice(0, records.length - capacity);
36
+ }),
37
+ list: ({ actorType, sinceMs, limit }) => Effect.sync(() => {
38
+ const matching = records.filter((defect) => (actorType === undefined || defect.actorType === actorType) &&
39
+ (sinceMs === undefined || defect.atMs >= sinceMs));
40
+ return limit === undefined ? matching : matching.slice(-limit);
41
+ }),
42
+ });
43
+ };
@@ -0,0 +1,52 @@
1
+ import { Effect, Metric } from "effect";
2
+ /**
3
+ * Metric names and attribute keys are public, like span names. Prometheus
4
+ * exposition replaces `.` and `-` with `_`, so `akter.turns` is
5
+ * scraped as `akter_turns`. Attributes are bounded by the
6
+ * deployment's declarations (actor types, commands, jobs, subscriptions)
7
+ * or by fixed sets; no metric carries a tenant, actor id, or command id.
8
+ *
9
+ * The database gauges (`outboxRows` and the other sampled series) are read
10
+ * from the database by one runner of the deployment.
11
+ */
12
+ export declare const Metrics: {
13
+ readonly turns: Metric.Counter<number>;
14
+ readonly turnDuration: Metric.Histogram<number>;
15
+ readonly mailboxAge: Metric.Histogram<number>;
16
+ readonly poolWait: Metric.Histogram<number>;
17
+ readonly activations: Metric.Gauge<number>;
18
+ readonly activationsStarted: Metric.Counter<number>;
19
+ readonly receiptsWritten: Metric.Counter<number>;
20
+ readonly receiptsReplayed: Metric.Counter<number>;
21
+ readonly receiptsPruned: Metric.Counter<number>;
22
+ readonly eventsAppended: Metric.Counter<number>;
23
+ readonly eventsPruned: Metric.Counter<number>;
24
+ readonly outboxStaged: Metric.Counter<number>;
25
+ readonly relayDelivered: Metric.Counter<number>;
26
+ readonly relayRetried: Metric.Counter<number>;
27
+ readonly deadLetters: Metric.Counter<number>;
28
+ readonly undeliverableGaps: Metric.Counter<number>;
29
+ readonly outboxRows: Metric.Gauge<number>;
30
+ readonly relayLag: Metric.Gauge<number>;
31
+ readonly stuckRows: Metric.Gauge<number>;
32
+ readonly subscriptionLagEvents: Metric.Gauge<number>;
33
+ readonly subscriptionLag: Metric.Gauge<number>;
34
+ readonly subscriptionPinned: Metric.Gauge<number>;
35
+ readonly workflowPinned: Metric.Gauge<number>;
36
+ readonly fleetLagBytes: Metric.Gauge<number>;
37
+ readonly fleetLag: Metric.Gauge<number>;
38
+ readonly fleetGroupsRecomputed: Metric.Counter<number>;
39
+ readonly fleetBatches: Metric.Counter<number>;
40
+ };
41
+ type Attributes = Readonly<Record<string, string>>;
42
+ /** Adds `value` to `metric` under `attributes`; a zero adds nothing. Never fails. */
43
+ export declare const count: {
44
+ (attributes: Attributes, value: number): (metric: Metric.Metric<number, unknown>) => Effect.Effect<void>;
45
+ (metric: Metric.Metric<number, unknown>, attributes: Attributes, value: number): Effect.Effect<void>;
46
+ };
47
+ /** Sets a gauge, or records a histogram observation, under `attributes`. */
48
+ export declare const record: {
49
+ (attributes: Attributes, value: number): (metric: Metric.Metric<number, unknown>) => Effect.Effect<void>;
50
+ (metric: Metric.Metric<number, unknown>, attributes: Attributes, value: number): Effect.Effect<void>;
51
+ };
52
+ export {};
@@ -0,0 +1,138 @@
1
+ import { Effect, Metric } from "effect";
2
+ import { dual } from "effect/Function";
3
+ const milliseconds = [1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10_000, 30_000, 60_000];
4
+ /**
5
+ * Metric names and attribute keys are public, like span names. Prometheus
6
+ * exposition replaces `.` and `-` with `_`, so `akter.turns` is
7
+ * scraped as `akter_turns`. Attributes are bounded by the
8
+ * deployment's declarations (actor types, commands, jobs, subscriptions)
9
+ * or by fixed sets; no metric carries a tenant, actor id, or command id.
10
+ *
11
+ * The database gauges (`outboxRows` and the other sampled series) are read
12
+ * from the database by one runner of the deployment.
13
+ */
14
+ export const Metrics = {
15
+ turns: Metric.counter("akter.turns", {
16
+ description: "Turns finished on this runner, by actor_type and outcome (success, failure, defect, replay, acknowledged).",
17
+ incremental: true,
18
+ }),
19
+ turnDuration: Metric.histogram("akter.turn.duration_ms", {
20
+ description: "Turn time from the mailbox to the reply, by actor_type.",
21
+ boundaries: milliseconds,
22
+ }),
23
+ mailboxAge: Metric.histogram("akter.mailbox.age_ms", {
24
+ description: "How long a command waited between its admission and the start of its turn, by actor_type.",
25
+ boundaries: milliseconds,
26
+ }),
27
+ poolWait: Metric.histogram("akter.pool.wait_ms", {
28
+ description: "How long a turn waited for a session from the turn pool (Postgres only).",
29
+ boundaries: milliseconds,
30
+ }),
31
+ activations: Metric.gauge("akter.activations", {
32
+ description: "Activations resident on this runner, by actor_type.",
33
+ }),
34
+ activationsStarted: Metric.counter("akter.activations.started", {
35
+ description: "Activations built on this runner, by actor_type, including rebuilds after a defect.",
36
+ incremental: true,
37
+ }),
38
+ receiptsWritten: Metric.counter("akter.receipts.written", {
39
+ description: "Receipts committed by turns on this runner, by actor_type.",
40
+ incremental: true,
41
+ }),
42
+ receiptsReplayed: Metric.counter("akter.receipts.replayed", {
43
+ description: "Commands answered from a stored receipt without running their handler, by actor_type.",
44
+ incremental: true,
45
+ }),
46
+ receiptsPruned: Metric.counter("akter.receipts.pruned", {
47
+ description: "Receipts retention deleted on this runner, by actor_type.",
48
+ incremental: true,
49
+ }),
50
+ eventsAppended: Metric.counter("akter.events.appended", {
51
+ description: "Events committed by turns on this runner, by actor_type.",
52
+ incremental: true,
53
+ }),
54
+ eventsPruned: Metric.counter("akter.events.pruned", {
55
+ description: "Events retention deleted on this runner, by actor_type.",
56
+ incremental: true,
57
+ }),
58
+ outboxStaged: Metric.counter("akter.outbox.staged", {
59
+ description: "Outbox rows committed by turns on this runner, by kind (intent, job).",
60
+ incremental: true,
61
+ }),
62
+ relayDelivered: Metric.counter("akter.relay.delivered", {
63
+ description: "Outbox and subscription deliveries this runner settled, by kind (intent, job, subscription).",
64
+ incremental: true,
65
+ }),
66
+ relayRetried: Metric.counter("akter.relay.retried", {
67
+ description: "Deliveries this runner backed off to retry, by kind (intent, job, subscription).",
68
+ incremental: true,
69
+ }),
70
+ deadLetters: Metric.counter("akter.job.dead_letters", {
71
+ description: "Jobs dead-lettered on this runner, by actor_type and job.",
72
+ incremental: true,
73
+ }),
74
+ undeliverableGaps: Metric.counter("akter.subscription.undeliverable_gaps", {
75
+ description: "Retention gaps an id-routed subscription row counted without a recipient, by subscriber_type and subscription.",
76
+ incremental: true,
77
+ }),
78
+ outboxRows: Metric.gauge("akter.outbox.rows", {
79
+ description: "Outbox rows waiting, by kind (intent, job, feed, control).",
80
+ }),
81
+ relayLag: Metric.gauge("akter.relay.lag_ms", {
82
+ description: "How long the oldest due, unclaimed row has been due, by kind (intent, job, subscription); 0 when none is due.",
83
+ }),
84
+ stuckRows: Metric.gauge("akter.relay.stuck_rows", {
85
+ description: "Rows claimed at least 8 times and still pending, by kind (intent, subscription).",
86
+ }),
87
+ subscriptionLagEvents: Metric.gauge("akter.subscription.lag_events", {
88
+ description: "The most source events any row of a subscription is behind, by subscriber_type and subscription.",
89
+ }),
90
+ subscriptionLag: Metric.gauge("akter.subscription.lag_ms", {
91
+ description: "The age of the oldest undelivered event of any row of a subscription, by subscriber_type and subscription.",
92
+ }),
93
+ subscriptionPinned: Metric.gauge("akter.subscription.pinned_events", {
94
+ description: "Events past keepEvents that subscriptions still hold back from retention, by source actor_type.",
95
+ }),
96
+ workflowPinned: Metric.gauge("akter.workflow.pinned_events", {
97
+ description: "Events past keepEvents that open workflow executions still hold back from retention, by actor_type.",
98
+ }),
99
+ fleetLagBytes: Metric.gauge("akter.fleet.lag_bytes", {
100
+ description: "WAL bytes between the server's flush position and what the fleet maintainer has applied, by view; on the runner that maintains.",
101
+ }),
102
+ fleetLag: Metric.gauge("akter.fleet.lag_ms", {
103
+ description: "Time since the fleet maintainer last drained the change feed, by view; on the runner that maintains.",
104
+ }),
105
+ fleetGroupsRecomputed: Metric.counter("akter.fleet.groups_recomputed", {
106
+ description: "Fleet view groups the maintainer recomputed, by view.",
107
+ incremental: true,
108
+ }),
109
+ fleetBatches: Metric.counter("akter.fleet.batches", {
110
+ description: "Change-feed batches the fleet maintainer applied and advanced past.",
111
+ incremental: true,
112
+ }),
113
+ };
114
+ const attributedMetrics = new WeakMap();
115
+ /**
116
+ * The metric under `attributes`, made once per attribute set and reused. A
117
+ * fresh `Metric.withAttributes` re-derives its series key, sorting and
118
+ * serializing the attributes, on every update. Attribute sets are bounded by
119
+ * the deployment's declarations, so the cache is too.
120
+ */
121
+ const attributed = (metric, attributes) => {
122
+ let byKey = attributedMetrics.get(metric);
123
+ if (byKey === undefined) {
124
+ byKey = new Map();
125
+ attributedMetrics.set(metric, byKey);
126
+ }
127
+ const key = JSON.stringify(Object.entries(attributes).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0));
128
+ let cached = byKey.get(key);
129
+ if (cached === undefined) {
130
+ cached = Metric.withAttributes(metric, attributes);
131
+ byKey.set(key, cached);
132
+ }
133
+ return cached;
134
+ };
135
+ /** Adds `value` to `metric` under `attributes`; a zero adds nothing. Never fails. */
136
+ export const count = dual(3, (metric, attributes, value) => value === 0 ? Effect.void : Metric.update(attributed(metric, attributes), value));
137
+ /** Sets a gauge, or records a histogram observation, under `attributes`. */
138
+ export const record = dual(3, (metric, attributes, value) => Metric.update(attributed(metric, attributes), value));
@@ -0,0 +1,19 @@
1
+ import { HttpRouter } from "effect/http";
2
+ /** Configuration for `Telemetry.serve`. */
3
+ export interface TelemetryOptions {
4
+ /** Prefix for the route. Default none: `/metrics`. */
5
+ readonly basePath?: `/${string}`;
6
+ }
7
+ /**
8
+ * Serves this runner's metrics on the application's `HttpRouter` as
9
+ * `GET /metrics`, in Prometheus text exposition. Metric attributes carry no
10
+ * tenant or actor id, so the route is unauthenticated, like any scrape
11
+ * target; keep it on a private listener. Defect spans are an operator read,
12
+ * served by `Operators.serve`.
13
+ */
14
+ declare const serve: (options?: TelemetryOptions) => import("effect/Layer").Layer<never, never, HttpRouter.HttpRouter>;
15
+ /** Runner telemetry: `serve` mounts the Prometheus route. */
16
+ export declare const Telemetry: {
17
+ serve: typeof serve;
18
+ };
19
+ export {};
@@ -0,0 +1,18 @@
1
+ import { Effect } from "effect";
2
+ import { HttpRouter, HttpServerResponse } from "effect/http";
3
+ import { PrometheusMetrics } from "effect/observability";
4
+ /**
5
+ * Serves this runner's metrics on the application's `HttpRouter` as
6
+ * `GET /metrics`, in Prometheus text exposition. Metric attributes carry no
7
+ * tenant or actor id, so the route is unauthenticated, like any scrape
8
+ * target; keep it on a private listener. Defect spans are an operator read,
9
+ * served by `Operators.serve`.
10
+ */
11
+ const serve = (options = {}) => HttpRouter.use(Effect.fnUntraced(function* (router) {
12
+ const basePath = (options.basePath ?? "").replace(/\/+$/, "");
13
+ yield* router.add("GET", `${basePath}/metrics`, () => PrometheusMetrics.format().pipe(Effect.map((body) => HttpServerResponse.text(body, {
14
+ contentType: "text/plain; version=0.0.4; charset=utf-8",
15
+ }))));
16
+ }));
17
+ /** Runner telemetry: `serve` mounts the Prometheus route. */
18
+ export const Telemetry = { serve };
@@ -0,0 +1,26 @@
1
+ import { Context, Effect } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ /** An actor type's event-retention settings, in milliseconds, as the sampler reads them. */
4
+ interface SampledType {
5
+ readonly actorType: string;
6
+ readonly keepEventsMs: number;
7
+ readonly holdEventsMs: number;
8
+ }
9
+ /**
10
+ * Reports the gauges only the database knows. Each statement reads pending
11
+ * work or retained history past its horizon, never every stored actor: the
12
+ * outbox and due subscription rows are the relay's backlog, and events past
13
+ * `keepEvents` stay only while something pins them. A series that stops
14
+ * appearing is reported as 0 once, so a recovered subscription or an emptied
15
+ * kind does not keep its last value. Only due or backing-off subscription rows
16
+ * have undelivered events, which the partial due index covers, and pinned
17
+ * events past `keepEvents` are read from the pinned rows alone.
18
+ */
19
+ export declare const databaseSampler: () => (types: readonly SampledType[]) => Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
20
+ declare const TelemetrySampler_base: Context.ServiceClass<TelemetrySampler, "@rikalabs/akter/runtime/telemetry/sampler/TelemetrySampler", {
21
+ readonly sample: Effect.Effect<void>;
22
+ }>;
23
+ /** Samples the database gauges at once; the runtime also samples every `observability.sampleEvery`. */
24
+ export declare class TelemetrySampler extends TelemetrySampler_base {
25
+ }
26
+ export {};