@abloatai/ablo 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. package/AGENTS.md +5 -3
  2. package/CHANGELOG.md +34 -0
  3. package/README.md +104 -88
  4. package/dist/BaseSyncedStore.d.ts +140 -266
  5. package/dist/BaseSyncedStore.js +338 -739
  6. package/dist/Database.d.ts +62 -77
  7. package/dist/Database.js +106 -127
  8. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  9. package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
  10. package/dist/LazyReferenceCollection.d.ts +11 -15
  11. package/dist/LazyReferenceCollection.js +16 -15
  12. package/dist/Model.d.ts +37 -52
  13. package/dist/Model.js +52 -69
  14. package/dist/ModelRegistry.d.ts +46 -25
  15. package/dist/ModelRegistry.js +32 -30
  16. package/dist/NetworkMonitor.d.ts +5 -6
  17. package/dist/NetworkMonitor.js +6 -7
  18. package/dist/SyncClient.d.ts +119 -109
  19. package/dist/SyncClient.js +303 -224
  20. package/dist/SyncEngineContext.d.ts +1 -3
  21. package/dist/SyncEngineContext.js +1 -2
  22. package/dist/adapters/alwaysOnline.d.ts +6 -8
  23. package/dist/adapters/alwaysOnline.js +6 -8
  24. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  25. package/dist/adapters/inMemoryStorage.js +9 -9
  26. package/dist/agent/Agent.d.ts +39 -31
  27. package/dist/agent/Agent.js +35 -23
  28. package/dist/agent/index.d.ts +4 -4
  29. package/dist/agent/index.js +5 -5
  30. package/dist/agent/session.d.ts +47 -44
  31. package/dist/agent/session.js +37 -48
  32. package/dist/agent/types.d.ts +26 -31
  33. package/dist/agent/types.js +6 -7
  34. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  35. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  36. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  37. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +30 -31
  38. package/dist/ai-sdk/index.d.ts +25 -22
  39. package/dist/ai-sdk/index.js +25 -22
  40. package/dist/ai-sdk/wrap.d.ts +7 -8
  41. package/dist/ai-sdk/wrap.js +2 -2
  42. package/dist/auth/credentialPolicy.d.ts +74 -71
  43. package/dist/auth/credentialPolicy.js +51 -56
  44. package/dist/auth/credentialSource.d.ts +7 -18
  45. package/dist/auth/credentialSource.js +10 -18
  46. package/dist/auth/index.d.ts +59 -58
  47. package/dist/auth/index.js +34 -40
  48. package/dist/auth/schemas.d.ts +5 -4
  49. package/dist/auth/schemas.js +5 -4
  50. package/dist/batching/index.d.ts +19 -21
  51. package/dist/batching/index.js +14 -17
  52. package/dist/cli.cjs +483 -369
  53. package/dist/client/Ablo.d.ts +107 -836
  54. package/dist/client/Ablo.js +174 -833
  55. package/dist/client/ApiClient.d.ts +44 -20
  56. package/dist/client/ApiClient.js +193 -44
  57. package/dist/client/auth.d.ts +51 -60
  58. package/dist/client/auth.js +137 -110
  59. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  60. package/dist/client/claimHeartbeatLoop.js +88 -0
  61. package/dist/client/consoleLogger.d.ts +35 -0
  62. package/dist/client/consoleLogger.js +44 -0
  63. package/dist/client/createInternalComponents.d.ts +14 -17
  64. package/dist/client/createInternalComponents.js +26 -31
  65. package/dist/client/createModelProxy.d.ts +130 -120
  66. package/dist/client/createModelProxy.js +158 -124
  67. package/dist/client/credentialEndpoint.d.ts +61 -0
  68. package/dist/client/credentialEndpoint.js +86 -0
  69. package/dist/client/functionalUpdate.d.ts +29 -27
  70. package/dist/client/functionalUpdate.js +21 -21
  71. package/dist/client/hostedEndpoints.d.ts +21 -0
  72. package/dist/client/hostedEndpoints.js +21 -0
  73. package/dist/client/httpClient.d.ts +58 -54
  74. package/dist/client/httpClient.js +29 -31
  75. package/dist/client/identity.d.ts +15 -20
  76. package/dist/client/identity.js +49 -59
  77. package/dist/client/modelRegistration.d.ts +10 -0
  78. package/dist/client/modelRegistration.js +301 -0
  79. package/dist/client/options.d.ts +373 -0
  80. package/dist/client/options.js +6 -0
  81. package/dist/client/registerDataSource.d.ts +9 -9
  82. package/dist/client/registerDataSource.js +15 -16
  83. package/dist/client/resourceTypes.d.ts +333 -0
  84. package/dist/client/resourceTypes.js +7 -0
  85. package/dist/client/schemaConfig.d.ts +44 -0
  86. package/dist/client/schemaConfig.js +176 -0
  87. package/dist/client/sessionMint.d.ts +17 -13
  88. package/dist/client/sessionMint.js +26 -31
  89. package/dist/client/validateAbloOptions.d.ts +12 -14
  90. package/dist/client/validateAbloOptions.js +9 -10
  91. package/dist/client/writeOptionsSchema.d.ts +18 -16
  92. package/dist/client/writeOptionsSchema.js +23 -20
  93. package/dist/client/wsMutationExecutor.d.ts +28 -0
  94. package/dist/client/wsMutationExecutor.js +71 -0
  95. package/dist/context.d.ts +6 -4
  96. package/dist/context.js +6 -7
  97. package/dist/coordination/index.d.ts +13 -4
  98. package/dist/coordination/index.js +29 -4
  99. package/dist/coordination/schema.d.ts +176 -128
  100. package/dist/coordination/schema.js +197 -133
  101. package/dist/coordination/trace.d.ts +9 -11
  102. package/dist/coordination/trace.js +13 -15
  103. package/dist/core/DatabaseManager.d.ts +5 -8
  104. package/dist/core/DatabaseManager.js +38 -40
  105. package/dist/core/QueryProcessor.d.ts +7 -9
  106. package/dist/core/QueryProcessor.js +27 -34
  107. package/dist/core/QueryView.d.ts +17 -5
  108. package/dist/core/QueryView.js +6 -7
  109. package/dist/core/StoreManager.d.ts +14 -16
  110. package/dist/core/StoreManager.js +26 -25
  111. package/dist/core/ViewRegistry.d.ts +5 -5
  112. package/dist/core/ViewRegistry.js +4 -4
  113. package/dist/core/index.d.ts +18 -13
  114. package/dist/core/index.js +32 -26
  115. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  116. package/dist/core/openIDBWithTimeout.js +57 -54
  117. package/dist/core/queryUtils.d.ts +45 -0
  118. package/dist/core/queryUtils.js +69 -0
  119. package/dist/core/storeContract.d.ts +145 -0
  120. package/dist/core/storeContract.js +12 -0
  121. package/dist/environment.d.ts +28 -0
  122. package/dist/environment.js +21 -0
  123. package/dist/errorCodes.d.ts +118 -101
  124. package/dist/errorCodes.js +277 -260
  125. package/dist/errors.d.ts +170 -165
  126. package/dist/errors.js +161 -151
  127. package/dist/index.d.ts +30 -27
  128. package/dist/index.js +90 -82
  129. package/dist/interfaces/index.d.ts +108 -133
  130. package/dist/interfaces/index.js +5 -4
  131. package/dist/keys/index.d.ts +27 -29
  132. package/dist/keys/index.js +59 -49
  133. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  134. package/dist/mutators/RecordingTransaction.js +31 -37
  135. package/dist/mutators/Transaction.d.ts +18 -26
  136. package/dist/mutators/Transaction.js +14 -20
  137. package/dist/mutators/UndoManager.d.ts +122 -131
  138. package/dist/mutators/UndoManager.js +149 -155
  139. package/dist/mutators/defineMutators.d.ts +24 -37
  140. package/dist/mutators/defineMutators.js +14 -20
  141. package/dist/mutators/inverseOp.d.ts +12 -15
  142. package/dist/mutators/inverseOp.js +12 -15
  143. package/dist/mutators/mutateActions.d.ts +10 -9
  144. package/dist/mutators/mutateActions.js +1 -1
  145. package/dist/mutators/readerActions.d.ts +9 -8
  146. package/dist/mutators/readerActions.js +2 -2
  147. package/dist/mutators/undoApply.d.ts +31 -27
  148. package/dist/mutators/undoApply.js +26 -24
  149. package/dist/policy/index.d.ts +5 -3
  150. package/dist/policy/index.js +5 -3
  151. package/dist/policy/types.d.ts +105 -101
  152. package/dist/policy/types.js +67 -66
  153. package/dist/query/client.d.ts +32 -16
  154. package/dist/query/client.js +103 -72
  155. package/dist/query/types.d.ts +37 -60
  156. package/dist/query/types.js +13 -33
  157. package/dist/react/AbloProvider.d.ts +7 -11
  158. package/dist/react/AbloProvider.js +24 -17
  159. package/dist/react/context.d.ts +27 -146
  160. package/dist/react/context.js +9 -10
  161. package/dist/react/index.d.ts +41 -42
  162. package/dist/react/index.js +37 -38
  163. package/dist/react/internalContext.d.ts +17 -19
  164. package/dist/react/useAblo.d.ts +23 -22
  165. package/dist/react/useAblo.js +17 -15
  166. package/dist/react/useCurrentUserId.d.ts +8 -7
  167. package/dist/react/useCurrentUserId.js +8 -7
  168. package/dist/react/useErrorListener.d.ts +7 -7
  169. package/dist/react/useErrorListener.js +11 -12
  170. package/dist/react/useMutationFailureListener.d.ts +8 -8
  171. package/dist/react/useMutationFailureListener.js +9 -9
  172. package/dist/react/useMutators.d.ts +11 -11
  173. package/dist/react/useMutators.js +10 -4
  174. package/dist/react/useReactive.js +2 -3
  175. package/dist/react/useSyncStatus.d.ts +4 -6
  176. package/dist/react/useUndoScope.d.ts +7 -9
  177. package/dist/react/useUndoScope.js +3 -3
  178. package/dist/schema/coordination.d.ts +21 -25
  179. package/dist/schema/coordination.js +21 -25
  180. package/dist/schema/ddl.d.ts +43 -39
  181. package/dist/schema/ddl.js +75 -68
  182. package/dist/schema/ddlLock.d.ts +35 -0
  183. package/dist/schema/ddlLock.js +46 -0
  184. package/dist/schema/diff.d.ts +99 -61
  185. package/dist/schema/diff.js +43 -34
  186. package/dist/schema/field.d.ts +37 -42
  187. package/dist/schema/field.js +36 -49
  188. package/dist/schema/generate.d.ts +12 -12
  189. package/dist/schema/generate.js +12 -12
  190. package/dist/schema/index.d.ts +5 -4
  191. package/dist/schema/index.js +29 -21
  192. package/dist/schema/model.d.ts +121 -146
  193. package/dist/schema/model.js +24 -35
  194. package/dist/schema/openapi.d.ts +10 -9
  195. package/dist/schema/openapi.js +7 -1
  196. package/dist/schema/queries.d.ts +30 -32
  197. package/dist/schema/queries.js +24 -25
  198. package/dist/schema/relation.d.ts +89 -99
  199. package/dist/schema/relation.js +13 -13
  200. package/dist/schema/residency.d.ts +38 -0
  201. package/dist/schema/residency.js +30 -0
  202. package/dist/schema/roles.d.ts +45 -27
  203. package/dist/schema/roles.js +52 -21
  204. package/dist/schema/schema.d.ts +36 -45
  205. package/dist/schema/schema.js +42 -39
  206. package/dist/schema/select.d.ts +13 -13
  207. package/dist/schema/select.js +13 -13
  208. package/dist/schema/serialize.d.ts +36 -39
  209. package/dist/schema/serialize.js +27 -31
  210. package/dist/schema/sugar.d.ts +17 -32
  211. package/dist/schema/sugar.js +14 -29
  212. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +27 -50
  213. package/dist/schema/syncDeltaRow.js +89 -0
  214. package/dist/schema/tenancy.d.ts +44 -46
  215. package/dist/schema/tenancy.js +46 -48
  216. package/dist/server/adapter.d.ts +58 -58
  217. package/dist/server/adapter.js +13 -14
  218. package/dist/server/commit.d.ts +60 -64
  219. package/dist/server/index.d.ts +9 -10
  220. package/dist/server/index.js +1 -1
  221. package/dist/server/readConfig.d.ts +70 -0
  222. package/dist/server/readConfig.js +8 -0
  223. package/dist/server/storageMode.d.ts +23 -0
  224. package/dist/server/storageMode.js +17 -0
  225. package/dist/source/adapter.d.ts +31 -26
  226. package/dist/source/adapter.js +10 -10
  227. package/dist/source/adapters/drizzle.d.ts +28 -23
  228. package/dist/source/adapters/drizzle.js +34 -28
  229. package/dist/source/adapters/kysely.d.ts +27 -25
  230. package/dist/source/adapters/kysely.js +28 -26
  231. package/dist/source/adapters/memory.d.ts +8 -7
  232. package/dist/source/adapters/memory.js +10 -9
  233. package/dist/source/adapters/prisma.d.ts +13 -12
  234. package/dist/source/adapters/prisma.js +27 -29
  235. package/dist/source/conformance.d.ts +18 -11
  236. package/dist/source/conformance.js +27 -19
  237. package/dist/source/connector.d.ts +31 -32
  238. package/dist/source/connector.js +30 -28
  239. package/dist/source/connectorProtocol.d.ts +160 -0
  240. package/dist/source/connectorProtocol.js +162 -0
  241. package/dist/source/contract.d.ts +26 -27
  242. package/dist/source/contract.js +28 -29
  243. package/dist/source/factory.d.ts +94 -0
  244. package/dist/source/factory.js +268 -0
  245. package/dist/source/index.d.ts +10 -462
  246. package/dist/source/index.js +17 -421
  247. package/dist/source/migrations.d.ts +9 -9
  248. package/dist/source/migrations.js +9 -9
  249. package/dist/source/next.d.ts +10 -11
  250. package/dist/source/next.js +7 -8
  251. package/dist/source/pushQueue.d.ts +70 -48
  252. package/dist/source/pushQueue.js +36 -29
  253. package/dist/source/signing.d.ts +88 -0
  254. package/dist/source/signing.js +159 -0
  255. package/dist/source/types.d.ts +351 -0
  256. package/dist/source/types.js +43 -0
  257. package/dist/stores/ObjectStore.d.ts +11 -12
  258. package/dist/stores/ObjectStore.js +34 -35
  259. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  260. package/dist/stores/SyncActionStore.d.ts +8 -12
  261. package/dist/stores/SyncActionStore.js +77 -46
  262. package/dist/surface.d.ts +28 -21
  263. package/dist/surface.js +28 -20
  264. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
  265. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
  266. package/dist/sync/ConnectionManager.d.ts +47 -50
  267. package/dist/sync/ConnectionManager.js +74 -70
  268. package/dist/sync/NetworkProbe.d.ts +27 -31
  269. package/dist/sync/NetworkProbe.js +67 -72
  270. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
  271. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
  272. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
  273. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
  274. package/dist/sync/SyncWebSocket.d.ts +175 -250
  275. package/dist/sync/SyncWebSocket.js +431 -769
  276. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  277. package/dist/sync/awaitClaimGrant.js +38 -30
  278. package/dist/sync/bootstrapApply.d.ts +70 -0
  279. package/dist/sync/bootstrapApply.js +73 -0
  280. package/dist/sync/commitFrames.d.ts +44 -0
  281. package/dist/sync/commitFrames.js +94 -0
  282. package/dist/sync/createClaimStream.d.ts +23 -22
  283. package/dist/sync/createClaimStream.js +108 -25
  284. package/dist/sync/createPresenceStream.d.ts +19 -18
  285. package/dist/sync/createPresenceStream.js +25 -26
  286. package/dist/sync/createSnapshot.d.ts +13 -17
  287. package/dist/sync/createSnapshot.js +20 -26
  288. package/dist/sync/credentialLifecycle.d.ts +175 -0
  289. package/dist/sync/credentialLifecycle.js +322 -0
  290. package/dist/sync/deltaPipeline.d.ts +113 -0
  291. package/dist/sync/deltaPipeline.js +261 -0
  292. package/dist/sync/groupChange.d.ts +113 -0
  293. package/dist/sync/groupChange.js +242 -0
  294. package/dist/sync/heartbeat.d.ts +63 -0
  295. package/dist/sync/heartbeat.js +91 -0
  296. package/dist/sync/participants.d.ts +27 -27
  297. package/dist/sync/schemas.d.ts +3 -2
  298. package/dist/sync/schemas.js +14 -10
  299. package/dist/sync/syncCursor.d.ts +40 -0
  300. package/dist/sync/syncCursor.js +55 -0
  301. package/dist/sync/syncPlan.d.ts +54 -0
  302. package/dist/sync/syncPlan.js +50 -0
  303. package/dist/sync/syncPosition.d.ts +54 -49
  304. package/dist/sync/syncPosition.js +57 -52
  305. package/dist/sync/wsFrameHandlers.d.ts +116 -0
  306. package/dist/sync/wsFrameHandlers.js +374 -0
  307. package/dist/testing/fixtures/bootstrap.d.ts +21 -17
  308. package/dist/testing/fixtures/bootstrap.js +12 -6
  309. package/dist/testing/fixtures/deltas.d.ts +31 -34
  310. package/dist/testing/fixtures/deltas.js +30 -33
  311. package/dist/testing/fixtures/models.d.ts +11 -10
  312. package/dist/testing/fixtures/models.js +12 -10
  313. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  314. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  315. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -18
  316. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
  317. package/dist/testing/helpers/wait.d.ts +13 -8
  318. package/dist/testing/helpers/wait.js +13 -8
  319. package/dist/testing/index.d.ts +4 -4
  320. package/dist/testing/index.js +3 -3
  321. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  322. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  323. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  324. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  325. package/dist/testing/mocks/MockSyncContext.d.ts +21 -34
  326. package/dist/testing/mocks/MockSyncContext.js +16 -45
  327. package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
  328. package/dist/testing/mocks/MockSyncStore.js +11 -11
  329. package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
  330. package/dist/testing/mocks/MockWebSocket.js +22 -21
  331. package/dist/transactions/TransactionQueue.d.ts +190 -221
  332. package/dist/transactions/TransactionQueue.js +424 -822
  333. package/dist/transactions/TransactionStore.d.ts +20 -0
  334. package/dist/transactions/TransactionStore.js +53 -0
  335. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  336. package/dist/transactions/UnconfirmedWrites.js +104 -0
  337. package/dist/transactions/coalesceRules.d.ts +58 -0
  338. package/dist/transactions/coalesceRules.js +140 -0
  339. package/dist/transactions/commitPayload.d.ts +130 -0
  340. package/dist/transactions/commitPayload.js +143 -0
  341. package/dist/transactions/deltaConfirmation.d.ts +58 -0
  342. package/dist/transactions/deltaConfirmation.js +215 -0
  343. package/dist/transactions/optimisticApply.d.ts +49 -0
  344. package/dist/transactions/optimisticApply.js +65 -0
  345. package/dist/transactions/replayValidation.d.ts +99 -0
  346. package/dist/transactions/replayValidation.js +111 -0
  347. package/dist/types/global.d.ts +46 -41
  348. package/dist/types/global.js +20 -19
  349. package/dist/types/index.d.ts +74 -80
  350. package/dist/types/index.js +22 -27
  351. package/dist/types/modelData.d.ts +10 -0
  352. package/dist/types/modelData.js +9 -0
  353. package/dist/types/participant.d.ts +20 -0
  354. package/dist/types/participant.js +10 -0
  355. package/dist/types/streams.d.ts +216 -209
  356. package/dist/types/streams.js +7 -7
  357. package/dist/utils/asyncIterator.d.ts +25 -32
  358. package/dist/utils/asyncIterator.js +25 -32
  359. package/dist/utils/duration.d.ts +12 -15
  360. package/dist/utils/duration.js +12 -15
  361. package/dist/utils/mobxSetup.d.ts +53 -0
  362. package/dist/utils/{mobx-setup.js → mobxSetup.js} +44 -100
  363. package/dist/webhooks/events.d.ts +21 -16
  364. package/dist/webhooks/events.js +10 -8
  365. package/dist/webhooks/index.d.ts +5 -7
  366. package/dist/webhooks/index.js +5 -7
  367. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  368. package/dist/wire/delta.js +114 -0
  369. package/dist/wire/errorEnvelope.d.ts +35 -27
  370. package/dist/wire/errorEnvelope.js +38 -32
  371. package/dist/wire/frames.d.ts +150 -67
  372. package/dist/wire/frames.js +48 -1
  373. package/dist/wire/index.d.ts +18 -13
  374. package/dist/wire/index.js +36 -13
  375. package/dist/wire/listEnvelope.d.ts +16 -23
  376. package/dist/wire/listEnvelope.js +7 -6
  377. package/dist/wire/protocol.d.ts +38 -0
  378. package/dist/wire/protocol.js +38 -0
  379. package/dist/wire/protocolVersion.d.ts +60 -0
  380. package/dist/wire/protocolVersion.js +67 -0
  381. package/docs/api-keys.md +4 -3
  382. package/docs/coordination.md +59 -0
  383. package/docs/examples/existing-python-backend.md +3 -3
  384. package/docs/identity.md +4 -4
  385. package/docs/integration-guide.md +1 -1
  386. package/docs/react.md +1 -1
  387. package/docs/sessions.md +5 -7
  388. package/package.json +24 -21
  389. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  390. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  391. package/dist/client/index.d.ts +0 -36
  392. package/dist/client/index.js +0 -33
  393. package/dist/config/index.d.ts +0 -10
  394. package/dist/config/index.js +0 -12
  395. package/dist/core/query-utils.d.ts +0 -34
  396. package/dist/core/query-utils.js +0 -59
  397. package/dist/interfaces/headless.d.ts +0 -95
  398. package/dist/interfaces/headless.js +0 -41
  399. package/dist/query/index.d.ts +0 -6
  400. package/dist/query/index.js +0 -5
  401. package/dist/realtime/index.d.ts +0 -10
  402. package/dist/realtime/index.js +0 -9
  403. package/dist/schema/plane.d.ts +0 -23
  404. package/dist/schema/plane.js +0 -19
  405. package/dist/schema/sync-delta-row.js +0 -103
  406. package/dist/schema/sync-delta-wire.js +0 -102
  407. package/dist/server/next.d.ts +0 -51
  408. package/dist/server/next.js +0 -47
  409. package/dist/server/read-config.d.ts +0 -67
  410. package/dist/server/read-config.js +0 -8
  411. package/dist/server/storage-mode.d.ts +0 -1
  412. package/dist/server/storage-mode.js +0 -18
  413. package/dist/source/connector-protocol.d.ts +0 -159
  414. package/dist/source/connector-protocol.js +0 -161
  415. package/dist/sync/OfflineFlush.d.ts +0 -9
  416. package/dist/sync/OfflineFlush.js +0 -22
  417. package/dist/sync/OfflineTransactionStore.d.ts +0 -37
  418. package/dist/sync/OfflineTransactionStore.js +0 -263
  419. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  420. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  421. package/dist/transactions/index.d.ts +0 -16
  422. package/dist/transactions/index.js +0 -7
  423. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  424. package/dist/transactions/mutation-error-handler.js +0 -39
  425. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,13 +1,14 @@
