@abloatai/ablo 0.26.0 → 0.28.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 (418) hide show
  1. package/CHANGELOG.md +42 -2
  2. package/README.md +102 -86
  3. package/dist/BaseSyncedStore.d.ts +85 -88
  4. package/dist/BaseSyncedStore.js +134 -151
  5. package/dist/Database.d.ts +68 -69
  6. package/dist/Database.js +316 -135
  7. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  8. package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
  9. package/dist/LazyReferenceCollection.d.ts +11 -15
  10. package/dist/LazyReferenceCollection.js +12 -16
  11. package/dist/Model.d.ts +54 -52
  12. package/dist/Model.js +78 -62
  13. package/dist/ModelRegistry.d.ts +21 -19
  14. package/dist/ModelRegistry.js +23 -27
  15. package/dist/NetworkMonitor.d.ts +5 -6
  16. package/dist/NetworkMonitor.js +5 -6
  17. package/dist/SyncClient.d.ts +122 -118
  18. package/dist/SyncClient.js +541 -245
  19. package/dist/adapters/alwaysOnline.d.ts +6 -8
  20. package/dist/adapters/alwaysOnline.js +6 -8
  21. package/dist/adapters/inMemoryStorage.d.ts +10 -9
  22. package/dist/adapters/inMemoryStorage.js +21 -9
  23. package/dist/agent/Agent.d.ts +27 -32
  24. package/dist/agent/Agent.js +18 -19
  25. package/dist/agent/index.d.ts +4 -4
  26. package/dist/agent/index.js +5 -5
  27. package/dist/agent/session.d.ts +47 -44
  28. package/dist/agent/session.js +37 -48
  29. package/dist/agent/types.d.ts +26 -31
  30. package/dist/agent/types.js +6 -7
  31. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  32. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  33. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  34. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
  35. package/dist/ai-sdk/index.d.ts +25 -22
  36. package/dist/ai-sdk/index.js +25 -22
  37. package/dist/ai-sdk/wrap.d.ts +6 -7
  38. package/dist/ai-sdk/wrap.js +1 -1
  39. package/dist/auth/credentialPolicy.d.ts +69 -74
  40. package/dist/auth/credentialPolicy.js +51 -56
  41. package/dist/auth/credentialSource.d.ts +6 -5
  42. package/dist/auth/credentialSource.js +9 -10
  43. package/dist/auth/index.d.ts +59 -58
  44. package/dist/auth/index.js +31 -37
  45. package/dist/auth/schemas.d.ts +5 -4
  46. package/dist/auth/schemas.js +5 -4
  47. package/dist/batching/index.d.ts +19 -21
  48. package/dist/batching/index.js +14 -17
  49. package/dist/cli.cjs +173 -121
  50. package/dist/client/Ablo.d.ts +97 -74
  51. package/dist/client/Ablo.js +129 -163
  52. package/dist/client/ApiClient.d.ts +30 -19
  53. package/dist/client/ApiClient.js +442 -81
  54. package/dist/client/auth.d.ts +47 -47
  55. package/dist/client/auth.js +108 -117
  56. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  57. package/dist/client/claimHeartbeatLoop.js +88 -0
  58. package/dist/client/consoleLogger.d.ts +5 -6
  59. package/dist/client/consoleLogger.js +5 -6
  60. package/dist/client/createInternalComponents.d.ts +16 -17
  61. package/dist/client/createInternalComponents.js +26 -31
  62. package/dist/client/createModelProxy.d.ts +130 -120
  63. package/dist/client/createModelProxy.js +152 -122
  64. package/dist/client/credentialEndpoint.d.ts +40 -42
  65. package/dist/client/credentialEndpoint.js +35 -36
  66. package/dist/client/functionalUpdate.d.ts +29 -27
  67. package/dist/client/functionalUpdate.js +21 -21
  68. package/dist/client/hostedEndpoints.d.ts +9 -12
  69. package/dist/client/hostedEndpoints.js +9 -12
  70. package/dist/client/httpClient.d.ts +59 -53
  71. package/dist/client/httpClient.js +29 -31
  72. package/dist/client/identity.d.ts +15 -20
  73. package/dist/client/identity.js +47 -58
  74. package/dist/client/modelRegistration.d.ts +5 -9
  75. package/dist/client/modelRegistration.js +78 -87
  76. package/dist/client/options.d.ts +157 -157
  77. package/dist/client/options.js +3 -7
  78. package/dist/client/registerDataSource.d.ts +9 -9
  79. package/dist/client/registerDataSource.js +15 -16
  80. package/dist/client/resourceTypes.d.ts +64 -75
  81. package/dist/client/resourceTypes.js +4 -10
  82. package/dist/client/schemaConfig.d.ts +31 -43
  83. package/dist/client/schemaConfig.js +38 -50
  84. package/dist/client/sessionMint.d.ts +16 -12
  85. package/dist/client/sessionMint.js +26 -31
  86. package/dist/client/validateAbloOptions.d.ts +12 -14
  87. package/dist/client/validateAbloOptions.js +8 -9
  88. package/dist/client/writeOptionsSchema.d.ts +18 -16
  89. package/dist/client/writeOptionsSchema.js +23 -20
  90. package/dist/client/wsMutationExecutor.d.ts +16 -20
  91. package/dist/client/wsMutationExecutor.js +18 -23
  92. package/dist/commit/contract.d.ts +493 -0
  93. package/dist/commit/contract.js +187 -0
  94. package/dist/commit/index.d.ts +6 -0
  95. package/dist/commit/index.js +5 -0
  96. package/dist/context.d.ts +6 -4
  97. package/dist/context.js +6 -4
  98. package/dist/coordination/index.d.ts +10 -8
  99. package/dist/coordination/index.js +14 -12
  100. package/dist/coordination/schema.d.ts +176 -128
  101. package/dist/coordination/schema.js +197 -133
  102. package/dist/coordination/trace.d.ts +9 -10
  103. package/dist/coordination/trace.js +13 -14
  104. package/dist/core/DatabaseManager.d.ts +5 -7
  105. package/dist/core/DatabaseManager.js +15 -19
  106. package/dist/core/QueryProcessor.d.ts +7 -9
  107. package/dist/core/QueryProcessor.js +22 -28
  108. package/dist/core/QueryView.d.ts +8 -8
  109. package/dist/core/QueryView.js +2 -2
  110. package/dist/core/StoreManager.d.ts +14 -14
  111. package/dist/core/StoreManager.js +33 -24
  112. package/dist/core/ViewRegistry.d.ts +5 -5
  113. package/dist/core/ViewRegistry.js +4 -4
  114. package/dist/core/index.d.ts +17 -12
  115. package/dist/core/index.js +32 -26
  116. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  117. package/dist/core/openIDBWithTimeout.js +42 -43
  118. package/dist/core/queryUtils.d.ts +45 -0
  119. package/dist/core/queryUtils.js +69 -0
  120. package/dist/core/storeContract.d.ts +63 -61
  121. package/dist/core/storeContract.js +8 -12
  122. package/dist/environment.d.ts +28 -0
  123. package/dist/environment.js +21 -0
  124. package/dist/errorCodes.d.ts +107 -99
  125. package/dist/errorCodes.js +137 -134
  126. package/dist/errors.d.ts +160 -166
  127. package/dist/errors.js +155 -158
  128. package/dist/index.d.ts +36 -27
  129. package/dist/index.js +91 -86
  130. package/dist/interfaces/index.d.ts +102 -113
  131. package/dist/interfaces/index.js +5 -4
  132. package/dist/keys/index.d.ts +27 -29
  133. package/dist/keys/index.js +41 -40
  134. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  135. package/dist/mutators/RecordingTransaction.js +31 -37
  136. package/dist/mutators/Transaction.d.ts +18 -26
  137. package/dist/mutators/Transaction.js +14 -20
  138. package/dist/mutators/UndoManager.d.ts +124 -131
  139. package/dist/mutators/UndoManager.js +177 -156
  140. package/dist/mutators/defineMutators.d.ts +23 -34
  141. package/dist/mutators/defineMutators.js +14 -20
  142. package/dist/mutators/inverseOp.d.ts +12 -15
  143. package/dist/mutators/inverseOp.js +12 -15
  144. package/dist/mutators/mutateActions.d.ts +10 -9
  145. package/dist/mutators/mutateActions.js +1 -1
  146. package/dist/mutators/readerActions.d.ts +9 -8
  147. package/dist/mutators/readerActions.js +2 -2
  148. package/dist/mutators/undoApply.d.ts +31 -27
  149. package/dist/mutators/undoApply.js +26 -24
  150. package/dist/policy/index.d.ts +5 -3
  151. package/dist/policy/index.js +5 -3
  152. package/dist/policy/types.d.ts +104 -100
  153. package/dist/policy/types.js +67 -66
  154. package/dist/query/client.d.ts +28 -23
  155. package/dist/query/client.js +45 -43
  156. package/dist/query/types.d.ts +37 -60
  157. package/dist/query/types.js +13 -33
  158. package/dist/react/AbloProvider.d.ts +1 -1
  159. package/dist/react/AbloProvider.js +2 -2
  160. package/dist/react/context.d.ts +25 -28
  161. package/dist/react/context.js +9 -10
  162. package/dist/react/index.d.ts +41 -42
  163. package/dist/react/index.js +37 -38
  164. package/dist/react/internalContext.d.ts +17 -19
  165. package/dist/react/useAblo.d.ts +28 -25
  166. package/dist/react/useAblo.js +41 -17
  167. package/dist/react/useCurrentUserId.d.ts +8 -7
  168. package/dist/react/useCurrentUserId.js +8 -7
  169. package/dist/react/useErrorListener.d.ts +7 -7
  170. package/dist/react/useErrorListener.js +10 -11
  171. package/dist/react/useMutationFailureListener.d.ts +8 -8
  172. package/dist/react/useMutationFailureListener.js +8 -8
  173. package/dist/react/useMutators.d.ts +11 -11
  174. package/dist/react/useMutators.js +3 -3
  175. package/dist/react/useReactive.js +2 -2
  176. package/dist/react/useSyncStatus.d.ts +4 -6
  177. package/dist/react/useUndoScope.d.ts +7 -9
  178. package/dist/react/useUndoScope.js +1 -1
  179. package/dist/schema/coordination.d.ts +21 -25
  180. package/dist/schema/coordination.js +21 -25
  181. package/dist/schema/ddl.d.ts +43 -39
  182. package/dist/schema/ddl.js +75 -68
  183. package/dist/schema/ddlLock.d.ts +20 -24
  184. package/dist/schema/ddlLock.js +18 -23
  185. package/dist/schema/diff.d.ts +99 -61
  186. package/dist/schema/diff.js +43 -34
  187. package/dist/schema/field.d.ts +37 -42
  188. package/dist/schema/field.js +35 -48
  189. package/dist/schema/generate.d.ts +12 -12
  190. package/dist/schema/generate.js +12 -12
  191. package/dist/schema/index.d.ts +3 -3
  192. package/dist/schema/index.js +21 -23
  193. package/dist/schema/model.d.ts +118 -143
  194. package/dist/schema/model.js +22 -33
  195. package/dist/schema/openapi.d.ts +10 -9
  196. package/dist/schema/openapi.js +5 -3
  197. package/dist/schema/queries.d.ts +29 -31
  198. package/dist/schema/queries.js +23 -25
  199. package/dist/schema/relation.d.ts +89 -99
  200. package/dist/schema/relation.js +13 -13
  201. package/dist/schema/residency.d.ts +16 -13
  202. package/dist/schema/residency.js +16 -13
  203. package/dist/schema/roles.d.ts +36 -43
  204. package/dist/schema/roles.js +31 -37
  205. package/dist/schema/schema.d.ts +64 -43
  206. package/dist/schema/schema.js +31 -32
  207. package/dist/schema/select.d.ts +13 -13
  208. package/dist/schema/select.js +13 -13
  209. package/dist/schema/serialize.d.ts +28 -31
  210. package/dist/schema/serialize.js +27 -31
  211. package/dist/schema/sugar.d.ts +17 -32
  212. package/dist/schema/sugar.js +14 -29
  213. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
  214. package/dist/schema/syncDeltaRow.js +89 -0
  215. package/dist/schema/tenancy.d.ts +44 -46
  216. package/dist/schema/tenancy.js +46 -48
  217. package/dist/server/adapter.d.ts +58 -58
  218. package/dist/server/adapter.js +13 -14
  219. package/dist/server/commit.d.ts +60 -64
  220. package/dist/server/index.d.ts +9 -10
  221. package/dist/server/index.js +1 -1
  222. package/dist/server/readConfig.d.ts +70 -0
  223. package/dist/server/readConfig.js +8 -0
  224. package/dist/server/storageMode.d.ts +23 -0
  225. package/dist/server/storageMode.js +17 -0
  226. package/dist/source/adapter.d.ts +30 -25
  227. package/dist/source/adapter.js +10 -10
  228. package/dist/source/adapters/drizzle.d.ts +28 -23
  229. package/dist/source/adapters/drizzle.js +30 -25
  230. package/dist/source/adapters/kysely.d.ts +27 -25
  231. package/dist/source/adapters/kysely.js +24 -23
  232. package/dist/source/adapters/memory.d.ts +8 -7
  233. package/dist/source/adapters/memory.js +9 -8
  234. package/dist/source/adapters/prisma.d.ts +13 -12
  235. package/dist/source/adapters/prisma.js +22 -25
  236. package/dist/source/conformance.d.ts +18 -11
  237. package/dist/source/conformance.js +17 -11
  238. package/dist/source/connector.d.ts +31 -32
  239. package/dist/source/connector.js +28 -28
  240. package/dist/source/connectorProtocol.d.ts +160 -0
  241. package/dist/source/connectorProtocol.js +162 -0
  242. package/dist/source/contract.d.ts +26 -27
  243. package/dist/source/contract.js +28 -29
  244. package/dist/source/factory.d.ts +46 -58
  245. package/dist/source/factory.js +22 -27
  246. package/dist/source/index.d.ts +7 -9
  247. package/dist/source/index.js +12 -14
  248. package/dist/source/migrations.d.ts +9 -9
  249. package/dist/source/migrations.js +9 -9
  250. package/dist/source/next.d.ts +9 -10
  251. package/dist/source/next.js +6 -7
  252. package/dist/source/pushQueue.d.ts +69 -47
  253. package/dist/source/pushQueue.js +32 -28
  254. package/dist/source/signing.d.ts +46 -17
  255. package/dist/source/signing.js +28 -11
  256. package/dist/source/types.d.ts +121 -104
  257. package/dist/source/types.js +13 -14
  258. package/dist/stores/ObjectStore.d.ts +24 -12
  259. package/dist/stores/ObjectStore.js +38 -16
  260. package/dist/stores/ObjectStoreContract.d.ts +14 -15
  261. package/dist/stores/SyncActionStore.d.ts +7 -11
  262. package/dist/stores/SyncActionStore.js +13 -17
  263. package/dist/surface.d.ts +28 -21
  264. package/dist/surface.js +29 -20
  265. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
  266. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
  267. package/dist/sync/ConnectionManager.d.ts +39 -50
  268. package/dist/sync/ConnectionManager.js +55 -66
  269. package/dist/sync/NetworkProbe.d.ts +24 -29
  270. package/dist/sync/NetworkProbe.js +63 -69
  271. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
  272. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
  273. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
  274. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
  275. package/dist/sync/SyncWebSocket.d.ts +141 -166
  276. package/dist/sync/SyncWebSocket.js +191 -223
  277. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  278. package/dist/sync/awaitClaimGrant.js +11 -11
  279. package/dist/sync/bootstrapApply.d.ts +34 -24
  280. package/dist/sync/bootstrapApply.js +27 -19
  281. package/dist/sync/commitFrames.d.ts +21 -20
  282. package/dist/sync/commitFrames.js +18 -18
  283. package/dist/sync/createClaimStream.d.ts +23 -22
  284. package/dist/sync/createClaimStream.js +105 -23
  285. package/dist/sync/createPresenceStream.d.ts +19 -18
  286. package/dist/sync/createPresenceStream.js +25 -26
  287. package/dist/sync/createSnapshot.d.ts +12 -14
  288. package/dist/sync/createSnapshot.js +20 -26
  289. package/dist/sync/credentialLifecycle.d.ts +104 -104
  290. package/dist/sync/credentialLifecycle.js +140 -147
  291. package/dist/sync/deltaPipeline.d.ts +36 -34
  292. package/dist/sync/deltaPipeline.js +64 -65
  293. package/dist/sync/groupChange.d.ts +63 -61
  294. package/dist/sync/groupChange.js +74 -78
  295. package/dist/sync/heartbeat.d.ts +34 -33
  296. package/dist/sync/heartbeat.js +31 -31
  297. package/dist/sync/participants.d.ts +19 -19
  298. package/dist/sync/persistedPrefix.d.ts +12 -0
  299. package/dist/sync/persistedPrefix.js +22 -0
  300. package/dist/sync/schemas.d.ts +3 -2
  301. package/dist/sync/schemas.js +14 -10
  302. package/dist/sync/syncCursor.d.ts +17 -21
  303. package/dist/sync/syncCursor.js +17 -21
  304. package/dist/sync/syncPlan.d.ts +28 -36
  305. package/dist/sync/syncPlan.js +18 -19
  306. package/dist/sync/syncPosition.d.ts +54 -49
  307. package/dist/sync/syncPosition.js +57 -52
  308. package/dist/sync/wsFrameHandlers.d.ts +35 -36
  309. package/dist/sync/wsFrameHandlers.js +63 -67
  310. package/dist/testing/fixtures/bootstrap.d.ts +12 -6
  311. package/dist/testing/fixtures/bootstrap.js +12 -6
  312. package/dist/testing/fixtures/deltas.d.ts +30 -33
  313. package/dist/testing/fixtures/deltas.js +30 -33
  314. package/dist/testing/fixtures/models.d.ts +11 -10
  315. package/dist/testing/fixtures/models.js +11 -10
  316. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  317. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  318. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
  319. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
  320. package/dist/testing/helpers/wait.d.ts +13 -8
  321. package/dist/testing/helpers/wait.js +13 -8
  322. package/dist/testing/index.d.ts +5 -3
  323. package/dist/testing/index.js +3 -2
  324. package/dist/testing/mocks/FakeDatabase.d.ts +18 -0
  325. package/dist/testing/mocks/FakeDatabase.js +10 -0
  326. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  327. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  328. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  329. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  330. package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
  331. package/dist/testing/mocks/MockSyncContext.js +15 -13
  332. package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
  333. package/dist/testing/mocks/MockSyncStore.js +11 -11
  334. package/dist/testing/mocks/MockWebSocket.d.ts +28 -23
  335. package/dist/testing/mocks/MockWebSocket.js +22 -21
  336. package/dist/transactions/TransactionQueue.d.ts +244 -181
  337. package/dist/transactions/TransactionQueue.js +929 -423
  338. package/dist/transactions/TransactionStore.d.ts +6 -4
  339. package/dist/transactions/TransactionStore.js +6 -4
  340. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  341. package/dist/transactions/UnconfirmedWrites.js +104 -0
  342. package/dist/transactions/coalesceRules.d.ts +41 -17
  343. package/dist/transactions/coalesceRules.js +40 -17
  344. package/dist/transactions/commitEnvelope.d.ts +132 -0
  345. package/dist/transactions/commitEnvelope.js +139 -0
  346. package/dist/transactions/commitOutboxStore.d.ts +32 -0
  347. package/dist/transactions/commitOutboxStore.js +26 -0
  348. package/dist/transactions/commitPayload.d.ts +63 -52
  349. package/dist/transactions/commitPayload.js +54 -57
  350. package/dist/transactions/deltaConfirmation.d.ts +20 -22
  351. package/dist/transactions/deltaConfirmation.js +37 -45
  352. package/dist/transactions/httpCommitEnvelope.d.ts +43 -0
  353. package/dist/transactions/httpCommitEnvelope.js +179 -0
  354. package/dist/transactions/optimisticApply.d.ts +49 -0
  355. package/dist/transactions/optimisticApply.js +65 -0
  356. package/dist/transactions/replayValidation.d.ts +182 -0
  357. package/dist/transactions/replayValidation.js +156 -0
  358. package/dist/types/global.d.ts +46 -41
  359. package/dist/types/global.js +20 -19
  360. package/dist/types/index.d.ts +71 -77
  361. package/dist/types/index.js +22 -22
  362. package/dist/types/modelData.d.ts +6 -8
  363. package/dist/types/modelData.js +5 -7
  364. package/dist/types/participant.d.ts +10 -11
  365. package/dist/types/participant.js +6 -8
  366. package/dist/types/streams.d.ts +208 -195
  367. package/dist/types/streams.js +7 -7
  368. package/dist/utils/asyncIterator.d.ts +25 -32
  369. package/dist/utils/asyncIterator.js +25 -32
  370. package/dist/utils/duration.d.ts +12 -15
  371. package/dist/utils/duration.js +12 -15
  372. package/dist/utils/mobxSetup.d.ts +53 -0
  373. package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
  374. package/dist/webhooks/events.d.ts +21 -16
  375. package/dist/webhooks/events.js +10 -8
  376. package/dist/webhooks/index.d.ts +5 -7
  377. package/dist/webhooks/index.js +5 -7
  378. package/dist/wire/bootstrapReason.d.ts +9 -0
  379. package/dist/wire/bootstrapReason.js +8 -0
  380. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  381. package/dist/wire/delta.js +114 -0
  382. package/dist/wire/errorEnvelope.d.ts +30 -31
  383. package/dist/wire/errorEnvelope.js +34 -40
  384. package/dist/wire/frames.d.ts +315 -86
  385. package/dist/wire/frames.js +47 -33
  386. package/dist/wire/index.d.ts +18 -14
  387. package/dist/wire/index.js +32 -27
  388. package/dist/wire/listEnvelope.d.ts +16 -23
  389. package/dist/wire/listEnvelope.js +7 -6
  390. package/dist/wire/protocol.d.ts +25 -32
  391. package/dist/wire/protocol.js +25 -32
  392. package/dist/wire/protocolVersion.d.ts +44 -40
  393. package/dist/wire/protocolVersion.js +44 -40
  394. package/docs/api.md +10 -10
  395. package/docs/coordination.md +59 -0
  396. package/docs/mcp.md +1 -1
  397. package/package.json +17 -11
  398. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  399. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  400. package/dist/core/query-utils.d.ts +0 -34
  401. package/dist/core/query-utils.js +0 -59
  402. package/dist/schema/sync-delta-row.js +0 -103
  403. package/dist/schema/sync-delta-wire.js +0 -102
  404. package/dist/server/read-config.d.ts +0 -67
  405. package/dist/server/read-config.js +0 -8
  406. package/dist/server/storage-mode.d.ts +0 -8
  407. package/dist/server/storage-mode.js +0 -28
  408. package/dist/source/connector-protocol.d.ts +0 -159
  409. package/dist/source/connector-protocol.js +0 -161
  410. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  411. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  412. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  413. package/dist/transactions/mutation-error-handler.js +0 -39
  414. package/dist/transactions/optimistic.d.ts +0 -24
  415. package/dist/transactions/optimistic.js +0 -45
  416. package/dist/transactions/persistedReplay.d.ts +0 -93
  417. package/dist/transactions/persistedReplay.js +0 -105
  418. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -36,34 +36,35 @@ export type SyncGroup = z.infer<typeof syncGroupSchema>;
