@abloatai/ablo 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. package/AGENTS.md +5 -3
  2. package/CHANGELOG.md +34 -0
  3. package/README.md +104 -88
  4. package/dist/BaseSyncedStore.d.ts +140 -266
  5. package/dist/BaseSyncedStore.js +338 -739
  6. package/dist/Database.d.ts +62 -77
  7. package/dist/Database.js +106 -127
  8. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  9. package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
  10. package/dist/LazyReferenceCollection.d.ts +11 -15
  11. package/dist/LazyReferenceCollection.js +16 -15
  12. package/dist/Model.d.ts +37 -52
  13. package/dist/Model.js +52 -69
  14. package/dist/ModelRegistry.d.ts +46 -25
  15. package/dist/ModelRegistry.js +32 -30
  16. package/dist/NetworkMonitor.d.ts +5 -6
  17. package/dist/NetworkMonitor.js +6 -7
  18. package/dist/SyncClient.d.ts +119 -109
  19. package/dist/SyncClient.js +303 -224
  20. package/dist/SyncEngineContext.d.ts +1 -3
  21. package/dist/SyncEngineContext.js +1 -2
  22. package/dist/adapters/alwaysOnline.d.ts +6 -8
  23. package/dist/adapters/alwaysOnline.js +6 -8
  24. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  25. package/dist/adapters/inMemoryStorage.js +9 -9
  26. package/dist/agent/Agent.d.ts +39 -31
  27. package/dist/agent/Agent.js +35 -23
  28. package/dist/agent/index.d.ts +4 -4
  29. package/dist/agent/index.js +5 -5
  30. package/dist/agent/session.d.ts +47 -44
  31. package/dist/agent/session.js +37 -48
  32. package/dist/agent/types.d.ts +26 -31
  33. package/dist/agent/types.js +6 -7
  34. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  35. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  36. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  37. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +30 -31
  38. package/dist/ai-sdk/index.d.ts +25 -22
  39. package/dist/ai-sdk/index.js +25 -22
  40. package/dist/ai-sdk/wrap.d.ts +7 -8
  41. package/dist/ai-sdk/wrap.js +2 -2
  42. package/dist/auth/credentialPolicy.d.ts +74 -71
  43. package/dist/auth/credentialPolicy.js +51 -56
  44. package/dist/auth/credentialSource.d.ts +7 -18
  45. package/dist/auth/credentialSource.js +10 -18
  46. package/dist/auth/index.d.ts +59 -58
  47. package/dist/auth/index.js +34 -40
  48. package/dist/auth/schemas.d.ts +5 -4
  49. package/dist/auth/schemas.js +5 -4
  50. package/dist/batching/index.d.ts +19 -21
  51. package/dist/batching/index.js +14 -17
  52. package/dist/cli.cjs +483 -369
  53. package/dist/client/Ablo.d.ts +107 -836
  54. package/dist/client/Ablo.js +174 -833
  55. package/dist/client/ApiClient.d.ts +44 -20
  56. package/dist/client/ApiClient.js +193 -44
  57. package/dist/client/auth.d.ts +51 -60
  58. package/dist/client/auth.js +137 -110
  59. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  60. package/dist/client/claimHeartbeatLoop.js +88 -0
  61. package/dist/client/consoleLogger.d.ts +35 -0
  62. package/dist/client/consoleLogger.js +44 -0
  63. package/dist/client/createInternalComponents.d.ts +14 -17
  64. package/dist/client/createInternalComponents.js +26 -31
  65. package/dist/client/createModelProxy.d.ts +130 -120
  66. package/dist/client/createModelProxy.js +158 -124
  67. package/dist/client/credentialEndpoint.d.ts +61 -0
  68. package/dist/client/credentialEndpoint.js +86 -0
  69. package/dist/client/functionalUpdate.d.ts +29 -27
  70. package/dist/client/functionalUpdate.js +21 -21
  71. package/dist/client/hostedEndpoints.d.ts +21 -0
  72. package/dist/client/hostedEndpoints.js +21 -0
  73. package/dist/client/httpClient.d.ts +58 -54
  74. package/dist/client/httpClient.js +29 -31
  75. package/dist/client/identity.d.ts +15 -20
  76. package/dist/client/identity.js +49 -59
  77. package/dist/client/modelRegistration.d.ts +10 -0
  78. package/dist/client/modelRegistration.js +301 -0
  79. package/dist/client/options.d.ts +373 -0
  80. package/dist/client/options.js +6 -0
  81. package/dist/client/registerDataSource.d.ts +9 -9
  82. package/dist/client/registerDataSource.js +15 -16
  83. package/dist/client/resourceTypes.d.ts +333 -0
  84. package/dist/client/resourceTypes.js +7 -0
  85. package/dist/client/schemaConfig.d.ts +44 -0
  86. package/dist/client/schemaConfig.js +176 -0
  87. package/dist/client/sessionMint.d.ts +17 -13
  88. package/dist/client/sessionMint.js +26 -31
  89. package/dist/client/validateAbloOptions.d.ts +12 -14
  90. package/dist/client/validateAbloOptions.js +9 -10
  91. package/dist/client/writeOptionsSchema.d.ts +18 -16
  92. package/dist/client/writeOptionsSchema.js +23 -20
  93. package/dist/client/wsMutationExecutor.d.ts +28 -0
  94. package/dist/client/wsMutationExecutor.js +71 -0
  95. package/dist/context.d.ts +6 -4
  96. package/dist/context.js +6 -7
  97. package/dist/coordination/index.d.ts +13 -4
  98. package/dist/coordination/index.js +29 -4
  99. package/dist/coordination/schema.d.ts +176 -128
  100. package/dist/coordination/schema.js +197 -133
  101. package/dist/coordination/trace.d.ts +9 -11
  102. package/dist/coordination/trace.js +13 -15
  103. package/dist/core/DatabaseManager.d.ts +5 -8
  104. package/dist/core/DatabaseManager.js +38 -40
  105. package/dist/core/QueryProcessor.d.ts +7 -9
  106. package/dist/core/QueryProcessor.js +27 -34
  107. package/dist/core/QueryView.d.ts +17 -5
  108. package/dist/core/QueryView.js +6 -7
  109. package/dist/core/StoreManager.d.ts +14 -16
  110. package/dist/core/StoreManager.js +26 -25
  111. package/dist/core/ViewRegistry.d.ts +5 -5
  112. package/dist/core/ViewRegistry.js +4 -4
  113. package/dist/core/index.d.ts +18 -13
  114. package/dist/core/index.js +32 -26
  115. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  116. package/dist/core/openIDBWithTimeout.js +57 -54
  117. package/dist/core/queryUtils.d.ts +45 -0
  118. package/dist/core/queryUtils.js +69 -0
  119. package/dist/core/storeContract.d.ts +145 -0
  120. package/dist/core/storeContract.js +12 -0
  121. package/dist/environment.d.ts +28 -0
  122. package/dist/environment.js +21 -0
  123. package/dist/errorCodes.d.ts +118 -101
  124. package/dist/errorCodes.js +277 -260
  125. package/dist/errors.d.ts +170 -165
  126. package/dist/errors.js +161 -151
  127. package/dist/index.d.ts +30 -27
  128. package/dist/index.js +90 -82
  129. package/dist/interfaces/index.d.ts +108 -133
  130. package/dist/interfaces/index.js +5 -4
  131. package/dist/keys/index.d.ts +27 -29
  132. package/dist/keys/index.js +59 -49
  133. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  134. package/dist/mutators/RecordingTransaction.js +31 -37
  135. package/dist/mutators/Transaction.d.ts +18 -26
  136. package/dist/mutators/Transaction.js +14 -20
  137. package/dist/mutators/UndoManager.d.ts +122 -131
  138. package/dist/mutators/UndoManager.js +149 -155
  139. package/dist/mutators/defineMutators.d.ts +24 -37
  140. package/dist/mutators/defineMutators.js +14 -20
  141. package/dist/mutators/inverseOp.d.ts +12 -15
  142. package/dist/mutators/inverseOp.js +12 -15
  143. package/dist/mutators/mutateActions.d.ts +10 -9
  144. package/dist/mutators/mutateActions.js +1 -1
  145. package/dist/mutators/readerActions.d.ts +9 -8
  146. package/dist/mutators/readerActions.js +2 -2
  147. package/dist/mutators/undoApply.d.ts +31 -27
  148. package/dist/mutators/undoApply.js +26 -24
  149. package/dist/policy/index.d.ts +5 -3
  150. package/dist/policy/index.js +5 -3
  151. package/dist/policy/types.d.ts +105 -101
  152. package/dist/policy/types.js +67 -66
  153. package/dist/query/client.d.ts +32 -16
  154. package/dist/query/client.js +103 -72
  155. package/dist/query/types.d.ts +37 -60
  156. package/dist/query/types.js +13 -33
  157. package/dist/react/AbloProvider.d.ts +7 -11
  158. package/dist/react/AbloProvider.js +24 -17
  159. package/dist/react/context.d.ts +27 -146
  160. package/dist/react/context.js +9 -10
  161. package/dist/react/index.d.ts +41 -42
  162. package/dist/react/index.js +37 -38
  163. package/dist/react/internalContext.d.ts +17 -19
  164. package/dist/react/useAblo.d.ts +23 -22
  165. package/dist/react/useAblo.js +17 -15
  166. package/dist/react/useCurrentUserId.d.ts +8 -7
  167. package/dist/react/useCurrentUserId.js +8 -7
  168. package/dist/react/useErrorListener.d.ts +7 -7
  169. package/dist/react/useErrorListener.js +11 -12
  170. package/dist/react/useMutationFailureListener.d.ts +8 -8
  171. package/dist/react/useMutationFailureListener.js +9 -9
  172. package/dist/react/useMutators.d.ts +11 -11
  173. package/dist/react/useMutators.js +10 -4
  174. package/dist/react/useReactive.js +2 -3
  175. package/dist/react/useSyncStatus.d.ts +4 -6
  176. package/dist/react/useUndoScope.d.ts +7 -9
  177. package/dist/react/useUndoScope.js +3 -3
  178. package/dist/schema/coordination.d.ts +21 -25
  179. package/dist/schema/coordination.js +21 -25
  180. package/dist/schema/ddl.d.ts +43 -39
  181. package/dist/schema/ddl.js +75 -68
  182. package/dist/schema/ddlLock.d.ts +35 -0
  183. package/dist/schema/ddlLock.js +46 -0
  184. package/dist/schema/diff.d.ts +99 -61
  185. package/dist/schema/diff.js +43 -34
  186. package/dist/schema/field.d.ts +37 -42
  187. package/dist/schema/field.js +36 -49
  188. package/dist/schema/generate.d.ts +12 -12
  189. package/dist/schema/generate.js +12 -12
  190. package/dist/schema/index.d.ts +5 -4
  191. package/dist/schema/index.js +29 -21
  192. package/dist/schema/model.d.ts +121 -146
  193. package/dist/schema/model.js +24 -35
  194. package/dist/schema/openapi.d.ts +10 -9
  195. package/dist/schema/openapi.js +7 -1
  196. package/dist/schema/queries.d.ts +30 -32
  197. package/dist/schema/queries.js +24 -25
  198. package/dist/schema/relation.d.ts +89 -99
  199. package/dist/schema/relation.js +13 -13
  200. package/dist/schema/residency.d.ts +38 -0
  201. package/dist/schema/residency.js +30 -0
  202. package/dist/schema/roles.d.ts +45 -27
  203. package/dist/schema/roles.js +52 -21
  204. package/dist/schema/schema.d.ts +36 -45
  205. package/dist/schema/schema.js +42 -39
  206. package/dist/schema/select.d.ts +13 -13
  207. package/dist/schema/select.js +13 -13
  208. package/dist/schema/serialize.d.ts +36 -39
  209. package/dist/schema/serialize.js +27 -31
  210. package/dist/schema/sugar.d.ts +17 -32
  211. package/dist/schema/sugar.js +14 -29
  212. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +27 -50
  213. package/dist/schema/syncDeltaRow.js +89 -0
  214. package/dist/schema/tenancy.d.ts +44 -46
  215. package/dist/schema/tenancy.js +46 -48
  216. package/dist/server/adapter.d.ts +58 -58
  217. package/dist/server/adapter.js +13 -14
  218. package/dist/server/commit.d.ts +60 -64
  219. package/dist/server/index.d.ts +9 -10
  220. package/dist/server/index.js +1 -1
  221. package/dist/server/readConfig.d.ts +70 -0
  222. package/dist/server/readConfig.js +8 -0
  223. package/dist/server/storageMode.d.ts +23 -0
  224. package/dist/server/storageMode.js +17 -0
  225. package/dist/source/adapter.d.ts +31 -26
  226. package/dist/source/adapter.js +10 -10
  227. package/dist/source/adapters/drizzle.d.ts +28 -23
  228. package/dist/source/adapters/drizzle.js +34 -28
  229. package/dist/source/adapters/kysely.d.ts +27 -25
  230. package/dist/source/adapters/kysely.js +28 -26
  231. package/dist/source/adapters/memory.d.ts +8 -7
  232. package/dist/source/adapters/memory.js +10 -9
  233. package/dist/source/adapters/prisma.d.ts +13 -12
  234. package/dist/source/adapters/prisma.js +27 -29
  235. package/dist/source/conformance.d.ts +18 -11
  236. package/dist/source/conformance.js +27 -19
  237. package/dist/source/connector.d.ts +31 -32
  238. package/dist/source/connector.js +30 -28
  239. package/dist/source/connectorProtocol.d.ts +160 -0
  240. package/dist/source/connectorProtocol.js +162 -0
  241. package/dist/source/contract.d.ts +26 -27
  242. package/dist/source/contract.js +28 -29
  243. package/dist/source/factory.d.ts +94 -0
  244. package/dist/source/factory.js +268 -0
  245. package/dist/source/index.d.ts +10 -462
  246. package/dist/source/index.js +17 -421
  247. package/dist/source/migrations.d.ts +9 -9
  248. package/dist/source/migrations.js +9 -9
  249. package/dist/source/next.d.ts +10 -11
  250. package/dist/source/next.js +7 -8
  251. package/dist/source/pushQueue.d.ts +70 -48
  252. package/dist/source/pushQueue.js +36 -29
  253. package/dist/source/signing.d.ts +88 -0
  254. package/dist/source/signing.js +159 -0
  255. package/dist/source/types.d.ts +351 -0
  256. package/dist/source/types.js +43 -0
  257. package/dist/stores/ObjectStore.d.ts +11 -12
  258. package/dist/stores/ObjectStore.js +34 -35
  259. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  260. package/dist/stores/SyncActionStore.d.ts +8 -12
  261. package/dist/stores/SyncActionStore.js +77 -46
  262. package/dist/surface.d.ts +28 -21
  263. package/dist/surface.js +28 -20
  264. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
  265. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
  266. package/dist/sync/ConnectionManager.d.ts +47 -50
  267. package/dist/sync/ConnectionManager.js +74 -70
  268. package/dist/sync/NetworkProbe.d.ts +27 -31
  269. package/dist/sync/NetworkProbe.js +67 -72
  270. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
  271. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
  272. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
  273. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
  274. package/dist/sync/SyncWebSocket.d.ts +175 -250
  275. package/dist/sync/SyncWebSocket.js +431 -769
  276. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  277. package/dist/sync/awaitClaimGrant.js +38 -30
  278. package/dist/sync/bootstrapApply.d.ts +70 -0
  279. package/dist/sync/bootstrapApply.js +73 -0
  280. package/dist/sync/commitFrames.d.ts +44 -0
  281. package/dist/sync/commitFrames.js +94 -0
  282. package/dist/sync/createClaimStream.d.ts +23 -22
  283. package/dist/sync/createClaimStream.js +108 -25
  284. package/dist/sync/createPresenceStream.d.ts +19 -18
  285. package/dist/sync/createPresenceStream.js +25 -26
  286. package/dist/sync/createSnapshot.d.ts +13 -17
  287. package/dist/sync/createSnapshot.js +20 -26
  288. package/dist/sync/credentialLifecycle.d.ts +175 -0
  289. package/dist/sync/credentialLifecycle.js +322 -0
  290. package/dist/sync/deltaPipeline.d.ts +113 -0
  291. package/dist/sync/deltaPipeline.js +261 -0
  292. package/dist/sync/groupChange.d.ts +113 -0
  293. package/dist/sync/groupChange.js +242 -0
  294. package/dist/sync/heartbeat.d.ts +63 -0
  295. package/dist/sync/heartbeat.js +91 -0
  296. package/dist/sync/participants.d.ts +27 -27
  297. package/dist/sync/schemas.d.ts +3 -2
  298. package/dist/sync/schemas.js +14 -10
  299. package/dist/sync/syncCursor.d.ts +40 -0
  300. package/dist/sync/syncCursor.js +55 -0
  301. package/dist/sync/syncPlan.d.ts +54 -0
  302. package/dist/sync/syncPlan.js +50 -0
  303. package/dist/sync/syncPosition.d.ts +54 -49
  304. package/dist/sync/syncPosition.js +57 -52
  305. package/dist/sync/wsFrameHandlers.d.ts +116 -0
  306. package/dist/sync/wsFrameHandlers.js +374 -0
  307. package/dist/testing/fixtures/bootstrap.d.ts +21 -17
  308. package/dist/testing/fixtures/bootstrap.js +12 -6
  309. package/dist/testing/fixtures/deltas.d.ts +31 -34
  310. package/dist/testing/fixtures/deltas.js +30 -33
  311. package/dist/testing/fixtures/models.d.ts +11 -10
  312. package/dist/testing/fixtures/models.js +12 -10
  313. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  314. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  315. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -18
  316. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
  317. package/dist/testing/helpers/wait.d.ts +13 -8
  318. package/dist/testing/helpers/wait.js +13 -8
  319. package/dist/testing/index.d.ts +4 -4
  320. package/dist/testing/index.js +3 -3
  321. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  322. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  323. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  324. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  325. package/dist/testing/mocks/MockSyncContext.d.ts +21 -34
  326. package/dist/testing/mocks/MockSyncContext.js +16 -45
  327. package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
  328. package/dist/testing/mocks/MockSyncStore.js +11 -11
  329. package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
  330. package/dist/testing/mocks/MockWebSocket.js +22 -21
  331. package/dist/transactions/TransactionQueue.d.ts +190 -221
  332. package/dist/transactions/TransactionQueue.js +424 -822
  333. package/dist/transactions/TransactionStore.d.ts +20 -0
  334. package/dist/transactions/TransactionStore.js +53 -0
  335. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  336. package/dist/transactions/UnconfirmedWrites.js +104 -0
  337. package/dist/transactions/coalesceRules.d.ts +58 -0
  338. package/dist/transactions/coalesceRules.js +140 -0
  339. package/dist/transactions/commitPayload.d.ts +130 -0
  340. package/dist/transactions/commitPayload.js +143 -0
  341. package/dist/transactions/deltaConfirmation.d.ts +58 -0
  342. package/dist/transactions/deltaConfirmation.js +215 -0
  343. package/dist/transactions/optimisticApply.d.ts +49 -0
  344. package/dist/transactions/optimisticApply.js +65 -0
  345. package/dist/transactions/replayValidation.d.ts +99 -0
  346. package/dist/transactions/replayValidation.js +111 -0
  347. package/dist/types/global.d.ts +46 -41
  348. package/dist/types/global.js +20 -19
  349. package/dist/types/index.d.ts +74 -80
  350. package/dist/types/index.js +22 -27
  351. package/dist/types/modelData.d.ts +10 -0
  352. package/dist/types/modelData.js +9 -0
  353. package/dist/types/participant.d.ts +20 -0
  354. package/dist/types/participant.js +10 -0
  355. package/dist/types/streams.d.ts +216 -209
  356. package/dist/types/streams.js +7 -7
  357. package/dist/utils/asyncIterator.d.ts +25 -32
  358. package/dist/utils/asyncIterator.js +25 -32
  359. package/dist/utils/duration.d.ts +12 -15
  360. package/dist/utils/duration.js +12 -15
  361. package/dist/utils/mobxSetup.d.ts +53 -0
  362. package/dist/utils/{mobx-setup.js → mobxSetup.js} +44 -100
  363. package/dist/webhooks/events.d.ts +21 -16
  364. package/dist/webhooks/events.js +10 -8
  365. package/dist/webhooks/index.d.ts +5 -7
  366. package/dist/webhooks/index.js +5 -7
  367. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  368. package/dist/wire/delta.js +114 -0
  369. package/dist/wire/errorEnvelope.d.ts +35 -27
  370. package/dist/wire/errorEnvelope.js +38 -32
  371. package/dist/wire/frames.d.ts +150 -67
  372. package/dist/wire/frames.js +48 -1
  373. package/dist/wire/index.d.ts +18 -13
  374. package/dist/wire/index.js +36 -13
  375. package/dist/wire/listEnvelope.d.ts +16 -23
  376. package/dist/wire/listEnvelope.js +7 -6
  377. package/dist/wire/protocol.d.ts +38 -0
  378. package/dist/wire/protocol.js +38 -0
  379. package/dist/wire/protocolVersion.d.ts +60 -0
  380. package/dist/wire/protocolVersion.js +67 -0
  381. package/docs/api-keys.md +4 -3
  382. package/docs/coordination.md +59 -0
  383. package/docs/examples/existing-python-backend.md +3 -3
  384. package/docs/identity.md +4 -4
  385. package/docs/integration-guide.md +1 -1
  386. package/docs/react.md +1 -1
  387. package/docs/sessions.md +5 -7
  388. package/package.json +24 -21
  389. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  390. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  391. package/dist/client/index.d.ts +0 -36
  392. package/dist/client/index.js +0 -33
  393. package/dist/config/index.d.ts +0 -10
  394. package/dist/config/index.js +0 -12
  395. package/dist/core/query-utils.d.ts +0 -34
  396. package/dist/core/query-utils.js +0 -59
  397. package/dist/interfaces/headless.d.ts +0 -95
  398. package/dist/interfaces/headless.js +0 -41
  399. package/dist/query/index.d.ts +0 -6
  400. package/dist/query/index.js +0 -5
  401. package/dist/realtime/index.d.ts +0 -10
  402. package/dist/realtime/index.js +0 -9
  403. package/dist/schema/plane.d.ts +0 -23
  404. package/dist/schema/plane.js +0 -19
  405. package/dist/schema/sync-delta-row.js +0 -103
  406. package/dist/schema/sync-delta-wire.js +0 -102
  407. package/dist/server/next.d.ts +0 -51
  408. package/dist/server/next.js +0 -47
  409. package/dist/server/read-config.d.ts +0 -67
  410. package/dist/server/read-config.js +0 -8
  411. package/dist/server/storage-mode.d.ts +0 -1
  412. package/dist/server/storage-mode.js +0 -18
  413. package/dist/source/connector-protocol.d.ts +0 -159
  414. package/dist/source/connector-protocol.js +0 -161
  415. package/dist/sync/OfflineFlush.d.ts +0 -9
  416. package/dist/sync/OfflineFlush.js +0 -22
  417. package/dist/sync/OfflineTransactionStore.d.ts +0 -37
  418. package/dist/sync/OfflineTransactionStore.js +0 -263
  419. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  420. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  421. package/dist/transactions/index.d.ts +0 -16
  422. package/dist/transactions/index.js +0 -7
  423. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  424. package/dist/transactions/mutation-error-handler.js +0 -39
  425. package/dist/utils/mobx-setup.d.ts +0 -42
