@abloatai/transaction 0.56.0 → 0.58.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 (769) hide show
  1. package/CONVENTIONS.md +54 -10
  2. package/README.md +3 -1
  3. package/dist/ai-sdk/modelTools.d.ts +3 -3
  4. package/dist/ai-sdk/modelTools.d.ts.map +1 -1
  5. package/dist/ai-sdk/modelTools.js +1 -1
  6. package/dist/ai-sdk/modelTools.js.map +1 -1
  7. package/dist/ai-sdk/updateTool.d.ts +5 -7
  8. package/dist/ai-sdk/updateTool.d.ts.map +1 -1
  9. package/dist/ai-sdk/updateTool.js +3 -5
  10. package/dist/ai-sdk/updateTool.js.map +1 -1
  11. package/dist/auth/capability.d.ts +5 -0
  12. package/dist/auth/capability.d.ts.map +1 -1
  13. package/dist/auth/capability.js +5 -0
  14. package/dist/auth/capability.js.map +1 -1
  15. package/dist/auth/capabilityLifecycle.d.ts +1 -1
  16. package/dist/auth/capabilityLifecycle.d.ts.map +1 -1
  17. package/dist/auth/credentialPolicy.d.ts +1 -1
  18. package/dist/auth/credentialPolicy.d.ts.map +1 -1
  19. package/dist/auth/identity.d.ts +3 -3
  20. package/dist/auth/identity.d.ts.map +1 -1
  21. package/dist/auth/identity.js +5 -5
  22. package/dist/auth/identity.js.map +1 -1
  23. package/dist/auth/index.d.ts +4 -208
  24. package/dist/auth/index.d.ts.map +1 -1
  25. package/dist/auth/index.js +4 -330
  26. package/dist/auth/index.js.map +1 -1
  27. package/dist/auth/runtime.d.ts +218 -0
  28. package/dist/auth/runtime.d.ts.map +1 -0
  29. package/dist/auth/runtime.js +336 -0
  30. package/dist/auth/runtime.js.map +1 -0
  31. package/dist/auth/sessionMint.d.ts +1 -1
  32. package/dist/auth/sessionMint.d.ts.map +1 -1
  33. package/dist/auth/sessionMint.js +2 -1
  34. package/dist/auth/sessionMint.js.map +1 -1
  35. package/dist/branches.d.ts +25 -21
  36. package/dist/branches.d.ts.map +1 -1
  37. package/dist/branches.js +3 -0
  38. package/dist/branches.js.map +1 -1
  39. package/dist/{coordination/awaitClaimGrant.d.ts → claims/awaitGrant.d.ts} +1 -1
  40. package/dist/claims/awaitGrant.d.ts.map +1 -0
  41. package/dist/{coordination/awaitClaimGrant.js → claims/awaitGrant.js} +4 -4
  42. package/dist/claims/awaitGrant.js.map +1 -0
  43. package/dist/{wire/claims.d.ts → claims/contract.d.ts} +1 -1
  44. package/dist/claims/contract.d.ts.map +1 -0
  45. package/dist/{wire/claims.js → claims/contract.js} +2 -2
  46. package/dist/claims/contract.js.map +1 -0
  47. package/dist/{wire/claimEvent.d.ts → claims/eventContract.d.ts} +1 -1
  48. package/dist/claims/eventContract.d.ts.map +1 -0
  49. package/dist/{wire/claimEvent.js → claims/eventContract.js} +1 -1
  50. package/dist/claims/eventContract.js.map +1 -0
  51. package/dist/{coordination → claims}/events.d.ts +7 -11
  52. package/dist/claims/events.d.ts.map +1 -0
  53. package/dist/claims/events.js +8 -0
  54. package/dist/claims/events.js.map +1 -0
  55. package/dist/{coordination/claimHeartbeatLoop.d.ts → claims/heartbeat.d.ts} +1 -1
  56. package/dist/claims/heartbeat.d.ts.map +1 -0
  57. package/dist/{coordination/claimHeartbeatLoop.js → claims/heartbeat.js} +1 -1
  58. package/dist/claims/heartbeat.js.map +1 -0
  59. package/dist/claims/index.d.ts +17 -0
  60. package/dist/claims/index.d.ts.map +1 -0
  61. package/dist/claims/index.js +16 -0
  62. package/dist/claims/index.js.map +1 -0
  63. package/dist/claims/lifetime.d.ts +26 -0
  64. package/dist/claims/lifetime.d.ts.map +1 -0
  65. package/dist/claims/lifetime.js +62 -0
  66. package/dist/claims/lifetime.js.map +1 -0
  67. package/dist/{coordination → claims}/locator.d.ts +1 -1
  68. package/dist/claims/locator.d.ts.map +1 -0
  69. package/dist/{coordination → claims}/locator.js +2 -2
  70. package/dist/claims/locator.js.map +1 -0
  71. package/dist/{coordination/claimMeta.d.ts → claims/meta.d.ts} +1 -1
  72. package/dist/claims/meta.d.ts.map +1 -0
  73. package/dist/{coordination/claimMeta.js → claims/meta.js} +1 -1
  74. package/dist/claims/meta.js.map +1 -0
  75. package/dist/claims/routes.d.ts +59 -0
  76. package/dist/claims/routes.d.ts.map +1 -0
  77. package/dist/claims/routes.js +69 -0
  78. package/dist/claims/routes.js.map +1 -0
  79. package/dist/claims/targetConflict.d.ts.map +1 -0
  80. package/dist/claims/targetConflict.js.map +1 -0
  81. package/dist/{coordination → claims}/trace.d.ts +2 -2
  82. package/dist/claims/trace.d.ts.map +1 -0
  83. package/dist/{coordination → claims}/trace.js +5 -5
  84. package/dist/claims/trace.js.map +1 -0
  85. package/dist/{ablo.d.ts → client/ablo.d.ts} +6 -15
  86. package/dist/client/ablo.d.ts.map +1 -0
  87. package/dist/{ablo.js → client/ablo.js} +2 -2
  88. package/dist/client/ablo.js.map +1 -0
  89. package/dist/{transactionLayer.d.ts → client/contract.d.ts} +12 -14
  90. package/dist/client/contract.d.ts.map +1 -0
  91. package/dist/{transactionLayer.js → client/contract.js} +4 -5
  92. package/dist/client/contract.js.map +1 -0
  93. package/dist/{headlessClient.d.ts → client/headless.d.ts} +4 -4
  94. package/dist/client/headless.d.ts.map +1 -0
  95. package/dist/{headlessClient.js → client/headless.js} +8 -10
  96. package/dist/{headlessClient.js.map → client/headless.js.map} +1 -1
  97. package/dist/client/index.d.ts +11 -0
  98. package/dist/client/index.d.ts.map +1 -0
  99. package/dist/client/index.js +11 -0
  100. package/dist/client/index.js.map +1 -0
  101. package/dist/{resources → client/resources}/functionalUpdate.d.ts +4 -4
  102. package/dist/client/resources/functionalUpdate.d.ts.map +1 -0
  103. package/dist/{resources → client/resources}/functionalUpdate.js +3 -3
  104. package/dist/client/resources/functionalUpdate.js.map +1 -0
  105. package/dist/{resources → client/resources}/httpResources.d.ts +92 -77
  106. package/dist/client/resources/httpResources.d.ts.map +1 -0
  107. package/dist/client/resources/httpResources.js +94 -0
  108. package/dist/client/resources/httpResources.js.map +1 -0
  109. package/dist/client/resources/modelCreate.d.ts +21 -0
  110. package/dist/client/resources/modelCreate.d.ts.map +1 -0
  111. package/dist/client/resources/modelCreate.js +49 -0
  112. package/dist/client/resources/modelCreate.js.map +1 -0
  113. package/dist/{resources → client/resources}/modelOperations.d.ts +57 -51
  114. package/dist/client/resources/modelOperations.d.ts.map +1 -0
  115. package/dist/{resources → client/resources}/modelOperations.js +1 -1
  116. package/dist/client/resources/modelOperations.js.map +1 -0
  117. package/dist/{resources → client/resources}/mutationOptions.d.ts +4 -17
  118. package/dist/client/resources/mutationOptions.d.ts.map +1 -0
  119. package/dist/client/resources/mutationOptions.js.map +1 -0
  120. package/dist/client/resources/where.d.ts.map +1 -0
  121. package/dist/{resources → client/resources}/where.js +1 -1
  122. package/dist/client/resources/where.js.map +1 -0
  123. package/dist/{resources → client/resources}/writeOptionsSchema.d.ts +16 -35
  124. package/dist/client/resources/writeOptionsSchema.d.ts.map +1 -0
  125. package/dist/{resources → client/resources}/writeOptionsSchema.js +25 -18
  126. package/dist/client/resources/writeOptionsSchema.js.map +1 -0
  127. package/dist/{transactions → commit}/confirmation/commitEnvelope.d.ts +1 -37
  128. package/dist/commit/confirmation/commitEnvelope.d.ts.map +1 -0
  129. package/dist/{transactions → commit}/confirmation/commitEnvelope.js +2 -7
  130. package/dist/commit/confirmation/commitEnvelope.js.map +1 -0
  131. package/dist/commit/confirmation/httpCommitEnvelope.d.ts.map +1 -0
  132. package/dist/{transactions → commit}/confirmation/httpCommitEnvelope.js +1 -1
  133. package/dist/commit/confirmation/httpCommitEnvelope.js.map +1 -0
  134. package/dist/commit/confirmation/idempotencyKey.d.ts.map +1 -0
  135. package/dist/commit/confirmation/idempotencyKey.js.map +1 -0
  136. package/dist/{transactions → commit}/confirmation/pendingWrite.d.ts +2 -33
  137. package/dist/commit/confirmation/pendingWrite.d.ts.map +1 -0
  138. package/dist/{transactions → commit}/confirmation/pendingWrite.js +1 -1
  139. package/dist/commit/confirmation/pendingWrite.js.map +1 -0
  140. package/dist/commit/contract.d.ts +1404 -0
  141. package/dist/commit/contract.d.ts.map +1 -0
  142. package/dist/{wire/commit.js → commit/contract.js} +26 -21
  143. package/dist/commit/contract.js.map +1 -0
  144. package/dist/{durableWrites.d.ts → commit/durableWrites.d.ts} +6 -6
  145. package/dist/commit/durableWrites.d.ts.map +1 -0
  146. package/dist/{durableWrites.js → commit/durableWrites.js} +5 -5
  147. package/dist/commit/durableWrites.js.map +1 -0
  148. package/dist/commit/httpRequest.d.ts +45 -0
  149. package/dist/commit/httpRequest.d.ts.map +1 -0
  150. package/dist/commit/httpRequest.js +66 -0
  151. package/dist/commit/httpRequest.js.map +1 -0
  152. package/dist/commit/index.d.ts +17 -0
  153. package/dist/commit/index.d.ts.map +1 -0
  154. package/dist/commit/index.js +17 -0
  155. package/dist/commit/index.js.map +1 -0
  156. package/dist/{readSetContext.d.ts → commit/readSetContext.d.ts} +7 -15
  157. package/dist/commit/readSetContext.d.ts.map +1 -0
  158. package/dist/{readSetContext.js → commit/readSetContext.js} +18 -28
  159. package/dist/commit/readSetContext.js.map +1 -0
  160. package/dist/{commitRecordRuntime.d.ts → commit/recordRuntime.d.ts} +3 -5
  161. package/dist/commit/recordRuntime.d.ts.map +1 -0
  162. package/dist/{commitRecordRuntime.js → commit/recordRuntime.js} +13 -54
  163. package/dist/commit/recordRuntime.js.map +1 -0
  164. package/dist/coordination/index.d.ts +6 -8
  165. package/dist/coordination/index.d.ts.map +1 -1
  166. package/dist/coordination/index.js +3 -9
  167. package/dist/coordination/index.js.map +1 -1
  168. package/dist/coordination/schema.d.ts +11 -466
  169. package/dist/coordination/schema.d.ts.map +1 -1
  170. package/dist/coordination/schema.js +13 -265
  171. package/dist/coordination/schema.js.map +1 -1
  172. package/dist/errorCodes.d.ts +16 -9
  173. package/dist/errorCodes.d.ts.map +1 -1
  174. package/dist/errorCodes.js +14 -6
  175. package/dist/errorCodes.js.map +1 -1
  176. package/dist/errorObservation.d.ts +2 -2
  177. package/dist/errors.d.ts +3 -2
  178. package/dist/errors.d.ts.map +1 -1
  179. package/dist/errors.js +27 -11
  180. package/dist/errors.js.map +1 -1
  181. package/dist/index.d.ts +7 -7
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +3 -3
  184. package/dist/index.js.map +1 -1
  185. package/dist/internal/read-set.d.ts +3 -3
  186. package/dist/internal/read-set.d.ts.map +1 -1
  187. package/dist/internal/read-set.js +2 -2
  188. package/dist/internal/read-set.js.map +1 -1
  189. package/dist/observability.d.ts +4 -4
  190. package/dist/observability.d.ts.map +1 -1
  191. package/dist/observability.js +2 -2
  192. package/dist/{wire/delta.d.ts → observation/contract.d.ts} +8 -8
  193. package/dist/observation/contract.d.ts.map +1 -0
  194. package/dist/{wire/delta.js → observation/contract.js} +3 -3
  195. package/dist/observation/contract.js.map +1 -0
  196. package/dist/{wire/feedCursor.d.ts → observation/cursor.d.ts} +1 -1
  197. package/dist/observation/cursor.d.ts.map +1 -0
  198. package/dist/{wire/feedCursor.js → observation/cursor.js} +1 -1
  199. package/dist/observation/cursor.js.map +1 -0
  200. package/dist/{wire/deltaDelivery.d.ts → observation/deliveryContract.d.ts} +1 -1
  201. package/dist/observation/deliveryContract.d.ts.map +1 -0
  202. package/dist/{wire/deltaDelivery.js → observation/deliveryContract.js} +1 -1
  203. package/dist/observation/deliveryContract.js.map +1 -0
  204. package/dist/{wire/feedEvent.d.ts → observation/feedContract.d.ts} +10 -10
  205. package/dist/observation/feedContract.d.ts.map +1 -0
  206. package/dist/{wire/feedEvent.js → observation/feedContract.js} +4 -4
  207. package/dist/observation/feedContract.js.map +1 -0
  208. package/dist/observation/httpFeed.d.ts +4 -0
  209. package/dist/observation/httpFeed.d.ts.map +1 -0
  210. package/dist/{transport → observation}/httpFeed.js +1 -1
  211. package/dist/{transport → observation}/httpFeed.js.map +1 -1
  212. package/dist/observation/index.d.ts +13 -0
  213. package/dist/observation/index.d.ts.map +1 -0
  214. package/dist/observation/index.js +13 -0
  215. package/dist/observation/index.js.map +1 -0
  216. package/dist/{log → observation/persistence}/syncDeltaRow.d.ts +8 -8
  217. package/dist/observation/persistence/syncDeltaRow.d.ts.map +1 -0
  218. package/dist/{log → observation/persistence}/syncDeltaRow.js +4 -4
  219. package/dist/observation/persistence/syncDeltaRow.js.map +1 -0
  220. package/dist/pricing.d.ts +20 -12
  221. package/dist/pricing.d.ts.map +1 -1
  222. package/dist/pricing.js +46 -26
  223. package/dist/pricing.js.map +1 -1
  224. package/dist/schema/audit.d.ts +15 -0
  225. package/dist/schema/audit.d.ts.map +1 -0
  226. package/dist/schema/audit.js +90 -0
  227. package/dist/schema/audit.js.map +1 -0
  228. package/dist/schema/ddl.d.ts.map +1 -1
  229. package/dist/schema/ddl.js +68 -1
  230. package/dist/schema/ddl.js.map +1 -1
  231. package/dist/schema/index.d.ts +7 -6
  232. package/dist/schema/index.d.ts.map +1 -1
  233. package/dist/schema/index.js +6 -7
  234. package/dist/schema/index.js.map +1 -1
  235. package/dist/schema/model.d.ts +14 -27
  236. package/dist/schema/model.d.ts.map +1 -1
  237. package/dist/schema/model.js +2 -2
  238. package/dist/schema/model.js.map +1 -1
  239. package/dist/schema/openapi.d.ts.map +1 -1
  240. package/dist/schema/openapi.js +149 -8
  241. package/dist/schema/openapi.js.map +1 -1
  242. package/dist/schema/roles.d.ts +27 -0
  243. package/dist/schema/roles.d.ts.map +1 -1
  244. package/dist/schema/roles.js +40 -0
  245. package/dist/schema/roles.js.map +1 -1
  246. package/dist/schema/schema.d.ts +34 -7
  247. package/dist/schema/schema.d.ts.map +1 -1
  248. package/dist/schema/schema.js +39 -3
  249. package/dist/schema/schema.js.map +1 -1
  250. package/dist/schema/serialize.d.ts +5 -5
  251. package/dist/schema/serialize.d.ts.map +1 -1
  252. package/dist/schema/serialize.js +5 -5
  253. package/dist/schema/serialize.js.map +1 -1
  254. package/dist/schema/subject.d.ts +18 -0
  255. package/dist/schema/subject.d.ts.map +1 -0
  256. package/dist/schema/subject.js +27 -0
  257. package/dist/schema/subject.js.map +1 -0
  258. package/dist/schema/tenancy.d.ts +1 -1
  259. package/dist/server/adapter.d.ts +3 -1
  260. package/dist/server/adapter.d.ts.map +1 -1
  261. package/dist/server/commit.d.ts +6 -14
  262. package/dist/server/commit.d.ts.map +1 -1
  263. package/dist/server/index.d.ts +1 -1
  264. package/dist/server/index.d.ts.map +1 -1
  265. package/dist/server/index.js +1 -1
  266. package/dist/server/index.js.map +1 -1
  267. package/dist/server/readConfig.d.ts +3 -0
  268. package/dist/server/readConfig.d.ts.map +1 -1
  269. package/dist/server/readConfig.js +0 -21
  270. package/dist/server/readConfig.js.map +1 -1
  271. package/dist/server/storageMode.d.ts +1 -1
  272. package/dist/source/{adapter.d.ts → adapters/adapter.d.ts} +10 -4
  273. package/dist/source/adapters/adapter.d.ts.map +1 -0
  274. package/dist/source/adapters/adapter.js.map +1 -0
  275. package/dist/source/adapters/adapterFactory.d.ts.map +1 -0
  276. package/dist/source/{adapterFactory.js → adapters/adapterFactory.js} +1 -1
  277. package/dist/source/adapters/adapterFactory.js.map +1 -0
  278. package/dist/source/adapters/adapterProfile.d.ts.map +1 -0
  279. package/dist/source/adapters/adapterProfile.js.map +1 -0
  280. package/dist/source/{conformance.d.ts → adapters/conformance.d.ts} +1 -1
  281. package/dist/source/adapters/conformance.d.ts.map +1 -0
  282. package/dist/source/{conformance.js → adapters/conformance.js} +1 -1
  283. package/dist/source/adapters/conformance.js.map +1 -0
  284. package/dist/source/{contract.d.ts → adapters/contract.d.ts} +20 -75
  285. package/dist/source/adapters/contract.d.ts.map +1 -0
  286. package/dist/source/{contract.js → adapters/contract.js} +20 -55
  287. package/dist/source/adapters/contract.js.map +1 -0
  288. package/dist/source/adapters/drizzle.d.ts +1 -1
  289. package/dist/source/adapters/drizzle.d.ts.map +1 -1
  290. package/dist/source/adapters/drizzle.js +54 -25
  291. package/dist/source/adapters/drizzle.js.map +1 -1
  292. package/dist/source/adapters/idempotency.d.ts.map +1 -0
  293. package/dist/source/{idempotency.js → adapters/idempotency.js} +2 -2
  294. package/dist/source/adapters/idempotency.js.map +1 -0
  295. package/dist/source/adapters/index.d.ts +21 -0
  296. package/dist/source/adapters/index.d.ts.map +1 -0
  297. package/dist/source/adapters/index.js +21 -0
  298. package/dist/source/adapters/index.js.map +1 -0
  299. package/dist/source/adapters/kysely.d.ts +3 -1
  300. package/dist/source/adapters/kysely.d.ts.map +1 -1
  301. package/dist/source/adapters/kysely.js +49 -23
  302. package/dist/source/adapters/kysely.js.map +1 -1
  303. package/dist/source/adapters/kyselyMutationCore.d.ts +6 -3
  304. package/dist/source/adapters/kyselyMutationCore.d.ts.map +1 -1
  305. package/dist/source/adapters/kyselyMutationCore.js +17 -8
  306. package/dist/source/adapters/kyselyMutationCore.js.map +1 -1
  307. package/dist/source/adapters/memory.d.ts +3 -3
  308. package/dist/source/adapters/memory.d.ts.map +1 -1
  309. package/dist/source/adapters/memory.js +20 -7
  310. package/dist/source/adapters/memory.js.map +1 -1
  311. package/dist/source/adapters/migration.d.ts +8 -0
  312. package/dist/source/adapters/migration.d.ts.map +1 -0
  313. package/dist/source/adapters/migration.js +9 -0
  314. package/dist/source/adapters/migration.js.map +1 -0
  315. package/dist/source/{migrations.d.ts → adapters/migrations.d.ts} +3 -4
  316. package/dist/source/adapters/migrations.d.ts.map +1 -0
  317. package/dist/source/{migrations.js → adapters/migrations.js} +4 -31
  318. package/dist/source/adapters/migrations.js.map +1 -0
  319. package/dist/source/adapters/prisma.d.ts +1 -1
  320. package/dist/source/adapters/prisma.d.ts.map +1 -1
  321. package/dist/source/adapters/prisma.js +75 -30
  322. package/dist/source/adapters/prisma.js.map +1 -1
  323. package/dist/source/adapters/subjectAuthorization.d.ts +16 -0
  324. package/dist/source/adapters/subjectAuthorization.d.ts.map +1 -0
  325. package/dist/source/adapters/subjectAuthorization.js +126 -0
  326. package/dist/source/adapters/subjectAuthorization.js.map +1 -0
  327. package/dist/source/{connector.d.ts → connector/client.d.ts} +6 -1
  328. package/dist/source/connector/client.d.ts.map +1 -0
  329. package/dist/source/{connector.js → connector/client.js} +28 -11
  330. package/dist/source/connector/client.js.map +1 -0
  331. package/dist/source/connector/index.d.ts +4 -0
  332. package/dist/source/connector/index.d.ts.map +1 -0
  333. package/dist/source/connector/index.js +4 -0
  334. package/dist/source/connector/index.js.map +1 -0
  335. package/dist/source/{connectorProtocol.d.ts → connector/protocol.d.ts} +8 -1
  336. package/dist/source/connector/protocol.d.ts.map +1 -0
  337. package/dist/source/{connectorProtocol.js → connector/protocol.js} +10 -3
  338. package/dist/source/connector/protocol.js.map +1 -0
  339. package/dist/source/delivery/index.d.ts +3 -0
  340. package/dist/source/delivery/index.d.ts.map +1 -0
  341. package/dist/source/delivery/index.js +3 -0
  342. package/dist/source/delivery/index.js.map +1 -0
  343. package/dist/source/{pushQueue.d.ts → delivery/pushQueue.d.ts} +1 -1
  344. package/dist/source/delivery/pushQueue.d.ts.map +1 -0
  345. package/dist/source/{pushQueue.js → delivery/pushQueue.js} +1 -1
  346. package/dist/source/delivery/pushQueue.js.map +1 -0
  347. package/dist/source/{factory.d.ts → endpoint/factory.d.ts} +9 -3
  348. package/dist/source/endpoint/factory.d.ts.map +1 -0
  349. package/dist/source/{factory.js → endpoint/factory.js} +122 -6
  350. package/dist/source/endpoint/factory.js.map +1 -0
  351. package/dist/source/endpoint/index.d.ts +5 -0
  352. package/dist/source/endpoint/index.d.ts.map +1 -0
  353. package/dist/source/endpoint/index.js +5 -0
  354. package/dist/source/endpoint/index.js.map +1 -0
  355. package/dist/source/{next.d.ts → endpoint/next.d.ts} +2 -2
  356. package/dist/source/endpoint/next.d.ts.map +1 -0
  357. package/dist/source/{next.js → endpoint/next.js} +1 -1
  358. package/dist/source/endpoint/next.js.map +1 -0
  359. package/dist/source/{signing.d.ts → endpoint/signing.d.ts} +1 -1
  360. package/dist/source/endpoint/signing.d.ts.map +1 -0
  361. package/dist/source/{signing.js → endpoint/signing.js} +1 -1
  362. package/dist/source/endpoint/signing.js.map +1 -0
  363. package/dist/source/index.d.ts +15 -12
  364. package/dist/source/index.d.ts.map +1 -1
  365. package/dist/source/index.js +13 -10
  366. package/dist/source/index.js.map +1 -1
  367. package/dist/source/outbox/contract.d.ts +50 -0
  368. package/dist/source/outbox/contract.d.ts.map +1 -0
  369. package/dist/source/outbox/contract.js +50 -0
  370. package/dist/source/outbox/contract.js.map +1 -0
  371. package/dist/source/outbox/envelope.d.ts +9 -0
  372. package/dist/source/outbox/envelope.d.ts.map +1 -0
  373. package/dist/source/outbox/envelope.js +36 -0
  374. package/dist/source/outbox/envelope.js.map +1 -0
  375. package/dist/source/outbox/index.d.ts +11 -0
  376. package/dist/source/outbox/index.d.ts.map +1 -0
  377. package/dist/source/outbox/index.js +11 -0
  378. package/dist/source/outbox/index.js.map +1 -0
  379. package/dist/source/outbox/migrations.d.ts +4 -0
  380. package/dist/source/outbox/migrations.d.ts.map +1 -0
  381. package/dist/source/outbox/migrations.js +67 -0
  382. package/dist/source/outbox/migrations.js.map +1 -0
  383. package/dist/source/outbox/retention.d.ts +3 -0
  384. package/dist/source/outbox/retention.d.ts.map +1 -0
  385. package/dist/source/outbox/retention.js +3 -0
  386. package/dist/source/outbox/retention.js.map +1 -0
  387. package/dist/source/types.d.ts +59 -10
  388. package/dist/source/types.d.ts.map +1 -1
  389. package/dist/source/types.js +2 -0
  390. package/dist/source/types.js.map +1 -1
  391. package/dist/syncLog/contract.d.ts +19 -8
  392. package/dist/syncLog/contract.d.ts.map +1 -1
  393. package/dist/syncLog/contract.js +19 -6
  394. package/dist/syncLog/contract.js.map +1 -1
  395. package/dist/testing/fixtures/httpResponses.d.ts +6 -0
  396. package/dist/testing/fixtures/httpResponses.d.ts.map +1 -1
  397. package/dist/testing/fixtures/httpResponses.js +1 -0
  398. package/dist/testing/fixtures/httpResponses.js.map +1 -1
  399. package/dist/transport/{credentialLifecycle.d.ts → connection/credentialLifecycle.d.ts} +3 -3
  400. package/dist/transport/connection/credentialLifecycle.d.ts.map +1 -0
  401. package/dist/transport/{credentialLifecycle.js → connection/credentialLifecycle.js} +2 -2
  402. package/dist/transport/connection/credentialLifecycle.js.map +1 -0
  403. package/dist/transport/connection/index.d.ts +5 -0
  404. package/dist/transport/connection/index.d.ts.map +1 -0
  405. package/dist/transport/connection/index.js +5 -0
  406. package/dist/transport/connection/index.js.map +1 -0
  407. package/dist/transport/{connectionManager.d.ts → connection/manager.d.ts} +13 -5
  408. package/dist/transport/connection/manager.d.ts.map +1 -0
  409. package/dist/transport/{connectionManager.js → connection/manager.js} +6 -4
  410. package/dist/transport/connection/manager.js.map +1 -0
  411. package/dist/transport/{networkProbe.d.ts → connection/networkProbe.d.ts} +2 -2
  412. package/dist/transport/connection/networkProbe.d.ts.map +1 -0
  413. package/dist/transport/{networkProbe.js → connection/networkProbe.js} +4 -4
  414. package/dist/transport/connection/networkProbe.js.map +1 -0
  415. package/dist/transport/{httpClient.d.ts → http/client.d.ts} +32 -44
  416. package/dist/transport/http/client.d.ts.map +1 -0
  417. package/dist/transport/{httpClient.js → http/client.js} +96 -105
  418. package/dist/transport/http/client.js.map +1 -0
  419. package/dist/transport/http/helpers.d.ts +10 -0
  420. package/dist/transport/http/helpers.d.ts.map +1 -0
  421. package/dist/transport/http/helpers.js +46 -0
  422. package/dist/transport/http/helpers.js.map +1 -0
  423. package/dist/transport/http/index.d.ts +6 -0
  424. package/dist/transport/http/index.d.ts.map +1 -0
  425. package/dist/transport/http/index.js +6 -0
  426. package/dist/transport/http/index.js.map +1 -0
  427. package/dist/transport/{httpOptions.d.ts → http/options.d.ts} +7 -7
  428. package/dist/transport/{httpOptions.d.ts.map → http/options.d.ts.map} +1 -1
  429. package/dist/transport/{httpOptions.js → http/options.js} +1 -1
  430. package/dist/transport/http/options.js.map +1 -0
  431. package/dist/transport/http/subscription.d.ts +16 -0
  432. package/dist/transport/http/subscription.d.ts.map +1 -0
  433. package/dist/transport/http/subscription.js +146 -0
  434. package/dist/transport/http/subscription.js.map +1 -0
  435. package/dist/transport/{httpTransport.d.ts → http/transport.d.ts} +9 -6
  436. package/dist/transport/http/transport.d.ts.map +1 -0
  437. package/dist/transport/{httpTransport.js → http/transport.js} +153 -188
  438. package/dist/transport/http/transport.js.map +1 -0
  439. package/dist/transport/index.d.ts +8 -0
  440. package/dist/transport/index.d.ts.map +1 -0
  441. package/dist/transport/index.js +8 -0
  442. package/dist/transport/index.js.map +1 -0
  443. package/dist/transport/{commitFrames.d.ts → websocket/commitFrames.d.ts} +8 -20
  444. package/dist/transport/websocket/commitFrames.d.ts.map +1 -0
  445. package/dist/transport/{commitFrames.js → websocket/commitFrames.js} +6 -25
  446. package/dist/transport/websocket/commitFrames.js.map +1 -0
  447. package/dist/transport/{wsFrameHandlers.d.ts → websocket/frameHandlers.d.ts} +5 -5
  448. package/dist/transport/websocket/frameHandlers.d.ts.map +1 -0
  449. package/dist/transport/{wsFrameHandlers.js → websocket/frameHandlers.js} +10 -51
  450. package/dist/transport/websocket/frameHandlers.js.map +1 -0
  451. package/dist/transport/{heartbeat.d.ts → websocket/heartbeat.d.ts} +1 -1
  452. package/dist/transport/websocket/heartbeat.d.ts.map +1 -0
  453. package/dist/transport/{heartbeat.js → websocket/heartbeat.js} +2 -2
  454. package/dist/transport/websocket/heartbeat.js.map +1 -0
  455. package/dist/transport/websocket/index.d.ts +6 -0
  456. package/dist/transport/websocket/index.d.ts.map +1 -0
  457. package/dist/transport/websocket/index.js +6 -0
  458. package/dist/transport/websocket/index.js.map +1 -0
  459. package/dist/transport/{wsTransport.d.ts → websocket/transport.d.ts} +13 -25
  460. package/dist/transport/websocket/transport.d.ts.map +1 -0
  461. package/dist/transport/{wsTransport.js → websocket/transport.js} +14 -14
  462. package/dist/transport/websocket/transport.js.map +1 -0
  463. package/dist/types/index.d.ts +1 -1
  464. package/dist/types/index.d.ts.map +1 -1
  465. package/dist/types/streams.d.ts +8 -48
  466. package/dist/types/streams.d.ts.map +1 -1
  467. package/dist/types/streams.js +2 -2
  468. package/dist/wire/accountResponses.d.ts +4 -72
  469. package/dist/wire/accountResponses.d.ts.map +1 -1
  470. package/dist/wire/accountResponses.js +2 -10
  471. package/dist/wire/accountResponses.js.map +1 -1
  472. package/dist/wire/apiLifecycle.d.ts +63 -0
  473. package/dist/wire/apiLifecycle.d.ts.map +1 -0
  474. package/dist/wire/apiLifecycle.js +89 -0
  475. package/dist/wire/apiLifecycle.js.map +1 -0
  476. package/dist/wire/frames.d.ts +6 -83
  477. package/dist/wire/frames.d.ts.map +1 -1
  478. package/dist/wire/frames.js +4 -11
  479. package/dist/wire/frames.js.map +1 -1
  480. package/dist/wire/inboundFrames.d.ts +6 -131
  481. package/dist/wire/inboundFrames.d.ts.map +1 -1
  482. package/dist/wire/inboundFrames.js +3 -3
  483. package/dist/wire/inboundFrames.js.map +1 -1
  484. package/dist/wire/index.d.ts +20 -15
  485. package/dist/wire/index.d.ts.map +1 -1
  486. package/dist/wire/index.js +22 -8
  487. package/dist/wire/index.js.map +1 -1
  488. package/dist/wire/modelMutations.d.ts +1 -32
  489. package/dist/wire/modelMutations.d.ts.map +1 -1
  490. package/dist/wire/modelMutations.js +1 -8
  491. package/dist/wire/modelMutations.js.map +1 -1
  492. package/dist/wire/rateLimit.d.ts +82 -0
  493. package/dist/wire/rateLimit.d.ts.map +1 -0
  494. package/dist/wire/rateLimit.js +142 -0
  495. package/dist/wire/rateLimit.js.map +1 -0
  496. package/package.json +130 -10
  497. package/src/ai-sdk/modelTools.ts +5 -5
  498. package/src/ai-sdk/updateTool.ts +5 -7
  499. package/src/auth/capability.ts +5 -0
  500. package/src/auth/capabilityLifecycle.ts +1 -1
  501. package/src/auth/credentialPolicy.ts +1 -1
  502. package/src/auth/identity.ts +7 -7
  503. package/src/auth/index.ts +4 -663
  504. package/src/auth/runtime.ts +669 -0
  505. package/src/auth/sessionMint.ts +3 -2
  506. package/src/branches.ts +3 -0
  507. package/src/{coordination/awaitClaimGrant.ts → claims/awaitGrant.ts} +4 -4
  508. package/src/{wire/claims.ts → claims/contract.ts} +1 -1
  509. package/src/{coordination → claims}/events.ts +7 -11
  510. package/src/claims/index.ts +21 -0
  511. package/src/claims/lifetime.ts +78 -0
  512. package/src/{coordination → claims}/locator.ts +3 -3
  513. package/src/claims/routes.ts +81 -0
  514. package/src/{coordination → claims}/trace.ts +5 -5
  515. package/src/{ablo.ts → client/ablo.ts} +8 -20
  516. package/src/{transactionLayer.ts → client/contract.ts} +11 -13
  517. package/src/{headlessClient.ts → client/headless.ts} +13 -15
  518. package/src/client/index.ts +10 -0
  519. package/src/{resources → client/resources}/functionalUpdate.ts +4 -4
  520. package/src/{resources → client/resources}/httpResources.ts +163 -92
  521. package/src/client/resources/modelCreate.ts +73 -0
  522. package/src/{resources → client/resources}/modelOperations.ts +73 -55
  523. package/src/{resources → client/resources}/mutationOptions.ts +4 -17
  524. package/src/{resources → client/resources}/where.ts +1 -1
  525. package/src/{resources → client/resources}/writeOptionsSchema.ts +35 -27
  526. package/src/{transactions → commit}/confirmation/commitEnvelope.ts +2 -12
  527. package/src/{transactions → commit}/confirmation/httpCommitEnvelope.ts +1 -1
  528. package/src/{transactions → commit}/confirmation/pendingWrite.ts +1 -1
  529. package/src/{wire/commit.ts → commit/contract.ts} +27 -26
  530. package/src/{durableWrites.ts → commit/durableWrites.ts} +7 -7
  531. package/src/commit/httpRequest.ts +103 -0
  532. package/src/commit/index.ts +16 -0
  533. package/src/{readSetContext.ts → commit/readSetContext.ts} +24 -43
  534. package/src/{commitRecordRuntime.ts → commit/recordRuntime.ts} +12 -67
  535. package/src/coordination/index.ts +4 -54
  536. package/src/coordination/schema.ts +15 -309
  537. package/src/errorCodes.ts +62 -10
  538. package/src/errors.ts +32 -10
  539. package/src/index.ts +8 -8
  540. package/src/internal/read-set.ts +3 -6
  541. package/src/observability.ts +4 -4
  542. package/src/{wire/delta.ts → observation/contract.ts} +2 -2
  543. package/src/{wire/feedEvent.ts → observation/feedContract.ts} +3 -4
  544. package/src/{transport → observation}/httpFeed.ts +3 -3
  545. package/src/observation/index.ts +12 -0
  546. package/src/{log → observation/persistence}/syncDeltaRow.ts +6 -7
  547. package/src/pricing.ts +46 -25
  548. package/src/schema/audit.ts +121 -0
  549. package/src/schema/ddl.ts +71 -1
  550. package/src/schema/index.ts +20 -20
  551. package/src/schema/model.ts +17 -33
  552. package/src/schema/openapi.ts +170 -9
  553. package/src/schema/roles.ts +53 -0
  554. package/src/schema/schema.ts +91 -6
  555. package/src/schema/serialize.ts +8 -9
  556. package/src/schema/subject.ts +43 -0
  557. package/src/server/adapter.ts +3 -1
  558. package/src/server/commit.ts +6 -14
  559. package/src/server/index.ts +1 -1
  560. package/src/server/readConfig.ts +4 -0
  561. package/src/source/{adapter.ts → adapters/adapter.ts} +9 -5
  562. package/src/source/{adapterFactory.ts → adapters/adapterFactory.ts} +1 -1
  563. package/src/source/{conformance.ts → adapters/conformance.ts} +1 -1
  564. package/src/source/{contract.ts → adapters/contract.ts} +24 -61
  565. package/src/source/adapters/drizzle.ts +75 -29
  566. package/src/source/{idempotency.ts → adapters/idempotency.ts} +2 -2
  567. package/src/source/adapters/index.ts +20 -0
  568. package/src/source/adapters/kysely.ts +77 -27
  569. package/src/source/adapters/kyselyMutationCore.ts +23 -11
  570. package/src/source/adapters/memory.ts +26 -9
  571. package/src/source/adapters/migration.ts +11 -0
  572. package/src/source/{migrations.ts → adapters/migrations.ts} +6 -33
  573. package/src/source/adapters/prisma.ts +98 -34
  574. package/src/source/adapters/subjectAuthorization.ts +182 -0
  575. package/src/source/{connector.ts → connector/client.ts} +35 -12
  576. package/src/source/connector/index.ts +3 -0
  577. package/src/source/{connectorProtocol.ts → connector/protocol.ts} +10 -2
  578. package/src/source/delivery/index.ts +2 -0
  579. package/src/source/{pushQueue.ts → delivery/pushQueue.ts} +2 -2
  580. package/src/source/{factory.ts → endpoint/factory.ts} +150 -9
  581. package/src/source/endpoint/index.ts +4 -0
  582. package/src/source/{next.ts → endpoint/next.ts} +2 -2
  583. package/src/source/{signing.ts → endpoint/signing.ts} +1 -1
  584. package/src/source/index.ts +27 -18
  585. package/src/source/outbox/contract.ts +56 -0
  586. package/src/source/outbox/envelope.ts +47 -0
  587. package/src/source/outbox/index.ts +15 -0
  588. package/src/source/outbox/migrations.ts +71 -0
  589. package/src/source/outbox/retention.ts +2 -0
  590. package/src/source/types.ts +64 -10
  591. package/src/syncLog/contract.ts +19 -9
  592. package/src/testing/fixtures/httpResponses.ts +7 -0
  593. package/src/transport/{credentialLifecycle.ts → connection/credentialLifecycle.ts} +3 -3
  594. package/src/transport/connection/index.ts +4 -0
  595. package/src/transport/{connectionManager.ts → connection/manager.ts} +13 -4
  596. package/src/transport/{networkProbe.ts → connection/networkProbe.ts} +4 -4
  597. package/src/transport/{httpClient.ts → http/client.ts} +165 -184
  598. package/src/transport/http/helpers.ts +63 -0
  599. package/src/transport/http/index.ts +5 -0
  600. package/src/transport/{httpOptions.ts → http/options.ts} +6 -6
  601. package/src/transport/http/subscription.ts +174 -0
  602. package/src/transport/{httpTransport.ts → http/transport.ts} +210 -246
  603. package/src/transport/index.ts +7 -0
  604. package/src/transport/{commitFrames.ts → websocket/commitFrames.ts} +14 -46
  605. package/src/transport/{wsFrameHandlers.ts → websocket/frameHandlers.ts} +11 -54
  606. package/src/transport/{heartbeat.ts → websocket/heartbeat.ts} +2 -2
  607. package/src/transport/websocket/index.ts +5 -0
  608. package/src/transport/{wsTransport.ts → websocket/transport.ts} +16 -30
  609. package/src/types/index.ts +2 -6
  610. package/src/types/streams.ts +7 -61
  611. package/src/webhooks/events.ts +1 -1
  612. package/src/wire/accountResponses.ts +3 -12
  613. package/src/wire/apiLifecycle.ts +94 -0
  614. package/src/wire/frames.ts +5 -15
  615. package/src/wire/inboundFrames.ts +3 -3
  616. package/src/wire/index.ts +50 -15
  617. package/src/wire/modelMutations.ts +1 -14
  618. package/src/wire/rateLimit.ts +155 -0
  619. package/dist/ablo.d.ts.map +0 -1
  620. package/dist/ablo.js.map +0 -1
  621. package/dist/commitRecordRuntime.d.ts.map +0 -1
  622. package/dist/commitRecordRuntime.js.map +0 -1
  623. package/dist/coordination/awaitClaimGrant.d.ts.map +0 -1
  624. package/dist/coordination/awaitClaimGrant.js.map +0 -1
  625. package/dist/coordination/claimHeartbeatLoop.d.ts.map +0 -1
  626. package/dist/coordination/claimHeartbeatLoop.js.map +0 -1
  627. package/dist/coordination/claimMeta.d.ts.map +0 -1
  628. package/dist/coordination/claimMeta.js.map +0 -1
  629. package/dist/coordination/events.d.ts.map +0 -1
  630. package/dist/coordination/events.js +0 -8
  631. package/dist/coordination/events.js.map +0 -1
  632. package/dist/coordination/locator.d.ts.map +0 -1
  633. package/dist/coordination/locator.js.map +0 -1
  634. package/dist/coordination/targetConflict.d.ts.map +0 -1
  635. package/dist/coordination/targetConflict.js.map +0 -1
  636. package/dist/coordination/trace.d.ts.map +0 -1
  637. package/dist/coordination/trace.js.map +0 -1
  638. package/dist/durableWrites.d.ts.map +0 -1
  639. package/dist/durableWrites.js.map +0 -1
  640. package/dist/headlessClient.d.ts.map +0 -1
  641. package/dist/log/syncDeltaRow.d.ts.map +0 -1
  642. package/dist/log/syncDeltaRow.js.map +0 -1
  643. package/dist/policy/types.d.ts +0 -226
  644. package/dist/policy/types.d.ts.map +0 -1
  645. package/dist/policy/types.js +0 -127
  646. package/dist/policy/types.js.map +0 -1
  647. package/dist/readSetContext.d.ts.map +0 -1
  648. package/dist/readSetContext.js.map +0 -1
  649. package/dist/resources/functionalUpdate.d.ts.map +0 -1
  650. package/dist/resources/functionalUpdate.js.map +0 -1
  651. package/dist/resources/httpResources.d.ts.map +0 -1
  652. package/dist/resources/httpResources.js +0 -17
  653. package/dist/resources/httpResources.js.map +0 -1
  654. package/dist/resources/modelOperations.d.ts.map +0 -1
  655. package/dist/resources/modelOperations.js.map +0 -1
  656. package/dist/resources/mutationOptions.d.ts.map +0 -1
  657. package/dist/resources/mutationOptions.js.map +0 -1
  658. package/dist/resources/where.d.ts.map +0 -1
  659. package/dist/resources/where.js.map +0 -1
  660. package/dist/resources/writeOptionsSchema.d.ts.map +0 -1
  661. package/dist/resources/writeOptionsSchema.js.map +0 -1
  662. package/dist/schema/coordination.d.ts +0 -113
  663. package/dist/schema/coordination.d.ts.map +0 -1
  664. package/dist/schema/coordination.js +0 -134
  665. package/dist/schema/coordination.js.map +0 -1
  666. package/dist/source/adapter.d.ts.map +0 -1
  667. package/dist/source/adapter.js.map +0 -1
  668. package/dist/source/adapterFactory.d.ts.map +0 -1
  669. package/dist/source/adapterFactory.js.map +0 -1
  670. package/dist/source/adapterProfile.d.ts.map +0 -1
  671. package/dist/source/adapterProfile.js.map +0 -1
  672. package/dist/source/conformance.d.ts.map +0 -1
  673. package/dist/source/conformance.js.map +0 -1
  674. package/dist/source/connector.d.ts.map +0 -1
  675. package/dist/source/connector.js.map +0 -1
  676. package/dist/source/connectorProtocol.d.ts.map +0 -1
  677. package/dist/source/connectorProtocol.js.map +0 -1
  678. package/dist/source/contract.d.ts.map +0 -1
  679. package/dist/source/contract.js.map +0 -1
  680. package/dist/source/drizzle.d.ts +0 -2
  681. package/dist/source/drizzle.d.ts.map +0 -1
  682. package/dist/source/drizzle.js +0 -2
  683. package/dist/source/drizzle.js.map +0 -1
  684. package/dist/source/factory.d.ts.map +0 -1
  685. package/dist/source/factory.js.map +0 -1
  686. package/dist/source/idempotency.d.ts.map +0 -1
  687. package/dist/source/idempotency.js.map +0 -1
  688. package/dist/source/kysely.d.ts +0 -3
  689. package/dist/source/kysely.d.ts.map +0 -1
  690. package/dist/source/kysely.js +0 -3
  691. package/dist/source/kysely.js.map +0 -1
  692. package/dist/source/migrations.d.ts.map +0 -1
  693. package/dist/source/migrations.js.map +0 -1
  694. package/dist/source/next.d.ts.map +0 -1
  695. package/dist/source/next.js.map +0 -1
  696. package/dist/source/pushQueue.d.ts.map +0 -1
  697. package/dist/source/pushQueue.js.map +0 -1
  698. package/dist/source/signing.d.ts.map +0 -1
  699. package/dist/source/signing.js.map +0 -1
  700. package/dist/transactionLayer.d.ts.map +0 -1
  701. package/dist/transactionLayer.js.map +0 -1
  702. package/dist/transactions/confirmation/commitEnvelope.d.ts.map +0 -1
  703. package/dist/transactions/confirmation/commitEnvelope.js.map +0 -1
  704. package/dist/transactions/confirmation/httpCommitEnvelope.d.ts.map +0 -1
  705. package/dist/transactions/confirmation/httpCommitEnvelope.js.map +0 -1
  706. package/dist/transactions/confirmation/idempotencyKey.d.ts.map +0 -1
  707. package/dist/transactions/confirmation/idempotencyKey.js.map +0 -1
  708. package/dist/transactions/confirmation/pendingWrite.d.ts.map +0 -1
  709. package/dist/transactions/confirmation/pendingWrite.js.map +0 -1
  710. package/dist/transport/commitFrames.d.ts.map +0 -1
  711. package/dist/transport/commitFrames.js.map +0 -1
  712. package/dist/transport/connectionManager.d.ts.map +0 -1
  713. package/dist/transport/connectionManager.js.map +0 -1
  714. package/dist/transport/credentialLifecycle.d.ts.map +0 -1
  715. package/dist/transport/credentialLifecycle.js.map +0 -1
  716. package/dist/transport/heartbeat.d.ts.map +0 -1
  717. package/dist/transport/heartbeat.js.map +0 -1
  718. package/dist/transport/httpClient.d.ts.map +0 -1
  719. package/dist/transport/httpClient.js.map +0 -1
  720. package/dist/transport/httpFeed.d.ts +0 -4
  721. package/dist/transport/httpFeed.d.ts.map +0 -1
  722. package/dist/transport/httpOptions.js.map +0 -1
  723. package/dist/transport/httpTransport.d.ts.map +0 -1
  724. package/dist/transport/httpTransport.js.map +0 -1
  725. package/dist/transport/networkProbe.d.ts.map +0 -1
  726. package/dist/transport/networkProbe.js.map +0 -1
  727. package/dist/transport/wsFrameHandlers.d.ts.map +0 -1
  728. package/dist/transport/wsFrameHandlers.js.map +0 -1
  729. package/dist/transport/wsTransport.d.ts.map +0 -1
  730. package/dist/transport/wsTransport.js.map +0 -1
  731. package/dist/wire/claimEvent.d.ts.map +0 -1
  732. package/dist/wire/claimEvent.js.map +0 -1
  733. package/dist/wire/claims.d.ts.map +0 -1
  734. package/dist/wire/claims.js.map +0 -1
  735. package/dist/wire/commit.d.ts +0 -2801
  736. package/dist/wire/commit.d.ts.map +0 -1
  737. package/dist/wire/commit.js.map +0 -1
  738. package/dist/wire/delta.d.ts.map +0 -1
  739. package/dist/wire/delta.js.map +0 -1
  740. package/dist/wire/deltaDelivery.d.ts.map +0 -1
  741. package/dist/wire/deltaDelivery.js.map +0 -1
  742. package/dist/wire/feedCursor.d.ts.map +0 -1
  743. package/dist/wire/feedCursor.js.map +0 -1
  744. package/dist/wire/feedEvent.d.ts.map +0 -1
  745. package/dist/wire/feedEvent.js.map +0 -1
  746. package/src/policy/types.ts +0 -300
  747. package/src/schema/coordination.ts +0 -161
  748. package/src/source/drizzle.ts +0 -1
  749. package/src/source/kysely.ts +0 -2
  750. /package/dist/{coordination → claims}/targetConflict.d.ts +0 -0
  751. /package/dist/{coordination → claims}/targetConflict.js +0 -0
  752. /package/dist/{resources → client/resources}/mutationOptions.js +0 -0
  753. /package/dist/{resources → client/resources}/where.d.ts +0 -0
  754. /package/dist/{transactions → commit}/confirmation/httpCommitEnvelope.d.ts +0 -0
  755. /package/dist/{transactions → commit}/confirmation/idempotencyKey.d.ts +0 -0
  756. /package/dist/{transactions → commit}/confirmation/idempotencyKey.js +0 -0
  757. /package/dist/source/{adapter.js → adapters/adapter.js} +0 -0
  758. /package/dist/source/{adapterFactory.d.ts → adapters/adapterFactory.d.ts} +0 -0
  759. /package/dist/source/{adapterProfile.d.ts → adapters/adapterProfile.d.ts} +0 -0
  760. /package/dist/source/{adapterProfile.js → adapters/adapterProfile.js} +0 -0
  761. /package/dist/source/{idempotency.d.ts → adapters/idempotency.d.ts} +0 -0
  762. /package/src/{wire/claimEvent.ts → claims/eventContract.ts} +0 -0
  763. /package/src/{coordination/claimHeartbeatLoop.ts → claims/heartbeat.ts} +0 -0
  764. /package/src/{coordination/claimMeta.ts → claims/meta.ts} +0 -0
  765. /package/src/{coordination → claims}/targetConflict.ts +0 -0
  766. /package/src/{transactions → commit}/confirmation/idempotencyKey.ts +0 -0
  767. /package/src/{wire/feedCursor.ts → observation/cursor.ts} +0 -0
  768. /package/src/{wire/deltaDelivery.ts → observation/deliveryContract.ts} +0 -0
  769. /package/src/source/{adapterProfile.ts → adapters/adapterProfile.ts} +0 -0
