@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
@@ -1,253 +1,12 @@
1
1
  /**
2
- * Shared resource types for the typed clients and private HTTP transport.
3
- * the commit and claim shapes, the session-mint params and resource, and the
4
- * {@link HttpClaimApi} derivation. This module holds only types and has no runtime
5
- * imports.
6
- */
7
- import type { ReadDependency, TrackDependency } from '../coordination/schema.js';
8
- import type { ClientCommitReceipt, CommitStatus } from '../wire/commit.js';
9
- import type { ModelTarget, ModelClaim } from '../coordination/schema.js';
10
- export type { ModelTarget, ModelClaim };
11
- import type { SchemaRecord } from '../schema/schema.js';
12
- import type { SyncGroupInput } from '../schema/roles.js';
13
- import type { Claim, ClaimStream, ClaimWaitOptions, Duration, HeldClaim } from '../types/streams.js';
14
- import type { ClaimOptions, ClaimParams, ClaimReadApi, AwaitedClaimMethod } from './createModelProxy.js';
15
- /**
16
- * The operations available on each model in the sync engine:
17
- * `retrieve({ id })` — an async single-row server read
18
- * `list({ where })` — an async collection server read
19
- * `get(id)` / `getAll(...)` / `getCount(...)` — synchronous local-cache reads
20
- * `create({ data })` / `update({ id, data })` / `delete({ id })` — writes
21
- * `claim({ id })` — a durable claim handle for coordinated writes
22
- */
23
- export type { LocalCountOptions, LocalReadOptions, ModelListScope, ServerReadOptions, ModelRetrieveParams, ModelCreateParams, ModelUpdateParams, ModelDeleteParams, ClaimOptions, ClaimParams, ClaimLookupParams, ClaimReorderParams, Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, HeldLease, ModelOperations, } from './createModelProxy.js';
24
- export type ModelOperationAction = 'create' | 'update' | 'delete' | 'archive' | 'unarchive';
25
- export type CommitWait = CommitStatus;
26
- export type IfClaimedPolicy = 'return' | 'fail';
27
- export interface ClaimedOptions {
28
- /**
29
- * What to do when another participant has claimed the target: `return` lets
30
- * the read proceed; `fail` throws `AbloClaimedError`. Inspect claim state via
31
- * `ablo.<model>.claim.state({ id })`. Waiting is a claim-side concern — take
32
- * `ablo.<model>.claim({ id })` (it queues fairly); reads never block.
33
- */
34
- readonly ifClaimed?: IfClaimedPolicy;
35
- }
36
- export type { ClaimWaitOptions } from '../types/streams.js';
37
- export interface ModelReadOptions extends ClaimedOptions {
38
- }
39
- export interface ClaimCreateOptions {
40
- readonly target: ModelTarget;
41
- /** Peer-visible description of the work — the same field on every claim
42
- * surface. Defaults to `'editing'` when omitted. */
43
- readonly description?: string;
44
- readonly ttl?: Duration;
45
- /**
46
- * Join the server's fair FIFO queue when the target is already claimed,
47
- * rather than failing immediately. `create` then resolves only once the
48
- * lease is actually ours (the server pushes `claim_acquired` if the target
49
- * was free, or `claim_granted` when we reach the head of the line). Without
50
- * this, a contended claim throws. Used by `ablo.<model>.claim` so writers
51
- * serialize instead of racing.
52
- */
53
- readonly queue?: boolean;
54
- /** Cap on how long to wait for a queued grant before rejecting. */
55
- readonly waitTimeoutMs?: number;
56
- /**
57
- * Backpressure: reject with `AbloClaimedError('queue_too_deep')` instead of
58
- * waiting if the queue is already `>= maxQueueDepth` when we join.
59
- */
60
- readonly maxQueueDepth?: number;
61
- }
62
- export interface CommitOperationInput {
63
- readonly action: ModelOperationAction;
64
- /** The model name — matches `ablo.<model>` and the schema's `model()`. */
65
- readonly model: string;
66
- readonly id?: string | null;
67
- readonly data?: Record<string, unknown> | null;
68
- readonly transactionId?: string | null;
69
- readonly readAt?: number | null;
70
- readonly onStale?: 'reject' | 'overwrite' | 'notify' | null;
71
- /** Fencing token (Option B) from the batch's claim handle; server-validated. */
72
- readonly fenceToken?: number | null;
73
- }
74
- export interface CommitCreateOptions {
75
- readonly idempotencyKey?: string | null;
76
- readonly readAt?: number | null;
77
- readonly onStale?: 'reject' | 'overwrite' | 'notify' | null;
78
- /**
79
- * A claim handle from `ablo.<model>.claim({ id })` (or the HTTP claim
80
- * surface). Same vocabulary as the per-model writes: the handle's
81
- * snapshot watermark becomes the batch `readAt` default and `onStale`
82
- * defaults to `'reject'`, so a commit that follows a claim is guarded
83
- * against concurrent edits without re-stating the watermark by hand.
84
- * Explicit `readAt`/`onStale` on the options win.
85
- */
86
- readonly claim?: Claim | null;
87
- /** One atomic batch. Use a one-element array for a single operation. */
88
- readonly operations: readonly CommitOperationInput[];
89
- readonly wait?: CommitWait;
90
- /**
91
- * Batch-level read dependencies — the "did anything I looked at change?" guard.
92
- * Declare the rows (`{ model, id, readAt, fields? }`) or sync groups
93
- * (`{ group, readAt }`, for example `deck:abc`) this batch was premised on; the
94
- * server checks that none moved since `readAt` and fires the entry's `onStale`
95
- * over the batch. This is distinct from the write-target `readAt`: it guards what
96
- * you read, not what you write.
97
- */
98
- readonly reads?: readonly ReadDependency[] | null;
99
- /**
100
- * Durable read-dependencies to register as part of this batch — the persisted
101
- * sibling of `reads`. Where `reads` guards only this commit, a `track` entry
102
- * (`{ model, id, readAt? }` for a row or `{ group, readAt? }` for a sync group)
103
- * lives on past it: a later matching change rides back on a future receipt's
104
- * `notifications`. A track-only batch (just `track`, an empty `operations`) is
105
- * the batch form of `ablo.<model>.track()`.
106
- */
107
- readonly track?: readonly TrackDependency[] | null;
108
- }
109
- /** Public projection inferred from the canonical runtime schema. */
110
- export type CommitReceipt = ClientCommitReceipt;
111
- export interface CommitResource {
112
- create(options: CommitCreateOptions): Promise<CommitReceipt>;
113
- }
114
- export interface ClaimResource extends ClaimStream {
115
- create(options: ClaimCreateOptions): Promise<Claim>;
116
- list(target?: Partial<ModelTarget>): readonly ModelClaim[];
117
- waitFor(target: Partial<ModelTarget>, options?: ClaimWaitOptions): Promise<void>;
118
- }
119
- export interface ModelMutationOptions extends ClaimedOptions {
120
- readonly claimRef?: string | {
121
- readonly id: string;
122
- } | null;
123
- readonly idempotencyKey?: string | null;
124
- readonly readAt?: number | null;
125
- readonly onStale?: 'reject' | 'overwrite' | 'notify' | null;
126
- readonly wait?: CommitWait;
127
- readonly claim?: Claim | ClaimOptions | null;
128
- /** Fencing token (Option B) from the claim; server-validated at commit. */
129
- readonly fenceToken?: number | null;
130
- }
131
- /**
132
- * The stateless HTTP claim surface. Most code puts a `claim` directly on the write
133
- * (`update({ id, data, claim })`) and lets the SDK release it; reach for this
134
- * namespace for multi-step handles and coordination screens.
135
- *
136
- * It is the same surface as the reactive claim API, but because every read is a
137
- * server round-trip, `state`, `queue`, and `reorder` are awaited here. The
138
- * WebSocket client resolves those synchronously from its local cache, which is what
139
- * lets it read a claim's state inside a React render; a stateless client has no
140
- * cache to read, so the promise is unavoidable.
2
+ * The public resource-type surface.
141
3
  *
142
- * It is derived from `ClaimReadApi` through {@link AwaitedClaimMethod} so the two
143
- * transports cannot drift: the only difference is the promise wrapper that
144
- * statelessness forces. `claim({ id })` is identical on both (already async);
145
- * `state`, `queue`, `reorder`, and `release` are the awaited form.
4
+ * The transport-facing half of these types moved down into the settlement core
5
+ * (ADR 0016). This module keeps the
6
+ * consumer-facing import path intact and rejoins it with the model-proxy types
7
+ * that stay here `ModelOperations` chief among them, because it returns the
8
+ * live participant handle.
146
9
  */