36
36
  */
37
37
  export declare function syncGroup(kind: string, id: string): SyncGroup;
38
38
  /**
39
- * Caller-facing input form of a sync group. Accepts a constructor-minted
40
- * {@link SyncGroup}, a contextually-typed template literal of the right shape
41
- * (`` `org:${orgId}` `` checks without importing the constructor), or the
42
- * server-reserved `'default'` anchor. A bare colon-less string is a COMPILE
43
- * error it would subscribe to nothing and fail silently (the `['default']`
44
- * zero-fan-out ghost made flesh).
39
+ * The caller-facing input form of a sync group. Accepts a {@link SyncGroup}
40
+ * from the constructor, a template literal of the right shape
41
+ * (`` `org:${orgId}` `` type-checks without importing the constructor), or the
42
+ * reserved `'default'` anchor. A plain string with no colon is a compile error,
43
+ * because it would match no group and silently subscribe to nothing.
45
44
  */
46
45
  export type SyncGroupInput = SyncGroup | `${string}:${string}` | 'default';
47
46
  /**
48
- * Runtime gate for {@link SyncGroupInput} at parse boundaries (capability
49
- * mint, ephemeral-key mint). One schema, every door a malformed group is
50
- * rejected loudly (`invalid_sync_group`) instead of stored and silently
51
- * subscribed-to-nothing.
47
+ * Runtime validation for {@link SyncGroupInput}, used wherever a group crosses a
48
+ * trust boundary such as minting a capability or an ephemeral key. A malformed
49
+ * group is rejected with `invalid_sync_group` rather than stored and left
50
+ * silently subscribed to nothing.
52
51
  */
