@abloatai/ablo 0.34.0 → 0.35.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 (483) hide show
  1. package/AGENTS.md +4 -1
  2. package/CHANGELOG.md +684 -5
  3. package/README.md +39 -22
  4. package/dist/BaseSyncedStore.d.ts +152 -44
  5. package/dist/BaseSyncedStore.js +300 -184
  6. package/dist/Database.d.ts +9 -24
  7. package/dist/Database.js +37 -22
  8. package/dist/InstanceCache.d.ts +25 -4
  9. package/dist/InstanceCache.js +48 -15
  10. package/dist/LazyReferenceCollection.d.ts +3 -3
  11. package/dist/LazyReferenceCollection.js +4 -4
  12. package/dist/Model.d.ts +6 -6
  13. package/dist/Model.js +10 -10
  14. package/dist/ModelRegistry.d.ts +4 -4
  15. package/dist/ModelRegistry.js +3 -3
  16. package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
  17. package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
  18. package/dist/SyncClient.d.ts +42 -32
  19. package/dist/SyncClient.js +166 -110
  20. package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
  21. package/dist/ai-sdk/coordinatedTool.js +1 -1
  22. package/dist/ai-sdk/coordinationContext.d.ts +2 -2
  23. package/dist/ai-sdk/coordinationContext.js +1 -1
  24. package/dist/ai-sdk/wrap.d.ts +3 -3
  25. package/dist/ai-sdk/wrap.js +2 -2
  26. package/dist/auth/index.d.ts +1 -156
  27. package/dist/auth/index.js +8 -301
  28. package/dist/cli.cjs +3459 -1126
  29. package/dist/client/Ablo.d.ts +42 -287
  30. package/dist/client/Ablo.js +118 -963
  31. package/dist/client/abloClient.d.ts +309 -0
  32. package/dist/client/abloClient.js +13 -0
  33. package/dist/client/clientPrelude.d.ts +52 -0
  34. package/dist/client/clientPrelude.js +60 -0
  35. package/dist/client/consoleLogger.d.ts +2 -2
  36. package/dist/client/coreClient.d.ts +60 -0
  37. package/dist/client/coreClient.js +118 -0
  38. package/dist/client/createInternalComponents.d.ts +4 -4
  39. package/dist/client/createInternalComponents.js +9 -8
  40. package/dist/client/createModelProxy.d.ts +78 -373
  41. package/dist/client/createModelProxy.js +114 -86
  42. package/dist/client/humans.d.ts +48 -0
  43. package/dist/client/humans.js +52 -0
  44. package/dist/client/modelRegistration.d.ts +1 -1
  45. package/dist/client/modelRegistration.js +9 -9
  46. package/dist/client/options.d.ts +73 -17
  47. package/dist/client/reactiveEngine.d.ts +48 -0
  48. package/dist/client/reactiveEngine.js +910 -0
  49. package/dist/client/resourceTypes.d.ts +9 -250
  50. package/dist/client/resourceTypes.js +8 -5
  51. package/dist/client/schemaConfig.d.ts +4 -4
  52. package/dist/client/schemaConfig.js +6 -2
  53. package/dist/client/validateAbloOptions.d.ts +3 -2
  54. package/dist/client/validateAbloOptions.js +1 -1
  55. package/dist/client/wsMutationExecutor.d.ts +3 -3
  56. package/dist/client/wsMutationExecutor.js +3 -3
  57. package/dist/context.d.ts +9 -9
  58. package/dist/context.js +10 -9
  59. package/dist/coordination/ClaimLog.d.ts +26 -0
  60. package/dist/coordination/ClaimLog.js +32 -0
  61. package/dist/coordination/index.d.ts +1 -15
  62. package/dist/coordination/index.js +8 -31
  63. package/dist/core/DatabaseManager.js +1 -1
  64. package/dist/core/QueryView.d.ts +1 -1
  65. package/dist/core/QueryView.js +1 -1
  66. package/dist/core/StoreManager.d.ts +4 -23
  67. package/dist/core/StoreManager.js +5 -55
  68. package/dist/core/index.d.ts +2 -2
  69. package/dist/core/index.js +2 -2
  70. package/dist/core/storeContract.d.ts +2 -2
  71. package/dist/docs/catalog.d.ts +72 -0
  72. package/dist/docs/catalog.js +227 -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 +40 -34
  78. package/dist/index.js +26 -20
  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 +2 -2
  99. package/dist/query/client.js +4 -4
  100. package/dist/query/types.d.ts +6 -41
  101. package/dist/query/types.js +2 -2
  102. package/dist/react/AbloProvider.d.ts +6 -8
  103. package/dist/react/AbloProvider.js +5 -7
  104. package/dist/react/context.d.ts +1 -1
  105. package/dist/react/context.js +1 -1
  106. package/dist/react/index.d.ts +5 -5
  107. package/dist/react/index.js +3 -3
  108. package/dist/react/internalContext.d.ts +1 -1
  109. package/dist/react/useAblo.d.ts +3 -3
  110. package/dist/react/useAblo.js +1 -1
  111. package/dist/react/useCurrentUserId.js +1 -1
  112. package/dist/react/useErrorListener.js +1 -1
  113. package/dist/react/useMutationFailureListener.d.ts +2 -2
  114. package/dist/react/useMutationFailureListener.js +1 -1
  115. package/dist/react/useMutators.d.ts +3 -3
  116. package/dist/react/useMutators.js +3 -3
  117. package/dist/react/useUndoScope.d.ts +5 -5
  118. package/dist/react/useUndoScope.js +1 -1
  119. package/dist/schema/coordination.d.ts +69 -10
  120. package/dist/schema/coordination.js +86 -9
  121. package/dist/schema/ddl.js +2 -2
  122. package/dist/schema/diff.d.ts +1 -1
  123. package/dist/schema/generate.js +1 -1
  124. package/dist/schema/index.d.ts +10 -10
  125. package/dist/schema/index.js +18 -18
  126. package/dist/schema/queries.d.ts +27 -27
  127. package/dist/schema/queries.js +23 -23
  128. package/dist/schema/select.d.ts +3 -3
  129. package/dist/schema/select.js +3 -3
  130. package/dist/schema/serialize.d.ts +15 -6
  131. package/dist/schema/serialize.js +17 -3
  132. package/dist/schema/sugar.d.ts +6 -7
  133. package/dist/schema/sugar.js +9 -12
  134. package/dist/schema/syncDeltaRow.d.ts +4 -152
  135. package/dist/schema/syncDeltaRow.js +4 -105
  136. package/dist/server/adapter.d.ts +18 -1
  137. package/dist/server/commit.d.ts +10 -16
  138. package/dist/server/index.d.ts +1 -1
  139. package/dist/server/index.js +1 -1
  140. package/dist/server/readConfig.d.ts +1 -1
  141. package/dist/source/adapters/drizzle.d.ts +1 -1
  142. package/dist/source/adapters/drizzle.js +2 -2
  143. package/dist/source/adapters/kysely.d.ts +1 -1
  144. package/dist/source/adapters/kysely.js +1 -1
  145. package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
  146. package/dist/source/adapters/kyselyMutationCore.js +2 -2
  147. package/dist/source/adapters/memory.js +1 -1
  148. package/dist/source/adapters/prisma.d.ts +8 -3
  149. package/dist/source/adapters/prisma.js +1 -1
  150. package/dist/source/connector.js +1 -1
  151. package/dist/source/connectorProtocol.d.ts +2 -8
  152. package/dist/source/connectorProtocol.js +3 -2
  153. package/dist/source/contract.d.ts +29 -17
  154. package/dist/source/contract.js +27 -22
  155. package/dist/source/factory.d.ts +1 -1
  156. package/dist/source/footprint.d.ts +111 -0
  157. package/dist/source/footprint.js +0 -0
  158. package/dist/source/idempotency.js +2 -2
  159. package/dist/source/index.d.ts +1 -0
  160. package/dist/source/index.js +3 -0
  161. package/dist/source/next.d.ts +1 -1
  162. package/dist/source/signing.d.ts +9 -2
  163. package/dist/source/signing.js +4 -1
  164. package/dist/source/types.d.ts +6 -4
  165. package/dist/source/types.js +1 -1
  166. package/dist/stores/ObjectStore.d.ts +1 -1
  167. package/dist/stores/SyncActionStore.d.ts +1 -1
  168. package/dist/stores/SyncActionStore.js +2 -10
  169. package/dist/stores/syncAction.d.ts +26 -0
  170. package/dist/stores/syncAction.js +16 -0
  171. package/dist/surface.d.ts +3 -3
  172. package/dist/surface.js +6 -4
  173. package/dist/sync/BootstrapFetcher.d.ts +123 -6
  174. package/dist/sync/BootstrapFetcher.js +492 -66
  175. package/dist/sync/ConnectionManager.d.ts +6 -198
  176. package/dist/sync/ConnectionManager.js +6 -677
  177. package/dist/sync/OnDemandLoader.d.ts +2 -2
  178. package/dist/sync/OnDemandLoader.js +60 -21
  179. package/dist/sync/SubscriptionManager.d.ts +13 -2
  180. package/dist/sync/SubscriptionManager.js +23 -5
  181. package/dist/sync/SyncWebSocket.d.ts +27 -510
  182. package/dist/sync/SyncWebSocket.js +76 -954
  183. package/dist/sync/awaitClaimGrant.d.ts +4 -44
  184. package/dist/sync/awaitClaimGrant.js +4 -109
  185. package/dist/sync/commitFrames.d.ts +6 -40
  186. package/dist/sync/commitFrames.js +6 -97
  187. package/dist/sync/contextPorts.d.ts +18 -0
  188. package/dist/sync/contextPorts.js +31 -0
  189. package/dist/sync/createClaimStream.d.ts +5 -49
  190. package/dist/sync/createClaimStream.js +5 -469
  191. package/dist/sync/createPresenceStream.d.ts +26 -4
  192. package/dist/sync/createPresenceStream.js +28 -20
  193. package/dist/sync/createSnapshot.d.ts +2 -2
  194. package/dist/sync/createSnapshot.js +1 -1
  195. package/dist/sync/credentialLifecycle.d.ts +5 -173
  196. package/dist/sync/credentialLifecycle.js +5 -320
  197. package/dist/sync/deltaPipeline.d.ts +1 -1
  198. package/dist/sync/participants.d.ts +5 -4
  199. package/dist/sync/participants.js +29 -22
  200. package/dist/sync/schemaDrift.d.ts +55 -0
  201. package/dist/sync/schemaDrift.js +53 -0
  202. package/dist/sync/schemas.d.ts +21 -32
  203. package/dist/sync/schemas.js +26 -17
  204. package/dist/sync/syncPlan.d.ts +3 -3
  205. package/dist/sync/wsFrameHandlers.d.ts +6 -114
  206. package/dist/sync/wsFrameHandlers.js +6 -392
  207. package/dist/testing/fixtures/bootstrap.d.ts +1 -1
  208. package/dist/testing/fixtures/deltas.d.ts +1 -1
  209. package/dist/testing/fixtures/httpResponses.d.ts +70 -0
  210. package/dist/testing/fixtures/httpResponses.js +90 -0
  211. package/dist/testing/fixtures/models.js +1 -1
  212. package/dist/testing/helpers/wait.js +1 -1
  213. package/dist/testing/mocks/MockMutationExecutor.d.ts +2 -2
  214. package/dist/testing/mocks/MockMutationExecutor.js +8 -14
  215. package/dist/testing/mocks/MockSyncContext.d.ts +11 -11
  216. package/dist/testing/mocks/MockSyncContext.js +10 -9
  217. package/dist/testing/mocks/MockSyncStore.js +1 -1
  218. package/dist/testing/mocks/MockWebSocket.d.ts +2 -2
  219. package/dist/transaction/ablo.d.ts +88 -0
  220. package/dist/transaction/ablo.js +33 -0
  221. package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
  222. package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
  223. package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
  224. package/dist/transaction/auth/bootstrapScope.js +1 -0
  225. package/dist/transaction/auth/capability.d.ts +177 -0
  226. package/dist/transaction/auth/capability.js +199 -0
  227. package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
  228. package/dist/{client → transaction/auth}/identity.d.ts +8 -7
  229. package/dist/{client → transaction/auth}/identity.js +1 -1
  230. package/dist/transaction/auth/index.d.ts +162 -0
  231. package/dist/transaction/auth/index.js +304 -0
  232. package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
  233. package/dist/{auth → transaction/auth}/schemas.js +13 -13
  234. package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
  235. package/dist/{client → transaction/auth}/sessionMint.js +4 -7
  236. package/dist/transaction/coordination/awaitClaimGrant.d.ts +49 -0
  237. package/dist/transaction/coordination/awaitClaimGrant.js +112 -0
  238. package/dist/transaction/coordination/claimMeta.d.ts +49 -0
  239. package/dist/transaction/coordination/claimMeta.js +52 -0
  240. package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
  241. package/dist/transaction/coordination/createClaimStream.js +475 -0
  242. package/dist/transaction/coordination/events.d.ts +74 -0
  243. package/dist/transaction/coordination/events.js +7 -0
  244. package/dist/transaction/coordination/index.d.ts +19 -0
  245. package/dist/transaction/coordination/index.js +44 -0
  246. package/dist/transaction/coordination/locator.d.ts +83 -0
  247. package/dist/transaction/coordination/locator.js +82 -0
  248. package/dist/transaction/coordination/schema.d.ts +1473 -0
  249. package/dist/{coordination → transaction/coordination}/schema.js +490 -55
  250. package/dist/transaction/coordination/targetConflict.d.ts +2 -0
  251. package/dist/transaction/coordination/targetConflict.js +103 -0
  252. package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
  253. package/dist/{coordination → transaction/coordination}/trace.js +18 -25
  254. package/dist/transaction/durableWrites.d.ts +62 -0
  255. package/dist/{client → transaction}/durableWrites.js +28 -3
  256. package/dist/transaction/environment.d.ts +105 -0
  257. package/dist/transaction/environment.js +108 -0
  258. package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +11 -11
  259. package/dist/{errorCodes.js → transaction/errorCodes.js} +35 -12
  260. package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
  261. package/dist/{errors.js → transaction/errors.js} +85 -16
  262. package/dist/transaction/index.d.ts +20 -0
  263. package/dist/transaction/index.js +20 -0
  264. package/dist/transaction/keys/index.d.ts +87 -0
  265. package/dist/transaction/keys/index.js +207 -0
  266. package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
  267. package/dist/transaction/log/syncDeltaRow.js +95 -0
  268. package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
  269. package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
  270. package/dist/transaction/logger.d.ts +16 -0
  271. package/dist/transaction/logger.js +7 -0
  272. package/dist/transaction/observability.d.ts +53 -0
  273. package/dist/transaction/observability.js +19 -0
  274. package/dist/transaction/plugin.d.ts +192 -0
  275. package/dist/transaction/plugin.js +87 -0
  276. package/dist/{policy → transaction/policy}/types.d.ts +3 -3
  277. package/dist/{policy → transaction/policy}/types.js +2 -0
  278. package/dist/transaction/resources/httpResources.d.ts +266 -0
  279. package/dist/transaction/resources/httpResources.js +7 -0
  280. package/dist/transaction/resources/modelOperations.d.ts +319 -0
  281. package/dist/transaction/resources/modelOperations.js +12 -0
  282. package/dist/transaction/resources/mutationOptions.d.ts +66 -0
  283. package/dist/transaction/resources/mutationOptions.js +9 -0
  284. package/dist/transaction/resources/where.d.ts +85 -0
  285. package/dist/transaction/resources/where.js +70 -0
  286. package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
  287. package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
  288. package/dist/{schema → transaction/schema}/field.d.ts +5 -5
  289. package/dist/{schema → transaction/schema}/field.js +5 -5
  290. package/dist/transaction/schema/loadStrategy.d.ts +45 -0
  291. package/dist/transaction/schema/loadStrategy.js +46 -0
  292. package/dist/{schema → transaction/schema}/model.d.ts +50 -35
  293. package/dist/{schema → transaction/schema}/model.js +30 -20
  294. package/dist/transaction/schema/openapi.d.ts +57 -0
  295. package/dist/transaction/schema/openapi.js +340 -0
  296. package/dist/{schema → transaction/schema}/relation.d.ts +14 -14
  297. package/dist/{schema → transaction/schema}/relation.js +7 -7
  298. package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
  299. package/dist/{schema → transaction/schema}/residency.js +0 -5
  300. package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
  301. package/dist/{schema → transaction/schema}/roles.js +5 -5
  302. package/dist/{schema → transaction/schema}/schema.d.ts +12 -10
  303. package/dist/{schema → transaction/schema}/schema.js +4 -3
  304. package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
  305. package/dist/{schema → transaction/schema}/tenancy.js +7 -4
  306. package/dist/transaction/transactionLayer.d.ts +82 -0
  307. package/dist/transaction/transactionLayer.js +24 -0
  308. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +4 -5
  309. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
  310. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
  311. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
  312. package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +10 -36
  313. package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
  314. package/dist/transaction/transport/commitFrames.d.ts +90 -0
  315. package/dist/transaction/transport/commitFrames.js +134 -0
  316. package/dist/transaction/transport/connectionManager.d.ts +215 -0
  317. package/dist/transaction/transport/connectionManager.js +673 -0
  318. package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
  319. package/dist/transaction/transport/credentialLifecycle.js +324 -0
  320. package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
  321. package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
  322. package/dist/{client → transaction/transport}/httpClient.d.ts +59 -16
  323. package/dist/{client → transaction/transport}/httpClient.js +5 -5
  324. package/dist/transaction/transport/httpOptions.d.ts +33 -0
  325. package/dist/transaction/transport/httpOptions.js +12 -0
  326. package/dist/{client → transaction/transport}/httpTransport.js +171 -85
  327. package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
  328. package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
  329. package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
  330. package/dist/transaction/transport/wsFrameHandlers.js +429 -0
  331. package/dist/transaction/transport/wsTransport.d.ts +576 -0
  332. package/dist/transaction/transport/wsTransport.js +1017 -0
  333. package/dist/transaction/types/assertExact.d.ts +17 -0
  334. package/dist/transaction/types/assertExact.js +1 -0
  335. package/dist/{types → transaction/types}/global.d.ts +17 -2
  336. package/dist/{types → transaction/types}/global.js +2 -1
  337. package/dist/{types → transaction/types}/index.d.ts +14 -46
  338. package/dist/{types → transaction/types}/index.js +7 -16
  339. package/dist/{types → transaction/types}/streams.d.ts +63 -45
  340. package/dist/{utils → transaction/utils}/json.d.ts +18 -0
  341. package/dist/transaction/utils/json.js +276 -0
  342. package/dist/transaction/wire/accountResponses.d.ts +351 -0
  343. package/dist/transaction/wire/accountResponses.js +255 -0
  344. package/dist/transaction/wire/auth.d.ts +49 -0
  345. package/dist/transaction/wire/auth.js +57 -0
  346. package/dist/transaction/wire/claimEvent.d.ts +76 -0
  347. package/dist/transaction/wire/claimEvent.js +73 -0
  348. package/dist/transaction/wire/claims.d.ts +463 -0
  349. package/dist/transaction/wire/claims.js +229 -0
  350. package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
  351. package/dist/{wire → transaction/wire}/commit.js +68 -47
  352. package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
  353. package/dist/{wire → transaction/wire}/delta.js +37 -13
  354. package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
  355. package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
  356. package/dist/transaction/wire/feedCursor.d.ts +60 -0
  357. package/dist/transaction/wire/feedCursor.js +82 -0
  358. package/dist/transaction/wire/feedEvent.d.ts +177 -0
  359. package/dist/transaction/wire/feedEvent.js +39 -0
  360. package/dist/transaction/wire/frames.d.ts +194 -0
  361. package/dist/transaction/wire/frames.js +50 -0
  362. package/dist/transaction/wire/inboundFrames.d.ts +552 -0
  363. package/dist/transaction/wire/inboundFrames.js +116 -0
  364. package/dist/transaction/wire/index.d.ts +50 -0
  365. package/dist/transaction/wire/index.js +74 -0
  366. package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
  367. package/dist/transaction/wire/listEnvelope.js +42 -0
  368. package/dist/transaction/wire/modelResponses.d.ts +85 -0
  369. package/dist/transaction/wire/modelResponses.js +43 -0
  370. package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +79 -38
  371. package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +110 -59
  372. package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
  373. package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
  374. package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
  375. package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
  376. package/dist/transactions/mutations/commitLatency.d.ts +52 -0
  377. package/dist/transactions/mutations/commitLatency.js +130 -0
  378. package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
  379. package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
  380. package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +16 -15
  381. package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +12 -12
  382. package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +11 -11
  383. package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +7 -7
  384. package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
  385. package/dist/transactions/mutations/durableWriteStore.js +12 -0
  386. package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
  387. package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +3 -3
  388. package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +4 -3
  389. package/dist/utils/mobxSetup.d.ts +1 -1
  390. package/dist/utils/mobxSetup.js +5 -2
  391. package/dist/webhooks/events.d.ts +2 -2
  392. package/dist/wire/index.d.ts +1 -34
  393. package/dist/wire/index.js +8 -49
  394. package/docs/agent-messaging.md +3 -3
  395. package/docs/agents.md +19 -12
  396. package/docs/api-keys.md +8 -4
  397. package/docs/api.md +22 -18
  398. package/docs/audit.md +2 -0
  399. package/docs/cli.md +31 -3
  400. package/docs/client-behavior.md +8 -6
  401. package/docs/concurrency-convention.md +30 -24
  402. package/docs/coordination.md +48 -38
  403. package/docs/data-sources.md +3 -1
  404. package/docs/debugging.md +5 -3
  405. package/docs/deployment.md +267 -0
  406. package/docs/examples/agent-human.md +49 -42
  407. package/docs/examples/ai-sdk-tool.md +69 -44
  408. package/docs/examples/existing-python-backend.md +8 -6
  409. package/docs/examples/nextjs.md +129 -47
  410. package/docs/examples/scoped-agent.md +45 -44
  411. package/docs/examples/server-agent.md +46 -26
  412. package/docs/groups.md +32 -29
  413. package/docs/guarantees.md +4 -2
  414. package/docs/how-it-works.md +9 -7
  415. package/docs/idempotency.md +126 -0
  416. package/docs/identity.md +58 -54
  417. package/docs/index.md +172 -84
  418. package/docs/integration-guide.md +17 -16
  419. package/docs/interaction-model.md +6 -4
  420. package/docs/mcp.md +41 -16
  421. package/docs/migration.md +63 -5
  422. package/docs/operating-on-your-database.md +111 -0
  423. package/docs/projects.md +2 -0
  424. package/docs/quickstart.md +22 -5
  425. package/docs/react.md +12 -10
  426. package/docs/schema-contract.md +5 -3
  427. package/docs/session-settings.md +108 -0
  428. package/docs/sessions.md +3 -1
  429. package/docs/webhooks.md +3 -1
  430. package/llms.txt +47 -17
  431. package/package.json +10 -8
  432. package/dist/agent/Agent.d.ts +0 -366
  433. package/dist/agent/Agent.js +0 -514
  434. package/dist/agent/index.d.ts +0 -115
  435. package/dist/agent/index.js +0 -128
  436. package/dist/agent/session.d.ts +0 -93
  437. package/dist/agent/session.js +0 -149
  438. package/dist/agent/types.d.ts +0 -68
  439. package/dist/agent/types.js +0 -9
  440. package/dist/client/durableWrites.d.ts +0 -21
  441. package/dist/coordination/schema.d.ts +0 -722
  442. package/dist/schema/openapi.d.ts +0 -29
  443. package/dist/schema/openapi.js +0 -124
  444. package/dist/transactions/durableWriteStore.js +0 -30
  445. package/dist/utils/json.js +0 -88
  446. package/dist/wire/errorEnvelope.d.ts +0 -55
  447. package/dist/wire/frames.d.ts +0 -197
  448. package/dist/wire/frames.js +0 -49
  449. package/dist/wire/listEnvelope.js +0 -18
  450. /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
  451. /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
  452. /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
  453. /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
  454. /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
  455. /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
  456. /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
  457. /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +0 -0
  458. /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +0 -0
  459. /package/dist/{client → transaction}/persistence.d.ts +0 -0
  460. /package/dist/{client → transaction}/persistence.js +0 -0
  461. /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
  462. /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
  463. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
  464. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
  465. /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
  466. /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
  467. /package/dist/{types → transaction/types}/modelData.js +0 -0
  468. /package/dist/{types → transaction/types}/participant.d.ts +0 -0
  469. /package/dist/{types → transaction/types}/participant.js +0 -0
  470. /package/dist/{types → transaction/types}/streams.js +0 -0
  471. /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
  472. /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
  473. /package/dist/{utils → transaction/utils}/duration.d.ts +0 -0
  474. /package/dist/{utils → transaction/utils}/duration.js +0 -0
  475. /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
  476. /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
  477. /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
  478. /package/dist/{wire → transaction/wire}/protocol.js +0 -0
  479. /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
  480. /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
  481. /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
  482. /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
  483. /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
