@abloatai/ablo 0.26.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 (398) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +101 -85
  3. package/dist/BaseSyncedStore.d.ts +85 -88
  4. package/dist/BaseSyncedStore.js +131 -147
  5. package/dist/Database.d.ts +54 -68
  6. package/dist/Database.js +97 -113
  7. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  8. package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
  9. package/dist/LazyReferenceCollection.d.ts +11 -15
  10. package/dist/LazyReferenceCollection.js +12 -16
  11. package/dist/Model.d.ts +37 -52
  12. package/dist/Model.js +46 -61
  13. package/dist/ModelRegistry.d.ts +21 -19
  14. package/dist/ModelRegistry.js +23 -27
  15. package/dist/NetworkMonitor.d.ts +5 -6
  16. package/dist/NetworkMonitor.js +5 -6
  17. package/dist/SyncClient.d.ts +112 -112
  18. package/dist/SyncClient.js +165 -172
  19. package/dist/adapters/alwaysOnline.d.ts +6 -8
  20. package/dist/adapters/alwaysOnline.js +6 -8
  21. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  22. package/dist/adapters/inMemoryStorage.js +9 -9
  23. package/dist/agent/Agent.d.ts +27 -32
  24. package/dist/agent/Agent.js +18 -19
  25. package/dist/agent/index.d.ts +4 -4
  26. package/dist/agent/index.js +5 -5
  27. package/dist/agent/session.d.ts +47 -44
  28. package/dist/agent/session.js +37 -48
  29. package/dist/agent/types.d.ts +26 -31
  30. package/dist/agent/types.js +6 -7
  31. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  32. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  33. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  34. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
  35. package/dist/ai-sdk/index.d.ts +25 -22
  36. package/dist/ai-sdk/index.js +25 -22
  37. package/dist/ai-sdk/wrap.d.ts +6 -7
  38. package/dist/ai-sdk/wrap.js +1 -1
  39. package/dist/auth/credentialPolicy.d.ts +69 -74
  40. package/dist/auth/credentialPolicy.js +51 -56
  41. package/dist/auth/credentialSource.d.ts +6 -5
  42. package/dist/auth/credentialSource.js +9 -10
  43. package/dist/auth/index.d.ts +59 -58
  44. package/dist/auth/index.js +31 -37
  45. package/dist/auth/schemas.d.ts +5 -4
  46. package/dist/auth/schemas.js +5 -4
  47. package/dist/batching/index.d.ts +19 -21
  48. package/dist/batching/index.js +14 -17
  49. package/dist/cli.cjs +167 -119
  50. package/dist/client/Ablo.d.ts +73 -73
  51. package/dist/client/Ablo.js +125 -160
  52. package/dist/client/ApiClient.d.ts +30 -19
  53. package/dist/client/ApiClient.js +133 -38
  54. package/dist/client/auth.d.ts +47 -47
  55. package/dist/client/auth.js +108 -117
  56. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  57. package/dist/client/claimHeartbeatLoop.js +88 -0
  58. package/dist/client/consoleLogger.d.ts +5 -6
  59. package/dist/client/consoleLogger.js +5 -6
  60. package/dist/client/createInternalComponents.d.ts +14 -17
  61. package/dist/client/createInternalComponents.js +25 -30
  62. package/dist/client/createModelProxy.d.ts +130 -120
  63. package/dist/client/createModelProxy.js +152 -122
  64. package/dist/client/credentialEndpoint.d.ts +40 -42
  65. package/dist/client/credentialEndpoint.js +35 -36
  66. package/dist/client/functionalUpdate.d.ts +29 -27
  67. package/dist/client/functionalUpdate.js +21 -21
  68. package/dist/client/hostedEndpoints.d.ts +9 -12
  69. package/dist/client/hostedEndpoints.js +9 -12
  70. package/dist/client/httpClient.d.ts +57 -53
  71. package/dist/client/httpClient.js +29 -31
  72. package/dist/client/identity.d.ts +15 -20
  73. package/dist/client/identity.js +47 -58
  74. package/dist/client/modelRegistration.d.ts +5 -9
  75. package/dist/client/modelRegistration.js +67 -87
  76. package/dist/client/options.d.ts +134 -157
  77. package/dist/client/options.js +3 -7
  78. package/dist/client/registerDataSource.d.ts +9 -9
  79. package/dist/client/registerDataSource.js +15 -16
  80. package/dist/client/resourceTypes.d.ts +64 -75
  81. package/dist/client/resourceTypes.js +4 -10
  82. package/dist/client/schemaConfig.d.ts +31 -43
  83. package/dist/client/schemaConfig.js +38 -50
  84. package/dist/client/sessionMint.d.ts +16 -12
  85. package/dist/client/sessionMint.js +26 -31
  86. package/dist/client/validateAbloOptions.d.ts +12 -14
  87. package/dist/client/validateAbloOptions.js +8 -9
  88. package/dist/client/writeOptionsSchema.d.ts +18 -16
  89. package/dist/client/writeOptionsSchema.js +23 -20
  90. package/dist/client/wsMutationExecutor.d.ts +15 -20
  91. package/dist/client/wsMutationExecutor.js +17 -23
  92. package/dist/context.d.ts +6 -4
  93. package/dist/context.js +6 -4
  94. package/dist/coordination/index.d.ts +10 -8
  95. package/dist/coordination/index.js +14 -12
  96. package/dist/coordination/schema.d.ts +176 -128
  97. package/dist/coordination/schema.js +197 -133
  98. package/dist/coordination/trace.d.ts +9 -10
  99. package/dist/coordination/trace.js +13 -14
  100. package/dist/core/DatabaseManager.d.ts +5 -7
  101. package/dist/core/DatabaseManager.js +15 -19
  102. package/dist/core/QueryProcessor.d.ts +7 -9
  103. package/dist/core/QueryProcessor.js +22 -28
  104. package/dist/core/QueryView.d.ts +8 -8
  105. package/dist/core/QueryView.js +2 -2
  106. package/dist/core/StoreManager.d.ts +12 -14
  107. package/dist/core/StoreManager.js +21 -24
  108. package/dist/core/ViewRegistry.d.ts +5 -5
  109. package/dist/core/ViewRegistry.js +4 -4
  110. package/dist/core/index.d.ts +17 -12
  111. package/dist/core/index.js +32 -26
  112. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  113. package/dist/core/openIDBWithTimeout.js +42 -43
  114. package/dist/core/queryUtils.d.ts +45 -0
  115. package/dist/core/queryUtils.js +69 -0
  116. package/dist/core/storeContract.d.ts +63 -61
  117. package/dist/core/storeContract.js +8 -12
  118. package/dist/environment.d.ts +28 -0
  119. package/dist/environment.js +21 -0
  120. package/dist/errorCodes.d.ts +107 -99
  121. package/dist/errorCodes.js +131 -132
  122. package/dist/errors.d.ts +160 -166
  123. package/dist/errors.js +155 -158
  124. package/dist/index.d.ts +30 -27
  125. package/dist/index.js +89 -86
  126. package/dist/interfaces/index.d.ts +102 -113
  127. package/dist/interfaces/index.js +5 -4
  128. package/dist/keys/index.d.ts +27 -29
  129. package/dist/keys/index.js +41 -40
  130. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  131. package/dist/mutators/RecordingTransaction.js +31 -37
  132. package/dist/mutators/Transaction.d.ts +18 -26
  133. package/dist/mutators/Transaction.js +14 -20
  134. package/dist/mutators/UndoManager.d.ts +122 -131
  135. package/dist/mutators/UndoManager.js +145 -156
  136. package/dist/mutators/defineMutators.d.ts +23 -34
  137. package/dist/mutators/defineMutators.js +14 -20
  138. package/dist/mutators/inverseOp.d.ts +12 -15
  139. package/dist/mutators/inverseOp.js +12 -15
  140. package/dist/mutators/mutateActions.d.ts +10 -9
  141. package/dist/mutators/mutateActions.js +1 -1
  142. package/dist/mutators/readerActions.d.ts +9 -8
  143. package/dist/mutators/readerActions.js +2 -2
  144. package/dist/mutators/undoApply.d.ts +31 -27
  145. package/dist/mutators/undoApply.js +26 -24
  146. package/dist/policy/index.d.ts +5 -3
  147. package/dist/policy/index.js +5 -3
  148. package/dist/policy/types.d.ts +104 -100
  149. package/dist/policy/types.js +67 -66
  150. package/dist/query/client.d.ts +28 -23
  151. package/dist/query/client.js +45 -43
  152. package/dist/query/types.d.ts +37 -60
  153. package/dist/query/types.js +13 -33
  154. package/dist/react/AbloProvider.d.ts +1 -1
  155. package/dist/react/AbloProvider.js +2 -2
  156. package/dist/react/context.d.ts +25 -28
  157. package/dist/react/context.js +9 -10
  158. package/dist/react/index.d.ts +41 -42
  159. package/dist/react/index.js +37 -38
  160. package/dist/react/internalContext.d.ts +17 -19
  161. package/dist/react/useAblo.d.ts +23 -22
  162. package/dist/react/useAblo.js +16 -14
  163. package/dist/react/useCurrentUserId.d.ts +8 -7
  164. package/dist/react/useCurrentUserId.js +8 -7
  165. package/dist/react/useErrorListener.d.ts +7 -7
  166. package/dist/react/useErrorListener.js +10 -11
  167. package/dist/react/useMutationFailureListener.d.ts +8 -8
  168. package/dist/react/useMutationFailureListener.js +8 -8
  169. package/dist/react/useMutators.d.ts +11 -11
  170. package/dist/react/useMutators.js +3 -3
  171. package/dist/react/useReactive.js +2 -2
  172. package/dist/react/useSyncStatus.d.ts +4 -6
  173. package/dist/react/useUndoScope.d.ts +7 -9
  174. package/dist/react/useUndoScope.js +1 -1
  175. package/dist/schema/coordination.d.ts +21 -25
  176. package/dist/schema/coordination.js +21 -25
  177. package/dist/schema/ddl.d.ts +43 -39
  178. package/dist/schema/ddl.js +75 -68
  179. package/dist/schema/ddlLock.d.ts +20 -24
  180. package/dist/schema/ddlLock.js +18 -23
  181. package/dist/schema/diff.d.ts +99 -61
  182. package/dist/schema/diff.js +43 -34
  183. package/dist/schema/field.d.ts +37 -42
  184. package/dist/schema/field.js +35 -48
  185. package/dist/schema/generate.d.ts +12 -12
  186. package/dist/schema/generate.js +12 -12
  187. package/dist/schema/index.d.ts +2 -2
  188. package/dist/schema/index.js +21 -23
  189. package/dist/schema/model.d.ts +118 -143
  190. package/dist/schema/model.js +22 -33
  191. package/dist/schema/openapi.d.ts +10 -9
  192. package/dist/schema/openapi.js +5 -3
  193. package/dist/schema/queries.d.ts +29 -31
  194. package/dist/schema/queries.js +23 -25
  195. package/dist/schema/relation.d.ts +89 -99
  196. package/dist/schema/relation.js +13 -13
  197. package/dist/schema/residency.d.ts +16 -13
  198. package/dist/schema/residency.js +16 -13
  199. package/dist/schema/roles.d.ts +36 -43
  200. package/dist/schema/roles.js +31 -37
  201. package/dist/schema/schema.d.ts +33 -42
  202. package/dist/schema/schema.js +31 -32
  203. package/dist/schema/select.d.ts +13 -13
  204. package/dist/schema/select.js +13 -13
  205. package/dist/schema/serialize.d.ts +28 -31
  206. package/dist/schema/serialize.js +27 -31
  207. package/dist/schema/sugar.d.ts +17 -32
  208. package/dist/schema/sugar.js +14 -29
  209. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
  210. package/dist/schema/syncDeltaRow.js +89 -0
  211. package/dist/schema/tenancy.d.ts +44 -46
  212. package/dist/schema/tenancy.js +46 -48
  213. package/dist/server/adapter.d.ts +58 -58
  214. package/dist/server/adapter.js +13 -14
  215. package/dist/server/commit.d.ts +60 -64
  216. package/dist/server/index.d.ts +9 -10
  217. package/dist/server/index.js +1 -1
  218. package/dist/server/readConfig.d.ts +70 -0
  219. package/dist/server/readConfig.js +8 -0
  220. package/dist/server/storageMode.d.ts +23 -0
  221. package/dist/server/storageMode.js +17 -0
  222. package/dist/source/adapter.d.ts +30 -25
  223. package/dist/source/adapter.js +10 -10
  224. package/dist/source/adapters/drizzle.d.ts +28 -23
  225. package/dist/source/adapters/drizzle.js +30 -25
  226. package/dist/source/adapters/kysely.d.ts +27 -25
  227. package/dist/source/adapters/kysely.js +24 -23
  228. package/dist/source/adapters/memory.d.ts +8 -7
  229. package/dist/source/adapters/memory.js +9 -8
  230. package/dist/source/adapters/prisma.d.ts +13 -12
  231. package/dist/source/adapters/prisma.js +22 -25
  232. package/dist/source/conformance.d.ts +18 -11
  233. package/dist/source/conformance.js +17 -11
  234. package/dist/source/connector.d.ts +31 -32
  235. package/dist/source/connector.js +28 -28
  236. package/dist/source/connectorProtocol.d.ts +160 -0
  237. package/dist/source/connectorProtocol.js +162 -0
  238. package/dist/source/contract.d.ts +26 -27
  239. package/dist/source/contract.js +28 -29
  240. package/dist/source/factory.d.ts +46 -58
  241. package/dist/source/factory.js +22 -27
  242. package/dist/source/index.d.ts +7 -9
  243. package/dist/source/index.js +12 -14
  244. package/dist/source/migrations.d.ts +9 -9
  245. package/dist/source/migrations.js +9 -9
  246. package/dist/source/next.d.ts +9 -10
  247. package/dist/source/next.js +6 -7
  248. package/dist/source/pushQueue.d.ts +69 -47
  249. package/dist/source/pushQueue.js +32 -28
  250. package/dist/source/signing.d.ts +46 -17
  251. package/dist/source/signing.js +28 -11
  252. package/dist/source/types.d.ts +121 -104
  253. package/dist/source/types.js +13 -14
  254. package/dist/stores/ObjectStore.d.ts +10 -11
  255. package/dist/stores/ObjectStore.js +11 -12
  256. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  257. package/dist/stores/SyncActionStore.d.ts +7 -11
  258. package/dist/stores/SyncActionStore.js +13 -17
  259. package/dist/surface.d.ts +27 -20
  260. package/dist/surface.js +27 -20
  261. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
  262. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
  263. package/dist/sync/ConnectionManager.d.ts +39 -50
  264. package/dist/sync/ConnectionManager.js +55 -66
  265. package/dist/sync/NetworkProbe.d.ts +24 -29
  266. package/dist/sync/NetworkProbe.js +63 -69
  267. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
  268. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
  269. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
  270. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
  271. package/dist/sync/SyncWebSocket.d.ts +139 -165
  272. package/dist/sync/SyncWebSocket.js +191 -223
  273. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  274. package/dist/sync/awaitClaimGrant.js +11 -11
  275. package/dist/sync/bootstrapApply.d.ts +34 -24
  276. package/dist/sync/bootstrapApply.js +27 -19
  277. package/dist/sync/commitFrames.d.ts +21 -20
  278. package/dist/sync/commitFrames.js +18 -18
  279. package/dist/sync/createClaimStream.d.ts +23 -22
  280. package/dist/sync/createClaimStream.js +105 -23
  281. package/dist/sync/createPresenceStream.d.ts +19 -18
  282. package/dist/sync/createPresenceStream.js +25 -26
  283. package/dist/sync/createSnapshot.d.ts +12 -14
  284. package/dist/sync/createSnapshot.js +20 -26
  285. package/dist/sync/credentialLifecycle.d.ts +104 -104
  286. package/dist/sync/credentialLifecycle.js +140 -147
  287. package/dist/sync/deltaPipeline.d.ts +36 -34
  288. package/dist/sync/deltaPipeline.js +64 -65
  289. package/dist/sync/groupChange.d.ts +63 -61
  290. package/dist/sync/groupChange.js +74 -78
  291. package/dist/sync/heartbeat.d.ts +34 -33
  292. package/dist/sync/heartbeat.js +31 -31
  293. package/dist/sync/participants.d.ts +19 -19
  294. package/dist/sync/schemas.d.ts +3 -2
  295. package/dist/sync/schemas.js +14 -10
  296. package/dist/sync/syncCursor.d.ts +17 -21
  297. package/dist/sync/syncCursor.js +17 -21
  298. package/dist/sync/syncPlan.d.ts +28 -36
  299. package/dist/sync/syncPlan.js +18 -19
  300. package/dist/sync/syncPosition.d.ts +54 -49
  301. package/dist/sync/syncPosition.js +57 -52
  302. package/dist/sync/wsFrameHandlers.d.ts +35 -36
  303. package/dist/sync/wsFrameHandlers.js +63 -67
  304. package/dist/testing/fixtures/bootstrap.d.ts +12 -6
  305. package/dist/testing/fixtures/bootstrap.js +12 -6
  306. package/dist/testing/fixtures/deltas.d.ts +30 -33
  307. package/dist/testing/fixtures/deltas.js +30 -33
  308. package/dist/testing/fixtures/models.d.ts +11 -10
  309. package/dist/testing/fixtures/models.js +11 -10
  310. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  311. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  312. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
  313. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
  314. package/dist/testing/helpers/wait.d.ts +13 -8
  315. package/dist/testing/helpers/wait.js +13 -8
  316. package/dist/testing/index.d.ts +3 -3
  317. package/dist/testing/index.js +2 -2
  318. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  319. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  320. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  321. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  322. package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
  323. package/dist/testing/mocks/MockSyncContext.js +15 -13
  324. package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
  325. package/dist/testing/mocks/MockSyncStore.js +11 -11
  326. package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
  327. package/dist/testing/mocks/MockWebSocket.js +22 -21
  328. package/dist/transactions/TransactionQueue.d.ts +181 -176
  329. package/dist/transactions/TransactionQueue.js +338 -350
  330. package/dist/transactions/TransactionStore.d.ts +6 -4
  331. package/dist/transactions/TransactionStore.js +6 -4
  332. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  333. package/dist/transactions/UnconfirmedWrites.js +104 -0
  334. package/dist/transactions/coalesceRules.d.ts +41 -17
  335. package/dist/transactions/coalesceRules.js +40 -17
  336. package/dist/transactions/commitPayload.d.ts +48 -52
  337. package/dist/transactions/commitPayload.js +48 -57
  338. package/dist/transactions/deltaConfirmation.d.ts +20 -22
  339. package/dist/transactions/deltaConfirmation.js +37 -45
  340. package/dist/transactions/optimisticApply.d.ts +49 -0
  341. package/dist/transactions/optimisticApply.js +65 -0
  342. package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
  343. package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
  344. package/dist/types/global.d.ts +46 -41
  345. package/dist/types/global.js +20 -19
  346. package/dist/types/index.d.ts +71 -77
  347. package/dist/types/index.js +22 -22
  348. package/dist/types/modelData.d.ts +6 -8
  349. package/dist/types/modelData.js +5 -7
  350. package/dist/types/participant.d.ts +10 -11
  351. package/dist/types/participant.js +6 -8
  352. package/dist/types/streams.d.ts +208 -195
  353. package/dist/types/streams.js +7 -7
  354. package/dist/utils/asyncIterator.d.ts +25 -32
  355. package/dist/utils/asyncIterator.js +25 -32
  356. package/dist/utils/duration.d.ts +12 -15
  357. package/dist/utils/duration.js +12 -15
  358. package/dist/utils/mobxSetup.d.ts +53 -0
  359. package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
  360. package/dist/webhooks/events.d.ts +21 -16
  361. package/dist/webhooks/events.js +10 -8
  362. package/dist/webhooks/index.d.ts +5 -7
  363. package/dist/webhooks/index.js +5 -7
  364. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  365. package/dist/wire/delta.js +114 -0
  366. package/dist/wire/errorEnvelope.d.ts +30 -31
  367. package/dist/wire/errorEnvelope.js +34 -40
  368. package/dist/wire/frames.d.ts +79 -86
  369. package/dist/wire/frames.js +26 -33
  370. package/dist/wire/index.d.ts +14 -12
  371. package/dist/wire/index.js +30 -26
  372. package/dist/wire/listEnvelope.d.ts +16 -23
  373. package/dist/wire/listEnvelope.js +7 -6
  374. package/dist/wire/protocol.d.ts +25 -32
  375. package/dist/wire/protocol.js +25 -32
  376. package/dist/wire/protocolVersion.d.ts +44 -40
  377. package/dist/wire/protocolVersion.js +44 -40
  378. package/docs/coordination.md +59 -0
  379. package/package.json +11 -10
  380. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  381. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  382. package/dist/core/query-utils.d.ts +0 -34
  383. package/dist/core/query-utils.js +0 -59
  384. package/dist/schema/sync-delta-row.js +0 -103
  385. package/dist/schema/sync-delta-wire.js +0 -102
  386. package/dist/server/read-config.d.ts +0 -67
  387. package/dist/server/read-config.js +0 -8
  388. package/dist/server/storage-mode.d.ts +0 -8
  389. package/dist/server/storage-mode.js +0 -28
  390. package/dist/source/connector-protocol.d.ts +0 -159
  391. package/dist/source/connector-protocol.js +0 -161
  392. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  393. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  394. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  395. package/dist/transactions/mutation-error-handler.js +0 -39
  396. package/dist/transactions/optimistic.d.ts +0 -24
  397. package/dist/transactions/optimistic.js +0 -45
  398. 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 */
