@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,11 +1,11 @@
1
1
  /**
2
- * Multiplayer stream types.
2
+ * The types for real-time multiplayer coordination.
3
3
  *
4
- * Ablo treats humans and agents as participants on live application
5
- * entities. Participants announce what they are reading or editing,
6
- * claim before writing, and capture context watermarks before
7
- * long-running AI work. The customer keeps their own schema, agent
8
- * stack, tools, prompts, and product policy; the sync engine provides
9
- * the shared coordination substrate.
4
+ * Ablo treats people and AI agents alike as participants working on live
5
+ * application entities. A participant announces what it is reading or editing,
6
+ * claims an entity before writing to it, and captures a context snapshot before
7
+ * starting long-running AI work. You keep your own schema, agent stack, tools,
8
+ * prompts, and product rules; this package provides the shared coordination
9
+ * layer underneath.
10
10
  */
11
11
  export {};
@@ -1,41 +1,34 @@
1
1
  /**
2
- * `asyncIteratorFrom` adapt any callback-subscription primitive
3
- * into an async iterable.
2
+ * Turns a callback-based subscription into an async iterable that yields the
3
+ * latest snapshot each time the source changes. You supply two functions:
4
+ * `subscribe(listener)`, which registers your listener and returns a teardown
5
+ * function, and `getSnapshot()`, which reads the current value. On every change
6
+ * notification the iterator calls `getSnapshot()` and hands the result to the
7
+ * consumer's `for await` loop; when the loop ends, the iterator runs the
8
+ * teardown function.
4
9
  *
5
- * The inputs are two functions:
10
+ * Because each notification yields the current snapshot rather than a specific
11
+ * event, bursts coalesce harmlessly — a consumer that falls behind still ends up
12
+ * with the freshest value. The queue is unbounded, so a consumer that never
13
+ * advances lets memory grow without limit. When individual events matter and
14
+ * must not be dropped, use {@link asyncIteratorFromEvents} instead.
6
15
  *
7
- * - `subscribe(onChange): unsubscribe` the existing reactivity
8
- * primitive on `PresenceStream` / `ClaimStream`. We register a
9
- * listener that enqueues a value every time the source mutates;
10
- * we tear it down in `return()`.
11
- * - `getSnapshot()` — read the latest value to hand to the
12
- * consumer. Called on every mutation notification.
13
- *
14
- * Back-pressure: an unlimited queue. If the consumer is slower than
15
- * the producer (rare for presence — mutations are <1/s per peer),
16
- * memory grows monotonically inside the iterator. For the current
17
- * presence workload this is fine; if we ever surface a high-frequency
18
- * stream (deltas at full firehose) we can bound the queue or drop
19
- * coalescable values.
20
- *
21
- * Multiple iterators: each call to the returned factory creates an
22
- * independent iterator with its own subscription. Iterators don't
23
- * steal values from each other — two `for await` loops on the same
24
- * stream both observe every mutation.
16
+ * Each call to the factory creates an independent iterator with its own
17
+ * subscription. Two `for await` loops over the same source each observe every
18
+ * change; they do not take values from one another.
25
19
  */
26
20
  /**
27
- * Variant of `asyncIteratorFrom` for event-per-iteration streams.
28
- *
29
- * Unlike the snapshot variant (where every notification yields the
30
- * *current value* coalescing bursts is fine because state is the
31
- * consumer's concern), this variant yields the *specific value*
32
- * pushed by each event. Use when the underlying stream delivers
33
- * discrete events that must not be dropped — e.g. `DeltaEnvelope`
34
- * firehose.
21
+ * Turns a callback-based subscription into an async iterable that yields each
22
+ * discrete event, in order, with none dropped. You supply a single
23
+ * `subscribe(push)` function: it registers your producer and returns a teardown
24
+ * function, and your producer calls `push(value)` once per event. The consumer's
25
+ * `for await` loop receives every pushed value.
35
26
  *
36
- * The `subscribe(push): unsubscribe` signature takes a callback that
37
- * enqueues an event. The consumer's `for await` receives every
38
- * enqueued value in order.
27
+ * This is the counterpart to {@link asyncIteratorFrom}. Reach for that one when
28
+ * you only need the latest state and coalescing bursts is fine; reach for this
29
+ * one when every event is significant — for example a stream of change deltas
30
+ * where skipping one would lose data. The queue is unbounded, so a consumer that
31
+ * stops advancing lets memory grow without limit.
39
32
  */
