@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,101 @@
1
+ import { Context, Effect } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { databaseTime } from "../turn/admission.js";
4
+ import { Metrics, record } from "./metrics.js";
5
+ /** Claims at or above this count mark a row as stuck, for intents and subscriptions alike. */
6
+ const STUCK_ATTEMPTS = 8;
7
+ /**
8
+ * Reports the gauges only the database knows. Each statement reads pending
9
+ * work or retained history past its horizon, never every stored actor: the
10
+ * outbox and due subscription rows are the relay's backlog, and events past
11
+ * `keepEvents` stay only while something pins them. A series that stops
12
+ * appearing is reported as 0 once, so a recovered subscription or an emptied
13
+ * kind does not keep its last value. Only due or backing-off subscription rows
14
+ * have undelivered events, which the partial due index covers, and pinned
15
+ * events past `keepEvents` are read from the pinned rows alone.
16
+ */
17
+ export const databaseSampler = () => {
18
+ const reported = new Map();
19
+ return Effect.fnUntraced(function* (types) {
20
+ const sql = yield* SqlClient.SqlClient;
21
+ const now = yield* databaseTime;
22
+ const values = new Map();
23
+ const set = (metric, attributes, value) => {
24
+ values.set(`${metric.id}${JSON.stringify(attributes)}`, { metric, attributes, value });
25
+ };
26
+ const outbox = yield* sql `
27
+ SELECT kind, count(*)::int AS rows,
28
+ COALESCE(max(${now}::bigint - due_at_ms) FILTER (WHERE due_at_ms <= ${now}), 0)::text AS lag,
29
+ count(*) FILTER (WHERE attempts >= ${STUCK_ATTEMPTS})::int AS stuck
30
+ FROM actor_outbox GROUP BY kind`;
31
+ for (const kind of ["intent", "job", "feed", "control"]) {
32
+ const row = outbox.find((found) => found.kind === kind);
33
+ set(Metrics.outboxRows, { kind }, row?.rows ?? 0);
34
+ set(Metrics.relayLag, { kind }, Number(row?.lag ?? 0));
35
+ }
36
+ set(Metrics.stuckRows, { kind: "intent" }, outbox.find((row) => row.kind === "intent")?.stuck ?? 0);
37
+ const subscriptions = yield* sql `
38
+ SELECT s.subscriber_type, s.subscription,
39
+ max(g.event_sequence - s.delivered)::text AS events,
40
+ COALESCE(max(${now}::bigint - e.emitted_at_ms), 0)::text AS lag,
41
+ COALESCE(max(${now}::bigint - s.due_at_ms) FILTER (WHERE s.due_at_ms <= ${now}), 0)::text AS due,
42
+ count(*) FILTER (WHERE s.attempts >= ${STUCK_ATTEMPTS})::int AS stuck
43
+ FROM actor_subscriptions s
44
+ JOIN actor_generations g ON g.routing_key = s.routing_key AND g.tenant_id = s.tenant_id
45
+ AND g.actor_type = s.source_type AND g.actor_id = s.source_id
46
+ LEFT JOIN LATERAL (
47
+ SELECT e.emitted_at_ms FROM actor_events e
48
+ WHERE e.routing_key = s.routing_key AND e.tenant_id = s.tenant_id
49
+ AND e.actor_type = s.source_type AND e.actor_id = s.source_id
50
+ AND e.sequence > s.delivered AND e.event = ANY(s.events)
51
+ ORDER BY e.sequence LIMIT 1) e ON true
52
+ WHERE s.active AND s.due_at_ms IS NOT NULL
53
+ GROUP BY s.subscriber_type, s.subscription`;
54
+ let subscriptionLag = 0;
55
+ let subscriptionStuck = 0;
56
+ for (const row of subscriptions) {
57
+ const attributes = { subscriber_type: row.subscriber_type, subscription: row.subscription };
58
+ set(Metrics.subscriptionLagEvents, attributes, Number(row.events));
59
+ set(Metrics.subscriptionLag, attributes, Number(row.lag));
60
+ subscriptionLag = Math.max(subscriptionLag, Number(row.due));
61
+ subscriptionStuck += row.stuck;
62
+ }
63
+ set(Metrics.relayLag, { kind: "subscription" }, subscriptionLag);
64
+ set(Metrics.stuckRows, { kind: "subscription" }, subscriptionStuck);
65
+ for (const type of types) {
66
+ const cutoff = now - type.keepEventsMs;
67
+ const holdCutoff = cutoff - type.holdEventsMs;
68
+ const [pinned] = yield* sql `
69
+ SELECT
70
+ count(*) FILTER (WHERE e.emitted_at_ms > ${holdCutoff} AND e.sequence > s.held)::int AS subscriptions,
71
+ count(*) FILTER (WHERE e.sequence > w.held)::int AS workflows
72
+ FROM actor_events e
73
+ LEFT JOIN LATERAL (
74
+ SELECT min(s.delivered) AS held FROM actor_subscriptions s
75
+ WHERE s.routing_key = e.routing_key AND s.tenant_id = e.tenant_id
76
+ AND s.source_type = e.actor_type AND s.source_id = e.actor_id AND s.active) s ON true
77
+ LEFT JOIN LATERAL (
78
+ SELECT min(LEAST(x.event_cursor, COALESCE(w.wait_after, x.event_cursor))) AS held
79
+ FROM actor_workflow_executions x
80
+ LEFT JOIN actor_workflow_step w ON w.routing_key = x.routing_key
81
+ AND w.execution_id = x.execution_id AND w.kind = 'wait' AND w.exit IS NULL
82
+ WHERE x.routing_key = e.routing_key AND x.tenant_id = e.tenant_id
83
+ AND x.actor_type = e.actor_type AND x.actor_id = e.actor_id
84
+ AND x.status <> 'finished') w ON true
85
+ WHERE e.actor_type = ${type.actorType} AND e.emitted_at_ms <= ${cutoff}`;
86
+ set(Metrics.subscriptionPinned, { actor_type: type.actorType }, pinned?.subscriptions ?? 0);
87
+ set(Metrics.workflowPinned, { actor_type: type.actorType }, pinned?.workflows ?? 0);
88
+ }
89
+ for (const [key, series] of reported)
90
+ if (!values.has(key))
91
+ yield* record(series.metric, series.attributes, 0);
92
+ reported.clear();
93
+ for (const [key, { metric, attributes, value }] of values) {
94
+ yield* record(metric, attributes, value);
95
+ reported.set(key, { metric, attributes });
96
+ }
97
+ });
98
+ };
99
+ /** Samples the database gauges at once; the runtime also samples every `observability.sampleEvery`. */
100
+ export class TelemetrySampler extends Context.Service()("@rikalabs/akter/runtime/telemetry/sampler/TelemetrySampler") {
101
+ }
@@ -0,0 +1,38 @@
1
+ import type { Request } from "../request.ts";
2
+ /**
3
+ * Span names are public: dashboards, alerts, and `durable defects list` match
4
+ * on them, so a rename is a breaking change. Every name is bounded by the
5
+ * deployment's declarations, never by an actor id or command id; those are
6
+ * attributes.
7
+ */
8
+ export declare const SpanNames: {
9
+ /** One command's admission on the runner that received it, from the receipt probe to the reply. */
10
+ readonly admission: "akter.admission";
11
+ /** One command turn on the actor's owner. */
12
+ readonly turn: (actor: string, command: string) => string;
13
+ /** One turn batch on the actor's owner: the commands that were waiting, run in one transaction. */
14
+ readonly batch: (actor: string) => string;
15
+ /** The turn's commit group, from the first staged write to the `COMMIT` reply. */
16
+ readonly commit: "akter.commit";
17
+ /** One relay delivery of an intent, timer, or cron tick. */
18
+ readonly relayIntent: "akter.relay.intent";
19
+ /** One relay delivery pass over a claimed subscription row. */
20
+ readonly relaySubscription: "akter.relay.subscription";
21
+ /** One executor attempt of a job. */
22
+ readonly job: (actor: string, job: string) => string;
23
+ };
24
+ /**
25
+ * What started a turn: `command` for an external caller, or the System
26
+ * source of a relay, workflow, or job route delivery.
27
+ */
28
+ export declare const triggerOf: (request: Request) => "actor" | "command" | "cron" | "job" | "process" | "subscription" | "timer" | "workflow";
29
+ /** Attributes every admission and turn span carries; none is a credential or payload. */
30
+ export declare const requestAttributes: (request: Request) => {
31
+ "actor.type": string;
32
+ "actor.tenant": string;
33
+ "actor.id": string;
34
+ "command.name": string;
35
+ "command.id": string;
36
+ "caller.kind": "Anonymous" | "System" | "User";
37
+ "turn.trigger": string;
38
+ };
@@ -0,0 +1,44 @@
1
+ import { Schema } from "effect";
2
+ import { System } from "../../identity/caller.js";
3
+ /**
4
+ * Span names are public: dashboards, alerts, and `durable defects list` match
5
+ * on them, so a rename is a breaking change. Every name is bounded by the
6
+ * deployment's declarations, never by an actor id or command id; those are
7
+ * attributes.
8
+ */
9
+ export const SpanNames = {
10
+ /** One command's admission on the runner that received it, from the receipt probe to the reply. */
11
+ admission: "akter.admission",
12
+ /** One command turn on the actor's owner. */
13
+ turn: (actor, command) => `akter.${actor}/${command}`,
14
+ /** One turn batch on the actor's owner: the commands that were waiting, run in one transaction. */
15
+ batch: (actor) => `akter.${actor}/batch`,
16
+ /** The turn's commit group, from the first staged write to the `COMMIT` reply. */
17
+ commit: "akter.commit",
18
+ /** One relay delivery of an intent, timer, or cron tick. */
19
+ relayIntent: "akter.relay.intent",
20
+ /** One relay delivery pass over a claimed subscription row. */
21
+ relaySubscription: "akter.relay.subscription",
22
+ /** One executor attempt of a job. */
23
+ job: (actor, job) => `akter.job/${actor}/${job}`,
24
+ };
25
+ const isSystem = Schema.is(System);
26
+ /**
27
+ * What started a turn: `command` for an external caller, or the System
28
+ * source of a relay, workflow, or job route delivery.
29
+ */
30
+ export const triggerOf = (request) => request.external === true
31
+ ? "command"
32
+ : isSystem(request.caller)
33
+ ? request.caller.source
34
+ : "command";
35
+ /** Attributes every admission and turn span carries; none is a credential or payload. */
36
+ export const requestAttributes = (request) => ({
37
+ "actor.type": request.ref.actor,
38
+ "actor.tenant": request.ref.tenant,
39
+ "actor.id": request.ref.id,
40
+ "command.name": request.command,
41
+ "command.id": request.commandId,
42
+ "caller.kind": request.caller._tag,
43
+ "turn.trigger": triggerOf(request),
44
+ });
@@ -0,0 +1,52 @@
1
+ import { Context, Effect } from "effect";
2
+ import type { SqlClient, SqlError } from "effect/sql";
3
+ import type { ActorRef } from "../../identity/caller.ts";
4
+ /** Commands whose receipts one turn commit newly inserted. */
5
+ export interface UsageCommands {
6
+ readonly ref: ActorRef;
7
+ readonly commandIds: ReadonlyArray<string>;
8
+ /** The runtime's client for this turn: its statement reaches the turn's own transaction. */
9
+ readonly sql: SqlClient.SqlClient;
10
+ }
11
+ /** A query's answer the runtime is about to return. */
12
+ export interface UsageRead {
13
+ readonly ref: ActorRef;
14
+ /**
15
+ * Identifies one read attempt across a watch's reruns. A watch without one
16
+ * is not recorded.
17
+ */
18
+ readonly requestToken?: string | undefined;
19
+ readonly watch: boolean;
20
+ /** The primary database's client. */
21
+ readonly sql: SqlClient.SqlClient;
22
+ }
23
+ /** The hooks of `UsageAccounting`. */
24
+ export interface UsageAccountingService {
25
+ readonly commands: (input: UsageCommands) => Effect.Effect<void, SqlError.SqlError>;
26
+ readonly read: (input: UsageRead) => Effect.Effect<void, SqlError.SqlError>;
27
+ }
28
+ /**
29
+ * Whether `service` is a host's hook rather than the default. The runtime
30
+ * recognizes the default by identity and never invokes it, so a runtime
31
+ * without a host hook allocates, forks and awaits nothing for accounting.
32
+ */
33
+ export declare const accountsUsage: (service: UsageAccountingService) => boolean;
34
+ /**
35
+ * An optional hook that lets a host account for the work its actors do
36
+ * without the framework owning any accounting tables. The default is a
37
+ * single no-op value the runtime skips, so a self-hosted runtime pays no
38
+ * cost; a host that provides any other service, even one doing nothing, is
39
+ * invoked.
40
+ *
41
+ * `commands` is queued in the turn's commit group directly after the
42
+ * receipt insert, so its rows commit or roll back with the receipts. The
43
+ * group is pipelined: the returned effect must issue exactly one statement on
44
+ * the given `sql`, because a second one could be sent after the group's
45
+ * `COMMIT`. It sees only commands whose receipts are new; a replay never
46
+ * reaches it.
47
+ *
48
+ * `read` runs on the primary after the query's final access check and before
49
+ * a non-defect outcome is returned. A failure of either hook fails the work
50
+ * it accounts for.
51
+ */
52
+ export declare const UsageAccounting: Context.Reference<UsageAccountingService>;
@@ -0,0 +1,30 @@
1
+ import { Context, Effect } from "effect";
2
+ const noUsageAccounting = {
3
+ commands: () => Effect.void,
4
+ read: () => Effect.void,
5
+ };
6
+ /**
7
+ * Whether `service` is a host's hook rather than the default. The runtime
8
+ * recognizes the default by identity and never invokes it, so a runtime
9
+ * without a host hook allocates, forks and awaits nothing for accounting.
10
+ */
11
+ export const accountsUsage = (service) => service !== noUsageAccounting;
12
+ /**
13
+ * An optional hook that lets a host account for the work its actors do
14
+ * without the framework owning any accounting tables. The default is a
15
+ * single no-op value the runtime skips, so a self-hosted runtime pays no
16
+ * cost; a host that provides any other service, even one doing nothing, is
17
+ * invoked.
18
+ *
19
+ * `commands` is queued in the turn's commit group directly after the
20
+ * receipt insert, so its rows commit or roll back with the receipts. The
21
+ * group is pipelined: the returned effect must issue exactly one statement on
22
+ * the given `sql`, because a second one could be sent after the group's
23
+ * `COMMIT`. It sees only commands whose receipts are new; a replay never
24
+ * reaches it.
25
+ *
26
+ * `read` runs on the primary after the query's final access check and before
27
+ * a non-defect outcome is returned. A failure of either hook fails the work
28
+ * it accounts for.
29
+ */
30
+ export const UsageAccounting = Context.Reference("@rikalabs/akter/runtime/telemetry/usage/UsageAccounting", { defaultValue: () => noUsageAccounting });
@@ -0,0 +1,13 @@
1
+ import { Context, Layer } from "effect";
2
+ import { EntityAddress, Sharding } from "effect/cluster";
3
+ import { ActorError } from "../../errors/actor.ts";
4
+ declare const MailboxRefusals_base: Context.ServiceClass<MailboxRefusals, "@rikalabs/akter/runtime/topology/admission/MailboxRefusals", {
5
+ refuse: (address: EntityAddress.EntityAddress) => ActorError | undefined;
6
+ }>;
7
+ /** The owner classifies transient capacity errors using its own activation residency. */
8
+ export declare class MailboxRefusals extends MailboxRefusals_base {
9
+ }
10
+ export declare const mailboxRefusals: Layer.Layer<MailboxRefusals, never, never>;
11
+ /** Returns resident mailbox refusals through Execute's typed reply instead of a transport error. */
12
+ export declare const admissionSharding: Layer.Layer<Sharding.Sharding, never, MailboxRefusals | import("effect/cluster/MessageStorage").MessageStorage | import("effect/cluster/RunnerHealth").RunnerHealth | import("effect/cluster/RunnerStorage").RunnerStorage | import("effect/cluster/Runners").Runners | import("effect/cluster/ShardingConfig").ShardingConfig>;
13
+ export {};
@@ -0,0 +1,36 @@
1
+ import { Context, Effect, Exit, Layer, Predicate, Schema } from "effect";
2
+ import { ClusterError, EntityAddress, Reply, Sharding } from "effect/cluster";
3
+ import { ActorError } from "../../errors/actor.js";
4
+ import { commandEntity } from "../entity/register.js";
5
+ /** The owner classifies transient capacity errors using its own activation residency. */
6
+ export class MailboxRefusals extends Context.Service()("@rikalabs/akter/runtime/topology/admission/MailboxRefusals") {
7
+ }
8
+ export const mailboxRefusals = Layer.sync(MailboxRefusals, () => ({ refuse: () => undefined }));
9
+ /** Returns resident mailbox refusals through Execute's typed reply instead of a transport error. */
10
+ export const admissionSharding = Layer.effect(Sharding.Sharding, Effect.gen(function* () {
11
+ const sharding = yield* Sharding.Sharding;
12
+ const refusals = yield* MailboxRefusals;
13
+ return Sharding.Sharding.of({
14
+ ...sharding,
15
+ send: (message) => sharding.send(message).pipe(Effect.catchIf(Schema.is(ClusterError.MailboxFull), (error) => Effect.gen(function* () {
16
+ if (!Predicate.isTagged(message, "IncomingRequest") ||
17
+ message.envelope.tag !== "Execute")
18
+ return yield* error;
19
+ const refusal = refusals.refuse(error.address);
20
+ if (refusal === undefined)
21
+ return yield* error;
22
+ const reply = new Reply.WithExit({
23
+ id: yield* sharding.getSnowflake,
24
+ requestId: message.envelope.requestId,
25
+ exit: Exit.fail(refusal),
26
+ });
27
+ yield* message
28
+ .respond(new Reply.ReplyWithContext({
29
+ reply,
30
+ rpc: commandEntity(error.address.entityType).protocol.requests.get("Execute"),
31
+ context: Context.empty(),
32
+ }))
33
+ .pipe(Effect.orDie);
34
+ }))),
35
+ });
36
+ })).pipe(Layer.provide(Sharding.layer));
@@ -0,0 +1,56 @@
1
+ import { Context, Duration, Effect } from "effect";
2
+ import { type RunnerAddress, type RunnerStorage, type ShardId } from "effect/cluster";
3
+ import { SqlClient } from "effect/sql";
4
+ /** Builds Cluster registrations and lock storage on the deployment's authority, never on a runner's data shard. */
5
+ export declare const coordinatedRunnerStorage: Effect.Effect<{
6
+ readonly register: (runner: import("effect/cluster/Runner").Runner, healthy: boolean) => Effect.Effect<import("effect/cluster/MachineId").MachineId, import("effect/cluster/ClusterError").PersistenceError>;
7
+ readonly unregister: (address: import("effect/cluster/RunnerAddress").RunnerAddress) => Effect.Effect<void, import("effect/cluster/ClusterError").PersistenceError>;
8
+ readonly getRunners: Effect.Effect<Array<readonly [runner: import("effect/cluster/Runner").Runner, healthy: boolean]>, import("effect/cluster/ClusterError").PersistenceError>;
9
+ readonly setRunnerHealth: (address: import("effect/cluster/RunnerAddress").RunnerAddress, healthy: boolean) => Effect.Effect<void, import("effect/cluster/ClusterError").PersistenceError>;
10
+ readonly acquire: (address: import("effect/cluster/RunnerAddress").RunnerAddress, shardIds: Iterable<ShardId.ShardId>) => Effect.Effect<Array<ShardId.ShardId>, import("effect/cluster/ClusterError").PersistenceError>;
11
+ readonly refresh: (address: import("effect/cluster/RunnerAddress").RunnerAddress, shardIds: Iterable<ShardId.ShardId>) => Effect.Effect<Array<ShardId.ShardId>, import("effect/cluster/ClusterError").PersistenceError>;
12
+ readonly release: (address: import("effect/cluster/RunnerAddress").RunnerAddress, shardId: ShardId.ShardId) => Effect.Effect<void, import("effect/cluster/ClusterError").PersistenceError>;
13
+ readonly releaseAll: (address: import("effect/cluster/RunnerAddress").RunnerAddress) => Effect.Effect<void, import("effect/cluster/ClusterError").PersistenceError>;
14
+ }, import("effect/sql/SqlError").SqlError, import("effect/Scope").Scope | import("effect/cluster/ShardingConfig").ShardingConfig | SqlClient.SqlClient>;
15
+ declare const ShardLease_base: Context.ServiceClass<ShardLease, "@rikalabs/akter/runtime/topology/locks/ShardLease", {
16
+ /** How often a resident singleton rechecks its lease. */
17
+ readonly interval: Duration.Duration;
18
+ readonly holds: (shardId: string) => Effect.Effect<boolean>;
19
+ }>;
20
+ /**
21
+ * Whether this runner still holds a shard's lock, read from the database. A
22
+ * runner whose lock refreshes stall keeps serving its shards in memory until
23
+ * it notices; singleton activations check this lease so their background work
24
+ * stops before another runner can take the shard.
25
+ */
26
+ export declare class ShardLease extends ShardLease_base {
27
+ }
28
+ /**
29
+ * The lease of table-backed shard locks. A lock counts as held only while its
30
+ * last refresh is younger than half the expiration, so its holder stops
31
+ * before the lock expires and another runner may acquire it; a healthy runner
32
+ * refreshes at least every third of the expiration. A failed read counts as
33
+ * lost.
34
+ */
35
+ export declare const tableShardLease: ({ sql, address, expiration, }: {
36
+ readonly sql: SqlClient.SqlClient;
37
+ readonly address: RunnerAddress.RunnerAddress;
38
+ readonly expiration: Duration.Duration;
39
+ }) => {
40
+ /** How often a resident singleton rechecks its lease. */
41
+ readonly interval: Duration.Duration;
42
+ readonly holds: (shardId: string) => Effect.Effect<boolean>;
43
+ };
44
+ /**
45
+ * Keeps Cluster from dropping a shard it has just acquired.
46
+ *
47
+ * Cluster treats every held shard missing from a lock refresh's answer as
48
+ * lost, but it builds the refresh request from the shards it held when the
49
+ * refresh started. A shard whose acquire commits in between is missing from
50
+ * the answer without being lost, and Cluster reacquires it only on its next
51
+ * entity poll. Each acquired shard is reported as held by its runner's
52
+ * refreshes until one asks about it, which checks it for real, or until it is
53
+ * released.
54
+ */
55
+ export declare const keepAcquiredShards: (storage: RunnerStorage.RunnerStorage["Service"]) => RunnerStorage.RunnerStorage["Service"];
56
+ export {};
@@ -0,0 +1,81 @@
1
+ import { Context, Duration, Effect, PrimaryKey } from "effect";
2
+ import { SqlRunnerStorage, } from "effect/cluster";
3
+ import { SqlClient } from "effect/sql";
4
+ import { Coordination } from "../database/coordination.js";
5
+ import { prepareRunnerStorage } from "../database/neki/migrations.js";
6
+ /** Builds Cluster registrations and lock storage on the deployment's authority, never on a runner's data shard. */
7
+ export const coordinatedRunnerStorage = Effect.gen(function* () {
8
+ const sql = (yield* Coordination) ?? (yield* SqlClient.SqlClient);
9
+ return yield* prepareRunnerStorage.pipe(Effect.andThen(SqlRunnerStorage.make({})), Effect.provideService(SqlClient.SqlClient, sql));
10
+ });
11
+ /**
12
+ * Whether this runner still holds a shard's lock, read from the database. A
13
+ * runner whose lock refreshes stall keeps serving its shards in memory until
14
+ * it notices; singleton activations check this lease so their background work
15
+ * stops before another runner can take the shard.
16
+ */
17
+ export class ShardLease extends Context.Service()("@rikalabs/akter/runtime/topology/locks/ShardLease") {
18
+ }
19
+ /**
20
+ * The lease of table-backed shard locks. A lock counts as held only while its
21
+ * last refresh is younger than half the expiration, so its holder stops
22
+ * before the lock expires and another runner may acquire it; a healthy runner
23
+ * refreshes at least every third of the expiration. A failed read counts as
24
+ * lost.
25
+ */
26
+ export const tableShardLease = ({ sql, address, expiration, }) => {
27
+ const fresh = Duration.toMillis(expiration) / 2 / 1000;
28
+ const holder = PrimaryKey.value(address);
29
+ return ShardLease.of({
30
+ interval: Duration.divideUnsafe(expiration, 6),
31
+ holds: (shardId) => sql `SELECT 1 AS held FROM cluster_locks
32
+ WHERE shard_id = ${shardId} AND address = ${holder}
33
+ AND acquired_at >= NOW() - make_interval(secs => ${fresh})`.pipe(Effect.map((rows) => rows.length > 0), Effect.orElseSucceed(() => false)),
34
+ });
35
+ };
36
+ /**
37
+ * Keeps Cluster from dropping a shard it has just acquired.
38
+ *
39
+ * Cluster treats every held shard missing from a lock refresh's answer as
40
+ * lost, but it builds the refresh request from the shards it held when the
41
+ * refresh started. A shard whose acquire commits in between is missing from
42
+ * the answer without being lost, and Cluster reacquires it only on its next
43
+ * entity poll. Each acquired shard is reported as held by its runner's
44
+ * refreshes until one asks about it, which checks it for real, or until it is
45
+ * released.
46
+ */
47
+ export const keepAcquiredShards = (storage) => {
48
+ const unchecked = new Map();
49
+ const of = (address) => {
50
+ const key = PrimaryKey.value(address);
51
+ const shards = unchecked.get(key) ?? new Set();
52
+ unchecked.set(key, shards);
53
+ return shards;
54
+ };
55
+ return {
56
+ ...storage,
57
+ acquire: (address, shardIds) => storage.acquire(address, shardIds).pipe(Effect.tap((acquired) => Effect.sync(() => {
58
+ const shards = of(address);
59
+ for (const shardId of acquired)
60
+ shards.add(shardId);
61
+ }))),
62
+ refresh: (address, shardIds) => Effect.suspend(() => {
63
+ const requested = Array.from(shardIds);
64
+ const shards = of(address);
65
+ for (const shardId of requested)
66
+ shards.delete(shardId);
67
+ return storage
68
+ .refresh(address, requested)
69
+ .pipe(Effect.map((held) => [
70
+ ...held,
71
+ ...Array.from(unchecked.get(PrimaryKey.value(address)) ?? []).filter((shardId) => !requested.includes(shardId)),
72
+ ]));
73
+ }),
74
+ release: (address, shardId) => Effect.sync(() => of(address).delete(shardId)).pipe(Effect.andThen(storage.release(address, shardId))),
75
+ releaseAll: (address) => Effect.sync(() => {
76
+ const key = PrimaryKey.value(address);
77
+ unchecked.get(key)?.clear();
78
+ unchecked.delete(key);
79
+ }).pipe(Effect.andThen(storage.releaseAll(address))),
80
+ };
81
+ };
@@ -0,0 +1,15 @@
1
+ import { Layer } from "effect";
2
+ import { MessageStorage } from "effect/cluster";
3
+ /**
4
+ * Cluster message storage for direct commands: it keeps nothing, and the
5
+ * command's receipt is the only deduplication record.
6
+ *
7
+ * It is deliberately not `MessageStorage.noop`. Each entity manager records
8
+ * every request id it answers, and only Sharding's storage-read loop forgets
9
+ * them, once per poll; Sharding starts that loop for any storage except
10
+ * `noop`. Under `noop` the set grows by one id per command for the runner's
11
+ * lifetime. Here the loop runs, reads nothing, and forgets the ids, so a
12
+ * request id redelivered after a poll is admitted again and answered from
13
+ * its receipt. Persisting a message dies, as it does under `noop`.
14
+ */
15
+ export declare const directMessages: Layer.Layer<MessageStorage.MessageStorage>;
@@ -0,0 +1,32 @@
1
+ import { Effect, Layer } from "effect";
2
+ import { MessageStorage } from "effect/cluster";
3
+ const persisted = (operation) => Effect.die(new Error(`${operation}: commands are direct, so no Cluster message is persisted`));
4
+ /**
5
+ * Cluster message storage for direct commands: it keeps nothing, and the
6
+ * command's receipt is the only deduplication record.
7
+ *
8
+ * It is deliberately not `MessageStorage.noop`. Each entity manager records
9
+ * every request id it answers, and only Sharding's storage-read loop forgets
10
+ * them, once per poll; Sharding starts that loop for any storage except
11
+ * `noop`. Under `noop` the set grows by one id per command for the runner's
12
+ * lifetime. Here the loop runs, reads nothing, and forgets the ids, so a
13
+ * request id redelivered after a poll is admitted again and answered from
14
+ * its receipt. Persisting a message dies, as it does under `noop`.
15
+ */
16
+ export const directMessages = Layer.effect(MessageStorage.MessageStorage, MessageStorage.make({
17
+ saveRequest: () => persisted("saveRequest"),
18
+ saveEnvelope: () => persisted("saveEnvelope"),
19
+ saveReply: (reply) => Effect.succeed(reply),
20
+ clearReplies: () => Effect.void,
21
+ repliesFor: () => Effect.succeed([]),
22
+ repliesForUnfiltered: () => Effect.succeed([]),
23
+ requestIdForPrimaryKey: () => Effect.succeedNone,
24
+ unprocessedMessages: () => Effect.succeed([]),
25
+ unprocessedMessagesById: () => Effect.succeed([]),
26
+ resetAddress: () => Effect.void,
27
+ resetRequests: () => Effect.void,
28
+ resetAddresses: () => Effect.void,
29
+ clearAddress: () => Effect.void,
30
+ resetShards: () => Effect.void,
31
+ withTransaction: (effect) => effect,
32
+ }));
@@ -0,0 +1,22 @@
1
+ import { Context, Effect } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { ActorError } from "../../errors/actor.ts";
4
+ /**
5
+ * Shifts the framework clock: command ids, their expiry, timers, event
6
+ * timestamps, and retention all read database time plus this offset. Only
7
+ * `ActorTest.advance` moves it, so every one of them moves together.
8
+ */
9
+ export declare const FrameworkClock: Context.Reference<{
10
+ readonly offsetMillis: () => number;
11
+ }>;
12
+ /** The database clock as the framework sees it, in epoch milliseconds. */
13
+ export declare const databaseTime: Effect.Effect<number, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
14
+ /**
15
+ * Validates a command id against the admission clock. Fails with `ActorError`:
16
+ * `InvalidCommandId` when the id is not a version-1 id (`version` for another
17
+ * version, `malformed` otherwise), its window differs from `windowMs`
18
+ * (`window`), or it is issued after `now` (`future`); `CommandExpired` once
19
+ * `now` reaches its expiry. All times are epoch milliseconds. Without `now`
20
+ * only the id's form and window are checked, which needs no clock read.
21
+ */
22
+ export declare const checkIdentity: (id: string, windowMs: number, now?: number | undefined) => Effect.Effect<undefined, ActorError, never>;
@@ -0,0 +1,41 @@
1
+ import { Context, Effect, Schema } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { ActorError, CommandExpired, InvalidCommandId } from "../../errors/actor.js";
4
+ import { CommandId, commandTimes } from "../../identity/command.js";
5
+ /**
6
+ * Shifts the framework clock: command ids, their expiry, timers, event
7
+ * timestamps, and retention all read database time plus this offset. Only
8
+ * `ActorTest.advance` moves it, so every one of them moves together.
9
+ */
10
+ export const FrameworkClock = Context.Reference("akter/FrameworkClock", { defaultValue: () => ({ offsetMillis: () => 0 }) });
11
+ /** The database clock as the framework sees it, in epoch milliseconds. */
12
+ export const databaseTime = Effect.gen(function* () {
13
+ const sql = yield* SqlClient.SqlClient;
14
+ const clock = yield* FrameworkClock;
15
+ const rows = yield* sql `SELECT floor(extract(epoch FROM clock_timestamp()) * 1000)::text AS now`;
16
+ return Number(rows[0].now) + clock.offsetMillis();
17
+ });
18
+ const decodeCommandId = Schema.decodeEffect(CommandId);
19
+ /** Matches a versioned command id this runner cannot read: `v<n>.` for any n other than 1. */
20
+ const OTHER_VERSION = /^v(?!1\.)\d{1,9}\./;
21
+ /**
22
+ * Validates a command id against the admission clock. Fails with `ActorError`:
23
+ * `InvalidCommandId` when the id is not a version-1 id (`version` for another
24
+ * version, `malformed` otherwise), its window differs from `windowMs`
25
+ * (`window`), or it is issued after `now` (`future`); `CommandExpired` once
26
+ * `now` reaches its expiry. All times are epoch milliseconds. Without `now`
27
+ * only the id's form and window are checked, which needs no clock read.
28
+ */
29
+ export const checkIdentity = Effect.fnUntraced(function* (id, windowMs, now) {
30
+ const invalid = (code) => ActorError.make({ reason: InvalidCommandId.make({ commandId: id, code }) });
31
+ yield* decodeCommandId(id).pipe(Effect.mapError(() => invalid(OTHER_VERSION.test(id) ? "version" : "malformed")));
32
+ const { issuedAt, expiresAt } = commandTimes(id);
33
+ if (expiresAt - issuedAt !== windowMs)
34
+ return yield* invalid("window");
35
+ if (now === undefined)
36
+ return;
37
+ if (issuedAt > now)
38
+ return yield* invalid("future");
39
+ if (now >= expiresAt)
40
+ return yield* ActorError.make({ reason: CommandExpired.make({ commandId: id }) });
41
+ });
@@ -0,0 +1,38 @@
1
+ import { Effect } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import type { BlobAccess, BlobScope } from "../../state/blob.ts";
4
+ import type { ContentStoreImpl } from "../content/store.ts";
5
+ /**
6
+ * Bytes one entry may hold. `get` returns an entry as one row, and the Postgres
7
+ * driver closes a connection on any message over 16 MiB, so an entry stays well below it.
8
+ */
9
+ export declare const MAX_ENTRY_BYTES: number;
10
+ /** What content references need from the runtime: its store, the skew margin, and the clock offset. */
11
+ export interface ContentBinding {
12
+ readonly store: ContentStoreImpl;
13
+ readonly skewMs: number;
14
+ readonly offset: () => number;
15
+ }
16
+ /**
17
+ * Binds blob capabilities to the calling fiber's turn or query. Every row is
18
+ * addressed by the trusted scope, so equal blob and entry names of two actors
19
+ * or tenants never meet; writes run on the turn's connection, inside its
20
+ * savepoint, and roll back with it. Off-turn contexts get read methods only,
21
+ * and turns get no content bytes.
22
+ *
23
+ * Declared blobs, names, and byte arrays are checked on every call, so misuse
24
+ * is a defect of the turn. Entry names reject lone surrogates, which Postgres
25
+ * would turn into U+FFFD and alias another name, and NUL. Byte arrays are
26
+ * copied on the way in and out, since the caller may reuse its buffer and a
27
+ * driver may decode into a pooled one. Content references count against the
28
+ * entry cap with the actor's own entries, and an existing entry stays
29
+ * writable at the cap; the quota is named only after a write changed nothing.
30
+ * A set overwrites chunk 0 and drops the rest in one statement that changes
31
+ * nothing past the quota, so a caught defect leaves the entry whole. Turns of
32
+ * one actor serialize on its generation lock, so an appended chunk index is
33
+ * free at insert. Attaching content verifies its grant by MAC without a read
34
+ * and requires the grant to outlive this shard's clock by the skew margin, so
35
+ * the tenant shard's sweep sees a horizon past this turn's commit. Content
36
+ * keys are required only when a content blob is used.
37
+ */
38
+ export declare const bindBlobs: (scope: BlobScope, write: boolean, content: ContentBinding | undefined) => Effect.Effect<BlobAccess, never, SqlClient.SqlClient>;