@@ -24,28 +24,40 @@ import type {
24
24
  DataSourceAdapter,
25
25
  MutationAdapter,
26
26
  Row,
27
- } from '../adapter.js';
28
- import { defineDatabaseAdapter } from '../adapterFactory.js';
29
- import { postgresAdapterProfile } from '../adapterProfile.js';
30
- import type { ChangeSet, EventsPage, Migration } from '../contract.js';
27
+ } from './adapter.js';
28
+ import { defineDatabaseAdapter } from './adapterFactory.js';
29
+ import { postgresAdapterProfile } from './adapterProfile.js';
30
+ import type { ChangeSet } from './contract.js';
31
+ import type { Migration } from './migration.js';
31
32
  import {
32
33
  changeSetSchema,
33
- outboxEventSchema,
34
34
  sourceCommitEchoMarkerSchema,
35
35
  sourceCommitEchoIntentSchema,
36
36
  type SourceCommitEchoIntent,
37
- } from '../contract.js';
37
+ } from './contract.js';
38
38
  import {
39
39
  assertSourceIdempotencyIntent,
40
40
  assertSourceIdempotencyRetention,
41
41
  sourceChangeIntentHash,
42
42
  SOURCE_IDEMPOTENCY_RETENTION,
43
- } from '../idempotency.js';
43
+ } from './idempotency.js';
44
44
  import {
45
45
  adapterTableMigrations,
46
46
  idempotencyLedgerMigrations,
47
- } from '../migrations.js';
47
+ } from './migrations.js';
48
48
  import { ABLO_POSTGRES_COMMIT_ECHO_PREFIX } from '../types.js';