1
1
  /**
2
- * Returns the app user ID passed to the nearest `<AbloProvider>`, when
3
- * the app chose to provide one.
2
+ * Returns the application user id passed to the nearest `<AbloProvider>`, or
3
+ * `null` when your app did not provide one.
4
4
  *
5
- * Hosted Ablo identity is resolved server-side from the API key, session,
6
- * or capability token. This hook is only for app-owned fields like
7
- * `assigneeId`; it is not required for Ablo sync to connect.
5
+ * Sync identity is resolved on the server from the API key or session, so this
6
+ * value is not required for sync to connect. It is here for your app's own
7
+ * fields an assignee id, a presence label, a permission check — where the
8
+ * current user matters to your data rather than to the sync layer. Reach for it
9
+ * in leaf components that need the id, for example to fill in a mutation
10
+ * payload.
8
11
  *
9
- * Use this in leaf components that need the current user ID for
10
- * mutation payloads, presence labels, permission checks, etc.
11
12
  * @example
12
13
  * function TaskRow({ id }) {
13
14
  * const userId = useCurrentUserId();
@@ -3,15 +3,16 @@ import { useContext } from 'react';
3
3
  import { AbloInternalContext } from './internalContext.js';
4
4
  import { AbloValidationError } from '../errors.js';
5
5
  /**
6
- * Returns the app user ID passed to the nearest `<AbloProvider>`, when
7
- * the app chose to provide one.
6
+ * Returns the application user id passed to the nearest `<AbloProvider>`, or
7
+ * `null` when your app did not provide one.
8
8
  *
9
- * Hosted Ablo identity is resolved server-side from the API key, session,
10
- * or capability token. This hook is only for app-owned fields like
11
- * `assigneeId`; it is not required for Ablo sync to connect.
9
+ * Sync identity is resolved on the server from the API key or session, so this
10
+ * value is not required for sync to connect. It is here for your app's own
11
+ * fields an assignee id, a presence label, a permission check — where the
12
+ * current user matters to your data rather than to the sync layer. Reach for it
13
+ * in leaf components that need the id, for example to fill in a mutation
14
+ * payload.
12
15
  *
13
- * Use this in leaf components that need the current user ID for
14
- * mutation payloads, presence labels, permission checks, etc.
15
16
  * @example
16
17
  * function TaskRow({ id }) {
17
18
  * const userId = useCurrentUserId();
@@ -1,12 +1,12 @@
1
1
  /**
2
- * Register an imperative callback that fires whenever the provider
3
- * surfaces an error. Covers engine errors (bootstrap failures,
4
- * mutation rejections), WebSocket errors, and uncaught exceptions
5
- * inside `postBootstrap` hooks.
2
+ * Registers a callback that runs whenever the provider surfaces an error. This
3
+ * covers engine errors such as bootstrap failures and mutation rejections,
4
+ * WebSocket errors, and uncaught exceptions thrown inside `postBootstrap`
5
+ * hooks.
6
6
  *
7
- * Use this for telemetry (Sentry, Datadog), user-facing toasts, or
8
- * any side effect that should NOT trigger a re-render. The listener
9
- * is stored in a ref, so re-renders don't thrash the subscription.
7
+ * Use it for side effects that should not cause a re-render — telemetry,
8
+ * logging, or a toast. The callback is held in a ref, so a re-render does not
9
+ * resubscribe.
10
10
  *
11
11
  * @example
12
12
  * function ErrorToaster() {
@@ -3,14 +3,14 @@ import { useContext, useEffect, useRef } from 'react';
3
3
  import { AbloInternalContext } from './internalContext.js';
4
4
  import { AbloValidationError } from '../errors.js';
5
5
  /**
6
- * Register an imperative callback that fires whenever the provider
7
- * surfaces an error. Covers engine errors (bootstrap failures,
8
- * mutation rejections), WebSocket errors, and uncaught exceptions
9
- * inside `postBootstrap` hooks.
6
+ * Registers a callback that runs whenever the provider surfaces an error. This
7
+ * covers engine errors such as bootstrap failures and mutation rejections,
8
+ * WebSocket errors, and uncaught exceptions thrown inside `postBootstrap`
9
+ * hooks.
10
10
  *
11
- * Use this for telemetry (Sentry, Datadog), user-facing toasts, or
12
- * any side effect that should NOT trigger a re-render. The listener
13
- * is stored in a ref, so re-renders don't thrash the subscription.
11
+ * Use it for side effects that should not cause a re-render — telemetry,
12
+ * logging, or a toast. The callback is held in a ref, so a re-render does not
13
+ * resubscribe.
14
14
  *
15
15
  * @example
16
16
  * function ErrorToaster() {
@@ -27,13 +27,12 @@ export function useErrorListener(listener) {
27
27
  throw new AbloValidationError('useErrorListener: no <AbloProvider> mounted above this component. ' +
28
28
  'Wrap your tree with <AbloProvider ...> from @abloatai/ablo/react.', { code: 'no_ablo_provider' });
29
29
  }
30
- // Stash the latest callback in a ref so the effect subscription
31
- // stays stable across renders. Matches the `useEventCallback`
32
- // pattern: late-bind the listener so callers can pass inline
33
- // arrows without thrashing the subscription.
30
+ // Hold the latest callback in a ref so the subscription stays stable across
31
+ // renders. Late-binding the listener this way lets callers pass an inline
32
+ // arrow without resubscribing on every render.
34
33
  const ref = useRef(listener);
35
34
  ref.current = listener;
36
35
  useEffect(() => {
37
- return ctx.subscribeError((err) => ref.current(err));
36
+ return ctx.subscribeError((err) => { ref.current(err); });
38
37
  }, [ctx]);
39
38
  }
@@ -5,15 +5,15 @@ export interface MutationFailurePayload {
5
5
  permanent?: boolean;
6
6
  }
7
7
  /**
8
- * Register a side-effect listener for mutation failures. Fires whenever
9
- * the underlying transaction queue rolls back an optimistic write —
10
- * permanent rejections (validation, FK, auth) and exhausted-retry
11
- * rollbacks (connection lost mid-burst).
8
+ * Subscribes a listener to mutation failures. The callback fires whenever the
9
+ * transaction queue rolls back an optimistic write — both permanent rejections
10
+ * (a validation, foreign-key, or authorization error) and rollbacks after the
11
+ * retries are exhausted (for example, the connection drops mid-write).
12
12
  *
13
- * Use this to mount a single `<MutationFailureBoundary>` near the app
14
- * shell that turns silent pool rollbacks into toasts / banners. The
15
- * listener is stored in a ref so re-renders don't thrash the
16
- * subscription — matches `useErrorListener`.
13
+ * A single listener mounted near the top of your component tree can turn these
14
+ * otherwise-silent rollbacks into toasts or banners. The callback is held in a
15
+ * ref, so re-renders do not tear down and re-create the underlying
16
+ * subscription.
17
17
  *
18
18
  * @example
19
19
  * function MutationFailureBoundary() {
@@ -3,15 +3,15 @@ import { useContext, useEffect, useRef } from 'react';
3
3
  import { AbloInternalContext } from './internalContext.js';
4
4
  import { AbloValidationError } from '../errors.js';
5
5
  /**
6
- * Register a side-effect listener for mutation failures. Fires whenever
7
- * the underlying transaction queue rolls back an optimistic write —
8
- * permanent rejections (validation, FK, auth) and exhausted-retry
9
- * rollbacks (connection lost mid-burst).
6
+ * Subscribes a listener to mutation failures. The callback fires whenever the
7
+ * transaction queue rolls back an optimistic write — both permanent rejections
8
+ * (a validation, foreign-key, or authorization error) and rollbacks after the
9
+ * retries are exhausted (for example, the connection drops mid-write).
10
10
  *
11
- * Use this to mount a single `<MutationFailureBoundary>` near the app
12
- * shell that turns silent pool rollbacks into toasts / banners. The
13
- * listener is stored in a ref so re-renders don't thrash the
14
- * subscription — matches `useErrorListener`.
11
+ * A single listener mounted near the top of your component tree can turn these
12
+ * otherwise-silent rollbacks into toasts or banners. The callback is held in a
13
+ * ref, so re-renders do not tear down and re-create the underlying
14
+ * subscription.
15
15
  *
16
16
  * @example
17
17
  * function MutationFailureBoundary() {
@@ -33,6 +33,6 @@ export function useMutationFailureListener(listener) {
33
33
  const engine = ctx.engine;
34
34
  if (!engine)
35
35
  return;
36
- return engine.onMutationFailure((payload) => ref.current(payload));
36
+ return engine.onMutationFailure((payload) => { ref.current(payload); });
37
37
  }, [ctx, ctx.engine]);
38
38
  }
@@ -3,19 +3,19 @@ import type { MutatorDefs } from '../mutators/defineMutators.js';
3
3
  import type { UndoScope } from '../mutators/UndoManager.js';
4
4
  import type { ResolveSchema } from '../types/global.js';
5
5
  /**
6
- * useMutators turn a `defineMutators` tree into callable invokers.
6
+ * Turns a mutator tree built with `defineMutators` into callable invokers. The
7
+ * returned object mirrors that tree one-to-one, but each leaf becomes an
8
+ * `(args) => Promise<TResult>` function.
7
9
  *
8
- * The returned object mirrors the mutator tree one-to-one, but each leaf is
9
- * now a `(args) => Promise<TResult>` function. Internally each invocation:
10
- * 1. Builds a fresh `Transaction` bound to the current store/org context.
11
- * 2. Calls the user's mutator with `{ tx, args }`.
12
- * 3. Returns the mutator's resolved value.
10
+ * Each invocation builds a fresh `Transaction` bound to the current store and
11
+ * organization, calls your mutator with `{ tx, args }`, and returns whatever
12
+ * the mutator resolves to.
13
13
  *
14
- * V1 error handling: if the mutator throws, we `console.error` + rethrow.
15
- * Any writes that already dispatched stay in place (no rollback). That
16
- * matches the existing behaviour of batch helpers like `saveManyOptimized`
17
- * and keeps the contract honest consumers can layer their own try/catch
18
- * + compensating writes until V2 adds atomicity.
14
+ * If a mutator throws, the error propagates to the caller and any writes it
15
+ * already dispatched stay in place — there is no automatic rollback. Wrap the
16
+ * call in your own try/catch and issue compensating writes when you need to
17
+ * undo a partial change, or pass an `undoScope` (see {@link UseMutatorsOptions})
18
+ * to record inverses for undo and redo.
19
19
  */
