@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,46 +1,6 @@
1
1
  /**
2
- * Waits for a queued claim to reach the head of the line the client side of
3
- * the fair-queue handover. When a claim is contended, the server puts it in a
4
- * queue and replies that it is queued (HTTP 202 on `/v1/claims`, or a
5
- * `claim_queued` frame over the WebSocket). The grant is delivered later, when
6
- * the claim reaches the head, as a `claim_granted` frame. This resolves once
7
- * that frame arrives for the given `claimId`, so the caller's `claim` promise
8
- * stays pending — event-driven, with no polling — until it is actually the
9
- * caller's turn. It rejects if the claim is lost (`claim_lost`: taken away by a
10
- * TTL lapse on disconnect, or revoked) or if an optional timeout elapses.
11
- *
12
- * It needs only a minimal `{ subscribe }` transport, so it can be tested
13
- * against a fake; {@link SyncWebSocket} satisfies it.
2
+ * Moved to the settlement core (ADR 0016): claim push is coordination, and
3
+ * coordination is the product. This path re-exports it so existing importers
4
+ * stay unchanged.
14
5
  */
15
- export interface GrantTransport {
16
- subscribe(event: 'claim_acquired' | 'claim_granted' | 'claim_lost' | 'claim_queued' | 'claim_rejected', handler: (payload: Record<string, unknown>) => void): () => void;
17
- }
18
- export interface ClaimGrantInfo {
19
- /**
20
- * True when the grant arrived as `claim_granted` — the target was held when
21
- * the caller asked, and the caller waited in the FIFO line behind the holder.
22
- * False for the immediate `claim_acquired`, where the target was free.
23
- *
24
- * Callers read this to know the row may have changed while they queued. Claim
25
- * visibility is scoped to the entity, so a broad, organization-wide
26
- * subscription receives no presence or claim fan-out, and the local
27
- * coordination snapshot cannot be trusted to tell whether the caller waited.
28
- * The grant frame itself is the authoritative signal.
29
- */
30
- readonly waited: boolean;
31
- /**
32
- * The fencing token the server minted for this grant (Option B), read off the
33
- * grant frame — the authoritative source, since the token is server-stamped.
34
- * `undefined` when the server does not fence (no minter wired).
35
- */
36
- readonly fenceToken?: number;
37
- }
38
- export declare function awaitClaimGrant(transport: GrantTransport, claimId: string, options?: {
39
- timeoutMs?: number;
40
- /**
41
- * Backpressure: reject instead of waiting if, when we join the line, the
42
- * server reports `position >= maxQueueDepth` (i.e. that many claims are
43
- * already ahead of us). Omit to wait however deep the queue is.
44
- */
45
- maxQueueDepth?: number;
46
- }): Promise<ClaimGrantInfo>;
6
+ export { awaitClaimGrant, type GrantTransport, type ClaimGrantInfo, } from '../transaction/coordination/awaitClaimGrant.js';
@@ -1,111 +1,6 @@
1
1
  /**
2
- * Waits for a queued claim to reach the head of the line the client side of
3
- * the fair-queue handover. When a claim is contended, the server puts it in a
4
- * queue and replies that it is queued (HTTP 202 on `/v1/claims`, or a
5
- * `claim_queued` frame over the WebSocket). The grant is delivered later, when
6
- * the claim reaches the head, as a `claim_granted` frame. This resolves once
7
- * that frame arrives for the given `claimId`, so the caller's `claim` promise
8
- * stays pending — event-driven, with no polling — until it is actually the
9
- * caller's turn. It rejects if the claim is lost (`claim_lost`: taken away by a
10
- * TTL lapse on disconnect, or revoked) or if an optional timeout elapses.
11
- *
12
- * It needs only a minimal `{ subscribe }` transport, so it can be tested
13
- * against a fake; {@link SyncWebSocket} satisfies it.
2
+ * Moved to the settlement core (ADR 0016): claim push is coordination, and
3
+ * coordination is the product. This path re-exports it so existing importers
4
+ * stay unchanged.
14
5
  */