147
- export type HttpClaimApi<T = Record<string, unknown>> = ((params: ClaimParams<T>) => Promise<HeldClaim<T>>) & {
148
- [K in keyof ClaimReadApi<T>]: AwaitedClaimMethod<ClaimReadApi<T>[K]>;
149
- };
150
- /** A single data operation a scoped **agent** session may perform on a model. */
151
- export type SessionOperation = 'read' | 'create' | 'update' | 'delete';
152
- /** Parameters for minting an end-user session — full data authority within the
153
- * organization. Mints an `ek_` token. `user.id` is your end user's id from your
154
- * own identity provider and becomes the session's `participantId`; Ablo does not
155
- * model your users, so it is treated as an opaque string at the trust boundary. */
156
- export interface CreateUserSessionParams {
157
- /** Your end user. `id` becomes the token's `participantId`. */
158
- user: {
159
- id: string;
160
- };
161
- /** Mint the session into this organization instead of the key's own — for a
162
- * platform that serves many tenants from one backend. Requires the `sk_` key to
163
- * carry the `ephemeral:mint-any-org` scope; omit it for the normal
164
- * single-tenant case. */
165
- organizationId?: string;
166
- /** Sync groups this session may subscribe to — typed (`'default'` or
167
- * `<namespace>:<id>`; build with `syncGroup(kind, id)` from
168
- * `@abloatai/ablo/schema`). Omit for the server default:
169
- * `[org:<your org>, user:<user.id>]`. */
170
- syncGroups?: readonly SyncGroupInput[];
171
- /** Token lifetime in seconds. Defaults to 900 (15 minutes). */
172
- ttlSeconds?: number;
173
- /** Opaque identity blob echoed back to the client as `ablo.user`. */
174
- userMeta?: Record<string, unknown>;
175
- agent?: never;
176
- can?: never;
177
- }
178
- /** Mint params for a scoped **agent** session — mints a restricted `rk_` token
179
- * gated to exactly the operations named in `can`. `can` is typed off your
180
- * schema (no magic `'task.update'` strings): `{ Task: ['update'], Deck: ['read'] }`
181
- * — the SDK serializes each entry to the wire allowlist (`task.update`). */
182
- export interface CreateAgentSessionParams<S extends SchemaRecord> {
183
- /** Your agent. `id` becomes the token's `participantId`. */
184
- agent: {
185
- id: string;
186
- };
187
- /** Per-model operation allowlist, typed against the schema's model names. */
188
- can: Partial<Record<keyof S & string, readonly SessionOperation[]>>;
189
- /** Sync groups this session may subscribe to — typed (`'default'` or
190
- * `<namespace>:<id>`; build with `syncGroup(kind, id)` from
191
- * `@abloatai/ablo/schema`). Omit for the server default: the org
192
- * anchor (`org:<your org>`) + the agent's own anchor. */
193
- syncGroups?: readonly SyncGroupInput[];
194
- /** Token lifetime in seconds. Defaults to 900 (15 minutes). */
195
- ttlSeconds?: number;
196
- /** Opaque identity blob echoed back to the client as `ablo.agent`. */
197
- userMeta?: Record<string, unknown>;
198
- user?: never;
199
- }
200
- /** Params for {@link Ablo.sessions}.create — a discriminated union: pass
201
- * `{ user }` for a full-authority end-user session (`ek_`) or `{ agent, can }`
202
- * for a scoped agent session (`rk_`). */
203
- export type CreateSessionParams<S extends SchemaRecord> = CreateUserSessionParams | CreateAgentSessionParams<S>;
204
- /** Params for {@link Ablo.agents}.create — a flattened agent descriptor (no
205
- * `{ agent }` discriminator: `agents.create` only ever mints an agent). Unlike
206
- * {@link CreateSessionParams} it resolves to a connected, scoped {@link Ablo}
207
- * client rather than a raw token. */
208
- export interface CreateAgentClientParams<S extends SchemaRecord> {
209
- /** The wire participant identity (`agent:<id>`) that claim exclusion and the
210
- * FIFO queue gate on. Omit it to get a fresh random id — a distinct, independent
211
- * participant, which is the default and what you want for concurrent agents.
212
- * Pass a stable string only when one logical agent must re-attach to its own
213
- * held claims across reconnects or restarts. */
214
- id?: string;
215
- /** A human-readable label for logs and attribution (carried in `userMeta.name`).
216
- * It is independent of `id`: two agents that share a `name` still receive
217
- * distinct ids and coordinate as separate participants — `name` never derives or
218
- * collapses identity. */
219
- name?: string;
220
- /** Per-model operation allowlist, typed against the schema's model names. */
221
- can: Partial<Record<keyof S & string, readonly SessionOperation[]>>;
222
- /** Sync groups this agent may subscribe to — typed (`'default'` or
223
- * `<namespace>:<id>`). Omit for the server default (org anchor + the
224
- * agent's own anchor). */
225
- syncGroups?: readonly SyncGroupInput[];
226
- /** Token lifetime in seconds. Defaults to 900 (15 minutes); the returned client
227
- * re-mints before expiry, so a long-running agent never handles rotation
228
- * itself. */
229
- ttlSeconds?: number;
230
- /** Extra opaque identity blob echoed on the session scope. Merged with
231
- * `name` (the `name` param wins if you also set `userMeta.name`). */
232
- userMeta?: Record<string, unknown>;
233
- }
234
- /** A minted session. `token` is the secret the holder presents as its bearer. */
235
- export interface AbloSession {
236
- object: 'session';
237
- /** Stable id of the minted credential (for revocation). */
238
- id: string;
239
- /** The short-lived session token — `ek_` for a `{ user }` session, `rk_`
240
- * for an `{ agent }` session. Hand this to the participant's runtime. */
241
- token: string;
242
- /** ISO-8601 expiry. */
243
- expiresAt: string;
244
- organizationId: string;
245
- scope: {
246
- organizationId: string;
247
- syncGroups: readonly string[];
248
- operations: readonly string[];
249
- participantKind: 'user' | 'agent' | 'system';
250
- participantId: string;
251
- };
252
- userMeta: Record<string, unknown>;
253
- }
10
+ export * from '../transaction/resources/httpResources.js';
11
+ export type { LocalCountOptions, LocalReadOptions, ModelListScope, ServerReadOptions, ModelRetrieveParams, ModelCreateParams, ModelUpdateParams, ModelDeleteParams, ClaimOptions, ClaimParams, ClaimLookupParams, ClaimReorderParams, Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, HeldLease, } from '../transaction/resources/modelOperations.js';
12
+ export type { ModelOperations } from './createModelProxy.js';
@@ -1,7 +1,10 @@
1
1
  /**
2
- * Shared resource types for the typed clients and private HTTP transport.
3
- * the commit and claim shapes, the session-mint params and resource, and the
4
- * {@link HttpClaimApi} derivation. This module holds only types and has no runtime
5
- * imports.
2
+ * The public resource-type surface.
3
+ *
4
+ * The transport-facing half of these types moved down into the settlement core
5
+ * (ADR 0016). This module keeps the
6
+ * consumer-facing import path intact and rejoins it with the model-proxy types
7
+ * that stay here — `ModelOperations` chief among them, because it returns the
8
+ * live participant handle.
6
9
  */