20
20
  /**
21
21
  * Map a `MutatorFn` onto its invoker form — strip `tx`, keep `args`/return.
@@ -30,15 +30,21 @@ export function useMutators(schemaOrMutators, mutatorsOrOptions, maybeOptions) {
30
30
  continue;
31
31
  const invokers = {};
32
32
  for (const mutatorName of Object.keys(group)) {
33
- const fn = group[mutatorName];
33
+ const maybeFn = group[mutatorName];
34
+ if (!maybeFn)
35
+ continue;
36
+ // Bind the narrowed value: `noUncheckedIndexedAccess` types the indexed
37
+ // read as `Fn | undefined`, and that narrowing doesn't survive into the
38
+ // deferred invoker closures below — a non-optional local does.
39
+ const fn = maybeFn;
34
40
  const label = `${String(modelKey)}.${mutatorName}`;
35
41
  invokers[mutatorName] = async (args) => {
36
42
  // Recording path: wrap the transaction so each write snapshots its
37
43
  // inverse. On success, push the captured entry to the scope.
38
44
  //
39
45
  // The whole snapshot → write → record sequence runs on the scope's
40
- // serialization chain so concurrent invocations (the slides UI fires
41
- // writes un-awaited) record in *invocation* order and never
46
+ // serialization chain so concurrent invocations (a caller may fire
47
+ // writes without awaiting them) record in invocation order and never
42
48
  // interleave their shared-model snapshots. See UndoScope.runRecorded.
43
49
  if (undoScope) {
44
50
  return undoScope.runRecorded(async () => {
@@ -58,7 +64,7 @@ export function useMutators(schemaOrMutators, mutatorsOrOptions, maybeOptions) {
58
64
  }
59
65
  });
60
66
  }
61
- // Non-recording path — plain transaction, identical to pre-undo V1.
67
+ // Non-recording path — plain transaction, no inverse capture.
62
68
  const tx = createTransaction(schema, store, organizationId);
63
69
  try {
64
70
  return await fn({ tx, args });
@@ -48,7 +48,7 @@ export function useReactive(compute, equals = defaultEquals) {
48
48
  // When `compute` identity changes, its closed-over observable source
49
49
  // may have swapped (e.g. useQuery memoized a new QueryView because
50
50
  // the where clause changed). The MobX reaction subscribed in
51
- // `subscribe` only tracks the observables read on its FIRST run; if
51
+ // `subscribe` only tracks the observables read on its first run; if
52
52
  // the source swaps without a re-subscription, the reaction never
53
53
  // re-tracks the new observables and `getSnapshot` keeps returning
54
54
  // the stale value forever.
@@ -71,7 +71,7 @@ export function useReactive(compute, equals = defaultEquals) {
71
71
  // `compute` is a fresh inline arrow at virtually every call site, so this
72
72
  // branch runs on essentially every render. Reconcile the snapshot against
73
73
  // the latest closure, but only force a re-subscription when the value
74
- // ACTUALLY changed. For the dominant case (same observable source, new
74
+ // actually changed. For the dominant case (same observable source, new
75
75
  // arrow identity, unchanged value) this avoids tearing down + recreating
76
76
  // the MobX reaction — and its double-compute — on every render. A genuine
77
77
  // source swap (a memoized compute closing over a new observable source)
@@ -98,7 +98,6 @@ export function useReactive(compute, equals = defaultEquals) {
98
98
  onChange();
99
99
  }
100
100
  });
101
- // eslint-disable-next-line react-hooks/exhaustive-deps
102
101
  }, [subscribeVersion]);
103
102
  const getSnapshot = useCallback(() => snapshotRef.current.value, []);
104
103
  return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
@@ -1,10 +1,8 @@
1
1
  /**
2
- * Reactive sync-status snapshot as a discriminated union. Impossible
3
- * states (e.g., "connected AND offline") are unrepresentableeach
4
- * variant carries only the fields that make sense in that state.
5
- *
6
- * Inspired by Liveblocks' `useStatus()` and Zero's `useConnectionState()`:
7
- * one hook, one switch, no six-boolean guessing games.
2
+ * A snapshot of the current sync status, modeled as a discriminated union so
3
+ * impossible states such as "connected and offline" at oncecannot be
4
+ * represented. Each variant carries only the fields that make sense in that
5
+ * state, so a single `switch` on `name` narrows to exactly what you can read.
8
6
  *
9
7
  * Variants:
10
8
  * - `initial` — the provider just mounted; no connection attempt yet.
@@ -2,16 +2,14 @@ import type { Schema } from '../schema/schema.js';
2
2
  import type { UndoScope, UndoScopeOptions } from '../mutators/UndoManager.js';
3
3
  import type { ResolveSchema } from '../types/global.js';
4
4
  /**
5
- * useUndoScope per-surface undo/redo for mutator invocations.
5
+ * Provides per-surface undo and redo for mutator invocations. Each named scope
6
+ * owns an independent undo/redo stack, so different parts of your app — a deck
7
+ * editor, a sidebar form — can undo separately without stepping on each other.
6
8
  *
7
- * Zero deliberately does NOT ship a built-in undo API; consumers build one
8
- * on top of mutation tracking. This is ours.
9
- *
10
- * Each named scope owns an independent undo/redo stack. Wire the returned
11
- * `scope` into `useMutators(schema, mutators, { undoScope: scope })` and the
12
- * invocations become recorded. `undo()` / `redo()` replay the inverses /
13
- * forwards as new transactions that do NOT re-record (the manager pushes
14
- * them between the two stacks explicitly).
9
+ * Wire the returned `scope` into `useMutators(schema, mutators, { undoScope:
10
+ * scope })` and those invocations become recorded. `undo()` and `redo()` replay
11
+ * the captured inverses and forwards as new transactions that do not record
12
+ * themselves; the manager moves the entry between the two stacks explicitly.
15
13
  *
16
14
  * @example
17
15
  * const { undo, redo, canUndo, canRedo, scope } = useUndoScope('deck-editor');
@@ -30,7 +30,7 @@ function getManager(key, factory) {
30
30
  export function useUndoScope(schemaOrName, nameOrOptions, maybeOptions) {
31
31
  const { store, organizationId, schema: ctxSchema } = useSyncContext();
32
32
  const isExplicit = typeof schemaOrName !== 'string';
33
- const schema = isExplicit ? schemaOrName : ctxSchema;
33
+ const schema = isExplicit ? (schemaOrName) : ctxSchema;
34
34
  const name = isExplicit ? nameOrOptions : schemaOrName;
35
35
  const options = (isExplicit ? maybeOptions : nameOrOptions);
36
36
  if (!schema) {
@@ -53,12 +53,12 @@ export function useUndoScope(schemaOrName, nameOrOptions, maybeOptions) {
53
53
  useEffect(() => {
54
54
  setTick(0);
55
55
  }, [scope]);
56
- // Re-render on ANY stack change — including entries recorded from the local-
56
+ // Re-render on any stack change — including entries recorded from the local-
57
57
  // mutation stream, which don't otherwise trigger a React update. Without this
58
58
  // `canUndo`/`canRedo` go stale in every consumer that didn't itself call
59
59
  // undo/redo (e.g. a keyboard handler whose Cmd+Z gate then never fires).
60
60
  useEffect(() => {
61
- return scope.onChange(() => setTick((t) => t + 1));
61
+ return scope.onChange(() => { setTick((t) => t + 1); });
62
62
  }, [scope]);
63
63
  const size = scope.size();
64
64
  return {
@@ -1,11 +1,8 @@
1
1
  /**
2
- * Coordination authoring helpers for the model `conflict` axis.
3
- *
4
- * Composable disposition functions + a `cn`/`cx`-style combinator, so a model
5
- * declares conflict behaviour the way the rest of the DSL reads
6
- * (`relation.belongsTo()`, `field.string()`) — and the way modern libraries
7
- * compose config (Better Auth's `plugins: [admin(), twoFactor()]`, shadcn's
8
- * `cx(a, b)`) — instead of a raw disposition map:
2
+ * Authoring helpers for a model's `conflict` axis — the setting that decides
3
+ * what happens when two writers touch the same row. Instead of writing a raw
4
+ * disposition map, you compose small, named functions the way the rest of the
5
+ * schema DSL reads (`relation.belongsTo()`, `field.string()`):
9
6
  *
10
7
  * ```ts
11
8
  * import { coordination, humansOverwrite, agentsReject } from '@abloatai/ablo/schema';
@@ -14,12 +11,11 @@
14
11
  * // → { user: 'overwrite', agent: 'reject' } (a human's write wins, an agent's yields)
15
12
  * ```
16
13
  *
17
- * Each helper is named for the exact disposition it applies — the same
18
- * `overwrite | reject | notify` vocabulary used by write guards (`onStale`) —
19
- * and returns a partial {@link ConflictAxis}. {@link coordination} merges them
20
- * (later rules win on key collisions). The result is plain, serializable data —
21
- * the engine interpreter and schema round-trip are unchanged; this is only a
22
- * nicer authoring surface.
14
+ * Each helper is named for the disposition it applies — drawn from the same
15
+ * `overwrite | reject | notify` vocabulary the write guards use (`onStale`) —
16
+ * and returns a partial {@link ConflictAxis}. {@link coordination} merges the
17
+ * pieces, with later rules winning on key collisions. The result is plain,
18
+ * serializable data that the engine reads at commit time.
23
19
  */
