@abloatai/ablo 0.25.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 (425) hide show
  1. package/AGENTS.md +5 -3
  2. package/CHANGELOG.md +34 -0
  3. package/README.md +104 -88
  4. package/dist/BaseSyncedStore.d.ts +140 -266
  5. package/dist/BaseSyncedStore.js +338 -739
  6. package/dist/Database.d.ts +62 -77
  7. package/dist/Database.js +106 -127
  8. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  9. package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
  10. package/dist/LazyReferenceCollection.d.ts +11 -15
  11. package/dist/LazyReferenceCollection.js +16 -15
  12. package/dist/Model.d.ts +37 -52
  13. package/dist/Model.js +52 -69
  14. package/dist/ModelRegistry.d.ts +46 -25
  15. package/dist/ModelRegistry.js +32 -30
  16. package/dist/NetworkMonitor.d.ts +5 -6
  17. package/dist/NetworkMonitor.js +6 -7
  18. package/dist/SyncClient.d.ts +119 -109
  19. package/dist/SyncClient.js +303 -224
  20. package/dist/SyncEngineContext.d.ts +1 -3
  21. package/dist/SyncEngineContext.js +1 -2
  22. package/dist/adapters/alwaysOnline.d.ts +6 -8
  23. package/dist/adapters/alwaysOnline.js +6 -8
  24. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  25. package/dist/adapters/inMemoryStorage.js +9 -9
  26. package/dist/agent/Agent.d.ts +39 -31
  27. package/dist/agent/Agent.js +35 -23
  28. package/dist/agent/index.d.ts +4 -4
  29. package/dist/agent/index.js +5 -5
  30. package/dist/agent/session.d.ts +47 -44
  31. package/dist/agent/session.js +37 -48
  32. package/dist/agent/types.d.ts +26 -31
  33. package/dist/agent/types.js +6 -7
  34. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  35. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  36. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  37. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +30 -31
  38. package/dist/ai-sdk/index.d.ts +25 -22
  39. package/dist/ai-sdk/index.js +25 -22
  40. package/dist/ai-sdk/wrap.d.ts +7 -8
  41. package/dist/ai-sdk/wrap.js +2 -2
  42. package/dist/auth/credentialPolicy.d.ts +74 -71
  43. package/dist/auth/credentialPolicy.js +51 -56
  44. package/dist/auth/credentialSource.d.ts +7 -18
  45. package/dist/auth/credentialSource.js +10 -18
  46. package/dist/auth/index.d.ts +59 -58
  47. package/dist/auth/index.js +34 -40
  48. package/dist/auth/schemas.d.ts +5 -4
  49. package/dist/auth/schemas.js +5 -4
  50. package/dist/batching/index.d.ts +19 -21
  51. package/dist/batching/index.js +14 -17
  52. package/dist/cli.cjs +483 -369
  53. package/dist/client/Ablo.d.ts +107 -836
  54. package/dist/client/Ablo.js +174 -833
  55. package/dist/client/ApiClient.d.ts +44 -20
  56. package/dist/client/ApiClient.js +193 -44
  57. package/dist/client/auth.d.ts +51 -60
  58. package/dist/client/auth.js +137 -110
  59. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  60. package/dist/client/claimHeartbeatLoop.js +88 -0
  61. package/dist/client/consoleLogger.d.ts +35 -0
  62. package/dist/client/consoleLogger.js +44 -0
  63. package/dist/client/createInternalComponents.d.ts +14 -17
  64. package/dist/client/createInternalComponents.js +26 -31
  65. package/dist/client/createModelProxy.d.ts +130 -120
  66. package/dist/client/createModelProxy.js +158 -124
  67. package/dist/client/credentialEndpoint.d.ts +61 -0
  68. package/dist/client/credentialEndpoint.js +86 -0
  69. package/dist/client/functionalUpdate.d.ts +29 -27
  70. package/dist/client/functionalUpdate.js +21 -21
  71. package/dist/client/hostedEndpoints.d.ts +21 -0
  72. package/dist/client/hostedEndpoints.js +21 -0
  73. package/dist/client/httpClient.d.ts +58 -54
  74. package/dist/client/httpClient.js +29 -31
  75. package/dist/client/identity.d.ts +15 -20
  76. package/dist/client/identity.js +49 -59
  77. package/dist/client/modelRegistration.d.ts +10 -0
  78. package/dist/client/modelRegistration.js +301 -0
  79. package/dist/client/options.d.ts +373 -0
  80. package/dist/client/options.js +6 -0
  81. package/dist/client/registerDataSource.d.ts +9 -9
  82. package/dist/client/registerDataSource.js +15 -16
  83. package/dist/client/resourceTypes.d.ts +333 -0
  84. package/dist/client/resourceTypes.js +7 -0
  85. package/dist/client/schemaConfig.d.ts +44 -0
  86. package/dist/client/schemaConfig.js +176 -0
  87. package/dist/client/sessionMint.d.ts +17 -13
  88. package/dist/client/sessionMint.js +26 -31
  89. package/dist/client/validateAbloOptions.d.ts +12 -14
  90. package/dist/client/validateAbloOptions.js +9 -10
  91. package/dist/client/writeOptionsSchema.d.ts +18 -16
  92. package/dist/client/writeOptionsSchema.js +23 -20
  93. package/dist/client/wsMutationExecutor.d.ts +28 -0
  94. package/dist/client/wsMutationExecutor.js +71 -0
  95. package/dist/context.d.ts +6 -4
  96. package/dist/context.js +6 -7
  97. package/dist/coordination/index.d.ts +13 -4
  98. package/dist/coordination/index.js +29 -4
  99. package/dist/coordination/schema.d.ts +176 -128
  100. package/dist/coordination/schema.js +197 -133
  101. package/dist/coordination/trace.d.ts +9 -11
  102. package/dist/coordination/trace.js +13 -15
  103. package/dist/core/DatabaseManager.d.ts +5 -8
  104. package/dist/core/DatabaseManager.js +38 -40
  105. package/dist/core/QueryProcessor.d.ts +7 -9
  106. package/dist/core/QueryProcessor.js +27 -34
  107. package/dist/core/QueryView.d.ts +17 -5
  108. package/dist/core/QueryView.js +6 -7
  109. package/dist/core/StoreManager.d.ts +14 -16
  110. package/dist/core/StoreManager.js +26 -25
  111. package/dist/core/ViewRegistry.d.ts +5 -5
  112. package/dist/core/ViewRegistry.js +4 -4
  113. package/dist/core/index.d.ts +18 -13
  114. package/dist/core/index.js +32 -26
  115. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  116. package/dist/core/openIDBWithTimeout.js +57 -54
  117. package/dist/core/queryUtils.d.ts +45 -0
  118. package/dist/core/queryUtils.js +69 -0
  119. package/dist/core/storeContract.d.ts +145 -0
  120. package/dist/core/storeContract.js +12 -0
  121. package/dist/environment.d.ts +28 -0
  122. package/dist/environment.js +21 -0
  123. package/dist/errorCodes.d.ts +118 -101
  124. package/dist/errorCodes.js +277 -260
  125. package/dist/errors.d.ts +170 -165
  126. package/dist/errors.js +161 -151
  127. package/dist/index.d.ts +30 -27
  128. package/dist/index.js +90 -82
  129. package/dist/interfaces/index.d.ts +108 -133
  130. package/dist/interfaces/index.js +5 -4
  131. package/dist/keys/index.d.ts +27 -29
  132. package/dist/keys/index.js +59 -49
  133. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  134. package/dist/mutators/RecordingTransaction.js +31 -37
  135. package/dist/mutators/Transaction.d.ts +18 -26
  136. package/dist/mutators/Transaction.js +14 -20
  137. package/dist/mutators/UndoManager.d.ts +122 -131
  138. package/dist/mutators/UndoManager.js +149 -155
  139. package/dist/mutators/defineMutators.d.ts +24 -37
  140. package/dist/mutators/defineMutators.js +14 -20
  141. package/dist/mutators/inverseOp.d.ts +12 -15
  142. package/dist/mutators/inverseOp.js +12 -15
  143. package/dist/mutators/mutateActions.d.ts +10 -9
  144. package/dist/mutators/mutateActions.js +1 -1
  145. package/dist/mutators/readerActions.d.ts +9 -8
  146. package/dist/mutators/readerActions.js +2 -2
  147. package/dist/mutators/undoApply.d.ts +31 -27
  148. package/dist/mutators/undoApply.js +26 -24
  149. package/dist/policy/index.d.ts +5 -3
  150. package/dist/policy/index.js +5 -3
  151. package/dist/policy/types.d.ts +105 -101
  152. package/dist/policy/types.js +67 -66
  153. package/dist/query/client.d.ts +32 -16
  154. package/dist/query/client.js +103 -72
  155. package/dist/query/types.d.ts +37 -60
  156. package/dist/query/types.js +13 -33
  157. package/dist/react/AbloProvider.d.ts +7 -11
  158. package/dist/react/AbloProvider.js +24 -17
  159. package/dist/react/context.d.ts +27 -146
  160. package/dist/react/context.js +9 -10
  161. package/dist/react/index.d.ts +41 -42
  162. package/dist/react/index.js +37 -38
  163. package/dist/react/internalContext.d.ts +17 -19
  164. package/dist/react/useAblo.d.ts +23 -22
  165. package/dist/react/useAblo.js +17 -15
  166. package/dist/react/useCurrentUserId.d.ts +8 -7
  167. package/dist/react/useCurrentUserId.js +8 -7
  168. package/dist/react/useErrorListener.d.ts +7 -7
  169. package/dist/react/useErrorListener.js +11 -12
  170. package/dist/react/useMutationFailureListener.d.ts +8 -8
  171. package/dist/react/useMutationFailureListener.js +9 -9
  172. package/dist/react/useMutators.d.ts +11 -11
  173. package/dist/react/useMutators.js +10 -4
  174. package/dist/react/useReactive.js +2 -3
  175. package/dist/react/useSyncStatus.d.ts +4 -6
  176. package/dist/react/useUndoScope.d.ts +7 -9
  177. package/dist/react/useUndoScope.js +3 -3
  178. package/dist/schema/coordination.d.ts +21 -25
  179. package/dist/schema/coordination.js +21 -25
  180. package/dist/schema/ddl.d.ts +43 -39
  181. package/dist/schema/ddl.js +75 -68
  182. package/dist/schema/ddlLock.d.ts +35 -0
  183. package/dist/schema/ddlLock.js +46 -0
  184. package/dist/schema/diff.d.ts +99 -61
  185. package/dist/schema/diff.js +43 -34
  186. package/dist/schema/field.d.ts +37 -42
  187. package/dist/schema/field.js +36 -49
  188. package/dist/schema/generate.d.ts +12 -12
  189. package/dist/schema/generate.js +12 -12
  190. package/dist/schema/index.d.ts +5 -4
  191. package/dist/schema/index.js +29 -21
  192. package/dist/schema/model.d.ts +121 -146
  193. package/dist/schema/model.js +24 -35
  194. package/dist/schema/openapi.d.ts +10 -9
  195. package/dist/schema/openapi.js +7 -1
  196. package/dist/schema/queries.d.ts +30 -32
  197. package/dist/schema/queries.js +24 -25
  198. package/dist/schema/relation.d.ts +89 -99
  199. package/dist/schema/relation.js +13 -13
  200. package/dist/schema/residency.d.ts +38 -0
  201. package/dist/schema/residency.js +30 -0
  202. package/dist/schema/roles.d.ts +45 -27
  203. package/dist/schema/roles.js +52 -21
  204. package/dist/schema/schema.d.ts +36 -45
  205. package/dist/schema/schema.js +42 -39
  206. package/dist/schema/select.d.ts +13 -13
  207. package/dist/schema/select.js +13 -13
  208. package/dist/schema/serialize.d.ts +36 -39
  209. package/dist/schema/serialize.js +27 -31
  210. package/dist/schema/sugar.d.ts +17 -32
  211. package/dist/schema/sugar.js +14 -29
  212. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +27 -50
  213. package/dist/schema/syncDeltaRow.js +89 -0
  214. package/dist/schema/tenancy.d.ts +44 -46
  215. package/dist/schema/tenancy.js +46 -48
  216. package/dist/server/adapter.d.ts +58 -58
  217. package/dist/server/adapter.js +13 -14
  218. package/dist/server/commit.d.ts +60 -64
  219. package/dist/server/index.d.ts +9 -10
  220. package/dist/server/index.js +1 -1
  221. package/dist/server/readConfig.d.ts +70 -0
  222. package/dist/server/readConfig.js +8 -0
  223. package/dist/server/storageMode.d.ts +23 -0
  224. package/dist/server/storageMode.js +17 -0
  225. package/dist/source/adapter.d.ts +31 -26
  226. package/dist/source/adapter.js +10 -10
  227. package/dist/source/adapters/drizzle.d.ts +28 -23
  228. package/dist/source/adapters/drizzle.js +34 -28
  229. package/dist/source/adapters/kysely.d.ts +27 -25
  230. package/dist/source/adapters/kysely.js +28 -26
  231. package/dist/source/adapters/memory.d.ts +8 -7
  232. package/dist/source/adapters/memory.js +10 -9
  233. package/dist/source/adapters/prisma.d.ts +13 -12
  234. package/dist/source/adapters/prisma.js +27 -29
  235. package/dist/source/conformance.d.ts +18 -11
  236. package/dist/source/conformance.js +27 -19
  237. package/dist/source/connector.d.ts +31 -32
  238. package/dist/source/connector.js +30 -28
  239. package/dist/source/connectorProtocol.d.ts +160 -0
  240. package/dist/source/connectorProtocol.js +162 -0
  241. package/dist/source/contract.d.ts +26 -27
  242. package/dist/source/contract.js +28 -29
  243. package/dist/source/factory.d.ts +94 -0
  244. package/dist/source/factory.js +268 -0
  245. package/dist/source/index.d.ts +10 -462
  246. package/dist/source/index.js +17 -421
  247. package/dist/source/migrations.d.ts +9 -9
  248. package/dist/source/migrations.js +9 -9
  249. package/dist/source/next.d.ts +10 -11
  250. package/dist/source/next.js +7 -8
  251. package/dist/source/pushQueue.d.ts +70 -48
  252. package/dist/source/pushQueue.js +36 -29
  253. package/dist/source/signing.d.ts +88 -0
  254. package/dist/source/signing.js +159 -0
  255. package/dist/source/types.d.ts +351 -0
  256. package/dist/source/types.js +43 -0
  257. package/dist/stores/ObjectStore.d.ts +11 -12
  258. package/dist/stores/ObjectStore.js +34 -35
  259. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  260. package/dist/stores/SyncActionStore.d.ts +8 -12
  261. package/dist/stores/SyncActionStore.js +77 -46
  262. package/dist/surface.d.ts +28 -21
  263. package/dist/surface.js +28 -20
  264. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
  265. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
  266. package/dist/sync/ConnectionManager.d.ts +47 -50
  267. package/dist/sync/ConnectionManager.js +74 -70
  268. package/dist/sync/NetworkProbe.d.ts +27 -31
  269. package/dist/sync/NetworkProbe.js +67 -72
  270. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
  271. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
  272. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
  273. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
  274. package/dist/sync/SyncWebSocket.d.ts +175 -250
  275. package/dist/sync/SyncWebSocket.js +431 -769
  276. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  277. package/dist/sync/awaitClaimGrant.js +38 -30
  278. package/dist/sync/bootstrapApply.d.ts +70 -0
  279. package/dist/sync/bootstrapApply.js +73 -0
  280. package/dist/sync/commitFrames.d.ts +44 -0
  281. package/dist/sync/commitFrames.js +94 -0
  282. package/dist/sync/createClaimStream.d.ts +23 -22
  283. package/dist/sync/createClaimStream.js +108 -25
  284. package/dist/sync/createPresenceStream.d.ts +19 -18
  285. package/dist/sync/createPresenceStream.js +25 -26
  286. package/dist/sync/createSnapshot.d.ts +13 -17
  287. package/dist/sync/createSnapshot.js +20 -26
  288. package/dist/sync/credentialLifecycle.d.ts +175 -0
  289. package/dist/sync/credentialLifecycle.js +322 -0
  290. package/dist/sync/deltaPipeline.d.ts +113 -0
  291. package/dist/sync/deltaPipeline.js +261 -0
  292. package/dist/sync/groupChange.d.ts +113 -0
  293. package/dist/sync/groupChange.js +242 -0
  294. package/dist/sync/heartbeat.d.ts +63 -0
  295. package/dist/sync/heartbeat.js +91 -0
  296. package/dist/sync/participants.d.ts +27 -27
  297. package/dist/sync/schemas.d.ts +3 -2
  298. package/dist/sync/schemas.js +14 -10
  299. package/dist/sync/syncCursor.d.ts +40 -0
  300. package/dist/sync/syncCursor.js +55 -0
  301. package/dist/sync/syncPlan.d.ts +54 -0
  302. package/dist/sync/syncPlan.js +50 -0
  303. package/dist/sync/syncPosition.d.ts +54 -49
  304. package/dist/sync/syncPosition.js +57 -52
  305. package/dist/sync/wsFrameHandlers.d.ts +116 -0
  306. package/dist/sync/wsFrameHandlers.js +374 -0
  307. package/dist/testing/fixtures/bootstrap.d.ts +21 -17
  308. package/dist/testing/fixtures/bootstrap.js +12 -6
  309. package/dist/testing/fixtures/deltas.d.ts +31 -34
  310. package/dist/testing/fixtures/deltas.js +30 -33
  311. package/dist/testing/fixtures/models.d.ts +11 -10
  312. package/dist/testing/fixtures/models.js +12 -10
  313. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  314. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  315. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -18
  316. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
  317. package/dist/testing/helpers/wait.d.ts +13 -8
  318. package/dist/testing/helpers/wait.js +13 -8
  319. package/dist/testing/index.d.ts +4 -4
  320. package/dist/testing/index.js +3 -3
  321. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  322. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  323. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  324. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  325. package/dist/testing/mocks/MockSyncContext.d.ts +21 -34
  326. package/dist/testing/mocks/MockSyncContext.js +16 -45
  327. package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
  328. package/dist/testing/mocks/MockSyncStore.js +11 -11
  329. package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
  330. package/dist/testing/mocks/MockWebSocket.js +22 -21
  331. package/dist/transactions/TransactionQueue.d.ts +190 -221
  332. package/dist/transactions/TransactionQueue.js +424 -822
  333. package/dist/transactions/TransactionStore.d.ts +20 -0
  334. package/dist/transactions/TransactionStore.js +53 -0
  335. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  336. package/dist/transactions/UnconfirmedWrites.js +104 -0
  337. package/dist/transactions/coalesceRules.d.ts +58 -0
  338. package/dist/transactions/coalesceRules.js +140 -0
  339. package/dist/transactions/commitPayload.d.ts +130 -0
  340. package/dist/transactions/commitPayload.js +143 -0
  341. package/dist/transactions/deltaConfirmation.d.ts +58 -0
  342. package/dist/transactions/deltaConfirmation.js +215 -0
  343. package/dist/transactions/optimisticApply.d.ts +49 -0
  344. package/dist/transactions/optimisticApply.js +65 -0
  345. package/dist/transactions/replayValidation.d.ts +99 -0
  346. package/dist/transactions/replayValidation.js +111 -0
  347. package/dist/types/global.d.ts +46 -41
  348. package/dist/types/global.js +20 -19
  349. package/dist/types/index.d.ts +74 -80
  350. package/dist/types/index.js +22 -27
  351. package/dist/types/modelData.d.ts +10 -0
  352. package/dist/types/modelData.js +9 -0
  353. package/dist/types/participant.d.ts +20 -0
  354. package/dist/types/participant.js +10 -0
  355. package/dist/types/streams.d.ts +216 -209
  356. package/dist/types/streams.js +7 -7
  357. package/dist/utils/asyncIterator.d.ts +25 -32
  358. package/dist/utils/asyncIterator.js +25 -32
  359. package/dist/utils/duration.d.ts +12 -15
  360. package/dist/utils/duration.js +12 -15
  361. package/dist/utils/mobxSetup.d.ts +53 -0
  362. package/dist/utils/{mobx-setup.js → mobxSetup.js} +44 -100
  363. package/dist/webhooks/events.d.ts +21 -16
  364. package/dist/webhooks/events.js +10 -8
  365. package/dist/webhooks/index.d.ts +5 -7
  366. package/dist/webhooks/index.js +5 -7
  367. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  368. package/dist/wire/delta.js +114 -0
  369. package/dist/wire/errorEnvelope.d.ts +35 -27
  370. package/dist/wire/errorEnvelope.js +38 -32
  371. package/dist/wire/frames.d.ts +150 -67
  372. package/dist/wire/frames.js +48 -1
  373. package/dist/wire/index.d.ts +18 -13
  374. package/dist/wire/index.js +36 -13
  375. package/dist/wire/listEnvelope.d.ts +16 -23
  376. package/dist/wire/listEnvelope.js +7 -6
  377. package/dist/wire/protocol.d.ts +38 -0
  378. package/dist/wire/protocol.js +38 -0
  379. package/dist/wire/protocolVersion.d.ts +60 -0
  380. package/dist/wire/protocolVersion.js +67 -0
  381. package/docs/api-keys.md +4 -3
  382. package/docs/coordination.md +59 -0
  383. package/docs/examples/existing-python-backend.md +3 -3
  384. package/docs/identity.md +4 -4
  385. package/docs/integration-guide.md +1 -1
  386. package/docs/react.md +1 -1
  387. package/docs/sessions.md +5 -7
  388. package/package.json +24 -21
  389. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  390. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  391. package/dist/client/index.d.ts +0 -36
  392. package/dist/client/index.js +0 -33
  393. package/dist/config/index.d.ts +0 -10
  394. package/dist/config/index.js +0 -12
  395. package/dist/core/query-utils.d.ts +0 -34
  396. package/dist/core/query-utils.js +0 -59
  397. package/dist/interfaces/headless.d.ts +0 -95
  398. package/dist/interfaces/headless.js +0 -41
  399. package/dist/query/index.d.ts +0 -6
  400. package/dist/query/index.js +0 -5
  401. package/dist/realtime/index.d.ts +0 -10
  402. package/dist/realtime/index.js +0 -9
  403. package/dist/schema/plane.d.ts +0 -23
  404. package/dist/schema/plane.js +0 -19
  405. package/dist/schema/sync-delta-row.js +0 -103
  406. package/dist/schema/sync-delta-wire.js +0 -102
  407. package/dist/server/next.d.ts +0 -51
  408. package/dist/server/next.js +0 -47
  409. package/dist/server/read-config.d.ts +0 -67
  410. package/dist/server/read-config.js +0 -8
  411. package/dist/server/storage-mode.d.ts +0 -1
  412. package/dist/server/storage-mode.js +0 -18
  413. package/dist/source/connector-protocol.d.ts +0 -159
  414. package/dist/source/connector-protocol.js +0 -161
  415. package/dist/sync/OfflineFlush.d.ts +0 -9
  416. package/dist/sync/OfflineFlush.js +0 -22
  417. package/dist/sync/OfflineTransactionStore.d.ts +0 -37
  418. package/dist/sync/OfflineTransactionStore.js +0 -263
  419. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  420. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  421. package/dist/transactions/index.d.ts +0 -16
  422. package/dist/transactions/index.js +0 -7
  423. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  424. package/dist/transactions/mutation-error-handler.js +0 -39
  425. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,74 +1,53 @@
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
- /**
15
- * Resolution value of a commit ack. `notifications` is present only when a
16
- * guarded write (`onStale: 'notify') hit a concurrent change — the
17
- * advisory self-heal signal, surfaced both here and via `conflict:notified`.
18
- */
19
- export interface CommitAck {
20
- lastSyncId: number;
21
- notifications?: StaleNotification[];
22
- }
13
+ import { type CommitAck } from './commitFrames.js';
14
+ export type { CommitAck } from './commitFrames.js';
23
15
  import { type AuthTokenGetter } from '../auth/credentialSource.js';
