@abloatai/ablo 0.35.0 → 0.37.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 (622) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +71 -1929
  3. package/NOTICE +2 -2
  4. package/README.md +23 -532
  5. package/assets/banner.png +0 -0
  6. package/dist/auth.d.ts +2 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +2 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/client.d.ts +3 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +3 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/coordination.d.ts +2 -0
  15. package/dist/coordination.d.ts.map +1 -0
  16. package/dist/coordination.js +2 -0
  17. package/dist/coordination.js.map +1 -0
  18. package/dist/index.d.ts +3 -112
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -161
  21. package/dist/index.js.map +1 -0
  22. package/dist/react.d.ts +4 -0
  23. package/dist/react.d.ts.map +1 -0
  24. package/dist/react.js +3 -0
  25. package/dist/react.js.map +1 -0
  26. package/dist/schema.d.ts +2 -0
  27. package/dist/schema.d.ts.map +1 -0
  28. package/dist/schema.js +2 -0
  29. package/dist/schema.js.map +1 -0
  30. package/dist/server.d.ts +2 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +2 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/source-conformance.d.ts +2 -0
  35. package/dist/source-conformance.d.ts.map +1 -0
  36. package/dist/source-conformance.js +2 -0
  37. package/dist/source-conformance.js.map +1 -0
  38. package/dist/source-drizzle.d.ts +2 -0
  39. package/dist/source-drizzle.d.ts.map +1 -0
  40. package/dist/source-drizzle.js +2 -0
  41. package/dist/source-drizzle.js.map +1 -0
  42. package/dist/source-kysely.d.ts +2 -0
  43. package/dist/source-kysely.d.ts.map +1 -0
  44. package/dist/source-kysely.js +2 -0
  45. package/dist/source-kysely.js.map +1 -0
  46. package/dist/source-next.d.ts +2 -0
  47. package/dist/source-next.d.ts.map +1 -0
  48. package/dist/source-next.js +2 -0
  49. package/dist/source-next.js.map +1 -0
  50. package/dist/source.d.ts +2 -0
  51. package/dist/source.d.ts.map +1 -0
  52. package/dist/source.js +2 -0
  53. package/dist/source.js.map +1 -0
  54. package/dist/wire.d.ts +2 -0
  55. package/dist/wire.d.ts.map +1 -0
  56. package/dist/wire.js +2 -0
  57. package/dist/wire.js.map +1 -0
  58. package/docs/agents.md +2 -2
  59. package/docs/api-keys.md +13 -12
  60. package/docs/api.md +15 -53
  61. package/docs/audit.md +4 -3
  62. package/docs/cli.md +11 -11
  63. package/docs/client-behavior.md +9 -9
  64. package/docs/concurrency-convention.md +28 -42
  65. package/docs/coordination.md +228 -86
  66. package/docs/data-sources.md +5 -5
  67. package/docs/debugging.md +34 -12
  68. package/docs/deployment.md +8 -8
  69. package/docs/examples/agent-human.md +4 -4
  70. package/docs/examples/ai-sdk-tool.md +1 -1
  71. package/docs/examples/existing-python-backend.md +15 -4
  72. package/docs/examples/nextjs.md +27 -6
  73. package/docs/examples/scoped-agent.md +3 -3
  74. package/docs/examples/server-agent.md +2 -2
  75. package/docs/groups.md +57 -3
  76. package/docs/guarantees.md +37 -10
  77. package/docs/how-it-works.md +32 -8
  78. package/docs/idempotency.md +6 -6
  79. package/docs/identity.md +24 -24
  80. package/docs/index.md +8 -8
  81. package/docs/integration-guide.md +38 -16
  82. package/docs/internal/README.md +18 -0
  83. package/docs/internal/agent-fleet-coordination-design.md +171 -0
  84. package/docs/internal/agent-orchestration.md +58 -0
  85. package/docs/internal/commit-identifiers.md +91 -0
  86. package/docs/internal/concurrency-open-decisions.md +37 -0
  87. package/docs/internal/data-source-reverse-channel.md +150 -0
  88. package/docs/internal/per-field-conflict-detection.md +165 -0
  89. package/docs/internal/postgres-replication.md +64 -0
  90. package/docs/internal/serializable-schema.md +119 -0
  91. package/docs/internal/structure.md +32 -0
  92. package/docs/mcp.md +9 -9
  93. package/docs/migration.md +37 -18
  94. package/docs/projects.md +1 -1
  95. package/docs/quickstart.md +2 -2
  96. package/docs/react.md +24 -13
  97. package/docs/schema-contract.md +3 -3
  98. package/docs/sessions.md +91 -37
  99. package/docs/webhooks.md +9 -9
  100. package/examples/README.md +2 -2
  101. package/examples/data-source/README.md +1 -1
  102. package/examples/data-source/ablo-driver.ts +1 -1
  103. package/examples/data-source/customer-server.ts +1 -1
  104. package/examples/data-source/run.ts +1 -1
  105. package/examples/data-source/schema.ts +1 -1
  106. package/examples/quickstart.ts +2 -2
  107. package/llms.txt +12 -12
  108. package/package.json +64 -174
  109. package/dist/BaseSyncedStore.d.ts +0 -823
  110. package/dist/BaseSyncedStore.js +0 -1955
  111. package/dist/Database.d.ts +0 -335
  112. package/dist/Database.js +0 -1500
  113. package/dist/InstanceCache.d.ts +0 -233
  114. package/dist/InstanceCache.js +0 -1164
  115. package/dist/LazyReferenceCollection.d.ts +0 -177
  116. package/dist/LazyReferenceCollection.js +0 -461
  117. package/dist/Model.d.ts +0 -444
  118. package/dist/Model.js +0 -909
  119. package/dist/ModelRegistry.d.ts +0 -221
  120. package/dist/ModelRegistry.js +0 -537
  121. package/dist/NetworkMonitor.d.ts +0 -26
  122. package/dist/NetworkMonitor.js +0 -77
  123. package/dist/RuntimeContext.d.ts +0 -52
  124. package/dist/RuntimeContext.js +0 -80
  125. package/dist/SyncClient.d.ts +0 -551
  126. package/dist/SyncClient.js +0 -2199
  127. package/dist/adapters/alwaysOnline.d.ts +0 -14
  128. package/dist/adapters/alwaysOnline.js +0 -17
  129. package/dist/adapters/inMemoryStorage.d.ts +0 -31
  130. package/dist/adapters/inMemoryStorage.js +0 -110
  131. package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
  132. package/dist/ai-sdk/coordinatedTool.js +0 -134
  133. package/dist/ai-sdk/coordinationContext.d.ts +0 -46
  134. package/dist/ai-sdk/coordinationContext.js +0 -106
  135. package/dist/ai-sdk/index.d.ts +0 -121
  136. package/dist/ai-sdk/index.js +0 -121
  137. package/dist/ai-sdk/wrap.d.ts +0 -65
  138. package/dist/ai-sdk/wrap.js +0 -39
  139. package/dist/auth/index.d.ts +0 -1
  140. package/dist/auth/index.js +0 -8
  141. package/dist/batching/index.d.ts +0 -55
  142. package/dist/batching/index.js +0 -147
  143. package/dist/cli.cjs +0 -288600
  144. package/dist/client/Ablo.d.ts +0 -231
  145. package/dist/client/Ablo.js +0 -149
  146. package/dist/client/abloClient.d.ts +0 -309
  147. package/dist/client/abloClient.js +0 -13
  148. package/dist/client/clientPrelude.d.ts +0 -52
  149. package/dist/client/clientPrelude.js +0 -60
  150. package/dist/client/consoleLogger.d.ts +0 -35
  151. package/dist/client/consoleLogger.js +0 -44
  152. package/dist/client/coreClient.d.ts +0 -60
  153. package/dist/client/coreClient.js +0 -118
  154. package/dist/client/createInternalComponents.d.ts +0 -46
  155. package/dist/client/createInternalComponents.js +0 -92
  156. package/dist/client/createModelProxy.d.ts +0 -228
  157. package/dist/client/createModelProxy.js +0 -818
  158. package/dist/client/humans.d.ts +0 -48
  159. package/dist/client/humans.js +0 -52
  160. package/dist/client/modelRegistration.d.ts +0 -10
  161. package/dist/client/modelRegistration.js +0 -312
  162. package/dist/client/options.d.ts +0 -461
  163. package/dist/client/options.js +0 -7
  164. package/dist/client/reactiveEngine.d.ts +0 -48
  165. package/dist/client/reactiveEngine.js +0 -910
  166. package/dist/client/resourceTypes.d.ts +0 -12
  167. package/dist/client/resourceTypes.js +0 -10
  168. package/dist/client/schemaConfig.d.ts +0 -44
  169. package/dist/client/schemaConfig.js +0 -185
  170. package/dist/client/validateAbloOptions.d.ts +0 -42
  171. package/dist/client/validateAbloOptions.js +0 -43
  172. package/dist/client/wsMutationExecutor.d.ts +0 -27
  173. package/dist/client/wsMutationExecutor.js +0 -72
  174. package/dist/context.d.ts +0 -29
  175. package/dist/context.js +0 -58
  176. package/dist/coordination/ClaimLog.d.ts +0 -26
  177. package/dist/coordination/ClaimLog.js +0 -32
  178. package/dist/coordination/index.d.ts +0 -1
  179. package/dist/coordination/index.js +0 -8
  180. package/dist/core/DatabaseManager.d.ts +0 -105
  181. package/dist/core/DatabaseManager.js +0 -387
  182. package/dist/core/QueryProcessor.d.ts +0 -75
  183. package/dist/core/QueryProcessor.js +0 -255
  184. package/dist/core/QueryView.d.ts +0 -79
  185. package/dist/core/QueryView.js +0 -218
  186. package/dist/core/StoreManager.d.ts +0 -112
  187. package/dist/core/StoreManager.js +0 -302
  188. package/dist/core/ViewRegistry.d.ts +0 -20
  189. package/dist/core/ViewRegistry.js +0 -55
  190. package/dist/core/index.d.ts +0 -33
  191. package/dist/core/index.js +0 -48
  192. package/dist/core/openIDBWithTimeout.d.ts +0 -65
  193. package/dist/core/openIDBWithTimeout.js +0 -153
  194. package/dist/core/queryUtils.d.ts +0 -45
  195. package/dist/core/queryUtils.js +0 -69
  196. package/dist/core/storeContract.d.ts +0 -145
  197. package/dist/core/storeContract.js +0 -12
  198. package/dist/docs/catalog.d.ts +0 -72
  199. package/dist/docs/catalog.js +0 -227
  200. package/dist/docs/index.d.ts +0 -10
  201. package/dist/docs/index.js +0 -10
  202. package/dist/environment.d.ts +0 -1
  203. package/dist/environment.js +0 -8
  204. package/dist/interfaces/index.d.ts +0 -311
  205. package/dist/interfaces/index.js +0 -9
  206. package/dist/keys/index.d.ts +0 -1
  207. package/dist/keys/index.js +0 -8
  208. package/dist/mutators/RecordingMutation.d.ts +0 -36
  209. package/dist/mutators/RecordingMutation.js +0 -182
  210. package/dist/mutators/Transaction.d.ts +0 -40
  211. package/dist/mutators/Transaction.js +0 -58
  212. package/dist/mutators/UndoManager.d.ts +0 -258
  213. package/dist/mutators/UndoManager.js +0 -658
  214. package/dist/mutators/defineMutators.d.ts +0 -60
  215. package/dist/mutators/defineMutators.js +0 -18
  216. package/dist/mutators/inverseOp.d.ts +0 -126
  217. package/dist/mutators/inverseOp.js +0 -71
  218. package/dist/mutators/mutateActions.d.ts +0 -45
  219. package/dist/mutators/mutateActions.js +0 -105
  220. package/dist/mutators/readerActions.d.ts +0 -33
  221. package/dist/mutators/readerActions.js +0 -57
  222. package/dist/mutators/undoApply.d.ts +0 -51
  223. package/dist/mutators/undoApply.js +0 -117
  224. package/dist/policy/index.d.ts +0 -21
  225. package/dist/policy/index.js +0 -20
  226. package/dist/query/client.d.ts +0 -61
  227. package/dist/query/client.js +0 -137
  228. package/dist/query/types.d.ts +0 -85
  229. package/dist/query/types.js +0 -16
  230. package/dist/react/AbloProvider.d.ts +0 -230
  231. package/dist/react/AbloProvider.js +0 -455
  232. package/dist/react/ClientSideSuspense.d.ts +0 -36
  233. package/dist/react/ClientSideSuspense.js +0 -17
  234. package/dist/react/DefaultFallback.d.ts +0 -24
  235. package/dist/react/DefaultFallback.js +0 -43
  236. package/dist/react/context.d.ts +0 -55
  237. package/dist/react/context.js +0 -29
  238. package/dist/react/index.d.ts +0 -61
  239. package/dist/react/index.js +0 -66
  240. package/dist/react/internalContext.d.ts +0 -33
  241. package/dist/react/internalContext.js +0 -3
  242. package/dist/react/useAblo.d.ts +0 -75
  243. package/dist/react/useAblo.js +0 -102
  244. package/dist/react/useCurrentUserId.d.ts +0 -22
  245. package/dist/react/useCurrentUserId.js +0 -34
  246. package/dist/react/useErrorListener.d.ts +0 -20
  247. package/dist/react/useErrorListener.js +0 -38
  248. package/dist/react/useMutationFailureListener.d.ts +0 -26
  249. package/dist/react/useMutationFailureListener.js +0 -38
  250. package/dist/react/useMutators.d.ts +0 -56
  251. package/dist/react/useMutators.js +0 -84
  252. package/dist/react/useReactive.d.ts +0 -35
  253. package/dist/react/useReactive.js +0 -123
  254. package/dist/react/useSyncStatus.d.ts +0 -59
  255. package/dist/react/useSyncStatus.js +0 -76
  256. package/dist/react/useUndoScope.d.ts +0 -34
  257. package/dist/react/useUndoScope.js +0 -81
  258. package/dist/schema/coordination.d.ts +0 -112
  259. package/dist/schema/coordination.js +0 -129
  260. package/dist/schema/ddl.d.ts +0 -97
  261. package/dist/schema/ddl.js +0 -491
  262. package/dist/schema/ddlLock.d.ts +0 -35
  263. package/dist/schema/ddlLock.js +0 -46
  264. package/dist/schema/diff.d.ts +0 -225
  265. package/dist/schema/diff.js +0 -289
  266. package/dist/schema/generate.d.ts +0 -19
  267. package/dist/schema/generate.js +0 -86
  268. package/dist/schema/index.d.ts +0 -41
  269. package/dist/schema/index.js +0 -76
  270. package/dist/schema/queries.d.ts +0 -201
  271. package/dist/schema/queries.js +0 -144
  272. package/dist/schema/select.d.ts +0 -40
  273. package/dist/schema/select.js +0 -87
  274. package/dist/schema/serialize.d.ts +0 -115
  275. package/dist/schema/serialize.js +0 -262
  276. package/dist/schema/sugar.d.ts +0 -109
  277. package/dist/schema/sugar.js +0 -83
  278. package/dist/schema/syncDeltaRow.d.ts +0 -6
  279. package/dist/schema/syncDeltaRow.js +0 -6
  280. package/dist/server/adapter.d.ts +0 -173
  281. package/dist/server/adapter.js +0 -18
  282. package/dist/server/commit.d.ts +0 -107
  283. package/dist/server/commit.js +0 -1
  284. package/dist/server/index.d.ts +0 -14
  285. package/dist/server/index.js +0 -2
  286. package/dist/server/readConfig.d.ts +0 -80
  287. package/dist/server/readConfig.js +0 -8
  288. package/dist/server/storageMode.d.ts +0 -23
  289. package/dist/server/storageMode.js +0 -17
  290. package/dist/source/adapter.d.ts +0 -81
  291. package/dist/source/adapter.js +0 -22
  292. package/dist/source/adapters/drizzle.d.ts +0 -48
  293. package/dist/source/adapters/drizzle.js +0 -219
  294. package/dist/source/adapters/kysely.d.ts +0 -42
  295. package/dist/source/adapters/kysely.js +0 -205
  296. package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
  297. package/dist/source/adapters/kyselyMutationCore.js +0 -125
  298. package/dist/source/adapters/memory.d.ts +0 -13
  299. package/dist/source/adapters/memory.js +0 -130
  300. package/dist/source/adapters/prisma.d.ts +0 -63
  301. package/dist/source/adapters/prisma.js +0 -202
  302. package/dist/source/conformance.d.ts +0 -37
  303. package/dist/source/conformance.js +0 -215
  304. package/dist/source/connector.d.ts +0 -95
  305. package/dist/source/connector.js +0 -266
  306. package/dist/source/connectorProtocol.d.ts +0 -154
  307. package/dist/source/connectorProtocol.js +0 -163
  308. package/dist/source/contract.d.ts +0 -195
  309. package/dist/source/contract.js +0 -164
  310. package/dist/source/factory.d.ts +0 -92
  311. package/dist/source/factory.js +0 -286
  312. package/dist/source/footprint.d.ts +0 -111
  313. package/dist/source/footprint.js +0 -0
  314. package/dist/source/idempotency.d.ts +0 -61
  315. package/dist/source/idempotency.js +0 -144
  316. package/dist/source/index.d.ts +0 -23
  317. package/dist/source/index.js +0 -30
  318. package/dist/source/migrations.d.ts +0 -21
  319. package/dist/source/migrations.js +0 -103
  320. package/dist/source/next.d.ts +0 -32
  321. package/dist/source/next.js +0 -25
  322. package/dist/source/pushQueue.d.ts +0 -134
  323. package/dist/source/pushQueue.js +0 -256
  324. package/dist/source/signing.d.ts +0 -92
  325. package/dist/source/signing.js +0 -162
  326. package/dist/source/types.d.ts +0 -401
  327. package/dist/source/types.js +0 -59
  328. package/dist/stores/ObjectStore.d.ts +0 -115
  329. package/dist/stores/ObjectStore.js +0 -393
  330. package/dist/stores/ObjectStoreContract.d.ts +0 -38
  331. package/dist/stores/ObjectStoreContract.js +0 -1
  332. package/dist/stores/SyncActionStore.d.ts +0 -97
  333. package/dist/stores/SyncActionStore.js +0 -504
  334. package/dist/stores/syncAction.d.ts +0 -26
  335. package/dist/stores/syncAction.js +0 -16
  336. package/dist/surface.d.ts +0 -36
  337. package/dist/surface.js +0 -75
  338. package/dist/sync/BootstrapFetcher.d.ts +0 -280
  339. package/dist/sync/BootstrapFetcher.js +0 -962
  340. package/dist/sync/ConnectionManager.d.ts +0 -8
  341. package/dist/sync/ConnectionManager.js +0 -8
  342. package/dist/sync/OnDemandLoader.d.ts +0 -228
  343. package/dist/sync/OnDemandLoader.js +0 -742
  344. package/dist/sync/SubscriptionManager.d.ts +0 -159
  345. package/dist/sync/SubscriptionManager.js +0 -243
  346. package/dist/sync/SyncWebSocket.d.ts +0 -173
  347. package/dist/sync/SyncWebSocket.js +0 -438
  348. package/dist/sync/awaitClaimGrant.d.ts +0 -6
  349. package/dist/sync/awaitClaimGrant.js +0 -6
  350. package/dist/sync/bootstrapApply.d.ts +0 -70
  351. package/dist/sync/bootstrapApply.js +0 -73
  352. package/dist/sync/commitFrames.d.ts +0 -8
  353. package/dist/sync/commitFrames.js +0 -8
  354. package/dist/sync/contextPorts.d.ts +0 -18
  355. package/dist/sync/contextPorts.js +0 -31
  356. package/dist/sync/createClaimStream.d.ts +0 -7
  357. package/dist/sync/createClaimStream.js +0 -7
  358. package/dist/sync/createPresenceStream.d.ts +0 -69
  359. package/dist/sync/createPresenceStream.js +0 -200
  360. package/dist/sync/createSnapshot.d.ts +0 -29
  361. package/dist/sync/createSnapshot.js +0 -118
  362. package/dist/sync/credentialLifecycle.d.ts +0 -7
  363. package/dist/sync/credentialLifecycle.js +0 -7
  364. package/dist/sync/deltaPipeline.d.ts +0 -113
  365. package/dist/sync/deltaPipeline.js +0 -261
  366. package/dist/sync/groupChange.d.ts +0 -113
  367. package/dist/sync/groupChange.js +0 -242
  368. package/dist/sync/participants.d.ts +0 -115
  369. package/dist/sync/participants.js +0 -344
  370. package/dist/sync/persistedPrefix.d.ts +0 -12
  371. package/dist/sync/persistedPrefix.js +0 -22
  372. package/dist/sync/schemaDrift.d.ts +0 -55
  373. package/dist/sync/schemaDrift.js +0 -53
  374. package/dist/sync/schemas.d.ts +0 -70
  375. package/dist/sync/schemas.js +0 -94
  376. package/dist/sync/syncCursor.d.ts +0 -40
  377. package/dist/sync/syncCursor.js +0 -55
  378. package/dist/sync/syncPlan.d.ts +0 -54
  379. package/dist/sync/syncPlan.js +0 -50
  380. package/dist/sync/wsFrameHandlers.d.ts +0 -8
  381. package/dist/sync/wsFrameHandlers.js +0 -8
  382. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  383. package/dist/testing/fixtures/bootstrap.js +0 -59
  384. package/dist/testing/fixtures/deltas.d.ts +0 -83
  385. package/dist/testing/fixtures/deltas.js +0 -136
  386. package/dist/testing/fixtures/httpResponses.d.ts +0 -70
  387. package/dist/testing/fixtures/httpResponses.js +0 -90
  388. package/dist/testing/fixtures/models.d.ts +0 -83
  389. package/dist/testing/fixtures/models.js +0 -272
  390. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  391. package/dist/testing/helpers/reactWrapper.js +0 -67
  392. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  393. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  394. package/dist/testing/helpers/wait.d.ts +0 -30
  395. package/dist/testing/helpers/wait.js +0 -49
  396. package/dist/testing/index.d.ts +0 -23
  397. package/dist/testing/index.js +0 -33
  398. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  399. package/dist/testing/mocks/FakeDatabase.js +0 -10
  400. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  401. package/dist/testing/mocks/MockMutationExecutor.js +0 -186
  402. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  403. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  404. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  405. package/dist/testing/mocks/MockSyncContext.js +0 -72
  406. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  407. package/dist/testing/mocks/MockSyncStore.js +0 -171
  408. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  409. package/dist/testing/mocks/MockWebSocket.js +0 -118
  410. package/dist/transaction/ablo.d.ts +0 -88
  411. package/dist/transaction/ablo.js +0 -33
  412. package/dist/transaction/auth/apiKey.d.ts +0 -152
  413. package/dist/transaction/auth/apiKey.js +0 -419
  414. package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
  415. package/dist/transaction/auth/bootstrapScope.js +0 -1
  416. package/dist/transaction/auth/capability.d.ts +0 -177
  417. package/dist/transaction/auth/capability.js +0 -199
  418. package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
  419. package/dist/transaction/auth/credentialEndpoint.js +0 -86
  420. package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
  421. package/dist/transaction/auth/credentialPolicy.js +0 -125
  422. package/dist/transaction/auth/credentialSource.d.ts +0 -30
  423. package/dist/transaction/auth/credentialSource.js +0 -55
  424. package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
  425. package/dist/transaction/auth/hostedEndpoints.js +0 -21
  426. package/dist/transaction/auth/identity.d.ts +0 -55
  427. package/dist/transaction/auth/identity.js +0 -210
  428. package/dist/transaction/auth/index.d.ts +0 -162
  429. package/dist/transaction/auth/index.js +0 -304
  430. package/dist/transaction/auth/schemas.d.ts +0 -59
  431. package/dist/transaction/auth/schemas.js +0 -85
  432. package/dist/transaction/auth/sessionMint.d.ts +0 -28
  433. package/dist/transaction/auth/sessionMint.js +0 -85
  434. package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
  435. package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
  436. package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
  437. package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
  438. package/dist/transaction/coordination/claimMeta.d.ts +0 -49
  439. package/dist/transaction/coordination/claimMeta.js +0 -52
  440. package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
  441. package/dist/transaction/coordination/createClaimStream.js +0 -475
  442. package/dist/transaction/coordination/events.d.ts +0 -74
  443. package/dist/transaction/coordination/events.js +0 -7
  444. package/dist/transaction/coordination/index.d.ts +0 -19
  445. package/dist/transaction/coordination/index.js +0 -44
  446. package/dist/transaction/coordination/locator.d.ts +0 -83
  447. package/dist/transaction/coordination/locator.js +0 -82
  448. package/dist/transaction/coordination/schema.d.ts +0 -1473
  449. package/dist/transaction/coordination/schema.js +0 -1013
  450. package/dist/transaction/coordination/targetConflict.d.ts +0 -2
  451. package/dist/transaction/coordination/targetConflict.js +0 -103
  452. package/dist/transaction/coordination/trace.d.ts +0 -78
  453. package/dist/transaction/coordination/trace.js +0 -138
  454. package/dist/transaction/durableWrites.d.ts +0 -62
  455. package/dist/transaction/durableWrites.js +0 -71
  456. package/dist/transaction/environment.d.ts +0 -105
  457. package/dist/transaction/environment.js +0 -108
  458. package/dist/transaction/errorCodes.d.ts +0 -403
  459. package/dist/transaction/errorCodes.js +0 -480
  460. package/dist/transaction/errors.d.ts +0 -428
  461. package/dist/transaction/errors.js +0 -686
  462. package/dist/transaction/index.d.ts +0 -20
  463. package/dist/transaction/index.js +0 -20
  464. package/dist/transaction/keys/index.d.ts +0 -87
  465. package/dist/transaction/keys/index.js +0 -207
  466. package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
  467. package/dist/transaction/log/syncDeltaRow.js +0 -95
  468. package/dist/transaction/logPosition.d.ts +0 -97
  469. package/dist/transaction/logPosition.js +0 -125
  470. package/dist/transaction/logger.d.ts +0 -16
  471. package/dist/transaction/logger.js +0 -7
  472. package/dist/transaction/observability.d.ts +0 -53
  473. package/dist/transaction/observability.js +0 -19
  474. package/dist/transaction/persistence.d.ts +0 -12
  475. package/dist/transaction/persistence.js +0 -11
  476. package/dist/transaction/plugin.d.ts +0 -192
  477. package/dist/transaction/plugin.js +0 -87
  478. package/dist/transaction/policy/types.d.ts +0 -217
  479. package/dist/transaction/policy/types.js +0 -126
  480. package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
  481. package/dist/transaction/resources/functionalUpdate.js +0 -87
  482. package/dist/transaction/resources/httpResources.d.ts +0 -266
  483. package/dist/transaction/resources/httpResources.js +0 -7
  484. package/dist/transaction/resources/modelOperations.d.ts +0 -319
  485. package/dist/transaction/resources/modelOperations.js +0 -12
  486. package/dist/transaction/resources/mutationOptions.d.ts +0 -66
  487. package/dist/transaction/resources/mutationOptions.js +0 -9
  488. package/dist/transaction/resources/where.d.ts +0 -85
  489. package/dist/transaction/resources/where.js +0 -70
  490. package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
  491. package/dist/transaction/resources/writeOptionsSchema.js +0 -73
  492. package/dist/transaction/schema/field.d.ts +0 -126
  493. package/dist/transaction/schema/field.js +0 -265
  494. package/dist/transaction/schema/loadStrategy.d.ts +0 -45
  495. package/dist/transaction/schema/loadStrategy.js +0 -46
  496. package/dist/transaction/schema/model.d.ts +0 -379
  497. package/dist/transaction/schema/model.js +0 -123
  498. package/dist/transaction/schema/openapi.d.ts +0 -57
  499. package/dist/transaction/schema/openapi.js +0 -340
  500. package/dist/transaction/schema/relation.d.ts +0 -199
  501. package/dist/transaction/schema/relation.js +0 -104
  502. package/dist/transaction/schema/residency.d.ts +0 -29
  503. package/dist/transaction/schema/residency.js +0 -25
  504. package/dist/transaction/schema/roles.d.ts +0 -249
  505. package/dist/transaction/schema/roles.js +0 -230
  506. package/dist/transaction/schema/schema.d.ts +0 -324
  507. package/dist/transaction/schema/schema.js +0 -305
  508. package/dist/transaction/schema/tenancy.d.ts +0 -139
  509. package/dist/transaction/schema/tenancy.js +0 -190
  510. package/dist/transaction/transactionLayer.d.ts +0 -82
  511. package/dist/transaction/transactionLayer.js +0 -24
  512. package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
  513. package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
  514. package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
  515. package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
  516. package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
  517. package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
  518. package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
  519. package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
  520. package/dist/transaction/transport/commitFrames.d.ts +0 -90
  521. package/dist/transaction/transport/commitFrames.js +0 -134
  522. package/dist/transaction/transport/connectionManager.d.ts +0 -215
  523. package/dist/transaction/transport/connectionManager.js +0 -673
  524. package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
  525. package/dist/transaction/transport/credentialLifecycle.js +0 -324
  526. package/dist/transaction/transport/heartbeat.d.ts +0 -65
  527. package/dist/transaction/transport/heartbeat.js +0 -93
  528. package/dist/transaction/transport/httpClient.d.ts +0 -123
  529. package/dist/transaction/transport/httpClient.js +0 -145
  530. package/dist/transaction/transport/httpOptions.d.ts +0 -33
  531. package/dist/transaction/transport/httpOptions.js +0 -12
  532. package/dist/transaction/transport/httpTransport.d.ts +0 -8
  533. package/dist/transaction/transport/httpTransport.js +0 -1276
  534. package/dist/transaction/transport/networkProbe.d.ts +0 -84
  535. package/dist/transaction/transport/networkProbe.js +0 -207
  536. package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
  537. package/dist/transaction/transport/wsFrameHandlers.js +0 -429
  538. package/dist/transaction/transport/wsTransport.d.ts +0 -576
  539. package/dist/transaction/transport/wsTransport.js +0 -1017
  540. package/dist/transaction/types/assertExact.d.ts +0 -17
  541. package/dist/transaction/types/assertExact.js +0 -1
  542. package/dist/transaction/types/global.d.ts +0 -107
  543. package/dist/transaction/types/global.js +0 -40
  544. package/dist/transaction/types/index.d.ts +0 -205
  545. package/dist/transaction/types/index.js +0 -56
  546. package/dist/transaction/types/modelData.d.ts +0 -10
  547. package/dist/transaction/types/modelData.js +0 -9
  548. package/dist/transaction/types/participant.d.ts +0 -20
  549. package/dist/transaction/types/participant.js +0 -10
  550. package/dist/transaction/types/streams.d.ts +0 -540
  551. package/dist/transaction/types/streams.js +0 -11
  552. package/dist/transaction/utils/asyncIterator.d.ts +0 -34
  553. package/dist/transaction/utils/asyncIterator.js +0 -135
  554. package/dist/transaction/utils/duration.d.ts +0 -25
  555. package/dist/transaction/utils/duration.js +0 -45
  556. package/dist/transaction/utils/json.d.ts +0 -57
  557. package/dist/transaction/utils/json.js +0 -276
  558. package/dist/transaction/wire/accountResponses.d.ts +0 -351
  559. package/dist/transaction/wire/accountResponses.js +0 -255
  560. package/dist/transaction/wire/auth.d.ts +0 -49
  561. package/dist/transaction/wire/auth.js +0 -57
  562. package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
  563. package/dist/transaction/wire/bootstrapReason.js +0 -8
  564. package/dist/transaction/wire/claimEvent.d.ts +0 -76
  565. package/dist/transaction/wire/claimEvent.js +0 -73
  566. package/dist/transaction/wire/claims.d.ts +0 -463
  567. package/dist/transaction/wire/claims.js +0 -229
  568. package/dist/transaction/wire/commit.d.ts +0 -603
  569. package/dist/transaction/wire/commit.js +0 -321
  570. package/dist/transaction/wire/delta.d.ts +0 -250
  571. package/dist/transaction/wire/delta.js +0 -147
  572. package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
  573. package/dist/transaction/wire/errorEnvelope.js +0 -123
  574. package/dist/transaction/wire/feedCursor.d.ts +0 -60
  575. package/dist/transaction/wire/feedCursor.js +0 -82
  576. package/dist/transaction/wire/feedEvent.d.ts +0 -177
  577. package/dist/transaction/wire/feedEvent.js +0 -39
  578. package/dist/transaction/wire/frames.d.ts +0 -194
  579. package/dist/transaction/wire/frames.js +0 -50
  580. package/dist/transaction/wire/inboundFrames.d.ts +0 -552
  581. package/dist/transaction/wire/inboundFrames.js +0 -116
  582. package/dist/transaction/wire/index.d.ts +0 -50
  583. package/dist/transaction/wire/index.js +0 -74
  584. package/dist/transaction/wire/listEnvelope.d.ts +0 -37
  585. package/dist/transaction/wire/listEnvelope.js +0 -42
  586. package/dist/transaction/wire/modelResponses.d.ts +0 -85
  587. package/dist/transaction/wire/modelResponses.js +0 -43
  588. package/dist/transaction/wire/protocol.d.ts +0 -38
  589. package/dist/transaction/wire/protocol.js +0 -38
  590. package/dist/transaction/wire/protocolVersion.d.ts +0 -73
  591. package/dist/transaction/wire/protocolVersion.js +0 -83
  592. package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
  593. package/dist/transactions/mutations/MutationQueue.js +0 -2797
  594. package/dist/transactions/mutations/MutationStore.d.ts +0 -20
  595. package/dist/transactions/mutations/MutationStore.js +0 -53
  596. package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
  597. package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
  598. package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
  599. package/dist/transactions/mutations/coalesceRules.js +0 -140
  600. package/dist/transactions/mutations/commitLatency.d.ts +0 -52
  601. package/dist/transactions/mutations/commitLatency.js +0 -130
  602. package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
  603. package/dist/transactions/mutations/commitOutboxStore.js +0 -26
  604. package/dist/transactions/mutations/commitPayload.d.ts +0 -164
  605. package/dist/transactions/mutations/commitPayload.js +0 -152
  606. package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
  607. package/dist/transactions/mutations/deltaConfirmation.js +0 -233
  608. package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
  609. package/dist/transactions/mutations/durableWriteStore.js +0 -12
  610. package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
  611. package/dist/transactions/mutations/optimisticApply.js +0 -65
  612. package/dist/transactions/mutations/replayValidation.d.ts +0 -186
  613. package/dist/transactions/mutations/replayValidation.js +0 -163
  614. package/dist/utils/mobxSetup.d.ts +0 -53
  615. package/dist/utils/mobxSetup.js +0 -330
  616. package/dist/webhooks/events.d.ts +0 -43
  617. package/dist/webhooks/events.js +0 -42
  618. package/dist/webhooks/index.d.ts +0 -8
  619. package/dist/webhooks/index.js +0 -8
  620. package/dist/wire/index.d.ts +0 -1
  621. package/dist/wire/index.js +0 -8
  622. package/docs/interaction-model.md +0 -99
