@abloatai/ablo 0.34.1 → 0.36.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 (536) hide show
  1. package/AGENTS.md +2 -1
  2. package/CHANGELOG.md +758 -5
  3. package/README.md +56 -502
  4. package/bin/ablo.cjs +39 -0
  5. package/dist/BaseSyncedStore.d.ts +176 -48
  6. package/dist/BaseSyncedStore.js +346 -214
  7. package/dist/Database.d.ts +17 -44
  8. package/dist/Database.js +96 -79
  9. package/dist/InstanceCache.d.ts +31 -6
  10. package/dist/InstanceCache.js +65 -30
  11. package/dist/LazyReferenceCollection.d.ts +3 -3
  12. package/dist/LazyReferenceCollection.js +4 -4
  13. package/dist/Model.d.ts +23 -13
  14. package/dist/Model.js +27 -17
  15. package/dist/ModelRegistry.d.ts +8 -4
  16. package/dist/ModelRegistry.js +20 -18
  17. package/dist/NetworkMonitor.d.ts +3 -1
  18. package/dist/NetworkMonitor.js +7 -5
  19. package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
  20. package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
  21. package/dist/SyncClient.d.ts +47 -47
  22. package/dist/SyncClient.js +215 -156
  23. package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
  24. package/dist/ai-sdk/coordinatedTool.js +1 -1
  25. package/dist/ai-sdk/coordinationContext.d.ts +2 -2
  26. package/dist/ai-sdk/coordinationContext.js +1 -1
  27. package/dist/ai-sdk/wrap.d.ts +3 -3
  28. package/dist/ai-sdk/wrap.js +2 -2
  29. package/dist/auth/index.d.ts +1 -156
  30. package/dist/auth/index.js +8 -301
  31. package/dist/client/Ablo.d.ts +42 -287
  32. package/dist/client/Ablo.js +129 -963
  33. package/dist/client/abloClient.d.ts +309 -0
  34. package/dist/client/abloClient.js +13 -0
  35. package/dist/client/clientPrelude.d.ts +52 -0
  36. package/dist/client/clientPrelude.js +60 -0
  37. package/dist/client/consoleLogger.d.ts +2 -2
  38. package/dist/client/coreClient.d.ts +60 -0
  39. package/dist/client/coreClient.js +118 -0
  40. package/dist/client/createInternalComponents.d.ts +8 -4
  41. package/dist/client/createInternalComponents.js +17 -10
  42. package/dist/client/createModelProxy.d.ts +98 -373
  43. package/dist/client/createModelProxy.js +233 -139
  44. package/dist/client/humans.d.ts +69 -0
  45. package/dist/client/humans.js +78 -0
  46. package/dist/client/modelRegistration.d.ts +1 -1
  47. package/dist/client/modelRegistration.js +9 -9
  48. package/dist/client/options.d.ts +73 -17
  49. package/dist/client/reactiveEngine.d.ts +53 -0
  50. package/dist/client/reactiveEngine.js +688 -0
  51. package/dist/client/resourceTypes.d.ts +9 -250
  52. package/dist/client/resourceTypes.js +8 -5
  53. package/dist/client/schemaConfig.d.ts +4 -4
  54. package/dist/client/schemaConfig.js +6 -2
  55. package/dist/client/storeCluster.d.ts +47 -0
  56. package/dist/client/storeCluster.js +118 -0
  57. package/dist/client/storeLifecycle.d.ts +61 -0
  58. package/dist/client/storeLifecycle.js +231 -0
  59. package/dist/client/validateAbloOptions.d.ts +3 -2
  60. package/dist/client/validateAbloOptions.js +1 -1
  61. package/dist/client/wsMutationExecutor.d.ts +3 -3
  62. package/dist/client/wsMutationExecutor.js +3 -3
  63. package/dist/context.d.ts +22 -9
  64. package/dist/context.js +33 -9
  65. package/dist/coordination/ClaimLog.d.ts +26 -0
  66. package/dist/coordination/ClaimLog.js +32 -0
  67. package/dist/coordination/index.d.ts +1 -15
  68. package/dist/coordination/index.js +8 -31
  69. package/dist/core/index.d.ts +3 -3
  70. package/dist/core/index.js +2 -2
  71. package/dist/docs/catalog.d.ts +72 -0
  72. package/dist/docs/catalog.js +230 -0
  73. package/dist/docs/index.d.ts +10 -0
  74. package/dist/docs/index.js +10 -0
  75. package/dist/environment.d.ts +1 -40
  76. package/dist/environment.js +8 -37
  77. package/dist/index.d.ts +44 -36
  78. package/dist/index.js +30 -22
  79. package/dist/interfaces/index.d.ts +44 -134
  80. package/dist/keys/index.d.ts +1 -77
  81. package/dist/keys/index.js +8 -190
  82. package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
  83. package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
  84. package/dist/mutators/Transaction.d.ts +1 -1
  85. package/dist/mutators/Transaction.js +1 -1
  86. package/dist/mutators/UndoManager.d.ts +6 -6
  87. package/dist/mutators/UndoManager.js +5 -5
  88. package/dist/mutators/defineMutators.d.ts +3 -3
  89. package/dist/mutators/defineMutators.js +1 -1
  90. package/dist/mutators/inverseOp.js +2 -2
  91. package/dist/mutators/mutateActions.d.ts +3 -3
  92. package/dist/mutators/mutateActions.js +1 -1
  93. package/dist/mutators/readerActions.d.ts +1 -1
  94. package/dist/mutators/undoApply.d.ts +1 -1
  95. package/dist/mutators/undoApply.js +1 -1
  96. package/dist/policy/index.d.ts +2 -2
  97. package/dist/policy/index.js +1 -1
  98. package/dist/query/client.d.ts +5 -2
  99. package/dist/query/client.js +10 -9
  100. package/dist/query/types.d.ts +6 -41
  101. package/dist/query/types.js +2 -2
  102. package/dist/react/AbloProvider.d.ts +18 -8
  103. package/dist/react/AbloProvider.js +10 -9
  104. package/dist/react/context.d.ts +3 -3
  105. package/dist/react/context.js +1 -1
  106. package/dist/react/createAbloReact.d.ts +56 -0
  107. package/dist/react/createAbloReact.js +51 -0
  108. package/dist/react/index.d.ts +6 -5
  109. package/dist/react/index.js +6 -3
  110. package/dist/react/internalContext.d.ts +1 -1
  111. package/dist/react/useAblo.d.ts +12 -5
  112. package/dist/react/useAblo.js +26 -8
  113. package/dist/react/useCurrentUserId.js +1 -1
  114. package/dist/react/useErrorListener.js +1 -1
  115. package/dist/react/useMutationFailureListener.d.ts +2 -2
  116. package/dist/react/useMutationFailureListener.js +1 -1
  117. package/dist/react/useMutators.d.ts +3 -3
  118. package/dist/react/useMutators.js +3 -3
  119. package/dist/react/useUndoScope.d.ts +5 -5
  120. package/dist/react/useUndoScope.js +1 -1
  121. package/dist/schema/coordination.d.ts +69 -10
  122. package/dist/schema/coordination.js +90 -9
  123. package/dist/schema/ddl.js +2 -2
  124. package/dist/schema/diff.d.ts +1 -1
  125. package/dist/schema/generate.js +1 -1
  126. package/dist/schema/index.d.ts +11 -10
  127. package/dist/schema/index.js +22 -18
  128. package/dist/schema/queries.d.ts +27 -27
  129. package/dist/schema/queries.js +23 -23
  130. package/dist/schema/select.d.ts +3 -3
  131. package/dist/schema/select.js +6 -3
  132. package/dist/schema/serialize.d.ts +15 -6
  133. package/dist/schema/serialize.js +20 -3
  134. package/dist/schema/sugar.d.ts +6 -7
  135. package/dist/schema/sugar.js +9 -12
  136. package/dist/schema/syncDeltaRow.d.ts +4 -152
  137. package/dist/schema/syncDeltaRow.js +4 -105
  138. package/dist/server/adapter.d.ts +18 -1
  139. package/dist/server/commit.d.ts +10 -16
  140. package/dist/server/index.d.ts +1 -1
  141. package/dist/server/index.js +1 -1
  142. package/dist/server/readConfig.d.ts +1 -1
  143. package/dist/source/adapter.d.ts +7 -5
  144. package/dist/source/adapter.js +7 -5
  145. package/dist/source/adapters/drizzle.d.ts +1 -1
  146. package/dist/source/adapters/drizzle.js +2 -2
  147. package/dist/source/adapters/kysely.d.ts +1 -1
  148. package/dist/source/adapters/kysely.js +1 -1
  149. package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
  150. package/dist/source/adapters/kyselyMutationCore.js +2 -2
  151. package/dist/source/adapters/memory.js +1 -1
  152. package/dist/source/adapters/prisma.d.ts +8 -3
  153. package/dist/source/adapters/prisma.js +1 -1
  154. package/dist/source/connector.js +1 -1
  155. package/dist/source/connectorProtocol.d.ts +2 -8
  156. package/dist/source/connectorProtocol.js +3 -2
  157. package/dist/source/contract.d.ts +29 -17
  158. package/dist/source/contract.js +27 -22
  159. package/dist/source/factory.d.ts +1 -1
  160. package/dist/source/idempotency.js +2 -2
  161. package/dist/source/index.d.ts +1 -0
  162. package/dist/source/index.js +3 -0
  163. package/dist/source/next.d.ts +1 -1
  164. package/dist/source/signing.d.ts +9 -2
  165. package/dist/source/signing.js +4 -1
  166. package/dist/source/types.d.ts +6 -4
  167. package/dist/source/types.js +1 -1
  168. package/dist/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
  169. package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
  170. package/dist/{core → stores}/DatabaseManager.js +14 -13
  171. package/dist/stores/ObjectStore.d.ts +1 -1
  172. package/dist/{core → stores}/StoreManager.d.ts +9 -26
  173. package/dist/{core → stores}/StoreManager.js +29 -77
  174. package/dist/stores/SyncActionStore.d.ts +4 -2
  175. package/dist/stores/SyncActionStore.js +11 -17
  176. package/dist/stores/syncAction.d.ts +26 -0
  177. package/dist/stores/syncAction.js +16 -0
  178. package/dist/surface.d.ts +3 -3
  179. package/dist/surface.js +6 -4
  180. package/dist/sync/BootstrapFetcher.d.ts +127 -6
  181. package/dist/sync/BootstrapFetcher.js +511 -83
  182. package/dist/sync/ConnectionManager.d.ts +6 -198
  183. package/dist/sync/ConnectionManager.js +6 -677
  184. package/dist/sync/OnDemandLoader.d.ts +5 -2
  185. package/dist/sync/OnDemandLoader.js +61 -21
  186. package/dist/sync/SubscriptionManager.d.ts +13 -2
  187. package/dist/sync/SubscriptionManager.js +23 -5
  188. package/dist/sync/SyncWebSocket.d.ts +27 -510
  189. package/dist/sync/SyncWebSocket.js +76 -954
  190. package/dist/sync/awaitClaimGrant.d.ts +4 -44
  191. package/dist/sync/awaitClaimGrant.js +4 -109
  192. package/dist/sync/bootstrapApply.d.ts +3 -0
  193. package/dist/sync/bootstrapApply.js +2 -2
  194. package/dist/sync/commitFrames.d.ts +6 -40
  195. package/dist/sync/commitFrames.js +6 -97
  196. package/dist/sync/contextPorts.d.ts +18 -0
  197. package/dist/sync/contextPorts.js +31 -0
  198. package/dist/sync/createClaimStream.d.ts +5 -49
  199. package/dist/sync/createClaimStream.js +5 -469
  200. package/dist/sync/createPresenceStream.d.ts +26 -4
  201. package/dist/sync/createPresenceStream.js +28 -20
  202. package/dist/sync/createSnapshot.d.ts +2 -2
  203. package/dist/sync/createSnapshot.js +1 -1
  204. package/dist/sync/credentialLifecycle.d.ts +5 -173
  205. package/dist/sync/credentialLifecycle.js +5 -320
  206. package/dist/sync/deltaPipeline.d.ts +13 -12
  207. package/dist/sync/deltaPipeline.js +21 -4
  208. package/dist/sync/groupChange.d.ts +3 -0
  209. package/dist/sync/groupChange.js +16 -14
  210. package/dist/sync/participants.d.ts +24 -6
  211. package/dist/sync/participants.js +32 -23
  212. package/dist/sync/schemaDrift.d.ts +55 -0
  213. package/dist/sync/schemaDrift.js +53 -0
  214. package/dist/sync/schemas.d.ts +23 -33
  215. package/dist/sync/schemas.js +29 -20
  216. package/dist/sync/syncPlan.d.ts +3 -3
  217. package/dist/sync/wsFrameHandlers.d.ts +6 -114
  218. package/dist/sync/wsFrameHandlers.js +6 -392
  219. package/dist/syncLog/contract.d.ts +20 -0
  220. package/dist/syncLog/contract.js +19 -0
  221. package/dist/syncLog/index.d.ts +1 -0
  222. package/dist/syncLog/index.js +1 -0
  223. package/dist/transaction/ablo.d.ts +88 -0
  224. package/dist/transaction/ablo.js +33 -0
  225. package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
  226. package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
  227. package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
  228. package/dist/transaction/auth/bootstrapScope.js +1 -0
  229. package/dist/transaction/auth/capability.d.ts +212 -0
  230. package/dist/transaction/auth/capability.js +224 -0
  231. package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
  232. package/dist/{client → transaction/auth}/identity.d.ts +8 -7
  233. package/dist/{client → transaction/auth}/identity.js +1 -1
  234. package/dist/transaction/auth/index.d.ts +162 -0
  235. package/dist/transaction/auth/index.js +304 -0
  236. package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
  237. package/dist/{auth → transaction/auth}/schemas.js +13 -13
  238. package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
  239. package/dist/{client → transaction/auth}/sessionMint.js +4 -7
  240. package/dist/transaction/coordination/awaitClaimGrant.d.ts +56 -0
  241. package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
  242. package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
  243. package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -0
  244. package/dist/transaction/coordination/claimMeta.d.ts +49 -0
  245. package/dist/transaction/coordination/claimMeta.js +52 -0
  246. package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
  247. package/dist/transaction/coordination/createClaimStream.js +475 -0
  248. package/dist/transaction/coordination/events.d.ts +74 -0
  249. package/dist/transaction/coordination/events.js +7 -0
  250. package/dist/transaction/coordination/index.d.ts +19 -0
  251. package/dist/transaction/coordination/index.js +45 -0
  252. package/dist/transaction/coordination/locator.d.ts +104 -0
  253. package/dist/transaction/coordination/locator.js +102 -0
  254. package/dist/transaction/coordination/schema.d.ts +1536 -0
  255. package/dist/transaction/coordination/schema.js +1177 -0
  256. package/dist/transaction/coordination/targetConflict.d.ts +2 -0
  257. package/dist/transaction/coordination/targetConflict.js +107 -0
  258. package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
  259. package/dist/{coordination → transaction/coordination}/trace.js +18 -25
  260. package/dist/transaction/durableWrites.d.ts +62 -0
  261. package/dist/{client → transaction}/durableWrites.js +28 -3
  262. package/dist/transaction/environment.d.ts +105 -0
  263. package/dist/transaction/environment.js +108 -0
  264. package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +12 -12
  265. package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
  266. package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
  267. package/dist/{errors.js → transaction/errors.js} +85 -16
  268. package/dist/transaction/footprint.d.ts +111 -0
  269. package/dist/transaction/footprint.js +0 -0
  270. package/dist/transaction/index.d.ts +20 -0
  271. package/dist/transaction/index.js +20 -0
  272. package/dist/transaction/keys/index.d.ts +87 -0
  273. package/dist/transaction/keys/index.js +207 -0
  274. package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
  275. package/dist/transaction/log/syncDeltaRow.js +95 -0
  276. package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
  277. package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
  278. package/dist/transaction/logger.d.ts +16 -0
  279. package/dist/transaction/logger.js +7 -0
  280. package/dist/transaction/observability.d.ts +53 -0
  281. package/dist/transaction/observability.js +19 -0
  282. package/dist/transaction/plugin.d.ts +285 -0
  283. package/dist/transaction/plugin.js +106 -0
  284. package/dist/{policy → transaction/policy}/types.d.ts +3 -3
  285. package/dist/{policy → transaction/policy}/types.js +2 -0
  286. package/dist/transaction/resources/httpResources.d.ts +321 -0
  287. package/dist/transaction/resources/httpResources.js +7 -0
  288. package/dist/transaction/resources/modelOperations.d.ts +427 -0
  289. package/dist/transaction/resources/modelOperations.js +12 -0
  290. package/dist/transaction/resources/mutationOptions.d.ts +66 -0
  291. package/dist/transaction/resources/mutationOptions.js +9 -0
  292. package/dist/transaction/resources/where.d.ts +101 -0
  293. package/dist/transaction/resources/where.js +115 -0
  294. package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
  295. package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
  296. package/dist/{schema → transaction/schema}/field.d.ts +17 -23
  297. package/dist/{schema → transaction/schema}/field.js +5 -5
  298. package/dist/transaction/schema/fieldRef.d.ts +38 -0
  299. package/dist/transaction/schema/fieldRef.js +11 -0
  300. package/dist/transaction/schema/loadStrategy.d.ts +45 -0
  301. package/dist/transaction/schema/loadStrategy.js +46 -0
  302. package/dist/{schema → transaction/schema}/model.d.ts +50 -35
  303. package/dist/{schema → transaction/schema}/model.js +30 -20
  304. package/dist/transaction/schema/openapi.d.ts +58 -0
  305. package/dist/transaction/schema/openapi.js +501 -0
  306. package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
  307. package/dist/{schema → transaction/schema}/relation.js +7 -7
  308. package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
  309. package/dist/{schema → transaction/schema}/residency.js +0 -5
  310. package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
  311. package/dist/{schema → transaction/schema}/roles.js +5 -5
  312. package/dist/{schema → transaction/schema}/schema.d.ts +39 -10
  313. package/dist/{schema → transaction/schema}/schema.js +24 -3
  314. package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
  315. package/dist/{schema → transaction/schema}/tenancy.js +7 -4
  316. package/dist/transaction/transactionLayer.d.ts +82 -0
  317. package/dist/transaction/transactionLayer.js +24 -0
  318. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +5 -6
  319. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
  320. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
  321. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
  322. package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +11 -37
  323. package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
  324. package/dist/transaction/transport/commitFrames.d.ts +90 -0
  325. package/dist/transaction/transport/commitFrames.js +134 -0
  326. package/dist/transaction/transport/connectionManager.d.ts +215 -0
  327. package/dist/transaction/transport/connectionManager.js +673 -0
  328. package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
  329. package/dist/transaction/transport/credentialLifecycle.js +324 -0
  330. package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
  331. package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
  332. package/dist/transaction/transport/httpClient.d.ts +131 -0
  333. package/dist/{client → transaction/transport}/httpClient.js +6 -5
  334. package/dist/transaction/transport/httpOptions.d.ts +33 -0
  335. package/dist/transaction/transport/httpOptions.js +12 -0
  336. package/dist/{client → transaction/transport}/httpTransport.js +295 -97
  337. package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
  338. package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
  339. package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
  340. package/dist/transaction/transport/wsFrameHandlers.js +429 -0
  341. package/dist/transaction/transport/wsTransport.d.ts +574 -0
  342. package/dist/transaction/transport/wsTransport.js +1023 -0
  343. package/dist/transaction/types/assertExact.d.ts +17 -0
  344. package/dist/transaction/types/assertExact.js +1 -0
  345. package/dist/{types → transaction/types}/global.d.ts +17 -2
  346. package/dist/{types → transaction/types}/global.js +2 -1
  347. package/dist/{types → transaction/types}/index.d.ts +14 -46
  348. package/dist/{types → transaction/types}/index.js +7 -16
  349. package/dist/{types → transaction/types}/streams.d.ts +73 -45
  350. package/dist/transaction/utils/duration.d.ts +50 -0
  351. package/dist/{utils → transaction/utils}/duration.js +32 -0
  352. package/dist/{utils → transaction/utils}/json.d.ts +18 -0
  353. package/dist/transaction/utils/json.js +276 -0
  354. package/dist/transaction/wire/accountResponses.d.ts +420 -0
  355. package/dist/transaction/wire/accountResponses.js +290 -0
  356. package/dist/transaction/wire/auth.d.ts +56 -0
  357. package/dist/transaction/wire/auth.js +63 -0
  358. package/dist/transaction/wire/claimEvent.d.ts +76 -0
  359. package/dist/transaction/wire/claimEvent.js +73 -0
  360. package/dist/transaction/wire/claims.d.ts +530 -0
  361. package/dist/transaction/wire/claims.js +327 -0
  362. package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
  363. package/dist/{wire → transaction/wire}/commit.js +68 -47
  364. package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
  365. package/dist/{wire → transaction/wire}/delta.js +37 -13
  366. package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
  367. package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
  368. package/dist/transaction/wire/feedCursor.d.ts +60 -0
  369. package/dist/transaction/wire/feedCursor.js +82 -0
  370. package/dist/transaction/wire/feedEvent.d.ts +204 -0
  371. package/dist/transaction/wire/feedEvent.js +65 -0
  372. package/dist/transaction/wire/frames.d.ts +194 -0
  373. package/dist/transaction/wire/frames.js +50 -0
  374. package/dist/transaction/wire/inboundFrames.d.ts +562 -0
  375. package/dist/transaction/wire/inboundFrames.js +116 -0
  376. package/dist/transaction/wire/index.d.ts +54 -0
  377. package/dist/transaction/wire/index.js +83 -0
  378. package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
  379. package/dist/transaction/wire/listEnvelope.js +42 -0
  380. package/dist/transaction/wire/modelMutations.d.ts +31 -0
  381. package/dist/transaction/wire/modelMutations.js +52 -0
  382. package/dist/transaction/wire/modelResponses.d.ts +85 -0
  383. package/dist/transaction/wire/modelResponses.js +43 -0
  384. package/dist/transaction/wire/modelShape.d.ts +78 -0
  385. package/dist/transaction/wire/modelShape.js +74 -0
  386. package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
  387. package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
  388. package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
  389. package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
  390. package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
  391. package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
  392. package/dist/transactions/mutations/commitLatency.d.ts +52 -0
  393. package/dist/transactions/mutations/commitLatency.js +130 -0
  394. package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
  395. package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
  396. package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +18 -16
  397. package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
  398. package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
  399. package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
  400. package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
  401. package/dist/transactions/mutations/durableWriteStore.js +12 -0
  402. package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
  403. package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +4 -3
  404. package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
  405. package/dist/utils/mobxSetup.d.ts +1 -1
  406. package/dist/utils/mobxSetup.js +5 -2
  407. package/dist/{core → views}/QueryView.d.ts +2 -2
  408. package/dist/{core → views}/QueryView.js +2 -2
  409. package/dist/{core → views}/ViewRegistry.d.ts +1 -1
  410. package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
  411. package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
  412. package/dist/webhooks/events.d.ts +2 -2
  413. package/dist/wire/index.d.ts +1 -34
  414. package/dist/wire/index.js +8 -49
  415. package/docs/agent-messaging.md +3 -3
  416. package/docs/agents.md +20 -13
  417. package/docs/api-keys.md +14 -10
  418. package/docs/api.md +27 -61
  419. package/docs/audit.md +6 -3
  420. package/docs/cli.md +41 -13
  421. package/docs/client-behavior.md +11 -9
  422. package/docs/concurrency-convention.md +49 -57
  423. package/docs/coordination.md +283 -121
  424. package/docs/data-sources.md +7 -5
  425. package/docs/debugging.md +39 -15
  426. package/docs/deployment.md +267 -0
  427. package/docs/examples/agent-human.md +49 -42
  428. package/docs/examples/ai-sdk-tool.md +69 -44
  429. package/docs/examples/existing-python-backend.md +8 -6
  430. package/docs/examples/nextjs.md +129 -47
  431. package/docs/examples/scoped-agent.md +46 -45
  432. package/docs/examples/server-agent.md +46 -26
  433. package/docs/groups.md +87 -30
  434. package/docs/guarantees.md +41 -12
  435. package/docs/how-it-works.md +38 -12
  436. package/docs/idempotency.md +126 -0
  437. package/docs/identity.md +77 -74
  438. package/docs/index.md +172 -86
  439. package/docs/integration-guide.md +31 -19
  440. package/docs/mcp.md +46 -21
  441. package/docs/migration.md +95 -18
  442. package/docs/operating-on-your-database.md +3 -1
  443. package/docs/projects.md +3 -1
  444. package/docs/quickstart.md +22 -5
  445. package/docs/react.md +31 -18
  446. package/docs/schema-contract.md +5 -3
  447. package/docs/session-settings.md +108 -0
  448. package/docs/sessions.md +4 -2
  449. package/docs/webhooks.md +12 -10
  450. package/llms.txt +48 -18
  451. package/package.json +21 -26
  452. package/dist/agent/Agent.d.ts +0 -366
  453. package/dist/agent/Agent.js +0 -514
  454. package/dist/agent/index.d.ts +0 -115
  455. package/dist/agent/index.js +0 -128
  456. package/dist/agent/session.d.ts +0 -93
  457. package/dist/agent/session.js +0 -149
  458. package/dist/agent/types.d.ts +0 -68
  459. package/dist/agent/types.js +0 -9
  460. package/dist/cli.cjs +0 -286329
  461. package/dist/client/durableWrites.d.ts +0 -21
  462. package/dist/client/httpClient.d.ts +0 -80
  463. package/dist/coordination/schema.d.ts +0 -722
  464. package/dist/coordination/schema.js +0 -578
  465. package/dist/schema/openapi.d.ts +0 -29
  466. package/dist/schema/openapi.js +0 -124
  467. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  468. package/dist/testing/fixtures/bootstrap.js +0 -59
  469. package/dist/testing/fixtures/deltas.d.ts +0 -83
  470. package/dist/testing/fixtures/deltas.js +0 -136
  471. package/dist/testing/fixtures/models.d.ts +0 -83
  472. package/dist/testing/fixtures/models.js +0 -272
  473. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  474. package/dist/testing/helpers/reactWrapper.js +0 -67
  475. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  476. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  477. package/dist/testing/helpers/wait.d.ts +0 -30
  478. package/dist/testing/helpers/wait.js +0 -49
  479. package/dist/testing/index.d.ts +0 -23
  480. package/dist/testing/index.js +0 -33
  481. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  482. package/dist/testing/mocks/FakeDatabase.js +0 -10
  483. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  484. package/dist/testing/mocks/MockMutationExecutor.js +0 -192
  485. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  486. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  487. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  488. package/dist/testing/mocks/MockSyncContext.js +0 -71
  489. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  490. package/dist/testing/mocks/MockSyncStore.js +0 -171
  491. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  492. package/dist/testing/mocks/MockWebSocket.js +0 -118
  493. package/dist/transactions/durableWriteStore.js +0 -30
  494. package/dist/utils/duration.d.ts +0 -25
  495. package/dist/utils/json.js +0 -88
  496. package/dist/wire/errorEnvelope.d.ts +0 -55
  497. package/dist/wire/frames.d.ts +0 -197
  498. package/dist/wire/frames.js +0 -49
  499. package/dist/wire/listEnvelope.js +0 -18
  500. package/docs/interaction-model.md +0 -97
  501. /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
  502. /package/dist/{core → query}/QueryProcessor.js +0 -0
  503. /package/dist/{core/storeContract.js → storeContract.js} +0 -0
  504. /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
  505. /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
  506. /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
  507. /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
  508. /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
  509. /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
  510. /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
  511. /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
  512. /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
  513. /package/dist/{client → transaction}/persistence.d.ts +0 -0
  514. /package/dist/{client → transaction}/persistence.js +0 -0
  515. /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
  516. /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
  517. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
  518. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
  519. /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
  520. /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
  521. /package/dist/{types → transaction/types}/modelData.js +0 -0
  522. /package/dist/{types → transaction/types}/participant.d.ts +0 -0
  523. /package/dist/{types → transaction/types}/participant.js +0 -0
  524. /package/dist/{types → transaction/types}/streams.js +0 -0
  525. /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
  526. /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
  527. /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
  528. /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
  529. /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
  530. /package/dist/{wire → transaction/wire}/protocol.js +0 -0
  531. /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
  532. /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
  533. /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
  534. /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
  535. /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
  536. /package/dist/{core → views}/ViewRegistry.js +0 -0
