@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,13 +1,11 @@
1
1
  /**
2
- * ModelRegistry - Type-safe model metadata management
3
- *
4
- * Key improvements:
5
- * - Instance-based for better testing
6
- * - Validation at registration
7
- * - Lazy reference resolution
8
- * - Crypto-based schema hashing
9
- * - Comprehensive error reporting
10
- * - Best practices from Linear Sync Engine
2
+ * ModelRegistry is the source of truth for model metadata: which model classes
3
+ * exist, the properties and references declared on each, the back-references
4
+ * used for cascade handling, and a stable hash of the whole schema.
5
+ * {@link Model} instances resolve their metadata through the active registry,
6
+ * and {@link InstanceCache} uses it to map between model names and constructor
7
+ * classes. References resolve lazily, so a model may declare a reference to
8
+ * another model that is registered later.
11
9
  */
12
10
  // Removed Node.js crypto import for browser compatibility
13
11
  import { PropertyType, LoadStrategy, } from './types/index.js';
@@ -43,17 +41,17 @@ export class ModelRegistry {
43
41
  properties = new Map();
44
42
  references = new Map();
45
43
  pendingReferences = new Map();
46
- // 🔧 PROPER FIX: Static mapping from constructor to model name
44
+ // Maps a constructor back to its model name. Keyed as `unknown` on purpose:
45
+ // lookups arrive both as `this.constructor` (a Function) and as typed model
46
+ // classes, and both are accepted without a cast.
47
47
  constructorToModelName = new Map();
48
- // LINEAR PATTERN: BackReferences for cascade-aware transaction handling.
49
- // Maps childModelName BackReferenceMetadata[] (which parent models
50
- // own this child). The inverse direction (parentModelName children)
51
- // is derived on demand by `getChildModels`, populated only here.
48
+ // Back-references for cascade-aware transaction handling. Maps a child model
49
+ // name to the parent models it references. The inverse direction (parent to
50
+ // children) is derived on demand by `getChildModels`; it is populated here.
52
51
  backReferences = new Map();
53
52
  schemaHash;
54
53
  config;
55
54
  registeredModels = new Set();
56
- batchMode = false;
57
55
  pendingHashUpdate = false;
58
56
  constructor(config = {}) {
59
57
  this.config = {
@@ -65,13 +63,14 @@ export class ModelRegistry {
65
63
  if (typeof constructor !== 'function') {
66
64
  throw new AbloValidationError(`Model ${name} constructor must be a function`, { code: 'registry_invalid_constructor' });
67
65
  }
68
- if (!constructor.prototype) {
66
+ const prototype = constructor.prototype;
67
+ if (!prototype || typeof prototype !== 'object') {
69
68
  throw new AbloValidationError(`Model ${name} constructor must have a prototype`, { code: 'registry_invalid_constructor' });
70
69
  }
71
70
  // Check for required methods
72
71
  const required = ['updateFromData', 'toJSON', 'getModelName'];
73
72
  for (const method of required) {
74
- if (typeof constructor.prototype[method] !== 'function') {
73
+ if (typeof prototype[method] !== 'function') {
75
74
  getContext().logger.debug('Model missing required method', name, { method });
76
75
  }
77
76
  }
@@ -159,10 +158,14 @@ export class ModelRegistry {
159
158
  return;
160
159
  }
161
160
  getContext().logger.debug('Registering model', name);
162
- // Register
163
- this.models.set(name, constructor);
161
+ // Register. The one cast in this file: input is any Model-subclass
162
+ // constructor (validated above); registered classes are concrete
163
+ // subclasses constructible with `data?` and carrying Model's statics —
164
+ // the shape `RegisteredModelClass` names for every read site.
165
+ const modelClass = constructor;
166
+ this.models.set(name, modelClass);
164
167
  this.modelMetadata.set(name, metadata);
165
- // 🔧 PROPER FIX: Create reverse mapping from constructor to model name
168
+ // Record the reverse mapping from constructor to model name
166
169
  this.constructorToModelName.set(constructor, name);
167
170
  // Initialize property maps
168
171
  if (!this.properties.has(name)) {
@@ -239,13 +242,14 @@ export class ModelRegistry {
239
242
  this.completeReferenceRegistration(modelName, propertyName, metadata);
240
243
  }
241
244
  /**
242
- * LINEAR PATTERN: Register a back-reference for cascade-aware transaction handling
245
+ * Register a back-reference for cascade-aware transaction handling.
243
246
  *
244
- * When a parent model is deleted, the TransactionQueue will cancel pending
245
- * transactions for all child models that have a backReference to that parent.
247
+ * When a parent model is deleted, the transaction queue cancels pending
248
+ * transactions for every child model that declares a back-reference to that
249
+ * parent.
246
250
  *
247
- * @param childModelName - The model that has a FK to the parent (e.g., 'Slide')
248
- * @param metadata - BackReference configuration
251
+ * @param childModelName - The model that holds a foreign key to the parent (e.g., 'Slide')
252
+ * @param metadata - The back-reference configuration
249
253
  */
250
254
  registerBackReference(childModelName, metadata) {
251
255
  // Add to instance map
@@ -291,7 +295,6 @@ export class ModelRegistry {
291
295
  return Array.from(this.models.keys());
292
296
  }
293
297
  /** Get model constructor by name */
294
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
295
298
  getModelByName(name) {
296
299
  return this.models.get(name);
297
300
  }
@@ -339,7 +342,9 @@ export class ModelRegistry {
339
342
  return children;
340
343
  }
341
344
  /**
342
- * Calculate schema hash using crypto
345
+ * Compute a stable hash of the registered schema — model names, property
346
+ * types, and their indexed and optional flags. Memoized until the schema
347
+ * changes.
343
348
  */
344
349
  getSchemaHash() {
345
350
  if (this.schemaHash)
@@ -422,7 +427,6 @@ export class ModelRegistry {
422
427
  * Start batch registration mode to optimize performance
423
428
  */
424
429
  startBatch() {
425
- this.batchMode = true;
426
430
  this.pendingHashUpdate = false;
427
431
  }
428
432
  /**
@@ -432,7 +436,6 @@ export class ModelRegistry {
432
436
  * End batch registration mode and update schema hash if needed
433
437
  */
434
438
  endBatch() {
435
- this.batchMode = false;
436
439
  if (this.pendingHashUpdate) {
437
440
  this.getSchemaHash(); // This will recalculate if needed
438
441
  this.pendingHashUpdate = false;
@@ -454,7 +457,6 @@ export class ModelRegistry {
454
457
  this.backReferences.clear();
455
458
  this.constructorToModelName.clear();
456
459
  this.schemaHash = undefined;
457
- this.batchMode = false;
458
460
  this.pendingHashUpdate = false;
459
461
  getContext().logger.info('ModelRegistry cleared');
460
462
  }
@@ -1,10 +1,9 @@
1
1
  /**
2
- * NetworkMonitor - Network connectivity tracking with visibility awareness
3
- *
4
- * Monitors online/offline state using browser events AND visibility changes.
5
- * When a tab becomes visible after being hidden (e.g., laptop sleep/wake),
6
- * the WebSocket may have silently died without triggering online/offline events.
7
- * The visibility handler detects this and emits 'online' to trigger recovery.
2
+ * NetworkMonitor tracks network connectivity and reports it through events.
3
+ * It listens to the browser's online and offline events, and it also watches
4
+ * for a tab becoming visible again: after a laptop sleep/wake or a long spell
5
+ * in the background, the WebSocket can die silently without an offline event
6
+ * firing, so returning to the tab emits a recovery signal the store can act on.
8
7
  */
9
8
  import { EventEmitter } from 'events';
10
9
  export declare class NetworkMonitor extends EventEmitter {
@@ -1,10 +1,9 @@
1
1
  /**
2
- * NetworkMonitor - Network connectivity tracking with visibility awareness
3
- *
4
- * Monitors online/offline state using browser events AND visibility changes.
5
- * When a tab becomes visible after being hidden (e.g., laptop sleep/wake),
6
- * the WebSocket may have silently died without triggering online/offline events.
7
- * The visibility handler detects this and emits 'online' to trigger recovery.
2
+ * NetworkMonitor tracks network connectivity and reports it through events.
3
+ * It listens to the browser's online and offline events, and it also watches
4
+ * for a tab becoming visible again: after a laptop sleep/wake or a long spell
5
+ * in the background, the WebSocket can die silently without an offline event
6
+ * firing, so returning to the tab emits a recovery signal the store can act on.
8
7
  */
9
8
  import { EventEmitter } from 'events';
10
9
  import { getContext } from './context.js';
@@ -18,7 +17,7 @@ export class NetworkMonitor extends EventEmitter {
18
17
  super();
19
18
  this.setupListeners();
20
19
  }
21
- handleOnline = async () => {
20
+ handleOnline = () => {
22
21
  const wasOffline = !this.isOnline;
23
22
  this.isOnline = true;
24
23
  this.lastOnlineCheck = new Date();
@@ -1,17 +1,17 @@
1
1
  /**
2
- * SyncClient - Mutation and offline queue manager
3
- *
4
- * Responsibilities:
5
- * - Handle model mutations (create, update, delete, archive)
6
- * - Manage offline mutation queue with persistence
7
- * - Send mutations to server via API client
8
- * - Handle conflict resolution for local changes
2
+ * Applies model mutations and manages the offline write queue. The
3
+ * SyncClient turns local create, update, delete, and archive calls into
4
+ * optimistic changes, holds them while the client is offline, sends them to
5
+ * the server when connectivity returns, and resolves conflicts when the
6
+ * server's version of a row disagrees with the local one. It sits between the
7
+ * reactive object pool and the {@link TransactionQueue} that delivers writes
8
+ * over the network.
9
9
  */
10
- import { ObjectPool } from './ObjectPool.js';
10
+ import { InstanceCache } from './InstanceCache.js';
11
11
  import { Model } from './Model.js';
12
12
  import { EventEmitter } from 'events';
13
13
  import { TransactionQueue } from './transactions/TransactionQueue.js';
14
- import { type OptimisticEchoMetrics } from './transactions/OptimisticEchoTracker.js';
14
+ import { type UnconfirmedWritesMetrics } from './transactions/UnconfirmedWrites.js';
15
15
  import type { Database } from './Database.js';
16
16
  import type { WriteOptions } from './interfaces/index.js';
17
17
  import { SyncPosition } from './sync/syncPosition.js';
@@ -50,33 +50,29 @@ export declare class SyncClient extends EventEmitter {
50
50
  private organizationId;
51
51
  private pendingMutations;
52
52
  /**
53
- * Tracks transaction ids the client has optimistically applied but
54
- * the server has not yet confirmed. The receive path consults it
55
- * to recognize delta echoes of own mutations and suppress the
56
- * (otherwise-redundant) pool mutation the IDB write still runs
57
- * because the delta is the authoritative version of the row.
53
+ * Tracks the ids of transactions the client has applied optimistically but
54
+ * the server has not yet confirmed. When a delta arrives, the receive path
55
+ * consults this set to recognize the echo of the client's own mutation and
56
+ * skip the now-redundant pool update; the IndexedDB write still runs,
57
+ * because the delta is the authoritative version of the row. Without this
58
+ * discriminator, an optimistically applied delete followed by a
59
+ * server-confirmed create echo would resurrect the row for the window
60
+ * between the two confirmations.
58
61
  *
59
- * The receive-layer discriminator named in
60
- * `apps/sync-server/docs/OPTIMISTIC_RECONCILIATION.md`. Without
61
- * it, an optimistically-applied DELETE followed by a
62
- * server-confirming CREATE echo resurrects the row for the window
63
- * between the two confirmations (the chart-delete flicker).
64
- *
65
- * Bounded with FIFO eviction; observability via `getEchoMetrics()`.
62
+ * The set is bounded with first-in-first-out eviction, and
63
+ * {@link SyncClient.getEchoMetrics} exposes its counters.
66
64
  */
67
65
  private readonly echoTracker;
68
66
  private connectionState;
69
- private offlineSince?;
70
- private maxRetries;
71
67
  private isDisposed;
72
68
  /**
73
- * THE client's place in the global delta order the one canonical
74
- * instance (see `sync/syncPosition.ts`). The store advances
75
- * `applied`/`persisted` as deltas land; the queue advances `acked` on
76
- * commit responses; snapshots/claims read `readFloor`.
69
+ * The client's position in the global delta order, held as the single
70
+ * canonical {@link SyncPosition} instance. The store advances `applied` and
71
+ * `persisted` as deltas land, the queue advances `acked` on commit
72
+ * responses, and snapshots and claims read `readFloor`.
77
73
  */
78
74
  readonly position: SyncPosition;
79
- constructor(objectPool: ObjectPool, database: Database);
75
+ constructor(objectPool: InstanceCache, database: Database);
80
76
  /**
81
77
  * Setup network monitoring handlers
82
78
  */
@@ -104,19 +100,23 @@ export declare class SyncClient extends EventEmitter {
104
100
  */
105
101
  private setupTransactionRollbackHandling;
106
102
  /**
107
- * Forward reconciliation requests from TransactionQueue to the sync layer.
108
- * When delta confirmation times out, TransactionQueue emits 'reconciliation:needed'
109
- * instead of rolling back following the Replicache/PowerSync pattern of never
110
- * destroying optimistic state that the server may have committed.
103
+ * Forward reconciliation requests from the {@link TransactionQueue} to the
104
+ * sync layer. When delta confirmation times out, the queue emits
105
+ * `reconciliation:needed` instead of rolling back, so optimistic state the
106
+ * server may already have committed is never destroyed.
111
107
  */
112
108
  private setupReconciliationForwarding;
113
109
  /**
114
- * LINEAR PATTERN: Persist unconfirmed transactions to IndexedDB.
115
- * When delta confirmation retries exhaust, the transaction data is cached in IDB
116
- * so it survives tab close. On next session, WebSocket reconnect + delta catch-up
117
- * will deliver the missing deltas and naturally confirm the transaction.
110
+ * Persist unconfirmed transactions to IndexedDB. When delta-confirmation
111
+ * retries are exhausted, the transaction is cached so it survives a tab
112
+ * close. On the next session, a WebSocket reconnect and delta catch-up
113
+ * deliver the missing deltas and confirm the transaction.
118
114
  */
119
115
  private setupAwaitingTransactionPersistence;
116
+ /** Persist an unconfirmed transaction to IndexedDB (never rejects — failures are captured). */
117
+ private persistAwaitingTransaction;
118
+ /** Drop the persisted awaiting-row once confirmed (never rejects). */
119
+ private removeAwaitingTransaction;
120
120
  /**
121
121
  * Initialize sync client with authentication
122
122
  */
@@ -131,7 +131,7 @@ export declare class SyncClient extends EventEmitter {
131
131
  * Self-healing helper for individual model records.
132
132
  *
133
133
  * Two registry-driven repair passes run on every row hydrated from
134
- * IDB or merged from a delta:
134
+ * IndexedDB or merged from a delta:
135
135
  *
136
136
  * 1. **Auto-fill** — for each `autoFill` rule the consumer's schema
137
137
  * declares on this model, copy the corresponding identity value
@@ -152,12 +152,12 @@ export declare class SyncClient extends EventEmitter {
152
152
  healed: boolean;
153
153
  } | null;
154
154
  /**
155
- * Hydrate ObjectPool with data from Database
155
+ * Hydrate InstanceCache with data from Database
156
156
  * Called after bootstrap is complete
157
157
  */
158
158
  hydrateFromDatabase(): Promise<void>;
159
159
  /**
160
- * Re-hydrate ObjectPool from IndexedDB when the pool already has data.
160
+ * Re-hydrate InstanceCache from IndexedDB when the pool already has data.
161
161
  *
162
162
  * Unlike hydrateFromDatabase() (which uses addBatch and skips existing IDs),
163
163
  * this method properly:
@@ -168,13 +168,14 @@ export declare class SyncClient extends EventEmitter {
168
168
  */
169
169
  rehydrateFromDatabase(): Promise<RehydrationStats>;
170
170
  /**
171
- * Mutate model optimistically and queue for server sync.
172
- * IndexedDB is only updated when server confirms via delta packet.
173
- *
174
- * CRITICAL: Changes are captured BEFORE poolAction to prevent data loss.
175
- * The captured changes are frozen and passed to queueMutation.
171
+ * Apply a mutation to a model optimistically and queue it for server sync.
172
+ * IndexedDB is updated only once the server confirms the change with a delta
173
+ * packet.
176
174
  *
177
- * @see src/sync-engine/types/TrackableModel.ts for change capture pattern
175
+ * A model's changes are captured before the pool action runs, because a pool
176
+ * operation such as an upsert can clear the model's local change set;
177
+ * capturing first ensures those changes are never lost. The captured set is
178
+ * frozen and handed to {@link queueMutation}.
178
179
  */
179
180
  private mutate;
180
181
  private pendingChangedTypes;
@@ -206,8 +207,9 @@ export declare class SyncClient extends EventEmitter {
206
207
  */
207
208
  private clearPendingMutationsForModel;
208
209
  /**
209
- * Upload file and create attachment (UPLOAD operation)
210
- * Uses Linear-style pattern with immediate URL generation
210
+ * Upload a file and create its attachment record. The upload runs through
211
+ * the {@link TransactionQueue}, and a model is built from the server's
212
+ * response and added to the pool.
211
213
  */
212
214
  uploadFile(file: File, options: {
213
215
  id: string;
@@ -235,16 +237,17 @@ export declare class SyncClient extends EventEmitter {
235
237
  /** Archive model (ARCHIVE) - works offline */
236
238
  archive(model: Model): void;
237
239
  /**
238
- * Append a mutation and schedule its sync work.
240
+ * Append a mutation to the pending queue and schedule its sync work.
239
241
  *
240
- * IDB persistence and the server push are deferred to a microtask so N
241
- * pushes inside the same tick collapse into ONE IDB serialization + ONE
242
- * process call. Without the deferral, queueing 100 mutations (paste,
243
- * PPTX import, AI sandbox layer creation) reserializes the entire
244
- * growing queue 100× O(N²) `model.toJSON()`.
242
+ * IndexedDB persistence and the server push are deferred to a microtask, so
243
+ * many pushes within the same tick collapse into a single serialization and
244
+ * a single process call. Without the deferral, queueing a hundred mutations
245
+ * at once — a large paste, a document import, bulk layer creation would
246
+ * reserialize the whole growing queue a hundred times, an O(N²) cost in
247
+ * `model.toJSON()`.
245
248
  *
246
- * @param mutation.capturedChanges - Pre-captured changes (frozen), used
247
- * to avoid re-reading changes after pool ops that might clear them.
249
+ * @param mutation.capturedChanges - Pre-captured, frozen changes, used to
250
+ * avoid re-reading a model after pool operations that might clear them.
248
251
  */
249
252
  private queueMutation;
250
253
  private syncScheduled;
@@ -254,7 +257,13 @@ export declare class SyncClient extends EventEmitter {
254
257
  */
255
258
  private persistMutationQueue;
256
259
  /**
257
- * Restore mutation queue from IndexedDB
260
+ * Restore the mutation queue from IndexedDB.
261
+ *
262
+ * The persisted record was written by an earlier session, possibly by an
263
+ * older build of the SDK, so each entry is validated as it is replayed:
264
+ * corrupt entries are dropped and logged at debug level, and a failure is
265
+ * never swallowed silently, because the survival of offline writes must be
266
+ * observable.
258
267
  */
259
268
  private restoreMutationQueue;
260
269
  /**
@@ -272,16 +281,16 @@ export declare class SyncClient extends EventEmitter {
272
281
  */
273
282
  private stageMutation;
274
283
  /**
275
- * Resolve conflicts between local and server data
276
- * Used when processing deltas from WebSocket
277
- *
278
- * CRITICAL: Always respects certain server states (deletes, deactivations)
279
- * even when there are local changes, to maintain data consistency.
284
+ * Resolve a conflict between the local model and incoming server data,
285
+ * called while processing deltas from the WebSocket. Certain server states,
286
+ * such as deletions and deactivations, always take precedence even when the
287
+ * local model has unsynced changes, so the two sides stay consistent.
280
288
  */
281
- resolveConflicts(localModel: Model, serverData: any): Model;
289
+ resolveConflicts(localModel: Model, serverData: Record<string, unknown>): Model;
282
290
  /**
283
- * Extract critical state fields from server data
284
- * These are states that must always be respected, even with local changes
291
+ * Extract the critical state fields from server data. These are the states
292
+ * that must be honored even when the local model has unsynced changes. The
293
+ * conflict resolver reads exactly these fields and no others.
285
294
  */
286
295
  private extractCriticalState;
287
296
  /**
@@ -334,26 +343,26 @@ export declare class SyncClient extends EventEmitter {
334
343
  */
335
344
  dispose(): void;
336
345
  /**
337
- * LINEAR PATTERN: Notify TransactionQueue of incoming delta for sync ID threshold confirmation.
338
- * Transactions are confirmed when any delta with id >= their lastSyncId threshold arrives.
339
- * @param syncId - The sync ID of the received delta
346
+ * Notify the {@link TransactionQueue} of an incoming delta so it can confirm
347
+ * transactions by sync-id threshold. A transaction is confirmed once any
348
+ * delta with an id at or beyond its `lastSyncId` threshold arrives.
349
+ * @param syncId - The sync id of the received delta.
340
350
  */
341
351
  onDeltaReceived(syncId: number): void;
342
352
  /**
343
- * LINEAR PATTERN: Cancel transactions for orphaned child entities
344
- *
345
- * Called by SyncedStore when a DELETE delta arrives for a parent entity.
346
- * Cancels pending transactions for children that reference the deleted parent.
353
+ * Cancel pending transactions for child entities orphaned by a parent's
354
+ * deletion. The store calls this when a delete delta arrives for a parent,
355
+ * cancelling any queued writes on children that reference it.
347
356
  *
348
- * @param childModelName - The child model type (e.g., 'SlideLayer')
349
- * @param foreignKey - The FK property name (e.g., 'slideId')
350
- * @param parentId - The deleted parent's ID
351
- * @returns Number of transactions cancelled
357
+ * @param childModelName - The child model type (for example, `SlideLayer`).
358
+ * @param foreignKey - The foreign-key property name (for example, `slideId`).
359
+ * @param parentId - The id of the deleted parent.
360
+ * @returns The number of transactions cancelled.
352
361
  */
353
362
  cancelTransactionsByForeignKey(childModelName: string, foreignKey: string, parentId: string): number;
354
363
  /**
355
- * Wait for a transaction to be confirmed via delta echo (Linear pattern)
356
- * Delegates to TransactionQueue which already handles timeouts
364
+ * Wait for a transaction to be confirmed by its delta echo. Delegates to the
365
+ * {@link TransactionQueue}, which handles the confirmation timeout.
357
366
  */
358
367
  waitForDeltaConfirmation(transactionId: string): Promise<void>;
359
368
  /**
@@ -363,12 +372,12 @@ export declare class SyncClient extends EventEmitter {
363
372
  /**
364
373
  * Get sync statistics. Return type is inferred from the literal so
365
374
  * the call site sees the actual shape — `connectionState` narrowed
366
- * to its three states, `objectPoolStats` typed by `ObjectPool.getStats`.
375
+ * to its three states, `objectPoolStats` typed by `InstanceCache.getStats`.
367
376
  */
368
377
  getSyncStats(): {
369
378
  connectionState: 'connected' | 'disconnected' | 'connecting';
370
379
  pendingMutations: number;
371
- objectPoolStats: ReturnType<ObjectPool['getStats']>;
380
+ objectPoolStats: ReturnType<InstanceCache['getStats']>;
372
381
  };
373
382
  /**
374
383
  * Get pending transaction count from TransactionQueue
@@ -386,10 +395,10 @@ export declare class SyncClient extends EventEmitter {
386
395
  * can render typed UI (toast keyed by `AbloError.type`, route-level
387
396
  * "this entity reverted" boundaries, telemetry).
388
397
  *
389
- * Distinct from `onTransactionEvent('failed', cb)`, which exists only
390
- * for the legacy parameterless `pendingChanges` counter and intentionally
391
- * drops the payload. The two coexist — keep the counter callback fast
392
- * and the typed listener for user-visible surfaces.
398
+ * Distinct from `onTransactionEvent('failed', cb)`, which serves the
399
+ * parameterless `pendingChanges` counter and intentionally drops the
400
+ * payload. The two coexist: the counter callback stays lightweight, while
401
+ * this typed listener drives user-visible surfaces.
393
402
  */
394
403
  onMutationFailure(listener: (payload: {
395
404
  transaction: import('./transactions/TransactionQueue.js').Transaction;
@@ -397,15 +406,16 @@ export declare class SyncClient extends EventEmitter {
397
406
  permanent?: boolean;
398
407
  }) => void): () => void;
399
408
  /**
400
- * Subscribe to LOCAL transaction creation with the full {@link Transaction}
409
+ * Subscribe to local transaction creation with the full {@link Transaction}
401
410
  * payload (`type`, `modelName`, `modelId`, `data`, `previousData`). This is
402
- * the feed `BaseSyncedStore.subscribeLocalMutations` taps for undo recording.
411
+ * the feed the store's local-mutation subscription taps for undo recording.
403
412
  *
404
- * MUST subscribe to the TransactionQueue's emitter directly — that is the
405
- * ONLY emitter that fires `transaction:created`. SyncClient's own emitter
406
- * (reached via `subscribe()`) never re-broadcasts it, so routing undo through
407
- * `subscribe('transaction:created')` silently records nothing. Mirrors
408
- * `onMutationFailure`, which taps the queue for the same reason.
413
+ * It subscribes to the {@link TransactionQueue}'s emitter directly, since
414
+ * that is the only emitter that fires `transaction:created`. The SyncClient's
415
+ * own emitter (reached through {@link subscribe}) never rebroadcasts that
416
+ * event, so routing undo through `subscribe('transaction:created')` would
417
+ * record nothing. {@link onMutationFailure} taps the queue for the same
418
+ * reason.
409
419
  */
410
420
  onLocalTransaction(listener: (tx: import('./transactions/TransactionQueue.js').Transaction) => void): () => void;
411
421
  /**
@@ -454,9 +464,9 @@ export declare class SyncClient extends EventEmitter {
454
464
  unassignEntity(entityType: string, entityId: string): Promise<void>;
455
465
  reassignEntity(entityType: string, entityId: string, assigneeType: string, assigneeId: string, id?: string): Promise<void>;
456
466
  /**
457
- * Apply a batch of delta results from Database to the ObjectPool.
467
+ * Apply a batch of delta results from Database to the InstanceCache.
458
468
  * Owns: model creation, upsert, remove, archive, conflict resolution.
459
- * Returns: nothing — ObjectPool is updated in place.
469
+ * Returns: nothing — InstanceCache is updated in place.
460
470
  */
461
471
  /**
462
472
  * Mark a local transaction as optimistically applied. The matching
@@ -472,17 +482,17 @@ export declare class SyncClient extends EventEmitter {
472
482
  * — a sustained `evictions > 0` rate or `rollbacks` spike is a
473
483
  * health signal worth alerting on.
474
484
  */
475
- getEchoMetrics(): Readonly<OptimisticEchoMetrics>;
485
+ getEchoMetrics(): Readonly<UnconfirmedWritesMetrics>;
476
486
  /**
477
- * Package-internal accessor for the TransactionQueue. Used by
478
- * `Ablo.commits.create()` to route raw multi-op envelopes through the
479
- * same retry-on-reconnect lane as the Model proxy path, and by tests
480
- * to exercise the queue markTransactionPending wiring on the real
481
- * instance the SyncClient subscribes to. NOT re-exported to SDK
482
- * consumers `Ablo` itself is the public surface.
487
+ * Package-internal accessor for the {@link TransactionQueue}. Used by
488
+ * `Ablo.commits.create()` to route raw multi-operation envelopes through the
489
+ * same retry-on-reconnect lane as the model proxy path, and by tests to
490
+ * exercise the queue's interaction with {@link markTransactionPending} on the
491
+ * real instance the SyncClient subscribes to. It is not re-exported to SDK
492
+ * consumers; `Ablo` is the public surface.
483
493
  */
484
494
  getTransactionQueue(): TransactionQueue;
485
- applyDeltaBatchToPool(dbResults: Array<{
495
+ applyDeltaBatchToPool(dbResults: {
486
496
  action: string;
487
497
  modelName: string;
488
498
  modelId: string;
@@ -495,9 +505,9 @@ export declare class SyncClient extends EventEmitter {
495
505
  * schema-derived deltas, etc.) don't have a client transaction.
496
506
  */
497
507
  transactionId?: string;
498
- }>, enrichRelations: (modelName: string, data: Record<string, unknown>) => Record<string, unknown>): void;
508
+ }[], enrichRelations: (modelName: string, data: Record<string, unknown>) => Record<string, unknown>): void;
499
509
  /**
500
- * Apply bootstrap data to the ObjectPool with ghost removal.
510
+ * Apply bootstrap data to the InstanceCache with ghost removal.
501
511
  * Owns: model creation, batch upsert, ghost detection + removal.
502
512
  */
503
513
  applyBootstrapDataToPool(bootstrapData: {
@@ -505,13 +515,13 @@ export declare class SyncClient extends EventEmitter {
505
515
  failedModels?: string[];
506
516
  }, protectedIds?: ReadonlySet<string>, options?: {
507
517
  /**
508
- * SCOPED backfill (P4 hydrate-on-enter): the snapshot covers only the
509
- * groups just entered, NOT the whole type. Two behaviors change to keep
510
- * it from corrupting the pool:
511
- * - upsert is version-guarded ({@link ObjectPool.upsertIfNewer}) so a
512
- * concurrent live delta isn't clobbered back to the snapshot version;
513
- * - ghost removal is SKIPPED a subset snapshot must never evict rows
514
- * of the same type that belong to other (unhydrated) groups.
518
+ * Scoped backfill for the hydrate-on-enter path: the snapshot covers only
519
+ * the groups just entered, not the whole model type. Two behaviors change
520
+ * so the subset cannot corrupt the pool. First, the upsert is
521
+ * version-guarded ({@link InstanceCache.upsertIfNewer}) so a concurrent live
522
+ * delta is not clobbered back to the snapshot version. Second, ghost
523
+ * removal is skipped, because a subset snapshot must never evict rows of
524
+ * the same type that belong to other, unhydrated groups.
515
525
  */
516
526
  scoped?: boolean;
517
527
  }): {