@abloatai/humans 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 (404) hide show
  1. package/README.md +52 -0
  2. package/dist/Ablo.d.ts +208 -0
  3. package/dist/Ablo.js +120 -0
  4. package/dist/client.d.ts +317 -0
  5. package/dist/client.js +13 -0
  6. package/dist/core.d.ts +35 -0
  7. package/dist/core.js +48 -0
  8. package/dist/humans.d.ts +28 -0
  9. package/dist/humans.js +34 -0
  10. package/dist/index.d.ts +10 -0
  11. package/dist/index.js +6 -0
  12. package/dist/local/BaseSyncedStore.d.ts +807 -0
  13. package/dist/local/BaseSyncedStore.js +1516 -0
  14. package/dist/local/Database.d.ts +322 -0
  15. package/dist/local/Database.js +1589 -0
  16. package/dist/local/InstanceCache.d.ts +255 -0
  17. package/dist/local/InstanceCache.js +1263 -0
  18. package/dist/local/LazyReferenceCollection.d.ts +177 -0
  19. package/dist/local/LazyReferenceCollection.js +461 -0
  20. package/dist/local/Model.d.ts +475 -0
  21. package/dist/local/Model.js +950 -0
  22. package/dist/local/ModelRegistry.d.ts +225 -0
  23. package/dist/local/ModelRegistry.js +539 -0
  24. package/dist/local/NetworkMonitor.d.ts +28 -0
  25. package/dist/local/NetworkMonitor.js +79 -0
  26. package/dist/local/RuntimeContext.d.ts +52 -0
  27. package/dist/local/RuntimeContext.js +80 -0
  28. package/dist/local/SyncClient.d.ts +516 -0
  29. package/dist/local/SyncClient.js +1754 -0
  30. package/dist/local/adapters/alwaysOnline.d.ts +14 -0
  31. package/dist/local/adapters/alwaysOnline.js +17 -0
  32. package/dist/local/adapters/inMemoryStorage.d.ts +37 -0
  33. package/dist/local/adapters/inMemoryStorage.js +122 -0
  34. package/dist/local/client/clientPrelude.d.ts +52 -0
  35. package/dist/local/client/clientPrelude.js +60 -0
  36. package/dist/local/client/consoleLogger.d.ts +35 -0
  37. package/dist/local/client/consoleLogger.js +44 -0
  38. package/dist/local/client/createInternalComponents.d.ts +50 -0
  39. package/dist/local/client/createInternalComponents.js +98 -0
  40. package/dist/local/client/createModelProxy.d.ts +248 -0
  41. package/dist/local/client/createModelProxy.js +880 -0
  42. package/dist/local/client/modelRegistration.d.ts +10 -0
  43. package/dist/local/client/modelRegistration.js +316 -0
  44. package/dist/local/client/options.d.ts +440 -0
  45. package/dist/local/client/options.js +7 -0
  46. package/dist/local/client/reactiveEngine.d.ts +53 -0
  47. package/dist/local/client/reactiveEngine.js +705 -0
  48. package/dist/local/client/resourceTypes.d.ts +12 -0
  49. package/dist/local/client/resourceTypes.js +10 -0
  50. package/dist/local/client/schemaConfig.d.ts +44 -0
  51. package/dist/local/client/schemaConfig.js +185 -0
  52. package/dist/local/client/storeCluster.d.ts +46 -0
  53. package/dist/local/client/storeCluster.js +133 -0
  54. package/dist/local/client/storeLifecycle.d.ts +61 -0
  55. package/dist/local/client/storeLifecycle.js +236 -0
  56. package/dist/local/client/validateAbloOptions.d.ts +42 -0
  57. package/dist/local/client/validateAbloOptions.js +43 -0
  58. package/dist/local/client/wsMutationExecutor.d.ts +27 -0
  59. package/dist/local/client/wsMutationExecutor.js +72 -0
  60. package/dist/local/context.d.ts +42 -0
  61. package/dist/local/context.js +81 -0
  62. package/dist/local/coordination/ClaimLog.d.ts +26 -0
  63. package/dist/local/coordination/ClaimLog.js +32 -0
  64. package/dist/local/interfaces/index.d.ts +311 -0
  65. package/dist/local/interfaces/index.js +9 -0
  66. package/dist/local/localModelContract.d.ts +14 -0
  67. package/dist/local/localModelContract.js +1 -0
  68. package/dist/local/logPosition.d.ts +31 -0
  69. package/dist/local/logPosition.js +53 -0
  70. package/dist/local/mutationPersistence.d.ts +6 -0
  71. package/dist/local/mutationPersistence.js +1 -0
  72. package/dist/local/mutators/RecordingMutation.d.ts +36 -0
  73. package/dist/local/mutators/RecordingMutation.js +182 -0
  74. package/dist/local/mutators/Transaction.d.ts +40 -0
  75. package/dist/local/mutators/Transaction.js +58 -0
  76. package/dist/local/mutators/UndoManager.d.ts +258 -0
  77. package/dist/local/mutators/UndoManager.js +665 -0
  78. package/dist/local/mutators/defineMutators.d.ts +60 -0
  79. package/dist/local/mutators/defineMutators.js +18 -0
  80. package/dist/local/mutators/inverseOp.d.ts +126 -0
  81. package/dist/local/mutators/inverseOp.js +71 -0
  82. package/dist/local/mutators/mutateActions.d.ts +45 -0
  83. package/dist/local/mutators/mutateActions.js +105 -0
  84. package/dist/local/mutators/readerActions.d.ts +33 -0
  85. package/dist/local/mutators/readerActions.js +57 -0
  86. package/dist/local/mutators/undoApply.d.ts +51 -0
  87. package/dist/local/mutators/undoApply.js +117 -0
  88. package/dist/local/persistence.d.ts +7 -0
  89. package/dist/local/persistence.js +9 -0
  90. package/dist/local/query/QueryProcessor.d.ts +75 -0
  91. package/dist/local/query/QueryProcessor.js +255 -0
  92. package/dist/local/query/client.d.ts +64 -0
  93. package/dist/local/query/client.js +138 -0
  94. package/dist/local/query/types.d.ts +85 -0
  95. package/dist/local/query/types.js +16 -0
  96. package/dist/local/schema/serialize.d.ts +1 -0
  97. package/dist/local/schema/serialize.js +1 -0
  98. package/dist/local/store/queryApi.d.ts +13 -0
  99. package/dist/local/store/queryApi.js +35 -0
  100. package/dist/local/storeContract.d.ts +145 -0
  101. package/dist/local/storeContract.js +12 -0
  102. package/dist/local/stores/DatabaseManager.d.ts +112 -0
  103. package/dist/local/stores/DatabaseManager.js +400 -0
  104. package/dist/local/stores/ObjectStore.d.ts +115 -0
  105. package/dist/local/stores/ObjectStore.js +393 -0
  106. package/dist/local/stores/ObjectStoreContract.d.ts +38 -0
  107. package/dist/local/stores/ObjectStoreContract.js +1 -0
  108. package/dist/local/stores/StoreManager.d.ts +114 -0
  109. package/dist/local/stores/StoreManager.js +304 -0
  110. package/dist/local/stores/SyncActionStore.d.ts +99 -0
  111. package/dist/local/stores/SyncActionStore.js +506 -0
  112. package/dist/local/stores/openIDBWithTimeout.d.ts +65 -0
  113. package/dist/local/stores/openIDBWithTimeout.js +153 -0
  114. package/dist/local/stores/persistenceCleanup.d.ts +7 -0
  115. package/dist/local/stores/persistenceCleanup.js +26 -0
  116. package/dist/local/stores/persistenceIdentity.d.ts +27 -0
  117. package/dist/local/stores/persistenceIdentity.js +38 -0
  118. package/dist/local/stores/syncAction.d.ts +26 -0
  119. package/dist/local/stores/syncAction.js +16 -0
  120. package/dist/local/stores/v1PersistenceDeletion.d.ts +8 -0
  121. package/dist/local/stores/v1PersistenceDeletion.js +16 -0
  122. package/dist/local/sync/BootstrapFetcher.d.ts +284 -0
  123. package/dist/local/sync/BootstrapFetcher.js +964 -0
  124. package/dist/local/sync/ConnectionManager.d.ts +8 -0
  125. package/dist/local/sync/ConnectionManager.js +8 -0
  126. package/dist/local/sync/OnDemandLoader.d.ts +231 -0
  127. package/dist/local/sync/OnDemandLoader.js +743 -0
  128. package/dist/local/sync/SubscriptionManager.d.ts +159 -0
  129. package/dist/local/sync/SubscriptionManager.js +243 -0
  130. package/dist/local/sync/SyncWebSocket.d.ts +173 -0
  131. package/dist/local/sync/SyncWebSocket.js +438 -0
  132. package/dist/local/sync/bootstrapApply.d.ts +73 -0
  133. package/dist/local/sync/bootstrapApply.js +73 -0
  134. package/dist/local/sync/commitFrames.d.ts +8 -0
  135. package/dist/local/sync/commitFrames.js +8 -0
  136. package/dist/local/sync/connectionManagerLifecycle.d.ts +23 -0
  137. package/dist/local/sync/connectionManagerLifecycle.js +126 -0
  138. package/dist/local/sync/contextPorts.d.ts +18 -0
  139. package/dist/local/sync/contextPorts.js +31 -0
  140. package/dist/local/sync/createClaimStream.d.ts +64 -0
  141. package/dist/local/sync/createClaimStream.js +475 -0
  142. package/dist/local/sync/createSnapshot.d.ts +29 -0
  143. package/dist/local/sync/createSnapshot.js +116 -0
  144. package/dist/local/sync/credentialLifecycle.d.ts +7 -0
  145. package/dist/local/sync/credentialLifecycle.js +7 -0
  146. package/dist/local/sync/deltaPipeline.d.ts +116 -0
  147. package/dist/local/sync/deltaPipeline.js +357 -0
  148. package/dist/local/sync/groupChange.d.ts +116 -0
  149. package/dist/local/sync/groupChange.js +244 -0
  150. package/dist/local/sync/initialize.d.ts +27 -0
  151. package/dist/local/sync/initialize.js +137 -0
  152. package/dist/local/sync/participants.d.ts +132 -0
  153. package/dist/local/sync/participants.js +342 -0
  154. package/dist/local/sync/persistedPrefix.d.ts +12 -0
  155. package/dist/local/sync/persistedPrefix.js +22 -0
  156. package/dist/local/sync/reconnect.d.ts +23 -0
  157. package/dist/local/sync/reconnect.js +55 -0
  158. package/dist/local/sync/schemaDrift.d.ts +55 -0
  159. package/dist/local/sync/schemaDrift.js +53 -0
  160. package/dist/local/sync/schemas.d.ts +71 -0
  161. package/dist/local/sync/schemas.js +94 -0
  162. package/dist/local/sync/socketEventWiring.d.ts +31 -0
  163. package/dist/local/sync/socketEventWiring.js +130 -0
  164. package/dist/local/sync/syncCursor.d.ts +40 -0
  165. package/dist/local/sync/syncCursor.js +55 -0
  166. package/dist/local/sync/syncPlan.d.ts +54 -0
  167. package/dist/local/sync/syncPlan.js +50 -0
  168. package/dist/local/sync/terminalSessionLifecycle.d.ts +20 -0
  169. package/dist/local/sync/terminalSessionLifecycle.js +50 -0
  170. package/dist/local/sync/wsFrameHandlers.d.ts +8 -0
  171. package/dist/local/sync/wsFrameHandlers.js +8 -0
  172. package/dist/local/transactions/databaseCommitOutbox.d.ts +15 -0
  173. package/dist/local/transactions/databaseCommitOutbox.js +16 -0
  174. package/dist/local/transactions/localMutation.d.ts +10 -0
  175. package/dist/local/transactions/localMutation.js +37 -0
  176. package/dist/local/transactions/mutations/MutationQueue.d.ts +511 -0
  177. package/dist/local/transactions/mutations/MutationQueue.js +1498 -0
  178. package/dist/local/transactions/mutations/MutationStore.d.ts +20 -0
  179. package/dist/local/transactions/mutations/MutationStore.js +53 -0
  180. package/dist/local/transactions/mutations/UnconfirmedWrites.d.ts +82 -0
  181. package/dist/local/transactions/mutations/UnconfirmedWrites.js +104 -0
  182. package/dist/local/transactions/mutations/batchProcessing.d.ts +64 -0
  183. package/dist/local/transactions/mutations/batchProcessing.js +349 -0
  184. package/dist/local/transactions/mutations/coalesceRules.d.ts +58 -0
  185. package/dist/local/transactions/mutations/coalesceRules.js +140 -0
  186. package/dist/local/transactions/mutations/commitApi.d.ts +19 -0
  187. package/dist/local/transactions/mutations/commitApi.js +74 -0
  188. package/dist/local/transactions/mutations/commitLane.d.ts +70 -0
  189. package/dist/local/transactions/mutations/commitLane.js +140 -0
  190. package/dist/local/transactions/mutations/commitLatency.d.ts +52 -0
  191. package/dist/local/transactions/mutations/commitLatency.js +130 -0
  192. package/dist/local/transactions/mutations/commitPayload.d.ts +165 -0
  193. package/dist/local/transactions/mutations/commitPayload.js +152 -0
  194. package/dist/local/transactions/mutations/commitTransport.d.ts +36 -0
  195. package/dist/local/transactions/mutations/commitTransport.js +104 -0
  196. package/dist/local/transactions/mutations/deltaConfirmation.d.ts +63 -0
  197. package/dist/local/transactions/mutations/deltaConfirmation.js +235 -0
  198. package/dist/local/transactions/mutations/durableCommitRestore.d.ts +17 -0
  199. package/dist/local/transactions/mutations/durableCommitRestore.js +95 -0
  200. package/dist/local/transactions/mutations/durableWriteStore.d.ts +14 -0
  201. package/dist/local/transactions/mutations/durableWriteStore.js +12 -0
  202. package/dist/local/transactions/mutations/executionSelection.d.ts +6 -0
  203. package/dist/local/transactions/mutations/executionSelection.js +42 -0
  204. package/dist/local/transactions/mutations/failureHandling.d.ts +16 -0
  205. package/dist/local/transactions/mutations/failureHandling.js +130 -0
  206. package/dist/local/transactions/mutations/failurePolicy.d.ts +13 -0
  207. package/dist/local/transactions/mutations/failurePolicy.js +48 -0
  208. package/dist/local/transactions/mutations/localMutation.d.ts +58 -0
  209. package/dist/local/transactions/mutations/localMutation.js +75 -0
  210. package/dist/local/transactions/mutations/modelOperations.d.ts +44 -0
  211. package/dist/local/transactions/mutations/modelOperations.js +144 -0
  212. package/dist/local/transactions/mutations/mutationPersistence.d.ts +25 -0
  213. package/dist/local/transactions/mutations/mutationPersistence.js +188 -0
  214. package/dist/local/transactions/mutations/pendingDrain.d.ts +33 -0
  215. package/dist/local/transactions/mutations/pendingDrain.js +112 -0
  216. package/dist/local/transactions/mutations/processingScheduler.d.ts +14 -0
  217. package/dist/local/transactions/mutations/processingScheduler.js +24 -0
  218. package/dist/local/transactions/mutations/queueCoalescing.d.ts +13 -0
  219. package/dist/local/transactions/mutations/queueCoalescing.js +35 -0
  220. package/dist/local/transactions/mutations/replayValidation.d.ts +187 -0
  221. package/dist/local/transactions/mutations/replayValidation.js +164 -0
  222. package/dist/local/transactions/reconnectDrain.d.ts +11 -0
  223. package/dist/local/transactions/reconnectDrain.js +13 -0
  224. package/dist/local/utils/mobxSetup.d.ts +53 -0
  225. package/dist/local/utils/mobxSetup.js +330 -0
  226. package/dist/local/views/QueryView.d.ts +79 -0
  227. package/dist/local/views/QueryView.js +218 -0
  228. package/dist/local/views/ViewRegistry.d.ts +20 -0
  229. package/dist/local/views/ViewRegistry.js +57 -0
  230. package/dist/local/views/incrementalView.d.ts +45 -0
  231. package/dist/local/views/incrementalView.js +69 -0
  232. package/dist/plugin.d.ts +285 -0
  233. package/dist/plugin.js +106 -0
  234. package/dist/presenceStream.d.ts +69 -0
  235. package/dist/presenceStream.js +200 -0
  236. package/dist/react/AbloProvider.d.ts +242 -0
  237. package/dist/react/AbloProvider.js +456 -0
  238. package/dist/react/ClientSideSuspense.d.ts +36 -0
  239. package/dist/react/ClientSideSuspense.js +17 -0
  240. package/dist/react/DefaultFallback.d.ts +24 -0
  241. package/dist/react/DefaultFallback.js +43 -0
  242. package/dist/react/context.d.ts +55 -0
  243. package/dist/react/context.js +29 -0
  244. package/dist/react/createAbloReact.d.ts +50 -0
  245. package/dist/react/createAbloReact.js +48 -0
  246. package/dist/react/internalContext.d.ts +33 -0
  247. package/dist/react/internalContext.js +3 -0
  248. package/dist/react/useAblo.d.ts +96 -0
  249. package/dist/react/useAblo.js +120 -0
  250. package/dist/react/useCurrentUserId.d.ts +2 -0
  251. package/dist/react/useCurrentUserId.js +12 -0
  252. package/dist/react/useErrorListener.d.ts +2 -0
  253. package/dist/react/useErrorListener.js +14 -0
  254. package/dist/react/useMutationFailureListener.d.ts +8 -0
  255. package/dist/react/useMutationFailureListener.js +19 -0
  256. package/dist/react/useMutators.d.ts +56 -0
  257. package/dist/react/useMutators.js +84 -0
  258. package/dist/react/useSyncStatus.d.ts +19 -0
  259. package/dist/react/useSyncStatus.js +37 -0
  260. package/dist/react/useUndoScope.d.ts +34 -0
  261. package/dist/react/useUndoScope.js +73 -0
  262. package/dist/react.d.ts +18 -0
  263. package/dist/react.js +14 -0
  264. package/dist/reactRuntime.d.ts +4 -0
  265. package/dist/reactRuntime.js +2 -0
  266. package/dist/surface.d.ts +36 -0
  267. package/dist/surface.js +77 -0
  268. package/dist/useReactive.d.ts +6 -0
  269. package/dist/useReactive.js +43 -0
  270. package/package.json +119 -0
  271. package/src/Ablo.ts +456 -0
  272. package/src/client.ts +374 -0
  273. package/src/core.ts +104 -0
  274. package/src/humans.ts +61 -0
  275. package/src/index.ts +40 -0
  276. package/src/local/BaseSyncedStore.ts +1991 -0
  277. package/src/local/Database.ts +2052 -0
  278. package/src/local/InstanceCache.ts +1503 -0
  279. package/src/local/LazyReferenceCollection.ts +563 -0
  280. package/src/local/Model.ts +1124 -0
  281. package/src/local/ModelRegistry.ts +762 -0
  282. package/src/local/NetworkMonitor.ts +88 -0
  283. package/src/local/RuntimeContext.ts +141 -0
  284. package/src/local/SyncClient.ts +2131 -0
  285. package/src/local/adapters/alwaysOnline.ts +20 -0
  286. package/src/local/adapters/inMemoryStorage.ts +141 -0
  287. package/src/local/client/clientPrelude.ts +112 -0
  288. package/src/local/client/consoleLogger.ts +60 -0
  289. package/src/local/client/createInternalComponents.ts +163 -0
  290. package/src/local/client/createModelProxy.ts +1390 -0
  291. package/src/local/client/modelRegistration.ts +350 -0
  292. package/src/local/client/options.ts +526 -0
  293. package/src/local/client/reactiveEngine.ts +935 -0
  294. package/src/local/client/resourceTypes.ts +37 -0
  295. package/src/local/client/schemaConfig.ts +194 -0
  296. package/src/local/client/storeCluster.ts +172 -0
  297. package/src/local/client/storeLifecycle.ts +343 -0
  298. package/src/local/client/validateAbloOptions.ts +95 -0
  299. package/src/local/client/wsMutationExecutor.ts +110 -0
  300. package/src/local/context.ts +96 -0
  301. package/src/local/coordination/ClaimLog.ts +39 -0
  302. package/src/local/interfaces/index.ts +468 -0
  303. package/src/local/localModelContract.ts +15 -0
  304. package/src/local/logPosition.ts +84 -0
  305. package/src/local/mutationPersistence.ts +7 -0
  306. package/src/local/mutators/RecordingMutation.ts +222 -0
  307. package/src/local/mutators/Transaction.ts +97 -0
  308. package/src/local/mutators/UndoManager.ts +741 -0
  309. package/src/local/mutators/defineMutators.ts +76 -0
  310. package/src/local/mutators/inverseOp.ts +83 -0
  311. package/src/local/mutators/mutateActions.ts +167 -0
  312. package/src/local/mutators/readerActions.ts +99 -0
  313. package/src/local/mutators/undoApply.ts +141 -0
  314. package/src/local/persistence.ts +16 -0
  315. package/src/local/query/QueryProcessor.ts +347 -0
  316. package/src/local/query/client.ts +197 -0
  317. package/src/local/query/types.ts +102 -0
  318. package/src/local/schema/serialize.ts +1 -0
  319. package/src/local/store/queryApi.ts +56 -0
  320. package/src/local/storeContract.ts +146 -0
  321. package/src/local/stores/DatabaseManager.ts +507 -0
  322. package/src/local/stores/ObjectStore.ts +449 -0
  323. package/src/local/stores/ObjectStoreContract.ts +48 -0
  324. package/src/local/stores/StoreManager.ts +388 -0
  325. package/src/local/stores/SyncActionStore.ts +579 -0
  326. package/src/local/stores/openIDBWithTimeout.ts +195 -0
  327. package/src/local/stores/persistenceCleanup.ts +43 -0
  328. package/src/local/stores/persistenceIdentity.ts +83 -0
  329. package/src/local/stores/syncAction.ts +21 -0
  330. package/src/local/stores/v1PersistenceDeletion.ts +21 -0
  331. package/src/local/sync/BootstrapFetcher.ts +1224 -0
  332. package/src/local/sync/ConnectionManager.ts +15 -0
  333. package/src/local/sync/OnDemandLoader.ts +927 -0
  334. package/src/local/sync/SubscriptionManager.ts +300 -0
  335. package/src/local/sync/SyncWebSocket.ts +584 -0
  336. package/src/local/sync/bootstrapApply.ts +130 -0
  337. package/src/local/sync/commitFrames.ts +16 -0
  338. package/src/local/sync/connectionManagerLifecycle.ts +158 -0
  339. package/src/local/sync/contextPorts.ts +37 -0
  340. package/src/local/sync/createClaimStream.ts +668 -0
  341. package/src/local/sync/createSnapshot.ts +160 -0
  342. package/src/local/sync/credentialLifecycle.ts +18 -0
  343. package/src/local/sync/deltaPipeline.ts +473 -0
  344. package/src/local/sync/groupChange.ts +343 -0
  345. package/src/local/sync/initialize.ts +205 -0
  346. package/src/local/sync/participants.ts +564 -0
  347. package/src/local/sync/persistedPrefix.ts +27 -0
  348. package/src/local/sync/reconnect.ts +88 -0
  349. package/src/local/sync/schemaDrift.ts +86 -0
  350. package/src/local/sync/schemas.ts +118 -0
  351. package/src/local/sync/socketEventWiring.ts +196 -0
  352. package/src/local/sync/syncCursor.ts +62 -0
  353. package/src/local/sync/syncPlan.ts +89 -0
  354. package/src/local/sync/terminalSessionLifecycle.ts +66 -0
  355. package/src/local/sync/wsFrameHandlers.ts +20 -0
  356. package/src/local/transactions/databaseCommitOutbox.ts +33 -0
  357. package/src/local/transactions/localMutation.ts +58 -0
  358. package/src/local/transactions/mutations/MutationQueue.ts +1998 -0
  359. package/src/local/transactions/mutations/MutationStore.ts +65 -0
  360. package/src/local/transactions/mutations/UnconfirmedWrites.ts +133 -0
  361. package/src/local/transactions/mutations/batchProcessing.ts +469 -0
  362. package/src/local/transactions/mutations/coalesceRules.ts +192 -0
  363. package/src/local/transactions/mutations/commitApi.ts +97 -0
  364. package/src/local/transactions/mutations/commitLane.ts +191 -0
  365. package/src/local/transactions/mutations/commitLatency.ts +164 -0
  366. package/src/local/transactions/mutations/commitPayload.ts +281 -0
  367. package/src/local/transactions/mutations/commitTransport.ts +174 -0
  368. package/src/local/transactions/mutations/deltaConfirmation.ts +298 -0
  369. package/src/local/transactions/mutations/durableCommitRestore.ts +128 -0
  370. package/src/local/transactions/mutations/durableWriteStore.ts +21 -0
  371. package/src/local/transactions/mutations/executionSelection.ts +42 -0
  372. package/src/local/transactions/mutations/failureHandling.ts +154 -0
  373. package/src/local/transactions/mutations/failurePolicy.ts +61 -0
  374. package/src/local/transactions/mutations/localMutation.ts +135 -0
  375. package/src/local/transactions/mutations/modelOperations.ts +210 -0
  376. package/src/local/transactions/mutations/mutationPersistence.ts +231 -0
  377. package/src/local/transactions/mutations/pendingDrain.ts +160 -0
  378. package/src/local/transactions/mutations/processingScheduler.ts +35 -0
  379. package/src/local/transactions/mutations/queueCoalescing.ts +45 -0
  380. package/src/local/transactions/mutations/replayValidation.ts +192 -0
  381. package/src/local/transactions/reconnectDrain.ts +24 -0
  382. package/src/local/utils/mobxSetup.ts +388 -0
  383. package/src/local/views/QueryView.ts +311 -0
  384. package/src/local/views/ViewRegistry.ts +61 -0
  385. package/src/local/views/incrementalView.ts +92 -0
  386. package/src/plugin.ts +396 -0
  387. package/src/presenceStream.ts +279 -0
  388. package/src/react/AbloProvider.tsx +744 -0
  389. package/src/react/ClientSideSuspense.tsx +57 -0
  390. package/src/react/DefaultFallback.tsx +60 -0
  391. package/src/react/context.ts +89 -0
  392. package/src/react/createAbloReact.ts +116 -0
  393. package/src/react/internalContext.ts +38 -0
  394. package/src/react/useAblo.ts +280 -0
  395. package/src/react/useCurrentUserId.ts +17 -0
  396. package/src/react/useErrorListener.ts +22 -0
  397. package/src/react/useMutationFailureListener.ts +34 -0
  398. package/src/react/useMutators.ts +184 -0
  399. package/src/react/useSyncStatus.ts +42 -0
  400. package/src/react/useUndoScope.ts +143 -0
  401. package/src/react.ts +69 -0
  402. package/src/reactRuntime.ts +10 -0
  403. package/src/surface.ts +106 -0
  404. package/src/useReactive.ts +51 -0