40
33
  export declare function asyncIteratorFromEvents<T>(subscribe: (push: (value: T) => void) => () => void): AsyncIterableIterator<T>;
41
34
  export declare function asyncIteratorFrom<T>(subscribe: (listener: () => void) => () => void, getSnapshot: () => T): AsyncIterableIterator<T>;
@@ -1,41 +1,34 @@
1
1
  /**
2
- * `asyncIteratorFrom` adapt any callback-subscription primitive
3
- * into an async iterable.
2
+ * Turns a callback-based subscription into an async iterable that yields the
3
+ * latest snapshot each time the source changes. You supply two functions:
4
+ * `subscribe(listener)`, which registers your listener and returns a teardown
5
+ * function, and `getSnapshot()`, which reads the current value. On every change
6
+ * notification the iterator calls `getSnapshot()` and hands the result to the
7
+ * consumer's `for await` loop; when the loop ends, the iterator runs the
8
+ * teardown function.
4
9
  *
5
- * The inputs are two functions:
10
+ * Because each notification yields the current snapshot rather than a specific
11
+ * event, bursts coalesce harmlessly — a consumer that falls behind still ends up
12
+ * with the freshest value. The queue is unbounded, so a consumer that never
13
+ * advances lets memory grow without limit. When individual events matter and
14
+ * must not be dropped, use {@link asyncIteratorFromEvents} instead.
6
15
  *
7
- * - `subscribe(onChange): unsubscribe` the existing reactivity
8
- * primitive on `PresenceStream` / `ClaimStream`. We register a
9
- * listener that enqueues a value every time the source mutates;
10
- * we tear it down in `return()`.
11
- * - `getSnapshot()` — read the latest value to hand to the
12
- * consumer. Called on every mutation notification.
13
- *
14
- * Back-pressure: an unlimited queue. If the consumer is slower than
15
- * the producer (rare for presence — mutations are <1/s per peer),
16
- * memory grows monotonically inside the iterator. For the current
17
- * presence workload this is fine; if we ever surface a high-frequency
18
- * stream (deltas at full firehose) we can bound the queue or drop
19
- * coalescable values.
20
- *
21
- * Multiple iterators: each call to the returned factory creates an
22
- * independent iterator with its own subscription. Iterators don't
23
- * steal values from each other — two `for await` loops on the same
24
- * stream both observe every mutation.
16
+ * Each call to the factory creates an independent iterator with its own
17
+ * subscription. Two `for await` loops over the same source each observe every
18
+ * change; they do not take values from one another.
25
19
  */
26
20
  /**
27
- * Variant of `asyncIteratorFrom` for event-per-iteration streams.
28
- *
29
- * Unlike the snapshot variant (where every notification yields the
30
- * *current value* coalescing bursts is fine because state is the
31
- * consumer's concern), this variant yields the *specific value*
32
- * pushed by each event. Use when the underlying stream delivers
33
- * discrete events that must not be dropped — e.g. `DeltaEnvelope`
34
- * firehose.
21
+ * Turns a callback-based subscription into an async iterable that yields each
22
+ * discrete event, in order, with none dropped. You supply a single
23
+ * `subscribe(push)` function: it registers your producer and returns a teardown
24
+ * function, and your producer calls `push(value)` once per event. The consumer's
25
+ * `for await` loop receives every pushed value.
35
26
  *
36
- * The `subscribe(push): unsubscribe` signature takes a callback that
37
- * enqueues an event. The consumer's `for await` receives every
38
- * enqueued value in order.
27
+ * This is the counterpart to {@link asyncIteratorFrom}. Reach for that one when
28
+ * you only need the latest state and coalescing bursts is fine; reach for this
29
+ * one when every event is significant — for example a stream of change deltas
30
+ * where skipping one would lose data. The queue is unbounded, so a consumer that
31
+ * stops advancing lets memory grow without limit.
39
32
  */