@@ -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.
197
- *
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.
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.
207
192
  *
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
@@ -362,7 +347,7 @@ export class Model {
362
347
  // New model - return create operation
363
348
  return {
364
349
  type: 'create',
365
- modelName: this.getModelName(), // Use Prisma model name
350
+ modelName: this.getModelName(), // the registered model name
366
351
  modelId: this.id,
367
352
  timestamp: new Date(),
368
353
  };
@@ -371,7 +356,7 @@ export class Model {
371
356
  // Existing model with changes - return update operation
372
357
  return {
373
358
  type: 'update',
374
- modelName: this.getModelName(), // Use Prisma model name
359
+ modelName: this.getModelName(), // the registered model name
375
360
  modelId: this.id,
376
361
  changes: new Map(this.modifiedProperties),
377
362
  timestamp: new Date(),
@@ -392,7 +377,7 @@ export class Model {
392
377
  this.willDelete();
393
378
  return {
394
379
  type: 'delete',
395
- modelName: this.getModelName(), // Use Prisma model name
380
+ modelName: this.getModelName(), // the registered model name
396
381
  modelId: this.id,
397
382
  timestamp: new Date(),
398
383
  };
@@ -409,7 +394,7 @@ export class Model {
409
394
  this.archivedAt = new Date();
410
395
  return {
411
396
  type: 'archive',
412
- modelName: this.getModelName(), // Use Prisma model name
397
+ modelName: this.getModelName(), // the registered model name
413
398
  modelId: this.id,
414
399
  timestamp: new Date(),
415
400
  };
@@ -426,7 +411,7 @@ export class Model {
426
411
  this.archivedAt = null;
427
412
  return {
428
413
  type: 'unarchive',
429
- modelName: this.getModelName(), // Use Prisma model name
414
+ modelName: this.getModelName(), // the registered model name
430
415
  modelId: this.id,
431
416
  timestamp: new Date(),
432
417
  };
@@ -437,7 +422,7 @@ export class Model {
437
422
  * properties, and coercing date fields. Shared by `updateFromData`
438
423
  * (hydration) and `applyChanges` (local user update).
439
424
  *
440
- * Change tracking is EXPLICIT, not magic: for every field actually
425
+ * Change tracking is explicit: for every field actually
441
426
  * written, `onWrite(key, oldValue, newValue)` is invoked with the value
442
427
  * captured immediately before assignment. `applyChanges` passes a hook
443
428
  * that records the change in `modifiedProperties`; `updateFromData`
@@ -497,10 +482,10 @@ export class Model {
497
482
  * Update from raw data (hydration)
498
483
  *
499
484
  * Used for inbound server deltas and pool upserts. Change tracking is
500
- * deliberately suppressed: hydration writes must NOT land in
485
+ * deliberately suppressed: hydration writes must not land in
501
486
  * `modifiedProperties`, otherwise applying a server delta would queue a
502
487
  * brand-new outbound mutation and the record would echo forever. For a
503
- * LOCAL user edit, use `applyChanges` instead.
488
+ * local user edit, use `applyChanges` instead.
504
489
  *
505
490
  * Suppression is belt-and-suspenders: we pass no `onWrite` hook AND
506
491
  * clear/restore `modifiedProperties` around the assignment, so any
@@ -527,18 +512,18 @@ export class Model {
527
512
  this.didUpdate();
528
513
  }
529
514
  /**
530
- * Apply a LOCAL user-initiated update from a data object — the write
531
- * 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
532
517
  * application code mutates synced fields.
533
518
  *
534
519
  * Unlike `updateFromData` (hydration, untracked), this records every
535
520
  * written field in `modifiedProperties` via `propertyChanged`, so
536
- * `getChanges()` / the transaction queue send the edited fields to the
537
- * server and the undo system gets a correct pre-write baseline.
538
- * Recording is EXPLICIT here (via the `onWrite` hook) it does not rely
539
- * 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.
540
525
  *
541
- * `_originalData` is intentionally NOT reset here: it stays as the
526
+ * `_originalData` is intentionally not reset here: it stays as the
542
527
  * last-persisted baseline until `clearChanges()` runs on sync-ack.
543
528
  */
544
529
  applyChanges(data) {
@@ -564,8 +549,8 @@ export class Model {
564
549
  const modelName = this.getModelName();
565
550
  const properties = getActiveRegistry().getProperties(modelName);
566
551
  const result = {
567
- __class: this.getModelName(), // Use Prisma model name for consistency
568
- __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
569
554
  id: this.id,
570
555
  createdAt: this.createdAt?.toISOString(),
571
556
  updatedAt: this.updatedAt?.toISOString(),
@@ -656,7 +641,7 @@ export class Model {
656
641
  }
657
642
  /**
658
643
  * Check if any collection on this model is currently being observed by React
659
- * Used by ObjectPool GC to prevent disposing models in active use
644
+ * Used by InstanceCache GC to prevent disposing models in active use
660
645
  */
661
646
  hasObservedCollections() {
662
647
  return this._observedCollections.size > 0;
@@ -813,7 +798,7 @@ export class Model {
813
798
  }
814
799
  // Try to get model class by identifier
815
800
  let ModelClass = getActiveRegistry().getModelByName(modelIdentifier);
816
- // If not found with Prisma name, try mapping to class name
801
+ // If not found by registered name, try mapping to the class name
817
802
  if (!ModelClass) {
818
803
  const classNameMap = {
819
804
  Task: 'TaskModel',
@@ -1,13 +1,11 @@
1
1
  /**
2
- * ModelRegistry - Type-safe model metadata management
3
- *
4
- * Key improvements:
5
- * - Instance-based for better testing
6
- * - Validation at registration
7
- * - Lazy reference resolution
8
- * - Crypto-based schema hashing
9
- * - Comprehensive error reporting
10
- * - Best practices from Linear Sync Engine
2
+ * ModelRegistry is the source of truth for model metadata: which model classes
3
+ * exist, the properties and references declared on each, the back-references
4
+ * used for cascade handling, and a stable hash of the whole schema.
5
+ * {@link Model} instances resolve their metadata through the active registry,
6
+ * and {@link InstanceCache} uses it to map between model names and constructor
7
+ * classes. References resolve lazily, so a model may declare a reference to
8
+ * another model that is registered later.
11
9
  */
12
10
  import { type ModelMetadata, type PropertyMetadata, type ReferenceMetadata, LoadStrategy } from './types/index.js';
13
11
  import type { Model } from './Model.js';
@@ -30,7 +28,8 @@ export type ModelClassInput = new (...args: never[]) => Model;
30
28
  */
31
29
  export type RegisteredModelClass = Omit<typeof Model, never> & ConcreteModelConstructor<Model>;
32
30
  /**
33
- * Extended ReferenceMetadata with additional Linear-style options
31
+ * {@link ReferenceMetadata} extended with cascade behavior: what happens to a
32
+ * referencing model when the referenced model is deleted or archived.
34
33
  */
35
34
  export interface ExtendedReferenceMetadata extends ReferenceMetadata {
36
35
  onDelete?: 'cascade' | 'nullify' | 'restrict';
@@ -47,8 +46,9 @@ export interface SerializedReferenceMetadata extends Omit<ExtendedReferenceMetad
47
46
  referencedModel: string;
48
47
  }
49
48
  /**
50
- * BackReference metadata for cascade-aware transaction handling
51
- * 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.
52
52
  */
53
53
  export interface BackReferenceMetadata {
54
54
  /** The parent model name (e.g., 'SlideDeck') */
@@ -81,7 +81,6 @@ export declare class ModelRegistry {
81
81
  private schemaHash?;
82
82
  private config;
83
83
  private registeredModels;
84
- private batchMode;
85
84
  private pendingHashUpdate;
86
85
  constructor(config?: RegistryConfig);
87
86
  private validateModelConstructor;
@@ -102,13 +101,14 @@ export declare class ModelRegistry {
102
101
  */
103
102
  registerReference(modelName: string, propertyName: string, metadata: ExtendedReferenceMetadata): void;
104
103
  /**
105
- * LINEAR PATTERN: Register a back-reference for cascade-aware transaction handling
104
+ * Register a back-reference for cascade-aware transaction handling.
106
105
  *
107
- * When a parent model is deleted, the TransactionQueue will cancel pending
108
- * 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.
109
109
  *
110
- * @param childModelName - The model that has a FK to the parent (e.g., 'Slide')
111
- * @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
112
112
  */
113
113
  registerBackReference(childModelName: string, metadata: BackReferenceMetadata): void;
114
114
  /** Get all models with specific load strategy. */
@@ -141,7 +141,9 @@ export declare class ModelRegistry {
141
141
  foreignKey: string;
142
142
  }[];
143
143
  /**
144
- * 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.
145
147
  */
146
148
  getSchemaHash(): string;
147
149
  /**
@@ -1,13 +1,11 @@
1
1
  /**
2
- * ModelRegistry - Type-safe model metadata management
3
- *
4
- * Key improvements:
5
- * - Instance-based for better testing
6
- * - Validation at registration
7
- * - Lazy reference resolution
8
- * - Crypto-based schema hashing
9
- * - Comprehensive error reporting
10
- * - Best practices from Linear Sync Engine
2
+ * ModelRegistry is the source of truth for model metadata: which model classes
3
+ * exist, the properties and references declared on each, the back-references
4
+ * used for cascade handling, and a stable hash of the whole schema.
5
+ * {@link Model} instances resolve their metadata through the active registry,
6
+ * and {@link InstanceCache} uses it to map between model names and constructor
7
+ * classes. References resolve lazily, so a model may declare a reference to
8
+ * another model that is registered later.
11
9
  */
12
10
  // Removed Node.js crypto import for browser compatibility
13
11
  import { PropertyType, LoadStrategy, } from './types/index.js';
@@ -43,19 +41,17 @@ export class ModelRegistry {
43
41
  properties = new Map();
44
42
  references = new Map();
45
43
  pendingReferences = new Map();
46
- // 🔧 PROPER FIX: Static mapping from constructor to model name.
47
- // Keyed `unknown` on purpose: lookups arrive as `this.constructor`
48
- // (Function) and as typed model classes — both accepted without casts.
44
+ // Maps a constructor back to its model name. Keyed as `unknown` on purpose:
45
+ // lookups arrive both as `this.constructor` (a Function) and as typed model
46
+ // classes, and both are accepted without a cast.
49
47
  constructorToModelName = new Map();
50
- // LINEAR PATTERN: BackReferences for cascade-aware transaction handling.
51
- // Maps childModelName BackReferenceMetadata[] (which parent models
52
- // own this child). The inverse direction (parentModelName children)
53
- // is derived on demand by `getChildModels`, populated only here.
48
+ // Back-references for cascade-aware transaction handling. Maps a child model
49
+ // name to the parent models it references. The inverse direction (parent to
50
+ // children) is derived on demand by `getChildModels`; it is populated here.
54
51
  backReferences = new Map();
55
52
  schemaHash;
56
53
  config;
57
54
  registeredModels = new Set();
58
- batchMode = false;
59
55
  pendingHashUpdate = false;
60
56
  constructor(config = {}) {
61
57
  this.config = {
@@ -169,7 +165,7 @@ export class ModelRegistry {
169
165
  const modelClass = constructor;
170
166
  this.models.set(name, modelClass);
171
167
  this.modelMetadata.set(name, metadata);
172
- // 🔧 PROPER FIX: Create reverse mapping from constructor to model name
168
+ // Record the reverse mapping from constructor to model name
173
169
  this.constructorToModelName.set(constructor, name);
174
170
  // Initialize property maps
175
171
  if (!this.properties.has(name)) {
@@ -246,13 +242,14 @@ export class ModelRegistry {
246
242
  this.completeReferenceRegistration(modelName, propertyName, metadata);
247
243
  }
248
244
  /**
249
- * LINEAR PATTERN: Register a back-reference for cascade-aware transaction handling
245
+ * Register a back-reference for cascade-aware transaction handling.
250
246
  *
251
- * When a parent model is deleted, the TransactionQueue will cancel pending
252
- * transactions for all child models that have a backReference to that parent.
247
+ * When a parent model is deleted, the transaction queue cancels pending
248
+ * transactions for every child model that declares a back-reference to that
249
+ * parent.
253
250
  *
254
- * @param childModelName - The model that has a FK to the parent (e.g., 'Slide')
255
- * @param metadata - BackReference configuration
251
+ * @param childModelName - The model that holds a foreign key to the parent (e.g., 'Slide')
252
+ * @param metadata - The back-reference configuration
256
253
  */
257
254
  registerBackReference(childModelName, metadata) {
258
255
  // Add to instance map
@@ -345,7 +342,9 @@ export class ModelRegistry {
345
342
  return children;
346
343
  }
347
344
  /**
348
- * Calculate schema hash using crypto
345
+ * Compute a stable hash of the registered schema — model names, property
346
+ * types, and their indexed and optional flags. Memoized until the schema
347
+ * changes.
349
348
  */
350
349
  getSchemaHash() {
351
350
  if (this.schemaHash)
@@ -428,7 +427,6 @@ export class ModelRegistry {
428
427
  * Start batch registration mode to optimize performance
429
428
  */
430
429
  startBatch() {
431
- this.batchMode = true;
432
430
  this.pendingHashUpdate = false;
433
431
  }
434
432
  /**
@@ -438,7 +436,6 @@ export class ModelRegistry {
438
436
  * End batch registration mode and update schema hash if needed
439
437
  */
440
438
  endBatch() {
441
- this.batchMode = false;
442
439
  if (this.pendingHashUpdate) {
443
440
  this.getSchemaHash(); // This will recalculate if needed
444
441
  this.pendingHashUpdate = false;
@@ -460,7 +457,6 @@ export class ModelRegistry {
460
457
  this.backReferences.clear();
461
458
  this.constructorToModelName.clear();
462
459
  this.schemaHash = undefined;
463
- this.batchMode = false;
464
460
  this.pendingHashUpdate = false;
465
461
  getContext().logger.info('ModelRegistry cleared');
466
462
  }
@@ -1,10 +1,9 @@
1
1
  /**
2
- * NetworkMonitor - Network connectivity tracking with visibility awareness
3
- *
4
- * Monitors online/offline state using browser events AND visibility changes.
5
- * When a tab becomes visible after being hidden (e.g., laptop sleep/wake),
6
- * the WebSocket may have silently died without triggering online/offline events.
7
- * The visibility handler detects this and emits 'online' to trigger recovery.
2
+ * NetworkMonitor tracks network connectivity and reports it through events.
3
+ * It listens to the browser's online and offline events, and it also watches
4
+ * for a tab becoming visible again: after a laptop sleep/wake or a long spell
5
+ * in the background, the WebSocket can die silently without an offline event
6
+ * firing, so returning to the tab emits a recovery signal the store can act on.
8
7
  */
9
8
  import { EventEmitter } from 'events';
10
9
  export declare class NetworkMonitor extends EventEmitter {
@@ -1,10 +1,9 @@
1
1
  /**
2
- * NetworkMonitor - Network connectivity tracking with visibility awareness
3
- *
4
- * Monitors online/offline state using browser events AND visibility changes.
5
- * When a tab becomes visible after being hidden (e.g., laptop sleep/wake),
6
- * the WebSocket may have silently died without triggering online/offline events.
7
- * The visibility handler detects this and emits 'online' to trigger recovery.
2
+ * NetworkMonitor tracks network connectivity and reports it through events.
3
+ * It listens to the browser's online and offline events, and it also watches
4
+ * for a tab becoming visible again: after a laptop sleep/wake or a long spell
5
+ * in the background, the WebSocket can die silently without an offline event
6
+ * firing, so returning to the tab emits a recovery signal the store can act on.
8
7
  */
9
8
  import { EventEmitter } from 'events';
10
9
  import { getContext } from './context.js';