24
20
  import type { ConflictAxis } from '../policy/types.js';
25
21
  /**
@@ -27,28 +23,28 @@ import type { ConflictAxis } from '../policy/types.js';
27
23
  * disposition helper below. Compose with {@link coordination}.
28
24
  */
29
25
  export type ConflictRule = ConflictAxis;
30
- /** A human's conflicting write OVERWRITES wins; never blocked (LWW among humans). */
26
+ /** A human's conflicting write wins and overwrites the other; it is never blocked. Among humans this gives last-write-wins. */
31
27
  export declare const humansOverwrite: () => ConflictRule;
32
- /** A human's conflicting write is REJECTED yields to a held claim / stale snapshot. */
28
+ /** A human's conflicting write is rejected, yielding to a held claim or a stale snapshot. */
33
29
  export declare const humansReject: () => ConflictRule;
34
- /** A human's stale write NOTIFIES re-reads & re-applies instead of clobbering. */
30
+ /** A human's stale write triggers a notification: it re-reads and re-applies rather than clobbering. */
35
31
  export declare const humansNotify: () => ConflictRule;
36
- /** An agent's conflicting write OVERWRITES wins (rarely wanted). */
32
+ /** An agent's conflicting write wins and overwrites the other (rarely what you want). */
37
33
  export declare const agentsOverwrite: () => ConflictRule;