@@ -0,0 +1,52 @@
1
+ /**
2
+ * RuntimeContext — Runtime dependency container
3
+ *
4
+ * All SDK classes receive this context at construction time.
5
+ * It bundles every injectable dependency so constructors stay clean.
6
+ */
7
+ import type { Logger, ObservabilityProvider, Analytics, SessionErrorDetector, OnlineStatusProvider, ModelDebugLoggerContract, MutationExecutor, RuntimeConfig } from './interfaces/index.js';
8
+ import type { ModelMetadata } from '@abloatai/transaction/types';
9
+ export interface RuntimeContext {
10
+ /** Structured logger */
11
+ logger: Logger;
12
+ /** Error tracking & performance monitoring */
13
+ observability: ObservabilityProvider;
14
+ /** Product analytics (optional) */
15
+ analytics?: Analytics;
16
+ /** Session error detection for auth redirect decisions */
17
+ sessionErrorDetector: SessionErrorDetector;
18
+ /** Network connectivity detection */
19
+ onlineStatus: OnlineStatusProvider;
20
+ /** Model operation debug logging (optional, dev-only) */
21
+ modelDebugLogger?: ModelDebugLoggerContract;
22
+ /** Backend mutation transport (GraphQL, REST, etc.) */
23
+ mutationExecutor: MutationExecutor;
24
+ /** Application-specific sync configuration */
25
+ config: RuntimeConfig;
26
+ /**
27
+ * Model metadata lookup. Injected by the client (it wires this from its
28
+ * `ModelRegistry`) so the settlement core can resolve a model's metadata
29
+ * without importing the registry — the dependency inversion that keeps the
30
+ * core free of the client's `Model` layer (ADR 0013).
31
+ */
32
+ getModelMetadata: (name: string) => ModelMetadata | undefined;
33
+ }
34
+ export { noopLogger } from '@abloatai/transaction/logger';
35
+ /** No-op observability — silently discards all observability calls */
36
+ export declare const noopObservability: ObservabilityProvider;
37
+ /** No-op analytics — silently discards all analytics calls */
38
+ export declare const noopAnalytics: Analytics;
39
+ /** Browser-native online status provider */
40
+ export declare const browserOnlineStatus: OnlineStatusProvider;
41
+ /** Session error detector — delegates to AbloSessionError so detection is
42
+ * code-aware (only genuine session/JWT expiry counts), not a blunt 401/403. */
43
+ export declare const defaultSessionErrorDetector: SessionErrorDetector;
44
+ /**
45
+ * Fallback config used when the context is read before
46
+ * `createSyncEngine(...)` has initialized it (tests, early-boot code
47
+ * paths). An empty `modelCreatePriority` means every model falls through
48
+ * to `defaultCreatePriority`, so ordering is flat — fine for tests that
49
+ * never exercise FK ordering; consumers who do rely on it should finish
50
+ * wiring the engine before the first `create()` fires.
51
+ */
52
+ export declare const emptyConfig: RuntimeConfig;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * RuntimeContext — Runtime dependency container
3
+ *
4
+ * All SDK classes receive this context at construction time.
5
+ * It bundles every injectable dependency so constructors stay clean.
6
+ */
7
+ import { AbloSessionError } from '@abloatai/transaction/errors';
8
+ // ─────────────────────────────────────────────
9
+ // No-op defaults for optional dependencies
10
+ // ─────────────────────────────────────────────
11
+ // Re-exported, not redeclared. `@abloatai/transaction/logger` owns the no-op that
12
+ // sits beside the `Logger` port. This package held a second, behaviourally
13
+ // identical copy, and half of it imported the canonical one while the other
14
+ // half imported this — so any change of semantics there would have reached
15
+ // only one side, invisibly, because the identifier reads the same at both.
16
+ export { noopLogger } from '@abloatai/transaction/logger';
17
+ /** No-op observability — silently discards all observability calls */
18
+ export const noopObservability = {
19
+ setContext() { },
20
+ setConnectionState() { },
21
+ breadcrumb() { },
22
+ captureRollback() { },
23
+ captureMutationFailure() { },
24
+ captureBootstrapFailure() { },
25
+ captureReconciliation() { },
26
+ captureDeltaRetryExhausted() { },
27
+ captureWebSocketError() { },
28
+ captureSelfHealing() { },
29
+ captureClaim() { },
30
+ captureConflict() { },
31
+ captureCommitZeroSyncId() { },
32
+ startSpan(_name, _op, fn, _attributes) {
33
+ return fn();
34
+ },
35
+ async startSpanAsync(_name, _op, fn, _attributes) {
36
+ return fn();
37
+ },
38
+ };
39
+ /** No-op analytics — silently discards all analytics calls */
40
+ export const noopAnalytics = {
41
+ capture() { },
42
+ };
43
+ /** Browser-native online status provider */
44
+ export const browserOnlineStatus = {
45
+ isOnline() {
46
+ // Only `navigator.onLine === false` is the MDN-reliable "definitely offline"
47
+ // signal. Don't use `!navigator.onLine`: Node 18+ exposes a global
48
+ // `navigator` whose `onLine` is `undefined`, which `!` would read as offline —
49
+ // wedging every Node/server client (agents, worker, MCP) into a false offline.
50
+ return !(typeof navigator !== 'undefined' && navigator.onLine === false);
51
+ },
52
+ };
53
+ /** Session error detector — delegates to AbloSessionError so detection is
54
+ * code-aware (only genuine session/JWT expiry counts), not a blunt 401/403. */
55
+ export const defaultSessionErrorDetector = {
56
+ isSessionError(error) {
57
+ if (error && typeof error === 'object' && 'isSessionError' in error) {
58
+ return error.isSessionError;
59
+ }
60
+ return false;
61
+ },
62
+ isSessionErrorResponse(status, body) {
63
+ return AbloSessionError.isSessionErrorResponse(status, body);
64
+ },
65
+ };
66
+ /**
67
+ * Fallback config used when the context is read before
68
+ * `createSyncEngine(...)` has initialized it (tests, early-boot code
69
+ * paths). An empty `modelCreatePriority` means every model falls through
70
+ * to `defaultCreatePriority`, so ordering is flat — fine for tests that
71
+ * never exercise FK ordering; consumers who do rely on it should finish
72
+ * wiring the engine before the first `create()` fires.
73
+ */
74
+ export const emptyConfig = {
75
+ modelCreatePriority: new Map(),
76
+ defaultCreatePriority: 40,
77
+ defaultNonCreatePriority: 50,
78
+ essentialFields: {},
79
+ classNameFallbackMap: {},
80
+ };
@@ -0,0 +1,516 @@
1
+ /**
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 MutationQueue} that delivers writes
8
+ * over the network.
9
+ */
10
+ import { InstanceCache } from './InstanceCache.js';
11
+ import { Model } from './Model.js';
12
+ import type { AppliedChange } from '../plugin.js';
13
+ import type { RuntimeContext } from './RuntimeContext.js';
14
+ import { EventEmitter } from 'events';
15
+ import { MutationQueue, type QueuedMutation } from './transactions/mutations/MutationQueue.js';
16
+ import { type CommitLatencySample } from './transactions/mutations/commitLatency.js';
17
+ import { type UnconfirmedWritesMetrics } from './transactions/mutations/UnconfirmedWrites.js';
18
+ import type { DurableWriteStore } from './transactions/mutations/durableWriteStore.js';
19
+ import type { Database } from './Database.js';
20
+ import type { WriteOptions } from './interfaces/index.js';
21
+ import { LogPosition } from './logPosition.js';
22
+ interface SyncObserver {
23
+ onSync?: (event: SyncEvent) => void;
24
+ }
25
+ interface SyncEvent {
26
+ type: 'create' | 'update' | 'delete' | 'archive' | 'rollback';
27
+ modelType: string;
28
+ model?: Model;
29
+ modelId?: string;
30
+ transactionType?: string;
31
+ }
32
+ interface SyncState {
33
+ connectionState: 'connected' | 'disconnected' | 'connecting';
34
+ pendingMutations: number;
35
+ lastSyncAt?: Date;
36
+ error?: Error;
37
+ }
38
+ export interface RehydrationStats {
39
+ added: number;
40
+ updated: number;
41
+ removed: number;
42
+ skipped: number;
43
+ healed: number;
44
+ elapsedMs: number;
45
+ }
46
+ export declare class SyncClient extends EventEmitter {
47
+ private readonly runtime;
48
+ private objectPool;
49
+ private database;
50
+ private readonly mutationPersistence;
51
+ private readonly reconnectDrain;
52
+ private get mutationExecutor();
53
+ private networkMonitor;
54
+ /**
55
+ * @internal — test seam, stripped from the published declarations by
56
+ * `stripInternal`. Unit suites deliver queue lifecycle events directly.
57
+ */
58
+ readonly mutationQueue: MutationQueue;
59
+ private observers;
60
+ private userId;
61
+ private organizationId;
62
+ private pendingStages;
63
+ private readonly commitOutboxNamespace;
64
+ /** Compatibility view for diagnostics; transaction state lives in the queue. */
65
+ private get pendingMutations();
66
+ /**
67
+ * Tracks the ids of transactions the client has applied optimistically but
68
+ * the server has not yet confirmed. When a delta arrives, the receive path
69
+ * consults this set to recognize the echo of the client's own mutation and
70
+ * skip the now-redundant pool update; the IndexedDB write still runs,
71
+ * because the delta is the authoritative version of the row. Without this
72
+ * discriminator, an optimistically applied delete followed by a
73
+ * server-confirmed create echo would resurrect the row for the window
74
+ * between the two confirmations.
75
+ *
76
+ * The set is bounded with first-in-first-out eviction, and
77
+ * {@link SyncClient.getEchoMetrics} exposes its counters.
78
+ */
79
+ private readonly echoTracker;
80
+ private connectionState;
81
+ private isDisposed;
82
+ /**
83
+ * The client's position in the global delta order, held as the single
84
+ * canonical {@link LogPosition} instance. The store advances `applied` and
85
+ * `persisted` as deltas land, the queue advances `acked` on commit
86
+ * responses, and snapshots and claims read `readFloor`.
87
+ */
88
+ readonly position: LogPosition;
89
+ constructor(objectPool: InstanceCache, database: Database, commitOutbox?: DurableWriteStore, commitOutboxNamespace?: string, runtime?: RuntimeContext);
90
+ /**
91
+ * Setup network monitoring handlers
92
+ */
93
+ private setupNetworkMonitoring;
94
+ /**
95
+ * Handle transaction rollback. Two distinct shapes flow through this
96
+ * event:
97
+ *
98
+ * 1. **Server-rejected rollback** (`reason === 'permanent_error'`,
99
+ * `'max_retries_exhausted'`, `'conflict_server_wins'`) — the
100
+ * optimistic state is wrong, the row exists, restore previous
101
+ * state and notify the UI.
102
+ *
103
+ * 2. **Local-cancellation cleanup** (`reason === 'model_cancelled'`,
104
+ * `'cascade_parent_deleted'`) — the user deleted this model (or
105
+ * its parent), so a pending UPDATE on it gets cancelled. There's
106
+ * nothing to restore (the model is doomed) and no UI notification
107
+ * needed (the delete itself already triggered re-renders). Just
108
+ * discard the optimistic state silently.
109
+ *
110
+ * Treating both paths the same caused the deletion-flicker bug: every
111
+ * cancelled update on a multi-child record fired a per-model observer
112
+ * event and a `[SyncClient.rollback]` warn, producing N renders and N
113
+ * spam log lines for one user-initiated delete.
114
+ */
115
+ private setupTransactionRollbackHandling;
116
+ /**
117
+ * Forward reconciliation requests from the {@link MutationQueue} to the
118
+ * sync layer. When delta confirmation times out, the queue emits
119
+ * `reconciliation:needed` instead of rolling back, so optimistic state the
120
+ * server may already have committed is never destroyed.
121
+ */
122
+ private setupReconciliationForwarding;
123
+ /**
124
+ * Persist unconfirmed transactions to IndexedDB. When delta-confirmation
125
+ * retries are exhausted, the transaction is cached so it survives a tab
126
+ * close. On the next session, a WebSocket reconnect and delta catch-up
127
+ * deliver the missing deltas and confirm the transaction.
128
+ */
129
+ private setupAwaitingTransactionPersistence;
130
+ /** Persist an unconfirmed transaction to IndexedDB (never rejects — failures are captured). */
131
+ private persistAwaitingTransaction;
132
+ /** Drop the persisted awaiting-row once confirmed (never rejects). */
133
+ private removeAwaitingTransaction;
134
+ /**
135
+ * Initialize sync client with authentication
136
+ */
137
+ initialize(userId: string, organizationId: string): Promise<void>;
138
+ /**
139
+ * The organization this client writes under (set by `initialize`).
140
+ * Read by the model proxy so `create()` defaults `organizationId` the
141
+ * same way the mutator path does — `null` until identity is wired.
142
+ */
143
+ getOrganizationId(): string | null;
144
+ /**
145
+ * Self-healing helper for individual model records.
146
+ *
147
+ * Two registry-driven repair passes run on every row hydrated from
148
+ * IndexedDB or merged from a delta:
149
+ *
150
+ * 1. **Auto-fill** — for each `autoFill` rule the consumer's schema
151
+ * declares on this model, copy the corresponding identity value
152
+ * (`organizationId` / `userId`) onto the row when it's missing.
153
+ * Repairs rows from a past version that didn't write the field.
154
+ *
155
+ * 2. **Required-field gate** — if the row is missing any field listed
156
+ * in the model's `requiredFields`, return `null` so the caller
157
+ * skips this record. Used for FK columns whose absence renders the
158
+ * row unrecoverable (e.g. a Block with no sectionId).
159
+ *
160
+ * The engine itself is product-neutral: model identity (which fields
161
+ * to back-fill, which absences are fatal) lives entirely in the
162
+ * consumer schema.
163
+ */
164
+ healModelRecord(modelType: string, data: Record<string, unknown>): {
165
+ data: Record<string, unknown>;
166
+ healed: boolean;
167
+ } | null;
168
+ /**
169
+ * Hydrate InstanceCache with data from Database
170
+ * Called after bootstrap is complete
171
+ */
172
+ hydrateFromDatabase(): Promise<void>;
173
+ /**
174
+ * Re-hydrate InstanceCache from IndexedDB when the pool already has data.
175
+ *
176
+ * Unlike hydrateFromDatabase() (which uses addBatch and skips existing IDs),
177
+ * this method properly:
178
+ * 1. Upserts models — updates existing models in-place, adds new ones
179
+ * 2. Removes ghosts — deletes models from the pool that no longer exist in IndexedDB
180
+ *
181
+ * Used by background bootstrap, network recovery, and server-triggered re-bootstrap.
182
+ */
183
+ rehydrateFromDatabase(): Promise<RehydrationStats>;
184
+ /**
185
+ * Apply a mutation to a model optimistically and queue it for server sync.
186
+ * IndexedDB is updated only once the server confirms the change with a delta
187
+ * packet.
188
+ *
189
+ * A model's changes are captured before the pool action runs, because a pool
190
+ * operation such as an upsert can clear the model's local change set;
191
+ * capturing first ensures those changes are never lost. The captured set is
192
+ * frozen and handed to {@link queueMutation}.
193
+ */
194
+ private mutate;
195
+ private pendingChangedTypes;
196
+ private markModelChanged;
197
+ /**
198
+ * Capture model changes immutably BEFORE any pool operations
199
+ * This prevents the fragile pattern of reading changes after state modification
200
+ */
201
+ private captureModelChanges;
202
+ /** Add new model (CREATE) - works offline */
203
+ add(model: Model, options?: WriteOptions): void;
204
+ /** Update existing model (UPDATE) - works offline */
205
+ update(model: Model, options?: WriteOptions): void;
206
+ /**
207
+ * Update existing model with pre-computed changes.
208
+ * Used by saveManyOptimized when incoming models have empty change-tracking
209
+ * (e.g. freshly constructed cell models from a bulk document decomposition).
210
+ */
211
+ updateWithChanges(model: Model, changes?: Record<string, unknown>): void;
212
+ /** Expose the GraphQL client for atomic mutations (e.g., createSectionWithBlocks).
213
+ * Used by SyncedStore for operations that bypass the transaction queue
214
+ * but still need optimistic pool updates at the sync layer. */
215
+ get gql(): import("./interfaces/index.js").MutationExecutor;
216
+ /** Delete model (DELETE) - works offline */
217
+ delete(model: Model, options?: WriteOptions): void;
218
+ /**
219
+ * Upload a file and create its attachment record. The upload runs through
220
+ * the {@link MutationQueue}, and a model is built from the server's
221
+ * response and added to the pool.
222
+ */
223
+ uploadFile(file: File, options: {
224
+ id: string;
225
+ attachableType: string;
226
+ attachableId: string;
227
+ metadata?: Record<string, unknown>;
228
+ }): Promise<Model | null>;
229
+ /**
230
+ * Batch upload files — single GraphQL call + parallel S3 PUTs.
231
+ *
232
+ * Returns the raw `Model[]` built by the object pool (typename is
233
+ * determined by the payload the server returns — currently always
234
+ * `Attachment`). The SDK has no knowledge of app-specific model classes,
235
+ * so it cannot honestly claim a narrower return type; consumers that
236
+ * need an `Attachment[]` project through their own typed accessor
237
+ * (e.g. `store.query.attachments.findMany({ where: { id: IN ids } })`)
238
+ * after the upload resolves.
239
+ */
240
+ batchUploadFiles(files: File[], options: {
241
+ ids: string[];
242
+ attachableType: string;
243
+ attachableId: string;
244
+ metadata?: Record<string, unknown>;
245
+ }): Promise<Model[]>;
246
+ /** Archive model (ARCHIVE) - works offline */
247
+ archive(model: Model): void;
248
+ /**
249
+ * Append a mutation to the pending queue and schedule its sync work.
250
+ *
251
+ * IndexedDB persistence and the server push are deferred to a microtask, so
252
+ * many pushes within the same tick collapse into a single serialization and
253
+ * a single process call. Without the deferral, queueing a hundred mutations
254
+ * at once — a large paste, a document import, bulk row creation — would
255
+ * reserialize the whole growing queue a hundred times, an O(N²) cost in
256
+ * `model.toJSON()`.
257
+ *
258
+ * @param mutation.capturedChanges - Pre-captured, frozen changes, used to
259
+ * avoid re-reading a model after pool operations that might clear them.
260
+ */
261
+ /** Stage one mutation through the queue, which owns durability and execution. */
262
+ private stageMutation;
263
+ private scheduleSync;
264
+ processPendingMutations(): Promise<void>;
265
+ /**
266
+ * Resolve a conflict between the local model and incoming server data,
267
+ * called while processing deltas from the WebSocket. Certain server states,
268
+ * such as deletions and deactivations, always take precedence even when the
269
+ * local model has unsynced changes, so the two sides stay consistent.
270
+ */
271
+ resolveConflicts(localModel: Model, serverData: Record<string, unknown>): Model;
272
+ /**
273
+ * Extract the critical state fields from server data. These are the states
274
+ * that must be honored even when the local model has unsynced changes. The
275
+ * conflict resolver reads exactly these fields and no others.
276
+ */
277
+ private extractCriticalState;
278
+ /**
279
+ * Check if critical state changes exist that require forcing server state
280
+ */
281
+ private hasCriticalStateChange;
282
+ /**
283
+ * Handle network reconnection
284
+ */
285
+ private handleReconnection;
286
+ /**
287
+ * Handle network disconnection
288
+ */
289
+ private handleDisconnection;
290
+ /**
291
+ * Get current sync state
292
+ */
293
+ getState(): SyncState;
294
+ /**
295
+ * Set connection state
296
+ */
297
+ private setConnectionState;
298
+ /**
299
+ * Subscribe to events with disposer pattern
300
+ */
301
+ subscribe(event: string, handler: (data?: unknown) => void): () => void;
302
+ /**
303
+ * Add observer for sync events
304
+ */
305
+ addObserver(observer: SyncObserver): void;
306
+ /**
307
+ * Remove observer
308
+ */
309
+ removeObserver(observer: SyncObserver): void;
310
+ /**
311
+ * Notify all observers
312
+ */
313
+ private notifyObservers;
314
+ /**
315
+ * Disconnect from sync
316
+ */
317
+ disconnect(): void;
318
+ /**
319
+ * Mark the sync client as connected
320
+ * Called when WebSocket successfully connects (can happen independently of browser online/offline)
321
+ */
322
+ markConnected(): void;
323
+ private drainPendingSettlements;
324
+ /**
325
+ * Dispose and cleanup
326
+ */
327
+ dispose(): void;
328
+ /**
329
+ * Notify the {@link MutationQueue} of an incoming delta so it can confirm
330
+ * hosted writes by sync-id threshold and queued forwards by their echoed
331
+ * source-batch correlation id.
332
+ * @param syncId - The sync id of the received delta.
333
+ * @param transactionId - Optional server echo of the originating local write.
334
+ * @param correlationId - Opaque batch identity decoded from a source WAL echo.
335
+ */
336
+ onDeltaReceived(syncId: number, transactionId?: string, correlationId?: string): void;
337
+ /**
338
+ * Cancel pending transactions for child entities orphaned by a parent's
339
+ * deletion. The store calls this when a delete delta arrives for a parent,
340
+ * cancelling any queued writes on children that reference it.
341
+ *
342
+ * @param childModelName - The child model type (for example, `Block`).
343
+ * @param foreignKey - The foreign-key property name (for example, `sectionId`).
344
+ * @param parentId - The id of the deleted parent.
345
+ * @returns The number of transactions cancelled.
346
+ */
347
+ cancelTransactionsByForeignKey(childModelName: string, foreignKey: string, parentId: string): number;
348
+ /**
349
+ * Wait for a transaction to be confirmed by its delta echo. Delegates to the
350
+ * {@link MutationQueue}, which handles the confirmation timeout.
351
+ */
352
+ waitForDeltaConfirmation(transactionId: string): Promise<void>;
353
+ /**
354
+ * Force sync now - process pending mutations
355
+ */
356
+ syncNow(): Promise<void>;
357
+ /**
358
+ * Get sync statistics. Return type is inferred from the literal so
359
+ * the call site sees the actual shape — `connectionState` narrowed
360
+ * to its three states, `objectPoolStats` typed by `InstanceCache.getStats`.
361
+ */
362
+ getSyncStats(): {
363
+ connectionState: 'connected' | 'disconnected' | 'connecting';
364
+ pendingMutations: number;
365
+ objectPoolStats: ReturnType<InstanceCache['getStats']>;
366
+ };
367
+ /**
368
+ * Get pending transaction count from MutationQueue
369
+ * Used by SyncedStore to compute hasUnsyncedChanges
370
+ */
371
+ getPendingTransactionCount(): number;
372
+ /**
373
+ * Subscribe to transaction events for sync status tracking
374
+ * Returns unsubscribe function
375
+ */
376
+ onTransactionEvent(event: 'created' | 'completed' | 'failed', callback: () => void): () => void;
377
+ /**
378
+ * Subscribe to mutation failures with the full payload. Mirrors the
379
+ * underlying MutationQueue 'transaction:failed' shape so consumers
380
+ * can render typed UI (toast keyed by `AbloError.type`, route-level
381
+ * "this entity reverted" boundaries, telemetry).
382
+ *
383
+ * Distinct from `onTransactionEvent('failed', cb)`, which serves the
384
+ * parameterless `pendingChanges` counter and intentionally drops the
385
+ * payload. The two coexist: the counter callback stays lightweight, while
386
+ * this typed listener drives user-visible surfaces.
387
+ */
388
+ onMutationFailure(listener: (payload: {
389
+ transaction: QueuedMutation;
390
+ error: Error;
391
+ permanent?: boolean;
392
+ }) => void): () => void;
393
+ /**
394
+ * Subscribe to commit round-trip latency, split into the local seal and the
395
+ * remote acknowledgement. Fires once per completed commit.
396
+ *
397
+ * Taps the {@link MutationQueue} emitter for the same reason
398
+ * {@link onMutationFailure} does: the commit lifecycle events originate
399
+ * there and the SyncClient's own emitter never rebroadcasts them.
400
+ */
401
+ onCommitLatency(listener: (sample: CommitLatencySample) => void): () => void;
402
+ /**
403
+ * Subscribe to local transaction creation with the full {@link QueuedMutation}
404
+ * payload (`type`, `modelName`, `modelId`, `data`, `previousData`). This is
405
+ * the feed the store's local-mutation subscription taps for undo recording.
406
+ *
407
+ * It subscribes to the {@link MutationQueue}'s emitter directly, since
408
+ * that is the only emitter that fires `transaction:created`. The SyncClient's
409
+ * own emitter (reached through {@link subscribe}) never rebroadcasts that
410
+ * event, so routing undo through `subscribe('transaction:created')` would
411
+ * record nothing. {@link onMutationFailure} taps the queue for the same
412
+ * reason.
413
+ */
414
+ onLocalTransaction(listener: (tx: QueuedMutation) => void): () => void;
415
+ /**
416
+ * Wait for the latest in-flight transaction for (modelName, modelId)
417
+ * to be confirmed by the server, or reject if it's rolled back.
418
+ * Resolves immediately when no transaction is in flight — see
419
+ * `MutationQueue.confirmationFor` for the lookup contract.
420
+ *
421
+ * Distinct from `waitForDeltaConfirmation(transactionId)` which keys
422
+ * off a known tx id; this variant is for call sites that hold a
423
+ * Model reference but never see the underlying transaction.
424
+ */
425
+ waitForConfirmation(modelName: string, modelId: string): Promise<void>;
426
+ /**
427
+ * Get detailed debug info for the sync debug page
428
+ */
429
+ getDebugInfo(): {
430
+ connectionState: "connected" | "disconnected" | "connecting";
431
+ pendingMutationsCount: number;
432
+ mutationQueue: {
433
+ lastSeenSyncId: number;
434
+ awaitingDeltaCount: number;
435
+ awaitingDeltaTransactions: {
436
+ id: string;
437
+ type: "update" | "create" | "delete" | "archive" | "unarchive";
438
+ modelName: string;
439
+ modelId: string;
440
+ syncIdNeeded: number | undefined;
441
+ createdAt: number;
442
+ age: number;
443
+ }[];
444
+ pendingTransactions: {
445
+ id: string;
446
+ type: "update" | "create" | "delete" | "archive" | "unarchive";
447
+ modelName: string;
448
+ modelId: string;
449
+ }[];
450
+ executingTransactions: {
451
+ id: string;
452
+ type: "update" | "create" | "delete" | "archive" | "unarchive";
453
+ modelName: string;
454
+ modelId: string;
455
+ }[];
456
+ };
457
+ };
458
+ unassignEntity(entityType: string, entityId: string): Promise<void>;
459
+ reassignEntity(entityType: string, entityId: string, assigneeType: string, assigneeId: string, id?: string): Promise<void>;
460
+ /**
461
+ * Apply a batch of delta results from Database to the InstanceCache.
462
+ * Owns: model creation, upsert, remove, archive, conflict resolution.
463
+ * Returns: nothing — InstanceCache is updated in place.
464
+ */
465
+ /**
466
+ * Mark a local transaction as optimistically applied. The matching
467
+ * server delta (when it arrives with the same `transactionId`) will
468
+ * be recognized as an echo and skip the pool mutation. Called
469
+ * automatically by `MutationQueue` when a transaction is staged;
470
+ * exposed publicly so tests can drive the API directly.
471
+ */
472
+ markTransactionPending(transactionId: string): void;
473
+ /**
474
+ * Read echo-detection counters: hits, rollbacks, evictions, and the
475
+ * current pending-set size. Surfaced for production observability
476
+ * — a sustained `evictions > 0` rate or `rollbacks` spike is a
477
+ * health signal worth alerting on.
478
+ */
479
+ getEchoMetrics(): Readonly<UnconfirmedWritesMetrics>;
480
+ /**
481
+ * Package-internal accessor for the {@link MutationQueue}. Used by
482
+ * `Ablo.commits.create()` to route raw multi-operation envelopes through the
483
+ * same retry-on-reconnect lane as the model proxy path, and by tests to
484
+ * exercise the queue's interaction with {@link markTransactionPending} on the
485
+ * real instance the SyncClient subscribes to. It is not re-exported to SDK
486
+ * consumers; `Ablo` is the public surface.
487
+ */
488
+ getMutationQueue(): MutationQueue;
489
+ applyDeltaBatchToPool(dbResults: readonly AppliedChange[], enrichRelations: (modelName: string, data: Record<string, unknown>) => Record<string, unknown>): void;
490
+ /**
491
+ * Apply bootstrap data to the InstanceCache with ghost removal.
492
+ * Owns: model creation, batch upsert, ghost detection + removal.
493
+ */
494
+ applyBootstrapDataToPool(bootstrapData: {
495
+ models?: Record<string, unknown[]>;
496
+ failedModels?: string[];
497
+ }, protectedIds?: ReadonlySet<string>, options?: {
498
+ /**
499
+ * Scoped backfill for the hydrate-on-enter path: the snapshot covers only
500
+ * the groups just entered, not the whole model type. Two behaviors change
501
+ * so the subset cannot corrupt the pool. First, the upsert is
502
+ * version-guarded ({@link InstanceCache.upsertIfNewer}) so a concurrent live
503
+ * delta is not clobbered back to the snapshot version. Second, ghost
504
+ * removal is skipped, because a subset snapshot must never evict rows of
505
+ * the same type that belong to other, unhydrated groups.
506
+ */
507
+ scoped?: boolean;
508
+ }): {
509
+ added: number;
510
+ updated: number;
511
+ removed: number;
512
+ skipped: number;
513
+ healed: number;
514
+ };
515
+ }
516
+ export {};