@abloatai/ablo 0.26.0 → 0.27.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 (398) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +101 -85
  3. package/dist/BaseSyncedStore.d.ts +85 -88
  4. package/dist/BaseSyncedStore.js +131 -147
  5. package/dist/Database.d.ts +54 -68
  6. package/dist/Database.js +97 -113
  7. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  8. package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
  9. package/dist/LazyReferenceCollection.d.ts +11 -15
  10. package/dist/LazyReferenceCollection.js +12 -16
  11. package/dist/Model.d.ts +37 -52
  12. package/dist/Model.js +46 -61
  13. package/dist/ModelRegistry.d.ts +21 -19
  14. package/dist/ModelRegistry.js +23 -27
  15. package/dist/NetworkMonitor.d.ts +5 -6
  16. package/dist/NetworkMonitor.js +5 -6
  17. package/dist/SyncClient.d.ts +112 -112
  18. package/dist/SyncClient.js +165 -172
  19. package/dist/adapters/alwaysOnline.d.ts +6 -8
  20. package/dist/adapters/alwaysOnline.js +6 -8
  21. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  22. package/dist/adapters/inMemoryStorage.js +9 -9
  23. package/dist/agent/Agent.d.ts +27 -32
  24. package/dist/agent/Agent.js +18 -19
  25. package/dist/agent/index.d.ts +4 -4
  26. package/dist/agent/index.js +5 -5
  27. package/dist/agent/session.d.ts +47 -44
  28. package/dist/agent/session.js +37 -48
  29. package/dist/agent/types.d.ts +26 -31
  30. package/dist/agent/types.js +6 -7
  31. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  32. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  33. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  34. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
  35. package/dist/ai-sdk/index.d.ts +25 -22
  36. package/dist/ai-sdk/index.js +25 -22
  37. package/dist/ai-sdk/wrap.d.ts +6 -7
  38. package/dist/ai-sdk/wrap.js +1 -1
  39. package/dist/auth/credentialPolicy.d.ts +69 -74
  40. package/dist/auth/credentialPolicy.js +51 -56
  41. package/dist/auth/credentialSource.d.ts +6 -5
  42. package/dist/auth/credentialSource.js +9 -10
  43. package/dist/auth/index.d.ts +59 -58
  44. package/dist/auth/index.js +31 -37
  45. package/dist/auth/schemas.d.ts +5 -4
  46. package/dist/auth/schemas.js +5 -4
  47. package/dist/batching/index.d.ts +19 -21
  48. package/dist/batching/index.js +14 -17
  49. package/dist/cli.cjs +167 -119
  50. package/dist/client/Ablo.d.ts +73 -73
  51. package/dist/client/Ablo.js +125 -160
  52. package/dist/client/ApiClient.d.ts +30 -19
  53. package/dist/client/ApiClient.js +133 -38
  54. package/dist/client/auth.d.ts +47 -47
  55. package/dist/client/auth.js +108 -117
  56. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  57. package/dist/client/claimHeartbeatLoop.js +88 -0
  58. package/dist/client/consoleLogger.d.ts +5 -6
  59. package/dist/client/consoleLogger.js +5 -6
  60. package/dist/client/createInternalComponents.d.ts +14 -17
  61. package/dist/client/createInternalComponents.js +25 -30
  62. package/dist/client/createModelProxy.d.ts +130 -120
  63. package/dist/client/createModelProxy.js +152 -122
  64. package/dist/client/credentialEndpoint.d.ts +40 -42
  65. package/dist/client/credentialEndpoint.js +35 -36
  66. package/dist/client/functionalUpdate.d.ts +29 -27
  67. package/dist/client/functionalUpdate.js +21 -21
  68. package/dist/client/hostedEndpoints.d.ts +9 -12
  69. package/dist/client/hostedEndpoints.js +9 -12
  70. package/dist/client/httpClient.d.ts +57 -53
  71. package/dist/client/httpClient.js +29 -31
  72. package/dist/client/identity.d.ts +15 -20
  73. package/dist/client/identity.js +47 -58
  74. package/dist/client/modelRegistration.d.ts +5 -9
  75. package/dist/client/modelRegistration.js +67 -87
  76. package/dist/client/options.d.ts +134 -157
  77. package/dist/client/options.js +3 -7
  78. package/dist/client/registerDataSource.d.ts +9 -9
  79. package/dist/client/registerDataSource.js +15 -16
  80. package/dist/client/resourceTypes.d.ts +64 -75
  81. package/dist/client/resourceTypes.js +4 -10
  82. package/dist/client/schemaConfig.d.ts +31 -43
  83. package/dist/client/schemaConfig.js +38 -50
  84. package/dist/client/sessionMint.d.ts +16 -12
  85. package/dist/client/sessionMint.js +26 -31
  86. package/dist/client/validateAbloOptions.d.ts +12 -14
  87. package/dist/client/validateAbloOptions.js +8 -9
  88. package/dist/client/writeOptionsSchema.d.ts +18 -16
  89. package/dist/client/writeOptionsSchema.js +23 -20
  90. package/dist/client/wsMutationExecutor.d.ts +15 -20
  91. package/dist/client/wsMutationExecutor.js +17 -23
  92. package/dist/context.d.ts +6 -4
  93. package/dist/context.js +6 -4
  94. package/dist/coordination/index.d.ts +10 -8
  95. package/dist/coordination/index.js +14 -12
  96. package/dist/coordination/schema.d.ts +176 -128
  97. package/dist/coordination/schema.js +197 -133
  98. package/dist/coordination/trace.d.ts +9 -10
  99. package/dist/coordination/trace.js +13 -14
  100. package/dist/core/DatabaseManager.d.ts +5 -7
  101. package/dist/core/DatabaseManager.js +15 -19
  102. package/dist/core/QueryProcessor.d.ts +7 -9
  103. package/dist/core/QueryProcessor.js +22 -28
  104. package/dist/core/QueryView.d.ts +8 -8
  105. package/dist/core/QueryView.js +2 -2
  106. package/dist/core/StoreManager.d.ts +12 -14
  107. package/dist/core/StoreManager.js +21 -24
  108. package/dist/core/ViewRegistry.d.ts +5 -5
  109. package/dist/core/ViewRegistry.js +4 -4
  110. package/dist/core/index.d.ts +17 -12
  111. package/dist/core/index.js +32 -26
  112. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  113. package/dist/core/openIDBWithTimeout.js +42 -43
  114. package/dist/core/queryUtils.d.ts +45 -0
  115. package/dist/core/queryUtils.js +69 -0
  116. package/dist/core/storeContract.d.ts +63 -61
  117. package/dist/core/storeContract.js +8 -12
  118. package/dist/environment.d.ts +28 -0
  119. package/dist/environment.js +21 -0
  120. package/dist/errorCodes.d.ts +107 -99
  121. package/dist/errorCodes.js +131 -132
  122. package/dist/errors.d.ts +160 -166
  123. package/dist/errors.js +155 -158
  124. package/dist/index.d.ts +30 -27
  125. package/dist/index.js +89 -86
  126. package/dist/interfaces/index.d.ts +102 -113
  127. package/dist/interfaces/index.js +5 -4
  128. package/dist/keys/index.d.ts +27 -29
  129. package/dist/keys/index.js +41 -40
  130. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  131. package/dist/mutators/RecordingTransaction.js +31 -37
  132. package/dist/mutators/Transaction.d.ts +18 -26
  133. package/dist/mutators/Transaction.js +14 -20
  134. package/dist/mutators/UndoManager.d.ts +122 -131
  135. package/dist/mutators/UndoManager.js +145 -156
  136. package/dist/mutators/defineMutators.d.ts +23 -34
  137. package/dist/mutators/defineMutators.js +14 -20
  138. package/dist/mutators/inverseOp.d.ts +12 -15
  139. package/dist/mutators/inverseOp.js +12 -15
  140. package/dist/mutators/mutateActions.d.ts +10 -9
  141. package/dist/mutators/mutateActions.js +1 -1
  142. package/dist/mutators/readerActions.d.ts +9 -8
  143. package/dist/mutators/readerActions.js +2 -2
  144. package/dist/mutators/undoApply.d.ts +31 -27
  145. package/dist/mutators/undoApply.js +26 -24
  146. package/dist/policy/index.d.ts +5 -3
  147. package/dist/policy/index.js +5 -3
  148. package/dist/policy/types.d.ts +104 -100
  149. package/dist/policy/types.js +67 -66
  150. package/dist/query/client.d.ts +28 -23
  151. package/dist/query/client.js +45 -43
  152. package/dist/query/types.d.ts +37 -60
  153. package/dist/query/types.js +13 -33
  154. package/dist/react/AbloProvider.d.ts +1 -1
  155. package/dist/react/AbloProvider.js +2 -2
  156. package/dist/react/context.d.ts +25 -28
  157. package/dist/react/context.js +9 -10
  158. package/dist/react/index.d.ts +41 -42
  159. package/dist/react/index.js +37 -38
  160. package/dist/react/internalContext.d.ts +17 -19
  161. package/dist/react/useAblo.d.ts +23 -22
  162. package/dist/react/useAblo.js +16 -14
  163. package/dist/react/useCurrentUserId.d.ts +8 -7
  164. package/dist/react/useCurrentUserId.js +8 -7
  165. package/dist/react/useErrorListener.d.ts +7 -7
  166. package/dist/react/useErrorListener.js +10 -11
  167. package/dist/react/useMutationFailureListener.d.ts +8 -8
  168. package/dist/react/useMutationFailureListener.js +8 -8
  169. package/dist/react/useMutators.d.ts +11 -11
  170. package/dist/react/useMutators.js +3 -3
  171. package/dist/react/useReactive.js +2 -2
  172. package/dist/react/useSyncStatus.d.ts +4 -6
  173. package/dist/react/useUndoScope.d.ts +7 -9
  174. package/dist/react/useUndoScope.js +1 -1
  175. package/dist/schema/coordination.d.ts +21 -25
  176. package/dist/schema/coordination.js +21 -25
  177. package/dist/schema/ddl.d.ts +43 -39
  178. package/dist/schema/ddl.js +75 -68
  179. package/dist/schema/ddlLock.d.ts +20 -24
  180. package/dist/schema/ddlLock.js +18 -23
  181. package/dist/schema/diff.d.ts +99 -61
  182. package/dist/schema/diff.js +43 -34
  183. package/dist/schema/field.d.ts +37 -42
  184. package/dist/schema/field.js +35 -48
  185. package/dist/schema/generate.d.ts +12 -12
  186. package/dist/schema/generate.js +12 -12
  187. package/dist/schema/index.d.ts +2 -2
  188. package/dist/schema/index.js +21 -23
  189. package/dist/schema/model.d.ts +118 -143
  190. package/dist/schema/model.js +22 -33
  191. package/dist/schema/openapi.d.ts +10 -9
  192. package/dist/schema/openapi.js +5 -3
  193. package/dist/schema/queries.d.ts +29 -31
  194. package/dist/schema/queries.js +23 -25
  195. package/dist/schema/relation.d.ts +89 -99
  196. package/dist/schema/relation.js +13 -13
  197. package/dist/schema/residency.d.ts +16 -13
  198. package/dist/schema/residency.js +16 -13
  199. package/dist/schema/roles.d.ts +36 -43
  200. package/dist/schema/roles.js +31 -37
  201. package/dist/schema/schema.d.ts +33 -42
  202. package/dist/schema/schema.js +31 -32
  203. package/dist/schema/select.d.ts +13 -13
  204. package/dist/schema/select.js +13 -13
  205. package/dist/schema/serialize.d.ts +28 -31
  206. package/dist/schema/serialize.js +27 -31
  207. package/dist/schema/sugar.d.ts +17 -32
  208. package/dist/schema/sugar.js +14 -29
  209. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
  210. package/dist/schema/syncDeltaRow.js +89 -0
  211. package/dist/schema/tenancy.d.ts +44 -46
  212. package/dist/schema/tenancy.js +46 -48
  213. package/dist/server/adapter.d.ts +58 -58
  214. package/dist/server/adapter.js +13 -14
  215. package/dist/server/commit.d.ts +60 -64
  216. package/dist/server/index.d.ts +9 -10
  217. package/dist/server/index.js +1 -1
  218. package/dist/server/readConfig.d.ts +70 -0
  219. package/dist/server/readConfig.js +8 -0
  220. package/dist/server/storageMode.d.ts +23 -0
  221. package/dist/server/storageMode.js +17 -0
  222. package/dist/source/adapter.d.ts +30 -25
  223. package/dist/source/adapter.js +10 -10
  224. package/dist/source/adapters/drizzle.d.ts +28 -23
  225. package/dist/source/adapters/drizzle.js +30 -25
  226. package/dist/source/adapters/kysely.d.ts +27 -25
  227. package/dist/source/adapters/kysely.js +24 -23
  228. package/dist/source/adapters/memory.d.ts +8 -7
  229. package/dist/source/adapters/memory.js +9 -8
  230. package/dist/source/adapters/prisma.d.ts +13 -12
  231. package/dist/source/adapters/prisma.js +22 -25
  232. package/dist/source/conformance.d.ts +18 -11
  233. package/dist/source/conformance.js +17 -11
  234. package/dist/source/connector.d.ts +31 -32
  235. package/dist/source/connector.js +28 -28
  236. package/dist/source/connectorProtocol.d.ts +160 -0
  237. package/dist/source/connectorProtocol.js +162 -0
  238. package/dist/source/contract.d.ts +26 -27
  239. package/dist/source/contract.js +28 -29
  240. package/dist/source/factory.d.ts +46 -58
  241. package/dist/source/factory.js +22 -27
  242. package/dist/source/index.d.ts +7 -9
  243. package/dist/source/index.js +12 -14
  244. package/dist/source/migrations.d.ts +9 -9
  245. package/dist/source/migrations.js +9 -9
  246. package/dist/source/next.d.ts +9 -10
  247. package/dist/source/next.js +6 -7
  248. package/dist/source/pushQueue.d.ts +69 -47
  249. package/dist/source/pushQueue.js +32 -28
  250. package/dist/source/signing.d.ts +46 -17
  251. package/dist/source/signing.js +28 -11
  252. package/dist/source/types.d.ts +121 -104
  253. package/dist/source/types.js +13 -14
  254. package/dist/stores/ObjectStore.d.ts +10 -11
  255. package/dist/stores/ObjectStore.js +11 -12
  256. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  257. package/dist/stores/SyncActionStore.d.ts +7 -11
  258. package/dist/stores/SyncActionStore.js +13 -17
  259. package/dist/surface.d.ts +27 -20
  260. package/dist/surface.js +27 -20
  261. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
  262. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
  263. package/dist/sync/ConnectionManager.d.ts +39 -50
  264. package/dist/sync/ConnectionManager.js +55 -66
  265. package/dist/sync/NetworkProbe.d.ts +24 -29
  266. package/dist/sync/NetworkProbe.js +63 -69
  267. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
  268. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
  269. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
  270. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
  271. package/dist/sync/SyncWebSocket.d.ts +139 -165
  272. package/dist/sync/SyncWebSocket.js +191 -223
  273. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  274. package/dist/sync/awaitClaimGrant.js +11 -11
  275. package/dist/sync/bootstrapApply.d.ts +34 -24
  276. package/dist/sync/bootstrapApply.js +27 -19
  277. package/dist/sync/commitFrames.d.ts +21 -20
  278. package/dist/sync/commitFrames.js +18 -18
  279. package/dist/sync/createClaimStream.d.ts +23 -22
  280. package/dist/sync/createClaimStream.js +105 -23
  281. package/dist/sync/createPresenceStream.d.ts +19 -18
  282. package/dist/sync/createPresenceStream.js +25 -26
  283. package/dist/sync/createSnapshot.d.ts +12 -14
  284. package/dist/sync/createSnapshot.js +20 -26
  285. package/dist/sync/credentialLifecycle.d.ts +104 -104
  286. package/dist/sync/credentialLifecycle.js +140 -147
  287. package/dist/sync/deltaPipeline.d.ts +36 -34
  288. package/dist/sync/deltaPipeline.js +64 -65
  289. package/dist/sync/groupChange.d.ts +63 -61
  290. package/dist/sync/groupChange.js +74 -78
  291. package/dist/sync/heartbeat.d.ts +34 -33
  292. package/dist/sync/heartbeat.js +31 -31
  293. package/dist/sync/participants.d.ts +19 -19
  294. package/dist/sync/schemas.d.ts +3 -2
  295. package/dist/sync/schemas.js +14 -10
  296. package/dist/sync/syncCursor.d.ts +17 -21
  297. package/dist/sync/syncCursor.js +17 -21
  298. package/dist/sync/syncPlan.d.ts +28 -36
  299. package/dist/sync/syncPlan.js +18 -19
  300. package/dist/sync/syncPosition.d.ts +54 -49
  301. package/dist/sync/syncPosition.js +57 -52
  302. package/dist/sync/wsFrameHandlers.d.ts +35 -36
  303. package/dist/sync/wsFrameHandlers.js +63 -67
  304. package/dist/testing/fixtures/bootstrap.d.ts +12 -6
  305. package/dist/testing/fixtures/bootstrap.js +12 -6
  306. package/dist/testing/fixtures/deltas.d.ts +30 -33
  307. package/dist/testing/fixtures/deltas.js +30 -33
  308. package/dist/testing/fixtures/models.d.ts +11 -10
  309. package/dist/testing/fixtures/models.js +11 -10
  310. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  311. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  312. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
  313. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
  314. package/dist/testing/helpers/wait.d.ts +13 -8
  315. package/dist/testing/helpers/wait.js +13 -8
  316. package/dist/testing/index.d.ts +3 -3
  317. package/dist/testing/index.js +2 -2
  318. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  319. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  320. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  321. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  322. package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
  323. package/dist/testing/mocks/MockSyncContext.js +15 -13
  324. package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
  325. package/dist/testing/mocks/MockSyncStore.js +11 -11
  326. package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
  327. package/dist/testing/mocks/MockWebSocket.js +22 -21
  328. package/dist/transactions/TransactionQueue.d.ts +181 -176
  329. package/dist/transactions/TransactionQueue.js +338 -350
  330. package/dist/transactions/TransactionStore.d.ts +6 -4
  331. package/dist/transactions/TransactionStore.js +6 -4
  332. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  333. package/dist/transactions/UnconfirmedWrites.js +104 -0
  334. package/dist/transactions/coalesceRules.d.ts +41 -17
  335. package/dist/transactions/coalesceRules.js +40 -17
  336. package/dist/transactions/commitPayload.d.ts +48 -52
  337. package/dist/transactions/commitPayload.js +48 -57
  338. package/dist/transactions/deltaConfirmation.d.ts +20 -22
  339. package/dist/transactions/deltaConfirmation.js +37 -45
  340. package/dist/transactions/optimisticApply.d.ts +49 -0
  341. package/dist/transactions/optimisticApply.js +65 -0
  342. package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
  343. package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
  344. package/dist/types/global.d.ts +46 -41
  345. package/dist/types/global.js +20 -19
  346. package/dist/types/index.d.ts +71 -77
  347. package/dist/types/index.js +22 -22
  348. package/dist/types/modelData.d.ts +6 -8
  349. package/dist/types/modelData.js +5 -7
  350. package/dist/types/participant.d.ts +10 -11
  351. package/dist/types/participant.js +6 -8
  352. package/dist/types/streams.d.ts +208 -195
  353. package/dist/types/streams.js +7 -7
  354. package/dist/utils/asyncIterator.d.ts +25 -32
  355. package/dist/utils/asyncIterator.js +25 -32
  356. package/dist/utils/duration.d.ts +12 -15
  357. package/dist/utils/duration.js +12 -15
  358. package/dist/utils/mobxSetup.d.ts +53 -0
  359. package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
  360. package/dist/webhooks/events.d.ts +21 -16
  361. package/dist/webhooks/events.js +10 -8
  362. package/dist/webhooks/index.d.ts +5 -7
  363. package/dist/webhooks/index.js +5 -7
  364. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  365. package/dist/wire/delta.js +114 -0
  366. package/dist/wire/errorEnvelope.d.ts +30 -31
  367. package/dist/wire/errorEnvelope.js +34 -40
  368. package/dist/wire/frames.d.ts +79 -86
  369. package/dist/wire/frames.js +26 -33
  370. package/dist/wire/index.d.ts +14 -12
  371. package/dist/wire/index.js +30 -26
  372. package/dist/wire/listEnvelope.d.ts +16 -23
  373. package/dist/wire/listEnvelope.js +7 -6
  374. package/dist/wire/protocol.d.ts +25 -32
  375. package/dist/wire/protocol.js +25 -32
  376. package/dist/wire/protocolVersion.d.ts +44 -40
  377. package/dist/wire/protocolVersion.js +44 -40
  378. package/docs/coordination.md +59 -0
  379. package/package.json +11 -10
  380. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  381. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  382. package/dist/core/query-utils.d.ts +0 -34
  383. package/dist/core/query-utils.js +0 -59
  384. package/dist/schema/sync-delta-row.js +0 -103
  385. package/dist/schema/sync-delta-wire.js +0 -102
  386. package/dist/server/read-config.d.ts +0 -67
  387. package/dist/server/read-config.js +0 -8
  388. package/dist/server/storage-mode.d.ts +0 -8
  389. package/dist/server/storage-mode.js +0 -28
  390. package/dist/source/connector-protocol.d.ts +0 -159
  391. package/dist/source/connector-protocol.js +0 -161
  392. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  393. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  394. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  395. package/dist/transactions/mutation-error-handler.js +0 -39
  396. package/dist/transactions/optimistic.d.ts +0 -24
  397. package/dist/transactions/optimistic.js +0 -45
  398. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,38 +1,28 @@