53
52
  export declare const syncGroupInputSchema: z.ZodUnion<readonly [z.ZodLiteral<"default">, z.core.$ZodBranded<z.ZodTemplateLiteral<`${string}:${string}`>, "SyncGroup", "out">]>;
54
53
  /** Runtime guard matching {@link SyncGroupInput}. */
55
54
  export declare function isSyncGroupInput(value: unknown): value is SyncGroupInput;
56
55
  /**
57
- * The sync-group kinds the AUTH PROVIDER mints directly onto identities — a
58
- * CLOSED vocabulary: extend this list, never inline a new namespace string.
56
+ * The sync-group kinds the authentication provider mints directly onto an
57
+ * identity. This is a fixed vocabulary: add to this list rather than write a
58
+ * new namespace string inline.
59
59
  *
60
60
  * - `org:<organizationId>` — every member of the organization
61
61
  * - `user:<participantId>` — the participant itself
62
- * - `project:<projectId>` — every credential scoped to the project
63
- * (project axis, 2026-06-11; the org-default project's id IS the org id)
62
+ * - `project:<projectId>` — every credential scoped to the project; the
63
+ * organization's default project shares the organization's id
64
64
  *
65
- * Schema-declared roles ({@link identityRole} / {@link entityRole}) extend the
66
- * vocabulary per app; these are the engine-reserved anchors.
65
+ * Schema-declared roles ({@link identityRole} and {@link entityRole}) extend
66
+ * this vocabulary per application; the kinds here are the ones the engine
67
+ * reserves.
67
68
  */