@@ -0,0 +1,115 @@
1
+ /**
2
+ * The where-clause grammar carried by a filtered read.
3
+ *
4
+ * A `where` is a flat list of `[column, operator, value]` conditions combined
5
+ * with AND. The protocol carries no model-specific logic: the server compiles a
6
+ * condition against your schema, so adding a model or relation is a schema
7
+ * change rather than a server change.
8
+ *
9
+ * The `IN` operator lets you batch a read by any column, including a foreign
10
+ * key — for example, fetching every block whose `sectionId` falls in a set of ids.
11
+ *
12
+ * These types describe the *request*, not any local copy of the rows it returns,
13
+ * so they live with the settlement core rather than the reactive consumer.
14
+ */
15
+ import { z } from 'zod';
16
+ import { AbloValidationError } from '../errors.js';
17
+ /**
18
+ * The comparison operators a {@link WhereClause} may use: equality and
19
+ * inequality, ordering, set membership (`IN` / `NOT IN`), null checks
20
+ * (`IS` / `IS NOT`), and case-sensitive or case-insensitive pattern
21
+ * matching (`LIKE`, `ILIKE`, and their negations).
22
+ */
23
+ export const whereOpSchema = z.enum([
24
+ '=',
25
+ '!=',
26
+ '<',
27
+ '<=',
28
+ '>',
29
+ '>=',
30
+ 'IN',
31
+ 'NOT IN',
32
+ 'IS',
33
+ 'IS NOT',
34
+ 'LIKE',
35
+ 'NOT LIKE',
36
+ 'ILIKE',
37
+ 'NOT ILIKE',
38
+ ]);
39
+ /**
40
+ * How each operator binds its operand — the classification a compiler needs
41
+ * before it can render or evaluate a condition: a scalar on the right, an array
42
+ * to expand, or a null check with no operand at all. `LIKE_OPS` is the subset
43
+ * whose operand is a pattern and therefore needs pattern validation.
44
+ *
45
+ * These live here, beside the operators, because every consumer of the grammar
46
+ * needs the same split and there is more than one consumer: a where clause is
47
+ * compiled to SQL on a hosted plane and evaluated in memory against the log on
48
+ * a source plane. Two hand-maintained copies of this split meant the same
49
+ * request could be accepted by one plane and rejected by the other — and the
50
+ * pattern-safety set existed on only one of them.
51
+ */
52
+ export const WHERE_SCALAR_OPS = new Set([
53
+ '=',
54
+ '!=',
55
+ '<',
56
+ '<=',
57
+ '>',
58
+ '>=',
59
+ 'LIKE',
60
+ 'NOT LIKE',
61
+ 'ILIKE',
62
+ 'NOT ILIKE',
63
+ ]);
64
+ export const WHERE_ARRAY_OPS = new Set(['IN', 'NOT IN']);
65
+ export const WHERE_NULL_OPS = new Set(['IS', 'IS NOT']);
66
+ export const WHERE_LIKE_OPS = new Set([
67
+ 'LIKE',
68
+ 'NOT LIKE',
69
+ 'ILIKE',
70
+ 'NOT ILIKE',
71
+ ]);
72
+ /**
73
+ * Does this operator accept this operand? The rule the sets above imply, stated
74
+ * once and thrown once.
75
+ *
76
+ * The sets were collapsed here because two copies of the split let one plane
77
+ * accept a request the other refused. The check that consumes them stayed
78
+ * duplicated — the SQL compiler and the log-plane evaluator each carried their
79
+ * own arity tests and their own wording — which leaves the same gap one step
80
+ * further along: relax `IN` in one evaluator and a request succeeds against a
81
+ * hosted plane and fails against a connected one, with no test in a position to
82
+ * notice.
83
+ *
84
+ * Returns the classification the caller needs next, so the check and the branch
85
+ * are the same statement rather than two that can disagree.
86
+ */
87
+ export function classifyWhereOperand(op, value) {
88
+ if (WHERE_NULL_OPS.has(op)) {
89
+ if (value !== null) {
90
+ throw new AbloValidationError(`${op} only supports null RHS`, {
91
+ code: 'query_unsupported_operator',
92
+ });
93
+ }
94
+ return 'null';
95
+ }
96
+ if (WHERE_ARRAY_OPS.has(op)) {
97
+ if (!Array.isArray(value)) {
98
+ throw new AbloValidationError(`${op} requires an array RHS`, {
99
+ code: 'query_unsupported_operator',
100
+ });
101
+ }
102
+ return 'array';
103
+ }
104
+ if (WHERE_SCALAR_OPS.has(op)) {
105
+ if (Array.isArray(value)) {
106
+ throw new AbloValidationError(`${op} requires a scalar RHS`, {
107
+ code: 'query_unsupported_operator',
108
+ });
109
+ }
110
+ return 'scalar';
111
+ }
112
+ throw new AbloValidationError(`unsupported operator: ${op}`, {
113
+ code: 'query_unsupported_operator',
114
+ });
115
+ }
@@ -16,11 +16,8 @@
16
16
  * asserts the shape rather than replacing the value with a parsed copy.
