@abloatai/ablo 0.35.0 → 0.37.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 (622) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +71 -1929
  3. package/NOTICE +2 -2
  4. package/README.md +23 -532
  5. package/assets/banner.png +0 -0
  6. package/dist/auth.d.ts +2 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +2 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/client.d.ts +3 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +3 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/coordination.d.ts +2 -0
  15. package/dist/coordination.d.ts.map +1 -0
  16. package/dist/coordination.js +2 -0
  17. package/dist/coordination.js.map +1 -0
  18. package/dist/index.d.ts +3 -112
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -161
  21. package/dist/index.js.map +1 -0
  22. package/dist/react.d.ts +4 -0
  23. package/dist/react.d.ts.map +1 -0
  24. package/dist/react.js +3 -0
  25. package/dist/react.js.map +1 -0
  26. package/dist/schema.d.ts +2 -0
  27. package/dist/schema.d.ts.map +1 -0
  28. package/dist/schema.js +2 -0
  29. package/dist/schema.js.map +1 -0
  30. package/dist/server.d.ts +2 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +2 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/source-conformance.d.ts +2 -0
  35. package/dist/source-conformance.d.ts.map +1 -0
  36. package/dist/source-conformance.js +2 -0
  37. package/dist/source-conformance.js.map +1 -0
  38. package/dist/source-drizzle.d.ts +2 -0
  39. package/dist/source-drizzle.d.ts.map +1 -0
  40. package/dist/source-drizzle.js +2 -0
  41. package/dist/source-drizzle.js.map +1 -0
  42. package/dist/source-kysely.d.ts +2 -0
  43. package/dist/source-kysely.d.ts.map +1 -0
  44. package/dist/source-kysely.js +2 -0
  45. package/dist/source-kysely.js.map +1 -0
  46. package/dist/source-next.d.ts +2 -0
  47. package/dist/source-next.d.ts.map +1 -0
  48. package/dist/source-next.js +2 -0
  49. package/dist/source-next.js.map +1 -0
  50. package/dist/source.d.ts +2 -0
  51. package/dist/source.d.ts.map +1 -0
  52. package/dist/source.js +2 -0
  53. package/dist/source.js.map +1 -0
  54. package/dist/wire.d.ts +2 -0
  55. package/dist/wire.d.ts.map +1 -0
  56. package/dist/wire.js +2 -0
  57. package/dist/wire.js.map +1 -0
  58. package/docs/agents.md +2 -2
  59. package/docs/api-keys.md +13 -12
  60. package/docs/api.md +15 -53
  61. package/docs/audit.md +4 -3
  62. package/docs/cli.md +11 -11
  63. package/docs/client-behavior.md +9 -9
  64. package/docs/concurrency-convention.md +28 -42
  65. package/docs/coordination.md +228 -86
  66. package/docs/data-sources.md +5 -5
  67. package/docs/debugging.md +34 -12
  68. package/docs/deployment.md +8 -8
  69. package/docs/examples/agent-human.md +4 -4
  70. package/docs/examples/ai-sdk-tool.md +1 -1
  71. package/docs/examples/existing-python-backend.md +15 -4
  72. package/docs/examples/nextjs.md +27 -6
  73. package/docs/examples/scoped-agent.md +3 -3
  74. package/docs/examples/server-agent.md +2 -2
  75. package/docs/groups.md +57 -3
  76. package/docs/guarantees.md +37 -10
  77. package/docs/how-it-works.md +32 -8
  78. package/docs/idempotency.md +6 -6
  79. package/docs/identity.md +24 -24
  80. package/docs/index.md +8 -8
  81. package/docs/integration-guide.md +38 -16
  82. package/docs/internal/README.md +18 -0
  83. package/docs/internal/agent-fleet-coordination-design.md +171 -0
  84. package/docs/internal/agent-orchestration.md +58 -0
  85. package/docs/internal/commit-identifiers.md +91 -0
  86. package/docs/internal/concurrency-open-decisions.md +37 -0
  87. package/docs/internal/data-source-reverse-channel.md +150 -0
  88. package/docs/internal/per-field-conflict-detection.md +165 -0
  89. package/docs/internal/postgres-replication.md +64 -0
  90. package/docs/internal/serializable-schema.md +119 -0
  91. package/docs/internal/structure.md +32 -0
  92. package/docs/mcp.md +9 -9
  93. package/docs/migration.md +37 -18
  94. package/docs/projects.md +1 -1
  95. package/docs/quickstart.md +2 -2
  96. package/docs/react.md +24 -13
  97. package/docs/schema-contract.md +3 -3
  98. package/docs/sessions.md +91 -37
  99. package/docs/webhooks.md +9 -9
  100. package/examples/README.md +2 -2
  101. package/examples/data-source/README.md +1 -1
  102. package/examples/data-source/ablo-driver.ts +1 -1
  103. package/examples/data-source/customer-server.ts +1 -1
  104. package/examples/data-source/run.ts +1 -1
  105. package/examples/data-source/schema.ts +1 -1
  106. package/examples/quickstart.ts +2 -2
  107. package/llms.txt +12 -12
  108. package/package.json +64 -174
  109. package/dist/BaseSyncedStore.d.ts +0 -823
  110. package/dist/BaseSyncedStore.js +0 -1955
  111. package/dist/Database.d.ts +0 -335
  112. package/dist/Database.js +0 -1500
  113. package/dist/InstanceCache.d.ts +0 -233
  114. package/dist/InstanceCache.js +0 -1164
  115. package/dist/LazyReferenceCollection.d.ts +0 -177
  116. package/dist/LazyReferenceCollection.js +0 -461
  117. package/dist/Model.d.ts +0 -444
  118. package/dist/Model.js +0 -909
  119. package/dist/ModelRegistry.d.ts +0 -221
  120. package/dist/ModelRegistry.js +0 -537
  121. package/dist/NetworkMonitor.d.ts +0 -26
  122. package/dist/NetworkMonitor.js +0 -77
  123. package/dist/RuntimeContext.d.ts +0 -52
  124. package/dist/RuntimeContext.js +0 -80
  125. package/dist/SyncClient.d.ts +0 -551
  126. package/dist/SyncClient.js +0 -2199
  127. package/dist/adapters/alwaysOnline.d.ts +0 -14
  128. package/dist/adapters/alwaysOnline.js +0 -17
  129. package/dist/adapters/inMemoryStorage.d.ts +0 -31
  130. package/dist/adapters/inMemoryStorage.js +0 -110
  131. package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
  132. package/dist/ai-sdk/coordinatedTool.js +0 -134
  133. package/dist/ai-sdk/coordinationContext.d.ts +0 -46
  134. package/dist/ai-sdk/coordinationContext.js +0 -106
  135. package/dist/ai-sdk/index.d.ts +0 -121
  136. package/dist/ai-sdk/index.js +0 -121
  137. package/dist/ai-sdk/wrap.d.ts +0 -65
  138. package/dist/ai-sdk/wrap.js +0 -39
  139. package/dist/auth/index.d.ts +0 -1
  140. package/dist/auth/index.js +0 -8
  141. package/dist/batching/index.d.ts +0 -55
  142. package/dist/batching/index.js +0 -147
  143. package/dist/cli.cjs +0 -288600
  144. package/dist/client/Ablo.d.ts +0 -231
  145. package/dist/client/Ablo.js +0 -149
  146. package/dist/client/abloClient.d.ts +0 -309
  147. package/dist/client/abloClient.js +0 -13
  148. package/dist/client/clientPrelude.d.ts +0 -52
  149. package/dist/client/clientPrelude.js +0 -60
  150. package/dist/client/consoleLogger.d.ts +0 -35
  151. package/dist/client/consoleLogger.js +0 -44
  152. package/dist/client/coreClient.d.ts +0 -60
  153. package/dist/client/coreClient.js +0 -118
  154. package/dist/client/createInternalComponents.d.ts +0 -46
  155. package/dist/client/createInternalComponents.js +0 -92
  156. package/dist/client/createModelProxy.d.ts +0 -228
  157. package/dist/client/createModelProxy.js +0 -818
  158. package/dist/client/humans.d.ts +0 -48
  159. package/dist/client/humans.js +0 -52
  160. package/dist/client/modelRegistration.d.ts +0 -10
  161. package/dist/client/modelRegistration.js +0 -312
  162. package/dist/client/options.d.ts +0 -461
  163. package/dist/client/options.js +0 -7
  164. package/dist/client/reactiveEngine.d.ts +0 -48
  165. package/dist/client/reactiveEngine.js +0 -910
  166. package/dist/client/resourceTypes.d.ts +0 -12
  167. package/dist/client/resourceTypes.js +0 -10
  168. package/dist/client/schemaConfig.d.ts +0 -44
  169. package/dist/client/schemaConfig.js +0 -185
  170. package/dist/client/validateAbloOptions.d.ts +0 -42
  171. package/dist/client/validateAbloOptions.js +0 -43
  172. package/dist/client/wsMutationExecutor.d.ts +0 -27
  173. package/dist/client/wsMutationExecutor.js +0 -72
  174. package/dist/context.d.ts +0 -29
  175. package/dist/context.js +0 -58
  176. package/dist/coordination/ClaimLog.d.ts +0 -26
  177. package/dist/coordination/ClaimLog.js +0 -32
  178. package/dist/coordination/index.d.ts +0 -1
  179. package/dist/coordination/index.js +0 -8
  180. package/dist/core/DatabaseManager.d.ts +0 -105
  181. package/dist/core/DatabaseManager.js +0 -387
  182. package/dist/core/QueryProcessor.d.ts +0 -75
  183. package/dist/core/QueryProcessor.js +0 -255
  184. package/dist/core/QueryView.d.ts +0 -79
  185. package/dist/core/QueryView.js +0 -218
  186. package/dist/core/StoreManager.d.ts +0 -112
  187. package/dist/core/StoreManager.js +0 -302
  188. package/dist/core/ViewRegistry.d.ts +0 -20
  189. package/dist/core/ViewRegistry.js +0 -55
  190. package/dist/core/index.d.ts +0 -33
  191. package/dist/core/index.js +0 -48
  192. package/dist/core/openIDBWithTimeout.d.ts +0 -65
  193. package/dist/core/openIDBWithTimeout.js +0 -153
  194. package/dist/core/queryUtils.d.ts +0 -45
  195. package/dist/core/queryUtils.js +0 -69
  196. package/dist/core/storeContract.d.ts +0 -145
  197. package/dist/core/storeContract.js +0 -12
  198. package/dist/docs/catalog.d.ts +0 -72
  199. package/dist/docs/catalog.js +0 -227
  200. package/dist/docs/index.d.ts +0 -10
  201. package/dist/docs/index.js +0 -10
  202. package/dist/environment.d.ts +0 -1
  203. package/dist/environment.js +0 -8
  204. package/dist/interfaces/index.d.ts +0 -311
  205. package/dist/interfaces/index.js +0 -9
  206. package/dist/keys/index.d.ts +0 -1
  207. package/dist/keys/index.js +0 -8
  208. package/dist/mutators/RecordingMutation.d.ts +0 -36
  209. package/dist/mutators/RecordingMutation.js +0 -182
  210. package/dist/mutators/Transaction.d.ts +0 -40
  211. package/dist/mutators/Transaction.js +0 -58
  212. package/dist/mutators/UndoManager.d.ts +0 -258
  213. package/dist/mutators/UndoManager.js +0 -658
  214. package/dist/mutators/defineMutators.d.ts +0 -60
  215. package/dist/mutators/defineMutators.js +0 -18
  216. package/dist/mutators/inverseOp.d.ts +0 -126
  217. package/dist/mutators/inverseOp.js +0 -71
  218. package/dist/mutators/mutateActions.d.ts +0 -45
  219. package/dist/mutators/mutateActions.js +0 -105
  220. package/dist/mutators/readerActions.d.ts +0 -33
  221. package/dist/mutators/readerActions.js +0 -57
  222. package/dist/mutators/undoApply.d.ts +0 -51
  223. package/dist/mutators/undoApply.js +0 -117
  224. package/dist/policy/index.d.ts +0 -21
  225. package/dist/policy/index.js +0 -20
  226. package/dist/query/client.d.ts +0 -61
  227. package/dist/query/client.js +0 -137
  228. package/dist/query/types.d.ts +0 -85
  229. package/dist/query/types.js +0 -16
  230. package/dist/react/AbloProvider.d.ts +0 -230
  231. package/dist/react/AbloProvider.js +0 -455
  232. package/dist/react/ClientSideSuspense.d.ts +0 -36
  233. package/dist/react/ClientSideSuspense.js +0 -17
  234. package/dist/react/DefaultFallback.d.ts +0 -24
  235. package/dist/react/DefaultFallback.js +0 -43
  236. package/dist/react/context.d.ts +0 -55
  237. package/dist/react/context.js +0 -29
  238. package/dist/react/index.d.ts +0 -61
  239. package/dist/react/index.js +0 -66
  240. package/dist/react/internalContext.d.ts +0 -33
  241. package/dist/react/internalContext.js +0 -3
  242. package/dist/react/useAblo.d.ts +0 -75
  243. package/dist/react/useAblo.js +0 -102
  244. package/dist/react/useCurrentUserId.d.ts +0 -22
  245. package/dist/react/useCurrentUserId.js +0 -34
  246. package/dist/react/useErrorListener.d.ts +0 -20
  247. package/dist/react/useErrorListener.js +0 -38
  248. package/dist/react/useMutationFailureListener.d.ts +0 -26
  249. package/dist/react/useMutationFailureListener.js +0 -38
  250. package/dist/react/useMutators.d.ts +0 -56
  251. package/dist/react/useMutators.js +0 -84
  252. package/dist/react/useReactive.d.ts +0 -35
  253. package/dist/react/useReactive.js +0 -123
  254. package/dist/react/useSyncStatus.d.ts +0 -59
  255. package/dist/react/useSyncStatus.js +0 -76
  256. package/dist/react/useUndoScope.d.ts +0 -34
  257. package/dist/react/useUndoScope.js +0 -81
  258. package/dist/schema/coordination.d.ts +0 -112
  259. package/dist/schema/coordination.js +0 -129
  260. package/dist/schema/ddl.d.ts +0 -97
  261. package/dist/schema/ddl.js +0 -491
  262. package/dist/schema/ddlLock.d.ts +0 -35
  263. package/dist/schema/ddlLock.js +0 -46
  264. package/dist/schema/diff.d.ts +0 -225
  265. package/dist/schema/diff.js +0 -289
  266. package/dist/schema/generate.d.ts +0 -19
  267. package/dist/schema/generate.js +0 -86
  268. package/dist/schema/index.d.ts +0 -41
  269. package/dist/schema/index.js +0 -76
  270. package/dist/schema/queries.d.ts +0 -201
  271. package/dist/schema/queries.js +0 -144
  272. package/dist/schema/select.d.ts +0 -40
  273. package/dist/schema/select.js +0 -87
  274. package/dist/schema/serialize.d.ts +0 -115
  275. package/dist/schema/serialize.js +0 -262
  276. package/dist/schema/sugar.d.ts +0 -109
  277. package/dist/schema/sugar.js +0 -83
  278. package/dist/schema/syncDeltaRow.d.ts +0 -6
  279. package/dist/schema/syncDeltaRow.js +0 -6
  280. package/dist/server/adapter.d.ts +0 -173
  281. package/dist/server/adapter.js +0 -18
  282. package/dist/server/commit.d.ts +0 -107
  283. package/dist/server/commit.js +0 -1
  284. package/dist/server/index.d.ts +0 -14
  285. package/dist/server/index.js +0 -2
  286. package/dist/server/readConfig.d.ts +0 -80
  287. package/dist/server/readConfig.js +0 -8
  288. package/dist/server/storageMode.d.ts +0 -23
  289. package/dist/server/storageMode.js +0 -17
  290. package/dist/source/adapter.d.ts +0 -81
  291. package/dist/source/adapter.js +0 -22
  292. package/dist/source/adapters/drizzle.d.ts +0 -48
  293. package/dist/source/adapters/drizzle.js +0 -219
  294. package/dist/source/adapters/kysely.d.ts +0 -42
  295. package/dist/source/adapters/kysely.js +0 -205
  296. package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
  297. package/dist/source/adapters/kyselyMutationCore.js +0 -125
  298. package/dist/source/adapters/memory.d.ts +0 -13
  299. package/dist/source/adapters/memory.js +0 -130
  300. package/dist/source/adapters/prisma.d.ts +0 -63
  301. package/dist/source/adapters/prisma.js +0 -202
  302. package/dist/source/conformance.d.ts +0 -37
  303. package/dist/source/conformance.js +0 -215
  304. package/dist/source/connector.d.ts +0 -95
  305. package/dist/source/connector.js +0 -266
  306. package/dist/source/connectorProtocol.d.ts +0 -154
  307. package/dist/source/connectorProtocol.js +0 -163
  308. package/dist/source/contract.d.ts +0 -195
  309. package/dist/source/contract.js +0 -164
  310. package/dist/source/factory.d.ts +0 -92
  311. package/dist/source/factory.js +0 -286
  312. package/dist/source/footprint.d.ts +0 -111
  313. package/dist/source/footprint.js +0 -0
  314. package/dist/source/idempotency.d.ts +0 -61
  315. package/dist/source/idempotency.js +0 -144
  316. package/dist/source/index.d.ts +0 -23
  317. package/dist/source/index.js +0 -30
  318. package/dist/source/migrations.d.ts +0 -21
  319. package/dist/source/migrations.js +0 -103
  320. package/dist/source/next.d.ts +0 -32
  321. package/dist/source/next.js +0 -25
  322. package/dist/source/pushQueue.d.ts +0 -134
  323. package/dist/source/pushQueue.js +0 -256
  324. package/dist/source/signing.d.ts +0 -92
  325. package/dist/source/signing.js +0 -162
  326. package/dist/source/types.d.ts +0 -401
  327. package/dist/source/types.js +0 -59
  328. package/dist/stores/ObjectStore.d.ts +0 -115
  329. package/dist/stores/ObjectStore.js +0 -393
  330. package/dist/stores/ObjectStoreContract.d.ts +0 -38
  331. package/dist/stores/ObjectStoreContract.js +0 -1
  332. package/dist/stores/SyncActionStore.d.ts +0 -97
  333. package/dist/stores/SyncActionStore.js +0 -504
  334. package/dist/stores/syncAction.d.ts +0 -26
  335. package/dist/stores/syncAction.js +0 -16
  336. package/dist/surface.d.ts +0 -36
  337. package/dist/surface.js +0 -75
  338. package/dist/sync/BootstrapFetcher.d.ts +0 -280
  339. package/dist/sync/BootstrapFetcher.js +0 -962
  340. package/dist/sync/ConnectionManager.d.ts +0 -8
  341. package/dist/sync/ConnectionManager.js +0 -8
  342. package/dist/sync/OnDemandLoader.d.ts +0 -228
  343. package/dist/sync/OnDemandLoader.js +0 -742
  344. package/dist/sync/SubscriptionManager.d.ts +0 -159
  345. package/dist/sync/SubscriptionManager.js +0 -243
  346. package/dist/sync/SyncWebSocket.d.ts +0 -173
  347. package/dist/sync/SyncWebSocket.js +0 -438
  348. package/dist/sync/awaitClaimGrant.d.ts +0 -6
  349. package/dist/sync/awaitClaimGrant.js +0 -6
  350. package/dist/sync/bootstrapApply.d.ts +0 -70
  351. package/dist/sync/bootstrapApply.js +0 -73
  352. package/dist/sync/commitFrames.d.ts +0 -8
  353. package/dist/sync/commitFrames.js +0 -8
  354. package/dist/sync/contextPorts.d.ts +0 -18
  355. package/dist/sync/contextPorts.js +0 -31
  356. package/dist/sync/createClaimStream.d.ts +0 -7
  357. package/dist/sync/createClaimStream.js +0 -7
  358. package/dist/sync/createPresenceStream.d.ts +0 -69
  359. package/dist/sync/createPresenceStream.js +0 -200
  360. package/dist/sync/createSnapshot.d.ts +0 -29
  361. package/dist/sync/createSnapshot.js +0 -118
  362. package/dist/sync/credentialLifecycle.d.ts +0 -7
  363. package/dist/sync/credentialLifecycle.js +0 -7
  364. package/dist/sync/deltaPipeline.d.ts +0 -113
  365. package/dist/sync/deltaPipeline.js +0 -261
  366. package/dist/sync/groupChange.d.ts +0 -113
  367. package/dist/sync/groupChange.js +0 -242
  368. package/dist/sync/participants.d.ts +0 -115
  369. package/dist/sync/participants.js +0 -344
  370. package/dist/sync/persistedPrefix.d.ts +0 -12
  371. package/dist/sync/persistedPrefix.js +0 -22
  372. package/dist/sync/schemaDrift.d.ts +0 -55
  373. package/dist/sync/schemaDrift.js +0 -53
  374. package/dist/sync/schemas.d.ts +0 -70
  375. package/dist/sync/schemas.js +0 -94
  376. package/dist/sync/syncCursor.d.ts +0 -40
  377. package/dist/sync/syncCursor.js +0 -55
  378. package/dist/sync/syncPlan.d.ts +0 -54
  379. package/dist/sync/syncPlan.js +0 -50
  380. package/dist/sync/wsFrameHandlers.d.ts +0 -8
  381. package/dist/sync/wsFrameHandlers.js +0 -8
  382. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  383. package/dist/testing/fixtures/bootstrap.js +0 -59
  384. package/dist/testing/fixtures/deltas.d.ts +0 -83
  385. package/dist/testing/fixtures/deltas.js +0 -136
  386. package/dist/testing/fixtures/httpResponses.d.ts +0 -70
  387. package/dist/testing/fixtures/httpResponses.js +0 -90
  388. package/dist/testing/fixtures/models.d.ts +0 -83
  389. package/dist/testing/fixtures/models.js +0 -272
  390. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  391. package/dist/testing/helpers/reactWrapper.js +0 -67
  392. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  393. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  394. package/dist/testing/helpers/wait.d.ts +0 -30
  395. package/dist/testing/helpers/wait.js +0 -49
  396. package/dist/testing/index.d.ts +0 -23
  397. package/dist/testing/index.js +0 -33
  398. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  399. package/dist/testing/mocks/FakeDatabase.js +0 -10
  400. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  401. package/dist/testing/mocks/MockMutationExecutor.js +0 -186
  402. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  403. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  404. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  405. package/dist/testing/mocks/MockSyncContext.js +0 -72
  406. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  407. package/dist/testing/mocks/MockSyncStore.js +0 -171
  408. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  409. package/dist/testing/mocks/MockWebSocket.js +0 -118
  410. package/dist/transaction/ablo.d.ts +0 -88
  411. package/dist/transaction/ablo.js +0 -33
  412. package/dist/transaction/auth/apiKey.d.ts +0 -152
  413. package/dist/transaction/auth/apiKey.js +0 -419
  414. package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
  415. package/dist/transaction/auth/bootstrapScope.js +0 -1
  416. package/dist/transaction/auth/capability.d.ts +0 -177
  417. package/dist/transaction/auth/capability.js +0 -199
  418. package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
  419. package/dist/transaction/auth/credentialEndpoint.js +0 -86
  420. package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
  421. package/dist/transaction/auth/credentialPolicy.js +0 -125
  422. package/dist/transaction/auth/credentialSource.d.ts +0 -30
  423. package/dist/transaction/auth/credentialSource.js +0 -55
  424. package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
  425. package/dist/transaction/auth/hostedEndpoints.js +0 -21
  426. package/dist/transaction/auth/identity.d.ts +0 -55
  427. package/dist/transaction/auth/identity.js +0 -210
  428. package/dist/transaction/auth/index.d.ts +0 -162
  429. package/dist/transaction/auth/index.js +0 -304
  430. package/dist/transaction/auth/schemas.d.ts +0 -59
  431. package/dist/transaction/auth/schemas.js +0 -85
  432. package/dist/transaction/auth/sessionMint.d.ts +0 -28
  433. package/dist/transaction/auth/sessionMint.js +0 -85
  434. package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
  435. package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
  436. package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
  437. package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
  438. package/dist/transaction/coordination/claimMeta.d.ts +0 -49
  439. package/dist/transaction/coordination/claimMeta.js +0 -52
  440. package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
  441. package/dist/transaction/coordination/createClaimStream.js +0 -475
  442. package/dist/transaction/coordination/events.d.ts +0 -74
  443. package/dist/transaction/coordination/events.js +0 -7
  444. package/dist/transaction/coordination/index.d.ts +0 -19
  445. package/dist/transaction/coordination/index.js +0 -44
  446. package/dist/transaction/coordination/locator.d.ts +0 -83
  447. package/dist/transaction/coordination/locator.js +0 -82
  448. package/dist/transaction/coordination/schema.d.ts +0 -1473
  449. package/dist/transaction/coordination/schema.js +0 -1013
  450. package/dist/transaction/coordination/targetConflict.d.ts +0 -2
  451. package/dist/transaction/coordination/targetConflict.js +0 -103
  452. package/dist/transaction/coordination/trace.d.ts +0 -78
  453. package/dist/transaction/coordination/trace.js +0 -138
  454. package/dist/transaction/durableWrites.d.ts +0 -62
  455. package/dist/transaction/durableWrites.js +0 -71
  456. package/dist/transaction/environment.d.ts +0 -105
  457. package/dist/transaction/environment.js +0 -108
  458. package/dist/transaction/errorCodes.d.ts +0 -403
  459. package/dist/transaction/errorCodes.js +0 -480
  460. package/dist/transaction/errors.d.ts +0 -428
  461. package/dist/transaction/errors.js +0 -686
  462. package/dist/transaction/index.d.ts +0 -20
  463. package/dist/transaction/index.js +0 -20
  464. package/dist/transaction/keys/index.d.ts +0 -87
  465. package/dist/transaction/keys/index.js +0 -207
  466. package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
  467. package/dist/transaction/log/syncDeltaRow.js +0 -95
  468. package/dist/transaction/logPosition.d.ts +0 -97
  469. package/dist/transaction/logPosition.js +0 -125
  470. package/dist/transaction/logger.d.ts +0 -16
  471. package/dist/transaction/logger.js +0 -7
  472. package/dist/transaction/observability.d.ts +0 -53
  473. package/dist/transaction/observability.js +0 -19
  474. package/dist/transaction/persistence.d.ts +0 -12
  475. package/dist/transaction/persistence.js +0 -11
  476. package/dist/transaction/plugin.d.ts +0 -192
  477. package/dist/transaction/plugin.js +0 -87
  478. package/dist/transaction/policy/types.d.ts +0 -217
  479. package/dist/transaction/policy/types.js +0 -126
  480. package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
  481. package/dist/transaction/resources/functionalUpdate.js +0 -87
  482. package/dist/transaction/resources/httpResources.d.ts +0 -266
  483. package/dist/transaction/resources/httpResources.js +0 -7
  484. package/dist/transaction/resources/modelOperations.d.ts +0 -319
  485. package/dist/transaction/resources/modelOperations.js +0 -12
  486. package/dist/transaction/resources/mutationOptions.d.ts +0 -66
  487. package/dist/transaction/resources/mutationOptions.js +0 -9
  488. package/dist/transaction/resources/where.d.ts +0 -85
  489. package/dist/transaction/resources/where.js +0 -70
  490. package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
  491. package/dist/transaction/resources/writeOptionsSchema.js +0 -73
  492. package/dist/transaction/schema/field.d.ts +0 -126
  493. package/dist/transaction/schema/field.js +0 -265
  494. package/dist/transaction/schema/loadStrategy.d.ts +0 -45
  495. package/dist/transaction/schema/loadStrategy.js +0 -46
  496. package/dist/transaction/schema/model.d.ts +0 -379
  497. package/dist/transaction/schema/model.js +0 -123
  498. package/dist/transaction/schema/openapi.d.ts +0 -57
  499. package/dist/transaction/schema/openapi.js +0 -340
  500. package/dist/transaction/schema/relation.d.ts +0 -199
  501. package/dist/transaction/schema/relation.js +0 -104
  502. package/dist/transaction/schema/residency.d.ts +0 -29
  503. package/dist/transaction/schema/residency.js +0 -25
  504. package/dist/transaction/schema/roles.d.ts +0 -249
  505. package/dist/transaction/schema/roles.js +0 -230
  506. package/dist/transaction/schema/schema.d.ts +0 -324
  507. package/dist/transaction/schema/schema.js +0 -305
  508. package/dist/transaction/schema/tenancy.d.ts +0 -139
  509. package/dist/transaction/schema/tenancy.js +0 -190
  510. package/dist/transaction/transactionLayer.d.ts +0 -82
  511. package/dist/transaction/transactionLayer.js +0 -24
  512. package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
  513. package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
  514. package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
  515. package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
  516. package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
  517. package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
  518. package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
  519. package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
  520. package/dist/transaction/transport/commitFrames.d.ts +0 -90
  521. package/dist/transaction/transport/commitFrames.js +0 -134
  522. package/dist/transaction/transport/connectionManager.d.ts +0 -215
  523. package/dist/transaction/transport/connectionManager.js +0 -673
  524. package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
  525. package/dist/transaction/transport/credentialLifecycle.js +0 -324
  526. package/dist/transaction/transport/heartbeat.d.ts +0 -65
  527. package/dist/transaction/transport/heartbeat.js +0 -93
  528. package/dist/transaction/transport/httpClient.d.ts +0 -123
  529. package/dist/transaction/transport/httpClient.js +0 -145
  530. package/dist/transaction/transport/httpOptions.d.ts +0 -33
  531. package/dist/transaction/transport/httpOptions.js +0 -12
  532. package/dist/transaction/transport/httpTransport.d.ts +0 -8
  533. package/dist/transaction/transport/httpTransport.js +0 -1276
  534. package/dist/transaction/transport/networkProbe.d.ts +0 -84
  535. package/dist/transaction/transport/networkProbe.js +0 -207
  536. package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
  537. package/dist/transaction/transport/wsFrameHandlers.js +0 -429
  538. package/dist/transaction/transport/wsTransport.d.ts +0 -576
  539. package/dist/transaction/transport/wsTransport.js +0 -1017
  540. package/dist/transaction/types/assertExact.d.ts +0 -17
  541. package/dist/transaction/types/assertExact.js +0 -1
  542. package/dist/transaction/types/global.d.ts +0 -107
  543. package/dist/transaction/types/global.js +0 -40
  544. package/dist/transaction/types/index.d.ts +0 -205
  545. package/dist/transaction/types/index.js +0 -56
  546. package/dist/transaction/types/modelData.d.ts +0 -10
  547. package/dist/transaction/types/modelData.js +0 -9
  548. package/dist/transaction/types/participant.d.ts +0 -20
  549. package/dist/transaction/types/participant.js +0 -10
  550. package/dist/transaction/types/streams.d.ts +0 -540
  551. package/dist/transaction/types/streams.js +0 -11
  552. package/dist/transaction/utils/asyncIterator.d.ts +0 -34
  553. package/dist/transaction/utils/asyncIterator.js +0 -135
  554. package/dist/transaction/utils/duration.d.ts +0 -25
  555. package/dist/transaction/utils/duration.js +0 -45
  556. package/dist/transaction/utils/json.d.ts +0 -57
  557. package/dist/transaction/utils/json.js +0 -276
  558. package/dist/transaction/wire/accountResponses.d.ts +0 -351
  559. package/dist/transaction/wire/accountResponses.js +0 -255
  560. package/dist/transaction/wire/auth.d.ts +0 -49
  561. package/dist/transaction/wire/auth.js +0 -57
  562. package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
  563. package/dist/transaction/wire/bootstrapReason.js +0 -8
  564. package/dist/transaction/wire/claimEvent.d.ts +0 -76
  565. package/dist/transaction/wire/claimEvent.js +0 -73
  566. package/dist/transaction/wire/claims.d.ts +0 -463
  567. package/dist/transaction/wire/claims.js +0 -229
  568. package/dist/transaction/wire/commit.d.ts +0 -603
  569. package/dist/transaction/wire/commit.js +0 -321
  570. package/dist/transaction/wire/delta.d.ts +0 -250
  571. package/dist/transaction/wire/delta.js +0 -147
  572. package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
  573. package/dist/transaction/wire/errorEnvelope.js +0 -123
  574. package/dist/transaction/wire/feedCursor.d.ts +0 -60
  575. package/dist/transaction/wire/feedCursor.js +0 -82
  576. package/dist/transaction/wire/feedEvent.d.ts +0 -177
  577. package/dist/transaction/wire/feedEvent.js +0 -39
  578. package/dist/transaction/wire/frames.d.ts +0 -194
  579. package/dist/transaction/wire/frames.js +0 -50
  580. package/dist/transaction/wire/inboundFrames.d.ts +0 -552
  581. package/dist/transaction/wire/inboundFrames.js +0 -116
  582. package/dist/transaction/wire/index.d.ts +0 -50
  583. package/dist/transaction/wire/index.js +0 -74
  584. package/dist/transaction/wire/listEnvelope.d.ts +0 -37
  585. package/dist/transaction/wire/listEnvelope.js +0 -42
  586. package/dist/transaction/wire/modelResponses.d.ts +0 -85
  587. package/dist/transaction/wire/modelResponses.js +0 -43
  588. package/dist/transaction/wire/protocol.d.ts +0 -38
  589. package/dist/transaction/wire/protocol.js +0 -38
  590. package/dist/transaction/wire/protocolVersion.d.ts +0 -73
  591. package/dist/transaction/wire/protocolVersion.js +0 -83
  592. package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
  593. package/dist/transactions/mutations/MutationQueue.js +0 -2797
  594. package/dist/transactions/mutations/MutationStore.d.ts +0 -20
  595. package/dist/transactions/mutations/MutationStore.js +0 -53
  596. package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
  597. package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
  598. package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
  599. package/dist/transactions/mutations/coalesceRules.js +0 -140
  600. package/dist/transactions/mutations/commitLatency.d.ts +0 -52
  601. package/dist/transactions/mutations/commitLatency.js +0 -130
  602. package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
  603. package/dist/transactions/mutations/commitOutboxStore.js +0 -26
  604. package/dist/transactions/mutations/commitPayload.d.ts +0 -164
  605. package/dist/transactions/mutations/commitPayload.js +0 -152
  606. package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
  607. package/dist/transactions/mutations/deltaConfirmation.js +0 -233
  608. package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
  609. package/dist/transactions/mutations/durableWriteStore.js +0 -12
  610. package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
  611. package/dist/transactions/mutations/optimisticApply.js +0 -65
  612. package/dist/transactions/mutations/replayValidation.d.ts +0 -186
  613. package/dist/transactions/mutations/replayValidation.js +0 -163
  614. package/dist/utils/mobxSetup.d.ts +0 -53
  615. package/dist/utils/mobxSetup.js +0 -330
  616. package/dist/webhooks/events.d.ts +0 -43
  617. package/dist/webhooks/events.js +0 -42
  618. package/dist/webhooks/index.d.ts +0 -8
  619. package/dist/webhooks/index.js +0 -8
  620. package/dist/wire/index.d.ts +0 -1
  621. package/dist/wire/index.js +0 -8
  622. package/docs/interaction-model.md +0 -99