package/dist/errors.js CHANGED
@@ -1,18 +1,14 @@
1
1
  /**
2
- * Typed error hierarchy for `@abloatai/ablo`.
3
- *
4
- * Inlined directly so the publishable dist is self-contained. The public
5
- * package should never reference an unpublished internal package from emitted
6
- * JS; strict bundlers surface that immediately.
7
- *
8
- * ### Two patterns for consumers
2
+ * The typed error hierarchy for this package. Every error the SDK throws is an
3
+ * {@link AbloError} or one of its subclasses, so a consumer can catch broadly or
4
+ * narrowly. There are two equivalent ways to tell errors apart:
9
5
  *
10
6
  * ```ts
11
- * // Stripe-style instanceof
7
+ * // By class, with instanceof
12
8
  * if (err instanceof AbloRateLimitError) backoff(err.retryAfterSeconds);
13
9
  *
14
- * // Discriminator-string (for cross-boundary cases where the class
15
- * // identity gets lost, e.g. across a web worker postMessage)
10
+ * // By discriminator string, for cases where class identity is lost —
11
+ * // for example after an error crosses a web worker boundary
16
12
  * if (err.type === 'AbloRateLimitError') { ... }
17
13
  * ```
18
14
  *
@@ -23,37 +19,41 @@ import { errorCodeSpec, classifyRecovery } from './errorCodes.js';
23
19
  import { wireClaimSummarySchema, descriptionFromMeta, } from './coordination/schema.js';
24
20
  export { ERROR_CODES, ERROR_CONTRACT_VERSION, errorCodeSpec, isRetryableCode, classifyRecovery, recoveryClassSchema, RECOVERY_CLASSES, } from './errorCodes.js';
25
21
  // ── AbloError hierarchy — the typed error surface ────────────────────
26
- /** Common shape for all errors thrown by this SDK. */
22
+ /**
23
+ * The base class for every error this SDK throws. It carries the fields common
24
+ * to all of them — a {@link type} discriminator, an optional stable {@link code},
25
+ * and optional HTTP and diagnostic metadata — and defines the shared JSON and
26
+ * string serialization. Every other error class extends it.
27
+ */
27
28
  export class AbloError extends Error {
28
- /** Discriminator string matches the class name. Lets consumers
29
- * switch on `e.type` without `instanceof` checks across package
30
- * boundaries (matches Stripe's `err.type` pattern). */
29
+ /** A discriminator string equal to the class name. Switch on `error.type` to
30
+ * distinguish error kinds when `instanceof` is unreliable, such as after an
31
+ * error has crossed a serialization boundary. */
31
32
  type = 'AbloError';
32
- /** Stable short identifier for logs + metrics, drawn from the closed
33
- * {@link ErrorCode} registry — e.g. `'apikey_invalid'`,
34
- * `'capability_scope_denied'`. Stored as a plain `string` (not
35
- * `ErrorCode`) so an older SDK still surfaces a newer server's code it
36
- * doesn't recognise yet; producers are constrained at the constructor
37
- * param instead. */
33
+ /** A stable, machine-readable identifier for the error, drawn from the
34
+ * {@link ErrorCode} registry — for example `'apikey_invalid'` or
35
+ * `'capability_scope_denied'` suitable for logs, metrics, and `switch`
36
+ * handling. It is typed as a plain `string` rather than {@link ErrorCode} so
37
+ * this client can still surface a code from a newer server that it does not
38
+ * yet recognize; code producers are constrained at the constructor instead. */
38
39
  code;
39
- /** HTTP status code when the error originated from an HTTP response. */
40
+ /** HTTP status code, when the error originated from an HTTP response. */
40
41
  httpStatus;
41
- /** Correlation id for ops present when the server sent one on
42
- * `x-request-id`. Include in support tickets. */
42
+ /** A correlation id for tracing a request through the server, present when the
43
+ * server returned one on the `x-request-id` header. Include it in support
44
+ * requests. */
43
45
  requestId;
44
- /** Which input caused the error a model/field path like
45
- * `'dataroomMember.grants.subject'`. Mirrors Stripe's `error.param`;
46
- * lets tooling point at the exact offending declaration. */
46
+ /** The specific input that caused the error, as a model or field path such as
47
+ * `'dataroomMember.grants.subject'`, so tooling can point at the exact
48
+ * offending value. */
47
49
  param;
48
- /** Link to the docs for this `code`. Mirrors Stripe's `error.doc_url`.
49
- * Defaults from `code` via {@link docUrlForCode} when omitted. */
50
+ /** A link to the documentation for this error's {@link code}. When not set
51
+ * explicitly, it is derived from the code by {@link docUrlForCode}. */
50
52
  docUrl;
51
- /** Domain-specific structured payload merged into the wire envelope —
52
- * e.g. a schema push's `{ warnings, unexecutable }`, a stale write's
53
- * conflicting rows. Mirrors how Stripe attaches type-specific fields
54
- * (`decline_code`, `payment_intent`) alongside the standard ones, so a
55
- * structured error keeps its detail through `toJSON` instead of being
56
- * flattened to a bare message. */
53
+ /** Extra structured data specific to this error, merged into the serialized
54
+ * envelope — for example a schema push's `{ warnings, unexecutable }`, or the
55
+ * conflicting rows of a stale write. This detail is preserved through
56
+ * {@link toJSON} rather than flattened into the message. */
57
57
  details;
58
58
  constructor(message, options) {
59
59
  super(message);
@@ -76,9 +76,10 @@ export class AbloError extends Error {
76
76
  }
77
77
  }
78
78
  /**
79
- * Serialize to Stripe's error-object shape: `{ type, code, param, message,
80
- * doc_url, request_id }`. One JSON shape across HTTP bodies, WS frames, and
81
- * logs so consumers parse Ablo errors the way they already parse Stripe's.
79
+ * Serializes the error to its wire shape: `{ type, code, param, message,
80
+ * doc_url, request_id }`, with any {@link details} merged in. This is the same
81
+ * JSON shape the SDK uses across HTTP bodies, WebSocket frames, and logs, so a
82
+ * consumer parses every Ablo error the same way.
82
83
  */
83
84
  toJSON() {
84
85
  return {
@@ -92,12 +93,13 @@ export class AbloError extends Error {
92
93
  };
93
94
  }
94
95
  /**
95
- * A single, leak-proof line for logs and `String(err)` / template
96
- * interpolation: `AbloValidationError [code]: message (see docs) [request_id: …]`.
96
+ * Formats the error as a single line for logs and string interpolation:
97
+ * `AbloValidationError [code]: message (see docs) [request_id: …]`.
97
98
  *
98
- * Deliberately does NOT dump `details`, `cause`, or the stack the thing that
99
- * makes `console.error(richError)` an unreadable wall of text. The structured
100
- * payload stays available via {@link toJSON}; this is the human one-liner.
99
+ * It intentionally omits {@link details}, the cause, and the stack, which are
100
+ * what turn a logged rich error into an unreadable wall of text. The full
101
+ * structured payload remains available through {@link toJSON}; this is the
102
+ * concise human-readable form.
101
103
  */
102
104
  toString() {
103
105
  const code = this.code ? ` [${this.code}]` : '';
@@ -107,9 +109,9 @@ export class AbloError extends Error {
107
109
  }
108
110
  }
109
111
  /**
110
- * Map a stable error `code` to its docs URL the one place the convention
111
- * lives, so every error carrying a code gets a `doc_url` for free (Stripe
112
- * ships a link on every error).
112
+ * Builds the documentation URL for a stable error {@link ErrorCode}. This is the
113
+ * single place the URL convention lives, so every error that carries a code gets
114
+ * a `doc_url` automatically.
113
115
  */
114
116
  export function docUrlForCode(code) {
115
117
  return `https://docs.abloatai.com/errors#${code}`;
@@ -147,11 +149,11 @@ export class AbloValidationError extends AbloError {
147
149
  type = 'AbloValidationError';
148
150
  }
149
151
  /**
150
- * 404 an UPDATE/DELETE addressed a row that doesn't exist (or is outside the
151
- * caller's org). The engine reports such targets on `CommitReceipt.missingIds`;
152
- * the typed resource wrappers raise this instead of returning a success receipt
153
- * for a write that quietly matched zero rows. Carries the offending ids so a
154
- * caller can see exactly which targets were absent.
152
+ * An update or delete addressed a row that does not exist, or lies outside the
153
+ * caller's organization (HTTP 404). Such targets are reported on
154
+ * {@link CommitReceipt.missingIds}, and the typed resource methods raise this
155
+ * error rather than returning a successful receipt for a write that quietly
156
+ * matched zero rows. The absent ids are carried on {@link missingIds}.
155
157
  */
156
158
  export class AbloNotFoundError extends AbloError {
157
159
  type = 'AbloNotFoundError';
@@ -172,15 +174,13 @@ export class AbloServerError extends AbloError {
172
174
  type = 'AbloServerError';
173
175
  }
174
176
  /**
175
- * 409 — a write carried `readAt: N` but the target entity has received
176
- * deltas since `N`. The caller's reasoning snapshot is stale; the safe
177
- * response is to re-read (or re-capture a watermark) and regenerate.
177
+ * A write carried a `readAt` watermark, but the target row has changed since
178
+ * that point (HTTP 409). The snapshot the caller reasoned from is stale, so the
179
+ * safe response is to re-read the row and regenerate the write.
178
180
  *
179
- * Carries `conflicts` so callers can inspect which specific (model, id)
180
- * pairs moved during the generation window useful for metrics
181
- * ("72% of stale rejects were on slide titles") and for selective
182
- * regeneration (only re-think the slides that changed, not the whole
183
- * deck).
181
+ * {@link conflicts} lists the specific model-and-id pairs that changed during
182
+ * the window between the read and the write, which lets a caller regenerate only
183
+ * the rows that actually moved rather than everything.
184
184
  */
185
185
  export class AbloStaleContextError extends AbloError {
186
186
  type = 'AbloStaleContextError';
@@ -197,16 +197,15 @@ export class AbloStaleContextError extends AbloError {
197
197
  }
198
198
  }
199
199
  /**
200
- * The functional `update(id, current => next)` form exhausted its reconcile
201
- * budget the row stayed continuously contended (a hot row under sustained
202
- * concurrent writes), so no attempt could land a compare-and-swap.
200
+ * The functional `update(id, current => next)` form gave up after exhausting its
201
+ * reconcile budget, because the row stayed continuously contended under
202
+ * sustained concurrent writes and no attempt could land its compare-and-swap.
203
203
  *
204
- * This is the ONLY coordination concept the functional update ever surfaces, and
205
- * only at the extreme: the SDK has already read-fresh recomputed retried on
206
- * every stale/claim conflict on the caller's behalf. Catch it to back off and
207
- * retry later, raise the `retries` budget, or move that row to the WebSocket
208
- * transport (which parks writers in a fair FIFO queue instead of racing). The
209
- * last underlying conflict that drove the final retry is on `.cause`.
204
+ * The SDK reaches this only at the extreme: it has already re-read, recomputed,
205
+ * and retried on every intervening conflict on the caller's behalf. Catch it to
206
+ * back off and retry later, raise the `retries` budget, or move the row to the
207
+ * WebSocket transport, which queues writers fairly instead of racing them. The
208
+ * last underlying conflict is available on `cause`.
210
209
  */
211
210
  export class AbloContentionError extends AbloError {
212
211
  type = 'AbloContentionError';
@@ -290,18 +289,17 @@ export class AbloClaimedError extends AbloError {
290
289
  }
291
290
  }
292
291
  /**
293
- * The `/`-joined human label for a claim target `model/id/field`, dropping
294
- * absent parts, falling back to `'target'`. The one place this join lived in
295
- * three copies (client `Ablo`, HTTP `ApiClient`, `awaitClaimGrant`).
292
+ * Builds a human-readable label for a claim target by joining its `model`, `id`,
293
+ * and `field` with `/`, omitting any absent parts and falling back to `'target'`
294
+ * when none are present.
296
295
  */
297
296
  export function claimTargetLabel(target) {
298
297
  return [target.model, target.id, target.field].filter(Boolean).join('/') || 'target';
299
298
  }
300
299
  /**
301
- * Build the {@link AbloClaimedError} for a contended `ablo.<model>` write the
302
- * single factory shared by the realtime client (`Ablo`) and the HTTP client
303
- * (`ApiClient`), which carried byte-identical copies. The first claim is the
304
- * holder whose metadata shapes the message.
300
+ * Builds the {@link AbloClaimedError} for a write that was rejected because the
301
+ * row is claimed. The first entry in `claims` is treated as the current holder,
302
+ * and its metadata shapes the error message.
305
303
  */
306
304
  export function claimedError(target, claims, code) {
307
305
  const label = claimTargetLabel(target);
@@ -314,18 +312,17 @@ export function claimedError(target, claims, code) {
314
312
  }), { code, claims });
315
313
  }
316
314
  /**
317
- * A scoped credential was denied either the key is unknown / revoked /
318
- * expired (`capability_invalid`), or the connection's resolved scope
319
- * doesn't cover the attempted action (`capability_scope_denied`). With
320
- * opaque restricted (`rk_`) API keys this is a server-side check against
321
- * the key's `syncGroups` / `operations`, not a signed-caveat verification.
322
- *
323
- * Extends `AbloPermissionError` so existing `instanceof CapabilityError`
324
- * checks keep working AND broader `instanceof AbloPermissionError`
325
- * matches for consumers who don't care about the scope specifics.
315
+ * A scoped credential was denied, either because the key is unknown, revoked, or
316
+ * expired (`capability_invalid`), or because the connection's scope does not
317
+ * cover the attempted action (`capability_scope_denied`). For restricted (`rk_`)
318
+ * API keys this is a server-side check against the key's granted sync groups and
319
+ * operations.
326
320
  *
327
- * `requiredCapability` (when present) describes the scope a key must
328
- * carry for the request to succeed on retry.
321
+ * It extends {@link AbloPermissionError}, so it is caught both by code that
322
+ * specifically checks for `CapabilityError` and by code that only distinguishes
323
+ * the broader permission category. When present, {@link requiredCapability}
324
+ * describes the scope a key would need to carry for the request to succeed on
325
+ * retry.
329
326
  */
330
327
  export class CapabilityError extends AbloPermissionError {
331
328
  requiredCapability;
@@ -339,15 +336,12 @@ export class CapabilityError extends AbloPermissionError {
339
336
  }
340
337
  // ── Legacy session error (now part of the typed hierarchy) ───────────
341
338
  /**
342
- * SyncSessionError — Thrown when authentication/session is invalid or expired.
343
- * Signals that the user should be redirected to sign in
344
- * rather than showing a generic retry option.
339
+ * Thrown when the login session itself is invalid or expired, signaling that the
340
+ * user should be sent to sign in again rather than offered a generic retry.
345
341
  *
346
- * Extends `AbloAuthenticationError` so existing
347
- * `SyncSessionError.isSessionError(...)` duck-type callers keep
348
- * working, AND downstream code that only catches the typed hierarchy
349
- * (`instanceof AbloAuthenticationError` / `e.type === 'AbloAuthenticationError'`)
350
- * now sees session failures too.
342
+ * It extends {@link AbloAuthenticationError}, so it is caught both by code using
343
+ * the {@link SyncSessionError.isSessionError} check and by code that catches the
344
+ * authentication category in general.
351
345
  */
352
346
  export class SyncSessionError extends AbloAuthenticationError {
353
347
  isSessionError = true;
@@ -361,44 +355,59 @@ export class SyncSessionError extends AbloAuthenticationError {
361
355
  }
362
356
  }
363
357
  /**
364
- * Check if an error is a session error (duck-type check)
358
+ * Returns true when a value is a {@link SyncSessionError}, or any error-like
359
+ * object that reports itself as a session error through an `isSessionError`
360
+ * flag.
365
361
  */
366
362
  static isSessionError(error) {
367
363
  if (error instanceof SyncSessionError) {
368
364
  return true;
369
365
  }
370
366
  if (error && typeof error === 'object' && 'isSessionError' in error) {
371
- return error.isSessionError === true;
367
+ return error.isSessionError;
372
368
  }
373
369
  return false;
374
370
  }
375
371
  /**
376
- * Check if an HTTP response status indicates a session error
372
+ * Determines whether an HTTP response means the login session has expired and
373
+ * the user should sign in again. When the body carries a structured Ablo error
374
+ * code, the decision is made from that code's recovery class; otherwise a bare
375
+ * 401 is treated as an expiry and a 403 is not.
377
376
  */
378
377
  static isSessionErrorResponse(status, body) {
379
- // "Should this response sign the user out?" — TRUE only for a genuine
380
- // expiry of the LONG-LIVED login (`recovery: 'session_expiry'`). Decided
381
- // via the closed recovery taxonomy rather than a hardcoded code list, so
382
- // the access-vs-session split lives in one place (errorCodes.ts). This is
383
- // behaviourally identical to the old `session_expired || jwt_expired` list.
378
+ // Sign the user out only for a genuine expiry of the long-lived login
379
+ // (`recovery: 'session_expiry'`). The decision runs through the recovery
380
+ // classification rather than a hardcoded list, so the access-versus-session
381
+ // split lives in one place.
384
382
  //
385
- // Deliberately NOT true for `access_credential_expiry` (`apikey_expired` —
386
- // the Stripe-style ephemeral key): an expired `ek_`/`rk_` is re-mintable
387
- // from the still-valid login and must NOT log the user out — the connection
388
- // layer silently re-mints instead. Likewise NOT true for `auth_blocked` /
389
- // `permission` failures (api_key_required, jwt_issuer_untrusted, 403s):
390
- // re-auth re-mints the same rejected credential and loops ("flash then
391
- // bounce to /signin").
383
+ // It deliberately does not fire for `access_credential_expiry`
384
+ // (`apikey_expired`): an expired short-lived key is re-mintable from the
385
+ // still-valid login and must not sign the user out — the connection layer
386
+ // re-mints it instead. It also does not fire for `auth_blocked` or
387
+ // `permission` failures, where re-authenticating would present the same
388
+ // rejected credential and loop.
392
389
  const code = extractWireCode(body);
393
390
  if (code) {
394
391
  return classifyRecovery(code) === 'session_expiry';
395
392
  }
396
- // No structured code (bare body, non-Ablo proxy response): a 401 is taken as
397
- // expiry the historical default that drives re-auth while a 403 is a
398
- // permission failure, not a session error.
393
+ // With no structured code (a bare body or a non-Ablo proxy response), treat
394
+ // a 401 as an expiry that drives re-authentication, and a 403 as a
395
+ // permission failure rather than a session error.
399
396
  return status === 401;
400
397
  }
401
398
  }
399
+ /**
400
+ * The WebSocket-close counterpart to {@link SyncSessionError.isSessionErrorResponse}:
401
+ * returns true for close reasons that mean the short-lived access credential
402
+ * (`ek_` or `rk_`) has expired. The server closes such sockets with code 4001
403
+ * and reason `'credential_expired'`. Because the credential is re-mintable from
404
+ * the still-valid login, the connection layer re-mints it and reconnects rather
405
+ * than signing the user out or clearing local data. Every other session close
406
+ * reason, such as a revoked key or a genuinely lost login, stays terminal.
407
+ */
408
+ export function isAccessCredentialExpiryCloseReason(reason) {
409
+ return reason === 'credential_expired' || classifyRecovery(reason) === 'access_credential_expiry';
410
+ }
402
411
  // ── HTTP → class mapping ──────────────────────────────────────────────
403
412
  const OptionalWireStringSchema = z.preprocess((value) => (typeof value === 'string' ? value : undefined), z.string().optional());
404
413
  const RequiredCapabilityWireSchema = z
@@ -432,8 +441,8 @@ const ErrorFieldSchema = z
432
441
  .catch(undefined);
433
442
  const ErrorBodyShapeSchema = z
434
443
  .object({
435
- /** Legacy: `error` was a flat code string on older endpoints. Newer
436
- * endpoints (CommitReceipt) carry `error` as a nested object. */
444
+ /** The `error` field may be a flat code string, as some endpoints return,
445
+ * or a nested error object, as a {@link CommitReceipt} carries. */
437
446
  error: ErrorFieldSchema,
438
447
  code: OptionalWireStringSchema,
439
448
  reason: OptionalWireStringSchema,
@@ -452,16 +461,16 @@ function parseErrorBodyShape(body) {
452
461
  return parsed.success ? parsed.data : {};
453
462
  }
454
463
  /**
455
- * Coerce ANY thrown value into an {@link AbloError} the last-line guarantee
456
- * that an SDK consumer never catches an untagged error. An already-typed
457
- * AbloError passes through untouched (so `code`/`httpStatus`/subclass survive);
458
- * a bare `Error` keeps its message and is preserved as `cause` (carrying any
459
- * `.code` someone attached); a non-Error is stringified.
464
+ * Coerces any thrown value into an {@link AbloError}, so a consumer never catches
465
+ * an untyped error from the SDK. An error that is already an {@link AbloError}
466
+ * passes through unchanged, preserving its subclass, `code`, and `httpStatus`; a
467
+ * plain `Error` keeps its message and is retained as the `cause` (carrying any
468
+ * `code` attached to it); anything else is stringified.
460
469
  *
461
- * This is the client mirror of the server's `normalizeError` applied at the
462
- * SDK's public async boundaries so `instanceof AbloError` / `e.type` always
463
- * hold for whatever a consumer catches, regardless of which internal layer
464
- * (transport, IndexedDB, bootstrap, a third-party throw) produced it.
470
+ * The SDK applies this at its public async boundaries so that `instanceof
471
+ * AbloError` and `error.type` hold for whatever a consumer catches, no matter
472
+ * which internal layer transport, local storage, bootstrap, or a third-party
473
+ * throw produced the original error.
465
474
  */
466
475
  export function toAbloError(err) {
467
476
  if (err instanceof AbloError)
@@ -474,16 +483,15 @@ export function toAbloError(err) {
474
483
  return new AbloError(String(err), { cause: err });
475
484
  }
476
485
  /**
477
- * Build the appropriate typed {@link AbloError} from a wire error the
478
- * single codeclass mapping shared by every transport that can reject a
479
- * request (HTTP responses via {@link translateHttpError}, WebSocket
480
- * `mutation_result`/`claim_ack` frames, agent-job receipts).
486
+ * Builds the appropriate typed {@link AbloError} from a wire error. This is the
487
+ * single code-to-class mapping shared by every transport that can reject a
488
+ * request HTTP responses through {@link translateHttpError}, WebSocket result
489
+ * frames, and agent-job receipts.
481
490
  *
482
- * Code-first, then status-driven. A known {@link ErrorCode} carries its own
483
- * canonical `httpStatus` in the registry, so frame transports that don't have
484
- * an HTTP status (the WebSocket commit path) still produce the right subclass
485
- * instead of a hand-rolled `new Error(message)` that drops out of the typed
486
- * hierarchy and loses `code`/`httpStatus`/retryability.
491
+ * It decides by code first, then by status. Because a known {@link ErrorCode}
492
+ * carries its canonical HTTP status in the registry, a transport that has no
493
+ * status of its own (such as the WebSocket commit path) still produces the right
494
+ * subclass, with its `code`, status, and retryability intact.
487
495
  */
488
496
  export function errorFromWire(message, opts = {}) {
489
497
  const { code, requestId, requiredCapability, claims } = opts;
@@ -503,9 +511,13 @@ export function errorFromWire(message, opts = {}) {
503
511
  return new CapabilityError(code, message, requiredCapability);
504
512
  }
505
513
  // Claim enforcement (rides 409): the target entity is held by another
506
- // participant. Discriminate on code BEFORE the generic 409→idempotency
507
- // mapping so a claim rejection surfaces as AbloClaimedError.
508
- if (code === 'claim_conflict' || code === 'claim_conflict' || code === 'entity_claimed') {
514
+ // participant, or a lease this participant held is gone (`claim_lost` —
515
+ // the answer a heartbeat gets after its lease lapsed). Discriminate on
516
+ // code BEFORE the generic 409→idempotency mapping so claim outcomes
517
+ // surface as AbloClaimedError on every transport.
518
+ if (code === 'claim_conflict' ||
519
+ code === 'entity_claimed' ||
520
+ code === 'claim_lost') {
509
521
  return new AbloClaimedError(message, { ...baseOpts, claims });
510
522
  }
511
523
  // A write whose `readAt` watermark went stale — callers re-read and retry.
@@ -528,13 +540,11 @@ export function errorFromWire(message, opts = {}) {
528
540
  return new AbloError(message, baseOpts);
529
541
  }
530
542
  /**
531
- * Translate an HTTP response into the appropriate typed error.
532
- *
533
- * Single source of truth for status-code class mapping every SDK
534
- * fetch path that sees a non-2xx response should route through here
535
- * so the customer-visible error is always the right subclass. Delegates
536
- * the actual class selection to {@link errorFromWire} (shared with the
537
- * frame transports) after extracting code/message from the HTTP body.
543
+ * Translates an HTTP response into the appropriate typed {@link AbloError}. This
544
+ * is the single mapping every request path routes a non-2xx response through, so
545
+ * the error a consumer sees is always the right subclass. After extracting the
546
+ * code and message from the response body, it delegates the class selection to
547
+ * {@link errorFromWire}, the same logic the frame transports use.
538
548
  */
539
549
  export function translateHttpError(status, body, requestId) {
540
550
  const parsed = parseErrorBodyShape(body);
@@ -565,12 +575,12 @@ export function translateHttpError(status, body, requestId) {
565
575
  });
566
576
  }
567
577
  /**
568
- * Whether an HTTP error body carries a code {@link translateHttpError} can read
569
- * — a top-level `code`, a nested `error.code`, or a string `error`. Callers that
570
- * own a meaningful fallback code (e.g. `turn_open_failed`) use this to decide
571
- * between routing through `translateHttpError` (structured envelope present) and
572
- * throwing their own typed error with the fallback (bare/non-Ablo body), instead
573
- * of emitting a code-less error.
578
+ * Reports whether an HTTP error body carries a code that {@link translateHttpError}
579
+ * can read — a top-level `code`, a nested `error.code`, or a string `error`. A
580
+ * caller that has a meaningful fallback code uses this to choose between routing
581
+ * a structured body through {@link translateHttpError} and throwing its own typed
582
+ * error with the fallback when the body is bare, rather than producing an error
583
+ * with no code.
574
584
  */
575
585
  export function hasWireCode(body) {
576
586
  const parsed = parseErrorBodyShape(body);
@@ -583,10 +593,10 @@ export function hasWireCode(body) {
583
593
  typeof parsed.error.code === 'string');
584
594
  }
585
595
  /**
586
- * Extract the canonical error `code` from a raw HTTP error body STRING — the
587
- * top-level `code` or a nested `error.code`. Returns undefined for non-JSON or
588
- * code-less bodies. Used by session-error detection to tell a genuine expiry
589
- * (`session_expired`/`jwt_expired`) apart from other auth failures.
596
+ * Extracts the canonical error `code` from a raw HTTP error body string — the
597
+ * top-level `code` or a nested `error.code` returning `undefined` for a
598
+ * non-JSON or code-less body. Session-error detection uses it to tell a genuine
599
+ * session expiry apart from other authentication failures.
590
600
  */
591
601
  export function extractWireCode(body) {
592
602
  if (!body)
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @abloatai/ablo — The Collaboration Layer for AI and Humans
2
+ * @abloatai/ablo — the collaboration layer for AI agents and people.
3
3
  *
4
4
  * ```ts
5
5
  * import Ablo from '@abloatai/ablo';
@@ -14,38 +14,41 @@
14
14
  * type Entry = Ablo.Peer;
15
15
  * ```
16
16
  *
17
- * `Ablo({ schema, apiKey })` gives typed model clients. `Ablo({ apiKey })`
18
- * gives the HTTP model/commit client for agents, MCP routes, and custom
19
- * runtimes.
17
+ * `Ablo({ schema, apiKey })` returns typed model clients. `Ablo({ apiKey })`
18
+ * returns the stateless HTTP model and commit client, which suits agents, MCP
19
+ * route handlers, and custom runtimes.
20
20
  *
21
- * Stripe / Anthropic / OpenAI all do this: one import, model clients
22
- * reached via dot-access on the engine, types via namespace dots.
21
+ * The whole package reaches you through one name: `Ablo` is at once a factory
22
+ * function, a type, and a namespace. You call model clients with dot access on
23
+ * the instance (`ablo.reports.retrieve(...)`) and reach every supporting type
24
+ * through the namespace (`Ablo.Peer`, `Ablo.Claim`).
23
25
  *
24
- * Public subpaths:
26
+ * Related surfaces live on their own import subpaths:
25
27
  * @abloatai/ablo/schema — defineSchema, model, z (Zod)
26
28
  * @abloatai/ablo/react — <AbloProvider>, useQuery, useMutate
27
- * @abloatai/ablo/testing — test harnesses + mocks
29
+ * @abloatai/ablo/testing — test harnesses and fixtures
28
30
  *
29
- * Reads split by where the data comes from. `ablo.<model>.retrieve({ id })` and
30
- * `.list({ where })` are the async **server** reads (pool → IDB → network via
31
- * the `HydrationCoordinator`, single-flight deduped); they're the default and
32
- * what hosted/stateless callers want, since their local graph starts empty.
33
- * `ablo.<model>.get(id)` / `.getAll(...)` / `.getCount(...)` are synchronous
34
- * **local-graph** snapshots with no network round-trip — for reactive React
35
- * selectors (`useAblo((ablo) => ablo.<model>.get(id))`) once the graph is warm.
31
+ * Reads come in two flavors, distinguished by where the data is fetched from.
32
+ * `ablo.<model>.retrieve({ id })` and `.list({ where })` are asynchronous reads
33
+ * that consult the local cache first and fall back to the network, de-duplicating
34
+ * concurrent requests for the same row. They are the default, and the right
35
+ * choice for stateless callers whose local graph starts empty.
36
+ * `ablo.<model>.get(id)`, `.getAll(...)`, and `.getCount(...)` are synchronous
37
+ * snapshots of the already-loaded local graph with no network round-trip — use
38
+ * them in reactive React selectors (`useAblo((ablo) => ablo.<model>.get(id))`)
39
+ * once the graph is warm.
36
40
  *
37
- * ── What to import (read this first) ────────────────────────────────
38
- * Default path this is all most apps and agents ever need:
39
- * `Ablo` (default export) + `AbloOptions` + the `Model*Params` bags
40
- * • the `Ablo*Error` classes, to discriminate failures in catch blocks
41
- * That's it. If you're reaching past those, you're in advanced territory.
41
+ * What to import, in short:
42
+ * `Ablo` (the default export), `AbloOptions`, and the `Model*Params` option
43
+ * bags cover what most applications and agents ever need.
44
+ * • the `Ablo*Error` classes let you discriminate failures in catch blocks.
42
45
  *
43
- * Advanced opt-in, most apps never import these (each is tagged
44
- * "Advanced —" at its export below, with the one situation it's for):
45
- * • `dataSource` / `abloSource` — only if your own DB stays canonical
46
- * • `defaultPolicy` — only to customize conflict resolution
47
- * • `defineMutators` / `createTransaction` — only for custom mutators
48
- * If you don't recognize one, you don't need it — the default path covers you.
46
+ * A handful of exports are for advanced use and are marked "Advanced" at their
47
+ * declaration below, each with the one situation it is for:
48
+ * • `dataSource` / `abloSource` — when your own database stays canonical.
49
+ * • `defaultPolicy` — when you customize conflict resolution.
50
+ * • `defineMutators` / `createTransaction` — when you write custom mutators.
51
+ * If you don't recognize one of these, you don't need it.
49
52
  */
50
53
  export { Ablo } from './client/Ablo.js';
51
54
  export type { MutationExecutor } from './interfaces/index.js';
@@ -54,7 +57,7 @@ export { DEFAULT_CONTENTION_RETRIES } from './client/functionalUpdate.js';
54
57
  export type { HttpClaimApi, InternalAbloOptions } from './client/Ablo.js';
55
58
  export { type AbloHttpClientOptions, type AbloHttpClient, type HttpModelClient, } from './client/httpClient.js';
56
59
  export { ABLO_DEFAULT_BASE_URL, ABLO_HOSTED_API_DOMAIN, ABLO_HOSTED_HTTP_BASE_URL, normalizeAbloHostedBaseUrl, } from './client/auth.js';
57
- export type { AbloOptions, LocalCountOptions, LocalReadOptions, ModelListScope, ServerReadOptions, ModelRetrieveParams, ModelCreateParams, ModelUpdateParams, ModelDeleteParams, ClaimOptions, ClaimParams, ClaimLookupParams, ClaimReorderParams, Claim, HeldClaim, ModelOperations, } from './client/Ablo.js';
60
+ export type { AbloOptions, LocalCountOptions, LocalReadOptions, ModelListScope, ServerReadOptions, ModelRetrieveParams, ModelCreateParams, ModelUpdateParams, ModelDeleteParams, ClaimOptions, ClaimParams, ClaimLookupParams, ClaimReorderParams, Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, ModelOperations, } from './client/Ablo.js';
58
61
  export type { AbloPersistence } from './client/persistence.js';
59
62
  import { Ablo } from './client/Ablo.js';
60
63
  export default Ablo;