@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,324 +0,0 @@
1
- /**
2
- * Schema Definition + Type Inference
3
- *
4
- * defineSchema() wraps your models. Types are inferred via Zod — no custom type system.
5
- *
6
- * Usage:
7
- * import { z } from 'zod';
8
- * import { defineSchema, model, relation } from '@abloatai/ablo/schema';
9
- *
10
- * const schema = defineSchema({
11
- * tasks: model({
12
- * title: z.string(),
13
- * status: z.enum(['todo', 'doing', 'done']).default('todo'),
14
- * projectId: z.string().optional(),
15
- * }, {
16
- * project: relation.belongsTo('projects', 'projectId'),
17
- * }),
18
- * });
19
- *
20
- * type Task = InferModel<typeof schema, 'tasks'>;
21
- */
22
- import { z } from 'zod';
23
- import type { ModelDef, RelationRecord } from './model.js';
24
- import type { RelationDef } from './relation.js';
25
- import type { IdentityRole } from './roles.js';
26
- export { type IdentityRole, type IdentityRoleSource, type IdentityContext, type EntityRole, type EntityRoleSource, type EntityContext, type RoleSource, type RoleContext, type SyncGroup, type SyncGroupInput, identityRole, entityRole, extractIdentityIds, extractEntityIds, composeIdentitySyncGroups, composeEntitySyncGroups, intersectRequestedWithAllowed, syncGroup, syncGroupSchema, syncGroupInputSchema, isSyncGroupInput, identityRoleSchema, entityRoleSchema, roleSchema, roleSourceSchema, scopeSchema, grantsRefSchema, groupsInputSchema, type GroupsInput, } from './roles.js';
27
- /** The set of built-in casing conventions supported by `defineSchema`. */
28
- export type CasingConvention = 'snake_case' | 'camelCase';
29
- /** Plug point for custom conventions (e.g. mixed legacy databases). */
30
- export type CasingFn = (jsField: string) => string;
31
- /** `defineSchema`'s casing option. Identity when unset. */
32
- export type Casing = CasingConvention | CasingFn;
33
- /**
34
- * A server-authored identity value that can fill one of a customer's Postgres
35
- * session settings. Deliberately a closed set — every member is resolved by Ablo
36
- * from the authenticated `ek_` and the plane, never from client-supplied data —
37
- * so a mapping can forward the tenant identity Ablo already trusts but can never
38
- * widen a writer's scope. Mirrors the fields the engine sets on the direct-write
39
- * connection (`app.current_org_id`, `app.current_project_id`, …).
40
- */
41
- export type SessionSettingSource = 'orgId' | 'projectId' | 'environment' | 'sandboxId' | 'participantId' | 'participantKind';
42
- /**
43
- * A map from a Postgres session-setting name the customer's RLS policies read to
44
- * the Ablo identity that fills it — e.g. `{ 'app.current_org': 'orgId' }`. The
45
- * setting name is the key (it takes exactly one source), so a duplicate is
46
- * unrepresentable rather than validated away. See
47
- * {@link DefineSchemaOptions.sessionSettings} and ADR 0011.
48
- */
49
- export type SessionSettings = Readonly<Record<string, SessionSettingSource>>;
50
- /**
51
- * Session settings Ablo already sets on its direct-write connection. A
52
- * `sessionSettings` entry FORWARDS Ablo's trusted context into a setting the
53
- * customer's own policies read — it may never reassign one of these, which would
54
- * let a schema push relax the engine's own scoping, timeouts, or `row_security`.
55
- * Shared with the engine's direct-write seam so authoring-time validation and
56
- * the runtime guard read one list. See ADR 0011.
57
- */
58
- export declare const RESERVED_SESSION_SETTINGS: readonly string[];
59
- export interface DefineSchemaOptions {
60
- /**
61
- * How to translate camelCase JS field names into database column
62
- * identifiers. Applied once, at schema build, to every relation's
63
- * `foreignKey` to produce `foreignKeyColumn`. Consumers whose DB
64
- * columns already match their JS field names can omit this — the
65
- * default is identity (no transform).
66
- *
67
- * Accepts a named convention or a custom function:
68
- *
69
- * ```ts
70
- * defineSchema({ ... }, { casing: 'snake_case' })
71
- * defineSchema({ ... }, { casing: (key) => key.toUpperCase() })
72
- * ```
73
- */
74
- readonly casing?: Casing;
75
- /**
76
- * Identity-anchored sync-group roles. The server's
77
- * `composeIdentitySyncGroups` reads these to build the set of groups a
78
- * participant may subscribe to. See {@link IdentityRole} for the shape: you
79
- * define the `kind` and which identity field supplies the id, with no fixed
80
- * vocabulary of kinds.
81
- *
82
- * Leave this unset for schemas that need no identity-derived scoping, such as
83
- * fully public read models. When it is unset, `composeIdentitySyncGroups`
84
- * returns `[]` and callers fall back to whatever explicit sync groups the
85
- * authentication provider attached to the identity.
86
- */
87
- readonly identityRoles?: readonly IdentityRole[];
88
- /**
89
- * Extra Postgres session settings Ablo's direct-write connection applies from
90
- * your authenticated identity, so your row-level-security policies read them
91
- * (ADR 0011). Before every direct write, Ablo already `SET LOCAL`s a fixed
92
- * bundle (`app.current_org_id`, `app.current_project_id`, …). If your policies
93
- * read a differently-named setting your own app sets per-connection — e.g. a
94
- * restrictive policy on `current_setting('app.current_org')` — map that
95
- * setting to the identity that fills it, and Ablo sets it too:
96
- *
97
- * ```ts
98
- * defineSchema({ ... }, {
99
- * sessionSettings: { 'app.current_org': 'orgId' },
100
- * })
101
- * ```
102
- *
103
- * The key is the setting name your policies read; the value is a closed set of
104
- * identities Ablo authenticates, so a mapping can narrow what the writer sees
105
- * but never widen it. Do NOT carve a policy exception for the writer role —
106
- * that exempts exactly the writes you want governed. Leave unset when your
107
- * policies read the settings Ablo already applies (or when a table has no RLS).
108
- */
109
- readonly sessionSettings?: SessionSettings;
110
- }
111
- /** A record of model names → model definitions */
112
- export type SchemaRecord = Record<string, ModelDef>;
113
- /**
114
- * Base fields every synced model gets automatically.
115
- *
116
- * Exported (internal) so `parseSchema` can rebuild a model's validator the
117
- * same way `defineSchema` does — `baseFieldsSchema.merge(modelSchema)` — when
118
- * reconstructing a `Schema` from its JSON form.
119
- */
120
- export declare const baseFieldsSchema: z.ZodObject<{
121
- id: z.ZodString;
122
- createdAt: z.ZodDate;
123
- updatedAt: z.ZodDate;
124
- organizationId: z.ZodOptional<z.ZodString>;
125
- createdBy: z.ZodOptional<z.ZodString>;
126
- }, z.core.$strip>;
127
- /**
128
- * The base-column names every model carries automatically — the keys of
129
- * {@link baseFieldsSchema}, kept here as the single source of truth. Code
130
- * generation reads it to avoid emitting a base column twice, and
131
- * {@link defineSchema} uses it to reject a model that redeclares one, since
132
- * merging the user's field over the base field would produce a `string & Date`
133
- * type and break the build.
134
- */
135
- export declare const BASE_FIELDS: readonly ["id", "createdAt", "updatedAt", "organizationId", "createdBy"];
136
- /** The base fields type — pure data columns. */
137
- export type BaseModelFields = z.infer<typeof baseFieldsSchema>;
138
- /**
139
- * Methods every model instance carries. These are intersected into
140
- * {@link InferModel}, the read-side type, but not into the create or update
141
- * input types, since methods are not valid input.
142
- */
143
- export interface BaseModelMethods {
144
- /** Wire-format model name (e.g. `'Section'`, `'Comment'`). */
145
- getModelName(): string;
146
- /** Plain-object serialization suitable for sending over the wire. */
147
- toJSON(): Record<string, unknown>;
148
- }
149
- /** The schema object returned by defineSchema() */
150
- export interface Schema<S extends SchemaRecord = SchemaRecord> {
151
- /** The raw model definitions */
152
- readonly models: S;
153
- /** Zod schemas with base fields merged in */
154
- readonly validators: {
155
- readonly [K in keyof S]: S[K] extends ModelDef<infer Shape> ? z.ZodObject<Shape & typeof baseFieldsSchema.shape> : never;
156
- };
157
- /**
158
- * Identity-anchored sync-group roles registered via
159
- * `defineSchema({...}, { identityRoles })`. Empty array when unset.
160
- * Server's `composeIdentitySyncGroups(identity, schema)` reads this
161
- * to derive a participant's allowed sync-group set.
162
- */
163
- readonly identityRoles: readonly IdentityRole[];
164
- /**
165
- * Session settings registered via `defineSchema({...}, { sessionSettings })`
166
- * (ADR 0011). The engine's direct-write path reads this to `SET LOCAL` each
167
- * named setting from server-authored context before applying DML, so the
168
- * customer's RLS governs Ablo's writes. Empty object when unset.
169
- */
170
- readonly sessionSettings: SessionSettings;
171
- /**
172
- * Set only on a projection produced by `selectModels`/`omitModels`: the
173
- * content hash of the FULL source schema the subset was cut from. A subset
174
- * hashes differently from the full schema it belongs to, so a projection-bound
175
- * client would otherwise always report drift against a server running the full
176
- * schema. The drift check treats the client as in-sync when the server's active
177
- * hash matches EITHER this client's own (subset) hash or this source hash — so
178
- * a current projection stays quiet while a genuinely behind server still warns.
179
- * Absent on a schema authored directly, where the client's own hash is the
180
- * deployed hash and plain equality is correct. Excluded from `toSchemaJSON`, so
181
- * stamping it never perturbs `schemaHash`.
182
- */
183
- readonly sourceSchemaHash?: string;
184
- }
185
- /**
186
- * Infer the full model type from a schema.
187
- * Includes base fields (id, createdAt, updatedAt, etc.)
188
- *
189
- * ```ts
190
- * type Task = InferModel<typeof schema, 'tasks'>;
191
- * ```
192
- */
193
- /** The schema bound via `declare module … interface Register { Schema: … }`
194
- * (the `ablo/register.ts` the scaffold writes). `never` when not registered. */
195
- type RegisteredSchema = import('../types/global.js').Register extends {
196
- Schema: infer S extends Schema;
197
- } ? S : never;
198
- /**
199
- * The primary model-type helper. Once your project's `ablo/register.ts`
200
- * registers the schema, a single argument is all it takes:
201
- *
202
- * ```ts
203
- * type Task = Model<'tasks'>;
204
- * ```
205
- *
206
- * Without that registration, or for a second schema, pass the schema
207
- * explicitly: `Model<typeof schema, 'tasks'>`.
208
- */
209
- export type Model<A, B = never> = [B] extends [never] ? A extends keyof RegisteredSchema['models'] ? InferModel<RegisteredSchema, A> : never : A extends Schema ? InferModel<A, B extends keyof A['models'] ? B : never> : never;
210
- /**
211
- * The row type {@link Model} resolves to. Internal: `Model<typeof schema,
212
- * 'tasks'>` is the published spelling, because it reads as the domain rather
213
- * than the machinery. This one is no longer exported from any subpath — it
214
- * stays because `Model` is defined in terms of it, not as a second name for
215
- * the same idea.
216
- */
217
- export type InferModel<S extends Schema, ModelName extends keyof S['models']> = S['models'][ModelName] extends ModelDef<infer Shape, infer R, infer C> ? // `Omit<…, keyof BaseModelFields>` so a model that (wrongly) redeclares a
218
- Omit<z.infer<z.ZodObject<Shape>>, keyof BaseModelFields> & BaseModelFields & BaseModelMethods & InferComputed<C> & InferRelations<S, R> : never;
219
- /**
220
- * Infer the relation accessor types from a model's relations record.
221
- *
222
- * At runtime the engine installs a getter for each declared relation, so this
223
- * type mirrors them and you can read `section.blocks` and `section.report` without a
224
- * cast.
225
- *
226
- * - `hasMany` → `InferModel<S, Target>[]`
227
- * - `belongsTo` / `hasOne` → `InferModel<S, Target> | undefined` (undefined
228
- * when the foreign key is unset or the parent has not loaded yet)
229
- *
230
- * Kept `readonly` because the accessors are getters with no setter — assigning
231
- * to `section.blocks` would have no effect at runtime.
232
- */
233
- export type InferRelations<S extends Schema, R extends RelationRecord> = string extends keyof R ? unknown : {
234
- readonly [K in keyof R]: R[K] extends RelationDef<infer Type, infer Target> ? Target extends keyof S['models'] ? Type extends 'hasMany' ? InferModel<S, Target>[] : Type extends 'hasOne' | 'belongsTo' ? InferModel<S, Target> | undefined : never : never : never;
235
- };
236
- /**
237
- * The row shape a reactive read returns: the model's data fields, base fields,
238
- * and schema computed getters — WITHOUT relation accessors and WITHOUT model
239
- * methods. Derived from the model definition, exactly like {@link InferModel},
240
- * mirroring what `toReactiveSnapshot()` produces at runtime.
241
- *
242
- * Relations (`hasMany` / `belongsTo`) are store-backed getters that exist only
243
- * on the pool's model instances, so a reactive row honestly omits them —
244
- * reading `row.blocks` is a compile error instead of a silent `undefined`.
245
- * Compose relations through a selector or hook instead.
246
- *
247
- * The same pairing other data layers converged on: Zero's data-only `Row<...>`
248
- * with relations added per-query, Prisma's scalar-only model types with
249
- * `GetPayload<{ include }>`, mobx-state-tree's `Instance<T>` / `SnapshotOut<T>`.
250
- */
251
- export type InferRow<S extends Schema, ModelName extends keyof S['models']> = S['models'][ModelName] extends ModelDef<infer Shape, RelationRecord, infer C> ? // Same reserved-field guard as InferModel — see the comment there.
252
- Omit<z.infer<z.ZodObject<Shape>>, keyof BaseModelFields> & BaseModelFields & InferComputed<C> : never;
253
- /**
254
- * The reactive-row companion to {@link Model}. Once your project's
255
- * `ablo/register.ts` registers the schema, a single argument is all it takes:
256
- *
257
- * ```ts
258
- * type SectionRow = Row<'sections'>; // data fields + computeds, no relations
259
- * type Section = Model<'sections'>; // the pool's model instance
260
- * ```
261
- *
262
- * Without that registration, or for a second schema, pass the schema
263
- * explicitly: `Row<typeof schema, 'sections'>`.
264
- */
265
- export type Row<A, B = never> = [B] extends [never] ? A extends keyof RegisteredSchema['models'] ? InferRow<RegisteredSchema, A> : never : A extends Schema ? InferRow<A, B extends keyof A['models'] ? B : never> : never;
266
- /**
267
- * Infer the return types of computed getters.
268
- * Maps each computed function's return type into a readonly property.
269
- *
270
- * ```ts
271
- * // Given: computed: { displayTitle: (self) => self.title || 'Untitled' }
272
- * // Infers: { readonly displayTitle: string }
273
- * ```
274
- */
275
- export type InferComputed<C> = string extends keyof C ? unknown : {
276
- readonly [K in keyof C]: C[K] extends (...args: any[]) => infer R ? R : never;
277
- };
278
- /**
279
- * Infer the create input type. Only schema-defined fields are accepted —
280
- * base fields (id, createdAt, updatedAt) are auto-generated by the SDK
281
- * and cannot be passed by the consumer.
282
- *
283
- * The only exception is `id`: consumers can optionally provide one for
284
- * client-generated IDs (useful for optimistic UI that needs to reference
285
- * the entity before the server confirms).
286
- *
287
- * ```ts
288
- * type CreateTask = InferCreate<typeof schema, 'tasks'>;
289
- * // { title: string; status?: 'todo' | 'doing' | 'done'; id?: string }
290
- * // createdAt, updatedAt are NOT accepted — they're auto-generated
291
- * ```
292
- */
293
- export type InferCreate<S extends Schema, ModelName extends keyof S['models']> = S['models'][ModelName] extends ModelDef<infer Shape> ? // Same reserved-field guard as InferModel: drop any (wrongly) redeclared
294
- Omit<z.input<z.ZodObject<Shape>>, keyof BaseModelFields> & Partial<BaseModelFields> : never;
295
- /**
296
- * Extract all model names from a schema.
297
- */
298
- export type InferModelNames<S extends Schema> = keyof S['models'] & string;
299
- /**
300
- * The value type for inserting a new row. Same shape as {@link InferCreate}:
301
- * the fields you can write, plus an optional `id` for client-generated ids.
302
- */
303
- export type InsertValue<S extends Schema, ModelName extends keyof S['models']> = InferCreate<S, ModelName>;
304
- /**
305
- * The value type for upserting (insert or overwrite). Same shape as
306
- * {@link InsertValue} — a full row. If a row with the same `id` exists,
307
- * it gets overwritten.
308
- */
309
- export type UpsertValue<S extends Schema, ModelName extends keyof S['models']> = InsertValue<S, ModelName>;
310
- /**
311
- * The value type for updating an existing row. `id` is required (identifies
312
- * the row to update); all other fields are optional (only provided fields
313
- * are changed).
314
- */
315
- export type UpdateValue<S extends Schema, ModelName extends keyof S['models']> = S['models'][ModelName] extends ModelDef<infer Shape> ? {
316
- id: string;
317
- } & Partial<z.input<z.ZodObject<Shape>>> : never;
318
- /**
319
- * The value type for deleting a row. Just the primary key.
320
- */
321
- export interface DeleteId<S extends Schema, ModelName extends keyof S['models']> {
322
- id: string;
323
- }
324
- export declare function defineSchema<const S extends SchemaRecord>(models: S, options?: DefineSchemaOptions): Schema<S>;
@@ -1,305 +0,0 @@
1
- /**
2
- * Schema Definition + Type Inference
3
- *
4
- * defineSchema() wraps your models. Types are inferred via Zod — no custom type system.
5
- *
6
- * Usage:
7
- * import { z } from 'zod';
8
- * import { defineSchema, model, relation } from '@abloatai/ablo/schema';
9
- *
10
- * const schema = defineSchema({
11
- * tasks: model({
12
- * title: z.string(),
13
- * status: z.enum(['todo', 'doing', 'done']).default('todo'),
14
- * projectId: z.string().optional(),
15
- * }, {
16
- * project: relation.belongsTo('projects', 'projectId'),
17
- * }),
18
- * });
19
- *
20
- * type Task = InferModel<typeof schema, 'tasks'>;
21
- */
22
- import { z } from 'zod';
23
- import { AbloValidationError } from '../errors.js';
24
- import { scopeSchema, grantsRefSchema } from './roles.js';
25
- // Sync-group roles (identity and entity) are defined in `./roles.js` and
26
- // re-exported here so they can also be imported from this module. See
27
- // `./roles.js` for the full vocabulary.
28
- export { identityRole, entityRole, extractIdentityIds, extractEntityIds, composeIdentitySyncGroups, composeEntitySyncGroups, intersectRequestedWithAllowed, syncGroup, syncGroupSchema, syncGroupInputSchema, isSyncGroupInput, identityRoleSchema, entityRoleSchema, roleSchema, roleSourceSchema, scopeSchema, grantsRefSchema, groupsInputSchema, } from './roles.js';
29
- function resolveCasing(fn) {
30
- if (fn === undefined)
31
- return (x) => x;
32
- if (typeof fn === 'function')
33
- return fn;
34
- switch (fn) {
35
- case 'snake_case':
36
- return camelToSnake;
37
- case 'camelCase':
38
- return (x) => x;
39
- }
40
- }
41
- /** Converts a camelCase identifier to snake_case. Kept local so the package
42
- * carries no database-driver dependency, and so consumers on any stack get the
43
- * same result. */
44
- function camelToSnake(identifier) {
45
- return identifier.replace(/[A-Z]/g, (ch) => `_${ch.toLowerCase()}`);
46
- }
47
- /**
48
- * Session settings Ablo already sets on its direct-write connection. A
49
- * `sessionSettings` entry FORWARDS Ablo's trusted context into a setting the
50
- * customer's own policies read — it may never reassign one of these, which would
51
- * let a schema push relax the engine's own scoping, timeouts, or `row_security`.
52
- * Shared with the engine's direct-write seam so authoring-time validation and
53
- * the runtime guard read one list. See ADR 0011.
54
- */
55
- export const RESERVED_SESSION_SETTINGS = [
56
- 'statement_timeout',
57
- 'lock_timeout',
58
- 'row_security',
59
- 'search_path',
60
- 'app.current_org_id',
61
- 'app.current_project_id',
62
- 'app.current_environment',
63
- 'app.current_sandbox_id',
64
- 'app.current_participant_id',
65
- 'app.current_participant_kind',
66
- 'app.current_user_id',
67
- ];
68
- /**
69
- * Base fields every synced model gets automatically.
70
- *
71
- * Exported (internal) so `parseSchema` can rebuild a model's validator the
72
- * same way `defineSchema` does — `baseFieldsSchema.merge(modelSchema)` — when
73
- * reconstructing a `Schema` from its JSON form.
74
- */
75
- export const baseFieldsSchema = z.object({
76
- id: z.string(),
77
- createdAt: z.date(),
78
- updatedAt: z.date(),
79
- organizationId: z.string().optional(),
80
- createdBy: z.string().optional(),
81
- });
82
- /**
83
- * The base-column names every model carries automatically — the keys of
84
- * {@link baseFieldsSchema}, kept here as the single source of truth. Code
85
- * generation reads it to avoid emitting a base column twice, and
86
- * {@link defineSchema} uses it to reject a model that redeclares one, since
87
- * merging the user's field over the base field would produce a `string & Date`
88
- * type and break the build.
89
- */
90
- export const BASE_FIELDS = [
91
- 'id',
92
- 'createdAt',
93
- 'updatedAt',
94
- 'organizationId',
95
- 'createdBy',
96
- ];
97
- // ── Factory ───────────────────────────────────────────────────────────────
98
- /**
99
- * Define a sync engine schema.
100
- *
101
- * ```ts
102
- * const schema = defineSchema({
103
- * tasks: model({ title: z.string(), status: z.string().default('todo') }),
104
- * projects: model({ name: z.string() }),
105
- * });
106
- * ```
107
- */
108
- /**
109
- * Rejects field names that will not survive the sync driver's snake_case ↔
110
- * camelCase round-trip. The driver maps identifiers like this:
111
- *
112
- * `content_json` → `contentJson` (snake → camel)
113
- * `contentJson` → `content_json` (camel → snake)
114
- * `contentJSON` → `content_j_s_o_n` (does not round-trip)
115
- *
116
- * A name that does not round-trip through this pair of transforms will silently
117
- * fail to populate on the client: the wire delivers one casing, the model reads
118
- * another, and the field lands as `undefined`. Catching it here surfaces the
119
- * problem when the schema is defined rather than at runtime.
120
- *
121
- * The rule: a standard camelCase identifier has runs of a single uppercase
122
- * letter followed by lowercase letters, never two uppercase letters in a row.
123
- * `contentJSON` has `JSON` in all caps, so it is rejected.
124
- */
125
- function assertRoundTrippableCamelCase(modelName, fieldName) {
126
- // Base fields merged in by defineSchema are already validated; skip.
127
- if (fieldName === 'id')
128
- return;
129
- // Leading-lowercase constraint: fields must be camelCase, not PascalCase.
130
- // PascalCase is reserved for typenames.
131
- const first = fieldName.charAt(0);
132
- if (first >= 'A' && first <= 'Z') {
133
- throw new AbloValidationError(`[defineSchema] ${modelName}.${fieldName}: field names must start lowercase ` +
134
- `(camelCase). Use "${first.toLowerCase()}${fieldName.slice(1)}" instead.`, { code: 'schema_field_not_camelcase' });
135
- }
136
- // Two-consecutive-uppercase check. The classic failure mode is
137
- // `contentJSON`, `contentHTML`, `myURLParam`, etc. These don't round-trip
138
- // through `postgres.camel` — the snake_case intermediate would be
139
- // `content_j_s_o_n`, which is not a column that exists.
140
- for (let i = 0; i < fieldName.length - 1; i++) {
141
- const a = fieldName.charAt(i);
142
- const b = fieldName.charAt(i + 1);
143
- const aUpper = a >= 'A' && a <= 'Z';
144
- const bUpper = b >= 'A' && b <= 'Z';
145
- if (aUpper && bUpper) {
146
- throw new AbloValidationError(`[defineSchema] ${modelName}.${fieldName}: two consecutive uppercase ` +
147
- `letters ("${a}${b}") will not round-trip through the ` +
148
- `snake_case ↔ camelCase transform used by the sync driver. ` +
149
- `The wire delivers camelCase (lowercase after the first letter of ` +
150
- `each word); a field named "${fieldName}" would never receive its ` +
151
- `value and read as undefined on the client. Use standard ` +
152
- `camelCase (e.g. "contentJson" instead of "contentJSON").`, { code: 'schema_field_consecutive_caps' });
153
- }
154
- }
155
- }
156
- export function defineSchema(models, options) {
157
- // Build validators with base fields merged in, and resolve defaults for
158
- // `typename` and `persist.store` so downstream code (the loader and the
159
- // hydration pipeline) can rely on these fields being set without re-deriving
160
- // them at every call site.
161
- //
162
- // Defaults:
163
- // typename ← schema key (e.g. `block` → `'block'`)
164
- // persist.store ← typename (only resolved when `persist` was provided)
165
- //
166
- // A consumer that passes `typename: 'Block'` explicitly (common when
167
- // the wire shape uses PascalCase while the schema key is camelCase) keeps
168
- // that value — the fallback only fires when the field is unset.
169
- //
170
- // The models record is rebuilt rather than mutated in place because
171
- // `ModelDef`'s fields are `readonly`. The rebuild is a shallow spread per
172
- // entry, so the inferred shape/relations/fields metadata references are
173
- // preserved (no type inference regression at consumer call sites).
174
- const validators = {};
175
- const resolvedModels = {};
176
- const casing = resolveCasing(options?.casing);
177
- for (const [name, def] of Object.entries(models)) {
178
- // Catch round-trip-hostile field names at definition time. Deferring
179
- // this check to runtime means every affected field silently reads
180
- // `undefined` on the client — and the author only notices when a UI
181
- // that depends on the field goes blank. Throwing here makes the
182
- // failure immediate and unambiguous.
183
- for (const fieldName of Object.keys(def.shape)) {
184
- assertRoundTrippableCamelCase(name, fieldName);
185
- // Reserved base columns are merged in below via `baseFieldsSchema.merge`,
186
- // and Zod `.merge` silently OVERWRITES the base field with the user's —
187
- // e.g. a model declaring `createdAt: z.string()` ends up with a field
188
- // typed `string & Date`, which breaks the build. Reject the collision at
189
- // definition time so the author sees an unambiguous error instead.
190
- if (BASE_FIELDS.includes(fieldName)) {
191
- throw new AbloValidationError(`[defineSchema] ${name}.${fieldName}: field \`${fieldName}\` collides with a ` +
192
- `reserved field that the SDK provides automatically ` +
193
- `(${BASE_FIELDS.join(', ')}). Remove it from your model — redeclaring it ` +
194
- `produces a \`string & Date\` type and breaks the build.`, { code: 'schema_reserved_field', param: `${name}.${fieldName}` });
195
- }
196
- }
197
- validators[name] = baseFieldsSchema.merge(def.schema);
198
- // Resolve every relation's `foreignKeyColumn` once, now. The builder
199
- // constructs each RelationDef with `foreignKeyColumn = foreignKey`
200
- // (identity) so this is a no-op when `casing` is unset — existing
201
- // consumers get the same behavior they had before the option landed.
202
- // When `casing: 'snake_case'` is set, every FK flips to its
203
- // snake_case DB column name here and nowhere else. A field-level
204
- // `.from(column)` override wins over the convention, so legacy
205
- // columns stay declared in the artifact instead of rediscovered by
206
- // SQL compilers. Server-side SQL compilers read the resolved value
207
- // directly.
208
- for (const rel of Object.values(def.relations)) {
209
- const fieldColumn = def.fields[rel.foreignKey]?.column;
210
- rel.foreignKeyColumn = fieldColumn ?? casing(rel.foreignKey);
211
- }
212
- const typename = def.typename ?? name;
213
- const persist = def.persist
214
- ? { ...def.persist, store: def.persist.store ?? typename }
215
- : undefined;
216
- // Physical table defaults to the schema key — the SAME rule the
217
- // provisioner/planner use (`tableName ?? key`), resolved here once so the
218
- // serialized artifact always carries it. Required now that models are
219
- // mutable by default: the server's `buildModelMap` rejects a mutable
220
- // model with no `tableName`, which would otherwise break every commit.
221
- const tableName = def.tableName ?? name;
222
- resolvedModels[name] = { ...def, typename, tableName, persist };
223
- }
224
- validateSyncGroupSchema(resolvedModels);
225
- validateSessionSettings(options?.sessionSettings ?? {});
226
- return {
227
- // Cast back to S: we only added values to optional fields that were
228
- // already part of ModelDef, so the shape is structurally unchanged.
229
- models: resolvedModels,
230
- validators: validators,
231
- identityRoles: options?.identityRoles ?? [],
232
- sessionSettings: options?.sessionSettings ?? {},
233
- };
234
- }
235
- /**
236
- * Reject session-setting mappings that couldn't do what the author intends —
237
- * caught here at definition time rather than silently dropped on the write path.
238
- * Each key must name a non-empty setting the customer's policies read, and must
239
- * not reassign one Ablo already manages. Uniqueness needs no check: the map is
240
- * keyed by the setting name, so a duplicate is unrepresentable.
241
- */
242
- function validateSessionSettings(settings) {
243
- for (const setting of Object.keys(settings)) {
244
- const name = setting.trim();
245
- if (name === '') {
246
- throw new AbloValidationError(`[defineSchema] sessionSettings: a key is empty. Name the Postgres ` +
247
- `setting your row-level-security policies read, e.g. ` +
248
- `\`{ 'app.current_org': 'orgId' }\`.`, { code: 'schema_definition_invalid', param: 'sessionSettings' });
249
- }
250
- if (RESERVED_SESSION_SETTINGS.includes(name)) {
251
- throw new AbloValidationError(`[defineSchema] sessionSettings: \`${name}\` is a setting Ablo already ` +
252
- `manages on its write connection, so a mapping can't reassign it — ` +
253
- `that would let a schema relax the engine's own scoping. Point your ` +
254
- `policies at a setting your app owns (e.g. \`app.current_org\`) and ` +
255
- `map Ablo's trusted identity into that instead. Reserved: ` +
256
- `${RESERVED_SESSION_SETTINGS.join(', ')}.`, { code: 'schema_definition_invalid', param: `sessionSettings.${name}` });
257
- }
258
- }
259
- }
260
- /**
261
- * Validates the relation-driven sync-group declarations (`scope` and `grants`)
262
- * at schema-build time, so a mistyped membership edge fails here — with a
263
- * structured error (`code`, `param`, `doc_url`) pointing at the exact
264
- * declaration — rather than silently mis-routing changes at runtime.
265
- */
266
- function validateSyncGroupSchema(models) {
267
- for (const [name, def] of Object.entries(models)) {
268
- // Shape-validate the `scope` declaration via the shared Zod schema.
269
- if (def.scope !== undefined && !scopeSchema.safeParse(def.scope).success) {
270
- throw new AbloValidationError(`Model "${name}": scope kind "${String(def.scope)}" must be a lowercase identifier (e.g. 'workspace').`, { code: 'schema_scope_kind_invalid', param: `${name}.scope` });
271
- }
272
- if (!def.grants)
273
- continue;
274
- // Shape-validate the `grants` edge via the shared Zod schema before the
275
- // cross-field (relation-exists / belongsTo) checks below.
276
- if (!grantsRefSchema.safeParse(def.grants).success) {
277
- throw new AbloValidationError(`Model "${name}": grants must be { subject, scope } naming two relations on this model.`, { code: 'schema_grants_shape_invalid', param: `${name}.grants` });
278
- }
279
- const relations = def.relations;
280
- for (const role of ['subject', 'scope']) {
281
- const relName = def.grants[role];
282
- const rel = relations?.[relName];
283
- if (!rel) {
284
- throw new AbloValidationError(`Model "${name}": grants.${role} "${relName}" is not a relation on this model. ` +
285
- `Declare a \`belongsTo\` relation named "${relName}" first.`, { code: 'schema_grants_relation_missing', param: `${name}.grants.${role}` });
286
- }
287
- if (rel.type !== 'belongsTo') {
288
- throw new AbloValidationError(`Model "${name}": grants.${role} "${relName}" must be a \`belongsTo\` relation ` +
289
- `(got "${rel.type}"). A membership edge points at a single subject/scope row.`, { code: 'schema_grants_relation_kind', param: `${name}.grants.${role}` });
290
- }
291
- }
292
- // The scope edge must target a model that is actually a scope root —
293
- // otherwise the resolved `<kind>:<id>` group is one nothing fans into.
294
- const scopeRel = relations[def.grants.scope];
295
- // Unreachable: the role loop above already threw if the scope relation
296
- // is missing — this narrows the indexed access for the checks below.
297
- if (!scopeRel)
298
- continue;
299
- const target = models[scopeRel.target];
300
- if (target && !target.scope) {
301
- throw new AbloValidationError(`Model "${name}": grants.scope "${def.grants.scope}" targets "${scopeRel.target}", ` +
302
- `which is not a scope root. Add \`scope: true\` to the "${scopeRel.target}" model.`, { code: 'schema_grants_target_not_scope_root', param: `${scopeRel.target}.scope` });
303
- }
304
- }
305
- }