@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
@@ -1,21 +1,18 @@
1
1
  /**
2
- * Canonical Ablo API-key format the single source of truth for how keys
3
- * are minted, hashed, and validated. Both the sync-server (`apiKeyStore`)
4
- * and the web control-plane (`generate-key.ts`) consume THIS module, so the
5
- * format can no longer drift between the two mint sites (it used to live as
6
- * a hand-copied twin kept in sync by a comment).
2
+ * The Ablo API-key format: how keys are minted, hashed, and validated, in one
3
+ * place so every component that issues or checks a key agrees on the format.
7
4
  *
8
- * Node-only uses `node:crypto`. Exposed via the `@abloatai/ablo/keys`
9
- * subpath and NEVER re-exported from the browser-facing `.` entry, so the
10
- * client bundle never pulls in `node:crypto`.
5
+ * This module uses `node:crypto` and is therefore Node-only. It is published on
6
+ * the `@abloatai/ablo/keys` subpath and kept off the main browser-facing entry
7
+ * so a browser bundle never pulls in `node:crypto`.
11
8
  *
12
- * Format (GitHub-style): `<sk|rk|ek>_<live|test>_<30 base62 body><6-char
13
- * base62 CRC32 checksum>`. The environment segment is the stable key-prefix
14
- * contract; parsed values are immediately mapped to `production` / `sandbox`.
15
- * The identifiable prefix + CRC32 checksum let
16
- * secret scanners detect leaks and let us reject typo'd/forged keys OFFLINE
17
- * (no DB round-trip). Legacy keys (a ~43-char base64url body, no checksum)
18
- * still validate by hash — they parse here as `checksummed: false`.
9
+ * A key looks like `<sk|rk|ek|pk>_<live|test>_<30 base62 chars><6-char base62
10
+ * CRC32 checksum>`. The middle segment is the stable environment prefix, mapped
11
+ * on parse to `production` or `sandbox`. The recognizable prefix lets secret
12
+ * scanners spot a leaked key, and the trailing checksum lets the format reject a
13
+ * mistyped or forged key locally, without a database round-trip. Older keys
14
+ * (roughly a 43-character base64url body with no checksum) still validate by hash
15
+ * and parse here with `checksummed: false`.
19
16
  */
20
17
  import { z } from 'zod';
21
18
  import { type Environment } from '../environment.js';
@@ -35,10 +32,10 @@ export interface ParsedApiKey {
35
32
  checksummed: boolean;
36
33
  }
37
34
  /**
38
- * Canonical schema for an Ablo API key. `parse`/`safeParse` returns a typed
39
- * {@link ParsedApiKey}; a new checksummed-format key with a BAD checksum is
40
- * rejected (the offline-reject), while a legacy key parses as
41
- * `checksummed: false` and passes (the server still hash-validates it).
35
+ * The Zod schema for an Ablo API key. `parse` and `safeParse` return a typed
36
+ * {@link ParsedApiKey}. A checksummed-format key whose checksum does not match is
37
+ * rejected without any network call; an older key with no checksum parses with
38
+ * `checksummed: false` and is left for the server to validate by hash.
42
39
  */
43
40
  export declare const apiKeySchema: z.ZodPipe<z.ZodString, z.ZodTransform<ParsedApiKey, string>>;
44
41
  /** Parse + fully validate (incl. checksum). Returns null when invalid. */
@@ -57,21 +54,22 @@ export declare function generateApiKey(env?: ApiKeyEnv, kind?: ApiKeyKind): {
57
54
  prefix: string;
58
55
  };
59
56
  /**
60
- * Stable SHA-256 hex of a plaintext key. A fast hash is CORRECT here (not
61
- * bcrypt) API keys are high-entropy random, so there's no dictionary to
62
- * defend against. Used at both write (mint) and lookup.
57
+ * The stable SHA-256 hex digest of a plaintext key, computed both when a key is
58
+ * minted and when one is looked up. A fast hash is the right choice here rather
59
+ * than a password hash like bcrypt: API keys are long random strings, so there is
60
+ * no dictionary of guesses to slow down.
63
61
  */
64
62
  export declare function hashApiKey(plaintext: string): string;
65
63
  /** `whsec_` label prefix per the Standard Webhooks spec (not part of the key material). */
