@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,19 +1,18 @@
1
1
  /**
2
- * Manages the WebSocket connection to the sync server. It owns the socket
3
- * lifecycle (connect, reconnect, disconnect), receives and validates the
4
- * incoming delta stream, sends commits and claims over the same socket, and
5
- * reconnects automatically with exponential backoff. Consumers subscribe to its
6
- * typed events (see {@link CoreSyncEventMap}) to react to deltas, presence, and
7
- * connection changes.
2
+ * The reactive engine's connection to the sync server: the settlement core's
3
+ * duplex transport ({@link WsTransport}, ADR 0016) plus everything that turns
4
+ * the stream into a local, watchable copy wire-delta validation, the resume
5
+ * cursor and its persistence-gated ack discipline, incremental sync and
6
+ * bootstrap requests, the catch-up poll, and presence. The socket lifecycle,
7
+ * reconnect backoff, heartbeat, and the commit/claim/release/subscription
8
+ * frames all live in the transport; this subclass overrides its frame hooks
9
+ * and open/close hooks with the materialisation the transport deliberately
10
+ * does not do.
8
11
  */
9
- import { EventEmitter } from 'events';
10
- import type { MutationOperation } from '../interfaces/index.js';
11
- import { type ClientSyncDelta } from '../wire/delta.js';
12
- import type { BootstrapReason } from '../wire/bootstrapReason.js';
13
- import type { ClaimRejection, StaleNotification, ReadDependency, TrackDependency, WireClaim } from '../coordination/schema.js';
14
- import { type CommitAck } from './commitFrames.js';
12
+ import { type ClientSyncDelta } from '../transaction/wire/delta.js';
13
+ import { WsTransport, type WsTransportOptions, type EventMap, type DefaultCollaborationEvents } from '../transaction/transport/wsTransport.js';
15
14
  export type { CommitAck } from './commitFrames.js';