24
16
  /**
25
- * The wire delta the client receives. Derived from the canonical
26
- * `clientSyncDeltaSchema` (`@abloatai/ablo/schema`) via `z.infer` so the
27
- * SDK and the sync-server share ONE contract instead of two hand-maintained
28
- * interfaces. The action vocabulary (`I`/`U`/`D`/`A`/`V`/`C`/`G`/`S`) and the
29
- * client-only extras (`metadata`, `clientMutationId`, deprecated flat
30
- * `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.
31
23
  */
32
24
  export type SyncDelta = ClientSyncDelta;
33
25
  /**
34
- * Payload for legacy actionType 'G' deltas emitted by EmitGroupChange.
35
- * 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.
36
28
  */
37
29
  export interface SyncGroupChangePayload {
38
30
  removedGroups: string[];
39
31
  addedGroups: string[];
40
32
  }
41
33
  /**
42
- * Payload for incremental actionType 'G' deltas emitted by EmitGroupAdded.
43
- * Signals that the recipient has joined a single sync group; subsequent
44
- * 'C' (Covering) deltas will deliver the newly-visible entities. No
45
- * 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.
46
37
  */
47
38
  export interface GroupAddedPayload {
48
39
  group: string;
49
40
  userId: string;
50
41
  }
51
42
  /**
52
- * Payload for actionType 'S' deltas emitted by EmitGroupRemoved.
53
- * Signals that the recipient has lost access to a sync group. The client
54
- * 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.
55
46
  */
