@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
package/dist/Model.d.ts CHANGED
@@ -1,16 +1,10 @@
1
1
  /**
2
- * Model - Clean base class for domain models
3
- *
4
- * Models are pure domain objects that:
5
- * - Hold data and business logic
6
- * - Track their own changes
7
- * - Validate themselves
8
- * - Return updates/changes (not perform them)
9
- *
10
- * Models do NOT:
11
- * - Access stores or singletons
12
- * - Perform side effects (saving, notifications)
13
- * - Know about sync infrastructure
2
+ * Model is the base class for the sync engine's domain models. A model is a
3
+ * plain domain object: it holds data and business logic, tracks its own
4
+ * property changes, and validates itself, and it returns the changes to apply
5
+ * rather than applying them. It does not reach into stores or singletons and
6
+ * does not perform side effects such as saving or sending notifications;
7
+ * persistence and sync are driven by the store that owns the model.
14
8
  */
15
9
  /** Store interface — methods that Model subclasses can call on the store */
16
10
  interface SyncStoreRef {
@@ -67,9 +61,10 @@ export interface ModelChanges {
67
61
  timestamp: Date;
68
62
  }
69
63
  /**
70
- * Abstract Model - Base class for all domain models
71
- *
72
- * Pure domain object with no external dependencies
64
+ * The abstract base class every domain model extends. It holds the model's id
65
+ * and timestamps, tracks in-place property changes for change detection and
66
+ * undo, and serializes itself, while leaving persistence and sync to the store
67
+ * that owns it.
73
68
  */
74
69
  export declare abstract class Model {
75
70
  /** Static reference to active SyncedStore for reactive queries */
@@ -156,27 +151,17 @@ export declare abstract class Model {
156
151
  */
157
152
  isNew(): boolean;
158
153
  /**
159
- * Read-only view of the snapshot taken at `markAsPersisted()` /
160
- * load. Used by recording-transaction undo to derive a pre-session
161
- * baseline for fields that weren't yet pre-mutated (so
162
- * `modifiedProperties` has no entry for them). Returns the same
163
- * underlying object — callers must not mutate it.
164
- *
165
- * Architectural note: this method exists because we allow direct
166
- * property writes (`slide.title = 'foo'`) AND mutator-recorded
167
- * writes to coexist. Zero / Replicache structurally avoids this:
168
- * every mutation MUST go through a registered mutator function,
169
- * mutator args are serialized, and on server pull all unacked
170
- * mutations are dropped and the mutator functions are replayed on
171
- * the new basis (rebase). That makes per-instance baselines
172
- * unnecessary because the b-tree at the new basis IS the
173
- * authoritative pre-session state.
154
+ * Return a read-only view of the snapshot taken at {@link markAsPersisted}
155
+ * or at load time. The undo machinery uses it to recover a field's pre-edit
156
+ * value when the field was written without first being tracked in
157
+ * `modifiedProperties`. The returned object is the live snapshot, so callers
158
+ * must not mutate it.
174
159
  *
175
- * If we ever migrate to "mutators are the only write path," this
176
- * snapshot field, `_originalData`, and most of
177
- * `RecordingTransaction.snapshotFields` become dead code. See
178
- * `packages/replicache/src/db/rebase.ts` (rocicorp/mono) for the
179
- * pattern.
160
+ * This per-instance baseline is needed because application code can edit a
161
+ * model in two ways that coexist: a direct property write
162
+ * (`slide.title = 'foo'`) and a recorded mutation. A design in which every
163
+ * write went through a single recorded path would not need it, since the
164
+ * last acknowledged state would already be the authoritative baseline.
180
165
  */
181
166
  getOriginalSnapshot(): Readonly<ModelData> | undefined;
182
167
  /**
@@ -184,7 +169,7 @@ export declare abstract class Model {
184
169
  */
185
170
  clearChanges(): void;
186
171
  /**
187
- * Capture a before-image for `keys` — the SINGLE source of truth for the
172
+ * Capture a before-image for `keys` — the single source of truth for the
188
173
  * "previous value" that undo inverses are built from. Both undo paths call
189
174
  * this so they can never drift: the stream path
190
175
  * (`TransactionQueue.extractPreviousData`) and the manual-record path
@@ -194,10 +179,10 @@ export declare abstract class Model {
194
179
  * 1. `modifiedProperties.get(key).old` — first-old-wins pre-session
195
180
  * baseline, set whenever the field was mutated in place before commit.
196
181
  * 2. `getOriginalSnapshot()[key]` — the last loaded/acked row, the correct
197
- * before-image for a key written WITHOUT a prior in-place mutation
182
+ * before-image for a key written without a prior in-place mutation
198
183
  * (e.g. a `precomputedChanges` write).
199
184
  * 3. `fallbackToLive` only — the current live value. The manual-record path
200
- * wants this last resort; the stream path deliberately OMITS unresolved
185
+ * wants this last resort; the stream path deliberately omits unresolved
201
186
  * keys so `buildUndoOps` drops an un-revertible inverse rather than
202
187
  * inventing one. The flag is the one intentional difference between the
203
188
  * two callers — do not collapse it.
@@ -205,8 +190,8 @@ export declare abstract class Model {
205
190
  * `id` is always skipped. Values are read out per-key, so the
206
191
  * `getOriginalSnapshot()` "callers must not mutate" contract is preserved.
207
192
  *
208
- * Invariant this relies on: a given undo scope is EITHER stream-recorded
209
- * (`recordFromStream: true`) OR manual (`useMutators({ undoScope })`), never
193
+ * Invariant this relies on: a given undo scope is either stream-recorded
194
+ * (`recordFromStream: true`) or manual (`useMutators({ undoScope })`), never
210
195
  * both — otherwise a write would be captured twice. No surface sets both.
211
196
  */
212
197
  capturePreviousValues(keys: Iterable<string>, opts?: {
@@ -214,7 +199,7 @@ export declare abstract class Model {
214
199
  }): ModelData;
215
200
  /**
216
201
  * Drop the `modifiedProperties` entries for `keys` — re-baselines a field
217
- * after its `.old` has been frozen into a committed transaction, so the NEXT
202
+ * after its `.old` has been frozen into a committed transaction, so the next
218
203
  * write to the same field starts from this commit's result rather than the
219
204
  * stale pre-session `.old` that {@link propertyChanged}'s first-old-wins
220
205
  * policy preserves. Safe because the committed transaction owns its own
@@ -257,7 +242,7 @@ export declare abstract class Model {
257
242
  * properties, and coercing date fields. Shared by `updateFromData`
258
243
  * (hydration) and `applyChanges` (local user update).
259
244
  *
260
- * Change tracking is EXPLICIT, not magic: for every field actually
245
+ * Change tracking is explicit: for every field actually
261
246
  * written, `onWrite(key, oldValue, newValue)` is invoked with the value
262
247
  * captured immediately before assignment. `applyChanges` passes a hook
263
248
  * that records the change in `modifiedProperties`; `updateFromData`
@@ -270,10 +255,10 @@ export declare abstract class Model {
270
255
  * Update from raw data (hydration)
271
256
  *
272
257
  * Used for inbound server deltas and pool upserts. Change tracking is
273
- * deliberately suppressed: hydration writes must NOT land in
258
+ * deliberately suppressed: hydration writes must not land in
274
259
  * `modifiedProperties`, otherwise applying a server delta would queue a
275
260
  * brand-new outbound mutation and the record would echo forever. For a
276
- * LOCAL user edit, use `applyChanges` instead.
261
+ * local user edit, use `applyChanges` instead.
277
262
  *
278
263
  * Suppression is belt-and-suspenders: we pass no `onWrite` hook AND
279
264
  * clear/restore `modifiedProperties` around the assignment, so any
@@ -282,18 +267,18 @@ export declare abstract class Model {
282
267
  */
283
268
  updateFromData(data: ModelData): void;
284
269
  /**
285
- * Apply a LOCAL user-initiated update from a data object — the write
286
- * path for `proxy.update({ id, data })`, which is the ONE AND ONLY way
270
+ * Apply a local, user-initiated update from a data object — the write
271
+ * path for `proxy.update({ id, data })`, which is the one and only way
287
272
  * application code mutates synced fields.
288
273
  *
289
274
  * Unlike `updateFromData` (hydration, untracked), this records every
290
275
  * written field in `modifiedProperties` via `propertyChanged`, so
291
- * `getChanges()` / the transaction queue send the edited fields to the
292
- * server and the undo system gets a correct pre-write baseline.
293
- * Recording is EXPLICIT here (via the `onWrite` hook) it does not rely
294
- * on any MobX `observe()` side-channel.
276
+ * `getChanges()` and the transaction queue send the edited fields to the
277
+ * server and the undo system gets a correct pre-write baseline. Recording
278
+ * is explicit here, through the `onWrite` hook, and does not rely on any
279
+ * MobX `observe()` side channel.
295
280
  *
296
- * `_originalData` is intentionally NOT reset here: it stays as the
281
+ * `_originalData` is intentionally not reset here: it stays as the
297
282
  * last-persisted baseline until `clearChanges()` runs on sync-ack.
298
283
  */
299
284
  applyChanges(data: ModelData): void;
@@ -335,7 +320,7 @@ export declare abstract class Model {
335
320
  _unregisterObservedCollection(collection: Disposable): void;
336
321
  /**
337
322
  * Check if any collection on this model is currently being observed by React
338
- * Used by ObjectPool GC to prevent disposing models in active use
323
+ * Used by InstanceCache GC to prevent disposing models in active use
339
324
  */
340
325
  hasObservedCollections(): boolean;
341
326
  /**
package/dist/Model.js CHANGED
@@ -1,20 +1,14 @@
1
1
  /**
2
- * Model - Clean base class for domain models
3
- *
4
- * Models are pure domain objects that:
5
- * - Hold data and business logic
6
- * - Track their own changes
7
- * - Validate themselves
8
- * - Return updates/changes (not perform them)
9
- *
10
- * Models do NOT:
11
- * - Access stores or singletons
12
- * - Perform side effects (saving, notifications)
13
- * - Know about sync infrastructure
2
+ * Model is the base class for the sync engine's domain models. A model is a
3
+ * plain domain object: it holds data and business logic, tracks its own
4
+ * property changes, and validates itself, and it returns the changes to apply
5
+ * rather than applying them. It does not reach into stores or singletons and
6
+ * does not perform side effects such as saving or sending notifications;
7
+ * persistence and sync are driven by the store that owns the model.
14
8
  */
15
9
  import { runInAction, isComputedProp } from 'mobx';
16
10
  import { v4 as uuid } from 'uuid';
17
- import { M1 } from './utils/mobx-setup.js';
11
+ import { M1 } from './utils/mobxSetup.js';
18
12
  import { getActiveRegistry, hasActiveRegistry } from './ModelRegistry.js';
19
13
  import { getContext } from './context.js';
20
14
  import { AbloValidationError } from './errors.js';
@@ -30,9 +24,10 @@ export class ValidationError extends Error {
30
24
  }
31
25
  }
32
26
  /**
33
- * Abstract Model - Base class for all domain models
34
- *
35
- * Pure domain object with no external dependencies
27
+ * The abstract base class every domain model extends. It holds the model's id
28
+ * and timestamps, tracks in-place property changes for change detection and
29
+ * undo, and serializes itself, while leaving persistence and sync to the store
30
+ * that owns it.
36
31
  */
37
32
  export class Model {
38
33
  /** Static reference to active SyncedStore for reactive queries */
@@ -70,7 +65,7 @@ export class Model {
70
65
  _observedCollections = new Set();
71
66
  constructor(data = {}) {
72
67
  // Always generate permanent UUID on client
73
- this.id = data.id || Model.generateId();
68
+ this.id = data.id ?? Model.generateId();
74
69
  this.clientId = this.id; // No more temp IDs!
75
70
  // Ensure dates are Date objects, not strings
76
71
  this.createdAt = data.createdAt
@@ -91,7 +86,7 @@ export class Model {
91
86
  : data.createdAt
92
87
  ? new Date(this.createdAt)
93
88
  : new Date();
94
- this.syncStatus = data.syncStatus || 'pending';
89
+ this.syncStatus = data.syncStatus ?? 'pending';
95
90
  }
96
91
  /**
97
92
  * Generate unique ID
@@ -189,27 +184,17 @@ export class Model {
189
184
  return this._isNew;
190
185
  }
191
186
  /**
192
- * Read-only view of the snapshot taken at `markAsPersisted()` /
193
- * load. Used by recording-transaction undo to derive a pre-session
194
- * baseline for fields that weren't yet pre-mutated (so
195
- * `modifiedProperties` has no entry for them). Returns the same
196
- * underlying object — callers must not mutate it.
187
+ * Return a read-only view of the snapshot taken at {@link markAsPersisted}
188
+ * or at load time. The undo machinery uses it to recover a field's pre-edit
189
+ * value when the field was written without first being tracked in
190
+ * `modifiedProperties`. The returned object is the live snapshot, so callers
191
+ * must not mutate it.
197
192
  *
198
- * Architectural note: this method exists because we allow direct
199
- * property writes (`slide.title = 'foo'`) AND mutator-recorded
200
- * writes to coexist. Zero / Replicache structurally avoids this:
201
- * every mutation MUST go through a registered mutator function,
202
- * mutator args are serialized, and on server pull all unacked
203
- * mutations are dropped and the mutator functions are replayed on
204
- * the new basis (rebase). That makes per-instance baselines
205
- * unnecessary because the b-tree at the new basis IS the
206
- * authoritative pre-session state.
207
- *
208
- * If we ever migrate to "mutators are the only write path," this
209
- * snapshot field, `_originalData`, and most of
210
- * `RecordingTransaction.snapshotFields` become dead code. See
211
- * `packages/replicache/src/db/rebase.ts` (rocicorp/mono) for the
212
- * pattern.
193
+ * This per-instance baseline is needed because application code can edit a
194
+ * model in two ways that coexist: a direct property write
195
+ * (`slide.title = 'foo'`) and a recorded mutation. A design in which every
196
+ * write went through a single recorded path would not need it, since the
197
+ * last acknowledged state would already be the authoritative baseline.
213
198
  */
214
199
  getOriginalSnapshot() {
215
200
  return this._originalData;
@@ -224,7 +209,7 @@ export class Model {
224
209
  });
225
210
  }
226
211
  /**
227
- * Capture a before-image for `keys` — the SINGLE source of truth for the
212
+ * Capture a before-image for `keys` — the single source of truth for the
228
213
  * "previous value" that undo inverses are built from. Both undo paths call
229
214
  * this so they can never drift: the stream path
230
215
  * (`TransactionQueue.extractPreviousData`) and the manual-record path
@@ -234,10 +219,10 @@ export class Model {
234
219
  * 1. `modifiedProperties.get(key).old` — first-old-wins pre-session
235
220
  * baseline, set whenever the field was mutated in place before commit.
236
221
  * 2. `getOriginalSnapshot()[key]` — the last loaded/acked row, the correct
237
- * before-image for a key written WITHOUT a prior in-place mutation
222
+ * before-image for a key written without a prior in-place mutation
238
223
  * (e.g. a `precomputedChanges` write).
239
224
  * 3. `fallbackToLive` only — the current live value. The manual-record path
240
- * wants this last resort; the stream path deliberately OMITS unresolved
225
+ * wants this last resort; the stream path deliberately omits unresolved
241
226
  * keys so `buildUndoOps` drops an un-revertible inverse rather than
242
227
  * inventing one. The flag is the one intentional difference between the
243
228
  * two callers — do not collapse it.
@@ -245,8 +230,8 @@ export class Model {
245
230
  * `id` is always skipped. Values are read out per-key, so the
246
231
  * `getOriginalSnapshot()` "callers must not mutate" contract is preserved.
247
232
  *
248
- * Invariant this relies on: a given undo scope is EITHER stream-recorded
249
- * (`recordFromStream: true`) OR manual (`useMutators({ undoScope })`), never
233
+ * Invariant this relies on: a given undo scope is either stream-recorded
234
+ * (`recordFromStream: true`) or manual (`useMutators({ undoScope })`), never
250
235
  * both — otherwise a write would be captured twice. No surface sets both.
251
236
  */
252
237
  capturePreviousValues(keys, opts) {
@@ -271,7 +256,7 @@ export class Model {
271
256
  }
272
257
  /**
273
258
  * Drop the `modifiedProperties` entries for `keys` — re-baselines a field
274
- * after its `.old` has been frozen into a committed transaction, so the NEXT
259
+ * after its `.old` has been frozen into a committed transaction, so the next
275
260
  * write to the same field starts from this commit's result rather than the
276
261
  * stale pre-session `.old` that {@link propertyChanged}'s first-old-wins
277
262
  * policy preserves. Safe because the committed transaction owns its own
@@ -340,9 +325,7 @@ export class Model {
340
325
  * Add validation rule
341
326
  */
342
327
  addValidationRule(propName, rule) {
343
- if (!this.validationRules[propName]) {
344
- this.validationRules[propName] = [];
345
- }
328
+ this.validationRules[propName] ??= [];
346
329
  this.validationRules[propName].push(rule);
347
330
  }
348
331
  /**
@@ -364,7 +347,7 @@ export class Model {
364
347
  // New model - return create operation
365
348
  return {
366
349
  type: 'create',
367
- modelName: this.getModelName(), // Use Prisma model name
350
+ modelName: this.getModelName(), // the registered model name
368
351
  modelId: this.id,
369
352
  timestamp: new Date(),
370
353
  };
@@ -373,7 +356,7 @@ export class Model {
373
356
  // Existing model with changes - return update operation
374
357
  return {
375
358
  type: 'update',
376
- modelName: this.getModelName(), // Use Prisma model name
359
+ modelName: this.getModelName(), // the registered model name
377
360
  modelId: this.id,
378
361
  changes: new Map(this.modifiedProperties),
379
362
  timestamp: new Date(),
@@ -394,7 +377,7 @@ export class Model {
394
377
  this.willDelete();
395
378
  return {
396
379
  type: 'delete',
397
- modelName: this.getModelName(), // Use Prisma model name
380
+ modelName: this.getModelName(), // the registered model name
398
381
  modelId: this.id,
399
382
  timestamp: new Date(),
400
383
  };
@@ -411,7 +394,7 @@ export class Model {
411
394
  this.archivedAt = new Date();
412
395
  return {
413
396
  type: 'archive',
414
- modelName: this.getModelName(), // Use Prisma model name
397
+ modelName: this.getModelName(), // the registered model name
415
398
  modelId: this.id,
416
399
  timestamp: new Date(),
417
400
  };
@@ -428,7 +411,7 @@ export class Model {
428
411
  this.archivedAt = null;
429
412
  return {
430
413
  type: 'unarchive',
431
- modelName: this.getModelName(), // Use Prisma model name
414
+ modelName: this.getModelName(), // the registered model name
432
415
  modelId: this.id,
433
416
  timestamp: new Date(),
434
417
  };
@@ -439,7 +422,7 @@ export class Model {
439
422
  * properties, and coercing date fields. Shared by `updateFromData`
440
423
  * (hydration) and `applyChanges` (local user update).
441
424
  *
442
- * Change tracking is EXPLICIT, not magic: for every field actually
425
+ * Change tracking is explicit: for every field actually
443
426
  * written, `onWrite(key, oldValue, newValue)` is invoked with the value
444
427
  * captured immediately before assignment. `applyChanges` passes a hook
445
428
  * that records the change in `modifiedProperties`; `updateFromData`
@@ -499,10 +482,10 @@ export class Model {
499
482
  * Update from raw data (hydration)
500
483
  *
501
484
  * Used for inbound server deltas and pool upserts. Change tracking is
502
- * deliberately suppressed: hydration writes must NOT land in
485
+ * deliberately suppressed: hydration writes must not land in
503
486
  * `modifiedProperties`, otherwise applying a server delta would queue a
504
487
  * brand-new outbound mutation and the record would echo forever. For a
505
- * LOCAL user edit, use `applyChanges` instead.
488
+ * local user edit, use `applyChanges` instead.
506
489
  *
507
490
  * Suppression is belt-and-suspenders: we pass no `onWrite` hook AND
508
491
  * clear/restore `modifiedProperties` around the assignment, so any
@@ -529,18 +512,18 @@ export class Model {
529
512
  this.didUpdate();
530
513
  }
531
514
  /**
532
- * Apply a LOCAL user-initiated update from a data object — the write
533
- * path for `proxy.update({ id, data })`, which is the ONE AND ONLY way
515
+ * Apply a local, user-initiated update from a data object — the write
516
+ * path for `proxy.update({ id, data })`, which is the one and only way
534
517
  * application code mutates synced fields.
535
518
  *
536
519
  * Unlike `updateFromData` (hydration, untracked), this records every
537
520
  * written field in `modifiedProperties` via `propertyChanged`, so
538
- * `getChanges()` / the transaction queue send the edited fields to the
539
- * server and the undo system gets a correct pre-write baseline.
540
- * Recording is EXPLICIT here (via the `onWrite` hook) it does not rely
541
- * on any MobX `observe()` side-channel.
521
+ * `getChanges()` and the transaction queue send the edited fields to the
522
+ * server and the undo system gets a correct pre-write baseline. Recording
523
+ * is explicit here, through the `onWrite` hook, and does not rely on any
524
+ * MobX `observe()` side channel.
542
525
  *
543
- * `_originalData` is intentionally NOT reset here: it stays as the
526
+ * `_originalData` is intentionally not reset here: it stays as the
544
527
  * last-persisted baseline until `clearChanges()` runs on sync-ack.
545
528
  */
546
529
  applyChanges(data) {
@@ -566,8 +549,8 @@ export class Model {
566
549
  const modelName = this.getModelName();
567
550
  const properties = getActiveRegistry().getProperties(modelName);
568
551
  const result = {
569
- __class: this.getModelName(), // Use Prisma model name for consistency
570
- __typename: this.getModelName(), // Also add __typename for GraphQL compatibility
552
+ __class: this.getModelName(), // the registered model name for consistency
553
+ __typename: this.getModelName(), // __typename mirrors __class as the wire type discriminator
571
554
  id: this.id,
572
555
  createdAt: this.createdAt?.toISOString(),
573
556
  updatedAt: this.updatedAt?.toISOString(),
@@ -575,7 +558,7 @@ export class Model {
575
558
  syncStatus: this.syncStatus,
576
559
  };
577
560
  if (this.archivedAt !== undefined) {
578
- result.archivedAt = this.archivedAt?.toISOString() || null;
561
+ result.archivedAt = this.archivedAt?.toISOString() ?? null;
579
562
  }
580
563
  if (properties) {
581
564
  const self = this;
@@ -616,7 +599,7 @@ export class Model {
616
599
  const className = this.constructor.name;
617
600
  // Use consumer-provided fallback map from config (replaces hardcoded Prisma name map)
618
601
  const fallbackMap = getContext().config.classNameFallbackMap;
619
- return fallbackMap[className] || className.replace(/Model$/, '');
602
+ return fallbackMap[className] ?? className.replace(/Model$/, '');
620
603
  }
621
604
  /**
622
605
  * Read a field value by name. Runtime-safe dynamic field access —
@@ -658,7 +641,7 @@ export class Model {
658
641
  }
659
642
  /**
660
643
  * Check if any collection on this model is currently being observed by React
661
- * Used by ObjectPool GC to prevent disposing models in active use
644
+ * Used by InstanceCache GC to prevent disposing models in active use
662
645
  */
663
646
  hasObservedCollections() {
664
647
  return this._observedCollections.size > 0;
@@ -809,13 +792,13 @@ export class Model {
809
792
  */
810
793
  static fromJSON(data) {
811
794
  // Support both __class and __typename, and handle both old and new naming
812
- const modelIdentifier = data.__typename || data.__class || data.modelName;
795
+ const modelIdentifier = data.__typename ?? data.__class ?? data.modelName;
813
796
  if (!modelIdentifier) {
814
797
  throw new AbloValidationError('Model identifier (__typename, __class, or modelName) not found in data', { code: 'model_identifier_missing' });
815
798
  }
816
799
  // Try to get model class by identifier
817
800
  let ModelClass = getActiveRegistry().getModelByName(modelIdentifier);
818
- // If not found with Prisma name, try mapping to class name
801
+ // If not found by registered name, try mapping to the class name
819
802
  if (!ModelClass) {
820
803
  const classNameMap = {
821
804
  Task: 'TaskModel',
@@ -1,17 +1,35 @@
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
- import { ModelMetadata, PropertyMetadata, ReferenceMetadata, LoadStrategy } from './types/index.js';
10
+ import { type ModelMetadata, type PropertyMetadata, type ReferenceMetadata, LoadStrategy } from './types/index.js';
11
+ import type { Model } from './Model.js';
12
+ import type { ConcreteModelConstructor } from './BaseSyncedStore.js';
13
13
  /**
14
- * Extended ReferenceMetadata with additional Linear-style options
14
+ * What callers may hand to {@link ModelRegistry.registerModel}: any concrete
15
+ * `Model` subclass constructor. `never[]` params make every subclass
16
+ * constructor assignable (construct-signature params are contravariant).
17
+ */
18
+ export type ModelClassInput = new (...args: never[]) => Model;
19
+ /**
20
+ * What the registry hands BACK: a registered model class — concretely
21
+ * constructible with an optional data row (`ConcreteModelConstructor`, the
22
+ * SDK's existing Model-vs-row construction seam) and carrying `Model`'s
23
+ * statics (`fromJSON`, …). `Omit<typeof Model, never>` keeps the statics
24
+ * while stripping the ABSTRACT construct signature (mapped types drop
25
+ * construct signatures), so `new registry.getModelByName(n)!(...)` is legal.
26
+ * The one cast from {@link ModelClassInput} lives at the validated
27
+ * registration boundary below.
28
+ */
29
+ export type RegisteredModelClass = Omit<typeof Model, never> & ConcreteModelConstructor<Model>;
30
+ /**
31
+ * {@link ReferenceMetadata} extended with cascade behavior: what happens to a
32
+ * referencing model when the referenced model is deleted or archived.
15
33
  */
16
34
  export interface ExtendedReferenceMetadata extends ReferenceMetadata {
17
35
  onDelete?: 'cascade' | 'nullify' | 'restrict';
@@ -28,8 +46,9 @@ export interface SerializedReferenceMetadata extends Omit<ExtendedReferenceMetad
28
46
  referencedModel: string;
29
47
  }
30
48
  /**
31
- * BackReference metadata for cascade-aware transaction handling
32
- * Linear pattern: When parent is deleted, cancel pending transactions for children
49
+ * Metadata that records a child model's foreign key to a parent model, used
50
+ * for cascade-aware transaction handling: when the parent is deleted, the
51
+ * child's pending transactions can be cancelled.
33
52
  */
34
53
  export interface BackReferenceMetadata {
35
54
  /** The parent model name (e.g., 'SlideDeck') */
@@ -62,7 +81,6 @@ export declare class ModelRegistry {
62
81
  private schemaHash?;
63
82
  private config;
64
83
  private registeredModels;
65
- private batchMode;
66
84
  private pendingHashUpdate;
67
85
  constructor(config?: RegistryConfig);
68
86
  private validateModelConstructor;
@@ -73,7 +91,7 @@ export declare class ModelRegistry {
73
91
  /**
74
92
  * Register a model with validation
75
93
  */
76
- registerModel(name: string, constructor: any, metadata?: ModelMetadata): void;
94
+ registerModel(name: string, constructor: ModelClassInput, metadata?: ModelMetadata): void;
77
95
  /**
78
96
  * Register property with validation
79
97
  */
@@ -83,19 +101,20 @@ export declare class ModelRegistry {
83
101
  */
84
102
  registerReference(modelName: string, propertyName: string, metadata: ExtendedReferenceMetadata): void;
85
103
  /**
86
- * LINEAR PATTERN: Register a back-reference for cascade-aware transaction handling
104
+ * Register a back-reference for cascade-aware transaction handling.
87
105
  *
88
- * When a parent model is deleted, the TransactionQueue will cancel pending
89
- * transactions for all child models that have a backReference to that parent.
106
+ * When a parent model is deleted, the transaction queue cancels pending
107
+ * transactions for every child model that declares a back-reference to that
108
+ * parent.
90
109
  *
91
- * @param childModelName - The model that has a FK to the parent (e.g., 'Slide')
92
- * @param metadata - BackReference configuration
110
+ * @param childModelName - The model that holds a foreign key to the parent (e.g., 'Slide')
111
+ * @param metadata - The back-reference configuration
93
112
  */
94
113
  registerBackReference(childModelName: string, metadata: BackReferenceMetadata): void;
95
114
  /** Get all models with specific load strategy. */
96
115
  getModelsByLoadStrategy(strategy: LoadStrategy): string[];
97
116
  /** Get model name from constructor (production-safe). */
98
- getModelNameFromConstructor(constructor: any): string | undefined;
117
+ getModelNameFromConstructor(constructor: unknown): string | undefined;
99
118
  /** Get properties for a model. */
100
119
  getPropertiesForModel(modelName: string): Map<string, PropertyMetadata>;
101
120
  /**
@@ -103,7 +122,7 @@ export declare class ModelRegistry {
103
122
  */
104
123
  getRegisteredModelNames(): string[];
105
124
  /** Get model constructor by name */
106
- getModelByName(name: string): any;
125
+ getModelByName(name: string): RegisteredModelClass | undefined;
107
126
  /** Check if model is registered */
108
127
  hasModel(name: string): boolean;
109
128
  /** Get model metadata by name */
@@ -117,12 +136,14 @@ export declare class ModelRegistry {
117
136
  /** Get back-references for a child model */
118
137
  getBackReferences(childModelName: string): BackReferenceMetadata[];
119
138
  /** Get child models for a parent */
120
- getChildModels(parentModelName: string): Array<{
139
+ getChildModels(parentModelName: string): {
121
140
  childModel: string;
122
141
  foreignKey: string;
123
- }>;
142
+ }[];
124
143
  /**
125
- * Calculate schema hash using crypto
144
+ * Compute a stable hash of the registered schema — model names, property
145
+ * types, and their indexed and optional flags. Memoized until the schema
146
+ * changes.
126
147
  */
127
148
  getSchemaHash(): string;
128
149
  /**