15
- import { AbloClaimedError, formatClaimedErrorMessage, claimTargetLabel, } from '../errors.js';
16
- import { getContext } from '../context.js';
17
- /** Read the server-stamped fencing token off a grant frame, if present. */
18
- function readFenceToken(p) {
19
- return typeof p.fenceToken === 'number' ? p.fenceToken : undefined;
20
- }
21
- export function awaitClaimGrant(transport, claimId, options) {
22
- return new Promise((resolve, reject) => {
23
- const unsubs = [];
24
- let timer;
25
- const settle = (fn) => {
26
- if (timer)
27
- clearTimeout(timer);
28
- for (const u of unsubs)
29
- u();
30
- fn();
31
- };
32
- // The target was free → `claim_acquired` (immediate); it was contended,
33
- // we waited in line, and reached the head → `claim_granted`. Either frame
34
- // means the lease is now ours; `waited` records which path it was.
35
- unsubs.push(transport.subscribe('claim_acquired', (p) => {
36
- if (p?.claimId === claimId) {
37
- getContext().logger.debug(`claim: acquired ${claimId} (target was free)`);
38
- const fenceToken = readFenceToken(p);
39
- settle(() => {
40
- resolve({ waited: false, ...(fenceToken !== undefined ? { fenceToken } : {}) });
41
- });
42
- }
43
- }));
44
- unsubs.push(transport.subscribe('claim_granted', (p) => {
45
- if (p?.claimId === claimId) {
46
- // Promoted to the head of the line — the creator's "it's the agent's
47
- // turn now" moment after waiting behind a holder.
48
- getContext().logger.info(`claim: granted ${claimId} — your turn (waited in queue)`);
49
- const fenceToken = readFenceToken(p);
50
- settle(() => {
51
- resolve({ waited: true, ...(fenceToken !== undefined ? { fenceToken } : {}) });
52
- });
53
- }
54
- }));
55
- if (options?.maxQueueDepth !== undefined) {
56
- const max = options.maxQueueDepth;
57
- unsubs.push(transport.subscribe('claim_queued', (p) => {
58
- if (p?.claimId !== claimId)
59
- return;
60
- const position = typeof p.position === 'number' ? p.position : 0;
61
- if (position >= max) {
62
- settle(() => {
63
- reject(new AbloClaimedError(`Claim queue for ${claimId} is ${position} deep (max ${max}).`, { code: 'queue_too_deep' }));
64
- });
65
- }
66
- }));
67
- }
68
- unsubs.push(transport.subscribe('claim_rejected', (p) => {
69
- const rejection = p;
70
- if (rejection.claimId !== claimId)
71
- return;
72
- const target = rejection.target
73
- ? claimTargetLabel({
74
- model: rejection.target.entityType,
75
- id: rejection.target.entityId,
76
- field: rejection.target.field,
77
- })
78
- : claimId;
79
- settle(() => {
80
- reject(new AbloClaimedError(formatClaimedErrorMessage({
81
- targetLabel: target,
82
- heldBy: rejection.heldBy,
83
- claim: rejection.heldByClaim,
84
- policyReason: rejection.policyReason,
85
- fallback: `Claim rejected for ${target}.`,
86
- }), {
87
- code: rejection.reason === 'conflict'
88
- ? 'claim_conflict'
89
- : 'claim_lease_unavailable',
90
- claims: rejection.heldByClaim ? [rejection.heldByClaim] : undefined,
91
- }));
92
- });
93
- }));
94
- unsubs.push(transport.subscribe('claim_lost', (p) => {
95
- if (p?.claimId === claimId) {
96
- settle(() => {
97
- reject(new AbloClaimedError(`Claim lost while queued for ${claimId}.`, {
98
- code: 'claim_lost',
99
- }));
100
- });
101
- }
102
- }));
103
- if (options?.timeoutMs && options.timeoutMs > 0) {
104
- timer = setTimeout(() => {
105
- settle(() => {
106
- reject(new AbloClaimedError(`Timed out waiting for the queue grant on claim ${claimId}.`, { code: 'grant_timeout' }));
107
- });
108
- }, options.timeoutMs);
109
- }
110
- });
111
- }
6
+ export { awaitClaimGrant, } from '../transaction/coordination/awaitClaimGrant.js';
@@ -13,6 +13,7 @@
13
13
  * stale local copies the server no longer reports — are performed by the sync