66
64
  export declare const WEBHOOK_SECRET_PREFIX = "whsec_";
67
65
  /**
68
- * Mint a webhook signing secret per the Standard Webhooks spec
69
- * (https://www.standardwebhooks.com): a base64-encoded random key, 24–64 bytes,
70
- * labelled with the `whsec_` prefix. We use 32 bytes (256 bits) comfortably
71
- * inside the range and matching Stripe/Svix. Unlike an API key this is NOT
72
- * hashed at rest: signing (`signAbloSourceRequest`) needs the live key, so it is
73
- * stored by reference via the secret store, returned to the customer once at
74
- * creation, and never echoed again (Stripe's policy).
66
+ * Mints a webhook signing secret following the Standard Webhooks specification
67
+ * (https://www.standardwebhooks.com): a base64-encoded random key of 24–64 bytes,
68
+ * labelled with the `whsec_` prefix. This uses 32 bytes (256 bits), comfortably
69
+ * inside that range. Unlike an API key, a signing secret is not hashed at rest,
70
+ * because signing a request with {@link signAbloSourceRequest} needs the live
71
+ * value. It is therefore kept in a secret store, returned to the customer once at
72
+ * creation, and never shown again.
75
73
  */
76
74
  export declare function generateWebhookSecret(): {
77
75
  plaintext: string;
@@ -1,36 +1,36 @@
1
1
  /**
2
- * Canonical Ablo API-key format the single source of truth for how keys
3
- * are minted, hashed, and validated. Both the sync-server (`apiKeyStore`)
4
- * and the web control-plane (`generate-key.ts`) consume THIS module, so the
5
- * format can no longer drift between the two mint sites (it used to live as
6
- * a hand-copied twin kept in sync by a comment).
2
+ * The Ablo API-key format: how keys are minted, hashed, and validated, in one
3
+ * place so every component that issues or checks a key agrees on the format.
7
4
  *
8
- * Node-only uses `node:crypto`. Exposed via the `@abloatai/ablo/keys`
9
- * subpath and NEVER re-exported from the browser-facing `.` entry, so the
10
- * client bundle never pulls in `node:crypto`.
5
+ * This module uses `node:crypto` and is therefore Node-only. It is published on
6
+ * the `@abloatai/ablo/keys` subpath and kept off the main browser-facing entry
7
+ * so a browser bundle never pulls in `node:crypto`.
11
8
  *
12
- * Format (GitHub-style): `<sk|rk|ek>_<live|test>_<30 base62 body><6-char
13
- * base62 CRC32 checksum>`. The environment segment is the stable key-prefix
14
- * contract; parsed values are immediately mapped to `production` / `sandbox`.
15
- * The identifiable prefix + CRC32 checksum let
16
- * secret scanners detect leaks and let us reject typo'd/forged keys OFFLINE
17
- * (no DB round-trip). Legacy keys (a ~43-char base64url body, no checksum)
18
- * still validate by hash — they parse here as `checksummed: false`.
9
+ * A key looks like `<sk|rk|ek|pk>_<live|test>_<30 base62 chars><6-char base62
10
+ * CRC32 checksum>`. The middle segment is the stable environment prefix, mapped
11
+ * on parse to `production` or `sandbox`. The recognizable prefix lets secret
12
+ * scanners spot a leaked key, and the trailing checksum lets the format reject a
13
+ * mistyped or forged key locally, without a database round-trip. Older keys
14
+ * (roughly a 43-character base64url body with no checksum) still validate by hash
15
+ * and parse here with `checksummed: false`.
19
16
  */
20
17
  import { createHash, randomBytes } from 'node:crypto';
21
18
  import { z } from 'zod';
22
19
  import { ENVIRONMENTS, environmentFromKeyPrefix, environmentToKeyPrefix, } from '../environment.js';
23
20
  // ── Vocabulary ──────────────────────────────────────────────────────────
24
- // The Stripe-style key model:
25
- // secret (sk_) — backend / server-to-server / agents. Full authority. Never in a browser.
26
- // restricted (rk_) — scoped SERVER key (agent session tokens / capabilities).
27
- // ephemeral (ek_) short-lived, backend-minted, USER-scoped BROWSER session credential
28
- // (Stripe ephemeral keys). Carries participantKind:'user' + baked syncGroups.
29
- // publishable (pk_) long-lived, browser-safe, org-scoped, READ-ONLY project key
30
- // (Stripe `pk_` / Supabase anon key). Used DIRECTLY as the bearer
31
- // (never exchanged, never expires nothing to refresh). The org owns
32
- // it; it grants read access to the org's data plane and cannot write
33
- // or reach any control-plane operation.
21
+ // The four key kinds:
22
+ // secret (sk_) — backend and server-to-server use, including agents. Full
23
+ // authority; never expose one in a browser.
24
+ // restricted (rk_) a scoped server key, such as an agent session token or a
25
+ // narrowed capability.
26
+ // ephemeral (ek_) a short-lived, backend-minted session credential scoped to
27
+ // one user, safe to hand to that user's browser. Carries
28
+ // `participantKind: 'user'` and its baked-in sync groups.
29
+ // publishable (pk_) a long-lived, browser-safe, organization-scoped read-only
30
+ // key. It is used directly as the bearer token — never
31
+ // exchanged, never expires, nothing to refresh. It grants
32
+ // read access to the organization's data and cannot write or
33
+ // reach any control-plane operation.
34
34
  export const API_KEY_KINDS = ['secret', 'restricted', 'ephemeral', 'publishable'];
35
35
  export const API_KEY_ENVS = ENVIRONMENTS;
36
36
  const PREFIX_BY_KIND = {
@@ -52,7 +52,7 @@ const KEY_BODY_LEN = 30;
52
52
  const CHECKSUM_LEN = 6;
53
53
  /** A new checksummed body is exactly this long and pure base62. */
54
54
  const CHECKSUMMED_BODY_LEN = KEY_BODY_LEN + CHECKSUM_LEN;
55
- /** `<sk|rk|ek|pk>_<live|test>_<body>`; body charset covers base62 AND legacy base64url. */
55
+ /** `<sk|rk|ek|pk>_<live|test>_<body>`; the body charset covers base62 as well as the legacy base64url form. */
56
56
  const KEY_RE = /^(sk|rk|ek|pk)_(live|test)_([0-9A-Za-z\-_]+)$/;
57
57
  const BASE62_RE = /^[0-9A-Za-z]+$/;
58
58
  // ── Checksum (standard CRC-32, GitHub-compatible) ───────────────────────
@@ -102,10 +102,10 @@ function bodyIsChecksummed(body) {
102
102
  return body.length === CHECKSUMMED_BODY_LEN && BASE62_RE.test(body);
103
103
  }
104
104
  /**
105
- * Canonical schema for an Ablo API key. `parse`/`safeParse` returns a typed
106
- * {@link ParsedApiKey}; a new checksummed-format key with a BAD checksum is
107
- * rejected (the offline-reject), while a legacy key parses as
108
- * `checksummed: false` and passes (the server still hash-validates it).
105
+ * The Zod schema for an Ablo API key. `parse` and `safeParse` return a typed
106
+ * {@link ParsedApiKey}. A checksummed-format key whose checksum does not match is
107
+ * rejected without any network call; an older key with no checksum parses with
108
+ * `checksummed: false` and is left for the server to validate by hash.
109
109
  */
110
110
  export const apiKeySchema = z.string().transform((raw, ctx) => {
111
111
  const m = KEY_RE.exec(raw);
@@ -165,9 +165,10 @@ export function generateApiKey(env = 'production', kind = 'secret') {
165
165
  return { plaintext, hash: hashApiKey(plaintext), prefix: plaintext.slice(0, 12) };
166
166
  }
167
167
  /**
168
- * Stable SHA-256 hex of a plaintext key. A fast hash is CORRECT here (not
169
- * bcrypt) API keys are high-entropy random, so there's no dictionary to
170
- * defend against. Used at both write (mint) and lookup.
168
+ * The stable SHA-256 hex digest of a plaintext key, computed both when a key is
169
+ * minted and when one is looked up. A fast hash is the right choice here rather
170
+ * than a password hash like bcrypt: API keys are long random strings, so there is
171
+ * no dictionary of guesses to slow down.
171
172
  */
172
173
  export function hashApiKey(plaintext) {
173
174
  return createHash('sha256').update(plaintext).digest('hex');
@@ -175,13 +176,13 @@ export function hashApiKey(plaintext) {
175
176
  /** `whsec_` label prefix per the Standard Webhooks spec (not part of the key material). */
176
177
  export const WEBHOOK_SECRET_PREFIX = 'whsec_';
177
178
  /**
178
- * Mint a webhook signing secret per the Standard Webhooks spec
179
- * (https://www.standardwebhooks.com): a base64-encoded random key, 24–64 bytes,
180
- * labelled with the `whsec_` prefix. We use 32 bytes (256 bits) comfortably
181
- * inside the range and matching Stripe/Svix. Unlike an API key this is NOT
182
- * hashed at rest: signing (`signAbloSourceRequest`) needs the live key, so it is
183
- * stored by reference via the secret store, returned to the customer once at
184
- * creation, and never echoed again (Stripe's policy).
179
+ * Mints a webhook signing secret following the Standard Webhooks specification
180
+ * (https://www.standardwebhooks.com): a base64-encoded random key of 24–64 bytes,
181
+ * labelled with the `whsec_` prefix. This uses 32 bytes (256 bits), comfortably
182
+ * inside that range. Unlike an API key, a signing secret is not hashed at rest,
183
+ * because signing a request with {@link signAbloSourceRequest} needs the live
184
+ * value. It is therefore kept in a secret store, returned to the customer once at
185
+ * creation, and never shown again.
185
186
  */
186
187
  export function generateWebhookSecret() {
187
188
  const plaintext = `${WEBHOOK_SECRET_PREFIX}${randomBytes(32).toString('base64')}`;
@@ -1,18 +1,18 @@
1
1
  /**
2
- * RecordingTransaction — wraps a base `Transaction` and captures inverse ops
3
- * for the undo system. Each write is observed BEFORE it runs (to snapshot
4
- * pre-state) and AFTER (to capture the forward op for redo).
2
+ * Wraps a {@link Transaction} and records the inverse of every write so the
3
+ * change can be undone. Each write is observed just before it runs, to snapshot
4
+ * the previous state, and just after, to record the forward operation for redo.
5
5
  *
6
- * The wrapped mutator sees the exact same `Transaction<S>` shape; recording
7
- * is invisible. When the mutator returns, the caller reads `getEntry()` and
8
- * pushes it into the active `UndoScope`.
6
+ * The mutator sees an ordinary `Transaction<S>` and is unaware it is being
7
+ * recorded. When the mutator returns, the caller reads
8
+ * {@link RecordingTransaction.getEntry} and pushes the result onto the active
9
+ * {@link UndoScope}.
9
10
  *
10
- * Why snapshots live here (not in the UndoScope):
11
- * - Update inverse requires `prev` field values must be captured before
12
- * the write lands in the pool.
13
- * - Delete inverse requires the full model data same reason.
14
- * - Create inverse is simpler (delete by id) but the id must be known
15
- * post-creation (schema generates UUIDs if caller omitted one).
11
+ * The snapshots are taken here rather than in the undo scope because they must
12
+ * exist before the write lands: the inverse of an update needs the field's
13
+ * previous values, and the inverse of a delete needs the full row. The inverse
14
+ * of a create is just a delete by id, but that id is known only after creation,
15
+ * since the schema generates one when the caller omits it.
16
16
  */
17
17
  import type { Schema } from '../schema/schema.js';
18
18
  import type { SyncStoreContract } from '../react/context.js';
@@ -28,9 +28,9 @@ export interface RecordingTransaction<S extends Schema> {
28
28
  getEntry: (label?: string) => UndoEntry | null;
29
29
  }
30
30
  /**
31
- * Build a transaction that records inverses + forwards as it runs.
32
- * Consumers use this only when they want the invocation to be undoable;
33
- * read-only or side-effect-only mutators should use `createTransaction`
34
- * directly to avoid the bookkeeping overhead.
31
+ * Builds a transaction that records the forward and inverse of each write as it
32
+ * runs. Use this only when the mutator should be undoable; a read-only or
33
+ * side-effect-only mutator should call {@link createTransaction} directly to skip
34
+ * the bookkeeping.
35
35
  */
36
36
  export declare function createRecordingTransaction<S extends Schema>(schema: S, store: SyncStoreContract, organizationId: string): RecordingTransaction<S>;
@@ -1,25 +1,25 @@
1
1
  /**
2
- * RecordingTransaction — wraps a base `Transaction` and captures inverse ops
3
- * for the undo system. Each write is observed BEFORE it runs (to snapshot
4
- * pre-state) and AFTER (to capture the forward op for redo).
2
+ * Wraps a {@link Transaction} and records the inverse of every write so the
3
+ * change can be undone. Each write is observed just before it runs, to snapshot
4
+ * the previous state, and just after, to record the forward operation for redo.
5
5
  *
6
- * The wrapped mutator sees the exact same `Transaction<S>` shape; recording
7
- * is invisible. When the mutator returns, the caller reads `getEntry()` and
8
- * pushes it into the active `UndoScope`.
6
+ * The mutator sees an ordinary `Transaction<S>` and is unaware it is being
7
+ * recorded. When the mutator returns, the caller reads
8
+ * {@link RecordingTransaction.getEntry} and pushes the result onto the active
9
+ * {@link UndoScope}.
9
10
  *
10
- * Why snapshots live here (not in the UndoScope):
11
- * - Update inverse requires `prev` field values must be captured before
12
- * the write lands in the pool.
13
- * - Delete inverse requires the full model data same reason.
14
- * - Create inverse is simpler (delete by id) but the id must be known
15
- * post-creation (schema generates UUIDs if caller omitted one).
11
+ * The snapshots are taken here rather than in the undo scope because they must
12
+ * exist before the write lands: the inverse of an update needs the field's
13
+ * previous values, and the inverse of a delete needs the full row. The inverse
14
+ * of a create is just a delete by id, but that id is known only after creation,
15
+ * since the schema generates one when the caller omits it.
16
16
  */
17
17
  import { createTransaction } from './Transaction.js';
18
18
  /**
19
- * Build a transaction that records inverses + forwards as it runs.
20
- * Consumers use this only when they want the invocation to be undoable;
21
- * read-only or side-effect-only mutators should use `createTransaction`
22
- * directly to avoid the bookkeeping overhead.
19
+ * Builds a transaction that records the forward and inverse of each write as it
20
+ * runs. Use this only when the mutator should be undoable; a read-only or
21
+ * side-effect-only mutator should call {@link createTransaction} directly to skip
22
+ * the bookkeeping.
23
23
  */
24
24
  export function createRecordingTransaction(schema, store, organizationId) {
25
25
  const inverses = [];
@@ -42,8 +42,8 @@ export function createRecordingTransaction(schema, store, organizationId) {
42
42
  getEntry: (label) => {
43
43
  if (inverses.length === 0)
44
44
  return null;
45
- // Undo applies inverses in REVERSE order of how the forward writes ran.
46
- // Redo applies forwards in the ORIGINAL order.
45
+ // Undo applies the inverses in reverse order of the forward writes; redo
46
+ // applies the forwards in their original order.
47
47
  return { label, inverses: [...inverses].reverse(), forwards: [...forwards] };
48
48
  },
49
49
  };
@@ -54,30 +54,24 @@ function wrapMutateForKey(modelKey, mutate, store, inverses, forwards) {
54
54
  const model = store.pool.get(id);
55
55
  if (!model)
56
56
  return null;
57
- // Model.toJSON produces a plain object suitable for re-create. We need
58
- // ALL fields when generating a delete→create inverse, so toJSON's
59
- // wider shape is exactly right.
57
+ // toJSON produces a plain object suitable for re-creating the row. The
58
+ // delete→create inverse needs every field, which is exactly what it returns.
60
59
  return model.toJSON();
61
60
  };
62
- // Before-image for the undo inverse. Delegates to `Model.capturePreviousValues`
63
- // the SINGLE shared implementation (the stream path's
64
- // `TransactionQueue.extractPreviousData` calls the same method). `fallbackToLive`
65
- // is ON here: the manual-record path wants the live value as a last resort for
66
- // a field that was neither pre-mutated nor in the original snapshot. (The
67
- // stream path passes `false` so it can omit-and-drop instead — that flag is
68
- // the one intentional difference between the two callers.)
61
+ // Captures the before-image for an undo inverse, delegating to the model's
62
+ // shared `capturePreviousValues`. `fallbackToLive` is enabled here so that a
63
+ // field that was neither pre-mutated nor present in the original snapshot falls
64
+ // back to its current value as a last resort.
69
65
  const snapshotFields = (id, fieldNames) => {
70
66
  const model = store.pool.get(id);
71
67
  if (!model)
72
68
  return null;
73
69
  return model.capturePreviousValues(fieldNames, { fallbackToLive: true });
74
70
  };
75
- // After a mutator's `base.update` succeeds, drop the `modifiedProperties`
76
- // entries we snapshotted from so the next mutator call sees THIS update's
77
- // result as its baseline, not the pre-session old value. The transaction
78
- // queue already captured its frozen copy synchronously inside `store.save`,
79
- // so this clear is safe for server rollback. Shared with the stream path via
80
- // `Model.consumeModifiedFields`.
71
+ // After an update succeeds, clear the modified-field markers it was snapshotted
72
+ // from, so the next write to the same row sees this update's result as its
73
+ // baseline rather than the older pre-update value. The queue has already taken
74
+ // its own frozen copy, so clearing here is safe.
81
75
  const consumeModifiedFields = (id, fieldNames) => {
82
76
  store.pool.get(id)?.consumeModifiedFields(fieldNames);
83
77
  };
@@ -110,9 +104,9 @@ function wrapMutateForKey(modelKey, mutate, store, inverses, forwards) {
110
104
  }),
111
105
  update: (async (patch) => {
112
106
  if (Array.isArray(patch)) {
113
- // Snapshot all previous values BEFORE applying later patches
114
- // in the same list would corrupt the inverse state of earlier
115
- // ones if we snapshotted lazily.
107
+ // Snapshot every row's previous values before applying any patch: later
108
+ // patches in the same list would corrupt an earlier one's inverse if the
109
+ // snapshots were taken lazily.
116
110
  const prevPatches = [];
117
111
  for (const p of patch) {
118
112
  const fields = Object.keys(p).filter((k) => k !== 'id');
@@ -1,35 +1,27 @@
1
1
  /**
2
- * Transaction — Zero-style typed transaction object exposed to custom mutators.
2
+ * The typed transaction object passed to a custom mutator. A mutator receives
3
+ * `{ tx, args }` and uses `tx.mutations.<modelKey>.*` to write and
4
+ * `tx.read.<modelKey>.*` to take synchronous snapshots of the current data.
3
5
  *
4
- * A mutator function receives `{ tx, args }`. Through `tx.mutations.<modelKey>.*`
5
- * it performs writes; through `tx.read.<modelKey>.*` it takes imperative
6
- * snapshots of the ObjectPool.
6
+ * Writes are applied eagerly as they are called, with no buffering: if a mutator
7
+ * throws partway through, the writes it already made stand. Reads are synchronous
8
+ * snapshots and use a fast index lookup where one is available for the field.
7
9
  *
8
- * Semantics:
9
- * - Writes dispatch eagerly via the existing `createMutateActions` / store
10
- * primitives (no buffering, no rollback). Partial state is possible if
11
- * a mutator throws midway. Atomic rollback is a follow-up.
12
- * - Reads are synchronous snapshots via `createReaderActions`. They use the
13
- * FK index fast path where available (O(1) on registered FK fields).
14
- *
15
- * The mutate surface is intentionally one-row-at-a-time
16
- * (`create`/`update`/`delete`). For batches, mutator authors compose
17
- * `Promise.all(rows.map((r) => tx.mutations.x.create(r)))` — every push
18
- * stages in the same synchronous tick, the await happens once, and the
19
- * microtask coalescer in `TransactionQueue` collapses N pushes into one
20
- * wire commit. Same shape Zero uses: no `insertMany`, just an array map.
10
+ * The write surface deliberately works one row at a time. To write a batch,
11
+ * compose the calls yourself `Promise.all(rows.map((r) => tx.mutations.x.create(r)))`.
12
+ * Every call stages its write in the same synchronous tick and the engine
13
+ * coalesces them into a single commit on the wire, so there is no separate
14
+ * bulk-insert method to learn.
21
15
  */
22
16
  import type { Schema } from '../schema/schema.js';
23
17
  import type { SyncStoreContract } from '../react/context.js';
24
18
  import { type MutateActions } from './mutateActions.js';
25
19
  import { type ReaderActions, type ReaderFindOptions } from './readerActions.js';
26
20
  /**
27
- * The full transaction surface. `tx.mutations.<key>.*` for writes,
28
- * `tx.read.<key>.*` for imperative reads. Re-exports the base read options
29
- * type so mutator authors can type `where` payloads without reaching into
30
- * the React barrel.
31
- *
32
- * The name `mutations` (not `mutate`) matches the React hook naming.
21
+ * The full transaction surface: `tx.mutations.<key>.*` for writes and
22
+ * `tx.read.<key>.*` for reads. It also re-exports the read-options type so a
23
+ * mutator author can type a `where` payload without importing it separately. The
24
+ * property is named `mutations` to match the corresponding React hook.
33
25
  */
34
26
  export interface Transaction<S extends Schema> {
35
27
  mutations: {
@@ -41,8 +33,8 @@ export interface Transaction<S extends Schema> {
41
33
  }
42
34
  export type { ReaderFindOptions };
43
35
  /**
44
- * Build a Transaction for a single mutator invocation. The returned object
45
- * lazily instantiates per-model actions on first access so we don't pay for
46
- * models the mutator never touches.
36
+ * Builds a {@link Transaction} for a single mutator invocation. The returned
37
+ * object creates each model's actions lazily on first access, so a mutator pays
38
+ * nothing for the models it never touches.
47
39
  */
48
40
  export declare function createTransaction<S extends Schema>(schema: S, store: SyncStoreContract, organizationId: string): Transaction<S>;
@@ -1,31 +1,25 @@
1
1
  /**
2
- * Transaction — Zero-style typed transaction object exposed to custom mutators.
2
+ * The typed transaction object passed to a custom mutator. A mutator receives
3
+ * `{ tx, args }` and uses `tx.mutations.<modelKey>.*` to write and
4
+ * `tx.read.<modelKey>.*` to take synchronous snapshots of the current data.
3
5
  *
4
- * A mutator function receives `{ tx, args }`. Through `tx.mutations.<modelKey>.*`
5
- * it performs writes; through `tx.read.<modelKey>.*` it takes imperative
6
- * snapshots of the ObjectPool.
6
+ * Writes are applied eagerly as they are called, with no buffering: if a mutator
7
+ * throws partway through, the writes it already made stand. Reads are synchronous
8
+ * snapshots and use a fast index lookup where one is available for the field.
7
9
  *
8
- * Semantics:
9
- * - Writes dispatch eagerly via the existing `createMutateActions` / store
10
- * primitives (no buffering, no rollback). Partial state is possible if
11
- * a mutator throws midway. Atomic rollback is a follow-up.
12
- * - Reads are synchronous snapshots via `createReaderActions`. They use the
13
- * FK index fast path where available (O(1) on registered FK fields).
14
- *
15
- * The mutate surface is intentionally one-row-at-a-time
16
- * (`create`/`update`/`delete`). For batches, mutator authors compose
17
- * `Promise.all(rows.map((r) => tx.mutations.x.create(r)))` — every push
18
- * stages in the same synchronous tick, the await happens once, and the
19
- * microtask coalescer in `TransactionQueue` collapses N pushes into one
20
- * wire commit. Same shape Zero uses: no `insertMany`, just an array map.
10
+ * The write surface deliberately works one row at a time. To write a batch,
11
+ * compose the calls yourself `Promise.all(rows.map((r) => tx.mutations.x.create(r)))`.
12
+ * Every call stages its write in the same synchronous tick and the engine
13
+ * coalesces them into a single commit on the wire, so there is no separate
14
+ * bulk-insert method to learn.
21
15
  */
22
16
  import { createMutateActions } from './mutateActions.js';
23
17
  import { createReaderActions } from './readerActions.js';
24
18
  import { AbloValidationError } from '../errors.js';
25
19
  /**
26
- * Build a Transaction for a single mutator invocation. The returned object
27
- * lazily instantiates per-model actions on first access so we don't pay for
28
- * models the mutator never touches.
20
+ * Builds a {@link Transaction} for a single mutator invocation. The returned
21
+ * object creates each model's actions lazily on first access, so a mutator pays
22
+ * nothing for the models it never touches.
29
23
  */
30
24
  export function createTransaction(schema, store, organizationId) {
31
25
  const mutateCache = new Map();