@abloatai/ablo 0.36.0 → 0.37.1

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 (597) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +55 -2014
  3. package/NOTICE +2 -2
  4. package/README.md +45 -63
  5. package/assets/banner.png +0 -0
  6. package/dist/auth.d.ts +2 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +2 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/client.d.ts +3 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +3 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/coordination.d.ts +2 -0
  15. package/dist/coordination.d.ts.map +1 -0
  16. package/dist/coordination.js +2 -0
  17. package/dist/coordination.js.map +1 -0
  18. package/dist/index.d.ts +3 -114
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -163
  21. package/dist/index.js.map +1 -0
  22. package/dist/react.d.ts +4 -0
  23. package/dist/react.d.ts.map +1 -0
  24. package/dist/react.js +3 -0
  25. package/dist/react.js.map +1 -0
  26. package/dist/schema.d.ts +2 -0
  27. package/dist/schema.d.ts.map +1 -0
  28. package/dist/schema.js +2 -0
  29. package/dist/schema.js.map +1 -0
  30. package/dist/server.d.ts +2 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +2 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/source-conformance.d.ts +2 -0
  35. package/dist/source-conformance.d.ts.map +1 -0
  36. package/dist/source-conformance.js +2 -0
  37. package/dist/source-conformance.js.map +1 -0
  38. package/dist/source-drizzle.d.ts +2 -0
  39. package/dist/source-drizzle.d.ts.map +1 -0
  40. package/dist/source-drizzle.js +2 -0
  41. package/dist/source-drizzle.js.map +1 -0
  42. package/dist/source-kysely.d.ts +2 -0
  43. package/dist/source-kysely.d.ts.map +1 -0
  44. package/dist/source-kysely.js +2 -0
  45. package/dist/source-kysely.js.map +1 -0
  46. package/dist/source-next.d.ts +2 -0
  47. package/dist/source-next.d.ts.map +1 -0
  48. package/dist/source-next.js +2 -0
  49. package/dist/source-next.js.map +1 -0
  50. package/dist/source.d.ts +2 -0
  51. package/dist/source.d.ts.map +1 -0
  52. package/dist/source.js +2 -0
  53. package/dist/source.js.map +1 -0
  54. package/dist/wire.d.ts +2 -0
  55. package/dist/wire.d.ts.map +1 -0
  56. package/dist/wire.js +2 -0
  57. package/dist/wire.js.map +1 -0
  58. package/docs/agents.md +1 -1
  59. package/docs/api-keys.md +7 -6
  60. package/docs/api.md +10 -10
  61. package/docs/client-behavior.md +5 -5
  62. package/docs/coordination.md +52 -62
  63. package/docs/data-sources.md +1 -1
  64. package/docs/examples/agent-human.md +4 -4
  65. package/docs/examples/ai-sdk-tool.md +1 -1
  66. package/docs/examples/existing-python-backend.md +15 -4
  67. package/docs/examples/nextjs.md +27 -6
  68. package/docs/examples/server-agent.md +2 -2
  69. package/docs/how-it-works.md +4 -4
  70. package/docs/identity.md +2 -1
  71. package/docs/integration-guide.md +24 -13
  72. package/docs/internal/README.md +18 -0
  73. package/docs/internal/agent-fleet-coordination-design.md +171 -0
  74. package/docs/internal/agent-orchestration.md +58 -0
  75. package/docs/internal/commit-identifiers.md +91 -0
  76. package/docs/internal/concurrency-open-decisions.md +37 -0
  77. package/docs/internal/data-source-reverse-channel.md +150 -0
  78. package/docs/internal/per-field-conflict-detection.md +165 -0
  79. package/docs/internal/postgres-replication.md +64 -0
  80. package/docs/internal/serializable-schema.md +119 -0
  81. package/docs/internal/structure.md +32 -0
  82. package/docs/mcp.md +2 -2
  83. package/docs/migration.md +3 -3
  84. package/docs/quickstart.md +2 -2
  85. package/docs/react.md +5 -5
  86. package/docs/schema-contract.md +3 -3
  87. package/docs/sessions.md +91 -37
  88. package/examples/README.md +2 -2
  89. package/examples/data-source/README.md +1 -1
  90. package/examples/data-source/ablo-driver.ts +1 -1
  91. package/examples/data-source/customer-server.ts +1 -1
  92. package/examples/data-source/run.ts +1 -1
  93. package/examples/data-source/schema.ts +1 -1
  94. package/examples/quickstart.ts +2 -2
  95. package/llms.txt +8 -8
  96. package/package.json +63 -166
  97. package/bin/ablo.cjs +0 -39
  98. package/dist/BaseSyncedStore.d.ts +0 -843
  99. package/dist/BaseSyncedStore.js +0 -1971
  100. package/dist/Database.d.ts +0 -323
  101. package/dist/Database.js +0 -1502
  102. package/dist/InstanceCache.d.ts +0 -237
  103. package/dist/InstanceCache.js +0 -1166
  104. package/dist/LazyReferenceCollection.d.ts +0 -177
  105. package/dist/LazyReferenceCollection.js +0 -461
  106. package/dist/Model.d.ts +0 -454
  107. package/dist/Model.js +0 -919
  108. package/dist/ModelRegistry.d.ts +0 -225
  109. package/dist/ModelRegistry.js +0 -539
  110. package/dist/NetworkMonitor.d.ts +0 -28
  111. package/dist/NetworkMonitor.js +0 -79
  112. package/dist/RuntimeContext.d.ts +0 -52
  113. package/dist/RuntimeContext.js +0 -80
  114. package/dist/SyncClient.d.ts +0 -541
  115. package/dist/SyncClient.js +0 -2202
  116. package/dist/adapters/alwaysOnline.d.ts +0 -14
  117. package/dist/adapters/alwaysOnline.js +0 -17
  118. package/dist/adapters/inMemoryStorage.d.ts +0 -31
  119. package/dist/adapters/inMemoryStorage.js +0 -110
  120. package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
  121. package/dist/ai-sdk/coordinatedTool.js +0 -134
  122. package/dist/ai-sdk/coordinationContext.d.ts +0 -46
  123. package/dist/ai-sdk/coordinationContext.js +0 -106
  124. package/dist/ai-sdk/index.d.ts +0 -121
  125. package/dist/ai-sdk/index.js +0 -121
  126. package/dist/ai-sdk/wrap.d.ts +0 -65
  127. package/dist/ai-sdk/wrap.js +0 -39
  128. package/dist/auth/index.d.ts +0 -1
  129. package/dist/auth/index.js +0 -8
  130. package/dist/batching/index.d.ts +0 -55
  131. package/dist/batching/index.js +0 -147
  132. package/dist/client/Ablo.d.ts +0 -231
  133. package/dist/client/Ablo.js +0 -160
  134. package/dist/client/abloClient.d.ts +0 -309
  135. package/dist/client/abloClient.js +0 -13
  136. package/dist/client/clientPrelude.d.ts +0 -52
  137. package/dist/client/clientPrelude.js +0 -60
  138. package/dist/client/consoleLogger.d.ts +0 -35
  139. package/dist/client/consoleLogger.js +0 -44
  140. package/dist/client/coreClient.d.ts +0 -60
  141. package/dist/client/coreClient.js +0 -118
  142. package/dist/client/createInternalComponents.d.ts +0 -50
  143. package/dist/client/createInternalComponents.js +0 -98
  144. package/dist/client/createModelProxy.d.ts +0 -248
  145. package/dist/client/createModelProxy.js +0 -884
  146. package/dist/client/humans.d.ts +0 -69
  147. package/dist/client/humans.js +0 -78
  148. package/dist/client/modelRegistration.d.ts +0 -10
  149. package/dist/client/modelRegistration.js +0 -312
  150. package/dist/client/options.d.ts +0 -461
  151. package/dist/client/options.js +0 -7
  152. package/dist/client/reactiveEngine.d.ts +0 -53
  153. package/dist/client/reactiveEngine.js +0 -688
  154. package/dist/client/resourceTypes.d.ts +0 -12
  155. package/dist/client/resourceTypes.js +0 -10
  156. package/dist/client/schemaConfig.d.ts +0 -44
  157. package/dist/client/schemaConfig.js +0 -185
  158. package/dist/client/storeCluster.d.ts +0 -47
  159. package/dist/client/storeCluster.js +0 -118
  160. package/dist/client/storeLifecycle.d.ts +0 -61
  161. package/dist/client/storeLifecycle.js +0 -231
  162. package/dist/client/validateAbloOptions.d.ts +0 -42
  163. package/dist/client/validateAbloOptions.js +0 -43
  164. package/dist/client/wsMutationExecutor.d.ts +0 -27
  165. package/dist/client/wsMutationExecutor.js +0 -72
  166. package/dist/context.d.ts +0 -42
  167. package/dist/context.js +0 -81
  168. package/dist/coordination/ClaimLog.d.ts +0 -26
  169. package/dist/coordination/ClaimLog.js +0 -32
  170. package/dist/coordination/index.d.ts +0 -1
  171. package/dist/coordination/index.js +0 -8
  172. package/dist/core/index.d.ts +0 -33
  173. package/dist/core/index.js +0 -48
  174. package/dist/docs/catalog.d.ts +0 -72
  175. package/dist/docs/catalog.js +0 -230
  176. package/dist/docs/index.d.ts +0 -10
  177. package/dist/docs/index.js +0 -10
  178. package/dist/environment.d.ts +0 -1
  179. package/dist/environment.js +0 -8
  180. package/dist/interfaces/index.d.ts +0 -311
  181. package/dist/interfaces/index.js +0 -9
  182. package/dist/keys/index.d.ts +0 -1
  183. package/dist/keys/index.js +0 -8
  184. package/dist/mutators/RecordingMutation.d.ts +0 -36
  185. package/dist/mutators/RecordingMutation.js +0 -182
  186. package/dist/mutators/Transaction.d.ts +0 -40
  187. package/dist/mutators/Transaction.js +0 -58
  188. package/dist/mutators/UndoManager.d.ts +0 -258
  189. package/dist/mutators/UndoManager.js +0 -658
  190. package/dist/mutators/defineMutators.d.ts +0 -60
  191. package/dist/mutators/defineMutators.js +0 -18
  192. package/dist/mutators/inverseOp.d.ts +0 -126
  193. package/dist/mutators/inverseOp.js +0 -71
  194. package/dist/mutators/mutateActions.d.ts +0 -45
  195. package/dist/mutators/mutateActions.js +0 -105
  196. package/dist/mutators/readerActions.d.ts +0 -33
  197. package/dist/mutators/readerActions.js +0 -57
  198. package/dist/mutators/undoApply.d.ts +0 -51
  199. package/dist/mutators/undoApply.js +0 -117
  200. package/dist/policy/index.d.ts +0 -21
  201. package/dist/policy/index.js +0 -20
  202. package/dist/query/QueryProcessor.d.ts +0 -75
  203. package/dist/query/QueryProcessor.js +0 -255
  204. package/dist/query/client.d.ts +0 -64
  205. package/dist/query/client.js +0 -138
  206. package/dist/query/types.d.ts +0 -85
  207. package/dist/query/types.js +0 -16
  208. package/dist/react/AbloProvider.d.ts +0 -242
  209. package/dist/react/AbloProvider.js +0 -458
  210. package/dist/react/ClientSideSuspense.d.ts +0 -36
  211. package/dist/react/ClientSideSuspense.js +0 -17
  212. package/dist/react/DefaultFallback.d.ts +0 -24
  213. package/dist/react/DefaultFallback.js +0 -43
  214. package/dist/react/context.d.ts +0 -55
  215. package/dist/react/context.js +0 -29
  216. package/dist/react/createAbloReact.d.ts +0 -56
  217. package/dist/react/createAbloReact.js +0 -51
  218. package/dist/react/index.d.ts +0 -62
  219. package/dist/react/index.js +0 -69
  220. package/dist/react/internalContext.d.ts +0 -33
  221. package/dist/react/internalContext.js +0 -3
  222. package/dist/react/useAblo.d.ts +0 -82
  223. package/dist/react/useAblo.js +0 -120
  224. package/dist/react/useCurrentUserId.d.ts +0 -22
  225. package/dist/react/useCurrentUserId.js +0 -34
  226. package/dist/react/useErrorListener.d.ts +0 -20
  227. package/dist/react/useErrorListener.js +0 -38
  228. package/dist/react/useMutationFailureListener.d.ts +0 -26
  229. package/dist/react/useMutationFailureListener.js +0 -38
  230. package/dist/react/useMutators.d.ts +0 -56
  231. package/dist/react/useMutators.js +0 -84
  232. package/dist/react/useReactive.d.ts +0 -35
  233. package/dist/react/useReactive.js +0 -123
  234. package/dist/react/useSyncStatus.d.ts +0 -59
  235. package/dist/react/useSyncStatus.js +0 -76
  236. package/dist/react/useUndoScope.d.ts +0 -34
  237. package/dist/react/useUndoScope.js +0 -81
  238. package/dist/schema/coordination.d.ts +0 -112
  239. package/dist/schema/coordination.js +0 -133
  240. package/dist/schema/ddl.d.ts +0 -97
  241. package/dist/schema/ddl.js +0 -491
  242. package/dist/schema/ddlLock.d.ts +0 -35
  243. package/dist/schema/ddlLock.js +0 -46
  244. package/dist/schema/diff.d.ts +0 -225
  245. package/dist/schema/diff.js +0 -289
  246. package/dist/schema/generate.d.ts +0 -19
  247. package/dist/schema/generate.js +0 -86
  248. package/dist/schema/index.d.ts +0 -42
  249. package/dist/schema/index.js +0 -80
  250. package/dist/schema/queries.d.ts +0 -201
  251. package/dist/schema/queries.js +0 -144
  252. package/dist/schema/select.d.ts +0 -40
  253. package/dist/schema/select.js +0 -90
  254. package/dist/schema/serialize.d.ts +0 -115
  255. package/dist/schema/serialize.js +0 -265
  256. package/dist/schema/sugar.d.ts +0 -109
  257. package/dist/schema/sugar.js +0 -83
  258. package/dist/schema/syncDeltaRow.d.ts +0 -6
  259. package/dist/schema/syncDeltaRow.js +0 -6
  260. package/dist/server/adapter.d.ts +0 -173
  261. package/dist/server/adapter.js +0 -18
  262. package/dist/server/commit.d.ts +0 -107
  263. package/dist/server/commit.js +0 -1
  264. package/dist/server/index.d.ts +0 -14
  265. package/dist/server/index.js +0 -2
  266. package/dist/server/readConfig.d.ts +0 -80
  267. package/dist/server/readConfig.js +0 -8
  268. package/dist/server/storageMode.d.ts +0 -23
  269. package/dist/server/storageMode.js +0 -17
  270. package/dist/source/adapter.d.ts +0 -83
  271. package/dist/source/adapter.js +0 -24
  272. package/dist/source/adapters/drizzle.d.ts +0 -48
  273. package/dist/source/adapters/drizzle.js +0 -219
  274. package/dist/source/adapters/kysely.d.ts +0 -42
  275. package/dist/source/adapters/kysely.js +0 -205
  276. package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
  277. package/dist/source/adapters/kyselyMutationCore.js +0 -125
  278. package/dist/source/adapters/memory.d.ts +0 -13
  279. package/dist/source/adapters/memory.js +0 -130
  280. package/dist/source/adapters/prisma.d.ts +0 -63
  281. package/dist/source/adapters/prisma.js +0 -202
  282. package/dist/source/conformance.d.ts +0 -37
  283. package/dist/source/conformance.js +0 -215
  284. package/dist/source/connector.d.ts +0 -95
  285. package/dist/source/connector.js +0 -266
  286. package/dist/source/connectorProtocol.d.ts +0 -154
  287. package/dist/source/connectorProtocol.js +0 -163
  288. package/dist/source/contract.d.ts +0 -195
  289. package/dist/source/contract.js +0 -164
  290. package/dist/source/factory.d.ts +0 -92
  291. package/dist/source/factory.js +0 -286
  292. package/dist/source/idempotency.d.ts +0 -61
  293. package/dist/source/idempotency.js +0 -144
  294. package/dist/source/index.d.ts +0 -23
  295. package/dist/source/index.js +0 -30
  296. package/dist/source/migrations.d.ts +0 -21
  297. package/dist/source/migrations.js +0 -103
  298. package/dist/source/next.d.ts +0 -32
  299. package/dist/source/next.js +0 -25
  300. package/dist/source/pushQueue.d.ts +0 -134
  301. package/dist/source/pushQueue.js +0 -256
  302. package/dist/source/signing.d.ts +0 -92
  303. package/dist/source/signing.js +0 -162
  304. package/dist/source/types.d.ts +0 -401
  305. package/dist/source/types.js +0 -59
  306. package/dist/storeContract.d.ts +0 -145
  307. package/dist/storeContract.js +0 -12
  308. package/dist/stores/DatabaseManager.d.ts +0 -107
  309. package/dist/stores/DatabaseManager.js +0 -388
  310. package/dist/stores/ObjectStore.d.ts +0 -115
  311. package/dist/stores/ObjectStore.js +0 -393
  312. package/dist/stores/ObjectStoreContract.d.ts +0 -38
  313. package/dist/stores/ObjectStoreContract.js +0 -1
  314. package/dist/stores/StoreManager.d.ts +0 -114
  315. package/dist/stores/StoreManager.js +0 -304
  316. package/dist/stores/SyncActionStore.d.ts +0 -99
  317. package/dist/stores/SyncActionStore.js +0 -506
  318. package/dist/stores/openIDBWithTimeout.d.ts +0 -65
  319. package/dist/stores/openIDBWithTimeout.js +0 -153
  320. package/dist/stores/syncAction.d.ts +0 -26
  321. package/dist/stores/syncAction.js +0 -16
  322. package/dist/surface.d.ts +0 -36
  323. package/dist/surface.js +0 -75
  324. package/dist/sync/BootstrapFetcher.d.ts +0 -284
  325. package/dist/sync/BootstrapFetcher.js +0 -964
  326. package/dist/sync/ConnectionManager.d.ts +0 -8
  327. package/dist/sync/ConnectionManager.js +0 -8
  328. package/dist/sync/OnDemandLoader.d.ts +0 -231
  329. package/dist/sync/OnDemandLoader.js +0 -743
  330. package/dist/sync/SubscriptionManager.d.ts +0 -159
  331. package/dist/sync/SubscriptionManager.js +0 -243
  332. package/dist/sync/SyncWebSocket.d.ts +0 -173
  333. package/dist/sync/SyncWebSocket.js +0 -438
  334. package/dist/sync/awaitClaimGrant.d.ts +0 -6
  335. package/dist/sync/awaitClaimGrant.js +0 -6
  336. package/dist/sync/bootstrapApply.d.ts +0 -73
  337. package/dist/sync/bootstrapApply.js +0 -73
  338. package/dist/sync/commitFrames.d.ts +0 -8
  339. package/dist/sync/commitFrames.js +0 -8
  340. package/dist/sync/contextPorts.d.ts +0 -18
  341. package/dist/sync/contextPorts.js +0 -31
  342. package/dist/sync/createClaimStream.d.ts +0 -7
  343. package/dist/sync/createClaimStream.js +0 -7
  344. package/dist/sync/createPresenceStream.d.ts +0 -69
  345. package/dist/sync/createPresenceStream.js +0 -200
  346. package/dist/sync/createSnapshot.d.ts +0 -29
  347. package/dist/sync/createSnapshot.js +0 -118
  348. package/dist/sync/credentialLifecycle.d.ts +0 -7
  349. package/dist/sync/credentialLifecycle.js +0 -7
  350. package/dist/sync/deltaPipeline.d.ts +0 -114
  351. package/dist/sync/deltaPipeline.js +0 -278
  352. package/dist/sync/groupChange.d.ts +0 -116
  353. package/dist/sync/groupChange.js +0 -244
  354. package/dist/sync/participants.d.ts +0 -132
  355. package/dist/sync/participants.js +0 -346
  356. package/dist/sync/persistedPrefix.d.ts +0 -12
  357. package/dist/sync/persistedPrefix.js +0 -22
  358. package/dist/sync/schemaDrift.d.ts +0 -55
  359. package/dist/sync/schemaDrift.js +0 -53
  360. package/dist/sync/schemas.d.ts +0 -71
  361. package/dist/sync/schemas.js +0 -94
  362. package/dist/sync/syncCursor.d.ts +0 -40
  363. package/dist/sync/syncCursor.js +0 -55
  364. package/dist/sync/syncPlan.d.ts +0 -54
  365. package/dist/sync/syncPlan.js +0 -50
  366. package/dist/sync/wsFrameHandlers.d.ts +0 -8
  367. package/dist/sync/wsFrameHandlers.js +0 -8
  368. package/dist/syncLog/contract.d.ts +0 -20
  369. package/dist/syncLog/contract.js +0 -19
  370. package/dist/syncLog/index.d.ts +0 -1
  371. package/dist/syncLog/index.js +0 -1
  372. package/dist/transaction/ablo.d.ts +0 -88
  373. package/dist/transaction/ablo.js +0 -33
  374. package/dist/transaction/auth/apiKey.d.ts +0 -152
  375. package/dist/transaction/auth/apiKey.js +0 -419
  376. package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
  377. package/dist/transaction/auth/bootstrapScope.js +0 -1
  378. package/dist/transaction/auth/capability.d.ts +0 -212
  379. package/dist/transaction/auth/capability.js +0 -224
  380. package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
  381. package/dist/transaction/auth/credentialEndpoint.js +0 -86
  382. package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
  383. package/dist/transaction/auth/credentialPolicy.js +0 -125
  384. package/dist/transaction/auth/credentialSource.d.ts +0 -30
  385. package/dist/transaction/auth/credentialSource.js +0 -55
  386. package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
  387. package/dist/transaction/auth/hostedEndpoints.js +0 -21
  388. package/dist/transaction/auth/identity.d.ts +0 -55
  389. package/dist/transaction/auth/identity.js +0 -210
  390. package/dist/transaction/auth/index.d.ts +0 -162
  391. package/dist/transaction/auth/index.js +0 -304
  392. package/dist/transaction/auth/schemas.d.ts +0 -59
  393. package/dist/transaction/auth/schemas.js +0 -85
  394. package/dist/transaction/auth/sessionMint.d.ts +0 -28
  395. package/dist/transaction/auth/sessionMint.js +0 -85
  396. package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -56
  397. package/dist/transaction/coordination/awaitClaimGrant.js +0 -124
  398. package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -84
  399. package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -108
  400. package/dist/transaction/coordination/claimMeta.d.ts +0 -49
  401. package/dist/transaction/coordination/claimMeta.js +0 -52
  402. package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
  403. package/dist/transaction/coordination/createClaimStream.js +0 -475
  404. package/dist/transaction/coordination/events.d.ts +0 -74
  405. package/dist/transaction/coordination/events.js +0 -7
  406. package/dist/transaction/coordination/index.d.ts +0 -19
  407. package/dist/transaction/coordination/index.js +0 -45
  408. package/dist/transaction/coordination/locator.d.ts +0 -104
  409. package/dist/transaction/coordination/locator.js +0 -102
  410. package/dist/transaction/coordination/schema.d.ts +0 -1536
  411. package/dist/transaction/coordination/schema.js +0 -1177
  412. package/dist/transaction/coordination/targetConflict.d.ts +0 -2
  413. package/dist/transaction/coordination/targetConflict.js +0 -107
  414. package/dist/transaction/coordination/trace.d.ts +0 -78
  415. package/dist/transaction/coordination/trace.js +0 -138
  416. package/dist/transaction/durableWrites.d.ts +0 -62
  417. package/dist/transaction/durableWrites.js +0 -71
  418. package/dist/transaction/environment.d.ts +0 -105
  419. package/dist/transaction/environment.js +0 -108
  420. package/dist/transaction/errorCodes.d.ts +0 -403
  421. package/dist/transaction/errorCodes.js +0 -484
  422. package/dist/transaction/errors.d.ts +0 -428
  423. package/dist/transaction/errors.js +0 -686
  424. package/dist/transaction/footprint.d.ts +0 -111
  425. package/dist/transaction/footprint.js +0 -0
  426. package/dist/transaction/index.d.ts +0 -20
  427. package/dist/transaction/index.js +0 -20
  428. package/dist/transaction/keys/index.d.ts +0 -87
  429. package/dist/transaction/keys/index.js +0 -207
  430. package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
  431. package/dist/transaction/log/syncDeltaRow.js +0 -95
  432. package/dist/transaction/logPosition.d.ts +0 -97
  433. package/dist/transaction/logPosition.js +0 -125
  434. package/dist/transaction/logger.d.ts +0 -16
  435. package/dist/transaction/logger.js +0 -7
  436. package/dist/transaction/observability.d.ts +0 -53
  437. package/dist/transaction/observability.js +0 -19
  438. package/dist/transaction/persistence.d.ts +0 -12
  439. package/dist/transaction/persistence.js +0 -11
  440. package/dist/transaction/plugin.d.ts +0 -285
  441. package/dist/transaction/plugin.js +0 -106
  442. package/dist/transaction/policy/types.d.ts +0 -217
  443. package/dist/transaction/policy/types.js +0 -126
  444. package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
  445. package/dist/transaction/resources/functionalUpdate.js +0 -87
  446. package/dist/transaction/resources/httpResources.d.ts +0 -321
  447. package/dist/transaction/resources/httpResources.js +0 -7
  448. package/dist/transaction/resources/modelOperations.d.ts +0 -427
  449. package/dist/transaction/resources/modelOperations.js +0 -12
  450. package/dist/transaction/resources/mutationOptions.d.ts +0 -66
  451. package/dist/transaction/resources/mutationOptions.js +0 -9
  452. package/dist/transaction/resources/where.d.ts +0 -101
  453. package/dist/transaction/resources/where.js +0 -115
  454. package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
  455. package/dist/transaction/resources/writeOptionsSchema.js +0 -73
  456. package/dist/transaction/schema/field.d.ts +0 -120
  457. package/dist/transaction/schema/field.js +0 -265
  458. package/dist/transaction/schema/fieldRef.d.ts +0 -38
  459. package/dist/transaction/schema/fieldRef.js +0 -11
  460. package/dist/transaction/schema/loadStrategy.d.ts +0 -45
  461. package/dist/transaction/schema/loadStrategy.js +0 -46
  462. package/dist/transaction/schema/model.d.ts +0 -379
  463. package/dist/transaction/schema/model.js +0 -123
  464. package/dist/transaction/schema/openapi.d.ts +0 -58
  465. package/dist/transaction/schema/openapi.js +0 -501
  466. package/dist/transaction/schema/relation.d.ts +0 -204
  467. package/dist/transaction/schema/relation.js +0 -104
  468. package/dist/transaction/schema/residency.d.ts +0 -29
  469. package/dist/transaction/schema/residency.js +0 -25
  470. package/dist/transaction/schema/roles.d.ts +0 -249
  471. package/dist/transaction/schema/roles.js +0 -230
  472. package/dist/transaction/schema/schema.d.ts +0 -351
  473. package/dist/transaction/schema/schema.js +0 -325
  474. package/dist/transaction/schema/tenancy.d.ts +0 -139
  475. package/dist/transaction/schema/tenancy.js +0 -190
  476. package/dist/transaction/transactionLayer.d.ts +0 -82
  477. package/dist/transaction/transactionLayer.js +0 -24
  478. package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
  479. package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
  480. package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
  481. package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
  482. package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
  483. package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
  484. package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
  485. package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
  486. package/dist/transaction/transport/commitFrames.d.ts +0 -90
  487. package/dist/transaction/transport/commitFrames.js +0 -134
  488. package/dist/transaction/transport/connectionManager.d.ts +0 -215
  489. package/dist/transaction/transport/connectionManager.js +0 -673
  490. package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
  491. package/dist/transaction/transport/credentialLifecycle.js +0 -324
  492. package/dist/transaction/transport/heartbeat.d.ts +0 -65
  493. package/dist/transaction/transport/heartbeat.js +0 -93
  494. package/dist/transaction/transport/httpClient.d.ts +0 -131
  495. package/dist/transaction/transport/httpClient.js +0 -146
  496. package/dist/transaction/transport/httpOptions.d.ts +0 -33
  497. package/dist/transaction/transport/httpOptions.js +0 -12
  498. package/dist/transaction/transport/httpTransport.d.ts +0 -8
  499. package/dist/transaction/transport/httpTransport.js +0 -1388
  500. package/dist/transaction/transport/networkProbe.d.ts +0 -84
  501. package/dist/transaction/transport/networkProbe.js +0 -207
  502. package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
  503. package/dist/transaction/transport/wsFrameHandlers.js +0 -429
  504. package/dist/transaction/transport/wsTransport.d.ts +0 -574
  505. package/dist/transaction/transport/wsTransport.js +0 -1023
  506. package/dist/transaction/types/assertExact.d.ts +0 -17
  507. package/dist/transaction/types/assertExact.js +0 -1
  508. package/dist/transaction/types/global.d.ts +0 -107
  509. package/dist/transaction/types/global.js +0 -40
  510. package/dist/transaction/types/index.d.ts +0 -205
  511. package/dist/transaction/types/index.js +0 -56
  512. package/dist/transaction/types/modelData.d.ts +0 -10
  513. package/dist/transaction/types/modelData.js +0 -9
  514. package/dist/transaction/types/participant.d.ts +0 -20
  515. package/dist/transaction/types/participant.js +0 -10
  516. package/dist/transaction/types/streams.d.ts +0 -550
  517. package/dist/transaction/types/streams.js +0 -11
  518. package/dist/transaction/utils/asyncIterator.d.ts +0 -34
  519. package/dist/transaction/utils/asyncIterator.js +0 -135
  520. package/dist/transaction/utils/duration.d.ts +0 -50
  521. package/dist/transaction/utils/duration.js +0 -77
  522. package/dist/transaction/utils/json.d.ts +0 -57
  523. package/dist/transaction/utils/json.js +0 -276
  524. package/dist/transaction/wire/accountResponses.d.ts +0 -420
  525. package/dist/transaction/wire/accountResponses.js +0 -290
  526. package/dist/transaction/wire/auth.d.ts +0 -56
  527. package/dist/transaction/wire/auth.js +0 -63
  528. package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
  529. package/dist/transaction/wire/bootstrapReason.js +0 -8
  530. package/dist/transaction/wire/claimEvent.d.ts +0 -76
  531. package/dist/transaction/wire/claimEvent.js +0 -73
  532. package/dist/transaction/wire/claims.d.ts +0 -530
  533. package/dist/transaction/wire/claims.js +0 -327
  534. package/dist/transaction/wire/commit.d.ts +0 -603
  535. package/dist/transaction/wire/commit.js +0 -321
  536. package/dist/transaction/wire/delta.d.ts +0 -250
  537. package/dist/transaction/wire/delta.js +0 -147
  538. package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
  539. package/dist/transaction/wire/errorEnvelope.js +0 -123
  540. package/dist/transaction/wire/feedCursor.d.ts +0 -60
  541. package/dist/transaction/wire/feedCursor.js +0 -82
  542. package/dist/transaction/wire/feedEvent.d.ts +0 -204
  543. package/dist/transaction/wire/feedEvent.js +0 -65
  544. package/dist/transaction/wire/frames.d.ts +0 -194
  545. package/dist/transaction/wire/frames.js +0 -50
  546. package/dist/transaction/wire/inboundFrames.d.ts +0 -562
  547. package/dist/transaction/wire/inboundFrames.js +0 -116
  548. package/dist/transaction/wire/index.d.ts +0 -54
  549. package/dist/transaction/wire/index.js +0 -83
  550. package/dist/transaction/wire/listEnvelope.d.ts +0 -37
  551. package/dist/transaction/wire/listEnvelope.js +0 -42
  552. package/dist/transaction/wire/modelMutations.d.ts +0 -31
  553. package/dist/transaction/wire/modelMutations.js +0 -52
  554. package/dist/transaction/wire/modelResponses.d.ts +0 -85
  555. package/dist/transaction/wire/modelResponses.js +0 -43
  556. package/dist/transaction/wire/modelShape.d.ts +0 -78
  557. package/dist/transaction/wire/modelShape.js +0 -74
  558. package/dist/transaction/wire/protocol.d.ts +0 -38
  559. package/dist/transaction/wire/protocol.js +0 -38
  560. package/dist/transaction/wire/protocolVersion.d.ts +0 -73
  561. package/dist/transaction/wire/protocolVersion.js +0 -83
  562. package/dist/transactions/mutations/MutationQueue.d.ts +0 -661
  563. package/dist/transactions/mutations/MutationQueue.js +0 -2807
  564. package/dist/transactions/mutations/MutationStore.d.ts +0 -20
  565. package/dist/transactions/mutations/MutationStore.js +0 -53
  566. package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
  567. package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
  568. package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
  569. package/dist/transactions/mutations/coalesceRules.js +0 -140
  570. package/dist/transactions/mutations/commitLatency.d.ts +0 -52
  571. package/dist/transactions/mutations/commitLatency.js +0 -130
  572. package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
  573. package/dist/transactions/mutations/commitOutboxStore.js +0 -26
  574. package/dist/transactions/mutations/commitPayload.d.ts +0 -165
  575. package/dist/transactions/mutations/commitPayload.js +0 -152
  576. package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -63
  577. package/dist/transactions/mutations/deltaConfirmation.js +0 -235
  578. package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
  579. package/dist/transactions/mutations/durableWriteStore.js +0 -12
  580. package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
  581. package/dist/transactions/mutations/optimisticApply.js +0 -65
  582. package/dist/transactions/mutations/replayValidation.d.ts +0 -187
  583. package/dist/transactions/mutations/replayValidation.js +0 -164
  584. package/dist/utils/mobxSetup.d.ts +0 -53
  585. package/dist/utils/mobxSetup.js +0 -330
  586. package/dist/views/QueryView.d.ts +0 -79
  587. package/dist/views/QueryView.js +0 -218
  588. package/dist/views/ViewRegistry.d.ts +0 -20
  589. package/dist/views/ViewRegistry.js +0 -55
  590. package/dist/views/incrementalView.d.ts +0 -45
  591. package/dist/views/incrementalView.js +0 -69
  592. package/dist/webhooks/events.d.ts +0 -43
  593. package/dist/webhooks/events.js +0 -42
  594. package/dist/webhooks/index.d.ts +0 -8
  595. package/dist/webhooks/index.js +0 -8
  596. package/dist/wire/index.d.ts +0 -1
  597. package/dist/wire/index.js +0 -8