14
14
  * client behind that interface.
15
15
  */
16
+ import type { RuntimeContext } from '../RuntimeContext.js';
16
17
  import type { BootstrapResult } from '../Database.js';
17
18
  import type { SyncDelta } from './SyncWebSocket.js';
18
19
  /** Counts describing what applying a bootstrap changed in the pool: entities
@@ -32,6 +33,8 @@ export interface RehydrationStats {
32
33
  * takes effect through this interface.
33
34
  */
34
35
  export interface PoolContext {
36
+ /** The owning client's runtime. Defaults to the module-global bridge. */
37
+ readonly runtime?: RuntimeContext;
35
38
  /** Applies persisted delta results to the in-memory pool, with the host's relation enrichment bound. */
36
39
  applyDeltaBatchToPool(results: NonNullable<BootstrapResult['deltaResults']>): void;
37
40
  /** Writes bootstrap data into the pool: creates models, heals partial rows, upserts, and removes stale local copies the server no longer reports. */
@@ -13,7 +13,7 @@
13
13
  * stale local copies the server no longer reports — are performed by the sync
14
14
  * client behind that interface.
15
15
  */
16
- import { getContext } from '../context.js';
16
+ import { globalRuntime } from '../context.js';
17
17
  /**
18
18
  * Applies a bootstrap result to the in-memory pool and returns what changed.
19
19
  * A full bootstrap creates, heals, and upserts models and removes stale local
@@ -42,7 +42,7 @@ export function applyBootstrapToPool(ctx, bootstrapResult, protectedIds) {
42
42
  // Creates models, heals partial rows, upserts, and removes stale local copies.
43
43
  const stats = ctx.applyBootstrapDataToPool(bootstrapData, protectedIds);
44
44
  const elapsedMs = Math.round((typeof performance !== 'undefined' ? performance.now() : Date.now()) - start);
45
- getContext().logger.info('[BaseSyncedStore] Bootstrap applied', {
45
+ (ctx.runtime ?? globalRuntime).logger.info('[BaseSyncedStore] Bootstrap applied', {
46
46
  ...stats, elapsedMs, poolSize: ctx.getPoolSize(),
47
47
  });
48
48
  return { ...stats, elapsedMs };
@@ -1,42 +1,8 @@
1
1
  /**
2
- * Builds the outgoing frames the sync WebSocket sends on the commit path, and
3
- * provides the single place claim events are traced. These are stateless
4
- * helpers that hold no socket state, so both the transport and its frame
5
- * dispatch can share them.
2
+ * Moved to the settlement core with the duplex transport (ADR 0016): the
3
+ * commit-path frame builders are stateless wire helpers. This path re-exports
4
+ * them so existing importers stay unchanged. The core's `buildCommitFrame`
5
+ * takes the structural `CommitFrameOperation` slice, which this package's
6
+ * `MutationOperation` satisfies.
6
7
  */
7
- import type { CommitMessage } from '../wire/index.js';
8
- import type { CommitAck as CanonicalCommitAck } from '../wire/commit.js';
9
- import type { MutationOperation, ClaimEvent } from '../interfaces/index.js';
10
- import type { StaleNotification, ReadDependency, TrackDependency } from '../coordination/schema.js';
11
- /**
12
- * The value a commit acknowledgement resolves to. `notifications` is present
13
- * only when a guarded write (`onStale: 'notify'`) met a concurrent change; it
14
- * carries the advisory signal that lets the writer self-heal, and the same
15
- * signal also arrives on the `conflict:notified` event.
16
- */
17
- export type CommitAck = CanonicalCommitAck;
18
- /**
19
- * Converts the client's list of {@link MutationOperation} values into the wire
20
- * {@link CommitMessage} the server accepts. This is the one place the loosely
21
- * typed operation — its `type` is a string, and it carries client-only
22
- * `options` the server never reads — becomes the strict wire contract. Mapping
23
- * each field by hand means a change to {@link CommitOperation} fails to compile
24
- * here; the single `as` cast narrows the validated `type` to the wire union and
25
- * is the only place that loosening happens.
26
- */
27
- export declare function buildCommitFrame(operations: readonly MutationOperation[], clientTxId: string, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null, track?: readonly TrackDependency[] | null): CommitMessage;
28
- /**
29
- * Defensively validate the optional `notifications` array off a commit ack.
30
- * Untrusted wire data — a malformed entry is dropped rather than throwing,
31
- * so a bad notification never sinks an otherwise-successful commit.
32
- */
33
- export declare function parseNotifications(raw: unknown): StaleNotification[] | undefined;
34
- /**
35
- * The single place claim events are traced. Every `claim_*` frame passes
36
- * through here, so a developer debugging a collision gets one consistent record
37
- * — a console line and a structured capture — without each frame case
38
- * re-deriving the row and holder shape. The wire payload is loosely typed
39
- * (`Record<string, unknown>`), so this is the one place that narrows it into a
40
- * {@link ClaimEvent}.
41
- */
42
- export declare function recordClaim(phase: ClaimEvent['phase'], payload: Record<string, unknown>): void;
8
+ export { buildCommitFrame, parseNotifications, recordClaim, type CommitAck, type CommitFrameOperation, type ClaimTracePorts, } from '../transaction/transport/commitFrames.js';
@@ -1,99 +1,8 @@
1
1
  /**
2
- * Builds the outgoing frames the sync WebSocket sends on the commit path, and
3
- * provides the single place claim events are traced. These are stateless
4
- * helpers that hold no socket state, so both the transport and its frame
5
- * dispatch can share them.
2
+ * Moved to the settlement core with the duplex transport (ADR 0016): the
3
+ * commit-path frame builders are stateless wire helpers. This path re-exports
4
+ * them so existing importers stay unchanged. The core's `buildCommitFrame`
5
+ * takes the structural `CommitFrameOperation` slice, which this package's
6
+ * `MutationOperation` satisfies.
6
7
  */
7
- import { getContext } from '../context.js';
8
- import { staleNotificationSchema, wireParticipantKindSchema, } from '../coordination/schema.js';
9
- import { formatClaim } from '../coordination/trace.js';
10
- /**
11
- * Converts the client's list of {@link MutationOperation} values into the wire
12
- * {@link CommitMessage} the server accepts. This is the one place the loosely
13
- * typed operation — its `type` is a string, and it carries client-only
14
- * `options` the server never reads — becomes the strict wire contract. Mapping
15
- * each field by hand means a change to {@link CommitOperation} fails to compile
16
- * here; the single `as` cast narrows the validated `type` to the wire union and
17
- * is the only place that loosening happens.
18
- */
19
- export function buildCommitFrame(operations, clientTxId, causedByTaskId, reads, track) {
20
- const payload = {
21
- operations: operations.map((op) => ({
22
- type: op.type,
23
- model: op.model,
24
- id: op.id,
25
- input: op.input,
26
- transactionId: op.transactionId,
27
- readAt: op.readAt,
28
- onStale: op.onStale,
29
- fenceToken: op.fenceToken,
30
- })),
31
- clientTxId,
32
- };
33
- if (causedByTaskId)
34
- payload.causedByTaskId = causedByTaskId;
35
- // The read set the batch was premised on: the rows or groups the writer read before committing.
36
- if (reads && reads.length > 0)
37
- payload.reads = [...reads];
38
- // Durable read-dependencies the writer is registering: the rows or groups it
39
- // wants to keep hearing about after this commit, delivered on a future receipt.
40
- if (track && track.length > 0)
41
- payload.track = [...track];
42
- return { type: 'commit', payload };
43
- }
44
- /**
45
- * Defensively validate the optional `notifications` array off a commit ack.
46
- * Untrusted wire data — a malformed entry is dropped rather than throwing,
47
- * so a bad notification never sinks an otherwise-successful commit.
48
- */
49
- export function parseNotifications(raw) {
50
- if (!Array.isArray(raw) || raw.length === 0)
51
- return undefined;
52
- const out = [];
53
- for (const entry of raw) {
54
- const parsed = staleNotificationSchema.safeParse(entry);
55
- if (parsed.success)
56
- out.push(parsed.data);
57
- }
58
- return out.length > 0 ? out : undefined;
59
- }
60
- /**
61
- * The single place claim events are traced. Every `claim_*` frame passes
62
- * through here, so a developer debugging a collision gets one consistent record
63
- * — a console line and a structured capture — without each frame case
64
- * re-deriving the row and holder shape. The wire payload is loosely typed
65
- * (`Record<string, unknown>`), so this is the one place that narrows it into a
66
- * {@link ClaimEvent}.
67
- */
68
- export function recordClaim(phase, payload) {
69
- const str = (v) => typeof v === 'string' ? v : undefined;
70
- // Targets arrive flat ({ entityType, entityId }) or nested under `target`.
71
- const target = payload.target && typeof payload.target === 'object'
72
- ? payload.target
73
- : payload;
74
- const kind = wireParticipantKindSchema.safeParse(payload.participantKind);
75
- const event = {
76
- phase,
77
- claimId: str(payload.claimId),
78
- model: str(target.entityType) ?? str(target.model),
79
- id: str(target.entityId) ?? str(target.id),
80
- field: str(target.field),
81
- actor: str(payload.actor) ?? str(payload.heldBy),
82
- participantKind: kind.success ? kind.data : undefined,
83
- position: typeof payload.position === 'number' ? payload.position : undefined,
84
- reason: str(payload.policyReason) ?? str(payload.reason),
85
- };
86
- const message = formatClaim(event);
87
- // A rejection or lost lease is the collision a developer is actively
88
- // debugging → warn (shows at the default log level). The routine events
89
- // (acquired/queued/granted/expired) are debug-only so they never drown the
90
- // console until you opt in with `new Ablo({ debug: true })`.
91
- const isCollision = phase === 'rejected' || phase === 'lost';
92
- const ctx = getContext();
93
- if (isCollision)
94
- ctx.logger.warn(message);
95
- else
96
- ctx.logger.debug(message);
97
- ctx.observability.breadcrumb(message, 'sync.coordination', isCollision ? 'warning' : 'info');
98
- ctx.observability.captureClaim(event);
99
- }
8
+ export { buildCommitFrame, parseNotifications, recordClaim, } from '../transaction/transport/commitFrames.js';
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The runtime context, sliced into the ports the settlement core's transport
3
+ * takes. The core is injected, never service-located (ADR 0016), while this
4
+ * package resolves its shared dependencies through `getContext()` — so these
5
+ * adapters bridge the two: each method reads the context at call time, which
6
+ * preserves the lazy semantics of `getContext()` (a context installed after
7
+ * construction is still picked up, and the pre-init fallback still applies).
8
+ */
9
+ import type { Logger } from '../transaction/logger.js';
10
+ import type { SocketObservability } from '../transaction/observability.js';
11
+ /** The context's logger, resolved at call time. */
12
+ export declare const contextLogger: Logger;
13
+ /** The context's observability, resolved at call time, in the transport's shape. */
14
+ export declare const contextSocketObservability: SocketObservability;
15
+ /** The context's online-status provider, resolved at call time. */
16
+ export declare const contextOnlineStatus: {
17
+ isOnline: () => boolean;
18
+ };
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The runtime context, sliced into the ports the settlement core's transport
3
+ * takes. The core is injected, never service-located (ADR 0016), while this
4
+ * package resolves its shared dependencies through `getContext()` — so these
5
+ * adapters bridge the two: each method reads the context at call time, which
6
+ * preserves the lazy semantics of `getContext()` (a context installed after
7
+ * construction is still picked up, and the pre-init fallback still applies).
8
+ */
9
+ import { getContext } from '../context.js';
10
+ /** The context's logger, resolved at call time. */
11
+ export const contextLogger = {
12
+ debug: (message, ...args) => { getContext().logger.debug(message, ...args); },
13
+ info: (message, ...args) => { getContext().logger.info(message, ...args); },
14
+ warn: (message, ...args) => { getContext().logger.warn(message, ...args); },
15
+ error: (message, ...args) => { getContext().logger.error(message, ...args); },
16
+ };
17
+ /** The context's observability, resolved at call time, in the transport's shape. */
18
+ export const contextSocketObservability = {
19
+ breadcrumb: (message, category, level, data) => {
20
+ getContext().observability.breadcrumb(message, category, level, data);
21
+ },
22
+ captureWebSocketError: (details) => {
23
+ getContext().observability.captureWebSocketError(details);
24
+ },
25
+ captureClaim: (event) => { getContext().observability.captureClaim(event); },
26
+ captureConflict: (event) => { getContext().observability.captureConflict(event); },
27
+ };
28
+ /** The context's online-status provider, resolved at call time. */
29
+ export const contextOnlineStatus = {
30
+ isOnline: () => getContext().onlineStatus.isOnline(),
31
+ };
@@ -1,51 +1,7 @@
1
1
  /**
2
- * Creates a {@link ClaimStream} over a live sync connection. A claim is a
3
- * short-lived, advisory lease a participant takes on an entity (or a field of
4
- * one) to signal "I'm working on this"; the stream lets you take claims, see
5
- * everyone else's, and watch the wait queue when a claim is contended.
6
- *
7
- * The stream is built directly on the sync WebSocket and shares that one
8
- * connection. It learns about other participants' claims from the same
9
- * `presence_update` frames the {@link createPresenceStream} presence stream
10
- * consumes — the server piggybacks each participant's `activeClaims` on every
11
- * presence frame — and sends its own claims as `claim_begin` and
12
- * `claim_abandon` frames.
13
- *
14
- * Wire frames:
15
- * • Outbound `claim_begin` — announce a claim: `{ claimId, entityType,
16
- * entityId, description, field?, estimatedMs? }`.
17
- * • Outbound `claim_abandon` — release it: `{ claimId, entityType?,
18
- * entityId? }`.
19
- * • Inbound, via presence — `event.activeClaims`, each stamped with
20
- * `declaredAt` and `expiresAt`.
21
- * • Inbound `claim_rejected` — the server refused the claim, with conflict
22
- * metadata.
2
+ * Moved to the settlement core (ADR 0016): claim push is coordination, and
3
+ * coordination is the product a contending agent wants `claim_granted`
4
+ * pushed exactly as much as a person does. This path re-exports it so
5
+ * existing importers stay unchanged.
23
6
  */
24
- import type { SyncWebSocket } from './SyncWebSocket.js';
25
- import type { ClaimOptions, Claim, ClaimStream, PresenceTarget } from '../types/streams.js';
26
- /**
27
- * The wire capability the claim stream actually uses: subscribe to typed
28
- * inbound frames, check liveness, and send outbound frames. `SyncWebSocket`
29
- * satisfies it, so production wiring is unchanged — but depending on the port
30
- * rather than the whole socket class lets a test drive it with a plain object,
31
- * no cast. `Pick` carries the exact (generic, typed-payload) `subscribe`
32
- * signature, so every handler stays fully typed.
33
- */
34
- export type ClaimTransport = Pick<SyncWebSocket, 'subscribe' | 'isConnected' | 'send'>;
35
- export interface ClaimStreamConfig {
36
- /** Identity used to filter our own active claims out of `others`. */
37
- participantId: string;
38
- }
39
- export interface AttachableClaimStream extends ClaimStream {
40
- /**
41
- * Mints a lease directly: sends the `claim_begin` frame and returns a held
42
- * {@link Claim} that carries no row `data` (the resource layer reads the row
43
- * and stamps it). This is an internal entry point, not part of the public
44
- * {@link ClaimStream}; application code takes a claim through
45
- * `ablo.<model>.claim({ id })`, which is built on this.
46
- */
47
- claim(target: PresenceTarget, opts?: ClaimOptions): Claim;
48
- attach(transport: ClaimTransport): void;
49
- dispose(): void;
50
- }
51
- export declare function createClaimStream(config: ClaimStreamConfig, transport?: ClaimTransport | null): AttachableClaimStream;
7
+ export { createClaimStream, type ClaimTransport, type ClaimStreamConfig, type AttachableClaimStream, } from '../transaction/coordination/createClaimStream.js';