16
- import { type AuthTokenGetter } from '../auth/credentialSource.js';
15
+ export type { SyncCapabilities, BootstrapHint, BootstrapDataEvent, PresenceUpdate, CoreSyncEventMap, DefaultCollaborationEvents, EventMap, SyncWebSocketEventMap, } from '../transaction/transport/wsTransport.js';
17
16
  /**
18
17
  * The wire delta the client receives. It is inferred from the canonical
19
18
  * `clientSyncDeltaSchema` so the client and server share one contract rather
@@ -49,342 +48,31 @@ export interface GroupRemovedPayload {
49
48
  group: string;
50
49
  userId: string;
51
50
  }
52
- export interface SyncCapabilities {
53
- partialBootstrap?: boolean;
54
- compressedDeltas?: boolean;
55
- streamingBootstrap?: boolean;
56
- batchedDeltas?: boolean;
57
- }
58
- export interface SyncWebSocketOptions {
59
- /** Base HTTP URL of the sync server */
60
- baseUrl?: string;
61
- url?: string;
62
- userId: string;
63
- organizationId: string;
64
- lastSyncId?: number;
65
- syncGroups?: string[];
66
- capabilities?: SyncCapabilities;
67
- reconnectDelay?: number;
68
- maxReconnectDelay?: number;
69
- /**
70
- * Collaboration event type keys to listen for (e.g., ['sheet:selection', 'slide:cursor']).
71
- * Wire messages with matching types (underscore format) will be emitted as events.
72
- */
73
- collaborationEvents?: string[];
74
- /**
75
- * The participant kind declared on the WebSocket upgrade. Defaults to
76
- * `'user'` (session auth, the web app). Agent runtimes pass `'agent'` so the
77
- * server verifies them by capability token instead of session auth. The
78
- * server reads this as the `kind` query parameter.
79
- */
80
- kind?: 'user' | 'agent' | 'system';
81
- /**
82
- * The agent's bearer credential — a restricted (`rk_`) API key. When set, it
83
- * is sent in the `ablo.bearer.<token>` WebSocket subprotocol so the credential
84
- * stays out of URLs and proxy logs. Required for `kind: 'agent'` and ignored
85
- * for `kind: 'user'`.
86
- */
87
- capabilityToken?: string;
88
- /**
89
- * Getter for the current credential. When provided, the WebSocket upgrade
90
- * reads it instead of a copied `capabilityToken`, so reconnects always use
91
- * the freshest token from the SDK's single credential source. Preferred over
92
- * `getCapabilityToken`.
93
- */
94
- getAuthToken?: AuthTokenGetter;
95
- /** @deprecated Use `getAuthToken`. Kept for direct low-level callers. */
96
- getCapabilityToken?: AuthTokenGetter;
97
- }
98
- /**
99
- * Bootstrap hint from server indicating full or partial bootstrap is needed.
100
- * Properties are optional since server payload structure may vary.
101
- */
102
- export interface BootstrapHint {
103
- tables?: string[];
104
- reason?: BootstrapReason;
105
- staleTables?: string[];
106
- totalDeltaCount?: number;
107
- }
108
- /** Bootstrap data event payload */
109
- export interface BootstrapDataEvent {
110
- entityType: string;
111
- data: unknown;
112
- isComplete: boolean;
113
- cursor?: string;
114
- }
115
- /**
116
- * Payload of a presence-update event, mirroring the `payload` field of the wire
117
- * frame. This type is the union of everything the server may send; each
118
- * consumer reads its own subset. Forwarding the full shape, rather than
119
- * stripping fields here, is deliberate — presence consumers rely on `kind`,
120
- * `activity`, and `isAgent` to dispatch correctly.
121
- */
122
- export interface PresenceUpdateEvent {
123
- /** Server-stamped transition: 'enter' on join + roster snapshot,
124
- * 'update' on activity change, 'leave' on disconnect. */
125
- kind?: 'enter' | 'update' | 'leave';
126
- userId: string;
127
- status: string;
128
- syncGroups?: string[];
129
- activity?: {
130
- entityType: string;
131
- entityId: string;
132
- path?: string;
133
- range?: {
134
- startLine: number;
135
- endLine: number;
136
- startColumn?: number;
137
- endColumn?: number;
138
- };
139
- field?: string;
140
- meta?: Record<string, unknown>;
141
- action: string;
142
- detail?: string;
143
- };
144
- /** Server-derived from the connection's userId prefix. Clients must
145
- * not self-declare — server is the source of truth. */
146
- isAgent?: boolean;
147
- /**
148
- * The canonical participant kind (`'user' | 'agent' | 'system'`), stamped by
149
- * the server. Some servers omit it, in which case readers fall back to the
150
- * lossy `isAgent` boolean, which cannot express `'system'`. Typed as `string`
151
- * because it is raw wire input — normalize it via `participantKindFromWire`.
152
- */
153
- participantKind?: string;
154
- timestamp?: number;
155
- /** Every presence frame carries this participant's open claims, stamped by
156
- * the server, so peers see them without a separate channel. The claim shape
157
- * is the canonical {@link WireClaim} — one declaration in
158
- * `coordination/schema.ts`, not a hand-kept copy. */
159
- activeClaims?: WireClaim[];
160
- localTime?: string;
161
- type?: string;
162
- timezone?: string;
163
- socketId?: string;
164
- }
165
- /**
166
- * Core event map — transport-level events that every SyncWebSocket emits.
167
- * SDK consumers extend this with app-specific collaboration events.
168
- */
169
- export interface CoreSyncEventMap {
170
- connected: [];
171
- disconnected: [CloseEvent];
172
- reconnecting: [{
173
- attempt: number;
174
- delay: number;
175
- }];
176
- delta: [SyncDelta];
177
- delta_batch: [SyncDelta[]];
178
- bootstrap_required: [BootstrapHint];
179
- bootstrap_data: [BootstrapDataEvent];
180
- presence_update: [PresenceUpdateEvent];
181
- error: [Error];
182
- session_error: [Error];
183
- /**
184
- * The WebSocket `onclose` fired before `onopen` — the handshake itself
185
- * failed. The browser cannot expose the HTTP status (it shows as code
186
- * 1006 with no reason), so the consumer should run an authenticated
187
- * HTTP probe to distinguish auth failure (session expired) from a
188
- * generic network issue.
189
- */
190
- handshake_failed: [CloseEvent];
191
- reconnect_failed: [{
192
- attempts: number;
193
- }];
194
- /**
195
- * Server-initiated notification that a previously-active claim's
196
- * TTL has expired. Consumers (e.g., the participant SDK) re-mint
197
- * a fresh capability and re-claim, OR accept the drop. The claim
198
- * is already inactive on the server side by the time this fires —
199
- * no client-side action needed unless re-claiming.
200
- */
201
- claim_expired: [{
202
- claimId: string;
203
- }];
204
- /**
205
- * Server rejected an `claim_begin` because another participant
206
- * already holds an open claim on the same target (cooperative
207
- * mutex enforced server-side). Surfaces to the participant-level
208
- * ClaimStream so the caller knows their announce was denied.
209
- * Payload mirrors the wire frame's `payload`.
210
- */
211
- claim_rejected: [ClaimRejection];
212
- /**
213
- * Fair-queue frames (opt-in `queue: true` on `claim_begin`). `claim_acquired`
214
- * means the target was free and the lease is ours immediately; `claim_queued`
215
- * means the claim is waiting in line (carries `position`); `claim_granted`
216
- * means it reached the head and the lease is now ours; `claim_lost` means a
217
- * held/granted claim was taken away (TTL lapse on disconnect, revoke).
218
- */
219
- /**
220
- * Per-entity wait-queue snapshot: `{ target, queue: Claim[] }` with each
221
- * entry `status: 'queued'` + `position`. Broadcast to entity peers on every
222
- * queue mutation — powers the reactive `ablo.<model>.claim.queue({ id })` read.
223
- */
224
- claim_queue: [Record<string, unknown>];
225
- claim_acquired: [Record<string, unknown>];
226
- claim_queued: [Record<string, unknown>];
227
- claim_granted: [Record<string, unknown>];
228
- claim_lost: [Record<string, unknown>];
229
- /**
230
- * Reply to an outbound `claim_heartbeat` — the lease's fate: `held` with
231
- * the extended `expiresAt`, `queued` with the current `position`, or
232
- * `lost`. Correlated back to the awaiting caller by `claimId` in the
233
- * claim stream.
234
- */
235
- claim_heartbeat_ack: [Record<string, unknown>];
236
- /**
237
- * A committed write guarded with `onStale: 'notify'` collided with a
238
- * concurrent change. Rather than forcing an outcome, the engine returns the
239
- * conflicting field's current value so the actor — an agent reasoning over the
240
- * change, or a person watching the row — can reconcile it. The commit itself
241
- * succeeded; the held operations were not written, and the actor re-issues
242
- * them once it has reconciled.
243
- */
244
- 'conflict:notified': [{
245
- clientTxId: string;
246
- notifications: StaleNotification[];
247
- }];
248
- }
249
51
  /**
250
- * Collaboration event app-specific real-time events (selection, cursors, etc.)
251
- * Each event is a [payload] tuple matching the EventEmitter convention.
52
+ * The reactive engine's connection options the transport's options under
53
+ * the name consumers have always imported.
252
54
  */
