@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
@@ -22,7 +22,7 @@
22
22
  * `index: true` registers a foreign-key index for the child model when the
23
23
  * engine starts, turning "every child that points at this parent" from a full
24
24
  * scan into a constant-time lookup. Reach for it on relations you query this
25
- * way often, such as a slide layer's `slideId`.
25
+ * way often, such as a block's `sectionId`.
26
26
  *
27
27
  * `enrich: true` auto-populates the parent reference on an incoming change
28
28
  * before the child data lands. A change to `Task { teamId: 't1' }` picks up the
@@ -44,11 +44,11 @@
44
44
  * relax the foreign-key check itself. For example:
45
45
  *
46
46
  * ```ts
47
- * layouts: model({ deckId: z.string().nullish() }, {
48
- * // The deck-owns-layout link is nullable and the layout is always
49
- * // created first; marking it `defer` lets the deck commit ahead of the
47
+ * layouts: model({ reportId: z.string().nullish() }, {
48
+ * // The report-owns-layout link is nullable and the layout is always
49
+ * // created first; marking it `defer` lets the report commit ahead of the
50
50
  * // layout instead of sharing its insert-order slot.
51
- * deck: relation.belongsTo('slideDecks', 'deckId', { defer: true }),
51
+ * report: relation.belongsTo('reports', 'reportId', { defer: true }),
52
52
  * }),
53
53
  * ```
54
54
  */