38
- /** An agent's conflicting write is REJECTED yields to a held claim / stale snapshot. */
34
+ /** An agent's conflicting write is rejected, yielding to a held claim or a stale snapshot. */
39
35
  export declare const agentsReject: () => ConflictRule;
40
- /** An agent's stale write NOTIFIES re-reads & re-applies instead of clobbering. */
36
+ /** An agent's stale write triggers a notification: it re-reads and re-applies rather than clobbering. */
41
37
  export declare const agentsNotify: () => ConflictRule;
42
- /** A system/automation conflicting write OVERWRITES. */
38
+ /** A system or automation write wins and overwrites the other. */
43
39
  export declare const systemOverwrite: () => ConflictRule;
44
- /** A system/automation conflicting write is REJECTED. */
40
+ /** A system or automation write is rejected. */
45
41
  export declare const systemReject: () => ConflictRule;
46
- /** A system/automation stale write NOTIFIES (re-read & re-apply). */
42
+ /** A system or automation stale write triggers a notification: it re-reads and re-applies. */
47
43
  export declare const systemNotify: () => ConflictRule;
48
44
  /**
49
- * Merge coordination rules into one {@link ConflictAxis} the `cn`/`cx` of
50
- * conflict policy. Later rules win on key collisions; an omitted committer kind
51
- * falls through to the engine default at commit time.
45
+ * Merges coordination rules into a single {@link ConflictAxis}. Later rules win
46
+ * on key collisions, and a committer kind you leave out falls through to the
47
+ * engine's default at commit time.
52
48
  *
53
49
  * ```ts
54
50
  * coordination(humansOverwrite(), agentsReject()) // → { user: 'overwrite', agent: 'reject' }
@@ -1,11 +1,8 @@
1
1
  /**
2
- * Coordination authoring helpers for the model `conflict` axis.
3
- *
4
- * Composable disposition functions + a `cn`/`cx`-style combinator, so a model
5
- * declares conflict behaviour the way the rest of the DSL reads
6
- * (`relation.belongsTo()`, `field.string()`) — and the way modern libraries
7
- * compose config (Better Auth's `plugins: [admin(), twoFactor()]`, shadcn's
8
- * `cx(a, b)`) — instead of a raw disposition map:
2
+ * Authoring helpers for a model's `conflict` axis — the setting that decides
3
+ * what happens when two writers touch the same row. Instead of writing a raw
4
+ * disposition map, you compose small, named functions the way the rest of the
5
+ * schema DSL reads (`relation.belongsTo()`, `field.string()`):
9
6
  *
10
7
  * ```ts
11
8
  * import { coordination, humansOverwrite, agentsReject } from '@abloatai/ablo/schema';
@@ -14,38 +11,37 @@
14
11
  * // → { user: 'overwrite', agent: 'reject' } (a human's write wins, an agent's yields)
15
12
  * ```
16
13
  *
17
- * Each helper is named for the exact disposition it applies — the same
18
- * `overwrite | reject | notify` vocabulary used by write guards (`onStale`) —
19
- * and returns a partial {@link ConflictAxis}. {@link coordination} merges them
20
- * (later rules win on key collisions). The result is plain, serializable data —
21
- * the engine interpreter and schema round-trip are unchanged; this is only a
22
- * nicer authoring surface.
14
+ * Each helper is named for the disposition it applies — drawn from the same
15
+ * `overwrite | reject | notify` vocabulary the write guards use (`onStale`) —
16
+ * and returns a partial {@link ConflictAxis}. {@link coordination} merges the
17
+ * pieces, with later rules winning on key collisions. The result is plain,
18
+ * serializable data that the engine reads at commit time.
23
19
  */