@@ -1,823 +0,0 @@
1
- /**
2
- * The base class that application-specific sync stores extend. It supplies the
3
- * shared orchestration for reads, writes, delta processing, and bootstrap, and
4
- * exports the core types those stores build on.
5
- *
6
- * A subclass adds its own domain behavior — lazy-loaded relations,
7
- * collaboration events, and model enrichment — by overriding the protected
8
- * extension points defined here. The heavy lifting is delegated to injected
9
- * collaborators: {@link SyncClient} owns pool writes and the transaction
10
- * queue, {@link Database} owns local persistence, {@link InstanceCache} holds the
11
- * in-memory models, and {@link ModelRegistry} holds their metadata.
12
- */
13
- import type { RecoveryClass } from './transaction/errorCodes.js';
14
- import { ConnectionManager } from './sync/ConnectionManager.js';
15
- import { SubscriptionManager } from './sync/SubscriptionManager.js';
16
- import { type ParticipantScope } from './sync/participants.js';
17
- import type { SyncClient } from './SyncClient.js';
18
- import type { Database, BootstrapResult } from './Database.js';
19
- import type { InstanceCache } from './InstanceCache.js';
20
- import { ModelRegistry } from './ModelRegistry.js';
21
- import { SyncWebSocket, type SyncDelta, type SyncGroupChangePayload, type GroupAddedPayload, type GroupRemovedPayload, type BootstrapHint, type BootstrapDataEvent, type PresenceUpdate, type EventMap, type DefaultCollaborationEvents, type SyncWebSocketEventMap } from './sync/SyncWebSocket.js';
22
- import { QueryProcessor } from './core/QueryProcessor.js';
23
- import { Model } from './Model.js';
24
- import { ModelScope } from './InstanceCache.js';
25
- import type { Schema } from './transaction/schema/schema.js';
26
- import type { SyncStatus, LocalMutation } from './core/storeContract.js';
27
- import type { AuthCredentialSource } from './transaction/auth/credentialSource.js';
28
- import type { ModelData } from './transaction/types/modelData.js';
29
- import type { EnrichmentPlanEntry, ForeignKeyIndexSpec } from './sync/syncPlan.js';
30
- import { type CredentialRefresher } from './sync/credentialLifecycle.js';
31
- import type { RehydrationStats } from './sync/bootstrapApply.js';
32
- import type { ParticipantKind } from './transaction/types/participant.js';
33
- /** Constructor type for Model subclasses (accepts abstract classes) */
34
- export type ModelConstructor<T extends Model> = abstract new (...args: never[]) => T;
35
- /** Concrete constructor type for instantiation */
36
- export type ConcreteModelConstructor<T extends Model> = new (data?: any) => T;
37
- export type { ModelData } from './transaction/types/modelData.js';
38
- /** Query result interface */
39
- export interface QueryResult<T extends Model> {
40
- data: T[];
41
- total: number;
42
- hasMore: boolean;
43
- fromCache?: boolean;
44
- }
45
- export type { ForeignKeyIndexSpec, EnrichmentPlanEntry } from './sync/syncPlan.js';
46
- /** Configuration for SyncedStore behavior */
47
- export interface SyncedStoreConfig {
48
- enableOffline?: boolean;
49
- enableCache?: boolean;
50
- enableTelemetry?: boolean;
51
- /**
52
- * Wire message types to surface as collaboration events, e.g.
53
- * `['document:selection', 'document:cursor']`.
54
- *
55
- * The vocabulary belongs to the application, not the SDK — these name the
56
- * application's own concepts, and a schema with no documents should never see
57
- * them. Defaults to none, so an application opts in by naming the events it
58
- * actually broadcasts.
59
- */
60
- collaborationEvents?: readonly string[];
61
- /**
62
- * Declarative enrichment plan consumed by `enrichRelations`. Replaces
63
- * the subclass override of `enrichRelations` for per-model parent
64
- * attachment. Merged with schema-derived entries (relations marked
65
- * `{ enrich: true }` on `belongsTo`).
66
- */
67
- enrichmentPlan?: readonly EnrichmentPlanEntry[];
68
- /**
69
- * Foreign-key indexes to register on the InstanceCache at construction
70
- * time. Replaces the subclass override of `registerForeignKeys` for
71
- * per-model FK registration. Merged with schema-derived entries
72
- * (relations marked `{ index: true }` on `belongsTo`). Both sets
73
- * are registered before the legacy `registerForeignKeys()` hook
74
- * fires, so subclasses can still add more on top.
75
- */
76
- foreignKeyIndexes?: readonly ForeignKeyIndexSpec[];
77
- }
78
- export type { SyncStatus } from './core/storeContract.js';
79
- /** User context for initialization */
80
- export interface UserContext {
81
- userId: string;
82
- organizationId: string;
83
- role?: string;
84
- teamIds?: string[];
85
- /** Participant kind on the wire. Default 'user' for browser
86
- * sessions; 'agent' for headless bots / worker processes. The
87
- * store routes this to SyncWebSocket so the WS URL carries
88
- * `kind=agent` and the server applies capability-token auth. */
89
- kind?: ParticipantKind;
90
- /** Restricted (`rk_`) API key for `kind: 'agent'` — the agent's
91
- * bearer credential. Sent in the `ablo.bearer.<token>` WebSocket
92
- * subprotocol, never in the URL. */
93
- capabilityToken?: string;
94
- /** Server-authoritative sync groups, supplied by auth/capability
95
- * exchange. The SDK does not invent org/user/default groups; app
96
- * structure comes from schema-declared scopes and server-issued
97
- * authorization. */
98
- syncGroups?: readonly string[];
99
- /**
100
- * How aggressively this participant should pull baseline state at
101
- * startup.
102
- *
103
- * - `'full'` (default): pull every delta in scope before `ready()`
104
- * resolves. The standard browser/user replica behavior.
105
- * - `'none'`: open the WebSocket and process live deltas only.
106
- * Reads go through `model.retrieve()` / filtered subscriptions
107
- * backfilled by `Covering` deltas. Suitable for transactional
108
- * participants — agent-worker, video-pipeline, routine runners —
109
- * that don't need a local replica of the org's tenant plane.
110
- */
111
- bootstrapMode?: 'full' | 'none';
112
- }
113
- /** Smart sync options */
114
- export interface SmartSyncOptions {
115
- maxDeltasBeforeBootstrap?: number;
116
- maxBootstrapSize?: number;
117
- batchingDelay?: number;
118
- maxBatchSize?: number;
119
- }
120
- export type { RehydrationStats } from './sync/bootstrapApply.js';
121
- /**
122
- * Bootstrap retry configuration.
123
- *
124
- * There is deliberately no overall timeout here. How long one attempt may run
125
- * is not a policy this layer gets to invent — it is a property of the fetcher's
126
- * watchdogs, read from `BootstrapFetcher.budgetMs`. A second number kept here
127
- * would only be able to disagree with them, which is exactly what it used to do.
128
- */
129
- export declare const BOOTSTRAP_CONFIG: {
130
- readonly MAX_RETRY_ATTEMPTS: 3;
131
- readonly RETRY_DELAY_MS: 500;
132
- };
133
- export { ModelScope };
134
- export type { SyncDelta, SyncGroupChangePayload, GroupAddedPayload, GroupRemovedPayload, BootstrapHint, BootstrapDataEvent, PresenceUpdate, };
135
- export { deriveSyncPlanFromSchema } from './sync/syncPlan.js';
136
- /**
137
- * The abstract base class that application-specific sync stores extend. It
138
- * carries the injected collaborators, the observable sync status, and the
139
- * orchestration for initialization, delta processing, bootstrap, and the
140
- * read and write API. A subclass supplies its own domain behavior by
141
- * overriding the protected extension points defined here and by typing its
142
- * collaboration events through the generic parameter.
143
- *
144
- * A subclass must call `super(dependencies, config)` and then set up its own
145
- * MobX observables.
146
- *
147
- * Generic over `TCollaboration` — an app-defined event map for real-time
148
- * collaboration events (cursors, selections, presence beyond the core set).
149
- * Subclasses pass their own event map to get typed `subscribe()` calls on
150
- * the underlying SyncWebSocket without casts:
151
- *
152
- * @example
153
- * interface EditorEvents {
154
- * 'document:selection': [SelectionEvent];
155
- * 'document:cursor': [CursorEvent];
156
- * }
157
- * class EditorStore extends BaseSyncedStore<EditorEvents> {
158
- * subscribeToCursor(handler: (e: CursorEvent) => void) {
159
- * return this.syncWebSocket.subscribe('document:cursor', handler);
160
- * }
161
- * }
162
- */
163
- export declare class BaseSyncedStore<TCollaboration extends EventMap<TCollaboration> = DefaultCollaborationEvents, TSchema extends Schema = Schema> {
164
- syncStatus: SyncStatus;
165
- protected readonly syncClient: SyncClient;
166
- protected readonly database: Database;
167
- protected readonly objectPool: InstanceCache;
168
- protected readonly modelRegistry: ModelRegistry;
169
- protected readonly auth?: AuthCredentialSource;
170
- /**
171
- * Schema the store was constructed with. Used by the schema-typed
172
- * `create(key, data)` factory and model self-healing.
173
- */
174
- protected readonly schema?: TSchema;
175
- /**
176
- * The connection, owned by whoever built this store (ADR 0016 follow-up
177
- * 3b): the host constructs it and hands it in, the store seeds its late
178
- * values during `initialize()` and owns the lifecycle from there. One
179
- * instance for the store's whole lifetime — reconnects replace the socket
180
- * inside it, never the object.
181
- */
182
- protected readonly syncWebSocket: SyncWebSocket<TCollaboration>;
183
- /**
184
- * Dynamic read interest (area-of-interest) over the connection's sync
185
- * groups. Constructed with the connection; the permanent base scopes are
186
- * seeded in `setupWebSocketSync` once identity resolves.
187
- */
188
- protected readonly areaOfInterest: SubscriptionManager;
189
- /** Sync groups whose current state has been backfilled into the pool
190
- * (hydrate-on-enter). Cleared when the pool is reset on (re)bootstrap. */
191
- private readonly hydratedGroups;
192
- /** In-flight scoped hydrations, keyed by group — single-flights concurrent
193
- * enters of the same scope so they share one fetch. */
194
- private readonly hydratingGroups;
195
- private _syncServerUrl?;
196
- /** Application-declared collaboration event types; empty unless configured. */
197
- private _collaborationEvents;
198
- /**
199
- * Public accessor for the underlying SyncWebSocket. Used by the
200
- * factory in `createSyncEngine` to wire the default mutation
201
- * executor — the executor needs the WS handle to send commit
202
- * frames, and the factory can't reach `protected` state through
203
- * normal typing.
204
- */
205
- getSyncWebSocket(): SyncWebSocket<TCollaboration>;
206
- /**
207
- * Subscribe to pushed frames — deltas, presence updates, claim grants and
208
- * losses, connection changes, and this store's collaboration events.
209
- * Durable by construction: the connection object exists for the store's
210
- * whole lifetime (reconnects replace only the socket inside it), so a
211
- * subscription made before the first connect starts delivering when the
212
- * socket opens and keeps delivering across every reconnect. Returns the
213
- * unsubscribe function.
214
- */
215
- subscribe<K extends keyof SyncWebSocketEventMap<TCollaboration>>(event: K, handler: (...args: SyncWebSocketEventMap<TCollaboration>[K]) => void): () => void;
216
- /**
217
- * Send a collaboration event (an app-specific real-time message from this
218
- * store's `TCollaboration` map). A no-op while the connection is down —
219
- * presence-grade traffic is not queued.
220
- */
221
- sendCollaborationEvent<K extends string & keyof TCollaboration>(messageType: K, payload: TCollaboration[K] extends [infer P] ? Omit<P & Record<string, unknown>, 'timestamp'> : never): void;
222
- private scopeToGroups;
223
- /**
224
- * Bring a scope into view and subscribe to its sync groups. With
225
- * `{ hydrate: true }`, also backfill the groups' current state into the pool
226
- * once the subscription is active. The order matters: subscribing first
227
- * guarantees no live delta is missed in the gap before the snapshot lands.
228
- * Hydration is best-effort — a failed backfill never rejects `enterScope`,
229
- * and the live delta stream keeps flowing regardless.
230
- */
231
- enterScope(scope: ParticipantScope, opts?: {
232
- hydrate?: boolean;
233
- }): Promise<void>;
234
- /**
235
- * Backfill the current state of `syncGroups` into the pool with a side-effect-free
236
- * scoped snapshot fetch followed by the version-guarded scoped apply. The call
237
- * is idempotent (it skips groups already hydrated) and single-flight (concurrent
238
- * enters of the same group share one fetch). On error the groups are left
239
- * unmarked, so a later re-enter retries.
240
- */
241
- protected hydrateGroups(syncGroups: readonly string[]): Promise<void>;
242
- /** Leave a scope → its groups go warm (hysteresis), then drop on sweep. */
243
- leaveScope(scope: ParticipantScope): Promise<void>;
244
- /** Pin a scope (active claim / prominence) → never warms while pinned. */
245
- pinScope(scope: ParticipantScope): Promise<void>;
246
- /** Release a pin → the group transitions to warm rather than dropping. */
247
- unpinScope(scope: ParticipantScope): Promise<void>;
248
- protected readonly queryProcessor: QueryProcessor;
249
- /**
250
- * Runtime behavior flags only — the schema/config arrays
251
- * (`enrichmentPlan`, `foreignKeyIndexes`) are consumed at construction
252
- * time and stored on the instance as `enrichmentPlan` and
253
- * pool-registered indexes. They don't need to persist on `this.config`.
254
- */
255
- protected readonly config: Required<Pick<SyncedStoreConfig, 'enableOffline' | 'enableCache' | 'enableTelemetry'>>;
256
- protected disposers: (() => void)[];
257
- protected initialized: boolean;
258
- protected dataReady: boolean;
259
- protected userContext: UserContext | null;
260
- /**
261
- * Declarative enrichment plan: "for model X, when a delta arrives,
262
- * read data[foreignKey] and attach the matching parent from the pool
263
- * as data[relationKey]." Merged from schema-derived + config at
264
- * construction time. Replaces the `enrichRelations` subclass override
265
- * pattern.
266
- */
267
- protected enrichmentPlan: readonly EnrichmentPlanEntry[];
268
- protected smartSyncOptions: Required<SmartSyncOptions>;
269
- protected pendingDeltas: SyncDelta[];
270
- protected batchTimer: ReturnType<typeof setTimeout> | null;
271
- protected syncPromise: Promise<void> | null;
272
- /** Resume/ack cursor — delegates to the shared LogPosition (see
273
- * logPosition.ts). Advances only after IDB persistence. */
274
- protected get lastAckedId(): number;
275
- /** Pool-applied cursor — delegates to the shared LogPosition. */
276
- protected get highestProcessedSyncId(): number;
277
- protected bootstrapDeltaQueue: SyncDelta[] | null;
278
- protected activeBootstrapCount: number;
279
- /** The live deadline for the bootstrap attempt in flight, if any. */
280
- private bootstrapDeadlineTimer;
281
- protected pendingDeletes: Set<string>;
282
- protected modelTypesHydrated: Set<string>;
283
- protected modelTypeHydrationInFlight: Map<string, Promise<void>>;
284
- constructor(dependencies: {
285
- syncClient: SyncClient;
286
- database: Database;
287
- objectPool: InstanceCache;
288
- modelRegistry: ModelRegistry;
289
- /**
290
- * The connection, built by the host. When omitted, the store constructs
291
- * its own from `url` and the collaboration-event config — the
292
- * self-contained path subclasses and tests use. Either way the store
293
- * owns the lifecycle from here: it seeds the late values (identity,
294
- * read scope, resume cursor) during `initialize()` and releases the
295
- * first connect.
296
- */
297
- syncWebSocket?: SyncWebSocket<TCollaboration>;
298
- /**
299
- * Optional schema. When provided, {@link deriveSyncPlanFromSchema} walks
300
- * the schema's models and relations to auto-populate foreign-key indexes
301
- * and the enrichment plan from their declarative annotations. Subclasses
302
- * that register model classes directly can instead pass explicit
303
- * `config.foreignKeyIndexes` / `config.enrichmentPlan`.
304
- */
305
- schema?: TSchema;
306
- /** Sync server URL for WebSocket connection. Converted to wss:// automatically. */
307
- url?: string;
308
- /** Shared bearer credential source for every auth-aware transport. */
309
- auth?: AuthCredentialSource;
310
- }, config?: SyncedStoreConfig);
311
- /**
312
- * Register foreign-key indexes for constant-time lookups.
313
- *
314
- * This is an override hook. The preferred way to declare a foreign-key
315
- * index is `config.foreignKeyIndexes` at construction time, or marking the
316
- * `belongsTo` relation with `{ index: true }` in the schema. The hook fires
317
- * after the schema-derived and config registrations, so a subclass can
318
- * layer additional indexes on top.
319
- */
320
- protected registerForeignKeys(): void;
321
- /**
322
- * Enrich delta data with related models from the InstanceCache.
323
- *
324
- * Base implementation walks `this.enrichmentPlan` — entries populated
325
- * from the schema's `{ enrich: true }` relations and from
326
- * `config.enrichmentPlan`. Subclasses can still override for bespoke
327
- * logic, calling `super.enrichRelations(modelName, data)` first to
328
- * apply the declarative plan before layering on custom work.
329
- *
330
- * Enrichment is best-effort: if the parent isn't yet in the pool
331
- * (e.g., a child delta arrives before its parent in a bootstrap
332
- * batch), the entry is silently skipped and the data passes through
333
- * untouched. The next delta for the same child will re-enrich.
334
- */
335
- protected enrichRelations(modelName: string, data: ModelData): ModelData;
336
- /** Check if a model name represents a custom/dynamic entity type. */
337
- protected isCustomEntity(modelName: string): boolean;
338
- /** Create a custom entity instance from delta data. Override for domain-specific custom entities. */
339
- protected createCustomEntity(_modelName: string, _modelId: string, _data: Record<string, unknown>): Model | null;
340
- /** Called before save for domain-specific validation/self-healing. */
341
- protected beforeSave(_model: Model): void;
342
- /** Connection lifecycle event callback — set by subclass to wire connection state machine. */
343
- protected onConnectionEvent?: (event: string) => void;
344
- /**
345
- * Internal connection FSM. Owns network probe + backoff + reconnect
346
- * orchestration for the default path. Constructed lazily once we
347
- * have a user context + a WebSocket (see `wireWebSocketEvents`);
348
- * driven by the `onConnectionEvent` hook AND browser online/offline
349
- * events it sets up itself.
350
- *
351
- * Every consumer gets production-grade offline-to-online recovery
352
- * out of the box. Subclasses that want their own lifecycle owner
353
- * can disable this by overriding `createConnectionManager()` to
354
- * return null.
355
- */
356
- protected connectionManager: import('./sync/ConnectionManager.js').ConnectionManager | null;
357
- /**
358
- * Access-credential re-mint + proactive pre-roll — extracted to
359
- * sync/credentialLifecycle.ts. Owns the refresher hook, the single-flight
360
- * guard, and the browser-only refresh timer / wake listener; talks back
361
- * through three lazily-resolved callbacks (the ConnectionManager doesn't
362
- * exist until `setupWebSocketSync`). The `setCredentialRefresher` /
363
- * `performCredentialRefresh` / `startCredentialLifecycle` methods below
364
- * are thin delegates so the store's public surface is unchanged.
365
- */
366
- private readonly credentialLifecycle;
367
- /**
368
- * Listeners registered via `subscribeSessionError()`. Fired when the
369
- * WebSocket closes with a session-invalid code (1008/4001/4003) or a
370
- * session-error event is received. Separate from `onConnectionEvent`
371
- * (which exists for the ConnectionStore FSM) so multiple consumers —
372
- * typically `<AbloProvider>` and a connection-lifecycle owner — can
373
- * both react without racing on the single-callback slot.
374
- */
375
- protected sessionErrorListeners: Set<(error: Error) => void>;
376
- /**
377
- * Subscribe to session-error events. The returned function removes
378
- * the listener. Safe to call multiple times from different consumers
379
- * (each gets its own slot in the listener set).
380
- */
381
- subscribeSessionError(listener: (error: Error) => void): () => void;
382
- /**
383
- * Subscribe to per-mutation failure payloads. Forwarded from the
384
- * underlying `SyncClient.mutationQueue` so consumers (toast layer,
385
- * route-level reverted boundaries, telemetry) can react without
386
- * reaching across the store. Returns an unsubscribe function.
387
- *
388
- * Why this lives on the base store rather than SyncClient: the React
389
- * `<AbloProvider>` binds against this surface, so adding it here
390
- * keeps the engine's internal wiring private while still giving the
391
- * SDK a single hook to expose. Mirrors `subscribeSessionError` —
392
- * same shape, same lifecycle.
393
- */
394
- subscribeMutationFailure(listener: (payload: {
395
- transaction: import('./transactions/mutations/MutationQueue.js').QueuedMutation;
396
- error: Error;
397
- permanent?: boolean;
398
- }) => void): () => void;
399
- /**
400
- * Subscribe to commit round-trip latency. Forwarded from the underlying
401
- * `SyncClient` for the same reason as `subscribeMutationFailure` — the
402
- * React provider binds against this surface, so the engine's wiring stays
403
- * private while the SDK keeps one hook to expose.
404
- */
405
- subscribeCommitLatency(listener: (sample: import('./transactions/mutations/commitLatency.js').CommitLatencySample) => void): () => void;
406
- /**
407
- * Wait for the in-flight transaction for (modelName, modelId) to be
408
- * confirmed by the server. See `SyncClient.waitForConfirmation` for the
409
- * lookup contract; resolves immediately if nothing is in flight.
410
- */
411
- waitForConfirmation(modelName: string, modelId: string): Promise<void>;
412
- /**
413
- * Observe the LOCAL mutation stream for undo recording (see
414
- * {@link import('./core/storeContract.js').LocalMutation}). Taps the
415
- * MutationQueue's `transaction:created` event — fired once per local
416
- * create/update/delete/archive with `previousData` already captured.
417
- * Remote/collaborator deltas apply via `applyDeltaBatchToPool` and never
418
- * emit here, so undo is naturally local-only (you can't undo a teammate).
419
- */
420
- subscribeLocalMutations(handler: (mutation: LocalMutation) => void): () => void;
421
- /**
422
- * Execute a bootstrap function with timeout protection and automatic retry.
423
- * Prevents the common issue where bootstrap hangs on startup.
424
- */
425
- protected executeBootstrapWithTimeout<T>(bootstrapFn: () => Promise<T>, _context: UserContext, signal?: AbortSignal): Promise<T>;
426
- /**
427
- * The outer deadline for one bootstrap attempt.
428
- *
429
- * The length is DERIVED from the fetcher's own watchdog budget, not chosen. A
430
- * chosen number is what broke this: the previous fixed 15s was shorter than a
431
- * single model chunk's allowance — 20s waiting for response headers plus 15s
432
- * of stall grace — so on any workspace with one slow model the deadline fired
433
- * before the watchdogs it was meant to backstop, and every attempt timed out
434
- * by construction. The watchdogs below are progress-based and already
435
- * guarantee termination; this deadline exists only for a hang somewhere other
436
- * than the network, so it must sit above them, and it can only do that
437
- * reliably by asking them how long they take.
438
- *
439
- * Reaching it aborts the work in flight. `Promise.race` merely stops waiting:
440
- * without the abort the losing bootstrap keeps running, keeps its sockets, and
441
- * races the retry that replaced it — which is how one page load turned into
442
- * dozens of overlapping requests.
443
- */
444
- protected createBootstrapTimeout(attempt: number): Promise<never>;
445
- /** Disarm the deadline once its attempt has settled. Load-bearing now that
446
- * firing it aborts real work: a leftover timer would cancel a later,
447
- * unrelated bootstrap. */
448
- private clearBootstrapDeadline;
449
- /** Reset bootstrap-related state for a clean retry */
450
- protected resetBootstrapState(): void;
451
- /** Perform reconnect: bootstrap + WS reconnect. Returns outcome for state machine. */
452
- performReconnect(): Promise<'success' | 'session_error' | 'network_error'>;
453
- /**
454
- * Register the access-credential re-mint hook. Called by the React provider
455
- * with a thunk that mints a fresh `ek_`/`rk_` (typically its `getToken`).
456
- * See {@link CredentialLifecycle.setRefresher}.
457
- */
458
- setCredentialRefresher(refresher: CredentialRefresher | null): void;
459
- /**
460
- * Re-mint the short-lived access credential and push it into the credential
461
- * source, reporting a tri-state outcome the {@link ConnectionManager} maps to
462
- * its FSM. Single-flight; no refresher wired ⇒ `'refreshed'` (a no-op
463
- * re-probe). Full contract on {@link CredentialLifecycle.refresh}.
464
- */
465
- performCredentialRefresh(): Promise<'refreshed' | 'session_error' | 'network_error'>;
466
- /**
467
- * The authentication-recovery path for HTTP transports, such as the lazy
468
- * query lane. It runs a single-flight credential re-mint driven by the
469
- * rejection's recovery class, routing outcomes through the same state
470
- * machine the WebSocket probe uses. `'retry'` means a fresh credential is
471
- * now in the credential source and the request should be replayed once.
472
- * Full contract on {@link CredentialLifecycle.recoverFromAuthRejection}.
473
- */
474
- recoverFromAuthRejection(recovery: RecoveryClass): Promise<'retry' | 'stop'>;
475
- /**
476
- * Nudge the connection FSM to re-probe with the current credential. Idempotent
477
- * and safe in any state (ignored while `connected`). Call after pushing a
478
- * freshly-minted token via `setAuthToken`, or on an OS-wake signal, so a
479
- * connection parked in `offline` / `backoff` / `auth_blocked` picks the new
480
- * credential up immediately instead of waiting for the 30s watchdog.
481
- */
482
- nudgeReconnect(): void;
483
- /**
484
- * Install the client-owned access-credential lifecycle: register `getToken`
485
- * as the reactive re-mint hook and arm the browser-only proactive refresh
486
- * (a refresh timer plus an OS-wake re-mint). Idempotent — a second call
487
- * replaces the first — and torn down on {@link disconnect}. Full rationale
488
- * on {@link CredentialLifecycle.start}.
489
- */
490
- startCredentialLifecycle(getToken: CredentialRefresher, opts?: {
491
- proactiveInNode?: boolean;
492
- }): void;
493
- /** Tear down the proactive credential lifecycle (idempotent). */
494
- private stopCredentialLifecycle;
495
- /** Narrow context the group-change leaf talks back through. */
496
- private groupChangeContext;
497
- /**
498
- * Handle an actionType 'G' delta — incremental `{ group, userId }` or
499
- * legacy `{ addedGroups, removedGroups }` payloads. Full pathway doc on
500
- * {@link groupChange.handleSyncGroupChange}.
501
- */
502
- protected handleSyncGroupChange(delta: SyncDelta): Promise<void>;
503
- /**
504
- * Handle an incremental GroupAdded delta — metadata only, no re-bootstrap
505
- * (covering deltas bring the entities). See {@link groupChange.handleGroupAdded}.
506
- */
507
- protected handleGroupAdded(payload: GroupAddedPayload, syncId: number): Promise<void>;
508
- /**
509
- * Handle an actionType 'S' (GroupRemoved) delta: for safety, clear the
510
- * revoked local state and trigger a full re-bootstrap. See
511
- * {@link groupChange.handleGroupRemoved}.
512
- */
513
- protected handleGroupRemoved(delta: SyncDelta): Promise<void>;
514
- /** Compute new sync groups after applying additions and removals */
515
- protected computeUpdatedSyncGroups(payload: SyncGroupChangePayload): string[];
516
- /** Force a full re-bootstrap via connection lifecycle event (no-op for
517
- * `bootstrapMode: 'none'` participants — see {@link groupChange.forceFullRebootstrap}). */
518
- protected forceFullRebootstrap(): void;
519
- /**
520
- * Single source of truth for the sync-group list this session is
521
- * subscribed to. Server-issued (`context.syncGroups`) is authoritative.
522
- * When absent, the SDK subscribes to no explicit groups. Both
523
- * `checkSyncGroupShrinkage` and `setupWebSocketSync` resolve through
524
- * here so the WS subscription and the security-critical shrinkage
525
- * check can never disagree.
526
- */
527
- protected resolveSyncGroups(context: UserContext): readonly string[];
528
- /** Check if sync groups shrank since last session — force full bootstrap if so */
529
- protected checkSyncGroupShrinkage(): Promise<void>;
530
- /** Narrow context the bootstrap-apply leaf talks back through. */
531
- private poolContext;
532
- /** Apply bootstrap data to the {@link InstanceCache}, removing entities that are no longer present (ghost removal). Pool writes are delegated to {@link SyncClient}. */
533
- protected applyBootstrapToPool(bootstrapResult: BootstrapResult, protectedIds?: ReadonlySet<string>): RehydrationStats;
534
- /**
535
- * Initialize the sync engine with user context.
536
- * Offline-first: hydrate from IDB → show UI → bootstrap from server in background.
537
- */
538
- initialize(context: UserContext, signal?: AbortSignal): Generator<Promise<unknown>, {
539
- success: boolean;
540
- error?: Error;
541
- }, unknown>;
542
- /** Background bootstrap — non-blocking, user sees cached data while this runs */
543
- protected performBackgroundBootstrap(requirements: Awaited<ReturnType<typeof this.database.requiredBootstrap>>, context: UserContext, signal?: AbortSignal): Promise<void>;
544
- /** Run bootstrap with delta queuing to prevent race conditions */
545
- protected withDeltaQueuing<T>(fn: () => Promise<T>): Promise<T>;
546
- /** Collect IDs that must survive ghost removal (added by deltas during bootstrap) */
547
- protected collectDeltaProtectedIds(preBootstrapIds: ReadonlySet<string>): Set<string>;
548
- /** Replay deltas queued during bootstrap (atomically, via `applyDeltaFrame`). */
549
- protected replayQueuedDeltas(): void;
550
- /**
551
- * Factory for the internal `ConnectionManager`. Override to return
552
- * `null` in subclasses that own their own connection lifecycle
553
- * (tests, headless runners, custom FSM wrappers). Default builds a
554
- * manager scoped to `_syncServerUrl` with production backoff.
555
- *
556
- * **Agent participants get `null`.** The FSM is wired around browser
557
- * events (`visibilitychange`, `online`/`offline`, watchdog) which are
558
- * meaningful for human-facing tabs and meaningless for headless agent
559
- * processes. On agent hosts the FSM has no event source to drive
560
- * recovery — and worse, its `offline` entry action calls
561
- * `syncWebSocket.disconnect()` which sets `isManualClose=true` and
562
- * cancels the reconnect that `SyncWebSocket.onclose` had just
563
- * scheduled. The two recovery systems fight and the browser-only one
564
- * wins by destroying the Node-compatible one's work. Returning `null`
565
- * for agents leaves `SyncWebSocket`'s exponential-backoff
566
- * `scheduleReconnect()` as the sole recovery path — which is correct
567
- * for server-side agents whether they run on Node, Bun, Deno, or
568
- * inside a Docker container with no `window`.
569
- *
570
- * Why gate on `kind` and not `typeof window`: env detection by global
571
- * existence is fragile (SSR polyfills, jsdom, sandboxed hosts). The
572
- * participant kind is the actual semantic axis — "is this a human-
573
- * driven session" vs "is this a server agent". The latter never has
574
- * a tab to lose focus or a network adapter to wake up.
575
- */
576
- protected createConnectionManager(kind?: ParticipantKind): ConnectionManager | null;
577
- /**
578
- * Disconnect and clean up all resources. Terminal: this means "the client
579
- * is finished", not "close and reopen later" — the connection object stays
580
- * assigned but closed, the event wiring is torn down, and nothing
581
- * re-initializes a disconnected store. (Mid-session closes during recovery
582
- * go through the connection FSM's `onDisconnectWebSocket`, which closes
583
- * the transport without touching the store.)
584
- */
585
- disconnect(): Promise<void>;
586
- /**
587
- * Destroy every IndexedDB database owned by the sync engine.
588
- *
589
- * First disconnects (releases WebSocket + timers + in-memory caches),
590
- * then walks `indexedDB.databases()` and deletes any database whose
591
- * name starts with `ablo_` or `ablo-`. This covers:
592
- * - `ablo_<hash>` workspace data DBs
593
- * - `ablo_databases` meta registry
594
- * - `ablo-sync` offline mutation queue
595
- *
596
- * Use case: session expiry (previous-user data must not persist on
597
- * disk before the next sign-in races into a corrupted state) or
598
- * explicit user-initiated logout.
599
- *
600
- * Best-effort: swallows individual delete errors. Some browsers do
601
- * not support `indexedDB.databases()` — the method returns without
602
- * deleting in that case, same behavior as the pre-SDK app code.
603
- */
604
- purge(): Promise<void>;
605
- /**
606
- * Create WebSocket connection and wire all event handlers.
607
- * Handles: deltas, batches, presence, bootstrap_required, errors, reconnection.
608
- */
609
- /**
610
- * Block until the WebSocket reports a `connected` event, or until
611
- * `timeoutMs` elapses (returns false on timeout, true on connect).
612
- * Used by `initialize()` for `bootstrapMode: 'none'` consumers to
613
- * honor `ready()`'s "WS is connected when this resolves" contract
614
- * — `setupWebSocketSync` is fire-and-forget on the upgrade, and
615
- * without an explicit wait the next mutation can race the open.
616
- *
617
- * Resolves immediately if the WS is already connected (e.g., warm
618
- * reconnect after redeploy). Resolves false on timeout rather than
619
- * throwing so initialize() can complete and let the caller's first
620
- * mutation attempt surface a clearer error.
621
- */
622
- protected waitForWebSocketConnected(timeoutMs: number): Promise<boolean>;
623
- /**
624
- * Seed the connection's late values and open it. The socket itself exists
625
- * from construction; what identity resolution supplies — the participant
626
- * kind, the credential, the read scope, and the resume cursor — is seeded
627
- * here, and only then is the held first connect released. A retried
628
- * `initialize()` after a failed `ready()` re-runs this against the same
629
- * connection object: the reconnect counter is reset for a clean slate,
630
- * while the session-error latch deliberately survives (only the
631
- * credential-expiry recovery clears it).
632
- */
633
- protected setupWebSocketSync(context: UserContext, lastSyncId: number): void;
634
- /**
635
- * Wire the store's handlers onto the connection. Runs once, at
636
- * construction — the connection object is stable for the store's
637
- * lifetime, so the wiring is too.
638
- */
639
- protected wireSocketEvents(): void;
640
- /**
641
- * Build and start the connection FSM. The `onConnectionEvent` hook is the
642
- * bridge — WS events fire the hook, the hook forwards into the FSM. Called
643
- * from `setupWebSocketSync` because the FSM's shape depends on the resolved
644
- * participant kind (agents get none — see {@link createConnectionManager}).
645
- */
646
- private startConnectionManager;
647
- /** Memoized pipeline context — `enqueueDelta` runs once per delta, so the
648
- * accessor object is built once and reused (the get/set accessors always
649
- * read the live host fields). */
650
- private _deltaPipelineContext;
651
- private get deltaPipelineContext();
652
- /** Get fields that represent meaningful state for deduplication. Override for model-specific fields. */
653
- protected getStateFields(_modelName: string): string[];
654
- /** Deduplicate deltas to the same entity — keep meaningful state transitions only */
655
- protected deduplicateDeltas(deltas: SyncDelta[]): SyncDelta[];
656
- /** Process incoming delta with smart batching */
657
- protected processDeltaWithBatching(delta: SyncDelta): void;
658
- /**
659
- * Apply a complete, server-delivered delta frame atomically.
660
- *
661
- * A `delta_batch` WebSocket event (a reconnect or catch-up replay) already
662
- * carries the full set of missed deltas. Routing it through the per-delta
663
- * `processDeltaWithBatching` path would re-chunk it via the live-traffic
664
- * debounce timer and `maxBatchSize` force-flush, so a 300-delta catch-up
665
- * would fan out into several separate `flushPendingDeltas` cycles — each its
666
- * own local write, pool mutation, `models:changed` emit, and re-render, so
667
- * the UI visibly repaints once per chunk.
668
- *
669
- * Instead, this runs the per-delta bookkeeping (deduplication, ack, version
670
- * vector, watermark, group-change routing, delete cascade) for every delta
671
- * without scheduling a flush, then flushes once — collapsing the whole frame
672
- * into a single local write, pool mutation, `models:changed` emit, and
673
- * re-render. The post-bootstrap replay of deltas queued during bootstrap
674
- * uses the same path.
675
- *
676
- * It is named `applyDeltaFrame`, not `processDeltaBatch`, to avoid confusion
677
- * with {@link Database.processDeltaBatch} — the lower-level local write this
678
- * eventually drives through `flushPendingDeltas`.
679
- */
680
- protected applyDeltaFrame(deltas: SyncDelta[]): void;
681
- /**
682
- * Per-delta bookkeeping + enqueue. Returns `true` when the delta was
683
- * pushed onto `pendingDeltas` (a regular batchable I/U/C/D delta that a
684
- * subsequent flush must drain), `false` when it was skipped (dedup),
685
- * deferred (bootstrap queue), or handled immediately out-of-band (G/S
686
- * sync-group mutations). Does NOT schedule a flush — callers decide
687
- * whether to debounce (live) or flush atomically (catch-up frame).
688
- */
689
- protected enqueueDelta(delta: SyncDelta, options?: {
690
- authoritative?: boolean;
691
- }): boolean;
692
- /** Debounce a flush for live single-delta traffic. */
693
- protected scheduleDeltaFlush(): void;
694
- /**
695
- * Cancel pending transactions for child entities when a parent is deleted.
696
- *
697
- * Uses `pool.getByForeignKey` (O(1) via the FK index registered at
698
- * schema build time) to find children. The previous implementation did
699
- * `getByType(ctor).filter(e => e.toJSON()[foreignKey] === parentId)` —
700
- * a full pool scan per child model + a `toJSON()` allocation per
701
- * candidate. For a report delete with 10K blocks in the pool, that was
702
- * 10K toJSON allocations per cascade level. The FK-indexed lookup
703
- * skips both the scan AND the allocation.
704
- */
705
- protected cascadeCancelTransactionsForDeletedParent(parentModelName: string, parentId: string): void;
706
- /** Flush pending deltas with deduplication. Pool writes are delegated to {@link SyncClient}. */
707
- protected flushPendingDeltas(): Promise<void>;
708
- /** Check if a model type is local-only (no sync). Override for domain-specific models. */
709
- protected isLocalOnlyModel(_modelName: string): boolean;
710
- /** Validate model against schema before save */
711
- protected validateModel(model: Model): void;
712
- /**
713
- * Save a model (create or update).
714
- *
715
- * Accepts any entity shape with `{ id: string }` so consumers can pass the
716
- * Zod-inferred model types from `Model<Schema, K>` without knowing
717
- * about the internal `Model` base class. At runtime, every entity reaching
718
- * this method came through the object pool (via `store.create`, a query
719
- * accessor, or an optimistic insert) and IS a `Model` instance — the one
720
- * cast below preserves that invariant inside the SDK.
721
- */
722
- save<T extends {
723
- id: string;
724
- createdAt?: Date;
725
- updatedAt?: Date;
726
- }>(entity: T, options?: {
727
- skipValidation?: boolean;
728
- }): Promise<void>;
729
- /** Save with an atomic server mutation (e.g., createSectionWithBlocks) */
730
- saveWithAtomicMutation(model: Model, mutation: (gql: unknown) => Promise<unknown>): Promise<void>;
731
- /** Delete a model. Accepts schema-inferred entity shapes (see `save`). */
732
- delete<T extends {
733
- id: string;
734
- }>(entity: T): Promise<void>;
735
- /** Archive a model. Accepts schema-inferred entity shapes (see `save`). */
736
- archive<T extends {
737
- id: string;
738
- archivedAt?: Date | null;
739
- }>(entity: T): Promise<void>;
740
- /** Unarchive a model. Accepts schema-inferred entity shapes (see `save`). */
741
- unarchive<T extends {
742
- id: string;
743
- archivedAt?: Date | null;
744
- }>(entity: T): Promise<void>;
745
- /** Retrieve a single entity by id. Synchronous pool read. */
746
- retrieve(_modelClass: ModelConstructor<Model>, id: string): Model | undefined;
747
- /** Find any entity by ID regardless of type */
748
- findAnyById(id: string): Model | undefined;
749
- /**
750
- * Lookup a model by ID alone. Matches the `SyncStoreRef.getById` contract
751
- * that schema-defined computeds use when they need to resolve a related
752
- * entity without holding onto its constructor.
753
- */
754
- getById(id: string): Model | undefined;
755
- /**
756
- * Create a model instance locally, typed via the schema.
757
- *
758
- * ```ts
759
- * const ledger = store.create('ledgers', { name, reportId });
760
- * // ledger: Ledger | null — no cast needed
761
- * ```
762
- *
763
- * The `typename` arg is the schema key (camelCase plural, e.g.
764
- * `'ledgers'`); the returned instance has the
765
- * `Model<Schema, K>` shape including computeds + relation accessors.
766
- * Wraps `pool.create(...)` — the underlying runtime is unchanged, just
767
- * type-narrowed.
768
- */
769
- create<K extends keyof TSchema['models'] & string>(typename: K, data: Record<string, unknown>): import('./transaction/schema/schema.js').Model<TSchema, K> | null;
770
- /**
771
- * Query entry point for callers that hold a {@link Model} constructor and an
772
- * options object. It filters, orders, and paginates the matching models from
773
- * the pool. Prefer the schema-typed read surface (`ablo.<model>.list`) where
774
- * you can, since it infers concrete row types without a class value or cast.
775
- */
776
- queryByClass(modelClass: ModelConstructor<Model>, options?: {
777
- predicate?: (model: Model) => boolean;
778
- state?: ModelScope;
779
- orderBy?: keyof Model;
780
- order?: 'asc' | 'desc';
781
- limit?: number;
782
- offset?: number;
783
- }): QueryResult<Model>;
784
- /**
785
- * Get all models of a type. Returns Model[] honestly — callers that need
786
- * narrow types should use `useAblo((ablo) => ablo.<model>.list(...))`
787
- * which does proper inference via `Model<S, K>`.
788
- */
789
- allModelsOfType(modelClass: ModelConstructor<Model>, scope?: ModelScope): Model[];
790
- /** Error handler for fire-and-forget flushPendingDeltas calls */
791
- protected handleFlushError: (error: unknown) => void;
792
- /** Process a single delta (used for immediate DELETE processing). Override for domain-specific handling. */
793
- protected processDelta(delta: SyncDelta): Promise<void>;
794
- /** Handle bootstrap_required event */
795
- protected handleBootstrapRequired(_hint: BootstrapHint): void;
796
- /** Handle bootstrap_data event. Override in subclass. */
797
- protected handleBootstrapData(_data: BootstrapDataEvent): void;
798
- /** Handle presence_update event. Override in subclass. */
799
- protected handlePresenceUpdate(_data: PresenceUpdate): void;
800
- protected incrementPendingChanges(): void;
801
- protected decrementPendingChanges(): void;
802
- protected updateSyncStatus(updates: Partial<SyncStatus>): void;
803
- get pool(): InstanceCache;
804
- get lastSyncId(): number;
805
- get isReady(): boolean;
806
- get isSyncing(): boolean;
807
- get isOffline(): boolean;
808
- get isReconnecting(): boolean;
809
- get isError(): boolean;
810
- get hasUnsyncedChanges(): boolean;
811
- /** The SyncWebSocket handle — for collaboration events. */
812
- get ws(): SyncWebSocket<TCollaboration> | null;
813
- /** The Database instance — for demand loaders and direct IDB operations. */
814
- get db(): Database;
815
- /** The SyncClient instance — for assignment operations and other direct sync actions. */
816
- get sc(): SyncClient;
817
- /** The current organization ID — from the last initialize() call. */
818
- get orgId(): string | undefined;
819
- /** Count models matching a predicate. */
820
- count(modelClass: ModelConstructor<Model>, predicate?: (m: Model) => boolean): number;
821
- /** Get entities by foreign key (used by Model subclasses via Model.store) */
822
- getByForeignKey(modelName: string, foreignKey: string, id: string): Model[];
823
- }