@@ -65,14 +65,14 @@ export interface BelongsToOptions {
65
65
  * container to the things it holds, as a folder does to its files.
66
66
  *
67
67
  * Do not set `parent` on a reference that merely points at another record for
68
- * provenance or as a template, such as `sourceSlideId` or `templateId`; doing
68
+ * provenance or as a template, such as `sourceSectionId` or `templateId`; doing
69
69
  * so would leak the record into an unrelated scope. The engine also cannot
70
70
  * infer the parent from whether a field is optional — many real parent keys
71
71
  * are optional, like a root folder or an inbox task — so you must declare the
72
72
  * parent edge explicitly.
73
73
  *
74
74
  * It reads naturally at the call site:
75
- * `belongsTo('deck', 'deckId', { parent: true })` — the deck is the parent.
75
+ * `belongsTo('report', 'reportId', { parent: true })` — the report is the parent.
76
76
  */
77
77
  readonly parent?: boolean;
78
78
  /**
@@ -84,7 +84,7 @@ export interface BelongsToOptions {
84
84
  *
85
85
  * Set `fk: true` only when the target row lives in the same database and is
86
86
  * written in the same commit as this row, and points at a strong, contained
87
- * entity. Leave it off provenance or template pointers (`sourceSlideId`,
87
+ * entity. Leave it off provenance or template pointers (`sourceSectionId`,
88
88
  * `templateId`), cross-tenant references, or anything that may be written in a
89
89
  * different transaction than its target — a hard constraint there would reject
90
90
  * the write and break out-of-order sync. The constraint is emitted as
@@ -96,7 +96,13 @@ export interface BelongsToOptions {
96
96
  declare const __relationType: unique symbol;
97
97
  declare const __relationTarget: unique symbol;
98
98
  declare const __relationField: unique symbol;
99
- export type RelationType = 'belongsTo' | 'hasMany' | 'hasOne';
99
+ /**
100
+ * The three edges the engine resolves. Inferred from `wire/modelShape.ts`
101
+ * rather than restated: the set is reported to callers by `GET /api/schema`,
102
+ * so it is protocol, and protocol has one definition.
103
+ */
104
+ export type { RelationType } from '../wire/modelShape.js';
105
+ import type { RelationType } from '../wire/modelShape.js';
100
106
  /**
101
107
  * A relation definition, carrying its type information at both the type and
102
108
  * runtime level.
@@ -157,7 +163,7 @@ export declare const relation: {
157
163
  * project: relation.belongsTo('projects', 'projectId'),
158
164
  *
159
165
  * // Register an FK index for O(1) child lookups
160
- * slide: relation.belongsTo('slides', 'slideId', { index: true }),
166
+ * section: relation.belongsTo('sections', 'sectionId', { index: true }),
161
167
  *
162
168
  * // Auto-populate the parent on delta arrival
163
169
  * team: relation.belongsTo('teams', 'teamId', { enrich: true }),
@@ -167,7 +173,7 @@ export declare const relation: {
167
173
  *
168
174
  * // Mark the soft side of a cycle so the priority computer breaks
169
175
  * // the cycle deterministically instead of tying the two models.
170
- * deck: relation.belongsTo('slideDecks', 'deckId', { defer: true }),
176
+ * report: relation.belongsTo('reports', 'reportId', { defer: true }),
171
177
  * ```
172
178
  */
173
179
  readonly belongsTo: <Target extends string, Field extends string, const Opts extends BelongsToOptions = Record<string, never>>(target: Target, foreignKey: Field, options?: Opts) => RelationDef<"belongsTo", Target, Field, Opts>;
@@ -180,11 +186,11 @@ export declare const relation: {
180
186
  * child model automatically.
181
187
  *
182
188
  * ```ts
183
- * slides: relation.hasMany('slideLayers', 'slideId'),
184
- * // → deck.slides returns all SlideLayer[] where slideId === deck.id
189
+ * blocks: relation.hasMany('blocks', 'sectionId'),
190
+ * // → section.blocks returns all Block[] where sectionId === section.id
185
191
  *
186
- * slides: relation.hasMany('slideLayers', 'slideId', { orderBy: 'zIndex' }),
187
- * // → deck.slides returns SlideLayer[] sorted by zIndex ascending
192
+ * blocks: relation.hasMany('blocks', 'sectionId', { orderBy: 'zIndex' }),
193
+ * // → section.blocks returns Block[] sorted by zIndex ascending
188
194
  * ```
189
195
  */
190
196
  readonly hasMany: <Target extends string, Field extends string>(target: Target, foreignKey: Field, options?: {
@@ -196,4 +202,3 @@ export declare const relation: {
196
202
  */
197
203
  readonly hasOne: <Target extends string, Field extends string>(target: Target, foreignKey: Field) => RelationDef<"hasOne", Target, Field>;
198
204
  };
199
- export {};
@@ -33,7 +33,7 @@ class RelationBuilder {
33
33
  * Stashed by `hasMany` when the caller provides `{ orderBy }`. Read
34
34
  * back in `createSyncEngine` to install the sort comparator on the
35
35
  * generated relation getter. Declared on the builder so both writer
36
- * and reader stay type-safe — no `as unknown as Record<...>` smuggle.
36
+ * and reader stay type-safe — no double-cast smuggle through `Record<...>`.
37
37
  */
38
38
  _orderBy;
39
39
  constructor(type, target, foreignKey, options) {
@@ -55,7 +55,7 @@ export const relation = {
55
55
  * project: relation.belongsTo('projects', 'projectId'),
56
56
  *
57
57
  * // Register an FK index for O(1) child lookups
58
- * slide: relation.belongsTo('slides', 'slideId', { index: true }),
58
+ * section: relation.belongsTo('sections', 'sectionId', { index: true }),
59
59
  *
60
60
  * // Auto-populate the parent on delta arrival
61
61
  * team: relation.belongsTo('teams', 'teamId', { enrich: true }),
@@ -65,7 +65,7 @@ export const relation = {
65
65
  *
66
66
  * // Mark the soft side of a cycle so the priority computer breaks
67
67
  * // the cycle deterministically instead of tying the two models.
68
- * deck: relation.belongsTo('slideDecks', 'deckId', { defer: true }),
68
+ * report: relation.belongsTo('reports', 'reportId', { defer: true }),
69
69
  * ```
70
70
  */
71
71
  belongsTo(target, foreignKey, options) {
@@ -80,11 +80,11 @@ export const relation = {
80
80
  * child model automatically.
81
81
  *
82
82
  * ```ts
83
- * slides: relation.hasMany('slideLayers', 'slideId'),
84
- * // → deck.slides returns all SlideLayer[] where slideId === deck.id
83
+ * blocks: relation.hasMany('blocks', 'sectionId'),
84
+ * // → section.blocks returns all Block[] where sectionId === section.id
85
85
  *
86
- * slides: relation.hasMany('slideLayers', 'slideId', { orderBy: 'zIndex' }),
87
- * // → deck.slides returns SlideLayer[] sorted by zIndex ascending
86
+ * blocks: relation.hasMany('blocks', 'sectionId', { orderBy: 'zIndex' }),
87
+ * // → section.blocks returns Block[] sorted by zIndex ascending
88
88
  * ```
89
89
  */
90
90
  hasMany(target, foreignKey, options) {
@@ -27,12 +27,3 @@ export declare const residencySchema: z.ZodEnum<{
27
27
  export type ModelResidency = z.infer<typeof residencySchema>;
28
28
  /** Default residency for a model that doesn't declare one — the tenant data plane. */
29
29
  export declare const DEFAULT_RESIDENCY: ModelResidency;
30
- /** @deprecated Use `residencySchema`. */
31
- export declare const planeSchema: z.ZodEnum<{
32
- tenant: "tenant";
33
- control: "control";
34
- }>;
35
- /** @deprecated Use `ModelResidency`. */
36
- export type SchemaPlane = ModelResidency;
37
- /** @deprecated Use `DEFAULT_RESIDENCY`. */
38
- export declare const DEFAULT_PLANE: "tenant";
@@ -23,8 +23,3 @@ import { z } from 'zod';
23
23
  export const residencySchema = z.enum(['tenant', 'control']);
24
24
  /** Default residency for a model that doesn't declare one — the tenant data plane. */
25
25
  export const DEFAULT_RESIDENCY = 'tenant';
26
- // ── Deprecated aliases (published schema subpath) ───────────────────────────
27
- /** @deprecated Use `residencySchema`. */
28
- export const planeSchema = residencySchema;
29
- /** @deprecated Use `DEFAULT_RESIDENCY`. */
30
- export const DEFAULT_PLANE = DEFAULT_RESIDENCY;
@@ -14,7 +14,7 @@ import { z } from 'zod';
14
14
  * Reads fields off an identity context (`organizationId`, `teamIds`).
15
15
  *
16
16
  * • {@link EntityRole} — "which groups does this *record* live in?" Reads
17
- * fields off the record itself (`id`, `deckId`), so the server can fan a
17
+ * fields off the record itself (`id`, `reportId`), so the server can fan a
18
18
  * committed delta to the right entity streams regardless of what the
19
19
  * committer was subscribed to.
20
20
  *
@@ -110,11 +110,11 @@ export type Role = z.infer<typeof roleSchema>;
110
110
  export type IdentityRole = Role;
111
111
  /**
112
112
  * Record-anchored role. Reads a record field; `kind` names the group. A record
113
- * can route to a group keyed by its own `id` *or* a foreign key like `deckId`.
113
+ * can route to a group keyed by its own `id` *or* a foreign key like `reportId`.
114
114
  *
115
115
  * ```ts
116
- * entityRole({ kind: 'deck', source: 'id' }) // a deckdeck:<id>
117
- * entityRole({ kind: 'deck', source: 'deckId' }) // a layer → its parent deck
116
+ * entityRole({ kind: 'report', source: 'id' }) // a reportreport:<id>
117
+ * entityRole({ kind: 'report', source: 'reportId' }) // a block → its parent report
118
118
  * ```
119
119
  */
120
120
  export type EntityRole = Role;
@@ -203,7 +203,7 @@ export declare function entityRole(spec: {
203
203
  /**
204
204
  * Evaluate a {@link RoleSource} against a context. Absent or falsy fields yield
205
205
  * `[]`, so a role whose field isn't present (a user with no `teamIds`, a record
206
- * with no `deckId`) is a silent no-op.
206
+ * with no `reportId`) is a silent no-op.
207
207
  */
208
208
  export declare function extractRoleIds(context: RoleContext, source: RoleSource): readonly string[];
209
209
  /** Identity-side name for {@link extractRoleIds}. */
@@ -14,7 +14,7 @@ import { z } from 'zod';
14
14
  * Reads fields off an identity context (`organizationId`, `teamIds`).
15
15
  *
16
16
  * • {@link EntityRole} — "which groups does this *record* live in?" Reads
17
- * fields off the record itself (`id`, `deckId`), so the server can fan a
17
+ * fields off the record itself (`id`, `reportId`), so the server can fan a
18
18
  * committed delta to the right entity streams regardless of what the
19
19
  * committer was subscribed to.
20
20
  *
@@ -73,7 +73,7 @@ export function identityAnchor(kind, id) {
73
73
  // ── Role source ─────────────────────────────────────────────────────────────
74
74
  /** Validates how a role pulls ids out of a context (identity or record). */
75
75
  export const roleSourceSchema = z.object({
76
- /** The context field to read, e.g. `'organizationId'`, `'id'`, `'deckId'`. */
76
+ /** The context field to read, e.g. `'organizationId'`, `'id'`, `'reportId'`. */
77
77
  field: z.string().regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/, 'source must be a valid identifier'),
78
78
  /**
79
79
  * When `true`, `field` holds an array; every non-empty string element yields
@@ -88,7 +88,7 @@ export const roleSourceSchema = z.object({
88
88
  * no template/placeholder for the author to get wrong.
89
89
  */
90
90
  export const roleSchema = z.object({
91
- kind: z.string().regex(/^[a-z][a-z0-9_]*$/, 'kind must be a lowercase identifier, e.g. "deck"'),
91
+ kind: z.string().regex(/^[a-z][a-z0-9_]*$/, 'kind must be a lowercase identifier, e.g. "report"'),
92
92
  source: roleSourceSchema,
93
93
  });
94
94
  /** Validates an {@link IdentityRole}. */
@@ -102,7 +102,7 @@ export const entityRoleSchema = roleSchema;
102
102
  */
103
103
  export const scopeSchema = z.union([
104
104
  z.boolean(),
105
- z.string().regex(/^[a-z][a-z0-9_]*$/, 'scope kind must be a lowercase identifier, e.g. "dataroom"'),
105
+ z.string().regex(/^[a-z][a-z0-9_]*$/, 'scope kind must be a lowercase identifier, e.g. "workspace"'),
106
106
  ]);
107
107
  /**
108
108
  * Validates a model's `grants` membership edge. Both values are relation names
@@ -148,7 +148,7 @@ export function entityRole(spec) {
148
148
  /**
149
149
  * Evaluate a {@link RoleSource} against a context. Absent or falsy fields yield
150
150
  * `[]`, so a role whose field isn't present (a user with no `teamIds`, a record
151
- * with no `deckId`) is a silent no-op.
151
+ * with no `reportId`) is a silent no-op.
152
152
  */
153
153
  export function extractRoleIds(context, source) {
154
154
  const raw = context[source.field];
@@ -23,6 +23,7 @@ import { z } from 'zod';
23
23
  import type { ModelDef, RelationRecord } from './model.js';
24
24
  import type { RelationDef } from './relation.js';
25
25
  import type { IdentityRole } from './roles.js';
26
+ import { type FieldRef } from './fieldRef.js';
26
27
  export { type IdentityRole, type IdentityRoleSource, type IdentityContext, type EntityRole, type EntityRoleSource, type EntityContext, type RoleSource, type RoleContext, type SyncGroup, type SyncGroupInput, identityRole, entityRole, extractIdentityIds, extractEntityIds, composeIdentitySyncGroups, composeEntitySyncGroups, intersectRequestedWithAllowed, syncGroup, syncGroupSchema, syncGroupInputSchema, isSyncGroupInput, identityRoleSchema, entityRoleSchema, roleSchema, roleSourceSchema, scopeSchema, grantsRefSchema, groupsInputSchema, type GroupsInput, } from './roles.js';
27
28
  /** The set of built-in casing conventions supported by `defineSchema`. */
28
29
  export type CasingConvention = 'snake_case' | 'camelCase';
@@ -141,7 +142,7 @@ export type BaseModelFields = z.infer<typeof baseFieldsSchema>;
141
142
  * input types, since methods are not valid input.
142
143
  */
143
144
  export interface BaseModelMethods {
144
- /** Wire-format model name (e.g. `'Slide'`, `'Comment'`). */
145
+ /** Wire-format model name (e.g. `'Section'`, `'Comment'`). */
145
146
  getModelName(): string;
146
147
  /** Plain-object serialization suitable for sending over the wire. */
147
148
  toJSON(): Record<string, unknown>;
@@ -150,6 +151,23 @@ export interface BaseModelMethods {
150
151
  export interface Schema<S extends SchemaRecord = SchemaRecord> {
151
152
  /** The raw model definitions */
152
153
  readonly models: S;
154
+ /**
155
+ * Every declared field as a {@link FieldRef} — the field as a value rather
156
+ * than a quoted name: `schema.fields.tasks.status`.
157
+ *
158
+ * A surface that names a field takes one of these instead of a string, so a
159
+ * name that does not exist stops compiling and a rename is a compile error at
160
+ * every use. Claims are the first caller; anything else that has to say
161
+ * "which field" should take a reference for the same reason.
162
+ *
163
+ * Base fields (`id`, `createdAt`, …) are not here: the schema does not
164
+ * declare them, and a caller naming one means the row, not a part of it.
165
+ */
166
+ readonly fields: {
167
+ readonly [K in keyof S]: S[K] extends ModelDef<infer Shape> ? {
168
+ readonly [F in Extract<keyof Shape, string>]: FieldRef;
169
+ } : never;
170
+ };
153
171
  /** Zod schemas with base fields merged in */
154
172
  readonly validators: {
155
173
  readonly [K in keyof S]: S[K] extends ModelDef<infer Shape> ? z.ZodObject<Shape & typeof baseFieldsSchema.shape> : never;
@@ -208,9 +226,11 @@ type RegisteredSchema = import('../types/global.js').Register extends {
208
226
  */
209
227
  export type Model<A, B = never> = [B] extends [never] ? A extends keyof RegisteredSchema['models'] ? InferModel<RegisteredSchema, A> : never : A extends Schema ? InferModel<A, B extends keyof A['models'] ? B : never> : never;
210
228
  /**
211
- * @deprecated Use {@link Model} instead `Model<typeof schema, 'tasks'>` reads
212
- * as the domain ("the Task model from my schema") rather than the machinery.
213
- * Kept as an alias with no behavioral difference.
229
+ * The row type {@link Model} resolves to. Internal: `Model<typeof schema,
230
+ * 'tasks'>` is the published spelling, because it reads as the domain rather
231
+ * than the machinery. This one is no longer exported from any subpath — it
232
+ * stays because `Model` is defined in terms of it, not as a second name for
233
+ * the same idea.
214
234
  */
215
235
  export type InferModel<S extends Schema, ModelName extends keyof S['models']> = S['models'][ModelName] extends ModelDef<infer Shape, infer R, infer C> ? // `Omit<…, keyof BaseModelFields>` so a model that (wrongly) redeclares a
216
236
  Omit<z.infer<z.ZodObject<Shape>>, keyof BaseModelFields> & BaseModelFields & BaseModelMethods & InferComputed<C> & InferRelations<S, R> : never;
@@ -218,7 +238,7 @@ Omit<z.infer<z.ZodObject<Shape>>, keyof BaseModelFields> & BaseModelFields & Bas
218
238
  * Infer the relation accessor types from a model's relations record.
219
239
  *
220
240
  * At runtime the engine installs a getter for each declared relation, so this
221
- * type mirrors them and you can read `slide.layers` and `slide.deck` without a
241
+ * type mirrors them and you can read `section.blocks` and `section.report` without a
222
242
  * cast.
223
243
  *
224
244
  * - `hasMany` → `InferModel<S, Target>[]`
@@ -226,7 +246,7 @@ Omit<z.infer<z.ZodObject<Shape>>, keyof BaseModelFields> & BaseModelFields & Bas
226
246
  * when the foreign key is unset or the parent has not loaded yet)
227
247
  *
228
248
  * Kept `readonly` because the accessors are getters with no setter — assigning
229
- * to `slide.layers` would have no effect at runtime.
249
+ * to `section.blocks` would have no effect at runtime.
230
250
  */
231
251
  export type InferRelations<S extends Schema, R extends RelationRecord> = string extends keyof R ? unknown : {
232
252
  readonly [K in keyof R]: R[K] extends RelationDef<infer Type, infer Target> ? Target extends keyof S['models'] ? Type extends 'hasMany' ? InferModel<S, Target>[] : Type extends 'hasOne' | 'belongsTo' ? InferModel<S, Target> | undefined : never : never : never;
@@ -239,7 +259,7 @@ export type InferRelations<S extends Schema, R extends RelationRecord> = string
239
259
  *
240
260
  * Relations (`hasMany` / `belongsTo`) are store-backed getters that exist only
241
261
  * on the pool's model instances, so a reactive row honestly omits them —
242
- * reading `row.layers` is a compile error instead of a silent `undefined`.
262
+ * reading `row.blocks` is a compile error instead of a silent `undefined`.
243
263
  * Compose relations through a selector or hook instead.
244
264
  *
245
265
  * The same pairing other data layers converged on: Zero's data-only `Row<...>`
@@ -253,12 +273,12 @@ Omit<z.infer<z.ZodObject<Shape>>, keyof BaseModelFields> & BaseModelFields & Inf
253
273
  * `ablo/register.ts` registers the schema, a single argument is all it takes:
254
274
  *
255
275
  * ```ts
256
- * type SlideRow = Row<'slides'>; // data fields + computeds, no relations
257
- * type Slide = Model<'slides'>; // the pool's model instance
276
+ * type SectionRow = Row<'sections'>; // data fields + computeds, no relations
277
+ * type Section = Model<'sections'>; // the pool's model instance
258
278
  * ```
259
279
  *
260
280
  * Without that registration, or for a second schema, pass the schema
261
- * explicitly: `Row<typeof schema, 'slides'>`.
281
+ * explicitly: `Row<typeof schema, 'sections'>`.
262
282
  */
263
283
  export type Row<A, B = never> = [B] extends [never] ? A extends keyof RegisteredSchema['models'] ? InferRow<RegisteredSchema, A> : never : A extends Schema ? InferRow<A, B extends keyof A['models'] ? B : never> : never;
264
284
  /**
@@ -319,4 +339,13 @@ export type UpdateValue<S extends Schema, ModelName extends keyof S['models']> =
319
339
  export interface DeleteId<S extends Schema, ModelName extends keyof S['models']> {
320
340
  id: string;
321
341
  }
342
+ /**
343
+ * One {@link FieldRef} per declared field, keyed by model then field.
344
+ *
345
+ * Every construction of a {@link Schema} goes through here — `defineSchema`,
346
+ * the `selectModels`/`omitModels` projections, and the deserializer — so a
347
+ * projection carries references for exactly the models it kept and a schema
348
+ * rebuilt from JSON carries them at all.
349
+ */
350
+ export declare function buildFieldRefs(models: Record<string, ModelDef>): Record<string, Record<string, FieldRef>>;
322
351
  export declare function defineSchema<const S extends SchemaRecord>(models: S, options?: DefineSchemaOptions): Schema<S>;
@@ -21,6 +21,7 @@
21
21
  */
22
22
  import { z } from 'zod';
23
23
  import { AbloValidationError } from '../errors.js';
24
+ import { fieldRef } from './fieldRef.js';
24
25
  import { scopeSchema, grantsRefSchema } from './roles.js';
25
26
  // Sync-group roles (identity and entity) are defined in `./roles.js` and
26
27
  // re-exported here so they can also be imported from this module. See
@@ -63,6 +64,7 @@ export const RESERVED_SESSION_SETTINGS = [
63
64
  'app.current_sandbox_id',
64
65
  'app.current_participant_id',
65
66
  'app.current_participant_kind',
67
+ 'app.current_user_id',
66
68
  ];
67
69
  /**
68
70
  * Base fields every synced model gets automatically.
@@ -152,6 +154,24 @@ function assertRoundTrippableCamelCase(modelName, fieldName) {
152
154
  }
153
155
  }
154
156
  }
157
+ /**
158
+ * One {@link FieldRef} per declared field, keyed by model then field.
159
+ *
160
+ * Every construction of a {@link Schema} goes through here — `defineSchema`,
161
+ * the `selectModels`/`omitModels` projections, and the deserializer — so a
162
+ * projection carries references for exactly the models it kept and a schema
163
+ * rebuilt from JSON carries them at all.
164
+ */
165
+ export function buildFieldRefs(models) {
166
+ const refs = {};
167
+ for (const [model, def] of Object.entries(models)) {
168
+ const perField = {};
169
+ for (const field of Object.keys(def.shape))
170
+ perField[field] = fieldRef(model, field);
171
+ refs[model] = perField;
172
+ }
173
+ return refs;
174
+ }
155
175
  export function defineSchema(models, options) {
156
176
  // Build validators with base fields merged in, and resolve defaults for
157
177
  // `typename` and `persist.store` so downstream code (the loader and the
@@ -159,10 +179,10 @@ export function defineSchema(models, options) {
159
179
  // them at every call site.
160
180
  //
161
181
  // Defaults:
162
- // typename ← schema key (e.g. `slideLayer` → `'slideLayer'`)
182
+ // typename ← schema key (e.g. `block` → `'block'`)
163
183
  // persist.store ← typename (only resolved when `persist` was provided)
164
184
  //
165
- // A consumer that passes `typename: 'SlideLayer'` explicitly (common when
185
+ // A consumer that passes `typename: 'Block'` explicitly (common when
166
186
  // the wire shape uses PascalCase while the schema key is camelCase) keeps
167
187
  // that value — the fallback only fires when the field is unset.
168
188
  //
@@ -227,6 +247,7 @@ export function defineSchema(models, options) {
227
247
  // already part of ModelDef, so the shape is structurally unchanged.
228
248
  models: resolvedModels,
229
249
  validators: validators,
250
+ fields: buildFieldRefs(resolvedModels),
230
251
  identityRoles: options?.identityRoles ?? [],
231
252
  sessionSettings: options?.sessionSettings ?? {},
232
253
  };
@@ -266,7 +287,7 @@ function validateSyncGroupSchema(models) {
266
287
  for (const [name, def] of Object.entries(models)) {
267
288
  // Shape-validate the `scope` declaration via the shared Zod schema.
268
289
  if (def.scope !== undefined && !scopeSchema.safeParse(def.scope).success) {
269
- throw new AbloValidationError(`Model "${name}": scope kind "${String(def.scope)}" must be a lowercase identifier (e.g. 'dataroom').`, { code: 'schema_scope_kind_invalid', param: `${name}.scope` });
290
+ throw new AbloValidationError(`Model "${name}": scope kind "${String(def.scope)}" must be a lowercase identifier (e.g. 'workspace').`, { code: 'schema_scope_kind_invalid', param: `${name}.scope` });
270
291
  }
271
292
  if (!def.grants)
272
293
  continue;
@@ -26,7 +26,7 @@ import { z } from 'zod';
26
26
  export declare const DEFAULT_ORG_COLUMN = "organization_id";
27
27
  /**
28
28
  * Scopes a table's rows through a parent table, for rows that carry no tenancy
29
- * column of their own (for example, slide layers scoped through their slide, deck,
29
+ * column of their own (for example, blocks scoped through their section, report,
30
30
  * and organization). This is the canonical `parent` payload; authors write the
31
31
  * friendlier {@link PolicyInput} `{ by: 'parent', fk, parent }` form, which
32
32
  * {@link resolvePolicy} normalizes into this.
@@ -26,7 +26,7 @@ import { z } from 'zod';
26
26
  export const DEFAULT_ORG_COLUMN = 'organization_id';
27
27
  /**
28
28
  * Scopes a table's rows through a parent table, for rows that carry no tenancy
29
- * column of their own (for example, slide layers scoped through their slide, deck,
29
+ * column of their own (for example, blocks scoped through their section, report,
30
30
  * and organization). This is the canonical `parent` payload; authors write the
31
31
  * friendlier {@link PolicyInput} `{ by: 'parent', fk, parent }` form, which
32
32
  * {@link resolvePolicy} normalizes into this.
@@ -90,9 +90,9 @@ export const policyInputSchema = z
90
90
  by: z.enum(['column', 'parent', 'none', 'source']),
91
91
  /** `by: 'column'` — override the physical tenancy column name. Default {@link DEFAULT_ORG_COLUMN}. */
92
92
  column: z.string().min(1).optional(),
93
- /** `by: 'parent'` — column on this table that points at the parent (for example, `'slideId'`). */
93
+ /** `by: 'parent'` — column on this table that points at the parent (for example, `'sectionId'`). */
94
94
  fk: z.string().min(1).optional(),
95
- /** `by: 'parent'` — parent table name (e.g. `'slides'`). */
95
+ /** `by: 'parent'` — parent table name (e.g. `'sections'`). */
96
96
  parent: z.string().min(1).optional(),
97
97
  /** `by: 'parent'` — column on the parent that `fk` references. Default `'id'`. */
98
98
  parentKey: z.string().min(1).optional(),
@@ -138,7 +138,10 @@ export const policyInputSchema = z
138
138
  });
139
139
  }
140
140
  });
141
- const _policyInputAssignable = true;
141
+ const _policyInputAssignable = [
142
+ true,
143
+ true,
144
+ ];
142
145
  void _policyInputAssignable;
143
146
  /**
144
147
  * Normalizes the authoring {@link PolicyInput} into the canonical {@link Tenancy}.
@@ -0,0 +1,82 @@
1
+ /**
2
+ * The transaction layer's seam — the surface the sync engine (and any other
3
+ * caller) sits on. ADR 0013's thesis as an interface: the layer defines,
4
+ * orders, settles, and authorizes changes; it holds no materialised state.
5
+ *
6
+ * `observe()` is the whole seam in one method. The sync engine is `observe()`
7
+ * piped into a materializer — deltas → local store → IndexedDB → reactive
8
+ * re-render — plus local optimistic mutations reconciled against `commit()` /
9
+ * `settled()`. Everything reactive is downstream of that method; the
10
+ * transaction layer never calls up into it.
11
+ *
12
+ * `participant` stays the WHO (user | agent | system), never the name of this.
13
+ * The taught verbs map onto the seam directly: `create`/`update`/`delete` are
14
+ * operations inside a `commit()` payload; `claim` is `claim()`; `track` rides
15
+ * the commit payload's `track` field (a durable premise is a zero-operation
16
+ * commit). Presence (`join`) is deliberately absent: it is live observation
17
+ * over a socket, and it joins the seam when its core carrier type exists —
18
+ * see docs/plans/transaction-core-language.md, Tier 3.
19
+ *
20
+ * This is the contract, not a runtime: nothing in this package implements it
21
+ * yet. The first explicit implementation (a headless client, a test harness)
22
+ * gains a compile-time conformance pin against this interface.
23
+ */
24
+ import type { CommitMessage } from './wire/frames.js';
25
+ import type { CommitReceiptWire } from './wire/commit.js';
26
+ import type { Delta, HeldClaim, ClaimTarget, ClaimLeaseOptions } from './types/streams.js';
27
+ import type { ModelData } from './types/modelData.js';
28
+ import type { ModelScope } from './types/index.js';
29
+ /**
30
+ * A commit's durable acceptance — `{ status: 'queued' }` with the correlation
31
+ * the settlement feed later confirms. The wire layer names this
32
+ * {@link CommitReceiptWire}; the seam names it plainly.
33
+ */
34
+ export type CommitReceipt = CommitReceiptWire;
35
+ /**
36
+ * The seam's read grammar for {@link TransactionLayer.list} — filter, order,
37
+ * and page through settled rows. Mirrors the taught list options
38
+ * (`where` / `orderBy` / `limit` / `offset` / `state`) without binding the
39
+ * seam to the client's local-read machinery.
40
+ */
41
+ export interface ListQuery {
42
+ /** Equality filter on field values. */
43
+ where?: ModelData;
44
+ /** Sort order, field → direction. */
45
+ orderBy?: Record<string, 'asc' | 'desc'>;
46
+ limit?: number;
47
+ offset?: number;
48
+ /** Lifecycle filter; defaults to `'live'`. */
49
+ state?: `${ModelScope}`;
50
+ }
51
+ /**
52
+ * The transaction layer. Reads return settled state, point-in-time — never a
53
+ * reactive subscription. A write is an intent submitted through `commit()`;
54
+ * durable acceptance is the receipt (`queued`), and `settled()` resolves when
55
+ * the sync log has appended it (`confirmed`).
56
+ */
57
+ export interface TransactionLayer {
58
+ /** Authentication: mint or renew the short-lived credential (`ek_`). */
59
+ ready(): Promise<void>;
60
+ /** Read one settled row by id, or `null` when absent. */
61
+ get(model: string, id: string): Promise<ModelData | null>;
62
+ /** Read settled rows matching a {@link ListQuery}. */
63
+ list(model: string, query?: ListQuery): Promise<ModelData[]>;
64
+ /**
65
+ * Submit a batch of operations — with its idempotent `clientTxId`, its
66
+ * `reads` premise, and any durable `track` registrations — and receive
67
+ * durable acceptance.
68
+ */
69
+ commit(payload: CommitMessage['payload']): Promise<CommitReceipt>;
70
+ /** Resolve when the receipt's operations have appended to the sync log. */
71
+ settled(receipt: CommitReceipt): Promise<void>;
72
+ /**
73
+ * Take a FIFO lease with a fence token on a target; release through the
74
+ * handle (`await using` disposes it).
75
+ */
76
+ claim(target: ClaimTarget, options?: ClaimLeaseOptions): Promise<HeldClaim>;
77
+ /**
78
+ * The authoritative change feed, scoped to one or more sync groups —
79
+ * omitted, everything the credential can see.
80
+ */
81
+ observe(scope?: string | readonly string[]): AsyncIterable<Delta>;
82
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * The transaction layer's seam — the surface the sync engine (and any other
3
+ * caller) sits on. ADR 0013's thesis as an interface: the layer defines,
4
+ * orders, settles, and authorizes changes; it holds no materialised state.
5
+ *
6
+ * `observe()` is the whole seam in one method. The sync engine is `observe()`
7
+ * piped into a materializer — deltas → local store → IndexedDB → reactive
8
+ * re-render — plus local optimistic mutations reconciled against `commit()` /
9
+ * `settled()`. Everything reactive is downstream of that method; the
10
+ * transaction layer never calls up into it.
11
+ *
12
+ * `participant` stays the WHO (user | agent | system), never the name of this.
13
+ * The taught verbs map onto the seam directly: `create`/`update`/`delete` are
14
+ * operations inside a `commit()` payload; `claim` is `claim()`; `track` rides
15
+ * the commit payload's `track` field (a durable premise is a zero-operation
16
+ * commit). Presence (`join`) is deliberately absent: it is live observation
17
+ * over a socket, and it joins the seam when its core carrier type exists —
18
+ * see docs/plans/transaction-core-language.md, Tier 3.
19
+ *
20
+ * This is the contract, not a runtime: nothing in this package implements it
21
+ * yet. The first explicit implementation (a headless client, a test harness)
22
+ * gains a compile-time conformance pin against this interface.
23
+ */
24
+ export {};
@@ -91,12 +91,11 @@ export declare const durableCommitEnvelopeSchema: z.ZodObject<{
91
91
  }, z.core.$strip>>;
92
92
  sourceMutationIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
93
93
  commitOptions: z.ZodDefault<z.ZodObject<{
94
- causedByTaskId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
95
94
  reads: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
96
95
  model: z.ZodString;
97
96
  id: z.ZodString;
98
97
  readAt: z.ZodNumber;
99
- fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
98
+ fields: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodString>>>;
100
99
  onStale: z.ZodOptional<z.ZodEnum<{
101
100
  reject: "reject";
102
101
  overwrite: "overwrite";
@@ -112,8 +111,8 @@ export declare const durableCommitEnvelopeSchema: z.ZodObject<{
112
111
  }>>;
113
112
  }, z.core.$strip>]>>>>;
114
113
  track: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
115
- model: z.ZodString;
116
114
  id: z.ZodString;
115
+ model: z.ZodString;
117
116
  readAt: z.ZodOptional<z.ZodNumber>;
118
117
  }, z.core.$strip>, z.ZodObject<{
119
118
  group: z.ZodString;
@@ -137,8 +136,8 @@ export declare function commitEnvelopeRecordId(idempotencyKey: string): string;
137
136
  /** Constructs validated member metadata when an in-memory batch is formed. */
138
137
  export declare function createCommitEnvelopeMember(value: z.input<typeof commitEnvelopeMemberSchema>): CommitEnvelopeMember;
139
138
  /**
140
- * Freezes the exact JSON request that will be persisted and sent. The JSON
141
- * round-trip deliberately applies the same Date/undefined semantics as the
142
- * WebSocket transport before the request fingerprint becomes durable.
139
+ * Freezes the exact JSON request that will be persisted and sent. The shared
140
+ * snapshot contract makes framework proxies plain and rejects values that
141
+ * would be lost or corrupted by JSON serialization.
143
142
  */
144
143
  export declare function createDurableCommitEnvelope(value: Omit<z.input<typeof durableCommitEnvelopeSchema>, 'id' | 'type' | 'storageVersion' | 'timestamp'>): DurableCommitEnvelope;