49
+ import {
50
+ authorizeSourceChange,
51
+ authorizeSourceRead,
52
+ lockSourceSubjectCreates,
53
+ rethrowStrictCreateConflict,
54
+ sourceSyncGroups,
55
+ } from './subjectAuthorization.js';
56
+ import {
57
+ decodeDatabaseOutboxEvent,
58
+ ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE,
59
+ type EventsPage,
60
+ } from '../outbox/index.js';
49
61
  import {
50
62
  createKyselyMutationCore,
51
63
  kyselyOperationRowId,
@@ -259,6 +271,8 @@ export interface KyselyMutationAdapterOptions {
259
271
  * typenames equal its keys.
260
272
  */
261
273
  readonly markerModelFor?: (operationModel: string) => string;
274
+ /** Schema required to enforce row/subject authorization in this adapter. */
275
+ readonly schema?: Schema;
262
276
  }
263
277
 
264
278
  export function createKyselyMutationAdapter(
@@ -287,8 +301,9 @@ export function createKyselyMutationAdapter(
287
301
  : idempotencyLedgerMigrations();
288
302
  },
289
303
 
290
- read(request) {
291
- return core.read(request);
304
+ async read(request) {
305
+ const rows = await core.read(request);
306
+ return options.schema ? authorizeSourceRead(options.schema, request, rows) : rows;
292
307
  },
293
308
 
294
309
  async commit(change: ChangeSet): Promise<AdapterCommitResult> {
@@ -326,6 +341,25 @@ export function createKyselyMutationAdapter(
326
341
  return { rows: parseCachedRows(cachedRow.response) };
327
342
  }
328
343
 
344
+ if (options.schema) {
345
+ await lockSourceSubjectCreates(options.schema, request, async (_operation, key) => {
346
+ await transaction.executeQuery(rawQuery(
347
+ 'subject-create-lock',
348
+ 'SELECT pg_advisory_xact_lock(hashtextextended($1, 0))',
349
+ [key],
350
+ ));
351
+ });
352
+ await authorizeSourceChange(options.schema, request, async (operation) => {
353
+ if (!operation.id) return null;
354
+ const rows = await core.read(
355
+ { kind: 'load', model: operation.model, id: operation.id },
356
+ transaction,
357
+ { forUpdate: true },
358
+ );
359
+ return rows[0] ?? null;
360
+ });
361
+ }
362
+
329
363
  // Direct mode dispatches every operation before awaiting any of them, so
330
364
  // the driver pipelines them into one trip instead of paying a full
331
365
  // round trip per row. Postgres still executes them IN ORDER on the
@@ -339,9 +373,17 @@ export function createKyselyMutationAdapter(
339
373
  // returned row, so operation i+1's write cannot be dispatched before
340
374
  // operation i has answered.
341
375
  const rows: Row[] = [];
376
+ const applyStrict = async (operation: ChangeSet['operations'][number]): Promise<Row> => {
377
+ try {
378
+ return await core.applyOperation(transaction, operation);
379
+ } catch (error) {
380
+ if (operation.type === 'CREATE') rethrowStrictCreateConflict(error, operation);
381
+ throw error;
382
+ }
383
+ };
342
384
  if (mode === 'direct') {
343
385
  const dispatched = request.operations.map((operation) =>
344
- core.applyOperation(transaction, operation),
386
+ applyStrict(operation),
345
387
  );
346
388
  // Settle every dispatch before inspecting, so a later rejection is
347
389
  // never an unhandled rejection, then surface the FIRST failure in
@@ -354,7 +396,7 @@ export function createKyselyMutationAdapter(
354
396
  }
355
397
  } else {
356
398
  for (const [index, operation] of request.operations.entries()) {
357
- const row = await core.applyOperation(transaction, operation);
399
+ const row = await applyStrict(operation);
358
400
  rows.push(row);
359
401
 
360
402
  const entityId = String(row.id ?? kyselyOperationRowId(operation));
@@ -366,6 +408,10 @@ export function createKyselyMutationAdapter(
366
408
  entity_id: entityId,
367
409
  type: operation.type,
368
410
  data: operation.type === 'DELETE' ? null : JSON.stringify(row),
411
+ event_version: 2,
412
+ sync_groups: options.schema
413
+ ? sourceSyncGroups(options.schema, operation.model, row)
414
+ : [],
369
415
  correlation_id: request.correlationId,
370
416
  transaction_id: operation.transactionId ?? null,
371
417
  occurred_at: Date.now(),
@@ -402,12 +448,29 @@ export function kyselyDataSource<S extends SchemaRecord>(
402
448
  db,
403
449
  createKyselyMutationCore(db, schema),
404
450
  'endpoint',
451
+ { schema },
405
452
  );
406
453
 
407
454
  return defineDatabaseAdapter({
408
455
  ...mutation,
409
456
  capabilities: { ...mutation.capabilities, outboxEvents: true },
410
457
 
458
+ async acknowledgeEvents(acknowledgedThrough: string): Promise<void> {
459
+ await db.transaction().execute(async (transaction) => {
460
+ await transaction.executeQuery(
461
+ rawQuery(
462
+ 'ablo-outbox-prune-acknowledged',
463
+ `DELETE FROM ablo_outbox
464
+ WHERE cursor IN (
465
+ SELECT cursor FROM ablo_outbox
466
+ WHERE cursor <= $1 ORDER BY cursor ASC LIMIT $2
467
+ )`,
468
+ [acknowledgedThrough, ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE],
469
+ ),
470
+ );
471
+ });
472
+ },
473
+
411
474
  async events(cursor: string | null, limit: number): Promise<EventsPage> {
412
475
  const rows = await db
413
476
  .selectFrom('ablo_outbox')
@@ -416,21 +479,7 @@ export function kyselyDataSource<S extends SchemaRecord>(
416
479
  .orderBy('cursor', 'asc')
417
480
  .limit(limit)
418
481
  .execute();
419
- const events = rows.map((row) =>
420
- outboxEventSchema.parse({
421
- id: row.id,
422
- model: row.model,
423
- entityId: row.entity_id,
424
- type: row.type,
425
- data: typeof row.data === 'string' ? JSON.parse(row.data) : row.data ?? null,
426
- organizationId: row.organization_id ?? null,
427
- clientTxId: row.client_tx_id ?? null,
428
- correlationId: row.correlation_id ?? null,
429
- transactionId: row.transaction_id ?? null,
430
- occurredAt: row.occurred_at != null ? Number(row.occurred_at) : null,
431
- cursor: String(row.cursor),
432
- }),
433
- );
482
+ const events = rows.map(decodeDatabaseOutboxEvent);
434
483
  return { events, nextCursor: events.at(-1)?.cursor ?? null };
435
484
  },
436
485
  });
@@ -458,6 +507,7 @@ export function kyselyDirectMutation<S extends SchemaRecord>(
458
507
  markerModels.get(operationModel) ??
459
508
  markerModels.get(operationModel.toLowerCase()) ??
460
509
  operationModel,
510
+ schema,
461
511
  },
462
512
  );
463
513
  }
@@ -13,8 +13,9 @@ import type { Schema, SchemaRecord } from '../../schema/schema.js';
13
13
  import { toSchemaJSON } from '../../schema/serialize.js';
14
14
  import { camelToSnake, snakeToCamel } from '../../schema/ddl.js';
15
15
  import { tenancyColumn } from '../../schema/tenancy.js';
16
- import type { AdapterReadRequest, Row } from '../adapter.js';
17
- import type { Operation } from '../contract.js';
16
+ import type { AdapterReadRequest, Row } from './adapter.js';
17
+ import type { Operation } from './contract.js';
18
+ import { sourceSubjectRule, sourceSubjectValues } from './subjectAuthorization.js';
18
19
 
19
20
  /** The subset of a Kysely instance, or transaction handle, used by the core. */
20
21
  export interface KyselyLike {
@@ -48,6 +49,7 @@ export interface KyselySelectBuilder {
48
49
  where(column: string, operator: string, value: unknown): KyselySelectBuilder;
49
50
  orderBy(column: string, direction: 'asc' | 'desc'): KyselySelectBuilder;
50
51
  limit(limit: number): KyselySelectBuilder;
52
+ forUpdate(): KyselySelectBuilder;
51
53
  execute(): Promise<readonly Row[]>;
52
54
  }
53
55
 
@@ -140,7 +142,11 @@ function suppliedOperationRowId(operation: Operation): string | undefined {
140
142
 
141
143
  /** The transport-independent Kysely field/column mutation boundary. */
142
144
  export interface KyselyMutationCore {
143
- read(request: AdapterReadRequest): Promise<readonly Row[]>;
145
+ read(
146
+ request: AdapterReadRequest,
147
+ database?: KyselyLike,
148
+ options?: { readonly forUpdate?: boolean },
149
+ ): Promise<readonly Row[]>;
144
150
  applyOperation(transaction: KyselyLike, operation: Operation): Promise<Row>;
145
151
  }
146
152
 
@@ -185,22 +191,28 @@ export function createKyselyMutationCore<S extends SchemaRecord>(
185
191
  };
186
192
 
187
193
  return {
188
- async read(request): Promise<readonly Row[]> {
194
+ async read(request, database = db, options): Promise<readonly Row[]> {
189
195
  const columns = modelColumns(request.model);
190
196
  if (request.kind === 'load') {
191
- const rows = await db
197
+ let query = database
192
198
  .selectFrom(columns.table)
193
199
  .selectAll()
194
200
  .where(columnFor(columns, 'id'), '=', request.id)
195
- .limit(1)
196
- .execute();
201
+ .limit(1);
202
+ if (options?.forUpdate) query = query.forUpdate();
203
+ const rows = await query.execute();
197
204
  return rows.map((row) => toFields(columns, row));
198
205
  }
199
- const rows = await db
206
+ let query = database
200
207
  .selectFrom(columns.table)
201
- .selectAll()
202
- .limit(request.query?.limit ?? 1000)
203
- .execute();
208
+ .selectAll();
209
+ const rule = sourceSubjectRule(schema, request.model);
210
+ const subjects = sourceSubjectValues(rule, request.scope?.syncGroups);
211
+ if (subjects) {
212
+ if (subjects.length === 0) return [];
213
+ query = query.where(columnFor(columns, rule!.field), 'in', subjects);
214
+ }
215
+ const rows = await query.limit(request.query?.limit ?? 1000).execute();
204
216
  return rows.map((row) => toFields(columns, row));
205
217
  },
206
218
 
@@ -6,8 +6,8 @@
6
6
  * mapper is complete when it passes the same suite this one passes.
7
7
  *
8
8
  * It models the semantics minimally but faithfully: one row store per model, an
9
- * idempotency ledger keyed by scoped correlation, and an append-only outbox with a
10
- * monotonic cursor.
9
+ * idempotency ledger keyed by scoped correlation, and an acknowledgement-pruned
10
+ * outbox with a monotonic cursor.
11
11
  */
12
12
 
13
13
  import { AbloValidationError } from '../../errors.js';
@@ -16,14 +16,16 @@ import type {
16
16
  AdapterReadRequest,
17
17
  DataSourceAdapter,
18
18
  Row,
19
- } from '../adapter.js';
20
- import { defineDatabaseAdapter } from '../adapterFactory.js';
21
- import { memoryAdapterProfile } from '../adapterProfile.js';
22
- import type { ChangeSet, EventsPage, Migration, Operation, OutboxEvent } from '../contract.js';
19
+ } from './adapter.js';
20
+ import { defineDatabaseAdapter } from './adapterFactory.js';
21
+ import { memoryAdapterProfile } from './adapterProfile.js';
22
+ import type { ChangeSet, Operation } from './contract.js';
23
+ import type { Migration } from './migration.js';
24
+ import type { EventsPage, OutboxEvent } from '../outbox/index.js';
23
25
  import {
24
26
  assertSourceIdempotencyIntent,
25
27
  sourceChangeIntentHash,
26
- } from '../idempotency.js';
28
+ } from './idempotency.js';
27
29
 
28
30
  function rowId(op: Operation): string {
29
31
  const id = op.id ?? (op.input?.id as string | undefined);
@@ -41,8 +43,9 @@ export function memoryDataSource(): DataSourceAdapter {
41
43
  string,
42
44
  { readonly requestHash: string; readonly rows: Row[] }
43
45
  >();
44
- /** Append-only outbox; `cursor` is the 1-based index as a string. */
46
+ /** Acknowledgement-pruned outbox with a monotonic cursor. */
45
47
  const outbox: OutboxEvent[] = [];
48
+ let nextOutboxCursor = 1;
46
49
 
47
50
  const modelStore = (model: string): Map<string, Row> => {
48
51
  let m = store.get(model);
@@ -136,20 +139,34 @@ export function memoryDataSource(): DataSourceAdapter {
136
139
  rows.push(row);
137
140
  // Transactional outbox: one event per op, monotonic cursor.
138
141
  outbox.push({
142
+ version: 2,
139
143
  id: `${change.correlationId}:${index}`,
140
144
  model: op.model,
141
145
  entityId: String(row.id ?? rowId(op)),
142
146
  type: op.type,
143
147
  data: op.type === 'DELETE' ? null : row,
148
+ syncGroups: [],
144
149
  correlationId: change.correlationId,
145
150
  ...(op.transactionId ? { transactionId: op.transactionId } : {}),
146
- cursor: String(outbox.length + 1),
151
+ cursor: String(nextOutboxCursor++),
147
152
  });
148
153
  }
149
154
  idempotency.set(change.correlationId, { requestHash, rows });
150
155
  return { rows };
151
156
  },
152
157
 
158
+ async acknowledgeEvents(acknowledgedThrough: string): Promise<void> {
159
+ const after = Number(acknowledgedThrough);
160
+ let acknowledgedCount = 0;
161
+ while (
162
+ acknowledgedCount < outbox.length &&
163
+ Number(outbox[acknowledgedCount]?.cursor) <= after
164
+ ) {
165
+ acknowledgedCount += 1;
166
+ }
167
+ if (acknowledgedCount > 0) outbox.splice(0, acknowledgedCount);
168
+ },
169
+
153
170
  async events(cursor: string | null, limit: number): Promise<EventsPage> {
154
171
  const after = cursor ? Number(cursor) : 0;
155
172
  const page = outbox.filter((e) => Number(e.cursor) > after).slice(0, limit);
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+
3
+ /** One forward-only infrastructure migration shipped by an adapter. */
4
+ export const migrationSchema = z.object({
5
+ /** Stable name, used as the migration filename + applied-ledger key. */
6
+ name: z.string().min(1),
7
+ /** The forward SQL. */
8
+ up: z.string().min(1),
9
+ });
10
+
11
+ export type Migration = z.infer<typeof migrationSchema>;
@@ -10,7 +10,10 @@
10
10
  * it records changes in its own `sync_deltas` log instead.
11
11
  */
12
12
 
13
- import type { Migration } from './contract.js';
13
+ import type { Migration } from './migration.js';
14
+ import { endpointOutboxMigrations } from '../outbox/index.js';
15
+
16
+ export { endpointOutboxMigrations } from '../outbox/index.js';
14
17
 
15
18
  /**
16
19
  * Add a column to `ablo_idempotency` only when it is genuinely missing.
@@ -87,37 +90,7 @@ export function idempotencyLedgerMigrations(schema = 'public'): readonly Migrati
87
90
  ];
88
91
  }
89
92
 
90
- /** Endpoint-only transactional outbox and its correlation columns. */
91
- export function endpointOutboxMigrations(): readonly Migration[] {
92
- return [
93
- {
94
- name: 'ablo_outbox',
95
- up: `CREATE TABLE IF NOT EXISTS ablo_outbox (
96
- cursor BIGSERIAL PRIMARY KEY,
97
- id TEXT NOT NULL UNIQUE,
98
- model TEXT NOT NULL,
99
- entity_id TEXT NOT NULL,
100
- type TEXT NOT NULL,
101
- data JSONB,
102
- organization_id TEXT,
103
- client_tx_id TEXT,
104
- correlation_id TEXT,
105
- transaction_id TEXT,
106
- occurred_at BIGINT,
107
- created_at TIMESTAMPTZ NOT NULL DEFAULT now()
108
- );`,
109
- },
110
- {
111
- name: 'ablo_outbox_correlation',
112
- up: `ALTER TABLE ablo_outbox
113
- ADD COLUMN IF NOT EXISTS correlation_id TEXT;
114
- ALTER TABLE ablo_outbox
115
- ADD COLUMN IF NOT EXISTS transaction_id TEXT;`,
116
- },
117
- ];
118
- }
119
-
120
93
  /** Full endpoint adapter migrations (ledger + outbox). */
121
- export function adapterTableMigrations(): readonly Migration[] {
122
- return [...idempotencyLedgerMigrations(), ...endpointOutboxMigrations()];
94
+ export function adapterTableMigrations(schema = 'public'): readonly Migration[] {
95
+ return [...idempotencyLedgerMigrations(schema), ...endpointOutboxMigrations(schema)];
123
96
  }
@@ -20,24 +20,40 @@ import type {
20
20
  AdapterReadRequest,
21
21
  DataSourceAdapter,
22
22
  Row,
23
- } from '../adapter.js';
24
- import { defineDatabaseAdapter } from '../adapterFactory.js';
25
- import { postgresAdapterProfile } from '../adapterProfile.js';
26
- import type { ChangeSet, EventsPage, Migration, Operation, OutboxEvent } from '../contract.js';
27
- import { outboxEventSchema } from '../contract.js';
28
- import { adapterTableMigrations } from '../migrations.js';
23
+ } from './adapter.js';
24
+ import { defineDatabaseAdapter } from './adapterFactory.js';
25
+ import { postgresAdapterProfile } from './adapterProfile.js';
26
+ import type { ChangeSet, Operation } from './contract.js';
27
+ import type { Migration } from './migration.js';
28
+ import type { EventsPage, OutboxEvent } from '../outbox/index.js';
29
+ import { adapterTableMigrations } from './migrations.js';
29
30
  import {
30
31
  assertSourceIdempotencyIntent,
31
32
  assertSourceIdempotencyRetention,
32
33
  SOURCE_IDEMPOTENCY_RETENTION,
33
34
  sourceChangeIntentHash,
34
- } from '../idempotency.js';
35
+ } from './idempotency.js';
35
36
  import type { SchemaRecord, Schema } from '../../schema/schema.js';
37
+ import { toSchemaJSON } from '../../schema/serialize.js';
38
+ import { camelToSnake } from '../../schema/ddl.js';
36
39
  import {
37
40
  ABLO_POSTGRES_COMMIT_ECHO_PREFIX,
38
41
  type SourceListQuery,
39
42
  type SourceWhere,
40
43
  } from '../types.js';
44
+ import {
45
+ authorizeSourceChange,
46
+ authorizeSourceRead,
47
+ lockSourceSubjectCreates,
48
+ rethrowStrictCreateConflict,
49
+ sourceSyncGroups,
50
+ sourceSubjectRule,
51
+ sourceSubjectValues,
52
+ } from './subjectAuthorization.js';
53
+ import {
54
+ decodeDatabaseOutboxEvent,
55
+ ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE,
56
+ } from '../outbox/index.js';
41
57
 
42
58
  /** A Prisma model delegate — the subset of its methods the adapter calls. */
43
59
  export interface PrismaDelegate {
@@ -146,7 +162,19 @@ export function prismaDataSource<S extends SchemaRecord>(
146
162
  options: PrismaDataSourceOptions = {},
147
163
  ): DataSourceAdapter {
148
164
  const delegateName = options.delegateName ?? lowerFirst;
149
- void schema; // held for typed reads and model validation
165
+ const lockTargets = new Map<string, { table: string; subjectColumn: string }>();
166
+ for (const [key, definition] of Object.entries(toSchemaJSON(schema).models)) {
167
+ if (!definition.subject) continue;
168
+ const target = {
169
+ table: definition.tableName ?? key,
170
+ subjectColumn:
171
+ definition.fields[definition.subject.field]?.column ??
172
+ camelToSnake(definition.subject.field),
173
+ };
174
+ lockTargets.set(key.toLowerCase(), target);
175
+ if (definition.typename) lockTargets.set(definition.typename.toLowerCase(), target);
176
+ }
177
+ const quoted = (identifier: string): string => `"${identifier.replaceAll('"', '""')}"`;
150
178
 
151
179
  const applyOperation = async (tx: PrismaRaw, op: Operation): Promise<Row> => {
152
180
  if (op.where) {
@@ -188,9 +216,18 @@ export function prismaDataSource<S extends SchemaRecord>(
188
216
  const delegate = delegateFor(prisma, delegateName(req.model));
189
217
  if (req.kind === 'load') {
190
218
  const row = await delegate.findUnique({ where: { id: req.id } });
191
- return row ? [row] : [];
219
+ return authorizeSourceRead(schema, req, row ? [row] : []);
220
+ }
221
+ const args = findManyArgs(req.query);
222
+ const rule = sourceSubjectRule(schema, req.model);
223
+ const subjects = sourceSubjectValues(rule, req.scope?.syncGroups);
224
+ if (subjects?.length === 0) return [];
225
+ if (subjects) {
226
+ args.where = {
227
+ AND: [args.where ?? {}, { [rule!.field]: { in: subjects } }],
228
+ };
192
229
  }
193
- return delegate.findMany(findManyArgs(req.query));
230
+ return authorizeSourceRead(schema, req, await delegate.findMany(args));
194
231
  },
195
232
 
196
233
  async commit(change: ChangeSet): Promise<AdapterCommitResult> {
@@ -211,22 +248,52 @@ export function prismaDataSource<S extends SchemaRecord>(
211
248
  return { rows: cachedRow.response };
212
249
  }
213
250
 
251
+ await lockSourceSubjectCreates(schema, change, async (_operation, key) => {
252
+ await tx.$queryRawUnsafe(
253
+ `SELECT pg_advisory_xact_lock(hashtextextended($1, 0))`,
254
+ key,
255
+ );
256
+ });
257
+
258
+ await authorizeSourceChange(schema, change, async (operation) => {
259
+ if (!operation.id) return null;
260
+ const rule = sourceSubjectRule(schema, operation.model);
261
+ const target = lockTargets.get(operation.model.toLowerCase());
262
+ if (!rule || !target) return null;
263
+ const rows = await tx.$queryRawUnsafe<Row[]>(
264
+ `SELECT id, ${quoted(target.subjectColumn)} AS ${quoted(rule.field)}
265
+ FROM ${quoted(target.table)}
266
+ WHERE id = $1
267
+ LIMIT 1
268
+ FOR UPDATE`,
269
+ operation.id,
270
+ );
271
+ return rows[0] ?? null;
272
+ });
273
+
214
274
  const rows: Row[] = [];
215
275
  for (const [index, op] of change.operations.entries()) {
216
- const row = await applyOperation(tx, op);
276
+ let row: Row;
277
+ try {
278
+ row = await applyOperation(tx, op);
279
+ } catch (error) {
280
+ if (op.type === 'CREATE') rethrowStrictCreateConflict(error, op);
281
+ throw error;
282
+ }
217
283
  rows.push(row);
218
284
  const entityId = String(row.id ?? rowId(op));
219
285
  // Transactional outbox: one event per operation, written in this same transaction.
220
286
  await tx.$executeRawUnsafe(
221
287
  `INSERT INTO ablo_outbox (
222
- id, model, entity_id, type, data,
288
+ id, model, entity_id, type, data, event_version, sync_groups,
223
289
  correlation_id, transaction_id, occurred_at
224
- ) VALUES ($1, $2, $3, $4, $5::jsonb, $6, $7, $8)`,
290
+ ) VALUES ($1, $2, $3, $4, $5::jsonb, 2, $6::text[], $7, $8, $9)`,
225
291
  `${change.correlationId}:${index}`,
226
292
  op.model,
227
293
  entityId,
228
294
  op.type,
229
295
  JSON.stringify(op.type === 'DELETE' ? null : row),
296
+ sourceSyncGroups(schema, op.model, row),
230
297
  change.correlationId,
231
298
  op.transactionId ?? null,
232
299
  Date.now(),
@@ -257,34 +324,31 @@ export function prismaDataSource<S extends SchemaRecord>(
257
324
  });
258
325
  },
259
326
 
327
+ async acknowledgeEvents(acknowledgedThrough: string): Promise<void> {
328
+ await prisma.$transaction(async (tx) => {
329
+ await tx.$executeRawUnsafe(
330
+ `DELETE FROM ablo_outbox
331
+ WHERE cursor IN (
332
+ SELECT cursor FROM ablo_outbox
333
+ WHERE cursor <= $1 ORDER BY cursor ASC LIMIT $2
334
+ )`,
335
+ acknowledgedThrough,
336
+ ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE,
337
+ );
338
+ });
339
+ },
340
+
260
341
  async events(cursor: string | null, limit: number): Promise<EventsPage> {
261
- const after = cursor ? cursor : '0';
342
+ const after = cursor ?? '0';
262
343
  const rows = await prisma.$queryRawUnsafe<Record<string, unknown>[]>(
263
- `SELECT cursor, id, model, entity_id, type, data, organization_id,
344
+ `SELECT cursor, id, model, entity_id, type, data, event_version, sync_groups, organization_id,
264
345
  client_tx_id, correlation_id, transaction_id, occurred_at
265
346
  FROM ablo_outbox WHERE cursor > $1 ORDER BY cursor ASC LIMIT $2`,
266
347
  after,
267
348
  limit,
268
349
  );
269
- const events: OutboxEvent[] = rows.map((r) =>
270
- outboxEventSchema.parse({
271
- id: r.id,
272
- model: r.model,
273
- entityId: r.entity_id,
274
- type: r.type,
275
- data: r.data ?? null,
276
- organizationId: r.organization_id ?? null,
277
- clientTxId: r.client_tx_id ?? null,
278
- correlationId: r.correlation_id ?? null,
279
- transactionId: r.transaction_id ?? null,
280
- occurredAt: r.occurred_at != null ? Number(r.occurred_at) : null,
281
- cursor: String(r.cursor),
282
- }),
283
- );
284
- return {
285
- events,
286
- nextCursor: events.at(-1)?.cursor ?? null,
287
- };
350
+ const events: OutboxEvent[] = rows.map(decodeDatabaseOutboxEvent);
351
+ return { events, nextCursor: events.at(-1)?.cursor ?? null };
288
352
  },
289
353
  });
290
354
  }