1
1
  /**
2
- * AreaOfInterestManager client-side hysteresis + prominence policy over
3
- * the `update_subscription` read primitive.
2
+ * Decides which sync groups a connection subscribes to as the user navigates,
3
+ * and pushes each change through the {@link SubscriptionTransport}'s
4
+ * `update_subscription` call. It smooths two kinds of churn so that opening and
5
+ * closing entities does not turn into a storm of subscription changes.
4
6
  *
5
- * Game netcode never thrashes its area-of-interest on a boundary: a cell
6
- * you walk out of stays subscribed for a margin before it's dropped
7
- * (hysteresis), and "important" entities stay relevant from farther away
8
- * (prominence). This manager applies both to Ablo sync groups:
7
+ * The first is hysteresis. Calling {@link SubscriptionManager.leave | leave}
8
+ * on a group does not unsubscribe it right away; the group stays subscribed for
9
+ * a grace period — its warm window — and drops only once that window lapses.
10
+ * Re-entering within the window costs nothing, since the group was never
11
+ * dropped, so rapid back-and-forth navigation becomes a cache hit rather than a
12
+ * repeated bootstrap.
9
13
  *
10
- * - `enter(group)` / `leave(group)` move read interest as the user opens
11
- * and closes entities (decks, sheets, docs). A `leave` does NOT
12
- * immediately unsubscribe the group goes WARM with a TTL and stays
13
- * in the effective set. Re-entering within the window is a no-op
14
- * (already subscribed → no bootstrap), and only when the warm TTL
15
- * lapses does the group actually drop. This is the boundary hysteresis
16
- * that turns deck-tab flipping from a re-bootstrap storm into a
17
- * cache hit.
14
+ * The second is prominence. A group that holds an active write claim is pinned
15
+ * (see {@link SubscriptionManager.pin | pin}) and stays subscribed regardless
16
+ * of navigation, so a row someone is actively editing never loses its live
17
+ * updates. The `baseGroups` are permanent scopes that are always subscribed.
18
18
  *
19
- * - `pin(group)` / `unpin(group)` express prominence: a group that holds
20
- * an active claim (write-claim) is pinned and never goes warm or
21
- * expires while pinned. The claim machinery is the prominence oracle
22
- * the row two agents are fighting over stays subscribed regardless of
23
- * navigation.
24
- *
25
- * - `baseGroups` are permanent infrastructure scopes (e.g. `org:<id>`,
26
- * `user:<id>`) that are always in the effective set.
27
- *
28
- * The effective set is recomputed and diffed against what was last sent;
29
- * the transport's `update_subscription` is only called when it actually
30
- * changes, so hysteresis genuinely suppresses network churn rather than
31
- * just deferring it.
32
- *
33
- * Transport-agnostic: it depends only on {@link SubscriptionTransport},
34
- * which `SyncWebSocket` satisfies structurally. `now` and the sweep timer
35
- * are injectable so the policy is deterministic under test.
19
+ * The manager recomputes the full desired set on every change, diffs it against
20
+ * the set the transport last confirmed, and calls `update_subscription` only
21
+ * when the set actually changes so the smoothing suppresses network traffic
22
+ * rather than merely deferring it. It depends only on
23
+ * {@link SubscriptionTransport}, which {@link SyncWebSocket} satisfies. The
24
+ * clock and the sweep timer are injectable so the policy is deterministic under
25
+ * test.
36
26
  */