7
- export {};
10
+ export * from '../transaction/resources/httpResources.js';
@@ -3,11 +3,11 @@
3
3
  * functions: {@link computeFKDepthPriority} works out a safe row-insertion
4
4
  * order from the schema's foreign-key relations, and
5
5
  * {@link deriveConfigFromSchema} packages that ordering, together with a few
6
- * defaults, into the {@link SyncEngineConfig} a client uses at startup. Both
6
+ * defaults, into the {@link RuntimeConfig} a client uses at startup. Both
7
7
  * are deterministic transforms of the schema and hold no engine state.
8
8
  */
9
- import type { Schema } from '../schema/schema.js';
10
- import type { SyncEngineConfig } from '../interfaces/index.js';
9
+ import type { Schema } from '../transaction/schema/schema.js';
10
+ import type { RuntimeConfig } from '../interfaces/index.js';
11
11
  /**
12
12
  * Computes a create-priority map that gives the engine a safe order for
13
13
  * inserting rows, so a child row is never written before the parent its
@@ -41,4 +41,4 @@ import type { SyncEngineConfig } from '../interfaces/index.js';
41
41
  * algorithms."
42
42
  */
43
43
  export declare function computeFKDepthPriority(schema: Schema): ReadonlyMap<string, number>;
44
- export declare function deriveConfigFromSchema(schema: Schema): SyncEngineConfig;
44
+ export declare function deriveConfigFromSchema(schema: Schema): RuntimeConfig;
@@ -3,10 +3,10 @@
3
3
  * functions: {@link computeFKDepthPriority} works out a safe row-insertion
