@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,30 +1,30 @@
1
1
  /**
2
- * `awaitClaimGrant` — the client side of the fair-queue handover.
2
+ * Waits for a queued claim to reach the head of the line — the client side of
3
+ * the fair-queue handover. When a claim is contended, the server puts it in a
4
+ * queue and replies that it is queued (HTTP 202 on `/v1/claims`, or a
5
+ * `claim_queued` frame over the WebSocket). The grant is delivered later, when
6
+ * the claim reaches the head, as a `claim_granted` frame. This resolves once
7
+ * that frame arrives for the given `claimId`, so the caller's `claim` promise
8
+ * stays pending — event-driven, with no polling — until it is actually the
9
+ * caller's turn. It rejects if the claim is lost (`claim_lost`: taken away by a
10
+ * TTL lapse on disconnect, or revoked) or if an optional timeout elapses.
3
11
  *
4
- * When a `claim` is contended, the server enqueues it and replies `queued`
5
- * (HTTP 202 on `/v1/claims`, or `claim_queued` over WS). The grant is then
6
- * PUSHED later over the WS as `claim_granted` when the claim reaches the head.
7
- * This resolves once that frame arrives for our `claimId` — so the caller's
8
- * `claim` promise stays pending (event-driven; no poll, no race) until it's
9
- * actually our turn. Rejects on `claim_lost` (surfaced as `claim_lost`: the claim was taken away — TTL
10
- * lapse on disconnect, revoke) or an optional timeout.
11
- *
12
- * Takes only a minimal `{ subscribe }` transport so it unit-tests against a
13
- * fake; `SyncWebSocket` satisfies it structurally.
12
+ * It needs only a minimal `{ subscribe }` transport, so it can be tested
13
+ * against a fake; {@link SyncWebSocket} satisfies it.
14
14
  */
15
15
  export interface GrantTransport {
16
16
  subscribe(event: 'claim_acquired' | 'claim_granted' | 'claim_lost' | 'claim_queued' | 'claim_rejected', handler: (payload: Record<string, unknown>) => void): () => void;
17
17
  }