68
69
  export declare const IDENTITY_ANCHOR_KINDS: readonly ["org", "user", "project"];
69
70
  export type IdentityAnchorKind = (typeof IDENTITY_ANCHOR_KINDS)[number];
@@ -138,20 +139,17 @@ export declare const grantsRefSchema: z.ZodObject<{
138
139
  scope: z.ZodString;
139
140
  }, z.core.$strip>;
140
141
  /**
141
- * The AUTHORING form of a model's sync-group routing — the `groups: { ... }`
142
- * option. One namespaced object collects the three independent routing knobs
143
- * that used to be flat, collision-prone model options (`scope` / `grants` /
144
- * `entityRoles`). Distinct axis from `policy` (tenant isolation): the policy
145
- * decides who may *read* a row, `groups` decides which delta *channels* a row
142
+ * The authoring form of a model's sync-group routing — the `groups: { ... }`
143
+ * option. One object collects the three independent routing controls. This is a
144
+ * separate concern from `policy`, which governs tenant isolation: `policy`
145
+ * decides who may read a row, while `groups` decides which change channels a row
146
146
  * fans into.
147
147
  *
148
- * - `root` — mark this model a scope root; its records form `<kind>:<id>`
149
- * (kind defaults from typename). Was the flat `scope` option — renamed to
150
- * `root` so it no longer collides with the (now removed) `scopedVia` tenancy
151
- * sugar or the inner `grants.scope` relation name.
148
+ * - `root` — marks this model a scope root, so its records form the group
149
+ * `<kind>:<id>` (the kind defaults to the typename).
152
150
  * - `grants` — a membership edge granting an identity access to a scope root.
153
- * - `roles` — explicit non-relational record→group roles (e.g. inbox fan-out
154
- * keyed on a plain field). Was `entityRoles`. Accepts one role or an array.
151
+ * - `roles` — record-to-group roles keyed on a plain field rather than a
152
+ * relation, such as inbox fan-out. Accepts a single role or an array.
155
153
  */