37
27
  function setsEqual(a, b) {
38
28
  if (a.size !== b.size)
@@ -42,7 +32,7 @@ function setsEqual(a, b) {
42
32
  return false;
43
33
  return true;
44
34
  }
45
- export class AreaOfInterestManager {
35
+ export class SubscriptionManager {
46
36
  transport;
47
37
  baseGroups;
48
38
  warmTtlMs;
@@ -165,19 +155,15 @@ export class AreaOfInterestManager {
165
155
  return [...this.lastSent];
166
156
  }
167
157
  /**
168
- * Re-assert the full desired set against the transport, forgetting what
169
- * was previously confirmed. Call after a reconnect: a fresh
170
- * `SyncWebSocket` instance starts from the connect-time URL groups, so
171
- * the manager's `lastSent` diff baseline is stale. Clearing it forces
172
- * one `update_subscription` that re-establishes the live interest on the
173
- * new socket.
174
- *
175
- * Resetting `lastSent` makes the next reconcile unconditionally re-push
176
- * the current desired set (one `update_subscription` frame) so the fresh
177
- * socket's server-side index matches local interest, even if warm/pinned
178
- * groups drifted across the disconnect window. The connect-time URL
179
- * already carries the last-acked set, so this is a correction frame, not
180
- * the primary mechanism.
158
+ * Re-asserts the full desired set against the transport, forgetting what was
159
+ * previously confirmed. Call this after a reconnect: a fresh
160
+ * {@link SyncWebSocket} starts from the sync groups named in the connect-time
161
+ * URL, so the manager's diff baseline no longer reflects the new socket.
162
+ * Clearing that baseline makes the next reconcile push one
163
+ * `update_subscription` frame that re-establishes the current interest —
164
+ * including any warm or pinned groups that drifted while the connection was
165
+ * down. The connect-time URL already carries the last-acknowledged set, so
166
+ * this is a correction, not the primary mechanism.
181
167
  */
182
168
  resync() {
183
169
  this.lastSent = new Set();
@@ -214,14 +200,20 @@ export class AreaOfInterestManager {
214
200
  this.lastSent = new Set(result.syncGroups);
215
201
  }
216
202
  catch {
217
- // Transport unavailable (offline / socket not open) or the
218
- // server rejected the set. Interest is SOFT state never throw
219
- // out of enter/leave/sweep for an expected transient. Leave
220
- // `lastSent` unchanged so the diff persists; `resync()` on the
221
- // next `connected` re-pushes the then-current desired set,
222
- // which is what recovers "interest changed while offline."
203
+ // Transport unavailable (offline, or socket not open) or the
204
+ // server rejected the set. Read interest is soft state, so enter,
205
+ // leave, and sweep never throw for an expected transient failure.
206
+ // Leaving `lastSent` unchanged keeps the pending diff; `resync()`
207
+ // on the next successful connect re-pushes the then-current desired
208
+ // set, which recovers any interest that changed while offline.
223
209
  break;
224
210
  }
211
+ // A concurrent reconcile() arriving during the await above sets
212
+ // `this.dirty` back to true (the coalescing path near line 245).
213
+ // TypeScript's intra-closure flow analysis can't see that cross-
214
+ // invocation mutation and reads this as always-false, but the loop
215
+ // is genuinely reentrant.
216
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
225
217
  } while (this.dirty);
226
218
  }
227
219
  finally {
@@ -1,50 +1,48 @@
1
1
  /**
2
- * SyncWebSocket - Manages WebSocket connection to Go sync engine
3
- *
4
- * Handles:
5
- * - WebSocket lifecycle (connect, reconnect, disconnect)
6
- * - Delta reception and processing
7
- * - Multi-tab support
8
- * - Automatic reconnection with exponential backoff
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.
9
8
  */
10
9
  import { EventEmitter } from 'events';
11
10
  import type { MutationOperation } from '../interfaces/index.js';
12
- import { type ClientSyncDelta } from '../schema/sync-delta-wire.js';
11
+ import { type ClientSyncDelta } from '../wire/delta.js';
13
12
  import type { ClaimError, ClaimRejection, StaleNotification, ReadDependency } from '../coordination/schema.js';
14
13
  import { type CommitAck } from './commitFrames.js';
15
14
  export type { CommitAck } from './commitFrames.js';
16
15
  import { type AuthTokenGetter } from '../auth/credentialSource.js';
17
16
  /**
18
- * The wire delta the client receives. Derived from the canonical
19
- * `clientSyncDeltaSchema` (`@abloatai/ablo/schema`) via `z.infer` so the
20
- * SDK and the sync-server share ONE contract instead of two hand-maintained
21
- * interfaces. The action vocabulary (`I`/`U`/`D`/`A`/`V`/`C`/`G`/`S`) and the
22
- * client-only extras (`metadata`, `clientMutationId`, deprecated flat
23
- * `createdBy`) live in that schema; see its doc for the full field reference.
17
+ * The wire delta the client receives. It is inferred from the canonical
18
+ * `clientSyncDeltaSchema` so the client and server share one contract rather
19
+ * than two hand-maintained definitions. The action vocabulary
20
+ * (`I`/`U`/`D`/`A`/`V`/`C`/`G`/`S`) and the client-only extras (`metadata`,
21
+ * `clientMutationId`, and the deprecated flat `createdBy`) live in that schema;
22
+ * see its own documentation for the full field reference.
24
23
  */
25
24
  export type SyncDelta = ClientSyncDelta;
26
25
  /**
27
- * Payload for legacy actionType 'G' deltas emitted by EmitGroupChange.
28
- * Carries both added and removed groups in one delta, forces full re-bootstrap.
26
+ * Payload for an older actionType `'G'` delta. It carries both the added and
27
+ * removed sync groups in one delta and forces a full re-bootstrap.
29
28
  */
30
29
  export interface SyncGroupChangePayload {
31
30
  removedGroups: string[];
32
31
  addedGroups: string[];
33
32
  }
34
33
  /**
35
- * Payload for incremental actionType 'G' deltas emitted by EmitGroupAdded.
36
- * Signals that the recipient has joined a single sync group; subsequent
37
- * 'C' (Covering) deltas will deliver the newly-visible entities. No
38
- * re-bootstrap required.
34
+ * Payload for an incremental actionType `'G'` delta. It signals that the
35
+ * recipient has joined a single sync group; the following `'C'` (covering)
36
+ * deltas deliver the newly visible entities. No re-bootstrap is required.
39
37
  */
40
38
  export interface GroupAddedPayload {
41
39
  group: string;
42
40
  userId: string;
43
41
  }
44
42
  /**
45
- * Payload for actionType 'S' deltas emitted by EmitGroupRemoved.
46
- * Signals that the recipient has lost access to a sync group. The client
47
- * purges affected local entities and updates its subscription metadata.
43
+ * Payload for an actionType `'S'` delta. It signals that the recipient has lost
44
+ * access to a sync group; the client purges the affected local entities and
45
+ * updates its subscription metadata.
48
46
  */
49
47
  export interface GroupRemovedPayload {
50
48
  group: string;
@@ -73,27 +71,25 @@ export interface SyncWebSocketOptions {
73
71
  */
74
72
  collaborationEvents?: string[];
75
73
  /**
76
- * Participant kind to declare on the WS upgrade. Defaults to `'user'`
77
- * (session-auth, web app). Agent runtimes (Node workers) pass
78
- * `'agent'` so the server's `agentTokenProvider`
79
- * routes them through capability-token verification instead of
80
- * session auth. The server reads this as the `kind` query param.
74
+ * The participant kind declared on the WebSocket upgrade. Defaults to
75
+ * `'user'` (session auth, the web app). Agent runtimes pass `'agent'` so the
76
+ * server verifies them by capability token instead of session auth. The
77
+ * server reads this as the `kind` query parameter.
81
78
  */
82
79
  kind?: 'user' | 'agent' | 'system';
83
80
  /**
84
- * The agent's bearer credential — a restricted (`rk_`) API key. When
85
- * set, sent in the `ablo.bearer.<token>` WebSocket subprotocol so the
86
- * credential stays out of URLs and proxy logs. Required for `kind: 'agent'`;
87
- * ignored for `kind: 'user'`. (Field name predates the Biscuit→opaque-key
88
- * migration.)
81
+ * The agent's bearer credential — a restricted (`rk_`) API key. When set, it
82
+ * is sent in the `ablo.bearer.<token>` WebSocket subprotocol so the credential
83
+ * stays out of URLs and proxy logs. Required for `kind: 'agent'` and ignored
84
+ * for `kind: 'user'`.
89
85
  */
90
86
  capabilityToken?: string;
91
87
  /**
92
- * Shared credential getter. When provided, WebSocket URL auth reads this
93
- * instead of a copied `capabilityToken`, so reconnects use refreshed tokens
94
- * from the SDK's single auth source.
88
+ * Getter for the current credential. When provided, the WebSocket upgrade
89
+ * reads it instead of a copied `capabilityToken`, so reconnects always use
90
+ * the freshest token from the SDK's single credential source. Preferred over
91
+ * `getCapabilityToken`.
95
92
  */
96
- /** Shared SDK auth getter. Preferred internal name. */
97
93
  getAuthToken?: AuthTokenGetter;
98
94
  /** @deprecated Use `getAuthToken`. Kept for direct low-level callers. */
99
95
  getCapabilityToken?: AuthTokenGetter;
@@ -116,14 +112,11 @@ export interface BootstrapDataEvent {
116
112
  cursor?: string;
117
113
  }
118
114
  /**
119
- * Presence update event payload mirrors the wire frame's `payload`
120
- * field (apps/sync-server/src/hub/types.ts PresenceUpdateMessage).
121
- *
122
- * Every consumer (web entity-presence cache, PresenceStream,
123
- * agent-runtime presence reducer) reads its own subset; this type is
124
- * the union of what the server actually sends. Stripping fields at
125
- * this layer (the prior bug) silently broke rich-presence consumers
126
- * that needed `kind`, `activity`, `isAgent` to dispatch correctly.
115
+ * Payload of a presence-update event, mirroring the `payload` field of the wire
116
+ * frame. This type is the union of everything the server may send; each
117
+ * consumer reads its own subset. Forwarding the full shape, rather than
118
+ * stripping fields here, is deliberate — presence consumers rely on `kind`,
119
+ * `activity`, and `isAgent` to dispatch correctly.
127
120
  */
128
121
  export interface PresenceUpdateEvent {
129
122
  /** Server-stamped transition: 'enter' on join + roster snapshot,
@@ -151,16 +144,15 @@ export interface PresenceUpdateEvent {
151
144
  * not self-declare — server is the source of truth. */
152
145
  isAgent?: boolean;
153
146
  /**
154
- * Server-stamped canonical kind (`'user' | 'agent' | 'system'`). Additive:
155
- * older servers omit it and readers fall back to the lossy `isAgent`
156
- * boolean (which cannot express `'system'`). Typed `string` because it is
157
- * raw wire input — normalize via `participantKindFromWire`.
147
+ * The canonical participant kind (`'user' | 'agent' | 'system'`), stamped by
148
+ * the server. Some servers omit it, in which case readers fall back to the
149
+ * lossy `isAgent` boolean, which cannot express `'system'`. Typed as `string`
150
+ * because it is raw wire input — normalize it via `participantKindFromWire`.
158
151
  */
159
152
  participantKind?: string;
160
153
  timestamp?: number;
161
- /** Server stamps every presence frame with this participant's open
162
- * claims so peers see them without a separate channel. Wire
163
- * shape mirrors `apps/sync-server/src/hub/types.ts Claim`. */
154
+ /** Every presence frame carries this participant's open claims, stamped by
155
+ * the server, so peers see them without a separate channel. */
164
156
  activeClaims?: {
165
157
  claimId: string;
166
158
  entityType: string;
@@ -178,10 +170,10 @@ export interface PresenceUpdateEvent {
178
170
  declaredAt: number;
179
171
  expiresAt: number;
180
172
  /**
181
- * Lifecycle state. Additive older servers omit it and the reader
182
- * treats absence as `'active'`. Terminal states (`committed` /
183
- * `expired` / `canceled`) ride one frame as the claim ends so peers
184
- * learn *how* it resolved before it drops from the active set.
173
+ * The claim's lifecycle state. When absent, the reader treats it as
174
+ * `'active'`. A terminal state (`committed`, `expired`, or `canceled`) rides
175
+ * one final frame as the claim ends, so peers learn how it resolved before
176
+ * it drops from the active set.
185
177
  */
186
178
  status?: 'active' | 'committed' | 'expired' | 'canceled';
187
179
  error?: ClaimError;
@@ -256,14 +248,19 @@ export interface CoreSyncEventMap {
256
248
  claim_granted: [Record<string, unknown>];
257
249
  claim_lost: [Record<string, unknown>];
258
250
  /**
259
- * Notify-instead-of-abort (non-coercion). A committed write guarded with
260
- * `onStale: 'notify' collided with a concurrent change; rather than
261
- * forcing an outcome, the engine returned the conflicting field's current
262
- * value so the actor can solve it. The resolver is the intelligent actor —
263
- * an agent reasoning over the change, or a human watching the row. The commit
264
- * SUCCEEDED; held ops ('notify') weren't written and the actor re-issues once
265
- * it has reconciled. (The claim is the prospective form of the same
266
- * non-coercion; this is the in-flight form.)
251
+ * Reply to an outbound `claim_heartbeat` the lease's fate: `held` with
252
+ * the extended `expiresAt`, `queued` with the current `position`, or
253
+ * `lost`. Correlated back to the awaiting caller by `claimId` in the
254
+ * claim stream.
255
+ */
256
+ claim_heartbeat_ack: [Record<string, unknown>];
257
+ /**
258
+ * A committed write guarded with `onStale: 'notify'` collided with a
259
+ * concurrent change. Rather than forcing an outcome, the engine returns the
260
+ * conflicting field's current value so the actor — an agent reasoning over the
261
+ * change, or a person watching the row — can reconcile it. The commit itself
262
+ * succeeded; the held operations were not written, and the actor re-issues
263
+ * them once it has reconciled.
267
264
  */
268
265
  'conflict:notified': [{
269
266
  clientTxId: string;
@@ -282,7 +279,7 @@ export type DefaultCollaborationEvents = Record<string, never>;
282
279
  * `Record<string, ...>` requires an implicit string index signature, which
283
280
  * TypeScript interfaces don't have. So a closed interface like Ablo's
284
281
  * `AbloCollaborationEvents` would fail to satisfy `Record<string, unknown[]>`,
285
- * even though every one of its values IS a tuple. This mapped form iterates
282
+ * even though every one of its values is a tuple. This mapped form iterates
286
283
  * over `keyof T` instead of demanding a string index, so it accepts both
287
284
  * closed interfaces and open Record types — while still enforcing
288
285
  * "every value is an array."
@@ -315,10 +312,10 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
315
312
  /** Periodic catchup interval — polls for missed deltas every 30s while connected */
316
313
  private catchupInterval;
317
314
  /**
318
- * Application-level heartbeat ping every 30s, force-close on a 10s
319
- * silent watchdog. The full zombie-socket rationale lives with the
320
- * timers in `sync/heartbeat.ts`; the transport closures below are the
321
- * only socket access the controller gets.
315
+ * Application-level heartbeat: ping every 30 seconds and force-close after a
316
+ * 10-second silence. The {@link HeartbeatController} holds the timing and the
317
+ * zombie-socket rationale; the closures below are the only socket access it
318
+ * gets.
322
319
  */
323
320
  private readonly heartbeat;
324
321
  private isConnecting;
@@ -349,20 +346,19 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
349
346
  private lastForceCloseReason;
350
347
  private sessionErrorAt;
351
348
  /**
352
- * Sync-position state (lastSyncId watermark, version vector, server
353
- * cursor). The advance discipline stays documented at `sendAck` /
354
- * `handleDelta`; the state itself lives in `sync/syncCursor.ts`.
349
+ * Sync-position state: the lastSyncId watermark, version vector, and server
350
+ * cursor. The advance discipline is documented at `sendAck` and `handleDelta`;
351
+ * the state itself lives in {@link SyncCursor}.
355
352
  */
356
353
  private readonly cursor;
357
354
  /** Registered collaboration event keys (colon format) for dispatch in onmessage */
358
355
  private collaborationEventTypes;
359
356
  /**
360
- * Minimal session adapter handed to the frame dispatch table
361
- * (`sync/wsFrameHandlers.ts`). Exposes ONLY the members the handlers
362
- * touch; the closure members read live state so host-side reassignment
363
- * (e.g. the `pendingSubscriptions` reset on close) can't strand the
364
- * handlers on a stale reference. Built in the constructor, after the
365
- * state it captures exists.
357
+ * A minimal session adapter handed to the inbound frame dispatch table
358
+ * ({@link dispatchWsFrame}). It exposes only the members the handlers touch;
359
+ * the closure members read live state so a reassignment here (for example the
360
+ * `pendingSubscriptions` reset on close) cannot strand a handler on a stale
361
+ * reference. Built in the constructor, after the state it captures exists.
366
362
  */
367
363
  private readonly frameSession;
368
364
  /**
@@ -373,10 +369,10 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
373
369
  */
374
370
  private pendingMutations;
375
371
  /**
376
- * In-flight `claim` requests keyed by claimId. Resolved when the
377
- * matching `claim_ack` arrives, or rejected on timeout/disconnect.
378
- * Same shape as pendingMutations Phoenix-style request/response
379
- * over a multiplexed connection.
372
+ * In-flight `claim` requests keyed by claimId. Resolved when the matching
373
+ * `claim_ack` arrives, or rejected on timeout or disconnect — the same
374
+ * request/response pattern as `pendingMutations`, multiplexed over the one
375
+ * connection.
380
376
  */
381
377
  private pendingClaims;
382
378
  /**
@@ -411,28 +407,25 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
411
407
  */
412
408
  private setupEventHandlers;
413
409
  /**
414
- * Validate + normalize a wire delta at the receive boundary — the ONE
415
- * seam every inbound delta (`delta` frame, batch element, `sync_response`
416
- * replay, legacy bare frame) passes through before it is emitted,
417
- * persisted to IDB, or allowed to advance any watermark.
410
+ * Validates and normalizes a wire delta at the receive boundary — the single
411
+ * seam every inbound delta (a `delta` frame, a batch element, a `sync_response`
412
+ * replay, or the older bare frame) passes through before it is emitted,
413
+ * persisted, or allowed to advance any watermark.
418
414
  *
419
- * Normalization (older/deployed servers stay compatible):
420
- * - `id`: the contract says `number`, but deployed servers have sent the
421
- * raw Postgres BIGINT serialization — a STRING — and every downstream
422
- * watermark gate (`typeof syncId === 'number'` in
423
- * `Database.processDeltaBatch`, the metadata-cursor update, numeric
424
- * `>=` thresholds in TransactionQueue) silently breaks on strings:
425
- * acks are withheld, the resume cursor never advances, and every
426
- * reconnect replays from 0. Coerce ONCE here.
427
- * - `transactionId` / `createdBy`: the SERVER projection sends these as
428
- * nullable (and `createdBy` as a nested ParticipantRef); the client
429
- * contract types them as optional strings and never reads them.
430
- * Normalize to absent instead of rejecting every real server delta.
415
+ * Normalization keeps already-deployed servers compatible:
416
+ * - `id`: the contract says `number`, but some servers have sent the raw
417
+ * Postgres BIGINT serialization — a string — and every downstream watermark
418
+ * gate treats a string as invalid, so acks are withheld, the resume cursor
419
+ * never advances, and every reconnect replays from zero. Coerce it once here.
420
+ * - `transactionId` / `createdBy`: the server projection sends these as
421
+ * nullable (and `createdBy` as a nested reference); the client contract
422
+ * types them as optional strings and never reads them, so normalize them to
423
+ * absent rather than reject every real server delta.
431
424
  *
432
- * Validation: `clientSyncDeltaSchema.safeParse` the canonical Zod wire
433
- * contract. A frame that fails is DROPPED (returns `null`) with a
434
- * debug-level log + observability breadcrumb; it is never applied. One
435
- * parse per delta — callers must not re-parse.
425
+ * Validation runs `clientSyncDeltaSchema.safeParse`, the canonical wire
426
+ * contract. A frame that fails is dropped (returns `null`) with a debug log
427
+ * and an observability breadcrumb; it is never applied. There is one parse per
428
+ * delta — callers must not re-parse.
436
429
  */
437
430
  private normalizeWireDelta;
438
431
  /**
@@ -441,15 +434,13 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
441
434
  */
442
435
  private handleDelta;
443
436
  /**
444
- * Send acknowledgment for received delta with version vector.
445
- *
446
- * This is the SOLE forward-mover of `this.cursor.lastSyncId` for live
447
- * deltas. Called by `BaseSyncedStore.flushPendingDeltas` with the
448
- * `persistedSyncId` watermark i.e. only after the deltas have
449
- * actually committed to IDB. Keeping the cursor advance here (rather
450
- * than at receipt in `handleDelta`/`handleSyncResponse`) means the
451
- * cursor never gets ahead of the persisted view, so reconnect/
452
- * catch-up requests can't accidentally skip un-persisted deltas.
437
+ * Acknowledges received deltas up to the given syncId. This is the only place
438
+ * `this.cursor.lastSyncId` moves forward for live deltas. The store calls it
439
+ * with its persisted-syncId watermark that is, only after the deltas have
440
+ * committed to local storage. Advancing the cursor here, rather than at
441
+ * receipt in `handleDelta` or `handleSyncResponse`, keeps the cursor from
442
+ * getting ahead of the persisted view, so reconnect and catch-up requests
443
+ * cannot skip un-persisted deltas.
453
444
  */
454
445
  private sendAck;
455
446
  /**
@@ -461,23 +452,15 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
461
452
  */
462
453
  send(message: any): void;
463
454
  /**
464
- * Send a `commit` mutation request over the existing WebSocket and
465
- * resolve when the server's `mutation_result` frame comes back with
466
- * the same `clientTxId`. The wire-level frame is `{ type: 'commit',
467
- * payload: { operations, clientTxId } }` — matching the
468
- * `handleCommit` path on `apps/sync-server/src/hub/Hub.ts` (see the
469
- * dispatch at Hub.ts:737).
470
- *
471
- * Historical naming note: this was originally `sendBatchAck` back when
472
- * the Go sync-engine used a GraphQL `batchAck` mutation. The TS
473
- * sync-server uses `type: 'commit'` over WebSocket exclusively. The
474
- * method name now matches the wire protocol so the ack/commit naming
475
- * confusion stops here.
455
+ * Sends a `commit` mutation request over the existing WebSocket and resolves
456
+ * when the server's `mutation_result` frame comes back with the same
457
+ * `clientTxId`. The wire frame is `{ type: 'commit', payload: { operations,
458
+ * clientTxId } }`.
476
459
  *
477
- * Times out after 15s of silence from the server. The socket may close
478
- * during an in-flight mutation (network flap, server restart); we do
479
- * NOT auto-retry here — the caller's TransactionQueue owns retry +
480
- * offline replay semantics and the SDK shouldn't duplicate that logic.
460
+ * Times out after 15 seconds of silence from the server. The socket may close
461
+ * during an in-flight mutation (a network flap, a server restart); this does
462
+ * not auto-retry — the caller's transaction queue owns retry and offline
463
+ * replay, and the SDK does not duplicate that logic.
481
464
  */
482
465
  sendCommit(operations: readonly MutationOperation[], clientTxId: string, timeoutMs?: number, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null): Promise<CommitAck>;
483
466
  /**
@@ -490,21 +473,14 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
490
473
  */
491
474
  sendCommitQueued(operations: readonly MutationOperation[], clientTxId: string, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null): void;
492
475
  /**
493
- * Activate a participant claim on this connection. Multiplexed
494
- * subscription pattern (Phoenix Channels / Pusher) the same
495
- * connection can hold N concurrent claims, each scoped to a
496
- * different set of sync groups.
497
- *
498
- * Returns a promise that resolves with the server-canonicalized
499
- * `syncGroups` and effective `ttlSeconds` once `claim_ack` arrives,
500
- * or rejects with a typed error on `success: false` ack /
501
- * timeout / disconnect.
476
+ * Activates a participant claim on this connection. One connection can hold
477
+ * several concurrent claims at once, each scoped to a different set of sync
478
+ * groups, so the SDK reuses the existing connection instead of opening a
479
+ * separate socket per scope.
502
480
  *
503
- * Why this exists: the old scoped-participant path opened a separate
504
- * WS per scope. With claims, the SDK reuses the existing session/agent
505
- * connection one TCP, N logical participants. See
506
- * `apps/sync-server/docs/PARTICIPANT_CLAIMS.md` for the migration
507
- * framing (Phase A.1).
481
+ * Returns a promise that resolves with the server-canonicalized `syncGroups`
482
+ * and effective `ttlSeconds` once `claim_ack` arrives, or rejects with a typed
483
+ * error on a failed ack, a timeout, or a disconnect.
508
484
  */
509
485
  sendClaim(claimId: string, syncGroups: readonly string[], options?: {
510
486
  capabilityToken?: string;
@@ -525,22 +501,21 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
525
501
  */
526
502
  sendRelease(claimId: string): void;
527
503
  /**
528
- * Move this connection's READ interest — replace the connection-level
529
- * sync groups mid-session as the user opens/closes entities. This is the
530
- * area-of-interest (AOI) navigation primitive: the server fans out
531
- * deltas only for groups currently in view, instead of the frozen set
532
- * chosen at connect.
504
+ * Moves this connection's read interest — replaces the connection-level sync
505
+ * groups mid-session as the user opens and closes entities. This is the
506
+ * area-of-interest navigation primitive: the server fans out deltas only for
507
+ * the groups currently in view, rather than the fixed set chosen at connect.
533
508
  *
534
- * Full-set replace semantics — pass the complete new group list, not a
535
- * delta. Resolves with the server's effective set once `subscription_ack`
536
- * arrives; rejects (typed) on a scope denial (a restricted `rk_` key
537
- * requesting a group outside its allowlist), timeout, or disconnect. On
538
- * success the new set is recorded as `options.syncGroups` so a later
539
- * reconnect re-subscribes to current interest, not the connect-time set.
509
+ * This is a full-set replace: pass the complete new group list, not a delta.
510
+ * Resolves with the server's effective set once `subscription_ack` arrives;
511
+ * rejects (with a typed error) on a scope denial (a restricted `rk_` key
512
+ * requesting a group outside its allowlist), a timeout, or a disconnect. On
513
+ * success the new set is recorded as `options.syncGroups`, so a later reconnect
514
+ * re-subscribes to the current interest rather than the connect-time set.
540
515
  *
541
- * Distinct from {@link sendClaim} (write-claim, per-op, TTL'd) — this is
542
- * the read side and carries no capability token of its own; it's bounded
543
- * by the connection credential's grant.
516
+ * Distinct from {@link sendClaim} (a write claim, per operation, with a TTL):
517
+ * this is the read side, carries no capability token of its own, and is
518
+ * bounded by the connection credential's grant.
544
519
  */
545
520
  updateSubscription(syncGroups: readonly string[], options?: {
546
521
  timeoutMs?: number;
@@ -548,9 +523,9 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
548
523
  syncGroups: string[];
549
524
  }>;
550
525
  /**
551
- * Compatibility setter for direct SyncWebSocket users. The SDK-owned
552
- * `Ablo()` path passes `getAuthToken`, so reconnect URL auth reads the
553
- * shared credential source instead of this copied value.
526
+ * Sets a fixed credential for callers that construct the socket directly. The
527
+ * SDK instead supplies `getAuthToken`, so reconnects read the shared
528
+ * credential source rather than this copied value.
554
529
  */
555
530
  setCapabilityToken(token: string): void;
556
531
  getAuthToken(): string | undefined;
@@ -670,7 +645,7 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
670
645
  */
671
646
  getLastSyncId(): number;
672
647
  /**
673
- * Linear-style incremental sync request
648
+ * Requests an incremental sync from the server, starting at the current cursor.
674
649
  */
675
650
  requestIncrementalSync(): Promise<void>;
676
651
  /**
@@ -689,13 +664,12 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
689
664
  */
690
665
  private handleBootstrapResponse;
691
666
  /**
692
- * Handle presence update from server. The wire frame's payload is
693
- * forwarded as-is so every consumer (web entity cache,
694
- * PresenceStream, agent runtime) reads from the same shape.
695
- * Stripping fields here was a prior bug — it silently dropped
696
- * `kind`, `activity`, `syncGroups`, `isAgent` for rich consumers.
667
+ * Handles a presence update from the server. The wire frame's payload is
668
+ * forwarded as-is, so every consumer reads the same shape; stripping fields
669
+ * here would drop `kind`, `activity`, `syncGroups`, and `isAgent` for
670
+ * consumers that need them.
697
671
  *
698
- * Wire frame (apps/sync-server/src/hub/types.ts PresenceUpdateMessage):
672
+ * The wire frame is:
699
673
  * { type: 'presence_update', payload: { kind, userId, status,
700
674
  * syncGroups, activity, isAgent, timestamp, activeClaims } }
701
675
  */