4
4
  * order from the schema's foreign-key relations, and
5
5
  * {@link deriveConfigFromSchema} packages that ordering, together with a few
6
- * defaults, into the {@link SyncEngineConfig} a client uses at startup. Both
6
+ * defaults, into the {@link RuntimeConfig} a client uses at startup. Both
7
7
  * are deterministic transforms of the schema and hold no engine state.
8
8
  */
9
- import { schemaHash } from '../schema/serialize.js';
9
+ import { schemaHash, modelHash, toSchemaJSON } from '../schema/serialize.js';
10
10
  // ── Config derivation from schema ─────────────────────────────────────────
11
11
  /**
12
12
  * Computes a create-priority map that gives the engine a safe order for
@@ -172,6 +172,10 @@ export function deriveConfigFromSchema(schema) {
172
172
  // schema the server currently has active. The server and the `ablo push`
173
173
  // command compute this same hash.
174
174
  expectedSchemaHash: schemaHash(schema),
175
+ // Per-model hashes for the SEMANTIC drift check: on a whole-hash mismatch
176
+ // the client compares only the models it declares, so an additive server
177
+ // change stays silent and a real divergence names the exact models.
178
+ expectedModelHashes: Object.fromEntries(Object.entries(toSchemaJSON(schema).models).map(([key, model]) => [key, modelHash(model)])),
175
179
  // For a projection (`selectModels`/`omitModels`), also carry the full source
176
180
  // schema's hash. The drift check accepts a server match on either hash, so a
177
181
  // subset client stays quiet against a server running its full source schema.
@@ -0,0 +1,47 @@
1
+ /**
2
+ * The store cluster — what `humans()` constructs at `init` now that the
3
+ * plugin context carries the resolved url and the credential source
4
+ * (ADR 0016; docs/plans/package-split.md, sequence step 2): this client's
5
+ * runtime, the internal component graph, the registered model classes, and
6
+ * the `BaseSyncedStore` that orchestrates them. The engine consumes the
7
+ * cluster instead of constructing it; what remains in the composition root
8
+ * (credential lifecycle, ready(), model proxies, resources) migrates in
9
+ * later steps.
10
+ *
11
+ * The cluster rides the humans surface under {@link kStoreCluster}, a
12
+ * symbol: `layerPluginSurface` merges only string-keyed members onto the
13
+ * client, so the handoff never becomes public client API. When the plugin
14
+ * contract adopts context patches (the decoration end-state), this channel
15
+ * dissolves into them.
16
+ */
17
+ import type { PluginContext } from '../transaction/plugin.js';
18
+ import type { Schema, SchemaRecord } from '../transaction/schema/schema.js';
19
+ import { type RuntimeContext } from '../RuntimeContext.js';
20
+ import { BaseSyncedStore } from '../BaseSyncedStore.js';
21
+ import { type DefaultCollaborationEvents } from '../sync/SyncWebSocket.js';
22
+ import { type InternalComponents } from './createInternalComponents.js';
23
+ import type { InternalAbloOptions } from './options.js';
24
+ /**
25
+ * The private handoff slot on the humans surface. Symbol-keyed on purpose:
26
+ * surface members merge onto the client by string key, and the cluster is
27
+ * construction machinery, not client API.
28
+ */
29
+ export declare const kStoreCluster: unique symbol;
30
+ /** What `humans().init` constructs and the engine consumes. */
31
+ export interface StoreCluster {
32
+ /** This client's runtime — every component below was constructed with it. */
33
+ readonly runtime: RuntimeContext;
34
+ /** The component graph: registry, pool, bootstrap, database, sync client, hydration. */
35
+ readonly components: InternalComponents;
36
+ /** The store orchestrating the graph, holding the host-built connection. */
37
+ readonly store: BaseSyncedStore<DefaultCollaborationEvents, Schema<SchemaRecord>>;
38
+ }
39
+ /**
40
+ * Builds the cluster from what the context carries, or returns `null` when
41
+ * it does not carry enough (no connection, no resolved url, no credential
42
+ * source, or no schema on the options bag) — the same tolerance the
43
+ * presence stream established: `init` constructs what the context can
44
+ * support and no more. The reactive factory always supplies all four and
45
+ * treats a missing cluster as a configuration fault.
46
+ */
47
+ export declare function buildStoreCluster(context: PluginContext<InternalAbloOptions<SchemaRecord>>): StoreCluster | null;
@@ -0,0 +1,118 @@
1
+ /**
2
+ * The store cluster — what `humans()` constructs at `init` now that the
3
+ * plugin context carries the resolved url and the credential source
4
+ * (ADR 0016; docs/plans/package-split.md, sequence step 2): this client's
5
+ * runtime, the internal component graph, the registered model classes, and
6
+ * the `BaseSyncedStore` that orchestrates them. The engine consumes the
7
+ * cluster instead of constructing it; what remains in the composition root
8
+ * (credential lifecycle, ready(), model proxies, resources) migrates in
9
+ * later steps.
10
+ *
11
+ * The cluster rides the humans surface under {@link kStoreCluster}, a
12
+ * symbol: `layerPluginSurface` merges only string-keyed members onto the
13
+ * client, so the handoff never becomes public client API. When the plugin
14
+ * contract adopts context patches (the decoration end-state), this channel
15
+ * dissolves into them.
16
+ */
17
+ import { shouldUseInMemoryPersistence } from '../transaction/persistence.js';
18
+ import { noopObservability, browserOnlineStatus, defaultSessionErrorDetector, noopAnalytics, } from '../RuntimeContext.js';
19
+ import { initRuntime } from '../context.js';
20
+ import { alwaysOnline } from '../adapters/alwaysOnline.js';
21
+ import { BaseSyncedStore } from '../BaseSyncedStore.js';
22
+ import { SyncWebSocket } from '../sync/SyncWebSocket.js';
23
+ import { createInternalComponents, } from './createInternalComponents.js';
24
+ import { registerModelsFromSchema } from './modelRegistration.js';
25
+ import { deriveConfigFromSchema } from './schemaConfig.js';
26
+ import { createDefaultMutationExecutor } from './wsMutationExecutor.js';
27
+ /**
28
+ * The private handoff slot on the humans surface. Symbol-keyed on purpose:
29
+ * surface members merge onto the client by string key, and the cluster is
30
+ * construction machinery, not client API.
31
+ */
32
+ export const kStoreCluster = Symbol('ablo.humans.storeCluster');
33
+ /**
34
+ * The contract types the connection as the core `WsTransport`; on the
35
+ * reactive path the factory constructs the materialising subclass with the
36
+ * default collaboration vocabulary, and this guard is where that knowledge
37
+ * becomes a type. A connection that is not the subclass means the cluster
38
+ * cannot be built here.
39
+ */
40
+ function isReactiveSocket(transport) {
41
+ return transport instanceof SyncWebSocket;
42
+ }
43
+ /**
44
+ * Builds the cluster from what the context carries, or returns `null` when
45
+ * it does not carry enough (no connection, no resolved url, no credential
46
+ * source, or no schema on the options bag) — the same tolerance the
47
+ * presence stream established: `init` constructs what the context can
48
+ * support and no more. The reactive factory always supplies all four and
49
+ * treats a missing cluster as a configuration fault.
50
+ */
51
+ export function buildStoreCluster(context) {
52
+ const options = context.options;
53
+ const { url, auth, transport, logger } = context;
54
+ if (!options?.schema || !url || !auth || !isReactiveSocket(transport)) {
55
+ return null;
56
+ }
57
+ const schema = options.schema;
58
+ // Config derives from the schema; caller-supplied overrides layer on top,
59
+ // caller winning per key.
60
+ const config = {
61
+ ...deriveConfigFromSchema(schema),
62
+ ...options.configOverrides,
63
+ };
64
+ // The default executor sends `{ type: 'commit', ... }` over the context's
65
+ // connection; before it opens, sends reject with the diagnosed not-ready
66
+ // error and the MutationQueue owns the retry. A caller-supplied executor
67
+ // still wins (test mocks, alternative transports).
68
+ const executor = options.mutationExecutor ?? createDefaultMutationExecutor(() => transport);
69
+ // This client's runtime — the instance the whole graph is constructed
70
+ // with, so two clients in one process never read each other's logger,
71
+ // config, or executor. `getModelMetadata` closes over this client's own
72
+ // registry (assigned once the graph exists below), never the
73
+ // active-registry global.
74
+ let registryForMetadata;
75
+ const runtime = {
76
+ logger,
77
+ observability: options.observability ?? noopObservability,
78
+ analytics: options.analytics ?? noopAnalytics,
79
+ sessionErrorDetector: options.sessionErrorDetector ?? defaultSessionErrorDetector,
80
+ onlineStatus: options.onlineStatus ??
81
+ (shouldUseInMemoryPersistence(options) ? alwaysOnline() : browserOnlineStatus),
82
+ config,
83
+ mutationExecutor: executor,
84
+ getModelMetadata: (name) => registryForMetadata?.getMetadata(name),
85
+ };
86
+ // The module-global bridge: code not yet constructed with an instance
87
+ // (model instances, the react hooks, the socket's context ports) still
88
+ // reads it. Last-writer-wins there, exactly as before the runtime became
89
+ // per-client. Retired reference by reference (docs/plans/package-split.md).
90
+ initRuntime(runtime);
91
+ const components = createInternalComponents({
92
+ schema,
93
+ url,
94
+ options,
95
+ auth,
96
+ runtime,
97
+ });
98
+ registryForMetadata = components.modelRegistry;
99
+ registerModelsFromSchema(schema, components.modelRegistry);
100
+ const store = new BaseSyncedStore({
101
+ syncClient: components.syncClient,
102
+ database: components.database,
103
+ objectPool: components.objectPool,
104
+ modelRegistry: components.modelRegistry,
105
+ syncWebSocket: transport,
106
+ schema,
107
+ url,
108
+ auth,
109
+ runtime,
110
+ // The resolved list, so the store's delta pipeline dispatches the
111
+ // declared stage handlers — including this plugin's own `apply`.
112
+ stagePlugins: context.plugins ?? [],
113
+ },
114
+ // Collaboration vocabulary is the application's: the SDK subscribes to
115
+ // the event types the caller declares and to nothing by default.
116
+ { collaborationEvents: options.collaborationEvents ?? [] });
117
+ return { runtime, components, store };
118
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * The materialiser's lifecycle: the first credential mint, identity
3
+ * resolution, the credential-refresh machinery, and the idempotent `ready()`
4
+ * that drives the store's initialize generator to completion. Extracted from
5
+ * the composition root along the humans() seam (docs/plans/package-split.md):
6
+ * the engine wires it with the prelude's credential slice and consumes
7
+ * `ready`; resolved identity flows back through one callback, so the
8
+ * engine-side state it seeds (the self locals, the streams) stays with the
9
+ * engine.
10
+ */
11
+ import type { SchemaRecord, Schema } from '../transaction/schema/schema.js';
12
+ import type { ParticipantKind } from '../transaction/types/participant.js';
13
+ import type { Logger } from '../transaction/logger.js';
14
+ import type { AuthCredentialSource } from '../transaction/auth/credentialSource.js';
15
+ import type { ApiKeySetter } from '../transaction/auth/apiKey.js';
16
+ import type { AbloError } from '../transaction/errors.js';
17
+ import type { InternalAbloOptions } from './options.js';
18
+ import type { StoreCluster } from './storeCluster.js';
19
+ /** What identity resolution settled, handed back for the engine to seed. */
20
+ export interface IdentitySeed {
21
+ readonly userId: string;
22
+ readonly participantKind: ParticipantKind;
23
+ /** The resolved account scope; null until known. */
24
+ readonly accountScope: string | null;
25
+ readonly syncGroups: readonly string[];
26
+ }
27
+ export interface StoreLifecycle {
28
+ /**
29
+ * Drives initialization to completion: first mint, identity resolution,
30
+ * seeding, then the store's initialize generator. Idempotent — the first
31
+ * call starts it, later calls share the promise; a failed attempt clears
32
+ * the memo so retry triggers can re-bootstrap.
33
+ */
34
+ ready(): Promise<void>;
35
+ /** Stops the credential refresh scheduler, if identity resolution installed one. */
36
+ dispose(): void;
37
+ }
38
+ export interface StoreLifecycleDeps<S extends SchemaRecord> {
39
+ readonly cluster: StoreCluster;
40
+ readonly schema: Schema<S>;
41
+ readonly internalOptions: InternalAbloOptions<S>;
42
+ readonly authCredentials: AuthCredentialSource;
43
+ readonly credentialResolver: (() => Promise<string | null>) | null;
44
+ readonly configuredApiKey: string | ApiKeySetter | null;
45
+ readonly configuredAuthToken: string | null;
46
+ readonly url: string;
47
+ readonly kind: ParticipantKind;
48
+ readonly logger: Logger;
49
+ /** The engine's up-front options validation; a present error makes `ready()` reject with it. */
50
+ readonly validationError: AbloError | null;
51
+ /** Seeds resolved identity into the engine's own state: the self locals and the streams. */
52
+ readonly onIdentityResolved: (seed: IdentitySeed) => void;
53
+ }
54
+ /**
55
+ * Wires the credential machinery onto the cluster and returns the `ready`
56
+ * the client exposes. Wiring happens now — the refresh lifecycle, the
57
+ * lazy-query auth recovery, the executor binding, and the opt-in auto-start;
58
+ * the first mint waits for `ready()` so the first connection carries a
59
+ * token.
60
+ */
61
+ export declare function startStoreLifecycle<S extends SchemaRecord>(deps: StoreLifecycleDeps<S>): StoreLifecycle;