@@ -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
  */
@@ -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';
@@ -28,36 +30,44 @@ function normalizeEntityRoles(input) {
28
30
  return undefined;
29
31
  return Array.isArray(input) ? input : [input];
30
32
  }
33
+ // ── Load strategies ───────────────────────────────────────────────────────
34
+ // Defined in `./loadStrategy.ts`. Imported as well as re-exported: a bare
35
+ // `export … from` would not bind the name for the `load` fields below.
36
+ import { LoadStrategy, DEFAULT_LOAD_STRATEGY } from './loadStrategy.js';
37
+ export { LoadStrategy, DEFAULT_LOAD_STRATEGY, loadsAtBootstrap } from './loadStrategy.js';
31
38
  // ── Model factory ─────────────────────────────────────────────────────────
32
39
  /**
33
- * Defines a model from a Zod shape, with optional relations and options. The row
34
- * type is inferred from the shape; fields built with the {@link field} builders
35
- * carry extra metadata, while plain Zod fields get metadata inferred from their Zod
36
- * type. The third argument sets options such as the {@link LoadStrategy}.
40
+ * Defines a model from a Zod shape and its options. The row type is inferred from
41
+ * the shape; fields built with the {@link field} builders carry extra metadata,
42
+ * while plain Zod fields get metadata inferred from their Zod type. Everything else
43
+ * about the model its {@link ModelOptions.relations}, its {@link LoadStrategy},
44
+ * the table it maps to — lives in the second argument, so a model that needs one
45
+ * setting never has to name the settings it does not use.
37
46
  *
38
47
  * ```ts
39
48
  * import { z } from 'zod';
40
49
  * import { model, relation } from '@abloatai/ablo/schema';
41
50
  *
42
- * // Loaded at bootstrap (the default)
51
+ * // Fields alone
52
+ * const tags = model({ label: z.string() });
53
+ *
54
+ * // Loaded at bootstrap (the default), with an edge to its project
43
55
  * const tasks = model({
44
56
  * title: z.string(),
45
57
  * status: z.enum(['todo', 'doing', 'done']).default('todo'),
46
58
  * projectId: z.string().optional(),
47
59
  * }, {
48
- * project: relation.belongsTo('projects', 'projectId'),
60
+ * relations: { project: relation.belongsTo('projects', 'projectId') },
49
61
  * });
50
62
  *
51
63
  * // Loaded on first access
52
- * const slideLayers = model({ slideId: z.string(), type: z.string() }, {
53
- * slide: relation.belongsTo('slides', 'slideId'),
54
- * }, { load: 'lazy' });
55
- *
56
- * // Loaded only when explicitly requested
57
- * const auditLogs = model({ action: z.string() }, {}, { load: 'manual' });
64
+ * const blocks = model({ sectionId: z.string(), type: z.string() }, {
65
+ * relations: { section: relation.belongsTo('sections', 'sectionId') },
66
+ * load: 'lazy',
67
+ * });
58
68
  * ```
59
69
  */