17
17
  */
18
18
  import { z } from 'zod';
19
- export declare const onStaleModeSchema: z.ZodEnum<{
20
- reject: "reject";
21
- overwrite: "overwrite";
22
- notify: "notify";
23
- }>;
19
+ import { onStaleModeSchema } from '../coordination/schema.js';
20
+ export { onStaleModeSchema };
24
21
  export declare const writeOptionsSchema: z.ZodObject<{
25
22
  idempotencyKey: z.ZodOptional<z.ZodNullable<z.ZodString>>;
26
23
  label: z.ZodOptional<z.ZodString>;
@@ -38,7 +35,6 @@ export declare const writeOptionsSchema: z.ZodObject<{
38
35
  claim: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
39
36
  id: z.ZodString;
40
37
  }, z.core.$loose>]>>>;
41
- causedByTaskId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
42
38
  }, z.core.$strip>;
43
39
  export type WriteOptionsInput = z.infer<typeof writeOptionsSchema>;
44
40
  /**
@@ -17,8 +17,14 @@
17
17
  */
18
18
  import { z } from 'zod';
19
19
  import { AbloValidationError } from '../errors.js';
20
- import { commitStatusSchema } from '../wire/commit.js';
21
- export const onStaleModeSchema = z.enum(['reject', 'overwrite', 'notify']);
20
+ import { commitWaitSchema } from '../wire/commit.js';
21
+ import { onStaleModeSchema } from '../coordination/schema.js';
22
+ // Re-exported, not redeclared. `coordination/schema.ts` owns this enum — it is
23
+ // what the wire schemas and the server validate against — while the published
24
+ // SDK barrel exports the name from this module. Declaring it twice put a second
25
+ // object behind the public export that agreed with the canonical one only by
26
+ // both happening to list the same three strings.
27
+ export { onStaleModeSchema };
22
28
  export const writeOptionsSchema = z.object({
23
29
  /** Idempotency key the server records in `mutation_log` to make retries
24
30
  * safe; `null` opts out of that protection. */
@@ -26,7 +32,7 @@ export const writeOptionsSchema = z.object({
26
32
  /** Human-readable audit tag, persisted to `mutation_log.label`. */
27
33
  label: z.string().max(255).optional(),
28
34
  /** Resolve when queued locally (default) or once the server confirms. */
29
- wait: commitStatusSchema.optional(),
35
+ wait: commitWaitSchema.optional(),
30
36
  /** Stale guard: the sync watermark the caller's reasoning was based on. */
31
37
  readAt: z.number().int().nonnegative().nullish(),
32
38
  /** What the server does when the target moved past `readAt`. */
@@ -39,8 +45,6 @@ export const writeOptionsSchema = z.object({
39
45
  /** The claim this write belongs to — either a claim id, or a live claim
40
46
  * handle whose `release`/`revoke` functions are preserved untouched. */
41
47
  claim: z.union([z.string(), z.looseObject({ id: z.string() })]).nullish(),
42
- /** Reserved wire-compatibility field; current clients always send `null`. */
43
- causedByTaskId: z.string().nullish(),
44
48
  });
45
49
  /**
46
50
  * Validates a write-options object against {@link writeOptionsSchema}. On
@@ -24,24 +24,18 @@
24
24
  * });
25
25
  */
26
26
  import { z } from 'zod';
27
- /** The sync-engine metadata describing one field, available at runtime through a
28
- * model's `fields` map. The {@link field} builders attach it, and the migration
29
- * planner, type generator, and OpenAPI generator all read it. */
30
- export interface FieldMeta {
31
- /** Sync-engine type tag, which maps to storage and serialization hints. */
32
- type: 'string' | 'number' | 'boolean' | 'date' | 'enum' | 'json';
33
- /** Whether the field was marked optional via `.optional()` or `.nullable()`. */
34
- isOptional: boolean;
35
- /** Whether the field was marked indexed via `.indexed()`. */
36
- isIndexed: boolean;
37
- /**
38
- * Physical database column name override. When absent, SQL layers derive
39
- * the column from the field name using the active casing convention.
40
- */
41
- column?: string;
42
- /** For enums: the allowed values. */
43
- enumValues?: readonly string[];
44
- }
27
+ /**
28
+ * The sync-engine metadata describing one field, available at runtime through a
29
+ * model's `fields` map. The {@link field} builders attach it, and the migration
30
+ * planner, type generator, and OpenAPI generator all read it.
31
+ *
32
+ * Declared in `wire/modelShape.ts` and inferred here, not restated: this record
33
+ * crosses the wire twice serialized into the pushed artifact, and reported
34
+ * back by `GET /api/schema` — so a second declaration would be a copy that
35
+ * drifts in whichever direction nobody is looking.
36
+ */
37
+ export type { FieldMeta } from '../wire/modelShape.js';
38
+ import type { FieldMeta } from '../wire/modelShape.js';
45
39
  /**
46
40
  * Extract FieldMeta from a Zod schema. Returns null if no sync-engine
47
41
  * metadata is attached (e.g., raw `z.string()` usage).
@@ -103,18 +97,18 @@ export declare const field: {
103
97
  *
104
98
  * Example:
105
99
  * ```ts
106
- * const slideDecks = model({
100
+ * const reports = model({
107
101
  * metadata: field.json({
108
- * icon: z.string().default('presentation'),
102
+ * icon: z.string().default('report'),
109
103
  * color: z.string().default('#F59E0B'),
110
104
  * summary: z.string().optional(),
111
105
  * }),
112
106
  * });
113
107
  *
114
108
  * // At runtime:
115
- * deck.metadata // raw JSON string (unchanged)
116
- * deck.metadataJson // { icon: 'presentation', color: '#F59E0B', summary: undefined }
117
- * deck.metadataJson.icon // 'presentation' (typed, with default)
109
+ * report.metadata // raw JSON string (unchanged)
110
+ * report.metadataJson // { icon: 'report', color: '#F59E0B', summary: undefined }
111
+ * report.metadataJson.icon // 'report' (typed, with default)
118
112
  * ```
119
113
  */
120
114
  readonly json: <T extends z.ZodType = z.ZodUnknown>(schemaOrShape?: T | z.ZodRawShape) => FieldBuilder<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -219,18 +219,18 @@ export const field = {
219
219
  *
220
220
  * Example:
221
221
  * ```ts
222
- * const slideDecks = model({
222
+ * const reports = model({
223
223
  * metadata: field.json({
224
- * icon: z.string().default('presentation'),
224
+ * icon: z.string().default('report'),
225
225
  * color: z.string().default('#F59E0B'),
226
226
  * summary: z.string().optional(),
227
227
  * }),
228
228
  * });
229
229
  *
230
230
  * // At runtime:
231
- * deck.metadata // raw JSON string (unchanged)
232
- * deck.metadataJson // { icon: 'presentation', color: '#F59E0B', summary: undefined }
233
- * deck.metadataJson.icon // 'presentation' (typed, with default)
231
+ * report.metadata // raw JSON string (unchanged)
232
+ * report.metadataJson // { icon: 'report', color: '#F59E0B', summary: undefined }
233
+ * report.metadataJson.icon // 'report' (typed, with default)
234
234
  * ```
235
235
  */
236
236
  json(schemaOrShape) {
@@ -0,0 +1,38 @@
1
+ /**
2
+ * A reference to one field of one model — the field as a value rather than as
3
+ * a quoted name.
4
+ *
5
+ * A model is declared as Zod schemas keyed by name, so a field's name lives on
6
+ * the object key and never on the value: `model({ status: z.enum([...]) })`
7
+ * gives you nothing to point at, and every surface that needs to name a field
8
+ * has had to quote it. `fields: ['titel']` then compiles, is granted, excludes
9
+ * nobody, and leaves the write of `title` unguarded — the conflict rule
10
+ * compares names as opaque strings, so an invented one matches no other claim
11
+ * and nothing reports it.
12
+ *
13
+ * {@link Schema.fields} carries one of these per field, stamped from the key
14
+ * `defineSchema` is already holding. Referencing a field that does not exist
15
+ * stops compiling, and renaming one is a compile error at every use rather than
16
+ * a claim that quietly stops matching.
17
+ *
18
+ * An object rather than a branded string, for the reason `ClaimPart` is one: a
19
+ * brand makes a concrete schema's claim params mutually unassignable with the
20
+ * erased `SchemaRecord` view, and the react context boundary erases and
21
+ * restores exactly that way. Objects stay pairwise comparable across it, which
22
+ * a union of literal keys does not — function parameters are contravariant, so
23
+ * a claim accepting `'title' | 'status'` is not assignable to one accepting
24
+ * `string`.
25
+ *
26
+ * `model` rides along so a reference carries where it came from. Claiming
27
+ * `users.email` through `ablo.tasks` is a mistake nothing can currently see.
28
+ */
29
+ export interface FieldRef {
30
+ /** The schema key of the model this field belongs to. */
31
+ readonly model: string;
32
+ /** The field's own name — the key it was declared under. */
33
+ readonly field: string;
34
+ }
35
+ /** Whether a value is a {@link FieldRef}. */
36
+ export declare function isFieldRef(value: unknown): value is FieldRef;
37
+ /** Build the reference for one declared field. */
38
+ export declare function fieldRef(model: string, field: string): FieldRef;
@@ -0,0 +1,11 @@
1
+ /** Whether a value is a {@link FieldRef}. */
2
+ export function isFieldRef(value) {
3
+ return (typeof value === 'object' &&
4
+ value !== null &&
5
+ typeof value.field === 'string' &&
6
+ typeof value.model === 'string');
7
+ }
8
+ /** Build the reference for one declared field. */
9
+ export function fieldRef(model, field) {
10
+ return { model, field };
11
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * When a model's rows are loaded from the server.
3
+ *
4
+ * - `instant` — loaded during bootstrap, before the model is first used.
5
+ * - `lazy` — loaded all at once on first access.
6
+ *
7
+ * One declaration serves both sides of the seam. `LoadStrategy.instant` is the
8
+ * value the engine branches on once a model is registered; `'instant'` is the
9
+ * word an author writes in `model(…, { load })`. They are the same name because
10
+ * they are the same axis — a const object merged with the type of its own
11
+ * values, rather than an enum, because a string enum is nominal and would
12
+ * refuse the plain `'instant'` an author actually types.
13
+ *
14
+ * The set is deliberately this small. It previously named `partial`,
15
+ * `explicitlyRequested`, and `local` on the runtime side and `manual` on the
16
+ * authoring side, and not one of those was reachable end to end: `manual` had
17
+ * no implementation and resolved to `lazy`, while the other three had no way to
18
+ * be declared. A member no schema can produce, or no branch can observe, is a
19
+ * promise the engine has no way to keep.
20
+ */
21
+ export declare const LoadStrategy: {
22
+ /** Loaded during startup, before it is first used — for models needed right away. */
23
+ readonly instant: "instant";
24
+ /** Loaded all at once the first time it is needed — for secondary models. */
25
+ readonly lazy: "lazy";
26
+ };
27
+ export type LoadStrategy = (typeof LoadStrategy)[keyof typeof LoadStrategy];
28
+ /** The strategy a model gets when it declares none. */
29
+ export declare const DEFAULT_LOAD_STRATEGY: LoadStrategy;
30
+ /**
31
+ * Whether a model's rows arrive in the bootstrap payload rather than on first
32
+ * access. This is the question the client asks when it builds the bootstrap
33
+ * subscription and the question the server asks when it assembles the payload,
34
+ * and the two must answer it identically or a model is requested by one side
35
+ * and withheld by the other.
36
+ *
37
+ * It is a function rather than a comparison spelled at each site because the
38
+ * sites disagreed about how to spell it: one asked `load !== 'lazy'`, another
39
+ * `load === 'instant'`, a third `load === 'lazy' ? … : …`. Against a two-member
40
+ * set those are the same predicate, so nothing failed. Against a third member
41
+ * they are three different predicates, and the first would have enrolled it in
42
+ * bootstrap while the second withheld it — the kind of split that surfaces as
43
+ * rows that never arrive, far from the line that caused it.
44
+ */
45
+ export declare function loadsAtBootstrap(load: LoadStrategy | undefined): boolean;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * When a model's rows are loaded from the server.
3
+ *
4
+ * - `instant` — loaded during bootstrap, before the model is first used.
5
+ * - `lazy` — loaded all at once on first access.
6
+ *
7
+ * One declaration serves both sides of the seam. `LoadStrategy.instant` is the
8
+ * value the engine branches on once a model is registered; `'instant'` is the
9
+ * word an author writes in `model(…, { load })`. They are the same name because
10
+ * they are the same axis — a const object merged with the type of its own
11
+ * values, rather than an enum, because a string enum is nominal and would
12
+ * refuse the plain `'instant'` an author actually types.
13
+ *
14
+ * The set is deliberately this small. It previously named `partial`,
15
+ * `explicitlyRequested`, and `local` on the runtime side and `manual` on the
16
+ * authoring side, and not one of those was reachable end to end: `manual` had
17
+ * no implementation and resolved to `lazy`, while the other three had no way to
18
+ * be declared. A member no schema can produce, or no branch can observe, is a
19
+ * promise the engine has no way to keep.
20
+ */
21
+ export const LoadStrategy = {
22
+ /** Loaded during startup, before it is first used — for models needed right away. */
23
+ instant: 'instant',
24
+ /** Loaded all at once the first time it is needed — for secondary models. */
25
+ lazy: 'lazy',
26
+ };
27
+ /** The strategy a model gets when it declares none. */
28
+ export const DEFAULT_LOAD_STRATEGY = LoadStrategy.instant;
29
+ /**
30
+ * Whether a model's rows arrive in the bootstrap payload rather than on first
31
+ * access. This is the question the client asks when it builds the bootstrap
32
+ * subscription and the question the server asks when it assembles the payload,
33
+ * and the two must answer it identically or a model is requested by one side
34
+ * and withheld by the other.
35
+ *
36
+ * It is a function rather than a comparison spelled at each site because the
37
+ * sites disagreed about how to spell it: one asked `load !== 'lazy'`, another
38
+ * `load === 'instant'`, a third `load === 'lazy' ? … : …`. Against a two-member
39
+ * set those are the same predicate, so nothing failed. Against a third member
40
+ * they are three different predicates, and the first would have enrolled it in
41
+ * bootstrap while the second withheld it — the kind of split that surfaces as
42
+ * rows that never arrive, far from the line that caused it.
43
+ */
44
+ export function loadsAtBootstrap(load) {
45
+ return (load ?? DEFAULT_LOAD_STRATEGY) === LoadStrategy.instant;
46
+ }
@@ -1,7 +1,8 @@
1
1
  /**
2
- * Defines a model — one table's worth of fields plus its relations and options. A
3
- * model is a Zod object schema paired with optional relation definitions; the row
4
- * type is inferred directly from Zod, with no separate type system to keep in sync.
2
+ * Defines a model — one table's worth of fields, and one options object holding
3
+ * everything else the engine needs to know about it. A model is a Zod object schema
4
+ * paired with those options; the row type is inferred directly from Zod, with no
5
+ * separate type system to keep in sync.
5
6
  *
6
7
  * Usage:
7
8
  * import { z } from 'zod';
@@ -12,7 +13,8 @@
12
13
  * status: z.enum(['todo', 'doing', 'done']).default('todo'),
13
14
  * projectId: z.string().optional(),
14
15
  * }, {
15
- * project: relation.belongsTo('projects', 'projectId'),
16
+ * relations: { project: relation.belongsTo('projects', 'projectId') },
17
+ * load: 'lazy',
16
18
  * });
17
19
  */
18
20
  import { z } from 'zod';
@@ -24,14 +26,8 @@ export type { ScopedViaRef, Tenancy, PolicyInput } from './tenancy.js';
24
26
  import { type ModelResidency } from './residency.js';
25
27
  import type { ConflictAxis } from '../policy/types.js';
26
28
  export type { ConflictAxis } from '../policy/types.js';
27
- /**
28
- * Controls when model data is loaded from the server.
29
- *
30
- * - `'instant'` — loaded during bootstrap (appears immediately on page load)
31
- * - `'lazy'` — loaded on first access (e.g., when you navigate to a page that needs it)
32
- * - `'manual'` — only loaded when you explicitly call sync.model.load()
33
- */
34
- export type LoadStrategy = 'instant' | 'lazy' | 'manual';
29
+ import { LoadStrategy } from './loadStrategy.js';
30
+ export { LoadStrategy, DEFAULT_LOAD_STRATEGY, loadsAtBootstrap } from './loadStrategy.js';
35
31
  /** A record of relation definitions */
36
32
  export type RelationRecord = Record<string, RelationDef>;
37
33
  /**
@@ -58,11 +54,26 @@ export interface PersistOptions {
58
54
  export interface GrantsRef {
59
55
  /** Relation name pointing at the identity that gains access (e.g. `'user'`). */
60
56
  subject: string;
61
- /** Relation name pointing at the scope-root entity (e.g. `'dataroom'`). */
57
+ /** Relation name pointing at the scope-root entity (e.g. `'workspace'`). */
62
58
  scope: string;
63
59
  }
64
60
  /** Options for model() */
65
61
  export interface ModelOptions {
62
+ /**
63
+ * Edges from this model to others, keyed by the accessor name they create. The
64
+ * engine reads them to index foreign keys, to order inserts so a parent row lands
65
+ * before the rows referencing it, and to generate the accessors that let you read
66
+ * `task.project` or `project.tasks` directly. Built with the {@link relation}
67
+ * factories.
68
+ *
69
+ * ```ts
70
+ * relations: {
71
+ * project: relation.belongsTo('projects', 'projectId'),
72
+ * comments: relation.hasMany('comments', 'taskId'),
73
+ * }
74
+ * ```
75
+ */
76
+ relations?: RelationRecord;
66
77
  /** When to load this model's data. Default: 'instant' */
67
78
  load?: LoadStrategy;
68
79
  /** Max records to bootstrap. Default: unlimited. Only applies to 'instant' strategy. */
@@ -74,7 +85,7 @@ export interface ModelOptions {
74
85
  * wire (the `__typename`). The loader stamps it onto incoming rows and uses it to
75
86
  * find the matching model class. It defaults to the schema key (`tasks` →
76
87
  * `'tasks'`); set it explicitly when the wire shape uses different casing, such as
77
- * schema key `slideLayer` mapping to typename `'SlideLayer'`.
88
+ * schema key `block` mapping to typename `'Block'`.
78
89
  *
79
90
  * This is the one value that identifies the model on the wire; the client-side
80
91
  * store name, query result references, and delta routing all resolve through it.
@@ -98,8 +109,8 @@ export interface ModelOptions {
98
109
  * omitted). `column` overrides the column name, which defaults to
99
110
  * `organization_id`.
100
111
  * - `{ by: 'parent', fk, parent }` — inherit tenancy through a foreign key when the
101
- * table has no tenancy column of its own (for example `slide_layers` → slide
102
- * deck → organization). In place of `organization_id = $1` the read emits
112
+ * table has no tenancy column of its own (for example `blocks` → section
113
+ * report → organization). In place of `organization_id = $1` the read emits
103
114
  * `WHERE <table>.<fk> IN (SELECT <parentKey> FROM <parent> WHERE
104
115
  * <parentTenantColumn> = $1)`. Use it for any `load: 'instant'` child table that
105
116
  * would otherwise expose other tenants' rows at bootstrap.
@@ -125,8 +136,8 @@ export interface ModelOptions {
125
136
  * optional parts:
126
137
  *
127
138
  * - `root` — marks this model a scope root, so each of its records forms the group
128
- * `<kind>:<id>`. The kind defaults to the lowercased typename (`Deck` →
129
- * `deck:<id>`); pass a string to override it (`root: 'matter'`). Child models
139
+ * `<kind>:<id>`. The kind defaults to the lowercased typename (`Report` →
140
+ * `report:<id>`); pass a string to override it (`root: 'matter'`). Child models
130
141
  * inherit a root's group through their `belongsTo` relations.
131
142
  * - `grants` — a membership edge that grants an identity access to a scope root.
132
143
  * Both values name `belongsTo` relations on this model (`subject` names the
@@ -138,7 +149,7 @@ export interface ModelOptions {
138
149
  *
139
150
  * ```ts
140
151
  * // dataroomMember: { userId, dataroomId }
141
- * groups: { grants: { subject: 'user', scope: 'dataroom' } }
152
+ * groups: { grants: { subject: 'user', scope: 'workspace' } }
142
153
  * // a message → its addressee's inbox, keyed on `toId`
143
154
  * groups: { roles: [entityRole({ kind: 'inbox', source: 'toId' })] }
144
155
  * ```
@@ -196,7 +207,7 @@ export interface ModelOptions {
196
207
  * value.
197
208
  *
198
209
  * @example
199
- * model({ title: z.string(), metadata: z.string() }, {}, {
210
+ * model({ title: z.string(), metadata: z.string() }, {
200
211
  * computed: {
201
212
  * displayTitle: (self) => self.title || `Untitled`,
202
213
  * metadataObject: (self) => {
@@ -233,7 +244,7 @@ export interface ModelOptions {
233
244
  * loaded. Use it for foreign keys whose absence would crash code that depends on
234
245
  * them — for example a child row that cannot be placed without its parent's id.
235
246
  *
236
- * @example requiredFields: ['slideId']
247
+ * @example requiredFields: ['sectionId']
237
248
  */
238
249
  requiredFields?: readonly string[];
239
250
  }
@@ -321,40 +332,44 @@ export interface ModelDef<Shape extends z.ZodRawShape = z.ZodRawShape, R extends
321
332
  readonly requiredFields?: readonly string[];
322
333
  }
323
334
  /**
324
- * Defines a model from a Zod shape, with optional relations and options. The row
325
- * type is inferred from the shape; fields built with the {@link field} builders
326
- * carry extra metadata, while plain Zod fields get metadata inferred from their Zod
327
- * type. The third argument sets options such as the {@link LoadStrategy}.
335
+ * Defines a model from a Zod shape and its options. The row type is inferred from
336
+ * the shape; fields built with the {@link field} builders carry extra metadata,
337
+ * while plain Zod fields get metadata inferred from their Zod type. Everything else
338
+ * about the model its {@link ModelOptions.relations}, its {@link LoadStrategy},
339
+ * the table it maps to — lives in the second argument, so a model that needs one
340
+ * setting never has to name the settings it does not use.
328
341
  *
329
342
  * ```ts
330
343
  * import { z } from 'zod';
331
344
  * import { model, relation } from '@abloatai/ablo/schema';
332
345
  *
333
- * // Loaded at bootstrap (the default)
346
+ * // Fields alone
347
+ * const tags = model({ label: z.string() });
348
+ *
349
+ * // Loaded at bootstrap (the default), with an edge to its project
334
350
  * const tasks = model({
335
351
  * title: z.string(),
336
352
  * status: z.enum(['todo', 'doing', 'done']).default('todo'),
337
353
  * projectId: z.string().optional(),
338
354
  * }, {
339
- * project: relation.belongsTo('projects', 'projectId'),
355
+ * relations: { project: relation.belongsTo('projects', 'projectId') },
340
356
  * });
341
357
  *
342
358
  * // Loaded on first access
343
- * const slideLayers = model({ slideId: z.string(), type: z.string() }, {
344
- * slide: relation.belongsTo('slides', 'slideId'),
345
- * }, { load: 'lazy' });
346
- *
347
- * // Loaded only when explicitly requested
348
- * const auditLogs = model({ action: z.string() }, {}, { load: 'manual' });
359
+ * const blocks = model({ sectionId: z.string(), type: z.string() }, {
360
+ * relations: { section: relation.belongsTo('sections', 'sectionId') },
361
+ * load: 'lazy',
362
+ * });
349
363
  * ```
350
364
  */
351
- export declare function model<Shape extends z.ZodRawShape, R extends RelationRecord = Record<string, never>, C extends ComputedRecord = Record<string, never>>(shape: Shape, relations?: R, options?: ModelOptions & {
365
+ export declare function model<Shape extends z.ZodRawShape, R extends RelationRecord = Record<string, never>, C extends ComputedRecord = Record<string, never>>(shape: Shape, options?: ModelOptions & {
366
+ relations?: R;
352
367
  computed?: C;
353
368
  }): ModelDef<Shape, R, C>;
354
369
  /**
355
370
  * Returns the sync-group kind a scope-root model produces, or `undefined` when the
356
371
  * model is not a scope root. `scope: true` derives the kind from the lowercased
357
- * typename (`SlideDeck` → `slidedeck`); `scope: 'deck'` sets it explicitly, which
372
+ * typename (`ReportSection` → `reportsection`); `scope: 'section'` sets it explicitly, which
358
373
  * you use when the wire kind must differ from the typename. This is the single place
359
374
  * that decides a record's own group, so every layer that reads it agrees.
360
375
  */