40
33
  export function asyncIteratorFromEvents(subscribe) {
41
34
  const queue = [];
@@ -1,28 +1,25 @@
1
1
  /**
2
- * Duration parser `'3m'`, `'24h'`, `500` (ms), `'15s'`, etc.
3
- *
4
- * The same TTL flavor every config-driven tool uses (Vercel's `ms`,
5
- * Zod's `.duration()`, a hundred CLIs). Zero deps, one regex, three
6
- * units that cover everything the SDK needs:
2
+ * Parses a duration into milliseconds. A duration is either a number of seconds
3
+ * or a string with a unit suffix — milliseconds, seconds, minutes, or hours:
7
4
  *
8
5
  * - `'500ms'` → 500 ms
9
6
  * - `'30s'` → 30 000 ms
10
7
  * - `'3m'` → 180 000 ms
11
8
  * - `'24h'` → 86 400 000 ms
12
9
  *
13
- * Back-compat escape hatch: plain numbers are kept as-is and
14
- * interpreted in the caller's existing unit (seconds for TTL APIs).
15
- * This lets us retrofit the string form to every `ttlSeconds` field
16
- * without breaking numeric callers the wrapper below branches on
17
- * the input type.
10
+ * A bare number is interpreted as seconds rather than milliseconds, matching the
11
+ * `ttlSeconds` fields used throughout the SDK, so a numeric caller and a string
12
+ * caller can pass the same field interchangeably. {@link toMs} returns
13
+ * milliseconds; {@link toSeconds} returns whole seconds.
18
14
  */
19
15
  export type Duration = number | `${number}ms` | `${number}s` | `${number}m` | `${number}h`;
20
16
  /**
21
- * Parse a duration expressed as a number-of-seconds OR a unit-suffixed
22
- * string. Returns milliseconds. A bare number is interpreted as
23
- * **seconds** (matches the existing `ttlSeconds` semantics — prevents
24
- * silent breakage when a caller migrates from numeric to string).
17
+ * Parses a duration and returns the equivalent number of milliseconds. Accepts
18
+ * either a bare number, interpreted as seconds, or a unit-suffixed string such
19
+ * as `'500ms'`, `'30s'`, `'3m'`, or `'24h'`. Throws an
20
+ * {@link AbloValidationError} with code `duration_invalid` when a string does
21
+ * not match a supported unit.
25
22
  */
26
23
  export declare function toMs(input: Duration): number;
27
- /** Convenience: same as `toMs` but divides out to seconds. */
24
+ /** Parses a duration like {@link toMs} but returns whole seconds, rounding down. */
28
25
  export declare function toSeconds(input: Duration): number;
@@ -1,20 +1,16 @@
1
1
  /**
2
- * Duration parser `'3m'`, `'24h'`, `500` (ms), `'15s'`, etc.
3
- *
4
- * The same TTL flavor every config-driven tool uses (Vercel's `ms`,
5
- * Zod's `.duration()`, a hundred CLIs). Zero deps, one regex, three
6
- * units that cover everything the SDK needs:
2
+ * Parses a duration into milliseconds. A duration is either a number of seconds
3
+ * or a string with a unit suffix — milliseconds, seconds, minutes, or hours:
7
4
  *
8
5
  * - `'500ms'` → 500 ms
9
6
  * - `'30s'` → 30 000 ms
10
7
  * - `'3m'` → 180 000 ms
11
8
  * - `'24h'` → 86 400 000 ms
12
9
  *
13
- * Back-compat escape hatch: plain numbers are kept as-is and
14
- * interpreted in the caller's existing unit (seconds for TTL APIs).
15
- * This lets us retrofit the string form to every `ttlSeconds` field
16
- * without breaking numeric callers the wrapper below branches on
17
- * the input type.
10
+ * A bare number is interpreted as seconds rather than milliseconds, matching the
11
+ * `ttlSeconds` fields used throughout the SDK, so a numeric caller and a string
12
+ * caller can pass the same field interchangeably. {@link toMs} returns
13
+ * milliseconds; {@link toSeconds} returns whole seconds.
18
14
  */
19
15
  import { AbloValidationError } from '../errors.js';
20
16
  const PATTERN = /^(\d+(?:\.\d+)?)(ms|s|m|h)$/;
@@ -25,10 +21,11 @@ const UNIT_MS = {
25
21
  h: 3_600_000,
26
22
  };
27
23
  /**
28
- * Parse a duration expressed as a number-of-seconds OR a unit-suffixed
29
- * string. Returns milliseconds. A bare number is interpreted as
30
- * **seconds** (matches the existing `ttlSeconds` semantics — prevents
31
- * silent breakage when a caller migrates from numeric to string).
24
+ * Parses a duration and returns the equivalent number of milliseconds. Accepts
25
+ * either a bare number, interpreted as seconds, or a unit-suffixed string such
26
+ * as `'500ms'`, `'30s'`, `'3m'`, or `'24h'`. Throws an
27
+ * {@link AbloValidationError} with code `duration_invalid` when a string does
28
+ * not match a supported unit.
32
29
  */
33
30
  export function toMs(input) {
34
31
  if (typeof input === 'number')
@@ -42,7 +39,7 @@ export function toMs(input) {
42
39
  const unit = match[2];
43
40
  return value * UNIT_MS[unit];
44
41
  }
45
- /** Convenience: same as `toMs` but divides out to seconds. */
42
+ /** Parses a duration like {@link toMs} but returns whole seconds, rounding down. */
46
43
  export function toSeconds(input) {
47
44
  return Math.floor(toMs(input) / 1_000);
48
45
  }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Wires a model instance into MobX so its schema-defined fields become
3
+ * observable and its mutations are tracked. This module reads the property
4
+ * metadata generated from a schema and applies the matching MobX annotation to
5
+ * each field, leaving any hand-written getter or setter in place.
6
+ */
7
+ import { type AnnotationMapEntry } from 'mobx';
8
+ import { type PropertyMetadata, type ReferenceMetadata } from '../types/index.js';
9
+ /**
10
+ * The subset of a model instance that {@link M1} reads and writes. A model calls
11
+ * {@link M1} from its constructor, where these members exist on `this`;
12
+ * declaring them here lets {@link M1} reference them without loose casts. Every
13
+ * member is optional, so a partial model — such as a test fixture — still
14
+ * satisfies the type.
15
+ */
16
+ interface M1Target {
17
+ _hasCustomObservability?: boolean;
18
+ _isConstructing?: boolean;
19
+ _extraMobxAnnotations?: Record<string, AnnotationMapEntry>;
20
+ setupObservability?(): void;
21
+ propertyChanged?(name: string, oldValue: unknown, newValue: unknown): void;
22
+ }
23
+ /**
24
+ * Makes a model instance's schema-defined properties observable with MobX. For
25
+ * each field it reads the {@link PropertyMetadata} and applies the matching MobX
26
+ * annotation — a plain observable for stored values, a computed for derived
27
+ * getters, and an action for mutating methods — while leaving any field that
28
+ * already declares its own getter and setter untouched. If the model provides
29
+ * its own `setupObservability` or sets `_hasCustomObservability`, this function
30
+ * defers to it and does nothing.
31
+ */
32
+ export declare function M1<T extends M1Target>(target: T, propertyMetadata: Map<string, PropertyMetadata>, referenceMetadata?: Map<string, ReferenceMetadata>): void;
33
+ /**
34
+ * Wraps a model class so every instance is made observable at construction time
35
+ * by calling {@link M1}. A class that manages its own observability — one whose
36
+ * prototype declares `setupObservability` or `_hasCustomObservability` — is
37
+ * returned unchanged. The wrapper preserves the original class name and its
38
+ * static members.
39
+ */
40
+ export declare function makeModelObservable(modelClass: any, propertyMetadata: Map<string, PropertyMetadata>, referenceMetadata?: Map<string, any>): any;
41
+ /**
42
+ * Reports whether a named property is one that {@link M1} makes observable —
43
+ * that is, a stored value, an ephemeral value, a reference collection, or a
44
+ * reference array. Returns `false` for an unknown property and for a computed
45
+ * reference.
46
+ */
47
+ export declare function isObservableProperty(target: any, propName: string, propertyMetadata: Map<string, PropertyMetadata>): boolean;
48
+ /**
49
+ * Returns the names of the properties that {@link M1} treats as computed: the
50
+ * referenced-model and back-reference fields derived from a foreign key.
51
+ */
52
+ export declare function getComputedProperties(propertyMetadata: Map<string, PropertyMetadata>): string[];
53
+ export {};
@@ -1,15 +1,20 @@
1
1
  /**
2
- * M1 Helper - Simplified MobX Setup
3
- *
4
- * Fixed version that doesn't conflict with existing getters/setters
2
+ * Wires a model instance into MobX so its schema-defined fields become
3
+ * observable and its mutations are tracked. This module reads the property
4
+ * metadata generated from a schema and applies the matching MobX annotation to
5
+ * each field, leaving any hand-written getter or setter in place.
5
6
  */
6
7
  import { observable, makeObservable, action, computed, observe, } from 'mobx';
7
8
  import { PropertyType } from '../types/index.js';
8
9
  import { getContext } from '../context.js';
9
10
  /**
10
- * M1 - Make properties observable with proper MobX setup
11
- *
12
- * Simplified version that respects existing getters/setters
11
+ * Makes a model instance's schema-defined properties observable with MobX. For
12
+ * each field it reads the {@link PropertyMetadata} and applies the matching MobX
13
+ * annotation a plain observable for stored values, a computed for derived
14
+ * getters, and an action for mutating methods — while leaving any field that
15
+ * already declares its own getter and setter untouched. If the model provides
16
+ * its own `setupObservability` or sets `_hasCustomObservability`, this function
17
+ * defers to it and does nothing.
13
18
  */
14
19
  export function M1(target, propertyMetadata, referenceMetadata) {
15
20
  // MobX accepts an annotations map keyed by PropertyKey. We build it
@@ -168,27 +173,18 @@ export function M1(target, propertyMetadata, referenceMetadata) {
168
173
  // Only apply if we have annotations to apply
169
174
  if (Object.keys(annotations).length > 0) {
170
175
  makeObservable(target, annotations);
171
- // Bridge MobX's observable setter to `propertyChanged()` so the
172
- // dynamic-class mutation path sees direct assignments like
173
- // `layer.position = newPos` i.e., the transaction queue gets an
174
- // update and the server eventually sees it.
176
+ // Bridge MobX's observable setter to `propertyChanged()` so a direct
177
+ // assignment like `layer.position = newPos` still records a change for the
178
+ // transaction queue, and the update reaches the server. Product code
179
+ // assigns model properties directly in many places (drag, resize,
180
+ // formatting, keyboard nudge, AI tools), so those writes must sync.
175
181
  //
176
- // History: the old hand-coded models wired setters via
177
- // `setupSimplePropertyTracking` which overrode MobX's accessors and
178
- // broke reactivity that function was correctly kept off the
179
- // schema-driven dynamic-class path. The intended replacement was
180
- // "use `store.mutate.slideLayers.update(...)` from callers," but a
181
- // large amount of existing product code (drag, resize, formatting,
182
- // keyboard nudge, AI tools, etc.) still assigns properties directly,
183
- // and making that silently not sync was the regression that broke
184
- // all slide-layer edits.
185
- //
186
- // `observe()` attaches a post-set listener WITHOUT replacing MobX's
187
- // accessors — so the observable keeps its normal reactivity and we
188
- // get a synchronous change event we can forward to
189
- // `propertyChanged()`. We scope it to `PropertyType.property`
190
- // (persisted fields) so ephemeral UI state and computed/reference
191
- // virtual fields don't leak into `modifiedProperties`.
182
+ // `observe()` attaches a post-set listener without replacing MobX's
183
+ // accessors, so the observable keeps its normal reactivity and we get a
184
+ // synchronous change event to forward to `propertyChanged()`. Only
185
+ // persisted fields (`PropertyType.property`) are observed, so ephemeral UI
186
+ // state and computed or reference fields do not leak into
187
+ // `modifiedProperties`.
192
188
  //
193
189
  // Construction-time writes (the constructor's initial field
194
190
  // population from wire data) also fire `observe` — so we gate with
@@ -199,16 +195,15 @@ export function M1(target, propertyMetadata, referenceMetadata) {
199
195
  for (const [propName, metadata] of propertyMetadata) {
200
196
  if (metadata.type !== PropertyType.property)
201
197
  continue;
202
- // Only `annotations[propName] === observable` entries are
203
- // safe to `observe()`. DON'T gate on
204
- // `Object.getOwnPropertyDescriptor(target, propName).get/set` —
205
- // `makeObservable(target, annotations)` has ALREADY installed
206
- // its own getter/setter by this point, so that descriptor
207
- // check flags every field as "custom" and silently skips
208
- // every observer. That was the root cause of `input: {}` on
209
- // the wire: `modifiedProperties` stayed empty for dynamic
210
- // models, the transaction queue couldn't find any changes to
211
- // send, and the server acked a no-op mutation.
198
+ // Only entries annotated as `observable` are safe to `observe()`. Do
199
+ // not gate on
200
+ // `Object.getOwnPropertyDescriptor(target, propName).get/set`:
201
+ // `makeObservable(target, annotations)` has already installed its own
202
+ // getter/setter by this point, so that descriptor check flags every
203
+ // field as custom and silently skips every observer. That mistake left
204
+ // `modifiedProperties` empty for dynamic models, so the transaction
205
+ // queue found no changes to send and the server acked a no-op
206
+ // mutation.
212
207
  if (!(propName in annotations))
213
208
  continue;
214
209
  // Accept any flavor of `observable` (deep, ref, shallow). `observe()`
@@ -272,66 +267,11 @@ export function M1(target, propertyMetadata, referenceMetadata) {
272
267
  }
273
268
  }
274
269
  /**
275
- * Setup simple property tracking for change detection
276
- * Only for properties without existing getters/setters
277
- */
278
- function setupSimplePropertyTracking(target, propertyMetadata) {
279
- for (const [propName, metadata] of propertyMetadata) {
280
- // Only track regular properties
281
- if (metadata.type !== PropertyType.property &&
282
- metadata.type !== PropertyType.ephemeralProperty) {
283
- continue;
284
- }
285
- // Check if property already has custom getter/setter
286
- const descriptor = Object.getOwnPropertyDescriptor(target, propName);
287
- if (descriptor && (descriptor.get || descriptor.set)) {
288
- // Property already managed, skip
289
- continue;
290
- }
291
- // Check prototype chain
292
- let proto = Object.getPrototypeOf(target);
293
- let hasCustomAccessor = false;
294
- while (proto && proto !== Object.prototype) {
295
- const protoDescriptor = Object.getOwnPropertyDescriptor(proto, propName);
296
- if (protoDescriptor && (protoDescriptor.get || protoDescriptor.set)) {
297
- hasCustomAccessor = true;
298
- break;
299
- }
300
- proto = Object.getPrototypeOf(proto);
301
- }
302
- if (hasCustomAccessor) {
303
- continue;
304
- }
305
- // Only add tracking if property exists and isn't already tracked
306
- if (propName in target) {
307
- const currentValue = target[propName];
308
- // Store value in a private field
309
- const privateField = `_tracked_${propName}`;
310
- target[privateField] = currentValue;
311
- // Create simple getter/setter for tracking
312
- Object.defineProperty(target, propName, {
313
- get() {
314
- return this[privateField];
315
- },
316
- set(newValue) {
317
- const oldValue = this[privateField];
318
- if (oldValue !== newValue) {
319
- this[privateField] = newValue;
320
- // Only track changes for non-ephemeral properties
321
- if (metadata.type === PropertyType.property && this.propertyChanged) {
322
- this.propertyChanged(propName, oldValue, newValue);
323
- }
324
- }
325
- },
326
- enumerable: true,
327
- configurable: true,
328
- });
329
- }
330
- }
331
- }
332
- /**
333
- * Helper to make a class observable
334
- * For classes that don't have custom observability
270
+ * Wraps a model class so every instance is made observable at construction time
271
+ * by calling {@link M1}. A class that manages its own observability — one whose
272
+ * prototype declares `setupObservability` or `_hasCustomObservability` — is
273
+ * returned unchanged. The wrapper preserves the original class name and its
274
+ * static members.
335
275
  */
336
276
  export function makeModelObservable(modelClass, propertyMetadata, referenceMetadata) {
337
277
  // Check if class already handles observability
@@ -355,7 +295,10 @@ export function makeModelObservable(modelClass, propertyMetadata, referenceMetad
355
295
  return WrappedClass;
356
296
  }
357
297
  /**
358
- * Utility to check if a property is observable
298
+ * Reports whether a named property is one that {@link M1} makes observable
299
+ * that is, a stored value, an ephemeral value, a reference collection, or a
300
+ * reference array. Returns `false` for an unknown property and for a computed
301
+ * reference.
359
302
  */
360
303
  export function isObservableProperty(target, propName, propertyMetadata) {
361
304
  const metadata = propertyMetadata.get(propName);
@@ -369,7 +312,8 @@ export function isObservableProperty(target, propName, propertyMetadata) {
369
312
  ].includes(metadata.type);
370
313
  }
371
314
  /**
372
- * Utility to get computed properties
315
+ * Returns the names of the properties that {@link M1} treats as computed: the
316
+ * referenced-model and back-reference fields derived from a foreign key.
373
317
  */
374
318
  export function getComputedProperties(propertyMetadata) {
375
319
  const computed = [];
@@ -1,38 +1,43 @@
1
1
  /**
2
- * A Stripe-style webhook event delivered to the customer's endpoint. Verified
3
- * (via the Standard Webhooks library) before the customer reads it.
2
+ * A webhook event delivered to a customer's endpoint, representing a single
3
+ * committed change to a row. {@link deltaToWebhookEvent} produces it, and the
4
+ * recipient verifies the delivery signature before trusting its contents.
4
5
  */
5
6
  export interface AbloWebhookEvent {
6
- /** Stable event id = `String(syncId)`. Dedupe by this (idempotency). */
7
+ /** A stable, unique event identifier equal to `String(syncId)`. Use it to
8
+ * deduplicate deliveries. */
7
9
  readonly id: string;
8
- /** `<model>.<verb>`, e.g. `"slide.updated"` — switch on this. */
10
+ /** The event type, formatted as `<model>.<verb>`, such as `"slide.updated"`.
11
+ * Branch on this to route the event. */
9
12
  readonly type: string;
10
- /** Wire model name, e.g. `"Slide"`. */
13
+ /** The name of the model whose row changed, such as `"Slide"`. */
11
14
  readonly model: string;
12
- /** The changed row's id. */
15
+ /** The identifier of the row that changed. */
13
16
  readonly objectId: string;
14
- /** Monotonic transaction-log position. ORDER by this (and dedupe). */
17
+ /** The change's position in the transaction log, increasing monotonically.
18
+ * Order events by this value. */
15
19
  readonly syncId: number;
16
- /** The post-change row (the object), or `null` on a delete. Like Stripe's
17
- * `event.data.object`. */
20
+ /** The row as it stands after the change, or `null` when the change was a
21
+ * delete. */
18
22
  readonly data: Record<string, unknown> | null;
19
- /** ISO timestamp the change was committed. */
23
+ /** The time the change was committed, as an ISO 8601 timestamp. */
20
24
  readonly createdAt: string;
21
25
  }
22
- /** The minimal delta shape the mapping reads (a `ServerSyncDelta` satisfies it). */
26
+ /** The minimal delta shape {@link deltaToWebhookEvent} reads; a full server-side
27
+ * delta record satisfies it. */
23
28
  export interface WebhookSourceDelta {
24
29
  readonly id: number;
25
30
  readonly actionType: string;
26
31
  readonly modelName: string;
27
32
  readonly modelId: string;
28
- /** `jsonb` parsed object, raw JSON string, or null. */
33
+ /** The row payload: an already-parsed object, a raw JSON string, or `null`. */
29
34
  readonly data: Record<string, unknown> | string | null;
30
35
  readonly createdAt: string;
31
36
  }
32
37
  /**
33
- * Map a committed delta to a customer-facing webhook event. Returns `null` for
34
- * internal sync deltas (permission/group changes) that aren't customer events
35
- * the caller skips those (no webhook emitted). Pure: the `syncId` and timestamp
36
- * come from the delta, so the mapping is deterministic.
38
+ * Converts a committed delta into an {@link AbloWebhookEvent}. Returns `null`
39
+ * when the delta records an internal permission or group change rather than a
40
+ * row-level change, in which case the caller emits no webhook. The mapping is
41
+ * deterministic: the event id and timestamp come directly from the delta.
37
42
  */
38
43
  export declare function deltaToWebhookEvent(delta: WebhookSourceDelta): AbloWebhookEvent | null;
@@ -1,7 +1,9 @@
1
1
  /**
2
- * The customer-facing verb per delta action. Only the CRUD-ish actions become
3
- * webhook events; `C`overing / `G`roupAdded / `S`groupRemoved are internal sync
4
- * mechanics (permission/visibility), NOT customer events no webhook.
2
+ * Maps each delta action code to the verb that appears in an event type. Only
3
+ * the row-level create, update, delete, archive, and unarchive actions produce a
4
+ * webhook. The remaining action codes describe internal permission and
5
+ * visibility changes and are deliberately absent, so {@link deltaToWebhookEvent}
6
+ * returns `null` for them.
5
7
  */
6
8
  const ACTION_VERB = {
7
9
  I: 'created',
@@ -19,15 +21,15 @@ function parseRow(data) {
19
21
  return data;
20
22
  }
21
23
  /**
22
- * Map a committed delta to a customer-facing webhook event. Returns `null` for
23
- * internal sync deltas (permission/group changes) that aren't customer events
24
- * the caller skips those (no webhook emitted). Pure: the `syncId` and timestamp
25
- * come from the delta, so the mapping is deterministic.
24
+ * Converts a committed delta into an {@link AbloWebhookEvent}. Returns `null`
25
+ * when the delta records an internal permission or group change rather than a
26
+ * row-level change, in which case the caller emits no webhook. The mapping is
27
+ * deterministic: the event id and timestamp come directly from the delta.
26
28
  */
27
29
  export function deltaToWebhookEvent(delta) {
28
30
  const verb = ACTION_VERB[delta.actionType];
29
31
  if (!verb)
30
- return null; // C / G / S — internal sync mechanics, not a customer event
32
+ return null; // an internal permission or group change, not a customer event
31
33
  return {
32
34
  id: String(delta.id),
33
35
  type: `${delta.modelName.toLowerCase()}.${verb}`,
@@ -1,10 +1,8 @@
1
1
  /**
2
- * `@abloatai/ablo/webhooks` the webhook event catalog + delta mapping.
3
- *
4
- * Customers import {@link AbloWebhookEvent} to type their handler; the server
5
- * uses {@link deltaToWebhookEvent} to turn transaction-log deltas into events
6
- * for Svix to deliver. Signature verification is NOT here — the customer uses
7
- * the open Standard Webhooks library (`svix` / `standardwebhooks`), so Ablo
8
- * ships no crypto.
2
+ * The public entry point for webhooks. Import {@link AbloWebhookEvent} to type
3
+ * your event handler, and use {@link deltaToWebhookEvent} to turn a committed
4
+ * change from the transaction log into an event to deliver. This module does not
5
+ * verify signatures and ships no cryptography; recipients verify deliveries with
6
+ * a standard webhooks library.
9
7
  */
10
8
  export { deltaToWebhookEvent, type AbloWebhookEvent, type WebhookSourceDelta, } from './events.js';