24
20
  // ── Humans (user sessions) ──────────────────────────────────────────────
25
- /** A human's conflicting write OVERWRITES wins; never blocked (LWW among humans). */
21
+ /** A human's conflicting write wins and overwrites the other; it is never blocked. Among humans this gives last-write-wins. */
26
22
  export const humansOverwrite = () => ({ user: 'overwrite' });
27
- /** A human's conflicting write is REJECTED yields to a held claim / stale snapshot. */
23
+ /** A human's conflicting write is rejected, yielding to a held claim or a stale snapshot. */
28
24
  export const humansReject = () => ({ user: 'reject' });
29
- /** A human's stale write NOTIFIES re-reads & re-applies instead of clobbering. */
25
+ /** A human's stale write triggers a notification: it re-reads and re-applies rather than clobbering. */
30
26
  export const humansNotify = () => ({ user: 'notify' });
31
27
  // ── Agents (AI) ─────────────────────────────────────────────────────────
32
- /** An agent's conflicting write OVERWRITES wins (rarely wanted). */
28
+ /** An agent's conflicting write wins and overwrites the other (rarely what you want). */
33
29
  export const agentsOverwrite = () => ({ agent: 'overwrite' });
34
- /** An agent's conflicting write is REJECTED yields to a held claim / stale snapshot. */
30
+ /** An agent's conflicting write is rejected, yielding to a held claim or a stale snapshot. */
35
31
  export const agentsReject = () => ({ agent: 'reject' });