18
18
  export interface ClaimGrantInfo {
19
19
  /**
20
- * True when the grant arrived as `claim_granted` — i.e. the target was
21
- * HELD when we asked and we waited in the FIFO line behind the holder.
22
- * False for the immediate `claim_acquired` (target was free).
20
+ * True when the grant arrived as `claim_granted` — the target was held when
21
+ * the caller asked, and the caller waited in the FIFO line behind the holder.
22
+ * False for the immediate `claim_acquired`, where the target was free.
23
23
  *
24
- * Callers use this to know the row may have changed while we queued:
25
- * claim VISIBILITY is entity-scoped (org-wide subscriptions receive no
26
- * presence/claim fan-out — see Hub.broadcastPresenceChange), so the
27
- * local coordination snapshot cannot be trusted to detect "we waited".
24
+ * Callers read this to know the row may have changed while they queued. Claim
25
+ * visibility is scoped to the entity, so a broad, organization-wide
26
+ * subscription receives no presence or claim fan-out, and the local
27
+ * coordination snapshot cannot be trusted to tell whether the caller waited.
28
28
  * The grant frame itself is the authoritative signal.
29
29
  */
30
30
  readonly waited: boolean;
@@ -1,16 +1,16 @@
1
1
  /**
2
- * `awaitClaimGrant` — the client side of the fair-queue handover.
2
+ * Waits for a queued claim to reach the head of the line — the client side of
3
+ * the fair-queue handover. When a claim is contended, the server puts it in a
4
+ * queue and replies that it is queued (HTTP 202 on `/v1/claims`, or a
5
+ * `claim_queued` frame over the WebSocket). The grant is delivered later, when
6
+ * the claim reaches the head, as a `claim_granted` frame. This resolves once
7
+ * that frame arrives for the given `claimId`, so the caller's `claim` promise
8
+ * stays pending — event-driven, with no polling — until it is actually the
9
+ * caller's turn. It rejects if the claim is lost (`claim_lost`: taken away by a
10
+ * TTL lapse on disconnect, or revoked) or if an optional timeout elapses.
3
11
  *
4
- * When a `claim` is contended, the server enqueues it and replies `queued`
5
- * (HTTP 202 on `/v1/claims`, or `claim_queued` over WS). The grant is then
6
- * PUSHED later over the WS as `claim_granted` when the claim reaches the head.
7
- * This resolves once that frame arrives for our `claimId` — so the caller's
8
- * `claim` promise stays pending (event-driven; no poll, no race) until it's
9
- * actually our turn. Rejects on `claim_lost` (surfaced as `claim_lost`: the claim was taken away — TTL
10
- * lapse on disconnect, revoke) or an optional timeout.
11
- *
12
- * Takes only a minimal `{ subscribe }` transport so it unit-tests against a
13
- * fake; `SyncWebSocket` satisfies it structurally.
12
+ * It needs only a minimal `{ subscribe }` transport, so it can be tested
13
+ * against a fake; {@link SyncWebSocket} satisfies it.
14
14
  */
15
15
  import { AbloClaimedError, formatClaimedErrorMessage, claimTargetLabel, } from '../errors.js';
16
16
  import { getContext } from '../context.js';
@@ -1,18 +1,22 @@
1
1
  /**
2
- * bootstrapApply applying bootstrap results to the in-memory pool.
2
+ * Applies a bootstrap result to the in-memory object pool. When a client
3
+ * connects, the server sends either a full snapshot of the models it can see or
4
+ * a partial catch-up of the deltas it missed. These functions route that result
5
+ * into the pool, protect entities that arrived mid-bootstrap from being swept
6
+ * away as stale, and replay any deltas that queued while the bootstrap was in
7
+ * flight.
3
8
  *
4
- * Extracted from BaseSyncedStore.ts as a cohesive leaf: routing a
5
- * full/partial bootstrap result through the pool-write facade, collecting
6
- * the delta-protected ids that must survive ghost removal, and replaying
7
- * the deltas queued during an active bootstrap. The store keeps thin
8
- * protected delegates with unchanged signatures and talks back through the
9
- * minimal {@link PoolContext} — never the store's class type — so no
10
- * module cycle forms. The heavy lifting (model creation, healing, upsert,
11
- * ghost removal) stays owned by `SyncClient`.
9
+ * The functions here reach their host store only through the small
10
+ * {@link PoolContext} interface, not the store's concrete class, so the two can
11
+ * reference each other without forming an import cycle. The pool writes
12
+ * themselves creating models, healing partial rows, upserting, and removing
13
+ * stale local copies the server no longer reports are performed by the sync
14
+ * client behind that interface.
12
15
  */
13
16
  import type { BootstrapResult } from '../Database.js';
14
17
  import type { SyncDelta } from './SyncWebSocket.js';
15
- /** Rehydration statistics from bootstrap */
18
+ /** Counts describing what applying a bootstrap changed in the pool: entities
19
+ * added, updated, removed, skipped, and healed, plus the elapsed time. */
16
20
  export interface RehydrationStats {
17
21
  added: number;
18
22
  updated: number;
@@ -22,14 +26,15 @@ export interface RehydrationStats {
22
26
  elapsedMs: number;
23
27
  }
24
28
  /**
25
- * What the bootstrap-apply path needs back from its host store. The two
26
- * `SyncClient` facades come with enrichment pre-bound by the host, so the
27
- * store's `enrichRelations` override point keeps its dynamic dispatch.
29
+ * The methods the bootstrap-apply functions call back into on the host store.
30
+ * The two data-application methods arrive with relation enrichment already
31
+ * bound by the host, so a subclass override of how relations are enriched still
32
+ * takes effect through this interface.
28
33
  */
29
34
  export interface PoolContext {
30
- /** `SyncClient.applyDeltaBatchToPool` with the host's `enrichRelations` bound. */
35
+ /** Applies persisted delta results to the in-memory pool, with the host's relation enrichment bound. */
31
36
  applyDeltaBatchToPool(results: NonNullable<BootstrapResult['deltaResults']>): void;
32
- /** `SyncClient.applyBootstrapDataToPool` model creation, healing, pool upsert, ghost removal. */
37
+ /** Writes bootstrap data into the pool: creates models, heals partial rows, upserts, and removes stale local copies the server no longer reports. */
33
38
  applyBootstrapDataToPool(bootstrapData: {
34
39
  models?: Record<string, unknown[]>;
35
40
  failedModels?: string[];
@@ -42,19 +47,24 @@ export interface PoolContext {
42
47
  };
43
48
  /** Pool size — for the completion log line. */
44
49
  getPoolSize(): number;
45
- /** Every id currently in the pool for delta-protected-id collection. */
50
+ /** Every id currently in the pool, used to work out which entities must survive the stale-sweep (see {@link collectDeltaProtectedIds}). */
46
51
  getAllPoolIds(): string[];
47
- /** Deltas queued during an active bootstrap; null when none is in flight.
48
- * Backed by the host's `bootstrapDeltaQueue` field (get/set accessors). */
52
+ /** Deltas that queued while a bootstrap was in flight; null when no bootstrap
53
+ * is running. The host backs this with a field exposed through accessors. */
49
54
  bootstrapDeltaQueue: SyncDelta[] | null;
50
- /** The host's atomic frame apply`applyDeltaFrame` deliberately stays
51
- * in BaseSyncedStore (the authoritative-apply correctness seam). */
55
+ /** Applies a complete set of deltas to the pool atomically one write, one
56
+ * re-render. This entry point lives on the host, not in this module. */
52
57
  applyDeltaFrame(deltas: SyncDelta[]): void;
53
58
  }
54
- /** Apply bootstrap data to the ObjectPool with ghost removal */
55
- /** Apply bootstrap data to the ObjectPool. Delegates pool writes to SyncClient. */
59
+ /**
60
+ * Applies a bootstrap result to the in-memory pool and returns what changed.
61
+ * A full bootstrap creates, heals, and upserts models and removes stale local
62
+ * copies the server no longer reports; a partial bootstrap routes the missed
63
+ * deltas through the delta-apply path so deletions evict their entities. See
64
+ * {@link RehydrationStats} for the returned counts.
65
+ */
56
66
  export declare function applyBootstrapToPool(ctx: PoolContext, bootstrapResult: BootstrapResult, protectedIds?: ReadonlySet<string>): RehydrationStats;
57
- /** Collect IDs that must survive ghost removal (added by deltas during bootstrap) */
67
+ /** Collects the ids that must survive the post-bootstrap stale-sweep: entities added by deltas that arrived while the bootstrap was in flight. */
58
68
  export declare function collectDeltaProtectedIds(ctx: PoolContext, preBootstrapIds: ReadonlySet<string>): Set<string>;
59
- /** Replay deltas queued during bootstrap */
69
+ /** Replays the deltas that queued while a bootstrap was in flight, applying them as one atomic frame. */
60
70
  export declare function replayQueuedDeltas(ctx: PoolContext): void;
@@ -1,25 +1,33 @@
1
1
  /**
2
- * bootstrapApply applying bootstrap results to the in-memory pool.
2
+ * Applies a bootstrap result to the in-memory object pool. When a client
3
+ * connects, the server sends either a full snapshot of the models it can see or
4
+ * a partial catch-up of the deltas it missed. These functions route that result
5
+ * into the pool, protect entities that arrived mid-bootstrap from being swept
6
+ * away as stale, and replay any deltas that queued while the bootstrap was in
7
+ * flight.
3
8
  *
4
- * Extracted from BaseSyncedStore.ts as a cohesive leaf: routing a
5
- * full/partial bootstrap result through the pool-write facade, collecting
6
- * the delta-protected ids that must survive ghost removal, and replaying
7
- * the deltas queued during an active bootstrap. The store keeps thin
8
- * protected delegates with unchanged signatures and talks back through the
9
- * minimal {@link PoolContext} — never the store's class type — so no
10
- * module cycle forms. The heavy lifting (model creation, healing, upsert,
11
- * ghost removal) stays owned by `SyncClient`.
9
+ * The functions here reach their host store only through the small
10
+ * {@link PoolContext} interface, not the store's concrete class, so the two can
11
+ * reference each other without forming an import cycle. The pool writes
12
+ * themselves creating models, healing partial rows, upserting, and removing
13
+ * stale local copies the server no longer reports are performed by the sync
14
+ * client behind that interface.
12
15
  */
13
16
  import { getContext } from '../context.js';
14
- /** Apply bootstrap data to the ObjectPool with ghost removal */
15
- /** Apply bootstrap data to the ObjectPool. Delegates pool writes to SyncClient. */
17
+ /**
18
+ * Applies a bootstrap result to the in-memory pool and returns what changed.
19
+ * A full bootstrap creates, heals, and upserts models and removes stale local
20
+ * copies the server no longer reports; a partial bootstrap routes the missed
21
+ * deltas through the delta-apply path so deletions evict their entities. See
22
+ * {@link RehydrationStats} for the returned counts.
23
+ */
16
24
  export function applyBootstrapToPool(ctx, bootstrapResult, protectedIds) {
17
25
  const { bootstrapData } = bootstrapResult;
18
- // Partial bootstrap: Database.processDeltaBatch already wrote the deltas
19
- // to IDB. Route the same results through the delta-apply path so the
20
- // in-memory pool evicts deleted entities (and updates modified ones).
21
- // Without this, reconnect DELETEs persist to IDB but the canvas keeps
22
- // showing ghost layers until a full reload.
26
+ // Partial bootstrap: the missed deltas are already written to the local
27
+ // store. Route the same results through the delta-apply path so the
28
+ // in-memory pool also evicts deleted entities and updates modified ones.
29
+ // Without this, a reconnect delete persists locally but its stale copy
30
+ // lingers in the pool until a full reload.
23
31
  if (bootstrapData.type === 'partial') {
24
32
  const deltaResults = bootstrapResult.deltaResults;
25
33
  if (deltaResults && deltaResults.length > 0) {
@@ -31,7 +39,7 @@ export function applyBootstrapToPool(ctx, bootstrapResult, protectedIds) {
31
39
  return { added: 0, updated: 0, removed: 0, skipped: 0, healed: 0, elapsedMs: 0 };
32
40
  }
33
41
  const start = typeof performance !== 'undefined' ? performance.now() : Date.now();
34
- // SyncClient owns: model creation, healing, pool upsert, ghost removal
42
+ // Creates models, heals partial rows, upserts, and removes stale local copies.
35
43
  const stats = ctx.applyBootstrapDataToPool(bootstrapData, protectedIds);
36
44
  const elapsedMs = Math.round((typeof performance !== 'undefined' ? performance.now() : Date.now()) - start);
37
45
  getContext().logger.info('[BaseSyncedStore] Bootstrap applied', {
@@ -39,7 +47,7 @@ export function applyBootstrapToPool(ctx, bootstrapResult, protectedIds) {
39
47
  });
40
48
  return { ...stats, elapsedMs };
41
49
  }
42
- /** Collect IDs that must survive ghost removal (added by deltas during bootstrap) */
50
+ /** Collects the ids that must survive the post-bootstrap stale-sweep: entities added by deltas that arrived while the bootstrap was in flight. */
43
51
  export function collectDeltaProtectedIds(ctx, preBootstrapIds) {
44
52
  const protectedIds = new Set();
45
53
  for (const id of ctx.getAllPoolIds()) {
@@ -52,7 +60,7 @@ export function collectDeltaProtectedIds(ctx, preBootstrapIds) {
52
60
  }
53
61
  return protectedIds;
54
62
  }
55
- /** Replay deltas queued during bootstrap */
63
+ /** Replays the deltas that queued while a bootstrap was in flight, applying them as one atomic frame. */
56
64
  export function replayQueuedDeltas(ctx) {
57
65
  const queue = ctx.bootstrapDeltaQueue;
58
66
  ctx.bootstrapDeltaQueue = null;
@@ -1,29 +1,30 @@
1
1
  /**
2
- * Commit-path frame builders and claim instrumentation for the sync
3
- * WebSocket pure functions with no socket state, extracted from
4
- * SyncWebSocket so the wire codec is a leaf the transport (and the frame
5
- * dispatch table) can share.
2
+ * Builds the outgoing frames the sync WebSocket sends on the commit path, and
3
+ * provides the single place claim events are traced. These are stateless
4
+ * helpers that hold no socket state, so both the transport and its frame
5
+ * dispatch can share them.
6
6
  */
7
7
  import type { CommitMessage } from '../wire/index.js';
8
8
  import type { MutationOperation, ClaimEvent } from '../interfaces/index.js';
9
9
  import type { StaleNotification, ReadDependency } from '../coordination/schema.js';
10
10
  /**
11
- * Resolution value of a commit ack. `notifications` is present only when a
12
- * guarded write (`onStale: 'notify') hit a concurrent change — the
13
- * advisory self-heal signal, surfaced both here and via `conflict:notified`.
11
+ * The value a commit acknowledgement resolves to. `notifications` is present
12
+ * only when a guarded write (`onStale: 'notify'`) met a concurrent change; it
13
+ * carries the advisory signal that lets the writer self-heal, and the same
14
+ * signal also arrives on the `conflict:notified` event.
14
15
  */
15
16
  export interface CommitAck {
16
17
  lastSyncId: number;
17
18
  notifications?: StaleNotification[];
18
19
  }
19
20
  /**
20
- * Project the SDK's `MutationOperation[]` onto the canonical wire
21
- * `CommitMessage`. This is the single serialize boundary between the SDK op
22
- * type (loose `type: string`, plus an SDK-internal `options` the server never
23
- * reads) and the strict wire contract. The per-field map gives compile-time
24
- * drift detection (a `CommitOperation` shape change breaks here) and the lone
25
- * `as` narrows the validated op `type` to the wire union — the only
26
- * loosening, localized to this boundary.
21
+ * Converts the client's list of {@link MutationOperation} values into the wire
22
+ * {@link CommitMessage} the server accepts. This is the one place the loosely
23
+ * typed operation — its `type` is a string, and it carries client-only
24
+ * `options` the server never reads becomes the strict wire contract. Mapping
25
+ * each field by hand means a change to {@link CommitOperation} fails to compile
26
+ * here; the single `as` cast narrows the validated `type` to the wire union and
27
+ * is the only place that loosening happens.
27
28
  */
28
29
  export declare function buildCommitFrame(operations: readonly MutationOperation[], clientTxId: string, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null): CommitMessage;
29
30
  /**
@@ -33,11 +34,11 @@ export declare function buildCommitFrame(operations: readonly MutationOperation[
33
34
  */
34
35
  export declare function parseNotifications(raw: unknown): StaleNotification[] | undefined;
35
36
  /**
36
- * Single instrumentation point for claim events. Every `claim_*` frame routes
37
- * through here so a developer debugging a collision gets one consistent trace
38
- * — a console line AND a structured capture — without each dispatch case
39
- * re-deriving the row/holder shape. The wire payload is loosely typed
40
- * (`Record<string, unknown>`), so this is the one place that narrows it into
41
- * a {@link ClaimEvent}.
37
+ * The single place claim events are traced. Every `claim_*` frame passes
38
+ * through here, so a developer debugging a collision gets one consistent record
39
+ * — a console line and a structured capture — without each frame case
40
+ * re-deriving the row and holder shape. The wire payload is loosely typed
41
+ * (`Record<string, unknown>`), so this is the one place that narrows it into a
42
+ * {@link ClaimEvent}.
42
43
  */
43
44
  export declare function recordClaim(phase: ClaimEvent['phase'], payload: Record<string, unknown>): void;
@@ -1,20 +1,20 @@
1
1
  /**
2
- * Commit-path frame builders and claim instrumentation for the sync
3
- * WebSocket pure functions with no socket state, extracted from
4
- * SyncWebSocket so the wire codec is a leaf the transport (and the frame
5
- * dispatch table) can share.
2
+ * Builds the outgoing frames the sync WebSocket sends on the commit path, and
3
+ * provides the single place claim events are traced. These are stateless
4
+ * helpers that hold no socket state, so both the transport and its frame
5
+ * dispatch can share them.
6
6
  */
7
7
  import { getContext } from '../context.js';
8
8
  import { staleNotificationSchema, wireParticipantKindSchema, } from '../coordination/schema.js';
9
9
  import { formatClaim } from '../coordination/trace.js';
10
10
  /**
11
- * Project the SDK's `MutationOperation[]` onto the canonical wire
12
- * `CommitMessage`. This is the single serialize boundary between the SDK op
13
- * type (loose `type: string`, plus an SDK-internal `options` the server never
14
- * reads) and the strict wire contract. The per-field map gives compile-time
15
- * drift detection (a `CommitOperation` shape change breaks here) and the lone
16
- * `as` narrows the validated op `type` to the wire union — the only
17
- * loosening, localized to this boundary.
11
+ * Converts the client's list of {@link MutationOperation} values into the wire
12
+ * {@link CommitMessage} the server accepts. This is the one place the loosely
13
+ * typed operation — its `type` is a string, and it carries client-only
14
+ * `options` the server never reads becomes the strict wire contract. Mapping
15
+ * each field by hand means a change to {@link CommitOperation} fails to compile
16
+ * here; the single `as` cast narrows the validated `type` to the wire union and
17
+ * is the only place that loosening happens.
18
18
  */
19
19
  export function buildCommitFrame(operations, clientTxId, causedByTaskId, reads) {
20
20
  const payload = {
@@ -31,7 +31,7 @@ export function buildCommitFrame(operations, clientTxId, causedByTaskId, reads)
31
31
  };
32
32
  if (causedByTaskId)
33
33
  payload.causedByTaskId = causedByTaskId;
34
- // Batch-level read-set (STORM layer): rows/groups the batch was premised on.
34
+ // The read set the batch was premised on: the rows or groups the writer read before committing.
35
35
  if (reads && reads.length > 0)
36
36
  payload.reads = [...reads];
37
37
  return { type: 'commit', payload };
@@ -53,12 +53,12 @@ export function parseNotifications(raw) {
53
53
  return out.length > 0 ? out : undefined;
54
54
  }
55
55
  /**
56
- * Single instrumentation point for claim events. Every `claim_*` frame routes
57
- * through here so a developer debugging a collision gets one consistent trace
58
- * — a console line AND a structured capture — without each dispatch case
59
- * re-deriving the row/holder shape. The wire payload is loosely typed
60
- * (`Record<string, unknown>`), so this is the one place that narrows it into
61
- * a {@link ClaimEvent}.
56
+ * The single place claim events are traced. Every `claim_*` frame passes
57
+ * through here, so a developer debugging a collision gets one consistent record
58
+ * — a console line and a structured capture — without each frame case
59
+ * re-deriving the row and holder shape. The wire payload is loosely typed
60
+ * (`Record<string, unknown>`), so this is the one place that narrows it into a
61
+ * {@link ClaimEvent}.
62
62
  */
63
63
  export function recordClaim(phase, payload) {
64
64
  const str = (v) => typeof v === 'string' ? v : undefined;
@@ -1,25 +1,25 @@
1
1
  /**
2
- * Transport-driven ClaimStream factory.
2
+ * Creates a {@link ClaimStream} over a live sync connection. A claim is a
3
+ * short-lived, advisory lease a participant takes on an entity (or a field of
4
+ * one) to signal "I'm working on this"; the stream lets you take claims, see
5
+ * everyone else's, and watch the wait queue when a claim is contended.
3
6
  *
4
- * Mirrors `createPresenceStream` built directly on `SyncWebSocket`,
5
- * no SyncAgent wrapper. Claims derive their `others` view from the
6
- * same `presence_update` frames the presence stream consumes (the
7
- * Hub piggybacks `activeClaims` on every presence frame). Outbound
8
- * announce/revoke ride the same socket via `claim_begin` /
7
+ * The stream is built directly on the sync WebSocket and shares that one
8
+ * connection. It learns about other participants' claims from the same
9
+ * `presence_update` frames the {@link createPresenceStream} presence stream
10
+ * consumes — the server piggybacks each participant's `activeClaims` on every
11
+ * presence frame and sends its own claims as `claim_begin` and
9
12
  * `claim_abandon` frames.
10
13
  *
11
- * Wire contract (apps/sync-server/src/hub/types.ts):
12
- * • Outbound: `{ type: 'claim_begin', payload: { claimId,
13
- * entityType, entityId, reason, field?, estimatedMs? } }`
14
- * • Outbound: `{ type: 'claim_abandon', payload: { claimId,
15
- * entityType?, entityId? } }`
16
- * • Inbound (via presence): `event.activeClaims: Claim[]`
17
- * stamped with `declaredAt`, `expiresAt`.
18
- * • Inbound: `claim_rejected` event with conflict metadata.
19
- *
20
- * After the dual-engine collapse (step #36), this is the only
21
- * ClaimStream factory in the SDK; the older compatibility path
22
- * deletes.
14
+ * Wire frames:
15
+ * • Outbound `claim_begin` announce a claim: `{ claimId, entityType,
16
+ * entityId, reason, field?, estimatedMs? }`.
17
+ * • Outbound `claim_abandon` release it: `{ claimId, entityType?,
18
+ * entityId? }`.
19
+ * • Inbound, via presence `event.activeClaims`, each stamped with
20
+ * `declaredAt` and `expiresAt`.
21
+ * • Inbound `claim_rejected` the server refused the claim, with conflict
22
+ * metadata.
23
23
  */
24
24
  import type { SyncWebSocket } from './SyncWebSocket.js';
25
25
  import type { ClaimOptions, Claim, ClaimStream, PresenceTarget } from '../types/streams.js';
@@ -29,10 +29,11 @@ export interface ClaimStreamConfig {
29
29
  }
30
30
  export interface AttachableClaimStream extends ClaimStream {
31
31
  /**
32
- * INTERNAL lease mint sends the `claim_begin` frame and returns a held
33
- * {@link Claim} (no row `data`; the model door reads the row and stamps it).
34
- * Not part of the public `ClaimStream` surface: the only public way to take a
35
- * claim is `ablo.<model>.claim({ id })`, which builds on this.
32
+ * Mints a lease directly: sends the `claim_begin` frame and returns a held
33
+ * {@link Claim} that carries no row `data` (the resource layer reads the row
34
+ * and stamps it). This is an internal entry point, not part of the public
35
+ * {@link ClaimStream}; application code takes a claim through
36
+ * `ablo.<model>.claim({ id })`, which is built on this.
36
37
  */
37
38
  claim(target: PresenceTarget, opts?: ClaimOptions): Claim;
38
39
  attach(transport: SyncWebSocket): void;