156
154
  export declare const groupsInputSchema: z.ZodObject<{
157
155
  root: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
@@ -230,24 +228,19 @@ export declare function composeEntitySyncGroups(record: EntityContext, def: {
230
228
  readonly entityRoles?: readonly EntityRole[];
231
229
  }): readonly SyncGroup[];
232
230
  /**
233
- * Apply capability-style intersection to a client-requested sync-group
234
- * set. Mirrors the cap-bearer path where Biscuit caveats narrow the
235
- * client's requested set to what's actually authorized. Fully generic
236
- * it never inspects the group strings — so it lives here beside the
237
- * composition helpers rather than in any product schema package
238
- * (`@ablo/schema` re-exports it for compat).
231
+ * Narrow a client's requested sync-group set to the groups it is actually
232
+ * allowed to subscribe to. This helper is fully generic it never inspects the
233
+ * group strings so it lives beside the composition helpers above.
239
234
  *
240
235
  * Behaviour:
241
- * - If the client requested no groups, return the full identity-
242
- * derived set (the default subscription scope for this participant).
243
- * - If the client requested a non-empty subset, intersect against the
244
- * identity-derived allowed set drop any group the participant is
245
- * not authorized to subscribe to. Logs the dropped groups via the
246
- * optional `logDropped` callback for observability.
247
- * - If the intersection is empty after filtering, fall back to the
248
- * full allowed set rather than emit `[]` (which would degenerate to
249
- * the server-side `['default']` fallback and produce silent zero-
250
- * delta delivery).
236
+ * - If the client requested no groups, return the full identity-derived set,
237
+ * which is this participant's default subscription scope.
238
+ * - If the client requested some groups, keep only those that appear in the
239
+ * identity-derived allowed set and drop the rest, reporting the dropped
240
+ * groups through the optional `logDropped` callback.
241
+ * - If nothing survives the filter, fall back to the full allowed set rather
242
+ * than return `[]`, which would otherwise collapse to the server-side
243
+ * `'default'` fallback and deliver no changes at all.
251
244
  */
252
245
  export declare function intersectRequestedWithAllowed(args: {
253
246
  readonly requested: readonly string[];
@@ -40,10 +40,10 @@ export function syncGroup(kind, id) {
40
40
  return `${kind}:${id}`;
41
41
  }
42
42
  /**
43
- * Runtime gate for {@link SyncGroupInput} at parse boundaries (capability
44
- * mint, ephemeral-key mint). One schema, every door a malformed group is
45
- * rejected loudly (`invalid_sync_group`) instead of stored and silently
46
- * subscribed-to-nothing.
43
+ * Runtime validation for {@link SyncGroupInput}, used wherever a group crosses a
44
+ * trust boundary such as minting a capability or an ephemeral key. A malformed
45
+ * group is rejected with `invalid_sync_group` rather than stored and left
46
+ * silently subscribed to nothing.
47
47
  */
48
48
  export const syncGroupInputSchema = z.union([z.literal('default'), syncGroupSchema]);
49
49
  /** Runtime guard matching {@link SyncGroupInput}. */
@@ -52,16 +52,18 @@ export function isSyncGroupInput(value) {
52
52
  }
53
53
  // ── Identity anchors (closed vocabulary) ────────────────────────────────────
54
54
  /**
55
- * The sync-group kinds the AUTH PROVIDER mints directly onto identities — a
56
- * CLOSED vocabulary: extend this list, never inline a new namespace string.
55
+ * The sync-group kinds the authentication provider mints directly onto an
56
+ * identity. This is a fixed vocabulary: add to this list rather than write a
57
+ * new namespace string inline.
57
58
  *
58
59
  * - `org:<organizationId>` — every member of the organization
59
60
  * - `user:<participantId>` — the participant itself
60
- * - `project:<projectId>` — every credential scoped to the project
61
- * (project axis, 2026-06-11; the org-default project's id IS the org id)
61
+ * - `project:<projectId>` — every credential scoped to the project; the
62
+ * organization's default project shares the organization's id
62
63
  *
63
- * Schema-declared roles ({@link identityRole} / {@link entityRole}) extend the
64
- * vocabulary per app; these are the engine-reserved anchors.
64
+ * Schema-declared roles ({@link identityRole} and {@link entityRole}) extend
65
+ * this vocabulary per application; the kinds here are the ones the engine
66
+ * reserves.
65
67
  */
66
68
  export const IDENTITY_ANCHOR_KINDS = ['org', 'user', 'project'];
67
69
  /** Mint an engine-reserved identity anchor (typed wrapper over {@link syncGroup}). */
@@ -113,20 +115,17 @@ export const grantsRefSchema = z.object({
113
115
  scope: z.string().regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/, 'grants.scope must name a relation'),
114
116
  });
115
117
  /**
116
- * The AUTHORING form of a model's sync-group routing — the `groups: { ... }`
117
- * option. One namespaced object collects the three independent routing knobs
118
- * that used to be flat, collision-prone model options (`scope` / `grants` /
119
- * `entityRoles`). Distinct axis from `policy` (tenant isolation): the policy
120
- * decides who may *read* a row, `groups` decides which delta *channels* a row
118
+ * The authoring form of a model's sync-group routing — the `groups: { ... }`
119
+ * option. One object collects the three independent routing controls. This is a
120
+ * separate concern from `policy`, which governs tenant isolation: `policy`
121
+ * decides who may read a row, while `groups` decides which change channels a row
121
122
  * fans into.
122
123
  *
123
- * - `root` — mark this model a scope root; its records form `<kind>:<id>`
124
- * (kind defaults from typename). Was the flat `scope` option — renamed to
125
- * `root` so it no longer collides with the (now removed) `scopedVia` tenancy
126
- * sugar or the inner `grants.scope` relation name.
124
+ * - `root` — marks this model a scope root, so its records form the group
125
+ * `<kind>:<id>` (the kind defaults to the typename).
127
126
  * - `grants` — a membership edge granting an identity access to a scope root.
128
- * - `roles` — explicit non-relational record→group roles (e.g. inbox fan-out
129
- * keyed on a plain field). Was `entityRoles`. Accepts one role or an array.
127
+ * - `roles` — record-to-group roles keyed on a plain field rather than a
128
+ * relation, such as inbox fan-out. Accepts a single role or an array.
130
129
  */
131
130
  export const groupsInputSchema = z.object({
132
131
  root: scopeSchema.optional(),
@@ -198,24 +197,19 @@ export function composeEntitySyncGroups(record, def) {
198
197
  return Array.from(out);
199
198
  }
200
199
  /**
201
- * Apply capability-style intersection to a client-requested sync-group
202
- * set. Mirrors the cap-bearer path where Biscuit caveats narrow the
203
- * client's requested set to what's actually authorized. Fully generic
204
- * it never inspects the group strings — so it lives here beside the
205
- * composition helpers rather than in any product schema package
206
- * (`@ablo/schema` re-exports it for compat).
200
+ * Narrow a client's requested sync-group set to the groups it is actually
201
+ * allowed to subscribe to. This helper is fully generic it never inspects the
202
+ * group strings so it lives beside the composition helpers above.
207
203
  *
208
204
  * Behaviour:
209
- * - If the client requested no groups, return the full identity-
210
- * derived set (the default subscription scope for this participant).
211
- * - If the client requested a non-empty subset, intersect against the
212
- * identity-derived allowed set drop any group the participant is
213
- * not authorized to subscribe to. Logs the dropped groups via the
214
- * optional `logDropped` callback for observability.
215
- * - If the intersection is empty after filtering, fall back to the
216
- * full allowed set rather than emit `[]` (which would degenerate to
217
- * the server-side `['default']` fallback and produce silent zero-
218
- * delta delivery).
205
+ * - If the client requested no groups, return the full identity-derived set,
206
+ * which is this participant's default subscription scope.
207
+ * - If the client requested some groups, keep only those that appear in the
208
+ * identity-derived allowed set and drop the rest, reporting the dropped
209
+ * groups through the optional `logDropped` callback.
210
+ * - If nothing survives the filter, fall back to the full allowed set rather
211
+ * than return `[]`, which would otherwise collapse to the server-side
212
+ * `'default'` fallback and deliver no changes at all.
219
213
  */
220
214
  export function intersectRequestedWithAllowed(args) {
221
215
  const { requested, allowed, logDropped } = args;
@@ -48,17 +48,16 @@ export interface DefineSchemaOptions {
48
48
  */
49
49
  readonly casing?: Casing;
50
50
  /**
51
- * Identity-anchored sync-group roles. Server's
52
- * `composeIdentitySyncGroups` iterates these to build the
53
- * participant's allowed-set, replacing the prior hardcoded
54
- * `org:/user:/team:` triad in `@ablo/schema`. See {@link IdentityRole}
55
- * for the open-registration shape — no closed enum, consumer fully
56
- * controls both the template string and the extractor function.
51
+ * Identity-anchored sync-group roles. The server's
52
+ * `composeIdentitySyncGroups` reads these to build the set of groups a
53
+ * participant may subscribe to. See {@link IdentityRole} for the shape: you
54
+ * define the `kind` and which identity field supplies the id, with no fixed
55
+ * vocabulary of kinds.
57
56
  *
58
- * Leave unset for schemas that don't need identity-derived scoping
59
- * (e.g. fully public read models). When unset, `composeIdentitySyncGroups`
60
- * returns `[]` and consumers fall back to whatever explicit
61
- * `syncGroups` the AuthProvider attaches to the Identity.
57
+ * Leave this unset for schemas that need no identity-derived scoping, such as
58
+ * fully public read models. When it is unset, `composeIdentitySyncGroups`
59
+ * returns `[]` and callers fall back to whatever explicit sync groups the
60
+ * authentication provider attached to the identity.
62
61
  */
63
62
  readonly identityRoles?: readonly IdentityRole[];
64
63
  }
@@ -79,20 +78,20 @@ export declare const baseFieldsSchema: z.ZodObject<{
79
78
  createdBy: z.ZodOptional<z.ZodString>;
80
79
  }, z.core.$strip>;
81
80
  /**
82
- * The base-column names every model carries automatically (the keys of
83
- * {@link baseFieldsSchema}). The single source of truth — `generate.ts`
84
- * imports this to avoid double-emitting a redeclared base column, and the
85
- * `defineSchema` field loop uses it to reject a model that tries to redeclare
86
- * one (Zod `.merge` would otherwise silently overwrite the base field with the
87
- * user's, producing a `string & Date` type that breaks the build).
81
+ * The base-column names every model carries automatically the keys of
82
+ * {@link baseFieldsSchema}, kept here as the single source of truth. Code
83
+ * generation reads it to avoid emitting a base column twice, and
84
+ * {@link defineSchema} uses it to reject a model that redeclares one, since
85
+ * merging the user's field over the base field would produce a `string & Date`
86
+ * type and break the build.
88
87
  */
89
88
  export declare const BASE_FIELDS: readonly ["id", "createdAt", "updatedAt", "organizationId", "createdBy"];
90
89
  /** The base fields type — pure data columns. */
91
90
  export type BaseModelFields = z.infer<typeof baseFieldsSchema>;
92
91
  /**
93
- * Methods every dynamic model class inherits from `Model`. Intersected
94
- * into `InferModel` (the read-side type) but NOT into `InferCreate` /
95
- * `UpdatePatch` methods aren't legal create/update inputs.
92
+ * Methods every model instance carries. These are intersected into
93
+ * {@link InferModel}, the read-side type, but not into the create or update
94
+ * input types, since methods are not valid input.
96
95
  */
97
96
  export interface BaseModelMethods {
98
97
  /** Wire-format model name (e.g. `'Slide'`, `'Comment'`). */
@@ -130,43 +129,71 @@ type RegisteredSchema = import('../types/global.js').Register extends {
130
129
  Schema: infer S extends Schema;
131
130
  } ? S : never;
132
131
  /**
133
- * THE model type helper. With the scaffold's `ablo/register.ts` registration
134
- * in place, one parameter is all it takes:
132
+ * The primary model-type helper. Once your project's `ablo/register.ts`
133
+ * registers the schema, a single argument is all it takes:
135
134
  *
136
135
  * ```ts
137
136
  * type Task = Model<'tasks'>;
138
137
  * ```
139
138
  *
140
- * Without registration (or for a second schema), pass the schema explicitly:
141
- * `Model<typeof schema, 'tasks'>`.
139
+ * Without that registration, or for a second schema, pass the schema
140
+ * explicitly: `Model<typeof schema, 'tasks'>`.
142
141
  */
143
142
  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;
144
143
  /**
145
- * @deprecated Use {@link Model} — `type Task = Model<typeof schema, 'tasks'>`
146
- * reads as the domain ("the Task model from my schema"), not the machinery.
147
- * Drizzle deprecated its own `InferModel` for the same reason. Kept as an
148
- * alias; no behavior difference.
144
+ * @deprecated Use {@link Model} instead — `Model<typeof schema, 'tasks'>` reads
145
+ * as the domain ("the Task model from my schema") rather than the machinery.
146
+ * Kept as an alias with no behavioral difference.
149
147
  */
150
148
  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
151
149
  Omit<z.infer<z.ZodObject<Shape>>, keyof BaseModelFields> & BaseModelFields & BaseModelMethods & InferComputed<C> & InferRelations<S, R> : never;
152
150
  /**
153
- * Infer relation accessor types from a model's relations record.
151
+ * Infer the relation accessor types from a model's relations record.
154
152
  *
155
- * The dynamic class installs prototype getters for each declared relation in
156
- * `createSyncEngine.ts` (`hasMany` `store.getByForeignKey(...)`, `belongsTo`
157
- * → pool lookup by FK). This type mirrors those installations so callers can
158
- * write `slide.layers` and `slide.deck` without manual casts.
153
+ * At runtime the engine installs a getter for each declared relation, so this
154
+ * type mirrors them and you can read `slide.layers` and `slide.deck` without a
155
+ * cast.
159
156
  *
160
157
  * - `hasMany` → `InferModel<S, Target>[]`
161
158
  * - `belongsTo` / `hasOne` → `InferModel<S, Target> | undefined` (undefined
162
- * when the FK is unset or the parent isn't in the pool yet)
159
+ * when the foreign key is unset or the parent has not loaded yet)
163
160
  *
164
- * Kept as `readonly` because the accessors are prototype-level getters with
165
- * no setter — writing to `slide.layers = [...]` would be a no-op at runtime.
161
+ * Kept `readonly` because the accessors are getters with no setter — assigning
162
+ * to `slide.layers` would have no effect at runtime.
166
163
  */
167
164
  export type InferRelations<S extends Schema, R extends RelationRecord> = string extends keyof R ? unknown : {
168
- readonly [K in keyof R]: R[K] extends RelationDef<infer Type, infer Target, infer _F, infer _O> ? Target extends keyof S['models'] ? Type extends 'hasMany' ? InferModel<S, Target>[] : Type extends 'hasOne' | 'belongsTo' ? InferModel<S, Target> | undefined : never : never : never;
165
+ 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;
169
166
  };
167
+ /**
168
+ * The row shape a reactive read returns: the model's data fields, base fields,
169
+ * and schema computed getters — WITHOUT relation accessors and WITHOUT model
170
+ * methods. Derived from the model definition, exactly like {@link InferModel},
171
+ * mirroring what `toReactiveSnapshot()` produces at runtime.
172
+ *
173
+ * Relations (`hasMany` / `belongsTo`) are store-backed getters that exist only
174
+ * on the pool's model instances, so a reactive row honestly omits them —
175
+ * reading `row.layers` is a compile error instead of a silent `undefined`.
176
+ * Compose relations through a selector or hook instead.
177
+ *
178
+ * The same pairing other data layers converged on: Zero's data-only `Row<...>`
179
+ * with relations added per-query, Prisma's scalar-only model types with
180
+ * `GetPayload<{ include }>`, mobx-state-tree's `Instance<T>` / `SnapshotOut<T>`.
181
+ */
182
+ 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.
183
+ Omit<z.infer<z.ZodObject<Shape>>, keyof BaseModelFields> & BaseModelFields & InferComputed<C> : never;
184
+ /**
185
+ * The reactive-row companion to {@link Model}. Once your project's
186
+ * `ablo/register.ts` registers the schema, a single argument is all it takes:
187
+ *
188
+ * ```ts
189
+ * type SlideRow = Row<'slides'>; // data fields + computeds, no relations
190
+ * type Slide = Model<'slides'>; // the pool's model instance
191
+ * ```
192
+ *
193
+ * Without that registration, or for a second schema, pass the schema
194
+ * explicitly: `Row<typeof schema, 'slides'>`.
195
+ */
196
+ 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;
170
197
  /**
171
198
  * Infer the return types of computed getters.
172
199
  * Maps each computed function's return type into a readonly property.
@@ -202,9 +229,7 @@ Omit<z.input<z.ZodObject<Shape>>, keyof BaseModelFields> & Partial<BaseModelFiel
202
229
  export type InferModelNames<S extends Schema> = keyof S['models'] & string;
203
230
  /**
204
231
  * The value type for inserting a new row. Same shape as {@link InferCreate}:
205
- * consumer-writable fields + optional `id` for client-generated IDs.
206
- *
207
- * Matches Zero's `InsertValue<TableSchema>` from `zql/src/mutate/crud.ts`.
232
+ * the fields you can write, plus an optional `id` for client-generated ids.
208
233
  */
209
234
  export type InsertValue<S extends Schema, ModelName extends keyof S['models']> = InferCreate<S, ModelName>;
210
235
  /**
@@ -217,16 +242,12 @@ export type UpsertValue<S extends Schema, ModelName extends keyof S['models']> =
217
242
  * The value type for updating an existing row. `id` is required (identifies
218
243
  * the row to update); all other fields are optional (only provided fields
219
244
  * are changed).
220
- *
221
- * Matches Zero's `UpdateValue<TableSchema>` from `zql/src/mutate/crud.ts`.
222
245
  */
223
246
  export type UpdateValue<S extends Schema, ModelName extends keyof S['models']> = S['models'][ModelName] extends ModelDef<infer Shape> ? {
224
247
  id: string;
225
248
  } & Partial<z.input<z.ZodObject<Shape>>> : never;
226
249
  /**
227
250
  * The value type for deleting a row. Just the primary key.
228
- *
229
- * Matches Zero's `DeleteID<TableSchema>` from `zql/src/mutate/crud.ts`.
230
251
  */
231
252
  export interface DeleteId<S extends Schema, ModelName extends keyof S['models']> {
232
253
  id: string;
@@ -22,9 +22,9 @@
22
22
  import { z } from 'zod';
23
23
  import { AbloValidationError } from '../errors.js';
24
24
  import { scopeSchema, grantsRefSchema } from './roles.js';
25
- // Sync-group roles (identity + entity) live in `./roles.js`. Re-exported here
26
- // so the long-standing `@ablo/schema` / `./schema.js` import paths keep working
27
- // after the rehome — see roles.ts for the full vocabulary.
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
28
  export { identityRole, entityRole, extractIdentityIds, extractEntityIds, composeIdentitySyncGroups, composeEntitySyncGroups, intersectRequestedWithAllowed, syncGroup, syncGroupSchema, syncGroupInputSchema, isSyncGroupInput, identityRoleSchema, entityRoleSchema, roleSchema, roleSourceSchema, scopeSchema, grantsRefSchema, groupsInputSchema, } from './roles.js';
29
29
  function resolveCasing(fn) {
30
30
  if (fn === undefined)
@@ -38,9 +38,9 @@ function resolveCasing(fn) {
38
38
  return (x) => x;
39
39
  }
40
40
  }
41
- /** Pure camelCase snake_case. Matches postgres.fromCamel semantics but
42
- * kept local so the SDK stays free of any driver dependency — consumers
43
- * using Prisma/Drizzle/raw pg should all get the same result. */
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
44
  function camelToSnake(identifier) {
45
45
  return identifier.replace(/[A-Z]/g, (ch) => `_${ch.toLowerCase()}`);
46
46
  }
@@ -59,12 +59,12 @@ export const baseFieldsSchema = z.object({
59
59
  createdBy: z.string().optional(),
60
60
  });
61
61
  /**
62
- * The base-column names every model carries automatically (the keys of
63
- * {@link baseFieldsSchema}). The single source of truth — `generate.ts`
64
- * imports this to avoid double-emitting a redeclared base column, and the
65
- * `defineSchema` field loop uses it to reject a model that tries to redeclare
66
- * one (Zod `.merge` would otherwise silently overwrite the base field with the
67
- * user's, producing a `string & Date` type that breaks the build).
62
+ * The base-column names every model carries automatically the keys of
63
+ * {@link baseFieldsSchema}, kept here as the single source of truth. Code
64
+ * generation reads it to avoid emitting a base column twice, and
65
+ * {@link defineSchema} uses it to reject a model that redeclares one, since
66
+ * merging the user's field over the base field would produce a `string & Date`
67
+ * type and break the build.
68
68
  */
69
69
  export const BASE_FIELDS = [
70
70
  'id',
@@ -85,22 +85,21 @@ export const BASE_FIELDS = [
85
85
  * ```
86
86
  */
87
87
  /**
88
- * Lowercase-first camelCase round-trip check. Must match the convention used
89
- * by `postgres.camel` in the client driver (porsager/postgres), which is:
88
+ * Rejects field names that will not survive the sync driver's snake_case ↔
89
+ * camelCase round-trip. The driver maps identifiers like this:
90
90
  *
91
- * `content_json` → `contentJson` (snake → camel)
92
- * `contentJson` → `content_json` (camel → snake)
93
- * `contentJSON` → `content_j_s_o_n` (BROKEN doesn't round-trip)
91
+ * `content_json` → `contentJson` (snake → camel)
92
+ * `contentJson` → `content_json` (camel → snake)
93
+ * `contentJSON` → `content_j_s_o_n` (does not round-trip)
94
94
  *
95
- * Any field name that doesn't round-trip under this pair of transforms will
96
- * silently fail to populate on the client: the wire delivers one casing,
97
- * the dynamic class's constructor reads another, and the field lands as
98
- * `undefined`. We catch it here so schema authors see an error at
99
- * definition time rather than at runtime.
95
+ * A name that does not round-trip through this pair of transforms will silently
96
+ * fail to populate on the client: the wire delivers one casing, the model reads
97
+ * another, and the field lands as `undefined`. Catching it here surfaces the
98
+ * problem when the schema is defined rather than at runtime.
100
99
  *
101
- * Rule: a standard camelCase identifier has runs of one uppercase letter
102
- * followed by lowercase letters never two consecutive uppercase letters.
103
- * `contentJSON` has `JSON` all-uppercase, so we reject it.
100
+ * The rule: a standard camelCase identifier has runs of a single uppercase
101
+ * letter followed by lowercase letters, never two uppercase letters in a row.
102
+ * `contentJSON` has `JSON` in all caps, so it is rejected.
104
103
  */
105
104
  function assertRoundTrippableCamelCase(modelName, fieldName) {
106
105
  // Base fields merged in by defineSchema are already validated; skip.
@@ -135,9 +134,9 @@ function assertRoundTrippableCamelCase(modelName, fieldName) {
135
134
  }
136
135
  export function defineSchema(models, options) {
137
136
  // Build validators with base fields merged in, and resolve defaults for
138
- // `typename` and `persist.store` so downstream code (the generic loader,
139
- // the hydration pipeline, the Go named-query registry) can rely on these
140
- // fields being set without re-deriving them at every call site.
137
+ // `typename` and `persist.store` so downstream code (the loader and the
138
+ // hydration pipeline) can rely on these fields being set without re-deriving
139
+ // them at every call site.
141
140
  //
142
141
  // Defaults:
143
142
  // typename ← schema key (e.g. `slideLayer` → `'slideLayer'`)
@@ -211,10 +210,10 @@ export function defineSchema(models, options) {
211
210
  };
212
211
  }
213
212
  /**
214
- * Validate the relation-driven sync-group declarations (`scope` / `grants`)
215
- * at schema-build time, so a mistyped membership edge fails *here* — with a
216
- * Stripe-shaped error (`code` + `param` + `doc_url`) pointing at the exact
217
- * declaration — instead of silently mis-routing deltas at runtime.
213
+ * Validates the relation-driven sync-group declarations (`scope` and `grants`)
214
+ * at schema-build time, so a mistyped membership edge fails here — with a
215
+ * structured error (`code`, `param`, `doc_url`) pointing at the exact
216
+ * declaration — rather than silently mis-routing changes at runtime.
218
217
  */
219
218
  function validateSyncGroupSchema(models) {
220
219
  for (const [name, def] of Object.entries(models)) {
@@ -1,25 +1,25 @@
1
1
  /**
2
- * `selectModels` project a schema down to a subset of its models.
2
+ * `selectModels` projects a schema down to a subset of its models.
3
3
  *
4
- * The Prisma-style "one canonical schema, each app selects what it needs"
5
- * primitive. Instead of re-declaring a model's fields in a second schema (which
6
- * must then be kept shape-identical by hand), an app picks the models it
7
- * subscribes to from the canonical schema. Field shapes, resolved FK columns,
8
- * computeds, typenames, and identity roles all come from the source — so a
9
- * subset is structurally incapable of drifting from the canonical definition.
4
+ * It lets one canonical schema serve several apps, each subscribing only to the
5
+ * models it needs. Rather than re-declare a model's fields in a second schema
6
+ * which you would then have to keep identical by hand an app selects the
7
+ * models it wants from the canonical schema. Field shapes, resolved foreign-key
8
+ * columns, computed getters, typenames, and identity roles all come from the
9
+ * source, so a subset cannot drift from the canonical definition.
10
10
  *
11
11
  * ```ts
12
- * import { schema as full } from '@ablo/schema';
12
+ * import { schema as full } from './schema';
13
13
  * import { selectModels } from '@abloatai/ablo/schema';
14
14
  *
15
- * // Vault subscribes to identity + dataroom content only.
15
+ * // Subscribe to identity and dataroom content only.
16
16
  * export const schema = selectModels(full, ['users', 'organizations', 'datarooms', 'folders', 'files']);
17
17
  * ```
18
18
  *
19
- * Relations whose target falls outside the selected set are dropped the
20
- * subset only sees its own models. A dropped relation that carries `parent`
21
- * scope-inheritance throws instead: silently losing it would mis-route a
22
- * record's fan-out, so the selected set must be closed under `parent` edges.
19
+ * Relations whose target falls outside the selected set are dropped, so the
20
+ * subset sees only its own models. Dropping a relation that carries `parent`
21
+ * scope-inheritance throws instead, because silently losing it would mis-route
22
+ * a record's fan-out the selected set must be closed under `parent` edges.
23
23
  */
24
24
  import type { Schema, SchemaRecord } from './schema.js';
25
25
  export declare function selectModels<S extends SchemaRecord, K extends keyof S & string>(schema: Schema<S>, keys: readonly K[]): Schema<Pick<S, K>>;
@@ -1,25 +1,25 @@
1
1
  /**
2
- * `selectModels` project a schema down to a subset of its models.
2
+ * `selectModels` projects a schema down to a subset of its models.
3
3
  *
4
- * The Prisma-style "one canonical schema, each app selects what it needs"
5
- * primitive. Instead of re-declaring a model's fields in a second schema (which
6
- * must then be kept shape-identical by hand), an app picks the models it
7
- * subscribes to from the canonical schema. Field shapes, resolved FK columns,
8
- * computeds, typenames, and identity roles all come from the source — so a
9
- * subset is structurally incapable of drifting from the canonical definition.
4
+ * It lets one canonical schema serve several apps, each subscribing only to the
5
+ * models it needs. Rather than re-declare a model's fields in a second schema
6
+ * which you would then have to keep identical by hand an app selects the
7
+ * models it wants from the canonical schema. Field shapes, resolved foreign-key
8
+ * columns, computed getters, typenames, and identity roles all come from the
9
+ * source, so a subset cannot drift from the canonical definition.
10
10
  *
11
11
  * ```ts
12
- * import { schema as full } from '@ablo/schema';
12
+ * import { schema as full } from './schema';
13
13
  * import { selectModels } from '@abloatai/ablo/schema';
14
14
  *
15
- * // Vault subscribes to identity + dataroom content only.
15
+ * // Subscribe to identity and dataroom content only.
16
16
  * export const schema = selectModels(full, ['users', 'organizations', 'datarooms', 'folders', 'files']);
17
17
  * ```
18
18
  *
19
- * Relations whose target falls outside the selected set are dropped the
20
- * subset only sees its own models. A dropped relation that carries `parent`
21
- * scope-inheritance throws instead: silently losing it would mis-route a
22
- * record's fan-out, so the selected set must be closed under `parent` edges.
19
+ * Relations whose target falls outside the selected set are dropped, so the
20
+ * subset sees only its own models. Dropping a relation that carries `parent`
21
+ * scope-inheritance throws instead, because silently losing it would mis-route
22
+ * a record's fan-out the selected set must be closed under `parent` edges.
23
23
  */
24
24
  import { AbloValidationError } from '../errors.js';
25
25
  export function selectModels(schema, keys) {