56
47
  export interface GroupRemovedPayload {
57
48
  group: string;
58
49
  userId: string;
59
50
  }
60
- export interface VersionVector {
61
- tasks: number;
62
- projects: number;
63
- users: number;
64
- events: number;
65
- inboxitems: number;
66
- teams: number;
67
- assignments: number;
68
- comments: number;
69
- threads: number;
70
- [entityType: string]: number;
71
- }
72
51
  export interface SyncCapabilities {
73
52
  partialBootstrap?: boolean;
74
53
  compressedDeltas?: boolean;
@@ -83,7 +62,6 @@ export interface SyncWebSocketOptions {
83
62
  organizationId: string;
84
63
  lastSyncId?: number;
85
64
  syncGroups?: string[];
86
- versions?: VersionVector;
87
65
  capabilities?: SyncCapabilities;
88
66
  reconnectDelay?: number;
89
67
  maxReconnectDelay?: number;
@@ -93,27 +71,25 @@ export interface SyncWebSocketOptions {
93
71
  */
94
72
  collaborationEvents?: string[];
95
73
  /**
96
- * Participant kind to declare on the WS upgrade. Defaults to `'user'`
97
- * (session-auth, web app). Agent runtimes (Node workers) pass
98
- * `'agent'` so the server's `agentTokenProvider`
99
- * routes them through capability-token verification instead of
100
- * 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.
101
78
  */
102
79
  kind?: 'user' | 'agent' | 'system';
103
80
  /**
104
- * The agent's bearer credential — a restricted (`rk_`) API key. When
105
- * set, sent in the `ablo.bearer.<token>` WebSocket subprotocol so the
106
- * credential stays out of URLs and proxy logs. Required for `kind: 'agent'`;
107
- * ignored for `kind: 'user'`. (Field name predates the Biscuit→opaque-key
108
- * 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'`.
109
85
  */
110
86
  capabilityToken?: string;
111
87
  /**
112
- * Shared credential getter. When provided, WebSocket URL auth reads this
113
- * instead of a copied `capabilityToken`, so reconnects use refreshed tokens
114
- * 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`.
115
92
  */
116
- /** Shared SDK auth getter. Preferred internal name. */
117
93
  getAuthToken?: AuthTokenGetter;
118
94
  /** @deprecated Use `getAuthToken`. Kept for direct low-level callers. */
119
95
  getCapabilityToken?: AuthTokenGetter;
@@ -136,14 +112,11 @@ export interface BootstrapDataEvent {
136
112
  cursor?: string;
137
113
  }
138
114
  /**
139
- * Presence update event payload mirrors the wire frame's `payload`
140
- * field (apps/sync-server/src/hub/types.ts PresenceUpdateMessage).
141
- *
142
- * Every consumer (web entity-presence cache, PresenceStream,
143
- * agent-runtime presence reducer) reads its own subset; this type is
144
- * the union of what the server actually sends. Stripping fields at
145
- * this layer (the prior bug) silently broke rich-presence consumers
146
- * 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.
147
120
  */
148
121
  export interface PresenceUpdateEvent {
149
122
  /** Server-stamped transition: 'enter' on join + roster snapshot,
@@ -171,17 +144,16 @@ export interface PresenceUpdateEvent {
171
144
  * not self-declare — server is the source of truth. */
172
145
  isAgent?: boolean;
173
146
  /**
174
- * Server-stamped canonical kind (`'user' | 'agent' | 'system'`). Additive:
175
- * older servers omit it and readers fall back to the lossy `isAgent`
176
- * boolean (which cannot express `'system'`). Typed `string` because it is
177
- * 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`.
178
151
  */
179
152
  participantKind?: string;
180
153
  timestamp?: number;
181
- /** Server stamps every presence frame with this participant's open
182
- * claims so peers see them without a separate channel. Wire
183
- * shape mirrors `apps/sync-server/src/hub/types.ts Claim`. */
184
- activeClaims?: Array<{
154
+ /** Every presence frame carries this participant's open claims, stamped by
155
+ * the server, so peers see them without a separate channel. */
156
+ activeClaims?: {
185
157
  claimId: string;
186
158
  entityType: string;
187
159
  entityId: string;
@@ -198,14 +170,14 @@ export interface PresenceUpdateEvent {
198
170
  declaredAt: number;
199
171
  expiresAt: number;
200
172
  /**
201
- * Lifecycle state. Additive older servers omit it and the reader
202
- * treats absence as `'active'`. Terminal states (`committed` /
203
- * `expired` / `canceled`) ride one frame as the claim ends so peers
204
- * 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.
205
177
  */
206
178
  status?: 'active' | 'committed' | 'expired' | 'canceled';
207
179
  error?: ClaimError;
208
- }>;
180
+ }[];
209
181
  localTime?: string;
210
182
  type?: string;
211
183
  timezone?: string;
@@ -276,14 +248,19 @@ export interface CoreSyncEventMap {
276
248
  claim_granted: [Record<string, unknown>];
277
249
  claim_lost: [Record<string, unknown>];
278
250
  /**
279
- * Notify-instead-of-abort (non-coercion). A committed write guarded with
280
- * `onStale: 'notify' collided with a concurrent change; rather than
281
- * forcing an outcome, the engine returned the conflicting field's current
282
- * value so the actor can solve it. The resolver is the intelligent actor —
283
- * an agent reasoning over the change, or a human watching the row. The commit
284
- * SUCCEEDED; held ops ('notify') weren't written and the actor re-issues once
285
- * it has reconciled. (The claim is the prospective form of the same
286
- * 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.
287
264
  */
288
265
  'conflict:notified': [{
289
266
  clientTxId: string;
@@ -302,7 +279,7 @@ export type DefaultCollaborationEvents = Record<string, never>;
302
279
  * `Record<string, ...>` requires an implicit string index signature, which
303
280
  * TypeScript interfaces don't have. So a closed interface like Ablo's
304
281
  * `AbloCollaborationEvents` would fail to satisfy `Record<string, unknown[]>`,
305
- * 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
306
283
  * over `keyof T` instead of demanding a string index, so it accepts both
307
284
  * closed interfaces and open Record types — while still enforcing
308
285
  * "every value is an array."
@@ -335,20 +312,12 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
335
312
  /** Periodic catchup interval — polls for missed deltas every 30s while connected */
336
313
  private catchupInterval;
337
314
  /**
338
- * Application-level heartbeat. The browser WebSocket API hides RFC 6455
339
- * protocol-level ping/pong from JavaScript, so the server's `ws.ping()`
340
- * keepalive can't be observed by client code meaning the client cannot
341
- * tell a healthy idle connection apart from a "zombie" socket where TCP
342
- * silently broke (laptop sleep, NAT timeout, mobile handoff). We send an
343
- * application-level `{ type: 'ping' }` every 30s and force-close the
344
- * socket if no inbound traffic arrives within 10s. ANY inbound message
345
- * counts as proof-of-life — the explicit `pong` is just a guarantee that
346
- * something will arrive even on an idle stream.
347
- */
348
- private heartbeatTimer;
349
- private heartbeatTimeoutTimer;
350
- private static readonly HEARTBEAT_INTERVAL_MS;
351
- private static readonly HEARTBEAT_TIMEOUT_MS;
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.
319
+ */
320
+ private readonly heartbeat;
352
321
  private isConnecting;
353
322
  private isManualClose;
354
323
  /** When true, a session error has been detected (from any path — WS close or HTTP bootstrap).
@@ -376,11 +345,22 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
376
345
  private lastCloseReason;
377
346
  private lastForceCloseReason;
378
347
  private sessionErrorAt;
379
- private lastSyncId;
380
- private versionVector;
381
- private syncCursor;
348
+ /**
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}.
352
+ */
353
+ private readonly cursor;
382
354
  /** Registered collaboration event keys (colon format) for dispatch in onmessage */
383
355
  private collaborationEventTypes;
356
+ /**
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.
362
+ */
363
+ private readonly frameSession;
384
364
  /**
385
365
  * In-flight `commit` mutation requests keyed by clientTxId. Resolved when
386
366
  * a matching `mutation_result` frame arrives from the server, or rejected on
@@ -389,10 +369,10 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
389
369
  */
390
370
  private pendingMutations;
391
371
  /**
392
- * In-flight `claim` requests keyed by claimId. Resolved when the
393
- * matching `claim_ack` arrives, or rejected on timeout/disconnect.
394
- * Same shape as pendingMutations Phoenix-style request/response
395
- * 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.
396
376
  */
397
377
  private pendingClaims;
398
378
  /**
@@ -410,6 +390,14 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
410
390
  * Suppresses further reconnection attempts and Sentry error capture.
411
391
  */
412
392
  setSessionErrorDetected(): void;
393
+ /**
394
+ * Clear the session-error latch so `connect()` / `scheduleReconnect()`
395
+ * work again. Called by the store's access-credential recovery path when
396
+ * the close was a re-mintable `ek_`/`rk_` expiry (`4001 credential_expired`),
397
+ * not a login loss — see `isAccessCredentialExpiryCloseReason`. Genuine
398
+ * session losses never clear the latch; re-auth builds a fresh client.
399
+ */
400
+ clearSessionError(): void;
413
401
  /**
414
402
  * Connect to the sync engine WebSocket
415
403
  */
@@ -419,32 +407,40 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
419
407
  */
420
408
  private setupEventHandlers;
421
409
  /**
422
- * Normalize a wire delta at the receive boundary. The contract
423
- * (`syncDeltaWireCoreSchema`) says `id: number`, but deployed servers
424
- * have sent the raw Postgres BIGINT serialization a STRING and
425
- * every downstream watermark gate (`typeof syncId === 'number'` in
426
- * `Database.processDeltaBatch`, the metadata-cursor update, numeric
427
- * `>=` threshold comparisons in TransactionQueue) silently breaks on
428
- * strings: acks are withheld, the resume cursor never advances, and
429
- * every reconnect replays from 0 (or force-bootstraps once the gap
430
- * exceeds maxDeltaGapForPartial). Coerce ONCE here so the rest of the
431
- * client can trust the declared type and old servers stay compatible.
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.
414
+ *
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.
424
+ *
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.
432
429
  */
433
430
  private normalizeWireDelta;
434
431
  /**
435
- * Handle incoming sync delta
432
+ * Handle incoming sync delta (untrusted wire input — validated and
433
+ * normalized by {@link normalizeWireDelta}; malformed deltas are dropped).
436
434
  */
437
435
  private handleDelta;
438
436
  /**
439
- * Send acknowledgment for received delta with version vector.
440
- *
441
- * This is the SOLE forward-mover of `this.lastSyncId` for live
442
- * deltas. Called by `BaseSyncedStore.flushPendingDeltas` with the
443
- * `persistedSyncId` watermark i.e. only after the deltas have
444
- * actually committed to IDB. Keeping the cursor advance here (rather
445
- * than at receipt in `handleDelta`/`handleSyncResponse`) means the
446
- * cursor never gets ahead of the persisted view, so reconnect/
447
- * 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.
448
444
  */
449
445
  private sendAck;
450
446
  /**
@@ -456,50 +452,17 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
456
452
  */
457
453
  send(message: any): void;
458
454
  /**
459
- * Project the SDK's `MutationOperation[]` onto the canonical wire
460
- * `CommitMessage`. This is the single serialize boundary between the SDK op
461
- * type (loose `type: string`, plus an SDK-internal `options` the server never
462
- * reads) and the strict wire contract. The per-field map gives compile-time
463
- * drift detection (a `CommitOperation` shape change breaks here) and the lone
464
- * `as` narrows the validated op `type` to the wire union — the only
465
- * loosening, localized to this boundary.
466
- */
467
- private buildCommitFrame;
468
- /**
469
- * Send a `commit` mutation request over the existing WebSocket and
470
- * resolve when the server's `mutation_result` frame comes back with
471
- * the same `clientTxId`. The wire-level frame is `{ type: 'commit',
472
- * payload: { operations, clientTxId } }` — matching the
473
- * `handleCommit` path on `apps/sync-server/src/hub/Hub.ts` (see the
474
- * dispatch at Hub.ts:737).
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 } }`.
475
459
  *
476
- * Historical naming note: this was originally `sendBatchAck` back when
477
- * the Go sync-engine used a GraphQL `batchAck` mutation. The TS
478
- * sync-server uses `type: 'commit'` over WebSocket exclusively. The
479
- * method name now matches the wire protocol so the ack/commit naming
480
- * confusion stops here.
481
- *
482
- * Times out after 15s of silence from the server. The socket may close
483
- * during an in-flight mutation (network flap, server restart); we do
484
- * NOT auto-retry here — the caller's TransactionQueue owns retry +
485
- * offline replay semantics and the SDK shouldn't duplicate that logic.
486
- */
487
- /**
488
- * Defensively validate the optional `notifications` array off a commit ack.
489
- * Untrusted wire data — a malformed entry is dropped rather than throwing,
490
- * so a bad notification never sinks an otherwise-successful commit.
491
- */
492
- private parseNotifications;
493
- /**
494
- * Single instrumentation point for claim events. Every `claim_*` frame routes
495
- * through here so a developer debugging a collision gets one consistent trace
496
- * — a console line AND a structured capture — without each dispatch case
497
- * re-deriving the row/holder shape. The wire payload is loosely typed
498
- * (`Record<string, unknown>`), so this is the one place that narrows it into
499
- * a {@link ClaimEvent}.
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.
500
464
  */
501
- private recordClaim;
502
- sendCommit(operations: ReadonlyArray<MutationOperation>, clientTxId: string, timeoutMs?: number, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null): Promise<CommitAck>;
465
+ sendCommit(operations: readonly MutationOperation[], clientTxId: string, timeoutMs?: number, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null): Promise<CommitAck>;
503
466
  /**
504
467
  * Send a commit frame without waiting for `mutation_result`.
505
468
  *
@@ -508,25 +471,18 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
508
471
  * eventual `mutation_result` frame is intentionally ignored by this
509
472
  * instance because no pending resolver is registered.
510
473
  */
511
- sendCommitQueued(operations: ReadonlyArray<MutationOperation>, clientTxId: string, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null): void;
474
+ sendCommitQueued(operations: readonly MutationOperation[], clientTxId: string, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null): void;
512
475
  /**
513
- * Activate a participant claim on this connection. Multiplexed
514
- * subscription pattern (Phoenix Channels / Pusher) the same
515
- * connection can hold N concurrent claims, each scoped to a
516
- * different set of sync groups.
517
- *
518
- * Returns a promise that resolves with the server-canonicalized
519
- * `syncGroups` and effective `ttlSeconds` once `claim_ack` arrives,
520
- * or rejects with a typed error on `success: false` ack /
521
- * 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.
522
480
  *
523
- * Why this exists: the old scoped-participant path opened a separate
524
- * WS per scope. With claims, the SDK reuses the existing session/agent
525
- * connection one TCP, N logical participants. See
526
- * `apps/sync-server/docs/PARTICIPANT_CLAIMS.md` for the migration
527
- * 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.
528
484
  */
529
- sendClaim(claimId: string, syncGroups: ReadonlyArray<string>, options?: {
485
+ sendClaim(claimId: string, syncGroups: readonly string[], options?: {
530
486
  capabilityToken?: string;
531
487
  ttlSeconds?: number;
532
488
  timeoutMs?: number;
@@ -545,32 +501,31 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
545
501
  */
546
502
  sendRelease(claimId: string): void;
547
503
  /**
548
- * Move this connection's READ interest — replace the connection-level
549
- * sync groups mid-session as the user opens/closes entities. This is the
550
- * area-of-interest (AOI) navigation primitive: the server fans out
551
- * deltas only for groups currently in view, instead of the frozen set
552
- * 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.
553
508
  *
554
- * Full-set replace semantics — pass the complete new group list, not a
555
- * delta. Resolves with the server's effective set once `subscription_ack`
556
- * arrives; rejects (typed) on a scope denial (a restricted `rk_` key
557
- * requesting a group outside its allowlist), timeout, or disconnect. On
558
- * success the new set is recorded as `options.syncGroups` so a later
559
- * 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.
560
515
  *
561
- * Distinct from {@link sendClaim} (write-claim, per-op, TTL'd) — this is
562
- * the read side and carries no capability token of its own; it's bounded
563
- * 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.
564
519
  */
565
- updateSubscription(syncGroups: ReadonlyArray<string>, options?: {
520
+ updateSubscription(syncGroups: readonly string[], options?: {
566
521
  timeoutMs?: number;
567
522
  }): Promise<{
568
523
  syncGroups: string[];
569
524
  }>;
570
525
  /**
571
- * Compatibility setter for direct SyncWebSocket users. The SDK-owned
572
- * `Ablo()` path passes `getAuthToken`, so reconnect URL auth reads the
573
- * 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.
574
529
  */
575
530
  setCapabilityToken(token: string): void;
576
531
  getAuthToken(): string | undefined;
@@ -584,15 +539,15 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
584
539
  /**
585
540
  * Send spreadsheet selection presence
586
541
  */
587
- sendSheetSelection(sheetId: string, selectedCells: Array<{
542
+ sendSheetSelection(sheetId: string, selectedCells: {
588
543
  ref: string;
589
- }>): void;
544
+ }[]): void;
590
545
  /**
591
546
  * Send slide layer selection presence
592
547
  */
593
- sendSlideSelection(deckId: string, slideId: string, selectedLayers: Array<{
548
+ sendSlideSelection(deckId: string, slideId: string, selectedLayers: {
594
549
  layerId: string;
595
- }>): void;
550
+ }[]): void;
596
551
  /**
597
552
  * Send slide cursor position for real-time collaboration
598
553
  * Note: Throttling should be handled by the caller (e.g., useSlideCursorBroadcast hook)
@@ -628,26 +583,6 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
628
583
  * Disconnect from WebSocket
629
584
  */
630
585
  disconnect(): void;
631
- /**
632
- * Application-level heartbeat. Every `HEARTBEAT_INTERVAL_MS` while
633
- * `OPEN`, send `{ type: 'ping' }` and arm a `HEARTBEAT_TIMEOUT_MS`
634
- * watchdog. Any inbound frame (handled in `onmessage`) clears the
635
- * watchdog. If the watchdog fires, we treat the connection as
636
- * zombie and force-close it — `onclose` then triggers the existing
637
- * reconnect path.
638
- *
639
- * Why both sides need this:
640
- * - The server sends RFC 6455 protocol pings via `ws.ping()` every
641
- * 30s. Browsers auto-respond with a pong but DO NOT expose either
642
- * frame to JavaScript, so the client is blind to its own keepalive.
643
- * - On a half-open TCP (laptop wake, NAT timeout, mobile handoff)
644
- * the browser may keep `readyState === OPEN` for minutes before
645
- * the OS surfaces the broken connection. App-level traffic is
646
- * the only signal we can observe.
647
- */
648
- private startHeartbeat;
649
- private stopHeartbeat;
650
- private clearHeartbeatTimeout;
651
586
  /**
652
587
  * Force-close the socket from the client side using a private 4xxx
653
588
  * code. Callers expect `onclose` to fire; that handler runs the
@@ -697,18 +632,6 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
697
632
  * Update last sync ID (for persistence)
698
633
  */
699
634
  setLastSyncId(syncId: number): void;
700
- /**
701
- * Get current version vector
702
- */
703
- getVersionVector(): VersionVector;
704
- /**
705
- * Update version vector for specific entity type
706
- */
707
- updateVersionVector(entityType: string, version: number): void;
708
- /**
709
- * Set version vector (for initialization)
710
- */
711
- setVersionVector(versions: VersionVector): void;
712
635
  /**
713
636
  * Update sync cursor (for incremental sync)
714
637
  */
@@ -722,7 +645,7 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
722
645
  */
723
646
  getLastSyncId(): number;
724
647
  /**
725
- * Linear-style incremental sync request
648
+ * Requests an incremental sync from the server, starting at the current cursor.
726
649
  */
727
650
  requestIncrementalSync(): Promise<void>;
728
651
  /**
@@ -730,7 +653,10 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
730
653
  */
731
654
  requestBootstrap(entities?: string[]): Promise<void>;
732
655
  /**
733
- * Handle sync response from server
656
+ * Handle sync response from server. Untrusted wire input — the envelope
657
+ * fields are narrowed defensively and every delta is validated through
658
+ * {@link normalizeWireDelta} (exactly once each; malformed ones drop out
659
+ * of the batch).
734
660
  */
735
661
  private handleSyncResponse;
736
662
  /**
@@ -738,13 +664,12 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
738
664
  */
739
665
  private handleBootstrapResponse;
740
666
  /**
741
- * Handle presence update from server. The wire frame's payload is
742
- * forwarded as-is so every consumer (web entity cache,
743
- * PresenceStream, agent runtime) reads from the same shape.
744
- * Stripping fields here was a prior bug — it silently dropped
745
- * `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.
746
671
  *
747
- * Wire frame (apps/sync-server/src/hub/types.ts PresenceUpdateMessage):
672
+ * The wire frame is:
748
673
  * { type: 'presence_update', payload: { kind, userId, status,
749
674
  * syncGroups, activity, isAgent, timestamp, activeClaims } }
750
675
  */