@@ -1,107 +0,0 @@
1
- /**
2
- * The commit contract types for the sync engine's server surface.
3
- *
4
- * {@link CommitContext} is the attribution envelope stamped onto every delta a
5
- * commit produces; {@link CommitResult} is the receipt returned when the commit
6
- * finishes. Both are plain data descriptors — no database driver, no SQL, no
7
- * functions — so they belong to this package's public contract, which your commit
8
- * implementation reads and writes. They feed the `ChangeSet` and `DataAdapter`
9
- * contracts defined alongside them.
10
- *
11
- * The attribution fields reuse the shared {@link ParticipantKind},
12
- * {@link ConfirmationState}, and {@link ParticipantRef} types, so the shape at
13
- * commit time and the shape of a stored or broadcast delta share one definition
14
- * rather than being kept in step by hand.
15
- */
16
- import type { ParticipantKind, ConfirmationState } from '../schema/syncDeltaRow.js';
17
- import type { ParticipantRef } from '../transaction/wire/delta.js';
18
- import type { CommitExecutionResultInput } from '../transaction/wire/commit.js';
19
- import type { Environment } from '../transaction/environment.js';
20
- import type { ReadDependency, TrackDependency } from '../transaction/coordination/schema.js';
21
- export interface CommitContext {
22
- participantId: string;
23
- /**
24
- * The kind of participant making the commit. Required, so that every delta carries
25
- * structured attribution rather than a string-prefix convention.
26
- */
27
- participantKind: ParticipantKind;
28
- organizationId: string;
29
- /**
30
- * Project scope used to route source-mode storage. When omitted, the commit
31
- * targets the organization's default project.
32
- */
33
- projectId?: string;
34
- /** Exact sandbox plane derived from the authenticated key, when present. */
35
- sandboxId?: string;
36
- /** Optional external account scope forwarded to storage resolvers. */
37
- accountScope?: string;
38
- /**
39
- * The environment this commit runs in. Source-mode adapters forward it to the
40
- * customer's handlers so that sandbox and production traffic can reach distinct
41
- * customer-owned stores.
42
- */
43
- environment?: Environment;
44
- /**
45
- * The sync groups this participant subscribes to, taken from the connection
46
- * upgrade or the capability token. Each is appended to every delta's `sync_groups`
47
- * so that writes fan out to subscribers of entity-level groups (such as
48
- * `report:abc`), not only the default `org:X` and `user:Y` groups. When omitted, the
49
- * commit fans out to just the organization and user groups.
50
- */
51
- syncGroups?: readonly string[];
52
- /**
53
- * When true, the commit does not add `org:<organizationId>` to a delta's sync
54
- * groups. Set this for sandbox writes, so that live organization subscribers do
55
- * not receive test-environment changes.
56
- */
57
- omitOrgSyncGroup?: boolean;
58
- /**
59
- * The participant on whose authority the actor acted. For a direct human commit
60
- * this equals the actor; for an agent commit it is the human at the root of the
61
- * capability's delegation chain. Null for `system` principals.
62
- */
63
- onBehalfOf?: ParticipantRef | null;
64
- /**
65
- * The id of the scoped credential that authorized the commit. Non-null for agent
66
- * and system commits when that credential is known; null for direct human commits.
67
- */
68
- capabilityId?: string | null;
69
- /**
70
- * The id of the human user at the root of the delegated-authority chain. Stored
71
- * directly on `sync_deltas` so that audit triggers appending the hash chain never
72
- * need to join mutable credential tables.
73
- */
74
- delegationChainRootUserId?: string | null;
75
- /**
76
- * The id of the API key row when the caller authenticated with an API key. Used by
77
- * the idempotency cache and for usage attribution. Null for session and capability
78
- * callers.
79
- */
80
- apiKeyId?: string | null;
81
- /**
82
- * Whether a human explicitly approved the change. Defaults to `auto` when the
83
- * caller does not specify an approval state.
84
- */
85
- confirmationState?: ConfirmationState;
86
- /**
87
- * The premise for the whole batch. The committer declares the rows or groups
88
- * it read to form this batch; the engine checks that none of them changed since
89
- * each entry's `readAt` timestamp and applies that entry's `onStale` disposition
90
- * across the batch. This differs from the per-operation `readAt` guard, which
91
- * validates only the rows being written. Omit it to check the write targets alone.
92
- */
93
- reads?: ReadDependency[] | null;
94
- /**
95
- * Durable premises to persist for this commit's participant. Each entry is
96
- * kept in `track_dependencies` and re-checked against every future delta; a
97
- * later match opens a `StaleNotification` delivered out of band. Distinct
98
- * from `reads`, which is checked once here and discarded.
99
- */
100
- track?: TrackDependency[] | null;
101
- }
102
- /**
103
- * The server execution receipt persisted in `mutation_log`. Its runtime schema
104
- * lives with the HTTP/WS settlement contract so queued correlation cannot drift
105
- * between cache, transport, and client.
106
- */
107
- export type CommitResult = CommitExecutionResultInput;
@@ -1 +0,0 @@
1
- export {};
@@ -1,14 +0,0 @@
1
- /**
2
- * The server-side entry point of the sync engine. It re-exports the contract types
3
- * you implement a storage backend against: the {@link DataAdapter} and its
4
- * vocabulary ({@link Row}, {@link ReadRequest}, {@link ChangeSet}, and the rest),
5
- * the {@link CommitContext} and {@link CommitResult} commit types, the
6
- * {@link StorageMode} enumeration, and the per-model read configuration
7
- * ({@link BootstrapModel}, {@link ColumnOverride}). These are plain, driver-free
8
- * types; you supply the database code that fulfills them.
9
- */
10
- export type { Row, ReadResult, SyncCursor, DataAdapterCapabilities, ProposalResult, ReadRequest, ChangeSet, SyncResult, DataAdapter, ProposableDataAdapter, AdapterResolver, } from './adapter.js';
11
- export type { CommitContext, CommitResult } from './commit.js';
12
- export { commitExecutionResultSchema } from '../transaction/wire/commit.js';
13
- export { storageModeSchema, type StorageMode } from './storageMode.js';
14
- export type { ColumnOverride, BootstrapModel } from './readConfig.js';
@@ -1,2 +0,0 @@
1
- export { commitExecutionResultSchema } from '../transaction/wire/commit.js';
2
- export { storageModeSchema } from './storageMode.js';
@@ -1,80 +0,0 @@
1
- /**
2
- * Per-model read configuration consumed when a client bootstraps. Each
3
- * {@link BootstrapModel} maps a model to its physical table, its tenancy column, and
4
- * any parent scoping — plain data with no database driver. It feeds the read side of
5
- * the data adapter contract; your query builder reads it to load a model's initial
6
- * rows.
7
- */
8
- /** A mapping from a declared field to a physical column, with the alias to apply after a `SELECT *`. */
9
- export interface ColumnOverride {
10
- readonly field: string;
11
- readonly column: string;
12
- readonly alias: string;
13
- }
14
- /** Read configuration for one model: how to locate its rows and scope them to a tenant. */
15
- export interface BootstrapModel {
16
- name: string;
17
- /**
18
- * Extra names accepted when a request looks up or filters this model. When the
19
- * physical table name is canonical, `name` stays that table name and the aliases
20
- * cover generated compatibility names such as `WeatherReports` or `weatherReports`.
21
- */
22
- aliases?: readonly string[];
23
- /**
24
- * The schema key used by source endpoints. `name` stays the wire and result model
25
- * name (usually the typename), while source handlers are keyed by the developer's
26
- * schema key, such as `files` or `blocks`.
27
- */
28
- sourceModel?: string;
29
- table: string;
30
- syncGroups?: string[];
31
- enabled?: boolean;
32
- /** Max rows to return. Omit for unlimited. Maps to schema's bootstrapLimit. */
33
- limit?: number;
34
- /** SQL ORDER BY clause. Default: 'id'. Maps to schema's bootstrapOrderBy. */
35
- orderBy?: string;
36
- /** Whether the table has organization_id. Default: true. */
37
- orgScoped?: boolean;
38
- /**
39
- * The model derives its tenant from the connected data source (`policy:
40
- * { by: 'source' }`) rather than a row column. It carries no tenant predicate on a
41
- * log plane, so it is excluded from the bootstrap set entirely until the
42
- * write-through connect path can resolve the org from the source registration —
43
- * serving it now would return every row to every tenant. Kept on the type as a
44
- * defense-in-depth marker so a source-scoped model that reaches `getBootstrapData`
45
- * fails closed rather than bootstrapping unscoped.
46
- */
47
- sourceScoped?: boolean;
48
- /** Physical tenancy column (default `organization_id`, configurable per model). */
49
- orgColumn?: string;
50
- /**
51
- * Parent-table scoping for rows that have no `organization_id` column, mirroring
52
- * the schema's `scopedVia` option. When set, the bootstrap query adds:
53
- *
54
- * WHERE <table>.<localKey> IN
55
- * (SELECT <parentKey> FROM <parentTable> WHERE <parentOrgColumn> = $1)
56
- *
57
- * This applies on top of whatever `orgScoped` dictates, so a table can carry its
58
- * own `organization_id` and still narrow through a parent. The common case,
59
- * though, is `orgScoped: false` together with `scopedVia` on a table that lacks the
60
- * column.
61
- */
62
- scopedVia?: {
63
- localKey: string;
64
- parentTable: string;
65
- parentKey?: string;
66
- parentOrgColumn?: string;
67
- };
68
- /** Client-facing field name → physical DB column for declared fields. */
69
- fieldColumns?: Record<string, string>;
70
- /** Physical-column aliases needed after SELECT * for `.from(...)` fields. */
71
- columnOverrides?: readonly ColumnOverride[];
72
- /**
73
- * Physical columns the schema declares as JSON (via `field.json()`). A JSON field
74
- * stored in a text column comes back from `row_to_json` as a serialized string, so
75
- * the bootstrap reparses these columns to make the wire value the canonical object
76
- * regardless of the physical column type. A `jsonb` column already returns an
77
- * object, so reparsing it is a no-op.
78
- */
79
- jsonColumns?: readonly string[];
80
- }
@@ -1,8 +0,0 @@
1
- /**
2
- * Per-model read configuration consumed when a client bootstraps. Each
3
- * {@link BootstrapModel} maps a model to its physical table, its tenancy column, and
4
- * any parent scoping — plain data with no database driver. It feeds the read side of
5
- * the data adapter contract; your query builder reads it to load a model's initial
6
- * rows.
7
- */
8
- export {};
@@ -1,23 +0,0 @@
1
- /**
2
- * The set of storage modes a `DataAdapter` can run in. An adapter carries one of
3
- * these as a label for diagnostics; it does not decide routing, which the adapter
4
- * resolver handles separately. The package defines the enum so that the contract
5
- * and every adapter agree on the same closed set of values:
6
- *
7
- * - `hosted` — a database this engine operates on the caller's behalf.
8
- * - `selfHosted` — the caller's own database, reached through the same execution
9
- * path as `hosted`.
10
- * - `source` — a caller-owned endpoint that accepts changes over HTTP without
11
- * database credentials.
12
- *
13
- * These names describe where the data lives, not anything an end user sees.
14
- */
15
- import { z } from 'zod';
16
- /** Runtime validator for the storage-mode values; {@link StorageMode} is its inferred type. */
17
- export declare const storageModeSchema: z.ZodEnum<{
18
- source: "source";
19
- hosted: "hosted";
20
- selfHosted: "selfHosted";
21
- }>;
22
- /** The storage mode an adapter runs in — one of the values described in the module overview. */
23
- export type StorageMode = z.infer<typeof storageModeSchema>;
@@ -1,17 +0,0 @@
1
- /**
2
- * The set of storage modes a `DataAdapter` can run in. An adapter carries one of
3
- * these as a label for diagnostics; it does not decide routing, which the adapter
4
- * resolver handles separately. The package defines the enum so that the contract
5
- * and every adapter agree on the same closed set of values:
6
- *
7
- * - `hosted` — a database this engine operates on the caller's behalf.
8
- * - `selfHosted` — the caller's own database, reached through the same execution
9
- * path as `hosted`.
10
- * - `source` — a caller-owned endpoint that accepts changes over HTTP without
11
- * database credentials.
12
- *
13
- * These names describe where the data lives, not anything an end user sees.
14
- */
15
- import { z } from 'zod';
16
- /** Runtime validator for the storage-mode values; {@link StorageMode} is its inferred type. */
17
- export const storageModeSchema = z.enum(['hosted', 'source', 'selfHosted']);
@@ -1,81 +0,0 @@
1
- /**
2
- * The interface every data-source backend implements, together with the bridge
3
- * that wires an implementation into the `dataSource()` HTTP handler. This package
4
- * defines the contract and ships adapters for three object-relational mappers —
5
- * {@link prismaDataSource}, {@link drizzleDataSource}, and {@link kyselyDataSource} —
6
- * each verified by shared mutation checks plus endpoint-only outbox checks. The
7
- * direct Kysely wrapper runs only the shared mutation contract. You can also
8
- * write your own.
9
- *
10
- * An endpoint adapter reads and writes your database, and it owns the transactional
11
- * outbox and idempotency bookkeeping as well, so you never write those by hand:
12
- *
13
- * export const POST = dataSource({
14
- * schema, apiKey: process.env.ABLO_API_KEY!,
15
- * ...sourceHandlersFromAdapter(prismaDataSource(prisma, schema), schema),
16
- * });
17
- *
18
- * `sourceHandlersFromAdapter` is the bridge: it turns a single adapter into the
19
- * handler's `commit`, `events`, and per-model `load` and `list` operations, so no
20
- * code above the adapter needs to know which mapper you chose.
21
- */
22
- import type { SourceListQuery, SourceRequestContext } from './types.js';
23
- import type { AdapterCapabilities, ChangeSet, EventsPage, Migration } from './contract.js';
24
- /**
25
- * A single row keyed by the schema's field names (for example `operatorId`), not
26
- * by physical column names. Each adapter is the boundary that translates between
27
- * the two, mapping a field name to whatever the underlying database column is
28
- * called. Values are typed as `unknown`, so a caller must narrow a value before
29
- * using it.
30
- */
31
- export type Row = Record<string, unknown>;
32
- /** A read request handed to an adapter: either a single-row load by id, or a filtered list. */
33
- export type AdapterReadRequest = {
34
- readonly kind: 'load';
35
- readonly model: string;
36
- readonly id: string;
37
- readonly scope?: SourceRequestContext;
38
- } | {
39
- readonly kind: 'list';
40
- readonly model: string;
41
- readonly query?: SourceListQuery;
42
- readonly scope?: SourceRequestContext;
43
- };
44
- /** What {@link MutationAdapter.commit} returns: the rows as they stand after the write. */
45
- export interface AdapterCommitResult {
46
- /** The affected rows after the write. The change log is derived from these. */
47
- readonly rows: readonly Row[];
48
- }
49
- /**
50
- * Guarantees shared by direct and endpoint mutation wrappers. Both apply row DML
51
- * and write the permanent idempotency ledger in one transaction. The scoped,
52
- * server-authored `correlationId` is the ledger key; a caller-authored operation
53
- * transaction id is never used as that namespace.
54
- */
55
- export interface MutationAdapter {
56
- readonly capabilities: AdapterCapabilities;
57
- /** Infrastructure migrations required by this wrapper's advertised capabilities. */
58
- migrations(): readonly Migration[];
59
- /** The rows matching a load or list request. */
60
- read(req: AdapterReadRequest): Promise<readonly Row[]>;
61
- /**
62
- * Applies a change set in one transaction, keyed by its scoped `correlationId`.
63
- * Replaying the same correlation and canonical request hash returns the original
64
- * rows without applying DML again; a different hash fails closed.
65
- */
66
- commit(change: ChangeSet): Promise<AdapterCommitResult>;
67
- }
68
- /**
69
- * Endpoint-only extension of {@link MutationAdapter}. Its commit writes one
70
- * correlated outbox event per operation in the same transaction as the DML and
71
- * ledger. Direct wrappers deliberately do not implement this interface: WAL is
72
- * their authoritative source feed and they must never write `ablo_outbox`.
73
- */
74
- export interface DataSourceAdapter extends MutationAdapter {
75
- readonly capabilities: AdapterCapabilities & {
76
- readonly outboxEvents: true;
77
- };
78
- /** Reads outbox events after `cursor` (`null` starts from the beginning), up to `limit` events. */
79
- events(cursor: string | null, limit: number): Promise<EventsPage>;
80
- }
81
- export type { AdapterCapabilities, ChangeSet, Migration, OutboxEvent, EventsPage } from './contract.js';
@@ -1,22 +0,0 @@
1
- /**
2
- * The interface every data-source backend implements, together with the bridge
3
- * that wires an implementation into the `dataSource()` HTTP handler. This package
4
- * defines the contract and ships adapters for three object-relational mappers —
5
- * {@link prismaDataSource}, {@link drizzleDataSource}, and {@link kyselyDataSource} —
6
- * each verified by shared mutation checks plus endpoint-only outbox checks. The
7
- * direct Kysely wrapper runs only the shared mutation contract. You can also
8
- * write your own.
9
- *
10
- * An endpoint adapter reads and writes your database, and it owns the transactional
11
- * outbox and idempotency bookkeeping as well, so you never write those by hand:
12
- *
13
- * export const POST = dataSource({
14
- * schema, apiKey: process.env.ABLO_API_KEY!,
15
- * ...sourceHandlersFromAdapter(prismaDataSource(prisma, schema), schema),
16
- * });
17
- *
18
- * `sourceHandlersFromAdapter` is the bridge: it turns a single adapter into the
19
- * handler's `commit`, `events`, and per-model `load` and `list` operations, so no
20
- * code above the adapter needs to know which mapper you chose.
21
- */
22
- export {};
@@ -1,48 +0,0 @@
1
- /**
2
- * The Drizzle adapter for the data-source interface. It implements the same
3
- * {@link DataSourceAdapter} contract as {@link prismaDataSource} and passes the
4
- * same conformance suite, built against Drizzle's query API:
5
- * - `db.transaction(async (tx) => …)` runs an interactive transaction that
6
- * commits or rolls back as a unit.
7
- * - `db.execute(sql`…`)` runs parameterized raw SQL; `sql.identifier()` safely
8
- * quotes dynamic table and column names, and `sql`${value}`` parameterizes
9
- * values.
10
- *
11
- * Table and column names come from your schema, not from a hand-written Drizzle
12
- * table. Because this adapter issues raw SQL, it would otherwise bypass any
13
- * field-to-column translation, so it derives every name from the same rule the
14
- * table provisioner uses:
15
- * table = `model.tableName ?? key`
16
- * column = `fieldMeta.column ?? camelToSnake(field)` (plus the tenancy column)
17
- * This keeps the tables `ablo migrate` creates (for example `operator_id`) and the
18
- * columns this adapter reads and writes in agreement. You define the schema once
19
- * and point the engine at your Postgres database. The adapter is the translation
20
- * boundary: the rows it accepts and returns, and the outbox `data` it writes, are
21
- * keyed by field name, while the physical columns it touches are snake_case.
22
- *
23
- * Two things to know about drivers:
24
- * 1. Interactive `db.transaction` needs a driver that supports it. Neon's
25
- * `neon-http` driver is single-shot and does not, so use `neon-serverless`
26
- * (over WebSocket) or `pg`; under `neon-http` the commit path throws at
27
- * runtime.
28
- * 2. The `db.execute` result shape is driver-specific — `postgres-js` returns an
29
- * array-like row list, while `node-postgres` returns `{ rows }`. `rowsOf`
30
- * normalizes both.
31
- *
32
- * Every write goes through `sql` and `db.execute` rather than the fluent builder,
33
- * which keeps the adapter one small, fully typed unit with no per-driver builder
34
- * generics.
35
- */
36
- import { type SQL } from 'drizzle-orm';
37
- import type { DataSourceAdapter, Row } from '../adapter.js';
38
- import type { Schema, SchemaRecord } from '../../transaction/schema/schema.js';
39
- /** The subset of a Drizzle database/transaction handle the adapter calls. */
40
- export interface DrizzleLike {
41
- execute(query: SQL): Promise<DrizzleExecuteResult>;
42
- transaction<T>(fn: (tx: DrizzleLike) => Promise<T>): Promise<T>;
43
- }
44
- /** `db.execute` is array-like (postgres-js) or `{ rows }` (node-postgres). */
45
- export type DrizzleExecuteResult = readonly Row[] | {
46
- readonly rows: readonly Row[];
47
- };
48
- export declare function drizzleDataSource<S extends SchemaRecord>(db: DrizzleLike, schema: Schema<S>): DataSourceAdapter;
@@ -1,219 +0,0 @@
1
- /**
2
- * The Drizzle adapter for the data-source interface. It implements the same
3
- * {@link DataSourceAdapter} contract as {@link prismaDataSource} and passes the
4
- * same conformance suite, built against Drizzle's query API:
5
- * - `db.transaction(async (tx) => …)` runs an interactive transaction that
6
- * commits or rolls back as a unit.
7
- * - `db.execute(sql`…`)` runs parameterized raw SQL; `sql.identifier()` safely
8
- * quotes dynamic table and column names, and `sql`${value}`` parameterizes
9
- * values.
10
- *
11
- * Table and column names come from your schema, not from a hand-written Drizzle
12
- * table. Because this adapter issues raw SQL, it would otherwise bypass any
13
- * field-to-column translation, so it derives every name from the same rule the
14
- * table provisioner uses:
15
- * table = `model.tableName ?? key`
16
- * column = `fieldMeta.column ?? camelToSnake(field)` (plus the tenancy column)
17
- * This keeps the tables `ablo migrate` creates (for example `operator_id`) and the
18
- * columns this adapter reads and writes in agreement. You define the schema once
19
- * and point the engine at your Postgres database. The adapter is the translation
20
- * boundary: the rows it accepts and returns, and the outbox `data` it writes, are
21
- * keyed by field name, while the physical columns it touches are snake_case.
22
- *
23
- * Two things to know about drivers:
24
- * 1. Interactive `db.transaction` needs a driver that supports it. Neon's
25
- * `neon-http` driver is single-shot and does not, so use `neon-serverless`
26
- * (over WebSocket) or `pg`; under `neon-http` the commit path throws at
27
- * runtime.
28
- * 2. The `db.execute` result shape is driver-specific — `postgres-js` returns an
29
- * array-like row list, while `node-postgres` returns `{ rows }`. `rowsOf`
30
- * normalizes both.
31
- *
32
- * Every write goes through `sql` and `db.execute` rather than the fluent builder,
33
- * which keeps the adapter one small, fully typed unit with no per-driver builder
34
- * generics.
35
- */
36
- import { AbloValidationError } from '../../transaction/errors.js';
37
- import { sql } from 'drizzle-orm';
38
- import { outboxEventSchema } from '../contract.js';
39
- import { adapterTableMigrations } from '../migrations.js';
40
- import { assertSourceIdempotencyIntent, assertSourceIdempotencyRetention, SOURCE_IDEMPOTENCY_RETENTION, sourceChangeIntentHash, } from '../idempotency.js';
41
- import { toSchemaJSON } from '../../schema/serialize.js';
42
- import { camelToSnake, snakeToCamel } from '../../schema/ddl.js';
43
- import { tenancyColumn } from '../../transaction/schema/tenancy.js';
44
- import { ABLO_POSTGRES_COMMIT_ECHO_PREFIX } from '../types.js';
45
- function rowsOf(result) {
46
- return Array.isArray(result) ? result : result.rows;
47
- }
48
- function rowId(op) {
49
- const id = op.id ?? op.input?.id;
50
- if (typeof id !== 'string' || id.length === 0) {
51
- throw new AbloValidationError(`operation on "${op.model}" requires an id`, { code: 'source_operation_id_required' });
52
- }
53
- return id;
54
- }
55
- /** `col1, col2` as a safely-quoted identifier list. */
56
- const identList = (cols) => sql.join(cols.map((c) => sql.identifier(c)), sql `, `);
57
- function buildColumnMaps(schema) {
58
- const json = toSchemaJSON(schema);
59
- const out = new Map();
60
- for (const [key, model] of Object.entries(json.models)) {
61
- const fieldToColumn = new Map();
62
- const columnToField = new Map();
63
- const register = (field, column) => {
64
- // The default rule already covers `camelToSnake(field)`; only record real
65
- // divergences so the reverse map never shadows a clean round-trip.
66
- if (column === camelToSnake(field))
67
- return;
68
- fieldToColumn.set(field, column);
69
- columnToField.set(column, field);
70
- };
71
- for (const [field, meta] of Object.entries(model.fields)) {
72
- if (meta.column)
73
- register(field, meta.column);
74
- }
75
- const orgColumn = tenancyColumn(model.tenancy);
76
- if (orgColumn)
77
- register('organizationId', orgColumn);
78
- out.set(key, { table: model.tableName ?? key, fieldToColumn, columnToField });
79
- }
80
- return out;
81
- }
82
- export function drizzleDataSource(db, schema) {
83
- const maps = buildColumnMaps(schema);
84
- const modelColumns = (model) => {
85
- const mc = maps.get(model);
86
- if (!mc)
87
- throw new AbloValidationError(`drizzleDataSource: no model "${model}" in schema`, { code: 'source_adapter_misconfigured' });
88
- return mc;
89
- };
90
- const columnFor = (mc, field) => mc.fieldToColumn.get(field) ?? camelToSnake(field);
91
- const fieldFor = (mc, column) => mc.columnToField.get(column) ?? snakeToCamel(column);
92
- /** Field-keyed row to column-keyed row, for INSERT and UPDATE values. */
93
- const toColumns = (mc, row) => {
94
- const out = {};
95
- for (const k of Object.keys(row))
96
- out[columnFor(mc, k)] = row[k];
97
- return out;
98
- };
99
- /** Column-keyed row (from `RETURNING *` or `SELECT *`) back to a field-keyed row, for reads and results. */
100
- const toFields = (mc, row) => {
101
- const out = {};
102
- for (const k of Object.keys(row))
103
- out[fieldFor(mc, k)] = row[k];
104
- return out;
105
- };
106
- const applyOperation = async (tx, op) => {
107
- const mc = modelColumns(op.model);
108
- const table = sql.identifier(mc.table);
109
- const id = rowId(op);
110
- const input = op.input ?? {};
111
- if (op.type === 'DELETE') {
112
- const deleted = rowsOf(await tx.execute(sql `DELETE FROM ${table} WHERE id = ${id} RETURNING *`));
113
- return deleted[0] ? toFields(mc, deleted[0]) : { id };
114
- }
115
- if (op.type === 'CREATE') {
116
- const data = toColumns(mc, { id, ...input });
117
- const cols = Object.keys(data);
118
- const values = sql.join(cols.map((c) => sql `${data[c]}`), sql `, `);
119
- const inserted = rowsOf(await tx.execute(sql `INSERT INTO ${table} (${identList(cols)}) VALUES (${values}) RETURNING *`));
120
- return inserted[0] ? toFields(mc, inserted[0]) : { id, ...input };
121
- }
122
- // UPDATE / ARCHIVE / UNARCHIVE — a SET clause + the lifecycle field. The
123
- // lifecycle field is `archivedAt` (camelCase) and goes through `toColumns`
124
- // like any other, so it lands in `archived_at` — same column the provisioner
125
- // emits and the Prisma adapter writes (no per-adapter casing divergence).
126
- const patch = toColumns(mc, {
127
- ...input,
128
- ...(op.type === 'ARCHIVE' ? { archivedAt: new Date() } : {}),
129
- ...(op.type === 'UNARCHIVE' ? { archivedAt: null } : {}),
130
- });
131
- const assignments = sql.join(Object.keys(patch).map((c) => sql `${sql.identifier(c)} = ${patch[c]}`), sql `, `);
132
- const updated = rowsOf(await tx.execute(sql `UPDATE ${table} SET ${assignments} WHERE id = ${id} RETURNING *`));
133
- return updated[0] ? toFields(mc, updated[0]) : { id, ...input };
134
- };
135
- return {
136
- capabilities: {
137
- transactions: true,
138
- propose: false,
139
- schemaIntrospection: true,
140
- postgresWalEcho: true,
141
- outboxEvents: true,
142
- },
143
- migrations() {
144
- return adapterTableMigrations();
145
- },
146
- async read(req) {
147
- const mc = modelColumns(req.model);
148
- const table = sql.identifier(mc.table);
149
- if (req.kind === 'load') {
150
- const rows = rowsOf(await db.execute(sql `SELECT * FROM ${table} WHERE id = ${req.id} LIMIT 1`));
151
- return rows.map((r) => toFields(mc, r));
152
- }
153
- const limit = req.query?.limit ?? 1000;
154
- const rows = rowsOf(await db.execute(sql `SELECT * FROM ${table} LIMIT ${limit}`));
155
- return rows.map((r) => toFields(mc, r));
156
- },
157
- async commit(change) {
158
- const requestHash = sourceChangeIntentHash(change);
159
- return db.transaction(async (tx) => {
160
- const cached = rowsOf(await tx.execute(sql `SELECT response, request_hash AS "requestHash", expires_at AS "expiresAt"
161
- FROM ablo_idempotency
162
- WHERE client_tx_id = ${change.correlationId} LIMIT 1`));
163
- const cachedRow = cached[0];
164
- if (cachedRow) {
165
- assertSourceIdempotencyIntent(cachedRow.requestHash, requestHash);
166
- assertSourceIdempotencyRetention(cachedRow.expiresAt);
167
- return { rows: cachedRow.response };
168
- }
169
- const rows = [];
170
- for (const [index, op] of change.operations.entries()) {
171
- const row = await applyOperation(tx, op);
172
- rows.push(row);
173
- const entityId = String(row.id ?? rowId(op));
174
- await tx.execute(sql `
175
- INSERT INTO ablo_outbox (
176
- id, model, entity_id, type, data,
177
- correlation_id, transaction_id, occurred_at
178
- )
179
- VALUES (
180
- ${`${change.correlationId}:${index}`}, ${op.model}, ${entityId}, ${op.type},
181
- ${op.type === 'DELETE' ? null : JSON.stringify(row)}::jsonb,
182
- ${change.correlationId}, ${op.transactionId ?? null}, ${Date.now()}
183
- )`);
184
- }
185
- await tx.execute(sql `
186
- INSERT INTO ablo_idempotency (client_tx_id, response, request_hash, expires_at)
187
- VALUES (
188
- ${change.correlationId}, ${JSON.stringify(rows)}::jsonb, ${requestHash},
189
- now() + ${SOURCE_IDEMPOTENCY_RETENTION}::interval
190
- )`);
191
- if (change.echo?.kind === 'postgres-wal') {
192
- await tx.execute(sql `SELECT pg_logical_emit_message(true, ${ABLO_POSTGRES_COMMIT_ECHO_PREFIX}, ${change.echo.payload})`);
193
- }
194
- return { rows };
195
- });
196
- },
197
- async events(cursor, limit) {
198
- const after = cursor ?? '0';
199
- const rows = rowsOf(await db.execute(sql `
200
- SELECT cursor, id, model, entity_id, type, data, organization_id,
201
- client_tx_id, correlation_id, transaction_id, occurred_at
202
- FROM ablo_outbox WHERE cursor > ${after} ORDER BY cursor ASC LIMIT ${limit}`));
203
- const events = rows.map((r) => outboxEventSchema.parse({
204
- id: r.id,
205
- model: r.model,
206
- entityId: r.entity_id,
207
- type: r.type,
208
- data: r.data ?? null,
209
- organizationId: r.organization_id ?? null,
210
- clientTxId: r.client_tx_id ?? null,
211
- correlationId: r.correlation_id ?? null,
212
- transactionId: r.transaction_id ?? null,
213
- occurredAt: r.occurred_at != null ? Number(r.occurred_at) : null,
214
- cursor: String(r.cursor),
215
- }));
216
- return { events, nextCursor: events.at(-1)?.cursor ?? null };
217
- },
218
- };
219
- }