@@ -1,686 +0,0 @@
1
- /**
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:
5
- *
6
- * ```ts
7
- * // By class, with instanceof
8
- * if (err instanceof AbloRateLimitError) backoff(err.retryAfterSeconds);
9
- *
10
- * // By discriminator string, for cases where class identity is lost —
11
- * // for example after an error crosses a web worker boundary
12
- * if (err.type === 'AbloRateLimitError') { ... }
13
- * ```
14
- *
15
- * Both work on every subclass.
16
- */
17
- import { z } from 'zod';
18
- import { errorCodeSpec, classifyRecovery } from './errorCodes.js';
19
- import { wireClaimSummarySchema, descriptionFromMeta, } from './coordination/schema.js';
20
- export { ERROR_CODES, ERROR_CONTRACT_VERSION, errorCodeSpec, isRetryableCode, classifyRecovery, recoveryClassSchema, RECOVERY_CLASSES, } from './errorCodes.js';
21
- // ── AbloError hierarchy — the typed error surface ────────────────────
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
- */
28
- export class AbloError extends Error {
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. */
32
- type = 'AbloError';
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. */
39
- code;
40
- /** HTTP status code, when the error originated from an HTTP response. */
41
- httpStatus;
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. */
45
- requestId;
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. */
49
- param;
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}. */
52
- docUrl;
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
- details;
58
- constructor(message, options) {
59
- super(message);
60
- this.name = this.constructor.name;
61
- if (options?.code !== undefined)
62
- this.code = options.code;
63
- if (options?.httpStatus !== undefined)
64
- this.httpStatus = options.httpStatus;
65
- if (options?.requestId !== undefined)
66
- this.requestId = options.requestId;
67
- if (options?.param !== undefined)
68
- this.param = options.param;
69
- if (options?.details !== undefined)
70
- this.details = options.details;
71
- const docUrl = options?.docUrl ?? (options?.code ? docUrlForCode(options.code) : undefined);
72
- if (docUrl !== undefined)
73
- this.docUrl = docUrl;
74
- if (options?.cause !== undefined) {
75
- Object.defineProperty(this, 'cause', { value: options.cause, enumerable: false });
76
- }
77
- }
78
- /**
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.
83
- */
84
- toJSON() {
85
- return {
86
- type: this.type,
87
- ...(this.code !== undefined ? { code: this.code } : {}),
88
- ...(this.param !== undefined ? { param: this.param } : {}),
89
- message: this.message,
90
- ...(this.docUrl !== undefined ? { doc_url: this.docUrl } : {}),
91
- ...(this.requestId !== undefined ? { request_id: this.requestId } : {}),
92
- ...(this.details ?? {}),
93
- };
94
- }
95
- /**
96
- * Formats the error as a single line for logs and string interpolation:
97
- * `AbloValidationError [code]: message (see docs) [request_id: …]`.
98
- *
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.
103
- */
104
- toString() {
105
- const code = this.code ? ` [${this.code}]` : '';
106
- const docs = this.docUrl ? ` (see ${this.docUrl})` : '';
107
- const req = this.requestId ? ` [request_id: ${this.requestId}]` : '';
108
- return `${this.name}${code}: ${this.message}${docs}${req}`;
109
- }
110
- }
111
- /**
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.
115
- */
116
- export function docUrlForCode(code) {
117
- return `https://docs.abloatai.com/errors#${code}`;
118
- }
119
- /** 401 — invalid/missing/expired credentials. */
120
- export class AbloAuthenticationError extends AbloError {
121
- type = 'AbloAuthenticationError';
122
- }
123
- /** 403 — credentials were valid but the action is forbidden (scope
124
- * denial, revoked capability, role not authorized). */
125
- export class AbloPermissionError extends AbloError {
126
- type = 'AbloPermissionError';
127
- }
128
- /** 429 — rate limit exceeded. Consumers should back off before retry. */
129
- export class AbloRateLimitError extends AbloError {
130
- type = 'AbloRateLimitError';
131
- retryAfterSeconds;
132
- constructor(message, options) {
133
- super(message, options);
134
- if (options?.retryAfterSeconds !== undefined) {
135
- this.retryAfterSeconds = options.retryAfterSeconds;
136
- }
137
- }
138
- }
139
- /** 409 — same `Idempotency-Key` reused with a different request body. */
140
- export class AbloIdempotencyError extends AbloError {
141
- type = 'AbloIdempotencyError';
142
- }
143
- /** Network / transport failure — TCP reset, DNS, timeout, abort. */
144
- export class AbloConnectionError extends AbloError {
145
- type = 'AbloConnectionError';
146
- }
147
- /** 400 / 422 — request payload was invalid. */
148
- export class AbloValidationError extends AbloError {
149
- type = 'AbloValidationError';
150
- }
151
- /**
152
- * An update or delete addressed a row that does not exist, or lies outside the
153
- * caller's organization (HTTP 404). Raw commit responses may report those
154
- * targets as `missingIds`; typed model methods raise this error instead of
155
- * returning a successful result for a write that quietly matched zero rows.
156
- * The absent ids are carried on {@link missingIds}.
157
- */
158
- export class AbloNotFoundError extends AbloError {
159
- type = 'AbloNotFoundError';
160
- /** The id(s) that matched no row. */
161
- missingIds;
162
- constructor(message, missingIds, options) {
163
- super(message, {
164
- code: 'mutate_update_entity_not_found',
165
- httpStatus: 404,
166
- details: { missingIds },
167
- ...(options?.requestId !== undefined ? { requestId: options.requestId } : {}),
168
- });
169
- this.missingIds = missingIds;
170
- }
171
- }
172
- /** 5xx — server-side error. Usually retryable with backoff. */
173
- export class AbloServerError extends AbloError {
174
- type = 'AbloServerError';
175
- }
176
- /**
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.
180
- *
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
- */
185
- export class AbloStaleContextError extends AbloError {
186
- type = 'AbloStaleContextError';
187
- /** Sync id at the caller's `readAt` when the write was attempted. */
188
- readAt;
189
- /** Entities that received deltas between `readAt` and the write. */
190
- conflicts;
191
- constructor(message, options) {
192
- super(message, options);
193
- if (options?.readAt !== undefined)
194
- this.readAt = options.readAt;
195
- if (options?.conflicts !== undefined)
196
- this.conflicts = options.conflicts;
197
- }
198
- }
199
- /**
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
- *
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`.
209
- */
210
- export class AbloContentionError extends AbloError {
211
- type = 'AbloContentionError';
212
- /** The contended model + row that could not be written. */
213
- model;
214
- id;
215
- /** How many reconcile rounds were attempted before giving up. */
216
- attempts;
217
- constructor(model, id, attempts, options) {
218
- super(`Could not update ${model}/${id} after ${attempts} attempts — the row stayed ` +
219
- `continuously contended, so nothing was written. Retry later, raise \`retries\`, ` +
220
- `or use the WebSocket transport for a fair FIFO queue.`, {
221
- code: 'contention_exhausted',
222
- ...(options?.cause !== undefined ? { cause: options.cause } : {}),
223
- });
224
- this.model = model;
225
- this.id = id;
226
- this.attempts = attempts;
227
- }
228
- }
229
- function claimDescription(claim) {
230
- if (!claim)
231
- return undefined;
232
- if ('description' in claim && typeof claim.description === 'string') {
233
- return claim.description;
234
- }
235
- const meta = 'target' in claim ? claim.target?.meta ?? claim.meta : claim.meta;
236
- // Fall back through the meta carrier so a frame that stashed its description
237
- // there still renders its holder's work.
238
- return descriptionFromMeta(meta);
239
- }
240
- function claimExpiresAt(claim) {
241
- return claim?.expiresAt;
242
- }
243
- function claimActor(claim, fallback) {
244
- if (claim && 'actor' in claim && typeof claim.actor === 'string') {
245
- return claim.actor;
246
- }
247
- return fallback;
248
- }
249
- function secondsUntil(ms, now = Date.now()) {
250
- if (ms === undefined || !Number.isFinite(ms))
251
- return undefined;
252
- return Math.max(0, Math.ceil((ms - now) / 1000));
253
- }
254
- export function formatClaimedErrorMessage(args) {
255
- const holder = claimActor(args.claim, args.heldBy);
256
- const description = claimDescription(args.claim);
257
- const expiresIn = secondsUntil(claimExpiresAt(args.claim));
258
- if (!holder && !description) {
259
- return args.fallback ?? `Model row is claimed: ${args.targetLabel}.`;
260
- }
261
- const actor = holder ?? 'another participant';
262
- const descriptionPart = description ? `: ${description}` : '';
263
- const expiresPart = expiresIn !== undefined ? ` - expires in ${expiresIn}s` : '';
264
- const policyPart = args.policyReason
265
- ? ` Policy reason: ${args.policyReason}.`
266
- : '';
267
- return `Claimed by ${actor}${descriptionPart}${expiresPart} on ${args.targetLabel}.${policyPart}`;
268
- }
269
- /**
270
- * The target entity is currently claimed by another participant and the caller
271
- * asked the SDK not to read/write through that claim.
272
- *
273
- * Pass `ifClaimed: 'return'` to inspect active claims yourself instead of
274
- * throwing; to wait for the claim to clear, take `ablo.<model>.claim({ id })`
275
- * (it queues fairly) rather than blocking the read.
276
- */
277
- export class AbloClaimedError extends AbloError {
278
- type = 'AbloClaimedError';
279
- claims;
280
- constructor(message, options) {
281
- super(message, options);
282
- if (options?.claims !== undefined)
283
- this.claims = options.claims;
284
- }
285
- }
286
- /**
287
- * Builds a human-readable label for a claim target by joining its `model`, `id`,
288
- * and `field` with `/`, omitting any absent parts and falling back to `'target'`
289
- * when none are present.
290
- */
291
- export function claimTargetLabel(target) {
292
- return [target.model, target.id, target.field].filter(Boolean).join('/') || 'target';
293
- }
294
- /**
295
- * Builds the {@link AbloClaimedError} for a write that was rejected because the
296
- * row is claimed. The first entry in `claims` is treated as the current holder,
297
- * and its metadata shapes the error message.
298
- */
299
- export function claimedError(target, claims, code) {
300
- const label = claimTargetLabel(target);
301
- const holder = claims[0];
302
- return new AbloClaimedError(formatClaimedErrorMessage({
303
- targetLabel: label,
304
- heldBy: holder?.actor,
305
- claim: holder,
306
- fallback: `Model row is claimed: ${label} held by another participant.`,
307
- }), { code, claims });
308
- }
309
- /**
310
- * A scoped credential was denied, either because the key is unknown, revoked, or
311
- * expired (`capability_invalid`), or because the connection's scope does not
312
- * cover the attempted action (`capability_scope_denied`). For restricted (`rk_`)
313
- * API keys this is a server-side check against the key's granted sync groups and
314
- * operations.
315
- *
316
- * It extends {@link AbloPermissionError}, so it is caught both by code that
317
- * specifically checks for `CapabilityError` and by code that only distinguishes
318
- * the broader permission category. When present, {@link requiredCapability}
319
- * describes the scope a key would need to carry for the request to succeed on
320
- * retry.
321
- */
322
- export class CapabilityError extends AbloPermissionError {
323
- requiredCapability;
324
- constructor(code, message, requiredCapability) {
325
- super(`${code}: ${message}`, { code });
326
- this.name = 'CapabilityError';
327
- if (requiredCapability !== undefined) {
328
- this.requiredCapability = requiredCapability;
329
- }
330
- }
331
- }
332
- // ── Legacy session error (now part of the typed hierarchy) ───────────
333
- /**
334
- * Thrown when the login session itself is invalid or expired, signaling that the
335
- * user should be sent to sign in again rather than offered a generic retry.
336
- *
337
- * It extends {@link AbloAuthenticationError}, so it is caught both by code using
338
- * the {@link AbloSessionError.isSessionError} check and by code that catches the
339
- * authentication category in general.
340
- */
341
- export class AbloSessionError extends AbloAuthenticationError {
342
- isSessionError = true;
343
- statusCode;
344
- constructor(message, statusCode = 401) {
345
- super(message, { httpStatus: statusCode, code: 'session_expired' });
346
- this.name = 'AbloSessionError';
347
- this.statusCode = statusCode;
348
- if (Error.captureStackTrace) {
349
- Error.captureStackTrace(this, AbloSessionError);
350
- }
351
- }
352
- /**
353
- * Returns true when a value is a {@link AbloSessionError}, or any error-like
354
- * object that reports itself as a session error through an `isSessionError`
355
- * flag.
356
- */
357
- static isSessionError(error) {
358
- if (error instanceof AbloSessionError) {
359
- return true;
360
- }
361
- if (error && typeof error === 'object' && 'isSessionError' in error) {
362
- return error.isSessionError;
363
- }
364
- return false;
365
- }
366
- /**
367
- * Determines whether an HTTP response means the login session has expired and
368
- * the user should sign in again. When the body carries a structured Ablo error
369
- * code, the decision is made from that code's recovery class; otherwise a bare
370
- * 401 is treated as an expiry and a 403 is not.
371
- */
372
- static isSessionErrorResponse(status, body) {
373
- // Sign the user out only for a genuine expiry of the long-lived login
374
- // (`recovery: 'session_expiry'`). The decision runs through the recovery
375
- // classification rather than a hardcoded list, so the access-versus-session
376
- // split lives in one place.
377
- //
378
- // It deliberately does not fire for `access_credential_expiry`
379
- // (`apikey_expired`): an expired short-lived key is re-mintable from the
380
- // still-valid login and must not sign the user out — the connection layer
381
- // re-mints it instead. It also does not fire for `auth_blocked` or
382
- // `permission` failures, where re-authenticating would present the same
383
- // rejected credential and loop.
384
- const code = extractWireCode(body);
385
- if (code) {
386
- return classifyRecovery(code) === 'session_expiry';
387
- }
388
- // With no structured code (a bare body or a non-Ablo proxy response), treat
389
- // a 401 as an expiry that drives re-authentication, and a 403 as a
390
- // permission failure rather than a session error.
391
- return status === 401;
392
- }
393
- }
394
- /**
395
- * @deprecated Renamed to {@link AbloSessionError} — the one engine-named class
396
- * in the Ablo* hierarchy, brought in line with the family. Same class, same
397
- * `instanceof` identity. Removed in 0.36.0.
398
- */
399
- export const SyncSessionError = AbloSessionError;
400
- /**
401
- * The WebSocket-close counterpart to {@link AbloSessionError.isSessionErrorResponse}:
402
- * returns true for close reasons that mean the short-lived access credential
403
- * (`ek_` or `rk_`) has expired. The server closes such sockets with code 4001
404
- * and reason `'credential_expired'`. Because the credential is re-mintable from
405
- * the still-valid login, the connection layer re-mints it and reconnects rather
406
- * than signing the user out or clearing local data. Every other session close
407
- * reason, such as a revoked key or a genuinely lost login, stays terminal.
408
- */
409
- export function isAccessCredentialExpiryCloseReason(reason) {
410
- return reason === 'credential_expired' || classifyRecovery(reason) === 'access_credential_expiry';
411
- }
412
- // ── HTTP → class mapping ──────────────────────────────────────────────
413
- const OptionalWireStringSchema = z.preprocess((value) => (typeof value === 'string' ? value : undefined), z.string().optional());
414
- /**
415
- * The one definition of the {@link RequiredCapability} wire shape. Every
416
- * boundary that carries a denial's capability detail — the error body parsed
417
- * here, and the rejected commit receipt in `wire/commit.ts` — composes this
418
- * schema rather than restating the fields, so a new member cannot reach one
419
- * boundary and miss the other.
420
- *
421
- * Unknown keys pass through: the server may describe a capability in more
422
- * detail than this build knows, and dropping those keys would leave a caller
423
- * unable to act on a denial it could otherwise satisfy.
424
- */
425
- export const requiredCapabilityWireSchema = z
426
- .object({
427
- scope: z.string(),
428
- constraints: z
429
- .record(z.string(), z.union([z.array(z.string()), z.string()]))
430
- .optional(),
431
- issuer: OptionalWireStringSchema,
432
- ttlSeconds: z
433
- .preprocess((value) => (typeof value === 'number' ? value : undefined), z.number().optional()),
434
- nonce: OptionalWireStringSchema,
435
- })
436
- .loose();
437
- const NestedErrorShapeSchema = z
438
- .object({
439
- code: OptionalWireStringSchema,
440
- message: OptionalWireStringSchema,
441
- field: OptionalWireStringSchema,
442
- requiredCapability: requiredCapabilityWireSchema.optional().catch(undefined),
443
- heldBy: OptionalWireStringSchema,
444
- policyReason: OptionalWireStringSchema,
445
- heldByClaim: wireClaimSummarySchema.optional().catch(undefined),
446
- claims: z.array(wireClaimSummarySchema).optional().catch(undefined),
447
- })
448
- .loose();
449
- const ErrorFieldSchema = z
450
- .preprocess((value) => typeof value === 'string' || (typeof value === 'object' && value !== null)
451
- ? value
452
- : undefined, z.union([z.string(), NestedErrorShapeSchema]).optional())
453
- .catch(undefined);
454
- const ErrorBodyShapeSchema = z
455
- .object({
456
- /** The `error` field may be a flat code string, as some endpoints return,
457
- * or a nested error object, as commit endpoints return on rejection. */
458
- error: ErrorFieldSchema,
459
- code: OptionalWireStringSchema,
460
- reason: OptionalWireStringSchema,
461
- message: OptionalWireStringSchema,
462
- requiredCapability: requiredCapabilityWireSchema.optional().catch(undefined),
463
- heldBy: OptionalWireStringSchema,
464
- policyReason: OptionalWireStringSchema,
465
- heldByClaim: wireClaimSummarySchema.optional().catch(undefined),
466
- claims: z.array(wireClaimSummarySchema).optional().catch(undefined),
467
- })
468
- .loose();
469
- function parseErrorBodyShape(body) {
470
- if (typeof body !== 'object' || body === null)
471
- return {};
472
- const parsed = ErrorBodyShapeSchema.safeParse(body);
473
- return parsed.success ? parsed.data : {};
474
- }
475
- /**
476
- * Coerces any thrown value into an {@link AbloError}, so a consumer never catches
477
- * an untyped error from the SDK. An error that is already an {@link AbloError}
478
- * passes through unchanged, preserving its subclass, `code`, and `httpStatus`; a
479
- * plain `Error` keeps its message and is retained as the `cause` (carrying any
480
- * `code` attached to it); anything else is stringified.
481
- *
482
- * The SDK applies this at its public async boundaries so that `instanceof
483
- * AbloError` and `error.type` hold for whatever a consumer catches, no matter
484
- * which internal layer — transport, local storage, bootstrap, or a third-party
485
- * throw — produced the original error.
486
- */
487
- export function toAbloError(err) {
488
- if (err instanceof AbloError)
489
- return err;
490
- if (err instanceof Error) {
491
- const rawCode = err.code;
492
- const code = typeof rawCode === 'string' ? rawCode : undefined;
493
- return new AbloError(err.message, { code, cause: err });
494
- }
495
- return new AbloError(String(err), { cause: err });
496
- }
497
- /**
498
- * Builds the appropriate typed {@link AbloError} from a wire error. This is the
499
- * single code-to-class mapping shared by every transport that can reject a
500
- * request — HTTP responses through {@link translateHttpError}, WebSocket result
501
- * frames, and agent-job receipts.
502
- *
503
- * It decides by code first, then by status. Because a known {@link ErrorCode}
504
- * carries its canonical HTTP status in the registry, a transport that has no
505
- * status of its own (such as the WebSocket commit path) still produces the right
506
- * subclass, with its `code`, status, and retryability intact.
507
- */
508
- export function errorFromWire(message, opts = {}) {
509
- const { code, requestId, requiredCapability, claims, details } = opts;
510
- // Effective status: an explicit HTTP status wins; otherwise fall back to
511
- // the code's canonical status from the registry (undefined for unknown /
512
- // forward-compat codes, which then map to the base AbloError).
513
- const httpStatus = opts.httpStatus ?? (code ? errorCodeSpec(code)?.httpStatus : undefined);
514
- // Wire boundary: an incoming code is an arbitrary string (a newer server
515
- // may send a code this SDK predates). Cast to ErrorCode here — the one
516
- // sanctioned crossing — so internal producers stay statically checked.
517
- const publicCode = (code === 'claim_conflict' ? 'claim_conflict' : code);
518
- const baseOpts = {
519
- code: publicCode,
520
- httpStatus,
521
- requestId,
522
- ...(details && Object.keys(details).length > 0 ? { details } : {}),
523
- };
524
- // ── Code-first specials (transport-independent) ──────────────────────
525
- // A scoped credential was denied — route through CapabilityError so callers
526
- // can read `.requiredCapability` to attenuate-and-retry.
527
- if (code === 'capability_scope_denied' || code === 'capability_invalid') {
528
- return new CapabilityError(code, message, requiredCapability);
529
- }
530
- // Claim enforcement (rides 409): the target entity is held by another
531
- // participant, or a lease this participant held is gone (`claim_lost` —
532
- // the answer a heartbeat gets after its lease lapsed). Discriminate on
533
- // code BEFORE the generic 409→idempotency mapping so claim outcomes
534
- // surface as AbloClaimedError on every transport.
535
- if (code === 'claim_conflict' ||
536
- code === 'entity_claimed' ||
537
- code === 'claim_lost') {
538
- return new AbloClaimedError(message, { ...baseOpts, claims });
539
- }
540
- // A write whose `readAt` watermark went stale — callers re-read and retry.
541
- if (code === 'stale_context') {
542
- return new AbloStaleContextError(message, baseOpts);
543
- }
544
- // The database connected to the caller's environment could not be reached.
545
- // It rides a 503, but the generic 5xx rule below would rebuild it as an
546
- // `AbloServerError` — telling the reader Ablo is broken and to wait, when the
547
- // remedy is on their side and the server already classified it as a
548
- // connection failure. Keep the class the producer chose.
549
- if (code === 'connected_database_unreachable') {
550
- return new AbloConnectionError(message, baseOpts);
551
- }
552
- // ── Status-driven dispatch (HTTP parity) ─────────────────────────────
553
- if (httpStatus === 401)
554
- return new AbloAuthenticationError(message, baseOpts);
555
- if (httpStatus === 403)
556
- return new AbloPermissionError(message, baseOpts);
557
- if (httpStatus === 409)
558
- return new AbloIdempotencyError(message, baseOpts);
559
- if (httpStatus === 422 || httpStatus === 400)
560
- return new AbloValidationError(message, baseOpts);
561
- if (httpStatus === 429)
562
- return new AbloRateLimitError(message, baseOpts);
563
- if (httpStatus !== undefined && httpStatus >= 500)
564
- return new AbloServerError(message, baseOpts);
565
- return new AbloError(message, baseOpts);
566
- }
567
- /**
568
- * Translates an HTTP response into the appropriate typed {@link AbloError}. This
569
- * is the single mapping every request path routes a non-2xx response through, so
570
- * the error a consumer sees is always the right subclass. After extracting the
571
- * code and message from the response body, it delegates the class selection to
572
- * {@link errorFromWire}, the same logic the frame transports use.
573
- */
574
- /**
575
- * The keys the error envelope spends on itself. {@link AbloError.toJSON} spreads
576
- * `details` FLAT alongside them rather than nesting it, so everything here is
577
- * the envelope and everything else was `details` — which is how
578
- * {@link translateHttpError} puts it back.
579
- */
580
- const ENVELOPE_KEYS = new Set([
581
- 'type',
582
- 'code',
583
- 'param',
584
- 'message',
585
- 'doc_url',
586
- 'request_id',
587
- // Read into typed properties below, so they are not detail as well.
588
- 'error',
589
- 'reason',
590
- 'requiredCapability',
591
- 'claims',
592
- 'heldByClaim',
593
- ]);
594
- /** The non-envelope remainder of an error body — what `details` was before it
595
- * was spread. Empty when the producer attached nothing. */
596
- function detailsFromBody(body) {
597
- if (typeof body !== 'object' || body === null)
598
- return undefined;
599
- const rest = {};
600
- for (const [key, value] of Object.entries(body)) {
601
- if (!ENVELOPE_KEYS.has(key))
602
- rest[key] = value;
603
- }
604
- return Object.keys(rest).length > 0 ? rest : undefined;
605
- }
606
- export function translateHttpError(status, body, requestId) {
607
- const parsed = parseErrorBodyShape(body);
608
- const nested = parsed.error != null && typeof parsed.error === 'object'
609
- ? parsed.error
610
- : undefined;
611
- const flatError = typeof parsed.error === 'string' ? parsed.error : undefined;
612
- const code = parsed.code ?? nested?.code ?? flatError;
613
- const message = nested?.message ??
614
- parsed.reason ??
615
- parsed.message ??
616
- flatError ??
617
- (typeof body === 'string' ? body : `HTTP ${status}`);
618
- const requiredCapability = nested?.requiredCapability ?? parsed.requiredCapability;
619
- const claims = parsed.claims ??
620
- nested?.claims ??
621
- (parsed.heldByClaim
622
- ? [parsed.heldByClaim]
623
- : nested?.heldByClaim
624
- ? [nested.heldByClaim]
625
- : undefined);
626
- // The envelope carries `request_id`, so a caller that has only the body still
627
- // gets the correlation id — without this it was dropped unless the caller
628
- // happened to read the header and pass it in separately.
629
- const bodyRequestId = typeof body === 'object' && body !== null && 'request_id' in body
630
- ? body.request_id
631
- : undefined;
632
- return errorFromWire(message, {
633
- code,
634
- httpStatus: status,
635
- requestId: requestId ?? (typeof bodyRequestId === 'string' ? bodyRequestId : undefined),
636
- requiredCapability,
637
- claims,
638
- details: detailsFromBody(body),
639
- });
640
- }
641
- /**
642
- * Reports whether an HTTP error body carries a code that {@link translateHttpError}
643
- * can read — a top-level `code`, a nested `error.code`, or a string `error`. A
644
- * caller that has a meaningful fallback code uses this to choose between routing
645
- * a structured body through {@link translateHttpError} and throwing its own typed
646
- * error with the fallback when the body is bare, rather than producing an error
647
- * with no code.
648
- */
649
- export function hasWireCode(body) {
650
- const parsed = parseErrorBodyShape(body);
651
- if (typeof parsed.code === 'string')
652
- return true;
653
- if (typeof parsed.error === 'string')
654
- return true;
655
- return (typeof parsed.error === 'object' &&
656
- parsed.error !== null &&
657
- typeof parsed.error.code === 'string');
658
- }
659
- /**
660
- * Extracts the canonical error `code` from a raw HTTP error body string — the
661
- * top-level `code` or a nested `error.code` — returning `undefined` for a
662
- * non-JSON or code-less body. Session-error detection uses it to tell a genuine
663
- * session expiry apart from other authentication failures.
664
- */
665
- export function extractWireCode(body) {
666
- if (!body)
667
- return undefined;
668
- let parsed;
669
- try {
670
- parsed = JSON.parse(body);
671
- }
672
- catch {
673
- return undefined;
674
- }
675
- if (typeof parsed !== 'object' || parsed === null)
676
- return undefined;
677
- const b = parseErrorBodyShape(parsed);
678
- if (typeof b.code === 'string')
679
- return b.code;
680
- if (typeof b.error === 'string')
681
- return b.error;
682
- if (typeof b.error === 'object' && b.error !== null && typeof b.error.code === 'string') {
683
- return b.error.code;
684
- }
685
- return undefined;
686
- }