36
- /** An agent's stale write NOTIFIES re-reads & re-applies instead of clobbering. */
32
+ /** An agent's stale write triggers a notification: it re-reads and re-applies rather than clobbering. */
37
33
  export const agentsNotify = () => ({ agent: 'notify' });
38
34
  // ── System / automation ─────────────────────────────────────────────────
39
- /** A system/automation conflicting write OVERWRITES. */
35
+ /** A system or automation write wins and overwrites the other. */
40
36
  export const systemOverwrite = () => ({ system: 'overwrite' });
41
- /** A system/automation conflicting write is REJECTED. */
37
+ /** A system or automation write is rejected. */
42
38
  export const systemReject = () => ({ system: 'reject' });
43
- /** A system/automation stale write NOTIFIES (re-read & re-apply). */
39
+ /** A system or automation stale write triggers a notification: it re-reads and re-applies. */
44
40
  export const systemNotify = () => ({ system: 'notify' });
45
41
  /**
46
- * Merge coordination rules into one {@link ConflictAxis} the `cn`/`cx` of
47
- * conflict policy. Later rules win on key collisions; an omitted committer kind
48
- * falls through to the engine default at commit time.
42
+ * Merges coordination rules into a single {@link ConflictAxis}. Later rules win
43
+ * on key collisions, and a committer kind you leave out falls through to the
44
+ * engine's default at commit time.
49
45
  *
50
46
  * ```ts
51
47
  * coordination(humansOverwrite(), agentsReject()) // → { user: 'overwrite', agent: 'reject' }