253
- export type DefaultCollaborationEvents = Record<string, never>;
254
- /**
255
- * Constraint for event maps: every value must be a tuple of handler args.
256
- *
257
- * Why a mapped type and not `Record<string, unknown[]>`?
258
- * `Record<string, ...>` requires an implicit string index signature, which
259
- * TypeScript interfaces don't have. So a closed interface like Ablo's
260
- * `AbloCollaborationEvents` would fail to satisfy `Record<string, unknown[]>`,
261
- * even though every one of its values is a tuple. This mapped form iterates
262
- * over `keyof T` instead of demanding a string index, so it accepts both
263
- * closed interfaces and open Record types — while still enforcing
264
- * "every value is an array."
265
- */
266
- export type EventMap<T> = {
267
- [K in keyof T]: unknown[];
268
- };
269
- /**
270
- * Full event map = core + collaboration events.
271
- * Pass your own TCollaboration to add app-specific events.
272
- */
273
- export type SyncWebSocketEventMap<TCollaboration extends EventMap<TCollaboration> = DefaultCollaborationEvents> = CoreSyncEventMap & TCollaboration;
274
- export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboration> = DefaultCollaborationEvents> extends EventEmitter {
275
- /**
276
- * Subscribe to events with automatic cleanup.
277
- * Returns unsubscribe function for clean disposal.
278
- */
279
- subscribe<K extends keyof SyncWebSocketEventMap<TCollaboration>>(event: K, handler: (...args: SyncWebSocketEventMap<TCollaboration>[K]) => void): () => void;
280
- /**
281
- * Send a collaboration event (app-specific real-time message).
282
- * The wire format is `{ type: messageType, payload: { ...payload, timestamp } }`.
283
- */
284
- sendCollaborationEvent<K extends string & keyof TCollaboration>(messageType: K, payload: TCollaboration[K] extends [infer P] ? Omit<P & Record<string, unknown>, 'timestamp'> : never): void;
285
- private ws;
286
- private options;
287
- private reconnectAttempts;
288
- /** Stop retrying after this many consecutive failures (backoff caps at 30s, so ~7.5 min total) */
289
- private static readonly MAX_RECONNECT_ATTEMPTS;
290
- private reconnectTimer;
55
+ export type SyncWebSocketOptions = WsTransportOptions;
56
+ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboration> = DefaultCollaborationEvents> extends WsTransport<TCollaboration> {
291
57
  /** Periodic catchup interval — polls for missed deltas every 30s while connected */
292
58
  private catchupInterval;
293
- /**
294
- * Application-level heartbeat: ping every 30 seconds and force-close after a
295
- * 10-second silence. The {@link HeartbeatController} holds the timing and the
296
- * zombie-socket rationale; the closures below are the only socket access it
297
- * gets.
298
- */
299
- private readonly heartbeat;
300
- private isConnecting;
301
- private isManualClose;
302
- /** When true, a session error has been detected (from any path — WS close or HTTP bootstrap).
303
- * Suppresses reconnection and Sentry error capture to avoid cascading noise. */
304
- private _sessionErrorDetected;
305
- /** True once `onopen` has fired at least once on the current socket. Reset each
306
- * time a new socket is created in `connect()`. Used by `onclose` to detect
307
- * handshake failures (close before open) — the one signal we have for "the
308
- * server rejected the upgrade" since browsers hide the HTTP status (e.g.
309
- * 401) behind the opaque 1006 close code. */
310
- private _everOpened;
311
- /**
312
- * Diagnostic snapshot of the last connection lifecycle. Persisted across
313
- * the lifetime of the SyncWebSocket so that any subsequent "not connected"
314
- * rejection can quote the actual root cause (close code + reason + when)
315
- * instead of bottoming out at a generic error string. Browser WS code 1006
316
- * hides the real reason, so we layer on our own signals: `forceCloseReason`
317
- * captures heartbeat trips / send failures, `everOpened` distinguishes
318
- * handshake reject from mid-session drop, and `sessionErrorAt` tells us
319
- * whether reconnect is suppressed.
320
- */
321
- private lastOpenAt;
322
- private lastCloseAt;
323
- private lastCloseCode;
324
- private lastCloseReason;
325
- private lastForceCloseReason;
326
- private sessionErrorAt;
327
59
  /**
328
60
  * Sync-position state: the lastSyncId watermark, version vector, and server
329
61
  * cursor. The advance discipline is documented at `sendAck` and `handleDelta`;
330
62
  * the state itself lives in {@link SyncCursor}.
331
63
  */
332
64
  private readonly cursor;
333
- /** Registered collaboration event keys (colon format) for dispatch in onmessage */
334
- private collaborationEventTypes;
335
- /**
336
- * A minimal session adapter handed to the inbound frame dispatch table
337
- * ({@link dispatchWsFrame}). It exposes only the members the handlers touch;
338
- * the closure members read live state so a reassignment here (for example the
339
- * `pendingSubscriptions` reset on close) cannot strand a handler on a stale
340
- * reference. Built in the constructor, after the state it captures exists.
341
- */
342
- private readonly frameSession;
343
- /**
344
- * In-flight `commit` mutation requests keyed by clientTxId. Resolved when
345
- * a matching `mutation_result` frame arrives from the server, or rejected on
346
- * timeout / disconnect. Lets consumers await a server ack for mutations
347
- * sent over the same socket that streams deltas.
348
- */
349
- private pendingMutations;
350
- /**
351
- * In-flight `claim` requests keyed by claimId. Resolved when the matching
352
- * `claim_ack` arrives, or rejected on timeout or disconnect — the same
353
- * request/response pattern as `pendingMutations`, multiplexed over the one
354
- * connection.
355
- */
356
- private pendingClaims;
357
- /**
358
- * In-flight `update_subscription` frames awaiting `subscription_ack`.
359
- * A FIFO queue rather than a keyed Map because the wire ack carries no
360
- * correlation id — the server applies subscription updates in receive
361
- * order and acks in the same order, so `shift()` on ack matches the
362
- * oldest pending request. (Read-interest changes are infrequent and
363
- * usually settle before the next one, so depth is ~1 in practice.)
364
- */
365
- private pendingSubscriptions;
366
65
  constructor(options: SyncWebSocketOptions);
66
+ /** The persisted resume position, sent on the upgrade URL. */
67
+ protected resumeCursor(): string;
367
68
  /**
368
- * Mark that a session error has been detected (e.g. 401 from HTTP bootstrap).
369
- * Suppresses further reconnection attempts and Sentry error capture.
370
- */
371
- setSessionErrorDetected(): void;
372
- /**
373
- * Clear the session-error latch so `connect()` / `scheduleReconnect()`
374
- * work again. Called by the store's access-credential recovery path when
375
- * the close was a re-mintable `ek_`/`rk_` expiry (`4001 credential_expired`),
376
- * not a login loss — see `isAccessCredentialExpiryCloseReason`. Genuine
377
- * session losses never clear the latch; re-auth builds a fresh client.
378
- */
379
- clearSessionError(): void;
380
- /**
381
- * Connect to the sync engine WebSocket
382
- */
383
- connect(): void;
384
- /**
385
- * Setup WebSocket event handlers
69
+ * The open ritual, run by the transport between its `connected` emit and the
70
+ * heartbeat start: announce presence, tell the server where we left off,
71
+ * request the deltas we missed, and start the catch-up poll.
386
72
  */
387
- private setupEventHandlers;
73
+ protected onOpened(): void;
74
+ /** The transport clears its socket reference before this runs. */
75
+ protected onClosed(): void;
388
76
  /**
389
77
  * Validates and normalizes a wire delta at the receive boundary — the single
390
78
  * seam every inbound delta (a `delta` frame, a batch element, a `sync_response`
@@ -411,7 +99,7 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
411
99
  * Handle incoming sync delta (untrusted wire input — validated and
412
100
  * normalized by {@link normalizeWireDelta}; malformed deltas are dropped).
413
101
  */
414
- private handleDelta;
102
+ protected handleDelta(rawDelta: unknown): void;
415
103
  /**
416
104
  * Acknowledges received deltas up to the given syncId. This is the only place
417
105
  * `this.cursor.lastSyncId` moves forward for live deltas. The store calls it
@@ -426,112 +114,6 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
426
114
  * Public wrapper for sending ack from outside the class
427
115
  */
428
116
  acknowledge(syncId: number): void;
429
- /**
430
- * Send message to server
431
- */
432
- send(message: any): void;
433
- /**
434
- * Sends a `commit` mutation request over the existing WebSocket and resolves
435
- * when the server's `mutation_result` frame comes back with the same
436
- * `clientTxId`. The wire frame is `{ type: 'commit', payload: { operations,
437
- * clientTxId } }`.
438
- *
439
- * Times out after 15 seconds of silence from the server. The socket may close
440
- * during an in-flight mutation (a network flap, a server restart); this does
441
- * not auto-retry — the caller's transaction queue owns retry and offline
442
- * replay, and the SDK does not duplicate that logic.
443
- */
444
- sendCommit(operations: readonly MutationOperation[], clientTxId: string, timeoutMs?: number, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null, track?: readonly TrackDependency[] | null): Promise<CommitAck>;
445
- /**
446
- * Send a commit frame without waiting for `mutation_result`.
447
- *
448
- * This backs the public `wait: 'queued'` API: the socket accepted the
449
- * frame for delivery, but the server has not confirmed it yet. The
450
- * eventual `mutation_result` frame is intentionally ignored by this
451
- * instance because no pending resolver is registered.
452
- */
453
- sendCommitQueued(operations: readonly MutationOperation[], clientTxId: string, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null, track?: readonly TrackDependency[] | null): void;
454
- /**
455
- * Activates a participant claim on this connection. One connection can hold
456
- * several concurrent claims at once, each scoped to a different set of sync
457
- * groups, so the SDK reuses the existing connection instead of opening a
458
- * separate socket per scope.
459
- *
460
- * Returns a promise that resolves with the server-canonicalized `syncGroups`
461
- * and effective `ttlSeconds` once `claim_ack` arrives, or rejects with a typed
462
- * error on a failed ack, a timeout, or a disconnect.
463
- */
464
- sendClaim(claimId: string, syncGroups: readonly string[], options?: {
465
- capabilityToken?: string;
466
- ttlSeconds?: number;
467
- timeoutMs?: number;
468
- }): Promise<{
469
- syncGroups: string[];
470
- ttlSeconds?: number;
471
- }>;
472
- /**
473
- * Drop a previously-active claim. Idempotent — `release` is
474
- * fire-and-forget per the wire contract; the server accepts
475
- * unknown claimIds silently so disconnect-time release storms
476
- * never error. No ack is expected.
477
- *
478
- * If a claim's send promise is still pending (no claim_ack yet),
479
- * we reject it locally — the user explicitly chose to release.
480
- */
481
- sendRelease(claimId: string): void;
482
- /**
483
- * Moves this connection's read interest — replaces the connection-level sync
484
- * groups mid-session as the user opens and closes entities. This is the
485
- * area-of-interest navigation primitive: the server fans out deltas only for
486
- * the groups currently in view, rather than the fixed set chosen at connect.
487
- *
488
- * This is a full-set replace: pass the complete new group list, not a delta.
489
- * Resolves with the server's effective set once `subscription_ack` arrives;
490
- * rejects (with a typed error) on a scope denial (a restricted `rk_` key
491
- * requesting a group outside its allowlist), a timeout, or a disconnect. On
492
- * success the new set is recorded as `options.syncGroups`, so a later reconnect
493
- * re-subscribes to the current interest rather than the connect-time set.
494
- *
495
- * Distinct from {@link sendClaim} (a write claim, per operation, with a TTL):
496
- * this is the read side, carries no capability token of its own, and is
497
- * bounded by the connection credential's grant.
498
- */
499
- updateSubscription(syncGroups: readonly string[], options?: {
500
- timeoutMs?: number;
501
- }): Promise<{
502
- syncGroups: string[];
503
- }>;
504
- /**
505
- * Sets a fixed credential for callers that construct the socket directly. The
506
- * SDK instead supplies `getAuthToken`, so reconnects read the shared
507
- * credential source rather than this copied value.
508
- */
509
- setCapabilityToken(token: string): void;
510
- getAuthToken(): string | undefined;
511
- /**
512
- * Return the credential that will be used by the next WebSocket upgrade.
513
- * ConnectionManager reads this for HTTP auth probes so visibility/network
514
- * checks authenticate the same way reconnects do.
515
- */
516
- getCapabilityToken(): string | undefined;
517
- private resolveAuthToken;
518
- /**
519
- * Send spreadsheet selection presence
520
- */
521
- sendSheetSelection(sheetId: string, selectedCells: {
522
- ref: string;
523
- }[]): void;
524
- /**
525
- * Send slide layer selection presence
526
- */
527
- sendSlideSelection(deckId: string, slideId: string, selectedLayers: {
528
- layerId: string;
529
- }[]): void;
530
- /**
531
- * Send slide cursor position for real-time collaboration
532
- * Note: Throttling should be handled by the caller (e.g., useSlideCursorBroadcast hook)
533
- */
534
- sendSlideCursor(deckId: string, slideId: string, x: number, y: number): void;
535
117
  /**
536
118
  * Send presence update to server.
537
119
  * Use this for:
@@ -545,15 +127,6 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
545
127
  * @param customStatus - Optional custom status message
546
128
  */
547
129
  sendPresenceUpdate(status?: 'online' | 'away' | 'offline', customStatus?: string): void;
548
- /**
549
- * Schedule reconnection with exponential backoff
550
- */
551
- private scheduleReconnect;
552
- /**
553
- * Reset reconnect attempt counter. Called when network comes back online
554
- * to allow a fresh reconnect cycle after the max was previously reached.
555
- */
556
- resetReconnectAttempts(): void;
557
130
  /**
558
131
  * Stop the periodic catchup interval
559
132
  */
@@ -562,51 +135,6 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
562
135
  * Disconnect from WebSocket
563
136
  */
564
137
  disconnect(): void;
565
- /**
566
- * Force-close the socket from the client side using a private 4xxx
567
- * code. Callers expect `onclose` to fire; that handler runs the
568
- * existing reconnect / handshake-failed dispatch. Wrapped in
569
- * try/catch because `close()` on a CLOSING/CLOSED socket throws on
570
- * some browsers.
571
- */
572
- private forceClose;
573
- /**
574
- * Get connection state
575
- */
576
- isConnected(): boolean;
577
- /**
578
- * Snapshot of recent connection lifecycle state, for diagnostic logs
579
- * and error messages. Cheap to call (no I/O); safe to log every time
580
- * a send is rejected so we can attribute "not connected" rejections
581
- * to the actual root cause (handshake reject vs heartbeat zombie vs
582
- * session expiry vs explicit close).
583
- */
584
- getConnectionDiagnostics(): {
585
- readyState: number | null;
586
- isConnecting: boolean;
587
- isManualClose: boolean;
588
- sessionErrorDetected: boolean;
589
- everOpened: boolean;
590
- reconnectAttempts: number;
591
- maxReconnectAttempts: number;
592
- lastOpenAt: number | null;
593
- lastCloseAt: number | null;
594
- lastCloseCode: number | null;
595
- lastCloseReason: string | null;
596
- lastForceCloseReason: string | null;
597
- sessionErrorAt: number | null;
598
- msSinceLastOpen: number | null;
599
- msSinceLastClose: number | null;
600
- };
601
- /**
602
- * Build a richly-diagnosed "not connected" error so callers (and the
603
- * logs they emit) can attribute the rejection. The message embeds the
604
- * dominant signal in human-readable form; the structured detail is
605
- * also attached as `error.diagnostics` for log scrapers.
606
- */
607
- private notConnectedError;
608
- /** Returns the sync groups this connection is subscribed to. */
609
- getSyncGroups(): string[];
610
138
  /**
611
139
  * Update last sync ID (for persistence)
612
140
  */
@@ -637,20 +165,9 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
637
165
  * {@link normalizeWireDelta} (exactly once each; malformed ones drop out
638
166
  * of the batch).
639
167
  */
640
- private handleSyncResponse;
168
+ protected handleSyncResponse(rawPayload: unknown): void;
641
169
  /**
642
170
  * Handle bootstrap response from server
643
171
  */
644
- private handleBootstrapResponse;
645
- /**
646
- * Handles a presence update from the server. The wire frame's payload is
647
- * forwarded as-is, so every consumer reads the same shape; stripping fields
648
- * here would drop `kind`, `activity`, `syncGroups`, and `isAgent` for
649
- * consumers that need them.
650
- *
651
- * The wire frame is:
652
- * { type: 'presence_update', payload: { kind, userId, status,
653
- * syncGroups, activity, isAgent, timestamp, activeClaims } }
654
- */
655
- private handlePresenceUpdate;
172
+ protected handleBootstrapResponse(payload: unknown): void;
656
173
  }