@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,170 @@
1
+ import { Stream } from "effect";
2
+ import { InternalActors } from "../runtime/actors.ts";
3
+ import type { ActorError } from "../errors/actor.ts";
4
+ import { customType, pgTable, type PgTableWithColumns } from "drizzle-orm/pg-core";
5
+ import { OWNERSHIP, type AnyOwnedTable, type Filter, type Ownership } from "./owned.ts";
6
+ /** The aggregate functions a fleet view may select. */
7
+ export type AggregateKind = "count" | "sum" | "avg" | "min" | "max";
8
+ /** One selected aggregate: `Fleet.count()` or a function of one source column. */
9
+ export interface Aggregate<Kind extends AggregateKind = AggregateKind, Key extends string = string> {
10
+ readonly kind: Kind;
11
+ readonly column: Key | undefined;
12
+ }
13
+ type SourceColumns<T extends AnyOwnedTable> = Omit<T["_"]["columns"], (typeof OWNERSHIP)[number]>;
14
+ type Business<T extends AnyOwnedTable> = keyof SourceColumns<T> & string;
15
+ type NumericKey<T extends AnyOwnedTable> = {
16
+ [K in Business<T>]: SourceColumns<T>[K]["_"]["data"] extends number | bigint ? K : never;
17
+ }[Business<T>];
18
+ type ColumnData<T extends AnyOwnedTable, K extends string> = K extends Business<T> ? SourceColumns<T>[K]["_"]["data"] : never;
19
+ type Builder<X> = ReturnType<ReturnType<typeof customType<{
20
+ data: X;
21
+ notNull: true;
22
+ }>>>;
23
+ type NullableBuilder<X> = ReturnType<ReturnType<typeof customType<{
24
+ data: X;
25
+ }>>>;
26
+ type AggregateBuilder<T extends AnyOwnedTable, A> = A extends Aggregate<"count" | "sum" | "avg", string> ? Builder<number> : A extends Aggregate<"min" | "max", infer K> ? NullableBuilder<ColumnData<T, K>> : never;
27
+ /** The columns of a view's derived table, as Drizzle builders. */
28
+ export type DerivedColumns<T extends AnyOwnedTable, G extends ReadonlyArray<string>, S extends Record<string, Aggregate>> = {
29
+ readonly tenant_id: Builder<string>;
30
+ } & {
31
+ readonly [K in G[number]]: Builder<ColumnData<T, K>>;
32
+ } & {
33
+ readonly [K in keyof S]: AggregateBuilder<T, S[K]>;
34
+ } & {
35
+ readonly as_of: Builder<string>;
36
+ };
37
+ /** A view's derived table: `tenant_id`, the group columns, the aggregates, and `as_of`. */
38
+ export type DerivedTable<Name extends string, T extends AnyOwnedTable, G extends ReadonlyArray<string>, S extends Record<string, Aggregate>> = PgTableWithColumns<{
39
+ name: Name;
40
+ schema: T["_"]["schema"];
41
+ columns: ReturnType<typeof pgTable<Name, DerivedColumns<T, G, S>>>["_"]["columns"];
42
+ dialect: "pg";
43
+ isAlias: false;
44
+ }>;
45
+ /** What the maintainer needs to know about one selected aggregate. */
46
+ export interface SelectedAggregate {
47
+ readonly key: string;
48
+ readonly kind: AggregateKind;
49
+ /** The source column's SQL name, or undefined for `count`. */
50
+ readonly column: string | undefined;
51
+ }
52
+ /** A value as it travels in a fleet page's JSON: dates as ISO strings, bigints as numbers. */
53
+ type JsonValue<X> = X extends Date ? string : X extends bigint ? number : X;
54
+ type AggregateValue<T extends AnyOwnedTable, A> = A extends Aggregate<"count" | "sum" | "avg", string> ? number : A extends Aggregate<"min" | "max", infer K> ? JsonValue<ColumnData<T, K>> | null : never;
55
+ /** One group of a fleet page: its group keys and its aggregates. */
56
+ export type FleetRow<V extends AnyFleetView> = V extends FleetView<string, infer T, infer G, infer S> ? {
57
+ readonly [K in G[number]]: JsonValue<ColumnData<T, K>>;
58
+ } & {
59
+ readonly [K in keyof S]: AggregateValue<T, S[K]>;
60
+ } : never;
61
+ /**
62
+ * One page of a fleet subscription: the caller's tenant's groups in
63
+ * group-key order, `asOf` the change-feed position the view has applied
64
+ * (comparable with a command's `durable-version`: once `asOf` is at least the
65
+ * token, the view has seen that command), and `stale` while the view is
66
+ * building or has stopped advancing.
67
+ */
68
+ export interface FleetPage<Row> {
69
+ readonly asOf: string | null;
70
+ readonly stale: boolean;
71
+ readonly rows: ReadonlyArray<Row>;
72
+ }
73
+ /** Equality filters on a view's group keys. */
74
+ export type FleetFilter<V extends AnyFleetView> = {
75
+ readonly [K in V["groupBy"][number]]?: string | number | boolean;
76
+ };
77
+ /** Options of one fleet subscription. */
78
+ export interface FleetOptions {
79
+ /** The most groups a page holds: default 100, at most 1,000. */
80
+ readonly limit?: number;
81
+ }
82
+ /** A declared fleet view: one group-by over one owned table, kept in `table`. */
83
+ export interface FleetView<Name extends string = string, T extends AnyOwnedTable = AnyOwnedTable, G extends ReadonlyArray<string> = ReadonlyArray<string>, S extends Record<string, Aggregate> = Record<string, Aggregate>> {
84
+ readonly name: Name;
85
+ readonly from: T;
86
+ readonly source: Ownership;
87
+ readonly where: Filter<T> | undefined;
88
+ /** Group column keys of `from`, in key order. */
89
+ readonly groupBy: G;
90
+ /** Group column SQL names, in key order. */
91
+ readonly groupColumns: ReadonlyArray<string>;
92
+ /** The source's SQL names of its tenant and routing key columns. */
93
+ readonly tenantColumn: string;
94
+ readonly routingColumn: string;
95
+ readonly select: S;
96
+ readonly aggregates: ReadonlyArray<SelectedAggregate>;
97
+ readonly table: DerivedTable<`fleet_${string}`, T, G, S>;
98
+ /** The derived table's name, qualified by its schema when it has one. */
99
+ readonly tableName: string;
100
+ /** Changes when anything that decides the view's rows changes. */
101
+ readonly definitionHash: string;
102
+ }
103
+ /** Any fleet view, whatever its source and selection. */
104
+ export type AnyFleetView = FleetView<string, any, any, any>;
105
+ /**
106
+ * Declares a fleet view: `groupBy` over the rows of one owned table that
107
+ * `where` admits, with `tenant_id` always the first group key, so a view
108
+ * never aggregates across tenants. The runtime maintains its rows in `table`,
109
+ * named `fleet_<snake_case name>` in the source's schema, which the application
110
+ * adds to its drizzle-kit schema like an owned table.
111
+ *
112
+ * Throws for a name that is not PascalCase, a source that is not an owned
113
+ * table, an unknown or nullable group column (a primary key cannot hold
114
+ * null), an ownership column, an empty or overlapping selection, `sum` over a
115
+ * non-integer column, and `avg` over a non-numeric one.
116
+ *
117
+ * @example
118
+ * const OrdersByStatus = Fleet.view("OrdersByStatus", {
119
+ * from: OrderRows,
120
+ * where: { archived: false },
121
+ * groupBy: ["status"],
122
+ * select: { orders: Fleet.count(), total: Fleet.sum("amountCents") },
123
+ * })
124
+ */
125
+ declare const view: <const Name extends string, T extends AnyOwnedTable, const G extends ReadonlyArray<Business<T>>, const S extends Record<string, Aggregate<AggregateKind, Business<T>>>>(name: Name, definition: {
126
+ readonly from: T;
127
+ readonly where?: Filter<T>;
128
+ readonly groupBy: G;
129
+ readonly select: S & { readonly [K in keyof S]: S[K] extends Aggregate<"sum" | "avg", infer Key> ? Aggregate<S[K]["kind"], Key & NumericKey<T>> : S[K]; };
130
+ }) => FleetView<Name, T, G, S>;
131
+ /** Counts the group's rows. */
132
+ declare const count: () => Aggregate<"count", never>;
133
+ /** Sums an integer column into a bigint; a sum past its range poisons the view. */
134
+ declare const sum: <const K extends string>(column: K) => Aggregate<"sum", K>;
135
+ /** Averages a numeric column as double precision. */
136
+ declare const avg: <const K extends string>(column: K) => Aggregate<"avg", K>;
137
+ /** The smallest value of a column, in the column's own type. */
138
+ declare const min: <const K extends string>(column: K) => Aggregate<"min", K>;
139
+ /** The largest value of a column, in the column's own type. */
140
+ declare const max: <const K extends string>(column: K) => Aggregate<"max", K>;
141
+ /**
142
+ * Follows `view` for the ambient tenant as the ambient caller: its current
143
+ * page, then a page each time the view changed and the page differs. It is
144
+ * authorized like a served subscription, with `kind: "fleet"`, and ends
145
+ * `Unauthorized` once reauthorization is refused. It needs the runtime that
146
+ * registered the view.
147
+ */
148
+ declare const subscribe: <V extends AnyFleetView>(view: V, filter?: FleetFilter<V>, options?: FleetOptions) => Stream.Stream<FleetPage<FleetRow<V>>, ActorError, InternalActors>;
149
+ /**
150
+ * Fleet reads: declared views over one owned table of a tenant-placed actor
151
+ * type, grouped by tenant first and maintained from the change feed, outside
152
+ * every turn.
153
+ */
154
+ export declare const Fleet: {
155
+ /** Follows a view for the ambient tenant; see `subscribe`. */
156
+ subscribe: typeof subscribe;
157
+ /** Declares a fleet view; see `view`. */
158
+ view: typeof view;
159
+ /** Counts a group's rows. */
160
+ count: typeof count;
161
+ /** Sums an integer column. */
162
+ sum: typeof sum;
163
+ /** Averages a numeric column. */
164
+ avg: typeof avg;
165
+ /** The smallest value of a column. */
166
+ min: typeof min;
167
+ /** The largest value of a column. */
168
+ max: typeof max;
169
+ };
170
+ export {};
@@ -0,0 +1,214 @@
1
+ import { getTableColumns, sql } from "drizzle-orm";
2
+ import { sha256Bytes } from "../identity/digest.js";
3
+ import { bytesToHex } from "@noble/hashes/utils.js";
4
+ import { Effect, Predicate, Schema, Stream } from "effect";
5
+ import { FLEET_PAGE_DEFAULT, FleetPageJson, fleetFilterText } from "../client/fleet-page.js";
6
+ import { InternalActors } from "../runtime/actors.js";
7
+ import { CurrentCaller, Tenant } from "../identity/caller.js";
8
+ import { bigint, customType, doublePrecision, numeric, pgPolicy, pgSchema, pgTable, primaryKey, text, } from "drizzle-orm/pg-core";
9
+ import { OWNERSHIP, ownership } from "./owned.js";
10
+ const decodeResult = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Struct({ value: FleetPageJson })));
11
+ const INTEGER = new Set(["smallint", "integer", "bigint"]);
12
+ const NUMERIC = new Set(["smallint", "integer", "bigint", "real", "double precision", "numeric"]);
13
+ const NAME = /^[A-Z][A-Za-z0-9]{0,47}$/;
14
+ const RESERVED = new Set(["tenant_id", "as_of"]);
15
+ const snake = (name) => name.replace(/(?<!^)([A-Z])/g, "_$1").toLowerCase();
16
+ /** Canonical JSON for the definition hash: sorted keys, and bigints and dates as tagged strings. */
17
+ const canonical = (value) => {
18
+ if (Predicate.isBigInt(value))
19
+ return JSON.stringify(`${value}n`);
20
+ if (Predicate.isDate(value))
21
+ return JSON.stringify(`date:${value.toISOString()}`);
22
+ if (Array.isArray(value))
23
+ return `[${value.map(canonical).join(",")}]`;
24
+ if (Predicate.isObject(value))
25
+ return `{${Object.entries(value)
26
+ .sort(([a], [b]) => (a < b ? -1 : 1))
27
+ .map(([key, item]) => `${JSON.stringify(key)}:${canonical(item)}`)
28
+ .join(",")}}`;
29
+ return JSON.stringify(value ?? null);
30
+ };
31
+ const cloneColumn = (column, name) => customType({
32
+ dataType: () => column.getSQLType(),
33
+ fromDriver: (value) => column.mapFromDriverValue(value),
34
+ toDriver: (value) => column.mapToDriverValue(value),
35
+ })(name);
36
+ /**
37
+ * Declares a fleet view: `groupBy` over the rows of one owned table that
38
+ * `where` admits, with `tenant_id` always the first group key, so a view
39
+ * never aggregates across tenants. The runtime maintains its rows in `table`,
40
+ * named `fleet_<snake_case name>` in the source's schema, which the application
41
+ * adds to its drizzle-kit schema like an owned table.
42
+ *
43
+ * Throws for a name that is not PascalCase, a source that is not an owned
44
+ * table, an unknown or nullable group column (a primary key cannot hold
45
+ * null), an ownership column, an empty or overlapping selection, `sum` over a
46
+ * non-integer column, and `avg` over a non-numeric one.
47
+ *
48
+ * @example
49
+ * const OrdersByStatus = Fleet.view("OrdersByStatus", {
50
+ * from: OrderRows,
51
+ * where: { archived: false },
52
+ * groupBy: ["status"],
53
+ * select: { orders: Fleet.count(), total: Fleet.sum("amountCents") },
54
+ * })
55
+ */
56
+ const view = (name, definition) => {
57
+ if (!NAME.test(name))
58
+ throw new Error(`Fleet view name ${name} is PascalCase, at most 48 characters`);
59
+ const source = ownership(definition.from);
60
+ if (source === undefined)
61
+ throw new Error(`Fleet view ${name} reads an Actor.table`);
62
+ const columns = getTableColumns(definition.from);
63
+ const reserved = OWNERSHIP;
64
+ const business = (key, role) => {
65
+ if (reserved.includes(key) || source.ownerKeys.includes(key) || !source.columns.includes(key))
66
+ throw new Error(`Fleet view ${name}: ${role} ${key} is not a business column of ${source.name}`);
67
+ return columns[key];
68
+ };
69
+ if (definition.groupBy.length === 0)
70
+ throw new Error(`Fleet view ${name} groups by at least one column`);
71
+ if (new Set(definition.groupBy).size !== definition.groupBy.length)
72
+ throw new Error(`Fleet view ${name} lists a group column twice`);
73
+ const groupColumns = definition.groupBy.map((key) => {
74
+ const column = business(key, "group column");
75
+ if (!column.notNull)
76
+ throw new Error(`Fleet view ${name}: group column ${key} must be NOT NULL`);
77
+ return column.name;
78
+ });
79
+ const selected = Object.entries(definition.select);
80
+ if (selected.length === 0)
81
+ throw new Error(`Fleet view ${name} selects at least one aggregate`);
82
+ const taken = new Set([...RESERVED, ...groupColumns, ...definition.groupBy]);
83
+ const aggregates = selected.map(([key, aggregate]) => {
84
+ if (taken.has(key) || !/^[a-z][a-z0-9_]*$/i.test(key))
85
+ throw new Error(`Fleet view ${name}: aggregate ${key} clashes with a column or is not a plain name`);
86
+ if (aggregate.kind === "count")
87
+ return { key, kind: "count", column: undefined };
88
+ const column = business(aggregate.column ?? "", `${aggregate.kind} column`);
89
+ const type = column.getSQLType().replace(/\(.*\)$/, "");
90
+ if (aggregate.kind === "sum" && !INTEGER.has(type))
91
+ throw new Error(`Fleet view ${name}: sum takes an integer column, not ${key} (${type})`);
92
+ if (aggregate.kind === "avg" && !NUMERIC.has(type))
93
+ throw new Error(`Fleet view ${name}: avg takes a numeric column, not ${key} (${type})`);
94
+ return { key, kind: aggregate.kind, column: column.name };
95
+ });
96
+ if (source.routingKey === undefined)
97
+ throw new Error(`Fleet view ${name} reads ${source.name}, adopted for reading only; a view recomputes by routing_key, so adopt it with access "write"`);
98
+ const tenantColumn = source.ownerColumns[source.ownerKeys.indexOf(source.tenantKey)];
99
+ const routingColumn = columns[source.routingKey].name;
100
+ const tableName = `fleet_${snake(name)}`;
101
+ const derived = {
102
+ tenant_id: text("tenant_id").notNull(),
103
+ ...Object.fromEntries(definition.groupBy.map((key, index) => [
104
+ key,
105
+ cloneColumn(columns[key], groupColumns[index]).notNull(),
106
+ ])),
107
+ ...Object.fromEntries(aggregates.map(({ key, kind, column }) => [
108
+ key,
109
+ kind === "count" || kind === "sum"
110
+ ? bigint(key, { mode: "number" }).notNull()
111
+ : kind === "avg"
112
+ ? doublePrecision(key).notNull()
113
+ : cloneColumn(columns[Object.keys(columns).find((k) => columns[k].name === column)], key),
114
+ ])),
115
+ as_of: numeric("as_of").notNull(),
116
+ };
117
+ const extra = (self) => {
118
+ const scoped = sql `tenant_id = current_setting('durable.tenant', true)`;
119
+ const [first, ...rest] = [self["tenant_id"], ...definition.groupBy.map((key) => self[key])];
120
+ return [
121
+ primaryKey({ columns: [first, ...rest] }),
122
+ pgPolicy("durable_tenant", { for: "all", using: scoped, withCheck: scoped }),
123
+ ];
124
+ };
125
+ const table = (source.schema === undefined
126
+ ? pgTable(tableName, derived, extra)
127
+ : pgSchema(source.schema).table(tableName, derived, extra));
128
+ const where = definition.where;
129
+ const definitionHash = bytesToHex(sha256Bytes(new TextEncoder().encode(canonical({
130
+ source: source.name,
131
+ owner: [routingColumn, tenantColumn],
132
+ where: (where ?? null),
133
+ groupBy: groupColumns,
134
+ select: aggregates.map(({ key, kind, column }) => ({ key, kind, column })),
135
+ table: tableName,
136
+ }))));
137
+ return {
138
+ name,
139
+ from: definition.from,
140
+ source,
141
+ where,
142
+ groupBy: definition.groupBy,
143
+ groupColumns,
144
+ tenantColumn,
145
+ routingColumn,
146
+ select: definition.select,
147
+ aggregates,
148
+ table,
149
+ tableName: source.schema === undefined ? tableName : `${source.schema}.${tableName}`,
150
+ definitionHash,
151
+ };
152
+ };
153
+ /** Counts the group's rows. */
154
+ const count = () => ({ kind: "count", column: undefined });
155
+ /** Sums an integer column into a bigint; a sum past its range poisons the view. */
156
+ const sum = (column) => ({
157
+ kind: "sum",
158
+ column,
159
+ });
160
+ /** Averages a numeric column as double precision. */
161
+ const avg = (column) => ({
162
+ kind: "avg",
163
+ column,
164
+ });
165
+ /** The smallest value of a column, in the column's own type. */
166
+ const min = (column) => ({
167
+ kind: "min",
168
+ column,
169
+ });
170
+ /** The largest value of a column, in the column's own type. */
171
+ const max = (column) => ({
172
+ kind: "max",
173
+ column,
174
+ });
175
+ /**
176
+ * Follows `view` for the ambient tenant as the ambient caller: its current
177
+ * page, then a page each time the view changed and the page differs. It is
178
+ * authorized like a served subscription, with `kind: "fleet"`, and ends
179
+ * `Unauthorized` once reauthorization is refused. It needs the runtime that
180
+ * registered the view.
181
+ */
182
+ const subscribe = (view, filter = {}, options = {}) => Stream.unwrap(Effect.gen(function* () {
183
+ const actors = yield* InternalActors;
184
+ const results = yield* actors.fleet({
185
+ view: view.name,
186
+ caller: yield* CurrentCaller,
187
+ tenant: yield* Tenant,
188
+ filter: fleetFilterText(filter),
189
+ limit: options.limit ?? FLEET_PAGE_DEFAULT,
190
+ expiresAt: undefined,
191
+ });
192
+ return results.pipe(Stream.mapEffect(({ value }) => decodeResult(value).pipe(Effect.orDie, Effect.map(({ value: page }) => page))));
193
+ }));
194
+ /**
195
+ * Fleet reads: declared views over one owned table of a tenant-placed actor
196
+ * type, grouped by tenant first and maintained from the change feed, outside
197
+ * every turn.
198
+ */
199
+ export const Fleet = {
200
+ /** Follows a view for the ambient tenant; see `subscribe`. */
201
+ subscribe,
202
+ /** Declares a fleet view; see `view`. */
203
+ view,
204
+ /** Counts a group's rows. */
205
+ count,
206
+ /** Sums an integer column. */
207
+ sum,
208
+ /** Averages a numeric column. */
209
+ avg,
210
+ /** The smallest value of a column. */
211
+ min,
212
+ /** The largest value of a column. */
213
+ max,
214
+ };
@@ -0,0 +1,250 @@
1
+ import { type InferInsertModel, type InferSelectModel } from "drizzle-orm";
2
+ import { type AnyPgTable, type PgSelectConfig, type PgTableWithColumns } from "drizzle-orm/pg-core";
3
+ import type { BuildColumns } from "drizzle-orm/column-builder";
4
+ import type { RelationsOrder, TableFilter } from "drizzle-orm/relations";
5
+ import type { EffectDrizzleQueryError } from "drizzle-orm/effect-core";
6
+ import type { EffectPgDatabase } from "drizzle-orm/effect-postgres";
7
+ import type { Effect, Option } from "effect";
8
+ import type { ActorRef } from "../identity/caller.ts";
9
+ import type { Placement } from "../runtime/storage/codec.ts";
10
+ /** Ownership column keys, which are also their SQL names. */
11
+ export declare const OWNERSHIP: readonly ["routing_key", "tenant_id", "actor_id"];
12
+ type OwnershipKey = (typeof OWNERSHIP)[number];
13
+ declare const ownershipColumns: () => {
14
+ routing_key: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBigInt64Builder>;
15
+ tenant_id: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
16
+ actor_id: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
17
+ };
18
+ type OwnershipColumns<Name extends string> = BuildColumns<Name, ReturnType<typeof ownershipColumns>, "pg">;
19
+ declare const OwnedTypeId: unique symbol;
20
+ declare const OwnedKeysId: unique symbol;
21
+ declare const ReadOnlyId: unique symbol;
22
+ declare const MappedColumnsId: unique symbol;
23
+ /** How an actor type uses an owned table: `read` tables are never written by the runtime. */
24
+ export type AdoptionAccess = "write" | "read";
25
+ /** The column types an existing table's tenant and actor columns may have. */
26
+ export type MappedKind = "text" | "uuid";
27
+ /** What the framework knows about an owned table; aliases forward it. */
28
+ export interface Ownership {
29
+ /** The table name, qualified by its schema when it has one. */
30
+ readonly name: string;
31
+ readonly schema: string | undefined;
32
+ readonly table: string;
33
+ /**
34
+ * The column keys of a row: business columns, and for an adopted table also
35
+ * its mapped tenant and actor columns, which are readable but never writable.
36
+ */
37
+ readonly columns: ReadonlyArray<string>;
38
+ /**
39
+ * Primary key column keys, in key order. An owned table's key excludes the
40
+ * ownership columns it is prefixed with; an adopted table's is the physical
41
+ * key as it already is.
42
+ */
43
+ readonly primaryKey: ReadonlyArray<string>;
44
+ /** The actor type listing this table; set once by `Actor.make`. */
45
+ owner: string | undefined;
46
+ /** True when the table existed before the framework and maps its own tenant and actor columns. */
47
+ readonly adopted: boolean;
48
+ readonly access: AdoptionAccess;
49
+ /** Drizzle keys of the ownership columns, which application code never reads or writes. */
50
+ readonly ownerKeys: ReadonlyArray<string>;
51
+ /** SQL names of the ownership columns, in the same order as `ownerKeys`. */
52
+ readonly ownerColumns: ReadonlyArray<string>;
53
+ /** The key of `routing_key`; a read-only adopted table has none. */
54
+ readonly routingKey: string | undefined;
55
+ readonly tenantKey: string;
56
+ readonly actorKey: string;
57
+ readonly tenantKind: MappedKind;
58
+ readonly actorKind: MappedKind;
59
+ /** The owning actor type's placement; set with `owner`. */
60
+ placement: Placement | undefined;
61
+ }
62
+ /**
63
+ * A Drizzle table owned by one actor type. Every row carries the trusted
64
+ * `routing_key`, `tenant_id`, and `actor_id` of the actor that wrote it, and
65
+ * every primary key, unique constraint, and index leads with them.
66
+ */
67
+ export type OwnedTable<T extends AnyPgTable> = PgTableWithColumns<{
68
+ name: T["_"]["name"];
69
+ schema: T["_"]["schema"];
70
+ columns: T["_"]["columns"] & OwnershipColumns<T["_"]["name"]>;
71
+ dialect: "pg";
72
+ isAlias: false;
73
+ }> & {
74
+ readonly [OwnedTypeId]: Ownership;
75
+ readonly [OwnedKeysId]: OwnershipKey;
76
+ };
77
+ /** The columns of an existing table that can name its owner: any column of `T`. */
78
+ export interface OwnerColumns<T extends AnyPgTable> {
79
+ readonly tenant: T["_"]["columns"][keyof T["_"]["columns"]];
80
+ readonly actor: T["_"]["columns"][keyof T["_"]["columns"]];
81
+ }
82
+ declare const routingColumn: () => {
83
+ routing_key: import("drizzle-orm/pg-core").PgBigInt64Builder;
84
+ };
85
+ type RoutingColumn<Name extends string> = BuildColumns<Name, ReturnType<typeof routingColumn>, "pg">;
86
+ /**
87
+ * An existing table an actor type owns rows of. Its keys, constraints, and
88
+ * indexes are untouched; it gains one nullable `routing_key`, and the mapped
89
+ * tenant and actor columns are ownership columns the turn supplies.
90
+ */
91
+ export type AdoptedTable<T extends AnyPgTable, Mapped> = PgTableWithColumns<{
92
+ name: T["_"]["name"];
93
+ schema: T["_"]["schema"];
94
+ columns: T["_"]["columns"] & RoutingColumn<T["_"]["name"]>;
95
+ dialect: "pg";
96
+ isAlias: false;
97
+ }> & {
98
+ readonly [OwnedTypeId]: Ownership;
99
+ readonly [OwnedKeysId]: "routing_key";
100
+ readonly [MappedColumnsId]: Mapped;
101
+ };
102
+ /** An existing table adopted for reading only: unchanged, with no mutation methods in any turn or query. */
103
+ export type ReadAdoptedTable<T extends AnyPgTable, Mapped> = T & {
104
+ readonly [OwnedTypeId]: Ownership;
105
+ readonly [OwnedKeysId]: never;
106
+ readonly [MappedColumnsId]: Mapped;
107
+ readonly [ReadOnlyId]: true;
108
+ };
109
+ type Same<A, B> = (<X>() => X extends A ? 1 : 2) extends <X>() => (X extends B ? 1 : 2) ? true : false;
110
+ /**
111
+ * The columns of an adopted table that look like a mapped column. Types
112
+ * cannot tell which property a column object came from, so a column shaped
113
+ * exactly like the tenant or actor column is treated as possibly mapped: its
114
+ * insert is optional in the type, and the database refuses a missing value.
115
+ */
116
+ type MappedLookalikes<T extends AnyOwnedTable> = T extends {
117
+ readonly [MappedColumnsId]: infer M;
118
+ } ? {
119
+ [K in keyof T["_"]["columns"] & string]: Same<T["_"]["columns"][K], M> extends true ? K : never;
120
+ }[keyof T["_"]["columns"] & string] : never;
121
+ /** Any owned table, whatever its columns. */
122
+ export type AnyOwnedTable = AnyPgTable & {
123
+ readonly [OwnedTypeId]: Ownership;
124
+ };
125
+ type OwnedKeys<T extends AnyOwnedTable> = T extends {
126
+ readonly [OwnedKeysId]: infer K;
127
+ } ? K & string : OwnershipKey;
128
+ type BusinessColumns<T extends AnyOwnedTable> = Omit<T["_"]["columns"], OwnedKeys<T>>;
129
+ /**
130
+ * A row as application code reads it: business columns only. An adopted
131
+ * table's row also carries its mapped tenant and actor columns, which are
132
+ * read-only.
133
+ */
134
+ export type Row<T extends AnyOwnedTable> = Omit<InferSelectModel<T>, OwnedKeys<T>>;
135
+ /**
136
+ * A row as application code writes it: business columns only. The mapped
137
+ * columns of an adopted table come from the turn and are rejected when set.
138
+ */
139
+ export type Insert<T extends AnyOwnedTable> = Omit<InferInsertModel<T>, OwnedKeys<T> | MappedLookalikes<T>> & Partial<Pick<InferInsertModel<T>, MappedLookalikes<T> & keyof InferInsertModel<T>>>;
140
+ /** What a turn's `rows` returns for `T`: rows of a read-adopted table have no mutation methods. */
141
+ export type TurnRows<T extends AnyOwnedTable> = T extends {
142
+ readonly [ReadOnlyId]: true;
143
+ } ? ScopedRead<T> : ScopedRows<T>;
144
+ /** Drizzle's object filter over business columns; `RAW` SQL is not supported. */
145
+ export type Filter<T extends AnyOwnedTable> = Omit<TableFilter<T, BusinessColumns<T>>, "RAW">;
146
+ /** Drizzle's ordering over business columns. */
147
+ export type Order<T extends AnyOwnedTable> = RelationsOrder<BusinessColumns<T>>;
148
+ /** Options for reading one row: a filter and an ordering, both over business columns. */
149
+ export interface ReadOptions<T extends AnyOwnedTable> {
150
+ readonly where?: Filter<T>;
151
+ readonly orderBy?: Order<T>;
152
+ }
153
+ /** Options for reading many rows: a filter, an ordering, and a page. */
154
+ export interface ListOptions<T extends AnyOwnedTable> extends ReadOptions<T> {
155
+ readonly limit?: number;
156
+ readonly offset?: number;
157
+ }
158
+ /** Read-only access to the current actor's rows of one owned table. */
159
+ export interface ScopedRead<T extends AnyOwnedTable> {
160
+ /** The first row matching `options`, or none. */
161
+ readonly one: (options?: ReadOptions<T>) => Effect.Effect<Option.Option<Row<T>>>;
162
+ /** Every matching row, at most `limit` after skipping `offset`. */
163
+ readonly all: (options?: ListOptions<T>) => Effect.Effect<ReadonlyArray<Row<T>>>;
164
+ /** The number of matching rows. */
165
+ readonly count: (options?: {
166
+ readonly where?: Filter<T>;
167
+ }) => Effect.Effect<number>;
168
+ }
169
+ /** A mutation that runs once it is given its filter; `{}` matches every row of the actor. */
170
+ export interface Filtered<T extends AnyOwnedTable> {
171
+ readonly where: (filter: Filter<T>) => Effect.Effect<void>;
172
+ }
173
+ /** Turn-bound access to the current actor's rows; writes commit or roll back with the turn. */
174
+ export interface ScopedRows<T extends AnyOwnedTable> extends ScopedRead<T> {
175
+ /** Inserts one row or a list of rows. */
176
+ readonly insert: (values: Insert<T> | ReadonlyArray<Insert<T>>) => Effect.Effect<void>;
177
+ /** Inserts, or on a primary key conflict updates the supplied non-key columns. */
178
+ readonly upsert: (values: Insert<T> | ReadonlyArray<Insert<T>>) => Effect.Effect<void>;
179
+ /** Sets `values` on the rows the returned filter matches. */
180
+ readonly update: (values: Partial<Insert<T>>) => Filtered<T>;
181
+ /** Deletes the rows the returned filter matches. */
182
+ readonly delete: () => Filtered<T>;
183
+ }
184
+ /** The read-only Drizzle surface a group query is built from. */
185
+ export type GroupDatabase = Pick<EffectPgDatabase, "select" | "selectDistinct">;
186
+ /**
187
+ * Read-only joins across the owned rows of every actor sharing this actor's
188
+ * placement group. The framework adds the group predicate to the base table
189
+ * and to every inner or left join.
190
+ */
191
+ export type Group = <A>(build: (database: GroupDatabase) => Effect.Effect<A, EffectDrizzleQueryError>) => Effect.Effect<A>;
192
+ /** Who the rows belong to and how long a bound capability lives. */
193
+ export interface TableScope {
194
+ readonly ref: ActorRef;
195
+ readonly placement: Placement;
196
+ /** The tables the actor type declares; `rows` refuses any other. */
197
+ readonly tables: ReadonlyArray<AnyOwnedTable>;
198
+ /** Dies once the capability is used outside the turn or query that received it. */
199
+ readonly guard: Effect.Effect<void>;
200
+ /** Told the name of each table or blob a mutation of this turn changed, once it succeeds. */
201
+ readonly wrote?: ((name: string) => void) | undefined;
202
+ }
203
+ /** The table capabilities of one turn or query. */
204
+ export interface TableAccess {
205
+ /** Turn-bound access returns the full `ScopedRows`; read access only `ScopedRead`. */
206
+ readonly rows: (table: AnyOwnedTable) => ScopedRead<AnyOwnedTable>;
207
+ readonly group: Group;
208
+ }
209
+ /** The ownership of `table`, or undefined when it is not an owned table. */
210
+ export declare const ownership: (table: PgSelectConfig["table"]) => Ownership | undefined;
211
+ /** Options that adopt an existing table: the columns holding the tenant and the actor's key. */
212
+ export interface AdoptOptions<T extends AnyPgTable, O extends OwnerColumns<T>> {
213
+ readonly owner: O;
214
+ /** `"read"` adopts the table for reading only; the runtime then adds no column and no guard. */
215
+ readonly access?: AdoptionAccess;
216
+ }
217
+ /** What `Actor.table` returns: a new owned table, or the existing table adopted with `owner`. */
218
+ export type Declared<T extends AnyPgTable, O extends OwnerColumns<T> | undefined, A extends AdoptionAccess | undefined> = O extends OwnerColumns<T> ? A extends "read" ? ReadAdoptedTable<T, O["tenant"] | O["actor"]> : AdoptedTable<T, O["tenant"] | O["actor"]> : OwnedTable<T>;
219
+ /**
220
+ * Declares an actor-owned Drizzle table. The table gains `routing_key`,
221
+ * `tenant_id`, and `actor_id` columns; its primary key, unique constraints, and
222
+ * indexes are prefixed with them, so drizzle-kit generates keys that are
223
+ * unique per actor and scans that stay on one shard. Each table also carries
224
+ * the `durable_tenant` row-level-security policy: the table owner is exempt,
225
+ * and a runtime with row-level security sees only each transaction's tenant.
226
+ *
227
+ * Throws for anything but a `pgTable`, an alias, an already owned table, a
228
+ * table with a reserved ownership column, a table without a primary key, or a
229
+ * foreign key, which would cross actors and need ownership columns on both
230
+ * sides. Column-level `primaryKey` and `unique` would be global, so they move
231
+ * into the prefixed extra config. Only btree indexes are accepted: other
232
+ * methods cannot lead with the bigint and text ownership prefix.
233
+ *
234
+ * With `owner`, adopts a table that already exists and other code writes: its
235
+ * `tenant` and `actor` columns, which must be text, varchar, or uuid, hold the
236
+ * tenant and the actor's key, and nothing else about the table changes, so
237
+ * foreign keys stay. A writable adopted table gains a nullable `routing_key`
238
+ * and starts only after `durable adopt observe`; its primary key stays global,
239
+ * so a key another actor already holds fails the turn. `access: "read"` maps
240
+ * the two columns for reading and adds nothing.
241
+ *
242
+ * @example
243
+ * const Notes = Actor.table(pgTable("notes", { id: text("id").primaryKey(), body: text("body") }))
244
+ * const Invoices = Actor.table(invoices, { owner: { tenant: invoices.orgId, actor: invoices.accountId } })
245
+ */
246
+ export declare const table: <T extends AnyPgTable, const O extends OwnerColumns<T> | undefined = undefined, const A extends AdoptionAccess | undefined = undefined>(source: T, ...adoption: readonly [] | readonly [{
247
+ readonly owner: O;
248
+ readonly access?: A;
249
+ }]) => Declared<T, O, A>;
250
+ export {};