60
- export function model(shape, relations, options) {
70
+ export function model(shape, options) {
61
71
  // Build the fields metadata record by walking the Zod shape.
62
72
  // Fields built with `field.*()` have structured metadata; fields built
63
73
  // with raw Zod get a fallback derived from the Zod typeName.
@@ -75,8 +85,8 @@ export function model(shape, relations, options) {
75
85
  schema: z.object(shape),
76
86
  shape,
77
87
  fields,
78
- relations: (relations ?? {}),
79
- load: options?.load ?? 'instant',
88
+ relations: (options?.relations ?? {}),
89
+ load: options?.load ?? DEFAULT_LOAD_STRATEGY,
80
90
  bootstrapLimit: options?.bootstrapLimit,
81
91
  bootstrapOrderBy: options?.bootstrapOrderBy,
82
92
  typename: options?.typename,
@@ -102,7 +112,7 @@ export function model(shape, relations, options) {
102
112
  /**
103
113
  * Returns the sync-group kind a scope-root model produces, or `undefined` when the
104
114
  * model is not a scope root. `scope: true` derives the kind from the lowercased
105
- * typename (`SlideDeck` → `slidedeck`); `scope: 'deck'` sets it explicitly, which
115
+ * typename (`ReportSection` → `reportsection`); `scope: 'section'` sets it explicitly, which
106
116
  * you use when the wire kind must differ from the typename. This is the single place
107
117
  * that decides a record's own group, so every layer that reads it agrees.
108
118
  */
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Two OpenAPI 3.1 documents describing the same API, for two different readers.
3
+ *
4
+ * The server registers ONE parameterised route family — `/api/v1/models/:model`,
5
+ * `/:id`, `/:id/claim`, `/claim/heartbeat`, `/claim/reorder`, plus `/v1/commits`.
6
+ * Six routes, whatever a tenant's schema contains. Authentication is a single
7
+ * Bearer scheme, your API key.
8
+ *
9
+ * {@link abloOpenApi} publishes exactly those six. It takes no schema, so it
10
+ * cannot grow with one: identical for every caller, stable across every push,
11
+ * and the document a Python or Go client is generated from once.
12
+ *
13
+ * {@link schemaToOpenApi} expands the same six into one set per model, with
14
+ * payloads typed from each model's introspectable {@link FieldMeta}. Five paths
15
+ * per model, regenerated on every push — worth it when you want generated types
16
+ * for one schema, and the wrong thing to hand an agent.
17
+ *
18
+ * Both return a plain JSON-serializable object; feed either into codegen (for
19
+ * example `ablo openapi > openapi.json`) or serve it directly.
20
+ */
21
+ import type { Schema, SchemaRecord } from './schema.js';
22
+ /** Options for {@link schemaToOpenApi} — the metadata stamped into the generated spec. */
23
+ export interface SchemaToOpenApiOptions {
24
+ /** Spec title. Default `"Ablo API"`. */
25
+ readonly title?: string;
26
+ /** Spec version. Default `"1.0.0"`. */
27
+ readonly version?: string;
28
+ /** API base URL. Default `"https://api.abloatai.com/api"`. */
29
+ readonly serverUrl?: string;
30
+ }
31
+ type Json = Record<string, unknown>;
32
+ /**
33
+ * The protocol reference: the five route templates the server actually serves,
34
+ * plus `/v1/commits`.
35
+ *
36
+ * This takes no schema, and that is the point. The server registers one
37
+ * parameterised route family (`/api/v1/models/:model/...`), so the API is five
38
+ * routes no matter how many models a tenant defines — and a spec that cannot see
39
+ * a schema cannot grow with one. It is publishable once, identical for every
40
+ * caller, and stable across every schema push: the document a Python or Go
41
+ * client is generated from, and the surface an agent is handed.
42
+ *
43
+ * Payload shapes are generic here by design. A caller that wants them typed
44
+ * either reads the schema at runtime or generates the per-tenant expansion with
45
+ * {@link schemaToOpenApi}.
46
+ */
47
+ export declare function abloOpenApi(options?: SchemaToOpenApiOptions): Json;
48
+ /**
49
+ * The per-tenant expansion: every model's routes written out with typed payloads.
50
+ *
51
+ * Useful when you want generated types for one schema — five paths per model, so
52
+ * it grows with the schema and is regenerated on every push. It documents the
53
+ * same five routes {@link abloOpenApi} describes; it does not describe a
54
+ * different API.
55
+ */
56
+ export declare function schemaToOpenApi<S extends SchemaRecord>(schema: Schema<S>, options?: SchemaToOpenApiOptions): Json;
57
+ export {};